<!DOCTYPE html>
<html lang="en" >
  <head>
    
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="theme-color" content="#B9002D"/>
    

    
      <link rel="preconnect"
        href="https://cdn.oreillystatic.com"
        crossorigin />
        <link rel="preload"
          href="https://cdn.oreillystatic.com/fonts/Gilroy/Family/gilroy-bold.woff2"
          as="font"
          type="font/woff2"
          crossorigin=&#34;anonymous&#34; />
        <link rel="preload"
          href="https://cdn.oreillystatic.com/fonts/Gilroy/Family/gilroy-regular.woff2"
          as="font"
          type="font/woff2"
          crossorigin=&#34;anonymous&#34; />
        <link rel="preload"
          href="https://cdn.oreillystatic.com/fonts/Gilroy/Family/gilroy-medium.woff2"
          as="font"
          type="font/woff2"
          crossorigin=&#34;anonymous&#34; />
        <link rel="preload"
          href="https://cdn.oreillystatic.com/fonts/Gilroy/Family/gilroy-semibold.woff2"
          as="font"
          type="font/woff2"
          crossorigin=&#34;anonymous&#34; />
        <link rel="preload"
          href="https://cdn.oreillystatic.com/fonts/GuardianText/GuardianTextSans-Medium-Web.woff2"
          as="font"
          type="font/woff2"
          crossorigin=&#34;anonymous&#34; />
        <link rel="preload"
          href="https://cdn.oreillystatic.com/fonts/GuardianText/GuardianTextSans-Regular-Web.woff2"
          as="font"
          type="font/woff2"
          crossorigin=&#34;anonymous&#34; />
    

    <link rel="shortcut icon" href="//www.oreilly.com/favicon.ico" />

      <title data-react-helmet="true">Search</title>

    
    
    
    
    <link rel="stylesheet" href="/search/dist/client-render.2J6SJPYI.css" />

      <script>
        (function(h,o,u,n,d) {
          h=h[d]=h[d]||{q:[],onReady:function(c){h.q.push(c)}}
          d=o.createElement(u);d.async=1;d.src=n
          n=o.getElementsByTagName(u)[0];n.parentNode.insertBefore(d,n)
        })(window,document,'script','https://www.datadoghq-browser-agent.com/us1/v5/datadog-rum.js','DD_RUM')
        window.DD_RUM.onReady(function() {
          window.DD_RUM.init({
            clientToken: 'pubc7a62e679b92b903c56ee79f4ca4d203',
            applicationId: 'afaf55a7-3148-4d79-939a-996a5b895ded',
            site: 'datadoghq.com',
            service: 'miso_search_client-browser',
            env: 'production',
            sessionSampleRate: Number('10' || 10),
            sessionReplaySampleRate: Number('' || 10),
            trackUserInteractions: Boolean('' || false),
            trackResources: true,
            trackLongTasks: true,
            defaultPrivacyLevel: 'mask'
          });
        })
      </script>
    <script type="text/javascript">
      // NB: some ORM content contains close script tags as strings and trips up the browser's HTML parser
      window.initialStoreData = {"environment":{"origin":"https://internal-ingress.platform.gcp.oreilly.com","env":"production","nodeEnv":"production","logLevel":"error","reactQueryDevToolsEnabled":false,"xstateDevToolsEnabled":false,"apiPath":"/api/web/search","ingressedPaths":["/search"],"basePath":"/search","publicPath":"/search/dist/","routerBasePath":"/search"},"ldFeatureFlags":{"_loadingState":"SUCCESS","_error":null,"ucvTocDefaultStatus":true,"academicLoginImprovements":false,"academyTrackEnrollment":true,"addContentLevelsToProducts":true,"aiAcademyProgress":true,"aiaComingSoonTracks":false,"allowedEncryptionContextSources":["signup","self-service","signup-3ds-local","signup-cybersource-2-local","signup-3ds","signup-cybersource-2"],"androidEnableAmplitude":true,"androidEnableFullstory":true,"anonymizationActive":true,"anonymizationThrottling":{"batch_delay_seconds":20,"batch_size":1000},"answersExcludeVideo":false,"answersInContent":false,"answersInSearchPosition":3,"answersReporting":true,"answersReportingPhase2":true,"askForReviewsIos":true,"assistantAnswerQuestionTool":false,"assistantShowDebuggingTools":false,"b2CBadgeQuiz":false,"badgeDisableForwarding":true,"boostForAuthorAndPublisherQueries":false,"cachedEmailableResponse":{"time_period_seconds":604800},"certificationsPartnerOutage":false,"chassisHelloToggle":false,"chatbotChapterSummarization":false,"contentPlaygroundPrototype":true,"contentSearchExperiment":false,"cowbirdDontPrefetchTopics":false,"credlyMaintenanceEndTimeString":"8pm PDT","deliverToOracleSandbox":false,"devPerformDataMigrationIos":false,"devShareLoggingDataIos":false,"devTextToSpeechIos":false,"disableIngestionPortal":{"disable_ftp_processing":false,"disable_portal":false},"disableLocalTrainingNotificationsIos":false,"distilledVideos":false,"emailDomainsBannedFromPaymentAttempts":["google.org","protzo.com"],"enableALaCarte":false,"enableAdditionalGroupFieldApi":true,"enableAiCodeResponseFlow":true,"enableAmplitudeIos":true,"enableAssignmentsWith200Users":true,"enableBadgeRevoking":true,"enableBadgeServiceSerializerErrorLogs":false,"enableConversationalAi":false,"enableCoursesQuizFilter":true,"enableDiagnosticAssessmentQuizRetake":true,"enableEmailDeliverabilityCheck":true,"enableEmailverifyappApi":true,"enableFullstoryIos":true,"enableHighlightExportingIos":false,"enableInsightsTextChanges":true,"enableLabFeedback":true,"enableLargeMessagesVmsIngestion":true,"enableLiveCoursesInCoursesUi":true,"enableMarketingTypeTracking":true,"enableMisoSitb":true,"enableNavSkillsABTest":"Explore Skills","enableOacInsightsDashboard":false,"enableOptimizeMultiselect":true,"enablePayPalChoiceButtonInNewPaymentsClient":true,"enablePdsV1AlphaContentIngestionMessages":true,"enablePdsV1AlphaProductIngestionMessages":true,"enablePlatformEntry":false,"enableQuestion":false,"enableQuizIntroScreen":false,"enableReaderLogging":false,"enableRecaps":false,"enableRoiApiSkillEngagementReport":true,"enableRoleAndSkillSelectionInSearch":true,"enableRoleAndSkillSelectorInNav":true,"enableSalesforceServiceCloudAndroid":true,"enableSalesforceServiceCloudIos":true,"enableSandboxExportCommands":false,"enableSearchFilters":false,"enableShortcutsModule":false,"enableSnippetIndexing":false,"enableStructuredLearningReport":true,"enableTimeBasedUsageAndroid":false,"enableTimeBasedUsageAndroidV2":true,"enableTopicBrowseInSearch":true,"enableTopicGraphV1AlphaContentIngestionMessages":true,"enableTtsAndroid":false,"enableUpdatedTimeBasedUsageIos":true,"enableUsageEventCreationLogging":false,"enableUsageEventOnPageEnd":false,"enableUserMismatchMessage":true,"enableUserTitlesV2Endpoint":true,"enableV2ActivityTrendsEndpoint":true,"enableV2DailyUsageEndpoint":false,"enableV2MostPopularSkillsEndpoint":false,"enableHistoryRemoval":true,"enableHistoryRemovalPhaseTwo":false,"enableModernTranscriptions":"enabledClosed","enabledThirdPartyAuthProviders":["corporate","google-oauth2","linkedin-oauth2","apple-id"],"enhanceAnonymousNavigation":true,"enhancedLiveEventSeriesCards":false,"falconCisUrls":false,"feChassisHelloEnableConfirm":false,"geoSpoof":false,"grootUniversalLogin":false,"hasBadgeFilter":false,"hideB2CCancelPageText":false,"hideChatGptSandbox":"disabled","homepageFeaturedEvent":true,"improveSearchCardDescriptions":true,"improveSearchFilters":true,"ingestMultilangTranscripts":true,"insightsTopContentSkills":true,"interactiveContent":true,"ipsProcessProgress":true,"ipsSendXapiToOracle":false,"ipsSendXapiToWorkday":false,"isCredlyDownForMaintenance":false,"listenToDegreedProductMessages":true,"liveEventGroupRegistration":false,"liveEventGroupSharing":true,"liveEventPermissions":false,"liveEventsExperimental":false,"logLowRecaptchaScores":0.5,"loonSendProgressForScenariosQuizzes":false,"loonTrackEnrollment":true,"magicPlaylistBuilder":false,"magpieIngestsFromProductMessage":false,"manyToManySsoDevTools":false,"maxIndividualLoginAttemptsPerTimePeriod":{"max_attempts":5,"time_period_seconds":1800},"maxIndividualRegistrationAttemptsPerTimePeriod":{"max_attempts":5,"time_period_seconds":10800},"maxPasswordResetsPerTimePeriod":{"max_attempts":2,"time_period_seconds":3600},"maxPaymentAttemptsPerTimePeriod":{"time_period_seconds":86400,"max_attempts":30},"msTeamsAnswersInstall":true,"multiSelectPubilicationDate":false,"multiTopicsForSeries":true,"multilateralFederatedAuthIntegrationFe":false,"newSearchPlaceholder":true,"on24Anonymization":false,"paymentsPurchasingPowerParity":true,"pdPrototypeAiChat":false,"pearsonInteractiveInside":false,"performDataMigrationIos":false,"platformNativeLabUbuntuSandbox":true,"playlistAccountSharing":true,"playlistsSectionHeaderOurns":true,"purgeExistingSolrRecordsOnOurnMismatch":true,"replaceMyOreilly":false,"reportTitleSuggestions":false,"rssControlOrVariation":false,"rssVariationType":false,"sandboxesInUcv":["enabled","split"],"scheduledLearning":false,"searchRelevanceTuning":{"tie":0.6,"boost":"if(termfreq(content_type,'chapter'),1.5,1)","collapse":true,"highlight":false,"pqf":{"topic_names":1000,"chapter_title_unstemmed":2000,"content_unstemmed":2000,"title_unstemmed":900,"topic_keywords":600},"qf":{"content":100,"title":50,"topic_keywords":50,"topic_names":50,"chapter_title":100,"chapter_title_unstemmed":100}},"searchWithStandardCards":false,"secondaryTagsForOndemandCourses":true,"sendBadgeTemplatesToCredly":true,"sendCanonProductMessage":true,"sendDegreedXapiStatements":true,"sendDeviceTokensToMarketingCloud":false,"sendPrivateLotVideo":false,"sendQuizScoreMessages":true,"sendTransactionalEmails":true,"sendUpdatedTrackCompletionMessage":false,"sfmcAccountContactEvent":true,"sharingPlaylistsWithGroups":true,"shouldCauseCrashIos":false,"showBadgeEmailModal":false,"showContentCardsInChatbot":false,"showDevTool":false,"showExpandAnswersReporting":true,"showGroupsActivityAtAGlance":true,"showGroupsActivityTrends":true,"showInternalToolsIos":false,"showLinkAppleIcon":true,"showPaymentsNotificationAlert":false,"signup3DsPaymentPage":true,"signupAllowJwt":false,"solrFieldAlias":false,"topicGraphClassifiedUseNew":true,"topicGraphCanonSyncTimeDelay":20,"trackCompletionCsvReport":true,"transcriptionServiceOpenaiTranscripts":true,"unifiedSeamlessOn24Experiment":false,"updatedAiaLink":true,"useIntegrationsAuthService":false,"useMisoStagingEnvironment":false,"useNewFrontendPathForVideoDashes":false,"useOreillyMeter":false,"usersAlwaysAllowedPaymentAttempts":false,"validateInteractivityProxyUrl":false,"videoIntestionServiceUseTranscriptionService":true,"viewAiCloudLabs":false,"viewAnswers20LandingPage":false,"viewAnswers20Nav":false,"viewBoldAnswersInContent":false,"viewDiagnosticBenchmarkAssessment":false,"viewDiscoveryAssistantClient":false,"viewInteractiveAiTutorial":true,"viewSlackAndTeamsLinksOnAnswers20LandingPage":false},"jwt":{"_loadingState":"FAILURE","_error":"No jwt on request."},"navigationAndAnnouncements":{"announcements":[],"links":{"header":[{"name":"Enterprise","link":"/enterprise/","icon":"","classname":"","description":"","isExternal":false,"groups":["header"],"syntheticsId":"","children":[]},{"name":"Pricing","link":"/pricing/","icon":"","classname":"","description":"","isExternal":false,"groups":["header"],"syntheticsId":"","children":[]}],"footer":[{"name":"About O’Reilly","link":"/about/","icon":"","classname":"","description":"","isExternal":false,"groups":["footer"],"syntheticsId":"","children":[]},{"name":"Teach/write/train","link":"/work-with-us.html","icon":"","classname":"","description":"","isExternal":false,"groups":["footer"],"syntheticsId":"","children":[]},{"name":"Careers","link":"/careers/","icon":"","classname":"","description":"","isExternal":false,"groups":["footer"],"syntheticsId":"","children":[]},{"name":"Community partners","link":"/partner/signup.csp","icon":"","classname":"","description":"","isExternal":false,"groups":["footer"],"syntheticsId":"","children":[]},{"name":"Affiliate program","link":"/affiliates/","icon":"","classname":"","description":"","isExternal":false,"groups":["footer"],"syntheticsId":"","children":[]},{"name":"Diversity","link":"/diversity/","icon":"","classname":"","description":"","isExternal":false,"groups":["footer"],"syntheticsId":"","children":[]},{"name":"Support","link":"https://www.oreilly.com/online-learning/support/","icon":"","classname":"","description":"","isExternal":false,"groups":["footer"],"syntheticsId":"","children":[]},{"name":"Contact us","link":"/about/contact.html","icon":"","classname":"","description":"","isExternal":false,"groups":["footer"],"syntheticsId":"","children":[]},{"name":"Newsletters","link":"https://www.oreilly.com/emails/newsletters/","icon":"","classname":"","description":"","isExternal":false,"groups":["footer"],"syntheticsId":"","children":[]}],"marketing-header":[{"name":"For enterprise","link":"https://www.oreilly.com/online-learning/teams.html","icon":"","classname":"","description":"","isExternal":false,"groups":["marketing-header"],"syntheticsId":"","children":[]},{"name":"For government","link":"https://www.oreilly.com/online-learning/government.html","icon":"","classname":"","description":"","isExternal":false,"groups":["marketing-header"],"syntheticsId":"","children":[]},{"name":"For higher ed","link":"https://www.oreilly.com/online-learning/academic.html","icon":"","classname":"","description":"","isExternal":false,"groups":["marketing-header"],"syntheticsId":"","children":[]},{"name":"For individuals","link":"https://www.oreilly.com/online-learning/individuals.html","icon":"","classname":"","description":"","isExternal":false,"groups":["marketing-header"],"syntheticsId":"","children":[]},{"name":"For Sponsorship","link":"https://www.oreilly.com/content-marketing-solutions.html","icon":"","classname":"","description":"","isExternal":false,"groups":["marketing-header"],"syntheticsId":"","children":[]}],"fineprint":[{"name":"Terms of Service","link":"https://www.oreilly.com/terms/","icon":"","classname":"","description":"","isExternal":false,"groups":["fineprint"],"syntheticsId":"","children":[]},{"name":"Privacy Policy","link":"/privacy","icon":"","classname":"","description":"","isExternal":false,"groups":["fineprint"],"syntheticsId":"","children":[]},{"name":"Editorial Independence","link":"/about/editorial_independence.html","icon":"","classname":"","description":"","isExternal":false,"groups":["fineprint"],"syntheticsId":"","children":[]},{"name":"Modern Slavery Act Statement","link":"https://www.oreilly.com/modern-slavery-act-transparency-statement.html","icon":"","classname":"","description":"","isExternal":false,"groups":["fineprint"],"syntheticsId":"","children":[]}],"social":[{"name":"Twitter","link":"https://twitter.com/oreillymedia","icon":"twitter","classname":"","description":"","isExternal":false,"groups":["social"],"syntheticsId":"","children":[]},{"name":"LinkedIn","link":"https://www.linkedin.com/company/oreilly-media","icon":"linkedin","classname":"","description":"","isExternal":false,"groups":["social"],"syntheticsId":"","children":[]},{"name":"YouTube","link":"https://www.youtube.com/user/OreillyMedia","icon":"youtube","classname":"","description":"","isExternal":false,"groups":["social"],"syntheticsId":"","children":[]}],"anon-header":[{"name":"Explore Skills","link":"#","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-header","topbar-left"],"syntheticsId":"","children":[{"name":"Cloud Computing","link":"/search/skills/cloud-computing/","icon":"","classname":"","description":"","isExternal":false,"groups":["topbar-left"],"syntheticsId":"","children":[{"name":"Microsoft Azure","link":"/search/skills/microsoft-azure/","icon":"","classname":"","syntheticsId":""},{"name":"Amazon Web Services (AWS)","link":"/search/skills/amazon-web-services-aws/","icon":"","classname":"","syntheticsId":""},{"name":"Google Cloud","link":"/search/skills/google-cloud/","icon":"","classname":"","syntheticsId":""},{"name":"Cloud Migration","link":"/search/skills/cloud-migration/","icon":"","classname":"","syntheticsId":""},{"name":"Cloud Deployment","link":"/search/skills/cloud-deployment/","icon":"","classname":"","syntheticsId":""},{"name":"Cloud Platforms","link":"/search/skills/cloud-platforms/","icon":"","classname":"","syntheticsId":""}]},{"name":"Data Engineering","link":"/search/skills/data-engineering/","icon":"","classname":"","description":"","isExternal":false,"groups":["topbar-left"],"syntheticsId":"","children":[{"name":"Data Warehouse","link":"/search/skills/data-warehouse/","icon":"","classname":"","syntheticsId":""},{"name":"SQL","link":"/search/skills/sql/","icon":"","classname":"","syntheticsId":""},{"name":"Apache Spark","link":"/search/skills/apache-spark/","icon":"","classname":"","syntheticsId":""},{"name":"Microsoft SQL Server","link":"/search/skills/microsoft-sql-server/","icon":"","classname":"","syntheticsId":""},{"name":"MySQL","link":"/search/skills/mysql/","icon":"","classname":"","syntheticsId":""},{"name":"Kafka","link":"/search/skills/kafka/","icon":"","classname":"","syntheticsId":""},{"name":"Data Lake","link":"/search/skills/data-lake/","icon":"","classname":"","syntheticsId":""},{"name":"Streaming & Messaging","link":"/search/skills/streaming-messaging/","icon":"","classname":"","syntheticsId":""},{"name":"NoSQL Databases","link":"/search/skills/nosql-databases/","icon":"","classname":"","syntheticsId":""},{"name":"Relational Databases","link":"/search/skills/relational-databases/","icon":"","classname":"","syntheticsId":""}]},{"name":"Data Science","link":"/search/skills/data-science/","icon":"","classname":"","description":"","isExternal":false,"groups":["topbar-left"],"syntheticsId":"","children":[]},{"name":"AI & ML","link":"/search/skills/ai-ml/","icon":"","classname":"","description":"","isExternal":false,"groups":["topbar-left"],"syntheticsId":"","children":[{"name":"Generative AI","link":"/search/skills/generative-ai/","icon":"","classname":"","syntheticsId":""},{"name":"Machine Learning","link":"/search/skills/machine-learning/","icon":"","classname":"","syntheticsId":""},{"name":"Artificial Intelligence (AI)","link":"/search/skills/artificial-intelligence-ai/","icon":"","classname":"","syntheticsId":""},{"name":"Deep Learning","link":"/search/skills/deep-learning/","icon":"","classname":"","syntheticsId":""},{"name":"Reinforcement Learning","link":"/search/skills/reinforcement-learning/","icon":"","classname":"","syntheticsId":""},{"name":"Natural Language Processing","link":"/search/skills/natural-language-processing/","icon":"","classname":"","syntheticsId":""},{"name":"TensorFlow","link":"/search/skills/tensorflow/","icon":"","classname":"","syntheticsId":""},{"name":"Scikit-Learn","link":"/search/skills/scikit-learn/","icon":"","classname":"","syntheticsId":""},{"name":"Hyperparameter Tuning","link":"/search/skills/hyperparameter-tuning/","icon":"","classname":"","syntheticsId":""},{"name":"MLOps","link":"/search/skills/mlops/","icon":"","classname":"","syntheticsId":""}]},{"name":"Programming Languages","link":"/search/skills/programming-languages/","icon":"","classname":"","description":"","isExternal":false,"groups":["topbar-left"],"syntheticsId":"","children":[{"name":"Java","link":"/search/skills/java/","icon":"","classname":"","syntheticsId":""},{"name":"JavaScript","link":"/search/skills/javascript/","icon":"","classname":"","syntheticsId":""},{"name":"Spring","link":"/search/skills/spring/","icon":"","classname":"","syntheticsId":""},{"name":"Python","link":"/search/skills/python/","icon":"","classname":"","syntheticsId":""},{"name":"Go","link":"/search/skills/go/","icon":"","classname":"","syntheticsId":""},{"name":"C#","link":"/search/skills/c-sharp/","icon":"","classname":"","syntheticsId":""},{"name":"C++","link":"/search/skills/c-plus-plus/","icon":"","classname":"","syntheticsId":""},{"name":"C","link":"/search/skills/c/","icon":"","classname":"","syntheticsId":""},{"name":"Swift","link":"/search/skills/swift/","icon":"","classname":"","syntheticsId":""},{"name":"Rust","link":"/search/skills/rust/","icon":"","classname":"","syntheticsId":""},{"name":"Functional Programming","link":"/search/skills/functional-programming/","icon":"","classname":"","syntheticsId":""}]},{"name":"Software Architecture","link":"/search/skills/software-architecture/","icon":"","classname":"","description":"","isExternal":false,"groups":["topbar-left"],"syntheticsId":"","children":[{"name":"Object-Oriented","link":"/search/skills/object-oriented-architecture/","icon":"","classname":"","syntheticsId":""},{"name":"Distributed Systems","link":"/search/skills/distributed-systems/","icon":"","classname":"","syntheticsId":""},{"name":"Domain-Driven Design","link":"/search/skills/domain-driven-design/","icon":"","classname":"","syntheticsId":""},{"name":"Architectural Patterns","link":"/search/skills/architectural-patterns/","icon":"","classname":"","syntheticsId":""}]},{"name":"IT/Ops","link":"/search/skills/it-operations/","icon":"","classname":"","description":"","isExternal":false,"groups":["topbar-left"],"syntheticsId":"","children":[]},{"name":"Security","link":"/search/skills/security/","icon":"","classname":"","description":"","isExternal":false,"groups":["topbar-left"],"syntheticsId":"","children":[{"name":"Network Security","link":"/search/skills/network-security/","icon":"","classname":"","syntheticsId":""},{"name":"Application Security","link":"/search/skills/application-security/","icon":"","classname":"","syntheticsId":""},{"name":"Incident Response","link":"/search/skills/incident-response/","icon":"","classname":"","syntheticsId":""},{"name":"Zero Trust Model","link":"/search/skills/zero-trust-model/","icon":"","classname":"","syntheticsId":""},{"name":"Disaster Recovery","link":"/search/skills/disaster-recovery/","icon":"","classname":"","syntheticsId":""},{"name":"Penetration Testing / Ethical Hacking","link":"/search/skills/penetration-testing-ethical-hacking/","icon":"","classname":"","syntheticsId":""},{"name":"Governance","link":"/search/skills/governance/","icon":"","classname":"","syntheticsId":""},{"name":"Malware","link":"/search/skills/malware/","icon":"","classname":"","syntheticsId":""},{"name":"Security Architecture","link":"/search/skills/security-architecture/","icon":"","classname":"","syntheticsId":""},{"name":"Security Engineering","link":"/search/skills/security-engineering/","icon":"","classname":"","syntheticsId":""},{"name":"Security Certifications","link":"/search/skills/security-certifications/","icon":"","classname":"","syntheticsId":""}]},{"name":"Design","link":"/search/skills/design/","icon":"","classname":"","description":"","isExternal":false,"groups":["topbar-left"],"syntheticsId":"","children":[{"name":"Web Design","link":"/search/skills/web-design/","icon":"","classname":"","syntheticsId":""},{"name":"Graphic Design","link":"/search/skills/graphic-design/","icon":"","classname":"","syntheticsId":""},{"name":"Interaction Design","link":"/search/skills/interaction-design/","icon":"","classname":"","syntheticsId":""},{"name":"Film & Video","link":"/search/skills/film-video/","icon":"","classname":"","syntheticsId":""},{"name":"User Experience (UX)","link":"/search/skills/user-experience-ux/","icon":"","classname":"","syntheticsId":""},{"name":"Design Process","link":"/search/skills/design-process/","icon":"","classname":"","syntheticsId":""},{"name":"Design Tools","link":"/search/skills/design-tools/","icon":"","classname":"","syntheticsId":""}]},{"name":"Business","link":"/search/skills/business/","icon":"","classname":"","description":"","isExternal":false,"groups":["topbar-left"],"syntheticsId":"","children":[{"name":"Agile","link":"/search/skills/agile/","icon":"","classname":"","syntheticsId":""},{"name":"Project Management","link":"/search/skills/project-management/","icon":"","classname":"","syntheticsId":""},{"name":"Product Management","link":"/search/skills/product-management/","icon":"","classname":"","syntheticsId":""},{"name":"Marketing","link":"/search/skills/marketing/","icon":"","classname":"","syntheticsId":""},{"name":"Human Resources","link":"/search/skills/human-resources/","icon":"","classname":"","syntheticsId":""},{"name":"Finance","link":"/search/skills/finance/","icon":"","classname":"","syntheticsId":""},{"name":"Team Management","link":"/search/skills/team-management/","icon":"","classname":"","syntheticsId":""},{"name":"Business Strategy","link":"/search/skills/business-strategy/","icon":"","classname":"","syntheticsId":""},{"name":"Digital Transformation","link":"/search/skills/digital-transformation/","icon":"","classname":"","syntheticsId":""},{"name":"Organizational Leadership","link":"/search/skills/organizational-leadership/","icon":"","classname":"","syntheticsId":""}]},{"name":"Soft Skills","link":"/search/skills/soft-skills/","icon":"","classname":"","description":"","isExternal":false,"groups":["topbar-left"],"syntheticsId":"","children":[{"name":"Professional Communication","link":"/search/skills/professional-communication/","icon":"","classname":"","syntheticsId":""},{"name":"Emotional Intelligence","link":"/search/skills/emotional-intelligence/","icon":"","classname":"","syntheticsId":""},{"name":"Presentation Skills","link":"/search/skills/presentation-skills/","icon":"","classname":"","syntheticsId":""},{"name":"Innovation","link":"/search/skills/innovation/","icon":"","classname":"","syntheticsId":""},{"name":"Critical Thinking","link":"/search/skills/critical-thinking/","icon":"","classname":"","syntheticsId":""},{"name":"Public Speaking","link":"/search/skills/public-speaking/","icon":"","classname":"","syntheticsId":""},{"name":"Collaboration","link":"/search/skills/collaboration/","icon":"","classname":"","syntheticsId":""},{"name":"Personal Productivity","link":"/search/skills/personal-productivity/","icon":"","classname":"","syntheticsId":""},{"name":"Confidence / Motivation","link":"/search/skills/confidence-motivation/","icon":"","classname":"","syntheticsId":""}]}]},{"name":"Features","link":"/online-learning/features.html","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-header"],"syntheticsId":"","children":[{"name":"All features","link":"/online-learning/features.html","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-header"],"syntheticsId":"","children":[]},{"name":"Courses","link":"/online-learning/courses.html","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-header"],"syntheticsId":"","children":[]},{"name":"Certifications","link":"/online-learning/feature-certification.html","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-header"],"syntheticsId":"","children":[]},{"name":"Interactive learning","link":"/online-learning/intro-interactive-learning.html","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-header"],"syntheticsId":"","children":[]},{"name":"Live events","link":"/online-learning/live-events.html","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-header"],"syntheticsId":"","children":[]},{"name":"Answers","link":"/online-learning/feature-answers.html","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-header"],"syntheticsId":"","children":[]},{"name":"Insights reporting","link":"/online-learning/insights-dashboard.html","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-header"],"syntheticsId":"","children":[]}]},{"name":"Radar Blog","link":"/radar/","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-header"],"syntheticsId":"","children":[]}],"topbar-left":[{"name":"Explore Skills","link":"#","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-header","topbar-left"],"syntheticsId":"","children":[{"name":"Cloud Computing","link":"/search/skills/cloud-computing/","icon":"","classname":"","description":"","isExternal":false,"groups":["topbar-left"],"syntheticsId":"","children":[{"name":"Microsoft Azure","link":"/search/skills/microsoft-azure/","icon":"","classname":"","syntheticsId":""},{"name":"Amazon Web Services (AWS)","link":"/search/skills/amazon-web-services-aws/","icon":"","classname":"","syntheticsId":""},{"name":"Google Cloud","link":"/search/skills/google-cloud/","icon":"","classname":"","syntheticsId":""},{"name":"Cloud Migration","link":"/search/skills/cloud-migration/","icon":"","classname":"","syntheticsId":""},{"name":"Cloud Deployment","link":"/search/skills/cloud-deployment/","icon":"","classname":"","syntheticsId":""},{"name":"Cloud Platforms","link":"/search/skills/cloud-platforms/","icon":"","classname":"","syntheticsId":""}]},{"name":"Data Engineering","link":"/search/skills/data-engineering/","icon":"","classname":"","description":"","isExternal":false,"groups":["topbar-left"],"syntheticsId":"","children":[{"name":"Data Warehouse","link":"/search/skills/data-warehouse/","icon":"","classname":"","syntheticsId":""},{"name":"SQL","link":"/search/skills/sql/","icon":"","classname":"","syntheticsId":""},{"name":"Apache Spark","link":"/search/skills/apache-spark/","icon":"","classname":"","syntheticsId":""},{"name":"Microsoft SQL Server","link":"/search/skills/microsoft-sql-server/","icon":"","classname":"","syntheticsId":""},{"name":"MySQL","link":"/search/skills/mysql/","icon":"","classname":"","syntheticsId":""},{"name":"Kafka","link":"/search/skills/kafka/","icon":"","classname":"","syntheticsId":""},{"name":"Data Lake","link":"/search/skills/data-lake/","icon":"","classname":"","syntheticsId":""},{"name":"Streaming & Messaging","link":"/search/skills/streaming-messaging/","icon":"","classname":"","syntheticsId":""},{"name":"NoSQL Databases","link":"/search/skills/nosql-databases/","icon":"","classname":"","syntheticsId":""},{"name":"Relational Databases","link":"/search/skills/relational-databases/","icon":"","classname":"","syntheticsId":""}]},{"name":"Data Science","link":"/search/skills/data-science/","icon":"","classname":"","description":"","isExternal":false,"groups":["topbar-left"],"syntheticsId":"","children":[]},{"name":"AI & ML","link":"/search/skills/ai-ml/","icon":"","classname":"","description":"","isExternal":false,"groups":["topbar-left"],"syntheticsId":"","children":[{"name":"Generative AI","link":"/search/skills/generative-ai/","icon":"","classname":"","syntheticsId":""},{"name":"Machine Learning","link":"/search/skills/machine-learning/","icon":"","classname":"","syntheticsId":""},{"name":"Artificial Intelligence (AI)","link":"/search/skills/artificial-intelligence-ai/","icon":"","classname":"","syntheticsId":""},{"name":"Deep Learning","link":"/search/skills/deep-learning/","icon":"","classname":"","syntheticsId":""},{"name":"Reinforcement Learning","link":"/search/skills/reinforcement-learning/","icon":"","classname":"","syntheticsId":""},{"name":"Natural Language Processing","link":"/search/skills/natural-language-processing/","icon":"","classname":"","syntheticsId":""},{"name":"TensorFlow","link":"/search/skills/tensorflow/","icon":"","classname":"","syntheticsId":""},{"name":"Scikit-Learn","link":"/search/skills/scikit-learn/","icon":"","classname":"","syntheticsId":""},{"name":"Hyperparameter Tuning","link":"/search/skills/hyperparameter-tuning/","icon":"","classname":"","syntheticsId":""},{"name":"MLOps","link":"/search/skills/mlops/","icon":"","classname":"","syntheticsId":""}]},{"name":"Programming Languages","link":"/search/skills/programming-languages/","icon":"","classname":"","description":"","isExternal":false,"groups":["topbar-left"],"syntheticsId":"","children":[{"name":"Java","link":"/search/skills/java/","icon":"","classname":"","syntheticsId":""},{"name":"JavaScript","link":"/search/skills/javascript/","icon":"","classname":"","syntheticsId":""},{"name":"Spring","link":"/search/skills/spring/","icon":"","classname":"","syntheticsId":""},{"name":"Python","link":"/search/skills/python/","icon":"","classname":"","syntheticsId":""},{"name":"Go","link":"/search/skills/go/","icon":"","classname":"","syntheticsId":""},{"name":"C#","link":"/search/skills/c-sharp/","icon":"","classname":"","syntheticsId":""},{"name":"C++","link":"/search/skills/c-plus-plus/","icon":"","classname":"","syntheticsId":""},{"name":"C","link":"/search/skills/c/","icon":"","classname":"","syntheticsId":""},{"name":"Swift","link":"/search/skills/swift/","icon":"","classname":"","syntheticsId":""},{"name":"Rust","link":"/search/skills/rust/","icon":"","classname":"","syntheticsId":""},{"name":"Functional Programming","link":"/search/skills/functional-programming/","icon":"","classname":"","syntheticsId":""}]},{"name":"Software Architecture","link":"/search/skills/software-architecture/","icon":"","classname":"","description":"","isExternal":false,"groups":["topbar-left"],"syntheticsId":"","children":[{"name":"Object-Oriented","link":"/search/skills/object-oriented-architecture/","icon":"","classname":"","syntheticsId":""},{"name":"Distributed Systems","link":"/search/skills/distributed-systems/","icon":"","classname":"","syntheticsId":""},{"name":"Domain-Driven Design","link":"/search/skills/domain-driven-design/","icon":"","classname":"","syntheticsId":""},{"name":"Architectural Patterns","link":"/search/skills/architectural-patterns/","icon":"","classname":"","syntheticsId":""}]},{"name":"IT/Ops","link":"/search/skills/it-operations/","icon":"","classname":"","description":"","isExternal":false,"groups":["topbar-left"],"syntheticsId":"","children":[]},{"name":"Security","link":"/search/skills/security/","icon":"","classname":"","description":"","isExternal":false,"groups":["topbar-left"],"syntheticsId":"","children":[{"name":"Network Security","link":"/search/skills/network-security/","icon":"","classname":"","syntheticsId":""},{"name":"Application Security","link":"/search/skills/application-security/","icon":"","classname":"","syntheticsId":""},{"name":"Incident Response","link":"/search/skills/incident-response/","icon":"","classname":"","syntheticsId":""},{"name":"Zero Trust Model","link":"/search/skills/zero-trust-model/","icon":"","classname":"","syntheticsId":""},{"name":"Disaster Recovery","link":"/search/skills/disaster-recovery/","icon":"","classname":"","syntheticsId":""},{"name":"Penetration Testing / Ethical Hacking","link":"/search/skills/penetration-testing-ethical-hacking/","icon":"","classname":"","syntheticsId":""},{"name":"Governance","link":"/search/skills/governance/","icon":"","classname":"","syntheticsId":""},{"name":"Malware","link":"/search/skills/malware/","icon":"","classname":"","syntheticsId":""},{"name":"Security Architecture","link":"/search/skills/security-architecture/","icon":"","classname":"","syntheticsId":""},{"name":"Security Engineering","link":"/search/skills/security-engineering/","icon":"","classname":"","syntheticsId":""},{"name":"Security Certifications","link":"/search/skills/security-certifications/","icon":"","classname":"","syntheticsId":""}]},{"name":"Design","link":"/search/skills/design/","icon":"","classname":"","description":"","isExternal":false,"groups":["topbar-left"],"syntheticsId":"","children":[{"name":"Web Design","link":"/search/skills/web-design/","icon":"","classname":"","syntheticsId":""},{"name":"Graphic Design","link":"/search/skills/graphic-design/","icon":"","classname":"","syntheticsId":""},{"name":"Interaction Design","link":"/search/skills/interaction-design/","icon":"","classname":"","syntheticsId":""},{"name":"Film & Video","link":"/search/skills/film-video/","icon":"","classname":"","syntheticsId":""},{"name":"User Experience (UX)","link":"/search/skills/user-experience-ux/","icon":"","classname":"","syntheticsId":""},{"name":"Design Process","link":"/search/skills/design-process/","icon":"","classname":"","syntheticsId":""},{"name":"Design Tools","link":"/search/skills/design-tools/","icon":"","classname":"","syntheticsId":""}]},{"name":"Business","link":"/search/skills/business/","icon":"","classname":"","description":"","isExternal":false,"groups":["topbar-left"],"syntheticsId":"","children":[{"name":"Agile","link":"/search/skills/agile/","icon":"","classname":"","syntheticsId":""},{"name":"Project Management","link":"/search/skills/project-management/","icon":"","classname":"","syntheticsId":""},{"name":"Product Management","link":"/search/skills/product-management/","icon":"","classname":"","syntheticsId":""},{"name":"Marketing","link":"/search/skills/marketing/","icon":"","classname":"","syntheticsId":""},{"name":"Human Resources","link":"/search/skills/human-resources/","icon":"","classname":"","syntheticsId":""},{"name":"Finance","link":"/search/skills/finance/","icon":"","classname":"","syntheticsId":""},{"name":"Team Management","link":"/search/skills/team-management/","icon":"","classname":"","syntheticsId":""},{"name":"Business Strategy","link":"/search/skills/business-strategy/","icon":"","classname":"","syntheticsId":""},{"name":"Digital Transformation","link":"/search/skills/digital-transformation/","icon":"","classname":"","syntheticsId":""},{"name":"Organizational Leadership","link":"/search/skills/organizational-leadership/","icon":"","classname":"","syntheticsId":""}]},{"name":"Soft Skills","link":"/search/skills/soft-skills/","icon":"","classname":"","description":"","isExternal":false,"groups":["topbar-left"],"syntheticsId":"","children":[{"name":"Professional Communication","link":"/search/skills/professional-communication/","icon":"","classname":"","syntheticsId":""},{"name":"Emotional Intelligence","link":"/search/skills/emotional-intelligence/","icon":"","classname":"","syntheticsId":""},{"name":"Presentation Skills","link":"/search/skills/presentation-skills/","icon":"","classname":"","syntheticsId":""},{"name":"Innovation","link":"/search/skills/innovation/","icon":"","classname":"","syntheticsId":""},{"name":"Critical Thinking","link":"/search/skills/critical-thinking/","icon":"","classname":"","syntheticsId":""},{"name":"Public Speaking","link":"/search/skills/public-speaking/","icon":"","classname":"","syntheticsId":""},{"name":"Collaboration","link":"/search/skills/collaboration/","icon":"","classname":"","syntheticsId":""},{"name":"Personal Productivity","link":"/search/skills/personal-productivity/","icon":"","classname":"","syntheticsId":""},{"name":"Confidence / Motivation","link":"/search/skills/confidence-motivation/","icon":"","classname":"","syntheticsId":""}]}]}],"anon-footer-left":[{"name":"About O'Reilly","link":"/about/","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-footer-left"],"syntheticsId":"","children":[{"name":"Teach/write/train","link":"/work-with-us.html","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-footer-left"],"syntheticsId":"","children":[]},{"name":"Careers","link":"/careers/","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-footer-left"],"syntheticsId":"","children":[]},{"name":"Press releases","link":"/press/","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-footer-left"],"syntheticsId":"","children":[]},{"name":"Media coverage","link":"/press/media-coverage.html","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-footer-left"],"syntheticsId":"","children":[]},{"name":"Content sponsorship","link":"/content-marketing-solutions.html","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-footer-left"],"syntheticsId":"","children":[]},{"name":"Community partners","link":"/partner/signup.csp","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-footer-left"],"syntheticsId":"","children":[]},{"name":"Affiliate program","link":"/affiliates/","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-footer-left"],"syntheticsId":"","children":[]},{"name":"Submit an RFP","link":"/online-learning/rfp.html","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-footer-left"],"syntheticsId":"","children":[]},{"name":"Diversity","link":"/diversity/","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-footer-left"],"syntheticsId":"","children":[]},{"name":"O’Reilly for marketers","link":"/content-marketing-solutions.html","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-footer-left"],"syntheticsId":"","children":[]}]}],"anon-footer-center":[{"name":"Support","link":"https://www.oreilly.com/online-learning/support/","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-footer-center"],"syntheticsId":"","children":[{"name":"Contact us","link":"/contact.html","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-footer-center"],"syntheticsId":"","children":[]},{"name":"Newsletters","link":"/emails/newsletters/","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-footer-center"],"syntheticsId":"","children":[]},{"name":"Privacy policy","link":"/privacy.html","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-footer-center"],"syntheticsId":"","children":[]}]}],"anon-footer-right":[{"name":"International","link":"#","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-footer-right"],"syntheticsId":"","children":[{"name":"Australia & New Zealand","link":"/anz/","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-footer-right"],"syntheticsId":"","children":[]},{"name":"Hong Kong & Taiwan","link":"https://oreilly.hk/","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-footer-right"],"syntheticsId":"","children":[]},{"name":"India","link":"https://oreillylearning.in/","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-footer-right"],"syntheticsId":"","children":[]},{"name":"Indonesia","link":"https://oreilly.id/","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-footer-right"],"syntheticsId":"","children":[]},{"name":"Japan","link":"https://www.oreilly.co.jp/index.shtml","icon":"","classname":"","description":"","isExternal":false,"groups":["anon-footer-right"],"syntheticsId":"","children":[]}]}]}},"playlistsCoreState":{"mostRecentPlaylistIds":[],"playlistActions":{"updatingSharing":false,"sharingErrors":{}},"playlists":{"error":"","fetching":true,"loaded":false,"playlists":[],"sharingEnabled":false},"playlistSSR":{"error":"","fetching":false,"loaded":false,"playlist":{}},"sharedPlaylist":{"error":"","fetching":false,"loaded":false,"playlist":{}}},"user":{"error":"User is not authenticated"},"userInfo":{"meta":{"error":"User is not authenticated"},"profile":{"error":null},"usageStatus":{"error":null}},"userProfile":{"error":{"message":"No encoded jwt."},"_loadingState":"FAILURE"},"reviewsState":{"batchReports":{},"titleReports":{},"userReports":{},"notification":{"active":false,"message":""},"loadingStates":{"batch":"INITIAL","title":"INITIAL","user":"INITIAL"},"error":""}};
      window.__orm_public_path__ = window.initialStoreData?.environment?.publicPath;
    </script>
    <script type="text/javascript">
      window.orm = window.orm || {};
      
      window.orm.redirect = function redirect(url) {
        window.location.assign(url);
      };
      window.orm.logger = console;
      
    </script>
      <script type="text/javascript" src="https://www.datadoghq-browser-agent.com/us1/v5/datadog-logs.js"></script>
      <script type="text/javascript">
        if (window.DD_LOGS) {
          window.DD_LOGS.init({
            clientToken: 'pub8399c9005ebe7454be1698e2aee94fba',
            site: 'datadoghq.com',
            env: 'production',
            service: 'miso_search_client-browser',
            sessionSampleRate: Number('' || 50),
          });
          window.DD_LOGS.logger.setLevel('error' || 'error');
          window.orm.logger = DD_LOGS.logger;
        }
      </script>

    

      <!-- Disable loading Appcues until consent has been given via OneTrust -->
      <script
        src="//fast.appcues.com/48743.js"
        type="text/plain"
        class="optanon-category-C0003"></script>


      
      
      <script type="text/javascript">
        window.orm = window.orm || {};

        const meta = window.initialStoreData.userInfo.meta;
        const ldFeatureFlags = window.initialStoreData.ldFeatureFlags;
        const perms = window.initialStoreData.jwt.perms;

        window.orm.amplitude = {
          apiKey: '49f7a68a857a237d4009d4b4447145b3',
          logLevel: 'warn',
          identity: {
            academic: meta.academic_institution,
            amplitude_account_tier: meta.amplitude_account_tier,
            identifier: meta.user_identifier,
            organizationId: meta.primary_account,
            paidAccount: !!(meta.subscription && meta.subscription.active),
            userType: meta.user_type,
            isGroupAdmin: meta.is_group_admin,
            primaryAccountRoles: meta.primary_account_roles,
            hasAnswersPageAccess: !!(ldFeatureFlags?.viewAnswers20LandingPage && perms?.genai?.includes('v')),
            hasPurchases: meta.has_purchases,
            ...(meta.user_type === 'B2B' && {organizationName: meta.organization_name})
          }
        };
      </script>

      <script>
        // Disable analytics when hit from DD synthetics browser
        if (window._DATADOG_SYNTHETICS_BROWSER === undefined) {
          if (window.initialStoreData && window.initialStoreData.userInfo.meta
            && window.initialStoreData.userInfo.meta.user_identifier && window.initialStoreData.jwt) {
            var user = window.initialStoreData.userInfo.meta;
            var dataLayer = window.dataLayer || [];
            var jwtPerms = window.initialStoreData.jwt.perms;

            // Set user/session info
            dataLayer.push({ userIdentifier: user.user_identifier });
            dataLayer.push({ loggedIn: 'yes' });

            // Set account/org info
            if (!user.individual) {
              dataLayer.push({ orgID: user.primary_account });
            }

            // Set user hasPurchases boolean
            dataLayer.push({ hasPurchases: user.has_purchases.toString() });

            // Set account type
            if (user.individual) {
              if (user.subscription && user.subscription.active) {
                dataLayer.push({learningAccountType: 'individual'});
              } else if (user.is_trial) {
                dataLayer.push({learningAccountType: 'free trial'});
              }
              else if (user.has_purchases && jwtPerms?.prch?.includes('c')){
                dataLayer.push({learningAccountType: 'event purchaser'});
              }
            } else {
              if (user.academic_institution) {
                dataLayer.push({learningAccountType: 'academic'});
              } else {
                dataLayer.push({learningAccountType: 'enterprise'});
              }
            }

            // Set paid account
            if (user.subscription && user.subscription.active) {
              dataLayer.push({ learningPaidAccount: 'yes' });
            }
          }

          (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>

    
      
    
    
    <script type="module" src="/search/dist/client-render.KSSVU3ZG.js" defer></script>

    
    
  </head>
  <body >
      <noscript>
        <iframe src='https://www.googletagmanager.com/ns.html?id=GTM-5P4V6Z'
          height='0' width='0' style='display:none;visibility:hidden'></iframe>
      </noscript>
    <div id="root"><link rel="preload" as="image" href="https://cdn.oreillystatic.com/oreilly/images/app-store-logo.png"/><link rel="preload" as="image" href="https://cdn.oreillystatic.com/oreilly/images/google-play-logo.png"/><link rel="preload" as="image" href="https://cdn.oreillystatic.com/oreilly/images/roku-tv-logo.png"/><link rel="preload" as="image" href="https://cdn.oreillystatic.com/oreilly/images/amazon-appstore-logo.png"/><link rel="preload" as="image" imageSrcSet="https://cdn.oreillystatic.com/images/sitewide-headers/oreilly_logo_mark_red_@2x.png 2x"/><a href="#main" class="orm-ff-AnonymousShell-skipLink">Skip to content</a><header class="orm-ff-MarketingNavigation-mknHeader" data-testid="marketing-navigation"><nav class="orm-ff-MarketingNavigation-mknNav"><ul class="orm-ff-MarketingNavigation-mknUl"><li><a class="orm-ff-MarketingNavigation-mknLink" href="https://www.oreilly.com/online-learning/teams.html">For enterprise</a></li><li><a class="orm-ff-MarketingNavigation-mknLink" href="https://www.oreilly.com/online-learning/government.html">For government</a></li><li><a class="orm-ff-MarketingNavigation-mknLink" href="https://www.oreilly.com/online-learning/academic.html">For higher ed</a></li><li><a class="orm-ff-MarketingNavigation-mknLink" href="https://www.oreilly.com/online-learning/individuals.html">For individuals</a></li><li><a class="orm-ff-MarketingNavigation-mknLink" href="https://www.oreilly.com/content-marketing-solutions.html">For Sponsorship</a></li></ul></nav></header><style data-emotion="css 12jfqzw">.css-12jfqzw{--anonymous-header-submenu-bg:rgba(247, 247, 247, 0.98);--anonymous-header-transition:150ms ease-in-out;--anonymous-nav-cta-color:#0071eb;--anonymous-nav-link-color:#222;--anonymous-nav-link-font-size:0.875rem;--block-padding:1rem;--anon-shell-font--default:var(--font-family-gilroy);--anon-shell-text-transform--default:capitalize;position:-webkit-sticky;position:sticky;top:0;z-index:9;padding-block:var(--block-padding);font-family:var(--anon-shell-font--default);-webkit-backdrop-filter:saturate(200%) blur(16px);backdrop-filter:saturate(200%) blur(16px);background-color:rgba(255, 255, 255, 0.95);border-bottom:1px solid rgba(0, 0, 0, 0.1);box-sizing:border-box;}.css-12jfqzw,.css-12jfqzw *,.css-12jfqzw *::before,.css-12jfqzw *::after{box-sizing:border-box;}@media (min-width: 600px){.css-12jfqzw{--block-padding:1.25rem;}}@media (max-width: 1259.5px){.css-12jfqzw *[class='hide-on-mobile']{display:none;}}@media (min-width: 960px){.css-12jfqzw{--anonymous-nav-link-font-size:0.9375rem;--block-padding:1.5rem;}}</style><header class="css-12jfqzw"><style data-emotion="css yv7gh8">.css-yv7gh8{--gap:1.5rem;max-width:var(--anonymous-max-width);padding-inline:var(--anonymous-inline-padding);width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:var(--gap);}@media (min-width: 1260px){.css-yv7gh8{--gap:3rem;}}</style><div component="div" class="css-yv7gh8"><style data-emotion="css 112jqer">.css-112jqer{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}</style><a href="//www.oreilly.com" title="Visit Homepage" class="css-112jqer"><style data-emotion="css nkdw1c">.css-nkdw1c{--max-height:1.5rem;display:block;margin:0;height:var(--max-height);}@media (min-width: 600px){.css-nkdw1c{--max-height:1.75rem;}}</style><svg viewBox="0 0 198 36" class="css-nkdw1c"><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="oreilly_logo_mark_red_d30000" fill="#D30000" fill-rule="nonzero"><path d="M64.5161,20.2636 C68.4431,19.0876 71.3061,15.4576 71.3081,11.1476 C71.3061,5.8876 67.0461,1.6276 61.7861,1.6256 L45.3831,1.6256 L45.3831,34.2716 L50.8251,34.2716 L50.8251,20.6696 L58.4031,20.6696 L66.6121,34.2716 L72.9581,34.2716 L64.5161,20.2636 Z M50.8251,15.2266 L50.8251,7.0646 L61.7861,7.0646 C64.0381,7.0686 65.8631,8.8926 65.8661,11.1476 C65.8631,13.3976 64.0381,15.2226 61.7861,15.2266 L50.8251,15.2266 Z M41.5274,5.0991 C41.5274,7.3121 39.7344,9.1071 37.5224,9.1071 C35.3104,9.1071 33.5164,7.3121 33.5164,5.0991 C33.5164,2.8871 35.3104,1.0941 37.5224,1.0941 C39.7344,1.0941 41.5274,2.8871 41.5274,5.0991 M0.0004,18.0991 C0.0014,8.7071 7.6114,1.0961 17.0044,1.0941 C26.3964,1.0961 34.0054,8.7071 34.0074,18.0991 C34.0054,27.4891 26.3964,35.1001 17.0044,35.1021 C7.6114,35.1001 0.0014,27.4891 0.0004,18.0991 M8.8274,9.9201 C6.7314,12.0241 5.4424,14.8961 5.4414,18.0991 C5.4424,21.2991 6.7314,24.1731 8.8274,26.2731 C10.9284,28.3701 13.8024,29.6591 17.0044,29.6611 C20.2054,29.6591 23.0774,28.3701 25.1794,26.2731 C27.2764,24.1731 28.5654,21.2991 28.5654,18.0991 C28.5654,14.8961 27.2764,12.0241 25.1794,9.9201 C23.0774,7.8261 20.2054,6.5381 17.0044,6.5361 C13.8024,6.5381 10.9284,7.8261 8.8274,9.9201" id="Shape"></path><polygon id="Path" points="187.27 1.625 180.658 1.625 172.284 13.745 163.909 1.625 157.297 1.625 169.556 19.375 169.556 34.271 175 34.271 175 19.388"></polygon><path d="M193.7081,0.8974 C191.4841,0.8974 189.6801,2.7004 189.6801,4.9234 C189.6801,7.1464 191.4841,8.9494 193.7081,8.9494 C195.9291,8.9494 197.7341,7.1464 197.7341,4.9234 C197.7341,2.7004 195.9291,0.8974 193.7081,0.8974 M193.7081,8.3054 C191.8411,8.3054 190.3261,6.7904 190.3261,4.9234 C190.3261,3.0554 191.8411,1.5404 193.7081,1.5404 C195.5721,1.5404 197.0881,3.0554 197.0881,4.9234 C197.0881,6.7904 195.5721,8.3054 193.7081,8.3054" id="Shape"></path><path d="M195.5133,4.038 C195.5133,3.377 194.9803,2.842 194.3183,2.842 L192.0523,2.842 L192.0523,6.945 L192.7333,6.945 L192.7333,5.236 L193.8823,5.236 L194.7053,6.945 L195.4663,6.945 L194.6243,5.197 C195.1373,5.062 195.5133,4.595 195.5133,4.038 Z M192.7333,3.526 L194.3183,3.526 C194.6033,3.526 194.8293,3.755 194.8293,4.038 C194.8293,4.322 194.6033,4.552 194.3183,4.552 L192.7333,4.552 L192.7333,3.526 Z" id="Shape"></path><polygon id="Path" points="99.462 7.064 99.462 1.625 76.766 1.625 76.766 34.271 99.462 34.271 99.462 28.829 82.205 28.829 82.205 20.668 98.631 20.668 98.631 15.226 82.205 15.226 82.205 7.064"></polygon><polygon id="Path" points="116.303 34.271 116.303 1.625 121.744 1.625 121.744 28.829 137.44 28.829 137.44 34.271"></polygon><polygon id="Path" points="141.875 34.271 141.875 1.625 147.318 1.625 147.318 28.829 163.013 28.829 163.013 34.271"></polygon><polygon id="Path" points="105.172 34.271 110.612 34.271 110.612 1.625 105.172 1.625"></polygon></g></g></svg></a><style data-emotion="css 188sh19">.css-188sh19{--display:block;--size:2.5rem;position:relative;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:var(--display);height:var(--size);-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;margin:0;padding:0;width:var(--size);-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;background-color:transparent;border:none;cursor:pointer;}@media (max-width: 599px){.css-188sh19{margin-left:auto;}}@media (min-width: 600px){.css-188sh19{-webkit-order:1;-ms-flex-order:1;order:1;}}@media (min-width: 1260px){.css-188sh19{--display:none;}}</style><button aria-expanded="false" title="Toggle Navigation open/closed" data-testid="navigation-toggle" class="css-188sh19"><style data-emotion="css 3kn6vf">.css-3kn6vf{position:absolute;left:10px;top:50%;z-index:0;display:block;width:28px;height:4px;background-color:#222;-webkit-transition:-webkit-transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1),background-color 0s 0.1s cubic-bezier(0.645, 0.045, 0.355, 1);transition:transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1),background-color 0s 0.1s cubic-bezier(0.645, 0.045, 0.355, 1);}.css-3kn6vf::after{bottom:-9px;position:absolute;display:block;margin-top:-2px;width:28px;height:4px;background-color:#222;z-index:0;content:'';-webkit-transition:-webkit-transform 0s 0.1s cubic-bezier(0.645, 0.045, 0.355, 1);transition:transform 0s 0.1s cubic-bezier(0.645, 0.045, 0.355, 1);}.css-3kn6vf::before{position:absolute;top:-9px;z-index:0;display:block;width:28px;height:4px;background-color:#222;content:'';-webkit-transition:-webkit-transform 0s 0.1s cubic-bezier(0.645, 0.045, 0.355, 1);transition:transform 0s 0.1s cubic-bezier(0.645, 0.045, 0.355, 1);}</style><span class="css-3kn6vf"></span></button><style data-emotion="css 1h0h1xe">.css-1h0h1xe{--background-color:var(--anonymous-header-submenu-bg);--margin-left:0;--position:absolute;left:0;position:var(--position);right:0;top:100%;z-index:1;margin-left:var(--margin-left);background-color:var(--background-color);-webkit-transition:opacity var(--anonymous-header-transition);transition:opacity var(--anonymous-header-transition);}@media (max-width: 599px){.css-1h0h1xe{opacity:0;pointer-events:none;height:calc(100dvh - 72px);width:100%;overflow-y:auto;}}@media (min-width: 600px){.css-1h0h1xe{--background-color:transparent;--margin-left:auto;--position:static;}}@media (min-width: 600px) and (max-width: 1259.5px){.css-1h0h1xe{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}}@media (min-width: 1260px){.css-1h0h1xe{--margin-left:0;--position:static;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1;-ms-flex:1;flex:1;}}</style><div data-testid="navigation-wrapper" class="css-1h0h1xe"><style data-emotion="css 7buo1">.css-7buo1{--border-bottom:1px solid #fff;--alignment:flex-start;--flex-direction:column;--gap:0;--padding:0.5rem 0;margin:0;padding:var(--padding);margin-left:auto;-webkit-align-items:var(--alignment);-webkit-box-align:var(--alignment);-ms-flex-align:var(--alignment);align-items:var(--alignment);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:var(--flex-direction);-ms-flex-direction:var(--flex-direction);flex-direction:var(--flex-direction);gap:var(--gap);border-bottom:var(--border-bottom);list-style:none;}@media (max-width: 599px){.css-7buo1 li{width:100%;}}@media (min-width: 600px){.css-7buo1{--alignment:center;--border-bottom:none;--flex-direction:row;--gap:1rem;--padding:0;-webkit-order:1;-ms-flex-order:1;order:1;}}</style><ul class="css-7buo1"><li><style data-emotion="css 1wst67d">.css-1wst67d{--color:var(--anonymous-nav-link-color);--padding:1rem 1.25rem;display:block;padding:var(--padding);color:var(--color);font-size:var(--anonymous-nav-link-font-size);letter-spacing:0.02em;line-height:1;-webkit-text-decoration:none;text-decoration:none;}@media (hover: hover){.css-1wst67d:hover{-webkit-text-decoration:underline;text-decoration:underline;}}@media (min-width: 600px){.css-1wst67d{--color:var(--anonymous-nav-cta-color);--padding:0;font-weight:600;text-transform:var(--anon-shell-text-transform--default);}}@media (min-width: 600px) and (hover: hover){.css-1wst67d{border-bottom:2px solid transparent;}.css-1wst67d:hover{color:var(--color);border-bottom:2px solid var(--anonymous-nav-cta-color);-webkit-text-decoration:none;text-decoration:none;}}</style><a href="https://www.oreilly.com/online-learning/pricing.html" class="css-1wst67d">Plans</a></li><li><a href="https://www.oreilly.com/member/login/" class="css-1wst67d">Sign In</a></li><li><style data-emotion="css x6rd8v">.css-x6rd8v{--color:var(--anonymous-nav-link-color);--font-size:var(--anonymous-nav-link-font-size);--padding:0.5rem 1.25rem;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:0.5rem;padding:var(--padding);color:var(--color);font-size:var(--font-size);-webkit-text-decoration:none;text-decoration:none;}@media (hover: hover){.css-x6rd8v:hover{-webkit-text-decoration:underline;text-decoration:underline;}}@media (max-width: 599px){.css-x6rd8v svg{display:none;}}@media (min-width: 600px){.css-x6rd8v{--color:#fff;--font-size:1rem;font-family:var(--anon-shell-font--default);font-weight:600;background-color:var(--anonymous-nav-cta-color);border-radius:2px;}}@media (min-width: 600px) and (hover: hover){.css-x6rd8v:hover{color:var(--color);box-shadow:0 1px 4px rgb(0 0 0 / 30%);-webkit-text-decoration:none;text-decoration:none;}}</style><a href="https://www.oreilly.com/online-learning/try-now.html" class="css-x6rd8v">Try Now <style data-emotion="css ujgrjc">.css-ujgrjc{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:1em;height:1em;display:inline-block;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-transition:fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;fill:currentColor;font-size:1.7142857142857142rem;font-size:16px;}</style><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-ujgrjc" focusable="false" aria-hidden="true" viewBox="0 0 20 20" fill="none"><path d="M5.5 16.7142C5.5 17.4465 6.11034 18 6.87045 18C7.25163 18 7.57887 17.8528 7.82823 17.6304L15.0755 10.9405L15.0798 10.9365C15.3461 10.6849 15.5 10.3615 15.5 9.99568C15.5 9.65583 15.3585 9.30318 15.0681 9.05271L7.82738 2.37726C7.58041 2.14511 7.24835 2 6.87045 2C6.11034 2 5.5 2.55348 5.5 3.28584C5.5 3.63671 5.64856 3.95598 5.88158 4.18983L5.88909 4.19737L12.166 9.99593L5.89664 15.7956L5.89275 15.7993C5.64484 16.0335 5.5 16.3602 5.5 16.7142Z" fill="currentColor"></path></svg></a></li></ul><style data-emotion="css hso8a">.css-hso8a{--background-color:transparent;--alignment:flex-start;--flex-direction:column;--gap:0;--position:static;position:var(--position);-webkit-align-items:var(--alignment);-webkit-box-align:var(--alignment);-ms-flex-align:var(--alignment);align-items:var(--alignment);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:var(--flex-direction);-ms-flex-direction:var(--flex-direction);flex-direction:var(--flex-direction);gap:var(--gap);background-color:var(--background-color);}@media (min-width: 600px) and (max-width: 1259.5px){.css-hso8a{--background-color:var(--anonymous-header-submenu-bg);--position:absolute;right:0;top:100%;width:19rem;opacity:0;pointer-events:none;-webkit-transition:opacity var(--anonymous-header-transition);transition:opacity var(--anonymous-header-transition);}}@media (min-width: 1260px){.css-hso8a{--alignment:center;--flex-direction:row;--gap:1rem;}}</style><nav title="website navigation" class="css-hso8a"><ul class="orm-ff-Level1Menu-level1Menu" data-testid="level-1-menu" id="website-navigation-menu"><li data-testid="level-1-menu-item" id="website-navigation-menu-list-item-0"><button class="orm-ff-MenuLink-menuLink" aria-expanded="false" aria-controls="website-navigation-menu-container-0" data-testid="level-1-toggle-explore-skills" data-variant="level-1" type="button">Explore Skills<style data-emotion="css h7vcrc">.css-h7vcrc{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:1em;height:1em;display:inline-block;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-transition:fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;fill:currentColor;font-size:1.7142857142857142rem;font-size:8px;}</style><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-h7vcrc" focusable="false" aria-hidden="true" viewBox="0 0 20 20" fill="none"><path d="M3.28584 5C2.55348 5 2 5.61034 2 6.37045C2 6.75163 2.14716 7.07887 2.3696 7.32823L9.05948 14.5755L9.06355 14.5798C9.31508 14.8461 9.63852 15 10.0043 15C10.3442 15 10.6968 14.8585 10.9473 14.5681L17.6227 7.32738C17.8549 7.08041 18 6.74835 18 6.37045C18 5.61034 17.4465 5 16.7142 5C16.3633 5 16.044 5.14856 15.8102 5.38158L15.8026 5.38909L10.0041 11.666L4.20438 5.39664L4.2007 5.39275C3.96654 5.14484 3.63979 5 3.28584 5Z" fill="currentColor"></path></svg></button></li><li data-testid="level-1-menu-item" id="website-navigation-menu-list-item-1"><button class="orm-ff-MenuLink-menuLink" aria-expanded="false" aria-controls="website-navigation-menu-container-1" data-testid="level-1-toggle-features" data-variant="level-1" type="button">Features<svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-h7vcrc" focusable="false" aria-hidden="true" viewBox="0 0 20 20" fill="none"><path d="M3.28584 5C2.55348 5 2 5.61034 2 6.37045C2 6.75163 2.14716 7.07887 2.3696 7.32823L9.05948 14.5755L9.06355 14.5798C9.31508 14.8461 9.63852 15 10.0043 15C10.3442 15 10.6968 14.8585 10.9473 14.5681L17.6227 7.32738C17.8549 7.08041 18 6.74835 18 6.37045C18 5.61034 17.4465 5 16.7142 5C16.3633 5 16.044 5.14856 15.8102 5.38158L15.8026 5.38909L10.0041 11.666L4.20438 5.39664L4.2007 5.39275C3.96654 5.14484 3.63979 5 3.28584 5Z" fill="currentColor"></path></svg></button></li><li data-testid="level-1-menu-item" id="website-navigation-menu-list-item-2"><a class="orm-ff-MenuLink-menuLink" href="/radar/" data-testid="level-1-link-radar-blog" data-variant="level-1">Radar Blog</a></li></ul><style data-emotion="css 10gqpu1">.css-10gqpu1{--display:none;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:var(--display);height:2rem;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;margin:0;padding:0;width:2rem;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;border:none;cursor:pointer;}@media (min-width: 1260px){.css-10gqpu1{--display:flex;}}</style><button type="button" title="Open Search Form" data-testid="OpenSearch" class="css-10gqpu1"><svg width="20px" height="20px" viewBox="0 0 20 20" fill="#555555"><path d="M7.5455,2.25266666 C10.4271667,2.25933334 12.7605,4.54433334 12.7605,7.361 C12.7605,10.1776667 10.4271667,12.4626667 7.5455,12.4693625 C4.66383334,12.476 2.3205,10.201 2.30713677,7.38433334 C2.30383334,6.02433334 2.8555,4.71933334 3.83716666,3.756 C4.8205,2.79433334 6.1555,2.25266666 7.5455,2.25266666 L7.5455,2.25266666 Z M7.5455,14.7676666 C8.97883334,14.7743334 10.3855,14.3793334 11.5971667,13.6293334 L17.4171666,19.3176666 C17.7571666,19.6493334 18.3088334,19.6493334 18.6505,19.3176666 L19.7438334,18.2493334 C20.0838334,17.9143334 20.0838334,17.376 19.7438334,17.0426666 L13.9238334,11.3543333 C15.7788334,8.511 15.4271666,4.801 13.0705,2.33766666 C10.7121667,-0.124 6.94716666,-0.712333334 3.92216666,0.909333334 C0.897166666,2.531 -0.6195,5.951 0.237166666,9.21766666 C1.09383333,12.4843333 4.10716666,14.7693334 7.55716666,14.7676666 L7.5455,14.7676666 Z" id="Fill-1"></path></svg></button><style data-emotion="css r95n5x">.css-r95n5x{--padding:1rem 1.25rem;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;padding:var(--padding);width:100%;-webkit-transition:opacity var(--anonymous-header-transition);transition:opacity var(--anonymous-header-transition);}@media (min-width: 1260px){.css-r95n5x{--padding:0;inset:0;position:absolute;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;background-color:rgba(220, 220, 220, 0.9);-webkit-backdrop-filter:saturate(200%) blur(16px);backdrop-filter:saturate(200%) blur(16px);opacity:0;pointer-events:none;}}</style><form data-testid="SearchForm" class="css-r95n5x" action="https://www.oreilly.com/search/"><style data-emotion="css 4rnvmw">.css-4rnvmw{--border-radius:0;--max-width:32rem;position:relative;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:0.5rem;max-width:var(--max-width);width:100%;background-color:#fff;border:1px solid #ddd;border-radius:var(--border-radius);overflow:hidden;}@media (min-width: 1260px){.css-4rnvmw{--border-radius:0.5rem;}}</style><div class="css-4rnvmw"><style data-emotion="css 4ip44h">.css-4ip44h{position:absolute;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;width:2rem;}</style><span class="css-4ip44h"><svg width="20px" height="20px" viewBox="0 0 20 20" fill="#555555"><path d="M7.5455,2.25266666 C10.4271667,2.25933334 12.7605,4.54433334 12.7605,7.361 C12.7605,10.1776667 10.4271667,12.4626667 7.5455,12.4693625 C4.66383334,12.476 2.3205,10.201 2.30713677,7.38433334 C2.30383334,6.02433334 2.8555,4.71933334 3.83716666,3.756 C4.8205,2.79433334 6.1555,2.25266666 7.5455,2.25266666 L7.5455,2.25266666 Z M7.5455,14.7676666 C8.97883334,14.7743334 10.3855,14.3793334 11.5971667,13.6293334 L17.4171666,19.3176666 C17.7571666,19.6493334 18.3088334,19.6493334 18.6505,19.3176666 L19.7438334,18.2493334 C20.0838334,17.9143334 20.0838334,17.376 19.7438334,17.0426666 L13.9238334,11.3543333 C15.7788334,8.511 15.4271666,4.801 13.0705,2.33766666 C10.7121667,-0.124 6.94716666,-0.712333334 3.92216666,0.909333334 C0.897166666,2.531 -0.6195,5.951 0.237166666,9.21766666 C1.09383333,12.4843333 4.10716666,14.7693334 7.55716666,14.7676666 L7.5455,14.7676666 Z" id="Fill-1"></path></svg></span><style data-emotion="css 1tx5k8f">.css-1tx5k8f{display:block;min-height:1.75rem;padding:0.5rem;padding-left:2rem;width:100%;font-size:0.9375rem;line-height:1em;font-family:var(--anon-shell-font--default);border:2px solid transparent;border-radius:0.5rem;}.css-1tx5k8f:focus{outline:none;border-color:var(--anonymous-nav-cta-color);}</style><input autoComplete="off" id="search" maxLength="500" placeholder="Explore our content" required="" type="search" class="css-1tx5k8f" name="q"/></div><style data-emotion="css 1r3dmoh">.css-1r3dmoh{--display:none;--size:3rem;bottom:0;position:absolute;right:0;top:0;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:var(--display);-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;width:var(--size);background-color:transparent;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;border:none;cursor:pointer;opacity:0.5;-webkit-transition:opacity var(--anonymous-header-transition);transition:opacity var(--anonymous-header-transition);}.css-1r3dmoh:focus{opacity:1;}@media (hover: hover){.css-1r3dmoh:hover{opacity:1;}}.css-1r3dmoh svg{--icon-size:1.25rem;display:block;height:var(--icon-size);margin:0;width:var(--icon-size);}@media (min-width: 1260px){.css-1r3dmoh{--display:flex;}}</style><button type="button" title="Close Search Form" data-testid="CloseSearch" class="css-1r3dmoh"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-ujgrjc" focusable="false" aria-hidden="true" viewBox="0 0 8 8" fill="none"><path fill-rule="evenodd" clip-rule="evenodd" d="M0.948112 0C0.408563 0 4.11814e-06 0.431923 4.11814e-06 0.95467C4.11814e-06 1.22411 0.111261 1.45183 0.267234 1.61743L2.58966 4.00047L0.27598 6.37752C0.108619 6.54684 0 6.77982 0 7.04533C0 7.56808 0.408558 8 0.948108 8C1.20588 8 1.43872 7.89659 1.60824 7.73661L1.61715 7.7282L3.99833 5.28676L6.37456 7.71975L6.37891 7.72411C6.5552 7.90088 6.79692 8 7.05189 8C7.59144 8 8 7.56808 8 7.04533C8 6.77589 7.88874 6.54817 7.73277 6.38257L5.41034 3.99953L7.72402 1.62247C7.89138 1.45316 8 1.22017 8 0.95467C8 0.431923 7.59144 0 7.05189 0C6.79412 0 6.56126 0.10342 6.39175 0.263408L6.38285 0.27181L4.00167 2.71324L1.62544 0.280255L1.62109 0.275892C1.4448 0.099117 1.20308 0 0.948112 0Z" fill="currentColor"></path></svg></button></form></nav></div></div></header><main id="main" class="orm-ff-AnonymousShell-anonMain" data-testid="AnonymousShell"><style data-emotion="css t2rnx0">.css-t2rnx0{--header-offset:52px;display:grid;gap:0;grid-template-areas:'header' 'sidebar' 'content';}@media (min-width: 1200px){.css-t2rnx0{grid-template-areas:'sidebar header' 'sidebar content';grid-template-columns:22rem minmax(min-content, 100%);grid-template-rows:auto 1fr;height:calc(100dvh - var(--header-offset));overflow:hidden;}}@media (min-width: 1280px){.css-t2rnx0{--header-offset:72px;}}</style><div data-testid="streamlined-search" class="css-t2rnx0"><style data-emotion="css jzs69j">.css-jzs69j{grid-area:sidebar;}@media (min-width: 1200px){.css-jzs69j{position:-webkit-sticky;position:sticky;top:0;height:100%;padding:1rem 2rem;overflow-y:hidden;}}</style><aside data-identifier="area-sidebar" class="css-jzs69j"><style data-emotion="css 8y1bsd">@media (max-width: 1199.5px){.css-8y1bsd{padding:0.5rem;background:#f3f2f5;}}@media (min-width: 1200px){.css-8y1bsd{height:100%;padding:1rem 0.75rem;border:1px solid #f3f2f5;border-radius:1.25rem;overflow-y:auto;}}</style><div data-identifier="container-sidebar" class="css-8y1bsd"><style data-emotion="css u3tkuv">.css-u3tkuv{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;max-height:100%;overflow-y:auto;-ms-overflow-style:none;scrollbar-width:none;}@media (min-width: 1200px){.css-u3tkuv{-webkit-align-items:flex-start;-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}}.css-u3tkuv::-webkit-scrollbar{display:none;}</style><div data-identifier="filters" class="css-u3tkuv"><style data-emotion="css b6xqfj">@media (min-width: 1200px){.css-b6xqfj{display:none;}}</style><style data-emotion="css qpryxg">.css-qpryxg{margin:0;font-family:Gilroy;font-weight:500;font-size:0.8888rem;line-height:1.1252;letter-spacing:0;color:inherit;}@media (min-width: 1200px){.css-qpryxg{display:none;}}</style><div class="MuiTypography-root MuiTypography-uiBodySmall css-qpryxg">Loading...</div><style data-emotion="css xf2uzt">.css-xf2uzt{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:0.25rem;color:#0071eb;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;background:transparent;border:none;cursor:pointer;}@media (min-width: 1200px){.css-xf2uzt{display:none;}}</style><button aria-controls="filters-dialog" class="css-xf2uzt">Filter <style data-emotion="css 16yepig">.css-16yepig{pointer-events:none;}</style><svg width="17" height="15" viewBox="0 0 17 15" fill="none" xmlns="http://www.w3.org/2000/svg" class="css-16yepig"><path d="M1.85773e-07 2.12807C1.85773e-07 2.372 0.190279 2.56975 0.425 2.56975H16.575C16.8097 2.56975 17 2.372 17 2.12807C17 1.88414 16.8097 1.6864 16.575 1.6864H0.425001C0.19028 1.6864 1.85773e-07 1.88414 1.85773e-07 2.12807Z" fill="currentColor"></path><path d="M15.6864 2.16822C15.6864 0.970747 14.7523 0 13.6 0C12.4477 0 11.5136 0.970747 11.5136 2.16822C11.5136 3.3657 12.4477 4.33645 13.6 4.33645C14.7523 4.33645 15.6864 3.3657 15.6864 2.16822Z" fill="white"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M13.6 0.963655C14.2401 0.963655 14.7591 1.50296 14.7591 2.16822C14.7591 2.83349 14.2401 3.37279 13.6 3.37279C12.9599 3.37279 12.4409 2.83349 12.4409 2.16822C12.4409 1.50296 12.9599 0.963655 13.6 0.963655ZM13.6 0C14.7523 0 15.6864 0.970747 15.6864 2.16822C15.6864 3.3657 14.7523 4.33645 13.6 4.33645C12.4477 4.33645 11.5136 3.3657 11.5136 2.16822C11.5136 0.970747 12.4477 0 13.6 0Z" fill="currentColor"></path><path d="M17 7.54015C17 7.29622 16.8097 7.09848 16.575 7.09848L0.425001 7.09847C0.19028 7.09847 2.052e-08 7.29622 0 7.54015C-2.052e-08 7.78408 0.190279 7.98183 0.425 7.98183L16.575 7.98183C16.8097 7.98183 17 7.78408 17 7.54015Z" fill="currentColor"></path><path d="M1.31364 7.5C1.31364 8.69748 2.24773 9.66822 3.4 9.66822C4.55227 9.66822 5.48636 8.69748 5.48636 7.5C5.48636 6.30252 4.55227 5.33177 3.4 5.33177C2.24773 5.33177 1.31364 6.30252 1.31364 7.5Z" fill="white"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M3.4 8.70457C2.75985 8.70457 2.24091 8.16526 2.24091 7.5C2.24091 6.83473 2.75985 6.29543 3.4 6.29543C4.04015 6.29543 4.55909 6.83473 4.55909 7.5C4.55909 8.16526 4.04015 8.70457 3.4 8.70457ZM3.4 9.66822C2.24773 9.66822 1.31364 8.69748 1.31364 7.5C1.31364 6.30252 2.24773 5.33177 3.4 5.33177C4.55227 5.33177 5.48636 6.30252 5.48636 7.5C5.48636 8.69748 4.55227 9.66822 3.4 9.66822Z" fill="currentColor"></path><path d="M17 12.8719C17 12.628 16.8097 12.4303 16.575 12.4303L0.425001 12.4303C0.19028 12.4303 2.052e-08 12.628 0 12.8719C-2.052e-08 13.1159 0.190279 13.3136 0.425 13.3136L16.575 13.3136C16.8097 13.3136 17 13.1159 17 12.8719Z" fill="currentColor"></path><path d="M7.29954 12.8318C7.29954 14.0293 8.23363 15 9.3859 15C10.5382 15 11.4723 14.0293 11.4723 12.8318C11.4723 11.6343 10.5382 10.6636 9.3859 10.6636C8.23363 10.6636 7.29954 11.6343 7.29954 12.8318Z" fill="white"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M9.3859 14.0363C8.74575 14.0363 8.22681 13.497 8.22681 12.8318C8.22681 12.1665 8.74575 11.6272 9.3859 11.6272C10.026 11.6272 10.545 12.1665 10.545 12.8318C10.545 13.497 10.026 14.0363 9.3859 14.0363ZM9.3859 15C8.23363 15 7.29954 14.0293 7.29954 12.8318C7.29954 11.6343 8.23363 10.6636 9.3859 10.6636C10.5382 10.6636 11.4723 11.6343 11.4723 12.8318C11.4723 14.0293 10.5382 15 9.3859 15Z" fill="currentColor"></path></svg></button><style data-emotion="css wry49w">.css-wry49w{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;gap:0.25rem;margin:0;max-height:none;max-width:none;width:100%;border:none;}.css-wry49w::backdrop{background:radial-gradient(
        101.93% 101.93% at 47.36% -1.93%,
        rgba(165, 163, 163, 0.9) 0%,
        rgba(46, 39, 39, 0.9) 100%
      );}@media (max-width: 1199.5px){.css-wry49w{height:100%;padding:0 1.5rem;opacity:0;-webkit-transition:opacity 0.3s ease-in-out;transition:opacity 0.3s ease-in-out;}.css-wry49w[open]{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;opacity:1;}}@media (max-width: 749.5px){.css-wry49w{inset:0;width:100%;}}@media (min-width: 750px) and (max-width: 1199.5px){.css-wry49w{max-width:25rem;}}@media (min-width: 1200px){.css-wry49w{position:static;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0;}.css-wry49w::backdrop{display:none;}}</style><style data-emotion="css 183rlqz">.css-183rlqz{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;gap:0.25rem;margin:0;max-height:none;max-width:none;width:100%;border:none;}.css-183rlqz::backdrop{background:radial-gradient(
        101.93% 101.93% at 47.36% -1.93%,
        rgba(165, 163, 163, 0.9) 0%,
        rgba(46, 39, 39, 0.9) 100%
      );}@media (max-width: 1199.5px){.css-183rlqz{height:100%;padding:0 1.5rem;opacity:0;-webkit-transition:opacity 0.3s ease-in-out;transition:opacity 0.3s ease-in-out;}.css-183rlqz[open]{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;opacity:1;}}@media (max-width: 749.5px){.css-183rlqz{inset:0;width:100%;}}@media (min-width: 750px) and (max-width: 1199.5px){.css-183rlqz{max-width:25rem;}}@media (min-width: 1200px){.css-183rlqz{position:static;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0;}.css-183rlqz::backdrop{display:none;}}</style><dialog id="filters-dialog" class="css-183rlqz"><style data-emotion="css 18bbo46">.css-18bbo46{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end;padding:1.5rem 0 1rem;}@media (min-width: 1200px){.css-18bbo46{display:none;}}</style><header class="css-18bbo46"><style data-emotion="css 11dt3vo">@media (min-width: 750px) and (max-width: 1199.5px){.css-11dt3vo{color:#fff;position:fixed;right:1.5rem;top:2.5rem;}.css-11dt3vo svg{height:1.5rem;width:auto;}}</style><style data-emotion="css kuup85">.css-kuup85{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:0.25rem;color:#0071eb;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;background:transparent;border:none;cursor:pointer;}@media (min-width: 1200px){.css-kuup85{display:none;}}@media (min-width: 750px) and (max-width: 1199.5px){.css-kuup85{color:#fff;position:fixed;right:1.5rem;top:2.5rem;}.css-kuup85 svg{height:1.5rem;width:auto;}}</style><button aria-label="Close filters menu" title="Close filters menu" aria-controls="filters-dialog" class="css-kuup85"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg" style="pointer-events:none"><path d="M0.706972 0.706984C1.0975 0.31646 1.73066 0.31646 2.12119 0.706985L13.4349 12.0207C13.8254 12.4112 13.8254 13.0444 13.4349 13.4349C13.0444 13.8254 12.4112 13.8254 12.0207 13.4349L0.706973 2.1212C0.316448 1.73067 0.316448 1.09751 0.706972 0.706984Z" fill="currentColor"></path><path d="M13.4349 0.706956C13.8254 1.09748 13.8254 1.73064 13.4349 2.12117L2.12117 13.4349C1.73065 13.8254 1.09748 13.8254 0.706956 13.4349C0.316431 13.0444 0.316431 12.4112 0.706956 12.0207L12.0207 0.706956C12.4112 0.316432 13.0444 0.316431 13.4349 0.706956Z" fill="currentColor"></path></svg></button></header><style data-emotion="css i1xym6">.css-i1xym6{color:#0071eb;font-family:Gilroy;font-weight:500;font-size:0.8888rem;line-height:1.1252;letter-spacing:0;font-weight:700;-webkit-align-self:end;-ms-flex-item-align:end;align-self:end;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;background:transparent;border:none;cursor:pointer;margin-bottom:0.5rem;-webkit-text-decoration:underline;text-decoration:underline;}.css-i1xym6:disabled{opacity:0.5;cursor:not-allowed;}</style><button class="css-i1xym6">Reset Filters</button><div data-testid="formats" class="css-0"><style data-emotion="css 942wt7">.css-942wt7{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0.625rem 1rem;width:100%;color:#54595e;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;background:#f3f2f5;border:none;cursor:pointer;-webkit-transition:color 250ms,background 250ms,box-shadow 250ms;transition:color 250ms,background 250ms,box-shadow 250ms;}.css-942wt7:focus-visible{background-color:#cacbd680;}.css-942wt7:disabled{background-color:#f3f2f5;cursor:not-allowed;}.css-942wt7:disabled span,.css-942wt7:disabled div{color:#cacbd6;}@media (hover: hover){.css-942wt7:hover{background-color:#cacbd680;}.css-942wt7:hover:disabled{background-color:#f3f2f5;}}</style><button aria-expanded="false" data-testid="formats-toggle" class="css-942wt7"><style data-emotion="css 6nwm6w">.css-6nwm6w{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;-webkit-flex:1;-ms-flex:1;flex:1;color:inherit;text-align:left;}</style><span class="css-6nwm6w">Formats</span><style data-emotion="css co1etj">.css-co1etj{--size:1rem;position:relative;height:var(--size);width:var(--size);pointer-events:none;}</style><div class="css-co1etj"><style data-emotion="css wj34j0">.css-wj34j0{left:50%;position:absolute;top:50%;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;height:var(--size);width:var(--size);-webkit-transform:translate(-50%, -50%);-moz-transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);transform:translate(-50%, -50%);}</style><div class="css-wj34j0" style="opacity:0"><svg width="12" height="12" viewBox="0 0 12 12" xmlns="http://www.w3.org/2000/svg" fill="currentColor"><path d="M6 0.75C5.35567 0.75 4.83334 1.27233 4.83334 1.91667V4.83333H1.91667C1.27233 4.83333 0.75 5.35567 0.75 6C0.75 6.64433 1.27233 7.16667 1.91667 7.16667H4.83334V10.0833C4.83334 10.7277 5.35567 11.25 6 11.25C6.64433 11.25 7.16667 10.7277 7.16667 10.0833V7.16667H10.0833C10.7277 7.16667 11.25 6.64433 11.25 6C11.25 5.35567 10.7277 4.83333 10.0833 4.83333H7.16667V1.91667C7.16667 1.27233 6.64433 0.75 6 0.75Z"></path></svg></div></div></button><style data-emotion="css rcxlup">.css-rcxlup{display:grid;grid-template-rows:0fr;padding-top:0;overflow:hidden;-webkit-transition:grid-template-rows 250ms;transition:grid-template-rows 250ms;}</style><div class="css-rcxlup"></div></div><div data-testid="topics-on-topics-page" class="css-0"><button aria-expanded="false" data-testid="topics-on-topics-page-toggle" class="css-942wt7"><span class="css-6nwm6w">Skills</span><div class="css-co1etj"><div class="css-wj34j0" style="opacity:0"><svg width="12" height="12" viewBox="0 0 12 12" xmlns="http://www.w3.org/2000/svg" fill="currentColor"><path d="M6 0.75C5.35567 0.75 4.83334 1.27233 4.83334 1.91667V4.83333H1.91667C1.27233 4.83333 0.75 5.35567 0.75 6C0.75 6.64433 1.27233 7.16667 1.91667 7.16667H4.83334V10.0833C4.83334 10.7277 5.35567 11.25 6 11.25C6.64433 11.25 7.16667 10.7277 7.16667 10.0833V7.16667H10.0833C10.7277 7.16667 11.25 6.64433 11.25 6C11.25 5.35567 10.7277 4.83333 10.0833 4.83333H7.16667V1.91667C7.16667 1.27233 6.64433 0.75 6 0.75Z"></path></svg></div></div></button><div class="css-rcxlup"></div></div><div data-testid="publication-date-filter" class="css-0"><button aria-expanded="false" data-testid="publication-date-filter-toggle" class="css-942wt7"><span class="css-6nwm6w">Publication date</span><div class="css-co1etj"><div class="css-wj34j0" style="opacity:0"><svg width="12" height="12" viewBox="0 0 12 12" xmlns="http://www.w3.org/2000/svg" fill="currentColor"><path d="M6 0.75C5.35567 0.75 4.83334 1.27233 4.83334 1.91667V4.83333H1.91667C1.27233 4.83333 0.75 5.35567 0.75 6C0.75 6.64433 1.27233 7.16667 1.91667 7.16667H4.83334V10.0833C4.83334 10.7277 5.35567 11.25 6 11.25C6.64433 11.25 7.16667 10.7277 7.16667 10.0833V7.16667H10.0833C10.7277 7.16667 11.25 6.64433 11.25 6C11.25 5.35567 10.7277 4.83333 10.0833 4.83333H7.16667V1.91667C7.16667 1.27233 6.64433 0.75 6 0.75Z"></path></svg></div></div></button><div class="css-rcxlup"></div></div><div data-testid="ratings" class="css-0"><button aria-expanded="false" data-testid="ratings-toggle" class="css-942wt7"><span class="css-6nwm6w">Ratings</span><div class="css-co1etj"><div class="css-wj34j0" style="opacity:0"><svg width="12" height="12" viewBox="0 0 12 12" xmlns="http://www.w3.org/2000/svg" fill="currentColor"><path d="M6 0.75C5.35567 0.75 4.83334 1.27233 4.83334 1.91667V4.83333H1.91667C1.27233 4.83333 0.75 5.35567 0.75 6C0.75 6.64433 1.27233 7.16667 1.91667 7.16667H4.83334V10.0833C4.83334 10.7277 5.35567 11.25 6 11.25C6.64433 11.25 7.16667 10.7277 7.16667 10.0833V7.16667H10.0833C10.7277 7.16667 11.25 6.64433 11.25 6C11.25 5.35567 10.7277 4.83333 10.0833 4.83333H7.16667V1.91667C7.16667 1.27233 6.64433 0.75 6 0.75Z"></path></svg></div></div></button><div class="css-rcxlup"></div></div><div data-testid="publishers" class="css-0"><button aria-expanded="false" data-testid="publishers-toggle" class="css-942wt7"><span class="css-6nwm6w">Publishers</span><div class="css-co1etj"><div class="css-wj34j0" style="opacity:0"><svg width="12" height="12" viewBox="0 0 12 12" xmlns="http://www.w3.org/2000/svg" fill="currentColor"><path d="M6 0.75C5.35567 0.75 4.83334 1.27233 4.83334 1.91667V4.83333H1.91667C1.27233 4.83333 0.75 5.35567 0.75 6C0.75 6.64433 1.27233 7.16667 1.91667 7.16667H4.83334V10.0833C4.83334 10.7277 5.35567 11.25 6 11.25C6.64433 11.25 7.16667 10.7277 7.16667 10.0833V7.16667H10.0833C10.7277 7.16667 11.25 6.64433 11.25 6C11.25 5.35567 10.7277 4.83333 10.0833 4.83333H7.16667V1.91667C7.16667 1.27233 6.64433 0.75 6 0.75Z"></path></svg></div></div></button><div class="css-rcxlup"></div></div><div data-testid="content-level" class="css-0"><button aria-expanded="false" data-testid="content-level-toggle" class="css-942wt7"><span class="css-6nwm6w">Level</span><div class="css-co1etj"><div class="css-wj34j0" style="opacity:0"><svg width="12" height="12" viewBox="0 0 12 12" xmlns="http://www.w3.org/2000/svg" fill="currentColor"><path d="M6 0.75C5.35567 0.75 4.83334 1.27233 4.83334 1.91667V4.83333H1.91667C1.27233 4.83333 0.75 5.35567 0.75 6C0.75 6.64433 1.27233 7.16667 1.91667 7.16667H4.83334V10.0833C4.83334 10.7277 5.35567 11.25 6 11.25C6.64433 11.25 7.16667 10.7277 7.16667 10.0833V7.16667H10.0833C10.7277 7.16667 11.25 6.64433 11.25 6C11.25 5.35567 10.7277 4.83333 10.0833 4.83333H7.16667V1.91667C7.16667 1.27233 6.64433 0.75 6 0.75Z"></path></svg></div></div></button><div class="css-rcxlup"></div></div><div data-testid="language-filter" class="css-0"><button aria-expanded="false" data-testid="language-filter-toggle" class="css-942wt7"><span class="css-6nwm6w">Language</span><div class="css-co1etj"><div class="css-wj34j0" style="opacity:0"><svg width="12" height="12" viewBox="0 0 12 12" xmlns="http://www.w3.org/2000/svg" fill="currentColor"><path d="M6 0.75C5.35567 0.75 4.83334 1.27233 4.83334 1.91667V4.83333H1.91667C1.27233 4.83333 0.75 5.35567 0.75 6C0.75 6.64433 1.27233 7.16667 1.91667 7.16667H4.83334V10.0833C4.83334 10.7277 5.35567 11.25 6 11.25C6.64433 11.25 7.16667 10.7277 7.16667 10.0833V7.16667H10.0833C10.7277 7.16667 11.25 6.64433 11.25 6C11.25 5.35567 10.7277 4.83333 10.0833 4.83333H7.16667V1.91667C7.16667 1.27233 6.64433 0.75 6 0.75Z"></path></svg></div></div></button><div class="css-rcxlup"></div></div><div data-testid="duration-filter" class="css-0"><button aria-expanded="false" data-testid="duration-filter-toggle" class="css-942wt7"><span class="css-6nwm6w">Duration</span><div class="css-co1etj"><div class="css-wj34j0" style="opacity:0"><svg width="12" height="12" viewBox="0 0 12 12" xmlns="http://www.w3.org/2000/svg" fill="currentColor"><path d="M6 0.75C5.35567 0.75 4.83334 1.27233 4.83334 1.91667V4.83333H1.91667C1.27233 4.83333 0.75 5.35567 0.75 6C0.75 6.64433 1.27233 7.16667 1.91667 7.16667H4.83334V10.0833C4.83334 10.7277 5.35567 11.25 6 11.25C6.64433 11.25 7.16667 10.7277 7.16667 10.0833V7.16667H10.0833C10.7277 7.16667 11.25 6.64433 11.25 6C11.25 5.35567 10.7277 4.83333 10.0833 4.83333H7.16667V1.91667C7.16667 1.27233 6.64433 0.75 6 0.75Z"></path></svg></div></div></button><div class="css-rcxlup"></div></div></dialog></div></div></aside><style data-emotion="css sv0m87">.css-sv0m87{grid-area:content;max-width:92rem;}@media (min-width: 1200px){.css-sv0m87{position:-webkit-sticky;position:sticky;top:0;height:100%;padding:1rem 2rem 1rem 0;overflow-y:hidden;}}</style><section data-identifier="content-area" class="css-sv0m87"><style data-emotion="css tw0vwn">.css-tw0vwn{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-width:100vw;padding:0;width:100%;scrollbar-color:#f3f2f5 transparent;overflow-y:scroll;scrollbar-width:thin;overflow:hidden;}@media (min-width: 1200px){.css-tw0vwn{height:100%;padding:0;}}</style><div data-identifier="content-container" class="css-tw0vwn"><style data-emotion="css cfumbj">.css-cfumbj{--columns:1fr;}@media (min-width: 1200px){.css-cfumbj{overflow-y:auto;}}@media (min-width: 1500px){.css-cfumbj{display:grid;gap:0 2.5rem;grid-template-areas:'toggle toggle' 'definition rightSidebar' 'mostPopular rightSidebar' 'header rightSidebar' 'results rightSidebar' 'footer rightSidebar';grid-template-columns:var(--columns);}}</style><div data-identifier="content-grid" id="search-main-content" class="css-cfumbj"><style data-emotion="css n7j862">.css-n7j862{grid-area:header;width:100%;color:#fff;background-color:#0071eb;}@media (min-width: 1200px){.css-n7j862{padding:0 1.5rem;border-radius:1.25rem 1.25rem 0 0;}}</style><header data-identifier="area-header" class="css-n7j862"><style data-emotion="css 112jqer">.css-112jqer{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}</style><div class="css-112jqer"><style data-emotion="css h1r94w">.css-h1r94w{-webkit-flex:1;-ms-flex:1;flex:1;}@media (max-width: 1199.5px){.css-h1r94w{display:none;}}</style><style data-emotion="css 1o7k7ge">.css-1o7k7ge{margin:0;font-family:Gilroy;font-weight:500;font-size:1.00rem;line-height:1.25;letter-spacing:0.005em;color:inherit;-webkit-flex:1;-ms-flex:1;flex:1;}@media (max-width: 1199.5px){.css-1o7k7ge{display:none;}}</style><div class="MuiTypography-root MuiTypography-uiBody css-1o7k7ge">Loading...</div><div class="_Dropdown_13ytn_1" data-testid="sort-toggle"><button aria-controls="sort" aria-expanded="false" class="_DropdownToggle_13ytn_5"><span class="_DropdownToggleTitle_13ytn_40">Sort by: Relevance</span><svg width="13" height="8" viewBox="0 0 13 8" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M11.3002 1.6001L6.5002 6.4001L1.7002 1.6001" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path></svg></button></div><div class="_Dropdown_13ytn_1" data-testid="per-page-toggle"><button aria-controls="per-page" aria-expanded="false" class="_DropdownToggle_13ytn_5"><span class="_DropdownToggleTitle_13ytn_40">Results per page (100)</span><svg width="13" height="8" viewBox="0 0 13 8" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M11.3002 1.6001L6.5002 6.4001L1.7002 1.6001" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path></svg></button></div></div></header><style data-emotion="css 15opj3g">.css-15opj3g{grid-area:results;padding:2rem 1rem;border:1px solid #f3f2f5;}</style><div class="css-15opj3g"><style data-emotion="css g66qkj">.css-g66qkj{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}</style><article data-testid="SkeletonSearchResult" class="css-g66qkj"><style data-emotion="css rndbm8">.css-rndbm8{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;}</style><header class="css-rndbm8"><style data-emotion="css g9vogw animation-c7515d">.css-g9vogw{display:block;background-color:rgba(48, 47, 42, 0.11);height:1.2em;border-radius:4px;-webkit-animation:animation-c7515d 2s ease-in-out 0.5s infinite;animation:animation-c7515d 2s ease-in-out 0.5s infinite;}@-webkit-keyframes animation-c7515d{0%{opacity:1;}50%{opacity:0.4;}100%{opacity:1;}}@keyframes animation-c7515d{0%{opacity:1;}50%{opacity:0.4;}100%{opacity:1;}}</style><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:4rem;height:1.25rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:8.5rem;height:1.25rem"></span></header><style data-emotion="css 18hcajm">.css-18hcajm{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;margin-bottom:2.25rem;margin-top:1rem;}</style><section class="css-18hcajm"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:8.125rem;height:8.125rem"></span><style data-emotion="css 1rrwnfc">.css-1rrwnfc{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin-left:0.875rem;}</style><div class="css-1rrwnfc"><style data-emotion="css 1ta3p14 animation-c7515d">.css-1ta3p14{display:block;background-color:rgba(48, 47, 42, 0.11);height:1.2em;border-radius:4px;-webkit-animation:animation-c7515d 2s ease-in-out 0.5s infinite;animation:animation-c7515d 2s ease-in-out 0.5s infinite;-webkit-align-self:start;-ms-flex-item-align:start;align-self:start;margin-bottom:1.25rem;}@-webkit-keyframes animation-c7515d{0%{opacity:1;}50%{opacity:0.4;}100%{opacity:1;}}@keyframes animation-c7515d{0%{opacity:1;}50%{opacity:0.4;}100%{opacity:1;}}</style><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1ta3p14" style="width:50rem;height:1.125rem"></span><style data-emotion="css 1ozwb3b animation-c7515d">.css-1ozwb3b{display:block;background-color:rgba(48, 47, 42, 0.11);height:1.2em;border-radius:4px;-webkit-animation:animation-c7515d 2s ease-in-out 0.5s infinite;animation:animation-c7515d 2s ease-in-out 0.5s infinite;margin-bottom:0.5rem;}@-webkit-keyframes animation-c7515d{0%{opacity:1;}50%{opacity:0.4;}100%{opacity:1;}}@keyframes animation-c7515d{0%{opacity:1;}50%{opacity:0.4;}100%{opacity:1;}}</style><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1ozwb3b" style="width:15.875rem;height:0.75rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:18.5rem;height:0.75rem"></span><style data-emotion="css 1kpid9c animation-c7515d">.css-1kpid9c{display:block;background-color:rgba(48, 47, 42, 0.11);height:1.2em;border-radius:4px;-webkit-animation:animation-c7515d 2s ease-in-out 0.5s infinite;animation:animation-c7515d 2s ease-in-out 0.5s infinite;margin-top:auto;}@-webkit-keyframes animation-c7515d{0%{opacity:1;}50%{opacity:0.4;}100%{opacity:1;}}@keyframes animation-c7515d{0%{opacity:1;}50%{opacity:0.4;}100%{opacity:1;}}</style><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1kpid9c" style="width:11.875rem;height:0.75rem"></span></div></section><style data-emotion="css orgal9">.css-orgal9{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-align-items:start;-webkit-box-align:start;-ms-flex-align:start;align-items:start;border-top:2px solid;border-color:#f3f2f5;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;padding-top:0.25rem;}</style><footer class="css-orgal9"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:4.5rem;height:0.75rem"></span></footer></article><article data-testid="SkeletonSearchResult" class="css-g66qkj"><header class="css-rndbm8"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:4rem;height:1.25rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:8.5rem;height:1.25rem"></span></header><section class="css-18hcajm"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:8.125rem;height:8.125rem"></span><div class="css-1rrwnfc"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1ta3p14" style="width:50rem;height:1.125rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1ozwb3b" style="width:15.875rem;height:0.75rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:18.5rem;height:0.75rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1kpid9c" style="width:11.875rem;height:0.75rem"></span></div></section><footer class="css-orgal9"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:4.5rem;height:0.75rem"></span></footer></article><article data-testid="SkeletonSearchResult" class="css-g66qkj"><header class="css-rndbm8"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:4rem;height:1.25rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:8.5rem;height:1.25rem"></span></header><section class="css-18hcajm"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:8.125rem;height:8.125rem"></span><div class="css-1rrwnfc"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1ta3p14" style="width:50rem;height:1.125rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1ozwb3b" style="width:15.875rem;height:0.75rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:18.5rem;height:0.75rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1kpid9c" style="width:11.875rem;height:0.75rem"></span></div></section><footer class="css-orgal9"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:4.5rem;height:0.75rem"></span></footer></article><article data-testid="SkeletonSearchResult" class="css-g66qkj"><header class="css-rndbm8"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:4rem;height:1.25rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:8.5rem;height:1.25rem"></span></header><section class="css-18hcajm"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:8.125rem;height:8.125rem"></span><div class="css-1rrwnfc"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1ta3p14" style="width:50rem;height:1.125rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1ozwb3b" style="width:15.875rem;height:0.75rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:18.5rem;height:0.75rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1kpid9c" style="width:11.875rem;height:0.75rem"></span></div></section><footer class="css-orgal9"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:4.5rem;height:0.75rem"></span></footer></article><article data-testid="SkeletonSearchResult" class="css-g66qkj"><header class="css-rndbm8"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:4rem;height:1.25rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:8.5rem;height:1.25rem"></span></header><section class="css-18hcajm"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:8.125rem;height:8.125rem"></span><div class="css-1rrwnfc"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1ta3p14" style="width:50rem;height:1.125rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1ozwb3b" style="width:15.875rem;height:0.75rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:18.5rem;height:0.75rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1kpid9c" style="width:11.875rem;height:0.75rem"></span></div></section><footer class="css-orgal9"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:4.5rem;height:0.75rem"></span></footer></article><article data-testid="SkeletonSearchResult" class="css-g66qkj"><header class="css-rndbm8"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:4rem;height:1.25rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:8.5rem;height:1.25rem"></span></header><section class="css-18hcajm"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:8.125rem;height:8.125rem"></span><div class="css-1rrwnfc"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1ta3p14" style="width:50rem;height:1.125rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1ozwb3b" style="width:15.875rem;height:0.75rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:18.5rem;height:0.75rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1kpid9c" style="width:11.875rem;height:0.75rem"></span></div></section><footer class="css-orgal9"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:4.5rem;height:0.75rem"></span></footer></article><article data-testid="SkeletonSearchResult" class="css-g66qkj"><header class="css-rndbm8"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:4rem;height:1.25rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:8.5rem;height:1.25rem"></span></header><section class="css-18hcajm"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:8.125rem;height:8.125rem"></span><div class="css-1rrwnfc"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1ta3p14" style="width:50rem;height:1.125rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1ozwb3b" style="width:15.875rem;height:0.75rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:18.5rem;height:0.75rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1kpid9c" style="width:11.875rem;height:0.75rem"></span></div></section><footer class="css-orgal9"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:4.5rem;height:0.75rem"></span></footer></article><article data-testid="SkeletonSearchResult" class="css-g66qkj"><header class="css-rndbm8"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:4rem;height:1.25rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:8.5rem;height:1.25rem"></span></header><section class="css-18hcajm"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:8.125rem;height:8.125rem"></span><div class="css-1rrwnfc"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1ta3p14" style="width:50rem;height:1.125rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1ozwb3b" style="width:15.875rem;height:0.75rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:18.5rem;height:0.75rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1kpid9c" style="width:11.875rem;height:0.75rem"></span></div></section><footer class="css-orgal9"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:4.5rem;height:0.75rem"></span></footer></article><article data-testid="SkeletonSearchResult" class="css-g66qkj"><header class="css-rndbm8"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:4rem;height:1.25rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:8.5rem;height:1.25rem"></span></header><section class="css-18hcajm"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:8.125rem;height:8.125rem"></span><div class="css-1rrwnfc"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1ta3p14" style="width:50rem;height:1.125rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1ozwb3b" style="width:15.875rem;height:0.75rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:18.5rem;height:0.75rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1kpid9c" style="width:11.875rem;height:0.75rem"></span></div></section><footer class="css-orgal9"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:4.5rem;height:0.75rem"></span></footer></article><article data-testid="SkeletonSearchResult" class="css-g66qkj"><header class="css-rndbm8"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:4rem;height:1.25rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:8.5rem;height:1.25rem"></span></header><section class="css-18hcajm"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:8.125rem;height:8.125rem"></span><div class="css-1rrwnfc"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1ta3p14" style="width:50rem;height:1.125rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1ozwb3b" style="width:15.875rem;height:0.75rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:18.5rem;height:0.75rem"></span><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-1kpid9c" style="width:11.875rem;height:0.75rem"></span></div></section><footer class="css-orgal9"><span class="MuiSkeleton-root MuiSkeleton-rounded MuiSkeleton-pulse css-g9vogw" style="width:4.5rem;height:0.75rem"></span></footer></article></div><style data-emotion="css 1pd01q6">.css-1pd01q6{grid-area:footer;padding:2rem 0;}</style><footer data-identifier="area-footer" class="css-1pd01q6"><style data-emotion="css 1nqes0h">.css-1nqes0h{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex-wrap:wrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;gap:clamp(1rem, 2vw, 2rem);color:#0071eb;}</style><div data-identifier="pagination-footer" class="css-1nqes0h"><div class="_currentResults_pi96y_1">0 - 0 of 0</div><style data-emotion="css 3r5gha">.css-3r5gha{--pagination-gap:0.3rem;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-3r5gha ul{width:100%;gap:var(--pagination-gap);}.css-3r5gha li{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}.css-3r5gha ul{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}@media (min-width:960px){.css-3r5gha{--pagination-gap:0.5rem;}}</style><style data-emotion="css jnyh63">.css-jnyh63{--pagination-gap:0.3rem;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-jnyh63 ul{width:100%;gap:var(--pagination-gap);}.css-jnyh63 li{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}.css-jnyh63 ul{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}@media (min-width:960px){.css-jnyh63{--pagination-gap:0.5rem;}}</style><nav aria-label="pagination navigation" class="MuiPagination-root MuiPagination-text css-jnyh63"><style data-emotion="css 51eq8m">.css-51eq8m{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex-wrap:wrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0;margin:0;list-style:none;}</style><ul class="MuiPagination-ul css-51eq8m"><li><style data-emotion="css iorzz9">.css-iorzz9{padding:0;color:#0071eb;}.css-iorzz9[disabled]{color:#0071eb;opacity:0.5;}</style><style data-emotion="css hcez4b">.css-hcez4b{text-align:center;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:1.7142857142857142rem;padding:8px;border-radius:50%;color:rgba(0, 0, 0, 0.54);-webkit-transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;--IconButton-hoverBg:rgba(0, 0, 0, 0.04);padding:0;color:#0071eb;}.css-hcez4b:hover{background-color:var(--IconButton-hoverBg);}@media (hover: none){.css-hcez4b:hover{background-color:transparent;}}.css-hcez4b.Mui-disabled{background-color:transparent;color:rgba(0, 0, 0, 0.26);}.css-hcez4b.MuiIconButton-loading{color:transparent;}.css-hcez4b[disabled]{color:#0071eb;opacity:0.5;}</style><style data-emotion="css lkxck4">.css-lkxck4{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:0;padding:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-moz-appearance:none;-webkit-appearance:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;text-align:center;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:1.7142857142857142rem;padding:8px;border-radius:50%;color:rgba(0, 0, 0, 0.54);-webkit-transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;--IconButton-hoverBg:rgba(0, 0, 0, 0.04);padding:0;color:#0071eb;}.css-lkxck4::-moz-focus-inner{border-style:none;}.css-lkxck4.Mui-disabled{pointer-events:none;cursor:default;}@media print{.css-lkxck4{-webkit-print-color-adjust:exact;color-adjust:exact;}}.css-lkxck4:hover{background-color:var(--IconButton-hoverBg);}@media (hover: none){.css-lkxck4:hover{background-color:transparent;}}.css-lkxck4.Mui-disabled{background-color:transparent;color:rgba(0, 0, 0, 0.26);}.css-lkxck4.MuiIconButton-loading{color:transparent;}.css-lkxck4[disabled]{color:#0071eb;opacity:0.5;}</style><button class="MuiButtonBase-root Mui-disabled MuiIconButton-root Mui-disabled MuiIconButton-colorStandard MuiIconButton-sizeMedium css-lkxck4" tabindex="-1" type="button" disabled="" data-testid="PreviousPage" style="margin-right:0.5rem" aria-label="Go to previous page" shape="circular" variant="text"><style data-emotion="css ujgrjc">.css-ujgrjc{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:1em;height:1em;display:inline-block;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-transition:fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;fill:currentColor;font-size:1.7142857142857142rem;font-size:16px;}</style><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-ujgrjc" focusable="false" aria-hidden="true" viewBox="0 0 12 16" fill="none"><path d="M0 8L12 0V16L0 8Z" fill="currentColor"></path></svg></button></li><li><style data-emotion="css 1impcnd">.css-1impcnd{--size:1.5rem;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:var(--size);-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;margin:0;padding:0;width:var(--size);color:#0071eb;border:1px solid #fff;border-radius:50%;-webkit-transition:background-color 200ms cubic-bezier(0.4, 0, 0.2, 1),border-color 200ms cubic-bezier(0.4, 0, 0.2, 1),color 200ms cubic-bezier(0.4, 0, 0.2, 1);transition:background-color 200ms cubic-bezier(0.4, 0, 0.2, 1),border-color 200ms cubic-bezier(0.4, 0, 0.2, 1),color 200ms cubic-bezier(0.4, 0, 0.2, 1);}.css-1impcnd[disabled]{opacity:0.5;pointer-events:none;}.css-1impcnd[aria-current],.css-1impcnd:is(:focus, :hover){color:#fff;background-color:#0071eb;border-color:#0071eb;-webkit-transition:background-color 125ms cubic-bezier(0.08, 0.28, 0.12, 1),border-color 125ms cubic-bezier(0.08, 0.28, 0.12, 1),color 125ms cubic-bezier(0.08, 0.28, 0.12, 1);transition:background-color 125ms cubic-bezier(0.08, 0.28, 0.12, 1),border-color 125ms cubic-bezier(0.08, 0.28, 0.12, 1),color 125ms cubic-bezier(0.08, 0.28, 0.12, 1);}</style><style data-emotion="css xv3bdi">.css-xv3bdi{-webkit-text-decoration:none;text-decoration:none;cursor:pointer;-webkit-transition:color 200ms cubic-bezier(0.4, 0, 0.2, 1),background-color 200ms cubic-bezier(0.4, 0, 0.2, 1),border 200ms cubic-bezier(0.4, 0, 0.2, 1);transition:color 200ms cubic-bezier(0.4, 0, 0.2, 1),background-color 200ms cubic-bezier(0.4, 0, 0.2, 1),border 200ms cubic-bezier(0.4, 0, 0.2, 1);--size:1.5rem;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:var(--size);-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;margin:0;padding:0;width:var(--size);color:#0071eb;border:1px solid #fff;border-radius:50%;-webkit-transition:background-color 200ms cubic-bezier(0.4, 0, 0.2, 1),border-color 200ms cubic-bezier(0.4, 0, 0.2, 1),color 200ms cubic-bezier(0.4, 0, 0.2, 1);transition:background-color 200ms cubic-bezier(0.4, 0, 0.2, 1),border-color 200ms cubic-bezier(0.4, 0, 0.2, 1),color 200ms cubic-bezier(0.4, 0, 0.2, 1);}.css-xv3bdi:is(:focus, :hover){-webkit-transition:color 125ms cubic-bezier(0.08, 0.28, 0.12, 1),background-color 125ms cubic-bezier(0.08, 0.28, 0.12, 1),border 125ms cubic-bezier(0.08, 0.28, 0.12, 1);transition:color 125ms cubic-bezier(0.08, 0.28, 0.12, 1),background-color 125ms cubic-bezier(0.08, 0.28, 0.12, 1),border 125ms cubic-bezier(0.08, 0.28, 0.12, 1);}.css-xv3bdi[disabled]{opacity:0.5;pointer-events:none;}.css-xv3bdi[aria-current],.css-xv3bdi:is(:focus, :hover){color:#fff;background-color:#0071eb;border-color:#0071eb;-webkit-transition:background-color 125ms cubic-bezier(0.08, 0.28, 0.12, 1),border-color 125ms cubic-bezier(0.08, 0.28, 0.12, 1),color 125ms cubic-bezier(0.08, 0.28, 0.12, 1);transition:background-color 125ms cubic-bezier(0.08, 0.28, 0.12, 1),border-color 125ms cubic-bezier(0.08, 0.28, 0.12, 1),color 125ms cubic-bezier(0.08, 0.28, 0.12, 1);}</style><a href="page=1" data-testid="page-1" disabled="" aria-current="page" color="standard" aria-label="page 1" shape="circular" class="css-xv3bdi"><style data-emotion="css 2hhz9b">.css-2hhz9b{color:inherit;}</style><style data-emotion="css lr6egr">.css-lr6egr{margin:0;font-family:Gilroy;font-weight:700;font-size:0.8888rem;line-height:1.1252;letter-spacing:0.005em;color:#302f2a;color:inherit;}</style><span class="MuiTypography-root MuiTypography-linkSmall css-lr6egr">1</span></a></li><li><button class="MuiButtonBase-root Mui-disabled MuiIconButton-root Mui-disabled MuiIconButton-colorStandard MuiIconButton-sizeMedium css-lkxck4" tabindex="-1" type="button" disabled="" data-testid="NextPage" style="margin-left:0.5rem" aria-label="Go to next page" shape="circular" variant="text"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-ujgrjc" focusable="false" aria-hidden="true" viewBox="0 0 12 16" fill="none"><path d="M12 8L0 0V16L12 8Z" fill="currentColor"></path></svg></button></li></ul></nav></div></footer></div></div></section><style data-emotion="css 1td2lfr">.css-1td2lfr{position:absolute;left:-10000px;top:auto;height:1px;width:1px;overflow:hidden;}</style><div role="region" aria-live="polite" class="css-1td2lfr">No results found</div></div></main><footer class="orm-ff-AnonymousFooter-footer" id="footer" data-testid="Footer"><div class="orm-ff-AnonymousFooter-container" data-testid="footer:container"><header class="orm-ff-AnonymousFooter-footerHeader" data-testid="footer:header"><p>Follow us</p><ul id="orm-ff-SocialsList-socialsList"><li><a href="https://www.linkedin.com/company/oreilly-media" target="_blank" title="Follow us on LinkedIn"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="20" width="20"><path d="M20.447 20.452H16.893V14.883C16.893 13.555 16.866 11.846 15.041 11.846C13.188 11.846 12.905 13.291 12.905 14.785V20.452H9.351V9H12.765V10.561H12.811C13.288 9.661 14.448 8.711 16.181 8.711C19.782 8.711 20.448 11.081 20.448 14.166L20.447 20.452ZM5.337 7.433C4.193 7.433 3.274 6.507 3.274 5.368C3.274 4.23 4.194 3.305 5.337 3.305C6.477 3.305 7.401 4.23 7.401 5.368C7.401 6.507 6.476 7.433 5.337 7.433ZM7.119 20.452H3.555V9H7.119V20.452ZM22.225 0H1.771C0.792 0 0 0.774 0 1.729V22.271C0 23.227 0.792 24 1.771 24H22.222C23.2 24 24 23.227 24 22.271V1.729C24 0.774 23.2 0 22.222 0H22.225Z" fill="currentColor"></path></svg></a></li><li><a href="https://www.youtube.com/user/OreillyMedia" target="_blank" title="Follow us on YouTube"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="20" width="20"><path d="M23.495 6.20498C23.356 5.70674 23.0907 5.2528 22.725 4.88703C22.3592 4.52126 21.9052 4.25603 21.407 4.11698C19.537 3.61598 12.011 3.61598 12.011 3.61598C12.011 3.61598 4.50401 3.60598 2.61501 4.11698C2.11677 4.25603 1.66283 4.52126 1.29706 4.88703C0.931287 5.2528 0.666058 5.70674 0.527007 6.20498C0.172528 8.11949 -0.0022322 10.0629 0.00500725 12.01C-0.000863617 13.9497 0.173891 15.8857 0.527007 17.793C0.666058 18.2912 0.931287 18.7452 1.29706 19.1109C1.66283 19.4767 2.11677 19.7419 2.61501 19.881C4.48301 20.383 12.011 20.383 12.011 20.383C12.011 20.383 19.517 20.383 21.407 19.881C21.9052 19.7419 22.3592 19.4767 22.725 19.1109C23.0907 18.7452 23.356 18.2912 23.495 17.793C23.8407 15.885 24.0081 13.949 23.995 12.01C24.0095 10.0636 23.8421 8.12018 23.495 6.20498ZM9.60901 15.601V8.40798L15.873 12.01L9.60901 15.601Z" fill="currentColor"></path></svg></a></li></ul></header><div class="orm-ff-AnonymousFooter-footerMain" aria-label="Company info" data-testid="footer:main"><div class="orm-ff-AnonymousFooter-column orm-ff-AnonymousFooter-column1" data-testid="footer-main:column-1"><div class="orm-ff-LinksList-linksList" data-testid="footer:approach"><header><h2><a href="/about/">About O&#x27;Reilly</a></h2></header><ul><li><a data-testid="Teach/Write/Train" href="/work-with-us.html">Teach/Write/Train</a></li><li><a data-testid="Careers" href="/careers/">Careers</a></li><li><a data-testid="O’Reilly News" href="/press/">O’Reilly News</a></li><li><a data-testid="Media Coverage" href="/press/media-coverage.html">Media Coverage</a></li><li><a data-testid="Community Partners" href="/partner/signup.csp">Community Partners</a></li><li><a data-testid="Affiliate Program" href="/affiliates/">Affiliate Program</a></li><li><a data-testid="Submit an RFP" href="/online-learning/rfp.html">Submit an RFP</a></li><li><a data-testid="Diversity" href="/diversity/">Diversity</a></li><li><a data-testid="Content Sponsorship" href="/content-marketing-solutions.html" id="footerSponsorshipLink">Content Sponsorship</a></li></ul></div><div class="orm-ff-LinksList-linksList" data-testid="footer:contact"><header><h2><a href="/online-learning/support/">Support</a></h2></header><ul><li><a data-testid="Contact Us" href="/about/contact.html">Contact Us</a></li><li><a data-testid="Newsletters" href="/emails/newsletters/">Newsletters</a></li><li><a data-testid="Privacy Policy" href="/privacy.html">Privacy Policy</a></li><li><a data-testid="AI Policy" href="/about/oreilly-approach-to-generative-ai.html">AI Policy</a></li></ul></div><div class="orm-ff-LinksList-linksList" data-testid="footer:international"><header><h2>International</h2></header><ul><li><a data-testid="Australia &amp; New Zealand" href="https://www.oreilly.com/online-learning/anz.html">Australia &amp; New Zealand</a></li><li><a data-testid="Japan" href="https://www.oreilly.co.jp/index.shtml">Japan</a></li></ul></div></div><div class="orm-ff-AnonymousFooter-column orm-ff-AnonymousFooter-column2" data-testid="footer-main:column-2"><div class="orm-ff-LinksList-linksList" id="download-info" data-testid="footer:download" data-wrap="true"><header><h2>Download the O&#x27;Reilly App</h2><p>Take O&#x27;Reilly with you and learn anywhere, anytime on your phone and tablet.</p></header><ul><li><a href="https://itunes.apple.com/us/app/safari-to-go/id881697395" title="Download in the Apple App Store" data-testid="Download in the Apple App Store"><img src="https://cdn.oreillystatic.com/oreilly/images/app-store-logo.png" alt="Download in the Apple App Store"/></a></li><li><a href="https://play.google.com/store/apps/details?id=com.safariflow.queue" title="Download in the Google Play Store" data-testid="Download in the Google Play Store"><img src="https://cdn.oreillystatic.com/oreilly/images/google-play-logo.png" alt="Download in the Google Play Store"/></a></li></ul></div><div class="orm-ff-LinksList-linksList" id="tv-info" data-testid="footer:tv" data-wrap="true"><header><h2>Watch on Your Big Screen</h2><p>View all O’Reilly videos, virtual conferences, and live events on your home TV.</p></header><ul><li><a href="https://channelstore.roku.com/details/c9d25fa651f0ad84e484b0dfd4b20172:856a240ad268961983e91ae52c1e1e5c/oreilly" title="Roku Players and TVs" data-testid="Roku Players and TVs"><img src="https://cdn.oreillystatic.com/oreilly/images/roku-tv-logo.png" alt="Roku Players and TVs"/></a></li><li><a href="https://www.amazon.com/OReilly-Media-Inc/dp/B087YYHL5C/ref=sr_1_2?dchild=1&amp;amp;keywords=oreilly&amp;amp;qid=1604964116&amp;amp;s=mobile-apps&amp;amp;sr=1-2" title="Amazon Appstore" data-testid="Amazon Appstore"><img src="https://cdn.oreillystatic.com/oreilly/images/amazon-appstore-logo.png" alt="Amazon Appstore"/></a></li></ul></div></div></div><div id="orm-ff-Subfooter-subfooter" data-testid="footer:subfooter"><header><a href="https://www.oreilly.com" title="O&#x27;Reilly Media home" aria-current="page"><img id="footer-subfooterLogo" src="https://cdn.oreillystatic.com/images/sitewide-headers/oreilly_logo_mark_red.svg" srcSet="https://cdn.oreillystatic.com/images/sitewide-headers/oreilly_logo_mark_red_@2x.png 2x" alt="O&#x27;Reilly Media home"/></a><p><a href="https://www.oreilly.com/privacy.html?donotsell=show" id="donotsell-info">Do not sell or share my personal information</a>.</p></header><div class="orm-ff-Subfooter-content" data-testid="subfooter:content"><p>&copy; 2025, O'Reilly Media, Inc. All trademarks and registered
              trademarks appearing on oreilly.com are the property of their
              respective owners.</p><ul><li><a href="/terms/">Terms of Service</a></li><li><a href="/privacy.html">Privacy Policy</a></li><li><a href="/about/editorial_independence.html">Editorial Independence</a></li></ul></div></div></div></footer></div>
  <script type="text/javascript"  src="/uG4uybgTiew2Mv4ySFAvX8eynmU/YhOEL4k8f2JzuX9D/UmU5Mw5VKwU/URQYV/x9HZGw"></script><link rel="stylesheet" type="text/css"  href="/uG4uybgTiew2Mv4ySFAvX8eynmU/mXOEap/ZGseMw5VKwU/DxUOH/ipndndY"><script  src="/uG4uybgTiew2Mv4ySFAvX8eynmU/mXOEap/ZGseMw5VKwU/Qk8Kc/gRtImkp" async defer></script><div id="sec-overlay" style="display:none;"><div id="sec-container"></div></div></body>
</html>
