PageSourceSearch

https://www.jprenne.com/

html jprenne.com collected 2026-09-24 12:17:38 UTC 25,987 bytes, 718 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.6.42">
6
7<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
8
9
10<title>J.-P. Renne</title>
11<style>
12code{white-space: pre-wrap;}
13span.smallcaps{font-variant: small-caps;}
14div.columns{display: flex; gap: min(4vw, 1.5em);}
15div.column{flex: auto; overflow-x: auto;}
16div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
17ul.task-list{list-style: none;}
18ul.task-list li input[type="checkbox"] {
19  width: 0.8em;
20  margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */ 
21  vertical-align: middle;
22}
23</style>
24
25
26<script src="site_libs/quarto-nav/quarto-nav.js"></script>
vendor: 1 bytes, line 26
26
27<script src="site_libs/clipboard/clipboard.min.js"></script>
vendor: 1 bytes, line 27
27
28<script src="site_libs/quarto-search/autocomplete.umd.js"></script>
vendor: 1 bytes, line 28
28
29<script src="site_libs/quarto-search/fuse.min.js"></script>
vendor: 1 bytes, line 29
29
30<script src="site_libs/quarto-search/quarto-search.js"></script>
30
31<meta name="quarto:offset" content="./">
32<link href="./img/favicon.png" rel="icon" type="image/png">
33<script src="site_libs/quarto-html/quarto.js"></script>
vendor: 1 bytes, line 33
33
34<script src="site_libs/quarto-html/popper.min.js"></script>
vendor: 1 bytes, line 34
34
35<script src="site_libs/quarto-html/tippy.umd.min.js"></script>
35
36<link href="site_libs/quarto-html/tippy.css" rel="stylesheet">
37<link href="site_libs/quarto-html/quarto-syntax-highlighting-2f5df379a58b258e96c21c0638c20c03.css" rel="stylesheet" id="quarto-text-highlighting-styles">
38<script src="site_libs/bootstrap/bootstrap.min.js"></script>
38
39<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet">
40<link href="site_libs/bootstrap/bootstrap-592dba6c80c87bed5231b64218318c97.min.css" rel="stylesheet" append-hash="true" id="quarto-bootstrap" data-mode="light">
41<link href="site_libs/quarto-contrib/academicons-1.9.2/all.css" rel="stylesheet">
42<link href="site_libs/quarto-contrib/academicons-1.9.2/size.css" rel="stylesheet">
43<script id="quarto-search-options" type="application/json">{
44  "location": "navbar",
45  "copy-button": false,
46  "collapse-after": 3,
47  "panel-placement": "end",
48  "type": "textbox",
49  "limit": 50,
50  "keyboard-shortcut": [
51    "f",
52    "/",
53    "s"
54  ],
55  "language": {
56    "search-no-results-text": "No results",
57    "search-matching-documents-text": "matching documents",
58    "search-copy-link-title": "Copy link to search",
59    "search-hide-matches-text": "Hide additional matches",
60    "search-more-match-text": "more match in this document",
61    "search-more-matches-text": "more matches in this document",
62    "search-clear-button-title": "Clear",
63    "search-text-placeholder": "",
64    "search-detached-cancel-button-title": "Cancel",
65    "search-submit-button-title": "Submit",
66    "search-label": "Search"
67  }
68}</script>
68
69
70
71</head>
72
73<body class="nav-fixed fullcontent">
74
75<div id="quarto-search-results"></div>
76  <header id="quarto-header" class="headroom fixed-top">
77    <nav class="navbar navbar-expand-lg " data-bs-theme="dark">
78      <div class="navbar-container container-fluid">
79      <div class="navbar-brand-container mx-auto">
80    <a href="./index.html" class="navbar-brand navbar-brand-logo">
81    <img src="./img/logo.png" alt="" class="navbar-logo">
82    </a>
83    <a class="navbar-brand" href="./index.html">
84    <span class="navbar-title">J.-P. Renne</span>
85    </a>
86  </div>
87            <div id="quarto-search" class="" title="Search"></div>
88          <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(); }">
89  <span class="navbar-toggler-icon"></span>
90</button>
91          <div class="collapse navbar-collapse" id="navbarCollapse">
92            <ul class="navbar-nav navbar-nav-scroll me-auto">
93  <li class="nav-item">
94    <a class="nav-link" href="./research.html"> 
95<span class="menu-text">Research</span></a>
96  </li>  
97  <li class="nav-item">
98    <a class="nav-link" href="./teaching/index.html"> 
99<span class="menu-text">Teaching</span></a>
100  </li>  
101  <li class="nav-item">
102    <a class="nav-link" href="./cv/index.html"> 
103<span class="menu-text">CV</span></a>
104  </li>  
105  <li class="nav-item">
106    <a class="nav-link" href="./photography/index.html"> 
107<span class="menu-text">Butterflies</span></a>
108  </li>  
109</ul>
110            <ul class="navbar-nav navbar-nav-scroll ms-auto">
111  <li class="nav-item">
112    <a class="nav-link" href="https://github.com/jrenne"> <i class="bi bi-github" role="img">
113</i> 
114<span class="menu-text">Github</span></a>
115  </li>  
116  <li class="nav-item">
117    <a class="nav-link" href="mailto:[email protected]"> <i class="bi bi-envelope" role="img">
118</i> 
119<span class="menu-text">Email</span></a>
120  </li>  
121  <li class="nav-item">
122    <a class="nav-link" href="https://scholar.google.com/citations?user=DXgArakAAAAJ&amp;hl=en"> <i class="bi bi-book" role="img">
123</i> 
124<span class="menu-text">Google Scholar</span></a>
125  </li>  
126</ul>
127          </div> <!-- /navcollapse -->
128            <div class="quarto-navbar-tools">
129</div>
130      </div> <!-- /container-fluid -->
131    </nav>
132</header>
133<!-- content -->
134<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-article page-navbar">
135<!-- sidebar -->
136<!-- margin-sidebar -->
137    
138<!-- main -->
139<main class="content" id="quarto-document-content">
140
141
142
143
144<div class="quarto-about-jolla">
145  <img src="img/my_image.jpg" class="about-image
146  round " style="height: 15em; width: 15em;">
147 <header id="title-block-header" class="quarto-title-block"></header><div id="about-block">
148</div> 
149  <hr class="about-sep">
150   <div class="about-links">
151  <a href="https://github.com/jrenne" class="about-link" rel="" target="">
152    <i class="bi bi-github"></i>
153     <span class="about-link-text">Github</span>
154  </a>
155  <a href="mailto:[email protected]" class="about-link" rel="" target="">
156    <i class="bi bi-envelope"></i>
157     <span class="about-link-text">Email</span>
158  </a>
159  <a href="https://scholar.google.com/citations?user=DXgArakAAAAJ&amp;hl=en" class="about-link" rel="" target="">
160    <i class="bi bi-book"></i>
161     <span class="about-link-text">Google Scholar</span>
162  </a>
163  <a href="https://applicationspub.unil.ch/interpub/noauth/php/Un/UnPers.php?PerNum=1175304&amp;LanCode=8" class="about-link" rel="" target="">
164    <i class="bi bi-infinity"></i>
165     <span class="about-link-text">Unisciences</span>
166  </a>
167</div>
168</div>
169
170<section id="welcome-to-my-website" class="level1">
171<h1>Welcome to my website!</h1>
172<!--  -->
173<!-- Pour essai @Hemingway1952 -->
174<!-- [link to image](img/my_image.jpg) [link to CV](cv/cv.pdf) -->
175<!-- ```{r} -->
176<!-- #| label: fig-airquality -->
177<!-- #| fig-cap: "Temperature and ozone level." -->
178<!-- #| warning: false -->
179<!-- plot(rnorm(10)) -->
180<!-- 1000^2 -->
181<!-- ``` -->
182<p>I am a professor of economics at HEC Lausanne, which I joined in 2015. Previously, I worked as a senior economist at the <a href="https://www.banque-france.fr/en/page-sommaire/research">Banque de France</a>, and as the head of operational research at the <a href="https://www.aft.gouv.fr">French Debt Management Office</a> (Agence France Trésor).</p>
183<p>My research focuses on time series modeling, with applications to interest rate dynamics, catastrophe risk pricing, and public debt management.</p>
184<p>I have carried out consulting assignments for various institutions: European Central Bank (ECB), Bank for International Settlements (BIS), Organisation for Economic Co-operation and Development (OECD), Banque de France, Électricité de France (EDF), Swiss Federal Finance Administration (AFF), Swiss State Secretariat for Economic Affairs (SECO).</p>
185<p>On this website, you’ll find my published work, my work in progress, and links to related material (codes). Please feel free to <a href="mailto:[email protected]">contact me</a> if you have any questions.</p>
186
187
188
189</section>
190
191</main> <!-- /main -->
192<script>
193(function () {
194  function decodeCategory(category) {
195    try {
196      return decodeURIComponent(window.atob(category));
197    } catch (_error) {
198      return category;
199    }
200  }
201
202  function setCategoryHash(category) {
203    window.history.pushState(null, null, `#category=${category}`);
204  }
205
206  function activateCategory(category) {
207    const activeEls = window.document.querySelectorAll(
208      ".quarto-listing-category .category.active"
209    );
210    for (const activeEl of activeEls) {
211      activeEl.classList.remove("active");
212    }
213
214    const categoryEl = window.document.querySelector(
215      `.quarto-listing-category .category[data-category='${category}']`
216    );
217    if (categoryEl) {
218      categoryEl.classList.add("active");
219    }
220
221    filterListingCategory(category);
222  }
223
224  function filterListingCategory(category) {
225    const listings = window["quarto-listings"] || {};
226    const listingIds = Object.keys(listings);
227    const selectedCategory = decodeCategory(category).trim();
228
229    for (const listingId of listingIds) {
230      const list = listings[listingId];
231      if (!list) {
232        continue;
233      }
234
235      if (category === "") {
236        list.filter();
237        continue;
238      }
239
240      list.filter(function (item) {
241        const itemValues = item.values();
242        if (itemValues.categories === null) {
243          return false;
244        }
245
246        const rawCategories = itemValues.categories.split(",");
247        const decodedCategories = decodeCategory(itemValues.categories)
248          .split(",")
249          .map((category) => category.trim());
250
251        return (
252          rawCategories.includes(category) ||
253          decodedCategories.includes(selectedCategory)
254        );
255      });
256    }
257  }
258
259  function attachCategoryHandlers() {
260    const categoryEls = window.document.querySelectorAll(
261      ".quarto-listing-category .category"
262    );
263    for (const categoryEl of categoryEls) {
264      const category = categoryEl.getAttribute("data-category");
265      categoryEl.onclick = function () {
266        activateCategory(category);
267        setCategoryHash(category);
268      };
269    }
270
271    const categoryTitleEls = window.document.querySelectorAll(
272      ".quarto-listing-category-title"
273    );
274    for (const categoryTitleEl of categoryTitleEls) {
275      categoryTitleEl.onclick = function () {
276        activateCategory("");
277        setCategoryHash("");
278      };
279    }
280  }
281
282  window.quartoListingCategory = function (category) {
283    activateCategory(category);
284    setCategoryHash(category);
285  };
286
287  window.document.addEventListener("DOMContentLoaded", attachCategoryHandlers);
288})();
289</script>
vendor: 1 bytes, line 289
289
290<script id="quarto-html-after-body" type="application/javascript">
291window.document.addEventListener("DOMContentLoaded", function (event) {
292  const toggleBodyColorMode = (bsSheetEl) => {
293    const mode = bsSheetEl.getAttribute("data-mode");
294    const bodyEl = window.document.querySelector("body");
295    if (mode === "dark") {
296      bodyEl.classList.add("quarto-dark");
297      bodyEl.classList.remove("quarto-light");
298    } else {
299      bodyEl.classList.add("quarto-light");
300      bodyEl.classList.remove("quarto-dark");
301    }
302  }
303  const toggleBodyColorPrimary = () => {
304    const bsSheetEl = window.document.querySelector("link#quarto-bootstrap");
305    if (bsSheetEl) {
306      toggleBodyColorMode(bsSheetEl);
307    }
308  }
309  toggleBodyColorPrimary();  
310  const isCodeAnnotation = (el) => {
311    for (const clz of el.classList) {
312      if (clz.startsWith('code-annotation-')) {                     
313        return true;
314      }
315    }
316    return false;
317  }
318  const onCopySuccess = function(e) {
319    // button target
320    const button = e.trigger;
321    // don't keep focus
322    button.blur();
323    // flash "checked"
324    button.classList.add('code-copy-button-checked');
325    var currentTitle = button.getAttribute("title");
326    button.setAttribute("title", "Copied!");
327    let tooltip;
328    if (window.bootstrap) {
329      button.setAttribute("data-bs-toggle", "tooltip");
330      button.setAttribute("data-bs-placement", "left");
331      button.setAttribute("data-bs-title", "Copied!");
332      tooltip = new bootstrap.Tooltip(button, 
333        { trigger: "manual", 
334          customClass: "code-copy-button-tooltip",
335          offset: [0, -8]});
336      tooltip.show();    
337    }
338    setTimeout(function() {
339      if (tooltip) {
340        tooltip.hide();
341        button.removeAttribute("data-bs-title");
342        button.removeAttribute("data-bs-toggle");
343        button.removeAttribute("data-bs-placement");
344      }
345      button.setAttribute("title", currentTitle);
346      button.classList.remove('code-copy-button-checked');
347    }, 1000);
348    // clear code selection
349    e.clearSelection();
350  }
351  const getTextToCopy = function(trigger) {
352      const codeEl = trigger.previousElementSibling.cloneNode(true);
353      for (const childEl of codeEl.children) {
354        if (isCodeAnnotation(childEl)) {
355          childEl.remove();
356        }
357      }
358      return codeEl.innerText;
359  }
360  const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', {
361    text: getTextToCopy
362  });
363  clipboard.on('success', onCopySuccess);
364  if (window.document.getElementById('quarto-embedded-source-code-modal')) {
365    const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', {
366      text: getTextToCopy,
367      container: window.document.getElementById('quarto-embedded-source-code-modal')
368    });
369    clipboardModal.on('success', onCopySuccess);
370  }
371    var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
372    var mailtoRegex = new RegExp(/^mailto:/);
373      var filterRegex = new RegExp('/' + window.location.host + '/');
374    var isInternal = (href) => {
375        return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
376    }
377    // Inspect non-navigation links and adorn them if external
378 	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)');
379    for (var i=0; i<links.length; i++) {
380      const link = links[i];
381      if (!isInternal(link.href)) {
382        // undo the damage that might have been done by quarto-nav.js in the case of
383        // links that we want to consider external
384        if (link.dataset.originalHref !== undefined) {
385          link.href = link.dataset.originalHref;
386        }
387      }
388    }
389  function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
390    const config = {
391      allowHTML: true,
392      maxWidth: 500,
393      delay: 100,
394      arrow: false,
395      appendTo: function(el) {
396          return el.parentElement;
397      },
398      interactive: true,
399      interactiveBorder: 10,
400      theme: 'quarto',
401      placement: 'bottom-start',
402    };
403    if (contentFn) {
404      config.content = contentFn;
405    }
406    if (onTriggerFn) {
407      config.onTrigger = onTriggerFn;
408    }
409    if (onUntriggerFn) {
410      config.onUntrigger = onUntriggerFn;
411    }
412    window.tippy(el, config); 
413  }
414  const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
415  for (var i=0; i<noterefs.length; i++) {
416    const ref = noterefs[i];
417    tippyHover(ref, function() {
418      // use id or data attribute instead here
419      let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
420      try { href = new URL(href).hash; } catch {}
421      const id = href.replace(/^#\/?/, "");
422      const note = window.document.getElementById(id);
423      if (note) {
424        return note.innerHTML;
425      } else {
426        return "";
427      }
428    });
429  }
430  const xrefs = window.document.querySelectorAll('a.quarto-xref');
431  const processXRef = (id, note) => {
432    // Strip column container classes
433    const stripColumnClz = (el) => {
434      el.classList.remove("page-full", "page-columns");
435      if (el.children) {
436        for (const child of el.children) {
437          stripColumnClz(child);
438        }
439      }
440    }
441    stripColumnClz(note)
442    if (id === null || id.startsWith('sec-')) {
443      // Special case sections, only their first couple elements
444      const container = document.createElement("div");
445      if (note.children && note.children.length > 2) {
446        container.appendChild(note.children[0].cloneNode(true));
447        for (let i = 1; i < note.children.length; i++) {
448          const child = note.children[i];
449          if (child.tagName === "P" && child.innerText === "") {
450            continue;
451          } else {
452            container.appendChild(child.cloneNode(true));
453            break;
454          }
455        }
456        if (window.Quarto?.typesetMath) {
457          window.Quarto.typesetMath(container);
458        }
459        return container.innerHTML
460      } else {
461        if (window.Quarto?.typesetMath) {
462          window.Quarto.typesetMath(note);
463        }
464        return note.innerHTML;
465      }
466    } else {
467      // Remove any anchor links if they are present
468      const anchorLink = note.querySelector('a.anchorjs-link');
469      if (anchorLink) {
470        anchorLink.remove();
471      }
472      if (window.Quarto?.typesetMath) {
473        window.Quarto.typesetMath(note);
474      }
475      if (note.classList.contains("callout")) {
476        return note.outerHTML;
477      } else {
478        return note.innerHTML;
479      }
480    }
481  }
482  for (var i=0; i<xrefs.length; i++) {
483    const xref = xrefs[i];
484    tippyHover(xref, undefined, function(instance) {
485      instance.disable();
486      let url = xref.getAttribute('href');
487      let hash = undefined; 
488      if (url.startsWith('#')) {
489        hash = url;
490      } else {
491        try { hash = new URL(url).hash; } catch {}
492      }
493      if (hash) {
494        const id = hash.replace(/^#\/?/, "");
495        const note = window.document.getElementById(id);
496        if (note !== null) {
497          try {
498            const html = processXRef(id, note.cloneNode(true));
499            instance.setContent(html);
500          } finally {
501            instance.enable();
502            instance.show();
503          }
504        } else {
505          // See if we can fetch this
506          fetch(url.split('#')[0])
507          .then(res => res.text())
508          .then(html => {
509            const parser = new DOMParser();
510            const htmlDoc = parser.parseFromString(html, "text/html");
511            const note = htmlDoc.getElementById(id);
512            if (note !== null) {
513              const html = processXRef(id, note);
514              instance.setContent(html);
515            } 
516          }).finally(() => {
517            instance.enable();
518            instance.show();
519          });
520        }
521      } else {
522        // See if we can fetch a full url (with no hash to target)
523        // This is a special case and we should probably do some content thinning / targeting
524        fetch(url)
525        .then(res => res.text())
526        .then(html => {
527          const parser = new DOMParser();
528          const htmlDoc = parser.parseFromString(html, "text/html");
529          const note = htmlDoc.querySelector('main.content');
530          if (note !== null) {
531            // This should only happen for chapter cross references
532            // (since there is no id in the URL)
533            // remove the first header
534            if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
535              note.children[0].remove();
536            }
537            const html = processXRef(null, note);
538            instance.setContent(html);
539          } 
540        }).finally(() => {
541          instance.enable();
542          instance.show();
543        });
544      }
545    }, function(instance) {
546    });
547  }
548      let selectedAnnoteEl;
549      const selectorForAnnotation = ( cell, annotation) => {
550        let cellAttr = 'data-code-cell="' + cell + '"';
551        let lineAttr = 'data-code-annotation="' +  annotation + '"';
552        const selector = 'span[' + cellAttr + '][' + lineAttr + ']';
553        return selector;
554      }
555      const selectCodeLines = (annoteEl) => {
556        const doc = window.document;
557        const targetCell = annoteEl.getAttribute("data-target-cell");
558        const targetAnnotation = annoteEl.getAttribute("data-target-annotation");
559        const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation));
560        const lines = annoteSpan.getAttribute("data-code-lines").split(",");
561        const lineIds = lines.map((line) => {
562          return targetCell + "-" + line;
563        })
564        let top = null;
565        let height = null;
566        let parent = null;
567        if (lineIds.length > 0) {
568            //compute the position of the single el (top and bottom and make a div)
569            const el = window.document.getElementById(lineIds[0]);
570            top = el.offsetTop;
571            height = el.offsetHeight;
572            parent = el.parentElement.parentElement;
573          if (lineIds.length > 1) {
574            const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]);
575            const bottom = lastEl.offsetTop + lastEl.offsetHeight;
576            height = bottom - top;
577          }
578          if (top !== null && height !== null && parent !== null) {
579            // cook up a div (if necessary) and position it 
580            let div = window.document.getElementById("code-annotation-line-highlight");
581            if (div === null) {
582              div = window.document.createElement("div");
583              div.setAttribute("id", "code-annotation-line-highlight");
584              div.style.position = 'absolute';
585              parent.appendChild(div);
586            }
587            div.style.top = top - 2 + "px";
588            div.style.height = height + 4 + "px";
589            div.style.left = 0;
590            let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
591            if (gutterDiv === null) {
592              gutterDiv = window.document.createElement("div");
593              gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter");
594              gutterDiv.style.position = 'absolute';
595              const codeCell = window.document.getElementById(targetCell);
596              const gutter = codeCell.querySelector('.code-annotation-gutter');
597              gutter.appendChild(gutterDiv);
598            }
599            gutterDiv.style.top = top - 2 + "px";
600            gutterDiv.style.height = height + 4 + "px";
601          }
602          selectedAnnoteEl = annoteEl;
603        }
604      };
605      const unselectCodeLines = () => {
606        const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"];
607        elementsIds.forEach((elId) => {
608          const div = window.document.getElementById(elId);
609          if (div) {
610            div.remove();
611          }
612        });
613        selectedAnnoteEl = undefined;
614      };
615        // Handle positioning of the toggle
616    window.addEventListener(
617      "resize",
618      throttle(() => {
619        elRect = undefined;
620        if (selectedAnnoteEl) {
621          selectCodeLines(selectedAnnoteEl);
622        }
623      }, 10)
624    );
625    function throttle(fn, ms) {
626    let throttle = false;
627    let timer;
628      return (...args) => {
629        if(!throttle) { // first call gets through
630            fn.apply(this, args);
631            throttle = true;
632        } else { // all the others get throttled
633            if(timer) clearTimeout(timer); // cancel #2
634            timer = setTimeout(() => {
635              fn.apply(this, args);
636              timer = throttle = false;
637            }, ms);
638        }
639      };
640    }
641      // Attach click handler to the DT
642      const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
643      for (const annoteDlNode of annoteDls) {
644        annoteDlNode.addEventListener('click', (event) => {
645          const clickedEl = event.target;
646          if (clickedEl !== selectedAnnoteEl) {
647            unselectCodeLines();
648            const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active');
649            if (activeEl) {
650              activeEl.classList.remove('code-annotation-active');
651            }
652            selectCodeLines(clickedEl);
653            clickedEl.classList.add('code-annotation-active');
654          } else {
655            // Unselect the line
656            unselectCodeLines();
657            clickedEl.classList.remove('code-annotation-active');
658          }
659        });
660      }
661  const findCites = (el) => {
662    const parentEl = el.parentElement;
663    if (parentEl) {
664      const cites = parentEl.dataset.cites;
665      if (cites) {
666        return {
667          el,
668          cites: cites.split(' ')
669        };
670      } else {
671        return findCites(el.parentElement)
672      }
673    } else {
674      return undefined;
675    }
676  };
677  var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
678  for (var i=0; i<bibliorefs.length; i++) {
679    const ref = bibliorefs[i];
680    const citeInfo = findCites(ref);
681    if (citeInfo) {
682      tippyHover(citeInfo.el, function() {
683        var popup = window.document.createElement('div');
684        citeInfo.cites.forEach(function(cite) {
685          var citeDiv = window.document.createElement('div');
686          citeDiv.classList.add('hanging-indent');
687          citeDiv.classList.add('csl-entry');
688          var biblioDiv = window.document.getElementById('ref-' + cite);
689          if (biblioDiv) {
690            citeDiv.innerHTML = biblioDiv.innerHTML;
691          }
692          popup.appendChild(citeDiv);
693        });
694        return popup.innerHTML;
695      });
696    }
697  }
698});
699</script>
699
700</div> <!-- /content -->
701<footer class="footer">
702  <div class="nav-footer">
703    <div class="nav-footer-left">
704<p><span class="faux-block">Jean-Paul Renne, UNIL, 1015 Lausanne, Switzerland</span></p>
705</div>   
706    <div class="nav-footer-center">
707      &nbsp;
708    </div>
709    <div class="nav-footer-right">
710      &nbsp;
711    </div>
712  </div>
713</footer>
714
715
716
717
718</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.