PageSourceSearch

https://verisante.com/

html verisante.com collected 2026-10-04 04:33:06 UTC 8,114 bytes, 286 lines download raw bytes

1<!doctype html>
2<html lang="en">
3	<head>
4		<meta charset="UTF-8" />
5		<link rel="icon" type="image/svg+xml" href="/vite.svg" />
6		<meta name="generator" content="Hostinger AI Builder" />
7		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
8		<title></title>
9		
9<script type="module" crossorigin src="/assets/index-DrUBShns.js"></script>
9
10		<link rel="stylesheet" crossorigin href="/assets/index-B5oU9VxP.css">
11		
11<script type="module">
12window.onerror = (message, source, lineno, colno, errorObj) => {
13	const errorDetails = errorObj ? JSON.stringify({
14		name: errorObj.name,
15		message: errorObj.message,
16		stack: errorObj.stack,
17		source,
18		lineno,
19		colno,
20	}) : null;
21
22	window.parent.postMessage({
23		type: 'horizons-runtime-error',
24		message,
25		error: errorDetails
26	}, '*');
27};
28</script>
28
29		
29<script type="module">
30const observer = new MutationObserver((mutations) => {
31	for (const mutation of mutations) {
32		for (const addedNode of mutation.addedNodes) {
33			if (
34				addedNode.nodeType === Node.ELEMENT_NODE &&
35				(
36					addedNode.tagName?.toLowerCase() === 'vite-error-overlay' ||
37					addedNode.classList?.contains('backdrop')
38				)
39			) {
40				handleViteOverlay(addedNode);
41			}
42		}
43	}
44});
45
46observer.observe(document.documentElement, {
47	childList: true,
48	subtree: true
49});
50
51function handleViteOverlay(node) {
52	if (!node.shadowRoot) {
53		return;
54	}
55
56	const backdrop = node.shadowRoot.querySelector('.backdrop');
57
58	if (backdrop) {
59		const overlayHtml = backdrop.outerHTML;
60		const parser = new DOMParser();
61		const doc = parser.parseFromString(overlayHtml, 'text/html');
62		const messageBodyElement = doc.querySelector('.message-body');
63		const fileElement = doc.querySelector('.file');
64		const messageText = messageBodyElement ? messageBodyElement.textContent.trim() : '';
65		const fileText = fileElement ? fileElement.textContent.trim() : '';
66		const error = messageText + (fileText ? ' File:' + fileText : '');
67
68		window.parent.postMessage({
69			type: 'horizons-vite-error',
70			error,
71		}, '*');
72	}
73}
74</script>
74
75		
75<script type="module">
76const originalConsoleError = console.error;
77const MATCH_LINE_COL_REGEX = /:(\d+):(\d+)\)?\s*$/; // regex to match the :lineNum:colNum
78const MATCH_AT_REGEX = /^\s*at\s+(?:async\s+)?(?:.*?\s+)?\(?/; // regex to remove the 'at' keyword and any 'async' or function name
79const MATCH_PATH_REGEX = /^\//; // regex to remove the leading slash
80
81function parseStackFrameLine(line) {
82	const lineColMatch = line.match(MATCH_LINE_COL_REGEX);
83	if (!lineColMatch) return null;
84	const [, lineNum, colNum] = lineColMatch;
85	const suffix = `:${lineNum}:${colNum}`;
86	const idx = line.lastIndexOf(suffix);
87	if (idx === -1) return null;
88	const before = line.substring(0, idx);
89	const path = before.replace(MATCH_AT_REGEX, '').trim();
90	
91	if (!path) return null;
92
93	try {
94		const pathname = new URL(path).pathname;
95		const filePath = pathname.replace(MATCH_PATH_REGEX, '') || pathname;
96		return `${filePath}:${lineNum}:${colNum}`;
97	} catch (e) {
98		const filePath = path.replace(MATCH_PATH_REGEX, '') || path;
99		return `${filePath}:${lineNum}:${colNum}`;
100	}
101}
102
103function getFilePathFromStack(stack, skipFrames = 0) {
104	if (!stack || typeof stack !== 'string') return null;
105	const lines = stack.split('\n').slice(1);
106
107	const frames = lines.map(line => parseStackFrameLine(line.replace(/\r$/, ''))).filter(Boolean);
108
109	return frames[skipFrames] ?? null;
110}
111
112function formatConsoleMessage(args, skipStackFrames = 1) {
113	let messageString = '';
114	let filePath = null;
115
116	for (let i = 0; i < args.length; i++) {
117		const arg = args[i];
118		if (arg instanceof Error) {
119			filePath = getFilePathFromStack(arg.stack, 0);
120			messageString = `${arg.name}: ${arg.message}`;
121			if (filePath) {
122				messageString = `${messageString} at ${filePath}`;
123			}
124			break;
125		}
126	}
127
128	if (!messageString) {
129		messageString = args.map(arg => typeof arg === 'object' ? JSON.stringify(arg) : String(arg)).join(' ');
130		const stack = new Error().stack;
131		filePath = getFilePathFromStack(stack, skipStackFrames);
132		if (filePath) {
133			messageString = `${messageString} at ${filePath}`;
134		}
135	}
136
137	return messageString;
138}
139
140console.error = function(...args) {
141	originalConsoleError.apply(console, args);
142
143	window.parent.postMessage({
144		type: 'horizons-console-error',
145		error: formatConsoleMessage(args, 1)
146	}, '*');
147};
148
149const originalConsoleWarn = console.warn;
150
151console.warn = function(...args) {
152	originalConsoleWarn.apply(console, args);
153
154	window.parent.postMessage({
155		type: 'horizons-console-warn',
156		warning: formatConsoleMessage(args, 1)
157	}, '*');
158};
159</script>
159
160		
160<script type="module">
161// Prevents authentication failures (PB returns 400) from crashing the app — use console.info, not console.error/PM2.
162// [urlPattern, bodyPattern] tuples; align with sandboxErrorUtils ERROR_BLACKLIST.
163const BENIGN_FETCH_ERRORS = [
164	[/hcgi\/platform\/api\/collections\/.*auth-with-password.*/i, /Failed to authenticate/i],
165	[/hcgi\/api\//i, /Insufficient credits/i],
166	// A user-supplied integration secret (Stripe/PayPal/Twilio/...) is not set yet — an expected setup state, not a bug to fix.
167	[/hcgi\/api\//i, /INTEGRATION_NOT_CONFIGURED/i],
168];
169
170function isBenignFetchError(url, body) {
171	return BENIGN_FETCH_ERRORS.some(([urlPattern, bodyPattern]) =>
172		urlPattern.test(url) && (!bodyPattern || bodyPattern.test(body)));
173}
174
175const PLATFORM_URL_PATTERN = /hcgi\/platform\//i;
176const VALIDATION_CODE_TEXT_PATTERN = /validation_/;
177
178function hasValidationCode(value) {
179	if (value == null) {
180		return false;
181	}
182	if (typeof value === 'string') {
183		return value.startsWith('validation_');
184	}
185	if (Array.isArray(value)) {
186		return value.some(hasValidationCode);
187	}
188	if (typeof value === 'object') {
189		return Object.values(value).some(hasValidationCode);
190	}
191	return false;
192}
193
194function isValidationFetchWarning(url, body) {
195	if (!PLATFORM_URL_PATTERN.test(url)) {
196		return false;
197	}
198	try {
199		return hasValidationCode(JSON.parse(body));
200	} catch {
201		return VALIDATION_CODE_TEXT_PATTERN.test(body);
202	}
203}
204
205const originalFetch = window.fetch;
206
207window.fetch = function(...args) {
208	const url = args[0] instanceof Request ? args[0].url : args[0];
209
210	// Skip WebSocket URLs
211	if (url.startsWith('ws:') || url.startsWith('wss:')) {
212		return originalFetch.apply(this, args);
213	}
214
215	return originalFetch.apply(this, args)
216		.then(async response => {
217			const contentType = response.headers.get('Content-Type') || '';
218
219			// Exclude HTML document responses
220			const isDocumentResponse =
221				contentType.includes('text/html') ||
222				contentType.includes('application/xhtml+xml');
223
224			// no-cors requests (e.g. Google Analytics/Ads beacons) always return an opaque
225			const isOpaqueResponse = response.type === 'opaque';
226
227			if (!response.ok && !isDocumentResponse && !isOpaqueResponse) {
228					const responseClone = response.clone();
229					const errorFromRes = await responseClone.text();
230					const requestUrl = response.url;
231					const errorMessage = `Fetch error from ${requestUrl}: ${errorFromRes}`;
232
233					if (isBenignFetchError(requestUrl, errorFromRes)) {
234						console.info(errorMessage);
235					} else if (isValidationFetchWarning(requestUrl, errorFromRes)) {
236						console.warn(errorMessage);
237					} else {
238						console.error(errorMessage);
239					}
240			}
241
242			return response;
243		})
244		.catch(error => {
245			if (!url.match(/.html?$/i)) {
246				// Cancelled in-flight fetch (e.g. preview reload) — not a server failure.
247				if (error?.name === 'AbortError') {
248					console.info(error);
249				} else {
250					console.error(error);
251				}
252			}
253
254			throw error;
255		});
256};
257</script>
257
258		
258<script type="module">
259if (window.navigation && window.self !== window.top) {
260	window.navigation.addEventListener('navigate', (event) => {
261		const url = event.destination.url;
262
263		try {
264			const destinationUrl = new URL(url);
265			const destinationOrigin = destinationUrl.origin;
266			const currentOrigin = window.location.origin;
267
268			if (destinationOrigin === currentOrigin) {
269				return;
270			}
271		} catch (error) {
272			return;
273		}
274
275		window.parent.postMessage({
276			type: 'horizons-navigation-error',
277			url,
278		}, '*');
279	});
280}
281</script>
281
282	</head>
283	<body>
284		<div id="root"></div>
285	</body>
286</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.