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.
Files changed (49) hide show
  1. package/package.json +1 -1
  2. package/src/gologin.js +35 -5
  3. package/.sentry-native/15e25388-76f1-4a90-cea4-9a33e95e5be5.run/af276dd3-14b9-4b32-df19-69cb16a9a85e.envelope +0 -5
  4. package/.sentry-native/15e25388-76f1-4a90-cea4-9a33e95e5be5.run.lock +0 -0
  5. package/.sentry-native/last_crash +0 -1
  6. package/gologin/.eslintrc.json +0 -290
  7. package/gologin/README.md +0 -163
  8. package/gologin/example.js +0 -36
  9. package/gologin/examples/example-amazon-cloud-browser.js +0 -37
  10. package/gologin/examples/example-amazon-headless.js +0 -50
  11. package/gologin/examples/example-amazon.js +0 -47
  12. package/gologin/examples/example-create-custom-profile.js +0 -39
  13. package/gologin/examples/example-create-profile.js +0 -40
  14. package/gologin/examples/example-custom-args.js +0 -34
  15. package/gologin/examples/example-fast-profile-settings.js +0 -69
  16. package/gologin/examples/example-gmail.js +0 -67
  17. package/gologin/examples/example-iphey.js +0 -17
  18. package/gologin/examples/example-local-profile.js +0 -26
  19. package/gologin/examples/example-login-walmart.js +0 -35
  20. package/gologin/examples/example-stopremote.js +0 -20
  21. package/gologin/examples/example-timezone.js +0 -44
  22. package/gologin/fonts.js +0 -4293
  23. package/gologin/fonts_config +0 -104
  24. package/gologin/gologin-browser-ext.zip +0 -0
  25. package/gologin/gologin_zeroprofile.b64 +0 -1
  26. package/gologin/index.d.ts +0 -61
  27. package/gologin/package.json +0 -49
  28. package/gologin/profile_export_example.csv +0 -2
  29. package/gologin/run.sh +0 -1
  30. package/gologin/src/bookmarks/utils.js +0 -15
  31. package/gologin/src/browser/browser-api.js +0 -95
  32. package/gologin/src/browser/browser-checker.js +0 -392
  33. package/gologin/src/browser/browser-user-data-manager.js +0 -335
  34. package/gologin/src/cookies/cookies-manager.js +0 -189
  35. package/gologin/src/extensions/extensions-extractor.js +0 -56
  36. package/gologin/src/extensions/extensions-manager.js +0 -384
  37. package/gologin/src/extensions/user-extensions-manager.js +0 -295
  38. package/gologin/src/gologin-api.js +0 -110
  39. package/gologin/src/gologin.js +0 -1472
  40. package/gologin/src/profile/profile-archiver.js +0 -86
  41. package/gologin/src/profile/profile-directories-to-remove.js +0 -75
  42. package/gologin/src/utils/browser.js +0 -62
  43. package/gologin/src/utils/common.js +0 -76
  44. package/gologin/src/utils/constants.js +0 -1
  45. package/gologin/src/utils/utils.js +0 -49
  46. package/gologin/zero_profile.zip +0 -0
  47. package/gologin-canvas.zip +0 -0
  48. package/gologin.zip +0 -0
  49. 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
-
Binary file
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>