CINXE.COM
Support Center - O'Reilly Media
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Support Center - O'Reilly Media</title> <meta name="description" content=" " /> <meta name="date" content="2024-11-27" /> <meta name="search_date" content="2021-10-25" /> <meta name="search-title" content="Support Center - O'Reilly Media" /> <meta name="pagename" content="Support Center - O'Reilly Media" /> <meta name="site" content="O'Reilly" /> <meta name="twitter:title" content="Support Center - O'Reilly Media" /> <meta name="twitter:description" content=" " /> <meta name="twitter:site" content="@OReillyMedia" /> <meta property="og:type" content="website" /> <meta property="og:title" content="Support Center - O'Reilly Media" /> <meta name="twitter:card" content="summary" /> <meta name="twitter:image" content="https://cdn.oreillystatic.com/oreilly/images/oreilly-social-200.png" /> <meta property="og:image" content="https://cdn.oreillystatic.com/oreilly/images/oreilly-social-200.png" /> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="language_name" content="English"> <meta name="native_language_name" content="English"> <meta name="format-detection" content="telephone=no"> <link rel="icon" type="image/png" href="//www.oreilly.com/favicon.ico"> <!--[if lte IE 9]> <script> 'article aside footer header main nav section time'.replace(/\w+/g,function(n){document.createElement(n)}) </script> <![endif]--> <link rel="stylesheet" type="text/css" href="https://cdn.oreillystatic.com/assets/css/2018_font_face.css" /> <link rel="stylesheet" type="text/css" href="https://cdn.oreillystatic.com/assets/css/odot-layout-20240226.css" /> <!--[if IE 9]> <style type="text/css"> #menu-toggle:checked ~ .mobile-nav { display:block; } .mobile-nav { display: none; } </style> <![endif]--> <!-- Initiate dataLayer for GA --> <script> loggedInObject = new Object(); var dataLayer = window.dataLayer || []; //Check for O'Reilly Unified logged-in status if (document.cookie.split(';').filter(function(item) { return item.indexOf('orm-jwt=') >= 0 }).length) { loggedInObject.unifiedLoggedIn = 'yes'; loggedInObject.loggedIn = 'yes'; dataLayer.push(loggedInObject); //Add 'loggedIn class to html tag const htmlTag = document.querySelector('html'); if (htmlTag !== null) { htmlTag.classList.add('loggedIn'); } } </script> <!-- Google Tag Manager --> <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-5P4V6Z');</script> <!-- End Google Tag Manager --> <!-- Start Google reCAPTCHA Code --> <script src="https://www.google.com/recaptcha/api.js"></script> <script> function timestamp() { var response = document.getElementById("g-recaptcha-response"); if (response == null || response.value.trim() == "") {var elems = JSON.parse(document.getElementsByName("captcha_settings")[0].value);elems["ts"] = JSON.stringify(new Date().getTime());document.getElementsByName("captcha_settings")[0].value = JSON.stringify(elems); } } setInterval(timestamp, 500); </script> <!-- End Google reCAPTCHA Code --> <!-- Start VWO Async SmartCode --> <link rel="preconnect" href="https://dev.visualwebsiteoptimizer.com" /> <script type='text/javascript' id='vwoCode'> window._vwo_code || (function() { var account_id=27087, version=2.1, settings_tolerance=2000, hide_element='body', hide_element_style = 'opacity:0 !important;filter:alpha(opacity=0) !important;background:none !important', /* DO NOT EDIT BELOW THIS LINE */ f=false,w=window,d=document,v=d.querySelector('#vwoCode'),cK='_vwo_'+account_id+'_settings',cc={};try{var c=JSON.parse(localStorage.getItem('_vwo_'+account_id+'_config'));cc=c&&typeof c==='object'?c:{}}catch(e){}var stT=cc.stT==='session'?w.sessionStorage:w.localStorage;code={use_existing_jquery:function(){return typeof use_existing_jquery!=='undefined'?use_existing_jquery:undefined},library_tolerance:function(){return typeof library_tolerance!=='undefined'?library_tolerance:undefined},settings_tolerance:function(){return cc.sT||settings_tolerance},hide_element_style:function(){return'{'+(cc.hES||hide_element_style)+'}'},hide_element:function(){if(performance.getEntriesByName('first-contentful-paint')[0]){return''}return typeof cc.hE==='string'?cc.hE:hide_element},getVersion:function(){return version},finish:function(e){if(!f){f=true;var t=d.getElementById('_vis_opt_path_hides');if(t)t.parentNode.removeChild(t);if(e)(new Image).src='https://dev.visualwebsiteoptimizer.com/ee.gif?a='+account_id+e}},finished:function(){return f},addScript:function(e){var t=d.createElement('script');t.type='text/javascript';if(e.src){t.src=e.src}else{t.text=e.text}d.getElementsByTagName('head')[0].appendChild(t)},load:function(e,t){var i=this.getSettings(),n=d.createElement('script'),r=this;t=t||{};if(i){n.textContent=i;d.getElementsByTagName('head')[0].appendChild(n);if(!w.VWO||VWO.caE){stT.removeItem(cK);r.load(e)}}else{var o=new XMLHttpRequest;o.open('GET',e,true);o.withCredentials=!t.dSC;o.responseType=t.responseType||'text';o.onload=function(){if(t.onloadCb){return t.onloadCb(o,e)}if(o.status===200){_vwo_code.addScript({text:o.responseText})}else{_vwo_code.finish('&e=loading_failure:'+e)}};o.onerror=function(){if(t.onerrorCb){return t.onerrorCb(e)}_vwo_code.finish('&e=loading_failure:'+e)};o.send()}},getSettings:function(){try{var e=stT.getItem(cK);if(!e){return}e=JSON.parse(e);if(Date.now()>e.e){stT.removeItem(cK);return}return e.s}catch(e){return}},init:function(){if(d.URL.indexOf('__vwo_disable__')>-1)return;var e=this.settings_tolerance();w._vwo_settings_timer=setTimeout(function(){_vwo_code.finish();stT.removeItem(cK)},e);var t;if(this.hide_element()!=='body'){t=d.createElement('style');var i=this.hide_element(),n=i?i+this.hide_element_style():'',r=d.getElementsByTagName('head')[0];t.setAttribute('id','_vis_opt_path_hides');v&&t.setAttribute('nonce',v.nonce);t.setAttribute('type','text/css');if(t.styleSheet)t.styleSheet.cssText=n;else t.appendChild(d.createTextNode(n));r.appendChild(t)}else{t=d.getElementsByTagName('head')[0];var n=d.createElement('div');n.style.cssText='z-index: 2147483647 !important;position: fixed !important;left: 0 !important;top: 0 !important;width: 100% !important;height: 100% !important;background: white !important;';n.setAttribute('id','_vis_opt_path_hides');n.classList.add('_vis_hide_layer');t.parentNode.insertBefore(n,t.nextSibling)}var o='https://dev.visualwebsiteoptimizer.com/j.php?a='+account_id+'&u='+encodeURIComponent(d.URL)+'&vn='+version;if(w.location.search.indexOf('_vwo_xhr')!==-1){this.addScript({src:o})}else{this.load(o+'&x=true')}}};w._vwo_code=code;code.init();})(); </script> <!-- End VWO Async SmartCode --> </head> <body> <!-- Google Tag Manager (noscript) --> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5P4V6Z" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <!-- End Google Tag Manager (noscript) --> <div class="skipToMain" id="skipToMain"><a href="#maincontent"><span class="skipToMain-text">Skip to main content</span></a></div> <header role="banner"> <div class="content"> <nav role="navigation" aria-label="site sections"> <a href="https://www.oreilly.com" class="logo" title="home page"><img src="https://cdn.oreillystatic.com/images/sitewide-headers/oreilly_logo_mark_red.svg" onerror="this.src='https://cdn.oreillystatic.com/images/sitewide-headers/oreilly_logo_mark_red_@2x.png'; this.onerror=null;" alt="O'Reilly home"></a> <button id="mobileNavButton" class="mobileNavButton mobileNavButton--collapse mobileNavButton--3dx" type="button" aria-expanded="false" aria-controls="menuList"> <span class="mobileNavButton-box"> <span class="mobileNavButton-inner"></span> </span> </button> <ul id="menuList" class="menuList mobileHidden "> <li class="menuList-itemsP1"> <ul> <li class="menuList-item menuList-signIn"><a id="nav-signIn" href="https://www.oreilly.com/member/login/">Sign In</a></li> <li class="menuList-item menuList-tryNow"><a id="nav-tryNow" class="menuList-cta" href="https://www.oreilly.com/online-learning/try-now.html">Try Now</a></li> <li class="menuList-item menuList-platform"><a id="nav-platform" class="menuList-cta" href="https://www.oreilly.com/member/login/">O’Reilly Platform</a></li> </ul> </li> <li class="menuList-itemsP2"> <ul> <li class="menuList-item menuList-itemWithSub"><a href="https://www.oreilly.com/online-learning/teams.html">Teams</a> <ul class="menuList-subList"> <li class="menuList-subItem menuList-extra"><a href="https://www.oreilly.com/online-learning/teams.html">For business</a></li> <li class="menuList-subItem"><a href="https://www.oreilly.com/online-learning/government.html">For government</a></li> <li class="menuList-subItem"><a href="https://www.oreilly.com/online-learning/academic.html">For higher ed</a></li> </ul> </li> <li class="menuList-item"><a href="https://www.oreilly.com/online-learning/individuals.html">Individuals</a></li> <li class="menuList-item menuList-itemWithSub"><a href="https://www.oreilly.com/online-learning/features.html">Features</a> <ul class="menuList-subList"> <li class="menuList-subItem menuList-extra"><a href="https://www.oreilly.com/online-learning/features.html">All features</a></li> <li class="menuList-subItem"><a href="https://www.oreilly.com/online-learning/courses.html">Courses</a></li> <li class="menuList-subItem"><a href="https://www.oreilly.com/online-learning/feature-certification.html">Certifications</a></li> <li class="menuList-subItem"><a href="https://www.oreilly.com/online-learning/intro-interactive-learning.html">Interactive learning</a></li> <li class="menuList-subItem"><a href="https://www.oreilly.com/online-learning/live-events.html">Live events</a></li> <li class="menuList-subItem"><a href="https://www.oreilly.com/online-learning/feature-answers.html">Answers</a></li> <li class="menuList-subItem"><a href="https://www.oreilly.com/online-learning/insights-dashboard.html">Insights reporting</a></li> </ul> </li> <li class="menuList-item"><a href="https://www.oreilly.com/radar/">Blog</a></li> <li class="menuList-item" id="nav-forMarketers"><a href="https://www.oreilly.com/content-marketing-solutions.html">Content sponsorship</a></li> <li class="menuList-item menuList-item-search" id="nav-search"> <form id="js-searchForm" class="searchForm" action="https://www.oreilly.com/search/"><input id="search" type="search" name="query" placeholder="Explore our content" autocomplete="off" required=""><button id="js-searchCloseButton" class="navSearchCloseButton">Close</button></form> <button id="js-searchButton" class="navSearchButton">Search</button> </li> </ul> </li> </ul> </nav> </div> </header> <main role="main" id="maincontent"> <style> .hero.hero-general .content { min-height: 120px; display: flex; flex-direction: column; } .hero.hero-general .content *:first-child { margin-top: auto; } @media (min-width: 40em) { .hero-returnLink { max-width: 100%; } } @media (min-width: 50em) { /* 800px */ .hero.hero-general .content { min-height: 180px; } } /* .longDescription */ .longDescription { padding: 34px 0 14px; } .longDescription h2 { margin-bottom: 32px; max-width: 976px; font-family: "gilroy", Arial, sans-serif; font-size: 40px; font-size: 2.5rem; line-height: 1.2em; font-weight: 300; } .longDescription h3 { margin-bottom: 10px; max-width: 976px; font-family: "gilroy", Arial, sans-serif; font-size: 32px; font-size: 2rem; line-height: 1.3em; font-weight: 300; } .sectionHeading h2 { margin-bottom: 20px; color: #0071EB; font-weight: 300; } @supports (-webkit-background-clip: text) or (-moz-background-clip: text) { .sectionHeading h2 { width: max-content; max-width: 100%; background: #0071EB linear-gradient(135deg, rgb(0,113,235) 0%, rgb(142,34,167) 100%); background-size: 100%; -webkit-background-clip: text; -moz-background-clip: text; -webkit-text-fill-color: transparent; -moz-text-fill-color: transparent; box-decoration-break: clone; -webkit-box-decoration-break: clone; } } @media (min-width: 40em) { .longDescription { padding: 54px 0 34px; } } @media (min-width: 53em) { .longDescription { padding: 54px 0 34px; } } @media (min-width: 71em) { .longDescription h2 { font-size: 50px; font-size: 3.125rem; line-height: 1.1em; } .longDescription h3 { font-size: 40px; font-size: 2.5rem; line-height: 1.2em; } } /* end .longDescription */ .faqGroup, .topicGroup { display: flex; flex-direction: row; flex-wrap: wrap; justify-content: space-between; margin-bottom: 60px; font-size: 1rem; line-height: 1.5em; } .faqGroup:last-child, .topicGroup:last-child { margin-bottom: 14px; } .faqGroup a, .topicGroup a { display: flex; flex-direction: column; align-items: center; margin-bottom: 6px; padding: 20px; background-color: #f4f4f4; border: 1px solid #f4f4f4; border-radius: 6px; width: calc((100% / 2) - 3px); text-align: center; text-decoration: none; transition: box-shadow 200ms, border-color 200ms, background-color 400ms; } .faqGroup a:hover, .faqGroup a:active, .topicGroup a:hover, .topicGroup a:active { background-color: #f9f9f9; border-color: #0071EB; box-shadow: 0 0 4px rgba(0,113,235,.3); } .faqGroup .faqGroup-spacer, .topicGroup .topicGroup-spacer { display: block; width: calc((100% / 2) - 3px); opacity: 0; } .faqGroup-text, .topicGroup-text { display: block; margin: auto 0; } .highlightGroup { display: flex; flex-direction: row; margin-bottom: 60px; font-size: 1rem; line-height: 1.5em; } .highlightGroup:last-child { margin-bottom: 14px; } .highlightGroup a { display: block; margin: 0 6px 6px 0; width: max-content; padding: 10px 20px; background-color: rgba(0,113,235,.9); border-radius: 6px; color: #fff; text-align: center; text-decoration: none; transition: box-shadow 200ms, border-color 200ms, background-color 400ms; } .highlightGroup a:hover, .highlightGroup a:active { box-shadow: 0 0 4px rgba(0,113,235,.5); background-color: rgba(0,113,235,1); } .highlightGroup-text { display: block; margin: auto 0; } .highlightGroup-text:after { content: ""; display: inline-block; margin: -8px -2px -6px 6px; width: 13px; height: 22px; vertical-align: middle; background: transparent url(https://cdn.oreillystatic.com/images/icons/icon_right_arrow_white.svg) center center no-repeat; background-size: contain; } @media (min-width: 40em) { /* 640px */ .faqGroup, .topicGroup, .highlightGroup { font-size: 22px; font-size: 1.375rem; line-height: 1.5em; } .faqGroup a, .faqGroup .faqGroup-spacer, .topicGroup a, .topicGroup .topicGroup-spacer { width: calc((100% / 3) - 4px); } } @media (min-width: 60em) { /* 960px */ .faqGroup a, .topicGroup a { padding: 40px; } .highlightGroup a { padding: 20px 40px; } } </style> <section class="hero hero-general"> <div class="content"> <h1>Support center</h1> </div> </section> <section class="supportCenter longDescription"> <div class="content"> <div class="sectionHeading"> <h2>Frequently asked questions</h2> </div> <div class="faqGroup"> <a href="https://www.oreilly.com/online-learning/support/getting-started.html"> <span class="faqGroup-text">How do I <span class="nowrap">get started?</span></span> </a> <a href="https://www.oreilly.com/online-learning/support/features.html#certification"> <span class="faqGroup-text">What are certification <span class="nowrap">practice exams?</span></span> </a> <a href="https://www.oreilly.com/online-learning/support/content.html#missLiveEvent"> <span class="faqGroup-text">What happens if I miss a <span class="nowrap">live event?</span></span> </a> <a href="https://www.oreilly.com/online-learning/support/account.html#resetEmail"> <span class="faqGroup-text">Why haven’t I received my password <span class="nowrap">reset email?</span></span> </a> <a href="https://www.oreilly.com/online-learning/support/content.html#offlineAccess"> <span class="faqGroup-text">Can I access content while <span class="nowrap">I’m offline?</span></span> </a> <a href="https://www.oreilly.com/online-learning/support/account.html#cancelTrial"> <span class="faqGroup-text">How do I cancel my <span class="nowrap">free trial?</span></span> </a> <a href="https://www.oreilly.com/online-learning/support/features.html#badges"> <span class="faqGroup-text">What are <span class="nowrap">digital badges?</span></span> </a> <div class="faqGroup-spacer"></div> </div> <div class="sectionHeading"> <h2>Pick a topic to <span class="nowrap">learn more</span></h2> </div> <div class="topicGroup"> <a href="https://www.oreilly.com/online-learning/support/getting-started.html"> <span class="topicGroup-text">Getting started</span> </a> <a href="https://www.oreilly.com/online-learning/support/apps.html"> <span class="topicGroup-text">O’Reilly apps</span> </a> <a href="https://www.oreilly.com/online-learning/support/news.html"> <span class="topicGroup-text">What’s new</span> </a> <a href="https://www.oreilly.com/online-learning/support/account.html"> <span class="topicGroup-text">Account</span> </a> <a href="https://www.oreilly.com/online-learning/support/content.html"> <span class="topicGroup-text">Content</span> </a> <a href="https://www.oreilly.com/online-learning/support/features.html"> <span class="topicGroup-text">Features</span> </a> <a href="https://www.oreilly.com/online-learning/support/accessibility.html"> <span class="topicGroup-text">Accessibility</span> </a> <div class="faqGroup-spacer"></div> <div class="faqGroup-spacer"></div> </div> </div> </section> <!-- Membership --> <style> .membership .highlightGroup { display: flex; flex-direction: row; margin-bottom: 60px; font-size: 1rem; line-height: 1.5em; } .membership .highlightGroup:last-child { margin-bottom: 14px; } .membership .highlightGroup a { display: block; margin: 0 6px 6px 0; width: max-content; padding: 10px 20px; background-color: rgba(211,0,0,.9); border-radius: 6px; color: #fff; text-align: center; text-decoration: none; transition: box-shadow 200ms, border-color 200ms, background-color 400ms; } .membership .highlightGroup a:hover, .membership .highlightGroup a:active { box-shadow: 0 0 4px rgba(211,0,0,.5); background-color: rgba(211,0,0,1); } .membership .highlightGroup-text { display: block; margin: auto 0; } .membership .highlightGroup-text:after { content: ""; display: inline-block; margin: -8px -2px -6px 6px; width: 13px; height: 22px; vertical-align: middle; background: transparent url(https://cdn.oreillystatic.com/images/icons/icon_right_arrow_white.svg) center center no-repeat; background-size: contain; } @media (min-width: 40em) { /* 640px */ .membership .highlightGroup { font-size: 22px; font-size: 1.375rem; line-height: 1.5em; } } @media (min-width: 60em) { /* 960px */ .membership .highlightGroup a { padding: 20px 40px; } } </style> <section id="membership" class="longDescription sectionBreak membership"> <div class="content"> <h2>Not an O’Reilly <span class="nowrap">member yet?</span></h2> <p>We make it easy, whether you’re looking to get your organization’s tech teams onboarded or just want to join <span class="nowrap">for yourself.</span></p> <div class="highlightGroup"> <a href="https://www.oreilly.com/online-learning/teams.html"> <span class="highlightGroup-text">For teams</span> </a> <a href="https://www.oreilly.com/online-learning/individuals.html"> <span class="highlightGroup-text">For individuals</span> </a> </div> </div> </section> <!-- Contact us --> <style> /* contactUs */ .contactUs { padding: 34px 0 14px; } .contactUs h2 { max-width: 880px; font-family: 'gilroy', Arial, sans-serif; font-size: 40px; font-size: 2.5rem; line-height: 1.2em; font-weight: 300; margin: 0 0 20px; } .contactUs-item { padding-bottom: 20px; } .contactUs-item h3 { font-family: 'gilroy', Arial, sans-serif; font-weight: 600; font-size: 32px; font-size: 2rem; line-height: 1.2em; margin-bottom: 12px; } .contactUs-item p { font-size: 16px; font-size: 1rem; line-height: 1.5em; } @media (min-width: 40em) { /* 640px */ .contactUs { padding: 54px 0 14px; } .contactUs-item { padding-bottom: 40px; } .contactUs-item p { font-size: 20px; font-size: 1.25rem; line-height: 1.5em; } } @media (min-width: 50em) { /* 800px */ .contactUs .contactUs-list { column-count: 2; column-gap: 80px; } .contactUs .contactUs-item { break-inside: avoid; } } @media (min-width: 65em) { /* 1136px */ .contactUs { padding: 54px 0 34px; } .contactUs h2 { font-size: 48px; font-size: 3rem; line-height: 1.2em; margin: 0 0 56px; } .contactUs-item { padding-bottom: 40px; } } @media (min-width: 71em) { .contactUs { padding: 54px 0 34px; } .contactUs h2 { font-size: 48px; font-size: 3rem; line-height: 1.2em; margin: 0 0 56px; } .contactUs-item { padding-bottom: 40px; margin-bottom: 0; } } /* end contactUs */ /* .formOverlay */ .supportButton { display: block; -webkit-appearance: none; outline: none; border: none; margin: 4px 0; padding: 10px 16px; width: auto; width: max-content; background: #0071eb; font: inherit; font-size: 1rem; line-height: 1em; font-weight: 600; color: #fff; border-radius: 4px; cursor: pointer; } .supportButton:hover, .supportButton:focus, .supportButton:active { box-shadow: 0 1px 4px rgba(0,0,0,.3); } @media (min-width: 53em) { .supportButton { font-size: 1rem; line-height: 1em; } } .formOverlay { position: fixed; z-index: 999; left: 0; top: 0; height: 100%; width: 100%; padding-top: 40px; background-color: rgba(68,68,68,0.3); backdrop-filter: blur(5px); overflow-y: auto; } .formOverlay-inner { position: fixed; left: 20px; margin-left: 0; height: auto; width: calc(100% - 40px); height: auto; max-width: 100%; padding: 20px 20px 0; border-radius: 0; background-color: #fff; box-shadow: 0 4px 16px rgba(0,0,0,.1); } .formOverlay-close { position: absolute; top: 10px; right: 10px; height: 12px; width: 12px; background: url(https://cdn.oreillystatic.com/oreilly/images/icon_close_16x16.svg) 0 0 no-repeat; background-size: cover; opacity: .5; } .formOverlay-close:hover { cursor: pointer; opacity: 1; } .formOverlay-inner h2 { margin-bottom: 18px; max-width: 100%; font-family: 'gilroy', Arial, sans-serif; font-size: 2rem; line-height: 1.3em; font-weight: 600; } .formOverlay-inner p { margin-bottom: 0; max-width: 100%; font-size: 1rem; line-height: 1.5em; } @media (min-width: 40em) { .formOverlay-inner { left: 50%; margin-left: -240px; width: 480px; padding: 40px 40px 20px; } .formOverlay-inner p { margin-bottom: 0; font-size: 1.25rem; line-height: 1.5em; } .formOverlay-close { position: absolute; top: 20px; right: 20px; } } @media (min-width: 71em) { .formOverlay-inner h2 { font-size: 2.25rem; line-height: 1.2em; } } /* END .formOverlay */ /* .contactForm */ .contactForm { font-family: 'guardian-text-oreilly', Arial, sans-serif; } .contactForm input, .contactForm label { display: block; font-family: inherit; } .contactForm label, .contactForm p { margin-bottom: 6px; font-size: .875rem; line-height: 1.5em; color: #344054; } .contactForm.salesforce-form p.required { margin-bottom: 20px; margin-top: 0; font-size: 0.875rem; line-height: 1.5em; color: #344054; } .contactForm input[type="text"], .contactForm input[type="email"], .contactForm input[type="tel"], .contactForm textarea { width: 100%; border: 1px solid #d0d5dd; padding: 10px; font-family: 'guardian-text-oreilly', Arial, sans-serif; font-size: 1rem; padding: 0.625em 0.65em; margin: 2px 0 10px; border-radius: 8px; -webkit-appearance: none; } .contactForm textarea { height: auto; resize: none; } .contactForm-cta { display: flex; flex-direction: row; align-items: center; justify-content: center; width: 100%; margin: 10px 0 20px; padding: 10px 20px; border-radius: 8px; background-color: #0071eb; font-size: 1rem; line-height: 1.5em; color: #fff; font-family: 'guardian-text-oreilly', Arial, sans-serif; font-weight: 600; text-transform: unset; letter-spacing: 0.02em; text-decoration: none; white-space: nowrap; cursor: pointer; border: 0; } .contactForm-cta:after { content: ""; display: block; margin-left: 6px; height: 1.2rem; width: 1.2rem; background: transparent url(https://cdn.oreillystatic.com/images/icons/icon_send.svg) center center no-repeat; background-size: contain; } .contactForm-cta:hover, .contactForm-cta:active { text-decoration: none; box-shadow: 0 1px 4px rgba(0,0,0,.3); color: #fff; } .contactForm-neg { display: none; } @media (min-width: 28em ) and /* 448px */ (max-width: 71em ), /* px */ (min-width: 71em) { /* 1120px */ .contactForm-full { clear: both; } } @media (min-width: 37.5em) { /* 600px */ .contactForm-text, .contactForm { float: left; box-sizing: border-box; width: 100%; } .contactForm-text { margin-right: 0; } } @media (min-width: 56.25em) { /* 900px */ .contactForm-text { width: 100%; } .contactForm { width: 100%; } } /* END contactForm */ /* .contactForm error message */ .contactForm input[type="text"].error, .contactForm input[type="email"].error, .contactForm input[type="tel"].error, .contactForm textarea.error { border-width: 2px; border-color: #d30000; } .contactForm label.error, .contactForm-errorMessage p { padding-left: 28px; color: #d30000; position: relative; } .contactForm-errorMessage p { margin-bottom: 20px; } .contactForm noscript { font-weight: 600; color: #d30000; position: relative; } .contactForm noscript p { padding-left: 28px; } .contactForm label.error:before, .contactForm-errorMessage p:before, .contactForm noscript p:before { content: url('https://cdn.oreillystatic.com/images/icons/baseline-error_outline-24px.svg'); position: absolute; left: 0; } .contactForm button { cursor: pointer; border: 0; } .contactForm button[disabled], .contactForm input[disabled], .contactForm textarea[disabled] { opacity: 0.5; } /* END .contactForm error message */ </style> <section id="contact-us" class="sectionBreak contactUs"> <div class="content"> <h2>Contact us</h2> <div class="contactUs-list"> <div class="contactUs-item america"> <h3>America</h3> <p class="phone">Tel: <a href="tel:+1-800-889-8969" aria-label="8 0 0. 8 8 9. 8 9 6 9.">1-800-889-8969</a></p> <p class="hours">Mon-Fri, 1am–5pm PT, excluding US holidays</p> </div> <div class="contactUs-item europe"> <h3>Europe</h3> <p class="phone">Tel: <a href="tel:+44-20-3355-9998" aria-label="4 4. 2 0. 3 3 5 5. 9 9 9 8.">+44 20 3355 9998</a></p> <p class="hours">Mon-Fri, 9am–1am GMT, excluding UK bank holidays</p> </div> <div class="contactUs-item apac"> <h3>Asia Pacific</h3> <p class="phone">Tel: <a href="tel:+61-29-191-9777" aria-label="6 1. 2 9. 1 9 1. 9 7 7 7.">+61 29 191 9777</a></p> <p class="hours">Mon-Fri, 8am–12am GMT, excluding US and UK holidays</p> </div> <div class="contactUs-item"> <h3>Everywhere</h3> <button id="contactSupport" class="supportButton">Contact support</button> <p class="email">Email: <script type="text/javascript"> <!-- var name = "support"; var domain = "oreilly.com"; var display = ""; var subject = ""; var ending = ""; var style = ""; document.write('<a target="_blank" class="' + style + '" href="mailto:' + name + '@' + domain + '?subject=' + subject + '">'); if (display) { document.write(display); } else { document.write(name + '@' + domain); } document.write('</a>' + ending); // --> </script> </p> <p class="note">Please provide as much detail as possible, including information about how you are accessing the service <span class="nowrap">(when relevant).</span></p> </div> </div> </div> </section> <!-- overlay with contactForm --> <div class="formOverlay hidden" id="formOverlay"> <div class="formOverlay-inner" id="formOverlay-inner"> <div class="formOverlay-close" id="formOverlay-close"></div> <h2>Contact support</h2> <form role="form" id="contactForm" class="contactForm salesforce-form" novalidate="true" method="POST" action="https://webto.salesforce.com/servlet/servlet.WebToCase?encoding=UTF-8"> <p class="required" aria-hidden="true">* Required fields</p> <div id="contactForm-errorMessage" class="contactForm-errorMessage"></div> <noscript> <p>Do you have JavaScript turned off? Sorry, but this form won’t work without it.</p> </noscript> <div class="contactForm-full"> <label for="contactForm_name">Full name <strong aria-hidden="true" >*</strong></label> <input type="text" name="name" id="contactForm_name" data-text="full name" autocomplete="name" aria-required="true" disabled > </div> <div class="contactForm-full"> <label for="contactForm_email">Email <strong aria-hidden="true" >*</strong></label> <input type="email" name="email" id="contactForm_email" data-text="email address" autocomplete="email" aria-required="true" disabled > </div> <div class="contactForm-full"> <label for="contactForm_phone">Phone number</label> <input type="tel" name="phone" id="contactForm_phone" data-text="phone number" autocomplete="tel" aria-required="false" disabled > </div> <div class="contactForm-full"> <label for="contactForm_subject">Subject <strong aria-hidden="true" >*</strong></label> <input type="text" name="subject" id="contactForm_subject" data-text="subject" aria-required="true" disabled > </div> <div class="contactForm-full"> <label for="contactForm_description">Description <strong aria-hidden="true" >*</strong></label> <textarea rows="4" name="description" id="contactForm_description" data-text="description" aria-required="true" disabled ></textarea> </div> <!-- salesforce special section --> <div id="contactForm-special" class="screen-reader-text"> <label>Email confirm: <input type="email" class="" name="Filter_1__c"></label> <label>Website address: <input type="text" class="" name="Filter_2__c" value="http://" ></label> <script type="text/javascript"> document.getElementById('contactForm-special').className = "contactForm-neg"; </script> </div> <!-- end salesforce special section --> <div class="g-recaptcha" data-sitekey="6LeFslspAAAAAFvcDHi0O_07qjlf05rnmiD0J3KV"></div> <input type="hidden" name="orgid" value="00D41000002j7Ek"> <input type="hidden" id="external" name="external" value="1" /> <input type="hidden" name='captcha_settings' value='{"keyname":"ORM24","fallback":"true","orgId":"00D41000002j7Ek","ts":""}'> <input type="hidden" name="retURL" value=""> <input type="hidden" name="origin" value="WebToCase"> <div class="contactForm-full"> <button type="submit" class="contactForm-cta" onclick="return verif('contactForm');" value="Submit" disabled> Send </button> </div> </form> </div> </div> <!-- end overlay with contactForm --> <script src="https://cdn.oreillystatic.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script> document.addEventListener("DOMContentLoaded", function(event) { enableForm(); setRedirectUrls(); enableContactFormOverlay(); }); //Show events form overlay on link click function enableContactFormOverlay() { $('#contactSupport').on('click', function(e) { e.preventDefault(); $('html').css({'overflow':'hidden'}); $('#formOverlay').removeClass('hidden'); dataLayer.push({ 'event': 'eventTracker', 'eventCat':'marketing', 'eventAct':'click', 'eventLbl':'ss overlay', 'eventVal':0, 'nonInteraction': 0, }); }); $('#formOverlay, #formOverlay-close').on('click', function(e) { $('html').css({'overflow':'auto'}); $('#formOverlay').addClass('hidden'); }); $(document).on('keydown', function(e) { if (e.keyCode == 27) { //Escape $('html').css({'overflow':'auto'}); $('#formOverlay').addClass('hidden'); } }); $('#formOverlay-inner').on('click', function(e) { e.stopPropagation(); }); } function enableForm() { // enable form submit button if javascript present $('form input, form select, form textarea, form button').prop('disabled', false); } function setRedirectUrls() { // set values of redirect urls in forms var forms = document.getElementsByClassName('salesforce-form'); for (i = 0; i < forms.length; i++) { var formId = forms[i].id; var retURL = (window.location.href.split('?')[0] + '?submit=true&name=' + formId); $('#' + formId + ' input[name="retURL"]').val(retURL); } } function verif(formName) { var form = document.getElementById(formName); var formId = '#' + formName; $(formId +' .error').removeClass('error'); $('[aria-invalid$="true"]').attr('aria-invalid','false'); var errors = []; // find all elements in form that are required fields var requiredFields = $(formId + ' [aria-required$="true"]'); // loop through required fields to check if they are valid for (i = 0; i < requiredFields.length; i++) { var field = requiredFields[i]; if (fieldInvalid(field, form)) { createError(field, formId, formName, errors); }; } // If errors found, display them and prevent submit if (errors.length > 0) { displayErrors(errors, formId); return false; } // When no errors found continue... // If the form is salesforce if (form.classList.contains('salesforce-form')) { setSalesforceFields(form, formId); if (formName === 'contactForm') { // Push dataLayer event for Goggle Analytics dataLayer.push({ 'event': 'eventTracker', 'eventCat':'lead gen form submit', 'eventAct':'content marketing', 'eventLbl': 'ss leads', 'eventVal':0, 'nonInteraction':0 }); } } return true; // return false; } function fieldInvalid(field, form) { if (field.name === "email") { return (emailInvalid(form)) ? true : false; } else { return (field.value.length < 1) ? true : false; } } function emailInvalid(form) { var mail = new RegExp('@+','g'); if ( (form.email.value.length < 1) || (!mail.test(form.email.value)) ) { return true; } } function createError(field, formId, formName, errors) { $(formId + ' [name$="' + field.name + '"]').addClass('error').attr('aria-invalid','true'); $(formId +' label[for="' + formName + '_' + field.name + '"]').addClass('error'); errors.push(field.dataset.text); return errors; } function displayErrors(errors, formId) { var errorMessage = ''; if (errors.length > 3) { errorMessage = '<p>Please fill out all required fields.</p>'; } else { errorMessage = '<p>Please enter your '; for (i = 0; i < errors.length; i++) { errorMessage += errors[i]; if (i === errors.length - 2) { errorMessage += ', and ' } else if (i < errors.length - 1) { errorMessage += ', ' } else { errorMessage += '.</p>' } } } $(formId +'-errorMessage').html(errorMessage); } </script> </main> <footer id="footer" class="footer"> <div class="content"> <div class="footer-main" aria-label="company info"> <div class="footer-mainLeft"> <div class="footer-mainLeftOne"> <div class="footer-approach"> <h2 class="footer-header"><a href="/about/">About O’Reilly</a></h2> <ul class="footer-links"> <li><a href="/work-with-us.html">Teach/write/train</a></li> <li><a href="/careers/">Careers</a></li> <li><a href="/press/">O’Reilly news</a></li> <li><a href="/press/media-coverage.html">Media coverage</a></li> <li><a href="/partner/signup.csp">Community partners</a></li> <li><a href="/affiliates/">Affiliate program</a></li> <li><a href="/online-learning/rfp.html">Submit an RFP</a></li> <li><a href="/diversity/">Diversity</a></li> <li><a href="/content-marketing-solutions.html" id="footerSponsorshipLink">O’Reilly for marketers</a></li> </ul> </div> </div> <div class="footer-mainLeftTwo"> <div class="footer-contact"> <h2 class="footer-header"><a href="/online-learning/support/">Support</a></h2> <ul class="footer-links"> <li><a href="/about/contact.html">Contact us</a></li> <li><a href="/emails/newsletters/">Newsletters</a></li> <li><a href="/privacy.html">Privacy policy</a></li> <li><a href="/about/oreilly-approach-to-generative-ai.html">AI policy</a></li> </ul> <a href="https://www.linkedin.com/company/oreilly-media" target="_blank"><svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32.25 32.25"><defs><style>.cls-1{fill:#d30000;fill-rule:evenodd;}</style></defs><title>linkedin-logo</title><path class="cls-1" d="M17.43,13.53v0l0,0ZM16.12,0A16.13,16.13,0,1,0,32.25,16.12,16.12,16.12,0,0,0,16.12,0ZM11.77,22.92H8.12v-11h3.65ZM9.94,10.44h0a1.89,1.89,0,0,1-2-1.89A1.91,1.91,0,0,1,10,6.65a1.9,1.9,0,1,1,0,3.79Zm15,12.48H21.28V17.05c0-1.48-.53-2.49-1.85-2.49a2,2,0,0,0-1.88,1.34,2.63,2.63,0,0,0-.12.89v6.13H13.79s.05-10,0-11h3.64V13.5a3.63,3.63,0,0,1,3.29-1.82c2.4,0,4.21,1.57,4.21,4.95Z"/></svg></a> <a href="https://www.youtube.com/user/OreillyMedia" target="_blank"><svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32.25 32.25"><defs><style>.cls-1{fill:#d30000;fill-rule:evenodd;}</style></defs><title>youtube-logo</title><path class="cls-1" d="M18.35,18.68a.89.89,0,0,0-.86.63V16.94h-1v7.59h1v-.59a.92.92,0,0,0,.89.74c.52,0,.86-.36,1-1.07a8.56,8.56,0,0,0,.14-1.9,10.47,10.47,0,0,0-.12-1.93C19.21,19.05,18.87,18.68,18.35,18.68Zm.09,4.14c-.05.52-.2.77-.45.77s-.43-.21-.49-.63a7.22,7.22,0,0,1,0-1c0-.72,0-1.14,0-1.26.07-.58.23-.88.51-.88s.4.27.46.79c0,.09,0,.47,0,1.13S18.46,22.71,18.44,22.82ZM8.61,18.19H9.86v6.34H11V18.19H12.2V16.94H8.61Zm7.71-6.12c.27,0,.43-.22.49-.66,0-.09,0-.45,0-1.07V9.78c0-.58,0-.93,0-1-.07-.43-.23-.65-.48-.65s-.41.19-.48.57a8.79,8.79,0,0,0,0,1v.53c0,.71,0,1.09,0,1.16C15.88,11.82,16.05,12.07,16.32,12.07Zm-1.74,10.4a2.92,2.92,0,0,1-.06.71c-.07.25-.2.37-.4.37s-.32-.11-.38-.34a2.63,2.63,0,0,1-.05-.66V18.83h-1v4.48c0,.91.33,1.37,1,1.37A1,1,0,0,0,14.6,24v.57h1v-5.7h-1Zm7.1-3.79a1.35,1.35,0,0,0-1.22.59,2.48,2.48,0,0,0-.3,1.07c0,.23,0,.61,0,1.16s0,1.13,0,1.37a2.93,2.93,0,0,0,.35,1.27,1.25,1.25,0,0,0,1.14.54,1.36,1.36,0,0,0,1.13-.45,2.29,2.29,0,0,0,.37-1.43s0-.07,0-.11v-.12h-1c0,.75-.17,1.12-.51,1.12s-.38-.18-.45-.56a4.68,4.68,0,0,1-.06-.9c0-.18,0-.31,0-.37h2v-.43a4.86,4.86,0,0,0-.3-2.11A1.28,1.28,0,0,0,21.68,18.68ZM22.15,21h-1c0-.05,0-.11,0-.16v-.08a1.64,1.64,0,0,1,.11-.8.39.39,0,0,1,.38-.23.42.42,0,0,1,.43.33,2.32,2.32,0,0,1,.07.7Zm-6-21A16.13,16.13,0,1,0,32.25,16.12,16.12,16.12,0,0,0,16.12,0Zm2.51,7.2h1V11a2.52,2.52,0,0,0,.06.66c.06.23.18.34.38.34s.34-.12.41-.37a3.76,3.76,0,0,0,.05-.71V7.2h1v5.74h-1v-.57a1,1,0,0,1-.93.72c-.66,0-1-.46-1-1.38ZM15,8a1.29,1.29,0,0,1,1.33-.92A1.3,1.3,0,0,1,17.65,8a6.77,6.77,0,0,1,.23,2.1,6.77,6.77,0,0,1-.23,2.1,1.3,1.3,0,0,1-1.32.92A1.29,1.29,0,0,1,15,12.17a6.77,6.77,0,0,1-.23-2.1A6.86,6.86,0,0,1,15,8ZM11.45,5.3l.89,2.87.88-2.87H14.4L12.88,9.7v3.24h-1.1V9.7L10.24,5.3ZM24.93,23.91a3,3,0,0,1-3,3h-12a3,3,0,0,1-3-3V18.05a3,3,0,0,1,3-3h12a3,3,0,0,1,3,3Z"/></svg></a> </div> <div class="footer-international"> <h2 class="footer-header">International</h2> <ul class="footer-links"> <li><a href="https://www.oreilly.com/anz/">Australia & New Zealand</a></li> <li><a href="https://oreilly.hk/">Hong Kong & Taiwan</a></li> <li><a href="https://oreillylearning.in/">India</a></li> <li><a href="https://oreilly.id/">Indonesia</a></li> <li><a href="https://www.oreilly.co.jp/index.shtml">Japan</a></li> </ul> </div> </div> </div> <div class="footer-download" id="download-info"> <h2 class="footer-header">Download the O’Reilly App</h2> <p>Take O’Reilly with you and learn anywhere, anytime on your phone <span class="nowrap">and tablet.</span></p> <div class="footer-downloadLinks"> <a href="https://itunes.apple.com/us/app/safari-to-go/id881697395"><img src="https://cdn.oreillystatic.com/oreilly/images/app-store-logo.png" alt="Apple app store" /></a> <a href="https://play.google.com/store/apps/details?id=com.safariflow.queue"><img src="https://cdn.oreillystatic.com/oreilly/images/google-play-logo.png" alt="Google play store" /></a> </div> </div> <div class="footer-download" id="tv-info"> <h2 class="footer-header">Watch on your big screen</h2> <p>View all O’Reilly videos, Superstream events, and Meet the Expert sessions on your <span class="nowrap">home TV.</span></p> <div class="footer-downloadLinks"> <a href="https://channelstore.roku.com/details/c8a2d0096693eb9455f6ac165003ee06/oreilly"><img src="https://cdn.oreillystatic.com/oreilly/images/roku-tv-logo.png" alt="Roku Players and TVs" /></a> <a href="https://www.amazon.com/OReilly-Media-Inc/dp/B087YYHL5C/ref=sr_1_2?dchild=1&keywords=oreilly&qid=1604964116&s=mobile-apps&sr=1-2"><img src="https://cdn.oreillystatic.com/oreilly/images/amazon-appstore-logo.png" alt="Amazon appstore" /></a> </div> </div> <div class="footer-donotsell" id="donotsell-info"> <h2 class="footer-header"><a href="https://www.oreilly.com/privacy.html?donotsell=show">Do not sell or share my personal information</a></h2> </div> </div> <div class="footer-subfooter"> <a href="https://www.oreilly.com" title="home page" aria-current="page"> <img class="footer-subfooterLogo" id="footer-subfooterLogo" src="https://cdn.oreillystatic.com/images/sitewide-headers/oreilly_logo_mark_red.svg" onerror="this.src='https://cdn.oreillystatic.com/images/sitewide-headers/oreilly_logo_mark_red_@2x.png'; this.onerror=null;" alt="O'Reilly home"> </a> <p>© 2024, O’Reilly Media, Inc. All trademarks and registered trademarks appearing on oreilly.com are the property of their respective owners.</p> <p><a href="/terms/">Terms of service</a> • <a href="/privacy.html">Privacy policy</a> • <a href="/about/editorial_independence.html">Editorial independence</a><span class="transparencyStatement" style="display:none;"> • <a href="/modern-slavery-act-transparency-statement.html">Modern Slavery Act Statement</a></span></p> </div> </div> </footer> <script src="https://cdn.oreillystatic.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script> <script> $(function() { //Toggle isActive and mobileHidden classes for mobileNavButton $('nav #mobileNavButton').on('click', function() { var expanded = $(this).attr('aria-expanded') === 'true' || false; $(this).attr('aria-expanded', !expanded); $(this).toggleClass("isActive"); $(this).next().toggleClass("mobileHidden"); }); //Toggle isFocused class for keyboard navigation of submenus $('nav #menuList .menuList-subItem a').each(function(navItem) { $(this).on('focus', function() { $(this).parent().parent().toggleClass('isFocused'); }); $(this).on('blur', function() { $(this).parent().parent().toggleClass('isFocused'); }); }); //Toggle mobileHidden class accordian elements $('.mobileAccordian').each(function() { var $btn = $(this).find('button'); var $target = $(this).next(); $btn.on('click', function() { var expanded = $btn.attr('aria-expanded') === 'true' || false; $btn.attr('aria-expanded', !expanded); $target.toggleClass("mobileHidden"); }); }); //Search platform form action function searchSubmit(e) { e.preventDefault(); sParameter = searchForm.search.value; sParameter = encodeURIComponent(sParameter.trim()); sURL = searchForm.action + '?query=' + sParameter; window.location = sURL; //GA event for search dataLayer.push({ 'event': 'eventTracker', 'eventCat':'site search', 'eventAct':'search box', 'eventLbl':'explore our content', 'eventVal':0, 'nonInteraction': 0, }); } const searchForm = document.getElementById('js-searchForm'); searchForm.addEventListener('submit', searchSubmit); //Search button action function showNavSearch(e) { $('.menuList-item-search').addClass('overlay'); $('.menuList-item-search input#search').focus(); } const searchButton = document.getElementById('js-searchButton'); searchButton.addEventListener('click', showNavSearch); //Close search button action function hideNavSearch(e) { $('.menuList-item-search').removeClass('overlay'); } const searchCloseButton = document.getElementById('js-searchCloseButton'); searchCloseButton.addEventListener('click', hideNavSearch); //"Try Now" nav button tracking $('#nav-tryNow').on('click', function() { dataLayer.push({ 'event': 'eventTracker', 'eventCat':'marketing', 'eventAct':'nav', 'eventLbl':'try now', 'eventVal':0, 'nonInteraction': 0, }); }); //"Sign in" nav button tracking $('#nav-signIn').on('click', function() { dataLayer.push({ 'event': 'eventTracker', 'eventCat':'marketing', 'eventAct':'nav', 'eventLbl':'sign in', 'eventVal':0, 'nonInteraction': 0, }); }); //"O'Reilly Platform" nav button tracking $('#nav-platform').on('click', function() { dataLayer.push({ 'event': 'eventTracker', 'eventCat':'marketing', 'eventAct':'nav', 'eventLbl':'oreilly platform', 'eventVal':0, 'nonInteraction': 0, }); }); }); (function(document, history, location) { var HISTORY_SUPPORT = !!(history && history.pushState); FIXED_HEADER_HEIGHT = document.querySelector('body > header').offsetHeight; FIXED_HEADER_HEIGHT += 20; var anchorScrolls = { ANCHOR_REGEX: /^#[^ ]+$/, OFFSET_HEIGHT_PX: FIXED_HEADER_HEIGHT, /** * Establish events, and fix initial scroll position if a hash is provided. */ init: function() { this.scrollToCurrent(); window.addEventListener('hashchange', this.scrollToCurrent.bind(this)); document.body.addEventListener('click', this.delegateAnchors.bind(this)); }, /** * Return the offset amount to deduct from the normal scroll position. * Modify as appropriate to allow for dynamic calculations */ getFixedOffset: function() { return this.OFFSET_HEIGHT_PX; }, /** * If the provided href is an anchor which resolves to an element on the * page, scroll to it. * @param {String} href * @return {Boolean} - Was the href an anchor. */ scrollIfAnchor: function(href, pushToHistory) { var match, rect, anchorOffset; if(!this.ANCHOR_REGEX.test(href)) { return false; } match = document.getElementById(href.slice(1)); if(match) { rect = match.getBoundingClientRect(); anchorOffset = window.pageYOffset + rect.top - this.getFixedOffset(); // Wait 1ms and scroll. It wasn't consistently scrolling immediately. setTimeout(function(){ window.scroll(window.pageXOffset, anchorOffset); }, 1); // Add the state to history as-per normal anchor links if(HISTORY_SUPPORT && pushToHistory) { history.pushState({}, document.title, location.pathname + href); } } return !!match; }, /** * Attempt to scroll to the current location's hash. */ scrollToCurrent: function() { this.scrollIfAnchor(window.location.hash); }, /** * If the click event's target was an anchor, fix the scroll position. */ delegateAnchors: function(e) { var elem = e.target; if( elem.nodeName === 'A' && this.scrollIfAnchor(elem.getAttribute('href'), true) ) { e.preventDefault(); } } }; window.addEventListener( 'DOMContentLoaded', anchorScrolls.init.bind(anchorScrolls) ); })(window.document, window.history, window.location); </script><script type="text/javascript" src="/J4WowN/Sng6Y/Kb9Sy/mQ/3GS5G8NzDwJpauua/QC9EKwE/NQ0CZU/B6AXI"></script><link rel="stylesheet" type="text/css" href="/J4WowN/Sng6Y/Kb9Sy/mQ/LVS5aS/PnklKwE/UV15SG/sRXXVX"> <script src="/J4WowN/Sng6Y/Kb9Sy/mQ/LVS5aS/PnklKwE/BRl2HU/YXCWco" async defer></script> <div id="sec-overlay" style="display:none;"> <div id="sec-container"> </div> </div></body> </html>