{"id":5726,"date":"2025-09-08T20:54:48","date_gmt":"2025-09-09T01:54:48","guid":{"rendered":"https:\/\/www.ezcalculatoronline.com\/?page_id=5726"},"modified":"2026-11-06T21:38:59","modified_gmt":"2026-11-07T02:38:59","slug":"math-solver","status":"publish","type":"page","link":"https:\/\/www.ezcalculatoronline.com\/math\/math-solver\/","title":{"rendered":"Math solver"},"content":{"rendered":"<div id=\"tdi_1\" class=\"tdc-zone\"><div class=\"tdc_zone tdi_2  wpb_row td-pb-row\"  >\n<style scoped>\n\n\/* custom css *\/\n.tdi_2{\r\n                    min-height: 0;\r\n                }\n<\/style><div id=\"tdi_3\" class=\"tdc-row\"><div class=\"vc_row tdi_4  wpb_row td-pb-row\" >\n<style scoped>\n\n\/* custom css *\/\n.tdi_4,\r\n                .tdi_4 .tdc-columns{\r\n                    min-height: 0;\r\n                }.tdi_4,\r\n\t\t\t\t.tdi_4 .tdc-columns{\r\n\t\t\t\t    display: block;\r\n\t\t\t\t}.tdi_4 .tdc-columns{\r\n\t\t\t\t    width: 100%;\r\n\t\t\t\t}\n<\/style><div class=\"vc_column tdi_6  wpb_column vc_column_container tdc-column td-pb-span8\">\n<style scoped>\n\n\/* custom css *\/\n.tdi_6{\r\n                    vertical-align: baseline;\r\n                }.tdi_6 > .wpb_wrapper,\r\n\t\t\t\t.tdi_6 > .wpb_wrapper > .tdc-elements{\r\n\t\t\t\t    display: block;\r\n\t\t\t\t}.tdi_6 > .wpb_wrapper > .tdc-elements{\r\n\t\t\t\t    width: 100%;\r\n\t\t\t\t}.tdi_6 > .wpb_wrapper > .vc_row_inner{\r\n\t\t\t\t    width: auto;\r\n\t\t\t\t}.tdi_6 > .wpb_wrapper{\r\n\t\t\t\t    width: auto;\r\n\t\t\t\t    height: auto;\r\n\t\t\t\t}\n<\/style><div class=\"wpb_wrapper\" ><div class=\"wpb_wrapper td_block_wrap vc_raw_html tdi_8 \">\n<style scoped>\n\n\/* inline tdc_css att *\/\n\n.tdi_8{\npadding-top:20px !important;\n}\n\n<\/style><div class=\"td-fix-index\"><!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n<meta charset=\"UTF-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n<title>Math Solver<\/title>\r\n<link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/KaTeX\/0.16.9\/katex.min.css\">\r\n<script src=\"https:\/\/www.ezcalculatoronline.com\/EZ\/math.min.js\"><\/script>\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/KaTeX\/0.16.9\/katex.min.js\"><\/script>\r\n<style>\r\n\/* ===== Math Solver \u2014 every rule is scoped under #ezms so it is safe inside WordPress themes ===== *\/\r\n#ezms{--p:#4f46e5;--p2:#06b6d4;--ink:#0f172a;--muted:#64748b;--line:#e2e8f0;--soft:#f8fafc;--ok:#059669;--err:#dc2626;\r\n  font-family:system-ui,-apple-system,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif;color:var(--ink);max-width:880px;margin:0 auto;line-height:1.5;font-size:16px;text-align:left}\r\n#ezms *,#ezms *::before,#ezms *::after{box-sizing:border-box}\r\n#ezms [hidden]{display:none!important}\r\n#ezms button{font:inherit;text-transform:none;letter-spacing:normal;line-height:1.2;margin:0;box-shadow:none;min-height:0}\r\n#ezms input{font:inherit;margin:0;max-width:none;box-shadow:none}\r\n#ezms h1,#ezms h2,#ezms h3{margin:0;padding:0;border:0;letter-spacing:normal;text-transform:none}\r\n#ezms .ezms-shell{background:#fff;border:1px solid var(--line);border-radius:20px;box-shadow:0 12px 32px rgba(15,23,42,.08);overflow:hidden}\r\n#ezms .ezms-head{background:linear-gradient(135deg,#4f46e5 0%,#06b6d4 100%);color:#fff;padding:22px 24px;display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap}\r\n#ezms .ezms-head h1{font-size:1.65rem;font-weight:800;color:#fff;line-height:1.2}\r\n#ezms .ezms-head p{margin:4px 0 0;color:rgba(255,255,255,.92);font-size:.95rem}\r\n#ezms .ezms-seg{display:inline-flex;background:rgba(255,255,255,.2);border-radius:999px;padding:3px}\r\n#ezms .ezms-seg button{border:0;background:transparent;color:#fff;padding:7px 14px;border-radius:999px;cursor:pointer;font-weight:700;font-size:.82rem}\r\n#ezms .ezms-seg button[aria-pressed=\"true\"]{background:#fff;color:var(--p)}\r\n#ezms .ezms-body{padding:22px 24px 26px}\r\n#ezms .ezms-label{display:block;font-weight:700;font-size:.95rem;margin-bottom:8px;color:#334155}\r\n#ezms .ezms-inputwrap{border:2px solid var(--line);border-radius:14px;background:#fff;transition:border-color .2s,box-shadow .2s}\r\n#ezms .ezms-inputwrap:focus-within{border-color:var(--p);box-shadow:0 0 0 4px rgba(79,70,229,.12)}\r\n#ezms .ezms-input{display:block;width:100%;border:0;outline:0;background:transparent;padding:14px 16px 6px;height:auto;\r\n  font:500 1.25rem\/1.4 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;color:var(--ink)}\r\n#ezms .ezms-preview{min-height:46px;padding:2px 16px 12px;display:flex;align-items:center;gap:10px;color:var(--muted);font-size:1.08rem;overflow-x:auto;white-space:nowrap}\r\n#ezms .ezms-tag{flex:none;font-size:.7rem;font-weight:800;text-transform:uppercase;letter-spacing:.05em;padding:3px 8px;border-radius:999px;background:#eef2ff;color:var(--p)}\r\n#ezms .ezms-tag.is-wait{background:#f1f5f9;color:var(--muted)}\r\n#ezms .ezms-pv{color:var(--ink)}\r\n#ezms .ezms-actions{display:flex;gap:10px;margin-top:14px;flex-wrap:wrap}\r\n#ezms .ezms-btn{border:0;border-radius:12px;padding:12px 18px;font-weight:700;cursor:pointer;transition:transform .15s,box-shadow .15s,background .15s}\r\n#ezms .ezms-btn-primary{flex:1 1 180px;background:linear-gradient(135deg,#4f46e5,#7c3aed);color:#fff;font-size:1.05rem}\r\n#ezms .ezms-btn-primary:hover{transform:translateY(-1px);box-shadow:0 8px 20px rgba(79,70,229,.3)}\r\n#ezms .ezms-btn-ghost{background:var(--soft);color:#475569;border:1px solid var(--line)}\r\n#ezms .ezms-btn-ghost:hover{background:#eef2f7}\r\n\/* keyboard *\/\r\n#ezms .ezms-kb{margin-top:14px;border:1px solid var(--line);border-radius:14px;padding:10px;background:var(--soft)}\r\n#ezms .ezms-kb-tabs{display:flex;gap:6px;margin-bottom:10px}\r\n#ezms .ezms-kb-tabs button{border:1px solid var(--line);background:#fff;color:#475569;border-radius:999px;padding:6px 14px;font-weight:700;font-size:.85rem;cursor:pointer}\r\n#ezms .ezms-kb-tabs button.is-on{background:var(--p);border-color:var(--p);color:#fff}\r\n#ezms .ezms-keys{display:grid;grid-template-columns:repeat(6,1fr);gap:6px}\r\n#ezms .ezms-key{min-height:44px;padding:6px 4px;border-radius:10px;border:1px solid var(--line);background:#fff;color:var(--ink);font-weight:650;font-size:1rem;cursor:pointer;\r\n  transition:transform .1s,background .15s;-webkit-tap-highlight-color:transparent;user-select:none}\r\n#ezms .ezms-key:hover{background:#f1f5f9}\r\n#ezms .ezms-key:active{transform:scale(.96)}\r\n#ezms .ezms-key.op{background:#eef2ff;color:#4338ca;border-color:#e0e7ff}\r\n#ezms .ezms-key.fn{background:#ecfeff;color:#0e7490;border-color:#cffafe;font-size:.92rem}\r\n#ezms .ezms-key.var{background:#fff7ed;color:#c2410c;border-color:#ffedd5;font-style:italic}\r\n#ezms .ezms-key.act{background:#fff1f2;color:#be123c;border-color:#ffe4e6}\r\n#ezms .ezms-key.go{background:var(--p);color:#fff;border-color:var(--p)}\r\n#ezms .ezms-key.wide{grid-column:span 2}\r\n\/* results *\/\r\n#ezms .ezms-results{margin-top:20px;display:grid;gap:12px}\r\n#ezms .ezms-results:empty{display:none}\r\n#ezms .ezms-card{border:1px solid var(--line);border-left:4px solid var(--accent,#4f46e5);border-radius:14px;background:#fff;overflow:hidden;animation:ezmsIn .25s ease}\r\n@keyframes ezmsIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}\r\n#ezms .ezms-card>header{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:9px 14px;background:var(--soft);border-bottom:1px solid var(--line)}\r\n#ezms .ezms-card h3{font-size:.92rem;font-weight:800;color:#334155;display:flex;gap:8px;align-items:center}\r\n#ezms .ezms-card-body{padding:14px;overflow-x:auto}\r\n#ezms .ezms-copy{border:1px solid var(--line);background:#fff;color:#475569;border-radius:8px;padding:4px 10px;font-size:.78rem;font-weight:700;cursor:pointer;flex:none}\r\n#ezms .ezms-copy:hover{border-color:var(--p);color:var(--p)}\r\n#ezms .ezms-big{font-size:1.45rem;padding:4px 0}\r\n#ezms .ezms-row{display:grid;grid-template-columns:150px 1fr;gap:10px;padding:8px 0;border-bottom:1px dashed var(--line);align-items:center}\r\n#ezms .ezms-row:last-child{border-bottom:0}\r\n#ezms .ezms-k{font-size:.82rem;font-weight:700;color:var(--muted)}\r\n#ezms .ezms-v{font-size:1.08rem;min-width:0;overflow-x:auto}\r\n#ezms .ezms-muted{color:var(--muted);font-size:.92rem}\r\n#ezms .ezms-err{color:var(--err)}\r\n#ezms .ezms-ok{color:var(--ok);font-weight:700;margin:6px 0}\r\n#ezms .ezms-warn{color:#b45309;background:#fffbeb;border:1px solid #fde68a;border-radius:10px;padding:10px 12px;margin:8px 0 0}\r\n#ezms .ezms-note{color:var(--muted);font-size:.86rem;margin:10px 0 0}\r\n#ezms .ezms-code{font-family:ui-monospace,Menlo,Consolas,monospace;background:#f1f5f9;padding:1px 6px;border-radius:6px}\r\n#ezms .ezms-steps{list-style:none;counter-reset:st;margin:0 0 12px;padding:0}\r\n#ezms .ezms-steps li{counter-increment:st;position:relative;padding:8px 0 8px 36px;border-bottom:1px dashed var(--line)}\r\n#ezms .ezms-steps li::before{content:counter(st);position:absolute;left:0;top:8px;width:24px;height:24px;border-radius:50%;background:#eef2ff;color:var(--p);font-weight:800;font-size:.8rem;display:flex;align-items:center;justify-content:center}\r\n#ezms .ezms-step-t{font-size:.85rem;font-weight:700;color:#475569;margin-bottom:2px}\r\n#ezms .ezms-step-m{font-size:1.06rem;overflow-x:auto}\r\n#ezms .ezms-sols{display:flex;flex-wrap:wrap;gap:8px}\r\n#ezms .ezms-sol{display:inline-flex;align-items:center;gap:8px;background:#ecfdf5;border:1px solid #a7f3d0;border-radius:12px;padding:8px 12px;font-size:1.1rem;max-width:100%;overflow-x:auto}\r\n#ezms .ezms-sol.is-complex{background:#f5f3ff;border-color:#ddd6fe}\r\n#ezms .ezms-badge{font-size:.7rem;font-weight:800;background:#d1fae5;color:#047857;border-radius:999px;padding:2px 7px}\r\n#ezms .ezms-badge.c{background:#ede9fe;color:#6d28d9}\r\n#ezms .ezms-varbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:.88rem;color:#475569;font-weight:600}\r\n#ezms .ezms-chips{display:flex;flex-wrap:wrap;gap:8px}\r\n#ezms .ezms-chip{border:1px solid var(--line);background:#fff;border-radius:999px;padding:6px 12px;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:.88rem;color:#334155;cursor:pointer;transition:all .15s}\r\n#ezms .ezms-chip:hover{border-color:var(--accent,var(--p));color:var(--accent,var(--p));transform:translateY(-1px)}\r\n#ezms .ezms-chip.is-on{background:var(--p);border-color:var(--p);color:#fff}\r\n#ezms .ezms-field{display:inline-flex;align-items:center;gap:6px;font-weight:700;color:#475569;font-size:.9rem}\r\n#ezms .ezms-field input,#ezms .ezms-int input{width:90px;padding:7px 10px;border:1px solid var(--line);border-radius:9px;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:.95rem;background:#fff;color:var(--ink);height:auto}\r\n#ezms .ezms-field input:focus,#ezms .ezms-int input:focus{outline:0;border-color:var(--p);box-shadow:0 0 0 3px rgba(79,70,229,.12)}\r\n#ezms input.is-bad{border-color:var(--err)!important;background:#fef2f2}\r\n#ezms .ezms-evalgrid{display:flex;flex-wrap:wrap;gap:10px 16px;margin-bottom:12px}\r\n#ezms .ezms-out{font-size:1.15rem;padding:10px 12px;background:var(--soft);border-radius:10px;overflow-x:auto;min-height:44px}\r\n#ezms .ezms-int{display:flex;flex-wrap:wrap;align-items:center;gap:8px;font-size:.9rem;color:#475569;font-weight:600}\r\n#ezms .ezms-int .ezms-out{flex:1 1 100%}\r\n#ezms .ezms-plot{position:relative;border:1px solid var(--line);border-radius:12px;overflow:hidden;background:#fff}\r\n#ezms .ezms-plot canvas{display:block;width:100%;height:320px;touch-action:pan-y;cursor:grab}\r\n#ezms .ezms-plot canvas:active{cursor:grabbing}\r\n#ezms .ezms-plot-tools{position:absolute;top:8px;right:8px;display:flex;gap:4px}\r\n#ezms .ezms-plot-tools button{width:32px;height:32px;border-radius:8px;border:1px solid var(--line);background:rgba(255,255,255,.95);color:#334155;font-weight:800;cursor:pointer;padding:0}\r\n#ezms .ezms-plot-tools button:hover{border-color:var(--p);color:var(--p)}\r\n#ezms .ezms-legend{display:flex;flex-wrap:wrap;gap:14px;margin-top:10px;font-size:.88rem;color:#475569;align-items:center}\r\n#ezms .ezms-legend i{display:inline-block;width:18px;height:3px;border-radius:2px;vertical-align:middle;margin-right:6px}\r\n#ezms .ezms-legend label{cursor:pointer;display:inline-flex;align-items:center;gap:6px}\r\n#ezms .ezms-hint{font-size:.78rem;color:var(--muted);margin:6px 0 0}\r\n\/* panels *\/\r\n#ezms .ezms-panel{margin-top:22px;padding:16px;border:1px solid var(--line);border-radius:14px;background:#fff}\r\n#ezms .ezms-panel h2{font-size:1.05rem;font-weight:800;color:#1e293b;margin-bottom:12px}\r\n#ezms .ezms-panel-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}\r\n#ezms .ezms-panel-head h2{margin:0}\r\n#ezms .ezms-link{border:0;background:none;color:var(--muted);font-size:.82rem;font-weight:700;cursor:pointer;padding:4px}\r\n#ezms .ezms-link:hover{color:var(--err)}\r\n#ezms .ezms-exgroup{margin-bottom:14px}\r\n#ezms .ezms-exgroup:last-child{margin-bottom:0}\r\n#ezms .ezms-exgroup h3{font-size:.9rem;font-weight:800;color:var(--accent);margin-bottom:8px}\r\n#ezms .ezms-help{margin-top:16px;border:1px solid var(--line);border-radius:14px;padding:12px 16px;background:var(--soft)}\r\n#ezms .ezms-help summary{cursor:pointer;font-weight:800;color:#1e293b}\r\n#ezms .ezms-help table{width:100%;border-collapse:collapse;margin-top:10px;font-size:.9rem}\r\n#ezms .ezms-help td{padding:6px 8px;border-bottom:1px solid var(--line);vertical-align:top}\r\n#ezms .ezms-help td:first-child{color:#475569;font-weight:700;width:38%}\r\n#ezms .ezms-help code{font-family:ui-monospace,Menlo,Consolas,monospace;background:#fff;border:1px solid var(--line);padding:1px 6px;border-radius:6px}\r\n#ezms .katex{font-size:1.08em}\r\n@media (max-width:600px){\r\n  #ezms .ezms-head{padding:18px}\r\n  #ezms .ezms-head h1{font-size:1.35rem}\r\n  #ezms .ezms-body{padding:16px}\r\n  #ezms .ezms-key{min-height:42px;font-size:.92rem}\r\n  #ezms .ezms-key.fn{font-size:.8rem}\r\n  #ezms .ezms-row{grid-template-columns:1fr;gap:2px}\r\n  #ezms .ezms-plot canvas{height:260px}\r\n  #ezms .ezms-big{font-size:1.2rem}\r\n}\r\n<\/style>\r\n<\/head>\r\n<body>\r\n<div id=\"ezms\" class=\"ezms\">\r\n  <div class=\"ezms-shell\">\r\n    <header class=\"ezms-head\">\r\n      <div>\r\n        <h1>\ud83e\uddee Math Solver<\/h1>\r\n        <p>Calculate, simplify, factor, solve equations, differentiate, integrate &amp; graph<\/p>\r\n      <\/div>\r\n      <div class=\"ezms-seg\" role=\"group\" aria-label=\"Angle unit\">\r\n        <button type=\"button\" data-angle=\"rad\" aria-pressed=\"true\">RAD<\/button>\r\n        <button type=\"button\" data-angle=\"deg\" aria-pressed=\"false\">DEG<\/button>\r\n      <\/div>\r\n    <\/header>\r\n\r\n    <div class=\"ezms-body\">\r\n      <label for=\"ezms-input\" class=\"ezms-label\">Enter an expression or equation<\/label>\r\n      <div class=\"ezms-inputwrap\">\r\n        <input id=\"ezms-input\" class=\"ezms-input\" type=\"text\"\r\n               placeholder=\"e.g. x^2 - 5x + 6 = 0,  sqrt(72),  sin(x)\/x\"\r\n               autocomplete=\"off\" autocapitalize=\"off\" autocorrect=\"off\" spellcheck=\"false\" enterkeyhint=\"go\">\r\n        <div id=\"ezms-preview\" class=\"ezms-preview\" aria-live=\"polite\"><\/div>\r\n      <\/div>\r\n\r\n      <div class=\"ezms-actions\">\r\n        <button type=\"button\" id=\"ezms-solve\" class=\"ezms-btn ezms-btn-primary\">\ud83d\ude80 Solve<\/button>\r\n        <button type=\"button\" id=\"ezms-kbtoggle\" class=\"ezms-btn ezms-btn-ghost\" aria-expanded=\"true\" aria-controls=\"ezms-kb\">\u2328\ufe0f Keyboard<\/button>\r\n        <button type=\"button\" id=\"ezms-clear\" class=\"ezms-btn ezms-btn-ghost\">\ud83d\uddd1\ufe0f Clear<\/button>\r\n      <\/div>\r\n\r\n      <div class=\"ezms-kb\" id=\"ezms-kb\">\r\n        <div class=\"ezms-kb-tabs\">\r\n          <button type=\"button\" data-kbtab=\"basic\" class=\"is-on\">123<\/button>\r\n          <button type=\"button\" data-kbtab=\"func\">f(x)<\/button>\r\n          <button type=\"button\" data-kbtab=\"abc\">abc<\/button>\r\n        <\/div>\r\n        <div class=\"ezms-keys\" id=\"ezms-keys\"><\/div>\r\n      <\/div>\r\n\r\n      <div id=\"ezms-results\" class=\"ezms-results\" aria-live=\"polite\"><\/div>\r\n\r\n      <div class=\"ezms-panel\" id=\"ezms-history-wrap\" hidden>\r\n        <div class=\"ezms-panel-head\"><h2>\ud83d\udd58 Recent<\/h2><button type=\"button\" class=\"ezms-link\" data-hist-clear>Clear history<\/button><\/div>\r\n        <div id=\"ezms-history\" class=\"ezms-chips\"><\/div>\r\n      <\/div>\r\n\r\n      <div class=\"ezms-panel\">\r\n        <h2>\ud83d\udca1 Try these examples<\/h2>\r\n        <div id=\"ezms-examples\"><\/div>\r\n      <\/div>\r\n\r\n      <details class=\"ezms-help\">\r\n        <summary>\ud83d\udcd8 Syntax tips<\/summary>\r\n        <table>\r\n          <tr><td>Multiplication<\/td><td><code>2x<\/code>, <code>2*x<\/code>, <code>3(x+1)<\/code><\/td><\/tr>\r\n          <tr><td>Powers &amp; roots<\/td><td><code>x^2<\/code>, <code>sqrt(x)<\/code>, <code>cbrt(x)<\/code>, <code>nthRoot(x, n)<\/code><\/td><\/tr>\r\n          <tr><td>Logarithms<\/td><td><code>ln(x)<\/code> or <code>log(x)<\/code> = natural log, <code>log10(x)<\/code>, <code>log(x, base)<\/code><\/td><\/tr>\r\n          <tr><td>Trigonometry<\/td><td><code>sin cos tan asin acos atan sinh cosh tanh<\/code> \u2014 switch RAD \/ DEG at the top<\/td><\/tr>\r\n          <tr><td>Constants<\/td><td><code>pi<\/code> (\u03c0), <code>e<\/code>, <code>i<\/code> (imaginary unit)<\/td><\/tr>\r\n          <tr><td>Equations<\/td><td>Use one <code>=<\/code>, e.g. <code>x^2 - 5x + 6 = 0<\/code>, <code>2x + 3y = 12<\/code><\/td><\/tr>\r\n          <tr><td>Functions<\/td><td><code>f(x) = x^3 - 3x<\/code> or <code>y = sin(x)<\/code> to analyse &amp; graph<\/td><\/tr>\r\n          <tr><td>Other<\/td><td><code>5!<\/code>, <code>17 mod 5<\/code>, <code>combinations(5, 2)<\/code>, <code>5 cm to inch<\/code><\/td><\/tr>\r\n        <\/table>\r\n      <\/details>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<script>\r\n(function () {\r\n  'use strict';\r\n  const root = document.getElementById('ezms');\r\n  if (!root) return;\r\n  const $ = s => root.querySelector(s);\r\n  const input = $('#ezms-input'), previewEl = $('#ezms-preview'), resultsEl = $('#ezms-results'),\r\n        keysEl = $('#ezms-keys'), kbEl = $('#ezms-kb'), histWrap = $('#ezms-history-wrap'),\r\n        histEl = $('#ezms-history'), exEl = $('#ezms-examples');\r\n  const M = window.math;\r\n  const coarse = !!(window.matchMedia && matchMedia('(pointer: coarse)').matches);\r\n\r\n  const state = { angle: 'rad', primary: null, evalVals: {}, evalRaw: {}, intA: '0', intB: '1',\r\n                  plots: [], live: null, last: null, kbTab: 'basic', showD: true };\r\n  let S = {};            \/\/ shared evaluation scope (trig overrides + values of other variables)\r\n  let plotSeq = 0;\r\n\r\n  \/* ================= helpers ================= *\/\r\n  const esc = s => String(s).replace(\/[&<>\"']\/g, c => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]));\r\n  const cmpKey = s => String(s).replace(\/[\\s*]\/g, '');\r\n  function tex(t, plain) {\r\n    if (window.katex && t) { try { return window.katex.renderToString(t, { throwOnError: false }); } catch (e) { \/* fall through *\/ } }\r\n    return '<code class=\"ezms-code\">' + esc(plain != null ? plain : t) + '<\/code>';\r\n  }\r\n  function card(title, body, o) {\r\n    o = o || {};\r\n    return '<section class=\"ezms-card\" style=\"--accent:' + (o.accent || '#4f46e5') + '\"><header><h3>' +\r\n      (o.icon ? '<span aria-hidden=\"true\">' + o.icon + '<\/span>' : '') + esc(title) + '<\/h3>' +\r\n      (o.copy != null ? '<button type=\"button\" class=\"ezms-copy\" data-copy=\"' + esc(o.copy) + '\">Copy<\/button>' : '') +\r\n      '<\/header><div class=\"ezms-card-body\">' + body + '<\/div><\/section>';\r\n  }\r\n  const row = (k, v) => '<div class=\"ezms-row\"><div class=\"ezms-k\">' + esc(k) + '<\/div><div class=\"ezms-v\">' + v + '<\/div><\/div>';\r\n  function errCard(e) {\r\n    let msg = (e && e.message) || String(e);\r\n    return card('Could not solve that', '<p class=\"ezms-err\">' + esc(msg) + '<\/p><p class=\"ezms-note\">Tips: use <code class=\"ezms-code\">*<\/code> or juxtaposition for multiplication (<code class=\"ezms-code\">2x<\/code>), <code class=\"ezms-code\">^<\/code> for powers, and check that every bracket is closed.<\/p>', { icon: '\u26a0\ufe0f', accent: '#dc2626' });\r\n  }\r\n\r\n  if (!M) { resultsEl.innerHTML = card('Error', '<p class=\"ezms-err\">The math library (math.js) could not be loaded. Please reload the page.<\/p>', { accent: '#dc2626' }); return; }\r\n\r\n  const nt = n => n.toTex({ parenthesis: 'auto', implicit: 'hide' });\r\n  const ns = n => n.toString({ parenthesis: 'auto', implicit: 'hide' });\r\n  function varTex(v) { try { return M.parse(v).toTex(); } catch (e) { return v; } }\r\n\r\n  \/* ---------- numbers ---------- *\/\r\n  function gcd(a, b) { a = Math.abs(a); b = Math.abs(b); while (b) { const t = a % b; a = b; b = t; } return a; }\r\n  function lcm(a, b) { return a \/ gcd(a, b) * b; }\r\n  function clean(x) { if (!isFinite(x)) return x; const r = Math.round(x); const v = Math.abs(x - r) < 1e-9 * Math.max(1, Math.abs(x)) ? r : x; return v === 0 ? 0 : v; }\r\n  function approxFrac(x, maxDen) {\r\n    if (!isFinite(x)) return null;\r\n    const sign = x < 0 ? -1 : 1; x = Math.abs(x);\r\n    let h1 = 1, h0 = 0, k1 = 0, k0 = 1, b = x;\r\n    for (let i = 0; i < 40; i++) {\r\n      const a = Math.floor(b), h2 = a * h1 + h0, k2 = a * k1 + k0;\r\n      if (k2 > maxDen) break;\r\n      h0 = h1; h1 = h2; k0 = k1; k1 = k2;\r\n      if (Math.abs(x - h1 \/ k1) <= 1e-9 * Math.max(1, x)) return [sign * h1, k1];\r\n      const f = b - a; if (f < 1e-15) break; b = 1 \/ f;\r\n    }\r\n    return null;\r\n  }\r\n  function simplifySqrt(n) { let k = 1; for (let i = 2; i * i <= n; i++) while (n % (i * i) === 0) { n \/= i * i; k *= i; } return [k, n]; }\r\n  const fmt = v => M.format(v, { precision: 12 });\r\n  function fmtTex(v) {\r\n    if (v === Infinity) return '\\\\infty'; if (v === -Infinity) return '-\\\\infty';\r\n    if (typeof v === 'number' && isNaN(v)) return '\\\\text{undefined}';\r\n    return String(fmt(v)).replace(\/e\\+?(-?\\d+)\/g, ' \\\\times 10^{$1}');\r\n  }\r\n  const fracTex = (n, d) => d === 1 ? String(n) : (n < 0 ? '-' : '') + '\\\\frac{' + Math.abs(n) + '}{' + d + '}';\r\n  function fracParts(v, maxDen) { if (Math.abs(v) < 1e-13) return [0, 1]; return approxFrac(v, maxDen || 10000); }\r\n  function numTex(v, maxDen) { const f = fracParts(v, maxDen); return f ? fracTex(f[0], f[1]) : fmtTex(v); }\r\n  function numStr(v, maxDen) { const f = fracParts(v, maxDen); if (!f) return String(fmt(v)); return f[1] === 1 ? String(f[0]) : f[0] + '\/' + f[1]; }\r\n  const par = t => \/^-\/.test(t) ? '\\\\left(' + t + '\\\\right)' : t;\r\n\r\n  \/\/ Recognise \"nice\" closed forms: fractions, multiples of \u03c0, square roots\r\n  function exactTex(v) {\r\n    if (!isFinite(v) || Number.isInteger(v) || Math.abs(v) < 1e-12) return null;\r\n    let f = approxFrac(v, 1000);\r\n    if (f) return { tex: fracTex(f[0], f[1]), plain: f[0] + '\/' + f[1] };\r\n    f = approxFrac(v \/ Math.PI, 24);\r\n    if (f && f[0] !== 0) {\r\n      const [n, d] = f, s = n < 0 ? '-' : '', an = Math.abs(n);\r\n      return { tex: s + (d === 1 ? (an === 1 ? '\\\\pi' : an + '\\\\pi') : '\\\\frac{' + (an === 1 ? '' : an) + '\\\\pi}{' + d + '}'),\r\n               plain: s + (an === 1 ? '' : an) + '\u03c0' + (d === 1 ? '' : '\/' + d) };\r\n    }\r\n    f = approxFrac(v * v, 500);\r\n    if (f && f[0] * f[1] < 1e9) {\r\n      const [n, d] = f, [k, m] = simplifySqrt(n * d);\r\n      if (m > 1) {\r\n        const g = gcd(k, d), num = k \/ g, den = d \/ g, s = v < 0 ? '-' : '', co = num === 1 ? '' : String(num);\r\n        return { tex: s + (den === 1 ? co + '\\\\sqrt{' + m + '}' : '\\\\frac{' + co + '\\\\sqrt{' + m + '}}{' + den + '}'),\r\n                 plain: s + co + '\u221a' + m + (den === 1 ? '' : '\/' + den) };\r\n      }\r\n    }\r\n    return null;\r\n  }\r\n\r\n  function toReal(y) {\r\n    if (typeof y === 'number') return y;\r\n    if (y == null) return NaN;\r\n    if (M.isComplex(y)) return Math.abs(y.im) <= 1e-12 * (1 + Math.abs(y.re)) ? y.re : NaN;\r\n    if (M.isBigNumber(y) || M.isFraction(y)) return Number(y.valueOf());\r\n    if (typeof y === 'boolean') return y ? 1 : 0;\r\n    return NaN;\r\n  }\r\n  function valueTex(v) {\r\n    if (typeof v === 'number') return fmtTex(v);\r\n    if (typeof v === 'boolean') return '\\\\text{' + v + '}';\r\n    if (M.isMatrix(v) || Array.isArray(v)) { try { return M.parse(M.format(v, { precision: 10 })).toTex(); } catch (e) { \/* ignore *\/ } }\r\n    const s = String(M.format(v, { precision: 12 }));\r\n    if (M.isComplex(v) || M.isBigNumber(v) || M.isFraction(v)) return s.replace(\/e\\+?(-?\\d+)\/g, ' \\\\times 10^{$1}');\r\n    return '\\\\text{' + s.replace(\/[\\\\{}$&#_%^~]\/g, '\\\\$&') + '}';\r\n  }\r\n  const valuePlain = v => String(M.format(v, { precision: 14 }));\r\n\r\n  \/* ---------- angle mode ---------- *\/\r\n  function trigScope() {\r\n    if (state.angle !== 'deg') return {};\r\n    const d = Math.PI \/ 180, isU = x => M.isUnit(x), o = {};\r\n    ['sin', 'cos', 'tan', 'sec', 'csc', 'cot'].forEach(n => { o[n] = x => isU(x) ? M[n](x) : M[n](M.multiply(x, d)); });\r\n    ['asin', 'acos', 'atan', 'asec', 'acsc', 'acot', 'atan2'].forEach(n => { o[n] = (...a) => M.multiply(M[n](...a), 1 \/ d); });\r\n    return o;\r\n  }\r\n\r\n  \/* ---------- parsing ---------- *\/\r\n  const CONSTS = new Set(['pi', 'e', 'i', 'E', 'PI', 'tau', 'phi', 'Infinity', 'NaN', 'true', 'false', 'null', 'LN2', 'LN10', 'LOG2E', 'LOG10E', 'SQRT2', 'SQRT1_2']);\r\n  function isVarName(name) {\r\n    if (CONSTS.has(name)) return false;\r\n    if ([...name].length === 1) return true;\r\n    if (name in M) return false;\r\n    try { if (M.Unit && M.Unit.isValuelessUnit(name)) return false; } catch (e) { \/* ignore *\/ }\r\n    return true;\r\n  }\r\n  const PREF = ['x', 'y', 'z', 't', '\u03b8', 'theta', 'a', 'b', 'c', 'n', 'k'];\r\n  function sortVars(arr) {\r\n    return arr.sort((a, b) => { const ia = PREF.indexOf(a), ib = PREF.indexOf(b);\r\n      if (ia !== -1 || ib !== -1) return (ia === -1 ? 99 : ia) - (ib === -1 ? 99 : ib); return a < b ? -1 : 1; });\r\n  }\r\n  function getVars(node) {\r\n    const set = new Set();\r\n    node.traverse((n, path, parent) => {\r\n      if (n.isSymbolNode && !(parent && parent.isFunctionNode && path === 'fn') && isVarName(n.name)) set.add(n.name);\r\n    });\r\n    return sortVars([...set]);\r\n  }\r\n  const dependsOn = (node, v) => node.filter(n => n.isSymbolNode && n.name === v).length > 0;\r\n  function normalize(s) {\r\n    return s.replace(\/[\u00d7\u2715\u22c5\u00b7]\/g, '*').replace(\/\u00f7\/g, '\/').replace(\/[\u2212\u2013\u2014]\/g, '-')\r\n      .replace(\/\u221a\\s*\\(\/g, 'sqrt(').replace(\/\u221b\\s*\\(\/g, 'cbrt(')\r\n      .replace(\/\u221a\\s*([0-9.]+|[a-zA-Z\u03c0\u03b8])\/g, 'sqrt($1)').replace(\/\u221b\\s*([0-9.]+|[a-zA-Z\u03c0\u03b8])\/g, 'cbrt($1)')\r\n      .replace(\/\u03c0\/g, 'pi').replace(\/\u221e\/g, 'Infinity').replace(\/\u00b2\/g, '^2').replace(\/\u00b3\/g, '^3')\r\n      .replace(\/\\bln\\s*\\(\/g, 'log(').replace(\/\\barc(sin|cos|tan)\\s*\\(\/g, 'a$1(')\r\n      .replace(\/\\*\\*\/g, '^').replace(\/\u2260\/g, '!=').trim();\r\n  }\r\n  function splitEq(s) {\r\n    const parts = s.split(\/(?<![<>!=])=(?!=)\/);\r\n    if (parts.length === 1) return null;\r\n    if (parts.length > 2) throw new Error('Please use only one \"=\" sign.');\r\n    if (!parts[0].trim() || !parts[1].trim()) throw new Error('Both sides of the \"=\" need an expression.');\r\n    return parts;\r\n  }\r\n  function analyze(raw) {\r\n    let s = normalize(raw), fnLabel = null;\r\n    const m = s.match(\/^([a-zA-Z]\\w*)\\s*\\(\\s*([a-zA-Z\u03b8]\\w*(?:\\s*,\\s*[a-zA-Z\u03b8]\\w*)*)\\s*\\)\\s*=(?!=)\/);\r\n    if (m) { fnLabel = m[1]; s = s.slice(m[0].length).trim(); }\r\n    const eq = fnLabel ? null : splitEq(s);\r\n    if (eq) {\r\n      const L = M.parse(eq[0]), R = M.parse(eq[1]);\r\n      if (L.isSymbolNode && isVarName(L.name)) {          \/\/ y = f(x)  \u2192 analyse as a function\r\n        const rv = getVars(R);\r\n        if (rv.length && !rv.includes(L.name)) return { type: 'expression', s: eq[1].trim(), node: R, vars: rv, fnLabel: L.name };\r\n      }\r\n      const vars = sortVars([...new Set(getVars(L).concat(getVars(R)))]);\r\n      return { type: 'equation', s, L, R, vars, node: new M.OperatorNode('-', 'subtract', [L, R]) };\r\n    }\r\n    const node = M.parse(s);\r\n    const vars = \/\\b(to|in)\\b\/.test(s) ? [] : getVars(node);\r\n    return { type: vars.length ? 'expression' : 'numeric', s, node, vars, fnLabel };\r\n  }\r\n\r\n  let RULES = null;\r\n  function simp(node) {\r\n    try { if (!RULES) RULES = M.simplify.rules.concat(['sin(n)^2 + cos(n)^2 -> 1', 'cos(n)^2 + sin(n)^2 -> 1']); return M.simplify(node, RULES); }\r\n    catch (e) { try { return M.simplify(node); } catch (e2) { return node; } }\r\n  }\r\n\r\n  \/* ---------- polynomials ---------- *\/\r\n  function padd(a, b) { const r = []; for (let i = 0; i < Math.max(a.length, b.length); i++) r.push((a[i] || 0) + (b[i] || 0)); return r; }\r\n  function pmul(a, b) { const r = new Array(a.length + b.length - 1).fill(0); a.forEach((x, i) => b.forEach((y, j) => { r[i + j] += x * y; })); return r; }\r\n  function ptrim(c) { c = c.map(clean); const mx = Math.max(...c.map(Math.abs), 1e-300); while (c.length > 1 && Math.abs(c[c.length - 1]) < 1e-12 * Math.max(1, mx)) c.pop(); return c; }\r\n  const horner = (c, x) => { let r = 0; for (let i = c.length - 1; i >= 0; i--) r = r * x + c[i]; return r; };\r\n  function polyOf(node, v) {\r\n    const P = n => {\r\n      if (n.isParenthesisNode) return P(n.content);\r\n      if (n.isConstantNode) { const val = Number(n.value); return isFinite(val) ? [val] : null; }\r\n      if (n.isSymbolNode) {\r\n        if (n.name === v) return [0, 1];\r\n        if (isVarName(n.name)) return null;\r\n        try { const val = M.evaluate(n.name); return typeof val === 'number' ? [val] : null; } catch (e) { return null; }\r\n      }\r\n      if (n.isOperatorNode) {\r\n        const a = n.args;\r\n        if (a.length === 1) { const p = P(a[0]); if (!p) return null; if (n.op === '-') return p.map(x => -x); return n.op === '+' ? p : null; }\r\n        const L = P(a[0]), R = P(a[1]); if (!L || !R) return null;\r\n        switch (n.op) {\r\n          case '+': return padd(L, R);\r\n          case '-': return padd(L, R.map(x => -x));\r\n          case '*': return pmul(L, R);\r\n          case '\/': return (R.length === 1 && R[0] !== 0) ? L.map(x => x \/ R[0]) : null;\r\n          case '^': { if (R.length !== 1) return null; const e = R[0]; if (!Number.isInteger(e) || e < 0 || e > 30) return null;\r\n            let r = [1]; for (let i = 0; i < e; i++) r = pmul(r, L); return r; }\r\n        }\r\n        return null;\r\n      }\r\n      if (n.isFunctionNode) {\r\n        if (dependsOn(n, v)) return null;\r\n        try { const val = n.compile().evaluate(trigScope()); return (typeof val === 'number' && isFinite(val)) ? [val] : null; } catch (e) { return null; }\r\n      }\r\n      return null;\r\n    };\r\n    const r = P(node); return r ? ptrim(r) : null;\r\n  }\r\n  function polyFormat(c, v, plain) {\r\n    const V = plain ? v : varTex(v); let out = '';\r\n    for (let i = c.length - 1; i >= 0; i--) {\r\n      const k = c[i]; if (Math.abs(k) < 1e-12) continue;\r\n      const neg = k < 0, a = Math.abs(k), co = plain ? numStr(a) : numTex(a);\r\n      const pw = i === 0 ? '' : i === 1 ? V : plain ? V + '^' + i : V + '^{' + i + '}';\r\n      let term;\r\n      if (i === 0) term = co;\r\n      else if (co === '1') term = pw;\r\n      else if (plain && \/[\\\/e ]\/.test(co)) term = '(' + co + ')' + pw;\r\n      else term = co + pw;\r\n      out += out ? (neg ? ' - ' : ' + ') : (neg ? '-' : '');\r\n      out += term;\r\n    }\r\n    return out || '0';\r\n  }\r\n  function toIntPoly(coeffs) {\r\n    const fr = coeffs.map(c => fracParts(c, 100000)); if (fr.some(f => !f)) return null;\r\n    let L = 1; fr.forEach(f => { L = lcm(L, f[1]); }); if (L > 1e9) return null;\r\n    const I = fr.map(f => f[0] * (L \/ f[1])); if (I.some(x => !Number.isSafeInteger(x))) return null;\r\n    let g = I.reduce((g, x) => gcd(g, x), 0); if (!g) return null;\r\n    if (I[I.length - 1] < 0) g = -g;\r\n    const h = gcd(g, L);\r\n    return { P: I.map(x => x \/ g), content: [g \/ h, L \/ h] };\r\n  }\r\n  function divisors(n) { n = Math.abs(n); if (n > 1e10) return null; const out = []; for (let i = 1; i * i <= n; i++) if (n % i === 0) { out.push(i); if (i !== n \/ i) out.push(n \/ i); } return out.sort((a, b) => a - b); }\r\n  function evalIntPoly(P, p, q) {\r\n    const n = P.length - 1, bp = BigInt(p), bq = BigInt(q), qp = [1n];\r\n    for (let i = 1; i <= n; i++) qp.push(qp[i - 1] * bq);\r\n    let s = 0n, pp = 1n;\r\n    for (let i = 0; i <= n; i++) { s += BigInt(P[i]) * pp * qp[n - i]; pp *= bp; }\r\n    return s;\r\n  }\r\n  function divLinear(P, p, q) {          \/\/ divide by (q\u00b7x \u2212 p)\r\n    const H = P.slice().reverse(), Q = []; let prev = 0;\r\n    for (let i = 0; i < H.length - 1; i++) { const val = (H[i] + p * prev) \/ q; Q.push(Math.round(val)); prev = Math.round(val); }\r\n    return Q.reverse();\r\n  }\r\n  function factorInt(P) {\r\n    P = P.slice(); let k = 0;\r\n    while (P.length > 1 && P[0] === 0) { P.shift(); k++; }\r\n    const found = [];\r\n    outer: for (let guard = 0; guard < 60 && P.length > 1; guard++) {\r\n      const n = P.length - 1;\r\n      if (n === 1) { const g = gcd(P[1], P[0]) || 1; found.push({ p: -P[0] \/ g, q: P[1] \/ g }); P = [1]; break; }\r\n      const ps = divisors(P[0]), qs = divisors(P[n]);\r\n      if (!ps || !qs || ps.length * qs.length > 40000) break;\r\n      for (const q of qs) for (const p0 of ps) for (const p of [p0, -p0]) {\r\n        if (gcd(p, q) !== 1) continue;\r\n        if (evalIntPoly(P, p, q) === 0n) { found.push({ p, q }); P = divLinear(P, p, q); continue outer; }\r\n      }\r\n      break;\r\n    }\r\n    const lin = [];\r\n    found.forEach(f => { const e = lin.find(l => l.p === f.p && l.q === f.q); if (e) e.m++; else lin.push({ p: f.p, q: f.q, m: 1 }); });\r\n    lin.sort((a, b) => a.p \/ a.q - b.p \/ b.q);\r\n    return { k, lin, rest: P };\r\n  }\r\n  function factorInfo(poly, v) {\r\n    const R = toIntPoly(poly); if (!R) return null;\r\n    const F = factorInt(R.P), restDeg = F.rest.length - 1, V = varTex(v);\r\n    const [cn, cd] = R.content, unit = Math.abs(cn) === 1 && cd === 1;\r\n    const total = F.k + F.lin.reduce((s, l) => s + l.m, 0) + (restDeg >= 1 ? 1 : 0);\r\n    const nontrivial = total >= 2 || (!unit && poly.length > 1);\r\n    const tP = [], pP = [];\r\n    if (F.k) { tP.push(F.k === 1 ? V : V + '^{' + F.k + '}'); pP.push(F.k === 1 ? v : v + '^' + F.k); }\r\n    F.lin.forEach(l => {\r\n      const sg = l.p > 0 ? '-' : '+', ap = Math.abs(l.p), co = l.q === 1 ? '' : l.q;\r\n      tP.push('\\\\left(' + co + V + ' ' + sg + ' ' + ap + '\\\\right)' + (l.m > 1 ? '^{' + l.m + '}' : ''));\r\n      pP.push('(' + co + v + ' ' + sg + ' ' + ap + ')' + (l.m > 1 ? '^' + l.m : ''));\r\n    });\r\n    if (restDeg >= 1) {\r\n      const wrap = tP.length > 0 || !unit;\r\n      const rt = polyFormat(F.rest, v), rp = polyFormat(F.rest, v, true);\r\n      tP.push(wrap ? '\\\\left(' + rt + '\\\\right)' : rt); pP.push(wrap ? '(' + rp + ')' : rp);\r\n    }\r\n    let lt = '', lp = '';\r\n    if (!(cn === 1 && cd === 1)) {\r\n      if (cn === -1 && cd === 1) { lt = '-'; lp = '-'; }\r\n      else { lt = fracTex(cn, cd); lp = (cd === 1 ? String(cn) : '(' + cn + '\/' + cd + ')') + '*'; }\r\n    }\r\n    return { R, F, nontrivial, tex: lt + tP.join(''), plain: lp + pP.join('*') };\r\n  }\r\n  \/\/ Durand\u2013Kerner: all complex roots of a polynomial (coefficients low \u2192 high)\r\n  function dk(c) {\r\n    const n = c.length - 1; if (n < 1) return [];\r\n    if (n === 1) return [[clean(-c[0] \/ c[1]), 0]];\r\n    const a = c.map(x => x \/ c[n]);\r\n    const R = 1 + Math.max(...a.slice(0, n).map(Math.abs));\r\n    const z = []; for (let k = 0; k < n; k++) { const t = 2 * Math.PI * k \/ n + 0.4; z.push([0.9 * R * Math.cos(t), 0.9 * R * Math.sin(t)]); }\r\n    const mul = (p, q) => [p[0] * q[0] - p[1] * q[1], p[0] * q[1] + p[1] * q[0]];\r\n    const div = (p, q) => { const d = q[0] * q[0] + q[1] * q[1] || 1e-300; return [(p[0] * q[0] + p[1] * q[1]) \/ d, (p[1] * q[0] - p[0] * q[1]) \/ d]; };\r\n    const ev = w => { let r = [1, 0]; for (let i = n - 1; i >= 0; i--) { r = mul(r, w); r[0] += a[i]; } return r; };\r\n    for (let it = 0; it < 3000; it++) {\r\n      let md = 0;\r\n      for (let i = 0; i < n; i++) {\r\n        let den = [1, 0];\r\n        for (let j = 0; j < n; j++) if (j !== i) den = mul(den, [z[i][0] - z[j][0], z[i][1] - z[j][1]]);\r\n        const d = div(ev(z[i]), den); z[i] = [z[i][0] - d[0], z[i][1] - d[1]]; md = Math.max(md, Math.hypot(d[0], d[1]));\r\n      }\r\n      if (md < 1e-15 * R) break;\r\n    }\r\n    return z.map(([re, im]) => { if (Math.abs(im) < 1e-8 * (1 + Math.abs(re))) im = 0; return [clean(re), im ? clean(im) : 0]; })\r\n            .sort((p, q) => ((p[1] !== 0) - (q[1] !== 0)) || (p[0] - q[0]) || (p[1] - q[1]));\r\n  }\r\n  function realRootsPoly(c) {\r\n    const out = [];\r\n    dk(c).forEach(z => { if (z[1] === 0 && !out.some(r => Math.abs(r - z[0]) < 1e-7)) out.push(z[0]); });\r\n    return out.sort((a, b) => a - b);\r\n  }\r\n\r\n  \/* ---------- solutions ---------- *\/\r\n  function realSol(v, x) {\r\n    x = clean(x); const V = varTex(v);\r\n    if (Number.isInteger(x)) return { tex: V + ' = ' + x, plain: v + ' = ' + x, x };\r\n    const ex = exactTex(x);\r\n    if (ex) return { tex: V + ' = ' + ex.tex + ' \\\\approx ' + fmtTex(x), plain: v + ' = ' + ex.plain + ' \u2248 ' + fmt(x), x };\r\n    return { tex: V + ' \\\\approx ' + fmtTex(x), plain: v + ' \u2248 ' + fmt(x), x };\r\n  }\r\n  function cplx(re, im, plain) {\r\n    const a = Math.abs(im), ims = (plain ? fmt(a) : fmtTex(a)), ip = (a === 1 ? '' : ims) + 'i';\r\n    if (re === 0) return (im < 0 ? '-' : '') + ip;\r\n    return (plain ? fmt(re) : fmtTex(re)) + (im < 0 ? ' - ' : ' + ') + ip;\r\n  }\r\n  function dkSol(v, z) {\r\n    if (z[1] === 0) return realSol(v, z[0]);\r\n    return { tex: varTex(v) + ' \\\\approx ' + cplx(z[0], z[1]), plain: v + ' \u2248 ' + cplx(z[0], z[1], true), complex: true, x: z[0] };\r\n  }\r\n  function quadExact(A, B, C, v) {      \/\/ integer coefficients, A > 0\r\n    const D = B * B - 4 * A * C, V = varTex(v);\r\n    if (!Number.isSafeInteger(D)) return null;\r\n    if (D === 0) { const x = -B \/ (2 * A); return { pmTex: numTex(x), sols: [{ tex: V + ' = ' + numTex(x), plain: v + ' = ' + numStr(x), x, mult: 2 }] }; }\r\n    const [k, m] = simplifySqrt(Math.abs(D)), re = -B \/ (2 * A), part = Math.sqrt(Math.abs(D)) \/ (2 * A);\r\n    if (D > 0 && m === 1) {\r\n      const xs = [re - part, re + part].map(clean);\r\n      return { pmTex: xs.map(x => numTex(x)).join(',\\\\; '), sols: xs.map(x => ({ tex: V + ' = ' + numTex(x), plain: v + ' = ' + numStr(x), x })) };\r\n    }\r\n    const g = gcd(gcd(B, k), 2 * A), b2 = -B \/ g, k2 = k \/ g, d2 = 2 * A \/ g;\r\n    const radT = (k2 === 1 ? '' : k2) + (m === 1 ? '' : '\\\\sqrt{' + m + '}') + (D < 0 ? 'i' : '');\r\n    const radP = (k2 === 1 ? '' : k2) + (m === 1 ? '' : '\u221a' + m) + (D < 0 ? 'i' : '');\r\n    const mk = (sg, t) => {\r\n      const rad = t ? radT : radP, op = sg === 0 ? (t ? '\\\\pm' : '\u00b1') : sg < 0 ? '-' : '+';\r\n      const num = b2 === 0 ? (sg < 0 ? '-' : sg === 0 ? op : '') + rad : b2 + ' ' + op + ' ' + rad;\r\n      return d2 === 1 ? num : t ? '\\\\frac{' + num + '}{' + d2 + '}' : '(' + num + ')\/' + d2;\r\n    };\r\n    const sols = D > 0\r\n      ? [-1, 1].map(sg => { const x = re + sg * part; return { tex: V + ' = ' + mk(sg, true) + ' \\\\approx ' + fmtTex(x), plain: v + ' = ' + mk(sg) + ' \u2248 ' + fmt(x), x }; })\r\n      : [-1, 1].map(sg => ({ tex: V + ' = ' + mk(sg, true), plain: v + ' = ' + mk(sg) + ' \u2248 ' + cplx(re, sg * part, true), complex: true, x: re }));\r\n    return { pmTex: mk(0, true), sols };\r\n  }\r\n  function sortSols(s) { return s.sort((a, b) => ((a.complex ? 1 : 0) - (b.complex ? 1 : 0)) || ((a.x || 0) - (b.x || 0))); }\r\n\r\n  function solvePoly(c, v) {\r\n    const deg = c.length - 1, V = varTex(v), out = { sols: [], steps: [], note: '' };\r\n    if (deg <= 0) {\r\n      if (Math.abs(c[0] || 0) < 1e-12) out.identity = true;\r\n      else { out.none = true; out.note = 'No solution \u2014 the equation reduces to the false statement ' + numStr(c[0]) + ' = 0.'; }\r\n      return out;\r\n    }\r\n    const R = toIntPoly(c);\r\n    if (deg === 1) {\r\n      const b = c[0], a = c[1], x = clean(-b \/ a);\r\n      out.steps.push({ t: 'Isolate ' + v, tex: (a === 1 ? V : a === -1 ? '-' + V : numTex(a) + V) + ' = ' + numTex(-b) });\r\n      if (a !== 1) out.steps.push({ t: 'Divide both sides by ' + numStr(a), tex: V + ' = ' + numTex(x) });\r\n      out.sols.push(R ? { tex: V + ' = ' + numTex(x) + (Number.isInteger(x) || !fracParts(x) ? '' : ' \\\\approx ' + fmtTex(x)), plain: v + ' = ' + numStr(x), x } : realSol(v, x));\r\n      return out;\r\n    }\r\n    if (deg === 2) {\r\n      const [cc, bb, aa] = c, D = clean(bb * bb - 4 * aa * cc);\r\n      out.steps.push({ t: 'Identify the coefficients', tex: 'a = ' + numTex(aa) + ',\\\\quad b = ' + numTex(bb) + ',\\\\quad c = ' + numTex(cc) });\r\n      out.steps.push({ t: 'Compute the discriminant', tex: '\\\\Delta = b^2 - 4ac = ' + par(numTex(bb)) + '^2 - 4\\\\cdot ' + par(numTex(aa)) + '\\\\cdot ' + par(numTex(cc)) + ' = ' + numTex(D) });\r\n      out.steps.push({ t: D > 1e-12 ? '\u0394 > 0, so there are two real solutions' : Math.abs(D) <= 1e-12 ? '\u0394 = 0, so there is one repeated real solution' : '\u0394 < 0, so there are two complex (non-real) solutions' });\r\n      const q = R ? quadExact(R.P[2], R.P[1], R.P[0], v) : null;\r\n      if (q) { out.steps.push({ t: 'Apply the quadratic formula', tex: V + ' = \\\\dfrac{-b \\\\pm \\\\sqrt{\\\\Delta}}{2a} = ' + q.pmTex }); out.sols = q.sols; return out; }\r\n      out.steps.push({ t: 'Apply the quadratic formula', tex: V + ' = \\\\dfrac{-b \\\\pm \\\\sqrt{\\\\Delta}}{2a}' });\r\n      const re = -bb \/ (2 * aa), part = Math.sqrt(Math.abs(D)) \/ (2 * Math.abs(aa));\r\n      if (Math.abs(D) <= 1e-12) out.sols.push(Object.assign(realSol(v, re), { mult: 2 }));\r\n      else if (D > 0) out.sols.push(realSol(v, re - part), realSol(v, re + part));\r\n      else out.sols.push(dkSol(v, [clean(re), -part]), dkSol(v, [clean(re), part]));\r\n      return sortSols(out.sols), out;\r\n    }\r\n    if (R) {\r\n      const fi = factorInfo(c, v), F = fi.F;\r\n      if (fi.nontrivial) out.steps.push({ t: 'Factor the polynomial', tex: fi.tex + ' = 0' });\r\n      if (F.k) out.sols.push({ tex: V + ' = 0', plain: v + ' = 0', x: 0, mult: F.k });\r\n      F.lin.forEach(l => out.sols.push({ tex: V + ' = ' + fracTex(l.p, l.q), plain: v + ' = ' + (l.q === 1 ? l.p : l.p + '\/' + l.q), x: l.p \/ l.q, mult: l.m }));\r\n      const rd = F.rest.length - 1;\r\n      if (rd === 2) {\r\n        const q = quadExact(F.rest[2], F.rest[1], F.rest[0], v);\r\n        if (q) { out.steps.push({ t: 'Solve the remaining quadratic factor', tex: polyFormat(F.rest, v) + ' = 0 \\\\;\\\\Rightarrow\\\\; ' + V + ' = ' + q.pmTex }); out.sols.push(...q.sols); }\r\n      } else if (rd >= 3) {\r\n        out.steps.push({ t: (F.lin.length || F.k) ? 'The remaining factor has no rational roots \u2014 solve numerically' : 'No rational roots \u2014 solve numerically', tex: polyFormat(F.rest, v) + ' = 0' });\r\n        dk(F.rest).forEach(z => out.sols.push(dkSol(v, z)));\r\n      }\r\n    } else {\r\n      out.steps.push({ t: 'Solve numerically', tex: polyFormat(c, v) + ' = 0' });\r\n      dk(c).forEach(z => out.sols.push(dkSol(v, z)));\r\n    }\r\n    sortSols(out.sols);\r\n    return out;\r\n  }\r\n\r\n  function realFn(node, v) {\r\n    const code = node.compile();\r\n    return x => { S[v] = x; try { return toReal(code.evaluate(S)); } catch (e) { return NaN; } };\r\n  }\r\n  function numericRoots(f) {\r\n    const roots = [];\r\n    const add = x => { x = clean(x); if (!roots.some(r => Math.abs(r - x) < 1e-7 * Math.max(1, Math.abs(x)))) roots.push(x); };\r\n    const bisect = (a, b, fa) => {\r\n      for (let i = 0; i < 100; i++) {\r\n        const m = (a + b) \/ 2, fm = f(m); if (!isFinite(fm)) return null; if (fm === 0) return m;\r\n        if ((fa < 0) === (fm < 0)) { a = m; fa = fm; } else b = m;\r\n        if (b - a < 1e-14 * Math.max(1, Math.abs(m))) break;\r\n      }\r\n      const r = (a + b) \/ 2, fr = f(r);\r\n      return isFinite(fr) && Math.abs(fr) < 1e-6 ? r : null;       \/\/ rejects poles such as tan(x)\r\n    };\r\n    const golden = (a, b) => {\r\n      const g = (Math.sqrt(5) - 1) \/ 2; let c = b - g * (b - a), d = a + g * (b - a), fc = Math.abs(f(c)), fd = Math.abs(f(d));\r\n      for (let i = 0; i < 80; i++) {\r\n        if (fc < fd) { b = d; d = c; fd = fc; c = b - g * (b - a); fc = Math.abs(f(c)); }\r\n        else { a = c; c = d; fc = fd; d = a + g * (b - a); fd = Math.abs(f(d)); }\r\n      }\r\n      const x = (a + b) \/ 2; return Math.abs(f(x)) < 1e-9 ? x : null;\r\n    };\r\n    const scan = (a, b, step) => {\r\n      let x0 = a, y0 = f(a), xm = NaN, ym = NaN;\r\n      for (let x = a + step; x <= b + step \/ 2; x += step) {\r\n        const y = f(x);\r\n        if (isFinite(y0) && isFinite(y)) {\r\n          if (y0 === 0) add(x0);\r\n          else if ((y0 < 0) !== (y < 0) && y !== 0) { const r = bisect(x0, x, y0); if (r !== null) add(r); }\r\n          else if (isFinite(ym) && Math.abs(y0) < Math.abs(ym) && Math.abs(y0) <= Math.abs(y) && Math.abs(y0) < 1e-2) { const r = golden(xm, x); if (r !== null) add(r); }\r\n        }\r\n        xm = x0; ym = y0; x0 = x; y0 = y;\r\n        if (roots.length > 300) return;\r\n      }\r\n      if (y0 === 0) add(x0);\r\n    };\r\n    scan(-100, -10, 0.05); scan(-10, 10, 0.004); scan(10, 100, 0.05);\r\n    return roots.sort((a, b) => a - b);\r\n  }\r\n  function numericSolve(node, v) {\r\n    const out = { sols: [], steps: [], note: '' };\r\n    let roots = numericRoots(realFn(node, v));\r\n    if (!roots.length) { out.none = true; out.note = 'No real solutions were found in the interval [\u2212100, 100].'; return out; }\r\n    const total = roots.length;\r\n    if (total > 12) {\r\n      roots = roots.slice().sort((a, b) => Math.abs(a) - Math.abs(b)).slice(0, 12).sort((a, b) => a - b);\r\n      out.note = total + ' solutions found in [\u2212100, 100] (the function is probably periodic) \u2014 showing the 12 closest to 0.';\r\n    }\r\n    out.sols = roots.map(x => realSol(v, x));\r\n    return out;\r\n  }\r\n  function solveLinearSym(f, v) {\r\n    try {\r\n      const A = simp(M.derivative(f, v));\r\n      if (dependsOn(A, v)) return null;\r\n      if (A.isConstantNode && Number(A.value) === 0) return null;\r\n      const B = simp(f.transform(n => (n.isSymbolNode && n.name === v) ? new M.ConstantNode(0) : n));\r\n      return simp(new M.OperatorNode('\/', 'divide', [new M.OperatorNode('-', 'unaryMinus', [B]), A]));\r\n    } catch (e) { return null; }\r\n  }\r\n  function solutionsHtml(sol, v) {\r\n    let h = '';\r\n    if (sol.steps && sol.steps.length) {\r\n      h += '<ol class=\"ezms-steps\">' + sol.steps.map(s => '<li><div class=\"ezms-step-t\">' + esc(s.t) + '<\/div>' +\r\n        (s.tex ? '<div class=\"ezms-step-m\">' + tex(s.tex, s.plain || s.tex) + '<\/div>' : '') + '<\/li>').join('') + '<\/ol>';\r\n    }\r\n    if (sol.identity) h += '<p class=\"ezms-ok\">\u2714 Always true \u2014 every value of ' + esc(v) + ' is a solution (identity).<\/p>';\r\n    if (sol.sols.length) {\r\n      h += '<div class=\"ezms-sols\">' + sol.sols.map(x => '<div class=\"ezms-sol' + (x.complex ? ' is-complex' : '') + '\">' + tex(x.tex, x.plain) +\r\n        (x.mult > 1 ? '<span class=\"ezms-badge\">\u00d7' + x.mult + '<\/span>' : '') + (x.complex ? '<span class=\"ezms-badge c\">complex<\/span>' : '') + '<\/div>').join('') + '<\/div>';\r\n    } else if (sol.none) h += '<p class=\"ezms-warn\">' + esc(sol.note || 'No solution.') + '<\/p>';\r\n    if (sol.note && sol.sols.length) h += '<p class=\"ezms-note\">' + esc(sol.note) + '<\/p>';\r\n    return h;\r\n  }\r\n  const solPlain = sol => sol.identity ? 'All real numbers' : sol.sols.map(s => s.plain).join('; ') || 'No solution';\r\n\r\n  \/* ---------- integration ---------- *\/\r\n  function integrate(f, a, b) {\r\n    if (a === b) return 0;\r\n    let sign = 1; if (a > b) { [a, b] = [b, a]; sign = -1; }\r\n    let n = 0;\r\n    const F = x => { n++; let y = f(x); if (!isFinite(y)) { const e = (b - a) * 1e-9; y = f(x <= a ? a + e : x >= b ? b - e : x + e); } return y; };\r\n    const simpson = (a, b, fa, fm, fb) => (b - a) \/ 6 * (fa + 4 * fm + fb);\r\n    const rec = (a, b, fa, fm, fb, whole, eps, depth) => {\r\n      const m = (a + b) \/ 2, lm = (a + m) \/ 2, rm = (m + b) \/ 2, flm = F(lm), frm = F(rm);\r\n      const l = simpson(a, m, fa, flm, fm), r = simpson(m, b, fm, frm, fb), d = l + r - whole;\r\n      if (depth <= 0 || n > 200000 || Math.abs(d) <= 15 * eps) return l + r + d \/ 15;\r\n      return rec(a, m, fa, flm, fm, l, eps \/ 2, depth - 1) + rec(m, b, fm, frm, fb, r, eps \/ 2, depth - 1);\r\n    };\r\n    const N = 16, h = (b - a) \/ N; let total = 0;\r\n    for (let i = 0; i < N; i++) {\r\n      const x0 = a + i * h, x1 = x0 + h, f0 = F(x0), f1 = F(x1), fm = F((x0 + x1) \/ 2);\r\n      total += rec(x0, x1, f0, fm, f1, simpson(x0, x1, f0, fm, f1), 1e-10 \/ N, 30);\r\n    }\r\n    return sign * total;\r\n  }\r\n\r\n  \/* ================= graph ================= *\/\r\n  function niceStep(raw) { if (!(raw > 0) || !isFinite(raw)) return 1; const p = Math.pow(10, Math.floor(Math.log10(raw))), n = raw \/ p; return (n < 1.5 ? 1 : n < 3.5 ? 2 : n < 7.5 ? 5 : 10) * p; }\r\n  const tick = v => Math.abs(v) < 1e-10 ? '0' : String(+v.toPrecision(6));\r\n  class Plot {\r\n    constructor(wrap, fns, marks) {\r\n      this.wrap = wrap; this.cv = wrap.querySelector('canvas'); this.ctx = this.cv.getContext('2d');\r\n      this.fns = fns; this.marks = marks || []; this.hx = null; this.drag = null; wrap._plot = this;\r\n      this.fit(); this.bind();\r\n      if (window.ResizeObserver) { this.ro = new ResizeObserver(() => this.draw()); this.ro.observe(this.cv); }\r\n      this.draw();\r\n    }\r\n    fit() {\r\n      let R = 10; const mx = this.marks.reduce((m, p) => Math.max(m, Math.abs(p.x)), 0);\r\n      if (mx > 8) R = Math.min(Math.ceil(mx * 1.25), 1000);\r\n      this.x0 = -R; this.x1 = R;\r\n      const ys = [];\r\n      for (let i = 0; i <= 600; i++) { const x = -R + 2 * R * i \/ 600; this.fns.forEach(fn => { if (fn.on) { const y = fn.f(x); if (isFinite(y)) ys.push(y); } }); }\r\n      this.marks.forEach(p => { if (isFinite(p.y)) ys.push(p.y); });\r\n      if (!ys.length) { this.y0 = -R; this.y1 = R; return; }\r\n      ys.sort((a, b) => a - b);\r\n      let lo = ys[Math.floor((ys.length - 1) * 0.04)], hi = ys[Math.ceil((ys.length - 1) * 0.96)];\r\n      if (hi - lo < 1e-9) { lo -= 1; hi += 1; }\r\n      const span = hi - lo;\r\n      if (lo > 0 && lo < span * 0.6) lo = 0;\r\n      if (hi < 0 && -hi < span * 0.6) hi = 0;\r\n      const pad = (hi - lo) * 0.12; this.y0 = lo - pad; this.y1 = hi + pad;\r\n    }\r\n    zoom(k, fx, fy) {\r\n      fx = fx == null ? 0.5 : fx; fy = fy == null ? 0.5 : fy;\r\n      const cx = this.x0 + (this.x1 - this.x0) * fx, cy = this.y0 + (this.y1 - this.y0) * fy;\r\n      this.x0 = cx - (cx - this.x0) * k; this.x1 = cx + (this.x1 - cx) * k;\r\n      this.y0 = cy - (cy - this.y0) * k; this.y1 = cy + (this.y1 - cy) * k; this.draw();\r\n    }\r\n    bind() {\r\n      const c = this.cv;\r\n      c.addEventListener('pointerdown', e => { this.drag = { x: e.clientX, y: e.clientY, x0: this.x0, x1: this.x1, y0: this.y0, y1: this.y1 }; try { c.setPointerCapture(e.pointerId); } catch (_) { \/* ignore *\/ } });\r\n      c.addEventListener('pointermove', e => {\r\n        const r = c.getBoundingClientRect(), d = this.drag;\r\n        if (d) {\r\n          const dx = (e.clientX - d.x) \/ r.width * (d.x1 - d.x0), dy = (e.clientY - d.y) \/ r.height * (d.y1 - d.y0);\r\n          this.x0 = d.x0 - dx; this.x1 = d.x1 - dx; this.y0 = d.y0 + dy; this.y1 = d.y1 + dy;\r\n        }\r\n        this.hx = e.clientX - r.left; this.draw();\r\n      });\r\n      const end = () => { this.drag = null; };\r\n      c.addEventListener('pointerup', end); c.addEventListener('pointercancel', end);\r\n      c.addEventListener('pointerleave', () => { if (!this.drag) { this.hx = null; this.draw(); } });\r\n      c.addEventListener('wheel', e => {\r\n        e.preventDefault(); const r = c.getBoundingClientRect();\r\n        this.zoom(e.deltaY > 0 ? 1.2 : 1 \/ 1.2, (e.clientX - r.left) \/ r.width, 1 - (e.clientY - r.top) \/ r.height);\r\n      }, { passive: false });\r\n    }\r\n    draw() {\r\n      const cv = this.cv, w = cv.clientWidth, h = cv.clientHeight; if (!w || !h) return;\r\n      const dpr = window.devicePixelRatio || 1;\r\n      if (cv.width !== Math.round(w * dpr) || cv.height !== Math.round(h * dpr)) { cv.width = Math.round(w * dpr); cv.height = Math.round(h * dpr); }\r\n      const c = this.ctx, { x0, x1, y0, y1 } = this;\r\n      c.setTransform(dpr, 0, 0, dpr, 0, 0); c.clearRect(0, 0, w, h);\r\n      const X = x => (x - x0) \/ (x1 - x0) * w, Y = y => h - (y - y0) \/ (y1 - y0) * h;\r\n      const sx = niceStep((x1 - x0) \/ Math.max(2, w \/ 80)), sy = niceStep((y1 - y0) \/ Math.max(2, h \/ 55));\r\n      const gxs = [], gys = [];\r\n      for (let g = Math.ceil(x0 \/ sx) * sx, i = 0; g <= x1 && i < 300; g += sx, i++) gxs.push(g);\r\n      for (let g = Math.ceil(y0 \/ sy) * sy, i = 0; g <= y1 && i < 300; g += sy, i++) gys.push(g);\r\n      c.lineWidth = 1; c.strokeStyle = '#eef2f7'; c.beginPath();\r\n      gxs.forEach(g => { const p = Math.round(X(g)) + 0.5; c.moveTo(p, 0); c.lineTo(p, h); });\r\n      gys.forEach(g => { const p = Math.round(Y(g)) + 0.5; c.moveTo(0, p); c.lineTo(w, p); });\r\n      c.stroke();\r\n      const ax = Y(0), ay = X(0);\r\n      c.strokeStyle = '#94a3b8'; c.lineWidth = 1.25; c.beginPath();\r\n      if (ax >= 0 && ax <= h) { c.moveTo(0, ax); c.lineTo(w, ax); }\r\n      if (ay >= 0 && ay <= w) { c.moveTo(ay, 0); c.lineTo(ay, h); }\r\n      c.stroke();\r\n      c.fillStyle = '#64748b'; c.font = '11px system-ui, sans-serif';\r\n      const ly = Math.min(Math.max(ax + 14, 14), h - 4); c.textAlign = 'center';\r\n      gxs.forEach(g => { if (Math.abs(g) >= sx \/ 2) c.fillText(tick(g), X(g), ly); });\r\n      const lx = Math.min(Math.max(ay + 4, 4), w - 44); c.textAlign = 'left';\r\n      gys.forEach(g => { if (Math.abs(g) >= sy \/ 2) c.fillText(tick(g), lx, Y(g) - 3); });\r\n      this.fns.forEach(fn => {\r\n        if (!fn.on) return;\r\n        c.strokeStyle = fn.color; c.lineWidth = 2.25; c.setLineDash(fn.dash || []); c.beginPath();\r\n        let pen = false, prev = 0;\r\n        for (let px = 0; px <= w; px++) {\r\n          const y = fn.f(x0 + (x1 - x0) * px \/ w);\r\n          if (!isFinite(y)) { pen = false; continue; }\r\n          let py = Y(y);\r\n          if (pen && Math.abs(py - prev) > h * 1.5) pen = false;\r\n          py = Math.max(-h, Math.min(2 * h, py));\r\n          if (pen) c.lineTo(px, py); else c.moveTo(px, py);\r\n          pen = true; prev = py;\r\n        }\r\n        c.stroke(); c.setLineDash([]);\r\n      });\r\n      this.marks.forEach(p => {\r\n        const px = X(p.x), py = Y(p.y); if (px < -6 || px > w + 6 || py < -6 || py > h + 6) return;\r\n        c.beginPath(); c.arc(px, py, 4.5, 0, 7); c.fillStyle = '#fff'; c.fill(); c.lineWidth = 2.5; c.strokeStyle = p.color || '#db2777'; c.stroke();\r\n      });\r\n      if (this.hx != null) {\r\n        const x = x0 + (x1 - x0) * this.hx \/ w;\r\n        c.strokeStyle = 'rgba(15,23,42,.25)'; c.lineWidth = 1; c.setLineDash([4, 4]); c.beginPath();\r\n        c.moveTo(this.hx + 0.5, 0); c.lineTo(this.hx + 0.5, h); c.stroke(); c.setLineDash([]);\r\n        const lines = [{ t: 'x = ' + (+x.toPrecision(7)), col: '#0f172a' }];\r\n        this.fns.forEach(fn => {\r\n          if (!fn.on) return; const y = fn.f(x);\r\n          if (isFinite(y)) { c.beginPath(); c.arc(this.hx, Y(y), 4, 0, 7); c.fillStyle = fn.color; c.fill(); }\r\n          lines.push({ t: fn.name + ' = ' + (isFinite(y) ? +y.toPrecision(7) : '\u2014'), col: fn.color });\r\n        });\r\n        c.font = '12px ui-monospace, Menlo, monospace';\r\n        const bw = Math.max(...lines.map(l => c.measureText(l.t).width)) + 16, bh = lines.length * 17 + 8;\r\n        const bx = this.hx + 12 + bw > w ? this.hx - 12 - bw : this.hx + 12;\r\n        c.fillStyle = 'rgba(255,255,255,.95)'; c.fillRect(bx, 8, bw, bh); c.strokeStyle = '#e2e8f0'; c.strokeRect(bx + 0.5, 8.5, bw, bh);\r\n        lines.forEach((l, i) => { c.fillStyle = l.col; c.fillText(l.t, bx + 8, 8 + 17 * (i + 1) - 2); });\r\n      }\r\n    }\r\n    destroy() { if (this.ro) this.ro.disconnect(); }\r\n  }\r\n  function graphCard(id, legend) {\r\n    return card('Graph', '<div class=\"ezms-plot\" data-plot=\"' + id + '\"><canvas aria-label=\"Function graph\"><\/canvas>' +\r\n      '<div class=\"ezms-plot-tools\"><button type=\"button\" data-z=\"in\" aria-label=\"Zoom in\">+<\/button><button type=\"button\" data-z=\"out\" aria-label=\"Zoom out\">\u2212<\/button><button type=\"button\" data-z=\"fit\" aria-label=\"Reset view\">\u2922<\/button><\/div><\/div>' +\r\n      '<div class=\"ezms-legend\">' + legend + '<\/div><p class=\"ezms-hint\">Drag to pan \u00b7 scroll or use + \/ \u2212 to zoom \u00b7 hover (or touch) to read values<\/p>', { icon: '\ud83d\udcc8', accent: '#0891b2' });\r\n  }\r\n  const swatch = (color, label, dash) => '<span><i style=\"background:' + color + (dash ? ';background:repeating-linear-gradient(90deg,' + color + ' 0 5px,transparent 5px 8px)' : '') + '\"><\/i>' + esc(label) + '<\/span>';\r\n\r\n  \/* ================= renderers ================= *\/\r\n  function pickPrimary(vars) { return state.primary && vars.includes(state.primary) ? state.primary : vars[0]; }\r\n  function varChips(vars, v, label) {\r\n    if (vars.length < 2) return '';\r\n    return '<div class=\"ezms-varbar\"><span>' + esc(label) + '<\/span>' + vars.map(n =>\r\n      '<button type=\"button\" class=\"ezms-chip' + (n === v ? ' is-on' : '') + '\" data-var=\"' + esc(n) + '\">' + esc(n) + '<\/button>').join('') + '<\/div>';\r\n  }\r\n\r\n  function renderNumeric(a) {\r\n    const val = a.node.compile().evaluate(trigScope());\r\n    if (typeof val === 'function') throw new Error('That is the name of a function \u2014 give it an argument, e.g. sin(1).');\r\n    if (val === undefined) throw new Error('Nothing to calculate.');\r\n    const vp = valuePlain(val);\r\n    let html = card('Result', '<div class=\"ezms-big\">' + tex('\\\\displaystyle ' + nt(a.node) + ' = ' + valueTex(val), a.s + ' = ' + vp) + '<\/div>', { icon: '\u2705', copy: vp, accent: '#059669' });\r\n    if (typeof val === 'number' || M.isBigNumber(val) || M.isFraction(val)) {\r\n      const num = Number(val.valueOf()), rows = [], ex = exactTex(num);\r\n      if (ex) rows.push(row('Exact form', tex('= ' + ex.tex, '= ' + ex.plain)));\r\n      if (isFinite(num) && num !== 0 && (Math.abs(num) >= 1e6 || Math.abs(num) < 1e-3)) {\r\n        const [mm, ee] = num.toExponential(9).split('e');\r\n        rows.push(row('Scientific', tex(+mm + ' \\\\times 10^{' + (+ee) + '}', num.toExponential(9))));\r\n      }\r\n      if (isFinite(num) && !Number.isInteger(num)) rows.push(row('Rounded (4 dp)', tex(String(+num.toFixed(4)))));\r\n      if (rows.length) html += card('Other forms', rows.join(''), { icon: '\ud83d\udd01', accent: '#7c3aed' });\r\n    } else if (M.isComplex(val)) {\r\n      const r = M.abs(val), th = M.arg(val), deg = state.angle === 'deg';\r\n      const thv = deg ? th * 180 \/ Math.PI : th, ex = deg ? null : exactTex(th);\r\n      html += card('Complex number', [\r\n        row('Real part', tex(fmtTex(val.re))), row('Imaginary part', tex(fmtTex(val.im))),\r\n        row('Modulus |z|', tex(fmtTex(r) + (exactTex(r) ? ' = ' + exactTex(r).tex : ''))),\r\n        row('Argument', tex((ex ? ex.tex + ' \\\\approx ' : '') + fmtTex(thv) + (deg ? '^\\\\circ' : '\\\\text{ rad}'))),\r\n        row('Polar form', tex(fmtTex(r) + '\\\\,e^{' + fmtTex(th) + 'i}'))\r\n      ].join(''), { icon: '\ud83c\udf00', accent: '#7c3aed' });\r\n    }\r\n    return html;\r\n  }\r\n\r\n  function renderExpression(a, pending) {\r\n    const v = pickPrimary(a.vars), V = varTex(v), label = a.fnLabel || 'f', multi = a.vars.length > 1;\r\n    const args = a.vars.map(varTex).join(', ');\r\n    const node = a.node, s1 = simp(node);\r\n    let html = varChips(a.vars, v, 'Differentiate \/ graph with respect to:');\r\n    let body = row('Input', tex(label + '(' + args + ') = ' + nt(node), a.s));\r\n    if (cmpKey(ns(s1)) !== cmpKey(ns(node))) body += row('Simplified', tex('= ' + nt(s1), ns(s1)));\r\n    const poly = multi ? null : polyOf(node, v);\r\n    let critMarks = [], zeroMarks = [];\r\n    if (poly && poly.length > 1) {\r\n      const ep = polyFormat(poly, v, true);\r\n      if (cmpKey(ep) !== cmpKey(ns(s1)) && cmpKey(ep) !== cmpKey(ns(node))) body += row('Expanded', tex('= ' + polyFormat(poly, v), ep));\r\n      const fi = factorInfo(poly, v);\r\n      if (fi && fi.nontrivial) body += row('Factored', tex('= ' + fi.tex, fi.plain));\r\n      else if (fi && poly.length > 2) body += row('Factored', '<span class=\"ezms-muted\">Cannot be factored over the rational numbers<\/span>');\r\n      body += row('Degree', tex(String(poly.length - 1)));\r\n    } else if (multi) {\r\n      try { const r = simp(M.rationalize(node)); if (cmpKey(ns(r)) !== cmpKey(ns(s1))) body += row('Expanded', tex('= ' + nt(r), ns(r))); } catch (e) { \/* not rational *\/ }\r\n    }\r\n    html += card('Expression', body, { icon: '\ud83d\udcdd', copy: ns(s1), accent: '#4f46e5' });\r\n\r\n    if (!multi) {\r\n      const sol = (poly && poly.length > 1) ? solvePoly(poly, v) : poly ? null : numericSolve(node, v);\r\n      if (sol) {\r\n        sol.steps = sol.steps.filter(s => \/^Factor\/.test(s.t));\r\n        html += card('Zeros: ' + label + '(' + v + ') = 0', solutionsHtml(sol, v), { icon: '\ud83c\udfaf', accent: '#db2777', copy: solPlain(sol) });\r\n        sol.sols.forEach(s => { if (!s.complex && isFinite(s.x)) zeroMarks.push({ x: s.x, y: 0, color: '#db2777' }); });\r\n      }\r\n    }\r\n\r\n    \/\/ calculus\r\n    let cb = '', dNode = null;\r\n    const dLabel = multi ? '\\\\frac{\\\\partial ' + label + '}{\\\\partial ' + V + '}' : label + \"'(\" + V + ')';\r\n    try {\r\n      dNode = simp(M.derivative(node, v));\r\n      cb += row('1st derivative', tex(dLabel + ' = ' + nt(dNode), ns(dNode)));\r\n      try {\r\n        const d2 = simp(M.derivative(dNode, v));\r\n        cb += row('2nd derivative', tex((multi ? '\\\\frac{\\\\partial^2 ' + label + '}{\\\\partial ' + V + '^2}' : label + \"''(\" + V + ')') + ' = ' + nt(d2), ns(d2)));\r\n      } catch (e) { \/* ignore *\/ }\r\n    } catch (e) { cb += row('Derivative', '<span class=\"ezms-muted\">Symbolic derivative is not available for this expression<\/span>'); }\r\n    let anti = null;\r\n    if (poly && poly.length > 1) {\r\n      anti = [0].concat(poly.map((x, i) => x \/ (i + 1)));\r\n      cb += row('Antiderivative', tex('\\\\int ' + label + '(' + V + ')\\\\,d' + V + ' = ' + polyFormat(anti, v) + ' + C', polyFormat(anti, v, true) + ' + C'));\r\n      if (poly.length > 2) {\r\n        const d1 = poly.slice(1).map((x, i) => x * (i + 1)), d2 = d1.slice(1).map((x, i) => x * (i + 1));\r\n        const crit = realRootsPoly(d1).slice(0, 8).map(x => {\r\n          const s = horner(d2, x), y = clean(horner(poly, x));\r\n          let kind = s > 1e-9 ? 'local minimum' : s < -1e-9 ? 'local maximum' : '';\r\n          if (!kind) { const l = horner(d1, x - 1e-4), r = horner(d1, x + 1e-4); kind = l < 0 && r > 0 ? 'local minimum' : l > 0 && r < 0 ? 'local maximum' : 'stationary inflection'; }\r\n          critMarks.push({ x, y, color: '#f59e0b' });\r\n          const xt = Number.isInteger(clean(x)) ? String(clean(x)) : (exactTex(x) || {}).tex || fmtTex(x);\r\n          return tex(V + ' = ' + xt + ',\\\\; ' + label + '(' + V + ') = ' + (exactTex(y) ? exactTex(y).tex : fmtTex(y))) + ' <span class=\"ezms-muted\">\u2014 ' + kind + '<\/span>';\r\n        });\r\n        if (crit.length) cb += row('Critical points', crit.join('<br>'));\r\n      }\r\n    }\r\n    cb += '<div class=\"ezms-row\" style=\"grid-template-columns:1fr\"><div class=\"ezms-int\"><span>Definite integral from<\/span><input data-int=\"a\" value=\"' + esc(state.intA) + '\" aria-label=\"Lower bound\" autocomplete=\"off\"><span>to<\/span><input data-int=\"b\" value=\"' + esc(state.intB) + '\" aria-label=\"Upper bound\" autocomplete=\"off\">' +\r\n          '<div class=\"ezms-out\" id=\"ezms-int-out\"><\/div><\/div><\/div>';\r\n    if (state.angle === 'deg') cb += '<p class=\"ezms-note\">Note: symbolic derivatives assume radians; numeric values use degrees.<\/p>';\r\n    html += card('Calculus', cb, { icon: '\u222b', accent: '#ea580c' });\r\n\r\n    \/\/ evaluate\r\n    html += card('Evaluate', '<div class=\"ezms-evalgrid\">' + a.vars.map(n =>\r\n      '<label class=\"ezms-field\"><span>' + esc(n) + ' =<\/span><input data-eval=\"' + esc(n) + '\" value=\"' + esc(state.evalRaw[n]) + '\" autocomplete=\"off\" inputmode=\"decimal\"><\/label>').join('') +\r\n      '<\/div><div class=\"ezms-out\" id=\"ezms-eval-out\"><\/div>', { icon: '\ud83d\udd22', accent: '#059669' });\r\n\r\n    \/\/ graph\r\n    const id = 'p' + (++plotSeq), fns = [{ f: realFn(node, v), color: '#4f46e5', on: true, name: label }];\r\n    let legend = swatch('#4f46e5', label + '(' + v + ')');\r\n    if (dNode) {\r\n      fns.push({ f: realFn(dNode, v), color: '#f59e0b', dash: [6, 4], on: state.showD, name: label + \"'\", isD: true });\r\n      legend += '<label><input type=\"checkbox\" data-toggle-d' + (state.showD ? ' checked' : '') + '> ' + swatch('#f59e0b', label + \"\u2032(\" + v + ')', true) + '<\/label>';\r\n    }\r\n    if (zeroMarks.length) legend += swatch('#db2777', 'zeros');\r\n    if (critMarks.length) legend += swatch('#f59e0b', 'critical points');\r\n    if (multi) legend += '<span class=\"ezms-muted\">Other variables use the values in \u201cEvaluate\u201d.<\/span>';\r\n    html += graphCard(id, legend);\r\n    pending.push({ id, fns, marks: zeroMarks.concat(critMarks) });\r\n\r\n    state.live = { code: node.compile(), f: fns[0].f, anti, v, label, vars: a.vars };\r\n    return html;\r\n  }\r\n\r\n  function renderEquation(a, pending) {\r\n    state.live = null;\r\n    if (!a.vars.length) {\r\n      const l = a.L.compile().evaluate(trigScope()), r = a.R.compile().evaluate(trigScope());\r\n      let eq; try { eq = !!M.deepEqual(l, r) || Math.abs(toReal(l) - toReal(r)) < 1e-10 * Math.max(1, Math.abs(toReal(l))); } catch (e) { eq = false; }\r\n      return card('Check', '<div class=\"ezms-big\">' + tex(nt(a.L) + ' = ' + valueTex(l) + ',\\\\quad ' + nt(a.R) + ' = ' + valueTex(r)) + '<\/div>' +\r\n        (eq ? '<p class=\"ezms-ok\">\u2714 The statement is TRUE.<\/p>' : '<p class=\"ezms-warn\">\u2718 The statement is FALSE.<\/p>'), { icon: '\u2696\ufe0f', accent: eq ? '#059669' : '#dc2626' });\r\n    }\r\n    const v = pickPrimary(a.vars), V = varTex(v), f = simp(a.node);\r\n    let html = varChips(a.vars, v, 'Solve for:'), sol;\r\n    const first = { t: 'Start with the equation', tex: nt(a.L) + ' = ' + nt(a.R) };\r\n    if (a.vars.length === 1) {\r\n      const poly = polyOf(a.node, v);\r\n      if (poly) { sol = solvePoly(poly, v); sol.steps.unshift(first, { t: 'Move every term to one side', tex: polyFormat(poly, v) + ' = 0' }); }\r\n      else {\r\n        sol = numericSolve(a.node, v);\r\n        sol.steps.unshift(first, { t: 'Move every term to one side', tex: nt(f) + ' = 0' },\r\n          { t: 'Find the roots numerically (sign changes + bisection) on [\u2212100, 100]' });\r\n      }\r\n    } else {\r\n      const lin = solveLinearSym(a.node, v);\r\n      if (lin) sol = { sols: [{ tex: V + ' = ' + nt(lin), plain: v + ' = ' + ns(lin) }], steps: [first, { t: 'Move every term to one side', tex: nt(f) + ' = 0' }, { t: 'Isolate ' + v, tex: V + ' = ' + nt(lin) }] };\r\n      else sol = { sols: [], steps: [first], none: true, note: 'This equation is not linear in ' + v + '. Choose another variable above, or replace the other variables with numbers.' };\r\n    }\r\n    html += card('Solution', solutionsHtml(sol, v), { icon: '\ud83c\udfaf', accent: '#db2777', copy: solPlain(sol) });\r\n\r\n    if (a.vars.length === 1) {\r\n      const fL = realFn(a.L, v), fR = realFn(a.R, v), marks = [];\r\n      sol.sols.forEach(s => { if (!s.complex && isFinite(s.x)) marks.push({ x: s.x, y: fL(s.x), color: '#db2777' }); });\r\n      const id = 'p' + (++plotSeq);\r\n      html += graphCard(id, swatch('#4f46e5', 'left side') + swatch('#06b6d4', 'right side') + (marks.length ? swatch('#db2777', 'solutions (intersections)') : ''));\r\n      pending.push({ id, marks, fns: [{ f: fL, color: '#4f46e5', on: true, name: 'left' }, { f: fR, color: '#06b6d4', on: true, name: 'right' }] });\r\n    }\r\n    return html;\r\n  }\r\n\r\n  \/* ================= main ================= *\/\r\n  function destroyPlots() { state.plots.forEach(p => p.destroy()); state.plots = []; }\r\n  function solve(pushHist) {\r\n    const raw = input.value.trim();\r\n    destroyPlots(); state.live = null;\r\n    if (!raw) { resultsEl.innerHTML = card('Nothing to solve yet', '<p class=\"ezms-muted\">Type an expression or equation above, or pick an example below.<\/p>', { icon: '\u270f\ufe0f' }); return; }\r\n    let a;\r\n    try { a = analyze(raw); } catch (e) { resultsEl.innerHTML = errCard(e); return; }\r\n    state.last = a;\r\n    if (pushHist !== false) addHistory(raw);\r\n    a.vars.forEach(n => { if (!(n in state.evalVals)) { state.evalVals[n] = 1; state.evalRaw[n] = '1'; } });\r\n    S = Object.assign({}, trigScope(), state.evalVals);\r\n    const pending = [];\r\n    let html;\r\n    try {\r\n      html = a.type === 'numeric' ? renderNumeric(a) : a.type === 'expression' ? renderExpression(a, pending) : renderEquation(a, pending);\r\n    } catch (e) { html = errCard(e); pending.length = 0; }\r\n    resultsEl.innerHTML = html;\r\n    pending.forEach(p => { const w = resultsEl.querySelector('[data-plot=\"' + p.id + '\"]'); if (w) state.plots.push(new Plot(w, p.fns, p.marks)); });\r\n    refreshLive();\r\n  }\r\n\r\n  function refreshLive() {\r\n    const L = state.live; if (!L) return;\r\n    const out = $('#ezms-eval-out');\r\n    if (out) {\r\n      try {\r\n        const val = L.code.evaluate(Object.assign({}, trigScope(), state.evalVals));\r\n        out.innerHTML = tex(L.label + '(' + L.vars.map(n => fmtTex(state.evalVals[n])).join(', ') + ') = ' + valueTex(val));\r\n      } catch (e) { out.innerHTML = '<span class=\"ezms-err\">' + esc(e.message) + '<\/span>'; }\r\n    }\r\n    const io = $('#ezms-int-out');\r\n    if (io) {\r\n      try {\r\n        const a = toReal(M.evaluate(state.intA || '0')), b = toReal(M.evaluate(state.intB || '1'));\r\n        if (!isFinite(a) || !isFinite(b)) throw new Error('Bounds must be finite numbers (e.g. 0, pi, 2.5).');\r\n        const at = (() => { try { return M.parse(state.intA).toTex(); } catch (e) { return fmtTex(a); } })();\r\n        const bt = (() => { try { return M.parse(state.intB).toTex(); } catch (e) { return fmtTex(b); } })();\r\n        const V = varTex(L.v), head = '\\\\int_{' + at + '}^{' + bt + '} ' + L.label + '(' + V + ')\\\\,d' + V;\r\n        let val, exact = false;\r\n        if (L.anti) { val = clean(horner(L.anti, b) - horner(L.anti, a)); exact = true; } else val = integrate(L.f, a, b);\r\n        if (!isFinite(val)) io.innerHTML = tex(head) + ' <span class=\"ezms-warn\" style=\"display:inline-block;padding:2px 8px\">diverges \/ undefined<\/span>';\r\n        else {\r\n          const ex = exactTex(val);\r\n          io.innerHTML = tex(head + (exact ? ' = ' + numTex(val) + (ex && !Number.isInteger(val) ? ' \\\\approx ' + fmtTex(val) : '') : (ex ? ' \\\\approx ' + ex.tex + ' \\\\approx ' : ' \\\\approx ') + fmtTex(+val.toPrecision(10))));\r\n        }\r\n      } catch (e) { io.innerHTML = '<span class=\"ezms-err\">' + esc(e.message) + '<\/span>'; }\r\n    }\r\n    state.plots.forEach(p => p.draw());\r\n  }\r\n  let liveTimer;\r\n  const liveSoon = () => { clearTimeout(liveTimer); liveTimer = setTimeout(refreshLive, 120); };\r\n\r\n  \/* ---------- preview ---------- *\/\r\n  let pvTimer;\r\n  function updatePreview() {\r\n    const raw = input.value.trim();\r\n    if (!raw) { previewEl.innerHTML = '<span class=\"ezms-muted\">A live preview appears here as you type<\/span>'; return; }\r\n    try {\r\n      const a = analyze(raw); let t, tag;\r\n      if (a.type === 'equation') { t = nt(a.L) + ' = ' + nt(a.R); tag = 'Equation'; }\r\n      else {\r\n        t = (a.fnLabel ? a.fnLabel + '(' + a.vars.map(varTex).join(', ') + ') = ' : '') + nt(a.node);\r\n        tag = a.type === 'numeric' ? 'Calculation' : a.fnLabel ? 'Function' : 'Expression';\r\n        if (a.type === 'numeric') { try { const val = a.node.compile().evaluate(trigScope()); if (val !== undefined && typeof val !== 'function') t += ' = ' + valueTex(val); } catch (e) { \/* incomplete *\/ } }\r\n      }\r\n      previewEl.innerHTML = '<span class=\"ezms-tag\">' + tag + '<\/span><span class=\"ezms-pv\">' + tex(t, raw) + '<\/span>';\r\n    } catch (e) { previewEl.innerHTML = '<span class=\"ezms-tag is-wait\">\u2026<\/span><span class=\"ezms-muted\">Keep typing\u2026<\/span>'; }\r\n  }\r\n  const previewSoon = () => { clearTimeout(pvTimer); pvTimer = setTimeout(updatePreview, 120); };\r\n\r\n  \/* ---------- history ---------- *\/\r\n  const HKEY = 'ezms_history_v2';\r\n  function loadHist() { try { return JSON.parse(localStorage.getItem(HKEY)) || []; } catch (e) { return []; } }\r\n  function saveHist(h) { try { localStorage.setItem(HKEY, JSON.stringify(h)); } catch (e) { \/* storage blocked *\/ } }\r\n  function addHistory(r) { saveHist([r].concat(loadHist().filter(x => x !== r)).slice(0, 12)); renderHist(); }\r\n  function renderHist() {\r\n    const h = loadHist(); histWrap.hidden = !h.length;\r\n    histEl.innerHTML = h.map(x => '<button type=\"button\" class=\"ezms-chip\" data-ex=\"' + esc(x) + '\">' + esc(x) + '<\/button>').join('');\r\n  }\r\n\r\n  \/* ---------- keyboard ---------- *\/\r\n  const KB = {\r\n    basic: [['7', '7'], ['8', '8'], ['9', '9'], ['\u00f7', '\/', 'op'], ['(', '(', 'op'], [')', ')', 'op'],\r\n            ['4', '4'], ['5', '5'], ['6', '6'], ['\u00d7', '*', 'op'], ['x\u00b2', '^2', 'op'], ['x\u02b8', '^', 'op'],\r\n            ['1', '1'], ['2', '2'], ['3', '3'], ['\u2212', '-', 'op'], ['\u221a', 'sqrt(|)', 'fn'], ['\u03c0', '\u03c0', 'fn'],\r\n            ['0', '0'], ['.', '.'], [',', ', ', 'op'], ['+', '+', 'op'], ['=', ' = ', 'op'], ['x', 'x', 'var']],\r\n    func: [['sin', 'sin(|)', 'fn'], ['cos', 'cos(|)', 'fn'], ['tan', 'tan(|)', 'fn'], ['sin\u207b\u00b9', 'asin(|)', 'fn'], ['cos\u207b\u00b9', 'acos(|)', 'fn'], ['tan\u207b\u00b9', 'atan(|)', 'fn'],\r\n           ['sinh', 'sinh(|)', 'fn'], ['cosh', 'cosh(|)', 'fn'], ['tanh', 'tanh(|)', 'fn'], ['ln', 'ln(|)', 'fn'], ['log\u2081\u2080', 'log10(|)', 'fn'], ['e\u02e3', 'e^(|)', 'fn'],\r\n           ['|x|', 'abs(|)', 'fn'], ['\u221b', 'cbrt(|)', 'fn'], ['\u207f\u221a', 'nthRoot(|, )', 'fn'], ['n!', '!', 'op'], ['mod', ' mod ', 'op'], ['e', 'e', 'var'],\r\n           ['\u230ax\u230b', 'floor(|)', 'fn'], ['\u2308x\u2309', 'ceil(|)', 'fn'], ['round', 'round(|)', 'fn'], ['nCr', 'combinations(|, )', 'fn'], ['gcd', 'gcd(|, )', 'fn'], ['lcm', 'lcm(|, )', 'fn']],\r\n    abc: [['x', 'x', 'var'], ['y', 'y', 'var'], ['z', 'z', 'var'], ['t', 't', 'var'], ['a', 'a', 'var'], ['b', 'b', 'var'],\r\n          ['c', 'c', 'var'], ['k', 'k', 'var'], ['m', 'm', 'var'], ['n', 'n', 'var'], ['p', 'p', 'var'], ['q', 'q', 'var'],\r\n          ['r', 'r', 'var'], ['s', 's', 'var'], ['u', 'u', 'var'], ['v', 'v', 'var'], ['w', 'w', 'var'], ['\u03b8', '\u03b8', 'var'],\r\n          ['i', 'i', 'fn'], ['e', 'e', 'fn'], ['\u221e', '\u221e', 'fn'], ['(', '(', 'op'], [')', ')', 'op'], ['^', '^', 'op']]\r\n  };\r\n  const NAV = [['\u2190', '@left', 'act'], ['\u2192', '@right', 'act'], ['\u232b', '@back', 'act'], ['AC', '@clear', 'act'], ['Solve \u21b5', '@solve', 'go wide']];\r\n  function renderKeys() {\r\n    keysEl.innerHTML = KB[state.kbTab].concat(NAV).map(k =>\r\n      '<button type=\"button\" class=\"ezms-key ' + (k[2] || '') + '\" data-key=\"' + esc(k[1]) + '\">' + esc(k[0]) + '<\/button>').join('');\r\n    root.querySelectorAll('[data-kbtab]').forEach(b => b.classList.toggle('is-on', b.dataset.kbtab === state.kbTab));\r\n  }\r\n  let caret = { s: 0, e: 0 };\r\n  const saveSel = () => { caret = { s: input.selectionStart || 0, e: input.selectionEnd || 0 }; };\r\n  function getSel() {\r\n    if (document.activeElement === input) return { s: input.selectionStart, e: input.selectionEnd };\r\n    const n = input.value.length; return { s: Math.min(caret.s, n), e: Math.min(caret.e, n) };\r\n  }\r\n  function setCaret(p) {\r\n    caret = { s: p, e: p };\r\n    if (!coarse) input.focus();\r\n    try { input.setSelectionRange(p, p); } catch (e) { \/* ignore *\/ }\r\n  }\r\n  function insert(tpl) {\r\n    const val = input.value, { s, e } = getSel(), sel = val.slice(s, e), bar = tpl.indexOf('|');\r\n    const text = bar >= 0 ? tpl.replace('|', sel) : tpl;\r\n    input.value = val.slice(0, s) + text + val.slice(e);\r\n    setCaret(bar >= 0 ? s + bar + sel.length : s + text.length);\r\n    previewSoon();\r\n  }\r\n  function handleKey(k) {\r\n    const { s, e } = getSel(), val = input.value;\r\n    switch (k) {\r\n      case '@left': setCaret(Math.max(0, s - 1)); break;\r\n      case '@right': setCaret(Math.min(val.length, e + 1)); break;\r\n      case '@back': {\r\n        if (s !== e) { input.value = val.slice(0, s) + val.slice(e); setCaret(s); }\r\n        else if (s > 0) { const m = val.slice(0, s).match(\/[a-zA-Z0-9]*[a-zA-Z]\\($\/); const cut = m ? m[0].length : 1; input.value = val.slice(0, s - cut) + val.slice(s); setCaret(s - cut); }\r\n        previewSoon(); break;\r\n      }\r\n      case '@clear': clearAll(); break;\r\n      case '@solve': solve(); break;\r\n      default: insert(k);\r\n    }\r\n  }\r\n  function clearAll() {\r\n    input.value = ''; caret = { s: 0, e: 0 }; destroyPlots(); state.live = null; state.last = null;\r\n    resultsEl.innerHTML = ''; updatePreview(); if (!coarse) input.focus();\r\n  }\r\n  function useExample(x) {\r\n    input.value = x; caret = { s: x.length, e: x.length }; updatePreview(); solve();\r\n    resultsEl.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n  }\r\n  function copyText(t, btn) {\r\n    const done = () => { const o = btn.textContent; btn.textContent = 'Copied \u2713'; setTimeout(() => { btn.textContent = o; }, 1200); };\r\n    const fallback = () => { const ta = document.createElement('textarea'); ta.value = t; ta.style.position = 'fixed'; ta.style.opacity = '0'; document.body.appendChild(ta); ta.select(); try { document.execCommand('copy'); done(); } catch (e) { \/* ignore *\/ } ta.remove(); };\r\n    if (navigator.clipboard && window.isSecureContext) navigator.clipboard.writeText(t).then(done, fallback); else fallback();\r\n  }\r\n  function setAngle(a, rerun) {\r\n    state.angle = a; try { localStorage.setItem('ezms_angle', a); } catch (e) { \/* ignore *\/ }\r\n    root.querySelectorAll('[data-angle]').forEach(b => b.setAttribute('aria-pressed', String(b.dataset.angle === a)));\r\n    updatePreview(); if (rerun && state.last && resultsEl.innerHTML) solve(false);\r\n  }\r\n\r\n  \/* ---------- examples ---------- *\/\r\n  const EXAMPLES = [\r\n    { t: '\ud83d\udd22 Arithmetic', c: '#4f46e5', items: ['2 + 3 * 4', '(1\/3 + 1\/6) * 4', 'sqrt(72)', '10!', '2^64', '17 mod 5'] },\r\n    { t: '\ud83e\udde9 Algebra', c: '#7c3aed', items: ['x^2 - 4x + 4', 'x^2 - 9', 'x^3 - 8', '(a + b)^2', '2x^3 - 3x^2 - 11x + 6', 'x^4 - 5x^2 + 4'] },\r\n    { t: '\u2696\ufe0f Equations', c: '#db2777', items: ['2x + 5 = 17', 'x^2 - 5x + 6 = 0', 'x^2 + 2x + 5 = 0', 'x^3 - 2x - 5 = 0', 'sin(x) = 0.5', '2x + 3y = 12'] },\r\n    { t: '\ud83d\udcd0 Trigonometry', c: '#059669', items: ['sin(pi\/6)', 'cos(pi\/3)', 'tan(pi\/4)', 'asin(0.5)', 'sin(x)^2 + cos(x)^2', 'sinh(1)'] },\r\n    { t: '\u222b Calculus & functions', c: '#ea580c', items: ['f(x) = x^3 - 3x', 'e^x * sin(x)', 'ln(x) \/ x', 'x^2 * e^(-x)', 'ln(e^2)', 'log10(1000)'] },\r\n    { t: '\ud83e\uddea Complex & units', c: '#0891b2', items: ['abs(3 + 4i)', 'sqrt(-4)', '(2 + 3i) * (1 - i)', '5 cm to inch', '100 degF to degC', 'nthRoot(27, 3)'] }\r\n  ];\r\n  exEl.innerHTML = EXAMPLES.map(g => '<div class=\"ezms-exgroup\" style=\"--accent:' + g.c + '\"><h3>' + esc(g.t) + '<\/h3><div class=\"ezms-chips\">' +\r\n    g.items.map(x => '<button type=\"button\" class=\"ezms-chip\" data-ex=\"' + esc(x) + '\">' + esc(x) + '<\/button>').join('') + '<\/div><\/div>').join('');\r\n\r\n  \/* ---------- events ---------- *\/\r\n  input.addEventListener('input', () => { saveSel(); previewSoon(); });\r\n  ['keyup', 'click', 'select', 'blur'].forEach(ev => input.addEventListener(ev, saveSel));\r\n  input.addEventListener('keydown', e => {\r\n    if (e.key === 'Enter') { e.preventDefault(); clearTimeout(pvTimer); updatePreview(); solve(); }\r\n    else if (e.key === 'Escape') clearAll();\r\n  });\r\n  $('#ezms-solve').addEventListener('click', () => solve());\r\n  $('#ezms-clear').addEventListener('click', clearAll);\r\n  $('#ezms-kbtoggle').addEventListener('click', e => { kbEl.hidden = !kbEl.hidden; e.currentTarget.setAttribute('aria-expanded', String(!kbEl.hidden)); });\r\n  keysEl.addEventListener('mousedown', e => { if (e.target.closest('.ezms-key')) e.preventDefault(); });   \/\/ keep cursor in the input\r\n  root.addEventListener('click', e => {\r\n    const t = e.target.closest('[data-key],[data-kbtab],[data-angle],[data-ex],[data-var],[data-copy],[data-z],[data-hist-clear]');\r\n    if (!t || !root.contains(t)) return;\r\n    const d = t.dataset;\r\n    if (d.key != null) handleKey(d.key);\r\n    else if (d.kbtab) { state.kbTab = d.kbtab; renderKeys(); }\r\n    else if (d.angle) setAngle(d.angle, true);\r\n    else if (d.ex != null) useExample(d.ex);\r\n    else if (d.var) { state.primary = d.var; solve(false); }\r\n    else if (d.copy != null) copyText(d.copy, t);\r\n    else if (d.z) { const p = t.closest('.ezms-plot')._plot; if (!p) return; if (d.z === 'in') p.zoom(1 \/ 1.4); else if (d.z === 'out') p.zoom(1.4); else { p.fit(); p.draw(); } }\r\n    else if (t.hasAttribute('data-hist-clear')) { saveHist([]); renderHist(); }\r\n  });\r\n  resultsEl.addEventListener('input', e => {\r\n    const t = e.target;\r\n    if (t.dataset.eval) {\r\n      const n = t.dataset.eval; state.evalRaw[n] = t.value;\r\n      let v; try { v = toReal(M.evaluate(t.value.trim() ? normalize(t.value) : '0')); } catch (err) { v = NaN; }\r\n      if (!isFinite(v)) { t.classList.add('is-bad'); return; }\r\n      t.classList.remove('is-bad'); state.evalVals[n] = v; S[n] = v; liveSoon();\r\n    } else if (t.dataset.int) {\r\n      if (t.dataset.int === 'a') state.intA = normalize(t.value); else state.intB = normalize(t.value);\r\n      liveSoon();\r\n    }\r\n  });\r\n  resultsEl.addEventListener('change', e => {\r\n    if (!e.target.matches('[data-toggle-d]')) return;\r\n    state.showD = e.target.checked;\r\n    state.plots.forEach(p => { p.fns.forEach(f => { if (f.isD) f.on = state.showD; }); p.draw(); });\r\n  });\r\n\r\n  \/* ---------- init ---------- *\/\r\n  let savedAngle = 'rad'; try { savedAngle = localStorage.getItem('ezms_angle') || 'rad'; } catch (e) { \/* ignore *\/ }\r\n  setAngle(savedAngle === 'deg' ? 'deg' : 'rad', false);\r\n  renderKeys(); renderHist(); updatePreview();\r\n})();\r\n<\/script>\r\n<\/body>\r\n<\/html><\/div><\/div><div class=\"wpb_wrapper td_block_wrap vc_raw_html tdi_10 \"><div class=\"td-fix-index\">\n<style>\n  body {\n    font-family: 'Segoe UI', Arial, sans-serif;\n    background: #f4f5f7;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    min-height: 100vh;\n    margin: 0;\n  }\n\n  h3 {\n    color: #333;\n    margin-bottom: 25px;\n  }\n\n  \/* D\u1ea1ng l\u01b0\u1edbi cho b\u1ed1 c\u1ee5c c\u00e2n \u0111\u1ec1u *\/\n  .button-container {\n    display: grid;\n    grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));\n    gap: 16px;\n    width: 100%;\n    max-width: 800px;\n  }\n\n  \/* N\u00fat c\u0103n gi\u1eefa ch\u1eef theo c\u1ea3 hai chi\u1ec1u *\/\n  .ai-button {\n    display: flex;\n    justify-content: center; \/* c\u0103n gi\u1eefa ngang *\/\n    align-items: center;     \/* c\u0103n gi\u1eefa d\u1ecdc *\/\n    background: #fff;\n    color: #222;\n    border: 2px solid #4f46e5;\n    border-radius: 12px;\n    height: 60px; \/* \u0111\u1ea3m b\u1ea3o n\u00fat \u0111\u1ec1u v\u00e0 ch\u1eef lu\u00f4n gi\u1eefa *\/\n    font-size: 16px;\n    font-weight: 600;\n    text-decoration: none;\n    transition: all 0.25s ease;\n    box-shadow: 0 3px 8px rgba(0,0,0,0.08);\n  }\n\n  .ai-button:hover {\n    background: #4f46e5;\n    color: #fff;\n    transform: translateY(-2px);\n    box-shadow: 0 6px 14px rgba(79,70,229,0.3);\n  }\n\n  .ai-button:active {\n    transform: translateY(0);\n  }\n<\/style>\n<\/head>\n<body>\n\n  <h3>Explore AI Tools<\/h3>\n  <div class=\"button-container\">\n    <a href=\"https:\/\/www.ezcalculatoronline.com\/ask-ai\/\" class=\"ai-button\">Ask AI<\/a>\n    <a href=\"https:\/\/www.ezcalculatoronline.com\/ai-grammar-checker\/\" class=\"ai-button\">AI Grammar Checker<\/a>\n    <a href=\"https:\/\/www.ezcalculatoronline.com\/ai-review-response\/\" class=\"ai-button\">AI Review Response<\/a>\n    <a href=\"https:\/\/www.ezcalculatoronline.com\/ai-poem-generator\/\" class=\"ai-button\">AI Poem Generator<\/a>\n    <a href=\"https:\/\/www.ezcalculatoronline.com\/ai-story-generator\/\" class=\"ai-button\">AI Story Generator<\/a>\n    <a href=\"https:\/\/www.ezcalculatoronline.com\/ai-lyrics-generator\/\" class=\"ai-button\">AI Lyrics Generator<\/a>\n    <a href=\"https:\/\/www.ezcalculatoronline.com\/ai-email-writer\/\" class=\"ai-button\">AI Email Writer<\/a>\n        <a href=\"https:\/\/www.ezcalculatoronline.com\/ai-hook-generator\/\" class=\"ai-button\">AI Hook Generator<\/a>\n\n  <\/div>\n\n<\/body>\n<\/html>\n<\/div><\/div><div class=\"wpb_wrapper wpb_text_column td_block_wrap td_block_wrap vc_column_text tdi_11  tagdiv-type td-pb-border-top td_block_template_1\"  data-td-block-uid=\"tdi_11\" ><div class=\"td-block-title-wrap\"><\/div><div class=\"td-fix-index\"><h2 data-start=\"612\" data-end=\"641\">\ud83d\udd39 <strong>What is Math Solver?<\/strong><\/h2>\n<p data-start=\"642\" data-end=\"974\"><strong data-start=\"642\" data-end=\"657\">Math Solver<\/strong> is an intelligent online calculator designed to help you solve math problems of all levels\u2014from simple arithmetic to advanced calculus. Whether you are a student struggling with algebra, a teacher preparing lesson plans, or a professional needing quick calculations, this tool provides accurate answers in seconds.<\/p>\n<p data-start=\"976\" data-end=\"1149\">Unlike a basic calculator, Math Solver doesn\u2019t just give you the final result\u2014it shows <strong data-start=\"1063\" data-end=\"1089\">step-by-step solutions<\/strong>. This way, you don\u2019t just solve math, you <strong data-start=\"1132\" data-end=\"1146\">learn math<\/strong>.<\/p>\n<h2 data-start=\"1156\" data-end=\"1192\">\ud83d\udd39 <strong>Key Features of Math Solver<\/strong><\/h2>\n<ol data-start=\"1193\" data-end=\"2277\">\n<li data-start=\"1193\" data-end=\"1589\">\n<p data-start=\"1196\" data-end=\"1227\"><strong data-start=\"1196\" data-end=\"1225\">Wide Range of Math Topics<\/strong><\/p>\n<ul data-start=\"1231\" data-end=\"1589\">\n<li data-start=\"1231\" data-end=\"1301\">\n<p data-start=\"1233\" data-end=\"1301\">Basic Arithmetic (addition, subtraction, multiplication, division)<\/p>\n<\/li>\n<li data-start=\"1305\" data-end=\"1366\">\n<p data-start=\"1307\" data-end=\"1366\">Algebra (linear equations, quadratic, cubic, polynomials)<\/p>\n<\/li>\n<li data-start=\"1370\" data-end=\"1414\">\n<p data-start=\"1372\" data-end=\"1414\">Trigonometry (sin, cos, tan, identities)<\/p>\n<\/li>\n<li data-start=\"1418\" data-end=\"1463\">\n<p data-start=\"1420\" data-end=\"1463\">Calculus (derivatives, integrals, limits)<\/p>\n<\/li>\n<li data-start=\"1467\" data-end=\"1532\">\n<p data-start=\"1469\" data-end=\"1532\">Linear Algebra (matrices, determinants, systems of equations)<\/p>\n<\/li>\n<li data-start=\"1536\" data-end=\"1589\">\n<p data-start=\"1538\" data-end=\"1589\">Statistics &#038; Probability (mean, median, variance)<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li data-start=\"1591\" data-end=\"1783\">\n<p data-start=\"1594\" data-end=\"1783\"><strong data-start=\"1594\" data-end=\"1623\">Step-by-Step Explanations<\/strong><br data-start=\"1623\" data-end=\"1626\" \/>Each solution is broken down into clear, logical steps so that learners can understand not just the \u201cwhat,\u201d but also the \u201chow\u201d of solving math problems.<\/p>\n<\/li>\n<li data-start=\"1785\" data-end=\"1961\">\n<p data-start=\"1788\" data-end=\"1961\"><strong data-start=\"1788\" data-end=\"1815\">User-Friendly Interface<\/strong><br data-start=\"1815\" data-end=\"1818\" \/>The input box supports mathematical symbols, fractions, exponents, and advanced expressions, making it easy to type even complex problems.<\/p>\n<\/li>\n<li data-start=\"1963\" data-end=\"2101\">\n<p data-start=\"1966\" data-end=\"2101\"><strong data-start=\"1966\" data-end=\"1985\">Instant Results<\/strong><br data-start=\"1985\" data-end=\"1988\" \/>Forget waiting\u2014Math Solver gives you results instantly, helping you save valuable time during study or work.<\/p>\n<\/li>\n<li data-start=\"2103\" data-end=\"2277\">\n<p data-start=\"2106\" data-end=\"2277\"><strong data-start=\"2106\" data-end=\"2136\">Cross-Device Compatibility<\/strong><br data-start=\"2136\" data-end=\"2139\" \/>Fully optimized for desktop, tablet, and mobile. Whether you are at home, in class, or on the go, you can always rely on Math Solver.<\/p>\n<\/li>\n<\/ol>\n<h2 data-start=\"2284\" data-end=\"2313\">\ud83d\udd39 <strong>Why Use Math Solver?<\/strong><\/h2>\n<ul data-start=\"2314\" data-end=\"2695\">\n<li data-start=\"2314\" data-end=\"2416\">\n<p data-start=\"2316\" data-end=\"2416\"><strong data-start=\"2316\" data-end=\"2332\">For Students<\/strong>: Check your homework, prepare for exams, and build confidence in problem-solving.<\/p>\n<\/li>\n<li data-start=\"2417\" data-end=\"2504\">\n<p data-start=\"2419\" data-end=\"2504\"><strong data-start=\"2419\" data-end=\"2435\">For Teachers<\/strong>: Use it as a teaching aid to show step-by-step solutions in class.<\/p>\n<\/li>\n<li data-start=\"2505\" data-end=\"2602\">\n<p data-start=\"2507\" data-end=\"2602\"><strong data-start=\"2507\" data-end=\"2522\">For Parents<\/strong>: Help your children with math homework without struggling to recall formulas.<\/p>\n<\/li>\n<li data-start=\"2603\" data-end=\"2695\">\n<p data-start=\"2605\" data-end=\"2695\"><strong data-start=\"2605\" data-end=\"2626\">For Professionals<\/strong>: Quickly solve equations used in finance, science, or engineering.<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"2697\" data-end=\"2834\">Math Solver is more than a calculator\u2014it\u2019s a <strong data-start=\"2742\" data-end=\"2764\">learning companion<\/strong> that empowers users to improve their mathematical skills over time.<\/p>\n<h2 data-start=\"2841\" data-end=\"2868\">\ud83d\udd39 <strong>Real-Life Examples<\/strong><\/h2>\n<ul data-start=\"2869\" data-end=\"3244\">\n<li data-start=\"2869\" data-end=\"2960\">\n<p data-start=\"2871\" data-end=\"2960\">\ud83e\uddee Need to simplify a fraction like <code data-start=\"2907\" data-end=\"2914\">18\/24<\/code>? Math Solver reduces it to <code data-start=\"2942\" data-end=\"2947\">3\/4<\/code> instantly.<\/p>\n<\/li>\n<li data-start=\"2961\" data-end=\"3051\">\n<p data-start=\"2963\" data-end=\"3051\">\ud83d\udcd0 Working on trigonometry? Enter <code data-start=\"2997\" data-end=\"3007\">sin(45\u00b0)<\/code> and get the exact value with explanation.<\/p>\n<\/li>\n<li data-start=\"3052\" data-end=\"3141\">\n<p data-start=\"3054\" data-end=\"3141\">\ud83d\udcca Studying calculus? Input <code data-start=\"3082\" data-end=\"3101\">d\/dx (x^3 + 5x^2)<\/code> and see step-by-step differentiation.<\/p>\n<\/li>\n<li data-start=\"3142\" data-end=\"3244\">\n<p data-start=\"3144\" data-end=\"3244\">\ud83d\udd22 Solving a quadratic equation? Type <code data-start=\"3182\" data-end=\"3200\">x^2 + 5x + 6 = 0<\/code> and get both roots with the method shown.<\/p>\n<\/li>\n<\/ul>\n<h2 data-start=\"3251\" data-end=\"3296\">\ud83d\udd39 <strong>Benefits of Using Math Solver Online<\/strong><\/h2>\n<p data-start=\"3297\" data-end=\"3532\">\u2705 Free to use \u2013 no downloads, no registration.<br data-start=\"3343\" data-end=\"3346\" \/>\u2705 Saves time by solving complex problems instantly.<br data-start=\"3397\" data-end=\"3400\" \/>\u2705 Helps you understand math concepts better.<br data-start=\"3444\" data-end=\"3447\" \/>\u2705 Ideal for both beginners and advanced learners.<br data-start=\"3496\" data-end=\"3499\" \/>\u2705 Accessible anywhere, anytime.<\/p>\n<p data-start=\"3563\" data-end=\"3842\">In today\u2019s world, where math is used in everything from finance to engineering, having a reliable problem-solving tool is essential. <strong data-start=\"3696\" data-end=\"3711\">Math Solver<\/strong> is not just about giving quick answers\u2014it\u2019s about making mathematics <strong data-start=\"3781\" data-end=\"3826\">accessible, understandable, and enjoyable<\/strong> for everyone.<\/p>\n<p data-start=\"3844\" data-end=\"4025\">Whether you want to master the basics, tackle advanced equations, or simply double-check your results, Math Solver is the perfect online companion for all your mathematical needs.<\/p>\n<p data-start=\"4027\" data-end=\"4113\">\ud83d\udc49 Try it now and see how solving math problems becomes faster, easier, and smarter!<\/p>\n<\/div><\/div><\/div><\/div><div class=\"vc_column tdi_13  wpb_column vc_column_container tdc-column td-pb-span4 td-is-sticky\">\n<style scoped>\n\n\/* custom css *\/\n.tdi_13{\r\n                    vertical-align: baseline;\r\n                }.tdi_13 > .wpb_wrapper,\r\n\t\t\t\t.tdi_13 > .wpb_wrapper > .tdc-elements{\r\n\t\t\t\t    display: block;\r\n\t\t\t\t}.tdi_13 > .wpb_wrapper > .tdc-elements{\r\n\t\t\t\t    width: 100%;\r\n\t\t\t\t}.tdi_13 > .wpb_wrapper > .vc_row_inner{\r\n\t\t\t\t    width: auto;\r\n\t\t\t\t}.tdi_13 > .wpb_wrapper{\r\n\t\t\t\t    width: auto;\r\n\t\t\t\t    height: auto;\r\n\t\t\t\t}\n<\/style><div class=\"wpb_wrapper\" data-sticky-offset=\"20\"><div class=\"td_block_wrap td_block_list_menu tdi_14 td-blm-display-vertical td-pb-border-top td_block_template_1 widget\"  data-td-block-uid=\"tdi_14\" >\n<style>\n\n\/* inline tdc_css att *\/\n\n.tdi_14{\npadding-top:20px !important;\n}\n\n<\/style>\n<style>\n\/* custom css *\/\n.td_block_list_menu ul{\r\n                  flex-wrap: wrap;\r\n                  margin-left: 12px;\r\n                }.td_block_list_menu ul li{\r\n\t\t\t\t\tmargin-left: 0;\r\n\t\t\t\t}.td_block_list_menu ul li a{\r\n\t\t\t\t\tdisplay: flex;\r\n                  \tmargin-left: 0;\r\n                }.td_block_list_menu .td-blm-menu-item-txt{\r\n\t\t\t\t\tdisplay: flex;\r\n\t\t\t\t\talign-items: center;\r\n\t\t\t\t\tflex-grow: 1;\r\n\t\t\t\t}.td_block_list_menu .sub-menu{\r\n                  padding-left: 22px;\r\n                }.td_block_list_menu .sub-menu li{\r\n                  font-size: 13px;\r\n                }.td_block_list_menu li.current-menu-item > a,\r\n\t\t\t\t.td_block_list_menu li.current-menu-ancestor > a,\r\n\t\t\t\t.td_block_list_menu li.current-category-ancestor > a{\r\n\t\t\t\t    color: #4db2ec;\r\n\t\t\t\t}.td_block_list_menu .td-blm-sub-icon{\r\n\t\t\t\t\tdisplay: flex;\r\n\t\t\t\t\talign-items: center;\r\n\t\t\t\t\tjustify-content: center;\r\n\t\t\t\t\tmargin-left: .6em;\r\n\t\t\t\t\tpadding: 0 .6em;\r\n\t\t\t\t\ttransition: transform .2s ease-in-out;\r\n\t\t\t\t}.td_block_list_menu .td-blm-sub-icon svg{\r\n\t\t\t\t\tdisplay: block;\r\n\t\t\t\t\twidth: 1em;\r\n\t\t\t\t\theight: auto;\r\n\t\t\t\t}.td_block_list_menu .td-blm-sub-icon svg,\r\n\t\t\t\t.td_block_list_menu .td-blm-sub-icon svg *{\r\n\t\t\t\t\tfill: currentColor;\r\n\t\t\t\t}.td_block_list_menu.td-blm-display-accordion .menu-item-has-children ul{\r\n\t\t\t\t\tdisplay: none;\r\n\t\t\t\t}.td_block_list_menu.td-blm-display-accordion .menu-item-has-children-open > a > .td-blm-sub-icon{\r\n\t\t\t\t\ttransform: rotate(180deg);\r\n\t\t\t\t}.td_block_list_menu.td-blm-display-horizontal ul{\r\n\t\t\t\t\tdisplay: flex;\r\n\t\t\t\t}body .tdi_14 ul{\r\n\t\t\t\t\ttext-align: left;\r\n\t\t\t\t\tjustify-content: flex-start;\r\n\t\t\t\t}body .tdi_14 ul li a{\r\n\t\t\t\t\tjustify-content: flex-start;\r\n\t\t\t\t}body .tdi_14 .td-blm-menu-item-txt{\r\n\t\t\t\t\tflex-grow: 1;\r\n\t\t\t\t}\n<\/style><div class=\"td-block-title-wrap\"><h4 class=\"block-title td-block-title\"><span class=\"td-pulldown-size\">Math Calculators<\/span><\/h4><\/div><div id=tdi_14 class=\"td_block_inner td-fix-index\"><div class=\"menu-math-container\"><ul id=\"menu-math\" class=\"menu\"><li id=\"menu-item-3614\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-3614\"><a href=\"https:\/\/www.ezcalculatoronline.com\/math\/average-percentage-calculator\/\"><span class=\"td-blm-menu-item-txt\">Average Percentage Calculator<\/span><\/a><\/li>\n<li id=\"menu-item-3615\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-3615\"><a href=\"https:\/\/www.ezcalculatoronline.com\/math\/fraction-to-percent-calculator\/\"><span class=\"td-blm-menu-item-txt\">Fraction to Percent Calculator<\/span><\/a><\/li>\n<li id=\"menu-item-6528\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-6528\"><a href=\"https:\/\/www.ezcalculatoronline.com\/math\/half-life-calculator\/\"><span class=\"td-blm-menu-item-txt\">Half-Life Calculator<\/span><\/a><\/li>\n<li id=\"menu-item-6529\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-6529\"><a href=\"https:\/\/www.ezcalculatoronline.com\/math\/bilinear-interpolation-calculator\/\"><span class=\"td-blm-menu-item-txt\">Bilinear Interpolation Calculator<\/span><\/a><\/li>\n<li id=\"menu-item-4222\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-4222\"><a href=\"https:\/\/www.ezcalculatoronline.com\/math\/multiplicative-inverse-calculator\/\"><span class=\"td-blm-menu-item-txt\">Multiplicative Inverse Calculator<\/span><\/a><\/li>\n<li id=\"menu-item-6534\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-6534\"><a href=\"https:\/\/www.ezcalculatoronline.com\/math\/scientific-notation-calculator\/\"><span class=\"td-blm-menu-item-txt\">Scientific Notation Calculator<\/span><\/a><\/li>\n<li id=\"menu-item-6530\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-6530\"><a href=\"https:\/\/www.ezcalculatoronline.com\/math\/slope-percentage-calculator\/\"><span class=\"td-blm-menu-item-txt\">Slope Percentage Calculator<\/span><\/a><\/li>\n<li id=\"menu-item-6532\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-6532\"><a href=\"https:\/\/www.ezcalculatoronline.com\/math\/greatest-common-factor-calculator\/\"><span class=\"td-blm-menu-item-txt\">Greatest Common Factor Calculator<\/span><\/a><\/li>\n<li id=\"menu-item-6533\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-6533\"><a href=\"https:\/\/www.ezcalculatoronline.com\/math\/rounding-calculator\/\"><span class=\"td-blm-menu-item-txt\">Rounding Calculator<\/span><\/a><\/li>\n<li id=\"menu-item-6531\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-6531\"><a href=\"https:\/\/www.ezcalculatoronline.com\/math\/slope-calculator\/\"><span class=\"td-blm-menu-item-txt\">Slope Calculator<\/span><\/a><\/li>\n<li id=\"menu-item-3617\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-3617\"><a href=\"https:\/\/www.ezcalculatoronline.com\/games\/math-practice\/\"><span class=\"td-blm-menu-item-txt\">Math Practice<\/span><\/a><\/li>\n<li id=\"menu-item-3618\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-3618\"><a href=\"https:\/\/www.ezcalculatoronline.com\/math\/cubic-equation-calculator\/\"><span class=\"td-blm-menu-item-txt\">Cubic Equation Calculator<\/span><\/a><\/li>\n<li id=\"menu-item-7640\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7640\"><a href=\"https:\/\/www.ezcalculatoronline.com\/math\/root-calculator\/\"><span class=\"td-blm-menu-item-txt\">Root Calculator<\/span><\/a><\/li>\n<li id=\"menu-item-4221\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-4221\"><a href=\"https:\/\/www.ezcalculatoronline.com\/math\/quadratic-formula-calculator\/\"><span class=\"td-blm-menu-item-txt\">Quadratic Formula Calculator<\/span><\/a><\/li>\n<li id=\"menu-item-3616\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-3616\"><a href=\"https:\/\/www.ezcalculatoronline.com\/games\/multiplication-tables-practice\/\"><span class=\"td-blm-menu-item-txt\">Multiplication Tables Practice<\/span><\/a><\/li>\n<li id=\"menu-item-4223\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-4223\"><a href=\"https:\/\/www.ezcalculatoronline.com\/math\/average-rate-of-change-calculator\/\"><span class=\"td-blm-menu-item-txt\">Average Rate of Change Calculator<\/span><\/a><\/li>\n<\/ul><\/div><\/div><\/div><div class=\"wpb_wrapper td_block_wrap vc_raw_html tdi_16 \"><div class=\"td-fix-index\"><script async src=\"https:\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js?client=ca-pub-7396755811986582\"\n     crossorigin=\"anonymous\"><\/script>\n<!-- ads 300 x 250 -->\n<ins class=\"adsbygoogle\"\n     style=\"display:inline-block;width:300px;height:250px\"\n     data-ad-client=\"ca-pub-7396755811986582\"\n     data-ad-slot=\"2517371721\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script><\/div><\/div><div class=\"wpb_wrapper td_block_wrap vc_raw_html tdi_18 \"><div class=\"td-fix-index\"><script async src=\"https:\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js?client=ca-pub-7396755811986582\"\n     crossorigin=\"anonymous\"><\/script>\n<!-- Ads KNS 300 x 600 -->\n<ins class=\"adsbygoogle\"\n     style=\"display:inline-block;width:300px;height:600px\"\n     data-ad-client=\"ca-pub-7396755811986582\"\n     data-ad-slot=\"4956265638\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script><\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":5738,"parent":3595,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-5726","page","type-page","status-publish","has-post-thumbnail"],"rankMath":{"parentDomain":"ezcalculatoronline.com","noFollowDomains":[],"noFollowExcludeDomains":[],"noFollowExternalLinks":false,"featuredImageNotice":"The featured image should be at least 200 by 200 pixels to be picked up by Facebook and other social media sites.","pluginReviewed":false,"postSettings":{"linkSuggestions":true,"useFocusKeyword":false},"frontEndScore":false,"postName":"math-solver","permalinkFormat":"https:\/\/www.ezcalculatoronline.com\/%pagename%\/","showLockModifiedDate":true,"assessor":{"focusKeywordLink":"https:\/\/www.ezcalculatoronline.com\/wp-admin\/edit.php?focus_keyword=%focus_keyword%&post_type=%post_type%","hasTOCPlugin":false,"primaryTaxonomy":false,"serpData":{"title":"Math Solver \u2013 Free Online Tool for Equations &amp; Step Solutions","description":"Use our free Math Solver to instantly solve equations, algebra, calculus, and more. Get accurate answers with step-by-step explanations to learn math faster.","focusKeywords":"Math solver","pillarContent":false,"canonicalUrl":"","breadcrumbTitle":"","advancedRobots":{"max-snippet":"-1","max-video-preview":"-1","max-image-preview":"large"},"facebookTitle":"","facebookDescription":"","facebookImage":"","facebookImageID":"","facebookHasOverlay":false,"facebookImageOverlay":"","facebookAuthor":"","twitterCardType":"","twitterUseFacebook":true,"twitterTitle":"","twitterDescription":"","twitterImage":"","twitterImageID":"","twitterHasOverlay":false,"twitterImageOverlay":"","twitterPlayerUrl":"","twitterPlayerSize":"","twitterPlayerStream":"","twitterPlayerStreamCtype":"","twitterAppDescription":"","twitterAppIphoneName":"","twitterAppIphoneID":"","twitterAppIphoneUrl":"","twitterAppIpadName":"","twitterAppIpadID":"","twitterAppIpadUrl":"","twitterAppGoogleplayName":"","twitterAppGoogleplayID":"","twitterAppGoogleplayUrl":"","twitterAppCountry":"","robots":{"index":true},"twitterAuthor":"username","primaryTerm":0,"authorName":"Thien Nguyen","titleTemplate":"%title% %sep% %sitename%","descriptionTemplate":"%excerpt%","showScoreFrontend":true,"lockModifiedDate":false},"powerWords":["a cut above","absolute","absolutely","absolutely lowest","absurd","abuse","accurate","accuse","achieve","actionable","adaptable","adequate","admit","adorable","advantage","advice","affordable","aggravate","aggressive","agitated","agonizing","agony","alarmed","alarming","alienated","aligned","alive","all-inclusive","alluring","always","amazing","amp","animated","annihilate","announcing","anonymous","antagonistic","anxious","apocalypse","appalled","approved","approving","argumentative","armageddon","arrogant","ass kicking","assault","assured","astonishing","astounded","astounding","at ease","atrocious","attack","attractive","audacity","authentic","authoritative","authority","avoid","aware","awe-inspiring","awesome","awkward","backbone","backdoor","backed","backlash","backstabbing","badass","balanced","banned","bargain","barrage","basic","battle","beaming","beat down","beating","beautiful","beauty","begging","behind the scenes","belief","belong","best","best-selling","better","beware","big","billion","black market","blacklisted","blast","blessed","blinded","blissful","blood","bloodbath","bloodcurdling","bloody","blunder","blushing","bold","bomb","bona","bona fide","bonanza","bonus","bootleg","bottom line","bountiful","brave","bravery","brazen","break","breaking","breakthrough","breathtaking","bright","brilliant","broke","brutal","budget","buffoon","bullshit","bully","bumbling","buy","cadaver","calm","cancel anytime","capable","captivate","captivating","carefree","case study","cash","cataclysmic","catapult","catastrophe","caution","censored","centered","certain","certainly","certified","challenge","charming","cheap","cheat","cheat-sheet","cheer","cheerful","child-like","clarity","classified","clear","clueless","collapse","colorful","colossal","comfortable","compare","competitive","complete","completely","completeness","comprehensive","compromise","compulsive","concealed","conclusive","condemning","condescending","confess","confession","confessions","confident","confidential","conquer","conscientious","constructive","content","contrary","controlling","controversial","convenient","convert","cool","cooperative","copy","corpse","corrupt","corrupting","courage","courageous","cover-up","covert","coward","cowardly","crammed","crave","crazy","create","creative","cringeworthy","cripple","crisis","critical","crooked","crush","crushing","damaging","danger","dangerous","daring","dazzling","dead","deadline","deadly","death","decadent","deceived","deceptive","deep","defiance","definitely","definitive","defying","dejected","delicious","delight","delighted","delightful","delirious","delivered","demoralizing","deplorable","depraved","desire","desperate","despicable","destiny","destroy","detailed","devastating","devoted","diagnosed","direct","dirty","disadvantages","disastrous","discount","discover","disdainful","disempowered","disgusted","disgusting","dishonest","disillusioned","disoriented","distracted","distraught","distressed","distrustful","divulge","document","dollar","dominate","doomed","double","doubtful","download","dreadful","dreamy","drive","drowning","dumb","dynamic","eager","earnest","easily","easy","economical","ecstatic","edge","effective","efficient","effortless","elated","eliminate","elite","embarrass","embarrassed","embarrassing","emergency","emerging","emphasize","empowered","enchant","encouraged","endorsed","energetic","energy","enormous","enraged","enthusiastic","envy","epic","epidemic","essential","ethical","euphoric","evil","exactly","exasperated","excellent","excited","excitement","exciting","exclusive","exclusivity","excruciating","exhilarated","expensive","expert","explode","exploit","explosive","exposed","exquisite","extra","extraordinary","extremely","exuberant","eye-opening","fail","fail-proof","failure","faith","famous","fantasy","fascinating","fatigued","faux","faux pas","fearless","feast","feeble","festive","fide","fierce","fight","final","fine","fired","first","first ever","flirt","fluid","focus","focused","fool","fooled","foolish","forbidden","force-fed","forever","forgiving","forgotten","formula","fortune","foul","frantic","free","freebie","freedom","frenzied","frenzy","frightening","frisky","frugal","frustrated","fulfill","fulfilled","full","fully","fun","fun-loving","fundamentals","funniest","funny","furious","gambling","gargantuan","genius","genuine","gift","gigantic","giveaway","glamorous","gleeful","glorious","glowing","goddamn","gorgeous","graceful","grateful","gratified","gravity","great","greatest","greatness","greed","greedy","gripping","grit","grounded","growth","guaranteed","guilt","guilt-free","gullible","guts","hack","happiness","happy","harmful","harsh","hate","have you heard","havoc","hazardous","healthy","heart","heartbreaking","heartwarming","heavenly","hell","helpful","helplessness","hero","hesitant","hidden","high tech","highest","highly effective","hilarious","hoak","hoax","honest","honored","hope","hopeful","horribly","horrific","horrifying","horror","hostile","how to","huge","humility","humor","hurricane","hurry","hypnotic","idiot","ignite","illegal","illusive","imagination","immediately","imminently","impatience","impatient","impenetrable","important","impressive","improved","in the zone","incapable","incapacitated","incompetent","inconsiderate","increase","incredible","indecisive","indulgence","indulgent","inexpensive","inferior","informative","infuriated","ingredients","innocent","innovative","insane","insecure","insider","insidious","inspired","inspiring","instant savings","instantly","instructive","insult","intel","intelligent","intense","interesting","intriguing","introducing","invasion","investment","iron-clad","ironclad","irresistible","irs","is here","jackpot","jail","jaw-dropping","jealous","jeopardy","jittery","jovial","joyous","jubilant","judgmental","jumpstart","just arrived","keen","kickass","kickstart","kill","killed","killing","kills","know it all","lame","largest","lascivious","last","last chance","last minute","latest","laugh","laughing","launch","launching","lavishly","lawsuit","lazy","left behind","legendary","legitimate","liberal","liberated","lick","lies","life-changing","lifetime","light","lighthearted","likely","limited","literally","little-known","loathsome","lonely","looming","loser","lost","love","lucrative","lunatic","lurking","lust","luxurious","luxury","lying","magic","magical","magnificent","mainstream","malicious","mammoth","manipulative","marked down","massive","master","masterclass","maul","mediocre","meditative","meltdown","memorability","memorable","menacing","mesmerizing","meticulous","mind-blowing","minimalist","miracle","mired","mischievous","misgiving","missing out","mistake","monetize","money","moneyback","moneygrubbing","monumental","most important","motivated","mouth-watering","murder","mystery","nail","naked","natural","naughty","nazi","nest egg","never","new","nightmare","no good","no obligation","no one talks about","no questions asked","no risk","no strings attached","non-controlling","noted","novelty","now","obnoxious","obsessed","obsession","obvious","odd","off-kilter","off-limits","off-the record","offensive","official","okay","on-demand","open-minded","opportunities","optimistic","ordeal","outlawed","outrageousness","outstanding","overcome","overjoyed","overnight","overwhelmed","packed","painful","painless","painstaking","pale","panic","panicked","paralyzed","pas","passionate","pathetic","pay zero","payback","perfect","peril","perplexed","perspective","pessimistic","pioneering","piranha","pitfall","pitiful","placid","plague","played","playful","pleased","pluck","plummet","plunge","poison","poisonous","polarizing","poor","popular","portfolio","pound","powerful","powerless","practical","preposterous","prestige","price","priceless","pride","prison","privacy","private","privileged","prize","problem","productive","professional","profit","profitable","profound","promiscuous","promising","promote","protect","protected","proven","provocative","provoke","psychological","pummel","punch","punish","pus","quadruple","quality","quarrelsome","quick","quick-start","quickly","quiet","radiant","rare","ravenous","rebellious","recession-proof","reckoning","recognized","recommend","recreate","reduced","reflective","refugee","refund","refundable","reject","relaxed","release","relentless","reliable","remarkable","replicate","report","reprimanding","repulsed","repulsive","research","resentful","resourceful","responsible","responsive","rested","restricted","results","retaliating","reveal","revealing","revenge","revengeful","revisited","revolting","revolutionary","reward","rich","ridiculous","risky","riveting","rookie","rowdy","ruin","rules","ruthless","sabotaging","sacred","sadistic","sadly","sadness","safe","safety","sale","sampler","sarcastic","satisfied","savage","savagery","save","savings","savvy","scam","scandal","scandalous","scarce","scared","scary","scornful","scream","searing","secret","secret agenda","secret plot","secrets","secure","security","seductive","seething","seize","selected","self-hating","self-sufficient","sensational","senseless","sensual","serene","seriously","severe","sex","sexy","shaking","shameful","shameless","shaming","shatter","shellacking","shocking","should","shrewd","sick and tired","signs","silly","simple","simplicity","simplified","simplistic","sincere","sinful","sins","six-figure","sizable","sizzle","sizzled","sizzles","sizzling","sizzlingly","skill","skyrocket","slaughter","slave","sleazy","sleeping","sly","smash","smiling","smug","smuggle","smuggled","sneak-peek","sneaky","sniveling","snob","snooty","snotty","soar","soaring","solid","solution","spank","special","spectacular","speedy","spell-binding","spine","spirit","spirited","spiteful","spoiler","spontaneous","spotlight","spunky","squirming","stable","staggering","startling","steady","steal","stealthy","steamy","step-by-step","still","stoic","stop","strange","strangle","strategy","stressed","strong","strongly suggest","struggle","stuck up","studies","stunning","stupid","stupid-simple","sturdy","sublime","succeed","success","successful","suck","suddenly","suffer","sunny","super","super-human","superb","supercharge","superior","supported","supportive","sure","sure fire","surefire","surge","surging","surprise","surprised","surprising","survival","survive","suspicious","sweaty","swoon","swoon-worthy","tailspin","tank","tantalizing","targeted","tawdry","tease","technology","teetering","tempting","tenacious","tense","terrible","terrific","terrified","terrifying","terror","terrorist","tested","thankful","the truth","threaten","threatened","thrilled","thrilling","thug","ticked off","tickled","timely","today","torture","toxic","track record","trade secret","tragedy","tragic","transform","transparency","trap","trapped","trauma","traumatized","treacherous","treasure","tremendous","trend","tricks","triggers","triple","triumph","truly","trusting","trustworthy","truth","truthful","turbo-charge","turbocharges","tweaks","twitching","ultimate","unadulterated","unassuming","unauthorized","unbelievable","unburdened","uncaring","uncensored","uncertain","uncomfortable","unconditional","uncontrollable","unconventional","uncovered","undeniable","under priced","undercover","underground","underhanded","underused","unexpected","unforgettable","unheard of","unhurried","uninterested","unique","unjustified","unknowingly","unleashed","unlimited","unlock","unparalleled","unpopular","unreliable","unresponsive","unseen","unstable","unstoppable","unsure","unsurpassed","untapped","unusual","up-sell","upbeat","uplifted","uplifting","urge","urgent","useful","useless","validate","valor","valuable","value","vanquish","vaporize","venomous","verify","vibrant","vicious","victim","victory","vigorous","vilified","vindictive","violated","violent","volatile","vulnerable","waiting","wanted","wanton","warning","waste","weak","wealth","weird","what no one tells you","whip","whopping","wicked","wild","willpower","withheld","wonderful","wondrous","woozy","world","worry","worst","worthwhile","wounded","wreaking","youthful","zen","zinger"],"diacritics":{"A":"[\\u0041\\u24B6\\uFF21\\u00C0\\u00C1\\u00C2\\u1EA6\\u1EA4\\u1EAA\\u1EA8\\u00C3\\u0100\\u0102\\u1EB0\\u1EAE\\u1EB4\\u1EB2\\u0226\\u01E0\\u00C4\\u01DE\\u1EA2\\u00C5\\u01FA\\u01CD\\u0200\\u0202\\u1EA0\\u1EAC\\u1EB6\\u1E00\\u0104\\u023A\\u2C6F]","AA":"[\\uA732]","AE":"[\\u00C6\\u01FC\\u01E2]","AO":"[\\uA734]","AU":"[\\uA736]","AV":"[\\uA738\\uA73A]","AY":"[\\uA73C]","B":"[\\u0042\\u24B7\\uFF22\\u1E02\\u1E04\\u1E06\\u0243\\u0182\\u0181]","C":"[\\u0043\\u24B8\\uFF23\\u0106\\u0108\\u010A\\u010C\\u00C7\\u1E08\\u0187\\u023B\\uA73E]","D":"[\\u0044\\u24B9\\uFF24\\u1E0A\\u010E\\u1E0C\\u1E10\\u1E12\\u1E0E\\u0110\\u018B\\u018A\\u0189\\uA779]","DZ":"[\\u01F1\\u01C4]","Dz":"[\\u01F2\\u01C5]","E":"[\\u0045\\u24BA\\uFF25\\u00C8\\u00C9\\u00CA\\u1EC0\\u1EBE\\u1EC4\\u1EC2\\u1EBC\\u0112\\u1E14\\u1E16\\u0114\\u0116\\u00CB\\u1EBA\\u011A\\u0204\\u0206\\u1EB8\\u1EC6\\u0228\\u1E1C\\u0118\\u1E18\\u1E1A\\u0190\\u018E]","F":"[\\u0046\\u24BB\\uFF26\\u1E1E\\u0191\\uA77B]","G":"[\\u0047\\u24BC\\uFF27\\u01F4\\u011C\\u1E20\\u011E\\u0120\\u01E6\\u0122\\u01E4\\u0193\\uA7A0\\uA77D\\uA77E]","H":"[\\u0048\\u24BD\\uFF28\\u0124\\u1E22\\u1E26\\u021E\\u1E24\\u1E28\\u1E2A\\u0126\\u2C67\\u2C75\\uA78D]","I":"[\\u0049\\u24BE\\uFF29\\u00CC\\u00CD\\u00CE\\u0128\\u012A\\u012C\\u0130\\u00CF\\u1E2E\\u1EC8\\u01CF\\u0208\\u020A\\u1ECA\\u012E\\u1E2C\\u0197]","J":"[\\u004A\\u24BF\\uFF2A\\u0134\\u0248]","K":"[\\u004B\\u24C0\\uFF2B\\u1E30\\u01E8\\u1E32\\u0136\\u1E34\\u0198\\u2C69\\uA740\\uA742\\uA744\\uA7A2]","L":"[\\u004C\\u24C1\\uFF2C\\u013F\\u0139\\u013D\\u1E36\\u1E38\\u013B\\u1E3C\\u1E3A\\u0141\\u023D\\u2C62\\u2C60\\uA748\\uA746\\uA780]","LJ":"[\\u01C7]","Lj":"[\\u01C8]","M":"[\\u004D\\u24C2\\uFF2D\\u1E3E\\u1E40\\u1E42\\u2C6E\\u019C]","N":"[\\u004E\\u24C3\\uFF2E\\u01F8\\u0143\\u00D1\\u1E44\\u0147\\u1E46\\u0145\\u1E4A\\u1E48\\u0220\\u019D\\uA790\\uA7A4]","NJ":"[\\u01CA]","Nj":"[\\u01CB]","O":"[\\u004F\\u24C4\\uFF2F\\u00D2\\u00D3\\u00D4\\u1ED2\\u1ED0\\u1ED6\\u1ED4\\u00D5\\u1E4C\\u022C\\u1E4E\\u014C\\u1E50\\u1E52\\u014E\\u022E\\u0230\\u00D6\\u022A\\u1ECE\\u0150\\u01D1\\u020C\\u020E\\u01A0\\u1EDC\\u1EDA\\u1EE0\\u1EDE\\u1EE2\\u1ECC\\u1ED8\\u01EA\\u01EC\\u00D8\\u01FE\\u0186\\u019F\\uA74A\\uA74C]","OI":"[\\u01A2]","OO":"[\\uA74E]","OU":"[\\u0222]","P":"[\\u0050\\u24C5\\uFF30\\u1E54\\u1E56\\u01A4\\u2C63\\uA750\\uA752\\uA754]","Q":"[\\u0051\\u24C6\\uFF31\\uA756\\uA758\\u024A]","R":"[\\u0052\\u24C7\\uFF32\\u0154\\u1E58\\u0158\\u0210\\u0212\\u1E5A\\u1E5C\\u0156\\u1E5E\\u024C\\u2C64\\uA75A\\uA7A6\\uA782]","S":"[\\u0053\\u24C8\\uFF33\\u1E9E\\u015A\\u1E64\\u015C\\u1E60\\u0160\\u1E66\\u1E62\\u1E68\\u0218\\u015E\\u2C7E\\uA7A8\\uA784]","T":"[\\u0054\\u24C9\\uFF34\\u1E6A\\u0164\\u1E6C\\u021A\\u0162\\u1E70\\u1E6E\\u0166\\u01AC\\u01AE\\u023E\\uA786]","TZ":"[\\uA728]","U":"[\\u0055\\u24CA\\uFF35\\u00D9\\u00DA\\u00DB\\u0168\\u1E78\\u016A\\u1E7A\\u016C\\u00DC\\u01DB\\u01D7\\u01D5\\u01D9\\u1EE6\\u016E\\u0170\\u01D3\\u0214\\u0216\\u01AF\\u1EEA\\u1EE8\\u1EEE\\u1EEC\\u1EF0\\u1EE4\\u1E72\\u0172\\u1E76\\u1E74\\u0244]","V":"[\\u0056\\u24CB\\uFF36\\u1E7C\\u1E7E\\u01B2\\uA75E\\u0245]","VY":"[\\uA760]","W":"[\\u0057\\u24CC\\uFF37\\u1E80\\u1E82\\u0174\\u1E86\\u1E84\\u1E88\\u2C72]","X":"[\\u0058\\u24CD\\uFF38\\u1E8A\\u1E8C]","Y":"[\\u0059\\u24CE\\uFF39\\u1EF2\\u00DD\\u0176\\u1EF8\\u0232\\u1E8E\\u0178\\u1EF6\\u1EF4\\u01B3\\u024E\\u1EFE]","Z":"[\\u005A\\u24CF\\uFF3A\\u0179\\u1E90\\u017B\\u017D\\u1E92\\u1E94\\u01B5\\u0224\\u2C7F\\u2C6B\\uA762]","a":"[\\u0061\\u24D0\\uFF41\\u1E9A\\u00E0\\u00E1\\u00E2\\u1EA7\\u1EA5\\u1EAB\\u1EA9\\u00E3\\u0101\\u0103\\u1EB1\\u1EAF\\u1EB5\\u1EB3\\u0227\\u01E1\\u00E4\\u01DF\\u1EA3\\u00E5\\u01FB\\u01CE\\u0201\\u0203\\u1EA1\\u1EAD\\u1EB7\\u1E01\\u0105\\u2C65\\u0250]","aa":"[\\uA733]","ae":"[\\u00E6\\u01FD\\u01E3]","ao":"[\\uA735]","au":"[\\uA737]","av":"[\\uA739\\uA73B]","ay":"[\\uA73D]","b":"[\\u0062\\u24D1\\uFF42\\u1E03\\u1E05\\u1E07\\u0180\\u0183\\u0253]","c":"[\\u0063\\u24D2\\uFF43\\u0107\\u0109\\u010B\\u010D\\u00E7\\u1E09\\u0188\\u023C\\uA73F\\u2184]","d":"[\\u0064\\u24D3\\uFF44\\u1E0B\\u010F\\u1E0D\\u1E11\\u1E13\\u1E0F\\u0111\\u018C\\u0256\\u0257\\uA77A]","dz":"[\\u01F3\\u01C6]","e":"[\\u0065\\u24D4\\uFF45\\u00E8\\u00E9\\u00EA\\u1EC1\\u1EBF\\u1EC5\\u1EC3\\u1EBD\\u0113\\u1E15\\u1E17\\u0115\\u0117\\u00EB\\u1EBB\\u011B\\u0205\\u0207\\u1EB9\\u1EC7\\u0229\\u1E1D\\u0119\\u1E19\\u1E1B\\u0247\\u025B\\u01DD]","f":"[\\u0066\\u24D5\\uFF46\\u1E1F\\u0192\\uA77C]","g":"[\\u0067\\u24D6\\uFF47\\u01F5\\u011D\\u1E21\\u011F\\u0121\\u01E7\\u0123\\u01E5\\u0260\\uA7A1\\u1D79\\uA77F]","h":"[\\u0068\\u24D7\\uFF48\\u0125\\u1E23\\u1E27\\u021F\\u1E25\\u1E29\\u1E2B\\u1E96\\u0127\\u2C68\\u2C76\\u0265]","hv":"[\\u0195]","i":"[\\u0069\\u24D8\\uFF49\\u00EC\\u00ED\\u00EE\\u0129\\u012B\\u012D\\u00EF\\u1E2F\\u1EC9\\u01D0\\u0209\\u020B\\u1ECB\\u012F\\u1E2D\\u0268\\u0131]","j":"[\\u006A\\u24D9\\uFF4A\\u0135\\u01F0\\u0249]","k":"[\\u006B\\u24DA\\uFF4B\\u1E31\\u01E9\\u1E33\\u0137\\u1E35\\u0199\\u2C6A\\uA741\\uA743\\uA745\\uA7A3]","l":"[\\u006C\\u24DB\\uFF4C\\u0140\\u013A\\u013E\\u1E37\\u1E39\\u013C\\u1E3D\\u1E3B\\u017F\\u0142\\u019A\\u026B\\u2C61\\uA749\\uA781\\uA747]","lj":"[\\u01C9]","m":"[\\u006D\\u24DC\\uFF4D\\u1E3F\\u1E41\\u1E43\\u0271\\u026F]","n":"[\\u006E\\u24DD\\uFF4E\\u01F9\\u0144\\u00F1\\u1E45\\u0148\\u1E47\\u0146\\u1E4B\\u1E49\\u019E\\u0272\\u0149\\uA791\\uA7A5]","nj":"[\\u01CC]","o":"[\\u006F\\u24DE\\uFF4F\\u00F2\\u00F3\\u00F4\\u1ED3\\u1ED1\\u1ED7\\u1ED5\\u00F5\\u1E4D\\u022D\\u1E4F\\u014D\\u1E51\\u1E53\\u014F\\u022F\\u0231\\u00F6\\u022B\\u1ECF\\u0151\\u01D2\\u020D\\u020F\\u01A1\\u1EDD\\u1EDB\\u1EE1\\u1EDF\\u1EE3\\u1ECD\\u1ED9\\u01EB\\u01ED\\u00F8\\u01FF\\u0254\\uA74B\\uA74D\\u0275]","oi":"[\\u01A3]","ou":"[\\u0223]","oo":"[\\uA74F]","p":"[\\u0070\\u24DF\\uFF50\\u1E55\\u1E57\\u01A5\\u1D7D\\uA751\\uA753\\uA755]","q":"[\\u0071\\u24E0\\uFF51\\u024B\\uA757\\uA759]","r":"[\\u0072\\u24E1\\uFF52\\u0155\\u1E59\\u0159\\u0211\\u0213\\u1E5B\\u1E5D\\u0157\\u1E5F\\u024D\\u027D\\uA75B\\uA7A7\\uA783]","s":"[\\u0073\\u24E2\\uFF53\\u015B\\u1E65\\u015D\\u1E61\\u0161\\u1E67\\u1E63\\u1E69\\u0219\\u015F\\u023F\\uA7A9\\uA785\\u1E9B]","ss":"[\\u00DF]","t":"[\\u0074\\u24E3\\uFF54\\u1E6B\\u1E97\\u0165\\u1E6D\\u021B\\u0163\\u1E71\\u1E6F\\u0167\\u01AD\\u0288\\u2C66\\uA787]","tz":"[\\uA729]","u":"[\\u0075\\u24E4\\uFF55\\u00F9\\u00FA\\u00FB\\u0169\\u1E79\\u016B\\u1E7B\\u016D\\u00FC\\u01DC\\u01D8\\u01D6\\u01DA\\u1EE7\\u016F\\u0171\\u01D4\\u0215\\u0217\\u01B0\\u1EEB\\u1EE9\\u1EEF\\u1EED\\u1EF1\\u1EE5\\u1E73\\u0173\\u1E77\\u1E75\\u0289]","v":"[\\u0076\\u24E5\\uFF56\\u1E7D\\u1E7F\\u028B\\uA75F\\u028C]","vy":"[\\uA761]","w":"[\\u0077\\u24E6\\uFF57\\u1E81\\u1E83\\u0175\\u1E87\\u1E85\\u1E98\\u1E89\\u2C73]","x":"[\\u0078\\u24E7\\uFF58\\u1E8B\\u1E8D]","y":"[\\u0079\\u24E8\\uFF59\\u1EF3\\u00FD\\u0177\\u1EF9\\u0233\\u1E8F\\u00FF\\u1EF7\\u1E99\\u1EF5\\u01B4\\u024F\\u1EFF]","z":"[\\u007A\\u24E9\\uFF5A\\u017A\\u1E91\\u017C\\u017E\\u1E93\\u1E95\\u01B6\\u0225\\u0240\\u2C6C\\uA763]"},"researchesTests":["contentHasTOC","contentHasShortParagraphs","contentHasAssets","keywordInTitle","keywordInMetaDescription","keywordInPermalink","keywordIn10Percent","keywordInContent","keywordInSubheadings","keywordInImageAlt","keywordDensity","keywordNotUsed","lengthContent","lengthPermalink","linksHasInternal","linksHasExternals","linksNotAllExternals","titleStartWithKeyword","titleSentiment","titleHasPowerWords","titleHasNumber","hasContentAI"],"hasRedirection":true,"hasBreadcrumb":true},"homeUrl":"https:\/\/www.ezcalculatoronline.com","objectID":5726,"objectType":"post","locale":"en","localeFull":"en_US","overlayImages":{"play":{"name":"Play icon","url":"https:\/\/www.ezcalculatoronline.com\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/icon-play.png","path":"\/home\/dh_7btfqe\/ezcalculatoronline.com\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/icon-play.png","position":"middle_center"},"gif":{"name":"GIF icon","url":"https:\/\/www.ezcalculatoronline.com\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/icon-gif.png","path":"\/home\/dh_7btfqe\/ezcalculatoronline.com\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/icon-gif.png","position":"middle_center"}},"defautOgImage":"https:\/\/www.ezcalculatoronline.com\/wp-content\/uploads\/2025\/11\/EZCALCULATORONLINE-LOGO-2.png","customPermalinks":true,"isUserRegistered":false,"autoSuggestKeywords":false,"connectSiteUrl":"https:\/\/rankmath.com\/auth?site=https%3A%2F%2Fwww.ezcalculatoronline.com&r=https%3A%2F%2Fwww.ezcalculatoronline.com%2Fes%2Fwp-json%2Fwp%2Fv2%2Fpages%2F5726%3Fnonce%3D064cc9b4da","maxTags":5,"trendsIcon":"<svg viewBox=\"0 0 610 610\"><path d=\"M18.85,446,174.32,290.48l58.08,58.08L76.93,504a14.54,14.54,0,0,1-20.55,0L18.83,466.48a14.54,14.54,0,0,1,0-20.55Z\" style=\"fill:#4285f4\"\/><path d=\"M242.65,242.66,377.59,377.6l-47.75,47.75a14.54,14.54,0,0,1-20.55,0L174.37,290.43l47.75-47.75A14.52,14.52,0,0,1,242.65,242.66Z\" style=\"fill:#ea4335\"\/><polygon points=\"319.53 319.53 479.26 159.8 537.34 217.88 377.61 377.62 319.53 319.53\" style=\"fill:#fabb05\"\/><path d=\"M594.26,262.73V118.61h0a16.94,16.94,0,0,0-16.94-16.94H433.2a16.94,16.94,0,0,0-12,28.92L565.34,274.71h0a16.94,16.94,0,0,0,28.92-12Z\" style=\"fill:#34a853\"\/><rect width=\"610\" height=\"610\" style=\"fill:none\"\/><\/svg>","showScore":true,"siteFavIcon":"https:\/\/www.ezcalculatoronline.com\/wp-content\/uploads\/2025\/05\/cropped-ezcaculator-32x32.webp","canUser":{"general":false,"advanced":false,"snippet":false,"social":false,"analysis":false,"analytics":false,"content_ai":false},"showKeywordIntent":true,"isPro":false,"is_front_page":false,"trendsUpgradeLink":"https:\/\/rankmath.com\/pricing\/?utm_source=Plugin&utm_medium=CE%20General%20Tab%20Trends&utm_campaign=WP","trendsUpgradeLabel":"Upgrade","trendsPreviewImage":"https:\/\/www.ezcalculatoronline.com\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/trends-preview.jpg","currentEditor":false,"homepageData":{"assessor":{"powerWords":["a cut above","absolute","absolutely","absolutely lowest","absurd","abuse","accurate","accuse","achieve","actionable","adaptable","adequate","admit","adorable","advantage","advice","affordable","aggravate","aggressive","agitated","agonizing","agony","alarmed","alarming","alienated","aligned","alive","all-inclusive","alluring","always","amazing","amp","animated","annihilate","announcing","anonymous","antagonistic","anxious","apocalypse","appalled","approved","approving","argumentative","armageddon","arrogant","ass kicking","assault","assured","astonishing","astounded","astounding","at ease","atrocious","attack","attractive","audacity","authentic","authoritative","authority","avoid","aware","awe-inspiring","awesome","awkward","backbone","backdoor","backed","backlash","backstabbing","badass","balanced","banned","bargain","barrage","basic","battle","beaming","beat down","beating","beautiful","beauty","begging","behind the scenes","belief","belong","best","best-selling","better","beware","big","billion","black market","blacklisted","blast","blessed","blinded","blissful","blood","bloodbath","bloodcurdling","bloody","blunder","blushing","bold","bomb","bona","bona fide","bonanza","bonus","bootleg","bottom line","bountiful","brave","bravery","brazen","break","breaking","breakthrough","breathtaking","bright","brilliant","broke","brutal","budget","buffoon","bullshit","bully","bumbling","buy","cadaver","calm","cancel anytime","capable","captivate","captivating","carefree","case study","cash","cataclysmic","catapult","catastrophe","caution","censored","centered","certain","certainly","certified","challenge","charming","cheap","cheat","cheat-sheet","cheer","cheerful","child-like","clarity","classified","clear","clueless","collapse","colorful","colossal","comfortable","compare","competitive","complete","completely","completeness","comprehensive","compromise","compulsive","concealed","conclusive","condemning","condescending","confess","confession","confessions","confident","confidential","conquer","conscientious","constructive","content","contrary","controlling","controversial","convenient","convert","cool","cooperative","copy","corpse","corrupt","corrupting","courage","courageous","cover-up","covert","coward","cowardly","crammed","crave","crazy","create","creative","cringeworthy","cripple","crisis","critical","crooked","crush","crushing","damaging","danger","dangerous","daring","dazzling","dead","deadline","deadly","death","decadent","deceived","deceptive","deep","defiance","definitely","definitive","defying","dejected","delicious","delight","delighted","delightful","delirious","delivered","demoralizing","deplorable","depraved","desire","desperate","despicable","destiny","destroy","detailed","devastating","devoted","diagnosed","direct","dirty","disadvantages","disastrous","discount","discover","disdainful","disempowered","disgusted","disgusting","dishonest","disillusioned","disoriented","distracted","distraught","distressed","distrustful","divulge","document","dollar","dominate","doomed","double","doubtful","download","dreadful","dreamy","drive","drowning","dumb","dynamic","eager","earnest","easily","easy","economical","ecstatic","edge","effective","efficient","effortless","elated","eliminate","elite","embarrass","embarrassed","embarrassing","emergency","emerging","emphasize","empowered","enchant","encouraged","endorsed","energetic","energy","enormous","enraged","enthusiastic","envy","epic","epidemic","essential","ethical","euphoric","evil","exactly","exasperated","excellent","excited","excitement","exciting","exclusive","exclusivity","excruciating","exhilarated","expensive","expert","explode","exploit","explosive","exposed","exquisite","extra","extraordinary","extremely","exuberant","eye-opening","fail","fail-proof","failure","faith","famous","fantasy","fascinating","fatigued","faux","faux pas","fearless","feast","feeble","festive","fide","fierce","fight","final","fine","fired","first","first ever","flirt","fluid","focus","focused","fool","fooled","foolish","forbidden","force-fed","forever","forgiving","forgotten","formula","fortune","foul","frantic","free","freebie","freedom","frenzied","frenzy","frightening","frisky","frugal","frustrated","fulfill","fulfilled","full","fully","fun","fun-loving","fundamentals","funniest","funny","furious","gambling","gargantuan","genius","genuine","gift","gigantic","giveaway","glamorous","gleeful","glorious","glowing","goddamn","gorgeous","graceful","grateful","gratified","gravity","great","greatest","greatness","greed","greedy","gripping","grit","grounded","growth","guaranteed","guilt","guilt-free","gullible","guts","hack","happiness","happy","harmful","harsh","hate","have you heard","havoc","hazardous","healthy","heart","heartbreaking","heartwarming","heavenly","hell","helpful","helplessness","hero","hesitant","hidden","high tech","highest","highly effective","hilarious","hoak","hoax","honest","honored","hope","hopeful","horribly","horrific","horrifying","horror","hostile","how to","huge","humility","humor","hurricane","hurry","hypnotic","idiot","ignite","illegal","illusive","imagination","immediately","imminently","impatience","impatient","impenetrable","important","impressive","improved","in the zone","incapable","incapacitated","incompetent","inconsiderate","increase","incredible","indecisive","indulgence","indulgent","inexpensive","inferior","informative","infuriated","ingredients","innocent","innovative","insane","insecure","insider","insidious","inspired","inspiring","instant savings","instantly","instructive","insult","intel","intelligent","intense","interesting","intriguing","introducing","invasion","investment","iron-clad","ironclad","irresistible","irs","is here","jackpot","jail","jaw-dropping","jealous","jeopardy","jittery","jovial","joyous","jubilant","judgmental","jumpstart","just arrived","keen","kickass","kickstart","kill","killed","killing","kills","know it all","lame","largest","lascivious","last","last chance","last minute","latest","laugh","laughing","launch","launching","lavishly","lawsuit","lazy","left behind","legendary","legitimate","liberal","liberated","lick","lies","life-changing","lifetime","light","lighthearted","likely","limited","literally","little-known","loathsome","lonely","looming","loser","lost","love","lucrative","lunatic","lurking","lust","luxurious","luxury","lying","magic","magical","magnificent","mainstream","malicious","mammoth","manipulative","marked down","massive","master","masterclass","maul","mediocre","meditative","meltdown","memorability","memorable","menacing","mesmerizing","meticulous","mind-blowing","minimalist","miracle","mired","mischievous","misgiving","missing out","mistake","monetize","money","moneyback","moneygrubbing","monumental","most important","motivated","mouth-watering","murder","mystery","nail","naked","natural","naughty","nazi","nest egg","never","new","nightmare","no good","no obligation","no one talks about","no questions asked","no risk","no strings attached","non-controlling","noted","novelty","now","obnoxious","obsessed","obsession","obvious","odd","off-kilter","off-limits","off-the record","offensive","official","okay","on-demand","open-minded","opportunities","optimistic","ordeal","outlawed","outrageousness","outstanding","overcome","overjoyed","overnight","overwhelmed","packed","painful","painless","painstaking","pale","panic","panicked","paralyzed","pas","passionate","pathetic","pay zero","payback","perfect","peril","perplexed","perspective","pessimistic","pioneering","piranha","pitfall","pitiful","placid","plague","played","playful","pleased","pluck","plummet","plunge","poison","poisonous","polarizing","poor","popular","portfolio","pound","powerful","powerless","practical","preposterous","prestige","price","priceless","pride","prison","privacy","private","privileged","prize","problem","productive","professional","profit","profitable","profound","promiscuous","promising","promote","protect","protected","proven","provocative","provoke","psychological","pummel","punch","punish","pus","quadruple","quality","quarrelsome","quick","quick-start","quickly","quiet","radiant","rare","ravenous","rebellious","recession-proof","reckoning","recognized","recommend","recreate","reduced","reflective","refugee","refund","refundable","reject","relaxed","release","relentless","reliable","remarkable","replicate","report","reprimanding","repulsed","repulsive","research","resentful","resourceful","responsible","responsive","rested","restricted","results","retaliating","reveal","revealing","revenge","revengeful","revisited","revolting","revolutionary","reward","rich","ridiculous","risky","riveting","rookie","rowdy","ruin","rules","ruthless","sabotaging","sacred","sadistic","sadly","sadness","safe","safety","sale","sampler","sarcastic","satisfied","savage","savagery","save","savings","savvy","scam","scandal","scandalous","scarce","scared","scary","scornful","scream","searing","secret","secret agenda","secret plot","secrets","secure","security","seductive","seething","seize","selected","self-hating","self-sufficient","sensational","senseless","sensual","serene","seriously","severe","sex","sexy","shaking","shameful","shameless","shaming","shatter","shellacking","shocking","should","shrewd","sick and tired","signs","silly","simple","simplicity","simplified","simplistic","sincere","sinful","sins","six-figure","sizable","sizzle","sizzled","sizzles","sizzling","sizzlingly","skill","skyrocket","slaughter","slave","sleazy","sleeping","sly","smash","smiling","smug","smuggle","smuggled","sneak-peek","sneaky","sniveling","snob","snooty","snotty","soar","soaring","solid","solution","spank","special","spectacular","speedy","spell-binding","spine","spirit","spirited","spiteful","spoiler","spontaneous","spotlight","spunky","squirming","stable","staggering","startling","steady","steal","stealthy","steamy","step-by-step","still","stoic","stop","strange","strangle","strategy","stressed","strong","strongly suggest","struggle","stuck up","studies","stunning","stupid","stupid-simple","sturdy","sublime","succeed","success","successful","suck","suddenly","suffer","sunny","super","super-human","superb","supercharge","superior","supported","supportive","sure","sure fire","surefire","surge","surging","surprise","surprised","surprising","survival","survive","suspicious","sweaty","swoon","swoon-worthy","tailspin","tank","tantalizing","targeted","tawdry","tease","technology","teetering","tempting","tenacious","tense","terrible","terrific","terrified","terrifying","terror","terrorist","tested","thankful","the truth","threaten","threatened","thrilled","thrilling","thug","ticked off","tickled","timely","today","torture","toxic","track record","trade secret","tragedy","tragic","transform","transparency","trap","trapped","trauma","traumatized","treacherous","treasure","tremendous","trend","tricks","triggers","triple","triumph","truly","trusting","trustworthy","truth","truthful","turbo-charge","turbocharges","tweaks","twitching","ultimate","unadulterated","unassuming","unauthorized","unbelievable","unburdened","uncaring","uncensored","uncertain","uncomfortable","unconditional","uncontrollable","unconventional","uncovered","undeniable","under priced","undercover","underground","underhanded","underused","unexpected","unforgettable","unheard of","unhurried","uninterested","unique","unjustified","unknowingly","unleashed","unlimited","unlock","unparalleled","unpopular","unreliable","unresponsive","unseen","unstable","unstoppable","unsure","unsurpassed","untapped","unusual","up-sell","upbeat","uplifted","uplifting","urge","urgent","useful","useless","validate","valor","valuable","value","vanquish","vaporize","venomous","verify","vibrant","vicious","victim","victory","vigorous","vilified","vindictive","violated","violent","volatile","vulnerable","waiting","wanted","wanton","warning","waste","weak","wealth","weird","what no one tells you","whip","whopping","wicked","wild","willpower","withheld","wonderful","wondrous","woozy","world","worry","worst","worthwhile","wounded","wreaking","youthful","zen","zinger"],"diacritics":true,"researchesTests":["contentHasTOC","contentHasShortParagraphs","contentHasAssets","keywordInTitle","keywordInMetaDescription","keywordInPermalink","keywordIn10Percent","keywordInContent","keywordInSubheadings","keywordInImageAlt","keywordDensity","keywordNotUsed","lengthContent","lengthPermalink","linksHasInternal","linksHasExternals","linksNotAllExternals","titleStartWithKeyword","titleSentiment","titleHasPowerWords","titleHasNumber","hasContentAI"],"hasBreadcrumb":true,"serpData":{"title":"%sitename% %sep% %sitedesc%","description":"%sitedesc%","titleTemplate":"%sitename% %page% %sep% %sitedesc%","descriptionTemplate":"","focusKeywords":"","breadcrumbTitle":"Home","robots":{"index":true},"advancedRobots":{"max-snippet":"-1","max-video-preview":"-1","max-image-preview":"large"},"facebookTitle":"","facebookDescription":"","facebookImage":"","facebookImageID":""}}},"tocTitle":"Table of Contents","tocExcludeHeadings":[],"listStyle":"ul"},"_links":{"self":[{"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/pages\/5726","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/comments?post=5726"}],"version-history":[{"count":11,"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/pages\/5726\/revisions"}],"predecessor-version":[{"id":10842,"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/pages\/5726\/revisions\/10842"}],"up":[{"embeddable":true,"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/pages\/3595"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/media\/5738"}],"wp:attachment":[{"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/media?parent=5726"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}