이 참조에서는 JavaScript 클라이언트 메서드 및 속성에 대해 설명합니다. Google 로그인을 구현하는 데 사용됩니다.
라이브러리 사용 중에 문제가 발생하면 Google에 신고해 주세요. GitHub 저장소
인증 설정
Google API 플랫폼 라이브러리를 로드하여 gapi
객체를 만듭니다.
<script src="https://apis.google.com/js/platform.js?onload=init" async defer></script>
플랫폼 라이브러리가 로드된 후 auth2
라이브러리를 로드합니다.
function init() {
gapi.load('auth2', function() {
/* Ready. Make a call to gapi.auth2.init or some other API */
});
}
gapi.auth2.init(params)
GoogleAuth
객체를 초기화합니다. gapi.auth2.GoogleAuth
의 메서드를 호출하기 전에 이 메서드를 호출해야 합니다.
GoogleAuth
객체를 초기화할 때 OAuth 2.0 클라이언트 ID 및 지정하려는 추가 옵션으로 객체를 구성합니다. 사용자가 이미 로그인했다면 GoogleAuth
객체가 이전 세션에서 사용자의 로그인 상태를 복원합니다.
인수 | |
---|---|
params |
클라이언트 구성 데이터의 키-값 쌍이 포함된 객체입니다. 자세한 내용은
다른 경우 gapi.auth2.ClientConfig
속성을 구성할 수 있습니다. 예를 들면 다음과 같습니다.
{ client_id: 'CLIENT_ID.apps.googleusercontent.com' } |
반환 값 | |
---|---|
gapi.auth2.GoogleAuth |
gapi.auth2.GoogleAuth 객체 사용
then() 메서드를 사용하여 프로미스 가져오기
gapi.auth2.GoogleAuth 객체가 완료되면
있습니다.
|
GoogleAuth.then(onInit, onError)
GoogleAuth
객체가 완전히 준비되면 onInit 함수를 호출합니다.
초기화됩니다. 초기화하는 동안 오류가 발생하면 (지원되지 않는 이전 브라우저에서 발생할 수 있음)
onError 함수가 대신 호출됩니다.
인수 | |
---|---|
onInit |
함수가 완전히 완료되면 GoogleAuth 객체로 호출되는 함수
초기화됩니다.
|
onError |
error 속성이 포함된 객체를 사용하여 호출되는 함수
GoogleAuth 가 초기화되지 않은 경우
|
반환 값 | |
---|---|
Promise | Promise onInit
함수가 완료되었거나, 초기화 오류가 발생한 경우 거부되었습니다. 이는
onInit 함수에서 반환된 값(있는 경우) |
오류 코드
idpiframe_initialization_failed
-
지원되지 않는 이유 등으로 인해 Google에서 필수 iframe을 초기화하지 못했습니다.
환경입니다
details
속성은 발생한 오류에 관한 자세한 정보를 제공합니다.
gapi.auth2.ClientConfig
에 대한 다양한 구성 매개변수를 나타내는 인터페이스입니다.
gapi.auth2.init
메서드를 사용하여 지도 가장자리에
패딩을 추가할 수 있습니다.
매개변수 | ||
---|---|---|
client_id |
string |
필수사항. Google API 콘솔에서 확인 및 생성되는 앱의 클라이언트 ID입니다. |
cookie_policy |
string |
로그인 쿠키를 만들 도메인입니다. URI,
single_host_origin 또는 none 입니다. 기본값은
지정되지 않은 경우 single_host_origin 입니다. |
scope |
string |
요청할 범위(공백으로 구분된 문자열)입니다. 선택사항인 경우
fetch_basic_profile 가 false로 설정되지 않았습니다. |
fetch_basic_profile |
boolean |
사용자 가져오기 기본 프로필 정보를 볼 수 없습니다. 'profile', 'email' 추가 및 'openid'[오픈 ID] 할 수 있습니다 지정되지 않은 경우 true입니다. |
hosted_domain |
string |
로그인하려면 사용자가 속해야 하는 G Suite 도메인입니다. 이
고객이 수정할 수 있으므로 파일 이름이 올바른지
반환된 사용자의 호스트 도메인 속성입니다. 사용
GoogleUser.getHostedDomain()
클라이언트 ID 토큰의 hd 클레임,
서버를 사용하여 도메인이 예상한 것인지 확인합니다.
<ph type="x-smartling-placeholder"> |
use_fedcm |
boolean |
선택사항이며 기본값은 True 입니다. 다음을 사용 또는 사용 중지
브라우저에서 FedCM API를 통해 제어할 수 있습니다. |
ux_mode |
string |
로그인 흐름에 사용할 UX 모드입니다. 기본적으로 동의 흐름이 열립니다.
팝업에 표시됩니다 유효한 값은 popup , redirect 입니다. |
redirect_uri |
string |
ux_mode='redirect' 를 사용하는 경우 이 매개변수를 사용하면
동의 흐름의 마지막에 사용될 기본 redirect_uri 입니다. 이
기본 redirect_uri 은 쿼리 매개변수와 해시가 제거된 현재 URL입니다.
프래그먼트의 예입니다.
|
enable_granular_consent |
boolean |
선택사항입니다. 사용 설정 여부
세분화된
권한이 있는지 확인합니다. false 로 설정하면 Google이
이전에 생성된 OAuth 클라이언트 ID에 대한 계정 권한이 사용 중지됩니다.
2019년. 2019년 중에 또는 이후에 생성된 OAuth 클라이언트 ID에는 영향을 미치지 않습니다.
항상 더 세분화된 권한이 사용 설정됩니다.
|
plugin_name |
string |
선택사항입니다. 이 값을 설정하면 7월 전에 새 클라이언트 ID가 생성됩니다.
2022년 2월 29일부터 이전 Google 플랫폼 라이브러리를 사용할 수 있습니다.
기본적으로 새로 생성된 클라이언트 ID는 이제
플랫폼 라이브러리 대신 최신 Google ID를 사용해야 함
서비스 라이브러리로 대체될 수 있습니다. 원하는 값(예:
식별할 수 있도록 제품 또는 플러그인 이름을 입력하는 것이 좋습니다.
예: plugin_name: 'YOUR_STRING_HERE'
|
인증
GoogleAuth
는 사용자가 Google 계정으로 로그인하고, 사용자의 현재 로그인 상태를 가져오고, 사용자의 Google 프로필에서 특정 데이터를 가져오고, 추가 범위를 요청하고, 현재 계정에서 로그아웃할 수 있는 메서드를 제공하는 싱글톤 클래스입니다.
gapi.auth2.getAuthInstance()
GoogleAuth
객체를 반환합니다. 이 메서드를 호출하기 전에 gapi.auth2.init()
로 GoogleAuth
객체를 초기화해야 합니다.
반환 값 | |
---|---|
gapi.auth2.GoogleAuth |
gapi.auth2.GoogleAuth 객체 이 객체를 사용하여 다음을 호출합니다.
gapi.auth2.GoogleAuth 의 메서드
|
GoogleAuth.isSignedIn.get()
현재 사용자의 로그인 여부를 반환합니다.
반환 값 | |
---|---|
불리언 |
사용자가 로그인한 경우 true , 로그인한 경우 false
사용자가 로그아웃되었거나 GoogleAuth 객체가 로그아웃되지 않았습니다.
초기화됩니다.
|
GoogleAuth.isSignedIn.listen(listener)
현재 사용자의 로그인 상태 변화를 수신 대기합니다.
인수 | |
---|---|
listener |
불리언 값을 사용하는 함수입니다. 패스 listen() 개
사용자가 로그인할 때 이 함수에 true 를 추가합니다.
false 로 전환됩니다.
|
GoogleAuth.signIn()
gapi.auth2.init()
에 지정된 옵션으로 사용자를 로그인 처리합니다.
반환 값 | |
---|---|
Promise | 다음과 같은 경우 GoogleUser 인스턴스로 처리되는 Promise
사용자가 요청된 범위를 성공적으로 인증하고 부여하거나 객체를 사용하여 거부됨
오류가 발생한 경우 error 속성이 포함됩니다. 자세한 내용은
다음 섹션에서 오류 코드를 확인하세요. |
오류 코드
GoogleAuth.signIn(options)
를 참조하세요.
GoogleAuth.signIn(options)
지정된 옵션을 사용하여 사용자를 로그인 처리합니다.
인수 | |
---|---|
options |
둘 중 하나의 경우입니다.
|
반환 값 | |
---|---|
Promise | 다음과 같은 경우 GoogleUser 인스턴스로 처리되는 Promise
사용자가 요청된 범위를 성공적으로 인증하고 부여하거나 객체를 사용하여 거부됨
오류가 발생한 경우 error 속성이 포함됩니다 (오류 코드는 아래 참고). |
오류 코드
popup_closed_by_user
- 사용자가 로그인 과정을 완료하기 전에 팝업을 닫았습니다.
access_denied
- 사용자가 필요한 범위에 대한 권한을 거부했습니다.
immediate_failed
-
동의 흐름을 표시하지 않으면 사용자를 자동으로 선택할 수 없습니다. 오류 발생 시
prompt: 'none'
옵션으로signIn
를 사용합니다. 이 옵션은 필요한 경우gapi.auth2.init
에서 사용자가 자동으로 로그인하므로 로그인한 적이 있어야 합니다
gapi.auth2.SignInOptions
에 대한 다양한 구성 매개변수를 나타내는 인터페이스입니다.
GoogleAuth.signIn(options)
메서드를 사용하여 지도 가장자리에
패딩을 추가할 수 있습니다.
매개변수 | ||
---|---|---|
prompt |
string |
동의 흐름에 특정 모드를 강제 적용합니다. 선택사항입니다. 가능한 값은 다음과 같습니다. <ph type="x-smartling-placeholder">
|
scope |
string |
gapi.auth2.init 매개변수 fetch_basic_profile 가 설정되지 않은 경우 선택사항입니다.
false로 설정합니다.
|
ux_mode |
string |
로그인 흐름에 사용할 UX 모드입니다. 기본적으로 동의 흐름이 열립니다.
팝업에 표시됩니다 유효한 값은 popup , redirect 입니다. |
redirect_uri |
string |
ux_mode='redirect' 를 사용하는 경우 이 매개변수를 사용하면
동의 시 사용될 기본 redirect_uri
있습니다. 기본 redirect_uri 는 현재 검색어가 삭제된 URL입니다.
매개변수 및 해시 프래그먼트입니다.
|
GoogleAuth.signOut()
애플리케이션에서 현재 계정을 로그아웃합니다.
반환 값 | |
---|---|
Promise | 사용자가 로그인했을 때 처리되는 Promise
있습니다. |
GoogleAuth.disconnect()
사용자가 부여한 모든 범위를 취소합니다.
GoogleAuth.grantOfflineAccess(options)
지정된 범위에 오프라인으로 액세스할 수 있는 권한을 사용자에게 얻습니다.
인수 | |
---|---|
options |
gapi.auth2.OfflineAccessOptions
객체의 키-값 쌍을 포함하는 객체입니다. 예를 들면 다음과 같습니다. { scope: 'profile email' } |
반환 값 | |
---|---|
Promise | 사용자가 Promise
인증 코드가 포함된 객체를
Promise 의 fulfillment 핸들러입니다.
예를 들면 다음과 같습니다. auth2.grantOfflineAccess().then(function(resp) { var auth_code = resp.code; }); |
오류 코드
popup_closed_by_user
- 사용자가 동의 절차를 완료하기 전에 팝업을 닫았습니다.
access_denied
- 사용자가 필요한 범위에 대한 권한을 거부했습니다.
immediate_failed
-
동의 흐름을 표시하지 않으면 사용자를 자동으로 선택할 수 없습니다. 오류 발생 시
prompt: 'none'
옵션으로signIn
를 사용합니다. 이 옵션은 필요한 경우gapi.auth2.init
에서 사용자가 자동으로 로그인하므로 로그인한 적이 있어야 합니다
gapi.auth2.OfflineAccessOptions
에 대한 다양한 구성 매개변수를 나타내는 인터페이스입니다.
GoogleAuth.grantOfflineAccess(options)
메서드를 사용하여 축소하도록 요청합니다.
매개변수 | ||
---|---|---|
prompt |
string |
동의 흐름에 특정 모드를 강제 적용합니다. 선택사항입니다. 가능한 값은 다음과 같습니다. <ph type="x-smartling-placeholder">
|
scope |
string |
gapi.auth2.init 매개변수 fetch_basic_profile 가 설정되지 않은 경우 선택사항입니다.
false로 설정합니다.
|
GoogleAuth.attachClickHandler(container, options, onsuccess, onfailure)
로그인 과정을 지정된 컨테이너의 클릭 핸들러에 연결합니다.
인수 | |
---|---|
container | 다음에 대한 div 요소의 ID 또는 참조
클릭 핸들러를 연결합니다. |
options | 매개변수의 키-값 쌍을 포함하는 객체입니다. 자세한 내용은 GoogleAuth.signIn()을 호출합니다. |
onsuccess | 로그인이 완료된 후 호출할 함수입니다. |
onfailure | 로그인 실패 시 호출할 함수입니다. |
사용자
GoogleUser
객체는 하나의 사용자 계정을 나타냅니다.
GoogleUser
객체는 일반적으로 다음을 호출하여 가져옵니다.
GoogleAuth.currentUser.get()
GoogleAuth.currentUser.get()
GoogleUser
객체를 반환합니다.
현재 사용자를 나타냅니다 새로 초기화된
GoogleAuth
인스턴스에서 현재 사용자가 설정되지 않았습니다. 사용
currentUser.listen()
메서드 또는 GoogleAuth.then()
초기화된 GoogleAuth
인스턴스를 가져옵니다.
반환 값 | |
---|---|
GoogleUser |
현재 사용자 |
GoogleAuth.currentUser.listen(listener)
currentUser의 변경사항을 수신 대기합니다.
인수 | |
---|---|
listener |
GoogleUser 매개변수를 사용하는 함수입니다.
listen 는 이 함수에 GoogleUser 을 전달합니다.
currentUser 를 수정하는 모든 변경 시 인스턴스가 실행됩니다.
|
GoogleUser.getId()
사용자의 고유 ID 문자열을 가져옵니다.
반환 값 | |
---|---|
문자열 | 사용자의 고유 ID |
GoogleUser.isSignedIn()
사용자가 로그인한 경우 true를 반환합니다.
반환 값 | |
---|---|
불리언 | 사용자가 로그인한 경우 true |
GoogleUser.getHostedDomain()
사용자가 G Suite 계정으로 로그인한 경우 사용자의 G Suite 도메인을 가져옵니다.
반환 값 | |
---|---|
문자열 | 사용자의 G Suite 도메인 |
GoogleUser.getGrantedScopes()
사용자가 부여한 범위를 공백으로 구분된 문자열로 가져옵니다.
반환 값 | |
---|---|
문자열 | 사용자가 부여한 범위 |
GoogleUser.getBasicProfile()
사용자의 기본 프로필 정보를 가져옵니다.
반환 값 | |
---|---|
gapi.auth2.BasicProfile |
gapi.auth2.BasicProfile 의 속성을 가져올 수 있습니다.
다음 메서드를 사용하세요.
<ph type="x-smartling-placeholder">
|
GoogleUser.getAuthResponse(includeAuthorizationData)
사용자의 인증 세션에서 응답 객체를 가져옵니다.
인수 | |
---|---|
includeAuthorizationData | 선택사항: 항상 액세스 토큰을 반환할지 그리고
할 수 있습니다 기본적으로 액세스 토큰과 요청된 범위는
fetch_basic_profile 가 true (기본값)이고 추가 범위가 없음
있습니다. |
반환 값 | |
---|---|
gapi.auth2.AuthResponse |
gapi.auth2.AuthResponse 객체 |
GoogleUser.reloadAuthResponse()
액세스 토큰을 강제로 새로고침한 다음 새 AuthResponse에 대해 프로미스를 반환합니다.
반환 값 | |
---|---|
Promise |
새로고침된 API로 처리되는 Promise
새로고침 시 gapi.auth2.AuthResponse
OAuth 토큰이 완료되었습니다.
|
gapi.auth2.AuthResponse
호출 시 반환되는 응답입니다.
GoogleUser.getAuthResponse(includeAuthorizationData)
또는
GoogleUser.reloadAuthResponse()
메서드를 참조하세요.
속성 | ||
---|---|---|
access_token |
string |
부여된 액세스 토큰입니다. |
id_token |
string |
부여된 ID 토큰입니다. |
scope |
string |
액세스 토큰에 부여된 범위입니다. |
expires_in |
number |
액세스 토큰이 만료될 때까지의 시간(초)입니다. |
first_issued_at |
number |
요청된 범위를 사용자가 처음 부여한 타임스탬프입니다. |
expires_at |
number |
액세스 토큰이 만료되는 타임스탬프입니다. |
GoogleUser.hasGrantedScopes(scopes)
사용자가 지정된 범위를 부여한 경우 true를 반환합니다.
인수 | |
---|---|
scopes | 공백으로 구분된 범위 문자열입니다. |
반환 값 | |
---|---|
불리언 | 범위가 부여된 경우 참입니다. |
GoogleUser.grant(options)
사용자에게 추가 범위를 요청합니다.
목록은 GoogleAuth.signIn()
를 참고하세요.
매개변수, 오류 코드
GoogleUser.grantOfflineAccess(options)
지정된 범위에 오프라인으로 액세스할 수 있는 권한을 사용자에게 얻습니다.
인수 | |
---|---|
options |
gapi.auth2.OfflineAccessOptions
객체의 키-값 쌍을 포함하는 객체입니다. 예를 들면 다음과 같습니다. { scope: 'profile email' } |
GoogleUser.disconnect()
사용자가 애플리케이션에 부여한 모든 범위를 취소합니다.
UI 요소
gapi.signin2.render(id, options)
다음을 사용하여 지정된 ID의 요소에서 로그인 버튼을 렌더링합니다. options 객체에서 지정한 설정입니다.
인수 | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
id | 로그인 버튼을 렌더링할 요소의 ID입니다. | ||||||||||||||||
options |
버튼을 렌더링하는 데 사용할 설정이 포함된 객체입니다. 예를 들면 다음과 같습니다.
{ scope: 'email', width: 200, height: 50, longtitle: true, theme: 'dark', onsuccess: handleSuccess, onfailure: handleFailure }
|
고급
<ph type="x-smartling-placeholder">gapi.auth2.privilege(params, callback)
일회성 OAuth 2.0 승인을 수행합니다. 사용된 매개변수에 따라 팝업을 표시하거나 사용자 상호작용 없이 요청된 응답을 자동으로 로드해 봅니다.
이 메서드가 유용한 사용 사례는 다음과 같습니다.
- 애플리케이션은 Google API 엔드포인트를 한 번만 요청하면 됩니다. 예를 들어 즐겨찾는 YouTube 동영상이 표시됩니다.
- 애플리케이션에 자체 세션 관리 인프라가 있고 백엔드에서 사용자를 식별하기 위한 ID 토큰 한 번.
- 여러 클라이언트 ID가 동일한 페이지 내에서 사용됩니다.
인수 | |
---|---|
params |
구성 데이터의 키-값 쌍이 포함된 객체입니다. 자세한 내용은
gapi.auth2.AuthorizeConfig
여러 속성을 구성할 수 있습니다. 예를 들면 다음과 같습니다.
{ client_id: 'CLIENT_ID.apps.googleusercontent.com', scope: 'email profile openid', response_type: 'id_token permission' } |
callback |
객체 gapi.auth2.AuthorizeResponse 개
요청이 완료된 후 (성공적으로든 실패든)
|
예
gapi.auth2.authorize({
client_id: 'CLIENT_ID.apps.googleusercontent.com',
scope: 'email profile openid',
response_type: 'id_token permission'
}, function(response) {
if (response.error) {
// An error happened!
return;
}
// The user authorized the application for the scopes requested.
var accessToken = response.access_token;
var idToken = response.id_token;
// You can also now use gapi.client to perform authenticated requests.
});
오류 코드
idpiframe_initialization_failed
-
지원되지 않는 이유 등으로 인해 Google에서 필수 iframe을 초기화하지 못했습니다.
환경입니다
details
속성은 발생한 오류에 관한 자세한 정보를 제공합니다. popup_closed_by_user
- 사용자가 로그인 과정을 완료하기 전에 팝업을 닫았습니다.
access_denied
- 사용자가 필요한 범위에 대한 권한을 거부했습니다.
immediate_failed
-
동의 흐름을 표시하지 않으면 사용자를 자동으로 선택할 수 없습니다. 오류 발생 시
prompt: 'none'
옵션으로signIn
를 사용합니다.
gapi.auth2.AuthorizeConfig
에 대한 다양한 구성 매개변수를 나타내는 인터페이스입니다.
gapi.auth2.authorize
메서드를 사용하여 지도 가장자리에
패딩을 추가할 수 있습니다.
속성 | ||
---|---|---|
client_id |
string |
필수사항: Google API 콘솔에서 확인 및 생성되는 앱의 클라이언트 ID입니다. |
scope |
string |
필수사항: 요청할 범위(공백으로 구분된 문자열)입니다. |
response_type |
string |
공백으로 구분된 응답 유형 목록입니다. 기본값은 'permission' 입니다. 가능한
값은 다음과 같습니다.
<ph type="x-smartling-placeholder">
|
prompt |
string |
동의 흐름에 특정 모드를 강제 적용합니다. 가능한 값은 다음과 같습니다.
<ph type="x-smartling-placeholder">
|
cookie_policy |
string |
로그인 쿠키를 만들 도메인입니다. URI,
single_host_origin 또는 none 입니다. 기본값은
지정되지 않은 경우 single_host_origin 입니다.
|
hosted_domain |
string |
로그인하려면 사용자가 속해야 하는 G Suite 도메인입니다. 수정될 수 있습니다. 클라이언트로 설정되므로 반환된 사용자의 호스트 도메인 속성을 확인해야 합니다. |
login_hint |
string |
로그인 과정에서 사전 선택할 사용자의 이메일 또는 사용자 ID입니다. 이것은
prompt: "none" 를 사용하지 않는 한 사용자가 수정할 수 없습니다.
|
include_granted_scopes |
boolean |
사용자가 이전에 부여한 모든 범위가 포함된 액세스 토큰 요청 여부
현재 호출에서 요청된 범위만 지정할 수도 있습니다. 기본값은 true 입니다.
|
enable_granular_consent |
boolean |
선택사항입니다. 사용 설정 여부
세분화된
권한이 있는지 확인합니다. false 로 설정하면 Google이
이전에 생성된 OAuth 클라이언트 ID에 대한 계정 권한이 사용 중지됩니다.
2019년. 2019년 중에 또는 이후에 생성된 OAuth 클라이언트 ID에는 영향을 미치지 않습니다.
더 세분화된 권한이 항상 사용 설정됩니다.
|
plugin_name |
string |
선택사항입니다. 설정된 경우 2022년 7월 29일 이전에 생성된 클라이언트 ID는
Google 플랫폼 라이브러리 기본적으로 새로 생성된 클라이언트 ID는 차단됩니다.
대신 최신 Google Cloud SDK를 사용해야 합니다.
사용할 수 있습니다 설명적인 이름 등 원하는 값을 선택할 수 있습니다.
쉽게 식별할 수 있도록 제품 또는 플러그인 이름과 같은 이름을 사용하는 것이 좋습니다.
예: plugin_name: 'YOUR_STRING_HERE'
|
gapi.auth2.AuthorizeResponse
이
gapi.auth2.authorize
메서드를 사용하여 지도 가장자리에
패딩을 추가할 수 있습니다.
속성 | ||
---|---|---|
access_token |
string |
부여된 액세스 토큰입니다. permission 또는 token 가 다음과 같은 경우에만 표시됩니다.
response_type
|
id_token |
string |
부여된 ID 토큰입니다. id_token 가
response_type 입니다.
|
code |
string |
부여된 승인 코드. code 가
response_type 입니다.
|
scope |
string |
액세스 토큰에 부여된 범위입니다. permission 또는
token 가 response_type 에서 지정되었습니다.
|
expires_in |
number |
액세스 토큰이 만료될 때까지의 시간(초)입니다. permission 인 경우에만 표시됩니다.
또는 token 가 response_type 에서 지정되었습니다.
|
first_issued_at |
number |
요청된 범위를 사용자가 처음 부여한 타임스탬프입니다. 다음 경우에만 표시됩니다.
response_type 에서 permission 또는 token 를 지정했습니다.
|
expires_at |
number |
액세스 토큰이 만료되는 타임스탬프입니다. permission 인 경우에만 표시됩니다.
또는 token 가 response_type 에서 지정되었습니다.
|
error |
string |
요청이 실패하면 여기에는 오류 코드가 표시됩니다. |
error_subtype |
string |
요청이 실패하면 오류 코드에 대한 추가 정보도 포함될 수 있습니다. 반환합니다. |