PageSourceSearch

https://evoamphibia.com/about/

html evoamphibia.com collected 2026-10-08 01:52:53 UTC 34,098 bytes, 843 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.7.33">
6
7<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
8
9
10<title>Amphibian Genomics and Evolution Lab – Amphibian Genomics and Evolution Lab</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/quarto-nav/headroom.min.js"></script>
vendor: 1 bytes, line 27
27
28<script src="../site_libs/clipboard/clipboard.min.js"></script>
vendor: 1 bytes, line 28
28
29<script src="../site_libs/quarto-search/autocomplete.umd.js"></script>
vendor: 1 bytes, line 29
29
30<script src="../site_libs/quarto-search/fuse.min.js"></script>
vendor: 1 bytes, line 30
30
31<script src="../site_libs/quarto-search/quarto-search.js"></script>
31
32<meta name="quarto:offset" content="../">
33<link href="../assets/img/favicon.png" rel="icon" type="image/png">
34<script src="../site_libs/quarto-listing/list.min.js"></script>
vendor: 1 bytes, line 34
34
35<script src="../site_libs/quarto-listing/quarto-listing.js"></script>
vendor: 1 bytes, line 35
35
36<script src="../site_libs/quarto-html/quarto.js" type="module"></script>
vendor: 1 bytes, line 36
36
37<script src="../site_libs/quarto-html/tabsets/tabsets.js" type="module"></script>
vendor: 1 bytes, line 37
37
38<script src="../site_libs/quarto-html/popper.min.js"></script>
vendor: 1 bytes, line 38
38
39<script src="../site_libs/quarto-html/tippy.umd.min.js"></script>
39
40<link href="../site_libs/quarto-html/tippy.css" rel="stylesheet">
41<link href="../site_libs/quarto-html/quarto-syntax-highlighting-ea385d0e468b0dd5ea5bf0780b1290d9.css" rel="stylesheet" id="quarto-text-highlighting-styles">
42<script src="../site_libs/bootstrap/bootstrap.min.js"></script>
42
43<link href="../site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet">
44<link href="../site_libs/bootstrap/bootstrap-c1fac2584b48ed01fb6e278e36375074.min.css" rel="stylesheet" append-hash="true" id="quarto-bootstrap" data-mode="light">
45<link href="../site_libs/quarto-contrib/fontawesome6-1.2.0/all.min.css" rel="stylesheet">
46<link href="../site_libs/quarto-contrib/fontawesome6-1.2.0/latex-fontsize.css" rel="stylesheet">
47<link href="../site_libs/quarto-contrib/academicons-1.9.4/all.css" rel="stylesheet">
48<link href="../site_libs/quarto-contrib/academicons-1.9.4/size.css" rel="stylesheet">
49<script id="quarto-search-options" type="application/json">{
50  "location": "navbar",
51  "copy-button": false,
52  "collapse-after": 3,
53  "panel-placement": "end",
54  "type": "overlay",
55  "limit": 50,
56  "keyboard-shortcut": [
57    "f",
58    "/",
59    "s"
60  ],
61  "show-item-context": false,
62  "language": {
63    "search-no-results-text": "No results",
64    "search-matching-documents-text": "matching documents",
65    "search-copy-link-title": "Copy link to search",
66    "search-hide-matches-text": "Hide additional matches",
67    "search-more-match-text": "more match in this document",
68    "search-more-matches-text": "more matches in this document",
69    "search-clear-button-title": "Clear",
70    "search-text-placeholder": "",
71    "search-detached-cancel-button-title": "Cancel",
72    "search-submit-button-title": "Submit",
73    "search-label": "Search"
74  }
75}</script>
vendor: 1 bytes, line 75
75
76<script>
77
78  window.document.addEventListener("DOMContentLoaded", function (_event) {
79    const listingTargetEl = window.document.querySelector('#listing-news .list');
80    if (!listingTargetEl) {
81      // No listing discovered, do not attach.
82      return; 
83    }
84
85    const options = {
86      valueNames: ['listing-title','listing-subtitle','listing-image',{ data: ['index'] },{ data: ['categories'] },{ data: ['listing-date-sort'] },{ data: ['listing-file-modified-sort'] }],
87      
88      searchColumns: ["listing-title","listing-author","listing-date","listing-image","listing-description"],
89    };
90
91    window['quarto-listings'] = window['quarto-listings'] || {};
92    window['quarto-listings']['listing-news'] = new List('listing-news', options);
93
94    if (window['quarto-listing-loaded']) {
95      window['quarto-listing-loaded']();
96    }
97  });
98
99  window.addEventListener('hashchange',() => {
100    if (window['quarto-listing-loaded']) {
101      window['quarto-listing-loaded']();
102    }
103  })
104  
105
106  window.document.addEventListener("DOMContentLoaded", function (_event) {
107    const listingTargetEl = window.document.querySelector('#listing-featured .list');
108    if (!listingTargetEl) {
109      // No listing discovered, do not attach.
110      return; 
111    }
112
113    const options = {
114      valueNames: ['listing-title','listing-subtitle','listing-image',{ data: ['index'] },{ data: ['categories'] },{ data: ['listing-date-sort'] },{ data: ['listing-file-modified-sort'] }],
115      
116      searchColumns: ["listing-title","listing-author","listing-date","listing-image","listing-description"],
117    };
118
119    window['quarto-listings'] = window['quarto-listings'] || {};
120    window['quarto-listings']['listing-featured'] = new List('listing-featured', options);
121
122    if (window['quarto-listing-loaded']) {
123      window['quarto-listing-loaded']();
124    }
125  });
126
127  window.addEventListener('hashchange',() => {
128    if (window['quarto-listing-loaded']) {
129      window['quarto-listing-loaded']();
130    }
131  })
132  
133
134  window.document.addEventListener("DOMContentLoaded", function (_event) {
135    const listingTargetEl = window.document.querySelector('#listing-publication .list');
136    if (!listingTargetEl) {
137      // No listing discovered, do not attach.
138      return; 
139    }
140
141    const options = {
142      valueNames: ['listing-title','listing-image',{ data: ['index'] },{ data: ['categories'] },{ data: ['listing-date-sort'] },{ data: ['listing-file-modified-sort'] }],
143      
144      searchColumns: [],
145    };
146
147    window['quarto-listings'] = window['quarto-listings'] || {};
148    window['quarto-listings']['listing-publication'] = new List('listing-publication', options);
149
150    if (window['quarto-listing-loaded']) {
151      window['quarto-listing-loaded']();
152    }
153  });
154
155  window.addEventListener('hashchange',() => {
156    if (window['quarto-listing-loaded']) {
157      window['quarto-listing-loaded']();
158    }
159  })
160  
161
162  window.document.addEventListener("DOMContentLoaded", function (_event) {
163    const listingTargetEl = window.document.querySelector('#listing-project .list');
164    if (!listingTargetEl) {
165      // No listing discovered, do not attach.
166      return; 
167    }
168
169    const options = {
170      valueNames: ['listing-title','listing-subtitle','listing-image',{ data: ['index'] },{ data: ['categories'] },{ data: ['listing-date-sort'] },{ data: ['listing-file-modified-sort'] }],
171      
172      searchColumns: ["listing-title","listing-author","listing-date","listing-image","listing-description"],
173    };
174
175    window['quarto-listings'] = window['quarto-listings'] || {};
176    window['quarto-listings']['listing-project'] = new List('listing-project', options);
177
178    if (window['quarto-listing-loaded']) {
179      window['quarto-listing-loaded']();
180    }
181  });
182
183  window.addEventListener('hashchange',() => {
184    if (window['quarto-listing-loaded']) {
185      window['quarto-listing-loaded']();
186    }
187  })
188  </script>
188
189<link rel="stylesheet" href="../assets/about.css">
190
191  
191<script src="https://cdnjs.cloudflare.com/polyfill/v3/polyfill.min.js?features=es6"></script>
191
192  
192<script src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml-full.js" type="text/javascript"></script>
192
193
194<script type="text/javascript">
195const typesetMath = (el) => {
196  if (window.MathJax) {
197    // MathJax Typeset
198    window.MathJax.typeset([el]);
199  } else if (window.katex) {
200    // KaTeX Render
201    var mathElements = el.getElementsByClassName("math");
202    var macros = [];
203    for (var i = 0; i < mathElements.length; i++) {
204      var texText = mathElements[i].firstChild;
205      if (mathElements[i].tagName == "SPAN") {
206        window.katex.render(texText.data, mathElements[i], {
207          displayMode: mathElements[i].classList.contains('display'),
208          throwOnError: false,
209          macros: macros,
210          fleqn: false
211        });
212      }
213    }
214  }
215}
216window.Quarto = {
217  typesetMath
218};
219</script>
219
220
221</head>
222
223<body class="nav-fixed quarto-light">
224
225<div id="quarto-search-results"></div>
226  <header id="quarto-header" class="headroom fixed-top">
227    <nav class="navbar navbar-expand-lg " data-bs-theme="dark">
228      <div class="navbar-container container-fluid">
229      <div class="navbar-brand-container mx-auto">
230    <a href="../index.html" class="navbar-brand navbar-brand-logo">
231    <img src="../assets/img/evoamphibia_logo.png" alt="" class="navbar-logo">
232    </a>
233    <a class="navbar-brand" href="../index.html">
234    <span class="navbar-title">Amphibian Genomics and Evolution Lab</span>
235    </a>
236  </div>
237            <div id="quarto-search" class="" title="Search"></div>
238          <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(); }">
239  <span class="navbar-toggler-icon"></span>
240</button>
241          <div class="collapse navbar-collapse" id="navbarCollapse">
242            <ul class="navbar-nav navbar-nav-scroll ms-auto">
243  <li class="nav-item">
244    <a class="nav-link active" href="../about/index.html" aria-current="page"> 
245<span class="menu-text">About</span></a>
246  </li>  
247  <li class="nav-item">
248    <a class="nav-link" href="../project/index.html"> 
249<span class="menu-text">Projects</span></a>
250  </li>  
251  <li class="nav-item">
252    <a class="nav-link" href="../team/index.html"> 
253<span class="menu-text">Team</span></a>
254  </li>  
255  <li class="nav-item">
256    <a class="nav-link" href="../publications/index.html"> 
257<span class="menu-text">Publications</span></a>
258  </li>  
259  <li class="nav-item">
260    <a class="nav-link" href="../news/index.html"> 
261<span class="menu-text">News</span></a>
262  </li>  
263  <li class="nav-item">
264    <a class="nav-link" href="../featured/index.html"> 
265<span class="menu-text">Featured</span></a>
266  </li>  
267  <li class="nav-item">
268    <a class="nav-link" href="../wildlife/index.html"> 
269<span class="menu-text">Wildlife</span></a>
270  </li>  
271</ul>
272          </div> <!-- /navcollapse -->
273            <div class="quarto-navbar-tools">
274</div>
275      </div> <!-- /container-fluid -->
276    </nav>
277</header>
278<!-- content -->
279<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-full page-navbar">
280<!-- sidebar -->
281<!-- margin-sidebar -->
282    
283<!-- main -->
284<main class="content column-page" id="quarto-document-content">
285
286
287
288
289<div class="quarto-about-trestles column-page">
290  <div class="about-entity">
291    <img src="sidebar/evoamphibia_logos.png" alt="Frog and DNA logo" class="about-image
292  rounded " style="width: 14em;">
293<header id="title-block-header" class="quarto-title-block default">
294<div class="quarto-title">
295<h1 class="title">Amphibian Genomics and Evolution Lab</h1>
296<p class="subtitle lead">Evolution at different scales: From patterns to mechanisms</p>
297</div>
298<div class="quarto-title-meta column-page">
299  </div>
300</header>
301    <div class="about-links">
302  <a href="https://github.com/hcliedtke" class="about-link" rel="" target="">
303    <i class="bi bi-github"></i>
304     <span class="about-link-text"></span>
305  </a>
306  <a href="https://orcid.org/0000-0002-6221-8043" class="about-link" rel="" target="">
307     <span class="about-link-text"><i class="ai  ai-orcid" aria-label="orcid"></i></span>
308  </a>
309  <a href="https://scholar.google.com/citations?user=Mke2CrAAAAAJ&amp;hl=en" class="about-link" rel="" target="">
310     <span class="about-link-text"><i class="ai  ai-google-scholar" aria-label="google-scholar"></i></span>
311  </a>
312</div>
313  </div>
314  <div class="about-contents"><div id="hero-heading">
315<div class="h1">
316What we do
317</div>
318<p>Living amphibians inspire us to think about how the first vertebrates transitioned from aquatic to terrestrial habitats. Despite many millions of years of evolution since then, most amphibians are still tied to fresh water to varying degrees. Perhaps most directly so, because of their complex life cycles. Many species (though not all) have aquatic larval stages, which represent unique ecological, evolutionary and developmental challanges. We, at the Amphibian Genomics and Evolution Lab, at the <a href="https://www.ebd.csic.es/">Biological Station of Doñana</a>, are interested in applying different approaches to studying the evolution of amphibian traits (especially those related to the larval stage and reproductive modes) at different scales. From broad patterns in evolution across species, using comparative phylogenetic methods, down to the molecular mechanisms underlying plastic phenotypic changes, using transcriptomics and genomics.</p>
319<p>If you would like to get in touch <a href="../contact.html">sending us an email</a>! <i class="fa-solid fa-feather-pointed" aria-label="feather-pointed"></i></p>
320</div></div>
321</div>
322
323<!-- end grid -->
324<section id="what-we-have-been-up-to-lately" class="level2">
325<h2 data-anchor-id="what-we-have-been-up-to-lately">What we have been up to lately …</h2>
326<div class="grid">
327<section id="news" class="level4 g-col-3">
328<h4 data-anchor-id="news">News</h4>
329<div id="listing-news" class="quarto-listing quarto-listing-container-grid">
330<div class="list grid quarto-listing-cols-1">
331<div class="g-col-1" data-index="0" data-categories="Q29tcGFyYXRpdmUlMjBHZW5vbWljcyUyQ1RyYW5zY3JpcHRvbWljcyUyQ1ZpdmlwYXJpdHklMkNUYW56YW5pYQ==" data-listing-date-sort="1756504800000" data-listing-file-modified-sort="1788531482190" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="3" data-listing-word-count-sort="554">
332<a href="../news/grad-student-search/index.html" class="quarto-grid-link">
333<div class="quarto-grid-item card h-100 card-left">
334<p class="card-img-top">
335<img loading="lazy" src="../news/grad-student-search/featured.jpg" class="thumbnail-image card-img" style="height: 200;">
336</p>
337<div class="card-body post-contents">
338<h5 class="no-anchor card-title listing-title">
339Grad student position open! [POSITION FILLED]
340</h5>
341<div class="card-subtitle listing-subtitle">
342We are looking for a PhD student to join our lab.
343</div>
344</div>
345</div></a>
346</div>
347</div>
348<div class="listing-no-matching d-none">No matching items</div>
349</div>
350<p><a href="../news" class="about-links subtitle">See all →</a></p>
351</section>
352<section id="features-and-press" class="level4 g-col-3">
353<h4 data-anchor-id="features-and-press">Features and Press</h4>
354<div id="listing-featured" class="quarto-listing quarto-listing-container-grid">
355<div class="list grid quarto-listing-cols-1">
356<div class="g-col-1" data-index="0" data-categories="TmV3JTIwU3BlY2llcyUyQ1ZpdmlwYXJvdXMlMkNOZWN0b3Bocnlub2lkZXM=" data-listing-date-sort="1763074800000" data-listing-file-modified-sort="1763156055445" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="2" data-listing-word-count-sort="270">
357<a href="../featured/2025_uhehe/index.html" class="quarto-grid-link">
358<div class="quarto-grid-item card h-100 card-left">
359<p class="card-img-top">
360<img loading="lazy" src="../featured/2025_uhehe/featured.png" class="thumbnail-image card-img" style="height: 200;">
361</p>
362<div class="card-body post-contents">
363<h5 class="no-anchor card-title listing-title">
364Three new viviparous toads
365</h5>
366<div class="card-subtitle listing-subtitle">
367Using museomics to aid species descriptions.
368</div>
369</div>
370</div></a>
371</div>
372</div>
373<div class="listing-no-matching d-none">No matching items</div>
374</div>
375<p><a href="../featured" class="about-links subtitle">See all →</a></p>
376</section>
377<section id="projects" class="level4 g-col-3">
378<h4 data-anchor-id="projects">Projects</h4>
379<div id="listing-project" class="quarto-listing quarto-listing-container-grid">
380<div class="list grid quarto-listing-cols-1">
381<div class="g-col-1" data-index="0" data-categories="QW1waGliaWFucyUyQ0dlbm9taWNzJTJDVHJhbnNjcmlwdG9taWNzJTJDUGh5bG9nZW9ncmFwaHklMkNQaHlsb2dlbm9taWNzJTJDQnVmb25pZGFl" data-listing-date-sort="1753999200000" data-listing-file-modified-sort="1788531365712" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="2" data-listing-word-count-sort="393">
382<a href="../project/gravid/index.html" class="quarto-grid-link">
383<div class="quarto-grid-item card h-100 card-left">
384<p class="card-img-top">
385<img loading="lazy" src="../project/gravid/avatar.jpg" class="thumbnail-image card-img" style="height: 200;">
386</p>
387<div class="card-body post-contents">
388<h5 class="no-anchor card-title listing-title">
389GRAViD
390</h5>
391<div class="card-subtitle listing-subtitle">
392Genomic Regulation of Amphibian Viviparous Development.
393</div>
394</div>
395</div></a>
396</div>
397</div>
398<div class="listing-no-matching d-none">No matching items</div>
399</div>
400<p><a href="../project" class="about-links subtitle">See all →</a></p>
401</section>
402<section id="publications" class="level4 g-col-3">
403<h4 data-anchor-id="publications">Publications</h4>
404<div id="listing-publication" class="quarto-listing quarto-listing-container-grid">
405<div class="list grid quarto-listing-cols-1">
406
407</div>
408<div class="listing-no-matching d-none">No matching items</div>
409</div>
410<p><a href="../publications" class="about-links subtitle">See all →</a></p>
411</section>
412</div>
413
414
415
416
417</section>
418
419<a onclick="window.scrollTo(0, 0); return false;" role="button" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a></main> <!-- /main -->
420<script id="quarto-html-after-body" type="application/javascript">
421  window.document.addEventListener("DOMContentLoaded", function (event) {
422    const isCodeAnnotation = (el) => {
423      for (const clz of el.classList) {
424        if (clz.startsWith('code-annotation-')) {                     
425          return true;
426        }
427      }
428      return false;
429    }
430    const onCopySuccess = function(e) {
431      // button target
432      const button = e.trigger;
433      // don't keep focus
434      button.blur();
435      // flash "checked"
436      button.classList.add('code-copy-button-checked');
437      var currentTitle = button.getAttribute("title");
438      button.setAttribute("title", "Copied!");
439      let tooltip;
440      if (window.bootstrap) {
441        button.setAttribute("data-bs-toggle", "tooltip");
442        button.setAttribute("data-bs-placement", "left");
443        button.setAttribute("data-bs-title", "Copied!");
444        tooltip = new bootstrap.Tooltip(button, 
445          { trigger: "manual", 
446            customClass: "code-copy-button-tooltip",
447            offset: [0, -8]});
448        tooltip.show();    
449      }
450      setTimeout(function() {
451        if (tooltip) {
452          tooltip.hide();
453          button.removeAttribute("data-bs-title");
454          button.removeAttribute("data-bs-toggle");
455          button.removeAttribute("data-bs-placement");
456        }
457        button.setAttribute("title", currentTitle);
458        button.classList.remove('code-copy-button-checked');
459      }, 1000);
460      // clear code selection
461      e.clearSelection();
462    }
463    const getTextToCopy = function(trigger) {
464        const codeEl = trigger.previousElementSibling.cloneNode(true);
465        for (const childEl of codeEl.children) {
466          if (isCodeAnnotation(childEl)) {
467            childEl.remove();
468          }
469        }
470        return codeEl.innerText;
471    }
472    const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', {
473      text: getTextToCopy
474    });
475    clipboard.on('success', onCopySuccess);
476    if (window.document.getElementById('quarto-embedded-source-code-modal')) {
477      const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', {
478        text: getTextToCopy,
479        container: window.document.getElementById('quarto-embedded-source-code-modal')
480      });
481      clipboardModal.on('success', onCopySuccess);
482    }
483      var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
484      var mailtoRegex = new RegExp(/^mailto:/);
485        var filterRegex = new RegExp("https:\/\/www\.christophliedtke\.com");
486      var isInternal = (href) => {
487          return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
488      }
489      // Inspect non-navigation links and adorn them if external
490     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)');
491      for (var i=0; i<links.length; i++) {
492        const link = links[i];
493        if (!isInternal(link.href)) {
494          // undo the damage that might have been done by quarto-nav.js in the case of
495          // links that we want to consider external
496          if (link.dataset.originalHref !== undefined) {
497            link.href = link.dataset.originalHref;
498          }
499        }
500      }
501    function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
502      const config = {
503        allowHTML: true,
504        maxWidth: 500,
505        delay: 100,
506        arrow: false,
507        appendTo: function(el) {
508            return el.parentElement;
509        },
510        interactive: true,
511        interactiveBorder: 10,
512        theme: 'quarto',
513        placement: 'bottom-start',
514      };
515      if (contentFn) {
516        config.content = contentFn;
517      }
518      if (onTriggerFn) {
519        config.onTrigger = onTriggerFn;
520      }
521      if (onUntriggerFn) {
522        config.onUntrigger = onUntriggerFn;
523      }
524      window.tippy(el, config); 
525    }
526    const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
527    for (var i=0; i<noterefs.length; i++) {
528      const ref = noterefs[i];
529      tippyHover(ref, function() {
530        // use id or data attribute instead here
531        let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
532        try { href = new URL(href).hash; } catch {}
533        const id = href.replace(/^#\/?/, "");
534        const note = window.document.getElementById(id);
535        if (note) {
536          return note.innerHTML;
537        } else {
538          return "";
539        }
540      });
541    }
542    const xrefs = window.document.querySelectorAll('a.quarto-xref');
543    const processXRef = (id, note) => {
544      // Strip column container classes
545      const stripColumnClz = (el) => {
546        el.classList.remove("page-full", "page-columns");
547        if (el.children) {
548          for (const child of el.children) {
549            stripColumnClz(child);
550          }
551        }
552      }
553      stripColumnClz(note)
554      if (id === null || id.startsWith('sec-')) {
555        // Special case sections, only their first couple elements
556        const container = document.createElement("div");
557        if (note.children && note.children.length > 2) {
558          container.appendChild(note.children[0].cloneNode(true));
559          for (let i = 1; i < note.children.length; i++) {
560            const child = note.children[i];
561            if (child.tagName === "P" && child.innerText === "") {
562              continue;
563            } else {
564              container.appendChild(child.cloneNode(true));
565              break;
566            }
567          }
568          if (window.Quarto?.typesetMath) {
569            window.Quarto.typesetMath(container);
570          }
571          return container.innerHTML
572        } else {
573          if (window.Quarto?.typesetMath) {
574            window.Quarto.typesetMath(note);
575          }
576          return note.innerHTML;
577        }
578      } else {
579        // Remove any anchor links if they are present
580        const anchorLink = note.querySelector('a.anchorjs-link');
581        if (anchorLink) {
582          anchorLink.remove();
583        }
584        if (window.Quarto?.typesetMath) {
585          window.Quarto.typesetMath(note);
586        }
587        if (note.classList.contains("callout")) {
588          return note.outerHTML;
589        } else {
590          return note.innerHTML;
591        }
592      }
593    }
594    for (var i=0; i<xrefs.length; i++) {
595      const xref = xrefs[i];
596      tippyHover(xref, undefined, function(instance) {
597        instance.disable();
598        let url = xref.getAttribute('href');
599        let hash = undefined; 
600        if (url.startsWith('#')) {
601          hash = url;
602        } else {
603          try { hash = new URL(url).hash; } catch {}
604        }
605        if (hash) {
606          const id = hash.replace(/^#\/?/, "");
607          const note = window.document.getElementById(id);
608          if (note !== null) {
609            try {
610              const html = processXRef(id, note.cloneNode(true));
611              instance.setContent(html);
612            } finally {
613              instance.enable();
614              instance.show();
615            }
616          } else {
617            // See if we can fetch this
618            fetch(url.split('#')[0])
619            .then(res => res.text())
620            .then(html => {
621              const parser = new DOMParser();
622              const htmlDoc = parser.parseFromString(html, "text/html");
623              const note = htmlDoc.getElementById(id);
624              if (note !== null) {
625                const html = processXRef(id, note);
626                instance.setContent(html);
627              } 
628            }).finally(() => {
629              instance.enable();
630              instance.show();
631            });
632          }
633        } else {
634          // See if we can fetch a full url (with no hash to target)
635          // This is a special case and we should probably do some content thinning / targeting
636          fetch(url)
637          .then(res => res.text())
638          .then(html => {
639            const parser = new DOMParser();
640            const htmlDoc = parser.parseFromString(html, "text/html");
641            const note = htmlDoc.querySelector('main.content');
642            if (note !== null) {
643              // This should only happen for chapter cross references
644              // (since there is no id in the URL)
645              // remove the first header
646              if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
647                note.children[0].remove();
648              }
649              const html = processXRef(null, note);
650              instance.setContent(html);
651            } 
652          }).finally(() => {
653            instance.enable();
654            instance.show();
655          });
656        }
657      }, function(instance) {
658      });
659    }
660        let selectedAnnoteEl;
661        const selectorForAnnotation = ( cell, annotation) => {
662          let cellAttr = 'data-code-cell="' + cell + '"';
663          let lineAttr = 'data-code-annotation="' +  annotation + '"';
664          const selector = 'span[' + cellAttr + '][' + lineAttr + ']';
665          return selector;
666        }
667        const selectCodeLines = (annoteEl) => {
668          const doc = window.document;
669          const targetCell = annoteEl.getAttribute("data-target-cell");
670          const targetAnnotation = annoteEl.getAttribute("data-target-annotation");
671          const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation));
672          const lines = annoteSpan.getAttribute("data-code-lines").split(",");
673          const lineIds = lines.map((line) => {
674            return targetCell + "-" + line;
675          })
676          let top = null;
677          let height = null;
678          let parent = null;
679          if (lineIds.length > 0) {
680              //compute the position of the single el (top and bottom and make a div)
681              const el = window.document.getElementById(lineIds[0]);
682              top = el.offsetTop;
683              height = el.offsetHeight;
684              parent = el.parentElement.parentElement;
685            if (lineIds.length > 1) {
686              const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]);
687              const bottom = lastEl.offsetTop + lastEl.offsetHeight;
688              height = bottom - top;
689            }
690            if (top !== null && height !== null && parent !== null) {
691              // cook up a div (if necessary) and position it 
692              let div = window.document.getElementById("code-annotation-line-highlight");
693              if (div === null) {
694                div = window.document.createElement("div");
695                div.setAttribute("id", "code-annotation-line-highlight");
696                div.style.position = 'absolute';
697                parent.appendChild(div);
698              }
699              div.style.top = top - 2 + "px";
700              div.style.height = height + 4 + "px";
701              div.style.left = 0;
702              let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
703              if (gutterDiv === null) {
704                gutterDiv = window.document.createElement("div");
705                gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter");
706                gutterDiv.style.position = 'absolute';
707                const codeCell = window.document.getElementById(targetCell);
708                const gutter = codeCell.querySelector('.code-annotation-gutter');
709                gutter.appendChild(gutterDiv);
710              }
711              gutterDiv.style.top = top - 2 + "px";
712              gutterDiv.style.height = height + 4 + "px";
713            }
714            selectedAnnoteEl = annoteEl;
715          }
716        };
717        const unselectCodeLines = () => {
718          const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"];
719          elementsIds.forEach((elId) => {
720            const div = window.document.getElementById(elId);
721            if (div) {
722              div.remove();
723            }
724          });
725          selectedAnnoteEl = undefined;
726        };
727          // Handle positioning of the toggle
728      window.addEventListener(
729        "resize",
730        throttle(() => {
731          elRect = undefined;
732          if (selectedAnnoteEl) {
733            selectCodeLines(selectedAnnoteEl);
734          }
735        }, 10)
736      );
737      function throttle(fn, ms) {
738      let throttle = false;
739      let timer;
740        return (...args) => {
741          if(!throttle) { // first call gets through
742              fn.apply(this, args);
743              throttle = true;
744          } else { // all the others get throttled
745              if(timer) clearTimeout(timer); // cancel #2
746              timer = setTimeout(() => {
747                fn.apply(this, args);
748                timer = throttle = false;
749              }, ms);
750          }
751        };
752      }
753        // Attach click handler to the DT
754        const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
755        for (const annoteDlNode of annoteDls) {
756          annoteDlNode.addEventListener('click', (event) => {
757            const clickedEl = event.target;
758            if (clickedEl !== selectedAnnoteEl) {
759              unselectCodeLines();
760              const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active');
761              if (activeEl) {
762                activeEl.classList.remove('code-annotation-active');
763              }
764              selectCodeLines(clickedEl);
765              clickedEl.classList.add('code-annotation-active');
766            } else {
767              // Unselect the line
768              unselectCodeLines();
769              clickedEl.classList.remove('code-annotation-active');
770            }
771          });
772        }
773    const findCites = (el) => {
774      const parentEl = el.parentElement;
775      if (parentEl) {
776        const cites = parentEl.dataset.cites;
777        if (cites) {
778          return {
779            el,
780            cites: cites.split(' ')
781          };
782        } else {
783          return findCites(el.parentElement)
784        }
785      } else {
786        return undefined;
787      }
788    };
789    var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
790    for (var i=0; i<bibliorefs.length; i++) {
791      const ref = bibliorefs[i];
792      const citeInfo = findCites(ref);
793      if (citeInfo) {
794        tippyHover(citeInfo.el, function() {
795          var popup = window.document.createElement('div');
796          citeInfo.cites.forEach(function(cite) {
797            var citeDiv = window.document.createElement('div');
798            citeDiv.classList.add('hanging-indent');
799            citeDiv.classList.add('csl-entry');
800            var biblioDiv = window.document.getElementById('ref-' + cite);
801            if (biblioDiv) {
802              citeDiv.innerHTML = biblioDiv.innerHTML;
803            }
804            popup.appendChild(citeDiv);
805          });
806          return popup.innerHTML;
807        });
808      }
809    }
810  });
811  </script>
vendor: 1 bytes, line 811
811
812<script src="https://utteranc.es/client.js" repo="hcliedtke/website" issue-term="title" theme="body-light" crossorigin="anonymous" async="">
813</script>
813
814</div> <!-- /content -->
815<footer class="footer">
816  <div class="nav-footer">
817    <div class="nav-footer-left">
818<p>© 2025 H. Christoph Liedtke ∙ Made with <a href="https://quarto.org">Quarto</a></p>
819</div>   
820    <div class="nav-footer-center">
821<p><a class="link-dark me-1" href="https://github.com/hcliedtke" title="github" target="_blank" rel="noopener"><i class="fa-brands fa-github" aria-label="github"></i></a> <a class="link-dark me-1" href="https://orcid.org/0000-0002-6221-8043" title="orcid" target="_blank" rel="noopener"><i class="ai  ai-orcid" aria-label="orcid"></i></a> <a class="link-dark me-1" href="https://scholar.google.com/citations?user=Mke2CrAAAAAJ&amp;hl=en" title="Google Scholar" target="_blank" rel="noopener"><i class="ai  ai-google-scholar" aria-label="google-scholar"></i></a></p>
822</div>
823    <div class="nav-footer-right">
824      <ul class="footer-items list-unstyled">
825    <li class="nav-item">
826    <a class="nav-link" href="../contact.html">
827<p>Contact</p>
828</a>
829  </li>  
830    <li class="nav-item">
831    <a class="nav-link" href="../license.html">
832<p>License</p>
833</a>
834  </li>  
835</ul>
836    </div>
837  </div>
838</footer>
839
840
841
842
843</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.