{"id":479,"date":"2026-03-31T04:16:27","date_gmt":"2026-03-31T04:16:27","guid":{"rendered":"https:\/\/thefiniteearth.org\/?page_id=479"},"modified":"2026-04-13T11:56:56","modified_gmt":"2026-04-13T11:56:56","slug":"100-days","status":"publish","type":"page","link":"https:\/\/thefiniteearth.org\/hindi\/100-days\/","title":{"rendered":"\u092d\u093e\u0930\u0924 \u0915\u094d\u0932\u093e\u0907\u092e\u0947\u091f \u0938\u0924\u094d\u092f\u093e\u0917\u094d\u0930\u0939"},"content":{"rendered":"<h2 style=\"text-align: center;\"><span style=\"letter-spacing: 3px;\">100 DAYS <strong><\/strong>YATRA- MAY 13-AUGUST 20, 2026<\/span><span style=\"letter-spacing: 6px;\"><\/span><\/h2>\n<h2 style=\"text-align: center;\"><span style=\"\"><span style=\"\"><span style=\"\">Bharat Climate Satyagraha Yatra<\/span>&nbsp;<\/span><span style=\"\"><\/span><\/span><\/h2>\n<h2 style=\"text-align: center;\"><strong><span style=\"\">\u0938\u0940\u092e\u093f\u0924<\/span> \u0927\u0930\u0924\u0940 \u092a\u0930 <span style=\"\">\u0938\u0940\u092e\u093f\u0924 \u091c\u0940\u0935\u0928 \u0915\u093e \u0906\u0917\u094d\u0930\u0939<\/span><\/strong><\/h2>\n<p style=\"text-align: center;\">Starting 13 May 2026 from Rajghat, Delhi, the 100 Days Climate Satyagraha Yatra will cover 5,800+ km across 51 cities. The goal is to mobilize 1 lakh people to take the Finite Living Pledge and build local action teams for sustained climate action. <a href=\"#tve-jump-19d7cbf37c3\" jump-animation=\"smooth\" style=\"outline: none;\"><span style=\"text-decoration: underline;\">Click to know more<\/span><\/a>.<strong><span style=\"text-decoration: underline;\"><\/span><\/strong><\/p>\n<p style=\"text-align: center;\"><strong>&nbsp;<\/strong>From awareness to local ownership, we invite you to lead the Climate Satyagraha in your city. Whether you <b data-index-in-node=\"191\" data-path-to-node=\"3,0\"><span style=\"--tcb-applied-color: var$(--tcb-skin-color-0) !important; color: var(--tcb-skin-color-0) !important;\">Host<\/span><\/b><span style=\"--tcb-applied-color: var$(--tcb-skin-color-0) !important; color: var(--tcb-skin-color-0) !important;\">, <b data-index-in-node=\"197\" data-path-to-node=\"3,0\">Volunteer<\/b>, or <b data-index-in-node=\"211\" data-path-to-node=\"3,0\">Support<\/b> <strong>our team with food and stay<\/strong><\/span>\u2014your action is the movement. <b data-index-in-node=\"122\" data-path-to-node=\"6,0\"><span style=\"font-weight: normal;\"><span style=\"--tcb-applied-color: var$(--tcb-skin-color-2) !important; color: var(--tcb-skin-color-2) !important;\">Click below to be part of Climate Satyagraha.<\/span><\/span><\/b><\/p>\n<p><span style=\"\"><img decoding=\"async\" alt=\"\" data-id=\"1087\" width=\"983\" height=\"787\" title=\"Yatra Schedule (Instagram Post (45)) (9)\" src=\"\/\/thefiniteearth.org\/wp-content\/uploads\/2026\/04\/Yatra-Schedule-Instagram-Post-45-9.png.webp\" style=\"aspect-ratio: auto 1335 \/ 1069;\" ml-d=\"0\" ml-m=\"-3.0369999999999777\" data-width=\"983\" data-height=\"787\" data-init-width=\"1335\" data-init-height=\"1069\" loading=\"lazy\" mt-d=\"-255\" mt-m=\"0\" center-v-d=\"false\" mt-t=\"-162\" center-v-t=\"false\"><\/span><\/p>\n<h2 style=\"text-align: center;\">Bharat Climate Satyagraha Yatra Route<\/h2>\n<p style=\"text-align: center;\"><span style=\"font-weight: normal;\">Stay connected with the Bharat Climate Satyagraha. This dashboard provides a live snapshot of our progress: total distance covered, people reached, and our current city. Explore the full Golden Quadrilateral route and the 100-day calendar to join the movement as it passes through your region.<\/span><\/p>\n<p>Energy Swaraj Yatra                                                                                                                                                            Bharat Climate Satyagraha Yatra      100 Days Sacred Journey Across Bharat \u2014 Golden Quadrilateral                        <span>May 13 \u2013 Aug 20, 2026<\/span>        Day \u2014 of 100                <span>Today&#8217;s Schedule<\/span>                    <span>Invite Yatra<\/span>                  Journey Stats                                                                                                0                    Days Done                                                                                          100                    Days Left                                      KMs Covered          0                                              People Met          0                                                      <span id=\"live-txt\">LIVE<\/span>          Day \u2014                Loading\u2026        \u2014                    Next Stop        \u2014        \u2014                    Yatra Progress                Loading\u2026                    Route        Loading route\u2026                                                  <span>Currently at<\/span>      <span id=\"map-badge-city\">\u2014<\/span>                  India Route Map              <img decoding=\"async\" src=\"http:\/\/thefiniteearth.org\/wp-content\/uploads\/2026\/04\/Asset-1.png.webp\" alt=\"India Map\" style=\"width: 100%; display: block; border-radius: 10px; transition: transform 0.3s; transform: scale(1);\" onmouseover=\"this.style.transform='scale(1.02)'\" onmouseout=\"this.style.transform='scale(1)'\" onerror=\"this.closest('div').style.display='none'\">        <img decoding=\"async\" role=\"img\" alt=\"\ud83d\udd0d\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/svg\/1f50d.svg\"> Full View                    Schedule                  <\/p>\n<h2 id=\"cal-evt-title\">Event Details<\/h2>\n<p>\u00d7    No event data          <a id=\"yatra-invite\" href=\"javascript:void(0)\" onclick=\"closeCalEvt();closeDash();inviteYatra();\">                Take Action &#8211; Invite Yatra Now!      <\/a>                  <\/p>\n<h1>Live Yatra Tracking System<\/h1>\n<p>      \u2715 Close        Current City: <strong id=\"d-current-city-text\">Loading&#8230;<\/strong>                   Map                                                         Calendar                                    <span onclick=\"closeDEvt()\">\u00d7<\/span><\/p>\n<h2 id=\"d-modal-name\">Event Details<\/h2>\n<p>                  <span>Hosted By<\/span>          <span>Location<\/span><span id=\"d-modal-venue\"><\/span>, <span id=\"d-modal-city\"><\/span>                      <span>Date<\/span>            <span>Time<\/span>                    <span>Description<\/span>                          <a href=\"javascript:void(0)\" onclick=\"closeDEvt();closeDash();inviteYatra();\">                        Take Action &#8211; Invite Yatra Now!          <\/a>                          \u2715    <img decoding=\"async\" src=\"http:\/\/thefiniteearth.org\/wp-content\/uploads\/2026\/04\/Asset-1.png.webp\" alt=\"India Route Map\" style=\"max-width:100%;max-height:80vh;border-radius:8px;display:block;\">    Golden Quadrilateral Yatra Route \u2014 Bharat  [tcb-script src=&#8221;https:\/\/cdn.jsdelivr.net\/npm\/fullcalendar@5.11.3\/main.min.js&#8221;][\/tcb-script][tcb-script src=&#8221;https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/d3\/7.9.0\/d3.min.js&#8221;][\/tcb-script][tcb-script]if (&#8216;scrollRestoration&#8217; in history) history.scrollRestoration = &#8216;manual&#8217;;\/\/ Remove any hash from URL on load to prevent scrolling to #take-actionif(window.location.hash) { history.replaceState(null, &#8221;, window.location.pathname + window.location.search); }window.scrollTo(0,0);document.addEventListener(&#8216;DOMContentLoaded&#8217;,()=&gt;{ window.scrollTo(0,0); });window.addEventListener(&#8216;load&#8217;,()=&gt;{ window.scrollTo(0,0); setTimeout(()=&gt;window.scrollTo(0,0),200); });function inviteYatra(){console.log(&#8220;hello&#8221;);    var target = document.getElementById(&#8220;take-action-invite-yatra-now&#8221;);        if (target) {        window.scrollTo({            top: target.offsetTop,            behavior: &#8220;smooth&#8221;        });    }  try{    \/\/ Try direct element scroll in parent window    var topDoc=window.top.document;    var el=topDoc.getElementById(&#8216;take-action-invite-yatra-now&#8217;);    if(el){el.scrollIntoView({behavior:&#8217;smooth&#8217;,block:&#8217;start&#8217;});return;}    \/\/ Try anchor link approach &#8211; does not reload page    var a=topDoc.createElement(&#8216;a&#8217;);    a.href=&#8217;#take-action-invite-yatra-now&#8217;;    topDoc.body.appendChild(a);    a.click();    topDoc.body.removeChild(a);  }catch(e){    \/\/ cross-origin: open same page at anchor in same tab    window.top.location.href=&#8217;https:\/\/thefiniteearth.org\/100-days-esy\/?preview=true#take-action-invite-yatra-now&#8217;;  }}const API_URL=&#8217;https:\/\/script.google.com\/macros\/s\/AKfycbwG5S7pytIy4PYRNluekHx8wgn6VPfqI9FJdOHoonbX9CrSO56IL8MGUikkq1V-wALq4w\/exec&#8217;;const GQ_ROUTE=[  {name:&#8217;Delhi&#8217;,lat:28.6139,lon:77.2090},{name:&#8217;Gurugram&#8217;,lat:28.4595,lon:77.0266},  {name:&#8217;Manesar&#8217;,lat:28.3562,lon:76.9383},{name:&#8217;Neemrana&#8217;,lat:27.9747,lon:76.3844},  {name:&#8217;Alwar&#8217;,lat:27.5530,lon:76.6346},{name:&#8217;Jaipur&#8217;,lat:26.9124,lon:75.7873},  {name:&#8217;Ajmer&#8217;,lat:26.4499,lon:74.6399},{name:&#8217;Bhilwara&#8217;,lat:25.3474,lon:74.6339},  {name:&#8217;Chittorgarh&#8217;,lat:24.8887,lon:74.6269},{name:&#8217;Udaipur&#8217;,lat:24.5854,lon:73.7125},  {name:&#8217;Ahmedabad&#8217;,lat:23.0225,lon:72.5714},{name:&#8217;Vadodara&#8217;,lat:22.3072,lon:73.1812},  {name:&#8217;Bharuch&#8217;,lat:21.7051,lon:72.9959},{name:&#8217;Surat&#8217;,lat:21.1702,lon:72.8311},  {name:&#8217;Vapi&#8217;,lat:20.3749,lon:72.9057},{name:&#8217;Mumbai&#8217;,lat:19.0760,lon:72.8777},  {name:&#8217;Pune&#8217;,lat:18.5204,lon:73.8567},{name:&#8217;Satara&#8217;,lat:17.6805,lon:74.0183},  {name:&#8217;Kolhapur&#8217;,lat:16.7050,lon:74.2433},{name:&#8217;Belagavi&#8217;,lat:15.8497,lon:74.4977},  {name:&#8217;Dharwad&#8217;,lat:15.4589,lon:75.0078},{name:&#8217;Hubballi&#8217;,lat:15.3647,lon:75.1240},  {name:&#8217;Davanagere&#8217;,lat:14.4644,lon:75.9218},{name:&#8217;Chitradurga&#8217;,lat:14.2296,lon:76.3981},  {name:&#8217;Tumakuru&#8217;,lat:13.3379,lon:77.1173},{name:&#8217;Bengaluru&#8217;,lat:12.9716,lon:77.5946},  {name:&#8217;Hosur&#8217;,lat:12.7409,lon:77.8253},{name:&#8217;Krishnagiri&#8217;,lat:12.5266,lon:78.2138},  {name:&#8217;Vellore&#8217;,lat:12.9165,lon:79.1325},{name:&#8217;Chennai&#8217;,lat:13.0827,lon:80.2707},  {name:&#8217;Nellore&#8217;,lat:14.4426,lon:79.9865},{name:&#8217;Ongole&#8217;,lat:15.5057,lon:80.0499},  {name:&#8217;Vijayawada&#8217;,lat:16.5062,lon:80.6480},{name:&#8217;Rajamahendravaram&#8217;,lat:17.0005,lon:81.8040},  {name:&#8217;Visakhapatnam&#8217;,lat:17.6868,lon:83.2185},{name:&#8217;Srikakulam&#8217;,lat:18.2949,lon:83.8938},  {name:&#8217;Berhampur&#8217;,lat:19.3150,lon:84.7941},{name:&#8217;Bhubaneswar&#8217;,lat:20.2961,lon:85.8245},  {name:&#8217;Cuttack&#8217;,lat:20.4625,lon:85.8830},{name:&#8217;Balasore&#8217;,lat:21.4927,lon:86.9316},  {name:&#8217;Kharagpur&#8217;,lat:22.3460,lon:87.2319},{name:&#8217;Kolkata&#8217;,lat:22.5726,lon:88.3639},  {name:&#8217;Durgapur&#8217;,lat:23.5204,lon:87.3119},{name:&#8217;Asansol&#8217;,lat:23.6739,lon:86.9524},  {name:&#8217;Dhanbad&#8217;,lat:23.7957,lon:86.4304},{name:&#8217;Hazaribagh&#8217;,lat:23.9925,lon:85.3637},  {name:&#8217;Gaya&#8217;,lat:24.7955,lon:85.0002},{name:&#8217;Sasaram&#8217;,lat:24.9474,lon:84.0317},  {name:&#8217;Prayagraj&#8217;,lat:25.4358,lon:81.8463},{name:&#8217;Kanpur&#8217;,lat:26.4499,lon:80.3319},  {name:&#8217;Agra&#8217;,lat:27.1767,lon:78.0081},{name:&#8217;Mathura&#8217;,lat:27.4924,lon:77.6737},  {name:&#8217;Faridabad&#8217;,lat:28.4082,lon:77.3178},{name:&#8217;Delhi&#8217;,lat:28.6139,lon:77.2090},];const GQ_MAP={};GQ_ROUTE.forEach(r=&gt;{GQ_MAP[r.name.toLowerCase()]=r;});\/* \u2500\u2500 India Background Cities (State Capitals + Major Cities) \u2500\u2500 *\/const INDIA_BG_CITIES = [  \/\/ State Capitals  {n:&#8217;Amaravati&#8217;,lat:16.5193,lon:80.5180,cap:true},  {n:&#8217;Itanagar&#8217;,lat:27.0844,lon:93.6053,cap:true},  {n:&#8217;Dispur&#8217;,lat:26.1433,lon:91.7898,cap:true},  {n:&#8217;Patna&#8217;,lat:25.5941,lon:85.1376,cap:true},  {n:&#8217;Raipur&#8217;,lat:21.2514,lon:81.6296,cap:true},  {n:&#8217;Panaji&#8217;,lat:15.4989,lon:73.8278,cap:true},  {n:&#8217;Gandhinagar&#8217;,lat:23.2156,lon:72.6369,cap:true},  {n:&#8217;Chandigarh&#8217;,lat:30.7333,lon:76.7794,cap:true},  {n:&#8217;Shimla&#8217;,lat:31.1048,lon:77.1734,cap:true},  {n:&#8217;Ranchi&#8217;,lat:23.3441,lon:85.3096,cap:true},  {n:&#8217;Bengaluru&#8217;,lat:12.9716,lon:77.5946,cap:true},  {n:&#8217;Thiruvananthapuram&#8217;,lat:8.5241,lon:76.9366,cap:true},  {n:&#8217;Bhopal&#8217;,lat:23.2599,lon:77.4126,cap:true},  {n:&#8217;Mumbai&#8217;,lat:19.0760,lon:72.8777,cap:true},  {n:&#8217;Imphal&#8217;,lat:24.8170,lon:93.9368,cap:true},  {n:&#8217;Shillong&#8217;,lat:25.5788,lon:91.8933,cap:true},  {n:&#8217;Aizawl&#8217;,lat:23.7307,lon:92.7173,cap:true},  {n:&#8217;Kohima&#8217;,lat:25.6751,lon:94.1086,cap:true},  {n:&#8217;Bhubaneswar&#8217;,lat:20.2961,lon:85.8245,cap:true},  {n:&#8217;Chandigarh&#8217;,lat:30.7333,lon:76.7794,cap:true},  {n:&#8217;Jaipur&#8217;,lat:26.9124,lon:75.7873,cap:true},  {n:&#8217;Gangtok&#8217;,lat:27.3314,lon:88.6138,cap:true},  {n:&#8217;Chennai&#8217;,lat:13.0827,lon:80.2707,cap:true},  {n:&#8217;Hyderabad&#8217;,lat:17.3850,lon:78.4867,cap:true},  {n:&#8217;Agartala&#8217;,lat:23.8315,lon:91.2868,cap:true},  {n:&#8217;Lucknow&#8217;,lat:26.8467,lon:80.9462,cap:true},  {n:&#8217;Dehradun&#8217;,lat:30.3165,lon:78.0322,cap:true},  {n:&#8217;Kolkata&#8217;,lat:22.5726,lon:88.3639,cap:true},  {n:&#8217;Delhi&#8217;,lat:28.6139,lon:77.2090,cap:true},  \/\/ Major cities  {n:&#8217;Srinagar&#8217;,lat:34.0837,lon:74.7973},  {n:&#8217;Jammu&#8217;,lat:32.7266,lon:74.8570},  {n:&#8217;Leh&#8217;,lat:34.1526,lon:77.5771},  {n:&#8217;Amritsar&#8217;,lat:31.6340,lon:74.8723},  {n:&#8217;Ludhiana&#8217;,lat:30.9010,lon:75.8573},  {n:&#8217;Jalandhar&#8217;,lat:31.3260,lon:75.5762},  {n:&#8217;Ambala&#8217;,lat:30.3782,lon:76.7767},  {n:&#8217;Hisar&#8217;,lat:29.1492,lon:75.7217},  {n:&#8217;Rohtak&#8217;,lat:28.8955,lon:76.6066},  {n:&#8217;Gurugram&#8217;,lat:28.4595,lon:77.0266},  {n:&#8217;Noida&#8217;,lat:28.5355,lon:77.3910},  {n:&#8217;Ghaziabad&#8217;,lat:28.6692,lon:77.4538},  {n:&#8217;Meerut&#8217;,lat:28.9845,lon:77.7064},  {n:&#8217;Aligarh&#8217;,lat:27.8974,lon:78.0880},  {n:&#8217;Agra&#8217;,lat:27.1767,lon:78.0081},  {n:&#8217;Mathura&#8217;,lat:27.4924,lon:77.6737},  {n:&#8217;Bareilly&#8217;,lat:28.3670,lon:79.4304},  {n:&#8217;Moradabad&#8217;,lat:28.8389,lon:78.7769},  {n:&#8217;Varanasi&#8217;,lat:25.3176,lon:82.9739},  {n:&#8217;Allahabad&#8217;,lat:25.4358,lon:81.8463},  {n:&#8217;Kanpur&#8217;,lat:26.4499,lon:80.3319},  {n:&#8217;Gorakhpur&#8217;,lat:26.7606,lon:83.3732},  {n:&#8217;Jhansi&#8217;,lat:25.4484,lon:78.5685},  {n:&#8217;Gwalior&#8217;,lat:26.2183,lon:78.1828},  {n:&#8217;Indore&#8217;,lat:22.7196,lon:75.8577},  {n:&#8217;Jabalpur&#8217;,lat:23.1815,lon:79.9864},  {n:&#8217;Ujjain&#8217;,lat:23.1793,lon:75.7849},  {n:&#8217;Surat&#8217;,lat:21.1702,lon:72.8311},  {n:&#8217;Ahmedabad&#8217;,lat:23.0225,lon:72.5714},  {n:&#8217;Vadodara&#8217;,lat:22.3072,lon:73.1812},  {n:&#8217;Rajkot&#8217;,lat:22.3039,lon:70.8022},  {n:&#8217;Bhavnagar&#8217;,lat:21.7645,lon:72.1519},  {n:&#8217;Jamnagar&#8217;,lat:22.4707,lon:70.0577},  {n:&#8217;Jodhpur&#8217;,lat:26.2389,lon:73.0243},  {n:&#8217;Udaipur&#8217;,lat:24.5854,lon:73.7125},  {n:&#8217;Kota&#8217;,lat:25.2138,lon:75.8648},  {n:&#8217;Ajmer&#8217;,lat:26.4499,lon:74.6399},  {n:&#8217;Bikaner&#8217;,lat:28.0229,lon:73.3119},  {n:&#8217;Pune&#8217;,lat:18.5204,lon:73.8567},  {n:&#8217;Nagpur&#8217;,lat:21.1458,lon:79.0882},  {n:&#8217;Nashik&#8217;,lat:19.9975,lon:73.7898},  {n:&#8217;Aurangabad&#8217;,lat:19.8762,lon:75.3433},  {n:&#8217;Solapur&#8217;,lat:17.6805,lon:75.9064},  {n:&#8217;Kolhapur&#8217;,lat:16.7050,lon:74.2433},  {n:&#8217;Amravati&#8217;,lat:20.9374,lon:77.7796},  {n:&#8217;Vizag&#8217;,lat:17.6868,lon:83.2185},  {n:&#8217;Vijayawada&#8217;,lat:16.5062,lon:80.6480},  {n:&#8217;Tirupati&#8217;,lat:13.6288,lon:79.4192},  {n:&#8217;Guntur&#8217;,lat:16.3067,lon:80.4365},  {n:&#8217;Warangal&#8217;,lat:17.9784,lon:79.5941},  {n:&#8217;Nellore&#8217;,lat:14.4426,lon:79.9865},  {n:&#8217;Coimbatore&#8217;,lat:11.0168,lon:76.9558},  {n:&#8217;Madurai&#8217;,lat:9.9252,lon:78.1198},  {n:&#8217;Tiruchirappalli&#8217;,lat:10.7905,lon:78.7047},  {n:&#8217;Salem&#8217;,lat:11.6643,lon:78.1460},  {n:&#8217;Tirunelveli&#8217;,lat:8.7139,lon:77.7567},  {n:&#8217;Kochi&#8217;,lat:9.9312,lon:76.2673},  {n:&#8217;Kozhikode&#8217;,lat:11.2588,lon:75.7804},  {n:&#8217;Thrissur&#8217;,lat:10.5276,lon:76.2144},  {n:&#8217;Kollam&#8217;,lat:8.8932,lon:76.6141},  {n:&#8217;Mysuru&#8217;,lat:12.2958,lon:76.6394},  {n:&#8217;Hubli&#8217;,lat:15.3647,lon:75.1240},  {n:&#8217;Mangaluru&#8217;,lat:12.9141,lon:74.8560},  {n:&#8217;Belagavi&#8217;,lat:15.8497,lon:74.4977},  {n:&#8217;Davangere&#8217;,lat:14.4644,lon:75.9218},  {n:&#8217;Guwahati&#8217;,lat:26.1445,lon:91.7362},  {n:&#8217;Silchar&#8217;,lat:24.8333,lon:92.7789},  {n:&#8217;Dibrugarh&#8217;,lat:27.4728,lon:94.9120},  {n:&#8217;Siliguri&#8217;,lat:26.7271,lon:88.3953},  {n:&#8217;Asansol&#8217;,lat:23.6739,lon:86.9524},  {n:&#8217;Durgapur&#8217;,lat:23.5204,lon:87.3119},  {n:&#8217;Howrah&#8217;,lat:22.5958,lon:88.2636},  {n:&#8217;Kharagpur&#8217;,lat:22.3460,lon:87.2319},  {n:&#8217;Dhanbad&#8217;,lat:23.7957,lon:86.4304},  {n:&#8217;Jamshedpur&#8217;,lat:22.8046,lon:86.2029},  {n:&#8217;Bokaro&#8217;,lat:23.6693,lon:86.1511},  {n:&#8217;Muzaffarpur&#8217;,lat:26.1209,lon:85.3647},  {n:&#8217;Gaya&#8217;,lat:24.7955,lon:85.0002},  {n:&#8217;Bhagalpur&#8217;,lat:25.2425,lon:86.9842},  {n:&#8217;Darbhanga&#8217;,lat:26.1542,lon:85.8918},  {n:&#8217;Bilaspur&#8217;,lat:22.0797,lon:82.1409},  {n:&#8217;Korba&#8217;,lat:22.3595,lon:82.7501},  {n:&#8217;Bhopal&#8217;,lat:23.2599,lon:77.4126},  {n:&#8217;Shivpuri&#8217;,lat:25.4231,lon:77.6577},  {n:&#8217;Rewa&#8217;,lat:24.5362,lon:81.3037},  {n:&#8217;Satna&#8217;,lat:24.5854,lon:80.8322},  {n:&#8217;Prayagraj&#8217;,lat:25.4358,lon:81.8463},  {n:&#8217;Puducherry&#8217;,lat:11.9416,lon:79.8083},  {n:&#8217;Vellore&#8217;,lat:12.9165,lon:79.1325},  {n:&#8217;Erode&#8217;,lat:11.3410,lon:77.7172},  {n:&#8217;Kakinada&#8217;,lat:16.9891,lon:82.2475},  {n:&#8217;Rajahmundry&#8217;,lat:17.0005,lon:81.8040},  {n:&#8217;Shillong&#8217;,lat:25.5788,lon:91.8933},  {n:&#8217;Imphal&#8217;,lat:24.8170,lon:93.9368},  {n:&#8217;Agartala&#8217;,lat:23.8315,lon:91.2868},  {n:&#8217;Aizawl&#8217;,lat:23.7307,lon:92.7173},  {n:&#8217;Dimapur&#8217;,lat:25.9010,lon:93.7360},  {n:&#8217;Udaipur&#8217;,lat:24.5854,lon:73.7125},  {n:&#8217;Alwar&#8217;,lat:27.5530,lon:76.6346},  {n:&#8217;Bharatpur&#8217;,lat:27.2152,lon:77.4938},  {n:&#8217;Pali&#8217;,lat:25.7711,lon:73.3234},  {n:&#8217;Haldwani&#8217;,lat:29.2183,lon:79.5130},  {n:&#8217;Roorkee&#8217;,lat:29.8543,lon:77.8880},  {n:&#8217;Haridwar&#8217;,lat:29.9457,lon:78.1642},  {n:&#8217;Rishikesh&#8217;,lat:30.0869,lon:78.2676},];let cities=[],cur=0,allYatraData=[];let inlineCal=null;let mainProjection=null, dashProjection=null;\/* \u2500\u2500 helper: append a city-name label to a D3 selection \u2500\u2500 *\/function appendCityLabel(sel, px, py, cityName, status, fromSheet) {  const isC = status===&#8217;current&#8217;;  const isV = status===&#8217;visited&#8217;;  const isSheet = !!fromSheet;  \/\/ For current city: animated pulsing label  if(isC){    const lbl = sel.append(&#8216;text&#8217;)      .attr(&#8216;x&#8217;, px)      .attr(&#8216;y&#8217;, py &#8211; 16)      .attr(&#8216;text-anchor&#8217;,&#8217;middle&#8217;)      .attr(&#8216;font-size&#8217;, 11)      .attr(&#8216;font-weight&#8217;,&#8217;800&#8242;)      .attr(&#8216;font-family&#8217;,&#8221;&#8216;Outfit&#8217;,sans-serif&#8221;)      .attr(&#8216;fill&#8217;,&#8217;#e53935&#8242;)      .attr(&#8216;paint-order&#8217;,&#8217;stroke&#8217;)      .attr(&#8216;stroke&#8217;,&#8217;rgba(255,255,255,0.98)&#8217;)      .attr(&#8216;stroke-width&#8217;, 3.5)      .attr(&#8216;stroke-linejoin&#8217;,&#8217;round&#8217;)      .attr(&#8216;pointer-events&#8217;,&#8217;none&#8217;)      .attr(&#8216;letter-spacing&#8217;,&#8217;0.5&#8242;)      .text(cityName);    \/\/ animate label opacity for live pulse effect    function animateLbl(){      lbl.transition().duration(800).attr(&#8216;opacity&#8217;,0.6)        .transition().duration(800).attr(&#8216;opacity&#8217;,1)        .on(&#8216;end&#8217;, animateLbl);    }    animateLbl();    return;  }  \/\/ Sheet-updated cities: orange, slightly bold  if(isSheet){    sel.append(&#8216;text&#8217;)      .attr(&#8216;x&#8217;, px)      .attr(&#8216;y&#8217;, py + 10)      .attr(&#8216;text-anchor&#8217;,&#8217;middle&#8217;)      .attr(&#8216;font-size&#8217;, 6.5)      .attr(&#8216;font-weight&#8217;,&#8217;600&#8242;)      .attr(&#8216;font-family&#8217;,&#8221;&#8216;Outfit&#8217;,sans-serif&#8221;)      .attr(&#8216;fill&#8217;, isV ? &#8216;#cc6600&#8217; : &#8216;#ff8c00&#8217;)      .attr(&#8216;paint-order&#8217;,&#8217;stroke&#8217;)      .attr(&#8216;stroke&#8217;,&#8217;rgba(255,255,255,0.95)&#8217;)      .attr(&#8216;stroke-width&#8217;, 2.5)      .attr(&#8216;stroke-linejoin&#8217;,&#8217;round&#8217;)      .attr(&#8216;pointer-events&#8217;,&#8217;none&#8217;)      .text(cityName);    return;  }  \/\/ GQ route cities (not sheet): small, subtle grey  sel.append(&#8216;text&#8217;)    .attr(&#8216;x&#8217;, px)    .attr(&#8216;y&#8217;, py + 9)    .attr(&#8216;text-anchor&#8217;,&#8217;middle&#8217;)    .attr(&#8216;font-size&#8217;, 6.5)    .attr(&#8216;font-weight&#8217;,&#8217;400&#8242;)    .attr(&#8216;font-family&#8217;,&#8221;&#8216;Outfit&#8217;,sans-serif&#8221;)    .attr(&#8216;fill&#8217;, isV ? &#8216;rgba(26,74,46,0.6)&#8217; : &#8216;rgba(100,70,0,0.5)&#8217;)    .attr(&#8216;paint-order&#8217;,&#8217;stroke&#8217;)    .attr(&#8216;stroke&#8217;,&#8217;rgba(255,255,255,0.85)&#8217;)    .attr(&#8216;stroke-width&#8217;, 2)    .attr(&#8216;stroke-linejoin&#8217;,&#8217;round&#8217;)    .attr(&#8216;pointer-events&#8217;,&#8217;none&#8217;)    .text(cityName);}\/* \u2500\u2500 Animated counter \u2500\u2500 *\/const _cs={};function fmtNum(v){if(v&gt;=10000)return(v\/1000).toFixed(1)+&#8217;K&#8217;;return String(Math.round(v));}function animateCounter(elId,targetNum,unit){  const el=document.getElementById(elId);if(!el)return;  const target=parseFloat(String(targetNum).replace(\/[^0-9.]\/g,&#8221;));  if(isNaN(target))return;  const prev=_cs[elId]||0;if(prev===target){el.textContent=fmtNum(target)+(unit||&#8221;);return;}  _cs[elId]=target;const dur=600,t0=performance.now();  el.classList.remove(&#8216;pop-anim&#8217;);void el.offsetWidth;el.classList.add(&#8216;pop-anim&#8217;);  setTimeout(()=&gt;el.classList.remove(&#8216;pop-anim&#8217;),450);  function step(now){const t=Math.min((now-t0)\/dur,1),e=1-Math.pow(1-t,3),v=prev+(target-prev)*e;el.textContent=fmtNum(v)+(unit||&#8221;);if(t&lt;1)requestAnimationFrame(step);}  requestAnimationFrame(step);}function setCircle(id,pct){  const el=document.getElementById(id);if(!el)return;  const r=27,c=2*Math.PI*r,offset=c-(pct\/100)*c;  el.style.strokeDasharray=c;el.style.strokeDashoffset=offset;}function toISO(d){return`${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,&#8217;0&#8242;)}-${String(d.getDate()).padStart(2,&#8217;0&#8242;)}`;}function todayISO(){return toISO(new Date());}function parseISO(s){if(!s)return null;const d=new Date(s);return isNaN(d)?null:d;}function formatDate(iso){const d=parseISO(iso);return d?d.toLocaleDateString(&#8216;en-IN&#8217;,{day:&#8217;numeric&#8217;,month:&#8217;short&#8217;}):iso;}function dNorm(v){  if(!v)return null;  if(typeof v===&#8217;string&#8217;&amp;&amp;\/^d{4}-d{2}-d{2}$\/.test(v))return v;  try{const d=new Date(v);if(!isNaN(d.getTime()))return`${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,&#8217;0&#8242;)}-${String(d.getDate()).padStart(2,&#8217;0&#8242;)}`;}catch(e){}  return null;}function dFmt(s){const n=dNorm(s);return n?new Date(n).toLocaleDateString(&#8216;en-US&#8217;,{year:&#8217;numeric&#8217;,month:&#8217;long&#8217;,day:&#8217;numeric&#8217;}):s;}function getCurrentIndex(list){  const t=todayISO();if(!list.length)return 0;  if(t&lt;list[0].iso)return 0;if(t&gt;=list[list.length-1].iso)return list.length-1;  let idx=0;for(let i=0;i&lt;list.length;i++){if(list[i].iso&lt;=t)idx=i;}return idx;}function buildCitiesFromSheet(data){  if(!data||!data.length)return null;  const seen={},list=[];  data.forEach(item=&gt;{    const iso=dNorm(item.Date);if(!iso)return;if(seen[iso])return;    const rawCity=(item.City||&#8221;).trim();if(!rawCity)return;    const isBreak=rawCity.toLowerCase()===&#8217;break&#8217;||(item[&#8216;Status&#8217;]||&#8221;).toLowerCase()===&#8217;break&#8217;||(item[&#8216;Type&#8217;]||&#8221;).toLowerCase()===&#8217;break&#8217;;    let lat=parseFloat(item.Latitude),lon=parseFloat(item.Longitude);    if(isNaN(lat)||isNaN(lon)){      if(isBreak){const p=list[list.length-1];if(!p)return;lat=p.lat;lon=p.lon;}      else{const gq=GQ_MAP[rawCity.toLowerCase()];if(!gq)return;lat=gq.lat;lon=gq.lon;}    }    seen[iso]=true;    list.push({name:isBreak?&#8217;Break&#8217;:rawCity,lat,lon,iso,dateStr:formatDate(iso),isBreak,_fromSheet:true});  });  if(!list.length)return null;  list.sort((a,b)=&gt;a.iso.localeCompare(b.iso));  const s=parseISO(list[0].iso);  list.forEach((c,i)=&gt;{const d=parseISO(c.iso);c.day=s&amp;&amp;d?Math.round((d-s)\/86400000)+1:i+1;c.idx=i;});  return list;}function buildCitiesFromGQ(){  const S=new Date(&#8216;2026-05-13&#8217;),T=100,step=T\/(GQ_ROUTE.length-1);  return GQ_ROUTE.map((c,i)=&gt;{    const dn=Math.round(i*step)+1,d=new Date(S);d.setDate(d.getDate()+dn-1);    const iso=toISO(d);return{&#8230;c,day:dn,iso,dateStr:formatDate(iso),idx:i};  });}const INDIA_GEOJSON_URL = &#8216;https:\/\/cdn.jsdelivr.net\/gh\/udit-001\/india-maps-data@ef25ebc\/geojson\/india.geojson&#8217;;let indiaGeoJSON = null;async function loadIndiaGeoJSON() {  if (indiaGeoJSON) return indiaGeoJSON;  try {    const res = await fetch(INDIA_GEOJSON_URL);    const data = await res.json();    indiaGeoJSON = data;    return indiaGeoJSON;  } catch(e) {    console.warn(&#8216;Primary GeoJSON failed, trying fallback:&#8217;, e);    try {      const fallbackRes = await fetch(&#8216;https:\/\/raw.githubusercontent.com\/datasets\/geo-countries\/master\/data\/countries.geojson&#8217;);      const fallbackData = await fallbackRes.json();      indiaGeoJSON = {        type: &#8216;FeatureCollection&#8217;,        features: fallbackData.features.filter(f =&gt;          (f.properties.ADMIN === &#8216;India&#8217; || f.properties.ISO_A3 === &#8216;IND&#8217;)        )      };      return indiaGeoJSON;    } catch(fbErr) {      console.error(&#8216;All GeoJSON sources failed:&#8217;, fbErr);      return null;    }  }}function makeProjection(svgEl) {  const rect = svgEl.getBoundingClientRect();  const W = rect.width || svgEl.parentElement.clientWidth || 500;  const H = rect.height || svgEl.parentElement.clientHeight || 500;  const proj = d3.geoMercator().center([82.5, 22]).scale(1).translate([W\/2, H\/2]);  const topLeft = proj([68.0, 37.5]);  const bottomRight = proj([97.5, 6.5]);  const kX = (W * 0.92) \/ (bottomRight[0] &#8211; topLeft[0]);  const kY = (H * 0.92) \/ (bottomRight[1] &#8211; topLeft[1]);  const k = Math.min(kX, kY);  proj.scale(k);  const c = proj([82.5, 22]);  proj.translate([W\/2 + (W\/2 &#8211; c[0]), H\/2 + (H\/2 &#8211; c[1])]);  return proj;}function latLonToXY(proj, lat, lon) {  const pt = proj([lon, lat]);  return pt ? {x: pt[0], y: pt[1]} : null;}\/* \u2500\u2500 renderD3Map \u2014 used by dashboard map \u2500\u2500 *\/function renderD3Map(svgId, tooltipId, citiesList, currentIdx, extraPoints) {  const svgEl = document.getElementById(svgId);  if (!svgEl) return;  const svg = d3.select(&#8216;#&#8217;+svgId);  svg.selectAll(&#8216;*&#8217;).remove();  const rect = svgEl.getBoundingClientRect();  const W = rect.width || svgEl.parentElement.clientWidth || 500;  const H = rect.height || svgEl.parentElement.clientHeight || 500;  svg.attr(&#8216;viewBox&#8217;, `0 0 ${W} ${H}`);  const proj = makeProjection(svgEl);  if (svgId === &#8216;main-map-svg&#8217;) mainProjection = proj;  else dashProjection = proj;  const pathGen = d3.geoPath().projection(proj);  const tooltip = document.getElementById(tooltipId);  svg.append(&#8216;rect&#8217;).attr(&#8216;width&#8217;,W).attr(&#8216;height&#8217;,H).attr(&#8216;fill&#8217;,&#8217;#b8d4e8&#8242;);  if (indiaGeoJSON &amp;&amp; indiaGeoJSON.features &amp;&amp; indiaGeoJSON.features.length) {    svg.selectAll(&#8216;.india-path&#8217;)      .data(indiaGeoJSON.features)      .enter().append(&#8216;path&#8217;)      .attr(&#8216;class&#8217;,&#8217;india-path&#8217;)      .attr(&#8216;d&#8217;, pathGen)      .attr(&#8216;fill&#8217;,&#8217;#d4ebd4&#8242;)      .attr(&#8216;stroke&#8217;,&#8217;#5a9a6a&#8217;)      .attr(&#8216;stroke-width&#8217;, 1.0);  } else {    svg.append(&#8216;rect&#8217;).attr(&#8216;x&#8217;,W*0.05).attr(&#8216;y&#8217;,H*0.05).attr(&#8216;width&#8217;,W*0.9).attr(&#8216;height&#8217;,H*0.9)      .attr(&#8216;rx&#8217;,8).attr(&#8216;fill&#8217;,&#8217;#d4ebd4&#8242;).attr(&#8216;stroke&#8217;,&#8217;#5a9a6a&#8217;).attr(&#8216;stroke-width&#8217;,1.5);    svg.append(&#8216;text&#8217;).attr(&#8216;x&#8217;,W\/2).attr(&#8216;y&#8217;,H\/2).attr(&#8216;text-anchor&#8217;,&#8217;middle&#8217;)      .attr(&#8216;fill&#8217;,&#8217;#5a9a6a&#8217;).attr(&#8216;font-size&#8217;,13).attr(&#8216;font-family&#8217;,&#8217;Outfit,sans-serif&#8217;)      .text(&#8216;India Map Loading&#8230;&#8217;);  }  function cityPt(c){ return latLonToXY(proj, c.lat, c.lon); }  const donePts = [];  for(let i=0; i&lt;=currentIdx; i++){    const p = cityPt(citiesList[i]);    if(p &amp;&amp; (donePts.length===0 || donePts[donePts.length-1][0]!==p.x || donePts[donePts.length-1][1]!==p.y))      donePts.push([p.x, p.y]);  }  if(donePts.length&gt;1){    svg.append(&#8216;polyline&#8217;)      .attr(&#8216;points&#8217;, donePts.map(p=&gt;p.join(&#8216;,&#8217;)).join(&#8216; &#8216;))      .attr(&#8216;fill&#8217;,&#8217;none&#8217;).attr(&#8216;stroke&#8217;,&#8217;#2d7a4a&#8217;).attr(&#8216;stroke-width&#8217;,2.8)      .attr(&#8216;stroke-linejoin&#8217;,&#8217;round&#8217;).attr(&#8216;stroke-linecap&#8217;,&#8217;round&#8217;).attr(&#8216;opacity&#8217;,0.95);  }  const upPts = [];  for(let i=currentIdx; i&lt;citiesList.length; i++){    const p = cityPt(citiesList[i]);    if(p &amp;&amp; (upPts.length===0 || upPts[upPts.length-1][0]!==p.x || upPts[upPts.length-1][1]!==p.y))      upPts.push([p.x, p.y]);  }  if(upPts.length&gt;1){    svg.append(&#8216;polyline&#8217;)      .attr(&#8216;points&#8217;, upPts.map(p=&gt;p.join(&#8216;,&#8217;)).join(&#8216; &#8216;))      .attr(&#8216;fill&#8217;,&#8217;none&#8217;).attr(&#8216;stroke&#8217;,&#8217;rgba(255,160,60,0.55)&#8217;).attr(&#8216;stroke-width&#8217;,2)      .attr(&#8216;stroke-dasharray&#8217;,&#8217;7 5&#8242;).attr(&#8216;stroke-linecap&#8217;,&#8217;round&#8217;).attr(&#8216;opacity&#8217;,0.9);  }  citiesList.forEach((c,i)=&gt;{    const p = cityPt(c);    if(!p) return;    const st = i&lt;currentIdx?&#8217;visited&#8217;:i===currentIdx?&#8217;current&#8217;:&#8217;upcoming&#8217;;    const g = svg.append(&#8216;g&#8217;).attr(&#8216;class&#8217;,&#8217;city-marker&#8217;).attr(&#8216;cursor&#8217;,&#8217;default&#8217;);    if(st===&#8217;current&#8217;){      g.append(&#8216;circle&#8217;).attr(&#8216;cx&#8217;,p.x).attr(&#8216;cy&#8217;,p.y).attr(&#8216;r&#8217;,11).attr(&#8216;fill&#8217;,&#8217;rgba(255,102,0,0.20)&#8217;).attr(&#8216;stroke&#8217;,&#8217;none&#8217;);      g.append(&#8216;circle&#8217;).attr(&#8216;cx&#8217;,p.x).attr(&#8216;cy&#8217;,p.y).attr(&#8216;r&#8217;,7).attr(&#8216;fill&#8217;,&#8217;#ff6600&#8242;).attr(&#8216;stroke&#8217;,&#8217;#fff&#8217;).attr(&#8216;stroke-width&#8217;,2);    } else if(st===&#8217;visited&#8217;){      g.append(&#8216;circle&#8217;).attr(&#8216;cx&#8217;,p.x).attr(&#8216;cy&#8217;,p.y).attr(&#8216;r&#8217;,4).attr(&#8216;fill&#8217;,&#8217;#2d7a4a&#8217;).attr(&#8216;stroke&#8217;,&#8217;#4CAF7D&#8217;).attr(&#8216;stroke-width&#8217;,1.5);    } else {      g.append(&#8216;circle&#8217;).attr(&#8216;cx&#8217;,p.x).attr(&#8216;cy&#8217;,p.y).attr(&#8216;r&#8217;,3.5).attr(&#8216;fill&#8217;,&#8217;#ff9933&#8242;).attr(&#8216;stroke&#8217;,&#8217;#fff&#8217;).attr(&#8216;stroke-width&#8217;,1);    }    \/* \u2500\u2500 city name label \u2500\u2500 *\/    appendCityLabel(g, p.x, p.y, c.name, st, c._fromSheet||false);    g.on(&#8216;mouseenter&#8217;, (evt)=&gt;{      tooltip.innerHTML=`&lt;strong&gt;${c.name}&lt;\/strong&gt;&lt;br&gt;${c.dateStr}, 2026 \u00b7 Day ${c.day}`;      tooltip.style.opacity=&#8217;1&#8242;;    }).on(&#8216;mousemove&#8217;,(evt)=&gt;{      const wrap = svgEl.parentElement.getBoundingClientRect();      let tx = evt.clientX &#8211; wrap.left + 12;      let ty = evt.clientY &#8211; wrap.top &#8211; 10;      if(tx + 180 &gt; wrap.width) tx = tx &#8211; 190;      tooltip.style.left=tx+&#8217;px&#8217;;tooltip.style.top=ty+&#8217;px&#8217;;    }).on(&#8216;mouseleave&#8217;,()=&gt;{ tooltip.style.opacity=&#8217;0&#8242;; });  });  if(extraPoints){    extraPoints.forEach(ep=&gt;{      const p = latLonToXY(proj, ep.lat, ep.lon);      if(!p) return;      svg.append(&#8216;circle&#8217;).attr(&#8216;cx&#8217;,p.x).attr(&#8216;cy&#8217;,p.y).attr(&#8216;r&#8217;,5)        .attr(&#8216;fill&#8217;,ep.color||&#8217;#e07030&#8242;).attr(&#8216;stroke&#8217;,&#8217;#fff&#8217;).attr(&#8216;stroke-width&#8217;,1.5).attr(&#8216;opacity&#8217;,0.85);    });  }  if(svgId===&#8217;main-map-svg&#8217; &amp;&amp; citiesList[currentIdx]){    document.getElementById(&#8216;map-badge-city&#8217;).textContent = citiesList[currentIdx].name;  }}\/* \u2500\u2500 renderMainMapWithZoom \u2014 main live map with D3 zoom \u2500\u2500 *\/let zoomBehavior = null;function renderMainMapWithZoom(){  const svgEl = document.getElementById(&#8216;main-map-svg&#8217;);  if(!svgEl) return;  const svg = d3.select(&#8216;#main-map-svg&#8217;);  svg.selectAll(&#8216;*&#8217;).remove();  const rect = svgEl.getBoundingClientRect();  const W = rect.width || svgEl.parentElement.clientWidth || 500;  const H = rect.height || svgEl.parentElement.clientHeight || 500;  svg.attr(&#8216;viewBox&#8217;,`0 0 ${W} ${H}`);  const proj = makeProjection(svgEl);  mainProjection = proj;  const pathGen = d3.geoPath().projection(proj);  const tooltip = document.getElementById(&#8216;map-tooltip&#8217;);  const root = svg.append(&#8216;g&#8217;).attr(&#8216;id&#8217;,&#8217;zoom-root&#8217;);  root.append(&#8216;rect&#8217;).attr(&#8216;width&#8217;,W).attr(&#8216;height&#8217;,H).attr(&#8216;fill&#8217;,&#8217;#b8d4e8&#8242;);  if (indiaGeoJSON &amp;&amp; indiaGeoJSON.features &amp;&amp; indiaGeoJSON.features.length) {    root.selectAll(&#8216;.india-path&#8217;)      .data(indiaGeoJSON.features)      .enter().append(&#8216;path&#8217;)      .attr(&#8216;class&#8217;,&#8217;india-path&#8217;)      .attr(&#8216;d&#8217;,pathGen)      .attr(&#8216;fill&#8217;,&#8217;#d4ebd4&#8242;)      .attr(&#8216;stroke&#8217;,&#8217;#5a9a6a&#8217;)      .attr(&#8216;stroke-width&#8217;, 1.0);  }  \/* \u2500\u2500 Background India cities layer \u2500\u2500 *\/  const yataCityNames = new Set(cities.map(c=&gt;c.name.toLowerCase()));  INDIA_BG_CITIES.forEach(bc=&gt;{    if(yataCityNames.has(bc.n.toLowerCase())) return; \/\/ skip if already on yatra route    const pt = proj([bc.lon, bc.lat]);    if(!pt) return;    const bx=pt[0], by=pt[1];    const bg = root.append(&#8216;g&#8217;).attr(&#8216;pointer-events&#8217;,&#8217;none&#8217;);    \/\/ dot    bg.append(&#8216;circle&#8217;).attr(&#8216;cx&#8217;,bx).attr(&#8216;cy&#8217;,by)      .attr(&#8216;r&#8217;, bc.cap ? 2 : 1.5)      .attr(&#8216;fill&#8217;, bc.cap ? &#8216;#aaa&#8217; : &#8216;#bbb&#8217;)      .attr(&#8216;stroke&#8217;,&#8217;rgba(255,255,255,0.6)&#8217;)      .attr(&#8216;stroke-width&#8217;, 0.7);    \/\/ label    bg.append(&#8216;text&#8217;)      .attr(&#8216;x&#8217;, bx).attr(&#8216;y&#8217;, by &#8211; 3)      .attr(&#8216;text-anchor&#8217;,&#8217;middle&#8217;)      .attr(&#8216;font-size&#8217;, bc.cap ? 5.5 : 5)      .attr(&#8216;font-weight&#8217;, bc.cap ? &#8216;500&#8217; : &#8216;400&#8217;)      .attr(&#8216;font-family&#8217;,&#8221;&#8216;Outfit&#8217;,sans-serif&#8221;)      .attr(&#8216;fill&#8217;, bc.cap ? &#8216;rgba(80,80,80,0.75)&#8217; : &#8216;rgba(110,110,110,0.6)&#8217;)      .attr(&#8216;paint-order&#8217;,&#8217;stroke&#8217;)      .attr(&#8216;stroke&#8217;,&#8217;rgba(255,255,255,0.8)&#8217;)      .attr(&#8216;stroke-width&#8217;, 1.8)      .attr(&#8216;stroke-linejoin&#8217;,&#8217;round&#8217;)      .text(bc.n);  });  function cityPt(c){ const pt=proj([c.lon,c.lat]); return pt?{x:pt[0],y:pt[1]}:null; }  const donePts=[];  for(let i=0;i&lt;=cur;i++){    const p=cityPt(cities[i]);    if(p&amp;&amp;(donePts.length===0||donePts[donePts.length-1][0]!==p.x||donePts[donePts.length-1][1]!==p.y))      donePts.push([p.x,p.y]);  }  if(donePts.length&gt;1){    const doneLineEl = root.append(&#8216;polyline&#8217;)      .attr(&#8216;points&#8217;,donePts.map(p=&gt;p.join(&#8216;,&#8217;)).join(&#8216; &#8216;))      .attr(&#8216;fill&#8217;,&#8217;none&#8217;).attr(&#8216;stroke&#8217;,&#8217;#1db954&#8242;).attr(&#8216;stroke-width&#8217;,4)      .attr(&#8216;stroke-linejoin&#8217;,&#8217;round&#8217;).attr(&#8216;stroke-linecap&#8217;,&#8217;round&#8217;).attr(&#8216;opacity&#8217;,1);    let totalLen = 0;    for(let i=1;i&lt;donePts.length;i++){      const dx=donePts[i][0]-donePts[i-1][0], dy=donePts[i][1]-donePts[i-1][1];      totalLen += Math.sqrt(dx*dx+dy*dy);    }    doneLineEl.attr(&#8216;stroke-dasharray&#8217;, totalLen+&#8217; &#8216;+totalLen)      .attr(&#8216;stroke-dashoffset&#8217;, totalLen);    doneLineEl.transition().duration(1800).ease(d3.easeCubicInOut)      .attr(&#8216;stroke-dashoffset&#8217;, 0);  }  const upPts=[];  for(let i=cur;i&lt;cities.length;i++){    const p=cityPt(cities[i]);    if(p&amp;&amp;(upPts.length===0||upPts[upPts.length-1][0]!==p.x||upPts[upPts.length-1][1]!==p.y))      upPts.push([p.x,p.y]);  }  if(upPts.length&gt;1)    root.append(&#8216;polyline&#8217;).attr(&#8216;points&#8217;,upPts.map(p=&gt;p.join(&#8216;,&#8217;)).join(&#8216; &#8216;))      .attr(&#8216;fill&#8217;,&#8217;none&#8217;).attr(&#8216;stroke&#8217;,&#8217;#ff8c00&#8242;).attr(&#8216;stroke-width&#8217;,2.5)      .attr(&#8216;stroke-dasharray&#8217;,&#8217;8 5&#8242;).attr(&#8216;stroke-linecap&#8217;,&#8217;round&#8217;).attr(&#8216;opacity&#8217;,0.85);  cities.forEach((c,i)=&gt;{    const p=cityPt(c); if(!p) return;    const st=i&lt;cur?&#8217;visited&#8217;:i===cur?&#8217;current&#8217;:&#8217;upcoming&#8217;;    const fromSheet = c._fromSheet || false;    const g=root.append(&#8216;g&#8217;).attr(&#8216;cursor&#8217;,&#8217;default&#8217;);    if(st===&#8217;current&#8217;){      const outerRing = g.append(&#8216;circle&#8217;).attr(&#8216;cx&#8217;,p.x).attr(&#8216;cy&#8217;,p.y).attr(&#8216;r&#8217;,14)        .attr(&#8216;fill&#8217;,&#8217;rgba(229,57,53,0.18)&#8217;).attr(&#8216;stroke&#8217;,&#8217;rgba(229,57,53,0.4)&#8217;).attr(&#8216;stroke-width&#8217;,1.5);      function pulseRing(){        outerRing.transition().duration(900).attr(&#8216;r&#8217;,18).attr(&#8216;opacity&#8217;,0.1)          .transition().duration(900).attr(&#8216;r&#8217;,14).attr(&#8216;opacity&#8217;,1)          .on(&#8216;end&#8217;,pulseRing);      }      pulseRing();      g.append(&#8216;circle&#8217;).attr(&#8216;cx&#8217;,p.x).attr(&#8216;cy&#8217;,p.y).attr(&#8216;r&#8217;,7)        .attr(&#8216;fill&#8217;,&#8217;#e53935&#8242;).attr(&#8216;stroke&#8217;,&#8217;#fff&#8217;).attr(&#8216;stroke-width&#8217;,2.2);      g.append(&#8216;circle&#8217;).attr(&#8216;cx&#8217;,p.x).attr(&#8216;cy&#8217;,p.y).attr(&#8216;r&#8217;,2.5).attr(&#8216;fill&#8217;,&#8217;#fff&#8217;);    } else if(st===&#8217;visited&#8217;){      g.append(&#8216;circle&#8217;).attr(&#8216;cx&#8217;,p.x).attr(&#8216;cy&#8217;,p.y).attr(&#8216;r&#8217;,3.8).attr(&#8216;fill&#8217;,&#8217;#27ae60&#8242;).attr(&#8216;stroke&#8217;,&#8217;#4CAF7D&#8217;).attr(&#8216;stroke-width&#8217;,1.5);    } else {      g.append(&#8216;circle&#8217;).attr(&#8216;cx&#8217;,p.x).attr(&#8216;cy&#8217;,p.y).attr(&#8216;r&#8217;,3).attr(&#8216;fill&#8217;,&#8217;#ff9933&#8242;).attr(&#8216;stroke&#8217;,&#8217;#fff&#8217;).attr(&#8216;stroke-width&#8217;,1);    }    \/* \u2500\u2500 city name label on main live map \u2500\u2500 *\/    appendCityLabel(g, p.x, p.y, c.name, st, fromSheet);    g.append(&#8216;rect&#8217;).attr(&#8216;x&#8217;,p.x-12).attr(&#8216;y&#8217;,p.y-12).attr(&#8216;width&#8217;,24).attr(&#8216;height&#8217;,24).attr(&#8216;fill&#8217;,&#8217;transparent&#8217;)      .on(&#8216;mouseenter&#8217;,(evt)=&gt;{        tooltip.innerHTML=`&lt;strong&gt;${c.name}&lt;\/strong&gt;&lt;br&gt;${c.dateStr}, 2026 \u00b7 Day ${c.day}`;        tooltip.style.opacity=&#8217;1&#8242;;      })      .on(&#8216;mousemove&#8217;,(evt)=&gt;{        const wrap=svgEl.parentElement.getBoundingClientRect();        let tx=evt.clientX-wrap.left+12, ty=evt.clientY-wrap.top-10;        if(tx+180&gt;wrap.width) tx=tx-190;        tooltip.style.left=tx+&#8217;px&#8217;; tooltip.style.top=ty+&#8217;px&#8217;;      })      .on(&#8216;mouseleave&#8217;,()=&gt;tooltip.style.opacity=&#8217;0&#8242;)      .on(&#8216;click&#8217;,()=&gt;{        if(!zoomBehavior) return;        const s=3.2;        d3.select(&#8216;#main-map-svg&#8217;).transition().duration(600).call(          zoomBehavior.transform,          d3.zoomIdentity.translate(W\/2,H\/2).scale(s).translate(-p.x,-p.y)        );      });  });  const cc=cities[cur];  if(cc){    document.getElementById(&#8216;map-badge-city&#8217;).textContent=cc.name;  }  if(!zoomBehavior){    zoomBehavior=d3.zoom().scaleExtent([0.7, 10]).on(&#8216;zoom&#8217;,(evt)=&gt;{      root.attr(&#8216;transform&#8217;,evt.transform);    });  } else {    zoomBehavior.on(&#8216;zoom&#8217;,(evt)=&gt;root.attr(&#8216;transform&#8217;,evt.transform));  }  svg.call(zoomBehavior);  svg.append(&#8216;rect&#8217;).attr(&#8216;x&#8217;,W-46).attr(&#8216;y&#8217;,10).attr(&#8216;width&#8217;,36).attr(&#8216;height&#8217;,70).attr(&#8216;rx&#8217;,8)    .attr(&#8216;fill&#8217;,&#8217;rgba(10,40,20,0.75)&#8217;).attr(&#8216;stroke&#8217;,&#8217;rgba(255,255,255,0.2)&#8217;).attr(&#8216;stroke-width&#8217;,1);  svg.append(&#8216;text&#8217;).attr(&#8216;x&#8217;,W-28).attr(&#8216;y&#8217;,34).attr(&#8216;text-anchor&#8217;,&#8217;middle&#8217;)    .attr(&#8216;fill&#8217;,&#8217;#fff&#8217;).attr(&#8216;font-size&#8217;,18).attr(&#8216;font-family&#8217;,&#8217;sans-serif&#8217;).attr(&#8216;cursor&#8217;,&#8217;pointer&#8217;)    .text(&#8216;+&#8217;).on(&#8216;click&#8217;,()=&gt;svg.transition().duration(300).call(zoomBehavior.scaleBy,1.5));  svg.append(&#8216;line&#8217;).attr(&#8216;x1&#8217;,W-44).attr(&#8216;x2&#8217;,W-12).attr(&#8216;y1&#8217;,45).attr(&#8216;y2&#8217;,45)    .attr(&#8216;stroke&#8217;,&#8217;rgba(255,255,255,0.25)&#8217;).attr(&#8216;stroke-width&#8217;,1);  svg.append(&#8216;text&#8217;).attr(&#8216;x&#8217;,W-28).attr(&#8216;y&#8217;,63).attr(&#8216;text-anchor&#8217;,&#8217;middle&#8217;)    .attr(&#8216;fill&#8217;,&#8217;#fff&#8217;).attr(&#8216;font-size&#8217;,18).attr(&#8216;font-family&#8217;,&#8217;sans-serif&#8217;).attr(&#8216;cursor&#8217;,&#8217;pointer&#8217;)    .text(&#8216;\u2212&#8217;).on(&#8216;click&#8217;,()=&gt;svg.transition().duration(300).call(zoomBehavior.scaleBy,0.67));}function renderDashMap(data){  const svgEl=document.getElementById(&#8216;d-map-svg&#8217;);if(!svgEl)return;  const today=todayISO();  const pts=[];  data.forEach(item=&gt;{    const iso=dNorm(item.Date);if(!iso)return;    const cn=(item.City||&#8221;).trim();if(!cn)return;    let la=parseFloat(item.Latitude),lo=parseFloat(item.Longitude);    if(isNaN(la)||isNaN(lo)){const gq=GQ_MAP[cn.toLowerCase()];if(!gq)return;la=gq.lat;lo=gq.lon;}    let color=iso&lt;today?&#8217;#aaa&#8217;:iso===today?&#8217;#e53935&#8242;:&#8217;#e07030&#8242;;    pts.push({lat:la,lon:lo,name:cn,iso,color,current:iso===today});  });  renderD3Map(&#8216;d-map-svg&#8217;,&#8217;d-map-tooltip&#8217;,cities,cur,pts);}function haversineKm(a,b){  const R=6371,dLat=(b.lat-a.lat)*Math.PI\/180,dLon=(b.lon-a.lon)*Math.PI\/180;  const s=Math.sin(dLat\/2)**2+Math.cos(a.lat*Math.PI\/180)*Math.cos(b.lat*Math.PI\/180)*Math.sin(dLon\/2)**2;  return R*2*Math.atan2(Math.sqrt(s),Math.sqrt(1-s));}function updateSidebar(){  if(!cities.length)return;  const c=cities[cur],nxt=cur&lt;cities.length-1?cities[cur+1]:null;  const pct=Math.round((cur\/(cities.length-1))*100);  const daysDone=Math.max(0,c.day-1);  const daysLeft=Math.max(0,100-c.day+1);  let kmDone=0;for(let i=0;i&lt;cur;i++)kmDone+=haversineKm(cities[i],cities[i+1]);  kmDone=Math.round(kmDone);  let peopleMet=0;  const today=todayISO();  if(allYatraData&amp;&amp;allYatraData.length){    allYatraData.forEach(item=&gt;{      const iso=dNorm(item.Date);if(!iso||iso&gt;today)return;      const keys=Object.keys(item);const pk=keys.find(k=&gt;\/people\/i.test(k));      if(pk){const n=parseInt(String(item[pk]||&#8217;0&#8242;).replace(\/,\/g,&#8221;),10);if(!isNaN(n))peopleMet+=n;}    });  }  if(peopleMet===0&amp;&amp;window.statsData&amp;&amp;window.statsData.totalPeople) peopleMet=window.statsData.totalPeople;  document.getElementById(&#8216;hdr-day&#8217;).textContent=`Day ${c.day} of 100`;  document.getElementById(&#8216;sb-city&#8217;).textContent=c.isBreak?`${c.name} \u2014 Rest Day`:c.name;  document.getElementById(&#8216;sb-date&#8217;).textContent=`${c.dateStr}, 2026 \u00b7 Day ${c.day}`;  document.getElementById(&#8216;day-pill&#8217;).textContent=`Day ${c.day}`;  const badge=document.getElementById(&#8216;live-badge&#8217;);  if(c.isBreak){badge.classList.add(&#8216;on-break&#8217;);document.getElementById(&#8216;live-txt&#8217;).textContent=&#8217;BREAK&#8217;;}  else{badge.classList.remove(&#8216;on-break&#8217;);document.getElementById(&#8216;live-txt&#8217;).textContent=&#8217;LIVE&#8217;;}  if(nxt){document.getElementById(&#8216;sb-next&#8217;).textContent=nxt.name;document.getElementById(&#8216;sb-next-when&#8217;).textContent=nxt.dateStr+&#8217;, 2026&#8242;;}  else{document.getElementById(&#8216;sb-next&#8217;).textContent=&#8217;Yatra Sampurna&#8217;;document.getElementById(&#8216;sb-next-when&#8217;).textContent=&#8217;\u2726 100 Days Complete \u2726&#8217;;}  document.getElementById(&#8216;prog-fill&#8217;).style.width=Math.max(1,pct)+&#8217;%&#8217;;  document.getElementById(&#8216;prog-txt&#8217;).textContent=pct+&#8217;% complete&#8217;;  animateCounter(&#8216;stat-done2&#8217;,daysDone);animateCounter(&#8216;stat-left2&#8217;,daysLeft);  animateCounter(&#8216;stat-people2&#8217;,peopleMet);animateCounter(&#8216;stat-km2&#8242;,kmDone,&#8217; km&#8217;);  setCircle(&#8216;circ-done2&#8217;,Math.round((daysDone\/100)*100));setCircle(&#8216;circ-left2&#8217;,Math.round((daysLeft\/100)*100));}function buildList(){  const list=document.getElementById(&#8216;rlist&#8217;);list.innerHTML=&#8221;;  cities.forEach((c,i)=&gt;{    const st=i&lt;cur?&#8217;visited&#8217;:i===cur?&#8217;current&#8217;:&#8217;upcoming&#8217;;    const item=document.createElement(&#8216;div&#8217;);item.className=&#8217;ritem&#8217;;    item.onclick=()=&gt;{      if(mainProjection &amp;&amp; zoomBehavior){        const pt=mainProjection([c.lon,c.lat]);        if(pt){          const svgEl=document.getElementById(&#8216;main-map-svg&#8217;);          const W=svgEl.getBoundingClientRect().width;          const H=svgEl.getBoundingClientRect().height;          d3.select(&#8216;#main-map-svg&#8217;).transition().duration(600).call(            zoomBehavior.transform,            d3.zoomIdentity.translate(W\/2,H\/2).scale(3.2).translate(-pt[0],-pt[1])          );        }      }    };    const dw=document.createElement(&#8216;div&#8217;);dw.className=&#8217;rdot-wrap&#8217;;    const dot=document.createElement(&#8216;div&#8217;);dot.className=&#8217;rdot &#8216;+(c.isBreak&amp;&amp;st===&#8217;current&#8217;?&#8217;break&#8217;:st);    dw.appendChild(dot);    if(i&lt;cities.length-1){const ln=document.createElement(&#8216;div&#8217;);ln.className=&#8217;rconnect&#8217;;dw.appendChild(ln);}    const nm=document.createElement(&#8216;div&#8217;);nm.className=&#8217;rname &#8216;+st;nm.textContent=c.name;    if(st===&#8217;current&#8217;&amp;&amp;c.isBreak){const t=document.createElement(&#8216;span&#8217;);t.className=&#8217;tag-break&#8217;;t.textContent=&#8217;BREAK&#8217;;nm.appendChild(t);}    else if(st===&#8217;current&#8217;){const t=document.createElement(&#8216;span&#8217;);t.className=&#8217;tag-live&#8217;;t.textContent=&#8217;LIVE&#8217;;nm.appendChild(t);}    if(st===&#8217;upcoming&#8217;&amp;&amp;i===cur+1){const t=document.createElement(&#8216;span&#8217;);t.className=&#8217;tag-next&#8217;;t.textContent=&#8217;NEXT&#8217;;nm.appendChild(t);}    const info=document.createElement(&#8216;div&#8217;);info.style.flex=&#8217;1&#8242;;info.style.overflow=&#8217;hidden&#8217;;info.appendChild(nm);    const dt=document.createElement(&#8216;div&#8217;);dt.className=&#8217;rdate&#8217;;dt.textContent=c.dateStr;    item.appendChild(dw);item.appendChild(info);item.appendChild(dt);list.appendChild(item);  });  const items=list.querySelectorAll(&#8216;.ritem&#8217;);  if(items[cur])setTimeout(()=&gt;{const el=items[cur];const container=el.closest(&#8216;.rlist&#8217;);if(container){container.scrollTop=el.offsetTop-container.offsetTop-40;}},200);}function showCalEvtPopup(dateStr){  const nd=dNorm(dateStr);  const body=document.getElementById(&#8216;cal-evt-body&#8217;);  const title=document.getElementById(&#8216;cal-evt-title&#8217;);  const ev=allYatraData.find(item=&gt;dNorm(item.Date)===nd);  if(ev){    title.textContent=ev[&#8216;Event Name&#8217;]||ev.City||&#8217;Event Details&#8217;;    body.innerHTML=`      &lt;div&gt;&lt;span&gt;City&lt;\/span&gt;&lt;div&gt;${ev.City||&#8217;N\/A&#8217;}&lt;\/div&gt;&lt;\/div&gt;      &lt;div&gt;&lt;span&gt;Date&lt;\/span&gt;&lt;div&gt;${dFmt(ev.Date)}&lt;\/div&gt;&lt;\/div&gt;      ${ev[&#8216;Event Name&#8217;]?`&lt;div&gt;&lt;span&gt;Event&lt;\/span&gt;&lt;div&gt;${ev[&#8216;Event Name&#8217;]}&lt;\/div&gt;&lt;\/div&gt;`:&#8221;}      ${ev.Host?`&lt;div&gt;&lt;span&gt;Hosted By&lt;\/span&gt;&lt;div&gt;${ev.Host}&lt;\/div&gt;&lt;\/div&gt;`:&#8221;}      ${ev.Venue?`&lt;div&gt;&lt;span&gt;Venue&lt;\/span&gt;&lt;div&gt;${ev.Venue}&lt;\/div&gt;&lt;\/div&gt;`:&#8221;}      ${(ev.Time!==undefined&amp;&amp;ev.Time!==null&amp;&amp;ev.Time!==&#8221;)?`&lt;div&gt;&lt;span&gt;Time&lt;\/span&gt;&lt;div&gt;${fmtTime(ev.Time)}&lt;\/div&gt;&lt;\/div&gt;`:&#8221;}      ${ev[&#8216;Short Description&#8217;]?`&lt;div&gt;&lt;span&gt;Description&lt;\/span&gt;&lt;div&gt;${ev[&#8216;Short Description&#8217;]}&lt;\/div&gt;&lt;\/div&gt;`:&#8221;}    `;  } else {    const dateObj=parseISO(nd),start=parseISO(&#8216;2026-05-13&#8217;),end=parseISO(&#8216;2026-08-20&#8242;);    title.textContent=nd?dFmt(nd):&#8217;No Event&#8217;;    if(dateObj&amp;&amp;start&amp;&amp;end&amp;&amp;dateObj&gt;=start&amp;&amp;dateObj&lt;=end){      const city=cities.find(c=&gt;c.iso===nd);      body.innerHTML=city        ?`&lt;div&gt;&lt;span&gt;Location&lt;\/span&gt;&lt;div&gt;${city.name}&lt;\/div&gt;&lt;\/div&gt;&lt;div&gt;&lt;span&gt;Day&lt;\/span&gt;&lt;div&gt;Day ${city.day} of 100&lt;\/div&gt;&lt;\/div&gt;&lt;div style=&#8221;padding-top:8px&#8221;&gt;No specific event scheduled&lt;\/div&gt;`        :`&lt;div&gt;No event scheduled for this date&lt;\/div&gt;`;    } else {      body.innerHTML=`&lt;div&gt;No Yatra event on this date&lt;\/div&gt;`;    }  }  document.getElementById(&#8216;cal-evt-overlay&#8217;).classList.add(&#8216;show&#8217;);  \/\/ expand iframe to full viewport so fixed overlay covers everything  document.documentElement.style.height=&#8217;100vh&#8217;;  document.body.style.height=&#8217;100vh&#8217;;  document.body.style.overflow=&#8217;hidden&#8217;;  try{    var iframes=window.top.document.querySelectorAll(&#8216;iframe&#8217;);    iframes.forEach(function(f){      if(f.contentWindow===window){        f._origHeight=f._origHeight||f.style.height;        f._origPos=f._origPos||f.style.position;        f.style.cssText=&#8217;height:&#8217;+window.top.innerHeight+&#8217;px !important;position:fixed !important;top:0 !important;left:0 !important;width:100% !important;z-index:99999 !important;margin:0 !important;&#8217;;      }    });  }catch(e){}}function closeCalEvt(){  document.getElementById(&#8216;cal-evt-overlay&#8217;).classList.remove(&#8216;show&#8217;);  document.documentElement.style.height=&#8221;;  document.body.style.height=&#8221;;  document.body.style.overflow=&#8221;;  try{    var iframes=window.top.document.querySelectorAll(&#8216;iframe&#8217;);    iframes.forEach(function(f){      if(f.contentWindow===window){        f.style.cssText=&#8221;;        if(f._origHeight) f.style.height=f._origHeight;      }    });  }catch(e){}}document.addEventListener(&#8216;keydown&#8217;,e=&gt;{  if(e.key===&#8217;Escape&#8217;){closeCalEvt();closeDash();document.getElementById(&#8216;india-lb&#8217;).style.display=&#8217;none&#8217;;}});\/* \u2500\u2500 Shared calendar event builder \u2014 used by both calendars \u2500\u2500 *\/function buildCalEvents(data){  const today=todayISO();  const evts=[];  data.forEach(item=&gt;{    const iso=dNorm(item.Date);if(!iso)return;    const city=(item.City||&#8221;).trim();if(!city||city.toLowerCase()===&#8217;break&#8217;)return;    const eventName=(item[&#8216;Event Name&#8217;]||&#8221;).trim();    const label=eventName?`${city} \u2013 ${eventName}`:city;    let color=iso&lt;today?&#8217;#888&#8242;:iso===today?&#8217;#e53935&#8242;:&#8217;#e07030&#8242;;    evts.push({title:label,start:iso,color,allDay:true,      extendedProps:{dateStr:iso}});  });  return evts;}function initInlineCal(){  const el=document.getElementById(&#8216;inline-calendar&#8217;);  inlineCal=new FullCalendar.Calendar(el,{    initialView:&#8217;dayGridMonth&#8217;,    headerToolbar:{left:&#8217;prev,next today&#8217;,center:&#8217;title&#8217;,right:&#8221;},    height:&#8217;auto&#8217;,    themeSystem:&#8217;standard&#8217;,    eventDisplay:&#8217;block&#8217;,    eventMaxStack:3,    dayMaxEvents:3,    eventDidMount:function(info){      info.el.style.fontSize=&#8217;9px&#8217;;      info.el.style.padding=&#8217;1px 3px&#8217;;      info.el.style.borderRadius=&#8217;3px&#8217;;      info.el.style.cursor=&#8217;pointer&#8217;;    },    dateClick:info=&gt;showCalEvtPopup(info.dateStr),    eventClick:info=&gt;{      const ds=info.event.extendedProps.dateStr||info.event.startStr||(info.event.start?info.event.start.toISOString().split(&#8216;T&#8217;)[0]:&#8221;);      if(ds) showCalEvtPopup(ds);    }  });  inlineCal.render();}function updateInlineCal(data){  if(!inlineCal)return;  inlineCal.removeAllEvents();  inlineCal.addEventSource(buildCalEvents(data));}function fmtTime(v){  if(v===undefined||v===null||v===&#8221;)return&#8217;\u2014&#8217;;  const s=String(v).trim();  if(s===&#8221;||s===&#8217;0&#8217;||s.toLowerCase()===&#8217;false&#8217;||s===&#8217;\u2014&#8217;)return&#8217;\u2014&#8217;;  \/\/ 1899-12-30 = Google Sheets empty time cell (Excel zero date)  if(s.startsWith(&#8216;1899&#8217;)||s.startsWith(&#8216;1900-01-0&#8242;))return&#8217;\u2014&#8217;;  \/\/ Apps Script sends Date as &#8220;yyyy-MM-dd&#8221; \u2014 if it&#8217;s a full date with no time, skip  \/\/ But if Apps Script sends time as &#8220;1899-12-30 HH:mm:ss&#8221; extract time part  const spaceMatch=s.match(\/d{4}-d{2}-d{2}s+(d{1,2}):(d{2})\/);  if(spaceMatch){    const h=parseInt(spaceMatch[1],10),m=parseInt(spaceMatch[2],10);    if(h===0&amp;&amp;m===0)return&#8217;\u2014&#8217;;    const ampm=h&gt;=12?&#8217;PM&#8217;:&#8217;AM&#8217;,hh=h%12===0?12:h%12;    return hh+&#8217;:&#8217;+String(m).padStart(2,&#8217;0&#8242;)+&#8217; &#8216;+ampm;  }  \/\/ Decimal fraction: Google Sheets internal time (0.375 = 9:00 AM)  const num=parseFloat(s);  if(!isNaN(num)&amp;&amp;num&gt;0&amp;&amp;num&lt;1){    const totalMin=Math.round(num*1440);    const h=Math.floor(totalMin\/60),m=totalMin%60;    const ampm=h&gt;=12?&#8217;PM&#8217;:&#8217;AM&#8217;,hh=h%12===0?12:h%12;    return hh+&#8217;:&#8217;+String(m).padStart(2,&#8217;0&#8242;)+&#8217; &#8216;+ampm;  }  \/\/ ISO datetime with T (e.g. &#8220;1899-12-30T09:00:00.000Z&#8221;)  if(s.includes(&#8216;T&#8217;)){    const tp=s.split(&#8216;T&#8217;)[1];    if(tp){      const tm=tp.match(\/^(d{1,2}):(d{2})\/);      if(tm){        const h=parseInt(tm[1],10),m=parseInt(tm[2],10);        if(h===0&amp;&amp;m===0)return&#8217;\u2014&#8217;;        const ampm=h&gt;=12?&#8217;PM&#8217;:&#8217;AM&#8217;,hh=h%12===0?12:h%12;        return hh+&#8217;:&#8217;+String(m).padStart(2,&#8217;0&#8242;)+&#8217; &#8216;+ampm;      }    }    return&#8217;\u2014&#8217;;  }  \/\/ Plain HH:MM or HH:MM:SS with optional AM\/PM  const match=s.match(\/^(d{1,2}):(d{2})(?::d{2})?(s*(AM|PM))?$\/i);  if(match){    let h=parseInt(match[1],10);const m=parseInt(match[2],10);    const period=(match[4]||&#8221;).toUpperCase();    if(h===0&amp;&amp;m===0&amp;&amp;!period)return&#8217;\u2014&#8217;;    if(period===&#8217;PM&#8217;&amp;&amp;h!==12)h+=12;    else if(period===&#8217;AM&#8217;&amp;&amp;h===12)h=0;    const ampm=h&gt;=12?&#8217;PM&#8217;:&#8217;AM&#8217;,hh=h%12===0?12:h%12;    return hh+&#8217;:&#8217;+String(m).padStart(2,&#8217;0&#8242;)+&#8217; &#8216;+ampm;  }  \/\/ Already readable like &#8220;10:00 AM&#8221;  if(\/d.*[AaPp][Mm]\/.test(s))return s;  return&#8217;\u2014&#8217;;}function render(){  renderMainMapWithZoom();  updateSidebar();  buildList();}const REFRESH=5;let dCalendar=null,dashInited=false;function expandIframe(){  document.documentElement.style.height=&#8217;100vh&#8217;;  document.body.style.height=&#8217;100vh&#8217;;  document.body.style.overflow=&#8217;hidden&#8217;;  try{    var iframes=window.top.document.querySelectorAll(&#8216;iframe&#8217;);    iframes.forEach(function(f){      if(f.contentWindow===window){        f._origHeight=f._origHeight||f.style.height;        f._origPos=f._origPos||f.style.position;        f.style.cssText=&#8217;height:&#8217;+window.top.innerHeight+&#8217;px !important;position:fixed !important;top:0 !important;left:0 !important;width:100% !important;z-index:99999 !important;margin:0 !important;&#8217;;      }    });  }catch(e){}}function restoreIframe(){  document.documentElement.style.height=&#8221;;  document.body.style.height=&#8221;;  document.body.style.overflow=&#8221;;  try{    var iframes=window.top.document.querySelectorAll(&#8216;iframe&#8217;);    iframes.forEach(function(f){      if(f.contentWindow===window){        f.style.cssText=&#8221;;        if(f._origHeight) f.style.height=f._origHeight;      }    });  }catch(e){}}function showCalendar(){  document.getElementById(&#8216;dash-overlay&#8217;).classList.add(&#8216;show&#8217;);  expandIframe();  if(!dashInited){dashInited=true;setTimeout(initDash,80);}  else renderDashMap(allYatraData);}function closeDash(){document.getElementById(&#8216;dash-overlay&#8217;).classList.remove(&#8216;show&#8217;);closeDEvt();restoreIframe();}function closeDEvt(){document.getElementById(&#8216;d-evt-modal&#8217;).classList.remove(&#8216;show&#8217;);}function initDash(){  renderDashMap(allYatraData);  const calEl=document.getElementById(&#8216;d-calendar&#8217;);  dCalendar=new FullCalendar.Calendar(calEl,{    initialView:&#8217;dayGridMonth&#8217;,    headerToolbar:{left:&#8217;prev,next today&#8217;,center:&#8217;title&#8217;,right:&#8217;dayGridMonth&#8217;},    height:&#8217;auto&#8217;,    contentHeight:&#8217;auto&#8217;,    themeSystem:&#8217;standard&#8217;,    eventDisplay:&#8217;block&#8217;,    eventMaxStack:3,    dayMaxEvents:3,    eventDidMount:function(info){      info.el.style.fontSize=&#8217;9px&#8217;;      info.el.style.padding=&#8217;1px 3px&#8217;;      info.el.style.borderRadius=&#8217;3px&#8217;;      info.el.style.cursor=&#8217;pointer&#8217;;    },    dateClick:info=&gt;showCalEvtPopup(info.dateStr),    eventClick:info=&gt;{      const ds=info.event.extendedProps.dateStr||info.event.startStr||(info.event.start?info.event.start.toISOString().split(&#8216;T&#8217;)[0]:&#8221;);      if(ds) showCalEvtPopup(ds);    }  });  dCalendar.render();  updateDashUI(allYatraData);  setInterval(fetchDashData,REFRESH*60*1000);}async function fetchDashData(){  try{    const res=await fetch(`${API_URL}?t=${Date.now()}`);    const result=await res.json();    if(result.status===&#8217;success&#8217;){      allYatraData=result.data;      \/\/ Debug: log first item&#8217;s Time field to console      if(result.data&amp;&amp;result.data[0]) console.log(&#8216;[TIME DEBUG]&#8217;,JSON.stringify(result.data[0]));      if(typeof result.totalPeople===&#8217;number&#8217;&amp;&amp;result.totalPeople&gt;0){        window.statsData={totalPeople:result.totalPeople,rows:result.stats||[]};      } else if(result.stats&amp;&amp;Array.isArray(result.stats)){        const total=result.stats.reduce((sum,row)=&gt;{          const keys=Object.keys(row);const pk=keys.find(k=&gt;\/peoples*met|peoplemet|people_met|count\/i.test(k));          const n=pk?parseInt(String(row[pk]||&#8217;0&#8242;).replace(\/,\/g,&#8221;),10):0;return sum+(isNaN(n)?0:n);        },0);        window.statsData={totalPeople:total,rows:result.stats};      }      const sc=buildCitiesFromSheet(allYatraData);      if(sc&amp;&amp;sc.length){cities=sc;cur=getCurrentIndex(cities);render();}      else render();      updateInlineCal(allYatraData);      if(dashInited)updateDashUI(allYatraData);    }  }catch(e){console.warn(&#8216;Sheet fetch failed, using GQ fallback:&#8217;,e);}}function updateDashUI(data){  if(!dCalendar)return;  const today=todayISO();  dCalendar.removeAllEvents();  dCalendar.addEventSource(buildCalEvents(data));  \/\/ Update current city banner  const ce=data.find(item=&gt;dNorm(item.Date)===today);  const banner=document.getElementById(&#8216;d-current-city-text&#8217;);  if(ce){banner.textContent=`${ce.City||&#8221;} (${ce[&#8216;Event Name&#8217;]||&#8221;})`;banner.style.color=&#8217;#e53935&#8242;;}  else{banner.textContent=&#8217;No event scheduled for today.&#8217;;banner.style.color=&#8221;;}  renderDashMap(data);}let resizeTimer;function onResize(){  clearTimeout(resizeTimer);  resizeTimer=setTimeout(()=&gt;{    if(cities.length) renderMainMapWithZoom();    if(dashInited) renderDashMap(allYatraData);  },250);}window.addEventListener(&#8216;resize&#8217;, onResize);window.addEventListener(&#8216;orientationchange&#8217;, onResize);if(window.visualViewport){  window.visualViewport.addEventListener(&#8216;resize&#8217;, onResize);}async function init(){  cities=buildCitiesFromGQ();cur=getCurrentIndex(cities);  initInlineCal();  await loadIndiaGeoJSON();  render();  await fetchDashData();}init();\/\/ This is a new code jQuery(document).ready(function($) {    setTimeout(function() {        if ($(&#8216;#tcb_landing_page&#8217;).length) {            $(&#8216;html, body&#8217;).animate({                scrollTop: $(&#8216;#tcb_landing_page&#8217;).offset().top            }, 800);        }    }, 1000); \/\/ 2000ms = 1 seconds});jQuery(function($) {    $(&#8216;#yatra-invite&#8217;).click(function(e) {        e.preventDefault();        var target = $(&#8216;#take-action-invite-yatra-now&#8217;);        if (target.length) {            $(&#8216;html, body&#8217;).stop().animate({                scrollTop: target.offset().top            }, 800);        }    });});0[\/tcb-script]<\/p>\n<h2 style=\"text-align: left;\">About the Climate Satyagraha&nbsp;<\/h2>\n<p dir=\"ltr\" style=\"text-align: left; color: var(--tcb-skin-color-14) !important; --tcb-applied-color: var$(--tcb-skin-color-14) !important;\"><span style=\"font-size: 15px !important; --tcb-applied-color: var$(--tcb-skin-color-14) !important;\"><\/span><span style=\"font-size: 15px !important;\">Today, humanity is consuming resources equivalent to <strong>1.8 Earths<\/strong>, while we have only one. This is not just alarming\u2014it is mathematically impossible and unsustainable. A key driver of environmental degradation and climate change is this<strong> overconsumption, which leads to both resource depletion and ecosystem degradation<\/strong>. The environment is our shared home\u2014we all live in it, breathe in it, and depend on it. Yet, through our everyday actions, we are polluting it and driving climate change. Heatwaves and floods are becoming more frequent, already affecting our health, livelihoods, and economy. <\/span><\/p>\n<p dir=\"ltr\" style=\"color: var(--tcb-skin-color-14) !important; --tcb-applied-color: var$(--tcb-skin-color-14) !important; text-align: left;\"><span style=\"font-size: 15px !important;\">Just as a fixed income demands limits on spending, a finite planet demands limits on consumption. This is <strong>Climate Satyagraha<\/strong><strong>\u2014a polite insistence on finite living on a finite Earth. <\/strong>People across the world are beginning to act. You can be part of this global, citizen-led movement for climate correction.<\/span><\/p>\n<h4 style=\"\"><strong>Bharat Climate Satyagraha Yatra<\/strong><\/h4>\n<p>Since 2020, Prof. Chetan Singh Solanki has been on the Energy Swaraj Yatra, living away from home to drive climate action.<br \/>From <strong>13 May to 20 August 2026, <\/strong>he will undertake a 1<strong>00-day Bharat Climate Satyagraha Yatra, <\/strong>covering 5,800+ km and 51 cities<strong> to mobilize 1 lakh people<\/strong> to take the Finite Living Pledge and build local Climate Satyagraha teams.<br \/>This 100-day Yatra is not designed as a lecture series or awareness campaign. Its purpose is to initiate a self-sustaining local movement in each city. Each visit is structured around three outcomes:- &nbsp;Understanding the link between overconsumption and climate change- Taking the <em>Finite Living Pledge<\/em><em><\/em><em>&#8211;&nbsp;<\/em>Building local Climate Satyagraha groups (circles)<br \/>Be part of the yatra\u2014join, host or volunteer.<\/p>\n<h2 style=\"color: rgb(247, 152, 110) !important; --tcb-applied-color: rgb(247, 152, 110) !important;\">Take Action-Invite Yatra Now!<\/h2>\n<p style=\"text-align: center;\"><span style=\"font-weight: normal;\">With the scientific truth that every product and service we use results in carbon emissions and environmental degradation, each individual is part of the problem and must be part of the solution. We are inviting individuals, institutions, and organizations to take part in the&nbsp;<\/span><span style=\"\"><strong>Finite Earth Movement <\/strong><\/span><span style=\"font-weight: normal;\">and help spread <\/span><span style=\"\"><strong>the truth that Earth and its resources are finite, therefore our consumption must be finite.<\/strong><\/span><strong>&nbsp;<\/strong><\/p>\n<h4 style=\"text-align: center;\">Host Yatra<\/h4>\n<p style=\"\">Invite Prof. Solanki&#8217;s Energy Swaraj bus to your city or institution. Organize a public gathering and spark the local movement.<\/p>\n<h4 style=\"text-align: center;\">Become FEM&#8217;Us Volunteer<\/h4>\n<p style=\"\">Join the movement as a FEM&#8217;Us Volunteer. Help organize events, spread the Finite Living Pledge, and build local circles in your community.<\/p>\n<h4 style=\"text-align: center;\">Arrange Stay &amp; Food<\/h4>\n<p style=\"\">Offer hospitality to the Yatra team. Provide meals or accommodation as they travel through your city on this sacred 100-day journey.<\/p>\n<h1 style=\"\">About Prof. Chetan Singh Solanki- Man behind the Energy Swaraj Yatra<\/h1>\n<p style=\"text-align: left;\">Prof. Chetan Singh Solanki, widely known as the \u2018Solar Man of India\u2019 and \u2018Solar Gandhi,\u2019 is a climate action leader who resigned from IIT Bombay to dedicate himself fully to climate correction. Since 2020, he has been living and traveling in a solar-powered bus on his 11-year Energy Swaraj Yatra, pledging not to return home until 2030. Through this journey, he has covered 80,000 km, delivered 1,800+ talks, engaged over 5 lakh people, and made 2 million energy literate, while launching the <strong>Finite Earth Movement (FEM)<\/strong> to mobilize 1 billion individuals worldwide for climate action by 2028. Rooted in the truth that on a finite planet, consumption must be finite, FEM provides practical tools for mindful living. Prof. Solanki\u2019s pioneering solar initiatives, global outreach, and numerous awards underscore his mission: climate correction cannot wait for policies or technologies\u2014it begins with individuals choosing finite living today.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>100 DAYS YATRA- MAY 13-AUGUST 20, 2026 Bharat Climate Satyagraha Yatra&nbsp; \u0938\u0940\u092e\u093f\u0924 \u0927\u0930\u0924\u0940 \u092a\u0930 \u0938\u0940\u092e\u093f\u0924 \u091c\u0940\u0935\u0928 \u0915\u093e \u0906\u0917\u094d\u0930\u0939 Starting 13 May 2026 from Rajghat, Delhi, the 100 Days Climate Satyagraha Yatra will cover 5,800+ km across 51 cities. The goal is to mobilize 1 lakh people to take the Finite Living Pledge and build local [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-479","page","type-page","status-publish","hentry","post-wrapper","thrv_wrapper"],"_links":{"self":[{"href":"https:\/\/thefiniteearth.org\/hindi\/wp-json\/wp\/v2\/pages\/479","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=479"}],"version-history":[{"count":431,"href":"https:\/\/thefiniteearth.org\/hindi\/wp-json\/wp\/v2\/pages\/479\/revisions"}],"predecessor-version":[{"id":1278,"href":"https:\/\/thefiniteearth.org\/hindi\/wp-json\/wp\/v2\/pages\/479\/revisions\/1278"}],"wp:attachment":[{"href":"https:\/\/thefiniteearth.org\/hindi\/wp-json\/wp\/v2\/media?parent=479"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}