@alauda-fe/common
Version:
Alauda frontend team common codes.
189 lines • 24.1 kB
JavaScript
import { getTopWindow, noop, NOT_NOTIFY_ON_ERROR_HEADERS, } from '../core/public-api';
import { getInitUrl, recordInitUrl } from './app-init-url';
import { CALLBACK_API, CODE_KEY, STATE_KEY, EXTERNAL_REDIRECT_API, ID_TOKEN_KEY, LOGIN_API, LOGOUT_API, REDIRECT_URIS, } from './constants';
import { cleanStorageToken, readStorageToken, refreshStorageAliveRecord, writeStorageToken, } from './storage-token';
import { fetchTokenApi, requestTokenInfo, requestTokenRefresh, } from './token-client';
let ACCOUNT_INFO;
let checkTokenPromise;
let refreshTokenPromise;
export function getCachedAccountInfo() {
return ACCOUNT_INFO;
}
export async function fetchAuthorizationState() {
recordInitUrl();
await getExistingToken();
const info = await resolveTokenInfoWithRefresh();
if (!info) {
await logout(true);
return new Promise(() => undefined);
}
return { info };
}
export function attachAuthorizationHeader() {
const idToken = readStorageToken();
return idToken ? { Authorization: `Bearer ${idToken}` } : {};
}
export async function checkAuthorizationToken() {
if (checkTokenPromise) {
return checkTokenPromise;
}
checkTokenPromise = requestTokenInfo()
.then(info => {
ACCOUNT_INFO = info;
if (!info) {
throw new Error('Authorization token is invalid');
}
return info;
})
.finally(() => {
checkTokenPromise = null;
});
return checkTokenPromise;
}
export async function refreshAuthorizationToken() {
if (refreshTokenPromise) {
return refreshTokenPromise;
}
refreshTokenPromise = requestTokenRefresh()
.then(tokenResponse => {
if (!tokenResponse) {
throw new Error('Failed to refresh token');
}
return tokenResponse;
})
.finally(() => {
refreshTokenPromise = null;
});
return refreshTokenPromise;
}
export async function logoutAudit() {
return fetchTokenApi(LOGOUT_API, {
headers: NOT_NOTIFY_ON_ERROR_HEADERS,
})
.then(res => res?.json())
.catch(() => null);
}
export async function logout(returnCurrentPage = false) {
cleanStorageToken();
let logoutUrl;
if (typeof returnCurrentPage === 'string' && returnCurrentPage !== '') {
logoutUrl = returnCurrentPage;
}
else {
try {
const { authUrl } = await getAuthConfiguration();
logoutUrl = dexLogoutUrl(authUrl, !!returnCurrentPage);
}
catch {
logout(returnCurrentPage);
}
}
try {
getTopWindow().location.href = logoutUrl;
}
catch {
location.href = logoutUrl;
}
return new Promise(noop);
}
export function redirectSSOEntry(entry) {
const hasQuery = entry.includes('?');
if (hasQuery) {
const [url, query] = entry.split('?');
return `${EXTERNAL_REDIRECT_API}?redirect_url=${url}&${query}`;
}
return `${EXTERNAL_REDIRECT_API}?redirect_url=${entry}`;
}
async function resolveTokenInfoWithRefresh() {
try {
const info = await requestTokenInfo();
ACCOUNT_INFO = info;
if (info) {
return info;
}
const refreshed = await requestTokenRefresh();
if (!refreshed) {
ACCOUNT_INFO = null;
return null;
}
const newInfo = await requestTokenInfo();
ACCOUNT_INFO = newInfo;
return newInfo;
}
catch {
ACCOUNT_INFO = null;
return null;
}
}
function dexLogoutUrl(authUrl, returnCurrentPage = false) {
return replaceRedirectUrl(authUrl, returnCurrentPage ? location.href : location.origin + '/console-portal');
}
function replaceRedirectUrl(dexUrl, redirectUrl) {
const [path, queryParams] = dexUrl.split('?');
const replacedQueryParams = queryParams
.split('&')
.map(pair => {
const [key, value] = pair.split('=');
return REDIRECT_URIS.has(key)
? `${key}=${encodeURIComponent(redirectUrl)}`
: `${key}=${value}`;
})
.join('&');
return `${path}?${replacedQueryParams}`;
}
async function getAuthConfiguration() {
const { auth_url: authUrl } = await fetch(LOGIN_API).then(res => res.json());
return { authUrl };
}
async function getExistingToken() {
const { queryParams, hashParams } = getParams();
const code = queryParams[CODE_KEY] || hashParams[CODE_KEY];
const state = queryParams[STATE_KEY] || hashParams[STATE_KEY];
const idToken = queryParams[ID_TOKEN_KEY] || hashParams[ID_TOKEN_KEY];
if (!code && !idToken) {
return;
}
refreshStorageAliveRecord();
if (code) {
await setCookieByCode(code, state);
}
else {
await setCookieByToken(idToken);
}
}
async function setCookieByCode(code, state) {
const queryParams = new URLSearchParams({ code, state });
const tokenResponse = await fetch(`${CALLBACK_API}?${queryParams.toString()}`).then(res => res.json());
writeStorageToken(tokenResponse?.id_token);
}
async function setCookieByToken(idToken) {
const queryParams = new URLSearchParams({ id_token: idToken });
const tokenResponse = await fetch(`${CALLBACK_API}?${queryParams.toString()}`).then(res => res.json());
writeStorageToken(tokenResponse?.id_token);
}
function getParams() {
const initUrl = getInitUrl();
const initLocation = new URL(initUrl);
const queryParams = parseParams(initLocation.search ? initLocation.search.slice(1) : '');
const hashParams = parseParams(initLocation.hash ? initLocation.hash.slice(1) : '');
return { queryParams, hashParams };
}
function parseParams(query) {
if (!query) {
return {};
}
return query.split('&').reduce((acc, param) => {
if (!param) {
return acc;
}
const separatorIndex = param.indexOf('=');
const key = separatorIndex === -1 ? param : param.slice(0, separatorIndex);
const value = separatorIndex === -1 ? '' : param.slice(separatorIndex + 1);
if (!key) {
return acc;
}
acc[key] = value;
return acc;
}, {});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aG9yaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9hdXRob3JpemF0aW9uL2F1dGhvcml6YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFlBQVksRUFDWixJQUFJLEVBQ0osMkJBQTJCLEdBRTVCLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRCxPQUFPLEVBQ0wsWUFBWSxFQUNaLFFBQVEsRUFDUixTQUFTLEVBQ1QscUJBQXFCLEVBQ3JCLFlBQVksRUFDWixTQUFTLEVBQ1QsVUFBVSxFQUNWLGFBQWEsR0FDZCxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQix5QkFBeUIsRUFDekIsaUJBQWlCLEdBQ2xCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUNMLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsbUJBQW1CLEdBQ3BCLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEIsSUFBSSxZQUF5QixDQUFDO0FBQzlCLElBQUksaUJBQXVDLENBQUM7QUFDNUMsSUFBSSxtQkFBMkMsQ0FBQztBQUVoRCxNQUFNLFVBQVUsb0JBQW9CO0lBQ2xDLE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLHVCQUF1QjtJQUMzQyxhQUFhLEVBQUUsQ0FBQztJQUVoQixNQUFNLGdCQUFnQixFQUFFLENBQUM7SUFFekIsTUFBTSxJQUFJLEdBQUcsTUFBTSwyQkFBMkIsRUFBRSxDQUFDO0lBRWpELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25CLE9BQU8sSUFBSSxPQUFPLENBQVEsR0FBRyxFQUFFLENBQUMsU0FBUyxD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Q0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDM0UsTUFBTSxLQUFLLEdBQUcsY0FBYyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRTNFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNULE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQztRQUVELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7UUFFakIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLEVBQUUsRUFBZSxDQUFDLENBQUM7QUFDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGdldFRvcFdpbmRvdyxcbiAgbm9vcCxcbiAgTk9UX05PVElGWV9PTl9FUlJPUl9IRUFERVJTLFxuICBTdHJpbmdNYXAsXG59IGZyb20gJy4uL2NvcmUvcHVibGljLWFwaSc7XG5cbmltcG9ydCB7IGdldEluaXRVcmwsIHJlY29yZEluaXRVcmwgfSBmcm9tICcuL2FwcC1pbml0LXVybCc7XG5pbXBvcnQge1xuICBDQUxMQkFDS19BUEksXG4gIENPREVfS0VZLFxuICBTVEFURV9LRVksXG4gIEVYVEVSTkFMX1JFRElSRUNUX0FQSSxcbiAgSURfVE9LRU5fS0VZLFxuICBMT0dJTl9BUEksXG4gIExPR09VVF9BUEksXG4gIFJFRElSRUNUX1VSSVMsXG59IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIGNsZWFuU3RvcmFnZVRva2VuLFxuICByZWFkU3RvcmFnZVRva2VuLFxuICByZWZyZXNoU3RvcmFnZUFsaXZlUmVjb3JkLFxuICB3cml0ZVN0b3JhZ2VUb2tlbixcbn0gZnJvbSAnLi9zdG9yYWdlLXRva2VuJztcbmltcG9ydCB7XG4gIGZldGNoVG9rZW5BcGksXG4gIHJlcXVlc3RUb2tlbkluZm8sXG4gIHJlcXVlc3RUb2tlblJlZnJlc2gsXG59IGZyb20gJy4vdG9rZW4tY2xpZW50JztcbmltcG9ydCB0eXBlIHsgQWNjb3VudEluZm8sIFRva2VuUmVzcG9uc2UgfSBmcm9tICcuL3Rva2VuLWNsaWVudCc7XG5cbmxldCBBQ0NPVU5UX0lORk86IEFjY291bnRJbmZvO1xubGV0IGNoZWNrVG9rZW5Qcm9taXNlOiBQcm9taXNlPEFjY291bnRJbmZvPjtcbmxldCByZWZyZXNoVG9rZW5Qcm9taXNlOiBQcm9taXNlPFRva2VuUmVzcG9uc2U+O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FjaGVkQWNjb3VudEluZm8oKSB7XG4gIHJldHVybiBBQ0NPVU5UX0lORk87XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaEF1dGhvcml6YXRpb25TdGF0ZSgpIHtcbiAgcmVjb3JkSW5pdFVybCgpO1xuXG4gIGF3YWl0IGdldEV4aXN0aW5nVG9rZW4oKTtcblxuICBjb25zdCBpbmZvID0gYXdhaXQgcmVzb2x2ZVRva2VuSW5mb1dpdGhSZWZyZXNoKCk7XG5cbiAgaWYgKCFpbmZvKSB7XG4gICAgYXdhaXQgbG9nb3V0KHRydWUpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxuZXZlcj4oKCkgPT4gdW5kZWZpbmVkKTtcbiAgfVxuXG4gIHJldHVybiB7IGluZm8gfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaEF1dGhvcml6YXRpb25IZWFkZXIoKTogeyBBdXRob3JpemF0aW9uPzogc3RyaW5nIH0ge1xuICBjb25zdCBpZFRva2VuID0gcmVhZFN0b3JhZ2VUb2tlbigpO1xuICByZXR1cm4gaWRUb2tlbiA/IHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2lkVG9rZW59YCB9IDoge307XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja0F1dGhvcml6YXRpb25Ub2tlbigpOiBQcm9taXNlPEFjY291bnRJbmZvPiB7XG4gIGlmIChjaGVja1Rva2VuUHJvbWlzZSkge1xuICAgIHJldHVybiBjaGVja1Rva2VuUHJvbWlzZTtcbiAgfVxuXG4gIGNoZWNrVG9rZW5Qcm9taXNlID0gcmVxdWVzdFRva2VuSW5mbygpXG4gICAgLnRoZW4oaW5mbyA9PiB7XG4gICAgICBBQ0NPVU5UX0lORk8gPSBpbmZvO1xuXG4gICAgICBpZiAoIWluZm8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdXRob3JpemF0aW9uIHRva2VuIGlzIGludmFsaWQnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGluZm87XG4gICAgfSlcbiAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICBjaGVja1Rva2VuUHJvbWlzZSA9IG51bGw7XG4gICAgfSk7XG5cbiAgcmV0dXJuIGNoZWNrVG9rZW5Qcm9taXNlO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEF1dGhvcml6YXRpb25Ub2tlbigpOiBQcm9taXNlPFRva2VuUmVzcG9uc2U+IHtcbiAgaWYgKHJlZnJlc2hUb2tlblByb21pc2UpIHtcbiAgICByZXR1cm4gcmVmcmVzaFRva2VuUHJvbWlzZTtcbiAgfVxuXG4gIHJlZnJlc2hUb2tlblByb21pc2UgPSByZXF1ZXN0VG9rZW5SZWZyZXNoKClcbiAgICAudGhlbih0b2tlblJlc3BvbnNlID0+IHtcbiAgICAgIGlmICghdG9rZW5SZXNwb25zZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byByZWZyZXNoIHRva2VuJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0b2tlblJlc3BvbnNlO1xuICAgIH0pXG4gICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgcmVmcmVzaFRva2VuUHJvbWlzZSA9IG51bGw7XG4gICAgfSk7XG5cbiAgcmV0dXJuIHJlZnJlc2hUb2tlblByb21pc2U7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2dvdXRBdWRpdCgpOiBQcm9taXNlPHsgbG9nb3V0X3JlZGlyZWN0X3VybD86IHN0cmluZyB9PiB7XG4gIHJldHVybiBmZXRjaFRva2VuQXBpKExPR09VVF9BUEksIHtcbiAgICBoZWFkZXJzOiBOT1RfTk9USUZZX09OX0VSUk9SX0hFQURFUlMsXG4gIH0pXG4gICAgLnRoZW4ocmVzID0+IHJlcz8uanNvbigpKVxuICAgIC5jYXRjaCgoKSA9PiBudWxsKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvZ291dChcbiAgcmV0dXJuQ3VycmVudFBhZ2U6IGJvb2xlYW4gfCBzdHJpbmcgPSBmYWxzZSxcbik6IFByb21pc2U8bmV2ZXI+IHtcbiAgY2xlYW5TdG9yYWdlVG9rZW4oKTtcblxuICBsZXQgbG9nb3V0VXJsOiBzdHJpbmc7XG5cbiAgaWYgKHR5cGVvZiByZXR1cm5DdXJyZW50UGFnZSA9PT0gJ3N0cmluZycgJiYgcmV0dXJuQ3VycmVudFBhZ2UgIT09ICcnKSB7XG4gICAgbG9nb3V0VXJsID0gcmV0dXJuQ3VycmVudFBhZ2U7XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgYXV0aFVybCB9ID0gYXdhaXQgZ2V0QXV0aENvbmZpZ3VyYXRpb24oKTtcbiAgICAgIGxvZ291dFVybCA9IGRleExvZ291dFVybChhdXRoVXJsLCAhIXJldHVybkN1cnJlbnRQYWdlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGxvZ291dChyZXR1cm5DdXJyZW50UGFnZSk7XG4gICAgfVxuICB9XG5cbiAgdHJ5IHtcbiAgICBnZXRUb3BXaW5kb3coKS5sb2NhdGlvbi5ocmVmID0gbG9nb3V0VXJsO1xuICB9IGNhdGNoIHtcbiAgICBsb2NhdGlvbi5ocmVmID0gbG9nb3V0VXJsO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlPG5ldmVyPihub29wKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZGlyZWN0U1NPRW50cnkoZW50cnk6IHN0cmluZykge1xuICBjb25zdCBoYXNRdWVyeSA9IGVudHJ5LmluY2x1ZGVzKCc/Jyk7XG5cbiAgaWYgKGhhc1F1ZXJ5KSB7XG4gICAgY29uc3QgW3VybCwgcXVlcnldID0gZW50cnkuc3BsaXQoJz8nKTtcbiAgICByZXR1cm4gYCR7RVhURVJOQUxfUkVESVJFQ1RfQVBJfT9yZWRpcmVjdF91cmw9JHt1cmx9JiR7cXVlcnl9YDtcbiAgfVxuXG4gIHJldHVybiBgJHtFWFRFUk5BTF9SRURJUkVDVF9BUEl9P3JlZGlyZWN0X3VybD0ke2VudHJ5fWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVUb2tlbkluZm9XaXRoUmVmcmVzaCgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBpbmZvID0gYXdhaXQgcmVxdWVzdFRva2VuSW5mbygpO1xuICAgIEFDQ09VTlRfSU5GTyA9IGluZm87XG5cbiAgICBpZiAoaW5mbykge1xuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgY29uc3QgcmVmcmVzaGVkID0gYXdhaXQgcmVxdWVzdFRva2VuUmVmcmVzaCgpO1xuXG4gICAgaWYgKCFyZWZyZXNoZWQpIHtcbiAgICAgIEFDQ09VTlRfSU5GTyA9IG51bGw7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdJbmZvID0gYXdhaXQgcmVxdWVzdFRva2VuSW5mbygpO1xuICAgIEFDQ09VTlRfSU5GTyA9IG5ld0luZm87XG4gICAgcmV0dXJuIG5ld0luZm87XG4gIH0gY2F0Y2gge1xuICAgIEFDQ09VTlRfSU5GTyA9IG51bGw7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGV4TG9nb3V0VXJsKGF1dGhVcmw6IHN0cmluZywgcmV0dXJuQ3VycmVudFBhZ2UgPSBmYWxzZSkge1xuICByZXR1cm4gcmVwbGFjZVJlZGlyZWN0VXJsKFxuICAgIGF1dGhVcmwsXG4gICAgcmV0dXJuQ3VycmVudFBhZ2UgPyBsb2NhdGlvbi5ocmVmIDogbG9jYXRpb24ub3JpZ2luICsgJy9jb25zb2xlLXBvcnRhbCcsXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VSZWRpcmVjdFVybChkZXhVcmw6IHN0cmluZywgcmVkaXJlY3RVcmw6IHN0cmluZykge1xuICBjb25zdCBbcGF0aCwgcXVlcnlQYXJhbXNdID0gZGV4VXJsLnNwbGl0KCc/Jyk7XG5cbiAgY29uc3QgcmVwbGFjZWRRdWVyeVBhcmFtcyA9IHF1ZXJ5UGFyYW1zXG4gICAgLnNwbGl0KCcmJylcbiAgICAubWFwKHBhaXIgPT4ge1xuICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gcGFpci5zcGxpdCgnPScpO1xuICAgICAgcmV0dXJuIFJFRElSRUNUX1VSSVMuaGFzKGtleSlcbiAgICAgICAgPyBgJHtrZXl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHJlZGlyZWN0VXJsKX1gXG4gICAgICAgIDogYCR7a2V5fT0ke3ZhbHVlfWA7XG4gICAgfSlcbiAgICAuam9pbignJicpO1xuXG4gIHJldHVybiBgJHtwYXRofT8ke3JlcGxhY2VkUXVlcnlQYXJhbXN9YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXV0aENvbmZpZ3VyYXRpb24oKTogUHJvbWlzZTx7XG4gIGF1dGhVcmw6IHN0cmluZztcbn0+IHtcbiAgY29uc3QgeyBhdXRoX3VybDogYXV0aFVybCB9ID0gYXdhaXQgZmV0Y2goTE9HSU5fQVBJKS50aGVuKHJlcyA9PiByZXMuanNvbigpKTtcbiAgcmV0dXJuIHsgYXV0aFVybCB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRFeGlzdGluZ1Rva2VuKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHF1ZXJ5UGFyYW1zLCBoYXNoUGFyYW1zIH0gPSBnZXRQYXJhbXMoKTtcblxuICBjb25zdCBjb2RlID0gcXVlcnlQYXJhbXNbQ09ERV9LRVldIHx8IGhhc2hQYXJhbXNbQ09ERV9LRVldO1xuICBjb25zdCBzdGF0ZSA9IHF1ZXJ5UGFyYW1zW1NUQVRFX0tFWV0gfHwgaGFzaFBhcmFtc1tTVEFURV9LRVldO1xuICBjb25zdCBpZFRva2VuID0gcXVlcnlQYXJhbXNbSURfVE9LRU5fS0VZXSB8fCBoYXNoUGFyYW1zW0lEX1RPS0VOX0tFWV07XG5cbiAgaWYgKCFjb2RlICYmICFpZFRva2VuKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmVmcmVzaFN0b3JhZ2VBbGl2ZVJlY29yZCgpO1xuXG4gIGlmIChjb2RlKSB7XG4gICAgYXdhaXQgc2V0Q29va2llQnlDb2RlKGNvZGUsIHN0YXRlKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBzZXRDb29raWVCeVRva2VuKGlkVG9rZW4pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldENvb2tpZUJ5Q29kZShjb2RlOiBzdHJpbmcsIHN0YXRlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcXVlcnlQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgY29kZSwgc3RhdGUgfSk7XG5cbiAgY29uc3QgdG9rZW5SZXNwb25zZTogVG9rZW5SZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgIGAke0NBTExCQUNLX0FQSX0/JHtxdWVyeVBhcmFtcy50b1N0cmluZygpfWAsXG4gICkudGhlbihyZXMgPT4gcmVzLmpzb24oKSk7XG5cbiAgd3JpdGVTdG9yYWdlVG9rZW4odG9rZW5SZXNwb25zZT8uaWRfdG9rZW4pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXRDb29raWVCeVRva2VuKGlkVG9rZW46IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBxdWVyeVBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyBpZF90b2tlbjogaWRUb2tlbiB9KTtcblxuICBjb25zdCB0b2tlblJlc3BvbnNlOiBUb2tlblJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgYCR7Q0FMTEJBQ0tfQVBJfT8ke3F1ZXJ5UGFyYW1zLnRvU3RyaW5nKCl9YCxcbiAgKS50aGVuKHJlcyA9PiByZXMuanNvbigpKTtcblxuICB3cml0ZVN0b3JhZ2VUb2tlbih0b2tlblJlc3BvbnNlPy5pZF90b2tlbik7XG59XG5cbmZ1bmN0aW9uIGdldFBhcmFtcygpIHtcbiAgY29uc3QgaW5pdFVybCA9IGdldEluaXRVcmwoKTtcblxuICBjb25zdCBpbml0TG9jYXRpb24gPSBuZXcgVVJMKGluaXRVcmwpO1xuXG4gIGNvbnN0IHF1ZXJ5UGFyYW1zID0gcGFyc2VQYXJhbXMoXG4gICAgaW5pdExvY2F0aW9uLnNlYXJjaCA/IGluaXRMb2NhdGlvbi5zZWFyY2guc2xpY2UoMSkgOiAnJyxcbiAgKTtcblxuICBjb25zdCBoYXNoUGFyYW1zID0gcGFyc2VQYXJhbXMoXG4gICAgaW5pdExvY2F0aW9uLmhhc2ggPyBpbml0TG9jYXRpb24uaGFzaC5zbGljZSgxKSA6ICcnLFxuICApO1xuXG4gIHJldHVybiB7IHF1ZXJ5UGFyYW1zLCBoYXNoUGFyYW1zIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlUGFyYW1zKHF1ZXJ5OiBzdHJpbmcpOiBTdHJpbmdNYXAge1xuICBpZiAoIXF1ZXJ5KSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcmV0dXJuIHF1ZXJ5LnNwbGl0KCcmJykucmVkdWNlKChhY2MsIHBhcmFtKSA9PiB7XG4gICAgaWYgKCFwYXJhbSkge1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9XG5cbiAgICBjb25zdCBzZXBhcmF0b3JJbmRleCA9IHBhcmFtLmluZGV4T2YoJz0nKTtcbiAgICBjb25zdCBrZXkgPSBzZXBhcmF0b3JJbmRleCA9PT0gLTEgPyBwYXJhbSA6IHBhcmFtLnNsaWNlKDAsIHNlcGFyYXRvckluZGV4KTtcbiAgICBjb25zdCB2YWx1ZSA9IHNlcGFyYXRvckluZGV4ID09PSAtMSA/ICcnIDogcGFyYW0uc2xpY2Uoc2VwYXJhdG9ySW5kZXggKyAxKTtcblxuICAgIGlmICgha2V5KSB7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH1cblxuICAgIGFjY1trZXldID0gdmFsdWU7XG5cbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSBhcyBTdHJpbmdNYXApO1xufVxuIl19