gologin 2.1.12 → 2.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/gologin.js +35 -5
- package/.sentry-native/15e25388-76f1-4a90-cea4-9a33e95e5be5.run/af276dd3-14b9-4b32-df19-69cb16a9a85e.envelope +0 -5
- package/.sentry-native/15e25388-76f1-4a90-cea4-9a33e95e5be5.run.lock +0 -0
- package/.sentry-native/last_crash +0 -1
- package/gologin/.eslintrc.json +0 -290
- package/gologin/README.md +0 -163
- package/gologin/example.js +0 -36
- package/gologin/examples/example-amazon-cloud-browser.js +0 -37
- package/gologin/examples/example-amazon-headless.js +0 -50
- package/gologin/examples/example-amazon.js +0 -47
- package/gologin/examples/example-create-custom-profile.js +0 -39
- package/gologin/examples/example-create-profile.js +0 -40
- package/gologin/examples/example-custom-args.js +0 -34
- package/gologin/examples/example-fast-profile-settings.js +0 -69
- package/gologin/examples/example-gmail.js +0 -67
- package/gologin/examples/example-iphey.js +0 -17
- package/gologin/examples/example-local-profile.js +0 -26
- package/gologin/examples/example-login-walmart.js +0 -35
- package/gologin/examples/example-stopremote.js +0 -20
- package/gologin/examples/example-timezone.js +0 -44
- package/gologin/fonts.js +0 -4293
- package/gologin/fonts_config +0 -104
- package/gologin/gologin-browser-ext.zip +0 -0
- package/gologin/gologin_zeroprofile.b64 +0 -1
- package/gologin/index.d.ts +0 -61
- package/gologin/package.json +0 -49
- package/gologin/profile_export_example.csv +0 -2
- package/gologin/run.sh +0 -1
- package/gologin/src/bookmarks/utils.js +0 -15
- package/gologin/src/browser/browser-api.js +0 -95
- package/gologin/src/browser/browser-checker.js +0 -392
- package/gologin/src/browser/browser-user-data-manager.js +0 -335
- package/gologin/src/cookies/cookies-manager.js +0 -189
- package/gologin/src/extensions/extensions-extractor.js +0 -56
- package/gologin/src/extensions/extensions-manager.js +0 -384
- package/gologin/src/extensions/user-extensions-manager.js +0 -295
- package/gologin/src/gologin-api.js +0 -110
- package/gologin/src/gologin.js +0 -1472
- package/gologin/src/profile/profile-archiver.js +0 -86
- package/gologin/src/profile/profile-directories-to-remove.js +0 -75
- package/gologin/src/utils/browser.js +0 -62
- package/gologin/src/utils/common.js +0 -76
- package/gologin/src/utils/constants.js +0 -1
- package/gologin/src/utils/utils.js +0 -49
- package/gologin/zero_profile.zip +0 -0
- package/gologin-canvas.zip +0 -0
- package/gologin.zip +0 -0
- package/test.html +0 -1
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import AdmZip from 'adm-zip';
|
|
2
|
-
import { promises as _promises } from 'fs';
|
|
3
|
-
import path from 'path';
|
|
4
|
-
|
|
5
|
-
import { getDirectoriesForArchiver } from './profile-directories-to-remove.js';
|
|
6
|
-
|
|
7
|
-
const { access } = _promises;
|
|
8
|
-
|
|
9
|
-
export const archiveProfile = async (profileFolder = '', tryAgain = true) => {
|
|
10
|
-
const folderExists = await access(profileFolder).then(() => true, () => false);
|
|
11
|
-
if (!folderExists) {
|
|
12
|
-
throw new Error('Invalid profile folder path: ' + profileFolder);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
const archive = new AdmZip();
|
|
16
|
-
archive.addLocalFolder(path.join(profileFolder, 'Default'), 'Default');
|
|
17
|
-
try {
|
|
18
|
-
archive.addLocalFile(path.join(profileFolder, 'First Run'));
|
|
19
|
-
} catch(e) {
|
|
20
|
-
archive.addFile('First Run', Buffer.from(''));
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const dirsToRemove = getDirectoriesForArchiver();
|
|
24
|
-
dirsToRemove.forEach(entry => archive.deleteFile(entry));
|
|
25
|
-
|
|
26
|
-
const archiveIsValid = checkProfileArchiveIsValid(archive);
|
|
27
|
-
if (tryAgain && !archiveIsValid) {
|
|
28
|
-
await new Promise(r => setTimeout(() => r(), 300));
|
|
29
|
-
|
|
30
|
-
return archiveProfile(profileFolder, false);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
return new Promise((resolve, reject) => archive.toBuffer(resolve, reject));
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
export const decompressProfile = async (zipPath = '', profileFolder = '') => {
|
|
37
|
-
const zipExists = await access(zipPath).then(() => true, () => false);
|
|
38
|
-
if (!zipExists) {
|
|
39
|
-
throw new Error('Invalid zip path: ' + zipPath);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const archive = new AdmZip(zipPath);
|
|
43
|
-
archive
|
|
44
|
-
.getEntries()
|
|
45
|
-
.forEach((elem) => {
|
|
46
|
-
if (
|
|
47
|
-
!elem.isDirectory &&
|
|
48
|
-
(
|
|
49
|
-
elem.entryName.includes('RunningChromeVersion') ||
|
|
50
|
-
elem.entryName.includes('SingletonLock') ||
|
|
51
|
-
elem.entryName.includes('SingletonSocket') ||
|
|
52
|
-
elem.entryName.includes('SingletonCookie')
|
|
53
|
-
)
|
|
54
|
-
) {
|
|
55
|
-
archive.deleteFile(elem);
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
archive.extractAllTo(profileFolder, true);
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
export const checkProfileArchiveIsValid = (zipObject) => {
|
|
63
|
-
if (!zipObject) {
|
|
64
|
-
throw new Error('No zip object provided');
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
return zipObject
|
|
68
|
-
.getEntries()
|
|
69
|
-
.map(elem => {
|
|
70
|
-
if (elem.isDirectory) {
|
|
71
|
-
return false;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
return elem.entryName.includes('Preferences') || elem.entryName.includes('Cookies');
|
|
75
|
-
})
|
|
76
|
-
.filter(Boolean)
|
|
77
|
-
.length >= 2;
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
const flatArray = (array = []) => array.map((elem) => {
|
|
81
|
-
if (Array.isArray(elem)) {
|
|
82
|
-
return flatArray(elem).flat();
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
return elem;
|
|
86
|
-
}).flat().filter(Boolean);
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
const DEFAULT_FOLDER_USELESS_FILE = [
|
|
2
|
-
{
|
|
3
|
-
name: 'Cache',
|
|
4
|
-
subs: [],
|
|
5
|
-
isDirectory: true,
|
|
6
|
-
},
|
|
7
|
-
{
|
|
8
|
-
name: 'fonts_config',
|
|
9
|
-
subs: [],
|
|
10
|
-
isDirectory: false,
|
|
11
|
-
},
|
|
12
|
-
{
|
|
13
|
-
name: 'Service Worker',
|
|
14
|
-
subs: [],
|
|
15
|
-
isDirectory: true,
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
name: 'Code Cache',
|
|
19
|
-
subs: [],
|
|
20
|
-
isDirectory: true,
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
name: 'Extensions',
|
|
24
|
-
subs: [],
|
|
25
|
-
isDirectory: true,
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
name: 'IndexedDB',
|
|
29
|
-
subs: [],
|
|
30
|
-
isDirectory: true,
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
name: 'fonts_config',
|
|
34
|
-
subs: [],
|
|
35
|
-
isDirectory: true,
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
name: 'DawnCache',
|
|
39
|
-
subs: [],
|
|
40
|
-
isDirectory: true,
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
name: 'GPUCache',
|
|
44
|
-
subs: [],
|
|
45
|
-
isDirectory: true,
|
|
46
|
-
},
|
|
47
|
-
];
|
|
48
|
-
|
|
49
|
-
export const getDirectoriesToDeleteForNode = (routerSlash = '/') =>
|
|
50
|
-
DEFAULT_FOLDER_USELESS_FILE.reduce((res, el) => {
|
|
51
|
-
const basePath = routerSlash + 'Default' + routerSlash + el.name;
|
|
52
|
-
if (el.subs.length) {
|
|
53
|
-
el.subs.forEach(sub => res.push(basePath + routerSlash + sub));
|
|
54
|
-
} else {
|
|
55
|
-
res.push(basePath);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
return res;
|
|
59
|
-
}, []);
|
|
60
|
-
|
|
61
|
-
export const getDirectoriesForArchiver = () => DEFAULT_FOLDER_USELESS_FILE.reduce((res, el) => {
|
|
62
|
-
const { name, subs, isDirectory } = el;
|
|
63
|
-
const basePath = 'Default/' + name;
|
|
64
|
-
|
|
65
|
-
if (subs.length) {
|
|
66
|
-
subs.forEach((sub) => {
|
|
67
|
-
const resPath = basePath + '/' + (isDirectory ? sub + '/' : sub);
|
|
68
|
-
res.push(resPath);
|
|
69
|
-
});
|
|
70
|
-
} else {
|
|
71
|
-
res.push(basePath + (isDirectory ? '/' : ''));
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
return res;
|
|
75
|
-
}, []);
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
export const checkAutoLang = (profileData, timezoneCheckResult) => {
|
|
2
|
-
if (!profileData.autoLang) {
|
|
3
|
-
return checkBrowserLang(profileData);
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
let timezoneLang = '';
|
|
7
|
-
const { country: timezoneCountry = '', languages } = timezoneCheckResult || {};
|
|
8
|
-
if (languages) {
|
|
9
|
-
const [firstDetectedLangLocale] = languages.split(',');
|
|
10
|
-
timezoneLang = `${firstDetectedLangLocale}-${timezoneCountry}` || '';
|
|
11
|
-
|
|
12
|
-
let resultLangsArr = [];
|
|
13
|
-
const [lang = '', country = ''] = timezoneLang.split('-');
|
|
14
|
-
if (country) {
|
|
15
|
-
resultLangsArr.push([lang, country].join('-'));
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
resultLangsArr.push(lang, 'en-US', 'en');
|
|
19
|
-
resultLangsArr = [...new Set(resultLangsArr)];
|
|
20
|
-
|
|
21
|
-
const gologinLangsArr = [];
|
|
22
|
-
const result = resultLangsArr.reduce((acc, cur, index) => {
|
|
23
|
-
if (!index) {
|
|
24
|
-
acc += `${cur},`;
|
|
25
|
-
gologinLangsArr.push(cur);
|
|
26
|
-
|
|
27
|
-
return acc;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const qualityParam = 10-index;
|
|
31
|
-
if (qualityParam > 0) {
|
|
32
|
-
const separator = (resultLangsArr.length - index) < 2 ? '' : ',';
|
|
33
|
-
gologinLangsArr.push(cur);
|
|
34
|
-
acc += `${cur};q=${Number(qualityParam * 0.1).toFixed(1)}${separator}`;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
return acc;
|
|
38
|
-
}, '');
|
|
39
|
-
|
|
40
|
-
[profileData.browserLang] = resultLangsArr;
|
|
41
|
-
profileData.languages = gologinLangsArr.join(',');
|
|
42
|
-
profileData.langHeader = result;
|
|
43
|
-
profileData.navigator.language = result;
|
|
44
|
-
|
|
45
|
-
return profileData.browserLang;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
return checkBrowserLang(profileData);
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
const checkBrowserLang = (profileData, defaultLocale = 'en-US') => {
|
|
52
|
-
if (profileData.langHeader) {
|
|
53
|
-
return profileData.browserLang;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
profileData.browserLang = defaultLocale;
|
|
57
|
-
profileData.languages = defaultLocale;
|
|
58
|
-
profileData.langHeader = defaultLocale;
|
|
59
|
-
profileData.navigator.language = defaultLocale;
|
|
60
|
-
|
|
61
|
-
return defaultLocale;
|
|
62
|
-
};
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import { exec } from 'child_process';
|
|
2
|
-
import { homedir } from 'os';
|
|
3
|
-
import { join, sep } from 'path';
|
|
4
|
-
import { promisify } from 'util';
|
|
5
|
-
|
|
6
|
-
import { deleteExtensionArchive, extractExtension } from '../extensions/extensions-extractor.js';
|
|
7
|
-
|
|
8
|
-
export const API_URL = 'https://api.gologin.com';
|
|
9
|
-
|
|
10
|
-
const HOMEDIR = homedir();
|
|
11
|
-
const CHROME_EXT_DIR_NAME = 'chrome-extensions';
|
|
12
|
-
const EXTENSIONS_PATH = join(HOMEDIR, '.gologin', 'extensions');
|
|
13
|
-
const CHROME_EXTENSIONS_PATH = join(EXTENSIONS_PATH, CHROME_EXT_DIR_NAME);
|
|
14
|
-
const USER_EXTENSIONS_PATH = join(HOMEDIR, '.gologin', 'extensions', 'user-extensions');
|
|
15
|
-
|
|
16
|
-
const composeExtractionPromises = (filteredArchives, destPath = CHROME_EXTENSIONS_PATH) => (
|
|
17
|
-
filteredArchives.map((extArchivePath) => {
|
|
18
|
-
const [archiveName = ''] = extArchivePath.split(sep).reverse();
|
|
19
|
-
const [destFolder] = archiveName.split('.');
|
|
20
|
-
|
|
21
|
-
return extractExtension(extArchivePath, join(destPath, destFolder))
|
|
22
|
-
.then(() => deleteExtensionArchive(extArchivePath));
|
|
23
|
-
})
|
|
24
|
-
);
|
|
25
|
-
|
|
26
|
-
const getMacArmSpec = async () => {
|
|
27
|
-
const doExec = promisify(exec);
|
|
28
|
-
|
|
29
|
-
const { stdout } = await doExec('sysctl machdep.cpu');
|
|
30
|
-
const regExp = /Apple M\d/;
|
|
31
|
-
const [match] = stdout.match(regExp);
|
|
32
|
-
const [_, armVersion] = match.split(' ');
|
|
33
|
-
|
|
34
|
-
return armVersion;
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
const getOsAdvanced = async () => {
|
|
38
|
-
const os = getOS();
|
|
39
|
-
if (!['mac', 'macM1'].includes(os)) {
|
|
40
|
-
return { os, osSpec: '' };
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const osSpec = await getMacArmSpec();
|
|
44
|
-
|
|
45
|
-
return {
|
|
46
|
-
os: 'mac',
|
|
47
|
-
osSpec,
|
|
48
|
-
};
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
const getOS = () => {
|
|
52
|
-
if (process.platform === 'win32') {
|
|
53
|
-
return 'win';
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
if (process.platform === 'darwin') {
|
|
57
|
-
return process.arch === 'arm64' ? 'macM1' : 'mac';
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return 'lin';
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
const _composeExtractionPromises = composeExtractionPromises;
|
|
64
|
-
export { _composeExtractionPromises as composeExtractionPromises };
|
|
65
|
-
|
|
66
|
-
const _getOS = getOS;
|
|
67
|
-
export { _getOS as getOS };
|
|
68
|
-
|
|
69
|
-
const _getOsAdvanced = getOsAdvanced;
|
|
70
|
-
export { _getOsAdvanced as getOsAdvanced };
|
|
71
|
-
|
|
72
|
-
const _USER_EXTENSIONS_PATH = USER_EXTENSIONS_PATH;
|
|
73
|
-
export { _USER_EXTENSIONS_PATH as USER_EXTENSIONS_PATH };
|
|
74
|
-
|
|
75
|
-
const _CHROME_EXTENSIONS_PATH = CHROME_EXTENSIONS_PATH;
|
|
76
|
-
export { _CHROME_EXTENSIONS_PATH as CHROME_EXTENSIONS_PATH };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export const STORAGE_GATEWAY_BASE_URL = 'https://files-gateway.gologin.com';
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { readdirSync, statSync } from 'node:fs';
|
|
2
|
-
import net from 'node:net';
|
|
3
|
-
import { join } from 'node:path';
|
|
4
|
-
|
|
5
|
-
export const get = (value, path, defaultValue) =>
|
|
6
|
-
String(path).split('.').reduce((acc, val) => {
|
|
7
|
-
try {
|
|
8
|
-
acc = acc[val] ? acc[val] : defaultValue;
|
|
9
|
-
} catch (e) {
|
|
10
|
-
return defaultValue;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
return acc;
|
|
14
|
-
}, value);
|
|
15
|
-
|
|
16
|
-
export const isPortReachable = (port) => new Promise(resolve => {
|
|
17
|
-
const checker = net.createServer()
|
|
18
|
-
.once('error', () => {
|
|
19
|
-
resolve(false);
|
|
20
|
-
})
|
|
21
|
-
.once('listening', () => checker.once('close', () => resolve(true)).close())
|
|
22
|
-
.listen(port);
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
export const findLatestBrowserVersionDirectory = (browserPath) => {
|
|
26
|
-
const folderContents = readdirSync(browserPath);
|
|
27
|
-
const directories = folderContents.filter(file => statSync(join(browserPath, file)).isDirectory());
|
|
28
|
-
|
|
29
|
-
const { folderName, version } = directories.reduce((newest, currentFolderName) => {
|
|
30
|
-
const match = currentFolderName.match(/\d+/);
|
|
31
|
-
|
|
32
|
-
if (match) {
|
|
33
|
-
const findedVersion = parseInt(match[0], 10);
|
|
34
|
-
|
|
35
|
-
if (findedVersion > newest.version) {
|
|
36
|
-
return { folderName: currentFolderName, version: findedVersion };
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
return newest;
|
|
41
|
-
}, { folderName: '', version: 0 });
|
|
42
|
-
|
|
43
|
-
if (!version) {
|
|
44
|
-
return 'error';
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
return folderName;
|
|
48
|
-
};
|
|
49
|
-
|
package/gologin/zero_profile.zip
DELETED
|
Binary file
|
package/gologin-canvas.zip
DELETED
|
Binary file
|
package/gologin.zip
DELETED
|
Binary file
|
package/test.html
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en-US"><head><title>Just a moment...</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=Edge"><meta name="robots" content="noindex,nofollow"><meta name="viewport" content="width=device-width,initial-scale=1"><style>*{box-sizing:border-box;margin:0;padding:0}html{line-height:1.15;-webkit-text-size-adjust:100%;color:#313131}button,html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}@media (prefers-color-scheme:dark){body{background-color:#222;color:#d9d9d9}body a{color:#fff}body a:hover{color:#ee730a;text-decoration:underline}body .lds-ring div{border-color:#999 transparent transparent}body .font-red{color:#b20f03}body .pow-button{background-color:#4693ff;color:#1d1d1d}body #challenge-success-text{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0ibm9uZSIgdmlld0JveD0iMCAwIDI2IDI2Ij48cGF0aCBmaWxsPSIjZDlkOWQ5IiBkPSJNMTMgMGExMyAxMyAwIDEgMCAwIDI2IDEzIDEzIDAgMCAwIDAtMjZtMCAyNGExMSAxMSAwIDEgMSAwLTIyIDExIDExIDAgMCAxIDAgMjIiLz48cGF0aCBmaWxsPSIjZDlkOWQ5IiBkPSJtMTAuOTU1IDE2LjA1NS0zLjk1LTQuMTI1LTEuNDQ1IDEuMzg1IDUuMzcgNS42MSA5LjQ5NS05LjYtMS40Mi0xLjQwNXoiLz48L3N2Zz4=)}body #challenge-error-text{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI0IyMEYwMyIgZD0iTTE2IDNhMTMgMTMgMCAxIDAgMTMgMTNBMTMuMDE1IDEzLjAxNSAwIDAgMCAxNiAzbTAgMjRhMTEgMTEgMCAxIDEgMTEtMTEgMTEuMDEgMTEuMDEgMCAwIDEtMTEgMTEiLz48cGF0aCBmaWxsPSIjQjIwRjAzIiBkPSJNMTcuMDM4IDE4LjYxNUgxNC44N0wxNC41NjMgOS41aDIuNzgzem0tMS4wODQgMS40MjdxLjY2IDAgMS4wNTcuMzg4LjQwNy4zODkuNDA3Ljk5NCAwIC41OTYtLjQwNy45ODQtLjM5Ny4zOS0xLjA1Ny4zODktLjY1IDAtMS4wNTYtLjM4OS0uMzk4LS4zODktLjM5OC0uOTg0IDAtLjU5Ny4zOTgtLjk4NS40MDYtLjM5NyAxLjA1Ni0uMzk3Ii8+PC9zdmc+)}}body{display:flex;flex-direction:column;min-height:100vh}body.no-js .loading-spinner{visibility:hidden}body.no-js .challenge-running{display:none}body.dark{background-color:#222;color:#d9d9d9}body.dark a{color:#fff}body.dark a:hover{color:#ee730a;text-decoration:underline}body.dark .lds-ring div{border-color:#999 transparent transparent}body.dark .font-red{color:#b20f03}body.dark .pow-button{background-color:#4693ff;color:#1d1d1d}body.dark #challenge-success-text{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0ibm9uZSIgdmlld0JveD0iMCAwIDI2IDI2Ij48cGF0aCBmaWxsPSIjZDlkOWQ5IiBkPSJNMTMgMGExMyAxMyAwIDEgMCAwIDI2IDEzIDEzIDAgMCAwIDAtMjZtMCAyNGExMSAxMSAwIDEgMSAwLTIyIDExIDExIDAgMCAxIDAgMjIiLz48cGF0aCBmaWxsPSIjZDlkOWQ5IiBkPSJtMTAuOTU1IDE2LjA1NS0zLjk1LTQuMTI1LTEuNDQ1IDEuMzg1IDUuMzcgNS42MSA5LjQ5NS05LjYtMS40Mi0xLjQwNXoiLz48L3N2Zz4=)}body.dark #challenge-error-text{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI0IyMEYwMyIgZD0iTTE2IDNhMTMgMTMgMCAxIDAgMTMgMTNBMTMuMDE1IDEzLjAxNSAwIDAgMCAxNiAzbTAgMjRhMTEgMTEgMCAxIDEgMTEtMTEgMTEuMDEgMTEuMDEgMCAwIDEtMTEgMTEiLz48cGF0aCBmaWxsPSIjQjIwRjAzIiBkPSJNMTcuMDM4IDE4LjYxNUgxNC44N0wxNC41NjMgOS41aDIuNzgzem0tMS4wODQgMS40MjdxLjY2IDAgMS4wNTcuMzg4LjQwNy4zODkuNDA3Ljk5NCAwIC41OTYtLjQwNy45ODQtLjM5Ny4zOS0xLjA1Ny4zODktLjY1IDAtMS4wNTYtLjM4OS0uMzk4LS4zODktLjM5OC0uOTg0IDAtLjU5Ny4zOTgtLjk4NS40MDYtLjM5NyAxLjA1Ni0uMzk3Ii8+PC9zdmc+)}body.light{background-color:transparent;color:#313131}body.light a{color:#0051c3}body.light a:hover{color:#ee730a;text-decoration:underline}body.light .lds-ring div{border-color:#595959 transparent transparent}body.light .font-red{color:#fc574a}body.light .pow-button{background-color:#003681;border-color:#003681;color:#fff}body.light #challenge-success-text{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0ibm9uZSIgdmlld0JveD0iMCAwIDI2IDI2Ij48cGF0aCBmaWxsPSIjMzEzMTMxIiBkPSJNMTMgMGExMyAxMyAwIDEgMCAwIDI2IDEzIDEzIDAgMCAwIDAtMjZtMCAyNGExMSAxMSAwIDEgMSAwLTIyIDExIDExIDAgMCAxIDAgMjIiLz48cGF0aCBmaWxsPSIjMzEzMTMxIiBkPSJtMTAuOTU1IDE2LjA1NS0zLjk1LTQuMTI1LTEuNDQ1IDEuMzg1IDUuMzcgNS42MSA5LjQ5NS05LjYtMS40Mi0xLjQwNXoiLz48L3N2Zz4=)}body.light #challenge-error-text{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZjNTc0YSIgZD0iTTE2IDNhMTMgMTMgMCAxIDAgMTMgMTNBMTMuMDE1IDEzLjAxNSAwIDAgMCAxNiAzbTAgMjRhMTEgMTEgMCAxIDEgMTEtMTEgMTEuMDEgMTEuMDEgMCAwIDEtMTEgMTEiLz48cGF0aCBmaWxsPSIjZmM1NzRhIiBkPSJNMTcuMDM4IDE4LjYxNUgxNC44N0wxNC41NjMgOS41aDIuNzgzem0tMS4wODQgMS40MjdxLjY2IDAgMS4wNTcuMzg4LjQwNy4zODkuNDA3Ljk5NCAwIC41OTYtLjQwNy45ODQtLjM5Ny4zOS0xLjA1Ny4zODktLjY1IDAtMS4wNTYtLjM4OS0uMzk4LS4zODktLjM5OC0uOTg0IDAtLjU5Ny4zOTgtLjk4NS40MDYtLjM5NyAxLjA1Ni0uMzk3Ii8+PC9zdmc+)}a{background-color:transparent;color:#0051c3;text-decoration:none;transition:color .15s ease}a:hover{color:#ee730a;text-decoration:underline}.main-content{margin:8rem auto;max-width:60rem;width:100%}.heading-favicon{height:2rem;margin-right:.5rem;width:2rem}@media (width <= 720px){.main-content{margin-top:4rem}.heading-favicon{height:1.5rem;width:1.5rem}}.footer,.main-content{padding-left:1.5rem;padding-right:1.5rem}.main-wrapper{align-items:center;display:flex;flex:1;flex-direction:column}.font-red{color:#b20f03}.spacer{margin:2rem 0}.h1{font-size:2.5rem;font-weight:500;line-height:3.75rem}.h2{font-weight:500}.core-msg,.h2{font-size:1.5rem;line-height:2.25rem}.body-text,.core-msg{font-weight:400}.body-text{font-size:1rem;line-height:1.25rem}@media (width <= 720px){.h1{font-size:1.5rem;line-height:1.75rem}.h2{font-size:1.25rem}.core-msg,.h2{line-height:1.5rem}.core-msg{font-size:1rem}}#challenge-error-text{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZjNTc0YSIgZD0iTTE2IDNhMTMgMTMgMCAxIDAgMTMgMTNBMTMuMDE1IDEzLjAxNSAwIDAgMCAxNiAzbTAgMjRhMTEgMTEgMCAxIDEgMTEtMTEgMTEuMDEgMTEuMDEgMCAwIDEtMTEgMTEiLz48cGF0aCBmaWxsPSIjZmM1NzRhIiBkPSJNMTcuMDM4IDE4LjYxNUgxNC44N0wxNC41NjMgOS41aDIuNzgzem0tMS4wODQgMS40MjdxLjY2IDAgMS4wNTcuMzg4LjQwNy4zODkuNDA3Ljk5NCAwIC41OTYtLjQwNy45ODQtLjM5Ny4zOS0xLjA1Ny4zODktLjY1IDAtMS4wNTYtLjM4OS0uMzk4LS4zODktLjM5OC0uOTg0IDAtLjU5Ny4zOTgtLjk4NS40MDYtLjM5NyAxLjA1Ni0uMzk3Ii8+PC9zdmc+);padding-left:34px}#challenge-error-text,#challenge-success-text{background-repeat:no-repeat;background-size:contain}#challenge-success-text{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0ibm9uZSIgdmlld0JveD0iMCAwIDI2IDI2Ij48cGF0aCBmaWxsPSIjMzEzMTMxIiBkPSJNMTMgMGExMyAxMyAwIDEgMCAwIDI2IDEzIDEzIDAgMCAwIDAtMjZtMCAyNGExMSAxMSAwIDEgMSAwLTIyIDExIDExIDAgMCAxIDAgMjIiLz48cGF0aCBmaWxsPSIjMzEzMTMxIiBkPSJtMTAuOTU1IDE2LjA1NS0zLjk1LTQuMTI1LTEuNDQ1IDEuMzg1IDUuMzcgNS42MSA5LjQ5NS05LjYtMS40Mi0xLjQwNXoiLz48L3N2Zz4=);padding-left:42px}.text-center{text-align:center}.pow-button{background-color:#0051c3;border:.063rem solid #0051c3;border-radius:.313rem;color:#fff;font-size:.875rem;line-height:1.313rem;margin:2rem 0;padding:.375rem 1rem;transition-duration:.2s;transition-property:background-color,border-color,color;transition-timing-function:ease}.pow-button:hover{background-color:#003681;border-color:#003681;color:#fff;cursor:pointer}.footer{font-size:.75rem;line-height:1.125rem;margin:0 auto;max-width:60rem;width:100%}.footer-inner{border-top:1px solid #d9d9d9;padding-bottom:1rem;padding-top:1rem}.clearfix:after{clear:both;content:"";display:table}.clearfix .column{float:left;padding-right:1.5rem;width:50%}.diagnostic-wrapper{margin-bottom:.5rem}.footer .ray-id{text-align:center}.footer .ray-id code{font-family:monaco,courier,monospace}.core-msg,.zone-name-title{overflow-wrap:break-word}@media (width <= 720px){.diagnostic-wrapper{display:flex;flex-wrap:wrap;justify-content:center}.clearfix:after{clear:none;content:none;display:initial;text-align:center}.column{padding-bottom:2rem}.clearfix .column{float:none;padding:0;width:auto;word-break:keep-all}.zone-name-title{margin-bottom:1rem}}.loading-spinner{height:76.391px}.lds-ring{display:inline-block;position:relative}.lds-ring,.lds-ring div{height:1.875rem;width:1.875rem}.lds-ring div{animation:lds-ring 1.2s cubic-bezier(.5,0,.5,1) infinite;border:.3rem solid transparent;border-radius:50%;border-top-color:#313131;box-sizing:border-box;display:block;position:absolute}.lds-ring div:first-child{animation-delay:-.45s}.lds-ring div:nth-child(2){animation-delay:-.3s}.lds-ring div:nth-child(3){animation-delay:-.15s}@keyframes lds-ring{0%{transform:rotate(0)}to{transform:rotate(1turn)}}@media screen and (-ms-high-contrast:active),screen and (-ms-high-contrast:none){.main-wrapper,body{display:block}}.rtl .heading-favicon{margin-left:.5rem;margin-right:0}.rtl #challenge-success-text{background-position:100%;padding-left:0;padding-right:42px}.rtl #challenge-error-text{background-position:100%;padding-left:0;padding-right:34px}</style><meta http-equiv="refresh" content="390"></head><body class="no-js"><div class="main-wrapper" role="main"><div class="main-content"><noscript><div id="challenge-error-title"><div class="h2"><span id="challenge-error-text">Enable JavaScript and cookies to continue</span></div></div></noscript></div></div><script>(function(){window._cf_chl_opt={cvId: '3',cZone: "ipgeo.gologin.com",cType: 'managed',cNounce: '66748',cRay: '88e6f89e9e74906b',cHash: '0151e46f0a289d3',cUPMDTk: "\/?__cf_chl_tk=7Wa4hHOtxYk6_UyRySQ_Wog6pxDQ1MMeL09x3UrcYXE-1717494128-0.0.1.1-3710",cFPWv: 'g',cTTimeMs: '1000',cMTimeMs: '390000',cTplV: 5,cTplB: 'cf',cK: "visitor-time",fa: "\/?__cf_chl_f_tk=7Wa4hHOtxYk6_UyRySQ_Wog6pxDQ1MMeL09x3UrcYXE-1717494128-0.0.1.1-3710",md: "NUEVJeLORkY3ctw5kFupy54wQ.Bw2XoiUHU155dsPe4-1717494128-1.1.1.1-VEXy_Ks50GB5RMJOslVWz7AMwubr4klp8NAQx.WpzyscwaAZIT977vQbplJHHxUMOfGQIrS7IoZsFuIi_kAG_6uzG89PjpXRbbWGUAdSBoBqVDvSLdmj32qRiiENnKa45qhWKS.2j59nh0EBxCmYnAA82B7OuCKpx7uuxmbU5TMm._9u7WdzxOLNR1eXivsDBiAjylgz3lfr01XNGKtwyi.WgRleVDf3Bktj2cCNYM0.TDELx2aXxnXICTLvg2hylLi8jz7Gq2NUy.yI5J0b5wivrYglsonDNm5NBDdtj.ySyHpcbHLJB1JjtBJo5tPLJ6KWnQXq9985_isPMbJzLi5FoKMWBx34B8ze.VVptgVgTwXxDcD.v9HtcPA.3Fh.GuInVykpAAD1YomiHnGwMSii6t3cF7.DIB6KUD99uNV3o8f8ff3DTXxjfXli4jDA.27AfPr12V55AELVyICoxGvlkqKXo.Ftpg8ZRirZfigy0Hh7dQ0_s0zYm.uxnkE.vjkBcDgHwVmSSMIwkcGgdwucwrRM0Hw..A_pTbKjDXhc.X1kBgIAMnbg2XLfGYMMHOnFYnRmzCyi8FzYSc.F.1teWQMVD7SRU8Mql17Ei8tdNsrLUAcR_0X.mo5NlKV1tRy3CQH9.Fw35FGf73ZPb.hmGIWtFdNHUkvk0fDie5dSQ6e.R4Bxd8MXUXYhZXoCDPlkkbfYLxrkuZNug_7RoE8EK6g.XFI9DuB_.Pgnw9rlu8pOp82Js0LyOiSAjKeReqTaoMTfMzRRTpz0GJUmoZ7VJCbTka71vgvJLG3WfniW_bxMJGKoP.MGIRnAgdVReG1XEVP5Dr.weAM17ZKe8KoUwNbbffg9pVavJYNM230C_sqjQbEfgQaYEfqpgmOB92zxvDcVBRPJgVcAqyyGAl28o4aIqK7ZiHFgInofroaziFEkGwWhx8RVC8.wMQYnKTxzrvH6dlUXCmH9ptYKzBxsLA3aAd0JZYF8tmck7CiuBGWgQnYrjK0wI7r0XRgVar2JD90i7j90sYWDnbnntHdV5dnVAqkMgPE9CZVEEV3IoVkvshSTr6bVPp5nQxIByNmG55BDIAmV82tshyQaEJq2PWe55qD6AY.5.XJkY2WF7SVH.FENH0_he2OQTQQZBXSokc78r2D6qMSLDqlpcwmprbJTcpCaScGZxmBPf1tPMo3Jssl7p9Dw86iKYnkbkfheTSlYs9DPbOLOZNzkKzCNClDowqoNaCYU5KNshG.ECh2QrFljLnE_N30HkRBBYBGSw1UHkdNrKz62hBrZ9FhZ6XxGKxrJsYQCrKfd8KgsJclURn6B.6umEaFGsbGTNqoJLfDp.aW_t8aUuyafzbLwnFo.M6oQrOHbMT2g2C9srRBnWrGTTTT3lkJ2di.PB816zho7SjcnnWR_fu23_ZCj5PZY2ccNfyRz_OxxgssyIJ2XRMvDnoH2I_SfSxgo",mdrd: "fG3JGIxYOKyhZo.XKniJcmxUOHl0smYMDQLj3nmOhFQ-1717494128-1.1.1.1-v0f6ICuc3qDLhtnLZ1Wx9VmiKjc8Sb7ooO4rXHP2Ao3uCumr9N1mAP1wy.BsVzPHc4_nPPdBZjVql0JBBjmeeKRbhY16OOMb2xdjgUpSIFOmez5wMjVYC3xED7OgTgtnrioKKQ1rEaF._6yfY5dc1VrkLMXazCY7oOpWutYI.8SFl9UJo7aY7Vatdixgz_mZbpj.MddWc9i_BGA6QlRcobtLx0HgePYTStTa23hX5QDGvc.Zewn.1.LvQR9y6VUWFrjYbxs63Is0BbinVae6s5_AqoziYGt2Vxzt6deouMieYzv.9uA3XQW1cc_5Ulo8.vnYkxrVKQ8u6WKvVmMB1Z5EhwXOzGwB1.NPXGxUFOGx7F1iz7WsJvkfZurqRwOmBpmQyR0fHfNt53JvDMvfCnGLUTfaeyMskKra4KtmVcXoQUTygxtvTIr1A3eewPZ6WUmKa8B7l9oE9v4hEub4LnFZIl6J1pZYDQ3GGkkohOu9aaRCJade9vaUQImr.nWKAsDxYeUFdh0p.7F1VJ8WtiAxVfuxGLOx59yluvxZdNVB2OXrOBcRhfuhS2qVFanRppgC7BSt150GYFp68bTEr1ZVrgUY70olfBfGz_TVYy6s5pbWzQQuev0tghS9uRB3Gi7JGuWZqvddBs73WIHbV8Nc6Dd7O7G0TRcOkBpAa7n_1OIiYGFhQkCxoeejnVauTmLbCGlCScGgb_ayA1xYBPR2wVGIn9gLhT66i8bseGJo97xGRUOK9Y.wok9RCXZVFthCgzDMmFjQBuelqHhDNfx8QU2uaHcVzW_tHVAQSxTdUuy_6fZyi_Rk2XI75tIWv7c5v0TqumL9fOz0BoPQpjb59YRbhQeGipDx63.eR1HAq0598X9RUyqLh1rUoYEQWpmpgbvlWgsGgmGbANROB2Igtgjti79CAU12GY0fVBKQoPUH2M7KDGCwnRaFXOLRNZwf500rJsFVquR_pGFJfYXagLfjJGKkw9fe0iQRsaUOqjCAC0RY1hfVm8sA3Kk5fSI5rSSEG5YkZE5uoH4dsLBst2Q3aL4zDk1axNio3rs7aCbil9yKJhurswS2c0pNEAZQ9OeBXN6SqSiAfnoyv432.3ke1k9LF0BH4OSBotPT4_3b4kAg__XV3pAjvFY_1d_MIK.eXjfQl_3Qhi0oD2wXXITPZLPtWVYoBW.UM3My7qntrs5R2YlSoM3BK4eqzH3nWDVFbiVyVJKYrgMzOMMJU_q.fN144gRPWOjdtaQTZzffCysnuuuyriKXQwbkQdzkM5uN0.DK9p99.uOS7B.FV_VjOiGvHu_Q_SGmw3c.fNzTv8smVRXqkxIkYV.VmYX5UdpHG5.PVTadHKM_aMJlUh.dV4fUrNmRX5ZltXjoZ4Rh2Xq3M5IruxsrbvjdS574gwGZ7noCF.yvOEEGnJsb1i5kVrgAwmsCENfGADL3a9xOFIFGLCMV2Bipd0_67Um7tjJZdDVuFiCy4mazir6Jw6q7LuQDPdrZENlw9r1.RqmPOMfRZxmdO8ngwHXwCE_IJUdTgKq2zNFWbJnv4RMpT3YIiVQ63gMYXO6CjUA2o1lSuiMzEl4La0pzZG8g1BcCROslvoMJMKGe.vQg4hW2SvAEcciejXAsO6uwcotsRQTfHo0cIy0BqD0I4zzLf63_UA2drS1oTjtvYg7yobwQbjNiEx3utD8x4qQnumVya6gL5W19.jlZyhxWAOQtIy02xIr.9Is58K.1Hz_h5xA3xj7CF0wSpLK5NqJeIzT4WRfuQwQMGYk5r5yfpzJg3qEoWeHIigsl9AM1vj3eMi982lox_r6o8HYzZ926mEKVsU5kAyrDNhS1gYI09Y.ogJekRIjpdx702wCjk3Dwlc96_4fL9ftKqUAOjpte6ZwJKOLUBAB3JVbtEQcDvwHHjLgf0kJgLwzQ7HwGmZlBEMuxaQO6SqmdzD71_37TQsPl0Gvz_LOuPQrjGolyktxurCAisjwas6h7DbhmBGHner1E6GRE4vaX7IIJVT8aXZT8KYO.BA25IgpoC4HASSp.rwyRnREnfGy5HRA_1vesXCIFastjAdCHM4qQusU63_mbYqnyELk5aUQbq20yOrxH",cRq: {ru: 'aHR0cHM6Ly9pcGdlby5nb2xvZ2luLmNvbS8=',ra: 'Tk9fVUE=',rm: 'R0VU',d: 'qKBkJcVxpK0gS9+Dncqnobox7zFZJq4tIR364HImyNL674Z6rjXGb0N5CnEE8MaC80e/fhDCZ1NALxmLlvABU3B1YBJ6u2HiuqwHa7IE8x2mjW83zHbi3+3jDJYhVGhxorhS0jQw8/HVJwNzPdRR+gDu8ohEqIciINfSlwiOu2qp6VqDQ1whv1npm21w1rxkix6yey82DI0wF9dLwklPQTICBTq24Yebnrjp8zoIPP4/Sr5C5pgAtHSN7DEOzvqBSXk8eaE9phw2wvyIdtqhP4b2fvQdI2B2Hngwtd21eiWMCqt16U+GInyuByoGoPVHfW4tRxe92aLcLHFtrU8DP8jPqWCr9ADZzPeGLbsEHsOvkBsnTmtMxMeiad+enNvXvTsC1m4tqcR9xPLoIFu1i13t561TzsJSyFcO1rVLBSG6XtY80cKU2tTxfIDzw4XJ/fZle22zeUWmhXsmtx8EufZbC7X69SwtMTdGpMvQtA1K/CKDH7oaLDrMXzrNrySmb+gvDV11h9sh4f/sdbUbS51uU9qpxjhRDrYW8dvYJDK0TWVvVGIpth0UX+HqH+JV',t: 'MTcxNzQ5NDEyOC40MjAwMDA=',cT: Math.floor(Date.now() / 1000),m: '5mFiLvS/5/akVFoHXJ25bFALknI1IUlzM8xFhK3suo4=',i1: 'wI6KiYPpIW0OhXRVGtqXlg==',i2: '6oZk6BntW8JZQ+HgujT1JA==',zh: 'JR0cIv85cUJhqgTjRa9QSuNFo/9GUndlo5xkcCmDPX8=',uh: 'DV4j3Tmrbi5Rs1q3ahwVS6SgbPbI7np5884QO1u1Cgg=',hh: 'iTzi3JnXztDsyTsA3Shvuu+oDN/wU8B2rwcgKq/my4Q=',}};var cpo = document.createElement('script');cpo.src = '/cdn-cgi/challenge-platform/h/g/orchestrate/chl_page/v1?ray=88e6f89e9e74906b';window._cf_chl_opt.cOgUHash = location.hash === '' && location.href.indexOf('#') !== -1 ? '#' : location.hash;window._cf_chl_opt.cOgUQuery = location.search === '' && location.href.slice(0, location.href.length - window._cf_chl_opt.cOgUHash.length).indexOf('?') !== -1 ? '?' : location.search;if (window.history && window.history.replaceState) {var ogU = location.pathname + window._cf_chl_opt.cOgUQuery + window._cf_chl_opt.cOgUHash;history.replaceState(null, null, "\/?__cf_chl_rt_tk=7Wa4hHOtxYk6_UyRySQ_Wog6pxDQ1MMeL09x3UrcYXE-1717494128-0.0.1.1-3710" + window._cf_chl_opt.cOgUHash);cpo.onload = function() {history.replaceState(null, null, ogU);}}document.getElementsByTagName('head')[0].appendChild(cpo);}());</script></body></html>
|