{"version":3,"sources":["theme.config.js","helpers/number.helpers.js","LoanCalculator/LoanCalculationChart.js","helpers/calculation.helpers.js","LoanCalculator/LoanCalculator.config.js","LoanCalculator/LoanCalculator.hooks.js","LoanCalculator/LoanCalculationTable.js","Button/Button.js","Link/BaseLink/BaseLink.js","icons/IconArrow.js","icons/IconCheck.js","icons/IconClose.js","icons/IconDownload.js","icons/IconFacebook.js","icons/IconHamburger.js","icons/IconHome.js","icons/IconInfo.js","icons/IconInstagram.js","icons/IconLinkedIn.js","icons/IconLogin.js","icons/IconQuestion.js","icons/IconSearch.js","icons/IconPlus.js","icons/IconMinus.js","icons/IconTwitter.js","icons/IconUpload.js","icons/IconWifi.js","icons/IconYoutube.js","icons/IconFallback.js","icons/Icon.js","Heading/Heading.styles.js","Heading/Heading.js","AdvancedLoanCalculatorBlock/AdvancedLoanCalculatorBlock.js","App.js","index.js"],"names":["colors","orange","gray","brand","components","Heading","baseStyle","fontWeight","Input","variants","outline","field","borderRadius","borderColor","boxShadow","_hover","_focus","_placeholder","color","Select","Table","striped","tbody","tr","_odd","td","background","border","thead","borderBottom","th","fontSize","textTransform","Radio","parts","control","borderWidth","_checked","sizes","md","_before","width","height","Textarea","theme","extendTheme","styles","global","body","bg","p","marginTop","marginBottom","fonts","heading","fontSizes","sm","lg","xl","lineHeights","shorter","short","tall","fontWeights","light","normal","bold","shadows","formatCurrency","num","separator","toString","replace","LoanCalculationChart","payments","remainingLabel","language","actualPayments","slice","paymentsAsChartData","map","payment","remaining","settings","data","labels","_","index","String","datasets","label","backgroundColor","fill","options","scales","y","ticks","callback","value","Number","toLocaleString","paddingBottom","error","nil","Error","div0","ref","name","na","parseNumber","string","undefined","isNaN","parseFloat","isFlat","array","i","length","Array","isArray","flattenShallow","reduce","a","b","aIsArray","bIsArray","concat","push","argsToArray","args","result","iteratee","arrayEach","utils","arr","len","parsed","apply","arguments","n","PMT","rate","periods","present","future","type","term","Math","pow","FV","loanCalculationRuleSet","SV","from","to","maxMonths","InvoiceFee","NO","DK","FREE","LoanTypes","useCalculatedLoan","loanType","amount","months","interestRate","establishmentFee","paymentFee","numberOfYearlyPayments","yearlyInterestRateDecimal","console","log","numberOfRepayments","nominalInterestRate","downPayment","prevClosingBalance","calcPayment","fees","isLast","_interestCost","period","IPMT","amortization","round","abs","interestCost","_payment","monthlyDiscountRate","values","guess","irrResult","dates","r","irrResultDeriv","frac","positive","negative","newRate","epsRate","resultValue","resultRate","contLoop","IRR","APR","totalPayment","acc","curr","totalAmount","monthlyPayment","calculatedMonthlyFee","totalCost","CalculationTh","children","base","LoanCalculationTable","_numberOfYearlyPayments","installmentPaymentLabel","installmentLabel","interestCostLabel","feesLabel","amortizationLabel","monthLabel","yearLabel","quarterLabel","spaceRemoverDk","thousandDelimiterDk","langSpecificKRsuffix","_installmentLabel","overflowX","css","variant","motion","Link","display","minHeight","justifyContent","alignItems","textAlign","paddingY","paddingX","lineHeight","textDecoration","secondary","transition","IconArrow","props","d","stroke","strokeWidth","strokeMiterlimit","strokeLinecap","strokeLinejoin","IconCheck","IconClose","clipPath","id","IconDownload","IconFacebook","cx","cy","fillRule","clipRule","IconHamburger","IconHome","IconInfo","IconInstagram","IconLinkedIn","IconLogin","IconQuestion","viewBox","IconSearch","IconPlus","IconMinus","IconTwitter","IconUpload","IconWifi","IconYoutube","IconFallback","Icon","icon","size","iconSize","getSize","iconProps","IconComponent","getIcon","h1","h2","h3","h4","h5","h6","breakpointSize","useBreakpointValue","_size","TooltipIcon","tooltip","useState","isLabelOpen","setIsLabelOpen","position","hasArrow","placement","whiteSpace","isOpen","top","onMouseEnter","onMouseLeave","onClick","LabelWithTooltip","AdvancedLoanCalculatorBlock","title","initialLoanAmount","initialLoanYears","initialLoanMonths","initialInterestRate","initialNumberOfYearlyPayments","minInterestRate","maxInterestRate","loanAmountLabel","content","loanTypeLabel","loanTypeTooltip","loanAmountTooltip","loanYearsLabel","loanYearsTooltip","interestRateLabel","yearlyPaymentsLabel","yearlyPaymentsTooltip","interestRateTooltip","paymentFeeLabel","paymentFeeTooltip","establishmentFeeLabel","establishmentFeeTooltip","yourLoanCostLabel","monthlyFee","totalCostLabel","paymentPlanLabel","annuityLoanLabel","viewPaymentPlanLabel","hidePaymentPlanLabel","monthly","quarterly","yearly","serialLoanLabel","initialPaymentFee","numberSeparator","handleNumberChange","stripped","loanAmount","setLoanAmount","loanMonths","setLoanMonths","setPaymentFee","viewPlanRef","useRef","isPlanVisible","loanCalculator","initialEstablishmentFee","initialLoanType","version","calculationRules","setLoanType","setAmount","setMonths","setInterestRate","setEstablishmentFee","setNumberOfYearlyPayments","minLoanAmount","setMinLoanAmount","maxLoanAmount","setMaxLoanAmount","maxLoanMonths","setMaxLoanMonths","useEffect","rule","filter","years","setYears","minLoanYears","maxLoanYears","useLoanCalculatorController","toUpperCase","calculatedLoan","templateColumns","gap","colSpan","defaultValue","onChange","e","spacing","direction","currentTarget","onBlur","paddingRight","right","marginRight","columns","as","marginY","App","currentLang","window","LOAN_CALCULATOR_LANGUAGE","languageProps","lang","languageFile","output","key","hasOwnProperty","getLanguageProps","resetCSS","process","ReactDOM","render","StrictMode","document","getElementById"],"mappings":"wqMAEMA,EAAS,CACbC,OAAQ,CACN,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAEPC,KAAM,CACJ,GAAI,UACJ,IAAK,UACL,IAAK,WAEPC,MAAO,CACL,IAAK,eAgDHC,EAAa,CACjBC,QAAS,CACPC,UAAW,CACTC,WAAY,UAGhBC,MAAO,CACLC,SAAU,CACRC,QAAS,CACPC,MAAO,CACLC,aAAc,EACdC,YAAa,OACbC,UAAW,iBACXC,OAAQ,CACNF,YAAa,QAEfG,OAAQ,CACNF,UAAU,aAAD,OAAed,EAAOC,OAAO,MACtCY,YAAa,cAEfI,aAAc,CACZC,MAAO,gBAMjBC,OAAQ,CACNV,SAAU,CACRC,QAAS,CACPC,MAAO,CACLC,aAAc,EACdC,YAAa,OACbC,UAAW,iBACXC,OAAQ,CACNF,YAAa,QAEfG,OAAQ,CACNF,UAAU,aAAD,OAAed,EAAOC,OAAO,MACtCY,YAAa,cAEfI,aAAc,CACZC,MAAO,gBAMjBE,MAAO,CACLX,SAAU,CACRY,QAAS,CACPC,MAAO,CACLC,GAAI,CACFC,KAAM,CACJC,GAAI,CACFC,WAAY1B,EAAOE,KAAK,MAG5BuB,GAAI,CACFC,WAAY,QACZC,OAAQ,KAIdC,MAAO,CACLC,aAAc,aAEhBC,GAAI,CACFZ,MAAO,QACPX,WAAY,SACZwB,SAAU,KACVC,cAAe,OACfL,OAAQ,MAKhBM,MAAO,CACLC,MAAO,CAAC,WACR5B,UAAW,CACT6B,QAAS,CACPtB,YAAa,QACbuB,YAAa,MACbC,SAAU,CACRD,YAAa,MACbvB,YAAa,aACbK,MAAO,aACPH,OAAQ,CACNF,YAAa,iBAKrByB,MAAO,CACLC,GAAI,CACFJ,QAAS,CACPE,SAAU,CACRG,QAAS,CACPb,OAAQ,kBACRc,MAAO,OACPC,OAAQ,SAGZD,MAAO,EACPC,OAAQ,MAKhBC,SAAU,CACRlC,SAAU,CACRC,QAAS,CACP0B,YAAa,MACbxB,aAAc,EACdC,YAAa,QACbE,OAAQ,CACNF,YAAa,SAEfG,OAAQ,CACNH,YAAa,QACbC,UAAW,eAOR8B,EAAQC,YAAY,CAC/B7C,SACA8C,OA9Ia,CACbC,OAAQ,CACNC,KAAM,CACJN,OAAQ,OACRO,GAAI,SAENC,EAAG,CACDC,UAAW,WACXC,aAAc,cAuIlBhD,aACAiD,MA/KY,CACZL,KAAM,iEACNM,QAAS,kEA8KTC,UA3KgB,CAChBC,GAAI,OACJjB,GAAI,OACJkB,GAAI,OACJC,GAAI,OACJ,MAAO,OACP,MAAO,OACP,MAAO,QAqKPC,YAlKkB,CAClBC,QAAS,KACTC,MAAO,KACPC,KAAM,MAgKNC,YA7JkB,CAClBC,MAAO,IACPC,OAAQ,IACRC,KAAM,KA2JNC,QAxJc,CACdzD,QAAS,sCC/CE0D,EAAiB,SAACC,GAAD,IAAMC,EAAN,uDAAkB,IAAlB,OAC5BD,EAAIE,WAAWC,QAAQ,wBAAyBF,I,OCKrCG,EAAuB,SAAC,GAI9B,IAHLC,EAGI,EAHJA,SACAC,EAEI,EAFJA,eACAC,EACI,EADJA,SAEMC,EAAiB,YAAIH,GAAUI,MAAM,GAErCC,EAAsBF,EAAeG,KAAI,SAACC,GAC9C,OAAOA,EAAQC,aAMXC,EAAW,CACfC,KAAM,CACJC,OANqBR,EAAeG,KAAI,SAACM,EAAGC,GAC9C,OAAOC,OAAOD,EAAQ,MAMpBE,SAAU,CACR,CACEC,MAAOf,EACPS,KAAML,EACNlE,YAAa+B,EAAM5C,OAAOC,OAAO,KACjC0F,gBAAiB/C,EAAM5C,OAAOC,OAAO,KACrC2F,MAAM,KAIZC,QAAS,CACPC,OAAQ,CACNC,EAAG,CACDC,MAAO,CACLC,SADK,SACIC,GACP,MAAiB,OAAbtB,EACKR,EAAe8B,EAAO,KAGd,OAAbtB,EACKuB,OAAOD,GAAOE,eAAe,MAG/BD,OAAOD,GAAOE,uBAQjC,OACE,cAAC,IAAD,CAAKC,cAAc,KAAnB,SACE,cAAC,IAAD,eAAUlB,O,+ECtDVmB,EAAQ,CACZC,IAAK,IAAIC,MAAM,UACfC,KAAM,IAAID,MAAM,WAChBN,MAAO,IAAIM,MAAM,WACjBE,IAAK,IAAIF,MAAM,SACfG,KAAM,IAAIH,MAAM,UAChBnC,IAAK,IAAImC,MAAM,SACfI,GAAI,IAAIJ,MAAM,QACdF,MAAO,IAAIE,MAAM,WACjBpB,KAAM,IAAIoB,MAAM,kBAGZK,EAAc,SAAUC,GAC5B,YAAeC,IAAXD,GAAmC,KAAXA,GAGvBE,MAAMF,GAFFR,EAAMJ,MAGNe,WAAWH,IAMhBI,EAAS,SAAUC,GACvB,IAAKA,EACH,OAAO,EAGT,IAAK,IAAIC,EAAI,EAAGA,EAAID,EAAME,SAAUD,EAClC,GAAIE,MAAMC,QAAQJ,EAAMC,IACtB,OAAO,EAIX,OAAO,GAGHI,EAAiB,SAAUL,GAC/B,OAAKA,GAAUA,EAAMM,OAIdN,EAAMM,QAAO,SAAUC,EAAGC,GAC/B,IAAIC,EAAWN,MAAMC,QAAQG,GACzBG,EAAWP,MAAMC,QAAQI,GAE7B,OAAIC,GAAYC,EACPH,EAAEI,OAAOH,GAEdC,GACFF,EAAEK,KAAKJ,GAEAD,GAELG,EACK,CAACH,GAAGI,OAAOH,GAGb,CAACD,EAAGC,MAnBJR,GAwDLa,EAAc,SAAUC,GAC5B,IAAIC,EAAS,GAMb,OApBgB,SAAUf,EAAOgB,GAIjC,IAHA,IAAI5C,GAAS,EACX8B,EAASF,EAAME,SAER9B,EAAQ8B,IAC8B,IAAzCc,EAAShB,EAAM5B,GAAQA,EAAO4B,MAWpCiB,CAAUH,GAAM,SAAU/B,GACxBgC,EAAOH,KAAK7B,MAGPgC,GAuBHG,EACJxB,EADIwB,EA/DmB,SAAUC,GACjC,IAAIC,EAMAC,EAJJ,IAAKF,GAA8B,KAAtBC,EAAMD,EAAIjB,QACrB,OAAOf,EAAMJ,MAKf,KAAOqC,KAAO,CAEZ,IADAC,EAAS3B,EAAYyB,EAAIC,OACVjC,EAAMJ,MACnB,OAAOsC,EAETF,EAAIC,GAAOC,EAGb,OAAOF,GA8CHD,EApBU,WAGd,IAFA,IAAIH,EAASF,EAAYS,MAAM,KAAMC,YAE7BxB,EAAOgB,IACbA,EAASV,EAAeU,GAG1B,OAAOA,GAaHG,EAVa,WAEjB,IADA,IAAIM,EAAID,UAAUrB,OACXsB,KACL,GAAID,UAAUC,aAAcnC,MAC1B,OAAO,EAGX,OAAO,GAUIoC,EAAM,SAAUC,EAAMC,EAASC,EAASC,EAAQC,GAW3D,GARAD,EAASA,GAAU,EACnBC,EAAOA,GAAQ,EAEfJ,EAAOR,EAAkBQ,GACzBC,EAAUT,EAAkBS,GAC5BC,EAAUV,EAAkBU,GAC5BC,EAASX,EAAkBW,GAC3BC,EAAOZ,EAAkBY,GACrBZ,EAAiBQ,EAAMC,EAASC,EAASC,EAAQC,GACnD,OAAO3C,EAAMJ,MAIf,IAAIgC,EACJ,GAAa,IAATW,EACFX,GAAUa,EAAUC,GAAUF,MACzB,CACL,IAAII,EAAOC,KAAKC,IAAI,EAAIP,EAAMC,GAE5BZ,EADW,IAATe,GAEED,EAASH,GAASK,EAAO,GAAMH,EAAUF,GAAS,EAAI,EAAIK,KAC3D,EAAIL,GAEGG,EAASH,GAASK,EAAO,GAAMH,EAAUF,GAAS,EAAI,EAAIK,GAGxE,OAAQhB,GAqHGmB,EAAK,SAAUR,EAAMC,EAAS7D,EAASiB,EAAO+C,GAWzD,GARA/C,EAAQA,GAAS,EACjB+C,EAAOA,GAAQ,EAEfJ,EAAOR,EAAkBQ,GACzBC,EAAUT,EAAkBS,GAC5B7D,EAAUoD,EAAkBpD,GAC5BiB,EAAQmC,EAAkBnC,GAC1B+C,EAAOZ,EAAkBY,GACrBZ,EAAiBQ,EAAMC,EAAS7D,EAASiB,EAAO+C,GAClD,OAAO3C,EAAMJ,MAIf,IAAIgC,EACJ,GAAa,IAATW,EACFX,EAAShC,EAAQjB,EAAU6D,MACtB,CACL,IAAII,EAAOC,KAAKC,IAAI,EAAIP,EAAMC,GAE5BZ,EADW,IAATe,EACO/C,EAAQgD,EAAQjE,GAAW,EAAI4D,IAASK,EAAO,GAAML,EAErD3C,EAAQgD,EAAQjE,GAAWiE,EAAO,GAAML,EAGrD,OAAQX,GCnTGoB,EAAyB,CACpCC,GAAI,CACF,CACEC,KAAM,IACNC,GAAI,MACJC,UAAW,GACXC,WAAY,IAEd,CACEH,KAAM,IACNC,GAAI,MACJC,UAAW,IAEb,CACEF,KAAM,IACNC,GAAI,MACJC,UAAW,KAEb,CACEF,KAAM,IACNC,GAAI,MACJC,UAAW,KAEb,CACEF,KAAM,IACNC,GAAI,OACJC,UAAW,KAEb,CACEF,KAAM,KACNC,GAAI,IACJC,UAAW,MAGfE,GAAI,CACF,CACEJ,KAAM,IACNC,GAAI,MACJC,UAAW,GACXC,WAAY,IAEd,CACEH,KAAM,IACNC,GAAI,MACJC,UAAW,IAEb,CACEF,KAAM,IACNC,GAAI,MACJC,UAAW,KAEb,CACEF,KAAM,IACNC,GAAI,MACJC,UAAW,KAEb,CACEF,KAAM,IACNC,GAAI,OACJC,UAAW,KAEb,CACEF,KAAM,KACNC,GAAI,IACJC,UAAW,MAGfG,GAAI,CACF,CACEL,KAAM,IACNC,GAAI,MACJC,UAAW,GACXC,WAAY,GAEd,CACEH,KAAM,IACNC,GAAI,MACJC,UAAW,IAEb,CACEF,KAAM,IACNC,GAAI,MACJC,UAAW,KAEb,CACEF,KAAM,IACNC,GAAI,MACJC,UAAW,KAEb,CACEF,KAAM,IACNC,GAAI,OACJC,UAAW,KAEb,CACEF,KAAM,KACNC,GAAI,IACJC,UAAW,MAGfI,KAAM,CACJ,CACEN,KAAM,EACNC,GAAI,SACJC,UAAW,OCGJK,EACF,UAIEC,EAAoB,SAAC,GAQ3B,IAPLC,EAOI,EAPJA,SACAC,EAMI,EANJA,OACAC,EAKI,EALJA,OACAC,EAII,EAJJA,aACAC,EAGI,EAHJA,iBACAC,EAEI,EAFJA,WACAC,EACI,EADJA,uBAGMC,EAA4BJ,EAAe,IACjDK,QAAQC,IACN,SACEP,EACA,aACAI,EACA,YACAF,GAEJ,IAAMM,EAAqBR,EACrBS,EACJJ,EAA4BD,EAExBM,EACJjC,EAAIgC,EAAqBD,EAAoBT,EAASG,GACtDC,EAEEQ,EAAqB,EACnBpG,EAAW4C,MAAMmB,MAAM,EAAGnB,MAAMqD,EAAqB,IAAI3F,KAC7D,SAACM,EAAGC,GACF,GAAc,IAAVA,EAEF,OADAuF,EAAqBZ,EAASG,EACvB,CAAEU,YAAab,GAEtB,IAAMc,EAAOV,EACPW,EAAS1F,IAAUoF,EAEzB,GAAIV,IAAaF,EAAmB,CAClC,IAAMmB,EFiBI,SAAUrC,EAAMsC,EAAQrC,EAASC,EAASC,EAAQC,GAYpE,GATAD,EAASA,GAAU,EACnBC,EAAOA,GAAQ,EAEfJ,EAAOR,EAAkBQ,GACzBsC,EAAS9C,EAAkB8C,GAC3BrC,EAAUT,EAAkBS,GAC5BC,EAAUV,EAAkBU,GAC5BC,EAASX,EAAkBW,GAC3BC,EAAOZ,EAAkBY,GACrBZ,EAAiBQ,EAAMsC,EAAQrC,EAASC,EAASC,EAAQC,GAC3D,OAAO3C,EAAMJ,MAIf,IAAIjB,EAAU2D,EAAIC,EAAMC,EAASC,EAASC,EAAQC,GAmBlD,OAfe,IAAXkC,EACW,IAATlC,EACS,GAECF,EAGD,IAATE,EACSI,EAAGR,EAAMsC,EAAS,EAAGlG,EAAS8D,EAAS,GAAK9D,EAE5CoE,EAAGR,EAAMsC,EAAS,EAAGlG,EAAS8D,EAAS,IAKpCF,EErDYuC,CACpBR,EACArF,EACAoF,EACAT,EAASG,GAGLgB,EAAeJ,EACjBH,EACA3B,KAAKmC,MACHnC,KAAKoC,IAAIV,GAAe1B,KAAKoC,IAAIL,GAAiBF,GAKlD/F,EAAWgG,EAEb9B,KAAKmC,MACHR,EAAqBR,EAAanB,KAAKoC,IAAIL,IAF7C/B,KAAKmC,MAAMnC,KAAKoC,IAAIV,IAKlB3F,EAAY+F,EAAS,EAAIH,EAAqBO,EAGpD,OAFAP,EAAqB5F,EAEd,CACL6F,YAAaF,EACb5F,UACAuG,aAAcrC,KAAKmC,MAAMnC,KAAKoC,IAAIL,IAClCF,OACAK,eACAnG,aAGF,IAAMgG,EAAgBJ,EAAqBF,EACrCS,EAAelC,KAAKmC,OACvBpB,EAASG,GAAoBM,GAE1BzF,EAAY+F,EAAS,EAAIH,EAAqBO,EAC9CI,EAAWJ,EAAeH,EAAgBF,EAGhD,OAFAF,EAAqB5F,EAEd,CACL6F,aAAcU,EACdD,aAAcrC,KAAKmC,MAAMJ,GACzBjG,QAASkE,KAAKmC,MAAMG,GACpBT,OACAK,aAAcA,EACdnG,gBAOJwG,EFEW,SAAUC,EAAQC,GAOnC,GAJAA,EAAQA,GAAS,EAEjBD,EAAStD,EAAuBA,EAAcsD,IAC9CC,EAAQvD,EAAkBuD,GACtBvD,EAAiBsD,EAAQC,GAC3B,OAAOtF,EAAMJ,MA4Bf,IAxBA,IAAI2F,EAAY,SAAUF,EAAQG,EAAOjD,GAGvC,IAFA,IAAIkD,EAAIlD,EAAO,EACXX,EAASyD,EAAO,GACXvE,EAAI,EAAGA,EAAIuE,EAAOtE,OAAQD,IACjCc,GAAUyD,EAAOvE,GAAK+B,KAAKC,IAAI2C,GAAID,EAAM1E,GAAK0E,EAAM,IAAM,KAE5D,OAAO5D,GAIL8D,EAAiB,SAAUL,EAAQG,EAAOjD,GAG5C,IAFA,IAAIkD,EAAIlD,EAAO,EACXX,EAAS,EACJd,EAAI,EAAGA,EAAIuE,EAAOtE,OAAQD,IAAK,CACtC,IAAI6E,GAAQH,EAAM1E,GAAK0E,EAAM,IAAM,IACnC5D,GAAW+D,EAAON,EAAOvE,GAAM+B,KAAKC,IAAI2C,EAAGE,EAAO,GAEpD,OAAO/D,GAIL4D,EAAQ,GACRI,GAAW,EACXC,GAAW,EACN/E,EAAI,EAAGA,EAAIuE,EAAOtE,OAAQD,IACjC0E,EAAM1E,GAAW,IAANA,EAAU,EAAI0E,EAAM1E,EAAI,GAAK,IACpCuE,EAAOvE,GAAK,IACd8E,GAAW,GAETP,EAAOvE,GAAK,IACd+E,GAAW,GAKf,IAAKD,IAAaC,EAChB,OAAO7F,EAAMjC,IAKf,IAMI+H,EAASC,EAASC,EANlBC,EADJX,OAAkB7E,IAAV6E,EAAsB,GAAMA,EAQhCY,GAAW,EACf,GAEEJ,EACEG,GAFFD,EAAcT,EAAUF,EAAQG,EAAOS,IAEVP,EAAeL,EAAQG,EAAOS,GAC3DF,EAAUlD,KAAKoC,IAAIa,EAAUG,GAC7BA,EAAaH,EACbI,EAAWH,EAXA,OAWoBlD,KAAKoC,IAAIe,GAX7B,YAYJE,GAGT,OAAOD,EEzEqBE,CAC1B/H,EAASM,KAAI,qBAAG+F,gBAEZ2B,EAAMvD,KAAKC,IAAI,EAAIsC,EAAqBnB,GAA0B,EACxEE,QAAQC,IAAI,qBAAmBgC,GAC/B,IAAMC,EACJ1C,IAAaF,EACTc,EAAcF,EACdjG,EAAS+C,QACP,SAACmF,EAAKC,EAAMtH,GAAZ,OACEA,EAAQ,EAAIqH,EAAMzD,KAAKoC,IAAIsB,EAAK9B,aAAe,IACjD,GACEV,EAEV,MAAO,CACLyC,YAAa3D,KAAKmC,MAAMnC,KAAKoC,IAAIoB,IACjCI,eAAgB5D,KAAKmC,MAAMnC,KAAKoC,IAAIV,IACpCmC,sBAAuB7D,KAAKmC,MAAMqB,EAAahC,GAC/CsC,UAAW9D,KAAKmC,MAAMnC,KAAKoC,IAAIoB,IAAiBzC,EAChDxF,a,SC1NEwI,EAAgB,SAAC,GAAD,IAAGC,EAAH,EAAGA,SAAH,OACpB,cAAC,IAAD,CAAIpL,SAAU,CAAEqL,KAAM,KAAM3J,GAAI,MAAhC,SAAyC0J,KAM9BE,EAAuB,SAAC,GAa9B,IAIwBC,EAhB7B5I,EAYI,EAZJA,SAEA6I,GAUI,EAXJC,iBAWI,EAVJD,yBACAE,EASI,EATJA,kBACAC,EAQI,EARJA,UACAC,EAOI,EAPJA,kBACAhJ,EAMI,EANJA,eACA4F,EAKI,EALJA,uBACAqD,EAII,EAJJA,WACAC,EAGI,EAHJA,UACAC,EAEI,EAFJA,aACAlJ,EACI,EADJA,SAEMmJ,EAA8B,OAAbnJ,EAAoB,GAAK,IAC1CoJ,EAAmC,OAAbpJ,EAAoB,IAAM,IAChDqJ,EAAoC,OAAbrJ,EAAoB,IAAM,GAUjDsJ,EAR4B,MADLZ,EASiB/C,GAPnCqD,EAC8B,IAA5BN,EACFQ,EAC8B,IAA5BR,EACFO,OADF,EAMT,OACE,cAAC,IAAD,CACEM,UAAW,CAAEf,KAAM,SAAU3J,GAAI,WACjC2K,IAAK,CAAE,6BAA8B,SAFvC,SAIE,eAAC,IAAD,CAAOC,QAAQ,UAAUtM,SAAU,CAAEqL,KAAM,KAAM3J,GAAI,MAArD,UACE,cAAC,IAAD,UACE,eAAC,IAAD,WACE,cAAC,EAAD,UAAgByK,IAChB,cAAC,EAAD,UAAgBX,IAChB,cAAC,EAAD,UAAgBE,IAChB,cAAC,EAAD,UAAgBC,IAChB,cAAC,EAAD,UAAgBC,IAChB,cAAC,EAAD,UAAgBhJ,SAGpB,cAAC,IAAD,UACGD,EAASM,KAAI,SAAC6F,EAAatF,GAAd,OACZA,EAAQ,EACN,eAAC,IAAD,WACE,cAAC,IAAD,UAAKA,IACL,eAAC,IAAD,WACGnB,EAAeyG,EAAY5F,QAAS8I,GADvC,MAEGE,KAEH,eAAC,IAAD,WACG7J,EAAeyG,EAAYW,aAAcuC,GAD5C,MAEGE,KAEH,eAAC,IAAD,WACG7J,EAAeyG,EAAYG,KAAM+C,GADpC,MAEGE,KAEH,eAAC,IAAD,WACG7J,EAAeyG,EAAYQ,aAAc0C,GAD5C,MAEGE,KAEH,eAAC,IAAD,WACG7J,EAAeyG,EAAY3F,UAAW8I,GADzC,MAEGC,QAGH,gB,0BC9EVb,GCAakB,YAAOC,K,ODAb,CACXC,QAAS,cACT/L,MAAO,OACPgM,UAAW,KACXC,eAAgB,SAChBC,WAAY,SACZpO,WAAY,SACZwB,SAAU,KACV6M,UAAW,SACXC,SAAU,IACVC,SAAU,IACVC,WAAY,MACZnO,aAAc,EACdG,OAAQ,CACNiO,eAAgB,UAaPC,GATA,2BACR7B,GADQ,IAEXnK,GAAI,aACJiM,WAAY,uBACZnO,OAAQ,CACNkC,GAAI,gBAIc,2BACjBmK,GADiB,IAEpBnK,GAAI,cACJnC,UAAW,wBAEXC,OAAQ,CACND,UAAW,4B,GAIQ,2BAClBmO,GADkB,IAErBpO,YAAa,QACbC,UAAW,wBACXC,OAAQ,CACND,UAAW,yBAEbI,MAAO,UAGe,2BACnBkM,GADmB,IAEtBnK,GAAI,QACJ/B,MAAO,QACPH,OAAQ,CACNkC,GAAI,aAIiB,2BACpBmK,GADoB,IAEvBnK,GAAI,QACJ/B,MAAO,QACPH,OAAQ,CACNkC,GAAI,c,QE9DKkM,EAAY,SAACC,GAAD,OACvB,cAAC,IAAD,yBAAMxJ,KAAK,QAAWwJ,GAAtB,aACE,sBACEC,EAAE,iCACFC,OAAO,eACPC,YAAY,IACZC,iBAAiB,KACjBC,cAAc,QACdC,eAAe,cCRRC,GAAY,SAACP,GAAD,OACvB,cAAC,IAAD,yBAAMxJ,KAAK,QAAWwJ,GAAtB,aACE,sBACEC,EAAE,6BACFC,OAAO,eACPC,YAAY,IACZC,iBAAiB,KACjBC,cAAc,QACdC,eAAe,cCRRE,GAAY,SAACR,GAAD,OACvB,eAAC,IAAD,yBAAMxJ,KAAK,gBAAmBwJ,GAA9B,cACE,oBAAGS,SAAS,cAAZ,UACE,sBAAMpN,MAAM,KAAKC,OAAO,KAAKkD,KAAK,UAClC,sBACEyJ,EAAE,mCACFC,OAAO,QACPC,YAAY,IACZC,iBAAiB,KACjBC,cAAc,QACdC,eAAe,UAEjB,sBACEL,EAAE,mCACFC,OAAO,QACPC,YAAY,IACZC,iBAAiB,KACjBC,cAAc,QACdC,eAAe,aAGnB,+BACE,0BAAUI,GAAG,QAAb,SACE,sBAAMrN,MAAM,KAAKC,OAAO,KAAKkD,KAAK,mBCvB7BmK,GAAe,SAACX,GAAD,OAC1B,eAAC,IAAD,yBAAMxJ,KAAK,QAAWwJ,GAAtB,cACE,sBACEC,EAAE,qBACFC,OAAO,eACPC,YAAY,IACZC,iBAAiB,KACjBC,cAAc,QACdC,eAAe,UAEjB,sBACEL,EAAE,mDACFC,OAAO,eACPC,YAAY,IACZC,iBAAiB,KACjBC,cAAc,QACdC,eAAe,UAEjB,sBACEL,EAAE,oGACFC,OAAO,eACPC,YAAY,IACZC,iBAAiB,KACjBC,cAAc,QACdC,eAAe,eCxBRM,GAAe,SAACZ,GAAD,OAC1B,eAAC,IAAD,yBAAMxJ,KAAK,QAAWwJ,GAAtB,cACE,wBAAQa,GAAG,KAAKC,GAAG,KAAKnE,EAAE,OAAOuD,OAAO,iBACxC,sBACEa,SAAS,UACTC,SAAS,UACTf,EAAE,kmCACFzJ,KAAK,sBCPEyK,GAAgB,SAACjB,GAAD,OAC3B,eAAC,IAAD,2BAAUA,GAAV,cACE,sBACEC,EAAE,UACFC,OAAO,eACPC,YAAY,IACZC,iBAAiB,KACjBC,cAAc,QACdC,eAAe,UAEjB,sBACEL,EAAE,gBACFC,OAAO,eACPC,YAAY,IACZC,iBAAiB,KACjBC,cAAc,QACdC,eAAe,UAEjB,sBACEL,EAAE,WACFC,OAAO,eACPC,YAAY,IACZC,iBAAiB,KACjBC,cAAc,QACdC,eAAe,eCxBRY,GAAW,SAAClB,GAAD,OACtB,eAAC,IAAD,yBAAMxJ,KAAK,QAAWwJ,GAAtB,cACE,sBACEC,EAAE,iCACFC,OAAO,eACPC,YAAY,IACZC,iBAAiB,KACjBC,cAAc,QACdC,eAAe,UAEjB,sBACEL,EAAE,yHACFC,OAAO,eACPC,YAAY,IACZC,iBAAiB,KACjBC,cAAc,QACdC,eAAe,eChBRa,GAAW,SAACnB,GAAD,OACtB,eAAC,IAAD,yBAAMxJ,KAAK,QAAWwJ,GAAtB,cACE,sBACEC,EAAE,gHACFC,OAAO,eACPC,YAAY,IACZC,iBAAiB,KACjBC,cAAc,QACdC,eAAe,UAEjB,sBACEL,EAAE,idACFzJ,KAAK,sBCZE4K,GAAgB,SAACpB,GAAD,OAC3B,eAAC,IAAD,2BAAUA,GAAV,IAAiBxJ,KAAK,OAAtB,UACE,wBAAQqK,GAAG,KAAKC,GAAG,KAAKnE,EAAE,OAAOuD,OAAO,iBACxC,sBACEa,SAAS,UACTC,SAAS,UACTf,EAAE,+lEACFzJ,KAAK,sBCPE6K,GAAe,SAACrB,GAAD,OAC1B,eAAC,IAAD,2BAAUA,GAAV,IAAiBxJ,KAAK,OAAtB,UACE,sBACEuK,SAAS,UACTC,SAAS,UACTf,EAAE,iOACFzJ,KAAK,iBAGP,sBACEuK,SAAS,UACTC,SAAS,UACTf,EAAE,m6CACFzJ,KAAK,sBCbE8K,GAAY,SAACtB,GAAD,OACvB,eAAC,IAAD,yBAAMxJ,KAAK,QAAWwJ,GAAtB,cACE,sBACEC,EAAE,gMACFC,OAAO,eACPC,YAAY,IACZC,iBAAiB,KACjBC,cAAc,QACdC,eAAe,UAEjB,sBACEL,EAAE,uDACFC,OAAO,eACPC,YAAY,IACZC,iBAAiB,KACjBC,cAAc,QACdC,eAAe,UAEjB,sBACEL,EAAE,wDACFC,OAAO,eACPC,YAAY,IACZC,iBAAiB,KACjBC,cAAc,QACdC,eAAe,eCxBRiB,GAAe,SAACvB,GAAD,OAC1B,eAAC,IAAD,yBAAMwB,QAAQ,YAAYhL,KAAK,QAAWwJ,GAA1C,cACE,sBACEC,EAAE,ghCACFzJ,KAAK,iBAEP,sBACEyJ,EAAE,gHACFC,OAAO,eACPC,YAAY,IACZC,iBAAiB,KACjBC,cAAc,QACdC,eAAe,eCZRmB,GAAa,SAACzB,GAAD,OACxB,eAAC,IAAD,yBAAMwB,QAAQ,aAAgBxB,GAA9B,IAAqCxJ,KAAK,OAA1C,UACE,sBACEyJ,EAAE,gLACFC,OAAO,eACPC,YAAY,IACZC,iBAAiB,OAEnB,sBACEH,EAAE,8BACFC,OAAO,eACPC,YAAY,IACZC,iBAAiB,KACjBC,cAAc,QACdC,eAAe,eCdRoB,GAAW,SAAC1B,GAAD,OACtB,eAAC,IAAD,2BAAUA,GAAV,IAAiBxJ,KAAK,OAAtB,UACE,sBACEyJ,EAAE,WACFC,OAAO,eACPC,YAAY,IACZC,iBAAiB,KACjBC,cAAc,QACdC,eAAe,UAEjB,sBACEL,EAAE,gBACFC,OAAO,eACPC,YAAY,IACZC,iBAAiB,KACjBC,cAAc,QACdC,eAAe,eChBRqB,GAAY,SAAC3B,GAAD,OACvB,cAAC,IAAD,2BAAUA,GAAV,IAAiBxJ,KAAK,OAAtB,SACE,sBACEyJ,EAAE,WACFC,OAAO,eACPC,YAAY,IACZC,iBAAiB,KACjBC,cAAc,QACdC,eAAe,cCRRsB,GAAc,SAAC5B,GAAD,OACzB,eAAC,IAAD,yBAAMwB,QAAQ,aAAgBxB,GAA9B,IAAqCxJ,KAAK,OAA1C,UACE,wBAAQqK,GAAG,KAAKC,GAAG,KAAKnE,EAAE,OAAOuD,OAAO,iBACxC,sBACED,EAAE,q5CACFzJ,KAAK,sBCLEqL,GAAa,SAAC7B,GAAD,OACxB,eAAC,IAAD,yBAAMwB,QAAQ,YAAYhL,KAAK,QAAWwJ,GAA1C,cACE,sBACEC,EAAE,2BACFC,OAAO,eACPC,YAAY,IACZC,iBAAiB,KACjBC,cAAc,QACdC,eAAe,UAEjB,sBACEL,EAAE,mDACFC,OAAO,eACPC,YAAY,IACZC,iBAAiB,KACjBC,cAAc,QACdC,eAAe,UAEjB,sBACEL,EAAE,oGACFC,OAAO,eACPC,YAAY,IACZC,iBAAiB,KACjBC,cAAc,QACdC,eAAe,eCxBRwB,GAAW,SAAC9B,GAAD,OACtB,eAAC,IAAD,yBAAMwB,QAAQ,YAAYhL,KAAK,QAAWwJ,GAA1C,cACE,sBACEC,EAAE,yGACFC,OAAO,eACPC,YAAY,IACZC,iBAAiB,KACjBC,cAAc,QACdC,eAAe,UAEjB,sBACEL,EAAE,iHACFC,OAAO,eACPC,YAAY,IACZC,iBAAiB,KACjBC,cAAc,QACdC,eAAe,UAEjB,sBACEL,EAAE,iHACFC,OAAO,eACPC,YAAY,IACZC,iBAAiB,KACjBC,cAAc,QACdC,eAAe,UAEjB,sBACEL,EAAE,wGACFC,OAAO,eACPC,YAAY,IACZC,iBAAiB,KACjBC,cAAc,QACdC,eAAe,eChCRyB,GAAc,SAAC/B,GAAD,OACzB,eAAC,IAAD,yBAAMwB,QAAQ,YAAYhL,KAAK,QAAWwJ,GAA1C,cACE,wBAAQa,GAAG,KAAKC,GAAG,KAAKnE,EAAE,OAAOuD,OAAO,iBACxC,sBACED,EAAE,8OACFzJ,KAAK,iBAEP,sBACEuK,SAAS,UACTC,SAAS,UACTf,EAAE,4DACFzJ,KAAK,iBCXEwL,GAAe,SAAChC,GAAD,OAC1B,eAAC,IAAD,2BAAUA,GAAV,IAAiBxJ,KAAK,OAAtB,UACE,wBAAQqK,GAAG,KAAKC,GAAG,KAAKnE,EAAE,KAAKuD,OAAO,eAAeC,YAAY,MACjE,sBAAMF,EAAE,aAAaC,OAAO,eAAeC,YAAY,W,mBCiF9C8B,GAAO,SAAC,GAA8B,IAA5BC,EAA2B,EAA3BA,KAAMC,EAAqB,EAArBA,KAASnC,EAAY,kBAC1CoC,EAjBQ,SAACD,GACf,OAAQA,GACN,IAAK,KACH,OAAO,EACT,IAAK,KACH,OAAO,EAMT,QACE,OAAO,EAJT,IAAK,KACH,OAAO,GAQME,CAAQF,GAEnBG,EAAS,2BACVtC,GADU,IAEb3M,MAAO+O,EACP9O,OAAQ8O,EACRZ,QAAS,cAGLe,EAxEQ,SAACL,GACf,OAAQA,GACN,IAAK,QACH,OAAOnC,EACT,IAAK,YACH,OAAOkB,GACT,IAAK,WACH,OAAON,GACT,IAAK,SACH,OAAOkB,GACT,IAAK,QACH,OAAOP,GACT,IAAK,OACH,OAAOH,GACT,IAAK,WACH,OAAOI,GACT,IAAK,QACH,OAAOf,GACT,IAAK,OACH,OAAOU,GACT,IAAK,QACH,OAAOX,GACT,IAAK,OACH,OAAOuB,GACT,IAAK,WACH,OAAOlB,GACT,IAAK,WACH,OAAOS,GACT,IAAK,UACH,OAAOU,GACT,IAAK,YACH,OAAOX,GACT,IAAK,UACH,OAAOQ,GACT,IAAK,OACH,OAAOF,GACT,IAAK,QACH,OAAOC,GACT,IAAK,SACH,OAAOF,GAET,QACE,OAAOO,IA8BWQ,CAAQN,GAE9B,OAAO,cAACK,EAAD,eAAmBD,K,oBCnGb,IACbG,GAAI,CACF9P,SAAU,CAAEqL,KAAM,MAAO3J,GAAI,OAC7BsL,WAAY,CAAE3B,KAAM,QAAS3J,GAAI,WACjClD,WAAY,CAAE6M,KAAM,QAAS3J,GAAI,UAEnCqO,GAAI,CACF/P,SAAU,CAAEqL,KAAM,MAAO3J,GAAI,OAC7BsL,WAAY,CAAE3B,KAAM,SACpB7M,WAAY,CAAE6M,KAAM,QAAS3J,GAAI,UAEnCsO,GAAI,CACFhQ,SAAU,CAAEqL,KAAM,KAAM3J,GAAI,OAC5BsL,WAAY,CAAE3B,KAAM,SACpB7M,WAAY,CAAE6M,KAAM,QAAS3J,GAAI,UAEnCuO,GAAI,CACFjQ,SAAU,CAAEqL,KAAM,KAAM3J,GAAI,MAC5BsL,WAAY,CAAE3B,KAAM,SACpB7M,WAAY,CAAE6M,KAAM,OAAQ3J,GAAI,UAElCwO,GAAI,CACFlQ,SAAU,CAAEqL,KAAM,KAAM3J,GAAI,MAC5BsL,WAAY,CAAE3B,KAAM,SACpB7M,WAAY,CAAE6M,KAAM,SAEtB8E,GAAI,CACFnQ,SAAU,CAAEqL,KAAM,KAAM3J,GAAI,MAC5BsL,WAAY,CAAE3B,KAAM,SACpB7M,WAAY,CAAE6M,KAAM,U,uBCxBX/M,GAAU,SAAC,GAAsC,IAApC8M,EAAmC,EAAnCA,SAAmC,IAAzBoE,YAAyB,MAAlB,EAAkB,EAAZnC,EAAY,kBACrD+C,EAAiBC,aAAmBb,GACpCc,EAAwB,kBAATd,EAAoBY,EAAiBZ,EAC1D,OACE,cAAC,KAAD,uCAAUzO,GAAO,IAAMuP,IAAYjD,GAAnC,aACGjC,MCqBDmF,GAAc,SAAC,GAAiB,IAAfC,EAAc,EAAdA,QACvB,EAAsCC,oBAAS,GAA/C,mBAAOC,EAAP,KAAoBC,EAApB,KAEE,OACA,eAAC,IAAD,CAAKC,SAAS,WAAWlQ,MAAM,IAAIC,OAAO,IAA1C,UACE,cAAC,GAAD,CAAM4O,KAAK,OAAOC,KAAK,KAAK/C,QAAQ,UACpC,cAAC,IAAD,CAASoE,UAAQ,EAACC,UAAU,MAAMnN,MAAO,cAAC,IAAD,CAAKoN,WAAW,WAAhB,SAA4BP,IAAgBQ,OAAQN,EAA7F,SACE,cAAC,IAAD,CAAKhQ,MAAM,IAAIC,OAAO,IAAIiQ,SAAS,WAAWK,IAAI,IAAIC,aAAc,kBAAMP,GAAe,IAC/EQ,aAAc,kBAAMR,GAAe,IACnCS,QAAS,kBAAMT,GAAe,YAQxCU,GAAmB,SAAC,GAAD,IAAG1N,EAAH,EAAGA,MAAO6M,EAAV,EAAUA,QAAV,OAEvB,eAAC,IAAD,CAAK/D,QAAQ,OAAOG,WAAW,SAASvL,aAAa,IAArD,UACE,eAAC,IAAD,CAAWA,aAAa,IAAxB,UAA6BsC,EAA7B,OACA,cAAC,GAAD,CAAmB6M,gBAUVc,GAA8B,SAAC,GA8CtC,EA7CJC,MA6CK,IA5CL1O,EA4CI,EA5CJA,SA4CI,IA3CJ2O,yBA2CI,MA3CgB,IA2ChB,MA1CJC,iBAAkBC,OA0Cd,MA1CkC,GA0ClC,MAzCJC,2BAyCI,MAzCkB,KAyClB,MAxCJC,qCAwCI,MAxC4B,GAwC5B,MAvCJC,uBAuCI,MAvCc,IAuCd,MAtCJC,uBAsCI,MAtCc,MAsCd,MArCJxJ,wBAqCI,MArCe,EAqCf,EAjCJyJ,GAiCI,EApCJC,QAoCI,EAnCJC,cAmCI,EAlCJC,gBAkCI,EAjCJH,iBACAI,EAgCI,EAhCJA,kBACAC,EA+BI,EA/BJA,eACAC,EA8BI,EA9BJA,iBAGAC,GA2BI,EA7BJC,oBA6BI,EA5BJC,sBA4BI,EA3BJF,mBACAG,EA0BI,EA1BJA,oBACAC,EAyBI,EAzBJA,gBACAC,EAwBI,EAxBJA,kBAGAlH,GAqBI,EAvBJmH,sBAuBI,EAtBJC,wBAsBI,EArBJpH,kBACAD,EAoBI,EApBJA,wBACAE,EAmBI,EAnBJA,kBACAC,EAkBI,EAlBJA,UACAC,EAiBI,EAjBJA,kBACAhJ,EAgBI,EAhBJA,eACAkQ,EAeI,EAfJA,kBACAC,EAcI,EAdJA,WACAC,EAaI,EAbJA,eACAC,EAYI,EAZJA,iBAMAC,GAMI,EAXJC,qBAWI,EAVJC,qBAUI,EATJC,QASI,EARJC,UAQI,EAPJC,OAOI,EANJL,kBAEArH,GAII,EALJ2H,gBAKI,EAJJ3H,YACAC,EAGI,EAHJA,UACAC,GAEI,EAFJA,aAEI,KADJ0H,0BACI,OAD8B,OAAb5Q,EAAoB,GAAkB,OAAbA,EAAoB,GAAkB,OAAbA,EAAoB,EAAI,KAC3F,GACEqJ,GAAoC,OAAbrJ,EAAoB,IAAM,GACjD6Q,GAA+B,OAAb7Q,EAAoB,IAAM,IAC5C8Q,GAAqB,SAACxP,GAC1B,IACMyP,EADSnQ,OAAOU,GACE1B,QAAQ,OAAQ,IAGxC,OAAOJ,EADQuR,EACeF,KAEhC,GAAoCjD,mBAClCkD,GAAmBnC,IADrB,qBAAOqC,GAAP,MAAmBC,GAAnB,MAGA,GAAoCrD,mBAASiB,GAA7C,qBAAOqC,GAAP,MAAmBC,GAAnB,MACA,GAAoCvD,mBAASgD,IAA7C,qBAAOlL,GAAP,MAAmB0L,GAAnB,MACA,GAAiDxD,mBAASnI,GAA1D,qBAEM4L,IAFN,YAEoBC,iBAAO,OAC3B,GAA0C1D,oBAAS,GAAnD,qBAAO2D,GAAP,MACMC,IADN,M3B1HyC,SAAC,GAWrC,IAVL7C,EAUI,EAVJA,kBACAC,EASI,EATJA,iBACAE,EAQI,EARJA,oBAEA2C,GAMI,EAPJb,kBAOI,EANJa,yBACA1C,EAKI,EALJA,8BACA2C,EAII,EAJJA,gBACA1C,EAGI,EAHJA,gBACAC,EAEI,EAFJA,gBACA0C,EACI,EADJA,QAEMC,EAAmBlN,EAAuBiN,GAChD,EAAgC/D,mBAAS8D,GAAzC,mBAAOrM,EAAP,KAAiBwM,EAAjB,KACA,EAA4BjE,mBAASe,GAArC,mBAAOrJ,EAAP,KAAewM,EAAf,KACA,EAA4BlE,mBAASgB,GAArC,mBAAOrJ,EAAP,KAAewM,EAAf,KACA,EAAwCnE,mBAASkB,GAAjD,mBAAOtJ,EAAP,KAAqBwM,EAArB,KACA,EAAoCpE,mBAASgE,EAAiB,GAAG7M,YAAjE,mBAAOW,EAAP,KAAmB0L,EAAnB,KAGA,EAAgDxD,mBAC9C6D,GADF,mBAAOhM,EAAP,KAAyBwM,EAAzB,KAIA,EAA4DrE,mBAC1DmB,GADF,mBAAOpJ,EAAP,KAA+BuM,EAA/B,KAGA,EAA0CtE,mBAAS,GAAnD,mBAAOuE,EAAP,KAAsBC,EAAtB,KACA,EAA0CxE,mBAAS,GAAnD,mBAAOyE,EAAP,KAAsBC,EAAtB,KACA,EAA0C1E,mBAAS,GAAnD,mBAAO2E,EAAP,KAAsBC,EAAtB,KAoDA,OAjDAC,qBAAU,WACRL,EAAiBR,EAAiB,GAAGhN,MACrC0N,EAAiBV,EAAiBA,EAAiBnP,OAAS,GAAGoC,MAC9D,CAAC+M,IAGJa,qBAAU,WACR,IAAMC,EAAOd,EAAiBe,QAC5B,SAACD,GAAD,OAAUpN,GAAUoN,EAAK9N,MAAQU,GAAUoN,EAAK7N,MAChD,GAEE6N,IACFF,EAAiBE,EAAK5N,WAElBS,EAASmN,EAAK5N,WAChBiN,EAAUW,EAAK5N,YAIG,IAAlBuN,GAAyC,IAAlBF,IACrB7M,EAAS+M,EACXP,EAAUO,GACD/M,EAAS6M,GAClBL,EAAUK,MAGb,CAAC7M,EAAQsM,IAEZa,qBAAU,WACc,IAAlBF,IACEhN,EAASgN,GACXR,EAAUQ,GACV1M,QAAQC,IAAI,8BAAgCyM,IACnChN,EAnCM,IAoCfM,QAAQC,IAAI,6BAA+ByM,GAC3CR,EArCe,KAwCnBlM,QAAQC,IAAIP,KACX,CAACA,IAEJkN,qBAAU,WACJjN,EAAeyJ,EACjB+C,EAAgB/C,GACPzJ,EAAewJ,GACxBgD,EAAgBhD,KAEjB,CAACxJ,IAEG,CACLH,WACAwM,cACAvM,SACAwM,YACAc,MAAOrN,EACPsN,SAAUd,EACVvM,eACAwM,kBACAtM,aACA0L,gBACA3L,mBACAwM,sBACAtM,yBACAuM,4BACAC,gBACAE,gBACAS,aApEmB,EAqEnBC,aAAcR,G2BwBOS,CAA4B,CACjDtB,gBAAiBvM,EACjBwJ,oBACAC,iBAAkBC,EAClBC,sBACA8B,qBACAa,wBAAyBhM,EACzBsJ,gCACAC,kBACAC,kBAEA0C,QAAS3R,EAASiT,iBAGdC,GAAiB9N,EAAkB,CACvCC,SAAUmM,GAAenM,SACzBC,OAAQkM,GAAelM,OACvBC,OAAQiM,GAAeoB,MACvBpN,aAAcgM,GAAehM,aAC7BC,iBAAkB+L,GAAe/L,iBACjCC,WAAY8L,GAAe9L,WAC3BC,uBAAwB6L,GAAe7L,yBAKzC,OACE,qCACE,eAAC,IAAD,CACE9H,MAAM,OACNsV,gBAAgB,kBAChBC,IAAK,CAAE5K,KAAM,EAAG3J,GAAI,GAHtB,UAKE,cAAC,IAAD,CAAUwU,QAAS,CAAE7K,KAAM,GAAI3J,GAAI,IAAnC,SACE,cAAC,IAAD,CAAayU,aAAc9B,GAAenM,SAA1C,SACE,cAAC,IAAD,CACE/D,MAAOkQ,GAAenM,SACtBkO,SAAU,SAACC,GAAD,OAAOhC,GAAeK,YAAY2B,IAF9C,SAIE,cAAC,IAAD,CAAOC,QAAS,EAAGC,UAAU,MAA7B,SACE,cAAC,IAAD,CAAOpS,MAAO6D,EAAd,SAAkCkL,YAK1C,cAAC,IAAD,CAAUgD,QAAS,CAAE7K,KAAM,GAAI3J,GAAI,GAAnC,SACE,eAAC,IAAD,CAAaqM,GAAG,aAAa6C,SAAS,WAAtC,UACE,cAAC,GAAD,CACEjN,MAAOoO,EACPvB,QAAS2B,IAEX,eAAC,IAAD,CAAKvB,SAAS,WAAd,UACE,cAAC,IAAD,CACE1J,KAAK,OACLiP,aAAc9B,GAAelM,OAC7BhE,MAAO0P,GACPuC,SAAU,SAACC,GAAD,OACRvC,GAAcH,GAAmB0C,EAAEG,cAAcrS,SAEnDsS,OAAQ,SAACJ,GAAD,OACNhC,GAAeM,UACbvQ,OAAOiS,EAAEG,cAAcrS,MAAM1B,QAAQ,OAAQ,OAGjDoK,UAAU,QACV6J,aAA2B,OAAb7T,EAAoB,IAAM,MAE1C,eAAC,IAAD,CACElC,OAAO,OACPiQ,SAAS,WACT+F,MAAM,IACN1F,IAAI,IACJxE,QAAQ,OACRG,WAAW,SACXgK,YAAY,IAPd,eASK1K,cAKX,cAAC,IAAD,CAAUgK,QAAS,CAAE7K,KAAM,GAAI3J,GAAI,GAAnC,SACE,cAAC,IAAD,CAAYmV,QAAS,EAAGP,QAAS,EAAjC,SACE,eAAC,IAAD,CAAavI,GAAG,YAAhB,UACE,cAAC,GAAD,CACEpK,MAAOyO,EACP5B,QAAS6B,IAEX,eAAC,IAAD,CAAKzB,SAAS,WAAd,UACE,cAAC,IAAD,CACE1J,KAAK,OACLiP,aAAc9B,GAAeoB,MAC7BtR,MAAO4P,GACPqC,SAAU,SAACC,GAAD,OACRrC,GAAcL,GAAmB0C,EAAEG,cAAcrS,SAEnDsS,OAAQ,SAACJ,GAAD,OACNhC,GAAeqB,SACuC,EAApDtR,OAAOiS,EAAEG,cAAcrS,MAAM1B,QAAQ,OAAQ,OAGjDoK,UAAU,QACV6J,aAAa,OAEf,cAAC,IAAD,CACE/V,OAAO,OACPiQ,SAAS,WACT+F,MAAM,IACN1F,IAAI,IACJxE,QAAQ,OACRG,WAAW,SACXgK,YAAY,IAPd,SASgB,OAAb/T,EAAoB,OAAS,qBAwBxC,cAAC,IAAD,CAAUqT,QAAS,CAAE7K,KAAM,GAAI3J,GAAI,GAAnC,SACE,eAAC,IAAD,CAAaqM,GAAG,eAAhB,UACE,cAAC,GAAD,CACEpK,MAAO2O,EACP9B,QAASiC,IAEX,eAAC,IAAD,CAAK7B,SAAS,WAAd,UACE,cAAC,IAAD,CACE1J,KAAK,SACLiP,aAAc9B,GAAehM,aAC7BoO,OAAQ,SAACJ,GAAD,OACNhC,GAAeQ,gBAAgBzQ,OAAOiS,EAAEG,cAAcrS,SAExD0I,UAAU,QACV6J,aAAa,MAEf,cAAC,IAAD,CACE/V,OAAO,OACPiQ,SAAS,WACT+F,MAAM,IACN1F,IAAI,IACJxE,QAAQ,OACRG,WAAW,SACXgK,YAAY,IAPd,uBAcQ,OAAb/T,EACC,cAAC,IAAD,CAAUqT,QAAS,CAAE7K,KAAM,GAAI3J,GAAI,GAAnC,SACE,eAAC,IAAD,CAAaqM,GAAG,aAAhB,UACE,cAAC,GAAD,CACEpK,MAAO+O,EACPlC,QAASmC,IAEX,eAAC,IAAD,CAAK/B,SAAS,WAAd,UACE,cAAC,IAAD,CACE1J,KAAK,OACLiP,aAAc9B,GAAe9L,WAC7BpE,MAAOoE,GACP6N,SAAU,SAACC,GAAD,OACRpC,GAAcN,GAAmB0C,EAAEG,cAAcrS,SAEnDsS,OAAQ,SAACJ,GAAD,OACNhC,GAAeJ,cACb7P,OAAOiS,EAAEG,cAAcrS,MAAM1B,QAAQ,OAAQ,OAGjDoK,UAAU,QACV6J,aAAa,MAEf,eAAC,IAAD,CACE/V,OAAO,OACPiQ,SAAS,WACT+F,MAAM,IACN1F,IAAI,IACJxE,QAAQ,OACRG,WAAW,SACXgK,YAAY,IAPd,eASK1K,cAMX,GAsCF,cAAC,IAAD,CAAUgK,QAAS,GAAnB,SACE,eAAC,GAAD,CAASY,GAAG,KAAKtH,KAAK,IAAIpO,UAAW,CAAEiK,KAAM,EAAG3J,GAAI,GAApD,UACGoR,EADH,SAIF,eAAC,IAAD,CAAUoD,QAAS,CAAE7K,KAAM,GAAI3J,GAAI,GAAnC,UACE,eAAC,GAAD,CAASoV,GAAG,IAAZ,UAAiB/D,EAAjB,OACA,eAAC,GAAD,CACE+D,GAAG,OACHtH,KAAM,CAAEnE,KAAM,EAAG3J,GAAI,GACrBqV,QAAS,CAAE1L,KAAM,EAAG3J,GAAI,GAH1B,UAOGW,EACC0T,GAAe9K,qBACfyI,IACC,IAVL,KAYgB,OAAb7Q,GAAqB,UAG1B,eAAC,IAAD,CAAUqT,QAAS,CAAE7K,KAAM,GAAI3J,GAAI,GAAnC,UACE,eAAC,GAAD,CAASoV,GAAG,IAAZ,UAAiBpL,EAAjB,OACA,eAAC,GAAD,CACEoL,GAAG,OACHtH,KAAM,CAAEnE,KAAM,EAAG3J,GAAI,GACrBqV,QAAS,CAAE1L,KAAM,EAAG3J,GAAI,GAH1B,UAKGW,EAAe0T,GAAe7K,UAAWwI,IAL5C,MAMgB,OAAb7Q,GAAqB,UAI1B,eAAC,IAAD,CAAUqT,QAAS,CAAE7K,KAAM,GAAI3J,GAAI,GAAnC,UACE,eAAC,GAAD,CAASoV,GAAG,IAAZ,UAAiB9D,EAAjB,OACA,eAAC,GAAD,CACE8D,GAAG,OACHtH,KAAM,CAAEnE,KAAM,EAAG3J,GAAI,GACrBqV,QAAS,CAAE1L,KAAM,EAAG3J,GAAI,GAH1B,UAKGW,EAAe0T,GAAehL,YAAa2I,IAL9C,MAMgB,OAAb7Q,GAAqB,aAI5B,cAAC,IAAD,CACEiK,SAAS,KACTL,QAAQ,OACRE,eAAe,SACfhI,IAAKuP,KAqBNE,IACC,qCACE,cAAC,GAAD,CAAS0C,GAAG,KAAKtH,KAAK,IAAInO,aAAa,IAAvC,SACG4R,IAEH,cAAC,EAAD,CACEpQ,SAAUA,EACVF,SAAUoT,GAAepT,SACnBC,mBAER,cAAC,EAAD,CACED,SAAUoT,GAAepT,SACzB6F,uBAAwB6L,GAAe7L,uBAErCiD,mBACAD,0BACAE,oBACAC,YACAC,oBACAhJ,iBACAiJ,aACAC,YACAC,gBACA2H,mBACA7Q,oB,UC1aCmU,OAjCf,WAEE,IAAMC,EAAcC,OAAOC,0BAA4B,KAmBjDC,EAjBmB,WAEvB,IAAMC,EAAOC,IAAgB,GAEzBC,EAAS,GACb,IAAI,IAAMC,KAAOH,EACXA,EAAKI,eAAeD,KACtBD,EAAM,2BACDA,GADC,kBAEHC,EAAMH,EAAKG,GAAKP,MAKvB,OAAOM,EAGaG,GAEtB,OACE,cAAC,IAAD,CAAgB7W,MAAOA,EAAO8W,UAAUC,EAAxC,SACE,cAAC,GAAD,2BACMR,GADN,IAEEvU,SAAUoU,QC7BlBY,IAASC,OACP,cAAC,IAAMC,WAAP,UACE,cAAC,GAAD,MAEFC,SAASC,eAAe,qB","file":"static/js/main.9dcb3e9c.chunk.js","sourcesContent":["import { extendTheme } from \"@chakra-ui/react\";\r\n\r\nconst colors = {\r\n orange: {\r\n 100: \"#FEF9F2\",\r\n 400: \"#FF9F1A\",\r\n 500: \"#F28D00\",\r\n 600: \"#B36800\",\r\n },\r\n gray: {\r\n 50: \"#FAF9F8\",\r\n 500: \"#E0DED8\",\r\n 700: \"#696969\",\r\n },\r\n brand: {\r\n 500: \"orange.500\",\r\n },\r\n};\r\n\r\nconst fonts = {\r\n body: '\"akzidenz-grotesk\",\"Helvetica Neue\",Helvetica,Arial,sans-serif',\r\n heading: '\"akzidenz-grotesk\",\"Helvetica Neue\",Helvetica,Arial,sans-serif',\r\n};\r\n\r\nconst fontSizes = {\r\n sm: \"14px\",\r\n md: \"16px\",\r\n lg: \"20px\",\r\n xl: \"22px\",\r\n \"2xl\": \"25px\",\r\n \"3xl\": \"36px\",\r\n \"4xl\": \"54px\",\r\n};\r\n\r\nconst lineHeights = {\r\n shorter: 1.18,\r\n short: 1.35,\r\n tall: 1.65,\r\n};\r\n\r\nconst fontWeights = {\r\n light: 300,\r\n normal: 400,\r\n bold: 600,\r\n};\r\n\r\nconst shadows = {\r\n outline: \"0 0 0 3px rgba(242, 141, 0, 0.2)\",\r\n};\r\n\r\nconst styles = {\r\n global: {\r\n body: {\r\n height: \"100%\",\r\n bg: \"white\",\r\n },\r\n p: {\r\n marginTop: \"0.625rem\",\r\n marginBottom: \"0.625rem\",\r\n },\r\n },\r\n};\r\n\r\nconst components = {\r\n Heading: {\r\n baseStyle: {\r\n fontWeight: \"light\",\r\n },\r\n },\r\n Input: {\r\n variants: {\r\n outline: {\r\n field: {\r\n borderRadius: 0,\r\n borderColor: \"#000\",\r\n boxShadow: \"0 0 0 1px #000\",\r\n _hover: {\r\n borderColor: \"#000\",\r\n },\r\n _focus: {\r\n boxShadow: `0 0 0 1px ${colors.orange[\"500\"]}`,\r\n borderColor: \"orange.500\",\r\n },\r\n _placeholder: {\r\n color: \"gray.700\",\r\n },\r\n },\r\n },\r\n },\r\n },\r\n Select: {\r\n variants: {\r\n outline: {\r\n field: {\r\n borderRadius: 0,\r\n borderColor: \"#000\",\r\n boxShadow: \"0 0 0 1px #000\",\r\n _hover: {\r\n borderColor: \"#000\",\r\n },\r\n _focus: {\r\n boxShadow: `0 0 0 1px ${colors.orange[\"500\"]}`,\r\n borderColor: \"orange.500\",\r\n },\r\n _placeholder: {\r\n color: \"gray.700\",\r\n },\r\n },\r\n },\r\n },\r\n },\r\n Table: {\r\n variants: {\r\n striped: {\r\n tbody: {\r\n tr: {\r\n _odd: {\r\n td: {\r\n background: colors.gray[\"50\"],\r\n },\r\n },\r\n td: {\r\n background: \"white\",\r\n border: 0,\r\n },\r\n },\r\n },\r\n thead: {\r\n borderBottom: \"2px solid\",\r\n },\r\n th: {\r\n color: \"black\",\r\n fontWeight: \"normal\",\r\n fontSize: \"sm\",\r\n textTransform: \"none\",\r\n border: 0,\r\n },\r\n },\r\n },\r\n },\r\n Radio: {\r\n parts: [\"control\"],\r\n baseStyle: {\r\n control: {\r\n borderColor: \"black\",\r\n borderWidth: \"1px\",\r\n _checked: {\r\n borderWidth: \"2px\",\r\n borderColor: \"orange.500\",\r\n color: \"orange.500\",\r\n _hover: {\r\n borderColor: \"orange.500\",\r\n },\r\n },\r\n },\r\n },\r\n sizes: {\r\n md: {\r\n control: {\r\n _checked: {\r\n _before: {\r\n border: \"3px solid white\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n },\r\n },\r\n width: 6,\r\n height: 6,\r\n },\r\n },\r\n },\r\n },\r\n Textarea: {\r\n variants: {\r\n outline: {\r\n borderWidth: \"2px\",\r\n borderRadius: 0,\r\n borderColor: \"black\",\r\n _hover: {\r\n borderColor: \"black\",\r\n },\r\n _focus: {\r\n borderColor: \"black\",\r\n boxShadow: \"outline\",\r\n },\r\n },\r\n },\r\n },\r\n};\r\n\r\nexport const theme = extendTheme({\r\n colors,\r\n styles,\r\n components,\r\n fonts,\r\n fontSizes,\r\n lineHeights,\r\n fontWeights,\r\n shadows,\r\n});\r\n","export const formatCurrency = (num, separator = ' ') =>\r\n num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, separator); // 160 == Non-breakable space","import { Box } from \"@chakra-ui/layout\";\r\nimport PropTypes from \"prop-types\";\r\nimport { Line } from \"react-chartjs-2\";\r\nimport { theme } from \"../theme.config\";\r\nimport { formatCurrency } from \"../helpers/number.helpers\";\r\n\r\nexport const LoanCalculationChart = ({\r\n payments,\r\n remainingLabel,\r\n language,\r\n}) => {\r\n const actualPayments = [...payments].slice(1);\r\n\r\n const paymentsAsChartData = actualPayments.map((payment) => {\r\n return payment.remaining;\r\n });\r\n const paymentsAsLabels = actualPayments.map((_, index) => {\r\n return String(index + 1);\r\n });\r\n\r\n const settings = {\r\n data: {\r\n labels: paymentsAsLabels,\r\n datasets: [\r\n {\r\n label: remainingLabel,\r\n data: paymentsAsChartData,\r\n borderColor: theme.colors.orange[\"500\"],\r\n backgroundColor: theme.colors.orange[\"200\"],\r\n fill: true,\r\n },\r\n ],\r\n },\r\n options: {\r\n scales: {\r\n y: {\r\n ticks: {\r\n callback(value) {\r\n if (language === \"sv\") {\r\n return formatCurrency(value, \" \");\r\n }\r\n\r\n if (language === \"dk\") {\r\n return Number(value).toLocaleString(\"da\");\r\n }\r\n\r\n return Number(value).toLocaleString();\r\n },\r\n },\r\n },\r\n },\r\n },\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nLoanCalculationChart.propTypes = {\r\n payments: PropTypes.arrayOf({\r\n calcPayment: PropTypes.number,\r\n payment: PropTypes.number,\r\n interestCost: PropTypes.number,\r\n fees: PropTypes.number,\r\n amortization: PropTypes.number,\r\n remaining: PropTypes.number,\r\n }),\r\n remainingLabel: PropTypes.string,\r\n};\r\n","// Cherrypicked code from @formulajs/formulajs@2.6.5\r\n\r\nconst error = {\r\n nil: new Error('#NULL!'),\r\n div0: new Error('#DIV/0!'),\r\n value: new Error('#VALUE!'),\r\n ref: new Error('#REF!'),\r\n name: new Error('#NAME?'),\r\n num: new Error('#NUM!'),\r\n na: new Error('#N/A'),\r\n error: new Error('#ERROR!'),\r\n data: new Error('#GETTING_DATA'),\r\n};\r\n\r\nconst parseNumber = function (string) {\r\n if (string === undefined || string === '') {\r\n return error.value;\r\n }\r\n if (!isNaN(string)) {\r\n return parseFloat(string);\r\n }\r\n\r\n return error.value;\r\n};\r\n\r\nconst isFlat = function (array) {\r\n if (!array) {\r\n return false;\r\n }\r\n\r\n for (var i = 0; i < array.length; ++i) {\r\n if (Array.isArray(array[i])) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n};\r\n\r\nconst flattenShallow = function (array) {\r\n if (!array || !array.reduce) {\r\n return array;\r\n }\r\n\r\n return array.reduce(function (a, b) {\r\n var aIsArray = Array.isArray(a);\r\n var bIsArray = Array.isArray(b);\r\n\r\n if (aIsArray && bIsArray) {\r\n return a.concat(b);\r\n }\r\n if (aIsArray) {\r\n a.push(b);\r\n\r\n return a;\r\n }\r\n if (bIsArray) {\r\n return [a].concat(b);\r\n }\r\n\r\n return [a, b];\r\n });\r\n};\r\n\r\nconst parseNumberArray = function (arr) {\r\n var len;\r\n\r\n if (!arr || (len = arr.length) === 0) {\r\n return error.value;\r\n }\r\n\r\n var parsed;\r\n\r\n while (len--) {\r\n parsed = parseNumber(arr[len]);\r\n if (parsed === error.value) {\r\n return parsed;\r\n }\r\n arr[len] = parsed;\r\n }\r\n\r\n return arr;\r\n};\r\n\r\nconst arrayEach = function (array, iteratee) {\r\n var index = -1,\r\n length = array.length;\r\n\r\n while (++index < length) {\r\n if (iteratee(array[index], index, array) === false) {\r\n break;\r\n }\r\n }\r\n\r\n return array;\r\n};\r\n\r\nconst argsToArray = function (args) {\r\n var result = [];\r\n\r\n arrayEach(args, function (value) {\r\n result.push(value);\r\n });\r\n\r\n return result;\r\n};\r\n\r\nconst flatten = function () {\r\n var result = argsToArray.apply(null, arguments);\r\n\r\n while (!isFlat(result)) {\r\n result = flattenShallow(result);\r\n }\r\n\r\n return result;\r\n};\r\n\r\nconst anyIsError = function () {\r\n var n = arguments.length;\r\n while (n--) {\r\n if (arguments[n] instanceof Error) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n};\r\n\r\nconst utils = {\r\n parseNumber,\r\n parseNumberArray,\r\n flatten,\r\n anyIsError,\r\n};\r\n\r\nexport const PMT = function (rate, periods, present, future, type) {\r\n \r\n\r\n future = future || 0;\r\n type = type || 0;\r\n\r\n rate = utils.parseNumber(rate);\r\n periods = utils.parseNumber(periods);\r\n present = utils.parseNumber(present);\r\n future = utils.parseNumber(future);\r\n type = utils.parseNumber(type);\r\n if (utils.anyIsError(rate, periods, present, future, type)) {\r\n return error.value;\r\n }\r\n\r\n // Return payment\r\n var result;\r\n if (rate === 0) {\r\n result = (present + future) / periods;\r\n } else {\r\n var term = Math.pow(1 + rate, periods);\r\n if (type === 1) {\r\n result =\r\n ((future * rate) / (term - 1) + (present * rate) / (1 - 1 / term)) /\r\n (1 + rate);\r\n } else {\r\n result = (future * rate) / (term - 1) + (present * rate) / (1 - 1 / term);\r\n }\r\n }\r\n return -result;\r\n};\r\n//Returns the interest payment for a given period for an investment based on periodic, \r\n//constant payments and a constant interest rate.\r\nexport const IPMT = function (rate, period, periods, present, future, type) {\r\n \r\n\r\n future = future || 0;\r\n type = type || 0;\r\n\r\n rate = utils.parseNumber(rate);\r\n period = utils.parseNumber(period);\r\n periods = utils.parseNumber(periods);\r\n present = utils.parseNumber(present);\r\n future = utils.parseNumber(future);\r\n type = utils.parseNumber(type);\r\n if (utils.anyIsError(rate, period, periods, present, future, type)) {\r\n return error.value;\r\n }\r\n\r\n // Compute payment\r\n var payment = PMT(rate, periods, present, future, type);\r\n\r\n // Compute interest\r\n var interest;\r\n if (period === 1) {\r\n if (type === 1) {\r\n interest = 0;\r\n } else {\r\n interest = -present;\r\n }\r\n } else {\r\n if (type === 1) {\r\n interest = FV(rate, period - 2, payment, present, 1) - payment;\r\n } else {\r\n interest = FV(rate, period - 1, payment, present, 0);\r\n }\r\n }\r\n\r\n // Return interest\r\n return interest * rate;\r\n};\r\n// Internal Rate of Return\r\nexport const IRR = function (values, guess) {\r\n \r\n\r\n guess = guess || 0;\r\n\r\n values = utils.parseNumberArray(utils.flatten(values));\r\n guess = utils.parseNumber(guess);\r\n if (utils.anyIsError(values, guess)) {\r\n return error.value;\r\n }\r\n\r\n // Calculates the resulting amount\r\n var irrResult = function (values, dates, rate) {\r\n var r = rate + 1;\r\n var result = values[0];\r\n for (var i = 1; i < values.length; i++) {\r\n result += values[i] / Math.pow(r, (dates[i] - dates[0]) / 365);\r\n }\r\n return result;\r\n };\r\n\r\n // Calculates the first derivation\r\n var irrResultDeriv = function (values, dates, rate) {\r\n var r = rate + 1;\r\n var result = 0;\r\n for (var i = 1; i < values.length; i++) {\r\n var frac = (dates[i] - dates[0]) / 365;\r\n result -= (frac * values[i]) / Math.pow(r, frac + 1);\r\n }\r\n return result;\r\n };\r\n\r\n // Initialize dates and check that values contains at least one positive value and one negative value\r\n var dates = [];\r\n var positive = false;\r\n var negative = false;\r\n for (var i = 0; i < values.length; i++) {\r\n dates[i] = i === 0 ? 0 : dates[i - 1] + 365;\r\n if (values[i] > 0) {\r\n positive = true;\r\n }\r\n if (values[i] < 0) {\r\n negative = true;\r\n }\r\n }\r\n\r\n // Return error if values does not contain at least one positive value and one negative value\r\n if (!positive || !negative) {\r\n return error.num;\r\n }\r\n\r\n // Initialize guess and resultRate\r\n guess = guess === undefined ? 0.1 : guess;\r\n var resultRate = guess;\r\n\r\n // Set maximum epsilon for end of iteration\r\n var epsMax = 1e-10;\r\n\r\n // Implement Newton's method\r\n var newRate, epsRate, resultValue;\r\n var contLoop = true;\r\n do {\r\n resultValue = irrResult(values, dates, resultRate);\r\n newRate =\r\n resultRate - resultValue / irrResultDeriv(values, dates, resultRate);\r\n epsRate = Math.abs(newRate - resultRate);\r\n resultRate = newRate;\r\n contLoop = epsRate > epsMax && Math.abs(resultValue) > epsMax;\r\n } while (contLoop);\r\n\r\n // Return internal rate of return\r\n return resultRate;\r\n};\r\n\r\nexport const FV = function (rate, periods, payment, value, type) {\r\n \r\n\r\n value = value || 0;\r\n type = type || 0;\r\n\r\n rate = utils.parseNumber(rate);\r\n periods = utils.parseNumber(periods);\r\n payment = utils.parseNumber(payment);\r\n value = utils.parseNumber(value);\r\n type = utils.parseNumber(type);\r\n if (utils.anyIsError(rate, periods, payment, value, type)) {\r\n return error.value;\r\n }\r\n\r\n // Return future value\r\n var result;\r\n if (rate === 0) {\r\n result = value + payment * periods;\r\n } else {\r\n var term = Math.pow(1 + rate, periods);\r\n if (type === 1) {\r\n result = value * term + (payment * (1 + rate) * (term - 1)) / rate;\r\n } else {\r\n result = value * term + (payment * (term - 1)) / rate;\r\n }\r\n }\r\n return -result;\r\n};\r\n","export const loanCalculationRuleSet = {\r\n SV: [\r\n {\r\n from: 10000,\r\n to: 29999,\r\n maxMonths: 60,\r\n InvoiceFee: 29,\r\n },\r\n {\r\n from: 30000,\r\n to: 49999,\r\n maxMonths: 72,\r\n },\r\n {\r\n from: 50000,\r\n to: 69999,\r\n maxMonths: 108,\r\n },\r\n {\r\n from: 70000,\r\n to: 99999,\r\n maxMonths: 120,\r\n },\r\n {\r\n from: 100000,\r\n to: 349999,\r\n maxMonths: 144,\r\n },\r\n {\r\n from: 350000,\r\n to: 500000,\r\n maxMonths: 180,\r\n },\r\n ],\r\n NO: [\r\n {\r\n from: 10000,\r\n to: 29999,\r\n maxMonths: 60,\r\n InvoiceFee: 45,\r\n },\r\n {\r\n from: 30000,\r\n to: 49999,\r\n maxMonths: 72,\r\n },\r\n {\r\n from: 50000,\r\n to: 69999,\r\n maxMonths: 108,\r\n },\r\n {\r\n from: 70000,\r\n to: 99999,\r\n maxMonths: 120,\r\n },\r\n {\r\n from: 100000,\r\n to: 349999,\r\n maxMonths: 144,\r\n },\r\n {\r\n from: 350000,\r\n to: 500000,\r\n maxMonths: 180,\r\n },\r\n ],\r\n DK: [\r\n {\r\n from: 10000,\r\n to: 29999,\r\n maxMonths: 48,\r\n InvoiceFee: 0,\r\n },\r\n {\r\n from: 30000,\r\n to: 49999,\r\n maxMonths: 72,\r\n },\r\n {\r\n from: 50000,\r\n to: 69999,\r\n maxMonths: 108,\r\n },\r\n {\r\n from: 70000,\r\n to: 99999,\r\n maxMonths: 120,\r\n },\r\n {\r\n from: 100000,\r\n to: 349999,\r\n maxMonths: 144,\r\n },\r\n {\r\n from: 350000,\r\n to: 500000,\r\n maxMonths: 180,\r\n },\r\n ],\r\n FREE: [\r\n {\r\n from: 1,\r\n to: 99999999,\r\n maxMonths: 360,\r\n },\r\n ],\r\n};\r\n","import { useEffect, useState } from \"react\";\r\nimport { PMT, IRR, IPMT } from \"../helpers/calculation.helpers\";\r\nimport { loanCalculationRuleSet } from \"./LoanCalculator.config\";\r\n\r\nexport const useLoanCalculatorController = ({\r\n initialLoanAmount,\r\n initialLoanYears,\r\n initialInterestRate,\r\n initialPaymentFee,\r\n initialEstablishmentFee,\r\n initialNumberOfYearlyPayments,\r\n initialLoanType,\r\n minInterestRate,\r\n maxInterestRate,\r\n version,\r\n}) => {\r\n const calculationRules = loanCalculationRuleSet[version]; //Lang Specific\r\n const [loanType, setLoanType] = useState(initialLoanType);\r\n const [amount, setAmount] = useState(initialLoanAmount);\r\n const [months, setMonths] = useState(initialLoanYears);\r\n const [interestRate, setInterestRate] = useState(initialInterestRate);\r\n const [paymentFee, setPaymentFee] = useState(calculationRules[0].InvoiceFee);\r\n\r\n\r\n const [establishmentFee, setEstablishmentFee] = useState(\r\n initialEstablishmentFee\r\n );\r\n \r\n const [numberOfYearlyPayments, setNumberOfYearlyPayments] = useState(\r\n initialNumberOfYearlyPayments\r\n );\r\n const [minLoanAmount, setMinLoanAmount] = useState(0);\r\n const [maxLoanAmount, setMaxLoanAmount] = useState(0);\r\n const [maxLoanMonths, setMaxLoanMonths] = useState(0);\r\n const minLoanYears = 1;\r\n\r\n useEffect(() => {\r\n setMinLoanAmount(calculationRules[0].from);\r\n setMaxLoanAmount(calculationRules[calculationRules.length - 1].to);\r\n }, [calculationRules]);\r\n\r\n\r\n useEffect(() => {\r\n const rule = calculationRules.filter(\r\n (rule) => amount >= rule.from && amount <= rule.to\r\n )[0];\r\n\r\n if (rule) {\r\n setMaxLoanMonths(rule.maxMonths);\r\n \r\n if (months > rule.maxMonths) {\r\n setMonths(rule.maxMonths);\r\n }\r\n }\r\n\r\n if (maxLoanAmount !== 0 && minLoanAmount !== 0) {\r\n if (amount > maxLoanAmount) {\r\n setAmount(maxLoanAmount);\r\n } else if (amount < minLoanAmount) {\r\n setAmount(minLoanAmount);\r\n }\r\n }\r\n }, [amount, calculationRules]);\r\n\r\n useEffect(() => {\r\n if (maxLoanMonths !== 0) {\r\n if (months > maxLoanMonths) {\r\n setMonths(maxLoanMonths);\r\n console.log(\"months > maxLoanMonths TRUE\" + maxLoanMonths);\r\n } else if (months < minLoanYears) {\r\n console.log(\"months < minLoanYears TRUE\" + maxLoanMonths);\r\n setMonths(minLoanYears);\r\n }\r\n }\r\n console.log(months);\r\n }, [months]);\r\n\r\n useEffect(() => {\r\n if (interestRate > maxInterestRate) {\r\n setInterestRate(maxInterestRate);\r\n } else if (interestRate < minInterestRate) {\r\n setInterestRate(minInterestRate);\r\n }\r\n }, [interestRate]);\r\n\r\n return {\r\n loanType,\r\n setLoanType,\r\n amount,\r\n setAmount,\r\n years: months,\r\n setYears: setMonths,\r\n interestRate,\r\n setInterestRate,\r\n paymentFee,\r\n setPaymentFee,\r\n establishmentFee,\r\n setEstablishmentFee,\r\n numberOfYearlyPayments,\r\n setNumberOfYearlyPayments,\r\n minLoanAmount,\r\n maxLoanAmount,\r\n minLoanYears,\r\n maxLoanYears: maxLoanMonths,\r\n };\r\n};\r\n\r\nexport const LoanTypes = {\r\n Annuity: \"Annuity\",\r\n Serial: \"Serial\",\r\n};\r\n\r\nexport const useCalculatedLoan = ({\r\n loanType,\r\n amount,\r\n months,\r\n interestRate,\r\n establishmentFee,\r\n paymentFee,\r\n numberOfYearlyPayments,\r\n}) => {\r\n \r\n const yearlyInterestRateDecimal = interestRate / 100;\r\n console.log(\r\n \"years:\" +\r\n months +\r\n \"ypayments:\" +\r\n numberOfYearlyPayments +\r\n \"est fee: \" +\r\n establishmentFee\r\n );\r\n const numberOfRepayments = months //months;\r\n const nominalInterestRate =\r\n yearlyInterestRateDecimal / numberOfYearlyPayments;\r\n\r\n const downPayment =\r\n PMT(nominalInterestRate, numberOfRepayments, amount + establishmentFee) -\r\n paymentFee;\r\n\r\n let prevClosingBalance = 0;\r\n const payments = Array.apply(0, Array(numberOfRepayments + 1)).map(\r\n (_, index) => {\r\n if (index === 0) {\r\n prevClosingBalance = amount + establishmentFee;\r\n return { calcPayment: amount };\r\n } else {\r\n const fees = paymentFee;\r\n const isLast = index === numberOfRepayments;\r\n\r\n if (loanType === LoanTypes.Annuity) {\r\n const _interestCost = IPMT(\r\n nominalInterestRate,\r\n index,\r\n numberOfRepayments,\r\n amount + establishmentFee\r\n );\r\n\r\n const amortization = isLast\r\n ? prevClosingBalance\r\n : Math.round(\r\n Math.abs(downPayment) - Math.abs(_interestCost) - fees\r\n );\r\n\r\n // Om sista betalningen\r\n\r\n const payment = !isLast\r\n ? Math.round(Math.abs(downPayment))\r\n : Math.round(\r\n prevClosingBalance + paymentFee + Math.abs(_interestCost)\r\n );\r\n\r\n const remaining = isLast ? 0 : prevClosingBalance - amortization;\r\n prevClosingBalance = remaining;\r\n\r\n return {\r\n calcPayment: downPayment,\r\n payment,\r\n interestCost: Math.round(Math.abs(_interestCost)),\r\n fees,\r\n amortization,\r\n remaining,\r\n };\r\n } else {\r\n const _interestCost = prevClosingBalance * nominalInterestRate;\r\n const amortization = Math.round(\r\n (amount + establishmentFee) / numberOfRepayments\r\n );\r\n const remaining = isLast ? 0 : prevClosingBalance - amortization;\r\n const _payment = amortization + _interestCost + fees;\r\n prevClosingBalance = remaining;\r\n\r\n return {\r\n calcPayment: -_payment,\r\n interestCost: Math.round(_interestCost),\r\n payment: Math.round(_payment),\r\n fees,\r\n amortization: amortization,\r\n remaining,\r\n };\r\n }\r\n }\r\n }\r\n );\r\n\r\n const monthlyDiscountRate = IRR(\r\n payments.map(({ calcPayment }) => calcPayment)\r\n );\r\n const APR = Math.pow(1 + monthlyDiscountRate, numberOfYearlyPayments) - 1;\r\n console.log('effectiv ränta:' +APR);\r\n const totalPayment =\r\n loanType === LoanTypes.Annuity\r\n ? downPayment * numberOfRepayments\r\n : payments.reduce(\r\n (acc, curr, index) =>\r\n index > 0 ? acc + Math.abs(curr.calcPayment) : 0,\r\n 0\r\n ) + establishmentFee;\r\n\r\n return {\r\n totalAmount: Math.round(Math.abs(totalPayment)),\r\n monthlyPayment: Math.round(Math.abs(downPayment)),\r\n calculatedMonthlyFee: -Math.round(totalPayment/numberOfRepayments),\r\n totalCost: Math.round(Math.abs(totalPayment)) - amount,\r\n payments,\r\n \r\n };\r\n};\r\n","import React from \"react\";\r\nimport { formatCurrency } from \"../helpers/number.helpers\";\r\nimport { Box, Table, Tbody, Tr, Td, Th, Thead } from \"@chakra-ui/react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nconst CalculationTh = ({ children }) => (\r\n {children}\r\n);\r\nCalculationTh.propTypes = {\r\n children: PropTypes.node,\r\n};\r\n\r\nexport const LoanCalculationTable = ({\r\n payments,\r\n installmentLabel,\r\n installmentPaymentLabel,\r\n interestCostLabel,\r\n feesLabel,\r\n amortizationLabel,\r\n remainingLabel,\r\n numberOfYearlyPayments,\r\n monthLabel,\r\n yearLabel,\r\n quarterLabel,\r\n language\r\n}) => { \r\n const spaceRemoverDk = language === \"dk\" ? \"\" : \" \";\r\n const thousandDelimiterDk = language === \"dk\" ? \".\" : \" \";\r\n const langSpecificKRsuffix = language === \"dk\" ? \".\" : \"\";\r\n const getInstallmentLabel = (_numberOfYearlyPayments) => {\r\n if (_numberOfYearlyPayments === 12) {\r\n return monthLabel;\r\n } else if (_numberOfYearlyPayments === 4) {\r\n return quarterLabel;\r\n } else if (_numberOfYearlyPayments === 1) {\r\n return yearLabel;\r\n }\r\n }\r\n const _installmentLabel = getInstallmentLabel(numberOfYearlyPayments);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {_installmentLabel}\r\n {installmentPaymentLabel}\r\n {interestCostLabel}\r\n {feesLabel}\r\n {amortizationLabel}\r\n {remainingLabel}\r\n \r\n \r\n \r\n {payments.map((downPayment, index) =>\r\n index > 0 ? (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : null\r\n )}\r\n \r\n
{index}\r\n {formatCurrency(downPayment.payment, spaceRemoverDk)} kr\r\n {langSpecificKRsuffix}\r\n \r\n {formatCurrency(downPayment.interestCost, spaceRemoverDk)} kr\r\n {langSpecificKRsuffix}\r\n \r\n {formatCurrency(downPayment.fees, spaceRemoverDk)} kr\r\n {langSpecificKRsuffix}\r\n \r\n {formatCurrency(downPayment.amortization, spaceRemoverDk)} kr\r\n {langSpecificKRsuffix}\r\n \r\n {formatCurrency(downPayment.remaining, thousandDelimiterDk)} kr\r\n {langSpecificKRsuffix}\r\n
\r\n \r\n );};\r\n\r\nLoanCalculationTable.propTypes = {\r\n payments: PropTypes.arrayOf({\r\n calcPayment: PropTypes.number,\r\n payment: PropTypes.number,\r\n interestCost: PropTypes.number,\r\n fees: PropTypes.number,\r\n amortization: PropTypes.number,\r\n remaining: PropTypes.number,\r\n }),\r\n installmentLabel: PropTypes.string,\r\n installmentPaymentLabel: PropTypes.string,\r\n interestCostLabel: PropTypes.string,\r\n feesLabel: PropTypes.string,\r\n amortizationLabel: PropTypes.string,\r\n remainingLabel: PropTypes.string,\r\n numberSeparator: PropTypes.string,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { BaseLink } from '../Link';\r\nimport { Button as ChakraButton } from '@chakra-ui/react';\r\nconst base = {\r\n display: 'inline-flex',\r\n width: '100%',\r\n minHeight: '14',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n fontWeight: 'normal',\r\n fontSize: 'lg',\r\n textAlign: 'center',\r\n paddingY: '3',\r\n paddingX: '2',\r\n lineHeight: '1.2',\r\n borderRadius: 0,\r\n _hover: {\r\n textDecoration: 'none',\r\n },\r\n};\r\n\r\nconst primary = {\r\n ...base,\r\n bg: 'orange.500',\r\n transition: 'background-color .2s',\r\n _hover: {\r\n bg: 'orange.400',\r\n },\r\n};\r\n\r\nexport const secondary = {\r\n ...base,\r\n bg: 'transparent',\r\n boxShadow: '0 0 0 1px black inset',\r\n\r\n _hover: {\r\n boxShadow: '0 0 0 2px black inset',\r\n },\r\n};\r\n\r\nconst secondaryInverted = {\r\n ...secondary,\r\n borderColor: 'white',\r\n boxShadow: '0 0 0 1px white inset',\r\n _hover: {\r\n boxShadow: '0 0 0 2px white inset',\r\n },\r\n color: 'white',\r\n};\r\n\r\nexport const alternative = {\r\n ...base,\r\n bg: 'black',\r\n color: 'white',\r\n _hover: {\r\n bg: '#333333',\r\n },\r\n};\r\n\r\nconst alternativeInverted = {\r\n ...base,\r\n bg: 'white',\r\n color: 'black',\r\n _hover: {\r\n bg: 'gray.500',\r\n },\r\n};\r\n\r\nexport const ButtonVariants = {\r\n primary: 'primary',\r\n secondary: 'secondary',\r\n secondaryInverted: 'secondary-inverted',\r\n alternative: 'alternative',\r\n alternativeInverted: 'alternative-inverted',\r\n};\r\n\r\nconst getVariantStyles = (variant) => {\r\n switch (variant) {\r\n case ButtonVariants.secondary:\r\n return secondary;\r\n case ButtonVariants.secondaryInverted:\r\n return secondaryInverted;\r\n case ButtonVariants.alternative:\r\n return alternative;\r\n case ButtonVariants.alternativeInverted:\r\n return alternativeInverted;\r\n case ButtonVariants.primary:\r\n return primary;\r\n default:\r\n return primary;\r\n }\r\n};\r\n\r\nexport const Button = ({\r\n title,\r\n isButton,\r\n variant = ButtonVariants.primary,\r\n ...props\r\n}) => {\r\n const Component = isButton ? ChakraButton : BaseLink;\r\n const styles = getVariantStyles(variant);\r\n\r\n return (\r\n \r\n {title}\r\n \r\n );\r\n};\r\n\r\nButton.propTypes = {\r\n title: PropTypes.string,\r\n variant: PropTypes.oneOf(Object.values(ButtonVariants)),\r\n isButton: PropTypes.bool,\r\n};\r\n","import { Link } from \"@chakra-ui/react\";\r\nimport { motion } from \"framer-motion\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nconst MotionLink = motion(Link);\r\n\r\nexport const BaseLink = ({ withMotion, innerRef, ...props }) => {\r\n // TODO: Temporary to make links testable locally\r\n if (process.env.NODE_ENV !== \"production\") {\r\n const href =\r\n props.href.replace(\"http://remember-next.azurewebsites.net\", \"\") ||\r\n props.href ||\r\n \"\";\r\n props = {\r\n ...props,\r\n href,\r\n };\r\n }\r\n\r\n const withRef = innerRef ? { ref: innerRef } : {};\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n};\r\n\r\nBaseLink.propTypes = {\r\n href: PropTypes.string,\r\n children: PropTypes.node,\r\n innerRef: PropTypes.any,\r\n /** Set to true if Framer Motion is needed for animating */\r\n withMotion: PropTypes.bool,\r\n};\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconArrow = (props) => (\r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconCheck = (props) => (\r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconClose = (props) => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconDownload = (props) => (\r\n \r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconFacebook = (props) => (\r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconHamburger = (props) => (\r\n \r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconHome = (props) => (\r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconInfo = (props) => (\r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconInstagram = (props) => (\r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconLinkedIn = (props) => (\r\n \r\n \r\n\r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconLogin = (props) => (\r\n \r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconQuestion = (props) => (\r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconSearch = (props) => (\r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconPlus = (props) => (\r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconMinus = (props) => (\r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconTwitter = (props) => (\r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconUpload = (props) => (\r\n \r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconWifi = (props) => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconYoutube = (props) => (\r\n \r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconFallback = (props) => (\r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { IconArrow } from './IconArrow';\r\nimport { IconCheck } from './IconCheck';\r\nimport { IconClose } from './IconClose';\r\nimport { IconDownload } from './IconDownload';\r\nimport { IconFacebook } from './IconFacebook';\r\nimport { IconHamburger } from './IconHamburger';\r\nimport { IconHome } from './IconHome';\r\nimport { IconInfo } from './IconInfo';\r\nimport { IconInstagram } from './IconInstagram';\r\nimport { IconLinkedIn } from './IconLinkedIn';\r\nimport { IconLogin } from './IconLogin';\r\nimport { IconQuestion } from './IconQuestion';\r\nimport { IconSearch } from './IconSearch';\r\nimport { IconPlus } from './IconPlus';\r\nimport { IconMinus } from './IconMinus';\r\nimport { IconTwitter } from './IconTwitter';\r\nimport { IconUpload } from './IconUpload';\r\nimport { IconWifi } from './IconWifi';\r\nimport { IconYoutube } from './IconYoutube';\r\nimport { IconFallback } from './IconFallback';\r\n\r\n//TODO: Add smaller IconCheck\r\nconst getIcon = (icon) => {\r\n switch (icon) {\r\n case 'arrow':\r\n return IconArrow;\r\n case 'hamburger':\r\n return IconHamburger;\r\n case 'download':\r\n return IconDownload;\r\n case 'upload':\r\n return IconUpload;\r\n case 'login':\r\n return IconLogin;\r\n case 'info':\r\n return IconInfo;\r\n case 'question':\r\n return IconQuestion;\r\n case 'close':\r\n return IconClose;\r\n case 'home':\r\n return IconHome;\r\n case 'check':\r\n return IconCheck;\r\n case 'wifi':\r\n return IconWifi;\r\n case 'facebook':\r\n return IconFacebook;\r\n case 'linkedin':\r\n return IconLinkedIn;\r\n case 'youtube':\r\n return IconYoutube;\r\n case 'instagram':\r\n return IconInstagram;\r\n case 'twitter':\r\n return IconTwitter;\r\n case 'plus':\r\n return IconPlus;\r\n case 'minus':\r\n return IconMinus;\r\n case 'search':\r\n return IconSearch;\r\n\r\n default:\r\n return IconFallback;\r\n }\r\n};\r\n\r\nconst getSize = (size) => {\r\n switch (size) {\r\n case 'xs':\r\n return 3;\r\n case 'sm':\r\n return 4;\r\n case 'md':\r\n return 7;\r\n case 'lg':\r\n return 9;\r\n\r\n default:\r\n return 7;\r\n }\r\n};\r\n\r\nexport const Icon = ({ icon, size, ...props }) => {\r\n const iconSize = getSize(size);\r\n\r\n const iconProps = {\r\n ...props,\r\n width: iconSize,\r\n height: iconSize,\r\n viewBox: '0 0 30 30',\r\n };\r\n\r\n const IconComponent = getIcon(icon);\r\n\r\n return ;\r\n};\r\n\r\nIcon.propTypes = {\r\n icon: PropTypes.oneOf([\r\n 'arrow',\r\n 'hamburger',\r\n 'download',\r\n 'upload',\r\n 'login',\r\n 'info',\r\n 'question',\r\n 'close',\r\n 'home',\r\n 'check',\r\n 'wifi',\r\n 'facebook',\r\n 'linkedin',\r\n 'youtube',\r\n 'instagram',\r\n 'twitter',\r\n 'plus',\r\n 'minus',\r\n 'search',\r\n ]),\r\n size: PropTypes.oneOf(['xs', 'sm', 'md', 'lg']),\r\n};\r\n","export default {\r\n h1: {\r\n fontSize: { base: '2xl', lg: '4xl' },\r\n lineHeight: { base: 'short', lg: 'shorter' },\r\n fontWeight: { base: 'light', lg: 'light' },\r\n },\r\n h2: {\r\n fontSize: { base: '2xl', lg: '3xl' },\r\n lineHeight: { base: 'short' },\r\n fontWeight: { base: 'light', lg: 'light' },\r\n },\r\n h3: {\r\n fontSize: { base: 'lg', lg: '2xl' },\r\n lineHeight: { base: 'short' },\r\n fontWeight: { base: 'light', lg: 'light' },\r\n },\r\n h4: {\r\n fontSize: { base: 'md', lg: 'xl' },\r\n lineHeight: { base: 'short' },\r\n fontWeight: { base: 'bold', lg: 'light' },\r\n },\r\n h5: {\r\n fontSize: { base: 'md', lg: 'md' },\r\n lineHeight: { base: 'short' },\r\n fontWeight: { base: 'bold' },\r\n },\r\n h6: {\r\n fontSize: { base: 'sm', lg: 'sm' },\r\n lineHeight: { base: 'short' },\r\n fontWeight: { base: 'bold' },\r\n },\r\n};\r\n","import { Text } from \"@chakra-ui/layout\";\r\nimport { useBreakpointValue } from \"@chakra-ui/media-query\";\r\nimport PropTypes from \"prop-types\";\r\nimport styles from \"./Heading.styles\";\r\n\r\nexport const Heading = ({ children, size = 0, ...props }) => {\r\n const breakpointSize = useBreakpointValue(size);\r\n const _size = typeof size === \"object\" ? breakpointSize : size;\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nHeading.propTypes = {\r\n size: PropTypes.oneOfType([\r\n PropTypes.oneOf([\"1\", \"2\", \"3\", \"4\", \"5\", \"6\"]),\r\n PropTypes.object,\r\n ]).isRequired,\r\n children: PropTypes.node,\r\n};\r\n","import React, { useRef, useState } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { LoanCalculationChart } from \"../LoanCalculator/LoanCalculationChart\";\r\nimport {\r\n Grid,\r\n GridItem,\r\n SimpleGrid,\r\n Input,\r\n FormControl,\r\n FormLabel,\r\n Select,\r\n Radio,\r\n RadioGroup,\r\n Stack,\r\n Box,\r\n Tooltip,\r\n Text,\r\n} from \"@chakra-ui/react\";\r\nimport { formatCurrency } from \"../helpers/number.helpers\";\r\nimport {\r\n LoanTypes,\r\n useCalculatedLoan,\r\n useLoanCalculatorController,\r\n} from \"../LoanCalculator/LoanCalculator.hooks\";\r\nimport { LoanCalculationTable } from \"../LoanCalculator/LoanCalculationTable\";\r\nimport { Button, ButtonVariants } from \"../Button/Button\";\r\nimport { Icon } from \"../icons/Icon\";\r\nimport { Heading } from \"../Heading/Heading\";\r\n\r\n\r\n\r\nconst TooltipIcon = ({ tooltip }) => {\r\nconst [isLabelOpen, setIsLabelOpen] = useState(false);\r\n\r\n return (\r\n \r\n \r\n {tooltip}} isOpen={isLabelOpen} >\r\n setIsLabelOpen(true)}\r\n onMouseLeave={() => setIsLabelOpen(false)}\r\n onClick={() => setIsLabelOpen(true)} />\r\n \r\n \r\n)};\r\nTooltipIcon.propTypes = {\r\n tooltip: PropTypes.string,\r\n};\r\n\r\nconst LabelWithTooltip = ({ label, tooltip }) => (\r\n \r\n \r\n {label}:\r\n \r\n \r\n);\r\n\r\nLabelWithTooltip.propTypes = {\r\n label: PropTypes.string,\r\n tooltip: PropTypes.string,\r\n};\r\n\r\n\r\nexport const AdvancedLoanCalculatorBlock = ({\r\n title,\r\n language,\r\n initialLoanAmount = 50000,\r\n initialLoanYears: initialLoanMonths = 60,\r\n initialInterestRate = 7.95,\r\n initialNumberOfYearlyPayments = 12,\r\n minInterestRate = 0.01,\r\n maxInterestRate = 99.99,\r\n establishmentFee = 0,\r\n content,\r\n loanTypeLabel,\r\n loanTypeTooltip,\r\n loanAmountLabel,\r\n loanAmountTooltip,\r\n loanYearsLabel,\r\n loanYearsTooltip,\r\n yearlyPaymentsLabel,\r\n yearlyPaymentsTooltip,\r\n interestRateLabel,\r\n interestRateTooltip,\r\n paymentFeeLabel,\r\n paymentFeeTooltip,\r\n establishmentFeeLabel,\r\n establishmentFeeTooltip,\r\n installmentLabel,\r\n installmentPaymentLabel,\r\n interestCostLabel,\r\n feesLabel,\r\n amortizationLabel,\r\n remainingLabel,\r\n yourLoanCostLabel,\r\n monthlyFee,\r\n totalCostLabel,\r\n paymentPlanLabel,\r\n viewPaymentPlanLabel,\r\n hidePaymentPlanLabel,\r\n monthly,\r\n quarterly,\r\n yearly,\r\n annuityLoanLabel,\r\n serialLoanLabel,\r\n monthLabel,\r\n yearLabel,\r\n quarterLabel,\r\n initialPaymentFee = (language === \"sv\" ? 29 : language === \"no\" ? 45 : language === \"dk\" ? 0 : null),\r\n}) => {\r\n const langSpecificKRsuffix = language === \"dk\" ? \".\" : \"\";\r\n const numberSeparator = language === \"dk\" ? \".\" : \" \";\r\n const handleNumberChange = (value) => {\r\n const string = String(value);\r\n const stripped = string.replace(/\\D+/g, \"\");\r\n\r\n const output = stripped;\r\n return formatCurrency(output, numberSeparator);\r\n };\r\n const [loanAmount, setLoanAmount] = useState(\r\n handleNumberChange(initialLoanAmount)\r\n );\r\n const [loanMonths, setLoanMonths] = useState(initialLoanMonths);\r\n const [paymentFee, setPaymentFee] = useState(initialPaymentFee);\r\n const [_establishmentFee, setEstablishmentFee] = useState(establishmentFee);\r\n\r\n const viewPlanRef = useRef(null);\r\n const [isPlanVisible, setIsPlanVisible] = useState(false);\r\n const loanCalculator = useLoanCalculatorController({\r\n initialLoanType: LoanTypes.Annuity,\r\n initialLoanAmount,\r\n initialLoanYears: initialLoanMonths,\r\n initialInterestRate,\r\n initialPaymentFee,\r\n initialEstablishmentFee: establishmentFee,\r\n initialNumberOfYearlyPayments,\r\n minInterestRate,\r\n maxInterestRate,\r\n //See LoanCalcualtor.config:\r\n version: language.toUpperCase(),\r\n });\r\n\r\n const calculatedLoan = useCalculatedLoan({\r\n loanType: loanCalculator.loanType,\r\n amount: loanCalculator.amount,\r\n months: loanCalculator.years,\r\n interestRate: loanCalculator.interestRate,\r\n establishmentFee: loanCalculator.establishmentFee,\r\n paymentFee: loanCalculator.paymentFee,\r\n numberOfYearlyPayments: loanCalculator.numberOfYearlyPayments,\r\n });\r\n\r\n\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n loanCalculator.setLoanType(e)}\r\n >\r\n \r\n {annuityLoanLabel}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n setLoanAmount(handleNumberChange(e.currentTarget.value))\r\n }\r\n onBlur={(e) =>\r\n loanCalculator.setAmount(\r\n Number(e.currentTarget.value.replace(/\\D+/g, \"\"))\r\n )\r\n }\r\n textAlign=\"right\"\r\n paddingRight={language === \"dk\" ? \"7\" : \"6\"}\r\n />\r\n \r\n kr{langSpecificKRsuffix}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n setLoanMonths(handleNumberChange(e.currentTarget.value))\r\n }\r\n onBlur={(e) =>\r\n loanCalculator.setYears(\r\n Number(e.currentTarget.value.replace(/\\D+/g, \"\")) | 0\r\n )\r\n }\r\n textAlign=\"right\"\r\n paddingRight=\"10\"\r\n />\r\n \r\n {language === \"dk\" ? \"mdr.\" : \"mån\"}\r\n \r\n \r\n \r\n {/* \r\n \r\n \r\n loanCalculator.setNumberOfYearlyPayments(\r\n Number(e.currentTarget.value)\r\n )\r\n }\r\n >\r\n \r\n \r\n \r\n \r\n */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n loanCalculator.setInterestRate(Number(e.currentTarget.value))\r\n }\r\n textAlign=\"right\"\r\n paddingRight=\"6\"\r\n />\r\n \r\n %\r\n \r\n \r\n \r\n \r\n {language !== \"dk\" ? (\r\n \r\n \r\n \r\n \r\n \r\n setPaymentFee(handleNumberChange(e.currentTarget.value))\r\n }\r\n onBlur={(e) =>\r\n loanCalculator.setPaymentFee(\r\n Number(e.currentTarget.value.replace(/\\D+/g, \"\"))\r\n )\r\n }\r\n textAlign=\"right\"\r\n paddingRight=\"6\"\r\n />\r\n \r\n kr{langSpecificKRsuffix}\r\n \r\n \r\n \r\n \r\n ) : (\r\n \"\"\r\n )}\r\n {/* \r\n \r\n \r\n \r\n \r\n setEstablishmentFee(handleNumberChange(e.currentTarget.value))\r\n }\r\n onBlur={(e) =>\r\n loanCalculator.setEstablishmentFee(\r\n Number(e.currentTarget.value.replace(/\\D+/g, \"\"))\r\n )\r\n }\r\n textAlign=\"right\"\r\n paddingRight=\"8\"\r\n />\r\n \r\n kr{langSpecificKRsuffix}\r\n \r\n \r\n \r\n */}\r\n \r\n \r\n {yourLoanCostLabel}:\r\n \r\n \r\n \r\n {monthlyFee}:\r\n \r\n {/* {calculatedLoan.calculatedMonthlyFee.toString().replace(\".\", \",\")}{\" \"}\r\n kr */}\r\n {formatCurrency(\r\n calculatedLoan.calculatedMonthlyFee,\r\n numberSeparator\r\n )}{\" \"}\r\n kr\r\n {language === \"dk\" && \".\"}\r\n \r\n \r\n \r\n {interestCostLabel}:\r\n \r\n {formatCurrency(calculatedLoan.totalCost, numberSeparator)} kr\r\n {language === \"dk\" && \".\"}\r\n \r\n \r\n\r\n \r\n {totalCostLabel}:\r\n \r\n {formatCurrency(calculatedLoan.totalAmount, numberSeparator)} kr\r\n {language === \"dk\" && \".\"}\r\n \r\n \r\n \r\n \r\n {/* {\r\n if (!isPlanVisible && viewPlanRef.current) {\r\n window.scrollTo({\r\n top:\r\n window.scrollY +\r\n viewPlanRef.current.getBoundingClientRect().top,\r\n behavior: \"smooth\",\r\n });\r\n }\r\n setIsPlanVisible(!isPlanVisible);\r\n }}\r\n /> */}\r\n \r\n {isPlanVisible && (\r\n <>\r\n \r\n {paymentPlanLabel}\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nAdvancedLoanCalculatorBlock.propTypes = {\r\n title: PropTypes.string,\r\n initialLoanAmount: PropTypes.number,\r\n initialLoanYears: PropTypes.number,\r\n initialInterestRate: PropTypes.number,\r\n initialNumberOfYearlyPayments: PropTypes.number,\r\n minInterestRate: PropTypes.number,\r\n maxInterestRate: PropTypes.number,\r\n establishmentFee: PropTypes.number,\r\n initialPaymentFee: PropTypes.number,\r\n content: PropTypes.string,\r\n loanTypeLabel: PropTypes.string,\r\n loanTypeTooltip: PropTypes.string,\r\n loanAmountLabel: PropTypes.string,\r\n loanAmountTooltip: PropTypes.string,\r\n loanYearsLabel: PropTypes.string,\r\n loanYearsTooltip: PropTypes.string,\r\n yearlyPaymentsLabel: PropTypes.string,\r\n yearlyPaymentsTooltip: PropTypes.string,\r\n interestRateLabel: PropTypes.string,\r\n interestRateTooltip: PropTypes.string,\r\n paymentFeeLabel: PropTypes.string,\r\n paymentFeeTooltip: PropTypes.string,\r\n establishmentFeeLabel: PropTypes.string,\r\n establishmentFeeTooltip: PropTypes.string,\r\n installmentLabel: PropTypes.string,\r\n installmentPaymentLabel: PropTypes.string,\r\n interestCostLabel: PropTypes.string,\r\n feesLabel: PropTypes.string,\r\n amortizationLabel: PropTypes.string,\r\n remainingLabel: PropTypes.string,\r\n yourLoanCostLabel: PropTypes.string,\r\n monthlyFee: PropTypes.string,\r\n totalCostLabel: PropTypes.string,\r\n paymentPlanLabel: PropTypes.string,\r\n viewPaymentPlanLabel: PropTypes.string,\r\n hidePaymentPlanLabel: PropTypes.string,\r\n language: PropTypes.oneOf(['sv','dk','no'])\r\n};\r\n","import { ChakraProvider } from \"@chakra-ui/react\";\r\nimport { AdvancedLoanCalculatorBlock } from \"./AdvancedLoanCalculatorBlock/AdvancedLoanCalculatorBlock\";\r\nimport { theme } from \"./theme.config\";\r\nimport languageFile from './language.json';\r\nimport { Global } from \"@emotion/react\";\r\n\r\nfunction App() {\r\n //DK, SV, NO\r\n const currentLang = window.LOAN_CALCULATOR_LANGUAGE || 'dk';\r\n\r\n const getLanguageProps = () => {\r\n \r\n const lang = languageFile || {};\r\n\r\n let output = {};\r\n for(const key in lang) {\r\n if (lang.hasOwnProperty(key)) {\r\n output = {\r\n ...output,\r\n [key]: lang[key][currentLang],\r\n }\r\n }\r\n }\r\n\r\n return output;\r\n };\r\n\r\n const languageProps = getLanguageProps();\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default App;\r\n","import React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport App from \"./App\";\r\n\r\nReactDOM.render(\r\n \r\n \r\n ,\r\n document.getElementById(\"mpt-calculator\")\r\n);\r\n"],"sourceRoot":""}