{"id":2126,"date":"2026-10-22T06:48:32","date_gmt":"2026-10-22T06:48:32","guid":{"rendered":"https:\/\/thefiniteearth.org\/?page_id=2126"},"modified":"2026-10-29T08:58:47","modified_gmt":"2026-10-29T08:58:47","slug":"see-your-impact","status":"publish","type":"page","link":"https:\/\/thefiniteearth.org\/hindi\/see-your-impact\/","title":{"rendered":"SEE YOUR IMPACT"},"content":{"rendered":"<p>Climate Satyagraha \u2013 Your Impact[tcb-script defer=&#8221;&#8221; src=&#8221;https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/html2canvas\/1.4.1\/html2canvas.min.js&#8221;][\/tcb-script]  <!-- \u2500\u2500 Hero: same Earth band + 4-step flow as the pledge page (step 4 active) \u2500\u2500 -->      <img src=\"https:\/\/thefiniteearth.org\/wp-content\/uploads\/2026\/01\/Earth-scaled.png\" alt=\"\" decoding=\"async\" fetchpriority=\"high\">              <\/p>\n<h1>See Your Impact<\/h1>\n<p>Measure the change you are creating.<\/p>\n<p>              <span>1<\/span><span>Register My Pledge<\/span>        <span aria-hidden=\"true\"><\/span>        <span>2<\/span><span>Get Your Code<\/span>        <span aria-hidden=\"true\"><\/span>        <span>3<\/span><span>Invite Others<\/span>        <span aria-hidden=\"true\"><\/span>        <span>4<\/span><span>See Your Impact<\/span>                    <\/p>\n<h2>Track Your Impact<\/h2>\n<p>Climate change is not caused by a few \u2014 <strong>it is the result of everyday consumption by all of us.<\/strong> And it will not be solved by a few \u2014 <strong>it requires action from everyone.<\/strong><\/p>\n<p>Your effort matters. Every person who takes the <strong>Climate Satyagraha Pledge<\/strong> helps promote finite consumption and meaningful climate action.<\/p>\n<p>Enter your <strong>Climate Satyagrahi Code (CS Code)<\/strong> to see how many people have joined the movement through your efforts.<\/p>\n<p>                      Your Climate Satyagrahi Code                                        <span>SEE MY IMPACT<\/span>            <span aria-hidden=\"true\"><\/span>                          <span>or<\/span>        See the impact of your city                                        <span>SEARCH CITY<\/span>            <span aria-hidden=\"true\"><\/span>                                                            Forgot CS Code                                            Download Your DP                                        <!-- DP BUILDER PANEL -->                          Back to Impact Search                              <span><img decoding=\"async\" role=\"img\" alt=\"\ud83c\udf96\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/svg\/1f396.svg\"><\/span>          Build Your Satyagrahi Badge                                    How to use                                      1          Photo                          2          Title                          3          Preview                    <!-- STEP 1: Photo -->                                    <img decoding=\"async\" id=\"dp-photo-preview\" src=\"\" alt=\"Preview\">                                                  Upload your photo            Tap to choose from gallery or camera                                            <span>Photo Guidelines<\/span>          <\/p>\n<ul>\n<li>Use a clear, well-lit face photo (selfie works best)<\/li>\n<li>Square crop recommended \u2022 Min 500\u00d7500px<\/li>\n<li>Upload this photo, download it from here, and set it as your DP.<\/li>\n<\/ul>\n<p>                          Choose Identity                              <!-- STEP 2: Title -->              <span>Select the label that appears on your badge:<\/span>                          Preview Badge                                              Back                    <!-- STEP 3: Preview & Share -->                                                              <span>Face Position<\/span>                                            <span>Photo Zoom<\/span>                                      Drag photo to adjust position                            Download HD Badge                Share Your Badge                  <a href=\"#\" target=\"_blank\" rel=\"noopener\" id=\"dp-share-wa\">                        WhatsApp          <\/a>          <a href=\"#\" target=\"_blank\" rel=\"noopener\" id=\"dp-share-ig\">                        Instagram          <\/a>          <a href=\"#\" target=\"_blank\" rel=\"noopener\" id=\"dp-share-li\">                        LinkedIn          <\/a>                          <a href=\"#\" target=\"_blank\" rel=\"noopener\" id=\"dp-share-x\">                        Twitter \/ X          <\/a>          <a href=\"#\" target=\"_blank\" rel=\"noopener\" id=\"dp-share-fb\">                        Facebook          <\/a>                <\/p>\n<p>After downloading, set the image as your WhatsApp or social media profile picture to support and spread the movement!<\/p>\n<p>                            Back                      <!-- Forgot panel -->                          Back to Impact Search            <span>Find your CS Code by Name, Phone or Email<\/span>                        Name                          Phone                          Email                                                <span>FIND MY CS CODE<\/span>        <span aria-hidden=\"true\"><\/span>                          <\/p>\n<p>Still having trouble? <strong>Contact us<\/strong> &nbsp;\u2014&nbsp;      <a href=\"tel:9039034404\">                9039034404      <\/a>      <span>\u00b7<\/span>      <a href=\"mailto:femus@energyswaraj.org\">                femus@energyswaraj.org      <\/a>    <\/p>\n<p>Share your CS Code and grow the Climate Satyagrahi community.<\/p>\n<p>  <!-- HOW TO USE MODAL -->      \u00d7    <\/p>\n<h3>How to Build Your Badge<\/h3>\n<p>          1      <strong>Step 1 \u2013 Photo:<\/strong> Upload your selfie or portrait photo (square or portrait works best, min 500\u00d7500px).              2      <strong>Step 2 \u2013 Title:<\/strong> Choose any one of the 3 identity titles that will appear on your badge.              3      <strong>Step 3 \u2013 Preview &amp; Share:<\/strong>        <br \/>\u2022 Use the <strong>Face Position<\/strong> slider to move the photo up or down.        <br \/>\u2022 Use the <strong>Photo Zoom<\/strong> slider to zoom in or out.        <br \/>\u2022 Click <strong>Download HD Badge<\/strong> to save a high-quality PNG.                    <strong>Tip:<\/strong> After downloading, set the image as your WhatsApp or social media profile picture to spread the movement!      <!-- CERTIFICATE OVERLAY     #cert-wrapper \/ #cert-img \/ #co-name \/ #co-date ko mat hatayein \u2014     certificate ki photo inhi se banti hai. (Inki CSS upar \"#cert-overlay\" block me hai.) -->      \u00d7    Your Certificate          <img decoding=\"async\" id=\"cert-img\" src=\"\" crossorigin=\"anonymous\" alt=\"Certificate\" onload=\"positionCertOverlays()\">                                          Download Certificate            Close      [tcb-script]\/* =====================================================================   1) DATA SETTINGS   ===================================================================== *\/var SHEET_ID = &#8216;1mvbjtWsdNMMKcMkIgDSBXRacCBZ1YbDizKzksGut0To&#8217;;\/* Data WordPress se aata hai (FEM&#8217;Us Data API v2 snippet).   API_BASE           = WordPress ke endpoints ka address   USE_SHEET_FALLBACK = agar naya API kabhi band ho to purane raaste                        (\/pledges, phir Google Sheet) se data le lega,                        taki page kabhi khaali na ho.   PAGE_SIZE          = &#8220;Load More&#8221; ek baar me kitne naam dikhaye   API_TIMEOUT_MS     = itni der me jawab na aaye to error \/ backup *\/var API_BASE = &#8216;\/wp-json\/femus\/v1&#8217;;var USE_SHEET_FALLBACK = true;var PAGE_SIZE = 10;var API_TIMEOUT_MS = 15000;var REF_BASE = &#8216;https:\/\/thefiniteearth.org\/pledge?ref=&#8217;;\/* Ye numbers ab SCREEN par nahi dikhte. Sirf certificate-download ke   Google Sheet log me jaate hain (purane columns na tootein isliye). *\/var BASE = { water_L: 20250, co2_kg: 52.5, chem_kg: 3.75 };\/* Download log (DP + certificate) \u2014 Google Apps Script web app *\/var LOG_URL = &#8216;https:\/\/script.google.com\/macros\/s\/AKfycbyOff7p5rSJxVMiCswVGRP8GyKa4jkRTE6b0dIHKsmio7ndmBN9nS0QabfG0eUE9UGblQ\/exec&#8217;;\/* =====================================================================   2) CERTIFICATE SETTINGS \u2014 certificate me kuch bhi badalna ho to      SIRF is block me badlein. Neeche ka code chhune ki zaroorat nahi.   ===================================================================== *\/\/* Kitne referrals par kaunsa certificate khulta hai *\/var MILESTONES = { bronze: 5, silver: 25, gold: 50, platinum: 100 };\/* Certificate ki photo (Media Library me nayi photo upload karke   uska &#8220;File URL&#8221; yahan paste karein \u2014 hamesha https:\/\/ wala).   NOTE: pehle yahan http:\/\/ tha \u2014 https site par browser use block kar   deta hai (mixed content) aur certificate download fail hota tha. *\/var CERT_IMG = {  bronze:   &#8216;https:\/\/thefiniteearth.org\/wp-content\/uploads\/2026\/10\/Bronze-scaled.png&#8217;,  silver:   &#8216;https:\/\/thefiniteearth.org\/wp-content\/uploads\/2026\/10\/SILVER-scaled.png&#8217;,  gold:     &#8216;https:\/\/thefiniteearth.org\/wp-content\/uploads\/2026\/10\/GOLD-scaled.png&#8217;,  platinum: &#8216;https:\/\/thefiniteearth.org\/wp-content\/uploads\/2026\/10\/PLATINUM-scaled.png&#8217;};\/* Certificate par NAAM aur TAREEKH kahan aur kaise chhape.   top      = upar se doori (% me). Naam neeche khiskana ho to badhayein.   left     = (sirf date) baayein se doori (% me)   fontSize = certificate ki chaudai ka % (naam) \/ oonchai ka % (date)   maxWidth = naam zyada se zyada certificate ki kitni % chaudai le              (lamba naam ho to font apne aap chhota hota hai, line nahi tootti)   color    = rang;  font = font ka naam;  weight = motai *\/var CERT_POSITIONS = {  name: { top: &#8216;42%&#8217;, fontSize: &#8216;3.2%&#8217;, maxWidth: 80, color: &#8216;#0d3d6e&#8217;, font: &#8220;&#8216;Charm&#8217;,cursive&#8221;, weight: &#8216;700&#8217; },  date: { top: &#8216;89.5%&#8217;, left: &#8216;18%&#8217;, fontSize: &#8216;2.1%&#8217;, color: &#8216;#555&#8217;, font: &#8220;&#8216;Cormorant Garamond&#8217;,serif&#8221; }};\/* Popup ka title aur card par naam \/ icon *\/var CERT_META = { bronze: { label: &#8216;Bronze&#8217;, icon: &#8221; }, silver: { label: &#8216;Silver&#8217;, icon: &#8221; }, gold: { label: &#8216;Gold&#8217;, icon: &#8221; }, platinum: { label: &#8216;Platinum&#8217;, icon: &#8221; } };\/* Certificate section ke saare text (HTML chalega: &lt;strong&gt;, &lt;br&gt;).   {milestones} apne aap &#8220;5, 25, 50, or 100&#8243; ban jata hai (MILESTONES se). *\/var CERT_TEXT = {  stepLabel:   &#8216;Step 5: Get Your Certificate&#8217;,  title:       &#8216;Download Your Certificate of Climate Satyagraha&#8217;,  intro:       &#8216;Every pledge you inspire is more than a number &amp;mdash; it represents a step towards finite consumption and meaningful climate action.&#8217;,  unlockRule:  &#8216;Individuals can earn their &lt;strong&gt;Certificate of Climate Correction&lt;\/strong&gt; upon reaching milestones of &lt;strong&gt;{milestones} pledges.&lt;\/strong&gt;&#8217;,  orgNote:     &#8216;&lt;strong&gt;Note for Organizations:&lt;\/strong&gt;&lt;br&gt;&lt;br&gt;Your collective pledges represent meaningful climate action by encouraging finite consumption and inspiring others to join Climate Satyagraha. Share your organization&#8217;s CS Code and referral link to grow your Climate Satyagrahi network. To honor this achievement, we will provide your Certificate of Climate Satyagrahi directly via email.&lt;br&gt;&lt;br&gt;&lt;strong&gt;Milestone Levels &amp;mdash;&lt;\/strong&gt; Appreciation: 25 pledges &amp;nbsp;|&amp;nbsp; Bronze: 100 pledges &amp;nbsp;|&amp;nbsp; Silver: 250 pledges &amp;nbsp;|&amp;nbsp; Gold: 500 pledges &amp;nbsp;|&amp;nbsp; Platinum: 1,000 pledges &amp;nbsp;|&amp;nbsp; Champion: 1,500 pledges &amp;nbsp;|&amp;nbsp; Movement Multiplier: 2,500+ pledges.&lt;br&gt;&lt;br&gt;Every pledge brings us closer to a finite-consumption future. Keep inspiring others and growing the Climate Satyagraha movement.&#8217;,  allDoneLabel:&#8217;All milestones reached!&#8217;,  allDoneHint: &#8216;You have unlocked all 4 certificates. You are a Climate Satyagrahi Champion!&#8217;,  keepGoing:   &#8216;Keep sharing to reach your next milestone.&#8217;};\/* =====================================================================   3) STATE   ===================================================================== *\/var C = { name:&#8217;Name&#8217;, email:&#8217;Email&#8217;, phone:&#8217;Phone&#8217;, city:&#8217;City&#8217;, country:&#8217;Country&#8217;, code:&#8217;Referral Code&#8217;, used:&#8217;Used Referral Code&#8217; };var activeTab = &#8216;name&#8217;;var _sheetCache = null, _sheetFetchPromise = null;var certName = &#8221;, certStats = {}, activeCertType = &#8216;bronze&#8217;, activeCertCode = &#8221;;var milestoneDates = {};   \/* { bronze:&#8217;12 May 2026&#8242;, &#8230; } \u2014 khaali ho to download ki tareekh chhapti hai *\/var PH = { name:&#8217;Enter your full name&#8217;, phone:&#8217;Enter your phone number&#8217;, email:&#8217;Enter your email address&#8217; };var _searchSeq = 0;        \/* purani search ka late jawab nayi search ko na bigaade *\/var _pagers = {};          \/* &#8220;Load More&#8221; lists: &#8216;ref&#8217; aur &#8216;city&#8217; *\/var _forgotMatches = [];var MONTHS = [&#8216;January&#8217;,&#8217;February&#8217;,&#8217;March&#8217;,&#8217;April&#8217;,&#8217;May&#8217;,&#8217;June&#8217;,&#8217;July&#8217;,&#8217;August&#8217;,&#8217;September&#8217;,&#8217;October&#8217;,&#8217;November&#8217;,&#8217;December&#8217;];var ARROW_HTML = &#8216;&lt;span aria-hidden=&#8221;true&#8221;&gt;&lt;svg viewBox=&#8221;0 0 24 24&#8243; fill=&#8221;none&#8221;&gt;&lt;path d=&#8221;M5 12h13M12 6l6 6-6 6&#8243; stroke=&#8221;currentColor&#8221; stroke-width=&#8221;2&#8243; stroke-linecap=&#8221;round&#8221; stroke-linejoin=&#8221;round&#8221;\/&gt;&lt;\/svg&gt;&lt;\/span&gt;&#8217;;var DL_ICON = &#8216;&lt;svg viewBox=&#8221;0 0 24 24&#8243;&gt;&lt;path d=&#8221;M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4M7 10l5 5 5-5M12 15V3&#8243;\/&gt;&lt;\/svg&gt;&#8217;;var TICK_ICON = &#8216;&lt;svg viewBox=&#8221;0 0 24 24&#8243;&gt;&lt;path d=&#8221;M5 13l4 4L19 7&#8243;\/&gt;&lt;\/svg&gt;&#8217;;\/* =====================================================================   4) API (naya, tez raasta) \u2014 \/impact, \/city, \/lookup   ===================================================================== *\/function apiError(kind, msg) { var e = new Error(msg); e.kind = kind; return e; }function apiGet(path, params) {  var qs = Object.keys(params || {}).map(function(k) {    return encodeURIComponent(k) + &#8216;=&#8217; + encodeURIComponent(params[k]);  }).join(&#8216;&amp;&#8217;);  var url = API_BASE + path + (qs ? &#8216;?&#8217; + qs : &#8221;);  var ctrl = (typeof AbortController !== &#8216;undefined&#8217;) ? new AbortController() : null;  var timer = ctrl ? setTimeout(function() { ctrl.abort(); }, API_TIMEOUT_MS) : null;  return fetch(url, { credentials: &#8216;omit&#8217;, cache: &#8216;no-store&#8217;, headers: { Accept: &#8216;application\/json&#8217; }, signal: ctrl ? ctrl.signal : undefined })    .then(function(r) {      return r.json().catch(function() { return null; }).then(function(j) {        if (r.status === 429) throw apiError(&#8216;rate_limited&#8217;, &#8216;Too many searches. Please wait a minute and try again.&#8217;);        if (!r.ok || !j || !j.ok) throw apiError((j &amp;&amp; (j.error || j.code)) || (&#8216;http_&#8217; + r.status), &#8216;Server error (&#8216; + r.status + &#8216;)&#8217;);        return j;      });    }, function(err) {      if (err &amp;&amp; err.name === &#8216;AbortError&#8217;) throw apiError(&#8216;timeout&#8217;, &#8216;The server is taking too long to respond.&#8217;);      throw apiError(&#8216;network&#8217;, &#8216;Network error&#8217;);    })    .finally(function() { if (timer) clearTimeout(timer); });}\/* Rate limit par backup nahi \u2014 warna poori list download ho jayegi. *\/function canFallback(e) { return USE_SHEET_FALLBACK &amp;&amp; !(e &amp;&amp; e.kind === &#8216;rate_limited&#8217;); }function friendlyError(e) {  if (e &amp;&amp; e.kind === &#8216;rate_limited&#8217;) return e.message;  if (e &amp;&amp; e.kind === &#8216;timeout&#8217;) return &#8216;The server is taking too long to respond. Please try again in a moment.&#8217;;  return &#8216;Could not load data right now. Please check your internet connection and try again.&#8217;;}\/* =====================================================================   5) BACKUP (purana raasta) \u2014 poori list \/pledges ya Google Sheet se      Sirf tab chalta hai jab naya API kaam na kare.   ===================================================================== *\/function fetchCSV(sheetName) {  var url = &#8216;https:\/\/docs.google.com\/spreadsheets\/d\/&#8217; + SHEET_ID + &#8216;\/gviz\/tq?tqx=out:csv&#8217; + (sheetName ? &#8216;&amp;sheet=&#8217; + encodeURIComponent(sheetName) : &#8221;);  return fetch(url, { cache: &#8216;no-store&#8217; })    .then(function(r) { if (!r.ok) throw new Error(&#8216;HTTP &#8216; + r.status); return r.text(); })    .then(function(csv) { if (!csv || csv.length &lt; 20) throw new Error(&#8216;Empty&#8217;); return csv; });}function loadSheetFromGoogle() {  if (_sheetCache) return Promise.resolve(_sheetCache);  var names = [&#8220;FEMu2019Us Pledge data&#8221;, &#8220;FEM&#8217;Us Pledge data&#8221;, &#8220;&#8221;];  return new Promise(function(resolve, reject) {    function tryNext(i) {      if (i &gt;= names.length) { reject(new Error(&#8216;Could not load sheet.&#8217;)); return; }      fetchCSV(names[i])        .then(function(csv) { _sheetCache = parseCSV(csv); resolve(_sheetCache); })        .catch(function() { tryNext(i + 1); });    }    tryNext(0);  });}function loadSheet() {  if (_sheetCache) return Promise.resolve(_sheetCache);  if (_sheetFetchPromise) return _sheetFetchPromise;  _sheetFetchPromise = fetch(API_BASE + &#8216;\/pledges&#8217;, { credentials: &#8216;omit&#8217; })    .then(function(r) {      if (!r.ok) throw new Error(&#8216;HTTP &#8216; + r.status);      return r.json();    })    .then(function(j) {      if (!j || !j.ok || !j.rows || j.rows.length &lt; 2) throw new Error(&#8216;Empty response&#8217;);      _sheetCache = j.rows;      _sheetFetchPromise = null;      return j.rows;    })    .catch(function(err) {      _sheetFetchPromise = null;      if (!USE_SHEET_FALLBACK) throw err;      console.warn(&#8216;[FEMUs] \/pledges down, using Google Sheet:&#8217;, err.message);      return loadSheetFromGoogle();    });  return _sheetFetchPromise;}function parseCSV(text) {  var rows = [], lines = text.split(&#8216;n&#8217;);  for (var i = 0; i &lt; lines.length; i++) {    var l = lines[i].trim();    if (l) rows.push(parseCSVRow(l));  }  return rows;}function parseCSVRow(line) {  var cells = [], cur = &#8221;, inQ = false;  for (var i = 0; i &lt; line.length; i++) {    var ch = line[i];    if (ch === &#8216;&#8221;&#8216;) {      if (inQ &amp;&amp; line[i + 1] === &#8216;&#8221;&#8216;) { cur += &#8216;&#8221;&#8216;; i++; }      else { inQ = !inQ; }    } else if (ch === &#8216;,&#8217; &amp;&amp; !inQ) {      cells.push(cur.trim()); cur = &#8221;;    } else { cur += ch; }  }  cells.push(cur.trim());  return cells;}function buildIdx(h) { var idx = {}; for (var k in C) idx[k] = h.indexOf(C[k]); return idx; }\/* Referral count ka niyam API jaisa hi: trim + small letters, aur   apna hi code daalne wala khud ka referral nahi ginta. *\/function getReferreds(rows, idx, code) {  var list = [], c = String(code || &#8221;).trim().toLowerCase();  if (!c) return list;  for (var i = 1; i &lt; rows.length; i++) {    var used = (rows[i][idx.used] || &#8221;).trim().toLowerCase();    if (used !== c) continue;    if ((rows[i][idx.code] || &#8221;).trim().toLowerCase() === c) continue;    list.push({ name: rows[i][idx.name] || &#8221;, city: rows[i][idx.city] || &#8221;, country: rows[i][idx.country] || &#8221; });  }  return list;}function maskEmail(email) {  email = String(email || &#8221;).trim();  if (!email || email.indexOf(&#8216;@&#8217;) === -1) return &#8221;;  var p = email.split(&#8216;@&#8217;);  return p[0].substring(0, 2) + &#8216;***@&#8217; + (p[1] || &#8221;);}function localPager(list) {  return function(offset) { return Promise.resolve(list.slice(offset, offset + PAGE_SIZE)); };}\/* =====================================================================   6) SMALL HELPERS   ===================================================================== *\/function $(id) { return document.getElementById(id); }function flashErr(inp) {  inp.classList.add(&#8216;is-error&#8217;);  setTimeout(function() { inp.classList.remove(&#8216;is-error&#8217;); }, 1500);}function esc(s) {  return String(s == null ? &#8221; : s).replace(\/[&amp;&lt;&gt;&#8221;&#8216;]\/g, function(c) {    return { &#8216;&amp;&#8217;: &#8216;&amp;amp;&#8217;, &#8216;&lt;&#8216;: &#8216;&amp;lt;&#8217;, &#8216;&gt;&#8217;: &#8216;&amp;gt;&#8217;, &#8216;&#8221;&#8216;: &#8216;&amp;quot;&#8217;, &#8220;&#8216;&#8221;: &#8216;&amp;#39;&#8217; }[c];  });}function fmt(n) { return Number(n).toLocaleString(); }\/* &#8220;29 October 2026&#8243; \u2014 certificate aur log dono me yahi format *\/function fmtDate(d) { d = d || new Date(); return d.getDate() + &#8216; &#8216; + MONTHS[d.getMonth()] + &#8216; &#8216; + d.getFullYear(); }function initialsOf(name) {  return String(name || &#8221;).trim().split(\/s+\/).map(function(w) { return w.charAt(0); }).slice(0, 2).join(&#8221;).toUpperCase() || &#8216;?&#8217;;}function setBtnBusy(btn) {  btn.disabled = true;  btn.setAttribute(&#8216;aria-busy&#8217;, &#8216;true&#8217;);  btn.innerHTML = &#8216;&lt;span&gt;SEARCHING\u2026&lt;\/span&gt;&lt;span aria-hidden=&#8221;true&#8221;&gt;&lt;span&gt;&lt;\/span&gt;&lt;\/span&gt;&#8217;;}function setBtnIdle(btn, label) {  btn.disabled = false;  btn.removeAttribute(&#8216;aria-busy&#8217;);  btn.innerHTML = &#8216;&lt;span&gt;&#8217; + label + &#8216;&lt;\/span&gt;&#8217; + ARROW_HTML;}function showErr(outEl, msg, label) {  outEl.innerHTML = &#8216;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;\/span&gt; &#8216; + esc(label || &#8216;Not Found&#8217;) + &#8216;&lt;\/div&gt;&lt;span&gt;&#8217; + esc(msg) + &#8216;&lt;\/span&gt;&lt;\/div&gt;&#8217;;}function hidePanels() {  $(&#8216;panel-forgot&#8217;).classList.remove(&#8216;show&#8217;);  $(&#8216;panel-dp&#8217;).classList.remove(&#8216;show&#8217;);}\/* Certificate ke liye naam \/ code \/ count yaad rakhna (impact + forgot dono se) *\/function setCertContext(name, code, cnt) {  cnt = Number(cnt) || 0;  certName = String(name || &#8221;).trim(); activeCertCode = code || &#8221;;  certStats = { cnt: cnt, water_L: cnt * BASE.water_L, co2_kg: cnt * BASE.co2_kg, chem_kg: cnt * BASE.chem_kg };}\/* Browser me file download karwana (DP + certificate) *\/function triggerDownload(href, filename) {  var a = document.createElement(&#8216;a&#8217;);  a.download = filename; a.href = href;  document.body.appendChild(a); a.click(); document.body.removeChild(a);}\/* Google Sheet log \u2014 fail ho to bhi user ko kabhi rokta nahi *\/function logEvent(params) {  var qs = Object.keys(params).map(function(k) { return k + &#8216;=&#8217; + encodeURIComponent(params[k] == null ? &#8221; : params[k]); }).join(&#8216;&amp;&#8217;);  try {    fetch(LOG_URL + &#8216;?&#8217; + qs, { method: &#8216;GET&#8217;, mode: &#8216;no-cors&#8217;, keepalive: true }).catch(function(err) { console.warn(&#8216;Log failed:&#8217;, err); });  } catch (err) { console.warn(&#8216;Log failed:&#8217;, err); }}\/* =====================================================================   7) &#8220;LOAD MORE&#8221; \u2014 har click par agle PAGE_SIZE (10) naam   ===================================================================== *\/function pagerHtml(key) {  return &#8216;&lt;div&gt;&#8217;    + &#8216;&lt;button type=&#8221;button&#8221; id=&#8221;&#8216; + key + &#8216;-more&#8221; onclick=&#8221;loadMore(&#8221; + key + &#8221;)&#8221;&gt;&lt;\/button&gt;&#8217;    + &#8216;&lt;span id=&#8221;&#8216; + key + &#8216;-note&#8221; aria-live=&#8221;polite&#8221;&gt;&lt;\/span&gt;&lt;\/div&gt;&#8217;;}function initPager(key, total, shown, fetchPage, rowFn) {  _pagers[key] = { total: total, shown: shown, fetchPage: fetchPage, rowFn: rowFn, busy: false, error: &#8221; };  updatePager(key);}function updatePager(key) {  var p = _pagers[key], btn = $(key + &#8216;-more&#8217;), note = $(key + &#8216;-note&#8217;);  if (!p || !btn || !note) return;  var left = Math.max(0, p.total &#8211; p.shown);  note.className = &#8216;ki-more-note&#8217; + (p.error ? &#8216; is-error&#8217; : &#8221;);  note.textContent = p.error || (&#8216;Showing &#8216; + fmt(p.shown) + &#8216; of &#8216; + fmt(p.total));  if (left === 0) { btn.style.display = &#8216;none&#8217;; return; }  btn.style.display = &#8221;;  btn.disabled = p.busy;  btn.innerHTML = p.busy    ? &#8216;&lt;span&gt;&lt;\/span&gt; Loading\u2026&#8217;    : (p.error ? &#8216;Try Again&#8217; : &#8216;Load More&#8217;) + &#8216; &lt;span&gt;(next &#8216; + Math.min(PAGE_SIZE, left) + &#8216;)&lt;\/span&gt;&#8217;;}function loadMore(key) {  var p = _pagers[key];  if (!p || p.busy) return;  p.busy = true; p.error = &#8221;;  updatePager(key);  p.fetchPage(p.shown)    .then(function(items) {      if (_pagers[key] !== p) return;      var tbody = $(key + &#8216;-tbody&#8217;);      items = items || [];      if (!tbody) return;      if (!items.length) { p.total = p.shown; return; }      tbody.insertAdjacentHTML(&#8216;beforeend&#8217;, p.rowFn(items, p.shown));      p.shown += items.length;    })    .catch(function(e) {      if (_pagers[key] === p) p.error = (e &amp;&amp; e.kind === &#8216;rate_limited&#8217;) ? e.message : &#8216;Could not load more names. Please try again.&#8217;;    })    .finally(function() {      if (_pagers[key] !== p) return;      p.busy = false;      updatePager(key);    });}function refRows(items, start) {  var html = &#8221;;  for (var i = 0; i &lt; items.length; i++) {    html += &#8216;&lt;tr&gt;&lt;td&gt;&#8217; + (start + i + 1) + &#8216;&lt;\/td&gt;&lt;td&gt;&#8217; + esc(items[i].name || &#8216;\u2014&#8217;) + &#8216;&lt;\/td&gt;&lt;\/tr&gt;&#8217;;  }  return html;}function cityRows(items, start) {  var html = &#8221;;  for (var i = 0; i &lt; items.length; i++) {    var p = items[i];    html += &#8216;&lt;tr&gt;&lt;td&gt;&#8217; + (start + i + 1) + &#8216;&lt;\/td&gt;&lt;td&gt;&#8217; + esc(p.name || &#8216;\u2014&#8217;) + &#8216;&lt;\/td&gt;&lt;td&gt;&#8217; + esc([p.city, p.country].filter(Boolean).join(&#8216;, &#8216;)) + &#8216;&lt;\/td&gt;&lt;\/tr&gt;&#8217;;  }  return html;}\/* =====================================================================   8) PANELS   ===================================================================== *\/function toggleForgot() {  $(&#8216;panel-dp&#8217;).classList.remove(&#8216;show&#8217;);  var panel = $(&#8216;panel-forgot&#8217;);  if (panel.classList.contains(&#8216;show&#8217;)) {    panel.classList.remove(&#8216;show&#8217;);    $(&#8216;forgot-out&#8217;).innerHTML = &#8221;;  } else {    panel.classList.add(&#8216;show&#8217;);    $(&#8216;out&#8217;).innerHTML = &#8221;;    $(&#8216;city-out&#8217;).innerHTML = &#8221;;    panel.scrollIntoView({ behavior: &#8216;smooth&#8217;, block: &#8216;start&#8217; });    setTimeout(function() { $(&#8216;fq&#8217;).focus(); }, 300);  }}function setTab(t) {  activeTab = t;  [&#8216;name&#8217;, &#8216;phone&#8217;, &#8217;email&#8217;].forEach(function(k) {    var el = $(&#8216;t-&#8216; + k);    if (el) el.className = &#8216;tb&#8217; + (k === t ? &#8216; on&#8217; : &#8221;);  });  var inp = $(&#8216;fq&#8217;);  inp.placeholder = PH[t]; inp.value = &#8221;;  inp.classList.remove(&#8216;is-error&#8217;);  $(&#8216;forgot-out&#8217;).innerHTML = &#8221;;  setTimeout(function() { inp.focus(); }, 50);}\/* =====================================================================   9) IMPACT SEARCH (CS Code)   ===================================================================== *\/function loadImpactLocal(code) {  return loadSheet().then(function(rows) {    var idx = buildIdx(rows[0]), ownerRow = null;    for (var r = 1; r &lt; rows.length; r++) {      if ((rows[r][idx.code] || &#8221;).trim().toUpperCase() === code) { ownerRow = rows[r]; break; }    }    if (!ownerRow) return null;    var list = getReferreds(rows, idx, code);    return {      owner: { name: ownerRow[idx.name] || &#8221;, email_masked: maskEmail(ownerRow[idx.email]), city: ownerRow[idx.city] || &#8221;, country: ownerRow[idx.country] || &#8221;, code: code },      total: list.length,      items: list.slice(0, PAGE_SIZE),      fetchPage: localPager(list)    };  });}function loadImpact(code) {  return apiGet(&#8216;\/impact&#8217;, { code: code, offset: 0, limit: PAGE_SIZE }).then(function(j) {    if (!j.found || !j.owner) return null;    var ownerCode = j.owner.code || code;    return {      owner: j.owner,      total: Number(j.referred_count) || 0,      items: j.referrals || [],      fetchPage: function(offset) {        return apiGet(&#8216;\/impact&#8217;, { code: ownerCode, offset: offset, limit: PAGE_SIZE }).then(function(k) { return k.referrals || []; });      }    };  }, function(e) {    if (!canFallback(e)) throw e;    console.warn(&#8216;[FEMUs] \/impact unavailable, using backup list:&#8217;, e.message);    return loadImpactLocal(code);  });}function doImpactSearch() {  var inp = $(&#8216;impact-code&#8217;), btn = $(&#8216;impact-btn&#8217;), out = $(&#8216;out&#8217;);  var code = inp.value.replace(\/s+\/g, &#8221;).toUpperCase();  if (!code) { flashErr(inp); inp.focus(); return; }  var seq = ++_searchSeq;  setBtnBusy(btn);  out.innerHTML = &#8221;;  $(&#8216;city-out&#8217;).innerHTML = &#8221;;  loadImpact(code).then(function(res) {    if (seq !== _searchSeq) return;    if (!res) { showErr(out, &#8216;No record found for CS Code &#8220;&#8216; + code + &#8216;&#8221;. Please check and try again.&#8217;); return; }    var o = res.owner, cnt = res.total;    var loc = [o.city, o.country].filter(Boolean).join(&#8216;, &#8216;);    var meta = [o.email_masked, loc].filter(Boolean).join(&#8216; \u00b7 &#8216;);    setCertContext(o.name, o.code || code, cnt);    showImpactResult(out, { name: o.name || &#8221;, meta: meta, total: cnt, items: res.items, fetchPage: res.fetchPage });    hidePanels();  })  .catch(function(e) { if (seq === _searchSeq) showErr(out, friendlyError(e), &#8216;Something went wrong&#8217;); })  .finally(function() { setBtnIdle(btn, &#8216;SEE MY IMPACT&#8217;); });}function showImpactResult(outEl, d) {  var cnt = d.total;  var listHtml;  if (cnt === 0) {    listHtml = &#8216;&lt;span&gt;No one has used your CS Code yet \u2014 start sharing!&lt;\/span&gt;&#8217;;  } else {    listHtml = &#8216;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;S.No.&lt;\/th&gt;&lt;th&gt;Name&lt;\/th&gt;&lt;\/tr&gt;&lt;\/thead&gt;&#8217;      + &#8216;&lt;tbody id=&#8221;ref-tbody&#8221;&gt;&#8217; + refRows(d.items, 0) + &#8216;&lt;\/tbody&gt;&lt;\/table&gt;&#8217;      + pagerHtml(&#8216;ref&#8217;);  }  outEl.innerHTML = &#8216;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;\/span&gt; IMPACT REPORT&lt;\/div&gt;&#8217;    + &#8216;&lt;div&gt;&lt;div&gt;&#8217; + esc(initialsOf(d.name)) + &#8216;&lt;\/div&gt;&lt;div&gt;&#8217;    + &#8216;&lt;span&gt;&#8217; + esc(d.name) + &#8216;&lt;\/span&gt;&#8217;    + (d.meta ? &#8216;&lt;span&gt;&#8217; + esc(d.meta) + &#8216;&lt;\/span&gt;&#8217; : &#8221;)    + &#8216;&lt;\/div&gt;&lt;\/div&gt;&#8217;    + &#8216;&lt;div&gt;&lt;div&gt;&lt;span&gt;&#8217; + fmt(cnt) + &#8216;&lt;\/span&gt;&lt;span&gt;&#8217; + (cnt === 1 ? &#8216;Person&#8217; : &#8216;People&#8217;) + &#8216; Referred&lt;\/span&gt;&lt;\/div&gt;&lt;\/div&gt;&#8217;    + &#8216;&lt;span&gt;People who joined using your CS Code (&#8216; + fmt(cnt) + &#8216;)&lt;\/span&gt;&#8217;    + listHtml    + buildCertSection(cnt)    + &#8216;&lt;\/div&gt;&#8217;;  if (cnt &gt; 0) initPager(&#8216;ref&#8217;, cnt, d.items.length, d.fetchPage, refRows);}\/* =====================================================================   10) CITY SEARCH   ===================================================================== *\/function loadCityLocal(q) {  return loadSheet().then(function(rows) {    var idx = buildIdx(rows[0]), lq = q.toLowerCase(), people = [];    for (var r = 1; r &lt; rows.length; r++) {      var rc = (rows[r][idx.city] || &#8221;).toLowerCase().trim();      if (rc.indexOf(lq) !== -1) people.push({ name: rows[r][idx.name] || &#8221;, city: rows[r][idx.city] || &#8221;, country: rows[r][idx.country] || &#8221; });    }    return { label: people.length ? (people[0].city || q) : q, total: people.length, items: people.slice(0, PAGE_SIZE), fetchPage: localPager(people) };  });}function loadCity(q) {  return apiGet(&#8216;\/city&#8217;, { q: q, offset: 0, limit: PAGE_SIZE }).then(function(j) {    return {      label: j.city_label || q,      total: Number(j.total) || 0,      items: j.people || [],      fetchPage: function(offset) {        return apiGet(&#8216;\/city&#8217;, { q: q, offset: offset, limit: PAGE_SIZE }).then(function(k) { return k.people || []; });      }    };  }, function(e) {    if (!canFallback(e)) throw e;    console.warn(&#8216;[FEMUs] \/city unavailable, using backup list:&#8217;, e.message);    return loadCityLocal(q);  });}function doCitySearch() {  var inp = $(&#8216;city-input&#8217;), btn = $(&#8216;city-btn&#8217;), out = $(&#8216;city-out&#8217;);  var cityQuery = inp.value.replace(\/s+\/g, &#8216; &#8216;).trim();  if (!cityQuery) { flashErr(inp); inp.focus(); return; }  var seq = ++_searchSeq;  setBtnBusy(btn);  out.innerHTML = &#8221;;  $(&#8216;out&#8217;).innerHTML = &#8221;;  loadCity(cityQuery).then(function(res) {    if (seq !== _searchSeq) return;    var total = res.total;    if (total === 0) { showErr(out, &#8216;No pledges found for &#8220;&#8216; + cityQuery + &#8216;&#8221;. Please check spelling or try another city.&#8217;); return; }    var label = res.label;    out.innerHTML = &#8216;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;\/span&gt; CITY IMPACT REPORT&lt;\/div&gt;&#8217;      + &#8216;&lt;div&gt;&lt;div style=&#8221;font-size:24px&#8221; aria-hidden=&#8221;true&#8221;&gt;&amp;#127759;&lt;\/div&gt;&lt;div&gt;&#8217;      + &#8216;&lt;span&gt;&#8217; + esc(label) + &#8216;&lt;\/span&gt;&#8217;      + &#8216;&lt;span&gt;Collective impact from &#8216; + fmt(total) + &#8216; Climate Satyagraha Pledge&#8217; + (total !== 1 ? &#8216;s&#8217; : &#8221;) + &#8216;&lt;\/span&gt;&lt;\/div&gt;&lt;\/div&gt;&#8217;      + &#8216;&lt;div&gt;&lt;div&gt;&lt;span&gt;&#8217; + fmt(total) + &#8216;&lt;\/span&gt;&lt;span&gt;Total Pledges&lt;\/span&gt;&lt;\/div&gt;&lt;\/div&gt;&#8217;      + &#8216;&lt;span&gt;Pledges from &#8216; + esc(label) + &#8216; (&#8216; + fmt(total) + &#8216;)&lt;\/span&gt;&#8217;      + &#8216;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;S.No.&lt;\/th&gt;&lt;th&gt;Name&lt;\/th&gt;&lt;th&gt;City \/ Country&lt;\/th&gt;&lt;\/tr&gt;&lt;\/thead&gt;&#8217;      + &#8216;&lt;tbody id=&#8221;city-tbody&#8221;&gt;&#8217; + cityRows(res.items, 0) + &#8216;&lt;\/tbody&gt;&lt;\/table&gt;&#8217;      + pagerHtml(&#8216;city&#8217;) + &#8216;&lt;\/div&gt;&#8217;;    initPager(&#8216;city&#8217;, total, res.items.length, res.fetchPage, cityRows);    hidePanels();  })  .catch(function(e) { if (seq === _searchSeq) showErr(out, friendlyError(e), &#8216;Something went wrong&#8217;); })  .finally(function() { setBtnIdle(btn, &#8216;SEARCH CITY&#8217;); });}\/* =====================================================================   11) CERTIFICATE SECTION (cards + progress)   ===================================================================== *\/function buildCertSection(cnt) {  var levels = [{ key: &#8216;bronze&#8217;, val: MILESTONES.bronze }, { key: &#8216;silver&#8217;, val: MILESTONES.silver }, { key: &#8216;gold&#8217;, val: MILESTONES.gold }, { key: &#8216;platinum&#8217;, val: MILESTONES.platinum }];  var unlocked = {};  levels.forEach(function(l) { unlocked[l.key] = cnt &gt;= l.val; });  var platinumOk = unlocked.platinum;  var nextLevel = null, prevVal = 0;  for (var i = 0; i &lt; levels.length; i++) { if (cnt &lt; levels[i].val) { nextLevel = levels[i]; prevVal = i &gt; 0 ? levels[i &#8211; 1].val : 0; break; } }  var pct = platinumOk ? 100 : Math.min(100, Math.round(((cnt &#8211; prevVal) \/ (nextLevel.val &#8211; prevVal)) * 100));  var barColor = platinumOk ? &#8216;linear-gradient(90deg,#1e3a5a,#4a90b8,#70b8d8,#4a90b8)&#8217; : unlocked.gold ? &#8216;linear-gradient(90deg,#6a4800,#c09000,#f0d040)&#8217; : unlocked.silver ? &#8216;linear-gradient(90deg,#1c2230,#5a7898,#c4d4e4)&#8217; : &#8216;linear-gradient(90deg,#4a1800,#a05a20,#d4883a)&#8217;;  var nextLabel = platinumOk ? CERT_TEXT.allDoneLabel : &#8216;Next: &#8216; + nextLevel.val + &#8216; referrals for &#8216; + CERT_META[nextLevel.key].label;  var nextHint = platinumOk ? CERT_TEXT.allDoneHint : CERT_TEXT.keepGoing;  var vals = levels.map(function(l) { return l.val; });  var milestoneList = vals.slice(0, -1).join(&#8216;, &#8216;) + &#8216;, or &#8216; + vals[vals.length &#8211; 1];  function certCard(type) {    var ok = unlocked[type], meta = CERT_META[type], threshold = MILESTONES[type];    var btnInner = ok ? DL_ICON + &#8216; Download&#8217; : threshold + &#8216; needed&#8217;;    return &#8216;&lt;div&gt;&#8217;      + &#8216;&lt;span&gt;&#8217; + meta.icon + &#8216;&lt;\/span&gt;&#8217;      + (ok ? &#8221; : &#8216;&lt;span&gt;&lt;\/span&gt;&#8217;)      + &#8216;&lt;div&gt;&#8217; + meta.label + &#8216;&lt;\/div&gt;&#8217;      + &#8216;&lt;div&gt;&#8217; + threshold + &#8216; referrals&lt;\/div&gt;&#8217;      + &#8216;&lt;button type=&#8221;button&#8221;&#8216; + (ok ? &#8216; onclick=&#8221;openCert(&#8221; + type + &#8221;)&#8221;&#8216; : &#8216; disabled&#8217;) + &#8216;&gt;&#8217; + btnInner + &#8216;&lt;\/button&gt;&lt;\/div&gt;&#8217;;  }  return &#8216;&lt;div&gt;&#8217;    + &#8216;&lt;span&gt;&#8217; + CERT_TEXT.stepLabel + &#8216;&lt;\/span&gt;&#8217;    + &#8216;&lt;div&gt;&#8217; + CERT_TEXT.title + &#8216;&lt;\/div&gt;&#8217;    + &#8216;&lt;p&gt;&#8217; + CERT_TEXT.intro + &#8216;&lt;\/p&gt;&#8217;    + &#8216;&lt;p&gt;&#8217; + CERT_TEXT.unlockRule.replace(&#8216;{milestones}&#8217;, milestoneList) + &#8216;&lt;\/p&gt;&#8217;    + &#8216;&lt;div&gt;&lt;div&gt;&lt;span&gt;&#8217; + fmt(cnt) + &#8216; referral&#8217; + (cnt !== 1 ? &#8216;s&#8217; : &#8221;) + &#8216; so far&lt;\/span&gt;&lt;span&gt;&#8217; + nextLabel + &#8216;&lt;\/span&gt;&lt;\/div&gt;&#8217;    + &#8216;&lt;div&gt;&lt;div style=&#8221;width:&#8217; + pct + &#8216;%;background:&#8217; + barColor + &#8216;&#8221;&gt;&lt;\/div&gt;&lt;\/div&gt;&lt;\/div&gt;&#8217;    + &#8216;&lt;div&gt;&#8217; + certCard(&#8216;bronze&#8217;) + certCard(&#8216;silver&#8217;) + certCard(&#8216;gold&#8217;) + certCard(&#8216;platinum&#8217;) + &#8216;&lt;\/div&gt;&#8217;    + &#8216;&lt;p&gt;&#8217; + CERT_TEXT.orgNote + &#8216;&lt;\/p&gt;&#8217;    + &#8216;&lt;p&gt;&#8217; + nextHint + &#8216;&lt;\/p&gt;&lt;\/div&gt;&#8217;;}\/* =====================================================================   12) FORGOT CS CODE   ===================================================================== *\/\/* Purani browser-side search. Ab sirf backup ke liye. *\/function doForgotSearchLegacy(query, out, tab) {  tab = tab || activeTab;  return loadSheet().then(function(rows) {    var idx = buildIdx(rows[0]), q = query.toLowerCase(), matches = [];    var qDigits = q.replace(\/D\/g, &#8221;);    for (var r = 1; r &lt; rows.length; r++) {      var row = rows[r]; if (!row || row.length &lt; 2) continue;      var hit = false;      if (tab === &#8216;name&#8217;) hit = (row[idx.name] || &#8221;).toLowerCase().indexOf(q) !== -1;      else if (tab === &#8216;phone&#8217;) {        var s = (row[idx.phone] || &#8221;).replace(\/D\/g, &#8221;);        hit = s.length &gt; 0 &amp;&amp; qDigits.length &gt; 0 &amp;&amp; s === qDigits;      } else hit = (row[idx.email] || &#8221;).toLowerCase() === q;      if (hit) {        var code = (row[idx.code] || &#8221;).trim();        matches.push({ name: row[idx.name] || &#8221;, email_masked: maskEmail(row[idx.email]), city: row[idx.city] || &#8221;, country: row[idx.country] || &#8221;, code: code, referred_count: getReferreds(rows, idx, code).length });      }    }    if (matches.length === 0) showErr(out, &#8216;No record found. Please check the details you entered.&#8217;);    else showForgotResults(out, matches);  });}\/* Search server par hoti hai, isliye kisi ka phone number ya poora   email browser tak aata hi nahi. *\/function doForgotSearch() {  var inp = $(&#8216;fq&#8217;), btn = $(&#8216;fgo&#8217;), out = $(&#8216;forgot-out&#8217;);  var query = inp.value.trim();  if (!query) { flashErr(inp); inp.focus(); return; }  var tab = activeTab;  setBtnBusy(btn);  out.innerHTML = &#8221;;  apiGet(&#8216;\/lookup&#8217;, { type: tab, q: query })    .then(function(j) {      var found = j.matches || [];      if (!found.length) { showErr(out, &#8216;No record found. Please check the details you entered.&#8217;); return null; }      var list = found.map(function(m) {        return { name: m.name || &#8221;, email_masked: m.email_masked || &#8221;, city: m.city || &#8221;, country: m.country || &#8221;, code: m.code || &#8221;, referred_count: (typeof m.referred_count === &#8216;number&#8217;) ? m.referred_count : null };      });      var needCounts = list.some(function(m) { return m.referred_count === null; });      if (!needCounts) return list;      \/* Purana API (v1): count yahin browser me *\/      return loadSheet().then(function(rows) {        var idx = buildIdx(rows[0]);        list.forEach(function(m) { m.referred_count = getReferreds(rows, idx, m.code).length; });        return list;      }).catch(function() {        list.forEach(function(m) { if (m.referred_count === null) m.referred_count = 0; });        return list;      });    })    .then(function(list) { if (list) showForgotResults(out, list); })    .catch(function(e) {      if (canFallback(e)) {        console.warn(&#8216;[FEMUs] lookup down, using backup list:&#8217;, e.message);        return doForgotSearchLegacy(query, out, tab).catch(function(e2) { showErr(out, friendlyError(e2), &#8216;Something went wrong&#8217;); });      }      showErr(out, friendlyError(e), &#8216;Something went wrong&#8217;);    })    .finally(function() { setBtnIdle(btn, &#8216;FIND MY CS CODE&#8217;); });}function showForgotResults(outEl, list) {  if (list.length === 1) showForgotProfile(outEl, list[0]);  else showForgotMulti(outEl, list);}function showForgotProfile(outEl, r) {  var loc = [r.city, r.country].filter(Boolean).join(&#8216;, &#8216;);  var meta = [r.email_masked, loc].filter(Boolean).join(&#8216; \u00b7 &#8216;);  var link = REF_BASE + r.code;  setCertContext(r.name, r.code, r.referred_count);  var copyIco = &#8216;&lt;svg viewBox=&#8221;0 0 24 24&#8243;&gt;&lt;path d=&#8221;M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z&#8221;\/&gt;&lt;\/svg&gt;&#8217;;  outEl.innerHTML = &#8216;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;\/span&gt; Profile Found&lt;\/div&gt;&#8217;    + &#8216;&lt;div&gt;&lt;div&gt;&lt;div&gt;&#8217; + esc(initialsOf(r.name)) + &#8216;&lt;\/div&gt;&lt;div&gt;&#8217;    + &#8216;&lt;span&gt;&#8217; + esc(r.name) + &#8216;&lt;\/span&gt;&#8217;    + (meta ? &#8216;&lt;span&gt;&#8217; + esc(meta) + &#8216;&lt;\/span&gt;&#8217; : &#8221;)    + &#8216;&lt;\/div&gt;&lt;\/div&gt;&#8217;    + &#8216;&lt;div&gt;&lt;span&gt;Your Climate Satyagrahi Code&lt;\/span&gt;&#8217;    + &#8216;&lt;div&gt;&lt;span&gt;&#8217; + esc(r.code) + &#8216;&lt;\/span&gt;&#8217;    + &#8216;&lt;button type=&#8221;button&#8221; id=&#8221;fp-cbtn&#8221; data-copy=&#8221;&#8216; + esc(r.code) + &#8216;&#8221; onclick=&#8221;fpCopyCode(this.getAttribute(&#8216;data-copy&#8217;))&#8221;&gt;&#8217; + copyIco + &#8216; Copy CS Code&lt;\/button&gt;&lt;\/div&gt;&lt;\/div&gt;&#8217;    + &#8216;&lt;div&gt;&lt;span&gt;Your Referral Link&lt;\/span&gt;&#8217;    + &#8216;&lt;div&gt;&lt;div&gt;&lt;span&gt;thefiniteearth.org\/pledge?ref=&lt;\/span&gt;&lt;span&gt;&#8217; + esc(r.code) + &#8216;&lt;\/span&gt;&lt;\/div&gt;&#8217;    + &#8216;&lt;button type=&#8221;button&#8221; id=&#8221;fp-lbtn&#8221; data-copy=&#8221;&#8216; + esc(link) + &#8216;&#8221; onclick=&#8221;fpCopyLink(this.getAttribute(&#8216;data-copy&#8217;))&#8221;&gt;&#8217; + copyIco + &#8216; Copy Link&lt;\/button&gt;&lt;\/div&gt;&lt;\/div&gt;&#8217;    + &#8216;&lt;div&gt;&#8217;    + &#8216;&lt;svg viewBox=&#8221;0 0 24 24&#8243;&gt;&lt;circle cx=&#8221;12&#8243; cy=&#8221;12&#8243; r=&#8221;10&#8243;\/&gt;&lt;line x1=&#8221;12&#8243; y1=&#8221;8&#8243; x2=&#8221;12&#8243; y2=&#8221;12&#8243;\/&gt;&lt;line x1=&#8221;12&#8243; y1=&#8221;16&#8243; x2=&#8221;12.01&#8243; y2=&#8221;16&#8243;\/&gt;&lt;\/svg&gt;&#8217;    + &#8216;Enter your CS Code above to see your full impact &amp;amp; certificate&lt;\/div&gt;&lt;\/div&gt;&lt;\/div&gt;&#8217;;}function showForgotMulti(outEl, arr) {  _forgotMatches = arr;  var items = arr.map(function(r, i) {    var loc = [r.city, r.country].filter(Boolean).join(&#8216; \u00b7 &#8216;);    var met = [r.email_masked, loc].filter(Boolean).join(&#8216; \u00b7 &#8216;);    return &#8216;&lt;button type=&#8221;button&#8221; onclick=&#8221;pickForgotProfile(&#8216; + i + &#8216;)&#8221;&gt;&#8217;      + &#8216;&lt;span&gt;&lt;span&gt;&#8217; + esc(r.name || &#8216;\u2014&#8217;) + &#8216;&lt;\/span&gt;&#8217;      + (met ? &#8216;&lt;span&gt;&#8217; + esc(met) + &#8216;&lt;\/span&gt;&#8217; : &#8221;) + &#8216;&lt;\/span&gt;&#8217;      + &#8216;&lt;span&gt;&#8217; + esc(r.code) + &#8216;&lt;\/span&gt;&lt;\/button&gt;&#8217;;  }).join(&#8221;);  outEl.innerHTML = &#8216;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;\/span&gt; Multiple Matches \u2014 Select Yours&lt;\/div&gt;&lt;div&gt;&#8217; + items + &#8216;&lt;\/div&gt;&lt;\/div&gt;&#8217;;}function pickForgotProfile(i) {  var out = $(&#8216;forgot-out&#8217;);  var r = _forgotMatches[i];  if (r) showForgotProfile(out, r);  else showErr(out, &#8216;Could not load profile.&#8217;);}function copyWithFeedback(btnId, text) {  var btn = $(btnId);  function done() {    if (!btn) return;    var o = btn.innerHTML;    btn.innerHTML = TICK_ICON + &#8216; Copied!&#8217;;    btn.classList.add(&#8216;done&#8217;);    setTimeout(function() { btn.innerHTML = o; btn.classList.remove(&#8216;done&#8217;); }, 2500);  }  function legacy() {    var ta = document.createElement(&#8216;textarea&#8217;); ta.value = text; ta.style.cssText = &#8216;position:fixed;opacity:0&#8217;; document.body.appendChild(ta); ta.select();    try { document.execCommand(&#8216;copy&#8217;); done(); } catch (e) {}    document.body.removeChild(ta);  }  if (navigator.clipboard &amp;&amp; navigator.clipboard.writeText) navigator.clipboard.writeText(text).then(done).catch(legacy);  else legacy();}function fpCopyCode(code) { copyWithFeedback(&#8216;fp-cbtn&#8217;, code); }function fpCopyLink(link) { copyWithFeedback(&#8216;fp-lbtn&#8217;, link); }\/* =====================================================================   13) DP BADGE BUILDER   ===================================================================== *\/function showHowModal() { $(&#8216;dp-how-modal&#8217;).classList.add(&#8216;show&#8217;); document.body.style.overflow = &#8216;hidden&#8217;; }\/* Backdrop par click (event ke saath) ya Close button (bina event) \u2014 dono band karte hain *\/function hideHowModal(e) {  if (e &amp;&amp; e.target !== $(&#8216;dp-how-modal&#8217;)) return;  $(&#8216;dp-how-modal&#8217;).classList.remove(&#8216;show&#8217;); document.body.style.overflow = &#8221;;}var DP_FRAMES = [  { title: &#8220;I am a Climate Satyagrahi&#8221;, url: &#8220;https:\/\/thefiniteearth.org\/wp-content\/uploads\/2026\/04\/I-am-a-Climate-Satyagrahi-22.png&#8221; },  { title: &#8220;I support Climate Satyagraha&#8221;, url: &#8220;https:\/\/thefiniteearth.org\/wp-content\/uploads\/2026\/04\/I-support-Climate-Satyagraha-55.png&#8221; },  { title: &#8220;I support Energy Swaraj&#8221;, url: &#8220;https:\/\/thefiniteearth.org\/wp-content\/uploads\/2026\/04\/I-support-Energy-Swaraj-66.png&#8221; }];var dpState = { img: null, frameImg: new Image(), scale: 1, baseScale: 1, dx: 0, dy: 0, manualDy: 0, isDragging: false, startX: 0, startY: 0, activeTitleIdx: 0 };var dpCanvas, dpCtx, dpInited = false;var dpCurrentStep = 1;var _dpFrameCache = {};    \/* ek baar load hua frame dobara download nahi hota *\/var _dpDrawQueued = false;function toggleDP() {  $(&#8216;panel-forgot&#8217;).classList.remove(&#8216;show&#8217;);  var panel = $(&#8216;panel-dp&#8217;);  if (panel.classList.contains(&#8216;show&#8217;)) {    panel.classList.remove(&#8216;show&#8217;);  } else {    panel.classList.add(&#8216;show&#8217;);    $(&#8216;out&#8217;).innerHTML = &#8221;;    $(&#8216;city-out&#8217;).innerHTML = &#8221;;    panel.scrollIntoView({ behavior: &#8216;smooth&#8217;, block: &#8216;start&#8217; });    if (!dpInited) initDP();  }}function dpGoStep(n) {  if (n &gt; 1 &amp;&amp; !dpState.img) { alert(&#8216;Please upload a photo first.&#8217;); return; }  dpCurrentStep = n;  for (var i = 1; i &lt;= 3; i++) {    var tab = $(&#8216;dp-tab-&#8216; + i), panel = $(&#8216;dp-panel-&#8216; + i);    if (tab) tab.className = &#8216;dp-step-tab&#8217; + (i === n ? &#8216; active&#8217; : (i &lt; n ? &#8216; done&#8217; : &#8221;));    if (panel) panel.className = &#8216;dp-step-panel&#8217; + (i === n ? &#8216; active&#8217; : &#8221;);  }  if (n === 3) setTimeout(drawDP, 50);}function initDP() {  dpInited = true;  dpCanvas = $(&#8216;dp-canvas&#8217;);  dpCtx = dpCanvas.getContext(&#8216;2d&#8217;);  var list = $(&#8216;dp-radio-list&#8217;);  list.innerHTML = &#8221;;  DP_FRAMES.forEach(function(item, i) {    var div = document.createElement(&#8216;div&#8217;);    div.className = &#8216;dp-radio-item&#8217; + (i === 0 ? &#8216; selected&#8217; : &#8221;);    div.setAttribute(&#8216;data-idx&#8217;, i);    div.innerHTML = &#8216;&lt;div&gt;&lt;div&gt;&lt;\/div&gt;&lt;\/div&gt;&#8217; + esc(item.title);    div.onclick = function() {      var items = list.children;      for (var k = 0; k &lt; items.length; k++) items[k].classList.remove(&#8216;selected&#8217;);      div.classList.add(&#8216;selected&#8217;);      loadDPFrame(i);    };    list.appendChild(div);  });  dpCanvas.addEventListener(&#8216;mousedown&#8217;, dpStartDrag);  window.addEventListener(&#8216;mousemove&#8217;, dpDrag);  window.addEventListener(&#8216;mouseup&#8217;, dpEndDrag);  dpCanvas.addEventListener(&#8216;touchstart&#8217;, function(e) { dpStartDrag(e.touches[0]); e.preventDefault(); }, { passive: false });  window.addEventListener(&#8216;touchmove&#8217;, function(e) { if (dpState.isDragging) { dpDrag(e.touches[0]); e.preventDefault(); } }, { passive: false });  window.addEventListener(&#8216;touchend&#8217;, dpEndDrag);  dpCtx.fillStyle = &#8216;#f0ece3&#8217;; dpCtx.fillRect(0, 0, 1080, 1080);  loadDPFrame(0);}function loadDPFrame(idx) {  dpState.activeTitleIdx = idx;  var img = _dpFrameCache[idx];  if (!img) {    img = new Image();    img.crossOrigin = &#8216;anonymous&#8217;;    img.src = DP_FRAMES[idx].url;    _dpFrameCache[idx] = img;  }  dpState.frameImg = img;  if (img.complete &amp;&amp; img.naturalWidth) drawDP();  else img.onload = function() { if (dpState.frameImg === img) drawDP(); };}function handleDPUpload(e) {  var file = e.target.files[0]; if (!file) return;  var reader = new FileReader();  reader.onload = function(ev) {    var img = new Image();    img.onload = function() {      dpState.img = img;      dpState.baseScale = Math.max(1080 \/ img.width, 1080 \/ img.height);      dpState.scale = dpState.baseScale;      dpState.dx = 0; dpState.dy = 0; dpState.manualDy = 0;      $(&#8216;dp-zoom&#8217;).value = 1;      $(&#8216;dp-pos-y&#8217;).value = 0;      var preview = $(&#8216;dp-photo-preview&#8217;);      preview.src = ev.target.result;      preview.classList.add(&#8216;show&#8217;);      $(&#8216;dp-upload-icon&#8217;).style.display = &#8216;none&#8217;;      $(&#8216;dp-upload-label-text&#8217;).textContent = &#8216;Photo selected&#8217;;      $(&#8216;dp-upload-sub&#8217;).textContent = &#8216;Tap to change photo&#8217;;      $(&#8216;dp-upload-zone&#8217;).classList.add(&#8216;has-photo&#8217;);      $(&#8216;dp-step1-next&#8217;).disabled = false;      drawDP();    };    img.src = ev.target.result;  };  reader.readAsDataURL(file);}function handleDPZoom() { dpState.scale = dpState.baseScale * parseFloat($(&#8216;dp-zoom&#8217;).value); scheduleDraw(); }function handleDPPosY() { dpState.manualDy = parseFloat($(&#8216;dp-pos-y&#8217;).value); scheduleDraw(); }function dpStartDrag(e) { if (!dpState.img) return; dpState.isDragging = true; dpState.startX = e.clientX; dpState.startY = e.clientY; }function dpDrag(e) {  if (!dpState.isDragging || !dpState.img) return;  var rect = dpCanvas.getBoundingClientRect(), sf = 1080 \/ rect.width;  dpState.dx += (e.clientX &#8211; dpState.startX) * sf; dpState.dy += (e.clientY &#8211; dpState.startY) * sf;  dpState.startX = e.clientX; dpState.startY = e.clientY; scheduleDraw();}function dpEndDrag() { dpState.isDragging = false; }\/* Drag \/ slider par har pixel pe canvas na banaye \u2014 ek frame me ek baar (smooth) *\/function scheduleDraw() {  if (_dpDrawQueued) return;  _dpDrawQueued = true;  (window.requestAnimationFrame || setTimeout)(function() { _dpDrawQueued = false; drawDP(); });}function drawDP() {  if (!dpCtx) return;  dpCtx.clearRect(0, 0, 1080, 1080); dpCtx.fillStyle = &#8216;#ffffff&#8217;; dpCtx.fillRect(0, 0, 1080, 1080);  if (dpState.img) {    dpCtx.save(); dpCtx.beginPath(); dpCtx.arc(540, 540, 500, 0, Math.PI * 2); dpCtx.closePath(); dpCtx.clip();    dpCtx.translate(540 + dpState.dx, 540 + dpState.dy + dpState.manualDy);    dpCtx.scale(dpState.scale, dpState.scale);    dpCtx.drawImage(dpState.img, -dpState.img.width \/ 2, -dpState.img.height \/ 2);    dpCtx.restore();  }  var f = dpState.frameImg;  if (f &amp;&amp; f.complete &amp;&amp; f.naturalWidth) dpCtx.drawImage(f, 0, 0, 1080, 1080);}function downloadDP() {  if (!dpState.img) { alert(&#8216;Please upload a photo first.&#8217;); return; }  var badgeTitle = DP_FRAMES[dpState.activeTitleIdx].title;  try {    drawDP();    triggerDownload(dpCanvas.toDataURL(&#8216;image\/png&#8217;, 1.0), &#8216;FEMUs_Badge_&#8217; + badgeTitle.replace(\/[^a-zA-Z0-9]\/g, &#8216;_&#8217;) + &#8216;.png&#8217;);    updateShareLinks();    logEvent({ action: &#8216;dp_download&#8217;, badgeTitle: badgeTitle, downloadDate: fmtDate(), name: certName, code: activeCertCode, timestamp: new Date().toISOString() });  } catch (err) {    alert(&#8216;Image security blocked the download. Please right-click the image and save it manually.&#8217;);  }}function updateShareLinks() {  var pledgeUrl = REF_BASE.split(&#8216;?&#8217;)[0];  var text = encodeURIComponent(&#8220;I just built my &#8221; + DP_FRAMES[dpState.activeTitleIdx].title + &#8221; Badge! Take the pledge and check your impact at &#8221; + pledgeUrl);  var url = encodeURIComponent(pledgeUrl);  $(&#8216;dp-share-wa&#8217;).href = &#8216;https:\/\/api.whatsapp.com\/send?text=&#8217; + text;  $(&#8216;dp-share-ig&#8217;).href = &#8216;https:\/\/www.instagram.com\/&#8217;;  $(&#8216;dp-share-li&#8217;).href = &#8216;https:\/\/www.linkedin.com\/sharing\/share-offsite\/?url=&#8217; + url;  $(&#8216;dp-share-x&#8217;).href = &#8216;https:\/\/twitter.com\/intent\/tweet?text=&#8217; + text;  $(&#8216;dp-share-fb&#8217;).href = &#8216;https:\/\/www.facebook.com\/sharer\/sharer.php?u=&#8217; + url + &#8216;&amp;quote=&#8217; + text;}\/* =====================================================================   14) CERTIFICATE POPUP + DOWNLOAD (settings upar block 2 me hain)   ===================================================================== *\/function getCertImgUrl(type) { return CERT_IMG[type] || CERT_IMG.bronze; }\/* Certificate par chhapne wali tareekh: milestone ki (agar pata ho) warna aaj ki *\/function certDateStr() { return milestoneDates[activeCertType] || fmtDate(); }function openCert(type) {  if (!certName) { alert(&#8216;Please search for your CS Code first.&#8217;); return; }  var cnt = certStats.cnt || 0, threshold = MILESTONES[type] || MILESTONES.bronze;  if (cnt &lt; threshold) { alert(&#8216;You need &#8216; + threshold + &#8216; referrals to unlock the &#8216; + CERT_META[type].label + &#8216; certificate. You currently have &#8216; + cnt + &#8216;.&#8217;); return; }  activeCertType = type || &#8216;bronze&#8217;;  var meta = CERT_META[activeCertType];  $(&#8216;cert-overlay-title&#8217;).textContent = (meta.icon ? meta.icon + &#8216; &#8216; : &#8221;) + &#8216;Your &#8216; + meta.label + &#8216; Certificate of Impact&#8217;;  var img = $(&#8216;cert-img&#8217;), url = getCertImgUrl(activeCertType);  \/* Naam \/ tareekh pehle hi bhar dein, taki photo load hote hi sahi text dikhe *\/  positionCertOverlays();  if (img.src !== url) img.src = url;   \/* same photo ho to onload nahi aata \u2014 neeche wala call sambhal lega *\/  $(&#8216;cert-overlay&#8217;).style.display = &#8216;flex&#8217;;  document.body.style.overflow = &#8216;hidden&#8217;;  setTimeout(positionCertOverlays, 100);}function closeCert() { $(&#8216;cert-overlay&#8217;).style.display = &#8216;none&#8217;; document.body.style.overflow = &#8221;; }function certOverlayOpen() { var o = $(&#8216;cert-overlay&#8217;); return o &amp;&amp; o.style.display === &#8216;flex&#8217;; }\/* Naam aur tareekh ko certificate ki photo ke hisaab se jagah \/ size deta hai.   Photo load hone par (onload), popup khulne par, resize par, aur download se   theek pehle \u2014 har baar yahi chalta hai, isliye text hamesha sahi jagah rehta hai. *\/function positionCertOverlays() {  var img = $(&#8216;cert-img&#8217;), nameEl = $(&#8216;co-name&#8217;), dateEl = $(&#8216;co-date&#8217;);  if (!img || !nameEl || !dateEl) return;  var w = img.offsetWidth, h = img.offsetHeight;  var N = CERT_POSITIONS.name, D = CERT_POSITIONS.date;  nameEl.textContent = certName;  dateEl.textContent = certDateStr();  if (!w || !h) return;   \/* photo abhi aayi nahi \u2014 onload par dobara chalega *\/  var nameSize = Math.round(w * parseFloat(N.fontSize) \/ 100);  nameEl.style.top = N.top;  nameEl.style.fontFamily = N.font || &#8220;&#8216;Charm&#8217;,cursive&#8221;;  nameEl.style.fontWeight = N.weight || &#8216;700&#8217;;  nameEl.style.color = N.color || &#8216;#0d3d6e&#8217;;  nameEl.style.fontSize = nameSize + &#8216;px&#8217;;  \/* Lamba naam: ek line me rakhne ke liye font utna chhota karein jitna zaroori ho (kam se kam 45%).     Text ki asli chaudai Range se naapte hain (box ki nahi). *\/  var maxW = w * ((N.maxWidth || 80) \/ 100), minSize = Math.max(10, Math.round(nameSize * 0.45));  var textW = certTextWidth(nameEl), guard = 0;  while (textW &gt; maxW &amp;&amp; nameSize &gt; minSize &amp;&amp; guard++ &lt; 6) {    nameSize = Math.max(minSize, Math.floor(nameSize * maxW \/ textW));    nameEl.style.fontSize = nameSize + &#8216;px&#8217;;    textW = certTextWidth(nameEl);  }  dateEl.style.top = D.top;  dateEl.style.left = D.left || &#8216;12%&#8217;;  dateEl.style.fontSize = Math.round(h * parseFloat(D.fontSize) \/ 100) + &#8216;px&#8217;;  if (D.font) dateEl.style.fontFamily = D.font;  if (D.color) dateEl.style.color = D.color;}\/* Element ke andar ke TEXT ki chaudai (px) \u2014 element ki apni chaudai nahi *\/function certTextWidth(el) {  if (!el.firstChild || !document.createRange) return el.scrollWidth;  var r = document.createRange(); r.selectNodeContents(el);  return r.getBoundingClientRect().width;}\/* Photo (certificate background) poori load ho jaaye, tab resolve *\/function waitForCertImage() {  var img = $(&#8216;cert-img&#8217;);  if (img.complete &amp;&amp; img.naturalWidth) return Promise.resolve();  return new Promise(function(resolve) {    var done = function() { img.removeEventListener(&#8216;load&#8217;, done); img.removeEventListener(&#8216;error&#8217;, done); resolve(); };    img.addEventListener(&#8216;load&#8217;, done); img.addEventListener(&#8216;error&#8217;, done);    setTimeout(done, 8000);  });}function downloadCert() {  var btn = $(&#8216;dl-btn&#8217;);  var idleHtml = DL_ICON + &#8216; Download Certificate&#8217;;  if (typeof html2canvas !== &#8216;function&#8217;) { alert(&#8216;Still loading, please try again in a moment.&#8217;); return; }  btn.disabled = true; btn.innerHTML = &#8216;&lt;span&gt;&lt;\/span&gt; Generating\u2026&#8217;;  \/* Photo + fonts (Charm \/ Cormorant) load hone ka intezaar, phir text ki jagah     dobara set \u2014 tab image banao. Isse naam \/ tareekh kabhi galat font ya galat     jagah par nahi aate. *\/  var fontsReady = (document.fonts &amp;&amp; document.fonts.ready) ? document.fonts.ready : Promise.resolve();  Promise.all([waitForCertImage(), fontsReady]).then(function() {    positionCertOverlays();    return html2canvas($(&#8216;cert-wrapper&#8217;), { scale: 3, useCORS: true, allowTaint: true, backgroundColor: null, logging: false });  }).then(function(canvas) {    var meta = CERT_META[activeCertType] || CERT_META.bronze;    triggerDownload(canvas.toDataURL(&#8216;image\/png&#8217;, 1.0), &#8216;FEMUs_&#8217; + meta.label + &#8216;_Certificate_&#8217; + certName.replace(\/s+\/g, &#8216;_&#8217;) + &#8216;.png&#8217;);    var cnt = certStats.cnt || 0;    logEvent({      name: certName, code: activeCertCode, certType: meta.label, referralCount: cnt,      waterSaved: Math.round(cnt * BASE.water_L), co2Reduced: (cnt * BASE.co2_kg).toFixed(1), chemReduced: (cnt * BASE.chem_kg).toFixed(2),      downloadDate: fmtDate(), milestoneDate: milestoneDates[activeCertType] || &#8221;    });    btn.disabled = false;    btn.innerHTML = TICK_ICON + &#8216; Downloaded!&#8217;;    setTimeout(function() { btn.innerHTML = idleHtml; }, 3000);  }).catch(function(err) {    console.error(err); btn.disabled = false; btn.innerHTML = idleHtml;    alert(&#8216;Download failed. Please right-click the certificate and save image.&#8217;);  });}\/* =====================================================================   15) HEADER GAP \u2014 header ki asli oonchai naap kar &#8220;See Your Impact&#8221; ko       uske neeche rakhta hai. Gap badalna ho to sirf KI_HEADER_GAP badlein.   ===================================================================== *\/var KI_HEADER_GAP = 6;   \/* + 18px hero padding = header ke neeche ~24px gap *\/function kiFitHeader() {  var page = $(&#8216;ki-page&#8217;);  var hdr = document.querySelector(&#8216;.thrv_header&#8217;) || document.querySelector(&#8216;header&#8217;);  if (!page || !hdr) return;  var overlap = Math.round(hdr.getBoundingClientRect().bottom &#8211; page.getBoundingClientRect().top);  page.style.setProperty(&#8216;&#8211;ki-header-clear&#8217;, (Math.max(0, overlap) + KI_HEADER_GAP) + &#8216;px&#8217;);}(function() {  var queued = false;  function queue() {    if (queued) return;    queued = true;    (window.requestAnimationFrame || setTimeout)(function() { queued = false; kiFitHeader(); });  }  kiFitHeader();  window.addEventListener(&#8216;load&#8217;, queue);              \/* logo \/ fonts load hone ke baad *\/  window.addEventListener(&#8216;resize&#8217;, queue);            \/* zoom + rotate + resize *\/  if (window.ResizeObserver) {    var hdr = document.querySelector(&#8216;.thrv_header&#8217;) || document.querySelector(&#8216;header&#8217;);    if (hdr) new ResizeObserver(queue).observe(hdr);  \/* menu wrap ho to header ooncha *\/  }  if (document.fonts &amp;&amp; document.fonts.ready) document.fonts.ready.then(queue);})();\/* =====================================================================   16) GLOBAL EVENTS   ===================================================================== *\/window.addEventListener(&#8216;resize&#8217;, function() { if (certOverlayOpen()) positionCertOverlays(); });document.addEventListener(&#8216;keydown&#8217;, function(e) {  if (e.key === &#8216;Escape&#8217;) {    if (certOverlayOpen()) closeCert();    else if ($(&#8216;dp-how-modal&#8217;).classList.contains(&#8216;show&#8217;)) hideHowModal();    return;  }  if (e.key !== &#8216;Enter&#8217;) return;  var a = document.activeElement; if (!a) return;  if (a.id === &#8216;impact-code&#8217;) doImpactSearch();  else if (a.id === &#8216;city-input&#8217;) doCitySearch();  else if (a.id === &#8216;fq&#8217;) doForgotSearch();});updateShareLinks();[\/tcb-script]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Climate Satyagraha \u2013 Your Impact[tcb-script defer=&#8221;&#8221; src=&#8221;https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/html2canvas\/1.4.1\/html2canvas.min.js&#8221;][\/tcb-script] See Your Impact Measure the change you are creating. 1Register My Pledge 2Get Your Code 3Invite Others 4See Your Impact Track Your Impact Climate change is not caused by a few \u2014 it is the result of everyday consumption by all of us. And it will not be [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":"","tve_updated_post":"","tve_custom_css":"","tve_user_custom_css":"","tve_globals":{},"tcb2_ready":1,"tcb_editor_enabled":1,"tve_landing_page":"bd86f3fc67210fed5b2794ad4a56d3a9","_tve_header":"216","_tve_footer":"0"},"class_list":["post-2126","page","type-page","status-publish","hentry","post-wrapper","thrv_wrapper"],"_links":{"self":[{"href":"https:\/\/thefiniteearth.org\/hindi\/wp-json\/wp\/v2\/pages\/2126","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thefiniteearth.org\/hindi\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/thefiniteearth.org\/hindi\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/thefiniteearth.org\/hindi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/thefiniteearth.org\/hindi\/wp-json\/wp\/v2\/comments?post=2126"}],"version-history":[{"count":51,"href":"https:\/\/thefiniteearth.org\/hindi\/wp-json\/wp\/v2\/pages\/2126\/revisions"}],"predecessor-version":[{"id":2190,"href":"https:\/\/thefiniteearth.org\/hindi\/wp-json\/wp\/v2\/pages\/2126\/revisions\/2190"}],"wp:attachment":[{"href":"https:\/\/thefiniteearth.org\/hindi\/wp-json\/wp\/v2\/media?parent=2126"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}