1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/SignUp-D1kPFPmx.js","assets/arrow-left-V7CrFsJW.js","assets/circle-check-VayDmf26.js","assets/ResetPassword-BaQ3uBln.js","assets/card-BhrJjpXp.js","assets/send-q88PUeoO.js","assets/circle-check-big-Dn-XNYzg.js","assets/UpdatePassword-qLngqR16.js","assets/shield-check-ChhVfcwD.js","assets/Dashboard-CSSCHJkB.js","assets/tabs-B49pfDz5.js","assets/index-DgVheZWr.js","assets/useTranslation-DrxfdMzy.js","assets/badge-mW_RQJjC.js","assets/ReportViewer-BP08F9dX.js","assets/key-round-DRrR3UF-.js","assets/scale-BdU-DDnv.js","assets/receipt-DGWAZVAr.js","assets/list-BWRMKMeX.js","assets/euro-BoolQwdd.js","assets/trash-2-DUXS_Jyg.js","assets/textarea-BKIk2M2c.js","assets/ReferralDashboardGamified-CjcJhATK.js","assets/copy-DrC_A2m3.js","assets/message-circle-BpsXla9d.js","assets/Profile-BZ-rzl92.js","assets/table-DiUzK46V.js","assets/refresh-cw-B9MHLCH7.js","assets/save-CcVQfrkw.js","assets/Contact-B1jDbcmY.js","assets/FreeAnalyse-CykK35nj.js","assets/switch-B0TH1YrN.js","assets/alert-dialog-l8YZAcDv.js","assets/accordion-Bcv8TX0b.js","assets/AdaptiveHeader-Cu6WoJoM.js","assets/ProHeader-CgTBsN4-.js","assets/useQuery-DwWUaKo1.js","assets/rotate-ccw-D161T2jj.js","assets/maximize-2-D7WzHWnW.js","assets/index-BDYaNOtB.js","assets/key-DP5dv30E.js","assets/AuthGateDialog-B6rOse3S.js","assets/gavel-_CQYMLvf.js","assets/trending-down-CZiiCpdB.js","assets/piggy-bank-AChmD-h2.js","assets/generateCategoricalChart-Dsx2Wh4-.js","assets/AreaChart-BebUYvEY.js","assets/Area-KGYrcJx6.js","assets/YAxis-DZRMh2BF.js","assets/types-immeuble-ChMG9ZZI.js","assets/FAQAccordion-CWwMy0qc.js","assets/chart-no-axes-column-BtfWJKDL.js","assets/Settings-Ce2Tzg7Y.js","assets/Referral-FwQVfWFY.js","assets/Simulateur-DyyD9Smj.js","assets/PremiumGateDialog-CxcXgYnK.js","assets/SimulateurFraisActe-CV9MswI9.js","assets/html2canvas.esm-CA5aw5AZ.js","assets/DataSources-BlNa3Lhj.js","assets/twitter-5wDLZKeE.js","assets/jspdf.es.min-DJr0GaCK.js","assets/SoftAuthGate-DnH1SBcD.js","assets/user-plus-DFaD0S_4.js","assets/PieChart-BMIUtEmA.js","assets/SimulateurPret-DgFaGa0M.js","assets/BarChart-CeFKUWnQ.js","assets/CartesianGrid-ReR5yAJQ.js","assets/SimulateurCapaciteEmprunt-DK4YXr7l.js","assets/SimulateurPEB-CWTXnB03.js","assets/SimulateurRendementLocatif-Ffy-rc8x.js","assets/SimulateurTRI-w5ep9AFN.js","assets/Line-CdYe5U-M.js","assets/SimulateurPrecompteImmobilier-4tQmaQ87.js","assets/MaVraieValeur-BRNpqVDC.js","assets/TileLayer-C_oxFjJd.js","assets/leaflet-src-I6r_vzy2.js","assets/GeoJSON-DqK6TbOw.js","assets/droplets-jT8rg36l.js","assets/hammer-DwP8w9Vu.js","assets/Tarifs-qiZCiaJm.js","assets/Blog-EDZFEMf_.js","assets/BlogArticle-C84o4q2m.js","assets/link-2-DphDa8p3.js","assets/FAQ-CooSSOy3.js","assets/chart-line-D7bvd9mm.js","assets/book-open-DO4fYdiA.js","assets/minus-CIIlmQ7a.js","assets/plus-DVCuMdlE.js","assets/Terms-B_bu1LYs.js","assets/bot-BbDhKyox.js","assets/Privacy-ByzPLkOc.js","assets/user-x-neUVSEoA.js","assets/Legal-BTWegJc2.js","assets/MapPage-BvxerAaB.js","assets/belgium-communes-MN9JERNN.js","assets/leaflet-Dgihpmma.css","assets/CommunePage-BTtG8WMk.js","assets/arrow-up-right-B8Ce5D0y.js","assets/ProvincePage-CG367Le8.js","assets/CommunesIndex-bfAPhqRE.js","assets/layers-CsJdPwTU.js","assets/Observatoire-DnhAVV1O.js","assets/SelfCanonical-Cw93fXsy.js","assets/ObservatoireTendancesRegionales-DrLOp0Xx.js","assets/ObservatoireAtlasN1-Bq0EQzKg.js","assets/ObservatoireAtlasIndex-D9Orn08l.js","assets/EspacePresse-RfY8ZPR-.js","assets/PresseAccueil-dLT4RBvN.js","assets/presseUI-quAqLiBq.js","assets/PresseTerritoire-RAyvKd8D.js","assets/PresseIndicateur-Zu8zKLWD.js","assets/PresseCatalogue-BaTzfL61.js","assets/ExplorationPage-cjg0g6fp.js","assets/filter-CslEiwCL.js","assets/chevron-left-DE05ZfE7.js","assets/AdminFeatureUpdates-a7_ybnPi.js","assets/ExempleRapportHabitation-Dk_0-Rip.js","assets/ExempleRapportInvestissement-DoVF5VJg.js","assets/clipboard-list-tj7Ocvr5.js","assets/VoorbeeldRapportWoning-aqJ5LNRx.js","assets/VoorbeeldRapportInvestering-CLxgvlXO.js","assets/ProDashboard-C5RVK4fr.js","assets/phone-call-B7o1Cu-q.js","assets/ProLanding-Br5nRb0T.js","assets/ProLandingV2-DaaK27E2.js","assets/ProSignUp-DuMGiafJ.js","assets/ProLeads-CVAEa2To.js","assets/useUserLevel-Cs_1b62O.js","assets/archive-BAP5In6I.js","assets/ProBiens-Dwcg3ARZ.js","assets/MandateSignedModal-D_WDuV3U.js","assets/ProAnnonce-smLolmnY.js","assets/SocialCarousel-CME2SvIg.js","assets/ProCommunes-D4OmKR9a.js","assets/ProSimulateurs-D4G
1-_pz0.js","assets/ProProfil-LpwJ5zjS.js","assets/ProAgence-7ESVkHwJ.js","assets/RuneUsageWidget-BBKmYjfz.js","assets/ban-BQUzXbLn.js","assets/ProAgenceMentions-B0KuLuEQ.js","assets/ProAdministration-DiN5_Hig.js","assets/ProGroupe-Ddkb5He4.js","assets/ProApi-BorbKYUX.js","assets/ProParametresRapport-BD3TwAz7.js","assets/ProRune-BPM_DITC.js","assets/brain-Bht9XJ9D.js","assets/ProFacturation-Bhtz31wu.js","assets/ProTarifs-BNqc28Qc.js","assets/ProSettings-Ghu_98f5.js","assets/ProAnalytics-ab2LaVwy.js","assets/LineChart-BifWl3ID.js","assets/Tooltip-Dq16MeqI.js","assets/ProOnboarding-S2QgLmoP.js","assets/ProWidgetDemo-CTw8LH5O.js","assets/ProInvitation-DsNs7rzk.js","assets/ProGroupeInvitation-Jzc7ZZ9j.js","assets/ProLegalWrapper-Cli_MgmY.js","assets/ProTerms-wQxq0hYy.js","assets/ProDPA-CFQofbvp.js","assets/BienPublic-Bcb00Z7Y.js","assets/DossierBankPdf-DeIY8Lx5.js","assets/escapeHtml-6fqo2KgN.js","assets/WidgetSimulateur-Clj_V-4B.js","assets/DossierPage-CtkAGbDN.js","assets/FicheProspectPage-qygHLHPr.js","assets/Logo-Bu-LLk5K.js","assets/DemandeEffacementPage-unAOHj16.js","assets/Expired-BxIJtjvy.js","assets/NotFound-Dja_JqzF.js","assets/AnalysePageV2-CkmIt34g.js","assets/AnalyseReport-BSUwFAKQ.js","assets/VerificationsGroup-BQ7t9Xzx.js","assets/InvestissementReport-CFE0lMbF.js","assets/DureeTabs-D26nfXz1.js","assets/ImmeubleReport-CqiwiJRd.js","assets/PrintReport-Becjs54T.js"])))=>i.map(i=>d[i]); 2var gE=Object.defineProperty;var fv=e=>{throw TypeError(e)};var hE=(e,t,n)=>t in e?gE(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var fn=(e,t,n)=>hE(e,typeof t!="symbol"?t+"":t,n),Hu=(e,t,n)=>t.has(e)||fv("Cannot "+n);var D=(e,t,n)=>(Hu(e,t,"read from private field"),n?n.call(e):t.get(e)),ze=(e,t,n)=>t.has(e)?fv("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n),xe=(e,t,n,r)=>(Hu(e,t,"write to private field"),r?r.call(e,n):t.set(e,n),n),jt=(e,t,n)=>(Hu(e,t,"access private method"),n);var $l=(e,t,n,r)=>({set _(a){xe(e,t,a,n)},get _(){return D(e,t,r)}});function fE(e,t){for(var n=0;n<t.length;n++){const r=t[n];if(typeof r!="string"&&!Array.isArray(r)){for(const a in r)if(a!=="default"&&!(a in e)){const i=Object.getOwnPropertyDescriptor(r,a);i&&Object.defineProperty(e,a,i.get?i:{enumerable:!0,get:()=>r[a]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))r(a);new MutationObserver(a=>{for(const i of a)if(i.type==="childList")for(const s of i.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&r(s)}).observe(document,{childList:!0,subtree:!0});function n(a){const i={};return a.integrity&&(i.integrity=a.integrity),a.referrerPolicy&&(i.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?i.credentials="include":a.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function r(a){if(a.ep)return;a.ep=!0;const i=n(a);fetch(a.href,i)}})();var un=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Cl(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function vE(e){if(e.__esModule)return e;var t=e.default;if(typeof t=="function"){var n=function r(){return this instanceof r?Reflect.construct(t,arguments,this.constructor):t.apply(this,arguments)};n.prototype=t.prototype}else n={};return Object.defineProperty(n,"__esModule",{value:!0}),Object.keys(e).forEach(function(r){var a=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(n,r,a.get?a:{enumerable:!0,get:function(){return e[r]}})}),n}var F0={exports:{}},Qc={},O0={exports:{}},Pe={};/** 3 * @license React 4 * react.production.min.js 5 * 6 * Copyright (c) Facebook, Inc. and its affiliates. 7 * 8 * This source code is licensed under the MIT license found in the 9 * LICENSE file in the root directory of this source tree. 10 */var Sl=Symbol.for("react.element"),bE=Symbol.for("react.portal"),yE=Symbol.for("react.fragment"),wE=Symbol.for("react.strict_mode"),kE=Symbol.for("react.profiler"),xE=Symbol.for("react.provider"),jE=Symbol.for("react.context"),AE=Symbol.for("react.forward_ref"),EE=Symbol.for("react.suspense"),PE=Symbol.for("react.memo"),CE=Symbol.for("react.lazy"),vv=Symbol.iterator;function SE(e){return e===null||typeof e!="object"?null:(e=vv&&e[vv]||e["@@iterator"],typeof e=="function"?e:null)}var V0={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},W0=Object.assign,U0={};function Ls(e,t,n){this.props=e,this.context=t,this.refs=U0,this.updater=n||V0}Ls.prototype.isReactComponent={};Ls.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};Ls.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function $0(){}$0.prototype=Ls.prototype;
vendor: 11,060 bytes, lines 10-34
10function nh(e,t,n){this.props=e,this.context=t,this.refs=U0,this.updater=n||V0}var rh=nh.prototype=new $0;rh.constructor=nh;W0(rh,Ls.prototype);rh.isPureReactComponent=!0;var bv=Array.isArray,G0=Object.prototype.hasOwnProperty,ah={current:null},H0={key:!0,ref:!0,__self:!0,__source:!0};function K0(e,t,n){var r,a={},i=null,s=null;if(t!=null)for(r in t.ref!==void 0&&(s=t.ref),t.key!==void 0&&(i=""+t.key),t)G0.call(t,r)&&!H0.hasOwnProperty(r)&&(a[r]=t[r]);var l=arguments.length-2;if(l===1)a.children=n;else if(1<l){for(var d=Array(l),c=0;c<l;c++)d[c]=arguments[c+2];a.children=d}if(e&&e.defaultProps)for(r in l=e.defaultProps,l)a[r]===void 0&&(a[r]=l[r]);return{$$typeof:Sl,type:e,key:i,ref:s,props:a,_owner:ah.current}}function _E(e,t){return{$$typeof:Sl,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}function ih(e){return typeof e=="object"&&e!==null&&e.$$typeof===Sl}function TE(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,function(n){return t[n]})}var yv=/\/+/g;function Ku(e,t){return typeof e=="object"&&e!==null&&e.key!=null?TE(""+e.key):t.toString(36)}function Sd(e,t,n,r,a){var i=typeof e;(i==="undefined"||i==="boolean")&&(e=null);var s=!1;if(e===null)s=!0;else switch(i){case"string":case"number":s=!0;break;case"object":switch(e.$$typeof){case Sl:case bE:s=!0}}if(s)return s=e,a=a(s),e=r===""?"."+Ku(s,0):r,bv(a)?(n="",e!=null&&(n=e.replace(yv,"$&/")+"/"),Sd(a,t,n,"",function(c){return c})):a!=null&&(ih(a)&&(a=_E(a,n+(!a.key||s&&s.key===a.key?"":(""+a.key).replace(yv,"$&/")+"/")+e)),t.push(a)),1;if(s=0,r=r===""?".":r+":",bv(e))for(var l=0;l<e.length;l++){i=e[l];var d=r+Ku(i,l);s+=Sd(i,t,n,d,a)}else if(d=SE(e),typeof d=="function")for(e=d.call(e),l=0;!(i=e.next()).done;)i=i.value,d=r+Ku(i,l++),s+=Sd(i,t,n,d,a);else if(i==="object")throw t=String(e),Error("Objects are not valid as a React child (found: "+(t==="[object Object]"?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return s}function Gl(e,t,n){if(e==null)return e;var r=[],a=0;return Sd(e,r,"","",function(i){return t.call(n,i,a++)}),r}function DE(e){if(e._status===-1){var t=e._result;t=t(),t.then(function(n){(e._status===0||e._status===-1)&&(e._status=1,e._result=n)},function(n){(e._status===0||e._status===-1)&&(e._status=2,e._result=n)}),e._status===-1&&(e._status=0,e._result=t)}if(e._status===1)return e._result.default;throw e._result}var Mt={current:null},_d={transition:null},RE={ReactCurrentDispatcher:Mt,ReactCurrentBatchConfig:_d,ReactCurrentOwner:ah};function Y0(){throw Error("act(...) is not supported in production builds of React.")}Pe.Children={map:Gl,forEach:function(e,t,n){Gl(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return Gl(e,function(){t++}),t},toArray:function(e){return Gl(e,function(t){return t})||[]},only:function(e){if(!ih(e))throw Error("React.Children.only expected to receive a single React element child.");return e}};Pe.Component=Ls;Pe.Fragment=yE;Pe.Profiler=kE;Pe.PureComponent=nh;Pe.StrictMode=wE;Pe.Suspense=EE;Pe.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=RE;Pe.act=Y0;Pe.cloneElement=function(e,t,n){if(e==null)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var r=W0({},e.props),a=e.key,i=e.ref,s=e._owner;if(t!=null){if(t.ref!==void 0&&(i=t.ref,s=ah.current),t.key!==void 0&&(a=""+t.key),e.type&&e.type.defaultProps)var l=e.type.defaultProps;for(d in t)G0.call(t,d)&&!H0.hasOwnProperty(d)&&(r[d]=t[d]===void 0&&l!==void 0?l[d]:t[d])}var d=arguments.length-2;if(d===1)r.children=n;else if(1<d){l=Array(d);for(var c=0;c<d;c++)l[c]=arguments[c+2];r.children=l}return{$$typeof:Sl,type:e.type,key:a,ref:i,props:r,_owner:s}};Pe.createContext=function(e){return e={$$typeof:jE,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null},e.Provider={$$typeof:xE,_context:e},e.Consumer=e};Pe.createElement=K0;Pe.createFactory=function(e){var t=K0.bind(null,e);return t.type=e,t};Pe.createRef=function(){return{current:null}};Pe.forwardRef=function(e){return{$$typeof:AE,render:e}};Pe.isValidElement=ih;Pe.lazy=function(e){return{$$typeof:CE,_payload:{_status:-1,_result:e},_init:DE}};Pe.memo=function(e,t){return{$$typeof:PE,type:e,compare:t===void 0?null:t}};Pe.startTransition=function(e){var t=_d.transition;_d.transition={};try{e()}finally{_d.transition=t}};Pe.unstable_act=Y0;Pe.useCallback=function(e,t){return Mt.current.useCallback(e,t)};Pe.useContext=function(e){return Mt.current.useContext(e)};Pe.useDebugValue=function(){};Pe.useDeferredValue=function(e){return Mt.current.useDeferredValue(e)};Pe.useEffect=function(e,t){return Mt.current.useEffect(e,t)};Pe.useId=function(){return Mt.current.useId()};Pe.useImperativeHandle=function(e,t,n){return Mt.current.useImperativeHandle(e,t,n)};Pe.useInsertionEffect=function(e,t){return Mt.current.useInsertionEffect(e,t)};Pe.useLayoutEffect=function(e,t){return Mt.current.useLayoutEffect(e,t)};Pe.useMemo=function(e,t){return Mt.current.useMemo(e,t)};Pe.useReducer=function(e,t,n){return Mt.current.useReducer(e,t,n)};Pe.useRef=function(e){return Mt.current.useRef(e)};Pe.useState=function(e){return Mt.current.useState(e)};Pe.useSyncExternalStore=function(e,t,n){return Mt.current.useSyncExternalStore(e,t,n)};Pe.useTransition=function(){return Mt.current.useTransition()};Pe.version="18.3.1";O0.exports=Pe;var g=O0.exports;const I=Cl(g),sh=fE({__proto__:null,default:I},[g]);/** 11 * @license React 12 * react-jsx-runtime.production.min.js 13 * 14 * Copyright (c) Facebook, Inc. and its affiliates. 15 * 16 * This source code is licensed under the MIT license found in the 17 * LICENSE file in the root directory of this source tree. 18 */var zE=g,IE=Symbol.for("react.element"),qE=Symbol.for("react.fragment"),NE=Object.prototype.hasOwnProperty,LE=zE.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,BE={key:!0,ref:!0,__self:!0,__source:!0};function Z0(e,t,n){var r,a={},i=null,s=null;n!==void 0&&(i=""+n),t.key!==void 0&&(i=""+t.key),t.ref!==void 0&&(s=t.ref);for(r in t)NE.call(t,r)&&!BE.hasOwnProperty(r)&&(a[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps,t)a[r]===void 0&&(a[r]=t[r]);return{$$typeof:IE,type:e,key:i,ref:s,props:a,_owner:LE.current}}Qc.Fragment=qE;Qc.jsx=Z0;Qc.jsxs=Z0;F0.exports=Qc;var o=F0.exports,ap={},J0={exports:{}},nn={},Q0={exports:{}},X0={};/** 19 * @license React 20 * scheduler.production.min.js 21 * 22 * Copyright (c) Facebook, Inc. and its affiliates. 23 * 24 * This source code is licensed under the MIT license found in the 25 * LICENSE file in the root directory of this source tree. 26 */(function(e){function t(C,z){var Z=C.length;C.push(z);e:for(;0<Z;){var K=Z-1>>>1,X=C[K];if(0<a(X,z))C[K]=z,C[Z]=X,Z=K;else break e}}function n(C){return C.length===0?null:C[0]}function r(C){if(C.length===0)return null;var z=C[0],Z=C.pop();if(Z!==z){C[0]=Z;e:for(var K=0,X=C.length,he=X>>>1;K<he;){var M=2*(K+1)-1,U=C[M],V=M+1,q=C[V];if(0>a(U,Z))V<X&&0>a(q,U)?(C[K]=q,C[V]=Z,K=V):(C[K]=U,C[M]=Z,K=M);else if(V<X&&0>a(q,Z))C[K]=q,C[V]=Z,K=V;else break e}}return z}function a(C,z){var Z=C.sortIndex-z.sortIndex;return Z!==0?Z:C.id-z.id}if(typeof performance=="object"&&typeof performance.now=="function"){var i=performance;e.unstable_now=function(){return i.now()}}else{var s=Date,l=s.now();e.unstable_now=function(){return s.now()-l}}var d=[],c=[],u=1,m=null,p=3,h=!1,b=!1,f=!1,k=typeof setTimeout=="function"?setTimeout:null,w=typeof clearTimeout=="function"?clearTimeout:null,v=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function y(C){for(var z=n(c);z!==null;){if(z.callback===null)r(c);else if(z.startTime<=C)r(c),z.sortIndex=z.expirationTime,t(d,z);else break;z=n(c)}}function x(C){if(f=!1,y(C),!b)if(n(d)!==null)b=!0,Y(A);else{var z=n(c);z!==null&&te(x,z.startTime-C)}}function A(C,z){b=!1,f&&(f=!1,w(P),P=-1),h=!0;var Z=p;try{for(y(z),m=n(d);m!==null&&(!(m.expirationTime>z)||C&&!G());){var K=m.callback;if(typeof K=="function"){m.callback=null,p=m.priorityLevel;var X=K(m.expirationTime<=z);z=e.unstable_now(),typeof X=="function"?m.callback=X:m===n(d)&&r(d),y(z)}else r(d);m=n(d)}if(m!==null)var he=!0;else{var M=n(c);M!==null&&te(x,M.startTime-z),he=!1}return he}finally{m=null,p=Z,h=!1}}var E=!1,j=null,P=-1,S=5,_=-1;function G(){return!(e.unstable_now()-_<S)}function B(){if(j!==null){var C=e.unstable_now();_=C;var z=!0;try{z=j(!0,C)}finally{z?Q():(E=!1,j=null)}}else E=!1}var Q;if(typeof v=="function")Q=function(){v(B)};else if(typeof MessageChannel<"u"){var N=new MessageChannel,ie=N.port2;N.port1.onmessage=B,Q=function(){ie.postMessage(null)}}else Q=function(){k(B,0)};function Y(C){j=C,E||(E=!0,Q())}function te(C,z){P=k(function(){C(e.unstable_now())},z)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(C){C.callback=null},e.unstable_continueExecution=function(){b||h||(b=!0,Y(A))},e.unstable_forceFrameRate=function(C){0>C||125<C?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):S=0<C?Math.floor(1e3/C):5},e.unstable_getCurrentPriorityLevel=function(){return p},e.unstable_getFirstCallbackNode=function(){return n(d)},e.unstable_next=function(C){switch(p){case 1:case 2:case 3:var z=3;break;default:z=p}var Z=p;p=z;try{return C()}finally{p=Z}},e.unstable_pauseExecution=function(){},e.unstable_requestPaint=function(){},e.unstable_runWithPriority=function(C,z){switch(C){case 1:case 2:case 3:case 4:case 5:break;default:C=3}var Z=p;p=C;try{return z()}finally{p=Z}},e.unstable_scheduleCallback=function(C,z,Z){var K=e.unstable_now();switch(typeof Z=="object"&&Z!==null?(Z=Z.delay,Z=typeof Z=="number"&&0<Z?K+Z:K):Z=K,C){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=Z+X,C={id:u++,callback:z,priorityLevel:C,startTime:Z,expirationTime:X,sortIndex:-1},Z>K?(C.sortIndex=Z,t(c,C),n(d)===null&&C===n(c)&&(f?(w(P),P=-1):f=!0,te(x,Z-K))):(C.sortIndex=X,t(d,C),b||h||(b=!0,Y(A))),C},e.unstable_shouldYield=G,e.unstable_wrapCallback=function(C){var z=p;return function(){var Z=p;p=z;try{return C.apply(this,arguments)}finally{p=Z}}}})(X0);Q0.exports=X0;var ME=Q0.exports;/** 27 * @license React 28 * react-dom.production.min.js 29 * 30 * Copyright (c) Facebook, Inc. and its affiliates. 31 * 32 * This source code is licensed under the MIT license found in the 33 * LICENSE file in the root directory of this source tree. 34 */var FE=g,tn=ME;function O(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}
vendor: 5,017 bytes, line 34
34var ew=new Set,No={};function mi(e,t){bs(e,t),bs(e+"Capture",t)}function bs(e,t){for(No[e]=t,e=0;e<t.length;e++)ew.add(t[e])}var kr=!(typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),ip=Object.prototype.hasOwnProperty,OE=/^[: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]*$/,wv={},kv={};function VE(e){return ip.call(kv,e)?!0:ip.call(wv,e)?!1:OE.test(e)?kv[e]=!0:(wv[e]=!0,!1)}function WE(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function UE(e,t,n,r){if(t===null||typeof t>"u"||WE(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function Ft(e,t,n,r,a,i,s){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=a,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=i,this.removeEmptyString=s}var wt={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){wt[e]=new Ft(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];wt[t]=new Ft(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){wt[e]=new Ft(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){wt[e]=new Ft(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){wt[e]=new Ft(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){wt[e]=new Ft(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){wt[e]=new Ft(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){wt[e]=new Ft(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){wt[e]=new Ft(e,5,!1,e.toLowerCase(),null,!1,!1)});var oh=/[\-:]([a-z])/g;function lh(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(oh,lh);wt[t]=new Ft(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(oh,lh);wt[t]=new Ft(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(oh,lh);wt[t]=new Ft(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){wt[e]=new Ft(e,1,!1,e.toLowerCase(),null,!1,!1)});wt.xlinkHref=new Ft("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){wt[e]=new Ft(e,1,!1,e.toLowerCase(),null,!0,!0)});function dh(e,t,n,r){var a=wt.hasOwnProperty(t)?wt[t]:null;(a!==null?a.type!==0:r||!(2<t.length)||t[0]!=="o"&&t[0]!=="O"||t[1]!=="n"&&t[1]!=="N")&&(UE(t,n,a,r)&&(n=null),r||a===null?VE(t)&&(n===null?e.removeAttribute(t):e.setAttribute(t,""+n)):a.mustUseProperty?e[a.propertyName]=n===null?a.type===3?!1:"":n:(t=a.attributeName,r=a.attributeNamespace,n===null?e.removeAttribute(t):(a=a.type,n=a===3||a===4&&n===!0?"":""+n,r?e.setAttributeNS(r,t,n):e.setAttribute(t,n))))}
vendor: 15,192 bytes, lines 34-38
34var _r=FE.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,Hl=Symbol.for("react.element"),qi=Symbol.for("react.portal"),Ni=Symbol.for("react.fragment"),ch=Symbol.for("react.strict_mode"),sp=Symbol.for("react.profiler"),tw=Symbol.for("react.provider"),nw=Symbol.for("react.context"),uh=Symbol.for("react.forward_ref"),op=Symbol.for("react.suspense"),lp=Symbol.for("react.suspense_list"),mh=Symbol.for("react.memo"),Fr=Symbol.for("react.lazy"),rw=Symbol.for("react.offscreen"),xv=Symbol.iterator;function Xs(e){return e===null||typeof e!="object"?null:(e=xv&&e[xv]||e["@@iterator"],typeof e=="function"?e:null)}var tt=Object.assign,Yu;function po(e){if(Yu===void 0)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);Yu=t&&t[1]||""}return` 35`+Yu+e}var Zu=!1;function Ju(e,t){if(!e||Zu)return"";Zu=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(t,[])}catch(c){var r=c}Reflect.construct(e,[],t)}else{try{t.call()}catch(c){r=c}e.call(t.prototype)}else{try{throw Error()}catch(c){r=c}e()}}catch(c){if(c&&r&&typeof c.stack=="string"){for(var a=c.stack.split(` 36`),i=r.stack.split(` 37`),s=a.length-1,l=i.length-1;1<=s&&0<=l&&a[s]!==i[l];)l--;for(;1<=s&&0<=l;s--,l--)if(a[s]!==i[l]){if(s!==1||l!==1)do if(s--,l--,0>l||a[s]!==i[l]){var d=` 38`+a[s].replace(" at new "," at ");return e.displayName&&d.includes("<anonymous>")&&(d=d.replace("<anonymous>",e.displayName)),d}while(1<=s&&0<=l);break}}}finally{Zu=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?po(e):""}function $E(e){switch(e.tag){case 5:return po(e.type);case 16:return po("Lazy");case 13:return po("Suspense");case 19:return po("SuspenseList");case 0:case 2:case 15:return e=Ju(e.type,!1),e;case 11:return e=Ju(e.type.render,!1),e;case 1:return e=Ju(e.type,!0),e;default:return""}}function dp(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Ni:return"Fragment";case qi:return"Portal";case sp:return"Profiler";case ch:return"StrictMode";case op:return"Suspense";case lp:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case nw:return(e.displayName||"Context")+".Consumer";case tw:return(e._context.displayName||"Context")+".Provider";case uh:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case mh:return t=e.displayName||null,t!==null?t:dp(e.type)||"Memo";case Fr:t=e._payload,e=e._init;try{return dp(e(t))}catch{}}return null}function GE(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return dp(t);case 8:return t===ch?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function pa(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function aw(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function HE(e){var t=aw(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var a=n.get,i=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return a.call(this)},set:function(s){r=""+s,i.call(this,s)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(s){r=""+s},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Kl(e){e._valueTracker||(e._valueTracker=HE(e))}function iw(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=aw(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function Xd(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function cp(e,t){var n=t.checked;return tt({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function jv(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=pa(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function sw(e,t){t=t.checked,t!=null&&dh(e,"checked",t,!1)}function up(e,t){sw(e,t);var n=pa(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?mp(e,t.type,n):t.hasOwnProperty("defaultValue")&&mp(e,t.type,pa(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Av(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function mp(e,t,n){(t!=="number"||Xd(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var go=Array.isArray;function Yi(e,t,n,r){if(e=e.options,t){t={};for(var a=0;a<n.length;a++)t["$"+n[a]]=!0;for(n=0;n<e.length;n++)a=t.hasOwnProperty("$"+e[n].value),e[n].selected!==a&&(e[n].selected=a),a&&r&&(e[n].defaultSelected=!0)}else{for(n=""+pa(n),t=null,a=0;a<e.length;a++){if(e[a].value===n){e[a].selected=!0,r&&(e[a].defaultSelected=!0);return}t!==null||e[a].disabled||(t=e[a])}t!==null&&(t.selected=!0)}}function pp(e,t){if(t.dangerouslySetInnerHTML!=null)throw Error(O(91));return tt({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function Ev(e,t){var n=t.value;if(n==null){if(n=t.children,t=t.defaultValue,n!=null){if(t!=null)throw Error(O(92));if(go(n)){if(1<n.length)throw Error(O(93));n=n[0]}t=n}t==null&&(t=""),n=t}e._wrapperState={initialValue:pa(n)}}function ow(e,t){var n=pa(t.value),r=pa(t.defaultValue);n!=null&&(n=""+n,n!==e.value&&(e.value=n),t.defaultValue==null&&e.defaultValue!==n&&(e.defaultValue=n)),r!=null&&(e.defaultValue=""+r)}function Pv(e){var t=e.textContent;t===e._wrapperState.initialValue&&t!==""&&t!==null&&(e.value=t)}function lw(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function gp(e,t){return e==null||e==="http://www.w3.org/1999/xhtml"?lw(t):e==="http://www.w3.org/2000/svg"&&t==="foreignObject"?"http://www.w3.org/1999/xhtml":e}var Yl,dw=function(e){return typeof MSApp<"u"&&MSApp.execUnsafeLocalFunction?function(t,n,r,a){MSApp.execUnsafeLocalFunction(function(){return e(t,n,r,a)})}:e}(function(e,t){if(e.namespaceURI!=="http://www.w3.org/2000/svg"||"innerHTML"in e)e.innerHTML=t;else{for(Yl=Yl||document.createElement("div"),Yl.innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=Yl.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Lo(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var xo={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},KE=["Webkit","ms","Moz","O"];Object.keys(xo).forEach(function(e){KE.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),xo[t]=xo[e]})});function cw(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||xo.hasOwnProperty(e)&&xo[e]?(""+t).trim():t+"px"}function uw(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,a=cw(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,a):e[n]=a}}var YE=tt({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function hp(e,t){if(t){if(YE[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(O(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(O(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(O(61))}if(t.style!=null&&typeof t.style!="object")throw Error(O(62))}}function fp(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){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 vp=null;function ph(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var bp=null,Zi=null,Ji=null;function Cv(e){if(e=Dl(e)){if(typeof bp!="function")throw Error(O(280));var t=e.stateNode;t&&(t=ru(t),bp(e.stateNode,e.type,t))}}function mw(e){Zi?Ji?Ji.push(e):Ji=[e]:Zi=e}function pw(){if(Zi){var e=Zi,t=Ji;if(Ji=Zi=null,Cv(e),t)for(e=0;e<t.length;e++)Cv(t[e])}}function gw(e,t){return e(t)}function hw(){}var Qu=!1;function fw(e,t,n){if(Qu)return e(t,n);Qu=!0;try{return gw(e,t,n)}finally{Qu=!1,(Zi!==null||Ji!==null)&&(hw(),pw())}}function Bo(e,t){var n=e.stateNode;if(n===null)return null;var r=ru(n);if(r===null)return null;n=r[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(r=!r.disabled)||(e=e.type,r=!(e==="button"||e==="input"||e==="select"||e==="textarea")),e=!r;break e;default:e=!1}if(e)return null;if(n&&typeof n!="function")throw Error(O(231,t,typeof n));return n}var yp=!1;if(kr)try{var eo={};Object.defineProperty(eo,"passive",{get:function(){yp=!0}}),window.addEventListener("test",eo,eo),window.removeEventListener("test",eo,eo)}catch{yp=!1}function ZE(e,t,n,r,a,i,s,l,d){var c=Array.prototype.slice.call(arguments,3);try{t.apply(n,c)}catch(u){this.onError(u)}}var jo=!1,ec=null,tc=!1,wp=null,JE={onError:function(e){jo=!0,ec=e}};function QE(e,t,n,r,a,i,s,l,d){jo=!1,ec=null,ZE.apply(JE,arguments)}function XE(e,t,n,r,a,i,s,l,d){if(QE.apply(this,arguments),jo){if(jo){var c=ec;jo=!1,ec=null}else throw Error(O(198));tc||(tc=!0,wp=c)}}function pi(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do t=e,t.flags&4098&&(n=t.return),e=t.return;while(e)}return t.tag===3?n:null}function vw(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function Sv(e){if(pi(e)!==e)throw Error(O(188))}function eP(e){var t=e.alternate;if(!t){if(t=pi(e),t===null)throw Error(O(188));return t!==e?null:e}for(var n=e,r=t;;){var a=n.return;if(a===null)break;var i=a.alternate;if(i===null){if(r=a.return,r!==null){n=r;continue}break}if(a.child===i.child){for(i=a.child;i;){if(i===n)return Sv(a),e;if(i===r)return Sv(a),t;i=i.sibling}throw Error(O(188))}if(n.return!==r.return)n=a,r=i;else{for(var s=!1,l=a.child;l;){if(l===n){s=!0,n=a,r=i;break}if(l===r){s=!0,r=a,n=i;break}l=l.sibling}if(!s){for(l=i.child;l;){if(l===n){s=!0,n=i,r=a;break}if(l===r){s=!0,r=i,n=a;break}l=l.sibling}if(!s)throw Error(O(189))}}if(n.alternate!==r)throw Error(O(190))}if(n.tag!==3)throw Error(O(188));return n.stateNode.current===n?e:t}function bw(e){return e=eP(e),e!==null?yw(e):null}function yw(e){if(e.tag===5||e.tag===6)return e;for(e=e.child;e!==null;){var t=yw(e);if(t!==null)return t;e=e.sibling}return null}var ww=tn.unstable_scheduleCallback,_v=tn.unstable_cancelCallback,tP=tn.unstable_shouldYield,nP=tn.unstable_requestPaint,ot=tn.unstable_now,rP=tn.unstable_getCurrentPriorityLevel,gh=tn.unstable_ImmediatePriority,kw=tn.unstable_UserBlockingPriority,nc=tn.unstable_NormalPriority,aP=tn.unstable_LowPriority,xw=tn.unstable_IdlePriority,Xc=null,er=null;function iP(e){if(er&&typeof er.onCommitFiberRoot=="function")try{er.onCommitFiberRoot(Xc,e,void 0,(e.current.flags&128)===128)}catch{}}var Tn=Math.clz32?Math.clz32:lP,sP=Math.log,oP=Math.LN2;function lP(e){return e>>>=0,e===0?32:31-(sP(e)/oP|0)|0}var Zl=64,Jl=4194304;function ho(e){switch(e&-e){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: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 e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function rc(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,a=e.suspendedLanes,i=e.pingedLanes,s=n&268435455;if(s!==0){var l=s&~a;l!==0?r=ho(l):(i&=s,i!==0&&(r=ho(i)))}else s=n&~a,s!==0?r=ho(s):i!==0&&(r=ho(i));if(r===0)return 0;if(t!==0&&t!==r&&!(t&a)&&(a=r&-r,i=t&-t,a>=i||a===16&&(i&4194240)!==0))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0<t;)n=31-Tn(t),a=1<<n,r|=e[n],t&=~a;return r}function dP(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case 16:case 32:case 64: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 t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return-1;case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function cP(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,a=e.expirationTimes,i=e.pendingLanes;0<i;){var s=31-Tn(i),l=1<<s,d=a[s];d===-1?(!(l&n)||l&r)&&(a[s]=dP(l,t)):d<=t&&(e.expiredLanes|=l),i&=~l}}function kp(e){return e=e.pendingLanes&-1073741825,e!==0?e:e&1073741824?1073741824:0}function jw(){var e=Zl;
vendor: 4,186 bytes, line 38
38return Zl<<=1,!(Zl&4194240)&&(Zl=64),e}function Xu(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function _l(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Tn(t),e[t]=n}function uP(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0<n;){var a=31-Tn(n),i=1<<a;t[a]=0,r[a]=-1,e[a]=-1,n&=~i}}function hh(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-Tn(n),a=1<<r;a&t|e[r]&t&&(e[r]|=t),n&=~a}}var qe=0;function Aw(e){return e&=-e,1<e?4<e?e&268435455?16:536870912:4:1}var Ew,fh,Pw,Cw,Sw,xp=!1,Ql=[],ta=null,na=null,ra=null,Mo=new Map,Fo=new Map,Vr=[],mP="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 submit".split(" ");function Tv(e,t){switch(e){case"focusin":case"focusout":ta=null;break;case"dragenter":case"dragleave":na=null;break;case"mouseover":case"mouseout":ra=null;break;case"pointerover":case"pointerout":Mo.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":Fo.delete(t.pointerId)}}function to(e,t,n,r,a,i){return e===null||e.nativeEvent!==i?(e={blockedOn:t,domEventName:n,eventSystemFlags:r,nativeEvent:i,targetContainers:[a]},t!==null&&(t=Dl(t),t!==null&&fh(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,a!==null&&t.indexOf(a)===-1&&t.push(a),e)}function pP(e,t,n,r,a){switch(t){case"focusin":return ta=to(ta,e,t,n,r,a),!0;case"dragenter":return na=to(na,e,t,n,r,a),!0;case"mouseover":return ra=to(ra,e,t,n,r,a),!0;case"pointerover":var i=a.pointerId;return Mo.set(i,to(Mo.get(i)||null,e,t,n,r,a)),!0;case"gotpointercapture":return i=a.pointerId,Fo.set(i,to(Fo.get(i)||null,e,t,n,r,a)),!0}return!1}function _w(e){var t=Va(e.target);if(t!==null){var n=pi(t);if(n!==null){if(t=n.tag,t===13){if(t=vw(n),t!==null){e.blockedOn=t,Sw(e.priority,function(){Pw(n)});return}}else if(t===3&&n.stateNode.current.memoizedState.isDehydrated){e.blockedOn=n.tag===3?n.stateNode.containerInfo:null;return}}}e.blockedOn=null}function Td(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContainers;0<t.length;){var n=jp(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(n===null){n=e.nativeEvent;var r=new n.constructor(n.type,n);vp=r,n.target.dispatchEvent(r),vp=null}else return t=Dl(n),t!==null&&fh(t),e.blockedOn=n,!1;t.shift()}return!0}function Dv(e,t,n){Td(e)&&n.delete(t)}function gP(){xp=!1,ta!==null&&Td(ta)&&(ta=null),na!==null&&Td(na)&&(na=null),ra!==null&&Td(ra)&&(ra=null),Mo.forEach(Dv),Fo.forEach(Dv)}function no(e,t){e.blockedOn===t&&(e.blockedOn=null,xp||(xp=!0,tn.unstable_scheduleCallback(tn.unstable_NormalPriority,gP)))}function Oo(e){function t(a){return no(a,e)}if(0<Ql.length){no(Ql[0],e);for(var n=1;n<Ql.length;n++){var r=Ql[n];r.blockedOn===e&&(r.blockedOn=null)}}for(ta!==null&&no(ta,e),na!==null&&no(na,e),ra!==null&&no(ra,e),Mo.forEach(t),Fo.forEach(t),n=0;n<Vr.length;n++)r=Vr[n],r.blockedOn===e&&(r.blockedOn=null);for(;0<Vr.length&&(n=Vr[0],n.blockedOn===null);)_w(n),n.blockedOn===null&&Vr.shift()}var Qi=_r.ReactCurrentBatchConfig,ac=!0;function hP(e,t,n,r){var a=qe,i=Qi.transition;Qi.transition=null;try{qe=1,vh(e,t,n,r)}finally{qe=a,Qi.transition=i}}function fP(e,t,n,r){var a=qe,i=Qi.transition;Qi.transition=null;try{qe=4,vh(e,t,n,r)}finally{qe=a,Qi.transition=i}}function vh(e,t,n,r){if(ac){var a=jp(e,t,n,r);if(a===null)dm(e,t,r,ic,n),Tv(e,r);else if(pP(a,e,t,n,r))r.stopPropagation();else if(Tv(e,r),t&4&&-1<mP.indexOf(e)){for(;a!==null;){var i=Dl(a);if(i!==null&&Ew(i),i=jp(e,t,n,r),i===null&&dm(e,t,r,ic,n),i===a)break;a=i}a!==null&&r.stopPropagation()}else dm(e,t,r,null,n)}}var ic=null;function jp(e,t,n,r){if(ic=null,e=ph(r),e=Va(e),e!==null)if(t=pi(e),t===null)e=null;else if(n=t.tag,n===13){if(e=vw(t),e!==null)return e;e=null}else if(n===3){if(t.stateNode.current.memoizedState.isDehydrated)return t.tag===3?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null);return ic=e,null}
vendor: 10,401 bytes, line 38
38function Tw(e){switch(e){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"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 1;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"toggle":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 4;case"message":switch(rP()){case gh:return 1;case kw:return 4;case nc:case aP:return 16;case xw:return 536870912;default:return 16}default:return 16}}var Jr=null,bh=null,Dd=null;function Dw(){if(Dd)return Dd;var e,t=bh,n=t.length,r,a="value"in Jr?Jr.value:Jr.textContent,i=a.length;for(e=0;e<n&&t[e]===a[e];e++);var s=n-e;for(r=1;r<=s&&t[n-r]===a[i-r];r++);return Dd=a.slice(e,1<r?1-r:void 0)}function Rd(e){var t=e.keyCode;return"charCode"in e?(e=e.charCode,e===0&&t===13&&(e=13)):e=t,e===10&&(e=13),32<=e||e===13?e:0}function Xl(){return!0}function Rv(){return!1}function rn(e){function t(n,r,a,i,s){this._reactName=n,this._targetInst=a,this.type=r,this.nativeEvent=i,this.target=s,this.currentTarget=null;for(var l in e)e.hasOwnProperty(l)&&(n=e[l],this[l]=n?n(i):i[l]);return this.isDefaultPrevented=(i.defaultPrevented!=null?i.defaultPrevented:i.returnValue===!1)?Xl:Rv,this.isPropagationStopped=Rv,this}return tt(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var n=this.nativeEvent;n&&(n.preventDefault?n.preventDefault():typeof n.returnValue!="unknown"&&(n.returnValue=!1),this.isDefaultPrevented=Xl)},stopPropagation:function(){var n=this.nativeEvent;n&&(n.stopPropagation?n.stopPropagation():typeof n.cancelBubble!="unknown"&&(n.cancelBubble=!0),this.isPropagationStopped=Xl)},persist:function(){},isPersistent:Xl}),t}var Bs={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},yh=rn(Bs),Tl=tt({},Bs,{view:0,detail:0}),vP=rn(Tl),em,tm,ro,eu=tt({},Tl,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:wh,button:0,buttons:0,relatedTarget:function(e){return e.relatedTarget===void 0?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==ro&&(ro&&e.type==="mousemove"?(em=e.screenX-ro.screenX,tm=e.screenY-ro.screenY):tm=em=0,ro=e),em)},movementY:function(e){return"movementY"in e?e.movementY:tm}}),zv=rn(eu),bP=tt({},eu,{dataTransfer:0}),yP=rn(bP),wP=tt({},Tl,{relatedTarget:0}),nm=rn(wP),kP=tt({},Bs,{animationName:0,elapsedTime:0,pseudoElement:0}),xP=rn(kP),jP=tt({},Bs,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),AP=rn(jP),EP=tt({},Bs,{data:0}),Iv=rn(EP),PP={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},CP={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"},SP={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function _P(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):(e=SP[e])?!!t[e]:!1}function wh(){return _P}var TP=tt({},Tl,{key:function(e){if(e.key){var t=PP[e.key]||e.key;if(t!=="Unidentified")return t}return e.type==="keypress"?(e=Rd(e),e===13?"Enter":String.fromCharCode(e)):e.type==="keydown"||e.type==="keyup"?CP[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:wh,charCode:function(e){return e.type==="keypress"?Rd(e):0},keyCode:function(e){return e.type==="keydown"||e.type==="keyup"?e.keyCode:0},which:function(e){return e.type==="keypress"?Rd(e):e.type==="keydown"||e.type==="keyup"?e.keyCode:0}}),DP=rn(TP),RP=tt({},eu,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),qv=rn(RP),zP=tt({},Tl,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:wh}),IP=rn(zP),qP=tt({},Bs,{propertyName:0,elapsedTime:0,pseudoElement:0}),NP=rn(qP),LP=tt({},eu,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),BP=rn(LP),MP=[9,13,27,32],kh=kr&&"CompositionEvent"in window,Ao=null;kr&&"documentMode"in document&&(Ao=document.documentMode);var FP=kr&&"TextEvent"in window&&!Ao,Rw=kr&&(!kh||Ao&&8<Ao&&11>=Ao),Nv=" ",Lv=!1;function zw(e,t){switch(e){case"keyup":return MP.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Iw(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Li=!1;function OP(e,t){switch(e){case"compositionend":return Iw(t);case"keypress":return t.which!==32?null:(Lv=!0,Nv);case"textInput":return e=t.data,e===Nv&&Lv?null:e;default:return null}}function VP(e,t){if(Li)return e==="compositionend"||!kh&&zw(e,t)?(e=Dw(),Dd=bh=Jr=null,Li=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return Rw&&t.locale!=="ko"?null:t.data;default:return null}}var WP={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 Bv(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t==="input"?!!WP[e.type]:t==="textarea"}function qw(e,t,n,r){mw(r),t=sc(t,"onChange"),0<t.length&&(n=new yh("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Eo=null,Vo=null;function UP(e){Gw(e,0)}function tu(e){var t=Fi(e);if(iw(t))return e}function $P(e,t){if(e==="change")return t}var Nw=!1;if(kr){var rm;if(kr){var am="oninput"in document;if(!am){var Mv=document.createElement("div");Mv.setAttribute("oninput","return;"),am=typeof Mv.oninput=="function"}rm=am}else rm=!1;Nw=rm&&(!document.documentMode||9<document.documentMode)}function Fv(){Eo&&(Eo.detachEvent("onpropertychange",Lw),Vo=Eo=null)}function Lw(e){if(e.propertyName==="value"&&tu(Vo)){var t=[];qw(t,Vo,e,ph(e)),fw(UP,t)}}function GP(e,t,n){e==="focusin"?(Fv(),Eo=t,Vo=n,Eo.attachEvent("onpropertychange",Lw)):e==="focusout"&&Fv()}function HP(e){if(e==="selectionchange"||e==="keyup"||e==="keydown")return tu(Vo)}function KP(e,t){if(e==="click")return tu(t)}function YP(e,t){if(e==="input"||e==="change")return tu(t)}function ZP(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var zn=typeof Object.is=="function"?Object.is:ZP;function Wo(e,t){if(zn(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++){var a=n[r];if(!ip.call(t,a)||!zn(e[a],t[a]))return!1}return!0}function Ov(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function Vv(e,t){var n=Ov(e);e=0;for(var r;n;){if(n.nodeType===3){if(r=e+n.textContent.length,e<=t&&r>=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=Ov(n)}}function Bw(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Bw(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Mw(){for(var e=window,t=Xd();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Xd(e.document)}return t}function xh(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function JP(e){var t=Mw(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&Bw(n.ownerDocument.documentElement,n)){if(r!==null&&xh(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var a=n.textContent.length,i=Math.min(r.start,a);r=r.end===void 0?i:Math.min(r.end,a),!e.extend&&i>r&&(a=r,r=i,i=a),a=Vv(n,i);var s=Vv(n,r);a&&s&&(e.rangeCount!==1||e.anchorNode!==a.node||e.anchorOffset!==a.offset||e.focusNode!==s.node||e.focusOffset!==s.offset)&&(t=t.createRange(),t.setStart(a.node,a.offset),e.removeAllRanges(),i>r?(e.addRange(t),e.extend(s.node,s.offset)):(t.setEnd(s.node,s.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n<t.length;n++)e=t[n],e.element.scrollLeft=e.left,e.element.scrollTop=e.top}}var QP=kr&&"documentMode"in document&&11>=document.documentMode,Bi=null,Ap=null,Po=null,Ep=!1;function Wv(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Ep||Bi==null||Bi!==Xd(r)||(r=Bi,"selectionStart"in r&&xh(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focu
vendor: 4,501 bytes, line 38
38sNode:r.focusNode,focusOffset:r.focusOffset}),Po&&Wo(Po,r)||(Po=r,r=sc(Ap,"onSelect"),0<r.length&&(t=new yh("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=Bi)))}function ed(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var Mi={animationend:ed("Animation","AnimationEnd"),animationiteration:ed("Animation","AnimationIteration"),animationstart:ed("Animation","AnimationStart"),transitionend:ed("Transition","TransitionEnd")},im={},Fw={};kr&&(Fw=document.createElement("div").style,"AnimationEvent"in window||(delete Mi.animationend.animation,delete Mi.animationiteration.animation,delete Mi.animationstart.animation),"TransitionEvent"in window||delete Mi.transitionend.transition);function nu(e){if(im[e])return im[e];if(!Mi[e])return e;var t=Mi[e],n;for(n in t)if(t.hasOwnProperty(n)&&n in Fw)return im[e]=t[n];return e}var Ow=nu("animationend"),Vw=nu("animationiteration"),Ww=nu("animationstart"),Uw=nu("transitionend"),$w=new Map,Uv="abort auxClick 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(" ");function Pa(e,t){$w.set(e,t),mi(t,[e])}for(var sm=0;sm<Uv.length;sm++){var om=Uv[sm],XP=om.toLowerCase(),eC=om[0].toUpperCase()+om.slice(1);Pa(XP,"on"+eC)}Pa(Ow,"onAnimationEnd");Pa(Vw,"onAnimationIteration");Pa(Ww,"onAnimationStart");Pa("dblclick","onDoubleClick");Pa("focusin","onFocus");Pa("focusout","onBlur");Pa(Uw,"onTransitionEnd");bs("onMouseEnter",["mouseout","mouseover"]);bs("onMouseLeave",["mouseout","mouseover"]);bs("onPointerEnter",["pointerout","pointerover"]);bs("onPointerLeave",["pointerout","pointerover"]);mi("onChange","change click focusin focusout input keydown keyup selectionchange".split(" "));mi("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" "));mi("onBeforeInput",["compositionend","keypress","textInput","paste"]);mi("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" "));mi("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" "));mi("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var fo="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(" "),tC=new Set("cancel close invalid load scroll toggle".split(" ").concat(fo));function $v(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,XE(r,t,void 0,e),e.currentTarget=null}function Gw(e,t){t=(t&4)!==0;for(var n=0;n<e.length;n++){var r=e[n],a=r.event;r=r.listeners;e:{var i=void 0;if(t)for(var s=r.length-1;0<=s;s--){var l=r[s],d=l.instance,c=l.currentTarget;if(l=l.listener,d!==i&&a.isPropagationStopped())break e;$v(a,l,c),i=d}else for(s=0;s<r.length;s++){if(l=r[s],d=l.instance,c=l.currentTarget,l=l.listener,d!==i&&a.isPropagationStopped())break e;$v(a,l,c),i=d}}}if(tc)throw e=wp,tc=!1,wp=null,e}function Ue(e,t){var n=t[Tp];n===void 0&&(n=t[Tp]=new Set);var r=e+"__bubble";n.has(r)||(Hw(t,e,2,!1),n.add(r))}function lm(e,t,n){var r=0;t&&(r|=4),Hw(n,e,r,t)}var td="_reactListening"+Math.random().toString(36).slice(2);function Uo(e){if(!e[td]){e[td]=!0,ew.forEach(function(n){n!=="selectionchange"&&(tC.has(n)||lm(n,!1,e),lm(n,!0,e))});var t=e.nodeType===9?e:e.ownerDocument;t===null||t[td]||(t[td]=!0,lm("selectionchange",!1,t))}}function Hw(e,t,n,r){switch(Tw(t)){case 1:var a=hP;break;case 4:a=fP;break;default:a=vh}n=a.bind(null,t,n,e),a=void 0,!yp||t!=="touchstart"&&t!=="touchmove"&&t!=="wheel"||(a=!0),r?a!==void 0?e.addEventListener(t,n,{capture:!0,passive:a}):e.addEventListener(t,n,!0):a!==void 0?e.addEventListener(t,n,{passive:a}):e.addEventListener(t,n,!1)}function dm(e,t,n,r,a){var i=r;if(!(t&1)&&!(t&2)&&r!==null)e:for(;;){if(r===null)return;var s=r.tag;if(s===3||s===4){var l=r.stateNode.containerInfo;
vendor: 2,527 bytes, line 38
38if(l===a||l.nodeType===8&&l.parentNode===a)break;if(s===4)for(s=r.return;s!==null;){var d=s.tag;if((d===3||d===4)&&(d=s.stateNode.containerInfo,d===a||d.nodeType===8&&d.parentNode===a))return;s=s.return}for(;l!==null;){if(s=Va(l),s===null)return;if(d=s.tag,d===5||d===6){r=i=s;continue e}l=l.parentNode}}r=r.return}fw(function(){var c=i,u=ph(n),m=[];e:{var p=$w.get(e);if(p!==void 0){var h=yh,b=e;switch(e){case"keypress":if(Rd(n)===0)break e;case"keydown":case"keyup":h=DP;break;case"focusin":b="focus",h=nm;break;case"focusout":b="blur",h=nm;break;case"beforeblur":case"afterblur":h=nm;break;case"click":if(n.button===2)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":h=zv;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":h=yP;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":h=IP;break;case Ow:case Vw:case Ww:h=xP;break;case Uw:h=NP;break;case"scroll":h=vP;break;case"wheel":h=BP;break;case"copy":case"cut":case"paste":h=AP;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":h=qv}var f=(t&4)!==0,k=!f&&e==="scroll",w=f?p!==null?p+"Capture":null:p;f=[];for(var v=c,y;v!==null;){y=v;var x=y.stateNode;if(y.tag===5&&x!==null&&(y=x,w!==null&&(x=Bo(v,w),x!=null&&f.push($o(v,x,y)))),k)break;v=v.return}0<f.length&&(p=new h(p,b,null,n,u),m.push({event:p,listeners:f}))}}if(!(t&7)){e:{if(p=e==="mouseover"||e==="pointerover",h=e==="mouseout"||e==="pointerout",p&&n!==vp&&(b=n.relatedTarget||n.fromElement)&&(Va(b)||b[xr]))break e;if((h||p)&&(p=u.window===u?u:(p=u.ownerDocument)?p.defaultView||p.parentWindow:window,h?(b=n.relatedTarget||n.toElement,h=c,b=b?Va(b):null,b!==null&&(k=pi(b),b!==k||b.tag!==5&&b.tag!==6)&&(b=null)):(h=null,b=c),h!==b)){if(f=zv,x="onMouseLeave",w="onMouseEnter",v="mouse",(e==="pointerout"||e==="pointerover")&&(f=qv,x="onPointerLeave",w="onPointerEnter",v="pointer"),k=h==null?p:Fi(h),y=b==null?p:Fi(b),p=new f(x,v+"leave",h,n,u),p.target=k,p.relatedTarget=y,x=null,Va(u)===c&&(f=new f(w,v+"enter",b,n,u),f.target=y,f.relatedTarget=k,x=f),k=x,h&&b)t:{for(f=h,w=b,v=0,y=f;y;y=wi(y))v++;for(y=0,x=w;x;x=wi(x))y++;for(;0<v-y;)f=wi(f),v--;for(;0<y-v;)w=wi(w),y--;for(;v--;){if(f===w||w!==null&&f===w.alternate)break t;f=wi(f),w=wi(w)}f=null}else f=null;h!==null&&Gv(m,p,h,f,!1),b!==null&&k!==null&&Gv(m,k,b,f,!0)}}
vendor: 4,574 bytes, lines 38-39
38e:{if(p=c?Fi(c):window,h=p.nodeName&&p.nodeName.toLowerCase(),h==="select"||h==="input"&&p.type==="file")var A=$P;else if(Bv(p))if(Nw)A=YP;else{A=HP;var E=GP}else(h=p.nodeName)&&h.toLowerCase()==="input"&&(p.type==="checkbox"||p.type==="radio")&&(A=KP);if(A&&(A=A(e,c))){qw(m,A,n,u);break e}E&&E(e,p,c),e==="focusout"&&(E=p._wrapperState)&&E.controlled&&p.type==="number"&&mp(p,"number",p.value)}switch(E=c?Fi(c):window,e){case"focusin":(Bv(E)||E.contentEditable==="true")&&(Bi=E,Ap=c,Po=null);break;case"focusout":Po=Ap=Bi=null;break;case"mousedown":Ep=!0;break;case"contextmenu":case"mouseup":case"dragend":Ep=!1,Wv(m,n,u);break;case"selectionchange":if(QP)break;case"keydown":case"keyup":Wv(m,n,u)}var j;if(kh)e:{switch(e){case"compositionstart":var P="onCompositionStart";break e;case"compositionend":P="onCompositionEnd";break e;case"compositionupdate":P="onCompositionUpdate";break e}P=void 0}else Li?zw(e,n)&&(P="onCompositionEnd"):e==="keydown"&&n.keyCode===229&&(P="onCompositionStart");P&&(Rw&&n.locale!=="ko"&&(Li||P!=="onCompositionStart"?P==="onCompositionEnd"&&Li&&(j=Dw()):(Jr=u,bh="value"in Jr?Jr.value:Jr.textContent,Li=!0)),E=sc(c,P),0<E.length&&(P=new Iv(P,e,null,n,u),m.push({event:P,listeners:E}),j?P.data=j:(j=Iw(n),j!==null&&(P.data=j)))),(j=FP?OP(e,n):VP(e,n))&&(c=sc(c,"onBeforeInput"),0<c.length&&(u=new Iv("onBeforeInput","beforeinput",null,n,u),m.push({event:u,listeners:c}),u.data=j))}Gw(m,t)})}function $o(e,t,n){return{instance:e,listener:t,currentTarget:n}}function sc(e,t){for(var n=t+"Capture",r=[];e!==null;){var a=e,i=a.stateNode;a.tag===5&&i!==null&&(a=i,i=Bo(e,n),i!=null&&r.unshift($o(e,i,a)),i=Bo(e,t),i!=null&&r.push($o(e,i,a))),e=e.return}return r}function wi(e){if(e===null)return null;do e=e.return;while(e&&e.tag!==5);return e||null}function Gv(e,t,n,r,a){for(var i=t._reactName,s=[];n!==null&&n!==r;){var l=n,d=l.alternate,c=l.stateNode;if(d!==null&&d===r)break;l.tag===5&&c!==null&&(l=c,a?(d=Bo(n,i),d!=null&&s.unshift($o(n,d,l))):a||(d=Bo(n,i),d!=null&&s.push($o(n,d,l)))),n=n.return}s.length!==0&&e.push({event:t,listeners:s})}var nC=/\r\n?/g,rC=/\u0000|\uFFFD/g;function Hv(e){return(typeof e=="string"?e:""+e).replace(nC,` 39`).replace(rC,"")}function nd(e,t,n){if(t=Hv(t),Hv(e)!==t&&n)throw Error(O(425))}function oc(){}var Pp=null,Cp=null;function Sp(e,t){return e==="textarea"||e==="noscript"||typeof t.children=="string"||typeof t.children=="number"||typeof t.dangerouslySetInnerHTML=="object"&&t.dangerouslySetInnerHTML!==null&&t.dangerouslySetInnerHTML.__html!=null}var _p=typeof setTimeout=="function"?setTimeout:void 0,aC=typeof clearTimeout=="function"?clearTimeout:void 0,Kv=typeof Promise=="function"?Promise:void 0,iC=typeof queueMicrotask=="function"?queueMicrotask:typeof Kv<"u"?function(e){return Kv.resolve(null).then(e).catch(sC)}:_p;function sC(e){setTimeout(function(){throw e})}function cm(e,t){var n=t,r=0;do{var a=n.nextSibling;if(e.removeChild(n),a&&a.nodeType===8)if(n=a.data,n==="/$"){if(r===0){e.removeChild(a),Oo(t);return}r--}else n!=="$"&&n!=="$?"&&n!=="$!"||r++;n=a}while(n);Oo(t)}function aa(e){for(;e!=null;e=e.nextSibling){var t=e.nodeType;if(t===1||t===3)break;if(t===8){if(t=e.data,t==="$"||t==="$!"||t==="$?")break;if(t==="/$")return null}}return e}function Yv(e){e=e.previousSibling;for(var t=0;e;){if(e.nodeType===8){var n=e.data;if(n==="$"||n==="$!"||n==="$?"){if(t===0)return e;t--}else n==="/$"&&t++}e=e.previousSibling}return null}var Ms=Math.random().toString(36).slice(2),Zn="__reactFiber$"+Ms,Go="__reactProps$"+Ms,xr="__reactContainer$"+Ms,Tp="__reactEvents$"+Ms,oC="__reactListeners$"+Ms,lC="__reactHandles$"+Ms;function Va(e){var t=e[Zn];if(t)return t;for(var n=e.parentNode;n;){if(t=n[xr]||n[Zn]){if(n=t.alternate,t.child!==null||n!==null&&n.child!==null)for(e=Yv(e);e!==null;){if(n=e[Zn])return n;e=Yv(e)}return t}e=n,n=e.parentNode}return null}function Dl(e){return e=e[Zn]||e[xr],!e||e.tag!==5&&e.tag!==6&&e.tag!==13&&e.tag!==3?null:e}function Fi(e){if(e.tag===5||e.tag===6)return e.stateNode;throw Error(O(33))}function ru(e){return e[Go]||null}var Dp=[],Oi=-1;function Ca(e){return{current:e}}function $e(e){0>Oi||(e.current=Dp[Oi],Dp[Oi]=null,Oi--)}function Fe(e,t){Oi++,Dp[Oi]=e.current,e.current=t}var ga={},_t=Ca(ga),Ut=Ca(!1),ti=ga;function ys(e,t){var n=e.type.contextTypes;if(!n)return ga;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var a={},i;for(i in n)a[i]=t[i];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=a
vendor: 28,635 bytes, lines 39-41
39),a}function $t(e){return e=e.childContextTypes,e!=null}function lc(){$e(Ut),$e(_t)}function Zv(e,t,n){if(_t.current!==ga)throw Error(O(168));Fe(_t,t),Fe(Ut,n)}function Kw(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var a in r)if(!(a in t))throw Error(O(108,GE(e)||"Unknown",a));return tt({},n,r)}function dc(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||ga,ti=_t.current,Fe(_t,e),Fe(Ut,Ut.current),!0}function Jv(e,t,n){var r=e.stateNode;if(!r)throw Error(O(169));n?(e=Kw(e,t,ti),r.__reactInternalMemoizedMergedChildContext=e,$e(Ut),$e(_t),Fe(_t,e)):$e(Ut),Fe(Ut,n)}var vr=null,au=!1,um=!1;function Yw(e){vr===null?vr=[e]:vr.push(e)}function dC(e){au=!0,Yw(e)}function Sa(){if(!um&&vr!==null){um=!0;var e=0,t=qe;try{var n=vr;for(qe=1;e<n.length;e++){var r=n[e];do r=r(!0);while(r!==null)}vr=null,au=!1}catch(a){throw vr!==null&&(vr=vr.slice(e+1)),ww(gh,Sa),a}finally{qe=t,um=!1}}return null}var Vi=[],Wi=0,cc=null,uc=0,on=[],ln=0,ni=null,br=1,yr="";function La(e,t){Vi[Wi++]=uc,Vi[Wi++]=cc,cc=e,uc=t}function Zw(e,t,n){on[ln++]=br,on[ln++]=yr,on[ln++]=ni,ni=e;var r=br;e=yr;var a=32-Tn(r)-1;r&=~(1<<a),n+=1;var i=32-Tn(t)+a;if(30<i){var s=a-a%5;i=(r&(1<<s)-1).toString(32),r>>=s,a-=s,br=1<<32-Tn(t)+a|n<<a|r,yr=i+e}else br=1<<i|n<<a|r,yr=e}function jh(e){e.return!==null&&(La(e,1),Zw(e,1,0))}function Ah(e){for(;e===cc;)cc=Vi[--Wi],Vi[Wi]=null,uc=Vi[--Wi],Vi[Wi]=null;for(;e===ni;)ni=on[--ln],on[ln]=null,yr=on[--ln],on[ln]=null,br=on[--ln],on[ln]=null}var Qt=null,Jt=null,Ke=!1,En=null;function Jw(e,t){var n=dn(5,null,null,0);n.elementType="DELETED",n.stateNode=t,n.return=e,t=e.deletions,t===null?(e.deletions=[n],e.flags|=16):t.push(n)}function Qv(e,t){switch(e.tag){case 5:var n=e.type;return t=t.nodeType!==1||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t,t!==null?(e.stateNode=t,Qt=e,Jt=aa(t.firstChild),!0):!1;case 6:return t=e.pendingProps===""||t.nodeType!==3?null:t,t!==null?(e.stateNode=t,Qt=e,Jt=null,!0):!1;case 13:return t=t.nodeType!==8?null:t,t!==null?(n=ni!==null?{id:br,overflow:yr}:null,e.memoizedState={dehydrated:t,treeContext:n,retryLane:1073741824},n=dn(18,null,null,0),n.stateNode=t,n.return=e,e.child=n,Qt=e,Jt=null,!0):!1;default:return!1}}function Rp(e){return(e.mode&1)!==0&&(e.flags&128)===0}function zp(e){if(Ke){var t=Jt;if(t){var n=t;if(!Qv(e,t)){if(Rp(e))throw Error(O(418));t=aa(n.nextSibling);var r=Qt;t&&Qv(e,t)?Jw(r,n):(e.flags=e.flags&-4097|2,Ke=!1,Qt=e)}}else{if(Rp(e))throw Error(O(418));e.flags=e.flags&-4097|2,Ke=!1,Qt=e}}}function Xv(e){for(e=e.return;e!==null&&e.tag!==5&&e.tag!==3&&e.tag!==13;)e=e.return;Qt=e}function rd(e){if(e!==Qt)return!1;if(!Ke)return Xv(e),Ke=!0,!1;var t;if((t=e.tag!==3)&&!(t=e.tag!==5)&&(t=e.type,t=t!=="head"&&t!=="body"&&!Sp(e.type,e.memoizedProps)),t&&(t=Jt)){if(Rp(e))throw Qw(),Error(O(418));for(;t;)Jw(e,t),t=aa(t.nextSibling)}if(Xv(e),e.tag===13){if(e=e.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(O(317));e:{for(e=e.nextSibling,t=0;e;){if(e.nodeType===8){var n=e.data;if(n==="/$"){if(t===0){Jt=aa(e.nextSibling);break e}t--}else n!=="$"&&n!=="$!"&&n!=="$?"||t++}e=e.nextSibling}Jt=null}}else Jt=Qt?aa(e.stateNode.nextSibling):null;return!0}function Qw(){for(var e=Jt;e;)e=aa(e.nextSibling)}function ws(){Jt=Qt=null,Ke=!1}function Eh(e){En===null?En=[e]:En.push(e)}var cC=_r.ReactCurrentBatchConfig;function ao(e,t,n){if(e=n.ref,e!==null&&typeof e!="function"&&typeof e!="object"){if(n._owner){if(n=n._owner,n){if(n.tag!==1)throw Error(O(309));var r=n.stateNode}if(!r)throw Error(O(147,e));var a=r,i=""+e;return t!==null&&t.ref!==null&&typeof t.ref=="function"&&t.ref._stringRef===i?t.ref:(t=function(s){var l=a.refs;s===null?delete l[i]:l[i]=s},t._stringRef=i,t)}if(typeof e!="string")throw Error(O(284));if(!n._owner)throw Error(O(290,e))}return e}function ad(e,t){throw e=Object.prototype.toString.call(t),Error(O(31,e==="[object Object]"?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function eb(e){var t=e._init;return t(e._payload)}function Xw(e){function t(w,v){if(e){var y=w.deletions;y===null?(w.deletions=[v],w.flags|=16):y.push(v)}}function n(w,v){if(!e)return null;for(;v!==null;)t(w,v),v=v.sibling;return null}function r(w,v){for(w=new Map;v!==null;)v.key!==null?w.set(v.key,v):w.set(v.index,v),v=v.sibling;return w}function a(w,v){return w=la(w,v),w.index=0,w.sibling=null,w}function i(w,v,y){return w.index=y,e?(y=w.alternate,y!==null?(y=y.index,y<v?(w.flags|=2,v):y):(w.flags|=2,v)):(w.flags|=1048576,v)}function s(w){return e&&w.alternate===null&&(w.flags|=2),w}function l(w,v,y,x){return v===null||v.tag!==6?(v=bm(y,w.mode,x),v.return=w,v):(v=a(v,y),v.return=w,v)}function d(w,v,y,x){var A=y.type;return A===Ni?u(w,v,y.props.children,x,y.key):v!==null&&(v.elementType===A||typeof A=="object"&&A!==null&&A.$$typeof===Fr&&eb(A)===v.type)?(x=a(v,y.props),x.ref=ao(w,v,y),x.return=w,x):(x=Md(y.type,y.key,y.props,null,w.mode,x),x.ref=ao(w,v,y),x.return=w,x)}function c(w,v,y,x){return v===null||v.tag!==4||v.stateNode.containerInfo!==y.containerInfo||v.stateNode.implementation!==y.implementation?(v=ym(y,w.mode,x),v.return=w,v):(v=a(v,y.children||[]),v.return=w,v)}function u(w,v,y,x,A){return v===null||v.tag!==7?(v=Ja(y,w.mode,x,A),v.return=w,v):(v=a(v,y),v.return=w,v)}function m(w,v,y){if(typeof v=="string"&&v!==""||typeof v=="number")return v=bm(""+v,w.mode,y),v.return=w,v;if(typeof v=="object"&&v!==null){switch(v.$$typeof){case Hl:return y=Md(v.type,v.key,v.props,null,w.mode,y),y.ref=ao(w,null,v),y.return=w,y;case qi:return v=ym(v,w.mode,y),v.return=w,v;case Fr:var x=v._init;return m(w,x(v._payload),y)}if(go(v)||Xs(v))return v=Ja(v,w.mode,y,null),v.return=w,v;ad(w,v)}return null}function p(w,v,y,x){var A=v!==null?v.key:null;if(typeof y=="string"&&y!==""||typeof y=="number")return A!==null?null:l(w,v,""+y,x);if(typeof y=="object"&&y!==null){switch(y.$$typeof){case Hl:return y.key===A?d(w,v,y,x):null;case qi:return y.key===A?c(w,v,y,x):null;case Fr:return A=y._init,p(w,v,A(y._payload),x)}if(go(y)||Xs(y))return A!==null?null:u(w,v,y,x,null);ad(w,y)}return null}function h(w,v,y,x,A){if(typeof x=="string"&&x!==""||typeof x=="number")return w=w.get(y)||null,l(v,w,""+x,A);if(typeof x=="object"&&x!==null){switch(x.$$typeof){case Hl:return w=w.get(x.key===null?y:x.key)||null,d(v,w,x,A);case qi:return w=w.get(x.key===null?y:x.key)||null,c(v,w,x,A);case Fr:var E=x._init;return h(w,v,y,E(x._payload),A)}if(go(x)||Xs(x))return w=w.get(y)||null,u(v,w,x,A,null);ad(v,x)}return null}function b(w,v,y,x){for(var A=null,E=null,j=v,P=v=0,S=null;j!==null&&P<y.length;P++){j.index>P?(S=j,j=null):S=j.sibling;var _=p(w,j,y[P],x);if(_===null){j===null&&(j=S);break}e&&j&&_.alternate===null&&t(w,j),v=i(_,v,P),E===null?A=_:E.sibling=_,E=_,j=S}if(P===y.length)return n(w,j),Ke&&La(w,P),A;if(j===null){for(;P<y.length;P++)j=m(w,y[P],x),j!==null&&(v=i(j,v,P),E===null?A=j:E.sibling=j,E=j);return Ke&&La(w,P),A}for(j=r(w,j);P<y.length;P++)S=h(j,w,P,y[P],x),S!==null&&(e&&S.alternate!==null&&j.delete(S.key===null?P:S.key),v=i(S,v,P),E===null?A=S:E.sibling=S,E=S);return e&&j.forEach(function(G){return t(w,G)}),Ke&&La(w,P),A}function f(w,v,y,x){var A=Xs(y);if(typeof A!="function")throw Error(O(150));if(y=A.call(y),y==null)throw Error(O(151));for(var E=A=null,j=v,P=v=0,S=null,_=y.next();j!==null&&!_.done;P++,_=y.next()){j.index>P?(S=j,j=null):S=j.sibling;var G=p(w,j,_.value,x);if(G===null){j===null&&(j=S);break}e&&j&&G.alternate===null&&t(w,j),v=i(G,v,P),E===null?A=G:E.sibling=G,E=G,j=S}if(_.done)return n(w,j),Ke&&La(w,P),A;if(j===null){for(;!_.done;P++,_=y.next())_=m(w,_.value,x),_!==null&&(v=i(_,v,P),E===null?A=_:E.sibling=_,E=_);return Ke&&La(w,P),A}for(j=r(w,j);!_.done;P++,_=y.next())_=h(j,w,P,_.value,x),_!==null&&(e&&_.alternate!==null&&j.delete(_.key===null?P:_.key),v=i(_,v,P),E===null?A=_:E.sibling=_,E=_);return e&&j.forEach(function(B){return t(w,B)}),Ke&&La(w,P),A}function k(w,v,y,x){if(typeof y=="object"&&y!==null&&y.type===Ni&&y.key===null&&(y=y.props.children),typeof y=="object"&&y!==null){switch(y.$$typeof){case Hl:e:{for(var A=y.key,E=v;E!==null;){if(E.key===A){if(A=y.type,A===Ni){if(E.tag===7){n(w,E.sibling),v=a(E,y.props.children),v.return=w,w=v;break e}}else if(E.elementType===A||typeof A=="object"&&A!==null&&A.$$typeof===Fr&&eb(A)===E.type){n(w,E.sibling),v=a(E,y.props),v.ref=ao(w,E,y),v.return=w,w=v;break e}n(w,E);break}else t(w,E);E=E.sibling}y.type===Ni?(v=Ja(y.props.children,w.mode,x,y.key),v.return=w,w=v):(x=Md(y.type,y.key,y.props,null,w.mode,x),x.ref=ao(w,v,y),x.return=w,w=x)}return s(w);case qi:e:{for(E=y.key;v!==null;){if(v.key===E)if(v.tag===4&&v.stateNode.containerInfo===y.containerInfo&&v.stateNode.implementation===y.implementation){n(w,v.sibling),v=a(v,y.children||[]),v.return=w,w=v;break e}else{n(w,v);break}else t(w,v);v=v.sibling}v=ym(y,w.mode,x),v.return=w,w=v}return s(w);case Fr:return E=y._init,k(w,v,E(y._payload),x)}if(go(y))return b(w,v,y,x);if(Xs(y))return f(w,v,y,x);ad(w,y)}return typeof y=="string"&&y!==""||typeof y=="number"?(y=""+y,v!==null&&v.tag===6?(n(w,v.sibling),v=a(v,y),v.return=w,w=v):(n(w,v),v=bm(y,w.mode,x),v.return=w,w=v),s(w)):n(w,v)}return k}var ks=Xw(!0),ek=Xw(!1),mc=Ca(null),pc=null,Ui=null,Ph=null;function Ch(){Ph=Ui=pc=null}function Sh(e){var t=mc.current;$e(mc),e._currentValue=t}function Ip(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function Xi(e,t){pc=e,Ph=Ui=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(Wt=!0),e.firstContext=null)}function mn(e){var t=e._currentValue;if(Ph!==e)if(e={context:e,memoizedValue:t,next:null},Ui===null){if(pc===null)throw Error(O(308));Ui=e,pc.dependencies={lanes:0,firstContext:e}}else Ui=Ui.next=e;return t}var Wa=null;function _h(e){Wa===null?Wa=[e]:Wa.push(e)}function tk(e,t,n,r){var a=t.interleaved;return a===null?(n.next=n,_h(t)):(n.next=a.next,a.next=n),t.interleaved=n,jr(e,r)}function jr(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var Or=!1;function Th(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function nk(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function wr(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function ia(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,De&2){var a=r.pending;return a===null?t.next=t:(t.next=a.next,a.next=t),r.pending=t,jr(e,n)}return a=r.interleaved,a===null?(t.next=t,_h(r)):(t.next=a.next,a.next=t),r.interleaved=t,jr(e,n)}function zd(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,hh(e,n)}}function tb(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var a=null,i=null;if(n=n.firstBaseUpdate,n!==null){do{var s={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};i===null?a=i=s:i=i.next=s,n=n.next}while(n!==null);i===null?a=i=t:i=i.next=t}else a=i=t;n={baseState:r.baseState,firstBaseUpdate:a,lastBaseUpdate:i,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function gc(e,t,n,r){var a=e.updateQueue;Or=!1;var i=a.firstBaseUpdate,s=a.lastBaseUpdate,l=a.shared.pending;if(l!==null){a.shared.pending=null;var d=l,c=d.next;d.next=null,s===null?i=c:s.next=c,s=d;var u=e.alternate;u!==null&&(u=u.updateQueue,l=u.lastBaseUpdate,l!==s&&(l===null?u.firstBaseUpdate=c:l.next=c,u.lastBaseUpdate=d))}if(i!==null){var m=a.baseState;s=0,u=c=d=null,l=i;do{var p=l.lane,h=l.eventTime;if((r&p)===p){u!==null&&(u=u.next={eventTime:h,lane:0,tag:l.tag,payload:l.payload,callback:l.callback,next:null});e:{var b=e,f=l;switch(p=t,h=n,f.tag){case 1:if(b=f.payload,typeof b=="function"){m=b.call(h,m,p);break e}m=b;break e;case 3:b.flags=b.flags&-65537|128;case 0:if(b=f.payload,p=typeof b=="function"?b.call(h,m,p):b,p==null)break e;m=tt({},m,p);break e;case 2:Or=!0}}l.callback!==null&&l.lane!==0&&(e.flags|=64,p=a.effects,p===null?a.effects=[l]:p.push(l))}else h={eventTime:h,lane:p,tag:l.tag,payload:l.payload,callback:l.callback,next:null},u===null?(c=u=h,d=m):u=u.next=h,s|=p;if(l=l.next,l===null){if(l=a.shared.pending,l===null)break;p=l,l=p.next,p.next=null,a.lastBaseUpdate=p,a.shared.pending=null}}while(!0);if(u===null&&(d=m),a.baseState=d,a.firstBaseUpdate=c,a.lastBaseUpdate=u,t=a.shared.interleaved,t!==null){a=t;do s|=a.lane,a=a.next;while(a!==t)}else i===null&&(a.shared.lanes=0);ai|=s,e.lanes=s,e.memoizedState=m}}function nb(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;t<e.length;t++){var r=e[t],a=r.callback;if(a!==null){if(r.callback=null,r=n,typeof a!="function")throw Error(O(191,a));a.call(r)}}}var Rl={},tr=Ca(Rl),Ho=Ca(Rl),Ko=Ca(Rl);function Ua(e){if(e===Rl)throw Error(O(174));return e}function Dh(e,t){switch(Fe(Ko,t),Fe(Ho,e),Fe(tr,Rl),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:gp(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=gp(t,e)}$e(tr),Fe(tr,t)}function xs(){$e(tr),$e(Ho),$e(Ko)}function rk(e){Ua(Ko.current);var t=Ua(tr.current),n=gp(t,e.type);t!==n&&(Fe(Ho,e),Fe(tr,n))}function Rh(e){Ho.current===e&&($e(tr),$e(Ho))}var Je=Ca(0);function hc(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedState;if(n!==null&&(n=n.dehydrated,n===null||n.data==="$?"||n.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if(t.flags&128)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var mm=[];function zh(){for(var e=0;e<mm.length;e++)mm[e]._workInProgressVersionPrimary=null;mm.length=0}var Id=_r.ReactCurrentDispatcher,pm=_r.ReactCurrentBatchConfig,ri=0,Xe=null,pt=null,ht=null,fc=!1,Co=!1,Yo=0,uC=0;function At(){throw Error(O(321))}function Ih(e,t){if(t===null)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!zn(e[n],t[n]))return!1;return!0}function qh(e,t,n,r,a,i){if(ri=i,Xe=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,Id.current=e===null||e.memoizedState===null?hC:fC,e=n(r,a),Co){i=0;do{if(Co=!1,Yo=0,25<=i)throw Error(O(301));i+=1,ht=pt=null,t.updateQueue=null,Id.current=vC,e=n(r,a)}while(Co)}if(Id.current=vc,t=pt!==null&&pt.next!==null,ri=0,ht=pt=Xe=null,fc=!1,t)throw Error(O(300));return e}function Nh(){var e=Yo!==0;return Yo=0,e}function Un(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return ht===null?Xe.memoizedState=ht=e:ht=ht.next=e,ht}function pn(){if(pt===null){var e=Xe.alternate;e=e!==null?e.memoizedState:null}else e=pt.next;var t=ht===null?Xe.memoizedState:ht.next;if(t!==null)ht=t,pt=e;else{if(e===null)throw Error(O(310));pt=e,e={memoizedState:pt.memoizedState,baseState:pt.baseState,baseQueue:pt.baseQueue,queue:pt.queue,next:null},ht===null?Xe.memoizedState=ht=e:ht=ht.next=e}return ht}function Zo(e,t){return typeof t=="function"?t(e):t}function gm(e){var t=pn(),n=t.queue;if(n===null)throw Error(O(311));n.lastRenderedReducer=e;var r=pt,a=r.baseQueue,i=n.pending;if(i!==null){if(a!==null){var s=a.next;a.next=i.next,i.next=s}r.baseQueue=a=i,n.pending=null}if(a!==null){i=a.next,r=r.baseState;var l=s=null,d=null,c=i;do{var u=c.lane;if((ri&u)===u)d!==null&&(d=d.next={lane:0,action:c.action,hasEagerState:c.hasEagerState,eagerState:c.eagerState,next:null}),r=c.hasEagerState?c.eagerState:e(r,c.action);else{var m={lane:u,action:c.action,hasEagerState:c.hasEagerState,eagerState:c.eagerState,next:null};d===null?(l=d=m,s=r):d=d.next=m,Xe.lanes|=u,ai|=u}c=c.next}while(c!==null&&c!==i);d===null?s=r:d.next=l,zn(r,t.memoizedState)||(Wt=!0),t.memoizedState=r,t.baseState=s,t.baseQueue=d,n.lastRenderedState=r}if(e=n.interleaved,e!==null){a=e;do i=a.lane,Xe.lanes|=i,ai|=i,a=a.next;while(a!==e)}else a===null&&(n.lanes=0);return[t.memoizedState,n.dispatch]}function hm(e){var t=pn(),n=t.queue;if(n===null)throw Error(O(311));n.lastRenderedReducer=e;var r=n.dispatch,a=n.pending,i=t.memoizedState;if(a!==null){n.pending=null;var s=a=a.next;do i=e(i,s.action),s=s.next;while(s!==a);zn(i,t.memoizedState)||(Wt=!0),t.memoizedState=i,t.baseQueue===null&&(t.baseState=i),n.lastRenderedState=i}return[i,r]}function ak(){}function ik(e,t){var n=Xe,r=pn(),a=t(),i=!zn(r.memoizedState,a);if(i&&(r.memoizedState=a,Wt=!0),r=r.queue,Lh(lk.bind(null,n,r,e),[e]),r.getSnapshot!==t||i||ht!==null&&ht.memoizedState.tag&1){if(n.flags|=2048,Jo(9,ok.bind(null,n,r,a,t),void 0,null),ft===null)throw Error(O(349));ri&30||sk(n,t,a)}return a}function sk(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},t=Xe.updateQueue,t===null?(t={lastEffect:null,stores:null},Xe.updateQueue=t,t.stores=[e]):(n=t.stores,n===null?t.stores=[e]:n.push(e))}function ok(e,t,n,r){t.value=n,t.getSnapshot=r,dk(t)&&ck(e)}function lk(e,t,n){return n(function(){dk(t)&&ck(e)})}function dk(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!zn(e,n)}catch{return!0}}function ck(e){var t=jr(e,1);t!==null&&Dn(t,e,1,-1)}function rb(e){var t=Un();return typeof e=="function"&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:Zo,lastRenderedState:e},t.queue=e,e=e.dispatch=gC.bind(null,Xe,e),[t.memoizedState,e]}function Jo(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},t=Xe.updateQueue,t===null?(t={lastEffect:null,stores:null},Xe.updateQueue=t,t.lastEffect=e.next=e):(n=t.lastEffect,n===null?t.lastEffect=e.next=e:(r=n.next,n.next=e,e.next=r,t.lastEffect=e)),e}function uk(){return pn().memoizedState}function qd(e,t,n,r){var a=Un();Xe.flags|=e,a.memoizedState=Jo(1|t,n,void 0,r===void 0?null:r)}function iu(e,t,n,r){var a=pn();r=r===void 0?null:r;var i=void 0;if(pt!==null){var s=pt.memoizedState;if(i=s.destroy,r!==null&&Ih(r,s.deps)){a.memoizedState=Jo(t,n,i,r);return}}Xe.flags|=e,a.memoizedState=Jo(1|t,n,i,r)}function ab(e,t){return qd(8390656,8,e,t)}function Lh(e,t){return iu(2048,8,e,t)}function mk(e,t){return iu(4,2,e,t)}function pk(e,t){return iu(4,4,e,t)}function gk(e,t){if(typeof t=="function")return e=e(),t(e),function(){t(null)};if(t!=null)return e=e(),t.current=e,function(){t.current=null}}function hk(e,t,n){return n=n!=null?n.concat([e]):null,iu(4,4,gk.bind(null,t,e),n)}function Bh(){}function fk(e,t){var n=pn();t=t===void 0?null:t;var r=n.memoizedState;return r!==null&&t!==null&&Ih(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function vk(e,t){var n=pn();t=t===void 0?null:t;var r=n.memoizedState;return r!==null&&t!==null&&Ih(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function bk(e,t,n){return ri&21?(zn(n,t)||(n=jw(),Xe.lanes|=n,ai|=n,e.baseState=!0),t):(e.baseState&&(e.baseState=!1,Wt=!0),e.memoizedState=n)}function mC(e,t){var n=qe;qe=n!==0&&4>n?n:4,e(!0);var r=pm.transition;pm.transition={};try{e(!1),t()}finally{qe=n,pm.transition=r}}function yk(){return pn().memoizedState}function pC(e,t,n){var r=oa(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},wk(e))kk(t,n);else if(n=tk(e,t,n,r),n!==null){var a=Lt();Dn(n,e,r,a),xk(n,t,r)}}function gC(e,t,n){var r=oa(e),a={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(wk(e))kk(t,a);else{var i=e.alternate;if(e.lanes===0&&(i===null||i.lanes===0)&&(i=t.lastRenderedReducer,i!==null))try{var s=t.lastRenderedState,l=i(s,n);if(a.hasEagerState=!0,a.eagerState=l,zn(l,s)){var d=t.interleaved;d===null?(a.next=a,_h(t)):(a.next=d.next,d.next=a),t.interleaved=a;return}}catch{}finally{}n=tk(e,t,a,r),n!==null&&(a=Lt(),Dn(n,e,r,a),xk(n,t,r))}}function wk(e){var t=e.alternate;return e===Xe||t!==null&&t===Xe}function kk(e,t){Co=fc=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function xk(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,hh(e,n)}}var vc={readContext:mn,useCallback:At,useContext:At,useEffect:At,useImperativeHandle:At,useInsertionEffect:At,useLayoutEffect:At,useMemo:At,useReducer:At,useRef:At,useState:At,useDebugValue:At,useDeferredValue:At,useTransition:At,useMutableSource:At,useSyncExternalStore:At,useId:At,unstable_isNewReconciler:!1},hC={readContext:mn,useCallback:function(e,t){return Un().memoizedState=[e,t===void 0?null:t],e},useContext:mn,useEffect:ab,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,qd(4194308,4,gk.bind(null,t,e),n)},useLayoutEffect:function(e,t){return qd(4194308,4,e,t)},useInsertionEffect:function(e,t){return qd(4,2,e,t)},useMemo:function(e,t){var n=Un();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Un();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=pC.bind(null,Xe,e),[r.memoizedState,e]},useRef:function(e){var t=Un();return e={current:e},t.memoizedState=e},useState:rb,useDebugValue:Bh,useDeferredValue:function(e){return Un().memoizedState=e},useTransition:function(){var e=rb(!1),t=e[0];return e=mC.bind(null,e[1]),Un().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=Xe,a=Un();if(Ke){if(n===void 0)throw Error(O(407));n=n()}else{if(n=t(),ft===null)throw Error(O(349));ri&30||sk(r,t,n)}a.memoizedState=n;var i={value:n,getSnapshot:t};return a.queue=i,ab(lk.bind(null,r,i,e),[e]),r.flags|=2048,Jo(9,ok.bind(null,r,i,n,t),void 0,null),n},useId:function(){var e=Un(),t=ft.identifierPrefix;if(Ke){var n=yr,r=br;n=(r&~(1<<32-Tn(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=Yo++,0<n&&(t+="H"+n.toString(32)),t+=":"}else n=uC++,t=":"+t+"r"+n.toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},fC={readContext:mn,useCallback:fk,useContext:mn,useEffect:Lh,useImperativeHandle:hk,useInsertionEffect:mk,useLayoutEffect:pk,useMemo:vk,useReducer:gm,useRef:uk,useState:function(){return gm(Zo)},useDebugValue:Bh,useDeferredValue:function(e){var t=pn();return bk(t,pt.memoizedState,e)},useTransition:function(){var e=gm(Zo)[0],t=pn().memoizedState;return[e,t]},useMutableSource:ak,useSyncExternalStore:ik,useId:yk,unstable_isNewReconciler:!1},vC={readContext:mn,useCallback:fk,useContext:mn,useEffect:Lh,useImperativeHandle:hk,useInsertionEffect:mk,useLayoutEffect:pk,useMemo:vk,useReducer:hm,useRef:uk,useState:function(){return hm(Zo)},useDebugValue:Bh,useDeferredValue:function(e){var t=pn();return pt===null?t.memoizedState=e:bk(t,pt.memoizedState,e)},useTransition:function(){var e=hm(Zo)[0],t=pn().memoizedState;return[e,t]},useMutableSource:ak,useSyncExternalStore:ik,useId:yk,unstable_isNewReconciler:!1};function wn(e,t){if(e&&e.defaultProps){t=tt({},t),e=e.defaultProps;for(var n in e)t[n]===void 0&&(t[n]=e[n]);return t}return t}function qp(e,t,n,r){t=e.memoizedState,n=n(r,t),n=n==null?t:tt({},t,n),e.memoizedState=n,e.lanes===0&&(e.updateQueue.baseState=n)}var su={isMounted:function(e){return(e=e._reactInternals)?pi(e)===e:!1},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=Lt(),a=oa(e),i=wr(r,a);i.payload=t,n!=null&&(i.callback=n),t=ia(e,i,a),t!==null&&(Dn(t,e,a,r),zd(t,e,a))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=Lt(),a=oa(e),i=wr(r,a);i.tag=1,i.payload=t,n!=null&&(i.callback=n),t=ia(e,i,a),t!==null&&(Dn(t,e,a,r),zd(t,e,a))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=Lt(),r=oa(e),a=wr(n,r);a.tag=2,t!=null&&(a.callback=t),t=ia(e,a,r),t!==null&&(Dn(t,e,r,n),zd(t,e,r))}};function ib(e,t,n,r,a,i,s){return e=e.stateNode,typeof e.shouldComponentUpdate=="function"?e.shouldComponentUpdate(r,i,s):t.prototype&&t.prototype.isPureReactComponent?!Wo(n,r)||!Wo(a,i):!0}function jk(e,t,n){var r=!1,a=ga,i=t.contextType;return typeof i=="object"&&i!==null?i=mn(i):(a=$t(t)?ti:_t.current,r=t.contextTypes,i=(r=r!=null)?ys(e,a):ga),t=new t(n,i),e.memoizedState=t.state!==null&&t.state!==void 0?t.state:null,t.updater=su,e.stateNode=t,t._reactInternals=e,r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=a,e.__reactInternalMemoizedMaskedChildContext=i),t}function sb(e,t,n,r){e=t.state,typeof t.componentWillReceiveProps=="function"&&t.componentWillReceiveProps(n,r),typeof t.UNSAFE_componentWillReceiveProps=="function"&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&su.enqueueReplaceState(t,t.state,null)}function Np(e,t,n,r){var a=e.stateNode;a.props=n,a.state=e.memoizedState,a.refs={},Th(e);var i=t.contextType;typeof i=="object"&&i!==null?a.context=mn(i):(i=$t(t)?ti:_t.current,a.context=ys(e,i)),a.state=e.memoizedState,i=t.getDerivedStateFromProps,typeof i=="function"&&(qp(e,t,i,n),a.state=e.memoizedState),typeof t.getDerivedStateFromProps=="function"||typeof a.getSnapshotBeforeUpdate=="function"||typeof a.UNSAFE_componentWillMount!="function"&&typeof a.componentWillMount!="function"||(t=a.state,typeof a.componentWillMount=="function"&&a.componentWillMount(),typeof a.UNSAFE_componentWillMount=="function"&&a.UNSAFE_componentWillMount(),t!==a.state&&su.enqueueReplaceState(a,a.state,null),gc(e,n,a,r),a.state=e.memoizedState),typeof a.componentDidMount=="function"&&(e.flags|=4194308)}function js(e,t){try{var n="",r=t;do n+=$E(r),r=r.return;while(r);var a=n}catch(i){a=` 40Error generating stack: `+i.message+` 41`+i.stack}return{value:e,source:t,stack:a,digest:null}}function fm(e,t,n){return{value:e,source:null,stack:n??null,digest:t??null}}function Lp(e,t){try{console.error(t.value)}catch(n){setTimeout(function(){throw n})}}var bC=typeof WeakMap=="function"?WeakMap:Map;function Ak(e,t,n){n=wr(-1,n),n.tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){yc||(yc=!0,Hp=r),Lp(e,t)},n}function Ek(e,t,n){n=wr(-1,n),n.tag=3;var r=e.type.getDerivedStateFromError;if(typeof r=="function"){var a=t.value;n.payload=function(){return r(a)},n.callback=function(){Lp(e,t)}}var i=e.stateNode;return i!==null&&typeof i.componentDidCatch=="function"&&(n.callback=function(){Lp(e,t),typeof r!="function"&&(sa===null?sa=new Set([this]):sa.add(this));var s=t.stack;this.componentDidCatch(t.value,{componentStack:s!==null?s:""})}),n}function ob(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new bC;var a=new Set;r.set(t,a)}else a=r.get(t),a===void 0&&(a=new Set,r.set(t,a));a.has(n)||(a.add(n),e=RC.bind(null,e,t,n),t.then(e,e))}function lb(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t!==null?t.dehydrated!==null:!0),t)return e;e=e.return}while(e!==null);return null}function db(e,t,n,r,a){return e.mode&1?(e.flags|=65536,e.lanes=a,e):(e===t?e.flags|=65536:(e.flags|=128,n.flags|=131072,n.flags&=-52805,n.tag===1&&(n.alternate===null?n.tag=17:(t=wr(-1,1),t.tag=2,ia(n,t,1))),n.lanes|=1),e)}var yC=_r.ReactCurrentOwner,Wt=!1;function qt(e,t,n,r){t.child=e===null?ek(t,null,n,r):ks(t,e.child,n,r)}function cb(e,t,n,r,a){n=n.render;var i=t.ref;return Xi(t,a),r=qh(e,t,n,r,i,a),n=Nh(),e!==null&&!Wt?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~a,Ar(e,t,a)):(Ke&&n&&jh(t),t.flags|=1,qt(e,t,r,a),t.child)}function ub(e,t,n,r,a){if(e===null){var i=n.type;return typeof i=="function"&&!Gh(i)&&i.defaultProps===void 0&&n.compare===null&&n.defaultProps===void 0?(t.tag=15,t.type=i,Pk(e,t,i,r,a)):(e=Md(n.type,null,r,t,t.mode,a),e.ref=t.ref,e.return=t,t.child=e)}if(i=e.child,!(e.lanes&a)){var s=i.memoizedProps;if(n=n.compare,n=n!==null?n:Wo,n(s,r)&&e.ref===t.ref)return Ar(e,t,a)}return t.flags|=1,e=la(i,r),e.ref=t.ref,e.return=t,t.child=e}function Pk(e,t,n,r,a){if(e!==null){var i=e.memoizedProps;if(Wo(i,r)&&e.ref===t.ref)if(Wt=!1,t.pendingProps=r=i,(e.lanes&a)!==0)e.flags&131072&&(Wt=!0);else return t.lanes=e.lanes,Ar(e,t,a)}return Bp(e,t,n,r,a)}function Ck(e,t,n){var r=t.pendingProps,a=r.children,i=e!==null?e.memoizedState:null;if(r.mode==="hidden")if(!(t.mode&1))t.memoizedState={baseLanes:0,cachePool:null,transitions:null},Fe(Gi,Yt),Yt|=n;else{if(!(n&1073741824))return e=i!==null?i.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,Fe(Gi,Yt),Yt|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=i!==null?i.baseLanes:n,Fe(Gi,Yt),Yt|=r}else i!==null?(r=i.baseLanes|n,t.memoizedState=null):r=n,Fe(Gi,Yt),Yt|=r;return qt(e,t,a,n),t.child}function Sk(e,t){var n=t.ref;(e===null&&n!==null||e!==null&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}
vendor: 12,352 bytes, line 41
41function Bp(e,t,n,r,a){var i=$t(n)?ti:_t.current;return i=ys(t,i),Xi(t,a),n=qh(e,t,n,r,i,a),r=Nh(),e!==null&&!Wt?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~a,Ar(e,t,a)):(Ke&&r&&jh(t),t.flags|=1,qt(e,t,n,a),t.child)}function mb(e,t,n,r,a){if($t(n)){var i=!0;dc(t)}else i=!1;if(Xi(t,a),t.stateNode===null)Nd(e,t),jk(t,n,r),Np(t,n,r,a),r=!0;else if(e===null){var s=t.stateNode,l=t.memoizedProps;s.props=l;var d=s.context,c=n.contextType;typeof c=="object"&&c!==null?c=mn(c):(c=$t(n)?ti:_t.current,c=ys(t,c));var u=n.getDerivedStateFromProps,m=typeof u=="function"||typeof s.getSnapshotBeforeUpdate=="function";m||typeof s.UNSAFE_componentWillReceiveProps!="function"&&typeof s.componentWillReceiveProps!="function"||(l!==r||d!==c)&&sb(t,s,r,c),Or=!1;var p=t.memoizedState;s.state=p,gc(t,r,s,a),d=t.memoizedState,l!==r||p!==d||Ut.current||Or?(typeof u=="function"&&(qp(t,n,u,r),d=t.memoizedState),(l=Or||ib(t,n,l,r,p,d,c))?(m||typeof s.UNSAFE_componentWillMount!="function"&&typeof s.componentWillMount!="function"||(typeof s.componentWillMount=="function"&&s.componentWillMount(),typeof s.UNSAFE_componentWillMount=="function"&&s.UNSAFE_componentWillMount()),typeof s.componentDidMount=="function"&&(t.flags|=4194308)):(typeof s.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=d),s.props=r,s.state=d,s.context=c,r=l):(typeof s.componentDidMount=="function"&&(t.flags|=4194308),r=!1)}else{s=t.stateNode,nk(e,t),l=t.memoizedProps,c=t.type===t.elementType?l:wn(t.type,l),s.props=c,m=t.pendingProps,p=s.context,d=n.contextType,typeof d=="object"&&d!==null?d=mn(d):(d=$t(n)?ti:_t.current,d=ys(t,d));var h=n.getDerivedStateFromProps;(u=typeof h=="function"||typeof s.getSnapshotBeforeUpdate=="function")||typeof s.UNSAFE_componentWillReceiveProps!="function"&&typeof s.componentWillReceiveProps!="function"||(l!==m||p!==d)&&sb(t,s,r,d),Or=!1,p=t.memoizedState,s.state=p,gc(t,r,s,a);var b=t.memoizedState;l!==m||p!==b||Ut.current||Or?(typeof h=="function"&&(qp(t,n,h,r),b=t.memoizedState),(c=Or||ib(t,n,c,r,p,b,d)||!1)?(u||typeof s.UNSAFE_componentWillUpdate!="function"&&typeof s.componentWillUpdate!="function"||(typeof s.componentWillUpdate=="function"&&s.componentWillUpdate(r,b,d),typeof s.UNSAFE_componentWillUpdate=="function"&&s.UNSAFE_componentWillUpdate(r,b,d)),typeof s.componentDidUpdate=="function"&&(t.flags|=4),typeof s.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof s.componentDidUpdate!="function"||l===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),typeof s.getSnapshotBeforeUpdate!="function"||l===e.memoizedProps&&p===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=b),s.props=r,s.state=b,s.context=d,r=c):(typeof s.componentDidUpdate!="function"||l===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),typeof s.getSnapshotBeforeUpdate!="function"||l===e.memoizedProps&&p===e.memoizedState||(t.flags|=1024),r=!1)}return Mp(e,t,n,r,i,a)}function Mp(e,t,n,r,a,i){Sk(e,t);var s=(t.flags&128)!==0;if(!r&&!s)return a&&Jv(t,n,!1),Ar(e,t,i);r=t.stateNode,yC.current=t;var l=s&&typeof n.getDerivedStateFromError!="function"?null:r.render();return t.flags|=1,e!==null&&s?(t.child=ks(t,e.child,null,i),t.child=ks(t,null,l,i)):qt(e,t,l,i),t.memoizedState=r.state,a&&Jv(t,n,!0),t.child}function _k(e){var t=e.stateNode;t.pendingContext?Zv(e,t.pendingContext,t.pendingContext!==t.context):t.context&&Zv(e,t.context,!1),Dh(e,t.containerInfo)}function pb(e,t,n,r,a){return ws(),Eh(a),t.flags|=256,qt(e,t,n,r),t.child}var Fp={dehydrated:null,treeContext:null,retryLane:0};function Op(e){return{baseLanes:e,cachePool:null,transitions:null}}function Tk(e,t,n){var r=t.pendingProps,a=Je.current,i=!1,s=(t.flags&128)!==0,l;if((l=s)||(l=e!==null&&e.memoizedState===null?!1:(a&2)!==0),l?(i=!0,t.flags&=-129):(e===null||e.memoizedState!==null)&&(a|=1),Fe(Je,a&1),e===null)return zp(t),e=t.memoizedState,e!==null&&(e=e.dehydrated,e!==null)?(t.mode&1?e.data==="$!"?t.lanes=8:t.lanes=1073741824:t.lanes=1,null):(s=r.children,e=r.fallback,i?(r=t.mode,i=t.child,s={mode:"hidden",children:s},!(r&1)&&i!==null?(i.childLanes=0,i.pendingProps=s):i=du(s,r,0,null),e=Ja(e,r,n,null),i.return=t,e.return=t,i.sibling=e,t.child=i,t.child.memoizedState=Op(n),t.memoizedState=Fp,e):Mh(t,s));if(a=e.memoizedState,a!==null&&(l=a.dehydrated,l!==null))return wC(e,t,s,r,l,a,n);if(i){i=r.fallback,s=t.mode,a=e.child,l=a.sibling;var d={mode:"hidden",children:r.children};return!(s&1)&&t.child!==a?(r=t.child,r.childLanes=0,r.pendingProps=d,t.deletions=null):(r=la(a,d),r.subtreeFlags=a.subtreeFlags&14680064),l!==null?i=la(l,i):(i=Ja(i,s,n,null),i.flags|=2),i.return=t,r.return=t,r.sibling=i,t.child=r,r=i,i=t.child,s=e.child.memoizedState,s=s===null?Op(n):{baseLanes:s.baseLanes|n,cachePool:null,transitions:s.transitions},i.memoizedState=s,i.childLanes=e.childLanes&~n,t.memoizedState=Fp,r}return i=e.child,e=i.sibling,r=la(i,{mode:"visible",children:r.children}),!(t.mode&1)&&(r.lanes=n),r.return=t,r.sibling=null,e!==null&&(n=t.deletions,n===null?(t.deletions=[e],t.flags|=16):n.push(e)),t.child=r,t.memoizedState=null,r}function Mh(e,t){return t=du({mode:"visible",children:t},e.mode,0,null),t.return=e,e.child=t}function id(e,t,n,r){return r!==null&&Eh(r),ks(t,e.child,null,n),e=Mh(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function wC(e,t,n,r,a,i,s){if(n)return t.flags&256?(t.flags&=-257,r=fm(Error(O(422))),id(e,t,s,r)):t.memoizedState!==null?(t.child=e.child,t.flags|=128,null):(i=r.fallback,a=t.mode,r=du({mode:"visible",children:r.children},a,0,null),i=Ja(i,a,s,null),i.flags|=2,r.return=t,i.return=t,r.sibling=i,t.child=r,t.mode&1&&ks(t,e.child,null,s),t.child.memoizedState=Op(s),t.memoizedState=Fp,i);if(!(t.mode&1))return id(e,t,s,null);if(a.data==="$!"){if(r=a.nextSibling&&a.nextSibling.dataset,r)var l=r.dgst;return r=l,i=Error(O(419)),r=fm(i,r,void 0),id(e,t,s,r)}if(l=(s&e.childLanes)!==0,Wt||l){if(r=ft,r!==null){switch(s&-s){case 4:a=2;break;case 16:a=8;break;case 64: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:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:a=32;break;case 536870912:a=268435456;break;default:a=0}a=a&(r.suspendedLanes|s)?0:a,a!==0&&a!==i.retryLane&&(i.retryLane=a,jr(e,a),Dn(r,e,a,-1))}return $h(),r=fm(Error(O(421))),id(e,t,s,r)}return a.data==="$?"?(t.flags|=128,t.child=e.child,t=zC.bind(null,e),a._reactRetry=t,null):(e=i.treeContext,Jt=aa(a.nextSibling),Qt=t,Ke=!0,En=null,e!==null&&(on[ln++]=br,on[ln++]=yr,on[ln++]=ni,br=e.id,yr=e.overflow,ni=t),t=Mh(t,r.children),t.flags|=4096,t)}function gb(e,t,n){e.lanes|=t;var r=e.alternate;r!==null&&(r.lanes|=t),Ip(e.return,t,n)}function vm(e,t,n,r,a){var i=e.memoizedState;i===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:a}:(i.isBackwards=t,i.rendering=null,i.renderingStartTime=0,i.last=r,i.tail=n,i.tailMode=a)}function Dk(e,t,n){var r=t.pendingProps,a=r.revealOrder,i=r.tail;if(qt(e,t,r.children,n),r=Je.current,r&2)r=r&1|2,t.flags|=128;else{if(e!==null&&e.flags&128)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&gb(e,n,t);else if(e.tag===19)gb(e,n,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(Fe(Je,r),!(t.mode&1))t.memoizedState=null;else switch(a){case"forwards":for(n=t.child,a=null;n!==null;)e=n.alternate,e!==null&&hc(e)===null&&(a=n),n=n.sibling;n=a,n===null?(a=t.child,t.child=null):(a=n.sibling,n.sibling=null),vm(t,!1,a,n,i);break;case"backwards":for(n=null,a=t.child,t.child=null;a!==null;){if(e=a.alternate,e!==null&&hc(e)===null){t.child=a;break}e=a.sibling,a.sibling=n,n=a,a=e}vm(t,!0,n,null,i);break;case"together":vm(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function Nd(e,t){!(t.mode&1)&&e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2)}function Ar(e,t,n){if(e!==null&&(t.dependencies=e.dependencies),ai|=t.lanes,!(n&t.childLanes))return null;if(e!==null&&t.child!==e.child)throw Error(O(153));if(t.child!==null){for(e=t.child,n=la(e,e.pendingProps),t.child=n,n.return=t;e.sibling!==null;)e=e.sibling,n=n.sibling=la(e,e.pendingProps),n.return=t;n.sibling=null}return t.child}function kC(e,t,n){switch(t.tag){case 3:_k(t),ws();break;case 5:rk(t);break;case 1:$t(t.type)&&dc(t);break;case 4:Dh(t,t.stateNode.containerInfo);break;case 10:var r=t.type._context,a=t.memoizedProps.value;Fe(mc,r._currentValue),r._currentValue=a;break;case 13:if(r=t.memoizedState,r!==null)return r.dehydrated!==null?(Fe(Je,Je.current&1),t.flags|=128,null):n&t.child.childLanes?Tk(e,t,n):(Fe(Je,Je.current&1),e=Ar(e,t,n),e!==null?e.sibling:null);Fe(Je,Je.current&1);break;case 19:if(r=(n&t.childLanes)!==0,e.flags&128){if(r)return Dk(e,t,n);t.flags|=128}if(a=t.memoizedState,a!==null&&(a.rendering=null,a.tail=null,a.lastEffect=null),Fe(Je,Je.current),r)break;return null;case 22:case 23:return t.lanes=0,Ck(e,t,n)}return Ar(e,t,n)}var Rk,Vp,zk,Ik;Rk=function(e,t){for(var n=t.child;n!==null;){if(n.tag===5||n.tag===6)e.appendChild(n.stateNode);else if(n.tag!==4&&n.child!==null){n.child.return=n,n=n.child;continue}if(n===t)break;for(;n.sibling===null;){if(n.return===null||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}};Vp=function(){};zk=function(e,t,n,r){var a=e.memoizedProps;if(a!==r){e=t.stateNode,Ua(tr.current);var i=null;switch(n){case"input":a=cp(e,a),r=cp(e,r),i=[];break;case"select":a=tt({},a,{value:void 0}),r=tt({},r,{value:void 0}),i=[];break;case"textarea":a=pp(e,a),r=pp(e,r),i=[];break;default:typeof a.onClick!="function"&&typeof r.onClick=="function"&&(e.onclick=oc)}hp(n,r);var s;n=null;for(c in a)if(!r.hasOwnProperty(c)&&a.hasOwnProperty(c)&&a[c]!=null)if(c==="style"){var l=a[c];for(s in l)l.hasOwnProperty(s)&&(n||(n={}),n[s]="")}else c!=="dangerouslySetInnerHTML"&&c!=="children"&&c!=="suppressContentEditableWarning"&&c!=="suppressHydrationWarning"&&c!=="autoFocus"&&(No.hasOwnProperty(c)?i||(i=[]):(i=i||[]).push(c,null));for(c in r){var d=r[c];if(l=a!=null?a[c]:void 0,r.hasOwnProperty(c)&&d!==l&&(d!=null||l!=null))if(c==="style")if(l){for(s in l)!l.hasOwnProperty(s)||d&&d.hasOwnProperty(s)||(n||(n={}),n[s]="");for(s in d)d.hasOwnProperty(s)&&l[s]!==d[s]&&(n||(n={}),n[s]=d[s])}else n||(i||(i=[]),i.push(c,n)),n=d;else c==="dangerouslySetInnerHTML"?(d=d?d.__html:void 0,l=l?l.__html:void 0,d!=null&&l!==d&&(i=i||[]).push(c,d)):c==="children"?typeof d!="string"&&typeof d!="number"||(i=i||[]).push(c,""+d):c!=="suppressContentEditableWarning"&&c!=="suppressHydrationWarning"&&(No.hasOwnProperty(c)?(d!=null&&c==="onScroll"&&Ue("scroll",e),i||l===d||(i=[])):(i=i||[]).push(c,d))}n&&(i=i||[]).push("style",n);var c=i;(t.updateQueue=c)&&(t.flags|=4)}};Ik=function(e,t,n,r){n!==r&&(t.flags|=4)};function io(e,t){if(!Ke)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;t!==null;)t.alternate!==null&&(n=t),t=t.sibling;n===null?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;n!==null;)n.alternate!==null&&(r=n),n=n.sibling;r===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:r.sibling=null}}function Et(e){var t=e.alternate!==null&&e.alternate.child===e.child,n=0,r=0;if(t)for(var a=e.child;a!==null;)n|=a.lanes|a.childLanes,r|=a.subtreeFlags&14680064,r|=a.flags&14680064,a.return=e,a=a.sibling;else for(a=e.child;a!==null;)n|=a.lanes|a.childLanes,r|=a.subtreeFlags,r|=a.flags,a.return=e,a=a.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function xC(e,t,n){var r=t.pendingProps;switch(Ah(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Et(t),null;case 1:return $t(t.type)&&lc(),Et(t),null;case 3:return r=t.stateNode,xs(),$e(Ut),$e(_t),zh(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),(e===null||e.child===null)&&(rd(t)?t.flags|=4:e===null||e.memoizedState.isDehydrated&&!(t.flags&256)||(t.flags|=1024,En!==null&&(Zp(En),En=null))),Vp(e,t),Et(t),null;case 5:Rh(t);var a=Ua(Ko.current);if(n=t.type,e!==null&&t.stateNode!=null)zk(e,t,n,r,a),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!r){if(t.stateNode===null)throw Error(O(166));return Et(t),null}if(e=Ua(tr.current),rd(t)){r=t.stateNode,n=t.type;var i=t.memoizedProps;
vendor: 29,535 bytes, line 41
41switch(r[Zn]=t,r[Go]=i,e=(t.mode&1)!==0,n){case"dialog":Ue("cancel",r),Ue("close",r);break;case"iframe":case"object":case"embed":Ue("load",r);break;case"video":case"audio":for(a=0;a<fo.length;a++)Ue(fo[a],r);break;case"source":Ue("error",r);break;case"img":case"image":case"link":Ue("error",r),Ue("load",r);break;case"details":Ue("toggle",r);break;case"input":jv(r,i),Ue("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!i.multiple},Ue("invalid",r);break;case"textarea":Ev(r,i),Ue("invalid",r)}hp(n,i),a=null;for(var s in i)if(i.hasOwnProperty(s)){var l=i[s];s==="children"?typeof l=="string"?r.textContent!==l&&(i.suppressHydrationWarning!==!0&&nd(r.textContent,l,e),a=["children",l]):typeof l=="number"&&r.textContent!==""+l&&(i.suppressHydrationWarning!==!0&&nd(r.textContent,l,e),a=["children",""+l]):No.hasOwnProperty(s)&&l!=null&&s==="onScroll"&&Ue("scroll",r)}switch(n){case"input":Kl(r),Av(r,i,!0);break;case"textarea":Kl(r),Pv(r);break;case"select":case"option":break;default:typeof i.onClick=="function"&&(r.onclick=oc)}r=a,t.updateQueue=r,r!==null&&(t.flags|=4)}else{s=a.nodeType===9?a:a.ownerDocument,e==="http://www.w3.org/1999/xhtml"&&(e=lw(n)),e==="http://www.w3.org/1999/xhtml"?n==="script"?(e=s.createElement("div"),e.innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=s.createElement(n,{is:r.is}):(e=s.createElement(n),n==="select"&&(s=e,r.multiple?s.multiple=!0:r.size&&(s.size=r.size))):e=s.createElementNS(e,n),e[Zn]=t,e[Go]=r,Rk(e,t,!1,!1),t.stateNode=e;e:{switch(s=fp(n,r),n){case"dialog":Ue("cancel",e),Ue("close",e),a=r;break;case"iframe":case"object":case"embed":Ue("load",e),a=r;break;case"video":case"audio":for(a=0;a<fo.length;a++)Ue(fo[a],e);a=r;break;case"source":Ue("error",e),a=r;break;case"img":case"image":case"link":Ue("error",e),Ue("load",e),a=r;break;case"details":Ue("toggle",e),a=r;break;case"input":jv(e,r),a=cp(e,r),Ue("invalid",e);break;case"option":a=r;break;case"select":e._wrapperState={wasMultiple:!!r.multiple},a=tt({},r,{value:void 0}),Ue("invalid",e);break;case"textarea":Ev(e,r),a=pp(e,r),Ue("invalid",e);break;default:a=r}hp(n,a),l=a;for(i in l)if(l.hasOwnProperty(i)){var d=l[i];i==="style"?uw(e,d):i==="dangerouslySetInnerHTML"?(d=d?d.__html:void 0,d!=null&&dw(e,d)):i==="children"?typeof d=="string"?(n!=="textarea"||d!=="")&&Lo(e,d):typeof d=="number"&&Lo(e,""+d):i!=="suppressContentEditableWarning"&&i!=="suppressHydrationWarning"&&i!=="autoFocus"&&(No.hasOwnProperty(i)?d!=null&&i==="onScroll"&&Ue("scroll",e):d!=null&&dh(e,i,d,s))}switch(n){case"input":Kl(e),Av(e,r,!1);break;case"textarea":Kl(e),Pv(e);break;case"option":r.value!=null&&e.setAttribute("value",""+pa(r.value));break;case"select":e.multiple=!!r.multiple,i=r.value,i!=null?Yi(e,!!r.multiple,i,!1):r.defaultValue!=null&&Yi(e,!!r.multiple,r.defaultValue,!0);break;default:typeof a.onClick=="function"&&(e.onclick=oc)}switch(n){case"button":case"input":case"select":case"textarea":r=!!r.autoFocus;break e;case"img":r=!0;break e;default:r=!1}}r&&(t.flags|=4)}t.ref!==null&&(t.flags|=512,t.flags|=2097152)}return Et(t),null;case 6:if(e&&t.stateNode!=null)Ik(e,t,e.memoizedProps,r);else{if(typeof r!="string"&&t.stateNode===null)throw Error(O(166));if(n=Ua(Ko.current),Ua(tr.current),rd(t)){if(r=t.stateNode,n=t.memoizedProps,r[Zn]=t,(i=r.nodeValue!==n)&&(e=Qt,e!==null))switch(e.tag){case 3:nd(r.nodeValue,n,(e.mode&1)!==0);break;case 5:e.memoizedProps.suppressHydrationWarning!==!0&&nd(r.nodeValue,n,(e.mode&1)!==0)}i&&(t.flags|=4)}else r=(n.nodeType===9?n:n.ownerDocument).createTextNode(r),r[Zn]=t,t.stateNode=r}return Et(t),null;case 13:if($e(Je),r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(Ke&&Jt!==null&&t.mode&1&&!(t.flags&128))Qw(),ws(),t.flags|=98560,i=!1;else if(i=rd(t),r!==null&&r.dehydrated!==null){if(e===null){if(!i)throw Error(O(318));if(i=t.memoizedState,i=i!==null?i.dehydrated:null,!i)throw Error(O(317));i[Zn]=t}else ws(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;Et(t),i=!1}else En!==null&&(Zp(En),En=null),i=!0;if(!i)return t.flags&65536?t:null}return t.flags&128?(t.lanes=n,t):(r=r!==null,r!==(e!==null&&e.memoizedState!==null)&&r&&(t.child.flags|=8192,t.mode&1&&(e===null||Je.current&1?gt===0&&(gt=3):$h())),t.updateQueue!==null&&(t.flags|=4),Et(t),null);case 4:return xs(),Vp(e,t),e===null&&Uo(t.stateNode.containerInfo),Et(t),null;case 10:return Sh(t.type._context),Et(t),null;case 17:return $t(t.type)&&lc(),Et(t),null;case 19:if($e(Je),i=t.memoizedState,i===null)return Et(t),null;if(r=(t.flags&128)!==0,s=i.rendering,s===null)if(r)io(i,!1);else{if(gt!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(s=hc(e),s!==null){for(t.flags|=128,io(i,!1),r=s.updateQueue,r!==null&&(t.updateQueue=r,t.flags|=4),t.subtreeFlags=0,r=n,n=t.child;n!==null;)i=n,e=r,i.flags&=14680066,s=i.alternate,s===null?(i.childLanes=0,i.lanes=e,i.child=null,i.subtreeFlags=0,i.memoizedProps=null,i.memoizedState=null,i.updateQueue=null,i.dependencies=null,i.stateNode=null):(i.childLanes=s.childLanes,i.lanes=s.lanes,i.child=s.child,i.subtreeFlags=0,i.deletions=null,i.memoizedProps=s.memoizedProps,i.memoizedState=s.memoizedState,i.updateQueue=s.updateQueue,i.type=s.type,e=s.dependencies,i.dependencies=e===null?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return Fe(Je,Je.current&1|2),t.child}e=e.sibling}i.tail!==null&&ot()>As&&(t.flags|=128,r=!0,io(i,!1),t.lanes=4194304)}else{if(!r)if(e=hc(s),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),io(i,!0),i.tail===null&&i.tailMode==="hidden"&&!s.alternate&&!Ke)return Et(t),null}else 2*ot()-i.renderingStartTime>As&&n!==1073741824&&(t.flags|=128,r=!0,io(i,!1),t.lanes=4194304);i.isBackwards?(s.sibling=t.child,t.child=s):(n=i.last,n!==null?n.sibling=s:t.child=s,i.last=s)}return i.tail!==null?(t=i.tail,i.rendering=t,i.tail=t.sibling,i.renderingStartTime=ot(),t.sibling=null,n=Je.current,Fe(Je,r?n&1|2:n&1),t):(Et(t),null);case 22:case 23:return Uh(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?Yt&1073741824&&(Et(t),t.subtreeFlags&6&&(t.flags|=8192)):Et(t),null;case 24:return null;case 25:return null}throw Error(O(156,t.tag))}function jC(e,t){switch(Ah(t),t.tag){case 1:return $t(t.type)&&lc(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return xs(),$e(Ut),$e(_t),zh(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return Rh(t),null;case 13:if($e(Je),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(O(340));ws()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return $e(Je),null;case 4:return xs(),null;case 10:return Sh(t.type._context),null;case 22:case 23:return Uh(),null;case 24:return null;default:return null}}var sd=!1,Ct=!1,AC=typeof WeakSet=="function"?WeakSet:Set,ae=null;function $i(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){rt(e,t,r)}else n.current=null}function Wp(e,t,n){try{n()}catch(r){rt(e,t,r)}}var hb=!1;function EC(e,t){if(Pp=ac,e=Mw(),xh(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var a=r.anchorOffset,i=r.focusNode;r=r.focusOffset;try{n.nodeType,i.nodeType}catch{n=null;break e}var s=0,l=-1,d=-1,c=0,u=0,m=e,p=null;t:for(;;){for(var h;m!==n||a!==0&&m.nodeType!==3||(l=s+a),m!==i||r!==0&&m.nodeType!==3||(d=s+r),m.nodeType===3&&(s+=m.nodeValue.length),(h=m.firstChild)!==null;)p=m,m=h;for(;;){if(m===e)break t;if(p===n&&++c===a&&(l=s),p===i&&++u===r&&(d=s),(h=m.nextSibling)!==null)break;m=p,p=m.parentNode}m=h}n=l===-1||d===-1?null:{start:l,end:d}}else n=null}n=n||{start:0,end:0}}else n=null;for(Cp={focusedElem:e,selectionRange:n},ac=!1,ae=t;ae!==null;)if(t=ae,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,ae=e;else for(;ae!==null;){t=ae;try{var b=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(b!==null){var f=b.memoizedProps,k=b.memoizedState,w=t.stateNode,v=w.getSnapshotBeforeUpdate(t.elementType===t.type?f:wn(t.type,f),k);w.__reactInternalSnapshotBeforeUpdate=v}break;case 3:var y=t.stateNode.containerInfo;y.nodeType===1?y.textContent="":y.nodeType===9&&y.documentElement&&y.removeChild(y.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(O(163))}}catch(x){rt(t,t.return,x)}if(e=t.sibling,e!==null){e.return=t.return,ae=e;break}ae=t.return}return b=hb,hb=!1,b}function So(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var a=r=r.next;do{if((a.tag&e)===e){var i=a.destroy;a.destroy=void 0,i!==void 0&&Wp(t,n,i)}a=a.next}while(a!==r)}}function ou(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function Up(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function qk(e){var t=e.alternate;t!==null&&(e.alternate=null,qk(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Zn],delete t[Go],delete t[Tp],delete t[oC],delete t[lC])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Nk(e){return e.tag===5||e.tag===3||e.tag===4}function fb(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Nk(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function $p(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=oc));else if(r!==4&&(e=e.child,e!==null))for($p(e,t,n),e=e.sibling;e!==null;)$p(e,t,n),e=e.sibling}function Gp(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(Gp(e,t,n),e=e.sibling;e!==null;)Gp(e,t,n),e=e.sibling}var bt=null,jn=!1;function Rr(e,t,n){for(n=n.child;n!==null;)Lk(e,t,n),n=n.sibling}function Lk(e,t,n){if(er&&typeof er.onCommitFiberUnmount=="function")try{er.onCommitFiberUnmount(Xc,n)}catch{}switch(n.tag){case 5:Ct||$i(n,t);case 6:var r=bt,a=jn;bt=null,Rr(e,t,n),bt=r,jn=a,bt!==null&&(jn?(e=bt,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):bt.removeChild(n.stateNode));break;case 18:bt!==null&&(jn?(e=bt,n=n.stateNode,e.nodeType===8?cm(e.parentNode,n):e.nodeType===1&&cm(e,n),Oo(e)):cm(bt,n.stateNode));break;case 4:r=bt,a=jn,bt=n.stateNode.containerInfo,jn=!0,Rr(e,t,n),bt=r,jn=a;break;case 0:case 11:case 14:case 15:if(!Ct&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){a=r=r.next;do{var i=a,s=i.destroy;i=i.tag,s!==void 0&&(i&2||i&4)&&Wp(n,t,s),a=a.next}while(a!==r)}Rr(e,t,n);break;case 1:if(!Ct&&($i(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(l){rt(n,t,l)}Rr(e,t,n);break;case 21:Rr(e,t,n);break;case 22:n.mode&1?(Ct=(r=Ct)||n.memoizedState!==null,Rr(e,t,n),Ct=r):Rr(e,t,n);break;default:Rr(e,t,n)}}function vb(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new AC),t.forEach(function(r){var a=IC.bind(null,e,r);n.has(r)||(n.add(r),r.then(a,a))})}}function vn(e,t){var n=t.deletions;if(n!==null)for(var r=0;r<n.length;r++){var a=n[r];try{var i=e,s=t,l=s;e:for(;l!==null;){switch(l.tag){case 5:bt=l.stateNode,jn=!1;break e;case 3:bt=l.stateNode.containerInfo,jn=!0;break e;case 4:bt=l.stateNode.containerInfo,jn=!0;break e}l=l.return}if(bt===null)throw Error(O(160));Lk(i,s,a),bt=null,jn=!1;var d=a.alternate;d!==null&&(d.return=null),a.return=null}catch(c){rt(a,t,c)}}if(t.subtreeFlags&12854)for(t=t.child;t!==null;)Bk(t,e),t=t.sibling}function Bk(e,t){var n=e.alternate,r=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(vn(t,e),Wn(e),r&4){try{So(3,e,e.return),ou(3,e)}catch(f){rt(e,e.return,f)}try{So(5,e,e.return)}catch(f){rt(e,e.return,f)}}break;case 1:vn(t,e),Wn(e),r&512&&n!==null&&$i(n,n.return);break;case 5:if(vn(t,e),Wn(e),r&512&&n!==null&&$i(n,n.return),e.flags&32){var a=e.stateNode;try{Lo(a,"")}catch(f){rt(e,e.return,f)}}if(r&4&&(a=e.stateNode,a!=null)){var i=e.memoizedProps,s=n!==null?n.memoizedProps:i,l=e.type,d=e.updateQueue;if(e.updateQueue=null,d!==null)try{l==="input"&&i.type==="radio"&&i.name!=null&&sw(a,i),fp(l,s);var c=fp(l,i);for(s=0;s<d.length;s+=2){var u=d[s],m=d[s+1];u==="style"?uw(a,m):u==="dangerouslySetInnerHTML"?dw(a,m):u==="children"?Lo(a,m):dh(a,u,m,c)}switch(l){case"input":up(a,i);break;case"textarea":ow(a,i);break;case"select":var p=a._wrapperState.wasMultiple;a._wrapperState.wasMultiple=!!i.multiple;var h=i.value;h!=null?Yi(a,!!i.multiple,h,!1):p!==!!i.multiple&&(i.defaultValue!=null?Yi(a,!!i.multiple,i.defaultValue,!0):Yi(a,!!i.multiple,i.multiple?[]:"",!1))}a[Go]=i}catch(f){rt(e,e.return,f)}}break;case 6:if(vn(t,e),Wn(e),r&4){if(e.stateNode===null)throw Error(O(162));a=e.stateNode,i=e.memoizedProps;try{a.nodeValue=i}catch(f){rt(e,e.return,f)}}break;case 3:if(vn(t,e),Wn(e),r&4&&n!==null&&n.memoizedState.isDehydrated)try{Oo(t.containerInfo)}catch(f){rt(e,e.return,f)}break;case 4:vn(t,e),Wn(e);break;case 13:vn(t,e),Wn(e),a=e.child,a.flags&8192&&(i=a.memoizedState!==null,a.stateNode.isHidden=i,!i||a.alternate!==null&&a.alternate.memoizedState!==null||(Vh=ot())),r&4&&vb(e);break;case 22:if(u=n!==null&&n.memoizedState!==null,e.mode&1?(Ct=(c=Ct)||u,vn(t,e),Ct=c):vn(t,e),Wn(e),r&8192){if(c=e.memoizedState!==null,(e.stateNode.isHidden=c)&&!u&&e.mode&1)for(ae=e,u=e.child;u!==null;){for(m=ae=u;ae!==null;){switch(p=ae,h=p.child,p.tag){case 0:case 11:case 14:case 15:So(4,p,p.return);break;case 1:$i(p,p.return);var b=p.stateNode;if(typeof b.componentWillUnmount=="function"){r=p,n=p.return;try{t=r,b.props=t.memoizedProps,b.state=t.memoizedState,b.componentWillUnmount()}catch(f){rt(r,n,f)}}break;case 5:$i(p,p.return);break;case 22:if(p.memoizedState!==null){yb(m);continue}}h!==null?(h.return=p,ae=h):yb(m)}u=u.sibling}e:for(u=null,m=e;;){if(m.tag===5){if(u===null){u=m;try{a=m.stateNode,c?(i=a.style,typeof i.setProperty=="function"?i.setProperty("display","none","important"):i.display="none"):(l=m.stateNode,d=m.memoizedProps.style,s=d!=null&&d.hasOwnProperty("display")?d.display:null,l.style.display=cw("display",s))}catch(f){rt(e,e.return,f)}}}else if(m.tag===6){if(u===null)try{m.stateNode.nodeValue=c?"":m.memoizedProps}catch(f){rt(e,e.return,f)}}else if((m.tag!==22&&m.tag!==23||m.memoizedState===null||m===e)&&m.child!==null){m.child.return=m,m=m.child;continue}if(m===e)break e;for(;m.sibling===null;){if(m.return===null||m.return===e)break e;u===m&&(u=null),m=m.return}u===m&&(u=null),m.sibling.return=m.return,m=m.sibling}}break;case 19:vn(t,e),Wn(e),r&4&&vb(e);break;case 21:break;default:vn(t,e),Wn(e)}}function Wn(e){var t=e.flags;if(t&2){try{e:{for(var n=e.return;n!==null;){if(Nk(n)){var r=n;break e}n=n.return}throw Error(O(160))}switch(r.tag){case 5:var a=r.stateNode;r.flags&32&&(Lo(a,""),r.flags&=-33);var i=fb(e);Gp(e,i,a);break;case 3:case 4:var s=r.stateNode.containerInfo,l=fb(e);$p(e,l,s);break;default:throw Error(O(161))}}catch(d){rt(e,e.return,d)}e.flags&=-3}t&4096&&(e.flags&=-4097)}function PC(e,t,n){ae=e,Mk(e)}function Mk(e,t,n){for(var r=(e.mode&1)!==0;ae!==null;){var a=ae,i=a.child;if(a.tag===22&&r){var s=a.memoizedState!==null||sd;if(!s){var l=a.alternate,d=l!==null&&l.memoizedState!==null||Ct;l=sd;var c=Ct;if(sd=s,(Ct=d)&&!c)for(ae=a;ae!==null;)s=ae,d=s.child,s.tag===22&&s.memoizedState!==null?wb(a):d!==null?(d.return=s,ae=d):wb(a);for(;i!==null;)ae=i,Mk(i),i=i.sibling;ae=a,sd=l,Ct=c}bb(e)}else a.subtreeFlags&8772&&i!==null?(i.return=a,ae=i):bb(e)}}function bb(e){for(;ae!==null;){var t=ae;if(t.flags&8772){var n=t.alternate;try{if(t.flags&8772)switch(t.tag){case 0:case 11:case 15:Ct||ou(5,t);break;case 1:var r=t.stateNode;if(t.flags&4&&!Ct)if(n===null)r.componentDidMount();else{var a=t.elementType===t.type?n.memoizedProps:wn(t.type,n.memoizedProps);r.componentDidUpdate(a,n.memoizedState,r.__reactInternalSnapshotBeforeUpdate)}var i=t.updateQueue;i!==null&&nb(t,i,r);break;case 3:var s=t.updateQueue;if(s!==null){if(n=null,t.child!==null)switch(t.child.tag){case 5:n=t.child.stateNode;break;case 1:n=t.child.stateNode}nb(t,s,n)}break;case 5:var l=t.stateNode;if(n===null&&t.flags&4){n=l;var d=t.memoizedProps;switch(t.type){case"button":case"input":case"select":case"textarea":d.autoFocus&&n.focus();break;case"img":d.src&&(n.src=d.src)}}break;case 6:break;case 4:break;case 12:break;case 13:if(t.memoizedState===null){var c=t.alternate;if(c!==null){var u=c.memoizedState;if(u!==null){var m=u.dehydrated;m!==null&&Oo(m)}}}break;case 19:case 17:case 21:case 22:case 23:case 25:break;default:throw Error(O(163))}Ct||t.flags&512&&Up(t)}catch(p){rt(t,t.return,p)}}if(t===e){ae=null;break}if(n=t.sibling,n!==null){n.return=t.return,ae=n;break}ae=t.return}}function yb(e){for(;ae!==null;){var t=ae;if(t===e){ae=null;break}var n=t.sibling;if(n!==null){n.return=t.return,ae=n;break}ae=t.return}}function wb(e){for(;ae!==null;){var t=ae;try{switch(t.tag){case 0:case 11:case 15:var n=t.return;try{ou(4,t)}catch(d){rt(t,n,d)}break;case 1:var r=t.stateNode;if(typeof r.componentDidMount=="function"){var a=t.return;try{r.componentDidMount()}catch(d){rt(t,a,d)}}var i=t.return;try{Up(t)}catch(d){rt(t,i,d)}break;case 5:var s=t.return;try{Up(t)}catch(d){rt(t,s,d)}}}catch(d){rt(t,t.return,d)}if(t===e){ae=null;break}var l=t.sibling;if(l!==null){l.return=t.return,ae=l;break}ae=t.return}}var CC=Math.ceil,bc=_r.ReactCurrentDispatcher,Fh=_r.ReactCurrentOwner,cn=_r.ReactCurrentBatchConfig,De=0,ft=null,dt=null,yt=0,Yt=0,Gi=Ca(0),gt=0,Qo=null,ai=0,lu=0,Oh=0,_o=null,Ot=null,Vh=0,As=1/0,hr=null,yc=!1,Hp=null,sa=null,od=!1,Qr=null,wc=0,To=0,Kp=null,Ld=-1,Bd=0;function Lt(){return De&6?ot():Ld!==-1?Ld:Ld=ot()}function oa(e){return e.mode&1?De&2&&yt!==0?yt&-yt:cC.transition!==null?(Bd===0&&(Bd=jw()),Bd):(e=qe,e!==0||(e=window.event,e=e===void 0?16:Tw(e.type)),e):1}function Dn(e,t,n,r){if(50<To)throw To=0,Kp=null,Error(O(185));_l(e,n,r),(!(De&2)||e!==ft)&&(e===ft&&(!(De&2)&&(lu|=n),gt===4&&Wr(e,yt)),Gt(e,r),n===1&&De===0&&!(t.mode&1)&&(As=ot()+500,au&&Sa()))}function Gt(e,t){var n=e.callbackNode;cP(e,t);var r=rc(e,e===ft?yt:0);if(r===0)n!==null&&_v(n),e.callbackNode=null,e.callbackPriority=0;else if(t=r&-r,e.callbackPriority!==t){if(n!=null&&_v(n),t===1)e.tag===0?dC(kb.bind(null,e)):Yw(kb.bind(null,e)),iC(function(){!(De&6)&&Sa()}),n=null;else{switch(Aw(r)){case 1:n=gh;break;case 4:n=kw;break;case 16:n=nc;break;case 536870912:n=xw;break;default:n=nc}n=Hk(n,Fk.bind(null,e))}e.callbackPriority=t,e.callbackNode=n}}function Fk(e,t){if(Ld=-1,Bd=0,De&6)throw Error(O(327));var n=e.callbackNode;if(es()&&e.callbackNode!==n)return null;var r=rc(e,e===ft?yt:0);if(r===0)return null;if(r&30||r&e.expiredLanes||t)t=kc(e,r);else{t=r;var a=De;De|=2;var i=Vk();(ft!==e||yt!==t)&&(hr=null,As=ot()+500,Za(e,t));do try{TC();break}catch(l){Ok(e,l)}while(!0);Ch(),bc.current=i,De=a,dt!==null?t=0:(ft=null,yt=0,t=gt)}if(t!==0){if(t===2&&(a=kp(e),a!==0&&(r=a,t=Yp(e,a))),t===1)throw n=Qo,Za(e,0),Wr(e,r),Gt(e,ot()),n;if(t===6)Wr(e,r);else{if(a=e.current.alternate,!(r&30)&&!SC(a)&&(t=kc(e,r),t===2&&(i=kp(e),i!==0&&(r=i,t=Yp(e,i))),t===1))throw n=Qo,Za(e,0),Wr(e,r),Gt(e,ot()),n;switch(e.finishedWork=a,e.finishedLanes=r,t){case 0:case 1:throw Error(O(345));case 2:Ba(e,Ot,hr);break;case 3:if(Wr(e,r),(r&130023424)===r&&(t=Vh+500-ot(),10<t)){if(rc(e,0)!==0)break;if(a=e.suspendedLanes,(a&r)!==r){Lt(),e.pingedLanes|=e.suspendedLanes&a;break}e.timeoutHandle=_p(Ba.bind(null,e,Ot,hr),t);break}Ba(e,Ot,hr);break;case 4:if(Wr(e,r),(r&4194240)===r)break;for(t=e.eventTimes,a=-1;0<r;){var s=31-Tn(r);i=1<<s,s=t[s],s>a&&(a=s),r&=~i}if(r=a,r=ot()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*CC(r/1960))-r,10<r){e.timeoutHandle=_p(Ba.bind(null,e,Ot,hr),r);break}Ba(e,Ot,hr);break;case 5:Ba(e,Ot,hr);break;default:throw Error(O(329))}}}return Gt(e,ot()),e.callbackNode===n?Fk.bind(null,e):null}function Yp(e,t){var n=_o;return e.current.memoizedState.isDehydrated&&(Za(e,t).flags|=256),e=kc(e,t),e!==2&&(t=Ot,Ot=n,t!==null&&Zp(t)),e}function Zp(e){Ot===null?Ot=e:Ot.push.apply(Ot,e)}function SC(e){for(var t=e;;){if(t.flags&16384){var n=t.updateQueue;if(n!==null&&(n=n.stores,n!==null))for(var r=0;r<n.length;r++){var a=n[r],i=a.getSnapshot;a=a.value;try{if(!zn(i(),a))return!1}catch{return!1}}}if(n=t.child,t.subtreeFlags&16384&&n!==null)n.return=t,t=n;else{if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}function Wr(e,t){for(t&=~Oh,t&=~lu,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-Tn(t),r=1<<n;e[n]=-1,t&=~r}}function kb(e){if(De&6)throw Error(O(327));es();var t=rc(e,0);if(!(t&1))return Gt(e,ot()),null;var n=kc(e,t);if(e.tag!==0&&n===2){var r=kp(e);r!==0&&(t=r,n=Yp(e,r))}if(n===1)throw n=Qo,Za(e,0),Wr(e,t),Gt(e,ot()),n;if(n===6)throw Error(O(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,Ba(e,Ot,hr),Gt(e,ot()),null}function Wh(e,t){var n=De;De|=1;try{return e(t)}finally{De=n,De===0&&(As=ot()+500,au&&Sa())}}function ii(e){Qr!==null&&Qr.tag===0&&!(De&6)&&es();var t=De;De|=1;var n=cn.transition,r=qe;try{if(cn.transition=null,qe=1,e)return e()}finally{qe=r,cn.transition=n,De=t,!(De&6)&&Sa()}}function Uh(){Yt=Gi.current,$e(Gi)}function Za(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(n!==-1&&(e.timeoutHandle=-1,aC(n)),dt!==null)for(n=dt.return;n!==null;){var r=n;switch(Ah(r),r.tag){case 1:r=r.type.childContextTypes,r!=null&&lc();break;case 3:xs(),$e(Ut),$e(_t),zh();break;case 5:Rh(r);break;case 4:xs();break;case 13:$e(Je);break;case 19:$e(Je);break;case 10:Sh(r.type._context);break;case 22:case 23:Uh()}n=n.return}if(ft=e,dt=e=la(e.current,null),yt=Yt=t,gt=0,Qo=null,Oh=lu=ai=0,Ot=_o=null,Wa!==null){for(t=0;t<Wa.length;t++)if(n=Wa[t],r=n.interleaved,r!==null){n.interleaved=null;var a=r.next,i=n.pending;if(i!==null){var s=i.next;i.next=a,r.next=s}n.pending=r}Wa=null}return e}function Ok(e,t){do{var n=dt;try{if(Ch(),Id.current=vc,fc){for(var r=Xe.memoizedState;r!==null;){var a=r.queue;a!==null&&(a.pending=null),r=r.next}fc=!1}if(ri=0,ht=pt=Xe=null,Co=!1,Yo=0,Fh.current=null,n===null||n.return===null){gt=1,Qo=t,dt=null;break}e:{var i=e,s=n.return,l=n,d=t;if(t=yt,l.flags|=32768,d!==null&&typeof d=="object"&&typeof d.then=="function"){var c=d,u=l,m=u.tag;if(!(u.mode&1)&&(m===0||m===11||m===15)){var p=u.alternate;p?(u.updateQueue=p.updateQueue,u.memoizedState=p.memoizedState,u.lanes=p.lanes):(u.updateQueue=null,u.memoizedState=null)}var h=lb(s);if(h!==null){h.flags&=-257,db(h,s,l,i,t),h.mode&1&&ob(i,c,t),t=h,d=c;var b=t.updateQueue;if(b===null){var f=new Set;f.add(d),t.updateQueue=f}else b.add(d);break e}else{if(!(t&1)){ob(i,c,t),$h();break e}d=Error(O(426))}}else if(Ke&&l.mode&1){var k=lb(s);if(k!==null){!(k.flags&65536)&&(k.flags|=256),db(k,s,l,i,t),Eh(js(d,l));break e}}i=d=js(d,l),gt!==4&&(gt=2),_o===null?_o=[i]:_o.push(i),i=s;do{switch(i.tag){case 3:i.flags|=65536,t&=-t,i.lanes|=t;var w=Ak(i,d,t);tb(i,w);break e;case 1:l=d;var v=i.type,y=i.stateNode;if(!(i.flags&128)&&(typeof v.getDerivedStateFromError=="function"||y!==null&&typeof y.componentDidCatch=="function"&&(sa===null||!sa.has(y)))){i.flags|=65536,t&=-t,i.lanes|=t;var x=Ek(i,l,t);tb(i,x);break e}}i=i.return}while(i!==null)}Uk(n)}catch(A){t=A,dt===n&&n!==null&&(dt=n=n.return);continue}break}while(!0)}function Vk(){var e=bc.current;return bc.current=vc,e===null?vc:e}function $h(){(gt===0||gt===3||gt===2)&&(gt=4),ft===null||!(ai&268435455)&&!(lu&268435455)||Wr(ft,yt)}function kc(e,t){var n=De;De|=2;var r=Vk();(ft!==e||yt!==t)&&(hr=null,Za(e,t));do try{_C();break}catch(a){Ok(e,a)}while(!0);if(Ch(),De=n,bc.current=r,dt!==null)throw Error(O(261));return ft=null,yt=0,gt}function _C(){for(;dt!==null;)Wk(dt)}function TC(){for(;dt!==null&&!tP();)Wk(dt)}function Wk(e){var t=Gk(e.alternate,e,Yt);e.memoizedProps=e.pendingProps,t===null?Uk(e):dt=t,Fh.current=null}function Uk(e){var t=e;do{var n=t.alternate;if(e=t.return,t.flags&32768){if(n=jC(n,t),n!==null){n.flags&=32767,dt=n;return}if(e!==null)e.flags|=32768,e.subtreeFlags=0,e.deletions=null;else{gt=6,dt=null;return}}else if(n=xC(n,t,Yt),n!==null){dt=n;return}if(t=t.sibling,t!==null){dt=t;return}dt=t=e}while(t!==null);gt===0&&(gt=5)}function Ba(e,t,n){var r=qe,a=cn.transition;try{cn.transition=null,qe=1,DC(e,t,n,r)}finally{cn.transition=a,qe=r}return null}function DC(e,t,n,r){do es();while(Qr!==null);if(De&6)throw Error(O(327));n=e.finishedWork;var a=e.finishedLanes;if(n===null)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(O(177));e.callbackNode=null,e.callbackPriority=0;var i=n.lanes|n.childLanes;if(uP(e,i),e===ft&&(dt=ft=null,yt=0),!(n.subtreeFlags&2064)&&!(n.flags&2064)||od||(od=!0,Hk(nc,function(){return es(),null})),i=(n.flags&15990)!==0,n.subtreeFlags&15990||i){i=cn.transition,cn.transition=null;var s=qe;qe=1;var l=De;De|=4,Fh.current=null,EC(e,n),Bk(n,e),JP(Cp),ac=!!Pp,Cp=Pp=null,e.current=n,PC(n),nP(),De=l,qe=s,cn.transition=i}else e.current=n;if(od&&(od=!1,Qr=e,wc=a),i=e.pendingLanes,i===0&&(sa=null),iP(n.stateNode),Gt(e,ot()),t!==null)for(r=e.onRecoverableError,n=0;n<t.length;n++)a=t[n],r(a.value,{componentStack:a.stack,digest:a.digest});if(yc)throw yc=!1,e=Hp,Hp=null,e;return wc&1&&e.tag!==0&&es(),i=e.pendingLanes,i&1?e===Kp?To++:(To=0,Kp=e):To=0,Sa(),null}function es(){if(Qr!==null){var e=Aw(wc),t=cn.transition,n=qe;try{if(cn.transition=null,qe=16>e?16:e,Qr===null)var r=!1;else{if(e=Qr,Qr=null,wc=0,De&6)throw Error(O(331));var a=De;for(De|=4,ae=e.current;ae!==null;){var i=ae,s=i.child;if(ae.flags&16){var l=i.deletions;if(l!==null){for(var d=0;d<l.length;d++){var c=l[d];for(ae=c;ae!==null;){var u=ae;switch(u.tag){case 0:case 11:case 15:So(8,u,i)}var m=u.child;if(m!==null)m.return=u,ae=m;else for(;ae!==null;){u=ae;var p=u.sibling,h=u.return;if(qk(u),u===c){ae=null;break}if(p!==null){p.return=h,ae=p;break}ae=h}}}var b=i.alternate;if(b!==null){var f=b.child;if(f!==null){b.child=null;do{var k=f.sibling;f.sibling=null,f=k}while(f!==null)}}ae=i}}if(i.subtreeFlags&2064&&s!==null)s.return=i,ae=s;else e:for(;ae!==null;){if(i=ae,i.flags&2048)switch(i.tag){case 0:case 11:case 15:So(9,i,i.return)}var w=i.sibling;if(w!==null){w.return=i.return,ae=w;break e}ae=i.return}}var v=e.current;for(ae=v;ae!==null;){s=ae;var y=s.child;if(s.subtreeFlags&2064&&y!==null)y.return=s,ae=y;else e:for(s=v;ae!==null;){if(l=ae,l.flags&2048)try{switch(l.tag){case 0:case 11:case 15:ou(9,l)}}catch(A){rt(l,l.return,A)}if(l===s){ae=null;break e}var x=l.sibling;if(x!==null){x.return=l.return,ae=x;break e}ae=l.return}}if(De=a,Sa(),er&&typeof er.onPostCommitFiberRoot=="function")try{er.onPostCommitFiberRoot(Xc,e)}catch{}r=!0}return r}finally{qe=n,cn.transition=t}}return!1}function xb(e,t,n){t=js(n,t),t=Ak(e,t,1),e=ia(e,t,1),t=Lt(),e!==null&&(_l(e,1,t),Gt(e,t))}function rt(e,t,n){if(e.tag===3)xb(e,e,n);else for(;t!==null;){if(t.tag===3){xb(t,e,n);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof r.componentDidCatch=="function"&&(sa===null||!sa.has(r))){e=js(n,e),e=Ek(t,e,1),t=ia(t,e,1),e=Lt(),t!==null&&(_l(t,1,e),Gt(t,e));break}}t=t.return}}function RC(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),t=Lt(),e.pingedLanes|=e.suspendedLanes&n,ft===e&&(yt&n)===n&&(gt===4||gt===3&&(yt&130023424)===yt&&500>ot()-Vh?Za(e,0):Oh|=n),Gt(e,t)}function $k(e,t){t===0&&(e.mode&1?(t=Jl,Jl<<=1,!(Jl&130023424)&&(Jl=4194304)):t=1);var n=Lt();e=jr(e,t),e!==null&&(_l(e,t,n),Gt(e,n))}function zC(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),$k(e,n)}function IC(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(O(314))}r!==null&&r.delete(t),$k(e,n)}var Gk;Gk=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||Ut.current)Wt=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return Wt=!1,kC(e,t,n);Wt=!!(e.flags&131072)}else Wt=!1,Ke&&t.flags&1048576&&Zw(t,uc,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;Nd(e,t),e=t.pendingProps;var a=ys(t,_t.current);Xi(t,n),a=qh(null,t,r,e,a,n);var i=Nh();return t.flags|=1,typeof a=="object"&&a!==null&&typeof a.render=="function"&&a.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,$t(r)?(i=!0,dc(t)):i=!1,t.memoizedState=a.state!==null&&a.state!==void 0?a.state:null,Th(t),a.updater=su,t.stateNode=a,a._reactInternals=t,Np(t,r,e,n),t=Mp(null,t,r,!0,i,n)):(t.tag=0,Ke&&i&&jh(t),qt(null,t,a,n),t=t.child),t;case 16:r=t.elementType;e:{switch(Nd(e,t),e=t.pendingProps,a=r._init,r=a(r._payload),t.type=r,a=t.tag=NC(r),e=wn(r,e),a){case 0:t=Bp(null,t,r,e,n);break e;case 1:t=mb(null,t,r,e,n);break e;case 11:t=cb(null,t,r,e,n);break e;case 14:t=ub(null,t,r,wn(r.type,e),n);break e}throw Error(O(306,r,""))}return t;case 0:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:wn(r,a),Bp(e,t,r,a,n);case 1:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:wn(r,a),mb(e,t,r,a,n);case 3:e:{if(_k(t),e===null)throw Error(O(387));
vendor: 4,107 bytes, line 41
41r=t.pendingProps,i=t.memoizedState,a=i.element,nk(e,t),gc(t,r,null,n);var s=t.memoizedState;if(r=s.element,i.isDehydrated)if(i={element:r,isDehydrated:!1,cache:s.cache,pendingSuspenseBoundaries:s.pendingSuspenseBoundaries,transitions:s.transitions},t.updateQueue.baseState=i,t.memoizedState=i,t.flags&256){a=js(Error(O(423)),t),t=pb(e,t,r,n,a);break e}else if(r!==a){a=js(Error(O(424)),t),t=pb(e,t,r,n,a);break e}else for(Jt=aa(t.stateNode.containerInfo.firstChild),Qt=t,Ke=!0,En=null,n=ek(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(ws(),r===a){t=Ar(e,t,n);break e}qt(e,t,r,n)}t=t.child}return t;case 5:return rk(t),e===null&&zp(t),r=t.type,a=t.pendingProps,i=e!==null?e.memoizedProps:null,s=a.children,Sp(r,a)?s=null:i!==null&&Sp(r,i)&&(t.flags|=32),Sk(e,t),qt(e,t,s,n),t.child;case 6:return e===null&&zp(t),null;case 13:return Tk(e,t,n);case 4:return Dh(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=ks(t,null,r,n):qt(e,t,r,n),t.child;case 11:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:wn(r,a),cb(e,t,r,a,n);case 7:return qt(e,t,t.pendingProps,n),t.child;case 8:return qt(e,t,t.pendingProps.children,n),t.child;case 12:return qt(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,a=t.pendingProps,i=t.memoizedProps,s=a.value,Fe(mc,r._currentValue),r._currentValue=s,i!==null)if(zn(i.value,s)){if(i.children===a.children&&!Ut.current){t=Ar(e,t,n);break e}}else for(i=t.child,i!==null&&(i.return=t);i!==null;){var l=i.dependencies;if(l!==null){s=i.child;for(var d=l.firstContext;d!==null;){if(d.context===r){if(i.tag===1){d=wr(-1,n&-n),d.tag=2;var c=i.updateQueue;if(c!==null){c=c.shared;var u=c.pending;u===null?d.next=d:(d.next=u.next,u.next=d),c.pending=d}}i.lanes|=n,d=i.alternate,d!==null&&(d.lanes|=n),Ip(i.return,n,t),l.lanes|=n;break}d=d.next}}else if(i.tag===10)s=i.type===t.type?null:i.child;else if(i.tag===18){if(s=i.return,s===null)throw Error(O(341));s.lanes|=n,l=s.alternate,l!==null&&(l.lanes|=n),Ip(s,n,t),s=i.sibling}else s=i.child;if(s!==null)s.return=i;else for(s=i;s!==null;){if(s===t){s=null;break}if(i=s.sibling,i!==null){i.return=s.return,s=i;break}s=s.return}i=s}qt(e,t,a.children,n),t=t.child}return t;case 9:return a=t.type,r=t.pendingProps.children,Xi(t,n),a=mn(a),r=r(a),t.flags|=1,qt(e,t,r,n),t.child;case 14:return r=t.type,a=wn(r,t.pendingProps),a=wn(r.type,a),ub(e,t,r,a,n);case 15:return Pk(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:wn(r,a),Nd(e,t),t.tag=1,$t(r)?(e=!0,dc(t)):e=!1,Xi(t,n),jk(t,r,a),Np(t,r,a,n),Mp(null,t,r,!0,e,n);case 19:return Dk(e,t,n);case 22:return Ck(e,t,n)}throw Error(O(156,t.tag))};function Hk(e,t){return ww(e,t)}function qC(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function dn(e,t,n,r){return new qC(e,t,n,r)}function Gh(e){return e=e.prototype,!(!e||!e.isReactComponent)}function NC(e){if(typeof e=="function")return Gh(e)?1:0;if(e!=null){if(e=e.$$typeof,e===uh)return 11;if(e===mh)return 14}return 2}function la(e,t){var n=e.alternate;return n===null?(n=dn(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Md(e,t,n,r,a,i){var s=2;if(r=e,typeof e=="function")Gh(e)&&(s=1);else if(typeof e=="string")s=5;else e:switch(e){case Ni:return Ja(n.children,a,i,t);case ch:s=8,a|=8;break;case sp:return e=dn(12,n,t,a|2),e.elementType=sp,e.lanes=i,e;
vendor: 6,258 bytes, line 41
41case op:return e=dn(13,n,t,a),e.elementType=op,e.lanes=i,e;case lp:return e=dn(19,n,t,a),e.elementType=lp,e.lanes=i,e;case rw:return du(n,a,i,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case tw:s=10;break e;case nw:s=9;break e;case uh:s=11;break e;case mh:s=14;break e;case Fr:s=16,r=null;break e}throw Error(O(130,e==null?e:typeof e,""))}return t=dn(s,n,t,a),t.elementType=e,t.type=r,t.lanes=i,t}function Ja(e,t,n,r){return e=dn(7,e,r,t),e.lanes=n,e}function du(e,t,n,r){return e=dn(22,e,r,t),e.elementType=rw,e.lanes=n,e.stateNode={isHidden:!1},e}function bm(e,t,n){return e=dn(6,e,null,t),e.lanes=n,e}function ym(e,t,n){return t=dn(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function LC(e,t,n,r,a){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Xu(0),this.expirationTimes=Xu(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Xu(0),this.identifierPrefix=r,this.onRecoverableError=a,this.mutableSourceEagerHydrationData=null}function Hh(e,t,n,r,a,i,s,l,d){return e=new LC(e,t,n,l,d),t===1?(t=1,i===!0&&(t|=8)):t=0,i=dn(3,null,null,t),e.current=i,i.stateNode=e,i.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Th(i),e}function BC(e,t,n){var r=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:qi,key:r==null?null:""+r,children:e,containerInfo:t,implementation:n}}function Kk(e){if(!e)return ga;e=e._reactInternals;e:{if(pi(e)!==e||e.tag!==1)throw Error(O(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if($t(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(t!==null);throw Error(O(171))}if(e.tag===1){var n=e.type;if($t(n))return Kw(e,n,t)}return t}function Yk(e,t,n,r,a,i,s,l,d){return e=Hh(n,r,!0,e,a,i,s,l,d),e.context=Kk(null),n=e.current,r=Lt(),a=oa(n),i=wr(r,a),i.callback=t??null,ia(n,i,a),e.current.lanes=a,_l(e,a,r),Gt(e,r),e}function cu(e,t,n,r){var a=t.current,i=Lt(),s=oa(a);return n=Kk(n),t.context===null?t.context=n:t.pendingContext=n,t=wr(i,s),t.payload={element:e},r=r===void 0?null:r,r!==null&&(t.callback=r),e=ia(a,t,s),e!==null&&(Dn(e,a,s,i),zd(e,a,s)),s}function xc(e){if(e=e.current,!e.child)return null;switch(e.child.tag){case 5:return e.child.stateNode;default:return e.child.stateNode}}function jb(e,t){if(e=e.memoizedState,e!==null&&e.dehydrated!==null){var n=e.retryLane;e.retryLane=n!==0&&n<t?n:t}}function Kh(e,t){jb(e,t),(e=e.alternate)&&jb(e,t)}function MC(){return null}var Zk=typeof reportError=="function"?reportError:function(e){console.error(e)};function Yh(e){this._internalRoot=e}uu.prototype.render=Yh.prototype.render=function(e){var t=this._internalRoot;if(t===null)throw Error(O(409));cu(e,t,null,null)};uu.prototype.unmount=Yh.prototype.unmount=function(){var e=this._internalRoot;if(e!==null){this._internalRoot=null;var t=e.containerInfo;ii(function(){cu(null,e,null,null)}),t[xr]=null}};function uu(e){this._internalRoot=e}uu.prototype.unstable_scheduleHydration=function(e){if(e){var t=Cw();e={blockedOn:null,target:e,priority:t};for(var n=0;n<Vr.length&&t!==0&&t<Vr[n].priority;n++);Vr.splice(n,0,e),n===0&&_w(e)}};function Zh(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function mu(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11&&(e.nodeType!==8||e.nodeValue!==" react-mount-point-unstable "))}function Ab(){}function FC(e,t,n,r,a){if(a){if(typeof r=="function"){var i=r;r=function(){var c=xc(s);i.call(c)}}var s=Yk(t,r,e,0,null,!1,!1,"",Ab);return e._reactRootContainer=s,e[xr]=s.current,Uo(e.nodeType===8?e.parentNode:e),ii(),s}for(;a=e.lastChild;)e.removeChild(a);if(typeof r=="function"){var l=r;r=function(){var c=xc(d);l.call(c)}}var d=Hh(e,0,!1,null,null,!1,!1,"",Ab);return e._reactRootContainer=d,e[xr]=d.current,Uo(e.nodeType===8?e.parentNode:e),ii(function(){cu(t,d,n,r)}),d}function pu(e,t,n,r,a){var i=n._reactRootContainer;if(i){var s=i;if(typeof a=="function"){var l=a;a=function(){var d=xc(s);l.call(d)}}cu(t,s,e,a)}else s=FC(n,t,e,a,r);return xc(s)}Ew=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var n=ho(t.pendingLanes);n!==0&&(hh(t,n|1),Gt(t,ot()),!(De&6)&&(As=ot()+500,Sa()))}break;case 13:ii(function(){var r=jr(e,1);if(r!==null){var a=Lt();Dn(r,e,1,a)}}),Kh(e,1)}};fh=function(e){if(e.tag===13){var t=jr(e,134217728);if(t!==null){var n=Lt();Dn(t,e,134217728,n)}Kh(e,134217728)}};Pw=function(e){if(e.tag===13){var t=oa(e),n=jr(e,t);if(n!==null){var r=Lt();Dn(n,e,t,r)}Kh(e,t)}};Cw=function(){return qe};Sw=function(e,t){var n=qe;try{return qe=e,t()}finally{qe=n}};bp=function(e,t,n){switch(t){case"input":if(up(e,n),t=n.name,n.type==="radio"&&t!=null){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<n.length;t++){var r=n[t];if(r!==e&&r.form===e.form){var a=ru(r);if(!a)throw Error(O(90));iw(r),up(r,a)}}}break;case"textarea":ow(e,n);break;case"select":t=n.value,t!=null&&Yi(e,!!n.multiple,t,!1)}};gw=Wh;hw=ii;var OC={usingClientEntryPoint:!1,Events:[Dl,Fi,ru,mw,pw,Wh]},so={findFiberByHostInstance:Va,bundleType:0,version:"18.3.1",rendererPackageName:"react-dom"},VC={bundleType:so.bundleType,version:so.version,rendererPackageName:so.rendererPackageName,rendererConfig:so.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:_r.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return e=bw(e),e===null?null:e.stateNode},findFiberByHostInstance:so.findFiberByHostInstance||MC,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.3.1-next-f1338f8080-20240426"};
41if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"){var ld=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!ld.isDisabled&&ld.supportsFiber)try{Xc=ld.inject(VC),er=ld}catch{}}nn.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=OC;nn.createPortal=function(e,t){var n=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!Zh(t))throw Error(O(200));return BC(e,t,null,n)};nn.createRoot=function(e,t){if(!Zh(e))throw Error(O(299));var n=!1,r="",a=Zk;return t!=null&&(t.unstable_strictMode===!0&&(n=!0),t.identifierPrefix!==void 0&&(r=t.identifierPrefix),t.onRecoverableError!==void 0&&(a=t.onRecoverableError)),t=Hh(e,1,!1,null,null,n,!1,r,a),e[xr]=t.current,Uo(e.nodeType===8?e.parentNode:e),new Yh(t)};nn.findDOMNode=function(e){if(e==null)return null;if(e.nodeType===1)return e;var t=e._reactInternals;if(t===void 0)throw typeof e.render=="function"?Error(O(188)):(e=Object.keys(e).join(","),Error(O(268,e)));return e=bw(t),e=e===null?null:e.stateNode,e};nn.flushSync=function(e){return ii(e)};nn.hydrate=function(e,t,n){if(!mu(t))throw Error(O(200));return pu(null,e,t,!0,n)};nn.hydrateRoot=function(e,t,n){if(!Zh(e))throw Error(O(405));var r=n!=null&&n.hydratedSources||null,a=!1,i="",s=Zk;if(n!=null&&(n.unstable_strictMode===!0&&(a=!0),n.identifierPrefix!==void 0&&(i=n.identifierPrefix),n.onRecoverableError!==void 0&&(s=n.onRecoverableError)),t=Yk(t,null,e,1,n??null,a,!1,i,s),e[xr]=t.current,Uo(e),r)for(e=0;e<r.length;e++)n=r[e],a=n._getVersion,a=a(n._source),t.mutableSourceEagerHydrationData==null?t.mutableSourceEagerHydrationData=[n,a]:t.mutableSourceEagerHydrationData.push(n,a);return new uu(t)};nn.render=function(e,t,n){if(!mu(t))throw Error(O(200));return pu(null,e,t,!1,n)};nn.unmountComponentAtNode=function(e){if(!mu(e))throw Error(O(40));return e._reactRootContainer?(ii(function(){pu(null,null,e,!1,function(){e._reactRootContainer=null,e[xr]=null})}),!0):!1};nn.unstable_batchedUpdates=Wh;nn.unstable_renderSubtreeIntoContainer=function(e,t,n,r){if(!mu(n))throw Error(O(200));if(e==null||e._reactInternals===void 0)throw Error(O(38));return pu(e,t,n,!1,r)};nn.version="18.3.1-next-f1338f8080-20240426";function Jk(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(Jk)}catch(e){console.error(e)}}Jk(),J0.exports=nn;var gi=J0.exports;const Qk=Cl(gi);var Eb=gi;ap.createRoot=Eb.createRoot,ap.hydrateRoot=Eb.hydrateRoot;var WC=typeof Element<"u",UC=typeof Map=="function",$C=typeof Set=="function",GC=typeof ArrayBuffer=="function"&&!!ArrayBuffer.isView;function Fd(e,t){if(e===t)return!0;if(e&&t&&typeof e=="object"&&typeof t=="object"){if(e.constructor!==t.constructor)return!1;var n,r,a;if(Array.isArray(e)){if(n=e.length,n!=t.length)return!1;for(r=n;r--!==0;)if(!Fd(e[r],t[r]))return!1;return!0}var i;if(UC&&e instanceof Map&&t instanceof Map){if(e.size!==t.size)return!1;for(i=e.entries();!(r=i.next()).done;)if(!t.has(r.value[0]))return!1;for(i=e.entries();!(r=i.next()).done;)if(!Fd(r.value[1],t.get(r.value[0])))return!1;return!0}if($C&&e instanceof Set&&t instanceof Set){if(e.size!==t.size)return!1;for(i=e.entries();!(r=i.next()).done;)if(!t.has(r.value[0]))return!1;return!0}if(GC&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(t)){if(n=e.length,n!=t.length)return!1;for(r=n;r--!==0;)if(e[r]!==t[r])return!1;return!0}if(e.constructor===RegExp)return e.source===t.source&&e.flags===t.flags;if(e.valueOf!==Object.prototype.valueOf&&typeof e.valueOf=="function"&&typeof t.valueOf=="function")return e.valueOf()===t.valueOf();if(e.toString!==Object.prototype.toString&&typeof e.toString=="function"&&typeof t.toString=="function")return e.toString()===t.toString();if(a=Object.keys(e),n=a.length,n!==Object.keys(t).length)return!1;for(r=n;r--!==0;)if(!Object.prototype.hasOwnProperty.call(t,a[r]))return!1;if(WC&&e instanceof Element)return!1;for(r=n;r--!==0;)if(!((a[r]==="_owner"||a[r]==="__v"||a[r]==="__o")&&e.$$typeof)&&!Fd(e[a[r]],t[a[r]]))return!1;return!0}return e!==e&&t!==t}var HC=function(t,n){try{return Fd(t,n)}catch(r){if((r.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw r}};const KC=Cl(HC);var YC=function(e,t,n,r,a,i,s,l){if(!e){var d;if(t===void 0)d=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,a,i,s,l],u=0;d=new Error(t.replace(/%s/g,function(){return c[u++]})),d.name="Invariant Violation"}throw d.framesToPop=1,d}},ZC=YC;const Pb=Cl(ZC);var JC=function(t,n,r,a){var i=r?r.call(a,t,n):void 0;if(i!==void 0)return!!i;if(t===n)return!0;
41if(typeof t!="object"||!t||typeof n!="object"||!n)return!1;var s=Object.keys(t),l=Object.keys(n);if(s.length!==l.length)return!1;for(var d=Object.prototype.hasOwnProperty.bind(n),c=0;c<s.length;c++){var u=s[c];if(!d(u))return!1;var m=t[u],p=n[u];if(i=r?r.call(a,m,p,u):void 0,i===!1||i===void 0&&m!==p)return!1}return!0};const QC=Cl(JC);var Xk=(e=>(e.BASE="base",e.BODY="body",e.HEAD="head",e.HTML="html",e.LINK="link",e.META="meta",e.NOSCRIPT="noscript",e.SCRIPT="script",e.STYLE="style",e.TITLE="title",e.FRAGMENT="Symbol(react.fragment)",e))(Xk||{}),wm={link:{rel:["amphtml","canonical","alternate"]},script:{type:["application/ld+json"]},meta:{charset:"",name:["generator","robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]}},Cb=Object.values(Xk),gu={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},ex=Object.entries(gu).reduce((e,[t,n])=>(e[n]=t,e),{}),Sn="data-rh",ts={DEFAULT_TITLE:"defaultTitle",DEFER:"defer",ENCODE_SPECIAL_CHARACTERS:"encodeSpecialCharacters",ON_CHANGE_CLIENT_STATE:"onChangeClientState",TITLE_TEMPLATE:"titleTemplate",PRIORITIZE_SEO_TAGS:"prioritizeSeoTags"},ns=(e,t)=>{for(let n=e.length-1;n>=0;n-=1){const r=e[n];if(Object.prototype.hasOwnProperty.call(r,t))return r[t]}return null},XC=e=>{let t=ns(e,"title");const n=ns(e,ts.TITLE_TEMPLATE);if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,()=>t);const r=ns(e,ts.DEFAULT_TITLE);return t||r||void 0},eS=e=>ns(e,ts.ON_CHANGE_CLIENT_STATE)||(()=>{}),km=(e,t)=>t.filter(n=>typeof n[e]<"u").map(n=>n[e]).reduce((n,r)=>({...n,...r}),{}),tS=(e,t)=>t.filter(n=>typeof n.base<"u").map(n=>n.base).reverse().reduce((n,r)=>{if(!n.length){const a=Object.keys(r);for(let i=0;i<a.length;i+=1){const l=a[i].toLowerCase();if(e.indexOf(l)!==-1&&r[l])return n.concat(r)}}return n},[]),nS=e=>console&&typeof console.warn=="function"&&console.warn(e),oo=(e,t,n)=>{const r={};return n.filter(a=>Array.isArray(a[e])?!0:(typeof a[e]<"u"&&nS(`Helmet: ${e} should be of type "Array". Instead found type "${typeof a[e]}"`),!1)).map(a=>a[e]).reverse().reduce((a,i)=>{const s={};i.filter(d=>{let c;const u=Object.keys(d);for(let p=0;p<u.length;p+=1){const h=u[p],b=h.toLowerCase();t.indexOf(b)!==-1&&!(c==="rel"&&d[c].toLowerCase()==="canonical")&&!(b==="rel"&&d[b].toLowerCase()==="stylesheet")&&(c=b),t.indexOf(h)!==-1&&(h==="innerHTML"||h==="cssText"||h==="itemprop")&&(c=h)}if(!c||!d[c])return!1;const m=d[c].toLowerCase();return r[c]||(r[c]={}),s[c]||(s[c]={}),r[c][m]?!1:(s[c][m]=!0,!0)}).reverse().forEach(d=>a.push(d));const l=Object.keys(s);for(let d=0;d<l.length;d+=1){const c=l[d],u={...r[c],...s[c]};r[c]=u}return a},[]).reverse()},rS=(e,t)=>{if(Array.isArray(e)&&e.length){for(let n=0;n<e.length;n+=1)if(e[n][t])return!0}return!1},aS=e=>({baseTag:tS(["href"],e),bodyAttributes:km("bodyAttributes",e),defer:ns(e,ts.DEFER),encode:ns(e,ts.ENCODE_SPECIAL_CHARACTERS),htmlAttributes:km("htmlAttributes",e),linkTags:oo("link",["rel","href"],e),metaTags:oo("meta",["name","charset","http-equiv","property","itemprop"],e),noscriptTags:oo("noscript",["innerHTML"],e),onChangeClientState:eS(e),scriptTags:oo("script",["src","innerHTML"],e),styleTags:oo("style",["cssText"],e),title:XC(e),titleAttributes:km("titleAttributes",e),prioritizeSeoTags:rS(e,ts.PRIORITIZE_SEO_TAGS)}),tx=e=>Array.isArray(e)?e.join(""):e,iS=(e,t)=>{const n=Object.keys(e);for(let r=0;r<n.length;r+=1)if(t[n[r]]&&t[n[r]].includes(e[n[r]]))return!0;return!1},xm=(e,t)=>Array.isArray(e)?e.reduce((n,r)=>(iS(r,t)?n.priority.push(r):n.default.push(r),n),{priority:[],default:[]}):{default:e,priority:[]},Sb=(e,t)=>({...e,[t]:void 0}),sS=["noscript","script","style"],Jp=(e,t=!0)=>t===!1?String(e):String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'"),nx=e=>Object.keys(e).reduce((t,n)=>{const r=typeof e[n]<"u"?`${n}="${e[n]}"`:`${n}`;return t?`${t} ${r}`:r},""),oS=(e,t,n,r)=>{const a=nx(n),i=tx(t);return a?`<${e} ${Sn}="true" ${a}>${Jp(i,r)}</${e}>`:`<${e} ${Sn}="true">${Jp(i,r)}</${e}>`},lS=(e,t,n=!0)=>t.reduce((r,a)=>{const i=a,s=Object.keys(i).filter(c=>!(c==="innerHTML"||c==="cssText")).reduce((c,u)=>{const m=typeof i[u]>"u"?u:`${u}="${Jp(i[u],n)}"`;return c?`${c} ${m}`:m},""),l=i.innerHTML||i.cssText||"",d=sS.indexOf(e)===-1;return`${r}<${e} ${Sn}="true" ${s}${d?"/>":`>${l}</${e}>`}`},""),rx=(e,t={})=>Object.keys(e).reduce((n,r)=>{const a=gu[r];return n[a||r]=e[r],n},t),dS=(e,t,n)=>{const r={key:t,[Sn]:!0},a=rx(n,r);return[I.createElement("title",a,t)]},Od=(e,t)=>t.map((n,r)=>{const a={key:r,[Sn]:!0};
41return Object.keys(n).forEach(i=>{const l=gu[i]||i;if(l==="innerHTML"||l==="cssText"){const d=n.innerHTML||n.cssText;a.dangerouslySetInnerHTML={__html:d}}else a[l]=n[i]}),I.createElement(e,a)}),an=(e,t,n=!0)=>{switch(e){case"title":return{toComponent:()=>dS(e,t.title,t.titleAttributes),toString:()=>oS(e,t.title,t.titleAttributes,n)};case"bodyAttributes":case"htmlAttributes":return{toComponent:()=>rx(t),toString:()=>nx(t)};default:return{toComponent:()=>Od(e,t),toString:()=>lS(e,t,n)}}},cS=({metaTags:e,linkTags:t,scriptTags:n,encode:r})=>{const a=xm(e,wm.meta),i=xm(t,wm.link),s=xm(n,wm.script);return{priorityMethods:{toComponent:()=>[...Od("meta",a.priority),...Od("link",i.priority),...Od("script",s.priority)],toString:()=>`${an("meta",a.priority,r)} ${an("link",i.priority,r)} ${an("script",s.priority,r)}`},metaTags:a.default,linkTags:i.default,scriptTags:s.default}},uS=e=>{const{baseTag:t,bodyAttributes:n,encode:r=!0,htmlAttributes:a,noscriptTags:i,styleTags:s,title:l="",titleAttributes:d,prioritizeSeoTags:c}=e;let{linkTags:u,metaTags:m,scriptTags:p}=e,h={toComponent:()=>[],toString:()=>""};return c&&({priorityMethods:h,linkTags:u,metaTags:m,scriptTags:p}=cS(e)),{priority:h,base:an("base",t,r),bodyAttributes:an("bodyAttributes",n,r),htmlAttributes:an("htmlAttributes",a,r),link:an("link",u,r),meta:an("meta",m,r),noscript:an("noscript",i,r),script:an("script",p,r),style:an("style",s,r),title:an("title",{title:l,titleAttributes:d},r)}},Qp=uS,dd=[],Jh=!!(typeof window<"u"&&window.document&&window.document.createElement),Xp=class{constructor(e,t){fn(this,"instances",[]);fn(this,"canUseDOM",Jh);fn(this,"context");fn(this,"value",{setHelmet:e=>{this.context.helmet=e},helmetInstances:{get:()=>this.canUseDOM?dd:this.instances,add:e=>{(this.canUseDOM?dd:this.instances).push(e)},remove:e=>{const t=(this.canUseDOM?dd:this.instances).indexOf(e);(this.canUseDOM?dd:this.instances).splice(t,1)}}});this.context=e,this.canUseDOM=t||!1,t||(e.helmet=Qp({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))}},mS=parseInt(I.version.split(".")[0],10),eg=mS>=19,pS={},ax=I.createContext(pS),$a,ix=($a=class extends g.Component{constructor(n){super(n);fn(this,"helmetData");eg?this.helmetData=null:this.helmetData=new Xp(this.props.context||{},$a.canUseDOM)}render(){return eg?I.createElement(I.Fragment,null,this.props.children):I.createElement(ax.Provider,{value:this.helmetData.value},this.props.children)}},fn($a,"canUseDOM",Jh),$a),ki=(e,t)=>{const n=document.head||document.querySelector("head"),r=n.querySelectorAll(`${e}[${Sn}]`),a=[].slice.call(r),i=[];let s;return t&&t.length&&t.forEach(l=>{const d=document.createElement(e);for(const c in l)if(Object.prototype.hasOwnProperty.call(l,c))if(c==="innerHTML")d.innerHTML=l.innerHTML;else if(c==="cssText"){const u=l.cssText;d.appendChild(document.createTextNode(u))}else{const u=c,m=typeof l[u]>"u"?"":l[u];d.setAttribute(c,m)}d.setAttribute(Sn,"true"),a.some((c,u)=>(s=u,d.isEqualNode(c)))?a.splice(s,1):i.push(d)}),a.forEach(l=>{var d;return(d=l.parentNode)==null?void 0:d.removeChild(l)}),i.forEach(l=>n.appendChild(l)),{oldTags:a,newTags:i}},tg=(e,t)=>{const n=document.getElementsByTagName(e)[0];if(!n)return;const r=n.getAttribute(Sn),a=r?r.split(","):[],i=[...a],s=Object.keys(t);for(const l of s){const d=t[l]||"";n.getAttribute(l)!==d&&n.setAttribute(l,d),a.indexOf(l)===-1&&a.push(l);const c=i.indexOf(l);c!==-1&&i.splice(c,1)}for(let l=i.length-1;l>=0;l-=1)n.removeAttribute(i[l]);a.length===i.length?n.removeAttribute(Sn):n.getAttribute(Sn)!==s.join(",")&&n.setAttribute(Sn,s.join(","))},gS=(e,t)=>{typeof e<"u"&&document.title!==e&&(document.title=tx(e)),tg("title",t)},_b=(e,t)=>{const{baseTag:n,bodyAttributes:r,htmlAttributes:a,linkTags:i,metaTags:s,noscriptTags:l,onChangeClientState:d,scriptTags:c,styleTags:u,title:m,titleAttributes:p}=e;tg("body",r),tg("html",a),gS(m,p);const h={baseTag:ki("base",n),linkTags:ki("link",i),metaTags:ki("meta",s),noscriptTags:ki("noscript",l),scriptTags:ki("script",c),styleTags:ki("style",u)},b={},f={};
41Object.keys(h).forEach(k=>{const{newTags:w,oldTags:v}=h[k];w.length&&(b[k]=w),v.length&&(f[k]=h[k].oldTags)}),t&&t(),d(e,b,f)},lo=null,hS=e=>{lo&&cancelAnimationFrame(lo),e.defer?lo=requestAnimationFrame(()=>{_b(e,()=>{lo=null})}):(_b(e),lo=null)},fS=hS,Tb=class extends g.Component{constructor(){super(...arguments);fn(this,"rendered",!1)}shouldComponentUpdate(t){return!QC(t,this.props)}componentDidUpdate(){this.emitChange()}componentWillUnmount(){const{helmetInstances:t}=this.props.context;t.remove(this),this.emitChange()}emitChange(){const{helmetInstances:t,setHelmet:n}=this.props.context;let r=null;const a=aS(t.get().map(i=>{const{context:s,...l}=i.props;return l}));ix.canUseDOM?fS(a):Qp&&(r=Qp(a)),n(r)}init(){if(this.rendered)return;this.rendered=!0;const{helmetInstances:t}=this.props.context;t.add(this),this.emitChange()}render(){return this.init(),null}},Vd=[],Db=e=>{const t={};for(const n of Object.keys(e))t[ex[n]||n]=e[n];return t},Ia=e=>{const t={};for(const n of Object.keys(e)){const r=gu[n];t[r||n]=e[n]}return t},Rb=(e,t)=>{if(!Jh)return;const n=document.getElementsByTagName(e)[0];if(!n)return;const r="data-rh-managed",a=n.getAttribute(r),i=a?a.split(","):[],s=Object.keys(t);for(const l of i)s.includes(l)||n.removeAttribute(l);for(const l of s){const d=t[l];d==null||d===!1?n.removeAttribute(l):d===!0?n.setAttribute(l,""):n.setAttribute(l,String(d))}s.length>0?n.setAttribute(r,s.join(",")):n.removeAttribute(r)},jm=()=>{const e={},t={};for(const n of Vd){const{htmlAttributes:r,bodyAttributes:a}=n.props;r&&Object.assign(e,Db(r)),a&&Object.assign(t,Db(a))}Rb("html",e),Rb("body",t)},vS=class extends g.Component{componentDidMount(){Vd.push(this),jm()}componentDidUpdate(){jm()}componentWillUnmount(){const e=Vd.indexOf(this);e!==-1&&Vd.splice(e,1),jm()}resolveTitle(){const{title:e,titleTemplate:t,defaultTitle:n}=this.props;return e&&t?t.replace(/%s/g,()=>Array.isArray(e)?e.join(""):e):e||n||void 0}renderTitle(){const e=this.resolveTitle();if(e===void 0)return null;const t=this.props.titleAttributes||{};return I.createElement("title",Ia(t),e)}renderBase(){const{base:e}=this.props;return e?I.createElement("base",Ia(e)):null}renderMeta(){const{meta:e}=this.props;return!e||!Array.isArray(e)?null:e.map((t,n)=>I.createElement("meta",{key:n,...Ia(t)}))}renderLink(){const{link:e}=this.props;return!e||!Array.isArray(e)?null:e.map((t,n)=>I.createElement("link",{key:n,...Ia(t)}))}renderScript(){const{script:e}=this.props;return!e||!Array.isArray(e)?null:e.map((t,n)=>{const{innerHTML:r,...a}=t,i=Ia(a);return r&&(i.dangerouslySetInnerHTML={__html:r}),I.createElement("script",{key:n,...i})})}renderStyle(){const{style:e}=this.props;return!e||!Array.isArray(e)?null:e.map((t,n)=>{const{cssText:r,...a}=t,i=Ia(a);return r&&(i.dangerouslySetInnerHTML={__html:r}),I.createElement("style",{key:n,...i})})}renderNoscript(){const{noscript:e}=this.props;return!e||!Array.isArray(e)?null:e.map((t,n)=>{const{innerHTML:r,...a}=t,i=Ia(a);return r&&(i.dangerouslySetInnerHTML={__html:r}),I.createElement("noscript",{key:n,...i})})}render(){return I.createElement(I.Fragment,null,this.renderTitle(),this.renderBase(),this.renderMeta(),this.renderLink(),this.renderScript(),this.renderStyle(),this.renderNoscript())}},rp,sx=(rp=class extends g.Component{shouldComponentUpdate(e){return!KC(Sb(this.props,"helmetData"),Sb(e,"helmetData"))}mapNestedChildrenToProps(e,t){if(!t)return null;switch(e.type){case"script":case"noscript":return{innerHTML:t};case"style":return{cssText:t};default:throw new Error(`<${e.type} /> elements are self-closing and can not contain children. Refer to our API for more information.`)}}flattenArrayTypeChildren(e,t,n,r){return{...t,[e.type]:[...t[e.type]||[],{...n,...this.mapNestedChildrenToProps(e,r)}]}}mapObjectTypeChildren(e,t,n,r){switch(e.type){case"title":return{...t,[e.type]:r,titleAttributes:{...n}};case"body":return{...t,bodyAttributes:{...n}};case"html":return{...t,htmlAttributes:{...n}};default:return{...t,[e.type]:{...n}}}}mapArrayTypeChildrenToProps(e,t){let n={...t};return Object.keys(e).forEach(r=>{n={...n,[r]:e[r]}}),n}
41warnOnInvalidChildren(e,t){return Pb(Cb.some(n=>e.type===n),typeof e.type=="function"?"You may be attempting to nest <Helmet> components within each other, which is not allowed. Refer to our API for more information.":`Only elements types ${Cb.join(", ")} are allowed. Helmet does not support rendering <${e.type}> elements. Refer to our API for more information.`),Pb(!t||typeof t=="string"||Array.isArray(t)&&!t.some(n=>typeof n!="string"),`Helmet expects a string as a child of <${e.type}>. Did you forget to wrap your children in braces? ( <${e.type}>{\`\`}</${e.type}> ) Refer to our API for more information.`),!0}mapChildrenToProps(e,t){let n={};return I.Children.forEach(e,r=>{if(!r||!r.props)return;const{children:a,...i}=r.props,s=Object.keys(i).reduce((d,c)=>(d[ex[c]||c]=i[c],d),{});let{type:l}=r;switch(typeof l=="symbol"?l=l.toString():this.warnOnInvalidChildren(r,a),l){case"Symbol(react.fragment)":t=this.mapChildrenToProps(a,t);break;case"link":case"meta":case"noscript":case"script":case"style":n=this.flattenArrayTypeChildren(r,n,s,a);break;default:t=this.mapObjectTypeChildren(r,t,s,a);break}}),this.mapArrayTypeChildrenToProps(n,t)}render(){const{children:e,...t}=this.props;let n={...t},{helmetData:r}=t;if(e&&(n=this.mapChildrenToProps(e,n)),r&&!(r instanceof Xp)){const a=r;r=new Xp(a.context,!0),delete n.helmetData}return eg?I.createElement(vS,{...n}):r?I.createElement(Tb,{...n,context:r.value}):I.createElement(ax.Consumer,null,a=>I.createElement(Tb,{...n,context:a}))}},fn(rp,"defaultProps",{defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1}),rp);const bS="modulepreload",yS=function(e){return"/"+e},zb={}
41,F=function(t,n,r){let a=Promise.resolve();if(n&&n.length>0){document.getElementsByTagName("link");const s=document.querySelector("meta[property=csp-nonce]"),l=(s==null?void 0:s.nonce)||(s==null?void 0:s.getAttribute("nonce"));a=Promise.allSettled(n.map(d=>{if(d=yS(d),d in zb)return;zb[d]=!0;const c=d.endsWith(".css"),u=c?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${d}"]${u}`))return;const m=document.createElement("link");if(m.rel=c?"stylesheet":bS,c||(m.as="script"),m.crossOrigin="",m.href=d,l&&m.setAttribute("nonce",l),document.head.appendChild(m),c)return new Promise((p,h)=>{m.addEventListener("load",p),m.addEventListener("error",()=>h(new Error(`Unable to preload CSS for ${d}`)))})}))}function i(s){const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=s,window.dispatchEvent(l),!l.defaultPrevented)throw s}return a.then(s=>{for(const l of s||[])l.status==="rejected"&&i(l.reason);return t().catch(i)})},ox={d:"arcanes:f22:jeton",e:"arcanes:f22:jeton:e"},wS=/^\/(d|e)\/([A-Za-z0-9_-]{70})\/?$/;function ZW(e="d"){try{return typeof window<"u"&&window.sessionStorage.getItem(ox[e])||""}catch{return""}}function kS(){if(typeof window>"u")return;const e=window.location.pathname.match(wS);if(!e)return;const t=e[1];try{window.sessionStorage.setItem(ox[t],e[2])}catch{return}window.history.replaceState(window.history.state,"",`/${t}/`+window.location.search+window.location.hash)}kS();const xS=1,jS=1e6;let Am=0;function AS(){return Am=(Am+1)%Number.MAX_SAFE_INTEGER,Am.toString()}const Em=new Map,Ib=e=>{if(Em.has(e))return;const t=setTimeout(()=>{Em.delete(e),Do({type:"REMOVE_TOAST",toastId:e})},jS);Em.set(e,t)},ES=(e,t)=>{switch(t.type){case"ADD_TOAST":return{...e,toasts:[t.toast,...e.toasts].slice(0,xS)};case"UPDATE_TOAST":return{...e,toasts:e.toasts.map(n=>n.id===t.toast.id?{...n,...t.toast}:n)};case"DISMISS_TOAST":{const{toastId:n}=t;return n?Ib(n):e.toasts.forEach(r=>{Ib(r.id)}),{...e,toasts:e.toasts.map(r=>r.id===n||n===void 0?{...r,open:!1}:r)}}case"REMOVE_TOAST":return t.toastId===void 0?{...e,toasts:[]}:{...e,toasts:e.toasts.filter(n=>n.id!==t.toastId)}}},Wd=[];let Ud={toasts:[]};function Do(e){Ud=ES(Ud,e),Wd.forEach(t=>{t(Ud)})}function PS({...e}){const t=AS(),n=a=>Do({type:"UPDATE_TOAST",toast:{...a,id:t}}),r=()=>Do({type:"DISMISS_TOAST",toastId:t});return Do({type:"ADD_TOAST",toast:{...e,id:t,open:!0,onOpenChange:a=>{a||r()}}}),{id:t,dismiss:r,update:n}}function lx(){const[e,t]=g.useState(Ud);return g.useEffect(()=>(Wd.push(t),()=>{const n=Wd.indexOf(t);n>-1&&Wd.splice(n,1)}),[e]),{...e,toast:PS,dismiss:n=>Do({type:"DISMISS_TOAST",toastId:n})}}function ce(e,t,{checkForDefaultPrevented:n=!0}={}){return function(a){if(e==null||e(a),n===!1||!a.defaultPrevented)return t==null?void 0:t(a)}}function CS(e,t){typeof e=="function"?e(t):e!=null&&(e.current=t)}function dx(...e){return t=>e.forEach(n=>CS(n,t))}function Re(...e){return g.useCallback(dx(...e),e)}function SS(e,t=[]){let n=[];function r(i,s){const l=g.createContext(s),d=n.length;n=[...n,s];function c(m){const{scope:p,children:h,...b}=m,f=(p==null?void 0:p[e][d])||l,k=g.useMemo(()=>b,Object.values(b));return o.jsx(f.Provider,{value:k,children:h})}function u(m,p){const h=(p==null?void 0:p[e][d])||l,b=g.useContext(h);if(b)return b;if(s!==void 0)return s;throw new Error(`\`${m}\` must be used within \`${i}\``)}return c.displayName=i+"Provider",[c,u]}const a=()=>{const i=n.map(s=>g.createContext(s));return function(l){const d=(l==null?void 0:l[e])||i;return g.useMemo(()=>({[`__scope${e}`]:{...l,[e]:d}}),[l,d])}};return a.scopeName=e,[r,_S(a,...t)]}function _S(...e){const t=e[0];if(e.length===1)return t;const n=()=>{const r=e.map(a=>({useScope:a(),scopeName:a.scopeName}));return function(i){const s=r.reduce((l,{useScope:d,scopeName:c})=>{const m=d(i)[`__scope${c}`];return{...l,...m}},{});return g.useMemo(()=>({[`__scope${t.scopeName}`]:s}),[s])}};return n.scopeName=t.scopeName,n}var ha=g.forwardRef((e,t)=>{const{children:n,...r}=e,a=g.Children.toArray(n),i=a.find(TS);if(i){const s=i.props.children,l=a.map(d=>d===i?g.Children.count(s)>1?g.Children.only(null):g.isValidElement(s)?s.props.children:null:d);return o.jsx(ng,{...r,ref:t,children:g.isValidElement(s)?g.cloneElement(s,void 0,l):null})}return o.jsx(ng,{...r,ref:t,children:n})});ha.displayName="Slot";var ng=g.forwardRef((e,t)=>
41{const{children:n,...r}=e;if(g.isValidElement(n)){const a=RS(n);return g.cloneElement(n,{...DS(r,n.props),ref:t?dx(t,a):a})}return g.Children.count(n)>1?g.Children.only(null):null});ng.displayName="SlotClone";var cx=({children:e})=>o.jsx(o.Fragment,{children:e});function TS(e){return g.isValidElement(e)&&e.type===cx}function DS(e,t){const n={...t};for(const r in t){const a=e[r],i=t[r];/^on[A-Z]/.test(r)?a&&i?n[r]=(...l)=>{i(...l),a(...l)}:a&&(n[r]=a):r==="style"?n[r]={...a,...i}:r==="className"&&(n[r]=[a,i].filter(Boolean).join(" "))}return{...e,...n}}function RS(e){var r,a;let t=(r=Object.getOwnPropertyDescriptor(e.props,"ref"))==null?void 0:r.get,n=t&&"isReactWarning"in t&&t.isReactWarning;return n?e.ref:(t=(a=Object.getOwnPropertyDescriptor(e,"ref"))==null?void 0:a.get,n=t&&"isReactWarning"in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}function ux(e){const t=e+"CollectionProvider",[n,r]=SS(t),[a,i]=n(t,{collectionRef:{current:null},itemMap:new Map}),s=h=>{const{scope:b,children:f}=h,k=I.useRef(null),w=I.useRef(new Map).current;return o.jsx(a,{scope:b,itemMap:w,collectionRef:k,children:f})};s.displayName=t;const l=e+"CollectionSlot",d=I.forwardRef((h,b)=>{const{scope:f,children:k}=h,w=i(l,f),v=Re(b,w.collectionRef);return o.jsx(ha,{ref:v,children:k})});d.displayName=l;const c=e+"CollectionItemSlot",u="data-radix-collection-item",m=I.forwardRef((h,b)=>{const{scope:f,children:k,...w}=h,v=I.useRef(null),y=Re(b,v),x=i(c,f);return I.useEffect(()=>(x.itemMap.set(v,{ref:v,...w}),()=>void x.itemMap.delete(v))),o.jsx(ha,{[u]:"",ref:y,children:k})});m.displayName=c;function p(h){const b=i(e+"CollectionConsumer",h);return I.useCallback(()=>{const k=b.collectionRef.current;if(!k)return[];const w=Array.from(k.querySelectorAll(`[${u}]`));return Array.from(b.itemMap.values()).sort((x,A)=>w.indexOf(x.ref.current)-w.indexOf(A.ref.current))},[b.collectionRef,b.itemMap])}return[{Provider:s,Slot:d,ItemSlot:m},p,r]}function zS(e,t){const n=g.createContext(t),r=i=>{const{children:s,...l}=i,d=g.useMemo(()=>l,Object.values(l));return o.jsx(n.Provider,{value:d,children:s})};r.displayName=e+"Provider";function a(i){const s=g.useContext(n);if(s)return s;if(t!==void 0)return t;throw new Error(`\`${i}\` must be used within \`${e}\``)}return[r,a]}function Fs(e,t=[]){let n=[];function r(i,s){const l=g.createContext(s),d=n.length;n=[...n,s];const c=m=>{var w;const{scope:p,children:h,...b}=m,f=((w=p==null?void 0:p[e])==null?void 0:w[d])||l,k=g.useMemo(()=>b,Object.values(b));return o.jsx(f.Provider,{value:k,children:h})};c.displayName=i+"Provider";function u(m,p){var f;const h=((f=p==null?void 0:p[e])==null?void 0:f[d])||l,b=g.useContext(h);if(b)return b;if(s!==void 0)return s;throw new Error(`\`${m}\` must be used within \`${i}\``)}return[c,u]}const a=()=>{const i=n.map(s=>g.createContext(s));return function(l){const d=(l==null?void 0:l[e])||i;return g.useMemo(()=>({[`__scope${e}`]:{...l,[e]:d}}),[l,d])}};return a.scopeName=e,[r,IS(a,...t)]}function IS(...e){const t=e[0];if(e.length===1)return t;const n=()=>{const r=e.map(a=>({useScope:a(),scopeName:a.scopeName}));return function(i){const s=r.reduce((l,{useScope:d,scopeName:c})=>{const m=d(i)[`__scope${c}`];return{...l,...m}},{});return g.useMemo(()=>({[`__scope${t.scopeName}`]:s}),[s])}};return n.scopeName=t.scopeName,n}var qS=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","span","svg","ul"],be=qS.reduce((e,t)=>{const n=g.forwardRef((r,a)=>{const{asChild:i,...s}=r,l=i?ha:t;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),o.jsx(l,{...s,ref:a})});return n.displayName=`Primitive.${t}`,{...e,[t]:n}},{});function mx(e,t){e&&gi.flushSync(()=>e.dispatchEvent(t))}function ct(e){const t=g.useRef(e);return g.useEffect(()=>{t.current=e}),g.useMemo(()=>(...n)=>{var r;return(r=t.current)==null?void 0:r.call(t,...n)},[])}function NS(e,t=globalThis==null?void 0:globalThis.document){const n=ct(e);g.useEffect(()=>{const r=a=>{a.key==="Escape"&&n(a)};return t.addEventListener("keydown",r,{capture:!0}),()=>t.removeEventListener("keydown",r,{capture:!0})},[n,t])}
41var LS="DismissableLayer",rg="dismissableLayer.update",BS="dismissableLayer.pointerDownOutside",MS="dismissableLayer.focusOutside",qb,px=g.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),Os=g.forwardRef((e,t)=>{const{disableOutsidePointerEvents:n=!1,onEscapeKeyDown:r,onPointerDownOutside:a,onFocusOutside:i,onInteractOutside:s,onDismiss:l,...d}=e,c=g.useContext(px),[u,m]=g.useState(null),p=(u==null?void 0:u.ownerDocument)??(globalThis==null?void 0:globalThis.document),[,h]=g.useState({}),b=Re(t,j=>m(j)),f=Array.from(c.layers),[k]=[...c.layersWithOutsidePointerEventsDisabled].slice(-1),w=f.indexOf(k),v=u?f.indexOf(u):-1,y=c.layersWithOutsidePointerEventsDisabled.size>0,x=v>=w,A=OS(j=>{const P=j.target,S=[...c.branches].some(_=>_.contains(P));!x||S||(a==null||a(j),s==null||s(j),j.defaultPrevented||l==null||l())},p),E=VS(j=>{const P=j.target;[...c.branches].some(_=>_.contains(P))||(i==null||i(j),s==null||s(j),j.defaultPrevented||l==null||l())},p);return NS(j=>{v===c.layers.size-1&&(r==null||r(j),!j.defaultPrevented&&l&&(j.preventDefault(),l()))},p),g.useEffect(()=>{if(u)return n&&(c.layersWithOutsidePointerEventsDisabled.size===0&&(qb=p.body.style.pointerEvents,p.body.style.pointerEvents="none"),c.layersWithOutsidePointerEventsDisabled.add(u)),c.layers.add(u),Nb(),()=>{n&&c.layersWithOutsidePointerEventsDisabled.size===1&&(p.body.style.pointerEvents=qb)}},[u,p,n,c]),g.useEffect(()=>()=>{u&&(c.layers.delete(u),c.layersWithOutsidePointerEventsDisabled.delete(u),Nb())},[u,c]),g.useEffect(()=>{const j=()=>h({});return document.addEventListener(rg,j),()=>document.removeEventListener(rg,j)},[]),o.jsx(be.div,{...d,ref:b,style:{pointerEvents:y?x?"auto":"none":void 0,...e.style},onFocusCapture:ce(e.onFocusCapture,E.onFocusCapture),onBlurCapture:ce(e.onBlurCapture,E.onBlurCapture),onPointerDownCapture:ce(e.onPointerDownCapture,A.onPointerDownCapture)})});Os.displayName=LS;var FS="DismissableLayerBranch",gx=g.forwardRef((e,t)=>{const n=g.useContext(px),r=g.useRef(null),a=Re(t,r);return g.useEffect(()=>{const i=r.current;if(i)return n.branches.add(i),()=>{n.branches.delete(i)}},[n.branches]),o.jsx(be.div,{...e,ref:a})});gx.displayName=FS;function OS(e,t=globalThis==null?void 0:globalThis.document){const n=ct(e),r=g.useRef(!1),a=g.useRef(()=>{});return g.useEffect(()=>{const i=l=>{if(l.target&&!r.current){let d=function(){hx(BS,n,c,{discrete:!0})};const c={originalEvent:l};l.pointerType==="touch"?(t.removeEventListener("click",a.current),a.current=d,t.addEventListener("click",a.current,{once:!0})):d()}else t.removeEventListener("click",a.current);r.current=!1},s=window.setTimeout(()=>{t.addEventListener("pointerdown",i)},0);return()=>{window.clearTimeout(s),t.removeEventListener("pointerdown",i),t.removeEventListener("click",a.current)}},[t,n]),{onPointerDownCapture:()=>r.current=!0}}function VS(e,t=globalThis==null?void 0:globalThis.document){const n=ct(e),r=g.useRef(!1);return g.useEffect(()=>{const a=i=>{i.target&&!r.current&&hx(MS,n,{originalEvent:i},{discrete:!1})};return t.addEventListener("focusin",a),()=>t.removeEventListener("focusin",a)},[t,n]),{onFocusCapture:()=>r.current=!0,onBlurCapture:()=>r.current=!1}}function Nb(){const e=new CustomEvent(rg);document.dispatchEvent(e)}function hx(e,t,n,{discrete:r}){const a=n.originalEvent.target,i=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});t&&a.addEventListener(e,t,{once:!0}),r?mx(a,i):a.dispatchEvent(i)}var WS=Os,US=gx,kt=globalThis!=null&&globalThis.document?g.useLayoutEffect:()=>{},$S="Portal",zl=g.forwardRef((e,t)=>{var l;const{container:n,...r}=e,[a,i]=g.useState(!1);kt(()=>i(!0),[]);const s=n||a&&((l=globalThis==null?void 0:globalThis.document)==null?void 0:l.body);return s?Qk.createPortal(o.jsx(be.div,{...r,ref:t}),s):null});zl.displayName=$S;function GS(e,t){return g.useReducer((n,r)=>t[n][r]??n,e)}var gn=e=>{const{present:t,children:n}=e,r=HS(t),a=typeof n=="function"?n({present:r.isPresent}):g.Children.only(n),i=Re(r.ref,KS(a));return typeof n=="function"||r.isPresent?g.cloneElement(a,{ref:i}):null};gn.displayName="Presence";function HS(e){const[t,n]=g.useState(),r=g.useRef({}),a=g.useRef(e),i=g.useRef("none"),s=e?"mounted":"unmounted",[l,d]=GS(s,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return g.useEffect(()=>{const c=cd(r.current);i.current=l==="mounted"?c:"none"},[l]),kt(()=>{const c=r.current,u=a.current;if(u!==e){const p=i.current,h=cd(c);e?d("MOUNT"):h==="none"||(c==null?void 0:c.display)==="none"?d("UNMOUNT"):d(u&&p!==h?"ANIMATION_OUT":"UNMOUNT"),a.current=e}},[e,d]),kt(()=>{if(t){let c;const u=t.ownerDocument.defaultView??window,m=h=>{const f=cd(r.current).includes(h.animationName);if(h.target===t&&f&&(d("ANIMATION_END"),!a.current)){const k=t.style.animationFillMode;t.style.animationFillMode="forwards",c=u.setTimeout(()=>{t.style.animationFillMode==="forwards"&&(t.style.animationFillMode=k)})}},p=h=>{h.target===t&&(i.current=cd(r.current))};return t.addEventListener("animationstart",p),t.addEventListener("animationcancel",m),t.addEventListener("animationend",m),()=>{u.clearTimeout(c),t.removeEventListener("animationstart",p),t.removeEventListener("animationcancel",m),t.removeEventListener("animationend",m)}}else d("ANIMATION_END")},[t,d]),{isPresent:["mounted","unmountSuspended"].includes(l),ref:g.useCallback(c=>{c&&(r.current=getComputedStyle(c)),n(c)},[])}}function cd(e){return(e==null?void 0:e.animationName)||"none"}function KS(e){var r,a;let t=(r=Object.getOwnPropertyDescriptor(e.props,"ref"))==null?void 0:r.get,n=t&&"isReactWarning"in t&&t.isReactWarning;return n?e.ref:(t=(a=Object.getOwnPropertyDescriptor(e,"ref"))==null?void 0:a.get,n=t&&"isReactWarning"in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}function Es({prop:e,defaultProp:t,onChange:n=()=>{}}){const[r,a]=YS({defaultProp:t,onChange:n}),i=e!==void 0,s=i?e:r,l=ct(n),d=g.useCallback(c=>{if(i){const m=typeof c=="function"?c(e):c;m!==e&&l(m)}else a(c)},[i,e,a,l]);return[s,d]}function YS({defaultProp:e,onChange:t}){const n=g.useState(e),[r]=n,a=g.useRef(r),i=ct(t);return g.useEffect(()=>{a.current!==r&&(i(r),a.current=r)},[r,a,i]),n}var ZS="VisuallyHidden",Qh=g.forwardRef((e,t)=>
41o.jsx(be.span,{...e,ref:t,style:{position:"absolute",border:0,width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",wordWrap:"normal",...e.style}}));Qh.displayName=ZS;var Xh="ToastProvider",[ef,JS,QS]=ux("Toast"),[fx,JW]=Fs("Toast",[QS]),[XS,hu]=fx(Xh),vx=e=>{const{__scopeToast:t,label:n="Notification",duration:r=5e3,swipeDirection:a="right",swipeThreshold:i=50,children:s}=e,[l,d]=g.useState(null),[c,u]=g.useState(0),m=g.useRef(!1),p=g.useRef(!1);return n.trim()||console.error(`Invalid prop \`label\` supplied to \`${Xh}\`. Expected non-empty \`string\`.`),o.jsx(ef.Provider,{scope:t,children:o.jsx(XS,{scope:t,label:n,duration:r,swipeDirection:a,swipeThreshold:i,toastCount:c,viewport:l,onViewportChange:d,onToastAdd:g.useCallback(()=>u(h=>h+1),[]),onToastRemove:g.useCallback(()=>u(h=>h-1),[]),isFocusedToastEscapeKeyDownRef:m,isClosePausedRef:p,children:s})})};vx.displayName=Xh;var bx="ToastViewport",e_=["F8"],ag="toast.viewportPause",ig="toast.viewportResume",yx=g.forwardRef((e,t)=>{const{__scopeToast:n,hotkey:r=e_,label:a="Notifications ({hotkey})",...i}=e,s=hu(bx,n),l=JS(n),d=g.useRef(null),c=g.useRef(null),u=g.useRef(null),m=g.useRef(null),p=Re(t,m,s.onViewportChange),h=r.join("+").replace(/Key/g,"").replace(/Digit/g,""),b=s.toastCount>0;g.useEffect(()=>{const k=w=>{var y;r.length!==0&&r.every(x=>w[x]||w.code===x)&&((y=m.current)==null||y.focus())};return document.addEventListener("keydown",k),()=>document.removeEventListener("keydown",k)},[r]),g.useEffect(()=>{const k=d.current,w=m.current;if(b&&k&&w){const v=()=>{if(!s.isClosePausedRef.current){const E=new CustomEvent(ag);w.dispatchEvent(E),s.isClosePausedRef.current=!0}},y=()=>{if(s.isClosePausedRef.current){const E=new CustomEvent(ig);w.dispatchEvent(E),s.isClosePausedRef.current=!1}},x=E=>{!k.contains(E.relatedTarget)&&y()},A=()=>{k.contains(document.activeElement)||y()};return k.addEventListener("focusin",v),k.addEventListener("focusout",x),k.addEventListener("pointermove",v),k.addEventListener("pointerleave",A),window.addEventListener("blur",v),window.addEventListener("focus",y),()=>{k.removeEventListener("focusin",v),k.removeEventListener("focusout",x),k.removeEventListener("pointermove",v),k.removeEventListener("pointerleave",A),window.removeEventListener("blur",v),window.removeEventListener("focus",y)}}},[b,s.isClosePausedRef]);const f=g.useCallback(({tabbingDirection:k})=>{const v=l().map(y=>{const x=y.ref.current,A=[x,...p_(x)];return k==="forwards"?A:A.reverse()});return(k==="forwards"?v.reverse():v).flat()},[l]);return g.useEffect(()=>{const k=m.current;if(k){const w=v=>{var A,E,j;const y=v.altKey||v.ctrlKey||v.metaKey;if(v.key==="Tab"&&!y){const P=document.activeElement,S=v.shiftKey;if(v.target===k&&S){(A=c.current)==null||A.focus();return}const B=f({tabbingDirection:S?"backwards":"forwards"}),Q=B.findIndex(N=>N===P);Pm(B.slice(Q+1))?v.preventDefault():S?(E=c.current)==null||E.focus():(j=u.current)==null||j.focus()}};return k.addEventListener("keydown",w),()=>k.removeEventListener("keydown",w)}},[l,f]),o.jsxs(US,{ref:d,role:"region","aria-label":a.replace("{hotkey}",h),tabIndex:-1,style:{pointerEvents:b?void 0:"none"},children:[b&&o.jsx(sg,{ref:c,onFocusFromOutsideViewport:()=>{const k=f({tabbingDirection:"forwards"});Pm(k)}}),o.jsx(ef.Slot,{scope:n,children:o.jsx(be.ol,{tabIndex:-1,...i,ref:p})}),b&&o.jsx(sg,{ref:u,onFocusFromOutsideViewport:()=>{const k=f({tabbingDirection:"backwards"});Pm(k)}})]})});yx.displayName=bx;var wx="ToastFocusProxy",sg=g.forwardRef((e,t)=>{const{__scopeToast:n,onFocusFromOutsideViewport:r,...a}=e,i=hu(wx,n);return o.jsx(Qh,{"aria-hidden":!0,tabIndex:0,...a,ref:t,style:{position:"fixed"},onFocus:s=>{var c;const l=s.relatedTarget;!((c=i.viewport)!=null&&c.contains(l))&&r()}})});sg.displayName=wx;var fu="Toast",t_="toast.swipeStart",n_="toast.swipeMove",r_="toast.swipeCancel",a_="toast.swipeEnd",kx=g.forwardRef((e,t)=>{const{forceMount:n,open:r,defaultOpen:a,onOpenChange:i,...s}=e,[l=!0,d]=Es({prop:r,defaultProp:a,onChange:i});return o.jsx(gn,{present:n||l,children:o.jsx(o_,{open:l,...s,ref:t,onClose:()=>d(!1),onPause:ct(e.onPause),onResume:ct(e.onResume),onSwipeStart:ce(e.onSwipeStart,c=>{c.currentTarget.setAttribute("data-swipe","start")}),onSwipeMove:ce(e.onSwipeMove,c=>{const{x:u,y:m}=c.detail.delta;c.currentTarget.setAttribute("data-swipe","move"),c.currentTarget.style.setProperty("--radix-toast-swipe-move-x",`${u}px`),c.currentTarget.style.setProperty("--radix-toast-swipe-move-y",`${m}px`)}),onSwipeCancel:ce(e.onSwipeCancel,c=>{c.currentTarget.setAttribute("data-swipe","cancel"),c.currentTarget.style.removeProperty("--radix-toast-swipe-move-x"),c.currentTarget.style.removeProperty("--radix-toast-swipe-move-y"),c.currentTarget.style.removeProperty("--radix-toast-swipe-end-x"),c.currentTarget.style.removeProperty("--radix-toast-swipe-end-y")}),onSwipeEnd:ce(e.onSwipeEnd,c=>{const{x:u,y:m}=c.detail.delta;c.currentTarget.setAttribute("data-swipe","end"),c.currentTarget.style.removeProperty("--radix-toast-swipe-move-x"),c.currentTarget.style.removeProperty("--radix-toast-swipe-move-y"),c.currentTarget.style.setProperty("--radix-toast-swipe-end-x",`${u}px`),c.currentTarget.style.setProperty("--radix-toast-swipe-end-y",`${m}px`),d(!1)})})})});kx.displayName=fu;var[i_,s_]=fx(fu,{onClose(){}}),o_=g.forwardRef((e,t)=>
41{const{__scopeToast:n,type:r="foreground",duration:a,open:i,onClose:s,onEscapeKeyDown:l,onPause:d,onResume:c,onSwipeStart:u,onSwipeMove:m,onSwipeCancel:p,onSwipeEnd:h,...b}=e,f=hu(fu,n),[k,w]=g.useState(null),v=Re(t,N=>w(N)),y=g.useRef(null),x=g.useRef(null),A=a||f.duration,E=g.useRef(0),j=g.useRef(A),P=g.useRef(0),{onToastAdd:S,onToastRemove:_}=f,G=ct(()=>{var ie;(k==null?void 0:k.contains(document.activeElement))&&((ie=f.viewport)==null||ie.focus()),s()}),B=g.useCallback(N=>{!N||N===1/0||(window.clearTimeout(P.current),E.current=new Date().getTime(),P.current=window.setTimeout(G,N))},[G]);g.useEffect(()=>{const N=f.viewport;if(N){const ie=()=>{B(j.current),c==null||c()},Y=()=>{const te=new Date().getTime()-E.current;j.current=j.current-te,window.clearTimeout(P.current),d==null||d()};return N.addEventListener(ag,Y),N.addEventListener(ig,ie),()=>{N.removeEventListener(ag,Y),N.removeEventListener(ig,ie)}}},[f.viewport,A,d,c,B]),g.useEffect(()=>{i&&!f.isClosePausedRef.current&&B(A)},[i,A,f.isClosePausedRef,B]),g.useEffect(()=>(S(),()=>_()),[S,_]);const Q=g.useMemo(()=>k?Sx(k):null,[k]);return f.viewport?o.jsxs(o.Fragment,{children:[Q&&o.jsx(l_,{__scopeToast:n,role:"status","aria-live":r==="foreground"?"assertive":"polite","aria-atomic":!0,children:Q}),o.jsx(i_,{scope:n,onClose:G,children:gi.createPortal(o.jsx(ef.ItemSlot,{scope:n,children:o.jsx(WS,{asChild:!0,onEscapeKeyDown:ce(l,()=>{f.isFocusedToastEscapeKeyDownRef.current||G(),f.isFocusedToastEscapeKeyDownRef.current=!1}),children:o.jsx(be.li,{role:"status","aria-live":"off","aria-atomic":!0,tabIndex:0,"data-state":i?"open":"closed","data-swipe-direction":f.swipeDirection,...b,ref:v,style:{userSelect:"none",touchAction:"none",...e.style},onKeyDown:ce(e.onKeyDown,N=>{N.key==="Escape"&&(l==null||l(N.nativeEvent),N.nativeEvent.defaultPrevented||(f.isFocusedToastEscapeKeyDownRef.current=!0,G()))}),onPointerDown:ce(e.onPointerDown,N=>{N.button===0&&(y.current={x:N.clientX,y:N.clientY})}),onPointerMove:ce(e.onPointerMove,N=>{if(!y.current)return;const ie=N.clientX-y.current.x,Y=N.clientY-y.current.y,te=!!x.current,C=["left","right"].includes(f.swipeDirection),z=["left","up"].includes(f.swipeDirection)?Math.min:Math.max,Z=C?z(0,ie):0,K=C?0:z(0,Y),X=N.pointerType==="touch"?10:2,he={x:Z,y:K},M={originalEvent:N,delta:he};te?(x.current=he,ud(n_,m,M,{discrete:!1})):Lb(he,f.swipeDirection,X)?(x.current=he,ud(t_,u,M,{discrete:!1}),N.target.setPointerCapture(N.pointerId)):(Math.abs(ie)>X||Math.abs(Y)>X)&&(y.current=null)}),onPointerUp:ce(e.onPointerUp,N=>{const ie=x.current,Y=N.target;if(Y.hasPointerCapture(N.pointerId)&&Y.releasePointerCapture(N.pointerId),x.current=null,y.current=null,ie){const te=N.currentTarget,C={originalEvent:N,delta:ie};Lb(ie,f.swipeDirection,f.swipeThreshold)?ud(a_,h,C,{discrete:!0}):ud(r_,p,C,{discrete:!0}),te.addEventListener("click",z=>z.preventDefault(),{once:!0})}})})})}),f.viewport)})]}):null}),l_=e=>{const{__scopeToast:t,children:n,...r}=e,a=hu(fu,t),[i,s]=g.useState(!1),[l,d]=g.useState(!1);return u_(()=>s(!0)),g.useEffect(()=>{const c=window.setTimeout(()=>d(!0),1e3);return()=>window.clearTimeout(c)},[]),l?null:o.jsx(zl,{asChild:!0,children:o.jsx(Qh,{...r,children:i&&o.jsxs(o.Fragment,{children:[a.label," ",n]})})})},d_="ToastTitle",xx=g.forwardRef((e,t)=>{const{__scopeToast:n,...r}=e;return o.jsx(be.div,{...r,ref:t})});xx.displayName=d_;var c_="ToastDescription",jx=g.forwardRef((e,t)=>{const{__scopeToast:n,...r}=e;return o.jsx(be.div,{...r,ref:t})});jx.displayName=c_;var Ax="ToastAction",Ex=g.forwardRef((e,t)=>{const{altText:n,...r}=e;return n.trim()?o.jsx(Cx,{altText:n,asChild:!0,children:o.jsx(tf,{...r,ref:t})}):(console.error(`Invalid prop \`altText\` supplied to \`${Ax}\`. Expected non-empty \`string\`.`),null)});Ex.displayName=Ax;var Px="ToastClose",tf=g.forwardRef((e,t)=>{const{__scopeToast:n,...r}=e,a=s_(Px,n);return o.jsx(Cx,{asChild:!0,children:o.jsx(be.button,{type:"button",...r,ref:t,onClick:ce(e.onClick,a.onClose)})})});tf.displayName=Px;var Cx=g.forwardRef((e,t)=>{const{__scopeToast:n,altText:r,...a}=e;return o.jsx(be.div,{"data-radix-toast-announce-exclude":"","data-radix-toast-announce-alt":r||void 0,...a,ref:t})});function Sx(e){const t=[];
41return Array.from(e.childNodes).forEach(r=>{if(r.nodeType===r.TEXT_NODE&&r.textContent&&t.push(r.textContent),m_(r)){const a=r.ariaHidden||r.hidden||r.style.display==="none",i=r.dataset.radixToastAnnounceExclude==="";if(!a)if(i){const s=r.dataset.radixToastAnnounceAlt;s&&t.push(s)}else t.push(...Sx(r))}}),t}function ud(e,t,n,{discrete:r}){const a=n.originalEvent.currentTarget,i=new CustomEvent(e,{bubbles:!0,cancelable:!0,detail:n});t&&a.addEventListener(e,t,{once:!0}),r?mx(a,i):a.dispatchEvent(i)}var Lb=(e,t,n=0)=>{const r=Math.abs(e.x),a=Math.abs(e.y),i=r>a;return t==="left"||t==="right"?i&&r>n:!i&&a>n};function u_(e=()=>{}){const t=ct(e);kt(()=>{let n=0,r=0;return n=window.requestAnimationFrame(()=>r=window.requestAnimationFrame(t)),()=>{window.cancelAnimationFrame(n),window.cancelAnimationFrame(r)}},[t])}function m_(e){return e.nodeType===e.ELEMENT_NODE}function p_(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:r=>{const a=r.tagName==="INPUT"&&r.type==="hidden";return r.disabled||r.hidden||a?NodeFilter.FILTER_SKIP:r.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t}function Pm(e){const t=document.activeElement;return e.some(n=>n===t?!0:(n.focus(),document.activeElement!==t))}var g_=vx,_x=yx,Tx=kx,Dx=xx,Rx=jx,zx=Ex,Ix=tf;function qx(e){var t,n,r="";if(typeof e=="string"||typeof e=="number")r+=e;else if(typeof e=="object")if(Array.isArray(e)){var a=e.length;for(t=0;t<a;t++)e[t]&&(n=qx(e[t]))&&(r&&(r+=" "),r+=n)}else for(n in e)e[n]&&(r&&(r+=" "),r+=n);return r}function Nx(){for(var e,t,n=0,r="",a=arguments.length;n<a;n++)(e=arguments[n])&&(t=qx(e))&&(r&&(r+=" "),r+=t);return r}const Bb=e=>typeof e=="boolean"?`${e}`:e===0?"0":e,Mb=Nx,vu=(e,t)=>n=>{var r;if((t==null?void 0:t.variants)==null)return Mb(e,n==null?void 0:n.class,n==null?void 0:n.className);const{variants:a,defaultVariants:i}=t,s=Object.keys(a).map(c=>{const u=n==null?void 0:n[c],m=i==null?void 0:i[c];if(u===null)return null;const p=Bb(u)||Bb(m);return a[c][p]}),l=n&&Object.entries(n).reduce((c,u)=>{let[m,p]=u;return p===void 0||(c[m]=p),c},{}),d=t==null||(r=t.compoundVariants)===null||r===void 0?void 0:r.reduce((c,u)=>{let{class:m,className:p,...h}=u;return Object.entries(h).every(b=>{let[f,k]=b;return Array.isArray(k)?k.includes({...i,...l}[f]):{...i,...l}[f]===k})?[...c,m,p]:c},[]);return Mb(e,s,d,n==null?void 0:n.class,n==null?void 0:n.className)};/** 42 * @license lucide-react v0.462.0 - ISC 43 * 44 * This source code is licensed under the ISC license. 45 * See the LICENSE file in the root directory of this source tree. 46 */const h_=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),Lx=(...e)=>e.filter((t,n,r)=>!!t&&t.trim()!==""&&r.indexOf(t)===n).join(" ").trim();/** 47 * @license lucide-react v0.462.0 - ISC 48 * 49 * This source code is licensed under the ISC license. 50 * See the LICENSE file in the root directory of this source tree. 51 */var f_={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"};/** 52 * @license lucide-react v0.462.0 - ISC 53 * 54 * This source code is licensed under the ISC license. 55 * See the LICENSE file in the root directory of this source tree. 56 */const v_=g.forwardRef(({color:e="currentColor",size:t=24,strokeWidth:n=2,absoluteStrokeWidth:r,className:a="",children:i,iconNode:s,...l},d)=>g.createElement("svg",{ref:d,...f_,width:t,height:t,stroke:e,strokeWidth:r?Number(n)*24/Number(t):n,className:Lx("lucide",a),...l},[...s.map(([c,u])=>g.createElement(c,u)),...Array.isArray(i)?i:[i]]));/** 57 * @license lucide-react v0.462.0 - ISC 58 * 59 * This source code is licensed under the ISC license. 60 * See the LICENSE file in the root directory of this source tree. 61 */const H=(e,t)=>{const n=g.forwardRef(({className:r,...a},i)=>g.createElement(v_,{ref:i,iconNode:t,className:Lx(`lucide-${h_(e)}`,r),...a}));return n.displayName=`${e}`,n};/** 62 * @license lucide-react v0.462.0 - ISC 63 * 64 * This source code is licensed under the ISC license. 65 * See the LICENSE file in the root directory of this source tree. 66 */const b_=H("Activity",[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l
66-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]]);/** 67 * @license lucide-react v0.462.0 - ISC 68 * 69 * This source code is licensed under the ISC license. 70 * See the LICENSE file in the root directory of this source tree. 71 */const et=H("ArrowRight",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]);/** 72 * @license lucide-react v0.462.0 - ISC 73 * 74 * This source code is licensed under the ISC license. 75 * See the LICENSE file in the root directory of this source tree. 76 */const y_=H("Award",[["path",{d:"m15.477 12.89 1.515 8.526a.5.5 0 0 1-.81.47l-3.58-2.687a1 1 0 0 0-1.197 0l-3.586 2.686a.5.5 0 0 1-.81-.469l1.514-8.526",key:"1yiouv"}],["circle",{cx:"12",cy:"8",r:"6",key:"1vp47v"}]]);/** 77 * @license lucide-react v0.462.0 - ISC 78 * 79 * This source code is licensed under the ISC license. 80 * See the LICENSE file in the root directory of this source tree. 81 */const og=H("Bell",[["path",{d:"M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9",key:"1qo2s2"}],["path",{d:"M10.3 21a1.94 1.94 0 0 0 3.4 0",key:"qgo35s"}]]);/** 82 * @license lucide-react v0.462.0 - ISC 83 * 84 * This source code is licensed under the ISC license. 85 * See the LICENSE file in the root directory of this source tree. 86 */const w_=H("Bug",[["path",{d:"m8 2 1.88 1.88",key:"fmnt4t"}],["path",{d:"M14.12 3.88 16 2",key:"qol33r"}],["path",{d:"M9 7.13v-1a3.003 3.003 0 1 1 6 0v1",key:"d7y7pr"}],["path",{d:"M12 20c-3.3 0-6-2.7-6-6v-3a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v3c0 3.3-2.7 6-6 6",key:"xs1cw7"}],["path",{d:"M12 20v-9",key:"1qisl0"}],["path",{d:"M6.53 9C4.6 8.8 3 7.1 3 5",key:"32zzws"}],["path",{d:"M6 13H2",key:"82j7cp"}],["path",{d:"M3 21c0-2.1 1.7-3.9 3.8-4",key:"4p0ekp"}],["path",{d:"M20.97 5c0 2.1-1.6 3.8-3.5 4",key:"18gb23"}],["path",{d:"M22 13h-4",key:"1jl80f"}],["path",{d:"M17.2 17c2.1.1 3.8 1.9 3.8 4",key:"k3fwyw"}]]);/** 87 * @license lucide-react v0.462.0 - ISC 88 * 89 * This source code is licensed under the ISC license. 90 * See the LICENSE file in the root directory of this source tree. 91 */const nf=H("Building2",[["path",{d:"M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z",key:"1b4qmf"}],["path",{d:"M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2",key:"i71pzd"}],["path",{d:"M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2",key:"10jefs"}],["path",{d:"M10 6h4",key:"1itunk"}],["path",{d:"M10 10h4",key:"tcdvrf"}],["path",{d:"M10 14h4",key:"kelpxr"}],["path",{d:"M10 18h4",key:"1ulq68"}]]);/** 92 * @license lucide-react v0.462.0 - ISC 93 * 94 * This source code is licensed under the ISC license. 95 * See the LICENSE file in the root directory of this source tree. 96 */const k_=H("Building",[["rect",{width:"16",height:"20",x:"4",y:"2",rx:"2",ry:"2",key:"76otgf"}],["path",{d:"M9 22v-4h6v4",key:"r93iot"}],["path",{d:"M8 6h.01",key:"1dz90k"}],["path",{d:"M16 6h.01",key:"1x0f13"}],["path",{d:"M12 6h.01",key:"1vi96p"}],["path",{d:"M12 10h.01",key:"1nrarc"}],["path",{d:"M12 14h.01",key:"1etili"}],["path",{d:"M16 10h.01",key:"1m94wz"}],["path",{d:"M16 14h.01",key:"1gbofw"}],["path",{d:"M8 10h.01",key:"19clt8"}],["path",{d:"M8 14h.01",key:"6423bh"}]]);/** 97 * @license lucide-react v0.462.0 - ISC 98 * 99 * This source code is licensed under the ISC license. 100 * See the LICENSE file in the root directory of this source tree. 101 */const Ps=H("Calculator",[["rect",{width:"16",height:"20",x:"4",y:"2",rx:"2",key:"1nb95v"}],["line",{x1:"8",x2:"16",y1:"6",y2:"6",key:"x4nwl0"}],["line",{x1:"16",x2:"16",y1:"14",y2:"18",key:"wjye3r"}],["path",{d:"M16 10h.01",key:"1m94wz"}],["path",{d:"M12 10h.01",key:"1nrarc"}],["path",{d:"M8 10h.01",key:"19clt8"}],["path",{d:"M12 14h.01",key:"1etili"}],["path",{d:"M8 14h.01",key:"6423bh"}],["path",{d:"M12 18h.01",key:"mhygvu"}],["path",{d:"M8 18h.01",key:"lrp35t"}]]);/** 102 * @license lucide-react v0.462.0 - ISC 103 * 104 * This source code is licensed under the ISC license. 105 * See the LICENSE file in the root directory of this source tree. 106 */const Bx=H("Calendar",[["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M16 2v4",key:"4m81vk"}],["rect",{width:"18",height:"18",x:"3",y:"4",rx:"2",key:"1hopcy"}],["path",{d:"M3 10h18",key:"8toen8"}]]);/** 107 * @license lucide-react v0.462.0 - ISC 108 * 109 * This source code is licensed under the ISC license. 110 * See the LICENSE file in the root directory of this source tree. 111 */const x_=H("Camera",[["path",{d:"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z",key:"1tc9qg"}],["circle",{cx:"12",cy:"13",r:"3",key:"1vg3eu"}]]);/** 112 * @license lucide-react v0.462.0 - ISC 113 * 114 * This source code is licensed under the ISC license. 115 * See the LICENSE file in the root directory of this source tree. 116 */const Il=H("ChartColumn",[["path",{d:"M3 3v16a2 2 0 0 0 2 2h16",key:"c24i48"}],["path",{d:"M18 17V9",key:"2bz60n"}],["path",{d:"M13 17V5",key:"1frdt8"}],["path",{d:"M8 17v-3",key:"17ska0"}]]);/** 117 * @license lucide-react v0.462.0 - ISC 118 * 119 * This source code is licensed under the ISC license. 120 * See the LICENSE file in the root directory of this source tree. 121 */const Mx=H("ChartPie",[["path",{d:"M21 12c.552 0 1.005-.449.95-.998a10 10 0 0 0-8.953-8.951c-.55-.055-.998.398-.998.95v8a1 1 0 0 0 1 1z",ke
121y:"pzmjnu"}],["path",{d:"M21.21 15.89A10 10 0 1 1 8 2.83",key:"k2fpak"}]]);/** 122 * @license lucide-react v0.462.0 - ISC 123 * 124 * This source code is licensed under the ISC license. 125 * See the LICENSE file in the root directory of this source tree. 126 */const fa=H("Check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);/** 127 * @license lucide-react v0.462.0 - ISC 128 * 129 * This source code is licensed under the ISC license. 130 * See the LICENSE file in the root directory of this source tree. 131 */const Er=H("ChevronDown",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);/** 132 * @license lucide-react v0.462.0 - ISC 133 * 134 * This source code is licensed under the ISC license. 135 * See the LICENSE file in the root directory of this source tree. 136 */const Fx=H("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);/** 137 * @license lucide-react v0.462.0 - ISC 138 * 139 * This source code is licensed under the ISC license. 140 * See the LICENSE file in the root directory of this source tree. 141 */const j_=H("ChevronUp",[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]]);/** 142 * @license lucide-react v0.462.0 - ISC 143 * 144 * This source code is licensed under the ISC license. 145 * See the LICENSE file in the root directory of this source tree. 146 */const A_=H("CircleAlert",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]]);/** 147 * @license lucide-react v0.462.0 - ISC 148 * 149 * This source code is licensed under the ISC license. 150 * See the LICENSE file in the root directory of this source tree. 151 */const E_=H("CircleHelp",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);/** 152 * @license lucide-react v0.462.0 - ISC 153 * 154 * This source code is licensed under the ISC license. 155 * See the LICENSE file in the root directory of this source tree. 156 */const P_=H("CircleX",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]]);/** 157 * @license lucide-react v0.462.0 - ISC 158 * 159 * This source code is licensed under the ISC license. 160 * See the LICENSE file in the root directory of this source tree. 161 */const Ox=H("Clock",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16 14",key:"68esgv"}]]);/** 162 * @license lucide-react v0.462.0 - ISC 163 * 164 * This source code is licensed under the ISC license. 165 * See the LICENSE file in the root directory of this source tree. 166 */const C_=H("Cloud",[["path",{d:"M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z",key:"p7xjir"}]]);/** 167 * @license lucide-react v0.462.0 - ISC 168 * 169 * This source code is licensed under the ISC license. 170 * See the LICENSE file in the root directory of this source tree. 171 */const S_=H("Code",[["polyline",{points:"16 18 22 12 16 6",key:"z7tu5w"}],["polyline",{points:"8 6 2 12 8 18",key:"1eg1df"}]]);/** 172 * @license lucide-react v0.462.0 - ISC 173 * 174 * This source code is licensed under the ISC license. 175 * See the LICENSE file in the root directory of this source tree. 176 */const lg=H("Coins",[["circle",{cx:"8",cy:"8",r:"6",key:"3yglwk"}],["path",{d:"M18.09 10.37A6 6 0 1 1 10.34 18",key:"t5s6rm"}],["path",{d:"M7 6h1v4",key:"1obek4"}],["path",{d:"m16.71 13.88.7.71-2.82 2.82",key:"1rbuyh"}]]);/** 177 * @license lucide-react v0.462.0 - ISC 178 * 179 * This source code is licensed under the ISC license. 180 * See the LICENSE file in the root directory of this source tree. 181 */const __=H("Cpu",[["rect",{width:"16",height:"16",x:"4",y:"4",rx:"2",key:"14l7u7"}],["rect",{width:"6",height:"6",x:"9",y:"9",rx:"1",key:"5aljv4"}],["path",{d:"M15 2v2",key:"13l42r"}],["path",{d:"M15 20v2",key:"15mkzm"}],["path",{d:"M2 15h2",key:"1gxd5l"}],["path",{d:"M2 9h2",key:"1bbxkp"}],["path",{d:"M20 15h2",key:"19e6y8"}],["path",{d:"M20 9h2",key:"19tzq7"}
181],["path",{d:"M9 2v2",key:"165o2o"}],["path",{d:"M9 20v2",key:"i2bqo8"}]]);/** 182 * @license lucide-react v0.462.0 - ISC 183 * 184 * This source code is licensed under the ISC license. 185 * See the LICENSE file in the root directory of this source tree. 186 */const T_=H("CreditCard",[["rect",{width:"20",height:"14",x:"2",y:"5",rx:"2",key:"ynyp8z"}],["line",{x1:"2",x2:"22",y1:"10",y2:"10",key:"1b3vmo"}]]);/** 187 * @license lucide-react v0.462.0 - ISC 188 * 189 * This source code is licensed under the ISC license. 190 * See the LICENSE file in the root directory of this source tree. 191 */const dg=H("Crown",[["path",{d:"M11.562 3.266a.5.5 0 0 1 .876 0L15.39 8.87a1 1 0 0 0 1.516.294L21.183 5.5a.5.5 0 0 1 .798.519l-2.834 10.246a1 1 0 0 1-.956.734H5.81a1 1 0 0 1-.957-.734L2.02 6.02a.5.5 0 0 1 .798-.519l4.276 3.664a1 1 0 0 0 1.516-.294z",key:"1vdc57"}],["path",{d:"M5 21h14",key:"11awu3"}]]);/** 192 * @license lucide-react v0.462.0 - ISC 193 * 194 * This source code is licensed under the ISC license. 195 * See the LICENSE file in the root directory of this source tree. 196 */const D_=H("Database",[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5",key:"1wlel7"}],["path",{d:"M3 12A9 3 0 0 0 21 12",key:"mv7ke4"}]]);/** 197 * @license lucide-react v0.462.0 - ISC 198 * 199 * This source code is licensed under the ISC license. 200 * See the LICENSE file in the root directory of this source tree. 201 */const R_=H("Diamond",[["path",{d:"M2.7 10.3a2.41 2.41 0 0 0 0 3.41l7.59 7.59a2.41 2.41 0 0 0 3.41 0l7.59-7.59a2.41 2.41 0 0 0 0-3.41l-7.59-7.59a2.41 2.41 0 0 0-3.41 0Z",key:"1f1r0c"}]]);/** 202 * @license lucide-react v0.462.0 - ISC 203 * 204 * This source code is licensed under the ISC license. 205 * See the LICENSE file in the root directory of this source tree. 206 */const z_=H("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]]);/** 207 * @license lucide-react v0.462.0 - ISC 208 * 209 * This source code is licensed under the ISC license. 210 * See the LICENSE file in the root directory of this source tree. 211 */const jc=H("ExternalLink",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);/** 212 * @license lucide-react v0.462.0 - ISC 213 * 214 * This source code is licensed under the ISC license. 215 * See the LICENSE file in the root directory of this source tree. 216 */const I_=H("EyeOff",[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);/** 217 * @license lucide-react v0.462.0 - ISC 218 * 219 * This source code is licensed under the ISC license. 220 * See the LICENSE file in the root directory of this source tree. 221 */const Vx=H("Eye",[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);/** 222 * @license lucide-react v0.462.0 - ISC 223 * 224 * This source code is licensed under the ISC license. 225 * See the LICENSE file in the root directory of this source tree. 226 */const hi=H("FileText",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]]);/** 227 * @license lucide-react v0.462.0 - ISC 228 * 229 * This source code is licensed under the ISC license. 230 * See the LICENSE file in the root directory of this source tree. 231 */const q_=H("Flame",[["path",{d:"M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z",key:"96xj49"}]]);/** 232 * @license lucide-react v0.462.0 - ISC 233 * 234 * This source code is licensed under the ISC license. 235 * See the LICENSE file in the root directory of this source tree. 236 */const N_=H("Gem",[["path",{d:"M6 3h12l4 6-10 13L2 9Z",key:"1pcd5k"}],["path",{d:"M11 3 8 9l4 13 4-13-3-6",key:"1fcu3u"}],["path",{d:"M2 9h20",key:"16fsjt"}]]);/** 237 * @license lucide-react v0.462.0 - ISC 238 * 239 * This source code is licensed under the ISC license. 240 * See the LICENSE file in the root directory of this source tree. 241 */const Ac=H("Gift",[["rect",{x:"3",y:"8",width:"18",height:"4",rx:"1",key:"bkv52"}],["path",{d:"M12 8v13",key:"1c76mn"}],["path",{d:"M19 12v7a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2v-7",key:"6wjy6b"}],["path",{d:"M7.5 8a2.5 2.5 0 0 1 0-5A4.8 8 0 0 1 12 8a4.8 8 0 0 1 4.5-5 2.5 2.5 0 0 1 0 5",key:"1ihvrl"}]]);/** 242 * @license lucide-react v0.462.0 - ISC 243 * 244 * This source code is licensed under the ISC license. 245 * See the LICENSE file in the root directory of this source tree. 246 */const Wx=H("Globe",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]]);/** 247 * @license lucide-react v0.462.0 - ISC 248 * 249 * This source code is licensed under the ISC license. 250 * See the LICENSE file in the root directory of this source tree. 251 */const L_=H("Headphones",[["path",{d:"M3 14h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-7a9 9 0 0 1 18 0v7a2 2 0 0 1-2 2h-1a2 2 0 0 1-2-2v-3a2 2 0 0 1 2-2h3",key:"1xhozi"}]]);/** 252 * @license lucide-react v0.462.0 - ISC 253 * 254 * This source code is licensed under the ISC license. 255 * See the LICENSE file in the root directory of this source tree. 256 */const B_=H("Heart",[["path",{d:"M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z",key:"c3ymky"}]]);/** 257 * @license lucide-react v0.462.0 - ISC 258 * 259 * This source code is licensed under the ISC license. 260 * See the LICENSE file in the root directory of this source tree. 261 */const M_=H("House",[["path",{d:"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8",key:"5wwlr5"}],["path",{d:"M3 10a2 2 0 0 1 .709-1.528l7-5.999a2 2 0 0 1 2.582 0l7 5.999A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z",key:"1d0kgt"}]]);/** 262 * @license lucide-react v0.462.0 - ISC 263 * 264 * This source code is licensed under the ISC license. 265 * See the LICENSE file in the root directory of this source tree. 266 */const F_=H("Image",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21",key:"1xmnt7"}]]);/** 267 * @license lucide-react v0.462.0 - ISC 268 * 269 * This source code is licensed under the ISC license. 270 * See the LICENSE file in the root directory of this source tree. 271 */const Ux=H("Info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]]);/** 272 * @license lucide-react v0.462.0 - ISC 273 * 274 * This source code is licensed under the ISC license. 275 * See the LICENSE file in the root directory of this source tree. 276 */const rf=H("Landmark",[["line",{x1:"3",x2:"21",y1:"22",y2:"22",key:"j8o0r"}],["line",{x1:"6",x2:"6",y1:"18",y2:"11",key:"10tf0k"}],["line",{x1:"10",x2:"10",y1:"18",y2:"11",key:"54lgf6"}],["line",{x1:"14",x2:"14",y1:"18",y2:"11",key:"380y"}],["line",{x1:"18",x2:"18",y1:"18",y2:"11",key:"1kevvc"}],["polygon",{points:"12 2 20 7 4 7",key:"jkujk7"}]]);/** 277 * @license lucide-react v0.462.0 - ISC 278 * 279 * This source code is licensed under the ISC license. 280 * See the LICENSE file in the root directory of this source tree.
281 */const $x=H("LayoutDashboard",[["rect",{width:"7",height:"9",x:"3",y:"3",rx:"1",key:"10lvy0"}],["rect",{width:"7",height:"5",x:"14",y:"3",rx:"1",key:"16une8"}],["rect",{width:"7",height:"9",x:"14",y:"12",rx:"1",key:"1hutg5"}],["rect",{width:"7",height:"5",x:"3",y:"16",rx:"1",key:"ldoo1y"}]]);/** 282 * @license lucide-react v0.462.0 - ISC 283 * 284 * This source code is licensed under the ISC license. 285 * See the LICENSE file in the root directory of this source tree. 286 */const Gx=H("Leaf",[["path",{d:"M11 20A7 7 0 0 1 9.8 6.1C15.5 5 17 4.48 19 2c1 2 2 4.18 2 8 0 5.5-4.78 10-10 10Z",key:"nnexq3"}],["path",{d:"M2 21c0-3 1.85-5.36 5.08-6C9.5 14.52 12 13 13 12",key:"mt58a7"}]]);/** 287 * @license lucide-react v0.462.0 - ISC 288 * 289 * This source code is licensed under the ISC license. 290 * See the LICENSE file in the root directory of this source tree. 291 */const O_=H("Lightbulb",[["path",{d:"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5",key:"1gvzjb"}],["path",{d:"M9 18h6",key:"x1upvd"}],["path",{d:"M10 22h4",key:"ceow96"}]]);/** 292 * @license lucide-react v0.462.0 - ISC 293 * 294 * This source code is licensed under the ISC license. 295 * See the LICENSE file in the root directory of this source tree. 296 */const V_=H("Link",[["path",{d:"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71",key:"1cjeqo"}],["path",{d:"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71",key:"19qd67"}]]);/** 297 * @license lucide-react v0.462.0 - ISC 298 * 299 * This source code is licensed under the ISC license. 300 * See the LICENSE file in the root directory of this source tree. 301 */const cg=H("LoaderCircle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]);/** 302 * @license lucide-react v0.462.0 - ISC 303 * 304 * This source code is licensed under the ISC license. 305 * See the LICENSE file in the root directory of this source tree. 306 */const Hx=H("Lock",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]]);/** 307 * @license lucide-react v0.462.0 - ISC 308 * 309 * This source code is licensed under the ISC license. 310 * See the LICENSE file in the root directory of this source tree. 311 */const Kx=H("LogOut",[["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4",key:"1uf3rs"}],["polyline",{points:"16 17 21 12 16 7",key:"1gabdz"}],["line",{x1:"21",x2:"9",y1:"12",y2:"12",key:"1uyos4"}]]);/** 312 * @license lucide-react v0.462.0 - ISC 313 * 314 * This source code is licensed under the ISC license. 315 * See the LICENSE file in the root directory of this source tree. 316 */const Yx=H("Mail",[["rect",{width:"20",height:"16",x:"2",y:"4",rx:"2",key:"18n3k1"}],["path",{d:"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7",key:"1ocrg3"}]]);/** 317 * @license lucide-react v0.462.0 - ISC 318 * 319 * This source code is licensed under the ISC license. 320 * See the LICENSE file in the root directory of this source tree. 321 */const af=H("MapPin",[["path",{d:"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0",key:"1r0f0z"}],["circle",{cx:"12",cy:"10",r:"3",key:"ilqhr7"}]]);/** 322 * @license lucide-react v0.462.0 - ISC 323 * 324 * This source code is licensed under the ISC license. 325 * See the LICENSE file in the root directory of this source tree. 326 */const sf=H("Map",[["path",{d:"M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z",key:"169xi5"}],["path",{d:"M15 5.764v15",key:"1pn4in"}],["path",{d:"M9 3.236v15",key:"1uimfh"}]]);/** 327 * @license lucide-react v0.462.0 - ISC 328 * 329 * This source code is licensed under the ISC license. 330 * See the LICENSE file in the root directory of this source tree. 331 */const W_=H("Menu",[["line",{x1:"4",x2:"20",y1:"12",y2:"12",key:"1e0a9i"}],["line",{x1:"4",x2:"20",y1:"6",y2:"6",key:"1owob3"}],["line",{x1:"4",x2:"20",y1:"18",y2:"18",key:"yk5zj1"}]]);/** 332 * @license lucide-react v0.462.0 - ISC 333 * 334 * This source code is licensed under the ISC license. 335 * See the LICENSE file in the root directory of this source tree. 336 */const U_=H("MessageSquare",[["path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z",key:"1lielz"}]]);/** 337 * @license lucide-react v0.462.0 - ISC 338 * 339 * This source code is licensed under the ISC license. 340 * See the LICENSE file in the root directory of this source tree. 341 */const $_=H("Palette",[["circle",{cx:"13.5",cy:"6.5",r:".5",fill:"currentColor",key:"1okk4w"}],["circle",{cx:"17.5",cy:"10.5",r:".5",fill:"currentColor",key:"f64h9f"}],["circle",{cx:"8.5",cy:"7.5",r:".5",fill:"currentColor",key:"fotxhn"}],["circle",{cx:"6.5",cy:"12.5",r:".5",fill:"currentColor",key:"qy21gx"}],["path",{d:"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.554C21.965 6.012 17.461 2 12 2z",key:"12rzf8"}]]);/** 342 * @license lucide-react v0.462.0 - ISC 343 * 344 * This source code is licensed under the ISC license. 345 * See the LICENSE file in the root directory of this source tree. 346 */const Zx=H("Percent",[["line",{x1:"19",x2:"5",y1:"5",y2:"19",key:"1x9vlm"}],["circle",{cx:"6.5",cy:"6.5",r:"2.5",key:"4mh3h7"}],["circle",{cx:"17.5",cy:"17.5",r:"2.5",key:"1mdrzq"}]]);/** 347 * @license lucide-react v0.462.0 - ISC 348 * 349 * This source code is licensed under the ISC license. 350 * See the LICENSE file in the root directory of this source tree. 351 */const G_=H("Phone",[["path",{d:"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z",key:"foiqr5"}]]);/** 352 * @license lucide-react v0.462.0 - ISC 353 * 354 * This source code is licensed under the ISC license. 355 * See the LICENSE file in the root directory of this source tree. 356 */const H_=H("Play",[["polygon",{points:"6 3 20 12 6 21 6 3",key:"1oa8hb"}]]);/** 357 * @license lucide-react v0.462.0 - ISC 358 * 359 * This source code is licensed under the ISC license. 360 * See the LICENSE file in the root directory of this source tree. 361 */const K_=H("Quote",[["path",{d:"M16 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z",key:"rib7q0"}],["path",{d:"M5 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z",key:"1ymkrd"}]]);/** 362 * @license lucide-react v0.462.0 - ISC 363 * 364 * This source code is licensed under the ISC license. 365 * See the LICENSE file in the root directory of this source tree. 366 */const Y_=H("Rocket",[["path",{d:"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z",key:"m3
366kijz"}],["path",{d:"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z",key:"1fmvmk"}],["path",{d:"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0",key:"1f8sc4"}],["path",{d:"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5",key:"qeys4"}]]);/** 367 * @license lucide-react v0.462.0 - ISC 368 * 369 * This source code is licensed under the ISC license. 370 * See the LICENSE file in the root directory of this source tree. 371 */const of=H("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);/** 372 * @license lucide-react v0.462.0 - ISC 373 * 374 * This source code is licensed under the ISC license. 375 * See the LICENSE file in the root directory of this source tree. 376 */const Z_=H("Server",[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]]);/** 377 * @license lucide-react v0.462.0 - ISC 378 * 379 * This source code is licensed under the ISC license. 380 * See the LICENSE file in the root directory of this source tree. 381 */const lf=H("Settings",[["path",{d:"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z",key:"1qme2f"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);/** 382 * @license lucide-react v0.462.0 - ISC 383 * 384 * This source code is licensed under the ISC license. 385 * See the LICENSE file in the root directory of this source tree. 386 */const J_=H("Share2",[["circle",{cx:"18",cy:"5",r:"3",key:"gq8acd"}],["circle",{cx:"6",cy:"12",r:"3",key:"w7nqdw"}],["circle",{cx:"18",cy:"19",r:"3",key:"1xt0gg"}],["line",{x1:"8.59",x2:"15.42",y1:"13.51",y2:"17.49",key:"47mynk"}],["line",{x1:"15.41",x2:"8.59",y1:"6.51",y2:"10.49",key:"1n3mei"}]]);/** 387 * @license lucide-react v0.462.0 - ISC 388 * 389 * This source code is licensed under the ISC license. 390 * See the LICENSE file in the root directory of this source tree. 391 */const Xo=H("Shield",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]]);/** 392 * @license lucide-react v0.462.0 - ISC 393 * 394 * This source code is licensed under the ISC license. 395 * See the LICENSE file in the root directory of this source tree. 396 */const Jx=H("SlidersHorizontal",[["line",{x1:"21",x2:"14",y1:"4",y2:"4",key:"obuewd"}],["line",{x1:"10",x2:"3",y1:"4",y2:"4",key:"1q6298"}],["line",{x1:"21",x2:"12",y1:"12",y2:"12",key:"1iu8h1"}],["line",{x1:"8",x2:"3",y1:"12",y2:"12",key:"ntss68"}],["line",{x1:"21",x2:"16",y1:"20",y2:"20",key:"14d8ph"}],["line",{x1:"12",x2:"3",y1:"20",y2:"20",key:"m0wm8r"}],["line",{x1:"14",x2:"14",y1:"2",y2:"6",key:"14e1ph"}],["line",{x1:"8",x2:"8",y1:"10",y2:"14",key:"1i6ji0"}],["line",{x1:"16",x2:"16",y1:"18",y2:"22",key:"1lctlv"}]]);/** 397 * @license lucide-react v0.462.0 - ISC 398 * 399 * This source code is licensed under the ISC license. 400 * See the LICENSE file in the root directory of this source tree. 401 */const da=H("Sparkles",[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]]);/** 402 * @license lucide-react v0.462.0 - ISC 403 * 404 * This source code is licensed under the ISC license. 405 * See the LICENSE file in the root directory of this source tree. 406 */const Q_=H("Star",[["path",{d:"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z",key:"r04s7s"}]]);/** 407 * @license lucide-react v0.462.0 - ISC 408 * 409 * This source code is licensed under the ISC license. 410 * See the LICENSE file in the root directory of this source tree. 411 */const df=H("Target",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["circle",{cx:"12",cy:"12",r:"6",key:"1vlfrh"}],["circle",{cx:"12",cy:"12",r:"2",key:"1c9p78"}]]);/** 412 * @license lucide-react v0.462.0 - ISC 413 * 414 * This source code is licensed under the ISC license. 415 * See the LICENSE file in the root directory of this source tree. 416 */const X_=H("Terminal",[["polyline",{points:"4 17 10 11 4 5",key:"akl6gq"}],["line",{x1:"12",x2:"20",y1:"19",y2:"19",key:"q2wloq"}]]);/** 417 * @license lucide-react v0.462.0 - ISC 418 * 419 * This source code is licensed under the ISC license. 420 * See the LICENSE file in the root directory of this source tree.
421 */const Vs=H("TrendingUp",[["polyline",{points:"22 7 13.5 15.5 8.5 10.5 2 17",key:"126l90"}],["polyline",{points:"16 7 22 7 22 13",key:"kwv8wd"}]]);/** 422 * @license lucide-react v0.462.0 - ISC 423 * 424 * This source code is licensed under the ISC license. 425 * See the LICENSE file in the root directory of this source tree. 426 */const eT=H("TriangleAlert",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);/** 427 * @license lucide-react v0.462.0 - ISC 428 * 429 * This source code is licensed under the ISC license. 430 * See the LICENSE file in the root directory of this source tree. 431 */const tT=H("Upload",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"17 8 12 3 7 8",key:"t8dd8p"}],["line",{x1:"12",x2:"12",y1:"3",y2:"15",key:"widbto"}]]);/** 432 * @license lucide-react v0.462.0 - ISC 433 * 434 * This source code is licensed under the ISC license. 435 * See the LICENSE file in the root directory of this source tree. 436 */const Ec=H("User",[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]]);/** 437 * @license lucide-react v0.462.0 - ISC 438 * 439 * This source code is licensed under the ISC license. 440 * See the LICENSE file in the root directory of this source tree. 441 */const Qx=H("Users",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["path",{d:"M16 3.13a4 4 0 0 1 0 7.75",key:"1da9ce"}]]);/** 442 * @license lucide-react v0.462.0 - ISC 443 * 444 * This source code is licensed under the ISC license. 445 * See the LICENSE file in the root directory of this source tree. 446 */const Xx=H("Video",[["path",{d:"m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5",key:"ftymec"}],["rect",{x:"2",y:"6",width:"14",height:"12",rx:"2",key:"158x01"}]]);/** 447 * @license lucide-react v0.462.0 - ISC 448 * 449 * This source code is licensed under the ISC license. 450 * See the LICENSE file in the root directory of this source tree. 451 */const e1=H("Wallet",[["path",{d:"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1",key:"18etb6"}],["path",{d:"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4",key:"xoc0q4"}]]);/** 452 * @license lucide-react v0.462.0 - ISC 453 * 454 * This source code is licensed under the ISC license. 455 * See the LICENSE file in the root directory of this source tree. 456 */const nT=H("WandSparkles",[["path",{d:"m21.64 3.64-1.28-1.28a1.21 1.21 0 0 0-1.72 0L2.36 18.64a1.21 1.21 0 0 0 0 1.72l1.28 1.28a1.2 1.2 0 0 0 1.72 0L21.64 5.36a1.2 1.2 0 0 0 0-1.72",key:"ul74o6"}],["path",{d:"m14 7 3 3",key:"1r5n42"}],["path",{d:"M5 6v4",key:"ilb8ba"}],["path",{d:"M19 14v4",key:"blhpug"}],["path",{d:"M10 2v2",key:"7u0qdc"}],["path",{d:"M7 8H3",key:"zfb6yr"}],["path",{d:"M21 16h-4",key:"1cnmox"}],["path",{d:"M11 3H9",key:"1obp7u"}]]);/** 457 * @license lucide-react v0.462.0 - ISC 458 * 459 * This source code is licensed under the ISC license. 460 * See the LICENSE file in the root directory of this source tree. 461 */const rT=H("Wifi",[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M2 8.82a15 15 0 0 1 20 0",key:"dnpr2z"}],["path",{d:"M5 12.859a10 10 0 0 1 14 0",key:"1x1e6c"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}]]);/** 462 * @license lucide-react v0.462.0 - ISC 463 * 464 * This source code is licensed under the ISC license. 465 * See the LICENSE file in the root directory of this source tree. 466 */const t1=H("Wrench",[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z",key:"cbrjhi"}]]);/** 467 * @license lucide-react v0.462.0 - ISC 468 * 469 * This source code is licensed under the ISC license. 470 * See the LICENSE file in the root directory of this source tree. 471 */const bu=H("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);/** 472 * @license lucide-react v0.462.0 - ISC 473 * 474 * This source code is licensed under the ISC license. 475 * See the LICENSE file in the root directory of this source tree. 476 */const cf=H("Zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]),uf="-",aT=e=>{const t=sT(e),{conflictingClassGroups:n,conflictingClassGroupModifiers:r}=e;return{getClassGroupId:s=>{const l=s.split(uf);return l[0]===""&&l.length!==1&&l.shift(),n1(l,t)||iT(s)},getConflictingClassGroupIds:(s,l)=>{const d=n[s]||[];return l&&r[s]?[...d,...r[s]]:d}}},n1=(e,t)=>{var s;if(e.length===0)return t.classGroupId;const n=e[0],r=t.nextPart.get(n),a=r?n1(e.slice(1),r):void 0;if(a)return a;
vendor: 5,408 bytes, line 476
476if(t.validators.length===0)return;const i=e.join(uf);return(s=t.validators.find(({validator:l})=>l(i)))==null?void 0:s.classGroupId},Fb=/^\[(.+)\]$/,iT=e=>{if(Fb.test(e)){const t=Fb.exec(e)[1],n=t==null?void 0:t.substring(0,t.indexOf(":"));if(n)return"arbitrary.."+n}},sT=e=>{const{theme:t,prefix:n}=e,r={nextPart:new Map,validators:[]};return lT(Object.entries(e.classGroups),n).forEach(([i,s])=>{ug(s,r,i,t)}),r},ug=(e,t,n,r)=>{e.forEach(a=>{if(typeof a=="string"){const i=a===""?t:Ob(t,a);i.classGroupId=n;return}if(typeof a=="function"){if(oT(a)){ug(a(r),t,n,r);return}t.validators.push({validator:a,classGroupId:n});return}Object.entries(a).forEach(([i,s])=>{ug(s,Ob(t,i),n,r)})})},Ob=(e,t)=>{let n=e;return t.split(uf).forEach(r=>{n.nextPart.has(r)||n.nextPart.set(r,{nextPart:new Map,validators:[]}),n=n.nextPart.get(r)}),n},oT=e=>e.isThemeGetter,lT=(e,t)=>t?e.map(([n,r])=>{const a=r.map(i=>typeof i=="string"?t+i:typeof i=="object"?Object.fromEntries(Object.entries(i).map(([s,l])=>[t+s,l])):i);return[n,a]}):e,dT=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,n=new Map,r=new Map;const a=(i,s)=>{n.set(i,s),t++,t>e&&(t=0,r=n,n=new Map)};return{get(i){let s=n.get(i);if(s!==void 0)return s;if((s=r.get(i))!==void 0)return a(i,s),s},set(i,s){n.has(i)?n.set(i,s):a(i,s)}}},r1="!",cT=e=>{const{separator:t,experimentalParseClassName:n}=e,r=t.length===1,a=t[0],i=t.length,s=l=>{const d=[];let c=0,u=0,m;for(let k=0;k<l.length;k++){let w=l[k];if(c===0){if(w===a&&(r||l.slice(k,k+i)===t)){d.push(l.slice(u,k)),u=k+i;continue}if(w==="/"){m=k;continue}}w==="["?c++:w==="]"&&c--}const p=d.length===0?l:l.substring(u),h=p.startsWith(r1),b=h?p.substring(1):p,f=m&&m>u?m-u:void 0;return{modifiers:d,hasImportantModifier:h,baseClassName:b,maybePostfixModifierPosition:f}};return n?l=>n({className:l,parseClassName:s}):s},uT=e=>{if(e.length<=1)return e;const t=[];let n=[];return e.forEach(r=>{r[0]==="["?(t.push(...n.sort(),r),n=[]):n.push(r)}),t.push(...n.sort()),t},mT=e=>({cache:dT(e.cacheSize),parseClassName:cT(e),...aT(e)}),pT=/\s+/,gT=(e,t)=>{const{parseClassName:n,getClassGroupId:r,getConflictingClassGroupIds:a}=t,i=[],s=e.trim().split(pT);let l="";for(let d=s.length-1;d>=0;d-=1){const c=s[d],{modifiers:u,hasImportantModifier:m,baseClassName:p,maybePostfixModifierPosition:h}=n(c);let b=!!h,f=r(b?p.substring(0,h):p);if(!f){if(!b){l=c+(l.length>0?" "+l:l);continue}if(f=r(p),!f){l=c+(l.length>0?" "+l:l);continue}b=!1}const k=uT(u).join(":"),w=m?k+r1:k,v=w+f;if(i.includes(v))continue;i.push(v);const y=a(f,b);for(let x=0;x<y.length;++x){const A=y[x];i.push(w+A)}l=c+(l.length>0?" "+l:l)}return l};function hT(){let e=0,t,n,r="";for(;e<arguments.length;)(t=arguments[e++])&&(n=a1(t))&&(r&&(r+=" "),r+=n);return r}const a1=e=>{if(typeof e=="string")return e;let t,n="";for(let r=0;r<e.length;r++)e[r]&&(t=a1(e[r]))&&(n&&(n+=" "),n+=t);return n};function fT(e,...t){let n,r,a,i=s;function s(d){const c=t.reduce((u,m)=>m(u),e());return n=mT(c),r=n.cache.get,a=n.cache.set,i=l,l(d)}function l(d){const c=r(d);if(c)return c;const u=gT(d,n);return a(d,u),u}return function(){return i(hT.apply(null,arguments))}}const We=e=>{const t=n=>n[e]||[];return t.isThemeGetter=!0,t},i1=/^\[(?:([a-z-]+):)?(.+)\]$/i,vT=/^\d+\/\d+$/,bT=new Set(["px","full","screen"]),yT=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,wT=/\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$/,kT=/^(rgba?|hsla?|hwb|(ok)?(lab|lch))\(.+\)$/,xT=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,jT=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,ur=e=>rs(e)||bT.has(e)||vT.test(e),zr=e=>Ws(e,"length",DT),rs=e=>!!e&&!Number.isNaN(Number(e)),Cm=e=>Ws(e,"number",rs),co=e=>!!e&&Number.isInteger(Number(e)),AT=e=>e.endsWith("%")&&rs(e.slice(0,-1)),we=e=>i1.test(e),Ir=e=>yT.test(e),ET=new Set(["length","size","percentage"]),PT=e=>Ws(e,ET,s1),CT=e=>Ws(e,"position",s1),ST=new Set(["image","url"]),_T=e=>Ws(e,ST,zT),TT=e=>Ws(e,"",RT),uo=()=>!0,Ws=(e,t,n)=>{const r=i1.exec(e);return r?r[1]?typeof t=="string"?r[1]===t:t.has(r[1]):n(r[2]):!1},DT=e=>wT.test(e)&&!kT.test(e),s1=()=>!1,RT=e=>xT.test(e),zT=e=>jT.test(e),IT=()=>{const e=We("colors"),t=We("spacing"),n=We("blur"),r=We("brightness"),a=We("borderColor"),i=We("borderRadius"),s=We("borderSpacing"),l=We("borderWidth"),d=We("contrast"),c=We("grayscale"),u=We("hueRotate"),m=We("invert"),p=We("gap"),h=We("gradientColorStops"),b=We("gradientColorStopPositions"),f=We("inset"),k=We("margin"),w=We("opacity"),v=We("padding"),y=We("saturate"),x=We("scale"),A=We("sepia"),E=We("skew"),j=We("space"),P=We("translate"),S=()=>["auto","contain","none"],_=()=>["auto","hidden","clip","visible","scroll"],G=()=>["auto",we,t],B=()=>[we,t],Q=()=>["",ur,zr],N=()=>["auto",rs,we],ie=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],Y=()=>["solid","dashed","dotted","double","none"],te=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],C=()=>["start","end","center","between","around","evenly","stretch"],z=()=>["","0",we],Z=()=>["auto","avoid","all","avoid-page","page","left","right","column"],K=()=>[rs,we];return{cacheSize:500,separator:":",theme:{colors:[uo],spacing:[ur,zr],blur:["none","",Ir,
vendor: 11,577 bytes, line 476
476we],brightness:K(),borderColor:[e],borderRadius:["none","","full",Ir,we],borderSpacing:B(),borderWidth:Q(),contrast:K(),grayscale:z(),hueRotate:K(),invert:z(),gap:B(),gradientColorStops:[e],gradientColorStopPositions:[AT,zr],inset:G(),margin:G(),opacity:K(),padding:B(),saturate:K(),scale:K(),sepia:z(),skew:K(),space:B(),translate:B()},classGroups:{aspect:[{aspect:["auto","square","video",we]}],container:["container"],columns:[{columns:[Ir]}],"break-after":[{"break-after":Z()}],"break-before":[{"break-before":Z()}],"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"],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:[...ie(),we]}],overflow:[{overflow:_()}],"overflow-x":[{"overflow-x":_()}],"overflow-y":[{"overflow-y":_()}],overscroll:[{overscroll:S()}],"overscroll-x":[{"overscroll-x":S()}],"overscroll-y":[{"overscroll-y":S()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[f]}],"inset-x":[{"inset-x":[f]}],"inset-y":[{"inset-y":[f]}],start:[{start:[f]}],end:[{end:[f]}],top:[{top:[f]}],right:[{right:[f]}],bottom:[{bottom:[f]}],left:[{left:[f]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",co,we]}],basis:[{basis:G()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",we]}],grow:[{grow:z()}],shrink:[{shrink:z()}],order:[{order:["first","last","none",co,we]}],"grid-cols":[{"grid-cols":[uo]}],"col-start-end":[{col:["auto",{span:["full",co,we]},we]}],"col-start":[{"col-start":N()}],"col-end":[{"col-end":N()}],"grid-rows":[{"grid-rows":[uo]}],"row-start-end":[{row:["auto",{span:[co,we]},we]}],"row-start":[{"row-start":N()}],"row-end":[{"row-end":N()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",we]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",we]}],gap:[{gap:[p]}],"gap-x":[{"gap-x":[p]}],"gap-y":[{"gap-y":[p]}],"justify-content":[{justify:["normal",...C()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...C(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...C(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[v]}],px:[{px:[v]}],py:[{py:[v]}],ps:[{ps:[v]}],pe:[{pe:[v]}],pt:[{pt:[v]}],pr:[{pr:[v]}],pb:[{pb:[v]}],pl:[{pl:[v]}],m:[{m:[k]}],mx:[{mx:[k]}],my:[{my:[k]}],ms:[{ms:[k]}],me:[{me:[k]}],mt:[{mt:[k]}],mr:[{mr:[k]}],mb:[{mb:[k]}],ml:[{ml:[k]}],"space-x":[{"space-x":[j]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[j]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",we,t]}],"min-w":[{"min-w":[we,t,"min","max","fit"]}],"max-w":[{"max-w":[we,t,"none","full","min","max","fit","prose",{screen:[Ir]},Ir]}],h:[{h:[we,t,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[we,t,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[we,t,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[we,t,"auto","min","max","fit"]}],"font-size":[{text:["base",Ir,zr]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",Cm]}],"font-family":[{font:[uo]}],"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-fractons"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",we]}],"line-clamp":[{"line-clamp":["none",rs,Cm]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",ur,we]}],"list-image":[{"list-image":["none",we]}],"list-style-type":[{list:["none","disc","decimal",we]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[w]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[w]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...Y(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",ur,zr]}],"underline-offset":[{"underline-offset":["auto",ur,we]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:B()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",we]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",we]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[w]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...ie(),CT]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",PT]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},_T]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[b]}],"gradient-via-pos":[{via:[b]}],"gradient-to-pos":[{to:[b]}],"gradient-from":[{from:[h]}],"gradient-via":[{via:[h]}],"gradient-to":[{to:[h]}],rounded:[{rounded:[i]}],"rounded-s":[{"rounded-s":[i]}],"rounded-e":[{"rounded-e":[i]}],"rounded-t":[{"rounded-t":[i]}],"rounded-r":[{"rounded-r":[i]}],"rounded-b":[{"rounded-b":[i]}],"rounded-l":[{"rounded-l":[i]}],"rounded-ss":[{"rounded-ss":[i]}],"rounded-se":[{"rounded-se":[i]}],"rounded-ee":[{"rounded-ee":[i]}],"rounded-es":[{"rounded-es":[i]}],"rounded-tl":[{"rounded-tl":[i]}],"rounded-tr":[{"rounded-tr":[i]}],"rounded-br":[{"rounded-br":[i]}],"rounded-bl":[{"rounded-bl":[i]}],"border-w":[{border:[l]}],"border-w-x":[{"border-x":[l]}],"border-w-y":[{"border-y":[l]}],"border-w-s":[{"border-s":[l]}],"border-w-e":[{"border-e":[l]}],"border-w-t":[{"border-t":[l]}],"border-w-r":[{"border-r":[l]}],"border-w-b":[{"border-b":[l]}],"border-w-l":[{"border-l":[l]}],"border-opacity":[{"border-opacity":[w]}],"border-style":[{border:[...Y(),"hidden"]}],"divide-x":[{"divide-x":[l]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[l]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[w]}],"divide-style":[{divide:Y()}],"border-color":[{border:[a]}],"border-color-x":[{"border-x":[a]}],"border-color-y":[{"border-y":[a]}],"border-color-s":[{"border-s":[a]}],"border-color-e":[{"border-e":[a]}],"border-color-t":[{"border-t":[a]}],"border-color-r":[{"border-r":[a]}],"border-color-b":[{"border-b":[a]}],"border-color-l":[{"border-l":[a]}],"divide-color":[{divide:[a]}],"outline-style":[{outline:["",...Y()]}],"outline-offset":[{"outline-offset":[ur,we]}],"outline-w":[{outline:[ur,zr]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:Q()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[w]}],"ring-offset-w":[{"ring-offset":[ur,zr]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",Ir,TT]}],"shadow-color":[{shadow:[uo]}],opacity:[{opacity:[w]}],"mix-blend":[{"mix-blend":[...te(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":te()}],filter:[{filter:["","none"]}],blur:[{blur:[n]}],brightness:[{brightness:[r]}],contrast:[{contrast:[d]}],"drop-shadow":[{"drop-shadow":["","none",Ir,we]}],grayscale:[{grayscale:[c]}],"hue-rotate":[{"hue-rotate":[u]}],invert:[{invert:[m]}],saturate:[{saturate:[y]}],sepia:[{sepia:[A]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[n]}],"backdrop-brightness":[{"backdrop-brightness":[r]}],"backdrop-contrast":[{"backdrop-contrast":[d]}],"backdrop-grayscale":[{"backdrop-grayscale":[c]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[u]}],"backdrop-invert":[{"backdrop-invert":[m]}],"backdrop-opacity":[{"backdrop-opacity":[w]}],"backdrop-saturate":[{"backdrop-saturate":[y]}],"backdrop-sepia":[{"backdrop-sepia":[A]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[s]}],"border-spacing-x":[{"border-spacing-x":[s]}],"border-spacing-y":[{"border-spacing-y":[s]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",we]}],duration:[{duration:K()}],ease:[{ease:["linear","in","out","in-out",we]}],delay:[{delay:K()}],animate:[{animate:["none","spin","ping","pulse","bounce",we]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[x]}],"scale-x":[{"scale-x":[x]}],"scale-y":[{"scale-y":[x]}],rotate:[{rotate:[co,we]}],"translate-x":[{"translate-x":[P]}],"translate-y":[{"translate-y":[P]}],"skew-x":[{"skew-x":[E]}],"skew-y":[{"skew-y":[E]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",we]}],accent:[{accent:["auto",e]}],appearance:[{appearance:["none","auto"]}],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",we]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":B()}],"scroll-mx":[{"scroll-mx":B()}],"scroll-my":[{"scroll-my":B()}],"scroll-ms":[{"scroll-ms":B()}],"scroll-me":[{"scroll-me":B()}],"scroll-mt":[{"scroll-mt":B()}],"scroll-mr":[{"scroll-mr":B()}],"scroll-mb":[{"scroll-mb":B()}],"scroll-ml":[{"scroll-ml":B()}],"scroll-p":[{"scroll-p":B()}],"scroll-px":[{"scroll-px":B()}],"scroll-py":[{"scroll-py":B()}],"scroll-ps":[{"scroll-ps":B()}],"scroll-pe":[{"scroll-pe":B()}],"scroll-pt":[{"scroll-pt":B()}],"scroll-pr":[{"scroll-pr":B()}],"scroll-pb":[{"scroll-pb":B()}],"scroll-pl":[{"scroll-pl":B()}],"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"]}
476],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",we]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[ur,zr,Cm]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","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","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","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-s","border-w-e","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-s","border-color-e","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"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","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-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"]}}},qT=fT(IT);function le(...e){return qT(Nx(e))}const NT=g_,o1=g.forwardRef(({className:e,...t},n)=>o.jsx(_x,{ref:n,className:le("fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]",e),...t}));o1.displayName=_x.displayName;const LT=vu("group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full",{variants:{variant:{default:"border bg-background text-foreground",destructive:"destructive group border-destructive bg-destructive text-destructive-foreground"}},defaultVariants:{variant:"default"}}),l1=g.forwardRef(({className:e,variant:t,...n},r)=>o.jsx(Tx,{ref:r,className:le(LT({variant:t}),e),...n}));l1.displayName=Tx.displayName;const BT=g.forwardRef(({className:e,...t},n)=>o.jsx(zx,{ref:n,className:le("inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors hover:bg-secondary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive",e),...t}));BT.displayName=zx.displayName;const d1=g.forwardRef(({className:e,...t},n)=>o.jsx(Ix,{ref:n,className:le("absolute right-2 top-2 rounded-md p-1 text-foreground
476/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600",e),"toast-close":"",...t,children:o.jsx(bu,{className:"h-4 w-4"})}));d1.displayName=Ix.displayName;const c1=g.forwardRef(({className:e,...t},n)=>o.jsx(Dx,{ref:n,className:le("text-sm font-semibold",e),...t}));c1.displayName=Dx.displayName;const u1=g.forwardRef(({className:e,...t},n)=>o.jsx(Rx,{ref:n,className:le("text-sm opacity-90",e),...t}));u1.displayName=Rx.displayName;function MT(){const{toasts:e}=lx();return o.jsxs(NT,{children:[e.map(function({id:t,title:n,description:r,action:a,...i}){return o.jsxs(l1,{...i,children:[o.jsxs("div",{className:"grid gap-1",children:[n&&o.jsx(c1,{children:n}),r&&o.jsx(u1,{children:r})]}),a,o.jsx(d1,{})]},t)}),o.jsx(o1,{})]})}var Vb=["light","dark"],FT="(prefers-color-scheme: dark)",OT=g.createContext(void 0),VT={setTheme:e=>{},themes:[]},WT=()=>{var e;return(e=g.useContext(OT))!=null?e:VT};g.memo(({forcedTheme:e,storageKey:t,attribute:n,enableSystem:r,enableColorScheme:a,defaultTheme:i,value:s,attrs:l,nonce:d})=>{let c=i==="system",u=n==="class"?`var d=document.documentElement,c=d.classList;${`c.remove(${l.map(b=>`'${b}'`).join(",")})`};`:`var d=document.documentElement,n='${n}',s='setAttribute';`,m=a?Vb.includes(i)&&i?`if(e==='light'||e==='dark'||!e)d.style.colorScheme=e||'${i}'`:"if(e==='light'||e==='dark')d.style.colorScheme=e":"",p=(b,f=!1,k=!0)=>{let w=s?s[b]:b,v=f?b+"|| ''":`'${w}'`,y="";return a&&k&&!f&&Vb.includes(b)&&(y+=`d.style.colorScheme = '${b}';`),n==="class"?f||w?y+=`c.add(${v})`:y+="null":w&&(y+=`d[s](n,${v})`),y},h=e?`!function(){${u}${p(e)}}()`:r?`!function(){try{${u}var e=localStorage.getItem('${t}');if('system'===e||(!e&&${c})){var t='${FT}',m=window.matchMedia(t);if(m.media!==t||m.matches){${p("dark")}}else{${p("light")}}}else if(e){${s?`var x=${JSON.stringify(s)};`:""}${p(s?"x[e]":"e",!0)}}${c?"":"else{"+p(i,!1,!1)+"}"}${m}}catch(e){}}()`:`!function(){try{${u}var e=localStorage.getItem('${t}');if(e){${s?`var x=${JSON.stringify(s)};`:""}${p(s?"x[e]":"e",!0)}}else{${p(i,!1,!1)};}${m}}catch(t){}}();`;return g.createElement("script",{nonce:d,dangerouslySetInnerHTML:{__html:h}})});var UT=e=>{switch(e){case"success":return HT;case"info":return YT;case"warning":return KT;case"error":return ZT;default:return null}},$T=Array(12).fill(0),GT=({visible:e})=>I.createElement("div",{className:"sonner-loading-wrapper","data-visible":e},I.createElement("div",{className:"sonner-spinner"},$T.map((t,n)=>I.createElement("div",{className:"sonner-loading-bar",key:`spinner-bar-${n}`})))),HT=I.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},I.createElement("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z",clipRule:"evenodd"})),KT=I.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",height:"20",width:"20"},I.createElement("path",{fillRule:"evenodd",d:"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z",clipRule:"evenodd"})),YT=I.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},I.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z",clipRule:"evenodd"})),ZT=I.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},I.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z",clipRule:"evenodd"})),JT=()=>
476{let[e,t]=I.useState(document.hidden);return I.useEffect(()=>{let n=()=>{t(document.hidden)};return document.addEventListener("visibilitychange",n),()=>window.removeEventListener("visibilitychange",n)},[]),e},mg=1,QT=class{constructor(){this.subscribe=e=>(this.subscribers.push(e),()=>{let t=this.subscribers.indexOf(e);this.subscribers.splice(t,1)}),this.publish=e=>{this.subscribers.forEach(t=>t(e))},this.addToast=e=>{this.publish(e),this.toasts=[...this.toasts,e]},this.create=e=>{var t;let{message:n,...r}=e,a=typeof(e==null?void 0:e.id)=="number"||((t=e.id)==null?void 0:t.length)>0?e.id:mg++,i=this.toasts.find(l=>l.id===a),s=e.dismissible===void 0?!0:e.dismissible;return i?this.toasts=this.toasts.map(l=>l.id===a?(this.publish({...l,...e,id:a,title:n}),{...l,...e,id:a,dismissible:s,title:n}):l):this.addToast({title:n,...r,dismissible:s,id:a}),a},this.dismiss=e=>(e||this.toasts.forEach(t=>{this.subscribers.forEach(n=>n({id:t.id,dismiss:!0}))}),this.subscribers.forEach(t=>t({id:e,dismiss:!0})),e),this.message=(e,t)=>this.create({...t,message:e}),this.error=(e,t)=>this.create({...t,message:e,type:"error"}),this.success=(e,t)=>this.create({...t,type:"success",message:e}),this.info=(e,t)=>this.create({...t,type:"info",message:e}),this.warning=(e,t)=>this.create({...t,type:"warning",message:e}),this.loading=(e,t)=>
476this.create({...t,type:"loading",message:e}),this.promise=(e,t)=>{if(!t)return;let n;t.loading!==void 0&&(n=this.create({...t,promise:e,type:"loading",message:t.loading,description:typeof t.description!="function"?t.description:void 0}));let r=e instanceof Promise?e:e(),a=n!==void 0;return r.then(async i=>{if(eD(i)&&!i.ok){a=!1;let s=typeof t.error=="function"?await t.error(`HTTP error! status: ${i.status}`):t.error,l=typeof t.description=="function"?await t.description(`HTTP error! status: ${i.status}`):t.description;this.create({id:n,type:"error",message:s,description:l})}else if(t.success!==void 0){a=!1;let s=typeof t.success=="function"?await t.success(i):t.success,l=typeof t.description=="function"?await t.description(i):t.description;this.create({id:n,type:"success",message:s,description:l})}}).catch(async i=>{if(t.error!==void 0){a=!1;let s=typeof t.error=="function"?await t.error(i):t.error,l=typeof t.description=="function"?await t.description(i):t.description;this.create({id:n,type:"error",message:s,description:l})}}).finally(()=>{var i;a&&(this.dismiss(n),n=void 0),(i=t.finally)==null||i.call(t)}),n},this.custom=(e,t)=>{let n=(t==null?void 0:t.id)||mg++;return this.create({jsx:e(n),id:n,...t}),n},this.subscribers=[],this.toasts=[]}},Kt=new QT,XT=(e,t)=>{let n=(t==null?void 0:t.id)||mg++;return Kt.addToast({title:e,...t,id:n}),n},eD=e=>e&&typeof e=="object"&&"ok"in e&&typeof e.ok=="boolean"&&"status"in e&&typeof e.status=="number",tD=XT,nD=()=>Kt.toasts,st=Object.assign(tD,{success:Kt.success,info:Kt.info,warning:Kt.warning,error:Kt.error,custom:Kt.custom,message:Kt.message,promise:Kt.promise,dismiss:Kt.dismiss,loading:Kt.loading},{getHistory:nD});function rD(e,{insertAt:t}={}){if(typeof document>"u")return;let n=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css",t==="top"&&n.firstChild?n.insertBefore(r,n.firstChild):n.appendChild(r),r.styleSheet?r.styleSheet.cssText=e:r.appendChild(document.createTextNode(e))}rD(`:where(html[dir="ltr"]),:where([data-sonner-toaster][dir="ltr"]){--toast-icon-margin-start: -3px;--toast-icon-margin-end: 4px;--toast-svg-margin-start: -1px;--toast-svg-margin-end: 0px;--toast-button-margin-start: auto;--toast-button-margin-end: 0;--toast-close-button-start: 0;--toast-close-button-end: unset;--toast-close-button-transform: translate(-35%, -35%)}:where(html[dir="rtl"]),:where([data-sonner-toaster][dir="rtl"]){--toast-icon-margin-start: 4px;--toast-icon-margin-end: -3px;--toast-svg-margin-start: 0px;--toast-svg-margin-end: -1px;--toast-button-margin-start: 0;--toast-button-margin-end: auto;--toast-close-button-start: unset;--toast-close-button-end: 0;--toast-close-button-transform: translate(35%, -35%)}:where([data-sonner-toaster]){position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1: hsl(0, 0%, 99%);--gray2: hsl(0, 0%, 97.3%);--gray3: hsl(0, 0%, 95.1%);--gray4: hsl(0, 0%, 93%);--gray5: hsl(0, 0%, 90.9%);--gray6: hsl(0, 0%, 88.7%);--gray7: hsl(0, 0%, 85.8%);--gray8: hsl(0, 0%, 78%);--gray9: hsl(0, 0%, 56.1%);--gray10: hsl(0, 0%, 52.3%);--gray11: hsl(0, 0%, 43.5%);--gray12: hsl(0, 0%, 9%);--border-radius: 8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:none;z-index:999999999}:where([data-sonner-toaster][data-x-position="right"]){right:max(var(--offset),env(safe-area-inset-right))}:where([data-sonner-toaster][data-x-position="left"]){left:max(var(--offset),env(safe-area-inset-left))}:where([data-sonner-toaster][data-x-position="center"]){left:50%;transform:translate(-50%)}:where([data-sonner-toaster][data-y-position="top"]){top:max(var(--offset),env(safe-area-inset-top))}:where([data-sonner-toaster][data-y-position="bottom"]){bottom:max(var(--offset),env(safe-area-inset-bottom))}:where([data-sonner-toast]){--y: translateY(100%);--lift-amount: calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);filter:blur(0);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:none;overflow-wrap:anywhere}:where([data-sonner-toast][data-styled="true"]){padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px #0000001a;width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}:where([data-sonner-toast]:focus-visible){box-shadow:0 4px 12px #0000001a,0 0 0 2px #0003}:where([data-sonner-toast][data-y-position="top"]){top:0;--y: translateY(-100%);--lift: 1;--lift-amount: calc(1 * var(--gap))}:where([data-sonner-toast][data-y-position="bottom"]){bottom:0;--y: translateY(100%);--lift: -1;--lift-amount: calc(var(--lift) * var(--gap))}:where([data-sonner-toast]) :where([data-description]){font-weight:400;line-height:1.4;color:inherit}:where([data-sonner-toast]) :where([data-title]){font-weight:500;line-height:1.5;color:inherit}:where([data-sonner-toast]) :where([data-icon]){display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}:where([data-sonner-toast][data-promise="true"]) :where([data-icon])>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}:where([data-sonner-toast]) :where([data-icon])>*{flex-shrink:0}:where([data-sonner-toast]) :where([data-icon]) svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}:where([data-sonner-toast]) :where([data-content]){display:flex;flex-direction:column;gap:2px}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;cursor:pointer;outline:none;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}:where([data-sonner-toast]) :where([data-button]):focus-visible{box-shadow:0 0 0 2px #0006}:where([data-sonner-toast]) :where([data-button]):first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}:where([data-sonner-toast]) :where([data-cancel]){color:var(--normal-text);background:rgba(0,0,0,.08)}:where([data-sonner-toast][data-theme="dark"]) :where([data-cancel]){background:rgba(255,255,255,.3)}:where([data-sonner-toast]) :where([data-close-button]){position:absolute;
476left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;background:var(--gray1);color:var(--gray12);border:1px solid var(--gray4);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}:where([data-sonner-toast]) :where([data-close-button]):focus-visible{box-shadow:0 4px 12px #0000001a,0 0 0 2px #0003}:where([data-sonner-toast]) :where([data-disabled="true"]){cursor:not-allowed}:where([data-sonner-toast]):hover :where([data-close-button]):hover{background:var(--gray2);border-color:var(--gray5)}:where([data-sonner-toast][data-swiping="true"]):before{content:"";position:absolute;left:0;right:0;height:100%;z-index:-1}:where([data-sonner-toast][data-y-position="top"][data-swiping="true"]):before{bottom:50%;transform:scaleY(3) translateY(50%)}:where([data-sonner-toast][data-y-position="bottom"][data-swiping="true"]):before{top:50%;transform:scaleY(3) translateY(-50%)}:where([data-sonner-toast][data-swiping="false"][data-removed="true"]):before{content:"";position:absolute;inset:0;transform:scaleY(2)}:where([data-sonner-toast]):after{content:"";position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}:where([data-sonner-toast][data-mounted="true"]){--y: translateY(0);opacity:1}:where([data-sonner-toast][data-expanded="false"][data-front="false"]){--scale: var(--toasts-before) * .05 + 1;--y: translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}:where([data-sonner-toast])>*{transition:opacity .4s}:where([data-sonner-toast][data-expanded="false"][data-front="false"][data-styled="true"])>*{opacity:0}
476:where([data-sonner-toast][data-visible="false"]){opacity:0;pointer-events:none}:where([data-sonner-toast][data-mounted="true"][data-expanded="true"]){--y: translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}:where([data-sonner-toast][data-removed="true"][data-front="true"][data-swipe-out="false"]){--y: translateY(calc(var(--lift) * -100%));opacity:0}:where([data-sonner-toast][data-removed="true"][data-front="false"][data-swipe-out="false"][data-expanded="true"]){--y: translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}:where([data-sonner-toast][data-removed="true"][data-front="false"][data-swipe-out="false"][data-expanded="false"]){--y: translateY(40%);opacity:0;transition:transform .5s,opacity .2s}:where([data-sonner-toast][data-removed="true"][data-front="false"]):before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount, 0px));transition:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation:swipe-out .2s ease-out forwards}@keyframes swipe-out{0%{transform:translateY(calc(var(--lift) * var(--offset) + var(--swipe-amount)));opacity:1}to{transform:translateY(calc(var(--lift) * var(--offset) + var(--swipe-amount) + var(--lift) * -100%));opacity:0}}@media (max-width: 600px){[data-sonner-toaster]{position:fixed;--mobile-offset: 16px;right:var(--mobile-offset);left:var(--mobile-offset);width:100%}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset)}[data-sonner-toaster][data-y-position=bottom]{bottom:20px}[data-sonner-toaster][data-y-position=top]{top:20px}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset);right:var(--mobile-offset);transform:none}}[data-sonner-toaster][data-theme=light]{--normal-bg: #fff;--normal-border: var(--gray4);--normal-text: var(--gray12);--success-bg: hsl(143, 85%, 96%);--success-border: hsl(145, 92%, 91%);--success-text: hsl(140, 100%, 27%);--info-bg: hsl(208, 100%, 97%);--info-border: hsl(221, 91%, 91%);--info-text: hsl(210, 92%, 45%);--warning-bg: hsl(49, 100%, 97%);--warning-border: hsl(49, 91%, 91%);--warning-text: hsl(31, 92%, 45%);--error-bg: hsl(359, 100%, 97%);--error-border: hsl(359, 100%, 94%);--error-text: hsl(360, 100%, 45%)}[data-sonner-toaster][data-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg: #000;--normal-border: hsl(0, 0%, 20%);--normal-text: var(--gray1)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg: #fff;--normal-border: var(--gray3);--normal-text: var(--gray12)}[data-sonner-toaster][data-theme=dark]{--normal-bg: #000;--normal-border: hsl(0, 0%, 20%);--normal-text: var(--gray1);--success-bg: hsl(150, 100%, 6%);--success-border: hsl(147, 100%, 12%);--success-text: hsl(150, 86%, 65%);--info-bg: hsl(215, 100%, 6%);--info-border: hsl(223, 100%, 12%);--info-text: hsl(216, 87%, 65%);--warning-bg: hsl(64, 100%, 6%);--warning-border: hsl(60, 100%, 12%);--warning-text: hsl(46, 87%, 65%);--error-bg: hsl(358, 76%, 10%);--error-border: hsl(357, 89%, 16%);--error-text: hsl(358, 100%, 81%)}[data-rich-colors=true][data-sonner-toast][data-type=success],[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info],[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning],[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error],[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size: 16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:nth-child(1){animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}to{opacity:.15}}@media (prefers-reduced-motion){[data-sonner-toast],[data-sonner-toast]>*,.sonner-loading-bar{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)} 477`);function md(e){return e.label!==void 0}var aD=3,iD="32px",sD=4e3,oD=356,lD=14,dD=20,cD=200;function uD(...e){return e.filter(Boolean).join(" ")}var mD=e=>{var t,n,r,a,i,s,l,d,c,u;let{invert:m,toast:p,unstyled:h,interacting:b,setHeights:f,visibleToasts:k,heights:w,index:v,toasts:y,exp
477anded:x,removeToast:A,defaultRichColors:E,closeButton:j,style:P,cancelButtonStyle:S,actionButtonStyle:_,className:G="",descriptionClassName:B="",duration:Q,position:N,gap:ie,loadingIcon:Y,expandByDefault:te,classNames:C,icons:z,closeButtonAriaLabel:Z="Close toast",pauseWhenPageIsHidden:K,cn:X}=e,[he,M]=I.useState(!1),[U,V]=I.useState(!1),[q,$]=I.useState(!1),[pe,oe]=I.useState(!1),[ke,Ae]=I.useState(0),[He,Oe]=I.useState(0),Dt=I.useRef(null),at=I.useRef(null),Fn=v===0,Qs=v+1<=k,Ye=p.type,cr=p.dismissible!==!1,oE=p.className||"",lE=p.descriptionClassName||"",Wl=I.useMemo(()=>w.findIndex(ye=>ye.toastId===p.id)||0,[w,p.id]),dE=I.useMemo(()=>{var ye;return(ye=p.closeButton)!=null?ye:j},[p.closeButton,j]),uv=I.useMemo(()=>p.duration||Q||sD,[p.duration,Q]),$u=I.useRef(0),bi=I.useRef(0),mv=I.useRef(0),yi=I.useRef(null),[pv,cE]=N.split("-"),gv=I.useMemo(()=>w.reduce((ye,Ve,Be)=>Be>=Wl?ye:ye+Ve.height,0),[w,Wl]),hv=JT(),uE=p.invert||m,Gu=Ye==="loading";bi.current=I.useMemo(()=>Wl*ie+gv,[Wl,gv]),I.useEffect(()=>{M(!0)},[]),I.useLayoutEffect(()=>{if(!he)return;let ye=at.current,Ve=ye.style.height;ye.style.height="auto";let Be=ye.getBoundingClientRect().height;ye.style.height=Ve,Oe(Be),f(On=>On.find(Vn=>Vn.toastId===p.id)?On.map(Vn=>Vn.toastId===p.id?{...Vn,height:Be}:Vn):[{toastId:p.id,height:Be,position:p.position},...On])},[he,p.title,p.description,f,p.id]);let Dr=I.useCallback(()=>{V(!0),Ae(bi.current),f(ye=>ye.filter(Ve=>Ve.toastId!==p.id)),setTimeout(()=>{A(p)},cD)},[p,A,f,bi]);I.useEffect(()=>{if(p.promise&&Ye==="loading"||p.duration===1/0||p.type==="loading")return;let ye,Ve=uv;return x||b||K&&hv?(()=>{if(mv.current<$u.current){let Be=new Date().getTime()-$u.current;Ve=Ve-Be}mv.current=new Date().getTime()})():Ve!==1/0&&($u.current=new Date().getTime(),ye=setTimeout(()=>{var Be;(Be=p.onAutoClose)==null||Be.call(p,p),Dr()},Ve)),()=>clearTimeout(ye)},[x,b,te,p,uv,Dr,p.promise,Ye,K,hv]),I.useEffect(()=>{let ye=at.current;if(ye){let Ve=ye.getBoundingClientRect().height;return Oe(Ve),f(Be=>[{toastId:p.id,height:Ve,position:p.position},...Be]),()=>f(Be=>Be.filter(On=>On.toastId!==p.id))}},[f,p.id]),I.useEffect(()=>{p.delete&&Dr()},[Dr,p.delete]);function mE(){return z!=null&&z.loading?I.createElement("div",{className:"sonner-loader","data-visible":Ye==="loading"},z.loading):Y?I.createElement("div",{className:"sonner-loader","data-visible":Ye==="loading"},Y):I.createElement(GT,{visible:Ye==="loading"})}return I.createElement("li",{"aria-live":p.important?"assertive":"polite","aria-atomic":"true",role:"status",tabIndex:0,ref:at,className:X(G,oE,C==null?void 0:C.toast,(t=p==null?void 0:p.classNames)==null?void 0:t.toast,C==null?void 0:C.default,C==null?void 0:C[Ye],(n=p==null?void 0:p.classNames)==null?void 0:n[Ye]),"data-sonner-toast":"","data-rich-colors":(r=p.richColors)!=null?r:E,"data-styled":!(p.jsx||p.unstyled||h),"data-mounted":he,"data-promise":!!p.promise,"data-removed":U,"data-visible":Qs,"data-y-position":pv,"data-x-position":cE,"data-index":v,"data-front":Fn,"data-swiping":q,"data-dismissible":cr,"data-type":Ye,"data-invert":uE,"data-swipe-out":pe,"data-expanded":!!(x||te&&he),style:{"--index":v,"--toasts-before":v,"--z-index":y.length-v,"--offset":`${U?ke:bi.current}px`,"--initial-height":te?"auto":`${He}px`,...P,...p.style},onPointerDown:ye=>{Gu||!cr||(Dt.current=new Date,Ae(bi.current),ye.target.setPointerCapture(ye.pointerId),ye.target.tagName!=="BUTTON"&&($(!0),yi.current={x:ye.clientX,y:ye.clientY}))},onPointerUp:()=>{var ye,Ve,Be,On;if(pe||!cr)return;yi.current=null;let Vn=Number(((ye=at.current)==null?void 0:ye.style.getPropertyValue("--swipe-amount").replace("px",""))||0),Ul=new Date().getTime()-((Ve=Dt.current)==null?void 0:Ve.getTime()),pE=Math.abs(Vn)/Ul;if(Math.abs(Vn)>=dD||pE>.11){Ae(bi.current),(Be=p.onDismiss)==null||Be.call(p,p),Dr(),oe(!0);return}(On=at.current)==null||On.style.setProperty("--swipe-amount","0px"),$(!1)},onPointerMove:ye=>{var Ve;if(!yi.current||!cr)return;let Be=ye.clientY-yi.current.y,On=ye.clientX-yi.current.x,Vn=(pv==="top"?Math.min:Math.max)(0,Be),Ul=ye.pointerType==="touch"?10:2;Math.abs(Vn)>Ul?(Ve=at.current)==null||Ve.style.setProperty("--swipe-amount",`${Be}px`):Math.abs(On)>Ul&&(yi.current=null)}},dE&&!p.jsx?I.createElement("button",{"aria-label":Z,"data-disabled":Gu,"data-close-button":!0,onClick:Gu||!cr?()=>{}:()=>{var ye;Dr(),(ye=p.onDismiss)==null||ye.call(p,p)},className:X(C==null?void 0:C.closeButton,(a=p==null?void 0:p.classNames)==null?void 0:a.closeButton)},I.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"},I.createElement("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),I.createElement("line",{x1:"6",y1:"6",x2:"18",y2:"18"}))):null,p.jsx||I.isValidElement(p.title)?p.jsx||p.title:I.createElement(I.Fragment,null,Ye||p.icon||p.promise?I.createElement("div",{"data-icon":"",className:X(C==null?void 0:C.icon,(i=p==null?void 0:p.classNames)==null?void 0:i.icon)}
477,p.promise||p.type==="loading"&&!p.icon?p.icon||mE():null,p.type!=="loading"?p.icon||(z==null?void 0:z[Ye])||UT(Ye):null):null,I.createElement("div",{"data-content":"",className:X(C==null?void 0:C.content,(s=p==null?void 0:p.classNames)==null?void 0:s.content)},I.createElement("div",{"data-title":"",className:X(C==null?void 0:C.title,(l=p==null?void 0:p.classNames)==null?void 0:l.title)},p.title),p.description?I.createElement("div",{"data-description":"",className:X(B,lE,C==null?void 0:C.description,(d=p==null?void 0:p.classNames)==null?void 0:d.description)},p.description):null),I.isValidElement(p.cancel)?p.cancel:p.cancel&&md(p.cancel)?I.createElement("button",{"data-button":!0,"data-cancel":!0,style:p.cancelButtonStyle||S,onClick:ye=>{var Ve,Be;md(p.cancel)&&cr&&((Be=(Ve=p.cancel).onClick)==null||Be.call(Ve,ye),Dr())},className:X(C==null?void 0:C.cancelButton,(c=p==null?void 0:p.classNames)==null?void 0:c.cancelButton)},p.cancel.label):null,I.isValidElement(p.action)?p.action:p.action&&md(p.action)?I.createElement("button",{"data-button":!0,"data-action":!0,style:p.actionButtonStyle||_,onClick:ye=>{var Ve,Be;md(p.action)&&(ye.defaultPrevented||((Be=(Ve=p.action).onClick)==null||Be.call(Ve,ye),Dr()))},className:X(C==null?void 0:C.actionButton,(u=p==null?void 0:p.classNames)==null?void 0:u.actionButton)},p.action.label):null))};function Wb(){if(typeof window>"u"||typeof document>"u")return"ltr";let e=document.documentElement.getAttribute("dir");return e==="auto"||!e?window.getComputedStyle(document.documentElement).direction:e}var pD=e=>{let{invert:t,position:n="bottom-right",hotkey:r=["altKey","KeyT"],expand:a,closeButton:i,className:s,offset:l,theme:d="light",richColors:c,duration:u,style:m,visibleToasts:p=aD,toastOptions:h,dir:b=Wb(),gap:f=lD,loadingIcon:k,icons:w,containerAriaLabel:v="Notifications",pauseWhenPageIsHidden:y,cn:x=uD}=e,[A,E]=I.useState([]),j=I.useMemo(()=>Array.from(new Set([n].concat(A.filter(K=>K.position).map(K=>K.position)))),[A,n]),[P,S]=I.useState([]),[_,G]=I.useState(!1),[B,Q]=I.useState(!1),[N,ie]=I.useState(d!=="system"?d:typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),Y=I.useRef(null),te=r.join("+").replace(/Key/g,"").replace(/Digit/g,""),C=I.useRef(null),z=I.useRef(!1),Z=I.useCallback(K=>{var X;(X=A.find(he=>he.id===K.id))!=null&&X.delete||Kt.dismiss(K.id),E(he=>he.filter(({id:M})=>M!==K.id))},[A]);return I.useEffect(()=>Kt.subscribe(K=>{if(K.dismiss){E(X=>X.map(he=>he.id===K.id?{...he,delete:!0}:he));return}setTimeout(()=>{Qk.flushSync(()=>{E(X=>{let he=X.findIndex(M=>M.id===K.id);return he!==-1?[...X.slice(0,he),{...X[he],...K},...X.slice(he+1)]:[K,...X]})})})}),[]),I.useEffect(()=>{if(d!=="system"){ie(d);return}d==="system"&&(window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?ie("dark"):ie("light")),typeof window<"u"&&window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",({matches:K})=>{ie(K?"dark":"light")})},[d]),I.useEffect(()=>{A.length<=1&&G(!1)},[A]),I.useEffect(()=>{let K=X=>{var he,M;r.every(U=>X[U]||X.code===U)&&(G(!0),(he=Y.current)==null||he.focus()),X.code==="Escape"&&(document.activeElement===Y.current||(M=Y.current)!=null&&M.contains(document.activeElement))&&G(!1)};return document.addEventListener("keydown",K),()=>document.removeEventListener("keydown",K)},[r]),I.useEffect(()=>{if(Y.current)return()=>{C.current&&(C.current.focus({preventScroll:!0}),C.current=null,z.current=!1)}},[Y.current]),A.length?I.createElement("section",{"aria-label":`${v} ${te}`,tabIndex:-1},j.map((K,X)=>{var he;let[M,U]=K.split("-");return I.createElement("ol",{key:K,dir:b==="auto"?Wb():b,tabIndex:-1,ref:Y,className:s,"data-sonner-toaster":!0,"data-theme":N,"data-y-position":M,"data-x-position":U,style:{"--front-toast-height":`${((he=P[0])==null?void 0:he.height)||0}px`,"--offset":typeof l=="number"?`${l}px`:l||iD,"--width":`${oD}px`,"--gap":`${f}px`,...m},onBlur:V=>{z.current&&!V.currentTarget.contains(V.relatedTarget)&&(z.current=!1,C.current&&(C.current.focus({preventScroll:!0}),C.current=null))},onFocus:V=>{V.target instanceof HTMLElement&&V.target.dataset.dismissible==="false"||z.current||(z.current=!0,C.current=V.relatedTarget)},onMouseEnter:()=>G(!0),onMouseMove:()=>G(!0),onMouseLeave:()=>{B||G(!1)},onPointerDown:V=>{V.target instanceof HTMLElement&&V.target.dataset.dismissible==="false"||Q(!0)},onPointerUp:()=>Q(!1)},A.filter(V=>!V.position&&X===0||V.position===K).map((V,q)=>{var $,pe;return I.createElement(mD,{key:V.id,icons:w,index:q,toast:V,defaultRichColors:c,duration:($=h==null?void 0:h.duration)!=null?$:u,className:h==null?void 0:h.className,descriptionClassName:h==null?void 0:h.descriptionClassName,invert:t,visibleToasts:p,closeButton:(pe=h==null?void 0:h.closeButton)!=null?pe
477:i,interacting:B,position:K,style:h==null?void 0:h.style,unstyled:h==null?void 0:h.unstyled,classNames:h==null?void 0:h.classNames,cancelButtonStyle:h==null?void 0:h.cancelButtonStyle,actionButtonStyle:h==null?void 0:h.actionButtonStyle,removeToast:Z,toasts:A.filter(oe=>oe.position==V.position),heights:P.filter(oe=>oe.position==V.position),setHeights:S,expandByDefault:a,gap:f,loadingIcon:k,expanded:_,pauseWhenPageIsHidden:y,cn:x})}))})):null};const gD=({...e})=>{const{theme:t="system"}=WT();return o.jsx(pD,{theme:t,className:"toaster group",toastOptions:{classNames:{toast:"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",description:"group-[.toast]:text-muted-foreground",actionButton:"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",cancelButton:"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground"}},...e})};var hD=sh.useId||(()=>{}),fD=0;function ca(e){const[t,n]=g.useState(hD());return kt(()=>{n(r=>r??String(fD++))},[e]),t?`radix-${t}`:""}const vD=["top","right","bottom","left"],va=Math.min,Zt=Math.max,Pc=Math.round,pd=Math.floor,ba=e=>({x:e,y:e}),bD={left:"right",right:"left",bottom:"top",top:"bottom"},yD={start:"end",end:"start"};function pg(e,t,n){return Zt(e,va(t,n))}function Pr(e,t){return typeof e=="function"?e(t):e}function Cr(e){return e.split("-")[0]}function Us(e){return e.split("-")[1]}function mf(e){return e==="x"?"y":"x"}function pf(e){return e==="y"?"height":"width"}function ya(e){return["top","bottom"].includes(Cr(e))?"y":"x"}function gf(e){return mf(ya(e))}function wD(e,t,n){n===void 0&&(n=!1);const r=Us(e),a=gf(e),i=pf(a);let s=a==="x"?r===(n?"end":"start")?"right":"left":r==="start"?"bottom":"top";return t.reference[i]>t.floating[i]&&(s=Cc(s)),[s,Cc(s)]}function kD(e){const t=Cc(e);return[gg(e),t,gg(t)]}function gg(e){return e.replace(/start|end/g,t=>yD[t])}function xD(e,t,n){const r=["left","right"],a=["right","left"],i=["top","bottom"],s=["bottom","top"];switch(e){case"top":case"bottom":return n?t?a:r:t?r:a;case"left":case"right":return t?i:s;default:return[]}}function jD(e,t,n,r){const a=Us(e);let i=xD(Cr(e),n==="start",r);return a&&(i=i.map(s=>s+"-"+a),t&&(i=i.concat(i.map(gg)))),i}function Cc(e){return e.replace(/left|right|bottom|top/g,t=>bD[t])}function AD(e){return{top:0,right:0,bottom:0,left:0,...e}}function m1(e){return typeof e!="number"?AD(e):{top:e,right:e,bottom:e,left:e}}function Sc(e){const{x:t,y:n,width:r,height:a}=e;return{width:r,height:a,top:n,left:t,right:t+r,bottom:n+a,x:t,y:n}}function Ub(e,t,n){let{reference:r,floating:a}=e;const i=ya(t),s=gf(t),l=pf(s),d=Cr(t),c=i==="y",u=r.x+r.width/2-a.width/2,m=r.y+r.height/2-a.height/2,p=r[l]/2-a[l]/2;let h;switch(d){case"top":h={x:u,y:r.y-a.height};break;case"bottom":h={x:u,y:r.y+r.height};break;case"right":h={x:r.x+r.width,y:m};break;case"left":h={x:r.x-a.width,y:m};break;default:h={x:r.x,y:r.y}}switch(Us(t)){case"start":h[s]-=p*(n&&c?-1:1);break;case"end":h[s]+=p*(n&&c?-1:1);break}return h}const ED=async(e,t,n)=>{const{placement:r="bottom",strategy:a="absolute",middleware:i=[],platform:s}=n,l=i.filter(Boolean),d=await(s.isRTL==null?void 0:s.isRTL(t));let c=await s.getElementRects({reference:e,floating:t,strategy:a}),{x:u,y:m}=Ub(c,r,d),p=r,h={},b=0;for(let f=0;f<l.length;f++){const{name:k,fn:w}=l[f],{x:v,y,data:x,reset:A}=await w({x:u,y:m,initialPlacement:r,placement:p,strategy:a,middlewareData:h,rects:c,platform:s,elements:{reference:e,floating:t}});u=v??u,m=y??m,h={...h,[k]:{...h[k],...x}},A&&b<=50&&(b++,typeof A=="object"&&(A.placement&&(p=A.placement),A.rects&&(c=A.rects===!0?await s.getElementRects({reference:e,floating:t,strategy:a}):A.rects),{x:u,y:m}=Ub(c,p,d)),f=-1)}return{x:u,y:m,placement:p,strategy:a,middlewareData:h}};async function el(e,t){var n;t===void 0&&(t={});const{x:r,y:a,platform:i,rects:s,elements:l,strategy:d}=e,{boundary:c="clippingAncestors",rootBoundary:u="viewport",elementContext:m="floating",altBoundary:p=!1,padding:h=0}=Pr(t,e),b=m1(h),k=l[p?m==="floating"?"reference":"floating":m],w=Sc(await i.getClippingRect
477({element:(n=await(i.isElement==null?void 0:i.isElement(k)))==null||n?k:k.contextElement||await(i.getDocumentElement==null?void 0:i.getDocumentElement(l.floating)),boundary:c,rootBoundary:u,strategy:d})),v=m==="floating"?{x:r,y:a,width:s.floating.width,height:s.floating.height}:s.reference,y=await(i.getOffsetParent==null?void 0:i.getOffsetParent(l.floating)),x=await(i.isElement==null?void 0:i.isElement(y))?await(i.getScale==null?void 0:i.getScale(y))||{x:1,y:1}:{x:1,y:1},A=Sc(i.convertOffsetParentRelativeRectToViewportRelativeRect?await i.convertOffsetParentRelativeRectToViewportRelativeRect({elements:l,rect:v,offsetParent:y,strategy:d}):v);return{top:(w.top-A.top+b.top)/x.y,bottom:(A.bottom-w.bottom+b.bottom)/x.y,left:(w.left-A.left+b.left)/x.x,right:(A.right-w.right+b.right)/x.x}}const PD=e=>({name:"arrow",options:e,async fn(t){const{x:n,y:r,placement:a,rects:i,platform:s,elements:l,middlewareData:d}=t,{element:c,padding:u=0}=Pr(e,t)||{};if(c==null)return{};const m=m1(u),p={x:n,y:r},h=gf(a),b=pf(h),f=await s.getDimensions(c),k=h==="y",w=k?"top":"left",v=k?"bottom":"right",y=k?"clientHeight":"clientWidth",x=i.reference[b]+i.reference[h]-p[h]-i.floating[b],A=p[h]-i.reference[h],E=await(s.getOffsetParent==null?void 0:s.getOffsetParent(c));let j=E?E[y]:0;(!j||!await(s.isElement==null?void 0:s.isElement(E)))&&(j=l.floating[y]||i.floating[b]);const P=x/2-A/2,S=j/2-f[b]/2-1,_=va(m[w],S),G=va(m[v],S),B=_,Q=j-f[b]-G,N=j/2-f[b]/2+P,ie=pg(B,N,Q),Y=!d.arrow&&Us(a)!=null&&N!==ie&&i.reference[b]/2-(N<B?_:G)-f[b]/2<0,te=Y?N<B?N-B:N-Q:0;return{[h]:p[h]+te,data:{[h]:ie,centerOffset:N-ie-te,...Y&&{alignmentOffset:te}},reset:Y}}}),CD=function(e){return e===void 0&&(e={}),{name:"flip",options:e,async fn(t){var n,r;const{placement:a,middlewareData:i,rects:s,initialPlacement:l,platform:d,elements:c}=t,{mainAxis:u=!0,crossAxis:m=!0,fallbackPlacements:p,fallbackStrategy:h="bestFit",fallbackAxisSideDirection:b="none",flipAlignment:f=!0,...k}=Pr(e,t);if((n=i.arrow)!=null&&n.alignmentOffset)return{};const w=Cr(a),v=ya(l),y=Cr(l)===l,x=await(d.isRTL==null?void 0:d.isRTL(c.floating)),A=p||(y||!f?[Cc(l)]:kD(l)),E=b!=="none";!p&&E&&A.push(...jD(l,f,b,x));const j=[l,...A],P=await el(t,k),S=[];let _=((r=i.flip)==null?void 0:r.overflows)||[];if(u&&S.push(P[w]),m){const N=wD(a,s,x);S.push(P[N[0]],P[N[1]])}if(_=[..._,{placement:a,overflows:S}],!S.every(N=>N<=0)){var G,B;const N=(((G=i.flip)==null?void 0:G.index)||0)+1,ie=j[N];if(ie)return{data:{index:N,overflows:_},reset:{placement:ie}};let Y=(B=_.filter(te=>te.overflows[0]<=0).sort((te,C)=>te.overflows[1]-C.overflows[1])[0])==null?void 0:B.placement;if(!Y)switch(h){case"bestFit":{var Q;const te=(Q=_.filter(C=>{if(E){const z=ya(C.placement);return z===v||z==="y"}return!0}).map(C=>[C.placement,C.overflows.filter(z=>z>0).reduce((z,Z)=>z+Z,0)]).sort((C,z)=>C[1]-z[1])[0])==null?void 0:Q[0];te&&(Y=te);break}case"initialPlacement":Y=l;break}if(a!==Y)return{reset:{placement:Y}}}return{}}}};function $b(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:e.bottom-t.height,left:e.left-t.width}}function Gb(e){return vD.some(t=>e[t]>=0)}const SD=function(e){return e===void 0&&(e={}),{name:"hide",options:e,async fn(t){const{rects:n}=t,{strategy:r="referenceHidden",...a}=Pr(e,t);switch(r){case"referenceHidden":{const i=await el(t,{...a,elementContext:"reference"}),s=$b(i,n.reference);return{data:{referenceHiddenOffsets:s,referenceHidden:Gb(s)}}}case"escaped":{const i=await el(t,{...a,altBoundary:!0}),s=$b(i,n.floating);return{data:{escapedOffsets:s,escaped:Gb(s)}}}default:return{}}}}};async function _D(e,t){const{placement:n,platform:r,elements:a}=e,i=await(r.isRTL==null?void 0:r.isRTL(a.floating)),s=Cr(n),l=Us(n),d=ya(n)==="y",c=["left","top"].includes(s)?-1:1,u=i&&d?-1:1,m=Pr(t,e);let{mainAxis:p,crossAxis:h,alignmentAxis:b}=typeof m=="number"?{mainAxis:m,crossAxis:0,alignmentAxis:null}:{mainAxis:m.mainAxis||0,crossAxis:m.crossAxis||0,alignmentAxis:m.alignmentAxis};return l&&typeof b=="number"&&(h=l==="end"?b*-1:b),d?{x:h*u,y:p*c}:{x:p*c,y:h*u}}const TD=function(e){return e===void 0&&(e=0),{name:"offset",options:e,async fn(t){var n,r;const{x:a,y:i,placement:s,middlewareData:l}=t,d=await _D(t,e);return s===((n=l.offset)==null?void 0:n.placement)&&(r=l.arrow)!=null&&r.alignmentOffset?{}:{x:a+d.x,y:i+d.y,data:{...d,placement:s}}}}},DD=function(e){return e===void 0&&(e={}),{name:"shift",options:e,async fn(t){const{x:n,y:r,placement:a}=t,{mainAxis:i=!0,crossAxis:s=!1,limiter:l={fn:k=>{let{x:w,y:v}=k;return{x:w,y:v}}},...d}=Pr(e,t),c={x:n,y:r},u=await el(t,d),m=ya(Cr(a)),p=mf(m);let h=c[p],b=c[m];if(i){const k=p==="y"?"top":"left",w=p==="y"?"bottom":"right",v=h+u[k],y=h-u[w];h=pg(v,h,y)}if(s){const k=m==="y"?"top":"left",w=m==="y"?"bottom":"right",v=b+u[k],y=b-u[w];b=pg(v,b,y)}const f=l.fn({...t,[p]:h,[m]:b});return{...f,data:{x:f.x-n,y:f.y-r,enabled:{[p]:i,[m]:s}}}}}},RD=function(e){return e===void 0&&(e={}),{options:e,fn(t){const{x:n,y:r,placement:a,rects:i,middlewareData:s}=t,{offset:l=0,mainAxis:d=!0,crossAxis:c=!0}=Pr(e,t),u={x:n,y:r},m=ya(a),p=mf(m);let h=u[p],b=u[m];const f=Pr(l,t),k=typeof f=="number"?{mainAxis:f,crossAxis:0}:{mainAxis:0,crossAxis:0,...f};
477if(d){const y=p==="y"?"height":"width",x=i.reference[p]-i.floating[y]+k.mainAxis,A=i.reference[p]+i.reference[y]-k.mainAxis;h<x?h=x:h>A&&(h=A)}if(c){var w,v;const y=p==="y"?"width":"height",x=["top","left"].includes(Cr(a)),A=i.reference[m]-i.floating[y]+(x&&((w=s.offset)==null?void 0:w[m])||0)+(x?0:k.crossAxis),E=i.reference[m]+i.reference[y]+(x?0:((v=s.offset)==null?void 0:v[m])||0)-(x?k.crossAxis:0);b<A?b=A:b>E&&(b=E)}return{[p]:h,[m]:b}}}},zD=function(e){return e===void 0&&(e={}),{name:"size",options:e,async fn(t){var n,r;const{placement:a,rects:i,platform:s,elements:l}=t,{apply:d=()=>{},...c}=Pr(e,t),u=await el(t,c),m=Cr(a),p=Us(a),h=ya(a)==="y",{width:b,height:f}=i.floating;let k,w;m==="top"||m==="bottom"?(k=m,w=p===(await(s.isRTL==null?void 0:s.isRTL(l.floating))?"start":"end")?"left":"right"):(w=m,k=p==="end"?"top":"bottom");const v=f-u.top-u.bottom,y=b-u.left-u.right,x=va(f-u[k],v),A=va(b-u[w],y),E=!t.middlewareData.shift;let j=x,P=A;if((n=t.middlewareData.shift)!=null&&n.enabled.x&&(P=y),(r=t.middlewareData.shift)!=null&&r.enabled.y&&(j=v),E&&!p){const _=Zt(u.left,0),G=Zt(u.right,0),B=Zt(u.top,0),Q=Zt(u.bottom,0);h?P=b-2*(_!==0||G!==0?_+G:Zt(u.left,u.right)):j=f-2*(B!==0||Q!==0?B+Q:Zt(u.top,u.bottom))}await d({...t,availableWidth:P,availableHeight:j});const S=await s.getDimensions(l.floating);return b!==S.width||f!==S.height?{reset:{rects:!0}}:{}}}};function yu(){return typeof window<"u"}function $s(e){return p1(e)?(e.nodeName||"").toLowerCase():"#document"}function Xt(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function lr(e){var t;return(t=(p1(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function p1(e){return yu()?e instanceof Node||e instanceof Xt(e).Node:!1}function In(e){return yu()?e instanceof Element||e instanceof Xt(e).Element:!1}function ir(e){return yu()?e instanceof HTMLElement||e instanceof Xt(e).HTMLElement:!1}function Hb(e){return!yu()||typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof Xt(e).ShadowRoot}function ql(e){const{overflow:t,overflowX:n,overflowY:r,display:a}=qn(e);return/auto|scroll|overlay|hidden|clip/.test(t+r+n)&&!["inline","contents"].includes(a)}function ID(e){return["table","td","th"].includes($s(e))}function wu(e){return[":popover-open",":modal"].some(t=>{try{return e.matches(t)}catch{return!1}})}function hf(e){const t=ff(),n=In(e)?qn(e):e;return n.transform!=="none"||n.perspective!=="none"||(n.containerType?n.containerType!=="normal":!1)||!t&&(n.backdropFilter?n.backdropFilter!=="none":!1)||!t&&(n.filter?n.filter!=="none":!1)||["transform","perspective","filter"].some(r=>(n.willChange||"").includes(r))||["paint","layout","strict","content"].some(r=>(n.contain||"").includes(r))}function qD(e){let t=wa(e);for(;ir(t)&&!Cs(t);){if(hf(t))return t;if(wu(t))return null;t=wa(t)}return null}function ff(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}function Cs(e){return["html","body","#document"].includes($s(e))}function qn(e){return Xt(e).getComputedStyle(e)}function ku(e){return In(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function wa(e){if($s(e)==="html")return e;const t=e.assignedSlot||e.parentNode||Hb(e)&&e.host||lr(e);return Hb(t)?t.host:t}function g1(e){const t=wa(e);return Cs(t)?e.ownerDocument?e.ownerDocument.body:e.body:ir(t)&&ql(t)?t:g1(t)}function tl(e,t,n){var r;t===void 0&&(t=[]),n===void 0&&(n=!0);const a=g1(e),i=a===((r=e.ownerDocument)==null?void 0:r.body),s=Xt(a);if(i){const l=hg(s);return t.concat(s,s.visualViewport||[],ql(a)?a:[],l&&n?tl(l):[])}return t.concat(a,tl(a,[],n))}function hg(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function h1(e){const t=qn(e);let n=parseFloat(t.width)||0,r=parseFloat(t.height)||0;const a=ir(e),i=a?e.offsetWidth:n,s=a?e.offsetHeight:r,l=Pc(n)!==i||Pc(r)!==s;return l&&(n=i,r=s),{width:n,height:r,$:l}}function vf(e){return In(e)?e:e.contextElement}function as(e){const t=vf(e);if(!ir(t))return ba(1);const n=t.getBoundingClientRect(),{width:r,height:a,$:i}=h1(t);let s=(i?Pc(n.width):n.width)/r,l=(i?Pc(n.height):n.height)/a;return(!s||!Number.isFinite(s))&&(s=1),(!l||!Number.isFinite(l))&&(l=1),{x:s,y:l}}const ND=ba(0);function f1(e){const t=Xt(e);
477return!ff()||!t.visualViewport?ND:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function LD(e,t,n){return t===void 0&&(t=!1),!n||t&&n!==Xt(e)?!1:t}function si(e,t,n,r){t===void 0&&(t=!1),n===void 0&&(n=!1);const a=e.getBoundingClientRect(),i=vf(e);let s=ba(1);t&&(r?In(r)&&(s=as(r)):s=as(e));const l=LD(i,n,r)?f1(i):ba(0);let d=(a.left+l.x)/s.x,c=(a.top+l.y)/s.y,u=a.width/s.x,m=a.height/s.y;if(i){const p=Xt(i),h=r&&In(r)?Xt(r):r;let b=p,f=hg(b);for(;f&&r&&h!==b;){const k=as(f),w=f.getBoundingClientRect(),v=qn(f),y=w.left+(f.clientLeft+parseFloat(v.paddingLeft))*k.x,x=w.top+(f.clientTop+parseFloat(v.paddingTop))*k.y;d*=k.x,c*=k.y,u*=k.x,m*=k.y,d+=y,c+=x,b=Xt(f),f=hg(b)}}return Sc({width:u,height:m,x:d,y:c})}function BD(e){let{elements:t,rect:n,offsetParent:r,strategy:a}=e;const i=a==="fixed",s=lr(r),l=t?wu(t.floating):!1;if(r===s||l&&i)return n;let d={scrollLeft:0,scrollTop:0},c=ba(1);const u=ba(0),m=ir(r);if((m||!m&&!i)&&(($s(r)!=="body"||ql(s))&&(d=ku(r)),ir(r))){const p=si(r);c=as(r),u.x=p.x+r.clientLeft,u.y=p.y+r.clientTop}return{width:n.width*c.x,height:n.height*c.y,x:n.x*c.x-d.scrollLeft*c.x+u.x,y:n.y*c.y-d.scrollTop*c.y+u.y}}function MD(e){return Array.from(e.getClientRects())}function fg(e,t){const n=ku(e).scrollLeft;return t?t.left+n:si(lr(e)).left+n}function FD(e){const t=lr(e),n=ku(e),r=e.ownerDocument.body,a=Zt(t.scrollWidth,t.clientWidth,r.scrollWidth,r.clientWidth),i=Zt(t.scrollHeight,t.clientHeight,r.scrollHeight,r.clientHeight);let s=-n.scrollLeft+fg(e);const l=-n.scrollTop;return qn(r).direction==="rtl"&&(s+=Zt(t.clientWidth,r.clientWidth)-a),{width:a,height:i,x:s,y:l}}function OD(e,t){const n=Xt(e),r=lr(e),a=n.visualViewport;let i=r.clientWidth,s=r.clientHeight,l=0,d=0;if(a){i=a.width,s=a.height;const c=ff();(!c||c&&t==="fixed")&&(l=a.offsetLeft,d=a.offsetTop)}return{width:i,height:s,x:l,y:d}}function VD(e,t){const n=si(e,!0,t==="fixed"),r=n.top+e.clientTop,a=n.left+e.clientLeft,i=ir(e)?as(e):ba(1),s=e.clientWidth*i.x,l=e.clientHeight*i.y,d=a*i.x,c=r*i.y;return{width:s,height:l,x:d,y:c}}function Kb(e,t,n){let r;if(t==="viewport")r=OD(e,n);else if(t==="document")r=FD(lr(e));else if(In(t))r=VD(t,n);else{const a=f1(e);r={...t,x:t.x-a.x,y:t.y-a.y}}return Sc(r)}function v1(e,t){const n=wa(e);return n===t||!In(n)||Cs(n)?!1:qn(n).position==="fixed"||v1(n,t)}function WD(e,t){const n=t.get(e);if(n)return n;let r=tl(e,[],!1).filter(l=>In(l)&&$s(l)!=="body"),a=null;const i=qn(e).position==="fixed";let s=i?wa(e):e;for(;In(s)&&!Cs(s);){const l=qn(s),d=hf(s);!d&&l.position==="fixed"&&(a=null),(i?!d&&!a:!d&&l.position==="static"&&!!a&&["absolute","fixed"].includes(a.position)||ql(s)&&!d&&v1(e,s))?r=r.filter(u=>u!==s):a=l,s=wa(s)}return t.set(e,r),r}function UD(e){let{element:t,boundary:n,rootBoundary:r,strategy:a}=e;const s=[...n==="clippingAncestors"?wu(t)?[]:WD(t,this._c):[].concat(n),r],l=s[0],d=s.reduce((c,u)=>{const m=Kb(t,u,a);return c.top=Zt(m.top,c.top),c.right=va(m.right,c.right),c.bottom=va(m.bottom,c.bottom),c.left=Zt(m.left,c.left),c},Kb(t,l,a));return{width:d.right-d.left,height:d.bottom-d.top,x:d.left,y:d.top}}function $D(e){const{width:t,height:n}=h1(e);return{width:t,height:n}}function GD(e,t,n){const r=ir(t),a=lr(t),i=n==="fixed",s=si(e,!0,i,t);let l={scrollLeft:0,scrollTop:0};const d=ba(0);if(r||!r&&!i)if(($s(t)!=="body"||ql(a))&&(l=ku(t)),r){const h=si(t,!0,i,t);d.x=h.x+t.clientLeft,d.y=h.y+t.clientTop}else a&&(d.x=fg(a));let c=0,u=0;if(a&&!r&&!i){const h=a.getBoundingClientRect();u=h.top+l.scrollTop,c=h.left+l.scrollLeft-fg(a,h)}const m=s.left+l.scrollLeft-d.x-c,p=s.top+l.scrollTop-d.y-u;return{x:m,y:p,width:s.width,height:s.height}}function Sm(e){return qn(e).position==="static"}function Yb(e,t){if(!ir(e)||qn(e).position==="fixed")return null;if(t)return t(e);let n=e.offsetParent;return lr(e)===n&&(n=n.ownerDocument.body),n}function b1(e,t){const n=Xt(e);if(wu(e))return n;if(!ir(e)){let a=wa(e);for(;a&&!Cs(a);){if(In(a)&&!Sm(a))return a;a=wa(a)}return n}let r=Yb(e,t);for(;r&&ID(r)&&Sm(r);)r=Yb(r,t);return r&&Cs(r)&&Sm(r)&&!hf(r)?n:r||qD(e)||n}const HD=async function(e){const t=this.getOffsetParent||b1,n=this.getDimensions,r=await n(e.floating);return{reference:GD(e.reference,await t(e.floating),e.strategy),floating:{x:0,y:0,width:r.width,height:r.height}}};function KD(e){return qn(e).direction==="rtl"}const YD={convertOffsetParentRelativeRectToViewportRelativeRect:BD,getDocumentElement:lr,getClippingRect:UD,getOffsetParent:b1,getElementRects:HD,getClientRects:MD,getDimensions:$D,get
477Scale:as,isElement:In,isRTL:KD};function ZD(e,t){let n=null,r;const a=lr(e);function i(){var l;clearTimeout(r),(l=n)==null||l.disconnect(),n=null}function s(l,d){l===void 0&&(l=!1),d===void 0&&(d=1),i();const{left:c,top:u,width:m,height:p}=e.getBoundingClientRect();if(l||t(),!m||!p)return;const h=pd(u),b=pd(a.clientWidth-(c+m)),f=pd(a.clientHeight-(u+p)),k=pd(c),v={rootMargin:-h+"px "+-b+"px "+-f+"px "+-k+"px",threshold:Zt(0,va(1,d))||1};let y=!0;function x(A){const E=A[0].intersectionRatio;if(E!==d){if(!y)return s();E?s(!1,E):r=setTimeout(()=>{s(!1,1e-7)},1e3)}y=!1}try{n=new IntersectionObserver(x,{...v,root:a.ownerDocument})}catch{n=new IntersectionObserver(x,v)}n.observe(e)}return s(!0),i}function JD(e,t,n,r){r===void 0&&(r={});const{ancestorScroll:a=!0,ancestorResize:i=!0,elementResize:s=typeof ResizeObserver=="function",layoutShift:l=typeof IntersectionObserver=="function",animationFrame:d=!1}=r,c=vf(e),u=a||i?[...c?tl(c):[],...tl(t)]:[];u.forEach(w=>{a&&w.addEventListener("scroll",n,{passive:!0}),i&&w.addEventListener("resize",n)});const m=c&&l?ZD(c,n):null;let p=-1,h=null;s&&(h=new ResizeObserver(w=>{let[v]=w;v&&v.target===c&&h&&(h.unobserve(t),cancelAnimationFrame(p),p=requestAnimationFrame(()=>{var y;(y=h)==null||y.observe(t)})),n()}),c&&!d&&h.observe(c),h.observe(t));let b,f=d?si(e):null;d&&k();function k(){const w=si(e);f&&(w.x!==f.x||w.y!==f.y||w.width!==f.width||w.height!==f.height)&&n(),f=w,b=requestAnimationFrame(k)}return n(),()=>{var w;u.forEach(v=>{a&&v.removeEventListener("scroll",n),i&&v.removeEventListener("resize",n)}),m==null||m(),(w=h)==null||w.disconnect(),h=null,d&&cancelAnimationFrame(b)}}const QD=TD,XD=DD,eR=CD,tR=zD,nR=SD,Zb=PD,rR=RD,aR=(e,t,n)=>{const r=new Map,a={platform:YD,...n},i={...a.platform,_c:r};return ED(e,t,{...a,platform:i})};var $d=typeof document<"u"?g.useLayoutEffect:g.useEffect;function _c(e,t){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(typeof e=="function"&&e.toString()===t.toString())return!0;let n,r,a;if(e&&t&&typeof e=="object"){if(Array.isArray(e)){if(n=e.length,n!==t.length)return!1;for(r=n;r--!==0;)if(!_c(e[r],t[r]))return!1;return!0}if(a=Object.keys(e),n=a.length,n!==Object.keys(t).length)return!1;for(r=n;r--!==0;)if(!{}.hasOwnProperty.call(t,a[r]))return!1;for(r=n;r--!==0;){const i=a[r];if(!(i==="_owner"&&e.$$typeof)&&!_c(e[i],t[i]))return!1}return!0}return e!==e&&t!==t}function y1(e){return typeof window>"u"?1:(e.ownerDocument.defaultView||window).devicePixelRatio||1}function Jb(e,t){const n=y1(e);return Math.round(t*n)/n}function _m(e){const t=g.useRef(e);return $d(()=>{t.current=e}),t}function iR(e){e===void 0&&(e={});const{placement:t="bottom",strategy:n="absolute",middleware:r=[],platform:a,elements:{reference:i,floating:s}={},transform:l=!0,whileElementsMounted:d,open:c}=e,[u,m]=g.useState({x:0,y:0,strategy:n,placement:t,middlewareData:{},isPositioned:!1}),[p,h]=g.useState(r);_c(p,r)||h(r);const[b,f]=g.useState(null),[k,w]=g.useState(null),v=g.useCallback(C=>{C!==E.current&&(E.current=C,f(C))},[]),y=g.useCallback(C=>{C!==j.current&&(j.current=C,w(C))},[]),x=i||b,A=s||k,E=g.useRef(null),j=g.useRef(null),P=g.useRef(u),S=d!=null,_=_m(d),G=_m(a),B=_m(c),Q=g.useCallback(()=>{if(!E.current||!j.current)return;const C={placement:t,strategy:n,middleware:p};G.current&&(C.platform=G.current),aR(E.current,j.current,C).then(z=>{const Z={...z,isPositioned:B.current!==!1};N.current&&!_c(P.current,Z)&&(P.current=Z,gi.flushSync(()=>{m(Z)}))})},[p,t,n,G,B]);$d(()=>{c===!1&&P.current.isPositioned&&(P.current.isPositioned=!1,m(C=>({...C,isPositioned:!1})))},[c]);const N=g.useRef(!1);$d(()=>(N.current=!0,()=>{N.current=!1}),[]),$d(()=>{if(x&&(E.current=x),A&&(j.current=A),x&&A){if(_.current)return _.current(x,A,Q);Q()}},[x,A,Q,_,S]);const ie=g.useMemo(()=>({reference:E,floating:j,setReference:v,setFloating:y}),[v,y]),Y=g.useMemo(()=>({reference:x,floating:A}),[x,A]),te=g.useMemo(()=>{const C={position:n,left:0,top:0};if(!Y.floating)return C;const z=Jb(Y.floating,u.x),Z=Jb(Y.floating,u.y);return l?{...C,transform:"translate("+z+"px, "+Z+"px)",...y1(Y.floating)>=1.5&&{willChange:"transform"}}:{position:n,left:z,top:Z}},[n,l,Y.floating,u.x,u.y]);return g.useMemo(()=>({...u,update:Q,refs:ie,elements:Y,floatingStyles:te}),[u,Q,ie,Y,te])}const sR=e=>{function t(n){return{}.hasOwnProperty.call(n,"current")}return{name:"arrow",options:e,fn(n){const{element:r,padding:a}=typeof e=="function"?e(n):e;return r&&t(r)?r.current!=null?Zb({element:r.current,padding:a}).fn(n):{}:r?Zb({element:r,padding:a}).fn(n):{}}}},oR=(e,t)=>({...QD(e),options:[e,t]}),lR=(e,t)=>({...XD(e),options:[e,t]}),dR=(e,t)=>({...rR(e),options:[e,t]}),cR=(e,t)=>({...eR(e),options:[e,t]}),uR=(e,t)=>({...tR(e),options:[e,t]}),mR=(e,t)=>({...nR(e),options:[e,t]}),pR=(e,t)=>({...sR(e),options:[e,t]});var gR="Arrow",w1=g.forwardRef((e,t)=>
477{const{children:n,width:r=10,height:a=5,...i}=e;return o.jsx(be.svg,{...i,ref:t,width:r,height:a,viewBox:"0 0 30 10",preserveAspectRatio:"none",children:e.asChild?n:o.jsx("polygon",{points:"0,0 30,0 15,10"})})});w1.displayName=gR;var hR=w1;function fR(e,t=[]){let n=[];function r(i,s){const l=g.createContext(s),d=n.length;n=[...n,s];function c(m){const{scope:p,children:h,...b}=m,f=(p==null?void 0:p[e][d])||l,k=g.useMemo(()=>b,Object.values(b));return o.jsx(f.Provider,{value:k,children:h})}function u(m,p){const h=(p==null?void 0:p[e][d])||l,b=g.useContext(h);if(b)return b;if(s!==void 0)return s;throw new Error(`\`${m}\` must be used within \`${i}\``)}return c.displayName=i+"Provider",[c,u]}const a=()=>{const i=n.map(s=>g.createContext(s));return function(l){const d=(l==null?void 0:l[e])||i;return g.useMemo(()=>({[`__scope${e}`]:{...l,[e]:d}}),[l,d])}};return a.scopeName=e,[r,vR(a,...t)]}function vR(...e){const t=e[0];if(e.length===1)return t;const n=()=>{const r=e.map(a=>({useScope:a(),scopeName:a.scopeName}));return function(i){const s=r.reduce((l,{useScope:d,scopeName:c})=>{const m=d(i)[`__scope${c}`];return{...l,...m}},{});return g.useMemo(()=>({[`__scope${t.scopeName}`]:s}),[s])}};return n.scopeName=t.scopeName,n}function bR(e){const[t,n]=g.useState(void 0);return kt(()=>{if(e){n({width:e.offsetWidth,height:e.offsetHeight});const r=new ResizeObserver(a=>{if(!Array.isArray(a)||!a.length)return;const i=a[0];let s,l;if("borderBoxSize"in i){const d=i.borderBoxSize,c=Array.isArray(d)?d[0]:d;s=c.inlineSize,l=c.blockSize}else s=e.offsetWidth,l=e.offsetHeight;n({width:s,height:l})});return r.observe(e,{box:"border-box"}),()=>r.unobserve(e)}else n(void 0)},[e]),t}var bf="Popper",[k1,Gs]=fR(bf),[yR,x1]=k1(bf),j1=e=>{const{__scopePopper:t,children:n}=e,[r,a]=g.useState(null);return o.jsx(yR,{scope:t,anchor:r,onAnchorChange:a,children:n})};j1.displayName=bf;var A1="PopperAnchor",E1=g.forwardRef((e,t)=>{const{__scopePopper:n,virtualRef:r,...a}=e,i=x1(A1,n),s=g.useRef(null),l=Re(t,s);return g.useEffect(()=>{i.onAnchorChange((r==null?void 0:r.current)||s.current)}),r?null:o.jsx(be.div,{...a,ref:l})});E1.displayName=A1;var yf="PopperContent",[wR,kR]=k1(yf),P1=g.forwardRef((e,t)=>{var q,$,pe,oe,ke,Ae;const{__scopePopper:n,side:r="bottom",sideOffset:a=0,align:i="center",alignOffset:s=0,arrowPadding:l=0,avoidCollisions:d=!0,collisionBoundary:c=[],collisionPadding:u=0,sticky:m="partial",hideWhenDetached:p=!1,updatePositionStrategy:h="optimized",onPlaced:b,...f}=e,k=x1(yf,n),[w,v]=g.useState(null),y=Re(t,He=>v(He)),[x,A]=g.useState(null),E=bR(x),j=(E==null?void 0:E.width)??0,P=(E==null?void 0:E.height)??0,S=r+(i!=="center"?"-"+i:""),_=typeof u=="number"?u:{top:0,right:0,bottom:0,left:0,...u},G=Array.isArray(c)?c:[c],B=G.length>0,Q={padding:_,boundary:G.filter(jR),altBoundary:B},{refs:N,floatingStyles:ie,placement:Y,isPositioned:te,middlewareData:C}=iR({strategy:"fixed",placement:S,whileElementsMounted:(...He)=>JD(...He,{animationFrame:h==="always"}),elements:{reference:k.anchor},middleware:[oR({mainAxis:a+P,alignmentAxis:s}),d&&lR({mainAxis:!0,crossAxis:!1,limiter:m==="partial"?dR():void 0,...Q}),d&&cR({...Q}),uR({...Q,apply:({elements:He,rects:Oe,availableWidth:Dt,availableHeight:at})=>{const{width:Fn,height:Qs}=Oe.reference,Ye=He.floating.style;Ye.setProperty("--radix-popper-available-width",`${Dt}px`),Ye.setProperty("--radix-popper-available-height",`${at}px`),Ye.setProperty("--radix-popper-anchor-width",`${Fn}px`),Ye.setProperty("--radix-popper-anchor-height",`${Qs}px`)}}),x&&pR({element:x,padding:l}),AR({arrowWidth:j,arrowHeight:P}),p&&mR({strategy:"referenceHidden",...Q})]}),[z,Z]=_1(Y),K=ct(b);kt(()=>{te&&(K==null||K())},[te,K]);const X=(q=C.arrow)==null?void 0:q.x,he=($=C.arrow)==null?void 0:$.y,M=((pe=C.arrow)==null?void 0:pe.centerOffset)!==0,[U,V]=g.useState();return kt(()=>{w&&V(window.getComputedStyle(w).zIndex)},[w]),o.jsx("div",{ref:N.setFloating,"data-radix-popper-content-wrapper":"",style:{...ie,transform:te?ie.transform:"translate(0, -200%)",minWidth:"max-content",zIndex:U,"--radix-popper-transform-origin":[(oe=C.transformOrigin)==null?void 0:oe.x,(ke=C.transformOrigin)==null?void 0:ke.y].join(" "),...((Ae=C.hide)==null?void 0:Ae.referenceHidden)&&{visibility:"hidden",pointerEvents:"none"}},dir:e.dir,children:o.jsx(wR,{scope:n,placedSide:z,onArrowChange:A,arrowX:X,arrowY:he,shouldHideArrow:M,children:o.jsx(be.div,{"data-side":z,"data-align":Z,...f,ref:y,style:{...f.style,animation:te?void 0:"none"}})})})});P1.displayName=yf;var C1="PopperArrow",xR={top:"bottom",right:"left",bottom:"top",left:"r
477ight"},S1=g.forwardRef(function(t,n){const{__scopePopper:r,...a}=t,i=kR(C1,r),s=xR[i.placedSide];return o.jsx("span",{ref:i.onArrowChange,style:{position:"absolute",left:i.arrowX,top:i.arrowY,[s]:0,transformOrigin:{top:"",right:"0 0",bottom:"center 0",left:"100% 0"}[i.placedSide],transform:{top:"translateY(100%)",right:"translateY(50%) rotate(90deg) translateX(-50%)",bottom:"rotate(180deg)",left:"translateY(50%) rotate(-90deg) translateX(50%)"}[i.placedSide],visibility:i.shouldHideArrow?"hidden":void 0},children:o.jsx(hR,{...a,ref:n,style:{...a.style,display:"block"}})})});S1.displayName=C1;function jR(e){return e!==null}var AR=e=>({name:"transformOrigin",options:e,fn(t){var k,w,v;const{placement:n,rects:r,middlewareData:a}=t,s=((k=a.arrow)==null?void 0:k.centerOffset)!==0,l=s?0:e.arrowWidth,d=s?0:e.arrowHeight,[c,u]=_1(n),m={start:"0%",center:"50%",end:"100%"}[u],p=(((w=a.arrow)==null?void 0:w.x)??0)+l/2,h=(((v=a.arrow)==null?void 0:v.y)??0)+d/2;let b="",f="";return c==="bottom"?(b=s?m:`${p}px`,f=`${-d}px`):c==="top"?(b=s?m:`${p}px`,f=`${r.floating.height+d}px`):c==="right"?(b=`${-d}px`,f=s?m:`${h}px`):c==="left"&&(b=`${r.floating.width+d}px`,f=s?m:`${h}px`),{data:{x:b,y:f}}}});function _1(e){const[t,n="center"]=e.split("-");return[t,n]}var wf=j1,xu=E1,kf=P1,xf=S1,ER="VisuallyHidden",T1=g.forwardRef((e,t)=>o.jsx(be.span,{...e,ref:t,style:{position:"absolute",border:0,width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",wordWrap:"normal",...e.style}}));T1.displayName=ER;var PR=T1,[ju,QW]=Fs("Tooltip",[Gs]),Au=Gs(),D1="TooltipProvider",CR=700,vg="tooltip.open",[SR,jf]=ju(D1),R1=e=>{const{__scopeTooltip:t,delayDuration:n=CR,skipDelayDuration:r=300,disableHoverableContent:a=!1,children:i}=e,[s,l]=g.useState(!0),d=g.useRef(!1),c=g.useRef(0);return g.useEffect(()=>{const u=c.current;return()=>window.clearTimeout(u)},[]),o.jsx(SR,{scope:t,isOpenDelayed:s,delayDuration:n,onOpen:g.useCallback(()=>{window.clearTimeout(c.current),l(!1)},[]),onClose:g.useCallback(()=>{window.clearTimeout(c.current),c.current=window.setTimeout(()=>l(!0),r)},[r]),isPointerInTransitRef:d,onPointerInTransitChange:g.useCallback(u=>{d.current=u},[]),disableHoverableContent:a,children:i})};R1.displayName=D1;var Eu="Tooltip",[_R,Pu]=ju(Eu),z1=e=>{const{__scopeTooltip:t,children:n,open:r,defaultOpen:a=!1,onOpenChange:i,disableHoverableContent:s,delayDuration:l}=e,d=jf(Eu,e.__scopeTooltip),c=Au(t),[u,m]=g.useState(null),p=ca(),h=g.useRef(0),b=s??d.disableHoverableContent,f=l??d.delayDuration,k=g.useRef(!1),[w=!1,v]=Es({prop:r,defaultProp:a,onChange:j=>{j?(d.onOpen(),document.dispatchEvent(new CustomEvent(vg))):d.onClose(),i==null||i(j)}}),y=g.useMemo(()=>w?k.current?"delayed-open":"instant-open":"closed",[w]),x=g.useCallback(()=>{window.clearTimeout(h.current),h.current=0,k.current=!1,v(!0)},[v]),A=g.useCallback(()=>{window.clearTimeout(h.current),h.current=0,v(!1)},[v]),E=g.useCallback(()=>{window.clearTimeout(h.current),h.current=window.setTimeout(()=>{k.current=!0,v(!0),h.current=0},f)},[f,v]);return g.useEffect(()=>()=>{h.current&&(window.clearTimeout(h.current),h.current=0)},[]),o.jsx(wf,{...c,children:o.jsx(_R,{scope:t,contentId:p,open:w,stateAttribute:y,trigger:u,onTriggerChange:m,onTriggerEnter:g.useCallback(()=>{d.isOpenDelayed?E():x()},[d.isOpenDelayed,E,x]),onTriggerLeave:g.useCallback(()=>{b?A():(window.clearTimeout(h.current),h.current=0)},[A,b]),onOpen:x,onClose:A,disableHoverableContent:b,children:n})})};z1.displayName=Eu;var bg="TooltipTrigger",I1=g.forwardRef((e,t)=>{const{__scopeTooltip:n,...r}=e,a=Pu(bg,n),i=jf(bg,n),s=Au(n),l=g.useRef(null),d=Re(t,l,a.onTriggerChange),c=g.useRef(!1),u=g.useRef(!1),m=g.useCallback(()=>c.current=!1,[]);return g.useEffect(()=>()=>document.removeEventListener("pointerup",m),[m]),o.jsx(xu,{asChild:!0,...s,children:o.jsx(be.button,{"aria-describedby":a.open?a.contentId:void 0,"data-state":a.stateAttribute,...r,ref:d,onPointerMove:ce(e.onPointerMove,p=>{p.pointerType!=="touch"&&!u.current&&!i.isPointerInTransitRef.current&&(a.onTriggerEnter(),u.current=!0)}),onPointerLeave:ce(e.onPointerLeave,()=>{a.onTriggerLeave(),u.current=!1}),onPointerDown:ce(e.onPointerDown,()=>{c.current=!0,document.addEventListener("pointerup",m,{once:!0})}),onFocus:ce(e.onFocus,()=>{c.current||a.onOpen()}),onBlur:ce(e.onBlur,a.onClose),onClick:ce(e.onClick,a.onClose)})})});I1.displayName=bg;var TR="TooltipPortal",[XW,DR]=ju(TR,{forceMount:void 0}),Ss="TooltipContent",q1=g.forwardRef((e,t)=>
477{const n=DR(Ss,e.__scopeTooltip),{forceMount:r=n.forceMount,side:a="top",...i}=e,s=Pu(Ss,e.__scopeTooltip);return o.jsx(gn,{present:r||s.open,children:s.disableHoverableContent?o.jsx(N1,{side:a,...i,ref:t}):o.jsx(RR,{side:a,...i,ref:t})})}),RR=g.forwardRef((e,t)=>{const n=Pu(Ss,e.__scopeTooltip),r=jf(Ss,e.__scopeTooltip),a=g.useRef(null),i=Re(t,a),[s,l]=g.useState(null),{trigger:d,onClose:c}=n,u=a.current,{onPointerInTransitChange:m}=r,p=g.useCallback(()=>{l(null),m(!1)},[m]),h=g.useCallback((b,f)=>{const k=b.currentTarget,w={x:b.clientX,y:b.clientY},v=NR(w,k.getBoundingClientRect()),y=LR(w,v),x=BR(f.getBoundingClientRect()),A=FR([...y,...x]);l(A),m(!0)},[m]);return g.useEffect(()=>()=>p(),[p]),g.useEffect(()=>{if(d&&u){const b=k=>h(k,u),f=k=>h(k,d);return d.addEventListener("pointerleave",b),u.addEventListener("pointerleave",f),()=>{d.removeEventListener("pointerleave",b),u.removeEventListener("pointerleave",f)}}},[d,u,h,p]),g.useEffect(()=>{if(s){const b=f=>{const k=f.target,w={x:f.clientX,y:f.clientY},v=(d==null?void 0:d.contains(k))||(u==null?void 0:u.contains(k)),y=!MR(w,s);v?p():y&&(p(),c())};return document.addEventListener("pointermove",b),()=>document.removeEventListener("pointermove",b)}},[d,u,s,c,p]),o.jsx(N1,{...e,ref:i})}),[zR,IR]=ju(Eu,{isInside:!1}),N1=g.forwardRef((e,t)=>{const{__scopeTooltip:n,children:r,"aria-label":a,onEscapeKeyDown:i,onPointerDownOutside:s,...l}=e,d=Pu(Ss,n),c=Au(n),{onClose:u}=d;return g.useEffect(()=>(document.addEventListener(vg,u),()=>document.removeEventListener(vg,u)),[u]),g.useEffect(()=>{if(d.trigger){const m=p=>{const h=p.target;h!=null&&h.contains(d.trigger)&&u()};return window.addEventListener("scroll",m,{capture:!0}),()=>window.removeEventListener("scroll",m,{capture:!0})}},[d.trigger,u]),o.jsx(Os,{asChild:!0,disableOutsidePointerEvents:!1,onEscapeKeyDown:i,onPointerDownOutside:s,onFocusOutside:m=>m.preventDefault(),onDismiss:u,children:o.jsxs(kf,{"data-state":d.stateAttribute,...c,...l,ref:t,style:{...l.style,"--radix-tooltip-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-tooltip-content-available-width":"var(--radix-popper-available-width)","--radix-tooltip-content-available-height":"var(--radix-popper-available-height)","--radix-tooltip-trigger-width":"var(--radix-popper-anchor-width)","--radix-tooltip-trigger-height":"var(--radix-popper-anchor-height)"},children:[o.jsx(cx,{children:r}),o.jsx(zR,{scope:n,isInside:!0,children:o.jsx(PR,{id:d.contentId,role:"tooltip",children:a||r})})]})})});q1.displayName=Ss;var L1="TooltipArrow",qR=g.forwardRef((e,t)=>{const{__scopeTooltip:n,...r}=e,a=Au(n);return IR(L1,n).isInside?null:o.jsx(xf,{...a,...r,ref:t})});qR.displayName=L1;function NR(e,t){const n=Math.abs(t.top-e.y),r=Math.abs(t.bottom-e.y),a=Math.abs(t.right-e.x),i=Math.abs(t.left-e.x);switch(Math.min(n,r,a,i)){case i:return"left";case a:return"right";case n:return"top";case r:return"bottom";default:throw new Error("unreachable")}}function LR(e,t,n=5){const r=[];switch(t){case"top":r.push({x:e.x-n,y:e.y+n},{x:e.x+n,y:e.y+n});break;case"bottom":r.push({x:e.x-n,y:e.y-n},{x:e.x+n,y:e.y-n});break;case"left":r.push({x:e.x+n,y:e.y-n},{x:e.x+n,y:e.y+n});break;case"right":r.push({x:e.x-n,y:e.y-n},{x:e.x-n,y:e.y+n});break}return r}function BR(e){const{top:t,right:n,bottom:r,left:a}=e;return[{x:a,y:t},{x:n,y:t},{x:n,y:r},{x:a,y:r}]}function MR(e,t){const{x:n,y:r}=e;let a=!1;for(let i=0,s=t.length-1;i<t.length;s=i++){const l=t[i].x,d=t[i].y,c=t[s].x,u=t[s].y;d>r!=u>r&&n<(c-l)*(r-d)/(u-d)+l&&(a=!a)}return a}function FR(e){const t=e.slice();return t.sort((n,r)=>n.x<r.x?-1:n.x>r.x?1:n.y<r.y?-1:n.y>r.y?1:0),OR(t)}function OR(e){if(e.length<=1)return e.slice();const t=[];for(let r=0;r<e.length;r++){const a=e[r];for(;t.length>=2;){const i=t[t.length-1],s=t[t.length-2];if((i.x-s.x)*(a.y-s.y)>=(i.y-s.y)*(a.x-s.x))t.pop();else break}t.push(a)}t.pop();const n=[];for(let r=e.length-1;r>=0;r--){const a=e[r];for(;n.length>=2;){const i=n[n.length-1],s=n[n.length-2];if((i.x-s.x)*(a.y-s.y)>=(i.y-s.y)*(a.x-s.x))n.pop();else break}n.push(a)}return n.pop(),t.length===1&&n.length===1&&t[0].x===n[0].x&&t[0].y===n[0].y?t:t.concat(n)}var VR=R1,WR=z1,UR=I1,B1=q1;const $R=VR,eU=WR,tU=UR,GR=g.forwardRef(({className:e,sideOffset:t=4,...n},r)=>o.jsx(B1,{ref:r,sideOffset:t,className:le("z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:sli
477de-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...n}));GR.displayName=B1.displayName;var Cu=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},Su=typeof window>"u"||"Deno"in globalThis;function kn(){}function HR(e,t){return typeof e=="function"?e(t):e}function KR(e){return typeof e=="number"&&e>=0&&e!==1/0}function YR(e,t){return Math.max(e+(t||0)-Date.now(),0)}function Qb(e,t){return typeof e=="function"?e(t):e}function ZR(e,t){return typeof e=="function"?e(t):e}function Xb(e,t){const{type:n="all",exact:r,fetchStatus:a,predicate:i,queryKey:s,stale:l}=e;if(s){if(r){if(t.queryHash!==Af(s,t.options))return!1}else if(!rl(t.queryKey,s))return!1}if(n!=="all"){const d=t.isActive();if(n==="active"&&!d||n==="inactive"&&d)return!1}return!(typeof l=="boolean"&&t.isStale()!==l||a&&a!==t.state.fetchStatus||i&&!i(t))}function ey(e,t){const{exact:n,status:r,predicate:a,mutationKey:i}=e;if(i){if(!t.options.mutationKey)return!1;if(n){if(nl(t.options.mutationKey)!==nl(i))return!1}else if(!rl(t.options.mutationKey,i))return!1}return!(r&&t.state.status!==r||a&&!a(t))}function Af(e,t){return((t==null?void 0:t.queryKeyHashFn)||nl)(e)}function nl(e){return JSON.stringify(e,(t,n)=>yg(n)?Object.keys(n).sort().reduce((r,a)=>(r[a]=n[a],r),{}):n)}function rl(e,t){return e===t?!0:typeof e!=typeof t?!1:e&&t&&typeof e=="object"&&typeof t=="object"?!Object.keys(t).some(n=>!rl(e[n],t[n])):!1}function M1(e,t){if(e===t)return e;const n=ty(e)&&ty(t);if(n||yg(e)&&yg(t)){const r=n?e:Object.keys(e),a=r.length,i=n?t:Object.keys(t),s=i.length,l=n?[]:{};let d=0;for(let c=0;c<s;c++){const u=n?c:i[c];(!n&&r.includes(u)||n)&&e[u]===void 0&&t[u]===void 0?(l[u]=void 0,d++):(l[u]=M1(e[u],t[u]),l[u]===e[u]&&e[u]!==void 0&&d++)}return a===s&&d===a?e:l}return t}function nU(e,t){if(!t||Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(e[n]!==t[n])return!1;return!0}function ty(e){return Array.isArray(e)&&e.length===Object.keys(e).length}function yg(e){if(!ny(e))return!1;const t=e.constructor;if(t===void 0)return!0;const n=t.prototype;return!(!ny(n)||!n.hasOwnProperty("isPrototypeOf")||Object.getPrototypeOf(e)!==Object.prototype)}function ny(e){return Object.prototype.toString.call(e)==="[object Object]"}function JR(e){return new Promise(t=>{setTimeout(t,e)})}function QR(e,t,n){return typeof n.structuralSharing=="function"?n.structuralSharing(e,t):n.structuralSharing!==!1?M1(e,t):t}function XR(e,t,n=0){const r=[...e,t];return n&&r.length>n?r.slice(1):r}function ez(e,t,n=0){const r=[t,...e];return n&&r.length>n?r.slice(0,-1):r}var Ef=Symbol();function F1(e,t){return!e.queryFn&&(t!=null&&t.initialPromise)?()=>t.initialPromise:!e.queryFn||e.queryFn===Ef?()=>Promise.reject(new Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}var Ga,Gr,ds,R0,tz=(R0=class extends Cu{constructor(){super();ze(this,Ga);ze(this,Gr);ze(this,ds);xe(this,ds,t=>{if(!Su&&window.addEventListener){const n=()=>t();return window.addEventListener("visibilitychange",n,!1),()=>{window.removeEventListener("visibilitychange",n)}}})}onSubscribe(){D(this,Gr)||this.setEventListener(D(this,ds))}onUnsubscribe(){var t;this.hasListeners()||((t=D(this,Gr))==null||t.call(this),xe(this,Gr,void 0))}setEventListener(t){var n;xe(this,ds,t),(n=D(this,Gr))==null||n.call(this),xe(this,Gr,t(r=>{typeof r=="boolean"?this.setFocused(r):this.onFocus()}))}setFocused(t){D(this,Ga)!==t&&(xe(this,Ga,t),this.onFocus())}onFocus(){const t=this.isFocused();this.listeners.forEach(n=>{n(t)})}isFocused(){var t;return typeof D(this,Ga)=="boolean"?D(this,Ga):((t=globalThis.document)==null?void 0:t.visibilityState)!=="hidden"}},Ga=new WeakMap,Gr=new WeakMap,ds=new WeakMap,R0),O1=new tz,cs,Hr,us,z0,nz=(z0=class extends Cu{constructor(){super();ze(this,cs,!0);ze(this,Hr);ze(this,us);xe(this,us,t=>{if(!Su&&window.addEventListener){const n=()=>t(!0),r=()=>t(!1);return window.addEventListener("online",n,!1),window.addEventListener("offline",r,!1),()=>{window.removeEventListener("online",n),window.removeEventListener("offline",r)}}})}
vendor: 21,539 bytes, line 477
477onSubscribe(){D(this,Hr)||this.setEventListener(D(this,us))}onUnsubscribe(){var t;this.hasListeners()||((t=D(this,Hr))==null||t.call(this),xe(this,Hr,void 0))}setEventListener(t){var n;xe(this,us,t),(n=D(this,Hr))==null||n.call(this),xe(this,Hr,t(this.setOnline.bind(this)))}setOnline(t){D(this,cs)!==t&&(xe(this,cs,t),this.listeners.forEach(r=>{r(t)}))}isOnline(){return D(this,cs)}},cs=new WeakMap,Hr=new WeakMap,us=new WeakMap,z0),Tc=new nz;function rz(){let e,t;const n=new Promise((a,i)=>{e=a,t=i});n.status="pending",n.catch(()=>{});function r(a){Object.assign(n,a),delete n.resolve,delete n.reject}return n.resolve=a=>{r({status:"fulfilled",value:a}),e(a)},n.reject=a=>{r({status:"rejected",reason:a}),t(a)},n}function az(e){return Math.min(1e3*2**e,3e4)}function V1(e){return(e??"online")==="online"?Tc.isOnline():!0}var W1=class extends Error{constructor(e){super("CancelledError"),this.revert=e==null?void 0:e.revert,this.silent=e==null?void 0:e.silent}};function Tm(e){return e instanceof W1}function U1(e){let t=!1,n=0,r=!1,a;const i=rz(),s=f=>{var k;r||(p(new W1(f)),(k=e.abort)==null||k.call(e))},l=()=>{t=!0},d=()=>{t=!1},c=()=>O1.isFocused()&&(e.networkMode==="always"||Tc.isOnline())&&e.canRun(),u=()=>V1(e.networkMode)&&e.canRun(),m=f=>{var k;r||(r=!0,(k=e.onSuccess)==null||k.call(e,f),a==null||a(),i.resolve(f))},p=f=>{var k;r||(r=!0,(k=e.onError)==null||k.call(e,f),a==null||a(),i.reject(f))},h=()=>new Promise(f=>{var k;a=w=>{(r||c())&&f(w)},(k=e.onPause)==null||k.call(e)}).then(()=>{var f;a=void 0,r||(f=e.onContinue)==null||f.call(e)}),b=()=>{if(r)return;let f;const k=n===0?e.initialPromise:void 0;try{f=k??e.fn()}catch(w){f=Promise.reject(w)}Promise.resolve(f).then(m).catch(w=>{var E;if(r)return;const v=e.retry??(Su?0:3),y=e.retryDelay??az,x=typeof y=="function"?y(n,w):y,A=v===!0||typeof v=="number"&&n<v||typeof v=="function"&&v(n,w);if(t||!A){p(w);return}n++,(E=e.onFail)==null||E.call(e,n,w),JR(x).then(()=>c()?void 0:h()).then(()=>{t?p(w):b()})})};return{promise:i,cancel:s,continue:()=>(a==null||a(),i),cancelRetry:l,continueRetry:d,canStart:u,start:()=>(u()?b():h().then(b),i)}}function iz(){let e=[],t=0,n=l=>{l()},r=l=>{l()},a=l=>setTimeout(l,0);const i=l=>{t?e.push(l):a(()=>{n(l)})},s=()=>{const l=e;e=[],l.length&&a(()=>{r(()=>{l.forEach(d=>{n(d)})})})};return{batch:l=>{let d;t++;try{d=l()}finally{t--,t||s()}return d},batchCalls:l=>(...d)=>{i(()=>{l(...d)})},schedule:i,setNotifyFunction:l=>{n=l},setBatchNotifyFunction:l=>{r=l},setScheduler:l=>{a=l}}}var Nt=iz(),Ha,I0,$1=(I0=class{constructor(){ze(this,Ha)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),KR(this.gcTime)&&xe(this,Ha,setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(Su?1/0:5*60*1e3))}clearGcTimeout(){D(this,Ha)&&(clearTimeout(D(this,Ha)),xe(this,Ha,void 0))}},Ha=new WeakMap,I0),ms,ps,sn,Pt,El,Ka,xn,mr,q0,sz=(q0=class extends $1{constructor(t){super();ze(this,xn);ze(this,ms);ze(this,ps);ze(this,sn);ze(this,Pt);ze(this,El);ze(this,Ka);xe(this,Ka,!1),xe(this,El,t.defaultOptions),this.setOptions(t.options),this.observers=[],xe(this,sn,t.cache),this.queryKey=t.queryKey,this.queryHash=t.queryHash,xe(this,ms,lz(this.options)),this.state=t.state??D(this,ms),this.scheduleGc()}get meta(){return this.options.meta}get promise(){var t;return(t=D(this,Pt))==null?void 0:t.promise}setOptions(t){this.options={...D(this,El),...t},this.updateGcTime(this.options.gcTime)}optionalRemove(){!this.observers.length&&this.state.fetchStatus==="idle"&&D(this,sn).remove(this)}setData(t,n){const r=QR(this.state.data,t,this.options);return jt(this,xn,mr).call(this,{data:r,type:"success",dataUpdatedAt:n==null?void 0:n.updatedAt,manual:n==null?void 0:n.manual}),r}setState(t,n){jt(this,xn,mr).call(this,{type:"setState",state:t,setStateOptions:n})}cancel(t){var r,a;const n=(r=D(this,Pt))==null?void 0:r.promise;return(a=D(this,Pt))==null||a.cancel(t),n?n.then(kn).catch(kn):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}reset(){this.destroy(),this.setState(D(this,ms))}isActive(){return this.observers.some(t=>ZR(t.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===Ef||this.state.dataUpdateCount+this.state.errorUpdateCount===0}isStale(){return this.state.isInvalidated?!0:this.getObserversCount()>0?this.observers.some(t=>t.getCurrentResult().isStale):this.state.data===void 0}isStaleByTime(t=0){return this.state.isInvalidated||this.state.data===void 0||!YR(this.state.dataUpdatedAt,t)}onFocus(){var n;const t=this.observers.find(r=>r.shouldFetchOnWindowFocus());t==null||t.refetch({cancelRefetch:!1}),(n=D(this,Pt))==null||n.continue()}onOnline(){var n;const t=this.observers.find(r=>r.shouldFetchOnReconnect());t==null||t.refetch({cancelRefetch:!1}),(n=D(this,Pt))==null||n.continue()}addObserver(t){this.observers.includes(t)||(this.observers.push(t),this.clearGcTimeout(),D(this,sn).notify({type:"observerAdded",query:this,observer:t}))}removeObserver(t){this.observers.includes(t)&&(this.observers=this.observers.filter(n=>n!==t),this.observers.length||(D(this,Pt)&&(D(this,Ka)?D(this,Pt).cancel({revert:!0}):D(this,Pt).cancelRetry()),this.scheduleGc()),D(this,sn).notify({type:"observerRemoved",query:this,observer:t}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||jt(this,xn,mr).call(this,{type:"invalidate"})}fetch(t,n){var d,c,u;if(this.state.fetchStatus!=="idle"){if(this.state.data!==void 0&&(n!=null&&n.cancelRefetch))this.cancel({silent:!0});else if(D(this,Pt))return D(this,Pt).continueRetry(),D(this,Pt).promise}if(t&&this.setOptions(t),!this.options.queryFn){const m=this.observers.find(p=>p.options.queryFn);m&&this.setOptions(m.options)}const r=new AbortController,a=m=>{Object.defineProperty(m,"signal",{enumerable:!0,get:()=>(xe(this,Ka,!0),r.signal)})},i=()=>{const m=F1(this.options,n),p={queryKey:this.queryKey,meta:this.meta};return a(p),xe(this,Ka,!1),this.options.persister?this.options.persister(m,p,this):m(p)},s={fetchOptions:n,options:this.options,queryKey:this.queryKey,state:this.state,fetchFn:i};a(s),(d=this.options.behavior)==null||d.onFetch(s,this),xe(this,ps,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((c=s.fetchOptions)==null?void 0:c.meta))&&jt(this,xn,mr).call(this,{type:"fetch",meta:(u=s.fetchOptions)==null?void 0:u.meta});const l=m=>{var p,h,b,f;Tm(m)&&m.silent||jt(this,xn,mr).call(this,{type:"error",error:m}),Tm(m)||((h=(p=D(this,sn).config).onError)==null||h.call(p,m,this),(f=(b=D(this,sn).config).onSettled)==null||f.call(b,this.state.data,m,this)),this.scheduleGc()};return xe(this,Pt,U1({initialPromise:n==null?void 0:n.initialPromise,fn:s.fetchFn,abort:r.abort.bind(r),onSuccess:m=>{var p,h,b,f;if(m===void 0){l(new Error(`${this.queryHash} data is undefined`));return}try{this.setData(m)}catch(k){l(k);return}(h=(p=D(this,sn).config).onSuccess)==null||h.call(p,m,this),(f=(b=D(this,sn).config).onSettled)==null||f.call(b,m,this.state.error,this),this.scheduleGc()},onError:l,onFail:(m,p)=>{jt(this,xn,mr).call(this,{type:"failed",failureCount:m,error:p})},onPause:()=>{jt(this,xn,mr).call(this,{type:"pause"})},onContinue:()=>{jt(this,xn,mr).call(this,{type:"continue"})},retry:s.options.retry,retryDelay:s.options.retryDelay,networkMode:s.options.networkMode,canRun:()=>!0})),D(this,Pt).start()}},ms=new WeakMap,ps=new WeakMap,sn=new WeakMap,Pt=new WeakMap,El=new WeakMap,Ka=new WeakMap,xn=new WeakSet,mr=function(t){const n=r=>{switch(t.type){case"failed":return{...r,fetchFailureCount:t.failureCount,fetchFailureReason:t.error};case"pause":return{...r,fetchStatus:"paused"};case"continue":return{...r,fetchStatus:"fetching"};case"fetch":return{...r,...oz(r.data,this.options),fetchMeta:t.meta??null};case"success":return{...r,data:t.data,dataUpdateCount:r.dataUpdateCount+1,dataUpdatedAt:t.dataUpdatedAt??Date.now(),error:null,isInvalidated:!1,status:"success",...!t.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};case"error":const a=t.error;return Tm(a)&&a.revert&&D(this,ps)?{...D(this,ps),fetchStatus:"idle"}:{...r,error:a,errorUpdateCount:r.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:r.fetchFailureCount+1,fetchFailureReason:a,fetchStatus:"idle",status:"error"};case"invalidate":return{...r,isInvalidated:!0};case"setState":return{...r,...t.state}}};this.state=n(this.state),Nt.batch(()=>{this.observers.forEach(r=>{r.onQueryUpdate()}),D(this,sn).notify({query:this,type:"updated",action:t})})},q0);function oz(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:V1(t.networkMode)?"fetching":"paused",...e===void 0&&{error:null,status:"pending"}}}function lz(e){const t=typeof e.initialData=="function"?e.initialData():e.initialData,n=t!==void 0,r=n?typeof e.initialDataUpdatedAt=="function"?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:n?r??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:n?"success":"pending",fetchStatus:"idle"}}var Gn,N0,dz=(N0=class extends Cu{constructor(t={}){super();ze(this,Gn);this.config=t,xe(this,Gn,new Map)}build(t,n,r){const a=n.queryKey,i=n.queryHash??Af(a,n);let s=this.get(i);return s||(s=new sz({cache:this,queryKey:a,queryHash:i,options:t.defaultQueryOptions(n),state:r,defaultOptions:t.getQueryDefaults(a)}),this.add(s)),s}add(t){D(this,Gn).has(t.queryHash)||(D(this,Gn).set(t.queryHash,t),this.notify({type:"added",query:t}))}remove(t){const n=D(this,Gn).get(t.queryHash);n&&(t.destroy(),n===t&&D(this,Gn).delete(t.queryHash),this.notify({type:"removed",query:t}))}clear(){Nt.batch(()=>{this.getAll().forEach(t=>{this.remove(t)})})}get(t){return D(this,Gn).get(t)}getAll(){return[...D(this,Gn).values()]}find(t){const n={exact:!0,...t};return this.getAll().find(r=>Xb(n,r))}findAll(t={}){const n=this.getAll();return Object.keys(t).length>0?n.filter(r=>Xb(t,r)):n}notify(t){Nt.batch(()=>{this.listeners.forEach(n=>{n(t)})})}onFocus(){Nt.batch(()=>{this.getAll().forEach(t=>{t.onFocus()})})}onOnline(){Nt.batch(()=>{this.getAll().forEach(t=>{t.onOnline()})})}},Gn=new WeakMap,N0),Hn,It,Ya,Kn,Lr,L0,cz=(L0=class extends $1{constructor(t){super();ze(this,Kn);ze(this,Hn);ze(this,It);ze(this,Ya);this.mutationId=t.mutationId,xe(this,It,t.mutationCache),xe(this,Hn,[]),this.state=t.state||uz(),this.setOptions(t.options),this.scheduleGc()}setOptions(t){this.options=t,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(t){D(this,Hn).includes(t)||(D(this,Hn).push(t),this.clearGcTimeout(),D(this,It).notify({type:"observerAdded",mutation:this,observer:t}))}removeObserver(t){xe(this,Hn,D(this,Hn).filter(n=>n!==t)),this.scheduleGc(),D(this,It).notify({type:"observerRemoved",mutation:this,observer:t})}optionalRemove(){D(this,Hn).length||(this.state.status==="pending"?this.scheduleGc():D(this,It).remove(this))}continue(){var t;return((t=D(this,Ya))==null?void 0:t.continue())??this.execute(this.state.variables)}async execute(t){var a,i,s,l,d,c,u,m,p,h,b,f,k,w,v,y,x,A,E,j;xe(this,Ya,U1({fn:()=>this.options.mutationFn?this.options.mutationFn(t):Promise.reject(new Error("No mutationFn found")),onFail:(P,S)=>{jt(this,Kn,Lr).call(this,{type:"failed",failureCount:P,error:S})},onPause:()=>{jt(this,Kn,Lr).call(this,{type:"pause"})},onContinue:()=>{jt(this,Kn,Lr).call(this,{type:"continue"})},retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>D(this,It).canRun(this)}));const n=this.state.status==="pending",r=!D(this,Ya).canStart();try{if(!n){jt(this,Kn,Lr).call(this,{type:"pending",variables:t,isPaused:r}),await((i=(a=D(this,It).config).onMutate)==null?void 0:i.call(a,t,this));const S=await((l=(s=this.options).onMutate)==null?void 0:l.call(s,t));S!==this.state.context&&jt(this,Kn,Lr).call(this,{type:"pending",context:S,variables:t,isPaused:r})}const P=await D(this,Ya).start();return await((c=(d=D(this,It).config).onSuccess)==null?void 0:c.call(d,P,t,this.state.context,this)),await((m=(u=this.options).onSuccess)==null?void 0:m.call(u,P,t,this.state.context)),await((h=(p=D(this,It).config).onSettled)==null?void 0:h.call(p,P,null,this.state.variables,this.state.context,this)),await((f=(b=this.options).onSettled)==null?void 0:f.call(b,P,null,t,this.state.context)),jt(this,Kn,Lr).call(this,{type:"success",data:P}),P}catch(P){try{throw await((w=(k=D(this,It).config).onError)==null?void 0:w.call(k,P,t,this.state.context,this)),await((y=(v=this.options).onError)==null?void 0:y.call(v,P,t,this.state.context)),await((A=(x=D(this,It).config).onSettled)==null?void 0:A.call(x,void 0,P,this.state.variables,this.state.context,this)),await((j=(E=this.options).onSettled)==null?void 0:j.call(E,void 0,P,t,this.state.context)),P}finally{jt(this,Kn,Lr).call(this,{type:"error",error:P})}}finally{D(this,It).runNext(this)}}},Hn=new WeakMap,It=new WeakMap,Ya=new WeakMap,Kn=new WeakSet,Lr=function(t){const n=r=>{switch(t.type){case"failed":return{...r,failureCount:t.failureCount,failureReason:t.error};case"pause":return{...r,isPaused:!0};case"continue":return{...r,isPaused:!1};case"pending":return{...r,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{...r,data:t.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...r,data:void 0,error:t.error,failureCount:r.failureCount+1,failureReason:t.error,isPaused:!1,status:"error"}}};this.state=n(this.state),Nt.batch(()=>{D(this,Hn).forEach(r=>{r.onMutationUpdate(t)}),D(this,It).notify({mutation:this,type:"updated",action:t})})},L0);function uz(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var Ht,Pl,B0,mz=(B0=class extends Cu{constructor(t={}){super();ze(this,Ht);ze(this,Pl);this.config=t,xe(this,Ht,new Map),xe(this,Pl,Date.now())}build(t,n,r){const a=new cz({mutationCache:this,mutationId:++$l(this,Pl)._,options:t.defaultMutationOptions(n),state:r});return this.add(a),a}add(t){const n=gd(t),r=D(this,Ht).get(n)??[];r.push(t),D(this,Ht).set(n,r),this.notify({type:"added",mutation:t})}remove(t){var r;const n=gd(t);if(D(this,Ht).has(n)){const a=(r=D(this,Ht).get(n))==null?void 0:r.filter(i=>i!==t);a&&(a.length===0?D(this,Ht).delete(n):D(this,Ht).set(n,a))}this.notify({type:"removed",mutation:t})}canRun(t){var r;const n=(r=D(this,Ht).get(gd(t)))==null?void 0:r.find(a=>a.state.status==="pending");return!n||n===t}runNext(t){var r;const n=(r=D(this,Ht).get(gd(t)))==null?void 0:r.find(a=>a!==t&&a.state.isPaused);return(n==null?void 0:n.continue())??Promise.resolve()}clear(){Nt.batch(()=>{this.getAll().forEach(t=>{this.remove(t)})})}getAll(){return[...D(this,Ht).values()].flat()}find(t){const n={exact:!0,...t};return this.getAll().find(r=>ey(n,r))}findAll(t={}){return this.getAll().filter(n=>ey(t,n))}notify(t){Nt.batch(()=>{this.listeners.forEach(n=>{n(t)})})}resumePausedMutations(){const t=this.getAll().filter(n=>n.state.isPaused);return Nt.batch(()=>Promise.all(t.map(n=>n.continue().catch(kn))))}},Ht=new WeakMap,Pl=new WeakMap,B0);function gd(e){var t;return((t=e.options.scope)==null?void 0:t.id)??String(e.mutationId)}function ry(e){return{onFetch:(t,n)=>{var u,m,p,h,b;const r=t.options,a=(p=(m=(u=t.fetchOptions)==null?void 0:u.meta)==null?void 0:m.fetchMore)==null?void 0:p.direction,i=((h=t.state.data)==null?void 0:h.pages)||[],s=((b=t.state.data)==null?void 0:b.pageParams)||[];let l={pages:[],pageParams:[]},d=0;const c=async()=>{let f=!1;const k=y=>{Object.defineProperty(y,"signal",{enumerable:!0,get:()=>(t.signal.aborted?f=!0:t.signal.addEventListener("abort",()=>{f=!0}),t.signal)})},w=F1(t.options,t.fetchOptions),v=async(y,x,A)=>{if(f)return Promise.reject();if(x==null&&y.pages.length)return Promise.resolve(y);const E={queryKey:t.queryKey,pageParam:x,direction:A?"backward":"forward",meta:t.options.meta};k(E);const j=await w(E),{maxPages:P}=t.options,S=A?ez:XR;return{pages:S(y.pages,j,P),pageParams:S(y.pageParams,x,P)}};if(a&&i.length){const y=a==="backward",x=y?pz:ay,A={pages:i,pageParams:s},E=x(r,A);l=await v(A,E,y)}else{const y=e??i.length;do{const x=d===0?s[0]??r.initialPageParam:ay(r,l);if(d>0&&x==null)break;l=await v(l,x),d++}while(d<y)}return l};t.options.persister?t.fetchFn=()=>{var f,k;return(k=(f=t.options).persister)==null?void 0:k.call(f,c,{queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},n)}:t.fetchFn=c}}}function ay(e,{pages:t,pageParams:n}){const r=t.length-1;return t.length>0?e.getNextPageParam(t[r],t,n[r],n):void 0}function pz(e,{pages:t,pageParams:n}){var r;return t.length>0?(r=e.getPreviousPageParam)==null?void 0:r.call(e,t[0],t,n[0],n):void 0}var nt,Kr,Yr,gs,hs,Zr,fs,vs,M0,gz=(M0=class{constructor(e={}){ze(this,nt);ze(this,Kr);ze(this,Yr);ze(this,gs);ze(this,hs);ze(this,Zr);ze(this,fs);ze(this,vs);xe(this,nt,e.queryCache||new dz),xe(this,Kr,e.mutationCache||new mz),xe(this,Yr,e.defaultOptions||{}),xe(this,gs,new Map),xe(this,hs,new Map),xe(this,Zr,0)}mount(){$l(this,Zr)._++,D(this,Zr)===1&&(xe(this,fs,O1.subscribe(async e=>{e&&(await this.resumePausedMutations(),D(this,nt).onFocus())})),xe(this,vs,Tc.subscribe(async e=>{e&&(await this.resumePausedMutations(),D(this,nt).onOnline())})))}unmount(){var e,t;$l(this,Zr)._--,D(this,Zr)===0&&((e=D(this,fs))==null||e.call(this),xe(this,fs,void 0),(t=D(this,vs))==null||t.call(this),xe(this,vs,void 0))}isFetching(e){return D(this,nt).findAll({...e,fetchStatus:"fetching"}).length}isMutating(e){return D(this,Kr).findAll({...e,status:"pending"}).length}getQueryData(e){var n;const t=this.defaultQueryOptions({queryKey:e});return(n=D(this,nt).get(t.queryHash))==null?void 0:n.state.data}ensureQueryData(e){const t=this.getQueryData(e.queryKey);if(t===void 0)return this.fetchQuery(e);{const n=this.defaultQueryOptions(e),r=D(this,nt).build(this,n);return e.revalidateIfStale&&r.isStaleByTime(Qb(n.staleTime,r))&&this.prefetchQuery(n),Promise.resolve(t)}}getQueriesData(e){return D(this,nt).findAll(e).map(({queryKey:t,state:n})=>{const r=n.data;return[t,r]})}setQueryData(e,t,n){const r=this.defaultQueryOptions({queryKey:e}),a=D(this,nt).get(r.queryHash),i=a==null?void 0:a.state.data,s=HR(t,i);if(s!==void 0)return D(this,nt).build(this,r).setData(s,{...n,manual:!0})}setQueriesData(e,t,n){return Nt.batch(()=>D(this,nt).findAll(e).map(({queryKey:r})=>[r,this.setQueryData(r,t,n)]))}getQueryState(e){var n;const t=this.defaultQueryOptions({queryKey:e});return(n=D(this,nt).get(t.queryHash))==null?void 0:n.state}removeQueries(e){const t=D(this,nt);Nt.batch(()=>{t.findAll(e).forEach(n=>{t.remove(n)})})}resetQueries(e,t){const n=D(this,nt),r={type:"active",...e};return Nt.batch(()=>(n.findAll(e).forEach(a=>{a.reset()}),this.refetchQueries(r,t)))}cancelQueries(e={},t={}){const n={revert:!0,...t},r=Nt.batch(()=>D(this,nt).findAll(e).map(a=>a.cancel(n)));return Promise.all(r).then(kn).catch(kn)}invalidateQueries(e={},t={}){return Nt.batch(()=>{if(D(this,nt).findAll(e).forEach(r=>{r.invalidate()}),e.refetchType==="none")return Promise.resolve();const n={...e,type:e.refetchType??e.type??"active"};return this.refetchQueries(n,t)})}refetchQueries(e={},t){const n={...t,cancelRefetch:(t==null?void 0:t.cancelRefetch)??!0},r=Nt.batch(()=>D(this,nt).findAll(e).filter(a=>!a.isDisabled()).map(a=>{let i=a.fetch(void 0,n);return n.throwOnError||(i=i.catch(kn)),a.state.fetchStatus==="paused"?Promise.resolve():i}));return Promise.all(r).then(kn)}fetchQuery(e){const t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);const n=D(this,nt).build(this,t);return n.isStaleByTime(Qb(t.staleTime,n))?n.fetch(t):Promise.resolve(n.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(kn).catch(kn)}fetchInfiniteQuery(e){return e.behavior=ry(e.pages),this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(kn).catch(kn)}ensureInfiniteQueryData(e){return e.behavior=ry(e.pages),this.ensureQueryData(e)}resumePausedMutations(){return Tc.isOnline()?D(this,Kr).resumePausedMutations():Promise.resolve()}getQueryCache(){return D(this,nt)}getMutationCache(){return D(this,Kr)}getDefaultOptions(){return D(this,Yr)}setDefaultOptions(e){xe(this,Yr,e)}setQueryDefaults(e,t){D(this,gs).set(nl(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){const t=[...D(this,gs).values()];let n={};return t.forEach(r=>{rl(e,r.queryKey)&&(n={...n,...r.defaultOptions})}),n}setMutationDefaults(e,t){D(this,hs).set(nl(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){const t=[...D(this,hs).values()];let n={};return t.forEach(r=>{rl(e,r.mutationKey)&&(n={...n,...r.defaultOptions})}),n}defaultQueryOptions(e){if(e._defaulted)return e;const t={...D(this,Yr).queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||(t.queryHash=Af(t.queryKey,t)),t.refetchOnReconnect===void 0&&(t.refetchOnReconnect=t.networkMode!=="always"),t.throwOnError===void 0&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode="offlineFirst"),t.enabled!==!0&&t.queryFn===Ef&&(t.enabled=!1),t}defaultMutationOptions(e){return e!=null&&e._defaulted?e:{...D(this,Yr).mutations,...(e==null?void 0:e.mutationKey)&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){D(this,nt).clear(),D(this,Kr).clear()}},nt=new WeakMap,Kr=new WeakMap,Yr=new WeakMap,gs=new WeakMap,hs=new WeakMap,Zr=ne
477w WeakMap,fs=new WeakMap,vs=new WeakMap,M0),G1=g.createContext(void 0),rU=e=>{const t=g.useContext(G1);if(!t)throw new Error("No QueryClient set, use QueryClientProvider to set one");return t},hz=({client:e,children:t})=>(g.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),o.jsx(G1.Provider,{value:e,children:t}));/** 478 * @remix-run/router v1.20.0 479 * 480 * Copyright (c) Remix Software Inc. 481 * 482 * This source code is licensed under the MIT license found in the 483 * LICENSE.md file in the root directory of this source tree. 484 * 485 * @license MIT 486 */function al(){return al=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},al.apply(this,arguments)}var Xr;(function(e){e.Pop="POP",e.Push="PUSH",e.Replace="REPLACE"})(Xr||(Xr={}));const iy="popstate";function fz(e){e===void 0&&(e={});function t(r,a){let{pathname:i,search:s,hash:l}=r.location;return wg("",{pathname:i,search:s,hash:l},a.state&&a.state.usr||null,a.state&&a.state.key||"default")}function n(r,a){return typeof a=="string"?a:Dc(a)}return bz(t,n,null,e)}function lt(e,t){if(e===!1||e===null||typeof e>"u")throw new Error(t)}function H1(e,t){if(!e){typeof console<"u"&&console.warn(t);try{throw new Error(t)}catch{}}}function vz(){return Math.random().toString(36).substr(2,8)}function sy(e,t){return{usr:e.state,key:e.key,idx:t}}function wg(e,t,n,r){return n===void 0&&(n=null),al({pathname:typeof e=="string"?e:e.pathname,search:"",hash:""},typeof t=="string"?Hs(t):t,{state:n,key:t&&t.key||r||vz()})}function Dc(e){let{pathname:t="/",search:n="",hash:r=""}=e;return n&&n!=="?"&&(t+=n.charAt(0)==="?"?n:"?"+n),r&&r!=="#"&&(t+=r.charAt(0)==="#"?r:"#"+r),t}function Hs(e){let t={};if(e){let n=e.indexOf("#");n>=0&&(t.hash=e.substr(n),e=e.substr(0,n));let r=e.indexOf("?");r>=0&&(t.search=e.substr(r),e=e.substr(0,r)),e&&(t.pathname=e)}return t}function bz(e,t,n,r){r===void 0&&(r={});let{window:a=document.defaultView,v5Compat:i=!1}=r,s=a.history,l=Xr.Pop,d=null,c=u();c==null&&(c=0,s.replaceState(al({},s.state,{idx:c}),""));function u(){return(s.state||{idx:null}).idx}function m(){l=Xr.Pop;let k=u(),w=k==null?null:k-c;c=k,d&&d({action:l,location:f.location,delta:w})}function p(k,w){l=Xr.Push;let v=wg(f.location,k,w);c=u()+1;let y=sy(v,c),x=f.createHref(v);try{s.pushState(y,"",x)}catch(A){if(A instanceof DOMException&&A.name==="DataCloneError")throw A;a.location.assign(x)}i&&d&&d({action:l,location:f.location,delta:1})}function h(k,w){l=Xr.Replace;let v=wg(f.location,k,w);c=u();let y=sy(v,c),x=f.createHref(v);s.replaceState(y,"",x),i&&d&&d({action:l,location:f.location,delta:0})}function b(k){let w=a.location.origin!=="null"?a.location.origin:a.location.href,v=typeof k=="string"?k:Dc(k);return v=v.replace(/ $/,"%20"),lt(w,"No window.location.(origin|href) available to create URL for href: "+v),new URL(v,w)}let f={get action(){return l},get location(){return e(a,s)},listen(k){if(d)throw new Error("A history only accepts one active listener");return a.addEventListener(iy,m),d=k,()=>{a.removeEventListener(iy,m),d=null}},createHref(k){return t(a,k)},createURL:b,encodeLocation(k){let w=b(k);return{pathname:w.pathname,search:w.search,hash:w.hash}},push:p,replace:h,go(k){return s.go(k)}};return f}var oy;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})(oy||(oy={}));function yz(e,t,n){return n===void 0&&(n="/"),wz(e,t,n,!1)}function wz(e,t,n,r){let a=typeof t=="string"?Hs(t):t,i=Pf(a.pathname||"/",n);if(i==null)return null;let s=K1(e);kz(s);let l=null;for(let d=0;l==null&&d<s.length;++d){let c=Rz(i);l=Tz(s[d],c,r)}return l}function K1(e,t,n,r){t===void 0&&(t=[]),n===void 0&&(n=[]),r===void 0&&(r="");let a=(i,s,l)=>{let d={relativePath:l===void 0?i.path||"":l,caseSensitive:i.caseSensitive===!0,childrenIndex:s,route:i};d.relativePath.startsWith("/")&&(lt(d.relativePath.startsWith(r),'Absolute route path "'+d.relativePath+'" nested under path '+('"'+r+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),d.relativePath=d.relativePath.slice(r.length));let c=ua([r,d.relativePath]),u=n.concat(d);i.children&&i.children.length>0&&(lt(i.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+c+'".')),K1(i.children,t,u,c)),!(i.path==null&&!i.index)&&t.push({path:c,score:Sz(c,i.index),routesMeta:u})};return e.forEach((i,s)=>{var l;if(i.path===""||!((l=i.path)!=null&&l.includes("?")))a(i,s);else for(let d of Y1(i.path))a(i,s,d)}),t}function Y1(e){let t=e.split("/");if(t.length===0)return[];let[n,...r]=t,a=n.endsWith("?"),i=n.replace(/\?$/,"");if(r.length===0)return a?[i,""]:[i];let s=Y1(r.join("/")),l=[];return l.push(...s.map(d=>d===""?i:[i,d].join("/"))),a&&l.push(...s),l.map(d=>e.startsWith("/")&&d===""?"/":d)}function kz(e){e.sort((t,n)=>t.score!==n.score?n.score-t.score:_z(t.routesMeta.map(r=>r.childrenIndex),n.routesMeta.map(r=>r.childrenIndex)))}const xz=/^:[\w-]+$/,jz=3,Az=2,Ez=1,Pz=10,Cz=-2,ly=e=>e==="*";function Sz(e,t){let n=e.split("/"),r=n.length;return n.some(ly)&&(r+=Cz),t&&(r+=Az),n.filter(a=>!ly(a)).reduce((a,i)=>a+(xz.test(i)?jz:i===""?Ez:Pz),r)}function _z(e,t){return e.length===t.length&&e.slice(0,-1).every((r,a)=>r===t[a])?e[e.length-1]-t[t.length-1]:0}function Tz(e,t,n){let{routesMeta:r}=e,a={},i="/",s=[];for(let l=0;l<r.length;++l){let d=r[l],c=l===r.length-1,u=i==="/"?t:t.slice(i.length)||"/",m=dy({path:d.relativePath,caseSensitive:d.caseSensitive,end:c},u),p=d.route;if(!m&&c&&n&&!r[r.length-1].route.index&&(m=dy({path:d.relativePath,caseSensitive:d.caseSensitive,end:!1},u)),!m)return null;
vendor: 9,495 bytes, lines 486-495
486Object.assign(a,m.params),s.push({params:a,pathname:ua([i,m.pathname]),pathnameBase:Nz(ua([i,m.pathnameBase])),route:p}),m.pathnameBase!=="/"&&(i=ua([i,m.pathnameBase]))}return s}function dy(e,t){typeof e=="string"&&(e={path:e,caseSensitive:!1,end:!0});let[n,r]=Dz(e.path,e.caseSensitive,e.end),a=t.match(n);if(!a)return null;let i=a[0],s=i.replace(/(.)\/+$/,"$1"),l=a.slice(1);return{params:r.reduce((c,u,m)=>{let{paramName:p,isOptional:h}=u;if(p==="*"){let f=l[m]||"";s=i.slice(0,i.length-f.length).replace(/(.)\/+$/,"$1")}const b=l[m];return h&&!b?c[p]=void 0:c[p]=(b||"").replace(/%2F/g,"/"),c},{}),pathname:i,pathnameBase:s,pattern:e}}function Dz(e,t,n){t===void 0&&(t=!1),n===void 0&&(n=!0),H1(e==="*"||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were '+('"'+e.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+e.replace(/\*$/,"/*")+'".'));let r=[],a="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(s,l,d)=>(r.push({paramName:l,isOptional:d!=null}),d?"/?([^\\/]+)?":"/([^\\/]+)"));return e.endsWith("*")?(r.push({paramName:"*"}),a+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):n?a+="\\/*$":e!==""&&e!=="/"&&(a+="(?:(?=\\/|$))"),[new RegExp(a,t?void 0:"i"),r]}function Rz(e){try{return e.split("/").map(t=>decodeURIComponent(t).replace(/\//g,"%2F")).join("/")}catch(t){return H1(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+t+").")),e}}function Pf(e,t){if(t==="/")return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith("/")?t.length-1:t.length,r=e.charAt(n);return r&&r!=="/"?null:e.slice(n)||"/"}function zz(e,t){t===void 0&&(t="/");let{pathname:n,search:r="",hash:a=""}=typeof e=="string"?Hs(e):e;return{pathname:n?n.startsWith("/")?n:Iz(n,t):t,search:Lz(r),hash:Bz(a)}}function Iz(e,t){let n=t.replace(/\/+$/,"").split("/");return e.split("/").forEach(a=>{a===".."?n.length>1&&n.pop():a!=="."&&n.push(a)}),n.length>1?n.join("/"):"/"}function Dm(e,t,n,r){return"Cannot include a '"+e+"' character in a manually specified "+("`to."+t+"` field ["+JSON.stringify(r)+"]. Please separate it out to the ")+("`to."+n+"` field. Alternatively you may provide the full path as ")+'a string in <Link to="..."> and the router will parse it for you.'}function qz(e){return e.filter((t,n)=>n===0||t.route.path&&t.route.path.length>0)}function Cf(e,t){let n=qz(e);return t?n.map((r,a)=>a===n.length-1?r.pathname:r.pathnameBase):n.map(r=>r.pathnameBase)}function Sf(e,t,n,r){r===void 0&&(r=!1);let a;typeof e=="string"?a=Hs(e):(a=al({},e),lt(!a.pathname||!a.pathname.includes("?"),Dm("?","pathname","search",a)),lt(!a.pathname||!a.pathname.includes("#"),Dm("#","pathname","hash",a)),lt(!a.search||!a.search.includes("#"),Dm("#","search","hash",a)));let i=e===""||a.pathname==="",s=i?"/":a.pathname,l;if(s==null)l=n;else{let m=t.length-1;if(!r&&s.startsWith("..")){let p=s.split("/");for(;p[0]==="..";)p.shift(),m-=1;a.pathname=p.join("/")}l=m>=0?t[m]:"/"}let d=zz(a,l),c=s&&s!=="/"&&s.endsWith("/"),u=(i||s===".")&&n.endsWith("/");return!d.pathname.endsWith("/")&&(c||u)&&(d.pathname+="/"),d}const ua=e=>e.join("/").replace(/\/\/+/g,"/"),Nz=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),Lz=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,Bz=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e;function Mz(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}const Z1=["post","put","patch","delete"];new Set(Z1);const Fz=["get",...Z1];new Set(Fz);/** 487 * React Router v6.27.0 488 * 489 * Copyright (c) Remix Software Inc. 490 * 491 * This source code is licensed under the MIT license found in the 492 * LICENSE.md file in the root directory of this source tree. 493 * 494 * @license MIT 495 */function il(){return il=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},il.apply(this,arguments)}const _f=g.createContext(null),Oz=g.createContext(null),_a=g.createContext(null),_u=g.createContext(null),Tr=g.createContext({outlet:null,matches:[],isDataRoute:!1}),J1=g.createContext(null);function Vz(e,t){let{relative:n}=t===void 0?{}:t;Ks()||lt(!1);let{basename:r,navigator:a}=g.useContext(_a),{hash:i,pathname:s,search:l}=X1(e,{relative:n}),d=s;return r!=="/"&&(d=s==="/"?r:ua([r,s])),a.createHref({pathname:d,search:l,hash:i})}function Ks(){return g.useContext(_u)!=null}function Ln(){return Ks()||lt(!1),g.useContext(_u).location}function Q1(e){g.useContext(_a).static||g.useLayoutEffect(e)}function xt(){let{isDataRoute:e}=g.useContext(Tr);return e?tI():Wz()}function Wz(){Ks()||lt(!1);let e=g.useContext(_f),{basename:t,future:n,navigator:r}=g.useContext(_a),{matches:a}=g.useContext(Tr),{pathname:i}=Ln(),s=JSON.stringify(Cf(a,n.v7_relativeSplatPath)),l=g.useRef(!1);return Q1(()=>{l.current=!0}),g.useCallback(function(c,u){if(u===void 0&&(u={}),!l.current)return;if(typeof c=="number"){r.go(c);return}let m=Sf(c,JSON.parse(s),i,u.relative==="path");e==null&&t!=="/"&&(m.pathname=m.pathname==="/"?t:ua([t,m.pathname])),(u.replace?r.replace:r.push)(m,u.state,u)},[t,r,s,i,e])}function aU(){let{matches:e}=g.useContext(Tr),t=e[e.length-1];return t?t.params:{}}function X1(e,t){let{relative:n}=t===void 0?{}:t,{future:r}=g.useContext(_a),{matches:a}=g.useContext(Tr),{pathname:i}=Ln(),s=JSON.stringify(Cf(a,r.v7_relativeSplatPath));return g.useMemo(()=>Sf(e,JSON.parse(s),i,n==="path"),[e,s,i,n])}function Uz(e,t){return $z(e,t)}function $z(e,t,n,r){Ks()||lt(!1);let{navigator:a}=g.useContext(_a),{matches:i}=g.useContext(Tr),s=i[i.length-1],l=s?s.params:{};s&&s.pathname;let d=s?s.pathnameBase:"/";s&&s.route;let c=Ln(),u;if(t){var m;let k=typeof t=="string"?Hs(t):t;d==="/"||(m=k.pathname)!=null&&m.startsWith(d)||lt(!1),u=k}else u=c;let p=u.pathname||"/",h=p;if(d!=="/"){let k=d.replace(/^\//,"").split("/");h="/"+p.replace(/^\//,"").split("/").slice(k.length).join("/")}let b=yz(e,{pathname:h}),f=Zz(b&&b.map(k=>Object.assign({},k,{params:Object.assign({},l,k.params),pathname:ua([d,a.encodeLocation?a.encodeLocation(k.pathname).pathname:k.pathname]),pathnameBase:k.pathnameBase==="/"?d:ua([d,a.encodeLocation?a.encodeLocation(k.pathnameBase).pathname:k.pathnameBase])})),i,n,r);return t&&f?g.createElement(_u.Provider,{value:{location:il({pathname:"/",search:"",hash:"",state:null,key:"default"},u),navigationType:Xr.Pop}},f):f}function Gz(){let e=eI(),t=Mz(e)?e.status+" "+e.statusText:e instanceof Error?e.message:JSON.stringify(e),n=e instanceof Error?e.stack:null,a={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"};return g.createElement(g.Fragment,null,g.createElement("h2",null,"Unexpected Application Error!"),g.createElement("h3",{style:{fontStyle:"italic"}},t),n?g.createElement("pre",{style:a},n):null,null)}const Hz=g.createElement(Gz,null);class Kz extends g.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,n){return n.location!==t.location||n.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error!==void 0?t.error:n.error,location:n.location,revalidation:t.revalidation||n.revalidation}}componentDidCatch(t,n){console.error("React Router caught the following error during render",t,n)}render(){return this.state.error!==void 0?g.createElement(Tr.Provider,{value:this.props.routeContext},g.createElement(J1.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function Yz(e){let{routeContext:t,match:n,children:r}=e,a=g.useContext(_f);return a&&a.static&&a.staticContext&&(n.route.errorElement||n.route.ErrorBoundary)&&(a.staticContext._deepestRenderedBoundaryId=n.route.id),g.createElement(Tr.Provider,{value:t},r)}function Zz(e,t,n,r){var a;if(t===void 0&&(t=[]),n===void 0&&(n=null),r===void 0&&(r=null),e==null){var i;if(!n)return null;if(n.errors)e=n.matches;else if((i=r)!=null&&i.v7_partialHydration&&t.length===0&&!n.initialized&&n.matches.length>0)e=n.matches;else return null}let s=e,l=(a=n)==null?void 0:a.errors;if(l!=null){let u=s.findIndex(m=>m.route.id&&(l==null?void 0:l[m.route.id])!==void 0);u>=0||lt(!1),s=s.slice(0,Math.min(s.length,u+1))}let d=!1,c=-1;if(n&&r&&r.v7_partialHydration)for(let u=0;u<s.length;u++){let m=s[u];if((m.route.HydrateFallback||m.route.hydrateFallbackElement)&&(c=u),m.route.id){let{loaderData:p,errors:h}=n,b=m.route.loader&&p[m.route.id]===void 0&&(!h||h[m.route.id]===void 0);if(m.route.lazy||b){d=!0,c>=0?s=s.slice(0,c+1):s=[s[0]];break}}}return s.reduceRight((u,m,p)=>{let h,b=!1,f=null,k=null;n&&(h=l&&m.route.id?l[m.route.id]:void 0,f=m.route.errorElement||Hz,d&&(c<0&&p===0?(b=!0,k=null):c===p&&(b=!0,k=m.route.hydrateFallbackElement||null)));let w=t.concat(s.slice(0,p+1)),v=()=>{let y;return h?y=f:b?y=k:m.route.Component?y=g.createElement(m.route.Component,null):m.route.element?y=m.route.element:y=u,g.createElement(Yz,{match:m,routeContext:{outlet:u,matches:w,isDataRoute:n!=null},children:y})};return n&&(m.route.ErrorBoundary||m.route.errorElement||p===0)?g.createElement(Kz,{location:n.location,revalidation:n.revalidation,component:f,error:h,children:v(),routeC
495ontext:{outlet:null,matches:w,isDataRoute:!0}}):v()},null)}var ej=function(e){return e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e}(ej||{}),Rc=function(e){return e.UseBlocker="useBlocker",e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e.UseRouteId="useRouteId",e}(Rc||{});function Jz(e){let t=g.useContext(_f);return t||lt(!1),t}function Qz(e){let t=g.useContext(Oz);return t||lt(!1),t}function Xz(e){let t=g.useContext(Tr);return t||lt(!1),t}function tj(e){let t=Xz(),n=t.matches[t.matches.length-1];return n.route.id||lt(!1),n.route.id}function eI(){var e;let t=g.useContext(J1),n=Qz(Rc.UseRouteError),r=tj(Rc.UseRouteError);return t!==void 0?t:(e=n.errors)==null?void 0:e[r]}function tI(){let{router:e}=Jz(ej.UseNavigateStable),t=tj(Rc.UseNavigateStable),n=g.useRef(!1);return Q1(()=>{n.current=!0}),g.useCallback(function(a,i){i===void 0&&(i={}),n.current&&(typeof a=="number"?e.navigate(a):e.navigate(a,il({fromRouteId:t},i)))},[e,t])}function nI(e){let{to:t,replace:n,state:r,relative:a}=e;Ks()||lt(!1);let{future:i,static:s}=g.useContext(_a),{matches:l}=g.useContext(Tr),{pathname:d}=Ln(),c=xt(),u=Sf(t,Cf(l,i.v7_relativeSplatPath),d,a==="path"),m=JSON.stringify(u);return g.useEffect(()=>c(JSON.parse(m),{replace:n,state:r,relative:a}),[c,m,a,n,r]),null}function R(e){lt(!1)}function rI(e){let{basename:t="/",children:n=null,location:r,navigationType:a=Xr.Pop,navigator:i,static:s=!1,future:l}=e;Ks()&<(!1);let d=t.replace(/^\/*/,"/"),c=g.useMemo(()=>({basename:d,navigator:i,static:s,future:il({v7_relativeSplatPath:!1},l)}),[d,l,i,s]);typeof r=="string"&&(r=Hs(r));let{pathname:u="/",search:m="",hash:p="",state:h=null,key:b="default"}=r,f=g.useMemo(()=>{let k=Pf(u,d);return k==null?null:{location:{pathname:k,search:m,hash:p,state:h,key:b},navigationType:a}},[d,u,m,p,h,b,a]);return f==null?null:g.createElement(_a.Provider,{value:c},g.createElement(_u.Provider,{children:n,value:f}))}function aI(e){let{children:t,location:n}=e;return Uz(kg(t),n)}new Promise(()=>{});function kg(e,t){t===void 0&&(t=[]);let n=[];return g.Children.forEach(e,(r,a)=>{if(!g.isValidElement(r))return;let i=[...t,a];if(r.type===g.Fragment){n.push.apply(n,kg(r.props.children,i));return}r.type!==R&<(!1),!r.props.index||!r.props.children||lt(!1);let s={id:r.props.id||i.join("-"),caseSensitive:r.props.caseSensitive,element:r.props.element,Component:r.props.Component,index:r.props.index,path:r.props.path,loader:r.props.loader,action:r.props.action,errorElement:r.props.errorElement,ErrorBoundary:r.props.ErrorBoundary,hasErrorBoundary:r.props.ErrorBoundary!=null||r.props.errorElement!=null,shouldRevalidate:r.props.shouldRevalidate,handle:r.props.handle,lazy:r.props.lazy};r.props.children&&(s.children=kg(r.props.children,i)),n.push(s)}),n}/** 496 * React Router DOM v6.27.0 497 * 498 * Copyright (c) Remix Software Inc. 499 * 500 * This source code is licensed under the MIT license found in the 501 * LICENSE.md file in the root directory of this source tree. 502 * 503 * @license MIT 504 */function xg(){return xg=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},xg.apply(this,arguments)}function iI(e,t){if(e==null)return{};var n={},r=Object.keys(e),a,i;for(i=0;i<r.length;i++)a=r[i],!(t.indexOf(a)>=0)&&(n[a]=e[a]);return n}function sI(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function oI(e,t){return e.button===0&&(!t||t==="_self")&&!sI(e)}function jg(e){return e===void 0&&(e=""),new URLSearchParams(typeof e=="string"||Array.isArray(e)||e instanceof URLSearchParams?e:Object.keys(e).reduce((t,n)=>{let r=e[n];return t.concat(Array.isArray(r)?r.map(a=>[n,a]):[[n,r]])},[]))}function lI(e,t){let n=jg(e);return t&&t.forEach((r,a)=>{n.has(a)||t.getAll(a).forEach(i=>{n.append(a,i)})}),n}const dI=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","viewTransition"],cI="6";try{window.__reactRouterVersion=cI}catch{}const uI="startTransition",cy=sh[uI];function mI(e){let{basename:t,children:n,future:r,window:a}=e,i=g.useRef();i.current==null&&(i.current=fz({window:a,v5Compat:!0}));let s=i.current,[l,d]=g.useState({action:s.action,location:s.location}),{v7_startTransition:c}=r||{},u=g.useCallback(m=>{c&&cy?cy(()=>d(m)):d(m)},[d,c]);return g.useLayoutEffect(()=>
504s.listen(u),[s,u]),g.createElement(rI,{basename:t,children:n,location:l.location,navigationType:l.action,navigator:s,future:r})}const pI=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",gI=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Ce=g.forwardRef(function(t,n){let{onClick:r,relative:a,reloadDocument:i,replace:s,state:l,target:d,to:c,preventScrollReset:u,viewTransition:m}=t,p=iI(t,dI),{basename:h}=g.useContext(_a),b,f=!1;if(typeof c=="string"&&gI.test(c)&&(b=c,pI))try{let y=new URL(window.location.href),x=c.startsWith("//")?new URL(y.protocol+c):new URL(c),A=Pf(x.pathname,h);x.origin===y.origin&&A!=null?c=A+x.search+x.hash:f=!0}catch{}let k=Vz(c,{relative:a}),w=hI(c,{replace:s,state:l,target:d,preventScrollReset:u,relative:a,viewTransition:m});function v(y){r&&r(y),y.defaultPrevented||w(y)}return g.createElement("a",xg({},p,{href:b||k,onClick:f||i?r:v,ref:n,target:d}))});var uy;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(uy||(uy={}));var my;(function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(my||(my={}));function hI(e,t){let{target:n,replace:r,state:a,preventScrollReset:i,relative:s,viewTransition:l}=t===void 0?{}:t,d=xt(),c=Ln(),u=X1(e,{relative:s});return g.useCallback(m=>{if(oI(m,n)){m.preventDefault();let p=r!==void 0?r:Dc(c)===Dc(u);d(e,{replace:p,state:a,preventScrollReset:i,relative:s,viewTransition:l})}},[c,d,u,r,a,n,e,i,s,l])}function iU(e){let t=g.useRef(jg(e)),n=g.useRef(!1),r=Ln(),a=g.useMemo(()=>lI(r.search,n.current?null:t.current),[r.search]),i=xt(),s=g.useCallback((l,d)=>{const c=jg(typeof l=="function"?l(a):l);n.current=!0,i("?"+c,d)},[i,a]);return[a,s]}const fI=["/gemeente","/gemeenten","/observatorium","/verkenning","/voorbeeld-rapport-woning","/voorbeeld-rapport-investering","/notariskosten-berekenen"];function Tf(e){const t=e.toLowerCase();for(const n of fI)if(t===n||t.startsWith(n+"/"))return"nl";return"fr"}const Ag={"/communes":"/gemeenten","/observatoire":"/observatorium","/observatoire/tendances-regionales":"/observatorium/regionale-trends","/observatoire/atlas":"/observatorium/atlas","/exploration":"/verkenning","/exemple-rapport-habitation":"/voorbeeld-rapport-woning","/exemple-rapport-investissement":"/voorbeeld-rapport-investering","/simulateur-frais-acte":"/notariskosten-berekenen"},py=Object.fromEntries(Object.entries(Ag).map(([e,t])=>[t,e]));function Df(e){let t=e.length>1&&e.endsWith("/")?e.slice(0,-1):e;return t=t.toLowerCase(),t in Ag?{fr:t,nl:Ag[t]}:t in py?{fr:py[t],nl:t}:null}let nj=null;function sU(e){nj=e}function vI(e){return Df(e)??nj}const rj=g.createContext(void 0),bI=()=>navigator.language.toLowerCase().startsWith("nl")?"nl":"fr",yI=()=>{if(Tf(window.location.pathname)==="nl")return"nl";const e=localStorage.getItem("language");return e==="fr"||e==="nl"?e:bI()},wI=({children:e,translations:t})=>{const[n,r]=g.useState(yI);g.useEffect(()=>{localStorage.setItem("language",n),document.documentElement.lang=n},[n]);const a=s=>{r(s)},i=s=>{const l=s.split(".");let d=t[n];for(const c of l)if(d&&typeof d=="object"&&c in d)d=d[c];else{if(n!=="fr"){let u=t.fr;for(const m of l)if(u&&typeof u=="object"&&m in u)u=u[m];else return s;return typeof u=="string"?u:s}return s}return typeof d=="string"?d:s};return o.jsx(rj.Provider,{value:{language:n,setLanguage:a,t:i},children:e})},Ge=()=>{const e=g.useContext(rj);if(!e)throw new Error("useLanguage must be used within a LanguageProvider");return e};/*! 505* CookieConsent 3.1.0 506* https://github.com/orestbida/cookieconsent 507* Author Orest Bida 508* Released under the MIT License 509*/const aj="opt-in",vo="opt-out",ij="show--consent",sj="show--preferences",gy="disable--interaction",zc="data-category",Te="div",Pn="button",Cn="aria-hidden",Ro="btn-group",St="click",is="data-role",Rf="consentModal",zf="preferencesModal";class kI{constructor(){this.t={mode:aj,revision:0,autoShow:!0,lazyHtmlGeneration:!0,autoClearCookies:!0,manageScriptTags:!0,hideFromBots:!0,cookie
vendor: 8,398 bytes, line 509
509:{name:"cc_cookie",expiresAfterDays:182,domain:"",path:"/",secure:!0,sameSite:"Lax"}},this.o={i:{},l:"",_:{},u:{},p:{},m:[],v:!1,h:null,C:null,S:null,M:"",D:!0,T:!1,k:!1,A:!1,N:!1,H:[],V:!1,I:!0,L:[],j:!1,F:"",P:!1,O:[],R:[],B:[],$:[],G:!1,J:!1,U:!1,q:[],K:[],W:[],X:{},Y:{},Z:{},ee:{},te:{},oe:[]},this.ne={ae:{},se:{}},this.ce={},this.re={ie:"cc:onFirstConsent",le:"cc:onConsent",de:"cc:onChange",fe:"cc:onModalShow",_e:"cc:onModalHide",ue:"cc:onModalReady"}}}const T=new kI,oj=(e,t)=>e.indexOf(t),Ne=(e,t)=>oj(e,t)!==-1,Nl=e=>Array.isArray(e),fi=e=>typeof e=="string",Eg=e=>!!e&&typeof e=="object"&&!Nl(e),Yn=e=>typeof e=="function",Qa=e=>Object.keys(e),lj=e=>Array.from(new Set(e)),Ic=()=>document.activeElement,Hi=e=>e.preventDefault(),If=(e,t)=>e.querySelectorAll(t),re=e=>{const t=document.createElement(e);return e===Pn&&(t.type=e),t},ge=(e,t,n)=>e.setAttribute(t,n),Rm=(e,t,n)=>{e.removeAttribute(n?"data-"+t:t)},Gd=(e,t,n)=>e.getAttribute(n?"data-"+t:t),ne=(e,t)=>e.appendChild(t),Le=(e,t)=>e.classList.add(t),Rt=(e,t)=>Le(e,"cm__"+t),Se=(e,t)=>Le(e,"pm__"+t),ma=(e,t)=>e.classList.remove(t),ea=e=>{if(typeof e!="object")return e;if(e instanceof Date)return new Date(e.getTime());let t=Array.isArray(e)?[]:{};for(let n in e){let r=e[n];t[n]=ea(r)}return t},hy=(e,t)=>dispatchEvent(new CustomEvent(e,{detail:t})),Qe=(e,t,n,r)=>{e.addEventListener(t,n),r&&T.o.m.push({pe:e,ge:t,me:n})},xI=()=>{const e=T.t.cookie.expiresAfterDays;return Yn(e)?e(T.o.F):e},zm=(e,t)=>{const n=e||[],r=t||[];return n.filter(a=>!Ne(r,a)).concat(r.filter(a=>!Ne(n,a)))},dj=e=>{T.o.R=lj(e),T.o.F=(()=>{let t="custom";const{R:n,O:r,B:a}=T.o,i=n.length;return i===r.length?t="all":i===a.length&&(t="necessary"),t})()},cj=(e,t,n,r)=>{const a="accept-",{show:i,showPreferences:s,hide:l,hidePreferences:d,acceptCategory:c}=t,u=e||document,m=y=>If(u,`[data-cc="${y}"]`),p=(y,x)=>{Hi(y),c(x),d(),l()},h=m("show-preferencesModal"),b=m("show-consentModal"),f=m(a+"all"),k=m(a+"necessary"),w=m(a+"custom"),v=T.t.lazyHtmlGeneration;for(const y of h)ge(y,"aria-haspopup","dialog"),Qe(y,St,x=>{Hi(x),s()}),v&&(Qe(y,"mouseenter",x=>{Hi(x),T.o.N||n(t,r)},!0),Qe(y,"focus",()=>{T.o.N||n(t,r)}));for(let y of b)ge(y,"aria-haspopup","dialog"),Qe(y,St,x=>{Hi(x),i(!0)},!0);for(let y of f)Qe(y,St,x=>{p(x,"all")},!0);for(let y of w)Qe(y,St,x=>{p(x)},!0);for(let y of k)Qe(y,St,x=>{p(x,[])},!0)},nr=(e,t)=>{e&&(t&&(e.tabIndex=-1),e.focus(),t&&e.removeAttribute("tabindex"))},uj=(e,t)=>{const n=r=>{r.target.removeEventListener("transitionend",n),r.propertyName==="opacity"&&getComputedStyle(e).opacity==="1"&&nr((a=>a===1?T.ne.be:T.ne.ve)(t))};Qe(e,"transitionend",n)};let fy;const mj=e=>{clearTimeout(fy),e?Le(T.ne.ye,gy):fy=setTimeout(()=>{ma(T.ne.ye,gy)},500)},jI=["M 19.5 4.5 L 4.5 19.5 M 4.5 4.501 L 19.5 19.5","M 3.572 13.406 L 8.281 18.115 L 20.428 5.885","M 21.999 6.94 L 11.639 17.18 L 2.001 6.82 "],sl=(e=0,t=1.5)=>`<svg viewBox="0 0 24 24" stroke-width="${t}"><path d="${jI[e]}"/></svg>`,pj=e=>{const t=T.ne,n=T.o;(r=>{const a=r===t.he,i=n.i.disablePageInteraction?t.ye:a?t.Ce:t.ye;Qe(i,"keydown",s=>{if(s.key!=="Tab"||!(a?n.k&&!n.A:n.A))return;const l=Ic(),d=a?n.q:n.K;d.length!==0&&(s.shiftKey?l!==d[0]&&r.contains(l)||(Hi(s),nr(d[1])):l!==d[1]&&r.contains(l)||(Hi(s),nr(d[0])))},!0)})(e)},AI=["[href]",Pn,"input","details","[tabindex]"].map(e=>e+':not([tabindex="-1"])').join(","),gj=e=>{const{o:t,ne:n}=T,r=(a,i)=>{const s=If(a,AI);i[0]=s[0],i[1]=s[s.length-1]};e===1&&t.T&&r(n.he,t.q),e===2&&t.N&&r(n.we,t.K)},rr=(e,t,n)=>{const{de:r,le:a,ie:i,_e:s,ue:l,fe:d}=T.ce,c=T.re;if(t){const m={modalName:t};return e===c.fe?Yn(d)&&d(m):e===c._e?Yn(s)&&s(m):(m.modal=n,Yn(l)&&l(m)),hy(e,m)}const u={cookie:T.o.p};e===c.ie?Yn(i)&&i(ea(u)):e===c.le?Yn(a)&&a(ea(u)):(u.changedCategories=T.o.L,u.changedServices=T.o.ee,Yn(r)&&r(ea(u))),hy(e,ea(u))},ol=(e,t)=>{try{return e()}catch(n){return!t&&console.warn("CookieConsent:",n),!1}},Pg=e=>{const{Y:t,ee:n,O:r,X:a,oe:i,p:s,L:l}=T.o;for(const m of r){const p=n[m]||t[m]||[];for(const h of p){const b=a[m][h];if(!b)continue;const{onAccept:f,onReject:k}=b;!b.Se&&Ne(t[m],h)?(b.Se=!0,Yn(f)&&f()):b.Se&&!Ne(t[m],h)&&(b.Se=!1,Yn(k)&&k())}}if(!T.t.manageScriptTags)return;const d=i,c=e||s.categories||[],u=(m,p)=>{if(p>=m.length)return;const h=i[p];if(h.xe)return u(m,p+1);const b=h.Me,f=h.De,k=h.Te,w=Ne(c,f),v=!!k&&Ne(t[f],k);if(!k&&!h.ke&&w||!k&&h.ke&&!w&&Ne(l,f)||k&&!h.ke&&v||k&&h.ke&&!v&&Ne(n[f]||[],k)){h.xe=!0;const y=Gd(b,"type",!0);Rm(b,"type",!!y),Rm(b,zc);let x=Gd(b,"src",!0);x&&Rm(b,"src",!0);const A=re("script");A.textContent=b.innerHTML;for(const{nodeName:j}of b.attributes)ge(A,j,b[j]||Gd(b,j));y&&(A.type=y),x?A.src=x:x=b.src;const E=!!x&&(!y||["text/javascript","module"].includes(y));if(E&&(A.onload=A.onerror=()=>{u(m,++p)}),b.replaceWith(A),E)return}u(m,++p)};u(d,0)},Hd="bottom",Cg="left",hj="center",qf="right",Im="inline",fj="wide",vj="pm--",qm=["middle","top",Hd],vy=[Cg,hj,qf],EI={box:{Ee:[fj,Im],Ae:qm,Ne:vy,He:Hd,Ve:qf},cloud:{Ee:[Im],Ae:qm,Ne:vy,He:Hd,Ve:hj},bar:{Ee:[Im],Ae:qm.slice(1),Ne:[],He:Hd,Ve:""}},PI={box:{Ee:[],Ae:[],Ne:[],He:"",Ve:""},bar:{Ee:[fj],Ae:[],Ne:[Cg,qf],He:"",Ve:Cg}},bj=e=>{const t=T.o.i.guiOptions,n=t&&t.consentModal,r=t&&t.preferencesModal;e===0&&by(T.ne.he,EI,n,"cm--","box","cm"),e===1&&by(T.ne.we,PI,r,vj,"box","pm")},by=(e,t,n,r,a,i)=>{e.className=i;const s=n&&n.layout,l=n&&n.position,d=n&&n.flipButtons,c=!n||n.equalWeightButtons!==!1,u=s&&s.split(" ")||[],m=u[0],p=u[1],h=m in t?m:a,b=t[h],f=Ne(b.Ee,p)&&p,k=l&&l.split(" ")||[],w=k[0],v=r===vj?k[0]:k[1],y=Ne(b.Ae,w)?w:b.He,x=Ne(b.Ne,v)?v:b.Ve,A=j=>{j&&Le(e,r+j)};A(h),A(f),A(y),A(x),d&&A("flip");const E=i+"__btn--secondary";if(i==="cm"){const{Ie:j,Le:P}=T.ne;j&&(c?ma(j,E):Le(j,E)),P&&(c?ma(P,E):Le(P,E))}else{const{je:j}=T.ne;j&&(c?ma(j,E):Le(j,E))}},_s=(e,t)=>{const n=T.o,r=T.ne,{hide:a,hidePreferences:i,acceptCategory:s}=e,l=x=>{s(x),i(),a()},d=n.u&&n.u.preferencesModal;if(!d)return;const c=d.title,u=d.closeIconLabel,m=d.acceptAllBtn,p=d.acceptNecessaryBtn,h=d.savePreferencesBtn,b=d.sections||[],f=m||p||h;if(r.Fe)r.Pe=re(Te),Se(r.Pe,"body");else{r.Fe=re(Te),Le(r.Fe,"pm-wrapper");const x=re("div");Le(x,"pm-overlay"),ne(r.Fe,x),Qe(x,St,i),r.we=re(Te),Le(r.we,"pm"),ge(r.we,"role","dialog"),ge(r.we,Cn,!0),ge(r.we,"aria-modal",!0),ge(r.we,"aria-labelledby","pm__title"),Qe(r.ye,"keydown",A=>{A.keyCode===27&&i()},!0),r.Oe=re(Te),Se(r.Oe,"header"),r.Re=re("h2"),Se(r.Re,"title"),r.Re.id="pm__title",r.Be=re(Pn),Se(r.Be,"close-btn"),ge(r.Be,"aria-label",d.closeIconLabel||""),Qe(r.Be,St,i),r.$e=re("span"),r.$e.innerHTML=sl(),ne(r.Be,r.$e),r.Ge=re(Te),Se(r.Ge,"body"),r.Je=re(Te),Se(r.Je,"footer");var k=re(Te);Le(k,"btns");var w=re(Te),v=re(Te);Se(w,Ro),Se(v,Ro),ne(r.Je,w),ne(r.Je,v),ne(r.Oe,r.Re),ne(r.Oe,r.Be),r.ve=re(Te),ge(r.ve,"tabIndex",-1),ne(r.we,r.ve),ne(r.we,r.Oe),ne(r.we,r.Ge),f&&ne(r.we,r.Je),ne(r.Fe,r.we)}let y;c&&(r.Re.innerHTML=c,u&&ge(r.Be,"aria-label",u)),b.forEach((x,A)=>{const E=x.title,j=x.description,P=x.linkedCategory,S=P&&n.P[P],_=x.cookieTable,G=_&&_.body,B=_&&_.caption,Q=G&&G.length>0,N=!!S,ie=N&&n.X[P],Y=Eg(ie)&&Qa(ie)||[],te=N&&(!!j||!!Q||Qa(ie).length>0);var C=re(Te);if(Se(C,"section"),te||j){var z=re(Te);Se(z,"section-desc-wrapper")}let Z=Y.length;if(te&&Z>0){const V=re(Te);Se(V,"section-services");for(const q of Y){const $=ie[q],pe=$&&$.label||q,oe=re(Te),ke=re(Te),Ae=re(Te),He=re(Te);Se(oe,"service"),Se(He,"service-title"),Se(ke,"service-header"),Se(Ae,"service-icon");const Oe=yy(pe,q,S,!0,P);He.innerHTML=pe,ne(ke,Ae),ne(ke,He),ne(oe,ke),ne(oe,Oe),ne(V,oe)}ne(z,V)}if(E){var K=re(Te),X=re(N?Pn:Te);if(Se(K,"section-title-wrapper"),Se(X,"section-title"),X.innerHTML=E,ne(K,X),N){const V=re("span");V.innerHTML=sl(2,3.5),Se(V,"section-arrow"),ne(K,V),C.className+="--toggle";const q=yy(E,P,S);let $=d.serviceCounterLabel;if(Z>0&&fi($)){let pe=re("span");Se(pe,"badge"),Se(pe,"service-counter"),ge(pe,Cn,!0),ge(pe,"data-servicecounter",Z),$&&($=$.split("|"),$=$.length>1&&Z>1?$[1]:$[0],ge(pe,"data-counterlabel",$)),pe.innerHTML=Z+($?" "+$:""),ne(X,pe)}if(te){Se(C,"section--expandable");var he=P+"-desc";ge(X,"aria-expanded",!1),ge(X,"aria-controls",he)}ne(K,q)}else ge(X,"role","heading"),ge(X,"aria-level","3");ne(C,K)}if(j){var M=re("p");Se(M,"section-desc"),M.innerHTML=j,ne(z,M)}if(te&&(ge(z,Cn,"true"),z.id=he,((V,q,$)=>{Qe(X,St,()=>{q.classList.contains("is-expanded")?(ma(q,"is-expanded"),ge($,"aria-expanded","fal
509se"),ge(V,Cn,"true")):(Le(q,"is-expanded"),ge($,"aria-expanded","true"),ge(V,Cn,"false"))})})(z,C,X),Q)){const V=re("table"),q=re("thead"),$=re("tbody");if(B){const Oe=re("caption");Se(Oe,"table-caption"),Oe.innerHTML=B,V.appendChild(Oe)}Se(V,"section-table"),Se(q,"table-head"),Se($,"table-body");const pe=_.headers,oe=Qa(pe),ke=r.Ue.createDocumentFragment(),Ae=re("tr");for(const Oe of oe){const Dt=pe[Oe],at=re("th");at.id="cc__row-"+Dt+A,ge(at,"scope","col"),Se(at,"table-th"),at.innerHTML=Dt,ne(ke,at)}ne(Ae,ke),ne(q,Ae);const He=r.Ue.createDocumentFragment();for(const Oe of G){const Dt=re("tr");Se(Dt,"table-tr");for(const at of oe){const Fn=pe[at],Qs=Oe[at],Ye=re("td"),cr=re(Te);Se(Ye,"table-td"),ge(Ye,"data-column",Fn),ge(Ye,"headers","cc__row-"+Fn+A),cr.insertAdjacentHTML("beforeend",Qs),ne(Ye,cr),ne(Dt,Ye)}ne(He,Dt)}ne($,He),ne(V,q),ne(V,$),ne(z,V)}(te||j)&&ne(C,z);const U=r.Pe||r.Ge;N?(y||(y=re(Te),Se(y,"section-toggles")),y.appendChild(C)):y=null,ne(U,y||C)}),m&&(r.ze||(r.ze=re(Pn),Se(r.ze,"btn"),ge(r.ze,is,"all"),ne(w,r.ze),Qe(r.ze,St,()=>l("all"))),r.ze.innerHTML=m),p&&(r.je||(r.je=re(Pn),Se(r.je,"btn"),ge(r.je,is,"necessary"),ne(w,r.je),Qe(r.je,St,()=>l([]))),r.je.innerHTML=p),h&&(r.qe||(r.qe=re(Pn),Se(r.qe,"btn"),Se(r.qe,"btn--secondary"),ge(r.qe,is,"save"),ne(v,r.qe),Qe(r.qe,St,()=>l())),r.qe.innerHTML=h),r.Pe&&(r.we.replaceChild(r.Pe,r.Ge),r.Ge=r.Pe),bj(1),n.N||(n.N=!0,rr(T.re.ue,zf,r.we),t(e),ne(r.Ce,r.Fe),pj(r.we),setTimeout(()=>Le(r.Fe,"cc--anim"),100)),gj(2)};function yy(e,t,n,r,a){const i=T.o,s=T.ne,l=re("label"),d=re("input"),c=re("span"),u=re("span"),m=re("span"),p=re("span"),h=re("span");if(p.innerHTML=sl(1,3),h.innerHTML=sl(0,3),d.type="checkbox",Le(l,"section__toggle-wrapper"),Le(d,"section__toggle"),Le(p,"toggle__icon-on"),Le(h,"toggle__icon-off"),Le(c,"toggle__icon"),Le(u,"toggle__icon-circle"),Le(m,"toggle__label"),ge(c,Cn,"true"),r?(Le(l,"toggle-service"),ge(d,zc,a),s.se[a][t]=d):s.ae[t]=d,r?(b=>{Qe(d,"change",()=>{const f=s.se[b],k=s.ae[b];i.Z[b]=[];for(let w in f){const v=f[w];v.checked&&i.Z[b].push(v.value)}k.checked=i.Z[b].length>0})})(a):(b=>{Qe(d,St,()=>{const f=s.se[b],k=d.checked;i.Z[b]=[];for(let w in f)f[w].checked=k,k&&i.Z[b].push(w)})})(t),d.value=t,m.textContent=e.replace(/<.*>.*<\/.*>/gm,""),ne(u,h),ne(u,p),ne(c,u),i.D)(n.readOnly||n.enabled)&&(d.checked=!0);else if(r){const b=i.Y[a];d.checked=n.readOnly||Ne(b,t)}else Ne(i.R,t)&&(d.checked=!0);return n.readOnly&&(d.disabled=!0),ne(l,d),ne(l,c),ne(l,m),l}const Nm=()=>{const e=re("span");return T.ne.Ke||(T.ne.Ke=e),e},Nf=(e,t)=>{const n=T.o,r=T.ne,{hide:a,showPreferences:i,acceptCategory:s}=e,l=n.u&&n.u.consentModal;if(!l)return;const d=l.acceptAllBtn,c=l.acceptNecessaryBtn,u=l.showPreferencesBtn,m=l.closeIconLabel,p=l.footer,h=l.label,b=l.title,f=w=>{a(),s(w)};if(!r.Qe){r.Qe=re(Te),r.he=re(Te),r.We=re(Te),r.Xe=re(Te),r.Ye=re(Te),Le(r.Qe,"cm-wrapper"),Le(r.he,"cm"),Rt(r.We,"body"),Rt(r.Xe,"texts"),Rt(r.Ye,"btns"),ge(r.he,"role","dialog"),ge(r.he,"aria-modal","true"),ge(r.he,Cn,"false"),ge(r.he,"aria-describedby","cm__desc"),h?ge(r.he,"aria-label",h):b&&ge(r.he,"aria-labelledby","cm__title");const w="box",v=n.i.guiOptions,y=v&&v.consentModal,x=(y&&y.layout||w).split(" ")[0]===w;b&&m&&x&&(r.Le||(r.Le=re(Pn),r.Le.innerHTML=sl(),Rt(r.Le,"btn"),Rt(r.Le,"btn--close"),Qe(r.Le,St,()=>{f([])}),ne(r.We,r.Le)),ge(r.Le,"aria-label",m)),ne(r.We,r.Xe),(d||c||u)&&ne(r.We,r.Ye),r.be=re(Te),ge(r.be,"tabIndex",-1),ne(r.he,r.be),ne(r.he,r.We),ne(r.Qe,r.he)}b&&(r.Ze||(r.Ze=re("h2"),r.Ze.className=r.Ze.id="cm__title",ne(r.Xe,r.Ze)),r.Ze.innerHTML=b);let k=l.description;if(k&&(n.V&&(k=k.replace("{{revisionMessage}}",n.I?"":l.revisionMessage||"")),r.et||(r.et=re("p"),r.et.className=r.et.id="cm__desc",ne(r.Xe,r.et)),r.et.innerHTML=k),d&&(r.tt||(r.tt=re(Pn),ne(r.tt,Nm()),Rt(r.tt,"btn"),ge(r.tt,is,"all"),Qe(r.tt,St,()=>{f("all")})),r.tt.firstElementChild.innerHTML=d),c&&(r.Ie||(r.Ie=re(Pn),ne(r.Ie,Nm()),Rt(r.Ie,"btn"),ge(r.Ie,is,"necessary"),Qe(r.Ie,St,()=>{f([])})),r.Ie.firstElementChild.innerHTML=c),u&&(r.ot||(r.ot=re(Pn),ne(r.ot,Nm()),Rt(r.ot,"btn"),Rt(r.ot,"btn--secondary"),ge(r.ot,is,"show"),Qe(r.ot,"mouseenter",()=>{n.N||_s(e,t)}),Qe(r.ot,St,i)),r.ot.firstElementChild.innerHTML=u),r.nt||(r.nt=re(Te),Rt(r.nt,Ro),d&&ne(r.nt,r.tt),c&&ne(r.nt,r.Ie),(d||c)&&ne(r.We,r.nt),ne(r.Ye,r.nt)),r.ot&&!r.st&&(r.st=re(Te),r.Ie&&r.tt?(Rt(r.st,Ro),ne(r.st,r.ot),ne(r.Ye,r.st)):(ne(r.nt,r.ot),Rt(r.nt,Ro+"--uneven"))),p){if(!r.ct){let w=re(Te),v=re(Te);r.ct=re(Te),Rt(w,"footer"),Rt(v,"links"),Rt(r.ct,"link-group"),ne(v,r.ct),ne(w,v),ne(r.he,w)}r.ct.innerHTML=p}bj(0),n.T||(n.T=!0,rr(T.re.ue,Rf,r.he),t(e),ne(r.Ce,r.Qe),pj(r.he),setTimeout(()=>Le(r.Qe,"cc--anim"),100)),gj(1),cj(r.We,e,_s,t)},Lf=e=>{if(!fi(e))return null;if(e in T.o._)return e;let t=e.slice(0,2);return t in T.o._?t:null},Bf=()=>T.o.l||T.o.i.language.default,Mf=e=>{e&&(T.o.l=e)},yj=async e=>{const t=T.o;
vendor: 6,185 bytes, line 509
509let n=Lf(e)?e:Bf(),r=t._[n];if(fi(r)?r=await(async a=>{try{return await(await fetch(a)).json()}catch(i){return console.error(i),!1}})(r):Yn(r)&&(r=await r()),!r)throw`Could not load translation for the '${n}' language`;return t.u=r,Mf(n),!0},wj=()=>{let e=T.o.i.language.rtl,t=T.ne.Ce;e&&t&&(Nl(e)||(e=[e]),Ne(e,T.o.l)?Le(t,"cc--rtl"):ma(t,"cc--rtl"))},Xa=()=>{const e=T.ne;if(e.Ce)return;e.Ce=re(Te),e.Ce.id="cc-main",e.Ce.setAttribute("data-nosnippet",""),wj();let t=T.o.i.root;t&&fi(t)&&(t=document.querySelector(t)),(t||e.Ue.body).appendChild(e.Ce)},CI=e=>ol(()=>localStorage.removeItem(e)),wy=(e,t)=>{if(t instanceof RegExp)return e.filter(n=>t.test(n));{const n=oj(e,t);return n>-1?[e[n]]:[]}},SI=e=>{const{hostname:t,protocol:n}=location,{name:r,path:a,domain:i,sameSite:s,useLocalStorage:l,secure:d}=T.t.cookie,c=864e5*xI(),u=new Date;u.setTime(u.getTime()+c),T.o.p.expirationTime=u.getTime();const m=JSON.stringify(T.o.p);let p=r+"="+encodeURIComponent(m)+(c!==0?"; expires="+u.toUTCString():"")+"; Path="+a+"; SameSite="+s;Ne(t,".")&&(p+="; Domain="+i),d&&n==="https:"&&(p+="; Secure"),l?((h,b)=>{ol(()=>localStorage.setItem(h,b))})(r,m):document.cookie=p,T.o.p},Sg=(e,t,n)=>{if(e.length===0)return;const r=n||T.t.cookie.domain,a=t||T.t.cookie.path,i=r.slice(0,4)==="www.",s=i&&r.substring(4),l=(d,c)=>{c&&c.slice(0,1)!=="."&&(c="."+c),document.cookie=d+"=; path="+a+(c?"; domain="+c:"")+"; expires=Thu, 01 Jan 1970 00:00:01 GMT;"};for(const d of e)l(d,n),n||l(d,r),i&&l(d,s)},_I=e=>{const t=T.t.cookie.name,n=T.t.cookie.useLocalStorage;return((a,i)=>{let s;return s=ol(()=>JSON.parse(i?a:decodeURIComponent(a)),!0)||{},s})(n?(r=t,ol(()=>localStorage.getItem(r))||""):kj(t,!0),n);var r},kj=(e,t)=>{const n=document.cookie.match("(^|;)\\s*"+e+"\\s*=\\s*([^;]+)");return n?t?n.pop():e:""},xj=e=>{const t=document.cookie.split(/;\s*/),n=[];for(const r of t){let a=r.split("=")[0];e?ol(()=>{e.test(a)&&n.push(a)}):n.push(a)}return n},TI=(e,t=[])=>{((n,r)=>{const{O:a,R:i,B:s,N:l,Z:d,$:c,X:u}=T.o;let m=[];if(n){Nl(n)?m.push(...n):fi(n)&&(m=n==="all"?a:[n]);for(const p of a)d[p]=Ne(m,p)?Qa(u[p]):[]}else m=[...i,...c],l&&(m=(()=>{const p=T.ne.ae;if(!p)return[];let h=[];for(let b in p)p[b].checked&&h.push(b);return h})());m=m.filter(p=>!Ne(a,p)||!Ne(r,p)),m.push(...s),dj(m)})(e,t),(()=>{const n=T.o,{Z:r,B:a,Y:i,X:s,O:l}=n,d=l;n.te=ea(i);for(const c of d){const u=s[c],m=Qa(u),p=r[c]&&r[c].length>0,h=Ne(a,c);if(m.length!==0){if(i[c]=[],h)i[c].push(...m);else if(p){const b=r[c];i[c].push(...b)}else i[c]=n.Z[c];i[c]=lj(i[c])}}})(),(()=>{const n=T.o;n.L=T.t.mode===vo&&n.D?zm(n.$,n.R):zm(n.R,n.p.categories);let r=n.L.length>0,a=!1;for(const d of n.O)n.ee[d]=zm(n.Y[d],n.te[d]),n.ee[d].length>0&&(a=!0);const i=T.ne.ae;for(const d in i)i[d].checked=Ne(n.R,d);for(const d of n.O){const c=T.ne.se[d],u=n.Y[d];for(const m in c)c[m].checked=Ne(u,m)}n.C||(n.C=new Date),n.M||(n.M=("10000000-1000-4000-8000"+-1e11).replace(/[018]/g,d=>(d^crypto.getRandomValues(new Uint8Array(1))[0]&15>>d/4).toString(16))),n.p={categories:ea(n.R),revision:T.t.revision,data:n.h,consentTimestamp:n.C.toISOString(),consentId:n.M,services:ea(n.Y),languageCode:T.o.l},n.S&&(n.p.lastConsentTimestamp=n.S.toISOString());let s=!1;const l=r||a;(n.D||l)&&(n.D&&(n.D=!1,s=!0),n.S=n.S?new Date:n.C,n.p.lastConsentTimestamp=n.S.toISOString(),SI(),T.t.autoClearCookies&&(s||l)&&(d=>{const c=T.o,u=xj(),m=(p=>{const h=T.o;return(p?h.O:h.L).filter(b=>{const f=h.P[b];return!!f&&!f.readOnly&&!!f.autoClear})})(d);for(const p in c.ee)for(const h of c.ee[p]){const b=c.X[p][h].cookies;if(!Ne(c.Y[p],h)&&b)for(const f of b){const k=wy(u,f.name);Sg(k,f.path,f.domain)}}for(const p of m){const h=c.P[p].autoClear,b=h&&h.cookies||[],f=Ne(c.L,p),k=!Ne(c.R,p),w=f&&k;if(d?k:w){h.reloadPage&&w&&(c.j=!0);for(const v of b){const y=wy(u,v.name);Sg(y,v.path,v.domain)}}}})(s),Pg()),s&&(rr(T.re.ie),rr(T.re.le),T.t.mode===aj)||(l&&rr(T.re.de),n.j&&(n.j=!1,location.reload()))})()},jj=e=>{const t=T.o.D?[]:T.o.R;return Ne(t,e)},DI=(e,t)=>{const n=T.o.D?[]:T.o.Y[t]||[];return Ne(n,e)},RI=(e,t,n)=>{let r=[];const a=i=>{if(fi(i)){let s=kj(i);s!==""&&r.push(s)}else r.push(...xj(i))};if(Nl(e))for(let i of e)a(i);else a(e);Sg(r,t,n)},Aj=e=>{const{ne:t,o:n}=T;if(!n.k){if(!n.T){if(!e)return;Nf(ll,Xa)}n.k=!0,n.J=Ic(),n.v&&mj(!0),uj(t.he,1),Le(t.ye,ij),ge(t.he,Cn,"false"),setTimeout(()=>{nr(T.ne.be)},100),rr(T.re.fe,Rf)}},zI=()=>{const{ne:e,o:t,re:n}=T;t.k&&(t.k=!1,t.v&&mj(),nr(e.Ke,!0),ma(e.ye,ij),ge(e.he,Cn,"true"),nr(t.J),t.J=null,rr(n._e,Rf))},Ej=()=>{const e=T.o;e.A||(e.N||_s(ll,Xa),e.A=!0,e.k?e.U=Ic():e.J=Ic(),uj(T.ne.we,2),Le(T.ne.ye,sj),ge(T.ne.we,Cn,"false"),setTimeout(()=>{nr(T.ne.ve)},100),rr(T.re.fe,zf))},II=()=>{const e=T.o;e.A&&(e.A=!1,(()=>{const t=Pj(),n=T.o.P,r=T.ne.ae,a=T.ne.se,i=s=>Ne(T.o.$,s);for(const s in r){const l=!!n[s].readOnly;r[s].checked=l||(t?jj(s):i(s));for(const d in a[s])a[s][d].checked=l||(t?DI(d,s):i(s))}})(),nr(T.ne.$e,!0),ma(T.ne.ye,sj),ge(T.ne.we,Cn,"true"),e.k?(nr(e.U),e.U=null):(nr(e.J),e.J=null),rr(T.re._e,zf))};var ll={show:Aj,hide:zI,showPreferences:Ej,hidePreferences:II,acceptCategory:TI};const qI=async(e,t)=>{if(!Lf(e))return!1;const n=T.o;return!(e===Bf()&&t!==!0||!await yj(e)||(Mf(e),n.T&&Nf(ll,Xa),n.N&&_s(ll,Xa),wj(),0))},Pj=()=>!T.o.D,NI=async e=>{const{o:t,t:n,re:r}=T,a=window;if(!a._ccRun){if(a._ccRun=!0,(l=>{const{ne:d,t:c,o:u}=T,m=c,p=u,{cookie:h}=m,b=T.ce,f=l.cookie,k=l.categories,w=Qa(k)||[],v=navigator,y=document;d.Ue=y,d.ye=y.documentElement,h.domain=location.hostname,p.i=l,p.P=k,p.O=w,p._=l.language.translations,p.v=!!l.disablePageInteraction,b.ie=l.onFirstConsent,b.le=l.onConsent,b.de=l.onChange,b._e=l.onModalHide,b.fe=l.onModalShow,b.ue=l.onModalReady;const{mode:x,autoShow:A,lazyHtmlGeneration:E,autoClearCookies:j,revision:P,manageScriptTags:S,hideFromBots:_}=l;x===vo&&(m.mode=x),typeof j=="boolean"&&(m.autoClearCookies=j),typeof S=="boolean"&&(m.manageScriptTags=S),typeof P=="number"&&P>=0&&(m.revision=P,p.V=!0),typeof A=="boolean"&&(m.autoShow=A),typeof E=="boolean"&&(m.lazyHtmlGeneration=E),_===!1&&(m.hideFromBots=!1),m.hideFromBots===!0&&v&&(p.G=v.userAgent&&/bot|crawl|spider|slurp|teoma/i.test(v.userAgent)||v.webdriver),Eg(f)&&(m.co
509okie={...h,...f}),m.autoClearCookies,p.V,m.manageScriptTags,(G=>{const{P:B,X:Q,Y:N,Z:ie,B:Y}=T.o;for(let te of G){const C=B[te],z=C.services||{},Z=Eg(z)&&Qa(z)||[];Q[te]={},N[te]=[],ie[te]=[],C.readOnly&&(Y.push(te),N[te]=Z),T.ne.se[te]={};for(let K of Z){const X=z[K];X.Se=!1,Q[te][K]=X}}})(w),(()=>{if(!T.t.manageScriptTags)return;const G=T.o,B=If(document,"script["+zc+"]");for(const Q of B){let N=Gd(Q,zc),ie=Q.dataset.service||"",Y=!1;if(N&&N.charAt(0)==="!"&&(N=N.slice(1),Y=!0),ie.charAt(0)==="!"&&(ie=ie.slice(1),Y=!0),Ne(G.O,N)&&(G.oe.push({Me:Q,xe:!1,ke:Y,De:N,Te:ie}),ie)){const te=G.X[N];te[ie]||(te[ie]={Se:!1})}}})(),Mf((()=>{const G=T.o.i.language.autoDetect;if(G){const B={browser:navigator.language,document:document.documentElement.lang},Q=Lf(B[G]);if(Q)return Q}return Bf()})())})(e),t.G)return;(()=>{const l=T.o,d=T.t,c=_I(),{categories:u,services:m,consentId:p,consentTimestamp:h,lastConsentTimestamp:b,data:f,revision:k}=c,w=Nl(u);l.p=c,l.M=p;const v=!!p&&fi(p);l.C=h,l.C&&(l.C=new Date(h)),l.S=b,l.S&&(l.S=new Date(b)),l.h=f!==void 0?f:null,l.V&&v&&k!==d.revision&&(l.I=!1),l.D=!(v&&l.I&&l.C&&l.S&&w),d.cookie.useLocalStorage&&!l.D&&(l.D=new Date().getTime()>(c.expirationTime||0),l.D&&CI(d.cookie.name)),l.D,(()=>{const y=T.o;for(const x of y.O){const A=y.P[x];if(A.readOnly||A.enabled){y.$.push(x);const E=y.X[x]||{};for(let j in E)y.Z[x].push(j),y.i.mode===vo&&y.Y[x].push(j)}}})(),l.D?d.mode===vo&&(l.R=[...l.$]):(l.Y={...l.Y,...m},l.Z={...l.Y},dj([...l.B,...u]))})();const s=Pj();if(!await yj())return!1;if(cj(null,i=ll,_s,Xa),T.o.D&&Nf(i,Xa),T.t.lazyHtmlGeneration||_s(i,Xa),n.autoShow&&!s&&Aj(!0),s)return Pg(),rr(r.le);n.mode===vo&&Pg(t.$)}var i},_g="G-ML4TQF0FH6",ky="GTM-KDP56S4W",hd="/privacy",LI=["/d/","/e/"];function Ff(){return typeof window<"u"&&LI.some(e=>window.location.pathname.startsWith(e))}const BI=2500;function fd(){if(Ff()||document.querySelector('script[src*="googletagmanager.com/gtag"]'))return;const e=document.createElement("script");e.src=`https://www.googletagmanager.com/gtag/js?id=${_g}`,e.async=!0,document.head.appendChild(e),window.dataLayer=window.dataLayer||[];function t(...n){window.dataLayer.push(n)}t("js",new Date),t("consent","update",{analytics_storage:"granted"}),t("config",_g,{anonymize_ip:!0})}function xy(){window[`ga-disable-${_g}`]=!0,window.dataLayer=window.dataLayer||[];function e(...t){window.dataLayer.push(t)}e("consent","update",{analytics_storage:"denied"}),RI(/^(_ga|_gid|__utm)/)}function vd(){if(Ff()||document.getElementById("gtm-script"))return;const e=document.createElement("script");e.id="gtm-script",e.innerHTML=`(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 510new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 511j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
512'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 513})(window,document,'script','dataLayer','${ky}');`,document.head.appendChild(e);const t=document.createElement("noscript");t.id="gtm-noscript",t.innerHTML=`<iframe src="https://www.googletagmanager.com/ns.html?id=${ky}" height="0" width="0" style="display:none;visibility:hidden"></iframe>`,document.body.insertBefore(t,document.body.firstChild)}function jy(){var e,t;(e=document.getElementById("gtm-script"))==null||e.remove(),(t=document.getElementById("gtm-noscript"))==null||t.remove()}function MI(){const{language:e}=Ge(),t=g.useRef(!1);return g.useEffect(()=>{window.dataLayer=window.dataLayer||[];function n(...a){window.dataLayer.push(a)}if(n("consent","default",{ad_storage:"denied",ad_user_data:"denied",ad_personalization:"denied",analytics_storage:"denied",functionality_storage:"denied",personalization_storage:"denied"}),Ff())return;const r=setTimeout(()=>{NI({mode:"opt-in",cookie:{name:"arcanes_cc",expiresAfterDays:182},guiOptions:{consentModal:{layout:"box inline",position:"bottom left",equalWeightButtons:!0,flipButtons:!1},preferencesModal:{layout:"box",equalWeightButtons:!0,flipButtons:!1}},categories:{necessary:{enabled:!0,readOnly:!0},analytics:{enabled:!1,readOnly:!1,autoClear:{cookies:[{name:/^(_ga)/},{name:"_gid"},{name:/^(__utm)/}]},services:{ga4:{label:"Google Analytics 4",onAccept:()=>{fd(),vd()},onReject:()=>{xy(),jy()},cookies:[{name:/^(_ga)/},{name:"_gid"}]}}}},onFirstConsent:({cookie:a})=>{a.categories.includes("analytics")&&(fd(),vd())},onConsent:({cookie:a})=>{a.categories.includes("analytics")&&(fd(),vd())},onChange:({changedCategories:a})=>{a.includes("analytics")&&(jj("analytics")?(fd(),vd()):(xy(),jy()))},language:{default:e,autoDetect:"document",translations:{fr:{consentModal:{title:"Un cookie, un seul.",description:`On utilise Google Analytics pour savoir quelles pages vous consultez. C'est tout. Pas de pub, pas de revente. <a href="`+hd+'" class="cc-link">En savoir plus</a>',acceptAllBtn:"OK pour moi",acceptNecessaryBtn:"Non merci",showPreferencesBtn:"Détails"},preferencesModal:{title:"Vos cookies en détail",acceptAllBtn:"Tout accepter",acceptNecessaryBtn:"Le minimum",savePreferencesBtn:"Enregistrer",closeIconLabel:"Fermer",sections:[{title:"Ce qu'on utilise",description:"Deux types de cookies. Le premier fait tourner le site. Le second nous dit combien de personnes l'utilisent. Point."},{title:"Fonctionnement du site",description:"Login et sécurité. Toujours actifs, non désactivables.",linkedCategory:"necessary"},{title:"Analyse d'audience",description:"Google Analytics, IP anonymisée. On voit quelles pages marchent et lesquelles non. Aucune donnée personnelle n'est exploitée.",linkedCategory:"analytics",cookieTable:{headers:{name:"Cookie",domain:"Domaine",expiration:"Durée",description:"Rôle"},body:[{name:"_ga",domain:"arcanes.be",expiration:"2 ans",description:"Identifiant anonyme"},{name:"_ga_ML4TQF0FH6",domain:"arcanes.be",expiration:"2 ans",description:"Ãtat de session"},{name:"_gid",domain:"arcanes.be",expiration:"24h",description:"Visiteur unique (24h)"}]}},{title:"Une question ?",description:'<a href="'+hd+'" class="cc-link">Politique de confidentialité</a>'}]}},nl:{consentModal:{title:"Eén cookie, meer niet.",description:`We gebruiken Google Analytics om te zien welke pagina's u bekijkt. Dat is alles. Geen reclame, geen doorverkoop. <a href="`+hd+'" class="cc-link">Meer weten</a>',acceptAllBtn:"Prima",acceptNecessaryBtn:"Nee bedankt",showPreferencesBtn:"Details"},preferencesModal:{title:"Uw cookies in detail",acceptAllBtn:"Alles accepteren",acceptNecessaryBtn:"Alleen noodzakelijke",savePreferencesBtn:"Opslaan",closeIconLabel:"Sluiten",sections:[{title:"Wat we gebruiken",description:"Twee soorten cookies. De eerste laat de site werken. De tweede vertelt ons hoeveel mensen hem gebruiken. Klaar."},{title:"Werking van de site",description:"Login en beveiliging. Altijd actief, niet uitschakelbaar.",linkedCategory:"necessary"},{title:"Bezoekersanalyse",description:"Google Analytics, IP geanonimiseerd. We zien welke pagina's werken en welke niet. Geen persoonlijke gegevens worden gebruikt.",linkedCategory:"analytics",cookieTable:{headers:{name:"Cookie",domain:"Domein",expiration:"Duur",description:"Rol"},body:[{name:"_ga",domain:"arcanes.be",expiration:"2 jaar",description:"Anonieme identificatie"},{name:"_ga_ML4TQF0FH6",domain:"arcanes.be",expiration:"2 jaar",description:"Sessiestatus"},{name:"_gid",domain:"arcanes.be",expiration:"24u",description:"Unieke bezoeker (24u)"}]}},{title:"Een vraag?",description:'<a href="'+hd+'" class="cc-link">Privacybeleid</a>'}]}}}}}),t.current=!0},BI);return()=>clearTimeout(r)},[]),g.useEffect(()=>{t.current&&qI(e)},[e]),null}const FI=e=>{let t;return e?t=e:typeof fetch>"u"?t=(...n)=>F(async()=>{const{default:r}=await Promise.resolve().then(()=>Ys);return{default:r}},void 0).then(({default:r})=>r(...n)):t=fetch,(...n)=>t(...n)};
513class Of extends Error{constructor(t,n="FunctionsError",r){super(t),this.name=n,this.context=r}}class OI extends Of{constructor(t){super("Failed to send a request to the Edge Function","FunctionsFetchError",t)}}class Ay extends Of{constructor(t){super("Relay Error invoking the Edge Function","FunctionsRelayError",t)}}class Ey extends Of{constructor(t){super("Edge Function returned a non-2xx status code","FunctionsHttpError",t)}}var Tg;(function(e){e.Any="any",e.ApNortheast1="ap-northeast-1",e.ApNortheast2="ap-northeast-2",e.ApSouth1="ap-south-1",e.ApSoutheast1="ap-southeast-1",e.ApSoutheast2="ap-southeast-2",e.CaCentral1="ca-central-1",e.EuCentral1="eu-central-1",e.EuWest1="eu-west-1",e.EuWest2="eu-west-2",e.EuWest3="eu-west-3",e.SaEast1="sa-east-1",e.UsEast1="us-east-1",e.UsWest1="us-west-1",e.UsWest2="us-west-2"})(Tg||(Tg={}));var VI=function(e,t,n,r){function a(i){return i instanceof n?i:new n(function(s){s(i)})}return new(n||(n=Promise))(function(i,s){function l(u){try{c(r.next(u))}catch(m){s(m)}}function d(u){try{c(r.throw(u))}catch(m){s(m)}}function c(u){u.done?i(u.value):a(u.value).then(l,d)}c((r=r.apply(e,t||[])).next())})};class WI{constructor(t,{headers:n={},customFetch:r,region:a=Tg.Any}={}){this.url=t,this.headers=n,this.region=a,this.fetch=FI(r)}setAuth(t){this.headers.Authorization=`Bearer ${t}`}invoke(t,n={}){var r;return VI(this,void 0,void 0,function*(){try{const{headers:a,method:i,body:s}=n;let l={},{region:d}=n;d||(d=this.region);const c=new URL(`${this.url}/${t}`);d&&d!=="any"&&(l["x-region"]=d,c.searchParams.set("forceFunctionRegion",d));let u;s&&(a&&!Object.prototype.hasOwnProperty.call(a,"Content-Type")||!a)&&(typeof Blob<"u"&&s instanceof Blob||s instanceof ArrayBuffer?(l["Content-Type"]="application/octet-stream",u=s):typeof s=="string"?(l["Content-Type"]="text/plain",u=s):typeof FormData<"u"&&s instanceof FormData?u=s:(l["Content-Type"]="application/json",u=JSON.stringify(s)));const m=yield this.fetch(c.toString(),{method:i||"POST",headers:Object.assign(Object.assign(Object.assign({},l),this.headers),a),body:u}).catch(f=>{throw new OI(f)}),p=m.headers.get("x-relay-error");if(p&&p==="true")throw new Ay(m);if(!m.ok)throw new Ey(m);let h=((r=m.headers.get("Content-Type"))!==null&&r!==void 0?r:"text/plain").split(";")[0].trim(),b;return h==="application/json"?b=yield m.json():h==="application/octet-stream"?b=yield m.blob():h==="text/event-stream"?b=m:h==="multipart/form-data"?b=yield m.formData():b=yield m.text(),{data:b,error:null,response:m}}catch(a){return{data:null,error:a,response:a instanceof Ey||a instanceof Ay?a.context:void 0}}})}}var Vt={},Vf={},Tu={},Ll={},Du={},Ru={},UI=function(){if(typeof self<"u")return self;if(typeof window<"u")return window;if(typeof global<"u")return global;throw new Error("unable to locate global object")},Ts=UI();const $I=Ts.fetch,Cj=Ts.fetch.bind(Ts),Sj=Ts.Headers,GI=Ts.Request,HI=Ts.Response,Ys=Object.freeze(Object.defineProperty({__proto__:null,Headers:Sj,Request:GI,Response:HI,default:Cj,fetch:$I},Symbol.toStringTag,{value:"Module"})),KI=vE(Ys);var zu={};Object.defineProperty(zu,"__esModule",{value:!0});let YI=class extends Error{constructor(t){super(t.message),this.name="PostgrestError",this.details=t.details,this.hint=t.hint,this.co
513de=t.code}};zu.default=YI;var _j=un&&un.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Ru,"__esModule",{value:!0});const ZI=_j(KI),JI=_j(zu);let QI=class{constructor(t){var n,r;this.shouldThrowOnError=!1,this.method=t.method,this.url=t.url,this.headers=new Headers(t.headers),this.schema=t.schema,this.body=t.body,this.shouldThrowOnError=(n=t.shouldThrowOnError)!==null&&n!==void 0?n:!1,this.signal=t.signal,this.isMaybeSingle=(r=t.isMaybeSingle)!==null&&r!==void 0?r:!1,t.fetch?this.fetch=t.fetch:typeof fetch>"u"?this.fetch=ZI.default:this.fetch=fetch}throwOnError(){return this.shouldThrowOnError=!0,this}setHeader(t,n){return this.headers=new Headers(this.headers),this.headers.set(t,n),this}then(t,n){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");const r=this.fetch;let a=r(this.url.toString(),{method:this.method,headers:this.headers,body:JSON.stringify(this.body),signal:this.signal}).then(async i=>{var s,l,d,c;let u=null,m=null,p=null,h=i.status,b=i.statusText;if(i.ok){if(this.method!=="HEAD"){const v=await i.text();v===""||(this.headers.get("Accept")==="text/csv"||this.headers.get("Accept")&&(!((s=this.headers.get("Accept"))===null||s===void 0)&&s.includes("application/vnd.pgrst.plan+text"))?m=v:m=JSON.parse(v))}const k=(l=this.headers.get("Prefer"))===null||l===void 0?void 0:l.match(/count=(exact|planned|estimated)/),w=(d=i.headers.get("content-range"))===null||d===void 0?void 0:d.split("/");k&&w&&w.length>1&&(p=parseInt(w[1])),this.isMaybeSingle&&this.method==="GET"&&Array.isArray(m)&&(m.length>1?(u={code:"PGRST116",details:`Results contain ${m.length} rows, application/vnd.pgrst.object+json requires 1 row`,hint:null,message:"JSON object requested, multiple (or no) rows returned"},m=null,p=null,h=406,b="Not Acceptable"):m.length===1?m=m[0]:m=null)}else{const k=await i.text();try{u=JSON.parse(k),Array.isArray(u)&&i.status===404&&(m=[],u=null,h=200,b="OK")}catch{i.status===404&&k===""?(h=204,b="No Content"):u={message:k}}if(u&&this.isMaybeSingle&&(!((c=u==null?void 0:u.details)===null||c===void 0)&&c.includes("0 rows"))&&(u=null,h=200,b="OK"),u&&this.shouldThrowOnError)throw new JI.default(u)}return{error:u,data:m,count:p,status:h,statusText:b}});return this.shouldThrowOnError||(a=a.catch(i=>{var s,l,d;return{error:{message:`${(s=i==null?void 0:i.name)!==null&&s!==void 0?s:"FetchError"}: ${i==null?void 0:i.message}`,details:`${(l=i==null?void 0:i.stack)!==null&&l!==void 0?l:""}`,hint:"",code:`${(d=i==null?void 0:i.code)!==null&&d!==void 0?d:""}`},data:null,count:null,status:0,statusText:""}})),a.then(t,n)}returns(){return this}overrideTypes(){return this}};Ru.default=QI;var XI=un&&un.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Du,"__esModule",{value:!0});const eq=XI(Ru);let tq=class extends eq.default{select(t){let n=!1;const r=(t??"*").split("").map(a=>/\s/.test(a)&&!n?"":(a==='"'&&(n=!n),a)).join("");return this.url.searchParams.set("select",r),this.headers.append("Prefer","return=representation"),this}order(t,{ascending:n=!0,nullsFirst:r,foreignTable:a,referencedTable:i=a}={}){const s=i?`${i}.order`:"order",l=this.url.searchParams.get(s);return this.url.searchParams.set(s,`${l?`${l},`:""}${t}.${n?"asc":"desc"}${r===void 0?"":r?".nullsfirst":".nullslast"}`),this}limit(t,{foreignTable:n,referencedTable:r=n}={}){const a=typeof r>"u"?"limit":`${r}.limit`;return this.url.searchParams.set(a,`${t}`),this}range(t,n,{foreignTable:r,referencedTable:a=r}={}){const i=typeof a>"u"?"offset":`${a}.offset`,s=typeof a>"u"?"limit":`${a}.limit`;return this.url.searchParams.set(i,`${t}`),this.url.searchParams.set(s,`${n-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.method==="GET"?this.headers.set("Accept","application/json"):this.headers.set("Accept","application/vnd.pgrst.object+json"),this.isMaybeSingle=!0,this}csv(){return this.headers.set("Accept","text/csv"),this}geojson(){return this.headers.set("Accept","application/geo+json"),this}
513explain({analyze:t=!1,verbose:n=!1,settings:r=!1,buffers:a=!1,wal:i=!1,format:s="text"}={}){var l;const d=[t?"analyze":null,n?"verbose":null,r?"settings":null,a?"buffers":null,i?"wal":null].filter(Boolean).join("|"),c=(l=this.headers.get("Accept"))!==null&&l!==void 0?l:"application/json";return this.headers.set("Accept",`application/vnd.pgrst.plan+${s}; for="${c}"; options=${d};`),s==="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}};Du.default=tq;var nq=un&&un.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Ll,"__esModule",{value:!0});const rq=nq(Du);let aq=class extends rq.default{eq(t,n){return this.url.searchParams.append(t,`eq.${n}`),this}neq(t,n){return this.url.searchParams.append(t,`neq.${n}`),this}gt(t,n){return this.url.searchParams.append(t,`gt.${n}`),this}gte(t,n){return this.url.searchParams.append(t,`gte.${n}`),this}lt(t,n){return this.url.searchParams.append(t,`lt.${n}`),this}lte(t,n){return this.url.searchParams.append(t,`lte.${n}`),this}like(t,n){return this.url.searchParams.append(t,`like.${n}`),this}likeAllOf(t,n){return this.url.searchParams.append(t,`like(all).{${n.join(",")}}`),this}likeAnyOf(t,n){return this.url.searchParams.append(t,`like(any).{${n.join(",")}}`),this}ilike(t,n){return this.url.searchParams.append(t,`ilike.${n}`),this}ilikeAllOf(t,n){return this.url.searchParams.append(t,`ilike(all).{${n.join(",")}}`),this}ilikeAnyOf(t,n){return this.url.searchParams.append(t,`ilike(any).{${n.join(",")}}`),this}is(t,n){return this.url.searchParams.append(t,`is.${n}`),this}in(t,n){const r=Array.from(new Set(n)).map(a=>typeof a=="string"&&new RegExp("[,()]").test(a)?`"${a}"`:`${a}`).join(",");return this.url.searchParams.append(t,`in.(${r})`),this}contains(t,n){return typeof n=="string"?this.url.searchParams.append(t,`cs.${n}`):Array.isArray(n)?this.url.searchParams.append(t,`cs.{${n.join(",")}}`):this.url.searchParams.append(t,`cs.${JSON.stringify(n)}`),this}containedBy(t,n){return typeof n=="string"?this.url.searchParams.append(t,`cd.${n}`):Array.isArray(n)?this.url.searchParams.append(t,`cd.{${n.join(",")}}`):this.url.searchParams.append(t,`cd.${JSON.stringify(n)}`),this}rangeGt(t,n){return this.url.searchParams.append(t,`sr.${n}`),this}rangeGte(t,n){return this.url.searchParams.append(t,`nxl.${n}`),this}rangeLt(t,n){return this.url.searchParams.append(t,`sl.${n}`),this}rangeLte(t,n){return this.url.searchParams.append(t,`nxr.${n}`),this}rangeAdjacent(t,n){return this.url.searchParams.append(t,`adj.${n}`),this}overlaps(t,n){return typeof n=="string"?this.url.searchParams.append(t,`ov.${n}`):this.url.searchParams.append(t,`ov.{${n.join(",")}}`),this}textSearch(t,n,{config:r,type:a}={}){let i="";a==="plain"?i="pl":a==="phrase"?i="ph":a==="websearch"&&(i="w");const s=r===void 0?"":`(${r})`;return this.url.searchParams.append(t,`${i}fts${s}.${n}`),this}match(t){return Object.entries(t).forEach(([n,r])=>{this.url.searchParams.append(n,`eq.${r}`)}),this}not(t,n,r){return this.url.searchParams.append(t,`not.${n}.${r}`),this}or(t,{foreignTable:n,referencedTable:r=n}={}){const a=r?`${r}.or`:"or";return this.url.searchParams.append(a,`(${t})`),this}filter(t,n,r){return this.url.searchParams.append(t,`${n}.${r}`),this}};Ll.default=aq;var iq=un&&un.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Tu,"__esModule",{value:!0});const mo=iq(Ll);let sq=class{constructor(t,{headers:n={},schema:r,fetch:a}){this.url=t,this.headers=new Headers(n),this.schema=r,this.fetch=a}select(t,{head:n=!1,count:r}={}){const a=n?"HEAD":"GET";let i=!1;const s=(t??"*").split("").map(l=>/\s/.test(l)&&!i?"":(l==='"'&&(i=!i),l)).join("");return this.url.searchParams.set("select",s),r&&this.headers.append("Prefer",`count=${r}`),new mo.default({method:a,url:this.url,headers:this.headers,schema:this.schema,fetch:this.fetch})}insert(t,{count:n,defaultToNull:r=!0}={}){var a;const i="POST";if(n&&this.headers.append("Prefer",`count=${n}`),r||this.headers.append("Prefer","missing=default"),Array.isArray(t)){const s=t.reduce((l,d)=>l.concat(Object.keys(d)),[]);if(s.length>0){const l=[...new Set(s)].map(d=>`"${d}"`);this.url.searchParams.set("columns",l.join(","))}}return new mo.default({method:i,url:this.url,headers:this.headers,schema:this.schema,body:t,fetch:(a=this.fetch)!==null&&a!==void 0?a:fetch})}upsert(t,{onConflict:n,ignoreDuplicates:r=!1,count:a,defaultToNull:i=!0}={}){var s;const l="POST";if(this.headers.append("Prefer",`resolution=${r?"ignore":"merge"}-duplicates`),n!==void 0&&this.url.searchParams.set("on_conflict",n),a&&this.headers.append("Prefer",`count=${a}`),i||this.headers.append("Prefer","missing=default"),Array.isArray(t)){const d=t.reduce((c,u)=>c.concat(Object.keys(u)),[]);if(d.length>0){const c=[...new Set(d)].map(u=>`"${u}"`);this.url.searchParams.set("columns",c.join(","))}}return new mo.default({method:l,url:this.url,headers:this.headers,schema:this.schema,body:t,fetch:(s=this.fetch)!==null&&s!==void 0?s:fetch})}update(t,{count:n}={}){var r;const a="PATCH";return n&&this.headers.append("Prefer",`count=${n}`),new mo.default({method:a,url:this.url,headers:this.headers,schema:this.schema,body:t,fetch:(r=this.fetch)!==null&&r!==void 0?r:fetch})}delete({count:t}={}){var n;const r="DELETE";return t&&this.headers.append("Prefer",`count=${t}`),new mo.default({method:r,url:this.url,headers:this.headers,schema:this.schema,fetch:(n=this.fetch)!==null&&n!==void 0?n:fetch})}};Tu.default=sq;
513var Tj=un&&un.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Vf,"__esModule",{value:!0});const oq=Tj(Tu),lq=Tj(Ll);let dq=class Dj{constructor(t,{headers:n={},schema:r,fetch:a}={}){this.url=t,this.headers=new Headers(n),this.schemaName=r,this.fetch=a}from(t){const n=new URL(`${this.url}/${t}`);return new oq.default(n,{headers:new Headers(this.headers),schema:this.schemaName,fetch:this.fetch})}schema(t){return new Dj(this.url,{headers:this.headers,schema:t,fetch:this.fetch})}rpc(t,n={},{head:r=!1,get:a=!1,count:i}={}){var s;let l;const d=new URL(`${this.url}/rpc/${t}`);let c;r||a?(l=r?"HEAD":"GET",Object.entries(n).filter(([m,p])=>p!==void 0).map(([m,p])=>[m,Array.isArray(p)?`{${p.join(",")}}`:`${p}`]).forEach(([m,p])=>{d.searchParams.append(m,p)})):(l="POST",c=n);const u=new Headers(this.headers);return i&&u.set("Prefer",`count=${i}`),new lq.default({method:l,url:d,headers:u,schema:this.schemaName,body:c,fetch:(s=this.fetch)!==null&&s!==void 0?s:fetch})}};Vf.default=dq;var Zs=un&&un.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Vt,"__esModule",{value:!0});Vt.PostgrestError=Vt.PostgrestBuilder=Vt.PostgrestTransformBuilder=Vt.PostgrestFilterBuilder=Vt.PostgrestQueryBuilder=Vt.PostgrestClient=void 0;const Rj=Zs(Vf);Vt.PostgrestClient=Rj.default;const zj=Zs(Tu);Vt.PostgrestQueryBuilder=zj.default;const Ij=Zs(Ll);Vt.PostgrestFilterBuilder=Ij.default;const qj=Zs(Du);Vt.PostgrestTransformBuilder=qj.default;const Nj=Zs(Ru);Vt.PostgrestBuilder=Nj.default;const Lj=Zs(zu);Vt.PostgrestError=Lj.default;var cq=Vt.default={PostgrestClient:Rj.default,PostgrestQueryBuilder:zj.default,PostgrestFilterBuilder:Ij.default,PostgrestTransformBuilder:qj.default,PostgrestBuilder:Nj.default,PostgrestError:Lj.default};const{PostgrestClient:uq,PostgrestQueryBuilder:mU,PostgrestFilterBuilder:pU,PostgrestTransformBuilder:gU,PostgrestBuilder:hU,PostgrestError:fU}=cq;class mq{static detectEnvironment(){var t;if(typeof WebSocket<"u")return{type:"native",constructor:WebSocket};if(typeof globalThis<"u"&&typeof globalThis.WebSocket<"u")return{type:"native",constructor:globalThis.WebSocket};if(typeof global<"u"&&typeof global.WebSocket<"u")return{type:"native",constructor:global.WebSocket};if(typeof globalThis<"u"&&typeof globalThis.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"&&globalThis.EdgeRuntime||typeof navigator<"u"&&(!((t=navigator.userAgent)===null||t===void 0)&&t.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."};if(typeof process<"u"){const n=process.versions;if(n&&n.node){const r=n.node,a=parseInt(r.replace(/^v/,"").split(".")[0]);return a>=22?typeof globalThis.WebSocket<"u"?{type:"native",constructor:globalThis.WebSocket}:{type:"unsupported",error:`Node.js ${a} detected but native WebSocket not found.`,workaround:"Provide a WebSocket implementation via the transport option."}:{type:"unsupported",error:`Node.js ${a} detected without native WebSocket support.`,workaround:`For Node.js < 22, install "ws" package and provide it via the transport option: 514import ws from "ws" 515new 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 t=this.detectEnvironment();if(t.constructor)return t.constructor;let n=t.error||"WebSocket not supported in this environment.";throw t.workaround&&(n+=` 516 517Suggested solution: ${t.workaround}`),new Error(n)}static createWebSocket(t,n){const r=this.getWebSocketConstructor();return new r(t,n)}static isWebSocketSupported(){try{const t=this.detectEnvironment();return t.type==="native"||t.type==="ws"}catch{return!1}}}const pq="2.15.5",gq=`realtime-js/${pq}`,hq="1.0.0",Dg=1e4,fq=1e3,vq=100;var zo;(function(e){e[e.connecting=0]="connecting",e[e.open=1]="open",e[e.closing=2]="closing",e[e.closed=3]="closed"})(zo||(zo={}));var ut;(function(e){e.closed="closed",e.errored="errored",e.joined="joined",e.joining="joining",e.leaving="leaving"})(ut||(ut={}));var An;(function(e){e.close="phx_close",e.error="phx_error",e.join="phx_join",e.reply="phx_reply",e.leave="phx_leave",e.access_token="access_token"})(An||(An={}));var Rg;(function(e){e.websocket="websocket"})(Rg||(Rg={}));var Oa;(function(e){e.Connecting="connecting",e.Open="open",e.Closing="closing",e.Closed="closed"})(Oa||(Oa={}));class bq{constructor(){this.HEADER_LENGTH=1}decode(t,n){return t.constructor===ArrayBuffer?n(this._binaryDecode(t)):n(typeof t=="string"?JSON.parse(t):{})}_binaryDecode(t){const n=new DataView(t),r=new TextDecoder;return this._decodeBroadcast(t,n,r)}_decodeBroadcast(t,n,r){const a=n.getUint8(1),i=n.getUint8(2);let s=this.HEADER_LENGTH+2;const l=r.decode(t.slice(s,s+a));s=s+a;const d=r.decode(t.slice(s,s+i));s=s+i;const c=JSON.parse(r.decode(t.slice(s,t.byteLength)));return{ref:null,topic:l,event:d,payload:c}}}class Bj{constructor(t,n){this.callback=t,this.timerCalc=n,this.timer=void 0,this.tries=0,this.callback=t,this.timerCalc=n}reset(){this.tries=0,clearTimeout(this.timer),this.timer=void 0}scheduleTimeout(){clearTimeout(this.timer),this.timer=setTimeout(()=>{this.tries=this.tries+1,this.callback()},this.timerCalc(this.tries+1))}}var Me;(function(e){e.abstime="abstime",e.bool="bool",e.date="date",e.daterange="daterange",e.float4="float4",e.float8="float8",e.int2="int2",e.int4="int4",e.int4range="int4range",e.int8="int8",e.int8range="int8range",e.json="json",e.jsonb="jsonb",e.money="money",e.numeric="numeric",e.oid="oid",e.reltime="reltime",e.text="text",e.time="time",e.timestamp="timestamp",e.timestamptz="timestamptz",e.timetz="timetz",e.tsrange="tsrange",e.tstzrange="tstzrange"})(Me||(Me={}));const Py=(e,t,n={})=>{var r;const a=(r=n.skipTypes)!==null&&r!==void 0?r:[];return Object.keys(t).reduce((i,s)=>(i[s]=yq(s,e,t,a),i),{})},yq=(e,t,n,r)=>{const a=t.find(l=>
517l.name===e),i=a==null?void 0:a.type,s=n[e];return i&&!r.includes(i)?Mj(i,s):zg(s)},Mj=(e,t)=>{if(e.charAt(0)==="_"){const n=e.slice(1,e.length);return jq(t,n)}switch(e){case Me.bool:return wq(t);case Me.float4:case Me.float8:case Me.int2:case Me.int4:case Me.int8:case Me.numeric:case Me.oid:return kq(t);case Me.json:case Me.jsonb:return xq(t);case Me.timestamp:return Aq(t);case Me.abstime:case Me.date:case Me.daterange:case Me.int4range:case Me.int8range:case Me.money:case Me.reltime:case Me.text:case Me.time:case Me.timestamptz:case Me.timetz:case Me.tsrange:case Me.tstzrange:return zg(t);default:return zg(t)}},zg=e=>e,wq=e=>{switch(e){case"t":return!0;case"f":return!1;default:return e}},kq=e=>{if(typeof e=="string"){const t=parseFloat(e);if(!Number.isNaN(t))return t}return e},xq=e=>{if(typeof e=="string")try{return JSON.parse(e)}catch(t){return console.log(`JSON parse error: ${t}`),e}return e},jq=(e,t)=>{if(typeof e!="string")return e;const n=e.length-1,r=e[n];if(e[0]==="{"&&r==="}"){let i;const s=e.slice(1,n);try{i=JSON.parse("["+s+"]")}catch{i=s?s.split(","):[]}return i.map(l=>Mj(t,l))}return e},Aq=e=>typeof e=="string"?e.replace(" ","T"):e,Fj=e=>{let t=e;return t=t.replace(/^ws/i,"http"),t=t.replace(/(\/socket\/websocket|\/socket|\/websocket)\/?$/i,""),t.replace(/\/+$/,"")+"/api/broadcast"};class Lm{constructor(t,n,r={},a=Dg){this.channel=t,this.event=n,this.payload=r,this.timeout=a,this.sent=!1,this.timeoutTimer=void 0,this.ref="",this.receivedResp=null,this.recHooks=[],this.refEvent=null}resend(t){this.timeout=t,this._cancelRefEvent(),this.ref="",this.refEvent=null,this.receivedResp=null,this.sent=!1,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()}))}updatePayload(t){this.payload=Object.assign(Object.assign({},this.payload),t)}receive(t,n){var r;return this._hasReceived(t)&&n((r=this.receivedResp)===null||r===void 0?void 0:r.response),this.recHooks.push({status:t,callback:n}),this}startTimeout(){if(this.timeoutTimer)return;this.ref=this.channel.socket._makeRef(),this.refEvent=this.channel._replyEventName(this.ref);const t=n=>{this._cancelRefEvent(),this._cancelTimeout(),this.receivedResp=n,this._matchReceive(n)};this.channel._on(this.refEvent,{},t),this.timeoutTimer=setTimeout(()=>{this.trigger("timeout",{})},this.timeout)}trigger(t,n){this.refEvent&&this.channel._trigger(this.refEvent,{status:t,response:n})}destroy(){this._cancelRefEvent(),this._cancelTimeout()}_cancelRefEvent(){this.refEvent&&this.channel._off(this.refEvent,{})}_cancelTimeout(){clearTimeout(this.timeoutTimer),this.timeoutTimer=void 0}_matchReceive({status:t,response:n}){this.recHooks.filter(r=>r.status===t).forEach(r=>r.callback(n))}_hasReceived(t){return this.receivedResp&&this.receivedResp.status===t}}var Cy;(function(e){e.SYNC="sync",e.JOIN="join",e.LEAVE="leave"})(Cy||(Cy={}));class Io{constructor(t,n){this.channel=t,this.state={},this.pendingDiffs=[],this.joinRef=null,this.enabled=!1,this.caller={onJoin:()=>{},onLeave:()=>{},onSync:()=>{}};const r=(n==null?void 0:n.events)||{state:"presence_state",diff:"presence_diff"};this.channel._on(r.state,{},a=>{const{onJoin:i,onLeave:s,onSync:l}=this.caller;this.joinRef=this.channel._joinRef(),this.state=Io.syncState(this.state,a,i,s),this.pendingDiffs.forEach(d=>{this.state=Io.syncDiff(this.state,d,i,s)}),this.pendingDiffs=[],l()}),this.channel._on(r.diff,{},a=>{const{onJoin:i,onLeave:s,onSync:l}=this.caller;this.inPendingSyncState()?this.pendingDiffs.push(a):(this.state=Io.syncDiff(this.state,a,i,s),l())}),this.onJoin((a,i,s)=>{this.channel._trigger("presence",{event:"join",key:a,currentPresences:i,newPresences:s})}),this.onLeave((a,i,s)=>{this.channel._trigger("presence",{event:"leave",key:a,currentPresences:i,leftPresences:s})}),this.onSync(()=>{this.channel._trigger("presence",{event:"sync"})})}static syncState(t,n,r,a){const i=this.cloneDeep(t),s=this.transformState(n),l={},d={};return this.map(i,(c,u)=>{s[c]||(d[c]=u)}),this.map(s,(c,u)=>{const m=i[c];if(m){const p=u.map(k=>k.presence_ref),h=m.map(k=>k.presence_ref),b=u.filter(k=>h.indexOf(k.presence_ref)<0),f=m.filter(k=>p.indexOf(k.presence_ref)<0);b.length>0&&(l[c]=b),f.length>0&&(d[c]=f)}else l[c]=u}),this.syncDiff(i,{joins:l,leaves:d},r,a)}static syncDiff(t,n,r,a){const{joins:i,leaves:s}={joins:this.transformState(n.joins),leaves:this.transformState(n.leaves)};return r||(r=()=>{}),a||(a=()=>{}),this.map(i,(l,d)=>{var c;const u=(c=t[l])!==null&&c!==void 0?c:[];if(t[l]=this.cloneDeep(d),u.length>0){const m=t[l].map(h=>h.presence_ref),p=u.filter(h=>m.indexOf(h.presence_ref)<0);t[l].unshift(...p)}r(l,u,d)}),this.map(s,(l,d)=>{let c=t[l];if(!c)return;const u=d.map(m=>m.presence_ref);c=c.filter(m=>u.indexOf(m.presence_ref)<0),t[l]=c,a(l,c,d),c.length===0&&delete t[l]}),t}static map(t,n){return Object.getOwnPropertyNames(t).map(r=>n(r,t[r]))}static transformState(t){return t=this.cloneDeep(t),Object.getOwnPropertyNames(t).reduce((n,r)=>{const a=t[r];return"metas"in a?n[r]=a.metas.map(i=>(i.presence_ref=i.phx_ref,delete i.phx_ref,delete i.phx_ref_prev,i)):n[r]=a,n},{})}static cloneDeep(t){return JSON.parse(JSON.stringify(t))}onJoin(t){this.caller.onJoin=t}onLeave(t){this.caller.onLeave=t}onSync(t){this.caller.onSync=t}inPendingSyncState(){return!this.joinRef||this.joinRef!==this.channel._joinRef()}}var Sy;(function(e){e.ALL="*",e.INSERT="INSERT",e.UPDATE="UPDATE",e.DELETE="DELETE"})(Sy||(Sy={}));var qo;(function(e){e.BROADCAST="broadcast",e.PRESENCE="presence",e.POSTGRES_CHANGES="postgres_changes",e.SYSTEM="system"})(qo||(qo={}));var fr;(function(e){e.SUBSCRIBED="SUBSCRIBED",e.TIMED_OUT="TIMED_OUT",e.CLOSED="CLOSED",e.CHANNEL_ERROR="CHANNEL_ERROR"})(fr||(fr={}));class Wf{constructor(t,n={config:{}},r){this.topic=t,this.params=n,this.socket=r,this.bindings={},this.state=ut.closed,this.joinedOnce=!1,this.pushBuffer=[],this.subTopic=t.replace(/^realtime:/i,""),this.params.config=Object.assign({broadcast:{ack:!1,self:!1},presence:{key:"",enabled:!1},private:!1},n.config),this.timeout=this.socket.timeout,this.joinPush=new Lm(this,An.join,this.params,this.timeout),this.rejoinTimer=new Bj(()=>this._rejoinUntilConnected(),this.socket.reconnectAfterMs),this.joinPush.receive("ok",()=>{this.state=ut.joined,this.rejoinTimer.reset(),this.pushBuffer.forEach(a=>a.send()),this.pushBuffer=[]}),this._onClose(()=>{this.rejoinTimer.reset(),this.socket.log("channel",`close ${this.topic} ${this._joinRef()}`),this.state=ut.closed,this.socket._remove(this)}),this._onError(a=>{this._isLeaving()||this._isClosed()||(this.socket.log("channel",`error ${this.topic}`,a),this.state=ut.errored,this.rejoinTimer.scheduleTimeout())}),this.joinPush.receive("timeout",()=>{this._isJoining()&&(this.socket.log("channel",`timeout ${this.topic}`,this.joinPush.timeout),this.state=ut.errored,this.rejoinTimer.scheduleTimeout())}),this.joinPush.receive("error",a=>{this._isLeaving()||this._isClosed()||(this.socket.log("channel",`error ${this.topic}`,a),this.state=ut.errored,this.rejoinTimer.scheduleTimeout())}),this._on(An.reply,{},(a,i)=>{this._trigger(this._replyEventName(i),a)}),this.presence=new Io(this),this.broadcastEndpointURL=Fj(this.socket.endPoint),this.private=this.params.config.private||!1}subscribe(t,n=this.timeout){var r,a,i;if(this.socket.isConnected()||this.socket.connect(),this.state==ut.closed){const{config:{broadcast:s,presence:l,private:d}}=this.params,c=(a=(r=this.bindings.postgres_changes)===null||r===void 0?void 0:r.map(h=>h.filter))!==null&&a!==void 0?a:[],u=!!this.bindings[qo.PRESENCE]&&this.bindings[qo.PRESENCE].length>0||((i=this.params.config.presence)===null||i===void 0?void 0:i.enabled)===!0,m={},p={broadcast:s,presence:Object.assign(Object.assign({},l),{enabled:u}),postgres_changes:c,private:d};this.socket.accessTokenValue&&(m.access_token=this.socket.accessTokenValue),this._onError(h=>t==null?void 0:t(fr.CHANNEL_ERROR,h)),this._onClose(()=>t==null?void 0:t(fr.CLOSED)),this.updateJoinPayload(Object.assign({config:p},m)),this.joinedOnce=!0,this._rejoin(n),this.joinPush.receive("ok",async({postgres_changes:h})=>{var b;if(this.socket.setAuth(),h===void 0){t==null||t(fr.SUBSCRIBED);return}else{const f=this.bindings.postgres_changes,k=(b=f==null?void 0:f.length)!==null&&b!==void 0?b:0,w=[];for(let v=0;v<k;v++){const y=f[v],{filter:{event:x,schema:A,table:E,filter:j}}=y,P=h&&h[v];if(P&&P.event===x&&P.schema===A&&P.table===E&&P.filter===j)w.push(Object.assign(Object.assign({},y),{id:P.id}));else{this.unsubscribe(),this.state=ut.errored,t==null||t(fr.CHANNEL_ERROR,new Error("mismatch between server and client bindings for postgres changes"));return}}this.bindings.postgres_changes=w,t&&t(fr.SUBSCRIBED);return}}).receive("error",h=>{this.state=ut.errored,t==null||t(fr.CHANNEL_ERROR,new Error(JSON.stringify(Object.values(h).join(", ")||"error")))}).receive("timeout",()=>{t==null||t(fr.TIMED_OUT)})}return this}presenceState(){return this.presence.state}async track(t,n={}){return await this.send({type:"presence",event:"track",payload:t},n.timeout||this.timeout)}async untrack(t={}){return await this.send({type:"presence",event:"untrack"},t)}on(t,n,r){return this.state===ut.joined&&t===qo.PRESENCE&&(this.socket.log("channel",`resubscribe to ${this.topic} due to change in presence callbacks on joined channel`),this.unsubscribe().then(()=>this.subscribe())),this._on(t,n,r)}async send(t,n={}){var r,a;if(!this._canPush()&&t.type==="broadcast"){const{event:i,payload:s}=t,d={method:"POST",headers:{Authorization:this.socket.accessTokenValue?`Bearer ${this.socket.accessTokenValue}`:"",apikey:this.socket.apiKey?this.socket.apiKey:"","Content-Type":"application/json"},body:JSON.stringify({messages:[{topic:this.subTopic,event:i,payload:s,private:this.private}]})};try{const c=await this._fetchWithTimeout(this.broadcastEndpointURL,d,(r=n.timeout)!==null&&r!==void 0?r:this.timeout);return await((a=c.body)===null||a===void 0?void 0:a.cancel()),c.ok?"ok":"error"}catch(c){return c.name==="AbortError"?"timed out":"error"}}else return new Promise(i=>{var s,l,d;const c=this._push(t.type,t,n.timeout||this.timeout);t.type==="broadcast"&&!(!((d=(l=(s=this.params)===null||s===void 0?void 0:s.config)===null||l===void 0?void 0:l.broadcast)===null||d===void 0)&&d.ack)&&i("ok"),c.receive("ok",()=>i("ok")),c.receive("error",()=>i("error")),c.receive("timeout",()=>i("timed out"))})}updateJoinPayload(t){this.joinPush.updatePayload(t)}unsubscribe(t=this.timeout){this.state=ut.leaving;const n=()=>{this.socket.log("channel",`leave ${this.topic}`),this._trigger(An.close,"leave",this._joinRef())};this.joinPush.destroy();let r=null;return new Promise(a=>{r=new Lm(this,An.leave,{},t),r.receive("ok",()=>{n(),a("ok")}).receive("timeout",()=>{n(),a("timed out")}).receive("error",()=>{a("error")}),r.send(),this._canPush()||r.trigger("ok",{})}).finally(()=>{r==null||r.destroy()})}teardown(){this.pushBuffer.forEach(t=>t.destroy()),this.pushBuffer=[],this.rejoinTimer.reset(),this.joinPush.destroy(),this.state=ut.closed,this.bindings={}}async _fetchWithTimeout(t,n,r){const a=new AbortController,i=setTimeout(()=>a.abort(),r),s=await this.socket.fetch(t,Object.assign(Object.assign({},n),{signal:a.signal}));return clearTimeout(i),s}_push(t,n,r=this.timeout){if(!this.joinedOnce)throw`tried to push '${t}' to '${this.topic}' before joining. Use channel.subscribe() before pushing events`;let a=new Lm(this,t,n,r);return this._canPush()?a.send():this._addToPushBuffer(a),a}_addToPushBuffer(t){if(t.startTimeout(),this.pushBuffer.push(t),this.pushBuffer.length>vq){const n=this.pushBuffer.shift();n&&(n.destroy(),this.socket.log("channel",`discarded push due to buffer overflow: ${n.event}`,n.payload))}}_onMessage(t,n,r){return n}_isMember(t){return this.topic===t}_joinRef(){return this.joinPush.ref}_trigger(t,n,r){var a,i;const s=t.toLocaleLowerCase(),{close:l,error:d,leave:c,join:u}=An;if(r&&[l,d,c,u].indexOf(s)>=0&&r!==this._joinRef())return;let p=this._onMessage(s,n,r);if(n&&!p)throw"channel onMessage callbacks must return the payload, modified or unmodified";["insert","update","delete"].includes(s)?(a=this.bindings.postgres_changes)===null||a===void 0||a.filter(h=>{var b,f,k;return((b=h.filter)===null||b===void 0?void 0:b.event)==="*"||((k=(f=h.filter)===null||f===void 0?void 0:f.event)===null||k===void 0?void 0:k.toLocaleLowerCase())===s}).map(h=>h.callback(p,r)):(i=this.bindings[s])===null||i===void 0||i.filter(h=>{var b,f,k,w,v,y;if(["broadcast","presence","postgres_changes"].includes(s))if("id"in h){const x=h.id,A=(b=h.filter)===null||b===void 0?void 0:b.event;return x&&((f=n.ids)===null||f===void 0?void 0:f.includes(x))&&(A==="*"||(A==null?void 0:A.toLocaleLowerCase())===((k=n.data)===null||k===void 0?void 0:k.type.toLocaleLowerCase()))}else{const x=(v=(w=h==null?void 0:h.filter)===null||w===void 0?void 0:w.event)===null||v===void 0?void 0:v.toLocaleLowerCase();return x==="*"||x===((y=n==null?void 0:n.event)===null||y===void 0?void 0:y.toLocaleLowerCase())}else return h.type.toLocaleLowerCase()===s}).map(h=>{if(typeof p=="object"&&"ids"in p){const b=p.data,{schema:f,table:k,commit_timestamp:w,type:v,errors:y}=b;p=Object.assign(Object.assign({},{schema:f,table:k,commit_timestamp:w,eventType:v,new:{},old:{},errors:y}),this._getPayloadRecords(b))}h.callback(p,r)})}_isClosed(){return this.state===ut.closed}_isJoined(){return this.state===ut.joined}_isJoining(){return this.state===ut.joining}_isLeaving(){return this.state===ut.leaving}_replyEventName(t){return`chan_reply_${t}`}_on(t,n,r){const a=t.toLocaleLowerCase(),i={type:a,filter:n,callback:r};return this.bindings[a]?this.bindings[a].push(i):this.bindings[a]=[i],this}_off(t,n){const r=t.toLocaleLowerCase();return this.bindings[r]&&(this.bindings[r]=this.bindings[r].filter(a=>{var i;return!(((i=a.type)===null||i===void 0?void 0:i.toLocaleLowerCase())===r&&Wf.isEqual(a.filter,n))})),this}static isEqual(t,n){if(Object.keys(t).length!==Object.keys(n).length)return!1;for(const r in t)if(t[r]!==n[r])return!1;return!0}_rejoinUntilConnected(){this.rejoinTimer.scheduleTimeout(),this.socket.isConnected()&&this._rejoin()}_onClose(t){this._on(An.close,{},t)}_onError(t){this._on(An.error,{},n=>t(n))}_canPush(){return this.socket.isConnected()&&this._isJoined()}_rejoin(t=this.timeout){this._isLeaving()||(this.socket._leaveOpenTopic(this.topic),this.state=ut.joining,this.joinPush.resend(t))}_getPayloadRecords(t){const n={new:{},old:{}};return(t.type==="INSERT"||t.type==="UPDATE")&&(n.new=Py(t.columns,t.record)),(t.type==="UPDATE"||t.type==="DELETE")&&(n.old=Py(t.columns,t.old_record)),n}}const Bm=()=>{},bd={HEARTBEAT_INTERVAL:25e3,RECONNECT_DELAY:10,HEARTBEAT_TIMEOUT_FALLBACK:100},Eq=[1e3,2e3,5e3,1e4],Pq=1e4,Cq=` 518 addEventListener("message", (e) => { 519 if (e.data.event === "start") { 520 setInterval(() => postMessage({ event: "keepAlive" }), e.data.interval); 521 } 522 });`;class Sq{constructor(t,n){var r;if(this.accessTokenValue=null,this.apiKey=null,this.channels=new Array,this.endPoint="",this.httpEndpoint="",this.headers={},this.params={},this.timeout=Dg,this.transport=null,this.heartbeatIntervalMs=bd.HEARTBEAT_INTERVAL,this.heartbeatTimer=void 0,this.pendingHeartbeatRef=null,this.heartbeatCallback=Bm,this.ref=0,this.reconnectTimer=null,this.logger=Bm,this.conn=null,this.sendBuffer=[],this.serializer
522=new bq,this.stateChangeCallbacks={open:[],close:[],error:[],message:[]},this.accessToken=null,this._connectionState="disconnected",this._wasManualDisconnect=!1,this._authPromise=null,this._resolveFetch=a=>{let i;return a?i=a:typeof fetch>"u"?i=(...s)=>F(async()=>{const{default:l}=await Promise.resolve().then(()=>Ys);return{default:l}},void 0).then(({default:l})=>l(...s)).catch(l=>{throw new Error(`Failed to load @supabase/node-fetch: ${l.message}. This is required for HTTP requests in Node.js environments without native fetch.`)}):i=fetch,(...s)=>i(...s)},!(!((r=n==null?void 0:n.params)===null||r===void 0)&&r.apikey))throw new Error("API key is required to connect to Realtime");this.apiKey=n.params.apikey,this.endPoint=`${t}/${Rg.websocket}`,this.httpEndpoint=Fj(t),this._initializeOptions(n),this._setupReconnectionTimer(),this.fetch=this._resolveFetch(n==null?void 0:n.fetch)}connect(){if(!(this.isConnecting()||this.isDisconnecting()||this.conn!==null&&this.isConnected())){if(this._setConnectionState("connecting"),this._setAuthSafely("connect"),this.transport)this.conn=new this.transport(this.endpointURL());else try{this.conn=mq.createWebSocket(this.endpointURL())}catch(t){this._setConnectionState("disconnected");const n=t.message;throw n.includes("Node.js")?new Error(`${n} 523 524To use Realtime in Node.js, you need to provide a WebSocket implementation: 525 526Option 1: Use Node.js 22+ which has native WebSocket support 527Option 2: Install and provide the "ws" package: 528 529 npm install ws 530 531 import ws from "ws" 532 const client = new RealtimeClient(url, { 533 ...options, 534 transport: ws 535 })`):new Error(`WebSocket not available: ${n}`)}this._setupConnectionHandlers()}}endpointURL(){return this._appendParams(this.endPoint,Object.assign({},this.params,{vsn:hq}))}disconnect(t,n){if(!this.isDisconnecting())if(this._setConnectionState("disconnecting",!0),this.conn){const r=setTimeout(()=>{this._setConnectionState("disconnected")},100);this.conn.onclose=()=>{clearTimeout(r),this._setConnectionState("disconnected")},t?this.conn.close(t,n??""):this.conn.close(),this._teardownConnection()}else this._setConnectionState("disconnected")}getChannels(){return this.channels}async removeChannel(t){const n=await t.unsubscribe();return this.channels.length===0&&this.disconnect(),n}async removeAllChannels(){const t=await Promise.all(this.channels.map(n=>n.unsubscribe()));return this.channels=[],this.disconnect(),t}log(t,n,r){this.logger(t,n,r)}connectionState(){switch(this.conn&&this.conn.readyState){case zo.connecting:return Oa.Connecting;case zo.open:return Oa.Open;case zo.closing:return Oa.Closing;default:return Oa.Closed}}isConnected(){return this.connectionState()===Oa.Open}isConnecting(){return this._connectionState==="connecting"}isDisconnecting(){return this._connectionState==="disconnecting"}channel(t,n={config:{}}){const r=`realtime:${t}`,a=this.getChannels().find(i=>i.topic===r);if(a)return a;{const i=new Wf(`realtime:${t}`,n,this);return this.channels.push(i),i}}push(t){const{topic:n,event:r,payload:a,ref:i}=t,s=()=>{this.encode(t,l=>{var d;(d=this.conn)===null||d===void 0||d.send(l)})};this.log("push",`${n} ${r} (${i})`,a),this.isConnected()?s():this.sendBuffer.push(s)}async setAuth(t=null){this._authPromise=this._performAuth(t);try{await this._authPromise}finally{this._authPromise=null}}async sendHeartbeat(){var t;if(!this.isConnected()){try{this.heartbeatCallback("disconnected")}catch(n){this.log("error","error in heartbeat callback",n)}return}if(this.pendingHeartbeatRef){this.pendingHeartbeatRef=null,this.log("transport","heartbeat timeout. Attempting to re-establish connection");try{this.heartbeatCallback("timeout")}catch(n){this.log("error","error in heartbeat callback",n)}this._wasManualDisconnect=!1,(t=this.conn)===null||t===void 0||t.close(fq,"heartbeat timeout"),setTimeout(()=>{var n;this.isConnected()||(n=this.reconnectTimer)===null||n===void 0||n.scheduleTimeout()},bd.HEARTBEAT_TIMEOUT_FALLBACK);return}this.pendingHeartbeatRef=this._makeRef(),this.push({topic:"phoenix",event:"heartbeat",payload:{},ref:this.pendingHeartbeatRef});try{this.heartbeatCallback("sent")}catch(n){this.log("error","error in heartbeat callback",n)}this._setAuthSafely("heartbeat")}onHeartbeat(t){this.heartbeatCallback=t}flushSendBuffer(){this.isConnected()&&this.sendBuffer.length>0&&(this.sendBuffer.forEach(t=>t()),this.sendBuffer=[])}_makeRef(){let t=this.ref+1;return t===this.ref?this.ref=0:this.ref=t,this.ref.toString()}_leaveOpenTopic(t){let n=this.channels.find(r=>r.topic===t&&(r._isJoined()||r._isJoining()));n&&(this.log("transport",`leaving duplicate topic "${t}"`),n.unsubscribe())}_remove(t){this.channels=this.channels.filter(n=>n.topic!==t.topic)}_onConnMessage(t){this.decode(t.data,n=>
535{if(n.topic==="phoenix"&&n.event==="phx_reply")try{this.heartbeatCallback(n.payload.status==="ok"?"ok":"error")}catch(c){this.log("error","error in heartbeat callback",c)}n.ref&&n.ref===this.pendingHeartbeatRef&&(this.pendingHeartbeatRef=null);const{topic:r,event:a,payload:i,ref:s}=n,l=s?`(${s})`:"",d=i.status||"";this.log("receive",`${d} ${r} ${a} ${l}`.trim(),i),this.channels.filter(c=>c._isMember(r)).forEach(c=>c._trigger(a,i,s)),this._triggerStateCallbacks("message",n)})}_clearTimer(t){var n;t==="heartbeat"&&this.heartbeatTimer?(clearInterval(this.heartbeatTimer),this.heartbeatTimer=void 0):t==="reconnect"&&((n=this.reconnectTimer)===null||n===void 0||n.reset())}_clearAllTimers(){this._clearTimer("heartbeat"),this._clearTimer("reconnect")}_setupConnectionHandlers(){this.conn&&("binaryType"in this.conn&&(this.conn.binaryType="arraybuffer"),this.conn.onopen=()=>this._onConnOpen(),this.conn.onerror=t=>this._onConnError(t),this.conn.onmessage=t=>this._onConnMessage(t),this.conn.onclose=t=>this._onConnClose(t))}_teardownConnection(){this.conn&&(this.conn.onopen=null,this.conn.onerror=null,this.conn.onmessage=null,this.conn.onclose=null,this.conn=null),this._clearAllTimers(),this.channels.forEach(t=>t.teardown())}_onConnOpen(){this._setConnectionState("connected"),this.log("transport",`connected to ${this.endpointURL()}`),this.flushSendBuffer(),this._clearTimer("reconnect"),this.worker?this.workerRef||this._startWorkerHeartbeat():this._startHeartbeat(),this._triggerStateCallbacks("open")}_startHeartbeat(){this.heartbeatTimer&&clearInterval(this.heartbeatTimer),this.heartbeatTimer=setInterval(()=>this.sendHeartbeat(),this.heartbeatIntervalMs)}_startWorkerHeartbeat(){this.workerUrl?this.log("worker",`starting worker for from ${this.workerUrl}`):this.log("worker","starting default worker");const t=this._workerObjectUrl(this.workerUrl);this.workerRef=new Worker(t),this.workerRef.onerror=n=>{this.log("worker","worker error",n.message),this.workerRef.terminate()},this.workerRef.onmessage=n=>{n.data.event==="keepAlive"&&this.sendHeartbeat()},this.workerRef.postMessage({event:"start",interval:this.heartbeatIntervalMs})}_onConnClose(t){var n;this._setConnectionState("disconnected"),this.log("transport","close",t),this._triggerChanError(),this._clearTimer("heartbeat"),this._wasManualDisconnect||(n=this.reconnectTimer)===null||n===void 0||n.scheduleTimeout(),this._triggerStateCallbacks("close",t)}_onConnError(t){this._setConnectionState("disconnected"),this.log("transport",`${t}`),this._triggerChanError(),this._triggerStateCallbacks("error",t)}_triggerChanError(){this.channels.forEach(t=>t._trigger(An.error))}_appendParams(t,n){if(Object.keys(n).length===0)return t;const r=t.match(/\?/)?"&":"?",a=new URLSearchParams(n);return`${t}${r}${a}`}_workerObjectUrl(t){let n;if(t)n=t;else{const r=new Blob([Cq],{type:"application/javascript"});n=URL.createObjectURL(r)}return n}_setConnectionState(t,n=!1){this._connectionState=t,t==="connecting"?this._wasManualDisconnect=!1:t==="disconnecting"&&(this._wasManualDisconnect=n)}async _performAuth(t=null){let n;t?n=t:this.accessToken?n=await this.accessToken():n=this.accessTokenValue,this.accessTokenValue!=n&&(this.accessTokenValue=n,this.channels.forEach(r=>{const a={access_token:n,version:gq};n&&r.updateJoinPayload(a),r.joinedOnce&&r._isJoined()&&r._push(An.access_token,{access_token:n})}))}async _waitForAuthIfNeeded(){this._authPromise&&await this._authPromise}_setAuthSafely(t="general"){this.setAuth().catch(n=>{this.log("error",`error setting auth in ${t}`,n)})}_triggerStateCallbacks(t,n){try{this.stateChangeCallbacks[t].forEach(r=>{try{r(n)}catch(a){this.log("error",`error in ${t} callback`,a)}})}catch(r){this.log("error",`error triggering ${t} callbacks`,r)}}_setupReconnectionTimer(){this.reconnectTimer=new Bj(async()=>{setTimeout(async()=>{await this._waitForAuthIfNeeded(),this.isConnected()||this.connect()},bd.RECONNECT_DELAY)},this.reconnectAfterMs)}_initializeOptions(t){var n,r,a,i,s,l,d,c,u;if(this.transport=(n=t==null?void 0:t.transport)!==null&&n!==void 0?n:null,this.timeout=(r=t==null?void 0:t.t
535imeout)!==null&&r!==void 0?r:Dg,this.heartbeatIntervalMs=(a=t==null?void 0:t.heartbeatIntervalMs)!==null&&a!==void 0?a:bd.HEARTBEAT_INTERVAL,this.worker=(i=t==null?void 0:t.worker)!==null&&i!==void 0?i:!1,this.accessToken=(s=t==null?void 0:t.accessToken)!==null&&s!==void 0?s:null,this.heartbeatCallback=(l=t==null?void 0:t.heartbeatCallback)!==null&&l!==void 0?l:Bm,t!=null&&t.params&&(this.params=t.params),t!=null&&t.logger&&(this.logger=t.logger),(t!=null&&t.logLevel||t!=null&&t.log_level)&&(this.logLevel=t.logLevel||t.log_level,this.params=Object.assign(Object.assign({},this.params),{log_level:this.logLevel})),this.reconnectAfterMs=(d=t==null?void 0:t.reconnectAfterMs)!==null&&d!==void 0?d:m=>Eq[m-1]||Pq,this.encode=(c=t==null?void 0:t.encode)!==null&&c!==void 0?c:(m,p)=>p(JSON.stringify(m)),this.decode=(u=t==null?void 0:t.decode)!==null&&u!==void 0?u:this.serializer.decode.bind(this.serializer),this.worker){if(typeof window<"u"&&!window.Worker)throw new Error("Web Worker is not supported");this.workerUrl=t==null?void 0:t.workerUrl}}}class Uf extends Error{constructor(t){super(t),this.__isStorageError=!0,this.name="StorageError"}}function mt(e){return typeof e=="object"&&e!==null&&"__isStorageError"in e}class _q extends Uf{constructor(t,n,r){super(t),this.name="StorageApiError",this.status=n,this.statusCode=r}toJSON(){return{name:this.name,message:this.message,status:this.status,statusCode:this.statusCode}}}class Ig extends Uf{constructor(t,n){super(t),this.name="StorageUnknownError",this.originalError=n}}var Tq=function(e,t,n,r){function a(i){return i instanceof n?i:new n(function(s){s(i)})}return new(n||(n=Promise))(function(i,s){function l(u){try{c(r.next(u))}catch(m){s(m)}}function d(u){try{c(r.throw(u))}catch(m){s(m)}}function c(u){u.done?i(u.value):a(u.value).then(l,d)}c((r=r.apply(e,t||[])).next())})};const Oj=e=>{let t;return e?t=e:typeof fetch>"u"?t=(...n)=>F(async()=>{const{default:r}=await Promise.resolve().then(()=>Ys);return{default:r}},void 0).then(({default:r})=>r(...n)):t=fetch,(...n)=>t(...n)},Dq=()=>Tq(void 0,void 0,void 0,function*(){return typeof Response>"u"?(yield F(()=>Promise.resolve().then(()=>Ys),void 0)).Response:Response}),qg=e=>{if(Array.isArray(e))return e.map(n=>qg(n));if(typeof e=="function"||e!==Object(e))return e;const t={};return Object.entries(e).forEach(([n,r])=>{const a=n.replace(/([-_][a-z])/gi,i=>i.toUpperCase().replace(/[-_]/g,""));t[a]=qg(r)}),t},Rq=e=>{if(typeof e!="object"||e===null)return!1;const t=Object.getPrototypeOf(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)};var vi=function(e,t,n,r){function a(i){return i instanceof n?i:new n(function(s){s(i)})}return new(n||(n=Promise))(function(i,s){function l(u){try{c(r.next(u))}catch(m){s(m)}}function d(u){try{c(r.throw(u))}catch(m){s(m)}}function c(u){u.done?i(u.value):a(u.value).then(l,d)}c((r=r.apply(e,t||[])).next())})};const Mm=e=>e.msg||e.message||e.error_description||e.error||JSON.stringify(e),zq=(e,t,n)=>vi(void 0,void 0,void 0,function*(){const r=yield Dq();e instanceof r&&!(n!=null&&n.noResolveJson)?e.json().then(a=>{const i=e.status||500,s=(a==null?void 0:a.statusCode)||i+"";
535t(new _q(Mm(a),i,s))}).catch(a=>{t(new Ig(Mm(a),a))}):t(new Ig(Mm(e),e))}),Iq=(e,t,n,r)=>{const a={method:e,headers:(t==null?void 0:t.headers)||{}};return e==="GET"||!r?a:(Rq(r)?(a.headers=Object.assign({"Content-Type":"application/json"},t==null?void 0:t.headers),a.body=JSON.stringify(r)):a.body=r,t!=null&&t.duplex&&(a.duplex=t.duplex),Object.assign(Object.assign({},a),n))};function Bl(e,t,n,r,a,i){return vi(this,void 0,void 0,function*(){return new Promise((s,l)=>{e(n,Iq(t,r,a,i)).then(d=>{if(!d.ok)throw d;return r!=null&&r.noResolveJson?d:d.json()}).then(d=>s(d)).catch(d=>zq(d,l,r))})})}function qc(e,t,n,r){return vi(this,void 0,void 0,function*(){return Bl(e,"GET",t,n,r)})}function $n(e,t,n,r,a){return vi(this,void 0,void 0,function*(){return Bl(e,"POST",t,r,a,n)})}function Ng(e,t,n,r,a){return vi(this,void 0,void 0,function*(){return Bl(e,"PUT",t,r,a,n)})}function qq(e,t,n,r){return vi(this,void 0,void 0,function*(){return Bl(e,"HEAD",t,Object.assign(Object.assign({},n),{noResolveJson:!0}),r)})}function Vj(e,t,n,r,a){return vi(this,void 0,void 0,function*(){return Bl(e,"DELETE",t,r,a,n)})}var zt=function(e,t,n,r){function a(i){return i instanceof n?i:new n(function(s){s(i)})}return new(n||(n=Promise))(function(i,s){function l(u){try{c(r.next(u))}catch(m){s(m)}}function d(u){try{c(r.throw(u))}catch(m){s(m)}}function c(u){u.done?i(u.value):a(u.value).then(l,d)}c((r=r.apply(e,t||[])).next())})};const Nq={limit:100,offset:0,sortBy:{column:"name",order:"asc"}},_y={cacheControl:"3600",contentType:"text/plain;charset=UTF-8",upsert:!1};class Lq{constructor(t,n={},r,a){this.shouldThrowOnError=!1,this.url=t,this.headers=n,this.bucketId=r,this.fetch=Oj(a)}throwOnError(){return this.shouldThrowOnError=!0,this}uploadOrUpdate(t,n,r,a){return zt(this,void 0,void 0,function*(){try{let i;const s=Object.assign(Object.assign({},_y),a);let l=Object.assign(Object.assign({},this.headers),t==="POST"&&{"x-upsert":String(s.upsert)});const d=s.metadata;typeof Blob<"u"&&r instanceof Blob?(i=new FormData,i.append("cacheControl",s.cacheControl),d&&i.append("metadata",this.encodeMetadata(d)),i.append("",r)):typeof FormData<"u"&&r instanceof FormData?(i=r,i.append("cacheControl",s.cacheControl),d&&i.append("metadata",this.encodeMetadata(d))):(i=r,l["cache-control"]=`max-age=${s.cacheControl}`,l["content-type"]=s.contentType,d&&(l["x-metadata"]=this.toBase64(this.encodeMetadata(d)))),a!=null&&a.headers&&(l=Object.assign(Object.assign({},l),a.headers));const c=this._removeEmptyFolders(n),u=this._getFinalPath(c),m=yield(t=="PUT"?Ng:$n)(this.fetch,`${this.url}/object/${u}`,i,Object.assign({headers:l},s!=null&&s.duplex?{duplex:s.duplex}:{}));return{data:{path:c,id:m.Id,fullPath:m.Key},error:null}}catch(i){if(this.shouldThrowOnError)throw i;if(mt(i))return{data:null,error:i};throw i}})}upload(t,n,r){return zt(this,void 0,void 0,function*(){return this.uploadOrUpdate("POST",t,n,r)})}uploadToSignedUrl(t,n,r,a){return zt(this,void 0,void 0,function*(){const i=this._removeEmptyFolders(t),s=this._getFinalPath(i),l=new URL(this.url+`/object/upload/sign/${s}`);l.searchParams.set("token",n);try{let d;const c=Object.assign({upsert:_y.upsert},a),u=Object.assign(Object.assign({},this.headers),{"x-upsert":String(c.upsert)});typeof Blob<"u"&&r instanceof Blob?(d=new FormData,d.append("cacheControl",c.cacheControl),d.append("",r)):typeof FormData<"u"&&r instanceof FormData?(d=r,d.append("cacheControl",c.cacheControl)):(d=r,u["cache-control"]=`max-age=${c.cacheControl}`,u["content-type"]=c.contentType);const m=yield Ng(this.fetch,l.toString(),d,{headers:u});return{data:{path:i,fullPath:m.Key},error:null}}catch(d){if(this.shouldThrowOnError)throw d;if(mt(d))return{data:null,error:d};throw d}})}createSignedUploadUrl(t,n){return zt(this,void 0,void 0,function*(){try{let r=this._getFinalPath(t);const a=Object.assign({},this.headers);n!=null&&n.upsert&&(a["x-upsert"]="true");const i=yield $n(this.fetch,`${this.url}/object/upload/sign/${r}`,{},{headers:a}),s=new URL(this.url+i.url),l=s.searchParams.get("token");if(!l)throw new Uf("No token returned by API");return{data:{signedUrl:s.toString(),path:t,token:l},error:null}}catch(r){if(this.shouldThrowOnError)throw r;if(mt(r))return{data:null,error:r};throw r}})}update(t,n,r){return zt(this,void 0,void 0,function*(){return this.uploadOrUpdate("PUT",t,n,r)})}move(t,n,r){return zt(this,void 0,void 0,function*(){try{return{data:yield $n(this.fetch,`${this.url}/object/move`,{bucketId:this.bucketId,sourceKey:t,destinationKey:n,destinationBucket:r==null?void 0:r.destinationBucket},{headers:this.headers}),error:null}}catch(a){if(this.shouldThrowOnError)throw a;if(mt(a))return{data:null,error:a};throw a}})}copy(t,n,r){return zt(this,void 0,void 0,function*(){try{return{data:{path:(yield $n(this.fetch,`${this.url}/object/copy`,{bucketId:this.bucketId,sourceKey:t,destinationKey:n,destinationBucket:r==null?void 0:r.destinationBucket},{headers:this.headers})).Key},error:null}}catch(a){if(this.shouldThrowOnError)throw a;if(mt(a))return{data:null,error:a};throw a}})}createSignedUrl(t,n,r){return zt(this,void 0,void 0,function*(){try{let a=this._getFinalPath(t),i=yield $n(this.fetch,`${this.url}/object/sign/${a}
535`,Object.assign({expiresIn:n},r!=null&&r.transform?{transform:r.transform}:{}),{headers:this.headers});const s=r!=null&&r.download?`&download=${r.download===!0?"":r.download}`:"";return i={signedUrl:encodeURI(`${this.url}${i.signedURL}${s}`)},{data:i,error:null}}catch(a){if(this.shouldThrowOnError)throw a;if(mt(a))return{data:null,error:a};throw a}})}createSignedUrls(t,n,r){return zt(this,void 0,void 0,function*(){try{const a=yield $n(this.fetch,`${this.url}/object/sign/${this.bucketId}`,{expiresIn:n,paths:t},{headers:this.headers}),i=r!=null&&r.download?`&download=${r.download===!0?"":r.download}`:"";return{data:a.map(s=>Object.assign(Object.assign({},s),{signedUrl:s.signedURL?encodeURI(`${this.url}${s.signedURL}${i}`):null})),error:null}}catch(a){if(this.shouldThrowOnError)throw a;if(mt(a))return{data:null,error:a};throw a}})}download(t,n){return zt(this,void 0,void 0,function*(){const a=typeof(n==null?void 0:n.transform)<"u"?"render/image/authenticated":"object",i=this.transformOptsToQueryString((n==null?void 0:n.transform)||{}),s=i?`?${i}`:"";try{const l=this._getFinalPath(t);return{data:yield(yield qc(this.fetch,`${this.url}/${a}/${l}${s}`,{headers:this.headers,noResolveJson:!0})).blob(),error:null}}catch(l){if(this.shouldThrowOnError)throw l;if(mt(l))return{data:null,error:l};throw l}})}info(t){return zt(this,void 0,void 0,function*(){const n=this._getFinalPath(t);try{const r=yield qc(this.fetch,`${this.url}/object/info/${n}`,{headers:this.headers});return{data:qg(r),error:null}}catch(r){if(this.shouldThrowOnError)throw r;if(mt(r))return{data:null,error:r};throw r}})}exists(t){return zt(this,void 0,void 0,function*(){const n=this._getFinalPath(t);try{return yield qq(this.fetch,`${this.url}/object/${n}`,{headers:this.headers}),{data:!0,error:null}}catch(r){if(this.shouldThrowOnError)throw r;if(mt(r)&&r instanceof Ig){const a=r.originalError;if([400,404].includes(a==null?void 0:a.status))return{data:!1,error:r}}throw r}})}getPublicUrl(t,n){const r=this._getFinalPath(t),a=[],i=n!=null&&n.download?`download=${n.download===!0?"":n.download}`:"";i!==""&&a.push(i);const l=typeof(n==null?void 0:n.transform)<"u"?"render/image":"object",d=this.transformOptsToQueryString((n==null?void 0:n.transform)||{});d!==""&&a.push(d);let c=a.join("&");return c!==""&&(c=`?${c}`),{data:{publicUrl:encodeURI(`${this.url}/${l}/public/${r}${c}`)}}}remove(t){return zt(this,void 0,void 0,function*(){try{return{data:yield Vj(this.fetch,`${this.url}/object/${this.bucketId}`,{prefixes:t},{headers:this.headers}),error:null}}catch(n){if(this.shouldThrowOnError)throw n;if(mt(n))return{data:null,error:n};throw n}})}list(t,n,r){return zt(this,void 0,void 0,function*(){try{const a=Object.assign(Object.assign(Object.assign({},Nq),n),{prefix:t||""});return{data:yield $n(this.fetch,`${this.url}/object/list/${this.bucketId}`,a,{headers:this.headers},r),error:null}}catch(a){if(this.shouldThrowOnError)throw a;if(mt(a))return{data:null,error:a};throw a}})}listV2(t,n){return zt(this,void 0,void 0,function*(){try{const r=Object.assign({},t);return{data:yield $n(this.fetch,`${this.url}/object/list-v2/${this.bucketId}`,r,{headers:this.headers},n),error:null}}catch(r){if(this.shouldThrowOnError)throw r;if(mt(r))return{data:null,error:r};throw r}})}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,"/")}transformOptsToQueryString(t){const n=[];return t.width&&n.push(`width=${t.width}`),t.height&&n.push(`height=${t.height}`),t.resize&&n.push(`resize=${t.resize}`),t.format&&n.push(`format=${t.format}`),t.quality&&n.push(`quality=${t.quality}`),n.join("&")}}const Bq="2.12.1",Mq={"X-Client-Info":`storage-js/${Bq}`};var xi=function(e,t,n,r){function a(i){return i instanceof n?i:new n(function(s){s(i)})}return new(n||(n=Promise))(function(i,s){function l(u){try{c(r.next(u))}catch(m){s(m)}}function d(u){try{c(r.throw(u))}catch(m){s(m)}}function c(u){u.done?i(u.value):a(u.value).then(l,d)}c((r=r.apply(e,t||[])).next())})};
535class Fq{constructor(t,n={},r,a){this.shouldThrowOnError=!1;const i=new URL(t);a!=null&&a.useNewHostname&&/supabase\.(co|in|red)$/.test(i.hostname)&&!i.hostname.includes("storage.supabase.")&&(i.hostname=i.hostname.replace("supabase.","storage.supabase.")),this.url=i.href,this.headers=Object.assign(Object.assign({},Mq),n),this.fetch=Oj(r)}throwOnError(){return this.shouldThrowOnError=!0,this}listBuckets(){return xi(this,void 0,void 0,function*(){try{return{data:yield qc(this.fetch,`${this.url}/bucket`,{headers:this.headers}),error:null}}catch(t){if(this.shouldThrowOnError)throw t;if(mt(t))return{data:null,error:t};throw t}})}getBucket(t){return xi(this,void 0,void 0,function*(){try{return{data:yield qc(this.fetch,`${this.url}/bucket/${t}`,{headers:this.headers}),error:null}}catch(n){if(this.shouldThrowOnError)throw n;if(mt(n))return{data:null,error:n};throw n}})}createBucket(t,n={public:!1}){return xi(this,void 0,void 0,function*(){try{return{data:yield $n(this.fetch,`${this.url}/bucket`,{id:t,name:t,type:n.type,public:n.public,file_size_limit:n.fileSizeLimit,allowed_mime_types:n.allowedMimeTypes},{headers:this.headers}),error:null}}catch(r){if(this.shouldThrowOnError)throw r;if(mt(r))return{data:null,error:r};throw r}})}updateBucket(t,n){return xi(this,void 0,void 0,function*(){try{return{data:yield Ng(this.fetch,`${this.url}/bucket/${t}`,{id:t,name:t,public:n.public,file_size_limit:n.fileSizeLimit,allowed_mime_types:n.allowedMimeTypes},{headers:this.headers}),error:null}}catch(r){if(this.shouldThrowOnError)throw r;if(mt(r))return{data:null,error:r};throw r}})}emptyBucket(t){return xi(this,void 0,void 0,function*(){try{return{data:yield $n(this.fetch,`${this.url}/bucket/${t}/empty`,{},{headers:this.headers}),error:null}}catch(n){if(this.shouldThrowOnError)throw n;if(mt(n))return{data:null,error:n};throw n}})}deleteBucket(t){return xi(this,void 0,void 0,function*(){try{return{data:yield Vj(this.fetch,`${this.url}/bucket/${t}`,{},{headers:this.headers}),error:null}}catch(n){if(this.shouldThrowOnError)throw n;if(mt(n))return{data:null,error:n};throw n}})}}class Oq extends Fq{constructor(t,n={},r,a){super(t,n,r,a)}from(t){return new Lq(this.url,this.headers,t,this.fetch)}}const Vq="2.57.4";let bo="";typeof Deno<"u"?bo="deno":typeof document<"u"?bo="web":typeof navigator<"u"&&navigator.product==="ReactNative"?bo="react-native":bo="node";const Wq={"X-Client-Info":`supabase-js-${bo}/${Vq}`},Uq={headers:Wq},$q={schema:"public"},Gq={autoRefreshToken:!0,persistSession:!0,detectSessionInUrl:!0,flowType:"implicit"},Hq={};var Kq=function(e,t,n,r){function a(i){return i instanceof n?i:new n(function(s){s(i)})}return new(n||(n=Promise))(function(i,s){function l(u){try{c(r.next(u))}catch(m){s(m)}}function d(u){try{c(r.throw(u))}catch(m){s(m)}}function c(u){u.done?i(u.value):a(u.value).then(l,d)}c((r=r.apply(e,t||[])).next())})};const Yq=e=>{let t;return e?t=e:typeof fetch>"u"?t=Cj:t=fetch,(...n)=>t(...n)},Zq=()=>typeof Headers>"u"?Sj:Headers,Jq=(e,t,n)=>{const r=Yq(n),a=Zq();return(i,s)=>Kq(void 0,void 0,void 0,function*(){var l;const d=(l=yield t())!==null&&l!==void 0?l:e;let c=new a(s==null?void 0:s.headers);return c.has("apikey")||c.set("apikey",e),c.has("Authorization")||c.set("Authorization",`Bearer ${d}`),r(i,Object.assign(Object.assign({},s),{headers:c}))})};var Qq=function(e,t,n,r){function a(i){return i instanceof n?i:new n(function(s){s(i)})}return new(n||(n=Promise))(function(i,s){function l(u){try{c(r.next(u))}catch(m){s(m)}}function d(u){try{c(r.throw(u))}catch(m){s(m)}}function c(u){u.done?i(u.value):a(u.value).then(l,d)}c((r=r.apply(e,t||[])).next())})};function Xq(e){return e.endsWith("/")?e:e+"/"}function e3(e,t){var n,r;const{db:a,auth:i,realtime:s,global:l}=e,{db:d,auth:c,realtime:u,global:m}=t,p={db:Object.assign(Object.assign({},d),a),auth:Object.assign(Object.assign({},c),i),realtime:Object.assign(Object.assign({},u),s),storage:{},global:Object.assign(Object.assign(Object.assign({},m),l),{headers:Object.assign(Object.assign({},(n=m==null?void 0:m.headers)!==null&&n!==void 0?n:{}),(r=l==null?void 0:l.headers)!==null&&r!==void 0?r:{})}),accessToken:()=>Qq(this,void 0,void 0,function*(){return""})};return e.accessToken?p.accessToken=e.accessToken:delete p.accessToken,p}function t3(e){const t=e==null?void 0:e.trim();if(!t)throw new Error("supabaseUrl is required.");
535if(!t.match(/^https?:\/\//i))throw new Error("Invalid supabaseUrl: Must be a valid HTTP or HTTPS URL.");try{return new URL(Xq(t))}catch{throw Error("Invalid supabaseUrl: Provided URL is malformed.")}}const Wj="2.71.1",Di=30*1e3,Lg=3,Fm=Lg*Di,n3="http://localhost:9999",r3="supabase.auth.token",a3={"X-Client-Info":`gotrue-js/${Wj}`},Bg="X-Supabase-Api-Version",Uj={"2024-01-01":{timestamp:Date.parse("2024-01-01T00:00:00.0Z"),name:"2024-01-01"}},i3=/^([a-z0-9_-]{4})*($|[a-z0-9_-]{3}$|[a-z0-9_-]{2}$)$/i,s3=10*60*1e3;class $f extends Error{constructor(t,n,r){super(t),this.__isAuthError=!0,this.name="AuthError",this.status=n,this.code=r}}function fe(e){return typeof e=="object"&&e!==null&&"__isAuthError"in e}class o3 extends $f{constructor(t,n,r){super(t,n,r),this.name="AuthApiError",this.status=n,this.code=r}}function l3(e){return fe(e)&&e.name==="AuthApiError"}class $j extends $f{constructor(t,n){super(t),this.name="AuthUnknownError",this.originalError=n}}class Ta extends $f{constructor(t,n,r,a){super(t,r,a),this.name=n,this.status=r}}class Br extends Ta{constructor(){super("Auth session missing!","AuthSessionMissingError",400,void 0)}}function d3(e){return fe(e)&&e.name==="AuthSessionMissingError"}class yd extends Ta{constructor(){super("Auth session or user missing","AuthInvalidToken
535ResponseError",500,void 0)}}class wd extends Ta{constructor(t){super(t,"AuthInvalidCredentialsError",400,void 0)}}class kd extends Ta{constructor(t,n=null){super(t,"AuthImplicitGrantRedirectError",500,void 0),this.details=null,this.details=n}toJSON(){return{name:this.name,message:this.message,status:this.status,details:this.details}}}function c3(e){return fe(e)&&e.name==="AuthImplicitGrantRedirectError"}class Ty extends Ta{constructor(t,n=null){super(t,"AuthPKCEGrantCodeExchangeError",500,void 0),this.details=null,this.details=n}toJSON(){return{name:this.name,message:this.message,status:this.status,details:this.details}}}class Mg extends Ta{constructor(t,n){super(t,"AuthRetryableFetchError",n,void 0)}}function Om(e){return fe(e)&&e.name==="AuthRetryableFetchError"}class Dy extends Ta{constructor(t,n,r){super(t,"AuthWeakPasswordError",n,"weak_password"),this.reasons=r}}class Fg extends Ta{constructor(t){super(t,"AuthInvalidJwtError",400,"invalid_jwt")}}const Nc="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_".split(""),Ry=` 536\r=`.split(""),u3=(()=>{const e=new Array(128);for(let t=0;t<e.length;t+=1)e[t]=-1;for(let t=0;t<Ry.length;t+=1)e[Ry[t].charCodeAt(0)]=-2;for(let t=0;t<Nc.length;t+=1)e[Nc[t].charCodeAt(0)]=t;return e})();function zy(e,t,n){if(e!==null)for(t.queue=t.queue<<8|e,t.queuedBits+=8;t.queuedBits>=6;){const r=t.queue>>t.queuedBits-6&63;n(Nc[r]),t.queuedBits-=6}else if(t.queuedBits>0)for(t.queue=t.queue<<6-t.queuedBits,t.queuedBits=6;t.queuedBits>=6;){const r=t.queue>>t.queuedBits-6&63;n(Nc[r]),t.queuedBits-=6}}function Gj(e,t,n){const r=u3[e];if(r>-1)for(t.queue=t.queue<<6|r,t.queuedBits+=6;t.queuedBits>=8;)n(t.queue>>t.queuedBits-8&255),t.queuedBits-=8;else{if(r===-2)return;throw new Error(`Invalid Base64-URL character "${String.fromCharCode(e)}"`)}}function Iy(e){const t=[],n=s=>{t.push(String.fromCodePoint(s))},r={utf8seq:0,codepoint:0},a={queue:0,queuedBits:0},i=s=>{g3(s,r,n)};for(let s=0;s<e.length;s+=1)Gj(e.charCodeAt(s),a,i);return t.join("")}function m3(e,t){if(e<=127){t(e);return}else if(e<=2047){t(192|e>>6),t(128|e&63);return}else if(e<=65535){t(224|e>>12),t(128|e>>6&63),t(128|e&63);return}else if(e<=1114111){t(240|e>>18),t(128|e>>12&63),t(128|e>>6&63),t(128|e&63);return}throw new Error(`Unrecognized Unicode codepoint: ${e.toString(16)}`)}function p3(e,t){for(let n=0;n<e.length;n+=1){let r=e.charCodeAt(n);if(r>55295&&r<=56319){const a=(r-55296)*1024&65535;r=(e.charCodeAt(n+1)-56320&65535|a)+65536,n+=1}m3(r,t)}}function g3(e,t,n){if(t.utf8seq===0){if(e<=127){n(e);return}for(let r=1;r<6;r+=1)if(!(e>>7-r&1)){t.utf8seq=r;break}if(t.utf8seq===2)t.codepoint=e&31;else if(t.utf8seq===3)t.codepoint=e&15;else if(t.utf8seq===4)t.codepoint=e&7;else throw new Error("Invalid UTF-8 sequence");t.utf8seq-=1}else if(t.utf8seq>0){if(e<=127)throw new Error("Invalid UTF-8 sequence");t.codepoint=t.codepoint<<6|e&63,t.utf8seq-=1,t.utf8seq===0&&n(t.codepoint)}}function h3(e){const t=[],n={queue:0,queuedBits:0},r=a=>{t.push(a)};for(let a=0;a<e.length;a+=1)Gj(e.charCodeAt(a),n,r);return new Uint8Array(t)}function f3(e){const t=[];return p3(e,n=>t.push(n)),new Uint8Array(t)}function v3(e){const t=[],n={queue:0,queuedBits:0},r=a=>{t.push(a)};return e.forEach(a=>zy(a,n,r)),zy(null,n,r),t.join("")}function b3(e){return Math.round(Date.now()/1e3)+e}function y3(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){const t=Math.random()*16|0;return(e=="x"?t:t&3|8).toString(16)})}const bn=()=>typeof window<"u"&&typeof document<"u",qa={tested:!1,writable:!1},Hj=()=>{if(!bn())return!1;try{if(typeof globalThis.localStorage!="object")return!1}catch{return!1}if(qa.tested)return qa.writable;const e=`lswt-${Math.random()}${Math.random()}`;try{globalThis.localStorage.setItem(e,e),globalThis.localStorage.removeItem(e),qa.tested=!0,qa.writable=!0}catch{qa.tested=!0,qa.writable=!1}return qa.writable};function w3(e){const t={},n=new URL(e);if(n.hash&&n.hash[0]==="#")try{new URLSearchParams(n.hash.substring(1)).forEach((a,i)=>{t[i]=a})}catch{}return n.searchParams.forEach((r,a)=>{t[a]=r}),t}const Kj=e=>{let t;return e?t=e:typeof fetch>"u"?t=(...n)=>F(async()=>{const{default:r}=await Promise.resolve().then(()=>Ys);return{default:r}},void 0).then(({default:r})=>r(...n)):t=fetch,(...n)=>t(...n)},k3=e=>typeof e=="object"&&e!==null&&"status"in e&&"ok"in e&&"json"in e&&typeof e.json=="function",Ri=async(e,t,n)=>{await e.setItem(t,JSON.stringify(n))},Na=async(e,t)=>{const n=await e.getItem(t);if(!n)return null;try{return JSON.parse(n)}catch{return n}},qr=async(e,t)=>{await e.removeItem(t)};class Iu{constructor(){this.promise=new Iu.promiseConstructor((t,n)=>{this.resolve=t,this.reject=n})}}Iu.promiseConstructor=Promise;function Vm(e){const t=e.split(".");if(t.length!==3)throw new Fg("Invalid JWT structure");for(let r=0;r<t.length;r++)if(!i3.test(t[r]))throw new Fg("JWT not in base64url format");return{header:JSON.parse(Iy(t[0])),payload:JSON.parse(Iy(t[1])),signature:h3(t[2]),raw:{header:t[0],payload:t[1]}}}async function x3(e){return await new Promise(t=>{setTimeout(()=>t(null),e)})}function j3(e,t){return new Promise((r,a)=>{(async()=>{for(let i=0;i<1/0;i++)try{const s=await e(i);if(!t(i,null,s)){r(s);return}}catch(s){if(!t(i,s)){a(s);return}}})()})}function A3(e){return("0"+e.toString(16)).substr(-2)}function E3(){const t=new Uint32Array(56);if(typeof crypto>"u"){const n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~",r=n.length;let a="";for(let i=0;i<56;i++)a+=n.charAt(Math.floor(Math.random()*r));return a}return crypto.getRandomValues(t),Array.from(t,A3).join("")}async function P3(e){const n=new TextEncoder().encode(e),r=await crypto.subtle.digest("SHA-256",
536n),a=new Uint8Array(r);return Array.from(a).map(i=>String.fromCharCode(i)).join("")}async function C3(e){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."),e;const n=await P3(e);return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}async function ji(e,t,n=!1){const r=E3();let a=r;n&&(a+="/PASSWORD_RECOVERY"),await Ri(e,`${t}-code-verifier`,a);const i=await C3(r);return[i,r===i?"plain":"s256"]}const S3=/^2[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9]|3[0-1])$/i;function _3(e){const t=e.headers.get(Bg);if(!t||!t.match(S3))return null;try{return new Date(`${t}T00:00:00.0Z`)}catch{return null}}function T3(e){if(!e)throw new Error("Missing exp claim");const t=Math.floor(Date.now()/1e3);if(e<=t)throw new Error("JWT has expired")}function D3(e){switch(e){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 R3=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;function Ai(e){if(!R3.test(e))throw new Error("@supabase/auth-js: Expected parameter to be UUID but is not")}function Wm(){const e={};return new Proxy(e,{get:(t,n)=>{if(n==="__isUserNotAvailableProxy")return!0;if(typeof n=="symbol"){const r=n.toString();if(r==="Symbol(Symbol.toPrimitive)"||r==="Symbol(Symbol.toStringTag)"||r==="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:(t,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:(t,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 qy(e){return JSON.parse(JSON.stringify(e))}var z3=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var a=0,r=Object.getOwnPropertySymbols(e);a<r.length;a++)t.indexOf(r[a])<0&&Object.prototype.propertyIsEnumerable.call(e,r[a])&&(n[r[a]]=e[r[a]]);return n};const Ma=e=>e.msg||e.message||e.error_description||e.error||JSON.stringify(e),I3=[502,503,504];async function Ny(e){var t;if(!k3(e))throw new Mg(Ma(e),0);if(I3.includes(e.status))throw new Mg(Ma(e),e.status);let n;try{n=await e.json()}catch(i){throw new $j(Ma(i),i)}let r;const a=_3(e);if(a&&a.getTime()>=Uj["2024-01-01"].timestamp&&typeof n=="object"&&n&&typeof n.code=="string"?r=n.code:typeof n=="object"&&n&&typeof n.error_code=="string"&&(r=n.error_code),r){if(r==="weak_password")throw new Dy(Ma(n),e.status,((t=n.weak_password)===null||t===void 0?void 0:t.reasons)||[]);if(r==="session_not_found")throw new Br}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((i,s)=>i&&typeof s=="string",!0))throw new Dy(Ma(n),e.status,n.weak_password.reasons);throw new o3(Ma(n),e.status||500,r)}const q3=(e,t,n,r)=>{const a={method:e,headers:(t==null?void 0:t.headers)||{}};return e==="GET"?a:(a.headers=Object.assign({"Content-Type":"application/json;charset=UTF-8"},t==null?void 0:t.headers),a.body=JSON.stringify(r),Object.assign(Object.assign({},a),n))};async function Ee(e,t,n,r){var a;const i=Object.assign({},r==null?void 0:r.headers);i[Bg]||(i[Bg]=Uj["2024-01-01"].name),r!=null&&r.jwt&&(i.Authorization=`Bearer ${r.jwt}`);const s=(a=r==null?void 0:r.query)!==null&&a!==void 0?a:{};r!=null&&r.redirectTo&&(s.redirect_to=r.redirectTo);const l=Object.keys(s).length?"?"+new URLSearchParams(s).toString():"",d=await N3(e,t,n+l,{headers:i,noResolveJson:r==null?void 0:r.noResolveJson},{},r==null?void 0:r.body);return r!=null&&r.xform?r==null?void 0:r.xform(d):{data:Object.assign({},d),error:null}}async function N3(e,t,n,r,a,i){const s=q3(t,r,a,i);let l;try{l=await e(n,Object.assign({},s))}catch(d){throw console.error(d),new Mg(Ma(d),0)}if(l.ok||await Ny(l),r!=null&&r.noResolveJson)return l;try{return await l.json()}catch(d){await Ny(d)}}function pr(e){var t;let n=null;F3(e)&&(n=Object.assign({},e),e.expires_at||(n.expires_at=b3(e.expires_in)));const r=(t=e.user)!==null&&t!==void 0?t:e;return{data:{session:n,user:r},error:null}}function Ly(e){const t=pr(e);return!t.error&&e.weak_password&&typeof e.weak_password=="object"&&Array.isArray(e.weak_password.reasons)&&e.weak_password.reasons.length&&e.weak_password.message&&typeof e.weak_password.message=="string"&&e.weak_password.reasons.reduce((n,r)=>n&&typeof r=="string",!0)&&(t.data.weak_password=e.weak_password),t}function Ur(e){var t;return{data:{user:(t=e.user)!==null&&t!==void 0?t:e},error:null}}function L3(e){return{data:e,error:null}}function B3(e){const{action_link:t,email_otp:n,hashed_token:r,redirect_to:a,verification_type:i}=e,s=z3(e,["action_link","email_otp","hashed_token","redirect_to","verification_type"]),l={action_link:t,email_otp:n,hashed_token:r,redirect_to:a,verification_type:i},d=Object.assign({},s);return{data:{properties:l,user:d},error:null}}function M3(e){return e}function F3(e){return e.access_token&&e.refresh_token&&e.expires_in}const Um=["global","local","others"];var O3=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var a=0,r=Object.getOwnPropertySymbols(e);a<r.length;a++)t.indexOf(r[a])<0&&Object.prototype.propertyIsEnumerable.call(e,r[a])&&(n[r[a]]=e[r[a]]);return n};class V3{constructor({url:t="",headers:n={},fetch:r}){this.url=t,this.headers=n,this.fetch=Kj(r),this.mfa={listFactors:this._listFactors.bind(this),deleteFactor:this._deleteFactor.bind(this)}}async signOut(t,n=Um[0]){if(Um.indexOf(n)<0)throw new Error(`@supabase/auth-js: Parameter scope must be one of ${Um.join(", ")}`);try{return await Ee(this.fetch,"POST",`${this.url}/logout?scope=${n}`,{headers:this.headers,jwt:t,noResolveJson:!0}),{data:null,error:null}}catch(r){if(fe(r))return{data:null,error:r};throw r}}async inviteUserByEmail(t,n={}){try{return await Ee(this.fetch,"POST",`${this.url}/invite`,{body:{email:t,data:n.data},headers:this.headers,redirectTo:n.redirectTo,xform:Ur})}catch(r){if(fe(r))return{data:{user:null},error:r};throw r}}async generateLink(t){try{const{options:n}=t,r=O3(t,["options"]),a=Object.assign(Object.assign({},r),n);return"newEmail"in r&&(a.new_email=r==null?void 0:r.newEmail,delete a.newEmail),await Ee(this.fetch,"POST",`${this.url}/admin/generate_link`,{body:a,headers:this.headers,xform:B3,redirectTo:n==null?void 0:n.redirectTo})}catch(n){if(fe(n))return{data:{properties:null,user:null},error:n};throw n}}async createUser(t){try{return await Ee(this.fetch,"POST",`${this.url}/admin/users`,{body:t,headers:this.headers,xform:Ur})}catch(n){if(fe(n))return{data:{user:null},error:n};throw n}}async listUsers(t){var n,r,a,i,s,l,d;try{const c={nextPage:null,lastPage:0,total:0},u=await Ee(this.fetch,"GET",`${this.url}/admin/users`,{headers:this.headers,noResolveJson:!0,query:{page:(r=(n=t==null?void 0:t.page)===null||n===void 0?void 0:n.toString())!==null&&r!==void 0?r:"",per_page:(i=(a=t==null?void 0:t.perPage)===null||a===void 0?void 0:a.toString())!==null&&i!==void 0?i:""},xform:M3});if(u.error)throw u.error;const m=await u.json(),p=(s=u.headers.get("x-total-count"))!==null&&s!==void 0?s:0,h=(d=(l=u.headers.get("link"))===null||l===void 0?void 0:l.split(","))!==null&&d!==void 0?d:[];return h.length>
5360&&(h.forEach(b=>{const f=parseInt(b.split(";")[0].split("=")[1].substring(0,1)),k=JSON.parse(b.split(";")[1].split("=")[1]);c[`${k}Page`]=f}),c.total=parseInt(p)),{data:Object.assign(Object.assign({},m),c),error:null}}catch(c){if(fe(c))return{data:{users:[]},error:c};throw c}}async getUserById(t){Ai(t);try{return await Ee(this.fetch,"GET",`${this.url}/admin/users/${t}`,{headers:this.headers,xform:Ur})}catch(n){if(fe(n))return{data:{user:null},error:n};throw n}}async updateUserById(t,n){Ai(t);try{return await Ee(this.fetch,"PUT",`${this.url}/admin/users/${t}`,{body:n,headers:this.headers,xform:Ur})}catch(r){if(fe(r))return{data:{user:null},error:r};throw r}}async deleteUser(t,n=!1){Ai(t);try{return await Ee(this.fetch,"DELETE",`${this.url}/admin/users/${t}`,{headers:this.headers,body:{should_soft_delete:n},xform:Ur})}catch(r){if(fe(r))return{data:{user:null},error:r};throw r}}async _listFactors(t){Ai(t.userId);try{const{data:n,error:r}=await Ee(this.fetch,"GET",`${this.url}/admin/users/${t.userId}/factors`,{headers:this.headers,xform:a=>({data:{factors:a},error:null})});return{data:n,error:r}}catch(n){if(fe(n))return{data:null,error:n};throw n}}async _deleteFactor(t){Ai(t.userId),Ai(t.id);try{return{data:await Ee(this.fetch,"DELETE",`${this.url}/admin/users/${t.userId}/factors/${t.id}`,{headers:this.headers}),error:null}}catch(n){if(fe(n))return{data:null,error:n};throw n}}}function By(e={}){return{getItem:t=>e[t]||null,setItem:(t,n)=>{e[t]=n},removeItem:t=>{delete e[t]}}}function W3(){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)}}const Ei={debug:!!(globalThis&&Hj()&&globalThis.localStorage&&globalThis.localStorage.getItem("supabase.gotrue-js.locks.debug")==="true")};class Yj extends Error{constructor(t){super(t),this.isAcquireTimeout=!0}}class U3 extends Yj{}async function $3(e,t,n){Ei.debug&&console.log("@supabase/gotrue-js: navigatorLock: acquire lock",e,t);const r=new globalThis.AbortController;return t>0&&setTimeout(()=>{r.abort(),Ei.debug&&console.log("@supabase/gotrue-js: navigatorLock acquire timed out",e)},t),await Promise.resolve().then(()=>globalThis.navigator.locks.request(e,t===0?{mode:"exclusive",ifAvailable:!0}:{mode:"exclusive",signal:r.signal},async a=>{if(a){Ei.debug&&console.log("@supabase/gotrue-js: navigatorLock: acquired",e,a.name);try{return await n()}finally{Ei.debug&&console.log("@supabase/gotrue-js: navigatorLock: released",e,a.name)}}else{if(t===0)throw Ei.debug&&console.log("@supabase/gotrue-js: navigatorLock: not immediately available",e),new U3(`Acquiring an exclusive Navigator LockManager lock "${e}" immediately failed`);if(Ei.debug)try{const i=await globalThis.navigator.locks.query();console.log("@supabase/gotrue-js: Navigator LockManager state",JSON.stringify(i,null," "))}catch(i){console.warn("@supabase/gotrue-js: Error when querying Navigator LockManager state",i)}return console.warn("@supabase/gotrue-js: Navigator LockManager returned a null lock when using #request without ifAvailable set to true, it appears this browser is not following the LockManager spec https://developer.mozilla.org/en-US/docs/Web/API/LockManager/request"),await n()}}))}W3();const G3={url:n3,storageKey:r3,autoRefreshToken:!0,persistSession:!0,detectSessionInUrl:!0,headers:a3,flowType:"implicit",debug:!1,hasCustomAuthorizationHeader:!1};async function My(e,t,n){return await n()}const Pi={};class dl{constructor(t){var n,r;this.userStorage=null,this.memoryStorage=null,this.stateChangeEmitters=new Map,this.autoRefreshTicker=null,this.visibilityChangedCallback=null,this.refreshingDeferred=null,this.initializePromise=null,this.detectSessionInUrl=!0,this.hasCustomAuthorizationHeader=!1,this.suppressGetSessionWarning=!1,this.lockAcquired=!1,this.pendingInLock=[],this.broadcastChannel=null,this.logger=console.log,this.instanceID=dl.nextInstanceID,dl.nextInstanceID+=1,this.instanceID>0&&bn()&&console.warn("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.");const a=Object.assign(Object.assign({},G3),t);if(this.logDebugMessages=!!a.debug,typeof a.debug=="function"&&(this.logger=a.debug),this.persistSession=a.persistSession,this.storageKey=a.storageKey,this.autoRefreshToken=a.autoRefreshToken,this.admin=new V3({url:a.url,headers:a.headers,fetch:a.fetch}),this.url=a.url,this.headers=a.headers,this.fetch=Kj(a.fetch),this.lock=a.lock||My,this.detectSessionInUrl=a.detectSessionInUrl,this.flowType=a.flowType,this.hasCustomAuthorizationHeader=a.hasCustomAuthorizationHeader,a.lock?this.lock=a.lock:bn()&&(!((n=globalThis==null?void 0:globalThis.navigator)===null||n===void 0)&&n.locks)?this.lock=$3:this.lock=My,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)},this.persistSession?(a.storage?this.storage=a.storage:Hj()?this.storage=globalThis.localStorage:(this.memoryStorage={},this.storage=By(this.memoryStorage)),a.userStorage&&(this.userStorage=a.userStorage)):(this.memoryStorage={},this.storage=By(this.memoryStorage)),bn()&&globalThis.BroadcastChannel&&this.persistSession&&this.storageKey){try{this.broadcastChannel=new globalThis.BroadcastChannel(this.storageKey)}catch(i){console.error("Failed to create a new BroadcastChannel, multi-tab state changes will not be available",i)}(r=this.broadcastChannel)===null||r===void 0||r.addEventListener("message",async i=>{this._debug("received broadcast notification from other tab or client",i),await this._notifyAllSubscribers(i.data.event,i.data.session,!1)})}this.initialize()}get jwks(){var t,n;return(n=(t=Pi[this.storageKey])===null||t===void 0?void 0:t.jwks)!==null&&n!==void 0?n:{keys:[]}}set jwks(t){Pi[this.storageKey]=Object.assign(Object.assign({},Pi[this.storageKey]),{jwks:t})}get jwks_cached_at(){var t,n;return(n=(t=Pi[this.storageKey])===null||t===void 0?void 0:t.cachedAt)!==null&&n!==void 0?n:Number.MIN_SAFE_INTEGER}set jwks_cached_at(t){Pi[this.storageKey]=Object.assign(Object.assign({},Pi[this.storageKey]),{cachedAt:t})}_debug(...t){return this.logDebugMessages&&this.logger(`GoTrueClient@${this.instanceID} (${Wj}) ${new Date().toISOString()}`,...t),this}async initialize(){return this.initializePromise?await this.initializePromise:(this.initializePromise=(async()=>await this._acquireLock(-1,async()=>await this._initialize()))(),await this.initializePromise)}async _initialize(){var t;try{const n=w3(window.location.href);let r="none";if(this._isImplicitGrantCallback(n)?r="implicit":await this._isPKCECallback(n)&&(r="pkce"),bn()&&this.detectSessionInUrl&&r!=="none"){const{data:a,error:i}=await this._getSessionFromURL(n,r);if(i){if(this._debug("#_initialize()","error detecting session from URL",i),c3(i)){const d=(t=i.details)===null||t===void 0?void 0:t.code;
536if(d==="identity_already_exists"||d==="identity_not_found"||d==="single_identity_not_deletable")return{error:i}}return await this._removeSession(),{error:i}}const{session:s,redirectType:l}=a;return this._debug("#_initialize()","detected session in URL",s,"redirect type",l),await this._saveSession(s),setTimeout(async()=>{l==="recovery"?await this._notifyAllSubscribers("PASSWORD_RECOVERY",s):await this._notifyAllSubscribers("SIGNED_IN",s)},0),{error:null}}return await this._recoverAndRefresh(),{error:null}}catch(n){return fe(n)?{error:n}:{error:new $j("Unexpected error during initialization",n)}}finally{await this._handleVisibilityChange(),this._debug("#_initialize()","end")}}async signInAnonymously(t){var n,r,a;try{const i=await Ee(this.fetch,"POST",`${this.url}/signup`,{headers:this.headers,body:{data:(r=(n=t==null?void 0:t.options)===null||n===void 0?void 0:n.data)!==null&&r!==void 0?r:{},gotrue_meta_security:{captcha_token:(a=t==null?void 0:t.options)===null||a===void 0?void 0:a.captchaToken}},xform:pr}),{data:s,error:l}=i;if(l||!s)return{data:{user:null,session:null},error:l};const d=s.session,c=s.user;return s.session&&(await this._saveSession(s.session),await this._notifyAllSubscribers("SIGNED_IN",d)),{data:{user:c,session:d},error:null}}catch(i){if(fe(i))return{data:{user:null,session:null},error:i};throw i}}async signUp(t){var n,r,a;try{let i;if("email"in t){const{email:u,password:m,options:p}=t;let h=null,b=null;this.flowType==="pkce"&&([h,b]=await ji(this.storage,this.storageKey)),i=await Ee(this.fetch,"POST",`${this.url}/signup`,{headers:this.headers,redirectTo:p==null?void 0:p.emailRedirectTo,body:{email:u,password:m,data:(n=p==null?void 0:p.data)!==null&&n!==void 0?n:{},gotrue_meta_security:{captcha_token:p==null?void 0:p.captchaToken},code_challenge:h,code_challenge_method:b},xform:pr})}else if("phone"in t){const{phone:u,password:m,options:p}=t;i=await Ee(this.fetch,"POST",`${this.url}/signup`,{headers:this.headers,body:{phone:u,password:m,data:(r=p==null?void 0:p.data)!==null&&r!==void 0?r:{},channel:(a=p==null?void 0:p.channel)!==null&&a!==void 0?a:"sms",gotrue_meta_security:{captcha_token:p==null?void 0:p.captchaToken}},xform:pr})}else throw new wd("You must provide either an email or phone number and a password");const{data:s,error:l}=i;if(l||!s)return{data:{user:null,session:null},error:l};const d=s.session,c=s.user;return s.session&&(await this._saveSession(s.session),await this._notifyAllSubscribers("SIGNED_IN",d)),{data:{user:c,session:d},error:null}}catch(i){if(fe(i))return{data:{user:null,session:null},error:i};throw i}}async signInWithPassword(t){try{let n;if("email"in t){const{email:i,password:s,options:l}=t;n=await Ee(this.fetch,"POST",`${this.url}/token?grant_type=password`,{headers:this.headers,body:{email:i,password:s,gotrue_meta_security:{captcha_token:l==null?void 0:l.captchaToken}},xform:Ly})}else if("phone"in t){const{phone:i,password:s,options:l}=t;n=await Ee(this.fetch,"POST",`${this.url}/token?grant_type=password`,{headers:this.headers,body:{phone:i,password:s,gotrue_meta_security:{captcha_token:l==null?void 0:l.captchaToken}},xform:Ly})}else throw new wd("You must provide either an email or phone number and a password");const{data:r,error:a}=n;return a?{data:{user:null,session:null},error:a}:!r||!r.session||!r.user?{data:{user:null,session:null},error:new yd}:(r.session&&(await this._saveSession(r.session),await this._notifyAllSubscribers("SIGNED_IN",r.session)),{data:Object.assign({user:r.user,session:r.session},r.weak_password?{weakPassword:r.weak_password}:null),error:a})}catch(n){if(fe(n))return{data:{user:null,session:null},error:n};throw n}}async signInWithOAuth(t){var n,r,a,i;return await this._handleProviderSignIn(t.provider,{redirectTo:(n=t.options)===null||n===void 0?void 0:n.redirectTo,scopes:(r=t.options)===null||r===void 0?void 0:r.scopes,queryParams:(a=t.options)===null||a===void 0?void 0:a.queryParams,skipBrowserRedirect:(i=t.options)===null||i===void 0?void 0:i.skipBrowserRedirect})}async exchangeCodeForSession(t){return await this.initializePromise,this._acquireLock(-1,async()=>this._exchangeCodeForSession(t))}async signInWithWeb3(t){const{chain:n}=t;if(n==="solana")return await this.signInWithSolana(t);throw new Error(`@supabase/auth-js: Unsupported chain "${n}"`)}async signInWithSolana(t){var n,r,a,i,s,l,d,c,u,m,p,h;let b,f;if("message"in t)b=t.message,f=t.signature;else{const{chain:k,wallet:w,statement:v,options:y}=t;let x;if(bn())if(typeof w=="object")x=w;else{const E=window;if("solana"in E&&typeof E.solana=="object"&&("signIn"in E.solana&&typeof E.solana.signIn=="function"||"signMessage"in E.solana&&typeof E.solana.signMessage=="function"))x=E.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 w!="object"||!(y!=null&&y.url))throw new Error("@supabase/auth-js: Both wallet and url must be specified in non-browser environments.");x=w}const A=new URL((n=y==null?void 0:y.url)!==null&&n!==void 0?n:window.location.href);if("signIn"in x&&x.signIn){const E=await x.signIn(Object.assign(Object.assign(Object.assign({issuedAt:new Date().toISOString()},y==null?void 0:y.signInWithSolana),{version:"1",domain:A.host,uri:A.href}),v?{statement:v}:null));let j;if(Array.isArray(E)&&E[0]&&typeof E[0]=="object")j=E[0];else if(E&&typeof E=="object"&&"signedMessage"in E&&"signature"in E)j=E;else throw new Error("@supabase/auth-js: Wallet method signIn() returned unrecognized value");if("signedMessage"in j&&"signature"in j&&(typeof j.signedMessage=="string"||j.signedMessage instanceof Uint8Array)&&j.signature instanceof Uint8Array)b=typeof j.signedMessage=="string"?j.signedMessage:new TextDecoder().decode(j.signedMessage),f=j.signature;else throw new Error("@supabase/auth-js: Wallet method signIn() API returned object without signedMessage and signature fields")}else{if(!("signMessage"in x)||typeof x.signMessage!="function"||!("publicKey"in x)||typeof x!="object"||!x.publicKey||!("toBase58"in x.publicKey)||typeof x.publicKey.toBase58!="function")throw new Error("@supabase/auth-js: Wallet does not have a compatible signMessage() and publicKey.toBase58() API");b=[`${A.host} wants you to sign in with your Solana account:`,x.publicKey.toBase58(),...v?["",v,""]:[""],"Version: 1",`URI: ${A.href}`,`Issued At: ${(a=(r=y==null?void 0:y.signInWithSolana)===null||r===void 0?void 0:r.issuedAt)!==null&&a!==void 0?a:new Date().toISOString()}`,...!((i=y==null?void 0:y.signInWithSolana)===null||i===void 0)&&i.notBefore?[`Not Before: ${y.signInWithSolana.notBefore}`]:[],...!((s=y==null?void 0:y.signInWithSolana)===null||s===void 0)&&s.expirationTime?[`Expiration Time: ${y.signInWithSolana.expirationTime}`]:[],...!((l=y==null?void 0:y.signInWithSolana)===null||l===void 0)&&l.chainId?[`Chain ID: ${y.signInWithSolana.chainId}`]:[],...!((d=y==null?void 0:y.signInWithSolana)===null||d===void 0)&&d.nonce?[`Nonce: ${y.signInWithSolana.nonce}`]:[],...!((c=y==null?void 0:y.signInWithSolana)===null||c===void 0)&&c.requestId?[`Request ID: ${y.signInWithSolana.requestId}`]:[],...!((m=(u=y==null?void 0:y.signInWithSolana)===null||u===void 0?void 0:u.resources)===null||m===void 0)&&m.length?["Resources",...y.signInWithSolana.resources.map(j=>`- ${j}`)]:[]].join(` 537`);const E=await x.signMessage(new TextEncoder().encode(b),"utf8");if(!E||!(E instanceof Uint8Array))throw new Error("@supabase/auth-js: Wallet signMessage() API returned an recognized value");f=E}}try{const{data:k,error:w}=await Ee(this.fetch,"POST",`${this.url}/token?grant_type=web3`,{headers:this.headers,body:Object.assign({chain:"solana",message:b,signature:v3(f)},!((p=t.options)===null||p===void 0)&&p.captchaToken?{gotrue_meta_security:{captcha_token:(h=t.options)===null||h===void 0?void 0:h.captchaToken}}:null),xform:pr});if(w)throw w;return!k||!k.session||!k.user?{data:{user:null,session:null}
537,error:new yd}:(k.session&&(await this._saveSession(k.session),await this._notifyAllSubscribers("SIGNED_IN",k.session)),{data:Object.assign({},k),error:w})}catch(k){if(fe(k))return{data:{user:null,session:null},error:k};throw k}}async _exchangeCodeForSession(t){const n=await Na(this.storage,`${this.storageKey}-code-verifier`),[r,a]=(n??"").split("/");try{const{data:i,error:s}=await Ee(this.fetch,"POST",`${this.url}/token?grant_type=pkce`,{headers:this.headers,body:{auth_code:t,code_verifier:r},xform:pr});if(await qr(this.storage,`${this.storageKey}-code-verifier`),s)throw s;return!i||!i.session||!i.user?{data:{user:null,session:null,redirectType:null},error:new yd}:(i.session&&(await this._saveSession(i.session),await this._notifyAllSubscribers("SIGNED_IN",i.session)),{data:Object.assign(Object.assign({},i),{redirectType:a??null}),error:s})}catch(i){if(fe(i))return{data:{user:null,session:null,redirectType:null},error:i};throw i}}async signInWithIdToken(t){try{const{options:n,provider:r,token:a,access_token:i,nonce:s}=t,l=await Ee(this.fetch,"POST",`${this.url}/token?grant_type=id_token`,{headers:this.headers,body:{provider:r,id_token:a,access_token:i,nonce:s,gotrue_meta_security:{captcha_token:n==null?void 0:n.captchaToken}},xform:pr}),{data:d,error:c}=l;return c?{data:{user:null,session:null},error:c}:!d||!d.session||!d.user?{data:{user:null,session:null},error:new yd}:(d.session&&(await this._saveSession(d.session),await this._notifyAllSubscribers("SIGNED_IN",d.session)),{data:d,error:c})}catch(n){if(fe(n))return{data:{user:null,session:null},error:n};throw n}}async signInWithOtp(t){var n,r,a,i,s;try{if("email"in t){const{email:l,options:d}=t;let c=null,u=null;this.flowType==="pkce"&&([c,u]=await ji(this.storage,this.storageKey));const{error:m}=await Ee(this.fetch,"POST",`${this.url}/otp`,{headers:this.headers,body:{email:l,data:(n=d==null?void 0:d.data)!==null&&n!==void 0?n:{},create_user:(r=d==null?void 0:d.shouldCreateUser)!==null&&r!==void 0?r:!0,gotrue_meta_security:{captcha_token:d==null?void 0:d.captchaToken},code_challenge:c,code_challenge_method:u},redirectTo:d==null?void 0:d.emailRedirectTo});return{data:{user:null,session:null},error:m}}if("phone"in t){const{phone:l,options:d}=t,{data:c,error:u}=await Ee(this.fetch,"POST",`${this.url}/otp`,{headers:this.headers,body:{phone:l,data:(a=d==null?void 0:d.data)!==null&&a!==void 0?a:{},create_user:(i=d==null?void 0:d.shouldCreateUser)!==null&&i!==void 0?i:!0,gotrue_meta_security:{captcha_token:d==null?void 0:d.captchaToken},channel:(s=d==null?void 0:d.channel)!==null&&s!==void 0?s:"sms"}});return{data:{user:null,session:null,messageId:c==null?void 0:c.message_id},error:u}}throw new wd("You must provide either an email or phone number.")}catch(l){if(fe(l))return{data:{user:null,session:null},error:l};throw l}}async verifyOtp(t){var n,r;try{let a,i;"options"in t&&(a=(n=t.options)===null||n===void 0?void 0:n.redirectTo,i=(r=t.options)===null||r===void 0?void 0:r.captchaToken);const{data:s,error:l}=await Ee(this.fetch,"POST",`${this.url}/verify`,{headers:this.headers,body:Object.assign(Object.assign({},t),{gotrue_meta_security:{captcha_token:i}}),redirectTo:a,xform:pr});if(l)throw l;if(!s)throw new Error("An error occurred on token verification.");const d=s.session,c=s.user;return d!=null&&d.access_token&&(await this._saveSession(d),await this._notifyAllSubscribers(t.type=="recovery"?"PASSWORD_RECOVERY":"SIGNED_IN",d)),{data:{user:c,session:d},error:null}}catch(a){if(fe(a))return{data:{user:null,session:null},error:a};throw a}}async signInWithSSO(t){var n,r,a;try{let i=null,s=null;return this.flowType==="pkce"&&([i,s]=await ji(this.storage,this.storageKey)),await Ee(this.fetch,"POST",`${this.url}/sso`,{body:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},"providerId"in t?{provider_id:t.providerId}:null),"domain"in t?{domain:t.domain}:null),{redirect_to:(r=(n=t.options)===null||n===void 0?void 0:n.redirectTo)!==null&&r!==void 0?r:void 0}),!((a=t==null?void 0:t.options)===null||a===void 0)&&a.captchaToken?{gotrue_meta_security:{captcha_token:t.options.captchaToken}}:null),{skip_http_redirect:!0,code_challenge:i,code_challenge_method:s}),headers:this.headers,xform:L3})}catch(i){if(fe(i))return{data:null,error:i};throw i}}async reauthenticate(){return await this.initializePromise,await this._acquireLock(-1,async()=>await this._reauthenticate())}async _reauthenticate(){try{return await this._useSession(async t=>{const{data:{session:n},error:r}=t;if(r)throw r;if(!n)throw new Br;const{error:a}=await Ee(this.fetch,"GET",`${this.url}/reauthenticate`,{headers:this.headers,jwt:n.access_token});return{data:{user:null,session:null},error:a}})}catch(t){if(fe(t))return{data:{user:null,session:null},error:t};throw t}}async resend(t){try{const n=`${this.url}/resend`;if("email"in t){const{email:r,type:a,options:i}=t,{error:s}=await Ee(this.fetch,"POST",n,{headers:this.headers,body:{email:r,type:a,gotrue_meta_security:{captcha_token:i==null?void 0:i.captchaToken}},redirectTo:i==null?void 0:i.emailRedirectTo});return{data:{user:null,session:null},error:s}}else if("phone"in t){const{phone:r,type:a,options:i}=t,{data:s,error:l}=await Ee(this.fetch,"POST",n,{headers:this.headers,body:{phone:r,type:a,gotrue_meta_security:{captcha_token:i==null?void 0:i.captchaToken}}});return{data:{user:null,session:null,messageId:s==null?void 0:s.message_id},error:l}}throw new wd("You must provide either an email or phone number and a type")}catch(n){if(fe(n))return{data:{user:null,session:null},error:n};throw n}}async getSession(){return await this.initializePromise,await this._acquireLock(-1,async()=>this._useSession(async n=>n))}async _acquireLock(t,n){this._debug("#_acquireLock","begin",t);try{if(this.lockAcquired){const r=this.pendingInLock.length?this.pendingInLock[this.pendingInLock.length-1]:Promise.resolve(),a=(async()=>(await r,await n()))();return this.pendingInLock.push((async()=>{try{await a}catch{}})()),a}return await this.lock(`lock:${this.storageKey}`,t,async()=>{this._debug("#_acquireLock","lock acquired for storage key",this.storageKey);try{this.lockAcquired=!0;const r=n();for(this.pendingInLock.push((async()=>{try{await r}catch{}})()),await r;this.pendingInLock.length;){const a=[...this.pendingInLock];await Promise.all(a),this.pendingInLock.splice(0,a.length)}return await r}finally{this._debug("#_acquireLock","lock released for storage key",this.storageKey),this.lockAcquired=!1}})}finally{this._debug("#_acquireLock","end")}}async _useSession(t){this._debug("#_useSession","begin");try{const n=await this.__loadSession();return await t(n)}finally{this._debug("#_useSession","end")}}async __loadSession(){this._debug("#__loadSession()","begin"),this.lockAcquired||this._debug("#__loadSession()","used outside of an acquired lock!",new Error().stack);try{let t=null;const n=await Na(this.storage,this.storageKey);if(this._debug("#getSession()","session from storage",n),n!==null&&(this._isValidSession(n)?t=n:(this._debug("#getSession()","session from storage is not val
537id"),await this._removeSession())),!t)return{data:{session:null},error:null};const r=t.expires_at?t.expires_at*1e3-Date.now()<Fm:!1;if(this._debug("#__loadSession()",`session has${r?"":" not"} expired`,"expires_at",t.expires_at),!r){if(this.userStorage){const s=await Na(this.userStorage,this.storageKey+"-user");s!=null&&s.user?t.user=s.user:t.user=Wm()}if(this.storage.isServer&&t.user){let s=this.suppressGetSessionWarning;t=new Proxy(t,{get:(d,c,u)=>(!s&&c==="user"&&(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."),s=!0,this.suppressGetSessionWarning=!0),Reflect.get(d,c,u))})}return{data:{session:t},error:null}}const{session:a,error:i}=await this._callRefreshToken(t.refresh_token);return i?{data:{session:null},error:i}:{data:{session:a},error:null}}finally{this._debug("#__loadSession()","end")}}async getUser(t){return t?await this._getUser(t):(await this.initializePromise,await this._acquireLock(-1,async()=>await this._getUser()))}async _getUser(t){try{return t?await Ee(this.fetch,"GET",`${this.url}/user`,{headers:this.headers,jwt:t,xform:Ur}):await this._useSession(async n=>{var r,a,i;const{data:s,error:l}=n;if(l)throw l;return!(!((r=s.session)===null||r===void 0)&&r.access_token)&&!this.hasCustomAuthorizationHeader?{data:{user:null},error:new Br}:await Ee(this.fetch,"GET",`${this.url}/user`,{headers:this.headers,jwt:(i=(a=s.session)===null||a===void 0?void 0:a.access_token)!==null&&i!==void 0?i:void 0,xform:Ur})})}catch(n){if(fe(n))return d3(n)&&(await this._removeSession(),await qr(this.storage,`${this.storageKey}-code-verifier`)),{data:{user:null},error:n};throw n}}async updateUser(t,n={}){return await this.initializePromise,await this._acquireLock(-1,async()=>await this._updateUser(t,n))}async _updateUser(t,n={}){try{return await this._useSession(async r=>{const{data:a,error:i}=r;if(i)throw i;if(!a.session)throw new Br;const s=a.session;let l=null,d=null;this.flowType==="pkce"&&t.email!=null&&([l,d]=await ji(this.storage,this.storageKey));const{data:c,error:u}=await Ee(this.fetch,"PUT",`${this.url}/user`,{headers:this.headers,redirectTo:n==null?void 0:n.emailRedirectTo,body:Object.assign(Object.assign({},t),{code_challenge:l,code_challenge_method:d}),jwt:s.access_token,xform:Ur});if(u)throw u;return s.user=c.user,await this._saveSession(s),await this._notifyAllSubscribers("USER_UPDATED",s),{data:{user:s.user},error:null}})}catch(r){if(fe(r))return{data:{user:null},error:r};throw r}}async setSession(t){return await this.initializePromise,await this._acquireLock(-1,async()=>await this._setSession(t))}async _setSession(t){try{if(!t.access_token||!t.refresh_token)throw new Br;const n=Date.now()/1e3;let r=n,a=!0,i=null;const{payload:s}=Vm(t.access_token);if(s.exp&&(r=s.exp,a=r<=n),a){const{session:l,error:d}=await this._callRefreshToken(t.refresh_token);if(d)return{data:{user:null,session:null},error:d};if(!l)return{data:{user:null,session:null},error:null};i=l}else{const{data:l,error:d}=await this._getUser(t.access_token);if(d)throw d;i={access_token:t.access_token,refresh_token:t.refresh_token,user:l.user,token_type:"bearer",expires_in:r-n,expires_at:r},await this._saveSession(i),await this._notifyAllSubscribers("SIGNED_IN",i)}return{data:{user:i.user,session:i},error:null}}catch(n){if(fe(n))return{data:{session:null,user:null},error:n};throw n}}async refreshSession(t){return await this.initializePromise,await this._acquireLock(-1,async()=>await this._refreshSession(t))}async _refreshSession(t){try{return await this._useSession(async n=>{var r;if(!t){const{data:s,error:l}=n;if(l)throw l;t=(r=s.session)!==null&&r!==void 0?r:void 0}if(!(t!=null&&t.refresh_token))throw new Br;const{session:a,error:i}=await this._callRefreshToken(t.refresh_token);return i?{data:{user:null,session:null},error:i}:a?{data:{user:a.user,session:a},error:null}:{data:{user:null,session:null},error:null}})}catch(n){if(fe(n))return{data:{user:null,session:null},error:n};throw n}}async _getSessionFromURL(t,n){try{if(!bn())throw new kd("No browser detected.");
537if(t.error||t.error_description||t.error_code)throw new kd(t.error_description||"Error in URL with unspecified error_description",{error:t.error||"unspecified_error",code:t.error_code||"unspecified_code"});switch(n){case"implicit":if(this.flowType==="pkce")throw new Ty("Not a valid PKCE flow url.");break;case"pkce":if(this.flowType==="implicit")throw new kd("Not a valid implicit grant flow url.");break;default:}if(n==="pkce"){if(this._debug("#_initialize()","begin","is PKCE flow",!0),!t.code)throw new Ty("No code detected.");const{data:v,error:y}=await this._exchangeCodeForSession(t.code);if(y)throw y;const x=new URL(window.location.href);return x.searchParams.delete("code"),window.history.replaceState(window.history.state,"",x.toString()),{data:{session:v.session,redirectType:null},error:null}}const{provider_token:r,provider_refresh_token:a,access_token:i,refresh_token:s,expires_in:l,expires_at:d,token_type:c}=t;if(!i||!l||!s||!c)throw new kd("No session defined in URL");const u=Math.round(Date.now()/1e3),m=parseInt(l);let p=u+m;d&&(p=parseInt(d));const h=p-u;h*1e3<=Di&&console.warn(`@supabase/gotrue-js: Session as retrieved from URL expires in ${h}s, should have been closer to ${m}s`);const b=p-m;u-b>=120?console.warn("@supabase/gotrue-js: Session as retrieved from URL was issued over 120s ago, URL could be stale",b,p,u):u-b<0&&console.warn("@supabase/gotrue-js: Session as retrieved from URL was issued in the future? Check the device clock for skew",b,p,u);const{data:f,error:k}=await this._getUser(i);if(k)throw k;const w={provider_token:r,provider_refresh_token:a,access_token:i,expires_in:m,expires_at:p,refresh_token:s,token_type:c,user:f.user};return window.location.hash="",this._debug("#_getSessionFromURL()","clearing window.location.hash"),{data:{session:w,redirectType:t.type},error:null}}catch(r){if(fe(r))return{data:{session:null,redirectType:null},error:r};throw r}}_isImplicitGrantCallback(t){return!!(t.access_token||t.error_description)}async _isPKCECallback(t){const n=await Na(this.storage,`${this.storageKey}-code-verifier`);return!!(t.code&&n)}async signOut(t={scope:"global"}){return await this.initializePromise,await this._acquireLock(-1,async()=>await this._signOut(t))}async _signOut({scope:t}={scope:"global"}){return await this._useSession(async n=>{var r;const{data:a,error:i}=n;if(i)return{error:i};const s=(r=a.session)===null||r===void 0?void 0:r.access_token;if(s){const{error:l}=await this.admin.signOut(s,t);if(l&&!(l3(l)&&(l.status===404||l.status===401||l.status===403)))return{error:l}}return t!=="others"&&(await this._removeSession(),await qr(this.storage,`${this.storageKey}-code-verifier`)),{error:null}})}onAuthStateChange(t){const n=y3(),r={id:n,callback:t,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,r),(async()=>(await this.initializePromise,await this._acquireLock(-1,async()=>{this._emitInitialSession(n)})))(),{data:{subscription:r}}}async _emitInitialSession(t){return await this._useSession(async n=>{var r,a;try{const{data:{session:i},error:s}=n;if(s)throw s;await((r=this.stateChangeEmitters.get(t))===null||r===void 0?void 0:r.callback("INITIAL_SESSION",i)),this._debug("INITIAL_SESSION","callback id",t,"session",i)}catch(i){await((a=this.stateChangeEmitters.get(t))===null||a===void 0?void 0:a.callback("INITIAL_SESSION",null)),this._debug("INITIAL_SESSION","callback id",t,"error",i),console.error(i)}})}async resetPasswordForEmail(t,n={}){let r=null,a=null;this.flowType==="pkce"&&([r,a]=await ji(this.storage,this.storageKey,!0));try{return await Ee(this.fetch,"POST",`${this.url}/recover`,{body:{email:t,code_challenge:r,code_challenge_method:a,gotrue_meta_security:{captcha_token:n.captchaToken}},headers:this.headers,redirectTo:n.redirectTo})}catch(i){if(fe(i))return{data:null,error:i};throw i}}async getUserIdentities(){var t;try{const{data:n,error:r}=await this.getUser();if(r)throw r;return{data:{identities:(t=n.user.identities)!==null&&t!==void 0?t:[]},error:null}}catch(n){if(fe(n))return{data:null,error:n};throw n}}async linkIdentity(t){var n;try{const{data:r,error:a}=await this._useSession(async i=>{var s,l,d,c,u;const{data:m,error:p}=i;if(p)throw p;const h=await this._getUrlForProvider(`${this.url}/user/identities/authorize`,t.provider,{redirectTo:(s=t.options)===null||s===void 0?void 0:s.redirectTo,scopes:(l=t.options)===null||l===void 0?void 0:l.scopes,queryParams:(d=t.options)===null||d===void 0?void 0:d.queryParams,skipBrowserRedirect:!0});return await Ee(this.fetch,"GET",h,{headers:this.headers,jwt:(u=(c=m.session)===null||c===void 0?void 0:c.access_token)!==null&&u!==void 0?u:void 0})});if(a)throw a;return bn()&&!(!((n=t.options)===null||n===void 0)&&n.skipBrowserRedirect)&&window.location.assign(r==null?void 0:r.url),{data:{provider:t.provider,url:r==null?void 0:r.url},error:null}}catch(r){if(fe(r))return{data:{provider:t.provider,url:null},error:r};throw r}}async unlinkIdentity(t){try{return await this._useSession(async n=>{var r,a;const{data:i,error:s}=n;if(s)throw s;
537return await Ee(this.fetch,"DELETE",`${this.url}/user/identities/${t.identity_id}`,{headers:this.headers,jwt:(a=(r=i.session)===null||r===void 0?void 0:r.access_token)!==null&&a!==void 0?a:void 0})})}catch(n){if(fe(n))return{data:null,error:n};throw n}}async _refreshAccessToken(t){const n=`#_refreshAccessToken(${t.substring(0,5)}...)`;this._debug(n,"begin");try{const r=Date.now();return await j3(async a=>(a>0&&await x3(200*Math.pow(2,a-1)),this._debug(n,"refreshing attempt",a),await Ee(this.fetch,"POST",`${this.url}/token?grant_type=refresh_token`,{body:{refresh_token:t},headers:this.headers,xform:pr})),(a,i)=>{const s=200*Math.pow(2,a);return i&&Om(i)&&Date.now()+s-r<Di})}catch(r){if(this._debug(n,"error",r),fe(r))return{data:{session:null,user:null},error:r};throw r}finally{this._debug(n,"end")}}_isValidSession(t){return typeof t=="object"&&t!==null&&"access_token"in t&&"refresh_token"in t&&"expires_at"in t}async _handleProviderSignIn(t,n){const r=await this._getUrlForProvider(`${this.url}/authorize`,t,{redirectTo:n.redirectTo,scopes:n.scopes,queryParams:n.queryParams});return this._debug("#_handleProviderSignIn()","provider",t,"options",n,"url",r),bn()&&!n.skipBrowserRedirect&&window.location.assign(r),{data:{provider:t,url:r},error:null}}async _recoverAndRefresh(){var t,n;const r="#_recoverAndRefresh()";this._debug(r,"begin");try{const a=await Na(this.storage,this.storageKey);if(a&&this.userStorage){let s=await Na(this.userStorage,this.storageKey+"-user");!this.storage.isServer&&Object.is(this.storage,this.userStorage)&&!s&&(s={user:a.user},await Ri(this.userStorage,this.storageKey+"-user",s)),a.user=(t=s==null?void 0:s.user)!==null&&t!==void 0?t:Wm()}else if(a&&!a.user&&!a.user){const s=await Na(this.storage,this.storageKey+"-user");s&&(s!=null&&s.user)?(a.user=s.user,await qr(this.storage,this.storageKey+"-user"),await Ri(this.storage,this.storageKey,a)):a.user=Wm()}if(this._debug(r,"session from storage",a),!this._isValidSession(a)){this._debug(r,"session is not valid"),a!==null&&await this._removeSession();return}const i=((n=a.expires_at)!==null&&n!==void 0?n:1/0)*1e3-Date.now()<Fm;if(this._debug(r,`session has${i?"":" not"} expired with margin of ${Fm}s`),i){if(this.autoRefreshToken&&a.refresh_token){const{error:s}=await this._callRefreshToken(a.refresh_token);s&&(console.error(s),Om(s)||(this._debug(r,"refresh failed with a non-retryable error, removing the session",s),await this._removeSession()))}}else if(a.user&&a.user.__isUserNotAvailableProxy===!0)try{const{data:s,error:l}=await this._getUser(a.access_token);!l&&(s!=null&&s.user)?(a.user=s.user,await this._saveSession(a),await this._notifyAllSubscribers("SIGNED_IN",a)):this._debug(r,"could not get user data, skipping SIGNED_IN notification")}catch(s){console.error("Error getting user data:",s),this._debug(r,"error getting user data, skipping SIGNED_IN notification",s)}else await this._notifyAllSubscribers("SIGNED_IN",a)}catch(a){this._debug(r,"error",a),console.error(a);return}finally{this._debug(r,"end")}}async _callRefreshToken(t){var n,r;if(!t)throw new Br;if(this.refreshingDeferred)return this.refreshingDeferred.promise;const a=`#_callRefreshToken(${t.substring(0,5)}...)`;this._debug(a,"begin");try{this.refreshingDeferred=new Iu;const{data:i,error:s}=await this._refreshAccessToken(t);if(s)throw s;if(!i.session)throw new Br;await this._saveSession(i.session),await this._notifyAllSubscribers("TOKEN_REFRESHED",i.session);const l={session:i.session,error:null};return this.refreshingDeferred.resolve(l),l}catch(i){if(this._debug(a,"error",i),fe(i)){const s={session:null,error:i};return Om(i)||await this._removeSession(),(n=this.refreshingDeferred)===null||n===void 0||n.resolve(s),s}throw(r=this.refreshingDeferred)===null||r===void 0||r.reject(i),i}finally{this.refreshingDeferred=null,this._debug(a,"end")}}async _notifyAllSubscribers(t,n,r=!0){const a=`#_notifyAllSubscribers(${t})`;this._debug(a,"begin",n,`broadcast = ${r}`);try{this.broadcastChannel&&r&&this.broadcastChannel.postMessage({event:t,session:n});const i=[],s=Array.from(this.stateChangeEmitters.values()).map(async l=>{try{await l.callback(t,n)}catch(d){i.push(d)}});if(await Promise.all(s),i.length>0){for(let l=0;l<i.length;l+=1)console.error(i[l]);throw i[0]}}finally{this._debug(a,"end")}}async _saveSession(t){this._debug("#_saveSession()",t),this.suppressGetSessionWarning=!0;const n=Object.assign({},t),r=n.user&&n.user.__isUserNotAvailableProxy===!0;if(this.userStorage){!r&&n.user&&await Ri(this.userStorage,this.storageKey+"-user",{user:n.user});const a=Object.assign({},n);delete a.user;const i=qy(a);await Ri(this.storage,this.storageKey,i)}else{const a=qy(n);await Ri(this.storage,this.storageKey,a)}}async _removeSession(){this._debug("#_removeSession()"),await qr(this.storage,this.storageKey),await qr(this.storage,this.storageKey+"-code-verifier"),await qr(this.storage,this.storageKey+"-user"),this.userStorage&&await qr(this.userStorage,this.storageKey+"-user"),await this._notifyAllSubscribers("SIGNED_OUT",null)}_removeVisibilityChangedCallback(){this._debug("#_removeVisibilityChangedCallback()");const t=this.visibilityChangedCallback;this.visibilityChangedCallback=null;try{t&&bn()&&(window!=null&&window.removeEventListener)&&window.removeEventListener("visibilitychange",t)}
537catch(n){console.error("removing visibilitychange callback failed",n)}}async _startAutoRefresh(){await this._stopAutoRefresh(),this._debug("#_startAutoRefresh()");const t=setInterval(()=>this._autoRefreshTokenTick(),Di);this.autoRefreshTicker=t,t&&typeof t=="object"&&typeof t.unref=="function"?t.unref():typeof Deno<"u"&&typeof Deno.unrefTimer=="function"&&Deno.unrefTimer(t),setTimeout(async()=>{await this.initializePromise,await this._autoRefreshTokenTick()},0)}async _stopAutoRefresh(){this._debug("#_stopAutoRefresh()");const t=this.autoRefreshTicker;this.autoRefreshTicker=null,t&&clearInterval(t)}async startAutoRefresh(){this._removeVisibilityChangedCallback(),await this._startAutoRefresh()}async stopAutoRefresh(){this._removeVisibilityChangedCallback(),await this._stopAutoRefresh()}async _autoRefreshTokenTick(){this._debug("#_autoRefreshTokenTick()","begin");try{await this._acquireLock(0,async()=>{try{const t=Date.now();try{return await this._useSession(async n=>{const{data:{session:r}}=n;if(!r||!r.refresh_token||!r.expires_at){this._debug("#_autoRefreshTokenTick()","no session");return}const a=Math.floor((r.expires_at*1e3-t)/Di);this._debug("#_autoRefreshTokenTick()",`access token expires in ${a} ticks, a tick lasts ${Di}ms, refresh threshold is ${Lg} ticks`),a<=Lg&&await this._callRefreshToken(r.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(t){if(t.isAcquireTimeout||t instanceof Yj)this._debug("auto refresh token tick lock not available");else throw t}}async _handleVisibilityChange(){if(this._debug("#_handleVisibilityChange()"),!bn()||!(window!=null&&window.addEventListener))return this.autoRefreshToken&&this.startAutoRefresh(),!1;try{this.visibilityChangedCallback=async()=>await this._onVisibilityChanged(!1),window==null||window.addEventListener("visibilitychange",this.visibilityChangedCallback),await this._onVisibilityChanged(!0)}catch(t){console.error("_handleVisibilityChange",t)}}async _onVisibilityChanged(t){const n=`#_onVisibilityChanged(${t})`;this._debug(n,"visibilityState",document.visibilityState),document.visibilityState==="visible"?(this.autoRefreshToken&&this._startAutoRefresh(),t||(await this.initializePromise,await this._acquireLock(-1,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()}))):document.visibilityState==="hidden"&&this.autoRefreshToken&&this._stopAutoRefresh()}async _getUrlForProvider(t,n,r){const a=[`provider=${encodeURIComponent(n)}`];if(r!=null&&r.redirectTo&&a.push(`redirect_to=${encodeURIComponent(r.redirectTo)}`),r!=null&&r.scopes&&a.push(`scopes=${encodeURIComponent(r.scopes)}`),this.flowType==="pkce"){const[i,s]=await ji(this.storage,this.storageKey),l=new URLSearchParams({code_challenge:`${encodeURIComponent(i)}`,code_challenge_method:`${encodeURIComponent(s)}`});a.push(l.toString())}if(r!=null&&r.queryParams){const i=new URLSearchParams(r.queryParams);a.push(i.toString())}return r!=null&&r.skipBrowserRedirect&&a.push(`skip_http_redirect=${r.skipBrowserRedirect}`),`${t}?${a.join("&")}`}async _unenroll(t){try{return await this._useSession(async n=>{var r;const{data:a,error:i}=n;return i?{data:null,error:i}:await Ee(this.fetch,"DELETE",`${this.url}/factors/${t.factorId}`,{headers:this.headers,jwt:(r=a==null?void 0:a.session)===null||r===void 0?void 0:r.access_token})})}catch(n){if(fe(n))return{data:null,error:n};throw n}}async _enroll(t){try{return await this._useSession(async n=>{var r,a;const{data:i,error:s}=n;if(s)return{data:null,error:s};const l=Object.assign({friendly_name:t.friendlyName,factor_type:t.factorType},t.factorType==="phone"?{phone:t.phone}:{issuer:t.issuer}),{data:d,error:c}=await Ee(this.fetch,"POST",`${this.url}/factors`,{body:l,headers:this.headers,jwt:(r=i==null?void 0:i.session)===null||r===void 0?void 0:r.access_token});return c?{data:null,error:c}:(t.factorType==="totp"&&(!((a=d==null?void 0:d.totp)===null||a===void 0)&&a.qr_code)&&(d.totp.qr_code=`data:image/svg+xml;utf-8,${d.totp.qr_code}`),{data:d,error:null})})}catch(n){if(fe(n))return{data:null,error:n};throw n}}async _verify(t){return this._acquireLock(-1,async()=>{try{return await this._useSession(async n=>{var r;const{data:a,error:i}=n;if(i)return{data:null,error:i};const{data:s,error:l}=await Ee(this.fetch,"POST",`${this.url}/factors/${t.factorId}/verify`,{body:{code:t.code,challenge_id:t.challengeId},headers:this.headers,jwt:(r=a==null?void 0:a.session)===null||r===void 0?void 0:r.access_token});return l?{data:null,error:l}:(await this._saveSession(Object.assign({expires_at:Math.round(Date.now()/1e3)+s.expires_in},s)),await this._notifyAllSubscribers("MFA_CHALLENGE_VERIFIED",s),{data:s,error:l})})}catch(n){if(fe(n))return{data:null,error:n};throw n}})}async _challenge(t){return this._acquireLock(-1,async()=>{try{return await this._useSession(async n=>{var r;const{data:a,error:i}=n;return i?{data:null,error:i}:await Ee(this.fetch,"POST",`${this.url}/factors/${t.factorId}/challenge`,{body:{channel:t.channel},headers:this.headers,jwt:(r=a==null?void 0:a.session)===null||r===void 0?void 0:r.access_token})})}catch(n){if(fe(n))return{data:null,error:n};throw n}})}async _challengeAndVerify(t){const{data:n,error:r}=await this._challenge({factorId:t.factorId});return r?{data:null,error:r}:await this._verify({factorId:t.factorId,challengeId:n.id,code:t.code})}async _listFactors(){const{data:{user:t},error:n}=await this.getUser();if(n)return{data:null,error:n};const r=(t==null?void 0:t.factors)||[],a=r.filter(s=>s.factor_type==="totp"&&s.status==="verified"),i=r.filter(s=>s.factor_type==="phone"&&s.status==="verified");return{data:{all:r,totp:a,phone:i},error:null}}async _getAuthenticatorAssuranceLevel(){return this._acquireLock(-1,async()=>await this._useSession(async t=>{var n,r;const{data:{session:a},error:i}=t;if(i)return{data:null,error:i};if(!a)return{data:{currentLevel:null,nextLevel:null,currentAuthenticationMethods:[]},error:null};const{payload:s}=Vm(a.access_token);let l=null;s.aal&&(l=s.aal);let d=l;((r=(n=a.user.factors)===null||n===void 0?void 0:n.filter(m=>m.status==="verified"))!==null&&r!==void 0?r:[]).length>0&&(d="aal2");const u=s.amr||[];return{data:{currentLevel:l,nextLevel:d,currentAuthenticationMethods:u},error:null}}))}async fetchJwk(t,n={keys:[]}){let r=n.keys.find(l=>l.kid===t);if(r)return r;const a=Date.now();if(r=this.jwks.keys.find(l=>l.kid===t),r&&this.jwks_cached_at+s3>a)return r;const{data:i,error:s}=await Ee(this.fetch,"GET",`${this.url}/.well-known/jwks.json`,{headers:this.headers});if(s)throw s;return!i.keys||i.keys.length===0||(this.jwks=i,this.jwks_cached_at=a,r=i.keys.find(l=>l.kid===t),!r)?null:r}async getClaims(t,n={}){try{let r=t;if(!r){const{data:h,error:b}
537=await this.getSession();if(b||!h.session)return{data:null,error:b};r=h.session.access_token}const{header:a,payload:i,signature:s,raw:{header:l,payload:d}}=Vm(r);n!=null&&n.allowExpired||T3(i.exp);const c=!a.alg||a.alg.startsWith("HS")||!a.kid||!("crypto"in globalThis&&"subtle"in globalThis.crypto)?null:await this.fetchJwk(a.kid,n!=null&&n.keys?{keys:n.keys}:n==null?void 0:n.jwks);if(!c){const{error:h}=await this.getUser(r);if(h)throw h;return{data:{claims:i,header:a,signature:s},error:null}}const u=D3(a.alg),m=await crypto.subtle.importKey("jwk",c,u,!0,["verify"]);if(!await crypto.subtle.verify(u,m,s,f3(`${l}.${d}`)))throw new Fg("Invalid JWT signature");return{data:{claims:i,header:a,signature:s},error:null}}catch(r){if(fe(r))return{data:null,error:r};throw r}}}dl.nextInstanceID=0;const H3=dl;class K3 extends H3{constructor(t){super(t)}}var Y3=function(e,t,n,r){function a(i){return i instanceof n?i:new n(function(s){s(i)})}return new(n||(n=Promise))(function(i,s){function l(u){try{c(r.next(u))}catch(m){s(m)}}function d(u){try{c(r.throw(u))}catch(m){s(m)}}function c(u){u.done?i(u.value):a(u.value).then(l,d)}c((r=r.apply(e,t||[])).next())})};class Z3{constructor(t,n,r){var a,i,s;this.supabaseUrl=t,this.supabaseKey=n;const l=t3(t);if(!n)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`,c={db:$q,realtime:Hq,auth:Object.assign(Object.assign({},Gq),{storageKey:d}),global:Uq},u=e3(r??{},c);this.storageKey=(a=u.auth.storageKey)!==null&&a!==void 0?a:"",this.headers=(i=u.global.headers)!==null&&i!==void 0?i:{},u.accessToken?(this.accessToken=u.accessToken,this.auth=new Proxy({},{get:(m,p)=>{throw new Error(`@supabase/supabase-js: Supabase Client is configured with the accessToken option, accessing supabase.auth.${String(p)} is not possible`)}})):this.auth=this._initSupabaseAuthClient((s=u.auth)!==null&&s!==void 0?s:{},this.headers,u.global.fetch),this.fetch=Jq(n,this._getAccessToken.bind(this),u.global.fetch),this.realtime=this._initRealtimeClient(Object.assign({headers:this.headers,accessToken:this._getAccessToken.bind(this)},u.realtime)),this.rest=new uq(new URL("rest/v1",l).href,{headers:this.headers,schema:u.db.schema,fetch:this.fetch}),this.storage=new Oq(this.storageUrl.href,this.headers,this.fetch,r==null?void 0:r.storage),u.accessToken||this._listenForAuthEvents()}get functions(){return new WI(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,n={},r={}){return this.rest.rpc(t,n,r)}channel(t,n={config:{}}){return this.realtime.channel(t,n)}getChannels(){return this.realtime.getChannels()}removeChannel(t){return this.realtime.removeChannel(t)}removeAllChannels(){return this.realtime.removeAllChannels()}_getAccessToken(){var t,n;return Y3(this,void 0,void 0,function*(){if(this.accessToken)return yield this.accessToken();const{data:r}=yield this.auth.getSession();return(n=(t=r.session)===null||t===void 0?void 0:t.access_token)!==null&&n!==void 0?n:this.supabaseKey})}_initSupabaseAuthClient({autoRefreshToken:t,persistSession:n,detectSessionInUrl:r,storage:a,userStorage:i,storageKey:s,flowType:l,lock:d,debug:c},u,m){const p={Authorization:`Bearer ${this.supabaseKey}`,apikey:`${this.supabaseKey}`};return new K3({url:this.authUrl.href,headers:Object.assign(Object.assign({},p),u),storageKey:s,autoRefreshToken:t,persistSession:n,detectSessionInUrl:r,storage:a,userStorage:i,flowType:l,lock:d,debug:c,fetch:m,hasCustomAuthorizationHeader:Object.keys(this.headers).some(h=>h.toLowerCase()==="authorization")})}_initRealtimeClient(t){return new Sq(this.realtimeUrl.href,Object.assign(Object.assign({},t),{params:Object.assign({apikey:this.supabaseKey},t==null?void 0:t.params)}))}_listenForAuthEvents(){return this.auth.onAuthStateChange((n,r)=>{this._handleTokenChanged(n,"CLIENT",r==null?void 0:r.access_token)})}_handleTokenChanged(t,n,r){(t==="TOKEN_REFRESHED"||t==="SIGNED_IN")&&this.changedAccessToken!==r?this.changedAccessToken=r:t==="SIGNED_OUT"&&(this.realtime.setAuth(),n=="STORAGE"&&this.auth.signOut(),this.changedAccessToken=void 0)}}
537const J3=(e,t,n)=>new Z3(e,t,n);function Q3(){if(typeof window<"u"||typeof process>"u")return!1;const e=process.version;if(e==null)return!1;const t=e.match(/^v(\d+)\./);return t?parseInt(t[1],10)<=18:!1}Q3()&&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 Node.js 20 or later. For more information, visit: https://github.com/orgs/supabase/discussions/37217");function X3(){var k,w;if(typeof window>"u")return;const e=location.hostname,n=["lovableproject.com","lovableproject-dev.com","lovable.app","gpt-eng.com","gptengineer.run"].some(v=>e===v||e.endsWith("."+v)),r="[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}",a=n?((k=e.match(new RegExp("^(?:id-preview(?:-[a-z0-9]+)?|project)--("+r+")(?:-dev)?(?=\\.|$)","i")))==null?void 0:k[1])??((w=e.match(new RegExp("^("+r+")(?=[.-])","i")))==null?void 0:w[1]):void 0,i=window.parent&&window.parent!==window;if(!a||!i)return localStorage;const s=e.endsWith(".lovableproject-dev.com")||e.endsWith(".gpt-eng.com"),l=s?/^https:\/\/([a-z0-9-]+\.)*(lovable\.dev|gptengineer\.app)$|^http:\/\/localhost:3000$/:/^https:\/\/([a-z0-9-]+\.)*(lovable\.dev|gptengineer\.app)$/,d=location.ancestorOrigins&&location.ancestorOrigins[0]||(document.referrer?new URL(document.referrer).origin:""),c=d&&l.test(d)?[d]:s?["https://lovable.dev","http://localhost:3000"]:["https://lovable.dev"],u="lovable-preview-auth:result",m=2e3,p=()=>Math.random().toString(36).slice(2)+Date.now().toString(36),h=(v,y,x)=>new Promise(A=>{const E=p();let j=!1,P;const S=B=>{j||(j=!0,clearTimeout(P),window.removeEventListener("message",_),A(B))},_=B=>{if(c.indexOf(B.origin)<0)return;const Q=B.data;Q&&Q.type===u&&Q.requestId===E&&S(Q)};window.addEventListener("message",_);const G={type:v,requestId:E,projectId:a,key:y};x!==void 0&&(G.value=x);for(const B of c)window.parent.postMessage(G,B);P=setTimeout(()=>S(null),m)});let b=!0;const f=250;return{getItem:async v=>{let y=await h("lovable-preview-auth:get",v);return!y&&b&&(await new Promise(x=>setTimeout(x,f)),y=await h("lovable-preview-auth:get",v)),b=!1,y&&y.ok&&typeof y.value=="string"?y.value===""?(localStorage.removeItem(v),null):y.value:localStorage.getItem(v)},setItem:(v,y)=>(localStorage.setItem(v,y),h("lovable-preview-auth:set",v,y).then(()=>{})),removeItem:v=>(localStorage.removeItem(v),h("lovable-preview-auth:remove",v).then(()=>{}))}}const Zj="https://api.arcanes.be",e5="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im1ub2N4dHVpcmVqZ2dxeWZveXlzIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTg3OTcxNDAsImV4cCI6MjA3NDM3MzE0MH0.oqpcpmw5AdYvuuwGmNsBggMOM3AaBZORGj7U1861iFg",de=J3(Zj,e5,{auth:{storage:X3(),persistSession:!0,autoRefreshToken:!0}});function t5(e){const t=e.replace(/[\.\s\-]/g,"").toUpperCase();if(!t.match(/^BE0[0-9]{9}$/))return null;const n=t.slice(2);return`BE${n.slice(0,4)}.${n.slice(4,7)}.${n.slice(7,10)}`}function n5(){const e=xt();return g.useEffect(()=>{(async()=>{var d;const r=new URLSearchParams(window.location.search).get("invitation"),a=window.location.pathname.startsWith("/pro/invitation/");if(r||a)return;const i=localStorage.getItem("pending_agent_registration");if(!i)return;const{data:{user:s}}=await de.auth.getUser();if(!s)return;const{data:l}=await de.from("agent_profiles").select("id").eq("user_id",s.id).maybeSingle();if(l){localStorage.removeItem("pending_agent_registration");return}try{const c=JSON.parse(i),u=(c.nom_complet||"").trim().split(" "),m=u[0]||null,p=u.slice(1).join(" ")||null,h=c.numero_tva?t5(c.numero_tva):null,{data:b,error:f}=await de.rpc("create_agency_with_owner",{p_user_id:s.id,p_agency_name:c.nom_agence||"Mon agence",p_vat_number:h,p_agent_first_name:m,p_agent_last_name:p,p_agent_email:s.email||null,p_agent_phone:c.telephone||null,p_plan_type:c.plan_type||null,p_expected_agent_count:c.expected_agent_count||null,p_billing_cycle:c.billing_cycle||null});if(f){console.error("create_agency_with_owner error:",f);return}const k=b,w=Array.isArray(k)?(d=k[0])==null?void 0:d.agency_id:k==null?void 0:k.agency_id;w&&await de.from("agencies").update({address_street:c.adresse_agence||null,address_city:c.ville||null,address_zip:c.code_postal||null}).eq("id",w),localStorage.removeItem("pending_agent_registration"),st.
537success("Inscription Pro finalisée ! Votre compte sera vérifié sous 24h.",{duration:6e3}),e("/pro/dashboard")}catch(c){console.error("Agent registration error:",c)}})()},[]),null}const Fy="2026-04-13",$m=({checked:e,onChange:t,children:n})=>o.jsxs("label",{className:"flex items-start gap-3 cursor-pointer group p-3 rounded-lg border border-border/50 hover:border-[#D4AF37]/40 hover:bg-[#D4AF37]/5 transition-all",children:[o.jsx("div",{onClick:()=>t(!e),className:`mt-0.5 h-5 w-5 rounded border-2 flex items-center justify-center shrink-0 transition-all ${e?"bg-[#1B2A4A] border-[#1B2A4A]":"border-gray-300 dark:border-gray-600 group-hover:border-[#D4AF37]"}`,children:e&&o.jsx(fa,{className:"h-3.5 w-3.5 text-[#D4AF37]"})}),o.jsx("span",{className:"text-sm text-muted-foreground leading-relaxed select-none",children:n})]}),it=({children:e})=>{const[t,n]=g.useState(!0),[r,a]=g.useState(!1),[i,s]=g.useState(!1),[l,d]=g.useState(!1),[c,u]=g.useState(!1),[m,p]=g.useState(!1),{t:h,language:b}=Ge();g.useEffect(()=>{(async()=>{const{data:{session:x}}=await de.auth.getSession();if(!x){n(!1);return}const{data:A}=await de.from("profiles").select("pro_terms_accepted_at, pro_terms_version").eq("id",x.user.id).maybeSingle();A!=null&&A.pro_terms_accepted_at&&(A==null?void 0:A.pro_terms_version)===Fy&&a(!0),n(!1)})()},[]);const f=async()=>{var y;console.log("handleAccept fired",{allChecked:k,checkTerms:l,checkDpa:c,checkPro:m}),s(!0);try{const{data:{session:x}}=await de.auth.getSession();if(console.log("session:",(y=x==null?void 0:x.user)==null?void 0:y.id),!x){s(!1);return}console.log("calling RPC...");const{error:A,data:E}=await de.rpc("accept_pro_terms",{p_version:Fy});console.log("RPC result:",{error:A,data:E}),A?console.error("RPC error:",A):a(!0)}catch(x){console.error("catch:",x)}s(!1)},k=l&&c&&m;if(t)return o.jsx("div",{className:"min-h-screen flex items-center justify-center bg-background",children:o.jsx(cg,{className:"h-8 w-8 animate-spin text-[#1B2A4A]"})});if(r)return o.jsx(o.Fragment,{children:e});const w={fr:{title:"Conditions Générales Agent Pro",subtitle:"Avant d'accéder au service Agent Pro, veuillez accepter les conditions suivantes.",checkTerms:"J'ai lu et j'accepte les",termsLink:"Conditions Générales du Service Agent Pro",checkTermsSuffix:"",checkDpa:"J'ai lu et j'accepte l'",dpaLink:"Accord de Sous-Traitance des Données (DPA)",checkDpaSuffix:"",checkPro:"Je confirme agir en qualité de professionnel de l'immobilier (agent immobilier agréé IPI, promoteur, gestionnaire de patrimoine ou agence immobilière) et ne pas bénéficier de la protection accordée aux consommateurs par le Livre VI du Code de droit économique.",button:"Accéder au service Agent Pro",note:"Ces conditions sont conformes au droit belge (Code de droit économique) et au RGPD.",contact:"En cas de question, contactez"},nl:{title:"Algemene Voorwaarden Agent Pro",subtitle:"Voordat u toegang krijgt tot de Agent Pro dienst, gelieve de volgende voorwaarden te aanvaarden.",checkTerms:"Ik heb de",termsLink:"Algemene Voorwaarden van de Agent Pro Dienst",checkTermsSuffix:" gelezen en aanvaard",checkDpa:"Ik heb de",dpaLink:"Verwerkingsovereenkomst (DPA)",checkDpaSuffix:" gelezen en aanvaard",checkPro:"Ik bevestig te handelen als vastgoedprofessional (erkend BIV-makelaar, promotor, vermogensbeheerder of vastgoedkantoor) en geen aanspraak te maken op de consumentenbescherming van Boek VI van het Wetboek van Economisch Recht.",button:"Toegang tot de Agent Pro dienst",note:"Deze voorwaarden zijn in overeenstemming met het Belgisch recht (Wetboek van Economisch Recht) en de AVG.",contact:"Bij vragen, contacteer"},en:{title:"Agent Pro Terms of Service",subtitle:"Before accessing the Agent Pro service, please accept the following terms.",checkTerms:"I have read and accept the",termsLink:"Agent Pro Terms of Service",checkTermsSuffix:"",checkDpa:"I have read and accept the",dpaLink:"Data Processing Agreement (DPA)",checkDpaSuffix:"",checkPro:"I confirm that I am acting as a real estate professional (licensed IPI agent, developer, asset manager, or real estate agency) and that consumer protection provisions do not apply to me.",button:"Access Agent Pro",note:"The
537se terms comply with Belgian law and the GDPR.",contact:"For questions, contact"}},v=w[b]||w.fr;return o.jsx("div",{className:"min-h-screen bg-gradient-to-b from-[#1B2A4A]/5 to-background",children:o.jsxs("div",{className:"w-full max-w-xl mx-auto px-4 pt-16 md:pt-24 pb-12",children:[o.jsxs("div",{className:"text-center mb-10",children:[o.jsxs("div",{className:"inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-[#1B2A4A] text-[#D4AF37] text-xs font-semibold tracking-wide border border-[#D4AF37]/20 mb-6",children:[o.jsx(Xo,{className:"h-3.5 w-3.5"}),"Agent Pro"]}),o.jsx("h1",{className:"text-2xl md:text-3xl font-extrabold text-[#1B2A4A] dark:text-foreground tracking-tight",children:v.title}),o.jsx("p",{className:"text-muted-foreground mt-3 text-sm max-w-md mx-auto leading-relaxed",children:v.subtitle})]}),o.jsxs("div",{className:"bg-card border border-border rounded-2xl overflow-hidden shadow-lg shadow-[#1B2A4A]/5",children:[o.jsx("div",{className:"h-1 bg-gradient-to-r from-[#D4AF37] via-[#D4AF37]/60 to-transparent"}),o.jsxs("div",{className:"p-6 md:p-8 space-y-4",children:[o.jsxs($m,{checked:l,onChange:d,children:[v.checkTerms," ",o.jsxs("a",{href:"/pro/terms",target:"_blank",rel:"noopener noreferrer",className:"text-[#1B2A4A] dark:text-primary hover:text-[#D4AF37] underline underline-offset-2 inline-flex items-center gap-1 font-medium transition-colors",children:[v.termsLink,o.jsx(jc,{className:"h-3 w-3"})]}),v.checkTermsSuffix]}),o.jsxs($m,{checked:c,onChange:u,children:[v.checkDpa," ",o.jsxs("a",{href:"/pro/dpa",target:"_blank",rel:"noopener noreferrer",className:"text-[#1B2A4A] dark:text-primary hover:text-[#D4AF37] underline underline-offset-2 inline-flex items-center gap-1 font-medium transition-colors",children:[v.dpaLink,o.jsx(jc,{className:"h-3 w-3"})]}),v.checkDpaSuffix]}),o.jsx($m,{checked:m,onChange:p,children:v.checkPro})]}),o.jsx("div",{className:"px-6 md:px-8 pb-6 md:pb-8 pt-2",children:o.jsx("button",{onClick:f,disabled:!k||i,className:`w-full py-3.5 px-4 rounded-xl font-semibold text-sm transition-all duration-200 ${k&&!i?"bg-[#1B2A4A] text-[#D4AF37] hover:bg-[#1B2A4A]/90 hover:shadow-md hover:shadow-[#1B2A4A]/20 cursor-pointer active:scale-[0.98]":"bg-muted text-muted-foreground/50 cursor-not-allowed"}`,children:i?o.jsx("span",{className:"flex items-center justify-center gap-2",children:o.jsx(cg,{className:"h-4 w-4 animate-spin"})}):o.jsxs("span",{className:"flex items-center justify-center gap-2",children:[o.jsx(Xo,{className:"h-4 w-4"}),v.button]})})})]}),o.jsxs("p",{className:"text-xs text-muted-foreground/70 text-center mt-6 leading-relaxed",children:[v.note," ",v.contact," ",o.jsx("a",{href:"mailto:[email protected]",className:"underline hover:text-[#D4AF37] transition-colors",children:"[email protected]"})]})]})})};function r5(){const[e,t]=g.useState(null),[n,r]=g.useState(!1),[a,i]=g.useState(!1),s=g.useRef(!1),l=g.useCallback(async u=>{if(!s.current){s.current=!0,i(!0);try{const{data:m,error:p}=await de.from("feature_updates").select("*").eq("is_active",!0).or("expires_at.is.null,expires_at.gt.now()").order("published_at",{ascending:!1});if(p){console.error("Error fetching feature updates:",p);return}if(!m||m.length===0)return;const{data:h,error:b}=await de.from("user_seen_updates").select("update_id").eq("user_id",u);if(b){console.error("Error fetching seen updates:",b);return}const f=new Set((h==null?void 0:h.map(w=>w.update_id))||[]),k=m.find(w=>!f.has(w.id));if(k){const w=Array.isArray(k.features)?k.features:[],v=Array.isArray(k.action_buttons)?k.action_buttons:[];t({...k,features:w,action_buttons:v,banner_image_url:k.banner_image_url,video_url:k.video_url,video_type:k.video_type}),r(!0),await de.from("feature_updates").update({view_count:(k.view_count||0)+1}).eq("id",k.id)}}catch(m){console.error("Error checking for feature updates:",m)}finally{s.current=!1,i(!1)}}},[]),d=g.useCallback(async()=>{if(e)try{const{data:{user:u}}=await de.auth.getUser();if(!u)return;const{error:m}=await de.from("user_seen_updates").insert({user_id:u.id,update_id:e.id});m&&(m.message.includes("duplicate")||console.error("Error marking update as seen:",m))}catch(u){console.error("Error marking update as seen:",u)}finally{r(!1),t(null)}},[e]),c=g.useCallback(()=>{d()},[d]);return{unseenUpdate:e,isDialogOpen:n,checkForUpdates:l,closeDialog:c,isLoading:a}}var Gm="focusScope.autoFocusOnMount",Hm="focusScope.autoFocusOnUnmount",Oy={bubbles:!1,cancelable:!0},a5="FocusScope",qu=g.forwardRef((e,t)=>
537{const{loop:n=!1,trapped:r=!1,onMountAutoFocus:a,onUnmountAutoFocus:i,...s}=e,[l,d]=g.useState(null),c=ct(a),u=ct(i),m=g.useRef(null),p=Re(t,f=>d(f)),h=g.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;g.useEffect(()=>{if(r){let f=function(y){if(h.paused||!l)return;const x=y.target;l.contains(x)?m.current=x:Mr(m.current,{select:!0})},k=function(y){if(h.paused||!l)return;const x=y.relatedTarget;x!==null&&(l.contains(x)||Mr(m.current,{select:!0}))},w=function(y){if(document.activeElement===document.body)for(const A of y)A.removedNodes.length>0&&Mr(l)};document.addEventListener("focusin",f),document.addEventListener("focusout",k);const v=new MutationObserver(w);return l&&v.observe(l,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",f),document.removeEventListener("focusout",k),v.disconnect()}}},[r,l,h.paused]),g.useEffect(()=>{if(l){Wy.add(h);const f=document.activeElement;if(!l.contains(f)){const w=new CustomEvent(Gm,Oy);l.addEventListener(Gm,c),l.dispatchEvent(w),w.defaultPrevented||(i5(c5(Jj(l)),{select:!0}),document.activeElement===f&&Mr(l))}return()=>{l.removeEventListener(Gm,c),setTimeout(()=>{const w=new CustomEvent(Hm,Oy);l.addEventListener(Hm,u),l.dispatchEvent(w),w.defaultPrevented||Mr(f??document.body,{select:!0}),l.removeEventListener(Hm,u),Wy.remove(h)},0)}}},[l,c,u,h]);const b=g.useCallback(f=>{if(!n&&!r||h.paused)return;const k=f.key==="Tab"&&!f.altKey&&!f.ctrlKey&&!f.metaKey,w=document.activeElement;if(k&&w){const v=f.currentTarget,[y,x]=s5(v);y&&x?!f.shiftKey&&w===x?(f.preventDefault(),n&&Mr(y,{select:!0})):f.shiftKey&&w===y&&(f.preventDefault(),n&&Mr(x,{select:!0})):w===v&&f.preventDefault()}},[n,r,h.paused]);return o.jsx(be.div,{tabIndex:-1,...s,ref:p,onKeyDown:b})});qu.displayName=a5;function i5(e,{select:t=!1}={}){const n=document.activeElement;for(const r of e)if(Mr(r,{select:t}),document.activeElement!==n)return}function s5(e){const t=Jj(e),n=Vy(t,e),r=Vy(t.reverse(),e);return[n,r]}function Jj(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:r=>{const a=r.tagName==="INPUT"&&r.type==="hidden";return r.disabled||r.hidden||a?NodeFilter.FILTER_SKIP:r.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t}function Vy(e,t){for(const n of e)if(!o5(n,{upTo:t}))return n}function o5(e,{upTo:t}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function l5(e){return e instanceof HTMLInputElement&&"select"in e}function Mr(e,{select:t=!1}={}){if(e&&e.focus){const n=document.activeElement;e.focus({preventScroll:!0}),e!==n&&l5(e)&&t&&e.select()}}var Wy=d5();function d5(){let e=[];return{add(t){const n=e[0];t!==n&&(n==null||n.pause()),e=Uy(e,t),e.unshift(t)},remove(t){var n;e=Uy(e,t),(n=e[0])==null||n.resume()}}}function Uy(e,t){const n=[...e],r=n.indexOf(t);return r!==-1&&n.splice(r,1),n}function c5(e){return e.filter(t=>t.tagName!=="A")}var Km=0;function Gf(){g.useEffect(()=>{const e=document.querySelectorAll("[data-radix-focus-guard]");return document.body.insertAdjacentElement("afterbegin",e[0]??$y()),document.body.insertAdjacentElement("beforeend",e[1]??$y()),Km++,()=>{Km===1&&document.querySelectorAll("[data-radix-focus-guard]").forEach(t=>t.remove()),Km--}},[])}function $y(){const e=document.createElement("span");return e.setAttribute("data-radix-focus-guard",""),e.tabIndex=0,e.style.outline="none",e.style.opacity="0",e.style.position="fixed",e.style.pointerEvents="none",e}var Jn=function(){return Jn=Object.assign||function(t){for(var n,r=1,a=arguments.length;r<a;r++){n=arguments[r];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t},Jn.apply(this,arguments)};function Qj(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var a=0,r=Object.getOwnPropertySymbols(e);a<r.length;a++)t.indexOf(r[a])<0&&Object.prototype.propertyIsEnumerable.call(e,r[a])&&(n[r[a]]=e[r[a]]);return n}function u5(e,t,n){if(n||arguments.length===2)for(var r=0,a=t.length,i;r<a;r++)(i||!(r in t))&&(i||(i=Array.prototype.slice.call(t,0,r)),i[r]=t[r]);return e.concat(i||Array.prototype.slice.call(t))}var Kd="right-scroll-bar-position",Yd="width-before-scroll-bar",m5="with-scroll-bars-hidden",p5="--removed-body-scroll-bar-size";function Ym(e,t){return typeof e=="function"?e(t):e&&(e.current=t),e}function g5(e,t){var n=g.useState(function(){return{value:e,callback:t,facade:{get current(){return n.value},set current(r){var a=n.value;a!==r&&(n.value=r,n.callback(r,a))}}}})[0];return n.callback=t,n.facade}var h5=typeof window<"u"?g.useLayoutEffect:g.useEffect,Gy=new WeakMap;function f5(e,t){var n=g5(null,function(r){return e.forEach(function(a){return Ym(a,r)})});return h5(function(){var r=Gy.get(n);if(r){var a=new Set(r),i=new Set(e),s=n.current;a.forEach(function(l){i.has(l)||Ym(l,null)}
vendor: 4,112 bytes, lines 537-552
537),i.forEach(function(l){a.has(l)||Ym(l,s)})}Gy.set(n,e)},[e]),n}function v5(e){return e}function b5(e,t){t===void 0&&(t=v5);var n=[],r=!1,a={read:function(){if(r)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]:e},useMedium:function(i){var s=t(i,r);return n.push(s),function(){n=n.filter(function(l){return l!==s})}},assignSyncMedium:function(i){for(r=!0;n.length;){var s=n;n=[],s.forEach(i)}n={push:function(l){return i(l)},filter:function(){return n}}},assignMedium:function(i){r=!0;var s=[];if(n.length){var l=n;n=[],l.forEach(i),s=n}var d=function(){var u=s;s=[],u.forEach(i)},c=function(){return Promise.resolve().then(d)};c(),n={push:function(u){s.push(u),c()},filter:function(u){return s=s.filter(u),n}}}};return a}function y5(e){e===void 0&&(e={});var t=b5(null);return t.options=Jn({async:!0,ssr:!1},e),t}var Xj=function(e){var t=e.sideCar,n=Qj(e,["sideCar"]);if(!t)throw new Error("Sidecar: please provide `sideCar` property to import the right car");var r=t.read();if(!r)throw new Error("Sidecar medium not found");return g.createElement(r,Jn({},n))};Xj.isSideCarExport=!0;function w5(e,t){return e.useMedium(t),Xj}var e2=y5(),Zm=function(){},Nu=g.forwardRef(function(e,t){var n=g.useRef(null),r=g.useState({onScrollCapture:Zm,onWheelCapture:Zm,onTouchMoveCapture:Zm}),a=r[0],i=r[1],s=e.forwardProps,l=e.children,d=e.className,c=e.removeScrollBar,u=e.enabled,m=e.shards,p=e.sideCar,h=e.noIsolation,b=e.inert,f=e.allowPinchZoom,k=e.as,w=k===void 0?"div":k,v=e.gapMode,y=Qj(e,["forwardProps","children","className","removeScrollBar","enabled","shards","sideCar","noIsolation","inert","allowPinchZoom","as","gapMode"]),x=p,A=f5([n,t]),E=Jn(Jn({},y),a);return g.createElement(g.Fragment,null,u&&g.createElement(x,{sideCar:e2,removeScrollBar:c,shards:m,noIsolation:h,inert:b,setCallbacks:i,allowPinchZoom:!!f,lockRef:n,gapMode:v}),s?g.cloneElement(g.Children.only(l),Jn(Jn({},E),{ref:A})):g.createElement(w,Jn({},E,{className:d,ref:A}),l))});Nu.defaultProps={enabled:!0,removeScrollBar:!0,inert:!1};Nu.classNames={fullWidth:Yd,zeroRight:Kd};var k5=function(){if(typeof __webpack_nonce__<"u")return __webpack_nonce__};function x5(){if(!document)return null;var e=document.createElement("style");e.type="text/css";var t=k5();return t&&e.setAttribute("nonce",t),e}function j5(e,t){e.styleSheet?e.styleSheet.cssText=t:e.appendChild(document.createTextNode(t))}function A5(e){var t=document.head||document.getElementsByTagName("head")[0];t.appendChild(e)}var E5=function(){var e=0,t=null;return{add:function(n){e==0&&(t=x5())&&(j5(t,n),A5(t)),e++},remove:function(){e--,!e&&t&&(t.parentNode&&t.parentNode.removeChild(t),t=null)}}},P5=function(){var e=E5();return function(t,n){g.useEffect(function(){return e.add(t),function(){e.remove()}},[t&&n])}},t2=function(){var e=P5(),t=function(n){var r=n.styles,a=n.dynamic;return e(r,a),null};return t},C5={left:0,top:0,right:0,gap:0},Jm=function(e){return parseInt(e||"",10)||0},S5=function(e){var t=window.getComputedStyle(document.body),n=t[e==="padding"?"paddingLeft":"marginLeft"],r=t[e==="padding"?"paddingTop":"marginTop"],a=t[e==="padding"?"paddingRight":"marginRight"];return[Jm(n),Jm(r),Jm(a)]},_5=function(e){if(e===void 0&&(e="margin"),typeof window>"u")return C5;var t=S5(e),n=document.documentElement.clientWidth,r=window.innerWidth;return{left:t[0],top:t[1],right:t[2],gap:Math.max(0,r-n+t[2]-t[0])}},T5=t2(),ss="data-scroll-locked",D5=function(e,t,n,r){var a=e.left,i=e.top,s=e.right,l=e.gap;return n===void 0&&(n="margin"),` 538 .`.concat(m5,` { 539 overflow: hidden `).concat(r,`; 540 padding-right: `).concat(l,"px ").concat(r,`; 541 } 542 body[`).concat(ss,`] { 543 overflow: hidden `).concat(r,`; 544 overscroll-behavior: contain; 545 `).concat([t&&"position: relative ".concat(r,";"),n==="margin"&&` 546 padding-left: `.concat(a,`px; 547 padding-top: `).concat(i,`px; 548 padding-right: `).concat(s,`px; 549 margin-left:0; 550 margin-top:0; 551 margin-right: `).concat(l,"px ").concat(r,`; 552 `),n==="padding"&&"padding-right: ".concat(l,"px ").concat(r,";
552")].filter(Boolean).join(""),` 553 } 554 555 .`).concat(Kd,` { 556 right: `).concat(l,"px ").concat(r,`; 557 } 558 559 .`).concat(Yd,` { 560 margin-right: `).concat(l,"px ").concat(r,`; 561 } 562 563 .`).concat(Kd," .").concat(Kd,` { 564 right: 0 `).concat(r,`; 565 } 566 567 .`).concat(Yd," .").concat(Yd,` { 568 margin-right: 0 `).concat(r,`; 569 } 570 571 body[`).concat(ss,`] { 572 `).concat(p5,": ").concat(l,`px; 573 } 574`)},Hy=function(){var e=parseInt(document.body.getAttribute(ss)||"0",10);return isFinite(e)?e:0},R5=function(){g.useEffect(function(){return document.body.setAttribute(ss,(Hy()+1).toString()),function(){var e=Hy()-1;e<=0?document.body.removeAttribute(ss):document.body.setAttribute(ss,e.toString())}},[])},z5=function(e){var t=e.noRelative,n=e.noImportant,r=e.gapMode,a=r===void 0?"margin":r;R5();var i=g.useMemo(function(){return _5(a)},[a]);return g.createElement(T5,{styles:D5(i,!t,a,n?"":"!important")})},Og=!1;if(typeof window<"u")try{var xd=Object.defineProperty({},"passive",{get:function(){return Og=!0,!0}});window.addEventListener("test",xd,xd),window.removeEventListener("test",xd,xd)}catch{Og=!1}var Ci=Og?{passive:!1}:!1,I5=function(e){return e.tagName==="TEXTAREA"},n2=function(e,t){if(!(e instanceof Element))return!1;var n=window.getComputedStyle(e);return n[t]!=="hidden"&&!(n.overflowY===n.overflowX&&!I5(e)&&n[t]==="visible")},q5=function(e){return n2(e,"overflowY")},N5=function(e){return n2(e,"overflowX")},Ky=function(e,t){var n=t.ownerDocument,r=t;do{typeof ShadowRoot<"u"&&r instanceof ShadowRoot&&(r=r.host);var a=r2(e,r);if(a){var i=a2(e,r),s=i[1],l=i[2];if(s>l)return!0}r=r.parentNode}while(r&&r!==n.body);return!1},L5=function(e){var t=e.scrollTop,n=e.scrollHeight,r=e.clientHeight;return[t,n,r]},B5=function(e){var t=e.scrollLeft,n=e.scrollWidth,r=e.clientWidth;return[t,n,r]},r2=function(e,t){return e==="v"?q5(t):N5(t)},a2=function(e,t){return e==="v"?L5(t):B5(t)},M5=function(e,t){return e==="h"&&t==="rtl"?-1:1},F5=function(e,t,n,r,a){var i=M5(e,window.getComputedStyle(t).direction),s=i*r,l=n.target,d=t.contains(l),c=!1,u=s>0,m=0,p=0;do{var h=a2(e,l),b=h[0],f=h[1],k=h[2],w=f-k-i*b;(b||w)&&r2(e,l)&&(m+=w,p+=b),l instanceof ShadowRoot?l=l.host:l=l.parentNode}while(!d&&l!==document.body||d&&(t.contains(l)||t===l));return(u&&(Math.abs(m)<1||!a)||!u&&(Math.abs(p)<1||!a))&&(c=!0),c},jd=function(e){return"changedTouches"in e?[e.changedTouches[0].clientX,e.changedTouches[0].clientY]:[0,0]},Yy=function(e){return[e.deltaX,e.deltaY]},Zy=function(e){return e&&"current"in e?e.current:e},O5=function(e,t){return e[0]===t[0]&&e[1]===t[1]},V5=function(e){return` 575 .block-interactivity-`.concat(e,` {pointer-events: none;} 576 .allow-interactivity-`).concat(e,` {pointer-events: all;} 577`)},W5=0,Si=[];function U5(e){var t=g.useRef([]),n=g.useRef([0,0]),r=g.useRef(),a=g.useState(W5++)[0],i=g.useState(t2)[0],s=g.useRef(e);g.useEffect(function(){s.current=e},[e]),g.useEffect(function(){if(e.inert){document.body.classList.add("block-interactivity-".concat(a));var f=u5([e.lockRef.current],(e.shards||[]).map(Zy),!0).filter(Boolean);return f.forEach(function(k){return k.classList.add("allow-interactivity-".concat(a))}),function(){document.body.classList.remove("block-interactivity-".concat(a)),f.forEach(function(k){return k.classList.remove("allow-interactivity-".concat(a))})}}},[e.inert,e.lockRef.current,e.shards]);var l=g.useCallback(function(f,k){if("touches"in f&&f.touches.length===2||f.type==="wheel"&&f.ctrlKey)return!s.current.allowPinchZoom;var w=jd(f),v=n.current,y="deltaX"in f?f.deltaX:v[0]-w[0],x="deltaY"in f?f.deltaY:v[1]-w[1],A,E=f.target,j=Math.abs(y)>Math.abs(x)?"h":"v";if("touches"in f&&j==="h"&&E.type==="range")return!1;var P=Ky(j,E);if(!P)return!0;if(P?A=j:(A=j==="v"?"h":"v",P=Ky(j,E)),!P)return!1;if(!r.current&&"changedTouches"in f&&(y||x)&&(r.current=A),!A)return!0;var S=r.current||A;return F5(S,k,f,S==="h"?y:x,!0)},[]),d=g.useCallback(function(f){var k=f;if(!(!Si.length||Si[Si.length-1]!==i)){var w="deltaY"in k?Yy(k):jd(k),v=t.current.filter(function(A){return A.name===k.type&&(A.target===k.target||k.target===A.shadowParent)&&O5(A.delta,w)})[0];if(v&&v.should){k.cancelable&&k.preventDefault();return}
vendor: 4,262 bytes, line 577
577if(!v){var y=(s.current.shards||[]).map(Zy).filter(Boolean).filter(function(A){return A.contains(k.target)}),x=y.length>0?l(k,y[0]):!s.current.noIsolation;x&&k.cancelable&&k.preventDefault()}}},[]),c=g.useCallback(function(f,k,w,v){var y={name:f,delta:k,target:w,should:v,shadowParent:$5(w)};t.current.push(y),setTimeout(function(){t.current=t.current.filter(function(x){return x!==y})},1)},[]),u=g.useCallback(function(f){n.current=jd(f),r.current=void 0},[]),m=g.useCallback(function(f){c(f.type,Yy(f),f.target,l(f,e.lockRef.current))},[]),p=g.useCallback(function(f){c(f.type,jd(f),f.target,l(f,e.lockRef.current))},[]);g.useEffect(function(){return Si.push(i),e.setCallbacks({onScrollCapture:m,onWheelCapture:m,onTouchMoveCapture:p}),document.addEventListener("wheel",d,Ci),document.addEventListener("touchmove",d,Ci),document.addEventListener("touchstart",u,Ci),function(){Si=Si.filter(function(f){return f!==i}),document.removeEventListener("wheel",d,Ci),document.removeEventListener("touchmove",d,Ci),document.removeEventListener("touchstart",u,Ci)}},[]);var h=e.removeScrollBar,b=e.inert;return g.createElement(g.Fragment,null,b?g.createElement(i,{styles:V5(a)}):null,h?g.createElement(z5,{gapMode:e.gapMode}):null)}function $5(e){for(var t=null;e!==null;)e instanceof ShadowRoot&&(t=e.host,e=e.host),e=e.parentNode;return t}const G5=w5(e2,U5);var Lu=g.forwardRef(function(e,t){return g.createElement(Nu,Jn({},e,{ref:t,sideCar:G5}))});Lu.classNames=Nu.classNames;var H5=function(e){if(typeof document>"u")return null;var t=Array.isArray(e)?e[0]:e;return t.ownerDocument.body},_i=new WeakMap,Ad=new WeakMap,Ed={},Qm=0,i2=function(e){return e&&(e.host||i2(e.parentNode))},K5=function(e,t){return t.map(function(n){if(e.contains(n))return n;var r=i2(n);return r&&e.contains(r)?r:(console.error("aria-hidden",n,"in not contained inside",e,". Doing nothing"),null)}).filter(function(n){return!!n})},Y5=function(e,t,n,r){var a=K5(t,Array.isArray(e)?e:[e]);Ed[n]||(Ed[n]=new WeakMap);var i=Ed[n],s=[],l=new Set,d=new Set(a),c=function(m){!m||l.has(m)||(l.add(m),c(m.parentNode))};a.forEach(c);var u=function(m){!m||d.has(m)||Array.prototype.forEach.call(m.children,function(p){if(l.has(p))u(p);else try{var h=p.getAttribute(r),b=h!==null&&h!=="false",f=(_i.get(p)||0)+1,k=(i.get(p)||0)+1;_i.set(p,f),i.set(p,k),s.push(p),f===1&&b&&Ad.set(p,!0),k===1&&p.setAttribute(n,"true"),b||p.setAttribute(r,"true")}catch(w){console.error("aria-hidden: cannot operate on ",p,w)}})};return u(t),l.clear(),Qm++,function(){s.forEach(function(m){var p=_i.get(m)-1,h=i.get(m)-1;_i.set(m,p),i.set(m,h),p||(Ad.has(m)||m.removeAttribute(r),Ad.delete(m)),h||m.removeAttribute(n)}),Qm--,Qm||(_i=new WeakMap,_i=new WeakMap,Ad=new WeakMap,Ed={})}},Hf=function(e,t,n){n===void 0&&(n="data-aria-hidden");var r=Array.from(Array.isArray(e)?e:[e]),a=H5(e);return a?(r.push.apply(r,Array.from(a.querySelectorAll("[aria-live]"))),Y5(r,a,n,"aria-hidden")):function(){return null}},Kf="Dialog",[s2,vU]=Fs(Kf),[Z5,Bn]=s2(Kf),o2=e=>{const{__scopeDialog:t,children:n,open:r,defaultOpen:a,onOpenChange:i,modal:s=!0}=e,l=g.useRef(null),d=g.useRef(null),[c=!1,u]=Es({prop:r,defaultProp:a,onChange:i});return o.jsx(Z5,{scope:t,triggerRef:l,contentRef:d,contentId:ca(),titleId:ca(),descriptionId:ca(),open:c,onOpenChange:u,onOpenToggle:g.useCallback(()=>u(m=>!m),[u]),modal:s,children:n})};o2.displayName=Kf;var l2="DialogTrigger",d2=g.forwardRef((e,t)=>{const{__scopeDialog:n,...r}=e,a=Bn(l2,n),i=Re(t,a.triggerRef);return o.jsx(be.button,{type:"button","aria-haspopup":"dialog","aria-expanded":a.open,"aria-controls":a.contentId,"data-state":Jf(a.open),...r,ref:i,onClick:ce(e.onClick,a.onOpenToggle)})});d2.displayName=l2;var Yf="DialogPortal",[J5,c2]=s2(Yf,{forceMount:void 0}),u2=e=>{const{__scopeDialog:t,forceMount:n,children:r,container:a}=e,i=Bn(Yf,t);return o.jsx(J5,{scope:t,forceMount:n,children:g.Children.map(r,s=>o.jsx(gn,{present:n||i.open,children:o.jsx(zl,{asChild:!0,container:a,children:s})}))})};u2.displayName=Yf;var Lc="DialogOverlay",m2=g.forwardRef((e,t)=>{const n=c2(Lc,e.__scopeDialog),{forceMount:r=n.forceMount,...a}=e,i=Bn(Lc,e.__scopeDialog);return i.modal?o.jsx(gn,{present:r||i.open,children:o.jsx(Q5,{...a,ref:t})}):null});m2.displayName=Lc;var Q5=g.forwardRef((e,t)=>
577{const{__scopeDialog:n,...r}=e,a=Bn(Lc,n);return o.jsx(Lu,{as:ha,allowPinchZoom:!0,shards:[a.contentRef],children:o.jsx(be.div,{"data-state":Jf(a.open),...r,ref:t,style:{pointerEvents:"auto",...r.style}})})}),oi="DialogContent",p2=g.forwardRef((e,t)=>{const n=c2(oi,e.__scopeDialog),{forceMount:r=n.forceMount,...a}=e,i=Bn(oi,e.__scopeDialog);return o.jsx(gn,{present:r||i.open,children:i.modal?o.jsx(X5,{...a,ref:t}):o.jsx(eN,{...a,ref:t})})});p2.displayName=oi;var X5=g.forwardRef((e,t)=>{const n=Bn(oi,e.__scopeDialog),r=g.useRef(null),a=Re(t,n.contentRef,r);return g.useEffect(()=>{const i=r.current;if(i)return Hf(i)},[]),o.jsx(g2,{...e,ref:a,trapFocus:n.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:ce(e.onCloseAutoFocus,i=>{var s;i.preventDefault(),(s=n.triggerRef.current)==null||s.focus()}),onPointerDownOutside:ce(e.onPointerDownOutside,i=>{const s=i.detail.originalEvent,l=s.button===0&&s.ctrlKey===!0;(s.button===2||l)&&i.preventDefault()}),onFocusOutside:ce(e.onFocusOutside,i=>i.preventDefault())})}),eN=g.forwardRef((e,t)=>{const n=Bn(oi,e.__scopeDialog),r=g.useRef(!1),a=g.useRef(!1);return o.jsx(g2,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:i=>{var s,l;(s=e.onCloseAutoFocus)==null||s.call(e,i),i.defaultPrevented||(r.current||(l=n.triggerRef.current)==null||l.focus(),i.preventDefault()),r.current=!1,a.current=!1},onInteractOutside:i=>{var d,c;(d=e.onInteractOutside)==null||d.call(e,i),i.defaultPrevented||(r.current=!0,i.detail.originalEvent.type==="pointerdown"&&(a.current=!0));const s=i.target;((c=n.triggerRef.current)==null?void 0:c.contains(s))&&i.preventDefault(),i.detail.originalEvent.type==="focusin"&&a.current&&i.preventDefault()}})}),g2=g.forwardRef((e,t)=>{const{__scopeDialog:n,trapFocus:r,onOpenAutoFocus:a,onCloseAutoFocus:i,...s}=e,l=Bn(oi,n),d=g.useRef(null),c=Re(t,d);return Gf(),o.jsxs(o.Fragment,{children:[o.jsx(qu,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:a,onUnmountAutoFocus:i,children:o.jsx(Os,{role:"dialog",id:l.contentId,"aria-describedby":l.descriptionId,"aria-labelledby":l.titleId,"data-state":Jf(l.open),...s,ref:c,onDismiss:()=>l.onOpenChange(!1)})}),o.jsxs(o.Fragment,{children:[o.jsx(tN,{titleId:l.titleId}),o.jsx(rN,{contentRef:d,descriptionId:l.descriptionId})]})]})}),Zf="DialogTitle",h2=g.forwardRef((e,t)=>{const{__scopeDialog:n,...r}=e,a=Bn(Zf,n);return o.jsx(be.h2,{id:a.titleId,...r,ref:t})});h2.displayName=Zf;var f2="DialogDescription",v2=g.forwardRef((e,t)=>{const{__scopeDialog:n,...r}=e,a=Bn(f2,n);return o.jsx(be.p,{id:a.descriptionId,...r,ref:t})});v2.displayName=f2;var b2="DialogClose",y2=g.forwardRef((e,t)=>{const{__scopeDialog:n,...r}=e,a=Bn(b2,n);return o.jsx(be.button,{type:"button",...r,ref:t,onClick:ce(e.onClick,()=>a.onOpenChange(!1))})});y2.displayName=b2;function Jf(e){return e?"open":"closed"}var w2="DialogTitleWarning",[bU,k2]=zS(w2,{contentName:oi,titleName:Zf,docsSlug:"dialog"}),tN=({titleId:e})=>{const t=k2(w2),n=`\`${t.contentName}\` requires a \`${t.titleName}\` for the component to be accessible for screen reader users. 578 579If you want to hide the \`${t.titleName}\`, you can wrap it with our VisuallyHidden component. 580 581For more information, see https://radix-ui.com/primitives/docs/components/${t.docsSlug}`;return g.useEffect(()=>{e&&(document.getElementById(e)||console.error(n))},[n,e]),null},nN="DialogDescriptionWarning",rN=({contentRef:e,descriptionId:t})=>{const r=`Warning: Missing \`Description\` or \`aria-describedby={undefined}\` for {${k2(nN).contentName}}.`;return g.useEffect(()=>{var i;const a=(i=e.current)==null?void 0:i.getAttribute("aria-describedby");t&&a&&(document.getElementById(t)||console.warn(r))},[r,e,t]),null},aN=o2,iN=d2,sN=u2,x2=m2,Qf=p2,Xf=h2,j2=v2,oN=y2;const lN=aN,yU=iN,A2=sN,ev=g.forwardRef(({className:e,...t},n)=>o.jsx(x2,{ref:n,className:le("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",e),...t}));ev.displayName=x2.displayName;const dN=g.forwardRef(({className:e,children:t,...n},r)=>o.jsxs(A2,{children:[o.jsx(ev,{}),o.jsxs(Qf,{ref:r,className:le("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 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rou
581nded-lg",e),...n,children:[t,o.jsxs(oN,{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background 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:[o.jsx(bu,{className:"h-4 w-4"}),o.jsx("span",{className:"sr-only",children:"Close"})]})]})]}));dN.displayName=Qf.displayName;const cN=({className:e,...t})=>o.jsx("div",{className:le("flex flex-col space-y-1.5 text-center sm:text-left",e),...t});cN.displayName="DialogHeader";const uN=({className:e,...t})=>o.jsx("div",{className:le("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",e),...t});uN.displayName="DialogFooter";const mN=g.forwardRef(({className:e,...t},n)=>o.jsx(Xf,{ref:n,className:le("text-lg font-semibold leading-none tracking-tight",e),...t}));mN.displayName=Xf.displayName;const pN=g.forwardRef(({className:e,...t},n)=>o.jsx(j2,{ref:n,className:le("text-sm text-muted-foreground",e),...t}));pN.displayName=j2.displayName;function Jy(e,t){if(typeof e=="function")return e(t);e!=null&&(e.current=t)}function gN(...e){return t=>{let n=!1;const r=e.map(a=>{const i=Jy(a,t);return!n&&typeof i=="function"&&(n=!0),i});if(n)return()=>{for(let a=0;a<r.length;a++){const i=r[a];typeof i=="function"?i():Jy(e[a],null)}}}}var hN=Symbol.for("react.lazy"),Bc=sh[" use ".trim().toString()];function fN(e){return typeof e=="object"&&e!==null&&"then"in e}function E2(e){return e!=null&&typeof e=="object"&&"$$typeof"in e&&e.$$typeof===hN&&"_payload"in e&&fN(e._payload)}function vN(e){const t=bN(e),n=g.forwardRef((r,a)=>{let{children:i,...s}=r;E2(i)&&typeof Bc=="function"&&(i=Bc(i._payload));const l=g.Children.toArray(i),d=l.find(wN);if(d){const c=d.props.children,u=l.map(m=>m===d?g.Children.count(c)>1?g.Children.only(null):g.isValidElement(c)?c.props.children:null:m);return o.jsx(t,{...s,ref:a,children:g.isValidElement(c)?g.cloneElement(c,void 0,u):null})}return o.jsx(t,{...s,ref:a,children:i})});return n.displayName=`${e}.Slot`,n}function bN(e){const t=g.forwardRef((n,r)=>{let{children:a,...i}=n;if(E2(a)&&typeof Bc=="function"&&(a=Bc(a._payload)),g.isValidElement(a)){const s=xN(a),l=kN(i,a.props);return a.type!==g.Fragment&&(l.ref=r?gN(r,s):s),g.cloneElement(a,l)}return g.Children.count(a)>1?g.Children.only(null):null});return t.displayName=`${e}.SlotClone`,t}var yN=Symbol("radix.slottable");function wN(e){return g.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===yN}function kN(e,t){const n={...t};for(const r in t){const a=e[r],i=t[r];/^on[A-Z]/.test(r)?a&&i?n[r]=(...l)=>{const d=i(...l);return a(...l),d}:a&&(n[r]=a):r==="style"?n[r]={...a,...i}:r==="className"&&(n[r]=[a,i].filter(Boolean).join(" "))}return{...e,...n}}function xN(e){var r,a;let t=(r=Object.getOwnPropertyDescriptor(e.props,"ref"))==null?void 0:r.get,n=t&&"isReactWarning"in t&&t.isReactWarning;return n?e.ref:(t=(a=Object.getOwnPropertyDescriptor(e,"ref"))==null?void 0:a.get,n=t&&"isReactWarning"in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}var jN=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],AN=jN.reduce((e,t)=>{const n=vN(`Primitive.${t}`),r=g.forwardRef((a,i)=>{const{asChild:s,...l}=a,d=s?n:t;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),o.jsx(d,{...l,ref:i})});return r.displayName=`Primitive.${t}`,{...e,[t]:r}},{}),EN=Object.freeze({position:"absolute",border:0,width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",wordWrap:"normal"}),PN="VisuallyHidden",P2=g.forwardRef((e,t)=>o.jsx(AN.span,{...e,ref:t,style:{...EN,...e.style}}));P2.displayName=PN;var CN=P2;const SN=vu("inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm font-medium focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 transition-all duration-300 ease-out",{variants:{variant:{default:"bg-[#1E6B7E] text-primary-foreground hover:bg-[#47B8A7] rounded-[6px] shadow-[0px_4px_10px_rgba(0,0,0,0.1)] transition-colors duration-300 ease-out",destructive:"bg-destructive text-destructive-foreground hover:bg-destructive/90 rounded-[6px]",outline:"bg-background hover:bg-muted hover:text-foreground rounded-[6px]",secondary:"bg-secondary text-secondary-foreground hover:bg-primary rounded-[6px] shadow-[0px_4px_10px_rgba(0,0,0,0.1)]",ghost:"hover:bg-muted hover:text-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-12 px-6 py-3",sm:"h-10 px-4 py-2",lg:"h-14 px-8 py-4",icon:"h-12 w-12"}},defaultVariants:{variant:"default",size:"default"}}),ka=g.forwardRef(({className:e,variant:t,size:n,asChild:r=!1,...a},i)=>{const s=r?ha:"button";return o.jsx(s,{className:le(SN({variant:t,size:n,className:e})),ref:i,...a})});ka.displayName="Button";const Ds=g.forwardRef(({className:e,type:t,...n},r)=>o.jsx("input",{type:t,className:le("flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground placeholder:italic focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none",e),ref:r,...n}));Ds.displayName="Input";var tv="Popover",[C2,wU]=Fs(tv,[Gs]),Ml=Gs(),[_N,Da]=C2(tv),S2=e=>{const{__scopePopover:t,children:n,open:r,defaultOpen:a,onOpenChange:i,modal:s=!1}=e,l=Ml(t),d=g.useRef(null),[c,u]=g.useState(!1),[m=!1,p]=Es({prop:r,defaultProp:a,onChange:i});return o.jsx(wf,{...l,children:o.jsx(_N,{scope:t,contentId:ca(),triggerRef:d,open:m,onOpenChange:p,onOpenToggle:g.useCallback(()=>p(h=>!h),[p]),hasCustomAnchor:c,onCustomAnchorAdd:g.useCallback(()=>u(!0),[]),onCustomAnchorRemove:g.useCallback(()=>u(!1),[]),modal:s,children:n})})};S2.displayName=tv;var _2="PopoverAnchor",TN=g.forwardRef((e,t)=>
581{const{__scopePopover:n,...r}=e,a=Da(_2,n),i=Ml(n),{onCustomAnchorAdd:s,onCustomAnchorRemove:l}=a;return g.useEffect(()=>(s(),()=>l()),[s,l]),o.jsx(xu,{...i,...r,ref:t})});TN.displayName=_2;var T2="PopoverTrigger",D2=g.forwardRef((e,t)=>{const{__scopePopover:n,...r}=e,a=Da(T2,n),i=Ml(n),s=Re(t,a.triggerRef),l=o.jsx(be.button,{type:"button","aria-haspopup":"dialog","aria-expanded":a.open,"aria-controls":a.contentId,"data-state":N2(a.open),...r,ref:s,onClick:ce(e.onClick,a.onOpenToggle)});return a.hasCustomAnchor?l:o.jsx(xu,{asChild:!0,...i,children:l})});D2.displayName=T2;var nv="PopoverPortal",[DN,RN]=C2(nv,{forceMount:void 0}),R2=e=>{const{__scopePopover:t,forceMount:n,children:r,container:a}=e,i=Da(nv,t);return o.jsx(DN,{scope:t,forceMount:n,children:o.jsx(gn,{present:n||i.open,children:o.jsx(zl,{asChild:!0,container:a,children:r})})})};R2.displayName=nv;var Rs="PopoverContent",z2=g.forwardRef((e,t)=>{const n=RN(Rs,e.__scopePopover),{forceMount:r=n.forceMount,...a}=e,i=Da(Rs,e.__scopePopover);return o.jsx(gn,{present:r||i.open,children:i.modal?o.jsx(zN,{...a,ref:t}):o.jsx(IN,{...a,ref:t})})});z2.displayName=Rs;var zN=g.forwardRef((e,t)=>{const n=Da(Rs,e.__scopePopover),r=g.useRef(null),a=Re(t,r),i=g.useRef(!1);return g.useEffect(()=>{const s=r.current;if(s)return Hf(s)},[]),o.jsx(Lu,{as:ha,allowPinchZoom:!0,children:o.jsx(I2,{...e,ref:a,trapFocus:n.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:ce(e.onCloseAutoFocus,s=>{var l;s.preventDefault(),i.current||(l=n.triggerRef.current)==null||l.focus()}),onPointerDownOutside:ce(e.onPointerDownOutside,s=>{const l=s.detail.originalEvent,d=l.button===0&&l.ctrlKey===!0,c=l.button===2||d;i.current=c},{checkForDefaultPrevented:!1}),onFocusOutside:ce(e.onFocusOutside,s=>s.preventDefault(),{checkForDefaultPrevented:!1})})})}),IN=g.forwardRef((e,t)=>{const n=Da(Rs,e.__scopePopover),r=g.useRef(!1),a=g.useRef(!1);return o.jsx(I2,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:i=>{var s,l;(s=e.onCloseAutoFocus)==null||s.call(e,i),i.defaultPrevented||(r.current||(l=n.triggerRef.current)==null||l.focus(),i.preventDefault()),r.current=!1,a.current=!1},onInteractOutside:i=>{var d,c;(d=e.onInteractOutside)==null||d.call(e,i),i.defaultPrevented||(r.current=!0,i.detail.originalEvent.type==="pointerdown"&&(a.current=!0));const s=i.target;((c=n.triggerRef.current)==null?void 0:c.contains(s))&&i.preventDefault(),i.detail.originalEvent.type==="focusin"&&a.current&&i.preventDefault()}})}),I2=g.forwardRef((e,t)=>{const{__scopePopover:n,trapFocus:r,onOpenAutoFocus:a,onCloseAutoFocus:i,disableOutsidePointerEvents:s,onEscapeKeyDown:l,onPointerDownOutside:d,onFocusOutside:c,onInteractOutside:u,...m}=e,p=Da(Rs,n),h=Ml(n);return Gf(),o.jsx(qu,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:a,onUnmountAutoFocus:i,children:o.jsx(Os,{asChild:!0,disableOutsidePointerEvents:s,onInteractOutside:u,onEscapeKeyDown:l,onPointerDownOutside:d,onFocusOutside:c,onDismiss:()=>p.onOpenChange(!1),children:o.jsx(kf,{"data-state":N2(p.open),role:"dialog",id:p.contentId,...h,...m,ref:t,style:{...m.style,"--radix-popover-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-popover-content-available-width":"var(--radix-popper-available-width)","--radix-popover-content-available-height":"var(--radix-popper-available-height)","--radix-popover-trigger-width":"var(--radix-popper-anchor-width)","--radix-popover-trigger-height":"var(--radix-popper-anchor-height)"}})})})}),q2="PopoverClose",qN=g.forwardRef((e,t)=>{const{__scopePopover:n,...r}=e,a=Da(q2,n);return o.jsx(be.button,{type:"button",...r,ref:t,onClick:ce(e.onClick,()=>a.onOpenChange(!1))})});qN.displayName=q2;var NN="PopoverArrow",LN=g.forwardRef((e,t)=>{const{__scopePopover:n,...r}=e,a=Ml(n);return o.jsx(xf,{...a,...r,ref:t})});LN.displayName=NN;function N2(e){return e?"open":"closed"}var BN=S2,MN=D2,FN=R2,L2=z2;const ON=BN,VN=MN,B2=g.forwardRef(({className:e,align:t="center",sideOffset:n=4,...r},a)=>o.jsx(FN,{children:o.jsx(L2,{ref:a,align:t,sideOffset:n,className:le("z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none 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 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:sli
581de-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...r})}));B2.displayName=L2.displayName;var WN=g.createContext(void 0);function M2(e){const t=g.useContext(WN);return e||t||"ltr"}function Vg(e,[t,n]){return Math.min(n,Math.max(t,e))}function UN(e,t){return g.useReducer((n,r)=>t[n][r]??n,e)}var rv="ScrollArea",[F2,kU]=Fs(rv),[$N,hn]=F2(rv),O2=g.forwardRef((e,t)=>{const{__scopeScrollArea:n,type:r="hover",dir:a,scrollHideDelay:i=600,...s}=e,[l,d]=g.useState(null),[c,u]=g.useState(null),[m,p]=g.useState(null),[h,b]=g.useState(null),[f,k]=g.useState(null),[w,v]=g.useState(0),[y,x]=g.useState(0),[A,E]=g.useState(!1),[j,P]=g.useState(!1),S=Re(t,G=>d(G)),_=M2(a);return o.jsx($N,{scope:n,type:r,dir:_,scrollHideDelay:i,scrollArea:l,viewport:c,onViewportChange:u,content:m,onContentChange:p,scrollbarX:h,onScrollbarXChange:b,scrollbarXEnabled:A,onScrollbarXEnabledChange:E,scrollbarY:f,onScrollbarYChange:k,scrollbarYEnabled:j,onScrollbarYEnabledChange:P,onCornerWidthChange:v,onCornerHeightChange:x,children:o.jsx(be.div,{dir:_,...s,ref:S,style:{position:"relative","--radix-scroll-area-corner-width":w+"px","--radix-scroll-area-corner-height":y+"px",...e.style}})})});O2.displayName=rv;var V2="ScrollAreaViewport",W2=g.forwardRef((e,t)=>{const{__scopeScrollArea:n,children:r,asChild:a,nonce:i,...s}=e,l=hn(V2,n),d=g.useRef(null),c=Re(t,d,l.onViewportChange);return o.jsxs(o.Fragment,{children:[o.jsx("style",{dangerouslySetInnerHTML:{__html:` 582[data-radix-scroll-area-viewport] { 583 scrollbar-width: none; 584 -ms-overflow-style: none; 585 -webkit-overflow-scrolling: touch; 586} 587[data-radix-scroll-area-viewport]::-webkit-scrollbar {
588 display: none; 589} 590:where([data-radix-scroll-area-viewport]) { 591 display: flex; 592 flex-direction: column; 593 align-items: stretch; 594} 595:where([data-radix-scroll-area-content]) { 596 flex-grow: 1; 597} 598`},nonce:i}),o.jsx(be.div,{"data-radix-scroll-area-viewport":"",...s,asChild:a,ref:c,style:{overflowX:l.scrollbarXEnabled?"scroll":"hidden",overflowY:l.scrollbarYEnabled?"scroll":"hidden",...e.style},children:tL({asChild:a,children:r},u=>o.jsx("div",{"data-radix-scroll-area-content":"",ref:l.onContentChange,style:{minWidth:l.scrollbarXEnabled?"fit-content":void 0},children:u}))})]})});W2.displayName=V2;var dr="ScrollAreaScrollbar",av=g.forwardRef((e,t)=>{const{forceMount:n,...r}=e,a=hn(dr,e.__scopeScrollArea),{onScrollbarXEnabledChange:i,onScrollbarYEnabledChange:s}=a,l=e.orientation==="horizontal";return g.useEffect(()=>(l?i(!0):s(!0),()=>{l?i(!1):s(!1)}),[l,i,s]),a.type==="hover"?o.jsx(GN,{...r,ref:t,forceMount:n}):a.type==="scroll"?o.jsx(HN,{...r,ref:t,forceMount:n}):a.type==="auto"?o.jsx(U2,{...r,ref:t,forceMount:n}):a.type==="always"?o.jsx(iv,{...r,ref:t}):null});av.displayName=dr;var GN=g.forwardRef((e,t)=>{const{forceMount:n,...r}=e,a=hn(dr,e.__scopeScrollArea),[i,s]=g.useState(!1);return g.useEffect(()=>{const l=a.scrollArea;let d=0;if(l){const c=()=>{window.clearTimeout(d),s(!0)},u=()=>{d=window.setTimeout(()=>s(!1),a.scrollHideDelay)};return l.addEventListener("pointerenter",c),l.addEventListener("pointerleave",u),()=>{window.clearTimeout(d),l.removeEventListener("pointerenter",c),l.removeEventListener("pointerleave",u)}}},[a.scrollArea,a.scrollHideDelay]),o.jsx(gn,{present:n||i,children:o.jsx(U2,{"data-state":i?"visible":"hidden",...r,ref:t})})}),HN=g.forwardRef((e,t)=>{const{forceMount:n,...r}=e,a=hn(dr,e.__scopeScrollArea),i=e.orientation==="horizontal",s=Mu(()=>d("SCROLL_END"),100),[l,d]=UN("hidden",{hidden:{SCROLL:"scrolling"},scrolling:{SCROLL_END:"idle",POINTER_ENTER:"interacting"},interacting:{SCROLL:"interacting",POINTER_LEAVE:"idle"},idle:{HIDE:"hidden",SCROLL:"scrolling",POINTER_ENTER:"interacting"}});return g.useEffect(()=>{if(l==="idle"){const c=window.setTimeout(()=>d("HIDE"),a.scrollHideDelay);return()=>window.clearTimeout(c)}},[l,a.scrollHideDelay,d]),g.useEffect(()=>{const c=a.viewport,u=i?"scrollLeft":"scrollTop";if(c){let m=c[u];const p=()=>{const h=c[u];m!==h&&(d("SCROLL"),s()),m=h};return c.addEventListener("scroll",p),()=>c.removeEventListener("scroll",p)}},[a.viewport,i,d,s]),o.jsx(gn,{present:n||l!=="hidden",children:o.jsx(iv,{"data-state":l==="hidden"?"hidden":"visible",...r,ref:t,onPointerEnter:ce(e.onPointerEnter,()=>d("POINTER_ENTER")),onPointerLeave:ce(e.onPointerLeave,()=>d("POINTER_LEAVE"))})})}),U2=g.forwardRef((e,t)=>{const n=hn(dr,e.__scopeScrollArea),{forceMount:r,...a}=e,[i,s]=g.useState(!1),l=e.orientation==="horizontal",d=Mu(()=>{if(n.viewport){const c=n.viewport.offsetWidth<n.viewport.scrollWidth,u=n.viewport.offsetHeight<n.viewport.scrollHeight;s(l?c:u)}},10);return zs(n.viewport,d),zs(n.content,d),o.jsx(gn,{present:r||i,children:o.jsx(iv,{"data-state":i?"visible":"hidden",...a,ref:t})})}),iv=g.forwardRef((e,t)=>{const{orientation:n="vertical",...r}=e,a=hn(dr,e.__scopeScrollArea),i=g.useRef(null),s=g.useRef(0),[l,d]=g.useState({content:0,viewport:0,scrollbar:{size:0,paddingStart:0,paddingEnd:0}}),c=Y2(l.viewport,l.content),u={...r,sizes:l,onSizesChange:d,hasThumb:c>0&&c<1,onThumbChange:p=>i.current=p,onThumbPointerUp:()=>s.current=0,onThumbPointerDown:p=>s.current=p};function m(p,h){return XN(p,s.current,l,h)}return n==="horizontal"?o.jsx(KN,{...u,ref:t,onThumbPositionChange:()=>{if(a.viewport&&i.current){const p=a.viewport.scrollLeft,h=Qy(p,l,a.dir);i.current.style.transform=`translate3d(${h}px, 0, 0)`}},onWheelScroll:p=>{a.viewport&&(a.viewport.scrollLeft=p)},onDragScroll:p=>{a.viewport&&(a.viewport.scrollLeft=m(p,a.dir))}}):n==="vertical"?o.jsx(YN,{...u,ref:t,onThumbPositionChange:()=>{if(a.viewport&&i.current){const p=a.viewport.scrollTop,h=Qy(p,l);i.current.style.transform=`translate3d(0, ${h}px, 0)`}},onWheelScroll:p=>{a.viewport&&(a.viewport.scrollTop=p)},onDragScroll:p=>{a.viewport&&(a.viewport.scrollTop=m(p))}}):null}),KN=g.forwardRef((e,t)=>
598{const{sizes:n,onSizesChange:r,...a}=e,i=hn(dr,e.__scopeScrollArea),[s,l]=g.useState(),d=g.useRef(null),c=Re(t,d,i.onScrollbarXChange);return g.useEffect(()=>{d.current&&l(getComputedStyle(d.current))},[d]),o.jsx(G2,{"data-orientation":"horizontal",...a,ref:c,sizes:n,style:{bottom:0,left:i.dir==="rtl"?"var(--radix-scroll-area-corner-width)":0,right:i.dir==="ltr"?"var(--radix-scroll-area-corner-width)":0,"--radix-scroll-area-thumb-width":Bu(n)+"px",...e.style},onThumbPointerDown:u=>e.onThumbPointerDown(u.x),onDragScroll:u=>e.onDragScroll(u.x),onWheelScroll:(u,m)=>{if(i.viewport){const p=i.viewport.scrollLeft+u.deltaX;e.onWheelScroll(p),J2(p,m)&&u.preventDefault()}},onResize:()=>{d.current&&i.viewport&&s&&r({content:i.viewport.scrollWidth,viewport:i.viewport.offsetWidth,scrollbar:{size:d.current.clientWidth,paddingStart:Fc(s.paddingLeft),paddingEnd:Fc(s.paddingRight)}})}})}),YN=g.forwardRef((e,t)=>{const{sizes:n,onSizesChange:r,...a}=e,i=hn(dr,e.__scopeScrollArea),[s,l]=g.useState(),d=g.useRef(null),c=Re(t,d,i.onScrollbarYChange);return g.useEffect(()=>{d.current&&l(getComputedStyle(d.current))},[d]),o.jsx(G2,{"data-orientation":"vertical",...a,ref:c,sizes:n,style:{top:0,right:i.dir==="ltr"?0:void 0,left:i.dir==="rtl"?0:void 0,bottom:"var(--radix-scroll-area-corner-height)","--radix-scroll-area-thumb-height":Bu(n)+"px",...e.style},onThumbPointerDown:u=>e.onThumbPointerDown(u.y),onDragScroll:u=>e.onDragScroll(u.y),onWheelScroll:(u,m)=>{if(i.viewport){const p=i.viewport.scrollTop+u.deltaY;e.onWheelScroll(p),J2(p,m)&&u.preventDefault()}},onResize:()=>{d.current&&i.viewport&&s&&r({content:i.viewport.scrollHeight,viewport:i.viewport.offsetHeight,scrollbar:{size:d.current.clientHeight,paddingStart:Fc(s.paddingTop),paddingEnd:Fc(s.paddingBottom)}})}})}),[ZN,$2]=F2(dr),G2=g.forwardRef((e,t)=>{const{__scopeScrollArea:n,sizes:r,hasThumb:a,onThumbChange:i,onThumbPointerUp:s,onThumbPointerDown:l,onThumbPositionChange:d,onDragScroll:c,onWheelScroll:u,onResize:m,...p}=e,h=hn(dr,n),[b,f]=g.useState(null),k=Re(t,S=>f(S)),w=g.useRef(null),v=g.useRef(""),y=h.viewport,x=r.content-r.viewport,A=ct(u),E=ct(d),j=Mu(m,10);function P(S){if(w.current){const _=S.clientX-w.current.left,G=S.clientY-w.current.top;c({x:_,y:G})}}return g.useEffect(()=>{const S=_=>{const G=_.target;(b==null?void 0:b.contains(G))&&A(_,x)};return document.addEventListener("wheel",S,{passive:!1}),()=>document.removeEventListener("wheel",S,{passive:!1})},[y,b,x,A]),g.useEffect(E,[r,E]),zs(b,j),zs(h.content,j),o.jsx(ZN,{scope:n,scrollbar:b,hasThumb:a,onThumbChange:ct(i),onThumbPointerUp:ct(s),onThumbPositionChange:E,onThumbPointerDown:ct(l),children:o.jsx(be.div,{...p,ref:k,style:{position:"absolute",...p.style},onPointerDown:ce(e.onPointerDown,S=>{S.button===0&&(S.target.setPointerCapture(S.pointerId),w.current=b.getBoundingClientRect(),v.current=document.body.style.webkitUserSelect,document.body.style.webkitUserSelect="none",h.viewport&&(h.viewport.style.scrollBehavior="auto"),P(S))}),onPointerMove:ce(e.onPointerMove,P),onPointerUp:ce(e.onPointerUp,S=>{const _=S.target;_.hasPointerCapture(S.pointerId)&&_.releasePointerCapture(S.pointerId),document.body.style.webkitUserSelect=v.current,h.viewport&&(h.viewport.style.scrollBehavior=""),w.current=null})})})}),Mc="ScrollAreaThumb",H2=g.forwardRef((e,t)=>{const{forceMount:n,...r}=e,a=$2(Mc,e.__scopeScrollArea);return o.jsx(gn,{present:n||a.hasThumb,children:o.jsx(JN,{ref:t,...r})})}),JN=g.forwardRef((e,t)=>{const{__scopeScrollArea:n,style:r,...a}=e,i=hn(Mc,n),s=$2(Mc,n),{onThumbPositionChange:l}=s,d=Re(t,m=>s.onThumbChange(m)),c=g.useRef(),u=Mu(()=>{c.current&&(c.current(),c.current=void 0)},100);return g.useEffect(()=>{const m=i.viewport;if(m){const p=()=>{if(u(),!c.current){const h=eL(m,l);c.current=h,l()}};return l(),m.addEventListener("scroll",p),()=>m.removeEventListener("scroll",p)}},[i.viewport,u,l]),o.jsx(be.div,{"data-state":s.hasThumb?"visible":"hidden",...a,ref:d,style:{width:"var(--radix-scroll-area-thumb-width)",height:"var(--radix-scroll-area-thumb-height)",...r},onPointerDownCapture:ce(e.onPointerDownCapture,m=>{const h=m.target.getBoundingClientRect(),b=m.clientX-h.left,f=m.clientY-h.top;s.onThumbPointerDown({x:b,y:f})}),onPointerUp:ce(e.onPointerUp,s.onThumbPointerUp)})});H2.displayName=Mc;var sv="ScrollAreaCorner",K2=g.forwardRef((e,t)=>
598{const n=hn(sv,e.__scopeScrollArea),r=!!(n.scrollbarX&&n.scrollbarY);return n.type!=="scroll"&&r?o.jsx(QN,{...e,ref:t}):null});K2.displayName=sv;var QN=g.forwardRef((e,t)=>{const{__scopeScrollArea:n,...r}=e,a=hn(sv,n),[i,s]=g.useState(0),[l,d]=g.useState(0),c=!!(i&&l);return zs(a.scrollbarX,()=>{var m;const u=((m=a.scrollbarX)==null?void 0:m.offsetHeight)||0;a.onCornerHeightChange(u),d(u)}),zs(a.scrollbarY,()=>{var m;const u=((m=a.scrollbarY)==null?void 0:m.offsetWidth)||0;a.onCornerWidthChange(u),s(u)}),c?o.jsx(be.div,{...r,ref:t,style:{width:i,height:l,position:"absolute",right:a.dir==="ltr"?0:void 0,left:a.dir==="rtl"?0:void 0,bottom:0,...e.style}}):null});function Fc(e){return e?parseInt(e,10):0}function Y2(e,t){const n=e/t;return isNaN(n)?0:n}function Bu(e){const t=Y2(e.viewport,e.content),n=e.scrollbar.paddingStart+e.scrollbar.paddingEnd,r=(e.scrollbar.size-n)*t;return Math.max(r,18)}function XN(e,t,n,r="ltr"){const a=Bu(n),i=a/2,s=t||i,l=a-s,d=n.scrollbar.paddingStart+s,c=n.scrollbar.size-n.scrollbar.paddingEnd-l,u=n.content-n.viewport,m=r==="ltr"?[0,u]:[u*-1,0];return Z2([d,c],m)(e)}function Qy(e,t,n="ltr"){const r=Bu(t),a=t.scrollbar.paddingStart+t.scrollbar.paddingEnd,i=t.scrollbar.size-a,s=t.content-t.viewport,l=i-r,d=n==="ltr"?[0,s]:[s*-1,0],c=Vg(e,d);return Z2([0,s],[0,l])(c)}function Z2(e,t){return n=>{if(e[0]===e[1]||t[0]===t[1])return t[0];const r=(t[1]-t[0])/(e[1]-e[0]);return t[0]+r*(n-e[0])}}function J2(e,t){return e>0&&e<t}var eL=(e,t=()=>{})=>{let n={left:e.scrollLeft,top:e.scrollTop},r=0;return function a(){const i={left:e.scrollLeft,top:e.scrollTop},s=n.left!==i.left,l=n.top!==i.top;(s||l)&&t(),n=i,r=window.requestAnimationFrame(a)}(),()=>window.cancelAnimationFrame(r)};function Mu(e,t){const n=ct(e),r=g.useRef(0);return g.useEffect(()=>()=>window.clearTimeout(r.current),[]),g.useCallback(()=>{window.clearTimeout(r.current),r.current=window.setTimeout(n,t)},[n,t])}function zs(e,t){const n=ct(t);kt(()=>{let r=0;if(e){const a=new ResizeObserver(()=>{cancelAnimationFrame(r),r=window.requestAnimationFrame(n)});return a.observe(e),()=>{window.cancelAnimationFrame(r),a.unobserve(e)}}},[e,n])}function tL(e,t){const{asChild:n,children:r}=e;if(!n)return typeof t=="function"?t(r):t;const a=g.Children.only(r);return g.cloneElement(a,{children:typeof t=="function"?t(a.props.children):t})}var Q2=O2,nL=W2,rL=K2;const X2=g.forwardRef(({className:e,children:t,...n},r)=>o.jsxs(Q2,{ref:r,className:le("relative overflow-hidden",e),...n,children:[o.jsx(nL,{className:"h-full w-full rounded-[inherit]",children:t}),o.jsx(eA,{}),o.jsx(rL,{})]}));X2.displayName=Q2.displayName;const eA=g.forwardRef(({className:e,orientation:t="vertical",...n},r)=>o.jsx(av,{ref:r,orientation:t,className:le("flex touch-none select-none transition-colors",t==="vertical"&&"h-full w-2.5 border-l border-l-transparent p-[1px]",t==="horizontal"&&"h-2.5 flex-col border-t border-t-transparent p-[1px]",e),...n,children:o.jsx(H2,{className:"relative flex-1 rounded-full bg-border"})}));eA.displayName=av.displayName;const Zd=[{name:"sparkles",icon:da,emoji:"â¨"},{name:"rocket",icon:Y_,emoji:"ð"},{name:"star",icon:Q_,emoji:"â"},{name:"check",icon:fa,emoji:"â"},{name:"zap",icon:cf,emoji:"â¡"},{name:"heart",icon:B_,emoji:"â¤ï¸"},{name:"bell",icon:og,emoji:"ð"},{name:"gift",icon:Ac,emoji:"ð"},{name:"trending-up",icon:Vs,emoji:"ð"},{name:"shield",icon:Xo,emoji:"ð¡ï¸"},{name:"lock",icon:Hx,emoji:"ð"},{name:"eye",icon:Vx,emoji:"ðï¸"},{name:"settings",icon:lf,emoji:"âï¸"},{name:"search",icon:of,emoji:"ð"},{name:"home",icon:M_,emoji:"ð "},{name:"file-text",icon:hi,emoji:"ð"},{name:"calendar",icon:Bx,emoji:"ð
"},{name:"clock",icon:Ox,emoji:"ð"},{name:"user",icon:Ec,emoji:"ð¤"},{name:"users",icon:Qx,emoji:"ð¥"},{name:"mail",icon:Yx,emoji:"ð§"},{name:"message",icon:U_,emoji:"ð¬"},{name:"download",icon:z_,emoji:"â¬ï¸"},{name:"upload",icon:tT,emoji:"â¬ï¸"},{name:"external-link",icon:jc,emoji:"ð"},{name:"link",icon:V_,emoji:"ð"},{name:"share",icon:J_,emoji:"ð¤"},{name:"award",icon:y_,emoji:"ð"},{name:"target",icon:df,emoji:"ð¯"},{name:"bar-chart",icon:Il,emoji:"ð"},{name:"pie-chart",icon:Mx,emoji:"ð"},{name:"activity",icon:b_,emoji:"ð"},{name:"lightbulb",icon:O_,emoji:"ð¡"},{name:"palette",icon:$_,emoji:"ð¨"},{name:"wand",icon:nT,emoji:"ðª"},{name:"flame",icon:q_,emoji:"ð¥"},{name:"crown",icon:dg,emoji:"ð"},{name:"diamond",icon:R_,emoji:"ð"},{name:"gem",icon:N_,emoji:"ð"},{name:"coins",icon:lg,emoji:"ðª"},{name:"calculator",icon:Ps,emoji:"ð§®"},{name:"building",icon:k_,emoji:"ð¢"},{name:"map",icon:sf,emoji:"ðºï¸"},{name:"map-pin",icon:af,emoji:"ð"},{name:"globe",icon:Wx,emoji:"ð"},{name:"phone",icon:G_,emoji:"ð±"},{name:"camera",icon:x_,emoji:"ð·"},{name:"image",icon:F_,emoji:"ð¼ï¸"},{name:"video",icon:Xx,emoji:"ð¬"},{name:"headphones",icon:L_,emoji:"ð§"},{name:"wifi",icon:rT,emoji:"ð¶"},{name:"cloud",icon:C_,emoji:"âï¸"},{name:"database",icon:D_,emoji:"ðï¸"},{name:"server",icon:Z_,emoji:"ð¥ï¸"},{name:"code",icon:S_,emoji:"ð»"},{name:"terminal",icon:X_,emoji:"ð»"},{name:"bug",icon:w_,emoji:"ð"}
598,{name:"wrench",icon:t1,emoji:"ð§"}];function xU({value:e,onChange:t}){const[n,r]=g.useState(!1),[a,i]=g.useState(""),s=Zd.filter(c=>c.name.toLowerCase().includes(a.toLowerCase())||c.emoji.includes(a)),l=Zd.find(c=>c.name===e||c.emoji===e),d=()=>{if(!e)return o.jsx(da,{className:"h-4 w-4"});if(l){const c=l.icon;return o.jsx(c,{className:"h-4 w-4"})}return o.jsx("span",{className:"text-sm",children:e})};return o.jsxs(ON,{open:n,onOpenChange:r,children:[o.jsx(VN,{asChild:!0,children:o.jsxs(ka,{type:"button",variant:"outline",className:"w-full justify-start gap-2",children:[d(),o.jsx("span",{className:"text-muted-foreground text-xs",children:(l==null?void 0:l.name)||e||"Choisir une icône"})]})}),o.jsx(B2,{className:"w-72 p-2",align:"start",children:o.jsxs("div",{className:"space-y-2",children:[o.jsxs("div",{className:"relative",children:[o.jsx(of,{className:"absolute left-2 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),o.jsx(Ds,{placeholder:"Rechercher...",value:a,onChange:c=>i(c.target.value),className:"pl-8 h-8"})]}),o.jsx(X2,{className:"h-48",children:o.jsx("div",{className:"grid grid-cols-6 gap-1",children:s.map(c=>{const u=c.icon,m=e===c.name||e===c.emoji;return o.jsx(ka,{type:"button",variant:m?"default":"ghost",size:"icon",className:"h-8 w-8",onClick:()=>{t(c.name),r(!1)},title:c.name,children:o.jsx(u,{className:"h-4 w-4"})},c.name)})})}),o.jsxs("div",{className:"pt-2 border-t",children:[o.jsx("p",{className:"text-xs text-muted-foreground mb-1",children:"Ou saisir un emoji:"}),o.jsx(Ds,{placeholder:"⨠ð â",value:Zd.find(c=>c.name===e)?"":e,onChange:c=>t(c.target.value),className:"h-8"})]})]})})]})}const aL=Zd.reduce((e,t)=>(e[t.name]=t.icon,e),{});var iL="Label",tA=g.forwardRef((e,t)=>o.jsx(be.label,{...e,ref:t,onMouseDown:n=>{var a;n.target.closest("button, input, select, textarea")||((a=e.onMouseDown)==null||a.call(e,n),!n.defaultPrevented&&n.detail>1&&n.preventDefault())}}));tA.displayName=iL;var nA=tA;const sL=vu("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"),Wg=g.forwardRef(({className:e,...t},n)=>o.jsx(nA,{ref:n,className:le(sL(),e),...t}));Wg.displayName=nA.displayName;function oL(e){const t=g.useRef({value:e,previous:e});return g.useMemo(()=>(t.current.value!==e&&(t.current.previous=t.current.value,t.current.value=e),t.current.previous),[e])}var lL="VisuallyHidden",rA=g.forwardRef((e,t)=>o.jsx(be.span,{...e,ref:t,style:{position:"absolute",border:0,width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",wordWrap:"normal",...e.style}}));rA.displayName=lL;var dL=[" ","Enter","ArrowUp","ArrowDown"],cL=[" ","Enter"],Fl="Select",[Fu,Ou,uL]=ux(Fl),[Js,jU]=Fs(Fl,[uL,Gs]),Vu=Gs(),[mL,Ra]=Js(Fl),[pL,gL]=Js(Fl),aA=e=>{const{__scopeSelect:t,children:n,open:r,defaultOpen:a,onOpenChange:i,value:s,defaultValue:l,onValueChange:d,dir:c,name:u,autoComplete:m,disabled:p,required:h,form:b}=e,f=Vu(t),[k,w]=g.useState(null),[v,y]=g.useState(null),[x,A]=g.useState(!1),E=M2(c),[j=!1,P]=Es({prop:r,defaultProp:a,onChange:i}),[S,_]=Es({prop:s,defaultProp:l,onChange:d}),G=g.useRef(null),B=k?b||!!k.closest("form"):!0,[Q,N]=g.useState(new Set),ie=Array.from(Q).map(Y=>Y.props.value).join(";");return o.jsx(wf,{...f,children:o.jsxs(mL,{required:h,scope:t,trigger:k,onTriggerChange:w,valueNode:v,onValueNodeChange:y,valueNodeHasChildren:x,onValueNodeHasChildrenChange:A,contentId:ca(),value:S,onValueChange:_,open:j,onOpenChange:P,dir:E,triggerPointerDownPosRef:G,disabled:p,children:[o.jsx(Fu.Provider,{scope:t,children:o.jsx(pL,{scope:e.__scopeSelect,onNativeOptionAdd:g.useCallback(Y=>{N(te=>new Set(te).add(Y))},[]),onNativeOptionRemove:g.useCallback(Y=>{N(te=>{const C=new Set(te);return C.delete(Y),C})},[]),children:n})}),B?o.jsxs(_A,{"aria-hidden":!0,required:h,tabIndex:-1,name:u,autoComplete:m,value:S,onChange:Y=>_(Y.target.value),disabled:p,form:b,children:[S===void 0?o.jsx("option",{value:""}):null,Array.from(Q)]},ie):null]})})};aA.displayName=Fl;var iA="SelectTrigger",sA=g.forwardRef((e,t)=>{const{__scopeSelect:n,disabled:r=!1,...a}=e,i=Vu(n),s=Ra(iA,n),l=s.disabled||r,d=Re(t,s.onTriggerChange),c=Ou(n),u=g.useRef("touch"),[m,p,h]=TA(f=>{const k=c().filter(y=>!y.disabled),w=k.find(y=>y.value===s.value),v=DA(k,f,w);v!==void 0&&s.onValueChange(v.value)}),b=f=>{l||(s.onOpenChange(!0),h()),f&&(s.triggerPointerDownPosRef.current={x:Math.round(f.pageX),y:Math.round(f.pageY)})};return o.jsx(xu,{asChild:!0,...i,children:o.jsx(be.button,{type:"button",role:"combobox","aria-controls":s.contentId,"aria-expanded":s.open,"aria-required":s.required,"aria-autocomplete":"none",dir:s.dir,"data-state":s.open?"open":"closed",disabled:l,"data-disabled":l?"":void 0,"data-placeholder":SA(s.value)?"":void 0,...a,ref:d,onClick:ce(a.onClick,f=>
598{f.currentTarget.focus(),u.current!=="mouse"&&b(f)}),onPointerDown:ce(a.onPointerDown,f=>{u.current=f.pointerType;const k=f.target;k.hasPointerCapture(f.pointerId)&&k.releasePointerCapture(f.pointerId),f.button===0&&f.ctrlKey===!1&&f.pointerType==="mouse"&&(b(f),f.preventDefault())}),onKeyDown:ce(a.onKeyDown,f=>{const k=m.current!=="";!(f.ctrlKey||f.altKey||f.metaKey)&&f.key.length===1&&p(f.key),!(k&&f.key===" ")&&dL.includes(f.key)&&(b(),f.preventDefault())})})})});sA.displayName=iA;var oA="SelectValue",lA=g.forwardRef((e,t)=>{const{__scopeSelect:n,className:r,style:a,children:i,placeholder:s="",...l}=e,d=Ra(oA,n),{onValueNodeHasChildrenChange:c}=d,u=i!==void 0,m=Re(t,d.onValueNodeChange);return kt(()=>{c(u)},[c,u]),o.jsx(be.span,{...l,ref:m,style:{pointerEvents:"none"},children:SA(d.value)?o.jsx(o.Fragment,{children:s}):i})});lA.displayName=oA;var hL="SelectIcon",dA=g.forwardRef((e,t)=>{const{__scopeSelect:n,children:r,...a}=e;return o.jsx(be.span,{"aria-hidden":!0,...a,ref:t,children:r||"â¼"})});dA.displayName=hL;var fL="SelectPortal",cA=e=>o.jsx(zl,{asChild:!0,...e});cA.displayName=fL;var li="SelectContent",uA=g.forwardRef((e,t)=>{const n=Ra(li,e.__scopeSelect),[r,a]=g.useState();if(kt(()=>{a(new DocumentFragment)},[]),!n.open){const i=r;return i?gi.createPortal(o.jsx(mA,{scope:e.__scopeSelect,children:o.jsx(Fu.Slot,{scope:e.__scopeSelect,children:o.jsx("div",{children:e.children})})}),i):null}return o.jsx(pA,{...e,ref:t})});uA.displayName=li;var yn=10,[mA,za]=Js(li),vL="SelectContentImpl",pA=g.forwardRef((e,t)=>{const{__scopeSelect:n,position:r="item-aligned",onCloseAutoFocus:a,onEscapeKeyDown:i,onPointerDownOutside:s,side:l,sideOffset:d,align:c,alignOffset:u,arrowPadding:m,collisionBoundary:p,collisionPadding:h,sticky:b,hideWhenDetached:f,avoidCollisions:k,...w}=e,v=Ra(li,n),[y,x]=g.useState(null),[A,E]=g.useState(null),j=Re(t,q=>x(q)),[P,S]=g.useState(null),[_,G]=g.useState(null),B=Ou(n),[Q,N]=g.useState(!1),ie=g.useRef(!1);g.useEffect(()=>{if(y)return Hf(y)},[y]),Gf();const Y=g.useCallback(q=>{const[$,...pe]=B().map(Ae=>Ae.ref.current),[oe]=pe.slice(-1),ke=document.activeElement;for(const Ae of q)if(Ae===ke||(Ae==null||Ae.scrollIntoView({block:"nearest"}),Ae===$&&A&&(A.scrollTop=0),Ae===oe&&A&&(A.scrollTop=A.scrollHeight),Ae==null||Ae.focus(),document.activeElement!==ke))return},[B,A]),te=g.useCallback(()=>Y([P,y]),[Y,P,y]);g.useEffect(()=>{Q&&te()},[Q,te]);const{onOpenChange:C,triggerPointerDownPosRef:z}=v;g.useEffect(()=>{if(y){let q={x:0,y:0};const $=oe=>{var ke,Ae;q={x:Math.abs(Math.round(oe.pageX)-(((ke=z.current)==null?void 0:ke.x)??0)),y:Math.abs(Math.round(oe.pageY)-(((Ae=z.current)==null?void 0:Ae.y)??0))}},pe=oe=>{q.x<=10&&q.y<=10?oe.preventDefault():y.contains(oe.target)||C(!1),document.removeEventListener("pointermove",$),z.current=null};return z.current!==null&&(document.addEventListener("pointermove",$),document.addEventListener("pointerup",pe,{capture:!0,once:!0})),()=>{document.removeEventListener("pointermove",$),document.removeEventListener("pointerup",pe,{capture:!0})}}},[y,C,z]),g.useEffect(()=>{const q=()=>C(!1);return window.addEventListener("blur",q),window.addEventListener("resize",q),()=>{window.removeEventListener("blur",q),window.removeEventListener("resize",q)}},[C]);const[Z,K]=TA(q=>{const $=B().filter(ke=>!ke.disabled),pe=$.find(ke=>ke.ref.current===document.activeElement),oe=DA($,q,pe);oe&&setTimeout(()=>oe.ref.current.focus())}),X=g.useCallback((q,$,pe)=>{const oe=!ie.current&&!pe;(v.value!==void 0&&v.value===$||oe)&&(S(q),oe&&(ie.current=!0))},[v.value]),he=g.useCallback(()=>y==null?void 0:y.focus(),[y]),M=g.useCallback((q,$,pe)=>{const oe=!ie.current&&!pe;(v.value!==void 0&&v.value===$||oe)&&G(q)},[v.value]),U=r==="popper"?Ug:gA,V=U===Ug?{side:l,sideOffset:d,align:c,alignOffset:u,arrowPadding:m,collisionBoundary:p,collisionPadding:h,sticky:b,hideWhenDetached:f,avoidCollisions:k}:{};return o.jsx(mA,{scope:n,content:y,viewport:A,onViewportChange:E,itemRefCallback:X,selectedItem:P,onItemLeave:he,itemTextRefCallback:M,focusSelectedItem:te,selectedItemText:_,position:r,isPositioned:Q,searchRef:Z,children:o.jsx(Lu,{as:ha,allowPinchZoom:!0,children:o.jsx(qu,{asChild:!0,trapped:v.open,onMountAutoFocus:q=>{q.preventDefault()},onUnmountAutoFocus:ce(a,q=>{var $;($=v.trigger)==null||$.focus({preventScroll:!0}),q.preventDefault()}),children:o.jsx(Os,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:i,onPointerDownOutside:s,onFocusOutside:q=>q.preventDefault(),onDismiss:()=>v.onOpenChange(!1),children:o.jsx(U,{role:"listbox",id:v.contentId,"data-state":v.open?"open":"closed",dir:v.dir,onContextMenu:q=>q.preventDefault(),...w,...V,onPlaced:()=>N(!0),ref:j,style:{display:"flex",flexDirection:"column",outline:"none",...w.style},onKeyDown:ce(w.onKeyDown,q=>{const $=q.ctrlKey||q.altKey||q.metaKey;
598if(q.key==="Tab"&&q.preventDefault(),!$&&q.key.length===1&&K(q.key),["ArrowUp","ArrowDown","Home","End"].includes(q.key)){let oe=B().filter(ke=>!ke.disabled).map(ke=>ke.ref.current);if(["ArrowUp","End"].includes(q.key)&&(oe=oe.slice().reverse()),["ArrowUp","ArrowDown"].includes(q.key)){const ke=q.target,Ae=oe.indexOf(ke);oe=oe.slice(Ae+1)}setTimeout(()=>Y(oe)),q.preventDefault()}})})})})})})});pA.displayName=vL;var bL="SelectItemAlignedPosition",gA=g.forwardRef((e,t)=>{const{__scopeSelect:n,onPlaced:r,...a}=e,i=Ra(li,n),s=za(li,n),[l,d]=g.useState(null),[c,u]=g.useState(null),m=Re(t,j=>u(j)),p=Ou(n),h=g.useRef(!1),b=g.useRef(!0),{viewport:f,selectedItem:k,selectedItemText:w,focusSelectedItem:v}=s,y=g.useCallback(()=>{if(i.trigger&&i.valueNode&&l&&c&&f&&k&&w){const j=i.trigger.getBoundingClientRect(),P=c.getBoundingClientRect(),S=i.valueNode.getBoundingClientRect(),_=w.getBoundingClientRect();if(i.dir!=="rtl"){const ke=_.left-P.left,Ae=S.left-ke,He=j.left-Ae,Oe=j.width+He,Dt=Math.max(Oe,P.width),at=window.innerWidth-yn,Fn=Vg(Ae,[yn,Math.max(yn,at-Dt)]);l.style.minWidth=Oe+"px",l.style.left=Fn+"px"}else{const ke=P.right-_.right,Ae=window.innerWidth-S.right-ke,He=window.innerWidth-j.right-Ae,Oe=j.width+He,Dt=Math.max(Oe,P.width),at=window.innerWidth-yn,Fn=Vg(Ae,[yn,Math.max(yn,at-Dt)]);l.style.minWidth=Oe+"px",l.style.right=Fn+"px"}const G=p(),B=window.innerHeight-yn*2,Q=f.scrollHeight,N=window.getComputedStyle(c),ie=parseInt(N.borderTopWidth,10),Y=parseInt(N.paddingTop,10),te=parseInt(N.borderBottomWidth,10),C=parseInt(N.paddingBottom,10),z=ie+Y+Q+C+te,Z=Math.min(k.offsetHeight*5,z),K=window.getComputedStyle(f),X=parseInt(K.paddingTop,10),he=parseInt(K.paddingBottom,10),M=j.top+j.height/2-yn,U=B-M,V=k.offsetHeight/2,q=k.offsetTop+V,$=ie+Y+q,pe=z-$;if($<=M){const ke=G.length>0&&k===G[G.length-1].ref.current;l.style.bottom="0px";const Ae=c.clientHeight-f.offsetTop-f.offsetHeight,He=Math.max(U,V+(ke?he:0)+Ae+te),Oe=$+He;l.style.height=Oe+"px"}else{const ke=G.length>0&&k===G[0].ref.current;l.style.top="0px";const He=Math.max(M,ie+f.offsetTop+(ke?X:0)+V)+pe;l.style.height=He+"px",f.scrollTop=$-M+f.offsetTop}l.style.margin=`${yn}px 0`,l.style.minHeight=Z+"px",l.style.maxHeight=B+"px",r==null||r(),requestAnimationFrame(()=>h.current=!0)}},[p,i.trigger,i.valueNode,l,c,f,k,w,i.dir,r]);kt(()=>y(),[y]);const[x,A]=g.useState();kt(()=>{c&&A(window.getComputedStyle(c).zIndex)},[c]);const E=g.useCallback(j=>{j&&b.current===!0&&(y(),v==null||v(),b.current=!1)},[y,v]);return o.jsx(wL,{scope:n,contentWrapper:l,shouldExpandOnScrollRef:h,onScrollButtonChange:E,children:o.jsx("div",{ref:d,style:{display:"flex",flexDirection:"column",position:"fixed",zIndex:x},children:o.jsx(be.div,{...a,ref:m,style:{boxSizing:"border-box",maxHeight:"100%",...a.style}})})})});gA.displayName=bL;var yL="SelectPopperPosition",Ug=g.forwardRef((e,t)=>{const{__scopeSelect:n,align:r="start",collisionPadding:a=yn,...i}=e,s=Vu(n);return o.jsx(kf,{...s,...i,ref:t,align:r,collisionPadding:a,style:{boxSizing:"border-box",...i.style,"--radix-select-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-select-content-available-width":"var(--radix-popper-available-width)","--radix-select-content-available-height":"var(--radix-popper-available-height)","--radix-select-trigger-width":"var(--radix-popper-anchor-width)","--radix-select-trigger-height":"var(--radix-popper-anchor-height)"}})});Ug.displayName=yL;var[wL,ov]=Js(li,{}),$g="SelectViewport",hA=g.forwardRef((e,t)=>{const{__scopeSelect:n,nonce:r,...a}=e,i=za($g,n),s=ov($g,n),l=Re(t,i.onViewportChange),d=g.useRef(0);return o.jsxs(o.Fragment,{children:[o.jsx("style",{dangerouslySetInnerHTML:{__html:"[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}"},nonce:r}),o.jsx(Fu.Slot,{scope:n,children:o.jsx(be.div,{"data-radix-select-viewport":"",role:"presentation",...a,ref:l,style:{position:"relative",flex:1,overflow:"hidden auto",...a.style},onScroll:ce(a.onScroll,c=>{const u=c.currentTarget,{contentWrapper:m,shouldExpandOnScrollRef:p}=s;if(p!=null&&p.current&&m){const h=Math.abs(d.current-u.scrollTop);if(h>0){const b=window.innerHeight-yn*2,f=parseFloat(m.style.minHeight),k=parseFloat(m.style.height),w=Math.max(f,k);if(w<b){const v=w+h,y=Math.min(b,v),x=v-y;m.style.height=y+"px",m.style.bottom==="0px"&&(u.scrollTop=x>0?x:0,m.style.justifyContent="flex-end")}}}d.current=u.scrollTop})})})]})});hA.displayName=$g;var fA="SelectGroup",[kL,xL]=Js(fA),jL=g.forwardRef((e,t)=>
598{const{__scopeSelect:n,...r}=e,a=ca();return o.jsx(kL,{scope:n,id:a,children:o.jsx(be.div,{role:"group","aria-labelledby":a,...r,ref:t})})});jL.displayName=fA;var vA="SelectLabel",bA=g.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e,a=xL(vA,n);return o.jsx(be.div,{id:a.id,...r,ref:t})});bA.displayName=vA;var Oc="SelectItem",[AL,yA]=Js(Oc),wA=g.forwardRef((e,t)=>{const{__scopeSelect:n,value:r,disabled:a=!1,textValue:i,...s}=e,l=Ra(Oc,n),d=za(Oc,n),c=l.value===r,[u,m]=g.useState(i??""),[p,h]=g.useState(!1),b=Re(t,v=>{var y;return(y=d.itemRefCallback)==null?void 0:y.call(d,v,r,a)}),f=ca(),k=g.useRef("touch"),w=()=>{a||(l.onValueChange(r),l.onOpenChange(!1))};if(r==="")throw new Error("A <Select.Item /> must have a value prop that is not an empty string. This is because the Select value can be set to an empty string to clear the selection and show the placeholder.");return o.jsx(AL,{scope:n,value:r,disabled:a,textId:f,isSelected:c,onItemTextChange:g.useCallback(v=>{m(y=>y||((v==null?void 0:v.textContent)??"").trim())},[]),children:o.jsx(Fu.ItemSlot,{scope:n,value:r,disabled:a,textValue:u,children:o.jsx(be.div,{role:"option","aria-labelledby":f,"data-highlighted":p?"":void 0,"aria-selected":c&&p,"data-state":c?"checked":"unchecked","aria-disabled":a||void 0,"data-disabled":a?"":void 0,tabIndex:a?void 0:-1,...s,ref:b,onFocus:ce(s.onFocus,()=>h(!0)),onBlur:ce(s.onBlur,()=>h(!1)),onClick:ce(s.onClick,()=>{k.current!=="mouse"&&w()}),onPointerUp:ce(s.onPointerUp,()=>{k.current==="mouse"&&w()}),onPointerDown:ce(s.onPointerDown,v=>{k.current=v.pointerType}),onPointerMove:ce(s.onPointerMove,v=>{var y;k.current=v.pointerType,a?(y=d.onItemLeave)==null||y.call(d):k.current==="mouse"&&v.currentTarget.focus({preventScroll:!0})}),onPointerLeave:ce(s.onPointerLeave,v=>{var y;v.currentTarget===document.activeElement&&((y=d.onItemLeave)==null||y.call(d))}),onKeyDown:ce(s.onKeyDown,v=>{var x;((x=d.searchRef)==null?void 0:x.current)!==""&&v.key===" "||(cL.includes(v.key)&&w(),v.key===" "&&v.preventDefault())})})})})});wA.displayName=Oc;var yo="SelectItemText",kA=g.forwardRef((e,t)=>{const{__scopeSelect:n,className:r,style:a,...i}=e,s=Ra(yo,n),l=za(yo,n),d=yA(yo,n),c=gL(yo,n),[u,m]=g.useState(null),p=Re(t,w=>m(w),d.onItemTextChange,w=>{var v;return(v=l.itemTextRefCallback)==null?void 0:v.call(l,w,d.value,d.disabled)}),h=u==null?void 0:u.textContent,b=g.useMemo(()=>o.jsx("option",{value:d.value,disabled:d.disabled,children:h},d.value),[d.disabled,d.value,h]),{onNativeOptionAdd:f,onNativeOptionRemove:k}=c;return kt(()=>(f(b),()=>k(b)),[f,k,b]),o.jsxs(o.Fragment,{children:[o.jsx(be.span,{id:d.textId,...i,ref:p}),d.isSelected&&s.valueNode&&!s.valueNodeHasChildren?gi.createPortal(i.children,s.valueNode):null]})});kA.displayName=yo;var xA="SelectItemIndicator",jA=g.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e;return yA(xA,n).isSelected?o.jsx(be.span,{"aria-hidden":!0,...r,ref:t}):null});jA.displayName=xA;var Gg="SelectScrollUpButton",AA=g.forwardRef((e,t)=>{const n=za(Gg,e.__scopeSelect),r=ov(Gg,e.__scopeSelect),[a,i]=g.useState(!1),s=Re(t,r.onScrollButtonChange);return kt(()=>{if(n.viewport&&n.isPositioned){let l=function(){const c=d.scrollTop>0;i(c)};const d=n.viewport;return l(),d.addEventListener("scroll",l),()=>d.removeEventListener("scroll",l)}},[n.viewport,n.isPositioned]),a?o.jsx(PA,{...e,ref:s,onAutoScroll:()=>{const{viewport:l,selectedItem:d}=n;l&&d&&(l.scrollTop=l.scrollTop-d.offsetHeight)}}):null});AA.displayName=Gg;var Hg="SelectScrollDownButton",EA=g.forwardRef((e,t)=>{const n=za(Hg,e.__scopeSelect),r=ov(Hg,e.__scopeSelect),[a,i]=g.useState(!1),s=Re(t,r.onScrollButtonChange);return kt(()=>{if(n.viewport&&n.isPositioned){let l=function(){const c=d.scrollHeight-d.clientHeight,u=Math.ceil(d.scrollTop)<c;i(u)};const d=n.viewport;return l(),d.addEventListener("scroll",l),()=>d.removeEventListener("scroll",l)}},[n.viewport,n.isPositioned]),a?o.jsx(PA,{...e,ref:s,onAutoScroll:()=>{const{viewport:l,selectedItem:d}=n;l&&d&&(l.scrollTop=l.scrollTop+d.offsetHeight)}}):null});EA.displayName=Hg;var PA=g.forwardRef((e,t)=>{const{__scopeSelect:n,onAutoScroll:r,...a}=e,i=za("SelectScrollButton",n),s=g.useRef(null),l=Ou(n),d=g.useCallback(()=>{s.current!==null&&(window.clearInterval(s.current),s.current=null)},[]);return g.useEffect(()=>()=>d(),[d]),kt(()=>{var u;const c=l().find(m=>m.ref.current===document.activeElement);(u=c==null?void 0:c.ref.current)==null||u.scrollIntoView({block:"nearest"})},[l]),o.jsx(be.div,{"aria-hidden":!0,...a,ref:t,style:{flexShrink:0,...a.style},onPointerDown:ce(a.onPointerDown,()=>{s.current===null&&(s.current=window.setInterval(r,50))}),onPointerMove:ce(a.onPointerMove,()=>{var c;(c=i.onItemLeave)==null||c.call(i),s.current===null&&(s.current=window.setInterval(r,50))}),onPointerLeave:ce(a.onPointerLeave,()=>{d()})})}),EL="SelectSeparator",CA=g.forwardRef((e,t)=>
598{const{__scopeSelect:n,...r}=e;return o.jsx(be.div,{"aria-hidden":!0,...r,ref:t})});CA.displayName=EL;var Kg="SelectArrow",PL=g.forwardRef((e,t)=>{const{__scopeSelect:n,...r}=e,a=Vu(n),i=Ra(Kg,n),s=za(Kg,n);return i.open&&s.position==="popper"?o.jsx(xf,{...a,...r,ref:t}):null});PL.displayName=Kg;function SA(e){return e===""||e===void 0}var _A=g.forwardRef((e,t)=>{const{value:n,...r}=e,a=g.useRef(null),i=Re(t,a),s=oL(n);return g.useEffect(()=>{const l=a.current,d=window.HTMLSelectElement.prototype,u=Object.getOwnPropertyDescriptor(d,"value").set;if(s!==n&&u){const m=new Event("change",{bubbles:!0});u.call(l,n),l.dispatchEvent(m)}},[s,n]),o.jsx(rA,{asChild:!0,children:o.jsx("select",{...r,ref:i,defaultValue:n})})});_A.displayName="BubbleSelect";function TA(e){const t=ct(e),n=g.useRef(""),r=g.useRef(0),a=g.useCallback(s=>{const l=n.current+s;t(l),function d(c){n.current=c,window.clearTimeout(r.current),c!==""&&(r.current=window.setTimeout(()=>d(""),1e3))}(l)},[t]),i=g.useCallback(()=>{n.current="",window.clearTimeout(r.current)},[]);return g.useEffect(()=>()=>window.clearTimeout(r.current),[]),[n,a,i]}function DA(e,t,n){const a=t.length>1&&Array.from(t).every(c=>c===t[0])?t[0]:t,i=n?e.indexOf(n):-1;let s=CL(e,Math.max(i,0));a.length===1&&(s=s.filter(c=>c!==n));const d=s.find(c=>c.textValue.toLowerCase().startsWith(a.toLowerCase()));return d!==n?d:void 0}function CL(e,t){return e.map((n,r)=>e[(t+r)%e.length])}var SL=aA,RA=sA,_L=lA,TL=dA,DL=cA,zA=uA,RL=hA,IA=bA,qA=wA,zL=kA,IL=jA,NA=AA,LA=EA,BA=CA;const qL=SL,NL=_L,MA=g.forwardRef(({className:e,children:t,...n},r)=>o.jsxs(RA,{ref:r,className:le("flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm r
598ing-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1",e),...n,children:[t,o.jsx(TL,{asChild:!0,children:o.jsx(Er,{className:"h-4 w-4 opacity-50"})})]}));MA.displayName=RA.displayName;const FA=g.forwardRef(({className:e,...t},n)=>o.jsx(NA,{ref:n,className:le("flex cursor-default items-center justify-center py-1",e),...t,children:o.jsx(j_,{className:"h-4 w-4"})}));FA.displayName=NA.displayName;const OA=g.forwardRef(({className:e,...t},n)=>o.jsx(LA,{ref:n,className:le("flex cursor-default items-center justify-center py-1",e),...t,children:o.jsx(Er,{className:"h-4 w-4"})}));OA.displayName=LA.displayName;const VA=g.forwardRef(({className:e,children:t,position:n="popper",...r},a)=>o.jsx(DL,{children:o.jsxs(zA,{ref:a,className:le("relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md 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 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",n==="popper"&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",e),position:n,...r,children:[o.jsx(FA,{}),o.jsx(RL,{className:le("p-1",n==="popper"&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"),children:t}),o.jsx(OA,{})]})}));VA.displayName=zA.displayName;const LL=g.forwardRef(({className:e,...t},n)=>o.jsx(IA,{ref:n,className:le("py-1.5 pl-8 pr-2 text-sm font-semibold",e),...t}));LL.displayName=IA.displayName;const Jd=g.forwardRef(({className:e,children:t,...n},r)=>o.jsxs(qA,{ref:r,className:le("relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),...n,children:[o.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:o.jsx(IL,{children:o.jsx(fa,{className:"h-4 w-4"})})}),o.jsx(zL,{children:t})]}));Jd.displayName=qA.displayName;const BL=g.forwardRef(({className:e,...t},n)=>o.jsx(BA,{ref:n,className:le("-mx-1 my-1 h-px bg-muted",e),...t}));BL.displayName=BA.displayName;function AU({url:e,type:t,onUrlChange:n,onTypeChange:r}){const[a,i]=g.useState(null);return g.useEffect(()=>{if(!e){i(null);return}const s=WA(e);s?(i(s.embedUrl),!t&&s.type&&r(s.type)):i(null)},[e,t,r]),o.jsxs("div",{className:"space-y-3",children:[o.jsxs("div",{className:"grid grid-cols-3 gap-3",children:[o.jsxs("div",{className:"col-span-2 space-y-1",children:[o.jsx(Wg,{className:"text-xs",children:"URL de la vidéo"}),o.jsx(Ds,{placeholder:"https://www.youtube.com/watch?v=... ou https://vimeo.com/...",value:e,onChange:s=>n(s.target.value)})]}),o.jsxs("div",{className:"space-y-1",children:[o.jsx(Wg,{className:"text-xs",children:"Type"}),o.jsxs(qL,{value:t,onValueChange:r,children:[o.jsx(MA,{children:o.jsx(NL,{placeholder:"Auto"})}),o.jsxs(VA,{children:[o.jsx(Jd,{value:"youtube",children:"YouTube"}),o.jsx(Jd,{value:"vimeo",children:"Vimeo"}),o.jsx(Jd,{value:"loom",children:"Loom"})]})]})]})]}),a?o.jsx("div",{className:"relative aspect-video rounded-lg overflow-hidden border border-border bg-muted",children:o.jsx("iframe",{src:a,title:"Video preview",className:"w-full h-full",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowFullScreen:!0})}):o.jsx("div",{className:"flex items-center justify-center aspect-video border border-dashed border-border rounded-lg bg-muted/30",children:o.jsxs("div",{className:"text-center text-muted-foreground",children:[o.jsx(Xx,{className:"h-10 w-10 mx-auto mb-2 opacity-50"}),o.jsx("p",{className:"text-xs",children:"Collez une URL YouTube, Vimeo ou Loom"})]})})]})}function WA(e){if(!e)return null;const t=e.match(/(?:youtube\.com\/(?:watch\?v=|embed\/|v\/)|youtu\.be\/)([a-zA-Z0-9_-]{11})/);if(t)return{embedUrl:`https://www.youtube.com/embed/${t[1]}`,type:"youtube"};const n=e.match(/(?:vimeo\.com\/)(\d+)/);if(n)return{embedUrl:`https://player.vimeo.com/video/${n[1]}`,type:"vimeo"};const r=e.match(/(?:loom\.com\/share\/)([a-zA-Z0-9]+)/);return r?{embedUrl:`https://www.loom.com/embed/${r[1]}`,type:"loom"}:null}function Xy({url:e,type:t}){const n=WA(e);return n?o.jsx("div",{className:"relative aspect-video rounded-lg overflow-hidden border border-border",children:o.jsx("iframe",{src:n.embedUrl,title:"Video",className:"w-full h-full",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowFullScreen:!0})}):null}function ML({open:e,onClose:t,update:n}){const{language:r,t:a}=Ge(),[i,s]=g.useState(!1);if(!n)return null;const l=r==="nl"?n.title_nl:n.title_fr,d=r==="nl"?n.description_nl:n.description_fr,c=n.features||[],u=n.action_buttons||[],m=f=>
598{if(!f)return o.jsx(fa,{className:"h-4 w-4"});const k=aL[f];return k?o.jsx(k,{className:"h-4 w-4"}):o.jsx("span",{className:"text-sm",children:f})},p=f=>{f.startsWith("/")?window.location.href=f:window.open(f,"_blank","noopener,noreferrer")},h=u.find(f=>f.variant==="primary"),b=u.filter(f=>f.variant!=="primary");return o.jsx(lN,{open:e,onOpenChange:f=>!f&&t(),children:o.jsxs(A2,{children:[o.jsx(ev,{className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 cursor-pointer",onClick:t}),o.jsxs(Qf,{className:"fixed left-1/2 top-1/2 z-50 -translate-x-1/2 -translate-y-1/2 w-[94vw] max-w-[440px] focus:outline-none 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 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] duration-300",onPointerDownOutside:t,children:[o.jsx(CN,{children:o.jsx(Xf,{children:l})}),o.jsxs("div",{className:"relative bg-white dark:bg-[#0a1628] rounded-3xl overflow-hidden shadow-[0_25px_60px_-15px_rgba(0,0,0,0.4)] ring-1 ring-black/5 dark:ring-white/10",children:[n.banner_image_url?o.jsx("div",{className:"relative",children:n.video_url&&!i?o.jsxs("div",{className:"relative cursor-pointer group",onClick:()=>s(!0),children:[o.jsx("img",{src:n.banner_image_url,alt:"",className:"w-full h-52 object-cover"}),o.jsx("div",{className:"absolute inset-0 bg-gradient-to-t from-[#0d3d47] via-[#0d3d47]/40 to-transparent"}),o.jsx("div",{className:"absolute inset-0 flex items-center justify-center",children:o.jsx("div",{className:"w-16 h-16 rounded-full bg-white/95 flex items-center justify-center shadow-2xl group-hover:scale-110 group-hover:bg-white transition-all duration-300 ring-4 ring-white/20",children:o.jsx(H_,{className:"h-7 w-7 text-[#1E6B7E] ml-1",fill:"currentColor"})})}),o.jsx("div",{className:"absolute top-5 left-5",children:o.jsxs("div",{className:"inline-flex items-center gap-2 px-3 py-1.5 rounded-full bg-white/95 dark:bg-black/60 backdrop-blur-sm shadow-lg",children:[o.jsx(da,{className:"h-3.5 w-3.5 text-[#D4AF37]"}),o.jsxs("span",{className:"text-xs font-bold text-[#0d3d47] dark:text-white tracking-wide",children:["v",n.version]})]})}),o.jsxs("div",{className:"absolute bottom-0 left-0 right-0 p-6",children:[o.jsx("h2",{className:"text-2xl font-bold text-white leading-tight drop-shadow-lg",children:l}),o.jsx("p",{className:"mt-2 text-white/80 text-sm leading-relaxed line-clamp-2 drop-shadow",children:d})]})]}):n.video_url&&i?o.jsx(Xy,{url:n.video_url,type:n.video_type||void 0}):o.jsxs("div",{className:"relative",children:[o.jsx("img",{src:n.banner_image_url,alt:"",className:"w-full h-52 object-cover"}),o.jsx("div",{className:"absolute inset-0 bg-gradient-to-t from-[#0d3d47] via-[#0d3d47]/40 to-transparent"}),o.jsx("div",{className:"absolute top-5 left-5",children:o.jsxs("div",{className:"inline-flex items-center gap-2 px-3 py-1.5 rounded-full bg-white/95 dark:bg-black/60 backdrop-blur-sm shadow-lg",children:[o.jsx(da,{className:"h-3.5 w-3.5 text-[#D4AF37]"}),o.jsxs("span",{className:"text-xs font-bold text-[#0d3d47] dark:text-white tracking-wide",children:["v",n.version]})]})}),o.jsxs("div",{className:"absolute bottom-0 left-0 right-0 p-6",children:[o.jsx("h2",{className:"text-2xl font-bold text-white leading-tight drop-shadow-lg",children:l}),o.jsx("p",{className:"mt-2 text-white/80 text-sm leading-relaxed line-clamp-2 drop-shadow",children:d})]})]})}):o.jsxs("div",{className:"relative bg-gradient-to-br from-[#1E6B7E] via-[#237d91] to-[#2d9cad] px-6 pt-8 pb-6 overflow-hidden",children:[o.jsx("div",{className:"absolute -top-20 -right-20 w-40 h-40 bg-white/10 rounded-full blur-3xl"}),o.jsx("div",{className:"absolute -bottom-10 -left-10 w-32 h-32 bg-[#D4AF37]/20 rounded-full blur-3xl"}),o.jsxs("div",{className:"relative z-10",children:[o.jsxs("div",{className:"inline-flex items-center gap-2 px-3 py-1.5 rounded-full bg-white/20 backdrop-blur-sm border border-white/20 mb-4",children:[o.jsx(da,{className:"h-3.5 w-3.5 text-[#D4AF37]"}),o.jsxs("span",{className:"text-xs font-bold text-white tracking-wide",children:["v",n.version]})]}),o.jsx("h2",{className:"text-2xl font-bold text-white leading-tight pr-12",children:l}),o.jsx("p",{className:"mt-3 text-white/80 text-sm leading-relaxed",children:d})]})]}),n.video_url&&!n.banner_image_url&&o.jsx(Xy,{url:n.video_url,type:n.video_type||void 0}),c.length>0&&o.jsxs("div",{className:"px-6 py-5",children:[o.jsxs("p",{className:"text-[11px] font-semibold text-[#1E6B7E] dark:text-[#2d9cad] uppercase tracking-widest mb-4 flex items-center gap-2",children:[o.jsx("span",{className:"w-8 h-[2px] bg-[#1E6B7E]/30 dark:bg-[#2d9cad]/30 rounded-full"}),"Nouveautés"]}),o.jsx("div",{className:"space-y-3 max-h-[180px] overflow-y-auto pr-1",children:c.map((f,k)=>{const w=r==="nl"?f.title_nl:f.title_fr,v=r==="nl"?f.description_nl:f.description_fr;return o.jsxs("div",{className:"group flex items-start gap-4 p-4 rounded-2xl bg-gradient-to-br from-gray-50 to-gray-100/50 dark:from-white/5 dark:to-white/[0.02] border border-gray-100 dark:border-white/10 hover:border-[#1E6B7E]/30 dark:hover:border-[#2d9cad]/30 hover:shadow-md transition-all duration-300",children:[o.jsx("div",{className:"flex-shrink-0 w-10 h-10 rounded-xl bg-gradient-to-br from-[#1E6B7E] to-[#2d9cad] flex items-center justify-center text-white shadow-lg shadow-[#1E6B7E]/20 group-hover:scale-105 transition-transform duration-300",children:m(f.icon)}),o.jsxs("div",{className:"flex-1 min-w-0",children:[o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("p",{className:"font-semibold text-[#0d3d47] dark:text-white text-[15px] leading-tight",children:w}),f.link_url&&o.jsx("a",{href:f.link_url,target:"_blank",rel:"noopener noreferrer",className:"text-[#1E6B7E] hover:text-[#2d9cad] transition-colors opacity-0 group-hover:opacity-100",children:o.jsx(jc,{className:"h-3.5 w-3.5"})})]}),v&&o.jsx("p",{className:"text-[13px] text-gray-500 dark:text-gray-400 mt-1.5 leading-relaxed",children:v})]})]},k)})})]}),o.jsxs("div",{className:"px-6 pb-6 pt-2",children:[h?o.jsxs(ka,{onClick:()=>p(h.url),className:"w-full h-14 bg-gradient-to-r from-[#1E6B7E] via-[#237d91] to-[#2d9cad] hover:from-[#237d91] hover:via-[#2d9cad] hover:to-[#35b0c0] text-white font-semibold text-base rounded-2xl shadow-xl shadow-[#1E6B7E]/25 hover:shadow-2xl hover:shadow-[#1E6B7E]/30 hover:-translate-y-0.5 transition-all duration-300 group",children:[r==="nl"?h.label_nl:h.label_fr,o.jsx(et,{className:"h-5 w-5 ml-2 group-hover:translate-x-1 transition-transform duration-300"})]}):o.jsx(ka,{onClick:t,className:"w-full h-14 bg-gradient-to-r from-[#1E6B7E] via-[#237d91] to-[#2d9cad] hover:from-[#237d91] hover:via-[#2d9cad] hover:to-[#35b0c0] text-white font-semibold text-base rounded-2xl shadow-xl shadow-[#1E6B7E]/25 hover:shadow-2xl hover:shadow-[#1E6B7E]/30 hover:-translate-y-0.5 transition-all duration-300",children:a("featureUpdates.understood")}),b.length>0&&o.jsx("div",{className:"flex items-center justify-center gap-6 mt-4",children:b.map((f,k)=>{const w=r==="nl"?f.label_nl:f.label_fr;return o.jsx("button",{onClick:()=>p(f.url),className:"text-sm text-[#1E6B7E] dark:text-[#2d9cad] hover:text-[#0d3d47] dark:hover:text-white font-medium transition-colors relative after:absolute after:bottom-0 after:left-0 after:w-0 after:h-[1px] after:bg-current hover:after:w-full after:transition-all",children:w},k)})}),o.jsx("button",{onClick:t,className:"w-full text-center text-sm text-gray-400 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300 transition-colors mt-4 py-2",children:u.length>0?a("featureUpdates.maybeLater")||"Peut-être plus tard":a("featureUpdates.close")||"Fermer"})]})]})]})]})})}const FL={fr:{title:"Une erreur est survenue",body:"La page n'a pas pu se charger correctement. Essayez de rafraîchir.",button:"Rafraîchir la page"},nl:{title:"Er is een fout opgetreden",body:"De pagina kon niet correct worden geladen. Probeer te vernieuwen.",button:"Pagina vernieuwen"},en:{title:"Something went wrong",body:"The page could not load correctly. Please try refreshing.",button:"Refresh page"}};function OL(e){return e.startsWith("/d/")?"/d/[jeton]":e.startsWith("/e/")?"/e/[jeton]":e}function VL(){if(typeof document>"u")return"fr";const e=(document.documentElement.lang||"fr").split("-")[0].toLowerCase();return e==="nl"||e==="en"?e:"fr"}class WL extends g.Component{constructor(){super(...arguments);fn(this,"state",{hasError:!1});fn(this,"handleReload",()=>{typeof window<"u"&&window.location.reload()})}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(n,r){var a;console.error("[ErrorBoundary] Caught render error:",n,r);try{(a=navigator.sendBeacon)==null||a.call(navigator,`${Zj}/functions/v1/log-client-error`,JSON.stringify({type:"render_error",message:(n==null?void 0:n.message)??String(n),path:typeof window<"u"?OL(window.location.pathname):""}))}catch{}}
598render(){if(!this.state.hasError)return this.props.children;const n=FL[VL()];return o.jsx("div",{style:{minHeight:"100vh",display:"flex",alignItems:"center",justifyContent:"center",padding:"24px",fontFamily:"Outfit, system-ui, -apple-system, sans-serif",background:"#ffffff",color:"#111111"},children:o.jsxs("div",{style:{maxWidth:480,textAlign:"center"},children:[o.jsx("h1",{style:{fontSize:24,fontWeight:600,marginBottom:12},children:n.title}),o.jsx("p",{style:{fontSize:16,lineHeight:1.5,marginBottom:24,color:"#444"},children:n.body}),o.jsx("button",{onClick:this.handleReload,style:{padding:"12px 24px",fontSize:15,fontWeight:500,borderRadius:8,border:"none",background:"#111111",color:"#ffffff",cursor:"pointer",fontFamily:"inherit"},children:n.button})]})})}}const UL={newUpdate:"Nouveau",watchDemo:"Voir la démo",whatsNew:"Ce qui change",maybeLater:"Peut-être plus tard",understood:"J'ai compris",version:"Version"},$L={regulatoryPanel:{title:"Fiche réglementaire â restitution intégrale",subtitle:"Texte validé, affiché sans modification",copy:"Copier",close:"Fermer",collapse:"Réduire",expand:"Déplier"}},GL={emptyState:{title:"Cliquez sur une commune",subtitle:"pour voir l'analyse"},header:{investmentScore:"Score Investissement"},tabs:{invest:"Investir",market:"Marché",predict:"Prédictif"},scores:{yield:"Rend.",security:"Sécur.",potential:"Pot.",rental:"Locatif"},metrics:{rentalDemand:"Demande locative",renovationPotential:"Potentiel rénovation",familyAttractiveness:"Attractivité familles",houses:"Maisons",apartments:"Appart.",affordability:"Accessibilité",supplyDemandTension:"Tension O/D",medianIncome:"Revenu médian",priceForecast:"Prévision Prix",gentrification:"Gentrification",opportunityScore:"Indice convergence"},premium:{title:"Fonctionnalité Premium",description:"Débloquez les prévisions et analyses avancées",cta:"Passer Premium"},cta:{analyze:"Analyser un bien ici",compare:"Comparer avec une autre commune"},tooltip:{prixMaison:{label:"Prix médian maison",definition:"Valeur centrale des transactions. 50% des ventes au-dessus, 50% en dessous. Plus fiable que la moyenne car non influencé par les valeurs extrêmes.",source:"Statbel - Brique 2: Prix Immobilier 2023",method:"Médiane des actes notariés (ventes de gré à gré)"},revenu:{label:"Revenu médian",definition:"Revenu fiscal médian par déclaration IPP. Représente le revenu net imposable central des ménages.",source:"Statbel - Brique 1: Revenus Fiscaux 2022"},affordability:{label:"Ratio d'accessibilité",definition:"Années de revenus nécessaires pour acheter une maison au prix médian. Plus le ratio est bas, plus le marché est accessible.",source:"Calcul Arcanes - Combinaison Briques 1 & 2",method:"Prix médian maison ÷ Revenu médian annuel"},tension:{label:"Tension Offre/Demande",definition:"Ratio entre l'évolution des ménages et des logements. >100% = pénurie (pression haussière). <100% = suroffre.",source:"Statbel - Briques 3 (Démographie) & 4 (Parc Immobilier)",method:"(Ãvol. ménages 5 ans ÷ Ãvol. logements 5 ans) à 100"},rds:{label:"Score Demande Locative",definition:"Ãvalue le potentiel de demande locative basé sur la structure démographique, la densité et l'accessibilité prix.",source:"Modèle Arcanes - Données Statbel 2023"},ais:{label:"Score Investissement Arcanes",definition:"Score composite évaluant l'attractivité pour l'investissement locatif. Pondération: Rendement (40%) + Sécurité (30%) + Potentiel (30%).",source:"Algorithme Arcanes - Données Statbel 2023"}}},HL={title:"Carte d'exploration",subtitle:"Explorez les données immobilières des 576 communes belges",dataUpdated:"Données mises à jour en 2023",selectCommune:"Sélectionnez une commune",clickToExplore:"Cliquez sur la carte pour explorer",codeINS:"Code INS",activeTheme:"Thème actif",seeAvailableProperties:"Voir les biens disponibles",dataNotAvailable:"Données non disponibles",noData:"N/A",source:"Source",sourceText:"Statbel (Direction générale Statistique), données 2023",methodology:"Méthodologie",methodologyText:"Les données sont agrégées par commune (code INS). Les évolutions sont calculées sur base des médianes annuelles.",seeOfficialSources:"Voir les sources officielles",searchPlaceholder:"Rechercher une commune ou code postal...",noResults:"Aucune commune trouvée",suggestions:"Suggestions populaires",share:"Partager",compare:"Comparer",anal
598yzeProperty:"Analyser un bien dans cette commune",fullscreen:"Plein écran",exitFullscreen:"Quitter le plein écran",loading:"Chargement de la carte...",error:"Erreur de chargement","5years":"5 ans","10years":"10 ans",themes:{prix:{label:"Prix médian",description:"Prix médian des maisons",explanation:"Le prix médian représente la valeur centrale des transactions immobilières. 50% des ventes sont au-dessus, 50% en dessous.",methodology:"Calculé sur base des actes notariés enregistrés. Seules les ventes de gré à gré sont prises en compte."},dynamique:{label:"Dynamique prix",description:"Ãvolution des prix sur 5 ans",explanation:"L'évolution des prix sur 5 ans montre la tendance du marché local. Une hausse indique une demande soutenue.",methodology:"Comparaison du prix médian actuel avec celui d'il y a 5 ans, exprimé en pourcentage."},bati:{label:"Ãge du bâti",description:"Part des bâtiments anciens (>50 ans)",explanation:"L'âge du bâti influence le potentiel de rénovation et les coûts d'entretien.",methodology:"Part des bâtiments construits il y a plus de 50 ans, basée sur le cadastre."},demographie:{label:"Pression démographique",description:"Ãvolution du nombre de ménages (5 ans)",explanation:"L'évolution des ménages reflète l'attractivité d'une commune.",methodology:"Variation du nombre de ménages sur 5 ans, basée sur le Registre national."},tension:{label:"Tension marché",description:"Niveau de tension sur le marché",explanation:"Le score de tension combine plusieurs indicateurs pour évaluer l'équilibre offre/demande.",methodology:"Indicateur composite basé sur l'évolution des prix et la démographie."},accessibilite:{label:"Accessibilité",description:"Ratio prix / revenu médian",explanation:"Le ratio prix/revenu indique combien d'années de revenus sont nécessaires pour acheter un bien.",methodology:"Prix médian maison divisé par le revenu fiscal médian des ménages."},ais:{label:"Indice Investissement",description:"Indice global d'attractivité pour l'investissement (0-100)",explanation:"L'Indice Arcanes combine trois dimensions calculées : le rendement estimé (40%), la stabilité du marché (30%) et le potentiel d'appréciation historique (30%). Cet indice est un outil de tri, pas une recommandation d'investissement.",methodology:"Chaque dimension est calculée à partir de plusieurs indicateurs Statbel (prix, revenus, démographie, parc immobilier), normalisée de 0 à 100, puis pondérée pour obtenir le score final."},rds:{label:"Demande Locative",description:"Potentiel de demande locative (0-100)",explanation:"Ce score évalue le potentiel locatif d'une commune. Un score élevé indique une forte probabilité de trouver des locataires et un marché locatif dynamique.",methodology:"Combine la part d'isolés (30%), la croissance démographique (20%), la densité urbaine (20%), l'accessibilité prix (15%) et la rotation du parc (15%)."},tod:{label:"Tension Offre/Demande",description:"Ratio croissance ménages / logements",explanation:"Mesure l'équilibre du marché immobilier. Au-dessus de 100%, il y a plus de ménages que de logements (pénurie). En dessous de 100%, il y a plus de logements que de ménages (suroffre).",methodology:"Formule : (Ãvolution ménages 5 ans) / (Ãvolution logements 5 ans) à 100. Basé sur les données Statbel 2018-2023."},rpi:{label:"Potentiel Rénovation",description:"Potentiel de plus-value via rénovation (0-100)",explanation:"Identifie les communes où la rénovation peut créer de la valeur. Un score élevé indique un bâti ancien avec des revenus locaux permettant de financer les travaux.",methodology:"Combine la part de bâti ancien >50 ans (45%), le déficit d'équipements modernes (25%) et la capacité financière locale (30%)."},fas:{label:"Attractivité Familles",description:"Attractivité pour les familles avec enfants (0-100)",explanation:"Ãvalue l'adéquation d'une commune pour les familles. Utile pour identifier les communes où investir pour un public familial.",methodology:"Combine la disponibilité de maisons 4 façades (35%), la présence de familles (25%), la dynamique familiale (20%) et l'accessibilité prix (20%)."},pfi:{label:"Prévision Prix",description:"Indice de prévision d'évolution des prix (-100 à +100)",explanation:"Indice modélisant l'évolution probable des prix immobiliers. Un indice positif est associé à une tendance haussière, un indice négatif à une tendance baissière. Cet indicateur est purement indicatif et ne constitue pas une prévision garantie.",methodology:"Modèle basé sur la dynamique des revenus (35%), la pression démographique (25%), la tension offre/demande (25%) et le dynamisme de construction (15%)."},gvi:{label:"Gentrification",description:"Vitesse de transformation socio-économique (-50 à +50)",explanation:"Mesure la vitesse de transformation socio-économique d'une commune. Une gentrification rapide est historiquement associée à des hausses de prix, mais aussi à un risque de correction locale.",methodology:"Analyse l'évolution des revenus médians, l'évolution des prix, la transformation du parc immobilier et les changements démographiques sur 5 ans."},opportunity:{label:"Indicateurs convergents",description:"Communes présentant plusieurs indicateurs simultanément favorables",explanation:"Identifie les communes où plusieurs indicateurs convergent : score AIS élevé, gentrification positive, prix en-dessous de la moyenne régionale et tension favorable. Cette c
598onvergence est un constat statistique, pas une recommandation.",methodology:"Une commune est marquée 'Opportunité' si elle réunit au moins 3 critères : AIS > 55, GVI > 10, prix sous moyenne régionale, tension favorable, pas de risque bulle."}},sections:{prix:"Prix immobilier",dynamique:"Dynamique des prix",demographie:"Démographie",bati:"Parc immobilier",marche:"Tension du marché",accessibilite:"Accessibilité financière",investissement:"Investissement",predictif:"Prédictif"},data:{medianPrice:"Prix médian maison",priceEvol5y:"Ãvolution 5 ans",priceEvol10y:"Ãvolution 10 ans",priceM2Appart:"Prix m² appart",population:"Population",households:"Nombre de ménages",householdsEvol:"Ãvol. ménages (5 ans)",buildings:"Bâtiments",oldBuildings:"Part ancien (>50 ans)",newBuildings:"Part neuf (<10 ans)",buildingDynamic:"Dynamique",tensionLevel:"Niveau de tension",tensionScore:"Score tension",marketProfile:"Profil marché",priceIncomeRatio:"Ratio prix/revenu",medianIncome:"Revenu médian",investmentScore:"Score investissement",rentalDemand:"Demande locative",renovationPotential:"Potentiel rénovation",familyAttractiveness:"Attractivité familles",priceForecast:"Prévision prix",gentrification:"Gentrification",opportunityScore:"Indice convergence",rendement:"Rendement",securite:"Sécurité",potentiel:"Potentiel",locatif:"Locatif",prixAppart:"Prix appart",evol5ans:"Ãvol. 5 ans"},tensionLevels:{veryRelaxed:"Très détendu",relaxed:"Détendu",balanced:"Ãquilibré",tense:"Tendu",veryTense:"Très tendu"},infoModal:{understand:"Comprendre cet indicateur",methodology:"Méthodologie",source:"Source"},scoreLabels:{excellent:"Excellent",good:"Bon",moderate:"Modéré",low:"Faible",veryLow:"Très faible"},accessibilityLabels:{accessible:"Accessible",tight:"Tendu",difficult:"Difficile",veryDifficult:"Très difficile"},demandLabels:{strong:"Forte",moderate:"Modérée",low:"Faible"},panel:{summary:"Résumé",details:"Détails",predictive:"Prédictif",analyzeHere:"Analyser un bien ici",premiumRequired:"Fonctionnalité Premium",unlockPremium:"Débloquer avec Premium",moreInfo:"En savoir plus"},alerts:{bubbleRisk:"Ãcart prix/fondamentaux constaté",bubbleRiskDesc:"L'évolution des prix s'écarte significativement des indicateurs économiques locaux.",opportunityWindow:"Indicateurs convergents",opportunityWindowDesc:"Cette commune présente plusieurs indicateurs simultanément favorables selon le modèle Arcanes."},footer:{dataSource:"Données Statbel 2023",communes:"581 communes belges",upgradePremium:"Passez en Premium pour accéder à toutes les métriques"}},KL={title:"Programme de Parrainage",subtitle:"Invitez vos amis à découvrir Arcanes et gagnez des crédits gratuits pour chaque filleul actif !",stats:{totalReferred:"Filleuls inscrits",activeReferred:"Filleuls actifs",creditsEarned:"Crédits gagnés",pending:"En attente"},share:{title:"Partagez votre lien",codeLabel:"Votre code parrain",linkLabel:"Lien de parrainage",copy:"Copier",copied:"Copié !",share:"Partager",shareText:"Découvre Arcanes - L'analyse immobilière en 10 secondes ! Utilise mon lien pour t'inscrire :"},howItWorks:{title:"Comment ça marche ?",step1Title:"Partagez votre lien",step1Desc:"à vos amis investisseurs",step2Title:"Ils s'inscrivent",step2Desc:"Et font une analyse payante",step3Title:"Vous gagnez +2 crédits",step3Desc:"Par filleul actif"},status:{title:"Votre statut Ambassadeur",currentBadge:"Badge actuel",ambassador:"Ambassadeur",activeReferral:"filleul actif",activeReferrals:"filleuls actifs",nextGoal:"Prochain objectif",referrals:"filleuls",remaining:"Encore",toUnlock:"pour débloquer",allUnlocked:"Félicitations !",allUnlockedDesc:"Vous avez débloqué tous les badges"},badges:{title:"Tous les badges",starter:{name:"Débutant",reward:"Commencez à parrainer !"},bronze:{name:"Bronze",reward:"+2 crédits bonus"},silver:{name:"Argent",reward:"+5 crédits bonus"},gold:{name:"Or",reward:"+10 crédits bonus"},platinum:{name:"Platine",reward:"+20 crédits + accès bêta"}}},YL={credits:"Crédit",credits_plural:"Crédits",login:"Se connecter",myAccount:"Mon Compte",loading:"Chargement...",error:"Erreur",success:"Succès",buy:"Acheter",download:"Télécharger",s
598ave:"Ãconomisez",per_credit:"â¬/crédit",year:"an",back:"Retour",next:"Suivant",total:"Total",backToSimulators:"Retour aux simulateurs",calculate:"Calculer",fillForm:"Remplissez le formulaire",locale:"fr-BE",modified:"modifié",years:"ans",monthly:"Mensuel",close:"Fermer",cancel:"Annuler",confirm:"Confirmer",yes:"Oui",no:"Non",month:"mois",annual:"Annuel"},ZL={analysis:"Analyse",simulators:"Simulateurs",pricing:"Tarifs",communes:"Communes",faq:"FAQ",blog:"Blog",contact:"Contact",dashboard:"Dashboard",myProfile:"Mon profil",settings:"Paramètres",myCredits:"Mes crédits",logout:"Déconnexion",defaultUser:"Utilisateur",logoutSuccess:"Déconnexion réussie",logoutError:"Erreur lors de la déconnexion",markAllRead:"Tout marquer comme lu",notificationsSoon:"Notifications bientôt disponibles",notificationsSoonDesc:"Cette fonctionnalité arrive prochainement",noNotifications:"Aucune notification",noNotificationsDesc:"Vous serez notifié des mises à jour importantes",viewAllNotifications:"Voir toutes les notifications",referralTitle:"Parrainage - Gagnez des crédits",leaveBeta:"Quitter la Beta",betaLogoutSuccess:"Déconnexion de la Beta réussie",myDashboard:"Mon Dashboard",profile:"Profil",observatory:"Observatoire",mvv:"Ma Vraie Valeur",explore:"Explorer",resources:"Ressources"},JL={title:"Page introuvable",description:"La page que vous recherchez n'existe pas ou a été déplacée.",home:"Retour à l'accueil",back:"Page précédente"},QL={title:"Benchmark Patrimonial",subtitle:"Comparaison avec les placements classiques",depart:"Départ",an:"An",immo:"Ce Projet (Immo + Levier)",bourse:"Bourse (S&P 500)",epargne:"Ãpargne Sécurisée",immoLabel:"Immobilier",bourseLabel:"Bourse",epargneLabel:"Ãpargne",avecLevier:"Avec effet de levier",insightTitle:"Observation",insightText:"Ce graphique illustre l'impact théorique de l'effet de levier bancaire sur le patrimoine, selon les hypothèses retenues dans cette simulation. Les performances passées ne préjugent pas des résultats futurs."},XL={title:"Revenus Locatifs",loyerMensuel:"Loyer mensuel",loyerMensuelTotal:"Loyer mensuel total",parMois:"par mois",loyerMoyenPorte:"Loyer moyen / porte",loyerM2:"Loyer au m²",loyerAnnuelBrut:"Loyer annuel brut",vacanceLocative:"Vacance locative",taux:"Taux",perteVacanceAnnuelle:"Perte vacance annuelle",loyerAnnuelEffectif:"Loyer annuel effectif",apresVacance:"Après déduction vacance locative",noteTitle:"Bon à savoir",noteExplication:"Le loyer effectif prend en compte une période de vacance locative moyenne. Ce montant représente vos revenus locatifs réels sur l'année."},eB={title:"Coûts d'Acquisition",prixAcquisition:"Prix d'acquisition",droitsEnregistrement:"Droits d'enregistrement",taux:"Taux",fraisNotaire:"Frais de notaire",totalFraisAcquisition:"Total frais d'acquisition",reductionHabitationUnique:"Réduction habitation unique",economieRealisee:"Ãconomie réalisée",abattement:"Abattement",travaux:"Travaux",travauxEnergetiques:"Travaux énergétiques",travauxFinition:"Travaux de finition",etat:"Ãtat initial",totalTravaux:"Total travaux",investissementTotal:"Investissement total",acquisitionFraisTravaux:"Acquisition + Frais + Travaux"},tB={title:"Localisation",adresse:"Adresse",codePostal:"Code postal",ville:"Ville",province:"Province",region:"Région"},nB={bon:"Le prix d'acquisition est inférieur à la valeur de marché estimée par notre algorithme.",mauvais:"Le prix d'acquisition est supérieur à la valeur de marché estimée par notre algorithme. Une marge de négociation pourrait exister.",neutre:"Le prix d'acquisition est dans la fourchette de l'estimation de marché pour ce type de bien."},rB={title:"Financement",montantEmprunte:"Montant emprunté",sur:"sur",ans:"ans",apportRequis:"Apport requis",duTotal:"du total",tauxInteret:"Taux d'intérêt",tauxFixe:"Taux fixe",duree:"Durée",mensualite:"Mensualité",detailAnnee1:"Détail année 1",interetsPayes:"Intérêts payés",capitalRembourse:"Capital remboursé",interets:"Intérêts",capital:"Capital",coutTotalCredit:"Coût total du crédit",interetsTotaux:"Intérêts totaux sur la durée"},aB={title:"Fiscalité",habitationUnique:"Habitation unique",bienSupplementaire:"Bien supplémentaire",rcNonIndexe:"RC non indexé",rcIndexe:"RC indexé",baseImposable:"Base imposable",droitsEnregistrement:"Droits d'enregistrement",montantPaye:"Montant payé",tauxApplique:"Taux appliqué",reduction:"Réduction",economieRealisee:"Ãconomie réalisée",abattementApplique:"Abattement appliqué",fiscaliteLocative:"Fiscalité locative",interetsDeductibles:"Intérêts déductibles (An 1)",revenuNetImposable:"Revenu net imposable (An 1)",tauxMarginal:"Taux marginal",impotLocatif:"Impôt locatif (An 1)",economieTitle:"Ãconomie fiscale réalisée",economieDesc:"Grâce aux réductions appliquées"},iB={title:"Charges Annuelles",precompte:"Précompte immobilier",precompteDetail:"RC indexé: {{montant}}",assuranceIncendie:"Assurance incendie",assurancePNO:"Assurance PNO",maintenance:"Maintenance structurelle",chargesCopro:"Charges copropriété",copro:"Charges copropriété",total:"Total charges",maintenanceStructurelle:"Maintenance structurelle",entretienAnnuel:"Entretien courant",totalCharges:"Total charges annuelles",parMois:"soit {{montant}}/mois",perMonth:"soit {{amount}}/mois",repartition:"Répartition des charges",chargesObligatoires:"Charges obligatoires",chargesEntretien:"Charges d'entretien"},sB={title:"Plan de Financement",subtitle:"Structure du financement et coût du crédit",apport:"Apport Personnel",credit:"Crédit Bancaire",mensualite:"Mensualité",capitalInterets:"Capital + Intérêts",ofInvestment:"de l'investissement",coutCredit:"Coût Total du Crédit",capitalEmprunte:"Capital emprunté",interetsTotaux:"Intérêts totaux",totalRembourse:"Total remboursé",mensualitesDe:"mensualités de",repartition:"Répartition du financement",apportLabel:"Ap
598port",creditLabel:"Crédit"},oB={title:"Indicateurs de Sécurité",loyerEquilibre:"Loyer d'Ãquilibre",pourCashflowZero:"Pour cashflow = 0",couvertureDette:"Couverture Dette",excellent:"Excellent",correct:"Correct",risque:"à risque",pointMort:"Point Mort",patrimoineSupApport:"Patrimoine > Apport",noteTitle:"Bon à savoir",noteText:"Le ratio de couverture dette mesure la capacité du bien à couvrir les mensualités avec ses revenus locatifs. Un ratio > 1.0 indique l'autofinancement."},lB={title:"Analyse de Sensibilité",subtitle:"Impact des variables clés sur le TRI",scenario:"Scénario",tri:"TRI",delta:"Î vs Base",observation:"Observation",base:"Scénario de Base",baseDesc:"Configuration actuelle",loyerPlus:"Loyer +10%",loyerPlusDesc:"Optimisation locative",tauxPlus:"Taux crédit +1%",tauxPlusDesc:"Hausse des taux",reventeMoins:"Revente -10%",reventeMoinsDesc:"Marché baissier",insightTitle:"Observation",insightText:"Dans cette simulation, le TRI est sensible au loyer et au prix de revente. Une variation de loyer de +10% compenserait théoriquement une hausse de taux de +1%.",impactVisuel:"Impact visuel sur le TRI"},dB={title:"Tableau d'Amortissement",subtitle:"Ãvolution sur les années clés",annee:"Année",an:"An",loyer:"Loyer",cashflow:"Cashflow",dette:"Dette",patrimoine:"Patrimoine Net",remboursement:"Progression remboursement"},cB={title:"Fiscalité (Année 1)",baseImposable:"Base imposable (RC indexé)",interetsDeductibles:"Intérêts déductibles",revenuNetImposable:"Revenu net imposable",impotLocatif:"Impôt locatif",aucun:"Aucun",noteNegative:"Les intérêts d'emprunt dépassent le revenu cadastral indexé. Aucun impôt locatif.",notePositive:"Le revenu locatif est imposé au taux marginal sur base du RC indexé majoré de 40%."},uB={title:"Performance Ãnergétique",actuel:"Actuel",objectif:"Objectif",amelioration:"Amélioration",conforme:"Conforme",dejaConforme:"Déjà conforme aux normes PEB",dejaConformeDesc:"Ce bien respecte déjà les standards énergétiques",aucunTravauxRequis:"Aucun travaux énergétiques requis",coutTravaux:"Coût travaux estimé",primes:"Primes estimées",coutNet:"Coût net après primes",aprePrimes:"Après déduction des primes",rentabilite:"Rentabilité énergétique",economieAnnuelle:"Ãconomie annuelle",roi:"Retour investissement",ans:"ans",impactEnergetique:"Impact énergétique",avant:"Avant",apres:"Après",economie:"Ãconomie"},mB={trigger:"Voir les étapes du projet",title:"Ãtapes Types d'un Projet Immobilier",completed:"étapes complétées",step:"Ãtape",allDone:"Toutes les étapes ont été parcourues.",step1:{category:"Finance",title:"Financement",description:"Apport calculé : {{apport}}. Taux de référence utilisé : {{taux}}."},step2:{category:"Juridique",title:"Acte notarié",description:"Frais d'acquisition estimés : {{frais}}."},step3:{category:"Travaux",title:"Travaux énergétiques",description:"Budget estimé : {{budget}} â PEB cible : {{peb}}."},step4:{category:"Gestion",title:"Mise en location",description:"Loyer estimé : {{loyer}}/mois. Indexation annuelle légale applicable."}},pB={title:"Réalité du Marché",decomposition:"Décomposition du projet",prixAcquisition:"Prix d'acquisition",frais:"Frais (~12.5%)",travaux:"Travaux",coutTotal:"Coût Total",margeLatente:"Ãcart Latent",gainAchat:"Ãcart entre coût total et estimation après travaux",margeExplication:"Différence entre le coût total du projet et l'estimation de marché après rénovation.",arvIndisponible:"ARV non disponible",arvNote:"La valeur après travaux sera estimée après analyse du marché local.",ecartMarche:"Ãcart vs Marché",sousMarche:"En-dessous de l'estimation de marché",surMarche:"Au-dessus de l'estimation marché",arv:"ARV (After Repair Value)"},gB={title:"Simulation",modified:"Modifiée",reset:"Réinitialiser",prixAcquisition:"Prix d'acquisition",tauxCredit:"Taux crédit",dureeCredit:"Durée crédit",apport:"Apport",budgetTravaux:"Budget travaux",loyerMensuel:"Loyer mensuel"},hB={actions:"Actions",planifier:"Planifier une visite",contacter:"Contacter l'agence",expert:"Parler à un expert",aide:"Aide & Support"},fB={title:"Plan de Transformation",avant:"Situation Actuelle",pebActuel:"PEB actuel",budget:"Budget Travaux",primes:"Primes",coutNet:"Coût net",economie:"Ãconomie",retour:"Retour",dejaConforme:"Déjà Conforme â",apresTravaux:"Après Travaux",objectif:"Objectif 2050",niveau:"Niveau"},vB={title:"Projection 10 ans",tri:"TRI (10 ans)",multiplicateur:"Multiplicateur",scenarioRevente:"Scénario Revente (Année 10)",valeurFuture:"Valeur future",appreciation:"Appréciation totale",fraisVente:"Frais vente (~4%)",detteRestante:"Dette restante",patrimoineNet:"Patrimoine Net",cashflowsCumules:"Cashflows cumulés (10 ans)",cashflowsNote:"Effort de trésorerie total avant revente",gainsTotaux:"Gains Totaux (10 ans)",gainsNote:"Cashflows + Plus-value revente"},bB={prix:"Prix",travaux:"Travaux",total:"Total",mensualite:"Mensualité"},yB={title:"Compte d'Exploitation",subtitle:"Détail des flux financiers (Année 1)",poste:"Poste",loyersBruts:"(+) Loyers Bruts",vacance:"(-) Vacance locative (5%)",loyersEffectifs:"= Loyers Effectifs",chargesProprietaire:"(-) Charges propriétaire",noi:"= NOI",mensualiteCredit:"(-) Mensualité Crédit",cashflowNet:"= CASHFLOW NET",autofinance:"Les revenus locatifs couvrent les charges et mensualités dans cette simulation.",effortEpargne:"Cette simulation fait apparaître un effort de trésorerie de {{amount}}/mois."},wB={gate:{title:"Créez votre compte pour débloquer cet outil",description:"Accédez gratuitement à tous nos simulateurs et analyses professionnels",benefit1:"Tous les simulateurs immobiliers (TRI, rendement, frais d'acte...)",benefit2:"Analyses complètes de biens immobiliers avec IA",benefit3:"Export PDF de vos calculs et analyses",createAccount:"Créer mon compte gratuitement",alreadyHaveAccount:"Déjà un compte ? Se connecter"},gateDialog:{title:"Créez votre compte pour continuer",description:"Accédez gratuitement à tous nos outils d'analyse immobilière",benefit1:"Tous les simulateurs immobiliers (TRI, rendement, frais d'acte...)",benefit2:"Analyses complètes et détaillées de biens immobiliers",benefit3:"1 crédit d'analyse offert à l'inscription",createAccount:"Créer mon compte gratuitement",alreadyHaveAccount:"Déjà un compte ? Se connecter"},login:{title:"Bon retour parmi nous",subtitle:"Connectez-vous pour accéder à vos analyses",email:"Email",emailPlaceholder:"[email protected]",password:"Mot de passe",forgotPassword:"Mot de passe oublié ?",submit:"Se connecter",loading:"Connexion...",noAccount:"Pas encore de compte ?",createAccount:"Créer un compte",success:"Connexion réussie",welcome:"Bienvenue !",error:"Erreur de connexion",validationError:"Erreur de validation",genericError:"Une erreur est survenue lors de la connexion",rightPanel:{title:"Vos analyses immobilières,",titleHighlight:"toujours accessibles",description:"Retrouvez vos rapports, suivez vos projets et accédez à des données précises et actualisées.",stat1Value:"10K+",stat1Label:"Analyses générées",stat2Value:"<15s",stat2Label:"Temps moyen d'analyse",stat3Value:"500+",stat3Label:"Utilisateurs actifs",stat4Value:"98%",stat4Label:"Taux de précision"}},reset:{title:"Réinitialiser le mot de passe",subtitlePending:"Entrez votre email pour recevoir un lien de réinitialisation",subtitleSent:"Un email de réinitialisation a été envoyé",email:"Adresse email",emailPlaceholder:"[email protected]",submit:"Envoyer le lien",loading:"Envoi en cours...",backToLogin:"Retour à la connexion",emailSent:"Email envoyé",emailSentDescription:"Vérifiez votre boîte mail pour réinitialiser votre mot de passe",emailSentTo:"Un email a été envoyé à ",emailSentInstruction:"Cliquez sur le lien dans l'email pour réinitialiser votre mot de passe.",noEmailReceived:"Vous n'avez pas reçu l'email ?",retry:"Réessayer",error:"Erreur",validationError:"Erreur de validation",genericError:"Une erreur est survenue"},update:{title:"Nouveau mot de passe",subtitle:"Choisissez un mot de passe sécurisé",newPassword:"Nouveau mot de passe",confirmPassword:"Confirmer le mot de passe",submit:"Mettre à jour",loading:"Mise à jour...",strength:"Force",strengthWeak:"Faible",strengthMedium:"Moyen",strengthGood:"Bon",strengthExcellent:"Excellent",check8chars:"8+ caractères",checkUppercase:"Majuscule",checkLowercase:"Minuscule",checkNumber:"Chiffre",checkSpecial:"Caractère spécial",passwordsMatch:"Les mots de passe correspondent",passwordsDontMatch:"Les mots de passe ne correspondent pas",success:"Mot de passe mis à jour !",successDescription:"Votre mot de passe a été changé avec succès",error:"Erreur",validationError:"Erreur de validation",genericError:"Une erreur est survenue"}},kB={scrollToAnalyze:"Scrollez pour analyser",analyzing:"Analyse en cours",analysisComplete:"Analyse terminée",summary:{investment:"Ce bien présente un TRI calculé de {{tri}} sur 10 ans avec un cashflow mensuel de {{cashflow}}.",undermarket:"Le bien est positionné {{pct}}% sous le prix du marché local.",overmarket:"Attention: le bien est positionné {{pct}}% au-dessus du marché.",opportunity:"Prix constaté significativement en-dessous de l'estimation de marché.",underpriced:"Prix constaté légèrement en-dessous de l'estimation de marché.",overpriced:"Prix constaté au-dessus de l'estimation de marché.",positive:"Ce bien présente un TRI calculé de {{tri}} sur 10 ans avec un cashflow mensuel positif de {{cashflow}}.",negative:"Ce bien présente un TRI calculé de {{tri}} sur 10 ans. Le cashflow mensuel de {{cashflow}} implique un effort d'épargne.",fairprice:"Prix dans la fourchette de l'estimation de marché locale.",default:"Analyse en cours..."}},xB={badge:"Nouveau : Analyse 2.0",headline:"L'analyse immobilière data-driven.",subheadline:"Obtenez les indicateurs clés de n'importe quelle annonce immobilière en quelques secondes.",inputPlaceholder:"Collez un lien d'annonce immobilière...",ctaButton:"Analyser",scoreLabel:"Indice Synthétique",metrics:{cashflow:"Cashflow",cashflowValue:"+245â¬/mois",profitability:"Rentabilité",profitabilityValue:"7.2%",pricePerSqm:"Prix/m²",pricePerSqmValue:"-8% vs marché"}},jB={ad:{price:"⬠385,000",ref:"Réf: IMO-2024-5847",title:"Belle Maison Familiale à Waterloo",location:"Avenue des Sapins, 1410 Waterloo",description:{part1:"Magnifique maison familiale offrant une",surface:"surface",part2:"habitable de",surfaceValue:"145 m²",part3:", idéalement située dans un quartier calme et résidentiel. Cette propriété comprend",roomsValue:"5 pièces",part4:"spacieuses dont 3 chambres lumineuses, parfaites pour une famille."},details:{typeLabel:"Type",part1:"de bien :",typeValue:"Maison",part2:"4 façades avec jardin arboré de 300m².",conditionLabel:"Ãtat",part3:"général :",conditionValue:"Correct",part4:", nécessitant quelques travaux de rafraîchissement. Chauffage au gaz, double vitrage, garage pour 2 voitures."},features:{surface:"Surface",rooms:"Pièces",bedrooms:"Chambres",energy:"Ãnergétique"},buttons:{contact:"Contacter l'agent",visit:"Planifier visite"}},chart:{title:"Analyse IA Complète",subtitle:"Ãvaluation sur 4 critères clés",scoreGlobal:"Score Global",criteria:{priceVsMarket:"Prix vs Marché",cashflow:"Cashflow",roi:"ROI",profitability:"Rentabilité"},propertyCard:{priceLabel:"PRIX",priceValue:"450kâ¬",location:"Paris 16ème - Avenue Foch",surfaceLabel:"SURFACE",surfaceValue:"85 m²",roomsLabel:"PIÃCES",roomsValue:"4 pièces",typeLabel:"TYPE",typeValue:"Appartement",conditionLabel:"ÃTAT",conditionValue:"Excellent"},buttons:{start:"Commencer l'analyse",pricing:"Voir les tarifs"}}}
598,AB={hero:{badge:"Nouveau : Analyse 2.0",title1:"L'infrastructure",title2:"d'évaluation",title3:"immobilière",subtitle:"Transformez n'importe quelle annonce en",subtitleHighlight:"rapport d'évaluation complet.",subtitleTime:"En 10 secondes.",ctaMobile:"Analyser gratuitement",trust1:"100% Sécurisé",trust2:"Analyse en 10 secondes",trust3:"+15,000 analyses",cardTitle:"Maison 4 façades",cardLocation:"Uccle, Bruxelles",opportunityTitle:"Analyse terminée",opportunitySubtitle:"Rendement brut calculé : 2.3% au-dessus de la moyenne",metricCashflow:"Cashflow",metricTRI:"TRI 10 ans",metricPrice:"Prix/m²",floatingCardLabel:"Aujourd'hui",floatingCardTitle:"Volume net",savingsLabel:"Ãcart constaté",betaLogoutSuccess:"Déconnexion de la Beta réussie"},dataHub:{badge:"Exploration data-driven",title:"581 communes. 43 indicateurs. Une plateforme.",subtitle:"Explorez le marché immobilier belge commune par commune, ou utilisez le screener interactif pour identifier votre zone d'investissement idéale.",communes:{title:"Annuaire des Communes",description:"Chaque commune belge, décryptée. 42 indicateurs par fiche : prix, fiscalité, démographie, énergie, rendement. Recherche par nom ou code postal.",stat1:"communes",stat2:"indicateurs",stat3:"régions",cta:"Explorer toutes les communes"},screener:{title:"Screener Interactif",description:"Carte Leaflet + tableau triable. Filtres min/max, score composite, 12 stratégies intelligentes (Cashflow Max, Premier achat, Plus-value...). Export PDF.",pill1:"43 indicateurs",pill2:"Score composite",pill4:"12 stratégies",cta:"Ouvrir le screener"}},simulators:{badge:"Outils gratuits",title:"Simulateurs immobiliers",subtitle:"6 outils gratuits pour préparer votre investissement immobilier en Belgique",launchCta:"Lancer le simulateur",viewAll:"Voir tous les simulateurs",previewLabel:"Aperçu du résultat",preview:{registrationRights:"Droits d'enregistrement",notaryFees:"Honoraires notaire",adminFees:"Frais administratifs",totalFees:"Total des frais",perMonth:"par mois",duration:"Durée",rate:"Taux",total:"Total",maxBudget:"Budget maximum",monthly:"Mensualité",debtRatio:"Taux d'endettement",consumption:"Consommation",annualCost:"Coût annuel",grossYield:"Rendement brut",netYield:"Rendement net",cashflow:"Cashflow",tri:"TRI sur 10 ans",totalGain:"Gain total",over:"Sur"},notaryFees:{title:"Frais d'acte",description:"Calculez les frais de notaire et droits d'enregistrement selon votre région",badge:"Populaire"},mortgage:{title:"Prêt hypothécaire",description:"Simulez vos mensualités et le coût total de votre crédit immobilier",badge:"Essentiel"},borrowingCapacity:{title:"Capacité d'emprunt",description:"Découvrez votre budget maximum en fonction de vos revenus"},peb:{title:"Impact PEB",description:"Ãvaluez l'impact énergétique sur vos charges et la valeur du bien",badge:"Nouveau"},rentalYield:{title:"Rendement locatif",description:"Calculez le rendement brut, net et le cashflow de votre investissement",badge:"Investisseur"},tri:{title:"TRI & Projection",description:"Projetez votre investissement sur 10 ans avec le taux de rendement interne",badge:"Avancé"},propertyTax:{title:"Précompte immobilier",description:"Estimation du précompte immobilier selon la formule officielle belge, par commune et par région.",badge:"NOUVEAU"}},faq:{badge:"Questions fréquentes",title:"Vos questions, nos réponses",subtitle:"Tout ce que vous devez savoir sur Arcanes et nos analyses immobilières",moreQuestions:"Vous avez d'autres questions ?",viewAll:"Consulter la FAQ complète"},blog:{badge:"Ressources & Guides",title:"Notre blog immobilier",subtitle:"Analyses de marché, données clés et guides pratiques pour comprendre l'immobilier belge",trending:"Tendance",readMore:"Lire l'article",viewAll:"Voir tous les articles"},howItWorks:{badge:"Processus simplifié"},features:{badge:"Fonctionnalités",complete:{title:"Analyse complète",desc:"TRI, cashflow, rendement brut/net, projection 10 ans, sensibilité aux taux"},benchmark:{title:"Benchmark marché",desc:"Comparaison automatique avec les prix moyens de votre zone géographique"}
598,instant:{title:"Instantané",desc:"Résultats en moins de 10 secondes grâce à notre infrastructure optimisée"},pdf:{title:"Rapport PDF Pro",desc:"Export professionnel de 11 pages avec graphiques et indicateurs détaillés"}},pricing:{badge:"Tarifs simples",freeSubtitle:"Parfait pour tester",freeCta:"Commencer gratuitement",popularBadge:"Le plus populaire",startingFrom:"à partir de",perAnalysis:"analyse"},cta:{badge:"1 analyse gratuite incluse"}},EB={title:"Glossaire & Méthodologie",subtitle:"{count} concepts détaillés pour comprendre la mécanique de nos analyses.",search:"Rechercher une définition (ex: ARV, TRI, Rebond...)",noResults:'Aucun résultat pour "{query}"',tabs:{habitation:"Achat Résidence (Habitation)",investissement:"Investissement Locatif"},categories:{bien:"Le Bien & L'Estimation",valorisation:"Valorisation & Prix de Marché",couts:"Coûts, Travaux & Ãnergie",financement:"Banque & Financement",fiscalite:"Fiscalité & Taxes",revenus:"Revenus Locatifs & Vacance",charges:"Charges & Assurances",kpi:"Indicateurs de Rentabilité (KPI)",projection:"Projection Patrimoniale (10 ans)",peb:"Performance Ãnergétique",scoreHabitation:"Indice Synthétique Arcanes"},terms:{bien:{surface:{term:"Surface Habitable Pondérée",definition:"Surface utilisée comme base pour tous les calculs de prix au m². Elle comprend les espaces de vie chauffés. Pour les calculs de valeur, Arcanes applique une pondération : les petites surfaces (studios) valent plus cher au m² que les très grandes surfaces (villas), ce que notre algorithme corrige automatiquement."},type:{term:"Type de bien",definition:"La catégorie du bien (Appartement, Maison, Immeuble de rapport) influence radicalement la structure de coûts. Par exemple, un appartement inclut des charges de copropriété (syndic) et une maintenance plus faible, alors qu'une maison ne paie pas de syndic mais nécessite une maintenance structurelle plus élevée (toiture, façades)."},etat:{term:"Ãtat du bien (Coefficient)",definition:"Ãvaluation objective de la condition visuelle du bien. Notre algorithme applique un coefficient multiplicateur sur le prix de base : un bien 'à rénover' subit une décote automatique (0.80), tandis qu'un bien 'Neuf' ou 'Excellent' bénéficie d'une surcote (1.18 à 1.25) pour refléter la prime à la qualité.",formula:"Coef : Ruine (0.65) à Neuf (1.18)"},atouts:{term:"Atouts Valorisés",definition:"Ãléments de confort spécifiques détectés dans l'annonce qui augmentent la valeur vénale et locative. Contrairement à une estimation générique, Arcanes ajoute des bonus cumulatifs pour le Jardin, la Terrasse ou le Parking, car ces éléments se paient cher en zone urbaine.",example:"Jardin (+3 à 5%), Terrasse (+2 à 3%), Parking (+100â¬/mois de loyer)."}},valorisation:{estActuel:{term:"Prix m² Estimé (Actuel)",definition:"La 'Juste Valeur' théorique du bien dans son état actuel, avant le moindre travail. Elle est calculée en croisant les données de marché régionales avec la précision du Code Postal, ajustée par l'état de vétusté, la performance énergétique (PEB) et les atouts spécifiques.",formula:"Base Régionale à Coef. Code Postal à Coef. Ãtat à Coef. PEB à Atouts"},arv:{term:"ARV (After Repair Value)",definition:"Valeur projetée du bien une fois les travaux terminés. C'est une simulation d'un bien 'Parfait' (Ãtat Neuf + PEB Cible A/B) dans ce quartier précis. Si le quartier est très prisé ('Premium'), l'ARV inclut un 'Bonus Rareté' car les biens rénovés s'y vendent à prix d'or.",formula:"Prix Base à Coef. Quartier à Coef. Ãtat (Rénové) à Bonus Rareté"},bonusRarete:{term:"Bonus Rareté",definition:"Mécanisme exclusif Arcanes. Si vous rénovez un bien pour le rendre très performant (PEB A/B) dans une zone à forte demande (ex: Ixelles, Uccle, Lasne...), le marché paie une prime supplémentaire 'Coup de CÅur' que nous ajoutons à l'estimation finale.",formula:"+5% (Zone Premium) à +10% (Zone Ultra-Premium)"},margeLatente:{term:"Marge Latente",definition:"Ãcart entre l'estimation de marché après travaux (ARV) et le coût total du projet (Achat + Travaux). Si cet écart est positif, le coût total est inférieur à l'estimation finale. Cet écart est théorique et basé sur des estimations algorithmiques.",formula:"ARV - (Prix Achat + Budget Travaux)"},ecart:{term:"Ãcart vs Marché",definition:"Comparaison entre le prix demandé par le vendeur et notre estimation algorithmique. Un écart négatif (ex: -10%) signifie que le bien est affiché en-dessous de sa valeur théorique, signalant une opportunité potentielle.",formula:"(Prix Demandé - Estimation) / Estimation"}},couts:{fraisAcq:{term:"Frais d'Acquisition",definition:"L'ensemble des coûts 'à fonds perdus' payés lors de l'achat. Arcanes calcule précisément les Droits d'Enregistrement (selon la région et le régime fiscal), les honoraires notariaux (barémiques) et les frais administratifs divers.",formula:"Droits Enregistrement + Honoraires Notaire + Frais Admin + TVA"},travauxEnergie:{term:"Travaux Ãnergétiques",definition:"Budget estimé pour faire passer le bien du PEB actuel à l'objectif 2050 (Label A ou B). Le coût est calculé sur base de l'écart de consommation (kWh/m²) et inclut l'isolation, le chauffage et les châssis.",formula:"Ãcart de score (kWh) à Coût unitaire régional"}
598,travauxFinit:{term:"Travaux de Finition",definition:"Budget cosmétique (cuisine, sols, peinture, électricité) calculé indépendamment des travaux énergétiques. Il est basé sur un forfait au m² selon l'état visuel déclaré (de 0⬠pour du neuf à 1000⬠pour une ruine totale).",formula:"Forfait m² : de 0⬠(Neuf) à 1000⬠(Ruine)"},tvaRenov:{term:"Taux TVA Rénovation",definition:"Taux de TVA appliqué sur les travaux. L'algorithme détecte automatiquement l'âge du bâtiment : si > 10 ans, le taux réduit de 6% est appliqué, ce qui allège considérablement le budget travaux.",formula:"6% si bâtiment > 10 ans, sinon 21%"},effetRebond:{term:"Effet Rebond (Ãnergie)",definition:"Correction comportementale appliquée aux passoires thermiques (PEB F/G). En réalité, les occupants de ces logements chauffent moins que la théorie pour limiter les coûts. L'économie réelle après travaux est donc souvent inférieure à l'économie théorique. Arcanes corrige ce biais pour ne pas surestimer votre gain mensuel.",formula:"Conso Réelle = 75% de la Conso Théorique pour PEB F/G"}},charges:{maintenance:{term:"Maintenance Structurelle",definition:"Provision financière pour les grosses réparations futures (toiture, façade, chaudière) qui incombent au propriétaire. Calculée au m² pour plus de précision : un bien rénové demande moins de maintenance (8â¬/m²) qu'un bien ancien (18â¬/m²).",formula:"8 â¬/m²/an (si Rénové) OU 18 â¬/m²/an (si Ancien)"},copro:{term:"Charges Copropriété",definition:"Pour les appartements uniquement : estimation des frais de syndic, nettoyage des communs et ascenseur. Si la donnée n'est pas fournie, Arcanes applique une estimation standard basée sur la taille du bien.",formula:"Estimé à ~1.5 à 2⬠/ m² / mois (si non renseigné)"},assurance:{term:"Assurance Incendie",definition:"Estimation de la prime annuelle (PNO ou Habitation) basée sur la valeur de reconstruction à neuf du bâtiment (environ 1500-1800â¬/m²).",formula:"Surface à Coût Reconstruction à Taux Assurance"},entretien:{term:"Provision Entretien",definition:"Budget pour le petit entretien courant (robinetterie, joints, petites réparations) à la charge de l'occupant (locataire ou propriétaire).",formula:"0.5% du prix du bien / an"}},financement:{investTotal:{term:"Investissement Total",definition:"Le montant global du projet, 'Clé en main'. C'est la somme du Prix d'achat, des Frais d'acquisition (taxes) et de l'enveloppe Travaux totale. C'est sur ce montant que la rentabilité doit être calculée.",formula:"Prix Achat + Frais Acquisition + Total Travaux"},mensualite:{term:"Mensualité Crédit",definition:"Simulation du remboursement bancaire mensuel (Capital + Intérêts) sur base d'un taux fixe standard sur 20 ans.",formula:"Amortissement standard (Taux fixe 20 ans)"},apport:{term:"Apport Requis",definition:"Montant minimum de fonds propres à investir. Il couvre généralement les Frais d'acquisition (non finançables) + une quote-part du prix (souvent 10 à 20%) exigée par les banques.",formula:"Investissement Total - Montant Emprunté"},quotite:{term:"Quotité (LTV)",definition:"Loan-to-Value. Le pourcentage du projet que la banque accepte de financer. Plus la quotité est élevée, plus l'effet de levier est fort, mais plus le risque est grand.",example:"Quotité 80% = Vous apportez 20% + les frais."},coutCredit:{term:"Coût Total Crédit",definition:"La somme totale des intérêts payés à la banque sur toute la durée du prêt. C'est le 'prix' de l'argent emprunté.",formula:"(Mensualité à Durée) - Capital Emprunté"}},revenus:{loyerRef:{term:"Loyer de Référence",definition:"Le loyer de marché standard pour ce type de bien dans la région, ajusté par la taille. Notre algorithme applique une 'dégression' : un petit studio se loue plus cher au m² qu'une grande villa.",formula:"Moyenne Régionale (â¬/m²) à Coef. Surface"},loyerProjete:{term:"Loyer Projeté (Optimisé)",definition:"Le loyer estimé une fois le bien entièrement rénové. Il valorise la qualité supérieure du bien (Ãtat Neuf, Isolation Top) et la localisation, mais avec une atténuation pour rester réaliste (les loyers ne montent pas aussi haut que les prix de vente).",formula:"Loyer Réf à Coef. Quartier (Atténué) à Ãtat (Neuf) à PEB (A)"},vacance:{term:"Vacance Locative",definition:"Provision de sécurité financière correspondant aux périodes sans locataire (entre deux baux). Arcanes compte par défaut 5% de perte annuelle.",formula:"Forfait de 5% du Loyer Annuel Brut (~1 mois de vide tous les 20 mois)"},loyerEffectif:{term:"Loyer Effectif",definition:"Ce qui rentre réellement sur le compte bancaire après avoir déduit la provision pour vacance locative.",formula:"Loyer Brut - Vacance"}},kpi:{rendementBrut:{term:"Rendement Brut",definition:"Indicateur de performance 'facial' souvent affiché dans les annonces. Il ne tient compte ni des frais d'achat, ni des charges, ni des travaux.",formula:"(Loyer Annuel / Prix Achat) à 100"},rendementNet:{term:"Rendement Net",definition:"La vraie rentabilité de la 'brique', avant crédit. Elle prend en compte le coût total du projet (frais et travaux inclus) et déduit les charges non récupérables.",formula:"(Loyer - Charges - Vacance) / Investissement Total"}
598,cashflow:{term:"Cashflow Mensuel",definition:"Le flux de trésorerie net : ce qu'il reste sur votre compte à la fin du mois une fois le crédit, les charges et les impôts payés. S'il est positif, le bien s'autofinance.",formula:"(Loyer Net - Crédit - Charges - Impôts) / 12"},tri:{term:"TRI (10 ans)",definition:"Taux de Rentabilité Interne. Rendement annualisé calculé sur les fonds propres investis. Il intègre les loyers, les charges, le crédit et la plus-value estimée à la revente.",formula:"Flux de trésorerie + Plus-Value à la revente (sur ARV)"},multiplicateur:{term:"Multiplicateur Apport",definition:"Facteur d'enrichissement : combien chaque euro investi de votre poche au départ vous a rapporté au final (cash cumulé + vente).",formula:"(Cash cumulé + Cash revente) / Apport Initial"}},peb:{score:{term:"Score PEB",definition:"Consommation d'énergie primaire du logement en kWh/m²/an."},travaux:{term:"Travaux PEB",definition:"Estimation du coût pour atteindre la cible énergétique (A ou B)."},economie:{term:"Gain Ãnergétique",definition:"Réduction estimée de la facture annuelle, corrigée par l'effet comportemental (rebond).",formula:"(Conso Avant - Conso Après) à Prix kWh"},primes:{term:"Primes Estimées",definition:"Estimation des subsides régionaux déduits du coût brut des travaux énergétiques."}},fiscalite:{droits:{term:"Droits d'Enregistrement",definition:"Taxe régionale due à l'achat. L'algorithme applique automatiquement le taux en vigueur (Bxl, Wallonie, Flandre) et les régimes préférentiels.",formula:"Bxl 12.5% | Wal 12.5% | Fl 3% (si unique) ou 12%"},fraisNotaire:{term:"Frais de Notaire",definition:"Honoraires du notaire (fixés par la loi) + Frais administratifs de recherche.",formula:"Barème dégressif + ~1000⬠Admin + TVA"},precompte:{term:"Précompte Immobilier",definition:"Taxe foncière annuelle payée à la région et à la commune.",formula:"RC Indexé à Taux Régional à Centimes Communaux"},baseImposable:{term:"Base Imposable (IPP)",definition:"Revenu fictif ajouté à vos revenus professionnels pour le calcul de l'impôt (Investissement en personne physique).",formula:"Revenu Cadastral (RC) Indexé à 1.40"},habUnique:{term:"Habitation Unique",definition:"Statut fiscal permettant d'obtenir des taux réduits (ex: 3% en Flandre) ou des abattements (Bruxelles/Wallonie) si c'est votre seul bien."}},scoreHabitation:{global:{term:"Indice Synthétique",definition:"Note de synthèse /100 calculée par Arcanes. Elle pondère 3 critères : prix (60%), qualité PEB (25%), accessibilité (15%).",formula:"60% Prix + 25% Qualité (PEB) + 15% Accessibilité"},verdict:{term:"Positionnement Prix",definition:"Constat factuel du positionnement prix par rapport à l'estimation de marché.",example:"'En-dessous de l'estimation', 'Dans la fourchette', 'Au-dessus de l'estimation'"}}}},PB={howItWorks:{title:"Comment ça marche",step1:{title:"1. Partagez l'annonce",description:"Collez simplement le lien de votre annonce immobilière. Notre algorithme Arcanes analyse instantanément toutes les données."},step2:{title:"2. Analyse algorithmique complète",description:"Notre technologie examine les prix du marché, les performances énergétiques et le potentiel d'investissement."},step3:{title:"3. Rapport détaillé",description:"Recevez un rapport complet avec indicateurs, projections et points d'attention."}},whyChoose:{title:"Pourquoi choisir Arcanes ?",precision:{title:"Précision maximale",description:"Nos algorithmes analysent des milliers de données pour vous donner les informations les plus précises du marché."},freeAnalysis:{title:"Analyse gratuite",description:"Commencez avec une analyse gratuite pour découvrir la puissance de notre plateforme sans engagement."},security:{title:"Sécurité garantie",description:"Vos données sont protégées avec les plus hauts standards de sécurité et de confidentialité."}},whoIsItFor:{title:"à qui s'adresse Arcanes ?",subtitle:"Un outil pour trois profils immobiliers.",primaryResidence:{title:"Résidence principale",feature1:"Analyse valeur réelle",feature2:"Comparatif prix/m² vs marché",feature3:"Clarté sur travaux et coûts futurs",feature4:"Objectivation de l'achat",conclusion:"Sécuriser une décision émotionnelle."},rentalInvestment:{title:"Investissement locatif",feature1:"Rendement brut & net",feature2:"Cashflow projeté",feature3:"Paramètres belges : PEB, RC, fiscalité",feature4:"Analyse du potentiel long terme",conclusion:"Estimer le potentiel d'autofinancement."},apartmentBuilding:{title:"Immeuble de rapport",feature1:"Analyse par unité + revenus globaux",feature2:"Prix/porte + taux de vacance estimé",feature3:"Détection d'incohérences",feature4:"Vue consolidée pour banque",conclusion:"Décider rapidement si le bien vaut une visite."}},plans:{title:"Analyse gratuite ou analyse avancée. à vous de choisir.",subtitle:"Commencez gratuitement, passez en premium seulement si le projet avance.",free:{badge:"Découverte",title:"Gratuit, illimité",includes:"Inclut",notIncludes:"N'inclut pas",feature1:"Score global du bien",feature2:"Ãtat général",feature3:"Prix/m² vs marché",feature4:"Indice énergétique",feature5:"Constat synthétique",missing1:"Cashflow / rendement",missing2:"Détail travaux",missing3:"Projection long terme",missing4:"Export PDF"},premium:{badge:"Complet / Décision",title:"Pour décider et négocier",includes:"Inclut",feature1:"Analyse habitation ou investissement",feature2:"Rendement, cashflow, TRI simplifié",feature3:"Scénarios financiers & risques",feature4:"Estimation travaux + timeline",feature5:"Simulations personnalisées",feature6:"Export PDF professionnel",feature7:"Option projection 10 ans",cta:"1 anal
598yse premium offerte à l'inscription"}},testimonials:{title:"Ce que disent nos utilisateurs",subtitle:"Découvrez les retours d'expérience de nos utilisateurs",testimonial1:{quote:"Arcanes m'a permis d'identifier le potentiel caché de plusieurs biens. Les analyses sont d'une précision remarquable et m'ont fait gagner un temps considérable.",name:"S. D.",role:"Investisseuse immobilière"},testimonial2:{quote:"En tant qu'agent immobilier, j'utilise Arcanes quotidiennement pour conseiller mes clients. L'outil est devenu indispensable dans mon activité.",name:"M. L.",role:"Agent immobilier"}},cta:{title:"Prêt à analyser votre prochain bien immobilier ?",subtitle:"Commencez dès maintenant avec une analyse gratuite et découvrez le potentiel de votre investissement.",button:"Commencer l'analyse gratuite"}},CB={title:"Analyse Gratuite",subtitle:"Collez l'URL d'une annonce immobilière pour obtenir une analyse détaillée",urlPlaceholder:"https://www.immoweb.be/fr/annonce/...",uploadDocument:"Ou téléchargez un document",startAnalysis:"Démarrer l'analyse",analyzing:"Analyse en cours...",results:"Résultats de l'analyse",download:"Télécharger le PDF",errors:{invalidUrl:"URL invalide",analysisError:"Erreur lors de l'analyse",noCredits:"Crédits insuffisants"}},SB={title:"Simulateurs Immobiliers",share:{title:"Partager",copyLink:"Copier le lien",linkCopied:"Lien copié !"},subtitle:"Des outils de calcul précis pour anticiper chaque aspect de votre projet immobilier en Belgique. Gratuits, instantanés et sans engagement.",notaryFees:{title:"Frais d'Acte d'Achat",description:"Estimez précisément vos frais de notaire et droits d'enregistrement selon votre région.",badge:"Essentiel",pageTitle:"Simulateur de Frais d'Acte",pageSubtitle:"Estimez précisément vos frais de notaire pour l'achat de votre bien immobilier en Belgique",propertyInfo:"Informations du bien",fillInfo:"Remplissez les informations ci-dessous pour obtenir une estimation détaillée",region:"Région",selectRegion:"Sélectionnez une région",wallonia:"Wallonie",brussels:"Bruxelles-Capitale",flanders:"Flandre",walloniaInfo:"Taux standard : 12,5% | Taux réduit (1er achat) : 3%",brusselsInfo:"Taux standard : 12,5% | Abattement possible jusqu'à 200 000 â¬",flandersInfo:"Taux standard : 10% | Taux réduit (1er achat) : 3%",propertyType:"Type de bien",house:"Maison",apartment:"Appartement",land:"Terrain",price:"Prix d'achat (â¬)",pricePlaceholder:"ex: 250000",priceRange:"Montant entre 50 000 ⬠et 2 000 000 â¬",options:"Options",firstPurchase:"Première acquisition (habitation propre et unique)",firstPurchaseTooltip:"Vous bénéficiez d'un taux réduit si vous n'êtes pas déjà propriétaire d'un autre bien et que vous comptez habiter ce logement.",newProperty:"Bien neuf (TVA applicable au lieu des droits d'enregistrement)",mortgage:"Financement par crédit hypothécaire",calculate:"Calculer les frais",reset:"Réinitialiser",faqTitle:"Questions fréquentes",faq1Question:"Quelle est la différence entre droits d'enregistrement et TVA ?",faq1Answer:"Les droits d'enregistrement s'appliquent aux biens existants : 12,5% en Wallonie et Bruxelles (taux réduit de 3% en Wallonie pour l'habitation propre et unique), 12% en Flandre (taux réduit de 2%). La TVA de 21% s'applique aux constructions neuves vendues par un assujetti (promoteur, entrepreneur). Attention : pour le neuf, la TVA porte sur la construction et les droits d'enregistrement sur le terrain.",faq2Question:"Comment bénéficier du taux réduit ?",faq2Answer:"Vous ne devez pas posséder la totalité en pleine propriété d'un autre bien destiné à l'habitation (en Belgique ou à l'étranger) et vous engager à y établir votre résidence principale dans les 3 ans suivant l'acte. Si vous êtes déjà propriétaire, vous pouvez bénéficier du taux réduit à condition de revendre votre bien existant dans les 2 à 3 ans selon la région.",faq3Question:"Ces frais sont-ils négociables ?",faq3Answer:"Les droits d'enregistrement et la TVA sont fixés par la loi et non négociables. Les honoraires du notaire suivent un barème légal (AR du 16 décembre 1950) identique chez tous les notaires belges. Seuls les frais administratifs peuvent légèrement varier d'une étude à l'autre (généralement entre 800⬠et 1.200â¬).",resultTitle:"Résultat de l'estimation",purchasePrice:"Prix d'achat",registrationRights:"Droits d'enregistrement",vat:"TVA (21%)",notaryFees:"Honoraires notaire (TTC)",adminFees:"Frais administratifs",totalEstimated:"Total estimé",feesPercentage:"Frais : {amount} ({percentage}% du prix)",costsBreakdown:"Répartition des coûts",globalView:"Vue globale",feesDetail:"Détail des frais",disclaimer:"Cette estimation est fournie à titre indicatif. Pour un calcul définitif, consultez votre notaire qui tiendra compte de votre situation spécifique.",exp
598ortPDF:"Exporter en PDF",learnMore:"En savoir plus sur les frais d'acquisition â",completeForm:"Complétez le formulaire pour obtenir votre estimation",ctaTitle:"Tout comprendre sur les frais d'acte en Belgique",ctaDescription:"Droits d'enregistrement, honoraires notariaux, frais hypothécaires : découvrez le détail complet et les erreurs à éviter pour anticiper votre budget d'acquisition.",ctaButton:"Lire le guide complet",footerCopyright:"Arcanes. Simulateur à titre informatif uniquement.",pdfPreviewTitle:"Aperçu de l'estimation des frais d'acte",generatingPDF:"Génération du PDF...",pleaseWait:"Veuillez patienter...",pdfGenerated:"PDF généré",fileDownloaded:"Le fichier a été téléchargé avec succès",pdfError:"Impossible de générer le PDF"},mortgage:{title:"Prêt Hypothécaire",description:"Calculez vos mensualités et visualisez votre plan d'amortissement.",badge:"Financement",pageTitle:"Simulateur de Prêt Hypothécaire",pageSubtitle:"Calculez vos mensualités et le coût total de votre crédit immobilier",loanParameters:"Paramètres du prêt",fillParameters:"Remplissez les informations pour obtenir votre simulation",amount:"Montant emprunté (â¬)",amountPlaceholder:"ex: 200000",interestRate:"Taux d'intérêt annuel (%)",interestRatePlaceholder:"ex: 3.5",duration:"Durée du prêt (années)",durationPlaceholder:"ex: 20",durationRange:"Entre 1 et 30 ans",calculate:"Calculer",reset:"Réinitialiser",fillForm:"Remplissez les paramètres pour obtenir votre simulation",simulationSummary:"Résumé de votre simulation",summaryDescription:"Pour un prêt de {amount} sur {duration} ans à {rate}%",monthlyPayment:"Mensualité",interestCost:"Coût des intérêts",totalToRepay:"Total à rembourser",over:"sur",payments:"mensualités",amortizationChart:"Graphique d'amortissement",annualEvolution:"Ãvolution annuelle du remboursement",amortizationTable:"Tableau d'amortissement",monthlyDetail:"mensuel",annualDetail:"annuel",detailOf:"Détail {mode} du remboursement",annual:"Annuel",monthly:"Mensuel",month:"Mois",year:"Année",capitalBefore:"Capital avant",interest:"Intérêts",capitalRepaid:"Capital remboursé",capitalAfter:"Capital après",disclaimer:"Ce simulateur fournit une estimation indicative basée sur un taux fixe. Consultez votre banquier pour une offre personnalisée.",exportPDF:"Exporter en PDF",fullDisclaimer:"Ce simulateur fournit une estimation indicative basée sur un taux fixe. Les conditions réelles peuvent varier selon votre profil et l'établissement bancaire. Consultez un conseiller pour une offre personnalisée.",footerCopyright:"Arcanes. Simulateur à titre informatif uniquement.",pdfPreviewTitle:"Aperçu de votre simulation",generatingPDF:"Génération du PDF en cours...",pdfGenerated:"PDF généré avec succès !",pdfError:"Erreur lors de la génération du PDF",capitalReimbursed:"Capital remboursé",interestPaid:"Intérêts payés",remainingCapital:"Capital restant"},tri:{title:"TRI & Rentabilité",description:"Analysez la rentabilité globale de votre investissement immobilier sur plusieurs années.",badge:"Analyse avancée",pageTitle:"Simulateur TRI & Rentabilité Patrimoniale",pageSubtitle:"Analyse avancée avec projection pluriannuelle",marketSettings:"Paramètres marché belge ð§ðª",projectData:"Données du Projet",acquisition:"Acquisition",region:"Région",wallonia:"Wallonie",brussels:"Bruxelles",flanders:"Flandre",purchasePrice:"Prix d'achat",acquisitionFees:"Frais d'acq.",autoCalculated:"Calculé auto",renovations:"Travaux",financing:"Financement",personalContribution:"Apport Personnel",autoLabel:"Auto (20% + Frais)",rate:"Taux (%)",duration:"Durée (ans)",operation:"Exploitation",rentCC:"Loyer CC",chargesAndTax:"Charges & TF",annualRentIndexation:"Indexation annuelle des loyers (%)",indexationHelp:"Impacte positivement le cashflow futur.",holdingDuration:"Durée de détention",optimize:"Optimiser",annualAppreciation:"Valorisation annuelle",projectTRI:"TRI Projet",annualReturn:"Rendement annuel",netCashflow:"Cashflow Net",avgYear1:"Moyenne An 1 / mois",exitGain:"Gain Sortie",netInPocket:"Net en poche (Total)",totalBudget:"Budget Total",notarialAct:"Actable en main",performanceOver:"Performance sur {duration} ans",performanceText:"Ce projet offre un TRI de <strong>{tri}%</strong>. Le cashflow augmentera progressivement grâce à l'indexation ({indexation}%/an) face à un remboursement fixe.",rentPlus10:"Loyer +10%",worksLess10:"Travaux -10%",resaleLess5:"Revente -5%",cashflowAndWealth:"Flux de trésorerie & Enrichissement",annualCashflow:"Cashflow Annuel",cumulatedWealth:"Enrichissement Cumulé",amortizationTable:"Tableau d'Amortissement",year:"Année",cashflow:"Cashflow",remainingCapital:"Capital Restant",propertyValue:"Valeur Bien",cumulatedNet:"Net Cumulé",downloadPDFReport:"Télécharger Rapport PDF",pdfPreviewTitle:"Prévisualisation",optimizedDuration:"Durée Optimisée",optimizedMessage:"La durée idéale pour maximiser votre TRI est de {years} ans.",pdfGenerated:"PDF Généré",pdfSuccess:"Votre rapport est prêt.",pdfError:"Problème lors de la génération PDF.",fillFormDescription:'Complétez les informations du projet à gauche et cliquez sur "Calculer" pour voir votre analyse TRI complète.',triStatus:{low:"Faible",standard:"Standard",good:"Bon",excellent:"Excellent"}},borrowingCapacity:{title:"Capacité d'Emprunt",description:"Découvrez le montant maximum que vous pouvez emprunter selon votre profil financier.",pageTitle:"Simulateur de Capacité d'Emprunt",pageSubtitle:"Découvrez votre capacité d'emprunt selon votre projet : résidence principale ou investissement locatif",financialInfo:"Vos informations financières",fillInfo:"Remplissez vos informations financières",projectType:"Type de projet",projectTypeRequired:"Type de projet *",selectProject:"Sélectionnez votre projet",mainResidence:"Résidence principale",rentalInvestment:"Investissement locatif",mainResidenceInfo:"Taux d'endettement max : 35%",rentalInvestmentInfo:"Taux d'endettement max : 40% (revenus locatifs pris en compte à 70%)",monthlyIncomeLabel:"Revenus mensuels nets (â¬) *",monthlyIncomePlaceholder:"ex: 3500",monthlyIncomeTooltip:"Revenu net mensuel avant impôts, incluant 13áµ mois et double pécule proratisés.",currentDebtsLabel:"Dettes mensuelles actuelles (â¬)",currentDebtsPlaceholder:"ex: 450",currentDebtsTooltip:"Toutes vos mensualités existantes : crédit auto, crédit conso, etc.",expectedRentalIncomeLabel:"Revenus locatifs espérés (â¬/mois)",expectedRentalIncomePlaceholder:"ex: 8
59800",expectedRentalIncomeTooltip:"Loyer mensuel espéré. Les banques prennent en compte 70% de ce montant.",rentalIncomeInfo:"Pris en compte à 70% dans le calcul bancaire",personalContributionLabel:"Apport personnel (â¬)",personalContributionPlaceholder:"ex: 50000",personalContributionTooltip:"Somme que vous pouvez apporter pour financer le projet.",calculateCapacity:"Calculer ma capacité",calculating:"Calcul en cours...",yourProfile:"Votre Profil",maxMonthlyPayment:"Mensualité maximale",debtRatio:"Taux d'endettement",yourScenarios:"Vos 3 Scénarios d'Emprunt",scenariosComparison:"Comparaison des montants empruntables selon la durée (taux fixe 3,5%)",recommended:"Recommandé",borrowableAmount:"Montant empruntable",totalBudget:"Budget total",monthlyPayment:"Mensualité",perMonth:"/mois",personalizedAdvice:"Conseil Personnalisé",completeForm:"Complétez le formulaire pour obtenir votre estimation",disclaimer:"Cette estimation est fournie à titre indicatif. Pour une analyse définitive, consultez votre banquier qui tiendra compte de votre situation spécifique.",exportPDF:"Exporter en PDF",pdfPreviewTitle:"Aperçu de votre capacité d'emprunt",fullDisclaimer:"Ce simulateur fournit une estimation indicative de votre capacité d'emprunt. Les résultats ne remplacent pas l'analyse d'un expert bancaire et ne constituent pas une offre de prêt.",fullDisclaimerFooter:"Chaque profil est unique. Votre banque reste la meilleure source pour confirmer vos capacités.",footerCopyright:"Arcanes. Simulateur à titre informatif uniquement.",errorInvalidIncome:"Veuillez entrer des revenus mensuels valides",errorHighDebtTitle:"Taux d'endettement élevé",errorHighDebtMessage:"Vos dettes dépassent {rate}% de vos revenus. Des solutions existent, chaque profil a son potentiel.",pdfGenerated:"PDF généré",pdfSuccess:"Le fichier a été téléchargé avec succès",pdfError:"Impossible de générer le PDF"},peb:{title:"PEB & Coût Ãnergétique",description:"Estimez la performance énergétique et les charges futures de votre bien immobilier.",badge:"Habitation",pageTitle:"Simulateur PEB & Coût Ãnergétique",pageSubtitle:"Estimez la performance énergétique de votre bien et simulez l'impact d'améliorations",propertyInfo:"Informations du bien",fillInfo:"Renseignez les caractéristiques pour obtenir votre simulation",surface:"Surface habitable (m²) *",surfacePlaceholder:"ex: 85",pebClass:"Classe PEB *",pebClassPlaceholder:"ex: D ou 320",pebClassHelp:"Lettre (A+ à G) ou score en kWh/m²/an",region:"Région *",brussels:"Bruxelles-Capitale",flanders:"Flandre",wallonia:"Wallonie",propertyType:"Type de bien *",apartment:"Appartement",house:"Maison",electricityPrice:"Prix de l'électricité (â¬/kWh)",electricityPricePlaceholder:"ex: 0.25",calculate:"Calculer",completeForm:"Complétez le formulaire pour obtenir votre simulation",energyPerformance:"Performance énergétique",initialScore:"Score initial",simulatedScore:"Score simulé",annualConsumption:"Conso annuelle",annualCost:"Coût annuel",interactiveSimulation:"Simulation interactive",slideToSimulate:"Glissez le curseur sur le thermomètre pour simuler un changement",heating:"Chauffage",hotWater:"Eau chaude",ventilation:"Ventilation",lighting:"Ãclairage",other:"Autres",impactOfVariation:"Impact de la variation",noChange:"Aucun changement",slideInstruction:"Glissez pour simuler",scoreLabel:"Score : {score} kWh/m²/an",disclaimer:"Estimation indicative. La consommation réelle varie selon l'isolation, les habitudes et les équipements.",exportPDF:"Exporter en PDF",fullDisclaimer:"Cette simulation est une estimation indicative basée sur des moyennes. La consommation réelle dépend de nombreux facteurs : isolation, habitudes, équipements, conditions météorologiques, etc.",footerCopyright:"Arcanes. Simulateur à titre informatif uniquement.",pdfPreviewTitle:"Aperçu de la simulation PEB",errorInvalidSurface:"Veuillez entrer une surface valide",errorInvalidPEB:"Classe PEB invalide",generatingPDF:"Génération du PDF...",pdfGenerated:"PDF généré",pdfSuccess:"Le fichier a été téléchargé avec succès",pdfError:"Impossible de générer le PDF"},rentalYield:{title:"Rendement Locatif",description:"Analysez la rentabilité de votre investissement immobilier locatif.",badge:"Investissement",pageTitle:"Simulateur de Rendement Locatif",pageSubtitle:"Analysez la rentabilité et le cashflow de votre investissement immobilier",investmentData:"Données de l'investissement",fillInfo:"Renseignez les paramètres pour obtenir votre analyse",purchasePrice:"Prix d'achat (â¬)",purchasePricePlaceholder:"ex: 350000",monthlyRent:"Loyer mensuel (â¬)",monthlyRentPlaceholder:"ex: 1500",monthlyCharges:"Charges mensuelles (â¬/mois)",monthlyChargesPlaceholder:"ex: 350",monthlyChargesHelp:"Précompte immobilier, assurances, entretien, charges de copropriété",loanRepayment:"Remboursement crédit (â¬/mois)",loanRepaymentPlaceholder:"ex: 1200",loanRepaymentHelp:"Mensualité de votre crédit immobilier. Mettez 0 si achat comptant.",personalContribution:"Apport personnel (â¬)",personalContributionPlaceholder:"ex: 70000",personalContributionHelp:"Fonds propres investis (apport + frais + travaux)",acquisitionCosts:"Frais d'acquisition (â¬)",acquisitionCostsPlaceholder:"ex: 52500",acquisitionCostsHelp:"Par défaut â 15% du prix d'achat",renovationBudget:"Budget travaux (â¬)",renovationBudgetPlaceholder:"ex: 0",calculate:"Calculer",fillForm:"Complétez le formulaire pour obtenir votre analyse",yieldIndicators:"Indicateurs de rendement",grossYield:"Rendement brut",netNetYield:"Rendement net-net",equityYield:"Rdt fonds propres",detailedFinancialAnalysis:"Analyse détaillée",monthlyRentBreakdown:"Répartition du loyer mensuel",charges:"Charges",loan:"Crédit",cashflow:"Cashflow",toFinance:"à financer",netAnnualCashflow:"Cashflow net annuel",annualSavingsEffort:"Effort d'épargne annuel",netMonthlyCashflow:"Cashflow net mensuel",monthlyEffort:"Effort mensuel",investmentSummary:"Synthèse de l'investissement",totalInvestment:"Investissement total",borrowedAmount:"Montant emprunté",annualRent:"Loyer annuel",yieldLevel:{negativeCashflow:"Cashflow négatif",excellent:"Excellent",aboveAverage:"Au-dessus de la moyenne",average:"Dans la moyenne",low:"Faible"},interpretation:{negativeCashflow:"Vous devez apporter {amount}
598â¬/mois pour couvrir les charges et le crédit. Stratégie défensive ou spéculative, à valider selon votre capacité d'épargne et le potentiel de plus-value.",excellent:"Rendement calculé supérieur à la moyenne observée sur le marché belge (~3,2%). à analyser en tenant compte du risque locatif et de l'état du bien.",aboveAverage:"Rendement calculé au-dessus de la moyenne observée (~3,2%). à croiser avec l'analyse du quartier et de l'état du bien.",average:"Rendement calculé proche de la moyenne observée. Le potentiel d'amélioration (travaux, revalorisation, localisation) peut influencer ce résultat.",low:"Rendement calculé inférieur à la moyenne. Plusieurs facteurs peuvent expliquer ce résultat : prix d'achat, charges, travaux estimés, risque de vacance locative."},disclaimer:"Estimation indicative ne remplaçant pas une analyse complète incluant fiscalité et vacance locative.",exportPDF:"Exporter en PDF",fullDisclaimer:"Cette estimation est fournie à titre indicatif uniquement et ne remplace pas une analyse complète incluant la fiscalité, le financement, le précompte immobilier et la vacance locative.",footerCopyright:"Arcanes. Simulateur à titre informatif uniquement.",pdfPreviewTitle:"Aperçu du calcul de rendement",pdfGenerated:"PDF généré",pdfSuccess:"Le fichier a été téléchargé avec succès",pdfError:"Impossible de générer le PDF"},pricePerSqm:{title:"Prix au m²",description:"Comparez les prix au m² par région",pageTitle:"Calcul du Prix au m² Marché",pageSubtitle:"Analysez les prix du marché immobilier au mètre carré",address:"Adresse ou localité",addressPlaceholder:"ex: Avenue Louise, 1050 Bruxelles",surface:"Surface du bien (m²)",surfacePlaceholder:"ex: 85 (surface habitable en m²)",propertyType:"Type de bien",propertyTypePlaceholder:"ex: Appartement 2 chambres",analyze:"Analyser le marché",resultsPlaceholder:"Les résultats apparaîtront ici après analyse"},info:{title:"Pourquoi utiliser nos simulateurs ?",subtitle:"Des calculs basés sur la réglementation belge actuelle",precision:{title:"Précision",description:"Calculs basés sur les taux officiels belges : droits d'enregistrement, précompte immobilier, TVA."},instant:{title:"Instantané",description:"Résultats immédiats avec graphiques interactifs et possibilité d'export PDF."},complete:{title:"Complet",description:"Tous les scénarios comparés : durées, régions, types de projets, rendements nets."}},deeperAnalysis:{title:"Besoin d'une analyse plus approfondie ?",description:"Nos simulateurs donnent une première estimation. Pour une analyse complète de votre projet avec rapport détaillé, découvrez notre service d'analyse premium.",button1:"Découvrir l'analyse complète",button2:"Lire nos guides"},footer:{copyright:"Arcanes. Simulateurs à titre informatif uniquement.",blog:"Blog",contact:"Contact",legal:"Mentions légales"},launch:"Lancer le simulateur"},_B={title:"Nos Tarifs",subtitle:"Rechargez votre compte en Crédits pour effectuer des analyses premium complètes",recommended:"RECOMMANDÃ",legal:{title:"Rétractation & CGV",desc:"Conformément à la loi, vous disposez d'un droit de rétractation de 14 jours pour les crédits non utilisés.",link:"Voir conditions de rétractation (Art. 8)"},common:{credits:"Crédit",credits_plural:"Crédits",per_credit:"⬠/ crédit",save:"Ãconomisez",buy:"Acheter",terms:"Conditions Générales d'Utilisation"},plans:{discovery:"Pack Découverte",essential:"Pack Essentiel",smart:"Pack Smart",investor:"Pack Investisseur",pro:"Pack Pro+"},features:{analyses:"analyses complètes",detailed:"Rapport PDF détaillé inclus",noExpiration:"Valables 2 ans",becomesPremium:"Devient Membre Premium"},about:{title:"à propos des Crédits",feature1:"Analyses complètes garanties",feature1Desc:"Chaque crédit débloque une analyse premium complète incluant rentabilité, travaux et cashflow.",feature2:"Vos crédits sont valables 24 mois",feature2Desc:"Achetez maintenant, utilisez-les dans 6 mois ou 2 ans. Vous serez averti avant l'expiration.",feature3:"Plus vous achetez, moins vous payez",feature3Desc:"Le coût par analyse diminue avec la taille du pack. Idéal pour les investisseurs actifs."},premiumMember:{title:"Membre Premium",feature1:"Accès aux fonctionnalités exclusives",feature1Desc:"Débloquez le simulateur TRI, les prédictions de marché sur la carte et bien plus.",feature2:"Statut obtenu automatiquement",feature2Desc:"Dès l'achat d'un pack de 10 crédits ou plus, vous devenez Membre Premium."},toast:{cancelled:"Paiement annulé",cancelledDesc:"Le processus de paiement a été annulé. Aucun montant n'a été débité.",confirmed:"Paiement confirmé !",error:"Erreur",paymentError:"Une erreur est survenue lors de la vérification du paiement.",loginRequired:"Connexion requise",loginRequiredDesc:"Veuillez vous connecter pour acheter des crédits.",preparationError:"Erreur lors de la préparation du paiement."}},TB={title:"Questions Fréquentes",subtitle:"Tout ce que vous devez savoir sur le fonctionnement d'Arcanes, les analyses et les crédits.",search:"Rechercher une question...",noResults:"Aucun résultat trouvé pour votre recherche.",categories:{general:"Général",anal
598ysis:"Analyses",methodology:"Méthodologie",account:"Compte & Technique"},questions:{general:{q1:"Qu'est-ce qu'Arcanes exactement ?",a1:"Arcanes est une plateforme d'analyse immobilière automatisée basée sur la donnée et des algorithmes sophistiqués. Elle permet d'évaluer rapidement n'importe quelle annonce immobilière en Belgique et de déterminer si elle présente un intérêt réel, que ce soit pour un achat résidentiel, un investissement locatif ou un immeuble de rapport.",q2:"Est-ce que je peux vraiment faire une analyse gratuite ?",a2:"Oui. à l'inscription, vous recevez automatiquement 1 analyse premium offerte. Vous pouvez ensuite continuer à générer des analyses gratuites (version limitée) ou acheter des crédits pour débloquer des analyses premium complètes incluant cashflow, rentabilité, travaux, risques et PDF.",q3:"Arcanes fonctionne pour quels types de biens ?",a3:"Arcanes peut analyser la majorité des biens situés en Belgique : maisons, appartements, studios, duplex, immeubles de rapport, biens anciens ou neufs, à rénover ou rénovés. Certains biens spécifiques (prestige, atypiques, domaines, châteaux) peuvent être moins précis, mais une base d'analyse cohérente reste possible."},analysis:{q1:"Quelle est la différence entre analyse gratuite et premium ?",a1:"L'analyse gratuite affiche les informations principales : score global, cohérence prix/m², état général estimé, PEB, et verdict synthétique. L'analyse premium ajoute : estimation travaux, coûts énergétiques, niveaux de risques, scénarios financiers, rentabilité locative, cashflow, ainsi qu'un rapport PDF téléchargeable.",q2:"Combien de temps prend une analyse immobilière ?",a2:"La génération d'analyse prend généralement entre 30 secondes et 2 minutes selon la qualité des données disponibles et la complexité du bien. Si des informations cruciales sont manquantes, Arcanes propose des hypothèses standard et l'indique clairement.",q3:"Puis-je analyser la même annonce plusieurs fois ?",a3:"Oui. Chaque nouvelle analyse consomme 1 crédit (ou 3 pour un immeuble de rapport). Une fois une analyse premium générée, elle reste accessible dans votre historique sans coût supplémentaire.",q4:"Arcanes analyse aussi les immeubles de rapport ?",a4:"Oui. Arcanes détecte et analyse plusieurs unités, calcule le prix/door, la rentabilité globale, le rendement théorique, les risques communs et la vacance potentielle. Comme l'analyse requiert davantage de calculs, elle consomme 3 crédits."},methodology:{q1:"Sur quelles hypothèses reposent les calculs ?",a1:"Arcanes combine données publiques, références de marché, ratios financiers, statistiques nationales et hypothèses prudentes. Les modèles évoluent continuellement pour refléter la réalité du terrain, de la fiscalité, des taux d'intérêt et des tendances immobilières belges.",q2:"Comment sont calculés les frais d'acquisition ?",a2:"Les calculs incluent droits d'enregistrement, frais notariaux, frais administratifs et débours, selon les taux standards belges en vigueur. Les taux réduits résidence principale ne sont pas appliqués par défaut mais peuvent être activés si l'utilisateur est éligible.",q3:"Comment Arcanes estime la rentabilité locative ?",a3:"La rentabilité dépend du loyer potentiel, de la localisation, de l'état du bien, des charges récurrentes et de la consommation énergétique. Les scénarios appliqués sont prudents afin de proposer une vision réaliste plutôt qu'optimiste.",q4:"Comment sont estimés les loyers potentiels ?",a4:"Les loyers sont estimés via données Statbel, références locales, code postal, surface, état du bien et avantages (extérieur, parking, rénovation). Un ajustement local est appliqué pour se rapprocher des loyers réellement observés.",q5:"Les estimations sont-elles définitives ?",a5:"Non. Ce sont des estimations construites avec les meilleures données disponibles mais ne remplacent pas un expert immobilier ou technique. Elles servent principalement à filtrer, comparer et prendre des décisions éclairées."},account:{q1:"Ai-je besoin d'un compte pour utiliser Arcanes ?",a1:"Oui. La création d'un compte permet de sauvegarder vos analyses, de récupérer votre analyse premium offerte et de suivre votre historique.",q2:"Puis-je télécharger mes analyses ?",a2:"Les anal
598yses premium sont téléchargeables en PDF et adaptées pour être partagées avec un notaire, une banque, un partenaire ou un conseiller.",q3:"Arcanes fonctionne-t-il sur mobile ?",a3:"Oui. La plateforme est responsive et utilisable sur ordinateur, tablette et smartphone â même depuis une visite de bien.",q4:"Que faire en cas de problème technique ?",a4:"Contactez-nous via le support ou la page dédiée. En cas d'erreur avérée, un crédit peut être recrédité.",q5:"Comment devenir membre Premium ?",a5:"Vous devenez automatiquement membre Premium en achetant un pack Smart (10 crédits), Investisseur (25 crédits) ou Pro+ (50 crédits). Le statut Premium vous donne accès au simulateur TRI & Rentabilité et aux prédictions de marché sur la carte interactive."}},help:{title:"Besoin d'aide ?",description:"Notre équipe est là pour répondre à vos questions",contact:"Contactez-nous",home:"Retour à l'accueil"}},DB={borrowingCapacity:{title:"Simulation Capacité d'Emprunt",date:"Date",maxBudget:"Budget total maximum",monthlyPayment:"Mensualité",debtRatio:"Taux d'endettement",yourProject:"Votre projet",projectType:"Type de projet",monthlyIncome:"Revenus mensuels",personalContribution:"Apport personnel",monthlyDebts:"Dettes mensuelles",detailedScenarios:"Scénarios détaillés",years:"ans",recommended:"Recommandé",borrowableAmount:"Empruntable",totalBudget:"Budget total",monthlyPaymentShort:"Mensualité",summary:"Résumé",personalizedAdvice:"Conseil personnalisé",legalWarning:"Avertissement légal",legalWarningText:"Cette estimation est fournie à titre indicatif uniquement. Les résultats ne remplacent pas l'analyse d'un expert bancaire. Consultez votre banque pour une analyse personnalisée et une offre de prêt adaptée à votre situation.",mainResidence:"Résidence principale",rentalInvestment:"Investissement locatif"},mortgage:{title:"Simulation Prêt Hypothécaire",date:"Date",amountBorrowed:"Montant emprunté",monthlyPayment:"Mensualité",duration:"Durée",years:"ans",rate:"Taux",totalInterest:"Total intérêts",annualAmortizationTable:"Tableau d'amortissement annuel",year:"Année",capitalBefore:"Capital avant",interest:"Intérêts",capitalRepaid:"Capital remb.",remainingCapital:"Capital restant",legalWarning:"Avertissement légal",warningText:"Ce document est une estimation indicative basée sur un taux fixe. Les conditions réelles peuvent varier selon votre profil et l'établissement bancaire. Consultez un conseiller pour une offre personnalisée."},tri:{title:"Rapport Rentabilité",subtitle:"Analyse Immobilière",triReturn:"TRI (Rendement)",cashflowAvg:"Cashflow (Moy. An 1)",totalWealth:"Enrichissement Total",assumptions:"Hypothèses",purchasePrice:"Prix Achat",feesAndWorks:"Frais + Travaux",contribution:"Apport",loan:"Crédit",conditions:"Conditions",over:"sur",years:"ans",visualizationLabel:"Visualisation Flux & Patrimoine",annualDetail:"Détail Annuel (Projection {duration} ans)",year:"Année",cashflow:"Cashflow",crd:"CRD",propertyValue:"Valeur Bien",cumulatedNet:"Net Cumulé",generatedBy:"Généré par Arcanes. Simulation à titre indicatif."},rentalYield:{title:"Rendement Locatif",date:"Date",netNetYield:"Rendement net-net",grossYield:"Rendement brut",equityYield:"Rendement sur fonds propres",investmentData:"Données de l'investissement",purchasePrice:"Prix d'achat",personalContribution:"Apport personnel",borrowedAmount:"Montant emprunté",monthlyRent:"Loyer mensuel",yieldEvaluation:"Ãvaluation du rendement",low:"Faible",medium:"Moyen",excellent:"Excellent",monthlyRentBreakdown:"Répartition du loyer mensuel",charges:"Charges",loan:"Crédit",cashflow:"Cashflow",toFinance:"à financer",positiveCashflow:"Cash-flow positif",savingsEffortRequired:"Effort d'épargne requis",annualCashflow:"Cash-flow annuel",annualEffort:"Effort annuel",monthlyCashflow:"Cash-flow mensuel",monthlyEffort:"Effort mensuel",warning:"Avertissement",warningText:"Cette estimation est fournie à titre indicatif uniquement et ne remplace pas une analyse complète incluant la fiscalité, le financement, le précompte immobilier et la vacance locative."},notaryFees:{title:"Estimation des Frais d'Acte",date:"Date",totalToPay:"Total estimé à prévoir",includingFees:"dont {amount}
598 de frais notariaux",propertyInfo:"Informations du bien",region:"Région",propertyType:"Type de bien",purchasePrice:"Prix d'achat",conditions:"Conditions",firstPurchase:"Premier achat",newProperty:"Bien neuf",mortgage:"Crédit hypothécaire",standard:"Standard",wallonia:"Wallonie",brussels:"Bruxelles-Capitale",flanders:"Flandre",house:"Maison",apartment:"Appartement",land:"Terrain",detailedBreakdown:"Répartition détaillée des coûts",transactionAmount:"Montant de la transaction",registrationRights:"Droits d'enregistrement",vat:"TVA (21%)",notaryFees:"Honoraires notaire",adminFees:"Frais administratifs",ofTotal:"{percentage}% du total",feesBreakdownChart:"Répartition des frais notariaux",rightsVat:"Droits/TVA",fees:"Honoraires",admin:"Admin",importantInfo:"Informations importantes",importantInfo1:"Les frais de notaire sont généralement payables le jour de la signature de l'acte authentique.",importantInfo2:"Le notaire doit fournir une estimation détaillée avant la signature du compromis de vente.",importantInfo3:"Ces frais ne sont généralement pas financés par le crédit hypothécaire et doivent être prévus en plus de l'apport.",legalWarning:"Avertissement légal",legalWarningText:"Cette estimation est fournie à titre indicatif uniquement. Les frais réels peuvent varier en fonction de votre situation personnelle, des spécificités de votre achat et de l'évolution de la législation. Pour une estimation précise et personnalisée, consultez un notaire qui pourra analyser votre dossier en détail."},peb:{title:"Simulation PEB",date:"Date",energyScore:"Score énergétique",annualConsumption:"Consommation annuelle",estimatedAnnualCost:"Coût annuel estimé",propertyInfo:"Informations du bien",region:"Région",propertyType:"Type de bien",livableArea:"Surface habitable",electricityPrice:"Prix de l'électricité",pebClassification:"Classification PEB",yourProperty:"Votre bien",energyConsumptionBreakdown:"Répartition de la consommation énergétique",breakdownEstimate:"Estimation de la répartition par usage pour un score de {score} kWh/m²/an",heating:"Chauffage",hotWaterSanitary:"Eau chaude sanitaire",ventilation:"Ventilation",lighting:"Ãclairage",otherAppliances:"Autres (électroménager, etc.)",warning:"Avertissement",warningText:"Cette simulation est une estimation indicative basée sur des moyennes. La consommation réelle dépend de nombreux facteurs : isolation, habitudes, équipements, conditions météorologiques, etc.",brussels:"Bruxelles-Capitale",flanders:"Flandre",wallonia:"Wallonie",apartment:"Appartement",house:"Maison"}},RB={title:"Le Blog Arcanes",subtitle:"Analyses immobilières fiables, structurées et compréhensibles. Sans spéculation, sans storytelling marketing.",officialSources:"Sources officielles & vérifiées",factBased:"Fact-based, pas opinion-based",tags:{all:"Tous",peb:"PEB",financing:"Financement",yield:"Rendement",investment:"Investissement"},readTime:"min",trending:"Tendance",read:"Lire",subscribe:{title:"Recevoir nos dossiers experts",frequency:"1 email / semaine ⢠Sources officielles ⢠Aucun spam",placeholder:"[email protected]",button:"Je m'inscris"},footer:"Arcanes â Analyses immobilières intelligentes."},zB={back:"Retour",contact:"Contact",by:"Par",tagline:"Une analyse Arcanes â expertise, clarté, chiffres & stratégie immobilière",synthesis:{title:"Synthèse Arcanes",content:"Cet article a pour objectif de transformer un jargon administratif en décision d'investissement concrète : chiffres clés, impact réel sur votre portefeuille et leviers d'action immédiats."},nextStep:{title:"Prochaine étape",content:"Testez votre situation avec le simulateur PEB / rendement Arcanes, puis conservez le rapport généré comme base de discussion avec votre banquier, notaire ou conseiller.",button:"Ouvrir les simulateurs"},cta:{label:"Analyse personnalisée",title:"Vous avez un projet concret sur la table ?",content:"Arcanes analyse votre achat ou investissement avec le même niveau d'exigence que cet article : données de marché, scénarios chiffrés et indicateurs détaillés en moins de 48h.",button:"Découvrir nos analyses"},footer:"Arcanes. L'analyse immobilière nouvelle génération."},IB={title:"Contactez-nous",subtitle:"Une question ? Un projet ? N'hésitez pas à nous contacter, nous vous répondrons dans les plus brefs délais.",form:{title:"Envoyez-nous un message",description:"Remplissez le formulaire ci-dessous et nous vous répondrons rapidement.",n
598ame:"Nom complet",email:"Email",phone:"Téléphone",subject:"Sujet",message:"Message",characters:"caractères",send:"Envoyer le message",sending:"Envoi en cours...",namePlaceholder:"...",emailPlaceholder:"...",phonePlaceholder:"...",subjectPlaceholder:"Votre sujet",messagePlaceholder:"Votre message...",errors:{nameRequired:"Le nom est requis",nameMax:"Le nom doit faire moins de 100 caractères",emailInvalid:"Email invalide",emailMax:"L'email doit faire moins de 255 caractères",phoneMax:"Le téléphone doit faire moins de 20 caractères",subjectRequired:"Le sujet est requis",subjectMax:"Le sujet doit faire moins de 200 caractères",messageMin:"Le message doit contenir au moins 10 caractères",messageMax:"Le message doit faire moins de 2000 caractères"}},info:{title:"Informations de contact",description:"Vous pouvez également nous joindre directement par ces moyens.",email:"Email",phone:"Téléphone",address:"Adresse"},hours:{title:"Horaires d'ouverture",weekdays:"Lundi - Vendredi",saturday:"Samedi",sunday:"Dimanche",closed:"Fermé"},toast:{success:"Message envoyé !",successDesc:"Nous vous répondrons dans les plus brefs délais.",error:"Erreur",errorDesc:"Une erreur est survenue lors de l'envoi du message."}},qB={greeting:"Bonjour{{name}} ð",kpis:{analyses:"analyses",thisMonth:"ce mois",credits:"crédits"},hero:{title:"Prêt à investir ?",subtitle:"Analysez n'importe quel bien immobilier en Belgique en quelques secondes.",cta:"Nouvelle analyse"},empty:{title:"Aucune analyse pour le moment",description:"Lancez votre première analyse pour découvrir le potentiel d'investissement d'un bien immobilier.",cta:"Lancer ma première analyse",hint:"Collez simplement un lien Immoweb ou Immovlan"},referral:{title:"Gagnez des crédits gratuits",subtitle:"Parrainez un ami et recevez <b>5 crédits</b> chacun.",codeCopied:"Code copié !",linkCopied:"Lien d'invitation copié !",codeLabel:"Code",inviteButton:"Inviter",progressLabel:"Progression vers l'objectif premium",progressOf:"{{current}} sur {{total}}"},tabs:{recentes:"Récentes",favorites:"Favoris",referral:"Parrainage"},historyFull:{title:"Toutes mes analyses",back:"â Retour",viewAll:"Voir toutes mes analyses"}},NB={synthesis:"Synthèse",market:"Réalité du Marché",transformation:"Plan de Transformation",projection:"Projection 10 ans",negotiation:"Synthèse des Données",synthese:"Synthèse",marche:"Marché",travaux:"Travaux",financement:"Financement",securite:"Sécurité"},LB={title:"Sommaire",sommaire:"Sommaire",synthese:"Synthèse",marche:"Marché",transformation:"Travaux",projection:"Projection",negociation:"Synthèse"},BB={excellent:"Indice très élevé",good:"Indice élevé",correct:"Indice modéré",evaluate:"Indice faible",caution:"Indice très faible"},MB={undermarket:"< estimation marché",overmarket:"> estimation marché",selffinanced:"Cashflow positif calculé",highyield:"Rendement brut > 6%",energyreno:"Travaux PEB estimés"},FB={tri:{label:"TRI (10 ans)",benchmark:"Marché: 5-7%",definition:"Taux de Rendement Interne - Mesure la rentabilité globale de l'investissement sur 10 ans, incluant les cashflows et la plus-value à la revente."},cashflow:{label:"Cashflow",perMonth:"/mois",definition:"Flux de trésorerie mensuel après déduction de toutes les charges et du remboursement du crédit."},rendement:{label:"Rendement Net",afterCharges:"Après charges",definition:"Revenu net d'exploitation (NOI) divisé par l'investissement total."},multiplicateur:{label:"Multiplicateur",onEquity:"Sur apport",definition:"Rapport entre les gains totaux et l'apport initial. Un multiplicateur de 4x signifie que vous quadruplez votre mise."},noi:{label:"NOI",definition:"Net Operating Income - Revenus locatifs moins toutes les charges d'exploitation (hors financement)."},prix:{label:"Prix Acquisition"},total:{label:"Investissement Total",subtext:"Frais & travaux inclus"},mensualite:{label:"Mensualité",subtext:"/mois"},apport:{label:"Apport Requis"}},OB={prix:"Prix d'acquisition",frais:"Frais d'acquisition",travaux:"Budget travaux",total:"Coût Projet"},VB={equilibre:{title:"Prix d'équilibre calculé",reduction:"Ãcart constaté",arv:"ARV estimée",travaux:"- Travaux",frais:"- Frais & marge"},args:{market:{title:"Positionnement par rapport à l'estimation",desc:"Prix constaté {{pct}} au-dessus de l'estimation de marché locale.",under:"Prix constaté {{pct}} en-dessous de l'estimation de marché locale."},travaux:{title:"Budget travaux estimé",desc:"Inclut la mise aux normes PEB et les finitions estimées."},arv:{title:"Estimation après rénovation (ARV)",positive:"Ãcart entre coût total et estimation après travaux : {{marge}}",negative:"Le coût total du projet dépasse l'estimation après travaux."}},text:{title:"Synthèse des données",collapse:"Réduire",expand:"Voir le texte complet",disclaimer:"Ces données sont générées à titre indicatif. Elles ne constituent pas un conseil. Faites-vous accompagner par un professionnel."},generated:{opening:`Synthèse des données factuelles relatives à ce bien : 599 600`,market:`Positionnement : Le prix affiché de {{prix}} se situe {{position}} de {{pct}} par rapport à l'estimation de marché Arcanes pour ce secteur. 601 602`,travaux:`Budget travaux estimé : {{budget}} pour la mise aux normes énergétiques (PEB) et les finitions. Ce montant est à intégrer dans le calcul du coût total du projet. 603 604`,conclusion:`Prix d'équilibre théorique : Sur base des hypothèses retenues (travaux estimés et écart marché algorithmique), un prix d'équilibre théorique pourrait se situer autour de {{prix}}. 605 606Cette analyse est fournie à titre purement indicatif et ne constitue ni un conseil en investissement, ni un avis d'expert. Les montants sont des estimations qui doivent être validées par des professionnels qualifiés.`}},WB={title:"Actions rapides",schedule:"Planifier une visite",contact:"Contacter l'agence",save:"Sauvegarder l'analyse"},UB={text:"Outil d'aide à la décision. Cette analyse ne constitue pas un conseil en investissement personnalisé."}
606,$B={title:"Analyse immobilière intelligente",subtitle:"Collez votre URL d'annonce, Arcanes fait le reste",loading:"Chargement de l'analyse...",upload:{dragDrop:"Importer votre annonce",format:"(Format PDF - 1 fichier max)",fileUploaded:"Fichier importé",or:"OU",placeholderUrl:"Collez l'URL de l'annonce ici..."},header:{preview:"Aperçu",fullAnalysis:"Analyse Complète"},form:{analysisType:"Type d'analyse",mainResidence:"Résidence principale",mainResidenceDesc:"Pour un bien où vous allez habiter",rentalInvestment:"Investissement locatif",rentalInvestmentDesc:"Pour un bien destiné à la location",uniqueProperty:"Propriété unique (seul bien immobilier en votre possession)",buttons:{analyzing:"Analyse en cours...",freePreview:"Aperçu gratuit (limité)",premium:"Analyse complète (1 crédit)",unlock:"Débloquer l'analyse complète"}},languageMismatch:{title:"Langue de l'analyse",message:"Votre profil est configuré en {{profileLang}}, mais l'interface est actuellement en {{currentLang}}. Dans quelle langue souhaitez-vous recevoir votre analyse ?",useProfile:"{{lang}} (profil)",useCurrent:"{{lang}} (actuelle)"},types:{personalHome:"Habitation Personnelle",rentalInvestment:"Investissement Locatif",multiUnit:"Immeuble de Rapport"},badges:{personalHome:"Habitation Personnelle",uniqueHome:"Habitation Unique",rentalInvestment:"Investissement Locatif",multiUnit:"Immeuble de Rapport",units:"unités",lots:"lots",alert:"Ãcart constaté",gross:"Brut"},stats:{surface:"Surface",price:"Prix",monthlyBudget:"Budget Mensuel",grossRent:"Loyer Brut",totalSurface:"Surface Totale",pricePerDoor:"Prix/Porte",totalRent:"Loyer Total",perMonth:"/mois",totalInvestment:"Investissement total"},banners:{uniqueHome:{title:"Avantage Habitation Unique",savings:"Ãconomie de {{amount}} sur les droits d'enregistrement"},priceGap:{title:"Ãcart de {{percent}}% constaté par rapport à l'estimation de marché",description:"L'analyse détaillée permet d'explorer les facteurs expliquant cet écart.",descriptionInvest:"L'analyse détaillée inclut les données de rendement net et de cashflow pour explorer cet écart.",cta:"Voir l'analyse détaillée"}},keyFacts:{title:"Points Clés",property:{label:"Le Bien",defaultType:"Bien immobilier",defaultZone:"Zone résidentielle",building:"Immeuble",context:"Situé à {{city}} ({{zone}}).",contextNoCity:"{{zone}}."},budget:{label:"Budget Mensuel",perMonth:"/ mois",context:"Incluant crédit, charges et énergie."},price:{label:"Position Prix",perSqm:"/ m²",contextNeutral:"Ãcart constaté de {{percent}} par rapport à l'estimation de marché Arcanes.",perDoor:"/porte"},priceBadge:{belowEstimate:"< estimation",aboveEstimate:"> estimation",withinRange:"Dans la fourchette"},works:{label:"Enveloppe Travaux",estimated:"estimés",none:"Aucun",contextWithWorks:"Budget pour une rénovation complète.",contextNoWorks:"Aucuns travaux prévus dans cette analyse."},energy:{label:"Performance",contextNeutral:"Certificat PEB officiel du bien. Les charges énergétiques varient selon l'usage."},fiscal:{label:"Régime Fiscal",standard:"Standard",standardContext:"Droits d'enregistrement classiques appliqués.",reduced:"Réduit",reducedContext:"Taux réduit habitation unique applicable."},rent:{label:"Loyer estimé",contextInvest:"Loyer brut mensuel estimé sur base du marché locatif local.",contextImmeuble:"Revenus locatifs mensuels cumulés de l'ensemble des unités.",units:"unités"},multiUnit:{label:"Répartition",vacancyUnit:"impact par vacance",context:"Avec plusieurs unités, une vacance n'affecte qu'une fraction des revenus locatifs totaux."},mortgage:{label:"Mensualité crédit",context:"Remboursement mensuel du prêt hypothécaire uniquement."}},sections:{marketPosition:"Position Marché",monthlyBudget:"Budget Mensuel",syntheticIndex:"Indice synthétique",buyVsRent:"Acheter vs Louer",financialStructure:"Structure Financière",energyPerformance:"Performance Ãnergétique",postWorksEstimate:"Estimation après travaux",yield:"Rendement",unitsOverview:"Aperçu des Unités",multiUnitData:"Données multi-unités",monthlyCost:"Coût de vie mensuel"},market:{pricePerSqm:"Prix au m²",marketEstimate:"Estimation Marché",acquisitionPrice:"Prix Acquisition",pricePerDoor:"Prix/Porte",range:"Fourchette",belowEstimate:"En-dessous de l'estimation",aboveEstimate:"Au-dessus de l'estimation",significantGap:"Ãcart significatif constaté",withinRange:"Dans la fourchette estimée"},budget:{composition:"Crédit + Charges + Ãnergie",mortgage:"Mensualité Crédit",charges:"Charges",energy:"Ãnergie",effortRate:"Taux d'effort indicatif",effortRateDescription:"Comparez ce budget mensuel à vos revenus nets pour évaluer l'accessibilité. Un taux d'effort inférieur à 35% est généralement considéré comme soutenable."},financial:{acquisitionPrice:"Prix d'acquisition",registrationFees:"Droits d'enregistrement",n
606otaryFees:"Frais de notaire",acquisitionFees:"Frais d'acquisition",worksBudget:"Budget Travaux",totalInvestment:"Investissement Total",requiredDeposit:"Apport Requis",monthlyPayment:"Mensualité",mortgagePayment:"Mensualité Crédit",investmentPerDoor:"Investissement/Porte",perUnit:"par unité",ofTotal:"du total",years:"ans",at:"à "},energy:{annualCharges:"Charges énergie/an",estimatedSavings:"Ãconomie annuelle estimée",year:"an",plannedBudget:"Budget PEB prévu"},yield:{calculation:"Loyers bruts / Prix acquisition",monthlyRent:"Loyer Mensuel",rentPerDoor:"Loyer/Porte"},units:{rentHidden:"Loyer masqué"},multiUnit:{vacancyImpactNeutral:"Impact d'une vacance unitaire sur les revenus totaux",oneVacancyNeutral:"Une unité vacante représente une perte de {{percent}}% des revenus locatifs totaux.",vsSingle:"vs 100% sur un bien unique"},blurred:{score:{title:"Indice synthétique",ready:"L'indice a été calculé sur base des données du bien.",loading:"Indice calculé sur plusieurs critères objectifs.",cta:"Voir mon score"},buyVsRent:{title:"Comparaison achat vs location",description:"Simulation comparative des coûts d'achat et de location sur 10 ans.",cta:"Voir la comparaison"}
606,plusValue:{title:"Estimation après travaux",description:"Comparaison entre le coût total et l'estimation de marché après travaux.",cta:"Voir la marge latente"},yield:{title:"Données de rendement détaillées",yourGross:"Rendement brut calculé :",description:"L'analyse complète inclut le rendement net, le cashflow et le TRI.",cta:"Voir la rentabilité réelle"},energy:{title:"Détail Ãnergétique",description:"Primes, économies annuelles et temps de retour sur investissement",cta:"Voir le ROI énergétique"},units:{title:"Détail des {{count}} Unités",description:"Loyers, rendements et potentiel d'optimisation par lot",cta:"Voir chaque unité"},arv:{title:"Estimation après travaux (ARV)",description:"Comparaison entre le coût total d'acquisition et l'estimation de marché après rénovation.",cta:"Voir la marge latente"}},premium:{tri:"TRI 10 ans",cashflow:"Cashflow Net",taxes:"Fiscalité",pdfReport:"Rapport PDF",arvMargin:"ARV & Marge",unitAnalysis:"Analyse/Unité",report10p:"Rapport 10p",score100:"Score /100",buyVsRent:"Acheter vs Louer",projections:"Projections",report11p:"Rapport 11p"},cta:{title:"Débloquez l'analyse complète",description:"Accédez à l'ensemble des indicateurs financiers, projections sur 10 ans et simulations détaillées.",unlock:"Débloquer maintenant"},modal:{title:"Analyse complète",subtitle:"Tous les indicateurs calculés pour ce bien.",unlockButton:"Débloquer (1 Crédit)",cancelButton:"Non merci, revenir à l'aperçu",home:{score:{title:"Indice Synthétique /100",sub:"4 critères pondérés"},buyVsRent:{title:"Acheter vs Louer",sub:"Comparaison détaillée"},projections:{title:"Projections 10 ans",sub:"Ãvolution patrimoniale"},pdf:{title:"Rapport PDF 11 pages",sub:"Avec page comparative"}},invest:{cashflow:{title:"Cashflow Net Réel",sub:"Après charges et fiscalité"},tri:{title:"TRI sur 10 ans",sub:"Taux de rendement interne"},projections:{title:"Projections Patrimoniales",sub:"Ãvolution sur 10 ans"},pdf:{title:"Rapport PDF Premium",sub:"Document professionnel"}},multiUnit:{arv:{title:"ARV & Marge Latente",sub:"Création de valeur immédiate"},units:{title:"Analyse par Unité",sub:"Rendement de chaque lot"},tri:{title:"TRI & Cashflow",sub:"Performance complète"},pdf:{title:"Rapport PDF 10 pages",sub:"Document professionnel"}}},dialogs:{missingInfo:{title:"Informations manquantes",desc:"Pour obtenir une analyse complète, nous avons besoin de quelques informations supplémentaires."},payment:{title:"Choisissez votre option",desc:"Utilisez un crédit ou rechargez votre compte pour accéder à l'analyse complète",useCredit:"Utiliser 1 crédit",remaining:"Crédits restants :",noCreditsTitle:"Vous n'avez plus de crédits disponibles",recharge:"Recharger mon compte",cancel:"Annuler"},download:{title:"Analyse complète prête !",desc:"Prévisualisez et téléchargez votre rapport d'analyse immobilière complet",pdf:"Document PDF",word:"Document Word",download:"Télécharger",wordNoticeTitle:"Document Word (.docx)",wordNoticeDesc:"L'aperçu n'est pas disponible pour les fichiers Word. Téléchargez le document pour le consulter.",downloadNow:"Télécharger maintenant",close:"Fermer",downloadAndClose:"Télécharger et fermer"},noCredit:{title:"Crédits insuffisants",desc:"Vous n'avez plus de crédits disponibles pour réaliser une analyse complète",rechargeTitle:"Rechargez votre compte pour continuer",rechargeDesc:"Accédez à des analyses complètes et détaillées en PDF",seePricing:"Voir les tarifs"},error:{button:"Compris"},unsupportedDomain:{title:"Site non supporté",message:`Le site "{{domain}}" n'est pas encore pris en charge par Arcanes. 607 608Pour analyser ce bien, exportez l'annonce en PDF et utilisez l'option "Importer un fichier" sur notre page d'analyse.`,howTo:"Comment faire ?",step1:"Sur le site immobilier, imprimez la page en PDF (Ctrl+P â Enregistrer en PDF)",step2:'Revenez sur Arcanes et cliquez sur "Importer un fichier"',step3:"Sélectionnez votre PDF et lancez l'analyse"}},footer:{disclaimer:"Document généré automatiquement. Les simulations sont fournies à titre indicatif sur base de données de marché. Version Freemium."},toasts:{successTitle:"Analyse terminée",analysisCompleted:"Votre analyse a été générée avec succès.",analysisProcessed:"Votre analyse a été traitée avec succès.",errorTitle:"Erreur",genericError:"Une erreur est survenue lors de l'analyse. Veuillez réessayer.",warning:"Attention",provideUrlOrFile:"Veuillez fournir une URL d'annonce ou importer un fichier PDF.",selectType:"Veuillez sélectionner le type de bien (résidence principale ou investissement).",paymentCancelled:"Paiement annulé",paymentCancelledDesc:"Le paiement a été annulé. Aucun crédit n'a été débité.",analysisReady:"Analyse prête",freeAnalysisReady:"Votre aperçu gratuit est prêt.",creditRefundedTitle:"Crédit remboursé",creditRefundedDesc:"Votre crédit a été remboursé suite à l'erreur.",analysisFailedRefunded:"L'analyse a échoué mais votre crédit a été remboursé automatiquement."}},GB={title:"Conditions Générales d'Utilisation et de Vente",subt
608itle:"Conditions régissant l'utilisation de la plateforme Arcanes et l'achat de Crédits, conformément au droit belge et européen.",lastUpdate:"Dernière mise à jour",effectiveDate:"28 février 2026",preamble:{title:"Préambule",text:`Les présentes Conditions Générales (ci-après "CGU/CGV") constituent un contrat contraignant entre l'utilisateur (ci-après "l'Utilisateur") et l'éditeur de la plateforme Arcanes (ci-après "l'Ãditeur"). 609 610Ãditeur : DIGITAL ARCANES, Société à responsabilité limitée (SRL), dont le siège social est établi à Rue des 4 Carrés 4, 1325 Chaumont-Gistoux (Dion-Valmont), Belgique. 611Numéro d'entreprise (BCE) : 1033.931.611 612Numéro de TVA : BE 1033.931.611 613Email de contact : [email protected] 614Gérant : Yann Barbery 615 616Toute utilisation de la Plateforme ou achat de Crédits implique l'acceptation pleine, entière et sans réserve des présentes CGU/CGV.`},articles:{"1_object":{title:"1. Objet, Nature du Service et Absence de Conseil",content:"Arcanes est un outil logiciel d'agrégation et de traitement statistique de données immobilières publiques. Le Service est fourni en mode SaaS (Software as a Service) en tant qu'aide à la décision.",warning:{title:"â ï¸ AVERTISSEMENT LÃGAL : ABSENCE DE CONSEIL FINANCIER",text:`Arcanes NE FOURNIT PAS de conseil en investissement au sens de la loi du 25 octobre 2016 relative à l'accès à l'activité de prestation de services d'investissement, de la directive MiFID II (2014/65/UE), ni de conseil fiscal, juridique ou comptable au sens du Code de droit économique (Livre VII). 617 618Les analyses sont générées algorithmiquement à partir de données publiques (Statbel, cadastre, annonces) et sont fournies à titre purement informatif et indicatif. Aucune analyse ne constitue une recommandation personnalisée d'achat, de vente ou d'investissement. 619 620Les scores, indices et projections (TRI, cashflow, rendement, « Indice Investissement ») sont des résultats de calculs mathématiques sur base d'hypothèses. Ils ne constituent ni une évaluation professionnelle au sens de la norme IVS/EVS, ni une estimation au sens de l'article 3.56 du Code de droit économique.`}},"2_definitions":{title:"2. Définitions",items:`Plateforme : Le site web arcanes.be et l'ensemble des services associés. 621 622Utilisateur : Toute personne physique ou morale accédant à la Plateforme. 623 624Crédits : Unités de compte numériques acquises par l'Utilisateur permettant de débloquer des fonctionnalités (analyses). 625 626Analyse : Rapport généré automatiquement par la Plateforme synthétisant des données immobilières. 627 628Ãditeur : DIGITAL ARCANES SRL, éditeur et exploitant de la Plateforme.`},"3_beta":{title:"3. Disponibilité et Statut Bêta",content:`La Plateforme est proposée en version "Bêta". L'Utilisateur reconnaît et accepte que le service puisse contenir des bugs, des erreurs ou subir des interruptions temporaires. L'Ãditeur est soumis à une obligation de moyens pour assurer la disponibilité du service, sans garantie de continuité absolue (SLA).`},"4_automation":{title:"4. Limites de l'Automatisation",content:`Les résultats sont issus de traitements algorithmiques de données tierces. L'Ãditeur ne vérifie pas manuellement l'exactitude des données sources (annonces, données cadastrales, PEB, Statbel). Des biais, erreurs d'interprétation ou données obsolètes sont possibles. 629 630Il appartient à l'Utilisateur de vérifier les données auxquelles il accède à travers la Plateforme, en les comparant en tant que de besoin avec d'autres sources d'informations (visites physiques, experts immobiliers, données notariales, banques). 631 632Les estimations de prix, rendements et projections ne constituent en aucun cas une expertise immobilière au sens de la norme IVS/EVS ni un avis de valeur engageant l'Ãditeur.`},"5_disclaimer":{title:"5. Avertissement sur les Risques et Limites",alert:{title:"ð¨ LIMITES INHÃRENTES à LA DONNÃE",text:"Les performances passées ou les statistiques historiques présentées par Arcanes ne préjugent pas des résultats futurs. Le marché immobilier est cyclique et imprévisible."},obligations:{title:"Autonomie de l'Utilisateur",list:`- L'Utilisateur reconnaît qu'il utilise Arcanes comme un simple outil d'information parmi d'autres. 633- Il s'engage à croiser ces données avec des visites physiques, des avis professionnels (notaires, experts, agents immobiliers agréés IPI) et sa propre analyse. 634- Arcanes ne peut être tenu responsable d'une décision d'investissement infructueuse, d'une moins-value latente ou réalisée, d'un défaut de locataire, ou d'un écart entre les estimations générées et la valeur réelle du bien.`},risks:"Tout investissement immobilier comporte un risque de perte en capital. Vous agissez seul et sous votre entière responsabilité."},"6_obligations":{title:"6. Obligations et Interdictions",intro:"L'utilisation de la Plateforme est strictement personnelle. Il est formellement interdit de :",list:`- Pratiquer toute forme de 'scraping', 'crawling' ou extraction automatisée des données. 635- Revendre, sous-licencier ou redistribuer les analyses Arcanes à des tiers à titre onéreux ou gratuit. 636- Utiliser le service pour développer un service concurrent. 637- Partager ses identifiants : une session simultanée par compte. 638- Utiliser la Plateforme à des fins illicites ou contraires à l'ordre public.`}
638,"7_ip":{title:"7. Propriété Intellectuelle",platform:"Le code source, les algorithmes, la base de données, les textes et le design sont la propriété exclusive de DIGITAL ARCANES SRL, protégés par le droit d'auteur (Livre XI du Code de droit économique) et le droit des producteurs de bases de données.",user_rights:"L'Utilisateur reçoit une licence d'utilisation limitée, non-exclusive, non-cessible et révocable, pour son usage personnel uniquement.",data:"L'Ãditeur se réserve le droit d'utiliser les données d'utilisation de manière anonymisée et agrégée à des fins statistiques et d'amélioration du service."},"8_sales":{title:"8. Conditions de Vente (Crédits)",nature:`Les prix sont indiqués en Euros (â¬), TVA belge de 21% incluse. Les factures sont disponibles sur demande à [email protected]. 639 640L'Ãditeur se réserve le droit de modifier ses tarifs à tout moment pour toute nouvelle commande. Les tarifs applicables sont ceux en vigueur au moment de la validation de la commande. 641 642Les Crédits sont valables 24 mois à compter de la date d'achat. L'Utilisateur sera averti par email 30 jours puis 7 jours avant l'expiration de ses Crédits. Passé ce délai, les Crédits expirés sont définitivement perdus.`,payment:"Le paiement est exigible immédiatement à la commande via carte bancaire (Stripe).",retraction:{title:"8.4 RENONCIATION AU DROIT DE RÃTRACTATION",text:`CONFORMÃMENT à L'ARTICLE VI.53, 13° DU CODE DE DROIT ÃCONOMIQUE, LE DROIT DE RÃTRACTATION DE 14 JOURS NE S'APPLIQUE PAS à LA FOURNITURE D'UN CONTENU NUMÃRIQUE NON FOURNI SUR UN SUPPORT MATÃRIEL SI L'EXÃCUTION A COMMENCà AVEC L'ACCORD PRÃALABLE EXPRÃS DU CONSOMMATEUR ET QUE CELUI-CI A RECONNU PERDRE SON DROIT DE RÃTRACTATION. 643 644EN COCHANT LA CASE PRÃVUE à CET EFFET AVANT LE PAIEMENT, L'UTILISATEUR : 6451. DEMANDE EXPRESSÃMENT L'EXÃCUTION IMMÃDIATE DU SERVICE ; 6462. RECONNAÃT EXPRESSÃMENT QU'IL PERD SON DROIT DE RÃTRACTATION DÃS LA LIVRAISON DES CRÃDITS.`,contact:"En cas de défaut technique de livraison uniquement : [email protected]"}},"9_privacy":{title:"9. Données Personnelles (RGPD)",content:`Les données personnelles de l'Utilisateur sont traitées conformément au Règlement (UE) 2016/679 (RGPD) et à la loi belge du 30 juillet 2018. Le détail des traitements, finalités, bases légales et durées de conservation est décrit dans notre Politique de Confidentialité accessible à arcanes.be/privacy. 647 648L'Utilisateur dispose notamment d'un droit d'accès, de rectification, d'effacement, de limitation, de portabilité et d'opposition. Ces droits peuvent être exercés à tout moment en contactant [email protected]. 649 650Responsable du traitement : DIGITAL ARCANES SRL, Rue des 4 Carrés 4, 1325 Chaumont-Gistoux, Belgique. 651 652En cas de réclamation, l'Utilisateur peut introduire une plainte auprès de l'Autorité de Protection des Données (APD) : Rue de la Presse 35, 1000 Bruxelles â [email protected].`},"10_liability":{title:"10. Responsabilité",intro:"L'Ãditeur est soumis à une obligation de moyens concernant la disponibilité du service et l'exactitude des données.",list:`- EXCLUSIONS : L'Ãditeur décline toute responsabilité pour les dommages indirects, y compris la perte d'exploitation, la perte de chance, le manque à gagner, la perte de données ou tout préjudice résultant d'une décision prise sur base des analyses ou contenus générés par la Plateforme. 653- PLAFOND : Sauf en cas de dol (faute intentionnelle), de faute lourde ou d'atteinte à la vie, à l'intégrité physique ou à la santé, la responsabilité financière de l'Ãditeur envers l'Utilisateur est expressément limitée au montant total payé par l'Utilisateur durant les douze (12) mois précédant le fait générateur du dommage. 654- DONNÃES TIERS : L'Ãditeur ne garantit pas l'exactitude, l'exhaustivité ou l'actualité des données sources (PEB, cadastre, annonces, Statbel) fournies par des tiers.`},"11_termination":{title:"11. Résiliation et Suspension",user:"L'Utilisateur peut clôturer son compte à tout moment via les paramètres de son compte ou sur demande à [email protected]. La clôture entraîne la perte définitive des Crédits non utilisés. L'Utilisateur reste libre de demander préalablement l'export de ses données conformément à l'article 20 du RGPD.",editor:`En cas de violation des présentes CGU, l'Ãditeur peut suspendre l'accès au compte avec un préavis de 15 j
654ours par email, sauf en cas de violation grave (fraude, scraping, atteinte à la sécurité) justifiant une suspension immédiate sans préavis. 655 656En cas de résiliation par l'Ãditeur sans faute de l'Utilisateur (arrêt du service, décision unilatérale), les Crédits non utilisés feront l'objet d'un remboursement prorata au tarif d'achat.`},"12_law":{title:"12. Loi Applicable et Juridiction",content:`Les présentes CGU/CGV sont régies par le droit belge. 657 658En cas de litige, les parties s'efforceront de trouver une solution amiable dans un délai de 30 jours. à défaut, les tribunaux de l'arrondissement judiciaire du Brabant wallon sont compétents, sans préjudice du droit du consommateur de saisir le tribunal de son domicile conformément au Règlement (UE) n° 1215/2012. 659 660Conformément au Règlement (UE) n° 524/2013, le consommateur peut recourir à la plateforme de Règlement en Ligne des Litiges (RLL) de la Commission européenne : https://ec.europa.eu/consumers/odr`},"13_modifications":{title:"13. Modification des CGU/CGV",content:`L'Ãditeur se réserve le droit de modifier les présentes CGU/CGV à tout moment. En cas de modification substantielle, l'Utilisateur sera informé par email au moins 15 jours avant l'entrée en vigueur des nouvelles conditions. 661 662Si l'Utilisateur n'accepte pas les nouvelles conditions, il peut résilier son compte avant leur entrée en vigueur. La poursuite de l'utilisation de la Plateforme après la date d'entrée en vigueur vaut acceptation des nouvelles conditions. 663 664La date de dernière mise à jour est indiquée en haut de la présente page.`},"14_force_majeure":{title:"14. Force Majeure",content:`L'Ãditeur ne saurait être tenu responsable de l'inexécution ou du retard dans l'exécution de ses obligations en cas de force majeure au sens de l'article 5.226 du Code civil belge, notamment : catastrophe naturelle, pandémie, cyberattaque, panne généralisée d'infrastructure (AWS, Supabase, Stripe), décision gouvernementale ou réglementaire. 665 666En cas de force majeure d'une durée supérieure à 90 jours, chaque partie pourra résilier le contrat. Dans ce cas, les Crédits non utilisés seront remboursés au prorata.`}}},HB={title:"Conditions Générales du Service Agent Pro",subtitle:"Conditions régissant l'utilisation du service Arcanes Agent Pro par les professionnels de l'immobilier, conformément au droit belge.",lastUpdate:"Dernière mise à jour",effectiveDate:"13 avril 2026",preamble:{title:"Préambule",text:`Les présentes Conditions Générales du Service Agent Pro (ci-après « CGU Pro ») régissent l'accès et l'utilisation du service « Arcanes Agent Pro » édité par DIGITAL ARCANES SRL. 667 668Ãditeur : DIGITAL ARCANES, Société à responsabilité limitée (SRL), dont le siège social est établi à Rue des 4 Carrés 4, 1325 Chaumont-Gistoux (Dion-Valmont), Belgique. 669Numéro d'entreprise (BCE) : 1033.931.611 670Numéro de TVA : BE 1033.931.611 671Email de contact : [email protected] 672Gérant : Yann Barbery 673 674Les présentes CGU Pro complètent les Conditions Générales d'Utilisation accessibles sur arcanes.be/terms et la Politique de Confidentialité accessible sur arcanes.be/privacy. En cas de contradiction, les CGU Pro prévalent pour tout ce qui concerne le service Agent Pro.`},articles:{"1_qualification":{title:"1. Qualification Professionnelle",content:`1.1. Les présentes CGU Pro s'adressent exclusivement aux Utilisateurs agissant dans le cadre de leur activité professionnelle : agents immobiliers (agréés IPI), promoteurs, gestionnaires de patrimoine, agences immobilières et toute personne morale exerçant une activité liée à l'immobilier. 675 6761.2. En créant un compte Agent Pro, l'Utilisateur confirme : 677a) qu'il agit en qualité de professionnel au sens de l'article I.1, 1° du Code de droit économique ; 678b) qu'il dispose du pouvoir d'engager la personne morale qu'il représente, le cas échéant ; 679c) qu'il a connaissance que les dispositions de protection des consommateurs du Livre VI du Code de droit économique ne lui sont pas applicables. 680 6811.3. Conformément à l'article VI.53, 1° du Code de droit économique, le droit de rétractation de 14 jours prévu aux articles VI.47 à VI.52 ne s'applique pas aux contrats conclus entre professionnels.`},"2_object":{title:"2. Objet du Service",content:`2.1. Arcanes Agent Pro est un service SaaS d'aide à la décision destiné aux professionnels de l'immobilier. Il comprend : 682a) Rapport prospect : rapport d'analyse de 4 pages, généré sur base de données de marché (Statbel, cadastre, PEB), incluant des indicateurs financiers calculés algorithmiquement et des textes de synthèse rédigés par un outil d'aide à la rédaction ; 683b) Pitch card : fiche de synthèse d'1 page utilisable lors des visites ; 684c) Génération d'annonces : rédaction automatisée de descriptions de biens immobiliers ; 685d) Page acquéreur : page web interactive présentant un bien avec simulateurs intégrés ;
686e) Emails séquencés : envoi automatisé d'emails de suivi aux propriétaires, à la demande de l'agent ; 687f) Suivi d'engagement : mesure anonymisée de l'intérêt des visiteurs sur les pages acquéreur. 688 6892.2. L'ensemble de ces services constitue un ensemble d'outils permettant à l'Agent de préparer ses rendez-vous, d'argumenter ses recommandations de prix et de suivre ses prospects. Les résultats ne se substituent en aucun cas au jugement professionnel de l'Agent.`},"3_ai":{title:"3. Rôle de l'Intelligence Artificielle",content_intro:"3.1. Le service Agent Pro utilise deux technologies distinctes :",algo:{title:"Calculs algorithmiques",text:"Tous les indicateurs financiers (TRI, cashflow, rendement, scores, estimations de fourchettes de prix, projections) sont calculés par des algorithmes mathématiques développés par Arcanes, sur base de données publiques (Statbel, cadastre, SPF Finances). Ces calculs ne font pas appel à l'intelligence artificielle."},ia:{title:"Rédaction assistée par IA",text:"Les textes descriptifs (descriptions d'annonces, narration des rapports, emails séquencés aux propriétaires) sont générés par un modèle de langage (Anthropic Claude). Ces textes sont produits automatiquement sur base des données structurées du bien et du marché."},content_warnings:`3.2. Les textes générés par IA : 690- ne sont pas relus ni validés par un expert humain avant livraison ; 691- peuvent contenir des approximations, des erreurs factuelles ou des formulations inadaptées ; 692- ne reflètent pas l'opinion d'un expert immobilier ; 693- ne doivent pas être présentés par l'Agent comme un avis professionnel engageant Arcanes. 694 6953.3. Il appartient à l'Agent de relire et, le cas échéant, de modifier tout texte généré avant de le transmettre à un tiers (propriétaire, acquéreur, partenaire). 696 6973.4. Les données transmises à Anthropic pour la génération de textes sont traitées en mode « Zero Data Retention » (aucune conservation des données par le fournisseur d'IA après génération). Le détail de ce traitement est décrit dans la Politique de Confidentialité (section 4 â Sous-traitants).`},"4_no_advice":{title:"4. Nature du Service et Absence de Conseil",content:`4.1. Qualification du service. Arcanes Agent Pro est un outil de traitement statistique de données immobilières et d'aide à la rédaction. Il ne constitue pas : 698- un service de conseil en investissement au sens de la loi du 25 octobre 2016 relative à l'accès à l'activité de prestation de services d'investissement et au statut des sociétés de gestion de portefeuille ; 699- un service de conseil financier au sens de la directive MiFID II (2014/65/UE) ; 700- un service d'expertise immobilière au sens des normes IVS/EVS ; 701- un service de conseil fiscal, juridique ou comptable au sens du Code de droit économique (Livre VII).`,pricing:"4.2. Estimations et fourchettes de prix. Les estimations de prix fournies par la Plateforme sont des fourchettes indicatives calculées algorithmiquement sur base de données publiques. Elles ne constituent pas une évaluation professionnelle de la valeur vénale d'un bien. La fixation du prix de vente ou du prix du mandat relève de la seule responsabilité de l'Agent, dans le cadre de ses obligations déontologiques (Code de déontologie IPI) et légales.",no_duty:"4.3. Absence de devoir de conseil. Arcanes n'assume aucun devoir de conseil vis-à -vis de l'Agent ni vis-à -vis des tiers auxquels l'Agent communique des résultats de la Plateforme (propriétaires, acquéreurs, banques). L'Agent exerce son propre jugement professionnel et assume l'entière responsabilité de ses recommandations de prix, de ses avis et de ses actes professionnels.",fsma:"4.4. Non-inscription FSMA. DIGITAL ARCANES SRL n'est pas inscrite auprès de l'Autorité des services et marchés financiers (FSMA) en qualité de prestataire de services d'investissement, d'intermédiaire en crédit ou d'intermédiaire en assurances."},"5_verification":{title:"5. Obligation de Vérification",content:`5.1. L'Agent reconnaît que les analyses, estimations, scores et contenus générés par la Plateforme sont produits automatiquement et peuvent contenir des erreurs, des données obsolètes ou des approximations. 702 7035.2. Avant toute communication de résultats à un tiers (propriétaire, acquéreur, banque, notaire), l'Agent s'engage à : 704a) vérifier la cohérence des données avec sa connaissance du terrain et du bien visité ; 705b) confronter les fourchettes de prix avec d'autres sources d'information (comparaisons notariales, expertise locale, outils tiers) ; 706c) relire et adapter les textes générés par IA pour s'assurer qu'ils reflètent fidèlement la réalité du bien ; 707d) ne jamais présenter les résultats de la Plateforme comme un avis d'expert, une expertise immobilière ou un document engageant la responsabilité d'Arcanes. 708 7095.3. L'Agent est le seul professionnel agréé dans la relation avec le propriétaire ou l'acquéreur. La décision de communiquer un prix, une estimation ou un rapport relève de sa seule responsabilité professionnelle.`},"6_indemnification":{title:"6. Responsabilité de l'Agent et Indemnisation",responsibility:`6.1. Responsabilité professionnelle. L'Agent est seul responsable : 710a) du prix qu'il recommande au propriétaire ou à l'acquéreur. Les fourchettes de prix fournies par Arcanes sont indicatives ; le prix du mandat est fixé par l'Agent sous sa propre responsabilité professionnelle ; 711b) de l'usage qu'il fait des rapports, pitch cards, descriptions et emails générés par la Plateforme, y compris leur communication à des tiers ; 712c) de la conformité de sa pratique avec ses obligations déontologiques (Code IPI) et légales.`,indemnity:`6.2. Indemnisation. L'Agent s'engage à indemniser et à dégager de toute responsabilité DIGITAL ARCANES SRL, ses dirigeants et collaborateurs, à l'égard de toute réclamation, action en justice, poursuite, demande de dommages-intérêts ou amende émanant : 713a) d'un propriétaire, acquéreur, locataire ou tout autre tiers auquel l'Agent aurait communiqué des informations, rapports ou contenus obtenus via la Plateforme ; 714b) d'une autorité de régulation (IPI, SPF Ãconomie, FSMA) consécutivement à l'usage que l'Agent fait du Service. 715 716Cette indemnisation couvre les dommages directs et indirects, y compris les frais de défense raisonnables (honoraires d'avocat).`,limitation:"6.3. Limitation. L'obligation d'indemnisation ne s'applique pas si le dommage résulte directement et exclusivement d'une faute intentionnelle ou d'une faute lourde de DIGITAL ARCANES SRL."},"7_ip":{title:"7. Propriété Intellectuelle",arcanes:"7.1. Propriété d'Arcanes. Le code source, les algorithmes, les modèles de calcul, les templates de rapports, la base de données, la marque « Arcanes » et l'ensemble des éléments visuels de la Plateforme sont la propriété exclusive de DIGITAL ARCANES SRL, protégés par le Livre XI du Code de droit économique (droit d'auteur et droits des producteurs de bases de données).",license:`7.2. Licence Agent. L'Agent reçoit une licence d'utilisation limitée, non exclusive, non cessible et révocable, pour : 717a) utiliser le Service Agent Pro dans le cadre de son activité professionnelle ; 718b) communiquer les rapports, pitch cards et résultats générés à ses clients, prospects et propriétaires, par voie électronique ou en impression ; 719c) intégrer les données de la Plateforme dans ses propres présentations commerciales, à condition de maintenir la mention « Données Arcanes â à titre indicatif ».`,prohibitions:`7.3. Interdictions. L'Agent s'interdit notamment de : 720a) revendre, sous-licencier ou redistribuer les rapports, données ou contenus à un tiers concurrent ou à titre c
720ommercial autonome ; 721b) pratiquer toute forme de scraping, extraction automatisée ou reproduction systématique de la base de données ; 722c) supprimer ou modifier les mentions de propriété intellectuelle, les disclaimers ou les crédits « Arcanes » figurant sur les documents générés ; 723d) utiliser le Service pour développer un produit ou service concurrent.`,agent_data:"7.4. Données de l'Agent. Les données fournies par l'Agent (notes, photos, informations biens) restent sa propriété. L'Agent peut en demander l'export à tout moment."},"8_confidentiality":{title:"8. Confidentialité",mutual:"8.1. Obligation réciproque. Chaque Partie s'engage à traiter comme confidentielles toutes les informations de nature commerciale, technique ou stratégique dont elle a connaissance dans le cadre de l'exécution du Service, et à ne pas les divulguer à des tiers sans l'accord préalable écrit de l'autre Partie.",agent_notes:`8.2. Notes de l'Agent. Les informations saisies par l'Agent dans le champ « notes agent » (contexte prospect, situation du propriétaire, agents concurrents, urgence) sont considérées comme strictement confidentielles. Arcanes : 724a) utilise ces notes uniquement pour personnaliser le ton des contenus générés (rapports, emails) ; 725b) ne cite jamais textuellement le contenu des notes dans les documents générés ; 726c) ne transmet ces notes à aucun tiers, y compris au propriétaire ; 727d) supprime ces notes à la demande de l'Agent ou à la résiliation du compte.`,exceptions:`8.3. Exceptions. L'obligation de confidentialité ne s'applique pas aux informations : 728a) déjà publiquement disponibles au moment de leur communication ; 729b) devenues publiques sans faute de la Partie réceptrice ; 730c) dont la divulgation est exigée par une autorité judiciaire ou administrative.`,duration:"8.4. Durée. L'obligation de confidentialité survit pendant une durée de deux (2) ans après la résiliation du contrat."},"9_acceptable_use":{title:"9. Usage Acceptable",authorized:`9.1. Usages autorisés. L'Agent est autorisé à utiliser le Service Agent Pro exclusivement dans le cadre de son activité d'intermédiation immobilière, pour : 731a) préparer et argumenter ses rendez-vous avec des propriétaires ; 732b) générer des rapports et pitch cards destinés à ses clients et prospects ; 733c) rédiger des descriptions d'annonces pour les biens dont il a le mandat ; 734d) envoyer des emails de suivi aux propriétaires avec lesquels il a eu un contact professionnel.`,emails:`9.2. Emails séquencés â Responsabilité de l'Agent. L'Agent garantit : 735a) qu'il dispose d'une base légale valable (intérêt légitime professionnel ou relation précontractuelle) pour contacter chaque propriétaire destinataire d'un email séquencé ; 736b) qu'il n'utilise pas le système d'emails séquencés à des fins de prospection commerciale de masse non sollicitée ; 737c) qu'il traite immédiatement toute demande de désinscription d'un propriétaire. 738En cas de plainte d'un destinataire, l'Agent assume l'entière responsabilité conformément à l'article 6.2.`,prohibitions:`9.3. Interdictions. Il est formellement interdit : 739a) de partager ses identifiants de connexion ou de permettre l'accès au compte par un tiers non autorisé ; 740b) de pratiquer toute forme de scraping, crawling ou extraction automatisée des données de la Plateforme ; 741c) d'utiliser le Service pour développer un produit ou service concurrent ; 742d) d'utiliser le Service à des fins illicites, diffamatoires ou contraires à l'ordre public ; 743e) de contourner les limites techniques du Service (quotas, restrictions d'accès).`,abnormal:"9.4. Utilisation anormale. Arcanes se réserve le droit de suspendre temporairement l'accès d'un Agent en cas d'utilisation anormale, notamment : connexion depuis un nombre excessif de terminaux, volume de génération disproportionné, ou usage programmatique non autorisé. L'Agent sera notifié par email et pourra contacter le support pour clarification."},"10_gdpr":{title:"10. Données Personnelles et RGPD",roles:`10.1. Rôles. Dans le cadre du Service Agent Pro : 744a) l'Agent agit en qualité de responsable de traitement au sens de l'article 4(7) du RGPD pour les données des propriétaires (emails, noms, adresses de biens) qu'il saisit dans la Plateforme ; 745b) DIGITAL ARCANES SRL agit en qualité de sous-traitant au sens de l'article 28 du RGPD pour le traitement de ces données.`,dpa:`10.2. Accord de sous-traitance (DPA). Les conditions de sous-traitance sont décrites dans l'Annexe DPA accessible sur arcanes.be/pro/dpa, qui fait partie intégrante des présentes CGU Pro. Cette annexe détaille : 746a) la nature et la finalité du traitement ; 747b) les catégories de données et de personnes concernées ; 748c) les sous-sous-traitants autorisés (Anthropic PBC pour la génération de textes â mode Zero Data Retention) ; 749d) les mesures de sécurité techniques et organisationnelles ; 750e) les obligations en cas de violation de données.`,agent_obligations:`10.3. Obligations de l'Agent. En tant que responsable de traitement, l'Agent : 751a) garantit disposer d'une base légale valable pour collecter et transmettre à Arcanes les données personnelles des propriétaires ; 752b) est responsable de répondre aux demandes d'exercice des droits RGPD (accès, effacement, portabilité) émanant des propriétaires ; 753c) informe les propriétaires du traitement de leurs données, y compris du recours à Arcanes comme sous-traitant.`,privacy:"10.4. Politique de Confidentialité. Le traitement des données personnelles de l'Agent lui-même (compte, connexion, facturation) est décrit dans la Politique de Confidentialité générale accessible sur arcanes.be/privacy."},"11_liability":{title:"11. Responsabilité d'Arcanes et Disponibilité",obligation:"11.1. Obligation de moyens. Arcanes est soumise à une obligation de moyens concernant la disponibilité du Service, l'exactitude des calculs algorithmiques et la qualité des textes générés.",availability:"11.2. Disponibilité. Arcanes s'efforce de maintenir le Service accessible 24h/24 et 7j/7, avec un objectif de disponibilité de 99% hors péri
753odes de maintenance programmée. En cas de maintenance entraînant une interruption, l'Agent sera notifié dans un délai raisonnable. Arcanes ne garantit pas une disponibilité ininterrompue et ne pourra être tenue responsable des conséquences d'une indisponibilité temporaire.",exclusions:`11.3. Exclusions de responsabilité. Arcanes décline toute responsabilité pour : 754a) les dommages indirects, y compris la perte d'exploitation, la perte de clientèle, le manque à gagner, la perte de mandats ou la perte de données ; 755b) tout préjudice résultant d'une décision de l'Agent ou d'un tiers prise sur base des analyses, estimations ou contenus générés par la Plateforme ; 756c) les erreurs, approximations ou formulations inadaptées dans les textes générés par IA ; 757d) l'inexactitude, l'incomplétude ou l'obsolescence des données sources (Statbel, cadastre, PEB, annonces) fournies par des tiers ; 758e) l'usage que l'Agent fait des résultats en violation des présentes CGU Pro.`,cap:"11.4. Plafond de responsabilité. Sauf en cas de dol, de faute lourde, ou d'atteinte à la vie, à l'intégrité physique ou à la santé, la responsabilité financière totale et cumulée d'Arcanes envers l'Agent est expressément limitée au montant total des sommes payées par l'Agent au titre du Service Agent Pro durant les douze (12) mois précédant le fait générateur du dommage.",force_majeure:"11.5. Force majeure. Arcanes ne pourra être tenue responsable en cas de force majeure au sens de l'article 5.226 du Code civil belge, notamment : catastrophe naturelle, pandémie, cyberattaque, panne généralisée d'infrastructure (AWS, Supabase, Anthropic, Stripe), décision gouvernementale ou réglementaire. En cas de force majeure d'une durée supérieure à 90 jours, chaque Partie pourra résilier le contrat. Les crédits non utilisés seront remboursés au prorata."},"12_billing":{title:"12. Abonnement et Facturation",credits:"12.1. Crédits. L'accès au Service Agent Pro fonctionne par système de crédits. Chaque crédit permet de générer un rapport prospect ou une pitch card pour un bien déterminé. Les tarifs en vigueur sont affichés sur la page Tarifs de la Plateforme.",pricing:"12.2. Prix. Les prix sont indiqués en Euros (â¬), TVA belge de 21% incluse. Les factures sont disponibles sur demande à [email protected].",validity:"12.3. Validité des crédits. Les crédits sont valables vingt-quatre (24) mois à compter de la date d'achat. L'Agent sera averti par email 30 jours puis 7 jours avant l'expiration. Passé ce délai, les crédits expirés sont définitivement perdus.",modification:"12.4. Modification des tarifs. Arcanes se réserve le droit de modifier ses tarifs à tout moment pour toute nouvelle commande. Les tarifs applicables sont ceux en vigueur au moment de la validation de la commande. En cas de modification des tarifs pour les abonnements en cours, l'Agent sera informé au moins 30 jours avant l'entrée en vigueur.",payment:"12.5. Paiement. Le paiement est exigible immédiatement à la commande via carte bancaire (Stripe). Les données bancaires ne sont jamais stockées sur les serveurs d'Arcanes."},"13_termination":{title:"13. Résiliation",by_agent:"13.1. Résiliation par l'Agent. L'Agent peut clôturer son compte Agent Pro à tout moment via les paramètres de son compte ou sur demande à [email protected]. La clôture entraîne la perte définitive des crédits non utilisés, sauf accord contraire.",by_arcanes_notice:"13.2. Résiliation par Arcanes â avec préavis. En cas de violation des présentes CGU Pro, Arcanes peut suspendre ou résilier l'accès au compte avec un préavis de quinze (15) jours par email, durant lequel l'Agent peut régulariser sa situation.",by_arcanes_immediate:"13.3. Résiliation par Arcanes â sans préavis. En cas de violation grave (fraude, scraping, atteinte à la sécurité, usage du Service pour des activités illicites, prospection de masse non sollicitée), Arcanes peut suspendre immédiatement l'accès sans préavis.",by_arcanes_no_fault:"13.4. Résiliation par Arcanes â sans faute de l'Agent. En cas de cessation du Service Agent Pro (décision de l'Ãditeur, restructuration), les crédits non utilisés feront l'objet d'un remboursement prorata au tarif d'achat. L'Agent sera notifié au moins 60 jours avant la cessation.",data:`13.5. Sort des données. à la résiliation : 759a) l'Agent peut demander l'export de ses données (Art. 20 RGPD) dans un délai de 30 jours suivant la clôture ; 760b) les données de l'Agent (rapports, notes, biens) sont supprimées dans les 30 jours suivant la clôture, sauf obligation légale de conservation (factures : 7 ans) ; 761c) les données des propriétaires saisies par l'Agent sont supprimées conformément au DPA.`},"14_general":{title:"14. Dispositions Générales",law:"14.1. Droit applicable. Les présentes CGU Pro sont régies par le droit belge, en ce compris le Code de droit économique et le Code civil.",jurisdiction:"14.2. Juridiction. En cas de litige, les Parties s'efforceront de trouver une solution amiable dans un délai de trente (30) jours. à défaut, les tribunaux de l'arrondissement judiciaire du Brabant wallon sont exclusivement compétents.",severability:"14.3. Divisibilité. Si une disposition des présentes CGU Pro est jugée nulle ou inapplicable, les autres dispositions restent en vigueur. La disposition nulle sera remplacée par une disposition valide qui se rapproche le plus de l'objectif économique poursuivi par les Parties.",assignment:"14.4. Cession. Arcanes peut céder ou transférer les droits et obligations découlant des présentes CGU Pro à un tiers (en cas de fusion, acquisition ou restructuration), sous réserve que l'Agent bénéficie de conditions au moins équivalentes. L'Agent ne peut céder ses droits sans l'accord préalable écrit d'Arcanes.",entirety:"14.5. Intégralité. Les présentes CGU Pro, y compris l'Annexe DPA, constituent l'intégralité de l'accord entre les Parties concernant le Service Agent Pro et remplacent tout accord antérieur relatif au même objet.",modifications:"14.6. Modifications. Arcanes se réserve le droit de modifier les présentes CGU Pro. En cas de modification substantielle, l'Agent sera informé par email au moins trente (30) jours avant l'entrée en vigueur. Si l'Agent n'accepte pas les nouvelles conditions, il peut résilier son compte avant leur entrée en vigueur. La poursuite de l'utilisation du Service après la date d'entrée en vigueur vaut acceptation.",proof:"14.7. Convention de preuve. Les Parties conviennent que les écrits électroniques échangés entre elles font foi et prouvent valablement la teneur de leurs échanges et engagements."}}},KB={title:"Mentions Légales",subtitle:"Informations légales relatives à l'édition et à l'hébergement de la plateforme Arcanes, conformément au Code de droit économique belge (Livre XII).",lastUpdate:"Dernière mise à jour",effectiveDate:"28 février 2026",footer_links:{terms:"Conditions Générales d'Utilisation",privacy:"Politique de Confidentialité",cookies:"Gérer mes cookies"},sections:{"1_editor":{title:"1. Ãditeur de la Plateforme",intro:"La plateforme Arcanes, accessible à l'adresse arcanes.be, est éditée par :",labels:{name:"Raison sociale",form:"Forme juridique",address:"Siège social",bce:"Numéro d'entreprise (BCE)",vat:"Numéro de TVA",email:"Email de contact"},values:{name:"DIGITAL ARCANES",form:"Société à responsabilité limitée (SRL)",address:`Rue des 4 Carrés 4 7621325 Chaumont-Gistoux (Dion-Valmont), Belgique`,bce:"1033.931.611",vat:"BE 1033.931.611",email:"[email protected]"},activity:"Activité : Plateforme d'aide à la décision pour l'analyse d'investissements immobiliers en Belgique."},"2_director":{title:"2. Responsable Ãditorial",intro:"Le responsable éditorial de la plateforme Arcanes est :",values:{name:"Yann Barbery",function:"Gérant / Fondateur",email:"[email protected]"},labels:{function:"Fonction :",email:"Email :"},footer:"Le responsable éditorial est responsable des contenus publiés sur la plateforme, conformément aux dispositions légales en vigueur."},"3_hosting":{title:"3. Hébergement",intro:"La plateforme Arcanes est hébergée par :",providers:[{name:"Lovable (GPT Engineer AB)",desc:"Hébergement frontend et CDN (Content Delivery Network)",regi
762on:"Région : Union Européenne",website:"Site web : lovable.dev"},{name:"Supabase Inc.",desc:"Backend, base de données et authentification â Infrastructure cloud basée sur AWS (Amazon Web Services)",region:"Région : EU-WEST (Paris, France)",website:"Site web : supabase.com"}],compliance:"Conformité : L'ensemble des données sont hébergées sur des serveurs situés dans l'Union Européenne, conformément au Règlement Général sur la Protection des Données (RGPD).",note:"ð¡ Note : Pour toute demande concernant les infrastructures d'hébergement ou la localisation des données, veuillez contacter :"},"4_ip":{title:"4. Propriété Intellectuelle",sub_1:{title:"4.1. Titularité des droits",text:`L'ensemble des éléments composant la plateforme Arcanes (structure, design, graphismes, textes, logos, bases de données, logiciels, code source, algorithmes, marques, etc.) est la propriété exclusive de DIGITAL ARCANES SRL ou fait l'objet de licences d'utilisation régulières. 763 764Ces éléments sont protégés par les lois belges et européennes relatives à la propriété intellectuelle, notamment le Livre XI du Code de droit économique belge (droit d'auteur, droits voisins, bases de données) et les conventions internationales applicables.`},sub_2:{title:"4.2. Nom et identité visuelle Arcanes",text:`Le nom « Arcanes », ainsi que tous les logos et visuels associés, sont la propriété exclusive de DIGITAL ARCANES SRL et constituent des éléments distinctifs de son identité commerciale. 765 766Toute utilisation, reproduction ou représentation du nom « Arcanes » ou de ses éléments visuels sans autorisation préalable écrite est strictement interdite et susceptible d'engager la responsabilité civile de son auteur, notamment sur le fondement de la concurrence déloyale et de la protection du nom commercial.`},sub_3:{title:"4.3. Licence d'utilisation",text:`L'accès à la plateforme confère aux utilisateurs un droit d'usage privé, personnel, non transférable et non exclusif des contenus et services proposés, pour la durée de leur inscription sur la Plateforme. 767 768Sont notamment interdits, sans autorisation préalable écrite de DIGITAL ARCANES SRL :`,list:`- La reproduction, totale ou partielle, du site ou de ses contenus 769- La représentation, diffusion, modification ou adaptation des éléments du site 770- L'extraction ou la réutilisation substantielle de données (scraping massif) 771- La décompilation, le reverse engineering ou toute tentative d'accès au code source 772- L'utilisation commerciale des contenus sans accord préalable 773- La suppression ou modification des mentions de propriété intellectuelle`},sub_4:{title:"4.4. Contenu utilisateur",text:`Les simulations et rapports générés par l'utilisateur via la plateforme restent sa propriété. L'utilisateur peut les télécharger, les utiliser et les partager librement. 774 775DIGITAL ARCANES SRL se réserve toutefois un droit d'utilisation des données agrégées et anonymisées à des fins statistiques et d'amélioration du service, conformément à la Politique de Confidentialité.`},sub_5:{title:"4.5. Signalement d'une contrefaçon",text:"Si vous estimez qu'un contenu publié sur la plateforme porte atteinte à vos droits de propriété intellectuelle, vous pouvez le signaler à :"}},"5_privacy":{title:"5. Protection des Données Personnelles",text_1:"Le traitement des données personnelles des utilisateurs est régi par notre Politique de Confidentialité, accessible à l'adresse :",button:"Consulter la Politique de Confidentialité",text_2:"Cette politique décrit les données collectées, les finalités du traitement, vos droits RGPD et les mesures de sécurité mises en Åuvre conformément au Règlement (UE) 2016/679 (RGPD) et à la loi belge du 30 juillet 2018 relative à la protection des personnes physiques à l'égard des traitements de données à caractère personnel.",text_contact:"Pour toute question relative à vos données personnelles, contactez :"},"6_cookies":{title:"6. Cookies et Traceurs",text_1:"La plateforme Arcanes utilise des cookies et technologies similaires pour assurer son bon fonctionnement et améliorer l'expérience utilisateur.",text_2:"La gestion de vos préférences en matière de cookies est assurée par notre gestionnaire de consentement intégré, conforme au RGPD et à la directive ePrivacy.",button:"Gérer mes préférences cookies",text_3:"Vous pouvez à tout moment modifier vos choix concernant les cookies en cliquant sur le lien ci-dessus ou via le bouton « Gérer les cookies » présent en bas de chaque page."},"7_links":{title:"7. Liens Hypertextes",sub_1:{title:"7.1. Liens sortants",text:`La plateforme peut contenir des liens hypertextes vers d'autres sites web (sites immobiliers, institutions publiques, partenaires, etc.). DIGITAL ARCANES SRL n'exerce aucun contrôle sur ces sites tiers et décline toute responsabilité quant à leur contenu, leur disponibilité ou leurs pratiques en matière de protection des données. 776 777L'accès à ces sites tiers se fait sous la seule responsabilité de l'utilisateur, qui doit prendre connaissance de leurs conditions d'utilisation et politiques de confidentialité.`},sub_2:{title:"7.2. Liens entrants",text:`La mise en place de liens hypertextes vers la plateforme Arcanes est autorisée, à condition que ces liens ne présentent pas la plateforme sous un jour défavorable ou trompeur. 778 779Le framing (intégration de la plateforme dans un cadre ou iframe sur un site tiers) est strictement interdit sans autorisation écrite préalable.`}},"8_credits":{title:"8. Crédits et Technologies",intro:"La plateforme Arcanes a été développée en utilisant les technologies et services suivants :",items:{frontend:{label:"Frontend",val:"React, TypeScript, Tailwind CSS"},backend:{label:"Backend & Base de données",val:"Supabase (PostgreSQL)"},hosting:{label:"Hébergement",val:"Lovable (frontend / CDN, UE) + AWS EU-WEST Paris (backend)"},payment:{label:"Paiements",val:"Stripe"}
779,email:{label:"Emails transactionnels",val:"Google Workspace (SMTP)"},workflows:{label:"Automatisation",val:"n8n Cloud (Allemagne, UE)"},cookies:{label:"Gestion des cookies",val:"vanilla-cookieconsent (open source, MIT)"},analytics:{label:"Analytics",val:"Google Analytics 4 (après consentement)"}},footer:`Icônes : Lucide Icons (licence MIT) 780Polices : Outfit (licence SIL Open Font License, hébergée localement)`},"9_law":{title:"9. Loi Applicable et Juridiction",text:`Les présentes mentions légales sont régies par le droit belge, en ce compris le Code de droit économique. 781 782En cas de litige relatif à l'interprétation ou l'application des présentes mentions légales, les tribunaux de l'arrondissement judiciaire du Brabant wallon sont compétents, sans préjudice du droit du consommateur de saisir le tribunal de son domicile conformément au Règlement (UE) n° 1215/2012. 783 784Conformément au Règlement (UE) n° 524/2013, le consommateur peut recourir à la plateforme de Règlement en Ligne des Litiges (RLL) de la Commission européenne : https://ec.europa.eu/consumers/odr`},"10_contact":{title:"10. Contact",intro:"Pour toute question concernant les présentes mentions légales ou la plateforme Arcanes :",values:{name:"DIGITAL ARCANES SRL",address:"Rue des 4 Carrés 4, 1325 Chaumont-Gistoux, Belgique",email:"[email protected]"},labels:{address:"Adresse :",email:"Email :"}}}},YB={title:"Politique de Confidentialité",subtitle:"Protection de vos données personnelles conformément au Règlement Général sur la Protection des Données (RGPD) et à la loi belge du 30 juillet 2018.",badge:"Conforme RGPD",lastUpdate:"Dernière mise à jour",effectiveDate:"28 février 2026",footer_links:{terms:"Conditions Générales d'Utilisation",legal:"Mentions Légales",cookies:"Gérer mes cookies"},sections:{"0_preamble":{title:"Préambule",text:`La présente Politique de Confidentialité décrit comment DIGITAL ARCANES SRL (ci-après "nous", "notre" ou "Arcanes") collecte, utilise, stocke et protège vos données personnelles lorsque vous utilisez notre plateforme accessible à l'adresse arcanes.be. 785 786Nous accordons la plus grande importance à la protection de votre vie privée et nous nous engageons à respecter le Règlement (UE) 2016/679 du 27 avril 2016 (RGPD) ainsi que la loi belge du 30 juillet 2018 relative à la protection des personnes physiques à l'égard des traitements de données à caractère personnel.`,note:"ð Cette politique complète les Conditions Générales d'Utilisation (CGU) disponibles sur arcanes.be/terms"},"1_controller":{title:"1. Responsable du Traitement",intro:"Le responsable du traitement de vos données personnelles au sens de l'article 4(7) du RGPD est :",info:{name:"DIGITAL ARCANES",form:"Forme juridique : Société à responsabilité limitée (SRL)",address:"Siège social : Rue des 4 Carrés 4, 1325 Chaumont-Gistoux (Dion-Valmont), Belgique",bce:"Numéro d'entreprise (BCE) : 1033.931.611",vat:"Numéro de TVA : BE 1033.931.611",email:"Email : [email protected]"},dpo_title:"Contact pour les questions relatives aux données",dpo_text:`Conformément à l'article 37 du RGPD, compte tenu de la nature et de l'ampleur de nos activités, nous ne sommes pas tenus de désigner un Délégué à la Protection des Données (DPO). 787 788Pour toute question relative à la protection de vos données personnelles ou pour exercer vos droits, contactez-nous directement à : [email protected]`},"2_collected":{title:"2. Données Personnelles Collectées",intro:"Nous collectons et traitons les catégories de données personnelles suivantes :",sub_1:{title:"2.1. Données d'identification et de contact",list:`- Adresse email : Obligatoire pour la création de compte et l'authentification 789- Nom et prénom : Optionnel, si vous choisissez de les renseigner dans votre profil 790- Numéro de téléphone : Optionnel, si vous le fournissez pour le support`},sub_2:{title:"2.2. Données d'authentification et de sécurité",list:`- Mot de passe : Chiffré (hashé) et jamais stocké en clair 791- Tokens de session : Générés automatiquement pour maintenir votre connexion 792- Adresse IP : Collectée automatiquement lors de la connexion pour des raisons de sécurité 793- User-agent : Informations sur votre navigateur et appareil`},sub_3:{title:"2.3. Données d'utilisation et de navigation",list:`- Logs de connexion : Date, heure, durée des sessions 794- Historique d'utilisation : Pages visitées, fonctionnalités utilisées 795- Statistiques d'usage : Nombre d'analyses réalisées, crédits consommés 796- Préférences utilisateur : Paramètres de compte, langue, thème d'affichage`},sub_4:{title:"2.4. Données de simulation immobilière",list:`- Projets immobiliers anal
796ysés : Adresses, caractéristiques des biens recherchés 797- Critères de recherche : Budget, localisation, type de bien 798- Simulations financières : Paramètres saisis, résultats générés 799- Rapports générés : Analyses téléchargées ou consultées`,alert:"ð Ces données sont liées à votre compte et ne sont pas partagées avec des tiers. Elles sont utilisées exclusivement pour vous fournir les analyses demandées et ne constituent en aucun cas une recommandation personnalisée d'investissement."},sub_5:{title:"2.5. Données de paiement et de facturation",list:`- Informations de facturation : Nom, adresse de facturation (si fournie) 800- Historique des transactions : Date, montant, méthode de paiement 801- Solde de crédits : Crédits disponibles et consommés`,alert:"ð Important : Vos données bancaires (numéro de carte, CVV) ne sont JAMAIS collectées ni stockées sur nos serveurs. Tous les paiements sont gérés de manière sécurisée par Stripe, prestataire certifié PCI-DSS niveau 1."},sub_6:{title:"2.6. Données de communication",list:`- Emails échangés : Correspondance avec notre support 802- Tickets de support : Demandes d'assistance, rapports de bugs 803- Retours d'expérience : Feedbacks durant la phase bêta (optionnel)`},sub_7:{title:"2.7. Cookies",text:"Nous utilisons des cookies et technologies similaires. La gestion de vos préférences cookies est assurée par notre gestionnaire de consentement intégré, conforme au RGPD et à la directive ePrivacy. Pour plus d'informations, consultez la section Cookies ci-dessous ou gérez vos préférences via le bouton « Gérer les cookies » présent en bas de chaque page."},sub_8:{title:"2.8. Données traitées pour le compte d'agents immobiliers (Service Agent Pro)",list:`Dans le cadre du service Agent Pro, Arcanes traite certaines données pour le compte des agents immobiliers abonnés : 804- Adresses email des propriétaires de biens : fournies par l'agent pour l'envoi d'emails de suivi post-visite 805- Notes confidentielles de l'agent : utilisées pour personnaliser le ton des communications générées, jamais citées textuellement 806- Données d'engagement des visiteurs : pages vues, simulations effectuées, temps passé sur la page d'un bien (données anonymisées, sans identification personnelle du visiteur)`,alert:"ð Pour ces traitements, l'agent immobilier est responsable de traitement au sens du RGPD. Arcanes agit en qualité de sous-traitant technique (Art. 28 RGPD) et ne réutilise pas ces données pour d'autres finalités. Les contenus textuels (rapports, descriptions, emails) sont générés via l'API Anthropic Claude en mode Zero Data Retention (aucune conservation des données par le fournisseur d'IA)."}},"3_legal_basis":{title:"3. Base Légale et Finalités",intro:"Conformément à l'article 6 du RGPD, nous traitons vos données personnelles sur les bases légales suivantes :",table_headers:["Finalité du traitement","Base légale (RGPD)","Données concernées"],table_rows:[{purpose:`Création et gestion de votre compte 807(Accès à la Plateforme)`,basis:"Art. 6(1)(b) - Exécution du contrat",data:"Email, mot de passe, préférences"},{purpose:`Fourniture du service d'analyse immobilière 808(Générer les simulations)`,basis:"Art. 6(1)(b) - Exécution du contrat",data:"Données de simulation, projets immobiliers"},{purpose:"Gestion des paiements et facturation",basis:`Art. 6(1)(b) - Exécution du contrat 809Art. 6(1)(c) - Obligation légale`,data:"Infos facturation, historique transactions"},{purpose:`Envoi d'emails transactionnels 810(Confirmation, réinitialisation, notifications)`,basis:"Art. 6(1)(b) - Exécution du contrat",data:"Adresse email"},{purpose:"Support client et assistance technique",basis:"Art. 6(1)(b) - Exécution du contrat",data:"Email, tickets support, logs techniques"},{purpose:"Sécurité et prévention de la fraude",basis:"Art. 6(1)(f) - Intérêt légitime",data:"IP, logs, user-agent, comportement suspect"},{purpose:`Amélioration de la Plateforme 811(Analytics agrégées, sans profilage individuel)`,basis:"Art. 6(1)(f) - Intérêt légitime",data:"Données d'usage anonymisées/agrégées"},{purpose:`Mesure d'audience (Google Analytics 4) 812(Mode anonymisé, après consentement)`,basis:"Art. 6(1)(a) - Consentement",data:"IP anonymisée, pages visitées, durée"},{purpose:"Communication marketing (newsletters)",basis:"Art. 6(1)(a) - Consentement",data:"Email (désinscription possible)"},{purpose:"Obligations légales et comptables",basis:"Art. 6(1)(c) - Obligation légale",data:"Factures, données de paiement"},{purpose:`Suivi d'engagement des visiteurs (Service Agent Pro) 813(Mesure d'intérêt anonymisée sur les pages biens)`,basis:"Art. 6(1)(f) - Intérêt légitime de l'agent immobilier (responsable de traitement)",data:"Pages consultées, simulations effectuées, durée de visite (sans identification personnelle)"},{purpose:`Envoi d'emails de suivi aux propriétaires (Service Agent Pro) 814(Séquence automatisée post-visite, à la demande de l'agent)`,basis:`Art. 6(1)(f) - Intérêt légitime de l'agent (responsable de traitement) 815Arcanes = sous-traitant (Art. 28 RGPD)`,data:"Email propriétaire, nom, adresse du bien, données de marché"}],note:"ð Note sur l'intérêt légitime : Lorsque nous invoquons l'intérêt légitime, nous avons effectué un test de proportionnalité pour nous assurer que vos droits et libertés ne sont pas affectés de manière disproportionnée."},"4_recipients":{title:"4. Destinataires des Données",intro:"Vos données personnelles peuvent être partagées avec les catégories de destinataires suivants :",sub_1:{title:"4.1. Personnel autorisé",list:`- Les employés et collaborateurs d'Arcanes ayant besoin d'accéder aux données 816- Tous soumis à une obligation de confidentialité`},sub_2:{title:"4.2. Sous-traitants",intro:"Nous faisons appel aux sous-traitants suivants (Art. 28 RGPD) :"},table_headers:["Sous-traitant","Service","Localisation","Garanties"],table_rows:[{name:"Supabase Inc.",service:"Base de données, authentification, stockage",loc:"UE (Paris, France)",guarantee:"Serveurs UE - Conforme RGPD"},{name:"Stripe Inc.",service:"Paiements sécurisés",loc:"USA",guarantee:"PC
816I-DSS niveau 1 + Data Privacy Framework (DPF)"},{name:"Google LLC (Analytics)",service:"Mesure d'audience (GA4)",loc:"USA",guarantee:"DPF + IP anonymisée + Consentement préalable"},{name:"Google LLC (SMTP)",service:"Envoi d'emails transactionnels via Google Workspace",loc:"USA",guarantee:"DPF + Clauses Contractuelles Types (CCT)"},{name:"Lovable (GPT Engineer AB)",service:"Hébergement frontend et CDN",loc:"UE",guarantee:"Serveurs UE - Conforme RGPD"},{name:"n8n GmbH",service:"Automatisation de workflows (n8n Cloud)",loc:"UE (Allemagne)",guarantee:"Serveurs UE - Conforme RGPD"},{name:"Anthropic PBC",service:"Génération de contenus textuels par IA pour le service Agent Pro (rapports narratifs, descriptions de biens, emails de suivi)",loc:"USA",guarantee:"DPF + API sans conservation des données (Zero Data Retention) + CCT"}],note:"Tous nos sous-traitants sont liés par des accords de traitement de données conformes à l'article 28 du RGPD. La gestion du consentement cookies est assurée par un gestionnaire intégré (vanilla-cookieconsent, open source) hébergé localement, qui ne transmet aucune donnée à un tiers.",sub_3:{title:"4.3. Autorités",list:`- Autorités judiciaires, administratives ou fiscales, si requis par la loi 817- Organismes de contrôle (ex: APD) sur demande`},sub_4:{title:"4.4. Ce que nous ne faisons PAS",alert:`ð« Nous ne vendons ni ne louons jamais vos données personnelles à des tiers. 818- Pas de revente à des courtiers en données 819- Pas de partage avec des annonceurs tiers 820- Pas de profilage individuel : Google Analytics 4 est configuré en mode agrégé et anonymisé, sans constitution de profils individuels à des fins publicitaires`}},"5_transfers":{title:"5. Transferts hors UE",intro:"Certains de nos sous-traitants (Stripe, Google, Anthropic) peuvent traiter vos données en dehors de l'Espace Ãconomique Européen (USA). Les sous-traitants suivants sont hébergés dans l'UE et ne donnent lieu à aucun transfert hors UE : Supabase (Paris), Lovable (UE), n8n (Allemagne).",sub_1:{title:"5.1. Garanties appropriées (Art. 46 RGPD)",list:`- Clauses Contractuelles Types (CCT) de la Commission européenne 821- Data Privacy Framework (DPF) UE-USA (décision d'adéquation du 10 juillet 2023) 822- Ãvaluations d'impact des transferts (TIA)`},info:"Vous pouvez obtenir une copie des garanties en nous contactant à [email protected].",supa_alert:"ð¡ Données hébergées dans l'UE : Vos données principales (compte, simulations, crédits) sont hébergées sur Supabase dans l'UE (région EU-WEST, Paris). Seuls les services de paiement (Stripe), de mesure d'audience (GA4, après consentement) et d'envoi d'emails transactionnels (Google SMTP) impliquent un transfert vers les USA, sous les garanties décrites ci-dessus."},"6_retention":{title:"6. Durées de Conservation",intro:"Nous conservons vos données uniquement le temps nécessaire conformément au principe de minimisation (Art. 5 RGPD) :",table_headers:["Catégorie","Durée","Base"],table_rows:[{cat:"Compte actif",duration:"Durée d'activité + 30 jours après suppression",basis:"Contrat"},{cat:"Compte inactif",duration:"24 mois d'inactivité â suppression (notification 30 jours avant)",basis:"Intérêt légitime"},{cat:"Données de simulation",duration:"Tant que le compte est actif",basis:"Contrat"},{cat:"Factures / Comptabilité",duration:"7 ans (exercice clos)",basis:"Loi (Art. III.86 CDE)"},{cat:"Données de paiement",duration:"5 ans (prescription fiscale)",basis:"Loi"},{cat:"Logs de sécurité",duration:"12 mois maximum",basis:"Sécurité"},{cat:"Support (Tickets)",duration:"3 ans après clôture",basis:"Preuve"},{cat:"Cookies analytics",duration:"6 mois maximum",basis:"Consentement"}],footer:"à l'expiration de ces délais, les données sont supprimées définitivement ou anonymisées de manière irréversible. L'utilisateur est notifié par email 30 jours avant toute suppression automatique de compte inactif."},"7_security":{title:"7. Sécurité des Données",intro:"Conformément à l'article 32 du RGPD, nous mettons en Åuvre les mesures de sécurité suivantes :",tech:{title:"7.1. Mesures techniques",list:`- Chiffrement HTTPS/TLS pour toutes les communications 823- Mots de passe hashés (bcrypt) 824- Authentification sécurisée via Supabase Auth 825- Pare-feu et protection DDoS 826- Sauvegardes régulières chiffrées 827- Tests de sécurité périodiques 828- Polices de caractères hébergées localement (aucun appel vers des serveurs tiers)`},org:{title:"7.2. Mesures organisationnelles",list:`- Accès limité selon le principe du moindre privilège 829- Accords de confidentialité pour tous les collaborateurs 830- Formation et sensibilisation à la protection des données 831- Procédures documentées de gestion des incidents`},breach:{title:"7.3. Violation de données",text:`En cas de violation de données à caractère personnel (Art. 33-34 RGPD) : 832- Notification à l'Autorité de Protection des Données (APD) dans les 72 heures 833- Information des utilisateurs concernés si la violation présente un risque élevé pour leurs droits et libertés`}},"8_rights":{title:"8. Vos Droits (RGPD)",intro:"Vous disposez des droits suivants en vertu du Chapitre III du RGPD :",list:[{title:"8.1. Droit d'accès (Art. 15)",desc:"Obtenir la confirmation que nous traitons vos données et en recevoir une copie, ainsi que les détails sur les finalités et destinataires."},{title:"8.2. Droit de rectification (Art. 16)",desc:"Corriger les données inexactes ou incomplètes directement depuis votre compte ou sur demande."},{title:"8.3. Droit à l'effacement (Art. 17)",desc:"Demander la suppression de vos données ('droit à l'oubli'), sauf si une obligation légale (ex: comptabilité 7 ans) impose leur conservation."},{title:"8.4. Droit à la limitation (Art. 18)",desc:"Geler temporairement l'utilisation de vos données en cas de contestation de leur exactitude ou de la licéité du traitement."},{title:"8.5. Droit à la portabilité (Art. 20)",desc:"Récupérer vos données fournies dans un format structuré et lisible par machine (JSON/CSV) pour les transmettre à un autre prestataire. Vous pouvez demander l'export de vos données à tout moment via [email protected]."},{title:"8.6. Droit d'opposition (Art. 21)",desc:"Refuser un traitement basé sur l'intérêt légitime ou vous opposer au marketing direct à tout moment."},{title:"8.7. Retrait du consentement (Art. 7)",desc:"Retirer votre consentement à tout moment pour les traitements basés sur celui-ci (cookies analytics, newsletter), sans affecter la licéité du traitement antérieur."},{title:"8.8. Décision automatisée (Art. 22)",desc:"La plateforme fournit des analyses et simulations à titre informatif uniquement. Aucune décision automatisée produisant des effets juridiques ou significatifs n'est prise à votre égard. Les scores et résultats ne constituent pas des recommandations personnalisées d'investissement, d'achat ou de vente."},{title:"8.9. Réclamation (Art. 77)",desc:"Introduire une plainte auprès de l'Autorité de Protection des Données (APD) si vous estimez que vos droits ont été violés."}],apd_info:`Autorité de Protection des Données (APD) 834Rue de la Presse 35, 1000 Bruxelles 835[email protected] 836https://www.autoriteprotectiondonnees.be`,exercise:"Pour exercer vos droits : [email protected]. Délai de réponse : 1 mois (extensible de 2 mois si la demande est complexe, conformément à l'article 12(3) du RGPD). L'exercice de ces droits est gratuit."}
836,"9_cookies":{title:"9. Cookies",text:"Nous utilisons des cookies conformément à la directive ePrivacy (2002/58/CE) et au RGPD. Le consentement est géré par notre gestionnaire intégré (vanilla-cookieconsent), hébergé localement sans transfert de données vers un tiers.",types:`Types de cookies utilisés : 837- Strictement nécessaires : fonctionnement du site, authentification, sécurité (toujours actifs, pas de consentement requis) 838- Analytics : Google Analytics 4 (uniquement après consentement explicite)`,cookie_table_headers:["Nom","Type","Finalité","Durée","Ãmetteur"],cookie_table_rows:[{name:"sb-*-auth-token",type:"Nécessaire",purpose:"Authentification et session utilisateur (Supabase)",duration:"Session / 1 an",provider:"1st party"},{name:"cc_cookie",type:"Nécessaire",purpose:"Mémoriser vos choix de consentement cookies",duration:"6 mois",provider:"1st party"},{name:"_ga",type:"Analytics",purpose:"Identifiant unique Google Analytics (anonymisé)",duration:"2 ans",provider:"3rd party (Google)"},{name:"_ga_*",type:"Analytics",purpose:"Conservation de l'état de session GA4",duration:"2 ans",provider:"3rd party (Google)"}],alert:"â ï¸ Important : Google Analytics est configuré en mode 'anonymisation IP' et ne s'active qu'après votre consentement explicite. Nous n'utilisons pas GA4 pour du profilage individuel ou du remarketing. Vous pouvez retirer ce consentement à tout moment via le bouton « Gérer les cookies » en bas de page."},"10_minors":{title:"10. Mineurs",text:"La plateforme Arcanes est destinée à un public majeur (18 ans et plus). Nous ne collectons pas sciemment de données personnelles de personnes mineures. Si nous découvrons que des données de mineurs ont été collectées, elles seront supprimées dans les meilleurs délais."},"11_changes":{title:"11. Modifications",text:"Nous nous réservons le droit de modifier cette Politique de Confidentialité. En cas de modification substantielle, vous serez informé par email au moins 15 jours avant l'entrée en vigueur. La date de dernière mise à jour est indiquée en haut de cette page."},"12_contact":{title:"12. Contact",text:`Pour toute question relative à cette Politique de Confidentialité ou à la protection de vos données : [email protected] 839 840DIGITAL ARCANES SRL 841Rue des 4 Carrés 4, 1325 Chaumont-Gistoux, Belgique`}}},ZB={locked:"Réservé aux membres Premium",unlock:"Débloquer cette fonctionnalité",cta:"Passer Premium",memberBadge:"Membre Premium",description:"Accédez à cette fonctionnalité exclusive en devenant membre Premium.",packInfo:"Disponible avec les packs Smart, Investisseur et Pro+",triLocked:"Le simulateur TRI & Rentabilité est réservé aux membres Premium",triDescription:"Calculez le Taux de Rendement Interne de vos investissements immobiliers avec notre simulateur avancé.",mapPredictLocked:"Les prédictions de marché sont réservées aux membres Premium",header:{analyseHabitation:"Analyse Habitation",analyseInvestissement:"Analyse Investissement",analyseImmeubleRapport:"Analyse Immeuble de Rapport",plateformeAnalyse:"Plateforme d'analyse immobilière",genere:"Généré le",peb:"PEB"},actions:{imprimerPDF:"Imprimer / PDF",nouvelleAnalyse:"Nouvelle analyse"},investissement:{hero:{tri:"TRI 10 ans",triBenchmark:"Benchmark marché : {{moyen}}% (moyen) ⢠{{excellent}}% (excellent)",cashflow:"Cashflow mensuel",cashflowSubtext:"Trésorerie nette après mensualités, charges et fiscalité",prixAcquisition:"Prix acquisition",prixPerM2:"{{prix}}
841/m²",surface:"Surface",badges:{excellent:"Excellent",bon:"Bon",moyen:"Moyen",faible:"Faible",cashflowPositif:"Cashflow positif",autofinancement:"Autofinancement",effortRequis:"Effort requis"}},rendements:{title:"Rendements",rendementBrut:"Rendement brut",rendementNet:"Rendement net",rendementNetNet:"Rendement net-net",rendementFondsPropres:"Rendement fonds propres",surFondsPropres:"sur fonds propres",explicationFondsPropres:"Rendement calculé sur votre apport initial, en tenant compte de l'effet de levier du crédit",moyen:"Moy",bon:"Bon",excellent:"Excel",performance:{excellent:"Excellent",bon:"Bon",moyen:"Moyen",faible:"Faible"},noteTitle:"Bon à savoir",noteExplication:"Les zones colorées indiquent les seuils de référence du marché belge. Plus la barre est longue et verte, meilleur est le rendement comparé au marché."},tri:{title:"Taux de Rendement Interne (TRI)",sur10ans:"Sur 10 ans",apportInitial:"Apport initial",apportTresorerie:"Apport trésorerie",cashflowsNegatifs:"Cashflows négatifs cumulés",investissementTotal:"Investissement total réel",gainsSur10ans:"Gains sur 10 ans",cashflowsCumules:"Cashflows cumulés",plusValueRevente:"Plus-value revente",desGains:"des gains",multiplicateurApport:"Multiplicateur d'apport",explicationMultiplicateur:"Votre apport de {{apport}} devient {{valeur}}",benchmarksMarche:"Fourchettes observées sur le marché belge",moyen:"Moyen",bon:"Bon",excellent:"Excellent",performance:{excellent:"Excellent",bon:"Bon",moyen:"Moyen",faible:"Faible"}},projection:{title:"Projection sur 10 ans",annee:"Année",loyerEffectif:"Loyer effectif",charges:"Charges",mensualites:"Mensualités",impot:"Impôt",cashflow:"Cashflow",capitalRestant:"Capital restant",an:"An",final:"Final",moyenne:"Moyenne",annee10:"Année 10 - Revente",fluxRevente:"Flux revente",gainRevente:"Gain net après revente",cashflowTotal:"Cashflow total",fluxCumules:"Flux cumulés + revente",noteTitle:"Bon à savoir",noteExplication:"Projection basée sur les hypothèses d'indexation loyers et charges. Années clés affichées (1, 2, 3, 5, 7, 10)."},revente:{title:"Scénario Revente (Année 10)",prixAchat:"Prix d'achat",valeurFuture:"Valeur future",sur10ans:"sur 10 ans",investissementInitial:"Investissement initial",appreciation:"d'appréciation",fraisVente:"Frais de vente",fraisAgence:"Frais d'agence",fraisNotaire:"Frais notaire vendeur",totalFrais:"Total frais de vente",detteRestante:"Dette restante",produitNet:"Produit net de vente",apresDetteEtFrais:"Après remboursement dette et frais",plusValue:"Plus-value",plusValueBrute:"Plus-value brute",taxePlusValue:"Taxe plus-value",noteFiscale:"Note fiscale",explicationFiscale:"En règle générale, la fiscalité belge prévoit un régime spécifique pour les plus-values immobilières selon la durée de détention. Cette information est donnée à titre indicatif et ne constitue pas un conseil fiscal. Consultez un conseiller fiscal pour votre situation personnelle."},optimisations:{title:"Comparaison marché locatif",loyerOptimise:"Loyer optimisé",loyerAligneMarche:"Le loyer actuel est aligné ou supérieur aux prix du marché",potentielDetecte:"Ãcart avec le marché local détecté",loyerInferieurMarche:"Le loyer actuel semble inférieur aux prix du marché local",potentiel:"de potentiel",comparaison:"Comparaison loyer actuel vs marché",loyerActuel:"Loyer actuel/m²",prixMarche:"Prix marché/m²",gainPotentiel:"Gain potentiel si alignement au marché",parMois:"Par mois",parAn:"Par an",sur10ans:"Sur 10 ans",conseil:"Donnée comparative",explicationConseil:"Le loyer moyen du marché local pour ce type de bien se situe autour de {{prix}} â¬/m². Le loyer actuel est comparé à cette référence."}},shared:{priceAnalysis:{title:"Analyse de la Valeur",verdictPrix:"Positionnement Prix",positionnementMarche:"Positionnement marché",sousEvalue:"En-dessous de l'estimation",prixJuste:"Dans la fourchette estimée",surEvalue:"Au-dessus de l'estimation",prixAcquisition:"Prix acquisition",valeurMarche:"Valeur marché estimée",ecartMontant:"Ãcart en valeur",bonusAtouts:"Bonus atouts appliqués",verdict:{sousMarche:"En-dessous de l'estimation de marché",audessusM
841arche:"Au-dessus de l'estimation de marché",aligneMarche:"Dans la fourchette de l'estimation"}}},habitation:{score:{title:"Indice Synthétique Arcanes",prixVsMarche:"Prix vs Marché",performancePEB:"Performance PEB",accessibilite:"Accessibilité",poids:"Poids",scoreTotal:"Score total",baseSur:"Basé sur",points:"points",methodo:"Méthodologie",explicationMethodo:"L'indice Arcanes agrège 3 critères pondérés : le rapport prix/estimation (40%), la performance énergétique (35%), et l'accessibilité/localisation (25%). C'est un indice synthétique, pas une recommandation."},budget:{title:"Budget Mensuel",budgetTotal:"Budget Total",parMois:"par mois",credit:"Crédit",charges:"Charges",energie:"Ãnergie",duBudget:"du budget",budgetAnnuel:"Budget annuel",mois:"mois"},projection:{title:"Projection Patrimoine 10 ans",patrimoineNet:"Patrimoine net année 10",sur10ans:"sur 10 ans",multiplicateurApport:"Multiplicateur d'apport",evolutionBien:"Ãvolution de la valeur du bien",valeurActuelle:"Valeur actuelle",plusValueEstimee:"Plus-value estimée",valeurFuture:"Valeur future",remboursementCredit:"Remboursement du crédit",capitalRembourse:"Capital remboursé",duCredit:"du crédit",detteRestante:"Dette restante",remboursé:"Remboursé",restant:"Restant",interetsPayes:"Intérêts payés",retourSurApport:"Retour sur apport",explicationRetour:"Gain net par rapport à votre apport initial",noteTitle:"Bon à savoir",noteExplication:"Cette projection suppose une appréciation moyenne du bien de 2% par an. Votre patrimoine net représente la valeur du bien moins la dette restante."}},cashflow:{title:"Cashflow & Trésorerie",perMonth:"/mois",perYear:"/an",soit:"soit",projection10ans:"Projection 10 ans",fluxCumules:"Flux cumulés",sur10ans:"sur 10 ans",impact1an:"Impact 1 an",impact5ans:"Impact 5 ans",impact10ans:"Impact 10 ans",scenarios:{positif:{title:"Cashflow positif",subtitle:"Excédent de trésorerie",description:"Ce bien génère un excédent de trésorerie chaque mois. Les loyers couvrent l'ensemble des charges, du crédit et des impôts avec un surplus."},neutre:{title:"Autofinancement",subtitle:"Ãquilibre budgétaire",description:"Ce bien est en autofinancement. Les loyers couvrent approximativement les mensualités et charges. L'enrichissement se fait via le remboursement du capital."},negatif:{title:"Effort d'épargne",subtitle:"Investissement à long terme",description:"Ce bien nécessite un effort d'épargne mensuel. L'enrichissement se fait via le remboursement progressif du capital et la plus-value potentielle à la revente."}},bonASavoir:"Bon à savoir :",notepedagogique:"Le cashflow ne reflète pas l'enrichissement total. Même en cashflow négatif, vous vous enrichissez via le remboursement du capital emprunté et la plus-value potentielle du bien."},score:{sur:"/{{max}}"}},JB={description:"See Beyond the Bricks.",navigation:"Navigation",simulators:"Simulateurs",pricing:"Tarifs",contact:"Contact",communes:"Communes",blog:"Blog",legal:"Légal",legalNotice:"Mentions légales",privacy:"Politique de confidentialité",terms:"CGU",manageCookies:"Gérer mes cookies",allRightsReserved:"Tous droits réservés",about:"à propos",infoOnly:"Simulateurs à titre informatif uniquement.",faq:"FAQ & Glossaire",dataDeletion:"Suppression des données"},QB={defaultTitle:"Validation des données",defaultInstructions:"Veuillez vérifier et compléter les informations ci-dessous.",closeConfirm:{title:"Fermer le formulaire ?",description:"Si vous fermez maintenant, votre crédit sera remboursé et les données saisies seront perdues.",cancel:"Continuer la validation",confirm:"Fermer et rembourser"},global:{title:"Données globales du bien",complete:"Complet"},units:{title:"Détails par unité",complete:"complète",completePlural:"complètes",toComplete:"à compléter",toCompleteLabel:"à compléter"},fields:{select:"Sélectionner...",enterValue:"Entrer une valeur...",yes:"Oui",no:"Non"},buttons:{abandon:"Abandonner (crédit remboursé)",validate:"Valider et lancer l'analyse",analyzing:"Analyse en cours..."},immeubleWarning:{title:"Attention : Immeuble de rapport",message:"Les annonces d'immeubles de rapport manquent souvent d'informations détaillées. Veuillez compléter méticuleusement les données de chaque unité pour garantir la précision de l'analyse."},context:{price:"Prix",surface:"Surface",propertyType:"Type de bien",notCommunicated:"N/C",notSpecified:"Non spécifié",descriptionTitle:"Description de l'annonce",viewSource:"Voir source",noDescription:"Aucune description disponible."},badges:{required:"Requis"},unitTitle:"Unité {{number}}",fieldLabels:{type_bien:"Type",surface_habitable_m2:"Surf. Habitable (m²)",lettre_peb:"PEB",etat_general:"Ãtat",parking:"Parking",terrasse:"Terrasse",jardin:"Jardin"},options:{etat_general:{freshlyRenovated:"Fraîchement rénové",excellent:"Excellent état",good:"Bon",toRefresh:"à rafraîchir",toRenovate:"à rénover",toRestore:"à restaurer"}}},XB={header:{title:"Parrainez vos amis, devenez membre Premium",subtitle:"Invitez vos proches à découvrir Arcanes. Chaque inscription vous rapproche du statut Premium et de ses fonctionnalités avancées."},status:{friendsProtected:"Amis parrainés",creditsEarned:"Crédits gagnés"},benefits:{youGet:"Vous gagnez",youGetValue:"Débloquez vos récompenses",friendGets:"Votre ami reç
841oit",friendGetsValue:"2 crédits offerts"},emptyState:{title:"Invitez votre premier ami !",subtitle:"Chaque parrainage vous rapproche du statut Premium.",cta:"Inviter via WhatsApp"},tiers:{starter:{name:"Débutant",reward:"-",description:"Commencez l'aventure."},scout:{name:"L'Ãclaireur",reward:"+1 Crédit",description:"Premier parrainage !"},investor:{name:"L'Investisseur",reward:"+5 Crédits",description:"Votre réseau grandit."},visionary:{name:"Le Visionnaire",reward:"PREMIUM",rewardAlt:"+10 Crédits",description:"Accès aux fonctionnalités avancées."},magnate:{name:"Le Magnat",reward:"+25 Crédits",description:"Un vrai leader."},baron:{name:"Le Baron",reward:"Partenaire",description:"Expert certifié Arcanes."}},progress:{title:"Votre progression",friendsProgress:"{{current}}/{{target}} amis",visionaryGoal:"Objectif : 10 amis",visionaryReward:"Débloquez le Statut Premium et ses fonctionnalités avancées",visionaryRewardAlt:"Gagnez 10 crédits bonus",viewAllLevels:"Voir tous les niveaux",hideLevels:"Masquer",maxReached:"Niveau maximum atteint !"},sharing:{title:"Partagez votre lien de parrainage :",copy:"Copier",copied:"Copié !",emailSubject:"Arcanes - 2 analyses immobilières offertes",whatsappMessage:"Hey ! Je t'offre 2 analyses immobilières gratuites sur Arcanes. Teste avant ta prochaine visite :",previewLabel:"Message pré-écrit :"},friends:"ami",friendsPlural:"amis"},e4={tabs:{profile:"Profil",security:"Sécurité",notifications:"Notifications"},nav:{back:"Retour",subtitle:"Gérez votre profil et vos préférences"},profile:{photo:"Photo de profil",photoDesc:"Votre avatar est généré automatiquement à partir de vos initiales.",photoFormat:"Format supporté à l'avenir : JPG, PNG (max 2MB)",info:"Informations du profil",username:"Nom d'utilisateur",usernamePlaceholder:"Votre nom",usernameHint:"Ce nom sera affiché dans votre tableau de bord.",email:"Adresse email",emailHint:"L'email ne peut pas être modifié. Contactez le support si nécessaire.",language:"Langue préférée",memberSince:"Membre depuis",saving:"Enregistrement...",save:"Enregistrer les modifications"},security:{changePassword:"Modifier le mot de passe",changePasswordDesc:"Sécurisez votre compte avec un nouveau mot de passe",currentPassword:"Mot de passe actuel",newPassword:"Nouveau mot de passe",minChars:"Minimum 8 caractères",confirmPassword:"Confirmer le nouveau mot de passe",changing:"Modification...",changeBtn:"Modifier le mot de passe",activeSessions:"Sessions actives",comingSoon:"Bientôt disponible",sessionsDesc:"Vous pourrez bientôt voir et gérer vos sessions actives sur différents appareils."},notifications:{noNotifications:"Aucune notification",noNotificationsDesc:"Vous serez notifié des mises à jour importantes ici.",preferences:"Préférences de notifications",preferencesDesc:"Choisissez comment vous souhaitez recevoir vos notifications",inApp:"Notification dans l'application",byEmail:"Notification par email",referralSignup:"ð Nouveau filleul inscrit",referralSignupDesc:"Quand quelqu'un crée un compte avec votre code de parrainage",referralPurchase:"ð° Premier achat d'un filleul",referralPurchaseDesc:"Quand votre filleul effectue son premier achat de crédits",referralMilestone:"â Palier de parrainage atteint",referralMilestoneDesc:"Quand vous atteignez 10 parrainages actifs et débloquez le statut Premium",general:"â¹ï¸ Notifications générales",generalDesc:"Autres notifications système et mises à jour",emailNote:"Note sur les notifications par email",emailNoteDesc:"Les notifications par email seront disponibles prochainement. Vous pouvez déjà configurer vos préférences pour être prêt.",loading:"Chargement..."},dangerZone:{deleteAccount:"Supprimer le compte",irreversible:"Action irréversible",delete:"Supprimer",cancel:"Annuler",confirmWord:"SUPPRIMER",confirmText:"Tapez <strong>{{word}}</strong> pour confirmer la suppression définitive de votre compte et toutes vos données.",confirm:"Confirmer"},toasts:{profileSaved:"Profil mis à jour avec succès",profileError:"Erreur lors de la sauvegarde",passwordMismatch:"Les mots de passe ne correspondent pas",passwordTooShort:"Le mot de passe doit contenir au moins 8 caractères",passwordChanged:"Mot de passe modifié avec succès",passwordError:"Erreur lors du changement de mot de passe",confirmRequired:"Veuillez taper {{word}} pour confirmer",accountDeleted:"Compte supprimé",accountDeleteError:"Erreur lors de la suppression du compte",prefsUpdated:"Préférences mises à jour",prefsUpdatedDesc:"Vos préférences de notification ont été enregistrées.",prefsError:"Erreur",prefsErrorDesc:"Impossible de mettre à jour les préférences."}},t4={home:{title:"Arcanes â Analyse immobilière intelligente en Belgique",description:"Analysez n'importe quelle annonce immobilière en Belgique en 10 secondes. Rapports d'évaluation complets, 6 simulateurs gratuits, données de 581 communes."},freeAnalyse:{title:"Analyse gratuite d'annonce immobilière | Arcanes",description:"Collez le lien de n'importe quelle annonce immobilière belge et obtenez une analyse complète en 10 secondes. Score, prix/m², PEB, rendement locatif. Gratuit."},simulateur:{title:"Simulateurs immobiliers gratuits â Belgique | Arcanes",description:"Simulez gratuitement vos frais de notaire, capacité d'emprunt, rendement locatif, impact PEB et TRI en Belgique. Six outils en ligne adaptés au marché immobilier belge."},simulateurFraisActe:{title:"Simulateur Frais de Notaire Belgique 2026 | Arcanes",description:"Calcul instantané de vos frais de notaire et droits d'enregistrement en Wallonie, Bruxelles et Flandre. Barèmes officiels 2026, gratuit en 30 secondes."},simulateurPret:{title:"Calcul Prêt Hypothécaire Belgique 2026 â Simulateur Gratuit",description:"Calculez votre mensualité de prêt hypothécaire en Belgique : taux 2026, durée 15-30 ans, coût total. Simulation instantanée, sans inscription."},simulateurEmprunt:{title:"Simulateur Capacité d'Emprunt Belgique 2026 | Arcanes",description:"Combien pouvez-vous emprunter pour acheter en Belgique ? Calcul instantané basé sur vos revenus, charges et les taux 2026. Gratuit, sans inscription."},simulateurPEB:{title:"Simulateur PEB Belgique 2026 â Impact Prix Immobilier",description:"Quel impact le PEB a-t-il sur le prix d'un bien immobilier en Belgique ? Calcul de la décote, scénarios de rénovation, données 3 régions. Gratuit."},simulateurRendement:{title:"Simulateur rendement locatif Belgique | Arcanes",description:"Calculez le rendement locatif brut et net de votre investissement immobilier. Charges, vacance locative et fiscalité incluses."},simulateurPrixM2:{title:"Simulateur prix au m² par commune | Arcanes",description:"Estimez le prix au m² d'un bien immobilier dans n'importe quelle commune belge. Données StatBel actualisées."},simulateurTRI:{title:"Simulateur TRI immobilier Belgique | Arcanes",description:"Calculez le TRI de votre investissement locatif en Belgique : cashflow mensuel, patr
841imoine net, export PDF inclus. Gratuit, sans inscription."},tarifs:{title:"Tarifs â Analyses immobilières premium | Arcanes",description:"Découvrez nos formules d'analyse immobilière en Belgique : de l'analyse gratuite au rapport premium complet avec score de qualité, aide à la négociation et projection financière."},blog:{title:"Blog immobilier Belgique â Guides et analyses | Arcanes",description:"Analyses de marché, guides pratiques et données immobilières belges. Articles factuels sur le PEB, les frais de notaire, le rendement locatif et l'investissement en Belgique."},faq:{title:"FAQ & Glossaire immobilier | Arcanes",description:"Retrouvez les réponses à vos questions sur l'analyse immobilière Arcanes et consultez notre glossaire complet des termes financiers et immobiliers en Belgique."},contact:{title:"Contactez Arcanes â Support et questions",description:"Une question sur nos analyses immobilières ? Contactez l'équipe Arcanes. Réponse rapide garantie."},map:{title:"Carte interactive des communes belges | Arcanes",description:"Explorez les données immobilières de chaque commune belge : prix médians, rendements, scores d'investissement et tendances."},login:{title:"Connexion | Arcanes",description:"Connectez-vous à votre compte Arcanes pour accéder à vos analyses immobilières et crédits."},signup:{title:"Créer un compte | Arcanes",description:"Créez votre compte Arcanes gratuitement et obtenez un crédit d'analyse offert pour tester notre plateforme."},terms:{title:"Conditions générales d'utilisation | Arcanes",description:"Conditions générales d'utilisation de la plateforme Arcanes. Analyse immobilière en Belgique."},privacy:{title:"Politique de confidentialité | Arcanes",description:"Découvrez comment Arcanes protège vos données personnelles. Conformité RGPD."},legal:{title:"Mentions légales | Arcanes",description:"Mentions légales de la plateforme Arcanes. Ãditeur : Digital Arcanes SRL, Belgique. Informations juridiques, hébergement et responsabilités."}},n4={agent:{publishedToday:"Publié aujourd'hui",publishedYesterday:"Publié hier",publishedAgo:"Publié il y a {{n}} jours"},kpi:{surface:"Surface",rooms:"Chambres",peb:"PEB",condition:"Ãtat"},peb:{efficient:"Bien performant",good:"Bonne performance",label:"PEB {{peb}}",heatingCost:"chauffage ~{{cost}}â¬/mois",learnMore:"En savoir plus",aboveAverage:"Le label dominant à {{commune}} est {{dom}} â ce bien se situe au-dessus de la moyenne",communePct:"{{pct}}% des biens de la commune ont un label A, B ou C",controlled:"Un PEB C représente une consommation maîtrisée",bestInsulated:"Avec un PEB {{peb}}, ce bien fait partie des logements les mieux isolés du marché",heatingEstimate:"Chauffage estimé à environ {{cost}}â¬/mois pour {{surface}}m² (base 0,08â¬/kWh)"},quartier:{title:"Vivre à {{commune}}",connected:"Un quartier bien connecté, à proximité de la gare {{gare}}",trains:"({{n}} trains par jour)",wellServed:"Un quartier bien desservi par les transports en commun",marketUp:"Le marché immobilier est porteur avec des prix en hausse de {{pct}}% en 5 ans â signe d'un quartier qui prend de la valeur",transactionsHigh:"Avec {{n}} transactions par an, les biens trouvent rapidement preneur",transactionsMid:"Un marché fluide avec environ {{n}} ventes par an",newResidents:"La commune attire de nouveaux habitants, ce qui soutient la demande",inhabitants:"{{n}} habitants",transactionsYear:"{{n}} transactions/an",priceRising:"Prix en hausse",marketLiquid:"Marché {{label}}",attractive:"Cadre de vie attractif",wellConnected:"Bien desservi"},budget:{title:"Ce bien vous coûterait",perMonth:"/mois",credit:"Crédit",precompte:"Précompte",energy:"Ãnergie",insurance:"Assurance",narrativeAp
841part:"Pour cet appartement à {{prix}}, avec {{apport}}% d'apport sur {{duree}} ans à {{taux}}%. Budget total : {{total}} (prix + {{frais}} de frais). Hors charges de copropriété.",narrativeMaison:"Pour cette maison à {{prix}}, avec {{apport}}% d'apport sur {{duree}} ans à {{taux}}%. Budget total : {{total}} (prix + {{frais}} de frais)."},sim:{title:"Simulation de prêt",borrowed:"Montant emprunté",monthly:"Mensualité",totalCredit:"Coût total du crédit",ofWhichInterest:"dont {{amount}} d'intérêts",capitalVsInterest:"Capital vs intérêts par année",capital:"Capital",interest:"Intérêts",adjust:"Ajuster ma simulation",contribution:"Apport personnel",rate:"Taux d'intérêt",duration:"Durée",years:"{{n}} ans",amortization:"Voir le tableau d'amortissement",year:"An",remaining:"Restant"},costs:{title:"Coûts d'achat",price:"Prix du bien",totalFees:"Frais totaux",feesDetail:"Droits {{pct}}% + notaire + admin",totalAcquisition:"Coût total d'acquisition",detail:"Voir le détail des frais",registration:"Droits d'enregistrement ({{pct}}%)",registrationRate:"Taux habitation propre et unique ({{region}}) â {{std}}% pour toute autre acquisition",registrationRateBxl:"12,5% après abattement de 200 000 ⬠sur la base imposable (habitation propre et unique, prix ⤠600 000 â¬)",notary:"Honoraires notaire (TVA incl.)",admin:"Frais administratifs",reducedRate:"Taux affiché pour l'acquisition d'une habitation propre et unique â hors cas particuliers (bien neuf soumis à TVA, habitation modeste en Flandre). Simulez votre situation exacte avec le simulateur frais d'acte.",precompte:"Précompte immobilier",precompteDetail:"Soit {{monthly}}/mois · RC moyen {{type}} à {{commune}}",precompteAppart:"appart.",precompteMaison:"maisons",precompteCalc:"Voir le détail du calcul",rcEstimate:"RC moyen estimé",communaux:"Centimes communaux ({{n}})",provinceAvg:"Moy. province : {{n}}",provinciaux:"Centimes provinciaux (moy.)",minContribution:"Apport minimum recommandé : {{amount}} (frais non finançables)"},yield:{title:"Potentiel locatif",rentEstimate:"Loyer estimé",median:"Médiane {{commune}} : {{amount}} â¬/mois (SPF MyRent)",gross:"Rendement brut",net:"Rendement net estimé",afterVacancy:"Après vacance (5%) et charges",detail:"Voir le détail",annualIncome:"Revenu locatif annuel",afterVacancyDetail:"Après vacance locative (5%)",charges:"Charges estimées",chargesDetail:"Précompte + entretien (~1%)",totalInvestment:"Investissement total",totalInvestmentDetail:"Prix + frais",appartRent:"Les appartements à {{commune}} se louent autour de {{amount}}⬠par mois",maisonRent:"Les maisons à {{commune}} se louent autour de {{amount}}⬠par mois",attractive:"Avec un rendement brut de {{pct}}%, c'est un marché particulièrement attractif pour l'investissement locatif",aboveAvg:"Le rendement brut de {{pct}}% est supérieur à la moyenne belge",strongDemand:"La demande locative est soutenue â trouver un locataire ne devrait pas poser de problème"},cta:{interested:"Ce bien vous intéresse ?",budgetSummary:"Budget estimé : {{monthly}}/mois · Investissement total : {{total}}",visit:"Je souhaite visiter ce bien",call:"ou appeler :",stickyBudget:"Coût mensuel tout compris",stickyCustom:"Votre budget personnalisé",stickySimulate:"Simuler mon budget",stickyVisit:"Visiter"},qualify:{title:"Intéressé par ce bien ?",subtitle:"Laissez vos coordonnées, {{agent}} vous recontacte.",name:"Votre nom *",phone:"Téléphone",email:"Email",optionVisit:"Je souhaite visiter ce bien",optionInfo:"Je souhaite plus d'informations",optionOffer:"Je souhaite faire une offre",budget:"Mon budget estimé : {{monthly}}/mois · apport {{apport}}%",send:"Envoyer",sending:"Envoi...",sentTitle:"Message envoyé",sentSubtitle:"{{agent}} vous recontactera rapidement.",close:"Fermer"},share:{whatsapp:"WhatsApp",copy:"Copier le lien",copied:"â Copié"},pdf:{download:"Télécharger le résumé pour ma banque",title:"Résumé financier",monthlyCost:"Coût mensuel tout compris",print:"Imprimer / Sauver en PDF",close:"Fermer",acquisitionCosts:"Coûts d'acquisition",monthlyBudget:"Budget mensuel",totalCredit:"Coût total du crédit",minContribution:"Apport minimum",nonFinanceable:"Frais non finançables",chosenContribution:"Apport choisi ({{pct}}%)",totalRepaid:"Total remboursé ({{n}} ans)",ofWhichInterest:"Dont intérêts",disclaimer:"Simulation indicative · Ne constitue pas une offre de crédit · Données Statbel & SPF Finances"},disclaimer:{text:"Simulations indicatives, ne constituant pas un conseil financier ou une offre de crédit au sens de la loi belge du 4 avril 2014. Arcanes n'est pas intermédiaire de crédit agréé FSMA. Consultez votre notaire et votre banque. Données : Statbel, SPF Finances, SPF MyRent."},footer:{powered:"Powered by Arcanes"},widget:{title:"Simulez votre achat",subtitle:"Estimez le coût réel de votre acquisition en Belgique",address:"Adresse du bien",addressPlaceholder:"Ex: Rue Jenner 6, Ixelles...",addressHint:"Optionnel â la commune suffit pour la simulation",orSearch:"ou rechercher par commune",commune:"Commune *",communePlaceholder:"Ex: Ixelles, 1050...",type:"Type de bien *",apartment:"Appartement",house:"Maison",surface:"Surface (m²)",price:"Prix d'achat *",contribution:"Apport personnel",rate:"Taux d'intérêt",duration:"Durée du prêt",simulate:"Simuler mon achat",simulating:"Simulation en cours...",resultTitle:"Votre simulation",monthlyTotal:"Coût mensuel total",getDossier:"Recevoir mon dossier complet",name:"Votre nom *",email:"Votre email *",phone:"Téléphone (optionnel)",submit:"Recevoir mon dossier",submitting:"Envoi...",successTitle:"Dossier envoyé !",successSubtitle:"Consultez votre email pour accéder à votre dossier interactif complet.",newSimulation:"Nouvelle simulation",powered:"Powered by Arcanes"},dossier:{title:"Votre dossier d'achat",subtitle:"Simulation personnalisée",modified:"Simulation modifiée",original:"Valeurs originales",adjusted:"Ajustez votre simulation",price:"Prix d'achat",contribution:"Apport",duration:"Durée",rate:"Taux",patrimony:"Patrimoine net à terme",patrimonyDesc:"Valeur du bien vs capital restant dû",propertyValue:"Valeur estimée du bien",remainingCapital:"Capital restant dû",netPatrimony:"Patrimoine net",amortization:"Tableau d'amortissement",byYear:"Par année",byMonth:"Par mois",showAll:"Voir tout",ctaSignup:"Créer mon espace Arcanes",ctaCommune:"Analyse complète de {{commune}}",ctaSimulate:"Simuler un autre bien",loading:"Chargement de votre dossierâ¦",notFound:"Ce dossier n'existe pas ou n'est plus disponible.",recalculate:"Recalculer ma simulation",budgetLabel:"Votre budget",mortgageFees:"Frais d'hypothèque",comparableCommunes:"Communes comparables",resaleScenario:"Scénario de revente",collapse:"Réduire",goFurther:"Aller plus loin",ctaSignupSub:"Suivez vos simulations et votre projet d'achat",ctaSimulateSub:"Testez un autre budget ou une autre commune"},email:{buyerSubject:"Votre demande pour {{bien}} a bien été transmise",buyerGreeting:"Bonjour{{name}}",buyerBody:"Votre demande d'information pour le bien {{bien}} a bien été transmise à {{agent}}{{agency}}.",buyerFollowup:"{{agent}}
841 reviendra vers vous dans les plus brefs délais pour répondre à vos questions et organiser une visite si vous le souhaitez.",buyerAgentLabel:"Votre agent",buyerCta:"Revoir le bien â",buyerReceived:"Demande bien reçue â",followupSubject:"Votre dossier d'achat vous attend",followupBody:"Vous avez effectué une simulation d'achat il y a quelques jours. Votre dossier personnalisé est toujours disponible.",followupCta:"Consulter mon dossier â"},bankPdf:{cta:"Télécharger mon dossier bancaire",ctaSub:"Document prêt à présenter à votre banque pour votre demande de prêt",title:"Dossier de financement",subtitle:"Synthèse pour demande de prêt hypothécaire",prepared:"Préparé le {{date}}",property:"Bien",type:"Type",address:"Adresse",surface:"Surface",peb:"PEB",financing:"Plan de financement",purchasePrice:"Prix d'achat",contribution:"Apport personnel",borrowed:"Montant emprunté",duration:"Durée",rate:"Taux annuel",monthly:"Mensualité",acquisition:"Coûts d'acquisition",registrationRights:"Droits d'enregistrement",notaryFees:"Frais de notaire",mortgageFees:"Frais d'hypothèque",totalFees:"Total des frais",totalAcquisition:"Total à financer",monthlyBudget:"Budget mensuel",mortgagePayment:"Mensualité du prêt",propertyTax:"Précompte immobilier",energy:"Ãnergie",insurance:"Assurance habitation",totalMonthly:"Total mensuel",indicative:"Document indicatif basé sur les paramètres simulés. Ne constitue pas une offre de crédit. Les conditions définitives dépendront de l'analyse de votre banque (revenus, situation patrimoniale, taux applicable au moment de la demande).",preparedBy:"Préparé par",print:"Imprimer / Sauver en PDF",close:"Fermer",years:"ans",perMonth:"/mois",perYear:"/an"},matching:{perfectTitle:"Des biens qui correspondent à votre recherche",perfectSubtitle:"Dans votre commune et votre budget",nearbyTitle:"à proximité de votre recherche",nearbySubtitle:"Dans les communes voisines, dans votre budget",discoverTitle:"à découvrir dans le portefeuille",discoverSubtitle:"Autres biens de votre agent qui pourraient vous intéresser",bedrooms:"ch."}},r4={title:"Accord de Sous-Traitance des Données (DPA)",subtitle:"Annexe aux CGU Agent Pro â Contrat de sous-traitance au sens de l'article 28 du RGPD entre l'Agent immobilier (responsable de traitement) et DIGITAL ARCANES SRL (sous-traitant).",lastUpdate:"Dernière mise à jour",effectiveDate:"13 avril 2026",preamble:{title:"Préambule",text:`Le présent Accord de Sous-Traitance (ci-après « DPA ») fait partie intégrante des Conditions Générales du Service Agent Pro (CGU Pro) accessibles sur arcanes.be/pro/terms. 842 843Il est conclu entre : 844- L'Agent immobilier abonné au service Agent Pro (ci-après « le Responsable de traitement » ou « l'Agent ») ; 845- DIGITAL ARCANES SRL, Rue des 4 Carrés 4, 1325 Chaumont-Gistoux, BCE 1033.931.611 (ci-après « le Sous-traitant » ou « Arcanes »). 846 847Le présent DPA est établi conformément à l'article 28 du Règlement (UE) 2016/679 du 27 avril 2016 relatif à la protection des données à caractère personnel (RGPD) et à la loi belge du 30 juillet 2018 relative à la protection des personnes physiques à l'égard des traitements de données à caractère personnel.`},articles:{"1_object":{title:"1. Objet et Périmètre du Traitement",content:`1.1. Le présent DPA a pour objet de définir les conditions dans lesquelles Arcanes, en qualité de sous-traitant, traite des données à caractère personnel pour le compte de l'Agent, en qualité de responsable de traitement, dans le cadre du service Agent Pro. 848 8491.2. Nature du traitement : 850- Génération de rapports prospect et pitch cards contenant des données de marché et des textes narratifs 851- Rédaction automatisée de descriptions d'annonces immobilières 852- Envoi d'emails de suivi aux propriétaires à la demande de l'Agent 853- Mesure anonymisée de l'engagement des visiteurs sur les pages acquéreur 854 8551.3. Finalité du traitement : permettre à l'Agent d'utiliser le service Agent Pro pour préparer ses rendez-vous, argumenter ses recommandations de prix et suivre ses prospects. 856 8571.4. Durée du traitement : le traitement dure aussi longtemps que l'Agent dispose d'un compte Agent Pro actif. Il prend fin à la résiliation du compte conformément à l'article 13 des CGU Pro.`},"2_data":{title:"2. Catégories de Données et de Personnes Concernées",content:`2.1. Catégories de données traitées : 858a) Données des propriétaires de biens : nom, prénom, adresse email, adresse du bien, transmis par l'Agent via la Plateforme 859b) Notes confidentielles de l'Agent : informations de contexte saisies par l'Agent (situation du propriétaire, urgence, concurrence), utilisées pour personnaliser le ton des contenus générés 860c) Données d'engagement : pages vues, simulations effectuées, temps passé sur les pages acquéreur (données anonymisées, sans identification personnelle du visiteur) 861d) Données du bien immobilier : adresse, caractéristiques, prix demandé, PEB, photos (fournies par l'Agent ou extraites d'annonces publiques) 862 8632.2. Catégories de personnes concernées : 864a) Propriétaires de biens immobiliers contactés par l'Agent 865b) Visiteurs des pages acquéreur (données anonymisées uniquement) 866 8672.3. Données sensibles : Arcanes ne traite aucune catégorie particulière de données au sens de l'article 9 du RGPD.`},"3_obligations_processor":{title:"3. Obligations d'Arcanes (Sous-traitant)",content:`Arcanes s'engage à : 868 8693.1. Traiter les données uniquement sur instruction documentée de l'Agent. Les instructions sont constituées par les CGU Pro, le présent DPA, et les actions de l'Agent dans la Plateforme (saisie de données, déclenchement de génération, envoi d'emails). 870 8713.2. Ne pas traiter les données pour ses propres finalités. Arcanes ne réutilise pas les données des propriétaires pour du marketing, de la prospection, de l'analyse statistique nominative, ou toute autre finalité non prévue au présent DPA. 872 8733.3. Garantir la confidentialité. Toute personne autorisée à traiter les données (employé
873s, prestataires) est soumise à une obligation de confidentialité contractuelle. 874 8753.4. Mettre en Åuvre les mesures de sécurité décrites à l'article 5. 876 8773.5. Respecter les conditions de recours à des sous-traitants ultérieurs (article 4). 878 8793.6. Assister l'Agent dans le respect de ses obligations RGPD : 880a) Répondre aux demandes d'exercice des droits des personnes concernées (accès, rectification, effacement, portabilité) dans un délai de 10 jours ouvrables après notification par l'Agent 881b) Assister l'Agent en cas de violation de données (article 6) 882c) Contribuer aux analyses d'impact si l'Agent en réalise une (Art. 35 RGPD) 883 8843.7. Au choix de l'Agent, supprimer ou restituer les données à la fin du contrat (article 7). 885 8863.8. Mettre à disposition de l'Agent les informations nécessaires pour démontrer le respect des obligations du présent DPA.`},"4_subprocessors":{title:"4. Sous-traitants Ultérieurs",content:`4.1. L'Agent autorise Arcanes à recourir aux sous-traitants ultérieurs suivants : 887 888a) Anthropic PBC (San Francisco, USA) 889- Finalité : génération de contenus textuels (descriptions d'annonces, narration des rapports, emails de suivi) 890- Données transmises : données structurées du bien (adresse, caractéristiques, prix, PEB), données de marché de la commune, notes de l'Agent (anonymisées â jamais le nom du propriétaire) 891- Mode de traitement : API Zero Data Retention â aucune donnée n'est conservée par Anthropic après la génération du texte. Les données ne sont pas utilisées pour l'entraînement du modèle. 892- Garanties transfert : Data Privacy Framework (DPF) + Clauses Contractuelles Types (CCT) 893 894b) Supabase Inc. (hébergement Paris, France â UE) 895- Finalité : stockage de la base de données (comptes agents, données biens, rapports générés) 896- Localisation : serveurs Paris (eu-west) 897- Garanties : hébergement UE, pas de transfert hors EEE 898 899c) Stripe Inc. (USA) 900- Finalité : traitement des paiements 901- Données : nom, email, données de carte bancaire (jamais stockées sur les serveurs Arcanes) 902- Garanties : DPF + CCT, certifié PCI-DSS 903 9044.2. Arcanes s'engage à informer l'Agent par email au moins 15 jours avant tout ajout ou remplacement d'un sous-traitant ultérieur. L'Agent peut s'opposer à ce changement dans un délai de 15 jours. En cas d'opposition justifiée, les Parties s'efforceront de trouver une solution alternative. à défaut, l'Agent peut résilier le contrat conformément à l'article 13.1 des CGU Pro. 905 9064.3. Arcanes impose à chaque sous-traitant ultérieur des obligations de protection des données équivalentes à celles du présent DPA.`},"5_security":{title:"5. Mesures de Sécurité",content:`Arcanes met en Åuvre les mesures techniques et organisationnelles suivantes pour protéger les données : 907 9085.1. Mesures techniques : 909a) Chiffrement HTTPS/TLS pour toutes les communications 910b) Chiffrement au repos des données sensibles dans la base de données 911c) Authentification sécurisée (bcrypt, tokens JWT) 912d) Row Level Security (RLS) Supabase â chaque agent n'accède qu'à ses propres données 913e) API Anthropic en mode Zero Data Retention 914f) Pas de stockage de données bancaires (Stripe tokenization) 915 9165.2. Mesures organisationnelles : 917a) Accès aux données de production limité au gérant (Yann Barbery) 918b) Principe du moindre privilège pour les accès techniques 919c) Pas de sous-traitance du développement à des tiers non autorisés 920d) Revue régulière des accès et des permissions`},"6_breach":{title:"6. Violation de Données",content:`6.1. En cas de violation de données à caractère personnel (au sens de l'article 4(12) du RGPD), Arcanes s'engage à : 921a) Notifier l'Agent dans les meilleurs délais et au plus tard dans les 48 heures après avoir pris connaissance de la violation 922b) Fournir les informations suivantes : nature de la violation, catégories et nombre approximatif de personnes concernées, conséquences probables, mesures prises ou envisagées 923 9246.2. L'Agent, en tant que responsable de traitement, est responsable : 925a) De notifier l'Autorité de protection des données (APD) dans les 72 heures si la violation est susceptible d'engendrer un risque pour les droits et libertés des personnes (Art. 33 RGPD) 926b) D'informer les personnes concernées si la violation est susceptible d'engendrer un risque élevé (Art. 34 RGPD) 927 9286.3. Arcanes coopère avec l'Agent et prend toutes les mesures raisonnables pour atténuer les effets de la violation.`},"7_end":{title:"7. Sort des Données en Fin de Contrat",content:`7.1. à la résiliation du compte Agent Pro, conformément à l'article 13.5 des CGU Pro : 929a) L'Agent peut demander l'export de ses données dans un format structuré et couramment utilisé (JSON ou CSV) dans un délai de 30 jours 930b) Passé ce délai, Arcanes supprime toutes les données à caractère personnel traitées pour le compte de l'Agent dans un délai de 30 jours supplémentaires 931c) Les données strictement nécessaires au respect d'obligations légales (factures, logs de facturation) sont conservées conformément au droit belge (7 ans pour les données comptables) 932 9337.2. La suppression couvre : données des propriétaires, notes de l'Agent, rapports générés, logs d'engagement, et toute copie technique dans les sauvegardes (supprimée au cycle de rotation suivant, maximum 90 jours).`},"8_audit":{title:"8. Droit d'Audit",content:`8.1. L'Agent peut demander à Arcanes toute information raisonnablement nécessaire pour vérifier le respect du présent DPA. 934 9358.2. Les demandes d'audit doivent être notifiées par écrit (email à [email protected]) au moins 15 jours à l'avance. Les audits sont limités à un (1) par année civile et doivent être réalisés de manière à ne pas perturber le fonctionnement normal du service. 936 9378.3. Les coûts de l'audit sont à la charge de l'Agent, sauf si l'audit révèle un manquement matériel d'Arcanes aux obligations du présent DPA.`},"9_transfers":{title:"9. Transferts Internationaux",content:`9.1. Les données sont principalement traitées au sein de l'Espace Ãconomique Européen (Supabase â Paris, France). 938 9399.2. Des transferts hors EEE ont lieu vers : 940a) Anthropic PBC (USA) â pour la génération de textes via API. Garanties : certification Data Privacy Framework + Clauses Contractuelles Types (CCT). Mode Zero Data Retention (aucune conservation après génération). 941b) Stripe Inc. (USA) â pour le traitement des paiements. Garanties : certification DPF + CCT + certification PCI-DSS. 942 9439.3. Arcanes s'engage à ne pas transférer de données vers un pays tiers sans garanties appropriées au sens du Chapitre V du RGPD (Art. 44 à 49).`},"10_general":{title:"10. Dispositions Finales",content:`10.1. Le présent DPA est régi par le droit belge et le RGPD. 944 94510.2. En cas de contradiction entre le présent DPA et les CGU Pro, le DPA prévaut pour tout ce qui concerne la protection des données. 946 94710.3. Le présent DPA entre en vigueur à la date de création du compte Agent Pro et reste en vigueur aussi longtemps que le contrat Agent Pro est actif. 948 94910.4. Autorité de contrôle compétente : 950Autorité de protection des données (APD) 951Rue de la Presse 35, 1000 Bruxelles 952https://www.autoriteprotectiondonnees.be 953[email protected]`}}},a4={title:"Espace presse",free_reuse:"Libre de réutilisation avec la mention",methodology:"méthodologie",search_ph:'Rechercher ( / ) â ex. "peb liège", "rendement", "ménages"â¦',all_territories:"Tous les territoires",all_indicators:"Tous les indicateurs",sort_recent:"Plus récents",sort_az:"A â Z",sort_territory:"Par territoire",filter_all:"Tout",filter_maps:"Cartes",filter_charts:"Graphiques",my_favorites:"Mes favoris",result:"résultat",results:"résultats",view_table:"Table",view_grid:"Grille",loading:"Chargementâ¦",manifest_error:"Manifeste indisponible",col_title:"Titre",col_territory:"Territoire",col_type:"Type",col_updated:"MAJ",col_actions:"Actions",kind_map:"Carte",kind_chart:"Graphique",btn_image:"Image",btn_theme:"Thème",btn_cite:"Citer",tip_cite:"Copier la définition + mention source",no_results:"Aucun résultat â essayez d'élargir la recherche ou les filtres.",no_results_short:"Aucun résultat.",fav_add:"Ajouter aux favoris",fav_remove:"Retirer des favoris",back_press:"â Espace presse",back_home:"Retour à l'accueil",alt_estimation:"estimation, Observatoire Arcanes",territory_not_found:"Territoire introuvable.",territory_empty:"Aucun contenu publié pour ce territoire pour l'instant.",dossier_intro:"Le dossier complet : cartes, graphiques et données téléchargeables, libres de réutilisation avec la mention",copy_mention:"Copier la mention source",charts:"Graphiques",charts_sub:"Les dynamiques du territoire en images.",maps:"Cartes",map_1:"carte",maps_n:"cartes",click_hd:"cliquer pour la ver
953sion haute définition.",click_hd2:"Cliquer pour la version haute définition.",methodo_lead:"Définitions, sources et limites :",methodo_link:"méthodologie de l'Observatoire â",indicator_not_found:"Indicateur introuvable.",copy_def_mention:"Copier la définition + mention source",all_scales:"Toutes les échelles",scales_sub:"Belgique, provinces et arrondissements quand l'indicateur le permet.",back_observatory:"â Observatoire",niv_all:"Tous niveaux"},i4={featureUpdates:UL,rune:$L,communePanel:GL,map:HL,referral:KL,common:YL,header:ZL,notFound:JL,benchmark:QL,revenus:XL,travaux:eB,location:tB,explication:nB,financement:rB,fiscalite:aB,charges:iB,financing:sB,security:oB,sensitivity:lB,amortization:dB,taxation:cB,energy:uB,actionplan:mB,market:pB,simulation:gB,sidebar:hB,transformation:fB,projection:vB,quickstat:bB,operating:yB,auth:wB,hero:kB,premiumHero:xB,heroAnimation:jB,landing:AB,glossary:EB,home:PB,analysis:CB,simulators:SB,pricing:_B,faq:TB,pdf:DB,blog:RB,article:zB,contact:IB,dashboard:qB,sections:NB,toc:LB,score:BB,badges:MB,kpi:FB,decomposition:OB,negotiation:VB,quickactions:WB,disclaimer:UB,freeAnalysis:$B,terms:GB,proTerms:HB,legal:KB,privacy:YB,premium:ZB,footer:JB,validation:QB,referralGamified:XB,settings:e4,seo:t4,buyer:n4,proDpa:r4,presse:a4},s4={newUpdate:"Nieuw",watchDemo:"Bekijk de demo",whatsNew:"Wat is er nieuw",maybeLater:"Misschien later",understood:"Begrepen",version:"Versie"},o4={regulatoryPanel:{title:"Fiche réglementaire â restitution intégrale",subtitle:"Texte validé, affiché sans modification",copy:"Copier",close:"Fermer",collapse:"Réduire",expand:"Déplier"}},l4={emptyState:{title:"Klik op een gemeente",subtitle:"om de analyse te bekijken"},header:{investmentScore:"Investeringsscore"},tabs:{invest:"Investeren",market:"Markt",predict:"Voorspellend"},scores:{yield:"Rend.",security:"Veilig.",potential:"Pot.",rental:"Huur"},metrics:{rentalDemand:"Huurvraag",renovationPotential:"Renovatiepotentieel",familyAttractiveness:"Gezinsaantrekkelijkheid",houses:"Huizen",apartments:"Appart.",affordability:"Toegankelijkheid",supplyDemandTension:"V/A Spanning",medianIncome:"Mediaan inkomen",priceForecast:"Prijsvoorspelling",gentrification:"Gentrificatie",opportunityScore:"Convergentie-index"},premium:{title:"Premium Functie",description:"Ontgrendel voorspellingen en geavanceerde analyses",cta:"Upgraden"},cta:{analyze:"Analyseer een woning hier",compare:"Vergelijken met andere gemeente"},tooltip:{prixMaison:{label:"Mediaanprijs huis",definition:"Centrale waarde van transacties. 50% van de verkopen ligt erboven, 50% eronder. Betrouwbaarder dan het gemiddelde omdat extreme waarden geen invloed hebben.",source:"Statbel - Brique 2: Vastgoedprijzen 2023",method:"Mediaan van notariële akten (onderhandse verkopen)"},revenu:{label:"Mediaan inkomen",definition:"Mediaan fiscaal inkomen per PB-aangifte. Vertegenwoordigt het centrale netto belastbaar inkomen van huishoudens.",source:"Statbel - Brique 1: Fiscale Inkomens 2022"},affordability:{label:"Toegankelijkheidsratio",definition:"Jaren inkomen nodig om een huis te kopen aan de mediaanprijs. Hoe lager de ratio, hoe toegankelijker de markt.",source:"Arcanes berekening - Combinatie Briques 1 & 2",method:"Mediaanprijs huis ÷ Mediaan jaarinkomen"},tension:{label:"Vraag/Aanbod Spanning",definition:"Verhouding tussen evolutie huishoudens en woningen. >100% = tekort (opwaartse druk). <100% = overaanbod.",source:"Statbel - Briques 3 (Demografie) & 4 (Woningpark)",method:"(Evol. huishoudens 5 jaar ÷ Evol. woningen 5 jaar) à 100"},rds:{label:"Huurvraag Score",definition:"Evalueert het huurvraagpotentieel op basis van demografische structuur, dichtheid en prijstoegankelijkheid.",source:"Arcanes Model - Statbel Gegevens 2023"},ais:{label:"Arcanes Investeringsscore",definition:"Samengestelde score die de aantrekkelijkheid voor huurinvestering evalueert. Weging: Rendement (40%) + Veiligheid (30%) + Potentieel (30%).",source:"Arcanes Algoritme - Statbel Gegevens 2023"}}},d4={title:"Verkenningskaart",subtitle:"Ontdek de vastgoedgegevens van de 576 Belgische gemeenten",dataUpdated:"Gegevens bijgewerkt in 2023",selectCommune:"Selecteer een gemeente",clickToExplore:"Klik op de kaart om te verkennen",codeINS:"NIS-code",activeTheme:"Actief thema",seeAvailableProperties:"Beschikbare woningen bekijken",dataNotAvailable:"Gegevens niet beschikbaar",noData:"N/B",source:"Bron",sourceText:"Statbel (Algemene Directie Statistiek), gegevens 2023",methodology:"Methodologie",methodologyText:"De gegevens worden geaggregeerd per gemeente (NIS-code). De evoluties worden berekend op basis van jaarlijkse medianen.",seeOfficialSources:"Officiële bronnen bekijken",searchPlaceholder:"Zoek een gemeente of postcode...",noResults:"Geen gemeente gevonden",suggestions:"Populaire suggesties",share:"Delen",compare:"Vergelijken",analyzeProperty:"Een woning analyseren in deze gemeente",fullscreen:"Volledig scherm",exitFullscreen:"Volledig scherm verlaten",loading:"Kaart laden...",error:"Laadfout","5years":"5 jaar","10years":"10 jaar",themes:{prix:{label:"Mediaanprijs",de
953scription:"Mediaanprijs van woningen",explanation:"De mediaanprijs vertegenwoordigt de centrale waarde van vastgoedtransacties. 50% van de verkopen ligt erboven, 50% eronder.",methodology:"Berekend op basis van geregistreerde notariële akten. Alleen onderhandse verkopen worden meegenomen."},dynamique:{label:"Prijsdynamiek",description:"Prijsevolutie over 5 jaar",explanation:"De prijsevolutie over 5 jaar toont de trend van de lokale markt. Een stijging wijst op een aanhoudende vraag.",methodology:"Vergelijking van de huidige mediaanprijs met die van 5 jaar geleden, uitgedrukt in percentage."},bati:{label:"Leeftijd gebouwen",description:"Aandeel oude gebouwen (>50 jaar)",explanation:"De leeftijd van gebouwen beïnvloedt het renovatiepotentieel en de onderhoudskosten.",methodology:"Aandeel gebouwen ouder dan 50 jaar, gebaseerd op het kadaster."},demographie:{label:"Demografische druk",description:"Evolutie aantal huishoudens (5 jaar)",explanation:"De evolutie van huishoudens weerspiegelt de aantrekkelijkheid van een gemeente.",methodology:"Variatie van het aantal huishoudens over 5 jaar, gebaseerd op het Rijksregister."},tension:{label:"Marktspanning",description:"Spanningsniveau op de markt",explanation:"De spanningsscore combineert verschillende indicatoren om de vraag/aanbod balans te evalueren.",methodology:"Samengestelde indicator gebaseerd op prijsevolutie en demografie."},accessibilite:{label:"Toegankelijkheid",description:"Ratio prijs / mediaan inkomen",explanation:"De prijs/inkomen ratio geeft aan hoeveel jaren inkomen nodig zijn om een woning te kopen.",methodology:"Mediaanprijs woning gedeeld door het mediaan fiscaal inkomen van de huishoudens."},ais:{label:"Investeringsscore",description:"Globale aantrekkelijkheidsscore voor investeringen (0-100)",explanation:"De Arcanes Index combineert drie berekende dimensies: geschat rendement (40%), marktstabiliteit (30%) en historisch waarderingspotentieel (30%). Deze index is een sorteertool, geen beleggingsadvies.",methodology:"Elke dimensie wordt berekend uit meerdere Statbel-indicatoren (prijzen, inkomens, demografie, woningpark), genormaliseerd van 0 tot 100, dan gewogen voor de eindscore."},rds:{label:"Huurvraag",description:"Huurvraagpotentieel (0-100)",explanation:"Deze score evalueert het huurpotentieel van een gemeente. Een hoge score wijst op een hoge kans om huurders te vinden en een dynamische huurmarkt.",methodology:"Combineert aandeel alleenstaanden (30%), demografische groei (20%), stedelijke dichtheid (20%), prijstoegankelijkheid (15%) en parkrotatie (15%)."},tod:{label:"Vraag/Aanbod Spanning",description:"Verhouding groei huishoudens / woningen",explanation:"Meet het evenwicht van de vastgoedmarkt. Boven 100% zijn er meer huishoudens dan woningen (tekort). Onder 100% zijn er meer woningen dan huishoudens (overaanbod).",methodology:"Formule: (Evolutie huishoudens 5 jaar) / (Evolutie woningen 5 jaar) à 100. Gebaseerd op Statbel gegevens 2018-2023."},rpi:{label:"Renovatiepotentieel",description:"Meerwaardepotentieel via renovatie (0-100)",explanation:"Identificeert gemeenten waar renovatie waarde kan creëren. Een hoge score wijst op oud gebouwenbestand met lokale inkomens die renovatie kunnen financieren.",methodology:"Combineert aandeel gebouwen >50 jaar (45%), deficit moderne uitrusting (25%) en lokale financiële capaciteit (30%)."},fas:{label:"Gezinsaantrekkelijkheid",description:"Aantrekkelijkheid voor gezinnen met kinderen (0-100)",explanation:"Evalueert de geschiktheid van een gemeente voor gezinnen. Nuttig om gemeenten te identificeren voor een gezinspubliek.",methodology:"Combineert beschikbaarheid 4-gevelwoningen (35%), aanwezigheid gezinnen (25%), gezinsdynamiek (20%) en prijstoegankelijkheid (20%)."},pfi:{label:"Prijsvoorspelling",description:"Prijsevolutie voorspellingsindex (-100 tot +100)",explanation:"Index die de waarschijnlijke prijsevolutie modelleert. Een positieve index is geassocieerd met een stijgende trend, een negatieve met een dalende trend. Deze indicator is puur indicatief en vormt geen gegarandeerde voorspelling.",methodology:"Model gebaseerd op inkomensdynamiek (35%), demografische druk (25%), vraag/aanbod spanning (25%) en bouwdynamiek (15%)."},gvi:{label:"Gentrificatie",description:"Snelheid van socio-economische transformatie (-50 tot +50)",explanation:"Meet de snelheid van socio-economische transformatie van een gemeente. Snelle gentrificatie is historisch geassocieerd met prijsstijgingen, maar ook met een risico op lokale correctie.",methodology:"Analyseert evolutie mediane inkomens, prijsevolutie, transformatie woningpark en demografische veranderingen over 5 jaar."},opportunity:{label:"Convergerende indicatoren",description:"Gemeenten met meerdere gelijktijdig gunstige indicatoren",explanation:"Identificeert gemeenten waar meerdere indicatoren convergeren: hoge AIS-score, positieve gentrificatie, prijzen onder regionaal gemiddelde en gunstige spanning. Deze convergentie is een statistische vaststelling, geen aanbeveling.",methodology:"Een gemeente wordt als 'Kans' gemarkeerd als ze minstens 3 criteria voldoet: AIS > 55, GVI > 10, prijzen onder regionaal gemiddelde, gunstige spanning, geen bubbelrisico."}},sections:{prix:"Vastgoedprijzen",dynamique:"Prijsdynamiek",demographie:"Demografie",bati:"Vastgoedpark",marche:"Marktspanning",accessibilite:"Financiële toegankelijkheid",investissement:"Investering",predictif:"Voorspellend"},data:{medianPrice:"Mediaanprijs woning",priceEvol5y:"Evolutie 5 jaar",priceEvol10y:"Evolutie 10 jaar",priceM2Appart:"Prijs m² appartement",population:"Bevolking",households:"Aantal huishoudens",householdsEvol
953:"Evol. huishoudens (5 jaar)",buildings:"Gebouwen",oldBuildings:"Aandeel oud (>50 jaar)",newBuildings:"Aandeel nieuw (<10 jaar)",buildingDynamic:"Dynamiek",tensionLevel:"Spanningsniveau",tensionScore:"Spanningsscore",marketProfile:"Marktprofiel",priceIncomeRatio:"Ratio prijs/inkomen",medianIncome:"Mediaan inkomen",investmentScore:"Investeringsscore",rentalDemand:"Huurvraag",renovationPotential:"Renovatiepotentieel",familyAttractiveness:"Gezinsaantrekkelijkheid",priceForecast:"Prijsvoorspelling",gentrification:"Gentrificatie",opportunityScore:"Convergentie-index",rendement:"Rendement",securite:"Veiligheid",potentiel:"Potentieel",locatif:"Huur",prixAppart:"Appartprijs",evol5ans:"Evol. 5 jaar"},tensionLevels:{veryRelaxed:"Zeer ontspannen",relaxed:"Ontspannen",balanced:"Evenwichtig",tense:"Gespannen",veryTense:"Zeer gespannen"},scoreLabels:{excellent:"Uitstekend",good:"Goed",moderate:"Matig",low:"Laag",veryLow:"Zeer laag"},accessibilityLabels:{accessible:"Toegankelijk",tight:"Gespannen",difficult:"Moeilijk",veryDifficult:"Zeer moeilijk"},demandLabels:{strong:"Sterk",moderate:"Matig",low:"Laag"},panel:{summary:"Samenvatting",details:"Details",predictive:"Voorspellend",analyzeHere:"Analyseer een woning hier",premiumRequired:"Premium functie",unlockPremium:"Ontgrendelen met Premium",moreInfo:"Meer info"},alerts:{bubbleRisk:"Vastgesteld prijs/fundamenten verschil",bubbleRiskDesc:"De prijsevolutie wijkt significant af van de lokale economische indicatoren.",opportunityWindow:"Convergerende indicatoren",opportunityWindowDesc:"Deze gemeente vertoont meerdere gelijktijdig gunstige indicatoren volgens het Arcanes-model."},footer:{dataSource:"Statbel 2023 gegevens",communes:"581 Belgische gemeenten",upgradePremium:"Upgrade naar Premium voor alle metrics"},infoModal:{understand:"Deze indicator begrijpen",methodology:"Methodologie",source:"Bron"}},c4={credits:"Credit",credits_plural:"Credits",login:"Inloggen",myAccount:"Mijn Account",loading:"Laden...",error:"Fout",success:"Succes",buy:"Kopen",download:"Download",save:"Bespaar",per_credit:"â¬/credit",year:"jaar",close:"Sluiten",month:"maand",monthly:"Maandelijks",annual:"Jaarlijks",years:"jaar",back:"Terug",backToSimulators:"Terug naar simulators",calculate:"Berekenen",fillForm:"Vul het formulier in",locale:"nl-BE"},u4={title:"Vermogensbenchmark",subtitle:"Vergelijking met klassieke beleggingen",depart:"Start",an:"Jaar",immo:"Dit Project (Immo + Hefboom)",bourse:"Beurs (S&P 500)",epargne:"Veilig Sparen",immoLabel:"Vastgoed",bourseLabel:"Beurs",epargneLabel:"Sparen",avecLevier:"Met hefboomeffect",insightTitle:"Observatie",insightText:"Deze grafiek illustreert de theoretische impact van het bancaire hefboomeffect op het vermogen, op basis van de gehanteerde hypothesen in deze simulatie. In het verleden behaalde resultaten bieden geen garantie voor de toekomst."},m4={trigger:"Bekijk de projectstappen",title:"Typische Stappen van een Vastgoedproject",completed:"stappen voltooid",step:"Stap",allDone:"Alle stappen zijn doorlopen.",step1:{category:"Financiën",title:"Financiering",description:"Berekende eigen inbreng: {{apport}}. Gebruikte referentierente: {{taux}}."},step2:{category:"Juridisch",title:"Notariële akte",description:"Geschatte aankoopkosten: {{frais}}."},step3:{category:"Werken",title:"Energetische werken",description:"Geschat budget: {{budget}} â EPB-doel: {{peb}}."},step4:{category:"Beheer",title:"Verhuren",description:"Geschatte huur: {{loyer}}/maand. Wettelijke jaarlijkse indexering van toepassing."}},p4={chart:{title:"Marktrealiteit",subtitle:"Totale kost vs. Waarde na werken"},legend:{prix:"Prijs & Kosten",travaux:"Werken",total:"Totale Kost",arv:"ARV"},marge:{title:"Latente Marge",positive:"Potentiële waardecreatie",negative:"Let op: projectkost > geschatte waarde",coutProjet:"Projectkost"},prix:{title:"Prijspositie",asked:"Vraagprijs",estimated:"Marktschatting",gap:"Verschil",veryunder:"Ver onder de markt",under:"Onder de markt",fair:"Coherente prijs",over:"Boven de markt",veryover:"Overpriced",m2:"Prijs/m²",m2estimated:"Schatting/m²"},decomposition:{title:"Uitsplitsing"}},g4={before:{title:"Huidige Situatie",subtitle:"Huidige energetische toestand",conso:"Verbruik",etat:"Algemene staat"},after:{title:"Na Werken",subtitle:"Energetisch doel",conso:"Verbruik",etat:"Staat na werken",renove:"Vers gerenoveerd"},budget:{title:"Transformatiebudget",subtitle:"Energetische werken & afwerking",peb:"EPB-werken",primes:"Geschatte premies",finition:"Afwerkingswerken",total:"Totaal Werken",roi:"Rendement op investering"},economies:{title:"Energiebesparing",annual:"Geschatte jaarlijkse besparing",before:"Voor",after:"Na",reduction:"Reductie van"},compliant:{title:"Reeds Conform",description:"Dit pand voldoet al aan de EPB-doelstellingen 2050. Geen grote energetische werken nodig."},immeuble:{title:"Transformatie per Eenheid",unit:"Eenheid",pebBefore:"EPB Voor",pebAfter:"EPB Na",budget:"Budget",total:"Totaal Gebouw"}},h4={title:"Vermogensevolutie",subtitle:"Kapitaal + Cashflow + Meerwaarde over 10 jaar",habitation:{notice:"De gedetailleerde vermogensprojectie is beschikbaar voor huurinvesteringsanalyses."},chart:{capital:"Terugbetaald kapitaal",cashflow:"Gecumuleerde cashflow",plusvalue:"Latente meerwaarde"},flux:{title:"Jaarlijkse Kasstromen",loyers:"Huurinkomsten",charges:"Lasten",cashflow:"Cashflow"}
953,patrimoine:{title:"Netto Vermogen (Jaar 10)",capital:"Terugbetaald kapitaal",cashflow:"Gecumuleerde cashflow",plusvalue:"Latente meerwaarde"},revente:{title:"Verkoopscenario",valeur:"Toekomstige waarde",dette:"Resterende schuld",frais:"Verkoopkosten (~4%)",produit:"Netto opbrengst"}},f4={prix:"Aankoopprijs",travaux:"Werken",total:"Totale Invest.",mensualite:"Maandelijks"},v4={title:"Exploitatierekening",subtitle:"Detail van financiële stromen (Jaar 1)",poste:"Post",loyersBruts:"(+) Bruto Huur",vacance:"(-) Leegstand",loyersEffectifs:"= Effectieve Huur",chargesProprietaire:"(-) Eigenaarslasten",noi:"= NOI",mensualiteCredit:"(-) Kredietaflossing",cashflowNet:"= NETTO CASHFLOW",cashflow:"Cashflow",autofinance:"Volgens deze simulatie zou het project zichzelf financieren. Geen maandelijkse bijdrage zou vereist zijn.",effortEpargne:"Volgens deze simulatie zou een spaarbijdrage van ongeveer {{amount}}/maand nodig zijn."},b4={gate:{title:"Maak uw account aan om deze tool te ontgrendelen",description:"Krijg gratis toegang tot al onze professionele simulators en analyses",benefit1:"Alle vastgoedsimulators (IRR, rendement, aankoopkosten...)",benefit2:"Volledige analyses van vastgoed met AI",benefit3:"PDF-export van uw berekeningen en analyses",createAccount:"Maak mijn gratis account aan",alreadyHaveAccount:"Al een account? Inloggen"},gateDialog:{title:"Maak uw account aan om verder te gaan",description:"Krijg gratis toegang tot al onze vastgoedanalysetools",benefit1:"Alle vastgoedsimulators (IRR, rendement, aankoopkosten...)",benefit2:"Volledige en gedetailleerde vastgoedanalyses",benefit3:"1 gratis analysecredit bij registratie",createAccount:"Maak mijn gratis account aan",alreadyHaveAccount:"Al een account? Inloggen"},login:{title:"Welkom terug",subtitle:"Log in om toegang te krijgen tot uw analyses",email:"E-mail",emailPlaceholder:"[email protected]",password:"Wachtwoord",forgotPassword:"Wachtwoord vergeten?",submit:"Inloggen",loading:"Bezig met inloggen...",noAccount:"Nog geen account?",createAccount:"Account aanmaken",success:"Succesvol ingelogd",welcome:"Welkom!",error:"Inlogfout",validationError:"Validatiefout",genericError:"Er is een fout opgetreden bij het inloggen",rightPanel:{title:"Uw vastgoedanalyses,",titleHighlight:"altijd toegankelijk",description:"Vind uw rapporten, volg uw projecten en krijg toegang tot nauwkeurige en actuele gegevens.",stat1Value:"10K+",stat1Label:"Gegenereerde analyses",stat2Value:"<30s",stat2Label:"Gemiddelde analysetijd",stat3Value:"500+",stat3Label:"Actieve gebruikers",stat4Value:"98%",stat4Label:"Nauwkeurigheidspercentage"}},reset:{title:"Wachtwoord opnieuw instellen",subtitlePending:"Voer uw e-mail in om een resetlink te ontvangen",subtitleSent:"Een reset-e-mail is verzonden",email:"E-mailadres",emailPlaceholder:"[email protected]",submit:"Link verzenden",loading:"Verzenden...",backToLogin:"Terug naar inloggen",emailSent:"E-mail verzonden",emailSentDescription:"Controleer uw mailbox om uw wachtwoord opnieuw in te stellen",emailSentTo:"Een e-mail is verzonden naar",emailSentInstruction:"Klik op de link in de e-mail om uw wachtwoord opnieuw in te stellen.",noEmailReceived:"Geen e-mail ontvangen?",retry:"Opnieuw proberen",error:"Fout",validationError:"Validatiefout",genericError:"Er is een fout opgetreden"},update:{title:"Nieuw wachtwoord",subtitle:"Kies een veilig wachtwoord",newPassword:"Nieuw wachtwoord",confirmPassword:"Bevestig wachtwoord",submit:"Bijwerken",loading:"Bijwerken...",strength:"Sterkte",strengthWeak:"Zwak",strengthMedium:"Gemiddeld",strengthGood:"Goed",strengthExcellent:"Uitstekend",check8chars:"8+ tekens",checkUppercase:"Hoofdletter",checkLowercase:"Kleine letter",checkNumber:"Cijfer",checkSpecial:"Speciaal teken",passwordsMatch:"Wachtwoorden komen overeen",passwordsDontMatch:"Wachtwoorden komen niet overeen",success:"Wachtwoord bijgewerkt!",successDescription:"Uw wachtwoord is succesvol gewijzigd",error:"Fout",validationError:"Validatiefout",genericError:"Er is een fout opgetreden"}},y4={analysis:"Analyse",simulators:"Simulatoren",pricing:"Prijzen",communes:"Gemeenten",faq:"FAQ",blog:"Blog",contact:"Contact",markAllRead:"Alles als gelezen markeren",notificationsSoon:"Meldingen binnenkort beschikbaar",notificationsSoonDesc:"Deze functie komt binnenkort",noNotifications:"Geen meldingen",noNotificationsDesc:"U wordt op de hoogte gebracht van belangrijke updates",viewAllNotifications:"Alle meldingen bekijken",logoutSuccess:"Succesvol uitgelogd",logoutError:"Fout bij het uitloggen",myProfile:"Mijn profiel",settings:"Instellingen",myCredits:"Mijn credits",dashboard:"Dashboard",logout:"Uitloggen",leaveBeta:"Beta verlaten",betaLogoutSuccess:"Succesvol uitgelogd uit de Beta",myDashboard:"Mijn Dashboard",profile:"Profiel",referralTitle:"Verwijzing - Verdien credits",defaultUser:"Gebruiker",observatory:"Observatorium",mvv:"Mijn Echte Waarde",explore:"Verkennen",resources:"Hulp & info"},w4={title:"Pagina niet gevonden",description:"De pagina die u zoekt bestaat niet of is verplaatst.",home:"Terug naar startpagina",back:"Vorige pagina"},k4={scrollToAnalyze:"Scroll om te analyseren",analyzing:"Analyse bezig",analysisComplete:"Analyse voltooid",summary:{investment:"Dit pand toont een berekend IRR van {{tri}} over 10 jaar met een maandelijkse cashflow van {{cashflow}}.",undermarket:"Het pand is gepositioneerd {{pct}}% onder de lokale marktprijs.",overmarket:"Let op: het pand is gepositioneerd {{pct}}% boven de markt.",opportunity:"Prijs aanzienlijk lager dan de algoritmische schatting",underpriced:"Prijs iets lager dan de algoritmische schatting",overpriced:"Prijs hoger dan de algoritmische schatting",fairprice:"Prijs binnen de marge van de lokale marktschatting.",default:"Analyse bezig..."}},x4={badge:"Nieuw: Analyse 2.0",headline:"Data-driven vastgoedanalyse.",subheadline:"Krijg de belangrijkste indicatoren van elke vastgoedadvertentie in enkele seconden.",inputPlaceholder:"Plak een link naar een onroerendgoedadvertentie...",ctaButton:"Analyseren",scoreLabel:"Synthetische Index",metrics:{cashflow:"Cashflow",cashflowValue:"+245â¬/maand",profitability:"Rendement",profitabilityValue:"7.2%",pricePerSqm:"Prijs/m²",pricePerSqmValue:"-8% vs markt"}},j4={ad:{price:"⬠385.000",ref:"Ref: IMO-2024-5847",title:"Mooie Gezinswoning in Waterloo",location:"Sparrenlaan, 1410 Waterloo",description:{part1:"Prachtige gezinswoning met een",surface:"woonoppervlakte",part2:"van",surfaceValue:"145 m²",part3:", ideaal gelegen in een rustige woonwijk. Dit pand omvat",roomsValue:"5 kamers",part4:"waaronder 3 lichte slaapkamers, perfect voor een gezin."},details:{typeLabel:"Type",part1:"pand:",typeValue:"Huis",part2:"4 gevels met beboste tuin van 300m².",conditionLabel:"Staat",part3:"algemeen:",conditionValue:"Correct",part4:", vereist enkele opfrissingswerken. Gasverwarming, dubbele beglazing, garage voor 2 wagens."},features:{surface:"Oppervlakte",rooms:"Kamers",bedrooms:"Slaapkamers",energy:"Energie"},buttons:{contact:"Makelaar contacteren",visit:"Bezoek plannen"}},chart:{title:"Volledige AI Analyse",subtitle:"Evaluatie op 4 sleutelcriteria",scoreGlobal:"Globale Score",criteria:{priceVsMarket:"Prijs vs Markt",cashflow:"Cashflow",roi:"ROI",profitability:"Rentabiliteit"},propertyCard:{priceLabel:"PRIJS",priceValue:"450kâ¬",location:"Brussel - Louizalaan",surfaceLabel:"OPPERVLAKTE",surfaceValue:"85 m²",roomsLabel:"KAMERS",roomsValue:"4 kamers",typeLabel:"TYPE",typeValue:"Appartement",conditionLabel:"STAAT",conditionValue:"Uitstekend"},buttons:{start:"Analyse starten",pricing:"Tarieven bekijken"}}},A4={hero:{badge:"Nieuw: Analyse 2.0",title1:"Vastgoedintelligentie",title2:"van de nieuwe",title3:"generatie",subtitle:"Transformeer elke advertentie in een",subtitleHighlight:"volledig evaluatierapport",subtitleTime:"In 10 seconden.",ctaMobile:"Gratis analyseren",trust1:"100% Veilig",trust2:"Analyse in 10 seconden",trust3:"+15.000 analyses",cardTitle:"Woning 4 gevels",cardLocation:"Ukkel, Brussel",opportunityTitle:"Analyse voltooid",opportunitySubtitle:"Berekend bruto rendement: 2.3% boven het gemiddelde",metricCashflow:"Cashflow",metricTRI:"IRR 10 jaar",metricPrice:"Prijs/m²",floatingCardLabel:"Vandaag",floatingCardTitle:"Netto volume",savingsLabel:"Vastgesteld ver
953schil",betaLogoutSuccess:"Beta uitloggen geslaagd"},dataHub:{badge:"Datagedreven verkenning",title:"581 gemeenten. 43 indicatoren. Eén platform.",subtitle:"Verken de Belgische vastgoedmarkt gemeente per gemeente, of gebruik de interactieve screener om uw ideale investeringszone te identificeren.",communes:{title:"Gemeentengids",description:"Elke Belgische gemeente, ontcijferd. 42 indicatoren per fiche: prijzen, fiscaliteit, demografie, energie, rendement. Zoek op naam of postcode.",stat1:"gemeenten",stat2:"indicatoren",stat3:"regio's",cta:"Alle gemeenten verkennen"},screener:{title:"Interactieve Screener",description:"Interactieve kaart + sorteerbare tabel. Filters min/max, samengestelde score, 12 intelligente strategieën (Cashflow Max, Eerste aankoop, Meerwaarde...). PDF-export.",pill1:"43 indicatoren",pill2:"Samengestelde score",pill4:"12 strategieën",cta:"Screener openen"}},simulators:{badge:"Gratis tools",title:"Vastgoedsimulators",subtitle:"6 gratis tools om uw vastgoedinvestering in België voor te bereiden",launchCta:"Start de simulator",viewAll:"Bekijk alle simulators",previewLabel:"Voorbeeld resultaat",preview:{registrationRights:"Registratierechten",notaryFees:"Notariskosten",adminFees:"Administratiekosten",totalFees:"Totale kosten",perMonth:"per maand",duration:"Looptijd",rate:"Rentevoet",total:"Totaal",maxBudget:"Maximaal budget",monthly:"Maandlast",debtRatio:"Schuldgraad",consumption:"Verbruik",annualCost:"Jaarlijkse kost",grossYield:"Bruto rendement",netYield:"Netto rendement",cashflow:"Cashflow",tri:"IRR over 10 jaar",totalGain:"Totale winst",over:"Over"},notaryFees:{title:"Aankoopkosten",description:"Bereken de notariskosten en registratierechten volgens uw regio",badge:"Populair"},mortgage:{title:"Hypothecaire lening",description:"Simuleer uw maandlasten en de totale kost van uw vastgoedkrediet",badge:"Essentieel"},borrowingCapacity:{title:"Leencapaciteit",description:"Ontdek uw maximaal budget op basis van uw inkomen"},peb:{title:"EPC Impact",description:"Evalueer de energie-impact op uw kosten en de waarde van het pand",badge:"Nieuw"},rentalYield:{title:"Huurrendement",description:"Bereken het bruto, netto rendement en de cashflow van uw investering",badge:"Belegger"},tri:{title:"IRR & Projectie",description:"Projecteer uw investering over 10 jaar met het interne rendement",badge:"Geavanceerd"},propertyTax:{title:"Onroerende voorheffing",description:"Schatting van de onroerende voorheffing volgens de officiële Belgische formule, per gemeente en per gewest.",badge:"NIEUW"}},faq:{badge:"Veelgestelde vragen",title:"Uw vragen, onze antwoorden",subtitle:"Alles wat u moet weten over Arcanes en onze vastgoedanalyses",moreQuestions:"Heeft u nog andere vragen?",viewAll:"Bekijk de volledige FAQ"},blog:{badge:"Bronnen & Gidsen",title:"Onze vastgoedblog",subtitle:"Marktanalyses, kerngegevens en praktische gidsen om Belgisch vastgoed te begrijpen",trending:"Trending",readMore:"Lees het artikel",viewAll:"Bekijk alle artikelen"},howItWorks:{badge:"Vereenvoudigd proces"},features:{badge:"Functies",complete:{title:"Volledige analyse",desc:"IRR, cashflow, bruto/netto rendement, 10-jarige projectie, rentegevoeligheid"},benchmark:{title:"Markt benchmark",desc:"Automatische vergelijking met gemiddelde prijzen in uw geografische zone"},instant:{title:"Onmiddellijk",desc:"Resultaten in minder dan 10 seconden dankzij onze geoptimaliseerde infrastructuur"},pdf:{title:"Professioneel PDF-rapport",desc:"Professionele export van 11 pagina's met grafieken en gedetailleerde indicatoren"}},pricing:{badge:"Eenvoudige tarieven",freeSubtitle:"Perfect om te testen",freeCta:"Gratis beginnen",popularBadge:"Meest populair",startingFrom:"Vanaf",perAnalysis:"analyse"},cta:{badge:"1 gratis analyse inbegrepen"}},E4={title:"Arcanes Woordenlijst & Methodologie",subtitle:"{count} gedetailleerde concepten om de mechanica van onze analyses te begrijpen.",search:"Zoek een definitie (bv. ARV, IRR, Terugslag...)",noResults:'Geen resultaten voor "{query}"',tabs:{habitation:"Eigen Woning (Aankoop)",investissement:"Investering (Verhuur)"},categories:{bien:"Het Pand & Schatting",valorisation:"Waardering & Marktprijs",couts:"Kosten, Werken & Energie",financement:"Bank & Financiering",fiscalite:"Fiscaliteit & Taksen",revenus:"Huurinkomsten & Leegstand",charges:"Lasten & Verzekeringen",kpi:"Rendementsindicatoren (KPI)",projection:"Vermogensprojectie (10 jaar)",peb:"Energieprestatie (EPC)",scoreHabitation:"Synthetische Index Arcanes"},terms:{bien:{surface:{term:"Gewogen Woonoppervlakte",definition:"Oppervlakte gebruikt als basis voor alle prijsberekeningen per m². Omvat de verwarmde leefruimtes. Voor waardeberekeningen past Arcanes een weging toe: kleine oppervlaktes (studio's) zijn per m² duurder dan zeer grote (villa's), wat ons algoritme automatisch corrigeert."},type:{term:"Type pand",definition:"De categorie van het pand (Appartement, Huis, Opbrengsteigendom) beïnvloedt de kostenstructuur ingrijpend. Een appartement heeft bijvoorbeeld mede-eigendomskosten (syndicus) en minder onderhoud, terwijl een huis geen syndicus betaalt maar meer structureel onderhoud vergt (dak, gevels)."}
953,etat:{term:"Staat van het pand (Coëfficiënt)",definition:"Objectieve evaluatie van de visuele staat. Ons algoritme past een vermenigvuldigingsfactor toe op de basisprijs: een 'Te renoveren' pand krijgt een automatische korting (0.80), terwijl een 'Nieuw' pand een toeslag krijgt (1.18 tot 1.25) voor de kwaliteitspremie.",formula:"Coëf: Ruïne (0.65) tot Nieuw (1.18)"},atouts:{term:"Gewaardeerde Troeven",definition:"Specifieke comfortelementen gedetecteerd in de advertentie die de verkoop- en huurwaarde verhogen. In tegenstelling tot een generieke schatting, voegt Arcanes cumulatieve bonussen toe voor Tuin, Terras of Parking.",example:"Tuin (+3 à 5%), Terras (+2 à 3%), Parking (+100â¬/maand)."}},valorisation:{estActuel:{term:"Geschatte Prijs/m² (Huidig)",definition:"De theoretische 'Eerlijke Waarde' van het pand in huidige staat, voor werken. Berekend door regionale marktgegevens te kruisen met de precisie van de Postcode, gecorrigeerd voor staat, EPC en troeven.",formula:"Regionale Basis à Ligging Coëf. à Staat Coëf. à EPC Coëf. à Troeven"},arv:{term:"ARV (Waarde Na Renovatie)",definition:"After Repair Value. Geprojecteerde waarde van het pand na voltooiing van de werken. Het is een simulatie van een 'Perfect' pand (Nieuwstaat + Doel EPC) in deze specifieke wijk. Indien de wijk zeer gewild is ('Premium'), bevat de ARV een 'Zeldzaamheidsbonus'.",formula:"Basis à Ligging à Staat (Gerenoveerd) à Zeldzaamheidsbonus"},bonusRarete:{term:"Zeldzaamheidsbonus",definition:"Exclusief Arcanes mechanisme. Als u een pand renoveert naar hoge prestaties (EPC A/B) in een zone met grote vraag (bv. Elsene, Ukkel, Lasne...), betaalt de markt een extra 'Coup de CÅur' premie die wij toevoegen aan de eindschatting.",formula:"+5% (Premium Zone) tot +10% (Ultra-Premium Zone)"},margeLatente:{term:"Latente Marge",definition:"Verschil tussen de marktschatting na werken (ARV) en de totale projectkost (Aankoop + Werken). Indien positief, is de totale kost lager dan de eindschatting. Dit verschil is theoretisch en gebaseerd op algoritmische schattingen.",formula:"ARV - (Aankoopprijs + Werkbudget)"},ecart:{term:"Verschil vs Markt",definition:"Vergelijking tussen de vraagprijs en onze algoritmische schatting. Een negatief verschil (bv. -10%) betekent dat het pand onder de theoretische waarde wordt aangeboden, wat wijst op een mogelijke opportuniteit.",formula:"(Vraagprijs - Schatting) / Schatting"}},couts:{fraisAcq:{term:"Aankoopkosten",definition:"Totaal van 'verloren' kosten betaald bij aankoop. Arcanes berekent nauwkeurig de Registratierechten (volgens regio en regime), notariële erelonen (barema's) en administratieve kosten.",formula:"Registratierechten + Notaris + Admin kosten + BTW"},travauxEnergie:{term:"Energetische Werken",definition:"Geschat budget om het pand van het huidige EPC naar de doelstelling 2050 (Label A of B) te brengen. De kost is berekend op basis van het verbruiksverschil (kWh/m²) en omvat isolatie, verwarming en ramen.",formula:"Verschil EPC-score (kWh) à Regionale eenheidskost"},travauxFinit:{term:"Afwerkingswerken",definition:"Budget voor cosmetische renovatie (keuken, vloeren, verf, elektriciteit) onafhankelijk berekend van energetische werken. Gebaseerd op een forfait per m² volgens de visuele staat (van 0⬠voor nieuw tot 1000⬠voor een ruïne).",formula:"Forfait m²: van 0⬠(Nieuw) tot 1000⬠(Ruïne)"},tvaRenov:{term:"BTW Tarief Renovatie",definition:"Toegepast BTW-tarief op werken. Het algoritme detecteert automatisch de leeftijd van het gebouw: indien > 10 jaar, wordt het verlaagd tarief van 6% toegepast, wat het budget aanzienlijk verlicht.",formula:"6% indien gebouw > 10 jaar, anders 21%"},effetRebond:{term:"Terugslageffect (Energie)",definition:"Gedragscorrectie toegepast op energiezeven (EPC F/G). In werkelijkheid verwarmen bewoners van deze panden minder dan theoretisch nodig om kosten te drukken. De werkelijke besparing na werken is dus vaak lager dan de theorie. Arcanes corrigeert dit om uw maandelijkse winst niet te overschatten.",formula:"Reëel Verbruik = 75% van Theoretisch voor EPC F/G"}},charges:{maintenance:{term:"Structureel Onderhoud",definition:"Financiële voorziening voor toekomstige grote herstellingen (dak, gevel, ketel) ten laste van de eigenaar. Berekend per m² voor precisie: een gerenoveerd pand vergt minder onderhoud (8â¬/m²) dan een oud pand (18â¬/m²).",formula:"8 â¬/m²/jaar (indien Gerenoveerd) of 18 â¬/m²/jaar (indien Oud)"},copro:{term:"Kosten Mede-eigendom",definition:"Enkel voor appartementen: schatting van syndicus, schoonmaak gemene delen en lift. Indien geen gegevens, past Arcanes een standaardschatting toe op basis van de grootte.",formula:"Schatting ~1.5 tot 2⬠/ m² / maand (indien niet ingevuld)"},assurance:{term:"Brandverzekering",definition:"Schatting van de jaarlijkse premie gebaseerd op de nieuwbouwwaarde van het gebou
953w (ongeveer 1500-1800â¬/m²).",formula:"Oppervlakte à Wederopbouwkost à Verzekeringstarief"},entretien:{term:"Onderhoudsvoorziening",definition:"Budget voor klein dagelijks onderhoud (kranen, dichtingen, kleine herstellingen) ten laste van de bewoner (huurder of eigenaar).",formula:"0.5% van de prijs van het pand / jaar"}},financement:{investTotal:{term:"Totale Investering",definition:"Het globale 'Sleutel-op-de-deur' projectbudget. Som van Aankoopprijs, Aankoopkosten (taksen) en totale Werkbudget. Op dit bedrag wordt het rendement berekend.",formula:"Aankoopprijs + Aankoopkosten + Totaal Werken"},mensualite:{term:"Maandaflossing",definition:"Simulatie van de maandelijkse bankterugbetaling (Kapitaal + Interesten) op basis van een standaard vaste rente op 20 jaar.",formula:"Standaard afschrijving (Vaste rente 20 jaar)"},apport:{term:"Vereiste Eigen Inbreng",definition:"Minimum bedrag aan eigen middelen te investeren. Dekt meestal de Aankoopkosten (niet financierbaar) + een deel van de prijs (vaak 10 à 20%) geëist door banken.",formula:"Totale Investering - Leenbedrag"},quotite:{term:"Quotiteit (LTV)",definition:"Loan-to-Value. Het percentage van het project dat de bank bereid is te financieren. Hoe hoger de quotiteit, hoe groter het hefboomeffect, maar hoe hoger het risico.",example:"Quotiteit 80% = U brengt 20% in + de kosten."},coutCredit:{term:"Totale Kredietkost",definition:"De totale som van interesten betaald aan de bank over de volledige looptijd. Dit is de 'prijs' van het geleende geld.",formula:"(Maandaflossing à Looptijd) - Geleend Kapitaal"}},revenus:{loyerRef:{term:"Referentiehuur",definition:"Standaard markthuur voor dit type pand in de regio, aangepast aan de grootte. Ons algoritme past een 'degressiviteit' toe: een kleine studio verhuurt duurder per m² dan een grote villa.",formula:"Regionaal Gemiddelde (â¬/m²) à Oppervlakte Degressiviteit"},loyerProjete:{term:"Geprojecteerde Huur (Geoptimaliseerd)",definition:"Geschatte huur na volledige renovatie. Waardeert de superieure kwaliteit (Nieuwstaat, Top Isolatie) en ligging, maar met een demping om realistisch te blijven (huurprijzen stijgen minder snel dan verkoopprijzen).",formula:"Ref Huur à Buurt Coëf. (Gedempt) à Staat (Nieuw) à EPC (A)"},vacance:{term:"Huurleegstand",definition:"Financiële veiligheidsbuffer die overeenkomt met periodes zonder huurder. Arcanes rekent standaard 5% jaarlijks verlies.",formula:"Forfait van 5% van de Bruto Jaarhuur (~1 maand leegstand per 20 maanden)"},loyerEffectif:{term:"Effectieve Huur",definition:"Wat er werkelijk op de bankrekening komt na aftrek van de leegstandsvoorziening.",formula:"Bruto Huur - Leegstand"}},kpi:{rendementBrut:{term:"Bruto Rendement",definition:"Oppervlakkige prestatie-indicator vaak getoond in advertenties. Houdt geen rekening met aankoopkosten, lasten of werken.",formula:"(Jaarhuur / Aankoopprijs) à 100"},rendementNet:{term:"Netto Rendement",definition:"De werkelijke rentabiliteit van de 'baksteen', voor lening. Houdt rekening met de totale projectkost en trekt niet-recupereerbare kosten af.",formula:"(Huur - Lasten - Leegstand) / Totale Investering"},cashflow:{term:"Maandelijkse Kasstroom",definition:"De netto cashflow: wat er op uw rekening overblijft aan het einde van de maand na betaling van krediet, lasten en belastingen. Indien positief, financiert het pand zichzelf.",formula:"(Netto Huur - Lening - Lasten - Belastingen) / 12"},tri:{term:"IRR (10 jaar)",definition:"Interne Rendementsvoet. Geannualiseerd rendement berekend op het geïnvesteerde eigen vermogen. Integreert huren, kosten, krediet en geschatte meerwaarde bij verkoop.",formula:"Kasstromen + Meerwaarde bij verkoop (op ARV)"},multiplicateur:{term:"Vermogensvermenigvuldiger",definition:"Verrijkingsfactor: hoeveel elke euro die u bij start investeerde uiteindelijk heeft opgebracht (gecumuleerde cash + verkoop).",formula:"(Gecumuleerde Cash + Verkoop Cash) / Eigen Inbreng"}},projection:{valeurFuture:{term:"Toekomstige Waarde (10j)",definition:"Schatting verkoopwaarde over 10 jaar. Opgelet: Arcanes projecteert deze waarde op basis van de ARV (de intrinsieke gerenoveerde waarde) en niet op uw kostprijs, wat financieel juister is.",formula:"Gebaseerd op ARV (Gerenoveerde Waarde) met 2-3% inflatie"},patrimoineNet:{term:"Netto Vermogen (Equity)",definition:"De netto rijkdom die u toekomt bij verkoop: dit is de verkoopprijs min de restschuld aan de bank en de verkoopkosten.",formula:"Toekomstige Waarde - Restschuld - Verkoopkosten"},plusValue:{term:"Bruto Meerwaarde",definition:"De kapitaalwinst gerealiseerd bij verkoop ten opzichte van uw totale initiële investering.",formula:"Verkoopwaarde - (Aankoopprijs + Werken)"},fraisRevente:{term:"Verkoopkosten",definition:"Geschatte kosten bij exit uit de investering (Makelaarscommissie + Kosten handlichting hypotheek).",formula:"4% van Toekomstige Waarde (3% Makelaar + 1% Notaris)"},produitNet:{term:"Netto Verkoopopbrengst",definition:"De finale 'Cash-out': de som effectief ontvangen op uw rekening na verkoop en aflossing van het kredietsaldo.",formula:"Toekomstige Waarde - Schuld - Kosten"}},peb:{score:{term:"EPC Score",definition:"Primair energieverbruik van de woning in kWh/m²/jaar."},travaux:{term:"EPC Werken",definition:"Schatting van de kost om de energiedoelstelling (Label A of B) te bereiken."},economie:{term:"Energiebesparing",definition:"Geschatte daling van de jaarfactuur, gecorrigeerd voor gedragseffect (terugslag).",formula:"(Verbruik Voor - Verbruik Na) à kWh Prijs"},primes:{term:"Geschatte Premies",definition:"Schatting van de regionale subsidies afgetrokken van de bruto kost van energetische werken."}},fiscalite:{droits:{term:"Registratierechten",definition:"Regionale aankoopbelasting. Het algoritme past automatisch het geldende tarief toe (Bxl, Wallonië, Vlaanderen) en de voorkeurregimes.",formula:"Bxl 12.5% | Wal 12.5% | Vl 3% (indien enige) of 12%"},fraisNotaire:{term:"Notariskosten",definition:"Notariële erelonen (wettelijk vastgelegd) + Administratieve opzoekingskosten.",formula:"Degressief barema + ~1000⬠Admin + BTW"},precompte:{term:"Onroerende Voorheffing",definition:"Jaarlijkse grondbelasting betaald aan het gewest en de gemeente.",formula:"Geïndexeerd KI à Regionaal Tarief à Gemeentelijke Opcentiemen"},baseImposable:{term:"Belastbare Basis (PB)",definition:"Fictief inkomen toegevoegd aan uw beroepsinkomsten voor belastingberekening (Investering natuurlijk persoon).",formula:"Geïndexeerd Kadastraal Inkomen (KI) à 1.40"},habUnique:{term:"Enige Eigen Woning",definition:"Fiscaal statuut dat toelaat verlaagde tarieven (bv. 3% in Vlaanderen) of abattementen (Brussel/Wallonië) te verkrijgen als het uw enige pand is."}},scoreHabitation:{global:{term:"Synthetische Index",definition:"Synthesescore /100 berekend door Arcanes. Weegt 3 criteria: prijs (60%), EPC-kwaliteit (25%), bereikbaarheid (15%).",formula:"60% Prijs + 25% Kwaliteit (EPC) + 15% Toegankelijkheid"},verdict:{term:"Prijspositionering",definition:"Feitelijke vaststelling van de prijspositionering ten opzichte van de marktschatting.",example:"'Onder de schatting', 'Binnen de marge', 'Boven de schatting'"}}}},P4={howItWorks:{title:"Hoe werkt het",step1:{title:"1. Deel de advertentie",description:"Plak eenvoudig de link van uw vastgoedadvertentie. Ons Arcanes-algoritme analyseert onmiddellijk alle gegevens."},step2:{title:"2. Volledige algoritmische analyse",description:"Onze technologie analyseert marktprijzen, energieprestaties en investeringspotentieel."},step3:{title:"3. Gedetailleerd rapport",description:"Ontvang een volledig rapport met indicatoren, projecties en aandachtspunten."}},whyChoose:{title:"Waarom kiezen voor Arcanes?",precision:{title:"Maximale precisie",description:"Onze algoritmes analyseren duizenden gegevens om u de meest nauwkeurige marktinformatie te geven."},freeAnalysis:{title:"Gratis analyse",description:"Begin met een gratis analyse om de kracht van ons platform te ontdekken zonder verplichting."},security:{title:"Gegarandeerde beveiliging",description:"Uw gegevens zijn beschermd met de hoogste beveiligings- en privacystandaarden."}},whoIsItFor:{title:"Voor wie is Arcanes?",subtitle:"Een tool voor drie vastgoedprofielen.",primaryResidence:{title:"Hoofdverblijfplaats",feature1:"Analyse werkelijke waarde",feature2:"Vergelijking prijs/m² vs markt",feature3:"Duidelijkheid over werken en toekomstige kosten",feature4:"Objectivering van de aankoop",conclusion:"Een emotionele beslissing beveiligen."},rentalInvestment:{title:"Verhuurinvestering",feature1:"Bruto & netto rendement",feature2:"Geprojecteerde cashflow",feature3:"Belgische parameters: EPC, KI, fiscaliteit",feature4:"Analyse langetermijnpotentieel",conclusion:"Schat in of de operatie zichzelf financiert."},apartmentBuilding:{title:"Opbrengsteigendom",feature1:"Analyse per eenheid + totale inkomsten",feature2:"Prijs/deur + geschatte leegstand",feature3:"Detectie van inconsistenties",feature4:"Geconsolideerde weergave voor bank",conclusion:"Beslis snel of het pand een bezoek w
953aard is."}},plans:{title:"Gratis analyse of geavanceerde analyse. De keuze is aan u.",subtitle:"Begin gratis, schakel alleen over naar premium als het project vordert.",free:{badge:"Ontdekking",title:"Gratis, onbeperkt",includes:"Inbegrepen",notIncludes:"Niet inbegrepen",feature1:"Totale score van het pand",feature2:"Algemene staat",feature3:"Prijs/m² vs markt",feature4:"Energie-index",feature5:"Synthetisch overzicht",missing1:"Cashflow / rendement",missing2:"Detail werken",missing3:"Langetermijnprojectie",missing4:"PDF-export"},premium:{badge:"Volledig / Beslissing",title:"Om te beslissen en te onderhandelen",includes:"Inbegrepen",feature1:"Analyse woning of investering",feature2:"Rendement, cashflow, vereenvoudigd IRR",feature3:"Financiële scenario's & risico's",feature4:"Schatting werken + tijdlijn",feature5:"Gepersonaliseerde simulaties",feature6:"Professionele PDF-export",feature7:"Optie projectie 10 jaar",cta:"1 gratis premium analyse bij inschrijving"}},testimonials:{title:"Wat onze gebruikers zeggen",subtitle:"Ontdek de ervaringen van onze gebruikers",testimonial1:{quote:"Arcanes heeft me geholpen het verborgen potentieel van verschillende panden te identificeren. De analyses zijn opmerkelijk nauwkeurig en hebben me aanzienlijk tijd bespaard.",name:"S. D.",role:"Vastgoedinvesteerder"},testimonial2:{quote:"Als makelaar gebruik ik Arcanes dagelijks om mijn klanten te adviseren. De tool is onmisbaar geworden in mijn activiteit.",name:"M. L.",role:"Makelaar"}},cta:{title:"Klaar om uw volgende vastgoed te analyseren?",subtitle:"Begin nu met een gratis analyse en ontdek het potentieel van uw investering.",button:"Start gratis analyse"}},C4={title:"Gratis Analyse",subtitle:"Plak de URL van een vastgoedadvertentie voor een gedetailleerde analyse",urlPlaceholder:"https://www.immoweb.be/nl/zoekertje/...",uploadDocument:"Of upload een document",startAnalysis:"Start analyse",analyzing:"Analyse bezig...",results:"Analyseresultaten",download:"Download PDF",errors:{invalidUrl:"Ongeldige URL",analysisError:"Fout tijdens analyse",noCredits:"Onvoldoende credits"}},S4={title:"Vastgoedsimulators",share:{title:"Delen",copyLink:"Link kopiëren",linkCopied:"Link gekopieerd!"},subtitle:"Nauwkeurige berekeningstools om elk aspect van uw vastgoedproject in België te anticiperen. Gratis, onmiddellijk en zonder verplichting.",notaryFees:{title:"Kosten Aankoopakte",description:"Schat uw notariskosten en registratierechten nauwkeurig in volgens uw regio.",badge:"Essentieel",pageTitle:"Notariskosten Berekenen",pageSubtitle:"Schat uw notariskosten nauwkeurig in voor de aankoop van uw vastgoed in België",propertyInfo:"Informatie over het pand",fillInfo:"Vul de onderstaande informatie in voor een gedetailleerde schatting",region:"Regio",selectRegion:"Selecteer een regio",wallonia:"Wallonië",brussels:"Brussel-Hoofdstad",flanders:"Vlaanderen",walloniaInfo:"Standaardtarief: 12,5% | Verlaagd tarief (1e aankoop): 3%",brusselsInfo:"Standaardtarief: 12,5% | Mogelijke vermindering tot ⬠200.000",flandersInfo:"Standaardtarief: 10% | Verlaagd tarief (1e aankoop): 3%",propertyType:"Type vastgoed",house:"Huis",apartment:"Appartement",land:"Grond",price:"Aankoopprijs (â¬)",pricePlaceholder:"bijv.: 250000",priceRange:"Bedrag tussen ⬠50.000 en ⬠2.000.000",options:"Opties",firstPurchase:"Eerste aankoop (eigen en unieke woning)",firstPurchaseTooltip:"U komt in aanmerking voor een verlaagd tarief als u nog geen eigenaar bent van een ander pand en van plan bent dit te bewonen.",newProperty:"Nieuwbouw (btw van toepassing in plaats van registratierechten)",mortgage:"Financiering via hypothecaire lening",calculate:"Kosten berekenen",reset:"Resetten",faqTitle:"Veelgestelde vragen",faq1Question:"Wat is het verschil tussen registratierechten en btw?",faq1Answer:"Registratierechten zijn van toepassing op bestaande panden: 12,5% in Wallonië en Brussel (verlaagd tarief van 3% in Wallonië voor de eigen en enige woning), 12% in Vlaanderen (verlaagd tarief van 2%). De btw van 21% is van toepassing op nieuwbouw verkocht door een btw-plichtige (projectontwikkelaar, aannemer). Let op: bij nieuwbouw geldt de btw enkel op de constructie en de registratierechten op de grond.",faq2Question:"Hoe kom ik in aanmerking voor het verlaagd tarief?",faq2Answer:"U mag niet de volle eigendom bezitten van een ander onroerend goed bestemd voor bewoning (in België of in het buitenland) en u moet zic
953h ertoe verbinden uw hoofdverblijfplaats in het pand te vestigen binnen 3 jaar na de authentieke akte. Als u al eigenaar bent, kunt u toch van het verlaagd tarief genieten op voorwaarde dat u uw bestaand pand verkoopt binnen 2 tot 3 jaar, afhankelijk van het gewest.",faq3Question:"Zijn deze kosten onderhandelbaar?",faq3Answer:"Registratierechten en btw zijn bij wet vastgesteld en niet onderhandelbaar. Notarishonoraria volgen een wettelijk barema (KB van 16 december 1950) dat identiek is bij alle Belgische notarissen. Alleen de administratiekosten kunnen enigszins variëren van kantoor tot kantoor (doorgaans tussen 800⬠en 1.200â¬).",resultTitle:"Resultaat van de schatting",purchasePrice:"Aankoopprijs",registrationRights:"Registratierechten",vat:"BTW (21%)",notaryFees:"Notarishonoraria (incl. btw)",adminFees:"Administratiekosten",totalEstimated:"Totale schatting",feesPercentage:"Kosten: {amount} ({percentage}% van de prijs)",costsBreakdown:"Verdeling van de kosten",globalView:"Algemeen overzicht",feesDetail:"Detail van de kosten",disclaimer:"Deze schatting wordt verstrekt ter indicatie. Voor een definitieve berekening, raadpleeg uw notaris die rekening houdt met uw specifieke situatie.",exportPDF:"Exporteren naar PDF",learnMore:"Meer informatie over aankoopkosten â",completeForm:"Vul het formulier in om uw schatting te krijgen",ctaTitle:"Alles begrijpen over aankoopkosten in België",ctaDescription:"Registratierechten, notarishonoraria, hypotheekkosten: ontdek het volledige detail en de te vermijden fouten om uw aankoopbudget te anticiperen.",ctaButton:"Lees de volledige gids",footerCopyright:"Arcanes. Simulator alleen ter informatie.",pdfPreviewTitle:"Voorvertoning van de schatting van aankoopkosten",generatingPDF:"PDF genereren...",pleaseWait:"Even geduld...",pdfGenerated:"PDF gegenereerd",fileDownloaded:"Het bestand is succesvol gedownload",pdfError:"Kan PDF niet genereren"},mortgage:{title:"Hypothecaire Lening",description:"Bereken uw maandelijkse betalingen en bekijk uw aflossingsplan.",badge:"Financiering",pageTitle:"Hypothecaire Lening Simulator",pageSubtitle:"Bereken uw maandelijkse betalingen en de totale kosten van uw hypotheek",loanParameters:"Leningparameters",fillParameters:"Vul de informatie in om uw simulatie te krijgen",amount:"Geleend bedrag (â¬)",amountPlaceholder:"bijv.: 200000",interestRate:"Jaarlijks rentepercentage (%)",interestRatePlaceholder:"bijv.: 3.5",duration:"Looptijd van de lening (jaren)",durationPlaceholder:"bijv.: 20",durationRange:"Tussen 1 en 30 jaar",calculate:"Berekenen",reset:"Reset",fillForm:"Vul de parameters in om uw simulatie te krijgen",simulationSummary:"Samenvatting van uw simulatie",summaryDescription:"Voor een lening van {amount} over {duration} jaar tegen {rate}%",monthlyPayment:"Maandelijkse betaling",interestCost:"Rentekosten",totalToRepay:"Totaal terug te betalen",over:"over",payments:"betalingen",amortizationChart:"Aflossingsdiagram",annualEvolution:"Jaarlijkse evolutie van de terugbetaling",amortizationTable:"Aflossingstabel",monthlyDetail:"maandelijks",annualDetail:"jaarlijks",detailOf:"{mode} detail van de terugbetaling",annual:"Jaarlijks",monthly:"Maandelijks",month:"Maand",year:"Jaar",capitalBefore:"Kapitaal voor",interest:"Rente",capitalRepaid:"Kapitaal terugbetaald",capitalAfter:"Kapitaal na",disclaimer:"Deze simulator biedt een indicatieve schatting op basis van een vast tarief. Raadpleeg uw bankier voor een persoonlijk aanbod.",exportPDF:"Exporteren naar PDF",fullDisclaimer:"Deze simulator biedt een indicatieve schatting op basis van een vast tarief. De werkelijke voorwaarden kunnen variëren afhankelijk van uw profiel en de bank. Raadpleeg een adviseur voor een persoonlijk aanbod.",footerCopyright:"Arcanes. Simulator alleen ter informatie.",pdfPreviewTitle:"Voorvertoning van uw simulatie",generatingPDF:"PDF genereren...",pdfGenerated:"PDF succesvol gegenereerd!",pdfError:"Fout bij het genereren van PDF",capitalReimbursed:"Kapitaal terugbetaald",interestPaid:"Betaalde rente",remainingCapital:"Resterend kapitaal"},borrowingCapacity:{title:"Leencapaciteit",description:"Ontdek het maximale bedrag dat u kunt lenen volgens uw financieel profiel.",pageTitle:"Simulator Leencapaciteit",pageSubtitle:"Ontdek uw leencapaciteit volgens uw project: hoofdverblijfplaats of huurinvestering",financialInfo:"Uw financiële informatie",fillInfo:"Vul uw financiële gegevens in",projectType:"Type project",projectTypeRequired:"Type project *",selectProject:"Selecteer uw project",mainResidence:"Hoofdverblijfplaats",rentalInvestment:"Huurinvestering",mainResidenceInfo:"Max schuldgraad: 35%",rentalInvestmentInfo:"Max schuldgraad: 40% (huurinkomsten voor 70% in aanmerking genomen)",monthlyIncomeLabel:"Netto maandelijks inkomen (â¬) *",monthlyIncomePlaceholder:"bijv.: 3500",monthlyIncomeTooltip:"Netto maandelijks inkomen vóór belastingen, inclusief 13de maand en dubbel vakantiegeld pro rata.",currentDebtsLabel:"Huidige maandelijkse schulden (â¬)",currentDebtsPlaceholder:"bijv.: 450",currentDebtsTooltip:"Al uw bestaande maandelijkse betalingen: autolening, consumentenkrediet, enz.",expectedRentalIncomeLabel:"Verwachte huurinkomsten (â¬/maand)",expectedRentalIncomePlaceholder:"bijv.: 800",expectedRentalIncomeTooltip:"Verwachte maandelijkse huur. Banken houden 70% van dit bedrag in rekening.",rentalIncomeInfo:"Voor 70% in aanmerking genomen in de bankberekening",personalContributionLabel:"Persoonlijke inbreng (â¬)",personalContributionPlaceholder:"bijv.: 50000",personalContributionTooltip:"Bedrag dat u kunt inbrengen om het project te financieren.",calculateCapacity:"Bereken mijn capaciteit",calculating:"Berekening bezig...",yourProfile:"Uw Profiel",maxMonthlyPayment:"Maximale maandelijkse betaling",debtRatio:"Schuldgraad",yourSce
953narios:"Uw 3 Leenscenario's",scenariosComparison:"Vergelijking van leenbedragen volgens looptijd (vast tarief 3,5%)",recommended:"Aanbevolen",borrowableAmount:"Leenbaar bedrag",totalBudget:"Totaal budget",monthlyPayment:"Maandelijks",perMonth:"/maand",personalizedAdvice:"Persoonlijk Advies",completeForm:"Vul het formulier in om uw schatting te krijgen",disclaimer:"Deze schatting wordt verstrekt ter indicatie. Voor een definitieve analyse, raadpleeg uw bankier die rekening houdt met uw specifieke situatie.",exportPDF:"Exporteren naar PDF",pdfPreviewTitle:"Preview van uw leencapaciteit",fullDisclaimer:"Deze simulator biedt een indicatieve schatting van uw leencapaciteit. De resultaten vervangen geen analyse door een bankexpert en vormen geen leningaanbod.",fullDisclaimerFooter:"Elk profiel is uniek. Uw bank blijft de beste bron om uw capaciteiten te bevestigen.",footerCopyright:"Arcanes. Simulator uitsluitend ter informatie.",errorInvalidIncome:"Voer een geldig maandelijks inkomen in",errorHighDebtTitle:"Hoge schuldgraad",errorHighDebtMessage:"Uw schulden overschrijden {rate}% van uw inkomsten. Er bestaan oplossingen, elk profiel heeft zijn potentieel.",pdfGenerated:"PDF gegenereerd",pdfSuccess:"Het bestand is succesvol gedownload",pdfError:"Kan PDF niet genereren"},peb:{title:"EPC & Energiekosten",description:"Schat de energieprestaties en toekomstige lasten van uw vastgoed in.",badge:"Woning",pageTitle:"Simulator EPC & Energiekosten",pageSubtitle:"Schat de energie-impact van uw pand en simuleer verbeteringen",propertyInfo:"Informatie over het pand",fillInfo:"Voer de kenmerken in om uw simulatie te krijgen",surface:"Bewoonbare oppervlakte (m²) *",surfacePlaceholder:"bijv.: 85",pebClass:"EPC-klasse *",pebClassPlaceholder:"bijv.: D of 320",pebClassHelp:"Letter (A+ tot G) of score in kWh/m²/jaar",region:"Regio *",brussels:"Brussel-Hoofdstad",flanders:"Vlaanderen",wallonia:"Wallonië",propertyType:"Type vastgoed *",apartment:"Appartement",house:"Huis",electricityPrice:"Prijs van elektriciteit (â¬/kWh)",electricityPricePlaceholder:"bijv.: 0.25",calculate:"Berekenen",completeForm:"Vul het formulier in om uw simulatie te krijgen",energyPerformance:"Energieprestatie",initialScore:"Initiële score",simulatedScore:"Gesimuleerde score",annualConsumption:"Jaarlijks verbruik",annualCost:"Jaarlijkse kosten",interactiveSimulation:"Interactieve simulatie",slideToSimulate:"Schuif de cursor op de thermometer om een wijziging te simuleren",heating:"Verwarming",hotWater:"Warm water",ventilation:"Ventilatie",lighting:"Verlichting",other:"Andere",impactOfVariation:"Impact van de variatie",noChange:"Geen verandering",slideInstruction:"Schuif om te simuleren",scoreLabel:"Score: {score} kWh/m²/jaar",disclaimer:"Indicatieve schatting. Het werkelijke verbruik varieert volgens isolatie, gewoonten en apparatuur.",exportPDF:"Exporteren naar PDF",fullDisclaimer:"Deze simulatie is een indicatieve schatting op basis van gemiddelden. Het werkelijke verbruik hangt af van vele factoren: isolatie, gewoonten, apparatuur, weersomstandigheden, enz.",footerCopyright:"Arcanes. Simulator alleen ter informatie.",pdfPreviewTitle:"Voorvertoning van de EPC-simulatie",errorInvalidSurface:"Voer een geldige oppervlakte in",errorInvalidPEB:"Ongeldige EPC-klasse",generatingPDF:"PDF genereren...",pdfGenerated:"PDF gegenereerd",pdfSuccess:"Het bestand is succesvol gedownload",pdfError:"Kan PDF niet genereren"},tri:{title:"IRR & Winstgevendheid",description:"Analyseer de totale winstgevendheid van uw vastgoedinvestering over meerdere jaren.",badge:"Geavanceerde analyse",pageTitle:"IRR & Patrimoniale Winstgevendheid Simulator",pageSubtitle:"Geavanceerde analyse met meerjarige projectie",marketSettings:"Belgische marktparameters ð§ðª",projectData:"Projectgegevens",acquisition:"Aankoop",region:"Regio",wallonia:"Wallonië",brussels:"Brussel",flanders:"Vlaanderen",purchasePrice:"Aankoopprijs",acquisitionFees:"Aankoopkosten",autoCalculated:"Auto berekend",renovations:"Werken",financing:"Financiering",personalContribution:"Eigen Inbreng",autoLabel:"Auto (20% + Kosten)",rate:"Tarief (%)",duration:"Looptijd (jaar)",operation:"Exploitatie",rentCC:"Huur incl. kosten",chargesAndTax:"Lasten & Onr. voorh.",annualRentIndexation:"Jaarlijkse huurindexatie (%)",indexationHelp:"Heeft een positieve impact op toekomstige cashflow.",holdingDuration:"Aanhoudduur",optimize:"Optimaliseren",annualAppreciation:"Jaarlijkse waardestijging",projectTRI:"Project IRR",annualReturn:"Jaarlijks rendement",netCashflow:"Netto Cashflow",avgYear1:"Gemiddelde Jaar 1 / maand",exitGain:"Exit winst",netInPocket:"Netto op zak (Totaal)",totalBudget:"Totaal Budget",notarialAct:"Notarieel in de hand",performanceOver:"Prestaties over {duration} jaar",performanceText:"Dit project biedt een IRR van <strong>{tri}%</strong>. De cashflow zal geleidelijk toenemen dankzij de indexatie ({indexation}%/jaar) tegenover een vaste terugbetaling.",rentPlus10:"Huur +10%",worksLess10:"Werken -10%",resaleLess5:"Doorverkoop -5%",cashflowAndWealth:"Cashflow & Vermogensopbouw",annualCashflow:"Jaarlijkse Cashflow",cumulatedWealth:"Gecumuleerde Vermogensopbouw",amortizationTable:"Aflossingstabel",year:"Jaar",cashflow:"Cashflow",remainingCapital:"Resterend Kapitaal",propertyValue:"Waarde Pand",cumulatedNet:"Gecumuleerd Netto",downloadPDFReport:"Download PDF Rapport",pdfPreviewTitle:"Voorvertoning",optimizedDuration:"Geoptimaliseerde Duur",optimizedMessage:"De ideale duur om uw IRR te maximaliseren is {years} jaar.",pdfGenerated:"PDF Gegenereerd",pdfSuccess:"Uw rapport is klaar.",pdfError:"Probleem bij het genereren van PDF.",fillFormDescription:'Vul de projectinformatie links in en klik op "Berekenen" om uw volledige IRR-analyse te zien.',triStatus:{low:"Laag",standard:"Standaard",good:"Goed",excellent:"Uitstekend"}},rentalYield:{title:"Huurrendement",description:"Analyseer de winstgevendheid van uw huurinvestering in onroerend goed.",badge:"Investering",pageTitle:"Huurrendement Simulator",pageSubtitle:"Analyseer de winstgevendheid en cashflow van uw vastgoedinvestering",investmentData:"Investeringsgegevens",fillInfo:"Vul de parameters in om uw analyse te krijgen",purchasePrice:"Aankoopprijs (â¬)",purchasePricePlaceholder:"bijv.: 350000",monthlyRent:"Maandelijkse huur (â¬)",monthlyRentPlaceholder:"bijv.: 1500",monthlyCharges:"Maandelijkse lasten (â¬/maand)",monthlyChargesPlaceholder:"bijv.: 350",monthlyChargesHelp:"Onroerende voorheffing, verzekeringen, onderhoud, gemeenschappelijke kosten",loanRepayment:"Kredietaflossing (â¬/maand)",loanRepaymentPlaceholder:"bijv.: 1200",loanRepaymentHelp:"Maandelijkse betaling van uw hypotheek. Zet 0 als u contant koopt.",personalContribution:"Eigen inbreng (â¬)",personalContributionPlaceholder:"bijv.: 70000",personalContributionHelp:"Geïnvesteerd eigen vermogen (inbreng + kosten + werken)",acquisitionCosts:"Aankoopkosten (â¬)",acquisitionCostsPlaceholder:"bijv.: 52500",acquisitionCostsHelp:"Standaard â 15% van de aankoopprijs",renovationBudget:"Renovatiebudget (â¬)",renovationBudgetPlaceholder:"bijv.: 0",calculate:"Berekenen",fillForm:"Vul het formulier in om uw analyse te krijgen",yieldIndicators:"Rendementsindicatoren",grossYield:"Brutorendement",netNetYield:"Netto-nettorendement",equityYield:"Rend. eigen verm.",detailedFinancialAnalysis:"Gedetailleerde financiële analyse",monthlyRentBreakdown:"Verdeling van de maandelijkse huur",charges:"Lasten",loan:"Krediet",cashflow:"Cashflow",toFinance:"Te financieren",netAnnualCashflow:"Netto
953jaarlijkse cashflow",annualSavingsEffort:"Jaarlijkse spaarinspanning",netMonthlyCashflow:"Netto maandelijkse cashflow",monthlyEffort:"Maandelijkse inspanning",investmentSummary:"Investeringssamenvatting",totalInvestment:"Totale investering",borrowedAmount:"Geleend bedrag",annualRent:"Jaarlijkse huur",yieldLevel:{negativeCashflow:"Negatieve cashflow",excellent:"Uitstekend",aboveAverage:"Boven het gemiddelde",average:"Gemiddeld",low:"Laag"},interpretation:{negativeCashflow:"U moet {amount}â¬/maand inbrengen om de kosten en het krediet te dekken. Defensieve of speculatieve strategie, te valideren volgens uw spaarcapaciteit en het potentieel voor meerwaarde.",excellent:"Berekend rendement hoger dan het waargenomen gemiddelde op de Belgische markt (~3,2%). Te analyseren rekening houdend met het verhuurrisico en de staat van het pand.",aboveAverage:"Berekend rendement boven het waargenomen gemiddelde (~3,2%). Te kruisen met de analyse van de buurt en de staat van het pand.",average:"Berekend rendement dicht bij het waargenomen gemiddelde. Het verbeteringspotentieel (werken, herwaardering, locatie) kan dit resultaat beïnvloeden.",low:"Berekend rendement lager dan het gemiddelde. Meerdere factoren kunnen dit resultaat verklaren: aankoopprijs, kosten, geraamde werken, risico op huurleegstand."},disclaimer:"Indicatieve schatting die geen volledige analyse vervangt inclusief belastingen en leegstand.",exportPDF:"Exporteren naar PDF",fullDisclaimer:"Deze schatting wordt alleen ter informatie verstrekt en vervangt geen volledige analyse inclusief belastingen, financiering, onroerende voorheffing en leegstand.",footerCopyright:"Arcanes. Simulator alleen ter informatie.",pdfPreviewTitle:"Voorvertoning van de rendementsberekening",pdfGenerated:"PDF gegenereerd",pdfSuccess:"Het bestand is succesvol gedownload",pdfError:"Kan PDF niet genereren"},pricePerSqm:{title:"Prijs per m²",description:"Vergelijk prijzen per m² per regio",pageTitle:"Berekening Prijs per m² Markt",pageSubtitle:"Analyseer de vastgoedmarktprijzen per vierkante meter",address:"Adres of plaats",addressPlaceholder:"bijv.: Louizalaan, 1050 Brussel",surface:"Oppervlakte van het pand (m²)",surfacePlaceholder:"bijv.: 85 (bewoonbare oppervlakte in m²)",propertyType:"Type vastgoed",propertyTypePlaceholder:"bijv.: Appartement 2 slaapkamers",analyze:"Markt analyseren",resultsPlaceholder:"De resultaten verschijnen hier na analyse"},info:{title:"Waarom onze simulatoren gebruiken?",subtitle:"Berekeningen gebaseerd op de huidige Belgische regelgeving",precision:{title:"Precisie",description:"Berekeningen gebaseerd op officiële Belgische tarieven: registratierechten, onroerende voorheffing, btw."},instant:{title:"Onmiddellijk",description:"Onmiddellijke resultaten met interactieve grafieken en mogelijkheid tot PDF-export."},complete:{title:"Volledig",description:"Alle scenario's vergeleken: looptijden, regio's, projecttypes, netto rendementen."}},deeperAnalysis:{title:"Heeft u een diepgaandere analyse nodig?",description:"Onze simulatoren geven een eerste schatting. Voor een volledige analyse van uw project met gedetailleerd rapport, ontdek onze premium analysedienst.",button1:"Ontdek de volledige analyse",button2:"Lees onze gidsen"},footer:{copyright:"Arcanes. Simulatoren alleen ter informatie.",blog:"Blog",contact:"Contact",legal:"Juridische informatie"},launch:"Start simulator"},_4={title:"Onze Prijzen",subtitle:"Laad uw account op met Credits om volledige premium analyses uit te voeren",recommended:"AANBEVOLEN",legal:{title:"Herroeping & AV",desc:"Conform de wet heeft u 14 dagen herroepingsrecht voor ongebruikte credits.",link:"Zie herroepingsvoorwaarden (Art. 8)"},plans:{discovery:"Discovery Pack",essential:"Essential Pack",smart:"Smart Pack",investor:"Investor Pack",pro:"Pro+ Pack"},features:{analyses:"volledige analyses",detailed:"Gedetailleerd PDF-rapport inbegrepen",noExpiration:"2 jaar geldig",becomesPremium:"Word Premium Lid"},about:{title:"Over Credits",feature1:"Volledige analyses gegarandeerd",feature1Desc:"Elk credit ontgrendelt een volledige premium analyse inclusief winstgevendheid, werken en cashflow.",feature2:"Uw credits zijn 24 maanden geldig",feature2Desc:"Koop nu, gebruik ze binnen 6 maanden of 2 jaar. U wordt gewaarschuwd vóór het vervallen.",feature3:"Hoe meer u koopt, hoe minder u betaalt",feature3Desc:"De kosten per analyse dalen met de grootte van het pakket. Ideaal voor actieve investeerders."},premiumMember:{title:"Premium Lid",feature1:"Toegang tot exclusieve functies",feature1Desc:"Ontgrendel de TRI-simulator, marktvoorspellingen op de kaart en n
953og veel meer.",feature2:"Automatisch verkregen status",feature2Desc:"Bij aankoop van een pakket van 10 credits of meer wordt u automatisch Premium Lid."},common:{credits:"Credit",credits_plural:"Credits",per_credit:"⬠/ credit",save:"Bespaar",buy:"Kopen",terms:"Algemene Gebruiksvoorwaarden"},toast:{loginRequired:"Inloggen vereist",loginRequiredDesc:"Log in om Credits te kopen",cancelled:"Aankoop geannuleerd",cancelledDesc:"De aankoop van Credits is geannuleerd.",confirmed:"Aankoop bevestigd!",error:"Fout",paymentError:"Er is een fout opgetreden bij het verifiëren van de betaling",preparationError:"Er is een fout opgetreden bij het voorbereiden van de betaling"}},T4={title:"Veelgestelde Vragen",subtitle:"Alles wat u moet weten over de werking van Arcanes, de analyses en de credits.",search:"Zoek een vraag...",noResults:"Geen resultaten gevonden voor uw zoekopdracht.",categories:{general:"Algemeen",analysis:"Analyses",methodology:"Methodologie",account:"Account & Technisch"},questions:{general:{q1:"Wat is Arcanes precies?",a1:"Arcanes is een geautomatiseerd vastgoedanalyseplatform gebaseerd op data en artificiële intelligentie. Het stelt u in staat om snel elke vastgoedadvertentie in België te evalueren en te bepalen of deze echt interessant is, voor aankoop, investering of opbrengsteigendom.",q2:"Kan ik echt een gratis analyse maken?",a2:"Ja. Bij registratie ontvangt u automatisch 1 gratis premium analyse. Daarna kunt u doorgaan met het genereren van gratis analyses (beperkte versie) of credits kopen om volledige premium analyses te ontgrendelen, inclusief cashflow, rentabiliteit, werken en PDF.",q3:"Voor welke soorten panden werkt Arcanes?",a3:"Arcanes kan de meeste panden in België analyseren: huizen, appartementen, studio's, duplexen, opbrengsteigendommen, oud of nieuw. Sommige specifieke panden (prestige, atypisch, kastelen) kunnen minder nauwkeurig zijn, maar een coherente basisanalyse blijft mogelijk."},analysis:{q1:"Wat is het verschil tussen gratis en premium analyse?",a1:"De gratis analyse toont de hoofdinfo: globale score, prijs/m², geschatte staat, EPC en oordeel. De premium analyse voegt toe: schatting van werken, energiekosten, risico's, financiële scenario's, huurrendement, cashflow en een PDF-rapport.",q2:"Hoe lang duurt een vastgoedanalyse?",a2:"Het genereren duurt doorgaans tussen 30 seconden en 2 minuten. Als cruciale informatie ontbreekt in de advertentie, stelt Arcanes standaardhypothesen voor en geeft dit duidelijk aan.",q3:"Kan ik dezelfde advertentie meerdere keren analyseren?",a3:"Ja. Elke nieuwe analyse verbruikt 1 credit (of 3 voor een opbrengsteigendom). Zodra een premium analyse is gegenereerd, blijft deze toegankelijk in uw geschiedenis zonder extra kosten.",q4:"Analyseert Arcanes ook opbrengsteigendommen?",a4:"Ja. Arcanes detecteert meerdere eenheden, berekent de prijs/deur, de globale rentabiliteit, het theoretisch rendement en de potentiële leegstand. Omdat dit meer berekeningen vereist, kost dit 3 credits."},methodology:{q1:"Op welke hypothesen zijn de berekeningen gebaseerd?",a1:"Arcanes combineert openbare gegevens, marktreferenties, financiële ratio's en nationale statistieken. De modellen evolueren voortdurend om de realiteit van de markt, fiscaliteit en rentetarieven weer te geven.",q2:"Hoe worden de aankoopkosten berekend?",a2:"De berekeningen omvatten registratierechten, notariskosten en administratieve kosten volgens de Belgische standaardtarieven. Verlaagde tarieven (zoals voor enige eigen woning) worden niet standaard toegepast maar kunnen geactiveerd worden.",q3:"Hoe schat Arcanes het huurrendement?",a3:"De rentabiliteit hangt af van de potentiële huur, locatie, staat, lasten en energieverbruik. De toegepaste scenario's zijn voorzichtig om een realistisch beeld te geven in plaats van een optimistisch beeld.",q4:"Hoe worden de potentiële huurprijzen geschat?",a4:"Huurprijzen worden geschat via Statbel-gegevens, lokale referenties, postcode, oppervlakte en staat. Er wordt een lokale correctie toegepast om de werkelijk waargenomen markthuur te benaderen.",q5:"Zijn de schattingen definitief?",a5:"Nee. Het zijn schattingen op basis van data, maar ze vervangen geen technisch expert. Ze dienen voornamelijk om te filteren, te vergelijken en geïnformeerde beslissingen te nemen."},account:{q1:"Heb ik een account nodig om Arcanes te gebruiken?",a1:"Ja. Een account stelt u in staat om uw analyses op te slaan, uw gratis premium analyse te claimen en uw geschiedenis te volgen.",q2:"Kan ik mijn analyses downloaden?",a2:"De premium analyses zijn downloadbaar als PDF en geschikt om te delen met een notaris, een bank of een partner.",q3:"Werkt Arcanes op mobiel?",a3:"Ja. Het platform is volledig responsive en bruikbaar op smartphone â zelfs tijdens een bezoek aan een pand.",q4:"Wat te doen bij een technisch probleem?",a4:"Neem contact op via support. In geval van een bewezen fout kan een credit worden teruggestort.",q5:"Hoe word ik Premium lid?",a5:"U wordt automatisch Premium lid door een Smart (10 credits), Investeerder (25 credits) of Pro+ (50 credits) pakket te kopen. De Premium-status geeft u toegang tot de TRI & Rendement simulator en marktvoorspellingen op de interactieve kaart."}},help:{title:"Hulp nodig?",description:"Ons team staat klaar om uw vragen te beantwoorden",contact:"Neem contact op",home:"Terug naar home"}},D4={borrowingCapacity:{title:"Simulatie Leencapaciteit",date:"Datum",maxBudget:"Maximaal totaalbudget",monthlyPayment:"Maandelijkse afbetaling",debtRatio:"Schuldgraad",yourProject:"Uw project",projectType:"Type project",monthlyIncome:"Maandelijks inkomen",personalContribution:"Eigen inbreng",monthlyDebts:"Maandelijkse schulden",detailedScenarios:"Gedetailleerde scenario's",years:"jaar",recommended:"Aanbevolen",borrowableAmount:"Leenbedrag",totalBudget:"Totaalbudget",monthlyPaymentShort:"Maandelijks",summary:"Samenvatting",personalizedAdvice:"Persoonlijk advies",legalWarning:"Wettelijke waarschuwing",legalWarningText:"Deze schatting wordt uitsluitend ter informatie verstrekt. De resultaten vervangen geen analyse door een bankexpert. Raadpleeg uw bank voor een persoonlijke analyse en een leningaanbod aangepast aan uw situatie.",mainResidence:"Hoofdverblijfplaats",rentalInvestment:"Huurinvestering"},mortgage:{title:"Simulatie Hypothecaire Lening",date:"Datum",amountBorrowed:"Geleend bedrag",monthlyPayment:"Maandelijkse betaling",duration:"Looptijd",years:"jaar",rate:"Tarief",totalInterest:"Totale rente",annualAmortizationTable:"Jaarlijkse aflossingstabel",year:"Jaar",capitalBefore:"Kapitaal voor",interest:"Rente",capitalRepaid:"Kapitaal terugbet.",remainingCapital:"Resterend kapitaal",legalWarning:"Juridische waarschuwing",warningText:"Dit document is een indicatieve schatting op basis van een vast tarief. De werkelijke voorwaarden kunnen variëren afhankelijk van uw profiel en de bank. Raadpleeg een adviseur voor een persoonlijk aanbod."},rentalYield:{title:"Huurrendement",date:"Datum",netNetYield:"Netto-nettorendement",grossYield:"Brutorendement",equityYield:"Rendement op eigen vermogen",investmentData:"Investeringsgegevens",purchasePrice:"Aankoopprijs",personalContribution:"Eigen inbreng",borrowedAmount:"Geleend bedrag",monthlyRent:"Maandelijkse huur",yieldEvaluation:"Rendementsevaluatie",low:"Laag",medium:"Gemiddeld",excellent:"Uitstekend",monthlyRentBreakdown:"Verdeling van de maandelijkse huur",charges:"Lasten",loan:"Krediet",cashflow:"Cashflow",toFinance:"Te financieren",positiveCashflow:"Positieve cashflow",savingsEffortRequired:"Spaarinspanning vereist",annualCashflow:"Jaarlijkse cashflow",annualEffort:"Jaarlijkse inspanning",monthlyCashflow:"Maandelijkse cashflow",monthlyEffort:"Maandelijkse inspanning",warning:"Waarschuwing",warningText:"Deze schatting wordt alleen ter informatie verstrekt en vervangt geen volledige analyse inclusief belastingen, financiering, onroerende voorheffing en leegstand."},peb:{title:"Simulatie EPC",date:"Datum",energyScore:"Energiescore",annualConsumption:"Jaarlijks verbruik",estimatedAnnualCost:"Geschatte jaarlijkse kosten",propertyInfo:"Informatie over het pand",region:"Regio",propertyType:"Type vastgoed",livableArea:"Bewoonbare oppervlakte",electricityPrice:"Prijs van elektriciteit",pebClassification:"EPC-classificatie",yourProperty:"Uw pand",energyConsumptionBreakdown:"Verdeling van het energieverbruik",breakdownEstimate:"Schatting van de verdeling per gebruik voor een score van {score} kWh/m²/jaar",heating:"Verwarming",hotWaterSanitary:"Sanitair warm water",ventilation:"Ventilatie",lighting:"Verlichting",otherAppliances:"Andere (huishoudelijke apparaten, enz.)",warning:"Waarschuwing",warningText:"Deze simulatie is een indicatieve schatting op basis van gemiddelden. Het werkelijke verbruik hangt af van vele factoren: isolatie, gewoonten, apparatuur, weersomstandigheden, enz.",brussels:"Brussel-Hoofdstad",flanders:"Vlaanderen",wallonia:"Wallonië",apartment:"Appartement",house:"Huis"}
953,tri:{"Rapport Rentabilité":"Rendementsrapport",subtitle:"Vastgoed Analyse",triReturn:"TRI (Rendement)",cashflowAvg:"Cashflow (Gem. Jaar 1)",totalWealth:"Totale Vermogensgroei",assumptions:"Hypothèses",purchasePrice:"Aankoopprijs",feesAndWorks:"Kosten + Werken",contribution:"Inbreng",loan:"Lening",conditions:"Voorwaarden",over:"over",years:"jaar",visualizationLabel:"Visualisatie Cashflows & Vermogen",annualDetail:"Jaarlijks Detail (Projectie {duration} jaar)",year:"Jaar",cashflow:"Cashflow",crd:"Restschuld",propertyValue:"Waarde Pand",cumulatedNet:"Gecumuleerd Netto",generatedBy:"Gegenereerd door Arcanes. Simulatie uitsluitend ter informatie."},notaryFees:{title:"Schatting van Aankoopkosten",date:"Datum",totalToPay:"Totaal geschat te voorzien",includingFees:"waarvan {amount} aan notariskosten",propertyInfo:"Informatie over het pand",region:"Regio",propertyType:"Type vastgoed",purchasePrice:"Aankoopprijs",conditions:"Voorwaarden",firstPurchase:"Eerste aankoop",newProperty:"Nieuwbouw",mortgage:"Hypothecaire lening",standard:"Standaard",wallonia:"Wallonië",brussels:"Brussel-Hoofdstad",flanders:"Vlaanderen",house:"Huis",apartment:"Appartement",land:"Grond",detailedBreakdown:"Gedetailleerde verdeling van de kosten",transactionAmount:"Bedrag van de transactie",registrationRights:"Registratierechten",vat:"BTW (21%)",notaryFees:"Notarishonoraria",adminFees:"Administratiekosten",ofTotal:"{percentage}% van het totaal",feesBreakdownChart:"Verdeling van notariskosten",rightsVat:"Rechten/BTW",fees:"Honoraria",admin:"Admin",importantInfo:"Belangrijke informatie",importantInfo1:"Notariskosten zijn over het algemeen betaalbaar op de dag van ondertekening van de authentieke akte.",importantInfo2:"De notaris moet een gedetailleerde schatting verstrekken vóór de ondertekening van het compromis.",importantInfo3:"Deze kosten worden over het algemeen niet gefinancierd door de hypothecaire lening en moeten worden voorzien naast de eigen inbreng.",legalWarning:"Wettelijke waarschuwing",legalWarningText:"Deze schatting wordt uitsluitend ter informatie verstrekt. De werkelijke kosten kunnen variëren afhankelijk van uw persoonlijke situatie, de specifieke kenmerken van uw aankoop en de evolutie van de wetgeving. Voor een nauwkeurige en gepersonaliseerde schatting, raadpleeg een notaris die uw dossier in detail kan analyseren."}},R4={title:"Arcanes Blog",subtitle:"Betrouwbare, gestructureerde en begrijpelijke vastgoedanalyses. Geen speculatie, geen marketingverhalen.",officialSources:"Officiële & geverifieerde bronnen",factBased:"Op feiten gebaseerd, niet op meningen",tags:{all:"Alle",peb:"EPB",financing:"Financiering",yield:"Rendement",investment:"Investering"},readTime:"min",trending:"Trending",read:"Lezen",subscribe:{title:"Ontvang onze expertdossiers",frequency:"1 e-mail / week ⢠Officiële bronnen ⢠Geen spam",placeholder:"[email protected]",button:"Inschrijven"},footer:"Arcanes â Intelligente vastgoedanalyses."},z4={back:"Terug",contact:"Contact",by:"Door",tagline:"Een Arcanes-analyse â expertise, duidelijkheid, cijfers & vastgoedstrategie",synthesis:{title:"Arcanes Synthese",content:"Dit artikel heeft tot doel administratief jargon om te zetten in een concrete investeringsbeslissing: kerncijfers, echte impact op uw portefeuille en directe actiehefbomen."},nextStep:{title:"Volgende stap",content:"Test uw situatie met de Arcanes EPB / rendement simulator, en bewaar het gegenereerde rapport als basis voor discussie met uw bankier, notaris of adviseur.",button:"Open de simulators"},cta:{label:"Gepersonaliseerde analyse",title:"Heeft u een concreet project?",content:"Arcanes analyseert uw aankoop of investering met hetzelfde niveau van eisen als dit artikel: marktgegevens, becijferde scenario's en gedetailleerde indicatoren binnen 48 uur.",button:"Ontdek onze analyses"},footer:"Arcanes. De nieuwe generatie vastgoedanalyse."},I4={title:"Neem contact met ons op",subtitle:"Een vraag? Een project? Aarzel niet om contact met ons op te nemen, we zullen zo snel mogelijk antwoorden.",form:{title:"Stuur ons een bericht",description:"Vul het onderstaande formulier in en we zullen snel antwoorden.",name:"Volledige naam",email:"E-mail",phone:"Telefoon",subject:"Onderwerp",message:"Bericht",characters:"tekens",send:"Beric
953ht verzenden",sending:"Verzenden...",namePlaceholder:"...",emailPlaceholder:"...",phonePlaceholder:"...",subjectPlaceholder:"Uw onderwerp",messagePlaceholder:"Uw bericht...",errors:{nameRequired:"Naam is verplicht",nameMax:"Naam moet minder dan 100 tekens bevatten",emailInvalid:"Ongeldige e-mail",emailMax:"E-mail moet minder dan 255 tekens bevatten",phoneMax:"Telefoon moet minder dan 20 tekens bevatten",subjectRequired:"Onderwerp is verplicht",subjectMax:"Onderwerp moet minder dan 200 tekens bevatten",messageMin:"Bericht moet minimaal 10 tekens bevatten",messageMax:"Bericht moet minder dan 2000 tekens bevatten"}},info:{title:"Contactinformatie",description:"U kunt ons ook rechtstreeks via deze middelen bereiken.",email:"E-mail",phone:"Telefoon",address:"Adres"},hours:{title:"Openingstijden",weekdays:"Maandag - Vrijdag",saturday:"Zaterdag",sunday:"Zondag",closed:"Gesloten"},toast:{success:"Bericht verzonden!",successDesc:"We zullen zo snel mogelijk antwoorden.",error:"Fout",errorDesc:"Er is een fout opgetreden bij het verzenden van het bericht."}},q4={greeting:"Goedendag{{name}} ð",kpis:{analyses:"analyses",thisMonth:"deze maand",credits:"credits"},hero:{title:"Klaar om te investeren?",subtitle:"Analyseer elk vastgoed in België in enkele seconden.",cta:"Nieuwe analyse"},empty:{title:"Nog geen analyses",description:"Start uw eerste analyse om het investeringspotentieel van een vastgoed te ontdekken.",cta:"Mijn eerste analyse starten",hint:"Plak gewoon een Immoweb of Immovlan link"},referral:{title:"Verdien gratis credits",subtitle:"Nodig een vriend uit en ontvang elk <b>5 credits</b>.",codeCopied:"Code gekopieerd!",linkCopied:"Uitnodigingslink gekopieerd!",codeLabel:"Code",inviteButton:"Uitnodigen",progressLabel:"Voortgang naar premium doel",progressOf:"{{current}} van {{total}}"},tabs:{recentes:"Recent",favorites:"Favorieten",referral:"Doorverwijzing"},historyFull:{title:"Al mijn analyses",back:"â Terug",viewAll:"Bekijk al mijn analyses"}},N4={synthesis:"Synthese",market:"Marktrealiteit",transformation:"Transformatieplan",projection:"Projectie 10 jaar",negotiation:"Datasynthese"},L4={title:"Inhoud",synthese:"Synthese",marche:"Markt",transformation:"Werken",projection:"Projectie",negociation:"Synthese"},B4={excellent:"Zeer Hoge Score",good:"Hoge Score",correct:"Gemiddelde Score",evaluate:"Lage Score",caution:"Zeer Lage Score"},M4={undermarket:"< marktschatting",overmarket:"> marktschatting",selffinanced:"Berekende positieve cashflow",highyield:"Bruto rendement > 6%",energyreno:"Geschatte EPC-werken"},F4={tri:{benchmark:"Marktgemiddelde: 5-7%"},cashflow:{monthly:"/maand"},rendement:{aftercharges:"Na kosten"},multiplicateur:{onequity:"Op eigen vermogen"},prix:{label:"Aankoopprijs"},total:{label:"Totale Investering",subtext:"Kosten & werken inbegrepen"},mensualite:{label:"Maandelijkse Afbetaling",subtext:"/maand"},apport:{label:"Vereiste Inbreng"}},O4={title:"Simulatie",subtitle:"Pas de parameters aan",reset:"Resetten",toggle:"Simulatieparameters",prix:"Aankoopprijs",taux:"Kredietrente",duree:"Looptijd krediet",apport:"Eigen inbreng",travaux:"Budget werken",loyer:"Maandelijkse huur",disclaimer:"De projecties zijn gebaseerd op hypotheses die kunnen variëren."},V4={prix:"Aankoopprijs",frais:"Aankoopkosten",travaux:"Budget werken",total:"Projectkost"},W4={equilibre:{title:"Berekende evenwichtsprijs",reduction:"Vastgesteld verschil",arv:"Geschatte ARV",travaux:"- Werken",frais:"- Kosten & marge"},args:{market:{title:"Positionering t.o.v. de schatting",desc:"Vastgestelde prijs {{pct}} boven de lokale marktschatting.",under:"Vastgestelde prijs {{pct}} onder de lokale marktschatting."},travaux:{title:"Geschat werkbudget",desc:"Inclusief geschatte EPB-conformering en afwerking."},arv:{title:"Schatting na renovatie (ARV)",positive:"Verschil tussen totale kost en schatting na werken: {{marge}}",negative:"De totale projectkost overschrijdt de schatting na werken."}},text:{title:"Gegevenssynthese",collapse:"Inklappen",expand:"Volledige tekst bekijken",disclaimer:"Deze gegevens zijn ter indicatie gegenereerd. Ze vormen geen advies. Laat u begeleiden door een professional."},generated:{opening:`Synthese van de feitelijke gegevens met betrekking tot dit pand: 954 955`,market:`Positionering: De vraagprijs van {{prix}} ligt {{position}} van {{pct}} ten opzichte van de Arcanes marktschatting voor deze sector. 956 957`,travaux:`Geschat werkbudget: {{budget}} voor de energetische aanpassing (EPB) en afwerking. Dit bedrag moet worden meegenomen in de berekening van de totale projectkost. 958 959`,conclusion:`Theoretisch evenwichtspunt: Op basis van de gehanteerde hypothesen (geraamde werken en algoritmisch marktverschil), zou een theoretische evenwichtsprijs zich rond {{prix}} kunnen bevinden. 960 961Deze analyse is uitsluitend ter indicatie verstrekt en vormt geen beleggingsadvies, noch een deskundig oordeel. De bedragen zijn schattingen die door gekwalificeerde professionals moeten worden gevalideerd.`}},U4={title:"Snelle acties",schedule:"Bezoek plannen",contact:"Kantoor contacteren",save:"Analyse opslaan"},$4={text:"Beslissingsondersteunend hulpmiddel. Deze analyse vormt geen beleggingsadvies en vervangt niet het advies van een vastgoedexpert, notaris of financieel adviseur. De projecties zijn gebaseerd op hypotheses die kunnen variëren."},G4={title:"Intelligente vastgoedanalyse",subtitle:"Plak uw advertentie-URL, Arcanes doet de rest.",loading:"Analyse laden...",upload:{dragDrop:"Importeer uw advertentie",format:"(PDF-formaat - max 1 bestand)",fileUploaded:"Bestand geïmporteerd",or:"OF",placeholderUrl:"Plak de URL van de advertentie hier..."},header:{preview:"Voorbeeld",fullAnalysis:"Volledige Analyse"},form:{analysisType:"Type analyse",mainResidence:"Hoofdverblijfplaats",mainResidenceDesc:"Voor een pand waar u gaat wonen",rentalInvestment:"Huurinvestering",rentalInvestmentDesc:"V
961oor een pand bestemd voor verhuur",uniqueProperty:"Enige eigen woning (enige onroerend goed in uw bezit)",buttons:{analyzing:"Analyse bezig...",freePreview:"Gratis voorbeeld (beperkt)",premium:"Volledige analyse (1 credit)",unlock:"Ontgrendel de volledige analyse"}},languageMismatch:{title:"Taal van de analyse",message:"Uw profiel is ingesteld op {{profileLang}}, maar de interface is momenteel in {{currentLang}}. In welke taal wilt u uw analyse ontvangen?",useProfile:"{{lang}} (profiel)",useCurrent:"{{lang}} (huidige)"},types:{personalHome:"Persoonlijke Woning",rentalInvestment:"Huurinvestering",multiUnit:"Opbrengstgebouw"},badges:{personalHome:"Persoonlijke Woning",uniqueHome:"Enige Woning",rentalInvestment:"Huurinvestering",multiUnit:"Opbrengstgebouw",units:"eenheden",lots:"kavels",alert:"Vastgesteld verschil",gross:"Bruto"},stats:{surface:"Oppervlakte",price:"Prijs",monthlyBudget:"Maandbudget",grossRent:"Brutohuur",totalSurface:"Totale Oppervlakte",pricePerDoor:"Prijs/Deur",totalRent:"Totale Huur",perMonth:"/maand",totalInvestment:"Totale investering"},banners:{uniqueHome:{title:"Voordeel Enige Woning",savings:"Potentiële besparing van {{amount}} op registratierechten"},priceGap:{title:"Verschil van {{percent}}% vastgesteld ten opzichte van de marktschatting",description:"De gedetailleerde analyse verkent de factoren die dit verschil verklaren.",descriptionInvest:"De gedetailleerde analyse bevat netto rendement- en cashflowgegevens om dit verschil te verkennen.",cta:"Gedetailleerde analyse bekijken"}},keyFacts:{title:"Kernpunten",property:{label:"Het Pand",defaultType:"Onroerend goed",defaultZone:"Woonzone",building:"Gebouw",context:"Gelegen in {{city}} ({{zone}}).",contextNoCity:"{{zone}}."},budget:{label:"Maandbudget",perMonth:"/ maand",context:"Inclusief krediet, lasten en energie."},price:{label:"Prijspositie",perSqm:"/ m²",contextNeutral:"Vastgesteld verschil van {{percent}} ten opzichte van de Arcanes marktschatting.",perDoor:"/deur"},priceBadge:{belowEstimate:"< schatting",aboveEstimate:"> schatting",withinRange:"Binnen de marge"},works:{label:"Renovatiebudget",estimated:"geschat",none:"Geen",contextWithWorks:"Budget voor een volledige renovatie.",contextNoWorks:"Geen werken voorzien in deze analyse."},energy:{label:"Prestatie",contextNeutral:"Officieel EPC-certificaat van het pand. Energiekosten variëren naargelang het gebruik."},fiscal:{label:"Fiscaal Regime",standard:"Standaard",standardContext:"Klassieke registratierechten van toepassing.",reduced:"Verminderd",reducedContext:"Verminderd tarief enige woning van toepassing."},rent:{label:"Geschatte huur",contextInvest:"Geschatte bruto maandhuur op basis van de lokale huurmarkt.",contextImmeuble:"Totale maandelijkse huurinkomsten van alle eenheden samen.",units:"eenheden"},multiUnit:{label:"Verdeling",vacancyUnit:"impact per leegstand",context:"Bij meerdere eenheden treft leegstand slechts een deel van de totale huurinkomsten."},mortgage:{label:"Maandelijkse aflossing",context:"Maandelijkse terugbetaling van het hypothecair krediet."}},sections:{marketPosition:"Marktpositie",monthlyBudget:"Maandbudget",syntheticIndex:"Synthetische index",buyVsRent:"Kopen vs Huren",financialStructure:"Financiële Structuur",energyPerformance:"Energieprestatie",postWorksEstimate:"Schatting na werken",yield:"Rendement",unitsOverview:"Overzicht Eenheden",multiUnitData:"Gegevens meerdere eenheden",monthlyCost:"Maandelijkse woonkost"},market:{pricePerSqm:"Prijs per m²",marketEstimate:"Marktschatting",acquisitionPrice:"Aankoopprijs",pricePerDoor:"Prijs/Deur",range:"Vork",belowEstimate:"Onder de schatting",aboveEstimate:"Boven de schatting",significantGap:"Significant verschil vastgesteld",withinRange:"Binnen de geschatte marge"},budget:{composition:"Krediet + Lasten + Energie",mortgage:"Maandelijkse Aflossing",charges:"Lasten",energy:"Energie",effortRate:"Indicatieve inspanningsgraad",effortRateDescription:"Vergelijk dit maandbudget met uw netto-inkomen om de betaalbaarheid te beoordelen. Een inspanningsgraad lager dan 35% wordt doorgaans als houdbaar beschouwd."},financial:{acquisitionPrice:"Aankoopprijs",registrationFees:"Registratierechten",notaryFees:"Notariskosten",acquisitionFees:"Aankoopkosten",worksBudget:"Renovatiebudget",totalInvestment:"Totale Investering",requiredDeposit:"Vereiste Inbreng",monthlyPayment:"Maandelijkse Betaling",mortgagePayment:"Kredietaflossing",investmentPerDoor:"Investering/Deur",perUnit:"per eenheid",ofTotal:"van totaal",years:"jaar",at:"aan"},energy:{annualCharges:"Jaarlijkse energiekosten",estimatedSavings:"Geschatte jaarlijkse besparing",year:"jaar",plannedBudget:"Voorzien EPC-budget"},yield:{calculation:"Brutohuur / Aankoopprijs",monthlyRent:"Maandelijkse Huur",rentPerDoor:"Huur/Deur"},units:{rentHidden:"Huur verborgen"},multiUnit:{vacancyImpactNeutral:"Impact van één leegstaande eenheid op de totale huurinkomsten",oneVacancyNeutral:"Eén leegstaande eenheid vertegenwoordigt een verlies van {{percent}}% van de totale huurinkomsten.",vsSingle:"vs 100% bij één enkel pand"}
961,blurred:{score:{title:"Synthetische index",ready:"De index werd berekend op basis van de gegevens van het pand.",loading:"Index berekend op basis van meerdere objectieve criteria.",cta:"Mijn score bekijken"},buyVsRent:{title:"Vergelijking kopen vs huren",description:"Vergelijkende simulatie van koop- en huurkosten over 10 jaar.",cta:"Vergelijking bekijken"},plusValue:{title:"Schatting na werken",description:"Vergelijking tussen de totale kost en de marktschatting na werken.",cta:"Latente marge bekijken"},yield:{title:"Gedetailleerde rendementgegevens",yourGross:"Berekend bruto rendement:",description:"De volledige analyse bevat het netto rendement, de cashflow en de IRR.",cta:"Reële rentabiliteit bekijken"},energy:{title:"Energiedetail",description:"Premies, jaarlijkse besparingen en terugverdientijd",cta:"Energie-ROI bekijken"},units:{title:"Detail van {{count}} Eenheden",description:"Huren, rendementen en optimalisatiepotentieel per kavel",cta:"Elke eenheid bekijken"},arv:{title:"Schatting na werken (ARV)",description:"Vergelijking tussen de totale aankoopkost en de marktschatting na renovatie.",cta:"Latente marge bekijken"}},premium:{tri:"IRR 10 jaar",cashflow:"Netto Cashflow",taxes:"Fiscaliteit",pdfReport:"PDF Rapport",arvMargin:"ARV & Marge",unitAnalysis:"Analyse/Eenheid",report10p:"Rapport 10p",score100:"Score /100",buyVsRent:"Kopen vs Huren",projections:"Projecties",report11p:"Rapport 11p"},cta:{title:"Ontgrendel de volledige analyse",description:"Krijg toegang tot alle financiële indicatoren, projecties over 10 jaar en gedetailleerde simulaties.",unlock:"Nu ontgrendelen"},modal:{title:"Volledige analyse",subtitle:"Alle berekende indicatoren voor dit pand.",unlockButton:"Ontgrendelen (1 Credit)",cancelButton:"Nee bedankt, terug naar voorbeeld",home:{score:{title:"Synthetische Index /100",sub:"4 gewogen criteria"},buyVsRent:{title:"Kopen vs Huren",sub:"Gedetailleerde vergelijking"},projections:{title:"10-jaarsprojecties",sub:"Vermogensevolutie"},pdf:{title:"PDF Rapport 11 pagina's",sub:"Met vergelijkingspagina"}},invest:{cashflow:{title:"Reële Netto Cashflow",sub:"Na kosten en belastingen"},tri:{title:"IRR over 10 jaar",sub:"Interne opbrengstvoet"},projections:{title:"Vermogensprojecties",sub:"Evolutie over 10 jaar"},pdf:{title:"Premium PDF Rapport",sub:"Professioneel document"}},multiUnit:{arv:{title:"ARV & Latente Marge",sub:"Directe waardecreatie"},units:{title:"Analyse per Eenheid",sub:"Rendement van elk kavel"},tri:{title:"IRR & Cashflow",sub:"Volledige prestatie"},pdf:{title:"PDF Rapport 10 pagina's",sub:"Professioneel document"}}},dialogs:{missingInfo:{title:"Ontbrekende informatie",desc:"Om een volledige analyse te krijgen, hebben we enkele aanvullende gegevens nodig."},payment:{title:"Kies uw optie",desc:"Gebruik een credit of laad uw account op om toegang te krijgen tot de volledige analyse",useCredit:"Gebruik 1 credit",remaining:"Resterende credits:",noCreditsTitle:"U heeft geen credits meer beschikbaar",recharge:"Mijn account opladen",cancel:"Annuleren"},download:{title:"Volledige analyse klaar!",desc:"Bekijk en download uw volledige vastgoedanalyserapport",pdf:"PDF-document",word:"Word-document",download:"Downloaden",wordNoticeTitle:"Word-document (.docx)",wordNoticeDesc:"Voorbeeld is niet beschikbaar voor Word-bestanden. Download het document om het te bekijken.",downloadNow:"Nu downloaden",close:"Sluiten",downloadAndClose:"Downloaden en sluiten"},noCredit:{title:"Onvoldoende credits",desc:"U heeft geen credits meer beschikbaar om een volledige analyse uit te voeren",rechargeTitle:"Laad uw account op om door te gaan",rechargeDesc:"Krijg toegang tot volledige en gedetailleerde analyses in PDF",seePricing:"Bekijk de tarieven"},error:{button:"Begrepen"},unsupportedDomain:{title:"Website niet ondersteund",message:`De website "{{domain}}" wordt nog niet ondersteund door Arcanes. 962 963Om dit vastgoed te analyseren, exporteert u de advertentie als PDF en gebruikt u de optie "Bestand importeren" op onze analysepagina.`,howTo:"Hoe doe ik dat?",step1:"Op de vastgoedwebsite, print de pagina als PDF (Ctrl+P â Opslaan als PDF)",step2:'Ga terug naar Arcanes en klik op "Bestand importeren"',step3:"Selecteer uw PDF en start de analyse"}},footer:{disclaimer:"Automatisch gegenereerd document. De simulaties zijn indicatief op basis van marktgegevens. Freemium versie."},toasts:{successTitle:"Analyse voltooid",analysisCompleted:"Uw analyse is succesvol gegenereerd.",analysisProcessed:"Uw analyse is succesvol verwerkt.",errorTitle:"Fout",genericError:"Er is een fout opgetreden bij de analyse. Probeer het opnieuw.",warning:"Waarschuwing",provideUrlOrFile:"Geef een advertentie-URL op of importeer een PDF-bestand.",selectType:"Selecteer het type vastgoed (hoofdverblijfplaats of investering).",paymentCancelled:"Betaling geannuleerd",paymentCancelledDesc:"De betaling is geannuleerd. Er is geen credit afgeschreven.",analysisReady:"Analyse klaar",freeAnalysisReady:"Uw gratis voorbeeld is klaar.",creditRefundedTitle:"Credit terugbetaald",creditRefundedDesc:"Uw credit is terugbetaald na de fout.",analysisFailedRefunded:"De analyse is mislukt, maar uw credit is automatisch terugbetaald."}},H4={title:"Algemene Gebruiksvoorwaarden en Verkoopsvoorwaarden",subtitle:"Voorwaarden die het gebruik van het Arcanes-platform en de aankoop van Credits regelen, in overeenstemming met de Belgische en Europese wetgeving.",lastUpdate:"Laatste update",effectiveDate:"28 februari 2026",preamble:{title:"Preambule",text:`Deze Algemene Voorwaarden (hierna "AV") vormen een bindend contract tussen de gebruiker (hierna "de Gebruiker") en de uitgever van het Arcanes-platform (hierna "de Uitgever"). 964 965Uitgever: DIGITAL ARCANES, Besloten vennootschap met beperkte aansprakelijkheid (BV/SRL), met maatschappelijke zetel te Rue des 4 Carrés 4, 1325 Chaumont-Gistoux (Dion-Valmont), België. 966Ondernemingsnummer (KBO): 1033.931.611 967BTW-nummer: BE 1033.931.611 968Contact e-mail: [email protected] 969Zaakvoerder: Yann Barbery 970 971Elk gebruik van het Platform of aankoop van Credits impliceert de volledige en onvoorwaardelijke aanvaarding van deze AV.`},articles:{"1_object":{title:"1. Voorwerp, Aard van de Dienst en Geen Advies",content:"Arcanes is een softwaretool voor de aggregatie en statistische verwerking van openbare vastgoedgegevens. De Dienst wordt geleverd in SaaS-modus ter ondersteuning van de besluitvorming.",warning:{title:"â ï¸ WETTELIJKE WAARSCHUWING: GEEN FINANCIEEL ADVIES",text:`Arcanes verleent GEEN beleggingsadvies in de zin van de wet van 25 oktober 2016 betreffende de toegang tot het verlenen van beleggingsdiensten, de MiFID II-richtlijn (2014/65/EU), noch fiscaal, juridisch of boekhoudkundig advies in de zin van het Wetboek van Economisch Recht (Boek VII). 972 973De analyses worden algoritmisch gegenereerd op basis van openbare gegevens (Statbel, k
973adaster, advertenties) en worden uitsluitend ter informatie verstrekt. Geen enkele analyse vormt een gepersonaliseerde aanbeveling tot aankoop, verkoop of investering. 974 975De scores, indices en projecties (IRR, cashflow, rendement, « Investeringsindex ») zijn wiskundige berekeningen op basis van hypothesen. Zij vormen noch een professionele taxatie in de zin van de IVS/EVS-norm, noch een schatting in de zin van artikel 3.56 van het Wetboek van Economisch Recht.`}},"2_definitions":{title:"2. Definities",items:`Platform: De website arcanes.be en alle bijbehorende diensten. 976 977Gebruiker: Elke natuurlijke of rechtspersoon die toegang heeft tot het Platform. 978 979Credits: Digitale rekeneenheden die door de Gebruiker zijn aangekocht om functionaliteiten (analyses) te ontgrendelen. 980 981Analyse: Rapport dat automatisch door het Platform wordt gegenereerd op basis van vastgoedgegevens. 982 983Uitgever: DIGITAL ARCANES BV/SRL, uitgever en exploitant van het Platform.`},"3_beta":{title:"3. Beschikbaarheid en Beta-status",content:'Het Platform wordt aangeboden in "Bêta"-versie. De Gebruiker erkent en aanvaardt dat de dienst bugs, fouten of tijdelijke onderbrekingen kan bevatten. De Uitgever heeft een middelenverbintenis om de beschikbaarheid te verzekeren, zonder garantie van absolute continuïteit (SLA).'},"4_automation":{title:"4. Beperkingen van Automatisering",content:`De resultaten zijn afkomstig van algoritmische verwerking van gegevens van derden. De Uitgever verifieert de brongegevens (advertenties, kadaster, EPC, Statbel) niet handmatig. Vertekeningen, interpretatiefouten of verouderde gegevens zijn mogelijk. 984 985Het is aan de Gebruiker om de gegevens waartoe hij toegang heeft via het Platform te verifiëren door ze zo nodig te vergelijken met andere informatiebronnen (fysieke bezoeken, vastgoedexperts, notariële gegevens, banken). 986 987De prijs-, rendements- en projectieschattingen vormen in geen geval een vastgoedexpertise in de zin van de IVS/EVS-norm noch een waardeoordeel dat de Uitgever bindt.`},"5_disclaimer":{title:"5. Waarschuwing voor Risico's en Beperkingen",alert:{title:"ð¨ INHERENTE BEPERKINGEN VAN DE DATA",text:"In het verleden behaalde resultaten of historische statistieken die door Arcanes worden gepresenteerd, bieden geen garantie voor de toekomst. De vastgoedmarkt is cyclisch en onvoorspelbaar."},obligations:{title:"Autonomie van de Gebruiker",list:`- De Gebruiker erkent dat hij Arcanes gebruikt als een eenvoudig informatiemiddel naast andere bronnen. 988- Hij verbindt zich ertoe deze gegevens te kruisen met fysieke bezoeken, professionele adviezen (notarissen, experts) en zijn eigen analyse. 989- Arcanes kan niet aansprakelijk worden gesteld voor een onsuccesvolle investeringsbeslissing, een latente of gerealiseerde minderwaarde, of huurdersproblemen.`},risks:"Elke investering houdt een risico op kapitaalverlies in. U handelt alleen en onder uw volledige eigen verantwoordelijkheid."},"6_obligations":{title:"6. Verplichtingen en Verbodsbepalingen",intro:"Het gebruik van het Platform is strikt persoonlijk. Het is formeel verboden om:",list:`- Enige vorm van 'scraping', 'crawling' of geautomatiseerde gegevensextractie toe te passen. 990- De analyses van Arcanes door te verkopen, in sublicentie te geven of te herverdelen aan derden, al dan niet tegen betaling. 991- De dienst te gebruiken om een concurrerende dienst te ontwikkelen. 992- Inloggegevens te delen: één gelijktijdige sessie per account. 993- Het Platform te gebruiken voor onwettige doeleinden of in strijd met de openbare orde.`},"7_ip":{title:"7. Intellectuele Eigendom",platform:"De broncode, algoritmen, database, teksten en het ontwerp zijn exclusief eigendom van DIGITAL ARCANES BV/SRL, beschermd door het auteursrecht (Boek XI van het Wetboek van Economisch Recht) en het recht van databankenproducenten.",user_rights:"De Gebruiker ontvangt een beperkte, niet-exclusieve, niet-overdraagbare en herroepbare gebruikslicentie, uitsluitend voor persoonlijk gebruik.",data:"De Uitgever behoudt zich het recht voor om gebruiksgegevens geanonimiseerd en geaggregeerd te gebruiken voor statistische doeleinden en verbetering van de dienst."},"8_sales":{title:"8. Verkoopsvoorwaarden (Credits)",nature:`Prijzen zijn in Euro (â¬), Belgische BTW van 21% inbegrepen. Facturen zijn beschikbaar op aanvraag via [email protected]. 994 995De Uitgever behoudt zich het recht voor tarieven te wijzigen voor nieuwe bestellingen. De toepasselijke tarieven zijn die welke gelden op het moment van de validatie van de bestelling. 996 997Credits zijn 24 maanden geldig vanaf de aankoopdatum. De Gebruiker wordt per e-mail gewaarschuwd 30 dagen en 7 dagen vóór het vervallen van zijn Credits. Na deze termijn zijn vervallen Credits definitief verloren.`,payment:"Betaling is onmiddellijk ver
997schuldigd bij bestelling via bankkaart (Stripe).",retraction:{title:"8.4 AFSTAND VAN HERROEPINGSRECHT",text:`OVEREENKOMSTIG ART. VI.53, 13° VAN HET WETBOEK VAN ECONOMISCH RECHT IS HET HERROEPINGSRECHT VAN 14 DAGEN NIET VAN TOEPASSING OP DIGITALE INHOUD INDIEN DE UITVOERING IS BEGONNEN MET UITDRUKKELIJK VOORAFGAAND AKKOORD VAN DE CONSUMENT EN DEZE HEEFT ERKEND ZIJN HERROEPINGSRECHT TE VERLIEZEN. 998 999DOOR HET AANVINKEN VAN HET DAARTOE VOORZIENE VAKJE VÃÃR DE BETALING: 10001. VERZOEKT DE GEBRUIKER UITDRUKKELIJK OM ONMIDDELLIJKE UITVOERING VAN DE DIENST; 10012. ERKENT DE GEBRUIKER UITDRUKKELIJK DAT HIJ ZIJN HERROEPINGSRECHT VERLIEST ZODRA DE CREDITS ZIJN GELEVERD.`,contact:"Enkel in geval van technisch leveringsprobleem: [email protected]"}},"9_privacy":{title:"9. Persoonsgegevens (AVG/GDPR)",content:`De persoonsgegevens van de Gebruiker worden verwerkt conform de Verordening (EU) 2016/679 (AVG) en de Belgische wet van 30 juli 2018. De details van de verwerkingen, doeleinden, rechtsgronden en bewaartermijnen zijn beschreven in ons Privacybeleid op arcanes.be/privacy. 1002 1003De Gebruiker beschikt met name over het recht op inzage, rectificatie, wissing, beperking, overdraagbaarheid en bezwaar. Deze rechten kunnen te allen tijde worden uitgeoefend door contact op te nemen met [email protected]. 1004 1005Verwerkingsverantwoordelijke: DIGITAL ARCANES BV/SRL, Rue des 4 Carrés 4, 1325 Chaumont-Gistoux, België. 1006 1007Bij klachten kan de Gebruiker een klacht indienen bij de Gegevensbeschermingsautoriteit (GBA): Drukpersstraat 35, 1000 Brussel â [email protected].`},"10_liability":{title:"10. Aansprakelijkheid",intro:"De Uitgever heeft een middelenverbintenis met betrekking tot de beschikbaarheid van de dienst en de nauwkeurigheid van de gegevens.",list:`- UITSLUITINGEN: De Uitgever wijst elke aansprakelijkheid af voor indirecte schade, met inbegrip van bedrijfsverlies, verlies van kansen, winstderving, gegevensverlies of enig nadeel voortvloeiend uit een beslissing genomen op basis van de analyses of inhoud gegenereerd door het Platform. 1008- PLAFOND: Behoudens in geval van opzet, grove fout, of aantasting van het leven, de lichamelijke integriteit of de gezondheid, is de financiële aansprakelijkheid van de Uitgever jegens de Gebruiker uitdrukkelijk beperkt tot het totale bedrag dat door de Gebruiker is betaald in de twaalf (12) maanden voorafgaand aan het schadeverwekkende feit. 1009- DATA VAN DERDEN: De Uitgever garandeert niet de juistheid, volledigheid of actualiteit van brongegevens (EPC, kadaster, advertenties, Statbel) die door derden worden verstrekt.`},"11_termination":{title:"11. Beëindiging en Opschorting",user:"De Gebruiker kan zijn account te allen tijde sluiten via de accountinstellingen of op verzoek aan [email protected]. De sluiting brengt het definitieve verlies van ongebruikte Credits met zich mee. De Gebruiker kan vooraf de export van zijn gegevens aanvragen overeenkomstig artikel 20 van de AVG.",editor:`Bij schending van deze AV kan de Uitgever de toegang tot het account opschorten met een opzegtermijn van 15 dagen per e-mail, behalve in geval van ernstige schending (fraude, scraping, inbreuk op de beveiliging) die een onmiddellijke opschorting zonder opzegtermijn rechtvaardigt. 1010 1011Bij beëindiging door de Uitgever zonder fout van de Gebruiker (stopzetting van de dienst, eenzijdige beslissing) worden de ongebruikte Credits pro rata terugbetaald tegen het aankooptarief.`},"12_law":{title:"12. Toepasselijk Recht en Jurisdictie",content:`Deze AV worden beheerst door het Belgisch recht. 1012 1013Bij geschillen zullen de partijen trachten binnen 30 dagen tot een minnelijke schikking te komen. Bij gebrek daaraan zijn de rechtbanken van het gerechtelijk arrondissement Waals-Brabant bevoegd, onverminderd het recht van de consument om de rechtbank van zijn woonplaats te vatten overeenkomstig Verordening (EU) nr. 1215/2012. 1014 1015Overeenkomstig Verordening (EU) nr. 524/2013 kan de consument gebruik maken van het platform voor Onlinegeschillenbeslechting (ODR) van de Europese Commissie: https://ec.europa.eu/consumers/odr`},"13_modifications":{title:"13. Wijziging van de AV",content:`De Uitgever behoudt zich het recht voor om deze AV te allen tijde te wijzigen. Bij substantiële wijzigingen wordt de Gebruiker ten minste 15 dagen vóór de inwerkingtreding van de nieuwe voorwaarden per e-mail geïnformeerd. 1016 1017Indien de Gebruiker de nieuwe voorwaarden niet aanvaardt, kan hij zijn account opzeggen vóór de inwerkingtreding. Het voortgezette gebruik van het Platform na de datum van inwerkingtreding geldt als aanvaarding van de nieuwe voorwaarden. 1018 1019De datum van de laatste update wordt bovenaan deze pagina vermeld.`},"14_force_majeure":{title:"14. Overmacht",content:`De Uitgever kan niet aansprakelijk
1019worden gesteld voor de niet-nakoming of vertraging in de nakoming van zijn verplichtingen in geval van overmacht in de zin van artikel 5.226 van het Belgisch Burgerlijk Wetboek, met name: natuurramp, pandemie, cyberaanval, algemene infrastructuurstoring (AWS, Supabase, Stripe), overheids- of regelgevende beslissing. 1020 1021Bij overmacht van meer dan 90 dagen kan elke partij het contract opzeggen. In dat geval worden de ongebruikte Credits pro rata terugbetaald.`}}},K4={title:"Algemene Voorwaarden Agent Pro Dienst",subtitle:"Voorwaarden die het gebruik van de Arcanes Agent Pro dienst door vastgoedprofessionals regelen, in overeenstemming met het Belgisch recht.",lastUpdate:"Laatste update",effectiveDate:"13 april 2026",preamble:{title:"Preambule",text:`Deze Algemene Voorwaarden van de Agent Pro Dienst (hierna « AV Pro ») regelen de toegang tot en het gebruik van de dienst « Arcanes Agent Pro » uitgegeven door DIGITAL ARCANES BV/SRL. 1022 1023Uitgever: DIGITAL ARCANES, Besloten vennootschap met beperkte aansprakelijkheid (BV/SRL), met maatschappelijke zetel te Rue des 4 Carrés 4, 1325 Chaumont-Gistoux (Dion-Valmont), België. 1024Ondernemingsnummer (KBO): 1033.931.611 1025BTW-nummer: BE 1033.931.611 1026Contact e-mail: [email protected] 1027Zaakvoerder: Yann Barbery 1028 1029Deze AV Pro vullen de Algemene Gebruiksvoorwaarden aan die toegankelijk zijn op arcanes.be/terms en het Privacybeleid toegankelijk op arcanes.be/privacy. Bij tegenstrijdigheid prevaleren de AV Pro voor alles wat betrekking heeft op de Agent Pro dienst.`},articles:{"1_qualification":{title:"1. Professionele Kwalificatie",content:`1.1. Deze AV Pro zijn uitsluitend bestemd voor Gebruikers die handelen in het kader van hun beroepsactiviteit: vastgoedmakelaars (erkend BIV), promotoren, vermogensbeheerders, vastgoedkantoren en elke rechtspersoon die een vastgoedgerelateerde activiteit uitoefent. 1030 10311.2. Door een Agent Pro account aan te maken, bevestigt de Gebruiker: 1032a) dat hij handelt als professioneel in de zin van artikel I.1, 1° van het Wetboek van Economisch Recht; 1033b) dat hij bevoegd is om de rechtspersoon die hij vertegenwoordigt te verbinden, indien van toepassing; 1034c) dat hij ervan op de hoogte is dat de consumentenbeschermingsbepalingen van Boek VI van het Wetboek van Economisch Recht niet op hem van toepassing zijn. 1035 10361.3. Overeenkomstig artikel VI.53, 1° van het Wetboek van Economisch Recht is het herroepingsrecht van 14 dagen voorzien in de artikelen VI.47 tot VI.52 niet van toepassing op overeenkomsten gesloten tussen professionelen.`},"2_object":{title:"2. Voorwerp van de Dienst",content:`2.1. Arcanes Agent Pro is een SaaS-dienst ter ondersteuning van de besluitvorming, bestemd voor vastgoedprofessionals. De dienst omvat: 1037a) Prospectrapport: analyserapport van 4 pagina's, gegenereerd op basis van marktgegevens (Statbel, kadaster, EPC), met algoritmisch berekende financiële indicatoren en samenvattende teksten opgesteld door een AI-schrijfhulp; 1038b) Pitch card: synthesefiche van 1 pagina bruikbaar tijdens bezoeken; 1039c) Aankondigingen genereren: geautomatiseerde redactie van beschrijvingen van vastgoed; 1040d) Koperspagina: interactieve webpagina die een pand presenteert met geïntegreerde simulatoren; 1041e) Geautomatiseerde emails: automatische verzending van opvolgingsmails naar eigenaars, op verzoek van de makelaar; 1042f) Betrokkenheidstracking: geanonimiseerde meting van de interesse van bezoekers op koperspagina's. 1043 10442.2. Al deze diensten vormen een geheel van tools waarmee de Makelaar zijn afspraken kan voorbereiden, zijn prijsaanbevelingen kan onderbouwen en zijn prospects kan opvolgen. De resultaten vervangen in geen geval het professionele oordeel van de Makelaar.`},"3_ai":{title:"3. Rol van Artificiële Intelligentie",content_intro:"3.1. De Agent Pro dienst maakt gebruik van twee afzonderlijke technologieën:",algo:{title:"Algoritmische berekeningen",text:"Alle financiële indicatoren (IRR, cashflow, rendement, scores, geschatte prijsvork, projecties) worden berekend door wiskundige algoritmen ontwikkeld door Arcanes, op basis van openbare gegevens (Statbel, kadaster, FOD Financiën). Deze berekeningen maken geen gebruik van artificiële intelligentie."},ia:{title:"AI-ondersteunde redactie",text:"De beschrijvende teksten (aankondigingsbeschrijvingen, narratie van rapporten, opvolgingsmails naar eigenaars) w
1044orden gegenereerd door een taalmodel (Anthropic Claude). Deze teksten worden automatisch geproduceerd op basis van de gestructureerde gegevens van het pand en de markt."},content_warnings:`3.2. De door AI gegenereerde teksten: 1045- worden niet nagelezen of gevalideerd door een menselijke expert vóór levering; 1046- kunnen benaderingen, feitelijke fouten of ongepaste formuleringen bevatten; 1047- weerspiegelen niet de mening van een vastgoedexpert; 1048- mogen door de Makelaar niet worden voorgesteld als een professioneel advies dat Arcanes bindt. 1049 10503.3. Het is aan de Makelaar om elke gegenereerde tekst na te lezen en zo nodig aan te passen vóór doorgifte aan een derde (eigenaar, koper, partner). 1051 10523.4. De gegevens die aan Anthropic worden doorgegeven voor tekstgeneratie worden verwerkt in « Zero Data Retention »-modus (geen bewaring van gegevens door de AI-leverancier na generatie). De details van deze verwerking zijn beschreven in het Privacybeleid (sectie 4 â Verwerkers).`},"4_no_advice":{title:"4. Aard van de Dienst en Afwezigheid van Advies",content:`4.1. Kwalificatie van de dienst. Arcanes Agent Pro is een tool voor statistische verwerking van vastgoedgegevens en schrijfondersteuning. Het vormt geen: 1053- beleggingsdienst in de zin van de wet van 25 oktober 2016 betreffende de toegang tot het verlenen van beleggingsdiensten en het statuut van de portefeuillemaatschappijen; 1054- financieel advies in de zin van de MiFID II-richtlijn (2014/65/EU); 1055- vastgoedexpertise in de zin van de IVS/EVS-normen; 1056- fiscaal, juridisch of boekhoudkundig advies in de zin van het Wetboek van Economisch Recht (Boek VII).`,pricing:"4.2. Schattingen en prijsvorken. De prijsschattingen die door het Platform worden verstrekt zijn indicatieve vorken die algoritmisch worden berekend op basis van openbare gegevens. Zij vormen geen professionele beoordeling van de venale waarde van een pand. De vaststelling van de verkoopprijs of de prijs van het mandaat valt uitsluitend onder de verantwoordelijkheid van de Makelaar, in het kader van zijn deontologische (Deontologische Code BIV) en wettelijke verplichtingen.",no_duty:"4.3. Geen adviesplicht. Arcanes heeft geen adviesplicht tegenover de Makelaar noch tegenover derden aan wie de Makelaar resultaten van het Platform meedeelt (eigenaars, kopers, banken). De Makelaar oefent zijn eigen professioneel oordeel uit en draagt de volledige verantwoordelijkheid voor zijn prijsaanbevelingen, zijn adviezen en zijn professionele handelingen.",fsma:"4.4. Geen FSMA-registratie. DIGITAL ARCANES BV/SRL is niet ingeschreven bij de Autoriteit voor Financiële Diensten en Markten (FSMA) als verlener van beleggingsdiensten, kredietbemiddelaar of verzekeringsbemiddelaar."},"5_verification":{title:"5. Verificatieplicht",content:`5.1. De Makelaar erkent dat de analyses, schattingen, scores en inhoud gegenereerd door het Platform automatisch worden geproduceerd en fouten, verouderde gegevens of benaderingen kunnen bevatten. 1057 10585.2. Vóór elke mededeling van resultaten aan een derde (eigenaar, koper, bank, notaris), verbindt de Makelaar zich ertoe: 1059a) de coherentie van de gegevens te verifiëren met zijn terreinkennis en het bezochte pand; 1060b) de prijsvorken te confronteren met andere informatiebronnen (notariële vergelijkingen, lokale expertise, tools van derden); 1061c) de door AI gegenereerde teksten na te lezen en aan te passen om ervoor te zorgen dat ze de realiteit van het pand getrouw weergeven; 1062d) de resultaten van het Platform nooit voor te stellen als een deskundig advies, vastgoedexpertise of document dat de aansprakelijkheid van Arcanes bindt. 1063 10645.3. De Makelaar is de enige erkende professional in de relatie met de eigenaar of koper. De beslissing om een prijs, schatting of rapport mee te delen valt uitsluitend onder zijn professionele verantwoordelijkheid.`},"6_indemnification":{title:"6. Aansprakelijkheid van de Makelaar en Vrijwaring",responsibility:`6.1. Professionele aansprakelijkheid. De Makelaar is als enige verantwoordelijk voor: 1065a) de prijs die hij aanbeveelt aan de eigenaar of koper. De prijsvorken verstrekt door Arcanes zijn indicatief; de mandaatprijs wordt vastgesteld door de Makelaar onder zijn eigen professionele verantwoordelijkheid; 1066b) het gebruik dat hij maakt van de rapporten, pitch cards, beschrijvingen en e-mails gegenereerd door het Platform, met inbegrip van de mededeling ervan aan derden; 1067c) de conformiteit van zijn praktijk met zijn deontologische (BIV-Code) en wettelijke verplichtingen.`,indemnity:`6.2. Vrijwaring. De Makelaar verbindt zich ertoe DIGITAL ARCANES BV/SRL, haar bestuurders en medewerkers te vrijwaren en schadeloos te stellen voor elke vordering, rechtsvordering, vervolging, schadeclaim of boete afkomstig van: 1068a) een eigenaar, koper, huurder of elke andere derde aan wie de Makelaar informatie, rapporten of inhoud verkregen via het Platform zou hebben meegedeeld; 1069b) een toezichthoudende autoriteit (BIV, FOD Economie, FSMA) naar aanleiding van het gebruik dat de Makelaar van de Dienst maakt. 1070 1071Deze vrijwaring dekt directe en indirecte schade, met inbegrip van redelijke verdedigingskosten (advocatenhonoraria).`,limitation:"6.3. Beperking. De vrijwaringsverplichting is niet van toepassing indien de schade rechtstreeks en uitsluitend voortvloeit uit opzettelijke fout of grove fout van DIGITAL ARCANES BV/SRL."},"7_ip":{title:"7. Intellectuele Eigendom",arcanes:"7.1. Eigendom van Arcanes. De broncode, algoritmen, rekenmodellen, rapporttemplates, databank, het merk « Arcanes » en alle visuele elementen van het Platform zijn exclusief eigendom van DIGITAL ARCANES BV/SRL, beschermd door Boek XI van het Wetboek van Economisch Recht (auteursrecht en rechten van databankenproducenten).",license:`7.2. Licentie Makelaar. De Makelaar ontvangt een beperkte, niet-exclusieve, niet-overdraagbare en herroepbare gebruikslicentie om: 1072a) de Agent Pro Dienst te gebruiken in het kader van zijn beroepsactiviteit; 1073b) de gegenereerde rapporten, pitch cards en resultaten mee te delen aan zijn klanten, prospects en eigenaars, langs elektronische weg of in druk; 1074c) de gegevens van het Platform te integreren in zijn eigen commerciële presentaties, op voorwaarde dat de vermelding « Gegevens Arcanes â ter indicatie » behouden blijft.`,prohibitions:`7.3. Verboden. De Makelaar is het met name verboden om: 1075a) de rapporten, gegevens of inhoud door te verkopen, in sublicentie te geven of te herverdelen aan een concurrent of als zelfstandig commercieel product; 1076b) enige vorm van scraping, geautomatiseerde extractie of systematische reproductie van de databank toe te passen; 1077c) de vermeldingen van intellectuele eigendom, disclaimers of « Arcanes »-credits op de gegenereerde documenten te verwijderen of te wijzigen; 1078d) de Dienst te gebruiken voor de ontwikkeling van een concurrerend product of dienst.`,agent_data:"7.4. Gegevens van de Makelaar. De door de Makelaar verstrekte gegevens (nota's, foto's, pandinformatie) blijven z
1078ijn eigendom. De Makelaar kan op elk moment de export ervan aanvragen."},"8_confidentiality":{title:"8. Vertrouwelijkheid",mutual:"8.1. Wederzijdse verplichting. Elke Partij verbindt zich ertoe alle informatie van commerciële, technische of strategische aard waarvan zij kennis heeft in het kader van de uitvoering van de Dienst als vertrouwelijk te behandelen en niet aan derden mee te delen zonder voorafgaand schriftelijk akkoord van de andere Partij.",agent_notes:`8.2. Nota's van de Makelaar. De informatie die de Makelaar invoert in het veld « makelaarsnota's » (prospectcontext, situatie van de eigenaar, concurrerende makelaars, urgentie) wordt als strikt vertrouwelijk beschouwd. Arcanes: 1079a) gebruikt deze nota's uitsluitend om de toon van gegenereerde inhoud (rapporten, e-mails) te personaliseren; 1080b) citeert nooit letterlijk de inhoud van de nota's in de gegenereerde documenten; 1081c) geeft deze nota's aan geen enkele derde door, met inbegrip van de eigenaar; 1082d) verwijdert deze nota's op verzoek van de Makelaar of bij opzegging van het account.`,exceptions:`8.3. Uitzonderingen. De vertrouwelijkheidsverplichting is niet van toepassing op informatie die: 1083a) reeds publiek beschikbaar was op het moment van mededeling; 1084b) publiek is geworden zonder fout van de ontvangende Partij; 1085c) waarvan de openbaarmaking wordt vereist door een gerechtelijke of administratieve autoriteit.`,duration:"8.4. Duur. De vertrouwelijkheidsverplichting blijft van kracht gedurende een periode van twee (2) jaar na beëindiging van het contract."},"9_acceptable_use":{title:"9. Aanvaardbaar Gebruik",authorized:`9.1. Toegestaan gebruik. De Makelaar mag de Agent Pro Dienst uitsluitend gebruiken in het kader van zijn vastgoedbemiddelingsactiviteit, voor: 1086a) het voorbereiden en onderbouwen van zijn afspraken met eigenaars; 1087b) het genereren van rapporten en pitch cards bestemd voor zijn klanten en prospects; 1088c) het opstellen van aankondigingsbeschrijvingen voor panden waarvoor hij het mandaat heeft; 1089d) het verzenden van opvolgingsmails naar eigenaars met wie hij een professioneel contact heeft gehad.`,emails:`9.2. Geautomatiseerde emails â Verantwoordelijkheid van de Makelaar. De Makelaar garandeert: 1090a) dat hij beschikt over een geldige rechtsgrond (gerechtvaardigd professioneel belang of precontractuele relatie) om elke eigenaar die een geautomatiseerde e-mail ontvangt te contacteren; 1091b) dat hij het systeem van geautomatiseerde emails niet gebruikt voor ongewenste commerciële massaprospectie; 1092c) dat hij elk verzoek tot uitschrijving van een eigenaar onmiddellijk verwerkt. 1093Bij klacht van een bestemmeling draagt de Makelaar de volledige verantwoordelijkheid overeenkomstig artikel 6.2.`,prohibitions:`9.3. Verboden. Het is uitdrukkelijk verboden om: 1094a) inloggegevens te delen of toegang tot het account te verlenen aan een onbevoegde derde; 1095b) enige vorm van scraping, crawling of geautomatiseerde gegevensextractie van het Platform toe te passen; 1096c) de Dienst te gebruiken voor de ontwikkeling van een concurrerend product of dienst; 1097d) de Dienst te gebruiken voor onwettige, lasterlijke of met de openbare orde strijdige doeleinden; 1098e) de technische limieten van de Dienst te omzeilen (quota's, toegangsbeperkingen).`,abnormal:"9.4. Abnormaal gebruik. Arcanes behoudt zich het recht voor om de toegang van een Makelaar tijdelijk op te schorten in geval van abnormaal gebruik, met name: verbinding vanaf een buitensporig aantal terminals, onevenredig generatievolume, of ongeautoriseerd programmatisch gebruik. De Makelaar wordt per e-mail op de hoogte gebracht en kan contact opnemen met de support voor verduidelijking."},"10_gdpr":{title:"10. Persoonsgegevens en AVG",roles:`10.1. Rollen. In het kader van de Agent Pro Dienst: 1099a) treedt de Makelaar op als verwerkingsverantwoordelijke in de zin van artikel 4(7) van de AVG voor de gegevens van eigenaars (e-mails, namen, pandadressen) die hij in het Platform invoert; 1100b) treedt DIGITAL ARCANES BV/SRL op als verwerker in de zin van artikel 28 van de AVG voor de verwerking van deze gegevens.`,dpa:`10.2. Verwerkingsovereenkomst (DPA). De verwerkingsvoorwaarden zijn beschreven in de DPA Bijlage toegankelijk op arcanes.be/pro/dpa, die integraal deel uitmaakt van deze AV Pro. Deze bijlage beschrijft: 1101a) de aard en het doel van de verwerking; 1102b) de categorieën gegevens en betrokken personen; 1103c) de toegelaten subverwerkers (Anthropic PBC voor tekstgeneratie â Zero Data Retention modus); 1104d) de technische en organisatorische beveiligingsmaatregelen; 1105e) de verplichtingen in geval van een gegevenslek.`,agent_obligations:`10.3. Verplichtingen van de Makelaar. Als verwerkingsverantwoordelijke: 1106a) garandeert de Makelaar te beschikken over een geldige rechtsgrond voor het verzamelen en doorgeven aan Arcanes van de persoonsgegevens van eigenaars; 1107b) is de Makelaar verantwoordelijk voor het beantwoorden van verzoeken tot uitoefening van AVG-rechten (inzage, wissing, overdraagbaarheid) van eigenaars; 1108c) informeert de Makelaar de eigenaars over de verwerking van hun gegevens, met inbegrip van het beroep op Arcanes als verwerker.`,privacy:"10.4. Privacybeleid. De verwerking van de persoonsgegevens van de Makelaar zelf (account, verbinding, facturatie) is beschreven in het algemene Privacybeleid toegankelijk op arcanes.be/privacy."},"11_liability":{title:"11. Aansprakelijkheid van Arcanes en Beschikbaarheid",obligation:"11.1. Middelenverbintenis. Arcanes is gehouden aan een middelenverbintenis met betrekking tot de beschikbaarheid van de Dienst, de nauwkeurigheid van de algoritmische berekeningen en de kwaliteit van de gegenereerde teksten.",availability:"11.2. Beschikbaarheid. Arcanes streeft ernaar de Dienst 24/7 toegankelijk te houden, met een beschikbaarheidsdoelstelling van 99% buiten gepland onderhoud. Bij onderhoud dat een onderbreking veroorzaakt, wordt de Makelaar binnen een redelijke termijn op de hoogte gebracht. Arcanes garandeert geen ononderbroken beschikbaarheid en kan niet aansprakelijk
1108worden gesteld voor de gevolgen van een tijdelijke onbeschikbaarheid.",exclusions:`11.3. Uitsluitingen van aansprakelijkheid. Arcanes wijst elke aansprakelijkheid af voor: 1109a) indirecte schade, met inbegrip van bedrijfsverlies, verlies van klanten, winstderving, verlies van mandaten of gegevensverlies; 1110b) enig nadeel voortvloeiend uit een beslissing van de Makelaar of een derde genomen op basis van de analyses, schattingen of inhoud gegenereerd door het Platform; 1111c) fouten, benaderingen of ongepaste formuleringen in de door AI gegenereerde teksten; 1112d) de onjuistheid, onvolledigheid of veroudering van brongegevens (Statbel, kadaster, EPC, advertenties) verstrekt door derden; 1113e) het gebruik dat de Makelaar van de resultaten maakt in strijd met deze AV Pro.`,cap:"11.4. Aansprakelijkheidsplafond. Behoudens in geval van opzet, grove fout, of aantasting van het leven, de lichamelijke integriteit of de gezondheid, is de totale en cumulatieve financiële aansprakelijkheid van Arcanes jegens de Makelaar uitdrukkelijk beperkt tot het totale bedrag dat door de Makelaar is betaald in het kader van de Agent Pro Dienst gedurende de twaalf (12) maanden voorafgaand aan het schadeverwekkende feit.",force_majeure:"11.5. Overmacht. Arcanes kan niet aansprakelijk worden gesteld in geval van overmacht in de zin van artikel 5.226 van het Belgisch Burgerlijk Wetboek, met name: natuurramp, pandemie, cyberaanval, algemene infrastructuurstoring (AWS, Supabase, Anthropic, Stripe), overheids- of regelgevende beslissing. Bij overmacht van meer dan 90 dagen kan elke Partij het contract opzeggen. Ongebruikte credits worden pro rata terugbetaald."},"12_billing":{title:"12. Abonnement en Facturatie",credits:"12.1. Credits. De toegang tot de Agent Pro Dienst werkt via een creditsysteem. Elke credit maakt het mogelijk een prospectrapport of pitch card te genereren voor een bepaald pand. De geldende tarieven worden weergegeven op de Tarieven-pagina van het Platform.",pricing:"12.2. Prijzen. Prijzen zijn in Euro (â¬), Belgische BTW van 21% inbegrepen. Facturen zijn beschikbaar op aanvraag via [email protected].",validity:"12.3. Geldigheid van credits. Credits zijn vierentwintig (24) maanden geldig vanaf de aankoopdatum. De Makelaar wordt per e-mail gewaarschuwd 30 dagen en 7 dagen vóór het vervallen. Na deze termijn zijn vervallen credits definitief verloren.",modification:"12.4. Tariefwijziging. Arcanes behoudt zich het recht voor tarieven te wijzigen voor nieuwe bestellingen. De toepasselijke tarieven zijn die welke gelden op het moment van validatie van de bestelling. Bij wijziging van tarieven voor lopende abonnementen wordt de Makelaar minstens 30 dagen vóór inwerkingtreding geïnformeerd.",payment:"12.5. Betaling. Betaling is onmiddellijk verschuldigd bij bestelling via bankkaart (Stripe). Bankgegevens worden nooit opgeslagen op de servers van Arcanes."},"13_termination":{title:"13. Opzegging",by_agent:"13.1. Opzegging door de Makelaar. De Makelaar kan zijn Agent Pro account op elk moment sluiten via de accountinstellingen of op verzoek aan [email protected]. De sluiting brengt het definitieve verlies van ongebruikte credits met zich mee, tenzij anders overeengekomen.",by_arcanes_notice:"13.2. Opzegging door Arcanes â met opzegtermijn. Bij schending van deze AV Pro kan Arcanes de toegang tot het account opschorten of opzeggen met een opzegtermijn van vijftien (15) dagen per e-mail, gedurende welke de Makelaar zijn situatie kan regulariseren.",by_arcanes_immediate:"13.3. Opzegging door Arcanes â zonder opzegtermijn. Bij ernstige schending (fraude, scraping, inbreuk op de beveiliging, gebruik van de Dienst voor onwettige activiteiten, ongewenste massaprospectie) kan Arcanes de toegang onmiddellijk opschorten zonder opzegtermijn.",by_arcanes_no_fault:"13.4. Opzegging door Arcanes â zonder fout van de Makelaar. Bij stopzetting van de Agent Pro Dienst (beslissing van de Uitgever, herstructurering) worden ongebruikte credits pro rata terugbetaald tegen het aankooptarief. De Makelaar wordt minstens 60 dagen vóór de stopzetting op de hoogte gebracht.",data:`13.5. Lot van de gegevens. Bij opzegging: 1114a) kan de Makelaar de export van zijn gegevens (Art. 20 AVG) aanvragen binnen 30 dagen na sluiting; 1115b) worden de gegevens van de Makelaar (rapporten, nota's, panden) verwijderd binnen 30 dagen na sluiting, behoudens wettelijke bewaarplicht (facturen: 7 jaar); 1116c) worden de door de Makelaar ingevoerde eigenaargegevens verwijderd overeenkomstig de DPA.`},"14_general":{title:"14. Algemene Bepalingen",law:"14.1. Toepasselijk recht. Deze AV Pro worden beheerst door het Belgisch recht, met inbegrip van het Wetboek van Economisch Recht en het Burgerlijk Wetboek.",jurisdiction:"14.2. Jurisdictie. Bij geschillen zullen de Partijen trachten binnen dertig (30) dagen tot een minnelijke schikking te komen. Bij gebrek daaraan zijn de rechtbanken van het gerechtelijk arrondissement Waals-Brabant exclusief bevoegd.",severability:"14.3. Deelbaarheid. Indien een bepaling van deze AV Pro nietig of onuitvoerbaar wordt verklaard, blijven de overige bepalingen van kracht. De nietige bepaling wordt vervangen door een geldige bepaling die het dichtst aansluit bij het economische doel dat door de Partijen werd nagestreefd.",assignment:"14.4. Overdracht. Arcanes kan de rechten en verplichtingen voortvloeiend uit deze AV Pro overdragen aan een derde (in geval van fusie, overname of herstructurering), op voorwaarde dat de Makelaar minstens gelijkwaardige voorwaarden geniet. De Makelaar kan zijn rechten niet overdragen zonder voorafgaand sc
1116hriftelijk akkoord van Arcanes.",entirety:"14.5. Volledigheid. Deze AV Pro, met inbegrip van de DPA Bijlage, vormen de volledige overeenkomst tussen de Partijen betreffende de Agent Pro Dienst en vervangen elke eerdere overeenkomst over hetzelfde onderwerp.",modifications:"14.6. Wijzigingen. Arcanes behoudt zich het recht voor deze AV Pro te wijzigen. Bij substantiële wijziging wordt de Makelaar minstens dertig (30) dagen vóór inwerkingtreding per e-mail geïnformeerd. Indien de Makelaar de nieuwe voorwaarden niet aanvaardt, kan hij zijn account opzeggen vóór de inwerkingtreding. Voortgezet gebruik van de Dienst na de datum van inwerkingtreding geldt als aanvaarding.",proof:"14.7. Bewijsovereenkomst. De Partijen komen overeen dat de elektronische geschriften die tussen hen worden uitgewisseld als bewijs dienen en geldig de inhoud van hun uitwisselingen en verbintenissen aantonen."}}},Y4={title:"Wettelijke Vermeldingen",subtitle:"Wettelijke informatie betreffende de uitgave en hosting van het Arcanes-platform, in overeenstemming met het Belgisch Wetboek van Economisch Recht (Boek XII).",lastUpdate:"Laatste update",effectiveDate:"28 februari 2026",footer_links:{terms:"Algemene Gebruiksvoorwaarden",privacy:"Privacybeleid",cookies:"Beheer mijn cookies"},sections:{"1_editor":{title:"1. Uitgever van het Platform",intro:"Het Arcanes-platform, toegankelijk via arcanes.be, wordt uitgegeven door:",labels:{name:"Bedrijfsnaam",form:"Rechtsvorm",address:"Maatschappelijke zetel",bce:"Ondernemingsnummer (KBO)",vat:"BTW-nummer",email:"Contact e-mail"},values:{name:"DIGITAL ARCANES",form:"Besloten vennootschap met beperkte aansprakelijkheid (BV/SRL)",address:`Rue des 4 Carrés 4 11171325 Chaumont-Gistoux (Dion-Valmont), België`,bce:"1033.931.611",vat:"BE 1033.931.611",email:"[email protected]"},activity:"Activiteit: Beslissingsondersteunend platform voor vastgoedinvesteringsanalyse in België."},"2_director":{title:"2. Redactioneel Verantwoordelijke",intro:"De redactioneel verantwoordelijke van het Arcanes-platform is:",values:{name:"Yann Barbery",function:"Zaakvoerder / Oprichter",email:"[email protected]"},labels:{function:"Functie:",email:"E-mail:"},footer:"De redactioneel verantwoordelijke is verantwoordelijk voor de inhoud die op het platform wordt gepubliceerd, in overeenstemming met de geldende wettelijke bepalingen."},"3_hosting":{title:"3. Hosting",intro:"Het Arcanes-platform wordt gehost door:",providers:[{name:"Lovable (GPT Engineer AB)",desc:"Frontend hosting en CDN (Content Delivery Network)",region:"Regio: Europese Unie",website:"Website: lovable.dev"},{name:"Supabase Inc.",desc:"Backend, database en authenticatie â Cloudinfrastructuur gebaseerd op AWS (Amazon Web Services)",region:"Regio: EU-WEST (Parijs, Frankrijk)",website:"Website: supabase.com"}],compliance:"Naleving: Alle gegevens worden gehost op servers in de Europese Unie, in overeenstemming met de Algemene Verordening Gegevensbescherming (AVG).",note:"ð¡ Opmerking: Voor vragen over de hostinginfrastru
1117ctuur of de locatie van de gegevens, neem contact op met:"},"4_ip":{title:"4. Intellectuele Eigendom",sub_1:{title:"4.1. Rechten",text:`Alle elementen waaruit het Arcanes-platform bestaat (structuur, ontwerp, grafische elementen, teksten, logo's, databases, software, broncode, algoritmen, merken, enz.) zijn exclusief eigendom van DIGITAL ARCANES BV/SRL of zijn onderworpen aan regelmatige gebruikslicenties. 1118 1119Deze elementen worden beschermd door Belgische en Europese wetten inzake intellectuele eigendom, met name Boek XI van het Belgisch Wetboek van Economisch Recht (auteursrecht, naburige rechten, databases) en toepasselijke internationale verdragen.`},sub_2:{title:"4.2. Naam en visuele identiteit Arcanes",text:`De naam "Arcanes", evenals alle bijbehorende logo's en visuals, zijn exclusief eigendom van DIGITAL ARCANES BV/SRL en vormen onderscheidende elementen van haar commerciële identiteit. 1120 1121Elk gebruik, reproductie of weergave van de naam "Arcanes" of de visuele elementen zonder voorafgaande schriftelijke toestemming is ten strengste verboden en kan de burgerlijke aansprakelijkheid van de dader met zich meebrengen, met name op grond van oneerlijke mededinging en bescherming van de handelsnaam.`},sub_3:{title:"4.3. Gebruikslicentie",text:`De toegang tot het platform verleent gebruikers een privé, persoonlijk, niet-overdraagbaar en niet-exclusief gebruiksrecht op de aangeboden inhoud en diensten, voor de duur van hun registratie op het Platform. 1122 1123Het volgende is met name verboden zonder voorafgaande schriftelijke toestemming van DIGITAL ARCANES BV/SRL:`,list:`- Gehele of gedeeltelijke reproductie van de site of de inhoud ervan 1124- Weergave, verspreiding, wijziging of aanpassing van de elementen van de site 1125- Extractie of substantieel hergebruik van gegevens (massale scraping) 1126- Decompilatie, reverse engineering of elke poging tot toegang tot de broncode 1127- Commercieel gebruik van de inhoud zonder voorafgaand akkoord 1128- Verwijdering of wijziging van vermeldingen van intellectuele eigendom`},sub_4:{title:"4.4. Gebruikersinhoud",text:`Simulaties en rapporten die door de gebruiker via het platform worden gegenereerd, blijven zijn eigendom. De gebruiker kan ze vrij downloaden, gebruiken en delen. 1129 1130DIGITAL ARCANES BV/SRL behoudt zich echter het recht voor om geaggregeerde en geanonimiseerde gegevens te gebruiken voor statistische doeleinden en verbetering van de dienst, in overeenstemming met het Privacybeleid.`},sub_5:{title:"4.5. Melding van inbreuk",text:"Als u meent dat inh
1130oud die op het platform is gepubliceerd inbreuk maakt op uw intellectuele eigendomsrechten, kunt u dit melden aan:"}},"5_privacy":{title:"5. Bescherming van Persoonsgegevens",text_1:"De verwerking van persoonsgegevens van gebruikers wordt geregeld door ons Privacybeleid, toegankelijk via:",button:"Raadpleeg het Privacybeleid",text_2:"Dit beleid beschrijft de verzamelde gegevens, de doeleinden van de verwerking, uw AVG-rechten en de veiligheidsmaatregelen die zijn geïmplementeerd in overeenstemming met Verordening (EU) 2016/679 (AVG) en de Belgische wet van 30 juli 2018 betreffende de bescherming van natuurlijke personen in verband met de verwerking van persoonsgegevens.",text_contact:"Voor vragen over uw persoonsgegevens, contacteer:"},"6_cookies":{title:"6. Cookies en Trackers",text_1:"Het Arcanes-platform gebruikt cookies en vergelijkbare technologieën om de goede werking te garanderen en de gebruikerservaring te verbeteren.",text_2:"Het beheer van uw cookievoorkeuren wordt verzorgd door onze geïntegreerde toestemmingsmanager, conform de AVG en de ePrivacy-richtlijn.",button:"Beheer mijn cookievoorkeuren",text_3:"U kunt uw keuzes met betrekking tot cookies op elk moment wijzigen door op de bovenstaande link te klikken of via de knop 'Cookies beheren' onderaan elke pagina."},"7_links":{title:"7. Hyperlinks",sub_1:{title:"7.1. Uitgaande links",text:`Het platform kan hyperlinks bevatten naar andere websites (vastgoedsites, openbare instellingen, partners, enz.). DIGITAL ARCANES BV/SRL heeft geen controle over deze sites van derden en wijst alle aansprakelijkheid af voor hun inhoud, beschikbaarheid of praktijken inzake gegevensbescherming. 1131 1132De toegang tot deze sites van derden gebeurt op eigen risico van de gebruiker, die kennis moet nemen van hun gebruiksvoorwaarden en privacybeleid.`},sub_2:{title:"7.2. Inkomende links",text:`Het plaatsen van hyperlinks naar het Arcanes-platform is toegestaan, op voorwaarde dat deze links het platform niet in een ongunstig of misleidend daglicht stellen. 1133 1134Framing (integratie van het platform in een kader of iframe op een site van derden) is ten strengste verboden zonder voorafgaande schriftelijke toestemming.`}},"8_credits":{title:"8. Credits en Technologieën",intro:"Het Arcanes-platform is ontwikkeld met behulp van de volgende technologieën en diensten:",items:{frontend:{label:"Frontend",val:"React, TypeScript, Tailwind CSS"},backend:{label:"Backend & Database",val:"Supabase (PostgreSQL)"},hosting:{label:"Hosting",val:"Lovable (frontend / CDN, EU) + AWS EU-WEST Parijs (backend)"},payment:{label:"Betalingen",val:"Stripe"},email:{label:"Transactionele e-mails",val:"Google Workspace (SMTP)"},workflows:{label:"Automatisering",val:"n8n Cloud (Duitsland, EU)"},cookies:{label:"Cookiebeheer",val:"vanilla-cookieconsent (open source, MIT)"},analytics:{label:"Analytics",val:"Google Analytics 4 (na toestemming)"}},footer:`Iconen: Lucide Icons (MIT-licentie) 1135Lettertypen: Outfit (SIL Open Font License, lokaal gehost)`},"9_law":{title:"9. Toepasselijk Recht en Jurisdictie",text:`Deze wettelijke vermeldingen worden beheerst door het Belgisch recht, met inbegrip van het Wetboek van Economisch Recht. 1136 1137In geval van betwisting over de interpretatie of toepassing van deze wettelijke vermeldingen zijn de rechtbanken van het gerechtelijk arrondissement Waals-Brabant bevoegd, onverminderd het recht van de consument om de rechtbank van zijn woonplaats te vatten overeenkomstig Verordening (EU) nr. 1215/2012. 1138 1139Overeenkomstig Verordening (EU) nr. 524/2013 kan de consument gebruik maken van het platform voor Onlinegeschillenbeslechting (ODR) van de Europese Commissie: https://ec.europa.eu/consumers/odr`},"10_contact":{title:"10. Contact",intro:"Voor vragen over deze wettelijke vermeldingen of het Arcanes-platform:",values:{name:"DIGITAL ARCANES BV/SRL",address:"Rue des 4 Carrés 4, 1325 Chaumont-Gistoux, België",email:"[email protected]"},labels:{address:"Adres:",email:"E-mail:"}}}},Z4={title:"Privacybeleid",subtitle:"Bescherming van uw persoonsgegevens overeenkomstig de Algemene Verordening Gegevensbescherming (AVG) en de Belgische wet van 30 juli 2018.",badge:"AVG-conform",lastUpdate:"Laatste update",effectiveDate:"28 februari 2026",footer_links:{terms:"Algemene Gebruiksvoorwaarden",legal:"Wettelijke Vermeldingen",cookies:"Beheer mijn cookies"},sections:{"0_preamble":{title:"Inleiding",text:`Dit Privacybeleid beschrijft hoe DIGITAL ARCANES BV/SRL (hierna "wij", "ons" of "Arcanes") uw persoonsgegevens verzamelt, gebruikt, opslaat en beschermt wanneer u ons platform gebruikt, toegankelijk via arcanes.be. 1140 1141Wij hechten het grootste belang aan de bescherming van uw privacy en verbinden ons ertoe
1141Verordening (EU) 2016/679 van 27 april 2016 (AVG) en de Belgische wet van 30 juli 2018 betreffende de bescherming van natuurlijke personen in verband met de verwerking van persoonsgegevens na te leven.`,note:"ð Dit beleid is een aanvulling op de Algemene Gebruiksvoorwaarden die beschikbaar zijn op arcanes.be/terms"},"1_controller":{title:"1. Verwerkingsverantwoordelijke",intro:"De verwerkingsverantwoordelijke voor uw persoonsgegevens in de zin van artikel 4(7) AVG is:",info:{name:"DIGITAL ARCANES",form:"Rechtsvorm: Besloten vennootschap met beperkte aansprakelijkheid (BV/SRL)",address:"Maatschappelijke zetel: Rue des 4 Carrés 4, 1325 Chaumont-Gistoux (Dion-Valmont), België",bce:"Ondernemingsnummer (KBO): 1033.931.611",vat:"BTW-nummer: BE 1033.931.611",email:"E-mail: [email protected]"},dpo_title:"Contact voor gegevensbeschermingsvragen",dpo_text:`Overeenkomstig artikel 37 van de AVG zijn wij, gezien de aard en omvang van onze activiteiten, niet verplicht een Functionaris voor Gegevensbescherming (DPO) aan te stellen. 1142 1143Voor vragen over de bescherming van uw persoonsgegevens of om uw rechten uit te oefenen, neem rechtstreeks contact met ons op via: [email protected]`},"2_collected":{title:"2. Verzamelde Persoonsgegevens",intro:"Wij verzamelen en verwerken de volgende categorieën persoonsgegevens:",sub_1:{title:"2.1. Identificatie- en contactgegevens",list:`- E-mailadres: Verplicht voor het aanmaken van een account en authenticatie 1144- Naam en voornaam: Optioneel, als u deze in uw profiel invult 1145- Telefoonnummer: Optioneel, als u dit verstrekt voor ondersteuning`},sub_2:{title:"2.2. Authenticatie- en beveiligingsgegevens",list:`- Wachtwoord: Versleuteld (gehasht) en nooit in leesbare tekst opgeslagen 1146- Sessietokens: Automatisch gegenereerd om uw verbinding te behouden 1147- IP-adres: Automatisch verzameld bij verbinding om veiligheidsredenen 1148- User-agent: Informatie over uw browser en apparaat`},sub_3:{title:"2.3. Gebruiks- en navigatiegegevens",list:`- Verbindingslogs: Datum, tijd, duur van sessies 1149- Gebruiksgeschiedenis: Bezochte pagina's, gebruikte functies 1150- Gebruiksstatistieken: Aantal uitgevoerde analyses, verbruikte credits 1151- Gebruikersvoorkeuren: Accountinstellingen, taal, weergavethema`},sub_4:{title:"2.4. Vastgoedsimulatie-gegevens",list:`- Geanalyseerde vastgoedprojecten: Adressen, kenmerken van gezochte eigendommen 1152- Zoekcriteria: Budget, locatie, type eigendom 1153- Financiële simulaties: Ingevoerde parameters, gegenereerde resultaten 1154- Gegenereerde rapporten: Gedownloade of geraadpleegde analyses`,alert:"ð Deze gegevens zijn gekoppeld aan uw account en worden niet gedeeld met derden. Ze worden uitsluitend gebruikt om u de gevraagde analyses te verstrekken en vormen in geen geval een gepersonaliseerd beleggingsadvies."},sub_5:{title:"2.5. Betalings- en facturatiegegevens",list:`- Facturatiegegevens: Naam, factuuradres (indien verstrekt) 1155- Transactiegeschiedenis: Datum, bedrag, betaalmethode 1156- Creditsaldo: Beschikbare en verbruikte credits`,alert:"ð Belangrijk: Uw bankgegevens (kaartnummer, CVV) worden NOOIT op onze servers verzameld of opgeslagen. Alle betalingen worden veilig verwerkt door Stripe, een PCI-DSS niveau 1 gecertificeerde dienstverlener."},sub_6:{title:"2.6. Communicatiegegevens",list:`- Uitgewisselde e-mails: Correspondentie met onze ondersteuning 1157- Supporttickets: Bijstandsverzoeken, bugmeldingen 1158- Ervaringen: Feedback tijdens de bètafase (optioneel)`},sub_7:{title:"2.7. Cookies",text:"Wij gebruiken cookies en vergelijkbare technologieën. Het beheer van uw cookievoorkeuren wordt verzorgd door onze geïntegreerde toestemmingsmanager, conform de AVG en de ePrivacy-richtlijn. Voor meer informatie, zie de sectie Cookies hieronder of beheer uw voorkeuren via de knop 'Cookies beheren' onderaan elke pagina."},sub_8:{title:"2.8. Gegevens verwerkt namens vastgoedmakelaars (Agent Pro dienst)",list:`In het kader van de Agent Pro dienst verwerkt Arcanes bepaalde gegevens namens de geabonneerde vastgoedmakelaars: 1159- E-mailadressen van vastgoedeigenaars: verstrekt door de makelaar voor het verzenden van opvolgingsmails na bezoek 1160- Vertrouwelijke nota's van de makelaar: gebruikt om de toon van gegenereerde communicatie te personaliseren, nooit letterlijk geciteerd 1161- Betrokkenheidsgegevens van bezoekers: bekeken pagina's, uitgevoerde simulaties, tijd besteed o
1161p een pandpagina (geanonimiseerde gegevens, zonder persoonlijke identificatie van de bezoeker)`,alert:"ð Voor deze verwerkingen is de vastgoedmakelaar verwerkingsverantwoordelijke in de zin van de AVG. Arcanes treedt op als technische verwerker (Art. 28 AVG) en hergebruikt deze gegevens niet voor andere doeleinden. Tekstuele inhoud (rapporten, beschrijvingen, e-mails) wordt gegenereerd via de Anthropic Claude API in Zero Data Retention modus (geen bewaring van gegevens door de AI-leverancier)."}},"3_legal_basis":{title:"3. Rechtsgrond en Doeleinden",intro:"Overeenkomstig artikel 6 van de AVG verwerken wij uw persoonsgegevens op de volgende rechtsgronden:",table_headers:["Doel van verwerking","Rechtsgrond (AVG)","Betrokken gegevens"],table_rows:[{purpose:`Aanmaken en beheren van uw account 1162(Toegang tot het Platform)`,basis:"Art. 6(1)(b) - Uitvoering contract",data:"E-mail, wachtwoord, voorkeuren"},{purpose:`Verlenen van vastgoedanalysediensten 1163(Genereren van simulaties)`,basis:"Art. 6(1)(b) - Uitvoering contract",data:"Simulatiegegevens, vastgoedprojecten"},{purpose:"Beheer van betalingen en facturatie",basis:`Art. 6(1)(b) - Uitvoering contract 1164Art. 6(1)(c) - Wettelijke verplichting`,data:"Facturatiegegevens, transactiegeschiedenis"},{purpose:`Verzenden van transactionele e-mails 1165(Bevestiging, reset, meldingen)`,basis:"Art. 6(1)(b) - Uitvoering contract",data:"E-mailadres"},{purpose:"Klantondersteuning en technische bijstand",basis:"Art. 6(1)(b) - Uitvoering contract",data:"E-mail, supporttickets, technische logs"},{purpose:"Beveiliging en fraudepreventie",basis:"Art. 6(1)(f) - Gerechtvaardigd belang",data:"IP, logs, user-agent, verdacht gedrag"},{purpose:`Verbetering van het Platform 1166(Geaggregeerde analytics, zonder individuele profilering)`,basis:"Art. 6(1)(f) - Gerechtvaardigd belang",data:"Geanonimiseerde/geaggregeerde gebruiksgegevens"},{purpose:`Publieksmeting (Google Analytics 4) 1167(Geanonimiseerde modus, na toestemming)`,basis:"Art. 6(1)(a) - Toestemming",data:"Geanonimiseerd IP, bezochte pagina's, duur"},{purpose:"Marketingcommunicatie (nieuwsbrieven)",basis:"Art. 6(1)(a) - Toestemming",data:"E-mail (uitschrijving mogelijk)"},{purpose:"Wettelijke en boekhoudkundige verplichtingen",basis:"Art. 6(1)(c) - Wettelijke verplichting",data:"Facturen, betalingsgegevens"},{purpose:`Betrokkenheidstracking bezoekers (Agent Pro dienst) 1168(Geanonimiseerde interessemeting op pandpagina's)`,basis:"Art. 6(1)(f) - Gerechtvaardigd belang van de vastgoedmakelaar (verwerkingsverantwoordelijke)",data:"Geraadpleegde pagina's, uitgevoerde simulaties, bezoekduur (zonder persoonlijke identificatie)"},{purpose:`Verzending opvolgingsmails aan eigenaars (Agent Pro dienst) 1169(Geautomatiseerde reeks na bezoek, op verzoek van de makelaar)`,basis:`Art. 6(1)(f) - Gerechtvaardigd belang van de makelaar (verwerkingsverantwoordelijke) 1170Arcanes = verwerker (Art. 28 AVG)`,data:"E-mail eigenaar, naam, adres pand, marktgegevens"}],note:"ð Opmerking over gerechtvaardigd belang: Wanneer wij een beroep doen op gerechtvaardigd belang, hebben wij een evenredigheidstoets uitgevoerd om ervoor te zorgen dat uw rechten en vrijheden niet onevenredig worden aangetast."},"4_recipients":{title:"4. Ontvangers van Gegevens",intro:"Uw persoonsgegevens kunnen worden gedeeld met de volgende categorieën ontvangers:",sub_1:{title:"4.1. Bevoegd personeel",list:`- Medewerkers van Arcanes die toegang nodig hebben tot de gegevens 1171- Allen gebonden aan een vertrouwelijkheidsplicht`},sub_2:{title:"4.2. Verwerkers",intro:"Wij maken gebruik van de volgende verwerkers (Art. 28 AVG):"},table_headers:["Verwerker","Dienst","Locatie","Waarborgen"],table_rows:[{name:"Supabase Inc.",service:"Database, authenticatie, opslag",loc:"EU (Parijs, Frankrijk)",guarantee:"Servers EU - AVG-conform"},{name:"Stripe Inc.",service:"Beveiligde betalingen",loc:"VS",guarantee:"PCI-DSS niveau 1 + Data Privacy Framework (DPF)"},{name:"Google LLC (Analytics)",service:"Publieksmeting (GA4)",loc:"VS",guarantee:"DPF + IP-anonimisering + Voorafgaande toestemming"},{name:"Google LLC (SMTP)",service:"Verzenden van transactionele e-mails via Google Worksp
1171ace",loc:"VS",guarantee:"DPF + Standaardcontractbepalingen (SCB)"},{name:"Lovable (GPT Engineer AB)",service:"Frontend hosting en CDN",loc:"EU",guarantee:"Servers EU - AVG-conform"},{name:"n8n GmbH",service:"Workflowautomatisering (n8n Cloud)",loc:"EU (Duitsland)",guarantee:"Servers EU - AVG-conform"},{name:"Anthropic PBC",service:"AI-tekstgeneratie voor de Agent Pro dienst (narratieve rapporten, pandbeschrijvingen, opvolgingsmails)",loc:"VS",guarantee:"DPF + API zonder gegevensbewaring (Zero Data Retention) + SCB"}],note:"Al onze verwerkers zijn gebonden door verwerkingsovereenkomsten conform artikel 28 AVG. Het beheer van de cookietoestemming wordt verzorgd door een lokaal gehoste, geïntegreerde beheerder (vanilla-cookieconsent, open source) die geen gegevens doorgeeft aan derden.",sub_3:{title:"4.3. Autoriteiten",list:`- Gerechtelijke, administratieve of fiscale autoriteiten, indien wettelijk vereist 1172- Toezichthoudende instanties (bv. GBA) op verzoek`},sub_4:{title:"4.4. Wat wij NIET doen",alert:`ð« Wij verkopen of verhuren uw persoonsgegevens nooit aan derden. 1173- Geen doorverkoop aan gegevensmakelaars 1174- Geen deling met adverteerders van derden 1175- Geen individuele profilering: Google Analytics 4 is geconfigureerd in geaggregeerde en geanonimiseerde modus, zonder het samenstellen van individuele profielen voor reclamedoeleinden`}},"5_transfers":{title:"5. Doorgifte buiten de EU",intro:"Sommige van onze verwerkers (Stripe, Google, Anthropic) kunnen uw gegevens verwerken buiten de Europese Economische Ruimte (VS). De volgende verwerkers zijn gehost in de EU en geven geen aanleiding tot doorgifte buiten de EU: Supabase (Parijs), Lovable (EU), n8n (Duitsland).",sub_1:{title:"5.1. Passende waarborgen (Art. 46 AVG)",list:`- Standaardcontractbepalingen (SCB) van de Europese Commissie 1176- Data Privacy Framework (DPF) EU-VS (adequaatheidsbesluit van 10 juli 2023) 1177- Transfer Impact Assessments (TIA)`},info:"U kunt een kopie van de waarborgen verkrijgen door contact met ons op te nemen via [email protected].",supa_alert:"ð¡ Gegevens gehost in de EU: Uw hoofdgegevens (account, simulaties, credits) worden gehost op Supabase in de EU (regio EU-WEST, Parijs). Alleen de betalingsdiensten (Stripe), publieksmeting (GA4, na toestemming) en het verzenden van transactionele e-mails (Google SMTP) houden een doorgifte naar de VS in, onder de hierboven beschreven waarborgen."},"6_retention":{title:"6. Bewaartermijnen",intro:"Wij bewaren uw gegevens alleen zo lang als nodig overeenkomstig het beginsel van gegevensminimalisatie (Art. 5 AVG):",table_headers:["Categorie","Termijn","Grondslag"],table_rows:[{cat:"Actief account",duration:"Duur activiteit + 30 dagen na verwijdering",basis:"Contract"},{cat:"Inactief account",duration:"24 maanden inactiviteit â verwijdering (melding 30 dagen vooraf)",basis:"Gerechtvaardigd belang"},{cat:"Simulatiegegevens",duration:"Zolang het account actief is",basis:"Contract"},{cat:"Facturen / Boekhouding",duration:"7 jaar (afgesloten boekjaar)",basis:"Wet (Art. III.86 WER)"},{cat:"Betalingsgegevens",duration:"5 jaar (fiscale verjaring)",basis:"Wet"},{cat:"Beveiligingslogs",duration:"Maximaal 12 maanden",basis:"Beveiliging"},{cat:"Support (Tickets)",duration:"3 jaar na afsluiting",basis:"Bewijs"},{cat:"Analytics-cookies",duration:"Maximaal 6 maanden",basis:"Toestemming"}],footer:"Na afloop van deze termijnen worden de gegevens definitief verwijderd of onomkeerbaar geanonimiseerd. De gebruiker wordt 30 dagen voor automatische verwijdering van een inactief account per e-mail op de hoogte gebracht."},"7_security":{title:"7. Beveiliging van Gegevens",intro:"Overeenkomstig artikel 32 van de AVG implementeren wij de volgende beveiligingsmaatregelen:",tech:{title:"7.1. Technische maatregelen",list:`- HTTPS/TLS-versleuteling voor alle communicatie 1178- Gehashte wachtwoorden (bcrypt) 1179- Veilige authenticatie via Supabase Auth 1180- Firewall en DDoS-bescherming 1181- Regelmatige versleutelde back-ups 1182- Periodieke beveiligingstests 1183- Lokaal gehoste lettertypen (geen verzoeken aan servers van derden)`},org:{title:"7.2. Organisatorische maatregelen",list:`- Beperkte toegang volgens het principe van minste privilege
1184- Vertrouwelijkheidsovereenkomsten voor alle medewerkers 1185- Opleiding en bewustmaking inzake gegevensbescherming 1186- Gedocumenteerde procedures voor incidentbeheer`},breach:{title:"7.3. Gegevenslek",text:`In geval van een inbreuk op persoonsgegevens (Art. 33-34 AVG): 1187- Melding aan de Gegevensbeschermingsautoriteit (GBA) binnen 72 uur 1188- Informatie aan betrokken gebruikers als de inbreuk een hoog risico vormt voor hun rechten en vrijheden`}},"8_rights":{title:"8. Uw Rechten (AVG)",intro:"U beschikt over de volgende rechten op grond van Hoofdstuk III van de AVG:",list:[{title:"8.1. Recht van inzage (Art. 15)",desc:"Bevestiging krijgen dat wij uw gegevens verwerken en een kopie ontvangen, evenals details over de doeleinden en ontvangers."},{title:"8.2. Recht op rectificatie (Art. 16)",desc:"Onnauwkeurige of onvolledige gegevens corrigeren rechtstreeks vanuit uw account of op verzoek."},{title:"8.3. Recht op wissing (Art. 17)",desc:"De verwijdering van uw gegevens vragen ('recht om vergeten te worden'), tenzij een wettelijke verplichting (bv. boekhouding 7 jaar) hun bewaring vereist."},{title:"8.4. Recht op beperking (Art. 18)",desc:"Het gebruik van uw gegevens tijdelijk bevriezen in geval van betwisting van hun juistheid of de rechtmatigheid van de verwerking."},{title:"8.5. Recht op overdraagbaarheid (Art. 20)",desc:"Uw verstrekte gegevens terugkrijgen in een gestructureerd en machineleesbaar formaat (JSON/CSV) om ze aan een andere dienstverlener over te dragen. U kunt op elk moment een export van uw gegevens aanvragen via [email protected]."},{title:"8.6. Recht van bezwaar (Art. 21)",desc:"Een verwerking op basis van gerechtvaardigd belang weigeren of u op elk moment verzetten tegen direct marketing."},{title:"8.7. Intrekking van toestemming (Art. 7)",desc:"Uw toestemming op elk moment intrekken voor verwerkingen die hierop zijn gebaseerd (analytics-cookies, nieuwsbrief), zonder dat dit de rechtmatigheid van de eerdere verwerking aantast."},{title:"8.8. Geautomatiseerde besluitvorming (Art. 22)",desc:"Het platform biedt analyses en simulaties uitsluitend ter informatie. Er worden geen geautomatiseerde besluiten genomen die juridische of vergelijkbare gevolgen voor u hebben. Scores en resultaten vormen geen gepersonaliseerde beleggings-, aankoop- of verkoopadvies."},{title:"8.9. Klacht (Art. 77)",desc:"Een klacht indienen bij de Gegevensbeschermingsautoriteit (GBA) als u meent dat uw rechten zijn geschonden."}],apd_info:`Gegevensbeschermingsautoriteit (GBA) 1189Drukpersstraat 35, 1000 Brussel 1190[email protected] 1191https://www.gegevensbeschermingsautoriteit.be`,exercise:"Om uw rechten uit te oefenen: [email protected]. Antwoordtermijn: 1 maand (verlengbaar met 2 maanden bij complexe verzoeken, overeenkomstig artikel 12(3) AVG). De uitoefening van deze rechten is gratis."},"9_cookies":{title:"9. Cookies",text:"Wij gebruiken cookies overeenkomstig de ePrivacy-richtlijn (2002/58/EG) en de AVG. De toestemming wordt beheerd door onze geïntegreerde beheerder (vanilla-cookieconsent), lokaal gehost zonder doorgifte van gegevens aan derden.",types:`Soorten cookies: 1192- Strikt noodzakelijk: werking van de site, authenticatie, beveiliging (altijd actief, geen toestemming vereist) 1193- Analytics: Google Analytics 4 (enkel na uitdrukkelijke toestemming)`,cookie_table_headers:["Naam","Type","Doel","Duur","Uitgever"],cookie_table_rows:[{name:"sb-*-auth-token",type:"Noodzakelijk",purpose:"Authenticatie en gebruikerssessie (Supabase)",duration:"Sessie / 1 jaar",provider:"1st party"},{name:"cc_cookie",type:"Noodzakelijk",purpose:"Onthouden van uw cookietoestemmingskeuzes",duration:"6 maanden",provider:"1st party"},{name:"_ga",type:"Analytics",purpose:"Unieke Google Analytics-identificatie (geanonimiseerd)",duration:"2 jaar",provider:"3rd party (Google)"},{name:"_ga_*",type:"Analytics",purpose:"Bewaring van GA4-sessiestatus",duration:"2 jaar",provider:"3rd party (Google)"}],alert:"â ï¸ Belangrijk: Google Analytics is geconfigureerd in 'IP-anonimiseringsmodus' en wordt pas geactiveerd na uw uitdrukkelijke toestemming. Wij gebruiken GA4 niet voor individuele profilering of remarketing. U kunt deze toestemming op elk moment intrekken via de knop 'Cookies beheren' onderaan de pagina."},"10_minors":{title:"10. Minderjarigen",text:"Het Arcanes-platform is bestemd voor meerderjarigen (18 jaar en ouder). Wij verzamelen niet bewust persoonsgegevens van minderjarigen. Indien wij ontdekken dat gegevens van minderjarigen zijn verzameld, worden deze zo snel mogelijk verwijderd."},"11_changes":{title:"11. Wijzigingen",text:"Wij behouden ons het recht voor dit Privacybeleid te wijzigen. Bij substantiële wijzigingen wordt u minstens 15 dagen voor inwerkingtreding per e-mail geïnformeerd. De datum van de laatste update staat bovenaan deze pagina vermeld."},"12_contact":{title:"12. Contact",text:`Voor vragen over dit Privacybeleid of de bescherming van uw gegevens: [email protected] 1194 1195DIGITAL ARCANES BV/SRL 1196Rue des 4 Carrés 4, 1325 Chaumont-Gistoux, België`}}},J4={locked:"Gereserveerd voor Premium leden",unlock:"Ontgrendel deze functie",cta:"Upgrade naar Premium",memberBadge:"Premium Lid",description:"Krijg toegang tot deze exclusieve functie door Premium lid te worden.",packInfo:"Beschikbaar met de Smart, Investeerder en Pro+ pakketten",triLocked:"De TRI & Rendement simulator is gereserveerd voor Premium leden",triDescription:"Bereken de interne rentevoet van uw vastgoedinvesteringen met onze geavanceerde simulator.",mapPredictLocked:"Marktvoorspellingen zijn gereserveerd voor Premium leden",header:{analyseHabitation:"Woninganalyse",anal
1196yseInvestissement:"Investeringsanalyse",analyseImmeubleRapport:"Opbrengsteigendomanalyse",plateformeAnalyse:"Vastgoedanalyseplatform",genere:"Gegenereerd op",peb:"EPC"},actions:{imprimerPDF:"Afdrukken / PDF",nouvelleAnalyse:"Nieuwe analyse"},investissement:{hero:{tri:"IRR 10 jaar",triBenchmark:"Markt benchmark: {{moyen}}% (gemiddeld) ⢠{{excellent}}% (uitstekend)",cashflow:"Maandelijkse cashflow",cashflowSubtext:"Netto cashflow na maandlasten, kosten en belasting",prixAcquisition:"Aankoopprijs",prixPerM2:"{{prix}}/m²",surface:"Oppervlakte",badges:{excellent:"Uitstekend",bon:"Goed",moyen:"Gemiddeld",faible:"Zwak",cashflowPositif:"Positieve cashflow",autofinancement:"Zelffinanciering",effortRequis:"Spaarinspanning vereist"}},rendements:{title:"Rendementen",rendementBrut:"Bruto rendement",rendementNet:"Netto rendement",rendementNetNet:"Netto-netto rendement",rendementFondsPropres:"Rendement eigen vermogen",surFondsPropres:"op eigen vermogen",explicationFondsPropres:"Rendement berekend op uw initiële inbreng, rekening houdend met het hefboomeffect van krediet",moyen:"Gem",bon:"Goed",excellent:"Uitst",performance:{excellent:"Uitstekend",bon:"Goed",moyen:"Gemiddeld",faible:"Zwak"},noteTitle:"Goed om te weten",noteExplication:"De gekleurde zones geven de referentiedrempels van de Belgische markt aan. Hoe langer en groener de balk, hoe beter het rendement in vergelijking met de markt."},tri:{title:"Intern Rendement (IRR)",sur10ans:"Over 10 jaar",apportInitial:"Initiële inbreng",apportTresorerie:"Liquiditeitsinbreng",cashflowsNegatifs:"Cumulatieve negatieve cashflows",investissementTotal:"Totale reële investering",gainsSur10ans:"Winsten over 10 jaar",cashflowsCumules:"Cumulatieve cashflows",plusValueRevente:"Meerwaarde verkoop",desGains:"van de winsten",multiplicateurApport:"Inbreng multiplicator",explicationMultiplicateur:"Uw inbreng van {{apport}} wordt {{valeur}}",benchmarksMarche:"Waargenomen marges op de Belgische markt",moyen:"Gemiddeld",bon:"Goed",excellent:"Uitstekend",performance:{excellent:"Uitstekend",bon:"Goed",moyen:"Gemiddeld",faible:"Zwak"}},projection:{title:"Projectie over 10 jaar",annee:"Jaar",loyerEffectif:"Effectieve huur",charges:"Kosten",mensualites:"Maandlasten",impot:"Belasting",cashflow:"Cashflow",capitalRestant:"Resterend kapitaal",an:"Jaar",final:"Finaal",moyenne:"Gemiddelde",annee10:"Jaar 10 - Verkoop",fluxRevente:"Verkoopstroom",gainRevente:"Netto winst na verkoop",cashflowTotal:"Totale cashflow",fluxCumules:"Cumulatieve stromen + verkoop",noteTitle:"Goed om te weten",noteExplication:"Projectie gebaseerd op indexatiehypotheses voor huren en kosten. Belangrijkste jaren weergegeven (1, 2, 3, 5, 7, 10)."},revente:{title:"Verkoopscenario (Jaar 10)",prixAchat:"Aankoopprijs",valeurFuture:"Toekomstige waarde",sur10ans:"over 10 jaar",investissementInitial:"Initiële investering",appreciation:"waardering",fraisVente:"Verkoopkosten",fraisAgence:"Makelaarskosten",fraisNotaire:"Notariskosten verkoper",totalFrais:"Totale verkoopkosten",detteRestante:"Resterende schuld",produitNet:"Netto verkoopopbrengst",apresDetteEtFrais:"Na aflossing schuld en kosten",plusValue:"Meerwaarde",plusValueBrute:"Bruto meerwaarde",taxePlusValue:"Meerwaardebelasting",noteFiscale:"Fiscale opmerking",explicationFiscale:"In het algemeen voorziet de Belgische fiscaliteit in een specifiek regime voor onroerende meerwaarden op basis van de bezitsduur. Deze informatie is louter indicatief en vormt geen fiscaal advies. Raadpleeg een fiscaal adviseur voor uw persoonlijke situatie."},optimisations:{title:"Vergelijking huurmarkt",loyerOptimise:"Geoptimaliseerde huur",loyerAligneMarche:"De huidige huur is in lijn met of hoger dan de marktprijzen",potentielDetecte:"Verschil met de lokale markt gedetecteerd",loyerInferieurMarche:"De huidige huur lijkt lager dan de lokale marktprijzen",potentiel:"potentieel",comparaison:"Vergelijking huidige huur vs markt",loyerActuel:"Huidige huur/m²",prixMarche:"Marktprijs/m²",gainPotentiel:"Potentiële winst bij afstemming op de markt",parMois:"Per maand",parAn:"Per jaar",sur10ans:"Over 10 jaar",conseil:"Vergelijkend gegeven",explicationConseil:"Ter indicatie, de gemiddelde markthuur in deze zone bedraagt ongeveer {{prix}} â¬/m². Het verschil met de huidige huur wordt hierboven weergegeven."}},shared:{priceAnalysis:{title:"Waardeanalyse",verdictPrix:"Prijspositionering",positionnementMarche:"Marktpositionering",sousEvalue:"Onder de schatting",prixJuste:"Binnen de geschatte marge",surEvalue:"Boven de schatting",prixAcquisition:"Aankoopprijs",valeurMarche:"Geschatte marktwaarde",ecartMontant:"Verschil in waarde",bonusAtouts:"Toegepaste bonusvoordelen",verdict:{sousMarche:"Onder de marktschatting",audessusM
1196arche:"Boven de marktschatting",aligneMarche:"Binnen de marge van de schatting"},explication:{bon:"De aankoopprijs ligt onder de geschatte marktwaarde volgens ons algoritme.",mauvais:"De aankoopprijs ligt boven de geschatte marktwaarde volgens ons algoritme. Er zou onderhandelingsruimte kunnen bestaan.",neutre:"De aankoopprijs ligt binnen de marge van de marktschatting voor dit type woning."}},revenus:{title:"Huurinkomsten",loyerMensuel:"Maandelijkse huur",loyerMensuelTotal:"Totale maandelijkse huur",parMois:"per maand",loyerMoyenPorte:"Gemiddelde huur / unit",loyerM2:"Huur per m²",loyerAnnuelBrut:"Jaarlijkse brutohuur",vacanceLocative:"Leegstandsvoorziening",taux:"Tarief",perteVacanceAnnuelle:"Jaarlijkse voorziening",loyerAnnuelEffectif:"Effectieve jaarlijkse huur",apresVacance:"Na aftrek leegstandsvoorziening",noteTitle:"Goed om te weten",noteExplication:"De effectieve huur houdt rekening met een voorziening voor huurleegstand (risico op afwezigheid van huurder). Dit bedrag is een voorzichtige schatting van uw inkomsten."},travaux:{title:"Aanschafkosten",prixAcquisition:"Aankoopprijs",droitsEnregistrement:"Registratierechten",taux:"Tarief",fraisNotaire:"Notariskosten",totalFraisAcquisition:"Totale aankoopkosten",reductionHabitationUnique:"Vermindering enige woning",economieRealisee:"Gerealiseerde besparing",abattement:"Vermindering",travaux:"Werken",travauxEnergetiques:"Energetische werken",travauxFinition:"Afwerkingswerken",etat:"Initiële staat",totalTravaux:"Totale werken",investissementTotal:"Totale investering",acquisitionFraisTravaux:"Aankoop + Kosten + Werken"},location:{title:"Locatie",adresse:"Adres",codePostal:"Postcode",ville:"Stad",province:"Provincie",region:"Gewest"},financement:{title:"Financiering",montantEmprunte:"Geleend bedrag",sur:"over",ans:"jaar",apportRequis:"Vereiste inbreng",duTotal:"van het totaal",tauxInteret:"Rentetarief",tauxFixe:"Vast tarief",duree:"Looptijd",mensualite:"Maandlast",detailAnnee1:"Detail jaar 1",interetsPayes:"Betaalde rente",capitalRembourse:"Afgelost kapitaal",interets:"Rente",capital:"Kapitaal",coutTotalCredit:"Totale kredietkosten",interetsTotaux:"Totale rente over de looptijd"},fiscalite:{title:"Fiscaliteit",habitationUnique:"Enige woning",bienSupplementaire:"Extra woning",rcNonIndexe:"Niet-geïndexeerd KI",rcIndexe:"Geïndexeerd KI",baseImposable:"Belastbare basis",droitsEnregistrement:"Registratierechten",montantPaye:"Betaald bedrag",tauxApplique:"Toegepast tarief",reduction:"Verlaging",economieRealisee:"Gerealiseerde besparing",abattementApplique:"Toegepaste korting",fiscaliteLocative:"Verhuurbelasting",interetsDeductibles:"Aftrekbare rente (Jaar 1)",revenuNetImposable:"Netto belastbaar inkomen (Jaar 1)",tauxMarginal:"Marginaal tarief",impotLocatif:"Verhuurbelasting (Jaar 1)",economieTitle:"Gerealiseerde fiscale besparing",economieDesc:"Dankzij toegepaste verlagingen"},charges:{title:"Jaarlijkse lasten",precompte:"Onroerende voorheffing",precompteDetail:"Geïndexeerd KI: {{montant}}",assuranceIncendie:"Brandverzekering",assurancePNO:"Eigenaarsverzekering",maintenance:"Structureel onderhoud",copro:"Mede-eigendomslasten",total:"Totaal lasten",perMonth:"ofwel {{amount}}/maand",chargesCopro:"Kosten mede-eigendom",maintenanceStructurelle:"Structureel onderhoud",entretienAnnuel:"Lopend onderhoud",totalCharges:"Totale jaarlijkse kosten",parMois:"oftewel {{montant}}/maand",repartition:"Verdeling van kosten",chargesObligatoires:"Verplichte kosten",chargesEntretien:"Onderhoudskosten"},financing:{title:"Financieringsplan",subtitle:"Financieringsstructuur en kredietkost",apport:"Eigen Inbreng",credit:"Bankkrediet",mensualite:"Maandtermijn",capitalInterets:"Kapitaal + Rente",ofInvestment:"van de investering",coutCredit:"Totale Kredietkost",capitalEmprunte:"Geleend kapitaal",interetsTotaux:"Totale rente",totalRembourse:"Totaal terugbetaald",mensualitesDe:"maandtermijnen van",repartition:"Financieringsverdeling",apportLabel:"Eigen inbreng",creditLabel:"Krediet"},security:{title:"Veiligheidsindicatoren",loyerEquilibre:"Evenwichtshuur",pourCashflowZero:"Voor cashflow = 0",couvertureDette:"Schulddekking",excellent:"Uitstekend",correct:"Correct",risque:"Risicovol",pointMort:"Break-even",patrimoineSupApport:"Vermogen > Inbreng",noteTitle:"Goed om te weten",noteText:"De schulddekkingsratio meet het vermogen van het pand om de maandtermijnen te dekken. Ratio > 1.0 wijst op zelffinanciering."},sensitivity:{title:"Gevoeligheidsanalyse",subtitle:"Impact van sleutelvariabelen op de IRR",scenario:"Scenario",tri:"IRR",delta:"Πvs Basis",observation:"Opmerking",base:"Basisscenario",baseDesc:"Huidige configuratie",loyerPlus:"Huur +10%",loyerPlusDesc:"Huuroptimalisatie",tauxPlus:"Kredietrente +1%",tauxPlusDesc:"Rentestijging",reventeMoins:"Verkoop -10%",reventeMoinsDesc:"Dalende markt",insightTitle:"Observatie",insightText:"In deze simulatie is de IRR gevoelig voor de huur en de verkoopprijs. Een huurvariatie van +10% zou theoretisch een rentestijging van +1% compenseren.",impactVisuel:"Visuele impact op de IRR"},amortization:{title:"Aflossingstabel",annee:"Jaar",an:"Jaar",loyer:"Huur",cashflow:"Cashflow",dette:"Schuld",patrimoine:"Netto Vermogen",remboursement:"Aflossingsvoortgang"},taxation:{title:"Fiscaliteit (Jaar 1)",baseImposable:"Belastbare basis (KI geïndexeerd)",interetsDeductibles:"Aftrekbare rente",revenuNetImposable:"Netto belastbaar inkomen",impotLocatif:"Huurbelasting",aucun:"Geen",noteNegative:"De leningrente overschrijdt het geïndexeerd KI. Geen huurbelasting.",notePositive:"Het huurinkomen wordt belast tegen het marginale tarief op basis van het geïndexeerd KI + 40%."},energy:{title:"Energieprestaties",actuel:"Huidig",objectif:"Doel",amelioration:"Verbetering",conforme:"Conform",dejaConforme:"Reeds conform aan EPC-normen",dejaConformeDesc:"Dit pand voldoet al aan de energienormen",aucunTravauxRequis:"Geen energetische werken vereist",coutTravaux:"Geschatte werkkosten",primes:"Geschatte premies",coutNet:"Netto kosten na premies",aprePrimes:"Na aftrek van premies",rentabilite:"Energierendabiliteit",economieAnnuelle:"Jaarlijkse besparing",roi:"Terugverdientijd",ans:"ja
1196ar",impactEnergetique:"Energie-impact",avant:"Voor",apres:"Na",economie:"Besparing"}},habitation:{score:{title:"Arcanes Synthetische Index",prixVsMarche:"Prijs vs Markt",performancePEB:"EPC Prestatie",accessibilite:"Bereikbaarheid",poids:"Gewicht",scoreTotal:"Totale score",baseSur:"Gebaseerd op",points:"punten",methodo:"Methodologie",explicationMethodo:"De Arcanes-index aggregeert 3 gewogen criteria: prijs/schatting verhouding (40%), energieprestatie (35%) en bereikbaarheid/locatie (25%). Dit is een synthetische index, geen aanbeveling."},budget:{title:"Maandelijks Budget",budgetTotal:"Totaal Budget",parMois:"per maand",credit:"Krediet",charges:"Kosten",energie:"Energie",duBudget:"van het budget",budgetAnnuel:"Jaarlijks budget",mois:"maanden"},projection:{title:"Vermogensprojectie 10 jaar",patrimoineNet:"Netto vermogen jaar 10",sur10ans:"over 10 jaar",multiplicateurApport:"Inbreng multiplicator",evolutionBien:"Waardeontwikkeling van het pand",valeurActuelle:"Huidige waarde",plusValueEstimee:"Geschatte meerwaarde",valeurFuture:"Toekomstige waarde",remboursementCredit:"Aflossing krediet",capitalRembourse:"Afgelost kapitaal",duCredit:"van het krediet",detteRestante:"Resterende schuld",remboursé:"Afgelost",restant:"Resterend",interetsPayes:"Betaalde rente",retourSurApport:"Rendement op inbreng",explicationRetour:"Netto winst ten opzichte van uw initiële inbreng",noteTitle:"Goed om te weten",noteExplication:"Deze projectie gaat uit van een gemiddelde waardestijging van het pand van 2% per jaar. Uw netto vermogen is de waarde van het pand minus de resterende schuld."}},cashflow:{title:"Cashflow & Liquiditeit",perMonth:"/maand",perYear:"/jaar",soit:"oftewel",projection10ans:"Projectie 10 jaar",fluxCumules:"Cumulatieve stromen",sur10ans:"over 10 jaar",impact1an:"Impact 1 jaar",impact5ans:"Impact 5 jaar",impact10ans:"Impact 10 jaar",scenarios:{positif:{title:"Positieve cashflow",subtitle:"Kasoverschot",description:"Dit pand genereert maandelijks een kasoverschot. De huurinkomsten dekken alle kosten, de lening en belastingen met een surplus."},neutre:{title:"Zelffinanciering",subtitle:"Budgettair evenwicht",description:"Dit pand is in zelffinanciering. De huurinkomsten dekken ongeveer de maandlasten en kosten. De verrijking gebeurt via de aflossing van het kapitaal."},negatif:{title:"Spaarinspanning",subtitle:"Langetermijninvestering",description:"Dit pand vereist een maandelijkse spaarinspanning. De verrijking gebeurt via de geleidelijke aflossing van het kapitaal en de potentiële meerwaarde bij verkoop."}},bonASavoir:"Goed om te weten:",notepedagogique:"Cashflow weerspiegelt niet de totale verrijking. Zelfs bij negatieve cashflow verrijkt u zich via de aflossing van het geleende kapitaal en de potentiële meerwaarde van het pand."},score:{sur:"/{{max}}"}},Q4={description:"See Beyond the Bricks.",navigation:"Navigatie",simulators:"Simulatoren",communes:"Gemeenten",pricing:"Prijzen",contact:"Contact",blog:"Blog",legal:"Juridisch",legalNotice:"Juridische informatie",privacy:"Privacybeleid",terms:"Gebruiksvoorwaarden",manageCookies:"Cookies beheren",allRightsReserved:"Alle rechten voorbehouden",about:"Over ons",infoOnly:"Simulatoren alleen ter informatie.",dataDeletion:"Gegevensverwijdering"},X4={defaultTitle:"Gegevensvalidatie",defaultInstructions:"Controleer en vul de onderstaande informatie in.",closeConfirm:{title:"Formulier sluiten?",description:"Als u nu sluit, wordt uw credit terugbetaald en gaan de ingevoerde gegevens verloren.",cancel:"Doorgaan met validatie",confirm:"Sluiten en terugbetalen"},global:{title:"Globale gegevens van het pand",complete:"Volledig"},units:{title:"Details per eenheid",complete:"volledig",completePlural:"volledig",toComplete:"aan te vullen",toCompleteLabel:"Aan te vullen"},fields:{select:"Selecteren...",enterValue:"Voer een waarde in...",yes:"Ja",no:"Nee"},buttons:{abandon:"Afbreken (credit terugbetaald)",validate:"Valideren en analyse starten",analyzing:"Analyse bezig..."},immeubleWarning:{title:"Let op: Opbrengsteigendom",message:"Advertenties voor opbrengsteigendommen missen vaak gedetailleerde informatie. Vul de gegevens van elke eenheid zorgvuldig in om een nauwkeurige analyse te garanderen."},context:{price:"Prijs",surface:"Oppervlakte",propertyType:"Type woning",notCommunicated:"N/B",notSpecified:"Niet gespecificeerd",descriptionTitle:"Advertentiebeschrijving",viewSource:"Bron bekijken",noDescription:"Geen beschrijving beschikbaar."},badges:{required:"Vereist"},unitTitle:"Eenheid {{number}}",fieldLabels:{type_bien:"Type",surface_habitable_m2:"Bewoonb. Opp. (m²)",lettre_peb:"EPB",etat_general:"Staat",parking:"Parking",terrasse:"Terras",jardin:"Tuin"},options:{etat_general:{freshlyRenovated:"Pas gerenoveerd",excellent:"Uitstekende staat",good:"Goed",toRefresh:"Op te frissen",toRenovate:"Te renoveren",toRestore:"Te restaureren"}}},eM={header:{title:"Nodig vrienden uit, word Premium lid",subtitle:"Laat je vrienden Arcanes ontdekken. Elke inschrijving brengt je dichter bij de Premium-status en geavanceerde functies."},status:{friendsProtected:"Doorverwezen vrienden",creditsEarned:"Verdiende credits"},benefits:{youGet:"Jij krijgt",youGetValue:"Ontgrendel je beloningen",friendGets:"Je vriend krijgt",friendGetsValue:"2 gratis credits"},emptyState:{title:"Nodig je eerste vriend uit!",subtitle:"Elke doorverwijzing brengt je dichter bij de Premium-status.",cta:"Uitnodigen via WhatsApp"},tiers:{starter:{name:"Beginner",reward:"-",description:"Begin het avontuur."},scout:{name:"De Verkenner",reward:"+1 Credit",description:"Eerste doorverwijzing!"},investor:{name:"De Investeerder",reward:"+5 Credits",description:"Je netwerk groeit."},visionary:{name:"De Visionair",reward:"PREMIUM",rewardAlt:"+10 Credits",description:"Toegang tot geavanceerde functies."},magnate:{name:"De Magnaat",reward:"+25 Credits",description:"Een echte leider."},baron:{name:"De Baron",reward:"Partner",description:"Gecertificeerd Arcanes-expert."}},progress:{title:"Je voortgang",friendsProgress:"{{current}}/{{target}} vrienden",visionaryGoal:"Doel: 10 vrienden",visionaryReward:"Ontgrendel Premium-status en geavanceerde functies",visionaryRewardAlt:"Verdien 10 bonuscredits",viewAllLevels:"Bekijk alle niveaus",hideLevels:"Verbergen",maxReached:"Maximaal niveau bereikt!"},sharing:{title:"Deel je doorverwijzingslink:",copy:"Kopiëren",copied:"Gekopieerd!",emailSubject:"Arcanes - 2 gratis vastgoedanalyses",whatsappMessage:"Hey! Ik geef je 2 gratis vastgoedanalyses op Arcanes. Test het voor je volgende bezichtiging:",previewLabel:"Voorgeschreven bericht:"},friends:"vriend",friendsPlural:"vrienden"},tM={tabs:{profile:"Profiel",security:"Beveiliging",notifications:"Meldingen"},nav:{back:"Terug",subtitle:"Beheer uw profiel en voorkeuren"},profile:{photo:"Profielfoto",photoDesc:"Uw avatar wordt automatisch gegenereerd op basis van uw initialen.",photo
1196Format:"Ondersteund formaat in de toekomst: JPG, PNG (max 2MB)",info:"Profielinformatie",username:"Gebruikersnaam",usernamePlaceholder:"Uw naam",usernameHint:"Deze naam wordt weergegeven in uw dashboard.",email:"E-mailadres",emailHint:"Het e-mailadres kan niet worden gewijzigd. Neem contact op met de ondersteuning indien nodig.",language:"Voorkeurstaal",memberSince:"Lid sinds",saving:"Opslaan...",save:"Wijzigingen opslaan"},security:{changePassword:"Wachtwoord wijzigen",changePasswordDesc:"Beveilig uw account met een nieuw wachtwoord",currentPassword:"Huidig wachtwoord",newPassword:"Nieuw wachtwoord",minChars:"Minimaal 8 tekens",confirmPassword:"Bevestig het nieuwe wachtwoord",changing:"Wijzigen...",changeBtn:"Wachtwoord wijzigen",activeSessions:"Actieve sessies",comingSoon:"Binnenkort beschikbaar",sessionsDesc:"U kunt binnenkort uw actieve sessies op verschillende apparaten bekijken en beheren."},notifications:{noNotifications:"Geen meldingen",noNotificationsDesc:"U wordt hier op de hoogte gebracht van belangrijke updates.",preferences:"Meldingsvoorkeuren",preferencesDesc:"Kies hoe u uw meldingen wilt ontvangen",inApp:"Melding in de app",byEmail:"Melding per e-mail",referralSignup:"ð Nieuwe doorverwezen aanmelding",referralSignupDesc:"Wanneer iemand een account aanmaakt met uw doorverwijzingscode",referralPurchase:"ð° Eerste aankoop van een doorverwezen gebruiker",referralPurchaseDesc:"Wanneer uw doorverwezen gebruiker zijn eerste credits koopt",referralMilestone:"â Doorverwijzingsmijlpaal bereikt",referralMilestoneDesc:"Wanneer u 10 actieve doorverwijzingen bereikt en de Premium-status ontgrendelt",general:"â¹ï¸ Algemene meldingen",generalDesc:"Andere systeemmeldingen en updates",emailNote:"Opmerking over e-mailmeldingen",emailNoteDesc:"E-mailmeldingen zijn binnenkort beschikbaar. U kunt uw voorkeuren nu al instellen.",loading:"Laden..."},dangerZone:{deleteAccount:"Account verwijderen",irreversible:"Onomkeerbare actie",delete:"Verwijderen",cancel:"Annuleren",confirmWord:"VERWIJDEREN",confirmText:"Typ <strong>{{word}}</strong> om de definitieve verwijdering van uw account en al uw gegevens te bevestigen.",confirm:"Bevestigen"},toasts:{profileSaved:"Profiel succesvol bijgewerkt",profileError:"Fout bij het opslaan",passwordMismatch:"De wachtwoorden komen niet overeen",passwordTooShort:"Het wachtwoord moet minimaal 8 tekens bevatten",passwordChanged:"Wachtwoord succesvol gewijzigd",passwordError:"Fout bij het wijzigen van het wachtwoord",confirmRequired:"Typ {{word}} om te bevestigen",accountDeleted:"Account verwijderd",accountDeleteError:"Fout bij het verwijderen van het account",prefsUpdated:"Voorkeuren bijgewerkt",prefsUpdatedDesc:"Uw meldingsvoorkeuren zijn opgeslagen.",prefsError:"Fout",prefsErrorDesc:"Kan de voorkeuren niet bijwerken."}},nM={home:{title:"Arcanes â Slimme vastgoedanalyse in België",description:"Analyseer elke Belgische vastgoedadvertentie in 10 seconden. Volledige evaluatierapporten, 6 gratis simulatoren, gegevens van 581 gemeenten."},freeAnalyse:{title:"Gratis analyse van vastgoedadvertentie | Arcanes",description:"Plak de link van een vastgoedadvertentie en ontvang een volledige analyse in 10 seconden. Score, prijs/m², EPC, huurrendement. Gratis."},simulateur:{title:"Gratis vastgoedsimulators â België | Arcanes",description:"Simuleer gratis uw notariskosten, leencapaciteit, huurrendement, EPB-impact en IRR in België. Zes online tools aangepast aan de Belgische vastgoedmarkt."},simulateurFraisActe:{title:"Simulator Notariskosten België 2026 | Arcanes",description:"Onmiddellijke berekening van uw notariskosten en registratierechten in Wallonië, Brussel en Vlaanderen. Officiële barema's 2026, gratis in 30 seconden."},simulateurPret:{title:"Berekening Hypothecaire Lening België 2026 â Gratis Simulator",description:"Bereken uw maandelijkse aflossing van uw hypothecaire lening in België: tarieven 2026, looptijd 15-30 jaar, totale kosten. Onmiddellijke simulatie, zonder inschrijving."},simulateurEmprunt:{title:"Simulator Leencapaciteit België 2026 | Arcanes",description:"Hoeveel kunt u lenen om te kopen in België? Onmiddellijke berekening op basis van uw inkomen, lasten en de tarieven 2026. Gratis, zonder inschrijving."},simulateurPEB:{title:"EPB-simulator België 2026 â Impact Vastgoedprijs",de
1196scription:"Welke impact heeft het EPB op de prijs van een onroerend goed in België? Berekening van de korting, renovatiescenario's, gegevens 3 regio's. Gratis."},simulateurRendement:{title:"Simulator huurrendement België | Arcanes",description:"Bereken het bruto en netto huurrendement van uw vastgoedinvestering. Lasten, leegstand en fiscaliteit inbegrepen."},simulateurPrixM2:{title:"Simulator prijs per m² per gemeente | Arcanes",description:"Schat de prijs per m² van een onroerend goed in elke Belgische gemeente. Bijgewerkte StatBel-gegevens."},simulateurTRI:{title:"IRR-simulator vastgoed België | Arcanes",description:"Bereken de IRR van uw huurinvestering in België: maandelijkse cashflow, nettovermogen, PDF-export inbegrepen. Gratis, zonder inschrijving."},tarifs:{title:"Tarieven â Premium vastgoedanalyses | Arcanes",description:"Ontdek onze formules voor vastgoedanalyse in België: van gratis analyse tot premium rapport met kwaliteitsscore, onderhandelingshulp en financiële projectie."},blog:{title:"Vastgoedblog België â Gidsen en analyses | Arcanes",description:"Marktanalyses, praktische gidsen en Belgische vastgoedgegevens. Feitelijke artikelen over EPC, notariskosten, huurrendement en investeren in België."},faq:{title:"FAQ & Vastgoedwoordenlijst | Arcanes",description:"Vind antwoorden op uw vragen over de Arcanes vastgoedanalyse en raadpleeg onze volledige woordenlijst van financiële en vastgoedtermen in België."},contact:{title:"Contacteer Arcanes â Support en vragen",description:"Een vraag over onze vastgoedanalyses? Contacteer het Arcanes-team. Snelle reactie gegarandeerd."},map:{title:"Interactieve kaart van Belgische gemeenten | Arcanes",description:"Verken de vastgoedgegevens van elke Belgische gemeente: mediaanprijzen, rendementen, investeringsscores en trends."},login:{title:"Inloggen | Arcanes",description:"Log in op uw Arcanes-account om toegang te krijgen tot uw vastgoedanalyses en tegoeden."},signup:{title:"Account aanmaken | Arcanes",description:"Maak gratis uw Arcanes-account aan en ontvang een gratis analysekrediet om ons platform te testen."},terms:{title:"Algemene voorwaarden | Arcanes",description:"Algemene voorwaarden van het Arcanes-platform. Vastgoedanalyse in België."},privacy:{title:"Privacybeleid | Arcanes",description:"Ontdek hoe Arcanes uw persoonlijke gegevens beschermt. GDPR-conform."},legal:{title:"Juridische vermeldingen | Arcanes",description:"Juridische vermeldingen van het Arcanes-platform. Uitgever: Digital Arcanes SRL, België. Juridische informatie, hosting en verantwoordelijkheden."}},rM={agent:{publishedToday:"Vandaag gepubliceerd",publishedYesterday:"Gisteren gepubliceerd",publishedAgo:"{{n}} dagen geleden gepubliceerd"},kpi:{surface:"Oppervlakte",rooms:"Kamers",peb:"EPC",condition:"Staat"},peb:{efficient:"Energiezuinig",good:"Goede prestatie",label:"EPC {{peb}}",heatingCost:"verwarming ~{{cost}}â¬/maand",learnMore:"Meer info",aboveAverage:"Het dominante label in {{commune}} is {{dom}} â dit pand presteert beter dan gemiddeld",communePct:"{{pct}}% van de woningen in de gemeente heeft een label A, B of C",controlled:"Een EPC C staat voor een beheerst verbruik",bestInsulated:"Met een EPC {{peb}} behoort dit pand tot de best geïsoleerde woningen op de markt",heatingEstimate:"Verwarming geschat op ~{{cost}}â¬/maand voor {{surface}}m² (basis 0,08â¬/kWh)"},quartier:{title:"Wonen in {{commune}}",connected:"Een goed verbonden buurt, nabij station {{gare}}",trains:"({{n}} treinen per dag)",wellServed:"Een buurt met goede verbindingen via het openbaar vervoer",marketUp:"De vastgoedmarkt is dynamisch met een prijsstijging van {{pct}}% in 5 jaar â een teken van een wijk in opkomst",transactionsHigh:"Met {{n}} transacties per jaar vinden panden snel een koper",transactionsMid:"Een vlotte markt met ongeveer {{n}} verkopen per jaar",newResidents:"De gemeente trekt nieuwe inwoners aan, wat de vraag ondersteunt",inhabitants:"{{n}} inwoners",transactionsYear:"{{n}} transacties/jaar",priceRising:"Stijgende prijzen",marketLiquid:"Markt {{label}}",attractive:"Aantrekkelijke leefomgeving",wellConnected:"Goed bereikbaar"},budget:{title:"Dit pand kost u",perMonth:"/maand",credit:"Krediet",precompte:"Onr. voorheffing",energy:"Energie",insurance:"Verzekering",narrativeAp
1196part:"Voor dit appartement aan {{prix}}, met {{apport}}% eigen inbreng over {{duree}} jaar aan {{taux}}%. Totaal budget: {{total}} (prijs + {{frais}} kosten). Exclusief mede-eigendomskosten.",narrativeMaison:"Voor deze woning aan {{prix}}, met {{apport}}% eigen inbreng over {{duree}} jaar aan {{taux}}%. Totaal budget: {{total}} (prijs + {{frais}} kosten)."},sim:{title:"Leningsimulatie",borrowed:"Geleend bedrag",monthly:"Maandelijkse aflossing",totalCredit:"Totale kredietkost",ofWhichInterest:"waarvan {{amount}} intresten",capitalVsInterest:"Kapitaal vs intresten per jaar",capital:"Kapitaal",interest:"Intresten",adjust:"Mijn simulatie aanpassen",contribution:"Eigen inbreng",rate:"Rentevoet",duration:"Looptijd",years:"{{n}} jaar",amortization:"Aflossingstabel bekijken",year:"Jaar",remaining:"Resterend"},costs:{title:"Aankoopkosten",price:"Prijs van het pand",totalFees:"Totale kosten",feesDetail:"Registratierechten {{pct}}% + notaris + admin",totalAcquisition:"Totale verwervingskost",detail:"Kostendetail bekijken",registration:"Registratierechten ({{pct}}%)",registrationRate:"Tarief enige eigen woning ({{region}}) â {{std}}% voor elke andere aankoop",registrationRateBxl:"12,5% na abattement van 200.000 ⬠op de belastbare grondslag (enige eigen woning, prijs ⤠600.000 â¬)",notary:"Notariskosten (BTW incl.)",admin:"Administratieve kosten",reducedRate:"Weergegeven tarief voor de aankoop van een enige eigen woning â uitgezonderd bijzondere gevallen (nieuwbouw met btw, bescheiden woning in Vlaanderen). Simuleer uw exacte situatie met de simulator aktekosten.",precompte:"Onroerende voorheffing",precompteDetail:"Dat is {{monthly}}/maand · Gemiddeld KI {{type}} in {{commune}}",precompteAppart:"appart.",precompteMaison:"woningen",precompteCalc:"Berekening bekijken",rcEstimate:"Geschat gemiddeld KI",communaux:"Gemeentelijke opcentiemen ({{n}})",provinceAvg:"Gem. provincie: {{n}}",provinciaux:"Provinciale opcentiemen (gem.)",minContribution:"Aanbevolen minimale eigen inbreng: {{amount}} (niet-financierbare kosten)"},yield:{title:"Huurpotentieel",rentEstimate:"Geschatte huurprijs",median:"Mediaan {{commune}}: {{amount}} â¬/maand (FOD MyRent)",gross:"Bruto rendement",net:"Geschat netto rendement",afterVacancy:"Na leegstand (5%) en kosten",detail:"Detail bekijken",annualIncome:"Jaarlijks huurinkomen",afterVacancyDetail:"Na leegstand (5%)",charges:"Geschatte kosten",chargesDetail:"Voorheffing + onderhoud (~1%)",totalInvestment:"Totale investering",totalInvestmentDetail:"Prijs + kosten",appartRent:"Appartementen in {{commune}} worden verhuurd voor gemiddeld {{amount}}⬠per maand",maisonRent:"Woningen in {{commune}} worden verhuurd voor gemiddeld {{amount}}⬠per maand",attractive:"Met een bruto rendement van {{pct}}% is dit een bijzonder aantrekkelijke markt voor vastgoedinvestering",aboveAvg:"Het bruto rendement van {{pct}}% ligt boven het Belgische gemiddelde",strongDemand:"De huurvraag is sterk â een huurder vinden zou geen probleem mogen zijn"},cta:{interested:"Interesse in dit pand?",budgetSummary:"Geschat budget: {{monthly}}/maand · Totale investering: {{total}}",visit:"Ik wil dit pand bezoeken",call:"of bellen:",stickyBudget:"Totale maandelijkse kost",stickyCustom:"Uw gepersonaliseerd budget",stickySimulate:"Mijn budget simuleren",stickyVisit:"Bezoeken"},qualify:{title:"Interesse in dit pand?",subtitle:"Laat uw gegevens achter, {{agent}} neemt contact met u op.",name:"Uw naam *",phone:"Telefoon",email:"E-mail",optionVisit:"Ik wil dit pand bezoeken",optionInfo:"Ik wil meer informatie",optionOffer:"Ik wil een bod doen",budget:"Mijn geschat budget: {{monthly}}/maand · inbreng {{apport}}%",send:"Verzenden",sending:"Verzenden...",sentTitle:"Bericht verzonden",sentSubtitle:"{{agent}} neemt snel contact met u op.",close:"Sluiten"},share:{whatsapp:"WhatsApp",copy:"Link kopiëren",copied:"â Gekopieerd"},pdf:{download:"Download het overzicht voor mijn bank",title:"Financieel overzicht",monthlyCost:"Totale maandelijkse kost",print:"Afdrukken / Opslaan als PDF",close:"Sluiten",acquisitionCosts:"Verwervingskosten",monthlyBudget:"Maandelijks budget",totalCredit:"Totale kredietkost",minContribution:"Minimale eigen inbreng",nonFinanceable:"Niet-financierbare kosten",chosenContribution:"Gekozen inbreng ({{pct}}%)",totalRepaid:"Totaal terugbetaald ({{n}} jaar)",ofWhichInterest:"Waarvan intresten",disclaimer:"Indicatieve simulatie · Geen kredietaanbod · Gegevens Statbel & FOD Financiën"},disclaimer:{text:"Indicatieve simulaties, geen financieel advies of kredietaanbod in de zin van de Belgische wet van 4 april 2014. Arcanes is geen erkende kredietbemiddelaar FSMA. Raadpleeg uw notaris en bank. Gegevens: Statbel, FOD Financiën, FOD MyRent."},footer:{powered:"Powered by Arcanes"},widget:{title:"Simuleer uw aankoop",subtitle:"Bereken de werkelijke kost van uw aankoop in België",address:"Adres van het pand",addressPlaceholder:"Bv: Jennerstraat 6, Elsene...",addressHint:"Optioneel â de gemeente volstaat voor de simulatie",orSearch:"of zoek op gemeente",commune:"Gemeente *",communePlaceholder:"Bv: Elsene, 1050...",type:"Type pand *",apartment:"Appartement",house:"Woning",surface:"Oppervlakte (m²)",price:"Aankoopprijs *",contribution:"Eigen inbreng",rate:"Rentevoet",duration:"Looptijd lening",simulate:"Mijn aankoop simuleren",simulating:"Simulatie bezig...",resultTitle:"Uw simulatie",monthlyTotal:"Totale maandelijkse kost",getDossier:"Mijn volledig dossier ontvangen",name:"Uw naam *",email:"Uw e-mail *",phone:"Telefoon (optioneel)",submit:"Mijn dossier ontvangen",submitting:"Verzenden...",successTitle:"Dossier verzonden!",successSubtitle:"Raadpleeg uw e-mail voor uw volledig interactief dossier.",newSimulation:"Nieuwe simulatie",powered:"Powered by Arcanes"},dossier:{title:"Uw aankoopdossier",subtitle:"Gepersonaliseerde simulatie",modified:"Aangepaste simulatie",original:"Oorspronkelijke waarden",adjusted:"Pas uw simulatie aan",price:"Aankoopprijs",contribution:"Inbreng",duration:"Looptijd",rate:"Rente",patrimony:"Netto vermogen op termijn",patrimonyDesc:"Waarde van het pand vs resterende schuld",propertyValue:"Geschatte waarde van het pand",remainingCapital:"Resterende schuld",netPatrimony:"Netto vermogen",amortization:"Aflossingstabel",byYear:"Per jaar",byMonth:"Per maand",showAll:"Alles tonen",ctaSignup:"Mijn Arcanes-ruimte aanmaken",ctaCommune:"Volledige analyse van {{commune}}",ctaSimulate:"Ander pand simuleren",loading:"Uw dossier wordt geladenâ¦",notFound:"Dit dossier bestaat niet of is niet meer beschikbaar.",recalculate:"Mijn simulatie herberekenen",budgetLabel:"Uw budget",mortgageFees:"Hypotheekkosten",comparableCommunes:"Vergelijkbare gemeenten",resaleScenario:"Verkoopscenario",collapse:"Inklappen",goFurther:"Ga verder",ctaSignupSub:"Volg uw simulaties en uw aankoopproject",ctaSimulateSub:"Test een ander budget of een andere gemeente"},email:{buyerSubject:"Uw aanvraag voor {{bien}} is doorgestuurd",buyerGreeting:"Hallo{{name}}",buyerBody:"Uw informatieaanvraag voor het pand {{bien}} is doorgestuurd naar {{agent}}{{agency}}.",buyerFollowup:"{{agent}} neemt zo snel mogelijk contact met u op om uw vragen te beantwoorden en eventueel een bezoek te plannen.",buyerAgentLabel:"Uw makelaar",buyerCta:"Pand opnieuw bekijken â",buyerReceived:"Aanvraag ontvangen â",followupSubject:"Uw aankoopdossier wacht op u",followupBody:"U heeft een paar dagen geleden een aankoopsimulatie gedaan. Uw gepersonaliseerd dossier is nog steeds beschikbaar.",followupCta:"Mijn dossier raadplegen â"},bankPdf:{cta:"Mijn bankdossier downloaden",ctaSub:"Document klaar om aan uw bank voor te leggen voor uw kredietaanvraag",title:"Financieringsdossier",subtitle:"Samenvatting voor hypotheekaanvraag",prepared:"Opgesteld op {{date}}",property:"Pand",type:"Type",address:"Adres",surface:"Oppervlakte",peb:"EPC",financing:"Financieringsplan",purchasePrice:"Aankoopprijs",contribution:"Eigen inbreng",borrowed:"Geleend bedrag",duration:"Duur",rate:"Jaarlijkse rente",monthly:"Maandbedrag",acquisition:"Aankoopkosten",registrationRights:"Registratierechten",notaryFees:"Notariskosten",mortgageFees:"Hypotheekkosten",totalFees:"Totaal kosten",totalAcquisition:"Totaal te financieren",monthlyBudget:"Maandelijks budget",mortgagePayment:"Maandelijkse aflossing",propertyTax:"Onroerende voorheffing",energy:"Energie",insurance:"Brandverzekering",totalMonthly:"Totaal per maand",indicative:"Indicatief document gebaseerd op de gesimuleerde parameters. Vormt geen kredietaanbod. De definitieve voorwaarden hangen af van de analyse van uw bank (inkomen, vermogenstoestand, toepasselijke rente op het moment van de aanvraag).",preparedBy:"Opgesteld door",print:"Afdrukken / Opslaan als PDF",close:"Sluiten",years:"jaar",perMonth:"/maand",perYear:"/jaar"},matching:{perfectTitle:"Panden die aansluiten bij uw zoekopdracht",perfectSubtitle:"In uw gemeente en binnen uw budget",nearbyTitle:"In de buurt van uw zoekopdracht",nearbySubtitle:"In naburige gemeenten, binnen uw budget",discoverTitle:"Te ontdekken in de portefeuille",discoverSubt
1196itle:"Andere panden van uw makelaar die u kunnen interesseren",bedrooms:"sk."}},aM={title:"Verwerkingsovereenkomst (DPA)",subtitle:"Bijlage bij de AV Agent Pro â Verwerkingsovereenkomst in de zin van artikel 28 van de AVG tussen de Vastgoedmakelaar (verwerkingsverantwoordelijke) en DIGITAL ARCANES BV/SRL (verwerker).",lastUpdate:"Laatste update",effectiveDate:"13 april 2026",preamble:{title:"Preambule",text:`Deze Verwerkingsovereenkomst (hierna « DPA ») maakt integraal deel uit van de Algemene Voorwaarden van de Agent Pro Dienst (AV Pro) toegankelijk op arcanes.be/pro/terms. 1197 1198Deze wordt gesloten tussen: 1199- De Vastgoedmakelaar geabonneerd op de Agent Pro dienst (hierna « de Verwerkingsverantwoordelijke » of « de Makelaar »); 1200- DIGITAL ARCANES BV/SRL, Rue des 4 Carrés 4, 1325 Chaumont-Gistoux, KBO 1033.931.611 (hierna « de Verwerker » of « Arcanes »). 1201 1202Deze DPA is opgesteld overeenkomstig artikel 28 van Verordening (EU) 2016/679 van 27 april 2016 betreffende de bescherming van persoonsgegevens (AVG) en de Belgische wet van 30 juli 2018 betreffende de bescherming van natuurlijke personen met betrekking tot de verwerking van persoonsgegevens.`},articles:{"1_object":{title:"1. Voorwerp en Omvang van de Verwerking",content:`1.1. Deze DPA heeft tot doel de voorwaarden te bepalen waaronder Arcanes, als verwerker, persoonsgegevens verwerkt voor rekening van de Makelaar, als verwerkingsverantwoordelijke, in het kader van de Agent Pro dienst. 1203 12041.2. Aard van de verwerking: 1205- Generatie van prospectrapporten en pitch cards met marktgegevens en narratieve teksten 1206- Geautomatiseerde redactie van vastgoedbeschrijvingen 1207- Verzending van opvolgingsmails naar eigenaars op verzoek van de Makelaar 1208- Geanonimiseerde meting van betrokkenheid van bezoekers op koperspagina's 1209 12101.3. Doel van de verwerking: de Makelaar in staat stellen de Agent Pro dienst te gebruiken voor het voorbereiden van afspraken, het onderbouwen van prijsaanbevelingen en het opvolgen van prospects. 1211 12121.4. Duur van de verwerking: de verwerking duurt zolang de Makelaar over een actief Agent Pro account beschikt. Zij eindigt bij opzegging conform artikel 13 van de AV Pro.`},"2_data":{title:"2. Categorieën Gegevens en Betrokkenen",content:`2.1. Categorieën verwerkte gegevens: 1213a) Gegevens van vastgoedeigenaars: naam, voornaam, e-mailadres, adres van het pand, verstrekt door de Makelaar via het Platform 1214b) Vertrouwelijke nota's van de Makelaar: contextinformatie ingevoerd door de Makelaar (situatie eigenaar, urgentie, concurrentie), gebruikt om de toon van gegenereerde inhoud te personaliseren 1215c) Betrokkenheidsgegevens: bekeken pagina's, uitgevoerde simulaties, tijd besteed op koperspagina's (geanonimiseerde gegevens, zonder persoonlijke identificatie van de bezoeker) 1216d) Gegevens van het pand: adres, kenmerken, vraagprijs, EPC, foto's (verstrekt door de Makelaar of afkomstig van openbare advertenties) 1217 12182.2. Categorieën betrokkenen: 1219a) Eigenaars van onroerend goed gecontacteerd door de Makelaar 1220b) Bezoekers van koperspagina's (uitsluitend geanonimiseerde gegevens) 1221 12222.3. Bijzondere gegevens: Arcanes verwerkt geen bijzondere categorieën van gegevens in de zin van artikel 9 van de AVG.`},"3_obligations_processor":{title:"3. Verplichtingen van Arcanes (Verwerker)",content:`Arcanes verbindt zich ertoe: 1223 12243.1. De gegevens uitsluitend te verwerken op gedocumenteerde instructies van de Makelaar. De instructies bestaan uit de AV Pro, deze DPA, en de handelingen van de Makelaar in het Platform (invoer van gegevens, activering van generatie, verzending van e-mails). 1225 12263.2. De gegevens niet voor eigen doeleinden te verwerken. Arcanes hergebruikt de gegevens van eigenaars niet voor marketing, prospectie, nominatieve statistische analyse, of enig ander doel dat niet in deze DPA is voorzien. 1227 12283.3. De vertrouwelijkheid te waarborgen. Elke persoon die bevoegd is om gegevens te verwerken (medewerkers, dienstverleners) is gebonden aan een contractuele vertrouwelijkheidsverplichting. 1229 12303.4. De beveiligingsmaatregelen beschreven in artikel 5 toe te passen. 1231 12323.5. De voorwaarden voor het inschakelen van subverwerkers na te leven (artikel 4). 1233 12343.6. De Makelaar bij te staan bij het nakomen van zijn AVG-verplichtingen:
1235a) Verzoeken tot uitoefening van rechten van betrokkenen (inzage, rectificatie, wissing, overdraagbaarheid) beantwoorden binnen 10 werkdagen na melding door de Makelaar 1236b) De Makelaar bijstaan bij gegevenslekken (artikel 6) 1237c) Bijdragen aan gegevensbeschermingseffectbeoordelingen indien de Makelaar deze uitvoert (Art. 35 AVG) 1238 12393.7. Naar keuze van de Makelaar, de gegevens wissen of teruggeven bij beëindiging van het contract (artikel 7). 1240 12413.8. De Makelaar alle informatie ter beschikking stellen die nodig is om de naleving van de verplichtingen van deze DPA aan te tonen.`},"4_subprocessors":{title:"4. Subverwerkers",content:`4.1. De Makelaar machtigt Arcanes om beroep te doen op de volgende subverwerkers: 1242 1243a) Anthropic PBC (San Francisco, VS) 1244- Doel: generatie van tekstuele inhoud (aankondigingsbeschrijvingen, narratie van rapporten, opvolgingsmails) 1245- Doorgegeven gegevens: gestructureerde pandgegevens (adres, kenmerken, prijs, EPC), marktgegevens van de gemeente, nota's van de Makelaar (geanonimiseerd â nooit de naam van de eigenaar) 1246- Verwerkingsmodus: API Zero Data Retention â geen gegevens worden door Anthropic bewaard na de generatie. De gegevens worden niet gebruikt voor het trainen van het model. 1247- Garanties doorgifte: Data Privacy Framework (DPF) + Standaard Contractuele Bepalingen (SCB) 1248 1249b) Supabase Inc. (hosting Parijs, Frankrijk â EU) 1250- Doel: opslag van de databank (makelaarsaccounts, pandgegevens, gegenereerde rapporten) 1251- Locatie: servers Parijs (eu-west) 1252- Garanties: EU-hosting, geen doorgifte buiten de EER 1253 1254c) Stripe Inc. (VS) 1255- Doel: betalingsverwerking 1256- Gegevens: naam, e-mail, bankkaartgegevens (nooit opgeslagen op Arcanes-servers) 1257- Garanties: DPF + SCB, PCI-DSS gecertificeerd 1258 12594.2. Arcanes verbindt zich ertoe de Makelaar minstens 15 dagen vooraf per e-mail te informeren over elke toevoeging of vervanging van een subverwerker. De Makelaar kan binnen 15 dagen bezwaar maken. Bij gerechtvaardigd bezwaar zoeken de Partijen een alternatief. Bij gebrek daaraan kan de Makelaar het contract opzeggen conform artikel 13.1 van de AV Pro. 1260 12614.3. Arcanes legt elke subverwerker gegevensbeschermingsverplichtingen op die gelijkwaardig zijn aan die van deze DPA.`},"5_security":{title:"5. Beveiligingsmaatregelen",content:`Arcanes past de volgende technische en organisatorische maatregelen toe: 1262 12635.1. Technische maatregelen: 1264a) HTTPS/TLS-versleuteling voor alle communicatie 1265b) Versleuteling in rust van gevoelige gegevens in de databank 1266c) Beveiligde authenticatie (bcrypt, JWT-tokens) 1267d) Row Level Security (RLS) Supabase â elke makelaar heeft enkel toegang tot eigen gegevens 1268e) Anthropic API in Zero Data Retention modus 1269f) Geen opslag van bankgegevens (Stripe tokenization) 1270 12715.2. Organisatorische maatregelen: 1272a) Toegang tot productiegegevens beperkt tot de zaakvoerder (Yann Barbery) 1273b) Principe van minimale rechten voor technische toegangen 1274c) Geen uitbesteding van ontwikkeling aan onbevoegde derden 1275d) Regelmatige herziening van toegangen en machtigingen`},"6_breach":{title:"6. Gegevenslek",content:`6.1. Bij een inbreuk op persoonsgegevens (in de zin van artikel 4(12) AVG) verbindt Arcanes zich ertoe: 1276a) De Makelaar zo snel mogelijk en uiterlijk binnen 48 uur na kennisname van het lek te verwittigen 1277b) De volgende informatie te verstrekken: aard van het lek, categorieën en geschat aantal betrokkenen, waarschijnlijke gevolgen, genomen of voorgestelde maatregelen 1278 12796.2. De Makelaar is als verwerkingsverantwoordelijke verantwoordelijk voor: 1280a) De melding aan de Gegevensbeschermingsautoriteit (GBA) binnen 72 uur indien het lek waarschijnlijk een risico inhoudt voor de rechten en vrijheden van betrokkenen (Art. 33 AVG) 1281b) De informatie van betrokkenen indien het lek waarschijnlijk een hoog risico inhoudt (Art. 34 AVG) 1282 12836.3. Arcanes werkt samen met de Makelaar en neemt alle redelijke maatregelen om de gevolgen van het lek te beperken.`},"7_end":{title:"7. Lot van de Gegevens bij Beëindiging",content:`7.1. Bij opzegging van het Agent Pro account, conform artikel 13.5 van de AV Pro: 1284a) Kan de Makelaar de export van zijn gegevens aanvragen in een gestructureerd en gangbaar formaat (JSON of CSV) binnen 30 dagen 1285b) Na deze termijn verwijdert Arcanes alle persoonsgegevens verwerkt voor rekening van de Makelaar binnen 30 extra dagen 1286c) Gegevens die strikt noodzakelijk zijn voor wettelijke verplichtingen (facturen, facturatielogs) worden bewaard conform het Belgisch recht (7 jaar voor boekhoudkundige gegevens) 1287 12887.2. De verwijdering omvat: eigenaargegevens, nota's van de Makelaar, gegenereerde rapporten, betrokkenheidslogs, en elke technische kopie in back-ups (verwijderd bij de volgende rotatiecyclus, maximaal 90 dagen).`},"8_audit":{title:"8. Auditrecht",content:`8.1. De Makelaar kan Arcanes alle redelijkerwijs noodzakelijke informatie vragen om de naleving van deze DPA te verifiëren. 1289 12908.2. Auditverzoeken moeten schriftelijk worden gemeld (e-mail aan [email protected]) minstens 15 dagen vooraf. Audits zijn beperkt tot één (1) per kalenderjaar en moeten worden uitgevoerd zonder de normale werking van de dienst te verstoren. 1291 12928.3. De kosten van de audit zijn voor rekening van de Makelaar, tenzij de audit een materieel verzuim van Arcanes aan de verplichtingen van deze DPA aan het licht brengt.`},"9_transfers":{title:"9. Internationale Doorgiften",content:`9.1. De gegevens worden hoofdzakelijk verwerkt binnen de Europese Economische Ruimte (Supabase â Parijs, Frankrijk). 1293 12949.2. Doorgiften buiten de EER vinden plaats naar: 1295a) Anthropic PBC (VS) â voor tekstgeneratie via API. Garanties: Data Privacy Framework-certificering + Standaard Contractuele Bepalingen (SCB). Zero Data Retention modus (geen bewaring na generatie). 1296b) Stripe Inc. (VS) â voor betalingsverwerking. Garanties: DPF-certificering + SCB + PCI-DSS-certificering. 1297 12989.3. Arcanes verbindt zich ertoe geen gegevens door te geven aan een derde land zonder passende waarborgen in de zin van Hoofdstuk V van de AVG (Art. 44 tot 49).`},"10_general":{title:"10. Slotbepalingen",content:`10.1. Deze DPA wordt beheerst door het Belgisch recht en de AVG. 1299 130010.2. Bij tegenstrijdigheid tussen deze DPA en de AV Pro prevalert de DPA voor alles wat betrekking heeft op gegevensbescherming. 1301 130210.3. Deze DPA treedt in werking op de datum van aanmaak van het Agent Pro account en blijft van kracht zolang het Agent Pro contract actief is. 1303 130410.4. Bevoegde toezichthoudende autoriteit: 1305Gegevensbeschermingsautoriteit (GBA) 1306Drukpersstraat 35, 1000 Brussel 1307https://www.gegevensbeschermingsautoriteit.be 1308[email protected]`}}},iM={title:"Persruimte",free_reuse:"Vrij herbruikbaar met de vermelding",methodology:"methodologie",search_ph:'Zoeken ( / ) â bv. "epc luik", "rendement", "gezinnen"â¦',all_territories:"Alle gebieden",all_indicators:"Alle indicatoren",sort_recent:"Meest recent",sort_az:"A â Z",sort_territory:"Per gebied",filter_all:"Alles",filter_maps:"Kaarten",filter_charts:"Grafieken",my_favorites:"Mijn favorieten",result:"resultaat",results:"resultaten",view_table:"Tabel",view_grid:"Raster",loading:"Ladenâ¦",manifest_error:"Manifest niet beschikbaar",col_title:"Titel",col_territory:"Gebied",col_type:"Type",col_updated:"Bijgewerkt",col_actions:"Acties",kind_map:"Kaart",kind_chart:"Grafiek",btn_image:"Afbeelding",btn_theme:"Thema",btn_cite:"Citeren",tip_cite:"Definitie + bronvermelding kopiëren",no_results:"Geen resultaten â verbreed uw zoekopdracht of filters.",no_results_short:"Geen resultaten.",fav_add:"Toevoegen aan favorieten",fav_remove:"Verwijderen uit favorieten",back_press:"â Persruimte",back_home:"Terug naar de startpagina",alt_estimation:"raming, Observatorium Arcanes",territory_not_found:"Gebied niet gevonden.",territory_empty:"Nog geen inhoud gepubliceerd voor dit gebied.",dossier_intro:"Het volledige dossier: kaarten, grafieken en downloadbare gegevens, vrij herbruikbaar met de vermelding",copy_mention:"Bronvermelding kopiëren",charts:"Grafieken",charts_sub:"De dynamiek van het gebied in beeld.",maps:"Kaarten",map_1:"kaart",maps_n:"kaarten",click_hd:"klik voor de versie in hoge resolutie.",click_hd2:"Klik voor de versie in hoge resolutie.",methodo_lead:"Definities, bronnen en beperkingen:",methodo_link:"methodologie van het Observatorium â",indicator_not_found:"Indicator niet gevonden.",copy_def_mention:"Definitie + bronvermelding kopiëren",all_scales:"Alle schaalniveaus",scales_sub:"België, provincies en arrondissementen waar de indicator het toelaat.",back_observatory:"â Observatorium",niv_all:"Alle niveaus"},sM={featureUpdates:s4,rune:o4,communePanel:l4,map:d4,common:c4,benchmark:u4,actionplan:m4,market:p4,transformation:g4,projection:h4,quickstat:f4,operating:v4,auth:b4,header:y4,notFound:w4,hero:k4,premiumHero:x4,heroAnimation:j4,landing:A4,glossary:E4,home:P4,anal
1308ysis:C4,simulators:S4,pricing:_4,faq:T4,pdf:D4,blog:R4,article:z4,contact:I4,dashboard:q4,sections:N4,toc:L4,score:B4,badges:M4,kpi:F4,simulation:O4,decomposition:V4,negotiation:W4,quickactions:U4,disclaimer:$4,freeAnalysis:G4,terms:H4,proTerms:K4,legal:Y4,privacy:Z4,premium:J4,footer:Q4,validation:X4,referralGamified:eM,settings:tM,seo:nM,buyer:rM,proDpa:aM,presse:iM},oM={newUpdate:"New",watchDemo:"Watch demo",whatsNew:"What's new",maybeLater:"Maybe later",understood:"Got it",version:"Version"},lM={regulatoryPanel:{title:"Fiche réglementaire â restitution intégrale",subtitle:"Texte validé, affiché sans modification",copy:"Copier",close:"Fermer",collapse:"Réduire",expand:"Déplier"}},dM={emptyState:{title:"Click on a municipality",subtitle:"to see the analysis"},header:{investmentScore:"Investment Score"},tabs:{invest:"Invest",market:"Market",predict:"Predictive"},scores:{yield:"Yield",security:"Secur.",potential:"Pot.",rental:"Rental"},metrics:{rentalDemand:"Rental demand",renovationPotential:"Renovation potential",familyAttractiveness:"Family attractiveness",houses:"Houses",apartments:"Apts.",affordability:"Affordability",supplyDemandTension:"Supply/Demand",medianIncome:"Median income",priceForecast:"Price forecast",gentrification:"Gentrification",opportunityScore:"Convergence index"},premium:{title:"Premium Feature",description:"Unlock forecasts and advanced analytics",cta:"Go Premium"},cta:{analyze:"Analyse a property here",compare:"Compare with another municipality"},tooltip:{prixMaison:{label:"Median house price",definition:"Central value of transactions. 50% of sales above, 50% below. More reliable than the average as it is not influenced by extreme values.",source:"Statbel - Block 2: Property Prices 2023",method:"Median of notarial deeds (private sales)"},revenu:{label:"Median income",definition:"Median taxable income per personal income tax return. Represents the central net taxable income of households.",source:"Statbel - Block 1: Tax Income 2022"},affordability:{label:"Affordability ratio",definition:"Years of income needed to buy a house at the median price. The lower the ratio, the more accessible the market.",source:"Arcanes Calculation - Blocks 1 & 2",method:"Median house price / Annual median income"},tension:{label:"Supply/Demand tension",definition:"Ratio between household and housing growth. >100% = shortage (upward pressure). <100% = oversupply.",source:"Statbel - Blocks 3 (Demographics) & 4 (Housing Stock)",method:"(5-yr household growth / 5-yr housing growth) x 100"},rds:{label:"Rental Demand Score",definition:"Evaluates rental demand potential based on demographic structure, density and price accessibility.",source:"Arcanes Model - Statbel 2023"},ais:{label:"Arcanes Investment Score",definition:"Composite score evaluating rental investment attractiveness. Weighting: Yield (40%) + Security (30%) + Potential (30%).",source:"Arcanes Algorithm - Statbel 2023"}}},cM={title:"Exploration Map",subtitle:"Explore property data across 576 Belgian municipalities",dataUpdated:"Data updated in 2023",selectCommune:"Select a municipality",clickToExplore:"Click the map to explore",codeINS:"INS Code",activeTheme:"Active theme",seeAvailableProperties:"See available properties",dataNotAvailable:"Data not available",noData:"N/A",source:"Source",sourceText:"Statbel (General Statistics Directorate), 2023 data",methodology:"Methodology",methodologyText:"Data is aggregated by municipality (INS code). Changes are calculated based on annual medians.",seeOfficialSources:"See official sources",searchPlaceholder:"Search municipality or postal code...",noResults:"No municipality found",suggestions:"Popular suggestions",share:"Share",compare:"Compare",analyzeProperty:"Analyse a property in this municipality",fullscreen:"Full screen",exitFullscreen:"Exit full screen",loading:"Loading map...",error:"Loading error","5years":"5 years","10years":"10 years",themes:{prix:{label:"Median price",description:"Median house price",explanation:"The median price represents the central value of property transactions. 50% of sales above, 50% below.",methodology:"Calculated from registered notarial deeds. Only private sales included."},dynamique:{label:"Price dynamics",description:"5-year price evolution",explanation:"The 5-year price evolution shows the local market trend. An increase indicates sustained demand.",methodology:"Comparison of current median price with 5 years ago, expressed as a percentage."},bati:{label:"Building age",description:"Share of old buildings (>50 years)",explanation:"Building age influences renovation potential and maintenance costs.",methodology:"Share of buildings built more than 50 years ago, based on the ca
1308dastre."},demographie:{label:"Demographic pressure",description:"Household growth (5 years)",explanation:"Household growth reflects the attractiveness of a municipality.",methodology:"Change in number of households over 5 years, based on the National Register."},tension:{label:"Market tension",description:"Market tension level",explanation:"The tension score combines several indicators to assess the supply/demand balance.",methodology:"Composite indicator based on price evolution and demographics."},accessibilite:{label:"Affordability",description:"Price / median income ratio",explanation:"The price/income ratio indicates how many years of income are needed to buy a property.",methodology:"Median house price divided by median household tax income."},ais:{label:"Investment Index",description:"Overall investment attractiveness (0-100)",explanation:"The Arcanes Index combines three dimensions: estimated yield (40%), market stability (30%) and historical appreciation potential (30%). A screening tool, not an investment recommendation.",methodology:"Each dimension calculated from Statbel indicators, normalised 0-100, then weighted."},rds:{label:"Rental Demand",description:"Rental demand potential (0-100)",explanation:"Evaluates a municipality's rental potential. A high score indicates strong likelihood of finding tenants.",methodology:"Combines singles share (30%), demographic growth (20%), urban density (20%), price accessibility (15%) and stock turnover (15%)."},tod:{label:"Supply/Demand Tension",description:"Household growth / housing ratio",explanation:"Measures property market balance. Above 100% = more households than homes (shortage). Below 100% = oversupply.",methodology:"Formula: (5-yr household growth) / (5-yr housing growth) x 100. Statbel 2018-2023."},rpi:{label:"Renovation Potential",description:"Value-add potential via renovation (0-100)",explanation:"Identifies municipalities where renovation can create value. High score = old stock + local incomes to finance works.",methodology:"Old buildings >50yr (45%), modern equipment deficit (25%), local financial capacity (30%)."},fas:{label:"Family Attractiveness",description:"Attractiveness for families (0-100)",explanation:"Evaluates how suitable a municipality is for families.",methodology:"Detached houses (35%), family presence (25%), family dynamics (20%), price accessibility (20%)."},pfi:{label:"Price Forecast",description:"Price evolution forecast (-100 to +100)",explanation:"Index modelling probable price evolution. Positive = upward trend. Purely indicative.",methodology:"Income dynamics (35%), demographic pressure (25%), supply/demand (25%), construction (15%)."},gvi:{label:"Gentrification",description:"Socio-economic transformation speed (-50 to +50)",explanation:"Measures a municipality's socio-economic transformation speed. Rapid gentrification historically linked to price increases.",methodology:"Analyses median income evolution, price evolution, housing stock transformation and demographic changes over 5 years."},opportunity:{label:"Convergent indicators",description:"Municipalities with several simultaneously favourable indicators",explanation:"Identifies where several indicators converge: high AIS, positive gentrification, below-average prices and favourable tension. Statistical observation, not a recommendation.",methodology:"Marked if at least 3 criteria met: AIS>55, GVI>10, price below regional avg, favourable tension, no bubble risk."}},sections:{prix:"Property prices",dynamique:"Price dynamics",demographie:"Demographics",bati:"Housing stock",marche:"Market tension",accessibilite:"Financial accessibility",investissement:"Investment",predictif:"Predictive"},data:{medianPrice:"Median house price",priceEvol5y:"5-year evolution",priceEvol10y:"10-year evolution",priceM2Appart:"Apt. price/m²",population:"Population",households:"Households",householdsEvol:"Household change (5yr)",buildings:"Buildings",oldBuildings:"Old share (>50yr)",newBuildings:"New share (<10yr)",buildingDynamic:"Dynamic",tensionLevel:"Tension level",tensionScore:"Tension score",marketProfile:"Market profile",priceIncomeRatio:"Price/income ratio",medianIncome:"Median income",investmentScore:"Investment score",rentalDemand:"Rental demand",renovationPotential:"Renovation potential",familyAttractiveness:"Family attractiveness",priceForecast:"Price forecast",gentrification:"Gentrification",opportunityScore:"Convergence index",rendement:"Yield",securite:"Security",potentiel:"Potential",locatif:"Rental",prixAppart:"Apt. price",evol5ans:"5-yr change"},tensionLevels:{veryRelaxed:"Very relaxed",relaxed:"Relaxed",balanced:"Balanced",tense:"Tense",veryTense:"Very tense"},infoModal:{understand:"Understand this indicator",methodology:"Methodology",source:"Source"},scoreLabels:{excellent:"Excellent",good:"Good",moderate:"Moderate",low:"Low",veryLow:"Very low"},accessibilityLabels:{accessible:"Accessible",tight:"Tight",difficult:"Difficult",veryDifficult:"Ver
1308y difficult"},demandLabels:{strong:"Strong",moderate:"Moderate",low:"Low"},panel:{summary:"Summary",details:"Details",predictive:"Predictive",analyzeHere:"Analyse a property here",premiumRequired:"Premium Feature",unlockPremium:"Unlock with Premium",moreInfo:"Learn more"},alerts:{bubbleRisk:"Price/fundamentals gap observed",bubbleRiskDesc:"Price evolution diverges significantly from local economic indicators.",opportunityWindow:"Convergent indicators",opportunityWindowDesc:"This municipality shows several simultaneously favourable indicators."},footer:{dataSource:"Statbel 2023 data",communes:"581 Belgian municipalities",upgradePremium:"Go Premium to access all metrics"}},uM={title:"Referral Programme",subtitle:"Invite your friends to discover Arcanes and earn free credits for each active referral!",stats:{totalReferred:"Registered referrals",activeReferred:"Active referrals",creditsEarned:"Credits earned",pending:"Pending"},share:{title:"Share your link",codeLabel:"Your referral code",linkLabel:"Referral link",copy:"Copy",copied:"Copied!",share:"Share",shareText:"Discover Arcanes - Property analysis in 10 seconds! Use my link to sign up:"},howItWorks:{title:"How does it work?",step1Title:"Share your link",step1Desc:"With your investor friends",step2Title:"They sign up",step2Desc:"And run a paid analysis",step3Title:"You earn +2 credits",step3Desc:"Per active referral"},status:{title:"Your Ambassador status",currentBadge:"Current badge",ambassador:"Ambassador",activeReferral:"active referral",activeReferrals:"active referrals",nextGoal:"Next goal",referrals:"referrals",remaining:"Still",toUnlock:"to unlock",allUnlocked:"Congratulations!",allUnlockedDesc:"You have unlocked all badges"},badges:{title:"All badges",starter:{name:"Starter",reward:"Start referring!"},bronze:{name:"Bronze",reward:"+2 bonus credits"},silver:{name:"Silver",reward:"+5 bonus credits"},gold:{name:"Gold",reward:"+10 bonus credits"},platinum:{name:"Platinum",reward:"+20 credits + beta access"}}},mM={credits:"Credit",credits_plural:"Credits",login:"Log in",myAccount:"My Account",loading:"Loading...",error:"Error",success:"Success",buy:"Buy",download:"Download",save:"Save",per_credit:"â¬/credit",year:"year",back:"Back",next:"Next",total:"Total",backToSimulators:"Back to simulators",calculate:"Calculate",f
1308illForm:"Fill in the form",locale:"en-GB",modified:"modified",years:"years",monthly:"Monthly",close:"Close",cancel:"Cancel",confirm:"Confirm",yes:"Yes",no:"No",month:"month",annual:"Annual"},pM={analysisType:"Investment Analysis",simulated:"Simulated values",share:"Share",export:"Export PDF",print:"Print",analysis:"Analysis",simulators:"Simulators",pricing:"Pricing",communes:"Municipalities",faq:"FAQ",blog:"Blog",contact:"Contact",markAllRead:"Mark all as read",notificationsSoon:"Notifications coming soon",notificationsSoonDesc:"This feature is coming soon",noNotifications:"No notifications",noNotificationsDesc:"You will be notified of important updates",viewAllNotifications:"View all notifications",logoutSuccess:"Successfully logged out",logoutError:"Error during logout",myProfile:"My profile",settings:"Settings",myCredits:"My credits",dashboard:"Dashboard",logout:"Log out",leaveBeta:"Leave Beta",betaLogoutSuccess:"Beta logout successful",myDashboard:"My Dashboard",profile:"Profile",referralTitle:"Referral - Earn credits",defaultUser:"User",observatory:"Observatory"},gM={title:"Page not found",description:"The page you are looking for does not exist or has been moved.",home:"Back to home",back:"Previous page"},hM={title:"Wealth Benchmark",subtitle:"Comparison with traditional investments",depart:"Start",an:"Year",immo:"This Project (Property + Leverage)",bourse:"Stock Market (S&P 500)",epargne:"Safe Savings",immoLabel:"Property",bourseLabel:"Stocks",epargneLabel:"Savings",avecLevier:"With leverage effect",insightTitle:"Observation",insightText:"This chart illustrates the theoretical impact of banking leverage on wealth, based on the assumptions in this simulation. Past performance does not guarantee future results."},fM={title:"Rental Income",loyerMensuel:"Monthly rent",loyerMensuelTotal:"Total monthly rent",parMois:"per month",loyerMoyenPorte:"Average rent / unit",loyerM2:"Rent per m²",loyerAnnuelBrut:"Gross annual rent",vacanceLocative:"Vacancy",taux:"Rate",perteVacanceAnnuelle:"Annual vacancy loss",loyerAnnuelEffectif:"Effective annual rent",apresVacance:"After vacancy deduction",noteTitle:"Good to know",noteExplication:"Effective rent accounts for average vacancy. This amount represents your actual rental income over the year."},vM={title:"Acquisition Costs",prixAcquisition:"Purchase price",droitsEnregistrement:"Registration fees",taux:"Rate",fraisNotaire:"Notary fees",totalFraisAcquisition:"Total acquisition fees",reductionHabitationUnique:"Primary residence reduction",economieRealisee:"Savings achieved",abattement:"Tax relief",travaux:"Works",travauxEnergetiques:"Energy works",travauxFinition:"Finishing works",etat:"Initial condition",totalTravaux:"Total works",investissementTotal:"Total investment",acquisitionFraisTravaux:"Purchase + Fees + Works"},bM={title:"Location",adresse:"Address",codePostal:"Postal code",ville:"City",province:"Province",region:"Region"},yM={bon:"The purchase price is below the estimated market value.",mauvais:"The purchase price is above the estimated market value. There may be room for negotiation.",neutre:"The purchase price is within the estimated market range for this type of property."},wM={title:"Financing",montantEmprunte:"Amount borrowed",sur:"over",ans:"years",apportRequis:"Required deposit",duTotal:"of total",tauxInteret:"Interest rate",tauxFixe:"Fixed rate",duree:"Duration",mensualite:"Monthly payment",detailAnnee1:"Year 1 detail",interetsPayes:"Interest paid",capitalRembourse:"Capital repaid",interets:"Interest",capital:"Capital",coutTotalCredit:"Total credit cost",interetsTotaux:"Total interest over duration"},kM={title:"Taxation",habitationUnique:"Primary residence",bienSupplementaire:"Additional property",rcNonIndexe:"Non-indexed CI",rcIndexe:"Indexed CI",baseImposable:"Tax base",droitsEnregistrement:"Registration fees",montantPaye:"Amount paid",tauxApplique:"Applied rate",reduction:"Reduction",economieRealisee:"Savings achieved",abattementApplique:"Applied relief",fiscaliteLocative:"Rental taxation",interetsDeductibles:"Deductible interest (Yr 1)",revenuNetImposable:"Net taxable income (Yr 1)",tauxMarginal:"Marginal rate",impotLocatif:"Rental tax (Yr
13081)",economieTitle:"Tax savings achieved",economieDesc:"Thanks to applied reductions"},xM={title:"Annual Charges",precompte:"Property tax",precompteDetail:"Indexed CI: {{montant}}",assuranceIncendie:"Fire insurance",assurancePNO:"Landlord insurance",maintenance:"Structural maintenance",chargesCopro:"Co-ownership charges",copro:"Co-ownership charges",total:"Total charges",maintenanceStructurelle:"Structural maintenance",entretienAnnuel:"Annual maintenance",totalCharges:"Total annual charges",parMois:"i.e. {{montant}}/month",perMonth:"i.e. {{amount}}/month",repartition:"Charge breakdown",chargesObligatoires:"Mandatory charges",chargesEntretien:"Maintenance charges"},jM={title:"Financing Plan",subtitle:"Financing structure and credit cost",apport:"Personal Deposit",credit:"Bank Loan",mensualite:"Monthly payment",capitalInterets:"Capital + Interest",ofInvestment:"of investment",coutCredit:"Total Credit Cost",capitalEmprunte:"Borrowed capital",interetsTotaux:"Total interest",totalRembourse:"Total repaid",mensualitesDe:"payments of",repartition:"Financing breakdown",apportLabel:"Deposit",creditLabel:"Loan"},AM={title:"Security Indicators",loyerEquilibre:"Break-even Rent",pourCashflowZero:"For zero cashflow",couvertureDette:"Debt Coverage",excellent:"Excellent",correct:"Adequate",risque:"At risk",pointMort:"Break-even Point",patrimoineSupApport:"Equity > Deposit",noteTitle:"Good to know",noteText:"The debt coverage ratio measures the property's ability to cover payments with rental income. A ratio > 1.0 indicates self-financing."},EM={title:"Sensitivity Analysis",subtitle:"Impact of key variables on IRR",scenario:"Scenario",tri:"IRR",delta:"Î vs Base",observation:"Observation",base:"Base Scenario",baseDesc:"Current configuration",loyerPlus:"Rent +10%",loyerPlusDesc:"Rental optimisation",tauxPlus:"Rate +1%",tauxPlusDesc:"Rate increase",reventeMoins:"Resale -10%",reventeMoinsDesc:"Bear market",insightTitle:"Observation",insightText:"In this simulation, IRR is sensitive to rent and resale price. A +10% rent variation would theoretically offset a +1% rate increase.",impactVisuel:"Visual impact on IRR"},PM={title:"Amortization Schedule",subtitle:"Evolution over key years",annee:"Year",an:"Yr",loyer:"Rent",cashflow:"Cashflow",dette:"Debt",patrimoine:"Net Equity",remboursement:"Repayment progress"},CM={title:"Taxation (Year 1)",baseImposable:"Tax base (indexed CI)",interetsDeductibles:"Deductible interest",revenuNetImposable:"Net taxable income",impotLocatif:"Rental tax",aucun:"None",noteNegative:"Loan interest exceeds the indexed cadastral income. No rental tax.",notePositive:"Rental income is taxed at the marginal rate based on the indexed CI increased by 40%."},SM={title:"Energy Performance",actuel:"Current",objectif:"Target",amelioration:"Improvement",conforme:"Compliant",dejaConforme:"Already compliant with EPC standards",dejaConformeDesc:"This property already meets energy standards",aucunTravauxRequis:"No energy works required",coutTravaux:"Estimated works cost",primes:"Estimated subsidies",coutNet:"Net cost after subsidies",aprePrimes:"After subsidy deduction",rentabilite:"Energy ROI",economieAnnuelle:"Annual savings",roi:"Return on investment",ans:"years",impactEnergetique:"Energy impact",avant:"Before",apres:"After",economie:"Savings"},_M={trigger:"See project steps",title:"Typical Property Project Steps",completed:"steps completed",step:"Step",allDone:"All steps completed.",step1:{category:"Finance",title:"Financing",description:"Calculated deposit: {{apport}}. Reference rate used: {{taux}}."},step2:{category:"Legal",title:"Notarial deed",description:"Estimated acquisition fees: {{frais}}."},step3:{category:"Works",title:"Energy works",description:"Estimated budget: {{budget}} â Target EPC: {{peb}}."},step4:{category:"Management",title:"Letting",description:"Estimated rent: {{loyer}}/month. Legal annual indexation applicable."}},TM={title:"Market Reality",decomposition:"Project breakdown",prixAcquisition:"Purchase price",frais:"Fees (~12.5%)",travaux:"Works",coutTotal:"Total Cost",margeLatente:"Latent Gap",gainAchat:"Gap between total cost and post-works estimate",margeExplication:"Difference between total project cost and market estimate after renovation.",arvIndisponible:"ARV not available",arvNote:"After-repair value will be estimated after local market analysis.",ecartMarche:"Gap vs Market",sousMarche:"Below market estimate",surMarche:"Above market estimate",arv:"ARV (After Repair Value)"},DM={title:"Simulation",modified:"Modified",reset:"Reset",prixAcquisition:"Purchase price",tauxCredit:"Loan rate",duree
1308Credit:"Loan duration",apport:"Deposit",budgetTravaux:"Works budget",loyerMensuel:"Monthly rent"},RM={actions:"Actions",planifier:"Schedule a visit",contacter:"Contact the agency",expert:"Talk to an expert",aide:"Help & Support"},zM={title:"Transformation Plan",avant:"Current Situation",pebActuel:"Current EPC",budget:"Works Budget",primes:"Subsidies",coutNet:"Net cost",economie:"Savings",retour:"Payback",dejaConforme:"Already Compliant â",apresTravaux:"After Works",objectif:"2050 Target",niveau:"Level"},IM={title:"10-year Projection",tri:"IRR (10 years)",multiplicateur:"Multiplier",scenarioRevente:"Resale Scenario (Year 10)",valeurFuture:"Future value",appreciation:"Total appreciation",fraisVente:"Sale fees (~4%)",detteRestante:"Remaining debt",patrimoineNet:"Net Equity",cashflowsCumules:"Cumulative cashflows (10 years)",cashflowsNote:"Total cash effort before resale",gainsTotaux:"Total Gains (10 years)",gainsNote:"Cashflows + Resale capital gain"},qM={prix:"Price",travaux:"Works",total:"Total",mensualite:"Payment"},NM={title:"Operating Statement",subtitle:"Financial flow detail (Year 1)",poste:"Item",loyersBruts:"(+) Gross Rents",vacance:"(-) Vacancy (5%)",loyersEffectifs:"= Effective Rents",chargesProprietaire:"(-) Owner charges",noi:"= NOI",mensualiteCredit:"(-) Loan Payment",cashflowNet:"= NET CASHFLOW",autofinance:"Rental income covers charges and payments in this simulation.",effortEpargne:"This simulation shows a cash effort of {{amount}}/month."},LM={gate:{title:"Create your account to unlock this tool",description:"Free access to all our simulators and professional analyses",benefit1:"All property simulators (IRR, yield, deed fees...)",benefit2:"Complete AI-powered property analyses",benefit3:"PDF export of your calculations and analyses",createAccount:"Create my free account",alreadyHaveAccount:"Already have an account? Log in"},gateDialog:{title:"Create your account to continue",description:"Free access to all our property analysis tools",benefit1:"All property simulators (IRR, yield, deed fees...)",benefit2:"Complete and detailed property analyses",benefit3:"1 free analysis credit on sign up",createAccount:"Create my free account",alreadyHaveAccount:"Already have an account? Log in"},login:{title:"Welcome back",subtitle:"Log in to access your analyses",email:"Email",emailPlaceholder:"[email protected]",password:"Password",forgotPassword:"Forgot password?",submit:"Log in",loading:"Logging in...",noAccount:"No account yet?",createAccount:"Create an account",success:"Login successful",welcome:"Welcome!",error:"Login error",validationError:"Validation error",genericError:"An error occurred during login",rightPanel:{title:"Your property analyses,",titleHighlight:"always accessible",description:"Find your reports, track your projects and access precise, up-to-date data.",stat1Value:"10K+",stat1Label:"Analyses generated",stat2Value:"<15s",stat2Label:"Average analysis time",stat3Value:"500+",stat3Label:"Active users",stat4Value:"98%",stat4Label:"Accuracy rate"}},reset:{title:"Reset password",subtitlePending:"Enter your email to receive a reset link",subtitleSent:"A reset email has been sent",email:"Email address",emailPlaceholder:"[email protected]",submit:"Send link",loading:"Sending...",backToLogin:"Back to login",emailSent:"Email sent",emailSentDescription:"Check your inbox to reset your password",emailSentTo:"An email has been sent to",emailSentInstruction:"Click the link in the email to reset your password.",noEmailReceived:"Didn't receive the email?",retry:"Try again",error:"Error",validationError:"Validation error",genericError:"An error occurred"},update:{title:"New password",subtitle:"Choose a secure password",newPassword:"New password",confirmPassword:"Confirm password",submit:"Update",loading:"Updating...",strength:"Strength",strengthWeak:"Weak",strengthMedium:"Medium",strengthGood:"Good",strengthExcellent:"Excellent",check8chars:"8+ characters",checkUppercase:"Uppercase",checkLowercase:"Lowercase",checkNumber:"Number",checkSpecial:"Special character",passwordsMatch:"Passwords match",passwordsDontMatch:"Passwords don't match",success:"Password updated!",successDescription:"Your password has been changed successfully",error:"Error",validationError:"Validation error",genericError:"An error occurred"}}
1308,BM={scrollToAnalyze:"Scroll to analyse",analyzing:"Analysing",analysisComplete:"Analysis complete",summary:{investment:"This property has a calculated IRR of {{tri}} over 10 years with a monthly cashflow of {{cashflow}}.",undermarket:"Property positioned {{pct}}% below local market price.",overmarket:"Caution: property positioned {{pct}}% above market.",opportunity:"Price significantly below market estimate.",underpriced:"Price slightly below market estimate.",overpriced:"Price above market estimate.",positive:"This property has a calculated IRR of {{tri}} over 10 years with a positive monthly cashflow of {{cashflow}}.",negative:"This property has a calculated IRR of {{tri}} over 10 years. The monthly cashflow of {{cashflow}} implies a savings effort.",fairprice:"Price within local market estimate range.",default:"Analysis in progress..."}},MM={badge:"New: Analysis 2.0",headline:"Data-driven property analysis.",subheadline:"Get key indicators for any property listing in seconds.",inputPlaceholder:"Paste a property listing link...",ctaButton:"Analyse",scoreLabel:"Synthetic Index",metrics:{cashflow:"Cashflow",cashflowValue:"+â¬245/month",profitability:"Profitability",profitabilityValue:"7.2%",pricePerSqm:"Price/m²",pricePerSqmValue:"-8% vs market"}},FM={ad:{price:"⬠385,000",ref:"Ref: IMO-2024-5847",title:"Beautiful Family Home in Waterloo",location:"Avenue des Sapins, 1410 Waterloo",description:{part1:"Magnificent family home offering a",surface:"floor",part2:"area of",surfaceValue:"145 m²",part3:", ideally located in a quiet residential neighbourhood. This property comprises",roomsValue:"5 rooms",part4:"including 3 bright bedrooms, perfect for a family."},details:{typeLabel:"Property",part1:"type:",typeValue:"House",part2:"detached with 300m² landscaped garden.",conditionLabel:"General",part3:"condition:",conditionValue:"Fair",part4:", requiring some refreshment. Gas heating, double glazing, 2-car garage."},features:{surface:"Surface",rooms:"Rooms",bedrooms:"Bedrooms",energy:"Energy"},buttons:{contact:"Contact agent",visit:"Schedule visit"}},chart:{title:"Complete AI Analysis",subtitle:"Evaluation on 4 key criteria",scoreGlobal:"Overall Score",criteria:{priceVsMarket:"Price vs Market",cashflow:"Cashflow",roi:"ROI",profitability:"Profitability"},propertyCard:{priceLabel:"PRICE",priceValue:"â¬450k",location:"Paris 16th - Avenue Foch",surfaceLabel:"SURFACE",surfaceValue:"85 m²",roomsLabel:"ROOMS",roomsValue:"4 rooms",typeLabel:"TYPE",typeValue:"Apartment",conditionLabel:"CONDITION",conditionValue:"Excellent"},buttons:{start:"Start analysis",pricing:"See pricing"}}},OM={hero:{badge:"New: Analysis 2.0",title1:"The",title2:"property",title3:"valuation infrastructure",subtitle:"Transform any listing into a",subtitleHighlight:"complete valuation report.",subtitleTime:"In 10 seconds.",ctaMobile:"Analyse for free",trust1:"100% Secure",trust2:"Analysis in 10 seconds",trust3:"+15,000 analyses",cardTitle:"Detached house",cardLocation:"Uccle, Brussels",opportunityTitle:"Analysis complete",opportunitySubtitle:"Calculated gross yield: 2.3% above average",metricCashflow:"Cashflow",metricTRI:"10-yr IRR",metricPrice:"Price/m²",floatingCardLabel:"Today",floatingCardTitle:"Net volume",savingsLabel:"Observed gap",betaLogoutSuccess:"Beta logout successful"},dataHub:{badge:"Data-driven exploration",title:"581 municipalities. 43 indicators. One platform.",subtitle:"Explore the Belgian real estate market municipality by municipality, or use the interactive screener to identify your ideal investment zone.",communes:{title:"Municipality Directory",description:"Every Belgian municipality, decoded. 42 indicators per profile: prices, taxation, demographics, energy, yield. Search by name or postal code.",stat1:"municipalities",stat2:"indicators",stat3:"regions",cta:"Explore all municipalities"},screener:{title:"Interactive Screener",description:"Leaflet map + sortable table. Min/max filters, composite score, 12 smart strategies (Cashflow Max, First purchase, Capital gains...). PDF export.",pill1:"43 indicators",pill2:"Composite score",pill4:"12 strategies",cta:"Open the screener"}},simulators:{badge:"Free tools",title:"Property simulators",subtitle:"6 free tools to prepare your Belgian property investment",launchCta:"Launch simulator",viewAll:"See all simulators",previewLabel:"Result preview",preview:{registrationRights:"Registration fees",notaryFees:"Notary fees",adminFees:"Admin fees",totalFees:"Total fees",perMonth:"per month",duration:"Duration",rate:"Rate",total:"Total",maxBudget:"Maximum budget",monthly:"Monthly payment",debtRatio:"Debt ratio",consumption:"Consumption",annualCost:"Annual cost",grossYield:"Gross yield",netYield:"Net yield",cashflow:"Cashflow",tri:"10-year IRR",totalGain:"Total gain",over:"Over"},notaryFees:{title:"Deed fees",description:"Calculate notary fees and registration taxes by region",badge:"Popular"},mortgage:{title:"Mortgage",description:"Simulate your monthly payments and total credit cost",badge:"Essential"},borrowingCapacity:{title:"Borrowing capacity",description:"Discover your maximum budget based on your income"},peb:{title:"EPC impact",description:"Assess energy impact on charges and property value",badge:"New"},rentalYield:{title:"Rental yield",description:"Calculate gross/net yield and cashflow of your investment",badge:"Investor"},tri:{title:"IRR & Projection",description:"Project your investment over 10 years with internal rate of return",badge:"Advanced"},propertyTax:{title:"Property Tax",description:"Property tax estimation based on the official Belgian formula, by municipality and region.",badge:"NEW"}},faq:{badge:"FAQ",title:"Your questions, our answers",subtitle:"Everything you need to know about Arcanes and our property anal
1308yses",moreQuestions:"More questions?",viewAll:"View full FAQ"},blog:{badge:"Resources & Guides",title:"Our property blog",subtitle:"Market analyses, key data and practical guides to understand Belgian real estate",trending:"Trending",readMore:"Read article",viewAll:"See all articles"},howItWorks:{badge:"Simplified process"},features:{badge:"Features",complete:{title:"Complete analysis",desc:"IRR, cashflow, gross/net yield, 10-year projection, rate sensitivity"},benchmark:{title:"Market benchmark",desc:"Automatic comparison with average prices in your area"},instant:{title:"Instant",desc:"Results in under 10 seconds thanks to our optimised infrastructure"},pdf:{title:"Pro PDF Report",desc:"Professional 11-page export with charts and detailed indicators"}},pricing:{badge:"Simple pricing",freeSubtitle:"Perfect for testing",freeCta:"Start for free",popularBadge:"Most popular",startingFrom:"From",perAnalysis:"analysis"},cta:{badge:"1 free analysis included"}},VM={howItWorks:{title:"How it works",step1:{title:"1. Share the listing",description:"Simply paste the link to your property listing. Our Arcanes algorithm instantly analyses all the data."},step2:{title:"2. Complete algorithmic analysis",description:"Our technology examines market prices, energy performance and investment potential."},step3:{title:"3. Detailed report",description:"Receive a comprehensive report with indicators, projections and key insights."}},whyChoose:{title:"Why choose Arcanes?",precision:{title:"Maximum precision",description:"Our algorithms analyse thousands of data points to give you the most accurate market information."},freeAnalysis:{title:"Free analysis",description:"Start with a free analysis to discover the power of our platform with no commitment."},security:{title:"Guaranteed security",description:"Your data is protected with the highest security and privacy standards."}},whoIsItFor:{title:"Who is Arcanes for?",subtitle:"One tool for three property profiles.",primaryResidence:{title:"Primary residence",feature1:"Real value analysis",feature2:"Price/m² vs market comparison",feature3:"Clarity on works and future costs",feature4:"Purchase objectification",conclusion:"Secure an emotional decision."},rentalInvestment:{title:"Rental investment",feature1:"Gross & net yield",feature2:"Projected cashflow",feature3:"Belgian parameters: EPC, CI, taxation",feature4:"Long-term potential analysis",conclusion:"Estimate self-financing potential."},apartmentBuilding:{title:"Multi-unit building",feature1:"Per-unit analysis + overall income",feature2:"Price/door + estimated vacancy",feature3:"Inconsistency detection",feature4:"Consolidated view for bank",conclusion:"Quickly decide if the property is worth visiting."}},plans:{title:"Free or advanced analysis. Your choice.",subtitle:"Start free, go premium only if the project moves forward.",free:{badge:"Discovery",title:"Free, unlimited",includes:"Includes",notIncludes:"Does not include",feature1:"Overall property score",feature2:"General condition",feature3:"Price/m² vs market",feature4:"Energy index",feature5:"Summary assessment",missing1:"Cashflow / yield",missing2:"Works detail",missing3:"Long-term projection",missing4:"PDF export"},premium:{badge:"Complete / Decision",title:"To decide and negotiate",includes:"Includes",feature1:"Residential or investment analysis",feature2:"Yield, cashflow, simplified IRR",feature3:"Financial scenarios & risks",feature4:"Works estimate + timeline",feature5:"Custom simulations",feature6:"Professional PDF export",feature7:"10-year projection option",cta:"1 free premium analysis on sign up"}},testimonials:{title:"What our users say",subtitle:"Discover user feedback",testimonial1:{quote:"Arcanes helped me identify the hidden potential of several properties. The analyses are remarkably precise and saved me considerable time.",name:"S. D.",role:"Property investor"},testimonial2:{quote:"As a real estate agent, I use Arcanes daily to advise my clients. The tool has become indispensable in my work.",name:"M. L.",role:"Real estate agent"}},cta:{title:"Ready to analyse your next property?",subtitle:"Start now with a free analysis and discover your investment potential.",button:"Start free analysis"}},WM={title:"Free Analysis",subtitle:"Paste a property listing URL to get a detailed analysis",urlPlaceholder:"https://www.immoweb.be/en/listing/...",uploadDocument:"Or upload a document",startAnalysis:"Start analysis",analyzing:"Analysing...",results:"Analysis results",download:"Download PDF",errors:{invalidUrl:"Invalid URL",analysisError:"Analysis error",noCredits:"Insufficient credits"}},UM={title:"Property Simulators",subtitle:"Precise calculation tools to anticipate every aspect of your Belgian property project. Free, instant and no commitment.",share:{title:"Share",copyLink:"Copy link",linkCopied:"Link copied!"},notaryFees:{title:"Deed Purchase Fees",description:"Precisely estimate your notary fees and registration taxes by region.",badge:"Essential",pageTitle:"Deed Fee Simulator",pageSubtitle:"Precisely estimate your notary fees for purchasing property in Belgium",propertyInfo:"Property information",fillInfo:"Fill in the details below for a detailed estimate",region:"Region",
1308selectRegion:"Select a region",wallonia:"Wallonia",brussels:"Brussels-Capital",flanders:"Flanders",walloniaInfo:"Standard rate: 12.5% | Reduced rate (1st purchase): 3%",brusselsInfo:"Standard rate: 12.5% | Relief possible up to â¬200,000",flandersInfo:"Standard rate: 10% | Reduced rate (1st purchase): 3%",propertyType:"Property type",house:"House",apartment:"Apartment",land:"Land",price:"Purchase price (â¬)",pricePlaceholder:"e.g.: 250000",priceRange:"Amount between â¬50,000 and â¬2,000,000",options:"Options",firstPurchase:"First purchase (own and only residence)",firstPurchaseTooltip:"You benefit from a reduced rate if you don't already own another property and intend to live in this one.",newProperty:"New build (VAT applies instead of registration fees)",mortgage:"Mortgage financing",calculate:"Calculate fees",reset:"Reset",faqTitle:"FAQ",faq1Question:"What's the difference between registration fees and VAT?",faq1Answer:"Registration fees apply to existing properties: 12.5% in Wallonia and Brussels (3% reduced in Wallonia for primary residence), 12% in Flanders (2% reduced). 21% VAT applies to new builds sold by a VAT-registered entity. For new builds, VAT covers construction while registration fees cover the land.",faq2Question:"How to qualify for the reduced rate?",faq2Answer:"You must not own full ownership of another residential property (in Belgium or abroad) and commit to establishing your main residence within 3 years. If already an owner, you may qualify by selling your existing property within 2-3 years depending on the region.",faq3Question:"Are these fees negotiable?",faq3Answer:"Registration fees and VAT are set by law and non-negotiable. Notary fees follow a legal schedule identical across all Belgian notaries. Only administrative fees may vary slightly (generally â¬800-â¬1,200).",resultTitle:"Estimate result",purchasePrice:"Purchase price",registrationRights:"Registration fees",vat:"VAT (21%)",notaryFees:"Notary fees (incl. VAT)",adminFees:"Admin fees",totalEstimated:"Estimated total",feesPercentage:"Fees: {amount} ({percentage}% of price)",costsBreakdown:"Cost breakdown",globalView:"Overview",feesDetail:"Fee detail",disclaimer:"This estimate is indicative. For a definitive calculation, consult your notary.",exportPDF:"Export PDF",learnMore:"Learn more about acquisition fees â",completeForm:"Complete the form for your estimate",ctaTitle:"Understanding deed fees in Belgium",ctaDescription:"Registration fees, notary fees, mortgage costs: discover the full breakdown and mistakes to avoid.",ctaButton:"Read the full guide",footerCopyright:"Arcanes. Simulator for informational purposes only.",pdfPreviewTitle:"Deed fee estimate preview",generatingPDF:"Generating PDF...",pleaseWait:"Please wait...",pdfGenerated:"PDF generated",fileDownloaded:"File downloaded successfully",pdfError:"Unable to generate PDF"},mortgage:{title:"Mortgage",description:"Calculate your payments and view your amortization schedule.",badge:"Financing",pageTitle:"Mortgage Simulator",pageSubtitle:"Calculate your monthly payments and total mortgage cost",loanParameters:"Loan parameters",fillParameters:"Fill in the details for your simulation",amount:"Amount borrowed (â¬)",amountPlaceholder:"e.g.: 200000",interestRate:"Annual interest rate (%)",interestRatePlaceholder:"e.g.: 3.5",duration:"Loan duration (years)",durationPlaceholder:"e.g.: 20",durationRange:"Between 1 and 30 years",calculate:"Calculate",reset:"Reset",fillForm:"Fill in the parameters for your simulation",simulationSummary:"Simulation summary",summaryDescription:"For a loan of {amount} over {duration} years at {rate}%",monthlyPayment:"Monthly payment",interestCost:"Interest cost",totalToRepay:"Total to repay",over:"over",payments:"payments",amortizationChart:"Amortization chart",annualEvolution:"Annual repayment evolution",amortizationTable:"Amortization schedule",monthlyDetail:"monthly",annualDetail:"annual",detailOf:"{mode} repayment detail",annual:"Annual",monthly:"Monthly",month:"Month",year:"Year",capitalBefore:"Capital before",interest:"Interest",capitalRepaid:"Capital repaid",capitalAfter:"Capital after",disclaimer:"This simulator provides an indicative estimate based on a fixed rate. Consult your banker for a personalised offer.",exportPDF:"Export PDF",fullDisclaimer:"This simulator provides an indicative estimate based on a fixed rate. Actual conditions may vary. Consult an adviser for a personalised offer.",footerCopyright:"Arcanes. Simulator for informational purposes only.",pdfPreviewTitle:"Simulation preview",generatingPDF:"Generating PDF...",pdfGenerated:"PDF generated successfully!",pdfError:"Error generating PDF",capitalReimbursed:"Capital repaid",interestPaid:"Interest paid",remainingCapital:"Remaining capital"},tri:{title:"IRR & Profitability",description:"Analyse the overall profitability of your property investment over several years.",badge:"Advanced analysis",pageTitle:"IRR & Wealth Profitability Simulator",pageSubtitle:"Advanced analysis with multi-year projection",marketSettings:"Belgian market parameters ð§ðª",projectData:"Project Data",acquisition:"Acquisition",region:"Region",wallonia:"Wallonia",brussels:"Brussels",flanders:"Flanders",purchasePrice:"Purchase price",acquisitionFees:"Acq. fees",autoCalculated:"Auto-calculated",renovations:"Works",financing:"Financing",personalContribution:"Personal deposit",autoLabel:"Auto (20% + Fees)",rate:"Rate (%)",duration:"Duration (yrs)",operation:"Operations",rentCC:"Rent incl.",chargesAndTax:"Charges & Tax",annualRentIndexation:"Annual rent indexation (%)",indexationHelp:"Positively impacts future cashflow.",holdingDuration:"Holding period",optimize:"Optimise",annualAppreciation:"Annual appreciation",projectTRI:"Project IRR",annualReturn:"Annual return",netCashflow:"Net Cashflow",avgYear1:"Avg Year 1 / month",exitGain:"Exit Gain",netInPocket:"Net in pocket (Total)",totalBudget:"Total Budget",notarialAct:"Ready to sign",performanceOver:"Performance over {duration} years",performanceText:"This project offers an IRR of <strong>{tri}%</strong>. Cashflow will gradually increase thanks to indexation ({indexation}%/yr) against a fixed repayment.",rentPlus10:"Rent +10%",worksLess10:"Works -10%",resaleLess5:"Resale -5%",cashflowAndWealth:"Cashflow & Wealth Building",annualCashflow:"Annual Cashflow",cumulatedWealth:"Cumulative Wealth",amortizationTable:"Amortization Schedule",year:"Year",cashflow:"Cashflow",remainingCapital:"Remaining Capital",propertyValue:"Property Value",cumulatedNet:"Cumulative Net",downloadPDFReport:"Download PDF Report",pdfPreviewTitle:"Preview",o
1308ptimizedDuration:"Optimised Duration",optimizedMessage:"The ideal duration to maximise your IRR is {years} years.",pdfGenerated:"PDF Generated",pdfSuccess:"Your report is ready.",pdfError:"Problem generating PDF.",fillFormDescription:"Complete the project information on the left and click Calculate to see your full IRR analysis.",triStatus:{low:"Low",standard:"Standard",good:"Good",excellent:"Excellent"}},borrowingCapacity:{title:"Borrowing Capacity",description:"Discover the maximum amount you can borrow based on your financial profile.",pageTitle:"Borrowing Capacity Simulator",pageSubtitle:"Discover your borrowing capacity based on your project",financialInfo:"Your financial information",fillInfo:"Fill in your financial information",projectType:"Project type",projectTypeRequired:"Project type *",selectProject:"Select your project",mainResidence:"Primary residence",rentalInvestment:"Rental investment",mainResidenceInfo:"Max debt ratio: 35%",rentalInvestmentInfo:"Max debt ratio: 40% (rental income at 70%)",monthlyIncomeLabel:"Net monthly income (â¬) *",monthlyIncomePlaceholder:"e.g.: 3500",monthlyIncomeTooltip:"Net monthly income before tax, including 13th month and holiday pay pro-rated.",currentDebtsLabel:"Current monthly debts (â¬)",currentDebtsPlaceholder:"e.g.: 450",currentDebtsTooltip:"All existing monthly payments: car loan, consumer credit, etc.",expectedRentalIncomeLabel:"Expected rental income (â¬/month)",expectedRentalIncomePlaceholder:"e.g.: 800",expectedRentalIncomeTooltip:"Expected monthly rent. Banks consider 70% of this amount.",rentalIncomeInfo:"Counted at 70% in bank calculation",personalContributionLabel:"Personal deposit (â¬)",personalContributionPlaceholder:"e.g.: 50000",personalContributionTooltip:"Amount you can contribute to fund the project.",calculateCapacity:"Calculate my capacity",calculating:"Calculating...",yourProfile:"Your Profile",maxMonthlyPayment:"Maximum monthly payment",debtRatio:"Debt ratio",yourScenarios:"Your 3 Borrowing Scenarios",scenariosComparison:"Borrowable amounts by duration (3.5% fixed rate)",recommended:"Recommended",borrowableAmount:"Borrowable amount",totalBudget:"Total budget",monthlyPayment:"Monthly payment",perMonth:"/month",personalizedAdvice:"Personalised Advice",completeForm:"Complete the form for your estimate",disclaimer:"This estimate is indicative. For a definitive analysis, consult your banker.",exportPDF:"Export PDF",pdfPreviewTitle:"Borrowing capacity preview",fullDisclaimer:"This simulator provides an indicative estimate. Results do not replace a banking expert's analysis.",fullDisclaimerFooter:"Every profile is unique. Your bank remains the best source to confirm your capacity.",footerCopyright:"Arcanes. Simulator for informational purposes only.",errorInvalidIncome:"Please enter valid monthly income",errorHighDebtTitle:"High debt ratio",errorHighDebtMessage:"Your debts exceed {rate}% of your income. Solutions exist.",pdfGenerated:"PDF generated",pdfSuccess:"File downloaded successfully",pdfError:"Unable to generate PDF"},peb:{title:"EPC & Energy Cost",description:"Estimate energy performance and future charges of your property.",badge:"Housing",pageTitle:"EPC & Energy Cost Simulator",pageSubtitle:"Estimate your property's energy performance and simulate improvements",propertyInfo:"Property information",fillInfo:"Enter details for your simulation",surface:"Living area (m²) *",surfacePlaceholder:"e.g.: 85",pebClass:"EPC class *",pebClassPlaceholder:"e.g.: D or 320",pebClassHelp:"Letter (A+ to G) or score in kWh/m²/yr",region:"Region *",brussels:"Brussels-Capital",flanders:"Flanders",wallonia:"Wallonia",propertyType:"Property type *",apartment:"Apartment",house:"House",electricityPrice:"Electricity price (â¬/kWh)",electricityPricePlaceholder:"e.g.: 0.25",calculate:"Calculate",completeForm:"Complete the form for your simulation",energyPerformance:"Energy performance",initialScore:"Initial score",simulatedScore:"Simulated score",annualConsumption:"Annual consumption",annualCost:"Annual cost",interactiveSimulation:"Interactive simulation",slideToSimulate:"Slide the cursor to simulate a change",heating:"Heating",hotWater:"Hot water",ventilation:"Ventilation",lighting:"Lighting",other:"Other",impactOfVariation:"Impact of variation",noChange:"No change",slideInstruction:"Slide to simulate",scoreLabel:"Score: {score} kWh/m²/yr",disclaimer:"Indicative estimate. Actual consumption varies by insulation, habits and equipment.",exportPDF:"Export PDF",fullDisclaimer:"This simulation is indicative based on averages. Actual consumption depends on many factors.",footerCopyright:"Arcanes. Simulator for informational purposes only.",pdfPreviewTitle:"EPC simulation preview",errorInvalidSurface:"Please enter a valid surface area",errorInvalidPEB:"Invalid EPC class",generatingPDF:"Generating PDF...",pdfGenerated:"PDF generated",pdfSuccess:"File downloaded successfully",pdfError:"Unable to generate PDF"},rentalYield:{title:"Rental Yield",description:"Analyse the profitability of your rental investment.",badge:"Investment",pageTitle:"Rental Yield Simulator",pageSubtitle:"Analyse the profitability and cashflow of your property investment",investmentData:"Investment data",fillInfo:"Enter parameters for your analysis",purchasePrice:"Purchase price (â¬)",purchasePricePlaceholder:"e.g.: 350000",monthlyRent:"Monthly rent (â¬)",monthlyRentPlaceholder:"e.g.: 1500",monthlyCharges:"Monthly charges (â¬/month)",monthlyChargesPlaceholder:"e.g.: 350",monthlyChargesHelp:"Property tax, insurance, maintenance, co-ownership charges",loanRepayment:"Loan repayment (â¬/month)",loanRepaymentPlaceholder:"e.g.: 1200",loanRepaymentHelp:"Monthly mortgage payment. Enter 0 if cash purchase.",personalContribution:"Personal deposit (â¬)",personalContributionPlaceholder:"e.g.: 70000",personalContributionHelp:"Own funds invested (deposit + fees + works)",acquisitionCosts:"Acquisition costs (â¬)",acquisitionCostsPlaceholder:"e.g.: 52500",acquisitionCostsHelp:"Default â 15% of purchase price",renovationBudget:"Works budget (â¬)",renovationBudgetPlaceholder:"e.g.: 0",calculate:"Calculate",f
1308illForm:"Complete the form for your analysis",yieldIndicators:"Yield indicators",grossYield:"Gross yield",netNetYield:"Net-net yield",equityYield:"Equity yield",detailedFinancialAnalysis:"Detailed analysis",monthlyRentBreakdown:"Monthly rent breakdown",charges:"Charges",loan:"Loan",cashflow:"Cashflow",toFinance:"To finance",netAnnualCashflow:"Net annual cashflow",annualSavingsEffort:"Annual savings effort",netMonthlyCashflow:"Net monthly cashflow",monthlyEffort:"Monthly effort",investmentSummary:"Investment summary",totalInvestment:"Total investment",borrowedAmount:"Borrowed amount",annualRent:"Annual rent",yieldLevel:{negativeCashflow:"Negative cashflow",excellent:"Excellent",aboveAverage:"Above average",average:"Average",low:"Low"},interpretation:{negativeCashflow:"You need to contribute {amount}â¬/month to cover charges and loan. Defensive or speculative strategy.",excellent:"Calculated yield above the observed Belgian market average (~3.2%).",aboveAverage:"Calculated yield above the observed average (~3.2%). Cross-reference with area and condition analysis.",average:"Calculated yield close to the observed average. Improvement potential (works, revaluation) may influence this result.",low:"Calculated yield below average. Several factors may explain this: purchase price, charges, works, vacancy risk."},disclaimer:"Indicative estimate not replacing a complete analysis including taxation and vacancy.",exportPDF:"Export PDF",fullDisclaimer:"This estimate is indicative only and does not replace a complete analysis including taxation, financing, property tax and vacancy.",footerCopyright:"Arcanes. Simulator for informational purposes only.",pdfPreviewTitle:"Yield calculation preview",pdfGenerated:"PDF generated",pdfSuccess:"File downloaded successfully",pdfError:"Unable to generate PDF"},pricePerSqm:{title:"Price per m²",description:"Compare prices per m² by region",pageTitle:"Market Price per m² Calculator",pageSubtitle:"Analyse market prices per square metre",address:"Address or locality",addressPlaceholder:"e.g.: Avenue Louise, 1050 Brussels",surface:"Property surface (m²)",surfacePlaceholder:"e.g.: 85 (living area in m²)",propertyType:"Property type",propertyTypePlaceholder:"e.g.: 2-bedroom apartment",analyze:"Analyse market",resultsPlaceholder:"Results will appear here after analysis"},info:{title:"Why use our simulators?",subtitle:"Calculations based on current Belgian regulations",precision:{title:"Precision",description:"Calculations based on official Belgian rates: registration fees, property tax, VAT."},instant:{title:"Instant",description:"Immediate results with interactive charts and PDF export option."},complete:{title:"Complete",description:"All scenarios compared: durations, regions, project types, net yields."}},deeperAnalysis:{title:"Need a deeper analysis?",description:"Our simulators give a first estimate. For a complete analysis with detailed report, discover our premium service.",button1:"Discover full analysis",button2:"Read our guides"},footer:{copyright:"Arcanes. Simulators for informational purposes only.",blog:"Blog",contact:"Contact",legal:"Legal notice"},launch:"Launch simulator"},$M={title:"Our Pricing",subtitle:"Top up your account with Credits to run premium analyses",recommended:"RECOMMENDED",legal:{title:"Withdrawal & T&Cs",desc:"In accordance with the law, you have a 14-day withdrawal right for unused credits.",link:"See withdrawal conditions (Art. 8)"},common:{credits:"Credit",credits_plural:"Credits",per_credit:"⬠/ credit",save:"Save",buy:"Buy",terms:"Terms & Conditions"},plans:{discovery:"Discovery Pack",essential:"Essential Pack",smart:"Smart Pack",investor:"Investor Pack",pro:"Pro+ Pack"},features:{analyses:"complete analyses",detailed:"Detailed PDF report included",noExpiration:"Valid for 2 years",becomesPremium:"Becomes Premium Member"},about:{title:"About Credits",feature1:"Guaranteed complete analyses",feature1Desc:"Each credit unlocks a full premium analysis including profitability, works and cashflow.",feature2:"Credits valid for life",feature2Desc:"Buy now, use in 6 months or 2 years. No expiry date.",feature3:"Buy more, pay less",feature3Desc:"Cost per analysis decreases with pack size. Ideal for active investors."},premiumMember:{title:"Premium Member",feature1:"Access to exclusive features",feature1Desc:"Unlock the IRR simulator, market predictions on the map and more.",feature2:"Automatic status",feature2Desc:"When buying 10+ credits, you automatically become a Premium Member."},toast:{cancelled:"Payment cancelled",cancelledDesc:"Payment process cancelled. No amount charged.",confirmed:"Payment c
1308onfirmed!",error:"Error",paymentError:"An error occurred during payment verification.",loginRequired:"Login required",loginRequiredDesc:"Please log in to purchase credits.",preparationError:"Error preparing payment."}},GM={title:"FAQ",subtitle:"Everything you need to know about Arcanes, analyses and credits.",search:"Search a question...",noResults:"No results found for your search.",categories:{general:"General",analysis:"Analyses",methodology:"Methodology",account:"Account & Technical"},questions:{general:{q1:"What exactly is Arcanes?",a1:"Arcanes is an automated property analysis platform based on data and sophisticated algorithms. It lets you quickly evaluate any Belgian property listing.",q2:"Can I really do a free analysis?",a2:"Yes. On sign-up, you receive 1 free premium analysis. You can then continue with free analyses (limited) or buy credits for full premium analyses.",q3:"What property types does Arcanes work with?",a3:"Arcanes can analyse most Belgian properties: houses, apartments, studios, duplexes, multi-unit buildings, old or new, to renovate or renovated."},analysis:{q1:"What's the difference between free and premium?",a1:"Free shows main info: score, price/m², condition, EPC, summary. Premium adds: works estimate, energy costs, risk levels, financial scenarios, yield, cashflow and PDF report.",q2:"How long does an analysis take?",a2:"Analysis generation typically takes 30 seconds to 2 minutes depending on data quality and property complexity.",q3:"Can I analyse the same listing multiple times?",a3:"Yes. Each new analysis uses 1 credit (or 3 for multi-unit). Once generated, a premium analysis remains in your history at no extra cost.",q4:"Does Arcanes analyse multi-unit buildings?",a4:"Yes. Arcanes detects multiple units, calculates price/door, overall yield, theoretical return, common risks and potential vacancy. Uses 3 credits."},methodology:{q1:"What assumptions are the calculations based on?",a1:"Arcanes combines public data, market references, financial ratios, national statistics and prudent assumptions.",q2:"How are acquisition fees calculated?",a2:"Calculations include registration fees, notary fees, admin fees and disbursements, based on current Belgian standard rates.",q3:"How does Arcanes estimate rental yield?",a3:"Yield depends on potential rent, location, property condition, recurring charges and energy consumption. Scenarios are prudent.",q4:"How are potential rents estimated?",a4:"Rents are estimated via Statbel data, local references, postal code, surface area, condition and features. A local adjustment is applied.",q5:"Are estimates final?",a5:"No. They are estimates built with the best available data but do not replace a property or technical expert."},account:{q1:"Do I need an account?",a1:"Yes. Account creation lets you save analyses, claim your free premium analysis and track your history.",q2:"Can I download my analyses?",a2:"Premium analyses are downloadable as PDF, suitable for sharing with a notary, bank, partner or adviser.",q3:"Does Arcanes work on mobile?",a3:"Yes. The platform is responsive and usable on computer, tablet and smartphone.",q4:"What if I have a technical problem?",a4:"Contact us via support or the dedicated page. In case of a confirmed error, a credit can be refunded.",q5:"How do I become a Premium member?",a5:"You automatically become Premium by buying a Smart (10), Investor (25) or Pro+ (50) credit pack. Premium gives access to the IRR simulator and map predictions."}},help:{title:"Need help?",description:"Our team is here to answer your questions",contact:"Contact us",home:"Back to home"}},HM={borrowingCapacity:{title:"Borrowing Capacity Simulation",date:"Date",maxBudget:"Maximum total budget",monthlyPayment:"Monthly payment",debtRatio:"Debt ratio",yourProject:"Your project",projectType:"Project type",monthlyIncome:"Monthly income",personalContribution:"Personal deposit",monthlyDebts:"Monthly debts",detailedScenarios:"Detailed scenarios",years:"years",recommended:"Recommended",borrowableAmount:"Borrowable",totalBudget:"Total budget",monthlyPaymentShort:"Monthly payment",summary:"Summary",personalizedAdvice:"Personalised advice",legalWarning:"Legal notice",legalWarningText:"This estimate is indicative only. Results do not replace a banking expert's analysis. Consult your bank for a personalised offer.",mainResidence:"Primary residence",rentalInvestment:"Rental investment"},mortgage:{title:"Mortgage Simulation",date:"Date",amountBorrowed:"Amou
1308nt borrowed",monthlyPayment:"Monthly payment",duration:"Duration",years:"years",rate:"Rate",totalInterest:"Total interest",annualAmortizationTable:"Annual amortization schedule",year:"Year",capitalBefore:"Capital before",interest:"Interest",capitalRepaid:"Capital repaid",remainingCapital:"Remaining capital",legalWarning:"Legal notice",warningText:"This document is an indicative estimate based on a fixed rate. Actual conditions may vary. Consult an adviser."},tri:{title:"Profitability Report",subtitle:"Property Analysis",triReturn:"IRR (Return)",cashflowAvg:"Cashflow (Yr 1 Avg)",totalWealth:"Total Wealth",assumptions:"Assumptions",purchasePrice:"Purchase Price",feesAndWorks:"Fees + Works",contribution:"Deposit",loan:"Loan",conditions:"Conditions",over:"over",years:"years",visualizationLabel:"Cashflow & Wealth Visualisation",annualDetail:"Annual Detail ({duration}-year Projection)",year:"Year",cashflow:"Cashflow",crd:"Outstanding",propertyValue:"Property Value",cumulatedNet:"Cumulative Net",generatedBy:"Generated by Arcanes. Indicative simulation."},rentalYield:{title:"Rental Yield",date:"Date",netNetYield:"Net-net yield",grossYield:"Gross yield",equityYield:"Equity yield",investmentData:"Investment data",purchasePrice:"Purchase price",personalContribution:"Personal deposit",borrowedAmount:"Borrowed amount",monthlyRent:"Monthly rent",yieldEvaluation:"Yield assessment",low:"Low",medium:"Medium",excellent:"Excellent",monthlyRentBreakdown:"Monthly rent breakdown",charges:"Charges",loan:"Loan",cashflow:"Cashflow",toFinance:"To finance",positiveCashflow:"Positive cashflow",savingsEffortRequired:"Savings effort required",annualCashflow:"Annual cashflow",annualEffort:"Annual effort",monthlyCashflow:"Monthly cashflow",monthlyEffort:"Monthly effort",warning:"Notice",warningText:"This estimate is indicative only and does not replace a complete analysis including taxation, financing, property tax and vacancy."},notaryFees:{title:"Deed Fee Estimate",date:"Date",totalToPay:"Estimated total",includingFees:"including {amount} in notary fees",propertyInfo:"Property information",region:"Region",propertyType:"Property type",purchasePrice:"Purchase price",conditions:"Conditions",firstPurchase:"First purchase",newProperty:"New build",mortgage:"Mortgage",standard:"Standard",wallonia:"Wallonia",brussels:"Brussels-Capital",flanders:"Flanders",house:"House",apartment:"Apartment",land:"Land",detailedBreakdown:"Detailed cost breakdown",transactionAmount:"Transaction amount",registrationRights:"Registration fees",vat:"VAT (21%)",notaryFees:"Notary fees",adminFees:"Admin fees",ofTotal:"{percentage}% of total",feesBreakdownChart:"Fee breakdown",rightsVat:"Rights/VAT",fees:"Fees",admin:"Admin",importantInfo:"Important information",importantInfo1:"Notary fees are generally payable on the day of signing.",importantInfo2:"The notary must provide a detailed estimate before signing the preliminary agreement.",importantInfo3:"These fees are generally not covered by mortgage financing.",legalWarning:"Legal notice",legalWarningText:"This estimate is indicative only. Actual fees may vary. Consult a notary for a precise estimate."},peb:{title:"EPC Simulation",date:"Date",energyScore:"Energy score",annualConsumption:"Annual consumption",estimatedAnnualCost:"Estimated annual cost",propertyInfo:"Property information",region:"Region",propertyType:"Property type",livableArea:"Living area",electricityPrice:"Electricity price",pebClassification:"EPC classification",yourProperty:"Your property",energyConsumptionBreakdown:"Energy consumption breakdown",breakdownEstimate:"Estimated breakdown for a score of {score} kWh/m²/yr",heating:"Heating",hotWaterSanitary:"Hot water",ventilation:"Ventilation",lighting:"Lighting",otherAppliances:"Other (appliances, etc.)",warning:"Notice",warningText:"This simulation is indicative based on averages. Actual consumption depends on many factors.",brussels:"Brussels-Capital",flanders:"Flanders",wallonia:"Wallonia",apartment:"Apartment",house:"House"}},KM={title:"The Arcanes Blog",subtitle:"Reliable, structured and understandable property anal
1308yses. No speculation, no marketing storytelling.",officialSources:"Official & verified sources",factBased:"Fact-based, not opinion-based",tags:{all:"All",peb:"EPC",financing:"Financing",yield:"Yield",investment:"Investment"},readTime:"min",trending:"Trending",read:"Read",subscribe:{title:"Receive our expert reports",frequency:"1 email/week ⢠Official sources ⢠No spam",placeholder:"[email protected]",button:"Subscribe"},footer:"Arcanes â Intelligent property analyses."},YM={back:"Back",contact:"Contact",by:"By",tagline:"An Arcanes analysis â expertise, clarity, data & property strategy",synthesis:{title:"Arcanes Summary",content:"This article aims to transform administrative jargon into concrete investment decisions: key figures, real portfolio impact and immediate action levers."},nextStep:{title:"Next step",content:"Test your situation with the Arcanes EPC/yield simulator, then keep the generated report as a basis for discussion with your banker, notary or adviser.",button:"Open simulators"},cta:{label:"Personalised analysis",title:"Have a concrete project on the table?",content:"Arcanes analyses your purchase or investment with the same rigour: market data, quantified scenarios and detailed indicators.",button:"Discover our analyses"},footer:"Arcanes. Next-generation property analysis."},ZM={title:"Contact Us",subtitle:"A question? A project? Don't hesitate to contact us.",form:{title:"Send us a message",description:"Fill in the form below and we'll respond quickly.",name:"Full name",email:"Email",phone:"Phone",subject:"Subject",message:"Message",characters:"characters",send:"Send message",sending:"Sending...",namePlaceholder:"...",emailPlaceholder:"...",phonePlaceholder:"...",subjectPlaceholder:"Your subject",messagePlaceholder:"Your message...",errors:{nameRequired:"Name is required",nameMax:"Name must be under 100 characters",emailInvalid:"Invalid email",emailMax:"Email must be under 255 characters",phoneMax:"Phone must be under 20 characters",subjectRequired:"Subject is required",subjectMax:"Subject must be under 200 characters",messageMin:"Message must be at least 10 characters",messageMax:"Message must be under 2000 characters"}},info:{title:"Contact information",description:"You can also reach us directly.",email:"Email",phone:"Phone",address:"Address"},hours:{title:"Opening hours",weekdays:"Monday - Friday",saturday:"Saturday",sunday:"Sunday",closed:"Closed"},toast:{success:"Message sent!",successDesc:"We'll respond as soon as possible.",error:"Error",errorDesc:"An error occurred while sending."}},JM={title:"Dashboard",welcome:"Welcome",myAnalyses:"My Analyses",myCredits:"My Credits",history:"History",favorites:"Favourites",profile:"Profile",types:{habitation:"Residential Analysis",investissement:"Investment Analysis",immeuble:"Multi-unit Analysis"},modified:"Simulation modified",share:"Share",export:"Export PDF",greeting:"Hello{{name}} ð",kpis:{analyses:"analyses",thisMonth:"this month",credits:"credits"}
1308,hero:{title:"Ready to invest?",subtitle:"Analyse any Belgian property in seconds.",cta:"New analysis"},empty:{title:"No analyses yet",description:"Run your first analysis to discover a property's investment potential.",cta:"Run my first analysis",hint:"Simply paste an Immoweb or Immovlan link"},referral:{title:"Earn free credits",subtitle:"Refer a friend and each receive <b>5 credits</b>.",codeCopied:"Code copied!",linkCopied:"Invite link copied!",codeLabel:"Code",inviteButton:"Invite",progressLabel:"Progress towards premium goal",progressOf:"{{current}} of {{total}}"},tabs:{recentes:"Recent",favorites:"Favourites",referral:"Referral"},historyFull:{title:"All my analyses",back:"â Back",viewAll:"View all my analyses"}},QM={synthesis:"Summary",market:"Market Reality",transformation:"Transformation Plan",projection:"10-year Projection",negotiation:"Data Summary",synthese:"Summary",marche:"Market",travaux:"Works",financement:"Financing",securite:"Security"},XM={title:"Contents",sommaire:"Contents",synthese:"Summary",marche:"Market",transformation:"Works",projection:"Projection",negociation:"Summary"},eF={excellent:"Very high index",good:"High index",correct:"Moderate index",evaluate:"Low index",caution:"Very low index"},tF={undermarket:"< market estimate",overmarket:"> market estimate",selffinanced:"Calculated positive cashflow",highyield:"Gross yield > 6%",energyreno:"Estimated EPC works"},nF={tri:{label:"IRR (10 yrs)",benchmark:"Market: 5-7%",definition:"Internal Rate of Return - Measures overall investment profitability over 10 years, including cashflows and resale gain."},cashflow:{label:"Cashflow",perMonth:"/month",definition:"Monthly cash flow after all charges and loan repayment."},rendement:{label:"Net Yield",afterCharges:"After charges",definition:"Net operating income (NOI) divided by total investment."},multiplicateur:{label:"Multiplier",onEquity:"On equity",definition:"Ratio of total gains to initial deposit. 4x means you quadruple your stake."},noi:{label:"NOI",definition:"Net Operating Income - Rental income minus all operating charges (excl. financing)."},prix:{label:"Purchase Price"},total:{label:"Total Investment",subtext:"Fees & works included"},mensualite:{label:"Monthly Payment",subtext:"/month"},apport:{label:"Required Deposit"}},rF={prix:"Purchase price",frais:"Acquisition fees",travaux:"Works budget",total:"Project Cost"},aF={equilibre:{title:"Calculated equilibrium price",reduction:"Observed gap",arv:"Estimated ARV",travaux:"- Works",frais:"- Fees & margin"},args:{market:{title:"Position vs estimate",desc:"Price observed {{pct}} above local market estimate.",under:"Price observed {{pct}} below local market estimate."},travaux:{title:"Estimated works budget",desc:"Includes EPC compliance and estimated finishing."},arv:{title:"Post-renovation estimate (ARV)",positive:"Gap between total cost and post-works estimate: {{marge}}",negative:"Total project cost exceeds post-works estimate."}},text:{title:"Data summary",collapse:"Collapse",expand:"See full text",disclaimer:"This data is generated for information only. It does not constitute advice. Seek professional guidance."},generated:{opening:`Summary of factual data for this property: 1309 1310`,market:`Positioning: The listed price of {{prix}} is {{position}} by {{pct}} compared to the Arcanes market estimate. 1311 1312`,travaux:`Estimated works budget: {{budget}} for EPC compliance and finishing. Include in total project cost calculation. 1313 1314`,conclusion:`Theoretical equilibrium price: Based on assumptions (estimated works and algorithmic gap), a theoretical equilibrium price could be around {{prix}}. 1315 1316This analysis is purely indicative and does not constitute investment advice. Amounts are estimates to be validated by qualified professionals.`}},iF={title:"Quick actions",schedule:"Schedule a visit",contact:"Contact agency",save:"Save analysis"},sF={text:"Decision support tool. This analysis does not constitute personalised investment advice."},oF={description:"See Beyond the Bricks.",navigation:"Navigation",simulators:"Simulators",pricing:"Pricing",contact:"Contact",communes:"Municipalities",blog:"Blog",legal:"Legal",legalNotice:"Legal notice",privacy:"Privacy policy",terms:"T&Cs",manageCookies:"Manage cookies",allRightsReserved:"All rights reserved",about:"About",infoOnly:"Simulators for informational purposes only.",faq:"FAQ & Glossary",dataDeletion:"Data deletion"},lF={header:{title:"Refer friends, become a Premium member",subtitle:"Invite friends to discover Arcanes. Each sign-up brings
1316you closer to Premium status."},status:{friendsProtected:"Friends referred",creditsEarned:"Credits earned"},benefits:{youGet:"You earn",youGetValue:"Unlock your rewards",friendGets:"Your friend receives",friendGetsValue:"2 free credits"},emptyState:{title:"Invite your first friend!",subtitle:"Each referral brings you closer to Premium.",cta:"Invite via WhatsApp"},tiers:{starter:{name:"Starter",reward:"-",description:"Start the adventure."},scout:{name:"Scout",reward:"+1 Credit",description:"First referral!"},investor:{name:"Investor",reward:"+5 Credits",description:"Your network is growing."},visionary:{name:"Visionary",reward:"PREMIUM",rewardAlt:"+10 Credits",description:"Access to advanced features."},magnate:{name:"Magnate",reward:"+25 Credits",description:"A true leader."},baron:{name:"Baron",reward:"Partner",description:"Certified Arcanes expert."}},progress:{title:"Your progress",friendsProgress:"{{current}}/{{target}} friends",visionaryGoal:"Goal: 10 friends",visionaryReward:"Unlock Premium Status and advanced features",visionaryRewardAlt:"Earn 10 bonus credits",viewAllLevels:"View all levels",hideLevels:"Hide",maxReached:"Maximum level reached!"},sharing:{title:"Share your referral link:",copy:"Copy",copied:"Copied!",emailSubject:"Arcanes - 2 free property analyses",whatsappMessage:"Hey! I'm offering you 2 free property analyses on Arcanes. Try it before your next visit:",previewLabel:"Pre-written message:"},friends:"friend",friendsPlural:"friends"},dF={defaultTitle:"Data validation",defaultInstructions:"Please verify and complete the information below.",closeConfirm:{title:"Close the form?",description:"If you close now, your credit will be refunded and entered data will be lost.",cancel:"Continue validation",confirm:"Close and refund"},global:{title:"Overall property data",complete:"Complete"},units:{title:"Unit details",complete:"complete",completePlural:"complete",toComplete:"to complete",toCompleteLabel:"To complete"},fields:{select:"Select...",enterValue:"Enter a value...",yes:"Yes",no:"No"},buttons:{abandon:"Abandon (credit refunded)",validate:"Validate and launch analysis",analyzing:"Analysing..."},immeubleWarning:{title:"Warning: Multi-unit building",message:"Multi-unit listings often lack detailed information. Please complete each unit's data carefully."},context:{price:"Price",surface:"Surface",propertyType:"Property type",notCommunicated:"N/C",notSpecified:"Not specified",descriptionTitle:"Listing description",viewSource:"View source",noDescription:"No description available."},badges:{required:"Required"},unitTitle:"Unit {{number}}",fieldLabels:{type_bien:"Type",surface_habitable_m2:"Living area (m²)",lettre_peb:"EPC",etat_general:"Condition",parking:"Parking",terrasse:"Terrace",jardin:"Garden"},options:{etat_general:{freshlyRenovated:"Freshly renovated",excellent:"Excellent condition",good:"Good",toRefresh:"To refresh",toRenovate:"To renovate",toRestore:"To restore"}}},cF={tabs:{profile:"Profile",security:"Security",notifications:"Notifications"},nav:{back:"Back",subtitle:"Manage your profile and preferences"},profile:{photo:"Profile photo",photoDesc:"Your avatar is automatically generated from your initials.",photoFormat:"Future supported format: JPG, PNG (max 2MB)",info:"Profile information",username:"Username",usernamePlaceholder:"Your name",usernameHint:"This
1316name will be displayed in your dashboard.",email:"Email address",emailHint:"Email cannot be changed. Contact support if needed.",language:"Preferred language",memberSince:"Member since",saving:"Saving...",save:"Save changes"},security:{changePassword:"Change password",changePasswordDesc:"Secure your account with a new password",currentPassword:"Current password",newPassword:"New password",minChars:"Minimum 8 characters",confirmPassword:"Confirm new password",changing:"Changing...",changeBtn:"Change password",activeSessions:"Active sessions",comingSoon:"Coming soon",sessionsDesc:"You'll soon be able to see and manage your active sessions."},notifications:{noNotifications:"No notifications",noNotificationsDesc:"You'll be notified of important updates here.",preferences:"Notification preferences",preferencesDesc:"Choose how you want to receive notifications",inApp:"In-app notification",byEmail:"Email notification",referralSignup:"ð New referral signed up",referralSignupDesc:"When someone creates an account with your referral code",referralPurchase:"ð° Referral's first purchase",referralPurchaseDesc:"When your referral makes their first credit purchase",referralMilestone:"â Referral milestone reached",referralMilestoneDesc:"When you reach 10 active referrals and unlock Premium",general:"â¹ï¸ General notifications",generalDesc:"Other system notifications and updates",emailNote:"Email notification note",emailNoteDesc:"Email notifications will be available soon. You can already configure your preferences.",loading:"Loading..."},dangerZone:{deleteAccount:"Delete account",irreversible:"Irreversible action",delete:"Delete",cancel:"Cancel",confirmWord:"DELETE",confirmText:"Type <strong>{{word}}</strong> to confirm permanent deletion of your account and all data.",confirm:"Confirm"},toasts:{profileSaved:"Profile updated successfully",profileError:"Error saving",passwordMismatch:"Passwords don't match",passwordTooShort:"Password must be at least 8 characters",passwordChanged:"Password changed successfully",passwordError:"Error changing password",confirmRequired:"Please type {{word}} to confirm",accountDeleted:"Account deleted",accountDeleteError:"Error deleting account",prefsUpdated:"Preferences updated",prefsUpdatedDesc:"Your notification preferences have been saved.",prefsError:"Error",prefsErrorDesc:"Unable to update preferences."}},uF={home:{title:"Arcanes â Intelligent property analysis in Belgium",description:"Analyse any Belgian property listing in 10 seconds. Complete valuation reports, 6 free simulators, data on 581 municipalities."},freeAnalyse:{title:"Free property listing analysis | Arcanes",description:"Paste any Belgian property listing link and get a complete analysis in 10 seconds. Score, price/m², EPC, rental yield. Free."},simulateur:{title:"Free property simulators â Belgium | Arcanes",description:"Simulate notary fees, borrowing capacity, rental yield, EPC impact and IRR in Belgium. Six free online tools."},simulateurFraisActe:{title:"Belgium notary fee simulator 2026 | Arcanes",description:"Precisely calculate your notary fees for a Belgian property purchase: registration fees, fees and charges by region."},simulateurPret:{title:"Belgian mortgage simulator | Arcanes",description:"Simulate your mortgage: monthly payments, total cost, amortization schedule. Adapted to current Belgian rates."},simulateurEmprunt:{title:"Belgian borrowing capacity simulator | Arcanes",description:"Calculate your maximum borrowing capacity based on your income, charges and deposit. Belgian banking standards."},simulateurPEB:{title:"EPC simulator â Energy impact on price | Arcanes",description:"Assess the EPC certificate impact on property value in Belgium. Estimate energy renovation costs."},simulateurRendement:{title:"Belgian rental yield simulator | Arcanes",description:"Calculate gross and net rental yield of your investment. Charges, vacancy and taxation included."},simulateurPrixM2:{title:"Price per m² by municipality | Arcanes",description:"Estimate the price per m² in any Belgian municipality. Updated StatBel data."},simulateurTRI:{title:"Belgian property IRR simulator | Arcanes",description:"Calculate the Internal Rate of Return of your rental investment over 10-25 years. Resale, gain and cashflows included."}
1316,tarifs:{title:"Pricing â Premium property analyses | Arcanes",description:"Discover our Belgian property analysis plans: from free analysis to complete premium report with quality score, negotiation support and financial projection."},blog:{title:"Belgian property blog â Guides & analyses | Arcanes",description:"Market analyses, practical guides and Belgian property data. Factual articles on EPC, notary fees, rental yield and investment."},faq:{title:"FAQ & Property glossary | Arcanes",description:"Find answers about Arcanes property analysis and consult our complete Belgian financial and property glossary."},contact:{title:"Contact Arcanes â Support and questions",description:"Question about our property analyses? Contact the Arcanes team. Quick response guaranteed."},map:{title:"Interactive Belgian municipality map | Arcanes",description:"Explore property data for every Belgian municipality: median prices, yields, investment scores and trends."},login:{title:"Login | Arcanes",description:"Log in to your Arcanes account to access your property analyses and credits."},signup:{title:"Create account | Arcanes",description:"Create your free Arcanes account and get a free analysis credit to test our platform."}},mF={title:"Intelligent property analysis",subtitle:"Paste your listing URL, Arcanes does the rest",loading:"Loading analysis...",upload:{dragDrop:"Import your listing",format:"(PDF format - 1 file max)",fileUploaded:"File imported",or:"OR",placeholderUrl:"Paste the listing URL here..."},header:{preview:"Preview",fullAnalysis:"Full Analysis"},form:{analysisType:"Analysis type",mainResidence:"Primary residence",mainResidenceDesc:"For a property you'll live in",rentalInvestment:"Rental investment",rentalInvestmentDesc:"For a property to rent out",uniqueProperty:"Only property (sole property owned)",buttons:{analyzing:"Analysing...",freePreview:"Free preview (limited)",premium:"Full analysis (1 credit)",unlock:"Unlock full analysis"}},languageMismatch:{title:"Analysis language",message:"Your profile is set to {{profileLang}}, but the interface is currently in {{currentLang}}. Which language would you like your analysis in?",useProfile:"{{lang}} (profile)",useCurrent:"{{lang}} (current)"},types:{personalHome:"Personal Residence",rentalInvestment:"Rental Investment",multiUnit:"Multi-unit Building"},badges:{personalHome:"Personal Residence",uniqueHome:"Primary Residence",rentalInvestment:"Rental Investment",multiUnit:"Multi-unit Building",units:"units",lots:"units",alert:"Gap observed",gross:"Gross"},stats:{surface:"Surface",price:"Price",monthlyBudget:"Monthly Budget",grossRent:"Gross Rent",totalSurface:"Total Surface",pricePerDoor:"Price/Door",totalRent:"Total Rent",perMonth:"/month",totalInvestment:"Total investment"},banners:{uniqueHome:{title:"Primary Residence Advantage",savings:"Saving of {{amount}} on registration fees"},priceGap:{title:"{{percent}}% gap observed vs market estimate",description:"Detailed analysis explores factors behind this gap.",descriptionInvest:"Detailed analysis includes net yield and cashflow data.",cta:"See detailed analysis"}},keyFacts:{title:"Key Facts",property:{label:"The Property",defaultType:"Property",defaultZone:"Residential area",building:"Building",context:"Located in {{city}} ({{zone}}).",contextNoCity:"{{zone}}."},budget:{label:"Monthly Budget",perMonth:"/ month",context:"Including mortgage, charges and energy."},price:{label:"Price Position",perSqm:"/ m²",contextNeutral:"Gap of {{percent}} observed vs Arcanes market estimate.",perDoor:"/door"},priceBadge:{belowEstimate:"< estimate",aboveEstimate:"> estimate",withinRange:"Within range"},works:{label:"Works Budget",estimated:"estimated",none:"None",contextWithWorks:"Budget for complete renovation.",contextNoWorks:"No works planned in this analysis."},energy:{label:"Performance",contextNeutral:"Official EPC certificate. Energy charges vary by usage."},fiscal:{label:"Tax Regime",standard:"Standard",standardContext:"Standard registration fees applied.",reduced:"Reduced",reducedContext:"Reduced primary residence rate applicable."},rent:{label:"Estimated rent",contextInvest:"Estimated gross monthly rent based on local rental market.",contextImmeuble:"Cumulative monthly rental income from all units.",units:"units"},multiUnit:{label:"Distribution",vacancyUnit:"impact per vacancy",context:"With multiple units, a vacancy only affects a fraction of total rental income."},mortgage:{label:"Mortgage payment",context:"Monthly mortgage repayment only."}},sections:{marketPosition:"Market Position",monthlyBudget:"Monthly Budget",syntheticIndex:"Synthetic Index",buyVsRent:"Buy vs Rent",financialStructure:"Financial Structure",energyPerformance:"Energy Performance",postWorksEstimate:"Post-works Estimate",yield:"Yield",unitsOverview:"Units Overview",multiUnitData:"Multi-unit data",monthlyCost:"Monthly living cost"},market:{pricePerSqm:"Price per m²",marketEstimate:"Market Estimate",acquisitionPrice:"Purchase Price",pricePerDoor:"Price/Door",range:"Range",belowEstimate:"Below estimate",aboveEstimate:"Above estimate",significantGap:"Significant gap observed",withinRange:"Within estimated range"},budget:{composition:"Mortgage + Charges + Energy",mortgage:"Mortgage Payment",charges:"Charges",energy:"Energy",effortRate:"Indicative effort rate",effortRateDescription:"Compare this monthly budget to your net income. An effort rate below 35% is generally sustainable."},financial:{acquisitionPrice:"Purchase price",registrationFees:"Registration fees",notaryFees:"Notary fees",acquisitionFees:"Acquisition fees",worksBudget:"Works Budget",totalInvestment:"Total Investment",requiredDeposit:"Required Deposit",monthlyPayment:"Monthly Payment",mortgagePayment:"Mortgage Payment",investmentPerDoor:"Investment/Door",perUnit:"per unit",ofTotal:"of total",years:"years",at:"at"},energy:{annualCharges:"Annual energy charges",estimatedSavings:"Estimated annual savings",year:"year",plannedBudget:"Planned EPC budget"},yield:{calculation:"Gross rent / Purchase price",monthlyRent:"Monthly Rent",rentPerDoor:"Rent/Door"},units:{rentHidden:"Rent hidden"},multiUnit:{vacancyImpactNeutral:"Impact of a single vacancy on total income",oneVacancyNeutral:"One vacant unit represents a {{percent}}% loss of total rental income.",vsSingle:"vs 100% on a single property"}
1316,blurred:{score:{title:"Synthetic index",ready:"Index calculated based on property data.",loading:"Index calculated on several objective criteria.",cta:"See my score"},buyVsRent:{title:"Buy vs rent comparison",description:"Comparative 10-year cost simulation of buying vs renting.",cta:"See comparison"},plusValue:{title:"Post-works estimate",description:"Comparison between total cost and post-works market estimate.",cta:"See latent margin"},yield:{title:"Detailed yield data",yourGross:"Calculated gross yield:",description:"Full analysis includes net yield, cashflow and IRR.",cta:"See real profitability"},energy:{title:"Energy Detail",description:"Subsidies, annual savings and payback time",cta:"See energy ROI"},units:{title:"Detail of {{count}} Units",description:"Rents, yields and optimisation potential per unit",cta:"See each unit"},arv:{title:"Post-works estimate (ARV)",description:"Comparison between total acquisition cost and post-renovation market estimate.",cta:"See latent margin"}},premium:{tri:"10-yr IRR",cashflow:"Net Cashflow",taxes:"Taxation",pdfReport:"PDF Report",arvMargin:"ARV & Margin",unitAnalysis:"Unit Analysis",report10p:"10p Report",score100:"Score /100",buyVsRent:"Buy vs Rent",projections:"Projections",report11p:"11p Report"},cta:{title:"Unlock the full analysis",description:"Access all financial indicators, 10-year projections and detailed simulations.",unlock:"Unlock now"},modal:{title:"Full analysis",subtitle:"All indicators calculated for this property.",unlockButton:"Unlock (1 Credit)",cancelButton:"No thanks, back to preview",home:{score:{title:"Synthetic Index /100",sub:"4 weighted criteria"},buyVsRent:{title:"Buy vs Rent",sub:"Detailed comparison"},projections:{title:"10-year Projections",sub:"Wealth evolution"},pdf:{title:"11-page PDF Report",sub:"With comparison page"}},invest:{cashflow:{title:"Real Net Cashflow",sub:"After charges and tax"},tri:{title:"10-year IRR",sub:"Internal rate of return"},projections:{title:"Wealth Projections",sub:"10-year evolution"},pdf:{title:"Premium PDF Report",sub:"Professional document"}},multiUnit:{arv:{title:"ARV & Latent Margin",sub:"Immediate value creation"},units:{title:"Per-unit Analysis",sub:"Each unit's yield"},tri:{title:"IRR & Cashflow",sub:"Full performance"},pdf:{title:"10-page PDF Report",sub:"Professional document"}}},dialogs:{missingInfo:{title:"Missing information",desc:"For a complete analysis, we need some additional information."},payment:{title:"Choose your option",desc:"Use a credit or top up to access the full analysis",useCredit:"Use 1 credit",remaining:"Remaining credits:",noCreditsTitle:"No credits available",recharge:"Top up my account",cancel:"Cancel"},download:{title:"Full analysis ready!",desc:"Preview and download your complete property analysis report",pdf:"PDF Document",word:"Word Document",download:"Download",wordNoticeTitle:"Word Document (.docx)",wordNoticeDesc:"Preview not available for Word files. Download to view.",downloadNow:"Download now",close:"Close",downloadAndClose:"Download and close"},noCredit:{title:"Insufficient credits",desc:"No credits available for a complete analysis",rechargeTitle:"Top up to continue",rechargeDesc:"Access complete and detailed PDF analyses",seePricing:"See pricing"},error:{button:"Understood"},unsupportedDomain:{title:"Unsupported site",message:`The site "{{domain}}" is not yet supported by Arcanes. 1317 1318To analyse this property, export the listing as PDF and use the "Import file" option.`,howTo:"How to?",step1:"On the property site, print the page as PDF (Ctrl+P â Save as PDF)",step2:'Return to Arcanes and click "Import file"',step3:"Select your PDF and launch the analysis"}},footer:{disclaimer:"Automatically generated document. Simulations are indicative based on market data. Freemium version."},toasts:{successTitle:"Analysis complete",analysisCompleted:"Your analysis has been generated successfully.",analysisProcessed:"Your analysis has been processed successfully.",errorTitle:"Error",genericError:"An error occurred. Please try again.",warning:"Warning",provideUrlOrFile:"Please provide a listing URL or import a PDF.",selectType:"Please select property type (primary residence or investment).",paymentCancelled:"Payment cancelled",paymentCancelledDesc:"Payment was cancelled. No credit charged.",analysisReady:"Analysis ready",freeAnalysisReady:"Your free preview is ready.",creditRefundedTitle:"Credit refunded",creditRefundedDesc:"Your credit has been refunded due to the error.",anal
1318ysisFailedRefunded:"Analysis failed but your credit has been refunded automatically."}},pF={locked:"Reserved for Premium members",unlock:"Unlock this feature",cta:"Go Premium",memberBadge:"Premium Member",description:"Access this exclusive feature by becoming a Premium member.",packInfo:"Available with Smart, Investor and Pro+ packs",triLocked:"The IRR & Profitability simulator is reserved for Premium members",triDescription:"Calculate the Internal Rate of Return of your property investments with our advanced simulator.",mapPredictLocked:"Market predictions are reserved for Premium members",header:{analyseHabitation:"Residential Analysis",analyseInvestissement:"Investment Analysis",analyseImmeubleRapport:"Multi-unit Analysis",plateformeAnalyse:"Property analysis platform",genere:"Generated on",peb:"EPC"},actions:{imprimerPDF:"Print / PDF",nouvelleAnalyse:"New analysis"},investissement:{hero:{tri:"10-yr IRR",triBenchmark:"Market benchmark: {{moyen}}% (average) ⢠{{excellent}}% (excellent)",cashflow:"Monthly cashflow",cashflowSubtext:"Net cash after payments, charges and tax",prixAcquisition:"Purchase price",prixPerM2:"{{prix}}
1318/m²",surface:"Surface",badges:{excellent:"Excellent",bon:"Good",moyen:"Average",faible:"Low",cashflowPositif:"Positive cashflow",autofinancement:"Self-financing",effortRequis:"Effort required"}},rendements:{title:"Yields",rendementBrut:"Gross yield",rendementNet:"Net yield",rendementNetNet:"Net-net yield",rendementFondsPropres:"Equity yield",surFondsPropres:"on equity",explicationFondsPropres:"Return calculated on your initial deposit, accounting for credit leverage",moyen:"Avg",bon:"Good",excellent:"Excel",performance:{excellent:"Excellent",bon:"Good",moyen:"Average",faible:"Low"},noteTitle:"Good to know",noteExplication:"Coloured zones indicate Belgian market benchmarks. The longer and greener the bar, the better the yield."},tri:{title:"Internal Rate of Return (IRR)",sur10ans:"Over 10 years",apportInitial:"Initial deposit",apportTresorerie:"Cash contribution",cashflowsNegatifs:"Cumulative negative cashflows",investissementTotal:"Total real investment",gainsSur10ans:"10-year gains",cashflowsCumules:"Cumulative cashflows",plusValueRevente:"Resale gain",desGains:"of gains",multiplicateurApport:"Deposit multiplier",explicationMultiplicateur:"Your deposit of {{apport}} becomes {{valeur}}",benchmarksMarche:"Belgian market ranges",moyen:"Average",bon:"Good",excellent:"Excellent",performance:{excellent:"Excellent",bon:"Good",moyen:"Average",faible:"Low"}},projection:{title:"10-year Projection",annee:"Year",loyerEffectif:"Effective rent",charges:"Charges",mensualites:"Payments",impot:"Tax",cashflow:"Cashflow",capitalRestant:"Remaining capital",an:"Yr",final:"Final",moyenne:"Average",annee10:"Year 10 - Resale",fluxRevente:"Resale flow",gainRevente:"Net resale gain",cashflowTotal:"Total cashflow",fluxCumules:"Cumulative flows + resale",noteTitle:"Good to know",noteExplication:"Projection based on rent and charge indexation assumptions. Key years shown (1, 2, 3, 5, 7, 10)."},revente:{title:"Resale Scenario (Year 10)",prixAchat:"Purchase price",valeurFuture:"Future value",sur10ans:"over 10 years",investissementInitial:"Initial investment",appreciation:"appreciation",fraisVente:"Sale fees",fraisAgence:"Agency fees",fraisNotaire:"Seller notary fees",totalFrais:"Total sale fees",detteRestante:"Remaining debt",produitNet:"Net sale proceeds",apresDetteEtFrais:"After debt and fees",plusValue:"Capital gain",plusValueBrute:"Gross gain",taxePlusValue:"Capital gains tax",noteFiscale:"Tax note",explicationFiscale:"Belgian tax law provides specific rules for property capital gains based on holding period. This is indicative and does not constitute tax advice. Consult a tax adviser."},optimisations:{title:"Rental market comparison",loyerOptimise:"Optimised rent",loyerAligneMarche:"Current rent is aligned or above market",potentielDetecte:"Gap with local market detected",loyerInferieurMarche:"Current rent appears below local market",potentiel:"potential",comparaison:"Current rent vs market comparison",loyerActuel:"Current rent/m²",prixMarche:"Market price/m²",gainPotentiel:"Potential gain if aligned to market",parMois:"Per month",parAn:"Per year",sur10ans:"Over 10 years",conseil:"Comparative data",explicationConseil:"Average local market rent for this property type is around {{prix}} â¬/m²."}},shared:{priceAnalysis:{title:"Value Analysis",verdictPrix:"Price Position",positionnementMarche:"Market positioning",sousEvalue:"Below estimate",prixJuste:"Within estimated range",surEvalue:"Above estimate",prixAcquisition:"Purchase price",valeurMarche:"Estimated market value",ecartMontant:"Value gap",bonusAtouts:"Feature bonuses applied",verdict:{sousMarche:"Below market estimate",audessusMarche:"Above market estimate",aligneMarche:"Within estimate range"}}},habitation:{score:{title:"Arcanes Synthetic Index",prixVsMarche:"Price vs Market",performancePEB:"EPC Performance",accessibilite:"Accessibility",poids:"Weight",scoreTotal:"Total score",baseSur:"Based on",points:"points",methodo:"Methodology",explicationMethodo:"The Arcanes index aggregates 3 weighted criteria: price/estimate ratio (40%), energy performance (35%), and accessibility/location (25%). A synthetic index, not a recommendation."},budget:{title:"Monthly Budget",budgetTotal:"Total Budget",parMois:"per month",credit:"Mortgage",charges:"Charges",energie:"Energy",duBudget:"of budget",budgetAnnuel:"Annual budget",mois:"months"},projection:{title:"10-year Wealth Projection",patrimoineNet:"Year 10 net equity",sur10ans:"over 10 years",multiplicateurApport:"Deposit multiplier",evolutionBien:"Property value evolution",valeurActuelle:"Current value",plusValueEstimee:"Estimated gain",valeurFuture:"Future value",remboursementCredit:"Loan repayment",capitalRembourse:"Capital repaid",duCredit:"of loan",detteRestante:"Remaining debt",remboursé:"Repaid",restant:"Remaining",interetsPayes:"Interest paid",retourSurApport:"Return on deposit",explicationRetour:"Net gain relative to your initial deposit",noteTitle:"Good to know",noteExplication:"This projection assumes average 2% annual property appreciation. Your net equity represents property value minus remaining debt."}},cashflow:{title:"Cashflow & Treasury",perMonth:"/month",perYear:"/year",soit:"i.e.",projection10ans:"10-year projection",fluxCumules:"Cumulative flows",sur10ans:"over 10 years",impact1an:"1-year impact",impact5ans:"5-year impact",impact10ans:"10-year impact",scenarios:{positif:{title:"Positive cashflow",subtitle:"Cash surplus",description:"This property generates a monthly cash surplus. Rents cover all charges, loan and taxes with a surplus."}
1318,neutre:{title:"Self-financing",subtitle:"Budget balance",description:"This property is self-financing. Rents roughly cover payments and charges. Wealth grows via capital repayment."},negatif:{title:"Savings effort",subtitle:"Long-term investment",description:"This property requires monthly savings. Wealth grows via gradual capital repayment and potential resale gain."}},bonASavoir:"Good to know:",notepedagogique:"Cashflow does not reflect total wealth creation. Even with negative cashflow, you build wealth through capital repayment and potential property appreciation."},score:{sur:"/{{max}}"}},gF={title:"Glossary & Methodology",subtitle:"{count} detailed concepts to understand our analyses.",search:"Search a definition (e.g.: ARV, IRR, Rebound...)",noResults:'No results for "{query}"',tabs:{habitation:"Residential Purchase",investissement:"Rental Investment"},categories:{bien:"The Property & Valuation",valorisation:"Valuation & Market Price",couts:"Costs, Works & Energy",financement:"Bank & Financing",fiscalite:"Taxation & Taxes",revenus:"Rental Income & Vacancy",charges:"Charges & Insurance",kpi:"Profitability Indicators (KPI)",projection:"Wealth Projection (10 yrs)",peb:"Energy Performance",scoreHabitation:"Arcanes Synthetic Index"},terms:{bien:{surface:{term:"Weighted Living Area",definition:"Surface used as the basis for all price/m² calculations. Includes heated living spaces. Arcanes applies weighting: small surfaces (studios) are worth more per m² than large ones (villas), automatically corrected by our algorithm."},type:{term:"Property type",definition:"The property category (Apartment, House, Multi-unit) radically influences the cost structure. An apartment includes co-ownership charges and lower maintenance, while a house has no syndic fees but higher structural maintenance."},etat:{term:"Property condition (Coefficient)",definition:"Objective assessment of the property's visual condition. Our algorithm applies a multiplier: 'To renovate' = automatic discount (0.80), 'New/Excellent' = premium (1.18-1.25).",formula:"Coef: Ruin (0.65) to New (1.18)"},atouts:{term:"Valued Features",definition:"Specific comfort elements detected in the listing that increase sale and rental value. Arcanes adds cumulative bonuses for Garden, Terrace or Parking.",example:"Garden (+3-5%), Terrace (+2-3%), Parking (+â¬100/month rent)."}},valorisation:{estActuel:{term:"Estimated Price/m² (Current)",definition:"Theoretical fair value in current condition, before any work. Calculated by crossing regional market data with Postal Code precision, adjusted by condition, EPC and specific features.",formula:"Regional Base à Postal Code Coef à Condition Coef à EPC Coef à Features"},arv:{term:"ARV (After Repair Value)",definition:"Projected value once works are complete. Simulates a perfect property (New condition + Target EPC A/B) in this specific area. Premium areas include a Scarcity Bonus.",formula:"Base Price à Area Coef à Condition (Renovated) à Scarcity Bonus"},bonusRarete:{term:"Scarcity Bonus",definition:"Exclusive Arcanes mechanism. Renovating to high EPC (A/B) in a high-demand area earns an additional premium.",formula:"+5% (Premium) to +10% (Ultra-Premium)"},margeLatente:{term:"Latent Margin",definition:"Gap between post-works market estimate (ARV) and total project cost (Purchase + Works). Positive = cost below final estimate.",formula:"ARV - (Purchase + Works Budget)"},ecart:{term:"Market Gap",definition:"Comparison between asking price and our algorithmic estimate. Negative gap = listed below theoretical value.",formula:"(Asking Price - Estimate) / Estimate"}},couts:{fraisAcq:{term:"Acquisition Fees",definition:"All sunk costs paid at purchase. Arcanes precisely calculates Registration Fees (by region and tax regime), notary fees (statutory) and administrative costs.",formula:"Registration + Notary Fees + Admin + VAT"},travauxEnergie:{term:"Energy Works",definition:"Estimated budget to bring the property from current EPC to 2050 target (A or B). Cost based on consumption gap (kWh/m²).",formula:"Score gap (kWh) à Regional unit cost"},travauxFinit:{term:"Finishing Works",definition:"Cosmetic budget (kitchen, floors, painting) calculated independently from energy works. Based on a per-m² rate by declared condition.",formula:"Rate/m²: â¬0 (New) to â
1318¬1,000 (Ruin)"},tvaRenov:{term:"Renovation VAT Rate",definition:"VAT rate on works. Algorithm detects building age: if >10 years, reduced 6% rate applies.",formula:"6% if building >10 years, otherwise 21%"},effetRebond:{term:"Rebound Effect (Energy)",definition:"Behavioural correction for thermal sieves (EPC F/G). Occupants actually heat less than theory suggests. Real savings after works are lower than theoretical.",formula:"Real Consumption = 75% of Theoretical for EPC F/G"}},charges:{maintenance:{term:"Structural Maintenance",definition:"Financial provision for major future repairs (roof, facade, boiler). Calculated per m²: renovated = less maintenance (â¬8/m²), old = more (â¬18/m²).",formula:"â¬8/m²/yr (Renovated) OR â¬18/m²/yr (Old)"},copro:{term:"Co-ownership Charges",definition:"Apartments only: syndic, common area cleaning and lift. If not provided, Arcanes applies a standard estimate.",formula:"Est. ~â¬1.5-2/m²/month (if not specified)"},assurance:{term:"Fire Insurance",definition:"Annual premium estimate based on new-build re
1318construction value (~â¬1,500-1,800/m²).",formula:"Surface à Reconstruction Cost à Insurance Rate"},entretien:{term:"Maintenance Provision",definition:"Budget for routine maintenance (plumbing, seals, minor repairs).",formula:"0.5% of property price/year"}},financement:{investTotal:{term:"Total Investment",definition:"Overall turnkey project amount. Sum of Purchase, Acquisition Fees and total Works budget.",formula:"Purchase + Acquisition Fees + Total Works"},mensualite:{term:"Loan Payment",definition:"Monthly bank repayment simulation (Capital + Interest) based on a standard 20-year fixed rate.",formula:"Standard amortization (20-yr fixed rate)"},apport:{term:"Required Deposit",definition:"Minimum own funds. Covers Acquisition Fees (non-financeable) + property share (usually 10-20%) required by banks.",formula:"Total Investment - Amount Borrowed"},quotite:{term:"LTV (Loan-to-Value)",definition:"Percentage of the project the bank finances. Higher LTV = stronger leverage but higher risk.",example:"80% LTV = You contribute 20% + fees."},coutCredit:{term:"Total Credit Cost",definition:"Total interest paid over the full loan duration. The price of borrowed money.",formula:"(Payment à Duration) - Capital Borrowed"}},revenus:{loyerRef:{term:"Reference Rent",definition:"Standard market rent for this property type in the region, adjusted by size. Algorithm applies degression: small studios rent for more per m² than large villas.",formula:"Regional Average (â¬/m²) à Surface Coef"},loyerProjete:{term:"Projected Rent (Optimised)",definition:"Estimated rent once fully renovated. Values superior quality (New condition, Top insulation) and location, with attenuation.",formula:"Ref Rent à Area Coef (Attenuated) à Condition (New) à EPC (A)"},vacance:{term:"Vacancy",definition:"Financial safety provision for periods without tenant. Default 5% annual loss.",formula:"5% of Gross Annual Rent (~1 month empty per 20 months)"},loyerEffectif:{term:"Effective Rent",definition:"What actually enters your bank account after vacancy deduction.",formula:"Gross Rent - Vacancy"}},kpi:{rendementBrut:{term:"Gross Yield",definition:"Headline performance indicator. Does not account for acquisition fees, charges or works.",formula:"(Annual Rent / Purchase Price) à 100"},rendementNet:{term:"Net Yield",definition:"True property profitability before financing. Accounts for total cost (fees and works) and deducts non-recoverable charges.",formula:"(Rent - Charges - Vacancy) / Total Investment"},cashflow:{term:"Monthly Cashflow",definition:"Net cash flow: what remains after loan, charges and taxes. Positive = self-financing.",formula:"(Net Rent - Loan - Charges - Tax) / 12"},tri:{term:"IRR (10 yrs)",definition:"Internal Rate of Return. Annualised return on invested equity. Integrates rents, charges, loan and estimated resale gain.",formula:"Cashflows + Resale Gain (on ARV)"},multiplicateur:{term:"Deposit Multiplier",definition:"Wealth factor: how much each euro invested initially returned in total.",formula:"(Cumulative Cash + Resale Cash) / Initial Deposit"}},peb:{score:{term:"EPC Score",definition:"Primary energy consumption of the dwelling in kWh/m²/year."},travaux:{term:"EPC Works",definition:"Estimated cost to reach energy target (A or B)."},economie:{term:"Energy Gain",definition:"Estimated annual bill reduction, corrected for behavioural effect (rebound).",formula:"(Before - After Consumption) à kWh Price"},primes:{term:"Estimated Subsidies",definition:"Estimated regional subsidies deducted from gross energy works cost."}},fiscalite:{droits:{term:"Registration Fees",definition:"Regional tax on purchase. Algorithm automatically applies the current rate and preferential regimes.",formula:"Brussels 12.5% | Wallonia 12.5% | Flanders 3% (primary) or 12%"},fraisNotaire:{term:"Notary Fees",definition:"Statutory notary fees + administrative research costs.",formula:"Degressive scale + ~â¬1,000 Admin + VAT"},precompte:{term:"Property Tax",definition:"Annual property tax paid to region and municipality.",formula:"Indexed CI à Regional Rate à Municipal Surcharges"},baseImposable:{term:"Tax Base (PIT)",definition:"Fictitious income added to professional income for tax calculation.",formula:"Indexed Cadastral Income (CI) à 1.40"},habUnique:{term:"Primary Residence",definition:"Tax status allowing reduced rates (e.g. 3% in Flanders) or relief (Brussels/Wallonia) if it's your only property."}},scoreHabitation:{global:{term:"Synthetic Index",definition:"Summary score /100 calculated by Arcanes. Weights 3 criteria: price (60%), EPC quality (25%), accessibility (15%).",formula:"60% Price + 25% Quality (EPC) + 15% A
1318ccessibility"},verdict:{term:"Price Position",definition:"Factual assessment of price positioning vs market estimate.",example:"'Below estimate', 'Within range', 'Above estimate'"}}}},hF={agent:{publishedToday:"Published today",publishedYesterday:"Published yesterday",publishedAgo:"Published {{n}} days ago"},kpi:{surface:"Surface",rooms:"Bedrooms",peb:"EPC",condition:"Condition"},peb:{efficient:"Energy efficient",good:"Good performance",label:"EPC {{peb}}",heatingCost:"heating ~{{cost}}â¬/month",learnMore:"Learn more",aboveAverage:"The dominant label in {{commune}} is {{dom}} â this property performs above average",communePct:"{{pct}}% of properties in the municipality have an A, B or C label",controlled:"An EPC C represents controlled energy consumption",bestInsulated:"With an EPC {{peb}}, this property is among the best insulated on the market",heatingEstimate:"Heating estimated at ~{{cost}}â¬/month for {{surface}}m² (base 0.08â¬/kWh)"},quartier:{title:"Living in {{commune}}",connected:"A well-connected neighbourhood, near {{gare}} station",trains:"({{n}} trains per day)",wellServed:"A neighbourhood well served by public transport",marketUp:"The property market is buoyant with prices up {{pct}}% in 5 years â a sign of a neighbourhood gaining value",transactionsHigh:"With {{n}} transactions per year, properties sell quickly",transactionsMid:"A fluid market with approximately {{n}} sales per year",newResidents:"The municipality is attracting new residents, supporting demand",inhabitants:"{{n}} inhabitants",transactionsYear:"{{n}} transactions/year",priceRising:"Rising prices",marketLiquid:"Market {{label}}",attractive:"Attractive living environment",wellConnected:"Well connected"},budget:{title:"This property would cost you",perMonth:"/month",credit:"Mortgage",precompte:"Property tax",energy:"Energy",insurance:"Insurance",narrativeAp
1318part:"For this apartment at {{prix}}, with {{apport}}% down payment over {{duree}} years at {{taux}}%. Total budget: {{total}} (price + {{frais}} in fees). Excluding co-ownership charges.",narrativeMaison:"For this house at {{prix}}, with {{apport}}% down payment over {{duree}} years at {{taux}}%. Total budget: {{total}} (price + {{frais}} in fees)."},sim:{title:"Mortgage simulation",borrowed:"Amount borrowed",monthly:"Monthly payment",totalCredit:"Total cost of credit",ofWhichInterest:"of which {{amount}} in interest",capitalVsInterest:"Principal vs interest per year",capital:"Principal",interest:"Interest",adjust:"Adjust my simulation",contribution:"Down payment",rate:"Interest rate",duration:"Duration",years:"{{n}} years",amortization:"View amortization schedule",year:"Year",remaining:"Remaining"},costs:{title:"Purchase costs",price:"Property price",totalFees:"Total fees",feesDetail:"Registration {{pct}}% + notary + admin",totalAcquisition:"Total acquisition cost",detail:"View fee breakdown",registration:"Registration fees ({{pct}}%)",registrationRate:"{{region}} rate",notary:"Notary fees (VAT incl.)",admin:"Administrative fees",reducedRate:"Reduced rate available for first-time buyers â consult your notary.",precompte:"Property tax",precompteDetail:"That's {{monthly}}/month · Average cadastral income {{type}} in {{commune}}",precompteAppart:"apartments",precompteMaison:"houses",precompteCalc:"View calculation details",rcEstimate:"Estimated average cadastral income",communaux:"Municipal surcharge ({{n}})",provinceAvg:"Province avg: {{n}}",provinciaux:"Provincial surcharge (avg)",minContribution:"Recommended minimum down payment: {{amount}} (non-financeable fees)"},yield:{title:"Rental potential",rentEstimate:"Estimated rent",median:"Median {{commune}}: {{amount}} â¬/month (SPF MyRent)",gross:"Gross yield",net:"Estimated net yield",afterVacancy:"After vacancy (5%) and charges",detail:"View details",annualIncome:"Annual rental income",afterVacancyDetail:"After vacancy (5%)",charges:"Estimated charges",chargesDetail:"Property tax + maintenance (~1%)",totalInvestment:"Total investment",totalInvestmentDetail:"Price + fees",appartRent:"Apartments in {{commune}} rent for around {{amount}}⬠per month",maisonRent:"Houses in {{commune}} rent for around {{amount}}⬠per month",attractive:"With a gross yield of {{pct}}%, this is a particularly attractive market for property investment",aboveAvg:"The gross yield of {{pct}}% is above the Belgian average",strongDemand:"Rental demand is strong â finding a tenant should not be a problem"},cta:{interested:"Interested in this property?",budgetSummary:"Estimated budget: {{monthly}}/month · Total investment: {{total}}",visit:"I'd like to visit this property",call:"or call:",stickyBudget:"Total monthly cost",stickyCustom:"Your personalised budget",stickySimulate:"Simulate my budget",stickyVisit:"Visit"},qualify:{title:"Interested in this property?",subtitle:"Leave your details, {{agent}} will get back to you.",name:"Your name *",phone:"Phone",email:"Email",optionVisit:"I'd like to visit this property",optionInfo:"I'd like more information",optionOffer:"I'd like to make an offer",budget:"My estimated budget: {{monthly}}/month · down payment {{apport}}%",send:"Send",sending:"Sending...",sentTitle:"Message sent",sentSubtitle:"{{agent}} will get back to you shortly.",close:"Close"},share:{whatsapp:"WhatsApp",copy:"Copy link",copied:"â Copied"},pdf:{download:"Download summary for my bank",title:"Financial summary",monthlyCost:"Total monthly cost",print:"Print / Save as PDF",close:"Close",acquisitionCosts:"Acquisition costs",monthlyBudget:"Monthly budget",totalCredit:"Total cost of credit",minContribution:"Minimum down payment",nonFinanceable:"Non-financeable fees",chosenContribution:"Chosen down payment ({{pct}}%)",totalRepaid:"Total repaid ({{n}} years)",ofWhichInterest:"Of which interest",disclaimer:"Indicative simulation · Not a credit offer · Data Statbel & SPF Finance"},disclaimer:{text:"Indicative simulations only, not constituting financial advice or a credit offer under Belgian law of 4 April 2014. Arcanes is not an FSMA-accredited credit intermediary. Consult your notary and bank. Data: Statbel, SPF Finance, SPF MyRent."},footer:{powered:"Powered by Arcanes"},widget:{title:"Simulate your purchase",subtitle:"Calculate the real cost of your property purchase in Belgium",address:"Property address",addressPlaceholder:"E.g.: Jenner Street 6, Ixelles...",addressHint:"Optional â the municipality is enough for the simulation",orSearch:"or search by municipality",commune:"Municipality *",communePlaceholder:"E.g.: Ixelles, 1050...",type:"Property type *",apartment:"Apartment",house:"House",surface:"Surface (m²)",price:"Purchase price *",contribution:"Down payment",rate:"Interest rate",duration:"Loan duration",simulate:"Simulate my purchase",simulating:"Simulating...",resultTitle:"Your simulation",monthlyTotal:"Total monthly cost",getDossier:"Get my complete dossier",name:"Your name *",email:"Your email *",phone:"Phone (optional)",submit:"Get my dossier",submitting:"Sending...",successTitle:"Dossier sent!",successSubtitle:"Check your email to access your complete interactive dossier.",newSimulation:"New simulation",powered:"Powered by Arcanes"}
1318,dossier:{title:"Your purchase dossier",subtitle:"Personalised simulation",modified:"Modified simulation",original:"Original values",adjusted:"Adjust your simulation",price:"Purchase price",contribution:"Down payment",duration:"Duration",rate:"Rate",patrimony:"Net equity over time",patrimonyDesc:"Property value vs remaining debt",propertyValue:"Estimated property value",remainingCapital:"Remaining debt",netPatrimony:"Net equity",amortization:"Amortization schedule",byYear:"By year",byMonth:"By month",showAll:"Show all",ctaSignup:"Create my Arcanes account",ctaCommune:"Full analysis of {{commune}}",ctaSimulate:"Simulate another property"},email:{buyerSubject:"Your enquiry for {{bien}} has been forwarded",buyerGreeting:"Hello{{name}}",buyerBody:"Your information request for the property {{bien}} has been forwarded to {{agent}}{{agency}}.",buyerFollowup:"{{agent}} will get back to you shortly to answer your questions and arrange a viewing if you wish.",buyerAgentLabel:"Your agent",buyerCta:"View property again â",buyerReceived:"Enquiry received â",followupSubject:"Your purchase dossier is waiting for you",followupBody:"You ran a purchase simulation a few days ago. Your personalised dossier is still available.",followupCta:"View my dossier â"},bankPdf:{cta:"Download my bank file",ctaSub:"Document ready to present to your bank for your loan application",title:"Financing file",subtitle:"Summary for mortgage application",prepared:"Prepared on {{date}}",property:"Property",type:"Type",address:"Address",surface:"Surface",peb:"EPC",financing:"Financing plan",purchasePrice:"Purchase price",contribution:"Down payment",borrowed:"Amount borrowed",duration:"Duration",rate:"Annual rate",monthly:"Monthly payment",acquisition:"Acquisition costs",registrationRights:"Registration duties",notaryFees:"Notary fees",mortgageFees:"Mortgage fees",totalFees:"Total fees",totalAcquisition:"Total to finance",monthlyBudget:"Monthly budget",mortgagePayment:"Mortgage payment",propertyTax:"Property tax",energy:"Energy",insurance:"Home insurance",totalMonthly:"Total monthly",indicative:"Indicative document based on simulated parameters. Does not constitute a credit offer. Final terms will depend on your bank's analysis (income, asset situation, applicable rate at the time of application).",preparedBy:"Prepared by",print:"Print / Save as PDF",close:"Close",years:"years",perMonth:"/month",perYear:"/year"},matching:{perfectTitle:"Properties matching your search",perfectSubtitle:"In your commune and within your budget",nearbyTitle:"Near your search area",nearbySubtitle:"In neighboring communes, within your budget",discoverTitle:"Discover in the portfolio",discoverSubtitle:"Other properties from your agent you may like",bedrooms:"br"}},fF={title:"Press room",free_reuse:"Free to reuse with the credit",methodology:"methodology",search_ph:'Search ( / ) â e.g. "epc liège", "yield", "households"â¦',all_territories:"All territories",all_indicators:"All indicators",sort_recent:"Most recent",sort_az:"A â Z",sort_territory:"By territory",filter_all:"All",filter_maps:"Maps",filter_charts:"Charts",my_favorites:"My favourites",result:"result",results:"results",view_table:"Table",view_grid:"Grid",loading:"Loadingâ¦",manifest_error:"Manifest unavailable",col_title:"Title",col_territory:"Territory",col_type:"Type",col_updated:"Updated",col_actions:"Actions",kind_map:"Map",kind_chart:"Chart",btn_image:"Image",btn_theme:"Topic",btn_cite:"Cite",tip_cite:"Copy definition + source credit",no_results:"No results â try widening your search or filters.",no_results_short:"No results.",fav_add:"Add to favourites",fav_remove:"Remove from favourites",back_press:"â Press room",back_home:"Back to home",alt_estimation:"estimate, Arcanes Observatory",territory_not_found:"Territory not found.",territory_empty:"No content published for this territory yet.",dossier_intro:"The full dossier: maps, charts and downloadable data, free to reuse with the credit",copy_mention:"Copy source credit",charts:"Charts",charts_sub:"The territory's dynamics, visualised.",maps:"Maps",map_1:"map",maps_n:"maps",click_hd:"click for the high-resolution version.",click_hd2:"Click for the high-resolution version.",methodo_lead:"Definitions, sources and limitations:",methodo_link:"Observatory methodology â",indicator_not_found:"Indicator not found.",copy_def_mention:"Copy definition + source credit",all_scales:"All scales",scales_sub:"Belgium, provinces and districts where the indicator allows.",back_observatory:"â Observatory",niv_all:"All levels"},vF={featureUpdates:oM,rune:lM,communePanel:dM,map:cM,referral:uM,common:mM,header:pM,notFound:gM,benchmark:hM,revenus:fM,travaux:vM,location:bM,explication:yM,financement:wM,fiscalite:kM,charges:xM,financing:jM,security:AM,sensitivity:EM,amortization:PM,taxation:CM,energy:SM,actionplan:_M,market:TM,simulation:DM,sidebar:RM,transformation:zM,projection:IM,quickstat:qM,operating:NM,auth:LM,hero:BM,premiumHero:MM,heroAnimation:FM,landing:OM,home:VM,analysis:WM,simulators:UM,pricing:$M,faq:GM,pdf:HM,blog:KM,article:YM,contact:ZM,dashboard:JM,sections:QM,toc:XM,score:eF,badges:tF,kpi:nF,decomposition:rF,negotiation:aF,quickactions:iF,disclaimer:sF,footer:oF,referralGamified:lF,validation:dF,settings:cF,seo:uF,freeAnalysis:mF,premium:pF,glossary:gF,buyer:hF,presse:fF};function bF(){var v,y,x,A;const[e,t]=g.useState(!0),[n,r]=g.useState(0),[a,i]=g.useState(null),[s,l]=g.useState([]),d=g.useCallback(async()=>{t(!0);try{const{data:{user:E}}=await de.auth.getUser();if(!E){t(!1);return}const{data:j}=await de.from("agent_profiles").select("agency_id, phone, photo_url, style_prompt, onboarding_step, onboarding_completed_at").eq("user_id",E.id).maybeSingle();if(!j){t(!1);return}let P=null,S=!1;if(j.agency_id){const{data:B}=await de.from("agencies").select("logo_url").eq("id",j.agency_id).maybeSingle();P=(B==null?void 0:B.logo_url)||null;const{count:Q}=await de.from("report_blocks_config").select("id",{count:"exact",head:!0}).eq("scope","agency").eq("scope_id",j.agency_id);S=(Q??0)>0}const{count:_}=await de.from("biens_publies").select("id",{count:"exact",head:!0}).eq("agent_id",E.id),G=[{key:"phone",label:"Ajouter votre téléphone",done:!!j.phone},{key:"photo",label:"Téléverser votre photo",done:!!j.photo_url},{key:"style",label:"Configurer votre style IA",done:!!j.style_prompt},{key:"logo",label:"Téléverser votre logo",done:!!P},{key:"report_template",label:"Personnaliser votre rapport (recommandé)",done:S},{key:"first_bien",label:"Publier votre premier bien",done:(_??0)>0}];r(j.onboarding_step||0),i(j.onboarding_completed_at||null),l(G)}catch(E){console.error("[useOnboardingStatus]",E)}finally{t(!1)}},[]);g.useEffect(()=>{d()},[d]);const c=!!a,u=s.filter(E=>E.done).length,m=s.length||6,p=c?100:Math.round(u/m*100),h=((v=s.find(E=>E.key==="phone"))==null?void 0:v.done)??!1,b=((y=s.find(E=>E.key==="photo"))==null?void 0:y.done)??!1,f=((x=s.find(E=>E.key==="style"))==null?void 0:x.done)??!1,k=((A=s.find(E=>E.key==="logo"))==null?void 0:A.done)??!1;let w=5;return!h||!b?w=2:f?k?w=5:w=4:w=3,{loading:e,step:n,nextActionStep:w,completed:c,completedAt:a,progressPct:p,items:s,refresh:d}}const L={teal:"#0F4C4C",tealDark:"#0a3939",gold:"#D4AF37",goldDark:"#B8962E",cream:"#F8F6F3",border:"#E6E1DA",muted:"#94A3B8",text:"#0F4
1318C4C",textDark:"#0D1109",textMuted:"#7A7670",success:"#22c55e",warning:"#F59E0B",danger:"#EF4444",bgSoft:"#FAFAF8"},yF="https://mnocxtuirejggqyfoyys.supabase.co/functions/v1",Pd="public-assets",wF={warning_high:{fr:"Couleurs détectées avec une bonne confiance. Vérifiez tout de même qu'elles correspondent à votre charte.",nl:"Kleuren gedetecteerd met goede betrouwbaarheid. Controleer toch of ze overeenkomen met uw huisstijl.",en:"Colors detected with high confidence. Please still verify they match your brand charter."},warning_medium:{fr:"Couleurs détectées à partir de vos annonces. Vérifiez avec votre charte avant de valider.",nl:"Kleuren gedetecteerd uit uw advertenties. Controleer met uw huisstijl voor te valideren.",en:"Colors detected from your listings. Verify with your brand charter before validating."},warning_low:{fr:"Détection peu fiable. Nous recommandons d'ajuster manuellement les couleurs ci-dessous.",nl:"Onbetrouwbare detectie. We raden aan om de kleuren hieronder handmatig aan te passen.",en:"Low confidence detection. We recommend manually adjusting the colors below."}};function kF({initialStep:e=1,firstName:t="",lang:n="fr",apiKey:r,onSkip:a,onComplete:i}){const s=xt(),[l,d]=g.useState(Math.max(1,Math.min(5,e))),[c,u]=g.useState(!1),[m,p]=g.useState(null),[h,b]=g.useState(!1),[f,k]=g.useState(null),[w,v]=g.useState(null),[y,x]=g.useState(!1),[A,E]=g.useState(!0),[j,P]=g.useState({photoFile:null,photoPreviewUrl:null,photoUrl:null,phone:"",uploadedFiles:[],styleProfile:null,fallbackPreset:null,primaryColor:"#0F4C4C",secondaryColor:"#D4AF37",logoFile:null,logoPreviewUrl:null,logoUrl:null}),S=A?5:4,_=!A&&l===5?4:l;g.useEffect(()=>{(async()=>{const{data:{user:M}}=await de.auth.getUser();if(!M){st.error("Session expirée. Reconnectez-vous."),s("/login");return}k(M.id);const{data:U}=await de.from("agent_profiles").select("agency_id, phone, photo_url, style_prompt, role").eq("user_id",M.id).maybeSingle(),V=U!=null&&U.role?U.role==="owner":!0;if(U!=null&&U.role&&E(V),!V&&l===4&&d(5),!U){x(!0);return}v(U.agency_id);let q=null;if(U.agency_id){const{data:$}=await de.from("agencies").select("primary_color, secondary_color, logo_url").eq("id",U.agency_id).maybeSingle();q=$}P($=>({...$,phone:U.phone||$.phone,photoUrl:U.photo_url||$.photoUrl,photoPreviewUrl:U.photo_url||$.photoPreviewUrl,styleProfile:U.style_prompt||$.styleProfile,primaryColor:(q==null?void 0:q.primary_color)||$.primaryColor,secondaryColor:(q==null?void 0:q.secondary_color)||$.secondaryColor,logoUrl:(q==null?void 0:q.logo_url)||$.logoUrl,logoPreviewUrl:(q==null?void 0:q.logo_url)||$.logoPreviewUrl})),x(!0)})()},[s]);const G=(()=>{switch(l){case 1:return!0;case 2:return j.phone.trim().length>=8;case 3:return j.styleProfile!==null||j.fallbackPreset!==null;case 4:return!0;case 5:return!0;default:return!1}})(),B=async(M,U)=>{try{const{error:V}=await de.rpc("save_onboarding_progress",{p_step:M,...U});return V?(console.error("[saveStep]",V),st.error(`Sauvegarde échouée : ${V.message}`),!1):!0}catch(V){return console.error("[saveStep] unexpected",V),st.error("Erreur réseau lors de la sauvegarde"),!1}},Q=async()=>{var M;if(!j.photoFile||!f)return j.photoUrl;try{const U=((M=j.photoFile.name.split(".").pop())==null?void 0:M.toLowerCase())||"jpg",V=`agent-photos/${f}/${Date.now()}.${U}`,{error:q}=await de.storage.from(Pd).upload(V,j.photoFile,{contentType:j.photoFile.type,upsert:!1});if(q)return console.error("[uploadPhoto]",q),st.error(`Upload photo échoué : ${q.message}`),null;const{data:$}=de.storage.from(Pd).getPublicUrl(V);return($==null?void 0:$.publicUrl)||null}catch(U){return console.error("[uploadPhoto] unexpected",U),st.error("Erreur upload photo"),null}},N=async()=>{var M;if(!j.logoFile||!w)return j.logoUrl;try{const U=((M=j.logoFile.name.split(".").pop())==null?void 0:M.toLowerCase())||"png",V=`agency-logos/${w}/${Date.now()}.${U}`,{error:q}=await de.storage.from(Pd).upload(V,j.logoFile,{contentType:j.logoFile.type,upsert:!1});if(q)return console.error("[uploadLogo]",q),st.error(`Upload logo échoué : ${q.message}`),null;const{data:$}=de.storage.from(Pd).getPublicUrl(V);return($==null?void 0:$.publicUrl)||null}catch(U){return console.error("[uploadLogo] unexpected",U),st.error("Erreur upload logo"),null}},ie=async()=>
1318{if(!h){b(!0);try{switch(l){case 1:{await B(1,{}),d(2);break}case 2:{let M=j.photoUrl;j.photoFile&&!j.photoUrl&&(M=await Q(),M&&P(V=>({...V,photoUrl:M}))),await B(2,{p_phone:j.phone,p_photo_url:M})&&(st.success("Identité sauvegardée",{duration:1500}),d(3));break}case 3:{const M=A?4:5;j.fallbackPreset?await B(3,{p_fallback_preset:j.fallbackPreset})&&d(M):(await B(3,{}),d(M));break}case 4:{if(!A){await B(4,{}),d(5);break}let M=j.logoUrl;j.logoFile&&!j.logoUrl&&(M=await N(),M&&P(V=>({...V,logoUrl:M}))),await B(4,{p_primary_color:j.primaryColor,p_secondary_color:j.secondaryColor,p_logo_url:M})&&(st.success("Branding sauvegardé",{duration:1500}),d(5));break}case 5:{const{error:M}=await de.rpc("complete_onboarding");if(M){console.error("[complete_onboarding]",M),st.error(`Finalisation échouée : ${M.message}`);break}st.success("Onboarding terminé !",{duration:1500}),i==null||i(j),s("/pro/annonce");break}}}finally{b(!1)}}},Y=()=>{if(!(l<=1||h)){if(!A&&l===5){d(3);return}d(M=>M-1)}},te=async()=>{if(h){a?a():s("/pro/dashboard");return}b(!0);try{const M={};if(l===2&&(j.phone&&j.phone.trim().length>=8&&(M.p_phone=j.phone),j.photoFile&&!j.photoUrl)){const U=await Q();U&&(M.p_photo_url=U,P(V=>({...V,photoUrl:U})))}if(l===4&&A&&(M.p_primary_color=j.primaryColor,M.p_secondary_color=j.secondaryColor,j.logoFile&&!j.logoUrl)){const U=await N();U&&(M.p_logo_url=U,P(V=>({...V,logoUrl:U})))}await B(l,M)}finally{b(!1)}a?a():s("/pro/dashboard")},C=M=>{var q;const U=(q=M.target.files)==null?void 0:q[0];if(!U)return;if(U.size>5*1024*1024){st.error("Photo trop lourde (max 5 Mo)");return}if(!U.type.startsWith("image/")){st.error("Format invalide (JPG, PNG, WebP uniquement)");return}const V=URL.createObjectURL(U);P($=>({...$,photoFile:U,photoPreviewUrl:V,photoUrl:null}))},z=M=>{var q;const U=(q=M.target.files)==null?void 0:q[0];if(!U)return;if(U.size>2*1024*1024){st.error("Logo trop lourd (max 2 Mo)");return}const V=URL.createObjectURL(U);P($=>({...$,logoFile:U,logoPreviewUrl:V,logoUrl:null}))},Z=M=>{if(!M||M.length===0){console.warn("[addFiles] no files received");return}console.log("[addFiles] called with",M.length,"files"),P(U=>{const V=10-U.uploadedFiles.length;if(V<=0)return st.error("Maximum 10 fichiers atteint"),U;const q=Array.from(M),$=[];let pe=0;for(const oe of q.slice(0,V)){if(oe.size>10*1024*1024){pe++;continue}$.push({id:crypto.randomUUID(),file:oe,name:oe.name,size:oe.size,preview:oe.type.startsWith("image/")?URL.createObjectURL(oe):void 0})}return pe>0&&st.error(`${pe} fichier(s) ignoré(s) (max 10 Mo par fichier)`),$.length>0&&st.success(`${$.length} fichier(s) ajouté(s)`,{duration:1500}),console.log("[addFiles] adding",$.length,"to existing",U.uploadedFiles.length),{...U,uploadedFiles:[...U.uploadedFiles,...$]}})},K=M=>{P(U=>{const V=U.uploadedFiles.find(q=>q.id===M);return V!=null&&V.preview&&URL.revokeObjectURL(V.preview),{...U,uploadedFiles:U.uploadedFiles.filter(q=>q.id!==M)}})},X=M=>{P(U=>({...U,fallbackPreset:M,styleProfile:null,uploadedFiles:[]}))},he=async()=>{var M;if(j.uploadedFiles.length<3){p("Minimum 3 fichiers requis");return}u(!0),p(null);try{const U=await Promise.all(j.uploadedFiles.map(async oe=>{const ke=await oe.file.arrayBuffer();return{data:btoa(new Uint8Array(ke).reduce((He,Oe)=>He+String.fromCharCode(Oe),"")),media_type:oe.file.type||"application/octet-stream",filename:oe.name}})),V=await fetch(`${yF}/analyze-style`,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":r},body:JSON.stringify({files:U})});if(!V.ok){const oe=await V.json().catch(()=>({}));throw new Error(oe.error||`Erreur ${V.status}`)}const $=((M=(await V.json()).data)==null?void 0:M.style_profile)||{},pe={styleProfile:$};$.couleur_primaire_detectee&&(pe.primaryColor=$.couleur_primaire_detectee),$.couleur_secondaire_detectee&&(pe.secondaryColor=$.couleur_secondaire_detectee),P(oe=>({...oe,...pe})),d(4)}catch(U){p(U.message||"Erreur d'analyse")}finally{u(!1)}};return y?o.jsxs("div",{style:{position:"fixed",inset:0,zIndex:1e3,background:L.cream,display:"flex",flexDirection:"column",fontFamily:"'Outfit', sans-serif",overflow:"auto"},children:[o.jsx("style",{children:` 1319 @keyframes spin { to { transform: rotate(360deg); } } 1320 .wiz-input { 1321 width: 100%; padding: 12px 14px; border-radius: 10px; 1322 border: 1.5px solid ${L.border}; font-size: 14px; 1323 font-family: 'Outfit', sans-serif; color: ${L.text}; 1324 outline: none; background: white; transition: border-color 0.15s; 1325 } 1326 .wiz-input:focus { border-color: ${L.teal}; } 1327 .wiz-btn-primary { background: ${L.teal}; color: white; } 1328 .wiz-btn-primary:hover:not(:disabled) { background: ${L.tealDark}; } 1329 .wiz-btn-final { background: linear-gradient(135deg, ${L.gold}, ${L.goldDark}); color: white; } 1330 .wiz-btn-back { background: white; color: ${L.muted}; border: 1.5px solid ${L.border}; } 1331 .wiz-btn-back:hover { color: ${L.teal}; border-color: ${L.teal}; } 1332 `}),o.jsx(xF,{step:_,total:S,onSkip:te}),o.jsx("div",{style:{flex:1,display:"flex",alignItems:"center",justifyContent:"center",padding:"32px 24px"},children:o.jsxs("div",{style:{width:"100%",maxWidth:720,background:"white",borderRadius:16,padding:"48px 40px",border:`1px solid ${L.border}`},children:[l===1&&o.jsx(EF,{firstName:t}),l===2&&o.jsx(PF,{photoPreviewUrl:j.photoPreviewUrl,phone:j.phone,onPhotoChange:C,onPhoneChange:M=>P(U=>({...U,phone:M}))}),l===3&&o.jsx(CF,{files:j.uploadedFiles,analyzing:c,error:m,fallbackPreset:j.fallbackPreset,hasExistingStyle:j.styleProfile!==null,onAddFiles:Z,onRemoveFile:K,onAnalyze:he,onUsePreset:X}),l===4&&o.jsx(SF,{styleProfile:j.styleProfile,fallbackPreset:j.fallbackPreset,primaryColor:j.primaryColor,secondaryColor:j.secondaryColor,logoPreviewUrl:j.logoPreviewUrl,lang:n,isOwner:A,onPrimaryChange:M=>P(U=>({...U,primaryColor:M})),onSecondaryChange:M=>P(U=>({...U,secondaryColor:M})),onLogoChange:z}),l===5&&o.jsx(_F,{})]})}),o.jsx(AF,{step:_,total:S,canContinue:G,saving:h,onBack:Y,onNext:ie})]}):o.jsx("div",{style:{position:"fixed",inset:0,zIndex:1e3,background:L.
1332cream,display:"flex",alignItems:"center",justifyContent:"center"},children:o.jsx("div",{style:{fontSize:14,color:L.muted,fontFamily:"'Outfit', sans-serif"},children:"Chargement..."})})}function xF({step:e,total:t,onSkip:n}){return o.jsxs("div",{style:{padding:"20px 32px",borderBottom:`1px solid ${L.border}`,background:"white",display:"flex",alignItems:"center",justifyContent:"space-between"},children:[o.jsxs("div",{style:{fontFamily:"'DM Serif Display', serif",fontSize:22,color:L.teal,letterSpacing:"-0.5px"},children:["arcan",o.jsx("span",{style:{color:L.gold},children:"es"})," Pro"]}),o.jsxs("div",{style:{display:"flex",alignItems:"center",gap:20},children:[o.jsx(jF,{current:e,total:t}),o.jsx("button",{onClick:n,style:{background:"none",border:"none",color:L.muted,fontSize:13,cursor:"pointer",fontFamily:"'Outfit', sans-serif",fontWeight:500},children:"Plus tard â"})]})]})}function jF({current:e,total:t}){const i=2*Math.PI*20,s=Math.min(e/t,1),l=i*(1-s),d=e>=t;return o.jsxs("div",{style:{position:"relative",width:44,height:44},children:[o.jsxs("svg",{width:44,height:44,style:{transform:"rotate(-90deg)"},children:[o.jsx("circle",{cx:44/2,cy:44/2,r:20,fill:"none",stroke:L.border,strokeWidth:4}),o.jsx("circle",{cx:44/2,cy:44/2,r:20,fill:"none",stroke:d?L.success:L.gold,strokeWidth:4,strokeDasharray:i,strokeDashoffset:l,strokeLinecap:"round",style:{transition:"stroke-dashoffset 0.4s ease, stroke 0.3s"}})]}),o.jsxs("div",{style:{position:"absolute",inset:0,display:"flex",alignItems:"center",justifyContent:"center",fontSize:11,fontWeight:700,color:L.teal,letterSpacing:"-0.3px"},children:[e,"/",t]})]})}function AF({step:e,total:t,canContinue:n,saving:r,onBack:a,onNext:i}){const s=e===t;return o.jsxs("div",{style:{padding:"20px 32px",borderTop:`1px solid ${L.border}`,background:"white",display:"flex",alignItems:"center",justifyContent:"space-between",gap:16},children:[o.jsxs("div",{style:{fontSize:12,color:L.muted,fontWeight:500},children:["Ãtape ",e," sur ",t]}),o.jsxs("div",{style:{display:"flex",gap:8},children:[e>1&&o.jsx("button",{onClick:a,disabled:r,className:"wiz-btn-back",style:{padding:"12px 24px",borderRadius:10,fontFamily:"'Outfit', sans-serif",fontSize:14,fontWeight:700,cursor:r?"not-allowed":"pointer",opacity:r?.5:1},children:"â Retour"}),o.jsx("button",{onClick:i,disabled:!n||r,className:s?"wiz-btn-final":"wiz-btn-primary",style:{padding:"12px 24px",borderRadius:10,border:"none",fontFamily:"'Outfit', sans-serif",fontSize:14,fontWeight:700,cursor:n&&!r?"pointer":"not-allowed",minWidth:s?200:140,opacity:n&&!r?1:.5,display:"flex",alignItems:"center",justifyContent:"center",gap:8},children:r?o.jsxs(o.Fragment,{children:[o.jsx("span",{style:{width:14,height:14,border:"2px solid rgba(255,255,255,0.3)",borderTopColor:"white",borderRadius:"50%",animation:"spin 1s linear infinite"}}),"Sauvegarde..."]}):s?"Publier mon premier bien â":"Continuer â"})]})]})}function Ol({tag:e,titleStart:t,titleEnd:n,subtitle:r}){return o.jsxs(o.Fragment,{children:[o.jsxs("div",{style:{display:"inline-flex",alignItems:"center",gap:10,marginBottom:16},children:[o.jsx("span",{style:{width:24,height:2,background:L.gold,borderRadius:1}}),o.jsx("span",{style:{fontSize:10,fontWeight:700,letterSpacing:"2px",color:L.goldDark,textTransform:"uppercase"},children:e}),o.jsx("span",{style:{width:24,height:2,background:L.gold,borderRadius:1}})]}),o.jsxs("h1",{style:{fontFamily:"'Outfit', sans-serif",fontSize:"clamp(28px, 4vw, 36px)",fontWeight:800,lineHeight:1.15,letterSpacing:"-1px",color:L.textDark,marginBottom:12},children:[t," ",o.jsx("span",{style:{color:L.teal},children:n})]}),o.jsx("p",{style:{fontSize:15,color:L.textMuted,lineHeight:1.6,marginBottom:32,maxWidth:460},children:r})]})}function Vc({children:e,optional:t}){return o.jsxs("label",{style:{display:"block",fontSize:11,fontWeight:700,color:L.teal,textTransform:"uppercase",letterSpacing:"0.5px",marginBottom:8},children:[e,t&&o.jsx("span",{style:{color:L.muted,fontWeight:500,textTransform:"none",marginLeft:6},children:"(optionnel)"})]})}function EF({firstName:e}){return o.jsxs(o.Fragment,{children:[o.jsx(Ol,{tag:"Bienvenue",titleStart:"Bienvenue,",titleEnd:e||"Pro",subtitle:"Votre compte Arcanes Pro est créé. Configurons votre espace en 4 étapes â vous pourrez tout modifier plus tard."}),o.jsxs("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:12,marginBottom:24},children:[o.jsx(e0,{num:"14",label:"Jours d'essai"}),o.jsx(e0,{num:"5",label:"Crédits offerts"})]}),o.jsxs("p",{style:{fontSize:13,color:L.textMuted,lineHeight:1.6},children:["Cela prendra environ ",o.jsx("strong",{style:{color:L.teal},children:"3 minutes"}),"."]})]})}function e0({num:e,label:t}){return o.jsxs("div",{style:{padding:16,background:"rgba(212,175,55,0.06)",borderRadius:10,borderLeft:`3px solid ${L.gold}`},children:[o.jsx("div",{style:{fontFamily:"'DM Serif Display', serif",fontSize:32,color:L.teal,lineHeight:1,marginBottom:4},children:e}),o.jsx("div",{style:{fontSize:11,color:L.textMuted,textTransform:"uppercase",letterSpacing:"0.5px"},children:t})]})}function PF({photoPreviewUrl:e,phone:t,onPhotoChange:n,onPhoneChange:r}){return o.jsxs(o.Fragment,{children:[o.jsx(Ol,{tag:"Ãtape 2 / 5",titleStart:"Vous,",titleEnd:"en quelques clics",subtitle:"Votre photo et votre numéro apparaissent sur vos rapports et pages acheteur."}),o.jsxs("div",{style:{marginBottom:24,textAlign:"center"},children:[o.jsx("label",{htmlFor:"wiz-photo",style:{display:"inline-flex",width:120,height:120,borderRadius:"50%",border:e?`2px solid ${L.success}`:`2px dashed ${L.border}`,background:e?"white":L.bgSoft,alignItems:"center",justifyContent:"center",cursor:"pointer",color:L.muted,fontSize:12,textAlign:"center",overflow:"hidden"},children:e?o.jsx("img",{src:e,alt:"",style:{width:"100%",height:"100%",objectFit:"cover"}}):o.jsxs("div",{children:[o.jsx("div",{style:{fontSize:24,marginBottom:4,color:L.muted},children:"+"}),o.jsxs("div",{children:["Ajoutez",o.jsx("br",{}),"votre photo"]})]})}),o.jsx("input",{id:"wiz-photo",type:"file",accept:"image/*",onChange:n,style:{display:"none"}}),o.jsx("div",{style:{fontSize:11,color:L.muted,marginTop:8},children:"Optionnel â vous pourrez l'ajouter plus tard"})]}),o.jsxs("div",{style:{marginBottom:8},children:[o.jsx(Vc,{children:"Téléphone"}),o.jsx("input",{type:"tel",className:"wiz-input",value:t,onChange:a=>r(a.target.value),placeholder:"+32 470 12 34 56"})]}),o.jsx("p",{style:{fontSize:11,color:L.muted,marginTop:4},children:"Visible uniquement sur vos pages acheteur â jamais public."})]})}function CF({files:e,analyzing:t,error:n,fallbackPreset:r,hasExistingStyle:a,onAddFiles:i,onRemoveFile:s,onAnalyze:l,onUsePreset:d}){const[c,u]=g.useState(!!r),m=g.useRef(null);return o.jsxs(o.Fragment,{children:[o.jsx(Ol,{tag:"Ãtape 3 / 5",titleStart:"Apprenons",titleEnd:"votre style",subtitle:a?"Votre style est déjà c
1332onfiguré. Vous pouvez le ré-analyser ou continuer.":"Glissez 3 à 10 de vos annonces récentes â l'IA analyse votre ton et détecte vos couleurs de marque."}),a&&!c&&e.length===0&&o.jsx("div",{style:{padding:14,borderRadius:10,background:"rgba(34,197,94,0.08)",border:"1px solid rgba(34,197,94,0.3)",marginBottom:16,fontSize:13,color:"#15803D",lineHeight:1.5},children:"â Style IA déjà configuré. Continuez ou uploadez de nouvelles annonces pour ré-analyser."}),!c&&o.jsxs(o.Fragment,{children:[o.jsx("input",{ref:m,id:"wiz-onboarding-files",type:"file",multiple:!0,accept:"image/*,application/pdf,.pdf,.doc,.docx",onChange:p=>{i(p.target.files),p.target.value=""},style:{position:"absolute",width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0,0,0,0)",whiteSpace:"nowrap",border:0}}),o.jsxs("label",{htmlFor:"wiz-onboarding-files",style:{display:"block",padding:24,borderRadius:12,border:`2px dashed ${L.border}`,background:L.bgSoft,textAlign:"center",marginBottom:12,cursor:"pointer"},onDrop:p=>{p.preventDefault(),p.stopPropagation(),i(p.dataTransfer.files)},onDragOver:p=>p.preventDefault(),children:[o.jsx("div",{style:{fontSize:32,color:L.gold,marginBottom:8},children:"+"}),o.jsx("div",{style:{fontSize:14,fontWeight:700,color:L.teal,marginBottom:4},children:"Glissez vos annonces ici"}),o.jsx("div",{style:{fontSize:12,color:L.textMuted},children:"PDF, images, Word â minimum 3, maximum 10"})]}),o.jsx("button",{type:"button",onClick:()=>{var p;return(p=m.current)==null?void 0:p.click()},style:{width:"100%",padding:"10px 14px",borderRadius:10,border:`1.5px solid ${L.border}`,background:"white",color:L.teal,fontFamily:"'Outfit', sans-serif",fontSize:13,fontWeight:700,cursor:"pointer",marginBottom:16},children:"Choisir des fichiers depuis mon ordinateur"}),e.length>0&&o.jsxs("div",{style:{marginBottom:16},children:[o.jsxs(Vc,{children:["Fichiers ajoutés (",e.length,"/10)"]}),o.jsx("div",{style:{display:"flex",flexDirection:"column",gap:8},children:e.map(p=>{var h;return o.jsxs("div",{style:{display:"flex",alignItems:"center",gap:12,padding:"10px 12px",background:"white",borderRadius:8,border:`1px solid ${L.border}`},children:[p.preview?o.jsx("img",{src:p.preview,alt:"",style:{width:32,height:32,borderRadius:6,objectFit:"cover",flexShrink:0}}):o.jsx("div",{style:{width:32,height:32,borderRadius:6,background:L.bgSoft,display:"flex",alignItems:"center",justifyContent:"center",fontSize:11,fontWeight:700,color:L.gold,flexShrink:0},children:((h=p.name.split(".").pop())==null?void 0:h.toUpperCase().slice(0,3))||"?"}),o.jsxs("div",{style:{flex:1,minWidth:0},children:[o.jsx("div",{style:{fontSize:13,fontWeight:600,color:L.text,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:p.name}),o.jsxs("div",{style:{fontSize:11,color:L.muted},children:[(p.size/1024).toFixed(0)," Ko"]})]}),o.jsx("button",{onClick:()=>s(p.id),style:{background:"none",border:"none",color:L.muted,cursor:"pointer",padding:4,fontSize:16},children:"Ã"})]},p.id)})})]}),n&&o.jsx("div",{style:{padding:12,borderRadius:8,background:"#FEE2E2",color:"#991B1B",fontSize:12,marginBottom:16,fontWeight:500},children:n}),o.jsx("button",{onClick:l,disabled:e.length<3||t,style:{width:"100%",padding:"14px 24px",borderRadius:12,border:"none",background:e.length<3?L.border:`linear-gradient(135deg, ${L.gold}, ${L.goldDark})`,color:"white",fontFamily:"'Outfit', sans-serif",fontSize:14,fontWeight:800,cursor:e.length<3?"not-allowed":"pointer",opacity:e.length<3?.5:1,display:"flex",alignItems:"center",justifyContent:"center",gap:8},children:t?o.jsxs(o.Fragment,{children:[o.jsx("span",{style:{width:14,height:14,border:"2px solid rgba(255,255,255,0.3)",borderTopColor:"white",borderRadius:"50%",animation:"spin 1s linear infinite"}}),"Analyse en cours..."]}):o.jsx(o.Fragment,{children:"⨠Analyser mes annonces"})}),!a&&o.jsx("button",{onClick:()=>u(!0),style:{width:"100%",marginTop:12,padding:"10px",background:"transparent",border:"none",color:L.muted,fontSize:13,fontWeight:500,cursor:"pointer",fontFamily:"'Outfit', sans-serif",textDecoration:"underline"},children:"Je n'ai pas d'annonces à uploader"})]}),c&&o.jsxs(o.Fragment,{children:[o.jsx("div",{style:{padding:14,borderRadius:10,background:"rgba(15,76,76,0.04)",marginBottom:16,fontSize:13,color:L.text,lineHeight:1.5},children:"Choisissez un style par défaut. Vous pourrez l'affiner après en uploadant vos annonces."}),o.jsx("div",{style:{display:"flex",flexDirection:"column",gap:10,marginBottom:16},children:[{id:"classique",name:"Classique professionnel",desc:"Formel, factuel. Pour le résidentiel haut de gamme."},{id:"emotionnel",name:"Ãmotionnel narratif",desc:"Ãvocateur, immersif. Pour les biens de caractère."},{id:"direct",name:"Direct et concis",desc:"Court, factuel. Pour l'investissement et l'entrée de gamme."}].map(p=>{const h=r===p.id;return o.jsxs("button",{onClick:()=>d(p.id),style:{padding:16,borderRadius:10,border:`2px solid ${h?L.teal:L.border}`,background:h?"rgba(15,76,76,0.04)":"white",cursor:"pointer",textAlign:"left",fontFamily:"'Outfit', sans-serif"},children:[o.jsx("div",{style:{fontSize:14,fontWeight:700,color:L.teal,marginBottom:4},children:p.name}),o.jsx("div",{style:{fontSize:12,color:L.textMuted,lineHeight:1.4},children:p.desc})]}
1332,p.id)})}),o.jsx("button",{onClick:()=>u(!1),style:{width:"100%",padding:"10px",background:"transparent",border:"none",color:L.muted,fontSize:13,fontWeight:500,cursor:"pointer",fontFamily:"'Outfit', sans-serif",textDecoration:"underline"},children:"â Revenir à l'upload d'annonces"})]})]})}function SF({styleProfile:e,fallbackPreset:t,primaryColor:n,secondaryColor:r,logoPreviewUrl:a,lang:i,isOwner:s,onPrimaryChange:l,onSecondaryChange:d,onLogoChange:c}){const u=!!e,m=(e==null?void 0:e.confiance_couleurs)||"basse",p=!!(e!=null&&e.couleur_primaire_detectee),b={haute:{bg:"rgba(34,197,94,0.1)",text:"#15803D",border:"#86EFAC"},moyenne:{bg:"rgba(245,158,11,0.1)",text:"#B45309",border:"#FCD34D"},basse:{bg:"rgba(239,68,68,0.1)",text:"#B91C1C",border:"#FCA5A5"}}[m],k=wF[m==="haute"?"warning_high":m==="moyenne"?"warning_medium":"warning_low"][i];return o.jsxs(o.Fragment,{children:[o.jsx(Ol,{tag:"Ãtape 4 / 5",titleStart:s?"Voici":"Identité",titleEnd:s?"votre identité":"de votre agence",subtitle:s?u?"L'IA a analysé vos annonces. Vérifiez et ajustez si nécessaire.":"Configurez votre identité visuelle. Tout est ajustable plus tard.":"L'identité visuelle est définie par votre agence et appliquée à tous les agents de l'équipe."}),!s&&o.jsxs("div",{style:{padding:"14px 16px",borderRadius:10,background:"rgba(34,197,94,0.08)",border:"1px solid rgba(34,197,94,0.3)",marginBottom:20,display:"flex",alignItems:"flex-start",gap:10},children:[o.jsx("span",{style:{fontSize:16,color:"#15803D",flexShrink:0},children:"â"}),o.jsxs("div",{style:{fontSize:13,color:"#15803D",lineHeight:1.5},children:[o.jsx("strong",{children:"Déjà configuré."})," Le branding (couleurs et logo) est géré par votre agence. Vous le voyez ici en lecture seule."]})]}),u&&e&&o.jsxs("div",{style:{padding:20,borderRadius:12,background:"rgba(15,76,76,0.03)",marginBottom:20,border:`1px solid ${L.border}`},children:[o.jsx("div",{style:{fontSize:11,fontWeight:700,color:L.gold,textTransform:"uppercase",letterSpacing:"1px",marginBottom:12},children:"⨠Style détecté"}),e.ton&&o.jsxs("div",{style:{marginBottom:10},children:[o.jsx("div",{style:{fontSize:11,color:L.muted,fontWeight:600,textTransform:"uppercase",marginBottom:2},children:"Ton"}),o.jsx("div",{style:{fontSize:13,color:L.text,lineHeight:1.5},children:e.ton})]}),e.vocabulaire_cle&&e.vocabulaire_cle.length>0&&o.jsxs("div",{style:{marginBottom:10},children:[o.jsx("div",{style:{fontSize:11,color:L.muted,fontWeight:600,textTransform:"uppercase",marginBottom:6},children:"Vocabulaire clé"}),o.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:6},children:e.vocabulaire_cle.map((w,v)=>o.jsx("span",{style:{padding:"4px 10px",borderRadius:16,background:"white",border:`1px solid ${L.border}`,fontSize:11,fontWeight:600,color:L.teal},children:w},v))})]}),e.points_forts_style&&o.jsxs("div",{children:[o.jsx("div",{style:{fontSize:11,color:L.muted,fontWeight:600,textTransform:"uppercase",marginBottom:2},children:"Points forts"}),o.jsx("div",{style:{fontSize:13,color:L.text,lineHeight:1.5,fontStyle:"italic"},children:e.points_forts_style})]})]}),t&&o.jsxs("div",{style:{padding:14,borderRadius:10,background:"rgba(212,175,55,0.06)",marginBottom:20,fontSize:13,color:L.text,lineHeight:1.5},children:["Style sélectionné : ",o.jsx("strong",{children:t.charAt(0).toUpperCase()+t.slice(1)}),". Vous pourrez uploader vos annonces depuis vos paramètres pour affiner."]}),u&&p&&o.jsxs("div",{style:{padding:"10px 12px",borderRadius:8,background:b.bg,border:`1px solid ${b.border}`,marginBottom:16,fontSize:12,color:b.text,lineHeight:1.5},children:[o.jsx("strong",{children:k}),(e==null?void 0:e.raison_confiance)&&o.jsx("div",{style:{marginTop:4,fontSize:11,opacity:.85},children:e.raison_confiance})]}),o.jsx(Vc,{children:"Couleurs de marque"}),o.jsxs("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:12,marginBottom:24},children:[o.jsx(t0,{color:n,onChange:l,label:"Primaire",readOnly:!s}),o.jsx(t0,{color:r,onChange:d,label:"Secondaire",readOnly:!s})]}),o.jsx(Vc,{optional:!0,children:"Logo de l'agence"}),o.jsxs("div",{style:{display:"flex",alignItems:"center",gap:16,marginBottom:12},children:[o.jsx("label",{htmlFor:s?"wiz-logo-final":void 0,style:{width:80,height:80,borderRadius:12,border:a?`2px solid ${L.success}`:`2px dashed ${L.border}`,background:a?"white":L.bgSoft,display:"flex",alignItems:"center",justifyContent:"center",cursor:s?"pointer":"default",color:L.muted,fontSize:11,textAlign:"center",padding:8,overflow:"hidden",flexShrink:0,opacity:s?1:.85},children:a?o.jsx("img",{src:a,alt:"",style:{width:"100%",height:"100%",objectFit:"contain"}}):s?"+ Logo":"â"}),s&&o.jsx("input",{id:"wiz-logo-final",type:"file",accept:"image/png,image/svg+xml,image/jpeg",onChange:c,style:{display:"none"}}),o.jsx("div",{style:{flex:1,fontSize:12,color:L.muted,lineHeight:1.5},children:s?o.jsxs(o.Fragment,{children:["PNG transparent ou SVG. Format carré recommandé.",o.jsx("br",{}),o.jsx("span",{style:{color:L.textMuted},children:"Skippez si vous n'avez pas de logo encore."})]}):o.jsxs("span",{style:{color:L.textMuted},children:["Le logo est géré par votre agence dans ",o.jsx("em",{children:"Paramètres â Mon agence"}),"."]})})]}),s&&o.jsxs("p",{style:{fontSize:12,color:L.textMuted,lineHeight:1.55,marginTop:4},children:["Vous pourrez affiner toute votre charte â couleurs complètes, polices et logos â dans"," ",o.jsx("strong",{style:{color:L.teal},children:"Mon agence"}),"."]})]})}
1332function t0({color:e,onChange:t,label:n,readOnly:r=!1}){return o.jsxs("div",{style:{padding:16,borderRadius:10,border:`1.5px solid ${L.border}`,background:"white",opacity:r?.85:1},children:[o.jsx("div",{style:{width:"100%",height:60,borderRadius:8,marginBottom:12,background:e,position:"relative"},children:!r&&o.jsx("input",{type:"color",value:e,onChange:a=>t(a.target.value),style:{position:"absolute",inset:0,opacity:0,cursor:"pointer",width:"100%",height:"100%"}})}),o.jsx("input",{type:"text",value:e,onChange:a=>t(a.target.value),readOnly:r,disabled:r,className:"wiz-input",style:{padding:"8px 10px",fontSize:13,background:r?"#FAFAF8":"white",cursor:r?"default":"text"}}),o.jsx("div",{style:{fontSize:11,color:L.textMuted,marginTop:4},children:n})]})}function _F(){const e=xt(),t=["Publier un bien immobilier","Générer un rapport de prospection","Créer une fiche de visite co-brandée","Installer votre widget de simulation"];return o.jsxs(o.Fragment,{children:[o.jsx(Ol,{tag:"C'est parti !",titleStart:"Tout est",titleEnd:"prêt",subtitle:"Votre compte est configuré. Publiez votre premier bien et générez vos premiers rapports en 30 secondes."}),o.jsxs("div",{style:{background:"rgba(15,76,76,0.04)",borderRadius:12,padding:20,marginBottom:24},children:[o.jsx("div",{style:{fontSize:13,fontWeight:700,color:L.teal,marginBottom:12,textTransform:"uppercase",letterSpacing:"0.5px"},children:"Vous pouvez maintenant"}),o.jsx("div",{style:{display:"flex",flexDirection:"column",gap:8},children:t.map(n=>o.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,fontSize:14,color:L.teal},children:[o.jsx("span",{style:{color:L.success,fontWeight:700},children:"â"})," ",n]},n))})]}),o.jsxs("div",{style:{marginBottom:20,padding:18,background:"linear-gradient(135deg, rgba(212,175,55,0.08), rgba(15,76,76,0.04))",border:`1.5px dashed ${L.gold}`,borderRadius:12},children:[o.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:8},children:[o.jsx("span",{style:{fontSize:16},children:"â¨"}),o.jsx("span",{style:{fontSize:10,fontWeight:800,color:L.goldDark,textTransform:"uppercase",letterSpacing:"1.5px"},children:"Une dernière chose, optionnelle"})]}),o.jsx("div",{style:{fontSize:15,fontWeight:700,color:L.text,marginBottom:6,lineHeight:1.3},children:"Personnalisez votre rapport Arcanes"}),o.jsx("p",{style:{fontSize:13,color:L.textMuted,lineHeight:1.55,marginTop:0,marginBottom:14},children:"Uploadez un de vos rapports d'évaluation existants. Notre IA en extraira votre ton commercial, vos arguments différenciants et votre proposition de services en 1 minute. Sinon, vos rapports seront générés avec notre contenu Arcanes par défaut."}),o.jsx("button",{onClick:()=>e("/pro/parametres-rapport"),style:{padding:"10px 18px",borderRadius:10,border:`1.5px solid ${L.gold}`,background:"white",color:L.goldDark,fontSize:13,fontWeight:700,cursor:"pointer",fontFamily:"'Outfit', sans-serif"},children:"Personnaliser mon rapport â"})]}),o.jsx("p",{style:{fontSize:13,color:L.textMuted,lineHeight:1.6},children:"Une question ? Répondez à votre email de bienvenue, je lis tout personnellement."})]})}function TF({firstName:e="",lang:t="fr"}){const{loading:n,completed:r,step:a,refresh:i}=bF(),[s,l]=g.useState(""),[d,c]=g.useState(!1),[u,m]=g.useState(null);if(g.useEffect(()=>{(async()=>{const{data:{user:h}}=await de.auth.getUser();if(!h)return;m(h.id);const b=`arcanes_onboarding_skipped_${h.id}`;c(sessionStorage.getItem(b)==="1");const{data:f}=await de.from("api_keys").select("key").eq("user_id",h.id).eq("is_active",!0).limit(1).maybeSingle();f!=null&&f.key&&l(f.key)})()},[]),n||r||a>=1||d||!s)return null;const p=()=>{if(!u)return;const h=`arcanes_onboarding_skipped_${u}`;sessionStorage.setItem(h,"1"),c(!0)};return o.jsx(kF,{initialStep:1,firstName:e,lang:t,apiKey:s,onSkip:p,onComplete:()=>{i()}})}const DF=`--- 1333title: "Buying real estate in Belgium in 2026: the complete guide" 1334slug: "acheter-bien-immobilier-belgique-2026" 1335tag: "Marché" 1336readTime: 15 1337publishDate: "13 mars 2026" 1338updateDate: "24 août 2026" 1339author: "Arcanes" 1340excerpt: "From searching for a property to signing at the notary: all the steps, costs, subsidies, and pitfalls to avoid when buying in Belgium in 2026." 1341image: "/images/blog/buy-belgium-2026.jpg" 1342imageVersion: "1" 1343imageAlt: "Aerial view of a Belgian city at sunset" 1344--- 1345 1346# Buying real estate in Belgium in 2026: the complete guide 1347 1348Buying real estate in Belgium in 2026 remains one of the most importantâand complexâlife projects you can undertake. Between recent tax reforms, fluctuating mortgage rates, and regional price disparities, preparing methodically is essential. This comprehensive guide takes you step by step, from your initial thoughts to receiving the keys at the notary's office, covering financing, costs, and pitfalls to avoid along the way. 1349 1350Whether you are a first-time buyer looking for your own home or an investor looking to diversify your portfolio, you will find all the updated information here to make an informed decision on the Belgian real estate market. 1351 1352## 1. The Belgian real estate market in 2026: overview 1353 1354**Updated on 24 August 2026** â rates, allowances and VAT rules verified (2025-2026 regional reforms included). _Sources: Statbel, FPS Finance, regional legislation â see our [methodology](/methodologie)._ 1355 1356### Price evolution by region 1357 1358The real estate market in Belgium is continuing its moderate upward trajectory in 2026. According to Statbel data from the third quarter of 2025, the median price of a terraced or semi-detached house stands at **â¬280,000** nationally, while a detached house (four facades) reaches **â¬390,000**. Apartments are trading around a median of **â¬255,000**. 1359 1360However, regional differences remain considerable: 1361 1362**In Wallonia**, the most affordable region, a terraced house costs a median of **â¬197,000** (up 6.5% over one year) and a detached house **â¬330,000** (+8.2%). The registration duties reform that came into effect on January 1, 2025âdropping the rate from 12.5% to 3% for a sole and primary residenceâhas freed up purchasing power and stimulated demand, driving prices up. Forecasts for 2026 anticipate average prices of â¬280,000 to â¬285,000 for a standard house, representing an increase of about 4%. 1363 1364**In Flanders**, terraced houses show a median price of **â¬317,500** and detached houses **â¬430,000**. Flemish Brabant remains the most expensive province, with terraced houses at â¬370,500. Growth is more contained there, with around 3 to 3.5% expected in 2026, bringing the average price of a house to nearly â¬390,000. 1365 1366**In Brussels**, prices are significantly higher: **â¬525,000** for a terraced house and up to **â¬1,112,500** for a detached house. Apartments are hovering around **â¬265,000**. The Brussels market, supported by the presence of European institutions and constant rental demand, remains relatively stable. 1367 1368To explore prices municipality by municipality and visualize these regional gaps, consult our [interactive real estate price map](/map). 1369 1370### Trends and outlook 1371 1372Several factors are shaping the market in 2026. **Mortgage rates** have stabilized following successive cuts in the ECB's key rate (down to 2.00% in early 2026, following 200 basis points of reductions between June 2024 and January 2026). Fixed rates over 25 years fluctuate between **2.9% and 3.8%** depen
1372ding on the borrower's profile, with the best profiles getting around 3.2-3.4%. 1373 1374The **transaction volume** jumped by 15% in the first nine months of 2025 compared to 2024, a dynamic that is expected to continue. Supply, however, remains limited, particularly in urban centers, which helps sustain prices. 1375 1376Finally, **energy performance** has become a central criterion. Properties with a poor EPC (Energy Performance Certificate) score are facing discounts of 10 to 20%, while renovated or highly efficient homes sell quickly and at better prices. 1377 1378## 2. Define your project: personal residence or investment? 1379 1380Before starting your property search, clarify your goal. The nature of your projectâprimary residence or rental investmentâwill dictate your tax situation, your financing, and your selection criteria. 1381 1382### Sole and primary residence 1383 1384If you are buying a home to live in, you benefit from significant tax advantages: reduced registration duty rates in Wallonia (3%) and Flanders (2%), or a â¬200,000 tax allowance (abatement) in Brussels. Your criteria will focus more on the location relative to your workplace, the quality of life in the neighborhood, schools, public transport, and the potential for long-term capital gain. 1385 1386### Rental investment 1387 1388Real estate investment in Belgium offers gross rental yields of 3 to 6% depending on the region, with strong rental demand in university towns and urban centers. But beware: the gross yield doesn't tell the whole story. You must deduct expenses (property tax, insurance, maintenance, management), rental vacancy, and potential renovation costs. To calculate your actual net yield, use our [rental yield simulator](/simulateur-rendement-locatif). For a deeper dive, read our detailed article on [the truth behind rental yield numbers in Belgium](/blog/rendement-locatif-verite-chiffres-belgique). 1389 1390Before arbitrating, you need to calculate the opportunity cost: [what the same savings effort would yield in the stock market](/blog/immobilier-ou-bourse-belgique). 1391 1392### Multi-unit investment property 1393 1394A specific type of investment, the multi-unit property (several rental units within the same building), allows you to pool vacancy risks and optimize management costs. On the flip side, it requires a larger acquisition budget, rigorous multi-unit financial analysis, and close attention to urban planning regulations (property division, EPC standards per unit). 1395 1396## 3. Assess your financial capacity 1397 1398### How banks calculate your borrowing capacity 1399 1400In Belgium, banks primarily apply the **one-third rule**: your monthly loan repayments should not exceed one-third of your net income. Some institutions also conduct a **stress test**, simulating a rate increase to ensure you could still manage the payments in an unfavorable scenario. 1401 1402Other criteria come into play: the stability of your income (permanent contract vs. self-employed), your professional seniority, your other outstanding debts, and your residual living budget after paying all expenses. 1403 1404To quickly estimate your maximum budget, use our [borrowing capacity simulator](/simulateur-emprunt). 1405 1406### The down payment (Personal contribution) 1407 1408The National Bank of Belgium recommends that banks require a down payment covering at least the acquisition costs (about 10 to 15% of the price), plus ideally 10 to 20% of the property price itself. In practical terms, for a â¬300,000 property, plan for between **â¬30,000 and â¬60,000 in equity** for the property, plus **â¬25,000 to â¬40,000 for costs**, depending on the region. 1409 1410Some banks still claim to finance up to 100% of the purchase price (excluding costs), but let's be clear: **this is a myth for 99% of first-time buyers**. Since the NBB's reinforced recommendations, only a tiny minority of applications qualifyâtypically profiles with very high incomes, existing family assets as additional collateral, or a strong co-borrower. For the vast majority of buyers, especially without family help, a 100% loan remains inaccessible. It is best to assume you will need to gather a minimum of 10% of the price in equity, in addition to the entirety of the deed costs. 1411 1412### Mortgage rates in 2026 1413 1414At the start of 2026, 25-year fixed rates sit between **2.9% and 3.8%**. The best profiles (high income, substantial down payment, stable permanent contract) secure rates around 3.2-3.4%. **However, be warned: the lowest rates advertised by banks are almost always conditional on cross-selling.** Specifically, to land a rate close to 2.9-3.0%, you will generally be required to domicile your salaries, take out outstanding balance insurance and fire insurance with the lender, and perhaps even open a savings or investment plan there. Declining these add-on products can easily add 0.2 to 0.5 percentage points to the proposed rate. Keep this in mind when comparing offers: the "window" rate is not the one you will get without counterparts. 1415 1416Variable rates, which are less common in Belgium, offer a slight initial advantage but carry the risk of future increases. 1417 1418The trend is towards stability, with moderate fluctuations expected depending on the ECB's monetary policy and inflation trends. 1419 1420### Impact of the loan term 1421 1422The loan term significantly influences your monthly payments and the total cost. Over 20 years, a â¬250,000 loan at 3.3% costs about â¬1,425/month with total interest of â¬92,000. Over 25 years, the monthly payment drops to â¬1,220, but the total cost of interest climbs to around â¬116,000. To simulate different scenarios, use our [mortgage simulator](/simulateur-pret). 1423 1424## 4. Purchase costs: understanding the details 1425 1426One of the most common surprises for first-time buyers in Belgium is the sheer scale of the costs added to the purchase price. Here is a complete overview for 2026. 1427 1428### 4.1 Registration duties by region 1429 1430Registration duties represent the largest expense. Following the 2025 reforms, the three regions have very different systems. 1431 1432| Region | Sole & primary residence | Other purchase (investment, 2nd home) | Key specifics | 1433| ------------ | ---------------------------------------------------- | ------------------------------------- | ----------------------------------------------------------------------------------------------- | 1434| **Wallonia** | **3%** | 12.5% | Registered domicile within 3 years, kept for 3 years; housing-cheque scheme abolished | 1435| **Flanders** | **2%** | 12% | â¬1,867 reduction if price ⤠â¬220,000; split purchases excluded from the reduced rate since 2026 | 1436| **Brussels** | 12.5% with **â¬200,000 allowance** (price ⤠â¬600,000) | 12.5% | +â¬25,000 allowance per 2-class EPC jump; kept for 5 years | 1437 1438**Wallonia (since January 1, 2025)**: the rate dropped from 12.5% to **3%** for the purchase of a sole and primary residence. Conditions: the property must become your primary residence within 3 years (5 years for a property under construction), you cannot own another residential property in full ownership, and you must maintain your domicile there for at least 3 years. If you own another property, you can sell it within 3 years to benefit retroactively from the reduced rate. For any other purchase (investment, secondary residence), the rate remains at **12.5%**. Note: this reform was accompanied by the abolition of the "chèque-habitat" (housing check) and the old â¬5,000 tax allowance. 1439 1440**Flanders (since January 1, 2025)**: the rate was reduced from 3% to **2%** for the sole and primary residence. The conditions are similar: domiciliation within 3 years, sale of other properties within 2 years if applicable. The rate jumps to **12%** for investments and secondary residences. An additional reduction of â¬1,867 applies to modest homes priced up to â¬220,000 (or â¬240,000 in some municipalities). Note: the preferential 1% rate for major energy renovations was abol
1440ished on January 1, 2025. Stricter rules regarding the maintenance of domicile have been in force since January 1, 2026. 1441 1442**â ï¸ 2026 Update â Split purchases (gesplitste aankoop):** if you are considering a family purchase involving the splitting of ownershipâfor example, parents buying the usufruct while the child acquires the bare ownership to establish their primary residenceâbe aware that Flanders tightened the rules on January 1, 2026. This type of transaction, often used in estate planning to reduce future inheritance taxes, is **now entirely excluded from the 2% reduced rate**. The entire acquisition will be subject to the full **12%** rate, drastically altering the profitability of this setup. It is imperative that you consult your notary before considering a split purchase in the Flemish Region. 1443 1444**Brussels**: the rate remains at **12.5%**, the highest in the country. However, a tax allowance (abatement) applies to the first **â¬200,000** of the purchase price for a primary residence, provided the price does not exceed â¬600,000. This represents a maximum saving of **â¬25,000**. An additional allowance of â¬25,000 per EPC class jump is possible if you improve the property's energy performance by at least two classes within 5 years. Conditions: natural person, full ownership, domiciliation within 3 years, maintenance for 5 years. 1445 1446**Comparative table â â¬300,000 property (sole and primary residence, first-time buyer):** 1447 1448| | Wallonia | Flanders | Brussels | 1449| --------------------- | -------- | -------- | -------------------------- | 1450| Rate / mechanism | 3% | 2% | 12.5% â â¬200,000 allowance | 1451| Registration duties | â¬9,000 | â¬6,000 | â¬12,500 | 1452| Savings vs. full rate | â¬28,500 | â¬30,000 | â¬25,000 | 1453 1454### 4.2 Notary fees 1455 1456The notary's fees are regulated by law and follow an identical **sliding scale** across the country. For a â¬300,000 property, expect around **â¬3,500 to â¬4,000** in fees, plus VAT (21% on fees), administrative search costs (urban planning, mortgages, land registry, totaling around â¬1,000 to â¬1,500), and the mortgage deed costs. 1457 1458In total, notary fees in the broad sense (fees + administrative costs + VAT) generally represent between **1.5% and 2% of the property price** for standard price ranges. For detailed calculations, check out our [complete guide on deed costs in Belgium](/blog/frais-acte-achat-immobilier-belgique-estimation-guide). 1459 1460### 4.3 VAT vs. Registration duties (new builds) 1461 1462The purchase of a new property is subject to **21% VAT** on the construction portion (the land remains subject to registration duties). A property is considered "new" for VAT purposes if it is sold by a VAT-registered entity before December 31 of the second year following its first occupation. 1463 1464A **6% VAT** regime exists for demolition and reconstruction, but the rules changed profoundly on January 1, 2024. The old measure, which allowed developers to sell new projects at 6% in 32 central cities, has ended (the transition period concluded at the end of 2024). **The 6% VAT is now reserved exclusively for private individuals** (project owners) who demolish and rebuild their **sole and primary residence**, anywhere in Belgium, provided the living area does not exceed **200 m²**. If you buy a new apartment from a developer, you will pay 21% VAT in almost all cases. Consult your notary to verify if your personal project qualifies for the reduced rate. 1465 1466To accurately calculate your deed costs based on your situation, use our [deed cost simulator](/simulateur-frais-acte). 1467 1468### 4.4 Comprehensive numerical example 1469 1470Let's take a **â¬300,000** property purchased by a first-time buyer (sole and primary residence): 1471 1472**In Wallonia:** 1473 1474- Registration duties: 300,000 à 3% = **â¬9,000** 1475- Notary fees + VAT: approx. **â¬4,500** 1476- Administrative & search costs: approx. **â¬1,200** 1477- Mortgage deed costs: approx. **â¬4,500** 1478- **Total costs: â â¬19,200** (or 6.4% of the price) 1479 1480**In Flanders:** 1481 1482- Registration duties: 300,000 à 2% = **â¬6,000** 1483- Notary fees + costs: approx. **â¬5,700** 1484- Mortgage deed costs: approx. **â¬4,500** 1485- **Total costs: â â¬16,200** (or 5.4% of the price) 1486 1487**In Brussels:** 1488 1489- Registration duties: (300,000 â 200,000) à 12.5% = **â¬12,500** 1490- Notary fees + costs: approx. **â¬5,700** 1491- Mortgage deed costs: approx. **â¬4,500** 1492- **Total costs: â â¬22,700** (or 7.6% of the price) 1493 1494These amounts are indicative and vary depending on the loan amount, the loan-to-value ratio, and other parameters specific to your situation. 1495 1496## 5. The purchase steps step by step 1497 1498### 5.1 The property search 1499 1500Start by defining your criteria (budget, location, area, property type, minimum EPC) and monitor the main real estate portals: **Immoweb**, **Immovlan**, and **Zimmo**. Do not overlook **Biddit** (biddit.be), the online public auction platform of Belgian notaries: you can regularly find properties to renovate sold transparently, sometimes below market prices. Supplement this with local agency websites and word-of-mouth. 1501 1502During visits, systematically check: 1503 1504- The **EPC certificate**: an energy-inefficient property (label E, F, or G) can require tens of thousands of euros in work and will suffer a discount upon resale. To understand the EPC's impact on a property's value, check our [EPC simulator](/simulateur-peb) and our article [Understanding the EPC in Belgium](/blog/comprendre-peb-belgique). 1505- The **urban planning situation**: request urban planning information from the municipality. Verify that there are no violations, that the work carried out was authorized, and that the property is not affected by an expropriation plan. 1506- **Environmental risks**: flood zones (check your region's geoportal), soil pollution, noise pollution. 1507- The **building's condition**: roof, facade, electrical and heating systems, humidity, asbestos (for properties built before 2001). 1508 1509### 5.2 The offer and the sales agreement 1510 1511Once you've found the property, you make a written **purchase offer**. This legally binds you as soon as it is accepted by the seller. You can include **suspensive conditions** (contingencies), particularly the obtention of a mortgage loan within a set timeframe (usually 4 to 6 weeks). 1512 1513The **sales agreement** (compromis de vente) is then signed by both parties, usually at the notary's office or the agency. This document sets the final terms of the sale: price, conditions, deadlines, identity of the parties, urban planning status, and known charges. You pay a **10% deposit** of the price upon signing the agreement, placed into the notary's escrow account. **Good to know: this 10% rate is a custom, not a legal obligation.** Nothing in Belgian law fixes the deposit amount. If gathering 10% on top of the notary fees puts you in difficulty, you can absolutely negotiate a **5%** deposit, or even a lump sum (e.g., â¬10,000). More and more sellers are accepting these arrangements, especially if your banking file is solid. Discuss this with your notary from the beginning of the negotiations. 1514 1515The most common suspensive clauses are: obtaining bank financing, urban planning compliance, and the absence of pre-emption by a public authority. 1516 1517### 5.3 Financing 1518 1519Once the agreement is signed, you generally have the timeframe stipulated in the suspensive condition to secure your loan. Build your **bank file** by gathering the following documents: 1520 1521- **Pay slips** for the last 3 months (employees) or **tax assessment notices** for the last 3 years (self-employed) 1522- **Bank statements** for the last 3 to 6 months 1523- **Proof of down payment** (savings, donation, sale of another property) 1524- **ID card** and proof of residence
1525- **Employment contract** or employer certificate (employees) 1526- **Property valuation** (if necessary, the bank will mandate its own expert) 1527- **Signed sales agreement** 1528- **EPC certificate** of the property 1529 1530Compare offers from several banks, focusing on the **APR** (Annual Percentage Rate), which includes not only the nominal rate but also file processing fees and other costs. Don't neglect **outstanding balance insurance**: while not legally required, banks almost systematically demand it. Compare insurance premiums too, as the differences between insurers can be significant. 1531 1532### 5.4 The authentic deed at the notary 1533 1534The authentic deed is signed at the notary's office, typically within **4 months** of the sales agreement. The notary reads the entire deed, verifies that all conditions are met, and proceeds with the registration. You pay the balance of the price and all costs at that moment (the bank wires the borrowed funds directly to the notary). 1535 1536After signing, the notary proceeds with the **mortgage registration** at the mortgage registry office and the **transcription** of the sale. The keys are handed over: you are officially the owner. 1537 1538## 6. Taxation and subsidies in 2026 1539 1540### 6.1 Regional purchase subsidies 1541 1542**Wallonia**: the main subsidy is the reduced 3% registration duty rate for a sole and primary residence. Old mechanisms (housing check, â¬5,000 allowance, reduced 6% rate for modest homes) have been abolished and replaced by this single rate. Energy renovation premiums remain available to improve your property's EPC score. 1543 1544**Brussels**: in addition to the â¬200,000 tax allowance, the region offers energy premiums (Renolution) to finance energy renovation work. An additional â¬25,000 allowance per EPC class jump (minimum 2 classes improved) encourages the purchase of energy-inefficient homes to renovate. 1545 1546**Flanders**: the 2% reduced rate is the primary aid. The woonbonus (housing bonus) was abolished for new loans in 2020, but an additional reduction of â¬1,867 applies to modest homes. Renovation premiums are available through the MijnVerbouwPremie program. 1547 1548### 6.2 Property tax (Précompte immobilier) 1549 1550The property tax is an annual tax calculated on the basis of the **cadastral income (CI)** of your property, indexed and then multiplied by a rate that combines three levels: regional, provincial, and municipal. The formula is: **CI à indexation coefficient à overall rate**. The indexation coefficient for 2025 is 2.2446 (a 3.14% increase compared to 2024). 1551 1552The amount varies wildly from one municipality to another due to differing additional municipal surcharges. For the exact same CI of â¬1,000, your property tax can range from â¬600 to over â¬1,500 depending on the town. 1553 1554A reduction for a modest home may apply if your CI does not exceed a certain ceiling (which varies by region). 1555 1556### 6.3 Taxation of rental investment 1557 1558In Belgium, rental income from residential properties is not taxed on the actual rent collected, but on the basis of the **indexed cadastral income increased by 40%**, which is integrated into your personal income tax (PIT) return. This system is advantageous when the real rent significantly exceeds the increased CI. 1559 1560The property tax is an additional expense. The more properties you own, the more significant the tax impact can become, particularly due to the progressive nature of the PIT. 1561 1562To evaluate the overall profitability of an investment, taking into account taxation, charges, and potential capital gains, use our [IRR simulator](/simulateur-tri) (Internal Rate of Return). 1563 1564## 7. Pitfalls to avoid 1565 1566Buying real estate in Belgium in 2026 demands vigilance. Here are the most frequent mistakes: 1567 1568**Underestimating the total budget.** The purchase price is just the beginning. Add deed costs (5 to 15% depending on the region and status), the potential renovation budget, co-ownership charges (for an apartment), and moving/furnishing costs. 1569 1570**Neglecting the EPC.** A property rated E, F, or G can require â¬30,000 to â¬80,000 in insulation, heating replacement, and new windows. It's not just a matter of comfort or energy bills: **in Flanders, it's a legal obligation**. The _renovatieverplichting_ (renovation obligation) requires any buyer of an E or F-rated property to renovate it to at least **label D within 5 years of the authentic deed**, under penalty of fines. In Wallonia, although the timeline is different, regulatory pressure on energy performance is also intensifying with the goal of a carbon-neutral housing stock by 2050. Before buying an energy-guzzling property, accurately price the cost of complianceâand factor it into your total acquisition budget. 1571 1572**Not checking the urban planning status.** Work carried out without a permit, an unauthorized change of use, or a restrictive zoning plan can turn your dream into a legal nightmare. 1573 1574**Buying above market price.** Without a comparative analysis of prices in the neighborhood, you risk overpaying. Request a [free analysis of your property](/free-analyse) to get an objective benchmark. 1575 1576**Forgetting co-ownership charges.** For an apartment, common charges (elevator, green spaces, cleaning, reserve fund) can run â¬100 to â¬300/month or more. Ask for the minutes of the latest general assemblies and the statement of charges. 1577 1578**Relying solely on gross yield.** A 6% gross yield can shrink to 2-3% net after expenses, taxes, and rental vacancy. Always calculate the net yield. 1579 1580**Ignoring recurring costs.** Property tax, fire insurance, maintenance, provisions for major works: these annual expenses add up. 1581 1582## 8. Checklist before buying 1583 1584Before signing your sales agreement, run through this list of essential checks. 1585 1586**Financial aspects:** 1587 1588- Calculate your actual borrowing capacity (not just the theoretical maximum amount) 1589- Obtain an agreement in principle from the bank before making an offer 1590- Plan a total budget including deed costs, renovation, and a safety buffer 1591- Compare at least 3 mortgage loan offers (APR, not just the nominal rate) 1592- Check the conditions of the outstanding balance insurance 1593- Anticipate the annual property tax 1594 1595**Legal and administrative aspects:** 1596 1597- Request complete urban planning information from the municipality 1598- Verify the absence of urban planning violations and pending permits 1599- Consult the zoning plan (plan de secteur) and nearby development projects 1600- Check for easements, pre-emption rights, and active leases 1601- Have the sales agreement drafted by a notary (even if it's not mandatory, it's highly recommended) 1602 1603**Technical aspects:** 1604 1605- Obtain and analyze the EPC certificate and estimate the cost of necessary energy upgrades 1606- Have the roof, framework, electrical, and heating systems inspected 1607- Check the condition of the windows, insulation, and ventilation 1608- Check for the possible presence of asbestos (properties built before 2001), dampness, and dry rot 1609- For an apartment, check the condition of the building as a whole (facade, common areas) 1610 1611**Tax aspects:** 1612 1613- Verify your eligibility for reduced registration duties in your region 1614- Calculate the tax impact of the purchase (property tax, potential deductibility) 1615- For an investment, estimate the real tax burden (CI, PIT, deductible expenses)
1616- Anticipate the implications of a potential resale (taxable capital gain if a plot of land is resold within 5 years) 1617 1618## 9. FAQ â Frequently Asked Questions 1619 1620### How much down payment is needed to buy real estate in Belgium in 2026? 1621 1622Most banks require a down payment covering at least the acquisition costs, meaning about 10 to 15% of the property price. Ideally, add 10 to 20% of the price to build a strong application. For a â¬300,000 property, plan for between â¬50,000 and â¬90,000 in equity in total (down payment + costs). The higher your down payment, the more favorable your interest rate will be. 1623 1624### How do I calculate the notary fees for a â¬300,000 property purchase in Belgium? 1625 1626"Notary fees" actually include registration duties (the largest share), the notary's actual fees, administrative costs, and VAT. For a â¬300,000 property in Wallonia (first-time buyer), expect around â¬19,000. In Flanders, around â¬16,000. In Brussels (with the allowance), around â¬22,700. For an investment (full rate), the costs rise to â¬43,000-â¬45,000. Simulate your exact costs with our [deed cost simulator](/simulateur-frais-acte). 1627 1628### Is it possible to buy real estate without a down payment in Belgium? 1629 1630It is theoretically possibleâsome banks finance up to 100% of the purchase priceâbut very rare and reserved for exceptional profiles (stable high incomes, existing assets as collateral). Even in this case, you will have to finance the acquisition costs with your own funds. Buying with absolutely no personal contribution is therefore practically impossible. 1631 1632### What is the difference between registration duties and VAT when buying real estate in Belgium? 1633 1634Registration duties apply to the purchase of existing real estate (second-hand). The 21% VAT applies to the purchase of new properties sold by a VAT-registered entity. The two are never cumulated on the same property: it's either one or the other. In the case of an off-plan purchase with a separate plot of land, the land may be subject to registration duties while the construction is subject to VAT. 1635 1636### How long does the real estate purchasing process take in Belgium? 1637 1638From the start of your search to the handing over of the keys, generally expect 6 to 12 months. The typical timeframes are: property search (variable), negotiation and offer (1-2 weeks), sales agreement (2-4 weeks after agreement), obtaining the loan (4-6 weeks), and authentic deed (about 4 months after the sales agreement). In total, from the sales agreement to the deed, expect an average of 4 months. 1639 1640### Does the EPC certificate really influence the selling price of a property in Belgium? 1641 1642Absolutely. Recent data shows that properties with a poor EPC score (E, F, G) suffer a discount of 10 to 20% compared to efficient properties (A, B). This trend is accelerating with the tightening of regional energy regulations. However, an energy-inefficient property bought "below market" can represent an opportunity if you plan an energy renovation supported by regional premiums. 1643 1644### Do I need to use a mortgage broker to get the best rate in Belgium? 1645 1646A mortgage broker can save you time by comparing offers from several banks for you. They know the criteria of each institution and can negotiate favorable conditions, particularly for non-standard profiles (self-employed, mixed incomes). Their service is generally free for the borrower, as they are remunerated by the bank. It is not strictly necessary, but it is often useful, especially if you lack time or experience. 1647 1648### What subsidies and premiums exist for first-time buyers in Belgium in 2026? 1649 1650The three regions offer distinct mechanisms. In Wallonia, the reduced 3% rate (instead of 12.5%) represents significant savings. In Flanders, the 2% rate is even more advantageous. In Brussels, the â¬200,000 tax allowance offers a saving of â¬25,000. All these aids are conditional on the personal occupation of the property as a primary residence. Energy renovation premiums are available in all three regions for work that improves the EPC. 1651 1652### Is it the right time to buy real estate in Belgium in 2026? 1653 1654There is no "perfect time" to buy real estate in Belgium. Prices continue to grow moderately (+3 to 4% expected in 2026), rates have stabilized at reasonable levels, and recent tax reforms make acquisition more accessible for first-time buyers. Postponing your purchase in the hope of a price drop is a risky bet: historically, Belgian real estate prices have only experienced brief corrections. The key is to buy a property suited to your budget and needs, backed by a rigorous analysis of the fundamentals. 1655 1656--- 1657 1658_This guide was written by Arcanes for informational purposes and does not constitute personalized financial, tax, or legal advice. For support tailored to your situation, consult your notary, banker, or a certified financial advisor. All figures are based on data available in early 2026 and are subject to change._ 1659 1660_Want to go further? Use our [free simulators](/) to refine your real estate project: deed costs, borrowing capacity, rental yield, EPC, mortgage loan, and IRR._ 1661`,RF=`--- 1662title: "Acheter un bien immobilier en Belgique en 2026 : le guide complet" 1663slug: "acheter-bien-immobilier-belgique-2026" 1664tag: "Financement" 1665readTime: 15 1666publishDate: "13 mars 2026" 1667updateDate: "24 août 2026" 1668author: "Arcanes" 1669excerpt: "De la recherche du bien à la signature chez le notaire : toutes les étapes, frais, aides et pièges à éviter pour acheter en Belgique en 2026." 1670image: "/images/blog/acheter-belgique-2026.jpg" 1671imageVersion: "1" 1672imageAlt: "Vue aérienne d'une ville belge au coucher du soleil" 1673--- 1674 1675# Acheter un bien immobilier en Belgique en 2026 : le guide complet 1676 1677Acheter un bien immobilier en Belgique en 2026 reste l'un des projets de vie les plus importants â et les plus complexes â que vous puissiez entreprendre. Entre les réformes fiscales récentes, l'évolution des taux hypothécaires et les disparités régionales de prix, il est essentiel de s'y préparer méthodiquement. Ce guide complet vous accompagne pas à pas, de la première réflexion jusqu'à la remise des clés chez le notaire, en passant par le financement, les frais et les pièges à éviter. 1678 1679Que vous soyez primo-accédant à la recherche de votre première habitation ou investisseur souhaitant diversifier votre patrimoine, vous trouverez ici toutes les informations actualisées pour prendre une décision éclairée sur le marché immobilier belge. 1680 1681## 1. Le marché immobilier belge en 2026 : état des lieux 1682 1683**Mis à jour le 24 août 2026** â taux, abattements et règles TVA vérifiés (réformes régionales 2025-2026 intégrées). _Sources : Statbel, SPF Finances, législations régionales â voir notre [méthodologie](/methodologie)._ 1684 1685### Ãvolution des prix par région 1686 1687Le marché immobilier en Belgique poursuit sa trajectoire de hausse modérée en 2026. Selon les données Statbel du troisième trimestre 2025, le prix médian d'une maison mitoyenne ou semi-détachée s'établit à **280.000 â¬** au niveau national, tandis qu'une maison quatre façades atteint **390.000 â¬**. Les appartements se négocient autour de **255.000 â¬** en médiane. 1688 1689Les écarts régionaux restent toutefois considérables : 1690 1691**En Wallonie**, la région la plus accessible, une maison mitoyenne coûte en médiane **197.000 â¬** (en hausse de 6,5 % sur un an) et une maison quatre façades **33
16910.000 â¬** (+8,2 %). La réforme des droits d'enregistrement entrée en vigueur le 1er janvier 2025 â passant de 12,5 % à 3 % pour l'habitation propre et unique â a libéré du pouvoir d'achat et stimulé la demande, tirant les prix vers le haut. Les prévisions pour 2026 tablent sur des prix moyens de 280.000 à 285.000 ⬠pour une maison type, soit une hausse d'environ 4 %. 1692 1693**En Flandre**, les maisons mitoyennes affichent un prix médian de **317.500 â¬** et les maisons quatre façades **430.000 â¬**. Le Brabant flamand reste la province la plus chère avec des maisons mitoyennes à 370.500 â¬. La croissance y est plus contenue, autour de 3 à 3,5 % prévus en 2026, portant le prix moyen d'une maison à près de 390.000 â¬. 1694 1695**à Bruxelles**, les prix sont nettement plus élevés : **525.000 â¬** pour une maison mitoyenne et jusqu'à **1.112.500 â¬** pour une maison quatre façades. Les appartements se situent autour de **265.000 â¬**. Le marché bruxellois, soutenu par la présence des institutions européennes et une demande locative constante, reste relativement stable. 1696 1697Pour explorer les prix commune par commune et visualiser ces écarts régionaux, consultez notre [carte interactive des prix immobiliers](/map). 1698 1699### Tendances et perspectives 1700 1701Plusieurs facteurs structurent le marché en 2026. Les **taux hypothécaires** se sont stabilisés après les baisses successives du taux directeur de la BCE (passé à 2,00 % début 2026, après 200 points de base de réduction entre juin 2024 et janvier 2026). Les taux fixes sur 25 ans oscillent entre **2,9 % et 3,8 %** selon le profil de l'emprunteur, avec les meilleurs dossiers autour de 3,2-3,4 %. 1702 1703Le **volume de transactions** a bondi de 15 % sur les neuf premiers mois de 2025 par rapport à 2024, un dynamisme qui devrait se poursuivre. L'offre reste néanmoins limitée, notamment dans les centres urbains, ce qui soutient les prix. 1704 1705Enfin, la **performance énergétique** s'impose comme un critère central. Les biens affichant un mauvais score PEB subissent des décotes de 10 à 20 %, tandis que les logements rénovés ou performants se vendent rapidement et à meilleur prix. 1706 1707## 2. Définir votre projet : habitation personnelle ou investissement ? 1708 1709Avant de vous lancer dans la recherche d'un bien, clarifiez votre objectif. La nature de votre projet â habitation propre ou investissement locatif â conditionne votre fiscalité, votre financement et vos critères de sélection. 1710 1711### Habitation propre et unique 1712 1713Si vous achetez pour y habiter, vous bénéficiez d'avantages fiscaux significatifs : taux réduits de droits d'enregistrement en Wallonie (3 %) et en Flandre (2 %), ou abattement de 200.000 ⬠à Bruxelles. Vos critères porteront davantage sur la localisation par rapport à votre travail, la qualité de vie du quartier, les écoles, les transports et le potentiel de plus-value à long terme. 1714 1715### Investissement locatif 1716 1717L'investissement immobilier en Belgique offre des rendements locatifs bruts de 3 à 6 % selon les régions, avec une demande locative forte dans les villes universitaires et les centres urbains. Mais attention : le rendement brut ne dit pas tout. Il faut déduire les charges (précompte immobilier, assurances, entretien, gestion), la vacance locative et les éventuels travaux. Pour calculer votre rendement net réel, utilisez notre [simulateur de rendement locatif](/simulateur-rendement-locatif). Pour approfondir le sujet, lisez également notre article détaillé sur [la vérité des chiffres du rendement locatif en Belgique](/blog/rendement-locatif-verite-chiffres-belgique). 1718 1719Avant d'arbitrer, il faut chiffrer le coût d'opportunité : [ce que rapporterait le même effort d'épargne placé en bourse](/blog/immobilier-ou-bourse-belgique). 1720 1721### Immeuble de rapport 1722 1723Cas particulier de l'investissement, l'immeuble de rapport (plusieurs unités locatives dans un même bâtiment) permet de mutualiser les risques de vacance et d'optimiser les coûts de gestion. En revanche, il exige un budget d'acquisition plus important, une analyse financière multi-unités rigoureuse et une attention particulière à la réglementation urbanistique (division de biens, normes PEB par unité). 1724 1725## 3. Ãvaluer votre capacité financière
1726 1727### Comment les banques calculent votre capacité d'emprunt 1728 1729En Belgique, les banques appliquent principalement la **règle du tiers** : vos mensualités de crédit ne doivent pas dépasser un tiers de vos revenus nets. Certains établissements effectuent également un **stress test**, simulant une hausse de taux pour vérifier que vous pourriez encore supporter les mensualités dans un scénario défavorable. 1730 1731D'autres critères entrent en jeu : la stabilité de vos revenus (CDI vs indépendant), votre ancienneté professionnelle, vos autres dettes en cours et votre reste à vivre après paiement de toutes les charges. 1732 1733Pour estimer rapidement votre budget maximal, utilisez notre [simulateur de capacité d'emprunt](/simulateur-emprunt). 1734 1735### L'apport personnel 1736 1737La Banque nationale de Belgique recommande aux banques d'exiger un apport personnel couvrant au minimum les frais d'acquisition (environ 10 à 15 % du prix), plus idéalement 10 à 20 % du prix du bien lui-même. Concrètement, pour un bien à 300.000 â¬, prévoyez entre **30.000 et 60.000 ⬠de fonds propres** pour le bien, auxquels s'ajoutent **25.000 à 40.000 ⬠de frais** selon la région. 1738 1739Certaines banques prétendent encore financer jusqu'à 100 % du prix d'achat (hors frais), mais soyons clairs : **c'est un mythe pour 99 % des primo-accédants**. Depuis les recommandations renforcées de la BNB, seule une infime minorité de dossiers y accède â typiquement des profils avec des revenus très élevés, un patrimoine familial en garantie complémentaire ou un co-emprunteur solide. Pour la grande majorité des acheteurs, et a fortiori sans aide familiale, le prêt à 100 % reste inaccessible. Mieux vaut partir du principe que vous devrez réunir au minimum 10 % du prix en fonds propres, en plus de la totalité des frais d'acte. 1740 1741### Taux hypothécaires en 2026 1742 1743Début 2026, les taux fixes sur 25 ans se situent entre **2,9 % et 3,8 %**. Les meilleurs profils (revenus élevés, apport conséquent, CDI stable) obtiennent des taux autour de 3,2-3,4 %. **Attention toutefois : les taux les plus bas affichés par les banques sont presque toujours conditionnés à des ventes croisées.** Concrètement, pour décrocher un taux proche de 2,9-3,0 %, il vous sera généralement demandé de domicilier vos salaires, de souscrire l'assurance solde restant dû et l'assurance incendie auprès du prêteur, voire d'y ouvrir un plan d'épargne ou d'investissement. Refuser ces produits annexes peut facilement ajouter 0,2 à 0,5 point de pourcentage au taux proposé. Gardez cela en tête lorsque vous comparez les offres : le taux « vitrine » n'est pas celui que vous obtiendrez sans contrepartie. 1744 1745Les taux variables, moins courants en Belgique, offrent un léger avantage initial mais comportent un risque de hausse future. 1746 1747La tendance est à la stabilité, avec des variations modérées attendues en fonction de la politique monétaire de la BCE et de l'évolution de l'inflation. 1748 1749### Impact de la durée de crédit 1750 1751La durée du prêt influence considérablement vos mensualités et le coût total. Sur 20 ans, un emprunt de 250.000 ⬠à 3,3 % coûte environ 1.425 â¬/mois et un total d'intérêts de 92.000 â¬. Sur 25 ans, la mensualité tombe à 1.220 â¬, mais le coût total des intérêts grimpe à environ 116.000 â¬. Pour simuler différents scénarios, utilisez notre [simulateur de prêt hypothécaire](/simulateur-pret). 1752 1753## 4. Les frais d'achat : tout comprendre en détail 1754 1755L'une des surprises les plus courantes pour les primo-accédants en Belgique est l'ampleur des frais annexes au prix d'achat. Voici un panorama complet pour 2026. 1756 1757### 4.1 Les droits d'enregistrement par région 1758 1759Les droits d'enregistrement constituent le poste de frais le plus important. Depuis les réformes de 2025, les trois régions présentent des régimes très différents. 1760 1761| Région | Habitation propre & unique | Autre achat (invest., 2e résidence) | Spécificités | 1762| ------------- | ------------------------------------------------------- | ----------------------------------- | ------------------------------------------------------------------------------------------- | 1763| **Wallonie** | **3 %** | 12,5 % | Domiciliation sous 3 ans, maintien 3 ans ; chèque-habitat supprimé | 1764| **Flandre** | **2 %** | 12 % | Réduction de 1.867 ⬠si prix ⤠220.000 ⬠;
1764 achats scindés exclus du taux réduit depuis 2026 | 1765| **Bruxelles** | 12,5 % avec **abattement 200.000 â¬** (prix ⤠600.000 â¬) | 12,5 % | +25.000 ⬠d'abattement par saut de 2 classes PEB ; maintien 5 ans | 1766 1767**Wallonie (depuis le 1er janvier 2025)** : le taux est passé de 12,5 % à **3 %** pour l'achat d'une habitation propre et unique. Conditions : le bien doit devenir votre résidence principale dans les 3 ans (5 ans pour un bien en construction), vous ne pouvez pas posséder un autre bien résidentiel en pleine propriété, et vous devez y maintenir votre domicile pendant au moins 3 ans. Si vous possédez un autre bien, vous pouvez le vendre dans les 3 ans pour bénéficier rétroactivement du taux réduit. Pour tout autre achat (investissement, résidence secondaire), le taux reste à **12,5 %**. Attention : cette réforme s'est accompagnée de la suppression du chèque-habitat et de l'ancien abattement fiscal de 5.000 â¬. 1768 1769**Flandre (depuis le 1er janvier 2025)** : le taux a été réduit de 3 % à **2 %** pour l'habitation propre et unique. Les conditions sont similaires : domiciliation dans les 3 ans, vente des autres biens dans les 2 ans si applicable. Le taux passe à **12 %** pour les investissements et résidences secondaires. Une réduction supplémentaire de 1.867 ⬠s'applique pour les habitations modestes dont le prix ne dépasse pas 220.000 ⬠(ou 240.000 ⬠dans certaines communes). à noter : le taux préférentiel de 1 % pour les rénovations énergétiques majeures a été supprimé au 1er janvier 2025. Des conditions renforcées de maintien de domicile sont en vigueur depuis le 1er janvier 2026. 1770 1771**â ï¸ Nouveauté 2026 â Achats scindés (gesplitste aankoop) :** si vous envisagez un achat familial en démembrement de propriété â par exemple, les parents achètent l'usufruit tandis que l'enfant acquiert la nue-propriété pour y établir sa résidence principale â sachez que la Flandre a durci les règles au 1er janvier 2026. Ce type d'opération, souvent utilisé en planification successorale pour réduire les droits de succession futurs, est **désormais totalement exclu du taux réduit de 2 %**. L'intégralité de l'acquisition sera soumise au taux plein de **12 %**, ce qui modifie radicalement la rentabilité de ce montage. Consultez impérativement votre notaire avant d'envisager un achat en démembrement en Région flamande. 1772 1773**Bruxelles** : le taux reste à **12,5 %**, le plus élevé du pays. Cependant, un abattement s'applique sur les premiers **200.000 â¬** du prix d'achat pour l'habitation propre, à condition que le prix ne dépasse pas 600.000 â¬. Cela représente une économie maximale de **25.000 â¬**. Un abattement complémentaire de 25.000 ⬠par saut de classe PEB est possible si vous améliorez la performance énergétique du bien d'au moins deux classes dans les 5 ans. Conditions : personne physique, pleine propriété, domiciliation dans les 3 ans, maintien pendant 5 ans. 1774 1775**Tableau comparatif â Bien à 300.000 ⬠(habitation propre et unique, primo-accédant) :** 1776 1777| | Wallonie | Flandre | Bruxelles | 1778| ----------------------- | -------- | -------- | ----------------------------- | 1779| Taux / mécanisme | 3 % | 2 % | 12,5 % â abattement 200.000 ⬠| 1780| Droits d'enregistrement | 9.000 ⬠| 6.000 ⬠| 12.500 ⬠| 1781| Ãconomie vs taux plein | 28.500 ⬠| 30.000 ⬠| 25.000 ⬠| 1782 1783### 4.2 Les frais de notaire 1784 1785Les honoraires du notaire sont réglementés par la loi et suivent un **barème dégressif** identique dans tout le pays. Pour un bien à 300.000 â¬, comptez environ **3.500 à 4.000 â¬** d'honoraires, auxquels s'ajoutent la TVA (21 % sur les honoraires), les frais de recherche administrative (urbanisme, hypothèques, cadastre, pour environ 1.000 à 1.500 â¬) et les frais d'acte du crédit hypothécaire. 1786 1787Au total, les frais de notaire au sens large (honoraires + frais administratifs + TVA) représentent généralement entre **1,5 % et 2 % du prix du bien** pour un achat dans les gammes de prix courantes. Pour les détails du calcul, consultez notre [guide complet sur les frais d'acte en Belgique](/blog/frais-acte-achat-immobilier-belgique-estimation-guide). 1788 1789### 4.3 TVA vs droits d'enregistrement (construction neuve) 1790 1791L'achat d'un bien neuf est soumis à la **TVA de 21 %** sur la partie construction (le terrain restant soumis aux droits d'enregistrement). Un bien est considéré comme « neuf » au sens de la TVA s'il est vendu par un assujetti TVA avant le 31 décembre de la deuxième année suivant la première occupation. 1792 1793Un régime de **TVA à 6 %** existe pour la démolition-reconstruction, mais les règles ont profondément changé depuis le 1er janvier 2024. L'ancienne mesure, qui permettait aux promoteurs de vendre des projets neufs à 6 % dans les 32 villes centrales, a pris fin (la période transitoire s'est achevée fin 2024). **Désormais, la TVA à 6 % est réservée exclusivement aux particuliers** (maîtres d'ouvrage) qui démolissent et reconstruisent leur **habitation propre et unique**, sur l'ensemble du territoire belge, à condition que la surface habitable ne dépasse pas **200 m²**. Si vous achetez un appartement neuf auprès d'un promoteur, vous paierez dans la quasi-totalité des cas la TVA à 21 %. Renseignez-vous auprès de votre notaire pour vérifier si votre projet personnel peut bénéficier du taux rédu
1793it. 1794 1795Pour calculer précisément vos frais d'acte selon votre situation, utilisez notre [simulateur de frais d'acte](/simulateur-frais-acte). 1796 1797### 4.4 Exemple chiffré complet 1798 1799Prenons un bien de **300.000 â¬** acheté par un primo-accédant (habitation propre et unique) : 1800 1801**En Wallonie :** 1802 1803- Droits d'enregistrement : 300.000 à 3 % = **9.000 â¬** 1804- Honoraires notaire + TVA : environ **4.500 â¬** 1805- Frais administratifs et recherches : environ **1.200 â¬** 1806- Frais d'acte de crédit hypothécaire : environ **4.500 â¬** 1807- **Total frais : â 19.200 â¬** (soit 6,4 % du prix) 1808 1809**En Flandre :** 1810 1811- Droits d'enregistrement : 300.000 à 2 % = **6.000 â¬** 1812- Honoraires + frais notaire : environ **5.700 â¬** 1813- Frais d'acte de crédit : environ **4.500 â¬** 1814- **Total frais : â 16.200 â¬** (soit 5,4 % du prix) 1815 1816**à Bruxelles :** 1817 1818- Droits d'enregistrement : (300.000 â 200.000) à 12,5 % = **12.500 â¬** 1819- Honoraires + frais notaire : environ **5.700 â¬** 1820- Frais d'acte de crédit : environ **4.500 â¬** 1821- **Total frais : â 22.700 â¬** (soit 7,6 % du prix) 1822 1823Ces montants sont indicatifs et varient selon le montant du crédit, la quotité empruntée et d'autres paramètres spécifiques à votre situation. 1824 1825## 5. Les étapes de l'achat pas à pas 1826 1827### 5.1 La recherche du bien 1828 1829Commencez par définir vos critères (budget, localisation, superficie, type de bien, PEB minimum) et surveillez les portails immobiliers principaux : **Immoweb**, **Immovlan** et **Zimmo**. Ne négligez pas non plus **Biddit** (biddit.be), la plateforme de ventes publiques en ligne des notaires belges : on y trouve régulièrement des biens à rénover vendus de manière transparente, parfois en dessous des prix du marché. Complétez par les sites des agences locales et le bouche-à -oreille. 1830 1831Lors des visites, vérifiez systématiquement : 1832 1833- Le **certificat PEB** : un bien énergivore (label E, F ou G) peut nécessiter des dizaines de milliers d'euros de travaux et subira une décote à la revente. Pour comprendre l'impact du PEB sur la valeur d'un bien, consultez notre [simulateur PEB](/simulateur-peb) et notre article [Comprendre le PEB en Belgique](/blog/comprendre-peb-belgique). 1834- La **situation urbanistique** : demandez les informations urbanistiques à la commune. Vérifiez qu'il n'y a pas d'infraction, que les travaux réalisés ont été autorisés et que le bien n'est pas frappé d'un plan d'expropriation. 1835- Les **risques environnementaux** : zones d'inondation (consultez le géoportail de votre région), pollution des sols, nuisances sonores. 1836- L'**état du bâtiment** : toiture, façade, installations électriques et de chauffage, humidité, amiante (biens construits avant 2001). 1837 1838### 5.2 L'offre et le compromis de vente 1839 1840Une fois le bien trouvé, vous formulez une **offre d'achat** par écrit. Celle-ci vous engage juridiquement dès qu'elle est acceptée par le vendeur. Vous pouvez y inclure des **conditions suspensives**, notamment l'obtention du crédit hypothécaire dans un délai déterminé (généralement 4 à 6 semaines). 1841 1842Le **compromis de vente** (ou convention de vente) est ensuite signé par les deux parties, généralement chez le notaire ou en agence. Ce document fixe les termes définitifs de la vente : prix, conditions, délais, identité des parties, situation urbanistique et charges connues. Vous versez un **acompte de 10 %** du prix à la signature du compromis, placé sur le compte rubriqué du notaire. **Bon à savoir : ce taux de 10 % est un usage, pas une obligation légale.** Rien dans la loi belge ne fixe le montant de l'acompte. Si réunir 10 % en plus des frais de notaire vous met en difficulté, vous pouvez tout à fait négocier un acompte de **5 %**, voire une somme forfaitaire (par exemple 10.000 â¬). De plus en plus de vendeurs acceptent ces arrangements, surtout si votre dossier bancaire est solide. Parlez-en à votre notaire dès le début des négociations. 1843 1844Les clauses suspensives les plus courantes sont : l'obtention du financement bancaire, la conformité urbanistique et l'absence de préemption par une autorité publique. 1845 1846### 5.3 Le financement 1847 1848Une fois le compromis signé, vous disposez généralement du délai prévu par la condition suspensive pour obtenir votre crédit. Constituez votre **dossier bancaire** en rassemblant les pièces suivantes : 1849 1850- **Fiches de salaire** des 3 derniers mois (salariés) ou **avertissements-extrait de rôle** des 3 dernières années (indépendants) 1851- **Relevés de comptes bancaires** des 3 à 6 derniers mois 1852- **Preuve de l'apport personnel** (épargne, donation, vente d'un autre bien) 1853- **Carte d'identité** et justificatif de domicile 1854- **Contrat de travail** ou attestation de l'employeur (salariés) 1855- **Estimation du bien** (le cas échéant, la banque mandatera son propre expert) 1856- **Compromis de vente signé** 1857- **Certificat PEB** du bien 1858 1859Comparez les offres de plusieurs banques en vous concentrant sur le **TAEG** (taux annuel effectif global), qui intègre non seulement le taux nominal mais aussi les frais de dossier et autres coûts. Ne négligez pas l'**assurance solde restant dû** : bien qu'elle ne soit pas légalement obligatoire, les banques l'exigent quasi systématiquement. Comparez aussi les primes d'assurance, car les écarts entre assureurs peuvent être significatifs. 1860 1861### 5.4 L'acte authentique chez le notaire 1862 1863L'acte authentique est signé chez le notaire, en principe dans les **4 mois** suivant le compromis. Le notaire lit l'intégralité de l'acte, vérifie que toutes les conditions sont réunies et procède à l'enregistrement. Vous payez le solde du prix et tous les frais à ce moment-là (la banque verse directement les fonds empruntés au notaire). 1864 1865Après la signature, le notaire procède à l'**inscription hypothécaire** au bureau de la conservation des hypothèques et à la **transcription** de la vente. Les clés vous sont remises : vous êtes officiellement propriétaire. 1866 1867## 6. Fiscalité et aides en 2026 1868 1869### 6.1 Aides régionales à l'achat 1870
1871**Wallonie** : la principale aide est le taux réduit de 3 % des droits d'enregistrement pour l'habitation propre et unique. Les anciens dispositifs (chèque-habitat, abattement de 5.000 â¬, taux réduit de 6 % pour habitation modeste) ont été supprimés et remplacés par ce taux unique. Des primes à la rénovation énergétique restent disponibles pour améliorer la performance PEB de votre bien. 1872 1873**Bruxelles** : outre l'abattement de 200.000 â¬, la région propose des primes énergie (Renolution) pour financer les travaux de rénovation énergétique. Un abattement complémentaire de 25.000 ⬠par saut de classe PEB (minimum 2 classes améliorées) encourage l'achat de biens énergivores à rénover. 1874 1875**Flandre** : le taux réduit de 2 % constitue l'aide principale. Le woonbonus (bonus logement) a été supprimé pour les nouveaux crédits depuis 2020, mais une réduction supplémentaire de 1.867 ⬠s'applique pour les habitations modestes. Des primes à la rénovation sont disponibles via le programme MijnVerbouwPremie. 1876 1877### 6.2 Le précompte immobilier 1878 1879Le précompte immobilier est un impôt annuel calculé sur la base du **revenu cadastral (RC)** de votre bien, indexé puis multiplié par un taux qui combine trois niveaux : régional, provincial et communal. La formule est : **RC à coefficient d'indexation à taux global**. Le coefficient d'indexation pour 2025 est de 2,2446 (soit une hausse de 3,14 % par rapport à 2024). 1880 1881Le montant varie considérablement d'une commune à l'autre en raison des centimes additionnels communaux différents. Pour un même RC de 1.000 â¬, votre précompte peut varier de 600 ⬠à plus de 1.500 ⬠selon la commune. 1882 1883Une réduction pour habitation modeste peut s'appliquer si votre RC ne dépasse pas un certain plafond (variable selon la région). 1884 1885### 6.3 Fiscalité de l'investissement locatif 1886 1887En Belgique, les revenus locatifs des biens résidentiels ne sont pas taxés sur le loyer réel perçu, mais sur la base du **revenu cadastral indexé majoré de 40 %**, intégré dans votre déclaration IPP. Ce système est avantageux lorsque le loyer réel dépasse significativement le RC majoré. 1888 1889Le précompte immobilier s'ajoute comme charge. Plus vous possédez de biens, plus l'impact fiscal peut devenir significatif, notamment via la progressivité de l'IPP. 1890 1891Pour évaluer la rentabilité globale d'un investissement en tenant compte de la fiscalité, des charges et de la plus-value potentielle, utilisez notre [simulateur TRI](/simulateur-tri) (taux de rendement interne). 1892 1893## 7. Les pièges à éviter 1894 1895Acheter un bien immobilier en Belgique en 2026 nécessite de la vigilance. Voici les erreurs les plus fréquentes : 1896 1897**Sous-estimer le budget total.** Le prix d'achat n'est que le début. Ajoutez les frais d'acte (5 à 15 % selon la région et le statut), le budget de rénovation éventuel, les charges de copropriété (pour un appartement) et les frais de déménagement et d'aménagement. 1898 1899**Négliger le PEB.** Un bien classé E, F ou G peut nécessiter 30.000 à 80.000 ⬠de travaux d'isolation, de remplacement de chauffage et de châssis. Ce n'est pas qu'une question de confort ou de facture énergétique : **en Flandre, c'est une obligation légale**. La _renovatieverplichting_ impose à tout acheteur d'un bien classé E ou F de le rénover au minimum au **label D dans les 5 ans suivant l'acte authentique**, sous peine de sanctions. En Wallonie, si le calendrier est différent, la pression réglementaire sur la performance énergétique s'intensifie également avec l'objectif de neutralité carbone du parc immobilier à l'horizon 2050. Avant d'acheter un bien énergivore, chiffrez précisément le coût de mise en conformité â et intégrez-le dans votre budget total d'acquisition. 1900 1901**Ne pas vérifier la situation urbanistique.** Des travaux réalisés sans permis, un changement d'affectation non autorisé ou un plan d'aménagement contraignant peuvent transformer votre rêve en cauchemar juridique. 1902 1903**Acheter au-dessus du prix du marché.** Sans analyse comparative des prix dans le quartier, vous risquez de surpayer. Demandez une [analyse gratuite de votre bien](/free-analyse) pour avoir un point de repère objectif. 1904 1905**Oublier les charges de copropriété.** Pour un appartement, les charges communes (ascenseur, espaces verts, nettoyage, fonds de réserve) peuvent représenter 100 à 300 â¬/mois ou plus. Demandez les PV des dernières assemblées générales et les décomptes de charges. 1906 1907**Se fier uniquement au rendement brut.** Un rendement brut de 6 % peut se réduire à 2-3 % net après charges, impôts et vacance locative. Calculez toujours le rendement net. 1908 1909**Ignorer les frais récurrents.** Précompte immobilier, assurance incendie, entretien, provisions pour gros travaux : ces charges annuelles s'accumulent. 1910 1911## 8. Checklist avant d'acheter 1912 1913Avant de signer votre compromis de vente, passez en revue cette liste de vérifications essentielles. 1914
1915**Aspects financiers :** 1916 1917- Calculer votre capacité d'emprunt réelle (pas seulement le montant maximal théorique) 1918- Obtenir un accord de principe de la banque avant de faire une offre 1919- Prévoir un budget total incluant les frais d'acte, la rénovation et un fonds de sécurité 1920- Comparer au moins 3 offres de crédit hypothécaire (TAEG, pas seulement le taux nominal) 1921- Vérifier les conditions de l'assurance solde restant dû 1922- Anticiper le précompte immobilier annuel 1923 1924**Aspects juridiques et administratifs :** 1925 1926- Demander les informations urbanistiques complètes à la commune 1927- Vérifier l'absence d'infractions urbanistiques et de permis en cours 1928- Consulter le plan de secteur et les projets d'aménagement à proximité 1929- Vérifier les servitudes, les droits de préemption et les baux en cours 1930- Faire rédiger le compromis par un notaire (même si ce n'est pas obligatoire, c'est vivement recommandé) 1931 1932**Aspects techniques :** 1933 1934- Obtenir et analyser le certificat PEB et estimer le coût des travaux énergétiques nécessaires 1935- Faire inspecter la toiture, la charpente, les installations électriques et de chauffage 1936- Vérifier l'état des châssis, de l'isolation et de la ventilation 1937- Contrôler la présence éventuelle d'amiante (biens construits avant 2001), d'humidité et de mérule 1938- Pour un appartement, vérifier l'état du bâtiment dans son ensemble (façade, parties communes) 1939 1940**Aspects fiscaux :** 1941 1942- Vérifier votre éligibilité aux droits d'enregistrement réduits dans votre région 1943- Calculer l'impact fiscal de l'achat (précompte immobilier, déductibilité éventuelle) 1944- Pour un investissement, estimer la charge fiscale réelle (RC, IPP, charges déductibles) 1945- Anticiper les implications d'une éventuelle revente (plus-value taxable si revente dans les 5 ans pour les terrains) 1946 1947## FAQ â Questions fréquentes sur l'achat immobilier en Belgique 1948 1949### Combien faut-il d'apport personnel pour acheter un bien immobilier en Belgique en 2026 ? 1950 1951La plupart des banques exigent un apport personnel couvrant au minimum les frais d'acquisition, soit environ 10 à 15 % du prix du bien. Idéalement, ajoutez 10 à 20 % du prix pour constituer un dossier solide. Pour un bien à 300.000 â¬, prévoyez donc entre 50.000 et 90.000 ⬠de fonds propres au total (apport + frais). Plus votre apport est élevé, plus vous obtiendrez un taux d'intérêt favorable. 1952 1953### Comment calculer les frais de notaire pour un achat immobilier de 300.000 ⬠en Belgique ? 1954 1955Les « frais de notaire » comprennent en réalité les droits d'enregistrement (la part la plus importante), les honoraires du notaire, les frais administratifs et la TVA. Pour un bien à 300.000 ⬠en Wallonie (primo-accédant), comptez environ 19.000 â¬. En Flandre, environ 16.000 â¬. à Bruxelles (avec abattement), environ 22.700 â¬. Pour un investissement (taux plein), les frais montent à 43.000-45.000 â¬. Simulez vos frais exacts avec notre [simulateur de frais d'acte](/simulateur-frais-acte). 1956 1957### Est-il possible d'acheter un bien immobilier sans apport en Belgique ? 1958 1959C'est théoriquement possible â certaines banques financent jusqu'à 100 % du prix d'achat â mais très rare et réservé aux profils exceptionnels (hauts revenus stables, patrimoine existant en garantie). Même dans ce cas, vous devrez financer les frais d'acquisition sur fonds propres. Acheter sans aucun apport personnel est donc quasiment impossible en pratique. 1960 1961### Quelle est la différence entre les droits d'enregistrement et la TVA lors d'un achat immobilier en Belgique ? 1962 1963Les droits d'enregistrement s'appliquent à l'achat de biens immobiliers existants (seconde main). La TVA de 21 % s'applique à l'achat de biens neufs vendus par un assujetti à la TVA. Les deux ne se cumulent jamais sur le même bien : c'est soit l'un, soit l'autre. Dans le cas d'un achat sur plan avec un terrain séparé, le terrain peut être soumis aux droits d'enregistrement tandis que la construction est soumise à la TVA. 1964 1965### Combien de temps dure le processus d'achat d'un bien immobilier en Belgique ? 1966 1967Du début de vos recherches à la remise des clés, comptez généralement 6 à 12 mois. Les délais typiques sont : recherche du bien (variable), négociation et offre (1-2 semaines), compromis de vente (2-4 semaines après accord), obtention du crédit (4-6 semaines), et acte authentique (environ 4 mois après le compromis). Au total, du compromis à l'acte, comptez en moyenne 4 mois. 1968 1969### Le certificat PEB influence-t-il vraiment le prix de vente d'un bien en Belgique ? 1970 1971Absolument. Les données récentes montrent que les biens avec un mauvais score PEB (E, F, G) subissent une décote de 10 à 20 % par rapport aux biens performants (A, B). Cette tendance s'accentue avec le durcissement des réglementations énergétiques régionales. Un bien énergivore acheté « en dessous du marché » peut toutefois représenter une opportunité si vous planifiez une rénovation énergétique soutenue par les primes régionales. 1972 1973### Faut-il passer par un courtier en crédit pour obtenir le meilleur taux hypothécaire en Belgique ? 1974 1975Un courtier en crédit hypothécaire peut vous faire gagner du temps en comparant les offres de plusieurs banques pour vous. Il connaît les critères de chaque établissement et peut négocier des conditions avantageuses, notamment pour les profils atypiques (indépendants, revenus mixtes). Son service est généralement gratuit pour l'emprunteur, car il est rémunéré par la banque. Ce n'est pas indispensable, mais c'est souvent utile, surtout si vous manquez de temps ou d'expérience. 1976 1977### Quelles aides et primes existent pour les primo-accédants en Belgique en 2026 ? 1978 1979Les trois régions proposent des mécanismes distincts. En Wallonie, le taux rédu
1979it de 3 % (au lieu de 12,5 %) représente une économie considérable. En Flandre, le taux de 2 % est encore plus avantageux. à Bruxelles, l'abattement de 200.000 ⬠offre une économie de 25.000 â¬. Toutes ces aides sont conditionnées à l'occupation personnelle du bien comme résidence principale. Des primes à la rénovation énergétique sont disponibles dans les trois régions pour les travaux d'amélioration du PEB. 1980 1981### Est-ce le bon moment pour acheter un bien immobilier en Belgique en 2026 ? 1982 1983Il n'existe pas de « moment parfait » pour acheter un bien immobilier en Belgique. Les prix continuent de croître modérément (+3 à 4 % prévus en 2026), les taux sont stabilisés à des niveaux raisonnables et les réformes fiscales récentes rendent l'acquisition plus accessible pour les primo-accédants. Reporter son achat dans l'espoir d'une baisse des prix est un pari risqué : historiquement, les prix immobiliers belges n'ont connu que de brèves corrections. L'essentiel est d'acheter un bien adapté à votre budget et à vos besoins, avec une analyse rigoureuse des fondamentaux. 1984 1985--- 1986 1987_Ce guide a été rédigé par Arcanes à titre informatif et ne constitue pas un conseil financier, fiscal ou juridique personnalisé. Pour un accompagnement adapté à votre situation, consultez votre notaire, votre banquier ou un conseiller financier agréé. Tous les chiffres sont basés sur les données disponibles début 2026 et sont susceptibles d'évoluer._ 1988 1989_Envie d'aller plus loin ? Utilisez nos [simulateurs gratuits](/) pour affiner votre projet immobilier : frais d'acte, capacité d'emprunt, rendement locatif, PEB, prêt hypothécaire et TRI._ 1990`,zF=`--- 1991title: "Vastgoed kopen in België in 2026: de complete gids" 1992slug: "acheter-bien-immobilier-belgique-2026" 1993tag: "Financement" 1994readTime: 15 1995publishDate: "13 maart 2026" 1996updateDate: "24 augustus 2026" 1997author: "Arcanes" 1998excerpt: "Van het zoeken naar een woning tot de ondertekening bij de notaris: alle stappen, kosten, steunmaatregelen en valkuilen bij het kopen in België in 2026." 1999image: "/images/blog/acheter-belgique-2026.jpg" 2000imageVersion: "1" 2001imageAlt: "Luchtfoto van een Belgische stad bij zonsondergang" 2002--- 2003 2004# Vastgoed kopen in België in 2026: de complete gids 2005 2006Vastgoed kopen in België in 2026 is een van de belangrijkste â en meest complexe â beslissingen die u kunt nemen. Tussen de recente fiscale hervormingen, de evolutie van de hypotheekrente en de grote regionale prijsverschillen, is een grondige voorbereiding onmisbaar. Deze gids leidt u stap voor stap door het volledige aankoopproces: van de eerste overweging tot de sleuteloverdracht bij de notaris, inclusief financiering, kosten en valkuilen. 2007 2008Of u nu een eerste woning zoekt of uw vermogen wilt uitbreiden met een vastgoedinvestering, hier vindt u alle actuele informatie om een weloverwogen beslissing te nemen op de Belgische vastgoedmarkt. 2009 2010## 1. De Belgische vastgoedmarkt in 2026: stand van zaken 2011 2012**Bijgewerkt op 24 augustus 2026** â tarieven, verminderingen en btw-regels gecontroleerd (regionale hervormingen 2025-2026 verwerkt). _Bronnen: Statbel, FOD Financiën, gewestelijke wetgeving â zie onze [methodologie](/methodologie)._ 2013 2014### Prijsevolutie per regio 2015 2016De Belgische vastgoedmarkt kent in 2026 een gematigde prijsstijging. Volgens de Statbel-cijfers van het derde kwartaal 2025 bedraagt de mediaanprijs van een rijwoning of halfopen bebouwing **280.000 â¬** op nationaal niveau, terwijl een vrijstaande woning **390.000 â¬** kost. Appartementen worden verhandeld rond **255.000 â¬**. 2017 2018De regionale verschillen zijn echter aanzienlijk: 2019 2020**In Wallonië**, de meest betaalbare regio, kost een rijwoning mediaan **197.000 â¬** (een stijging van 6,5 % op jaarbasis) en een vrijstaande woning **330.000 â¬** (+8,2 %). De hervorming van de registratierechten sinds 1 januari 2025 â een daling van 12,5 % naar 3 % voor de enige eigen woning â heeft koopkracht vrijgemaakt en de vraag gestimuleerd. De verwachtingen voor 2026 wijzen op gemiddelde woningprijzen van 280.000 tot 285.000 â¬, een stijging van circa 4 %. 2021 2022**In Vlaanderen** bedraagt de mediaanprijs van een rijwoning **317.500 â¬** en van een vrijstaande woning **430.000 â¬**. Vlaams-Brabant blijft de duurste provincie met rijwoningen aan 370.500 â¬. De verwachte groei is beperkter, rond 3 à 3,5 % in 2026, waardoor de gemiddelde woningprijs richting 390.000 ⬠evolueert. 2023 2024**In Brussel** liggen de prijzen aanzienlijk hoger: **525.000 â¬** voor een rijwoning en tot **1.112.500 â¬** voor een vrijstaande woning. Appartementen bevinden zich rond **265.000 â¬**. De Brusselse markt, ondersteund door de aanwezigheid van Europese instellingen en een constante huurvraag, blijft relatief stabiel. 2025 2026Om de prijzen per gemeente te verkennen en de regionale verschillen in kaart te brengen, raadpleeg onze [interactieve prijskaart](/map). 2027 2028### Trends en vooruitzichten 2029 2030Verschillende factoren bepalen de markt in 2026. De **hypotheekrente** is gestabiliseerd na de opeenvolgende verlagingen van de ECB-beleidsrente (gedaald naar 2,00 % begin 2026, na een verlaging van 200 basispunten tussen juni 2024 en januari 2026). Vaste rentevoeten op 25 jaar schommelen tussen **2,9 % en 3,8 %** afhankelijk van het profiel, met de beste dossiers rond 3,2-3,4 %. 2031 2032Het **transactievolume** steeg met 15 % in de eerste negen maanden van 2025 ten opzichte van 2024, een dynamiek die zou moeten aanhouden. Het aanbod blijft echter beperkt, vooral in stedelijke centra, wat de prijzen ondersteunt. 2033 2034Tot slot wordt **energieprestatie** een centraal criterium. Woningen met een slecht EPC-label ondergaan een waardedaling van 10 tot 20 %, terwijl gerenoveerde of energiezuinige woningen snel verkocht worden tegen betere prijzen. 2035 2036## 2. Uw project bepalen: eigen woning of investering? 2037 2038Voordat u op zoek gaat naar een woning, moet u uw doel bepalen. De aard van uw project â eigen woning of beleggingsvastgoed â beïnvloedt uw fiscaliteit, financiering en selectiecriteria. 2039 2040### Enige eigen woning 2041 2042Als u koopt om er zelf te wonen, profiteert u van aanzienlijke fiscale voordelen: verlaagde registratierechten in Wallonië (3 %) en Vlaanderen (2 %), of een abattement van 200.000 ⬠in Brussel. Uw criteria zullen meer gericht zijn op de ligging ten opzichte van uw werk, de levenskwaliteit van de buurt, scholen, openbaar vervoer en het potentieel voor meerwaarde op lange termijn. 2043 2044### Vastgoedinvestering 2045 2046Vastgoedbelegging in België biedt bruto huurrendementen van 3 tot 6 % afhankelijk van de regio, met een sterke huurvraag in universiteitssteden en stedelijke centra. Maar opgelet: het brutorendement vertelt niet het hele verhaal. U moet de kosten aftrekken (onroerende voorheffing, verzekeringen, onderhoud, beheer), de leegstand en eventuele werkzaamheden. Om uw werkelijk nettorendement te berekenen, gebruikt u onze [huurrendementsimulator](/simulateur-rendement-locatif). Lees ook ons gedetailleerd artikel over [de waarheid achter de cijfers van huurrendement in België](/blog/rendement-locatif-verite-chiffres-belgique). 2047 2048Voordat u arbitrageert, moet u de opportuniteitskosten berekenen: [wat dezelfde spaarinspanning opgebracht zou hebben op de beurs](/blog/immobilier-ou-bourse-belgique). 2049 2050### Opbrengsteigendom 2051 2052Als bijzonder geval van investering maakt een opbrengsteigendom (meerdere huurunits in één gebouw) het mogelijk om leegstandsrisico's te spreiden en beheerskosten te optimaliseren. Het vereist echter een groter aankoopbudget, een grondige financiële analyse per unit en bijzondere aandac
2052ht voor de stedenbouwkundige regelgeving (opdeling, EPC-normen per unit). 2053 2054## 3. Uw financiële capaciteit evalueren 2055 2056### Hoe banken uw leencapaciteit berekenen 2057 2058In België passen banken voornamelijk de **eenderde-regel** toe: uw maandelijkse aflossingen mogen niet meer bedragen dan een derde van uw netto-inkomen. Sommige instellingen voeren ook een **stresstest** uit, waarbij een renteverhoging wordt gesimuleerd om te controleren of u de aflossingen ook in een ongunstig scenario kunt dragen. 2059 2060Andere criteria spelen mee: de stabiliteit van uw inkomen (vast contract vs. zelfstandige), uw anciënniteit, andere lopende schulden en uw resterend budget na betaling van alle lasten. 2061 2062Voor een snelle inschatting van uw maximale budget, gebruik onze [leencapaciteitsimulator](/simulateur-emprunt). 2063 2064### Eigen inbreng 2065 2066De Nationale Bank van België adviseert banken om minimaal een eigen inbreng te vragen die de aankoopkosten dekt (circa 10 à 15 % van de prijs), plus idealiter 10 tot 20 % van de woningprijs zelf. Concreet: voor een woning van 300.000 ⬠moet u rekenen op **30.000 tot 60.000 ⬠eigen middelen** voor de woning, plus **25.000 tot 40.000 ⬠aan kosten** afhankelijk van de regio. 2067 2068Sommige banken financieren tot 100 % van de aankoopprijs (exclusief kosten) voor de sterkste profielen, maar dergelijke hoge quotiteiten worden zeldzamer en gaan gepaard met minder gunstige rentevoeten. 2069 2070### Hypotheekrente in 2026 2071 2072Begin 2026 liggen de vaste rentevoeten op 25 jaar tussen **2,9 % en 3,8 %**. De beste profielen (hoog stabiel inkomen, aanzienlijke eigen inbreng, vast contract) krijgen rentevoeten rond 3,2-3,4 %. Variabele rentes, minder gebruikelijk in België, bieden een licht initieel voordeel maar houden een risico op toekomstige stijgingen in. 2073 2074De verwachting is stabiliteit, met gematigde schommelingen afhankelijk van het monetaire beleid van de ECB en de inflatie-evolutie. 2075 2076### Impact van de looptijd 2077 2078De looptijd van uw lening beïnvloedt uw maandelijkse aflossing en de totale kosten aanzienlijk. Over 20 jaar kost een lening van 250.000 ⬠aan 3,3 % ongeveer 1.425 â¬/maand met een totale interestkost van 92.000 â¬. Over 25 jaar daalt de maandlast naar 1.220 â¬, maar stijgt de totale interestkost naar circa 116.000 â¬. Om verschillende scenario's te simuleren, gebruik onze [hypotheeksimulator](/simulateur-pret). 2079 2080## 4. De aankoopkosten: alles in detail 2081 2082Een van de meest voorkomende verrassingen voor eerste kopers in België is de omvang van de bijkomende kosten bovenop de aankoopprijs. Hier volgt een volledig overzicht voor 2026. 2083 2084### 4.1 Registratierechten per regio 2085 2086Registratierechten vormen de grootste kostenpost. Sinds de hervormingen van 2025 hanteren de drie gewesten sterk uiteenlopende regelingen. 2087 2088| Gewest | Eigen & enige woning | Andere aankoop (investering, 2e verblijf) | Bijzonderheden | 2089| -------------- | ------------------------------------------------------- | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | 2090| **Wallonië** | **3 %** | 12,5 % | Domiciliëring binnen 3 jaar, behoud 3 jaar ; woonchèque afgeschaft | 2091| **Vlaanderen** | **2 %** | 12 % | Vermindering van 1.867 ⬠bij prijs ⤠220.000 ⬠; gesplitste aankopen sinds 2026 uitgesloten van het verlaagd tarief | 2092| **Brussel** | 12,5 % met **abattement 200.000 â¬** (prijs ⤠600.000 â¬) | 12,5 % | +25.000 ⬠abattement per sprong van 2 EPC-klassen ; behoud 5 jaar | 2093 2094**Wallonië (sinds 1 januari 2025)**: het tarief daalde van 12,5 % naar **3 %** voor de aankoop van een enige eigen woning. Voorwaarden: het goed moet uw hoofdverblijfplaats worden binnen 3 jaar (5 jaar voor nieuwbouw), u mag geen ander residentieel vastgoed in volle eigendom bezitten, en u moet er minstens 3 jaar gedomicilieerd blijven. Bezit u al een ander goed, dan kunt u het binnen 3 jaar verkopen om alsnog van het verlaagde tarief te genieten. Voor alle andere aankopen (investering, tweede verblijf) blijft het tarief **12,5 %
2094**. Let op: deze hervorming ging gepaard met de afschaffing van de wooncheque en het vroegere abattement van 5.000 â¬. 2095 2096**Vlaanderen (sinds 1 januari 2025)**: het tarief daalde van 3 % naar **2 %** voor de enige eigen woning. De voorwaarden zijn vergelijkbaar: domiciliëring binnen 3 jaar, verkoop van andere eigendommen binnen 2 jaar indien van toepassing. Het tarief bedraagt **12 %** voor investeringen en tweede verblijven. Een bijkomende vermindering van 1.867 ⬠geldt voor bescheiden woningen met een prijs tot 220.000 ⬠(of 240.000 ⬠in bepaalde gemeenten). Opmerking: het bijzondere tarief van 1 % voor ingrijpende energetische renovaties werd afgeschaft op 1 januari 2025. Sinds 1 januari 2026 gelden strengere voorwaarden voor het behoud van domiciliëring. 2097 2098**Brussel**: het tarief blijft **12,5 %**, het hoogste in het land. Er geldt echter een abattement op de eerste **200.000 â¬** van de aankoopprijs voor de eigen woning, op voorwaarde dat de prijs niet meer dan 600.000 ⬠bedraagt. Dit levert een maximale besparing van **25.000 â¬** op. Een bijkomend abattement van 25.000 ⬠per EPC-sprong is mogelijk als u de energieprestatie van het goed met minstens twee klassen verbetert binnen 5 jaar. Voorwaarden: natuurlijk persoon, volle eigendom, domiciliëring binnen 3 jaar, behoud gedurende 5 jaar. 2099 2100**Vergelijkende tabel â Woning van 300.000 ⬠(enige eigen woning, eerste koper):** 2101 2102| | Wallonië | Vlaanderen | Brussel | 2103| --------------------------- | -------- | ---------- | ----------------------------- | 2104| Tarief / mechanisme | 3 % | 2 % | 12,5 % â abattement 200.000 ⬠| 2105| Registratierechten | 9.000 ⬠| 6.000 ⬠| 12.500 ⬠| 2106| Besparing t.o.v. vol tarief | 28.500 ⬠| 30.000 ⬠| 25.000 ⬠| 2107 2108### 4.2 Notariskosten 2109 2110De erelonen van de notaris zijn wettelijk vastgelegd en volgen een **degressief barema** dat in heel het land identiek is. Voor een woning van 300.000 ⬠rekent u op ongeveer **3.500 tot 4.000 â¬** aan erelonen, plus btw (21 % op de erelonen), administratieve opzoekingskosten (stedenbouw, hypotheken, kadaster, voor circa 1.000 tot 1.500 â¬) en de kosten van de hypothecaire akte. 2111 2112Alles samen vertegenwoordigen de notariskosten in brede zin (erelonen + administratie + btw) doorgaans **1,5 % tot 2 %** van de woningprijs voor gangbare prijsklassen. Voor de details raadpleeg onze [complete gids over aankoopkosten in België](/blog/frais-acte-achat-immobilier-belgique-estimation-guide). 2113 2114### 4.3 Btw versus registratierechten (nieuwbouw) 2115 2116De aankoop van een nieuw goed is onderworpen aan **21 % btw** op het bouwgedeelte (de grond blijft onderworpen aan registratierechten). Een goed wordt fiscaal als "nieuw" beschouwd als het wordt verkocht door een btw-plichtige vóór 31 december van het tweede jaar na de eerste ingebruikname. 2117 2118Er bestaat een regime van **6 % btw** voor afbraak en heropbouw, maar de regels zijn ingrijpend gewijzigd sinds 1 januari 2024. De vroegere maatregel, die promotoren toeliet om nieuwbouwprojecten aan 6 % te verkopen in de 32 kernsteden, is afgelopen (de overgangsperiode eindigde eind 2024). **Voortaan is de btw van 6 % uitsluitend voorbehouden aan particulieren** (bouwheren) die hun **enige eigen woning** afbreken en heropbouwen, op het volledige Belgische grondgebied, op voorwaarde dat de bewoonbare oppervlakte niet meer dan **200 m²** bedraagt. Koopt u een nieuwbouwappartement bij een promotor, dan betaalt u in vrijwel alle gevallen 21 % btw. Informeer u bij uw notaris of uw persoonlijk project in aanmerking komt voor het verlaagde tarief. 2119 2120Om uw aankoopkosten nauwkeurig te berekenen, gebruik onze [simulator aankoopkosten](/simulateur-frais-acte). 2121 2122### 4.4 Volledig cijfervoorbeeld 2123 2124Neem een woning van **300.000 â¬**, gekocht door een eerste koper (enige eigen woning): 2125 2126**In Wallonië:** 2127 2128- Registratierechten: 300.000 à 3 % = **9.000 â¬** 2129- Notarisereloon + btw: circa **4.500 â¬** 2130- Administratieve kosten en opzoekingen: circa **1.200 â¬** 2131- Kosten hypothecaire akte: circa **4.500 â¬** 2132- **Totaal kosten: â 19.200 â¬** (6,4 % van de prijs) 2133 2134**In Vlaanderen:** 2135 2136- Registratierechten: 300.000 à 2 % = **6.000 â¬** 2137- Notariskosten: circa **5.700 â¬** 2138- Hypothecaire akte: circa **4.500 â¬** 2139- **Totaal kosten: â 16.200 â¬** (5,4 % van de prijs) 2140 2141**In Brussel:** 2142 2143- Registratierechten: (300.000 â 200.000) à 12,5 % = **12.500 â¬** 2144- Notariskosten: circa **5.700 â¬** 2145- Hypothecaire akte: circa **4.500 â¬** 2146- **Totaal kosten: â 22.700 â¬** (7,6 % van de prijs) 2147 2148Deze bedragen zijn indicatief en variëren naargelang het kredietbedrag, de quotiteit en andere parameters specifiek voor uw situatie. 2149 2150## 5. De aankoopstappen: een praktisch stappenplan 2151 2152### 5.1 Het zoeken naar een woning 2153 2154Begin met het vastleggen van uw criteria (budget, ligging, oppervlakte, type woning, minimum EPC) en volg de belangrijkste vastgoedportalen: **Immoweb**, **Immovlan** en **Zimmo**. Vergeet ook **Biddit** (biddit.be) niet, het online platform voor openbare verkopen van de Belgische notarissen: u vindt er regelmatig te renoveren woningen die op een transparante manier verkoc
2154ht worden, soms onder de marktprijs. Vul aan met de websites van lokale makelaars en mond-tot-mondreclame. 2155 2156Controleer bij elk bezoek systematisch: 2157 2158- Het **EPC-certificaat**: een energieverslindende woning (label E, F of G) kan tienduizenden euro's aan renovatiekosten vergen en zal een prijsdaling ondergaan bij herverkoop. Om de impact van het EPC op de waarde te begrijpen, raadpleeg onze [EPC-simulator](/simulateur-peb) en ons artikel [Het EPC begrijpen in België](/blog/comprendre-peb-belgique). 2159- De **stedenbouwkundige situatie**: vraag de stedenbouwkundige inlichtingen op bij de gemeente. Controleer of er geen overtredingen zijn, of uitgevoerde werken vergund waren en of het goed niet getroffen is door een onteigeningsplan. 2160- De **milieurisico's**: overstromingszones (raadpleeg het geoportaal van uw regio), bodemverontreiniging, geluidsoverlast. 2161- De **bouwkundige staat**: dak, gevel, elektriciteit en verwarming, vocht, asbest (woningen gebouwd vóór 2001). 2162 2163### 5.2 Het bod en de verkoopovereenkomst 2164 2165Wanneer u een woning gevonden heeft, brengt u een **schriftelijk bod** uit. Dit is juridisch bindend zodra het door de verkoper wordt aanvaard. U kunt **opschortende voorwaarden** opnemen, met name het verkrijgen van een hypothecair krediet binnen een bepaalde termijn (doorgaans 4 tot 6 weken). 2166 2167De **verkoopovereenkomst** (compromis) wordt vervolgens door beide partijen ondertekend, meestal bij de notaris of het makelaarskantoor. Dit document legt de definitieve verkoopvoorwaarden vast: prijs, voorwaarden, termijnen, identiteit van de partijen, stedenbouwkundige situatie en bekende lasten. U betaalt een **voorschot van 10 %** van de prijs bij de ondertekening, gestort op de derdenrekening van de notaris. **Goed om te weten: dit percentage van 10 % is een gebruik, geen wettelijke verplichting.** Niets in de Belgische wet legt het bedrag van het voorschot vast. Als 10 % bovenop de notariskosten bijeenbrengen u in moeilijkheden brengt, kunt u perfect een voorschot van **5 %** onderhandelen, of zelfs een forfaitair bedrag (bijvoorbeeld 10.000 â¬). Steeds meer verkopers gaan hiermee akkoord, zeker als uw bankdossier sterk is. Bespreek dit vanaf het begin van de onderhandelingen met uw notaris. 2168 2169De meest voorkomende opschortende voorwaarden zijn: het verkrijgen van bankfinanciering, stedenbouwkundige conformiteit en de afwezigheid van een voorkooprecht door een overheidsinstantie. 2170 2171### 5.3 De financiering 2172 2173Na de ondertekening van het compromis beschikt u doorgaans over de in de opschortende voorwaarde voorziene termijn om uw krediet te verkrijgen. Stel uw **bankdossier** samen: loonfiches of aanslagbiljetten (zelfstandigen), rekeninguittreksels, bewijs van eigen inbreng, schatting van het goed, ondertekend compromis. 2174 2175Vergelijk de offertes van meerdere banken en focus op het **JKP** (jaarlijks kostenpercentage), dat niet alleen de nominale rente omvat maar ook de dossierkosten en andere kosten. Onderschat de **schuldsaldoverzekering** niet: hoewel deze wettelijk niet verplicht is, eisen banken ze bijna altijd. Vergelijk ook de verzekeringspremies, want de verschillen tussen verzekeraars kunnen aanzienlijk zijn. 2176 2177### 5.4 De authentieke akte bij de notaris 2178 2179De authentieke akte wordt bij de notaris ondertekend, in principe binnen **4 maanden** na het compromis. De notaris leest de volledige akte voor, verifieert of alle voorwaarden vervuld zijn en gaat over tot de registratie. U betaalt het saldo van de prijs en alle kosten op dat moment (de bank stort de geleende gelden rechtstreeks aan de notaris). 2180 2181Na de ondertekening zorgt de notaris voor de **hypothecaire inschrijving** bij het hypotheekkantoor en de **overschrijving** van de verkoop. De sleutels worden overhandigd: u bent officieel eigenaar. 2182 2183## 6. Fiscaliteit en steunmaatregelen in 2026 2184 2185### 6.1 Regionale steun bij aankoop 2186 2187**Wallonië**: de voornaamste steunmaatregel is het verlaagde tarief van 3 % registratierechten voor de enige eigen woning. De vroegere instrumenten (wooncheque, abattement van 5.000 â¬, verlaagd tarief van 6 % voor bescheiden woningen) werden afgeschaft en vervangen door dit uniforme tarief. Premies voor energetische renovatie blijven beschikbaar om de EPC-prestatie van uw woning te verbeteren. 2188 2189**Brussel**: naast het abattement van 200.000 ⬠biedt het gewest energiepremies (Renolution) voor de financiering van energetische renovatiewerken. Een bijkomend abattement van 25.000 ⬠per EPC-sprong (minimum 2 klassen verbetering) moedigt de aankoop van energieverslindende woningen aan die gerenoveerd worden. 2190 2191**Vlaanderen**: het verlaagde tarief van 2 % vormt de belangrijkste steunmaatregel. De woonbonus werd afgeschaft voor nieuwe kredieten sinds 2020, maar een bijkomende vermindering van 1.867 ⬠geldt voor bescheiden w
2191oningen. Renovatiepremies zijn beschikbaar via het programma MijnVerbouwPremie. 2192 2193### 6.2 Onroerende voorheffing 2194 2195De onroerende voorheffing is een jaarlijkse belasting berekend op basis van het **kadastraal inkomen (KI)** van uw goed, geïndexeerd en vervolgens vermenigvuldigd met een tarief dat drie niveaus combineert: gewestelijk, provinciaal en gemeentelijk. De formule is: **KI à indexeringscoëfficiënt à globaal tarief**. De indexeringscoëfficiënt voor 2025 bedraagt 2,2446 (een stijging van 3,14 % ten opzichte van 2024). 2196 2197Het bedrag verschilt aanzienlijk van gemeente tot gemeente door de verschillende gemeentelijke opcentiemen. Voor eenzelfde KI van 1.000 ⬠kan uw voorheffing variëren van 600 ⬠tot meer dan 1.500 ⬠afhankelijk van de gemeente. 2198 2199Een vermindering voor bescheiden woning kan van toepassing zijn als uw KI een bepaald plafond niet overschrijdt (variabel per gewest). 2200 2201### 6.3 Fiscaliteit van vastgoedinvestering 2202 2203In België worden huurinkomsten uit residentieel vastgoed niet belast op de werkelijke huurprijs, maar op basis van het **geïndexeerde kadastraal inkomen verhoogd met 40 %**, opgenomen in uw aangifte personenbelasting. Dit systeem is voordelig wanneer de werkelijke huur aanzienlijk hoger ligt dan het verhoogde KI. 2204 2205De onroerende voorheffing komt als last bovenop. Hoe meer eigendommen u bezit, hoe groter de fiscale impact kan worden, met name door de progressiviteit van de personenbelasting. 2206 2207Om de globale rentabiliteit van een investering te beoordelen, rekening houdend met fiscaliteit, kosten en potentiële meerwaarde, gebruik onze [IRR-simulator](/simulateur-tri) (interne rentevoet). 2208 2209## 7. Valkuilen om te vermijden 2210 2211Vastgoed kopen in België in 2026 vereist waakzaamheid. Dit zijn de meest voorkomende fouten: 2212 2213**Het totale budget onderschatten.** De aankoopprijs is slechts het begin. Voeg daar de aankoopkosten (5 tot 15 % naargelang regio en statuut), het eventuele renovatiebudget, de gemeenschappelijke lasten (bij appartementen) en de verhuis- en inrichtingskosten bij. 2214 2215**Het EPC verwaarlozen.** Een woning met label E, F of G kan 30.000 tot 80.000 ⬠aan isolatie-, verwarmings- en schrijnwerkkosten vergen. Dit is niet louter een kwestie van comfort of energiefactuur: **in Vlaanderen is het een wettelijke verplichting**. De _renovatieverplichting_ verplicht elke koper van een woning met label E of F om deze binnen **5 jaar na de authentieke akte** te renoveren tot minstens **label D**, op straffe van sancties. In Wallonië is het tijdspad anders, maar de regelgevende druk op energieprestatie neemt eveneens toe met de doelstelling van koolstofneutraliteit van het woningenpark tegen 2050. Vóór u een energieverslindende woning koopt, moet u de kosten voor conformiteit nauwkeurig becijferen â en deze opnemen in uw totale aankoopbudget. 2216 2217**De stedenbouwkundige situatie niet controleren.** Werken zonder vergunning, een niet-vergunde bestemmingswijziging of een beperkend ruimtelijk uitvoeringsplan kunnen uw droom in een juridische nachtmerrie veranderen. 2218 2219**Boven de marktprijs kopen.** Zonder vergelijkende analyse van de prijzen in de buurt loopt u het risico te veel te betalen. Vraag een [gratis analyse van uw woning](/free-analyse) aan voor een objectief referentiepunt. 2220 2221**De gemeenschappelijke lasten vergeten.** Bij een appartement kunnen de gemeenschappelijke kosten (lift, groenaanleg, schoonmaak, reservefonds) 100 tot 300 â¬/maand of meer bedragen. Vraag de notulen van de laatste algemene vergaderingen en de kostenafrekeningen op. 2222 2223**Alleen op het brutorendement afgaan.** Een brutorendement van 6 % kan na aftrek van kosten, belastingen en leegstand dalen tot 2-3 % netto. Bereken altijd het nettorendement. 2224 2225**De terugkerende kosten negeren.** Onroerende voorheffing, brandverzekering, onderhoud, voorzieningen voor grote herstellingen: deze jaarlijkse kosten stapelen zich op. 2226 2227## 8. Checklist vóór de aankoop 2228 2229Voordat u uw verkoopovereenkomst ondertekent, loop deze lijst van essentiële controles door. 2230 2231**Financiële aspecten:** 2232 2233- Uw werkelijke leencapaciteit berekenen (niet alleen het theoretische maximumbedrag) 2234- Een principieel akkoord van de bank verkrijgen vóór u een bod uitbrengt 2235- Een totaalbudget voorzien inclusief aankoopkosten, renovatie en een veiligheidsreserve 2236- Minstens 3 kredietoffertes vergelijken (JKP, niet alleen de nominale rente) 2237- De voorwaarden van de schuldsaldoverzekering controleren 2238- De jaarlijkse onroerende voorheffing inschatten 2239 2240**Juridische en administratieve aspecten:** 2241 2242- De volledige stedenbouwkundige inlichtingen bij de gemeente opvragen 2243- Het ontbreken van stedenbouwkundige overtredingen en lopende vergunningen verifiëren 2244- Het gewestplan en nabijgelegen ontwikkelingsprojecten raadplegen 2245- Erfdienstbaarheden, voorkooprechten en lopende huurcontracten controleren 2246- De verkoopovereenkomst door een notaris laten opstellen (hoewel niet verplicht, sterk aanbevolen) 2247 2248**Technische aspecten:** 2249 2250- Het EPC-certificaat verkrijgen en analyseren, en de kosten van noodzakelijke energiewerken inschatten
2251- Het dak, de dakstructuur, de elektrische en verwarmingsinstallatie laten inspecteren 2252- De staat van schrijnwerk, isolatie en ventilatie controleren 2253- De eventuele aanwezigheid van asbest (woningen gebouwd vóór 2001), vocht en huiszwam nagaan 2254- Bij een appartement de staat van het gebouw in zijn geheel verifiëren (gevel, gemeenschappelijke delen) 2255 2256**Fiscale aspecten:** 2257 2258- Uw recht op verlaagde registratierechten in uw regio verifiëren 2259- De fiscale impact van de aankoop berekenen (onroerende voorheffing, eventuele aftrekbaarheid) 2260- Bij een investering de werkelijke fiscale last inschatten (KI, personenbelasting, aftrekbare kosten) 2261- De gevolgen van een eventuele herverkoop anticiperen (belastbare meerwaarde bij verkoop van gronden binnen 5 jaar) 2262 2263## FAQ â Veelgestelde vragen over vastgoed kopen in België 2264 2265### Hoeveel eigen inbreng heb ik nodig om in België te kopen? 2266 2267De meeste banken vereisen een eigen inbreng die minstens de aankoopkosten dekt, namelijk circa 10 tot 15 % van de woningprijs. Idealiter voegt u daar 10 tot 20 % van de prijs aan toe voor een sterk dossier. Voor een woning van 300.000 ⬠rekent u dus op 50.000 tot 90.000 ⬠aan eigen middelen (inbreng + kosten). Hoe hoger uw eigen inbreng, hoe gunstiger de rentevoet die u kunt bedingen. 2268 2269### Hoeveel bedragen de notariskosten voor een aankoop van 300.000 â¬? 2270 2271De "notariskosten" omvatten in werkelijkheid de registratierechten (het grootste deel), de erelonen van de notaris, de administratieve kosten en de btw. Voor een woning van 300.000 ⬠in Wallonië (eerste koper) rekent u op circa 19.000 â¬. In Vlaanderen circa 16.000 â¬. In Brussel (met abattement) circa 22.700 â¬. Voor een investering (vol tarief) stijgen de kosten naar 43.000-45.000 â¬. Simuleer uw exacte kosten met onze [simulator aankoopkosten](/simulateur-frais-acte). 2272 2273### Kan ik kopen zonder eigen inbreng in België? 2274 2275Dat is theoretisch mogelijk â sommige banken financieren tot 100 % van de aankoopprijs â maar zeer zeldzaam en voorbehouden voor uitzonderlijke profielen (hoog stabiel inkomen, bestaand vermogen als waarborg). Zelfs in dat geval moet u de aankoopkosten met eigen middelen financieren. Kopen zonder enige eigen inbreng is dus in de praktijk nagenoeg onmogelijk. 2276 2277### Wat is het verschil tussen registratierechten en btw? 2278 2279Registratierechten zijn van toepassing op de aankoop van bestaand vastgoed (tweedehands). Btw van 21 % is van toepassing op de aankoop van nieuw vastgoed verkocht door een btw-plichtige. Beide worden nooit gecumuleerd op hetzelfde goed: het is het een of het ander. Bij een aankoop op plan met een apart perceel kan de grond onderworpen zijn aan registratierechten terwijl de constructie onder het btw-regime valt. 2280 2281### Hoelang duurt het aankoopproces? 2282 2283Van het begin van uw zoektocht tot de sleuteloverdracht rekent u doorgaans op 6 tot 12 maanden. De typische termijnen zijn: zoektocht (variabel), onderhandeling en bod (1-2 weken), verkoopovereenkomst (2-4 weken na akkoord), kredietverlening (4-6 weken), en authentieke akte (circa 4 maanden na het compromis). Van compromis tot akte duurt het gemiddeld 4 maanden. 2284 2285### Beïnvloedt het EPC de verkoopprijs? 2286 2287Absoluut. Recente gegevens tonen aan dat woningen met een slecht EPC-label (E, F, G) een waardedaling van 10 tot 20 % ondergaan ten opzichte van energiezuinige woningen (A, B). Deze trend versterkt naarmate de gewestelijke energieregelgevingen strenger worden. Een energieverslindende woning die "onder de marktprijs" gekocht wordt, kan echter een kans zijn als u een energetische renovatie plant, ondersteund door de gewestelijke premies. 2288 2289### Heb ik een kredietmakelaar nodig voor een goede rentevoet? 2290 2291Een hypothecaire kredietmakelaar kan u tijd besparen door de aanbiedingen van meerdere banken voor u te vergelijken. Hij kent de criteria van elke instelling en kan gunstige voorwaarden onderhandelen, vooral voor atypische profielen (zelfstandigen, gemengde inkomsten). Zijn dienstverlening is doorgaans gratis voor de ontlener, aangezien hij vergoed wordt door de bank. Het is niet onmisbaar, maar vaak nuttig, vooral als u weinig tijd of ervaring heeft. 2292 2293### Welke steunmaatregelen bestaan er voor eerste kopers in 2026? 2294 2295De drie gewesten bieden uiteenlopende mechanismen. In Wallonië vertegenwoordigt het verlaagde tarief van 3 % (in plaats van 12,5 %) een aanzienlijke besparing. In Vlaanderen is het tarief van 2 % nog voordeliger. In Brussel biedt het abattement van 200.000 ⬠een besparing van 25.000 â¬. Al deze steunmaatregelen zijn gekoppeld aan de voorwaarde dat u het goed zelf bewoont als hoofdverblijfplaats. In alle drie de gewesten zijn er premies beschikbaar voor energetische renovatiewerken ter verbetering van het EPC. 2296 2297### Is 2026 het juiste moment om te kopen? 2298 2299Er bestaat geen "perfect moment" om vastgoed te kopen in België. De prijzen blijven gematigd stijgen (+3 tot 4 % verwacht in 2026), de rentevoeten z
2299ijn gestabiliseerd op een redelijk niveau en de recente fiscale hervormingen maken de aankoop toegankelijker voor eerste kopers. Uw aankoop uitstellen in de hoop op een prijsdaling is een riskante gok: historisch gezien heeft de Belgische vastgoedmarkt slechts korte correcties gekend. Het essentiële is een woning kopen die past bij uw budget en behoeften, met een grondige analyse van de fundamenten. 2300 2301--- 2302 2303_Deze gids werd opgesteld door Arcanes ter informatie en vormt geen gepersonaliseerd financieel, fiscaal of juridisch advies. Raadpleeg voor een begeleiding op maat uw notaris, bankier of een erkend financieel adviseur. Alle cijfers zijn gebaseerd op de beschikbare gegevens begin 2026 en kunnen evolueren._ 2304 2305_Wilt u verder gaan? Gebruik onze [gratis simulatoren](/) om uw vastgoedproject te verfijnen: aankoopkosten, leencapaciteit, huurrendement, EPC, hypothecaire lening en IRR._ 2306`,IF=`--- 2307title: "Analyze a real estate ad in 5 minutes: the professional method" 2308slug: "analyse-annonce-immobiliere-5-minutes" 2309tag: "Investment"" 2310readTime: "10" 2311publishDate: "January 20, 2026" 2312author: "Arcanes Team" 2313excerpt: "A professional method to evaluate a real estate ad in 5 minutes. Price/sqm, EPC, location, potential: the criteria that really matter." 2314image: "/images/blog/analyse-annonce.jpg" 2315--- 2316 2317# Analyze a real estate ad in 5 minutes: the professional method 2318 2319In Belgium, a property listed on Immoweb or Zimmo receives its first viewing requests in under twenty-four hours. In high-demand areasâBrussels, Walloon Brabant, Flanders city centersâcorrectly priced properties find a buyer in a few weeks. For an investor, reaction speed is a real competitive advantage. But it is only valuable if it is based on rigorous analysis. 2320 2321The classic trap is known to all industry professionals: an investor visits fifteen properties, shortlists three, and discovers after an expert assessment that two of them have structural issues invisible to the naked eye. The time wasted on useless viewings is one of the most underestimated hidden costs of real estate investing. 2322 2323The goal of this method is not to finalize a purchase in five minutes. It is to determine whether the property deserves a viewing or should be discarded. This distinctionâto visit or to passâis what separates an effective investor from an impulsive buyer. 2324 2325--- 2326 2327## Structural overview 2328 2329Analyzing an ad is a filtering exercise, not a decision-making one. The price per square meter only makes sense when placed in the context of the micro-neighborhood. Commercial descriptions contain weak signals that reveal risks the seller prefers to hide. The EPC (Energy Performance Certificate), year of construction, and occupancy status directly dictate actual profitability. By structuring their reading according to a reproducible method, an investor eliminates more than they selectâwhich is precisely the mark of a mature approach. 2330 2331--- 2332 2333## 1. Minute 1: Identify fundamental data 2334 2335The first step is to extract the raw data used to build an economic profile of the property. The asking price, the actual living area, and the precise locationânot just the municipality, but the street and micro-neighborhoodâform the foundation. 2336 2337To these three pillars are added pieces of information that Belgian ads are legally required to provide: the EPC certificate and the heating method. The year of construction, co-ownership charges, and occupancy status complete the picture. A property rented with an ongoing lease is not valued in the same way as a vacant property: the legal constraints of a primary residence lease in Belgium directly affect its valuation. 2338 2339A common mistake is glossing over missing data too quickly. An ad that omits the exact surface area or the EPC sends a clear signal: either the agent is avoiding a weak point, or the seller has not had the mandatory diagnostics carried out. In both cases, it's a red flag. 2340 2341--- 2342 2343## 2. Minute 2: Check the price per square meter 2344 2345The price per square meter is the most widely used and most misunderstood indicator in the Belgian real estate market. It provides an orientation, never a conclusion. An apartment at â¬3,200/sqm in Ixelles is in no way comparable to a property at the same price in Charleroi. 2346 2347The calculation is simple: asking price divided by living area. The interpretation requires more nuance. Benchmark statistics are published quarterly by the Federation of Notaries (notaire.be), which aggregates data from authentic deeds by municipality. These figures constitute the most reliable point of comparison because they reflect prices actually paid, not asking prices. 2348 2349Once calculated, the price per square meter must be adjusted. A favorable EPC (A or B) justifies a premium of 5 to 15% compared to the neighborhood median. Conversely, an E or F EPC implies an energy renovation budget that must be factored
2349into the total cost. A property rented below the rental median is generally negotiated with a 5 to 10% discount. 2350 2351A price above the market average is not necessarily disqualifying: it can be justified by a recent renovation, an exceptional micro-location, or rare features like a city-center garden. 2352 2353--- 2354 2355## 3. Minute 3: Detect weak signals 2356 2357Descriptions written by real estate agents are an exercise in commercial communication, not a technical report. In Belgium, an agent has an obligation not to mislead the buyer, but no obligation to disclose everything. The most useful information hides between what is written and what is not. 2358 2359Vocabulary is a primary indicator. "Charming" often means small and old. "Full of potential" announces major work. "To refresh" is a euphemism for a heavy renovation that the seller does not want to price publicly. 2360 2361Omissions are even more revealing. An ad without an exact surface area, without bathroom photos, or without mentioning technical installations points to issues the seller prefers to address during the viewing, once the emotional appeal of the place has done its work. 2362 2363Analyzing the photos demands the same rigor. Images that consistently highlight the furniture or home staging rather than the structureâwalls, floors, window frames, roofâindicate a compensation strategy. Conversely, raw, well-lit photos showing the property in its actual state are a sign of a confident seller. 2364 2365--- 2366 2367## 4. Minute 4: Read the ad like a technician 2368 2369The fourth minute is when the investor shifts their posture. They no longer read as a buyer, but as a technician evaluating an asset. The goal: identify probable expense items post-acquisition. 2370 2371Windows are one of the most reliable indicators. Single-glazed wooden frames on a 1970s building signal a mandatory replacementâbetween â¬500 and â¬1,000 per square meter of window opening in Belgium. PVC double-glazed windows in good condition suggest a recent intervention. 2372 2373The type of heating is a second marker. Heating oil boilers (mazout), still very common in Wallonia, forecast a replacement costing between â¬8,000 and â¬15,000 depending on the setup. If the ad mentions "oil central heating" in an 1980s building, this expense must be provisioned for. 2374 2375Photos of the common areas, when available, betray the quality of the co-ownership management. A poorly maintained lobby, an outdated elevator, or damaged mailboxes foreshadow significant upcoming capital calls. 2376 2377All of these observations allow you to estimate an initial CapEx budget before even stepping foot in the property. 2378 2379--- 2380 2381## 5. Minute 5: Simulate economic coherence 2382 2383The fifth minute is for synthesis. The estimated gross yield is calculated by dividing the expected annual rent by the total acquisition price, including notary fees. In Belgium, registration duties amount to 12.5% in Wallonia and Brussels, and 12% in Flanders for an investment property (the reduced 3% or 2% rate being reserved for a sole and primary residence). These costs weigh heavily on the yield. 2384 2385Moving to the net yield requires subtracting the property tax (précompte immobilier), non-recoverable charges, insurance, rental vacancy, and routine maintenance. By adding the cost of financing, you get the net-net yieldâthe actual yield after all expenses. 2386 2387The impact of the EPC on long-term performance deserves special attention. In Flanders, rented properties will have to reach a minimum D label by 2030, then C by 2035. In Wallonia and Brussels, similar obligations are in preparation. A poor EPC is not a dealbreaker, but the cost of bringing it up to standard must be calculated. 2388 2389This simulation doesn't aim for penny-perfect accuracy but for coherence. If the fundamentals are weak at this stage, the viewing is useless. If, on the contrary, the safety margins are sufficient, the property warrants further investigation. 2390 2391--- 2392 2393## Conclusion 2394 2395Analyzing an ad in five minutes is not intended to replace the expertise of an architect or a notary. This method is a sorting tool that allows you to structure a quick decision based on factual data rather than
2395impressions. 2396 2397The Belgian real estate market, with its regional specifics and constantly evolving regulations, rewards methodical investors. Those who properly read an ad before picking up their phone negotiate better, buy at more coherent prices, and build more resilient portfolios. 2398 2399A good initial analysis does not look for the perfect property. It looks for the coherent property. 2400 2401--- 2402 2403## Arcanes Integration 2404 2405Arcanes automates this initial reading. From an Immoweb, Zimmo, or Immovlan link, the platform extracts the structural data, checks the price coherence against the local market, calculates gross, net, and net-net yields, identifies weak signals, and projects the renovation budget based on the EPC and the year of construction. A complete factual report in under ten seconds. 2406 2407--- 2408 2409## Frequently Asked Questions 2410 2411### How do I know if a listing is overvalued? 2412 2413By comparing the price per square meter with recent transactions in the neighborhood, published by the Federation of Notaries. A gap of over 15% without a visible justificationârecent renovation, excellent EPC, exceptional locationâis an indicator of overvaluation. The average negotiation margin in Belgium sits between 3 and 8% depending on the Region. 2414 2415### What are the warning signs in a description? 2416 2417Intentional omissions are more revealing than the phrasing. The absence of an EPC, missing photos of certain rooms, very short descriptions, and subjective terms like "lots of character" should draw your attention. These signals don't mean the property is bad, but that there are points the seller prefers not to highlight. 2418 2419### Why does occupancy status influence value? 2420 2421Under Belgian law, an ongoing primary residence lease is binding on the new owner. The buyer cannot evict the tenant simply because they purchased the property. Conditions for termination are strictly regulated by law. This constraint translates to a discount of 5 to 10%, sometimes more if the rent is below market value. 2422 2423### Should you visit a property with a poor EPC? 2424 2425An E or F EPC is not a dealbreaker. The question is whether the purchase price factors in the cost of compliance. A property listed 20% below the median with a â¬30,000 renovation envelope can remain profitable. A property priced at market value with a poor EPC suffers from a double handicap. 2426 2427### How do you estimate renovation costs without visiting? 2428 2429Old windows represent â¬500 to â¬1,000/sqm of opening. An oil boiler older than twenty years spells an â¬8,000 to â¬15,000 replacement. The lack of double glazing, an old electrical panel, or an uninsulated flat roof allow you to build a conservative CapEx estimate before the first visit. 2430`,qF=`--- 2431title: "Analyser une annonce immobilière en 5 minutes : la méthode professionnelle" 2432slug: "analyse-annonce-immobiliere-5-minutes" 2433tag: "Investissement" 2434readTime: "10" 2435publishDate: "20 janvier 2026" 2436author: "Ãquipe Arcanes" 2437excerpt: "Méthode professionnelle pour évaluer une annonce immobilière en 5 minutes. Prix/m², PEB, localisation, potentiel : les critères qui comptent vraiment." 2438image: "/images/blog/real-estate-ad-analysis.jpg" 2439--- 2440 2441# Analyser une annonce immobilière en 5 minutes : la méthode professionnelle 2442 2443En Belgique, un bien mis en ligne sur Immoweb ou Zimmo reçoit ses premières demandes de visite en moins de vingt-quatre heures. Dans les zones tendues â Bruxelles, le Brabant wallon, les centres-villes de Flandre â les biens correctement positionnés trouvent preneur en quelques semaines. Pour un investisseur, la rapidité de réaction est un avantage concurrentiel réel. Mais elle n'a de valeur que si elle repose sur une analyse rigoureuse. 2444 2445Le piège classique est connu de tous les professionnels du secteur : un investisseur visite quinze biens, en retient trois, et découvre après expertise que deux d'entre eux présentent des problèmes structurels invisibles à l'Åil nu. Le temps perdu en visites inutiles est l'un des coûts cachés les plus sous-estimés de l'investissement immobilier. 2446 2447L'objectif de cette méthode n'est pas de conclure un achat en cinq minutes. Il s'agit de déterminer si le bien mérite une visite ou s'il doit être écarté. Cette distinction â visiter ou passer â est celle qui sépare un investisseur efficace d'un acheteur impulsif. 2448 2449--- 2450 2451## Synthèse structurante 2452 2453L'analyse d'une annonce est un exercice de filtrage, pas de décision. Le prix au mètre carré ne prend son sens que replacé dans le contexte du microquartier. Les descriptions commerciales contiennent des signaux faibles qui révèlent les risques que le vendeur préfère taire. Le PEB, l'année de construction et le statut d'occupation conditionnent directement la rentabilité réelle. En structurant sa lecture selon une méthode reproductible, l'investisseur élimine davantage qu'il ne sélectionne â ce qui est précisément le signe d'une approche mature. 2454 2455--- 2456 2457## 1. Minute 1 : Identifier les données fondamentales 2458
2459La première étape consiste à extraire les données brutes qui permettent de construire un profil économique du bien. Le prix affiché, la surface habitable réelle et la localisation précise â non pas la commune, mais la rue et le microquartier â forment le socle de base. 2460 2461à ces trois piliers s'ajoutent des informations que les annonces belges sont légalement tenues de fournir : le certificat PEB et la méthode de chauffage. L'année de construction, les charges de copropriété et l'état d'occupation complètent le tableau. Un bien loué avec un bail en cours ne s'évalue pas de la même manière qu'un bien libre : les contraintes juridiques du bail de résidence principale en Belgique affectent directement la valorisation. 2462 2463L'erreur fréquente est de passer trop vite sur les données manquantes. Une annonce qui omet la surface exacte ou le PEB envoie un signal clair : soit l'agent évite un point faible, soit le vendeur n'a pas fait réaliser les diagnostics obligatoires. Dans les deux cas, c'est un drapeau rouge. 2464 2465--- 2466 2467## 2. Minute 2 : Vérifier le prix au mètre carré 2468 2469Le prix au mètre carré est l'indicateur le plus utilisé et le plus mal compris du marché immobilier belge. Il donne une orientation, jamais une conclusion. Un appartement à 3 200 â¬/m² à Ixelles n'a rien de comparable avec un bien au même prix à Charleroi. 2470 2471Le calcul est simple : prix affiché divisé par la surface habitable. L'interprétation exige plus de nuance. Les statistiques de référence sont publiées trimestriellement par la Fédération des Notaires (notaire.be), qui agrège les données des actes authentiques par commune. Ces chiffres constituent le point de comparaison le plus fiable car ils reflètent les prix réellement payés, pas les prix affichés. 2472 2473Une fois calculé, le prix au mètre carré doit être ajusté. Un PEB favorable (A ou B) justifie une prime de 5 à 15 % par rapport à la médiane du quartier. à l'inverse, un PEB E ou F implique un budget de rénovation énergétique à intégrer au coût total. Un bien loué sous la médiane locative se négocie généralement avec une décote de 5 à 10 %. 2474 2475Un prix supérieur au marché n'est pas nécessairement disqualifiant : il peut être justifié par une rénovation récente, une localisation micro exceptionnelle ou des caractéristiques rares comme un jardin en centre-ville. 2476 2477--- 2478 2479## 3. Minute 3 : Détecter les signaux faibles 2480 2481Les descriptions rédigées par les agents immobiliers sont un exercice de communication commerciale, pas un rapport technique. En Belgique, l'agent a l'obligation de ne pas induire l'acheteur en erreur, mais aucune obligation de tout dire. C'est entre ce qui est écrit et ce qui ne l'est pas que se cachent les informations les plus utiles. 2482 2483Le vocabulaire est un premier indicateur. "Charmant" signifie souvent petit et ancien. "Plein de potentiel" annonce des travaux importants. "à rafraîchir" est un euphémisme pour une rénovation lourde que le vendeur ne souhaite pas chiffrer publiquement. 2484 2485Les omissions sont encore plus révélatrices. Une annonce sans surface précise, sans photos de salle de bain, sans mention des installations techniques signale des points que le vendeur préfère aborder en visite, quand l'effet émotionnel du lieu aura fait son travail. 2486 2487L'analyse des photos mérite la même rigueur. Des images qui mettent systématiquement en avant le mobilier ou le home staging plutôt que la structure â murs, sols, châssis, toiture â indiquent une stratégie de compensation. à l'inverse, des photos brutes et bien éclairées montrant le bien dans son état réel sont le signe d'un vendeur confiant. 2488 2489--- 2490 2491## 4. Minute 4 : Lire l'annonce comme un technicien 2492 2493La quatrième minute est celle où l'investisseur change de posture. Il ne lit plus comme un acheteur, mais comme un technicien qui évalue un actif. L'objectif : identifier les postes de dépenses probables après acquisition. 2494 2495Les châssis sont l'un des indicateurs les plus fiables. Des châssis en bois simple vitrage sur un bâtiment des années soixante-dix signalent un remplacement obligatoire â entre 500 et 1 000 euros par mètre carré de baie en Belgique. Des châssis PVC double vitrage en bon état suggèrent une intervention récente. 2496 2497La nature du chauffage est un second marqueur. Les chaudières au mazout, encore très présentes en Wallonie, annoncent un remplacement entre 8 000 et 15 000 euros selon la configuration. Si l'annonce mentionne un "chauffage central au mazout" sur un bâtiment des années quatre-vingts, ce poste doit être provisionné. 2498 2499Les photos des parties communes, lorsqu'elles existent, trahissent la qualité de la gestion de copropriété. Un hall mal entretenu, un ascenseur vétuste, des boîtes aux lettres abîmées annoncent des appels de fonds importants à venir. 2500 2501L'ensemble de ces observations permet d'estimer un premier budget de CapEx avant même d'avoir mis un pied dans le bien. 2502 2503--- 2504 2505## 5. Minute 5 : Simuler la cohérence économique 2506 2507La cinquième minute est celle de la synthèse. Le rendement brut estimatif se calcule en rapportant le loyer annuel attendu au prix d'acquisition total, frais de notaire inclus. En Belgique, les droits d'enregistrement s'élèvent à 12,5 % en Wallonie et à Bruxelles, et à 12 % en Flandre pour un bien d'investissement (le tarif réduit de 3 % étant réservé à l'habitation propre et unique). Ces frais pèsent significativement sur le rendement. 2508 2509Le passage au rendement net exige de soustraire le précompte immobilier, les charges non récupérables, l'assurance, la vacance locative et l'entretien courant. En ajoutant le coût du financement, on obtient le rendement net-net â le rendement réel après toutes les charges. 2510 2511L'impact du PEB sur la performance à long terme mérite une attention particulière. En Flandre, les biens loués devront atteindre un label D minimum d'ici 2030, puis C d'ici 2035. En Wallonie et à Bruxelles, des obligations similaires sont en préparation. Un PEB médiocre n'est pas rédhibitoire, mais son coût de mise en conformité doit être chiffré. 2512 2513Cette simulation ne vise pas la précision au centime mais la cohérence. Si les fondamentaux sont fragiles à ce stade, la visite est inutile. Si au contraire les marges de sécurité sont suffisantes, le bien mérite d'être approfondi. 2514 2515--- 2516
2517## Conclusion 2518 2519Analyser une annonce en cinq minutes n'a pas vocation à remplacer l'expertise d'un architecte ou d'un notaire. Cette méthode est un outil de tri qui permet de structurer une décision rapide en s'appuyant sur des données factuelles plutôt que sur des impressions. 2520 2521Le marché immobilier belge, avec ses spécificités régionales et ses réglementations en constante évolution, récompense les investisseurs méthodiques. Ceux qui lisent correctement une annonce avant de décrocher leur téléphone négocient mieux, achètent à des prix plus cohérents et construisent des portefeuilles plus résilients. 2522 2523Une bonne analyse initiale ne cherche pas le bien parfait. Elle cherche le bien cohérent. 2524 2525--- 2526 2527## Intégration Arcanes 2528 2529Arcanes automatise cette lecture initiale. à partir d'un lien Immoweb, Zimmo ou Immovlan, la plateforme extrait les données structurantes, vérifie la cohérence du prix par rapport au marché local, calcule les rendements brut, net et net-net, identifie les signaux faibles et projette le budget travaux en fonction du PEB et de l'année de construction. Un rapport factuel complet en moins de dix secondes. 2530 2531--- 2532 2533## Questions fréquentes 2534 2535### Comment savoir si une annonce est surévaluée ? 2536 2537En comparant le prix au mètre carré avec les transactions récentes du quartier, publiées par la Fédération des Notaires. Un écart de plus de 15 % sans justification visible â rénovation récente, PEB excellent, emplacement exceptionnel â est un indicateur de surévaluation. La marge de négociation moyenne en Belgique se situe entre 3 et 8 % selon les Régions. 2538 2539### Quels sont les signaux d'alerte dans une description ? 2540 2541Les omissions volontaires sont plus révélatrices que les formulations. L'absence de PEB, l'absence de photos de certaines pièces, les descriptions très courtes et les termes subjectifs comme "beaucoup de cachet" doivent éveiller l'attention. Ces signaux ne signifient pas que le bien est mauvais, mais qu'il existe des points que le vendeur préfère ne pas mettre en avant. 2542 2543### Pourquoi l'état d'occupation influence-t-il la valeur ? 2544 2545En droit belge, un bail de résidence principale en cours est opposable au nouveau propriétaire. Celui-ci ne peut pas expulser le locataire simplement parce qu'il a acheté le bien. Les conditions de résiliation sont encadrées par la loi. Cette contrainte se traduit par une décote de 5 à 10 %, parfois davantage si le loyer est inférieur au marché. 2546 2547### Doit-on visiter un bien avec un mauvais PEB ? 2548 2549Un PEB E ou F n'est pas rédhibitoire. La question est de savoir si le prix d'achat intègre le coût de la mise en conformité. Un bien affiché 20 % sous la médiane avec une enveloppe travaux de 30 000 euros peut rester rentable. Un bien au prix du marché avec un PEB médiocre cumule deux handicaps. 2550 2551### Comment estimer le coût des travaux sans visiter ? 2552 2553Les châssis anciens représentent 500 à 1 000 â¬/m² de baie. Une chaudière mazout de plus de vingt ans annonce 8 000 à 15 000 euros de remplacement. L'absence de double vitrage, un tableau électrique ancien ou une toiture plate non isolée permettent de construire une estimation conservatrice du CapEx avant la première visite. 2554`,NF=`--- 2555title: "Een vastgoedadvertentie in 5 minuten analyseren: de professionele methode" 2556slug: "analyse-annonce-immobiliere-5-minutes" 2557tag: "Investissement" 2558readTime: "10" 2559publishDate: "20 januari 2026" 2560author: "Arcanes Team" 2561excerpt: "Professionele methode om een vastgoedadvertentie in 5 minuten te beoordelen. Prijs/m², EPC, locatie, potentieel: de criteria die echt tellen." 2562image: "/images/blog/real-estate-ad-analysis.jpg" 2563--- 2564 2565# Een vastgoedadvertentie in 5 minuten analyseren: de professionele methode 2566 2567In België ontvangt een pand dat op Immoweb of Zimmo wordt geplaatst zijn eerste bezichtigingsaanvragen binnen de vierentwintig uur. In de meest gegeerde zones â Brussel, Waals-Brabant, de Vlaamse centrumsteden â vinden correct geprijsde panden binnen enkele weken een koper. Voor een investeerder is snelheid van reactie een reëel concurrentievoordeel. Maar dat voordeel heeft alleen waarde als het gepaard gaat met een gedegen analyse. 2568 2569De klassieke valkuil is bij alle vastgoedprofessionals bekend: een investeerder bezichtigt vijftien panden, houdt er drie over, en ontdekt na expertise dat twee ervan structurele problemen vertonen die met het blote oog onzichtbaar waren. De tijd die verloren gaat aan nutteloze bezichtigingen is een van de meest onderschatte verborgen kosten van vastgoedinvestering. 2570 2571Het doel van deze methode is niet om in vijf minuten een aankoop af te ronden. Het gaat erom te bepalen of het pand een bezichtiging verdient of onmiddellijk terzijde moet worden geschoven. Dit onderscheid â bezichtigen of overslaan â is wat een efficiënte investeerder onderscheidt van een impulsieve koper. 2572 2573--- 2574 2575## Structurerende synthese 2576 2577De analyse van een advertentie is een filteroefening, geen beslissing. De prijs per vierkante meter krijgt pas betekenis wanneer hij wordt geplaatst in de context van de specifieke microwijk. Commerciële beschrijvingen bevatten zwakke signalen die de risico's onthullen die de verkoper liever verzwijgt. Het EPC, het bouwjaar en de bezettingsstatus bepalen rechtstreeks het werkelijke rendement. Door zijn lezing te structureren volgens een herhaalbare methode, elimineert de investeerder meer dan hij selecteert â wat precies het kenmerk is van een volwassen aanpak. 2578 2579--- 2580 2581## 1. Minuut 1: De fundamentele gegevens identificeren 2582 2583De eerste stap bestaat erin de ruwe gegevens te extraheren waarmee een economisch profiel van het pand kan worden opgebouwd. De vraagprijs, de werkelijke bewoonbare oppervlakte en de precieze locatie â niet de gemeente, maar de straat en de microwijk â vormen de basis. 2584 2585Bij deze drie pijlers komen gegevens die Belgische advertenties wettelijk verplicht zijn te vermelden: het EPC-certificaat en de verwarmingsmethode. Het bouwjaar, de eventuele mede-eigendomskosten en de bezettingsstatus vervolledigen het beeld. Een verhuurd pand met een lopend huurcontract wordt niet op dezelfde manier gewaardeerd als een leegstaand pand: de juridische beperkingen van de woninghuurovereenkomst in België beïnvloeden rechtstreeks de waardering. 2586 2587De veelgemaakte fout is om te snel over ontbrekende gegevens heen te lezen. Een advertentie die de exacte oppervlakte of het EPC weglaat, stuurt een duidelijk signaal: ofwel vermijdt de makelaar een z
2587wak punt, ofwel heeft de verkoper de verplichte keuringen niet laten uitvoeren. In beide gevallen is het een rode vlag. 2588 2589--- 2590 2591## 2. Minuut 2: De prijs per vierkante meter verifiëren 2592 2593De prijs per vierkante meter is de meest gebruikte en meest verkeerd begrepen indicator van de Belgische vastgoedmarkt. Hij geeft een richting aan, nooit een conclusie. Een appartement aan 3 200 â¬/m² in Elsene is op geen enkele manier vergelijkbaar met een pand tegen dezelfde prijs in Charleroi. 2594 2595De berekening is eenvoudig: de vraagprijs gedeeld door de bewoonbare oppervlakte. De interpretatie vereist meer nuance. De referentiestatistieken worden per kwartaal gepubliceerd door de Federatie van het Notariaat (notaris.be), die de gegevens van authentieke akten per gemeente samenbrengt. Deze cijfers vormen het meest betrouwbare vergelijkingspunt, omdat ze de werkelijk betaalde prijzen weerspiegelen, niet de vraagprijzen. 2596 2597Eenmaal berekend, moet de prijs per vierkante meter worden bijgesteld. Een gunstig EPC (A of B) rechtvaardigt een premie van 5 tot 15 % ten opzichte van de mediaan van de wijk. Omgekeerd impliceert een EPC E of F een budget voor energetische renovatie dat in de totale aankoopkost moet worden opgenomen. Een verhuurd pand onder de huurmediaan wordt doorgaans verhandeld met een korting van 5 tot 10 %. 2598 2599Een prijs boven de markt is niet noodzakelijk diskwalificerend: hij kan gerechtvaardigd zijn door een recente renovatie, een uitzonderlijke microlocatie of zeldzame kenmerken zoals een tuin in het stadscentrum. 2600 2601--- 2602 2603## 3. Minuut 3: Zwakke signalen detecteren 2604 2605Beschrijvingen opgesteld door vastgoedmakelaars zijn een oefening in commerciële communicatie, geen technisch verslag. In België is de makelaar wettelijk verplicht om de koper niet te misleiden, maar heeft hij geen enkele verplichting om alles te vertellen. Het is in de ruimte tussen wat er geschreven staat en wat er niet staat dat de meest bruikbare informatie voor de investeerder verscholen ligt. 2606 2607Het gebruikte vocabularium is een eerste indicator. "Charmant" betekent vaak klein en oud. "Vol potentieel" kondigt zware werken aan. "Op te frissen" is een eufemisme voor een grondige renovatie die de verkoper liever niet publiekelijk becijfert. 2608 2609Weglatingen zijn nog veelzeggender. Een advertentie zonder precieze oppervlakte, zonder foto's van de badkamer, zonder vermelding van de technische installaties wijst op punten die de verkoper liever ter plaatse bespreekt, wanneer het emotionele effect van de ruimte zijn werk heeft gedaan. 2610 2611De analyse van de foto's verdient dezelfde nauwkeurigheid. Beelden die systematisch het meubilair of de homestaging benadrukken in plaats van de structuur â muren, vloeren, raamkozijnen, dak â duiden op een compensatiestrategie. Omgekeerd zijn rauwe, goed belichte foto's die het pand in zijn werkelijke staat tonen het teken van een zelfverzekerde verkoper. 2612 2613--- 2614 2615## 4. Minuut 4: De advertentie lezen als technicus 2616 2617De vierde minuut is het moment waarop de investeerder van houding verandert. Hij leest niet langer als koper, maar als technicus die een actief evalueert. Het doel: de waarschijnlijke uitgavenposten na aankoop identificeren. 2618 2619Raamkozijnen zijn een van de meest betrouwbare indicatoren. Houten raamkozijnen met enkel glas op een gebouw uit de jaren zeventig wijzen op een verplichte vervanging â tussen 500 en 1 000 euro per vierkante meter raamopening in België. PVC-kozijnen met dubbel glas in goede staat suggereren een recente ingreep. 2620 2621De aard van de verwarming is een tweede marker. Mazoutketels, nog altijd sterk aanwezig in Wallonië, kondigen een vervanging aan tussen 8 000 en 15 000 euro naargelang de configuratie. Als de advertentie "centrale verwarming op mazout" vermeldt bij een gebouw uit de jaren tachtig, moet deze post worden geprovisioneerd. 2622 2623Foto's van de gemeenschappelijke delen, wanneer ze beschikbaar zijn, verraden de kwaliteit van het beheer van de mede-eigendom. Een slecht onderhouden inkomhal, een verouderde lift, beschadigde brievenbussen kondigen belangrijke bijkomende opvragingen aan in de komende jaren. 2624 2625Het geheel van deze waarnemingen maakt het mogelijk om een eerste CapEx-budget in te schatten nog voor men een voet in het pand heeft gezet. 2626 2627--- 2628 2629## 5. Minuut 5: De economische coherentie simuleren 2630 2631De vijfde minuut is die van de synthese. Het geschatte brutorendement wordt berekend door de verwachte jaarhuur te delen door de totale aankoopprijs, notariskosten inbegrepen. In België bedragen de registratierechten 12,5 % in Wallonië en Brussel, en 12 % in Vlaanderen voor een investeringspand (het verlaagd tarief van 3 % is voorbehouden voor de enige en eigen woning). Deze kosten wegen aanzienlijk op het rendement. 2632 2633De overgang naar het nettorendement vereist het aftrekken van de onroerende voorheffing, de niet-recupereerbare kosten, de verzekering, de leegstand en het lopend onderhoud. Door de financieringskosten toe te voegen, bekomt men het netto-nettorendement â het werkelijke rendement na alle lasten. 2634 2635De impact van het EPC op de langetermijnprestatie verdient bijzondere aandac
2635ht. In Vlaanderen moeten verhuurde panden tegen 2030 minimaal label D bereiken, en tegen 2035 label C. In Wallonië en Brussel zijn gelijkaardige verplichtingen in voorbereiding. Een matig EPC is niet onoverkomelijk, maar de kost van de conformering moet worden becijferd. 2636 2637Deze simulatie streeft niet naar precisie op de cent, maar naar coherentie. Als de fundamenten in dit stadium wankel zijn, is de bezichtiging overbodig. Als daarentegen de veiligheidsmarges toereikend zijn, verdient het pand een grondigere analyse. 2638 2639--- 2640 2641## Conclusie 2642 2643Een vastgoedadvertentie in vijf minuten analyseren heeft niet de ambitie om de expertise van een architect of notaris te vervangen. Deze methode is een selectie-instrument waarmee een snelle beslissing kan worden gestructureerd op basis van feitelijke gegevens in plaats van subjectieve indrukken. 2644 2645De Belgische vastgoedmarkt, met haar regionale specificiteiten en voortdurend evoluerende regelgeving, beloont methodische investeerders. Degenen die een advertentie correct lezen voordat ze de telefoon opnemen, onderhandelen beter, kopen tegen coherentere prijzen en bouwen weerbaardere portefeuilles. 2646 2647Een goede initiële analyse zoekt niet het perfecte pand. Ze zoekt het coherente pand. 2648 2649--- 2650 2651## Integratie Arcanes 2652 2653Arcanes automatiseert en systematiseert deze initiële lezing. Op basis van een link naar Immoweb, Zimmo of Immovlan extraheert het platform de structurerende gegevens, verifieert de coherentie van de prijs ten opzichte van de lokale markt, berekent de bruto-, netto- en netto-nettorendementen, identificeert de zwakke signalen en projecteert het renovatiebudget op basis van het EPC en het bouwjaar. Een volledig feitelijk rapport in minder dan tien seconden. 2654 2655--- 2656 2657## Veelgestelde vragen 2658 2659### Hoe weet je of een advertentie te duur geprijsd is? 2660 2661Door de prijs per vierkante meter te vergelijken met recente transacties in dezelfde wijk, gepubliceerd door de Federatie van het Notariaat. Een verschil van meer dan 15 % zonder zichtbare rechtvaardiging â recente renovatie, uitstekend EPC, uitzonderlijke ligging â is een indicator van overwaardering. De gemiddelde onderhandelingsmarge in België ligt tussen 3 en 8 % naargelang de Regio. 2662 2663### Wat zijn de alarmsignalen in een beschrijving? 2664 2665Vrijwillige weglatingen zijn veelzeggender dan de formuleringen zelf. Het ontbreken van een EPC, het ontbreken van foto's van bepaalde kamers, erg korte beschrijvingen en subjectieve termen zoals "veel cachet" moeten de aandacht trekken. Deze signalen betekenen niet dat het pand slecht is, maar dat er punten bestaan die de verkoper liever niet in de verf zet. 2666 2667### Waarom beïnvloedt de bezettingsstatus de waarde? 2668 2669Naar Belgisch recht is een lopende woninghuurovereenkomst tegenwerpelijk aan de nieuwe eigenaar. Die kan de huurder niet zomaar uitzetten omdat hij het pand heeft gekocht. De opzegvoorwaarden worden door de wet geregeld. Deze beperking vertaalt zich in een marktkorting van 5 tot 10 %, soms meer als de lopende huur onder de marktprijs ligt. 2670 2671### Moet je een pand met een slecht EPC bezichtigen? 2672 2673Een EPC E of F is op zich niet onoverkomelijk. De pertinente vraag is of de aankoopprijs de kost van de energetische conformering integreert. Een pand dat 20 % onder de mediaan wordt aangeboden met een renovatie-enveloppe van 30 000 euro kan rendabel blijven. Een pand aan marktprijs met een matig EPC combineert twee handicaps. 2674 2675### Hoe schat je de renovatiekosten zonder bezichtiging? 2676 2677Oude raamkozijnen vertegenwoordigen 500 tot 1 000 â¬/m² raamopening. Een mazoutketel van meer dan twintig jaar kondigt 8 000 tot 15 000 euro vervangingskost aan. Het ontbreken van dubbel glas, een verouderd elektrisch bord of een niet-geïsoleerd plat dak maken het mogelijk om een conservatieve CapEx-schatting op te bouwen nog vóór de eerste bezichtiging. 2678`,LF=`--- 2679title: "AVM: how an automated property valuation works (and why it no longer costs anything)" 2680slug: "avm-estimation-automatisee-belgique" 2681tag: "Marché" 2682readTime: 8 2683publishDate: "July, 22 2026" 2684author: "Arcanes" 2685excerpt: "An AVM values a property statistically, without a visit. In Belgium the base data is public and the algorithms are free: the number has become a commodity everywhere. What stays rare is what you build around it." 2686image: "/__l5e/assets-v1/5d117f4e-374b-46e6-b684-9e80f816b4a4/avm-estimation-automatisee-belgique.png" 2687imageVersion: "1" 2688imageAlt: "A row of identical Belgian terraced houses, each carrying a different valuation" 2689--- 2690 2691# AVM: how an automated property valuation works 2692 2693**An AVM (Automated Valuation Model) is an algorithm that estimates a property's value through statistical calculation, using market data and the property's characteristics, without a site visit or a professional appraisal.** It is the technology behind every free online valuation â those of the portals, the banks, the agencies, and ours. 2694 2695In Belgium, an AVM now returns a number in thirty seconds, free of charge. This article explains how it gets there, why the service became a commodity, what it structurally cannot do, and how to judge the one in front of you. 2696 2697## How an AVM actually works 2698 2699A serious model works in four steps. 2700 27011. **It builds a comparison set.** The model isolates recent sales of similar properties in the same area â ideally the municipality or the postcode, not the province or the country. 27022. **It computes a reference price per square metre.** Median rather than average: the median resists the extreme sales that distort an average on a small sample. 27033. **It adjusts for the property's measurable features.** Living area, type (house, apartment), declared condition, number of façades, energy class, presence of land. 27044. **It produces a range, not a point.** An honest AVM shows an interval and a confidence score. A single figure to the euro, with no range, is statistical theatre. 2705 2706The foundation of that reasoning â regressions and descriptive statistics â is within reach of any competent developer. That is
2706what explains the rest of this article. 2707 2708The most advanced models go further: gradient boosting to capture non-linear effects (the sharp drop at energy class G is not simply the continuation of the F slope), fine-grained spatial processing, sometimes image analysis to assess the condition of rooms. That level demands real R&D and does not commoditise. But the entry step has fallen to zero â and it is that step which changed the market. 2709 2710## Why the AVM became a commodity 2711 2712The marginal cost of an automated valuation tends towards zero, for three cumulative reasons. 2713 2714**The base input data is public.** In Belgium, Statbel publishes property transaction statistics by municipality. The FPS Finance registers leases, which yields real rents. The land registry is consultable. Energy performance certificates live in regional registers. 2715 2716An essential nuance: this public data is **aggregated and delayed**. It is more than enough to produce a solid order of magnitude at municipal scale â which is already a lot. It is not enough to go down to street level: that ultra-local precision remains the real competitive ground between models, and nobody gets there on free statistics alone. 2717 2718**The computing tools are free.** The statistical libraries required have been open source for more than a decade. 2719 2720**The cost to serve is marginal.** Once the model is built, each additional valuation costs a fraction of a cent. 2721 2722And a fourth reason, less readily admitted: **the AVM is the finest lead generator in real estate.** For an agency or a bank, offering a valuation means identifying a potential seller, their address and their phone number â at the exact moment they start thinking about it. Free is not generosity: it is a trade. You give a number, you collect a qualified prospect. 2723 2724Hence the question worth asking in front of any valuation form: _what am I paying here, if not money?_ 2725 2726Logical consequence: everyone can offer one, everyone does, and nobody can charge for it any more. **The number has become a commodity.** This is neither a tragedy nor a scandal â it is the normal cycle of a technology becoming democratic. 2727 2728But when a product becomes free and universal, the value does not disappear. It moves. 2729 2730## The four data families â and what they are worth 2731 2732Not all AVMs are equal, and the difference lies first in what they eat. 2733 2734| Source | What it is | Strength | Weakness | 2735| --------------------------- | ----------------------------------------------------------------------------- | ----------------------------------------------- | ------------------------------------------------------------------------------------------- | 2736| **Asking prices** | Portal listings | Volume, freshness | An asking price is not a paid price: negotiation, withdrawn properties, overpriced listings | 2737| **Registered transactions** | Sales signed before a notary (Statbel, FPS Finance) | What was actually paid | Municipal granularity, delayed publication | 2738| **User-declared** | What the owner states | Precision on the property | Subjective ("excellent condition" varies widely) | 2739| **Hybrid** | A base of registered transactions + weighted market signals and declared data | Robustness: several sources correct one another | Depends entirely on the quality of the weighting | 2740 2741When listings are a model's main reference, the property is compared to hopes rather than to deeds â and the gap between the two regularly runs into tens of thousands of euros. 2742 2743The most robust models do not pick a single family: they anchor the calculation on registered transactions and cross several signals to absorb each one's blind spots. What matters then is not the list of sources â no publisher disclose
2743s its recipe â but the nature of the base and the ability to date it. 2744 2745That is the first question to ask any valuation: **what are you anchored on?** A number without a source is not a valuation, it is an opinion with decimals. 2746 2747## What an AVM cannot do 2748 2749A statistical model only sees what is encoded. It structurally ignores: 2750 2751- **the real state of the interior** â damp, window frames, roof, electrical installation; 2752- **the view, orientation, nuisances** â two identical houses a hundred metres apart, one facing a park, the other a main road; 2753- **atypical properties** â a castle, a loft, a mixed-use building: too few comparables for the statistics to hold; 2754- **thin markets** â in a municipality where seventeen sales are signed per year, a single outlier moves the median; 2755- **timing** â a buyer in a hurry, an estate to settle, a neighbour who wants to expand. 2756 2757This is why an AVM produces a **statistical order of magnitude**, never an appraisal. No aggregate of public data becomes "certified" because an algorithm computed it. A tool that implies otherwise is selling you an illusion of precision. 2758 2759## Judging an AVM in five questions 2760 27611. **Where does the data come from?** Registered transactions or listings? The answer should be written somewhere. 27622. **At what scale?** Your municipality, or a provincial average in disguise? 27633. **How old is it?** An undated number cannot be verified. 27644. **Is there a range and a confidence score?** The absence of an interval is a signal.
27655. **Is the energy certificate factored in?** In Belgium the energy class weighs on price â a model that ignores it is systematically wrong on older stock as well as on renovated properties. And its weight is not the same everywhere: see below. 2766 2767## The Belgian case: what exists, and what is missing 2768 2769Belgium is favourable ground for AVMs: transactions published by municipality, registered leases, three documented energy certification regimes, **565 municipalities** after the 2025 mergers â a mesh fine enough for local statistics to mean something. 2770 2771**And the energy certificate does not weigh the same across regions.** In Flanders, the renovation obligation has applied since 1 January 2023: the buyer of a home rated E or F must reach at least label D within six years (the deadline was extended from five to six years in 2025, while the further tightening towards higher labels was dropped). That constraint creates a directly quantifiable threshold effect: the renovation bill is known to the buyer before the offer, and it gets negotiated. In Wallonia and Brussels, where renovation trajectories are taking shape but without an equivalent obligation at purchase, the energy discount also exists â but it is more diffuse, tied more to the buyer's borrowing capacity and to rental pressure than to a legal deadline. 2772 2773An AVM that applies the same energy coefficient on both sides of the language border misses that asymmetry. 2774 2775What is genuinely missing, on the other hand: no public register of sale prices property by property (unlike the Netherlands or the United Kingdom), delayed publication, and rental microdata that cannot be licensed. Every Belgian AVM works within those limits. Those who claim otherwise have not met them. 2776 2777## Where the value moved 2778 2779If the number costs nothing, what counts is what you build around it. Three shifts â and they are exactly the three things to demand of any free valuation, including ours. 2780 2781**From value to position.** â¬340,000 â is that expensive or not? Without your municipality's median, the real spread of sales and the annual transaction volume, the question has no answer. [See the figures for your municipality](https://arcanes.be/communes?utm_source=blog&utm_medium=article&utm_campaign=avm2026): median prices, liquidity, rents, local taxation. 2782 2783**From number to decision.** Nobody wants a price: people want to know what to do. Renovate before selling? [The energy simulator](https://arcanes.be/simulateur-peb?utm_source=blog&utm_medium=article&utm_campaign=avm2026) quantifies the value gain class by class, net of works. Keep it and rent it out? [The rental yield simulator](https://arcanes.be/simulateur-rendement-locatif?utm_source=blog&utm_medium=article&utm_campaign=avm2026) goes from gross to
2783net. Buying next? [Deed costs](https://arcanes.be/simulateur-frais-acte?utm_source=blog&utm_medium=article&utm_campaign=avm2026) and [the monthly loan payment](https://arcanes.be/simulateur-emprunt?utm_source=blog&utm_medium=article&utm_campaign=avm2026) give the real cost, the one the asking price never announces. 2784 2785**From calculation to deliverable.** A readable, sourced and dated file â one you can show, hold up against a low offer, take to the notary â is worth more than a number displayed and then forgotten. 2786 2787And for a specific property on the market today, the AVM is not enough: it is the listing itself that needs scrutiny â real price per m², full costs, net yield, comparison with the local market. That is what [the Arcanes analysis](https://arcanes.be/?utm_source=blog&utm_medium=article&utm_campaign=avm2026) does. 2788 2789## Frequently asked questions 2790 2791**What is an AVM in real estate?** 2792An AVM (Automated Valuation Model) is a statistical model that estimates a property's value without a visit, using market data (comparable transactions) and the property's declared characteristics. It is the technology powering online property valuations. 2793 2794**Is an AVM reliable?** 2795It is reliable for what it is: an order of magnitude. That reliability depends on three factors â the data source (real transactions rather than listings), the granularity (municipal rather than national) and the number of transactions available locally. In a liquid market the gap to the final sale price is small; in a thin market or for an atypical property it can be substantial. 2796 2797**What is the difference between an AVM and a property appraisal?** 2798The AVM computes remotely, in seconds, from data. The appraisal happens on site, records the actual condition, the view and the nuisances, and engages the professional liability of its author. The two are not opposed: the AVM situates, the appraisal validates. 2799 2800**Why do two online valuations give different figures for the same property?** 2801Because they do not work on the same data, at the same scale, or with the same adjustment factors. We covered it here: [why the free number is no longer enough](https://arcanes.be/blog/estimation-immobiliere-en-ligne-prix-differents). 2802 2803**Does an AVM take the energy certificate into account?** 2804Some do, many do not. In Belgium that is a serious gap: the energy class influences both value and regulatory risk, and its weight differs by region. In Flanders, the buyer of a property rated E or F must reach label D within six years of purchase â a legal obligation that gets negotiated at the offer stage. In Wallonia and Brussels the discount is more diffuse. A model that ignores the energy class, or applies the same weight everywhere, is structurally wrong on older stock. 2805 2806**How much does an AVM valuation cost?** 2807Nothing, in the overwhelming majority of cases. That is precisely the subject of this article: the calculation has become a commodity. What still gets paid for is human guidance â and what has to be earned is trust in the source. 2808 2809--- 2810 2811_Value your property now: [My True Value](https://arcanes.be/ma-vraie-valeur?utm_source=blog&utm_medium=article&utm_campaign=avm2026) â a figure anchored on actually registered transactions, your position in your municipality's market, the energy lever quantified, sell-or-rent comparison. Free, no account required, in 30 seconds._ 2812`,BF=`--- 2813title: "AVM : comment fonctionne une estimation immobilière automatisée (et pourquoi elle ne coûte plus rien)" 2814slug: "avm-estimation-automatisee-belgique" 2815tag: "Marché" 2816readTime: 8 2817publishDate: "22 juillet 2026" 2818author: "Arcanes" 2819excerpt: "Un AVM estime un bien par calcul statistique, sans visite. En Belgique, la donnée est publique et les algorithmes sont accessibles : le chiffre est devenu gratuit partout. Ce qui reste rare, c'est ce qu'on met autour." 2820image: "/__l5e/assets-v1/5d117f4e-374b-46e6-b684-9e80f816b4a4/avm-estimation-automatisee-belgique.png" 2821imageVersion: "1" 2822imageAlt: "Rangée de maisons belges identiques portant chacune une estimation différente" 2823--- 2824 2825# AVM : comment fonctionne une estimation immobilière automatisée 2826 2827**Un AVM (_Automated Valuation Model_, ou modèle d'évaluation automatisée) est un algorithme qui estime la valeur d'un bien immobilier par calcul statistique, à partir de données de marché et des caractéristiques du bien, sans visite ni expertise sur place.** C'est la technologie derrière toutes les estimations en ligne gratuites â celles des portails, des banques, des agences, et la nôtre. 2828 2829En Belgique, un AVM produit aujourd'hui un chiffre en trente secondes, gratuitement. Cet article explique comment il y arr
2829ive, pourquoi ce service est devenu une commodité, ce qu'il ne peut structurellement pas faire, et comment juger celui que vous avez sous les yeux. 2830 2831## Comment fonctionne un AVM, concrètement 2832 2833Un AVM sérieux travaille en quatre temps. 2834 28351. **Il constitue un comparable.** Le modèle isole les ventes récentes de biens semblables dans la même zone â idéalement la commune ou le code postal, pas la province ni le pays. 28362. **Il calcule une référence au mètre carré.** Prix médian plutôt que moyen : la médiane résiste aux ventes extrêmes qui déforment une moyenne sur un petit échantillon. 28373. **Il ajuste selon les caractéristiques mesurables du bien.** Surface habitable, type (maison, appartement), état déclaré, nombre de façades, classe énergétique, présence d'un terrain. 28384. **Il produit une fourchette, pas un point.** Un AVM honnête affiche un intervalle et un indice de confiance. Un chiffre unique au million près, sans fourchette, est une mise en scène statistique. 2839 2840Le socle de ce raisonnement â régressions et statistiques descriptives â est à la portée de n'importe quel développeur compétent. C'est ce qui explique la suite de cet article. 2841 2842Les modèles les plus avancés vont plus loin : algorithmes de _gradient boosting_ pour capter les effets non linéaires (le décrochage brutal d'un PEB G n'est pas la simple continuation de la pente F), traitement spatial fin, parfois analyse d'images pour estimer l'état des pièces. Ce niveau-là demande une vraie R&D et ne se commoditise pas. Mais la marche d'entrée, elle, est tombée à zéro â et c'est cette mar
2842che qui a changé le marché. 2843 2844## Pourquoi l'AVM est devenu une commodité 2845 2846Le coût marginal d'une estimation automatisée tend vers zéro, pour trois raisons cumulées. 2847 2848**La donnée d'entrée de base est publique.** En Belgique, Statbel publie les statistiques de transactions immobilières par commune. Le SPF Finances enregistre les baux, ce qui donne les loyers réels. Le cadastre est consultable. Les certificats énergétiques vivent dans des registres régionaux. 2849 2850Nuance essentielle : cette donnée publique est **agrégée et différée**. Elle suffit largement à produire un ordre de grandeur solide à l'échelle communale â c'est déjà beaucoup. Elle ne suffit pas à descendre à la rue près : la finesse ultra-locale reste le vrai terrain de compétition entre modèles, et personne n'y arrive avec les seules statistiques gratuites. 2851 2852**Les outils de calcul sont gratuits.** Les bibliothèques statistiques nécessaires sont open source depuis plus de dix ans. 2853 2854**Le coût de service est marginal.** Une fois le modèle construit, chaque estimation supplémentaire coûte une fraction de centime. 2855 2856Et une quatrième raison, moins avouée : **l'AVM est le meilleur générateur de contacts de l'immobilier.** Pour une agence ou une banque, offrir une estimation, c'est identifier un vendeur potentiel, son adresse et son numéro de téléphone â au moment exact où il commence à y penser. La gratuité n'est pas de la générosité : c'est un échange. Vous donnez un chiffre, vous récupérez un prospect qualifié. 2857 2858D'où la question à se poser devant tout formulaire d'estimation : _qu'est-ce que je paie, si ce n'est pas de l'argent ?_ 2859 2860Conséquence logique : tout le monde peut en offrir un, tout le monde en offre un, et personne ne peut plus le facturer. **Le chiffre est devenu une commodité.** Ce n'est ni un drame ni un scandale â c'est le cycle normal d'une technologie qui se démocratise. 2861 2862Mais quand un produit devient gratuit et universel, la valeur ne disparaît pas. Elle se déplace. 2863 2864## Les quatre familles de données â et ce qu'elles valent 2865 2866Tous les AVM ne se valent pas, et la différence tient d'abord à ce qu'ils mangent. 2867 2868| Source | Ce que c'est | Force | Faiblesse | 2869| ----------------------------- | ------------------------------------------------------------------------------ | ----------------------------------------------------------- | ----------------------------------------------------------------------------------------- | 2870| **Prix demandés** | Annonces des portails | Volume, fraîcheur | Un prix affiché n'est pas un prix payé : négociation, biens retirés, annonces surévaluées | 2871| **Transactions enregistrées** | Ventes signées chez le notaire (Statbel, SPF Finances) | Ce qui s'est réellement payé | Granularité communale, publication décalée | 2872| **Déclaratif utilisateur** | Ce que le propriétaire indique | Précision sur le bien | Subjectif (l'« état excellent » varie beaucoup) | 2873| **Hybride** | Socle de transactions enregistrées + signaux de marché et déclaratif, pondérés | La robustesse : plusieurs sources se corrigent mutuellement | Dépend entièrement de la qualité de la pondération | 2874 2875Quand les annonces constituent la référence principale d'un modèle, le bien est comparé à des espoirs plutôt qu'à des actes â et l'écart entre les deux se compte régulièrement en dizaines de milliers d'euros. 2876 2877Les modèles les plus robustes ne choisissent pas une seule famille : ils ancrent le calcul sur les transactions enregistrées et croisent plusieurs signaux pour amortir les angles morts de chacune. Ce qui compte alors n'est pas la liste des sources â aucun éditeur ne publie sa recette â mais la nature du socle et la capacité à le dater. 2878 2879C'est la première question à poser à n'importe quelle estimation : **sur quoi es-tu ancrée ?** Un chiffre sans source n'est pas une estimation, c'est une opinion avec des décimales. 2880 2881## Ce qu'un AVM ne peut pas faire 2882 2883Un modèle statistique ne voit que ce qui est encodé. Il ignore structurellement : 2884 2885- **l'état réel de l'intérieur** â humidité, châssis, toiture, installation électrique ; 2886- **la vue, l'orientation, les nuisances** â deux maisons identiques à cent mètres d'écart, l'une donnant sur un parc, l'autre sur une nationale ; 2887- **les biens atypiques** â château, loft, immeuble mixte : trop peu de comparables pour que la statistique tienne ; 2888- **les marchés étroits** â dans une commune où il se signe dix-sept ventes par an, une seule transaction hors norme déplace la médiane ; 2889- **le moment** â un acheteur pressé, une succession à liquider, un voisin qui veut agrandir. 2890 2891C'est pourquoi un AVM produit un **ordre de grandeur statistique**, jamais une expertise. Aucun agrégat de données publiques ne devient « certifié » parce qu'un algorithme l'a calculé. Un outil qui laisse croire le contraire vous vend une illusion de précision. 2892 2893## Comment juger un AVM en cinq questions 2894 28951. **D'où viennent les données ?** Transactions enregistrées ou annonces ? La réponse doit être écrite quelque part.
28962. **à quelle échelle ?** Votre commune, ou une moyenne provinciale déguisée ? 28973. **De quand datent-elles ?** Un chiffre non daté est invérifiable. 28984. **Y a-t-il une fourchette et un indice de confiance ?** L'absence d'intervalle est un signal. 28995. **Le PEB est-il pris en compte ?** En Belgique, la classe énergétique pèse sur le prix â un modèle qui l'ignore se trompe systématiquement sur les biens anciens comme sur les biens rénovés. Et son poids n'est pas le même partout : voir ci-dessous. 2900 2901## Le cas belge : ce qui est disponible, et ce qui manque 2902 2903La Belgique est un terrain favorable aux AVM : transactions publiées par commune, baux enregistrés, trois régimes de certification énergétique documentés, **565 communes** après les fusions de 2025 â un maillage suffisamment fin pour que la statistique locale ait du sens. 2904 2905**Et le PEB n'y pèse pas de la même façon selon la région.** En Flandre, l'obligation de rénovation s'applique depuis le 1er janvier 2023 : l'acquéreur d'un logement classé E ou F doit atteindre au minimum le label D dans un délai de six ans (porté de cinq à six ans en 2025, tandis que le durcissement ultérieur vers les labels supérieurs a été abandonné). Cette contrainte crée un effet de seuil directement chiffrable : la facture des travaux est connue de l'acheteur avant l'offre, et elle se négocie. En Wallonie et à Bruxelles, où des trajectoires de rénovation se dessinent mais sans obligation équivalente à l'achat, la décote énergétique existe aussi â mais elle est plus diffuse, davantage liée à la capacité d'emprunt de l'acheteur et à la pression locative qu'à une échéance légale. 2906 2907Un AVM qui applique le même coefficient PEB des deux côtés de la frontière linguistique passe à côté de cette asymétrie. 2908 2909Ce qui manque, en revanche, est réel : pas de registre public des prix de vente bien par bien (contrairement aux Pays-Bas ou au Royaume-Uni), une publication différée, et des microdonnées locatives non licenciables. Tout AVM belge compose avec ces limites. Ceux qui prétendent le contraire ne les ont pas rencontrées. 2910 2911## Où la valeur s'est déplacée 2912 2913Si le chiffre ne coûte plus rien, ce qui compte est ce qu'on met autour. Trois déplacements, et ce sont exactement les trois choses à exiger de toute estimation gratuite â y compris de la nôtre. 2914 2915**De la valeur à la position.** 340 000 â¬, c'est cher ou pas ? Sans la médiane de votre commune, la fourchette réelle des ventes et le volume annuel de transactions, la question n'a pas de réponse. [Consultez les chiffres de votre commune](https://arcanes.be/communes?utm_source=blog&utm_medium=article&utm_campaign=avm2026) : prix médians, liquidité, loyers, fiscalité locale. 2916 2917**Du chiffre à la décision.** Personne ne veut un prix : les gens veulent savoir quoi faire. Rénover avant de vendre ? [Le simulateur PEB](https://arcanes.be/simulateur-peb?utm_source=blog&utm_medium=article&utm_campaign=avm2026) chiffre le gain de valeur classe par classe, net du coût des travaux. Garder pour louer ? [Le simulateur de rendement locatif](https://arcanes.be/simulateur-rendement-locatif?utm_source=blog&utm_medium=article&utm_campaign=avm2026) passe du brut au net. Acheter derrière ? [Les frais d'acte](https://arcanes.be/simulateur-frais-acte?utm_source=blog&utm_medium=article&utm_campaign=avm2026) et [la mensualité d'emprunt](https://arcanes.be/simulateur-emprunt?utm_source=blog&utm_medium=article&utm_campaign=avm2026) donnent le coût réel, celui que le prix affiché n'annonce jamais. 2918 2919**Du calcul au livrable.** Un dossier lisible, sourcé et daté â qu'on peut montrer, opposer à une offre basse, emporter chez le notaire â vaut plus qu'un chiffre affiché puis oublié. 2920 2921Et pour un bien précis qui est en vente aujourd'hui, l'AVM ne suffit pas : c'est l'annonce elle-même qu'il faut passer au crible â prix au m² réel, frais complets, rendement net, comparaison au marché communal. C'est ce que fait [l'analyse Arcanes](https://arcanes.be/?utm_source=blog&utm_medium=article&utm_campaign=avm2026). 2922 2923## Questions fréquentes 2924 2925**Qu'est-ce qu'un AVM en immobilier ?** 2926Un AVM (_Automated Valuation Model_) est un modèle statistique qui estime la valeur d'un bien sans visite, à partir de données de marché (transactions comparables) et des caractéristiques déclarées du bien. C'est la technologie qui alimente les estimations immobilières en ligne. 2927 2928**Un AVM est-il fiable ?** 2929Il est fiable pour ce qu'il est : un ordre de grandeur. Sa fiabilité dépend de trois facteur
2929s â la source des données (transactions réelles plutôt qu'annonces), la granularité (communale plutôt que nationale) et le nombre de transactions disponibles localement. Sur un marché liquide, l'écart avec le prix de vente final est faible ; sur un marché étroit ou pour un bien atypique, il peut être important. 2930 2931**Quelle différence entre un AVM et une expertise immobilière ?** 2932L'AVM calcule à distance, en quelques secondes, à partir de données. L'expertise se fait sur place, constate l'état réel, la vue, les nuisances, et engage la responsabilité professionnelle de son auteur. Les deux ne s'opposent pas : l'AVM situe, l'expertise valide. 2933 2934**Pourquoi deux estimations en ligne donnent-elles des chiffres différents pour le même bien ?** 2935Parce qu'elles ne travaillent ni sur les mêmes données, ni à la même échelle, ni avec les mêmes facteurs d'ajustement. Nous l'avons détaillé ici : [pourquoi le chiffre gratuit ne suffit plus](https://arcanes.be/blog/estimation-immobiliere-en-ligne-prix-differents). 2936 2937**Un AVM prend-il en compte le PEB ?** 2938Certains oui, beaucoup non. En Belgique, c'est un manque sérieux : la classe énergétique influence la valeur et le risque réglementaire, et son poids diffère selon la région. En Flandre, l'acheteur d'un bien classé E ou F doit atteindre le label D dans les six ans suivant l'acquisition â une contrainte légale qui se négocie au moment de l'offre. En Wallonie et à Bruxelles, la décote est plus diffuse. Un modèle qui ignore le PEB, ou qui lui applique le même poids partout, se trompe structurellement sur le parc ancien. 2939 2940**Combien coûte une estimation par AVM ?** 2941Rien, dans l'écrasante majorité des cas. C'est précisément le sujet de cet article : le calcul est devenu une commodité. Ce qui se paie encore, c'est l'accompagnement humain â et ce qui se mérite, c'est la confiance dans la source. 2942 2943--- 2944 2945_Estimez votre bien maintenant : [Ma Vraie Valeur](https://arcanes.be/ma-vraie-valeur?utm_source=blog&utm_medium=article&utm_campaign=avm2026) â chiffre ancré sur les transactions réellement enregistrées, position dans le marché de votre commune, levier PEB chiffré, comparaison vendre/louer. Gratuit, sans création de compte, en 30 secondes._ 2946 2947--- 2948`,MF=`--- 2949title: "AVM: hoe een geautomatiseerde woningschatting werkt (en waarom ze niets meer kost)" 2950slug: "avm-estimation-automatisee-belgique" 2951tag: "Marché" 2952readTime: 9 2953publishDate: "22 juli, 2026" 2954author: "Arcanes" 2955excerpt: "Een AVM schat een woning via statistische berekening, zonder plaatsbezoek. In België zijn de basisgegevens openbaar en de algoritmes toegankelijk: het cijfer is overal gratis geworden. Wat zeldzaam blijft, is wat je eromheen bouwt." 2956image: "/__l5e/assets-v1/5d117f4e-374b-46e6-b684-9e80f816b4a4/avm-estimation-automatisee-belgique.png" 2957imageVersion: "1" 2958imageAlt: "Rij identieke Belgische rijhuizen, elk met een andere schatting" 2959--- 2960 2961# AVM: hoe een geautomatiseerde woningschatting werkt 2962 2963**Een AVM (_Automated Valuation Model_, of geautomatiseerd waarderingsmodel) is een algoritme dat de waarde van een woning statistisch berekent op basis van marktgegevens en de kenmerken van het pand, zonder plaatsbezoek of expertise ter plaatse.** Het is de technologie achter elke gratis online schatting â die van de portalen, de banken, de makelaars, en de onze. 2964 2965In België levert een AVM vandaag een cijfer op in dertig seconden, gratis. Dit artikel legt uit hoe hij daartoe komt, waarom die dienst een _commodity_ is geworden, wat hij structureel niet kan, en hoe u beoordeelt welke schatting u voor u hebt. 2966 2967## Hoe een AVM concreet werkt 2968 2969Een degelijk model werkt in vier stappen. 2970 29711. **Het stelt een vergelijkingsbasis samen.** Het model isoleert recente verkopen van vergelijkbare panden in dezelfde zone â idealiter de gemeente of de postcode, niet de provincie of het land. 29722. **Het berekent een referentie per vierkante meter.** Mediaan in plaats van gemiddelde: de mediaan weerstaat de extreme verkopen die een gemiddelde op een kleine steekproef vertekenen. 29733. **Het corrigeert volgens de meetbare kenmerken van het pand.** Bewoonbare oppervlakte, type (huis, appartement), opgegeven staat, aantal gevels, energieklasse, aanwezigheid van een grondperceel. 29744. **Het produceert een bandbreedte, geen punt.** Een eerlijke AVM toont een interval en een betrouwbaarheidsindex. Eén enkel cijfer tot op de euro, zonder vork, is statistische enscenering. 2975 2976De basis van die redenering â regressies en beschrijvende statistiek â ligt binnen het bereik van elke competente ontwikkelaar. Dat verklaart de rest van dit artikel. 2977 2978De meest geavanceerde modellen gaan verder: _gradient boosting_ om niet-lineaire effecten te vatten (de bruuske terugval bij een EPC-label G is niet zomaar de voortzetting van de helling bij F), fijne ruimtelijke verwerking, soms beeldanalyse om de staat van de vertrekken in te schatten. Dat niveau vraagt echte R&D en wordt niet gecommoditiseerd. Maar de instapdrempel is naar nul gezakt â en het is die drempel die de markt veranderd heeft. 2979 2980## Waarom de AVM een _commodity_ is geworden 2981 2982De marginale kost van een geautomatiseerde schatting nadert nul, om drie cumulatieve redenen. 2983 2984**De basisgegevens zijn openbaar.** In België publiceert Statbel de statistieken van vastgoedtransacties per gemeente. De FOD Financiën registreert de huurcontracten, wat de reële huurprijzen oplevert. Het kadaster is raadpleegbaar. De energieprestatiecertificaten zitten in gewestelijke registers. 2985 2986Essentiële nuance: die openbare gegevens zijn **geaggregeerd en vertraagd**. Ze volstaan ruimschoots om een solide orde van grootte op gemeentelijk niveau te produceren â dat is al veel. Ze volstaan niet om tot op de straat te dalen: die ultralokale fijnmazigheid blijft het echte concurrentieterrein tussen modellen, en niemand geraakt daar met de gratis statistieken alleen. 2987 2988**De rekeninstrumenten zijn gratis.** De nodige statistische bibliotheken zijn al meer dan tien jaar open source. 2989 2990**De bedieningskost is marginaal.** Eenmaal het model gebouwd is, kost elke bijkomende schatting een fractie van een cent. 2991 2992En een vierde reden, minder vaak toegegeven: **de AVM is de beste contactgenerator van de vastgoedsector.** Voor een makelaar of een bank betekent een gratis schatting aanbieden: een potentiële verkoper identificeren, met zijn adres en telefoonnummer â precies op het moment dat hij eraan begint te denken. Gratis is geen vrijgevigheid: het is een ruil. U geeft een cijfer, u krijgt een gekwalificeerde prospect. 2993 2994Vandaar de vraag bij elk schattingsformulier: _wat betaal ik hier, als het geen geld is?_ 2995 2996Logisch gevolg: iedereen kan er een aanbieden, iedereen doet het, en niemand kan het nog factureren. **Het cijfer is een commodity geworden.** Dat is geen drama en geen schandaal â het is de normale cyclus van een technologie die democratiseert. 2997 2998Maar wanneer een product gratis en universeel wordt, verdwijnt de waarde niet. Ze verplaatst zich. 2999 3000## De vier gegevensfamilies â en wat ze waard zijn 3001 3002Niet alle AVM's zijn gelijk, en het verschil zit eerst en vooral in wat ze eten. 3003 3004| Bron | Wat het is | Sterkte | Zwakte | 3005| ------------------------------ | ----------------------------------------------------------------------- | ----------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | 3006| **Vraagprijzen** | Advertenties op de portalen | Volume, actualiteit | Een vraagprijs is geen betaalde prijs: onderhandeling, teruggetrokken panden, overgewaardeerde advertenties | 3007| **Geregistreerde transacties** | Verkopen verleden bij de notaris (Statbel, FOD Financiën) | Wat werkelijk betaald is | Gemeentelijke granulariteit, vertraagde publicatie | 3008| **Opgave door de gebruiker** | Wat de eigenaar zelf aangeeft | Precisie over het pand | Subjectief (de "uitstekende staat" varieert sterk) | 3009| **Hybride** | Sokkel van geregistreerde transacties + gewogen marktsignalen en opgave | Robuustheid: meerdere bronnen corrigeren elkaar | Hangt volledig af van de kwaliteit van de weging | 3010 3011Wanneer advertenties de voornaamste referentie van een model vormen, wordt het pand vergeleken met hoop in plaats van met akten â en het verschil daartussen loopt geregeld in de tienduizenden euro's. 3012 3013De meest robuuste modellen kiezen niet één familie: ze verankeren de berekening op geregistreerde transacties en kruisen meerdere signalen om de blinde vlekken van elke bron te dempen. Wat dan telt, is niet de lijst van bronnen â geen enkele uitgever publiceert zijn recept â maar de aard van de sokkel en het vermogen om die te dateren. 3014 3015Dat is de eerste vraag aan elke schatting: **waarop ben je verankerd?** Een cijfer zonder bron is geen schatting, het is een mening met decimalen. 3016 3017## Wat een AVM niet kan 3018 3019Een statistisch model ziet enkel wat gecodeerd is. Het negeert structureel: 3020 3021- **de werkelijke staat van het interieur** â vocht, schrijnwerk, dak, elektrische installatie; 3022- **het uitzicht, de oriëntatie, de hinder** â twee identieke huizen op honderd meter van elkaar, het ene aan een park, het andere aan een gewestweg; 3023- **atypische panden** â kasteel, loft, gemengd gebouw: te weinig vergelijkingspunten om de statistiek te laten kloppen; 3024- **smalle markten** â in een gemeente waar jaarlijks zeventien verkopen worden getekend, verschuift één afwijkende transactie de mediaan; 3025- **het moment** â een gehaaste koper, een nalatenschap die vereffend moet worden, een buur die wil uitbreiden. 3026 3027Daarom levert een AVM een **statistische orde van grootte**, nooit een expertise. Geen enkele aggregatie van openbare gegevens wordt "gecertificeerd" omdat een algoritme ze berekend heeft. Een tool die het tegendeel laat uitschijnen, verkoopt u een illusie van precisie. 3028 3029## Een AVM beoordelen in vijf vragen 3030 30311. **Waar komen de gegevens vandaan?** Geregistreerde transacties of advertenties? Het antwoord hoort ergens te staan. 30322. **Op welke schaal?** Uw gemeente, of een vermomd provinciaal gemiddelde? 30333. **Van wanneer dateren ze?** Een ongedateerd cijfer is niet verifieerbaar. 30344. **Is er een bandbreedte en een betrouwbaarheidsindex?** Het ontbreken van een interval is een signaal. 30355. **Wordt het EPC meegerekend?** In België weegt de energieklasse op de prijs â een model dat ze negeert, vergist zich systematisch op het oude patr
3035imonium én op gerenoveerde panden. En het gewicht verschilt per gewest: zie hieronder. 3036 3037## Het Belgische geval: wat beschikbaar is, en wat ontbreekt 3038 3039België is gunstig terrein voor AVM's: transacties gepubliceerd per gemeente, geregistreerde huurcontracten, drie gedocumenteerde regimes voor energiecertificering, **565 gemeenten** na de fusies van 2025 â een maaswijdte die fijn genoeg is om lokale statistiek zinvol te maken. 3040 3041**En het EPC weegt niet overal even zwaar.** In Vlaanderen geldt de renovatieverplichting sinds 1 januari 2023: wie een woning met label E of F koopt, moet binnen zes jaar minstens label D behalen (de termijn werd in 2025 van vijf naar zes jaar verlengd, terwijl het latere verstrengingspad naar hogere labels werd geschrapt). Die verplichting creëert een direct becijferbaar drempeleffect: de renovatiefactuur is bij de koper bekend vóór het bod, en ze wordt onderhandeld. In Wallonië en Brussel, waar renovatietrajecten worden uitgetekend maar zonder gelijkwaardige verplichting bij aankoop, bestaat de energetische korting eveneens â maar diffuser, meer gebonden aan de leencapaciteit van de koper en aan de huurdruk dan aan een wettelijke deadline. 3042 3043Een AVM die aan weerszijden van de taalgrens hetzelfde EPC-coëfficiënt toepast, mist die asymmetrie. 3044 3045Wat daarentegen écht ontbreekt: geen openbaar register van verkoopprijzen pand per pand (in tegenstelling tot Nederland of het Verenigd Koninkrijk), een vertraagde publicatie, en huurmicrogegevens die niet in licentie te verkrijgen zijn. Elke Belgische AVM schikt zich naar die grenzen. Wie het tegendeel beweert, is ze niet tegengekomen. 3046 3047## Waar de waarde naartoe verschoven is 3048 3049Als het cijfer niets meer kost, telt wat je eromheen bouwt. Drie verschuivingen â en het zijn precies de drie dingen die u van elke gratis schatting mag eisen, ook van de onze. 3050 3051**Van waarde naar positie.** 340 000 â¬, is dat duur of niet? Zonder de mediaan van uw gemeente, de reële spreiding van de verkopen en het jaarlijkse transactievolume heeft die vraag geen antwoord. [Bekijk de cijfers van uw gemeente](https://arcanes.be/communes?utm_source=blog&utm_medium=article&utm_campaign=avm2026): mediaanprijzen, liquiditeit, huurprijzen, lokale fiscaliteit. 3052 3053**Van cijfer naar beslissing.** Niemand wil een prijs: mensen willen weten wat te doen. Renoveren vóór de verkoop? [De EPC-simulator](https://arcanes.be/simulateur-peb?utm_source=blog&utm_medium=article&utm_campaign=avm2026) becijfert de waardewinst klasse per klasse, netto na werken. Houden en verhuren? [De simulator huurrendement](https://arcanes.be/simulateur-rendement-locatif?utm_source=blog&utm_medium=article&utm_campaign=avm2026) gaat van bruto naar netto. Daarna kopen? [De aktekosten](https://arcanes.be/simulateur-frais-acte?utm_source=blog&utm_medium=article&utm_campaign=avm2026) en [de maandelijkse leninglast](https://arcanes.be/simulateur-emprunt?utm_source=blog&utm_medium=article&utm_campaign=avm2026) geven de werkelijke kost, die de vraagprijs nooit aankondigt. 3054 3055**Van berekening naar document.** Een leesbaar, gebronde en gedateerde bundel â die u kunt tonen, tegenover een laag bod kunt leggen, kunt meenemen naar de notaris â is meer waard dan een cijfer dat u even ziet en dan vergeet. 3056 3057En voor een concreet pand dat vandaag te koop staat, volstaat de AVM niet: dan moet de advertentie zelf doorgelicht worden â reële prijs per m², volledige kosten, nettorendement, vergelijking met de gemeentelijke markt. Dat is wat [de Arcanes-analyse](https://arcanes.be/?utm_source=blog&utm_medium=article&utm_campaign=avm2026) doet. 3058 3059## Veelgestelde vragen 3060 3061**Wat is een AVM in vastgoed?** 3062Een AVM (_Automated Valuation Model_) is een statistisch model dat de waarde van een pand schat zonder plaatsbezoek, op basis van marktgegevens (vergelijkbare transacties) en de opgegeven kenmerken van het pand. Het is de technologie achter de online woningschattingen. 3063 3064**Is een AVM betrouwbaar?** 3065Hij is betrouwbaar voor wat hij is: een orde van grootte. Die betrouwbaarheid hangt af van drie factoren â de gegevensbron (reële transacties eerder dan advertenties), de granulariteit (gemeentelijk eerder dan nationaal) en het aantal lokaal beschikbare transacties. Op een liquide markt is de afwijking van de uiteindelijke verkoopprijs klein; op een smalle markt of voor een atypisch pand kan ze aanzienlijk zijn. 3066 3067**Wat is het verschil tussen een AVM en een vastgoedexpertise?** 3068De AVM rekent op afstand, in enkele seconden, op basis van gegevens. De expertise gebeurt ter plaatse, stelt de werkelijke staat, het uitzicht en de hinder vast, en engageert de beroepsaansprakelijkheid van de auteur. Ze staan niet tegenover elkaar: de AVM situeert, de expertise valideert. 3069 3070**Waarom geven twee online schattingen verschillende cijfers voor hetzelfde pand?** 3071Omdat ze niet met dezelfde gegevens werken, niet op dezelfde schaal, en niet met dezelfde correctiefactoren. We hebben het hier uitgewerkt: [waarom het gratis cijfer niet meer volstaat](https://arcanes.be/blog/estimation-immobiliere-en-l
3071igne-prix-differents). 3072 3073**Houdt een AVM rekening met het EPC?** 3074Sommige wel, veel niet. In België is dat een ernstig gebrek: de energieklasse beïnvloedt zowel de waarde als het regelgevende risico, en het gewicht verschilt per gewest. In Vlaanderen moet de koper van een pand met label E of F binnen zes jaar na de aankoop label D behalen â een wettelijke verplichting die bij het bod onderhandeld wordt. In Wallonië en Brussel is de korting diffuser. Een model dat het EPC negeert, of overal hetzelfde gewicht geeft, vergist zich structureel op het oude patrimonium. 3075 3076**Hoeveel kost een schatting via AVM?** 3077Niets, in de overgrote meerderheid van de gevallen. Dat is precies het onderwerp van dit artikel: de berekening is een commodity geworden. Wat nog betaald wordt, is de menselijke begeleiding â en wat verdiend moet worden, is het vertrouwen in de bron. 3078 3079--- 3080 3081_Schat uw woning nu: [Mijn Echte Waarde](https://arcanes.be/ma-vraie-valeur?utm_source=blog&utm_medium=article&utm_campaign=avm2026) â cijfer verankerd op werkelijk geregistreerde transacties, positie in de markt van uw gemeente, becijferde EPC-hefboom, vergelijking verkopen/verhuren. Gratis, zonder account aan te maken, in 30 seconden._ 3082`,FF=`--- 3083title: "Understanding the EPC in Belgium: a strategic indicator influencing the value, risk, and performance of a real estate investment" 3084slug: "comprendre-peb-belgique" 3085tag: "Ãnergie" 3086readTime: "10" 3087publishDate: "January 15, 2026" 3088author: "Arcanes Team" 3089excerpt: "The EPC certificate influences the valuation, yield, and regulatory risk of a residential property in Belgium. A complete strategic analysis." 3090image: "/images/blog/peb-belgique.jpg" 3091--- 3092 3093# Understanding the EPC in Belgium: a strategic indicator influencing the value, risk, and performance of a real estate investment 3094 3095For several years, the EPC (Energy Performance Certificate, or _PEB_ in French) was perceived as an administrative formality. Most buyers, both private individuals and investors, only consulted it late in the process, treating it as a secondary element attached to the sales agreement. That era is over. Data from the Federation of Notaries and regulatory changes across the three Belgian Regions have transformed this document into a genuine financial analysis tool. 3096 3097Today, the EPC acts as a valuation marker, a risk indicator, a determining factor for future liquidity, and, in some cases, a revealer of deferred financial commitments. Its influence extends far beyond the mere question of energy consumption. It sits at the center of a property's economic equation by combining three essential dimensions: operating costs, regulatory obligations, and market perception upon resale. 3098 3099The goal is not to automatically seek out the best label, but to evaluate the relationship between the property's energy status, the cost of possible improvements, its potential future value, and your planned holding period. 3100 3101--- 3102 3103## Structural overview 3104 3105The EPC simultaneously influences the valuation, liquidity, and negotiating power of a residential real estate property in Belgium. According to Statbel data, more than half of the Belgian residential housing stock falls into classes E, F, or G. This means that a majority of the assets available on Immoweb, Zimmo, or Immovlan are exposed to growing regulatory risk. Energy performance obligations are becoming predictable, scheduled, and potentially costly in all three Regions. Jumping two EPC classes can generate a value increase of between eight and fifteen percent, depending on the property type and location. Banks are progressively integrating energy performance into their risk analysis, further reinforcing the weight of this indicator in investment decisions. 3106 3107To understand how the EPC fits into the overall purchasing processâcosts, financing, registration duties, and checklistsâconsult our [complete guide to buying in Belgium in 2026](/blog/buying-real-estate-belgium-2026). 3108 3109--- 3110 3111## What the EPC measures and what it does not measure 3112 3113Contrary to a persistent misconception, the EPC does not measure your actual heating bill or the perceived comfort of the home. It is a comparative technical benchmark based on standardized assumptions. The certificate indicates the theoretical energy performance of the building, regardless of the occupants' profile, their consumption habits, or the severity of the winter. 3114 3115The calculation takes into account the thermal insulation quality of the roof, walls, and floor, the performance of the installed heating system, the type and efficie
3115ncy of the windows and glazing, the level of airtightness, and the potential presence of renewable energy systems. Conversely, the certificate reflects neither the actual consumption linked to occupant habits, nor the execution quality of previous works, nor the predictable obsolescence of installations, nor non-energy technical risks such as asbestos, dampness, or structural pathologies. 3116 3117Therefore, the EPC must be read as an indicator of potential and future effort, never as a bill projection. The value of the certificate lies in its comparative and standardized function, which allows an asset to be positioned relative to the market and regulatory requirements. 3118 3119--- 3120 3121## The letter alone is not enough: reading the EPC like an investor 3122 3123The letter on the certificate is not a verdict but a starting point. The key variable is the progression effort required to reach a level compatible with your investment project, applicable regulations, and current or future banking requirements. A rigorous investor asks four foundational questions before drawing any conclusions. 3124 3125The first concerns the estimated minimum upgrade cost to reach the target label. The second focuses on the potential gain in valuation and liquidity that an improvement could generate. The third questions the regulatory deadline applicable in the specific Region. The fourth question, often neglected, pertains to the planned holding period; an investor who plans to resell in three years does not face the same constraints as a long-term wealth builder holding for fifteen years. 3126 3127--- 3128 3129## The financial dimension is cumulative and must be projected over time 3130 3131Energy performance must be analyzed in terms of the total cost of ownership, not just as a seasonal expense. The most common mistake is limiting the analysis to the price of the annual bill. In residential real estate, the economic horizon is measured over several years, generally a decade. 3132 3133For an 85 sqm apartment heated with gas, the orders of magnitude are telling. A class A property generates an estimated energy cost of about 550 euros per year, or 5,500 euros over ten years. A class C property represents about 1,800 euros annually, or 18,000 euros over the same periodâa cumulative difference of 12,500 euros compared to class A. In class D, the annual cost approaches 2,500 euros, and the ten-year differential reaches nearly 20,000 euros. As for a class F property, it generates an annual cost close to 4,000 euros, representing a cumulative differential of more than 34,000 euros over ten years compared to an efficient property. 3134 3135These gaps directly influence operational profitability in the case of a rental investment, a future buyer's perception upon resale, and the ability to negotiate the purchase price. Operating costs represent only a fraction of the total cost, to which must be added the energy investments required to meet future regional regulations. 3136 3137--- 3138 3139## Three observable investment logics depending on the buyer's profile 3140 3141The first strategy, taking on an "energy sieve" (highly inefficient property), involves acquiring a class F or G property to renovate it to a C level. This approach is reserved for investors capable of integrating renovation work into their financial strategy. The goal is to achieve a post-renovation value bump, amplified by better future liquidity. The primary risk lies in budget overruns and extended construction delays, which are frequent in Belgium for heavy renovations. 3142 3143The second strategy, wealth-oriented and defensive, targets a property already rated B. The buyer seeks stability, predictability, and the absence of probable regulatory obligations in the medium term. The potential for improvement is limited, but the long-term risk is considerably reduced. This approach suits investors who prioritize regular yield over capital gains. 3144 3145The third logic, an intermediate approach and often the most relevant for a balanced investor, aims for a targeted improvement from class D to class C. It combines moderate renovation costs, a measurable performance improvement, and reasonable valuation potential. Regional premiums available in Wallonia, Flanders, and Brussels can help reduce the net cost of this transition. 3146 3147--- 3148 3149## Regulatory risk and its timeline in the three Regions 3150 3151The three Belgian Regions have announced performance objectives that must be met within defined timeframes. A property sitting in a low class may require compliance upgrades before any sustainable resale or rental. The Brussels-Capital Region aims for a minimum of class E by 2033. Wallonia imposes the same class E target but with a closer deadline, set for 2030. Flanders stands out with a stricter requirement, mandating a minimum of class D by 2030. 3152 3153Acquiring a property with a low EPC is not an issue in itself, provided the cost of compliance is factored
3153into the purchase price and the overall strategy. An investor who ignores these deadlines takes a measurable risk: that of having to undertake unbudgeted work or seeing the liquidity of their asset deteriorate as the deadlines approach. 3154 3155--- 3156 3157## The EPC as a factual negotiation tool 3158 3159Negotiations based on the EPC must be structured and documented, never reduced to a generic argument like "the EPC is bad, so the price should drop." The goal is to align the price with economic reality by integrating energy projections and regulatory horizons into a quantified reasoning. 3160 3161Discounts generally observed on the Belgian market vary according to the energy class. A class C property suffers a discount of five to eight percent compared to a better-rated equivalent property. In class D, the discount sits between eight and twelve percent. Class E properties see their prices negotiated downward by twelve to eighteen percent. For classes F and G, observed discounts reach fifteen to twenty-five percent, depending on the location and the general condition of the property. 3162 3163The recommended methodology relies on four complementary steps. The investor begins by estimating the cost of the work based on per-square-meter benchmarks adapted to the Belgian market. They then project the energy costs over the planned holding period. The third step integrates regulatory risk into the quantified proposal. Finally, presenting a reasoned and well-argued offer, backed by this data, generally proves much more effective than a simple request for a markdown. 3164 3165--- 3166 3167## Conclusion 3168 3169The EPC is not a secondary administrative detail but a fundamental component of value and risk analysis in Belgian residential real estate. It influences yield, operational expenses, liquidity, regulatory compliance, and market perception. The three Regions are converging toward increasing requirements, and banks are beginning to factor them into their financing conditions. 3170 3171Top-performing investors do not simply look for properties with the best scores; they look for those offering the best ratio between improvement costs, valuation potential, and their planned holding period. 3172 3173--- 3174 3175## Arcanes Integration 3176 3177Arcanes generates a comprehensive analysis including projected energy costs, the financial impact of renovations, potential valuation post-improvement, regional regulatory risk estimation, and comparative investment scenarios. The report is actionable in minutes and proves highly useful during viewings, financing requests, and negotiations. 3178 3179--- 3180 3181## Frequently Asked Questions 3182 3183### How is the EPC calculated in Belgium? 3184 3185The EPC is calculated using a certification method that integrates insulation quality, heating type, window performance, ventilation, and any renewable systems. It is a standardized and theoretical calculation, based on normalized assumptions rather than a measurement of actual consumption. The result is expressed in kWh per square meter per year, then translated into a letter ranging from A (highly efficient) to G (highly energy-intensive). 3186 3187### How long is an EPC certificate valid in Belgium? 3188 3189An EPC certificate is valid for ten years from its date of issue, unless energy improvement works are carried out in the meantime. In that case, a new certificate can be requested to reflect the updated performance. During a real estate transaction, the certificate must be available as soon as the property is listed for sale, whether on Immoweb, Zimmo, or any other marketing channel. 3190 3191### Does a bad EPC lower the price of a real estate property? 3192 3193A weak EPC can lead to a discount linked to future energy costs, regulatory risk, and necessary upcoming renovations. Discounts observed on the Belgian market generally vary between five and twenty-five percent depending on the energy class, condition, and location of the property. This reality represents both a risk for the seller and an opportunity for the buyer capable of measuring its scope. 3194 3195### Does the EPC influence access to mortgage loans? 3196 3197Some Belgian banks are starting to integrate energy performance criteria into their financing policies. They may offer differentiated conditions depending on the EPC level, particularly for highly energy-intensive properties. This trend is expected to accelerate in the coming years as climate risks are increasingly factored
3197into the real estate portfolios of financial institutions. 3198 3199### Can an EPC be quickly improved without major renovations? 3200 3201The quickest improvements involve airtightness, ventilation, certain heating adjustments, and localized insulation like attics or pipes. These interventions can yield a jump of half a class to a full class for a limited budget. Significant class gains, however, require work on the building's thermal envelope, such as exterior wall insulation or a complete replacement of the windows. 3202`,OF=`--- 3203title: "Comprendre le PEB en Belgique : un indicateur stratégique qui influence la valeur, le risque et la performance d'un investissement immobilier" 3204slug: "comprendre-peb-belgique" 3205tag: "PEB" 3206readTime: "10" 3207publishDate: "15 janvier 2026" 3208author: "Ãquipe Arcanes" 3209excerpt: "Le certificat PEB influence la valorisation, le rendement et le risque réglementaire d'un bien résidentiel en Belgique. Analyse stratégique complète." 3210image: "/images/blog/peb-concept-belgium.jpg" 3211--- 3212 3213# Comprendre le PEB en Belgique : un indicateur stratég
3213ique qui influence la valeur, le risque et la performance d'un investissement immobilier 3214 3215Pendant plusieurs années, le certificat PEB (Performance Ãnergétique des Bâtiments) a été perçu comme une formalité administrative. La plupart des acquéreurs, investisseurs comme particuliers, ne le consultaient que tardivement, comme un élément secondaire rattaché au compromis de vente. Cette époque est révolue. Les données de la Fédération des Notaires et les évolutions réglementaires des trois Régions belges ont transformé ce document en un véritable outil d'analyse financière. 3216 3217Le PEB fonctionne aujourd'hui comme un marqueur de valorisation, un indicateur de risque, un élément déterminant de la liquidité future et, dans certains cas, comme un révélateur d'engagements financiers différés. Son influence dépasse largement la seule question de la consommation énergétique. Il se situe au centre de l'équation économique d'un bien en combinant trois dimensions essentielles : les charges d'exploitation, les obligations réglementaires et la perception du marché à la revente. 3218 3219L'enjeu ne consiste pas à rechercher automatiquement le meilleur label, mais à évaluer la relation entre l'état énergétique du bien, le coût des améliorations possibles, la valeur future potentielle et la durée de détention envisagée. 3220 3221--- 3222 3223## Synthèse structurante 3224 3225Le PEB influence simultanément la valorisation, la liquidité et la capacité de négociation d'un bien immobilier résidentiel en Belgique. Plus de la moitié du parc résidentiel belge se situe dans les classes E, F ou G selon les données de StatBel, ce qui signifie qu'une majorité d'actifs disponibles sur Immoweb, Zimmo ou Immovlan sont exposés à un risque réglementaire croissant. Les obligations de performance énergétique deviennent prévisibles, planifiées et potentiellement coûteuses dans les trois Régions. Un gain de deux classes PEB peut générer une revalorisation comprise entre huit et quinze pour cent selon le type de bien et la localisation. Les banques intègrent progressivement la performance énergétique dans leur analyse de risque, ce qui renforce encore le poids de cet indicateur dans la décision d'investissement. 3226 3227Pour comprendre comment le PEB s'intègre dans le processus global d'achat â frais, financement, droits d'enregistrement et checklist â consultez notre [guide complet pour acheter en Belgique en 2026](/blog/acheter-bien-immobilier-belgique-2026). 3228 3229--- 3230 3231## Ce que le PEB mesure et ce qu'il ne mesure pas 3232 3233Contrairement à une idée reçue tenace, le PEB ne mesure pas la facture de chauffage réelle ni le confort ressenti dans le logement. Il constitue un référentiel technique comparatif basé sur des hypothèses normalisées. Le certificat indique la performance énergétique théorique du bâtiment, indépendamment du profil des occupants, de leurs habitudes de consommation ou de la rigueur de l'hiver. 3234 3235Le calcul prend en compte la qualité de l'isolation thermique du toit, des murs et du sol, les performances du système de chauffage installé, le type et l'efficacité des châssis et vitrages, le niveau d'étanchéité à l'air et la présence éventuelle de systèmes à énergie renouvelable. En revanche, le certificat ne reflète ni la consommation réelle liée aux habitudes des occupants, ni la qualité d'exécution de travaux antérieurs, ni la vétusté prévisible des installations, ni les risques techniques non énergétiques comme l'amiante, l'humidité ou les pathologies structurelles. 3236 3237Le PEB doit donc être lu comme un indicateur de potentiel et d'effort futur, jamais comme une projection de facture. La valeur du certificat réside dans sa fonction comparative et normalisée, qui permet de situer un actif par rapport au marché et aux exigences réglementaires. 3238 3239--- 3240 3241## La lettre seule ne suffit pas : lire le PEB comme un investisseur 3242 3243La lettre figurant sur le certificat ne constitue pas un verdict mais un point de départ. La variable clé est l'effort de progression nécessaire pour atteindre un niveau compatible avec le projet d'investissement, la réglementation applicable et les exigences bancaires actuelles ou futures. L'investisseur rigoureux se pose quatre questions structurantes avant de tirer toute conclusion. 3244 3245La première concerne le coût minimal estimé de mise à niveau vers le label visé. La deuxième porte sur le gain potentiel en valorisation et en liquidité qu'une amélioration pourrait générer. La troisième interroge le délai réglementaire applicable dans la Région concernée. La quatrième question, souvent négligée, porte sur la durée de détention envisagée, car un investisseur qui prévoit de revendre dans trois ans n'a pas les mêmes contraintes qu'un détenteur patr
3245imonial à quinze ans. 3246 3247--- 3248 3249## La dimension financière est cumulative et doit être projetée dans le temps 3250 3251La performance énergétique doit être analysée en coût total de détention et non en charge saisonnière. L'erreur la plus fréquente consiste à limiter l'analyse au prix de la facture annuelle. En immobilier résidentiel, l'horizon économique se mesure sur plusieurs années, généralement sur une décennie. 3252 3253Pour un appartement de 85 m² chauffé au gaz, les ordres de grandeur sont parlants. Un bien classé A engendre un coût énergétique estimé à environ 550 euros par an, soit 5 500 euros sur dix ans. Un bien classé C représente environ 1 800 euros annuels, soit 18 000 euros sur la même période et un différentiel cumulé de 12 500 euros par rapport à la classe A. En classe D, le coût annuel avoisine 2 500 euros et le différentiel décennal atteint près de 20 000 euros. Un bien classé F génère quant à lui un coût annuel proche de 4 000 euros, soit un différentiel cumulé de plus de 34 000 euros sur dix ans par rapport à un bien performant. 3254 3255Ces écarts influencent directement la rentabilité opérationnelle dans le cas d'un investissement locatif, la perception d'un futur acquéreur à la revente et la capacité à négocier le prix d'achat. Les charges d'exploitation ne représentent qu'une fraction du coût total, auquel s'ajoutent les investissements énergétiques nécessaires pour répondre aux futures réglementations régionales. 3256 3257--- 3258 3259## Trois logiques d'investissement observables selon le profil de l'acquéreur 3260 3261La première stratégie, celle de la passoire énergétique à transformer, consiste à acquérir un bien classé F ou G pour le rénover vers un niveau C. Cette approche est réservée aux investisseurs capables d'intégrer des travaux dans leur stratég
3261ie financière. L'objectif est d'obtenir une revalorisation post-rénovation, amplifiée par une meilleure liquidité future. Le risque principal réside dans le dépassement budgétaire des travaux et dans l'allongement des délais de chantier, fréquent en Belgique pour les rénovations lourdes. 3262 3263La deuxième stratégie, patrimoniale et défensive, cible un bien déjà classé B. L'acquéreur recherche la stabilité, la prévisibilité et l'absence d'obligation réglementaire probable à moyen terme. Le potentiel d'amélioration est limité mais le risque à long terme est considérablement réduit. Cette approche convient aux investisseurs qui privilégient le rendement régulier sur la plus-value. 3264 3265La troisième logique, intermédiaire et souvent la plus pertinente pour un investisseur équilibré, vise une amélioration ciblée d'un bien classé D vers la classe C. Elle combine des coûts de travaux modérés, une amélioration mesurable de la performance et un potentiel de valorisation raisonnable. Les primes régionales disponibles en Wallonie, en Flandre et à Bruxelles peuvent contribuer à réduire le coût net de cette transition. 3266 3267--- 3268 3269## Le risque réglementaire et son horizon dans les trois Régions 3270 3271Les trois Régions belges ont annoncé des objectifs de performance qui doivent être atteints dans des délais définis. Un bien situé dans une classe basse peut nécessiter une mise en conformité avant toute revente ou mise en location durable. La Région de Bruxelles-Capitale vise un minimum de classe E à l'horizon 2033. La Wallonie impose le même objectif de classe E mais avec une échéance plus rapprochée, fixée à 2030. La Flandre se distingue par une exigence plus stricte avec un minimum de classe D à atteindre dès 2030. 3272 3273L'acquisition d'un bien à faible PEB ne pose aucun problème en soi, à condition que le coût de mise en conformité soit intégré dans le prix d'achat et dans la stratégie globale. L'investisseur qui ignore ces échéances prend un risque mesurable : celui de devoir engager des travaux non budgétés ou de voir la liquidité de son actif se dégrader à l'approche des dates butoirs. 3274 3275--- 3276 3277## Le PEB comme outil de négociation factuel 3278 3279La négociation fondée sur le PEB doit être structurée et documentée, jamais réduite à un argument générique du type "le PEB est mauvais, donc le prix doit baisser". L'objectif est l'alignement du prix sur la réalité économique, en intégrant la projection énergétique et l'horizon réglementaire dans un raisonnement chiffré. 3280 3281Les décotes généralement observées sur le marché belge varient selon la classe énergétique. Un bien classé C subit une décote de cinq à huit pour cent par rapport à un bien équivalent mieux classé. En classe D, la décote se situe entre huit et douze pour cent. Les biens classés E voient leur prix négocié à la baisse de douze à dix-huit pour cent. Pour les classes F et G, les décotes observées atteignent quinze à vingt-cinq pour cent, selon la localisation et l'état général du bien. 3282 3283La méthodologie recommandée repose sur quatre étapes complémentaires. L'investisseur commence par estimer le coût des travaux sur la base de barèmes au mètre carré adaptés au marché belge. Il projette ensuite les coûts énergétiques sur la durée de détention envisagée. La troisième étape intègre le risque réglementaire dans la proposition chiffrée. Enfin, la formulation d'une offre raisonnée et argumentée, appuyée sur ces données, se révèle généralement plus efficace qu'une simple demande de rabais. 3284 3285--- 3286 3287## Conclusion 3288 3289Le PEB n'est pas un élément administratif secondaire mais une composante fondamentale de l'analyse de valeur et de risque en immobilier résidentiel belge. Il influence la rentabilité, les charges opérationnelles, la liquidité, la conformité réglementaire et la perception du marché. Les trois Régions convergent vers des exigences croissantes, et les banques commencent à en tenir compte dans leurs conditions de financement. 3290 3291Les investisseurs les plus performants ne recherchent pas les biens affichant les meilleurs scores, mais ceux qui présentent le meilleur rapport entre le coût d'amélioration, le potentiel de valorisation et la durée de détention prévue. 3292 3293--- 3294 3295## Intégration Arcanes 3296 3297Arcanes génère une analyse complète incluant les charges énergétiques projetées, l'impact financier des travaux, la valorisation potentielle après amélioration, l'estimation du risque réglementaire régional et des scénarios d'investissement comparatifs. Le rapport est exploitable en quelques minutes et utile lors des visites, des demandes de financement et des négociations. 3298 3299--- 3300 3301## Questions fréquentes 3302 3303### Comment le PEB est-il calculé en Belgique ? 3304 3305Le PEB est calculé selon une méthode de certification qui intègre la qualité d'isolation, le type de chauffage, les performances des châssis, la ventilation et les éventuels systèmes renouvelables. Il s'agit d'un calcul standardisé et théorique, fondé sur des hypothèses normalisées et non sur une mesure du consommation réelle. Le résultat est exprimé en kWh par mètre carré et par an, puis traduit en une lettre allant de A (très performant) à G (très énergivore). 3306 3307### Quelle est la durée de validité d'un certificat PEB en Belgique ? 3308 3309Un certificat PEB est valable dix ans à compter de sa date d'émission, sauf si des travaux d'amélioration énergétique sont réalisés entre-temps. Dans ce cas, un n
3309ouveau certificat peut être demandé pour refléter les performances mises à jour. Lors d'une transaction immobilière, le certificat doit être disponible dès la mise en vente du bien, que ce soit sur Immoweb, Zimmo ou tout autre canal de diffusion. 3310 3311### Un mauvais PEB fait-il baisser le prix d'un bien immobilier ? 3312 3313Un PEB faible peut entraîner une décote liée aux charges énergétiques futures, au risque réglementaire et aux travaux à prévoir. Les décotes observées sur le marché belge varient généralement entre cinq et vingt-cinq pour cent selon la classe, l'état et la localisation du bien. Cette réalité constitue à la fois un risque pour le vendeur et une opportunité pour l'acquéreur capable d'en mesurer l'ampleur. 3314 3315### Le PEB influence-t-il l'accès au crédit hypothécaire ? 3316 3317Certaines banques belges commencent à intégrer des critères liés à la performance énergétique dans leur politique de financement. Elles peuvent proposer des conditions différenciées selon le niveau PEB, notamment pour les biens très énergivores. Cette tendance devrait s'accentuer dans les années à venir avec la prise en compte croissante des risques climatiques dans les portefeuilles immobiliers des établissements financiers. 3318 3319### Peut-on améliorer rapidement un PEB sans rénovation lourde ? 3320 3321Les améliorations les plus rapides concernent l'étanchéité à l'air, la ventilation, certains ajustements de chauffage et l'isolation de points localisés comme les combles ou les conduites. Ces interventions peuvent permettre un gain d'une demi-classe à une classe complète pour un budget limité. Des gains de classe significatifs nécessitent toutefois des travaux portant sur l'enveloppe thermique du bâtiment, comme l'isolation des murs par l'extérieur ou le remplacement complet des châssis. 3322`,VF=`--- 3323title: "Het EPC in België begrijpen: een strategische indicator die de waarde, het risico en de prestaties van een vastgoedinvestering beïnvloedt" 3324slug: "epc-begrijpen-belgie" 3325tag: "EPC" 3326readTime: "10" 3327publishDate: "15 januari 2026" 3328author: "Team Arcanes" 3329excerpt: "Het EPC-certificaat beïnvloedt de waardering, het rendement en het regelgevingsrisico van residentieel vastgoed in België. Volledige strategische analyse." 3330image: "/images/blog/peb-concept-belgium.jpg" 3331--- 3332 3333# Het EPC in België begrijpen: een strategische indicator die de waarde, het risico en de prestaties van een vastgoedinvestering beïnvloedt 3334 3335Gedurende meerdere jaren werd het EPC (Energieprestatiecertificaat) beschouwd als een administratieve formaliteit. De meeste kopers, zowel investeerders als particulieren, raadpleegden het pas in een laat stadium, als een bijkomend element bij het compromis. Die tijd is voorbij. De gegevens van de Federatie van Notarissen en de regelgevende ontwikkelingen in de drie Belgische Gewesten hebben dit document omgevormd tot een volwaardig financieel analyse-instrument. 3336 3337Het EPC functioneert vandaag als een waarderingsmarker, een risico-indicator, een bepalend element voor toekomstige liquiditeit en in sommige gevallen als een onthulling van uitgestelde financiële verplichtingen. De invloed ervan reikt veel verder dan alleen de kwestie van energieverbruik. Het staat centraal in de economische vergelijking van een pand door drie essentiële dimensies te combineren: de exploitatielasten, de regelgevingsverplichtingen en de marktperceptie bij doorverkoop. 3338 3339Het doel is niet automatisch het beste label na te streven, maar de relatie te evalueren tussen de energetische staat van het pand, de kosten van mogelijke verbeteringen, de potentiële toekomstige waarde en de beoogde bezitsduur. 3340 3341--- 3342 3343## Structurerende synthese 3344 3345Het EPC beïnvloedt tegelijkertijd de waardering, de liquiditeit en het onderhandelingsvermogen van een residentieel vastgoedactief in België. Meer dan de helft van het Belgische residentiële vastgoedpark bevindt zich in de klassen E, F of G volgens de gegevens van StatBel, wat betekent dat een meerderheid van de beschikbare activa op Immoweb, Zimmo of Immovlan blootgesteld is aan een groeiend regelgevingsrisico. De verplichtingen inzake energieprestatie worden voorspelbaar, gepland en potentieel duur in de drie Gewesten. Een winst van twee EPC-klassen kan een herwaardering genereren van acht tot vijftien procent, afhankelijk van het type pand en de locatie. De banken integreren geleidelijk energieprestaties in hun risicoanalyse, wat het gewicht van deze indicator in de investeringsbeslissing verder versterkt. 3346 3347Om te begrijpen hoe het EPC zich integreert in het volledige aankoopproces â kosten, financiering, registratierechten en checklist â raadpleeg onze [complete gids voor vastgoed kopen in België in 2026](/blog/acheter-bien-immobilier-belgique-2026). 3348 3349--- 3350 3351## Wat het EPC meet en wat het niet meet 3352 3353In tegenstelling tot een hardnekkig misverstand meet het EPC niet de werkelijke verwarmingsfactuur of het ervaren comfort in de woning. Het vormt een vergelijkend technisch referentiekader op basis van genormaliseerde hypotheses. Het certificaat geeft de theoretische energieprestatie van het gebou
3353w aan, onafhankelijk van het profiel van de bewoners, hun verbruiksgewoonten of de strengheid van de winter. 3354 3355De berekening houdt rekening met de kwaliteit van de thermische isolatie van het dak, de muren en de vloer, de prestaties van het geïnstalleerde verwarmingssysteem, het type en de efficiëntie van de raamkozijnen en beglazing, het niveau van luchtdichtheid en de eventuele aanwezigheid van systemen voor hernieuwbare energie. Daarentegen weerspiegelt het certificaat noch het werkelijke verbruik gerelateerd aan de gewoonten van de bewoners, noch de uitvoeringskwaliteit van eerder uitgevoerde werken, noch de voorzienbare veroudering van installaties, noch de niet-energetische technische risico's zoals asbest, vocht of structurele pathologieën. 3356 3357Het EPC moet daarom worden gelezen als een indicator van potentieel en toekomstige inspanning, nooit als een projectie van de factuur. De waarde van het certificaat schuilt in zijn vergelijkende en genormaliseerde functie, waarmee een actief kan worden gesitueerd ten opzichte van de markt en de regelgevende eisen. 3358 3359--- 3360 3361## De letter alleen volstaat niet: het EPC lezen als een investeerder 3362 3363De letter op het certificaat vormt geen verdict maar een vertrekpunt. De sleutelvariabele is de progressie-inspanning die nodig is om een niveau te bereiken dat compatibel is met het investeringsproject, de toepasselijke regelgeving en de huidige of toekomstige bankeisen. De rigoureuze investeerder stelt vier structurerende vragen voordat hij enige conclusie trekt. 3364 3365De eerste betreft de minimale geschatte kosten van opwaardering naar het beoogde label. De tweede gaat over de potentiële winst in waardering en liquiditeit die een verbetering zou kunnen opleveren. De derde bevraagt de regelgevingstermijn die van toepassing is in het betreffende Gewest. De vierde vraag, die vaak wordt verwaarloosd, betreft de beoogde bezitsduur, want een investeerder die binnen drie jaar wil doorverkopen heeft niet dezelfde beperkingen als een patrimoniumbezitter op vijftien jaar. 3366 3367--- 3368 3369## De financiële dimensie is cumulatief en moet in de tijd worden geprojecteerd 3370 3371Energieprestaties moeten worden geanalyseerd in totale bezitskosten en niet in seizoensgebonden lasten. De meest voorkomende fout is het beperken van de analyse tot de prijs van de jaarlijkse factuur. In residentieel vastgoed wordt de economische horizon over meerdere jaren gemeten, doorgaans over een decennium. 3372 3373Voor een appartement van 85 m² verwarmd met gas zijn de ordes van grootte veelzeggend. Een pand in klasse A genereert een geschat energiekost van ongeveer 550 euro per jaar, ofwel 5.500 euro over tien jaar. Een pand in klasse C vertegenwoordigt ongeveer 1.800 euro per jaar, ofwel 18.000 euro over dezelfde periode en een cumulatief verschil van 12.500 euro ten opzichte van klasse A. In klasse D benadert de jaarlijkse kost 2.500 euro en bereikt het decennale verschil bijna 20.000 euro. Een pand in klasse F genereert een jaarlijkse kost van bijna 4.000 euro, ofwel een cumulatief verschil van meer dan 34.000 euro over tien jaar vergeleken met een performant pand. 3374 3375Deze verschillen beïnvloeden rechtstreeks de operationele rendabiliteit bij een huurinvestering, de perceptie van een toekomstige koper bij doorverkoop en het vermogen om over de aankoopprijs te onderhandelen. De exploitatielasten vertegenwoordigen slechts een fractie van de totale kosten, waaraan de energetische investeringen worden toegevoegd die nodig zijn om te voldoen aan toekomstige gewestelijke regelgeving. 3376 3377--- 3378 3379## Drie waarneembare investeringslogica's volgens het kopersprofiel 3380 3381De eerste strategie, die van de energieverslinder om te transformeren, bestaat erin een pand in klasse F of G aan te kopen om het te renoveren naar niveau C. Deze aanpak is voorbehouden aan investeerders die werken kunnen integreren in hun financiële strategie. Het doel is een herwaardering na renovatie te verkrijgen, versterkt door een betere toekomstige liquiditeit. Het belangrijkste risico ligt in de budgetoverschrijding van de werken en in de verlenging van de bouwtermijnen, wat in België frequent voorkomt bij zware renovaties. 3382 3383De tweede strategie, patrimoniaal en defensief, richt zich op een pand dat reeds in klasse B is geclassificeerd. De koper zoekt stabiliteit, voorspelbaarheid en afwezigheid van waarschijnlijke regelgevende verplichting op middellange termijn. Het verbeteringspotentieel is beperkt maar het langetermijnrisico is aanzienlijk verminderd. Deze benadering past bij investeerders die regelmatig rendement verkiezen boven meerwaarde. 3384 3385De derde logica, tussenliggend en vaak het meest relevant voor een evenwichtige investeerder, mikt op een gerichte verbetering van een pand in klasse D naar klasse C. Ze combineert gematigde werkkosten, een meetbare prestatieverbetering en een redelijk
3385waarderingspotentieel. De gewestelijke premies die beschikbaar zijn in Wallonië, Vlaanderen en Brussel kunnen bijdragen tot de verlaging van de nettokosten van deze transitie. 3386 3387--- 3388 3389## Het regelgevingsrisico en zijn horizon in de drie Gewesten 3390 3391De drie Belgische Gewesten hebben prestatiedoelstellingen aangekondigd die binnen vastgestelde termijnen moeten worden bereikt. Een pand in een lage klasse kan een conformiteitsinspanning vereisen vóór elke doorverkoop of duurzame verhuur. Het Brussels Hoofdstedelijk Gewest mikt op een minimum van klasse E tegen 2033. Wallonië legt dezelfde doelstelling van klasse E op maar met een vroegere deadline, vastgesteld op 2030. Vlaanderen onderscheidt zich door een strengere eis met een minimum van klasse D dat reeds tegen 2030 moet worden bereikt. 3392 3393De aankoop van een pand met een laag EPC vormt op zich geen probleem, op voorwaarde dat de kosten voor naleving zijn geïntegreerd in de aankoopprijs en in de globale strategie. De investeerder die deze deadlines negeert neemt een meetbaar risico: dat van niet-gebudgetteerde werken te moeten uitvoeren of de liquiditeit van zijn actief te zien verslechteren naarmate de deadlines naderen. 3394 3395--- 3396 3397## Het EPC als feitelijk onderhandelingsinstrument 3398 3399De onderhandeling op basis van het EPC moet gestructureerd en gedocumenteerd zijn, nooit gereduceerd tot een generiek argument als "het EPC is slecht, dus de prijs moet dalen". Het doel is de afstemming van de prijs op de economische realiteit, door de energieprojectie en de regelgevingshorizon te integreren in een becijferde redenering. 3400 3401De kortingen die doorgaans worden waargenomen op de Belgische markt variëren volgens de energieklasse. Een pand in klasse C ondergaat een korting van vijf tot acht procent ten opzichte van een gelijkwaardig beter geclassificeerd pand. In klasse D situeert de korting zich tussen acht en twaalf procent. Panden in klasse E zien hun prijs naar beneden onderhandeld worden met twaalf tot achttien procent. Voor de klassen F en G bereiken de waargenomen kortingen vijftien tot vijfentwintig procent, afhankelijk van de locatie en de algemene staat van het pand. 3402 3403De aanbevolen methodologie berust op vier complementaire stappen. De investeerder begint met het schatten van de werkkosten op basis van barema's per vierkante meter, aangepast aan de Belgische markt. Vervolgens projecteert hij de energiekosten over de beoogde bezitsduur. De derde stap integreert het regelgevingsrisico in het becijferde voorstel. Ten slotte blijkt de formulering van een beredeneerd en beargumenteerd bod, gebaseerd op deze gegevens, doorgaans effectiever dan een eenvoudig verzoek om prijsverlaging. 3404 3405--- 3406 3407## Conclusie 3408 3409Het EPC is geen secundair administratief element maar een fundamentele component van de waarde- en risicoanalyse in het Belgische residentiële vastgoed. Het beïnvloedt de rendabiliteit, de operationele lasten, de liquiditeit, de regelgevingsconformiteit en de marktperceptie. De drie Gewesten convergeren naar stijgende eisen, en de banken beginnen er rekening mee te houden in hun financieringsvoorwaarden. 3410 3411De best presterende investeerders zoeken niet naar panden met de beste scores, maar naar panden die de beste verhouding bieden tussen verbeteringskosten, waarderingspotentieel en de voorziene bezitsduur. 3412 3413--- 3414 3415## Arcanes Integratie 3416 3417Arcanes genereert een volledige analyse inclusief geprojecteerde energielasten, financiële impact van werken, potentiële waardering na verbetering, schatting van het gewestelijk regelgevingsrisico en vergelijkende investeringsscenario's. Het rapport is binnen enkele minuten bruikbaar en nuttig tijdens bezichtigingen, financieringsaanvragen en onderhandelingen. 3418 3419--- 3420 3421## Veelgestelde vragen 3422 3423### Hoe wordt het EPC in België berekend? 3424 3425Het EPC wordt berekend volgens een certificeringsmethode die de isolatiekwaliteit, het type verwarming, de prestaties van de raamkozijnen, de ventilatie en de eventuele hernieuwbare systemen integreert. Het betreft een gestandaardiseerde en theoretische berekening, gebaseerd op genormaliseerde hypotheses en niet op een meting van het werkelijke verbruik. Het resultaat wordt uitgedrukt in kWh per vierkante meter per jaar en vervolgens vertaald naar een letter van A (zeer performant) tot G (zeer energie-intensief). 3426 3427### Wat is de geldigheidsduur van een EPC-certificaat in België? 3428
3429Een EPC-certificaat is geldig voor tien jaar vanaf de datum van afgifte, tenzij er tussentijds energieverbeteringswerken worden uitgevoerd. In dat geval kan een nieuw certificaat worden aangevraagd om de bijgewerkte prestaties weer te geven. Bij een vastgoedtransactie moet het certificaat beschikbaar zijn vanaf het moment dat het pand te koop wordt aangeboden, of dat nu via Immoweb, Zimmo of een ander kanaal is. 3430 3431### Verlaagt een slecht EPC de prijs van een vastgoed? 3432 3433Een laag EPC kan leiden tot een korting gerelateerd aan toekomstige energielasten, regelgevingsrisico en te voorziene werken. De waargenomen kortingen op de Belgische markt variëren doorgaans tussen vijf en vijfentwintig procent, afhankelijk van de klasse, de staat en de locatie van het pand. Deze realiteit vormt zowel een risico voor de verkoper als een kans voor de koper die in staat is de omvang ervan in te schatten. 3434 3435### Beïnvloedt het EPC de toegang tot hypothecair krediet? 3436 3437Sommige Belgische banken beginnen criteria gerelateerd aan energieprestaties te integreren in hun financieringsbeleid. Ze kunnen gedifferentieerde voorwaarden aanbieden naargelang het EPC-niveau, met name voor zeer energie-intensieve panden. Deze trend zal naar verwachting toenemen in de komende jaren met de groeiende aandacht voor klimaatrisico's in de vastgoedportefeuilles van financiële instellingen. 3438 3439### Kan men het EPC snel verbeteren zonder zware renovatie? 3440 3441De snelste verbeteringen betreffen de luchtdichtheid, de ventilatie, bepaalde verwarmingsaanpassingen en de isolatie van gelokaliseerde punten zoals zolders of leidingen. Deze ingrepen kunnen een winst opleveren van een halve tot een volledige klasse voor een beperkt budget. Significante klassewinsten vereisen echter werken aan de thermische enveloppe van het gebouw, zoals buitenmuurisolatie of volledige vervanging van de raamkozijnen. 3442`,WF=`--- 3443title: "EPC discount in Belgium: how the energy label impacts the price of your property in 2026" 3444slug: "decote-peb-belgique-impact-prix-immobilier" 3445tag: "Ãnergie" 3446readTime: "8" 3447publishDate: "March 13, 2026" 3448author: "Arcanes Team" 3449excerpt: "In Belgium, an A-rated house sells for up to 18.6% more than a comparable D. Measured impact of the energy label on prices in Wallonia, Brussels and Flanders â 2026 coefficients." 3450image: "/images/blog/decote-peb.jpg" 3451--- 3452 3453# EPC discount in Belgium: how the energy label impacts the price of your property in 2026 3454 3455In Belgium, all else being equal, **an A-rated house sells for an average of 18.6% more in Flanders** than a comparable D-rated one â and 12% more in Wallonia. Conversely, energy-inefficient properties trade at a discount: â10.4% for a Flemish F, â8.3% for a Walloon G. This is no longer a projection â these are gaps measured on actual transactions (Immoweb 2026 study, comparing similar property types, locations and surface areas). 3456 3457What this data reveals: the energy label has become a pricing parameter in its own right, just like surface area or location, and **the three Belgian regions are not playing the same game** â neither in price gaps nor in rules. An identical property at 280 kWh/sqm/year receives a C label in Flanders, a D in Wallonia, and an F in Brussels. An investor who ignores this double reality takes a measurable financial risk. We published a [complete 11-slide analysis on LinkedIn](https://www.linkedin.com/posts/arcanes-be_la-dette-invisible-enqu%C3%AAte-peb-activity-7435696415412162561-P9gf) â this article updates it with the 2026 coefficients. 3458 3459--- 3460 3461## What you will learn in this article 3462 3463- The measured impact of the EPC on property prices, region by region, in 2026 3464- Why the three regions give three different labels for the same consumption 3465- How regulation turned the label into a financial parameter 3466- Which strategy to adopt depending on whether your property is in Flanders, Wallonia or Brussels 3467- How to simulate the true cost of an energy sieve before buying 3468 3469--- 3470 3471## The brown discount: the gaps measured in 2026 3472 3473### What the EPC label really weighs on the price 3474 3475The "brown discount" â the loss in value linked to a poor label â and its mirror image, the green premium, can now be measured precisely. The gaps below come from the Immoweb 2026 study, all else being equal, and are the ones our valuation engine applies after calibration on the official regional scales: 3476 3477| Region | Measured gap | Comparison | 3478| -------- | ------------ | ------------ | 3479| Flanders | **+18.6%** | house A vs D | 3480| Wallonia | **+12%** | house A vs D | 3481| Brussels | **+12.2%** | label B vs D | 3482| Flanders | **â10.4%** | label F vs D | 3483| Wallonia | **â8.3%** | label G vs D | 3484 3485Other barometers converge towards the same orders of magnitude: Test-Achats measured â11.7% for a Flemish F in 2025, and the 2024 Notary Barometer estimated the discount on Brussels energy sieves at â15 to â20% depending on the neighbourhood. Methodologies differ; the direction never does: **every successive measurement confirms that the market penalises energy-inefficient properties** â and regulatory pressure only moves one way. 3486 3487On a â¬350,000 Walloon house rated D, the gap between a comparable A and G thus represents roughly â¬70,000 â for the same building, energy performance aside. 3488 3489### Why Europe is accelerating 3490 3491The European EPBD III directive (2024/1275) obliges member states to impose renovation obligations on energy sieves. But it was the invasion of Ukraine in February 2022 that changed everything: before, the energy transition was steered by the C
3491ommission with 2050 as the horizon and mainly incentive-based levers; after, national states took control with 2030-2035 as the new deadline. What was supposed to take ten years was decided in ten months. 3492 3493European comparisons confirm the direction: in France, G labels have been banned from the rental market since 2025 and discounts reach â25% in some regions; in Germany, the GEG 2024 mandates 65% renewable energy for any new heating system; in the Netherlands, banks directly adjust their mortgage rates based on the label. 3494 3495--- 3496 3497## The 280 kWh trap: three regions, three different labels 3498 3499This is the most underestimated point by Belgian buyers and investors. **280 kWh/sqm/year yields three different labels depending on the region** â and therefore three different price impacts. 3500 3501| Region | Share of stock pre-1945 | Label for 280 kWh/sqm/year | Status | 3502| -------- | ----------------------- | -------------------------- | ------------- | 3503| Flanders | 25.8% | **C** | Compliant | 3504| Wallonia | 47.4% | **D** | Warning zone | 3505| Brussels | 65.5% | **F** | Non-compliant | 3506 3507Each Belgian region has calibrated its EPC scale on the age of its own building stock. A C-rated property in Flanders and an F-rated property in Brussels can have exactly the same actual consumption. An investor who compares labels across regions without this key misjudges the value structurally. 3508 3509--- 3510 3511## Impact by region: measured gaps, obligations and concrete levers 3512 3513### Flanders: the market has already priced in the EPC 3514 3515In Flanders, the price signal anticipates the law: **+18.6% for an A vs D, â10.4% for an F** â the widest gaps in the country. The negotiation window on D-E properties is gradually closing. 3516 3517**Current obligations:** minimum D label mandatory within 6 years of purchase. Easing in 2025 with the postponement of the A obligation to 2045. 3518 3519**Lever:** renovation premiums up to â¬15,000. Progressive fines for persistent non-compliance. 3520 3521### Wallonia: timing favours the informed buyer 3522 3523Renovation obligations upon sale have been postponed in Wallonia â creating a **temporary gap between the actual risk and the market price**. The discount there is real (â8.3% for a G vs D) but less pronounced than in Flanders: the Walloon market has not yet priced in the full weight of the coming obligations. 3524 3525**Exceptional tax lever:** reduced registration duties (12.5% â 3% for a sole own home) represent savings of around â¬26,000 on a â¬275,000 purchase. 3526 3527### Brussels: maximum constraint, but also maximum rental demand 3528 3529With 93% of its building stock dating from before 1981, Brussels is the most exposed region: **65% of the Brussels stock will be non-compliant by 2033**. The market already values performance (+12.2% for a B vs D), and notary barometers measure discounts of â15 to â20% on energy sieves depending on the neighbourhood. 3530 3531**Obligations:** minimum E label mandatory in 2033, C label in 2045. 3532 3533--- 3534 3535## Wealth simulation: renovating a Walloon energy sieve 3536 3537Renovation is not an expense â it is a wealth repositioning. Here is a simulation using the 2026 measured gaps, on a Walloon property rated G. 3538 3539**Scenario:** Walloon house that would be worth â¬300,000 once renovated (B label), currently rated G. 3540 3541| Item | Estimated amount | 3542| ---------------------------------------------------------------- | -------------------------- | 3543| Actual purchase price (G discount, â8.3% applied to the segment) | ~â¬275,000 | 3544| G â B renovation (insulation, heat pumpâ¦) | ââ¬60,000 to ââ¬90,000 | 3545| Recoverable regional premiums | +â¬10,000 to +â¬20,000 | 3546| Registration duties savings (3% vs 12.5% on â¬275,000) | ~â¬26,000 | 3547| **Total net investment** | **~â¬299,000 to ~â¬319,000** | 3548| **Post-renovation value (B label)** | **~â¬300,000 to ~â¬330,000** | 3549 3550The honest reading of this table: the operation does not generate speculative profit â the gain comes from the premiums and the Walloon tax lever, and it **protects against the programmed erosion** of an unrenovated property's value, whose discount can only grow as regulatory deadlines approach. The calculation tips far more favourably if the actual quote comes in below the upper range â hence the importance of obtaining it _before_ making an offer. 3551 3552_Indicative simulation. Consult a certified auditor for a personalised quote._ 3553 3554--- 3555 3556## 6 key takeaways on the EPC and Belgian real estate 3557 35581. **The brown discount is a measured market fact** â up to â10.4% in Flanders for an F, and A-vs-D gaps reaching +18.6%. 35592. **Building age dictates the EPC rules** â 47% of Walloon stock and 65% of Brussels stock built before any thermal standards. 35603. **280 kWh = three different labels depending on the region** â inter-regional comparisons are flawed without this key. 35614. **Geopolitics accelerated everything** â 2022 turned the energy transition into a matter of national sovereignty. 35625. **Each region offers a specific lever** â market maturity in Flanders, tax timing in Wallonia, structural rental demand in Brussels. 35636. **Valuing without integrating the EPC distorts the analysis** â the label is a pricing parameter just like surface area or location, and its weight is measured region by region, never nationally. 3564 3565--- 3566 3567## Frequently asked questions on the EPC and property value in Belgium 3568 3569### What is the discount for an energy sieve in Belgium in 2026? 3570 3571All else being equal, an F label trades â10.4% below a comparable D in Flanders, and a G â8.3% below a D in Wallonia (Immoweb 2026 study). In Brussels, notary barometers measure discounts of â15 to â20% on energy sieves depending on the neighbourhood. Conversely, an A-rated house sells +18.6% above a D in Flanders and +12% in Wallonia. 3572 3573### Is the EPC mandatory to sell in Belgium? 3574 3575Yes. The EPC certificate is mandatory for any real estate transaction â sale or rental. The absence of an EPC in a listing is a red flag: either the assessment hasn't been done, or the seller is avoiding disclosing a poor score. 3576 3577### Does a poor EPC prevent you from selling your property? 3578 3579No, but it translates into a measurable discount and, depending on the region, renovation obligations borne by the buyer within a specific timeframe (6 years in Flanders to reach a D label). In Wallonia, sales obligations have been postponed, but the price pressure is already present. 3580 3581### Why does the same property have a different label depending on the Belgian region? 3582 3583Each region calibrates its EPC scale on the age and characteristics of its own housing stock. Brussels, where 65% of buildings predate 1945, has broadened its F category. Flanders, with newer stock, applies a stricter scale. The result: 280 kWh/sqm/year corresponds to a C label in Flanders, a D in Wallonia and an F in Brussels. 3584 3585### How do you know if a property is worth the energy renovation investment? 3586 3587Compare the discounted purchase price, the actual renovation cost (a quote, not an estimate), the recoverable premiums and the post-renovation value. In Wallonia, the 3% registration duties represent roughly â¬26,000 in savings on a â
3587¬275,000 purchase â enough to absorb a significant portion of the works budget. 3588 3589--- 3590 3591## Integrate the EPC into your property analysis with Arcanes 3592 3593The EPC label is one of the parameters automatically analysed in every Arcanes report, using the regional 2026 coefficients presented in this article. By entering the URL of an Immoweb listing, you get a complete analysis integrating the property's energy positioning, the applicable regional regulatory obligations, net and net-net yield, and the municipality's market data. 3594 3595**â [Analyse a property for free on arcanes.be](https://arcanes.be?utm_source=blog&utm_medium=article&utm_campaign=decote-peb-2026)** 3596 3597_Free analysis · Updated data · No commitment_ 3598 3599Selling rather than investing? Two resources: our analysis [should you improve your EPC before selling?](https://arcanes.be/blog/renover-peb-avant-de-vendre), and your [free property valuation](https://arcanes.be/ma-vraie-valeur?utm_source=blog&utm_medium=article&utm_campaign=decote-peb-2026) â with the EPC renovation simulator calculated for your municipality. 3600 3601--- 3602 3603_Sources: Immoweb 2026 study (gaps at equal characteristics) · Statbel · 2024 Notary Barometer · Test-Achats 2025 · SPW Ãnergie · Bruxelles Environnement · VEKA · EPBD III Directive (2024/1275) · GEG 2024 · French Climate Law. The data and simulations presented are indicative and do not constitute investment advice. Consult a certified professional for a personalised analysis._ 3604`,UF=`--- 3605title: "Décote PEB en Belgique : comment le label énergétique impacte le prix de votre bien en 2026" 3606slug: "decote-peb-belgique-impact-prix-immobilier" 3607tag: "Marché" 3608readTime: "8" 3609publishDate: "13 Mars 2026" 3610author: "Ãquipe Arcanes" 3611excerpt: "En Belgique, une maison classée A se vend jusqu'à 18,6 % plus cher qu'une D comparable. Impact mesuré du label énergétique sur les prix en Wallonie, à Bruxelles et en Flandre â coefficients 2026." 3612image: "https://api.arcanes.be/storage/v1/object/public/blog/arcanes_v8_slide_01.png" 3613imageVersion: "fr-2026-07-21-01" 3614imageAlt: "Graphique montrant l'impact du label PEB sur les prix immobiliers en Belgique en 2026" 3615--- 3616 3617# Décote PEB en Belgique : comment le label énergétique impacte le prix de votre bien en 2026 3618 3619En Belgique, à caractéristiques égales, **une maison classée A se vend en moyenne 18,6 % plus cher en Flandre** qu'une maison comparable classée D â et 12 % plus cher en Wallonie. à l'inverse, les biens énergivores décotent : â10,4 % pour un F flamand, â8,3 % pour un G wallon. Ce n'est plus une projection â ce sont des écarts mesurés sur les transactions (étude Immoweb 2026, à type de bien, localisation et surface comparables). 3620 3621Ce que révèlent ces données : le label énergétique est devenu un paramètre de prix au même titre que la surface ou la localisation, et **les trois régions belges ne jouent pas la même partition** â ni dans les écarts de prix, ni dans les règles. Un bien identique à 280 kWh/m².an reçoit un label C en Flandre, D en Wallonie, et F à Bruxelles. Un investisseur qui ignore cette double réalité prend un risque patrimonial mesurable. Nous avions publié une [analyse complète en 11 slides sur LinkedIn](https://www.linkedin.com/posts/arcanes-be_la-dette-invisible-enqu%C3%AAte-peb-activity-7435696415412162561-P9gf) â cet article la met à jour avec les coefficients 2026. 3622 3623--- 3624 3625## Ce que vous allez apprendre dans cet article 3626 3627- L'impact mesuré du PEB sur le prix d'un bien, région par région, en 2026 3628- Pourquoi les trois régions donnent trois labels différents pour une même consommation 3629- Comment la réglementation a transformé le label en paramètre financier 3630- Quelle stratégie adopter selon que votre bien est en Flandre, en Wallonie ou à Bruxelles 3631- Comment simuler le vrai coût d'une passoire énergétique avant d'acheter 3632 3633--- 3634 3635## La décote brune : les écarts mesurés en 2026 3636 3637### Ce que le label PEB pèse réellement sur le prix 3638 3639La « décote brune » â la perte de valeur liée à un mauvais label â et son miroir, la prime verte, se mesurent désormais avec précision. Les écarts ci-dessous sont issus de l'étude Immoweb 2026, à caractéristiques égales, et sont ceux que notre moteur d'estimation applique après calibration sur les grilles régionales officielles : 3640 3641| Région | Ãcart mesuré | Comparaison | 3642| --------- | ------------ | ------------- | 3643| Flandre | **+18,6 %** | maison A vs D | 3644| Wallonie | **+12 %** | maison A vs D | 3645| Bruxelles | **+12,2 %** | label B vs D | 3646| Flandre | **â10,4 %** | label F vs D | 3647| Wallonie | **â8,3 %** | label G vs D | 3648 3649D'autres baromètres convergent vers les mêmes ordres de grandeur : Test-Achats mesurait â11,7 % pour un F flamand en 2025, et le Baromètre des Notaires 2024 estimait la décote des passoires bruxelloises entre â15 et â20 % selon les quartiers. Les méthodologies diffèrent, la direction jamais : **chaque mesure successive confirme que le marché pénalise les biens énergivores** â et la pression réglementaire ne va que dans un sens. 3650 3651Sur une maison wallonne à 350 000 ⬠en classe D, l'écart entre un A et un G comparables représente ainsi environ 70 000 ⬠â pour le même bâtiment, à la performance énergétique près. 3652 3653### Pourquoi l'Europe accélère le mouvement 3654 3655La directive européenne EPBD III (2024/1275) oblige les Ãtats membres à imposer des obligations de rénovation sur les passoires énergétiques. Mais c'est l'invasion de l'Ukraine en février 2022 qui a tout basculé : avant, la transition énergétique était pilotée par la Commission avec 2050 comme horizon et des leviers incitatifs ; après, les Ãtats ont pris le contrôle avec 2030-2035 comme nouvelle échéance. Ce qui devait prendre dix ans s'est décidé en dix mois. 3656 3657La comparaison européenne confirme la direction : en France, les labels G sont interdits à la location depuis 2025 et les décotes atteignent â25 % dans certaines régions ; en Allemagne, le GEG 2024 impose 65 % d'énergies renouvelables pour tout nouveau chauffage ; aux Pays-Bas, les banques ajustent directement leurs taux de crédit selon le label. 3658 3659--- 3660 3661## Le piège des 280 kWh : trois régions, trois labels différents 3662 3663C'est le point le plus sous-estimé par les acheteurs et investisseurs belges. **280 kWh/m².an donne trois labels différents selon la région** â et donc trois impacts prix différents. 3664 3665| Région | Part du parc avant 1945 | Label pour 280 kWh/m².an | Statut | 3666| --------- | ----------------------- | ------------------------ | ------------- | 3667| Flandre | 25,8 % | **C** | Conforme | 3668| Wallonie | 47,4 % | **D** | Zone d'alerte | 3669| Bruxelles | 65,5 % | **F** | Non-conforme | 3670 3671Chaque région belge a calibré son échelle PEB sur l'âge de son propre parc immobilier. Un bien C en Flandre et un bien F à Bruxelles peuvent avoir exactement la même consommation réelle. Un investisseur qui compare les labels d'une région à l'autre sans cette clé de lecture se trompe structurellement sur la valeur. 3672 3673--- 3674 3675## Impact par région : écarts mesurés, obligations et leviers concrets 3676 3677### Flandre : le marché a déjà intégré le PEB 3678 3679En Flandre, le signal prix anticipe la loi : **+18,6 % pour un A vs D, â10,4 % pour un F** â les écarts les plus marqués du pays. La fenêtre de négociation sur les biens D-E se referme progressivement. 3680 3681**Obligations actuelles :** label D minimum obligatoire dans les 6 ans suivant l'achat. Assouplissement en 2025 avec report de l'obligation A à 2045. 3682 3683**Levier :** primes de rénovation jusqu'à 15 000 â¬. Amende progressive en cas de non-conformité persistante. 3684 3685### Wallonie : le timing joue en faveur de l'acheteur informé 3686 3687Les obligations de rénovation à la vente ont été reportées en Wallonie â ce qui crée un **décalage temporaire entre le risque réel et le prix de marché**. La décote y est réelle (â8,3 % pour un G vs D) mais moins prononcée qu'en Flandre : le marché wallon n'a pas encore intégré toute la contrainte à venir. 3688 3689**Levier fiscal exceptionnel :** les droits d'enregistrement réduits (12,5 % â 3 % pour l'habitation propre et unique) représentent une économie de l'ordre de 26 000 ⬠sur un achat à 275 000 â¬. 3690 3691### Bruxelles : contrainte maximale, demande locative aussi 3692 3693Avec 93 % du parc antérieur à 1981, Bruxelles est la région la plus exposée : **65 % du parc bruxellois sera non-conforme en 2033**. Le marché y valorise déjà la performance (+12,2 % pour un B vs D), et les baromètres notariaux mesurent des décotes de â15 à â20 % sur les passoires selon les quartiers. 3694 3695**Obligations :** label E minimum obligatoire en 2033, label C en 2045. 3696 3697--- 3698 3699## Simulation patrimoniale : rénover une passoire wallonne 3700 3701La rénovation n'est pas une dépense â c'est un repositionnement patrimonial. Voici une simulation avec les écarts mesurés 2026, sur un bien wallon classé G. 3702 3703**Hypothèse :** maison wallonne qui vaudrait 300 000 ⬠une fois rénovée (label B), actuellement classée G. 3704 3705| Poste | Montant estimé | 3706| -------------------------------------------------------------- | ------------------------- | 3707| Prix d'achat réel (décote G, â8,3 % appliquée au segment) | ~275 000 ⬠| 3708| Rénovation G â B (isolation, pompe à chaleurâ¦) | â60 000 à â90 000 ⬠| 3709| Primes régionales récupérables | +10 000 à +20 000 ⬠| 3710| Ãconomie droits d'enregistrement (3 % vs 12,5 % sur 275 000 â¬) | ~26 000 ⬠| 3711| **Investissement total net** | **~299 000 à ~319 000 â¬** |
3712| **Valeur post-rénovation (label B)** | **~300 000 à ~330 000 â¬** | 3713 3714La lecture honnête de ce tableau : l'opération ne dégage pas un profit spéculatif â le gain vient des primes et du levier fiscal wallon, et il **protège contre l'érosion programmée** de la valeur d'un bien non rénové, dont la décote ne peut que croître à mesure que les échéances réglementaires approchent. Le calcul bascule bien plus favorablement si le devis réel sort sous la fourchette haute â d'où l'importance de le faire établir _avant_ l'offre. 3715 3716_Simulation indicative. Consultez un auditeur agréé pour un devis personnalisé._ 3717 3718--- 3719 3720## 6 points clés à retenir sur le PEB et l'immobilier belge 3721 37221. **La décote brune est un fait de marché mesuré** â jusqu'à â10,4 % en Flandre pour un F, et des écarts A vs D qui atteignent +18,6 %. 37232. **L'âge du bâti dicte les règles PEB** â 47 % du parc wallon et 65 % du parc bruxellois construits avant toute norme thermique. 37243. **280 kWh = trois labels différents selon la région** â la comparaison inter-régionale est faussée sans cette clé de lecture. 37254. **La géopolitique a tout accéléré** â 2022 a transformé la transition énergétique en question de souveraineté nationale. 37265. **Chaque région offre un levier spécifique** â maturité du marché en Flandre, timing fiscal en Wallonie, demande locative à Bruxelles. 37276. **Estimer sans intégrer le PEB, c'est fausser l'analyse** â le label est un paramètre de prix au même titre que la superficie ou la localisation, et son poids se mesure région par région, jamais nationalement. 3728 3729--- 3730 3731## Questions fréquentes sur le PEB et la valeur immobilière en Belgique 3732 3733### Quelle est la décote d'une passoire énergétique en Belgique en 2026 ? 3734 3735à caractéristiques égales, un label F se négocie â10,4 % sous un D comparable en Flandre, et un G â8,3 % sous un D en Wallonie (étude Immoweb 2026). à Bruxelles, les baromètres notariaux mesurent des décotes de â15 à â20 % sur les passoires selon les quartiers. à l'inverse, une maison A se vend +18,6 % au-dessus d'une D en Flandre et +12 % en Wallonie. 3736 3737### Le PEB est-il obligatoire pour vendre en Belgique ? 3738 3739Oui. Le certificat PEB est obligatoire pour toute transaction immobilière â vente ou location. L'absence de PEB dans une annonce est un signal d'alerte : soit le diagnostic n'a pas été réalisé, soit le vendeur évite de communiquer un mauvais score. 3740 3741### Un mauvais PEB empêche-t-il de vendre son bien ? 3742 3743Non, mais il se traduit par une décote mesurable et, selon la région, par des obligations de rénovation à charge de l'acheteur dans un délai déterminé (6 ans en Flandre pour atteindre le label D). En Wallonie, les obligations à la vente ont été reportées, mais la pression sur les prix existe déjà . 3744 3745### Pourquoi le même bien a-t-il un label différent selon la région belge ? 3746 3747Chaque région calibre son échelle PEB sur l'âge et les caractéristiques de son propre parc. Bruxelles, dont 65 % du bâti date d'avant 1945, a élargi sa catégorie F. La Flandre, avec un parc plus récent, applique une échelle plus stricte. Résultat : 280 kWh/m².an correspond à un label C en Flandre, D en Wallonie et F à Bruxelles. 3748 3749### Comment savoir si un bien vaut l'investissement en rénovation énergétique ? 3750 3751Il faut comparer le prix d'achat avec décote, le coût réel de rénovation (devis, pas estimation), les primes récupérables et la valeur post-rénovation. En Wallonie, les droits d'enregistrement à 3 % représentent environ 26 000 ⬠d'économie sur un achat à 275 000 ⬠â de quoi absorber une partie significative du budget travaux. Et pour comprendre pourquoi deux estimations du même bien peuvent diverger, [notre analyse des estimations en ligne](https://arcanes.be/blog/estimation-immobiliere-en-ligne-prix-differents) détaille ce qu'il faut exiger d'un chiffre. 3752 3753--- 3754 3755## Intégrez le PEB dans votre analyse immobilière avec Arcanes 3756 3757Le label PEB fait partie des paramètres analysés automatiquement dans chaque rapport Arcanes, avec les coefficients régionaux 202
37576 présentés dans cet article. En entrant l'URL d'une annonce Immoweb, vous obtenez une analyse complète intégrant le positionnement énergétique du bien, les obligations réglementaires applicables par région, le rendement net et net-net, et les données de marché de la commune. 3758 3759**â [Analyser un bien gratuitement sur arcanes.be](https://arcanes.be?utm_source=blog&utm_medium=article&utm_campaign=decote-peb-2026)** 3760 3761_Analyse gratuite · Données actualisées · Aucun engagement_ 3762 3763Propriétaire vendeur plutôt qu'investisseur ? Deux ressources : notre analyse [faut-il rénover son PEB avant de vendre](https://arcanes.be/blog/renover-peb-avant-de-vendre), et votre [estimation immobilière gratuite](https://arcanes.be/ma-vraie-valeur?utm_source=blog&utm_medium=article&utm_campaign=decote-peb-2026) â avec le simulateur de rénovation PEB calculé pour votre commune. 3764 3765--- 3766 3767_Sources : étude Immoweb 2026 (écarts à caractéristiques égales) · Statbel · Baromètre des Notaires 2024 · Test-Achats 2025 · SPW Ãnergie · Bruxelles Environnement · VEKA · Directive EPBD III (2024/1275) · GEG 2024 · Loi Climat FR. Les données et simulations présentées sont indicatives et ne constituent pas un conseil en investissement. Consultez un professionnel agréé pour une analyse personnalisée._ 3768`,$F=`--- 3769title: "PEB-korting in België: hoe het energielabel de waarde van uw woning beïnvloedt in 2026" 3770slug: "decote-peb-belgique-impact-prix-immobilier" 3771tag: "Marché" 3772readTime: "8" 3773publishDate: "13 maart 2026" 3774author: "Team Arcanes" 3775excerpt: "In België wordt een woning met label A tot 18,6% duurder verkocht dan een vergelijkbare D. Gemeten impact van het energielabel op de prijzen in Wallonië, Brussel en Vlaanderen â coëfficiënten 2026." 3776image: "https://api.arcanes.be/storage/v1/object/public/blog/Enquete%20PEB%20NL%20(1).png" 3777imageVersion: "nl-2026-07-21-01" 3778imageAlt: "Grafiek van de impact van het EPC-label op vastgoedprijzen in België in 2026" 3779--- 3780 3781# PEB-korting in België: hoe het energielabel de waarde van uw woning beïnvloedt in 2026 3782 3783In België wordt, bij gelijke kenmerken, **een woning met label A in Vlaanderen gemiddeld 18,6% duurder verkocht** dan een vergelijkbare woning met label D â en 12% duurder in Wallonië. Omgekeerd krijgen energieverslindende woningen een korting: â10,4% voor een Vlaamse F, â8,3% voor een Waalse G. Dit is geen prognose meer â het zijn gemeten verschillen op werkelijke transacties (Immoweb-studie 2026, bij vergelijkbaar woningtype, ligging en oppervlakte). 3784 3785Wat deze gegevens aantonen: het energielabel is een prijsparameter geworden, net als oppervlakte of ligging, en **de drie Belgische gewesten spelen niet dezelfde partituur** â noch in de prijsverschillen, noch in de regels. Een identieke woning met 280 kWh/m².jaar krijgt label C in Vlaanderen, D in Wallonië en F in Brussel. Een investeerder die deze dubbele realiteit negeert, neemt een meetbaar patrimoniaal risico. We publiceerden een [volledige analyse in 11 slides op LinkedIn](https://www.linkedin.com/posts/arcanes-be_la-dette-invisible-enqu%C3%AAte-peb-activity-7435696415412162561-P9gf) â dit artikel actualiseert ze met de coëfficiënten 2026. 3786 3787--- 3788 3789## Wat u leert in dit artikel 3790 3791- De gemeten impact van het EPC op de woningprijs, gewest per gewest, in 2026 3792- Waarom de drie gewesten verschillende labels geven voor eenzelfde verbruik 3793- Hoe de regelgeving het label tot een financiële parameter heeft gemaakt 3794- Welke strategie u kiest naargelang uw woning in Vlaanderen, Wallonië of Brussel ligt 3795- Hoe u de werkelijke kostprijs van een energieverslindende woning simuleert vóór aankoop 3796 3797--- 3798 3799## De bruine korting: de gemeten verschillen in 2026 3800 3801### Wat het EPC-label werkelijk weegt op de prijs 3802 3803De "bruine korting" â het waardeverlies door een slecht label â en haar spiegelbeeld, de groene meerwaarde, zijn nu nauwkeurig meetbaar. De onderstaande verschillen komen uit de Immoweb-studie 2026, bij gelijke kenmerken, en zijn de verschillen die onze schattingsmotor toepast na kalibratie op de officiële gewestelijke schalen: 3804 3805| Gewest | Gemeten verschil | Vergelijking | 3806| ---------- | ---------------- | ------------- | 3807| Vlaanderen | **+18,6 %** | woning A vs D | 3808| Wallonië | **+12 %** | woning A vs D | 3809| Brussel | **+12,2 %** | label B vs D | 3810| Vlaanderen | **â10,4 %** | label F vs D | 3811| Wallonië | **â8,3 %** | label G vs D | 3812 3813Andere barometers convergeren naar dezelfde ordes van grootte: Test-Aankoop mat â11,7% voor een Vlaamse F in 2025, en de Notarisbarometer 2024 schatte de korting op Brusselse energieverslinders tussen â15 en â20% naargelang de buurt. De methodologieën verschillen, de richting nooit: **elke opeenvolgende meting bevestigt dat de markt energieverslindende woningen bestraft** â en de reglementaire druk gaat maar in één richting. 3814 3815Op een Waalse woning van 350.000 ⬠in klasse D vertegenwoordigt het verschil tussen een vergelijkbare A en G zo ongeveer 70.000 ⬠â voor hetzelfde gebou
3815w, op de energieprestatie na. 3816 3817### Waarom Europa het tempo verhoogt 3818 3819De Europese richtlijn EPBD III (2024/1275) verplicht de lidstaten om renovatieverplichtingen voor energieverslinders op te leggen. Maar het was de invasie van Oekraïne in februari 2022 die alles op zijn kop zette: voordien werd de energietransitie gestuurd door de Commissie met 2050 als horizon en stimulerende maatregelen; nadien namen de staten het heft in handen met 2030-2035 als nieuwe deadline. Wat tien jaar zou duren, werd in tien maanden beslist. 3820 3821De Europese vergelijking bevestigt de richting: in Frankrijk zijn labels G verboden voor verhuur sinds 2025 en lopen de kortingen op tot â25% in sommige regio's; in Duitsland verplicht de GEG 2024 65% hernieuwbare energie voor elke nieuwe verwarming; in Nederland passen banken hun kredietrente rechtstreeks aan op basis van het label. 3822 3823--- 3824 3825## De val van de 280 kWh: drie gewesten, drie verschillende labels 3826 3827Dit is het meest onderschatte punt door Belgische kopers en investeerders. **280 kWh/m².jaar geeft drie verschillende labels naargelang het gewest** â en dus drie verschillende prijsimpacts. 3828 3829| Gewest | Aandeel gebouwen vóór 1945 | Label voor 280 kWh/m².jaar | Status | 3830| ---------- | -------------------------- | -------------------------- | ------------ | 3831| Vlaanderen | 25,8 % | **C** | Conform | 3832| Wallonië | 47,4 % | **D** | Alarmzone | 3833| Brussel | 65,5 % | **F** | Niet-conform | 3834 3835Elk Belgisch gewest heeft zijn EPC-schaal gekalibreerd op de leeftijd van zijn eigen gebouwenbestand. Een woning C in Vlaanderen en een woning F in Brussel kunnen exact hetzelfde werkelijke verbruik hebben. Een investeerder die labels tussen gewesten vergelijkt zonder deze sleutel, vergist zich structureel in de waarde. 3836 3837--- 3838 3839## Impact per gewest: gemeten verschillen, verplichtingen en concrete hefbomen 3840 3841### Vlaanderen: de markt heeft het EPC al verrekend 3842 3843In Vlaanderen loopt het prijssignaal vooruit op de wet: **+18,6% voor een A vs D, â10,4% voor een F** â de grootste verschillen van het land. Het onderhandelingsvenster voor woningen D-E sluit zich geleidelijk. 3844 3845**Huidige verplichtingen:** minimaal label D verplicht binnen 6 jaar na aankoop. Versoepeling in 2025 met uitstel van de verplichting A naar 2045. 3846 3847**Hefboom:** renovatiepremies tot 15.000 â¬. Progressieve boete bij aanhoudende niet-naleving. 3848 3849### Wallonië: de timing werkt in het voordeel van de geïnformeerde koper 3850 3851De renovatieverplichtingen bij verkoop werden uitgesteld in Wallonië â wat een **tijdelijke kloof creëert tussen het werkelijke risico en de marktprijs**. De korting is er reëel (â8,3% voor een G vs D) maar minder uitgesproken dan in Vlaanderen: de Waalse markt heeft de komende verplichtingen nog niet volledig verrekend. 3852 3853**Uitzonderlijke fiscale hefboom:** de verlaagde registratierechten (12,5% â 3% voor de eigen en enige woning) vertegenwoordigen een besparing van ongeveer 26.000 ⬠op een aankoop van 275.000 â¬. 3854 3855### Brussel: maximale beperking, maar ook maximale huurdersvraag 3856 3857Met 93% van het gebouwenbestand van vóór 1981 is Brussel het meest kwetsbare gewest: **65% van het Brusselse bestand zal niet-conform zijn in 2033**. De markt waardeert de prestatie er al (+12,2% voor een B vs D), en de notarisbarometers meten kortingen van â15 tot â20% op energieverslinders naargelang de buurt. 3858 3859**Verplichtingen:** minimaal label E verplicht in 2033, label C in 2045. 3860 3861--- 3862 3863## Patrimoniale simulatie: een Waalse energieverslinder renoveren 3864 3865Renovatie is geen uitgave â het is een patrimoniale herpositionering. Hier volgt een simulatie met de gemeten verschillen 2026, op een Waalse woning met label G. 3866 3867**Hypothese:** Waalse woning die na renovatie (label B) 300.000 ⬠waard zou zijn, momenteel geklasseerd als G. 3868 3869| Post | Geraamd bedrag | 3870| --------------------------------------------------------- | --------------------------- | 3871| Werkelijke aankoopprijs (korting G, â8,3% op het segment) | ~275.000 ⬠| 3872| Renovatie G â B (isolatie, warmtepompâ¦) | â60.000 tot â90.000 ⬠| 3873| Terugvorderbare gewestelijke premies | +10.000 tot +20.000 ⬠|
3874| Besparing registratierechten (3% vs 12,5% op 275.000 â¬) | ~26.000 ⬠| 3875| **Totale netto-investering** | **~299.000 tot ~319.000 â¬** | 3876| **Waarde na renovatie (label B)** | **~300.000 tot ~330.000 â¬** | 3877 3878De eerlijke lezing van deze tabel: de operatie levert geen speculatieve winst op â de winst komt van de premies en de Waalse fiscale hefboom, en ze **beschermt tegen de geprogrammeerde erosie** van de waarde van een niet-gerenoveerde woning, waarvan de korting alleen maar kan groeien naarmate de reglementaire deadlines naderen. De berekening wordt gevoelig gunstiger als de werkelijke offerte onder de bovengrens uitkomt â vandaar het belang om ze te laten opmaken _vóór_ het bod. 3879 3880_Indicatieve simulatie. Raadpleeg een erkende auditor voor een persoonlijke offerte._ 3881 3882--- 3883 3884## 6 belangrijke punten over EPC en Belgisch vastgoed 3885 38861. **De bruine korting is een gemeten marktfeit** â tot â10,4% in Vlaanderen voor een F, en A-vs-D-verschillen tot +18,6%. 38872. **De leeftijd van het gebouwenbestand bepaalt de EPC-regels** â 47% van het Waalse en 65% van het Brusselse bestand dateert van vóór elke thermische norm. 38883. **280 kWh = drie verschillende labels per gewest** â vergelijking tussen gewesten is vertekend zonder deze sleutel. 38894. **Geopolitiek heeft alles versneld** â 2022 maakte de energietransitie tot een kwestie van nationale soevereiniteit. 38905. **Elk gewest biedt een specifieke hefboom** â marktvolwassenheid in Vlaanderen, fiscale timing in Wallonië, structurele huurdersvraag in Brussel. 38916. **Schatten zonder het EPC te integreren is een foutieve analyse** â het label is een prijsparameter net als oppervlakte of ligging, en zijn gewicht wordt gewest per gewest gemeten, nooit nationaal. 3892 3893--- 3894 3895## Veelgestelde vragen over EPC en vastgoedwaarde in België 3896 3897### Hoe groot is de korting op een energieverslinder in België in 2026? 3898 3899Bij gelijke kenmerken wordt een label F in Vlaanderen â10,4% onder een vergelijkbare D verhandeld, en een G in Wallonië â8,3% onder een D (Immoweb-studie 2026). In Brussel meten de notarisbarometers kortingen van â15 tot â20% op energieverslinders naargelang de buurt. Omgekeerd wordt een woning A in Vlaanderen +18,6% boven een D verkocht en +12% in Wallonië. 3900 3901### Is het EPC verplicht bij de verkoop in België? 3902 3903Ja. Het EPC is verplicht bij elke vastgoedtransactie â verkoop of verhuur. Het ontbreken van een EPC in een advertentie is een waarschuwingssignaal: ofwel werd de keuring niet uitgevoerd, ofwel vermijdt de verkoper een slechte score te communiceren. 3904 3905### Verhindert een slecht EPC de verkoop van uw woning? 3906 3907Nee, maar het resulteert in een meetbare korting en, afhankelijk van het gewest, in renovatieverplichtingen ten laste van de koper binnen een bepaalde termijn (6 jaar in Vlaanderen om label D te bereiken). In Wallonië werden de verplichtingen bij verkoop uitgesteld, maar de prijsdruk bestaat al. 3908 3909### Waarom heeft dezelfde woning een ander label per Belgisch gewest? 3910 3911Elk gewest kalibreert zijn EPC-schaal op de leeftijd en kenmerken van zijn eigen gebouwenbestand. Brussel, waarvan 65% van het patrimonium dateert van vóór 1945, heeft zijn categorie F uitgebreid. Vlaanderen, met een recenter bestand, hanteert een strengere schaal. Resultaat: 280 kWh/m².jaar komt overeen met label C in Vlaanderen, D in Wallonië en F in Brussel. 3912 3913### Hoe weet u of een woning de renovatie-investering waard is? 3914 3915Vergelijk de aankoopprijs met korting, de werkelijke renovatiekost (offerte, geen schatting), de terugvorderbare premies en de waarde na renovatie. In Wallonië vertegenwoordigen de registratierechten van 3% ongeveer 26.000 ⬠besparing op een aankoop van 275.000 ⬠â genoeg om een aanzienlijk deel van het werkbudget te absorberen. 3916 3917--- 3918 3919## Integreer het EPC in uw vastgoedanalyse met Arcanes 3920 3921Het EPC-label maakt deel uit van de parameters die automatisch worden geanalyseerd in elk Arcanes-rapport, met de gewestelijke coëfficiënten 2026 uit dit artikel. Door de URL van een Immoweb-advertentie in te voeren, ontvangt u een volledige analyse met de energiepositie van de woning, de toepasselijke reglementaire verplichtingen per gewest, het netto- en netto-nettorendement, en de marktgegevens van de gemeente. 3922
3923**â [Analyseer een woning gratis op arcanes.be](https://arcanes.be?utm_source=blog&utm_medium=article&utm_campaign=decote-peb-2026)** 3924 3925_Gratis analyse · Actuele gegevens · Geen engagement_ 3926 3927Eerder verkoper dan investeerder? Twee bronnen: onze analyse [uw EPC verbeteren vóór de verkoop?](https://arcanes.be/blog/renover-peb-avant-de-vendre), en uw [gratis schatting van uw woning](https://arcanes.be/ma-vraie-valeur?utm_source=blog&utm_medium=article&utm_campaign=decote-peb-2026) â met de EPC-renovatiesimulator berekend voor uw gemeente. 3928 3929--- 3930 3931_Bronnen: Immoweb-studie 2026 (verschillen bij gelijke kenmerken) · Statbel · Notarisbarometer 2024 · Test-Aankoop 2025 · SPW Ãnergie · Leefmilieu Brussel · VEKA · Richtlijn EPBD III (2024/1275) · GEG 2024 · Franse Klimaatwet. De gepresenteerde gegevens en simulaties zijn indicatief en vormen geen beleggingsadvies. Raadpleeg een erkend professional voor een persoonlijke analyse._ 3932`,GF=`--- 3933title: "Online property valuation: why every tool gives a different price (and which to trust)" 3934slug: "estimation-immobiliere-en-ligne-prix-differents" 3935tag: "Marché" 3936readTime: 9 3937publishDate: "July 10, 2026" 3938author: "Arcanes" 3939excerpt: "Three tools, three prices for the same house: the number has become a commodity. What sets a reliable valuation apart in Belgium: the proof, the municipal context, and scenarios to decide." 3940image: "/__l5e/assets-v1/20cd4e3e-4565-4bca-8098-4b0c878050cf/estimation-commodite-cover.png" 3941imageVersion: "estimation-commodite-2026-en" 3942imageAlt: "Three different valuations of the same Belgian property, side by side" 3943--- 3944 3945# Online property valuation: why every tool gives a different price (and which to trust) 3946 3947Try it yourself. Take your house and ask three different free tools for its price. You will get three numbers â probably tens of thousands of euros apart. Three valuations "based on the market", three results â and rarely any explanation of the method. 3948 3949Ten years ago, a valuation required an appointment. Today the number takes 30 seconds and costs nothing: the listing portals offer one, the banks offer one, the agencies offer one â and so do we. **The number has become a commodity.** 3950 3951What you should now demand from any property valuation â free or not â comes down to three things: 3952 3953- **The proof**: a figure built on actual transactions (past deeds, not listings), dated and verifiable. 3954- **The context**: your position within your municipal market â price range, liquidity, sales per year. 3955- **The actionability**: quantified scenarios to decide â renovate, wait, sell or rent out. 3956 3957A number alone, without these three elements, lets you make no decision at all. Here is why. 3958 3959## 1. The proof: where does this number come from? 3960 3961First question to ask any valuation: **what are you built on?** 3962 3963Many tools run on _asking prices_ â the online listings. It is fast, abundant⦠and biased: a listed price is not a paid price. In between sit the negotiation, the withdrawn properties, the listings that linger for six months precisely because they were overpriced. Valuing your home on listings means comparing it to expectations, not to transactions. 3964 3965The alternative: **actual transactions** â the sale value actually recorded, from preliminary agreement to notarial deed (Statbel and FPS Finance data), adjusted for your property's factors: floor area, location, the EPC rating â objective data â and the general condition, which you declare yourself. That declarative part is one reason a serious result is displayed as a range, not a single number. 3966 3967A word of honesty few players say out loud: this official data carries a **natural lag** â several months pass between the preliminary agreement and the deed's registration. That lag does not vanish by magic; it is managed by crossing two things: the _level_ (consolidated transactions) and the _trajectory_ (the recent evolution of your municipal market). Above all, it is acknowledged â a dated, documented number is always worth more than a number with no date and no source. 3968 3969Because a number without a source is not a valuation. It is an opinion with decimals. 3970 3971## 2. The context: what is this number worth in _your_ market? 3972 3973Second limitation of instant valuations: they give you an amount, never a **position**. 3974 3975â¬480,000 does not mean the same thing everywhere. In a municipality with 80 sales a year, that is a house finding its buyer in a steady flow. In a municipality with 12 transactions a year, the same amount plays out in a tight market: few simultaneous buyers, few second chances if the asking price starts wrong. Same number, opposite selling strategies. There is a statistical effect too: the fewer transactions a market has, the more each atypical sale skews the average â in precisely those municipalities, an honest confidence index must say so. 3976 3977Context means answering: where does your property sit in its **municipality's price range**? Is the local market **liquid or scarce**? **Rising or flat** over five years? Is your EPC rating a differentiator or the local norm? This data exists, municipality by municipality â [we publish it for all 581 Belgian municipalities](https://arcanes.be/communes). A number without that position is a latitude without a longitude. 3978 3979## 3. The actionability: what do you _do_ with the number? 3980 3981Third requirement, the most decisive: a number that leads to no decision is a useless number. 3982 3983Selling? The real question becomes: _at what asking price, at what moment, in what condition?_ Your EPC sits at D or E? The question becomes: _does the value gain from renovating exceed the contractor's quote?_ â and that gain is measured, rating by rating, on your region's transactions. Torn between selling and renting out? The question becomes: _in how many years do cumulative rents catch up with the capital of a sale today?_ 3984 3985None of these decisions is made with an amount alone. They are made with quantified scenarios: that is precisely the difference between a valuation and a **file**. 3986 3987## And where do we stand in all this? 3988 3989Let us be honest to the end: our valuation is free and instant too â accepted, and it is this article's genesis. The difference plays out elsewhere. 3990 3991The difference we claim is not the number: it is what surrounds it â and on that ground, **Ma Vraie Valeur is today the most complete free valuation on the Belgian market**. It is the only one that c
3991ombines, in a single file: **actual transactions** as its displayed source (Statbel, FPS Finance, official regional EPC scales), your **position in the municipal market** (range, liquidity, sales volume â across all 581 Belgian municipalities), an **EPC renovation simulator** computed with your region's coefficients, and the **sell-or-rent comparison** year by year. All in 30 seconds, no email required. Run your [free property valuation](https://arcanes.be/ma-vraie-valeur?utm_source=blog&utm_medium=article&utm_campaign=commodite2026) â and judge on the evidence. 3992 3993And keep the same demand for everyone: statistics, however clean, see neither the actual condition, nor the light, nor the street. That is why a serious valuation is displayed as a **range** with a **confidence index** â never as a falsely precise single figure. And that is why a professional visit validates what the data cannot see. The two complement each other; neither replaces the other. 3994 3995## Frequently asked questions 3996 3997**Which property valuation should I trust when they contradict each other?** 3998The one that shows its cards: the data source (actual, dated transactions, not listings), the granularity (your municipality, not a national average), and the shape of the result (a range with a confidence index, not a single figure). A valuation that meets none of these three criteria does not deserve to set your asking price. 3999 4000**Are online valuations reliable?** 4001They are reliable _for what they are_: a statistical order of magnitude. Their reliability depends on their source (actual transactions vs listings) and their granularity (your municipality vs a national average). A serious valuation is, moreover, displayed as a range with a confidence index, not a single figure. 4002 4003**Why do three tools give three different numbers for the same property?** 4004Because they run neither on the same data (asking prices vs paid prices), nor at the same scale (national vs municipal), nor with the same factors. The EPC rating, for instance, is worth up to +18.6% on a house price in Flanders (A vs D), +12% in Wallonia and +12.2% in Brussels (B vs D) â a tool that ignores it, or applies one national rate, is structurally wrong. 4005 4006**Can a free valuation replace an estate agent?** 4007No â and the reverse is also true. The valuation situates your property in its market, instantly and with no commitment; the professional validates on site the actual condition and current demand. The right way to use both: walk into the appointment with a quantified file â the conversation changes in nature. 4008 4009**What should I demand from any free valuation?** 4010Three things: the proof (the data source, dated), the context (your position in the local market â range, liquidity), and the actionability (scenarios: renovate, wait, rent out). A number alone, without those three elements, lets you make no decision. 4011 4012--- 4013 4014_Selling, or thinking about it? Run your [free property valuation](https://arcanes.be/ma-vraie-valeur?utm_source=blog&utm_medium=article&utm_campaign=commodite2026) â a figure built on actual transactions, your position in your municipal market, a renovation simulator. Instant, no email required, and the full file unlocks for free._ 4015`,HF=`--- 4016title: "Estimation immobilière en ligne : pourquoi chaque outil donne un prix différent (et laquelle croire)" 4017slug: "estimation-immobiliere-en-ligne-prix-differents" 4018tag: "Marché" 4019readTime: 9 4020publishDate: "10 juillet 2026" 4021author: "Arcanes" 4022excerpt: "Trois outils, trois prix pour la même maison : le chiffre est devenu une commodité. Ce qui distingue une estimation fiable en Belgique : la preuve, le contexte communal, et des scénarios pour décider." 4023image: "/__l5e/assets-v1/20cd4e3e-4565-4bca-8098-4b0c878050cf/estimation-commodite-cover.png" 4024imageVersion: "estimation-commodite-2026-fr" 4025imageAlt: "Trois estimations différentes du même bien immobilier belge, côte à côte" 4026--- 4027 4028# Estimation immobilière en ligne : pourquoi chaque outil donne un prix différent (et laquelle croire) 4029 4030Faites le test. Prenez votre maison, et demandez son prix à trois outils gratuits différents. Vous obtiendrez trois chiffres â probablement séparés de plusieurs dizaines de milliers d'euros. Trois estimations « basées sur le marché », trois résultats â et rarement une explication sur la méthode. 4031 4032Il y a dix ans, obtenir une estimation demandait un rendez-vous. Aujourd'hui, le chiffre prend 30 secondes et ne coûte rien : les portails en proposent, les banques en proposent, les agences en proposent â et nous aussi. **Le chiffre est devenu une commodité.** Ce n'est ni un drame ni un scandale : c'est le résultat logique de données publiques (Statbel, SPF Finances) et d'algorithmes accessibles. 4033 4034Mais quand tout le monde donne le même produit gratuitement, la valeur se déplace. Elle n'est plus dans le chiffre. Elle est dans trois choses que la plupart des estimations gratuites ne donnent pas â et que vous devriez exiger de chacune d'elles, y compris de la nôtre. 4035 4036## 1. La preuve : d'où vient ce chiffre ? 4037 4038Première question à poser à toute estimation : **sur quoi es-tu construite ?** 4039 4040Beaucoup d'outils travaillent sur les _prix demandés_ â les annonces en ligne. C'est rapide, abondant⦠et biaisé : un prix affiché n'est pas un prix payé. Entre les deux, il y a la négociation, les biens retirés, les annonces qui traînent six mois précisément parce qu'elles étaient surévaluées. Estimer votre bien sur des annonces, c'est le comparer à des espoirs, pas à des transactions. 4041 4042L'alternative : les **transactions réelles** â ce qui s'est effectivement signé chez le notaire (données Statbel et SPF Finances), ajusté selon les facteur
4042s mesurables de votre bien : surface, état, classe PEB, zone. Le résultat n'est pas une vérité révélée : c'est un ordre de grandeur statistique. Mais il est **sourcé, horodaté, vérifiable** â trois adjectifs qu'aucun chiffre sorti d'une boîte noire ne peut revendiquer. 4043 4044Un chiffre sans source n'est pas une estimation. C'est une opinion avec des décimales. 4045 4046## 2. Le contexte : que vaut ce chiffre dans _votre_ marché ? 4047 4048Deuxième limite de l'estimation instantanée : elles vous donnent un montant, jamais une **position**. 4049 4050Or 480 000 ⬠ne signifie pas la même chose partout. Dans une commune où il se conclut 80 ventes par an, c'est un bien qui trouvera son acheteur dans un flux régulier. Dans une commune à 12 transactions annuelles, le même montant se joue sur un marché étroit : peu d'acheteurs simultanés, peu de secondes chances si le prix de départ est mal calé. Même chiffre, stratégies de vente opposées. 4051 4052Le contexte, c'est répondre à : où se situe votre bien dans la **fourchette de prix de sa commune** ? Le marché local est-il **liquide ou rare** ? En **progression ou stable** sur cinq ans ? Votre classe PEB est-elle un différenciateur ou la norme du parc local ? Un chiffre sans cette position, c'est une latitude sans longitude. 4053 4054## 3. L'actionnabilité : que _faire_ du chiffre ? 4055 4056Troisième exigence, la plus décisive : un chiffre qui ne débouche sur aucune décision est un chiffre inutile. 4057 4058Vous vendez ? La vraie question devient : _à quel prix de départ, à quel moment, dans quel état ?_ Votre PEB est en D ou E ? La question devient : _le gain de valeur d'une rénovation dépasse-t-il le devis ?_ â et ce gain se mesure, classe par classe, sur les transactions de votre région. Vous hésitez entre vendre et louer ? La question devient : _en combien d'années les loyers cumulés rejoignent-ils le capital d'une vente aujourd'hui ?_ 4059 4060Aucune de ces décisions ne se prend avec un montant seul. Elles se prennent avec des scénarios chiffrés : c'est exactement la différence entre une estimation et un **dossier**. 4061 4062## Et nous, dans tout ça ? 4063 4064Soyons honnêtes jusqu'au bout : notre estimation aussi est gratuite et immédiate â c'est assumé, et c'est la genèse de cet article. La différence se joue ailleurs. 4065 4066La différence que nous revendiquons n'est pas le chiffre : c'est ce qui l'entoure â et sur ce terrain, **Ma Vraie Valeur est aujourd'hui l'estimation gratuite la plus complète du marché belge**. C'est la seule qui combine, dans un même dossier : les **transactions réelles** comme source affichée (Statbel, SPF Finances, grilles PEB régionales officielles), votre **position dans le marché communal** (fourchette, liquidité, volume de ventes â sur les 581 communes du pays), un **simulateur de rénovation PEB** calculé aux coefficients de votre région, et la **comparaison vendre ou louer** année par année. Le tout en 30 secondes, sans e-mail. Faites votre [estimation immobilière gratuite](https://arcanes.be/ma-vraie-valeur?utm_source=blog&utm_medium=article&utm_campaign=commodite2026) â et jugez sur pièces. 4067 4068Et gardez l'exigence pour tout le monde : la statistique, aussi propre soit-elle, ne voit ni l'état réel, ni la luminosité, ni la rue. Une visite professionnelle valide ce que les données ne voient pas. Les deux se complètent ; aucun des deux ne remplace l'autre. 4069 4070## Questions fréquentes 4071 4072**Les estimations en ligne sont-elles fiables ?** 4073Elles sont fiables _pour ce qu'elles sont_ : un ordre de grandeur statistique. Leur fiabilité dépend de leur source (transactions réelles vs annonces) et de leur granularité (votre commune vs une moyenne nationale). Exigez de savoir sur quoi le chiffre est construit â c'est le premier test de sérieux. 4074 4075**Pourquoi trois outils donnent-ils trois chiffres différents pour le même bien ?** 4076Parce qu'ils ne travaillent ni sur les mêmes données (prix demandés vs prix payés), ni à la même échelle (nationale vs communale), ni avec les mêmes facteurs (le PEB, par exemple, pèse jusqu'à 18,6 % sur le prix en Flandre â un outil qui l'ignore se trompe structurellement). 4077 4078**Une estimation gratuite peut-elle remplacer un agent immobilier ?** 4079Non, et l'inverse non plus. L'estimation situe votre bien dans son marché, immédiatement et sans engagement ; le professionnel valide sur place l'état réel et la demande du moment. Le bon usage : arr
4079iver au rendez-vous avec un dossier chiffré â la conversation change de nature. 4080 4081**Que devrais-je exiger de n'importe quelle estimation gratuite ?** 4082Trois choses : la preuve (la source des données, datée), le contexte (votre position dans le marché local â fourchette, liquidité), et l'actionnabilité (des scénarios : rénover, attendre, louer). Un chiffre seul, sans ces trois éléments, ne vous fait prendre aucune décision. 4083 4084--- 4085 4086_Vous vendez, ou vous y pensez ? Faites votre [estimation immobilière gratuite en Belgique](https://arcanes.be/ma-vraie-valeur?utm_source=blog&utm_medium=article&utm_campaign=commodite2026) â chiffre sourcé sur les transactions réelles, position dans votre marché communal, simulateur de rénovation. Immédiat, sans e-mail, et le dossier complet se débloque gratuitement._ 4087`,KF=`--- 4088title: "Online vastgoedschatting: waarom elke tool een andere prijs geeft (en welke u kunt geloven)" 4089slug: "estimation-immobiliere-en-ligne-prix-differents" 4090tag: "Marché" 4091readTime: 9 4092publishDate: "10 juli 2026" 4093author: "Arcanes" 4094excerpt: "Drie tools, drie prijzen voor hetzelfde huis: het cijfer is een commodity geworden. Wat een betrouwbare schatting in België onderscheidt: het bewijs, de gemeentelijke context, en scenario's om te beslissen." 4095image: "/__l5e/assets-v1/20cd4e3e-4565-4bca-8098-4b0c878050cf/estimation-commodite-cover.png" 4096imageVersion: "estimation-commodite-2026-nl" 4097imageAlt: "Drie verschillende schattingen van hetzelfde Belgische vastgoed, naast elkaar" 4098--- 4099 4100# Online vastgoedschatting: waarom elke tool een andere prijs geeft (en welke u kunt geloven) 4101 4102Doe de test. Neem uw huis, en vraag de prijs aan drie verschillende gratis tools. U krijgt drie cijfers â waarschijnlijk tienduizenden euro's uit elkaar. Drie schattingen "gebaseerd op de markt", drie resultaten â en zelden uitleg over de methode. 4103 4104Tien jaar geleden vroeg een schatting een afspraak. Vandaag kost het cijfer 30 seconden en niets: de portalen bieden er een aan, de banken bieden er een aan, de makelaars bieden er een aan â en wij ook. **Het cijfer is een commodity geworden.** 4105 4106Wat u voortaan moet eisen van een vastgoedschatting â gratis of niet â bestaat uit drie elementen: 4107
4108- **Het bewijs**: een cijfer gebaseerd op werkelijke transacties (verleden aktes, geen advertenties), gedateerd en verifieerbaar. 4109- **De context**: uw positie in uw gemeentelijke markt â prijsvork, liquiditeit, aantal verkopen per jaar. 4110- **De bruikbaarheid**: becijferde scenario's om te beslissen â renoveren, wachten, verkopen of verhuren. 4111 4112Een cijfer alleen, zonder deze drie elementen, laat u geen enkele beslissing nemen. Laten we zien waarom. 4113 4114## 1. Het bewijs: waar komt dit cijfer vandaan? 4115 4116Eerste vraag aan elke schatting: **waarop ben je gebouwd?** 4117 4118Veel tools werken op _vraagprijzen_ â de online advertenties. Dat is snel, overvloedig⦠en vertekend: een geafficheerde prijs is geen betaalde prijs. Daartussen zitten de onderhandeling, de teruggetrokken panden, de advertenties die zes maanden blijven hangen precies omdat ze overgewaardeerd waren. Uw woning schatten op advertenties is haar vergelijken met verwachtingen, niet met transacties. 4119 4120Het alternatief: de **werkelijke transacties** â de verkoopwaarde die effectief werd geakteerd, van compromis tot authentieke akte (gegevens Statbel en FOD Financiën), aangepast volgens de factoren van uw woning: de oppervlakte, de zone, het EPC-label â objectieve gegevens â en de algemene staat, die u zelf aangeeft. Dat declaratieve deel is een van de redenen waarom een ernstig resultaat als vork wordt weergegeven, niet als één cijfer. 4121 4122Een woord van eerlijkheid dat weinig spelers uitspreken: deze officiële gegevens hebben een **natuurlijke vertraging** â er verlopen meerdere maanden tussen het compromis en de registratie van de akte. Die vertraging verdwijnt niet door magie; ze wordt beheerd door twee zaken te kruisen: het _niveau_ (de geconsolideerde transacties) en het _traject_ (de recente evolutie van uw gemeentelijke markt). En vooral: ze wordt erkend â een gedateerd en gedocumenteerd cijfer is altijd meer waard dan een cijfer zonder datum of bron. 4123 4124Want een cijfer zonder bron is geen schatting. Het is een mening met decimalen. 4125 4126## 2. De context: wat is dit cijfer waard in _uw_ markt? 4127 4128Tweede beperking van de onmiddellijke schatting: ze geven u een bedrag, nooit een **positie**. 4129 4130480.000 ⬠betekent niet overal hetzelfde. In een gemeente met 80 verkopen per jaar is dat een woning die haar koper vindt in een regelmatige stroom. In een gemeente met 12 transacties per jaar speelt hetzelfde bedrag zich af op een krappe markt: weinig gelijktijdige kopers, weinig tweede kansen als de startprijs verkeerd zit. Zelfde cijfer, tegengestelde verkoopstrategieën. En er is nog een statistisch effect: hoe minder transacties een markt telt, hoe zwaarder elke atypische verkoop weegt op het gemiddelde â precies in die gemeenten moet een eerlijke betrouwbaarheidsindex dat erkennen. 4131 4132De context, dat is antwoorden op: waar zit uw woning in de **prijsvork van haar gemeente**? Is de lokale markt **liquide of schaars**? In **stijging of stabiel** over vijf jaar? Is uw EPC-label een onderscheidende factor of de norm van het lokale park? Deze gegevens bestaan, gemeente per gemeente â [wij publiceren ze voor de 581 Belgische gemeenten](https://arcanes.be/gemeenten). Een cijfer zonder die positie is een breedtegraad zonder lengtegraad. 4133 4134## 3. De bruikbaarheid: wat _doet_ u met het cijfer? 4135 4136Derde eis, de meest beslissende: een cijfer dat tot geen enkele beslissing leidt, is een nutteloos cijfer. 4137 4138U verkoopt? De echte vraag wordt: _tegen welke startprijs, op welk moment, in welke staat?_ Uw EPC zit in D of E? De vraag wordt: _overtreft de waardestijging van een renovatie de offerte?_ â en die winst wordt gemeten, label per label, op de transacties van uw gewest. U twijfelt tussen verkopen en verhuren? De vraag wordt: _in hoeveel jaar halen de gecumuleerde huurinkomsten het kapitaal van een verkoop vandaag in?_ 4139 4140Geen van deze beslissingen wordt genomen met een bedrag alleen. Ze worden genomen met becijferde scenario's: dat is precies het verschil tussen een schatting en een **dossier**. 4141 4142## En wij, in dit verhaal? 4143 4144Laten we eerlijk zijn tot het einde: onze schatting is ook gratis en onmiddellijk â dat is aanvaard, en het is de genese van dit artikel. Het verschil speelt zich elders af. 4145 4146Het verschil dat wij claimen is niet het cijfer: het is wat eromheen staat â en op dat terrein
4146is **Ma Vraie Valeur vandaag de meest complete gratis schatting op de Belgische markt**. Het is de enige die in één dossier combineert: **werkelijke transacties** als getoonde bron (Statbel, FOD Financiën, officiële gewestelijke EPC-schalen), uw **positie in de gemeentelijke markt** (vork, liquiditeit, verkoopvolume â voor alle 581 Belgische gemeenten), een **EPC-renovatiesimulator** berekend met de coëfficiënten van uw gewest, en de **vergelijking verkopen of verhuren** jaar per jaar. Alles in 30 seconden, zonder e-mail. Maak uw [gratis schatting van uw woning](https://arcanes.be/ma-vraie-valeur?utm_source=blog&utm_medium=article&utm_campaign=commodite2026) â en oordeel op stukken. 4147 4148En houd de eis voor iedereen: de statistiek, hoe zuiver ook, ziet noch de werkelijke staat, noch de lichtinval, noch de straat. Daarom wordt een ernstige schatting weergegeven als **vork**, vergezeld van een **betrouwbaarheidsindex** â nooit als vals precies uniek cijfer. En daarom valideert een professioneel bezoek wat de gegevens niet zien. Beide vullen elkaar aan; geen van beide vervangt de andere. 4149 4150## Veelgestelde vragen 4151 4152**Welke vastgoedschatting geloven wanneer ze elkaar tegenspreken?** 4153Die welke haar kaarten toont: de bron van de gegevens (werkelijke en gedateerde transacties, geen advertenties), de granulariteit (uw gemeente, geen nationaal gemiddelde), en de vorm van het resultaat (een vork met betrouwbaarheidsindex, geen uniek cijfer). Een schatting die aan geen van deze drie criteria voldoet, verdient het niet uw verkoopprijs te bepalen. 4154 4155**Zijn online schattingen betrouwbaar?** 4156Ze zijn betrouwbaar _voor wat ze zijn_: een statistische grootteorde. Hun betrouwbaarheid hangt af van hun bron (werkelijke transacties vs advertenties) en hun granulariteit (uw gemeente vs een nationaal gemiddelde). Een ernstige schatting wordt trouwens weergegeven als vork met betrouwbaarheidsindex, niet als uniek cijfer. 4157 4158**Waarom geven drie tools drie verschillende cijfers voor dezelfde woning?** 4159Omdat ze noch op dezelfde gegevens werken (vraagprijzen vs betaalde prijzen), noch op dezelfde schaal (nationaal vs gemeentelijk), noch met dezelfde factoren. Het EPC-label bijvoorbeeld weegt tot +18,6% op de prijs van een woning in Vlaanderen (A vs D), +12% in Wallonië en +12,2% in Brussel (B vs D) â een tool die het negeert, of één nationaal tarief toepast, vergist zich structureel. 4160 4161**Kan een gratis schatting een makelaar vervangen?** 4162Nee, en omgekeerd ook niet. De schatting situeert uw woning in haar markt, onmiddellijk en vrijblijvend; de professional valideert ter plaatse de werkelijke staat en de vraag van het moment. Het juiste gebruik: op de afspraak verschijnen met een becijferd dossier â het gesprek verandert van aard. 4163 4164**Wat moet ik eisen van elke gratis schatting?** 4165Drie zaken: het bewijs (de bron van de gegevens, gedateerd), de context (uw positie in de lokale markt â vork, liquiditeit), en de bruikbaarheid (scenario's: renoveren, wachten, verhuren). Een cijfer alleen, zonder die drie elementen, laat u geen enkele beslissing nemen. 4166 4167--- 4168 4169_U verkoopt, of u denkt eraan? Maak uw [gratis vastgoedschatting](https://arcanes.be/ma-vraie-valeur?utm_source=blog&utm_medium=article&utm_campaign=commodite2026) â cijfer gebaseerd op werkelijke transacties, positie in uw gemeentelijke markt, renovatiesimulator. Onmiddellijk, zonder e-mail, en het volledige dossier wordt gratis ontgrendeld._ 4170`,YF=`--- 4171title: "Financing your first real estate purchase in Belgium: the complete guide to avoiding pitfalls" 4172slug: "financement-premier-achat" 4173tag: "Financement" 4174readTime: "10" 4175publishDate: "anuary 20, 2026" 4176author: "Arcanes Team" 4177excerpt: "A majority of first-time buyers make financing mistakes costing â¬15,000 to â¬50,000 over the life of the loan. A guide to avoiding them." 4178image: "/images/blog/financement-premier-achat.jpg" 4179--- 4180 4181# Financing your first real estate purchase in Belgium: the complete guide to avoiding pitfalls 4182 4183In Belgium, the average mortgage amount for a first purchase now exceeds 200,000 euros, typically spread over a term of twenty to twenty-five years. On this
4183scale of time and money, a difference of twenty basis points on the interest rateâor 0.20%ârepresents several thousand euros in total costs. And yet, a majority of first-time buyers sign their loan offer without having compared more than two bank proposals. 4184 4185The desire to become a homeowner is legitimate: to exit the rental market, build wealth, and stabilize one's residential situation. But the first purchase remains the heaviest financial commitment a household will make in its lifetime. The most common mistake is treating financing as an administrative formality to wrap up the purchasing process, when in reality, it is the most structural element of the project. A solid real estate property can turn into a financial hazard if it is improperly financed. 4186 4187--- 4188 4189## Structural overview 4190 4191Financing a first real estate purchase in Belgium plays out across three axes that most buyers underestimate: actual borrowing capacity, which cannot be reduced to the 33% debt-to-income ratio communicated by banks; the global cost of the transaction, which exceeds the asking price by 12 to 16% depending on the Region; and the choice of the loan term and structure, whose impact on the total cost can vary by â¬15,000 to â¬50,000 over the life of the loan. Masterful financing is not about maximizing the borrowed amount, but rather preserving a safety margin, maintaining savings capacity, and being able to absorb the unexpected. 4192 4193This financing component is part of a broader purchasing process. For a complete overviewâfrom the market to the costs, from the EPC to the notary checklistâconsult our [complete guide to buying real estate in Belgium in 2026](/blog/buying-real-estate-belgium-2026). 4194 4195--- 4196 4197## Redefining your true borrowing capacity 4198 4199The rule of a 33% maximum debt ratio is a useful benchmark, but it tells an incomplete story. This ratio, calculated on net income, takes into account neither the household's variable living expenses, nor the true stability of its income, nor its resilience in the event of a shockâjob loss, separation, illness, or a rate hike during refinancing. 4200 4201In Belgium, the National Bank (NBB) introduced macroprudential recommendations in 2020 that regulate the lending practices of financial institutions. For first-time buyers, the Loan-to-Value (LTV) ratio (the ratio between the borrowed amount and the property's value) is capped at 90% in most cases, with a tolerance for 35% of first-time buyer applications to go up to 100%. In practical terms, this means that most buyers must have a down payment covering at least 10% of the property's value, in addition to the acquisition costs. 4202 4203The relevant question is not how much the bank is willing to lend, but what level of debt allows you to maintain a stable lifestyle, regular savings, and a lasting safety margin. In practice, a monthly payment representing 25 to 30% of the household's net income, paired with a residual savings capacity, constitutes a much more reliable floor of prudence than the theoretical maximum. 4204 4205--- 4206 4207## The global cost: well beyond the asking price 4208 4209One of the most frequent surprises for a Belgian first-time buyer is discovering the true cost of the acquisition. The asking price of the property is merely the starting point. Registration duties amount to 12.5% in Wallonia and Brussels, and 12% in Flanders for an investment propertyâbut for a sole and primary residence, Flanders applies a reduced rate of 3%, and Brussels grants a tax allowance (abatement) on the first â¬200,000 tranche (representing savings of up to â¬25,000). In Wallonia, a â¬20,000 allowance on the taxable base is applicable for modest homes. 4210 4211On top of the registration duties are the notary's fees, which are regulated by law and calculated on a sliding scale based on the property price, mortgage registration fees, bank processing fees, the cost of the real estate valuation required by the bank, and outstanding balance insurance. 4212 4213As an order of magnitude, a first-time buyer must anticipate an additional cost of 12 to 16% above the purchase price, depending on the Region and the applicable tax regime. For a property listed at â¬300,000, this represents between â¬36,000 and â¬48,000 in extra costs. Ignoring this reality means starting your project with a cash deficit that weakens the entire financial structure. 4214 4215--- 4216
4217## Correctly interpreting the interest rate 4218 4219Comparing mortgage loans solely on the basis of the nominal rate is a misleading approach. Two offers with the same nominal rate can diverge significantly in total cost if the accessory conditions differ: processing fees, the obligation to domicile your income, linked insurance policies, and early repayment conditions. 4220 4221In Belgium, the law requires credit institutions to communicate the APR (Annual Percentage Rate, or _TAEG_ in French), which integrates all the costs of the loan. It is this figure, not the nominal rate, that should be used as a basis for comparison. 4222 4223The loan term is a parameter at least as decisive as the rate. A â¬250,000 loan at 3.5% over twenty years generates a total interest cost of about â¬98,000. The same amount at 3.3% over twenty-five yearsâa slightly lower, and therefore seemingly more attractive rateâcosts about â¬115,000 in interest. The longer term largely cancels out the advantage of the rate and adds â¬17,000 to the true cost of financing. 4224 4225The lower monthly payment provided by an extended term is tempting, but it comes at a price. The decision must integrate three parameters simultaneously: the actual acceptable monthly payment level, the total cost of the credit over its lifespan, and the ability to maintain an emergency fund. Stable financing over twenty years is almost always more economical than financing stretched over twenty-five years for the same amount. 4226 4227--- 4228 4229## The most costly financing mistakes 4230 4231The first, and most structural, mistake is reasoning in terms of a maximum amount rather than a sustainable monthly payment. The bank may be willing to lend a certain amount; this does not mean the borrower can handle it for twenty years without sacrificing their standard of living, the
4231ir savings, or their room to maneuver against the unexpected. 4232 4233The second mistake is the systematic underestimation of post-acquisition charges. A homeowner bears costs that a tenant ignores: property tax (_précompte immobilier_), structural maintenance, building insurance, non-recoverable co-ownership charges, and, where applicable, energy compliance renovations. In Belgium, these charges represent between 1.5% and 3% of the property's value per year. 4234 4235The third mistake is automatically accepting the outstanding balance insurance proposed by the lending bank. Belgian law allows the borrower to take out this insurance with any provider, and premium gaps between institutions can reach 30 to 40% for equivalent coverage. Over the life of a twenty-year loan, this difference amounts to thousands of euros. 4236 4237Finally, many first-time buyers neglect the regional tax advantages to which they are entitled. The Walloon _chèque-habitat_ (housing check), Brussels and Flemish abatements, and reduced registration duties for modest homes: these mechanisms are specific to each Region and evolve regularly. Failing to factor them into your calculations means leaving money on the table. 4238 4239--- 4240 4241## Simulation as a decision-making tool 4242 4243A loan simulation is more than just a monthly payment calculation. It should allow you to test the robustness of your financial project across several scenarios: what happens if rates rise during refinancing? If one of the household incomes temporarily disappears? If unforeseen renovations are required within the first three years? 4244 4245Multi-scenario simulation is the tool that distinguishes a fragile project from a solid one. It does not aim for absolute precisionâassumptions will always remain imperfectâbut for coherence. A project that only survives under the most favorable scenario is a high-risk project. A project that remains viable even in a degraded scenario is built on healthy foundations. 4246 4247--- 4248 4249## Conclusion 4250 4251The success of a first real estate purchase depends as much on the quality of the financing as on the quality of the property acquired. A suitable mortgage does not maximize the borrowed amount, but preserves lasting flexibility: the ability to continue saving, to absorb the unexpected, and to not depend on a single economic scenario to remain solvent. 4252 4253The Belgian real estate market offers genuine opportunities for first-time buyers who take the time to structure their financing before visiting properties. Those who start with the numbers before falling in love with a property are also the ones who buy under the best conditions. 4254 4255--- 4256 4257## Arcanes Integration 4258 4259The Arcanes mortgage simulator allows you to calculate your monthly payment, visualize the complete amortization schedule, and compare multiple term and rate scenarios in seconds. The goal is to give first-time buyers the same decision-making tools used by professional investorsâbefore even contacting a bank. 4260 4261--- 4262 4263## Frequently Asked Questions 4264 4265### What down payment level is considered balanced for a first purchase? 4266 4267A down payment covering at least the acquisition costsâmeaning 12 to 16% of the property price depending on the Regionâconstitutes the recommended floor. Ideally, an additional reserve covering three to six months of expenses prevents you from finding yourself without a safety net immediately after buying. Draining your entire savings to maximize the down payment is a risky strategy that leaves the new homeowner vulnerable to the slightest setback. 4268 4269### Can you borrow the notary fees in Belgium? 4270 4271It is technically possible in some cases, particularly for first-time buyers with a strong financial profile and stable income. The National Bank allows institutions to grant an LTV ratio above 90% for 35% of first-time buyer applications. However, borrowing more than 100% of the property's value increases the total cost of the credit and significantly reduces your financial safety margin. 4272 4273### How do you determine the optimal loan term? 4274 4275The optimal term is the one that produces a manageable monthly payment while limiting the total cost of interest. In practice, the twenty to twenty-five-year range is the most common in Belgium. Bey
4275ond twenty-five years, the extra interest cost becomes disproportionate compared to the reduction in the monthly payment obtained. The best method is to simulate several terms and compare the total cost rather than just the monthly payment. 4276 4277### Should you consult a broker or only your bank? 4278 4279Consulting your usual bank and at least one independent broker provides a comparative view of the market. The broker has access to a panel of institutions and can negotiate conditions that the borrower might not obtain by going direct. In Belgium, the broker's remuneration is generally covered by the lending bank, meaning the service is free for the borrower in most cases. 4280 4281### Is there a simple test to check if you are borrowing too much? 4282 4283The most concrete method is to set aside, every month for three to six months, the amount of the future monthly payment plus a provision for homeownership charges. If this discipline is sustainable without tension, the project is viable. If it imposes significant sacrifices on your current lifestyle, the borrowed amount is likely too high. 4284`,ZF=`--- 4285title: "Financer son premier achat immobilier en Belgique : le guide complet pour éviter les pièges" 4286slug: "financer-premier-achat-immobilier-belgique" 4287tag: "Financement" 4288readTime: "10" 4289publishDate: "20 janvier 2026" 4290author: "Ãquipe Arcanes" 4291excerpt: "Une majorité de primo-accédants commettent des erreurs de financement coûtant 15 000 à 50 000 ⬠sur la durée du crédit. Guide pour les éviter." 4292image: "/images/blog/first-home-sold.jpg" 4293--- 4294 4295# Financer son premier achat immobilier en Belgique : le guide complet pour éviter les pièges 4296 4297En Belgique, le montant moyen d'un crédit hypothécaire pour un premier achat dépasse aujourd'hui les 200 000 euros, sur une durée qui s'étend le plus souvent entre vingt et vingt-cinq ans. à cette échelle de temps et de montant, une différence de vingt points de base sur le taux â soit 0,20 % â représente plusieurs milliers d'euros de coût total. Et pourtant, une majorité de primo-accédants signent leur offre de crédit sans avoir comparé plus de deux propositions bancaires. 4298 4299La volonté de devenir propriétaire est légitime : sortir du marché locatif, se constituer un patrimoine, stabiliser sa situation résidentielle. Mais le premier achat reste l'engagement financier le plus lourd qu'un ménage prendra dans sa vie. L'erreur la plus répandue est de traiter le financement comme une formalité administrative venant conclure le processus d'achat, alors que c'est en réalité l'élément le plus structurant du projet. Un bien pertinent sur le plan immobilier peut devenir un risque financier s'il est financé de manière inadaptée. 4300 4301--- 4302 4303## Synthèse structurante 4304 4305Le financement d'un premier achat immobilier en Belgique se joue sur trois axes que la plupart des acquéreurs sous-estiment : la capacité d'emprunt réelle, qui ne se résume pas au ratio d'endettement de 33 % communiqué par les banques ; le coût global de l'opération, qui dépasse le prix affiché de 12 à 16 % selon la Région ; et le choix de la durée et de la structure du crédit, dont l'impact sur le coût total peut varier de 15 000 à 50 000 euros sur la vie de l'emprunt. Un financement maîtrisé n'est pas celui qui maximise le montant emprunté, mais celui qui préserve une marge de sécurité, maintient une capacité d'épargne et absorbe les imprévus. 4306 4307Ce volet financement s'inscrit dans un processus d'achat plus large. Pour une vision complète â du marché aux frais, du PEB à la checklist notaire â consultez notre [guide complet de l'achat immobilier en Belgique en 2026](/blog/acheter-bien-immobilier-belgique-2026). 4308 4309--- 4310 4311## Redéfinir la capacité d'emprunt réelle 4312 4313La règle des 33 % d'endettement maximum est un repère utile, mais elle raconte une histoire incomplète. Ce ratio, calculé sur les revenus nets, ne tient compte ni des charges variables du ménage, ni de la stabilité réelle des revenus, ni de la capacité de résilience en cas de choc â perte d'emploi, séparation, maladie, hausse des taux en cas de refinancement. 4314 4315En Belgique, la Banque Nationale a introduit depuis 2020 des recommandations macroprudentielles qui encadrent les pratiques de prêt des établissements. Pour les primo-accédants, la quotité de financement (le rapport entre le montant emprunté et la valeur du bien) est plafonnée à 90 % dans la majorité des cas, avec une tolérance pour 35 % des dossiers de primo-accédants pouvant monter jusqu'à 100 %. Concrètement, cela signifie que la plupart des acquéreurs doivent disposer d'un apport personnel couvrant au minimum 10 % de la valeur du bien, en plus des frais d'acquisition. 4316 4317La question pertinente n'est pas de savoir quel montant la banque est disposée à accorder, mais quel niveau d'endettement permet de conserver un mode de vie stable, une épargne régulière et une marge de sécurité durable. Dans la pratique, une mensualité représentant 25 à 30 % des revenus nets du ménage, assortie d'une capacité d'épargne résiduelle, constitue un plancher de prudence plus fiable que le maximum théorique. 4318 4319--- 4320 4321## Le coût global : bien au-delà du prix affiché 4322 4323L'une des surprises les plus fréquentes pour un primo-accédant belge est la découverte du coût réel de l'acquisition. Le prix affiché du bien n'est que le point de départ. Les droits d'enregistrement s'élèvent à 12,5 % en Wallonie et à Bruxelles, et à 12 % en Flandre pour un investissement â mais pour une habitation propre et unique, la Flandre applique un tarif réduit de 3 %, et Bruxelles accorde un abattement sur la première tranche de 200 000 euros (soit une économie pouvant atteindre 25 000 euros). En Wallonie, un abattement de 20 000 euros sur la base imposable est applicable pour les habitations modestes. 4324 4325Aux droits d'enregistrement s'ajoutent les honoraires du notaire, encadrés par la loi et calculés de manière dégressive sur le prix du bien, les frais d'inscription hypothécaire, les frais de dossier bancaire, le coût de l'expertise immobilière exigée par la banque, et l'assurance solde restant dû. 4326 4327En ordre de grandeur, un primo-accédant doit prévoir un surcoût de 12 à 16 % au-dessus du prix d'achat, selon la Région et le régime fiscal applicable. Pour un bien affiché à 300 000 euros, cela représente entre 36 000 et 48 000 euros de frais supplémentaires. Ignorer cette réalité, c'est entamer son projet avec un déficit de trésorerie qui fragilise l'ensemble de la construction financière. 4328 4329--- 4330 4331## Interpréter correctement le taux d'intérêt 4332 4333Comparer des crédits hypothécaires uniquement sur la base du taux nominal est une approche trompeuse. Deux offres au même taux nominal peuvent diverger significativement en coût total si les conditions accessoires diffèrent : frais de dossier, obligation de domiciliation des revenus, assurances liées, conditions de remboursement anticipé. 4334 4335En Belgique, la loi impose aux établissements de crédit de communiquer le TAEG â le taux annuel effectif global â qui intègre l'ensemble des coûts du crédit. C'est ce chiffre, et non le taux nominal, qui doit servir de base de comparaison. 4336 4337La durée du crédit est un paramètre au moins aussi déterminant que le taux. Un emprunt de 250 000 euros à 3,5 % sur vingt ans génère un coût total d'intérêts d'environ 98 000 euros. Le même montant à 3,3 % sur vingt-cinq ans â un taux légèrement inférieur, donc apparemment plus attractif â coûte environ 115 000 euros d'intérêts. La durée plus longue annule largement l'avantage du taux et ajoute 17 000 euros au coût réel du financement. 4338 4339La mensualité inférieure que procure un allongement de durée est séduisante, mais elle a un prix. La décision doit intégrer trois paramètres simultanément : le niveau réel de mensualité acceptable, le coût total du crédit sur sa durée de vie et la capacité de maintenir une épargne de précaution. Un financement stable sur vingt ans est presque toujours plus économique qu'un financement étiré sur vingt-cinq ans pour le même montant. 4340 4341--- 4342 4343## Les erreurs de financement les plus coûteuses 4344 4345La première erreur, et la plus structurante, est de raisonner en montant maximum plutôt qu'en mensualité soutenable. La banque est disposée à prêter un certain montant ; cela ne signifie pas que l'emprunteur est en mesure de le supporter sur vingt ans sans sacrifier son niveau de vie, son épargne ou sa marge de manÅuvre face aux imprévus. 4346 4347La deuxième erreur est la sous-estimation systématique des charges post-acquisition. Un propriétaire supporte des coûts que le locataire ignore : le précompte immobilier, l'entretien structurel, les assurances bâtiment, les charges de copropriété non récupérables et, le cas échéant, les travaux de mise en conformité énergétique. Ces charges représentent en Belgique entre 1,5 et 3 % de la valeur du bien par an. 4348 4349La troisième erreur est l'acceptation automatique de l'assurance solde restant dû proposée par la banque prêteuse. La loi belge autorise l'emprunteur à souscrire cette assurance auprès de n'importe quel assureur, et les écarts de primes entre établissements peuvent atteindre 30 à 40 % pour des couvertures équivalentes. Sur la durée d'un crédit de vingt ans, cette différence se chiffre en milliers d'euros. 4350 4351Enfin, de nombreux primo-accédants négligent les avantages fiscaux régionaux auxquels ils ont droit. Le chèque-habitat wallon, les abattements bruxellois et flamand, les réductions de droits d'enregistrement pour habitation modeste : ces dispositifs sont spécifiques à chaque Région et évoluent régulièrement. Ne pas les intégrer dans le calcul, c'est laisser de l'argent sur la table. 4352 4353--- 4354 4355## La simulation comme outil de décision 4356 4357Une simulation de crédit ne se résume pas à un calcul de mensualité. Elle doit permettre de tester la robustesse du projet financier dans plusieurs scénarios : que se passe-t-il si les taux augmentent lors d'un refinancement ? Si l'un des revenus du ménage disparaît temporairement ? Si des travaux imprévus s'imposent dans les trois premières années ? 4358 4359La simulation multi-scénarios est l'outil qui distingue un projet fragile d'un projet solide. Elle ne vise pas la précision â les hypothèses resteront toujours imparfaites â mais la cohérence. Un projet qui ne résiste qu'au scénario le plus favorable est un projet à risque. Un projet qui reste viable même dans un scénario dégradé est un projet construit sur des base
4359s saines. 4360 4361--- 4362 4363## Conclusion 4364 4365La réussite d'un premier achat immobilier se joue autant sur la qualité du financement que sur la qualité du bien acquis. Un crédit adapté est celui qui ne maximise pas le montant emprunté, mais qui préserve une flexibilité durable : la capacité de continuer à épargner, d'absorber un imprévu, de ne pas dépendre d'un seul scénario économique pour rester solvable. 4366 4367Le marché immobilier belge offre des opportunités réelles aux primo-accédants qui prennent le temps de structurer leur financement avant de visiter. Ceux qui commencent par les chiffres avant de tomber amoureux d'un bien sont aussi ceux qui achètent dans les meilleures conditions. 4368 4369--- 4370 4371## Intégration Arcanes 4372 4373Le simulateur de prêt hypothécaire Arcanes permet de calculer la mensualité, de visualiser le tableau d'amortissement complet et de comparer plusieurs scénarios de durée et de taux en quelques secondes. L'objectif est de donner au primo-accédant les mêmes outils de décision que ceux utilisés par les investisseurs professionnels â avant même de contacter une banque. 4374 4375--- 4376 4377## Questions fréquentes 4378 4379### Quel niveau d'apport est considéré comme équilibré pour un premier achat ? 4380 4381Un apport couvrant au minimum les frais d'acquisition â soit 12 à 16 % du prix du bien selon la Région â constitue le plancher recommandé. Idéalement, une réserve complémentaire de trois à six mois de charges permet d'éviter de se retrouver sans filet de sécurité immédiatement après l'achat. Ãpuiser l'intégralité de son épargne pour maximiser l'apport est une stratégie risquée qui laisse le nouveau propriétaire vulnérable au moindre imprévu. 4382 4383### Peut-on emprunter les frais de notaire en Belgique ? 4384 4385C'est techniquement possible dans certains cas, notamment pour les primo-accédants disposant d'un profil financier solide et de revenus stables. La Banque Nationale autorise les établissements à accorder une quotité supérieure à 90 % pour 35 % des dossiers de primo-accédants. Toutefois, emprunter à plus de 100 % du prix du bien augmente le coût total du crédit et réduit significativement la marge de sécurité financière. 4386 4387### Comment déterminer la durée de crédit optimale ? 4388 4389La durée optimale est celle qui produit une mensualité supportable tout en limitant le coût total des intérêts. En pratique, la fourchette de vingt à vingt-cinq ans est la plus fréquente en Belgique. Au-delà de vingt-cinq ans, le surcoût d'intérêts devient disproportionné par rapport à la réduction de mensualité obtenue. La meilleure méthode consiste à simuler plusieurs durées et à comparer le coût total plutôt que la mensualité seule. 4390 4391### Faut-il consulter un courtier ou uniquement sa banque ? 4392 4393Consulter sa banque habituelle et au moins un courtier indépendant permet d'obtenir une vision comparative du marché. Le courtier a accès à un panel d'établissements et peut négocier des conditions que l'emprunteur n'obtiendrait pas en démarche directe. En Belgique, la rémunération du courtier est généralement supportée par la banque prêteuse, ce qui signifie que le service est gratuit pour l'emprunteur dans la plupart des cas. 4394 4395### Existe-t-il un test simple pour vérifier si l'on emprunte trop ? 4396 4397La méthode la plus concrète consiste à mettre de côté, chaque mois pendant trois à six mois, le montant de la future mensualité augmenté d'une provision pour charges de propriétaire. Si cette discipline est tenable sans tension, le projet est viable. Si elle impose des sacrifices significatifs sur le mode de vie courant, le montant emprunté est probablement trop élevé. 4398`,JF=`--- 4399title: "Uw eerste vastgoedaankoop in België financieren: de complete gids om valkuilen te vermijden" 4400slug: "financer-premier-achat-immobilier-belgique" 4401tag: "Financement" 4402readTime: "10" 4403publishDate: "20 januari 2026" 4404author: "Arcanes Team" 4405excerpt: "De meeste eerste kopers maken financieringsfouten van 15 000 tot 50 000 ⬠over de looptijd van het krediet. Gids om valkuilen te vermijden." 4406image: "/images/blog/first-home-sold.jpg" 4407--- 4408 4409# Uw eerste vastgoedaankoop in België financieren: de complete gids om valkuilen te vermijden 4410 4411In België overschrijdt het gemiddelde bedrag van een hypothecair krediet voor een eerste aankoop vandaag de 200 000 euro, over een looptijd die meestal tussen twintig en vijfentwintig jaar ligt. Op die schaal van tijd en bedrag vertegenwoordigt een verschil van twintig basispunten op de rentevoet â ofwel 0,20 % â enkele duizenden euro's aan totale kosten. En toch ondertekenen de meeste eerste kopers hun kredietaanbod zonder meer dan twee bankvoorstellen te hebben vergeleken. 4412 4413De wens om eigenaar te worden is legitiem: uit de huurmarkt stappen, een vermogen opbouwen, de woonsituatie stabiliseren. Maar de eerste aankoop blijft de zwaarste financiële verbintenis die een gezin in zijn leven zal aangaan. De meest voorkomende fout is de financiering te behandelen als een administratieve formaliteit die het aankoopproces afsluit, terwijl het in werkelijkheid het meest structurerende element van het project is. Een pand dat vastgoedkundig pertinent is, kan een financieel risico worden als het op een onaangepaste manier gefinancierd wordt. 4414 4415--- 4416 4417## Structurerende synthese 4418 4419De financiering van een eerste vastgoedaankoop in België draait om drie assen die de meeste kopers onderschatten: de werkelijke leencapaciteit, die zich niet beperkt tot de schuldgraad van 33 % die door de banken wordt gecommuniceerd; de globale kost van de operatie, die de vraagprijs met 12 tot 16 % overschrijdt naargelang het Gewest; en de keuze van de looptijd en structuur van het krediet, waarvan de impact op de totale kost kan variëren van 15 000 tot 50 000 euro over de levensduur van de lening. Een beheerste financiering is niet diegene die het geleende bedrag maximaliseert, maar diegene die een veiligheidsmarge bewaart, een spaarkapaciteit behoudt en onvoorziene omstandigheden opvangt. 4420 4421Dit financieringsluik maakt deel uit van een breder aankoopproces. Voor een volledig overzicht â van de markt tot de kosten, van het EPC tot de checklist bij de notaris â raadpleeg onze [complete gids voor vastgoed kopen in België in 2026](/blog/acheter-bien-immobilier-belgique-2026). 4422 4423--- 4424 4425## De werkelijke leencapaciteit herdefiniëren 4426 4427De regel van maximaal 33 % schuldgraad is een nuttig referentiepu
4427nt, maar vertelt een onvolledig verhaal. Deze ratio, berekend op het netto-inkomen, houdt geen rekening met de variabele lasten van het gezin, de werkelijke stabiliteit van de inkomsten, noch met de veerkracht bij een schok â jobverlies, scheiding, ziekte, rentestijging bij herfinanciering. 4428 4429In België heeft de Nationale Bank sinds 2020 macroprudentiële aanbevelingen ingevoerd die de leenpraktijken van de instellingen omkaderen. Voor eerste kopers wordt de quotiteit (de verhouding tussen het geleende bedrag en de waarde van het pand) in de meeste gevallen geplafonneerd op 90 %, met een tolerantie voor 35 % van de dossiers van eerste kopers die tot 100 % mogen gaan. Concreet betekent dit dat de meeste kopers over een eigen inbreng moeten beschikken die minstens 10 % van de waarde van het pand dekt, bovenop de aankoopkosten. 4430 4431De pertinente vraag is niet welk bedrag de bank bereid is toe te kennen, maar welk schuldniveau toelaat om een stabiele levensstandaard, een regelmatige spaarkapaciteit en een duurzame veiligheidsmarge te behouden. In de praktijk vormt een mensualiteit van 25 tot 30 % van het netto gezinsinkomen, met een residuele spaarkapaciteit, een betrouwbaardere voorzichtigheidsdrempel dan het theoretische maximum. 4432 4433--- 4434 4435## De globale kost: veel meer dan de vraagprijs 4436 4437Een van de frequentste verrassingen voor een Belgische eerste koper is de ontdekking van de werkelijke aankoopkost. De vraagprijs van het pand is slechts het vertrekpunt. De registratierechten bedragen 12,5 % in Wallonië en Brussel, en 12 % in Vlaanderen voor een investering â maar voor een eigen en enige woning past Vlaanderen een verlaagd tarief van 3 % toe, en kent Brussel een abattement toe op de eerste schijf van 200 000 euro (een besparing die kan oplopen tot 25 000 euro). In Wallonië is een abattement van 20 000 euro op de belastbare grondslag van toepassing voor bescheiden woningen. 4438 4439Bij de registratierechten komen de notarishonoraria, wettelijk geregeld en degressief berekend op de prijs van het pand, de hypothecaire inschrijvingskosten, de bankdossierkosten, de kosten van de vastgoedexpertise die door de bank wordt vereist, en de schuldsaldoverzekering. 4440 4441In orde van grootte moet een eerste koper rekenen op een meerkost van 12 tot 16 % bovenop de aankoopprijs, naargelang het Gewest en het toepasselijke fiscale regime. Voor een pand met een vraagprijs van 300 000 euro vertegenwoordigt dat tussen 36 000 en 48 000 euro aan bijkomende kosten. Deze realiteit negeren betekent het project starten met een kastekort dat de hele financiële constructie fragiliseert. 4442 4443--- 4444 4445## De rentevoet correct interpreteren 4446 4447Hypothecaire kredieten vergelijken op basis van de nominale rentevoet alleen is een misleidende aanpak. Twee aanbiedingen met dezelfde nominale rente kunnen aanzienlijk verschillen in totale kost als de bijkomende voorwaarden uiteenlopen: dossierkosten, verplichting tot domiciliëring van het inkomen, gekoppelde verzekeringen, voorwaarden voor vervroegde terugbetaling. 4448 4449In België verplicht de wet de kredietinstellingen om het JKP mee te delen â het jaarlijks kostenpercentage â dat alle kosten van het krediet integreert. Dit cijfer, en niet de nominale rente, moet als vergelijkingsbasis dienen. 4450 4451De looptijd van het krediet is een minstens even bepalende parameter als de rentevoet. Een lening van 250 000 euro aan 3,5 % over twintig jaar genereert een totale interestkost van ongeveer 98 000 euro. Hetzelfde bedrag aan 3,3 % over vijfentwintig jaar â een lichtjes lagere rente, dus ogenschijnlijk aantrekkelijker â kost ongeveer 115 000 euro aan intresten. De langere looptijd annuleert ruimschoots het rentevoordeel en voegt 17 000 euro toe aan de werkelijke financieringskost. 4452 4453De lagere mensualiteit die een verlenging van de looptijd oplevert is verleidelijk, maar heeft een prijs. De beslissing moet drie parameters tegelijk integreren: het werkelijk aanvaardbare maandelijkse bedrag, de totale kost van het krediet over zijn levensduur en de capaciteit om een voorzorgsspaarkapaciteit te behouden. Een stabiele financiering over twintig jaar is bijna altijd voordeliger dan een uitgerekte financiering over vijfentwintig jaar voor hetzelfde bedrag. 4454 4455--- 4456 4457## De duurste financieringsfouten 4458 4459De eerste fout, en de meest structurerende, is redeneren in maximaal bedrag in plaats van in draagbare mensualiteit. De bank is bereid een bepaald bedrag te lenen; dat betekent niet dat de ontlener in staat is dit twintig jaar lang te dragen zonder zijn levensstandaard, zijn spaargeld of zijn manoeuvreerruimte bij onvoorziene omstandigheden op te offeren. 4460 4461De tweede fout is de systematische onderschatting van de lasten na aankoop. Een eigenaar draagt kosten die de huurder niet kent: de onroerende voorheffing, het structureel onderhoud, de gebou
4461wverzekering, de niet-recupereerbare mede-eigendomskosten en eventueel de werken voor energetische conformering. Deze lasten vertegenwoordigen in België tussen 1,5 en 3 % van de waarde van het pand per jaar. 4462 4463De derde fout is de automatische aanvaarding van de schuldsaldoverzekering die door de kredietverlenende bank wordt voorgesteld. De Belgische wet staat de ontlener toe deze verzekering bij eender welke verzekeraar af te sluiten, en de premieverschillen tussen instellingen kunnen 30 tot 40 % bedragen voor gelijkwaardige dekkingen. Over de looptijd van een krediet van twintig jaar loopt dit verschil op tot duizenden euro's. 4464 4465Ten slotte verwaarlozen talrijke eerste kopers de gewestelijke fiscale voordelen waarop ze recht hebben. De Waalse wooncheque, het Brussels en Vlaams abattement, de vermindering van registratierechten voor bescheiden woningen: deze regelingen zijn specifiek voor elk Gewest en evolueren regelmatig. Ze niet in de berekening opnemen is geld op tafel laten liggen. 4466 4467--- 4468 4469## De simulatie als beslissingsinstrument 4470 4471Een kredietsimulatie beperkt zich niet tot een berekening van de mensualiteit. Ze moet toelaten de robuustheid van het financiële project in meerdere scenario's te testen: wat gebeurt er als de rente stijgt bij een herfinanciering? Als een van de gezinsinkomens tijdelijk wegvalt? Als onvoorziene werken zich opdringen in de eerste drie jaar? 4472 4473De multi-scenariosimulatie is het instrument dat een fragiel project onderscheidt van een solide project. Ze streeft niet naar precisie â de hypotheses zullen altijd onvolmaakt blijven â maar naar coherentie. Een project dat alleen in het gunstigste scenario standhoudt, is een risicoproject. Een project dat levensvatbaar blijft, zelfs in een verslechterd scenario, is een project gebouwd op gezonde fundamenten. 4474 4475--- 4476 4477## Conclusie 4478 4479Het succes van een eerste vastgoedaankoop hangt evenzeer af van de kwaliteit van de financiering als van de kwaliteit van het aangekochte pand. Een aangepast krediet is niet datgene dat het geleende bedrag maximaliseert, maar datgene dat een duurzame flexibiliteit bewaart: de capaciteit om te blijven sparen, een onvoorziene situatie op te vangen en niet afhankelijk te zijn van één enkel economisch scenario om solvabel te blijven. 4480 4481De Belgische vastgoedmarkt biedt reële kansen aan eerste kopers die de tijd nemen om hun financiering te structureren vóór ze gaan bezichtigen. Zij die beginnen met de cijfers alvorens verliefd te worden op een pand, zijn ook degenen die in de beste omstandigheden kopen. 4482 4483--- 4484 4485## Integratie Arcanes 4486 4487De Arcanes hypotheeksimulator maakt het mogelijk om de mensualiteit te berekenen, de volledige aflossingstabel te visualiseren en meerdere scenario's van looptijd en rentevoet in enkele seconden te vergelijken. Het doel is de eerste koper dezelfde beslissingsinstrumenten te geven als die van professionele investeerders â nog vóór contact op te nemen met een bank. 4488 4489--- 4490 4491## Veelgestelde vragen 4492 4493### Welk niveau van eigen inbreng wordt als evenwichtig beschouwd voor een eerste aankoop? 4494 4495Een eigen inbreng die minstens de aankoopkosten dekt â ofwel 12 tot 16 % van de prijs van het pand naargelang het Gewest â vormt de aanbevolen minimumdrempel. Idealiter biedt een bijkomende reserve van drie tot zes maanden lasten de mogelijkheid om niet zonder vangnet te zitten onmiddellijk na de aankoop. Het volledige spaargeld uitputten om de inbreng te maximaliseren is een risicovolle strategie die de nieuwe eigenaar kwetsbaar maakt bij het minste onvoorziene. 4496 4497### Kan men de notariskosten lenen in België? 4498 4499Dit is technisch mogelijk in bepaalde gevallen, met name voor eerste kopers met een solide financieel profiel en stabiele inkomsten. De Nationale Bank staat de instellingen toe een quotiteit boven 90 % toe te kennen voor 35 % van de dossiers van eerste kopers. Echter, lenen boven 100 % van de prijs van het pand verhoogt de totale kost van het krediet en vermindert de financiële veiligheidsmarge aanzienlijk. 4500 4501### Hoe bepaalt men de optimale kredietlooptijd? 4502 4503De optimale looptijd is diegene die een draagbare mensualiteit oplevert en tegelijk de totale interestkost beperkt. In de praktijk is de vork van twintig tot vijfentwintig jaar de meest voorkomende in België. Boven vijfentwintig jaar wordt de meerkost aan intresten disproportioneel ten opzichte van de verkregen verlaging van de mensualiteit. De beste methode bestaat erin meerdere looptijden te simuleren en de totale kost te vergelijken in plaats van enkel de mensualiteit. 4504 4505### Moet men een kredietbemiddelaar raadplegen of enkel zijn eigen bank? 4506 4507Zijn eigen bank en minstens één onafhankelijke kredietbemiddelaar raadplegen maakt het mogelijk een vergelijkend beeld van de markt te krijgen. De bemiddelaar heeft toegang tot een panel van instellingen en kan voorwaarden onderhandelen die de ontlener niet zou bekomen via een rechtstreekse aanpak. In België wordt de vergoeding van de bemiddelaar doorgaans gedragen door de kredietverlenende bank, wat betekent dat de dienst in de meeste gevallen gratis is voor de ontlener. 4508 4509### Bestaat er een eenvoudige test om na te gaan of men te veel leent? 4510 4511De meest concrete methode bestaat erin gedurende drie tot zes maanden maandelijks het bedrag van de toekomstige mensualiteit opzij te zetten, verhoogd met een provisie voor eigenaarslasten. Als deze discipline haalbaar is zonder spanning, is het project levensvatbaar. Als het aanzienlijke offers oplegt aan de dagelijkse levensstandaard, is het geleende bedrag waarschijnlijk te hoog. 4512`,QF=`--- 4513title: "Buying real estate in Belgium: how to estimate deed costs and avoid mistakes?" 4514slug: "frais-acte-achat-immobilier-belgique-estimation-guide" 4515tag: "Financement" 4516readTime: "14" 4517publishDate: "December 15, 2025" 4518author: "Arcanes Team" 4519excerpt: "Complete guide to deed costs for a real estate purchase in Belgium. Registration duties, notary fees, and administrative costs by region." 4520image: "/images/blog/notary-fees-belgium.jpg" 4521--- 4522 4523# Buying real estate in Belgium: how to estimate deed costs and avoid mistakes? 4524 4525In Belgium, the listed price of a real estate property does not represent the final cost of the acquisition. The largest additional expense consists of the deed costs (_frais d'acte_). Commonly and mistakenly referred to as "notary fees" (_frais de notaire_), they actually encompass several legal, tax, and administrative components. Depending on the region and the nature of the project, they generally sit between 12% and 15% of the price, sometimes more if mortgage financing is involved. 4526 4527Precise anticipation allows you to establish a coherent budget, avoid late revisions, and secure decision-making even before making an offer. 4528 4529--- 4530 4531## Definition and scope of deed costs 4532 4533Deed costs are not limited to the notary's actual fees; they primarily include registration duties and various administrative costs linked to the creation and transcription of the deed. Unlike other professional services, notary fees are regulated by a statutory scale that is identical throughout the country. 4534 4535Deed costs notably include: 4536 4537- registration duties (the largest portion), 4538- notary fees (statutory scale and non-negotiable), 4539- administrative costs, excerpts, publications, and official documents, 4540- costs linked to the mortgage guarantee if bank financing is used. 4541 4542In the majority of cases, registration duties represent approximately 80% to 85% of the total amount of the costs. 4543 4544--- 4545 4546## Registration duties: a determining and regionalized cost 4547 4548Registration duties constitute the main element of the calculation. Their amount depends on the property's region and the type of purchase. Certain reductions and favorable tax regimes exist, but they are never automatic and must meet cumulative conditions. 4549 4550| Region | Standard rate | Possible reductions | Example of conditions | 4551| -------- | ------------- | ------------------- | ------------------------------------ | 4552| Brussels | 12.5% | Yes | Sole and sustainable occupation | 4553| Wallonia | 12.5% | Yes | Modest housing and income criteria | 4554| Flanders | 12% | Yes | Sole residence, effective occupation | 4555 4556Any reduction must be explicitly requested and can be revoked in case of non-compliance with the initial commitments. 4557 4558--- 4559 4560## Notary fees: legal framework and lack of negotiation 4561 4562Notary fees are determined by royal decree and applied uniformly, regardless of the chosen notary or their location. The selection of a notary can be guided by other criteria (availability, experience, support), but it does not affect the amount of the fees. 4563 4564--- 4565 4566## Additional costs linked to financing and guarantees 4567
4568When a mortgage loan is requested, additional costs must be integrated. They notably concern the mortgage registration, banking formalities, and certain required or recommended insurance policies. 4569 4570| Type of cost | Conditions of application | Indicative range | 4571| ----------------------------- | ---------------------------------------------- | ---------------- | 4572| Mortgage transcription | Bank financing | â¬800 to â¬1,000 | 4573| Bank valuation | Depends on institution | â¬350 to â¬700 | 4574| Processing fees | Variable depending on bank | â¬200 to â¬600 | 4575| Outstanding balance insurance | Borrower profile | Variable | 4576| Complementary deeds | Power of attorney, joint ownership, succession | â¬50 to â¬300 | 4577 4578Depending on the setup, it is reasonable to add **1.5% to 2%** of the price to cover these complementary costs in case of a loan. 4579 4580--- 4581 4582## Common misconceptions 4583 4584| Common perception | Fact to know | 4585| ---------------------------------------- | ------------------------------------------------------------------- | 4586| "Deed costs are identical everywhere" | The rate varies depen
4586ding on the region and the type of acquisition | 4587| "They can be negotiated with the notary" | Fees follow a mandatory statutory scale | 4588| "The bank also finances the costs" | Financing generally covers the property, not its costs | 4589| "Reductions are applied automatically" | A formal request and compliance with conditions are required | 4590 4591--- 4592 4593## Quick estimation method 4594 4595To obtain a coherent global estimate, a simple method can be used as a first approach: 4596 4597> Property price à 1.15 = indicative total budget 4598 4599| Listed price | Approximate global budget | 4600| ------------ | ------------------------- | 4601| â¬200,000 | â¬230,000 | 4602| â¬300,000 | â¬345,000 | 4603| â¬450,000 | â¬517,500 | 4604 4605This formula does not replace a detailed calculation, but it allows you to set a decision-making framework before taking any steps. 4606 4607--- 4608 4609## Conclusion 4610 4611Deed costs constitute an essential component of the real estate budget in Belgium. Their estimation should not be done at the end of the process, but from the very first stages of the project. A systematic integration of these costs into budget planning improves the quality of the decision, facilitates discussions with financial institutions, and reduces the risk of late adjustments. 4612 4613The recommended approach is based on three steps: quick estimation, detailed simulation according to the region, and validation with a notary. 4614 4615For a complete view of the purchasing processâfrom the property search to the signing of the deed, including financing, taxation, and pitfalls to avoidâconsult our [complete guide to buying real estate in Belgium in 2026](/blog/buying-real-estate-belgium-2026). 4616 4617--- 4618 4619## Frequently Asked Questions about deed costs in Belgium 4620 4621**Why do deed costs represent a large part of the budget?** 4622Because they include taxes and legal formalities representing the majority of the amount, in particular registration duties. 4623 4624**Can deed costs be reduced or negotiated?** 4625Fees are not negotiable, but certain favorable regimes exist under specific conditions, depending on the region and the buyer's personal situation. 4626 4627**Does the bank finance the acquisition costs?** 4628Financing is generally for the real estate property itself. Financing the costs is only possible in certain cases, depending on the lending institution's analysis. 4629 4630**Are deed costs identical for a new property and an existing property?** 4631Tax regimes can differ depending on the type of transaction, particularly in certain configurations involving new builds or off-plan purchases. 4632 4633**How can I get an accurate calculation?** 4634A specialized simulator or a consultation with a notary will provide an estimate tailored to the region, the type of purchase, and your personal situation. 4635`,XF=`--- 4636title: "Achat immobilier en Belgique : comment estimer les frais d'acte et éviter les erreurs ?" 4637slug: "frais-acte-achat-immobilier-belgique-estimation-guide" 4638tag: "Financement" 4639readTime: "14" 4640publishDate: "15 décembre 2025" 4641author: "Ãquipe Arcanes" 4642excerpt: "Guide complet des frais d'acte pour un achat immobilier en Belgique. Droits d'enregistrement, honoraires notaire, frais administratifs par région." 4643image: "/images/blog/notary-fees-belgium.jpg" 4644--- 4645 4646# Achat immobilier en Belgique : comment estimer les frais d'acte et éviter les erreurs ? 4647 4648En Belgique, le prix affiché dâun bien immobilier ne représente pas le coût final de lâacquisition. Le poste le plus important complémentaire est constitué des frais dâacte. Couramment assimilés à tort aux « frais de notaire », ils regroupent en réalité plusieurs composantes légales, fiscales et administratives. Selon la région et la nature du projet, ils se situent généralement entre 12 % et 15 % du prix, parfois davantage si un financement hypothécaire est impliqué. 4649 4650Une anticipation précise permet dâétablir un budget cohérent, dâéviter des révisions tardives et de sécuriser la prise de décision avant même la formulation dâune offre. 4651 4652--- 4653 4654## Définition et périmètre des frais d'acte 4655
4656Les frais dâacte ne se limitent pas aux honoraires du notaire ; ils englobent principalement les droits dâenregistrement et divers frais administratifs liés à la création et la transcription de lâacte. à lâinverse dâautres prestations professionnelles, les honoraires notariaux sont encadrés par un barème légal identique sur tout le territoire. 4657 4658Les frais dâacte regroupent notamment : 4659 4660- les droits dâenregistrement (poste le plus important), 4661- les honoraires notariaux (barème légal et non négociable), 4662- les frais administratifs, extraits, publications et documents officiels, 4663- les frais liés à la garantie hypothécaire si financement bancaire. 4664 4665Dans la majorité des cas, les droits dâenregistrement représentent environ 80 % à 85 % du montant total des frais. 4666 4667--- 4668 4669## Les droits dâenregistrement : un coût déterminant et régionalisé 4670 4671Les droits dâenregistrement constituent lâélément principal du calcul. Leur montant dépend de la région du bien et du type dâachat. Certaines réductions et régimes avantageux existent, mais ne sont jamais automatiques et doivent respecter des conditions cumulatives. 4672 4673| Région | Taux standard | Réductions possibles | Exemple de conditions | 4674| --------- | ------------- | -------------------- | --------------------------------------- | 4675| Bruxelles | 12,5 % | Oui | Occupation propre et durable | 4676| Wallonie | 12,5 % | Oui | Logement modeste et critères de revenus | 4677| Flandre | 12 % | Oui | Habitation unique, occupation effective | 4678 4679Toute réduction doit être demandée explicitement et peut être remise en cause en cas de non-respect des engagements initiaux. 4680 4681--- 4682 4683## Honoraires du notaire : cadre légal et absence de négociation 4684 4685Les honoraires notariaux sont déterminés par arrêté royal et appliqués de manière uniforme, indépendamment du notaire choisi ou de sa localisation. La sélection dâun notaire peut être guidée par dâautres critères (disponibilité, expérience, accompagnement), mais nâinflue pas sur le montant des honoraires. 4686 4687--- 4688 4689## Frais additionnels liés au financement et aux garanties 4690 4691Lorsquâun crédit hypothécaire est sollicité, des frais supplémentaires doivent être intégrés. Ils concernent notamment la prise dâhypothèque, les formalités bancaires et certaines assurances exigées ou recommandées. 4692 4693| Type de frais | Conditions dâapplication | Fourchette indicative | 4694| -------------------------- | ----------------------------------- | --------------------- | 4695| Transcription hypothécaire | Financement bancaire | 800 à 1 000 ⬠| 4696| Expertise bancaire | Selon établissement | 350 à 700 ⬠| 4697| Frais de dossier | Variables selon banque | 200 à 600 ⬠| 4698| Assurance solde restant dû | Profil emprunteur | Variable | 4699| Actes complémentaires | Procuration, indivision, succession | 50 à 300 ⬠| 4700 4701Selon la configuration, il est raisonnable dâajouter **1,5 % à 2 %** du prix pour couvrir ces frais complémentaires en cas de crédit. 4702 4703--- 4704 4705## Idées reçues fréquentes 4706 4707| Perception courante | Précision à connaître | 4708| -------------------------------------------------- | ---------------------------------------------------------------- | 4709| « Les frais dâacte sont identiques partout » | Le taux varie selon la région et le type dâacquisition | 4710| « Ils peuvent être négociés avec le notaire » | Les honoraires suivent un barème légal obligatoire | 4711| « La banque finance également les frais » | Le financement porte généralement sur le bien, pas sur ses frais | 4712| « Les réductions sont automatiquement appliquées » | Une demande formelle et un respect de conditions sont requis | 4713 4714--- 4715 4716## Méthode dâestimation rapide 4717 4718Pour obtenir une estimation globale cohérente, une méthode simple peut être utilisée en première approche : 4719 4720> Prix du bien à 1,15 = budget total indicatif 4721 4722| Prix affiché | Budget global approximatif | 4723| ------------ | -------------------------- | 4724| 200 000 ⬠| 230 000 ⬠| 4725| 300 000 ⬠| 345 000 ⬠| 4726| 450 000 ⬠| 517 500 ⬠| 4727 4728Cette formule ne remplace pas un calcul détaillé, mais permet de poser un cadre décisionnel avant dâengager des démarches. 4729 4730--- 4731
4732## Conclusion 4733 4734Les frais dâacte constituent une composante essentielle du budget immobilier en Belgique. Leur estimation ne doit pas être réalisée en fin de processus, mais dès les premières étapes du projet. Une intégration systématique de ces frais dans la réflexion budgétaire améliore la qualité de la décision, facilite les échanges avec les établissements financiers et réduit les risques dâajustement tardif. 4735 4736Lâapproche recommandée repose sur trois étapes : estimation rapide, simulation détaillée selon la région, et validation auprès dâun notaire. 4737 4738Pour une vue complète du processus d'achat â de la recherche du bien à la signature de l'acte, en passant par le financement, la fiscalité et les pièges à éviter â consultez notre [guide complet pour acheter un bien immobilier en Belgique en 2026](/blog/acheter-bien-immobilier-belgique-2026). 4739 4740--- 4741 4742## Questions fréquentes sur les frais dâacte en Belgique 4743 4744Pourquoi les frais dâacte représentent-ils une part importante du budget 4745Parce quâils incluent des taxes et formalités légales représentant la majorité du montant, en particulier les droits dâenregistrement. 4746 4747Peut-on réduire ou négocier les frais dâacte 4748Les honoraires ne sont pas négociables, mais certains régimes avantageux existent sous conditions, selon la région et la situation personnelle de lâacheteur. 4749 4750La banque finance-t-elle les frais dâacquisition 4751Le financement porte en principe sur le bien immobilier. Le financement des frais est possible uniquement dans certains cas, selon lâanalyse de lâétablissement prêteur. 4752 4753Les frais dâacte sont-ils identiques pour un bien neuf et un bien existant 4754Les régimes fiscaux peuvent différer selon le type dâopération, notamment dans certaines configurations de construction neuve ou dâacquisition sur plan. 4755 4756Comment obtenir un calcul précis 4757Un simulateur spécialisé ou une consultation notariale permettent dâobtenir une estimation adaptée à la région, au type dâachat et à la situation personnelle. 4758`,eO=`--- 4759title: "Vastgoed kopen in België: hoe aktekosten schatten en fouten vermijden?" 4760slug: "aktekosten-vastgoed-aankoop-belgie-schatting-gids" 4761tag: "Financiering" 4762readTime: "14" 4763publishDate: "15 december 2025" 4764author: "Team Arcanes" 4765excerpt: "Volledige gids over notariskosten bij een vastgoedaankoop in België. Registratierechten, notarisereloon en administratieve kosten per gewest." 4766image: "/images/blog/notary-fees-belgium.jpg" 4767--- 4768 4769# Vastgoed kopen in België: hoe aktekosten schatten en fouten vermijden? 4770 4771In België vertegenwoordigt de afficheprijs van een onroerend goed niet de uiteindelijke kostprijs van de aankoop. De belangrijkste bijkomende kostenpost wordt gevormd door de aktekosten. Hoewel ze vaak ten onrechte worden gelijkgesteld met "notariskosten", omvatten ze in werkelijkheid diverse wettelijke, fiscale en administratieve componenten. Afhankelijk van het gewest en de aard van het project liggen ze doorgaans tussen 12% en 15% van de prijs, en soms hoger indien er sprake is van een hypothecaire financiering. 4772 4773Een nauwkeurige anticipatie maakt het mogelijk om een coherent budget op te stellen, laattijdige herzieningen te vermijden en de besluitvorming veilig te stellen, nog voor er een bod wordt uitgebracht. 4774 4775--- 4776 4777## Definitie en omvang van de aktekosten 4778 4779De aktekosten beperken zich niet tot het ereloon van de notaris; ze omvatten voornamelijk de registratierechten en diverse administratieve kosten verbonden aan het opstellen en overschrijven van de akte. In tegenstelling tot andere professionele diensten zijn de notaristarieven vastgelegd in een wettelijke schaal die overal in het land identiek is. 4780 4781De aktekosten omvatten onder meer: 4782 4783- de registratierechten (de grootste kostenpost), 4784- het ereloon van de notaris (wettelijk tarief en niet onderhandelbaar), 4785- de administratieve kosten, uittreksels, publicaties en officiële documenten, 4786- de kosten verbonden aan de hypothecaire waarborg bij bankfinanciering. 4787 4788In de meeste gevallen vertegenwoordigen de registratierechten ongeveer 80% tot 85% van het totale bedrag van de kosten. 4789 4790--- 4791 4792## De registratierechten: een bepalende en geregionaliseerde kost 4793 4794De registratierechten vormen het belangrijkste element van de berekening. Het bedrag hangt af van het gewest waarin het goed gelegen is en het type aankoop. Er bestaan bepaalde verminderingen en gunstregimes, maar deze zijn nooit automatisch en moeten aan cumulatieve voorwaarden voldoen. 4795 4796| Gewest | Standaardtarief | Mogelijke verminderingen | Voorbeeld van voorwaarden | 4797| ---------- | --------------- | ------------------------ | ------------------------------------- | 4798| Brussel | 12,5 % | Ja | Eigen en duurzame bewoning | 4799| Wallonië | 12,5 % | Ja | Bescheiden w
4799oning en inkomenscriteria | 4800| Vlaanderen | 12 % | Ja | Enige woning, effectieve bewoning | 4801 4802Elke vermindering moet expliciet worden aangevraagd en kan worden herzien indien de oorspronkelijke verbintenissen niet worden nageleefd. 4803 4804--- 4805 4806## Ereloon van de notaris: wettelijk kader en geen onderhandeling 4807 4808Het ereloon van de notaris wordt bepaald bij koninklijk besluit en uniform toegepast, ongeacht de gekozen notaris of zijn locatie. De keuze van een notaris kan gebaseerd zijn op andere criteria (beschikbaarheid, ervaring, begeleiding), maar heeft geen invloed op het bedrag van het ereloon. 4809 4810--- 4811 4812## Bijkomende kosten voor financiering en waarborgen 4813 4814Wanneer een hypothecair krediet wordt aangevraagd, moeten extra kosten in rekening worden gebracht. Deze hebben met name betrekking op de hypothecaire inschrijving, bankformaliteiten en bepaalde vereiste of aanbevolen verzekeringen. 4815 4816| Type kosten | Toepassingsvoorwaarden | Indicatieve vork | 4817| ------------------------- | --------------------------------- | ---------------- | 4818| Hypothecaire inschrijving | Bankfinanciering | 800 tot 1.000 ⬠| 4819| Schatting door de bank | Afhankelijk van de instelling | 350 tot 700 ⬠| 4820| Dossierkosten | Variabel per bank | 200 tot 600 ⬠| 4821| Schuldsaldoverzekering | Profiel ontlener | Variabel | 4822| Bijkomende akten | Volmacht, onverdeeldheid, erfenis | 50 tot 300 ⬠| 4823 4824Afhankelijk van de configuratie is het redelijk om **1,5% tot 2%** van de prijs toe te voegen om deze bijkomende kosten te dekken in geval van een krediet. 4825 4826--- 4827 4828## Veelvoorkomende misvattingen 4829 4830| Gangbare opvatting | Noodzakelijke verduidelijking | 4831| ------------------------------------------------ | ------------------------------------------------------------- | 4832| "De aktekosten zijn overal hetzelfde" | Het tarief varieert naargelang het gewest en het type aankoop | 4833| "Er kan over onderhandeld worden met de notaris" | Het ereloon volgt een verplichte wettelijke schaal | 4834| "De bank financiert ook de kosten" | De financiering betreft doorgaans het pand, niet de kosten | 4835| "Verminderingen worden automatisch toegepast" | Een formele aanvraag en naleving van voorwaarden zijn vereist | 4836 4837--- 4838 4839## Snelle schattingsmethode 4840 4841Om een coherente globale schatting te krijgen, kan als eerste benadering een eenvoudige methode worden gebruikt: 4842 4843> Prijs van het pand à 1,15 = indicatief totaalbudget 4844 4845| Afficheprijs | Geschat globaal budget | 4846| ------------ | ---------------------- | 4847| 200.000 ⬠| 230.000 ⬠| 4848| 300.000 ⬠| 345.000 ⬠| 4849| 450.000 ⬠| 517.500 ⬠| 4850 4851Deze formule vervangt geen gedetailleerde berekening, maar maakt het mogelijk een beslissingskader te scheppen alvorens stappen te ondernemen. 4852 4853--- 4854 4855## Conclusie 4856 4857De aktekosten vormen een essentieel onderdeel van het vastgoedbudget in België. De schatting ervan mag niet aan het einde van het proces gebeuren, maar reeds in de eerste fasen van het project. Een systematische integratie van deze kosten in de budgettaire overweging verbetert de kwaliteit van de beslissing, vergemakkelijkt de gesprekken met financiële instellingen en vermindert het risico op laattijdige aanpassingen. 4858 4859De aanbevolen aanpak berust op drie stappen: snelle schatting, gedetailleerde simulatie per gewest en validatie bij een notaris. 4860 4861Voor een volledig overzicht van het aankoopproces â van het zoeken naar een woning tot de ondertekening bij de notaris, inclusief financiering, fiscaliteit en valkuilen â raadpleeg onze [complete gids voor vastgoed kopen in België in 2026](/blog/acheter-bien-immobilier-belgique-2026). 4862 4863--- 4864 4865## Veelgestelde vragen over aktekosten in België 4866 4867Waarom vertegenwoordigen aktekosten een belangrijk deel van het budget 4868Omdat ze belastingen en wettelijke formaliteiten omvatten die het grootste deel van het bedrag uitmaken, met name de registratierechten. 4869 4870Kan men de aktekosten verlagen of onderhandelen 4871Het ereloon is niet onderhandelbaar, maar er bestaan onder bepaalde voorwaarden gunstregimes, afhankelijk van het gewest en de persoonlijke situatie van de koper. 4872 4873Financiert de bank de aankoopkosten 4874De financiering betreft in principe het onroerend goed. De financiering van de kosten is enkel mogelijk in bepaalde gevallen, afhankelijk van de analyse van de kredietverstrekker. 4875 4876Zijn de aktekosten identiek voor een nieuwbouw en een bestaand pand 4877De fiscale regimes kunnen verschillen naargelang het type operatie, met name in bepaalde configuraties van nieuwbouw of aankoop op plan. 4878 4879Hoe verkrijg ik een nauwkeurige berekening 4880Een gespecialiseerde simulator of een raadpleging bij de notaris maken het mogelijk een schatting te verkrijgen die is aangepast aan het gewest, het type aankoop en de persoonlijke situatie. 4881`,tO=`--- 4882title: "Property or stocks in Belgium: 50 years of data compared" 4883slug: "immobilier-ou-bourse-belgique" 4884tag: "Investing" 4885readTime: 19 4886publishDate: "8 September 2026" 4887updateDate: "8 September 2026" 4888author: "Arcanes" 4889excerpt: "Three years of decline, a flat decade, then the 2026 law. What fifty years of Belgian prices say about bricks versus markets." 4890image: "/__l5e/assets-v1/d3e113c8-5792-482a-bd08-ff07ab2b7518/immobilier-ou-bourse-belgique.jpg" 4891imageVersion: "2" 4892imageAlt: "Brussels townhouse façade beside the glass façade of an office tower" 4893--- 4894 4895# Property or stocks in Belgium: 50 years of data compared 4896 4897In 1981, then again in 1982, then again in 1983, the price of Belgian houses fell. Three years running. Nobody tells that story, and for good reason: it contradicts the one thing everyone thinks they know about bricks and mortar. 4898 4899Over those same three years, global equity markets rose. 4900 4901That is the whole difficulty of the comparison. You are weighing an asset you know by heart â your parents' house, your neighbour's, the one you viewed on Saturday â against an asset you never see, which exists only as a line in an app. And you decide on instinct rather than on figures. 4902 4903So we reconstructed the full series of Belgian prices, from 1974 to 2024, municipality by municipality. It says property returned **6.0% a year in nominal terms**, unleveraged â while the MSCI World delivered 8.1% over the last thirty-five years, in euros. It also says the 1980s produced only 3.4% a year, and that the gap between Flanders and Wallonia widened by 0.9 percentage points every year for fifty years. 4904 4905But those two figures are not enough to decide, because they ignore everything that actually separates the two investments: 15% of entry costs on one side against 0.15% on the other, bank credit available to one and not the other, a tax regime that flipped on 1 January 2026, and twenty to forty hours a year that nobody bills. 4906 4907**Start with your own case.** The simulator below takes a Belgian municipality, a property and your deposit, and imposes **identical cash flows on both scenarios** â the only honest way to compare a mortgaged purchase with an unleveraged portfolio. The twelve sections that follow explain each of its parameters. 4908 4909<!-- SIMULATEUR: immo-vs-bourse --> 4910 4911## 1. What Belgian property actually returned 4912 4913**Belgian house prices rose 6.0% a year in nominal terms between 1974 and 2024, with no leverage.** But that average hides a lost decade: the 1980s produced just 3.4% a year, including three consecutive years of decline from 1981 to 1983. 4914 4915**Updated 8 September 2026** â series reconstructed from official cadastral statistics (1973-2009) and property statistics (2010-2024), 565 municipalities, median prices of ordinary houses weighted by transaction volume. _Sources: Statbel, FPS Finance â see our [methodology](/methodologie)._ 4916
4917Most comparisons recycle French figures, often a return of around 9% a year over thirty years, leverage and costs bundled together. Those figures describe neither the Belgian market nor its tax regime. Here are ours. 4918 4919### Fifty years of prices, decade by decade 4920 4921| Period | Nominal annual growth | 4922| ------------- | --------------------- | 4923| 1974-1980 | +12.8% | 4924| 1980-1990 | +3.4% | 4925| 1990-2000 | +6.8% | 4926| 2000-2010 | +8.1% | 4927| 2010-2020 | +3.1% | 4928| 2020-2024 | +4.8% | 4929| **1974-2024** | **+6.0%** | 4930 4931<!-- FIGURE:START prix-par-decennie --> 4932 4933Two findings the sales pitch tends to leave out, and which **figure 1** makes visible at a glance. 4934 4935**Belgian property has fallen, and not briefly.** The declines from 1981 to 1983 â â3.3%, â4.5%, â1.2% nominal â happened under double-digit inflation. The loss in purchasing power was therefore considerably heavier than those figures suggest. "Bricks always go up" is a claim that does not survive its own data. 4936 4937**Recent growth is not historical growth.** The 8.1% a year of 2000-2010 reflects a structural repricing: mortgage rates fell from roughly 8% to 4% and loan terms lengthened. That shift cannot repeat. Extrapolating 8% over the next twenty years is a bet, not a forecast. 4938 4939<!-- FIGURE:END --> 4940 4941> **Methodological note.** These figures are nominal. Conversion to real terms will follow once the Belgian health index series is integrated. We do not publish real returns computed on an approximate inflation rate. 4942 4943## 2. The regional divide, and why an average tells you nothing 4944 4945**Flemish property rose 6.2% a year over fifty years against 5.3% in Wallonia â 55% more value once compounded.** But high capital growth goes hand in hand with a low rental yield: a regional average decides nothing. 4946 4947That national 6.0% describes no actual municipality. Applied region by region, the same method gives this â raw level ratios, 1974 â 2024: 4948 4949| Region | Average price 1974 | Average price 2024 | Multiple | Per year | 4950| -------- | ------------------ | ------------------ | -------- | -------- | 4951| Flanders | â¬14,802 | â¬304,544 | 20.6à | **6.2%** | 4952| Brussels | â¬23,089 | â¬527,231 | 22.8à | **6.5%** | 4953| Wallonia | â¬13,430 | â¬177,660 | 13.2à | **5.3%** | 4954 4955<!-- FIGURE:START ecart-regional --> 4956 4957**Wallonia loses roughly 0.9 percentage points a year over fifty years.** Compounded, a euro invested in Flemish housing in 1974 is worth roughly 1.55 times what it is worth in Wallonia today (**figure 2**). 4958 4959Another striking figure: Brussels was 72% more expensive than Wallonia in 1974. The gap now stands at 197%. It has almost tripled. 4960 4961But stopping there would be exactly the mistake this table should prevent. The mechanical conclusion â "buy in Flanders" â is wrong. 4962 4963Picture two buyers in 1974. One signs in Zaventem, the other in Charleroi, for the same sum. Fifty years on, the first has seen his stake multiply twenty times, the second thirteen. But throughout that period it was the second who collected the higher rents relative to the price paid. Which made the better investment? It depends entirely on what he was after. 4964 4965<!-- FIGURE:END --> 4966 4967**High capital growth almost always goes with a low rental yield.** Wallonia shows the highest gross rental yields in the country _precisely_ because its prices rose least. The two engines of performance pull in opposite directions. An investor seeking cash flow and one seeking capital appreciation should not buy in the same region â nor, within a region, in the same municipality. 4968 4969That is the real lesson: **a regional average is a number to talk about, not a number to decide on.** Between Ixelles and Charleroi, the same â¬300,000 budget produces neither the same return, nor the same risk, nor the same trajectory. Over fifty years, location mattered more than the choice between asset classes. 4970
4971_Caveat: Flanders and Brussels swap places depending on the aggregation method. We do not rank them. Only the Walloon lag is robust under both methods._ 4972 4973## 3. 1 January 2026: property becomes the last tax shelter 4974 4975**Since 1 January 2026, capital gains on shares are taxed at 10% above â¬10,000 per year, while the gain on property held more than five years remains untaxed.** Property is now the only mainstream Belgian asset whose capital gain sits structurally outside the tax net. 4976 4977Until 2025 Belgium was an outlier: capital gains on shares held by a private individual managing their own wealth were not taxed. That was the killer argument for equities. 4978 4979It is gone. The levy was formalised by the Act of 6 April 2026, with retroactive effect to 1 January. Gains accrued before 31 December 2025 remain exempt: the value on that date serves as the cost base. 4980 4981Three qualifications before drawing conclusions: 4982 4983- **The â¬10,000 annual exemption** neutralises the tax for anyone realising gains gradually. On a â¬150,000 portfolio returning 6%, the annual gain is around â¬9,000 â below the threshold. 4984- **The levy hits the sale, not the holding.** An accumulating ETF you do not sell triggers nothing. 4985- **Property did not change.** Sold within five years, the gain is taxed at 16.5%; after that, not at all. 4986 4987Which raises the obvious question. If that advantage is real, why isn't everyone piling in? 4988 4989## 4. The entry ticket: 15% against 0.15% 4990 4991**Entering a Belgian rental property costs around 15% of the price; entering the stock market costs around 0.15%.** On â¬300,000 in Wallonia, an investor pays â¬45,800 in registration duty, notary fees and mortgage deed costs. On â¬10,000 put into an ETF, entry costs â¬14. 4992 4993Because you have to get through the door first. And the door has a price. 4994 4995An investor signs a preliminary contract at â¬300,000 in Namur. He compared three neighbourhoods, ran his yield, squeezed â¬8,000 out of the seller. Then the notary's statement arrives: **â¬45,800**, payable before he holds the key. His negotiation has just been wiped out five times over. 4996 4997### 4.1 What entering a rental property really costs 4998 4999The reduced registration duty rates â 2% in Flanders, 3% in Wallonia, a â¬200,000 allowance in Brussels â are reserved for a **sole owner-occupied home**. A buy-to-let investor does not qualify, and neither does a purchase through a company. The applicable rate is 12% in Flanders, 12.5% in Wallonia and Brussels. 5000 5001On a â¬300,000 property in Wallonia: 5002 5003| Item | Amount | 5004| ---------------------------------------- | ---------------------- | 5005| Registration duty at 12.5% | â¬37,500 | 5006| Notary fees (statutory scale) | ~â¬3,200 | 5007| Administrative costs and searches | ~â¬1,200 | 5008| Mortgage deed, including 1% registration | ~â¬3,900 | 5009| **Total** | **~â¬45,800, or 15.3%** | 5010 5011**Note the contrast: around 5% for your own home, around 15% for a rental property.** This is the most widespread error in the yield calculations circulating online â applying the reduced rate to an investment â and it distorts the result by tens of thousands of euros. 5012 5013### 4.2 What entering the stock market costs today 5014 5015Twenty years ago a Belgian bank charged â¬20 to â¬30 per order, plus annual custody fees. That world is gone. At DEGIRO, Bolero or Trade Republic, an order costs between â¬0 and â¬2 today. Add the stock exchange tax, at 0.12% for an accumulating ETF not registered in Belgium. 5016 5017On â¬10,000 invested, entry therefore costs around **â¬14**. 5018 5019### 4.3 A ratio of one to a hundred 5020 5021<!-- FIGURE:START ticket-entree --> 5022 5023Side by side: **around 15% to enter rental property, around 0.15% to enter the market.** On **figure 3**, the second bar is barely visible â which is precisely the point. 5024 5025That figure drives two consequences developed below. Rental property requires a long holding period â seven to ten years at minimum to amortise those costs. And it requires a sufficient ticket: below â¬100,000 of capital, that 15% mechanically crushes the return, and equities win without discussion. 5026 5027It also explains why a property investor cannot reposition as often as an equity investor. Changing position costs fifteen per cent going in and three to five coming out â close to twenty per cent per round trip. On the market, the same operation costs under half a per
5027cent. One is condemned to be right for a long time; the other can be wrong often. 5028 5029<!-- FIGURE:END --> 5030 5031## 5. The full tax comparison 5032 5033| | Rental property | Shares / ETFs | 5034| --------------------- | ----------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | 5035| **Entry costs** | Registration duty 12% (Flanders) or 12.5% (Wallonia, Brussels) plus roughly 2.8% in deed and mortgage costs | Brokerage of â¬0 to â¬2 per order plus 0.12% stock exchange tax for an accumulating ETF not registered in Belgium, 1.32% if it is | 5036| **Tax on income** | On indexed cadastral income increased by 40%, not on rent received | 30% withholding tax on dividends; none on an accumulating ETF | 5037| **Capital gain** | 0% after 5 years; 16.5% before | 10% above â¬10,000 per year | 5038| **Recurring costs** | Property tax, maintenance, insurance, management | ETF ongoing charges, 0.10 to 0.25% a year | 5039| **Exit costs** | 3 to 5% (agency, EPC, surveying) | Stock exchange tax of 0.12% | 5040| **Leverage** | Yes, up to 80-90% via a mortgage | No, short of risky margin borrowing | 5041| **Liquidity** | 3 to 9 months | Same day | 5042| **Entry ticket** | Around â¬80,000 of equity for a â¬300,000 property | â¬100 | 5043| **Regulatory burden** | EPC, rental permit, insulation standards | None | 5044 5045## 6. The real rental yield, and the four items that erode it 5046 5047**A 4% gross rental yield in Belgium typically delivers 2.2 to 2.8% net, before financing and before tax.** Four items dig the gap: acquisition costs, vacancy, maintenance at 1% of value per year, and since 2026 the renovation obligations tied to the EPC. 5048 5049Once through the door, the question is what the property earns. Gross yield â annual rent divided by purchase price â is a shop-window number. 5050 5051### 6.1 Acquisition costs 5052 5053These are the â¬45,800 from section 4. The basis for the yield calculation is therefore not â¬300,000 but â¬345,800. An advertised 4.2% yield mechanically falls to 3.6%. 5054 5055### 6.2 Vacancy 5056 5057One month between tenants already represents 4% of annual rent. Assuming zero over twenty years is not a hypothesis, it is a wish. 5058 5059### 6.3 Maintenance 5060 5061Roof, boiler, windows, reinstatement after a tenant leaves. Over a long cycle, **1% of value per year** is a prudent provision. 5062 5063### 6.4 The EPC, now the decisive item 5064 5065An apartment in Schaerbeek, â¬210,000, fifteen per cent below the neighbourhood price. The deal looks done. The certificate reads F. 5066 5067Since 1 January 2026, a home let in Brussels must reach at least label E: properties rated F and G can no longer be rented without works. Since 2023 Flanders has required buyers of a home rated E or F to renovate it to label D within five years. An energy-inefficient property bought 15% below market can cost â¬40,000
5067in mandatory works â and generate nothing in the meantime. 5068 5069Against that stands a considerable Belgian advantage: a private individual letting to a private individual for residential use is taxed on **indexed cadastral income increased by 40%**, a base often four to six times lower than the rent actually collected. That advantage disappears if the tenant is a company or a self-employed person. 5070 5071## 7. Leverage: the decisive argument, and how it gets manipulated 5072 5073**The mortgage is property's only structural advantage: with â¬80,000 of equity you buy â¬300,000 of property, against â¬80,000 of shares.** But leverage only creates value if the fixed rate stays below the asset's return â and it amplifies losses just as hard. 5074 5075That leaves the argument which, alone, justifies accepting all that friction â and it carries weight: it is the only legal mechanism letting a private individual put a bank's money to work for twenty years, at a fixed rate, with no margin call. 5076 5077At 3.5% annual appreciation, the first creates â¬10,500 a year, the second â¬2,800. That is arithmetic, and it holds. But three conditions must hold too. 5078 5079**The tenant must carry most of the mortgage.** If cash flow is negative by â¬300 a month, you inject â¬72,000 over twenty years, **on top of** your â¬80,000 deposit. Those monthly injections carry an opportunity cost of their own: placed at 7%, that same â¬300 would accumulate roughly â¬156,000 over the period â independently of what the initial â¬80,000 does, since it works on both sides. This is precisely why our simulator imposes **identical cash outflows on both scenarios**. Comparing a mortgaged property with an unleveraged portfolio, without equalising the flows, is rigged â and it is the flaw in almost every simulator published by property businesses. 5080 5081**Leverage amplifies losses.** A 10% fall on a â¬300,000 property destroys â¬30,000, or 37% of your deposit. The same fall on â¬80,000 of shares destroys â¬8,000. The three consecutive down years of the early 1980s show that scenario is far from theoretical. 5082 5083> **A distinction we maintain.** Our historical analysis compares the two **assets**, unleveraged, because Belgian mortgage rates ranged from 12% to 3% across the period. The simulator, by contrast, models leverage at current conditions. The backtest compares assets; the simulator compares financing strategies. 5084 5085## 8. Rent or dividends: two incomes with nothing in common 5086 5087**A Belgian rental property pays 3 to 6% gross, a distributing world ETF 1.05%.** And the tax treatment is inverted: rent is taxed on indexed cadastral income increased by 40%, a base far below reality, while dividends bear 30% withholding tax. 5088 5089_Equity figures in this section and in section 11: MSCI World Index factsheet as at 31 August 2026 (MSCI Inc.) and iShares Core MSCI World UCITS ETF product page as at 3 September 2026 (BlackRock)._ 5090 5091### 8.1 What each asset actually pays out 5092 5093A Belgian rental property yields 3 to 6% gross, or 2.2 to 2.8% net after costs. 5094 5095On the equity side the gap is wider than most assume. The MSCI World Index shows a dividend yield of **1.50%** as at 31 August 2026, but that is gross. What a distributing ETF actually pays out, after withholding tax, is lower: **1.05% over twelve trailing months**. A Belgian resident then pays 30% withholding tax on that, bringing net income received to around **0.7%**. 5096 5097An accumulating ETF pays out nothing and reinvests automatically. 5098 5099In immediate cash flow, rental property therefore pays three to five times more. But that higher income rests on a single tenant, in a single municipality. 5100 5101### 8.2 The tax treatment, reversed 5102 5103| | Rental income | Dividends | 5104| -------------------- | ------------------------------------------------------------------------------------- | ---------------------------------------------------------- | 5105| **Taxable base** | Indexed cadastral income increased by 40% â often 4 to 6 times lower than actual rent | The amount actually paid out | 5106| **Rate** | Your marginal rate plus municipal surcharges | 30% withholding tax at source | 5107| **Exemption** | None, but the base is already reduced | A first annual tranche, reclaimable through the tax return | 5108| **Effective burden** | Light | Heavy | 5109 5110This is one of the most favourable rental regimes in Western Europe, and a far stronger argument than the capital gain. 5111 5112But there is an almost perfect counter: **an accumulating ETF distributes nothing, and therefore triggers no withholding tax.** The return accumulates in the unit price and is taxed only on sale. 5113 5114On distributed income, property wins comfortably. On total accumulated return, the gap closes almost entirely. 5115 5116### 8.3 Predictability and inflation protection 5117 5118Rent is **contractual and indexed by law** to the health index. A dividend is **discretionary** â a company can cut it, and many did in 2020. 5119 5120The advantage looks clear-cut, but it reverses on concentration. Your rent depends on one person. A world ETF spreads its dividends across more than a thousand companies. **Rent is more predictable line by line; dividends are more robust in aggregate.** 5121 5122## 9. The cost nobody bills: your time 5123 5124**No, rental property is not passive income: expect 20 to 40 hours a year per property.** On â¬7,000 of net income, thirty hours valued at â¬30 an hour represent 13% of that income â roughly what delegated management costs. An ETF portfolio takes about one hour a year. 5125 5126There remains a cost that neither entry fees, nor yield, nor taxation captures. 5127 5128Finding tenants, viewings, inventory checks, annual rent indexation, payment reminders, technical callouts, tax filing, EPC compliance: in an ordinary year, one let property comfortably consumes 20 to 40 hours. A bad year consumes considerably more. 5129 5130That cost appears in no simulator, including ours. It does not make property less profitable â it changes the nature of what you are buying. **A rental property is an asset and a job. An ETF is only an asset.** 5131 5132One nuance deserves stating, because it is almost always glossed over in automation claims. Part of those hours is information work â
5132checking an indexation, retrieving a document, preparing a filing. That part compresses with the right tooling. The other part does not: a viewing, an inventory check, a broken boiler stay physical. **Technology moves the dial; it does not remove it.** 5133 5134## 10. When property wins, when equities win 5135 5136**Rental property wins beyond eight years if the mortgage comes in below 3.5% and the gross rental yield exceeds 5%.** Equities win below â¬100,000 of capital, without access to credit, or when the horizon is shorter than five years. 5137 5138### Rental property is the better choice if 5139 5140- you can borrow below 3.5% over 20 years or more; 5141- the gross rental yield exceeds 5%, which rules out most city centres; 5142- you hold for at least 8 years, to amortise 15% of entry costs and clear the five-year window; 5143- the EPC is C or better, or the price already reflects the works; 5144- you accept the management burden, or budget 7% of rent to delegate it. 5145 5146### Equities are the better choice if 5147 5148- your capital is below â¬100,000: 15% of entry costs crush the return; 5149- you have no access to credit, or your debt ratio is near 40%; 5150- your horizon is uncertain, or you may need the funds within five years; 5151- you prefer global exposure to concentration in one property; 5152- you stagger your disposals to stay under the â¬10,000 exemption. 5153 5154### Both, above â¬300,000 of wealth 5155 5156The question becomes allocation rather than choice. This is also where Belgian regulated real estate investment companies deserve a look: property exposure, stock market liquidity, no management. The sector has consolidated â Aedifica and Cofinimmo merged in March 2026 â and the tax treatment of distributions should be verified case by case. 5157 5158## 11. The risks no simulator quantifies 5159 5160**The maximum drawdown of the MSCI World index since 1987 is 57.46%, against under 9% for the worst Belgian property episode.** But property concentrates its risk on one tenant, one municipality, and an EPC regime that has tightened without interruption for ten years. 5161 5162### 11.1 On the property side 5163 5164**The tenant.** Non-payment is settled before the justice of the peace. Expect 6 to 12 months with no rent and with legal costs. 5165 5166**Concentration.** One asset, one municipality, one market segment. No diversification is possible below several properties. 5167 5168**The exit calendar.** A divorce, a relocation or a liquidity need can force a sale within five years, triggering the 16.5% the simulation assumed exempt. 5169 5170**Regulation.** Rent controls, EPC requirements, rental permits: the burden has tightened without interruption for ten years. 5171 5172### 11.2 On the equity side 5173 5174**The depth of drawdowns.** MSCI publishes the maximum drawdown of its World index since 1987: **57.46%**, between 31 October 2007 and 9 March 2009. Belgian property has never seen anything comparable â its worst episode, 1981 to 1983, compounds to under 9% in nominal terms. A ratio of one to six. 5175 5176**Behavioural risk, which is the main one.** In March 2009, an investor who had held since October 2007 watched 57% of their capital evaporate. Those who sold that month locked in the loss. Those who did nothing recovered their stake in four years, then tripled it. 5177 5178The historical market return is only captured by those who do not sell. Sitting through a 40% decline without capitulating is considerably harder in practice than in theory. Property's illiquidity is a paradoxical advantage here: nobody sells a house in a moment of panic. 5179 5180**Sequence of returns.** Two investors with the same average return over twenty years end up with very different wealth depending on the order in which good and bad years arrive. 5181 5182**The hidden concentration of indices.** As at 31 August 2026, of the 1,280 constituents of the MSCI World Index, the **United States accounts for 72.14%**, the **top ten holdings for 26.61%** and the technology sector alone for **29.81%**. A quarter of your "world" sits in ten companies, nearly all American. On top of that, a Belgian investor carries unhedged currency risk. 5183 5184**The absence of leverage.** No mechanism lets a private individual multiply their stake over twenty years at a fixed rate. 5185 5186## 12. Property remains an excellent investment. On one condition. 5187 5188**Belgian property is an excellent investment for whoever buys the right property in the right municipality, and a mediocre one for whoever buys an average.** The barrier is not financial but informational: observed rental yield, EPC label, local property tax and resale market depth can all be checked before the offer, not after the deed. 5189 5190Let's pick up the thread. Belgian property returned 6.0% a year over fifty years without leverage, with accessible credit and, since 2026, the only structurally untaxed capital gain in the Belgian wealth landscape. That is a remarkable asset. 5191 5192But everything above describes a barrier: 15% of entry costs to amortise, a regional gap of 0.9 points a year, EPC obligations that can cost â¬40,000, a single tenant, a property tax that doubles from one municipality to the next, and twenty to forty hours a year. 5193 5194**That barrier is not financial. It is informational** â and information, as we have just seen, is precisely the part that automates. Two investors buying the same apartment at the same price do not get the same return. One checked the observed rental yield in the municipality, the EPC label, the local property tax and the depth of the resale market. The other read a listing and trusted a national average. 5195 5196That is exactly the work Arcanes automates. Our engine cross-references the municipality's median price, the observed rental yield, the local property tax burden and the energy requirements for a specific property â **before the offer rather than after the deed**. These are not our estimates: they are the same public data as in this article, applied to one address. 5197 5198Belgian property is an excellent investment for whoever buys the right property in the right municipality. It is a mediocre investment for whoever buys an average. 5199 5200â **[Analyse a property with its local data](/free-analyse?src=article-immo-bourse-en)** â first analysis free 5201 5202## FAQ â Common questions on the property versus equities decision 5203 5204### Should I invest in property or in equities in Belgium in 2026? 5205 5206It depends on your access to credit and your time horizon. Rental property generally wins beyond eight years if you can borrow below 3.5% and the gross rental yield exceeds 5%. Below â¬100,000 of capital, or without access to credit, a world equity ETF is more efficient: the 15% of property entry costs cannot be amortised. 5207 5208### What do entry costs really amount to in property and in equities? 5209 5210Around 15% of the price for a Belgian rental property: 12% registration duty in Flanders or 12.5% in Wallonia and Brussels, plus roughly 2.8% in deed and mortgage costs. In equities, around 0.15%: an order costs â¬0 to â
5210¬2 with an online broker, plus 0.12% stock exchange tax. A ratio of one to a hundred, which explains why property demands a long holding period. 5211 5212### Do the reduced registration duty rates apply to a buy-to-let purchase? 5213 5214No. The 2% rate in Flanders, 3% in Wallonia and the â¬200,000 allowance in Brussels are reserved for a sole owner-occupied home, in full ownership. A buy-to-let purchase, a second home or a purchase through a company falls under the standard rate: 12% in Flanders, 12.5% in Wallonia and Brussels. 5215 5216### Does Belgian property really return 9% a year? 5217 5218No. That figure comes from French studies, often including leverage. On Belgian data, house prices rose by roughly 6.0% a year in nominal terms between 1974 and 2024, unleveraged, with wide regional differences: 6.2% in Flanders against 5.3% in Wallonia. 5219 5220### Does the 10% capital gains levy shift the balance towards property? 5221 5222Yes, but only partly. It removes the full exemption equities enjoyed, but the â¬10,000 annual allowance neutralises the tax for most private portfolios. The gap has narrowed; it has not reversed. 5223 5224### What gross rental yield should you target in Belgium? 5225 5226At least 5% gross for a mortgaged rental investment to be self-financing after costs, property tax and income tax. Below 4%, the deal only works if you are betting on capital appreciation. 5227 5228### Is rental income taxed in Belgium? 5229 5230Yes, but on a notional base. For a letting to a private individual for residential use, tax applies to indexed cadastral income increased by 40%, not to the rent actually received â a base typically four to six times lower. If the tenant is a company or a self-employed person, taxation applies to actual rent. 5231 5232### Is rental property passive income? 5233 5234No. Finding tenants, viewings, inventories, indexation, payment reminders, technical callouts and tax filing take 20 to 40 hours a year for a single property. On â¬7,000 of net income, thirty hours valued at â¬30 an hour amount to 13% of that income. An ETF portfolio takes about one hour a year. 5235 5236### Is it better to receive rent or dividends in Belgium? 5237 5238It depends what you are after. On distributed income, rent is clearly more advantageous: a Belgian rental property yields 3 to 6% gross, whereas a distributing world ETF paid out 1.05% over the last twelve months. And rent is taxed on a base often four to six times lower than actual rent, while dividends bear 30% withholding tax, bringing net income received to around 0.7%. 5239 5240### Is rent safer than a dividend? 5241 5242Yes and no. Rent is contractual and indexed by law to the health index, whereas a dividend is discretionary. But rent depends on one tenant: if they do not pay, the income drops to zero. The dividends of a world ETF come from more than a thousand companies. Rent is more predictable line by line; dividends are more robust in aggregate. 5243 5244### Should I hold in my own name or through a company? 5245 5246It depends on the size of your holdings. In your own name, taxation on indexed cadastral income and the capital gains exemption after five years are very favourable. Through a company, costs and depreciation are deductible, but the gain on sale and the extraction of cash are both taxed â and the reduced registration duty rates never apply. 5247 5248### Is an accumulating ETF better than a distributing one in Belgium? 5249 5250Yes in most cases, because it pays no dividends and escapes the 30% withholding tax. Watch the stock exchange tax, though: 0.12% for an accumulating ETF not registered in Belgium, against 1.32% if it is. The difference becomes substantial on regular contributions. 5251 5252### Is a world ETF genuinely diversified? 5253 5254No, less than the name suggests. As at 31 August 2026 the MSCI World Index holds 1,280 companies, but the United States accounts for 72.14%, the top ten holdings for 26.61% and the technology sector for 29.81%. A quarter of the exposure sits in ten companies, nearly all American. 5255 5256### After how many years does a rental investment become profitable? 5257 5258Generally between 7 and 10 years. You need to amortise around 15% of entry costs and 3 to 5% of exit costs, more than two years of gross rent, while also clearing the five-year threshold. 5259 5260### Should you choose between property and equities, or combine them? 5261 5262It depends on your wealth. Above â¬300,000, the relevant question is no longer "which" but "what proportion". The two assets do not react to the same shocks: Belgian property fell in the early 1980s while markets rose, and the opposite happened in 2008. 5263 5264### Can you borrow to invest in equities as you can for property? 5265 5266Technically yes, through a Lombard loan or a margin account, but the mechanism is not comparable: a higher rate, a shorter term, and a margin call can force you to sell at the worst possible moment. The long, stable leverage of a mortgage has no equity market equivalent. 5267 5268--- 5269 5270_This article was written by Arcanes for information purposes and does not constitute personalised financial, tax or legal advice. For guidance suited to your situation, consult your notary, your banker or a licensed financial adviser. All figures are based on data available in September 2026 and are subject to change._ 5271`,nO=`--- 5272title: "Immobilier ou bourse en Belgique : 50 ans de données comparées" 5273slug: "immobilier-ou-bourse-belgique" 5274tag: "Investissement" 5275readTime: 19 5276publishDate: "8 septembre 2026" 5277updateDate: "8 septembre 2026" 5278author: "Arcanes"
5279excerpt: "Trois années de baisse, une décennie à plat, puis la loi de 2026. Ce que cinquante ans de prix belges disent du choix entre pierre et bourse." 5280image: "/__l5e/assets-v1/d3e113c8-5792-482a-bd08-ff07ab2b7518/immobilier-ou-bourse-belgique.jpg" 5281imageVersion: "2" 5282imageAlt: "Façade de maison de maître bruxelloise accolée à la façade vitrée d'un immeuble de bureaux" 5283--- 5284 5285# Immobilier ou bourse en Belgique : 50 ans de données comparées 5286 5287En 1981, puis en 1982, puis en 1983, le prix des maisons belges a baissé. Trois années consécutives. Personne ne raconte cette histoire-là , et pour cause : elle contredit la seule chose que tout le monde croit savoir sur la pierre. 5288 5289Pendant ces mêmes trois années, les marchés d'actions mondiaux ont progressé. 5290 5291C'est tout le problème de l'arbitrage entre les deux. On compare un actif qu'on connaît par cÅur â la maison de ses parents, celle du voisin, celle qu'on visite le samedi â à un actif dont on ne voit rien, qui n'existe que sous forme de ligne dans une application. Et on tranche avec des intuitions plutôt qu'avec des chiffres. 5292 5293Nous avons donc reconstruit la série complète des prix belges, de 1974 à 2024, commune par commune. Elle dit que l'immobilier a rapporté **6,0 % par an en nominal**, sans effet de levier â quand le MSCI World en donnait 8,1 % sur les trente-cinq dernières années, en euros. Elle dit aussi que la décennie 1980 n'a produit que 3,4 % par an, et que l'écart entre la Flandre et la Wallonie s'est creusé de 0,9 point chaque année pendant cinquante ans. 5294 5295Mais ces deux chiffres ne suffisent pas à décider, parce qu'ils ignorent tout ce qui sépare réellement les deux placements : 15 % de frais d'entrée d'un côté contre 0,15 % de l'autre, un crédit bancaire accessible à l'un et pas à l'autre, une fiscalité qui vient de basculer le 1er janvier 2026, et vingt à quarante heures par an que personne ne facture. 5296 5297**Commencez par votre propre cas.** Le simulateur ci-dessous prend une commune belge, un bien, votre apport, et impose les mêmes flux de trésorerie aux deux scénarios â c'est la seule façon de comparer honnêtement un achat à crédit et un portefeuille sans levier. Les douze sections qui suivent expliquent chacun de ses paramètres. 5298 5299<!-- SIMULATEUR: immo-vs-bourse --> 5300 5301## 1. Ce que l'immobilier belge a réellement rapporté depuis 1974 5302 5303**Le prix des maisons belges a progressé de 6,0 % par an en nominal entre 1974 et 2024, sans effet de levier.** Mais cette moyenne masque une décennie perdue : les années 1980 n'ont produit que 3,4 % par an, avec trois années de baisse consécutives de 1981 à 1983. 5304 5305**Mis à jour le 8 septembre 2026** â série reconstruite à partir des statistiques cadastrales (1973-2009) et immobilières (2010-2024), 565 communes, prix médians des maisons ordinaires pondérés par le nombre de transactions. _Sources : Statbel, SPF Finances â voir notre [méthodologie](/methodologie)._ 5306 5307La plupart des comparaisons francophones reprennent des chiffres français, souvent une rentabilité de l'ordre de 9 % par an sur trente ans, levier et frais confondus. Ces chiffres ne décrivent ni le marché belge, ni sa fiscalité. 5308 5309### Cinquante ans de prix, décennie par décennie 5310 5311| Période | Croissance nominale annuelle | 5312| ------------- | ---------------------------- | 5313| 1974-1980 | +12,8 % | 5314| 1980-1990 | +3,4 % | 5315| 1990-2000 | +6,8 % | 5316| 2000-2010 | +8,1 % | 5317| 2010-2020 | +3,1 % | 5318| 2020-2024 | +4,8 % | 5319| **1974-2024** | **+6,0 %** | 5320 5321<!-- FIGURE:START prix-par-decennie --> 5322 5323Deux enseignements que le discours commercial passe généralement sous silence, et que la **figure 1** rend visibles d'un coup d'Åil. 5324 5325**L'immobilier belge a baissé, et pas brièvement.** En 1981, 1982 et 1983, les prix ont reculé trois années de suite : â3,3 %, â4,5 %, â1,2 % en nominal. Avec l'inflation de l'époque, la perte de pouvoir d'achat a été nettement plus lourde. La décennie 1980 entière n'a produit que 3,4 % par an. « La pierre monte toujours » est une affirmation qui ne survit pas à ses propres données. 5326 5327**Le rythme récent n'est pas le rythme historique.** Les 8,1 % par an de 2000-2010 correspondent à une repricing structurelle : les taux hypothécaires sont passés d'environ 8 % à 4 % et les durées de crédit se sont allongées. Cette bascule ne peut pas se reproduire, puisque les taux sont déjà bas et les durées déjà longues. Extrapoler 8 % sur les vingt prochaines années est un pari, pas une projection. 5328 5329<!-- FIGURE:END --> 5330 5331> **Note méthodologique.** Ces chiffres sont nominaux. La conversion en termes réels sera publiée dès l'intégration de la série de l'indice santé. Nous ne publions pas de rendement réel calculé sur une inflation approximative. 5332 5333## 2. La fracture régionale, et pourquoi une moyenne ne vous sert à rien 5334 5335**Sur cinquante ans, l'immobilier flamand a progressé de 6,2 % par an contre 5,3 % en Wallonie â soit 55 % de valeur en plus une fois cumulé.** Mais un rendement de plus-value élevé va de pair avec un rendement locatif faible : une moyenne régionale ne décide de rien. 5336 5337Ce 6,0 % national ne décrit aucune commune réelle. Appliquée région par région, la même méthode donne ceci â ratios de niveau bruts, 1974 â 2024 : 5338 5339| Région | Prix moyen 1974 | Prix moyen 2024 | Multiple | Par an | 5340| --------- | --------------- | --------------- | -------- | --------- | 5341| Flandre | 14.802 ⬠| 304.544 ⬠| 20,6à | **6,2 %** | 5342| Bruxelles | 23.089 ⬠| 527.231 ⬠| 22,8à | **6,5 %** | 5343| Wallonie | 13.430 ⬠| 177.660 ⬠| 13,2à | **5,3 %** | 5344 5345<!-- FIGURE:START ecart-regional --> 5346 5347**La Wallonie décroche d'environ 0,9 point par an sur cinquante ans.** Cumulé, un euro investi dans le logement flamand en 1974 vaut aujourd'hui environ 1,55 fois ce qu'il vaut côté wallon (**figure 2**). 5348 5349Autre chiffre marquant : Bruxelles était 72 % plus cher que la Wallonie en 1974. L'écart atteint aujourd'hui 197 %. Il a presque triplé. 5350 5351Mais s'arrêter là serait commettre exactement l'erreur que ce tableau devrait vous éviter. Car la conclusion mécanique â « achetez en Flandre » â est fausse. 5352 5353Imaginez deux acheteurs de 1974. L'un signe à Zaventem, l'autre à Charleroi, pour la même somme. Cinquante ans plus tard, le premier a vu son bien faire vingt fois sa mise, le second treize. Mais pen
5353dant tout ce temps, c'est le second qui a encaissé les loyers les plus élevés rapportés au prix payé. Lequel a fait le meilleur placement ? Cela dépend entièrement de ce qu'il cherchait. 5354 5355<!-- FIGURE:END --> 5356 5357**Un rendement de plus-value élevé va presque toujours de pair avec un rendement locatif faible.** La Wallonie affiche les rendements locatifs bruts les plus élevés du pays _précisément_ parce que ses prix ont le moins monté. Les deux moteurs de la performance jouent en sens inverse. Un investisseur qui cherche du cash-flow et un investisseur qui cherche de la plus-value ne devraient pas acheter dans la même région â ni, à l'intérieur d'une région, dans la même commune. 5358 5359C'est le vrai enseignement de ce tableau : **une moyenne régionale est un chiffre de commentaire, pas un chiffre de décision.** Entre Ixelles et Charleroi, un même budget de 300.000 ⬠ne produit ni le même rendement, ni le même risque, ni la même trajectoire. Sur cinquante ans, le choix de la localisation a pesé plus lourd que l'arbitrage entre les deux classes d'actifs. Pour comparer commune par commune, notre [tableau des prix](/communes) et notre [carte interactive](/map) partent des mêmes données que cet article. 5360 5361_Réserve : la Flandre et Bruxelles se classent différemment selon la méthode d'agrégation retenue. Nous ne les départageons pas. Seul le décrochage wallon est robuste aux deux méthodes._ 5362 5363## 3. Le 1er janvier 2026 : l'immobilier devient le dernier bastion fiscal 5364 5365**Depuis le 1er janvier 2026, les plus-values sur actions sont taxées à 10 % au-delà de 10.000 ⬠par an, tandis que la plus-value immobilière reste exonérée après cinq ans de détention.** L'immobilier est devenu le seul actif belge courant dont la plus-value échappe structurellement à l'impôt. 5366 5367Jusqu'en 2025, la Belgique était une anomalie : les plus-values sur actions d'un particulier en gestion normale de patrimoine n'étaient pas imposées. C'était l'argument massue en faveur de la bourse. 5368 5369Il est tombé. 5370 5371Une taxe de **10 % sur les plus-values des actifs financiers** s'applique désormais, formalisée par la loi du 6 avril 2026 avec effet rétroactif au 1er janvier. Les plus-values antérieures au 31 décembre 2025 restent exonérées : la valeur des actifs à cette date sert de base de calcul. 5372 5373Trois nuances avant de conclure trop vite : 5374 5375- **L'exonération de 10.000 ⬠par an** neutralise l'impôt pour l'investisseur qui réalise ses gains progressivement. Sur un portefeuille de 150.000 ⬠à 6 %, la plus-value annuelle avoisine 9.000 ⬠: sous le seuil. 5376- **La taxe frappe la vente, pas la détention.** Un ETF de capitalisation qu'on ne vend pas ne déclenche rien. 5377- **L'immobilier n'a pas bougé.** La plus-value sur un immeuble bâti détenu plus de cinq ans par un particulier reste hors impôt. Vendu avant cinq ans, elle est taxée à 16,5 %. 5378 5379L'asymétrie qui en résulte est le cÅur de ce sujet, et elle est rarement formulée aussi nettement : **sur un horizon long, l'immobilier est aujourd'hui le seul actif belge courant dont la plus-value échappe structurellement à l'impôt.** 5380 5381Ce qui pose immédiatement la question suivante. Si cet avantage est réel, pourquoi tout le monde ne se rue-t-il pas dessus ? 5382 5383## 4. Le ticket d'entrée : 15 % contre 0,15 % 5384 5385**Entrer dans un bien locatif belge coûte environ 15 % du prix ; entrer en bourse coûte environ 0,15 %.** Sur 300.000 ⬠en Wallonie, un investisseur paie 45.800 ⬠de droits d'enregistrement, d'honoraires de notaire et d'acte de crédit. Sur 10.000 ⬠placés en ETF, l'entrée coûte 14 â¬. 5386 5387Parce qu'il faut d'abord franchir la porte. Et la porte a un prix. 5388 5389Un investisseur signe un compromis à 300.000 ⬠à Namur. Il a comparé trois quartiers, calculé son rendement, arraché 8.000 ⬠au vendeur. Puis arrive le décompte du notaire : **45.800 â¬**, à verser avant d'avoir la clé. Sa négociation vient d'être effacée cinq fois. 5390 5391### 4.1 Ce que coûte réellement l'entrée dans un bien locatif 5392 5393Les taux réduits de droits d'enregistrement â 2 % en Flandre, 3 % en Wallonie, abattement de 200.000 ⬠à Bruxelles â sont réservés à l'**habitation propre et unique**. Un investisseur locatif n'y a pas droit, et un achat via société non plus. Le taux qui s'applique est de 12 % en Flandre, 12,5 % en Wallonie et à Bruxelles. 5394 5395Sur un bien à 300.000 ⬠en Wallonie : 5396 5397| Poste | Montant | 5398| ------------------------------------------------------- | ------------------------------ | 5399| Droits d'enregistrement 12,5 % | 37.500 ⬠| 5400| Honoraires du notaire (barème légal) | env. 3.200 ⬠| 5401| Frais administratifs et recherches | env. 1.200 ⬠| 5402| Acte de crédit, dont 1 % sur l'inscription hypothécaire | env. 3.900 ⬠| 5403| **Total** | **env. 45.800 â¬, soit 15,3 %** | 5404 5405**Retenez le contraste : environ 5 % pour votre propre logement, environ 15 % pour un bien locatif.** C'est l'erreur la plus répandue dans les calculs de rentabilité qui circulent en ligne â appliquer le taux rédu
5405it à un investissement â et elle fausse le résultat de plusieurs dizaines de milliers d'euros. Notre [simulateur de frais d'acte](/simulateur-frais-acte) chiffre votre cas précis. 5406 5407### 4.2 Ce que coûte l'entrée en bourse aujourd'hui 5408 5409Il y a vingt ans, une banque belge facturait 20 à 30 ⬠par ordre, plus des droits de garde annuels. Le monde a changé. Chez DEGIRO, Bolero ou Trade Republic, un ordre coûte aujourd'hui entre 0 et 2 â¬. S'y ajoute la taxe sur les opérations de bourse, à 0,12 % pour un ETF de capitalisation non inscrit en Belgique. 5410 5411Sur 10.000 ⬠investis, l'entrée coûte donc de l'ordre de **14 â¬**. 5412 5413### 4.3 Un rapport de un à cent 5414 5415<!-- FIGURE:START ticket-entree --> 5416 5417Mis côte à côte : **environ 15 % pour entrer dans un bien locatif, environ 0,15 % pour entrer en bourse.** Sur la **figure 3**, le second trait est presque invisible â c'est précisément le propos. 5418 5419Ce chiffre commande deux conséquences développées plus loin. L'immobilier locatif exige une **détention longue** â sept à dix ans au minimum pour amortir ces frais. Et il exige un **ticket suffisant** : sous 100.000 ⬠de capital, ces 15 % écrasent le rendement et la bourse gagne sans discussion. 5420 5421C'est aussi ce qui explique pourquoi un investisseur immobilier ne peut pas arbitrer aussi souvent qu'un investisseur boursier. Changer de position coûte quinze pour cent à l'entrée et trois à cinq à la sortie, soit près de vingt pour cent par aller-retour. En bourse, la même opération coûte moins d'un demi-pour-cent. L'un est condamné à avoir raison longtemps, l'autre peut se tromper souvent. 5422 5423<!-- FIGURE:END --> 5424 5425Mis côte à côte : **environ 15 % pour entrer dans l'immobilier locatif, environ 0,15 % pour entrer en bourse.** 5426 5427Ce chiffre commande deux conséquences que la suite développe. D'abord, l'immobilier locatif exige une durée de détention longue â sept à dix ans au minimum pour amortir ces frais. Ensuite, il exige un ticket suffisant : sous 100.000 ⬠de capital, ces 15 % écrasent mécaniquement le rendement, et la bourse gagne sans discussion. 5428 5429## 5. Le tableau fiscal complet 5430 5431| | Immobilier locatif | Actions / ETF | 5432| ---------------------------- | ------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | 5433| **Frais d'entrée** | Droits d'enregistrement 12 % (Flandre) ou 12,5 % (Wallonie, Bruxelles) + environ 2,8 % de frais d'acte et de crédit | Courtage de 0 à 2 ⬠par ordre + TOB de 0,12 % pour un ETF de capitalisation non inscrit en Belgique, 1,32 % s'il est inscrit | 5434| **Imposition des revenus** | Sur le revenu cadastral indexé majoré de 40 %, pas sur les loyers perçus | Précompte mobilier de 30 % sur les dividendes ; nul sur un ETF de capitalisation | 5435| **Plus-value** | 0 % après 5 ans ; 16,5 % avant | 10 % au-delà de 10.000 ⬠par an | 5436| **Frais récurrents** | Précompte immobilier, entretien, assurance, gestion | TER de l'ETF, souvent 0,10 à 0,25 % par an | 5437| **Frais de sortie** | 3 à 5 % (agence, PEB, mesurage) | TOB de 0,12 % | 5438| **Effet de levier** | Oui, jusqu'à 80-90 % via crédit hypothécaire | Non, hors marge risquée | 5439| **Liquidité** | 3 à 9 mois | Le jour même | 5440| **Ticket d'entrée** | Environ 80.000 ⬠de fonds propres pour un bien à 300.000 ⬠| 100 ⬠| 5441| **Contrainte réglementaire** | PEB, permis de location, normes d'isolation | Aucune | 5442 5443## 6. Le rendement locatif réel, et les quatre postes qui le rongent 5444 5445**Un rendement locatif brut de 4 % en Belgique donne typiquement 2,2 à 2,8 % net, avant crédit et avant impôt.** Quatre postes creusent l'écart : les frais d'acquisition, la vacance locative, l'entretien à 1 % de la valeur par an, et depuis 2026 les obligations de rénovation liées au PEB. 5446 5447Une fois la porte franchie, reste à savoir ce que le bien rapporte. Le rendement brut â loyer annuel divisé par prix d'achat â est un chiffre de vitrine. Quatre corrections s'imposent. 5448 5449### 6.1 Les frais d'acquisition 5450 5451Ce sont les 45.800 ⬠de la section 4. La base de calcul du rendement n'est donc pas 300.000 ⬠mais 345.800 â¬. Un rendement affiché à 4,2 % tombe mécaniquement à 3,6 %. 5452 5453### 6.2 La vacance locative 5454 5455Un mois de battement entre deux locataires représente déjà 4 % du loyer annuel. Compter zéro vacance sur vingt ans n'est pas une hypothèse, c'est un vÅu. 5456 5457### 6.3 L'entretien 5458 5459Toiture, chaudière, châssis, remise en état après départ. Sur un cycle long, **1 % de la valeur du bien par an** est une provision prudente, pas pessimiste. 5460 5461### 6.4 Le PEB, devenu le poste décisif 5462 5463Un appartement à Schaerbeek, 210.000 â¬, quinze pour cent sous le prix du quartier. L'affaire semble faite. Le certificat indique F. 5464 5465Depuis le 1er janvier 2026, un logement mis en location à Bruxelles doit atteindre au minimum le label E : les biens F et G ne peuvent plus être loués sans travaux. La Flandre impose depuis 2023 à l'acquéreur d'un logement classé E ou F de le rénover vers le label D dans les cinq ans. Un bien énergivore acheté 15 % s
5465ous le marché peut coûter 40.000 ⬠de travaux imposés â et ne rien rapporter entre-temps. Notre [simulateur PEB](/simulateur-peb) permet d'estimer l'impact d'une rénovation. 5466 5467**Résultat : un rendement brut de 4 % en Belgique donne typiquement 2,2 à 2,8 % net avant crédit et avant impôt.** Ce n'est pas un mauvais chiffre, c'est simplement un chiffre différent de celui de l'annonce. 5468 5469En contrepartie, l'imposition des loyers constitue un avantage belge considérable et rarement chiffré : un particulier qui loue à un particulier pour un usage privé est imposé sur le **revenu cadastral indexé majoré de 40 %**, une base souvent quatre à six fois inférieure aux loyers encaissés. Cet avantage disparaît si le locataire est une société ou un indépendant qui affecte le bien à son activité : l'imposition porte alors sur les loyers réels. Pour estimer votre charge annuelle, voyez notre [simulateur de précompte immobilier](/simulateurs/precompte-immobilier). 5470 5471## 7. L'effet de levier : l'argument décisif, et sa manipulation 5472 5473**Le crédit hypothécaire est le seul avantage structurel de l'immobilier : avec 80.000 ⬠d'apport vous achetez 300.000 ⬠de bien, contre 80.000 ⬠d'actions.** Mais le levier ne crée de la valeur que si le taux fixe reste sous le rendement de l'actif â et il amplifie les pertes à l'identique. 5474 5475Voilà pour les frottements. Reste l'argument qui, seul, justifie de les accepter â et il est massif : c'est le seul mécanisme légal permettant à un particulier de faire travailler l'argent d'une banque pendant vingt ans, à taux fixe, sans appel de marge. 5476 5477Avec 80.000 ⬠de fonds propres, vous achetez 300.000 ⬠d'immobilier. Avec 80.000 â¬, vous achetez 80.000 ⬠d'actions. à 3,5 % d'appréciation annuelle, le premier crée 10.500 ⬠de valeur par an, le second 2.800 â¬. C'est arithmétique, et c'est réel. 5478 5479Mais trois conditions doivent tenir, et elles ne tiennent pas toujours. 5480 5481**Le locataire doit porter l'essentiel du crédit.** Si le cash-flow est négatif de 300 ⬠par mois, vous injectez 72.000 ⬠sur vingt ans, **en plus** de vos 80.000 ⬠de départ. Ces injections mensuelles ont elles aussi un coût d'opportunité : placées à 7 %, ces mêmes 300 ⬠accumuleraient environ 156.000 ⬠sur la période â indépendamment de ce que deviennent les 80.000 ⬠initiaux, qui travaillent des deux côtés. C'est précisément pour cette raison que notre simulateur impose **la même sortie de trésorerie aux deux scénarios**. Comparer un bien financé à crédit à un portefeuille sans levier, sans égaliser les flux, est un truquage â et c'est le défaut de la quasi-totalité des simulateurs publiés par des acteurs immobiliers. 5482 5483**Le levier amplifie les pertes.** Une baisse de 10 % sur un bien à 300.000 ⬠détruit 30.000 â¬, soit 37 % de votre apport. La même baisse sur 80.000 ⬠d'actions détruit 8.000 â¬. Les trois années de recul consécutives du début des années 1980 rappellent que ce scénario n'a rien de théorique. 5484 5485**Le taux doit rester sous le rendement de l'actif.** à 3,4 % de taux fixe et 3,5 % d'appréciation, la marge est mince : le levier ne crée vraiment de la valeur que si le rendement locatif net s'y ajoute. Vous pouvez tester votre capacité de financement avec notre [simulateur de capacité d'emprunt](/simulateur-emprunt). 5486 5487> **Une distinction que nous tenons.** Notre analyse historique compare les deux **actifs**, sans levier, parce que les taux hypothécaires belges ont varié de 12 % à 3 % sur la période et qu'appliquer le taux d'aujourd'hui à une fenêtre des années 1980 produirait un résultat faux. Le simulateur, lui, modélise le levier aux conditions actuelles. Le backtest compare des actifs, le simulateur compare des stratégies de financement. Les deux ne se superposent pas. 5488 5489## 8. Loyers ou dividendes : deux revenus qui n'ont rien à voir 5490 5491**Un bien locatif belge verse 3 à 6 % brut, un ETF actions monde distribuant 1,05 %.** La fiscalité est inversée : les loyers sont taxés sur le revenu cadastral indexé majoré de 40 %, une base très inférieure au réel, quand les divi
5491dendes subissent 30 % de précompte mobilier. 5492 5493Le levier est l'argument du capital. Le revenu obéit à une logique différente â et en Belgique, le traitement fiscal des deux flux est **exactement inversé**. 5494 5495_Chiffres boursiers de cette section et de la section 11 : factsheet de l'indice MSCI World au 31 août 2026 (MSCI Inc.) et fiche produit iShares Core MSCI World UCITS ETF au 3 septembre 2026 (BlackRock)._ 5496 5497### 8.1 Ce que chaque actif verse réellement 5498 5499Un bien locatif belge rapporte 3 à 6 % brut selon la région, soit 2,2 à 2,8 % net après charges. 5500 5501Côté actions, l'écart est plus large qu'on ne l'imagine. L'indice MSCI World affiche un rendement de dividende de **1,50 %** au 31 août 2026, mais c'est un rendement brut. Ce qu'un ETF distribuant verse réellement, après retenues à la source sur les dividendes étrangers, est plus bas : **1,05 % sur douze mois glissants** pour l'iShares Core MSCI World au 3 septembre 2026. Un résident belge paie ensuite 30 % de précompte mobilier là -dessus, ce qui ramène le revenu net encaissé aux environs de **0,7 %**. 5502 5503Un ETF de capitalisation, lui, ne verse rien du tout et réinvestit automatiquement. 5504 5505En flux de trésorerie immédiat, l'immobilier locatif verse donc trois à cinq fois plus. Mais ce revenu supérieur est le prix d'une contrepartie : il est adossé à un seul locataire, dans une seule commune. 5506 5507### 8.2 La fiscalité, à front renversé 5508 5509| | Loyers | Dividendes | 5510| ------------------ | --------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ | 5511| **Base imposable** | Revenu cadastral indexé majoré de 40 % â une base fictive, souvent 4 à 6 fois inférieure aux loyers réels | Le montant réellement versé | 5512| **Taux** | Votre taux marginal + additionnels communaux | 30 % de précompte mobilier, retenu à la source | 5513| **Exonération** | Aucune, mais la base est déjà minorée | Une première tranche annuelle est exonérée et récupérable via la déclaration fiscale | 5514| **Charge réelle** | Faible | Lourde | 5515 5516C'est l'un des régimes locatifs les plus favorables d'Europe de l'Ouest, et il constitue un argument bien plus solide que la plus-value pour justifier l'immobilier belge. 5517 5518Mais il existe une parade côté actions, et elle est presque parfaite : **un ETF de capitalisation ne distribue rien, donc ne déclenche aucun précompte mobilier.** Le rendement s'accumule dans la valeur de la part, et n'est imposé qu'à la revente â au titre de la taxe de 10 % sur les plus-values, avec son exonération de 10.000 ⬠par an. 5519 5520Autrement dit : sur le revenu distribué, l'immobilier gagne largement. Sur le rendement total capitalisé, l'écart se referme presque entièrement. 5521 5522### 8.3 Prévisibilité et protection contre l'inflation 5523 5524Un loyer est **contractuel et légalement indexé** sur l'indice santé. C'est une protection contre l'inflation inscrite dans le bail, pas une espérance. Un dividende est **discrétionnaire** : une entreprise peut le réduire ou le supprimer, et beaucoup l'ont fait en 2020. 5525 5526L'avantage semble net, mais il se renverse dès qu'on regarde la concentration. Votre loyer dépend d'une seule personne : s'il ne paie pas, votre revenu tombe à zéro. Un ETF monde répartit ses dividendes sur plus d'un millier d'entreprises : aucune faillite individuelle ne fait disparaître le flux. 5527 5528**Le loyer est plus prévisible ligne à ligne, le dividende est plus robuste dans son ensemble.** 5529 5530## 9. Le coût que personne ne facture : votre temps 5531 5532**Non, l'immobilier locatif n'est pas un revenu passif : comptez 20 à 40 heures par an et par bien.** Sur 7.000 ⬠de revenu net, trente heures valorisées à 30 ⬠représentent 13 % de ce revenu â à peu près ce que coûte une gestion déléguée. Un portefeuille d'ETF demande une heure par an. 5533 5534Il reste un poste que ni les frais d'entrée, ni le rendement, ni la fiscalité ne capturent. 5535 5536Recherche de locataire, visites, état des lieux d'entrée et de sortie, indexation annuelle du loyer, rappels de paiement, interventions techniques, déclaration fiscale, suivi du PEB : sur une année ordinaire, un bien loué consomme facilement **20 à 40 heures**. Une mauvaise année â départ, travaux, litige â en consomme bien davantage. 5537 5538Le chiffrage est instructif. Sur un bien qui dégage 7.000 ⬠de revenu net annuel, trente heures de votre temps valorisées à 30 ⬠l'heure représentent 900 â
5538¬, soit **13 % du revenu net**. Déléguer la gestion coûte environ 7 % du loyer, soit un ordre de grandeur similaire. Vous payez donc en temps ou en argent, mais vous payez. 5539 5540Un portefeuille d'ETF demande, lui, environ une heure par an : un versement programmé et une ligne dans la déclaration fiscale. 5541 5542Ce coût n'apparaît dans aucun simulateur, y compris le nôtre. Il ne rend pas l'immobilier moins rentable â il change simplement la nature de ce que vous achetez. **Un bien locatif est un actif et une activité. Un ETF est seulement un actif.** 5543 5544Une nuance mérite toutefois d'être faite, parce qu'elle est presque toujours escamotée dans les promesses d'automatisation. Sur ces heures, une partie relève du travail d'information â vérifier une indexation, retrouver un document, préparer une déclaration. Celle-là se compresse avec de l'outillage. L'autre ne se compresse pas : une visite, un état des lieux, une chaudière en panne restent physiques. **La technologie déplace le curseur, elle ne l'annule pas.** 5545 5546## 10. Quand l'immobilier gagne, quand la bourse gagne 5547 5548**L'immobilier locatif l'emporte au-delà de huit ans si le crédit est obtenu sous 3,5 % et le rendement locatif brut dépasse 5 %.** La bourse l'emporte sous 100.000 ⬠de capital, sans accès au crédit, ou si l'horizon est inférieur à cinq ans. 5549 5550### L'immobilier locatif est le meilleur choix si 5551 5552- vous obtenez un crédit sous 3,5 % sur 20 ans ou plus ; 5553- le rendement locatif brut dépasse 5 %, ce qui exclut la plupart des centres-villes et oriente vers Charleroi, Liège, Verviers, La Louvière ou Mons ; 5554- vous détenez au moins 8 ans, pour amortir les 15 % de frais d'entrée et sortir de la fenêtre des 5 ans ; 5555- le PEB est C ou meilleur, ou le prix intègre déjà les travaux ; 5556- vous acceptez la gestion, ou budgétez 7 % du loyer pour la déléguer. 5557 5558### La bourse est le meilleur choix si 5559 5560- votre capital est inférieur à 100.000 ⬠: les 15 % de frais d'entrée écrasent le rendement sur un petit ticket ; 5561- vous n'avez pas accès au crédit, ou votre taux d'endettement approche déjà 40 % ; 5562- votre horizon est incertain, ou les fonds peuvent être nécessaires sous cinq ans ; 5563- vous préférez une exposition mondiale à une concentration sur un bien, une rue, un pays ; 5564- vous étalez vos réalisations pour rester sous l'exonération de 10.000 â¬. 5565 5566### Les deux, si votre patrimoine dépasse 300.000 ⬠5567 5568La question cesse alors d'être « lequel » pour devenir « quelle répartition ». C'est aussi le cas où les sociétés immobilières réglementées belges méritent un examen : exposition immobilière, liquidité boursière, aucune gestion. Le paysage s'est concentré â Aedifica et Cofinimmo ont fusionné en mars 2026 â et le régime fiscal des distributions doit se vérifier au cas par cas auprès de votre intermédiaire. 5569 5570## 11. Les risques qu'aucun simulateur ne chiffre 5571 5572**Le recul maximal de l'indice MSCI World depuis 1987 atteint 57,46 %, contre moins de 9 % pour le pire épisode immobilier belge.** Mais l'immobilier concentre son risque sur un locataire unique, une commune, et une réglementation PEB qui se durcit sans interruption depuis dix ans. 5573 5574Les deux actifs en ont, et ils ne sont pas de même nature. 5575 5576### 11.1 Côté immobilier 5577 5578**Le locataire.** Un impayé se règle devant la justice de paix. Comptez 6 à 12 mois entre le premier défaut et la récupération effective du bien, sans loyer et avec des frais de procédure. 5579 5580**La concentration.** Un bien locatif, c'est un actif, une commune, un segment de marché. Aucune diversification n'est possible en dessous de plusieurs biens. 5581 5582**Le calendrier de sortie.** Vous ne choisissez pas toujours votre date de vente. Un divorce, une mutation ou un besoin de liquidité peut forcer une revente sous cinq ans, et déclencher les 16,5 % que la simulation supposait exonérés. 5583 5584**La réglementation.** Encadrement des loyers, exigences PEB, permis de location, normes d'isolation : la contrainte s'est durcie sans interruption depuis dix ans. Modéliser vingt ans à réglementation constante est une hypothèse forte. 5585 5586### 11.2 Côté bourse 5587 5588**L'amplitude des reculs.** MSCI publie le recul maximal de son indice World depuis 1987 : **57,46 %**, entre le 31 octobre 2007 et le 9 mars 2009. L'immobilier belge n'a jamais rien connu d'approchant â son pire épisode, les trois années de baisse de 1981 à 1983, cumule moins de 9 % en nominal. Un rapport de un à six. 5589 5590**Le risque comportemental, qui est le principal.** En mars 2009, celui qui avait tenu depuis octobre 2007 voyait 57 % de son capital évaporés. Ceux qui ont vendu ce mois-là ont acté la perte. Ceux qui n'ont rien fait ont récupéré leur mise en quatre ans, puis l'ont triplée. 5591 5592Le rendement historique des marchés n'est perçu que par ceux qui ne vendent pas. Traverser un recul de 40 % sans capituler est autrement plus difficile en pratique qu'en théorie. L'illiquidité de l'immobilier est ici un avantage paradoxal : on ne revend pas une maison dans un mouvement de panique. 5593 5594**La séquence des rendements.** Deux investisseurs avec le même rendement moyen sur vingt ans terminent avec des patrimoines très différents selon l'ordre dans lequel les bonnes et les mauvaises années se présentent. Un krach juste avant la date où vou
5594s avez besoin des fonds n'a pas le même effet qu'un krach dix ans plus tôt. 5595 5596**La concentration cachée des indices.** Un ETF « monde » n'est pas aussi diversifié que son nom le suggère. Au 31 août 2026, sur les 1.280 composants de l'indice MSCI World, les **Ãtats-Unis pèsent 72,14 %**, les **dix premières lignes 26,61 %** et le seul secteur technologique **29,81 %**. Autrement dit, un quart de votre « monde » tient dans dix entreprises, presque toutes américaines. S'y ajoute, pour un investisseur belge, un risque de change non couvert sur la majorité des actifs sous-jacents. 5597 5598**L'absence de levier.** C'est le miroir de l'argument immobilier : aucun mécanisme comparable au crédit hypothécaire ne permet à un particulier de multiplier sa mise sur vingt ans à taux fixe. 5599 5600## 12. L'immobilier reste un excellent investissement. à une condition. 5601 5602**L'immobilier belge est un excellent placement pour qui achète le bon bien dans la bonne commune, et un placement médiocre pour qui achète une moyenne.** La barrière n'est pas financière mais informationnelle : rendement locatif observé, label PEB, précompte local et profondeur du marché à la revente se vérifient avant l'offre, pas après l'acte. 5603 5604Reprenons le fil. L'immobilier belge a rapporté 6,0 % par an sur cinquante ans sans levier, avec du crédit accessible et, depuis 2026, la seule plus-value structurellement non taxée du paysage patrimonial belge. C'est un actif remarquable. 5605 5606Mais tout ce qui précède décrit une barrière : 15 % de frais d'entrée à amortir, un écart régional de 0,9 point par an, des obligations PEB qui peuvent coûter 40.000 â¬, un locataire unique, un précompte qui varie du simple au double d'une commune à l'autre, et vingt à quarante heures par an. 5607 5608**Cette barrière n'est pas financière. Elle est informationnelle** â et l'information, on vient de le voir, est justement la part qui s'automatise. Deux investisseurs qui achètent le même appartement au même prix n'obtiennent pas le même rendement. L'un a vérifié le rendement locatif observé dans la commune, le label PEB, le précompte local et la profondeur du marché à la revente. L'autre a lu une annonce et fait confiance à une moyenne nationale. 5609 5610C'est exactement le travail qu'Arcanes automatise. Notre moteur croise le prix médian de la commune, le rendement locatif observé, la charge de précompte locale et les contraintes énergétiques pour un bien précis â **avant l'offre plutôt qu'après l'acte**. Ce ne sont pas nos estimations : ce sont les mêmes données publiques que celles de cet article, appliquées à une adresse. 5611 5612L'immobilier belge est un excellent investissement pour qui achète le bon bien dans la bonne commune. C'est un investissement médiocre pour qui achète une moyenne. 5613 5614â **[Analyser un bien avec les données de sa commune](/free-analyse?src=article-immo-bourse)** â première analyse offerte 5615â **[Consulter les prix par commune](/communes)** 5616 5617## FAQ â Questions fréquentes sur l'arbitrage immobilier / bourse 5618 5619### Faut-il investir dans l'immobilier ou en bourse en Belgique en 2026 ? 5620 5621Cela dépend de votre accès au crédit et de votre horizon. L'immobilier locatif l'emporte généralement au-delà de huit ans si vous obtenez un crédit sous 3,5 % et un rendement locatif brut supérieur à 5 %, grâce à l'effet de levier et à l'exonération de plus-value après cinq ans. En dessous de 100.000 ⬠de capital ou sans accès au crédit, un ETF actions monde est plus efficace : les 15 % de frais d'entrée immobiliers ne peuvent pas être amortis. 5622 5623### Les taux réduits de droits d'enregistrement s'appliquent-ils à un investissement locatif ? 5624 5625Non. Les taux de 2 % en Flandre, 3 % en Wallonie et l'abattement de 200.000 ⬠à Bruxelles sont réservés à l'habitation propre et unique, en pleine propriété. Un investissement locatif, une résidence secondaire ou un achat via société relèvent du taux standard : 12 % en Flandre, 12,5 % en Wallonie et à Bruxelles. C'est l'erreur la plus fréquente dans les calculs de rentabilité en ligne. 5626 5627### L'immobilier belge rapporte-t-il vraiment 9 % par an ? 5628 5629Non. Ce chiffre circule largement mais provient d'études françaises, souvent levier compris. Sur données belges, le prix des maisons a progressé d'environ 6,0 % par an en nominal entre 1974 et 2024, sans levier, avec de fortes différences régionales : 6,2 % en Flandre contre 5,3 % en Wallonie. 5630 5631### La taxe de 10 % sur les plus-values change-t-elle la donne en faveur de l'immobilier ? 5632 5633Oui, mais partiellement. Elle supprime l'exonération totale dont bénéficiaient les actions, mais l'abattement de 10.000 ⬠par an neutralise l'impôt pour la plupart des portefeuilles de particuliers qui réalisent leurs gains progressivement. L'écart s'est réduit, il ne s'est pas inversé. 5634 5635### Quel rendement locatif brut faut-il viser en Belgique ? 5636 5637Au minimum 5 % brut pour qu'un investissement locatif à crédit soit autofinancé après charges, précompte immobilier et impôt. En dessous de 4 %, l'opération n'est rentable que si vous pariez sur la plus-value, ce qui revient à un pari directionnel sur le marché plutôt qu'à un investissement de rendement. 5638 5639### Combien coûtent réellement les frais d'entrée dans l'immobilier et en bourse ? 5640 5641Environ 15 % du prix pour un bien locatif belge, contre environ 0,15 % en bourse â un rapport de un à cent. Sur 300.000 ⬠en Wallonie : 37.500 ⬠de droits d'enregistrement, environ 3.200 ⬠d'honoraires de notaire, 1.200 ⬠de frais administratifs et 3.900 ⬠pour l'acte de crédit, soit 45.800 â¬. Le taux est de 12 % en Flandre, 12,5 % en Wallonie et à Bruxelles ;
5641 les taux réduits de 2 % et 3 % sont réservés à l'habitation propre et unique. En bourse, un ordre coûte 0 à 2 ⬠chez un courtier en ligne, plus 0,12 % de taxe sur les opérations de bourse. 5642 5643### Les loyers perçus sont-ils imposés en Belgique ? 5644 5645Oui, mais sur une base fictive. Pour une location à un particulier à usage privé, l'impôt porte sur le revenu cadastral indexé majoré de 40 %, et non sur les loyers réellement encaissés â une base généralement quatre à six fois inférieure. Si le locataire est une société ou un indépendant qui affecte le bien à son activité, l'imposition porte sur les loyers réels. 5646 5647### Vaut-il mieux détenir un bien locatif en nom propre ou via une société ? 5648 5649Cela dépend de la taille de votre patrimoine. En nom propre, l'imposition sur le revenu cadastral indexé et l'exonération de plus-value après cinq ans sont très favorables. En société, les charges et amortissements sont déductibles, mais la plus-value de revente et la sortie des liquidités sont imposées. La détention privée est généralement préférable pour un ou deux biens loués à des particuliers ; la société devient pertinente pour un patrimoine important ou une activité de rénovation. C'est un arbitrage à trancher avec un conseiller fiscal, pas une règle générale. 5650 5651### Un ETF de capitalisation est-il plus avantageux qu'un ETF de distribution en Belgique ? 5652 5653Oui dans la plupart des cas, car un ETF de capitalisation ne verse pas de dividendes et échappe donc au précompte mobilier de 30 %. Attention toutefois à la taxe sur les opérations de bourse : 0,12 % pour un ETF de capitalisation non inscrit en Belgique, contre 1,32 % s'il est inscrit. L'écart devient considérable sur des versements réguliers. 5654 5655### Au bout de combien d'années un investissement locatif devient-il rentable ? 5656 5657Entre 7 et 10 ans généralement. Il faut amortir environ 15 % de frais d'entrée et 3 à 5 % de frais de sortie, soit plus de deux années de loyer brut, tout en dépassant le seuil de cinq ans qui exonère la plus-value immobilière. 5658 5659### Faut-il choisir entre immobilier et bourse, ou combiner les deux ? 5660 5661Cela dépend de votre patrimoine. Au-delà de 300.000 â¬, la question pertinente n'est plus « lequel » mais « quelle proportion ». Les deux actifs ne réagissent pas aux mêmes chocs : l'immobilier belge a reculé au début des années 1980 pendant que les marchés montaient, et l'inverse s'est produit en 2008. Combiner réduit la volatilité de l'ensemble. 5662 5663### L'immobilier locatif est-il un revenu passif ? 5664 5665Non. Recherche de locataire, visites, états des lieux, indexation, rappels de paiement, interventions techniques et déclaration fiscale représentent 20 à 40 heures par an pour un seul bien. Sur un revenu net de 7.000 â¬, trente heures valorisées à 30 ⬠l'heure équivalent à 13 % de ce revenu. Déléguer la gestion coûte environ 7 % du loyer, soit un ordre de grandeur similaire. Un portefeuille d'ETF demande environ une heure par an. 5666 5667### Vaut-il mieux toucher des loyers ou des dividendes en Belgique ? 5668 5669Cela dépend de ce que vous cherchez. Sur le revenu distribué, les loyers sont nettement plus avantageux : un bien locatif belge rapporte 3 à 6 % brut, alors qu'un ETF actions monde distribuant a versé 1,05 % sur les douze derniers mois. Et les loyers sont imposés sur le revenu cadastral indexé majoré de 40 %, une base souvent quatre à six fois inférieure aux loyers réels, quand les dividendes subissent 30 % de précompte mobilier sur leur montant réel, ce qui ramène le revenu net encaissé autour de 0,7 %. Mais un ETF de capitalisation ne distribue rien et échappe donc entièrement au précompte : le rendement s'accumule et n'est imposé qu'à la revente. Sur le rendement total, l'écart se referme presque complètement. 5670 5671### Un loyer est-il plus sûr qu'un dividende ? 5672 5673Oui et non. Un loyer est contractuel et légalement indexé sur l'indice santé, alors qu'un dividende est discrétionnaire et peut être supprimé. Mais le loyer dépend d'un seul locataire : s'il ne paie pas, le revenu tombe à zéro. Les dividendes d'un ETF monde proviennent de plus d'un millier d'entreprises, et aucune défaillance individuelle n'interrompt le flux. Le loyer est plus prévisible ligne à ligne, le dividende plus robuste dans son ensemble. 5674 5675### Un ETF monde est-il vraiment diversifié ? 5676 5677Non, moins que son nom ne le suggère. Au 31 août 2026, l'indice MSCI World compte 1.280 sociétés, mais les Ãtats-Unis en représentent 72,14 %, les dix premières lignes 26,61 % et le secteur technologique 29,81 %. Un quart de l'exposition tient donc dans dix entreprises, presque toutes américaines. La diversification reste très supérieure à celle d'un bien locatif unique, mais elle est moins large qu'on ne l'imagine. 5678 5679### Peut-on emprunter pour investir en bourse comme pour l'immobilier ? 5680 5681Techniquement oui, via un crédit lombard ou un compte sur marge, mais le mécanisme n'est pas comparable : taux plus élevé, durée plus courte, et un appel de marge peut vous forcer à vendre au pire moment. L'effet de levier long et stable du crédit hypothécaire n'a pas d'équivalent boursier pour un particulier. 5682 5683--- 5684 5685_Cet article a été rédigé par Arcanes à titre informatif et ne constitue pas un conseil financier, fiscal ou juridique personnalisé. Pour un accompagnement adapté à votre situation, consultez votre notaire, votre banquier ou un conseiller financier agréé. Les chiffres reposent sur les données disponibles en septembre 2026 et sont susceptibles d'évoluer._ 5686
5687_Le rendement dépend de la commune, pas du pays : sur cinquante ans, l'écart régional a atteint 0,9 point par an. [Consultez les prix par commune](/communes) ou [analysez un bien précis avec les données de sa commune](/free-analyse?src=article-immo-bourse)._ 5688`,rO=`--- 5689title: "Vastgoed of beurs in België: 50 jaar cijfers vergeleken" 5690slug: "immobilier-ou-bourse-belgique" 5691tag: "Beleggen" 5692readTime: 19 5693publishDate: "8 september 2026" 5694updateDate: "8 september 2026" 5695author: "Arcanes" 5696excerpt: "Drie jaren van daling, een decennium stilstand, dan de wet van 2026. Wat vijftig jaar Belgische prijzen zeggen over baksteen of beurs." 5697image: "/__l5e/assets-v1/d3e113c8-5792-482a-bd08-ff07ab2b7518/immobilier-ou-bourse-belgique.jpg" 5698imageVersion: "2" 5699imageAlt: "Gevel van een Brussels herenhuis naast de glazen gevel van een kantoorgebouw" 5700--- 5701 5702# Vastgoed of beurs in België: 50 jaar cijfers vergeleken 5703 5704In 1981, en opnieuw in 1982, en opnieuw in 1983 daalde de prijs van Belgische huizen. Drie jaar op rij. Niemand vertelt dat verhaal, en dat is begrijpelijk: het spreekt het enige tegen wat iedereen meent te weten over baksteen. 5705 5706In diezelfde drie jaar stegen de wereldwijde aandelenmarkten. 5707 5708Daar zit precies het probleem van de afweging. Men vergelijkt een actief dat men vanbuiten kent â het huis van zijn ouders, dat van de buren, dat men op zaterdag bezoekt â met een actief waarvan men niets ziet, dat enkel bestaat als een regel in een app. En men beslist op intuïtie in plaats van op cijfers. 5709 5710Wij hebben daarom de volledige reeks Belgische prijzen gereconstrueerd, van 1974 tot 2024, gemeente per gemeente. Ze zegt dat vastgoed **6,0 % per jaar nominaal** opbracht, zonder hefboom â terwijl de MSCI World over de laatste vijfendertig jaar 8,1 % gaf, in euro. Ze zegt ook dat het decennium 1980 slechts 3,4 % per jaar opleverde, en dat de kloof tussen Vlaanderen en Wallonië vijftig jaar lang met 0,9 procentpunt per jaar is uitgediept. 5711 5712Maar die twee cijfers volstaan niet om te beslissen, want ze negeren alles wat de twee beleggingen werkelijk scheidt: 15 % instapkosten aan de ene kant tegenover 0,15 % aan de andere, een bankkrediet dat voor de ene wel en voor de andere niet toegankelijk is, een fiscaliteit die op 1 januari 2026 is gekanteld, en twintig tot veertig uur per jaar die niemand factureert. 5713 5714**Begin met uw eigen geval.** De simulator hieronder neemt een Belgische gemeente, een woning en uw eigen inbreng, en legt **dezelfde geldstromen op aan beide scenario's** â de enige manier om een aankoop op krediet eerlijk te vergelijken met een portefeuille zonder hefboom. De twaalf hoofdstukken die volgen leggen elk van zijn parameters uit. 5715 5716<!-- SIMULATEUR: immo-vs-bourse --> 5717 5718## 1. Wat Belgisch vastgoed werkelijk opbracht 5719
5720**De prijs van Belgische huizen steeg tussen 1974 en 2024 met 6,0 % per jaar nominaal, zonder hefboomeffect.** Maar dat gemiddelde verhult een verloren decennium: de jaren 1980 leverden slechts 3,4 % per jaar op, met drie opeenvolgende daljaren van 1981 tot 1983. 5721 5722**Bijgewerkt op 8 september 2026** â reeks gereconstrueerd uit de kadastrale statistieken (1973-2009) en de vastgoedstatistieken (2010-2024), 565 gemeenten, mediaanprijzen van gewone woonhuizen gewogen naar het aantal transacties. _Bronnen: Statbel, FOD Financiën â zie onze [methodologie](/methodologie)._ 5723 5724De meeste vergelijkingen nemen Franse cijfers over, vaak een rendement van zowat 9 % per jaar over dertig jaar, hefboom en kosten samen. Die cijfers beschrijven noch de Belgische markt, noch haar fiscaliteit. Hier zijn de onze. 5725 5726### Vijftig jaar prijzen, decennium per decennium 5727 5728| Periode | Nominale jaarlijkse groei | 5729| ------------- | ------------------------- | 5730| 1974-1980 | +12,8 % | 5731| 1980-1990 | +3,4 % | 5732| 1990-2000 | +6,8 % | 5733| 2000-2010 | +8,1 % | 5734| 2010-2020 | +3,1 % | 5735| 2020-2024 | +4,8 % | 5736| **1974-2024** | **+6,0 %** | 5737 5738<!-- FIGURE:START prix-par-decennie --> 5739 5740Twee vaststellingen die het commerciële discours doorgaans verzwijgt, en die **figuur 1** in één oogopslag zichtbaar maakt. 5741 5742**Belgisch vastgoed is gedaald, en niet kort.** De dalingen van 1981 tot 1983 â â3,3 %, â4,5 %, â1,2 % nominaal â vonden plaats onder dubbelcijferige inflatie. Het koopkrachtverlies was dus aanzienlijk zwaarder dan die cijfers suggereren. « Vastgoed stijgt altijd » is een uitspraak die haar eigen cijfers niet overleeft. 5743 5744**Het recente tempo is niet het historische tempo.** De 8,1 % per jaar van 2000-2010 komt overeen met een structurele herwaardering: de hypotheekrente daalde van ongeveer 8 % naar 4 % en de kredietduur werd langer. Die kanteling kan zich niet herhalen. Acht procent doortrekken naar de komende twintig jaar is een gok, geen prognose. 5745 5746<!-- FIGURE:END --> 5747 5748> **Methodologische noot.** Deze cijfers zijn nominaal. De omzetting naar reële termen volgt zodra de reeks van de gezondheidsindex is geïntegreerd. Wij publiceren geen reëel rendement berekend op een geschatte inflatie. 5749 5750## 2. De regionale kloof, en waarom een gemiddelde u niets zegt 5751 5752**Vlaams vastgoed steeg over vijftig jaar met 6,2 % per jaar tegenover 5,3 % in Wallonië, cumulatief 55 % meer waarde.** Maar een hoog meerwaarderendement gaat samen met een laag huurrendement: een regionaal gemiddelde beslist niets. 5753 5754Die nationale 6,0 % beschrijft geen enkele werkelijke gemeente. Per gewest toegepast geeft dezelfde methode dit â ruwe niveauverhoudingen, 1974 â 2024: 5755 5756| Gewest | Gemiddelde prijs 1974 | Gemiddelde prijs 2024 | Factor | Per jaar | 5757| ---------- | --------------------- | --------------------- | ------ | --------- | 5758| Vlaanderen | 14.802 ⬠| 304.544 ⬠| 20,6à | **6,2 %** | 5759| Brussel | 23.089 ⬠| 527.231 ⬠| 22,8à | **6,5 %** | 5760| Wallonië | 13.430 ⬠| 177.660 ⬠| 13,2à | **5,3 %** | 5761 5762<!-- FIGURE:START ecart-regional --> 5763 5764**Wallonië verliest ongeveer 0,9 procentpunt per jaar over vijftig jaar.** Cumulatief is een euro belegd in Vlaamse woningen in 1974 vandaag ongeveer 1,55 keer waard wat hij in Wallonië waard is (**figuur 2**). 5765 5766Nog een opvallend cijfer: Brussel was in 1974 72 % duurder dan Wallonië. Het verschil bedraagt nu 197 %. Het is bijna verdrievoudigd. 5767 5768Maar daar stoppen zou precies de fout zijn die deze tabel zou moeten voorkomen. De mechanische conclusie â « koop in Vlaanderen » â klopt niet. 5769 5770Stel u twee kopers uit 1974 voor. De ene tekent in Zaventem, de andere in Charleroi, voor hetzelfde bedrag. Vijftig jaar later heeft de eerste zijn inleg twintig keer zien worden, de tweede dertien. Maar al die tijd is het de tweede die de hoogste huurinkomsten inde, afgezet tegen de betaalde prijs. Wie deed de beste belegging? Dat hangt volledig af van wat hij zocht. 5771 5772<!-- FIGURE:END --> 5773 5774**Een hoog meerwaarderendement gaat bijna altijd samen met een laag huurrendement.** Wallonië toont de hoogste bruto huurrendementen van het land _net_ omdat de prijzen er het minst stegen. De twee motoren van de prestatie werken in tegengestelde richting. Wie cashflow zoekt en wie meerwaarde zoekt, zouden niet in hetzelfde gewest moeten kopen â en binnen een gewest niet in dezelfde gemeente. 5775 5776Dat is de echte les: **een regionaal gemiddelde is een cijfer om over te praten, geen cijfer om op te beslissen.** Tussen Elsene en Charleroi levert eenzelfde budget van 300.000 ⬠niet hetzelfde rendement, niet hetzelfde r
5776isico en niet hetzelfde traject op. Om gemeente per gemeente te vergelijken: onze [prijzen per gemeente](/gemeenten) en de [verkenningskaart](/verkenning) vertrekken van dezelfde data als dit artikel. 5777 5778_Voorbehoud: Vlaanderen en Brussel wisselen van plaats naargelang de aggregatiemethode. Wij scheiden ze niet. Enkel de Waalse achterstand is robuust volgens beide methodes._ 5779 5780## 3. 1 januari 2026: vastgoed wordt het laatste fiscale bastion 5781 5782**Sinds 1 januari 2026 worden meerwaarden op aandelen belast aan 10 % boven 10.000 ⬠per jaar, terwijl de meerwaarde op vastgoed na vijf jaar aanhouden onbelast blijft.** Vastgoed is daarmee het enige courante Belgische actief waarvan de meerwaarde structureel buiten de belasting valt. 5783 5784Tot 2025 was België een uitzondering: meerwaarden op aandelen van een particulier in normaal beheer waren niet belast. Dat was hét argument voor de beurs. 5785 5786Het is weggevallen. De heffing is vastgelegd door de wet van 6 april 2026, met terugwerkende kracht tot 1 januari. Meerwaarden van vóór 31 december 2025 blijven vrijgesteld: de waarde op die datum dient als basis. 5787 5788Drie nuances voor u te snel besluit: 5789 5790- **De vrijstelling van 10.000 ⬠per jaar** neutraliseert de belasting voor wie geleidelijk realiseert. Op een portefeuille van 150.000 ⬠aan 6 % bedraagt de jaarlijkse meerwaarde ongeveer 9.000 â¬: onder de drempel. 5791- **De heffing treft de verkoop, niet het aanhouden.** Een kapitalisatie-ETF die u niet verkoopt, activeert niets. 5792- **Vastgoed bleef ongewijzigd.** Verkocht binnen vijf jaar wordt de meerwaarde belast aan 16,5 %; daarna niet meer. 5793 5794Wat meteen de volgende vraag oproept. Als dat voordeel echt is, waarom stort niet iedereen zich erop? 5795 5796## 4. Het instapticket: 15 % tegenover 0,15 % 5797 5798**Instappen in een Belgisch huurpand kost ongeveer 15 % van de prijs; instappen op de beurs ongeveer 0,15 %.** Op 300.000 ⬠in Wallonië betaalt een investeerder 45.800 ⬠aan registratierechten, notarishonoraria en kredietakte. Op 10.000 ⬠in een ETF kost de instap 14 â¬. 5799 5800Omdat u eerst door de deur moet. En de deur heeft een prijs. 5801 5802Een belegger tekent een compromis van 300.000 ⬠in Namen. Hij vergeleek drie wijken, berekende zijn rendement, bedong 8.000 ⬠bij de verkoper. Dan komt de afrekening van de notaris: **45.800 â¬**, te betalen nog vóór hij de sleutel heeft. Zijn onderhandeling is zojuist vijf keer uitgewist. 5803 5804### 4.1 Wat de instap in een huurpand werkelijk kost 5805 5806De verlaagde registratierechten â 2 % in Vlaanderen, 3 % in Wallonië, abattement van 200.000 ⬠in Brussel â zijn voorbehouden aan de **enige eigen woning**. Een verhuurder heeft er geen recht op, en een aankoop via vennootschap evenmin. Het tarief is 12 % in Vlaanderen, 12,5 % in Wallonië en Brussel. 5807 5808Op een pand van 300.000 ⬠in Wallonië: 5809 5810| Post | Bedrag | 5811| -------------------------------------------------- | ------------------------------- | 5812| Registratierechten 12,5 % | 37.500 ⬠| 5813| Honoraria notaris (wettelijk barema) | env. 3.200 ⬠| 5814| Administratieve kosten en opzoekingen | env. 1.200 ⬠| 5815| Kredietakte, waarvan 1 % hypothecaire inschrijving | env. 3.900 ⬠| 5816| **Totaal** | **env. 45.800 â¬, ofwel 15,3 %** | 5817 5818**Onthoud het contrast: ongeveer 5 % voor uw eigen woning, ongeveer 15 % voor een huurpand.** Dat is de meest verspreide fout in rendementsberekeningen online â het verlaagde tarief toepassen op een belegging â en ze vervalst het resultaat met tienduizenden euro's. 5819 5820### 4.2 Wat de instap op de beurs vandaag kost 5821 5822Twintig jaar geleden rekende een Belgische bank 20 tot 30 ⬠per order aan, plus jaarlijkse bewaarrechten. De wereld is veranderd. Bij DEGIRO, Bolero of Trade Republic kost een order vandaag tussen 0 en 2 â¬. Daarbij komt de beurstaks, 0,12 % voor een kapitalisatie-ETF die niet in België is ingeschreven. 5823 5824Op 10.000 ⬠belegd kost de instap dus zowat **14 â¬**. 5825 5826### 4.3 Een verhouding van één op honderd 5827 5828<!-- FIGURE:START ticket-entree --> 5829 5830Naast elkaar: **ongeveer 15 % om in verhuurd vastgoed te stappen, ongeveer 0,15 % om op de beurs te stappen.** Op **figuur 3** is de tweede balk bijna onzichtbaar â en dat is precies het punt. 5831 5832Dat cijfer heeft twee gevolgen die verderop terugkomen. Verhuurd vastgoed vraagt een lange aanhoudperiode â minstens zeven tot tien j
5832aar om die kosten af te schrijven. En het vraagt een voldoende ticket: onder 100.000 ⬠kapitaal verpletteren die 15 % het rendement, en wint de beurs zonder discussie. 5833 5834Het verklaart ook waarom een vastgoedbelegger niet zo vaak kan herschikken als een beursbelegger. Van positie veranderen kost vijftien procent bij de instap en drie tot vijf bij de uitstap, samen bijna twintig procent per heen-en-terug. Op de beurs kost dezelfde operatie minder dan een half procent. De ene is veroordeeld om lang gelijk te hebben, de andere mag zich vaak vergissen. 5835 5836<!-- FIGURE:END --> 5837 5838## 5. De volledige fiscale tabel 5839 5840| | Verhuurd vastgoed | Aandelen / ETF | 5841| -------------------------- | ---------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | 5842| **Instapkosten** | Registratierechten 12 % (Vlaanderen) of 12,5 % (Wallonië, Brussel) + ongeveer 2,8 % akte- en kredietkosten | Courtage van 0 tot 2 ⬠per order + beurstaks 0,12 % voor een niet-ingeschreven kapitalisatie-ETF, 1,32 % indien wel | 5843| **Belasting op inkomsten** | Op het geïndexeerd kadastraal inkomen verhoogd met 40 %, niet op de ontvangen huur | Roerende voorheffing van 30 % op dividenden; nihil bij kapitalisatie | 5844| **Meerwaarde** | 0 % na 5 jaar; 16,5 % ervoor | 10 % boven 10.000 ⬠per jaar | 5845| **Terugkerende kosten** | Onroerende voorheffing, onderhoud, verzekering, beheer | Lopende kosten van de ETF, 0,10 tot 0,25 % per jaar | 5846| **Uitstapkosten** | 3 tot 5 % (makelaar, EPC, opmeting) | Beurstaks 0,12 % | 5847| **Hefboomeffect** | Ja, tot 80-90 % via hypothecair krediet | Neen, behalve riskante margefinanciering | 5848| **Liquiditeit** | 3 tot 9 maanden | Dezelfde dag | 5849| **Instapdrempel** | Ongeveer 80.000 ⬠eigen middelen voor een pand van 300.000 ⬠| 100 ⬠| 5850| **Regelgeving** | EPC, verhuurvergunning, isolatienormen | Geen | 5851 5852## 6. Het werkelijke huurrendement, en de vier posten die eraan knagen 5853 5854**Een bruto huurrendement van 4 % levert in België doorgaans 2,2 tot 2,8 % netto op, vóór krediet en vóór belasting.** Vier posten graven de kloof: de verwervingskosten, de leegstand, het onderhoud aan 1 % van de waarde per jaar, en sinds 2026 de renovatieverplichtingen gekoppeld aan het EPC. 5855 5856Eenmaal door de deur blijft de vraag wat het pand opbrengt. Het brutorendement â jaarhuur gedeeld door aankoopprijs â is een etalagecijfer. 5857 5858### 6.1 De verwervingskosten 5859 5860Dat zijn de 45.800 ⬠uit sectie 4. De rekenbasis is dus geen 300.000 ⬠maar 345.800 â¬. Een aangekondigd rendement van 4,2 % zakt mechanisch naar 3,6 %. 5861 5862### 6.2 De leegstand 5863 5864Eén maand tussen twee huurders vertegenwoordigt al 4 % van de jaarhuur. Twintig jaar lang nul rekenen is geen hypothese, het is een wens. 5865 5866### 6.3 Het onderhoud 5867 5868Dak, ketel, ramen, herstelling na vertrek. Over een lange cyclus is **1 % van de waarde per jaar** een voorzichtige voorziening. 5869 5870### 6.4 Het EPC, de bepalende post geworden 5871 5872Een appartement in Schaarbeek, 210.000 â¬, vijftien procent onder de wijkprijs. De zaak lijkt rond. Het certificaat vermeldt F. 5873 5874Sinds 1 januari 2026 moet een woning die in Brussel wordt verhuurd minstens label E halen: F en G mogen niet meer verhuurd worden zonder werken. Vlaanderen verplicht sinds 2023 de koper van een woning met label E of F om binnen vijf jaar te renoveren naar label D. Een energieverslindend pand dat 15 % onder de markt wordt gekocht, kan 40.000 ⬠aan verplichte werken kosten â en ondertussen niets opbrengen. 5875 5876Daartegenover staat een aanzienlijk Belgisch voordeel: een particulier die aan een particulier verhuurt voor privégebruik wordt belast op het **ge
5876ïndexeerd kadastraal inkomen verhoogd met 40 %**, een basis die vaak vier tot zes keer lager ligt dan de ontvangen huur. Dat voordeel verdwijnt bij verhuur aan een vennootschap of een zelfstandige. 5877 5878## 7. Het hefboomeffect: het doorslaggevende argument, en de manipulatie ervan 5879 5880**Het hypothecair krediet is het enige structurele voordeel van vastgoed: met 80.000 ⬠eigen inbreng koopt u 300.000 ⬠pand, tegenover 80.000 ⬠aandelen.** Maar de hefboom creëert enkel waarde als de vaste rente onder het rendement van het actief blijft â en hij versterkt de verliezen even hard. 5881 5882Zo blijft het argument over dat, alleen, rechtvaardigt om al die frictie te aanvaarden â en het weegt zwaar: het is het enige wettelijke mechanisme waarmee een particulier twintig jaar lang het geld van een bank kan laten werken, tegen vaste rente, zonder margeverzoek. 5883 5884Bij 3,5 % jaarlijkse waardestijging creëert het eerste 10.500 ⬠per jaar, het tweede 2.800 â¬. Dat is rekenkunde, en het klopt. Maar drie voorwaarden moeten standhouden. 5885 5886**De huurder moet het krediet grotendeels dragen.** Bij een negatieve cashflow van 300 ⬠per maand legt u over twintig jaar 72.000 ⬠bij, **bovenop** uw 80.000 ⬠startinbreng. Ook die maandelijkse stortingen hebben een opportuniteitskost: aan 7 % belegd zouden diezelfde 300 ⬠over de periode ongeveer 156.000 ⬠opleveren â los van wat de oorspronkelijke 80.000 ⬠doen, die aan beide kanten meewerken. Precies daarom legt onze simulator **dezelfde geldstromen op aan beide scenario's**. Een pand op krediet vergelijken met een portefeuille zonder hefboom, zonder de kasstromen gelijk te trekken, is doorgestoken kaart â en het is de zwakte van nagenoeg alle simulatoren van vastgoedspelers. 5887 5888**De hefboom versterkt de verliezen.** Een daling van 10 % op een pand van 300.000 ⬠vernietigt 30.000 â¬, ofwel 37 % van uw inbreng. Dezelfde daling op 80.000 ⬠aandelen vernietigt 8.000 â¬. De drie opeenvolgende daljaren van begin jaren 1980 tonen dat dit allesbehalve theoretisch is. 5889 5890> **Een onderscheid dat wij aanhouden.** Onze historische analyse vergelijkt de twee **activa**, zonder hefboom, omdat de Belgische hypotheekrente over de periode schommelde tussen 12 % en 3 %. De simulator daarentegen modelleert de hefboom tegen de huidige voorwaarden. De backtest vergelijkt activa, de simulator vergelijkt financieringsstrategieën. 5891 5892## 8. Huur of dividend: twee inkomsten die niets met elkaar te maken hebben 5893 5894**Een Belgisch huurpand keert 3 tot 6 % bruto uit, een uitkerende wereld-ETF 1,05 %.** De fiscaliteit is omgekeerd: huurinkomsten worden belast op het geïndexeerd kadastraal inkomen verhoogd met 40 %, een basis ver onder de werkelijkheid, terwijl dividenden 30 % roerende voorheffing dragen. 5895 5896_Beurscijfers in deze sectie en in sectie 11: factsheet MSCI World-index op 31 augustus 2026 (MSCI Inc.) en productfiche iShares Core MSCI World UCITS ETF op 3 september 2026 (BlackRock)._ 5897 5898### 8.1 Wat elk actief werkelijk uitkeert 5899 5900Een Belgisch huurpand brengt 3 tot 6 % bruto op, ofwel 2,2 tot 2,8 % netto na kosten. 5901 5902Aan de aandelenkant is de kloof groter dan men denkt. De MSCI World-index toont een dividendrendement van **1,50 %** op 31 augustus 2026, maar dat is bruto. Wat een distributie-ETF werkelijk uitkeert, na bronheffing, ligt lager: **1,05 % over twaalf voortschrijdende maanden**. Een Belgische belegger betaalt daarop 30 % roerende voorheffing, waardoor het netto ontvangen inkomen rond **0,7 %** uitkomt. 5903 5904Een kapitalisatie-ETF keert niets uit en herbelegt automatisch. 5905 5906In onmiddellijke kasstroom keert verhuurd vastgoed dus drie tot vijf keer meer uit. Maar dat hogere inkomen hangt af van één huurder, in één gemeente. 5907 5908### 8.2 De fiscaliteit, omgekeerd 5909 5910| | Huurinkomsten | Dividenden | 5911| -------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ | 5912| **Belastbare basis** | Geïndexeerd kadastraal inkomen verhoogd met 40 % â vaak 4 tot 6 keer lager dan de werkelijke huur | Het werkelijk uitgekeerde bedrag | 5913| **Tarief** | Uw marginale tarief + gemeentelijke opcentiemen | 30 % roerende voorheffing aan de bron | 5914| **Vrijstelling** | Geen, maar de basis is al verlaagd | Een eerste jaarlijkse schijf, recupereerbaar via de aangifte |
5915| **Werkelijke last** | Laag | Zwaar | 5916 5917Dat is een van de gunstigste huurregimes van West-Europa, en een steviger argument dan de meerwaarde. 5918 5919Maar er is een bijna perfecte tegenzet: **een kapitalisatie-ETF keert niets uit en activeert dus geen roerende voorheffing.** Het rendement stapelt zich op in de deelbewijswaarde en wordt pas bij verkoop belast. 5920 5921Op uitgekeerd inkomen wint vastgoed ruim. Op het totale gekapitaliseerde rendement sluit de kloof zich bijna volledig. 5922 5923### 8.3 Voorspelbaarheid en inflatiebescherming 5924 5925Een huur is **contractueel en wettelijk geïndexeerd** op de gezondheidsindex. Een dividend is **discretionair** â het kan worden geschrapt, en velen deden dat in 2020. 5926 5927Het voordeel lijkt duidelijk, maar het kantelt bij concentratie. Uw huur hangt af van één persoon. Een wereld-ETF spreidt zijn dividenden over meer dan duizend ondernemingen. **De huur is voorspelbaarder per lijn, het dividend robuuster als geheel.** 5928 5929## 9. De kost die niemand factureert: uw tijd 5930 5931**Neen, verhuurd vastgoed is geen passief inkomen: reken op 20 tot 40 uur per jaar en per pand.** Op 7.000 ⬠netto-inkomen vertegenwoordigen dertig uur aan 30 ⬠per uur 13 % van dat inkomen â ongeveer wat uitbesteed beheer kost. Een ETF-portefeuille vraagt één uur per jaar. 5932 5933Er blijft een post die noch de instapkosten, noch het rendement, noch de fiscaliteit vatten. 5934 5935Huurders zoeken, bezoeken, plaatsbeschrijvingen, jaarlijkse indexatie, betalingsherinneringen, technische interventies, belastingaangifte, EPC-opvolging: in een gewoon jaar verbruikt één verhuurd pand vlot 20 tot 40 uur. Een slecht jaar verbruikt aanzienlijk meer. 5936 5937Die kost verschijnt in geen enkele simulator, ook niet in de onze. Hij maakt vastgoed niet minder rendabel â hij verandert de aard van wat u koopt. **Een huurpand is een actief én een activiteit. Een ETF is enkel een actief.** 5938 5939Eén nuance verdient het toch, omdat ze bijna altijd wordt weggemoffeld in beloftes over automatisering. Van die uren is een deel informatiewerk â een indexatie nakijken, een document terugvinden, een aangifte voorbereiden. Dat deel comprimeert met de juiste tools. Het andere deel niet: een bezoek, een plaatsbeschrijving, een defecte ketel blijven fysiek. **Technologie verschuift de cursor, ze schrapt hem niet.** 5940 5941## 10. Wanneer vastgoed wint, wanneer de beurs wint 5942 5943**Verhuurd vastgoed wint vanaf acht jaar als het krediet onder 3,5 % wordt verkregen en het bruto huurrendement boven 5 % ligt.** De beurs wint onder 100.000 ⬠kapitaal, zonder toegang tot krediet, of bij een horizon korter dan vijf jaar. 5944 5945### Verhuurd vastgoed is de beste keuze als 5946 5947- u een krediet krijgt onder 3,5 % op 20 jaar of langer; 5948- het bruto huurrendement boven 5 % ligt, wat de meeste stadscentra uitsluit; 5949- u minstens 8 jaar aanhoudt, om 15 % instapkosten af te schrijven en het vijfjaarsvenster te verlaten; 5950- het EPC C of beter is, of de prijs de werken al verrekent; 5951- u het beheer aanvaardt, of 7 % van de huur begroot om het uit te besteden. 5952 5953### De beurs is de beste keuze als 5954 5955- uw kapitaal onder 100.000 ⬠ligt: de 15 % instapkosten verpletteren het rendement; 5956- u geen toegang hebt tot krediet, of uw schuldgraad tegen 40 % aanleunt; 5957- uw horizon onzeker is, of de middelen binnen vijf jaar nodig kunnen zijn; 5958- u wereldwijde spreiding verkiest boven concentratie op één pand; 5959- u uw realisaties spreidt om onder de vrijstelling van 10.000 ⬠te blijven. 5960 5961### Allebei, boven 300.000 ⬠vermogen 5962 5963De vraag wordt dan de verdeling in plaats van de keuze. Dat is ook waar de Belgische gereglementeerde vastgoedvennootschappen een blik verdienen: vastgoedblootstelling, beursliquiditeit, geen beheer. Het landschap is geconcentreerd â Aedifica en Cofinimmo fuseerden in maart 2026 â en het fiscaal regime van de uitkeringen moet geval per geval worden nagegaan. 5964 5965## 11. De risico's die geen enkele simulator becijfert 5966 5967**De maximale daling van de MSCI World-index sinds 1987 bedraagt 57,46 %, tegenover minder dan 9 % voor de zwaarste Belgische vastgoedepisode.** Maar vastgoed concentreert zijn risico op één huurder, één gemeente, en een EPC-regelgeving die al tien jaar onafgebroken verstrengt. 5968 5969### 11.1 Aan de vastgoedkant 5970 5971**De huurder.** Wanbetaling wordt beslecht voor het vredegerecht. Reken op 6 tot 12 maanden zonder huur en met proceskosten. 5972 5973**De concentratie.** Eén actief, één gemeente, één marktsegment. Geen spreiding mogelijk onder meerdere panden. 5974 5975**De uitstapkalender.** Een scheiding, een overplaatsing of een liquiditeitsnood kan een verkoop binnen vijf jaar afdwingen, en de 16,5 % activeren die de simulatie als vrijgesteld veronderstelde. 5976 5977**De regelgeving.** Huurprijsregulering, EPC-vereisten, verhuurvergunning: de verplichtingen zijn al tien jaar onafgebroken verstrengd. 5978 5979### 11.2 Aan de beurskant 5980 5981**De omvang van de dalingen.** MSCI publiceert de maximale daling van haar World-index sinds 1987: **57,46 %**, tussen 31 oktober 2007 en 9 maart 2009. Belgisch vastgoed kende nooit iets vergelijkbaars â de zwaarste episode, 1981 tot 1983, komt nominaal cumulatief onder 9 % uit. Een verhouding van één op zes. 5982 5983**Het gedragsrisico, en dat is het voornaamste.** In maart 2009 zag wie sinds oktober 2007 had volgehouden 57 % van zijn kapitaal verdampt. Wie die maand verkocht, nam het verlies. Wie niets deed, had zijn inleg in vier jaar terug en verdrievoudigde ze daarna. 5984 5985Het historische marktrendement wordt enkel geïnd door wie niet verkoopt. Een daling van 40 % doorstaan zonder te capituleren is in de praktijk veel moeilijker dan in theorie. De illiquiditeit van vastgoed is hier een paradoxaal voordeel: men verkoopt geen huis in een opwelling van paniek. 5986 5987**De volgorde van de rendementen.** Twee beleggers met hetzelfde gemiddelde rendement over twintig jaar eindigen met sterk uiteenlopende vermogens, afhankelijk van de volgorde van goede en slechte jaren. 5988 5989**De verborgen concentratie van de indexen.** Op 31 augustus 2026 wegen de **Verenigde Staten 72,14 %** van de 1.280 bestanddelen van de MSCI World-index, de **tien grootste lijnen 26,61 %** en de technologiesector alleen al **29,81 %**. Een kwart van uw
5989« wereld » zit in tien ondernemingen, bijna allemaal Amerikaans. Daarbovenop komt een niet-afgedekt wisselkoersrisico. 5990 5991**De afwezigheid van hefboom.** Geen enkel mechanisme laat een particulier toe zijn inzet twintig jaar lang tegen vaste rente te vermenigvuldigen. 5992 5993## 12. Vastgoed blijft een uitstekende belegging. Op één voorwaarde. 5994 5995**Belgisch vastgoed is een uitstekende belegging voor wie het juiste pand in de juiste gemeente koopt, en een middelmatige voor wie een gemiddelde koopt.** De drempel is niet financieel maar informationeel: waargenomen huurrendement, EPC-label, lokale onroerende voorheffing en marktdiepte bij wederverkoop laten zich nakijken vóór het bod, niet na de akte. 5996 5997Laten we de draad opnemen. Belgisch vastgoed bracht 6,0 % per jaar op over vijftig jaar zonder hefboom, met toegankelijk krediet en, sinds 2026, de enige structureel onbelaste meerwaarde van het Belgische vermogenslandschap. Dat is een opmerkelijk actief. 5998 5999Maar alles wat voorafgaat beschrijft een drempel: 15 % instapkosten af te schrijven, een regionale kloof van 0,9 procentpunt per jaar, EPC-verplichtingen die 40.000 ⬠kunnen kosten, één enkele huurder, een onroerende voorheffing die van gemeente tot gemeente verdubbelt, en twintig tot veertig uur per jaar. 6000 6001**Die drempel is niet financieel. Hij is informationeel** â en informatie is, zoals we net zagen, precies het deel dat zich laat automatiseren. Twee investeerders die hetzelfde appartement voor dezelfde prijs kopen, halen niet hetzelfde rendement. De ene heeft het waargenomen huurrendement in de gemeente nagekeken, het EPC-label, de lokale voorheffing en de diepte van de markt bij wederverkoop. De andere las een advertentie en vertrouwde op een nationaal gemiddelde. 6002 6003Dat is precies het werk dat Arcanes automatiseert. Onze engine kruist de mediaanprijs van de gemeente, het waargenomen huurrendement, de lokale voorheffing en de energetische verplichtingen voor een concreet pand â **vóór het bod in plaats van na de akte**. Het zijn niet onze schattingen: het zijn dezelfde openbare data als in dit artikel, toegepast op één adres. 6004 6005Belgisch vastgoed is een uitstekende belegging voor wie het juiste pand in de juiste gemeente koopt. Het is een middelmatige belegging voor wie een gemiddelde koopt. 6006 6007â **[Een pand analyseren met de data van zijn gemeente](/free-analyse?src=article-immo-bourse)** â eerste analyse gratis 6008â **[Prijzen per gemeente raadplegen](/gemeenten)** 6009 6010## FAQ â Veelgestelde vragen over de afweging vastgoed / beurs 6011 6012### Moet ik in 2026 in vastgoed of in de beurs beleggen in België? 6013 6014Dat hangt af van uw toegang tot krediet en van uw horizon. Verhuurd vastgoed wint doorgaans vanaf acht jaar wanneer u een krediet onder 3,5 % krijgt en het bruto huurrendement boven 5 % ligt. Onder 100.000 ⬠kapitaal of zonder toegang tot krediet is een wereld-ETF efficiënter: de 15 % instapkosten van vastgoed kunnen niet worden afgeschreven. 6015 6016### Hoeveel kosten de instapkosten in vastgoed en op de beurs werkelijk? 6017 6018Ongeveer 15 % van de prijs voor een Belgisch huurpand: 12 % registratierechten in Vlaanderen of 12,5 % in Wallonië en Brussel, plus ongeveer 2,8 % akte- en kredietkosten. Op de beurs ongeveer 0,15 %: een order kost 0 tot 2 ⬠bij een online broker, plus 0,12 % beurstaks. Een verhouding van één op honderd, wat verklaart waarom vastgoed een lange aanhoudperiode vraagt. 6019 6020### Gelden de verlaagde registratierechten voor een verhuurinvestering? 6021 6022Neen. De tarieven van 2 % in Vlaanderen, 3 % in Wallonië en het abattement van 200.000 ⬠in Brussel zijn voorbehouden aan de enige eigen woning, in volle eigendom. Een verhuurinvestering, een tweede verblijf of een aankoop via vennootschap valt onder het standaardtarief: 12 % in Vlaanderen, 12,5 % in Wallonië en Brussel. 6023 6024### Brengt Belgisch vastgoed werkelijk 9 % per jaar op? 6025 6026Neen. Dat cijfer komt uit Franse studies, vaak inclusief hefboom. Op Belgische data steeg de prijs van huizen tussen 1974 en 2024 met ongeveer 6,0 % per jaar nominaal, zonder hefboom, met sterke regionale verschillen: 6,2 % in Vlaanderen tegenover 5,3 % in Wallonië. 6027 6028### Verandert de heffing van 10 % de balans in het voordeel van vastgoed? 6029 6030Ja, maar gedeeltelijk. Zij schrapt de volledige vrijstelling die aandelen genoten, maar de vrijstelling van 10.000 ⬠per jaar neutraliseert de belasting voor de meeste particuliere portefeuilles. De kloof is kleiner geworden, niet omgekeerd. 6031 6032### Welk bruto huurrendement moet men nastreven in België? 6033 6034Minstens 5 % bruto opdat een verhuurinvestering op krediet zichzelf financiert na kosten, onroerende voorheffing en belasting. Onder 4 % is de operatie enkel rendabel als u op de meerwaarde gokt. 6035 6036### Worden ontvangen huurinkomsten belast in België? 6037 6038Ja, maar op een fictieve basis. Bij verhuur aan een particulier voor privégebruik wordt belast op het geïndexeerd kadastraal inkomen verhoogd met 40 %, niet op de werkelijk ontvangen huur â een basis die doorgaans vier tot zes keer lager ligt. Is de huurder een vennootschap of een zelfstandige, dan wordt op de werkelijke huur belast. 6039 6040### Is verhuurd vastgoed een passief inkomen? 6041 6042Neen. Huurders zoeken, bezoeken, plaatsbeschrijvingen, indexatie, betalingsherinneringen, technische interventies en belastingaangifte vragen 20 tot 40 uur per jaar voor één enkel pand. Op een netto-inkomen van 7.000 ⬠komen dertig uur aan 30 ⬠per uur neer op 13 % van dat inkomen. Een ETF-
6042portefeuille vraagt ongeveer één uur per jaar. 6043 6044### Is het beter huur of dividenden te ontvangen in België? 6045 6046Dat hangt af van wat u zoekt. Op uitgekeerd inkomen zijn huurinkomsten duidelijk voordeliger: een Belgisch huurpand brengt 3 tot 6 % bruto op, terwijl een uitkerende wereld-ETF over de laatste twaalf maanden 1,05 % uitkeerde. Bovendien worden huurinkomsten belast op een basis die vaak vier tot zes keer lager ligt dan de werkelijke huur, terwijl dividenden 30 % roerende voorheffing dragen, waardoor het netto inkomen rond 0,7 % uitkomt. 6047 6048### Is een huur zekerder dan een dividend? 6049 6050Ja en neen. Een huur is contractueel en wettelijk geïndexeerd op de gezondheidsindex, terwijl een dividend discretionair is. Maar de huur hangt af van één huurder: betaalt die niet, dan valt het inkomen op nul. De dividenden van een wereld-ETF komen van meer dan duizend ondernemingen. De huur is voorspelbaarder per lijn, het dividend robuuster als geheel. 6051 6052### Kan ik beter in eigen naam of via een vennootschap aanhouden? 6053 6054Dat hangt af van de omvang van uw vermogen. In eigen naam zijn de belasting op het geïndexeerd kadastraal inkomen en de vrijstelling van meerwaarde na vijf jaar zeer gunstig. In een vennootschap zijn kosten en afschrijvingen aftrekbaar, maar de meerwaarde bij verkoop en het uitkeren van liquiditeiten worden belast â en de verlaagde registratierechten gelden nooit. 6055 6056### Is een kapitalisatie-ETF voordeliger dan een distributie-ETF in België? 6057 6058Ja in de meeste gevallen, want hij keert geen dividenden uit en ontsnapt aan de roerende voorheffing van 30 %. Let wel op de beurstaks: 0,12 % voor een niet-ingeschreven kapitalisatie-ETF, tegenover 1,32 % indien wel. Het verschil wordt aanzienlijk bij regelmatige stortingen. 6059 6060### Is een wereld-ETF werkelijk gespreid? 6061 6062Neen, minder dan de naam suggereert. Op 31 augustus 2026 telt de MSCI World-index 1.280 vennootschappen, maar de Verenigde Staten vertegenwoordigen 72,14 %, de tien grootste lijnen 26,61 % en de technologiesector 29,81 %. Een kwart van de blootstelling zit in tien ondernemingen, bijna allemaal Amerikaans. 6063 6064### Na hoeveel jaar wordt een verhuurinvestering rendabel? 6065 6066Tussen 7 en 10 jaar doorgaans. Er moet ongeveer 15 % instapkosten en 3 tot 5 % uitstapkosten worden afgeschreven, samen meer dan twee jaar brutohuur, terwijl ook de drempel van vijf jaar moet worden overschreden. 6067 6068### Moet men kiezen tussen vastgoed en beurs, of beide combineren? 6069 6070Dat hangt af van uw vermogen. Boven 300.000 ⬠is de relevante vraag niet langer « welke » maar « welk aandeel ». Beide activa reageren niet op dezelfde schokken: Belgisch vastgoed daalde begin jaren 1980 terwijl de markten stegen, en in 2008 gebeurde het omgekeerde. 6071 6072### Kan men lenen om in de beurs te beleggen zoals voor vastgoed? 6073 6074Technisch gezien wel, via een lombardkrediet of een margerekening, maar het mechanisme is niet vergelijkbaar: hogere rente, kortere looptijd, en een margeverzoek kan u dwingen te verkopen op het slechtste moment. De lange en stabiele hefboom van het hypothecair krediet heeft geen beursequivalent. 6075 6076--- 6077 6078_Dit artikel werd door Arcanes opgesteld ter informatie en vormt geen gepersonaliseerd financieel, fiscaal of juridisch advies. Voor begeleiding op maat raadpleegt u uw notaris, uw bankier of een erkend financieel adviseur. De cijfers berusten op de gegevens beschikbaar in september 2026 en kunnen evolueren._ 6079`,aO=`--- 6080title: "Real estate investment in Belgium: five illusions that degrade profitability" 6081slug: "investissement-immobilier-belgique-illusions-rentabilite" 6082tag: "Investissement" 6083readTime: "10" 6084publishDate: "November 16, 2025" 6085author: "Arcanes Team" 6086excerpt: "Common pitfalls of rental yield in Belgium. Underestimated charges, rental vacancy, property tax: the real numbers you need to know." 6087image: "/images/blog/illusions-rentabilite.jpg" 6088--- 6089 6090# Real estate investment in Belgium: five illusions that degrade profitability 6091 6092In Belgium, real estate remains the preferred investment for savers. Nearly one in four Belgian households owns real estate outside of their primary residence. Having "a brick in the stomach" (the Belgian idiom for the innate desire to own a home) is not a mythâit is a cultural and generational reality. 6093 6094However, a significant portion of these investors notice, after five years of ownership, a performance lower than projected at the time of purchase. The market is not to blame: Belgian real estate prices have continued to rise, rental demand remains strong in most urban areas, and the sector's fundamentals remain solid. The problem lies upstream, in the initial modeling. Certain assumptions commonly used during the acquisition phaseâsometimes inherited from the low-interest-rate environment of 2020-2021âproduce overly optimistic projections that do not withstand the reality of expenses, taxation, and regulatory obligations. 6095 6096This article identifies the five most frequent illusions and proposes a more robust analysis framework for each. 6097 6098--- 6099 6100## Structural overview 6101 6102Real estate profitability in Belgium rarely degrades because of the market itself, but almost always because of incomplete modeling at the time of acquisition. The gross yield, the most visible indicator, masks layers of costs that transform a seemingly profitable project into a marginal operation. Regional energy obligations, the actual cost of financial leverage after the rise in interest rates, the complexity of rental management, and the confusion between wealth security and net profitability are all parameters that the informed investor integrates from the very first calculationâand that the rushed investor discovers after signing. 6103 6104--- 6105 6106## First illusion: gross yield as a compass 6107 6108Gross yield is the simplest figure to calculate and the most dangerous to use alone. It is obtained by dividing the annual rent by the purchase price, and it is often the first indicator a beginner investor consultsâor that the real estate agent highlights in their sales pitch. 6109 6110The problem is that this figure reflects nothing of the economic reality of an investment. It ignores registration duties (12.5% in Wallonia and Brussels, 12% in Flanders), notary fees, property tax (_précompte immobilier_), non-recoverable co-ownership charges, non-occupant owner insurance, rental vacancy, routine maintenance, and the cost of financing. The gap between gross yield and net-net yieldâwhich integrates all these itemsâis typically between 2 and 3 percentage points in Belgium. A property advertised at a 6% gross yield can end up at a 3.2% net-net yield, or even less if energy compliance renovations are required. 6111 6112The rule of prudence is simple: a gross yield below 5% should trigger a detailed analysis, as the margin between gross and net r
6112isks compressing the actual yield to a level that no longer justifies the risk and the tied-up capital. 6113 6114--- 6115 6116## Second illusion: ignoring the real cost of energy compliance 6117 6118Energy renovation obligations have been significantly strengthened in the three Belgian Regions, and their financial impact on a rental investment is now too important to be treated as a hypothetical future expense. 6119 6120In Flanders, rented residential properties will have to reach a minimum EPC D label by 2030, then C by 2035. Failure to meet these deadlines exposes the owner to fines and, above all, the inability to rent under normal conditions. In Wallonia, the Long-Term Renovation Strategy aims for an entirely A-labeled residential stock by 2050, but binding obligations for the rental stock are not yet formalizedâwhich does not mean they won't come, and the prudent investor has every interest in anticipating them. In Brussels, the regulatory framework is evolving towards minimum energy performance requirements when renting out, following the COBRACE extension. 6121 6122In financial terms, moving from an EPC E or F to a C label represents on average between â¬25,000 and â¬60,000 in work, depending on the property's size, its year of construction, and the condition of the envelope. This amount must be integrated into the calculation of the total acquisition costânot into a vague "renovations to be expected someday" provision. An investor who buys a â¬200,000 property with an F EPC without provisioning â¬40,000 for energy renovation does not own a â¬200,000 property: they own a â¬240,000 property of which â¬40,000 generates no additional rent. 6123 6124--- 6125 6126## Third illusion: financial leverage without stress testing 6127 6128Leverage is one of the historical appeals of real estate investment: borrowing at a lower rate than the property's yield allows you to multiply the return on equity. This mechanism worked remarkably well during the decade of low rates, when it was possible to borrow at 1.5% to invest in a property offering a 3.5% net yield. 6129 6130The context has changed. Belgian mortgage rates now sit around 3 to 3.5% for a twenty-year fixed-rate loan. The gap between the cost of financing and the property's net yield has narrowed considerably, and in some setups, it has disappeared. A property offering a 3% net yield financed at 3.2% generates a structural negative cash flowâwhich is not necessarily a dealbreaker if the investor is banking on long-term capital gains, but which must be anticipated and provisioned for. 6131 6132Basic prudence consists of simulating the project not at the rate obtained, but at a rate increased by 0.5 to 1 pointâa stress test that reveals the fragility or robustness of the financial structure. A project that only holds up with the rate currently proposed by the bank is a project that cannot withstand any unforeseen events. It is also essential to maintain a cash reserve covering six to twelve months of total expensesâmonthly payment, property tax, insurance, maintenance provisionâto absorb a vacancy period or a technical setback without jeopardizing the investment. 6133 6134--- 6135 6136## Fourth illusion: confusing a good location with good profitability 6137 6138Location is unanimously recognized as the primary criterion for real estate investment. This statement is accurate from a wealth preservation standpointâa well-located property is easier to resell and retains its value betterâbut it can be misleading when it comes to net rental profitability. 6139 6140Central and highly sought-after areas in major Belgian citiesâthe Pentagon in Brussels, downtown Antwerp, premium neighborhoods in Ghent or Leuvenâoffer constant rental demand and high liquidity upon resale. In return, purchase prices are such that the net-net yield often sits between 2 and 3%, sometimes lower when co-ownership charges and energy compliance obligations are factored
6140in. 6141 6142Conversely, some suburban areas or mid-sized citiesâMons, Namur, Kortrijk, Mechelenâshow significantly higher net yields, around 4 to 5.5%, but with lower liquidity and rental demand more sensitive to economic cycles. The higher profitability compensates for a higher risk of vacancy and a more modest potential capital gain. 6143 6144The clear-sighted investor does not choose between a good location and a good yield: they identify the balance that matches their strategy. A long-term wealth appreciation goal points towards premium areas. An immediate cash flow goal points towards high-yield areas. Both approaches are valid, provided the choice is conscious and quantified. 6145 6146--- 6147 6148## Fifth illusion: underestimating the management burden 6149 6150A real estate property is not a passive investment. It requires continuous management that includes finding tenants, drafting leases, handling move-in/move-out inspections, tracking payments, dealing with the co-ownership syndicate, coordinating maintenance work, monitoring legal and regulatory obligations, and managing unpaid rent or disputes. 6151 6152An investor who manages one or two properties themselves can absorb this burden without apparent cost. But the time spent on management represents a real opportunity costâhours that are not invested in their main professional activity, scouting for new properties, or simply their personal life. 6153 6154When management is outsourced to a rental management agency, the cost in Belgium is between 5 and 8% of the collected rents, excluding VAT. This percentage must be integrated into the yield calculation, and not considered an optional extra. The relevant question is not whether you can manage it yourself, but whether the investment remains coherent even with complete outsourcing. If the answer is no, the property's actual profitability depends on an assumption of free labor that is neither sustainable nor scalable. 6155 6156--- 6157 6158## Conclusion 6159 6160Real estate investment in Belgium remains a relevant wealth-building lever for those willing to model reality rather than hope. The five illusions described in this article are not traps set by the market: they are blind spots in the initial analysis that a rigorous investor can eliminate before signing the sales agreement. 6161 6162A solid project is not recognized by its advertised gross yield, but by its overall financial coherence over time. A property that remains viable after integrating all costsâacquisition, compliance, financing, management, vacancyâand that withstands a degraded scenario is a property that deserves its place in a portfolio. 6163 6164--- 6165 6166## Arcanes Integration 6167 6168Arcanes automatically calculates the gross, net, and net-net yield of each anal
6168yzed property by integrating regional registration duties, property tax, co-ownership charges, estimated rental vacancy, financing costs, and the projected energy compliance budget. The goal is to show the actual profitability from the very first analysis, not the one that sells dreams on a simplified spreadsheet. 6169 6170--- 6171 6172## Frequently Asked Questions 6173 6174### Why does gross yield give a false impression of profitability? 6175 6176Because it only takes two variables into accountâthe rent and the purchase priceâignoring all the charges that erode the actual yield. In Belgium, the gap between the gross yield and the net-net yield typically sits between 2 and 3 percentage points, which can transform a seemingly comfortable investment into a marginal operation. 6177 6178### Does a negative cash flow mean a bad investment? 6179 6180Not necessarily. A slightly negative cash flow can be acceptable in a long-term wealth appreciation strategy, provided it is anticipated, provisioned for, and compatible with the investor's financial capacity. However, an unforeseen negative cash flow that forces you to dip into savings every month is a serious red flag. 6181 6182### Is a central location always the best performing? 6183 6184It generally offers better liquidity and greater wealth security, but not necessarily the best net yield. Premium areas in large Belgian cities often show net-net yields of 2 to 3%, while some mid-sized cities offer 4 to 5.5% with a different risk profile. The choice depends on the investor's strategy. 6185 6186### How do you anticipate the cost of energy compliance? 6187 6188By estimating the work needed to reach the EPC label required by the relevant Region within the given timeframe. Moving from an E or F label to a C label costs on average between â¬25,000 and â¬60,000 in Belgium. This amount must be added to the acquisition price in the profitability calculation, not deferred as a future expense. 6189 6190### Is financial leverage still interesting in the current context? 6191 6192It remains relevant, but with tighter margins than during periods of low interest rates. With mortgage rates around 3 to 3.5%, the gap with the property's net yield is often reduced. A stress test at a rate increased by 0.5 to 1 point and a cash reserve of six to twelve months of expenses are the minimum conditions for using leverage responsibly. 6193`,iO=`--- 6194title: "Investissement immobilier en Belgique : cinq illusions qui dégradent la rentabilité" 6195slug: "investissement-immobilier-belgique-illusions-rentabilite" 6196tag: "Investissement" 6197readTime: "10" 6198publishDate: "16 novembre 2025" 6199author: "Ãquipe Arcanes" 6200excerpt: "Les pièges courants du rendement locatif en Belgique. Charges sous-estimées, vacance locative, précompte immobilier : les vrais chiffres à connaître." 6201image: "/images/blog/real-estate-investment-strategy-belgium.jpg" 6202--- 6203 6204# Investissement immobilier en Belgique : cinq illusions qui dégradent la rentabilité 6205 6206En Belgique, l'immobilier reste le placement préféré des épargnants. Près d'un ménage belge sur quatre détient un bien immobilier en dehors de sa résidence principale. La brique dans le ventre n'est pas un mythe â c'est une réalité culturelle et patrimoniale qui traverse les générations. 6207 6208Pourtant, une partie significative de ces investisseurs constate, après cinq ans de détention, une performance inférieure à celle projetée au moment de l'achat. Le marché n'est pas en cause : les prix immobiliers belges ont continué à progresser, la demande locative reste soutenue dans la plupart des zones urbaines, et les fondamentaux du secteur demeurent solides. Le problème se situe en amont, dans la modélisation initiale. Certaines hypothèses couramment utilisées en phase d'acquisition â parfois héritées du contexte de taux bas de 2020-2021 â produisent des projections trop optimistes qui ne résistent pas à la réalité des charges, de la fiscalité et des obligations réglementaires. 6209 6210Cet article identifie les cinq illusions les plus fréquentes et propose, pour chacune, un cadre d'analyse plus robuste. 6211 6212--- 6213 6214## Synthèse structurante 6215 6216La rentabilité immobilière en Belgique se dégrade rarement à cause du marché lui-même, mais presque toujours à cause d'une modélisation incomplète au moment de l'acquisition. Le rendement brut, indicateur le plus visible, masque des couches de coûts qui transforment un projet apparemment rentable en opération marginale. Les obligations énergétiques régionales, le coût réel du levier financier après la remontée des taux, la complexité de la gestion locative et la confusion entre sécurité patrimoniale et rentabilité nette sont autant de paramètres que l'investisseur avert
6216i intègre dès le premier calcul â et que l'investisseur pressé découvre après la signature. 6217 6218--- 6219 6220## Première illusion : le rendement brut comme boussole 6221 6222Le rendement brut est le chiffre le plus simple à calculer et le plus dangereux à utiliser seul. Il s'obtient en divisant le loyer annuel par le prix d'achat, et c'est souvent le premier indicateur qu'un investisseur débutant consulte â ou que l'agent immobilier met en avant dans son argumentaire commercial. 6223 6224Le problème est que ce chiffre ne reflète rien de la réalité économique d'un investissement. Il ignore les droits d'enregistrement (12,5 % en Wallonie et Bruxelles, 12 % en Flandre), les frais de notaire, le précompte immobilier, les charges de copropriété non récupérables, l'assurance propriétaire non occupant, la vacance locative, l'entretien courant et le coût du financement. L'écart entre le rendement brut et le rendement net-net â celui qui intègre l'ensemble de ces postes â se situe typiquement entre 2 et 3 points de pourcentage en Belgique. Un bien affiché à 6 % de rendement brut peut se retrouver à 3,2 % en rendement net-net, voire moins si des travaux de mise en conformité énergétique sont nécessaires. 6225 6226La règle de prudence est simple : un rendement brut inférieur à 5 % doit déclencher une analyse détaillée, car la marge entre le brut et le net risque de comprimer le rendement réel à un niveau qui ne justifie plus le risque et l'immobilisation de capital. 6227 6228--- 6229 6230## Deuxième illusion : ignorer le coût réel de la conformité énergétique 6231 6232Les obligations de rénovation énergétique se sont considérablement renforcées dans les trois Régions belges, et leur impact financier sur un investissement locatif est désormais trop important pour être traité comme une dépense future hypothétique. 6233 6234En Flandre, les biens résidentiels loués devront atteindre un label EPC D minimum d'ici 2030, puis C d'ici 2035. Le non-respect de ces échéances expose le propriétaire à des sanctions et, surtout, à une impossibilité de louer dans des conditions normales. En Wallonie, la Stratégie de rénovation à long terme vise un parc résidentiel entièrement au label A à l'horizon 2050, mais les obligations contraignantes pour le parc locatif ne sont pas encore formalisées â ce qui ne signifie pas qu'elles ne viendront pas, et l'investisseur prudent a tout intérêt à les anticiper. à Bruxelles, le cadre réglementaire évolue vers des exigences minimales de performance énergétique lors de la mise en location, dans le prolongement du COBRACE. 6235 6236En termes financiers, le passage d'un EPC E ou F à un label C représente en moyenne entre 25 000 et 60 000 euros de travaux selon la taille du bien, son année de construction et l'état de l'enveloppe. Ce montant doit être intégré dans le calcul du coût total d'acquisition â pas dans une vague provision "travaux à prévoir un jour". Un investisseur qui achète un bien à 200 000 euros avec un EPC F sans provisionner 40 000 euros de rénovation énergétique ne possède pas un bien à 200 000 euros : il possède un bien à 240 000 euros dont 40 000 ne génèrent aucun loyer supplémentaire. 6237 6238--- 6239 6240## Troisième illusion : le levier financier sans stress-test 6241 6242L'effet de levier est l'un des attraits historiques de l'investissement immobilier : emprunter à un taux inférieur au rendement du bien permet de démultiplier la rentabilité des fonds propres. Ce mécanisme a fonctionné remarquablement bien pendant la décennie de taux bas, lorsqu'il était possible d'emprunter à 1,5 % pour investir dans un bien offrant un rendement net de 3,5 %. 6243 6244Le contexte a changé. Les taux hypothécaires belges se situent désormais autour de 3 à 3,5 % pour un crédit à taux fixe sur vingt ans. L'écart entre le coût du financement et le rendement net du bien s'est considérablement réduit, et dans certaines configurations, il a disparu. Un bien offrant un rendement net de 3 % financé à 3,2 % génère un cash-flow négatif structurel â ce qui n'est pas nécessairement rédhibitoire si l'investisseur mise sur la plus-value à long terme, mais qui doit être anticipé et provisionné. 6245 6246La prudence élémentaire consiste à simuler le projet non pas au taux obtenu, mais à un taux majoré de 0,5 à 1 point â un stress-test qui révèle la fragilité ou la robustesse du montage. Un projet qui ne tient qu'avec le taux actuellement proposé par la banque est un projet qui ne supporte aucun aléa. Il est également indispensable de maintenir une réserve de trésorerie couvrant six à douze mois de charges totales â mensualité, précompte, assurance, provision entretien â pour absorber une période de vacance ou un imprévu technique sans mettre l'investissement en péril. 6247 6248--- 6249 6250## Quatrième illusion : confondre bon emplacement et bonne rentabilité 6251 6252L'emplacement est unanimement reconnu comme le premier critère de l'investissement immobilier. Cette affirmation est exacte sur le plan patrimonial â un bien bien situé se revend plus facilement et conserve mieux sa valeur â mais elle peut être trompeuse sur le plan de la rentabilité locative nette. 6253
6254Les zones centrales et prisées des grandes villes belges â le Pentagone à Bruxelles, le centre d'Anvers, les quartiers premium de Gand ou Louvain â offrent une demande locative constante et une liquidité élevée en cas de revente. En contrepartie, les prix d'acquisition y sont tels que le rendement net-net se situe souvent entre 2 et 3 %, parfois en dessous lorsque les charges de copropriété et les obligations de conformité énergétique sont intégrées. 6255 6256à l'inverse, certaines zones périurbaines ou villes de taille moyenne â Mons, Namur, Courtrai, Malines â affichent des rendements nets nettement supérieurs, de l'ordre de 4 à 5,5 %, mais avec une liquidité moindre et une demande locative plus sensible aux cycles économiques. La rentabilité supérieure compense un risque plus élevé de vacance et une plus-value potentielle plus modeste. 6257 6258L'investisseur lucide ne choisit pas entre un bon emplacement et un bon rendement : il identifie l'équilibre qui correspond à sa stratégie. Un objectif de valorisation patrimoniale à long terme oriente vers les zones premium. Un objectif de cash-flow immédiat oriente vers les zones à rendement élevé. Les deux approches sont valides, à condition que le choix soit conscient et chiffré. 6259 6260--- 6261 6262## Cinquième illusion : sous-estimer la charge de gestion 6263 6264Un bien immobilier n'est pas un placement passif. Il exige une gestion continue qui inclut la recherche de locataires, la rédaction des baux, l'état des lieux, le suivi des paiements, la relation avec le syndic en copropriété, la coordination des travaux d'entretien, le suivi des obligations légales et réglementaires, et la gestion des impayés ou des litiges. 6265 6266Un investisseur qui gère lui-même un ou deux biens peut absorber cette charge sans coût apparent. Mais le temps consacré à la gestion représente un coût d'opportunité réel â des heures qui ne sont pas investies dans l'activité professionnelle principale, la prospection de nouveaux biens ou tout simplement la vie personnelle. 6267 6268Lorsque la gestion est externalisée auprès d'une agence de gestion locative, le coût se situe en Belgique entre 5 et 8 % des loyers encaissés, hors TVA. Ce pourcentage doit être intégré dans le calcul de rendement, et non considéré comme une option facultative. La question pertinente n'est pas de savoir si l'on peut gérer soi-même, mais si l'investissement reste cohérent même avec un niveau d'externalisation complet. Si la réponse est non, la rentabilité réelle du bien dépend d'une hypothèse de travail gratuit qui n'est ni durable ni scalable. 6269 6270--- 6271 6272## Conclusion 6273 6274L'investissement immobilier en Belgique reste un levier patrimonial pertinent pour qui accepte de modéliser la réalité plutôt que l'espérance. Les cinq illusions décrites dans cet article ne sont pas des pièges tendus par le marché : ce sont des angles morts dans l'analyse initiale que l'investisseur rigoureux peut éliminer avant la signature du compromis. 6275 6276Un projet solide ne se reconnaît pas à son rendement brut affiché, mais à sa cohérence financière globale dans le temps. Un bien qui reste viable après intégration de tous les coûts â acquisition, conformité, financement, gestion, vacance â et qui résiste à un scé
6276nario dégradé est un bien qui mérite sa place dans un patrimoine. 6277 6278--- 6279 6280## Intégration Arcanes 6281 6282Arcanes calcule automatiquement le rendement brut, net et net-net de chaque bien analysé en intégrant les droits d'enregistrement régionaux, le précompte immobilier, les charges de copropriété, la vacance locative estimée, le coût de financement et la projection du budget de conformité énergétique. L'objectif est de montrer la rentabilité réelle dès la première analyse, pas celle qui fait rêver sur une feuille de calcul simplifiée. 6283 6284--- 6285 6286## Questions fréquentes 6287 6288### Pourquoi le rendement brut donne-t-il une fausse impression de rentabilité ? 6289 6290Parce qu'il ne tient compte que de deux variables â le loyer et le prix d'achat â en ignorant toutes les charges qui érodent le rendement réel. En Belgique, l'écart entre le rendement brut et le rendement net-net se situe typiquement entre 2 et 3 points de pourcentage, ce qui peut transformer un investissement apparemment confortable en opération marginale. 6291 6292### Un cash-flow négatif signifie-t-il un mauvais investissement ? 6293 6294Pas nécessairement. Un cash-flow légèrement négatif peut être acceptable dans une stratégie de valorisation patrimoniale à long terme, à condition qu'il soit anticipé, provisionné et compatible avec la capacité financière de l'investisseur. En revanche, un cash-flow négatif non prévu qui oblige à puiser dans l'épargne chaque mois est un signal d'alerte sérieux. 6295 6296### L'emplacement central est-il toujours le plus performant ? 6297 6298Il offre généralement une meilleure liquidité et une plus grande sécurité patrimoniale, mais pas nécessairement le meilleur rendement net. Les zones premium des grandes villes belges affichent souvent des rendements nets-nets de 2 à 3 %, tandis que certaines villes moyennes offrent 4 à 5,5 % avec un profil de risque différent. Le choix dépend de la stratégie de l'investisseur. 6299 6300### Comment anticiper le coût de la conformité énergétique ? 6301 6302En estimant les travaux nécessaires pour atteindre le label EPC exigé par la Région concernée dans les délais impartis. Le passage d'un label E ou F à un label C coûte en moyenne entre 25 000 et 60 000 euros en Belgique. Ce montant doit être ajouté au prix d'acquisition dans le calcul de rentabilité, pas reporté comme une dépense future. 6303 6304### L'effet de levier est-il encore intéressant dans le contexte actuel ? 6305 6306Il reste pertinent, mais avec des marges plus serrées qu'en période de taux bas. Avec des taux hypothécaires autour de 3 à 3,5 %, l'écart avec le rendement net du bien est souvent réduit. Un stress-test à taux majoré de 0,5 à 1 point et une réserve de trésorerie de six à douze mois de charges sont les conditions minimales pour utiliser le levier de manière responsable. 6307`,sO=`--- 6308title: "Vastgoedinvestering in België: vijf illusies die het rendement aantasten en hoe ze te anticiperen" 6309slug: "vastgoedinvestering-belgie-illusies-rendement" 6310tag: "Investering" 6311readTime: "10" 6312publishDate: "2025-11-16" 6313author: "Team Arcanes" 6314excerpt: "De valkuilen van huurrendement in België. Onderschatte kosten, leegstand, onroerende voorheffing: de echte cijfers die u moet kennen." 6315image: "/images/blog/real-estate-investment-strategy-belgium.jpg" 6316--- 6317 6318# Vastgoedinvestering in België: vijf illusies die het rendement aantasten en hoe ze te anticiperen 6319 6320In België stelt een aanzienlijk deel van de residentiële investeerders na meerdere jaren bezit een prestatie vast die lager ligt dan de oorspronkelijke projectie. Het gaat niet om een structureel gebrek van de markt noch om een desinteresse voor vastgoed, maar om een onvolledige modellering op het moment van de aankoop. De gegevens van de Federatie van Notarissen bevestigen dat de transactievolumes op peil blijven, wat erop wijst dat de markt aantrekkelijk blijft, maar dat de selectie en analyse van panden de werkelijke prestatie veel meer bepalen dan de algemene context. 6321 6322Meerdere hypotheses die gangbaar waren in 2020-2021 zijn vandaag minder betrouwbaar in de context van 2024-2025. De financieringskosten zijn gestegen, de energetische regelgeving is ver
6322strengd in de drie Gewesten, de fiscale onzekerheden blijven bestaan en de huurdynamiek verschilt sterk per zone. De advertenties op Immoweb, Zimmo en Immovlan vermelden brutorendementen die, afzonderlijk beschouwd, een niet-geïnformeerde koper op het verkeerde been kunnen zetten. Het begrijpen van de meest voorkomende illusies maakt het mogelijk een meer robuuste analyse te structureren, gebaseerd op volledige en geactualiseerde parameters. 6323 6324--- 6325 6326## Structurerende synthese 6327 6328Vijf terugkerende vertekeningen tasten het rendement van residentiële huurinvesteringen in België aan: de verwarring tussen brutorendement en werkelijk rendement, de onderschatting van de kosten voor energetische conformiteit, het ontbreken van een stresstest op de financiering, een te simplistische lezing van de locatie en de verwaarlozing van de beheerlast. Deze illusies stellen de relevantie van vastgoedinvestering niet ter discussie, maar verklaren waarom een ogenschijnlijk solide project na vijf tot tien jaar een netto-nettorendement kan opleveren dat twee tot drie punten lager ligt dan de oorspronkelijke projectie. De correctie van deze vertekeningen berust op een volledige modellering die de gewestelijke instapkosten, de regelgevende verplichtingen, de rentescenario's en de werkelijke operationele lasten integreert. 6329 6330--- 6331 6332## Het brutorendement als voornaamste referentiekader, eerste bron van fouten 6333 6334Het brutorendement, verkregen door de jaarlijkse huur te delen door de aankoopprijs, maakt een eerste snelle voorselectie van kansen mogelijk maar vertegenwoordigt geenszins het werkelijke rendement van het project. Deze vereenvoudigde berekening houdt geen rekening met de verwervingskosten, die de gewestelijke registratierechten van zes tot twaalf komma vijf procent omvatten afhankelijk van het Gewest en de situatie van de koper, noch met de notariskosten, het lopend onderhoud, de kosten voor conformiteit, de fiscaliteit verbonden aan de onroerende voorheffing, de leegstand of de gekozen financieringswijze. Een brutorendement van vijf procent aangekondigd op een portaal als Immoweb kan zich zo omvormen tot een netto-nettorendement tussen één komma vijf en drie procent zodra al deze parameters zijn geïntegreerd. 6335 6336Een brutorendement onder de vijf procent moet systematisch het voorwerp uitmaken van een gedetailleerde analyse vóór elke beslissing, want het risico op een negatief nettorendement wordt significant onder deze drempel. Het verschil is des te groter naarmate het pand werken vereist of zich in een zone met hoge leegstand bevindt. De Federatie van Notarissen en de FOD Financiën publiceren regelmatig gegevens over transactieprijzen en bijbehorende kosten die het mogelijk maken deze berekeningen nauwkeurig te kalibreren per locatie van het pand. 6337 6338--- 6339 6340## De energetische regelgeving, een kost die vaak te laat wordt ontdekt 6341 6342De energetische verplichtingen zijn verstrengd in de drie Belgische Gewesten volgens onderscheiden kalenders en eisen. Vlaanderen legt een minimum van klasse D op tegen 2030, Wallonië mikt op klasse E voor dezelfde horizon, en het Brussels Hoofdstedelijk Gewest richt zich op klasse E tegen 2033. Volgens de gegevens van StatBel bevindt meer dan de helft van het Belgische residentiële vastgoedpark zich in de klassen E, F of G, wat betekent dat een meerderheid van de beschikbare panden op de markt blootgesteld is aan conformiteitswerken. Deze verplichtingen bepalen geleidelijk het vermogen tot verhuring en beïnvloeden rechtstreeks de liquiditeit van het pand bij doorverkoop. 6343 6344De kost van deze werken, die meerdere tienduizenden euro's kan bedragen voor een verbetering van twee EPC-klassen, moet vóór de aankoop worden geschat en geïntegreerd in de berekening van de totale projectkost. De investeerder die deze schatting uitstelt naar een toekomstige hypothese stelt zich bloot aan een niet-geanticipeerde verslechtering van zijn rendabiliteit. De frequente fout bestaat erin het EPC als een secundair administratief gegeven te beschouwen, terwijl het een structurerende financiële parameter vormt die zowel de exploitatielasten, de doorverkoopwaarde als het verhuringsvermogen van het pand beïnvloedt. 6345 6346--- 6347 6348## Het gebruik van financiële hefboomwerking zonder stresstest, een onderschat risico 6349 6350De hefboomwerking kan het patrimoniaal rendement van een huurinvestering verbeteren door de investeerder in staat te stellen een kapitaal in te zetten dat hoger is dan zijn eigen middelen, maar ze verhoogt ook de blootstelling aan renteschommelingen, aan het risico op leegstand en aan technische onvoorziene omstandigheden. Sinds de rentestijging die in 2022 begon en de evolutie van de Belgische bankcriteria vereisen de financieringsvoorwaarden een voorzichtiger modellering dan die welke gold in de omgeving van lage rentes. Een rigoureuze analyse omvat een simulatie aan een rente die minstens één punt hoger ligt dan de effectief verkregen rente, de aanleg van een kasreserve die zes tot twaalf maanden totale lasten dekt, en een evaluatie van de stabiliteit van de huurinkomsten in de beoogde zone. Een project kan relevant blijven zelfs met een licht negatieve cashflow, op voorwaarde dat dit tekort geanticipeerd, beheerst en coherent is met een bezitshorizon van meer dan tien jaar. 6351 6352De investeerder die zijn project uitsluitend modelleert op basis van de rente verkregen op de dag van ondertekening stelt zich bloot aan een financieel onevenwicht bij ongunstige herfinanciering of bij een verlengde leegstandperiode. De Belgische banken integreren zelf veiligheidsmarges in hun solvabiliteitsanalyses, wat een signaal vormt dat de investeerder in zijn eigen modellering zou moeten reproduceren. De voorzichtigheid gebiedt de financiële levensvatbaarheid van het project te testen in minstens twee onderscheiden rentescenario's alvorens zich te engageren. 6353 6354--- 6355 6356## De locatie uitsluitend geïnterpreteerd als veiligheidsfactor 6357 6358De locatie blijft een bepalend element van elke vastgoedinvestering, maar de lezing ervan kan niet worden beperkt tot een simplistische vergelijking tussen stadscentrum en periferie. Twee analyse-assen moeten worden onderscheiden: de patr
6358imoniale zekerheid, die de waarschijnlijke liquiditeit van het pand bij doorverkoop en de stabiliteit van de huurvraag omvat, en de nettorendabiliteit na lasten en regelgevende beperkingen. Bepaalde centrale of als premium beschouwde zones in de grote Belgische steden verzekeren een constante huurvraag maar vertonen vaak een lager netto-nettorendement door een hoge aankoopprijs en belangrijke mede-eigendomslasten. 6359 6360Omgekeerd vertonen perifere zones of secundaire steden in Wallonië of Vlaanderen soms een hogere huurprestatie, maar vereisen ze een aandachtige analyse van de fundamentals van de langetermijnvraag, de demografische evolutie en de bereikbaarheid per openbaar vervoer. De ervaren investeerder evalueert de locatie niet als een garantie maar als een parameter die moet worden gewogen tegen de instapprijs, de waarderingsperspectieven en de diepte van de lokale huurmarkt. De gemeentelijke gegevens beschikbaar bij StatBel en de prijsstatistieken van de Federatie van Notarissen maken het mogelijk deze analyse te objectiveren voorbij subjectieve percepties. 6361 6362--- 6363 6364## De onderschatte beheerlast, een onzichtbare kost die de prestatie uitholt 6365 6366Een residentieel huurpand vereist een doorlopend beheer, ongeacht of dit geïnternaliseerd wordt of aan een professional wordt toevertrouwd, met inbegrip van de opvolging van huurders, de relatie met de syndicus in mede-eigendom, het preventief en curatief onderhoud, de voorbereiding van werken, het administratief beheer van de huurcontracten en de naleving van de regelgevende verplichtingen die in elk Gewest evolueren. Wanneer het beheer wordt uitbesteed, vertegenwoordigt de kost doorgaans vijf tot acht procent van de jaarlijkse huur, een bedrag dat moet worden geïntegreerd in de berekening van het nettorendement. Wanneer het beheer geïnternaliseerd wordt, neigt de investeerder ertoe de werkelijke kost ervan te onderschatten in termen van tijd, beschikbaarheid en opportuniteitskost. De pertinente vraag is niet of de investeerder alles zelf kan beheren, maar of het project financieel coherent blijft zelfs met een hoog niveau van uitbesteding. 6367 6368Een investering waarvan de rendabiliteit volledig afhangt van het feit dat de eigenaar gratis alle beheerstaken op zich neemt, berust op een fragiele hypothese, aangezien persoonlijke, professionele of gezondheidsgebonden onvoorziene omstandigheden op elk moment dit beheersvermogen kunnen wijzigen. De voorzichtigheid gebiedt de levensvatbaarheid van het project te testen met inbegrip van een externe beheerkost, zelfs als de investeerder oorspronkelijk van plan is het pand zelf te beheren. Deze aanpak onthult de werkelijke veiligheidsmarge van het project en maakt het mogelijk de nodige aanpassingen te anticiperen bij een wijziging van de situatie. 6369 6370--- 6371 6372## Conclusie 6373 6374Residentiële vastgoedinvestering kan een pertinente strategie vormen om op lange termijn een vermogen op te bouwen in België, maar de werkelijke prestatie hangt minder af van het aangekondigde brutorendement dan van de nauwkeurigheid van de initiële modellering. De vijf geïdentificeerde illusies zijn geen fataliteiten maar corrigeerbare vertekeningen, op voorwaarde dat de werkelijke instapkosten, de energetische conformiteit, de financieringsscenario's, de genuanceerde lezing van de locatie en de beheerlast systematisch in de analyse worden geïntegreerd. Een solide project onderscheidt zich door de globale financiële coherentie van zijn modellering in de tijd, met meerdere geteste scenario's, eerder dan door een geruststellend maar partieel brutorendementcijfer. 6375 6376--- 6377 6378## Arcanes Integratie 6379 6380Arcanes modelleert elk project door automatisch de gewestelijke verwervingskosten, de geschatte EPC-conformiteitskosten, de financieringssimulaties met stresstest, de beheerlasten en de projectie van het netto-nettorendement over de gekozen bezitsduur te integreren. Het rapport maakt het mogelijk meerdere scenario's te vergelijken en de kwetsbaarheidspunten vóór de aankoop te identificeren. 6381 6382--- 6383 6384## Veelgestelde vragen 6385 6386### Waarom kan het brutorendement een vals beeld van prestatie geven? 6387 6388Het brutorendement houdt geen rekening met de exploitatielasten, de conformiteitswerken, de lokale fiscaliteit, de leegstand of de financieringswijze. Het vormt een nuttige voorselectie-indicator maar laat geenszins toe een conclusie te trekken over de werkelijke rendabiliteit van een project. Het verschil tussen brutorendement en netto-nettorendement bedraagt in België frequent twee tot drie procentpunten. 6389 6390### Betekent een negatieve cashflow noodzakelijk een slechte investering? 6391
6392Een licht negatieve cashflow kan aanvaardbaar zijn in het kader van een patrimoniale langetermijnstrategie, op voorwaarde dat ze geanticipeerd, beperkt in de tijd en gecompenseerd is door een realistische toekomstige waardevermeerdering of een locatie met sterke huurvraag. De investeerder moet echter over de nodige financiële capaciteit beschikken om dit tekort op te vangen zonder zijn persoonlijke stabiliteit in gevaar te brengen. 6393 6394### Is een centraal gelegen locatie altijd het meest performant voor een huurinvestering? 6395 6396Een centrale locatie biedt doorgaans een betere liquiditeit en een stabielere huurvraag, maar het nettorendement kan lager zijn door een hoge aankoopprijs en belangrijke mede-eigendomslasten. Bepaalde perifere zones of secundaire steden vertonen hogere huurprestaties, mits een rigoureuze analyse van de fundamentals van de lokale vraag en de demografische dynamiek. 6397 6398### Hoe kunnen de kosten voor energetische conformiteit vóór de aankoop worden geanticipeerd? 6399 6400De investeerder moet de geschatte werkkosten integreren in de berekening van de maximale aankoopprijs, rekening houdend met de regelgevende termijnen eigen aan elk Gewest. De barema's per vierkante meter voor isolatie, vervanging van raamkozijnen en opwaardering van de verwarming maken een realistische schatting mogelijk, te confronteren met het EPC-certificaat van het beoogde pand. 6401 6402### Blijft financiële hefboomwerking relevant in de huidige context van hoge rentes? 6403 6404De hefboomwerking blijft een relevant instrument op voorwaarde dat het met voorzichtigheid wordt ingezet en onder verschillende rentescenario's wordt getest. De investeerder moet een rente simuleren die minstens één punt hoger ligt dan de verkregen rente, een voldoende kasreserve aanleggen en verifiëren dat het project levensvatbaar blijft zelfs in een ongunstig scenario van verlengde leegstand of stijgende lasten. 6405`,oO=`--- 6406title: "Rental yield in Belgium: the truth behind the numbers no one shows you" 6407slug: "rendement-locatif-reel" 6408tag: "Investissement" 6409readTime: "10" 6410publishDate: "January 25, 2026" 6411author: "Arcanes Team" 6412excerpt: "An advertised yield of 4% often becomes 1.5 to 2% once expenses and risks are factored
6412in. Understand real profitability before investing." 6413image: "/images/blog/rendement-locatif.jpg" 6414--- 6415 6416# Rental yield in Belgium: the truth behind the numbers no one shows you 6417 6418Residential rental investment is perceived as a stable wealth-building strategy, capable of generating regular income and protecting savings against inflation. Portals like Immoweb, Zimmo, and Immovlan are full of listings accompanied by an advertised gross yield, sometimes highlighted as a main selling point. However, the majority of these reported calculations are based on incomplete assumptions. This gross figure provides a screening indication but in no way reflects actual performance, as it ignores a whole set of costs and risks inherent in operating the property. 6419 6420The gap between the theoretical yield and the yield actually collected can be significantâaround two to three percentage points in many cases. This doesn't undermine the value of rental investment in Belgium, but it does require a more comprehensive and coherent methodology to evaluate its relevance. Data from the Federation of Notaries and the FPS Finance (Federal Public Service Finance) allow us to reconstruct an accurate picture of real costs, provided they are systematically integrated into the analysis. 6421 6422The goal is to provide a reading grid applicable to any Belgian residential rental project, regardless of the Region, by clearly distinguishing what the gross yield promises from what the net-net yield actually delivers. 6423 6424--- 6425 6426## Structural overview 6427 6428Gross yield, used as the primary indicator by most beginner investors, systematically overestimates the actual performance of a residential rental property in Belgium. Entry costs, which include regional registration duties, notary fees, and potential renovation work, add between fifteen and twenty-five percent to the advertised purchase price. Incompressible annual charges, including property tax (_précompte immobilier_), insurance, and routine maintenance, further reduce the effective yield. A property advertised with a five percent gross yield frequently produces a net yield between one point five and three percent, depending on the location, the condition of the property, and the financing method. Rental profitability is measured over a complete holding cycle, generally ten to fifteen years, and not by a simplified annual ratio. 6429 6430If you are considering a first rental investment, our [complete guide to buying real estate in Belgium in 2026](/blog/buying-real-estate-belgium-2026) details entry costs by region, taxation, and financing stepsâthree dimensions that directly affect your actual yield. 6431 6432--- 6433 6434## Why rental yields are frequently overestimated 6435 6436Gross yield is calculated by dividing the annual rent by the purchase price of the property. It primarily serves as a quick indicator to compare properties or geographical areas. A â¬200,000 apartment rented out for â¬900 a month produces a 5.4 percent gross yield. This figure, often echoed in listings and press articles, gives an impression of performance that does not hold up to detailed scrutiny. 6437 6438Gross yield accounts for neither entry costs, nor operating costs, nor rental hazards, nor the effect of financing. Comparing this yield to that of a savings account or a bond can create a biased perception, because the former is a theoretical indicator while the latter represents a yield that can actually be collected. An investor who bases their decision solely on gross yield is exposing themselves to a measurable financial disillusionment over the holding period. 6439 6440--- 6441 6442## Three levels of yield you must distinguish 6443 6444A correct analysis of rental profitability involves evaluating three successive levels, each bringing an additional degree of precision. Gross yield, the first level, divides the annual rent by the purchase price. It is useful for quickly filtering opportunities on the market but insufficient to conclude anything about a project's viability. 6445 6446Net yield, the second level, integrates actual entry costs and recurring annual charges into the calculation. It represents the economic profitability of the property, independent of the financing method. It is the first indicator that reflects operational reality rather than a theoretical promise. 6447 6448Net-net yield constitutes the third and final level. It integrates financing, personal taxation, monthly cash flow, and cash flow effects. It is the only truly personal and real indicator, as it depends on the specific situation of each investor. In Belgian practice, a five percent gross yield regularly turns into a net-net yield of between one point five and three percent, depending on the location, the property's condition, the level of maintenance, and the chosen financing. 6449 6450--- 6451 6452## The total project cost far exceeds the asking price 6453 6454The analysis must be carried out on the overall acquisition cost, not on the price mentioned in the ad. This global cost includes registration duties, which vary by Region: twelve point five percent in Wallonia and Brussels, six percent in Flanders for a sole and primary residence, and twelve percent in other cases. Notary fees and ancillary costs are added to this, as well as upgrade or compliance work, potential furnishing in the case of a furnished rental, mortgage loan fees, and the creation of a contingency reserve. 6455 6456The final cost can be fifteen to twenty-five percent higher than the indicative price. A property listed at â¬250,000 can represent an entry cost of between â¬290,000 and â¬310,000 before the first tenant even moves in. An investor who calculates their yield based on the asking price rather than the actual cost mechanically and significantly overestimates their performance. 6457 6458--- 6459 6460## Annual charges, an unavoidable reality 6461 6462A residential rental property entails regular expenses, regardless of the occupancy rate or market conditions. Incompressible charges include the property tax (_précompte immobilier_), the amount of which varies greatly depending on the municipality and Region, non-occupant owner insurance, and co-ownership charges that cannot be recovered from the tenant. 6463 6464Recurring charges include routine maintenance, minor repairs, small upgrades, and potential rental management costs, which generally represent between five and eight percent of the annual rent when a professional manager is mandated. Variable charges, often underestimated, cover rental vacancy, unpaid rent, equipment replacements, and structural work that inevitably occurs over a holding cycle of ten years or more. 6465 6466A rigorous investor plans an annual provision to absorb these expenses without a brutal impact on their cash flow. The absence of a provision does not make the charges invisible; it makes them unpredictable and potentially destabilizing for the project's financial balance. 6467 6468--- 6469
6470## From gross to net-net yield: a concrete example 6471 6472An apartment listed at â¬235,000 and rented for â¬950 a month produces a theoretical gross yield of 4.85 percent. This figure is the starting point of the analysis, but certainly not its conclusion. By integrating registration duties, notary fees, a reasonable renovation budget, potential furniture, and loan-related costs, the total entry cost approaches â¬280,000. The yield recalculated on this actual basis immediately drops to around 4.07 percent. 6473 6474Once annual charges are integratedâincluding property tax, insurance, routine maintenance, and a provision for rental vacancyâthe net yield becomes significantly lower, generally sitting between 2.5 and 3 percent. If mortgage financing is used, the monthly cash flow may be neutral or slightly negative for several years. This situation is not necessarily a red flag if the strategy is based on a long horizon and potential property appreciation, but it must be anticipated and integrated into the financial plan. 6475 6476--- 6477 6478## Rental profitability is built over the long term, not on immediate yield 6479 6480Residential rental investment in Belgium generally relies on three complementary levers that unfold over time. The progressive repayment of the borrowed capital is the first lever, transforming each monthly payment into wealth accumulation. Rent indexation, governed by Belgian legal conditions and linked to the health index (_indice santé_), ensures a gradual increase in rental income. Long-term property appreciation, dependent on local market dynamics, constitutes the third lever. 6481 6482The primary goal is not immediate income, but the construction of a wealth asset amortized over time. Chasing a high immediate rental yield often implies compromises on location, property type, or risk level, which can jeopardize the project's overall performance over its lifespan. 6483 6484--- 6485 6486## Conclusion 6487 6488Rental yield is measured over time, not by the gross figure advertised in a listing. The quality of the investment primarily depends on the total entry cost, the trajectory of expenses, the financing strategy, and the chosen timeframe. A theoretical yield does not constitute an investment decision; only real and contextualized data allow for that. 6489 6490The central question for any Belgian residential investor is not what yield a property shows today, but what actual performance that property can produce over its entire operating cycle. 6491 6492--- 6493 6494## Arcanes Integration 6495 6496Arcanes automatically calculates the three levels of yield by integrating regional acquisition costs, estimated annual charges, financing, and appreciation projections. The comparative report allows you to evaluate multiple scenarios in minutes and base your investment decision on real data rather than a misleading gross yield. 6497 6498--- 6499 6500## Frequently Asked Questions 6501 6502### What minimum gross yield should I aim for in Belgium for a rental investment? 6503 6504The gross yield must be interpreted according to the location, property type, and investment horizon. An indicative baseline is between 5.5 and 6 percent to trigger a detailed analysis. Below this threshold, the net yield risks approaching zero once actual charges and expenses are integrated. 6505 6506### Why doesn't a high gross yield guarantee a good investment? 6507 6508Gross yield takes into account neither annual charges, nor entry costs, nor financing, nor rental vacancy, nor maintenance work. A high gross yield can mask significant risks, particularly in areas with low rental demand or for properties requiring major renovations. 6509 6510### Is a negative cash flow acceptable in a rental project? 6511 6512A slightly negative cash flow can be acceptable provided it is anticipated, limited in time, and compensated by realistic future appreciation, a solid location, or strong economic fundamentals. However, the investor must have the necessary financial capacity to absorb this deficit during the relevant period. 6513 6514### What are the main expenses often forgotten in yield calculations? 6515 6516The most frequently omitted expenses include replacing technical equipment like the boiler or water heater, regulatory compliance work (especially related to the EPC), rental vacancy between two tenants, potential management fees, and contributions to major collective works in a co-ownership. 6517 6518### What is the minimum horizon to analyze the profitability of a rental project in Belgium? 6519 6520A horizon of at least ten years allows you to smooth out variations in expenses, benefit from the amortization of the borrowed capital, and integrate the potential effects of property appreciation. Projects evaluated over a shorter horizon present an increased risk of negative performance, especially if the market experiences a period of stagnation. 6521`,lO=`--- 6522title: "Rendement locatif en Belgique : la vérité des chiffres que personne ne montre" 6523slug: "rendement-locatif-verite-chiffres-belgique" 6524tag: "Rendement" 6525readTime: "10" 6526publishDate: "25 janvier 2026" 6527author: "Ãquipe Arcanes" 6528excerpt: "Un rendement affiché à 4 % devient souvent 1,5 à 2 % une fois les charges et risques intégrés. Comprendre la rentabilité réelle avant d'investir." 6529image: "/images/blog/rental-yield-concept.jpg" 6530--- 6531 6532# Rendement locatif en Belgique : la vérité des chiffres que personne ne montre 6533 6534L'investissement locatif résidentiel est perçu comme une stratég
6534ie patrimoniale stable, capable de générer des revenus réguliers et de protéger l'épargne face à l'inflation. Les portails comme Immoweb, Zimmo et Immovlan regorgent d'annonces accompagnées d'un rendement brut affiché, parfois mis en avant comme argument commercial. Pourtant, la majorité des calculs rapportés reposent sur des hypothèses incomplètes. Ce chiffre brut offre une indication de présélection mais ne reflète en rien la performance réelle, car il ignore un ensemble de coûts et de risques inhérents à l'exploitation du bien. 6535 6536Le décalage entre rendement théorique et rendement réellement encaissé peut être significatif, de l'ordre de deux à trois points de pourcentage dans de nombreux cas. Il ne remet pas en cause l'intérêt de l'investissement locatif en Belgique, mais il nécessite une méthodologie plus complète et cohérente pour en évaluer la pertinence. Les données de la Fédération des Notaires et du SPF Finances permettent de reconstruire une image fidèle des coûts réels, à condition de les intégrer systématiquement dans l'analyse. 6537 6538L'objectif est de fournir une grille de lecture applicable à tout projet locatif résidentiel belge, quelle que soit la Région, en distinguant clairement ce que le rendement brut promet de ce que le rendement net-net délivre réellement. 6539 6540--- 6541 6542## Synthèse structurante 6543 6544Le rendement brut, utilisé comme principal indicateur par la majorité des investisseurs débutants, surestime systématiquement la performance réelle d'un bien locatif résidentiel en Belgique. Les frais d'entrée, qui comprennent les droits d'enregistrement régionaux, les honoraires notariaux et les éventuels travaux, ajoutent entre quinze et vingt-cinq pour cent au prix d'achat affiché. Les charges annuelles incompressibles, incluant le précompte immobilier, l'assurance et l'entretien courant, réduisent encore le rendement effectif. Un bien affiché à un rendement brut de cinq pour cent produit fréquemment un rendement net compris entre un virgule cinq et trois pour cent, selon la localisation, l'état du bien et le mode de financement. La rentabilité locative se mesure sur un cycle complet de détention, généralement dix à quinze ans, et non sur un ratio annuel simplifié. 6545 6546Si vous envisagez un premier investissement locatif, notre [guide complet de l'achat immobilier en Belgique en 2026](/blog/acheter-bien-immobilier-belgique-2026) détaille les frais d'entrée par région, la fiscalité et les étapes du financement â trois dimensions qui affectent directement votre rendement réel. 6547 6548--- 6549 6550## Pourquoi les rendements locatifs sont fréquemment surévalués 6551 6552Le rendement brut est calculé en divisant le loyer annuel par le prix d'achat du bien. Il sert principalement d'indicateur rapide pour comparer des biens ou des zones géographiques. Un appartement affiché à 200 000 euros et loué 900 euros par mois produit un rendement brut de 5,4 pour cent. Ce chiffre, souvent repris dans les annonces et les articles de presse, donne une impression de performance qui ne résiste pas à l'examen détaillé. 6553 6554Le rendement brut ne prend en compte ni les frais d'entrée, ni les coûts d'exploitation, ni les aléas locatifs, ni l'effet du financement. Comparer ce rendement à celui d'un placement d'épargne ou d'une obligation peut créer une perception biaisée, car le premier correspond à un indicateur théorique tandis que le second représente un rendement réellement encaissable. L'investisseur qui fonde sa décision sur le seul rendement brut s'expose à une désillusion mesurable en euros sur la durée de détention. 6555 6556--- 6557 6558## Trois niveaux de rendement à distinguer impérativement 6559 6560Une analyse correcte de la rentabilité locative implique d'évaluer trois niveaux successifs, chacun apportant un degré de précision supplémentaire. Le rendement brut, premier niveau, divise le loyer annuel par le prix d'achat. Il est utile pour filtrer rapidement les opportunités sur le marché mais insuffisant pour conclure quoi que ce soit sur la viabilité d'un projet. 6561 6562Le rendement net, deuxième niveau, intègre les frais d'entrée réels et les charges annuelles récurrentes dans le calcul. Il représente la rentabilité économique du bien, indépendamment du mode de financement. C'est le premier indicateur qui reflète une réalité opérationnelle et non une promesse théorique. 6563 6564Le rendement net-net constitue le troisième et dernier niveau. Il intègre le financement, la fiscalité personnelle, le cash-flow mensuel et les effets de trésorerie. C'est le seul indicateur véritablement personnel et réel, car il dépend de la situation propre de chaque investisseur. Dans la pratique belge, un rendement brut de cinq pour cent se transforme régulièrement en rendement net compris entre un virgule cinq et trois pour cent, selon la localisation, l'état du bien, le niveau d'entretien et le financement choisi. 6565 6566--- 6567 6568## Le coût total du projet dépasse largement le prix affiché 6569 6570L'analyse doit être réalisée sur le coût global d'acquisition et non sur le prix mentionné dans l'annonce. Ce coût global inclut les droits d'enregistrement, qui varient selon la Région : douze virgule cinq pour cent en Wallonie et à Bruxelles, six pour cent en Flandre pour une habitation propre et unique, et douze pour cent dans les autres cas. Les honoraires notariaux et les frais annexes s'y ajoutent, ainsi que les travaux de mise à niveau ou de conformité, l'ameublement éventuel dans le cas d'une location meublée, les frais liés au crédit hypothécaire et la constitution d'une réserve prévisionnelle. 6571 6572Le coût final peut être supérieur de quinze à vingt-cinq pour cent par rapport au prix indicatif. Un bien affiché à 250 000 euros peut représenter un coût d'entrée compris entre 290 000 et 310 000 euros avant la première mise en location. L'investisseur qui calcule son rendement sur la base du prix affiché plutôt que du coût réel surestime mécaniquement sa performance de manière significative. 6573 6574--- 6575 6576## Les charges annuelles, une réalité incontournable 6577 6578Un bien locatif résidentiel implique des charges régulières, indépendamment du taux d'occupation ou de l'état du marché. Les charges incompressibles comprennent le précompte immobilier, dont le montant varie fortement selon la commune et la Région, l'assurance propriétaire non-occupant et les charges de copropriété non récupérables auprès du locataire. 6579 6580Les charges récurrentes incluent les entretiens courants, les petites réparations, les mises à niveau mineures et les éventuels coûts de gestion locative, qui représentent généralement entre cinq et huit pour cent du loyer annuel lorsqu'un gestionnaire professionnel est mandaté. Les charges variables, souvent sous-estimées, couvrent la vacance locative, les impayés, les remplacements d'équipements et les travaux structurants qui surviennent inévitablement sur un cycle de détention de dix ans ou plus. 6581 6582L'investisseur rigoureux prévoit une provision annuelle pour absorber ces dépenses sans impact brutal sur sa trésorerie. L'absence de provision ne rend pas les charges invisibles, elle les rend imprévisibles et potentiellement déstabilisantes pour l'équilibre financier du projet. 6583 6584--- 6585 6586## Du rendement brut au rendement net-net : un exemple concret 6587 6588Un appartement affiché à 235 000 euros et loué 950 euros par mois produit un rendement brut théorique de 4,85 pour cent. Ce chiffre constitue le point de départ de l'analyse mais certainement pas sa conclusion. En intégrant les droits d'enregistrement, les frais notariaux, un budget travaux raisonnable, l'ameublement éventuel et les frais liés au crédit, le coût total d'entrée approche 280 000 euros. Le rendement recalculé sur cette base réelle descend déjà à environ 4,07 pour cent. 6589 6590Une fois les charges annuelles intégrées, incluant le précompte immobilier, l'assurance, l'entretien courant et une provision pour vacance locative, le rendement net devient sensiblement plus faible, généralement compris entre 2,5 et 3 pour cent. Si un financement hypothécaire est mobilisé, le cash-flow mensuel peut être neutre ou légèrement négatif pendant plusieurs années. Cette situation n'est pas nécessairement un signal d'alerte si la stratég
6590ie repose sur un horizon long et une valorisation potentielle du bien, mais elle doit être anticipée et intégrée dans le plan financier. 6591 6592--- 6593 6594## La rentabilité locative se construit sur l'horizon, pas sur le rendement immédiat 6595 6596L'investissement locatif résidentiel en Belgique repose généralement sur trois leviers complémentaires qui se déploient dans le temps. Le remboursement progressif du capital emprunté constitue le premier levier, transformant chaque mensualité en accumulation patrimoniale. L'indexation des loyers, encadrée par les conditions légales belges et liée à l'indice santé, assure une revalorisation progressive des revenus locatifs. La valorisation du bien à long terme, dépendante des dynamiques de marché locales, constitue le troisième levier. 6597 6598L'objectif premier n'est pas le revenu immédiat mais la construction d'une valeur patrimoniale amortie dans le temps. La recherche d'un rendement locatif immédiat élevé implique souvent des concessions en matière de localisation, de typologie ou de niveau de risque qui peuvent compromettre la performance globale du projet sur la durée. 6599 6600--- 6601 6602## Conclusion 6603 6604Le rendement locatif se mesure sur la durée et non sur le chiffre brut affiché dans une annonce. La qualité de l'investissement dépend principalement du coût total d'entrée, de la trajectoire des charges, de la stratégie de financement et de l'horizon retenu. Un rendement théorique ne constitue pas une décision d'investissement ; seules les données réelles et contextualisées le permettent. 6605 6606La question centrale pour tout investisseur résidentiel belge n'est pas de savoir quel rendement un bien affiche aujourd'hui, mais quelle performance réelle ce bien peut produire sur l'ensemble de son cycle d'exploitation. 6607 6608--- 6609 6610## Intégration Arcanes 6611 6612Arcanes calcule automatiquement les trois niveaux de rendement en intégrant les frais d'acquisition régionaux, les charges annuelles estimées, le financement et les projections de valorisation. Le rapport comparatif permet d'évaluer plusieurs scénarios en quelques minutes et de fonder la décision d'investissement sur des données réelles plutôt que sur un rendement brut trompeur. 6613 6614--- 6615 6616## Questions fréquentes 6617 6618### Quel rendement brut minimum viser en Belgique pour un investissement locatif ? 6619 6620Le rendement brut doit être interprété selon la localisation, le type de bien et l'horizon d'investissement. Une base indicative se situe entre 5,5 et 6 pour cent pour entamer une analyse détaillée. En dessous de ce seuil, le rendement net risque de se rapprocher de zéro une fois les charges et frais réels intégrés. 6621 6622### Pourquoi un rendement brut élevé ne garantit-il pas un bon investissement ? 6623 6624Le rendement brut ne prend en compte ni les charges annuelles, ni les frais d'entrée, ni le financement, ni la vacance locative, ni les travaux d'entretien. Un rendement brut élevé peut masquer des risques significatifs, notamment dans des zones à faible demande locative ou sur des biens nécessitant des travaux importants. 6625 6626### Un cash-flow négatif est-il acceptable dans un projet locatif ? 6627 6628Un cash-flow légèrement négatif peut être acceptable à condition qu'il soit anticipé, limité dans le temps et compensé par une valorisation future réaliste, un emplacement solide ou des fondamentaux économiques pertinents. L'investisseur doit cependant disposer de la capacité financière nécessaire pour absorber ce déficit pendant la période concernée. 6629 6630### Quelles sont les principales dépenses souvent oubliées dans le calcul de rendement ? 6631 6632Les dépenses les plus fréquemment omises incluent les remplacements d'équipements techniques comme la chaudière ou le chauffe-eau, les travaux de mise en conformité réglementaire notamment liés au PEB, la vacance locative entre deux locataires, les frais de gestion éventuels et la contribution aux gros travaux collectifs en copropriété. 6633 6634### Quel horizon minimal pour analyser la rentabilité d'un projet locatif en Belgique ? 6635 6636Un horizon d'au moins dix ans permet de lisser les variations de charges, de profiter de l'amortissement du capital emprunté et d'intégrer les effets potentiels de valorisation du bien. Les projets évalués sur un horizon plus court présentent un risque accru de performance négative, surtout si le marché connaît une phase de stagnation. 6637`,dO=`--- 6638title: "Huurrendement in België: de waarheid achter de cijfers die niemand toont"
6639slug: "huurrendement-waarheid-cijfers-belgie" 6640tag: "Rendement" 6641readTime: "10" 6642publishDate: "25 januari 2026" 6643author: "Team Arcanes" 6644excerpt: "Een aangekondigd rendement van 4 % wordt vaak 1,5 tot 2 % na aftrek van lasten en risico's. Begrijp het werkelijke rendement voor u investeert." 6645image: "/images/blog/rental-yield-concept.jpg" 6646--- 6647 6648# Huurrendement in België: de waarheid achter de cijfers die niemand toont 6649 6650Residentieel vastgoed als belegging wordt beschouwd als een stabiele vermogensstrategie, in staat om regelmatige inkomsten te genereren en spaargeld te beschermen tegen inflatie. De portalen Immoweb, Zimmo en Immovlan staan vol advertenties vergezeld van een aangekondigd brutorendement, soms gepresenteerd als commercieel argument. Toch berusten de meeste gepubliceerde berekeningen op onvolledige hypotheses. Dit brutocijfer biedt een indicatie voor voorselectie maar weerspiegelt geenszins de werkelijke prestatie, aangezien het een reeks kosten en risico's negeert die inherent zijn aan de exploitatie van het pand. 6651 6652Het verschil tussen theoretisch rendement en daadwerkelijk geïnd rendement kan aanzienlijk zijn, in de orde van twee tot drie procentpunten in talrijke gevallen. Dit stelt het belang van vastgoedinvestering in België niet ter discussie, maar vereist een meer volledige en coherente methodologie om de relevantie ervan te evalueren. De gegevens van de Federatie van Notarissen en de FOD Financiën maken het mogelijk een getrouw beeld van de werkelijke kosten te reconstrueren, op voorwaarde dat ze systematisch in de analyse worden geïntegreerd. 6653 6654Het doel is een analysekader te bieden dat toepasbaar is op elk residentieel huurproject in België, ongeacht het Gewest, door duidelijk te onderscheiden wat het brutorendement belooft en wat het netto-nettorendement werkelijk oplevert. 6655 6656--- 6657 6658## Structurerende synthese 6659 6660Het brutorendement, dat door de meerderheid van beginnende investeerders als belangrijkste indicator wordt gebruikt, overschat systematisch de werkelijke prestatie van een residentieel huurpand in België. De instapkosten, bestaande uit de gewestelijke registratierechten, notariskosten en eventuele werken, voegen vijftien tot vijfentwintig procent toe aan de aangekondigde aankoopprijs. De jaarlijkse vaste lasten, waaronder de onroerende voorheffing, de verzekering en het lopend onderhoud, verlagen het effectieve rendement nog verder. Een pand met een aangekondigd brutorendement van vijf procent levert frequent een nettorendement op tussen één komma vijf en drie procent, afhankelijk van de locatie, de staat van het pand en de financieringswijze. De huurrendabiliteit wordt gemeten over een volledig bezitscyclus, doorgaans tien tot vijftien jaar, en niet op basis van een vereenvoudigde jaarlijkse ratio. 6661 6662Overweegt u een eerste vastgoedinvestering? Onze [complete gids voor vastgoed kopen in België in 2026](/blog/acheter-bien-immobilier-belgique-2026) beschrijft de aankoopkosten per regio, de fiscaliteit en de financieringsstappen â drie dimensies die rechtstreeks uw werkelijk rendement beïnvloeden. 6663 6664--- 6665 6666## Waarom huurrendementen frequent worden overschat 6667 6668Het brutorendement wordt berekend door de jaarlijkse huur te delen door de aankoopprijs van het pand. Het dient voornamelijk als snelle indicator om panden of geografische zones te vergelijken. Een appartement aangeboden voor 200.000 euro en verhuurd aan 900 euro per maand levert een brutorendement op van 5,4 procent. Dit cijfer, dat vaak wordt overgenomen in advertenties en persartikelen, geeft een indruk van prestatie die een gedetailleerd onderzoek niet doorstaat. 6669 6670Het brutorendement houdt geen rekening met de instapkosten, de exploitatiekosten, de huurrisico's of het effect van de financiering. Dit rendement vergelijken met dat van een spaarrekening of een obligatie kan een vertekend beeld creëren, aangezien het eerste overeenkomt met een theoretische indicator terwijl het tweede een werkelijk incasseerbaar rendement vertegenwoordigt. De investeerder die zijn beslissing uitsluitend baseert op het brutorendement stelt zich bloot aan een meetbare teleurstelling in euro's over de bezitsduur. 6671 6672--- 6673 6674## Drie rendementsniveaus die noodzakelijk onderscheiden moeten worden 6675 6676Een correcte analyse van de huurrendabiliteit vereist de evaluatie van drie opeenvolgende niveaus, elk met een bijkomende graad van nauwkeurigheid. Het brutorendement, het eerste niveau, deelt de jaarlijkse huur door de aankoopprijs. Het is nuttig om kansen op de markt snel te filteren maar onvoldoende om enige conclusie te trekken over de levensvatbaarheid van een project. 6677 6678Het nettorendement, het tweede niveau, integreert de werkelijke instapkosten en de jaarlijkse terugkerende lasten in de berekening. Het vertegenwoordigt de economische rendabiliteit van het pand, onafhankelijk van de financieringswijze. Dit is de eerste indicator die een operationele realiteit weerspiegelt en geen theoretische belofte. 6679 6680Het netto-nettorendement vormt het derde en laatste niveau. Het integreert de financiering, de persoonlijke fiscaliteit, de maandelijkse cashflow en de kasstroomeffecten. Het is de enige echt persoonlijke en reële indicator, aangezien het afhangt van de eigen situatie van elke investeerder. In de Belgische praktijk wordt een brutorendement van vijf procent regelmatig omgezet in een nettorendement tussen één komma vijf en drie procent, afhankelijk van de locatie, de staat van het pand, het onderhoudsniveau en de gekozen financiering. 6681 6682--- 6683 6684## De totale projectkost overstijgt de aangekondigde prijs ruimschoots 6685 6686De analyse moet worden uitgevoerd op de globale verwervingskost en niet op de prijs vermeld in de advertentie. Deze globale kost omvat de registratierechten, die variëren per Gewest: twaalf komma vijf procent in Wallonië en Brussel, zes procent in Vlaanderen voor een eigen en enige woning, en twaalf procent in de overige gevallen. De notariskosten en bijkomende kosten komen daarbij, evenals de werken voor opwaardering of conformiteit, de eventuele meubilering bij gemeubileerde verhuur, de kosten verbonden aan het hypothecair krediet en de aanleg van een voorzieningsreserve. 6687 6688De uiteindelijke kost kan vijftien tot vijfentwintig procent hoger uitvallen dan de indicatieve prijs. Een pand aangeboden voor 250.000 euro kan een instapkost vertegenwoordigen van 290.000 tot 310.000 euro vóór de eerste verhuring. De investeerder die zijn rendement berekent op basis van de aangekondigde prijs in plaats van de werkelijke kost overschat mechanisch zijn prestatie op significante wijze. 6689 6690--- 6691 6692## De jaarlijkse lasten, een onvermijdelijke realiteit 6693 6694Een residentieel huurpand brengt regelmatige lasten met zich mee, ongeacht de bezettingsgraad of de marktomstandigheden. De vaste lasten omvatten de onroerende voorheffing, waarvan het bedrag sterk varieert per gemeente en per Gewest, de verzekering voor niet-bewonende eigenaar en de niet-doorrechenbare mede-eigendomslasten aan de huurder. 6695 6696De terugkerende lasten omvatten het lopend onderhoud, kleine herstellingen, kleine opwaarderingen en de eventuele kosten voor huurbeheer, die doorgaans vijf tot acht procent van de jaarlijkse huur vertegenwoordigen wanneer een professionele beheerder wordt aangesteld. De variabele lasten, vaak onderschat, dekken de leegstand, de wanbetalingen, de vervangingen van uitrusting en de structurele werken die onvermijdelijk o
6696ptreden over een bezitscyclus van tien jaar of meer. 6697 6698De rigoureuze investeerder voorziet een jaarlijkse provisie om deze uitgaven op te vangen zonder brutale impact op zijn kaspositie. Het ontbreken van een provisie maakt de lasten niet onzichtbaar maar wel onvoorspelbaar en potentieel destabiliserend voor het financieel evenwicht van het project. 6699 6700--- 6701 6702## Van brutorendement naar netto-nettorendement: een concreet voorbeeld 6703 6704Een appartement aangeboden voor 235.000 euro en verhuurd aan 950 euro per maand levert een theoretisch brutorendement op van 4,85 procent. Dit cijfer vormt het vertrekpunt van de analyse maar zeker niet de conclusie ervan. Na integratie van de registratierechten, de notariskosten, een redelijk werkbudget, de eventuele meubilering en de kredietkosten benadert de totale instapkost 280.000 euro. Het herberekende rendement op deze reële basis daalt al naar ongeveer 4,07 procent. 6705 6706Zodra de jaarlijkse lasten zijn geïntegreerd, waaronder de onroerende voorheffing, de verzekering, het lopend onderhoud en een provisie voor leegstand, wordt het nettorendement merkbaar lager, doorgaans tussen 2,5 en 3 procent. Indien hypothecaire financiering wordt ingezet, kan de maandelijkse cashflow neutraal of licht negatief zijn gedurende meerdere jaren. Deze situatie is niet noodzakelijk alarmerend als de strategie berust op een lange horizon en een potentiële waardevermeerdering van het pand, maar ze moet worden geanticipeerd en opgenomen in het financieel plan. 6707 6708--- 6709 6710## Huurrendabiliteit bouwt zich op over de horizon, niet op het onmiddellijke rendement 6711 6712Residentiële vastgoedinvestering in België steunt doorgaans op drie complementaire hefbomen die zich in de tijd ontplooien. De progressieve terugbetaling van het geleende kapitaal vormt de eerste hefboom, waardoor elke maandelijkse aflossing wordt omgezet in vermogensopbouw. De indexering van de huurprijzen, omkaderd door de Belgische wettelijke voorwaarden en gekoppeld aan de gezondheidsindex, zorgt voor een geleidelijke herwaardering van de huurinkomsten. De waardevermeerdering van het pand op lange termijn, afhankelijk van de lokale marktdynamiek, vormt de derde hefboom. 6713 6714Het primaire doel is niet het onmiddellijke inkomen maar de opbouw van een in de tijd afgeschreven vermogenswaarde. Het nastreven van een hoog onmiddellijk huurrendement impliceert vaak concessies inzake locatie, typologie of risiconiveau die de globale prestatie van het project op lange termijn in gevaar kunnen brengen. 6715 6716--- 6717 6718## Conclusie 6719 6720Het huurrendement wordt gemeten over de duur en niet op het brutocijfer vermeld in een advertentie. De kwaliteit van de investering hangt voornamelijk af van de totale instapkost, het ladentraject, de financieringsstrategie en de gekozen horizon. Een theoretisch rendement vormt geen investeringsbeslissing; alleen reële en gecontextualiseerde gegevens maken dat mogelijk. 6721 6722De centrale vraag voor elke Belgische residentiële investeerder is niet welk rendement een pand vandaag aankondigt, maar welke werkelijke prestatie dat pand kan leveren over zijn volledige exploitatiecyclus. 6723 6724--- 6725 6726## Arcanes Integratie 6727 6728Arcanes berekent automatisch de drie rendementsniveaus door de gewestelijke verwervingskosten, de geschatte jaarlijkse lasten, de financiering en de waarderingsprognoses te integreren. Het vergelijkend rapport maakt het mogelijk meerdere scenario's in enkele minuten te evalueren en de investeringsbeslissing te baseren op reële gegevens in plaats van op een misleidend brutorendement. 6729 6730--- 6731 6732## Veelgestelde vragen 6733 6734### Welk minimaal brutorendement moet worden beoogd in België voor een huurinvestering? 6735 6736Het brutorendement moet worden geïnterpreteerd volgens de locatie, het type pand en de investeringshorizon. Een indicatieve basis situeert zich tussen 5,5 en 6 procent om een gedetailleerde analyse te starten. Onder deze drempel riskeert het nettorendement nul te benaderen zodra de werkelijke lasten en kosten zijn geïntegreerd. 6737 6738### Waarom garandeert een hoog brutorendement geen goede investering? 6739 6740Het brutorendement houdt geen rekening met de jaarlijkse lasten, de instapkosten, de financiering, de leegstand of de onderhoudswerken. Een hoog brutorendement kan significante risico's maskeren, met name in zones met lage huurvraag of bij panden die belangrijke werken vereisen. 6741 6742### Is een negatieve cashflow aanvaardbaar bij een huurproject? 6743 6744Een licht negatieve cashflow kan aanvaardbaar zijn op voorwaarde dat ze wordt geanticipeerd, beperkt is in de tijd en gecompenseerd door een realistische toekomstige waardevermeerdering, een solide locatie of pertinente economische fundamentals. De investeerder moet echter over de nodige financiële capaciteit beschikken om dit tekort gedurende de betrokken periode op te vangen. 6745 6746### Welke uitgaven worden het vaakst vergeten bij de rendementberekening? 6747 6748De meest voorkomende omissies betreffen de vervangingen van technische uitrustingen zoals de ketel of de boiler, de werken voor regelgevende conformiteit met name gerelateerd aan het EPC, de leegstand tussen twee huurders, de eventuele beheerkosten en de bijdrage aan zware collectieve werken in mede-eigendom. 6749 6750### Welke minimale horizon is nodig om de rendabiliteit van een huurproject in België te analyseren? 6751 6752Een horizon van minstens tien jaar maakt het mogelijk de lasten te spreiden, te profiteren van de afschrijving van het geleende kapitaal en de potentiële waardevermerderingseffecten te integreren. Projecten die over een kortere horizon worden geëvalueerd vertonen een verhoogd risico op negatieve prestatie, vooral als de markt een stagnatiefase doormaakt. 6753`,cO=`--- 6754title: "Should you improve your EPC before selling? The calculation that decides (Belgium, 2026)" 6755slug: "renover-peb-avant-de-vendre" 6756tag: "Ãnergie" 6757readTime: "8" 6758publishDate: "July 21, 2026" 6759author: "Arcanes Team" 6760excerpt: "One EPC rating gained is worth up to +18.6% on the sale price. But the gain is measured, and the works cost is a quote. The calculation that decides â renovate, showcase, or sell as is." 6761image: "https://arcanes.be/__l5e/assets-v1/2085b379-5087-4eee-9c38-1c911132a29d/renover-peb-avant-de-vendre.png" 6762imageVersion: "2026-07-14" 6763imageAlt: "Comparison between the value gain of an EPC renovation and the works cost before a sale in Belgium" 6764--- 6765 6766# Should you improve your EPC before selling? The calculation that decides 6767 6768For years, the EPC certificate was treated as a formality: one more document in the notary's folder. That time is over. In 2026, a property's energy rating is one of buyers' first filters â and one of the most measurable factors in the final price. Not "in theory": measurable, on actual transactions. 6769 6770Here is what the figures say, region by region, and â more usefully â what it means in practice if you are selling. 6771 6772## How much is an EPC rating worth on the price? 6773 6774The Immoweb 2026 study, conducted at equal characteristics (same property type, same location, same surface area), gives clear orders of magnitude: 6775 6776- **In Wallonia**, an **A**-rated house sells on average **12% higher** than a comparable **D**-rated one.
6777- **In Flanders**, that same A vs D gap climbs to **18.6%** â the highest in the country. 6778- **In Brussels**, a **B** label is worth on average **+12.2%** against a comparable D. 6779 6780And the medal has its reverse. Energy-inefficient properties trade at a discount: 6781 6782- **â8.3%** for a **G**-rated house in Wallonia. 6783- **â10.4%** for an **F** in Flanders. 6784 6785On a â¬350,000 Walloon house rated D, the gap between a comparable A and G thus represents a range of several tens of thousands of euros â for the same building, energy performance aside. 6786 6787These gaps are not agents' opinions: they are statistical regularities observed on transactions, which our valuation engine integrates after calibration on the official regional scales. For the full analysis of the phenomenon â the 280 kWh trap, the obligations by region, the investor's reading â see our in-depth article on [the EPC discount in Belgium](https://arcanes.be/blog/decote-peb-belgique-impact-prix-immobilier). Here, we stay on the seller's question: renovate or not. 6788 6789## Why does Flanders pay more for performance? 6790 6791The Flemish gap (+18.6% for an A vs D, against +12% in Wallonia) is no accident. Two mechanisms compound. 6792 6793**Regulatory pressure first.** Flanders introduced an energy renovation obligation for the least efficient properties purchased since 2023: the Flemish buyer of an energy sieve does not wonder _whether_ they will have to renovate, but _how much_ it will cost and by when. That future cost â dated and near-certain â is mechanically deducted from the price they are willing to pay today. Conversely, an already efficient property exempts them from that constraint â and that exemption commands a price. 6794 6795**The structure of the housing stock second.** Each region has its own built history: the average age of the stock, the share of detached houses, the pace of renovations already carried out. An A label is valued all the more when it is rare in its local market. This is precisely why a single national percentage would make no sense â and why our engine works region by region, then municipality by municipality. 6796 6797## Renovating before selling: when does it pay off? 6798 6799It is the question the previous figure immediately triggers: "if one EPC rating is worth that much, should I renovate before listing?" 6800 6801The honest answer lies in an asymmetry: **the value gain is measurable; the works cost is a quote.** The gain from moving up a rating is observed on your region's transactions â that is a firm figure. The cost of getting there depends on your building, your contractors, the calendar. As long as the actual quote stays below the measured gain, the renovation pays for itself at resale. If they are in the same range, only a precise quote will decide. 6802 6803Three typical situations: 6804 68051. **Your property is already well rated (A, B, C)**: renovation barely matters any more â your rating is a selling point to showcase, not a worksite to open. 68062. **Your property is in D or E**: this is the zone where each rating gained weighs the most, and where the measured-gain vs actual-quote comparison deserves serious work. 68073. **Your property is in F or G**: the discount is real, particularly in Flanders. Renovating _or_ selling with the discount priced in are two legitimate strategies â but chosen ones, not endured ones. 6808 6809This is exactly the calculation performed by **The EPC Lever**, the renovation simulator in our valuation tool: rating by rating, it displays the measured value gain for _your_ property in _your_ municipality, against a works budget you adjust. [Test it for free on your property](https://arcanes.be/ma-vraie-valeur?utm_source=blog&utm_medium=article&utm_campaign=peb2026) â the valuation is immediate and requires no email. 6810 6811## What a valuation integrates â and what it does not 6812 6813A word on method, because trust is built on transparency. 6814 6815Our valuation starts from the **actual transactions in your postcode** (Statbel and FPS Finance data), adjusted by four factors specific to your property: surface area, general condition, EPC rating and zone. The EPC impact applied is not a national percentage: it is calibrated on the gaps observed in **your region**, according to the official scales. 6816 6817The result is a statistical order of magnitude â **sourced, timestamped, verifiable**. It is not a certified appraisal: a property's actual condition, its light, its street, current demand are things a visit validates and no statistic sees. The two approaches are complementary: the figure situates your property in its market; the professional refines on site. 6818 6819## Frequently asked questions 6820 6821**Does the EPC really influence the price, or is it a negotiation argument?** 6822Both â and it is measured. At equal characteristics, the gaps between ratings reach +18.6% (A vs D, houses, Flanders) and the discounts â10.4% (F, Flanders). The buyer negotiates _from_ that statistical reality, not against it. 6823 6824**Is the same EPC worth the same everywhere in Belgium?** 6825No. A rating's impact varies by region (regulation, housing stock) and by municipality (local rarity of performance). That is
6825why a serious valuation is calculated at the level of your postcode, not nationally. 6826 6827**Should you always renovate before selling?** 6828No. The rule is simple: the value gain of an EPC rating is measurable; the works cost is a quote. Renovate if the quote stays clearly below the gain â otherwise, sell with full knowledge. A simulator performs that calculation in seconds for your property. 6829 6830**Where do these figures come from?** 6831From the Immoweb 2026 study (comparisons at equal characteristics) and the official regional EPC scales, integrated and calibrated in the Arcanes valuation engine on actual Belgian transactions (Statbel, FPS Finance). 6832 6833--- 6834 6835_Selling, or thinking about it? [Get your free property valuation](https://arcanes.be/ma-vraie-valeur?utm_source=blog&utm_medium=article&utm_campaign=peb2026) â market price, EPC impact quantified for your municipality, and renovation simulator. Immediate, no email required._ 6836`,uO=`--- 6837title: "Faut-il rénover son PEB avant de vendre ? Le calcul qui tranche (Belgique, 2026)" 6838slug: "renover-peb-avant-de-vendre" 6839tag: "Marché" 6840readTime: "8" 6841publishDate: "21 juillet 2026" 6842author: "Ãquipe Arcanes" 6843excerpt: "Un cran de PEB gagné vaut jusqu'à +18,6 % sur le prix de vente. Mais le gain est mesuré, et le coût des travaux est un devis. Le calcul qui décide â rénover, mettre en avant, ou vendre en l'état." 6844image: "https://arcanes.be/__l5e/assets-v1/2085b379-5087-4eee-9c38-1c911132a29d/renover-peb-avant-de-vendre.png" 6845imageVersion: "2026-07-14" 6846imageAlt: "Comparaison entre le gain de valeur d'une rénovation PEB et le coût des travaux avant une vente en Belgique" 6847--- 6848 6849# Faut-il rénover son PEB avant de vendre ? Le calcul qui tranche 6850 6851Pendant des années, le certificat PEB a été traité comme une formalité : un document de plus dans la farde du notaire. Ce temps est terminé. En 2026, la classe énergétique d'un bien est l'un des premiers filtres des acheteurs â et l'un des facteurs les plus mesurables du prix final. Pas « en théorie » : mesurable, sur les transactions réelles. 6852 6853Voici ce que disent les chiffres, région par région, et â plus utile encore â ce que cela signifie concrètement si vous vendez. 6854 6855## Combien vaut une classe PEB sur le prix ? 6856 6857L'étude Immoweb 2026, menée à caractéristiques égales (même type de bien, même localisation, même surface), donne des ordres de grandeur nets : 6858 6859- **En Wallonie**, une maison classée **A** se vend en moyenne **12 % plus cher** qu'une maison comparable classée **D**. 6860- **En Flandre**, ce même écart A vs D grimpe à **18,6 %** â le plus élevé du pays. 6861- **à Bruxelles**, un label **B** vaut en moyenne **+12,2 %** face à un D comparable. 6862 6863Et la médaille a son revers. Les biens énergivores décotent : 6864 6865- **â8,3 %** pour une maison classée **G** en Wallonie. 6866- **â10,4 %** pour un **F** en Flandre. 6867 6868Sur une maison wallonne à 350 000 ⬠en classe D, l'écart entre un A et un G comparables représente ainsi une fourchette de plusieurs dizaines de milliers d'euros â pour le même bâtiment, à la performance énergétique près. 6869 6870Ces écarts ne sont pas des opinions d'agents : ce sont des régularités statistiques observées sur les transactions, que notre moteur d'estimation intègre après calibration sur les grilles régionales officielles. Pour l'analyse complète du phénomène â le piège des 280 kWh, les obligations par région, la lecture investisseur â voyez notre article de fond sur [la décote PEB en Belgique](https://arcanes.be/blog/decote-peb-belgique-impact-prix-immobilier). Ici, nous restons sur la question du vendeur : rénover ou pas. 6871 6872## Pourquoi la Flandre paie-t-elle plus cher la performance ? 6873 6874L'écart flamand (+18,6 % pour un A vs D, contre +12 % en Wallonie) n'est pas un hasard. Deux mécanismes se cumulent. 6875 6876**La pression réglementaire d'abord.** La Flandre a instauré une obligation de rénovation énergétique pour les biens les moins performants acquis depuis 2023 : l'acheteur flamand d'une passoire ne se demande pas _s'il_ devra rénover, mais _combien_ cela lui coûtera et dans quel délai. Ce coût futur, daté et quasi certain, se déduit mécaniquement du prix qu'il accepte de payer aujourd'hui. à l'inverse, un bien déjà performant l'exonère de cette c
6876ontrainte â et cette exonération se paie. 6877 6878**La structure du parc ensuite.** Chaque région a son histoire bâtie : l'âge moyen du parc, la part de maisons quatre façades, le rythme des rénovations déjà réalisées. Un label A est d'autant plus valorisé qu'il est rare dans son marché local. C'est précisément pour cela qu'un pourcentage national unique n'aurait aucun sens â et que notre moteur travaille région par région, puis commune par commune. 6879 6880## Rénover avant de vendre : quand est-ce que ça se paie ? 6881 6882C'est la question que le chiffre précédent déclenche immédiatement : « si un cran de PEB vaut autant, dois-je rénover avant de mettre en vente ? » 6883 6884La réponse honnête tient en une asymétrie : **le gain de valeur est mesurable ; le coût des travaux, lui, est un devis.** Le gain lié au passage d'une classe à l'autre est observé sur les transactions de votre région â c'est un chiffre ferme. Le coût pour y parvenir dépend de votre bâtiment, de vos artisans, du calendrier. Tant que le devis réel reste sous le gain mesuré, la rénovation se paie à la revente. S'ils sont du même ordre, seul un devis précis tranchera. 6885 6886Trois situations types : 6887 68881. **Votre bien est déjà bien classé (A, B, C)** : la rénovation ne joue plus beaucoup â votre classement est un argument de vente à mettre en avant, pas un chantier à ouvrir. 68892. **Votre bien est en D ou E** : c'est la zone où chaque cran gagné pèse le plus, et où la comparaison gain mesuré / devis réel mérite d'être faite sérieusement. 68903. **Votre bien est en F ou G** : la décote est réelle, particulièrement en Flandre. Rénover _ou_ vendre en intégrant la décote sont deux stratégies légitimes â mais choisies, pas subies. 6891 6892C'est exactement le calcul que fait le simulateur **Le Levier PEB** de notre outil d'estimation : classe par classe, il affiche le gain de valeur mesuré pour _votre_ bien dans _votre_ commune, face à un budget travaux que vous ajustez. [Testez-le gratuitement sur votre bien](https://arcanes.be/ma-vraie-valeur?utm_source=blog&utm_medium=article&utm_campaign=peb2026) â l'estimation est immédiate et ne demande pas d'e-mail. 6893 6894## Ce qu'une estimation intègre â et ce qu'elle n'intègre pas 6895 6896Un mot de méthode, parce que la confiance se construit sur la transparence. 6897 6898Notre estimation part des **transactions réelles de votre code postal** (données Statbel et SPF Finances), ajustées selon quatre facteurs propres à votre bien : la surface, l'état général, la classe PEB et la zone. L'impact PEB appliqué n'est pas un pourcentage national : il est calibré sur les écarts observés dans **votre région**, selon les grilles officielles. 6899 6900Le résultat est un ordre de grandeur statistique â **sourcé, horodaté, vérifiable**. Ce n'est pas une expertise certifiée : l'état réel d'un bien, sa luminosité, sa rue, la demande du moment sont des choses qu'une visite valide et qu'aucune statistique ne voit. Les deux approches sont complémentaires : le chiffre situe votre bien dans son marché ; le professionnel affine sur place. 6901 6902## Questions fréquentes 6903 6904**Le PEB influence-t-il vraiment le prix, ou est-ce un argument de négociation ?** 6905Les deux â et c'est mesuré. à caractéristiques égales, les écarts entre classes atteignent +18,6 % (A vs D, maisons, Flandre) et les décotes â10,4 % (F, Flandre). L'acheteur négocie _à partir_ de cette réalité statistique, pas contre elle. 6906 6907**Un même PEB vaut-il la même chose partout en Belgique ?** 6908Non. L'impact d'une classe varie selon la région (réglementation, parc bâti) et selon la commune (rareté locale de la performance). C'est pourquoi une estimation sérieuse se calcule au niveau de votre code postal, pas au niveau national. 6909 6910**Faut-il toujours rénover avant de vendre ?** 6911Non. La règle est simple : le gain de valeur d'un cran de PEB est mesurable ; le coût des travaux est un devis. Rénovez si le devis reste nettement sous le gain â sinon, vendez en connaissance de cause. Un simulateur permet de faire ce calcul en quelques secondes pour votre bien. 6912 6913**D'où viennent ces chiffres ?**
6914De l'étude Immoweb 2026 (comparaisons à caractéristiques égales) et des grilles PEB régionales officielles, intégrées et calibrées dans le moteur d'estimation Arcanes sur les transactions réelles belges (Statbel, SPF Finances). 6915 6916--- 6917 6918_Vous vendez, ou vous y pensez ? [Estimez gratuitement votre bien](https://arcanes.be/ma-vraie-valeur?utm_source=blog&utm_medium=article&utm_campaign=peb2026) â prix de marché, impact PEB chiffré pour votre commune, et simulateur de rénovation. Immédiat, sans e-mail._ 6919`,mO=`--- 6920title: "Uw EPC verbeteren vóór de verkoop? De berekening die beslist (België, 2026)" 6921slug: "renover-peb-avant-de-vendre" 6922tag: "Marché" 6923readTime: "8" 6924publishDate: "21 juli 2026" 6925author: "Team Arcanes" 6926excerpt: "Een gewonnen EPC-label is tot +18,6% waard op de verkoopprijs. Maar de winst is gemeten, en de werkkost is een offerte. De berekening die beslist â renoveren, uitspelen, of verkopen zoals het is." 6927image: "https://arcanes.be/__l5e/assets-v1/2085b379-5087-4eee-9c38-1c911132a29d/renover-peb-avant-de-vendre.png" 6928imageVersion: "2026-07-14" 6929imageAlt: "Vergelijking tussen de waardestijging van een EPC-renovatie en de werkkosten vóór een verkoop in België" 6930--- 6931 6932# Uw EPC verbeteren vóór de verkoop? De berekening die beslist 6933 6934Jarenlang werd het EPC behandeld als een formaliteit: nog een document in de map van de notaris. Die tijd is voorbij. In 2026 is het energielabel van een woning een van de eerste filters van kopers â en een van de meest meetbare factoren van de uiteindelijke prijs. Niet "in theorie": meetbaar, op werkelijke transacties. 6935 6936Dit zeggen de cijfers, gewest per gewest, en â nog nuttiger â wat dat concreet betekent als u verkoopt. 6937 6938## Hoeveel is een EPC-label waard op de prijs? 6939 6940De Immoweb-studie 2026, uitgevoerd bij gelijke kenmerken (zelfde woningtype, zelfde ligging, zelfde oppervlakte), geeft duidelijke ordes van grootte: 6941 6942- **In Wallonië** wordt een woning met label **A** gemiddeld **12% duurder** verkocht dan een vergelijkbare woning met label **D**. 6943- **In Vlaanderen** klimt datzelfde verschil A vs D naar **18,6%** â het hoogste van het land. 6944- **In Brussel** is een label **B** gemiddeld **+12,2%** waard tegenover een vergelijkbare D. 6945 6946En de medaille heeft haar keerzijde. Energieverslindende woningen krijgen een korting: 6947 6948- **â8,3%** voor een woning met label **G** in Wallonië. 6949- **â10,4%** voor een **F** in Vlaanderen. 6950 6951Op een Waalse woning van 350.000 ⬠in klasse D vertegenwoordigt het verschil tussen een vergelijkbare A en G zo een marge van enkele tienduizenden euro's â voor hetzelfde gebouw, op de energieprestatie na. 6952 6953Deze verschillen zijn geen meningen van makelaars: het zijn statistische regelmatigheden, waargenomen op transacties, die onze schattingsmotor integreert na kalibratie op de officiële gewestelijke schalen. Voor de volledige analyse van het fenomeen â de val van de 280 kWh, de verplichtingen per gewest, de investeerderslezing â zie ons achtergrondartikel over [de EPC-korting in België](https://arcanes.be/blog/decote-peb-belgique-impact-prix-immobilier). Hier blijven we bij de vraag van de verkoper: renoveren of niet. 6954 6955## Waarom betaalt Vlaanderen meer voor prestatie? 6956 6957Het Vlaamse verschil (+18,6% voor een A vs D, tegenover +12% in Wallonië) is geen toeval. Twee mechanismen stapelen zich op. 6958 6959**Eerst de reglementaire druk.** Vlaanderen voerde een renovatieverplichting in voor de minst performante woningen die sinds 2023 werden aangekocht: de Vlaamse koper van een energieverslinder vraagt zich niet af _of_ hij zal moeten renoveren, maar _hoeveel_ het hem zal kosten en binnen welke termijn. Die toekomstige kost, gedateerd en vrijwel zeker, wordt mechanisch afgetrokken van de prijs die hij vandaag wil betalen. Omgekeerd stelt een reeds performante woning hem vrij van die verplichting â en die vrijstelling wordt betaald. 6960 6961**Vervolgens de structuur van het gebouwenbestand.** Elk gewest heeft zijn bouwgeschiedenis: de gemiddelde leeftijd van het bestand, het aandeel viergevelwoningen, het tempo van reeds uitgevoerde renovaties. Een label A wordt des te meer gewaardeerd naarmate het zeldzaam is in zijn lokale markt. Precies daarom zou één nationaal percentage geen enkele zin hebben â en werkt onze motor gewest per gewest, en dan gemeente per gemeente. 6962 6963## Renoveren vóór de verkoop: wanneer betaalt het zich terug? 6964 6965Het is de vraag die het vorige cijfer onmiddellijk oproept: "als een EPC-label zoveel waard is, moet ik dan renoveren vóór ik verkoop?" 6966
6967Het eerlijke antwoord zit in een asymmetrie: **de waardestijging is meetbaar; de werkkost is een offerte.** De winst van de overgang naar een beter label is waargenomen op de transacties van uw gewest â dat is een vast cijfer. De kost om er te geraken hangt af van uw gebouw, uw vakmensen, de kalender. Zolang de werkelijke offerte onder de gemeten winst blijft, betaalt de renovatie zichzelf terug bij verkoop. Liggen ze in dezelfde orde, dan beslist alleen een precieze offerte. 6968 6969Drie typesituaties: 6970 69711. **Uw woning is al goed geklasseerd (A, B, C)**: renovatie speelt nog nauwelijks een rol â uw label is een verkoopargument om uit te spelen, geen werf om te openen. 69722. **Uw woning zit in D of E**: dit is de zone waar elk gewonnen label het zwaarst weegt, en waar de vergelijking gemeten winst / werkelijke offerte een ernstige oefening verdient. 69733. **Uw woning zit in F of G**: de korting is reëel, vooral in Vlaanderen. Renoveren _of_ verkopen met de korting verrekend zijn twee legitieme strategieën â maar gekozen, niet ondergaan. 6974 6975Dit is exact de berekening die de simulator **De EPC-Hefboom** van onze schattingstool maakt: label per label toont hij de gemeten waardestijging voor _uw_ woning in _uw_ gemeente, tegenover een werkbudget dat u aanpast. [Test hem gratis op uw woning](https://arcanes.be/ma-vraie-valeur?utm_source=blog&utm_medium=article&utm_campaign=peb2026) â de schatting is onmiddellijk en vraagt geen e-mail. 6976 6977## Wat een schatting integreert â en wat niet 6978 6979Een woord over methode, want vertrouwen wordt gebouwd op transparantie. 6980 6981Onze schatting vertrekt van de **werkelijke transacties van uw postcode** (gegevens Statbel en FOD Financiën), aangepast volgens vier factoren eigen aan uw woning: de oppervlakte, de algemene staat, het EPC-label en de zone. De toegepaste EPC-impact is geen nationaal percentage: hij is gekalibreerd op de verschillen die in **uw gewest** worden waargenomen, volgens de officiële schalen. 6982 6983Het resultaat is een statistische grootteorde â **met bron, tijdstempel, verifieerbaar**. Het is geen gecertificeerde expertise: de werkelijke staat van een woning, haar lichtinval, haar straat, de vraag van het moment zijn zaken die een bezoek valideert en die geen enkele statistiek ziet. Beide benaderingen zijn complementair: het cijfer situeert uw woning in haar markt; de professional verfijnt ter plaatse. 6984 6985## Veelgestelde vragen 6986 6987**Beïnvloedt het EPC echt de prijs, of is het een onderhandelingsargument?** 6988Beide â en het is gemeten. Bij gelijke kenmerken lopen de verschillen tussen labels op tot +18,6% (A vs D, woningen, Vlaanderen) en de kortingen tot â10,4% (F, Vlaanderen). De koper onderhandelt _vanuit_ die statistische realiteit, niet ertegen. 6989 6990**Is eenzelfde EPC overal in België evenveel waard?** 6991Nee. De impact van een label varieert per gewest (regelgeving, gebouwenbestand) en per gemeente (lokale zeldzaamheid van de prestatie). Daarom wordt een ernstige schatting berekend op het niveau van uw postcode, niet op nationaal niveau. 6992 6993**Moet u altijd renoveren vóór de verkoop?** 6994Nee. De regel is eenvoudig: de waardestijging van een EPC-label is meetbaar; de werkkost is een offerte. Renoveer als de offerte duidelijk onder de winst blijft â verkoop anders met kennis van zaken. Een simulator maakt die berekening in enkele seconden voor uw woning. 6995 6996**Waar komen deze cijfers vandaan?** 6997Uit de Immoweb-studie 2026 (vergelijkingen bij gelijke kenmerken) en de officiële gewestelijke EPC-schalen, geïntegreerd en gekalibreerd in de Arcanes-schattingsmotor op de werkelijke Belgische transacties (Statbel, FOD Financiën). 6998 6999--- 7000 7001_U verkoopt, of u denkt eraan? [Schat uw woning gratis](https://arcanes.be/ma-vraie-valeur?utm_source=blog&utm_medium=article&utm_campaign=peb2026) â marktprijs, becijferde EPC-impact voor uw gemeente, en renovatiesimulator. Onmiddellijk, zonder e-mail._ 7002`,EU=(e,t,n,r)=>{if(!e)return e;const a=t||`${n||"img"}-${r||"fr"}`,i=e.includes("?")?"&":"?";return`${e}${i}v=${a}`};function pO(e){const t=/^---\s*\n([\s\S]*?)\n---\s*\n([\s\S]*)$/,n=e.match(t);if(!n)return{data:{},content:e};const[,r,a]=n,i={};return r.split(` 7003`).forEach(s=>{const l=s.indexOf(":");if(l>0){const d=s.slice(0,l).trim();let c=s.slice(l+1).trim();c=c.replace(/^["']|["']$/g,""),i[d]=c}}),{data:i,content:a}}const gO=Object.assign({"/src/data/articles/acheter-bien-immobilier-belgique-2026.en.md":DF,"/src/data/articles/acheter-bien-immobilier-belgique-2026.fr.md":RF,"/src/data/articles/acheter-bien-immobilier-belgique-2026.nl.md":zF,"/src/data/articles/analyse-annonce-immobiliere-5-minutes.en.md":IF,"/src/data/articles/analyse-annonce-immobiliere-5-minutes.fr.md":qF,"/src/data/articles/analyse-annonce-immobiliere-5-minutes.nl.md":NF,"/src/data/articles/avm-estimation-automatisee-belgique.en.md":LF,"/src/data/articles/avm-estimation-automatisee-belgique.fr.md":BF,"/src/data/articles/avm-estimation-automatisee-belgique.nl.md":MF,"/src/data/articles/comprendre-peb-belgique.en.md":FF,"/src/data/articles/comprendre-peb-belgique.fr.md":OF,"/src/data/articles/comprendre-peb-belgique.nl.md":VF,"/src/data/articles/decote-peb-belgique-impact-prix-immobilier.en.md":WF,"/src/data/articles/decote-peb-belgique-impact-prix-immobilier.fr.md":UF,"/src/data/articles/decote-peb-belgique-impact-prix-immobilier.nl.md":$F,"/src/data/articles/estimation-immobiliere-en-l
7003igne-prix-differents.en.md":GF,"/src/data/articles/estimation-immobiliere-en-ligne-prix-differents.fr.md":HF,"/src/data/articles/estimation-immobiliere-en-ligne-prix-differents.nl.md":KF,"/src/data/articles/financement-premier-achat.en.md":YF,"/src/data/articles/financement-premier-achat.fr.md":ZF,"/src/data/articles/financement-premier-achat.nl.md":JF,"/src/data/articles/frais-acte-achat-immobilier-belgique-estimation-guide.en.md":QF,"/src/data/articles/frais-acte-achat-immobilier-belgique-estimation-guide.fr.md":XF,"/src/data/articles/frais-acte-achat-immobilier-belgique-estimation-guide.nl.md":eO,"/src/data/articles/immobilier-ou-bourse-belgique.en.md":tO,"/src/data/articles/immobilier-ou-bourse-belgique.fr.md":nO,"/src/data/articles/immobilier-ou-bourse-belgique.nl.md":rO,"/src/data/articles/investissement-immobilier-belgique-illusions-rentabilite.en.md":aO,"/src/data/articles/investissement-immobilier-belgique-illusions-rentabilite.fr.md":iO,"/src/data/articles/investissement-immobilier-belgique-illusions-rentabilite.nl.md":sO,"/src/data/articles/rendement-locatif-reel.en.md":oO,"/src/data/articles/rendement-locatif-reel.fr.md":lO,"/src/data/articles/rendement-locatif-reel.nl.md":dO,"/src/data/articles/renover-peb-avant-de-vendre.en.md":cO,"/src/data/articles/renover-peb-avant-de-vendre.fr.md":uO,"/src/data/articles/renover-peb-avant-de-vendre.nl.md":mO}),Yg=Object.entries(gO).map(([e,t])=>{const{data:n,content:r}=pO(t),a=e.match(/\/([^/]+)\.(fr|nl|en)\.md$/),i=a?a[2]:n.language||"fr",s=n.slug||(a==null?void 0:a[1])||"";return{title:n.title||"",slug:s,tag:n.tag||"",readTime:n.readTime||"",publishDate:n.publishDate||"",updateDate:n.updateDate||void 0,author:n.author||"",excerpt:n.excerpt||"",image:n.image||"",imageVersion:n.imageVersion||void 0,language:i,content:r}}),PU=(e,t="fr")=>{const n=t==="nl"?"nl":"fr";let r=Yg.find(a=>a.slug===e&&a.language===n);return!r&&n!=="fr"&&(r=Yg.find(a=>a.slug===e&&a.language==="fr")),r},hO=(e="fr")=>{const t=e==="nl"?"nl":"fr";return Yg.filter(n=>n.language===t).map(({content:n,...r})=>r)},zi="https://arcanes.be";function fO(e){if(e)return e.startsWith("http")?e:`${zi}${e.startsWith("/")?"":"/"}${e}`}function UA({title:e,description:t,ogImage:n,type:r="website",noIndex:a=!1,schemaJson:i}){let l=Ln().pathname;l.length>1&&l.endsWith("/")&&(l=l.slice(0,-1));const d=`${zi}${l}`,c=Df(l),u=fO(n)||`${zi}/og-image-n.png`,m=Tf(l)==="nl"?"nl_BE":"fr_BE";return o.jsxs(sx,{children:[o.jsx("title",{children:e}),o.jsx("meta",{name:"description",content:t}),o.jsx("meta",{name:"robots",content:a?"noindex, nofollow":"index, follow"}),o.jsx("link",{rel:"canonical",href:d}),c&&o.jsx("link",{rel:"alternate",hrefLang:"fr",href:`${zi}${c.fr}`}),c&&o.jsx("link",{rel:"alternate",hrefLang:"nl",href:`${zi}${c.nl}`}),c&&o.jsx("link",{rel:"alternate",hrefLang:"x-default",href:`${zi}${c.fr}`}),o.jsx("meta",{property:"og:site_name",content:"Arcanes"}),o.jsx("meta",{property:"og:title",content:e}),o.jsx("meta",{property:"og:description",content:t}),o.jsx("meta",{property:"og:type",content:r}),o.jsx("meta",{property:"og:url",content:d}),o.jsx("meta",{property:"og:image",content:u}),o.jsx("meta",{property:"og:locale",content:m}),o.jsx("meta",{name:"twitter:title",content:e}),o.jsx("meta",{name:"twitter:description",content:t}),o.jsx("meta",{name:"twitter:image",content:u}),i&&o.jsx("script",{type:"application/ld+json",children:JSON.stringify(i)})]})}function vO(){return{"@context":"https://schema.org","@type":"WebSite",name:"Arcanes",url:"https://arcanes.be",potentialAction:{"@type":"SearchAction",target:"https://arcanes.be/free-analyse?url={search_term_string}","query-input":"required name=search_term_string"}}}function CU(e){return{"@context":"https://schema.org","@type":"FAQPage",mainEntity:e.map(t=>({"@type":"Question",name:t.question,acceptedAnswer:{"@type":"Answer",text:t.answer}}))}}function SU(e){return{"@context":"https://schema.org","@type":"BlogPosting",headline:e.title,description:e.excerpt,datePublished:e.publishDate,dateModified:e.updateDate||e.publishDate,image:e.image,author:{"@id":"https://arcanes.be/#organization"},publisher:{"@id":"https://arcanes.be/#organization"},mainEntityOfPage:`https://arcanes.be/blog/${e.slug}`}}function bO(){const[e,t]=g.useState({shouldRedirectToPro:!1,ready:!1,accountType:null});return g.useEffect(()=>{let n=!0;de.auth.getSession().then(({data:{session:a}})=>{var l,d;if(!n)return;const i=((d=(l=a==null?void 0:a.user)==null?void 0:l.user_metadata)==null?void 0:d.account_type)??null;t({shouldRedirectToPro:i==="agent_pro"||i==="agent_pending",ready:!0,accountType:i})});const{data:{subscription:r}}=de.auth.onAuthStateChange((a,i)=>{var d,c;if(!n)return;const s=((c=(d=i==null?void 0:i.user)==null?void 0:d.user_metadata)==null?void 0:c.account_type)??null;t({shouldRedirectToPro:s==="agent_pro"||s==="agent_pending",ready:!0,accountType:s})});return()=>{n=!1,r.unsubscribe()}},[]),e}const vt=(e,t)=>{typeof window<"u"&&window.gtag&&window.gtag("event",e,t)}
7003,Wc={analysisStarted:e=>vt("analysis_started",{source:e}),analysisCompleted:e=>vt("analysis_completed",{analysis_type:e}),signUpStarted:()=>vt("sign_up_started"),signUpCompleted:e=>vt("sign_up",{method:e}),loginStarted:()=>vt("login_started"),loginCompleted:e=>vt("login",{method:e}),ctaClicked:(e,t)=>vt("cta_clicked",{cta_name:e,location:t}),pageView:e=>vt("page_view",{page_title:e}),formSubmitted:e=>vt("form_submit",{form_name:e}),creditsViewed:()=>vt("credits_viewed"),pricingViewed:()=>vt("pricing_viewed"),purchaseStarted:e=>vt("begin_checkout",{credit_amount:e}),referralShared:e=>vt("referral_shared",{method:e}),simulatorUsed:e=>vt("simulator_used",{simulator_type:e}),documentUploaded:e=>vt("document_uploaded",{file_type:e}),reportDownloaded:e=>vt("report_downloaded",{report_type:e}),reportViewed:e=>vt("report_viewed",{report_type:e})},yO="/assets/arcanes-logo-CKOKxeGH.png",wO={small:{height:32,width:69},medium:{height:40,width:87},large:{height:56,width:122}},kO=vu("w-auto transition-opacity hover:opacity-90",{variants:{size:{small:"h-8",medium:"h-10",large:"h-14"}},defaultVariants:{size:"medium"}}),lv=({size:e,className:t,...n})=>{const r=wO[e||"medium"];return o.jsx("img",{src:yO,alt:"Arcanes",width:r.width,height:r.height,loading:"eager",fetchPriority:"high",decoding:"async",className:le(kO({size:e}),t),...n})};function xO(){const{t:e}=Ge(),n=Ln().pathname.startsWith("/pro"),r=n?"/pro":"",a=(s,l)=>{const d=e(s);return d&&d!==s?d:l},i="!text-[14px] !leading-[1.6] text-[#5A5852] hover:text-[#0E3639] transition-colors";return o.jsx("footer",{className:"bg-white border-t border-[#E6E1DA]",style:{paddingTop:"48px",paddingBottom:"40px"},children:o.jsxs("div",{className:"w-full mx-auto",style:{maxWidth:"1400px",padding:"0 32px"},children:[o.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3",style:{gap:"40px"},children:[o.jsxs("div",{children:[o.jsx(lv,{size:"medium",className:"mb-[16px]"}),o.jsx("p",{className:"!text-[14px] !leading-[1.65] text-[#5A5852] max-w-[300px]",children:e("footer.description")})]}),o.jsxs("div",{children:[o.jsx("h4",{className:"!text-[13px] !font-bold uppercase tracking-[1.4px] text-[#0E3639] mb-[16px]",style:{fontFamily:"'Outfit', sans-serif"},children:e("footer.navigation")}),o.jsxs("ul",{className:"space-y-[10px]",children:[o.jsx("li",{children:o.jsx(Ce,{to:n?"/pro/simulateurs":"/simulateur",className:i,children:e("footer.simulators")})}),o.jsx("li",{children:o.jsx(Ce,{to:n?"/pro/communes":"/communes",className:i,children:a("footer.communes","Communes")})}),o.jsx("li",{children:o.jsx(Ce,{to:n?"/pro/tarifs":"/tarifs",className:i,children:e("footer.pricing")})}),o.jsx("li",{children:o.jsx(Ce,{to:`${r}/contact`,className:i,children:e("footer.contact")})}),o.jsx("li",{children:o.jsx("a",{href:"/blog",className:i,children:e("footer.blog")})}),o.jsx("li",{children:o.jsx(Ce,{to:"/methodologie",className:i,children:"Méthodologie"})})]})]}),o.jsxs("div",{children:[o.jsx("h4",{className:"!text-[13px] !font-bold uppercase tracking-[1.4px] text-[#0E3639] mb-[16px]",style:{fontFamily:"'Outfit', sans-serif"},children:e("footer.legal")}),o.jsxs("ul",{className:"space-y-[10px]",children:[o.jsx("li",{children:o.jsx(Ce,{to:`${r}/terms`,className:i,children:e("footer.terms")})}),o.jsx("li",{children:o.jsx(Ce,{to:`${r}/privacy`,className:i,children:e("footer.privacy")})}),o.jsx("li",{children:o.jsx(Ce,{to:`${r}/legal`,className:i,children:e("footer.legalNotice")})}),o.jsx("li",{children:o.jsx(Ce,{to:`${r}/data-deletion`,className:i,children:a("footer.dataDeletion","Suppression des données")})}),o.jsx("li",{children:o.jsx(Ce,{to:"/security-policy",className:i,children:a("footer.security","Sécurité")})}),o.jsx("li",{children:o.jsx("a",{href:"/about.html",className:i,children:e("footer.about")})}),o.jsx("li",{children:o.jsx("button",{type:"button",onClick:()=>Ej(),className:`${i} !p-0 !min-h-0 !rounded-none text-left bg-transparent`,style:{fontFamily:"inherit"},children:e("footer.manageCookies")})})]})]})]}),o.jsx("div",{className:"border-t border-[#EFEDE9] text-center",style:{marginTop:"36px",paddingTop:"24px"},children:o.jsxs("p",{className:"!text-[13px] text-[#8A8577]",children:["© ",new Date().getFullYear()," Arcanes. ",e("footer.allRightsReserved"),"."]})})]})})}const Zg=()=>{const{language:e,setLanguage:t}=Ge(),[n,r]=g.useState(!1),a=g.useRef(null),i=Ln(),s=xt();g.useEffect(()=>{const u=p=>{a.current&&!a.current.contains(p.target)&&r(!1)},m=p=>{p.key==="Escape"&&r(!1)};return document.addEventListener("mousedown",u),document.addEventListener("keydown",m),()=>{document.removeEventListener("mousedown",u),document.removeEventListener("keydown",m)}},[]);const l=u=>{t(u),r(!1);const m=vI(i.pathname);m&&m[u]!==i.pathname&&s(m[u])}
7003,d=e==="en"?"FR":e,c=[{code:"fr",label:"Français"},{code:"nl",label:"Nederlands"}];return o.jsxs("div",{className:"relative",ref:a,children:[o.jsxs("button",{type:"button",onClick:()=>r(!n),"aria-label":"Sélectionner la langue / Selecteer taal","aria-expanded":n,className:"inline-flex items-center gap-[5px] h-[40px] px-[10px] rounded-[10px] text-[14px] font-medium uppercase text-slate-600 hover:text-[#0E3639] hover:bg-slate-500/[0.06] transition-colors duration-200",style:{fontFamily:"Outfit, sans-serif"},children:[o.jsx("span",{children:d}),o.jsx(Er,{className:le("w-[14px] h-[14px] transition-transform duration-200",n&&"rotate-180"),strokeWidth:2})]}),n&&o.jsx("div",{className:"absolute right-0 mt-[8px] bg-white rounded-[12px] shadow-xl border border-slate-200 overflow-hidden z-50 py-[6px] animate-in fade-in-0 slide-in-from-top-2 duration-200",style:{minWidth:"168px"},children:c.map(u=>{const m=e===u.code;return o.jsxs("button",{type:"button",onClick:()=>l(u.code),className:le("w-full flex items-center justify-between gap-[12px] px-[14px] py-[9px] text-left text-[14px] transition-colors duration-200",m?"text-[#0E3639] font-semibold":"text-slate-600 hover:bg-slate-50 hover:text-[#0E3639]"),style:{fontFamily:"Outfit, sans-serif"},children:[o.jsx("span",{children:u.label}),o.jsx("span",{className:le("text-[11px] font-semibold uppercase tracking-wider",m?"text-[#D4AF37]":"text-slate-400"),children:u.code})]},u.code)})})]})};function Mn(e){const t=Object.prototype.toString.call(e);return e instanceof Date||typeof e=="object"&&t==="[object Date]"?new e.constructor(+e):typeof e=="number"||t==="[object Number]"||typeof e=="string"||t==="[object String]"?new Date(e):new Date(NaN)}function di(e,t){return e instanceof Date?new e.constructor(t):new Date(t)}const $A=6048e5,jO=864e5;let AO={};function Wu(){return AO}function cl(e,t){var l,d,c,u;const n=Wu(),r=(t==null?void 0:t.weekStartsOn)??((d=(l=t==null?void 0:t.locale)==null?void 0:l.options)==null?void 0:d.weekStartsOn)??n.weekStartsOn??((u=(c=n.locale)==null?void 0:c.options)==null?void 0:u.weekStartsOn)??0,a=Mn(e),i=a.getDay(),s=(i<r?7:0)+i-r;return a.setDate(a.getDate()-s),a.setHours(0,0,0,0),a}function Uc(e){return cl(e,{weekStartsOn:1})}function GA(e){const t=Mn(e),n=t.getFullYear(),r=di(e,0);r.setFullYear(n+1,0,4),r.setHours(0,0,0,0);const a=Uc(r),i=di(e,0);i.setFullYear(n,0,4),i.setHours(0,0,0,0);const s=Uc(i);return t.getTime()>=a.getTime()?n+1:t.getTime()>=s.getTime()?n:n-1}function n0(e){const t=Mn(e);return t.setHours(0,0,0,0),t}function r0(e){const t=Mn(e),n=new Date(Date.UTC(t.getFullYear(),t.getMonth(),t.getDate(),t.getHours(),t.getMinutes(),t.getSeconds(),t.getMilliseconds()));return n.setUTCFullYear(t.getFullYear()),+e-+n}function EO(e,t){const n=n0(e),r=n0(t),a=+n-r0(n),i=+r-r0(r);return Math.round((a-i)/jO)}function PO(e){const t=GA(e),n=di(e,0);return n.setFullYear(t,0,4),n.setHours(0,0,0,0),Uc(n)}function CO(e){return e instanceof Date||typeof e=="object"&&Object.prototype.toString.call(e)==="[object Date]"}function SO(e){if(!CO(e)&&typeof e!="number")return!1;const t=Mn(e);return!isNaN(Number(t))}function _O(e){const t=Mn(e),n=di(e,0);return n.setFullYear(t.getFullYear(),0,1),n.setHours(0,0,0,0),n}const TO={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXWeeks:{one:"about 1 week",other:"about {{count}} weeks"},xWeeks:{one:"1 week",other:"{{count}} weeks"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}}
7003,DO=(e,t,n)=>{let r;const a=TO[e];return typeof a=="string"?r=a:t===1?r=a.one:r=a.other.replace("{{count}}",t.toString()),n!=null&&n.addSuffix?n.comparison&&n.comparison>0?"in "+r:r+" ago":r};function os(e){return(t={})=>{const n=t.width?String(t.width):e.defaultWidth;return e.formats[n]||e.formats[e.defaultWidth]}}const RO={full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},zO={full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},IO={full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},qO={date:os({formats:RO,defaultWidth:"full"}),time:os({formats:zO,defaultWidth:"full"}),dateTime:os({formats:IO,defaultWidth:"full"})},NO={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"},LO=(e,t,n,r)=>NO[e];function Qn(e){return(t,n)=>{const r=n!=null&&n.context?String(n.context):"standalone";let a;if(r==="formatting"&&e.formattingValues){const s=e.defaultFormattingWidth||e.defaultWidth,l=n!=null&&n.width?String(n.width):s;a=e.formattingValues[l]||e.formattingValues[s]}else{const s=e.defaultWidth,l=n!=null&&n.width?String(n.width):e.defaultWidth;a=e.values[l]||e.values[s]}const i=e.argumentCallback?e.argumentCallback(t):t;return a[i]}}const BO={narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},MO={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},FO={narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},OO={narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},VO={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},WO={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},UO=(e,t)=>
7003{const n=Number(e),r=n%100;if(r>20||r<10)switch(r%10){case 1:return n+"st";case 2:return n+"nd";case 3:return n+"rd"}return n+"th"},$O={ordinalNumber:UO,era:Qn({values:BO,defaultWidth:"wide"}),quarter:Qn({values:MO,defaultWidth:"wide",argumentCallback:e=>e-1}),month:Qn({values:FO,defaultWidth:"wide"}),day:Qn({values:OO,defaultWidth:"wide"}),dayPeriod:Qn({values:VO,defaultWidth:"wide",formattingValues:WO,defaultFormattingWidth:"wide"})};function Xn(e){return(t,n={})=>{const r=n.width,a=r&&e.matchPatterns[r]||e.matchPatterns[e.defaultMatchWidth],i=t.match(a);if(!i)return null;const s=i[0],l=r&&e.parsePatterns[r]||e.parsePatterns[e.defaultParseWidth],d=Array.isArray(l)?HO(l,m=>m.test(s)):GO(l,m=>m.test(s));let c;c=e.valueCallback?e.valueCallback(d):d,c=n.valueCallback?n.valueCallback(c):c;const u=t.slice(s.length);return{value:c,rest:u}}}function GO(e,t){for(const n in e)if(Object.prototype.hasOwnProperty.call(e,n)&&t(e[n]))return n}function HO(e,t){for(let n=0;n<e.length;n++)if(t(e[n]))return n}function HA(e){return(t,n={})=>{const r=t.match(e.matchPattern);if(!r)return null;const a=r[0],i=t.match(e.parsePattern);if(!i)return null;let s=e.valueCallback?e.valueCallback(i[0]):i[0];s=n.valueCallback?n.valueCallback(s):s;const l=t.slice(a.length);return{value:s,rest:l}}}const KO=/^(\d+)(th|st|nd|rd)?/i,YO=/\d+/i,ZO={narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},JO={any:[/^b/i,/^(a|c)/i]},QO={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},XO={any:[/1/i,/2/i,/3/i,/4/i]},e6={narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},t6={narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},n6={narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},r6={narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},a6={narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},i6={any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},s6={ordinalNumber:HA({matchPattern:KO,parsePattern:YO,valueCallback:e=>parseInt(e,10)}),era:Xn({matchPatterns:ZO,defaultMatchWidth:"wide",parsePatterns:JO,defaultParseWidth:"any"}),quarter:Xn({matchPatterns:QO,defaultMatchWidth:"wide",parsePatterns:XO,defaultParseWidth:"any",valueCallback:e=>e+1}),month:Xn({matchPatterns:e6,defaultMatchWidth:"wide",parsePatterns:t6,defaultParseWidth:"any"}),day:Xn({matchPatterns:n6,defaultMatchWidth:"wide",parsePatterns:r6,defaultParseWidth:"any"}),dayPeriod:Xn({matchPatterns:a6,defaultMatchWidth:"any",parsePatterns:i6,defaultParseWidth:"any"})},o6={code:"en-US",formatDistance:DO,formatLong:qO,formatRelative:LO,localize:$O,match:s6,options:{weekStartsOn:0,firstWeekContainsDate:1}};function l6(e){const t=Mn(e);return EO(t,_O(t))+1}function d6(e){const t=Mn(e),n=+Uc(t)-+PO(t);return Math.round(n/$A)+1}function KA(e,t){var u,m,p,h;const n=Mn(e),r=n.getFullYear(),a=Wu(),i=(t==null?void 0:t.firstWeekContainsDate)??((m=(u=t==null?void 0:t.locale)==null?void 0:u.options)==null?void 0:m.firstWeekContainsDate)??a.firstWeekContainsDate??((h=(p=a.locale)==null?void 0:p.options)==null?void 0:h.firstWeekContainsDate)??1,s=di(e,0);s.setFullYear(r+1,0,i),s.setHours(0,0,0,0);const l=cl(s,t),d=di(e,0);d.setFullYear(r,0,i),d.setHours(0,0,0,0);const c=cl(d,t);return n.getTime()>=l.getTime()?r+1:n.getTime()>=c.getTime()?r:r-1}function c6(e,t){var l,d,c,u;const n=Wu(),r=(t==null?void 0:t.firstWeekContainsDate)??((d=(l=t==null?void 0:t.locale)==null?void 0:l.options)==null?void 0:d.firstWeekContainsDate)??n.firstWeekContainsDate??((u=(c=n.locale)==null?void 0:c.options)==null?void 0:u.firstWeekContainsDate)??1,a=KA(e,t),i=di(e,0);return i.setFullYear(a,0,r),i.setHours(0,0,0,0),cl(i,t)}function u6(e,t){const n=Mn(e),r=+cl(n,t)-+c6(n,t);return Math.round(r/$A)+1}function Ie(e,t){const n=e<0?"-":"",r=Math.abs(e).toString().padStart(t,"0");return n+r}const Nr={y(e,t){const n=e.getFullYear(),r=n>0?n:1-n;return Ie(t==="yy"?r%100:r,t.length)},M(e,t){const n=e.getMonth();return t==="M"?String(n+1):Ie(n+1,2)},d(e,t){return Ie(e.getDate(),t.length)},a(e,t){const n=e.getHours()/12>=1?"pm":"am";switch(t){case"a":case"aa":return n.toUpperCase();case"aaa":return n;case"aaaaa":return n[0];case"aaaa":default:return n==="am"?"a.m.":"p.m."}},h(e,t){return Ie(e.getHours()%12||12,t.length)},H(e,t){return Ie(e.getHours(),t.length)},m(e,t){return Ie(e.getMinutes(),t.length)},s(e,t){return Ie(e.getSeconds(),t.length)},S(e,t){const n=t.length,r=e.getMilliseconds(),a=Math.trunc(r*Math.pow(10,n-3));return Ie(a,t.length)}},Ti={am:"am",pm:"pm",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},a0={G:function(e,t,n){const r=e.getFullYear()>0?1:0;switch(t){case"G":case"GG":case"GGG":return n.era(r,{width:"abbreviated"});case"GGGGG":return n.era(r,{width:"narrow"});case"GGGG":default:return n.era(r,{width:"wide"})}},y:function(e,t,n){if(t==="yo"){const r=e.getFullYear(),a=r>0?r:1-r;return n.ordinalNumber(a,{unit:"year"})}return Nr.y(e,t)},Y:function(e,t,n,r){const a=KA(e,r),i=a>0?a:1-a;if(t==="YY"){const s=i%100;return Ie(s,2)}return t==="Yo"?n.ordinalNumber(i,{unit:"year"}):Ie(i,t.length)},R:function(e,t){const n=GA(e);return Ie(n,t.length)},u:function(e,t){const n=e.getFullYear();return Ie(n,t.length)},Q:function(e,t,n){const r=Math.ceil((e.getMonth()+1)/3);switch(t){case"Q":return String(r);case"QQ":return Ie(r,2);case"Qo":return n.ordinalNumber(r,{unit:"quarter"});case"QQQ":return n.quarter(r,{width:"abbreviated",context:"formatting"});case"QQQQQ":return n.quarter(r,{width:"narrow",context:"formatting"});case"QQQQ":default:return n.quarter(r,{width:"wide",context:"formatting"})}},q:function(e,t,n){const r=Math.ceil((e.getMonth()+1)/3);switch(t){case"q":return String(r);case"qq":return Ie(r,2);case"qo":return n.ordinalNumber(r,{unit:"quarter"});case"qqq":return n.quarter(r,{width:"abbreviated",context:"standalone"});case"qqqqq":return n.quarter(r,{width:"narrow",context:"standalone"});case"qqqq":default:return n.quarter(r,{width:"wide",context:"standalone"})}},M:function(e,t,n){const r=e.getMonth();switch(t){case"M":case"MM":return Nr.M(e,t);case"Mo":return n.ordinalNumber(r+1,{unit:"month"});case"MMM":return n.month(r,{width:"abbreviated",context:"formatting"});case"MMMMM":return n.month(r,{width:"narrow",context:"formatting"});case"MMMM":default:return n.month(r,{width:"wide",context:"formatting"})}},L:function(e,t,n){const r=e.getMonth();switch(t){case"L":return String(r+1);case"LL":return Ie(r+1,2);case"Lo":return n.ordinalNumber(r+1,{unit:"month"});case"LLL":return n.month(r,{width:"abbreviated",context:"standalone"});case"LLLLL":return n.month(r,{width:"narrow",context:"standalone"});case"LLLL":default:return n.month(r,{width:"wide",context:"standalone"})}},w:function(e,t,n,r){const a=u6(e,r);return t==="wo"?n.ordinalNumber(a,{unit:"week"}):Ie(a,t.length)},I:function(e,t,n){const r=d6(e);return t==="Io"?n.ordinalNumber(r,{unit:"week"}):Ie(r,t.length)},d:function(e,t,n){return t==="do"?n.ordinalNumber(e.getDate(),{unit:"date"}):Nr.d(e,t)},D:function(e,t,n){const r=l6(e);return t==="Do"?n.ordinalNumber(r,{unit:"dayOfYear"}):Ie(r,t.length)},E:function(e,t,n){const r=e.getDay();switch(t){case"E":case"EE":case"EEE":return n.day(r,{width:"abbreviated",context:"formatting"});case"EEEEE":return n.day(r,{width:"narrow",context:"formatting"});case"EEEEEE":return n.day(r,{width:"short",context:"formatting"});case"EEEE":default:return n.day(r,{width:"wide",context:"formatting"})}},e:function(e,t,n,r){const a=e.getDay(),i=(a-r.weekStartsOn+8)%7||7;switch(t){case"e":return String(i);case"ee":return Ie(i,2);case"eo":return n.ordinalNumber(i,{unit:"day"});case"eee":return n.day(a,{width:"abbreviated",context:"formatting"});case"eeeee":return n.day(a,{width:"narrow",context:"formatting"});case"eeeeee":return n.day(a,{width:"short",context:"formatting"});case"eeee":default:return n.day(a,{width:"wide",context:"formatting"})}},c:function(e,t,n,r){const a=e.getDay(),i=(a-r.weekStartsOn+8)%7||7;switch(t){case"c":return String(i);case"cc":return Ie(i,t.length);case"co":return n.ordinalNumber(i,{unit:"day"});case"ccc":return n.day(a,{width:"abbreviated",context:"standalone"});case"ccccc":return n.day(a,{width:"narrow",context:"standalone"});case"cccccc":return n.day(a,{width:"short",context:"standalone"});case"cccc":default:return n.day(a,{width:"wide",context:"standalone"})}},i:function(e,t,n){const r=e.getDay(),a=r===0?7:r;switch(t){case"i":return String(a);case"ii":return Ie(a,t.length);case"io":return n.ordinalNumber(a,{unit:"day"});case"iii":return n.day(r,{width:"abbreviated",context:"formatting"});case"iiiii":return n.day(r,{width:"narrow",context:"formatting"});case"iiiiii":return n.day(r,{width:"short",context:"formatting"});case"iiii":default:return n.day(r,{width:"wide",context:"formatting"})}},a:function(e,t,n){const a=e.getHours()/12>=1?"pm":"am";switch(t){case"a":case"aa":return n.dayPeriod(a,{width:"abbreviated",context:"formatting"});case"aaa":return n.dayPeriod(a,{width:"abbreviated",context:"formatting"}).toLowerCase();case"aaaaa":return n.dayPeriod(a,{width:"narrow",context:"formatting"});case"aaaa":default:return n.dayPeriod(a,{width:"wide",context:"formatting"})}},b:function(e,t,n){const r=e.getHours();let a;switch(r===12?a=Ti.noon:r===0?a=Ti.midnight:a=r/12>
7003=1?"pm":"am",t){case"b":case"bb":return n.dayPeriod(a,{width:"abbreviated",context:"formatting"});case"bbb":return n.dayPeriod(a,{width:"abbreviated",context:"formatting"}).toLowerCase();case"bbbbb":return n.dayPeriod(a,{width:"narrow",context:"formatting"});case"bbbb":default:return n.dayPeriod(a,{width:"wide",context:"formatting"})}},B:function(e,t,n){const r=e.getHours();let a;switch(r>=17?a=Ti.evening:r>=12?a=Ti.afternoon:r>=4?a=Ti.morning:a=Ti.night,t){case"B":case"BB":case"BBB":return n.dayPeriod(a,{width:"abbreviated",context:"formatting"});case"BBBBB":return n.dayPeriod(a,{width:"narrow",context:"formatting"});case"BBBB":default:return n.dayPeriod(a,{width:"wide",context:"formatting"})}},h:function(e,t,n){if(t==="ho"){let r=e.getHours()%12;return r===0&&(r=12),n.ordinalNumber(r,{unit:"hour"})}return Nr.h(e,t)},H:function(e,t,n){return t==="Ho"?n.ordinalNumber(e.getHours(),{unit:"hour"}):Nr.H(e,t)},K:function(e,t,n){const r=e.getHours()%12;return t==="Ko"?n.ordinalNumber(r,{unit:"hour"}):Ie(r,t.length)},k:function(e,t,n){let r=e.getHours();return r===0&&(r=24),t==="ko"?n.ordinalNumber(r,{unit:"hour"}):Ie(r,t.length)},m:function(e,t,n){return t==="mo"?n.ordinalNumber(e.getMinutes(),{unit:"minute"}):Nr.m(e,t)},s:function(e,t,n){return t==="so"?n.ordinalNumber(e.getSeconds(),{unit:"second"}):Nr.s(e,t)},S:function(e,t){return Nr.S(e,t)},X:function(e,t,n){const r=e.getTimezoneOffset();if(r===0)return"Z";switch(t){case"X":return s0(r);case"XXXX":case"XX":return Fa(r);case"XXXXX":case"XXX":default:return Fa(r,":")}},x:function(e,t,n){const r=e.getTimezoneOffset();switch(t){case"x":return s0(r);case"xxxx":case"xx":return Fa(r);case"xxxxx":case"xxx":default:return Fa(r,":")}},O:function(e,t,n){const r=e.getTimezoneOffset();switch(t){case"O":case"OO":case"OOO":return"GMT"+i0(r,":");case"OOOO":default:return"GMT"+Fa(r,":")}},z:function(e,t,n){const r=e.getTimezoneOffset();switch(t){case"z":case"zz":case"zzz":return"GMT"+i0(r,":");case"zzzz":default:return"GMT"+Fa(r,":")}},t:function(e,t,n){const r=Math.trunc(e.getTime()/1e3);return Ie(r,t.length)},T:function(e,t,n){const r=e.getTime();return Ie(r,t.length)}};function i0(e,t=""){const n=e>0?"-":"+",r=Math.abs(e),a=Math.trunc(r/60),i=r%60;return i===0?n+String(a):n+String(a)+t+Ie(i,2)}function s0(e,t){return e%60===0?(e>0?"-":"+")+Ie(Math.abs(e)/60,2):Fa(e,t)}function Fa(e,t=""){const n=e>0?"-":"+",r=Math.abs(e),a=Ie(Math.trunc(r/60),2),i=Ie(r%60,2);return n+a+t+i}const o0=(e,t)=>{switch(e){case"P":return t.date({width:"short"});case"PP":return t.date({width:"medium"});case"PPP":return t.date({width:"long"});case"PPPP":default:return t.date({width:"full"})}},YA=(e,t)=>
7003{switch(e){case"p":return t.time({width:"short"});case"pp":return t.time({width:"medium"});case"ppp":return t.time({width:"long"});case"pppp":default:return t.time({width:"full"})}},m6=(e,t)=>{const n=e.match(/(P+)(p+)?/)||[],r=n[1],a=n[2];if(!a)return o0(e,t);let i;switch(r){case"P":i=t.dateTime({width:"short"});break;case"PP":i=t.dateTime({width:"medium"});break;case"PPP":i=t.dateTime({width:"long"});break;case"PPPP":default:i=t.dateTime({width:"full"});break}return i.replace("{{date}}",o0(r,t)).replace("{{time}}",YA(a,t))},p6={p:YA,P:m6},g6=/^D+$/,h6=/^Y+$/,f6=["D","DD","YY","YYYY"];function v6(e){return g6.test(e)}function b6(e){return h6.test(e)}function y6(e,t,n){const r=w6(e,t,n);if(console.warn(r),f6.includes(e))throw new RangeError(r)}function w6(e,t,n){const r=e[0]==="Y"?"years":"days of the month";return`Use \`${e.toLowerCase()}\` instead of \`${e}\` (in \`${t}\`) for formatting ${r} to the input \`${n}\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`}const k6=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,x6=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,j6=/^'([^]*?)'?$/,A6=/''/g,E6=/[a-zA-Z]/;function P6(e,t,n){var u,m,p,h,b,f,k,w;const r=Wu(),a=(n==null?void 0:n.locale)??r.locale??o6,i=(n==null?void 0:n.firstWeekContainsDate)??((m=(u=n==null?void 0:n.locale)==null?void 0:u.options)==null?void 0:m.firstWeekContainsDate)??r.firstWeekContainsDate??((h=(p=r.locale)==null?void 0:p.options)==null?void 0:h.firstWeekContainsDate)??1,s=(n==null?void 0:n.weekStartsOn)??((f=(b=n==null?void 0:n.locale)==null?void 0:b.options)==null?void 0:f.weekStartsOn)??r.weekStartsOn??((w=(k=r.locale)==null?void 0:k.options)==null?void 0:w.weekStartsOn)??0,l=Mn(e);if(!SO(l))throw new RangeError("Invalid time value");let d=t.match(x6).map(v=>{const y=v[0];if(y==="p"||y==="P"){const x=p6[y];return x(v,a.formatLong)}return v}).join("").match(k6).map(v=>{if(v==="''")return{isToken:!1,value:"'"};const y=v[0];if(y==="'")return{isToken:!1,value:C6(v)};if(a0[y])return{isToken:!0,value:v};if(y.match(E6))throw new RangeError("Format string contains an unescaped latin alphabet character `"+y+"`");return{isToken:!1,value:v}});a.localize.preprocessor&&(d=a.localize.preprocessor(l,d));const c={firstWeekContainsDate:i,weekStartsOn:s,locale:a};return d.map(v=>{if(!v.isToken)return v.value;const y=v.value;(!(n!=null&&n.useAdditionalWeekYearTokens)&&b6(y)||!(n!=null&&n.useAdditionalDayOfYearTokens)&&v6(y))&&y6(y,t,String(e));const x=a0[y[0]];return x(l,y,a.localize,c)}).join("")}function C6(e){const t=e.match(j6);return t?t[1].replace(A6,"'"):e}const S6={lessThanXSeconds:{one:"moins dâune seconde",other:"moins de {{count}} secondes"},xSeconds:{one:"1 seconde",other:"{{count}} secondes"},halfAMinute:"30 secondes",lessThanXMinutes:{one:"moins dâune minute",other:"moins de {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"environ 1 heure",other:"environ {{count}} heures"},xHours:{one:"1 heure",other:"{{count}} heures"},xDays:{one:"1 jour",other:"{{count}} jours"},aboutXWeeks:{one:"environ 1 semaine",other:"environ {{count}} semaines"},xWeeks:{one:"1 semaine",other:"{{count}} semaines"},aboutXMonths:{one:"environ 1 mois",other:"environ {{count}} mois"},xMonths:{one:"1 mois",other:"{{count}} mois"},aboutXYears:{one:"environ 1 an",other:"environ {{count}} ans"},xYears:{one:"1 an",other:"{{count}} ans"},overXYears:{one:"plus dâun an",other:"plus de {{count}} ans"},almostXYears:{one:"presquâun an",other:"presque {{count}} ans"}},_6=(e,t,n)=>{let r;const a=S6[e];return typeof a=="string"?r=a:t===1?r=a.one:r=a.other.replace("{{count}}",String(t)),n!=null&&n.addSuffix?n.comparison&&n.comparison>0?"dans "+r:"il y a "+r:r},T6={full:"EEEE d MMMM y",long:"d MMMM y",medium:"d MMM y",short:"dd/MM/y"},D6={full:"HH:mm:ss zzzz",long:"HH:mm:ss z",medium:"HH:mm:ss",short:"HH:mm"},R6={full:"{{date}} 'à ' {{time}}",long:"{{date}} 'à ' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},z6={date:os({formats:T6,defaultWidth:"full"}),time:os({formats:D6,defaultWidth:"full"}),dateTime:os({formats:R6,defaultWidth:"full"})},I6={lastWeek:"eeee 'dernier à ' p",yesterday:"'hier à ' p",today:"'aujourdâhui à ' p",tomorrow:"'demain à ' p'",nextWeek:"eeee 'proch
7003ain à ' p",other:"P"},q6=(e,t,n,r)=>I6[e],N6={narrow:["av. J.-C","ap. J.-C"],abbreviated:["av. J.-C","ap. J.-C"],wide:["avant Jésus-Christ","après Jésus-Christ"]},L6={narrow:["T1","T2","T3","T4"],abbreviated:["1er trim.","2ème trim.","3ème trim.","4ème trim."],wide:["1er trimestre","2ème trimestre","3ème trimestre","4ème trimestre"]},B6={narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],wide:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]},M6={narrow:["D","L","M","M","J","V","S"],short:["di","lu","ma","me","je","ve","sa"],abbreviated:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],wide:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"]},F6={narrow:{am:"AM",pm:"PM",midnight:"minuit",noon:"midi",morning:"mat.",afternoon:"ap.m.",evening:"soir",night:"mat."},abbreviated:{am:"AM",pm:"PM",midnight:"minuit",noon:"midi",morning:"matin",afternoon:"après-midi",evening:"soir",night:"matin"},wide:{am:"AM",pm:"PM",midnight:"minuit",noon:"midi",morning:"du matin",afternoon:"de lâaprès-midi",evening:"du soir",night:"du matin"}},O6=(e,t)=>{const n=Number(e),r=t==null?void 0:t.unit;if(n===0)return"0";const a=["year","week","hour","minute","second"];let i;return n===1?i=r&&a.includes(r)?"ère":"er":i="ème",n+i},V6=["MMM","MMMM"],W6={preprocessor:(e,t)=>e.getDate()===1||!t.some(r=>r.isToken&&V6.includes(r.value))?t:t.map(r=>r.isToken&&r.value==="do"?{isToken:!0,value:"d"}:r),ordinalNumber:O6,era:Qn({values:N6,defaultWidth:"wide"}),quarter:Qn({values:L6,defaultWidth:"wide",argumentCallback:e=>e-1}),month:Qn({values:B6,defaultWidth:"wide"}),day:Qn({values:M6,defaultWidth:"wide"}),dayPeriod:Qn({values:F6,defaultWidth:"wide"})},U6=/^(\d+)(ième|ère|ème|er|e)?/i,$6=/\d+/i,G6={narrow:/^(av\.J\.C|ap\.J\.C|ap\.J\.-C)/i,abbreviated:/^(av\.J\.-C|av\.J-C|apr\.J\.-C|apr\.J-C|ap\.J-C)/i,wide:/^(avant Jésus-Christ|après Jésus-Christ)/i},H6={any:[/^av/i,/^ap/i]},K6={narrow:/^T?[1234]/i,abbreviated:/^[1234](er|ème|e)? trim\.?/i,wide:/^[1234](er|ème|e)? trimestre/i},Y6={any:[/1/i,/2/i,/3/i,/4/i]},Z6={narrow:/^[jfmasond]/i,abbreviated:/^(janv|févr|mars|avr|mai|juin|juill|juil|août|sept|oct|nov|déc)\.?/i,wide:/^(janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i},J6={narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^av/i,/^ma/i,/^juin/i,/^juil/i,/^ao/i,/^s/i,/^o/i,/^n/i,/^d/i]},Q6={narrow:/^[lmjvsd]/i,short:/^(di|lu|ma|me|je|ve|sa)/i,abbreviated:/^(dim|lun|mar|mer|jeu|ven|sam)\.?/i,wide:/^(dimanche|lundi|mardi|mercredi|jeudi|vendredi|samedi)/i},X6={narrow:[/^d/i,/^l/i,/^m/i,/^m/i,/^j/i,/^v/i,/^s/i],any:[/^di/i,/^lu/i,/^ma/i,/^me/i,/^je/i,/^ve/i,/^sa/i]},eV={narrow:/^(a|p|minuit|midi|mat\.?|ap\.?m\.?|soir|nuit)/i,any:/^([ap]\.?\s?m\.?|du matin|de l'après[-\s]midi|du soir|de la nuit)/i},tV={any:{am:/^a/i,pm:/^p/i,midnight:/^min/i,noon:/^mid/i,morning:/mat/i,afternoon:/ap/i,evening:/soir/i,night:/nuit/i}},nV={ordinalNumber:HA({matchPattern:U6,parsePattern:$6,valueCallback:e=>parseInt(e)}),era:Xn({matchPatterns:G6,defaultMatchWidth:"wide",parsePatterns:H6,defaultParseWidth:"any"}),quarter:Xn({matchPatterns:K6,defaultMatchWidth:"wide",parsePatterns:Y6,defaultParseWidth:"any",valueCallback:e=>e+1}),month:Xn({matchPatterns:Z6,defaultMatchWidth:"wide",parsePatterns:J6,defaultParseWidth:"any"}),day:Xn({matchPatterns:Q6,defaultMatchWidth:"wide",parsePatterns:X6,defaultParseWidth:"any"}),dayPeriod:Xn({matchPatterns:eV,defaultMatchWidth:"any",parsePatterns:tV,defaultParseWidth:"any"})},rV={code:"fr",formatDistance:_6,formatLong:z6,formatRelative:q6,localize:W6,match:nV,options:{weekStartsOn:1,firstWeekContainsDate:4}};function aV(){const[e,t]=g.useState({isPremium:!1,accountType:null,purchasedCredits:0,isLoading:!0});return g.useEffect(()=>{const n=async()=>{var a,i;try{const{data:{user:s}}=await de.auth.getUser();if(!s){t({isPremium:!1,accountType:null,purchasedCredits:0,isLoading:!1});return}const[l,d]=await Promise.all([de.from("profiles").select("account_type").eq("id",s.id).single(),de.from("user_credits").select("purchased_credits").eq("user_id",s.id).maybeSingle()]),c=(a=l.data)==null?void 0:a.account_type,u=((i=d.data)==null?void 0:i.purchased_credits)||0,m=c==="client"||u>=10;
7003t({isPremium:m,accountType:c,purchasedCredits:u,isLoading:!1})}catch(s){console.error("Error checking premium status:",s),t({isPremium:!1,accountType:null,purchasedCredits:0,isLoading:!1})}};n();const{data:{subscription:r}}=de.auth.onAuthStateChange(()=>{n()});return()=>{r.unsubscribe()}},[]),e}function iV({userId:e,transparentMode:t}){const[n,r]=g.useState(!1),[a,i]=g.useState([]),[s,l]=g.useState(0),[d,c]=g.useState(!0),[u,m]=g.useState(!0),p=g.useRef(null),{t:h}=Ge();g.useEffect(()=>{const v=y=>{p.current&&!p.current.contains(y.target)&&r(!1)};return document.addEventListener("mousedown",v),()=>document.removeEventListener("mousedown",v)},[]),g.useEffect(()=>{e?b():c(!1)},[e]);const b=async()=>{if(!e){c(!1);return}try{const{data:v,error:y}=await de.from("notifications").select("*").eq("user_id",e).order("created_at",{ascending:!1}).limit(5);if(y){y.code==="42P01"||y.message.includes("does not exist")?m(!1):console.error("Error loading notifications:",y),c(!1);return}i(v||[]),l((v==null?void 0:v.filter(x=>!x.read).length)||0)}catch(v){console.error("Error loading notifications:",v),m(!1)}finally{c(!1)}},f=async v=>{if(u)try{await de.from("notifications").update({read:!0}).eq("id",v),i(y=>y.map(x=>x.id===v?{...x,read:!0}:x)),l(y=>Math.max(0,y-1))}catch(y){console.error("Error marking notification as read:",y)}},k=async()=>{if(!(!e||!u))try{await de.from("notifications").update({read:!0}).eq("user_id",e).eq("read",!1),i(v=>v.map(y=>({...y,read:!0}))),l(0)}catch(v){console.error("Error marking all as read:",v)}},w=v=>{switch(v){case"success":return o.jsx(fa,{className:"h-[16px] w-[16px] text-green-500"});case"warning":return o.jsx(A_,{className:"h-[16px] w-[16px] text-amber-500"});case"reward":return o.jsx(Ac,{className:"h-[16px] w-[16px] text-[#D4AF37]"});default:return o.jsx(Ux,{className:"h-[16px] w-[16px] text-[#0E3639]"})}};return o.jsx("div",{className:"relative",ref:p,children:n&&o.jsxs("div",{className:"absolute right-0 mt-[8px] w-[320px] sm:w-[384px] bg-white rounded-[16px] shadow-2xl border border-slate-200 overflow-hidden z-50 animate-in fade-in-0 slide-in-from-top-2 duration-200",children:[o.jsxs("div",{className:"flex items-center justify-between px-[16px] py-[12px] border-b border-slate-100 bg-slate-50/50",children:[o.jsx("h3",{className:"font-semibold text-[#0E3639]",children:"Notifications"}),s>0&&o.jsx("button",{type:"button",onClick:k,className:"text-[12px] font-medium text-[#D4AF37] hover:text-[#B8960C] transition-colors",children:h("header.markAllRead")||"Tout marquer comme lu"})]}),o.jsx("div",{className:"max-h-[320px] overflow-y-auto",children:d?o.jsx("div",{className:"p-[16px] space-y-[12px]",children:[1,2,3].map(v=>o.jsxs("div",{className:"animate-pulse flex gap-[12px]",children:[o.jsx("div",{className:"w-[32px] h-[32px] bg-slate-200 rounded-[8px]"}),o.jsxs("div",{className:"flex-1 space-y-[8px]",children:[o.jsx("div",{className:"h-[16px] bg-slate-200 rounded w-[12px]/4"}),o.jsx("div",{className:"h-[12px] bg-slate-100 rounded w-[4px]/2"})]})]},v))}):u?a.length===0?o.jsxs("div",{className:"p-[32px] text-center",children:[o.jsx("div",{className:"w-[48px] h-[48px] bg-slate-100 rounded-full flex items-center justify-center mx-auto mb-[12px]",children:o.jsx(og,{className:"w-[24px] h-[24px] text-slate-300"})}),o.jsx("p",{className:"text-slate-500 text-[14px]",children:h("header.noNotifications")||"Aucune notification"}),o.jsx("p",{className:"text-slate-400 text-[12px] mt-[4px]",children:h("header.noNotificationsDesc")||"Vous serez notifié des mises à jour importantes"})]}):a.map(v=>o.jsxs("div",{onClick:()=>!v.read&&f(v.id),className:le("flex items-start gap-[12px] px-[16px] py-[12px] transition-colors cursor-pointer border-b border-slate-50 last:border-0",v.read?"bg-white hover:bg-slate-50":"bg-[#D4AF37]/5 hover:bg-[#D4AF37]/10"),children:[o.jsx("div",{className:le("w-[32px] h-[32px] rounded-[8px] flex items-center justify-center flex-shrink-0",v.read?"bg-slate-100":"bg-white border border-slate-200"),children:w(v.type)}),o.jsxs("div",{className:"flex-1 min-w-0",children:[o.jsxs("div",{className:"flex items-start justify-between gap-[8px]",children:[o.jsx("p",{className:le("text-[14px] truncate",v.read?"text-slate-700":"font-medium text-[#0E3639]"),children:v.title}),!v.read&&o.jsx("span",{className:"w-[8px] h-[8px] bg-[#D4AF37] rounded-full flex-shrink-0 mt-[6px]"})]}),o.jsx("p",{className:"text-[12px] text-slate-500 line-clamp-2 mt-[2px]",children:v.message}),o.jsx("p",{className:"text-[12px] text-slate-400 mt-[4px]",children:P6(new Date(v.created_at),"d MMM à HH:mm",{locale:rV})})]})]},v.id)):o.jsxs("div",{className:"p-[32px] text-center",children:[o.jsx("div",{className:"w-[48px] h-[48px] bg-slate-100 rounded-full flex items-center justify-center mx-auto mb-[12px]",children:o.jsx(og,{className:"w-[24px] h-[24px] text-slate-300"})}),o.jsx("p",{className:"text-slate-500 text-[14px]",children:h("header.notificationsSoon")||"Notifications bientôt disponibles"}),o.jsx("p",{className:"text-slate-400 text-[12px] mt-[4px]",children:h("header.notificationsSoonDesc")||"Cette fonctionnalité arrive prochainement"})]})}),a.length>0&&u&&o.jsx("div",{className:"border-t border-slate-100 p-[8px]",children:o.jsx(Ce,{to:"/settings?tab=notifications",onClick:()=>r(!1),className:"block w-full text-center text-[14px] font-medium text-[#0E3639] hover:text-[#D4AF37] py-[8px] rounded-[8px] hover:bg-slate-50 transition-colors",children:h("header.viewAllNotifications")||"Voir toutes les n
7003otifications"})})]})})}function sV({userId:e,userEmail:t,transparentMode:n}){const r=xt(),[a,i]=g.useState(!1),[s,l]=g.useState(""),[d,c]=g.useState(""),[u,m]=g.useState(!1),p=g.useRef(null),{t:h}=Ge(),{isPremium:b,isLoading:f}=aV();g.useEffect(()=>{const x=A=>{p.current&&!p.current.contains(A.target)&&i(!1)};return document.addEventListener("mousedown",x),()=>document.removeEventListener("mousedown",x)},[]),g.useEffect(()=>{e&&k()},[e]);const k=async()=>{if(e)try{const{data:x}=await de.from("profiles").select("username, account_type").eq("id",e).single();x!=null&&x.username&&l(x.username),x!=null&&x.account_type&&c(x.account_type);const{data:A}=await de.from("agent_profiles").select("user_id").eq("user_id",e).is("revoked_at",null).maybeSingle();m(!!A)}catch(x){console.error("Error loading profile:",x)}},w=async()=>{try{await de.auth.signOut(),st.success(h("header.logoutSuccess")||"Déconnexion réussie"),r("/")}catch(x){console.error("Logout error:",x),st.error(h("header.logoutError")||"Erreur lors de la déconnexion")}},v=()=>s?s.substring(0,2).toUpperCase():t?t.substring(0,2).toUpperCase():"U",y=x=>{i(!1),setTimeout(()=>{r(x)},100)};return o.jsxs("div",{className:"relative",ref:p,children:[o.jsxs("button",{type:"button",onClick:()=>i(!a),className:le("flex items-center gap-[8px] pl-[6px] pr-[12px] h-[44px] rounded-[12px] font-semibold transition-all duration-300",a?"bg-[#0E3639] text-white":"bg-[#0E3639] text-white hover:bg-[#0b2a2d]"),children:[b&&!f&&o.jsx(dg,{className:"w-[16px] h-[16px] text-[#D4AF37] premium-crown-animated",strokeWidth:2.5,fill:"#D4AF37"}),o.jsx("div",{className:"w-[32px] h-[32px] rounded-[8px] bg-white/20 flex items-center justify-center text-[14px] font-bold",children:v()}),o.jsx("span",{className:"hidden sm:inline text-[14px]",children:h("common.myAccount")||"Mon Compte"}),o.jsx(Er,{className:le("w-[16px] h-[16px] transition-transform duration-200",a&&"rotate-180")})]}),a&&o.jsxs("div",{className:"absolute right-0 mt-[8px] w-[256px] bg-white rounded-[16px] shadow-2xl border border-slate-200 overflow-hidden z-50 animate-in fade-in-0 slide-in-from-top-2 duration-200",children:[o.jsx("div",{className:"px-[16px] py-[16px] bg-gradient-to-br from-[#0E3639] to-[#1A5F63]",children:o.jsxs("div",{className:"flex items-center gap-[12px]",children:[o.jsxs("div",{className:"w-[48px] h-[48px] rounded-[12px] bg-white/20 flex items-center justify-center text-white font-bold text-[18px] relative",children:[v(),b&&o.jsx(dg,{className:"absolute -top-[4px] -right-[4px] w-[16px] h-[16px] text-[#D4AF37]",strokeWidth:2.5,fill:"#D4AF37"})]}),o.jsxs("div",{className:"flex-1 min-w-0",children:[o.jsxs("div",{className:"flex items-center gap-[8px]",children:[o.jsx("p",{className:"font-semibold text-white truncate",children:s||h("header.defaultUser")||"Utilisateur"}),b&&o.jsx("span",{className:"premium-badge text-[9px] py-[2px] px-[6px]",children:"Premium"})]}),o.jsx("p",{className:"text-white/70 text-[14px] truncate",children:t})]})]})}),o.jsxs("div",{className:"py-[8px]",children:[o.jsxs("button",{type:"button",onClick:()=>y(d==="agent_pro"?"/pro":"/dashboard"),className:"w-full flex items-center gap-[12px] px-[16px] py-[10px] text-left text-slate-700 hover:bg-slate-50 hover:text-[#0E3639] transition-colors",children:[o.jsx($x,{className:"w-[16px] h-[16px] text-slate-400"}),o.jsx("span",{className:"text-[14px] font-medium",children:h("header.dashboard")||"Dashboard"})]}),u&&o.jsxs("button",{type:"button",onClick:()=>y("/pro"),className:"w-full flex items-center gap-[12px] px-[16px] py-[10px] text-left text-slate-700 hover:bg-slate-50 hover:text-[#0E3639] transition-colors",children:[o.jsx(nf,{className:"w-[16px] h-[16px] text-[#D4AF37]"}),o.jsx("span",{className:"text-[14px] font-medium",children:"Espace Pro"})]}),o.jsxs("button",{type:"button",onClick:()=>y("/settings?tab=profile"),className:"w-full flex items-center gap-[12px] px-[16px] py-[10px] text-left text-slate-700 hover:bg-slate-50 hover:text-[#0E3639] transition-colors",children:[o.jsx(Ec,{className:"w-[16px] h-[16px] text-slate-400"}),o.jsx("span",{className:"text-[14px] font-medium",children:h("header.myProfile")||"Mon profil"})]}),o.jsxs("button",{type:"button",onClick:()=>y("/settings"),className:"w-full flex items-center gap-[12px] px-[16px] py-[10px] text-left text-slate-700 hover:bg-slate-50 hover:text-[#0E3639] transition-colors",children:[o.jsx(lf,{className:"w-[16px] h-[16px] text-slate-400"}),o.jsx("span",{className:"text-[14px] font-medium",children:h("header.settings")||"Paramètres"})]}),o.jsxs("button",{type:"button",onClick:()=>y("/tarifs"),className:"w-full flex items-center gap-[12px] px-[16px] py-[10px] text-left text-slate-700 hover:bg-slate-50 hover:text-[#0E3639] transition-colors",children:[o.jsx(T_,{className:"w-[16px] h-[16px] text-slate-400"}),o.jsx("span",{className:"text-[14px] font-medium",children:h("header.myCredits")||"Mes crédits"})]})]}),o.jsx("div",{className:"border-t border-slate-100 py-[8px]",children:o.jsxs("button",{type:"button",onClick:()=>{i(!1),w()},className:"w-full flex items-center gap-[12px] px-[16px] py-[10px] text-left text-red-600 hover:bg-red-50 transition-colors",children:[o.jsx(Kx,{className:"w-[16px] h-[16px]"}),o.jsx("span",{className:"text-[14px] font-medium",children:h("header.logout")||"Déconnexion"})]})})]})]})}function Qd(e){return e.group!==void 0}function oV({item:e,currentPath:t,transparentMode:n}){const[r,a]=g.useState(!1),[i,s]=g.useState({}),l=g.useRef(null),d=g.useRef(null);g.useEffect(()=>{const f=w=>{l.current&&!l.current.contains(w.target)&&a(!1)},k=w=>{w.key==="Escape"&&a(!1)};return document.addEventListener("mousedown",f),document.addEventListener("keydown",k),()=>{document.removeEventListener("mousedown",f),document.removeEventListener("keydown",k)}},[]);const u=e.children.flatMap(f=>Qd(f)?f.items:[f]).some(f=>t===f.href||f.href!=="/"&&t.startsWith(f.href)),m=e.children.some((f,k)=>Qd(f)&&!!i[k]),p=()=>{d.current&&window.clearTimeout(d.current),a(!0)},h=()=>{d.current=window.setTimeout(()=>a(!1),160)},b=f=>{const k=t===f.href||f.href!=="/"&&t.startsWith(f.href);return o.jsx(Ce,{to:f.href,onClick:()=>a(!1),className:le("block px-[16px] py-[8px] text-[14px] font-medium transition-colors rounded-[8px]",k?"text-[#D4AF37] bg-[#D4AF37]/5":"text-slate-700 hover:bg-slate-50 hover:text-[#0E3639]"),children:f.label},f.label)};return o.jsxs("div",{className:"relative",ref:l,onMouseEnter:p,onMouseLeave:h,children:[o.jsxs("button",{type:"button",onClick:()=>a(f=>!f),"aria-expanded":r,className:le("relative inline-flex items-center h-[44px] gap-[5px] p-0 leading-none font-medium text-[16px] whitespace-nowrap transition-all duration-300 group",u?"text-[#D4AF37]":n?"text-[#0F4C4C]/75 hover:text-[#B88A2E]":"text-slate-600 hover:text-[#0E3639]"),children:[e.label,o.jsx(Er,{className:le("w-[14px] h-[14px] transition-transform duration-200",r&&"rotate-180")}
7003),o.jsx("span",{className:le("absolute left-0 bottom-[8px] h-[2px] rounded-full transition-all duration-300",u?"w-full bg-[#D4AF37]":"w-0 group-hover:w-full bg-gradient-to-r from-[#D4AF37] to-[#B8960C]")})]}),r&&o.jsx("div",{className:le("absolute left-0 top-full mt-[12px] bg-white rounded-[16px] shadow-2xl border border-slate-200 overflow-hidden z-50 animate-in fade-in-0 slide-in-from-top-2 duration-200 py-[8px]",m?"w-[420px]":"w-[224px]"),children:e.children.map((f,k)=>Qd(f)?o.jsxs("div",{className:"mt-[8px] pt-[8px] border-t border-slate-100 first:mt-0 first:pt-0 first:border-t-0",children:[o.jsxs("button",{type:"button",onClick:()=>s(w=>({...w,[k]:!w[k]})),"aria-expanded":!!i[k],className:"w-full flex items-center justify-between gap-[8px] px-[16px] py-[8px] text-left text-slate-400 font-semibold uppercase tracking-wider hover:text-[#0E3639] transition-colors",style:{fontSize:"11px"},children:[o.jsx("span",{children:f.group}),o.jsx(Er,{className:le("w-[14px] h-[14px] shrink-0 transition-transform duration-200",i[k]&&"rotate-180"),strokeWidth:2})]}),i[k]&&o.jsx("div",{className:"grid grid-cols-2 gap-x-[4px] px-[8px]",children:f.items.map(w=>b(w))})]},`grp-${k}`):o.jsx("div",{className:"px-[8px]",children:b(f)},`leaf-${k}`))})]})}const lV=({isLoggedIn:e,totalCredits:t,transparentOnTop:n=!1})=>{const[r,a]=g.useState(!1),[i,s]=g.useState(null),[l,d]=g.useState(!1),[c,u]=g.useState(),[m,p]=g.useState(),{t:h}=Ge(),b=xt(),f=Ln(),k=(E,j)=>{const P=h(E);return P&&P!==E?P:j},w=f.pathname;g.useEffect(()=>{e&&(async()=>{const{data:{user:j}}=await de.auth.getUser();j&&(u(j.id),p(j.email))})()},[e]),g.useEffect(()=>{const E=P=>{document.documentElement.style.setProperty("--header-h",P?"66px":"78px")},j=()=>{const P=window.scrollY>20;d(P),E(P)};return j(),window.addEventListener("scroll",j,{passive:!0}),()=>window.removeEventListener("scroll",j)},[]);const v=(h("header.explore")||"").toLowerCase()==="verkennen"||document.documentElement.lang==="nl",y=v?[{label:"Antwerpen",href:"/provincie/antwerpen"},{label:"Vlaams-Brabant",href:"/provincie/vlaams-brabant"},{label:"Waals-Brabant",href:"/provincie/waals-brabant"},{label:"Brussel-Hoofdstad",href:"/provincie/brussel"},{label:"West-Vlaanderen",href:"/provincie/west-vlaanderen"},{label:"Oost-Vlaanderen",href:"/provincie/oost-vlaanderen"},{label:"Henegouwen",href:"/provincie/henegouwen"},{label:"Luik",href:"/provincie/luik"},{label:"Limburg",href:"/provincie/limburg"},{label:"Luxemburg",href:"/provincie/luxemburg"},{label:"Namen",href:"/provincie/namen"}]:[{label:"Anvers",href:"/province/anvers"},{label:"Brabant flamand",href:"/province/brabant-flamand"},{label:"Brabant wallon",href:"/province/brabant-wallon"},{label:"Bruxelles-Capitale",href:"/province/bruxelles"},{label:"Flandre occidentale",href:"/province/flandre-occidentale"},{label:"Flandre orientale",href:"/province/flandre-orientale"},{label:"Hainaut",href:"/province/hainaut"},{label:"Liège",href:"/province/liege"},{label:"Limbourg",href:"/province/limbourg"},{label:"Luxembourg",href:"/province/luxembourg"},{label:"Namur",href:"/province/namur"}],x=[{label:h("header.analysis")||"Analyse",href:"/free-analyse",moat:!0},{label:h("header.mvv")||"Ma Vraie Valeur",href:"/ma-vraie-valeur",moat:!0},{label:h("header.simulators")||"Simulateurs",href:"/simulateur"},{label:h("header.explore")||"Explorer",children:[{label:h("header.observatory")||"Observatoire",href:"/observatoire"},{label:h("header.communes")||"Communes",href:"/communes"},{group:v?"Per provincie":"Par province",items:y}]},{label:h("header.pricing")||"Tarifs",href:"/tarifs"},{label:h("header.resources")||"Ressources",children:[{label:h("header.blog")||"Blog",href:"/blog"},{label:h("header.faq")||"FAQ",href:"/faq"},{label:h("header.contact")||"Contact",href:"/contact"}]}],A=n&&!l;return o.jsxs(o.Fragment,{children:[o.jsx("style",{children:` 7004 @keyframes arcanes-nav-grad-shift { 7005 0%, 100% { background-position: 0% 50%; } 7006 50% { background-position: 100% 50%; } 7007 } 7008 .arcanes-nav-grad { color: #0E3639; } 7009 @supports ((-webkit-background-clip: text) or (background-clip: text)) { 7010 .arcanes-nav-grad { 7011 background-image: linear-gradient(135deg, #D4AF37 0%, #e879f9 50%, #0E3639 100%); 7012 background-size: 200% 200%; 7013 -webkit-background-clip: text; 7014 background-clip: text; 7015 color: transparent; 7016 animation: arcanes-nav-grad-shift 4s ease infinite; 7017 } 7018 } 7019 @media (prefers-reduced-motion: reduce) { 7020 .arcanes-nav-grad { animation: none; background-position: 50% 50%; } 7021 } 7022 `}),o.jsxs("header",{className:le("fixed top-0 left-0 right-0 z-50 w-full transition-all duration-500 ease-out",l?"bg-white/90 backdrop-blur-xl shadow-sm border-b border-slate-200/70":n?"bg-white/55 backdrop-blur-md backdrop-saturate-150 border-b border-white/40":"bg-[#FAFAFA] border-b border-slate-200/60"),style:{height:l?"66px":"78px",fontFamily:"'Outfit', sans-serif"},children:[o.jsxs("div",{className:"flex items-center justify-between h-full w-full max-w-[2000px] mx-auto px-[20px] md:px-[32px] xl:px-[44px] 2xl:px-[64px]",children:[o.jsx(Ce,{to:"/",className:"flex-shrink-0 transition-transform duration-300 hover:scale-[1.02]",children:o.jsx(lv,{size:"medium"})}),o.jsx("nav",{className:"hidden xl:flex items-center shrink-0 gap-[30px] 2xl:gap-[38px]",children:x.map(E=>"children"in E?o.jsx(oV,{item:E,currentPath:w,transparentMode:A},E.label):(()=>{const j=w===E.href||E.href!=="/"&&w.startsWith(E.href);return o.jsxs(Ce,{to:E.href,className:le("relative inline-flex items-center h-[44px] leading-none text-[16px] whitespace-nowrap transition-all duration-300 group",E.moat?"font-bold":"font-medium",E.moat?"arcanes-nav-grad":j?"text-[#D4AF37]":A?"text-[#0F4C4C]/75 hover:text-[#B88A2E]":"text-slate-600 hover:text-[#0E3639]"),children:[E.label,o.jsx("span",{className:le("absolute left-0 bottom-[8px] h-[2px] rounded-full transition-all duration-300",j?"w-full bg-[#D4AF37]":"w-0 group-hover:w-full bg-gradient-to-r from-[#D4AF37] to-[#B8960C]")})]},E.label)})())}),o.jsxs("div",{className:"flex items-center",children:[o.jsxs("div",{className:"hidden xl:flex items-center",style:{gap:"10px"},children:[o.jsx(Zg,{}),e?o.jsxs(o.Fragment,{children:[o.jsx(Ce,{to:"/referral",className:le("flex items-center justify-center w-[44px] h-[44px] rounded-[12px] transition-all duration-300 group",A?"bg-white/80 backdrop-blur-sm border border-[#D4AF37]/30 text-[#D4AF37] hover:bg-[#D4AF37]/10 hover:border-[#D4AF37]":"bg-[#D4AF37]/10 border border-[#D4AF37]/30 text-[#D4AF37] hover:bg-[#D4AF37]/20 hover:border-[#D4AF37]"),title:h("header.referralTitle")||"Parrainage - Gagnez des crédits gratuits",children:o.jsx(Ac,{className:"w-[20px] h-[20px]",strokeWidth:2})}),o.jsx(iV,{userId:c,transparentMode:A}),o.jsxs(Ce,{to:"/tarifs",className:le("flex items-center rounded-[12px] border-2 transition-all duration-300 hover:scale-[1.02] hover:shadow-md hover:shadow-[#D4AF37]/10",A?"bg-white/80 backdrop-blur-sm border-[#D4AF37]/50":"bg-white border-[#D4AF37]/30"),style:{gap:"8px",padding:"10px 16px",height:"44px"},children:[o.jsx(lg,{className:"w-[16px] h-[16px] text-[#D4AF37]",strokeWidth:2.5}),o.jsxs("span",{className:"text-[#D4AF37] font-semibold",style:{fontSize:"14px"},children:[t," ",h(t>
70221?"common.credits_plural":"common.credits")||"Crédits"]})]}),o.jsx(sV,{userId:c,userEmail:m,transparentMode:A})]}):o.jsxs(o.Fragment,{children:[o.jsx(Ce,{to:"/login",className:le("inline-flex items-center font-medium transition-colors duration-300",A?"text-[#0F4C4C] hover:text-[#B88A2E]":"text-[#0E3639] hover:text-[#D4AF37]"),style:{fontSize:"15.5px",padding:"0 12px",height:"46px"},children:h("common.login")||"Se connecter"}),o.jsxs(Ce,{to:"/free-analyse",className:"flex items-center px-[24px] bg-[#0E3639] text-white hover:bg-[#0b2a2d] rounded-[12px] font-semibold transition-all duration-300 hover:scale-[1.02] hover:shadow-lg hover:shadow-[#0E3639]/25 group",style:{gap:"8px",height:"46px",fontSize:"15.5px"},children:[o.jsx("span",{children:k("header.analyzeCta","Analyser un bien")}),o.jsx(et,{className:"w-[16px] h-[16px] transition-transform duration-300 group-hover:translate-x-0.5",strokeWidth:2.5})]})]})]}),o.jsxs("div",{className:"flex xl:hidden items-center gap-[10px]",children:[!e&&o.jsxs(Ce,{to:"/free-analyse",className:"inline-flex items-center gap-[6px] h-[40px] px-[16px] rounded-[10px] bg-[#0E3639] text-white font-semibold text-[14px] transition-colors hover:bg-[#0b2a2d]",children:[o.jsx("span",{children:k("header.analyzeCtaShort","Analyser")}),o.jsx(et,{className:"w-[14px] h-[14px]",strokeWidth:2.5})]}),o.jsx("button",{type:"button",onClick:()=>a(!r),className:le("xl:hidden p-[10px] rounded-[12px] transition-all duration-300",A?"text-[#0F4C4C] hover:bg-white/50":"text-[#0E3639] hover:bg-slate-100"),"aria-label":"Toggle menu",children:r?o.jsx(bu,{className:"w-[24px] h-[24px]"}):o.jsx(W_,{className:"w-[24px] h-[24px]"})})]})]})]}),o.jsxs("div",{className:le("xl:hidden absolute top-full left-0 right-0 bg-white backdrop-blur-2xl backdrop-saturate-150 supports-[backdrop-filter]:bg-white/85 border-b border-slate-200 shadow-xl transition-all duration-300 ease-out",r?"max-h-[calc(100vh-78px)] opacity-100 overflow-y-auto overscroll-contain":"max-h-0 opacity-0 overflow-hidden"),style:{fontFamily:"'Outfit', sans-serif"},children:[o.jsx("nav",{className:"flex flex-col",style:{padding:"16px 20px",gap:"4px"},children:x.map(E=>"children"in E?o.jsxs("div",{className:"pt-[8px]",children:[o.jsx("div",{className:"text-slate-400 font-semibold uppercase tracking-wider",style:{fontSize:"11px",padding:"6px 16px 2px"},children:E.label}),E.children.map(j=>{if(Qd(j)){const S=i===j.group;return o.jsxs("div",{children:[o.jsxs("button",{type:"button",onClick:()=>s(S?null:j.group),"aria-expanded":S,className:"w-full flex items-center justify-between gap-[8px] font-medium text-[#0E3639] hover:text-[#D4AF37] rounded-[12px] transition-colors",style:{fontSize:"16px",padding:"12px 16px 12px 24px"},children:[o.jsx("span",{children:j.group}),o.jsx(Er,{className:le("w-[16px] h-[16px] shrink-0 transition-transform duration-200",S&&"rotate-180"),strokeWidth:2})]}),S&&j.items.map(_=>{const G=w===_.href||_.href!=="/"&&w.startsWith(_.href);return o.jsx(Ce,{to:_.href,onClick:()=>a(!1),className:le("block font-medium transition-all duration-300 rounded-[12px]",G?"text-[#D4AF37] bg-[#D4AF37]/5":"text-[#0E3639] hover:text-[#D4AF37] hover:bg-slate-50"),style:{fontSize:"16px",padding:"12px 16px 12px 32px"},children:_.label},_.label+_.href)})]},j.group)}const P=w===j.href||j.href!=="/"&&w.startsWith(j.href);return o.jsx(Ce,{to:j.href,className:le("block font-medium transition-all duration-300 rounded-[12px]",P?"text-[#D4AF37] bg-[#D4AF37]/5":"text-[#0E3639] hover:text-[#D4AF37] hover:bg-slate-50"),style:{fontSize:"16px",padding:"12px 16px 12px 24px"},onClick:()=>a(!1),children:j.label},j.label+j.href)})]},E.label):(()=>{const j=w===E.href||E.href!=="/"&&w.startsWith(E.href);return o.jsx(Ce,{to:E.href,className:le("transition-all duration-300 rounded-[12px]",E.moat?"font-bold":"font-medium",j?"text-[#D4AF37] bg-[#D4AF37]/5":"text-[#0E3639] hover:text-[#D4AF37] hover:bg-slate-50"),style:{fontSize:"16px",padding:"14px 16px"},onClick:()=>a(!1),children:E.label},E.label)})())}),o.jsxs("div",{className:"border-t border-slate-100 flex flex-col",style:{padding:"16px 20px",gap:"12px"},children:[o.jsx("div",{className:"flex justify-center py-[8px]",children:o.jsx(Zg,{})}),e?o.jsxs(o.Fragment,{children:[o.jsxs(Ce,{to:"/referral",onClick:()=>a(!1),className:"flex items-center justify-center bg-[#D4AF37]/10 border border-[#D4AF37]/30 text-[#D4AF37] rounded-[12px] font-medium",style:{gap:"8px",padding:"14px 18px"},children:[o.jsx(Ac,{className:"w-[20px] h-[20px]",strokeWidth:2}),o.jsx("span",{className:"font-semibold",children:h("header.referralTitle")||"Parrainage - Gagnez des crédits"})]}),o.jsxs(Ce,{to:"/tarifs",onClick:()=>a(!1),className:"flex items-center justify-center bg-white rounded-[12px] border-2 border-[#D4AF37]/30",style:{gap:"8px",padding:"14px 18px"},children:[o.jsx(lg,{className:"w-[20px] h-[20px] text-[#D4AF37]",strokeWidth:2.5}),o.jsxs("span",{className:"text-[#D4AF37] font-semibold",style:{fontSize:"15px"},children:[t," ",h(t>
70221?"common.credits_plural":"common.credits")||"Crédits"]})]}),o.jsxs("div",{className:"grid grid-cols-2 gap-[12px]",children:[o.jsxs(Ce,{to:"/settings?tab=profile",onClick:()=>a(!1),className:"flex items-center justify-center gap-[8px] bg-slate-100 rounded-[12px] py-[12px] text-[#0E3639] font-medium hover:bg-slate-200 transition-colors",children:[o.jsx(Ec,{className:"w-[16px] h-[16px]"}),o.jsx("span",{className:"text-[14px]",children:h("header.profile")||"Profil"})]}),o.jsxs(Ce,{to:"/settings",onClick:()=>a(!1),className:"flex items-center justify-center gap-[8px] bg-slate-100 rounded-[12px] py-[12px] text-[#0E3639] font-medium hover:bg-slate-200 transition-colors",children:[o.jsx(lf,{className:"w-[16px] h-[16px]"}),o.jsx("span",{className:"text-[14px]",children:h("header.settings")||"Paramètres"})]})]}),o.jsxs(Ce,{to:"/dashboard",onClick:()=>a(!1),className:"w-full flex items-center justify-center bg-[#0E3639] text-white hover:bg-[#0b2a2d] rounded-[12px] font-semibold transition-all duration-300",style:{gap:"8px",padding:"14px 24px",fontSize:"15px"},children:[o.jsx($x,{className:"w-[20px] h-[20px]",strokeWidth:2}),o.jsx("span",{children:h("header.myDashboard")||"Mon Dashboard"})]}),o.jsxs("button",{type:"button",onClick:async()=>{await de.auth.signOut(),st.success(h("header.logoutSuccess")||"Déconnexion réussie"),b("/"),a(!1)},className:"w-full flex items-center justify-center text-red-600 hover:bg-red-50 rounded-[12px] font-medium transition-all duration-300",style:{gap:"8px",padding:"14px 16px",fontSize:"15px"},children:[o.jsx(Kx,{className:"w-[16px] h-[16px]"}),o.jsx("span",{children:h("header.logout")||"Déconnexion"})]})]}):o.jsxs(o.Fragment,{children:[o.jsxs(Ce,{to:"/free-analyse",onClick:()=>a(!1),className:"w-full flex items-center justify-center bg-[#0E3639] text-white hover:bg-[#0b2a2d] rounded-[12px] font-semibold transition-all duration-300",style:{gap:"8px",padding:"14px 24px",fontSize:"15px"},children:[o.jsx("span",{children:k("header.analyzeCta","Analyser un bien")}),o.jsx(et,{className:"w-[16px] h-[16px]",strokeWidth:2.5})]}),o.jsxs(Ce,{to:"/login",onClick:()=>a(!1),className:"w-full flex items-center justify-center bg-white border border-slate-200 text-[#0E3639] hover:bg-slate-50 rounded-[12px] font-medium transition-all duration-300",style:{gap:"8px",padding:"14px 24px",fontSize:"15px"},children:[o.jsx(Ec,{className:"w-[20px] h-[20px]",strokeWidth:2}),o.jsx("span",{children:h("common.login")||"Se connecter"})]})]})]})]})]})]})},l0={info:{icon:Ux,classes:"bg-blue-50 dark:bg-blue-950/30 border-blue-200 dark:border-blue-800 text-blue-800 dark:text-blue-200 border-b px-4 py-2.5 text-sm",iconClass:"text-blue-500 h-4 w-4 shrink-0",dismissable:!0},warning:{icon:eT,classes:"bg-amber-500 text-black border-amber-600 border-b px-4 py-3 text-sm font-semibold",iconClass:"text-black h-4 w-4 shrink-0",dismissable:!0},error:{icon:P_,classes:"bg-red-600 text-white border-red-700 border-b px-4 py-4 text-base font-bold",iconClass:"text-white h-5 w-5 shrink-0 animate-pulse",dismissable:!1},maintenance:{icon:t1,classes:"bg-indigo-600 text-white border-indigo-700 border-b px-4 py-4 text-base font-bold",iconClass:"text-white h-5 w-5 shrink-0 animate-spin",dismissable:!1,spinSlow:!0}},dV=()=>{const[e,t]=g.useState([]),[n,r]=g.useState(new Set),[a,i]=g.useState(0),{language:s}=Ge(),l=g.useRef(null);g.useEffect(()=>{const c=async()=>{const p=new Date().toISOString(),{data:h,error:b}=await de.from("site_alerts").select("*").eq("active",!0).or(`expires_at.is.null,expires_at.gt.${p}`).order("created_at",{ascending:!1});!b&&h&&t(h)};c();const u=setInterval(c,6e4),m=de.channel("site_alerts_changes").on("postgres_changes",{event:"*",schema:"public",table:"site_alerts"},()=>c()).subscribe();return()=>{clearInterval(u),de.removeChannel(m)}},[]),g.useEffect(()=>{if(!l.current){i(0);return}const c=new ResizeObserver(([u])=>{i(u.contentRect.height)});return c.observe(l.current),()=>c.disconnect()},[e,n]);const d=e.filter(c=>!n.has(c.id));return d.length===0?null:o.jsxs(o.Fragment,{children:[o.jsx("div",{ref:l,className:"fixed top-[65px] left-0 right-0 z-30 w-full",children:d.map(c=>{const u=l0[c.type]||l0.warning,m=u.icon,p=s==="nl"?c.message_nl:c.message_fr;return o.jsxs("div",{className:`${u.classes} flex items-center justify-center gap-3`,children:[o.jsx(m,{className:u.iconClass,style:c.type==="maintenance"?{animationDuration:"3s"}:void 0}),o.jsx("span",{className:"text-center",children:p}),u.dismissable&&o.jsx("button",{onClick:()=>r(h=>new Set(h).add(c.id)),className:"ml-2 shrink-0 opacity-60 hover:opacity-100 transition-opacity","aria-label":"Fermer",children:o.jsx(bu,{className:"h-4 w-4"})})]},c.id)})}),o.jsx("div",{style:{height:a},"aria-hidden":"true"})]})};function cV(){const{shouldRedirectToPro:e,ready:t}=bO(),[n,r]=g.useState(!1),[a,i]=g.useState(0),{t:s}=Ge(),l=o.jsx(UA,{title:s("seo.home.title"),description:s("seo.home.description"),ogImage:"/og-image-n.png",canonical:"https://arcanes.be/",schemaJ
7022son:[vO(),{"@context":"https://schema.org","@type":"SiteNavigationElement",name:["Analyse immobilière","Communes belges","Screener interactif","Simulateur précompte immobilier","Simulateurs immobiliers","Blog"],url:["https://arcanes.be/free-analyse","https://arcanes.be/communes","https://arcanes.be/exploration","https://arcanes.be/simulateur/precompte-immobilier","https://arcanes.be/simulateur","https://arcanes.be/blog"]}]}),[d,c]=g.useState(0);g.useEffect(()=>{(async()=>{const{data:{user:p}}=await de.auth.getUser();if(r(!!p),p){const{data:h}=await de.from("user_credits").select("credits_remaining, purchased_credits").eq("user_id",p.id).maybeSingle();h&&(i(h.credits_remaining),c(h.purchased_credits))}})()},[]);const u=a+d;return t?e?o.jsx(nI,{to:"/pro/dashboard",replace:!0}):o.jsxs(o.Fragment,{children:[l,o.jsx("style",{children:` 7023 #root { 7024 max-width: 100% !important; 7025 padding: 0 !important; 7026 text-align: left !important; 7027 margin: 0 !important; 7028 } 7029 .landing-section { 7030 margin-top: 0 !important; 7031 margin-bottom: 0 !important; 7032 } 7033 /* Outfit font loaded via src/styles/fonts.css */ 7034 ::selection { background: rgba(212, 175, 55, 0.3); } 7035 @keyframes gradient-shift { 7036 0%, 100% { background-position: 0% 50%; } 7037 50% { background-position: 100% 50%; } 7038 } 7039 @keyframes float { 7040 0%, 100% { transform: translateY(0px); } 7041 50% { transform: translateY(-12px); } 7042 } 7043 @keyframes float-dot { 7044 0%, 100% { transform: translateY(0px) scale(1); opacity: 0.3; } 7045 50% { transform: translateY(-8px) scale(1.2); opacity: 0.6; } 7046 } 7047 @keyframes bounce-slow { 7048 0%, 100% { transform: translateY(0px) rotate(-3deg); } 7049 50% { transform: translateY(-8px) rotate(0deg); } 7050 } 7051 @keyframes grow-bar { 7052 from { height: 0; opacity: 0; } 7053 to { opacity: 1; } 7054 } 7055 @keyframes scale-in { 7056 from { transform: scale(0.95); opacity: 0; } 7057 to { transform: scale(1); opacity: 1; } 7058 } 7059 @keyframes fade-in-up { 7060 from { transform: translateY(10px); opacity: 0; } 7061 to { transform: translateY(0); opacity: 1; } 7062 } 7063 `}),o.jsxs("div",{className:"min-h-screen bg-white text-slate-900 overflow-x-hidden",style:{fontFamily:"'Outfit', system-ui, sans-serif"},children:[o.jsx(lV,{isLoggedIn:n,totalCredits:u,transparentOnTop:!0}),o.jsx(dV,{}),o.jsx(uV,{}),o.jsx(mV,{}),o.jsx(pV,{}),o.jsx(jV,{}),o.jsx(gV,{}),o.jsx(AV,{}),o.jsx(EV,{}),o.jsx(PV,{}),o.jsx(SV,{}),o.jsx(CV,{}),o.jsx(xO,{})]})]}):null}function uV(){const e=xt(),{t}=Ge(),[n,r]=g.useState(""),[a,i]=g.useState(!1),[s,l]=g.useState(!1),[d,c]=g.useState({x:0,y:0}),u=g.useRef(null),m=g.useMemo(()=>[...Array(25)].map((b,f)=>({w:Math.random()*6+3,bg:["#D4AF37","#0E3639","#a855f7","#f472b6","#60a5fa"][f%5],top:Math.random()*100,left:Math.random()*100,opacity:Math.random()*.5+.2,dur:4+Math.random()*4,delay:Math.random()*5})),[]);g.useEffect(()=>{l(!0)},[]),g.useEffect(()=>{const b=f=>{if(u.current){const k=u.current.getBoundingClientRect(),w=(f.clientX-k.left-k.width/2)/k.width,v=(f.clientY-k.top-k.height/2)/k.height;c({x:w,y:v})}};return window.addEventListener("mousemove",b),()=>window.removeEventListener("mousemove",b)},[]);const p=()=>{Wc.analysisStarted("url"),Wc.ctaClicked("analyze_button","hero"),n.trim()?e(`/free-analyse?url=${encodeURIComponent(n.trim())}`):e("/free-analyse")},h=b=>{b.key==="Enter"&&p()};return o.jsxs("section",{ref:u,className:"landing-section relative min-h-screen flex flex-col overflow-hidden",children:[o.jsxs("div",{className:"absolute inset-0 overflow-hidden",children:[o.jsx("div",{className:"absolute inset-0",style:{background:` 7064 radial-gradient(ellipse 100% 80% at 50% -30%, rgba(120, 119, 198, 0.3), transparent), 7065 radial-gradient(ellipse 80% 50% at 0% 40%, rgba(255, 119, 198, 0.25), transparent), 7066 radial-gradient(ellipse 60% 50% at 100% 50%, rgba(120, 200, 255, 0.25), transparent), 7067 radial-gradient(ellipse 50% 40% at 30% 100%, rgba(255, 200, 120, 0.2), transparent), 7068 radial-gradient(ellipse 40% 30% at 70% 20%, rgba(168, 85, 247, 0.15), transparent), 7069 linear-gradient(180deg, #FAFAFA 0%, #FFFFFF 100%) 7070 `}}),o.jsx("div",{className:"absolute w-[1000px] h-[1000px] rounded-full opacity-50 blur-[150px]",style:{background:"radial-gradient(circle, rgba(212, 175, 55, 0.4) 0%, transparent 70%)",top:"-20%",right:"0%"}}),o.jsx("div",{className:"absolute w-[800px] h-[800px] rounded-full opacity-40 blur-[120px]",style:{background:"radial-gradient(circle, rgba(14, 54, 57, 0.3) 0%, transparent 70%)",bottom:"-10%",left:"-15%"}}
7070),o.jsx("div",{className:"absolute w-[600px] h-[600px] rounded-full opacity-35 blur-[100px]",style:{background:"radial-gradient(circle, rgba(168, 85, 247, 0.25) 0%, transparent 70%)",top:"30%",left:"20%"}}),o.jsx("div",{className:"absolute inset-0 opacity-[0.02]",style:{backgroundImage:` 7071 linear-gradient(#0E3639 1px, transparent 1px), 7072 linear-gradient(90deg, #0E3639 1px, transparent 1px) 7073 `,backgroundSize:"60px 60px"}}),m.map((b,f)=>o.jsx("div",{className:"absolute rounded-full",style:{width:b.w+"px",height:b.w+"px",background:b.bg,top:`${b.top}%`,left:`${b.left}%`,opacity:b.opacity,animation:`float-dot ${b.dur}s ease-in-out infinite`,animationDelay:`${b.delay}s`}},f))]}),o.jsx("div",{className:"relative z-10 flex-1 flex items-center w-full",style:{paddingTop:"90px"},children:o.jsx("div",{className:"w-full",style:{maxWidth:"1400px",margin:"0 auto",padding:"0 32px"},children:o.jsxs("div",{className:"grid lg:grid-cols-2 gap-12 lg:gap-16 items-center py-12",children:[o.jsxs("div",{className:`space-y-8 transition-all duration-1000 ease-out ${s?"opacity-100 translate-y-0":"opacity-0 translate-y-10"}`,children:[o.jsxs(Ce,{to:"/free-analyse",className:"inline-flex items-center gap-2 px-4 py-2 rounded-full bg-white/80 backdrop-blur-sm border border-slate-200/80 shadow-sm hover:shadow-md transition-all cursor-pointer group",children:[o.jsxs("span",{className:"relative flex h-2 w-2",children:[o.jsx("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full bg-[#D4AF37] opacity-75"}),o.jsx("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-[#D4AF37]"})]}),o.jsx("span",{className:"text-sm font-semibold text-slate-600 group-hover:text-[#0E3639] transition-colors",children:t("landing.hero.badge")}),o.jsx(Fx,{className:"w-4 h-4 text-slate-400 group-hover:translate-x-1 group-hover:text-[#D4AF37] transition-all"})]}),o.jsxs("div",{className:"space-y-6",children:[o.jsxs("h1",{className:"text-4xl md:text-5xl lg:text-6xl font-extrabold tracking-tight leading-[1.1]",style:{fontFamily:"'Outfit', sans-serif"},children:[o.jsx("span",{className:"block text-[#0E3639]",children:t("landing.hero.title1")}),o.jsx("span",{className:"block text-[#0E3639]",children:t("landing.hero.title2")}),o.jsx("span",{className:"text-transparent bg-clip-text",style:{backgroundImage:"linear-gradient(135deg, #D4AF37 0%, #e879f9 50%, #0E3639 100%)",backgroundSize:"200% 200%",animation:"gradient-shift 4s ease infinite"},children:t("landing.hero.title3")})]}),o.jsxs("p",{className:"text-lg md:text-xl lg:text-2xl text-slate-500 max-w-lg leading-relaxed",children:[t("landing.hero.subtitle"),o.jsxs("span",{className:"text-[#0E3639] font-semibold",children:[" ",t("landing.hero.subtitleHighlight")]}),"."," ",t("landing.hero.subtitleTime")]})]}),o.jsxs("div",{className:"relative max-w-xl group",children:[o.jsx("div",{className:`pointer-events-none absolute -inset-1 bg-gradient-to-r from-[#D4AF37]/40 via-purple-500/30 to-[#0E3639]/40 rounded-2xl blur-xl transition-all duration-500 ${a?"opacity-100 scale-105":"opacity-0"}`}),o.jsxs("div",{className:`relative flex items-center bg-white border-2 rounded-2xl transition-all duration-300 shadow-lg ${a?"border-[#D4AF37] shadow-xl shadow-[#D4AF37]/10":"border-slate-200 hover:border-slate-300"}`,children:[o.jsx("div",{className:"pl-5 pr-3",children:o.jsx(of,{className:`w-5 h-5 transition-colors ${a?"text-[#D4AF37]":"text-slate-400"}`})}),o.jsx("input",{type:"text",value:n,onChange:b=>r(b.target.value),onKeyPress:h,onFocus:()=>i(!0),onBlur:()=>i(!1),placeholder:t("premiumHero.inputPlaceholder"),className:"flex-1 py-4 md:py-5 bg-transparent outline-none text-[#0E3639] placeholder:text-slate-400 font-medium text-base md:text-lg",style:{fontFamily:"'Outfit', sans-serif"}}),o.jsxs("button",{onClick:p,className:"hidden sm:flex items-center gap-2 m-2 px-6 py-3.5 bg-[#0E3639] hover:bg-[#0b2a2d] text-white rounded-xl font-bold transition-all hover:scale-[1.02] active:scale-[0.98] shadow-lg shadow-[#0E3639]/25",children:[o.jsx("span",{children:t("premiumHero.ctaButton")}),o.jsx(et,{className:"w-4 h-4"})]})]}),o.jsxs("button",{onClick:p,className:"mt-4 w-full sm:hidden flex items-center justify-center gap-2 px-6 py-4 bg-[#0E3639] text-white rounded-xl font-bold shadow-lg",children:[t("landing.hero.ctaMobile"),o.jsx(et,{className:"w-4 h-4"})]})]}),o.jsxs("div",{className:"flex flex-wrap items-center gap-6 text-sm md:text-sm text-slate-500",children:[o.jsxs("span",{className:"flex items-center gap-2",children:[o.jsx(Xo,{className:"w-4 h-4 text-emerald-500"}),o.jsx("span",{children:t("landing.hero.trust1")})]}),o.jsxs("span",{className:"flex items-center gap-2",children:[o.jsx(cf,{className:"w-4 h-4 text-[#D4AF37]"}),o.jsx("span",{children:t("landing.hero.trust2")})]}),o.jsxs("span",{className:"flex items-center gap-2",children:[o.jsx(Qx,{
7073className:"w-4 h-4 text-purple-500"}),o.jsx("span",{children:t("landing.hero.trust3")})]})]})]}),o.jsxs("div",{className:`relative hidden lg:block transition-all duration-1000 delay-300 ease-out ${s?"opacity-100 translate-x-0":"opacity-0 translate-x-20"}`,children:[o.jsx("div",{className:"relative z-10",style:{transform:`perspective(1000px) rotateY(${d.x*-3}deg) rotateX(${d.y*3}deg)`,transition:"transform 0.5s ease-out"},children:o.jsxs("div",{className:"relative bg-white rounded-3xl border border-slate-200 p-6 shadow-2xl shadow-slate-300/40",children:[o.jsx("div",{className:"flex items-center justify-between mb-5",children:o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsx("div",{className:"w-12 h-12 rounded-xl bg-gradient-to-br from-[#D4AF37] to-[#B8960C] flex items-center justify-center shadow-lg shadow-[#D4AF37]/30",children:o.jsx(nf,{className:"w-6 h-6 text-white"})}),o.jsxs("div",{children:[o.jsx("h3",{className:"text-[#0E3639] font-bold",children:t("landing.hero.cardTitle")}),o.jsxs("p",{className:"text-slate-400 text-sm flex items-center gap-1",children:[o.jsx(af,{className:"w-3 h-3"})," ",t("landing.hero.cardLocation")]})]})]})}),o.jsxs("div",{className:"flex items-center gap-3 p-3 bg-emerald-50 rounded-xl border border-emerald-100 mb-5",children:[o.jsx("div",{className:"w-10 h-10 rounded-full bg-emerald-100 flex items-center justify-center",children:o.jsx(Vs,{className:"w-5 h-5 text-emerald-600"})}),o.jsxs("div",{children:[o.jsx("p",{className:"text-sm font-semibold text-emerald-700",children:t("landing.hero.opportunityTitle")}),o.jsx("p",{className:"text-xs text-emerald-600",children:t("landing.hero.opportunitySubtitle")})]})]}),o.jsx("div",{className:"grid grid-cols-3 gap-3 mb-5",children:[{label:t("landing.hero.metricCashflow"),value:"+485â¬",color:"text-emerald-600",bg:"bg-emerald-50"},{label:t("landing.hero.metricTRI"),value:"12.4%",color:"text-[#0E3639]",bg:"bg-slate-50"},{label:t("landing.hero.metricPrice"),value:"-8%",color:"text-blue-600",bg:"bg-blue-50"}].map((b,f)=>o.jsxs("div",{className:`${b.bg} rounded-xl p-3 text-center border border-slate-100`,children:[o.jsx("p",{className:"text-slate-500 text-xs mb-0.5 font-medium",children:b.label}),o.jsx("p",{className:`text-lg font-bold ${b.color}`,children:b.value})]},f))}),o.jsx("div",{className:"h-16 flex items-end justify-between gap-1 px-3 bg-slate-50 rounded-xl p-3 border border-slate-100",children:[35,45,40,60,55,75,65,85,75,90,82,100].map((b,f)=>o.jsx("div",{className:"flex-1 bg-gradient-to-t from-[#0E3639] to-[#0E3639]/50 rounded-t transition-all hover:from-[#D4AF37] hover:to-[#D4AF37]/50 cursor-pointer",style:{height:`${b}%`,animation:"grow-bar 0.8s ease-out forwards",animationDelay:`${f*.05}s`,opacity:0}},f))})]})}),o.jsxs("div",{className:"absolute -right-4 top-4 bg-white rounded-2xl border border-slate-200 p-4 shadow-xl z-20 w-40",style:{transform:`translate(${d.x*8}px, ${d.y*8}px)`,transition:"transform 0.6s ease-out",animation:"float 6s ease-in-out infinite"},children:[o.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[o.jsx("div",{className:"w-7 h-7 rounded-lg bg-gradient-to-br from-purple-500 to-purple-600 flex items-center justify-center",children:o.jsx(Il,{className:"w-3.5 h-3.5 text-white"})}),o.jsx("span",{className:"text-xs font-semibold text-slate-500",children:t("landing.hero.floatingCardLabel")})]}),o.jsx("p",{className:"text-xs text-slate-400",children:t("landing.hero.floatingCardTitle")}),o.jsx("p",{className:"text-base font-bold text-[#0E3639]",children:"3 528 198 â¬"}),o.jsx("div",{className:"h-10 flex items-end gap-0.5 mt-2",children:[30,50,40,70,55,85,65,95].map((b,f)=>o.jsx("div",{className:"flex-1 bg-gradient-to-t from-purple-500 to-purple-300 rounded-t",style:{height:`${b}%`}},f))})]}),o.jsxs("div",{className:"absolute left-4 -bottom-2 bg-gradient-to-br from-[#D4AF37] to-[#B8960C] text-white rounded-2xl px-5 py-4 shadow-xl z-20",style:{transform:`translate(${d.x*5}px, ${d.y*5}px) rotate(-3deg)`,transition:"transform 0.5s ease-out",animation:"bounce-slow 4s ease-in-out infinite"},children:[o.jsx("p",{className:"text-xs font-medium opacity-80 mb-0.5",children:t("landing.hero.savingsLabel")}),o.jsx("p",{className:"text-2xl font-extrabold",children:"-45Kâ¬"})]})]})]})})})]})}function mV(){const{t:e}=Ge(),t=[{icon:af,title:e("home.howItWorks.step1.title"),desc:e("home.howItWorks.step1.description")},{icon:__,title:e("home.howItWorks.step2.title"),desc:e("home.howItWorks.step2.description")},{icon:hi,title:e("home.howItWorks.step3.title"),desc:e("home.howItWorks.step3.description")}];return o.jsxs("section",{className:"landing-section py-32 bg-slate-50 relative overflow-hidden",children:[o.jsxs("div",{className:"absolute inset-0",children:[o.jsx("div",{className:"absolute top-0 left-1/4 w-[600px] h-[600px] bg-[#D4AF37]/5 rounded-full blur-[150px]"}),o.jsx("div",{className:"absolute bottom-0 right-1/4 w-[500px] h-[500px] bg-purple-500/5 rounded-full blur-[120px]"})]}),o.jsxs("div",{style:{maxWidth:"1200px",margin:"0 auto",padding:"0 32px"},className:"relative z-10",children:[o.jsxs("div",{className:"text-center mb-20",children:[o.jsx("span",{className:"inline-block px-4 py-2 rounded-full bg-[#0E3639]/5 text-[#0E3639] text-sm font-semibold mb-6 border border-[#0E3639]/10",children:e("landing.howItWorks.badge")}),o.jsx("h2",{className:"text-4xl md:text-5xl font-extrabold text-[#0E3639] mb-6",children:e("home.howItWorks.title")}),o.jsx("div",{className:"h-1 w-20 bg-gradient-to-r from-[#D4AF37] to-[#0E3639] mx-auto rounded-full"})]}),o.jsxs("div",{className:"grid md:grid-cols-3 gap-8 relative",children:[o.jsx("div",{className:"hidden md:block absolute top-28 left-[20%] right-[20%] h-[2px] bg-gradient-to-r from-transparent via-[#D4AF37]/30 to-transparent"}),t.map((n,r)=>o.jsx("div",{className:"relative group",children:o.jsxs("div",{className:"flex flex-col items-center text-center p-10 rounded-3xl bg-white border border-slate-100 hover:border-[#D4AF37]/30 transition-all duration-500 hover:shadow-xl hover:-translate-y-2",children:[o.jsx("div",{className:"absolute -top-4 left-1/2 -translate-x-1/2 w-8 h-8 rounded-full bg-gradient-to-br from-[#D4AF37] to-[#B8960C] flex items-center justify-center text-white font-bold text-sm shadow-lg shadow-[#D4AF37]/30",children:r+1}),o.jsx("div",{className:"mb-8 mt-4 p-5 rounded-2xl bg-slate-50 text-[#0E3639] group-hover:bg-[#0E3639] group-hover:text-white transition-all duration-500 border border-slate-100",children:o.jsx(n.icon,{className:"w-10 h-10",
7073strokeWidth:1.5})}),o.jsx("h3",{className:"text-xl font-bold text-[#0E3639] mb-4",children:n.title}),o.jsx("p",{className:"text-slate-500 leading-relaxed",children:n.desc})]})},r))]})]})]})}function pV(){const{t:e}=Ge(),t=[{icon:df,title:e("home.whyChoose.precision.title"),desc:e("home.whyChoose.precision.description"),highlight:!0},{icon:Il,title:e("landing.features.complete.title"),desc:e("landing.features.complete.desc")},{icon:Mx,title:e("landing.features.benchmark.title"),desc:e("landing.features.benchmark.desc")},{icon:cf,title:e("landing.features.instant.title"),desc:e("landing.features.instant.desc")},{icon:Xo,title:e("home.whyChoose.security.title"),desc:e("home.whyChoose.security.description")},{icon:hi,title:e("landing.features.pdf.title"),desc:e("landing.features.pdf.desc")}];return o.jsx("section",{className:"landing-section py-32 bg-white relative overflow-hidden",children:o.jsxs("div",{style:{maxWidth:"1200px",margin:"0 auto",padding:"0 32px"},className:"relative z-10",children:[o.jsxs("div",{className:"text-center mb-20",children:[o.jsx("span",{className:"inline-block px-4 py-2 rounded-full bg-[#D4AF37]/10 text-[#D4AF37] text-sm font-semibold mb-6 border border-[#D4AF37]/20",children:e("landing.features.badge")}),o.jsx("h2",{className:"text-4xl md:text-5xl font-extrabold text-[#0E3639] mb-6",children:e("home.whyCh
7073oose.title")}),o.jsx("div",{className:"h-1 w-20 bg-gradient-to-r from-[#D4AF37] to-[#0E3639] mx-auto rounded-full"})]}),o.jsx("div",{className:"grid md:grid-cols-2 lg:grid-cols-3 gap-6",children:t.map((n,r)=>o.jsxs("div",{className:`group p-8 rounded-3xl border transition-all duration-500 hover:-translate-y-2 ${n.highlight?"bg-gradient-to-br from-[#D4AF37]/5 to-[#D4AF37]/10 border-[#D4AF37]/20 hover:border-[#D4AF37]/40 hover:shadow-xl hover:shadow-[#D4AF37]/10":"bg-white border-slate-100 hover:border-slate-200 hover:shadow-xl"}`,children:[o.jsx("div",{className:`w-14 h-14 rounded-2xl flex items-center justify-center mb-6 transition-all duration-500 ${n.highlight?"bg-[#D4AF37] text-white shadow-lg shadow-[#D4AF37]/30":"bg-slate-100 text-[#0E3639] group-hover:bg-[#0E3639] group-hover:text-white"}`,children:o.jsx(n.icon,{className:"w-7 h-7",strokeWidth:1.5})}),o.jsx("h3",{className:"text-xl font-bold text-[#0E3639] mb-3",children:n.title}),o.jsx("p",{className:"text-slate-500 leading-relaxed",children:n.desc})]},r))})]})})}function gV(){const{t:e,language:t}=Ge(),n=xt(),[r,a]=g.useState(1),[i,s]=g.useState(1),[l,d]=g.useState(!1),c=b=>{b!==r&&(d(!0),setTimeout(()=>{a(b),d(!1)},150))},u=b=>{s(i===b?null:b)},m=[{id:1,icon:hi,title:e("landing.simulators.notaryFees.title"),description:e("landing.simulators.notaryFees.description"),href:"/simulateur-frais-acte",badge:e("landing.simulators.notaryFees.badge"),badgeStyle:"gold"},{id:2,icon:e1,title:e("landing.simulators.mortgage.title"),description:e("landing.simulators.mortgage.description"),href:"/simulateur-pret",badge:e("landing.simulators.mortgage.badge"),badgeStyle:"outline"},{id:3,icon:Ps,title:e("landing.simulators.borrowingCapacity.title"),description:e("landing.simulators.borrowingCapacity.description"),href:"/simulateur-emprunt",badge:null,badgeStyle:null},{id:4,icon:Gx,title:e("landing.simulators.peb.title"),description:e("landing.simulators.peb.description"),href:"/simulateur-peb",badge:e("landing.simulators.peb.badge"),badgeStyle:"subtle"},{id:5,icon:Zx,title:e("landing.simulators.rentalYield.title"),description:e("landing.simulators.rentalYield.description"),href:"/simulateur-rendement-locatif",badge:e("landing.simulators.rentalYield.badge"),badgeStyle:"gold"},{id:6,icon:Vs,title:e("landing.simulators.tri.title"),description:e("landing.simulators.tri.description"),href:"/simulateur-tri",badge:e("landing.simulators.tri.badge"),badgeStyle:"outline"},{id:7,icon:rf,title:e("landing.simulators.propertyTax.title"),description:e("landing.simulators.propertyTax.description"),href:t==="nl"?"/simulator/onroerende-voorheffing":"/simulateur/precompte-immobilier",badge:e("landing.simulators.propertyTax.badge"),badgeStyle:"gold"}],p=b=>{switch(b){case"gold":return"bg-[#D4AF37]/10 text-[#B8960C] border border-[#D4AF37]/30";case"outline":return"bg-transparent text-[#0E3639] border border-[#0E3639]/30";case"subtle":return"bg-slate-100 text-slate-500 border border-slate-200";default:return"bg-slate-100 text-slate-500"}},h=m.find(b=>b.id===r)||m[0];return o.jsxs("section",{className:"landing-section py-20 lg:py-28 bg-gradient-to-b from-slate-50/80 to-white relative overflow-hidden",children:[o.jsx("div",{className:"absolute inset-0 opacity-[0.02]",style:{backgroundImage:"radial-gradient(circle at 1px 1px, #0E3639 1px, transparent 0)",backgroundSize:"40px 40px"}}),o.jsx("div",{className:"absolute top-0 right-1/4 w-[500px] h-[500px] bg-[#D4AF37]/5 rounded-full blur-[180px]"}),o.jsx("div",{className:"absolute bottom-0 left-0 w-[400px] h-[400px] bg-[#0E3639]/3 rounded-full blur-[150px]"}),o.jsxs("div",{style:{maxWidth:"1280px",margin:"0 auto",padding:"0 20px"},className:"relative z-10",children:[o.jsxs("div",{className:"text-center mb-14",children:[o.jsxs("span",{className:"inline-flex items-center gap-2 px-4 py-2 rounded-full bg-white text-[#0E3639] text-sm font-medium mb-6 border border-slate-200/80 shadow-sm",children:[o.jsx(Ps,{className:"w-4 h-4 text-[#D4AF37]"}),e("landing.simulators.badge")]}),o.jsx("h2",{className:"text-3xl md:text-4xl lg:text-5xl font-bold text-[#0E3639] mb-5",children:e("landing.simulators.title")}),o.jsx("p",{className:"text-lg text-slate-500 max-w-2xl mx-auto",children:e("landing.simulators.subtitle")}),o.jsxs("div",{className:"flex items-center justify-center gap-1.5 mt-6",children:[o.jsx("div",{className:"h-1 w-10 bg-[#D4AF37] rounded-full"}),o.jsx("div",{className:"h-1 w-2 bg-[#D4AF37]/30 rounded-full"})]})]}),o.jsxs("div",{className:"hidden lg:grid lg:grid-cols-12 gap-8 items-start",children:[o.jsx("div",{className:"lg:col-span-5 space-y-2",children:m.map(b=>o.jsxs("div",{onMouseEnter:()=>c(b.id),onClick:()=>n(b.href),className:`group relative flex items-center gap-4 p-4 rounded-2xl cursor-pointer transition-all duration-300 ${r===b.id?"bg-white shadow-lg shadow-slate-200/50 border border-slate-200":"bg-transparent hover:bg-white/80 border border-transparent hover:border-slate-100"}`,children:[o.jsx("div",{className:`absolute left-0 top-1/2 -translate-y-1/2 w-1 rounded-full transition-all duration-300 ${r===b.id?"h-10 bg-[#D4AF37]":"h-0 bg-transparent"}`}),o.jsx("div",{className:`w-12 h-12 rounded-xl flex items-center justify-center flex-shrink-0 transition-all duration-300 ${r===b.id?"bg-[#0E3639] text-white":"bg-slate-100 text-slate-400 group-hover:bg-slate-200 group-hover:text-slate-500"}`,children:o.jsx(b.icon,{className:"w-5 h-5",strokeWidth:1.5})}),o.jsxs("div",{className:"flex-1 min-w-0",children:[o.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[o.jsx("h3",{className:`font-semibold transition-colors ${r===b.id?"text-[#0E3639]":"text-slate-700"}`,children:b.title}),b.badge&&o.jsx("span",{className:`px-2 py-0.5 rounded-md text-[10px] font-semibold uppercase tracking-wide ${p(b.badgeStyle)}`,children:b.badge})]}),o.jsx("p",{className:"text-sm text-slate-400 line-clamp-1",children:b.description})]}),o.jsx(Fx,{className:`w-5 h-5 flex-shrink-0 transition-all duration-300 ${r===b.id?"text-[#D4AF37] translate-x-0.5":"text-slate-200 group-hover:text-slate-300"}`})]},b.id))}),o.jsxs("div",{className:"lg:col-span-7",children:[o.jsx("div",{className:`relative rounded-2xl overflow-hidden transition-all duration-300 ${l?"opacity-60 scale-[0.99]":"opacity-100 scale-100"}`,style:{background:"#ffffff",boxShadow:"0 4px 40px -8px rgba(0, 0, 0, 0.08), 0 0 0 1px rgba(0, 0, 0, 0.04)"},children:o.jsx(fV,{simulatorId:r,simulatorData:h,t:e,navigate:n})}),o.jsx("div",{className:"text-center mt-5",children:o.jsxs("button",{onClick:()=>n("/simulateur"),className:"inline-flex items-center gap-2 text-slate-400 hover:text-[#0E3639] text-sm font-medium transition-colors group",children:[e("landing.simulators.viewAll"),o.jsx(et,{className:"w-4 h-4 group-hover:translate-x-0.5 transition-transform"})]})})]})]}),o.jsxs("div",{className:"lg:hidden space-y-3",children:[m.map(b=>o.jsxs("div",{className:"bg-white rounded-2xl border border-slate-200 overflow-hidden",children:[o.jsxs("div",{onClick:()=>u(b.id),className:"flex items-center gap-4 p-4 cursor-pointer",children:[o.jsx("div",{className:`w-11 h-11 rounded-xl flex items-center justify-center flex-shrink-0 transition-colors ${i===b.id?"bg-[#0E3639] text-white":"bg-slate-100 text-slate-400"}`,children:o.jsx(b.icon,{className:"w-5 h-5",strokeWidth:1.5})}),o.jsxs("div",{className:"flex-1 min-w-0",children:[o.jsxs("div",{className:"flex items-center gap-2 mb-0.5",children:[o.jsx("h3",{className:"font-semibold text-[#0E3639]",children:b.title}),b.badge&&o.jsx("span",{className:`px-2 py-0.5 rounded-md text-[9px] font-semibold uppercase ${p(b.badgeStyle)}`,children:b.badge})]}),o.jsx("p",{className:"text-xs text-slate-400 line-clamp-1",children:b.description})]}),o.jsx(Er,{className:`w-5 h-5 text-slate-300 transition-transform duration-300 ${i===b.id?"rotate-180":""}`})]}),o.jsx("div",{className:`overflow-hidden transition-all duration-300 ${i===b.id?"max-h-[500px]":"max-h-0"}`,children:o.jsx("div",{className:"border-t border-slate-100",children:o.jsx(hV,{simulatorId:b.id,t:e,navigate:n,href:b.href})})})]},b.id)),o.jsx("div",{className:"pt-4",children:o.jsxs("button",{onClick:()=>n("/simulateur"),className:"w-full py-4 bg-[#0E3639] hover:bg-[#0b2a2d] text-white rounded-xl font-semibold flex items-center justify-center gap-2 transition-colors",children:[e("landing.simulators.viewAll"),o.jsx(et,{className:"w-5 h-5"})]})})]})]})]})}function hV({simulatorId:e,t,navigate:n,href:r}){const{language:a}=Ge(),s={1:{metrics:[{label:"Droits d'enregistrement",value:"31 250â¬"},{label:"Honoraires notaire",value:"5 200â¬"},{label:"Total estimé",value:"38 500â¬",highlight:!0}],cta:"Calculer mes frais"},2:{metrics:[{label:"Mensualité",value:"1 449â¬",highlight:!0},{label:"Coût total intérêts",value:"97 760â¬"},{label:"Durée",value:"20 ans"}],cta:"Simuler mon prêt"},3:{metrics:[{label:"Budget maximum",value:"385 000â¬",highlight:!0},{label:"Mensualité max",value:"1 575â¬"},{label:"Taux d'endettement",value:"33%"}],cta:"Calculer ma capacité"}
7073,4:{metrics:[{label:"Classe énergétique",value:"D"},{label:"Consommation",value:"285 kWh/m²"},{label:"Coût annuel",value:"2 420â¬",highlight:!0}],cta:"Ãvaluer mon bien"},5:{metrics:[{label:"Rendement brut",value:"6.0%"},{label:"Rendement net",value:"4.2%",highlight:!0},{label:"Cashflow mensuel",value:"+285â¬"}],cta:"Calculer mon rendement"},6:{metrics:[{label:"TRI sur 10 ans",value:"8.4%",highlight:!0},{label:"Gain total",value:"+127 000â¬"},{label:"Valorisation",value:"+2%/an"}],cta:"Projeter mon investissement"},7:{metrics:[{label:a==="nl"?"Niet-geïndexeerd KI":"RC non indexé",value:"1 500â¬"},{label:a==="nl"?"Gemeentelijk tarief":"Taux communal",value:"2 800 cent.",highlight:!0},{label:a==="nl"?"Jaarlijkse voorheffing":"Précompte annuel",value:"1 890â¬"}],cta:a==="nl"?"Mijn voorheffing schatten":"Estimer mon précompte"}}[e];return o.jsxs("div",{className:"p-4 bg-slate-50/50",children:[o.jsx("div",{className:"grid grid-cols-3 gap-2 mb-4",children:s.metrics.map((l,d)=>o.jsxs("div",{className:`p-3 rounded-xl text-center ${l.highlight?"bg-[#D4AF37]/10 border border-[#D4AF37]/20":"bg-white border border-slate-100"}`,children:[o.jsx("p",{className:`text-lg font-bold ${l.highlight?"text-[#D4AF37]":"text-[#0E3639]"}`,children:l.value}),o.jsx("p",{className:"text-[10px] text-slate-400 mt-0.5",children:l.label})]},d))}),o.jsxs("button",{onClick:()=>n(r),className:"w-full py-3 bg-[#0E3639] hover:bg-[#0b2a2d] text-white rounded-xl font-semibold text-sm flex items-center justify-center gap-2 transition-colors",children:[s.cta,o.jsx(et,{className:"w-4 h-4"})]})]})}function fV({simulatorId:e,simulatorData:t,t:n,navigate:r}){switch(e){case 1:return o.jsx(d0,{t:n,navigate:r,href:t.href});case 2:return o.jsx(vV,{t:n,navigate:r,href:t.href});case 3:return o.jsx(bV,{t:n,navigate:r,href:t.href});case 4:return o.jsx(yV,{t:n,navigate:r,href:t.href});case 5:return o.jsx(wV,{t:n,navigate:r,href:t.href});case 6:return o.jsx(kV,{t:n,navigate:r,href:t.href});case 7:return o.jsx(xV,{t:n,navigate:r,href:t.href});default:return o.jsx(d0,{t:n,navigate:r,href:t.href})}}function d0({t:e,navigate:t,href:n}){return o.jsxs("div",{className:"p-6 lg:p-8",children:[o.jsxs("div",{className:"flex items-start justify-between mb-6",children:[o.jsxs("div",{children:[o.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[o.jsx("span",{className:"px-2.5 py-1 bg-slate-100 text-slate-500 text-xs font-medium rounded-lg",children:"Exemple : 250 000â¬"}),o.jsx("span",{className:"px-2.5 py-1 bg-[#0E3639]/5 text-[#0E3639] text-xs font-medium rounded-lg border border-[#0E3639]/10",children:"Wallonie"})]}),o.jsx("h3",{className:"text-xl font-bold text-[#0E3639]",children:"Frais d'acquisition"})]}),o.jsx("div",{className:"w-12 h-12 rounded-xl bg-slate-100 flex items-center justify-center",children:o.jsx(hi,{className:"w-6 h-6 text-[#0E3639]",strokeWidth:1.5})})]}),o.jsxs("div",{className:"grid grid-cols-5 gap-6",children:[o.jsx("div",{className:"col-span-2 flex items-center justify-center",children:o.jsxs("div",{className:"relative",children:[o.jsxs("svg",{width:"160",height:"160",viewBox:"0 0 160 160",children:[o.jsx("circle",{cx:"80",cy:"80",r:"60",fill:"none",stroke:"#f1f5f9",strokeWidth:"20"}),o.jsx("circle",{cx:"80",cy:"80",r:"60",fill:"none",stroke:"#0E3639",strokeWidth:"20",strokeDasharray:"377",strokeDashoffset:"75",strokeLinecap:"round",transform:"rotate(-90 80 80)"}),o.jsx("circle",{cx:"80",cy:"80",r:"60",fill:"none",stroke:"#D4AF37",strokeWidth:"20",strokeDasharray:"377",strokeDashoffset:"328",strokeLinecap:"round",transform:"rotate(170 80 80)"}),o.jsx("circle",{cx:"80",cy:"80",r:"60",fill:"none",stroke:"#94a3b8",strokeWidth:"20",strokeDasharray:"377",strokeDashoffset:"350",strokeLinecap:"round",transform:"rotate(220 80 80)"})]}),o.jsxs("div",{className:"absolute inset-0 flex flex-col items-center justify-center",children:[o.jsx("span",{className:"text-[10px] text-slate-400 font-medium uppercase tracking-wide",children:"Total"}),o.jsx("span",{className:"text-xl font-bold text-[#0E3639]",children:"38 500â¬"})]})]})}),o.jsxs("div",{className:"col-span-3 space-y-3",children:[o.jsxs("div",{className:"flex items-center justify-between p-3 bg-slate-50 rounded-xl",children:[o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsx("div",{className:"w-2.5 h-2.5 rounded-full bg-[#0E3639]"}),o.jsx("span",{className:"text-sm text-slate-600",children:"Droits d'enregistrement"})]}),o.jsxs("div",{className:"text-right",children:[o.jsx("span",{className:"font-bold text-[#0E3639]",children:"31 250â¬"}),o.jsx("span",{className:"text-xs text-slate-400 ml-2",children:"12.5%"})]})]}),o.jsxs("div",{className:"flex items-center justify-between p-3 bg-slate-50 rounded-xl",children:[o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsx("div",{className:"w-2.5 h-2.5 rounded-full bg-[#D4AF37]"}),o.jsx("span",{className:"text-sm text-slate-600",children:"Honoraires notaire"})]}),o.jsxs("div",{className:"text-right",children:[o.jsx("span",{className:"font-bold text-[#0E3639]",children:"5 200â¬"}),o.jsx("span",{className:"text-xs text-slate-400 ml-2",children:"~2%"})]})]}),o.jsxs("div",{className:"flex items-center justify-between p-3 bg-slate-50 rounded-xl",children:[o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsx("div",{className:"w-2.5 h-2.5 rounded-full bg-slate-400"}),o.jsx("span",{className:"text-sm text-slate-600",children:"Frais administratifs"})]}),o.jsxs("div",{className:"text-right",children:[o.jsx("span",{className:"font-bold text-[#0E3639]",children:"2 050â¬"}),o.jsx("span",{className:"text-xs text-slate-400 ml-2",children:"~1%"})]})]})]})]}),o.jsxs("div",{className:"mt-6 pt-5 border-t border-slate-100 flex items-center justify-between",children:[o.jsx("p",{className:"text-sm text-slate-400",children:"Calcul selon barèmes officiels 2024"}),o.jsxs("button",{onClick:()=>t(n),className:"px-5 py-2.5 bg-[#0E3639] hover:bg-[#0b2a2d] text-white rounded-xl font-semibold text-sm flex items-center gap-2 transition-all hover:shadow-lg",children:["Calculer mes frais",o.jsx(et,{className:"w-4 h-4"})]})]})]})}function vV({t:e,navigate:t,href:n}){return o.jsxs("div",{className:"p-6 lg:p-8",children:[o.jsxs("div",{className:"flex items-start justify-between mb-6",children:[o.jsxs("div",{children:[o.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[o.jsx("span",{className:"px-2.5 py-1 bg-slate-100 text-slate-500 text-xs font-medium rounded-lg",children:"Emprunt : 250 000â¬"}),o.jsx("span",{className:"px-2.5 py-1 bg-[#0E3639]/5 text-[#0E3639] text-xs font-medium rounded-lg border border-[#0E3639]/10",children:"20 ans ⢠3.5%"})]}),o.jsx("h3",{className:"text-xl font-bold text-[#0E3639]",children:"Simulation de prêt"})]}),o.jsx("div",{className:"w-12 h-12 rounded-xl bg-slate-100 flex items-center justify-center",children:o.jsx(e1,{className:"w-6 h-6 text-[#0E3639]",strokeWidth:1.5})})]}),o.jsx("div",{className:"bg-gradient-to-br from-slate-50 to-slate-100 rounded-2xl p-6 mb-5 border border-slate-200",children:o.jsxs("div",{className:"flex items-center justify-between",children:[o.jsxs("div",{children:[o.jsx("p",{className:"text-slate-500 text-sm mb-1",children:"Mensualité fixe"}),o.jsx("p",{className:"text-4xl font-extrabold text-[#0E3639]",children:"1 449â¬"}),o.jsx("p",{className:"text-slate-400 text-sm mt-1",children:"pendant 240 mois"})]}),o.jsxs("div",{className:"text-right space-y-2",children:[o.jsxs("div",{className:"bg-white rounded-lg px-4 py-2 border border-slate-200",children:[o.jsx("p",{className:"text-[10px] text-slate-400 uppercase",children:"Coût du crédit"}),o.jsx("p",{className:"text-lg font-bold text-[#D4AF37]",children:"97 760â¬"})]}),o.jsxs("div",{className:"bg-white rounded-lg px-4 py-2 border border-slate-200",children:[o.jsx("p",{className:"text-[10px] text-slate-400 uppercase",children:"Total remboursé"}),o.jsx("p",{className:"text-lg font-bold text-[#0E3639]",children:"347 760â¬"})]})]})]})}),o.jsxs("div",{className:"bg-slate-50 rounded-xl p-4 mb-5",children:[o.jsx("p",{className:"text-[10px] font-semibold text-slate-400 uppercase tracking-wide mb-3",children:"Répartition sur 20 ans"}),o.jsx("div",{className:"flex items-end gap-1 h-16",children:[...Array(20)].map((r,a)=>{const i=25+a*3.5,s=100-i;return o.jsxs("div",{className:"flex-1 flex flex-col gap-px",style:{height:"100%"},children:[o.jsx("div",{className:"bg-[#D4AF37] rounded-t-sm",style:{height:`${s}%`}}),o.jsx("div",{className:"bg-[#0E3639] rounded-b-sm",style:{height:`${i}%`}})]},a)})}),o.jsxs("div",{className:"flex items-center justify-center gap-6 mt-3",children:[o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("div",{className:"w-2.5 h-2.5 rounded bg-[#0E3639]"}),o.jsx("span",{className:"text-xs text-slate-500",children:"Capital"})]}),o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("div",{className:"w-2.5 h-2.5 rounded bg-[#D4AF37]"}),o.jsx("span",{className:"text-xs text-slate-500",children:"Intérêts"})]})]})]}),o.jsxs("div",{className:"flex items-center justify-between",children:[o.jsx("p",{className:"text-sm text-slate-400",children:"Tableau d'amortissement inclus"}),o.jsxs("button",{onClick:()=>t(n),className:"px-5 py-2.5 bg-[#0E3639] hover:bg-[#0b2a2d] text-white rounded-xl font-semibold text-sm flex items-center gap-2 transition-all hover:shadow-lg",children:["Simuler mon prêt",o.jsx(et,{className:"w-4 h-4"})]})]})]})}function bV({t:e,navigate:t,href:n}){return o.jsxs("div",{className:"p-6 lg:p-8",children:[o.jsxs("div",{className:"flex items-start justify-between mb-6",children:[o.jsxs("div",{children:[o.jsx("div",{className:"flex items-center gap-2 mb-2",children:o.jsx("span",{className:"px-2.5 py-1 bg-slate-100 text-slate-500 text-xs font-medium rounded-lg",children:"Revenus : 4 500â¬/mois"})}),o.jsx("h3",{className:"text-xl font-bold text-[#0E3639]",children:"Capacité d'emprunt"})]}),o.jsx("div",{className:"w-12 h-12 rounded-xl bg-slate-100 flex items-center justify-center",children:o.jsx(Ps,{className:"w-6 h-6 text-[#0E3639]",strokeWidth:1.5})})]}),o.jsxs("div",{className:"bg-gradient-to-br from-[#D4AF37]/5 to-[#D4AF37]/10 rounded-2xl p-6 text-center border border-[#D4AF37]/15 mb-5",children:[o.jsx("p",{className:"text-sm text-[#B8960C] font-medium mb-1",children:"Budget immobilier maximum"}),o.jsx("p",{className:"text-5xl font-extrabold text-[#0E3639]",children:"385 000â¬"}),o.jsx("p",{className:"text-slate-500 text-sm mt-2",children:"Avec un apport de 50 000â¬"})]}),o.jsxs("div",{className:"grid grid-cols-3 gap-3 mb-5",children:[o.jsxs("div",{className:"bg-slate-50 rounded-xl p-4 text-center border border-slate-100",children:[o.jsx("p",{className:"text-xs text-slate-400 mb-1",children:"15 ans"}),o.jsx("p",{className:"text-xl font-bold text-slate-600",children:"310 000â¬"}),o.jsx("p",{className:"text-[10px] text-slate-400 mt-1",children:"2 067â¬/mois"})]}),o.jsxs("div",{className:"bg-gradient-to-br from-[#D4AF37] to-[#C9A432] rounded-xl p-4 text-center relative shadow-lg shadow-[#D4AF37]/20",children:[o.jsx("div",{className:"absolute -top-2 left-1/2 -translate-x-1/2 px-2.5 py-0.5 bg-[#0E3639] text-white text-[9px] font-bold rounded-full",children:"OPTIMAL"}
7073),o.jsx("p",{className:"text-xs text-[#0E3639]/70 mb-1",children:"20 ans"}),o.jsx("p",{className:"text-xl font-bold text-[#0E3639]",children:"385 000â¬"}),o.jsx("p",{className:"text-[10px] text-[#0E3639]/70 mt-1",children:"1 575â¬/mois"})]}),o.jsxs("div",{className:"bg-slate-50 rounded-xl p-4 text-center border border-slate-100",children:[o.jsx("p",{className:"text-xs text-slate-400 mb-1",children:"25 ans"}),o.jsx("p",{className:"text-xl font-bold text-slate-600",children:"445 000â¬"}),o.jsx("p",{className:"text-[10px] text-slate-400 mt-1",children:"1 350â¬/mois"})]})]}),o.jsxs("div",{className:"flex items-center justify-between",children:[o.jsx("p",{className:"text-sm text-slate-400",children:"Taux d'endettement : 33%"}),o.jsxs("button",{onClick:()=>t(n),className:"px-5 py-2.5 bg-[#0E3639] hover:bg-[#0b2a2d] text-white rounded-xl font-semibold text-sm flex items-center gap-2 transition-all hover:shadow-lg",children:["Calculer ma capacité",o.jsx(et,{className:"w-4 h-4"})]})]})]})}function yV({t:e,navigate:t,href:n}){return o.jsxs("div",{className:"p-6 lg:p-8",children:[o.jsxs("div",{className:"flex items-start justify-between mb-6",children:[o.jsxs("div",{children:[o.jsx("div",{className:"flex items-center gap-2 mb-2",children:o.jsx("span",{className:"px-2.5 py-1 bg-slate-100 text-slate-500 text-xs font-medium rounded-lg",children:"Appartement 85m²"})}),o.jsx("h3",{className:"text-xl font-bold text-[#0E3639]",children:"Impact énergétique"})]}),o.jsx("div",{className:"w-12 h-12 rounded-xl bg-slate-100 flex items-center justify-center",children:o.jsx(Gx,{className:"w-6 h-6 text-[#0E3639]",strokeWidth:1.5})})]}),o.jsxs("div",{className:"bg-slate-50 rounded-xl p-5 mb-5",children:[o.jsx("div",{className:"flex items-stretch gap-1.5 h-14 mb-3",children:[{letter:"A",color:"#22c55e"},{letter:"B",color:"#84cc16"},{letter:"C",color:"#eab308"},{letter:"D",color:"#f97316",active:!0},{letter:"E",color:"#ef4444"},{letter:"F",color:"#dc2626"},{letter:"G",color:"#991b1b"}].map(r=>o.jsx("div",{className:`flex-1 flex items-center justify-center rounded-lg font-bold text-white transition-all ${r.active?"scale-110 shadow-lg ring-2 ring-white ring-offset-2":"opacity-60"}`,style:{backgroundColor:r.color,fontSize:r.active?"18px":"14px"},children:r.letter},r.letter))}),o.jsxs("div",{className:"flex justify-between text-[10px] text-slate-400 px-1",children:[o.jsx("span",{children:"Performant"}),o.jsx("span",{children:"Ãnergivore"})]})]}),o.jsxs("div",{className:"grid grid-cols-3 gap-3 mb-5",children:[o.jsxs("div",{className:"bg-white rounded-xl p-4 border border-slate-200 text-center",children:[o.jsx("p",{className:"text-2xl font-bold text-[#0E3639]",children:"285"}),o.jsx("p",{className:"text-[10px] text-slate-400 mt-0.5",children:"kWh/m²/an"})]}),o.jsxs("div",{className:"bg-white rounded-xl p-4 border border-slate-200 text-center",children:[o.jsx("p",{className:"text-2xl font-bold text-[#D4AF37]",children:"2 420â¬"}),o.jsx("p",{className:"text-[10px] text-slate-400 mt-0.5",children:"coût annuel"})]}),o.jsxs("div",{className:"bg-emerald-50 rounded-xl p-4 border border-emerald-100 text-center",children:[o.jsx("p",{className:"text-2xl font-bold text-emerald-600",children:"-45%"}),o.jsx("p",{className:"text-[10px] text-emerald-600 mt-0.5",children:"si classe B"})]})]}),o.jsxs("div",{className:"flex items-center justify-between",children:[o.jsx("p",{className:"text-sm text-slate-400",children:"Estimation basée sur prix moyen énergie"}),o.jsxs("button",{onClick:()=>t(n),className:"px-5 py-2.5 bg-[#0E3639] hover:bg-[#0b2a2d] text-white rounded-xl font-semibold text-sm flex items-center gap-2 transition-all hover:shadow-lg",children:["Ãvaluer mon bien",o.jsx(et,{className:"w-4 h-4"})]})]})]})}function wV({t:e,navigate:t,href:n}){return o.jsxs("div",{className:"p-6 lg:p-8",children:[o.jsxs("div",{className:"flex items-start justify-between mb-6",children:[o.jsxs("div",{children:[o.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[o.jsx("span",{className:"px-2.5 py-1 bg-slate-100 text-slate-500 text-xs font-medium rounded-lg",children:"Bien : 280 000â¬"}),o.jsx("span",{className:"px-2.5 py-1 bg-[#0E3639]/5 text-[#0E3639] text-xs font-medium rounded-lg border border-[#0E3639]/10",children:"Loyer 1 400â¬"})]}),o.jsx("h3",{className:"text-xl font-bold text-[#0E3639]",children:"Analyse de rentabilité"})]}),o.jsx("div",{className:"w-12 h-12 rounded-xl bg-slate-100 flex items-center justify-center",children:o.jsx(Zx,{className:"w-6 h-6 text-[#0E3639]",strokeWidth:1.5})})]}),o.jsxs("div",{className:"grid grid-cols-2 gap-4 mb-5",children:[o.jsxs("div",{className:"bg-slate-50 rounded-xl p-5 border border-slate-100",children:[o.jsx("p",{className:"text-xs text-slate-400 uppercase tracking-wide mb-1",children:"Rendement brut"}),o.jsx("p",{className:"text-3xl font-extrabold text-[#0E3639]",children:"6.0%"}),o.jsx("div",{className:"mt-2 h-1.5 bg-slate-200 rounded-full overflow-hidden",children:o.jsx("div",{className:"h-full bg-[#0E3639] rounded-full",style:{width:"60%"}})})]}),o.jsxs("div",{className:"bg-[#D4AF37]/5 rounded-xl p-5 border border-[#D4AF37]/15",children:[o.jsx("p",{className:"text-xs text-[#B8960C] uppercase tracking-wide mb-1",children:"Rendement net"}),o.jsx("p",{className:"text-3xl font-extrabold text-[#D4AF37]",children:"4.2%"}),o.jsx("div",{className:"mt-2 h-1.5 bg-[#D4AF37]/20 rounded-full overflow-hidden",children:o.jsx("div",{className:"h-full bg-[#D4AF37] rounded-full",style:{width:"42%"}})})]})]}),o.jsx("div",{className:"bg-emerald-50 rounded-xl p-4 border border-emerald-100 mb-5",children:o.jsxs("div",{className:"flex items-center justify-between",children:[o.jsxs("div",{children:[o.jsx("p",{className:"text-sm text-emerald-700 font-medium",children:"Cashflow mensuel"}),o.jsx("p",{className:"text-xs text-emerald-600/70",children:"Après charges et crédit"})]}),o.jsxs("div",{className:"text-right",children:[o.jsx("p",{className:"text-2xl font-extrabold text-emerald-600",children:"+285â¬"}),o.jsx("p",{className:"text-xs text-emerald-600/70",children:"+3 420â¬/an"})]})]})}),o.jsxs("div",{className:"flex items-center justify-between",children:[o.jsx("p",{className:"text-sm text-slate-400",children:"Moyenne Belgique : 3.2% net"}),o.jsxs("button",{onClick:()=>t(n),className:"px-5 py-2.5 bg-[#0E3639] hover:bg-[#0b2a2d] text-white rounded-xl font-semibold text-sm flex items-center gap-2 transition-all hover:shadow-lg",children:["Calculer mon rendement",o.jsx(et,{className:"w-4 h-4"})]})]})]})}function kV({t:e,navigate:t,href:n}){return o.jsxs("div",{className:"p-6 lg:p-8",children:[o.jsxs("div",{className:"flex items-start justify-between mb-6",children:[o.jsxs("div",{children:[o.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[o.jsx("span",{className:"px-2.5 py-1 bg-slate-100 text-slate-500 text-xs font-medium rounded-lg",children:"Investissement : 320 000â¬"}),o.jsx("span",{className:"px-2.5 py-1 bg-[#0E3639]/5 text-[#0E3639] text-xs font-medium rounded-lg border border-[#0E3639]/10",children:"10 ans"})]}),o.jsx("h3",{className:"text-xl font-bold text-[#0E3639]",children:"Projection patrimoniale"})]}),o.jsx("div",{className:"w-12 h-12 rounded-xl bg-slate-100 flex items-center justify-center",children:o.jsx(Vs,{className:"w-6 h-6 text-[#0E3639]",strokeWidth:1.5})})]}),o.jsx("div",{className:"bg-gradient-to-br from-purple-50 to-purple-100/50 rounded-2xl p-6 border border-purple-100 mb-5",children:o.jsxs("div",{className:"flex items-center justify-between",children:[o.jsxs("div",{children:[o.jsx("p",{className:"text-purple-600/70 text-sm mb-1",children:"Taux de Ren
7073dement Interne"}),o.jsx("p",{className:"text-5xl font-extrabold text-purple-600",children:"8.4%"}),o.jsx("p",{className:"text-purple-600/70 text-sm mt-1",children:"Rendement annualisé"})]}),o.jsx("div",{className:"w-24 h-24 rounded-full bg-white border-4 border-purple-200 flex items-center justify-center shadow-inner",children:o.jsxs("div",{className:"text-center",children:[o.jsx("p",{className:"text-xl font-bold text-emerald-600",children:"+127Kâ¬"}),o.jsx("p",{className:"text-[10px] text-slate-400",children:"gain total"})]})})]})}),o.jsxs("div",{className:"bg-slate-50 rounded-xl p-4 mb-5",children:[o.jsx("p",{className:"text-[10px] font-semibold text-slate-400 uppercase tracking-wide mb-3",children:"Ãvolution sur 10 ans"}),o.jsx("div",{className:"flex items-end gap-1.5 h-16",children:[65,72,78,84,90,96,102,110,118,127].map((r,a)=>o.jsx("div",{className:"flex-1 bg-gradient-to-t from-purple-500 to-purple-400 rounded-t transition-all hover:from-purple-600 hover:to-purple-500",style:{height:`${r*.65}%`}},a))}),o.jsxs("div",{className:"flex justify-between text-[10px] text-slate-400 mt-2",children:[o.jsx("span",{children:"An 1"}),o.jsx("span",{children:"An 10"})]})]}),o.jsxs("div",{className:"flex items-center justify-between",children:[o.jsx("p",{className:"text-sm text-slate-400",children:"Scénarios et sensibilité inclus"}),o.jsxs("button",{onClick:()=>t(n),className:"px-5 py-2.5 bg-[#0E3639] hover:bg-[#0b2a2d] text-white rounded-xl font-semibold text-sm flex items-center gap-2 transition-all hover:shadow-lg",children:["Projeter mon investissement",o.jsx(et,{className:"w-4 h-4"})]})]})]})}function xV({t:e,navigate:t,href:n}){const{language:r}=Ge();return o.jsxs("div",{className:"p-6 lg:p-8",children:[o.jsxs("div",{className:"flex items-start justify-between mb-6",children:[o.jsxs("div",{children:[o.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[o.jsx("span",{className:"px-2.5 py-1 bg-slate-100 text-slate-500 text-xs font-medium rounded-lg",children:r==="nl"?"KI : 1 500â¬":"RC : 1 500â¬"}),o.jsx("span",{className:"px-2.5 py-1 bg-[#D4AF37]/10 text-[#B8960C] text-xs font-medium rounded-lg border border-[#D4AF37]/20",children:r==="nl"?"NIEUW":"NOUVEAU"})]}),o.jsx("h3",{className:"text-xl font-bold text-[#0E3639]",children:r==="nl"?"Onroerende voorheffing":"Précompte immobilier"})]}),o.jsx("div",{className:"w-12 h-12 rounded-xl bg-slate-100 flex items-center justify-center",children:o.jsx(rf,{className:"w-6 h-6 text-[#0E3639]",strokeWidth:1.5})})]}),o.jsx("div",{className:"grid grid-cols-3 gap-3 mb-5",children:[{region:r==="nl"?"Wallonië":"Wallonie",rate:"2 800",amount:"1 890â¬",active:!0},{region:r==="nl"?"Vlaanderen":"Flandre",rate:"3 100",amount:"2 120â¬",active:!1},{region:r==="nl"?"Brussel":"Bruxelles",rate:"2 960",amount:"1 980â¬",active:!1}].map((a,i)=>o.jsxs("div",{className:`rounded-xl p-4 text-center border transition-all ${a.active?"bg-[#0E3639] text-white border-[#0E3639] shadow-lg":"bg-slate-50 border-slate-100"}`,children:[o.jsx("p",{className:`text-xs font-medium mb-1 ${a.active?"text-white/70":"text-slate-400"}`,children:a.region}),o.jsx("p",{className:`text-xl font-bold ${a.active?"text-white":"text-[#0E3639]"}`,children:a.amount}),o.jsxs("p",{className:`text-[10px] mt-1 ${a.active?"text-white/60":"text-slate-400"}`,children:[a.rate," cent."]})]},i))}),o.jsxs("div",{className:"bg-slate-50 rounded-xl p-4 mb-5",children:[o.jsx("p",{className:"text-[10px] font-semibold text-slate-400 uppercase tracking-wide mb-3",children:r==="nl"?"Berekeningsdetail":"Détail du calcul"}),o.jsx("div",{className:"space-y-2",children:[{label:r==="nl"?"Niet-geïndexeerd KI":"RC non indexé",value:"1 500â¬"},{label:r==="nl"?"Indexeringscoëfficiënt":"Coefficient d'indexation",value:"à 2,0915"},{label:r==="nl"?"Geïndexeerd KI":"RC indexé",value:"3 137â¬"},{label:r==="nl"?"Basisvoorheffing":"Précompte de base",value:"1 890â¬"}].map((a,i)=>o.jsxs("div",{className:"flex items-center justify-between",children:[o.jsx("span",{className:"text-sm text-slate-500",children:a.label}),o.jsx("span",{className:`text-sm font-semibold ${i===3?"text-[#D4AF37]":"text-[#0E3639]"}`,children:a.value})]},i))})]}),o.jsxs("div",{className:"flex items-center gap-3 p-3 bg-emerald-50 rounded-xl border border-emerald-100 mb-5",children:[o.jsx("div",{className:"w-8 h-8 rounded-full bg-emerald-100 flex items-center justify-center flex-shrink-0",children:o.jsx(fa,{className:"w-4 h-4 text-emerald-600"})}),o.jsxs("div",{children:[o.jsx("p",{className:"text-sm text-emerald-700 font-medium",children:r==="nl"?"Gewestelijke verminderingen beschikbaar":"Réductions régionales disponibles"}),o.jsx("p",{className:"text-xs text-emerald-600/70",children:r==="nl"?"Eigen woning, groot gezin, handicap...":"Habitation propre, famille nombreuse, handicap..."})]})]}),o.jsxs("div",{className:"flex items-center justify-between",children:[o.jsx("p",{className:"text-sm text-slate-400",children:r==="nl"?"Officiële Belgische formule 2025":"Formule officielle belge 2025"}),o.jsxs("button",{onClick:()=>t(n),className:"px-5 py-2.5 bg-[#0E3639] hover:bg-[#0b2a2d] text-white rounded-xl font-semibold text-sm flex items-center gap-2 transition-all hover:shadow-lg",children:[r==="nl"?"Mijn voorheffing schatten":"Estimer mon précompte",o.jsx(et,{className:"w-4 h-4"})]})]})]})}function jV(){const{t:e,language:t}=Ge(),n=xt(),r=t==="nl"?"/gemeenten":"/communes",a=t==="nl"?"/verkenning":"/exploration";return o.jsxs("section",{className:"landing-section py-20 lg:py-28 bg-[#0E3639] text-white relative overflow-hidden",children:[o.jsx("div",{className:"absolute inset-0 opacity-[0.06]",children:o.jsx("div",{className:"absolute inset-0",style:{backgroundImage:"radial-gradient(circle at 1.5px 1.5px, white 1px, transparent 0)",backgroundSize:"40px 40px"}})}),o.jsx("div",{className:"absolute top-0 right-0 w-[700px] h-[700px] bg-[#D4AF37]/8 rounded-full blur-[200px]"}),o.jsx("div",{className:"absolute bottom-0 left-0 w-[500px] h-[500px] bg-purple-500/8 rounded-full blur-[180px]"}),o.jsxs("div",{style:{maxWidth:"1200px",margin:"0 auto",padding:"0 32px"},className:"relative z-10",children:[o.jsxs("div",{className:"text-center mb-14",children:[o.jsxs("span",{className:"inline-flex items-center gap-2 px-4 py-2 rounded-full bg-white/10 text-white text-sm font-medium mb-6 border border-white/15",children:[o.jsx(Wx,{className:"w-4 h-4 text-[#D4AF37]"}),e("landing.dataHub.badge")]}),o.jsx("h2",{className:"text-3xl md:text-4xl lg:text-5xl font-bold text-white mb-5",children:e("landing.dataHub.title")}),o.jsx("p",{className:"text-lg text-white/60 max-w-2xl mx-auto",children:e("landing.dataHub.subt
7073itle")}),o.jsxs("div",{className:"flex items-center justify-center gap-1.5 mt-6",children:[o.jsx("div",{className:"h-1 w-10 bg-[#D4AF37] rounded-full"}),o.jsx("div",{className:"h-1 w-2 bg-[#D4AF37]/30 rounded-full"})]})]}),o.jsxs("div",{className:"grid md:grid-cols-2 gap-6 lg:gap-8 max-w-5xl mx-auto",children:[o.jsxs("div",{onClick:()=>{n(r),window.scrollTo(0,0)},className:"group relative rounded-3xl cursor-pointer transition-all duration-500 hover:-translate-y-2 hover:shadow-2xl hover:shadow-[#D4AF37]/15 overflow-hidden",style:{background:"linear-gradient(135deg, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0.04) 100%)",border:"1px solid rgba(255,255,255,0.12)"},children:[o.jsx("div",{className:"absolute top-0 left-0 right-0 h-[3px] bg-gradient-to-r from-[#D4AF37] via-[#D4AF37]/60 to-transparent"}),o.jsxs("div",{className:"p-8 lg:p-10 relative",children:[o.jsxs("div",{className:"flex items-start justify-between mb-6",children:[o.jsxs("div",{className:"flex items-center gap-4",children:[o.jsx("div",{className:"w-14 h-14 rounded-2xl bg-gradient-to-br from-[#D4AF37] to-[#B8960C] flex items-center justify-center shadow-lg shadow-[#D4AF37]/30",children:o.jsx(sf,{className:"w-7 h-7 text-white",strokeWidth:1.5})}),o.jsxs("div",{children:[o.jsx("h3",{className:"text-xl font-bold text-white",children:e("landing.dataHub.communes.title")}),o.jsx("p",{className:"text-white/40 text-sm font-mono",children:t==="nl"?"/gemeenten":"/communes"})]})]}),o.jsx("div",{className:"hidden lg:grid grid-cols-4 gap-1 opacity-20 group-hover:opacity-40 transition-opacity",children:[.8,.4,.6,.3,.5,1,.7,.5,.3,.7,.9,.6,.6,.4,.5,.3].map((i,s)=>o.jsx("div",{className:"w-2.5 h-2.5 rounded-full",style:{backgroundColor:s===5||s===10?"#D4AF37":"white",opacity:i}},s))})]}),o.jsx("p",{className:"text-white/70 leading-relaxed mb-6 text-[15px]",children:e("landing.dataHub.communes.description")}),o.jsx("div",{className:"grid grid-cols-3 gap-3 mb-8",children:[{value:"581",label:e("landing.dataHub.communes.stat1"),gold:!0},{value:"42",label:e("landing.dataHub.communes.stat2"),gold:!1},{value:"3",label:e("landing.dataHub.communes.stat3"),gold:!1}].map((i,s)=>o.jsxs("div",{className:"bg-white/[0.07] rounded-xl p-3.5 text-center border border-white/[0.08] group-hover:bg-white/[0.1] transition-colors",children:[o.jsx("p",{className:`text-2xl font-extrabold ${i.gold?"text-[#D4AF37]":"text-white"}`,children:i.value}),o.jsx("p",{className:"text-[11px] text-white/50 font-medium mt-0.5",children:i.label})]},s))}),o.jsxs("button",{className:"w-full py-3.5 rounded-xl bg-[#D4AF37] hover:bg-[#c9a432] text-[#0E3639] font-bold text-sm flex items-center justify-center gap-2 transition-all shadow-lg shadow-[#D4AF37]/20 group-hover:shadow-xl group-hover:shadow-[#D4AF37]/30",children:[e("landing.dataHub.communes.cta"),o.jsx(et,{className:"w-4 h-4 group-hover:translate-x-1 transition-transform"})]})]})]}),o.jsx("div",{onClick:()=>{n(a),window.scrollTo(0,0)},className:"group relative rounded-3xl cursor-pointer transition-all duration-500 hover:-translate-y-2 hover:shadow-2xl hover:shadow-purple-500/10 overflow-hidden",style:{background:"linear-gradient(135deg, rgba(255,255,255,0.07) 0%, rgba(255,255,255,0.03) 100%)",border:"1px solid rgba(255,255,255,0.1)"},children:o.jsxs("div",{className:"p-8 lg:p-10 relative",children:[o.jsxs("div",{className:"flex items-start justify-between mb-6",children:[o.jsxs("div",{className:"flex items-center gap-4",children:[o.jsx("div",{className:"w-14 h-14 rounded-2xl bg-gradient-to-br from-purple-500 to-purple-600 flex items-center justify-center shadow-lg shadow-purple-500/30",children:o.jsx(Jx,{className:"w-7 h-7 text-white",strokeWidth:1.5})}),o.jsxs("div",{children:[o.jsx("h3",{className:"text-xl font-bold text-white",children:e("landing.dataHub.screener.title")}),o.jsx("p",{className:"text-white/40 text-sm font-mono",children:t==="nl"?"/verkenning":"/exploration"})]})]}),o.jsx("div",{className:"hidden lg:flex items-end gap-[3px] h-16 opacity-20 group-hover:opacity-40 transition-opacity",children:[35,55,45,75,50,85,60,90,65].map((i,s)=>o.jsx("div",{className:"w-[5px] rounded-t bg-gradient-to-t from-purple-400 to-purple-300",style:{height:`${i}%`}},s))})]}),o.jsx("p",{className:"text-white/70 leading-relaxed mb-6 text-[15px]",children:e("landing.dataHub.screener.description")}),o.jsx("div",{className:"flex flex-wrap gap-2 mb-8",children:[{label:e("landing.dataHub.screener.pill1"),icon:Il},{label:e("landing.dataHub.screener.pill2"),icon:df},{label:"SmartSuggestions",icon:da},{label:e("landing.dataHub.screener.pill4"),icon:Vs}].map((i,s)=>o.jsxs("span",{className:"inline-flex items-center gap-1.5 px-3 py-1.5 rounded-full bg-purple-500/15 text-purple-200 text-xs font-medium border border-purple-400/15",children:[o.jsx(i.icon,{className:"w-3 h-3"}),i.label]},s))}),o.jsxs("button",{className:"w-full py-3.5 rounded-xl bg-white/10 hover:bg-white/15 text-white font-bold text-sm flex items-center justify-center gap-2 transition-all border border-white/15 hover:border-white/25 group-hover:shadow-lg",children:[e("landing.dataHub.screener.cta"),o.jsx(et,{className:"w-4 h-4 group-hover:translate-x-1 transition-transform"})]})]})})]})]})]})}function AV(){const{t:e}=Ge(),[t,n]=g.useState(0),r=[{question:e("faq.questions.general.q1"),answer:e("faq.questions.general.a1")},{question:e("faq.questions.general.q2"),answer:e("faq.questions.general.a2")},{question:e("faq.questions.general.q3"),answer:e("faq.questions.general.a3")},{question:e("faq.questions.analysis.q1"),answer:e("faq.questions.analysis.a1")},{question:e("faq.questions.methodology.q5"),answer:e("faq.questions.methodology.a5")}];return o.jsxs("section",{className:"landing-section py-32 bg-slate-50 relative overflow-hidden",children:[o.jsxs("div",{className:"absolute inset-0",children:[o.jsx("div",{className:"absolute top-0 right-1/4 w-[500px] h-[500px] bg-[#D4AF37]/5 rounded-full blur-[150px]"}),o.jsx("div",{className:"absolute bottom-0 left-1/4 w-[400px] h-[400px] bg-purple-500/5 rounded-full blur-[120px]"})]}),o.jsxs("div",{style:{maxWidth:"900px",margin:"0 auto",padding:"0 32px"},className:"relative z-10",children:[o.jsxs("div",{className:"text-center mb-16",children:[o.jsxs("span",{className:"inline-block px-4 py-2 rounded-full bg-[#0E3639]/5 text-[#0E3639] text-sm font-semibold mb-6 border border-[#0E3639]/10",children:[o.jsx(E_,{className:"w-4 h-4 inline mr-2"}),e("landing.faq.badge")]}),o.jsx("h2",{className:"text-4xl md:text-5xl font-extrabold text-[#0E3639] mb-6",children:e("landing.faq.title")}),o.jsx("p",{className:"text-xl text-slate-500 max-w-2xl mx-auto",children:e("landing.faq.subtitle")}),o.jsx("div",{className:"h-1 w-20 bg-gradient-to-r from-[#D4AF37] to-[#0E3639] mx-auto rounded-full mt-6"})]}),o.jsx("div",{className:"space-y-4",children:r.map((a,i)=>o.jsxs("div",{className:`bg-white rounded-2xl border transition-all duration-300 overflow-hidden ${t===i?"border-[#D4AF37]/30 shadow-lg shadow-[#D4AF37]/5":"border-slate-200 hover:border-slate-300"}`,children:[o.jsxs("button",{onClick:()=>n(t===i?null:i),className:"w-full px-6 py-5 flex items-center justify-between text-left transition-colors",children:[o.jsx("span",{className:"font-semibold text-[#0E3639] text-lg pr-4",children:a.question}),o.jsx("div",{className:`w-10 h-10 rounded-full flex items-center justify-center flex-shrink-0 transition-all duration-300 ${t===i?"bg-[#D4AF37] text-white rotate-180":"bg-slate-100 text-slate-500"}`,children:o.jsx(Er,{className:"w-5 h-5"})})]}),o.jsx("div",{className:`overflow-hidden transition-all duration-300 ease-out ${t===i?"max-h-96 opacity-100":"max-h-0 opacity-0"}`,children:o.jsxs("div",{className:"px-6 pb-6 pt-0",children:[o.jsx("div",{className:"h-px bg-slate-100 mb-4"}),o.jsx("p",{className:"text-slate-600 leading-relaxed",children:a.answer})]})})]},i))}),o.jsxs("div",{className:"text-center mt-12",children:[o.jsx("p",{className:"text-slate-500 mb-4",children:e("landing.faq.moreQuestions")}),o.jsxs(Ce,{to:"/faq",className:"inline-flex items-center gap-2 text-[#0E3639] font-semibold hover:text-[#D4AF37] transition-colors",children:[e("landing.faq.viewAll"),o.jsx(et,{className:"w-4 h-4"})]})]})]})]})}function EV(){const{t:e}=Ge(),t=[{quote:e("home.testimonials.testimonial1.quote"),name:e("home.testimonials.testimonial1.name"),role:e("home.testimonials.testimonial1.role")},{quote:e("home.testimonials.testimonial2.quote"),name:e("home.testimonials.testimonial2.name"),role:e("home.testimonials.testimonial2.role")}];return o.jsx("section",{className:"landing-section py-32 bg-white relative overflow-hidden",children:o.jsxs("div",{style:{maxWidth:"1100px",margin:"0 auto",padding:"0 32px"},className:"relative z-10",children:[o.jsxs("div",{className:"text-center mb-20",children:[o.jsx("h2",{className:"text-4xl md:text-5xl font-extrabold text-[#0E3639] mb-6",children:e("home.testimonials.title")}),o.jsx("div",{className:"h-1 w-20 bg-gradient-to-r from-[#D4AF37] to-[#0E3639] mx-auto rounded-full"})]}),o.jsx("div",{className:"grid md:grid-cols-2 gap-8",children:t.map((n,r)=>o.jsxs("div",{className:"p-10 rounded-3xl bg-slate-50 border border-slate-100 hover:border-[#D4AF37]/20 transition-all duration-500 hover:-translate-y-2 hover:shadow-xl relative",children:[o.jsx(K_,{className:"absolute top-8 left-8 w-10 h-10 text-[#D4AF37]/10"}),o.jsxs("p",{className:"text-slate-600 mb-8 italic relative z-10 pl-6 border-l-4 border-[#D4AF37] text-lg leading-relaxed",children:['"',n.quote,'"']}),o.jsxs("p",{className:"text-sm text-slate-400 mt-4",children:["â ",n.name]})]},r))})]})})}function PV(){const{t:e}=Ge(),t=xt();return o.jsxs("section",{className:"landing-section py-32 bg-[#0E3639] text-white relative overflow-hidden",children:[o.jsx("div",{className:"absolute inset-0 opacity-10",children:o.jsx("div",{className:"absolute inset-0",style:{backgroundImage:"radial-gradient(circle at 2px 2px, white 1px, transparent 0)",backgroundSize:"40px 40px"}})}),o.jsxs("div",{style:{maxWidth:"1100px",margin:"0 auto",padding:"0 32px"},className:"relative z-10",children:[o.jsxs("div",{className:"text-center mb-20",children:[o.jsx("span",{className:"inline-block px-4 py-2 rounded-full bg-white/10 text-white text-sm font-semibold mb-6 border border-white/20",children:e("landing.pricing.badge")}),o.jsx("h2",{className:"text-4xl md:text-5xl font-extrabold mb-6 text-white",children:e("home.plans.title")}),o.jsx("p",{className:"text-xl text-white max-w-2xl mx-auto",children:e("home.plans.subtitle")})]}),o.jsxs("div",{className:"grid md:grid-cols-2 gap-8 max-w-4xl mx-auto",children:[o.jsxs("div",{className:"flex flex-col p-10 rounded-3xl bg-white/5 border border-white/10 backdrop-blur-sm hover:border-white/20 transition-all",children:[o.jsxs("div",{className:"mb-8",children:[o.jsx("span",{className:"inline-block px-3 py-1 rounded-full bg-white/10 text-white text-xs font-semibold mb-4",children:e("home.plans.free.badge")}),o.jsx("h3",{className:"text-3xl font-extrabold mb-2 text-white",children:e("home.plans.free.title")}),o.jsx("p",{className:"text-white/90",children:e("landing.pricing.freeSubtitle")})]}),o.jsx("ul",{className:"space-y-4 mb-10 flex-grow",children:[1,2,3,4,5].map(n=>o.jsxs("li",{className:"flex items-center gap-3 text-white/90",children:[o.jsx(fa,{className:"w-5 h-5 text-emerald-400"}),e(`home.plans.free.feature${n}`)]},n))}),o.jsx("button",{onClick:()=>t("/signup"),className:"w-full py-4 rounded-xl border-2 border-white/20 text-white font-semibold hover:bg-white/10 transition-all",children:e("landing.pricing.freeCta")})]}),o.jsxs("div",{className:"relative flex flex-col p-10 rounded-3xl bg-white text-slate-900 shadow-2xl transform md:scale-105",children:[o.jsx("div",{className:"absolute -top-4 left-1/2 -translate-x-1/2 px-4 py-1.5 bg-gradient-to-r from-[#D4AF37] to-[#B8960C] text-white text-xs font-bold rounded-full shadow-lg",children:e("landing.pricing.popularBadge")}),o.jsxs("div",{className:"mb-8",children:[o.jsxs("span",{className:"inline-flex items-center gap-1.5 px-3 py-1 rounded-full bg-[#0E3639] text-white text-xs font-semibold mb-4",children:[o.jsx(da,{className:"w-3 h-3"}),e("home.plans.premium.badge")]}),o.jsx("h3",{className:"text-3xl font-extrabold text-[#0E3639] mb-2",children:e("home.plans.premium.title")}),o.jsxs("div",{className:"flex items-baseline gap-2",children:[o.jsx("span",{className:"text-sm text-slate-500",children:e("landing.pricing.startingFrom")}),o.jsx("span",{className:"text-4xl font-extrabold text-[#D4AF37]",children:"3â¬"}),o.jsxs("span",{className:"text-slate-400",children:["/ ",e("landing.pricing.perAnalysis")]})]})]}),o.jsx("ul",{className:"space-y-4 mb-10 flex-grow",children:[1,2,3,4,5,6,7].map(n=>o.jsxs("li",{className:"flex items-center gap-3 text-slate-700",children:[o.jsx("div",{className:"w-5 h-5 rounded-full bg-[#D4AF37]/20 flex items-center justify-center",children:o.jsx(fa,{className:"w-3 h-3 text-[#D4AF37]"})}),e(`home.plans.premium.feature${n}`)]},n))}),o.jsx("button",{onClick:()=>t("/signup"),className:"w-full py-4 rounded-xl bg-[#0E3639] hover:bg-[#0b2a2d] text-white font-bold transition-all shadow-lg hover:shadow-xl hover:scale-[1.02] active:scale-[0.98]",children:e("home.plans.premium.cta")})]})]})]})]})}function CV(){const{t:e,language:t}=Ge(),n=xt(),r=g.useMemo(()=>hO(t).slice(0,3),[t]),a=i=>{const s=i.toLowerCase();return s.includes("peb")||s.includes("epc")||s.includes("énergie")?"bg-green-500":s.includes("financement")||s.includes("financiering")||s.includes("frais")||s.includes("notaire")?"bg-blue-500":s.includes("investissement")||s.includes("investering")||s.includes("rendement")?"bg-amber-500":s.includes("premier ach
7073at")||s.includes("eerste aankoop")?"bg-purple-500":"bg-slate-500"};return o.jsxs("section",{className:"landing-section py-32 bg-white relative overflow-hidden",children:[o.jsxs("div",{className:"absolute inset-0",children:[o.jsx("div",{className:"absolute top-1/4 left-0 w-[500px] h-[500px] bg-[#D4AF37]/5 rounded-full blur-[150px]"}),o.jsx("div",{className:"absolute bottom-0 right-1/4 w-[400px] h-[400px] bg-purple-500/5 rounded-full blur-[120px]"})]}),o.jsxs("div",{style:{maxWidth:"1200px",margin:"0 auto",padding:"0 32px"},className:"relative z-10",children:[o.jsxs("div",{className:"text-center mb-16",children:[o.jsxs("span",{className:"inline-block px-4 py-2 rounded-full bg-[#D4AF37]/10 text-[#D4AF37] text-sm font-semibold mb-6 border border-[#D4AF37]/20",children:[o.jsx(hi,{className:"w-4 h-4 inline mr-2"}),e("landing.blog.badge")]}),o.jsx("h2",{className:"text-4xl md:text-5xl font-extrabold text-[#0E3639] mb-6",children:e("landing.blog.title")}),o.jsx("p",{className:"text-xl text-slate-500 max-w-2xl mx-auto",children:e("landing.blog.subtitle")}),o.jsx("div",{className:"h-1 w-20 bg-gradient-to-r from-[#D4AF37] to-[#0E3639] mx-auto rounded-full mt-6"})]}),o.jsx("div",{className:"grid md:grid-cols-2 lg:grid-cols-3 gap-8",children:r.map((i,s)=>o.jsxs("article",{onClick:()=>n(`/blog/${i.slug}`),className:"group bg-white rounded-2xl border border-slate-200 overflow-hidden cursor-pointer transition-all duration-500 hover:shadow-2xl hover:shadow-slate-200/50 hover:-translate-y-2 hover:border-[#D4AF37]/30",children:[o.jsxs("div",{className:"relative h-48 bg-gradient-to-br from-slate-100 to-slate-200 overflow-hidden",children:[i.image?o.jsx("img",{src:i.image,alt:i.title,className:"w-full h-full object-cover group-hover:scale-105 transition-transform duration-500"}):o.jsxs(o.Fragment,{children:[o.jsx("div",{className:"absolute inset-0 bg-gradient-to-br from-[#0E3639]/5 to-[#D4AF37]/5"}),o.jsx("div",{className:"absolute inset-0 flex items-center justify-center",children:o.jsx(nf,{className:"w-16 h-16 text-slate-300"})})]}),o.jsx("span",{className:`absolute top-4 left-4 px-3 py-1 rounded-full text-white text-xs font-semibold ${a(i.tag)}`,children:i.tag}),s===0&&o.jsxs("span",{className:"absolute top-4 right-4 px-3 py-1 rounded-full bg-[#D4AF37] text-white text-xs font-semibold flex items-center gap-1",children:[o.jsx(Vs,{className:"w-3 h-3"}),e("landing.blog.trending")]})]}),o.jsxs("div",{className:"p-6",children:[o.jsxs("div",{className:"flex items-center gap-4 text-sm text-slate-400 mb-3",children:[o.jsxs("span",{className:"flex items-center gap-1",children:[o.jsx(Bx,{className:"w-4 h-4"}),i.publishDate]}),o.jsxs("span",{className:"flex items-center gap-1",children:[o.jsx(Ox,{className:"w-4 h-4"}),i.readTime]})]}),o.jsx("h3",{className:"text-xl font-bold text-[#0E3639] mb-3 group-hover:text-[#D4AF37] transition-colors line-clamp-2",children:i.title}),o.jsx("p",{className:"text-slate-500 text-sm leading-relaxed mb-4 line-clamp-3",children:i.excerpt}),o.jsxs("div",{className:"flex items-center gap-2 text-[#0E3639] font-semibold text-sm group-hover:text-[#D4AF37] transition-colors",children:[o.jsx("span",{children:e("landing.blog.readMore")}),o.jsx(et,{className:"w-4 h-4 group-hover:translate-x-1 transition-transform"})]})]})]},i.slug))}),o.jsx("div",{className:"text-center mt-12",children:o.jsxs("button",{onClick:()=>n("/blog"),className:"inline-flex items-center gap-3 px-8 py-4 bg-[#0E3639] hover:bg-[#0b2a2d] text-white rounded-xl font-semibold transition-all shadow-lg hover:shadow-xl",children:[e("landing.blog.viewAll"),o.jsx(et,{className:"w-5 h-5"})]})})]})]})}function SV(){const{t:e,language:t}=Ge(),n=xt();return o.jsxs("section",{className:"landing-section py-32 bg-slate-50 relative overflow-hidden",children:[o.jsx("div",{className:"absolute inset-0",style:{background:` 7074 radial-gradient(ellipse 80% 50% at 50% 100%, rgba(212, 175, 55, 0.15), transparent), 7075 radial-gradient(ellipse 60% 40% at 0% 50%, rgba(168, 85, 247, 0.08), transparent), 7076 radial-gradient(ellipse 60% 40% at 100% 50%, rgba(14, 54, 57, 0.08), transparent) 7077 `}}),o.jsxs("div",{style:{maxWidth:"900px",margin:"0 auto",padding:"0 32px"},className:"text-center relative z-10",children:[o.jsxs("div",{className:"inline-flex items-center gap-2 px-4 py-2 rounded-full bg-[#D4AF37]/10 border border-[#D4AF37]/30 mb-8",children:[o.jsx(da,{className:"w-4 h-4 text-[#D4AF37]"}),o.jsx("span",{className:"text-[#D4AF37] font-semibold text-sm",children:e("landing.cta.badge")})]}),o.jsx("h2",{className:"text-5xl md:text-6xl font-extrabold text-[#0E3639] mb-8 leading-tight",children:e("home.cta.title")}),o.jsx("p",{className:"text-xl text-slate-500 mb-6 max-w-2xl mx-auto",children:e("home.cta.subtitle")}),o.jsx("p",{className:"text-lg italic text-[#D4AF37] font-medium mb-12",children:'"See Beyond the Bricks."'}),o.jsx("div",{className:"flex flex-col sm:flex-row items-center justify-center gap-4",children:o.jsxs(ka,{size:"lg",onClick:()=>n("/free-analyse"),className:"text-lg px-10 py-7 h-auto bg-[#D4AF37] hover:bg-[#c9a432] text-white font-bold rounded-xl shadow-xl shadow-[#D4AF37]/20 hover:shadow-2xl hover:-translate-y-1 transition-all",children:[e("home.cta.button"),o.jsx(et,{className:"w-5 h-5 ml-2"})]})}),o.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-x-6 gap-y-3 mt-10 text-sm",children:[o.jsxs(Ce,{to:t==="nl"?"/gemeenten":"/communes",className:"text-slate-400 hover:text-[#D4AF37] transition-colors flex items-center gap-1.5",children:[o.jsx(sf,{className:"w-3.5 h-3.5"}),t==="nl"?"581 Belgische gemeenten":"581 communes belges"]}),o.jsxs(Ce,{to:t==="nl"?"/verkenning":"/exploration",className:"text-slate-400 hover:text-[#D4AF37] transition-colors flex items-center gap-1.5",children:[o.jsx(Jx,{className:"w-3.5 h-3.5"}),t==="nl"?"Interactieve screener":"Screener interactif"]}
7077),o.jsxs(Ce,{to:t==="nl"?"/simulator/onroerende-voorheffing":"/simulateur/precompte-immobilier",className:"text-slate-400 hover:text-[#D4AF37] transition-colors flex items-center gap-1.5",children:[o.jsx(rf,{className:"w-3.5 h-3.5"}),t==="nl"?"Simulator voorheffing":"Simulateur précompte"]}),o.jsxs(Ce,{to:"/simulateur",className:"text-slate-400 hover:text-[#D4AF37] transition-colors flex items-center gap-1.5",children:[o.jsx(Ps,{className:"w-3.5 h-3.5"}),t==="nl"?"7 simulatoren":"7 simulateurs"]})]})]})]})}var _e;(function(e){e.assertEqual=a=>a;function t(a){}e.assertIs=t;function n(a){throw new Error}e.assertNever=n,e.arrayToEnum=a=>{const i={};for(const s of a)i[s]=s;return i},e.getValidEnumValues=a=>{const i=e.objectKeys(a).filter(l=>typeof a[a[l]]!="number"),s={};for(const l of i)s[l]=a[l];return e.objectValues(s)},e.objectValues=a=>e.objectKeys(a).map(function(i){return a[i]}),e.objectKeys=typeof Object.keys=="function"?a=>Object.keys(a):a=>{const i=[];for(const s in a)Object.prototype.hasOwnProperty.call(a,s)&&i.push(s);return i},e.find=(a,i)=>{for(const s of a)if(i(s))return s},e.isInteger=typeof Number.isInteger=="function"?a=>Number.isInteger(a):a=>typeof a=="number"&&isFinite(a)&&Math.floor(a)===a;function r(a,i=" | "){return a.map(s=>typeof s=="string"?`'${s}'`:s).join(i)}e.joinValues=r,e.jsonStringifyReplacer=(a,i)=>typeof i=="bigint"?i.toString():i})(_e||(_e={}));var Jg;(function(e){e.mergeShapes=(t,n)=>({...t,...n})})(Jg||(Jg={}));const ee=_e.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),$r=e=>{switch(typeof e){case"undefined":return ee.undefined;case"string":return ee.string;
vendor: 54,555 bytes, line 7077
7077case"number":return isNaN(e)?ee.nan:ee.number;case"boolean":return ee.boolean;case"function":return ee.function;case"bigint":return ee.bigint;case"symbol":return ee.symbol;case"object":return Array.isArray(e)?ee.array:e===null?ee.null:e.then&&typeof e.then=="function"&&e.catch&&typeof e.catch=="function"?ee.promise:typeof Map<"u"&&e instanceof Map?ee.map:typeof Set<"u"&&e instanceof Set?ee.set:typeof Date<"u"&&e instanceof Date?ee.date:ee.object;default:return ee.unknown}},W=_e.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"]),_V=e=>JSON.stringify(e,null,2).replace(/"([^"]+)":/g,"$1:");class en extends Error{constructor(t){super(),this.issues=[],this.addIssue=r=>{this.issues=[...this.issues,r]},this.addIssues=(r=[])=>{this.issues=[...this.issues,...r]};const n=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,n):this.__proto__=n,this.name="ZodError",this.issues=t}get errors(){return this.issues}format(t){const n=t||function(i){return i.message},r={_errors:[]},a=i=>{for(const s of i.issues)if(s.code==="invalid_union")s.unionErrors.map(a);else if(s.code==="invalid_return_type")a(s.returnTypeError);else if(s.code==="invalid_arguments")a(s.argumentsError);else if(s.path.length===0)r._errors.push(n(s));else{let l=r,d=0;for(;d<s.path.length;){const c=s.path[d];d===s.path.length-1?(l[c]=l[c]||{_errors:[]},l[c]._errors.push(n(s))):l[c]=l[c]||{_errors:[]},l=l[c],d++}}};return a(this),r}static assert(t){if(!(t instanceof en))throw new Error(`Not a ZodError: ${t}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,_e.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(t=n=>n.message){const n={},r=[];for(const a of this.issues)a.path.length>0?(n[a.path[0]]=n[a.path[0]]||[],n[a.path[0]].push(t(a))):r.push(t(a));return{formErrors:r,fieldErrors:n}}get formErrors(){return this.flatten()}}en.create=e=>new en(e);const Is=(e,t)=>{let n;switch(e.code){case W.invalid_type:e.received===ee.undefined?n="Required":n=`Expected ${e.expected}, received ${e.received}`;break;case W.invalid_literal:n=`Invalid literal value, expected ${JSON.stringify(e.expected,_e.jsonStringifyReplacer)}`;break;case W.unrecognized_keys:n=`Unrecognized key(s) in object: ${_e.joinValues(e.keys,", ")}`;break;case W.invalid_union:n="Invalid input";break;case W.invalid_union_discriminator:n=`Invalid discriminator value. Expected ${_e.joinValues(e.options)}`;break;case W.invalid_enum_value:n=`Invalid enum value. Expected ${_e.joinValues(e.options)}, received '${e.received}'`;break;case W.invalid_arguments:n="Invalid function arguments";break;case W.invalid_return_type:n="Invalid function return type";break;case W.invalid_date:n="Invalid date";break;case W.invalid_string:typeof e.validation=="object"?"includes"in e.validation?(n=`Invalid input: must include "${e.validation.includes}"`,typeof e.validation.position=="number"&&(n=`${n} at one or more positions greater than or equal to ${e.validation.position}`)):"startsWith"in e.validation?n=`Invalid input: must start with "${e.validation.startsWith}"`:"endsWith"in e.validation?n=`Invalid input: must end with "${e.validation.endsWith}"`:_e.assertNever(e.validation):e.validation!=="regex"?n=`Invalid ${e.validation}`:n="Invalid";break;case W.too_small:e.type==="array"?n=`Array must contain ${e.exact?"exactly":e.inclusive?"at least":"more than"} ${e.minimum} element(s)`:e.type==="string"?n=`String must contain ${e.exact?"exactly":e.inclusive?"at least":"over"} ${e.minimum} character(s)`:e.type==="number"?n=`Number must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${e.minimum}`:e.type==="date"?n=`Date must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(e.minimum))}`:n="Invalid input";break;case W.too_big:e.type==="array"?n=`Array must contain ${e.exact?"exactly":e.inclusive?"at most":"less than"} ${e.maximum} element(s)`:e.type==="string"?n=`String must contain ${e.exact?"exactly":e.inclusive?"at most":"under"} ${e.maximum} character(s)`:e.type==="number"?n=`Number must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="bigint"?n=`BigInt must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="date"?n=`Date must be ${e.exact?"exactly":e.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(e.maximum))}`:n="Invalid input";break;case W.custom:n="Invalid input";break;case W.invalid_intersection_types:n="Intersection results could not be merged";break;case W.not_multiple_of:n=`Number must be a multiple of ${e.multipleOf}`;break;case W.not_finite:n="Number must be finite";break;default:n=t.defaultError,_e.assertNever(e)}return{message:n}};let ZA=Is;function TV(e){ZA=e}function $c(){return ZA}const Gc=e=>{const{data:t,path:n,errorMaps:r,issueData:a}=e,i=[...n,...a.path||[]],s={...a,path:i};if(a.message!==void 0)return{...a,path:i,message:a.message};let l="";const d=r.filter(c=>!!c).slice().reverse();for(const c of d)l=c(s,{data:t,defaultError:l}).message;return{...a,path:i,message:l}},DV=[];function J(e,t){const n=$c(),r=Gc({issueData:t,data:e.data,path:e.path,errorMaps:[e.common.contextualErrorMap,e.schemaErrorMap,n,n===Is?void 0:Is].filter(a=>!!a)});e.common.issues.push(r)}class Tt{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(t,n){const r=[];for(const a of n){if(a.status==="aborted")return me;a.status==="dirty"&&t.dirty(),r.push(a.value)}return{status:t.value,value:r}}static async mergeObjectAsync(t,n){const r=[];for(const a of n){const i=await a.key,s=await a.value;r.push({key:i,value:s})}return Tt.mergeObjectSync(t,r)}static mergeObjectSync(t,n){const r={};for(const a of n){const{key:i,value:s}=a;if(i.status==="aborted"||s.status==="aborted")return me;i.status==="dirty"&&t.dirty(),s.status==="dirty"&&t.dirty(),i.value!=="__proto__"&&(typeof s.value<"u"||a.alwaysSet)&&(r[i.value]=s.value)}return{status:t.value,value:r}}}const me=Object.freeze({status:"aborted"}),Ki=e=>({status:"dirty",value:e}),Bt=e=>({status:"valid",value:e}),Qg=e=>e.status==="aborted",Xg=e=>e.status==="dirty",ul=e=>e.status==="valid",ml=e=>typeof Promise<"u"&&e instanceof Promise;function Hc(e,t,n,r){if(typeof t=="function"?e!==t||!r:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return t.get(e)}function JA(e,t,n,r,a){if(typeof t=="function"?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return t.set(e,n),n}var se;(function(e){e.errToObj=t=>typeof t=="string"?{message:t}:t||{},e.toString=t=>typeof t=="string"?t:t==null?void 0:t.message})(se||(se={}));var wo,ko;class sr{constructor(t,n,r,a){this._cachedPath=[],this.parent=t,this.data=n,this._path=r,this._key=a}get path(){return this._cachedPath.length||(this._key instanceof Array?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}}const c0=(e,t)=>{if(ul(t))return{success:!0,data:t.value};if(!e.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 en(e.common.issues);return this._error=n,this._error}}};function ve(e){if(!e)return{};const{errorMap:t,invalid_type_error:n,required_error:r,description:a}=e;if(t&&(n||r))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return t?{errorMap:t,description:a}:{errorMap:(s,l)=>{var d,c;const{message:u}=e;return s.code==="invalid_enum_value"?{message:u??l.defaultError}:typeof l.data>"u"?{message:(d=u??r)!==null&&d!==void 0?d:l.defaultError}:s.code!=="invalid_type"?{message:l.defaultError}:{message:(c=u??n)!==null&&c!==void 0?c:l.defaultError}},description:a}}class je{constructor(t){this.spa=this.safeParseAsync,this._def=t,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)}get description(){return this._def.description}_getType(t){return $r(t.data)}_getOrReturnCtx(t,n){return n||{common:t.parent.common,data:t.data,parsedType:$r(t.data),schemaErrorMap:this._def.errorMap,path:t.path,parent:t.parent}}_processInputParams(t){return{status:new Tt,ctx:{common:t.parent.common,data:t.data,parsedType:$r(t.data),schemaErrorMap:this._def.errorMap,path:t.path,parent:t.parent}}}_parseSync(t){const n=this._parse(t);if(ml(n))throw new Error("Synchronous parse encountered promise.");return n}_parseAsync(t){const n=this._parse(t);return Promise.resolve(n)}parse(t,n){const r=this.safeParse(t,n);if(r.success)return r.data;throw r.error}safeParse(t,n){var r;const a={common:{issues:[],async:(r=n==null?void 0:n.async)!==null&&r!==void 0?r:!1,contextualErrorMap:n==null?void 0:n.errorMap},path:(n==null?void 0:n.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:$r(t)},i=this._parseSync({data:t,path:a.path,parent:a});return c0(a,i)}async parseAsync(t,n){const r=await this.safeParseAsync(t,n);if(r.success)return r.data;throw r.error}async safeParseAsync(t,n){const r={common:{issues:[],contextualErrorMap:n==null?void 0:n.errorMap,async:!0},path:(n==null?void 0:n.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:$r(t)},a=this._parse({data:t,path:r.path,parent:r}),i=await(ml(a)?a:Promise.resolve(a));return c0(r,i)}refine(t,n){const r=a=>typeof n=="string"||typeof n>"u"?{message:n}:typeof n=="function"?n(a):n;return this._refinement((a,i)=>{const s=t(a),l=()=>i.addIssue({code:W.custom,...r(a)});return typeof Promise<"u"&&s instanceof Promise?s.then(d=>d?!0:(l(),!1)):s?!0:(l(),!1)})}refinement(t,n){return this._refinement((r,a)=>t(r)?!0:(a.addIssue(typeof n=="function"?n(r,a):n),!1))}_refinement(t){return new Nn({schema:this,typeName:ue.ZodEffects,effect:{type:"refinement",refinement:t}})}superRefine(t){return this._refinement(t)}optional(){return ar.create(this,this._def)}nullable(){return Ea.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return Rn.create(this,this._def)}promise(){return Ns.create(this,this._def)}or(t){return fl.create([this,t],this._def)}and(t){return vl.create(this,t,this._def)}transform(t){return new Nn({...ve(this._def),schema:this,typeName:ue.ZodEffects,effect:{type:"transform",transform:t}})}default(t){const n=typeof t=="function"?t:()=>t;return new xl({...ve(this._def),innerType:this,defaultValue:n,typeName:ue.ZodDefault})}brand(){return new dv({typeName:ue.ZodBranded,type:this,...ve(this._def)})}catch(t){const n=typeof t=="function"?t:()=>t;return new jl({...ve(this._def),innerType:this,catchValue:n,typeName:ue.ZodCatch})}describe(t){const n=this.constructor;return new n({...this._def,description:t})}pipe(t){return Vl.create(this,t)}readonly(){return Al.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}const RV=/^c[^\s-]{8,}$/i,zV=/^[0-9a-z]+$/,IV=/^[0-9A-HJKMNP-TV-Z]{26}$/,qV=/^[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,NV=/^[a-z0-9_-]{21}$/i,LV=/^[-+]?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)?)??$/,BV=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,MV="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$";let Xm;const FV=/^(?:(?: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])$/,OV=/^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,VV=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,QA="((\\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])))",WV=new RegExp(`^${QA}$`);function XA(e){let t="([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d";return e.precision?t=`${t}\\.\\d{${e.precision}}`:e.precision==null&&(t=`${t}(\\.\\d+)?`),t}function UV(e){return new RegExp(`^${XA(e)}$`)}function eE(e){let t=`${QA}T${XA(e)}`;const n=[];return n.push(e.local?"Z?":"Z"),e.offset&&n.push("([+-]\\d{2}:?\\d{2})"),t=`${t}(${n.join("|")})`,new RegExp(`^${t}$`)}function $V(e,t){return!!((t==="v4"||!t)&&FV.test(e)||(t==="v6"||!t)&&OV.test(e))}class _n extends je{_parse(t){if(this._def.coerce&&(t.data=String(t.data)),this._getType(t)!==ee.string){const i=this._getOrReturnCtx(t);return J(i,{code:W.invalid_type,expected:ee.string,received:i.parsedType}),me}const r=new Tt;let a;for(const i of this._def.checks)if(i.kind==="min")t.data.length<i.value&&(a=this._getOrReturnCtx(t,a),J(a,{code:W.too_small,minimum:i.value,type:"string",inclusive:!0,exact:!1,message:i.message}),r.dirty());else if(i.kind==="max")t.data.length>i.value&&(a=this._getOrReturnCtx(t,a),J(a,{code:W.too_big,maximum:i.value,type:"string",inclusive:!0,exact:!1,message:i.message}),r.dirty());else if(i.kind==="length"){const s=t.data.length>i.value,l=t.data.length<i.value;(s||l)&&(a=this._getOrReturnCtx(t,a),s?J(a,{code:W.too_big,maximum:i.value,type:"string",inclusive:!0,exact:!0,message:i.message}):l&&J(a,{code:W.too_small,minimum:i.value,type:"string",inclusive:!0,exact:!0,message:i.message}),r.dirty())}else if(i.kind==="email")BV.test(t.data)||(a=this._getOrReturnCtx(t,a),J(a,{validation:"email",code:W.invalid_string,message:i.message}),r.dirty());else if(i.kind==="emoji")Xm||(Xm=new RegExp(MV,"u")),Xm.test(t.data)||(a=this._getOrReturnCtx(t,a),J(a,{validation:"emoji",code:W.invalid_string,message:i.message}),r.dirty());else if(i.kind==="uuid")qV.test(t.data)||(a=this._getOrReturnCtx(t,a),J(a,{validation:"uuid",code:W.invalid_string,message:i.message}),r.dirty());else if(i.kind==="nanoid")NV.test(t.data)||(a=this._getOrReturnCtx(t,a),J(a,{validation:"nanoid",code:W.invalid_string,message:i.message}),r.dirty());else if(i.kind==="cuid")RV.test(t.data)||(a=this._getOrReturnCtx(t,a),J(a,{validation:"cuid",code:W.invalid_string,message:i.message}),r.dirty());else if(i.kind==="cuid2")zV.test(t.data)||(a=this._getOrReturnCtx(t,a),J(a,{validation:"cuid2",code:W.invalid_string,message:i.message}),r.dirty());else if(i.kind==="ulid")IV.test(t.data)||(a=this._getOrReturnCtx(t,a),J(a,{validation:"ulid",code:W.invalid_string,message:i.message}),r.dirty());else if(i.kind==="url")try{new URL(t.data)}catch{a=this._getOrReturnCtx(t,a),J(a,{validation:"url",code:W.invalid_string,message:i.message}),r.dirty()}else i.kind==="regex"?(i.regex.lastIndex=0,i.regex.test(t.data)||(a=this._getOrReturnCtx(t,a),J(a,{validation:"regex",code:W.invalid_string,message:i.message}),r.dirty())):i.kind==="trim"?t.data=t.data.trim():i.kind==="includes"?t.data.includes(i.value,i.position)||(a=this._getOrReturnCtx(t,a),J(a,{code:W.invalid_string,validation:{includes:i.value,position:i.position},message:i.message}),r.dirty()):i.kind==="toLowerCase"?t.data=t.data.toLowerCase():i.kind==="toUpperCase"?t.data=t.data.toUpperCase():i.kind==="startsWith"?t.data.startsWith(i.value)||(a=this._getOrReturnCtx(t,a),J(a,{code:W.invalid_string,validation:{startsWith:i.value},message:i.message}),r.dirty()):i.kind==="endsWith"?t.data.endsWith(i.value)||(a=this._getOrReturnCtx(t,a),J(a,{code:W.invalid_string,validation:{endsWith:i.value},message:i.message}),r.dirty()):i.kind==="datetime"?eE(i).test(t.data)||(a=this._getOrReturnCtx(t,a),J(a,{code:W.invalid_string,validation:"datetime",message:i.message}),r.dirty()):i.kind==="date"?WV.test(t.data)||(a=this._getOrReturnCtx(t,a),J(a,{code:W.invalid_string,validation:"date",message:i.message}),r.dirty()):i.kind==="time"?UV(i).test(t.data)||(a=this._getOrReturnCtx(t,a),J(a,{code:W.invalid_string,validation:"time",message:i.message}),r.dirty()):i.kind==="duration"?LV.test(t.data)||(a=this._getOrReturnCtx(t,a),J(a,{validation:"duration",code:W.invalid_string,message:i.message}),r.dirty()):i.kind==="ip"?$V(t.data,i.version)||(a=this._getOrReturnCtx(t,a),J(a,{validation:"ip",code:W.invalid_string,message:i.message}),r.dirty()):i.kind==="base64"?VV.test(t.data)||(a=this._getOrReturnCtx(t,a),J(a,{validation:"base64",code:W.invalid_string,message:i.message}),r.dirty()):_e.assertNever(i);return{status:r.value,value:t.data}}_regex(t,n,r){return this.refinement(a=>t.test(a),{validation:n,code:W.invalid_string,...se.errToObj(r)})}_addCheck(t){return new _n({...this._def,checks:[...this._def.checks,t]})}email(t){return this._addCheck({kind:"email",...se.errToObj(t)})}url(t){return this._addCheck({kind:"url",...se.errToObj(t)})}emoji(t){return this._addCheck({kind:"emoji",...se.errToObj(t)})}uuid(t){return this._addCheck({kind:"uuid",...se.errToObj(t)})}nanoid(t){return this._addCheck({kind:"nanoid",...se.errToObj(t)})}cuid(t){return this._addCheck({kind:"cuid",...se.errToObj(t)})}cuid2(t){return this._addCheck({kind:"cuid2",...se.errToObj(t)})}ulid(t){return this._addCheck({kind:"ulid",...se.errToObj(t)})}base64(t){return this._addCheck({kind:"base64",...se.errToObj(t)})}ip(t){return this._addCheck({kind:"ip",...se.errToObj(t)})}datetime(t){var n,r;return typeof t=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:t}):this._addCheck({kind:"datetime",precision:typeof(t==null?void 0:t.precision)>"u"?null:t==null?void 0:t.precision,offset:(n=t==null?void 0:t.offset)!==null&&n!==void 0?n:!1,local:(r=t==null?void 0:t.local)!==null&&r!==void 0?r:!1,...se.errToObj(t==null?void 0:t.message)})}date(t){return this._addCheck({kind:"date",message:t})}time(t){return typeof t=="string"?this._addCheck({kind:"time",precision:null,message:t}):this._addCheck({kind:"time",precision:typeof(t==null?void 0:t.precision)>"u"?null:t==null?void 0:t.precision,...se.errToObj(t==null?void 0:t.message)})}duration(t){return this._addCheck({kind:"duration",...se.errToObj(t)})}regex(t,n){return this._addCheck({kind:"regex",regex:t,...se.errToObj(n)})}includes(t,n){return this._addCheck({kind:"includes",value:t,position:n==null?void 0:n.position,...se.errToObj(n==null?void 0:n.message)})}startsWith(t,n){return this._addCheck({kind:"startsWith",value:t,...se.errToObj(n)})}endsWith(t,n){return this._addCheck({kind:"endsWith",value:t,...se.errToObj(n)})}min(t,n){return this._addCheck({kind:"min",value:t,...se.errToObj(n)})}max(t,n){return this._addCheck({kind:"max",value:t,...se.errToObj(n)})}length(t,n){return this._addCheck({kind:"length",value:t,...se.errToObj(n)})}nonempty(t){return this.min(1,se.errToObj(t))}trim(){return new _n({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new _n({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new _n({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(t=>t.kind==="datetime")}get isDate(){return!!this._def.checks.find(t=>t.kind==="date")}get isTime(){return!!this._def.checks.find(t=>t.kind==="time")}get isDuration(){return!!this._def.checks.find(t=>t.kind==="duration")}get isEmail(){return!!this._def.checks.find(t=>t.kind==="email")}get isURL(){return!!this._def.checks.find(t=>t.kind==="url")}get isEmoji(){return!!this._def.checks.find(t=>t.kind==="emoji")}get isUUID(){return!!this._def.checks.find(t=>t.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(t=>t.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(t=>t.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(t=>t.kind==="cuid2")}get isULID(){return!!this._def.checks.find(t=>t.kind==="ulid")}get isIP(){return!!this._def.checks.find(t=>t.kind==="ip")}get isBase64(){return!!this._def.checks.find(t=>t.kind==="base64")}get minLength(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxLength(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.value<t)&&(t=n.value);return t}}_n.create=e=>{var t;return new _n({checks:[],typeName:ue.ZodString,coerce:(t=e==null?void 0:e.coerce)!==null&&t!==void 0?t:!1,...ve(e)})};function GV(e,t){const n=(e.toString().split(".")[1]||"").length,r=(t.toString().split(".")[1]||"").length,a=n>r?n:r,i=parseInt(e.toFixed(a).replace(".","")),s=parseInt(t.toFixed(a).replace(".",""));return i%s/Math.pow(10,a)}class xa extends je{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(t){if(this._def.coerce&&(t.data=Number(t.data)),this._getType(t)!==ee.number){const i=this._getOrReturnCtx(t);return J(i,{code:W.invalid_type,expected:ee.number,received:i.parsedType}),me}let r;const a=new Tt;for(const i of this._def.checks)i.kind==="int"?_e.isInteger(t.data)||(r=this._getOrReturnCtx(t,r),J(r,{code:W.invalid_type,expected:"integer",received:"float",message:i.message}),a.dirty()):i.kind==="min"?(i.inclusive?t.data<i.value:t.data<=i.value)&&(r=this._getOrReturnCtx(t,r),J(r,{code:W.too_small,minimum:i.value,type:"number",inclusive:i.inclusive,exact:!1,message:i.message}),a.dirty()):i.kind==="max"?(i.inclusive?t.data>i.value:t.data>=i.value)&&(r=this._getOrReturnCtx(t,r),J(r,{code:W.too_big,maximum:i.value,type:"number",inclusive:i.inclusive,exact:!1,message:i.message}),a.dirty()):i.kind==="multipleOf"?GV(t.data,i.value)!==0&&(r=this._getOrReturnCtx(t,r),J(r,{code:W.not_multiple_of,multipleOf:i.value,message:i.message}),a.dirty()):i.kind==="finite"?Number.isFinite(t.data)||(r=this._getOrReturnCtx(t,r),J(r,{code:W.not_finite,message:i.message}),a.dirty()):_e.assertNever(i);return{status:a.value,value:t.data}}gte(t,n){return this.setLimit("min",t,!0,se.toString(n))}gt(t,n){return this.setLimit("min",t,!1,se.toString(n))}lte(t,n){return this.setLimit("max",t,!0,se.toString(n))}lt(t,n){return this.setLimit("max",t,!1,se.toString(n))}setLimit(t,n,r,a){return new xa({...this._def,checks:[...this._def.checks,{kind:t,value:n,inclusive:r,message:se.toString(a)}]})}_addCheck(t){return new xa({...this._def,checks:[...this._def.checks,t]})}int(t){return this._addCheck({kind:"int",message:se.toString(t)})}positive(t){return this._addCheck({kind:"min",value:0,inclusive:!1,message:se.toString(t)})}negative(t){return this._addCheck({kind:"max",value:0,inclusive:!1,message:se.toString(t)})}nonpositive(t){return this._addCheck({kind:"max",value:0,inclusive:!0,message:se.toString(t)})}nonnegative(t){return this._addCheck({kind:"min",value:0,inclusive:!0,message:se.toString(t)})}multipleOf(t,n){return this._addCheck({kind:"multipleOf",value:t,message:se.toString(n)})}finite(t){return this._addCheck({kind:"finite",message:se.toString(t)})}safe(t){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:se.toString(t)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:se.toString(t)})}get minValue(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxValue(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.value<t)&&(t=n.value);return t}get isInt(){return!!this._def.checks.find(t=>t.kind==="int"||t.kind==="multipleOf"&&_e.isInteger(t.value))}get isFinite(){let t=null,n=null;for(const r of this._def.checks){if(r.kind==="finite"||r.kind==="int"||r.kind==="multipleOf")return!0;r.kind==="min"?(n===null||r.value>n)&&(n=r.value):r.kind==="max"&&(t===null||r.value<t)&&(t=r.value)}return Number.isFinite(n)&&Number.isFinite(t)}}xa.create=e=>new xa({checks:[],typeName:ue.ZodNumber,coerce:(e==null?void 0:e.coerce)||!1,...ve(e)});class ja extends je{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(t){if(this._def.coerce&&(t.data=BigInt(t.data)),this._getType(t)!==ee.bigint){const i=this._getOrReturnCtx(t);return J(i,{code:W.invalid_type,expected:ee.bigint,received:i.parsedType}),me}let r;const a=new Tt;for(const i of this._def.checks)i.kind==="min"?(i.inclusive?t.data<i.value:t.data<=i.value)&&(r=this._getOrReturnCtx(t,r),J(r,{code:W.too_small,type:"bigint",minimum:i.value,inclusive:i.inclusive,message:i.message}),a.dirty()):i.kind==="max"?(i.inclusive?t.data>i.value:t.data>=i.value)&&(r=this._getOrReturnCtx(t,r),J(r,{code:W.too_big,type:"bigint",maximum:i.value,inclusive:i.inclusive,message:i.message}),a.dirty()):i.kind==="multipleOf"?t.data%i.value!==BigInt(0)&&(r=this._getOrReturnCtx(t,r),J(r,{code:W.not_multiple_of,multipleOf:i.value,message:i.message}),a.dirty()):_e.assertNever(i);return{status:a.value,value:t.data}}gte(t,n){return this.setLimit("min",t,!0,se.toString(n))}gt(t,n){return this.setLimit("min",t,!1,se.toString(n))}lte(t,n){return this.setLimit("max",t,!0,se.toString(n))}lt(t,n){return this.setLimit("max",t,!1,se.toString(n))}setLimit(t,n,r,a){return new ja({...this._def,checks:[...this._def.checks,{kind:t,value:n,inclusive:r,message:se.toString(a)}]})}_addCheck(t){return new ja({...this._def,checks:[...this._def.checks,t]})}positive(t){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:se.toString(t)})}negative(t){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:se.toString(t)})}nonpositive(t){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:se.toString(t)})}nonnegative(t){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:se.toString(t)})}multipleOf(t,n){return this._addCheck({kind:"multipleOf",value:t,message:se.toString(n)})}get minValue(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxValue(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.value<t)&&(t=n.value);return t}}ja.create=e=>{var t;return new ja({checks:[],typeName:ue.ZodBigInt,coerce:(t=e==null?void 0:e.coerce)!==null&&t!==void 0?t:!1,...ve(e)})};class pl extends je{_parse(t){if(this._def.coerce&&(t.data=!!t.data),this._getType(t)!==ee.boolean){const r=this._getOrReturnCtx(t);return J(r,{code:W.invalid_type,expected:ee.boolean,received:r.parsedType}),me}return Bt(t.data)}}pl.create=e=>new pl({typeName:ue.ZodBoolean,coerce:(e==null?void 0:e.coerce)||!1,...ve(e)});class ci extends je{_parse(t){if(this._def.coerce&&(t.data=new Date(t.data)),this._getType(t)!==ee.date){const i=this._getOrReturnCtx(t);return J(i,{code:W.invalid_type,expected:ee.date,received:i.parsedType}),me}if(isNaN(t.data.getTime())){const i=this._getOrReturnCtx(t);return J(i,{code:W.invalid_date}),me}const r=new Tt;let a;for(const i of this._def.checks)i.kind==="min"?t.data.getTime()<i.value&&(a=this._getOrReturnCtx(t,a),J(a,{code:W.too_small,message:i.message,inclusive:!0,exact:!1,minimum:i.value,type:"date"}),r.dirty()):i.kind==="max"?t.data.getTime()>i.value&&(a=this._getOrReturnCtx(t,a),J(a,{code:W.too_big,message:i.message,inclusive:!0,exact:!1,maximum:i.value,type:"date"}),r.dirty()):_e.assertNever(i);return{status:r.value,value:new Date(t.data.getTime())}}_addCheck(t){return new ci({...this._def,checks:[...this._def.checks,t]})}min(t,n){return this._addCheck({kind:"min",value:t.getTime(),message:se.toString(n)})}max(t,n){return this._addCheck({kind:"max",value:t.getTime(),message:se.toString(n)})}get minDate(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t!=null?new Date(t):null}get maxDate(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.value<t)&&(t=n.value);return t!=null?new Date(t):null}}ci.create=e=>new ci({checks:[],coerce:(e==null?void 0:e.coerce)||!1,typeName:ue.ZodDate,...ve(e)});class Kc extends je{_parse(t){if(this._getType(t)!==ee.symbol){const r=this._getOrReturnCtx(t);return J(r,{code:W.invalid_type,expected:ee.symbol,received:r.parsedType}),me}return Bt(t.data)}}Kc.create=e=>new Kc({typeName:ue.ZodSymbol,...ve(e)});class gl extends je{_parse(t){if(this._getType(t)!==ee.undefined){const r=this._getOrReturnCtx(t);return J(r,{code:W.invalid_type,expected:ee.undefined,received:r.parsedType}),me}return Bt(t.data)}}gl.create=e=>new gl({typeName:ue.ZodUndefined,...ve(e)});class hl extends je{_parse(t){if(this._getType(t)!==ee.null){const r=this._getOrReturnCtx(t);return J(r,{code:W.invalid_type,expected:ee.null,received:r.parsedType}),me}return Bt(t.data)}}hl.create=e=>new hl({typeName:ue.ZodNull,...ve(e)});class qs extends je{constructor(){super(...arguments),this._any=!0}_parse(t){return Bt(t.data)}}qs.create=e=>new qs({typeName:ue.ZodAny,...ve(e)});class ei extends je{constructor(){super(...arguments),this._unknown=!0}_parse(t){return Bt(t.data)}}ei.create=e=>new ei({typeName:ue.ZodUnknown,...ve(e)});class Sr extends je{_parse(t){const n=this._getOrReturnCtx(t);return J(n,{code:W.invalid_type,expected:ee.never,received:n.parsedType}),me}}Sr.create=e=>new Sr({typeName:ue.ZodNever,...ve(e)});class Yc extends je{_parse(t){if(this._getType(t)!==ee.undefined){const r=this._getOrReturnCtx(t);return J(r,{code:W.invalid_type,expected:ee.void,received:r.parsedType}),me}return Bt(t.data)}}Yc.create=e=>new Yc({typeName:ue.ZodVoid,...ve(e)});class Rn extends je{_parse(t){const{ctx:n,status:r}=this._processInputParams(t),a=this._def;if(n.parsedType!==ee.array)return J(n,{code:W.invalid_type,expected:ee.array,received:n.parsedType}),me;if(a.exactLength!==null){const s=n.data.length>a.exactLength.value,l=n.data.length<a.exactLength.value;(s||l)&&(J(n,{code:s?W.too_big:W.too_small,minimum:l?a.exactLength.value:void 0,maximum:s?a.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:a.exactLength.message}),r.dirty())}if(a.minLength!==null&&n.data.length<a.minLength.value&&(J(n,{code:W.too_small,minimum:a.minLength.value,type:"array",inclusive:!0,exact:!1,message:a.minLength.message}),r.dirty()),a.maxLength!==null&&n.data.length>a.maxLength.value&&(J(n,{code:W.too_big,maximum:a.maxLength.value,type:"array",inclusive:!0,exact:!1,message:a.maxLength.message}),r.dirty()),n.common.async)return Promise.all([...n.data].map((s,l)=>a.type._parseAsync(new sr(n,s,n.path,l)))).then(s=>Tt.mergeArray(r,s));const i=[...n.data].map((s,l)=>a.type._parseSync(new sr(n,s,n.path,l)));return Tt.mergeArray(r,i)}get element(){return this._def.type}min(t,n){return new Rn({...this._def,minLength:{value:t,message:se.toString(n)}})}max(t,n){return new Rn({...this._def,maxLength:{value:t,message:se.toString(n)}})}length(t,n){return new Rn({...this._def,exactLength:{value:t,message:se.toString(n)}})}nonempty(t){return this.min(1,t)}}Rn.create=(e,t)=>new Rn({type:e,minLength:null,maxLength:null,exactLength:null,typeName:ue.ZodArray,...ve(t)});function Ii(e){if(e instanceof Ze){const t={};for(const n in e.shape){const r=e.shape[n];t[n]=ar.create(Ii(r))}return new Ze({...e._def,shape:()=>t})}else return e instanceof Rn?new Rn({...e._def,type:Ii(e.element)}):e instanceof ar?ar.create(Ii(e.unwrap())):e instanceof Ea?Ea.create(Ii(e.unwrap())):e instanceof or?or.create(e.items.map(t=>Ii(t))):e}class Ze 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 t=this._def.shape(),n=_e.objectKeys(t);return this._cached={shape:t,keys:n}}_parse(t){if(this._getType(t)!==ee.object){const c=this._getOrReturnCtx(t);return J(c,{code:W.invalid_type,expected:ee.object,received:c.parsedType}),me}const{status:r,ctx:a}=this._processInputParams(t),{shape:i,keys:s}=this._getCached(),l=[];if(!(this._def.catchall instanceof Sr&&this._def.unknownKeys==="strip"))for(const c in a.data)s.includes(c)||l.push(c);const d=[];for(const c of s){const u=i[c],m=a.data[c];d.push({key:{status:"valid",value:c},value:u._parse(new sr(a,m,a.path,c)),alwaysSet:c in a.data})}if(this._def.catchall instanceof Sr){const c=this._def.unknownKeys;if(c==="passthrough")for(const u of l)d.push({key:{status:"valid",value:u},value:{status:"valid",value:a.data[u]}});else if(c==="strict")l.length>0&&(J(a,{code:W.unrecognized_keys,keys:l}),r.dirty());else if(c!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{const c=this._def.catchall;for(const u of l){const m=a.data[u];d.push({key:{status:"valid",value:u},value:c._parse(new sr(a,m,a.path,u)),alwaysSet:u in a.data})}}return a.common.async?Promise.resolve().then(async()=>{const c=[];for(const u of d){const m=await u.key,p=await u.value;c.push({key:m,value:p,alwaysSet:u.alwaysSet})}return c}).then(c=>Tt.mergeObjectSync(r,c)):Tt.mergeObjectSync(r,d)}get shape(){return this._def.shape()}strict(t){return se.errToObj,new Ze({...this._def,unknownKeys:"strict",...t!==void 0?{errorMap:(n,r)=>{var a,i,s,l;const d=(s=(i=(a=this._def).errorMap)===null||i===void 0?void 0:i.call(a,n,r).message)!==null&&s!==void 0?s:r.defaultError;return n.code==="unrecognized_keys"?{message:(l=se.errToObj(t).message)!==null&&l!==void 0?l:d}:{message:d}}}:{}})}strip(){return new Ze({...this._def,unknownKeys:"strip"})}passthrough(){return new Ze({...this._def,unknownKeys:"passthrough"})}extend(t){return new Ze({...this._def,shape:()=>({...this._def.shape(),...t})})}merge(t){return new Ze({unknownKeys:t._def.unknownKeys,catchall:t._def.catchall,shape:()=>({...this._def.shape(),...t._def.shape()}),typeName:ue.ZodObject})}setKey(t,n){return this.augment({[t]:n})}catchall(t){return new Ze({...this._def,catchall:t})}pick(t){const n={};return _e.objectKeys(t).forEach(r=>{t[r]&&this.shape[r]&&(n[r]=this.shape[r])}),new Ze({...this._def,shape:()=>n})}omit(t){const n={};return _e.objectKeys(this.shape).forEach(r=>{t[r]||(n[r]=this.shape[r])}),new Ze({...this._def,shape:()=>n})}deepPartial(){return Ii(this)}partial(t){const n={};return _e.objectKeys(this.shape).forEach(r=>{const a=this.shape[r];t&&!t[r]?n[r]=a:n[r]=a.optional()}),new Ze({...this._def,shape:()=>n})}required(t){const n={};return _e.objectKeys(this.shape).forEach(r=>{if(t&&!t[r])n[r]=this.shape[r];else{let i=this.shape[r];for(;i instanceof ar;)i=i._def.innerType;n[r]=i}}),new Ze({...this._def,shape:()=>n})}keyof(){return tE(_e.objectKeys(this.shape))}}Ze.create=(e,t)=>new Ze({shape:()=>e,unknownKeys:"strip",catchall:Sr.create(),typeName:ue.ZodObject,...ve(t)});Ze.strictCreate=(e,t)=>new Ze({shape:()=>e,unknownKeys:"strict",catchall:Sr.create(),typeName:ue.ZodObject,...ve(t)});Ze.lazycreate=(e,t)=>new Ze({shape:e,unknownKeys:"strip",catchall:Sr.create(),typeName:ue.ZodObject,...ve(t)});class fl extends je{_parse(t){const{ctx:n}=this._processInputParams(t),r=this._def.options;function a(i){for(const l of i)if(l.result.status==="valid")return l.result;for(const l of i)if(l.result.status==="dirty")return n.common.issues.push(...l.ctx.common.issues),l.result;const s=i.map(l=>new en(l.ctx.common.issues));return J(n,{code:W.invalid_union,unionErrors:s}),me}if(n.common.async)return Promise.all(r.map(async i=>{const s={...n,common:{...n.common,issues:[]},parent:null};return{result:await i._parseAsync({data:n.data,path:n.path,parent:s}),ctx:s}})).then(a);{let i;const s=[];for(const d of r){const c={...n,common:{...n.common,issues:[]},parent:null},u=d._parseSync({data:n.data,path:n.path,parent:c});if(u.status==="valid")return u;u.status==="dirty"&&!i&&(i={result:u,ctx:c}),c.common.issues.length&&s.push(c.common.issues)}if(i)return n.common.issues.push(...i.ctx.common.issues),i.result;const l=s.map(d=>new en(d));return J(n,{code:W.invalid_union,unionErrors:l}),me}}get options(){return this._def.options}}fl.create=(e,t)=>new fl({options:e,typeName:ue.ZodUnion,...ve(t)});const gr=e=>e instanceof yl?gr(e.schema):e instanceof Nn?gr(e.innerType()):e instanceof wl?[e.value]:e instanceof Aa?e.options:e instanceof kl?_e.objectValues(e.enum):e instanceof xl?gr(e._def.innerType):e instanceof gl?[void 0]:e instanceof hl?[null]:e instanceof ar?[void 0,...gr(e.unwrap())]:e instanceof Ea?[null,...gr(e.unwrap())]:e instanceof dv||e instanceof Al?gr(e.unwrap()):e instanceof jl?gr(e._def.innerType):[];class Uu extends je{_parse(t){const{ctx:n}=this._processInputParams(t);if(n.parsedType!==ee.object)return J(n,{code:W.invalid_type,expected:ee.object,received:n.parsedType}),me;const r=this.discriminator,a=n.data[r],i=this.optionsMap.get(a);return i?n.common.async?i._parseAsync({data:n.data,path:n.path,parent:n}):i._parseSync({data:n.data,path:n.path,parent:n}):(J(n,{code:W.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[r]}),me)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(t,n,r){const a=new Map;for(const i of n){const s=gr(i.shape[t]);if(!s.length)throw new Error(`A discriminator value for key \`${t}\` could not be extracted from all schema options`);for(const l of s){if(a.has(l))throw new Error(`Discriminator property ${String(t)} has duplicate value ${String(l)}`);a.set(l,i)}}return new Uu({typeName:ue.ZodDiscriminatedUnion,discriminator:t,options:n,optionsMap:a,...ve(r)})}}function eh(e,t){const n=$r(e),r=$r(t);if(e===t)return{valid:!0,data:e};if(n===ee.object&&r===ee.object){const a=_e.objectKeys(t),i=_e.objectKeys(e).filter(l=>a.indexOf(l)!==-1),s={...e,...t};for(const l of i){const d=eh(e[l],t[l]);if(!d.valid)return{valid:!1};s[l]=d.data}return{valid:!0,data:s}}else if(n===ee.array&&r===ee.array){if(e.length!==t.length)return{valid:!1};const a=[];for(let i=0;i<e.length;i++){const s=e[i],l=t[i],d=eh(s,l);if(!d.valid)return{valid:!1};a.push(d.data)}return{valid:!0,data:a}}else return n===ee.date&&r===ee.date&&+e==+t?{valid:!0,data:e}:{valid:!1}}class vl extends je{_parse(t){const{status:n,ctx:r}=this._processInputParams(t),a=(i,s)=>{if(Qg(i)||Qg(s))return me;const l=eh(i.value,s.value);return l.valid?((Xg(i)||Xg(s))&&n.dirty(),{status:n.value,value:l.data}):(J(r,{code:W.invalid_intersection_types}),me)};return r.common.async?Promise.all([this._def.left._parseAsync({data:r.data,path:r.path,parent:r}),this._def.right._parseAsync({data:r.data,path:r.path,parent:r})]).then(([i,s])=>a(i,s)):a(this._def.left._parseSync({data:r.data,path:r.path,parent:r}),this._def.right._parseSync({data:r.data,path:r.path,parent:r}))}}vl.create=(e,t,n)=>new vl({left:e,right:t,typeName:ue.ZodIntersection,...ve(n)});class or extends je{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==ee.array)return J(r,{code:W.invalid_type,expected:ee.array,received:r.parsedType}),me;if(r.data.length<this._def.items.length)return J(r,{code:W.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),me;!this._def.rest&&r.data.length>this._def.items.length&&(J(r,{code:W.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),n.dirty());const i=[...r.data].map((s,l)=>{const d=this._def.items[l]||this._def.rest;return d?d._parse(new sr(r,s,r.path,l)):null}).filter(s=>!!s);return r.common.async?Promise.all(i).then(s=>Tt.mergeArray(n,s)):Tt.mergeArray(n,i)}get items(){return this._def.items}rest(t){return new or({...this._def,rest:t})}}or.create=(e,t)=>{if(!Array.isArray(e))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new or({items:e,typeName:ue.ZodTuple,rest:null,...ve(t)})};class bl extends je{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==ee.object)return J(r,{code:W.invalid_type,expected:ee.object,received:r.parsedType}),me;const a=[],i=this._def.keyType,s=this._def.valueType;for(const l in r.data)a.push({key:i._parse(new sr(r,l,r.path,l)),value:s._parse(new sr(r,r.data[l],r.path,l)),alwaysSet:l in r.data});return r.common.async?Tt.mergeObjectAsync(n,a):Tt.mergeObjectSync(n,a)}get element(){return this._def.valueType}static create(t,n,r){return n instanceof je?new bl({keyType:t,valueType:n,typeName:ue.ZodRecord,...ve(r)}):new bl({keyType:_n.create(),valueType:t,typeName:ue.ZodRecord,...ve(n)})}}class Zc extends je{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==ee.map)return J(r,{code:W.invalid_type,expected:ee.map,received:r.parsedType}),me;const a=this._def.keyType,i=this._def.valueType,s=[...r.data.entries()].map(([l,d],c)=>({key:a._parse(new sr(r,l,r.path,[c,"key"])),value:i._parse(new sr(r,d,r.path,[c,"value"]))}));if(r.common.async){const l=new Map;return Promise.resolve().then(async()=>{for(const d of s){const c=await d.key,u=await d.value;if(c.status==="aborted"||u.status==="aborted")return me;(c.status==="dirty"||u.status==="dirty")&&n.dirty(),l.set(c.value,u.value)}return{status:n.value,value:l}})}else{const l=new Map;for(const d of s){const c=d.key,u=d.value;if(c.status==="aborted"||u.status==="aborted")return me;(c.status==="dirty"||u.status==="dirty")&&n.dirty(),l.set(c.value,u.value)}return{status:n.value,value:l}}}}Zc.create=(e,t,n)=>new Zc({valueType:t,keyType:e,typeName:ue.ZodMap,...ve(n)});class ui extends je{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==ee.set)return J(r,{code:W.invalid_type,expected:ee.set,received:r.parsedType}),me;const a=this._def;a.minSize!==null&&r.data.size<a.minSize.value&&(J(r,{code:W.too_small,minimum:a.minSize.value,type:"set",inclusive:!0,exact:!1,message:a.minSize.message}),n.dirty()),a.maxSize!==null&&r.data.size>a.maxSize.value&&(J(r,{code:W.too_big,maximum:a.maxSize.value,type:"set",inclusive:!0,exact:!1,message:a.maxSize.message}),n.dirty());const i=this._def.valueType;function s(d){const c=new Set;for(const u of d){if(u.status==="aborted")return me;u.status==="dirty"&&n.dirty(),c.add(u.value)}return{status:n.value,value:c}}const l=[...r.data.values()].map((d,c)=>i._parse(new sr(r,d,r.path,c)));return r.common.async?Promise.all(l).then(d=>s(d)):s(l)}min(t,n){return new ui({...this._def,minSize:{value:t,message:se.toString(n)}})}max(t,n){return new ui({...this._def,maxSize:{value:t,message:se.toString(n)}})}size(t,n){return this.min(t,n).max(t,n)}nonempty(t){return this.min(1,t)}}ui.create=(e,t)=>new ui({valueType:e,minSize:null,maxSize:null,typeName:ue.ZodSet,...ve(t)});class ls extends je{constructor(){super(...arguments),this.validate=this.implement}_parse(t){const{ctx:n}=this._processInputParams(t);if(n.parsedType!==ee.function)return J(n,{code:W.invalid_type,expected:ee.function,received:n.parsedType}),me;function r(l,d){return Gc({data:l,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,$c(),Is].filter(c=>!!c),issueData:{code:W.invalid_arguments,argumentsError:d}})}function a(l,d){return Gc({data:l,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,$c(),Is].filter(c=>!!c),issueData:{code:W.invalid_return_type,returnTypeError:d}})}const i={errorMap:n.common.contextualErrorMap},s=n.data;if(this._def.returns instanceof Ns){const l=this;return Bt(async function(...d){const c=new en([]),u=await l._def.args.parseAsync(d,i).catch(h=>{throw c.addIssue(r(d,h)),c}),m=await Reflect.apply(s,this,u);return await l._def.returns._def.type.parseAsync(m,i).catch(h=>{throw c.addIssue(a(m,h)),c})})}else{const l=this;return Bt(function(...d){const c=l._def.args.safeParse(d,i);if(!c.success)throw new en([r(d,c.error)]);const u=Reflect.apply(s,this,c.data),m=l._def.returns.safeParse(u,i);if(!m.success)throw new en([a(u,m.error)]);return m.data})}}parameters(){return this._def.args}returnType(){return this._def.returns}args(...t){return new ls({...this._def,args:or.create(t).rest(ei.create())})}returns(t){return new ls({...this._def,returns:t})}implement(t){return this.parse(t)}strictImplement(t){return this.parse(t)}static create(t,n,r){return new ls({args:t||or.create([]).rest(ei.create()),returns:n||ei.create(),typeName:ue.ZodFunction,...ve(r)})}}class yl extends je{get schema(){return this._def.getter()}_parse(t){const{ctx:n}=this._processInputParams(t);return this._def.getter()._parse({data:n.data,path:n.path,parent:n})}}yl.create=(e,t)=>new yl({getter:e,typeName:ue.ZodLazy,...ve(t)});class wl extends je{_parse(t){if(t.data!==this._def.value){const n=this._getOrReturnCtx(t);return J(n,{received:n.data,code:W.invalid_literal,expected:this._def.value}),me}return{status:"valid",value:t.data}}get value(){return this._def.value}}wl.create=(e,t)=>new wl({value:e,typeName:ue.ZodLiteral,...ve(t)});function tE(e,t){return new Aa({values:e,typeName:ue.ZodEnum,...ve(t)})}class Aa extends je{constructor(){super(...arguments),wo.set(this,void 0)}_parse(t){if(typeof t.data!="string"){const n=this._getOrReturnCtx(t),r=this._def.values;return J(n,{expected:_e.joinValues(r),received:n.parsedType,code:W.invalid_type}),me}if(Hc(this,wo)||JA(this,wo,new Set(this._def.values)),!Hc(this,wo).has(t.data)){const n=this._getOrReturnCtx(t),r=this._def.values;return J(n,{received:n.data,code:W.invalid_enum_value,options:r}),me}return Bt(t.data)}get options(){return this._def.values}get enum(){const t={};for(const n of this._def.values)t[n]=n;return t}get Values(){const t={};for(const n of this._def.values)t[n]=n;return t}get Enum(){const t={};for(const n of this._def.values)t[n]=n;return t}extract(t,n=this._def){return Aa.create(t,{...this._def,...n})}exclude(t,n=this._def){return Aa.create(this.options.filter(r=>!t.includes(r)),{...this._def,...n})}}wo=new WeakMap;Aa.create=tE;class kl extends je{constructor(){super(...arguments),ko.set(this,void 0)}_parse(t){const n=_e.getValidEnumValues(this._def.values),r=this._getOrReturnCtx(t);if(r.parsedType!==ee.string&&r.parsedType!==ee.number){const a=_e.objectValues(n);return J(r,{expected:_e.joinValues(a),received:r.parsedType,code:W.invalid_type}),me}if(Hc(this,ko)||JA(this,ko,new Set(_e.getValidEnumValues(this._def.values))),!Hc(this,ko).has(t.data)){const a=_e.objectValues(n);return J(r,{received:r.data,code:W.invalid_enum_value,options:a}),me}return Bt(t.data)}get enum(){return this._def.values}}ko=new WeakMap;kl.create=(e,t)=>new kl({values:e,typeName:ue.ZodNativeEnum,...ve(t)});class Ns extends je{unwrap(){return this._def.type}_parse(t){const{ctx:n}=this._processInputParams(t);if(n.parsedType!==ee.promise&&n.common.async===!1)return J(n,{code:W.invalid_type,expected:ee.promise,received:n.parsedType}),me;const r=n.parsedType===ee.promise?n.data:Promise.resolve(n.data);return Bt(r.then(a=>this._def.type.parseAsync(a,{path:n.path,errorMap:n.common.contextualErrorMap})))}}Ns.create=(e,t)=>new Ns({type:e,typeName:ue.ZodPromise,...ve(t)});class Nn extends je{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===ue.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(t){const{status:n,ctx:r}=this._processInputParams(t),a=this._def.effect||null,i={addIssue:s=>{J(r,s),s.fatal?n.abort():n.dirty()},get path(){return r.path}};if(i.addIssue=i.addIssue.bind(i),a.type==="preprocess"){const s=a.transform(r.data,i);if(r.common.async)return Promise.resolve(s).then(async l=>{if(n.value==="aborted")return me;const d=await this._def.schema._parseAsync({data:l,path:r.path,parent:r});return d.status==="aborted"?me:d.status==="dirty"||n.value==="dirty"?Ki(d.value):d});{if(n.value==="aborted")return me;const l=this._def.schema._parseSync({data:s,path:r.path,parent:r});return l.status==="aborted"?me:l.status==="dirty"||n.value==="dirty"?Ki(l.value):l}}if(a.type==="refinement"){const s=l=>{const d=a.refinement(l,i);if(r.common.async)return Promise.resolve(d);if(d instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return l};if(r.common.async===!1){const l=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});return l.status==="aborted"?me:(l.status==="dirty"&&n.dirty(),s(l.value),{status:n.value,value:l.value})}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(l=>l.status==="aborted"?me:(l.status==="dirty"&&n.dirty(),s(l.value).then(()=>({status:n.value,value:l.value}))))}if(a.type==="transform")if(r.common.async===!1){const s=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});if(!ul(s))return s;const l=a.transform(s.value,i);if(l instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:n.value,value:l}}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(s=>ul(s)?Promise.resolve(a.transform(s.value,i)).then(l=>({status:n.value,value:l})):s);_e.assertNever(a)}}Nn.create=(e,t,n)=>new Nn({schema:e,typeName:ue.ZodEffects,effect:t,...ve(n)});Nn.createWithPreprocess=(e,t,n)=>new Nn({schema:t,effect:{type:"preprocess",transform:e},typeName:ue.ZodEffects,...ve(n)});class ar extends je{_parse(t){return this._getType(t)===ee.undefined?Bt(void 0):this._def.innerType._parse(t)}unwrap(){return this._def.innerType}}ar.create=(e,t)=>new ar({innerType:e,typeName:ue.ZodOptional,...ve(t)});class Ea extends je{_parse(t){return this._getType(t)===ee.null?Bt(null):this._def.innerType._parse(t)}unwrap(){return this._def.innerType}}Ea.create=(e,t)=>new Ea({innerType:e,typeName:ue.ZodNullable,...ve(t)});class xl extends je{_parse(t){const{ctx:n}=this._processInputParams(t);let r=n.data;return n.parsedType===ee.undefined&&(r=this._def.defaultValue()),this._def.innerType._parse({data:r,path:n.path,parent:n})}removeDefault(){return this._def.innerType}}xl.create=(e,t)=>new xl({innerType:e,typeName:ue.ZodDefault,defaultValue:typeof t.default=="function"?t.default:()=>t.default,...ve(t)});class jl extends je{_parse(t){const{ctx:n}=this._processInputParams(t),r={...n,common:{...n.common,issues:[]}},a=this._def.innerType._parse({data:r.data,path:r.path,parent:{...r}});return ml(a)?a.then(i=>({status:"valid",value:i.status==="valid"?i.value:this._def.catchValue({get error(){return new en(r.common.issues)},input:r.data})})):{status:"valid",value:a.status==="valid"?a.value:this._def.catchValue({get error(){return new en(r.common.issues)},input:r.data})}}removeCatch(){return this._def.innerType}}jl.create=(e,t)=>new jl({innerType:e,typeName:ue.ZodCatch,catchValue:typeof t.catch=="function"?t.catch:()=>t.catch,...ve(t)});class Jc extends je{_parse(t){if(this._getType(t)!==ee.nan){const r=this._getOrReturnCtx(t);return J(r,{code:W.invalid_type,expected:ee.nan,received:r.parsedType}),me}return{status:"valid",value:t.data}}}Jc.create=e=>new Jc({typeName:ue.ZodNaN,...ve(e)});const HV=Symbol("zod_brand");class dv extends je{_parse(t){const{ctx:n}=this._processInputParams(t),r=n.data;return this._def.type._parse({data:r,path:n.path,parent:n})}unwrap(){return this._def.type}}class Vl extends je{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.common.async)return(async()=>{const i=await this._def.in._parseAsync({data:r.data,path:r.path,parent:r});return i.status==="aborted"?me:i.status==="dirty"?(n.dirty(),Ki(i.value)):this._def.out._parseAsync({data:i.value,path:r.path,parent:r})})();{const a=this._def.in._parseSync({data:r.data,path:r.path,parent:r});return a.status==="aborted"?me:a.status==="dirty"?(n.dirty(),{status:"dirty",value:a.value}):this._def.out._parseSync({data:a.value,path:r.path,parent:r})}}static create(t,n){return new Vl({in:t,out:n,typeName:ue.ZodPipeline})}}class Al extends je{_parse(t){const n=this._def.innerType._parse(t),r=a=>(ul(a)&&(a.value=Object.freeze(a.value)),a);return ml(n)?n.then(a=>r(a)):r(n)}unwrap(){return this._def.innerType}}Al.create=(e,t)=>new Al({innerType:e,typeName:ue.ZodReadonly,...ve(t)});function nE(e,t={},n){return e?qs.create().superRefine((r,a)=>{var i,s;if(!e(r)){const l=typeof t=="function"?t(r):typeof t=="string"?{message:t}:t,d=(s=(i=l.fatal)!==null&&i!==void 0?i:n)!==null&&s!==void 0?s:!0,c=typeof l=="string"?{message:l}:l;a.addIssue({code:"custom",...c,fatal:d})}}):qs.create()}const KV={object:Ze.lazycreate};var ue;(function(e){e.ZodString="ZodString",e.ZodNumber="ZodNumber",e.ZodNaN="ZodNaN",e.ZodBigInt="ZodBigInt",e.ZodBoolean="ZodBoolean",e.ZodDate="ZodDate",e.ZodSymbol="ZodSymbol",e.ZodUndefined="ZodUndefined",e.ZodNull="ZodNull",e.ZodAny="ZodAny",e.ZodUnknown="ZodUnknown",e.ZodNever="ZodNever",e.ZodVoid="ZodVoid",e.ZodArray="ZodArray",e.ZodObject="ZodObject",e.ZodUnion="ZodUnion",e.ZodDiscriminatedUnion="ZodDiscriminatedUnion",e.ZodIntersection="ZodIntersection",e.ZodTuple="ZodTuple",e.ZodRecord="ZodRecord",e.ZodMap="ZodMap",e.ZodSet="ZodSet",e.ZodFunction="ZodFunction",e.ZodLazy="ZodLazy",e.ZodLiteral="ZodLiteral",e.ZodEnum="ZodEnum",e.ZodEffects="ZodEffects",e.ZodNativeEnum="ZodNativeEnum",e.ZodOptional="ZodOptional",e.ZodNullable="ZodNullable",e.ZodDefault="ZodDefault",e.ZodCatch="ZodCatch",e.ZodPromise="ZodPromise",e.ZodBranded="ZodBranded",e.ZodPipeline="ZodPipeline",e.ZodReadonly="ZodReadonly"})(ue||(ue={}));const YV=(e,t={message:`Input not instance of ${e.name}`})=>nE(n=>n instanceof e,t),rE=_n.create,aE=xa.create,ZV=Jc.create,JV=ja.create,iE=pl.create,QV=ci.create,XV=Kc.create,e8=gl.create,t8=hl.create,n8=qs.create,r8=ei.create,a8=Sr.create,i8=Yc.create,s8=Rn.create,o8=Ze.create,l8=Ze.strictCreate,d8=fl.create,c8=Uu.create,u8=vl.create,m8=or.create,p8=bl.create,g8=Zc.
7077create,h8=ui.create,f8=ls.create,v8=yl.create,b8=wl.create,y8=Aa.create,w8=kl.create,k8=Ns.create,u0=Nn.create,x8=ar.create,j8=Ea.create,A8=Nn.createWithPreprocess,E8=Vl.create,P8=()=>rE().optional(),C8=()=>aE().optional(),S8=()=>iE().optional(),_8={string:e=>_n.create({...e,coerce:!0}),number:e=>xa.create({...e,coerce:!0}),boolean:e=>pl.create({...e,coerce:!0}),bigint:e=>ja.create({...e,coerce:!0}),date:e=>ci.create({...e,coerce:!0})},T8=me;var ep=Object.freeze({__proto__:null,defaultErrorMap:Is,setErrorMap:TV,getErrorMap:$c,makeIssue:Gc,EMPTY_PATH:DV,addIssueToContext:J,ParseStatus:Tt,INVALID:me,DIRTY:Ki,OK:Bt,isAborted:Qg,isDirty:Xg,isValid:ul,isAsync:ml,get util(){return _e},get objectUtil(){return Jg},ZodParsedType:ee,getParsedType:$r,ZodType:je,datetimeRegex:eE,ZodString:_n,ZodNumber:xa,ZodBigInt:ja,ZodBoolean:pl,ZodDate:ci,ZodSymbol:Kc,ZodUndefined:gl,ZodNull:hl,ZodAny:qs,ZodUnknown:ei,ZodNever:Sr,ZodVoid:Yc,ZodArray:Rn,ZodObject:Ze,ZodUnion:fl,ZodDiscriminatedUnion:Uu,ZodIntersection:vl,ZodTuple:or,ZodRecord:bl,ZodMap:Zc,ZodSet:ui,ZodFunction:ls,ZodLazy:yl,ZodLiteral:wl,ZodEnum:Aa,ZodNativeEnum:kl,ZodPromise:Ns,ZodEffects:Nn,ZodTransformer:Nn,ZodOptional:ar,ZodNullable:Ea,ZodDefault:xl,ZodCatch:jl,ZodNaN:Jc,BRAND:HV,ZodBranded:dv,ZodPipeline:Vl,ZodReadonly:Al,custom:nE,Schema:je,ZodSchema:je,late:KV,get ZodFirstPartyTypeKind(){return ue},coerce:_8,any:n8,array:s8,bigint:JV,boolean:iE,date:QV,discriminatedUnion:c8,effect:u0,enum:y8,function:f8,instanceof:YV,intersection:u8,lazy:v8,literal:b8,map:g8,nan:ZV,nativeEnum:w8,never:a8,null:t8,nullable:j8,number:aE,object:o8,oboolean:S8,onumber:C8,optional:x8,ostring:P8,pipeline:E8,preprocess:A8,promise:k8,record:p8,set:h8,strictObject:l8,string:rE,symbol:XV,transformer:u0,tuple:m8,undefined:e8,union:d8,unknown:r8,void:i8,NEVER:T8,ZodIssueCode:W,quotelessJson:_V,ZodError:en});const D8=ep.object({email:ep.string().trim().email("Email invalide").max(255,"L'email doit faire moins de 255 caractères"),password:ep.string().min(1,"Le mot de passe est requis").max(128,"Le mot de passe doit faire moins de 128 caractères")}),m0={fr:{title:"Bon retour !",subtitle:"Connectez-vous pour accéder à vos analyses immobilières",google:"Continuer avec Google",apple:"Continuer avec Apple",orContinueWith:"ou continuer avec email",email:"Email",emailPlaceholder:"[email protected]",password:"Mot de passe",forgotPassword:"Mot de passe oublié ?",submit:"Se connecter",loading:"Connexion...",noAccount:"Pas encore de compte ?",createAccount:"Créer un compte",validationError:"Erreur de validation",error:"Erreur de connexion",success:"Connexion réussie",welcome:"Bienvenue sur Arcanes !",genericError:"Une erreur est survenue",rightPanel:{title:"Prenez des décisions",titleHighlight:"éclairées",description:"Analysez vos opportunités immobilières avec des données fiables et des simulations financières précises.",stat1Value:"500+",stat1Label:"Analyses réalisées",stat2Value:"98%",stat2Label:"Clients satisfaits",stat3Value:"24h",stat3Label:"Support réactif",stat4Value:"15sec",stat4Label:"Temps moyen d'analyse"}},nl:{title:"Welkom terug!",subtitle:"Log in om toegang te krijgen tot uw vastgoedanalyses",google:"Doorgaan met Google",orContinueWith:"of doorgaan met e-mail",email:"E-mail",emailPlaceholder:"[email protected]",password:"Wachtwoord",forgotPassword:"Wachtwoord vergeten?",submit:"Inloggen",loading:"Inloggen...",noAccount:"Nog geen account?",createAccount:"Account aanmaken",validationError:"Validatiefout",error:"Inlogfout",success:"Succesvol ingelogd",welcome:"Welkom bij Arcanes!",genericError:"Er is een fout opgetreden",rightPanel:{title:"Neem weloverwogen",titleHighlight:"beslissingen",description:"Analyseer uw vastgoedkansen met betrouwbare gegevens en nauwkeurige financiële simulaties.",stat1Value:"500+",stat1Label:"Uitgevoerde analyses",stat2Value:"98%",stat2Label:"Tevreden klanten",stat3Value:"24u",stat3Label:"Reactieve ondersteuning",stat4Value:"15min",stat4Label:"Gemiddelde analysetijd"}}};function R8(){const[e,t]=g.useState(""),[n,r]=g.useState(""),[a,i]=g.useState(!1),[s,l]=g.useState(null),[d,c]=g.useState(!1),u=xt(),{toast:m}=lx(),{language:p}=Ge(),h=m0[p]||m0.fr,b=async k=>{k.preventDefault(),Wc.loginStarted();const w=D8.safeParse({email:e,password:n});if(!w.success){const v=w.error.errors;m({title:h.validationError,description:v[0].message,variant:"destructive"});return}i(!0);try{const{data:v,error:y}=await de.auth.signInWithPassword({email:e,password:n});if(y){m({title:h.error,description:y.message,variant:"destructive"});return}if(v.user){Wc.loginCompleted("email");const{data:x}=await de.from("profiles").select("account_type").eq("id",v.user.id).single();if((x==null?void 0:x.account_type)==="agent_pro"||(x==null?void 0:x.account_type)==="agent_pending"){m({title:h.success,description:h.welcome}),u("/pro/dashboard");return}m({title:h.success,description:h.welcome}),u("/")}}catch{m({title:h.error,description:h.genericError,variant:"destructive"})}finally{i(!1)}},f=async()=>
7077{l("google");try{const{error:k}=await de.auth.signInWithOAuth({provider:"google",options:{redirectTo:`${window.location.origin}/`}});if(k)throw k}catch(k){console.error("Erreur Google OAuth:",k),m({title:h.error,description:k.message||h.genericError,variant:"destructive"})}finally{l(null)}};return o.jsxs("div",{className:"w-full min-h-screen flex flex-col lg:flex-row bg-white",children:[o.jsx("div",{className:"w-full lg:w-[45%] p-6 sm:p-8 lg:p-12 xl:p-16 flex flex-col justify-center bg-white",children:o.jsxs("div",{className:"max-w-md mx-auto w-full",children:[o.jsxs("div",{className:"mb-12 flex items-center justify-between",children:[o.jsx(lv,{size:"medium"}),o.jsx(Zg,{})]}),o.jsxs("div",{className:"mb-8",children:[o.jsx("h1",{className:"text-3xl sm:text-4xl font-bold text-[#0d3d47] mb-3 font-['Outfit'] tracking-tight",children:h.title}),o.jsx("p",{className:"text-[#475569] text-base font-['Outfit']",children:h.subtitle})]}),o.jsx("div",{className:"space-y-3 mb-6",children:o.jsxs(ka,{type:"button",variant:"outline",onClick:f,disabled:s!==null||a,className:"w-full h-12 border-[#E2E8F0] hover:border-[#1E6B7E] hover:bg-[#E6F4F7] transition-all font-['Outfit']",children:[s==="google"?o.jsx(cg,{className:"mr-2 h-4 w-4 animate-spin"}):o.jsxs("svg",{className:"mr-2 h-5 w-5",viewBox:"0 0 24 24",children:[o.jsx("path",{fill:"#4285F4",d:"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"}),o.jsx("path",{fill:"#34A853",d:"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"}),o.jsx("path",{fill:"#FBBC05",d:"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"}),o.jsx("path",{fill:"#EA4335",d:"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"})]}),h.google]})}),o.jsxs("div",{className:"relative mb-6",children:[o.jsx("div",{className:"absolute inset-0 flex items-center",children:o.jsx("span",{className:"w-full border-t border-[#E2E8F0]"})}),o.jsx("div",{className:"relative flex justify-center text-xs uppercase",children:o.jsx("span",{className:"bg-white px-2 text-muted-foreground font-['Outfit']",children:h.orContinueWith})})]}),o.jsxs("div",{className:"space-y-5",children:[o.jsxs("div",{className:"space-y-1.5",children:[o.jsx("label",{className:"text-sm font-medium text-[#0d3d47] font-['Outfit']",children:h.email}),o.jsxs("div",{className:"relative",children:[o.jsx(Yx,{className:"absolute left-3.5 top-1/2 -translate-y-1/2 h-4 w-4 text-[#94a3b8]"}),o.jsx(Ds,{type:"email",placeholder:h.emailPlaceholder,value:e,onChange:k=>t(k.target.value),className:"pl-11 h-12 bg-[#F8FAFB] border-[#E2E8F0] rounded-xl focus:ring-2 focus:ring-[#1E6B7E]/20 focus:border-[#1E6B7E] transition-all font-['Outfit']",required:!0})]})]}),o.jsxs("div",{className:"space-y-1.5",children:[o.jsxs("div",{className:"flex justify-between items-center",children:[o.jsx("label",{className:"text-sm font-medium text-[#0d3d47] font-['Outfit']",children:h.password}),o.jsx("button",{onClick:()=>u("/reset-password"),className:"text-xs text-[#1E6B7E] hover:text-[#2d9cad] transition-colors font-['Outfit'] font-medium",children:h.forgotPassword})]}),o.jsxs("div",{className:"relative",children:[o.jsx(Hx,{className:"absolute left-3.5 top-1/2 -translate-y-1/2 h-4 w-4 text-[#94a3b8]"}),o.jsx(Ds,{type:d?"text":"password",placeholder:"â¢â¢â¢â¢â¢â¢â¢â¢",value:n,onChange:k=>r(k.target.value),className:"pl-11 pr-11 h-12 bg-[#F8FAFB] border-[#E2E8F0] rounded-xl focus:ring-2 focus:ring-[#1E6B7E]/20 focus:border-[#1E6B7E] transition-all font-['Outfit']",required:!0}),o.jsx("button",{type:"button",onClick:()=>c(!d),className:"absolute right-3.5 top-1/2 -translate-y-1/2 text-[#94a3b8] hover:text-[#475569] transition-colors",children:d?o.jsx(I_,{className:"h-4 w-4"}):o.jsx(Vx,{className:"h-4 w-4"})})]})]}),o.jsx(ka,{onClick:b,disabled:a||s!==null,className:"w-full h-12 text-base font-semibold bg-[#1E6B7E] hover:bg-[#2d9cad] text-white rounded-xl shadow-lg shadow-[#1E6B7E]/25 hover:shadow-[#1E6B7E]/40 transition-all duration-200 hover:scale-[1.02] active:scale-[0.98] font-['Outfit']",children:a?o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("div",{className:"w-4 h-4 border-2 border-white border-t-transparent roun
7077ded-full animate-spin"}),h.loading]}):o.jsxs("div",{className:"flex items-center gap-2",children:[h.submit,o.jsx(et,{className:"h-4 w-4"})]})})]}),o.jsx("div",{className:"mt-8 pt-8 border-t border-[#E2E8F0] text-center",children:o.jsxs("p",{className:"text-sm text-[#475569] font-['Outfit']",children:[h.noAccount," ",o.jsx("button",{onClick:()=>u("/signup"),className:"font-semibold text-[#1E6B7E] hover:text-[#2d9cad] transition-colors",children:h.createAccount})]})})]})}),o.jsxs("div",{className:"hidden lg:flex lg:w-[55%] bg-[#0d3d47] on-dark-bg p-12 xl:p-16 flex-col justify-center relative overflow-hidden",children:[o.jsxs("div",{className:"absolute inset-0 opacity-10",children:[o.jsx("div",{className:"absolute top-20 left-20 w-32 h-32 border border-white/30 rounded-2xl rotate-12"}),o.jsx("div",{className:"absolute top-40 right-32 w-24 h-24 border border-white/20 rounded-xl -rotate-6"}),o.jsx("div",{className:"absolute bottom-32 left-40 w-40 h-40 border border-white/25 rounded-3xl rotate-45"}),o.jsx("div",{className:"absolute bottom-20 right-20 w-28 h-28 border border-white/30 rounded-2xl -rotate-12"})]}),o.jsx("div",{className:"absolute top-1/4 right-16 animate-pulse",children:o.jsx("div",{className:"w-16 h-16 bg-[#1E6B7E]/30 rounded-xl backdrop-blur-sm flex items-center justify-center",children:o.jsx(Il,{className:"h-8 w-8 text-[#2d9cad]"})})}),o.jsx("div",{className:"absolute bottom-1/3 right-32 animate-pulse delay-300",children:o.jsx("div",{className:"w-14 h-14 bg-[#D4AF37]/20 rounded-xl backdrop-blur-sm flex items-center justify-center",children:o.jsx(Ps,{className:"h-7 w-7 text-[#D4AF37]"})})}),o.jsx("div",{className:"absolute top-1/2 right-48 animate-pulse delay-700",children:o.jsx("div",{className:"w-12 h-12 bg-white/10 rounded-xl backdrop-blur-sm flex items-center justify-center",children:o.jsx(hi,{className:"h-6 w-6 text-white/70"})})}),o.jsxs("div",{className:"relative z-10 max-w-lg",children:[o.jsxs("h2",{className:"text-4xl xl:text-5xl font-bold text-white mb-6 leading-tight font-['Outfit'] tracking-tight",children:[h.rightPanel.title," ",o.jsx("span",{className:"text-[#2d9cad]",children:h.rightPanel.titleHighlight})]}),o.jsx("p",{className:"text-white/70 text-lg mb-12 leading-relaxed font-['Outfit']",children:h.rightPanel.description}),o.jsxs("div",{className:"grid grid-cols-2 gap-6",children:[o.jsxs("div",{className:"bg-white/5 backdrop-blur-sm rounded-2xl p-6 border border-white/10 hover:border-[#2d9cad]/50 transition-all duration-300",children:[o.jsx("div",{className:"text-3xl font-bold text-[#D4AF37] mb-2 font-['Outfit']",children:h.rightPanel.stat1Value}),o.jsx("div",{className:"text-sm text-white/60 font-['Outfit']",children:h.rightPanel.stat1Label})]}),o.jsxs("div",{className:"bg-white/5 backdrop-blur-sm rounded-2xl p-6 border border-white/10 hover:border-[#2d9cad]/50 transition-all duration-300",children:[o.jsx("div",{className:"text-3xl font-bold text-[#2d9cad] mb-2 font-['Outfit']",children:h.rightPanel.stat2Value}),o.jsx("div",{className:"text-sm text-white/60 font-['Outfit']",children:h.rightPanel.stat2Label})]}),o.jsxs("div",{className:"bg-white/5 backdrop-blur-sm rounded-2xl p-6 border border-white/10 hover:border-[#2d9cad]/50 transition-all duration-300",children:[o.jsx("div",{className:"text-3xl font-bold text-white mb-2 font-['Outfit']",children:h.rightPanel.stat3Value}),o.jsx("div",{className:"text-sm text-white/60 font-['Outfit']",children:h.rightPanel.stat3Label})]}),o.jsxs("div",{className:"bg-white/5 backdrop-blur-sm rounded-2xl p-6 border border-white/10 hover:border-[#2d9cad]/50 transition-all duration-300",children:[o.jsx("div",{className:"text-3xl font-bold text-[#D4AF37] mb-2 font-['Outfit']",children:h.rightPanel.stat4Value}),o.jsx("div",{className:"text-sm text-white/60 font-['Outfit']",children:h.rightPanel.stat4Label})]})]})]})]})]})}function z8(){const{t:e}=Ge();return o.jsxs("div",{className:"min-h-screen bg-background",children:[o.jsx(UA,{title:e("seo.login.title"),description:e("seo.login.description"),noIndex:!0}),o.jsx(R8,{})]})}const I8=g.lazy(()=>F(()=>import("./SignUp-D1kPFPmx.js"),__vite__mapDeps([0,1,2]))),q8=g.lazy(()=>F(()=>import("./ResetPassword-BaQ3uBln.js"),__vite__mapDeps([3,4,1,5,6]))),N8=g.lazy(()=>F(()=>import("./UpdatePassword-qLngqR16.js"),__vite__mapDeps([7,4,8]))
7077),L8=g.lazy(()=>F(()=>import("./Dashboard-CSSCHJkB.js"),__vite__mapDeps([9,10,11,12,4,13,14,15,16,17,8,2,18,19,20,21,22,23,24]))),B8=g.lazy(()=>F(()=>import("./Profile-BZ-rzl92.js"),__vite__mapDeps([25,4,13,26,17,27,1,28]))),p0=g.lazy(()=>F(()=>import("./Contact-B1jDbcmY.js"),__vite__mapDeps([29,21,4,2,5]))),g0=g.lazy(()=>F(()=>import("./FreeAnalyse-CykK35nj.js"),__vite__mapDeps([30,14,15,16,17,8,2,4,31,32,13,33,12,19,6,34,35,36,37,38,39,23,5,40,41,42,43,44,45,46,47,48,49,50,51]))),M8=g.lazy(()=>F(()=>import("./Settings-Ce2Tzg7Y.js"),__vite__mapDeps([52,1,28,20,40]))),F8=g.lazy(()=>F(()=>import("./Referral-FwQVfWFY.js"),__vite__mapDeps([53,22,12,23,24]))),O8=g.lazy(()=>F(()=>import("./Simulateur-DyyD9Smj.js"),__vite__mapDeps([54,34,35,36,12,37,38,39,23,5,40,55,50,51,17]))),h0=g.lazy(()=>F(()=>import("./SimulateurFraisActe-CV9MswI9.js"),__vite__mapDeps([56,4,57,33,58,11,12,24,59,60,34,35,36,37,38,39,23,5,40,61,62,1,45,63]))),V8=g.lazy(()=>F(()=>import("./SimulateurPret-DgFaGa0M.js"),__vite__mapDeps([64,4,57,33,58,11,12,24,59,34,35,36,37,38,39,23,5,40,60,61,62,1,45,65,48,66,46,47]))),W8=g.lazy(()=>F(()=>import("./SimulateurCapaciteEmprunt-DK4YXr7l.js"),__vite__mapDeps([67,4,57,33,58,11,12,24,59,34,35,36,37,38,39,23,5,40,60,61,62,1,45,65,48,66]))),U8=g.lazy(()=>F(()=>import("./SimulateurPEB-CWTXnB03.js"),__vite__mapDeps([68,4,57,33,58,11,12,24,59,60,34,35,36,37,38,39,23,5,40,61,62,1,43]))),$8=g.lazy(()=>F(()=>import("./SimulateurRendementLocatif-Ffy-rc8x.js"),__vite__mapDeps([69,4,57,33,58,11,12,24,59,60,34,35,36,37,38,39,23,5,40,61,62,1]))),G8=g.lazy(()=>F(()=>import("./SimulateurTRI-w5ep9AFN.js"),__vite__mapDeps([70,4,57,33,58,11,12,24,59,34,35,36,37,38,39,23,5,40,60,41,1,19,2,45,47,71,48,66,43]))),H8=g.lazy(()=>F(()=>import("./PrixCertificatPEB-JyZ00mpV.js"),[])),K8=g.lazy(()=>F(()=>import("./SimulateurPrecompteImmobilier-4tQmaQ87.js"),__vite__mapDeps([72,4,57,33,58,11,12,24,59,34,35,36,37,38,39,23,5,40,61,62,60,1,17]))),Y8=g.lazy(()=>F(()=>import("./MaVraieValeur-BRNpqVDC.js"),__vite__mapDeps([73,8,2,74,75,76,77,78]))),Z8=g.lazy(()=>F(()=>import("./MethodologiePage-8ckdSLNJ.js"),[])),J8=g.lazy(()=>F(()=>import("./Tarifs-qiZCiaJm.js"),__vite__mapDeps([79,4,8,16]))),Q8=g.lazy(()=>F(()=>import("./Blog-EDZFEMf_.js"),__vite__mapDeps([80,4,13,8]))),X8=g.lazy(()=>F(()=>import("./BlogArticle-C84o4q2m.js"),__vite__mapDeps([81,4,59,82,18,1,39]))),eW=g.lazy(()=>F(()=>import("./FAQ-CooSSOy3.js"),__vite__mapDeps([83,78,44,16,17,84,85,86,87]))),tW=g.lazy(()=>F(()=>import("./Terms-B_bu1LYs.js"),__vite__mapDeps([88,4,89,85,19,42,27,37]))),f0=g.lazy(()=>F(()=>import("./Privacy-ByzPLkOc.js"),__vite__mapDeps([90,4,6,91,27]))),v0=g.lazy(()=>F(()=>import("./Legal-BTWegJc2.js"),__vite__mapDeps([92,4,16]))),nW=g.lazy(()=>F(()=>import("./SecurityCredits-CI0PSqm8.js"),[])),rW=g.lazy(()=>F(()=>import("./SecurityPolicy-CMe7rRSP.js"),[])),b0=g.lazy(()=>F(()=>import("./DataDeletion-BEZxnPvt.js"),[])),aW=g.lazy(()=>F(()=>import("./MapPage-BvxerAaB.js"),__vite__mapDeps([93,34,35,36,12,37,38,39,23,5,40,75,94,85,43,86,6,55,95]))),y0=g.lazy(()=>F(()=>import("./CommunePage-BTtG8WMk.js"),__vite__mapDeps([96,58,34,35,36,12,37,38,39,23,5,40,97,19]))),w0=g.lazy(()=>F(()=>import("./ProvincePage-CG367Le8.js"),__vite__mapDeps([98,34,35,36,12,37,38,39,23,5,40,97]))),k0=g.lazy(()=>F(()=>import("./CommunesIndex-bfAPhqRE.js"),__vite__mapDeps([99,50,58,100]))),x0=g.lazy(()=>F(()=>import("./Observatoire-DnhAVV1O.js"),__vite__mapDeps([101,34,35,36,12,37,38,39,23,5,40,102]))),j0=g.lazy(()=>F(()=>import("./ObservatoireTendancesRegionales-DrLOp0Xx.js"),__vite__mapDeps([103,34,35,36,12,37,38,39,23,5,40,102]))),A0=g.lazy(()=>F(()=>import("./ObservatoireAtlasN1-Bq0EQzKg.js"),__vite__mapDeps([104,34,35,36,12,37,38,39,23,5,40,102]))),E0=g.lazy(()=>F(()=>import("./ObservatoireAtlasIndex-D9Orn08l.js"),__vite__mapDeps([105,34,35,36,12,37,38,39,23,5,40,102]))),iW=g.lazy(()=>F(()=>import("./EspacePresse-RfY8ZPR-.js"),__vite__mapDeps([106,34,35,36,12,37,38,39,23,5,40,102])));g.lazy(()=>F(()=>import("./PresseAccueil-dLT4RBvN.js"),__vite__mapDeps([107,34,35,36,12,37,38,39,23,5,40,108])));const tp=g.lazy(()=>F(()=>import("./PresseTerritoire-RAyvKd8D.js"),__vite__mapDeps([109,34,35,36,12,37,38,39,23,5,40,108,102]))),sW=g.lazy(()=>F(()=>import("./PresseIndicateur-Zu8zKLWD.js"),__vite__mapDeps([110,34,35,36,12,37,38,39,23,5,40,108,102]))),oW=g.lazy(()=>F(()=>import("./PresseCatalogue-BaTzfL61.js"),__vite__mapDeps([111,34,35,36,12,37,38,39,23,5,40,108,102]))),P0=g.lazy(()=>F(()=>import("./ExplorationPage-cjg0g6fp.js"),__vite__mapDeps([112,94,75,87,37,100,113,114,95]))),lW=g.lazy(()=>F(()=>import("./AdminFeatureUpdates-a7_ybnPi.js"),__vite__mapDeps([115,4,26,13,21,31,10,11,87,20,32,1])
7077)),dW=g.lazy(()=>F(()=>import("./ExempleRapportHabitation-Dk_0-Rip.js"),__vite__mapDeps([116,4,38,2,16]))),cW=g.lazy(()=>F(()=>import("./ExempleRapportInvestissement-DoVF5VJg.js"),__vite__mapDeps([117,4,38,16,118]))),uW=g.lazy(()=>F(()=>import("./VoorbeeldRapportWoning-aqJ5LNRx.js"),__vite__mapDeps([119,4,38,2,16]))),mW=g.lazy(()=>F(()=>import("./VoorbeeldRapportInvestering-CLxgvlXO.js"),__vite__mapDeps([120,4,38,16,118]))),pW=g.lazy(()=>F(()=>import("./ProDashboard-C5RVK4fr.js"),__vite__mapDeps([121,35,36,12,37,38,39,23,5,40,43,122,24]))),gW=g.lazy(()=>F(()=>import("./ProLanding-Br5nRb0T.js"),__vite__mapDeps([123,35,36,12,37,38,39,23,5,40]))),hW=g.lazy(()=>F(()=>import("./ProLandingV2-DaaK27E2.js"),__vite__mapDeps([124,35,36,12,37,38,39,23,5,40]))),fW=g.lazy(()=>F(()=>import("./ProSignUp-DuMGiafJ.js"),__vite__mapDeps([125,2,1]))),vW=g.lazy(()=>F(()=>import("./ProLeads-CVAEa2To.js"),__vite__mapDeps([126,127,36,35,12,37,38,39,23,5,40,62,1,122,24,2,128]))),bW=g.lazy(()=>F(()=>import("./ProBiens-Dwcg3ARZ.js"),__vite__mapDeps([129,35,36,12,37,38,39,23,5,40,130,2,1]))),C0=g.lazy(()=>F(()=>import("./ProAnnonce-smLolmnY.js"),__vite__mapDeps([131,38,35,36,12,37,39,23,5,40,132,24,27,2,130]))),yW=g.lazy(()=>F(()=>import("./ProCommunes-D4OmKR9a.js"),__vite__mapDeps([133,35,36,12,37,38,39,23,5,40,99,50,58,100,1]))),wW=g.lazy(()=>F(()=>import("./ProSimulateurs-D4G-_pz0.js"),__vite__mapDeps([134,35,36,12,37,38,39,23,5,40,54,34,55,50,51,17,1]))),kW=g.lazy(()=>F(()=>import("./ProProfil-LpwJ5zjS.js"),__vite__mapDeps([135,35,36,12,37,38,39,23,5,40,1,2,28])));g.lazy(()=>F(()=>import("./ProAgence-7ESVkHwJ.js"),__vite__mapDeps([136,35,36,12,37,38,39,23,5,40,137,2,62,138,87,82,20,127,28])));const xW=g.lazy(()=>F(()=>import("./ProAgenceMentions-B0KuLuEQ.js"),__vite__mapDeps([139,35,36,12,37,38,39,23,5,40,1,8]))),np=g.lazy(()=>F(()=>import("./ProAdministration-DiN5_Hig.js"),__vite__mapDeps([140,127,36,35,12,37,38,39,23,5,40,136,137,2,62,138,87,82,20,28,141,1,27,86,142]))),jW=g.lazy(()=>F(()=>import("./ProParametresRapport-BD3TwAz7.js"),__vite__mapDeps([143,35,36,12,37,38,39,23,5,40,33,31,1,2])));g.lazy(()=>F(()=>import("./ProApi-BorbKYUX.js"),__vite__mapDeps([142,35,36,12,37,38,39,23,5,40,1,2])));const AW=g.lazy(()=>F(()=>import("./ProRune-BPM_DITC.js"),__vite__mapDeps([144,35,36,12,37,38,39,23,5,40,137,1,145,20]))),EW=g.lazy(()=>F(()=>import("./ProFacturation-Bhtz31wu.js"),__vite__mapDeps([146,35,36,12,37,38,39,23,5,40,1,97]))),PW=g.lazy(()=>F(()=>import("./ProTarifs-BNqc28Qc.js"),__vite__mapDeps([147,127,36]))),CW=g.lazy(()=>F(()=>import("./ProSettings-Ghu_98f5.js"),__vite__mapDeps([148,35,36,12,37,38,39,23,5,40,1,145]))),SW=g.lazy(()=>F(()=>import("./ProAnalytics-ab2LaVwy.js"),__vite__mapDeps([149,35,36,12,37,38,39,23,5,40,1,113,122,45,150,71,48,66,74,75,151,63,65]))),_W=g.lazy(()=>F(()=>import("./ProOnboarding-S2QgLmoP.js"),__vite__mapDeps([152,35,36,12,37,38,39,23,5,40,132,24,27,2,1]))),TW=g.lazy(()=>F(()=>import("./ProWidgetDemo-CTw8LH5O.js"),__vite__mapDeps([153,35,36,12,37,38,39,23,5,40,21,1,24]))),DW=g.lazy(()=>F(()=>import("./ProInvitation-DsNs7rzk.js"),__vite__mapDeps([154,2])));g.lazy(()=>F(()=>import("./ProGroupe-Ddkb5He4.js"),__vite__mapDeps([141,35,36,12,37,38,39,23,5,40,127,1,27,86])));const RW=g.lazy(()=>F(()=>import("./ProGroupeInvitation-Jzc7ZZ9j.js"),__vite__mapDeps([155,2]))),Cd=g.lazy(()=>F(()=>import("./ProLegalWrapper-Cli_MgmY.js"),__vite__mapDeps([156,35,36,12,37,38,39,23,5,40]))),zW=g.lazy(()=>F(()=>import("./ProTerms-wQxq0hYy.js"),__vite__mapDeps([157,35,36,12,37,38,39,23,5,40,4,85,145,89,138,16,91,42]))),IW=g.lazy(()=>F(()=>import("./ProDPA-CFQofbvp.js"),__vite__mapDeps([158,35,36,12,37,38,39,23,5,40,4,20,16]))),qW=g.lazy(()=>F(()=>import("./BienPublic-Bcb00Z7Y.js"),__vite__mapDeps([159,160,12,161]))),NW=g.lazy(()=>F(()=>import("./SellerScenarioPage-DxtHTLGo.js"),[])),S0=g.lazy(()=>F(()=>import("./WidgetSimulateur-Clj_V-4B.js"),__vite__mapDeps([162,12,161,114]))),LW=g.lazy(()=>F(()=>import("./DossierPage-CtkAGbDN.js"),__vite__mapDeps([163,160,12,161,2,62]))),_0=g.lazy(()=>F(()=>import("./FicheProspectPage-qygHLHPr.js"),__vite__mapDeps([164,165,37,5,24,8,2,128]))),T0=g.lazy(()=>F(()=>import("./DemandeEffacementPage-unAOHj16.js"),__vite__mapDeps([166,165,37,2,20,8]))),BW=g.lazy(()=>F(()=>import("./Rapport-C378zxRr.js"),[])),MW=g.lazy(()=>F(()=>import("./Expired-BxIJtjvy.js"),__vite__mapDeps([167,4]))),FW=g.lazy(()=>F(()=>import("./NotFound-Dja_JqzF.js"),__vite__mapDeps([168,1]))),OW=g.lazy(()=>F(()=>import("./AnalysePageV2-CkmIt34g.js"),__vite__mapDeps([169,170,171,74,75,76,77,27,8,100,16,43,86,78,15,84,2,172,173,45,150,71,48,66,174,19,87,20,49,1]))),VW=g.lazy(()=>F(()=>import("./PrintReport-Becjs54T.js"),__vite__mapDeps([175,170,171,74,75,76,77,27,8,100,16,43,86,78,15,84,2,172,173,45,150,71,48,66,174,19,49]))),WW=g.lazy(()=>F(()=>import("./TestWizard-uHB8hayD.js"),[]));function UW(){return o.jsxs("div",{style:{minHeight:"100vh",display:"flex",alignItems:"center",justifyContent:"center",fontFamily:"'Outfit', sans-serif"},children:[o.jsx("div",{style:{width:32,height:32,border:"3px solid rgba(14,54,57,0.1)",borderTopColor:"#1E6B7E",borderRadius:"50%",animation:"app-spin 0.7s linear infinite"}}),o.jsx("style",{children:"@keyframes app-spin { to { transform: rotate(360deg); } }"})]})}const $W=()=>{const e=xt(),{setLanguage:t}=Ge(),{unseenUpdate:n,isDialogOpen:r,checkForUpdates:a,closeDialog:i}=r5(),s=g.useRef({navigate:e,setLanguage:t,checkForUpdates:a});return g.useEffect(()=>{s.current={navigate:e,setLanguage:t,checkForUpdates:a}},[e,t,a]),g.useEffect(()=>{const{data:{subscription:l}}=de.auth.onAuthStateChange(async(d,c)=>{var h;const{navigate:u,setLanguage:m,checkForUpdates:p}=s.current;
7077d==="PASSWORD_RECOVERY"&&u("/update-password"),(d==="SIGNED_IN"||d==="INITIAL_SESSION")&&(c!=null&&c.user)&&(console.log("[AUTH DEBUG] SIGNED_IN event fired"),console.log("[AUTH DEBUG] user_metadata:",c.user.user_metadata),console.log("[AUTH DEBUG] is_agent_pro:",(h=c.user.user_metadata)==null?void 0:h.is_agent_pro),console.log("[AUTH DEBUG] pending_agent_registration:",localStorage.getItem("pending_agent_registration")),console.log("[AUTH DEBUG] currentPath:",window.location.pathname.startsWith("/d/")?"/d/[jeton]":window.location.pathname.startsWith("/e/")?"/e/[jeton]":window.location.pathname),setTimeout(async()=>{var b;try{const{data:f}=await de.from("profiles").select("preferred_language, account_type").eq("id",c.user.id).single(),k=window.location.pathname,w=Tf(k)==="nl"||!!Df(k);if(f!=null&&f.preferred_language&&!w&&m(f.preferred_language),(f==null?void 0:f.account_type)==="agent_pro"||(f==null?void 0:f.account_type)==="agent_pending"){const x=window.location.pathname;!x.startsWith("/pro")&&!x.startsWith("/login")&&!x.startsWith("/bien")&&!x.startsWith("/widget")&&!x.startsWith("/dossier")&&!x.startsWith("/d/")&&!x.startsWith("/e/")&&!x.startsWith("/rapport")&&!x.startsWith("/commune")&&!x.startsWith("/gemeente")&&!x.startsWith("/map")&&!x.startsWith("/simulateur")&&!x.startsWith("/free-analyse")&&u("/pro/dashboard")}const v=((b=c.user.user_metadata)==null?void 0:b.is_agent_pro)===!0,y=localStorage.getItem("pending_agent_registration")!==null;if(v&&y){const x=window.location.pathname;!x.startsWith("/pro")&&!x.startsWith("/login")&&!x.startsWith("/d/")&&!x.startsWith("/e/")&&u("/pro/onboarding")}!window.location.pathname.startsWith("/d/")&&!window.location.pathname.startsWith("/e/")&&p(c.user.id)}catch(f){console.error("Error fetching user profile:",f)}},500))});return()=>{l.unsubscribe()}},[]),o.jsx(ML,{open:r,onClose:i,update:n})};function GW(){const{pathname:e}=Ln();return e.startsWith("/d/")||e.startsWith("/e/")?null:o.jsx(TF,{})}const HW=new gz;function KW(){const e={fr:i4,nl:sM,en:vF};return o.jsx(hz,{client:HW,children:o.jsx(wI,{translations:e,children:o.jsxs($R,{children:[o.jsx(MT,{}),o.jsx(gD,{}),o.jsx(MI,{}),o.jsxs(mI,{children:[o.jsxs(sx,{children:[o.jsx("title",{children:"Arcanes | Analyse immobilière intelligente en Belgique"}),o.jsx("meta",{name:"description",content:"Rapports d'analyse immobilière personnalisés, simulateurs gratuits et données par commune. Prenez des décisions éclairées pour votre achat ou investissement en Belgique."}),o.jsx("meta",{property:"og:site_name",content:"Arcanes"}),o.jsx("meta",{property:"og:type",content:"website"}),o.jsx("meta",{property:"og:image",content:"https://arcanes.be/og-image-n.png"}),o.jsx("meta",{name:"twitter:card",content:"summary_large_image"}),o.jsx("meta",{name:"twitter:image",content:"https://arcanes.be/og-image-n.png"})]}),o.jsx($W,{}),o.jsx(n5,{}),o.jsx(WL,{children:o.jsx(g.Suspense,{fallback:o.jsx(UW,{}),children:o.jsxs(aI,{children:[o.jsx(R,{path:"/",element:o.jsx(cV,{})}),o.jsx(R,{path:"/login",element:o.jsx(z8,{})}),o.jsx(R,{path:"/widget/:agentId",element:o.jsx(S0,{})}),o.jsx(R,{path:"/widget/agency/:agencyId",element:o.jsx(S0,{})}),o.jsx(R,{path:"/dossier/:token",element:o.jsx(LW,{})}),o.jsx(R,{path:"/d/:jeton",element:o.jsx(_0,{})}),o.jsx(R,{path:"/d",element:o.jsx(_0,{})}),o.jsx(R,{path:"/e/:jeton",element:o.jsx(T0,{})}),o.jsx(R,{path:"/e",element:o.jsx(T0,{})}),o.jsx(R,{path:"/rapport",element:o.jsx(BW,{})}),o.jsx(R,{path:"/signup",element:o.jsx(I8,{})}),o.jsx(R,{path:"/reset-password",element:o.jsx(q8,{})}),o.jsx(R,{path:"/update-password",element:o.jsx(N8,{})}),"// Dans App.tsx ou ton fichier de routes",o.jsx(R,{path:"/free-analyse",element:o.jsx(g0,{})}),o.jsx(R,{path:"/free-analyse/vente-publique",element:o.jsx(g0,{})}),o.jsx(R,{path:"/dashboard",element:o.jsx(L8,{})}),o.jsx(R,{path:"/profile",element:o.jsx(B8,{})}),o.jsx(R,{path:"/contact",element:o.jsx(p0,{})}),o.jsx(R,{path:"/settings",element:o.jsx(M8,{})}),o.jsx(R,{path:"/referral",element:o.jsx(F8,{})}),o.jsx(R,{path:"/ma-vraie-valeur",element:o.jsx(Y8,{})}),o.jsx(R,{path:"/methodologie",element:o.jsx(Z8,{})}),o.jsx(R,{path:"/pro",element:o.jsx(gW,{})}),o.jsx(R,{path:"/pro-v2",element:o.jsx(hW,{})}),o.jsx(R,{path:"/pro/signup",element:o.jsx(fW,{})}),o.jsx(R,{path:"/pro/dashboard",element:o.jsx(it,{children:o.jsx(pW,{})})}),o.jsx(R,{path:"/pro/annonce",element:o.jsx(it,{children:o.jsx(C0,{})})}),o.jsx(R,{path:"/pro/annonce/:bienId",element:o.jsx(it,{children:o.jsx(C0,{})})}),o.jsx(R,{path:"/pro/onboarding",element:o.jsx(it,{children:o.jsx(_W,{})})}),o.jsx(R,{path:"/pro/widget-demo",element:o.jsx(it,{children:o.jsx(TW,{})})}),o.jsx(R,{path:"/pro/leads",element:o.jsx(it,{children:o.jsx(vW,{})})}),o.jsx(R,{path:"/pro/biens",element:o.jsx(it,{children:o.jsx(bW,{})})}),o.jsx(R,{path:"/pro/communes",element:o.jsx(it,{children:o.jsx(yW,{})})}),o.jsx(R,{path:"/pro/simulateurs",element:o.jsx(it,{children:o.jsx(wW,{})})}),o.jsx(R,{path:"/pro/profil",element:o.jsx(it,{children:o.jsx(kW,{})})}),o.jsx(R,{path:"/pro/agence",element:o.jsx(it,{children:o.jsx(np,{initialSection:"agence"})})}),o.jsx(R,{path:"/pro/agence/mentions",element:o.jsx(it,{children:o.jsx(xW,{})})}),o.jsx(R,{path:"/pro/parametres-rapport",element:o.jsx(it,{children:o.jsx(jW,{})})}),o.jsx(R,{path:"/pro/api",element:o.jsx(it,{children:o.jsx(np,{initialSection:"api"})})}),o.jsx(R,{path:"/pro/rune",element:o.jsx(it,{children:o.jsx(AW,{})})}),o.jsx(R,{path:"/pro/facturation",element:o.jsx(it,{children:o.jsx(EW,{})})}),o.jsx(R,{path:"/pro/tarifs",element:o.jsx(PW,{})}),o.jsx(R,{path:"/pro/analytics",element:o.jsx(it,{children:o.jsx(SW,{})})}),o.jsx(R,{path:"/pro/settings",element:o.jsx(it,{children:o.jsx(CW,{})})}),o.jsx(R,{path:"/pro/invitation/:token",element:o.jsx(it,{children:o.jsx(DW,{})})}),o.jsx(R,{path:"/pro/groupe",element:o.jsx(it,{children:o.jsx(np,{initialSection:"groupe"})})}),o.jsx(R,{path:"/pro/groupe-invitation/:token",element:o.jsx(it,{children:o.jsx(RW,{})})}),o.jsx(R,{path:"/pro/terms",element:o.jsx(zW,{})}),o.jsx(R,{path:"/pro/dpa",element:o.jsx(IW,{})}),o.jsx(R,{path:"/pro/privacy",element:o.jsx(Cd,{children:o.jsx(f0,{hideHeader:!0})})}),o.jsx(R,{path:"/pro/legal",element:o.jsx(Cd,{children:o.jsx(v0,{hideHeader:!0})})}),o.jsx(R,{path:"/pro/contact",element:o.jsx(Cd,{children:o.jsx(p0,{hideHeader:!0})})}),o.jsx(R,{path:"/simulateur",element:o.jsx(O8,{})}),o.jsx(R,{path:"/simulateur-frais-acte",element:o.jsx(h0,{})}),o.jsx(R,{path:"/notariskosten-berekenen",element:o.jsx(h0,{})}),o.jsx(R,{path:"/simulateur-pret",element:o.jsx(V8,{})}),o.jsx(R,{path:"/simulateur-emprunt",element:o.jsx(W8,{})}),o.jsx(R,{path:"/simulateur-peb",element:o.jsx(U8,{})}),o.jsx(R,{path:"/prix-certificat-peb",element:o.jsx(H8,{})}),o.jsx(R,{path:"/simulateur-rendement-locatif",element:o.jsx($8,{})}),o.jsx(R,{path:"/simulateur-tri",element:o.jsx(G8,{})}),o.jsx(R,{path:"/simulateurs/precompte-immobilier",element:o.jsx(K8,{})}),o.jsx(R,{path:"/tarifs",element:o.jsx(J8,{})}),o.jsx(R,{path:"/faq",element:o.jsx(eW,{})}),o.jsx(R,{path:"/blog",element:o.jsx(Q8,{})}),o.jsx(R,{path:"/blog/:slug",element:o.jsx(X8,{})}),o.jsx(R,{path:"/communes",element:o.jsx(k0,{})}),o.jsx(R,{path:"/gemeenten",element:o.jsx(k0,{})}),o.jsx(R,{path:"/commune/:slug",element:o.jsx(y0,{})}),o.jsx(R,{path:"/gemeente/:slug",element:o.jsx(y0,{})}),o.jsx(R,{path:"/province/:slug",element:o.jsx(w0,{})}),o.jsx(R,{path:"/provincie/:slug",element:o.jsx(w0,{})}),o.jsx(R,{path:"/map",element:o.jsx(aW,{})}),o.jsx(R,{path:"/exploration",element:o.jsx(P0,{})}),o.jsx(R,{path:"/verkenning",element:o.jsx(P0,{})}),o.jsx(R,{path:"/observatoire",element:o.jsx(x0,{})}),o.jsx(R,{path:"/observatorium",element:o.jsx(x0,{})}),o.jsx(R,{path:"/observatoire/tendances-regionales",element:o.jsx(j0,{})}),o.jsx(R,{path:"/observatorium/regionale-trends",element:o.jsx(j0,{})}),o.jsx(R,{path:"/observatoire/atlas",element:o.jsx(E0,{})}),o.jsx(R,{path:"/observatorium/atlas",element:o.jsx(E0,{})}),o.jsx(R,{path:"/observatoire/atlas/n1",element:o.jsx(A0,{})}),o.jsx(R,{path:"/observatorium/atlas/n1",element:o.jsx(A0,{})}),o.jsx(R,{path:"/observatoire/presse",element:o.jsx(oW,{})}),o.jsx(R,{path:"/observatoire/presse/belgique",element:o.jsx(tp,{kind:"national"})}),o.jsx(R,{path:"/observatoire/presse/agglo/:slug",element:o.jsx(tp,{kind:"agglo"})}),o.jsx(R,{path:"/observatoire/presse/province/:slug",element:o.jsx(tp,{kind:"province"})}),o.jsx(R,{path:"/observatoire/presse/indicateur/:slug",element:o.jsx(sW,{})}),o.jsx(R,{path:"/observatoire/presse/galerie",element:o.jsx(iW,{})}),o.jsx(R,{path:"/terms",element:o.jsx(tW,{})}),o.jsx(R,{path:"/privacy",element:o.jsx(f0,{})}),o.jsx(R,{path:"/legal",element:o.jsx(v0,{})}),o.jsx(R,{path:"/data-deletion",element:o.jsx(b0,{})}),o.jsx(R,{path:"/pro/data-deletion",element:o.jsx(Cd,{children:o.jsx(b0,{hideHeader:!0})})}),o.jsx(R,{path:"/security-credits",element:o.jsx(nW,{})}),o.jsx(R,{path:"/security-policy",element:o.jsx(rW,{})}),o.jsx(R,{path:"/admin/feature-updates",element:o.jsx(lW,{})}),o.jsx(R,{path:"/exemple-rapport-habitation",element:o.jsx(dW,{})}),o.jsx(R,{path:"/exemple-rapport-investissement",element:o.jsx(cW,{})}),o.jsx(R,{path:"/voorbeeld-rapport-woning",element:o.jsx(uW,{})}),o.jsx(R,{path:"/voorbeeld-rapport-investering",element:o.jsx(mW,{})}),o.jsx(R,{path:"/bien/:id",element:o.jsx(qW,{})}),o.jsx(R,{path:"/scenario/:token",element:o.jsx(NW,{})}),o.jsx(R,{path:"/analyse-v2/:id",element:o.jsx(OW,{})}),o.jsx(R,{path:"/print/:id",element:o.jsx(VW,{})}),o.jsx(R,{path:"/expired",element:o.jsx(MW,{})}),o.jsx(R,{path:"/pro/test-wizard",element:o.jsx(WW,{})}),o.jsx(R,{path:"*",element:o.jsx(FW,{})})]})})}),o.jsx(GW,{})]})]})})})}const th="arcanes:lastChunkReload",D0=1e4,sE=e=>e.includes("error loading dynamically imported module")||e.includes("Failed to fetch dynamically imported module")||e.includes("Importing a module script failed"),cv=()=>{if(typeof navigator<"u"&&navigator.onLine===!1){console.warn("[Arcanes] Stale chunk detected but skipping reload: browser is offline. Will retry once connectivity is restored.");return}const e=Number(sessionStorage.getItem(th)||"0"),t=Date.now();if(e&&t-e<D0){console.warn(`[Arcanes] Stale chunk detected but skipping reload: last reload was ${t-e}ms ago (cooldown ${D0}ms).`);return}sessionStorage.setItem(th,String(t)),window.location.reload()};window.addEventListener("vite:preloadError",()=>{console.warn("[Arcanes] Chunk load error detected (vite:preloadError)."),cv()});window.addEventListener("error",e=>{const t=(e==null?void 0:e.message)||"";sE(t)&&(console.error("[Arcanes] Chunk load error detected (window.error):",t),cv())});window.addEventListener("unhandledrejection",e=>{var n;const t=String(((n=e==null?void 0:e.reason)==null?void 0:n.message)||(e==null?void 0:e.reason)||"");sE(t)&&(console.error("[Arcanes] Chunk load error detected (unhandledrejection):",t),cv())});window.addEventListener("load",()=>{setTimeout(()=>{sessionStorage.removeItem(th)},5e3)});ap.createRoot(document.getElementById("root")).render(o.jsx(I.StrictMode,{children:o.jsx(ix,{children:o.jsx(KW,{})})}));export{et as $,jc as A,ka as B,fa as C,Bx as D,I_ as E,P6 as F,Ac as G,M_ as H,Ds as I,st as J,B_ as K,lv as L,Yx as M,z_ as N,lN as O,dN as P,cN as Q,mN as R,da as S,Vs as T,rV as U,bO as V,nI as W,bu as X,lV as Y,cf as Z,Qx as _,xt as a,Hf as a$,le as a0,b_ as a1,Il as a2,J_ as a3,Wc as a4,lg as a5,Fs as a6,be as a7,ct as a8,kt as a9,eU as aA,tU as aB,GR as aC,Ey as aD,F as aE,D_ as aF,Ec as aG,og as aH,V_ as aI,dg as aJ,j_ as aK,N_ as aL,Ps as aM,yO as aN,P
7077S as aO,rf as aP,y_ as aQ,I as aR,Nx as aS,ux as aT,M2 as aU,Vg as aV,aV as aW,nT as aX,Df as aY,Gs as aZ,xu as a_,Kx as aa,Wx as ab,xO as ac,Re as ad,Es as ae,ce as af,gn as ag,oL as ah,bR as ai,pN as aj,Ux as ak,af as al,hi as am,eT as an,uN as ao,Fx as ap,Er as aq,Ox as ar,df as as,e1 as at,q_ as au,k_ as av,P_ as aw,E_ as ax,Ln as ay,$R as az,iU as b,sf as b$,Gf as b0,qu as b1,Os as b2,kf as b3,xf as b4,dx as b5,Lu as b6,ha as b7,mx as b8,zl as b9,sN as bA,SN as bB,bF as bC,kF as bD,W_ as bE,$x as bF,T_ as bG,U_ as bH,Cu as bI,rz as bJ,ZR as bK,nU as bL,Qb as bM,kn as bN,Su as bO,KR as bP,YR as bQ,O1 as bR,oz as bS,QR as bT,Nt as bU,rU as bV,un as bW,Cl as bX,Mx as bY,gi as bZ,sU as b_,wf as ba,ca as bb,X2 as bc,hO as bd,EU as be,O_ as bf,aU as bg,PU as bh,SU as bi,CU as bj,Z_ as bk,lf as bl,S_ as bm,sx as bn,yU as bo,vu as bp,vU as bq,iN as br,x2 as bs,bU as bt,Qf as bu,cx as bv,Xf as bw,j2 as bx,oN as by,aN as bz,UA as c,tT as c0,F_ as c1,AU as c2,xU as c3,ML as c4,Xx as c5,Gx as c6,G_ as c7,x_ as c8,$_ as c9,Jx as ca,ZW as cb,Zj as cc,Zx as cd,t1 as ce,Xo as d,Q_ as e,nf as f,Wg as g,Ce as h,cg as i,o as j,Vx as k,A_ as l,lx as m,Zg as n,Hx as o,H as p,of as q,g as r,de as s,qL as t,Ge as u,MA as v,NL as w,VA as x,Jd as y,ep 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.