CINXE.COM

Google for Games Developer Summit

<!DOCTYPE html> <html> <head><script type="text/javascript" src="/_static/js/bundle-playback.js?v=HxkREWBo" charset="utf-8"></script> <script type="text/javascript" src="/_static/js/wombat.js?v=txqj7nKC" charset="utf-8"></script> <script>window.RufflePlayer=window.RufflePlayer||{};window.RufflePlayer.config={"autoplay":"on","unmuteOverlay":"hidden"};</script> <script type="text/javascript" src="/_static/js/ruffle/ruffle.js"></script> <script type="text/javascript"> __wm.init("http://web.archive.org/web"); __wm.wombat("https://gamedevsummit.withgoogle.com/","20230314213748","http://web.archive.org/","web","/_static/", "1678829868"); </script> <link rel="stylesheet" type="text/css" href="/_static/css/banner-styles.css?v=S1zqJCYt" /> <link rel="stylesheet" type="text/css" href="/_static/css/iconochive.css?v=3PDvdIFv" /> <!-- End Wayback Rewrite JS Include --> <link rel="icon" href="/web/20230314213748im_/https://gamedevsummit.withgoogle.com/images/shared/platform/favicon.ico"/> <meta name="twitter:card" content="summary"/> <title>Google for Games Developer Summit</title> <meta property="og:title" content="Google for Games Developer Summit"/> <meta name="description" content="The summit returns on March 14, 2023 at 9 a.m. PT. Hear from leaders across our Android, Google Play, Ads, YouTube, and Cloud teams on new solutions for game developers that make it easier to build high quality games, scale their business, and reach growing audiences around the world."/> <meta property="og:description" content="The summit returns on March 14, 2023 at 9 a.m. PT. Hear from leaders across our Android, Google Play, Ads, YouTube, and Cloud teams on new solutions for game developers that make it easier to build high quality games, scale their business, and reach growing audiences around the world."/> <meta property="og:image" content="http://web.archive.org/web/20230314213748im_/https://gamedevsummit.withgoogle.com/api/assets?path=/gs/gweb-gc-gather-production.appspot.com/files/ADPycdvouwVpINUICle2HGmaLlvSWHKYy1W1dSXYnqDBeboQlApIu-J6ThvkqEl2XdBQK5scea-fJXuY3oIzvlnOp6KM7de3Kq34.A3C-HEDj8EO5UCVr"/> <meta property="og:image:alt" content="event image"/> <meta name="robots" content="index,follow"/> <meta charset="utf-8"/> <meta content="initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no, width=device-width" name="viewport"/> <link href="//web.archive.org/web/20230314213748cs_/https://fonts.googleapis.com/css?family=Roboto+Mono|Google+Sans:400,500,600,700|Roboto:100,200,300,400,500,600,700&amp;lang=en" rel="stylesheet"/> <link href="http://web.archive.org/web/20230314213748cs_/https://fonts.googleapis.com/css2?family=Google+Material+Icons:wght@400;500;700" rel="stylesheet"> <base href="/web/20230314213748/https://gamedevsummit.withgoogle.com/"/> <link rel="canonical" href="http://web.archive.org/web/20230314213748/https://gamedevsummit.withgoogle.com/"/> <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); } } /* cookie-bar */ #cookie-bar { box-sizing: border-box; position: sticky; width: 100%; min-height: max-content; bottom: 0; background: #fff; display: flex; font-size: 14px; justify-content: space-between; align-items: center; z-index: 999998; box-shadow: 0 1px 6px 0 rgb(54 64 67 / 80%); } .hidden { display: none !important; } @media screen and (max-width: 1023px) { #cookie-bar { flex-direction: column; align-items: flex-start; } } /* main text */ #cookie-bar span { color: #5f6368; padding: 12px 20px; font-family: 'Google Sans', 'Arial', sans-serif; font-size: 16px; font-weight: normal; letter-spacing: .1px; line-height: 22px; text-rendering: optimizeLegibility; } /* button container */ #cookie-bar .buttons { align-items: center; align-self: flex-end; display: flex; padding: 8px 8px 8px 0; column-gap: 8px; } @media screen and (max-width: 1023px) { #cookie-bar .buttons { padding-top: 0; } } @media screen and (max-width: 600px) { #cookie-bar .buttons { padding-left: 8px; justify-content: center; width: 100%; } } /* CTAs */ #cookie-bar .cookieBarButton { align-items: center; border-radius: 4px; display: inline-flex; flex-wrap: nowrap; font-family: 'Google Sans', 'Arial', sans-serif; font-size: 16px; font-weight: 500; height: 48px; justify-content: center; letter-spacing: .5px; min-width: 96px; padding: 2px 24px 0; text-decoration: none; transition: background-color .2s,box-shadow .2s,color .2s; white-space: nowrap; } @media screen and (max-width: 600px) { #cookie-bar .cookieBarButton { flex: 1; } } /* see details link */ #cookie-bar .buttons a { background-color: #e8f0fe; color: #1967d2; border: 1px solid transparent; } #cookie-bar .buttons a:hover { background-color: #e0ebfc; box-shadow: 0 1px 2px 0 rgb(60 64 67 / 30%), 0 1px 3px 1px rgb(60 64 67 / 15%); color: #174ea6; } /* confirm button */ #cookie-bar .buttons button { background: #1a73e8; color: #fff; } #cookie-bar .buttons button:hover { background-color: #185abc; box-shadow: 0 1px 2px 0 rgb(60 64 67 / 30%), 0 1px 3px 1px rgb(60 64 67 / 15%); } 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> window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date; ga('create', 'UA-117498501-1', 'auto'); ga('set', 'location', stripURL()); ga('require', 'cleanUrlTracker', { stripQuery: true, queryParamsWhitelist: ['talk'], trailingSlash: 'remove' }); ga('require', 'eventTracker'); ga('require', 'impressionTracker'); ga('require', 'maxScrollTracker'); ga('require', 'mediaQueryTracker'); ga('require', 'outboundLinkTracker'); ga('require', 'pageVisibilityTracker'); ga('require', 'urlChangeTracker'); ga('set', 'anonymizeIp', true); ga('send', 'pageview'); function stripURL() { const urlParams = new URLSearchParams(window.location.search); const allowedParams = [ 'talk', 'utm_campaign', 'utm_content', 'utm_medium', 'utm_source', 'utm_term' ]; let savedParams = {}; for (let param of allowedParams) { urlParams.has(param) && (savedParams[param] = urlParams.get(param)); } const strippedURL = window.location.origin + window.location.pathname; const strippedParams = new URLSearchParams(savedParams).toString(); return strippedURL + (strippedParams && `?${strippedParams}`); } </script> <script async src="//web.archive.org/web/20230314213748js_/https://www.google-analytics.com/analytics.js"></script> <script async src="/web/20230314213748js_/https://gamedevsummit.withgoogle.com/static/js/autotrack.js"></script> <script src="//web.archive.org/web/20230314213748js_/https://www.gstatic.com/firebasejs/7.14.2/firebase-app.js"></script> <script src="//web.archive.org/web/20230314213748js_/https://www.gstatic.com/firebasejs/7.14.2/firebase-auth.js"></script> <script src="//web.archive.org/web/20230314213748js_/https://www.gstatic.com/firebasejs/7.14.2/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: "http://web.archive.org/web/20230314213748/https://us-central1-gweb-gc-gather-production.cloudfunctions.net", firebase: { apiKey: 'AIzaSyC1a0zObeFwLX6lp3psqKSqeSvyTJl-2Xg', authDomain: 'gweb-gc-gather-production.firebaseapp.com', databaseURL: 'http://web.archive.org/web/20230314213748/https://gweb-gc-gather-production-replica2.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", instance: "gamedevsummit.withgoogle.com", 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", ] } } // Initialize Firebase window.firebase.initializeApp(window.CONFIG.firebase); </script> </head> <body> <!-- 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="http://web.archive.org/web/20230314213748/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 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="http://web.archive.org/web/20230314213748/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> The email you entered is associated with a Google account. 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="http://web.archive.org/web/20230314213748/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"> 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 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="http://web.archive.org/web/20230314213748/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"> 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 &amp; 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="http://web.archive.org/web/20230314213748/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 the email address above. Click the confirmation link you've received to verify your account. </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="http://web.archive.org/web/20230314213748/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鈥檝e 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="http://web.archive.org/web/20230314213748/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 <span id="email-text" class="email-text"></span>. 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="http://web.archive.org/web/20230314213748/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> <output> <p>Sorry, the user account you are using is now linked to Google. Please sign in with Google to use this account.</p> </output> <button onclick="signOut()">Sign out</button> </div> </div> <div id="private-error" class="boxed-takeover"> <div class="box"> <h1>Forbidden</h1> <output> <p>Sorry, you do not have permission to access this private event.</p> </output> <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. </p> <p> If this issue persists, please <a href="javascript:signOut()">sign out</a> and sign back in after reloading. </p> </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="/web/20230314213748js_/https://gamedevsummit.withgoogle.com/scripts/app.preload.ee34c881.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.e9c3b6cc.js", style: "/styles/app.platform.cloud.d0eeff95.css", }, }, event: { "default": { script: "/scripts/app.event.default.6d818265.js", style: "/styles/app.event.default.572b0668.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.af21a6b1.js", style: "/styles/app.event.single_session.cc863cc2.css", }, }, angularJsDependencies: "/scripts/dependencies.4f4b11f9.js" } </script> <!-- Google Tag Manager --> <noscript><iframe src="//web.archive.org/web/20230314213748if_/https://www.googletagmanager.com/ns.html?id=GTM-T3X3K5C" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <script> (function(w, d, s, l, i) { w[l] = w[l] || []; w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' }); var f = d.getElementsByTagName(s)[0], j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''; j.async = true; j.src = '//web.archive.org/web/20230314213748/https://www.googletagmanager.com/gtm.js?id=' + i + dl; f.parentNode.insertBefore(j, f); })(window, document, 'script', 'dataLayer', 'GTM-T3X3K5C'); </script> <!-- End Google Tag Manager --> <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> <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> <div class="container hidden" id="cookie-bar" role="region" aria-labelledby="cookieBarText"> <span id="cookieBarText">Google serves cookies to analyse traffic to this site. Information about your use of our site is shared with Google for that purpose.</span> <div class="buttons"> <a href="http://web.archive.org/web/20230314213748/https://policies.google.com/technologies/cookies" rel="noopener" target="_blank" class="cookieBarButton">See details</a> <button class="cookieBarButton confirm">OK, got it</button> </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> var cookieBarState = false; try { cookieBarState = window.localStorage.getItem('cookiebar_state'); } catch (e) { console.log('Failed to load cookie bar state'); } if (!cookieBarState) { var cookieBarEl = document.querySelector('#cookie-bar'); if (cookieBarEl) { cookieBarEl.classList.remove('hidden'); var button = cookieBarEl.querySelector('.confirm'); function buttonClickHandler(event) { try { window.localStorage.setItem('cookiebar_state', 'True'); } catch (e) { console.log('Failed to save cookiebar state'); } var cookieBarEl = document.querySelector('#cookie-bar'); cookieBarEl.classList.add('hidden'); } button.addEventListener('click', buttonClickHandler); } } 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><!-- FILE ARCHIVED ON 21:37:48 Mar 14, 2023 AND RETRIEVED FROM THE INTERNET ARCHIVE ON 05:05:19 Dec 03, 2024. JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE. ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C. SECTION 108(a)(3)). --> <!-- playback timings (ms): captures_list: 0.579 exclusion.robots: 0.028 exclusion.robots.policy: 0.017 esindex: 0.011 cdx.remote: 16.135 LoadShardBlock: 176.27 (3) PetaboxLoader3.datanode: 185.978 (4) PetaboxLoader3.resolve: 42.578 load_resource: 100.918 -->

Pages: 1 2 3 4 5 6 7 8 9 10