1<!DOCTYPE HTML> 2<html lang="en" class="sidebar-visible no-js light"> 3 <head> 4 <!-- Book generated using mdBook --> 5 <meta charset="UTF-8"> 6<!-- This site is hosted on Netlify. Anyone can build and deploy a site 7 like this one for free: https://netlify.new/?utm_campaign=loops&utm_source=ai-legible&utm_medium=owned&utm_content=comment&utm_id=ecd49ac0-53d7-4a9c-9709-74d5753720c3 8 Netlify hosting facts for this site: static/SSR served via Netlify Edge. --> 9 <title>Introduction - OWASP EKS Goat: AWS EKS Security Masterclass Guide</title> 10 11 12 <meta content="text/html; charset=utf-8" http-equiv="Content-Type"> 13 <meta name="description" content="Step-by-step AWS EKS security walkthrough using OWASP EKS Goat â from vulnerable cluster deployment to exploitation and defense with tools like Kyverno, GuardDuty, and eBPF Tetragon."> 14 <meta name="viewport" content="width=device-width, initial-scale=1"> 15 <meta name="theme-color" content="#ffffff" /> 16 17 <link rel="shortcut icon" href="../favicon.png"> 18 <link rel="stylesheet" href="../css/variables.css"> 19 <link rel="stylesheet" href="../css/general.css"> 20 <link rel="stylesheet" href="../css/chrome.css"> 21 <link rel="stylesheet" href="../css/print.css" media="print"> 22 23 <!-- Fonts --> 24 <link rel="stylesheet" href="../FontAwesome/css/font-awesome.css"> 25 <link href="https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800" rel="stylesheet" type="text/css"> 26 <link href="https://fonts.googleapis.com/css?family=Source+Code+Pro:500" rel="stylesheet" type="text/css"> 27 28 <!-- Highlight.js Stylesheets --> 29 <link rel="stylesheet" href="../highlight.css"> 30 <link rel="stylesheet" href="../tomorrow-night.css"> 31 <link rel="stylesheet" href="../ayu-highlight.css"> 32 33 <!-- Custom theme stylesheets --> 34 35 <link rel="stylesheet" href="../disable_text_selection.css"> 36 37 38 39 </head> 40 <body> 41 <!-- Provide site root to javascript --> 42
42<script type="text/javascript"> 43 var path_to_root = "../"; 44 var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "light" : "light"; 45 </script>
45 46 47 <!-- Work around some values being stored in localStorage wrapped in quotes --> 48
48<script type="text/javascript"> 49 try { 50 var theme = localStorage.getItem('mdbook-theme'); 51 var sidebar = localStorage.getItem('mdbook-sidebar'); 52 53 if (theme.startsWith('"') && theme.endsWith('"')) { 54 localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); 55 } 56 57 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { 58 localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); 59 } 60 } catch (e) { } 61 </script>
61 62 63 <!-- Set the theme before any content is loaded, prevents flash --> 64
64<script type="text/javascript"> 65 var theme; 66 try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } 67 if (theme === null || theme === undefined) { theme = default_theme; } 68 var html = document.querySelector('html'); 69 html.classList.remove('no-js') 70 html.classList.remove('light') 71 html.classList.add(theme); 72 html.classList.add('js'); 73 </script>
73 74 75 <!-- Hide / unhide sidebar before it is displayed --> 76
76<script type="text/javascript"> 77 var html = document.querySelector('html'); 78 var sidebar = 'hidden'; 79 if (document.body.clientWidth >= 1080) { 80 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } 81 sidebar = sidebar || 'visible'; 82 } 83 html.classList.remove('sidebar-visible'); 84 html.classList.add("sidebar-" + sidebar); 85 </script>
85 86 87 <nav id="sidebar" class="sidebar" aria-label="Table of contents"> 88 <div id="sidebar-scrollbox" class="sidebar-scrollbox"> 89 <ol class="chapter"><li class="expanded "><a href='/welcome/'><strong aria-hidden="true">1.</strong> Welcome</a></li><li><ol class="section"><li class="expanded "><a class='active' href='/welcome/introduction'><strong aria-hidden="true">1.1.</strong> Introduction</a></li><li class="expanded "><a href='/welcome/agenda'><strong aria-hidden="true">1.2.</strong> Agenda</a></li><li class="expanded "><a href='/prerequisites/'><strong aria-hidden="true">1.3.</strong> Prerequisites</a></li></ol></li><li class="expanded "><a href='/basics/'><strong aria-hidden="true">2.</strong> Github Codespace Setup </a></li><li><ol class="section"><li class="expanded "><a href='/basics/lab_setup'><strong aria-hidden="true">2.1.</strong> Lab Environment Setup</a></li><li><ol class="section"><li class="expanded "><a href='/basics/setup_iam_user'><strong aria-hidden="true">2.1.1.</strong> Setup AWS IAM User</a></li><li class="expanded "><a href='/basics/gh_deploy'><strong aria-hidden="true">2.1.2.</strong> Setup Github Codespace</a></li></ol></li></ol></li><li class="expanded "><a href='/basics/basics_of_docker'><strong aria-hidden="true">3.</strong> Introduction to Docker</a></li><li><ol class="section"><li class="expanded "><a href='/basics/container_security'><strong aria-hidden="true">3.1.</strong> Container Security Overview</a></li><li><ol class="section"><li class="expanded "><a href='/basics/docker_working'><strong aria-hidden="true">3.1.1.</strong> Lab: Docker Working</a></li><li class="expanded "><a href='/basics/docker_namespaces_and_cgroups'><strong aria-hidden="true">3.1.2.</strong> Docker Namespaces and Control Groups (CGroups)</a></li><li class="expanded "><a href='/basics/docker_images_and_layers'><strong aria-hidden="true">3.1.3.</strong> Understanding Docker Images and Layers</a></li><li class="expanded "><a href='/basics/docker_secrets_and_inspection'><strong aria-hidden="true">3.1.4.</strong> Docker Secrets</a></li></ol></li><li class="expanded "><a href='/basics/sast_for_docker'><strong aria-hidden="true">3.2.</strong> Static Analysis of Docker Containers (SAST)</a></li><li><ol class="section"><li class="expanded "><a href='/basics/dockle_and_hadolint'><strong aria-hidden="true">3.2.1.</strong> Using Dockle and Hadolint</a></li><li class="expanded "><a href='/basics/docker_bench_security'><strong aria-hidden="true">3.2.2.</strong> Audits with AquaSecurity Docker Bench Security</a></li></ol></li></ol></li><li class="expanded "><a href='/basics/aws_ecr_overview'><strong aria-hidden="true">4.</strong> AWS Elastic Container Registry (ECR) Overview</a></li><li><ol class="section"><li class="expanded "><a href='/basics/lab_image_scanning'><strong aria-hidden="true">4.1.</strong> AWS ECR Image Scanning</a></li><li class="expanded "><a href='/basics/lab_securing_ecr'><strong aria-hidden="true">4.2.</strong> AWS ECR Immutable Image Tag</a></li></ol></li><li class="expanded "><a href='/basics/eks'><strong aria-hidden="true">5.</strong> AWS EKS Fundamentals</a></li><li><ol class="section"><li class="expanded "><a href='/basics/lab_deploy_sample_app'><strong aria-hidden="true">5.1.</strong> Lab: Deploying a Vulnerable AWS EKS Infra</a></li><li><ol class="section"><li class="expanded "><a href='/basics/k8s'><strong aria-hidden="true">5.1.1.</strong> Kubernetes Architecture</a></li><li class="expanded "><a href='/basics/eks_terminologies'><strong aria-hidden="true">5.1.2.</strong> AWS EKS Terminologies</a></li><li class="expanded "><a href='/basics/eks_access_management'><strong aria-hidden="true">5.1.3.</strong> EKS Authentication & Authorisation</a></li></ol></li><li class="expanded "><a href='/basics/lab_exploit_app'><strong aria-hidden="true">5.2.</strong> Lab: Exploiting the Sample Application</a></li><li><ol class="section"><li class="expanded "><a href='/basics/lab_exploit_app_1'><strong aria-hidden="true">5.2.1.</strong> Lab: Enumerate & exploit web application for vulnerablility</a></li><li class="expanded "><a href='/basics/lab_postexploit_app_1'><strong aria-hidden="true">5.2.2.</strong> Lab: Using IMDSv2 to exfiltrate Credentials</a></li><li class="expanded "><a href='/basics/lab_exploit_app_3'><strong aria-hidden="true">5.2.3.</strong> Lab: Enumerate ECR repositories using credentials</a></li><li class="expanded "><a href='/basics/lab_exploit_app_4'><strong aria-hidden="true">5.2.4.</strong> Lab: Backdooring a Docker Image</a></li><li class="expanded "><a href='/basics/lab_exploit_app_5'><strong aria-hidden="true">5.2.5.</strong> Lab: Exploiting AWS EKS Cluster</a></li><li class="expanded "><a href='/basics/labx_exploit_app_6'><strong aria-hidden="true">5.2.6.</strong> Lab: Breaking Out from Pod to Node</a></li><li class="expanded "><a href='/basics/lab_exploit_app_7'><strong aria-hidden="true">5.2.7.</strong> Lab: Privilege Escalation & S3 Exploitation</a></li><li class="expanded "><a href='/basics/lab_exploit_app_8'><strong aria-hidden="true">5.2.8.</strong> Lab: Cleanup EC2 Instance</a></li></ol></li></ol></li><li class="expanded "><a href='/basics/kubernetes_security_scanning'><strong aria-hidden="true">6.</strong> Automated Scanning in EKS</a></li><li><ol class="section"><li class="expanded "><a href='/basics/kubescape'><strong aria-hidden="true">6.1.</strong> Scanning using Kubescape</a></li><li class="expanded "><a href='/basics/kubebench'><strong aria-hidden="true">6.2.</strong> Scanning using Kubebench</a></li></ol></li><li class="expanded "><a href='/basics/defensive_security_in_eks'><strong aria-hidden="true">7.</strong> Defense & Hardening in EKS</a></li><li><ol class="section"><li class="expanded "><a href='/basics/aws_guardduty'><strong aria-hidden="true">7.1.</strong> AWS GuardDuty for Threat Detection</a></li></ol></li><li class="expanded "><a href='/basics/destroy'><strong aria-hidden="true">8.</strong> Lab: Destroy EKS Vulnerable Infra</a></li><li class="expanded "><a href='/closing/thank-you'><strong aria-hidden="true">9.</strong> Thank you</a></li></ol> 90 </div> 91 <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> 92 </nav> 93 94 <div id="page-wrapper" class="page-wrapper"> 95 96 <div class="page"> 97 98 <div id="menu-bar" class="menu-bar"> 99 <div id="menu-bar-sticky-container"> 100 <div class="left-buttons"> 101 <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> 102 <i class="fa fa-bars"></i> 103 </button> 104 <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> 105 <i class="fa fa-paint-brush"></i> 106 </button> 107 <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> 108 <li role="none"><button role="menuitem" class="theme" id="light">Light (default)</button></li> 109 <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> 110 <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> 111 <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> 112 <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> 113 </ul> 114 115 <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> 116 <i class="fa fa-search"></i> 117 </button> 118 119 </div> 120 121 <h1 class="menu-title">OWASP EKS Goat: AWS EKS Security Masterclass Guide</h1> 122 123 <div class="right-buttons"> 124 <a aria-label='Print this book' href='/print' title='Print this book'> 125 <i id="print-button" class="fa fa-print"></i> 126 </a> 127 128 </div> 129 </div> 130 </div> 131 132 133 <div id="search-wrapper" class="hidden"> 134 <form id="searchbar-outer" class="searchbar-outer"> 135 <input type="search" name="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> 136 </form> 137 <div id="searchresults-outer" class="searchresults-outer hidden"> 138 <div id="searchresults-header" class="searchresults-header"></div> 139 <ul id="searchresults"> 140 </ul> 141 </div> 142 </div> 143 144 145 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> 146
146<script type="text/javascript"> 147 document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); 148 document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); 149 Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { 150 link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); 151 }); 152 </script>
152 153 154 <div id="content" class="content"> 155 <main> 156 <h1><a class="header" href="#introduction" id="introduction">Introduction</a></h1> 157<p>As organizations increasingly adopt microservices and distributed architectures, ensuring the security of Kubernetes environments becomes critical. This course introduces participants to the essential concepts of container and Kubernetes security, with a focus on AWS EKS. You will learn about common vulnerabilities, tools, and techniques for attacking and securing applications within EKS clusters. The course will also guide you through security audits, leveraging industry best practices, tools, and custom scripts to evaluate and enhance the security posture of your Kubernetes deployments.</p> 158<p>Throughout the course, real-world examples from penetration testing engagements will be shared, bridging the gap between theoretical knowledge and practical application. By the end of this training, you will be well-equipped to identify, exploit, and secure applications running in AWS EKS clusters.</p> 159<h1><a class="header" href="#prerequisite-mandatory" id="prerequisite-mandatory">Prerequisite (Mandatory)</a></h1> 160<ul> 161<li><strong>GitHub Codespace Setup</strong>: Use GitHub Codespace to set credentials and deploy infrastructure for learning.</li> 162<li><strong>Bring Your Own AWS Account</strong>: Participants must bring their own AWS account with billing enabled and admin privileges.</li> 163<li><strong>Bring Your Laptop</strong>: Ensure you have your laptop ready for hands-on activities.</li> 164</ul> 165<h1><a class="header" href="#takeaways" id="takeaways">Takeaways</a></h1> 166<ul> 167<li><strong>In-depth Hands-on Training</strong>: Led by experienced professionals in AWS & EKS Security.</li> 168<li><strong>Extended Lab Access</strong>: Enjoy access to course content after the class to reinforce your learning.</li> 169<li><strong>Real World Scenario</strong>: Test your skills with a real-world vulnerable scenario leading to AWS EKS exploitation.</li> 170<li><strong>Comprehensive Course Materials</strong>: Receive a training presentation covering all the content discussed during the course.</li> 171</ul> 172<h1><a class="header" href="#disclaimer" id="disclaimer">Disclaimer</a></h1> 173<ul> 174<li> 175<p>The information, commands, and demonstrations presented in this course, <strong>AWS EKS Security Masterclass - From Exploitation to Defense</strong>, are intended strictly for educational purposes. Under no circumstances should they be used to compromise or attack any system outside the boundaries of this educational session unless explicit permission has been granted.</p> 176<ul> 177<li><b>This course is provided by the instructors independently and is not endorsed by their employers or any other corporate entity. The content does not necessarily reflect the views or policies of any company or professional organization associated with the instructors.</b></li> 178</ul> 179</li> 180<li> 181<p><strong>Usage of Training Material</strong>: The training material is provided without warranties or guarantees. Participants are responsible for applying the techniques or methods discussed during the training. The trainers and their respective employers or affiliated companies are not liable for any misuse or misapplication of the information provided.</p> 182</li> 183<li> 184<p><strong>Liability</strong>: The trainers, their employers, and any affiliated companies are not responsible for any direct, indirect, incidental, or consequential damages arising from the use of the information provided in this course. No responsibility is assumed for any injury or damage to persons, property, or systems as a result of using or operating any methods, products, instructions, or ideas discussed during the training.</p> 185</li> 186<li> 187<p><strong>Intellectual Property</strong>: This course and all accompanying materials, including slides, worksheets, and documentation, are the intellectual property of the trainers. They are shared under the GPL-3.0 license, which requires that appropriate credit be given to the trainers whenever the materials are used, modified, or redistributed.</p> 188</li> 189<li> 190<p><strong>References</strong>: Some of the labs referenced in this workshop are based on open-source materials available at <a href="https://github.com/aws-samples/amazon-eks-security-immersion-day">Amazon EKS Security Immersion Day</a> GitHub repository, licensed under the MIT License. Additionally, modifications and fixes have been applied using AI tools such as Amazon Q, ChatGPT, and Gemini.</p> 191</li> 192<li> 193<p><strong>Educational Purpose</strong>: This lab is for educational purposes only. Do not attack or test any website or network without proper authorization. The trainers are not liable or responsible for any misuse.</p> 194</li> 195<li> 196<p><strong>Usage Rights</strong>
196: Individuals are permitted to use this course for instructional purposes, provided that no fees are charged to the students.</p> 197</li> 198</ul> 199<h2><a class="header" href="#credits" id="credits">Credits</a></h2> 200<blockquote> 201<p>Reach out in case of missing credits. </p> 202</blockquote> 203<ul> 204<li><a href="https://kubernetes.io/docs/concepts/architecture/">Kubernetes Architecture</a></li> 205<li>Credits for image: Offensive Security Say â Try Harder!</li> 206<li><a href="https://madhuakula.com/kubernetes-goat/docs/owasp-kubernetes-top-ten/">madhuakula</a></li> 207<li><a href="https://github.com/vulhub/vulhub/tree/master/jenkins/CVE-2024-23897">vulhub</a></li> 208<li><a href="https://github.com/aws-samples/amazon-eks-security-immersion-day">Amazon EKS Security Immersion Day</a></li> 209<li><a href="https://www.eksworkshop.com/docs/security/guardduty/log-monitoring/">eksworkshop.com - GuardDuty Log Monitoring</a></li> 210<li><a href="https://kubernetes.io/docs/concepts/architecture/">Kubernetes Architecture</a></li> 211<li><a href="https://tech.groww.in/kyverno-a-kubernetes-native-policy-management-bdd5bc80b8ca">Tech Blog by Anoop Ka - Kyverno</a></li> 212<li><a href="https://www.microsoft.com/en-us/security/blog/2020/04/02/attack-matrix-kubernetes/">Microsoft Attack Matrix for Kubernetes</a></li> 213<li><a href="https://securitylabs.datadoghq.com/articles/amazon-eks-attacking-securing-cloud-identities">Datadog Security Labs - EKS Attacking & Securing Cloud Identities</a></li> 214<li><a href="https://cloud.hacktricks.xyz/pentesting-cloud/aws-security/aws-services/aws-eks-enum">HackTricks AWS EKS Enumeration</a></li> 215<li><a href="https://aws.github.io/aws-eks-best-practices/security/docs/">AWS EKS Best Practices</a></li> 216<li><a href="https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/setting-up-enable-IAM.html">Amazon EMR IAM Setup for EKS</a></li> 217<li><a href="https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html">AWS EKS Pod Identities</a></li> 218<li><a href="https://anaisurl.com/container-image-layers-explained/">Anais URL - Container Image Layers Explained</a></li> 219<li><a href="https://about.gitlab.com/topics/devsecops/beginners-guide-to-container-security/">GitLab - Beginnerâs Guide to Container Security</a></li> 220<li><a href="https://www.wiz.io/academy/what-is-container-security">Wiz.io Academy - What is Container Security</a></li> 221<li><a href="https://jfrog.com/blog/10-helm-tutorials-to-start-your-kubernetes-journey/">JFrog Blog - 10 Helm Tutorials</a></li> 222<li><a href="https://securitylabs.datadoghq.com/articles/amazon-eks-attacking-securing-cloud-identities/#authorization-eks-cluster-access-management-recommended">Datadog Security Labs - EKS Cluster Access Management</a></li> 223<li><a href="https://chatgpt.com">ChatGPT - For Re-phrasing & Re-writing</a></li> 224<li><a href="https://okeyebereblessing.medium.com/how-to-configure-and-manage-authentication-and-authorization-in-aws-elastic-kubernetes-service-367a49ab3f9f">Okey Ebere Blessing - AWS EKS Authentication & Authorization</a></li> 225<li><a href="https://www.microsoft.com/en-us/security/blog/2020/04/02/attack-matrix-kubernetes/">Microsoft Blog - Attack Matrix for Kubernetes</a></li> 226<li><a href="https://medium.com/@subbarajpenmetsa/open-policy-agent-opa-gatekeeper-for-amazon-eks-507dd1edc72d">Subbaraj Penmetsa - OPA Gatekeeper for Amazon EKS</a></li> 227<li><a href="https://github.com/open-policy-agent">Open Policy Agent GitHub</a></li> 228<li><a href="https://open-policy-agent.github.io/gatekeeper/website/docs/">OPA Gatekeeper Documentation</a></li> 229<li><a href="https://github.com/open-policy-agent/gatekeeper-library">Gatekeeper Library on GitHub</a></li> 230<li><a href="https://aws-quickstart.github.io/cdk-eks-blueprints/addons/opa-gatekeeper/">CDK EKS Blueprints - OPA Gatekeeper</a></li> 231<li><a href="https://aws.amazon.com/eks/">AWS EKS Documentation</a></li> 232<li><a href="https://securitylabs.datadoghq.com/articles/amazon-eks-attacking-securing-cloud-identities/">Datadog Security Labs - EKS Attacking & Securing Cloud Identities</a></li> 233<li><a href="https://cloud.hacktricks.xyz/pentesting-cloud/kubernetes-security/kubernetes-enumeration">Cloud HackTricks Kubernetes Enumeration</a></li> 234<li><a href="https://www.linkedin.com/in/peachycloudsecurity/"> Attacking & Defending Kubernetes training</a></li> 235</ul> 236<p>ââ 237<span style="color: red; font-size: 20px; font-weight: bold;">â ï¸ IMPORTANT NOTICE: Please use a new or dedicated AWS account for these operations. Some commands may delete data or resources within the AWS environment. The author assumes no responsibility for any data loss or unintended consequences resulting from the use of these commands.</span> 238ââ</p> 239<p style="text-align: center;"> 240 âââââ 241</p> 242 243 </main> 244 245 <nav class="nav-wrapper" aria-label="Page navigation"> 246 <!-- Mobile navigation buttons --> 247 248 <a aria-keyshortcuts='Left' aria-label='Previous chapter' class='mobile-nav-chapter
248s previous' href='/welcome/' rel='prev' title='Previous chapter'> 249 <i class="fa fa-angle-left"></i> 250 </a> 251 252 253 254 <a aria-keyshortcuts='Right' aria-label='Next chapter' class='mobile-nav-chapters next' href='/welcome/agenda' rel='next' title='Next chapter'> 255 <i class="fa fa-angle-right"></i> 256 </a> 257 258 259 <div style="clear: both"></div> 260 </nav> 261 </div> 262 </div> 263 264 <nav class="nav-wide-wrapper" aria-label="Page navigation"> 265 266 <a aria-keyshortcuts='Left' aria-label='Previous chapter' class='nav-chapters previous' href='/welcome/' title='Previous chapter'> 267 <i class="fa fa-angle-left"></i> 268 </a> 269 270 271 272 <a aria-keyshortcuts='Right' aria-label='Next chapter' class='nav-chapters next' href='/welcome/agenda' title='Next chapter'> 273 <i class="fa fa-angle-right"></i> 274 </a> 275 276 </nav> 277 278 </div> 279 280 281 282 283 284 285 286 287
287<script type="text/javascript"> 288 window.playpen_copyable = true; 289 </script>
289 290 291 292 293 294 295
295<script src="../elasticlunr.min.js" type="text/javascript" charset="utf-8"></script>
295 296
296<script src="../mark.min.js" type="text/javascript" charset="utf-8"></script>
296 297
297<script src="../searcher.js" type="text/javascript" charset="utf-8"></script>
297 298 299 300
300<script src="../clipboard.min.js" type="text/javascript" charset="utf-8"></script>
300 301
301<script src="../highlight.js" type="text/javascript" charset="utf-8"></script>
301 302
302<script src="../book.js" type="text/javascript" charset="utf-8"></script>
302 303 304 <!-- Custom JS scripts --> 305 306
306<script type="text/javascript" src="../disable_print_snapshot.js"></script>
306 307 308 309 310 311 </body> 312</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.