PageSourceSearch

https://rohithsh.github.io/

html rohithsh.github.io collected 2026-10-03 09:51:39 UTC 26,206 bytes, 692 lines download raw bytes

1<!DOCTYPE html>
2<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
3
4<meta charset="utf-8">
5<meta name="generator" content="quarto-1.8.27">
6
7<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
8
9<meta name="author" content="Rohith Kumar Shanmuganathan">
10
11<title>Rohith Kumar Shanmuganathan – Rohith’s Webpage</title>
12<style>
13code{white-space: pre-wrap;}
14span.smallcaps{font-variant: small-caps;}
15div.columns{display: flex; gap: min(4vw, 1.5em);}
16div.column{flex: auto; overflow-x: auto;}
17div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
18ul.task-list{list-style: none;}
19ul.task-list li input[type="checkbox"] {
20  width: 0.8em;
21  margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */
22  vertical-align: middle;
23}
24</style>
25
26
27<script src="site_libs/quarto-nav/quarto-nav.js"></script>
vendor: 1 bytes, line 27
27
28<script src="site_libs/quarto-nav/headroom.min.js"></script>
vendor: 1 bytes, line 28
28
29<script src="site_libs/clipboard/clipboard.min.js"></script>
vendor: 1 bytes, line 29
29
30<script src="site_libs/quarto-search/autocomplete.umd.js"></script>
vendor: 1 bytes, line 30
30
31<script src="site_libs/quarto-search/fuse.min.js"></script>
vendor: 1 bytes, line 31
31
32<script src="site_libs/quarto-search/quarto-search.js"></script>
32
33<meta name="quarto:offset" content="./">
34<script src="site_libs/quarto-html/quarto.js" type="module"></script>
vendor: 1 bytes, line 34
34
35<script src="site_libs/quarto-html/tabsets/tabsets.js" type="module"></script>
vendor: 1 bytes, line 35
35
36<script src="site_libs/quarto-html/axe/axe-check.js" type="module"></script>
vendor: 1 bytes, line 36
36
37<script src="site_libs/quarto-html/popper.min.js"></script>
vendor: 1 bytes, line 37
37
38<script src="site_libs/quarto-html/tippy.umd.min.js"></script>
38
39<link href="site_libs/quarto-html/tippy.css" rel="stylesheet">
40<link href="site_libs/quarto-html/quarto-syntax-highlighting-ed96de9b727972fe78a7b5d16c58bf87.css" rel="stylesheet" id="quarto-text-highlighting-styles">
41<script src="site_libs/bootstrap/bootstrap.min.js"></script>
41
42<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet">
43<link href="site_libs/bootstrap/bootstrap-f22cdf64c810c887d8ac059dc91ab5d3.min.css" rel="stylesheet" append-hash="true" id="quarto-bootstrap" data-mode="light">
44<link href="site_libs/quarto-contrib/academicons-1.9.2/all.css" rel="stylesheet">
45<link href="site_libs/quarto-contrib/academicons-1.9.2/size.css" rel="stylesheet">
46<script id="quarto-search-options" type="application/json">{
47  "location": "navbar",
48  "copy-button": false,
49  "collapse-after": 3,
50  "panel-placement": "end",
51  "type": "textbox",
52  "limit": 50,
53  "keyboard-shortcut": [
54    "f",
55    "/",
56    "s"
57  ],
58  "language": {
59    "search-no-results-text": "No results",
60    "search-matching-documents-text": "matching documents",
61    "search-copy-link-title": "Copy link to search",
62    "search-hide-matches-text": "Hide additional matches",
63    "search-more-match-text": "more match in this document",
64    "search-more-matches-text": "more matches in this document",
65    "search-clear-button-title": "Clear",
66    "search-text-placeholder": "",
67    "search-detached-cancel-button-title": "Cancel",
68    "search-submit-button-title": "Submit",
69    "search-label": "Search"
70  }
71}</script>
vendor: 1 bytes, line 71
71
72<script async="" src="https://www.googletagmanager.com/gtag/js?id="></script>
72
73
74<script type="text/javascript">
75
76window.dataLayer = window.dataLayer || [];
77function gtag(){dataLayer.push(arguments);}
78gtag('js', new Date());
79gtag('config', '', { 'anonymize_ip': true});
80</script>
80
81
82
83<!--
84
85Load Academicons v1: https://jpswalsh.github.io/academicons/
86
87-->
88
89<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/jpswalsh/academicons@1/css/academicons.min.css">
90
91
92
93<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
94
95
96
97
98
99<!---
100
101The following code are needed to show dimension citation and altmetrics.
102
103https://api.altmetric.com/embeds.html
104
105https://badge.dimensions.ai/
106
107--->
108
109
110
111<script type="text/javascript" src="https://d1bxh8uas1mnw7.cloudfront.net/assets/embed.js"></script>
111
112
113
114
115<script async="" src="https://badge.dimensions.ai/badge.js" charset="utf-8"></script>
115
116
117
118
119<script type="text/javascript" src="//cdn.plu.mx/widget-popup.js"></script>
119
120
121
122<link rel="stylesheet" href="styles.css">
123<meta property="og:title" content="Rohith Kumar Shanmuganathan – Rohith’s Webpage">
124<meta property="og:image" content="rohithsh.github.io/files/images/Photo.jpg">
125<meta property="og:site_name" content="Rohith's Webpage">
126<meta name="twitter:title" content="Rohith Kumar Shanmuganathan – Rohith’s Webpage">
127<meta name="twitter:image" content="rohithsh.github.io/files/images/Photo.jpg">
128<meta name="twitter:card" content="summary_large_image">
129</head>
130
131<body class="nav-fixed quarto-light">
132
133<div id="quarto-search-results"></div>
134  <header id="quarto-header" class="headroom fixed-top">
135    <nav class="navbar navbar-expand-lg " data-bs-theme="dark">
136      <div class="navbar-container container-fluid">
137      <div class="navbar-brand-container mx-auto">
138    <a class="navbar-brand" href="./index.html">
139    <span class="navbar-title">Rohith’s Webpage</span>
140    </a>
141  </div>
142            <div id="quarto-search" class="" title="Search"></div>
143          <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" role="menu" aria-expanded="false" aria-label="Toggle navigation" onclick="if (window.quartoToggleHeadroom) { window.quartoToggleHeadroom(); }">
144  <span class="navbar-toggler-icon"></span>
145</button>
146<div class="collapse navbar-collapse" id="navbarCollapse">
147<ul class="navbar-nav navbar-nav-scroll me-auto">
148  <li class="nav-item">
149    <a class="nav-link"  href="./publications.html">
150      <span class="menu-text">Publications</span></a>
151</ul>
152</div> <!-- /navcollapse -->
153            <div class="quarto-navbar-tools">
154  <a href="" class="quarto-reader-toggle quarto-navigation-tool px-1" onclick="window.quartoToggleReader(); return false;" title="Toggle reader mode">
155  <div class="quarto-reader-toggle-btn">
156  <i class="bi"></i>
157  </div>
158</a>
159</div>
160      </div> <!-- /container-fluid -->
161    </nav>
162</header>
163<!-- content -->
164<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-full page-navbar">
165<!-- sidebar -->
166<!-- margin-sidebar -->
167
168<!-- main -->
169<main class="content column-page" id="quarto-document-content">
170
171
172
173
174<div class="quarto-about-trestles column-page">
175  <div class="about-entity">
176    <img src="files/images/Photo.jpg" class="about-image
177  rounded " style="width: 70%;">
178<header id="title-block-header" class="quarto-title-block default">
179<div class="quarto-title">
180<h1 class="title">Rohith Kumar Shanmuganathan</h1>
181</div>
182<div class="quarto-title-meta column-page">
183  </div>
184</header>
185    <div class="about-links">
186  <a href="https://uol.de/en/computingscience/groups/formal-methods" class="about-link" rel="" target="_blank">
187    <i class="bi bi-sun"></i>
188     <span class="about-link-text">Group</span>
189  </a>
190  <a href="mailto:[email protected]" class="about-link" rel="" target="">
191    <i class="bi bi-envelope"></i>
192     <span class="about-link-text">E-mail</span>
193  </a>
194  <a href="https://www.linkedin.com/in/rohith-kumar-shanmuganathan/" class="about-link" rel="" target="_blank">
195    <i class="bi bi-linkedin"></i>
196     <span class="about-link-text">LinkedIn</span>
197  </a>
198  <a href="https://scholar.google.com/citations?user=z5ElQOIAAAAJ&amp;hl=en" class="about-link" rel="" target="_blank">
199     <span class="about-link-text"><i class="ai  ai-google-scholar"></i> Google Scholar</span>
200  </a>
201</div>
202  </div>
203  <div class="about-contents"><div id="hero-heading">
204<p>I’m a Phd Student at the Carl von Ossietzky University of Oldenburg advised by Prof.&nbsp;Heike Wehrheim.</p>
205<p>I am currently working on explaining software bugs. My other research interests include software analysis, AI4SE and secure software engineering.</p>
206<p>I am also a Research Fellow at the DFG funded research and training group <a href="https://rtg-cause.github.io/">CAUSE</a>.</p>
207<section id="experience" class="level2">
208<h2 data-anchor-id="experience">Experience</h2>
209<ul>
210<li>Research Assistant, Carl von Ossietzky University of Oldenburg, Oldenburg, Germany</li>
211<li>Student Research Assistant, Secure Software Engineering Group, Fraunhofer IEM, Paderborn, Germany</li>
212<li>Software Development Engineer 1, Trustt (formerly Novopay), Bengaluru, India</li>
213</ul>
214</section>
215<section id="education" class="level2">
216<h2 data-anchor-id="education">Education</h2>
217<ul>
218<li>M.Sc. Computer Science, Paderborn University, Paderborn, Germany</li>
219<li>B.E. Computer Science and Engineering, Anna University, India</li>
220</ul>
221</section>
222
223</div></div>
224</div>
225
226<h2 id="news-title">News &amp; Updates</h2>
227<section class="news-updates" aria-labelledby="news-title">
228  <div class="news-item">
229    <span class="news-date">07/2026</span> -
230    <span class="news-type">Committee Member</span> -
231    I will serve as a <i>Shadow PC member</i> at ICSE-2027.
232  </div>
233
234</section>
235
236
237<h2 id="news-title">Services</h2>
238<section id="committee-member" class="level3">
239<h3 class="anchored" data-anchor-id="committee-member">Committee Member</h3>
240<p>
241  <a href="https://conf.researchr.org/track/icse-2027/icse-2027-shadow-research-track-program-committee">ICSE 2027 - Shadow PC</a>,
242  <a href="https://conf.researchr.org/committee/ase-2026/ase-2026-artifact-evaluation-artifact-evaluation-committee">ASE 2026 - AEC</a>,
243  <a href="https://conf.researchr.org/committee/issta-2026/issta-2026-artifact-evaluation-artifact-evaluation-committee">ISSTA 2026 - AEC</a>,
244  <a href="https://conf.researchr.org/track/fm-2026/fm-2026-artifact-evaluation">FM 2026 - AEC</a>
245</p>
246</section>
247<section id="Others" class="level3">
248<h3 class="anchored" data-anchor-id="Others">Others</h3>
249<p>External Reviewer - <a href="https://conf.researchr.org/home/fm-2026">FM 2026 - Research Track</a></p>
250
251<h2 id="news-title">Teaching</h2>
252<section id="Software-Analysis" class="level2">
253<b class="anchored">Software Analysis</b> - Summer 2026
254
255
256</main> <!-- /main -->
257<script id="quarto-html-after-body" type="application/javascript">
258  window.document.addEventListener("DOMContentLoaded", function (event) {
259    const isCodeAnnotation = (el) => {
260      for (const clz of el.classList) {
261        if (clz.startsWith('code-annotation-')) {
262          return true;
263        }
264      }
265      return false;
266    }
267    const onCopySuccess = function(e) {
268      // button target
269      const button = e.trigger;
270      // don't keep focus
271      button.blur();
272      // flash "checked"
273      button.classList.add('code-copy-button-checked');
274      var currentTitle = button.getAttribute("title");
275      button.setAttribute("title", "Copied!");
276      let tooltip;
277      if (window.bootstrap) {
278        button.setAttribute("data-bs-toggle", "tooltip");
279        button.setAttribute("data-bs-placement", "left");
280        button.setAttribute("data-bs-title", "Copied!");
281        tooltip = new bootstrap.Tooltip(button,
282          { trigger: "manual",
283            customClass: "code-copy-button-tooltip",
284            offset: [0, -8]});
285        tooltip.show();
286      }
287      setTimeout(function() {
288        if (tooltip) {
289          tooltip.hide();
290          button.removeAttribute("data-bs-title");
291          button.removeAttribute("data-bs-toggle");
292          button.removeAttribute("data-bs-placement");
293        }
294        button.setAttribute("title", currentTitle);
295        button.classList.remove('code-copy-button-checked');
296      }, 1000);
297      // clear code selection
298      e.clearSelection();
299    }
300    const getTextToCopy = function(trigger) {
301      const outerScaffold = trigger.parentElement.cloneNode(true);
302      const codeEl = outerScaffold.querySelector('code');
303      for (const childEl of codeEl.children) {
304        if (isCodeAnnotation(childEl)) {
305          childEl.remove();
306        }
307      }
308      return codeEl.innerText;
309    }
310    const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', {
311      text: getTextToCopy
312    });
313    clipboard.on('success', onCopySuccess);
314    if (window.document.getElementById('quarto-embedded-source-code-modal')) {
315      const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', {
316        text: getTextToCopy,
317        container: window.document.getElementById('quarto-embedded-source-code-modal')
318      });
319      clipboardModal.on('success', onCopySuccess);
320    }
321      var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
322      var mailtoRegex = new RegExp(/^mailto:/);
323        var filterRegex = new RegExp("^(?:http:|https:)\/\/drganghe\.github\.io\/custom");
324      var isInternal = (href) => {
325          return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
326      }
327      // Inspect non-navigation links and adorn them if external
328     var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool):not(.about-link)');
329      for (var i=0; i<links.length; i++) {
330        const link = links[i];
331        if (!isInternal(link.href)) {
332          // undo the damage that might have been done by quarto-nav.js in the case of
333          // links that we want to consider external
334          if (link.dataset.originalHref !== undefined) {
335            link.href = link.dataset.originalHref;
336          }
337            // target, if specified
338            link.setAttribute("target", "_blank");
339            if (link.getAttribute("rel") === null) {
340              link.setAttribute("rel", "noopener");
341            }
342        }
343      }
344    function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
345      const config = {
346        allowHTML: true,
347        maxWidth: 500,
348        delay: 100,
349        arrow: false,
350        appendTo: function(el) {
351            return el.parentElement;
352        },
353        interactive: true,
354        interactiveBorder: 10,
355        theme: 'quarto',
356        placement: 'bottom-start',
357      };
358      if (contentFn) {
359        config.content = contentFn;
360      }
361      if (onTriggerFn) {
362        config.onTrigger = onTriggerFn;
363      }
364      if (onUntriggerFn) {
365        config.onUntrigger = onUntriggerFn;
366      }
367      window.tippy(el, config);
368    }
369    const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
370    for (var i=0; i<noterefs.length; i++) {
371      const ref = noterefs[i];
372      tippyHover(ref, function() {
373        // use id or data attribute instead here
374        let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
375        try { href = new URL(href).hash; } catch {}
376        const id = href.replace(/^#\/?/, "");
377        const note = window.document.getElementById(id);
378        if (note) {
379          return note.innerHTML;
380        } else {
381          return "";
382        }
383      });
384    }
385    const xrefs = window.document.querySelectorAll('a.quarto-xref');
386    const processXRef = (id, note) => {
387      // Strip column container classes
388      const stripColumnClz = (el) => {
389        el.classList.remove("page-full", "page-columns");
390        if (el.children) {
391          for (const child of el.children) {
392            stripColumnClz(child);
393          }
394        }
395      }
396      stripColumnClz(note)
397      if (id === null || id.startsWith('sec-')) {
398        // Special case sections, only their first couple elements
399        const container = document.createElement("div");
400        if (note.children && note.children.length > 2) {
401          container.appendChild(note.children[0].cloneNode(true));
402          for (let i = 1; i < note.children.length; i++) {
403            const child = note.children[i];
404            if (child.tagName === "P" && child.innerText === "") {
405              continue;
406            } else {
407              container.appendChild(child.cloneNode(true));
408              break;
409            }
410          }
411          if (window.Quarto?.typesetMath) {
412            window.Quarto.typesetMath(container);
413          }
414          return container.innerHTML
415        } else {
416          if (window.Quarto?.typesetMath) {
417            window.Quarto.typesetMath(note);
418          }
419          return note.innerHTML;
420        }
421      } else {
422        // Remove any anchor links if they are present
423        const anchorLink = note.querySelector('a.anchorjs-link');
424        if (anchorLink) {
425          anchorLink.remove();
426        }
427        if (window.Quarto?.typesetMath) {
428          window.Quarto.typesetMath(note);
429        }
430        if (note.classList.contains("callout")) {
431          return note.outerHTML;
432        } else {
433          return note.innerHTML;
434        }
435      }
436    }
437    for (var i=0; i<xrefs.length; i++) {
438      const xref = xrefs[i];
439      tippyHover(xref, undefined, function(instance) {
440        instance.disable();
441        let url = xref.getAttribute('href');
442        let hash = undefined;
443        if (url.startsWith('#')) {
444          hash = url;
445        } else {
446          try { hash = new URL(url).hash; } catch {}
447        }
448        if (hash) {
449          const id = hash.replace(/^#\/?/, "");
450          const note = window.document.getElementById(id);
451          if (note !== null) {
452            try {
453              const html = processXRef(id, note.cloneNode(true));
454              instance.setContent(html);
455            } finally {
456              instance.enable();
457              instance.show();
458            }
459          } else {
460            // See if we can fetch this
461            fetch(url.split('#')[0])
462            .then(res => res.text())
463            .then(html => {
464              const parser = new DOMParser();
465              const htmlDoc = parser.parseFromString(html, "text/html");
466              const note = htmlDoc.getElementById(id);
467              if (note !== null) {
468                const html = processXRef(id, note);
469                instance.setContent(html);
470              }
471            }).finally(() => {
472              instance.enable();
473              instance.show();
474            });
475          }
476        } else {
477          // See if we can fetch a full url (with no hash to target)
478          // This is a special case and we should probably do some content thinning / targeting
479          fetch(url)
480          .then(res => res.text())
481          .then(html => {
482            const parser = new DOMParser();
483            const htmlDoc = parser.parseFromString(html, "text/html");
484            const note = htmlDoc.querySelector('main.content');
485            if (note !== null) {
486              // This should only happen for chapter cross references
487              // (since there is no id in the URL)
488              // remove the first header
489              if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
490                note.children[0].remove();
491              }
492              const html = processXRef(null, note);
493              instance.setContent(html);
494            }
495          }).finally(() => {
496            instance.enable();
497            instance.show();
498          });
499        }
500      }, function(instance) {
501      });
502    }
503        let selectedAnnoteEl;
504        const selectorForAnnotation = ( cell, annotation) => {
505          let cellAttr = 'data-code-cell="' + cell + '"';
506          let lineAttr = 'data-code-annotation="' +  annotation + '"';
507          const selector = 'span[' + cellAttr + '][' + lineAttr + ']';
508          return selector;
509        }
510        const selectCodeLines = (annoteEl) => {
511          const doc = window.document;
512          const targetCell = annoteEl.getAttribute("data-target-cell");
513          const targetAnnotation = annoteEl.getAttribute("data-target-annotation");
514          const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation));
515          const lines = annoteSpan.getAttribute("data-code-lines").split(",");
516          const lineIds = lines.map((line) => {
517            return targetCell + "-" + line;
518          })
519          let top = null;
520          let height = null;
521          let parent = null;
522          if (lineIds.length > 0) {
523              //compute the position of the single el (top and bottom and make a div)
524              const el = window.document.getElementById(lineIds[0]);
525              top = el.offsetTop;
526              height = el.offsetHeight;
527              parent = el.parentElement.parentElement;
528            if (lineIds.length > 1) {
529              const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]);
530              const bottom = lastEl.offsetTop + lastEl.offsetHeight;
531              height = bottom - top;
532            }
533            if (top !== null && height !== null && parent !== null) {
534              // cook up a div (if necessary) and position it
535              let div = window.document.getElementById("code-annotation-line-highlight");
536              if (div === null) {
537                div = window.document.createElement("div");
538                div.setAttribute("id", "code-annotation-line-highlight");
539                div.style.position = 'absolute';
540                parent.appendChild(div);
541              }
542              div.style.top = top - 2 + "px";
543              div.style.height = height + 4 + "px";
544              div.style.left = 0;
545              let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
546              if (gutterDiv === null) {
547                gutterDiv = window.document.createElement("div");
548                gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter");
549                gutterDiv.style.position = 'absolute';
550                const codeCell = window.document.getElementById(targetCell);
551                const gutter = codeCell.querySelector('.code-annotation-gutter');
552                gutter.appendChild(gutterDiv);
553              }
554              gutterDiv.style.top = top - 2 + "px";
555              gutterDiv.style.height = height + 4 + "px";
556            }
557            selectedAnnoteEl = annoteEl;
558          }
559        };
560        const unselectCodeLines = () => {
561          const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"];
562          elementsIds.forEach((elId) => {
563            const div = window.document.getElementById(elId);
564            if (div) {
565              div.remove();
566            }
567          });
568          selectedAnnoteEl = undefined;
569        };
570          // Handle positioning of the toggle
571      window.addEventListener(
572        "resize",
573        throttle(() => {
574          elRect = undefined;
575          if (selectedAnnoteEl) {
576            selectCodeLines(selectedAnnoteEl);
577          }
578        }, 10)
579      );
580      function throttle(fn, ms) {
581      let throttle = false;
582      let timer;
583        return (...args) => {
584          if(!throttle) { // first call gets through
585              fn.apply(this, args);
586              throttle = true;
587          } else { // all the others get throttled
588              if(timer) clearTimeout(timer); // cancel #2
589              timer = setTimeout(() => {
590                fn.apply(this, args);
591                timer = throttle = false;
592              }, ms);
593          }
594        };
595      }
596        // Attach click handler to the DT
597        const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
598        for (const annoteDlNode of annoteDls) {
599          annoteDlNode.addEventListener('click', (event) => {
600            const clickedEl = event.target;
601            if (clickedEl !== selectedAnnoteEl) {
602              unselectCodeLines();
603              const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active');
604              if (activeEl) {
605                activeEl.classList.remove('code-annotation-active');
606              }
607              selectCodeLines(clickedEl);
608              clickedEl.classList.add('code-annotation-active');
609            } else {
610              // Unselect the line
611              unselectCodeLines();
612              clickedEl.classList.remove('code-annotation-active');
613            }
614          });
615        }
616    const findCites = (el) => {
617      const parentEl = el.parentElement;
618      if (parentEl) {
619        const cites = parentEl.dataset.cites;
620        if (cites) {
621          return {
622            el,
623            cites: cites.split(' ')
624          };
625        } else {
626          return findCites(el.parentElement)
627        }
628      } else {
629        return undefined;
630      }
631    };
632    var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
633    for (var i=0; i<bibliorefs.length; i++) {
634      const ref = bibliorefs[i];
635      const citeInfo = findCites(ref);
636      if (citeInfo) {
637        tippyHover(citeInfo.el, function() {
638          var popup = window.document.createElement('div');
639          citeInfo.cites.forEach(function(cite) {
640            var citeDiv = window.document.createElement('div');
641            citeDiv.classList.add('hanging-indent');
642            citeDiv.classList.add('csl-entry');
643            var biblioDiv = window.document.getElementById('ref-' + cite);
644            if (biblioDiv) {
645              citeDiv.innerHTML = biblioDiv.innerHTML;
646            }
647            popup.appendChild(citeDiv);
648          });
649          return popup.innerHTML;
650        });
651      }
652    }
653  });
654  </script>
654
655  <div style="
656    position:fixed;
657    right:10px;
658    bottom:10px;
659    width:120px;
660    height:70px;
661    overflow:hidden;
662    z-index:9999;
663  ">
664    <div style="
665      width:400px;
666      height:230px;
667      transform:scale(0.3);
668      transform-origin:top left;
669    ">
670    
670<script type="text/javascript" id="mmvst_globe" src="//mapmyvisitors.com/globe.js?d=SxaaNkKrePduLeXryQJYKfjWqr1q0V_9VoaIU1zqXlI"></script>
670
671    </div>
672  </div>
673</div> <!-- /content -->
674<footer class="footer">
675  <div class="nav-footer">
676    <div class="nav-footer-left">
677<a href="http://www.rohithsh.github.io">Rohith Kumar Shanmuganathan</a> ©
678<script>document.write(new Date().getFullYear())</script>
678
679</div>
680    <div class="nav-footer-center">
681      &nbsp;
682    </div>
683    <div class="nav-footer-right">
684      &nbsp;
685    </div>
686  </div>
687</footer>
688
689
690
691
692</body></html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.