CINXE.COM
Public Sector Summit On-Demand
<!DOCTYPE html> <html> <head> <script type="text/javascript"> window.dataLayer = window.dataLayer || []; function glueCookieNotificationBarLoaded() { // Google Tag Manager (internal) (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-P9X8WL8'); // End Google Tag Manager // Google Tag Manager (instance) (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-PNCS53'); // End Google Tag Manager } </script> <link rel="icon" href="https://cloudonair.withgoogle.com/api/assets?path=/gs/gweb-gc-gather-production.appspot.com/files/ADPycdsTqwt47Z4PY0d-pcFZsk6I8l51wmHlPMfXp9-6HTq0yy9bxVjlhWRW2BJJehWXiFLwNlYw9Dkdhong55dfsDNTLw.OmAUIlIxsEvGpBF4" /> <meta name="twitter:card" content="summary" /> <title>Public Sector Summit On-Demand</title> <meta property="og:title" content="Public Sector Summit On-Demand" /> <meta name="description" content="AI is transforming the security landscape, and both agencies and threat actors are racing to leverage its power. Join the Google Public Sector Summit On Demand on December 3rd to hear from leading experts on how AI is being used to combat security threats and learn how agencies are prioritizing their AI efforts for the future." /> <meta property="og:description" content="AI is transforming the security landscape, and both agencies and threat actors are racing to leverage its power. Join the Google Public Sector Summit On Demand on December 3rd to hear from leading experts on how AI is being used to combat security threats and learn how agencies are prioritizing their AI efforts for the future." /> <meta property="og:image" content="https://cloudonair.withgoogle.com/api/assets?path=/gs/gweb-gc-gather-production.appspot.com/files/AD-8ljsaR9wDPLkGx6ZeyWai5zngOnYVng-OQnCNeWVBlCpLpyL3EI1Xuxh4ZoQmHOxsuYx-Dg.EkuCLKv8yKrzO8sZ" /> <meta property="og:image:alt" content="image"/> <meta name="robots" content="noindex,nofollow" /> <meta charset="utf-8" /> <meta content="initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no, width=device-width" name="viewport" /> <!-- Preemptively initiating a connection --> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <!-- Load Google Sans Text for Cookie bar --> <link rel="preload" href="https://fonts.googleapis.com/css2?family=Google+Sans+Text:wght@400&display=swap" as="style"> <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Google+Sans+Text:wght@400&display=swap"> <link href="//fonts.googleapis.com/css?family=Roboto+Mono|Google+Sans:400,500,600,700|Roboto:100,200,300,400,500,600,700&lang=en" rel="stylesheet" /> <link href="https://fonts.googleapis.com/css2?family=Google+Material+Icons:wght@400;500;700" rel="stylesheet"> <base href="/" /> <link rel="canonical" href="https://cloudonair.withgoogle.com/events/public-sector-2024-vod" /> <!-- Cookie bar styles from CDN --> <link href="https://www.gstatic.com/glue/cookienotificationbar/cookienotificationbar.min.css" rel="stylesheet"> <style> html.show-gated-signin, .show-gated-signin body, html.show-gated-signout, .show-gated-signout body, html.show-user-upgrade-error, .show-user-upgrade-error body, html.show-private-error, .show-private-error body, html.show-general-error, .show-general-error body, html.show-offline-error, .show-offline-error body, html.show-cookie-error, .show-cookie-error body, html.show-auth-error, .show-auth-error body { margin: 0px; height: 100%; min-width: max(100%, 360px); display: flex; flex-direction: column; } @media screen and (max-width: 359px) { html.show-gated-signin, .show-gated-signin body, html.show-gated-signout, .show-gated-signout body, html.show-user-upgrade-error, .show-user-upgrade-error body, html.show-private-error, .show-private-error body, html.show-general-error, .show-general-error body, html.show-offline-error, .show-offline-error body, html.show-cookie-error, .show-cookie-error body, html.show-auth-error, .show-auth-error body { min-width: 360px; overflow-x: auto; } } .show-gated-signin #app, .show-gated-signin app-root, .show-gated-signout #app, .show-gated-signout app-root, .show-user-upgrade-error #app, .show-user-upgrade-error app-root, .show-private-error #app, .show-private-error app-root, .show-general-error #app, .show-general-error app-root, .show-offline-error #app, .show-offline-error app-root, .show-auth-error #app, .show-auth-error app-root, .show-cookie-error #app, .show-cookie-error app-root { display: none; } .boxed-takeover { flex: 1; min-width: 100%; background-color: #fafafa; color: #212121; font-family: 'Roboto', sans-serif; display: none; align-items: flex-start; } .show-gated-signin #gated-signin, .show-gated-signout #gated-signout, .show-user-upgrade-error #user-upgrade-error, .show-private-error #private-error, .show-general-error #general-error, .show-offline-error #offline-error, .show-cookie-error #cookie-error, .show-auth-error #auth-error { display: flex; } .boxed-takeover .box { box-sizing: border-box; max-width: 450px; box-shadow: 0 0 4px rgba(0, 0, 0, 0.3); text-align: center; padding: 40px; background-color: #fff; margin: auto; } .boxed-takeover .box.auth-box { width: calc(100% - 240px); max-width: 600px; min-width: 320px; padding-bottom: 24px; transition: padding 0.5s ease-in-out; } .boxed-takeover h1 { font-weight: 400; font-size: 28px; line-height: 34px; margin: 0; } .boxed-takeover p { font-weight: 300; margin: 10px 0 40px 0; font-size: 16px; line-height: 22px; } #private-error.boxed-takeover .box div { font-size: 16px; font-weight: 300; line-height: 22px; margin: 10px 0 40px 0; } .boxed-takeover input { font-size: 16px; padding: 10px 14px; line-height: 22px; font-weight: 400; margin-top: 10px; border: 1px solid #000; } .boxed-takeover button { cursor: pointer; width: 100%; background-color: #3b78e7; color: #fff; outline-offset: 1px; font-size: 16px; padding: 10px 14px; line-height: 22px; font-weight: 500; margin-top: 10px; border: 1px solid #3b78e7; transition: all 0.2s ease-in-out; } .boxed-takeover button:hover { background-color: #000; border-color: #000; } .boxed-takeover button:focus-visible { outline: 2px solid #174EA6; } .boxed-takeover button.button-link { color: #1A73E8; border-color: transparent; background-color: #fff; padding: 15px 24px; } .boxed-takeover button.button-link:hover { color: #185ABC; } .boxed-takeover button.outline { background-color: inherit; color: #1a73e8; border-color: #1a73e8; } .boxed-takeover button.outline:hover { color: #185ABC; border-color: #185ABC; } .boxed-takeover button.auth { border-radius: 4px; font-family: 'Google Sans', 'Arial', sans-serif; } .boxed-takeover button.auth.blue { border-color: #1a73e8; background-color: #1a73e8; border: 2px solid #1a73e8; padding: 15px 24px; width: auto; } .boxed-takeover button.auth.blue:disabled, .boxed-takeover button.auth.blue:disabled:hover { color: #5f6368; background-color: #dbdce0; border-color: #dbdce0; } .boxed-takeover button.auth.blue:hover, .sign-in-buttons button.auth.blue:hover { border-color: #185ABC; background-color: #185ABC; } .boxed-takeover .sign-in-buttons { display: flex; align-items: center; justify-content: flex-end; text-align: left; column-gap: 10px; row-gap: 24px; } .boxed-takeover .sign-in-buttons button { margin: 0px; width: auto; } .boxed-takeover .input-container { display: flex; flex-wrap: wrap; position: relative; } .boxed-takeover .input-container input { border: 2px solid #1a73e8; border-radius: 4px; width: 100%; max-height: 42px; } .boxed-takeover .input-container label { position: absolute; font-size: 12px; top: 4px; padding: 0 4px; left: 22px; background-color: #ffffff; color: #1a73e8; } .boxed-takeover .box .input-pair { display: flex; flex-wrap: wrap; justify-content: space-between; } .boxed-takeover .input-pair .input-container { flex: 0 1 49%; } .boxed-takeover .error-container { text-align: left; color: #D93025; font-size: 12px; font-family: 'Google Sans', sans-serif; display: none; align-items: center; font-weight: 500; margin-top: 0.5em; } .boxed-takeover .error-container { display: flex; } .boxed-takeover .error-container i, .boxed-takeover .error-container i { font-size: 15px; padding-right: 5.5px; text-align: left; } .boxed-takeover .privacy-policy { margin-top: 74px; text-align: center; } .boxed-takeover .privacy-policy .privacy-link { color: #5f6368; font-family: 'Roboto', sans-serif; font-size: 14px; line-height: 22px; text-decoration: none; } #private-error button { padding-bottom: 10px; } #private-error .box { padding-bottom: 40px; } .sign-in-buttons .auth.link { color: #1a73e8; justify-content: center; font-family: 'Google Sans', 'Arial', sans-serif; cursor: pointer; } .sign-in-buttons .auth.right-anchor { margin-left: auto; } /* Align text of "Forgot Password?" button with left side of modal */ .sign-in-buttons .auth.forgot-password button.button-link { margin-left: -24px; } @media (max-width: 768px) { .sign-in-buttons { flex-wrap: wrap; } .sign-in-buttons .auth.right-anchor { flex: 1 } /* Align text of left-anchored "Back" button with left side of modal */ .sign-in-buttons .auth.right-anchor button.button-link { margin-left: -24px; } .sign-in-buttons .auth.forgot-password { order: 1; flex: 1 0 100%; } } .error-takeover { background-color: #fdf7e3; border-radius: 4px; padding: 25px 51px 33px; margin-bottom: 25px; } .error-takeover div { display: flex; align-items: center; padding-bottom: 8px; } .error-takeover div h2 { font-size: 20px; color: #202124; font-family: 'Google Sans', 'Arial', sans-serif; margin: 0; } .error-takeover div i { font-size: 24px; color: #e79c37; padding-right: 22px; } .error-takeover .error-message { text-align: left; margin: 0; } #enterEmail h1 { margin-bottom: 87px; } #signinMethod button, #accountCreationConfirmation button { width: 100%; max-width: 360px; } #accountCreationConfirmation #confirmation-resent { margin: 20px 0 0; } #enterEmail .input-container { margin-bottom: calc(74px - 1.25em); } #enterPassword .input-container { margin-bottom: 73px; } #enterPassword .email { color: #202124; font-family: 'Google Sans', 'Arial', sans-serif; margin-bottom: 43px; } #createAccount h1 { margin-bottom: 75px; } #createAccount .input-container { margin-bottom: 35px; } #createAccount .input-pair { margin-bottom: 68px; } #createAccount .input-pair .input-container { margin-bottom: 0; } @media (max-width: 768px) { #createAccount .input-pair { margin-bottom: 0px; } #createAccount .input-pair .input-container { flex: 0 1 100%; margin-bottom: 35px; } } #hasGoogleAccount h1 { margin-bottom: 58px; } #hasGoogleAccount p { text-align: left; margin-bottom: 120px; } #resetPassword h1, #postReset h1 { margin-bottom: 44px; } #resetPassword p { text-align: left; margin-bottom: 102px; } #postReset p { text-align: left; margin-bottom: 120px; } .email-text { font-weight: 700; } /* loading animation */ .loading-ball-anim { display: flex; flex: 1; justify-content: center; align-items: center; height: 100vh; opacity: 0; transition: opacity 1s; } .loading-ball-anim.start { opacity: 1; } .loading-ball-anim .ball { width: 22px; height: 22px; border-radius: 11px; margin: 0 10px; animation: 2s bounce ease infinite; } @keyframes bounce { 50% { transform: translateY(25px); } } .hidden { display: none !important; } body.unsupported { overflow: hidden; } #bad-browser { position: fixed; } #bad-browser-shade, #bad-browser { bottom: 0; left: 0; position: fixed; right: 0; top: 0; } #bad-browser-shade, #bad-browser-text, #bad-browser { z-index: 999999; } #bad-browser-shade { background: #000; opacity: 0.4; } #bad-browser .google-material-icons { color: #f9bb2d; font-size: 36px; } #bad-browser h2 { font-size: 42px; font-weight: 700; margin-bottom: 32px; padding: 16px 32px 0; font-family: 'Google Sans', 'Arial', sans-serif; } #bad-browser-text { background: #fff; border-radius: 8px; left: 50%; margin-left: -250px; margin-top: -250px; padding: 40px 40px 56px; position: relative; text-align: center; top: 50%; width: 500px; } @media only screen and (max-width: 600px) { .boxed-takeover .box { box-shadow: none; background-color: inherit; padding: 20px; } .boxed-takeover .box.auth-box { width: 100%; max-width: unset; min-width: unset; } } </style> <script src="//www.gstatic.com/firebasejs/7.24.0/firebase-app.js"></script> <script src="//www.gstatic.com/firebasejs/7.24.0/firebase-auth.js"></script> <script src="//www.gstatic.com/firebasejs/7.24.0/firebase-database.js"></script> <script> window.CONFIG = { protocol: "https", default_instance: "gatherplatform.withgoogle.com", default_language: "en", is_local_dev: false, gated: false, devMode: false, cloudFunctionsHost: "https://us-central1-gweb-gc-gather-production.cloudfunctions.net", devProfilesEndpoint: "https://developers.googleapis.com", firebase: { apiKey: 'AIzaSyC1a0zObeFwLX6lp3psqKSqeSvyTJl-2Xg', authDomain: 'gweb-gc-gather-production.firebaseapp.com', databaseURL: 'https://gweb-gc-gather-production-replica1.firebaseio.com/', projectId: 'gweb-gc-gather-production', storageBucket: 'gweb-gc-gather-production.appspot.com', messagingSenderId: '122167620338', appId: '1:122167620338:web:54e2dc54572219490bd66b', }, google_maps_api_key: "AIzaSyCztX6xvkUgIs3798bCXyhJQaeit0gYkgo", template: "DEFAULT", instance: "cloudonair.withgoogle.com", instance_product_id: 105833389, feature_flags: {}, templates: { angularjs: { instance: [ "DEFAULT", ], event: [ "CHROME_2018", "CLOUD_SUMMIT_2018", ] }, instance: [ "DEFAULT", "DEVFEST", "CLOUD", ], event: [ "DEFAULT", "CLOUD_2017", "CLOUD_2018", "CLOUD_SUMMIT_2018", "CLOUD_TRANSFORM_2018", "CLOUD_DATA_AI_2018", "DEVFEST_2018", "CHROME_2018", "CLOUD_Q1_2019", "GLOBAL_EVENTS_GML_2019", "SINGLE_SESSION", ] } } window.CONFIG.feature_flags['dev_profiles'] = true; window.CONFIG.feature_flags['dma_compliance'] = true; // Initialize Firebase window.firebase.initializeApp(window.CONFIG.firebase); </script> </head> <body> <!-- Google Tag Manager (noscript) (internal) --> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-P9X8WL8" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <!-- End Google Tag Manager (noscript) --> <!-- Google Tag Manager (noscript) (instance) --> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-PNCS53" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <!-- End Google Tag Manager (noscript) --> <noscript> <p style="margin:100px 6px;text-align:center;"> This app requires JavaScript <nobr>to function.</nobr><br /> Please enable javascript and reload <nobr>the page.</nobr> </p> </noscript> <!-- framebuster code starts here --> <style> plaintext { display: none; } </style> <script> (function() { try { var win = this; while ('<plaintext>') { if (win.parent == win) { break; } eval('win.frameElement.src').substr(0, 1); win = win.parent; } if (win.frameElement != null) { throw 'busted'; } document.write('\x3Cxmp style\x3Ddisplay:none\x3E'); } catch (e) { try { if (!open(location, '_top')) { alert('this content cant be framed'); } top.location = location; } catch (e) {} } })(); </script> <!-- do not remove the plaintext nor xmp tags --> <plaintext /> <xmp>.</xmp> <!-- framebuster code ends here --> <!-- for ng4 --> <app-root> <div class="loading-ball-anim"> <div class="ball" style="background-color:#4285F5"></div> <div class="ball" style="background-color:#EA4436;animation-delay:.25s" ></div> <div class="ball" style="background-color:#FBBD06;animation-delay:.5s" ></div> <div class="ball" style="background-color:#34A952;animation-delay:.75s" ></div> </div> </app-root> <script> setTimeout(function() { document.querySelector('.loading-ball-anim').classList.add('start'); }, 100); </script> <!-- for angularJS --> <div id="app" class="loading"> <div class="main-ctrl" ng-controller="main as mainCtrl"> <ui-view class="main-view-container"></ui-view> </div> </div> <div id="gated-signin" class="boxed-takeover"> <div id="signinMethod" class="box auth-box"> <h1> Sign in or create account </h1> <p> To register for events </p> <button class="auth blue" onclick="signIn()"> Continue with Google </button> <button onclick="signInStep('enterEmail')" class="outline auth"> Continue with email </button> <div class="privacy-policy"> <a class="privacy-link" target="_blank" href="https://policies.google.com/privacy" > Privacy Policy </a > </div> </div> <div id="enterEmail" class="box hidden auth-box"> <h1> Sign in with email </h1> <div class="input-container"> <label for="emailAddress"> Enter your email </label> <input type="email" id="emailAddress" oninput="hideErrors('invalid-email')" /> <div class="error-container hidden" id="invalid-email"> <i class="google-material-icons">info</i> <span> <output>Enter a valid email address</output> </span> </div> </div> <div class="sign-in-buttons"> <div class="auth link"> <button type="button" onclick="signInStep('signinMethod')" class="button-link"> Back </button> </div> <button class="auth blue" onclick="checkEmail()"> Next </button> </div> <div class="privacy-policy"> <a class="privacy-link" target="_blank" href="https://policies.google.com/privacy" > Privacy Policy </a> </div> </div> <div id="hasGoogleAccount" class="box hidden auth-box"> <h1> Sign in with Google </h1> <p> <output>It looks like you've already used this email. Sign in with Google to continue.</output> </p> <div class="sign-in-buttons"> <div class="auth link"> <button type="button" onclick="signInStep('enterEmail')" class="button-link"> Back </button> </div> <button class="auth blue" onclick="signIn()"> Sign in with Google </button> </div> <div class="privacy-policy"> <a class="privacy-link" target="_blank" href="https://policies.google.com/privacy" > Privacy Policy </a> </div> </div> <div id="enterPassword" class="box hidden auth-box"> <form> <h1> Sign in with email </h1> <p id="loginEmail" class="email"></p> <div class="input-container" id="password-container"> <label for="loginPassword"> Enter your password </label> <input type="password" autocomplete="current-password" id="loginPassword" oninput="hideErrors('no-password', 'invalid-password')" required /> <div id="no-password" class="error-container hidden"> <i class="google-material-icons">info</i> <span> <output>Enter a password</output> </span> </div> <div id="invalid-password" class="error-container hidden"> <i class="google-material-icons">info</i> <span> <output>Wrong password. Try again or click "Forgot password" to reset it.</output> </span> </div> </div> <div class="error-takeover hidden" id="login-retry-limit"> <div> <i class="google-material-icons">report_problem</i> <h2> Too many failed attempts </h2> </div> <p class="error-message"> <output>Unavailable because of too many failed attempts to sign in. Try again in a few minutes.</output> </p> </div> <div class="sign-in-buttons"> <div class="auth link forgot-password"> <button type="button" onclick="signInStep('resetPassword')" class="button-link"> Forgot Password? </button> </div> <div class="auth link right-anchor"> <button type="button" onclick="signInStep('enterEmail')" class="button-link"> Back </button> </div> <button type="button" class="auth blue" onclick="signInEmailPassword()" id="password-sign-in" > Next </button> </div> <div class="privacy-policy"> <a class="privacy-link" target="_blank" href="https://policies.google.com/privacy" > Privacy Policy </a> </div> </form> </div> <div id="createAccount" class="box auth-box hidden"> <form> <h1> Create Account </h1> <div class="input-container"> <label for="accountEmail">Email Address:</label> <input type="email" id="accountEmail" autocomplete="new-username" oninput="hideErrors('email-in-use')" disabled /> <div id="email-in-use" class="error-container hidden"> <i class="google-material-icons">info</i> <span> <output>This email is already in use. Please go back and select a different email.</output> </span> </div> </div> <div class="input-container"> <label for="accountPassword"> Enter your password </label> <input type="password" autocomplete="new-password" id="accountPassword" oninput="hideErrors('create-account-no-password', 'weak-password')" /> <div id="create-account-no-password" class="error-container hidden"> <i class="google-material-icons">info</i> <span> <output>Enter password</output> </span> </div> <div id="weak-password" class="error-container hidden"> <i class="google-material-icons">info</i> <span> <output>Use 6 or more characters with a mix of letters, numbers & symbols</output> </span> </div> </div> <div class="input-pair"> <div class="input-container"> <label for="accountFirstName"> First Name </label> <input type="text" id="accountFirstName" oninput="hideErrors('no-first-name')" /> <div id="no-first-name" class="error-container hidden"> <i class="google-material-icons">info</i> <span> <output>Enter first name</output> </span> </div> </div> <div class="input-container"> <label for="accountLastName"> Last Name </label> <input type="text" id="accountLastName" oninput="hideErrors('no-last-name')" /> <div id="no-last-name" class="error-container hidden"> <i class="google-material-icons">info</i> <span> <output>Enter last name</output> </span> </div> </div> </div> <div class="sign-in-buttons"> <div class="auth link"> <button type="button" onclick="signInStep('enterEmail')" class="button-link"> Back </button> </div> <button type="button" class="auth blue" onclick="createAccount()"> Next </button> </div> <div class="privacy-policy"> <a class="privacy-link" target="_blank" href="https://policies.google.com/privacy" > Privacy Policy </a> </div> </form> </div> <div id="accountCreationConfirmation" class="box auth-box hidden"> <p> <div id="emailConfirmation" class="email-text"></div> An email has been sent to your email address. Click the confirmation link in that email to verify your account. </p> <p> Please check your promotional tab or spam folder. You can resend the message if you did not receive it. </p> <button class="auth blue" onclick="resendAccountConfirmation()"> Resend email </button> <button class="auth blue" onclick="accountCreationComplete()"> Done </button> <p id="confirmation-resent" class="hidden"> Confirmation email resent </p> <div class="privacy-policy"> <a class="privacy-link" target="_blank" href="https://policies.google.com/privacy" > Privacy Policy </a> </div> </div> <div id="resetPassword" class="box auth-box hidden"> <h1> Reset Password </h1> <p> If you've forgotten your password, you can request to have an email sent with a link to create a new one. </p> <div class="sign-in-buttons"> <div class="auth link"> <button type="button" onclick="signInStep('enterPassword')" class="button-link"> Back </button> </div> <button class="auth blue" onclick="resetPassword()"> Reset Password </button> </div> <div class="privacy-policy"> <a class="privacy-link" target="_blank" href="https://policies.google.com/privacy" > Privacy Policy </a> </div> </div> <div id="postReset" class="box auth-box hidden"> <h1> Reset Password </h1> <p> We've sent an email to your email address. Follow the instructions in that email to reset your password. </p> <div class="sign-in-buttons"> <div class="auth link"> <button type="button" onclick="signInStep('signinMethod')" class="button-link"> Back </button> </div> </div> <div class="privacy-policy"> <a class="privacy-link" target="_blank" href="https://policies.google.com/privacy" > Privacy Policy </a> </div> </div> </div> <div id="gated-signout" class="boxed-takeover"> <div class="box"> <h1> Forbidden </h1> <p> <output>Sorry, you do not have permission to access this resource.</output> </p> <button onclick="signOut()"> Sign out </button> </div> </div> <div id="user-upgrade-error" class="boxed-takeover"> <div class="box"> <h1>User account conflict</h1> <p> <output>Sorry, the user account you are using is now linked to Google. Please sign in with Google to use this account.</output> </p> <button onclick="signOut()"> Sign out </button> </div> </div> <div id="private-error" class="boxed-takeover"> <div class="box"> <div class="formatted-html"><h1>Forbidden</h1><p>You do not have permission to access this private event</p></div> <button onclick="signOut()"> Sign out </button> </div> </div> <div id="general-error" class="boxed-takeover"> <div class="box"> <h1>We'll be right back</h1> <p> We are having temporary difficulties, and are working to fix the issue. </p> </div> </div> <div id="cookie-error" class="boxed-takeover"> <div class="box"> <h1>Cookies are disabled</h1> <p> Cookies are required in order to sign in. Please enable cookies in your browser's settings and disable any adblockers. Then refresh this page. </p> </div> </div> <div id="auth-error" class="boxed-takeover"> <div class="box"> <h1>Error authenticating user</h1> <p> There was an error during authentication. Please refresh to try again. If this issue persists, please sign out and sign back in after reloading. </p> <button onclick="signOut()"> Sign out </button> </div> </div> <div id="offline-error" class="boxed-takeover"> <div class="box"> <h1>You're currently offline</h1> <p> Refresh the page when your connection is restored to return to the app. </p> </div> </div> <script defer src="/scripts/app.preload.97eb4396.js" ></script> <!-- Developer Profiles --> <script src="/static/scripts/developer_profiles_api_v0.2.3.js"></script> <script> window.templateBundleMap = { platform: { "default": { script: "/scripts/app.platform.default.js", style: "/styles/app.platform.default.css", }, "devfest": { script: "/scripts/app.platform.devfest.js", style: "/styles/app.platform.devfest.css", }, "cloud": { script: "/scripts/app.platform.cloud.04584a22.js", style: "/styles/app.platform.cloud.a9c1e38e.css", }, }, event: { "default": { script: "/scripts/app.event.default.77eb7c9f.js", style: "/styles/app.event.default.f4b51581.css", }, "cloud_2017": { script: "/scripts/app.event.cloud_2017.14fe68ec.js", style: "/styles/app.event.cloud_2017.978f9577.css", }, "cloud_2018": { script: "/scripts/app.event.cloud_2018.920955c7.js", style: "/styles/app.event.cloud_2018.4524a015.css", }, "cloud_summit_2018": { script: "/scripts/app.event.cloud_summit_2018.b80bb2df.js", style: "/styles/app.event.cloud_summit_2018.2828e67d.css", }, "cloud_transform_2018": { script: "/scripts/app.event.cloud_transform_2018.21a8e490.js", style: "/styles/app.event.cloud_transform_2018.fc10d7ff.css", }, "cloud_data_ai_2018": { script: "/scripts/app.event.cloud_data_ai_2018.502619fb.js", style: "/styles/app.event.cloud_data_ai_2018.66e30895.css", }, "devfest_2018": { script: "/scripts/app.event.devfest_2018.5614ac9a.js", style: "/styles/app.event.devfest_2018.55fd9704.css", }, "chrome_2018": { script: "/scripts/app.event.chrome_2018.cf503ed7.js", style: "/styles/app.event.chrome_2018.acf234a7.css", }, "cloud_q1_2019": { script: "/scripts/app.event.cloud_q1_2019.67fde800.js", style: "/styles/app.event.cloud_q1_2019.98f47d07.css", }, "global_events_gml_2019": { script: "/scripts/app.event.global_events_gml_2019.6695235b.js", style: "/styles/app.event.global_events_gml_2019.bb1763a3.css", }, "single_session": { script: "/scripts/app.event.single_session.6ddc3ca3.js", style: "/styles/app.event.single_session.d86eb8f4.css", }, }, theme: { gemini: "/styles/themes/gemini.f25f4bf0.css", youtube: "/styles/themes/youtube.6ad3b535.css", }, angularJsDependencies: "/scripts/dependencies.4f4b11f9.js" } </script> <div class="hidden" id="bad-browser"> <div id="bad-browser-shade"></div> <div id="bad-browser-text"> <span id="warning-icon" ><i class="google-material-icons">warning</i></span > <h2> Your browser<br /> is not supported </h2> <p> For the full experience, use Google Chrome, Firefox, Safari or Edge. </p> </div> </div> <script> // Show bad browser modal for IE and Opera browsers. Separated into // independent code block to prevent other script errors from blocking. // Internet Explorer 6-11 var isIE = !!document.documentMode; // Opera browser var isOpera = /(Opera|OPR\/)/g.test(window.navigator.userAgent); if (isIE || isOpera) { document.getElementById('bad-browser').className = ''; document.body.className += ' unsupported'; } </script> <script> const cookieBarScript = document.createElement('script') const lang = window.navigator.userLanguage || window.navigator.language || 'en'; cookieBarScript.setAttribute('data-glue-cookie-notification-bar-language', lang); cookieBarScript.setAttribute('src', 'https://www.gstatic.com/glue/cookienotificationbar/cookienotificationbar.min.js'); document.body.appendChild(cookieBarScript); </script> <script> function hideTempElements() { const elementIdsToHide = [ 'invalid-password', 'invalid-email', 'no-password', 'email-in-use', 'weak-password', 'create-account-no-password', 'no-first-name', 'no-last-name', 'login-retry-limit', 'confirmation-resent', ]; elementIdsToHide.forEach(id => { document.getElementById(id).classList.add('hidden'); }); } function signInStep(stepName) { hideTempElements(); const currentView = document.getElementById(stepName); document .getElementById('password-container') .classList.remove('hidden'); document.getElementById('password-sign-in').disabled = false; [ 'signinMethod', 'enterEmail', 'hasGoogleAccount', 'enterPassword', 'createAccount', 'accountCreationConfirmation', 'resetPassword', 'postReset', ] .filter(elementId => elementId !== stepName) .forEach(elementId => document.getElementById(elementId).classList.add('hidden') ); currentView.classList.remove('hidden'); const input = currentView.querySelector("input:not([disabled])"); if (input) { input.focus(); } } function checkEmail() { document.getElementById('invalid-email').classList.add('hidden'); const enteredEmail = document.getElementById('emailAddress').value; if (/^.*@google\.com$/i.test(enteredEmail)) { signInStep('hasGoogleAccount'); makeErrorAccessible(document.getElementById('hasGoogleAccount')); } else { const emailRegex = /.+@.+\..+/; if (!enteredEmail || !emailRegex.test(enteredEmail)) { document.getElementById('invalid-email').classList.remove('hidden'); makeErrorAccessible(document.getElementById('invalid-email')); return; } window.firebase .auth() .fetchSignInMethodsForEmail(enteredEmail) .then(signinOptions => { if (signinOptions.length === 0) { document.getElementById('accountEmail').value = enteredEmail; signInStep('createAccount'); } else if (signinOptions.includes('google.com')) { signInStep('hasGoogleAccount'); } else { document.getElementById( 'loginEmail' ).textContent = enteredEmail; signInStep('enterPassword'); } }) .catch(error => console.error(error)); } } function hideErrors(...errorIds) { for(let id of errorIds) { const errorToHide = document.getElementById(id); const errorMessage = errorToHide.querySelector("output"); if(!errorToHide.classList.contains("hidden")) { errorToHide.classList.add("hidden"); } errorMessage.removeAttribute("aria-role"); errorMessage.removeAttribute("aria-live"); } } function makeErrorAccessible(errorContainer) { const errorMessage = errorContainer.querySelector("output"); errorMessage.setAttribute("aria-role", "alert"); errorMessage.setAttribute("aria-live", "polite"); } function signInEmailPassword() { document.getElementById('invalid-password').classList.add('hidden'); document.getElementById('no-password').classList.add('hidden'); document.getElementById('password-sign-in').disabled = false; const password = document.getElementById('loginPassword').value; if (!password) { document.getElementById('no-password').classList.remove('hidden'); makeErrorAccessible(document.getElementById('no-password')); return; } window.firebase .auth() .signInWithEmailAndPassword( document.getElementById('loginEmail').textContent, document.getElementById('loginPassword').value ) .then(() => { window.location.reload(true); }) .catch(error => { if (error.code === 'auth/wrong-password') { document .getElementById('invalid-password') .classList.remove('hidden'); console.debug('wrong password'); makeErrorAccessible(document.getElementById('invalid-password')); } else if (error.code === 'auth/too-many-requests') { document .getElementById('password-container') .classList.add('hidden'); document .getElementById('login-retry-limit') .classList.remove('hidden'); makeErrorAccessible(document.getElementById('login-retry-limit')); document.getElementById('password-sign-in').disabled = true; } else { console.error(error); } }); } function createAccount() { hideTempElements(); const accountEmail = document.getElementById('accountEmail').value; const accountPassword = document .getElementById('accountPassword') .value.trim(); const accountFirstName = document .getElementById('accountFirstName') .value.trim(); const accountLastName = document .getElementById('accountLastName') .value.trim(); document.getElementById('accountPassword').value = accountPassword; document.getElementById('accountFirstName').value = accountFirstName; document.getElementById('accountLastName').value = accountLastName; if (!accountPassword) { document .getElementById('create-account-no-password') .classList.remove('hidden'); makeErrorAccessible(document.getElementById('create-account-no-password')); } if (!accountFirstName) { document.getElementById('no-first-name').classList.remove('hidden'); makeErrorAccessible(document.getElementById('no-first-name')); } if (!accountLastName) { document.getElementById('no-last-name').classList.remove('hidden'); makeErrorAccessible(document.getElementById('no-last-name')); } if (!accountPassword || !accountFirstName || !accountLastName) return; window.firebase .auth() .createUserWithEmailAndPassword(accountEmail, accountPassword) .then(resp => { resp.user.updateProfile({ displayName: `${accountFirstName} ${accountLastName}`, }).then(() => { // Solves issue with Firebase profile data propagation to the // user after creation鈥搊utlined here: // https://buganizer.corp.google.com/issues/204450136 const unsubscribe = window.firebase .auth() .onAuthStateChanged(user => { user.getIdToken(true); unsubscribe(); }); }); const emailConfirmation = document.getElementById("emailConfirmation"); if(emailConfirmation) { document.getElementById( 'emailConfirmation' ).textContent = accountEmail; } sendAccountConfirmation({ url: window.location.href }); signInStep('accountCreationConfirmation'); }) .catch(error => { if (error.code === 'auth/weak-password') { document .getElementById('weak-password') .classList.remove('hidden'); makeErrorAccessible(document.getElementById('weak-password')) } else if (error.code === 'auth/email-already-in-use') { document .getElementById('email-in-use') .classList.remove('hidden'); makeErrorAccessible(document.getElementById('email-in-use')) } else { console.error(error); } }); } function sendAccountConfirmation() { window.firebase.auth().currentUser.sendEmailVerification({ url: window.location.href }); } function resendAccountConfirmation() { window.firebase.auth().currentUser.sendEmailVerification({ url: window.location.href }); document .getElementById('confirmation-resent') .classList.remove('hidden'); } function accountCreationComplete() { location.reload(true); } function resetPassword() { const email = document.getElementById('loginEmail').textContent; window.firebase .auth() .sendPasswordResetEmail(email, { url: window.location.origin }) .then(() => { this.document.getElementById('email-text').textContent = email; this.signInStep('postReset'); }); } </script> </body> </html>