@cosmocoder/mcp-web-docs 2.0.8 → 2.0.9

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 (40) hide show
  1. package/build/crawler/auth.js +117 -7
  2. package/build/crawler/auth.js.map +1 -1
  3. package/build/crawler/auth.test.js +333 -83
  4. package/build/crawler/auth.test.js.map +1 -1
  5. package/build/crawler/browser-config.d.ts +1 -1
  6. package/build/crawler/browser-config.js +7 -1
  7. package/build/crawler/browser-config.js.map +1 -1
  8. package/build/crawler/browser-config.test.js +21 -25
  9. package/build/crawler/browser-config.test.js.map +1 -1
  10. package/build/crawler/crawlee-crawler.d.ts +3 -0
  11. package/build/crawler/crawlee-crawler.js +155 -12
  12. package/build/crawler/crawlee-crawler.js.map +1 -1
  13. package/build/crawler/crawlee-crawler.test.js +190 -143
  14. package/build/crawler/crawlee-crawler.test.js.map +1 -1
  15. package/build/crawler/github.js +3 -2
  16. package/build/crawler/github.js.map +1 -1
  17. package/build/crawler/llms-txt.js +2 -1
  18. package/build/crawler/llms-txt.js.map +1 -1
  19. package/build/index.js +13 -8
  20. package/build/index.js.map +1 -1
  21. package/build/setupTests.js +44 -0
  22. package/build/setupTests.js.map +1 -1
  23. package/build/util/favicon.js +2 -1
  24. package/build/util/favicon.js.map +1 -1
  25. package/build/util/favicon.test.js +27 -37
  26. package/build/util/favicon.test.js.map +1 -1
  27. package/build/util/outbound-request.d.ts +33 -0
  28. package/build/util/outbound-request.integration.test.d.ts +1 -0
  29. package/build/util/outbound-request.integration.test.js +149 -0
  30. package/build/util/outbound-request.integration.test.js.map +1 -0
  31. package/build/util/outbound-request.js +367 -0
  32. package/build/util/outbound-request.js.map +1 -0
  33. package/build/util/outbound-request.test.d.ts +1 -0
  34. package/build/util/outbound-request.test.js +224 -0
  35. package/build/util/outbound-request.test.js.map +1 -0
  36. package/build/util/security.js +1 -1
  37. package/build/util/security.js.map +1 -1
  38. package/build/util/security.test.js +1 -0
  39. package/build/util/security.test.js.map +1 -1
  40. package/package.json +8 -6
@@ -1,5 +1,6 @@
1
- import { detectDefaultBrowser, AuthManager } from './auth.js';
1
+ import { lookup } from 'node:dns/promises';
2
2
  import { encryptData } from '../util/security.js';
3
+ import { detectDefaultBrowser, AuthManager } from './auth.js';
3
4
  const { mockDefaultBrowser, mockMkdir, mockReadFile, mockWriteFile, mockAccess, mockChmod, mockUnlink, mockChromiumLaunch } = vi.hoisted(() => ({
4
5
  mockDefaultBrowser: vi.fn(),
5
6
  mockMkdir: vi.fn(),
@@ -32,42 +33,64 @@ vi.mock('playwright', () => ({
32
33
  launch: vi.fn(),
33
34
  },
34
35
  }));
35
- /**
36
- * Create an encrypted stored session for testing
37
- */
38
- function createStoredSession(cookies, domain = 'example.com') {
39
- const storageState = { cookies };
40
- const encryptedStorageState = encryptData(JSON.stringify(storageState));
41
- return {
36
+ function deferred() {
37
+ let resolve;
38
+ let reject;
39
+ const promise = new Promise((resolvePromise, rejectPromise) => {
40
+ resolve = resolvePromise;
41
+ reject = rejectPromise;
42
+ });
43
+ return { promise, resolve, reject };
44
+ }
45
+ function mockStoredSession(cookies, domain = 'example.com') {
46
+ mockReadFile.mockResolvedValue(JSON.stringify({
42
47
  domain,
43
- storageState: encryptedStorageState,
48
+ storageState: encryptData(JSON.stringify({ cookies })),
44
49
  createdAt: new Date().toISOString(),
45
50
  browser: 'chromium',
46
51
  version: 2,
47
- };
48
- }
49
- /**
50
- * Mock the file system to return a stored session
51
- */
52
- function mockStoredSession(cookies, domain = 'example.com') {
53
- const storedSession = createStoredSession(cookies, domain);
54
- mockReadFile.mockResolvedValue(JSON.stringify(storedSession));
52
+ }));
55
53
  }
56
- /**
57
- * Create browser mocks for session validation tests
58
- */
59
54
  function setupBrowserMock(options = {}) {
60
- const { status = 200, url = 'https://example.com', content = '<html><body>Welcome!</body></html>', bodyText = 'Welcome to the site', } = options;
55
+ const { status = 200, blocked = false, url = 'https://example.com', content = '<html><body>Welcome!</body></html>', bodyText = 'Welcome to the site', } = options;
56
+ const mainFrame = {};
57
+ const responseListeners = new Set();
58
+ const requestFailedListeners = new Set();
61
59
  const mockPage = {
62
- goto: vi.fn().mockResolvedValue({ status: () => status }),
60
+ goto: vi.fn().mockResolvedValue({
61
+ status: () => status,
62
+ headerValue: vi.fn().mockImplementation(async (name) => (blocked && name === 'x-mcp-web-docs-blocked' ? '1' : null)),
63
+ }),
63
64
  url: vi.fn().mockReturnValue(url),
64
65
  waitForLoadState: vi.fn().mockResolvedValue(undefined),
65
66
  waitForTimeout: vi.fn().mockResolvedValue(undefined),
67
+ waitForURL: vi.fn().mockResolvedValue(undefined),
66
68
  content: vi.fn().mockResolvedValue(content),
67
69
  evaluate: vi.fn().mockResolvedValue(bodyText),
70
+ close: vi.fn().mockResolvedValue(undefined),
71
+ mainFrame: vi.fn().mockReturnValue(mainFrame),
72
+ on: vi.fn((event, listener) => {
73
+ if (event === 'response') {
74
+ responseListeners.add(listener);
75
+ }
76
+ else if (event === 'requestfailed') {
77
+ requestFailedListeners.add(listener);
78
+ }
79
+ }),
80
+ off: vi.fn((event, listener) => {
81
+ if (event === 'response') {
82
+ responseListeners.delete(listener);
83
+ }
84
+ else if (event === 'requestfailed') {
85
+ requestFailedListeners.delete(listener);
86
+ }
87
+ }),
68
88
  };
69
89
  const mockContext = {
70
90
  newPage: vi.fn().mockResolvedValue(mockPage),
91
+ route: vi.fn().mockResolvedValue(undefined),
92
+ routeWebSocket: vi.fn().mockResolvedValue(undefined),
93
+ storageState: vi.fn().mockResolvedValue({ cookies: [], origins: [] }),
71
94
  close: vi.fn().mockResolvedValue(undefined),
72
95
  };
73
96
  const mockBrowser = {
@@ -75,11 +98,49 @@ function setupBrowserMock(options = {}) {
75
98
  close: vi.fn().mockResolvedValue(undefined),
76
99
  };
77
100
  mockChromiumLaunch.mockResolvedValue(mockBrowser);
78
- return { mockPage, mockContext, mockBrowser };
101
+ return {
102
+ mockPage,
103
+ mockContext,
104
+ mockBrowser,
105
+ emitResponse: (response) => responseListeners.forEach((listener) => listener(response)),
106
+ emitRequestFailed: (request) => requestFailedListeners.forEach((listener) => listener(request)),
107
+ navigationResponse: ({ headerValue = '1', navigation = true } = {}) => ({
108
+ status: () => 403,
109
+ headerValue: vi.fn().mockReturnValue(headerValue),
110
+ request: () => ({ isNavigationRequest: () => navigation, frame: () => mainFrame }),
111
+ }),
112
+ failedNavigation: ({ errorText = 'net::ERR_TUNNEL_CONNECTION_FAILED', navigation = true, url = 'https://8.8.8.8/login', } = {}) => ({
113
+ isNavigationRequest: () => navigation,
114
+ frame: () => mainFrame,
115
+ failure: () => ({ errorText }),
116
+ url: () => url,
117
+ }),
118
+ expectPinnedProxy: (expected = {}, exact = false) => {
119
+ const contextOptions = {
120
+ ...expected,
121
+ proxy: {
122
+ server: expect.stringMatching(/^http:\/\/127\.0\.0\.1:\d+$/),
123
+ bypass: '<-loopback>',
124
+ },
125
+ };
126
+ expect(mockBrowser.newContext).toHaveBeenCalledWith(exact ? contextOptions : expect.objectContaining(contextOptions));
127
+ expect(mockBrowser.newContext.mock.calls[0][0]).not.toHaveProperty('serviceWorkers');
128
+ expect(mockContext.route).not.toHaveBeenCalled();
129
+ expect(mockContext.routeWebSocket).not.toHaveBeenCalled();
130
+ },
131
+ };
132
+ }
133
+ function performLogin(authManager) {
134
+ return authManager.performInteractiveLogin('https://example.com', {
135
+ browser: 'chromium',
136
+ loginSuccessPattern: 'example',
137
+ });
138
+ }
139
+ function trackSettlement(promise) {
140
+ let settled = false;
141
+ void promise.then(() => (settled = true), () => (settled = true));
142
+ return () => settled;
79
143
  }
80
- /**
81
- * Create test cookie with common defaults
82
- */
83
144
  function createCookie(overrides = {}) {
84
145
  return {
85
146
  name: 'session_id',
@@ -118,9 +179,6 @@ describe('Auth Module', () => {
118
179
  let authManager;
119
180
  beforeEach(() => {
120
181
  authManager = new AuthManager('/tmp/test-data');
121
- mockMkdir.mockResolvedValue(undefined);
122
- mockWriteFile.mockResolvedValue(undefined);
123
- mockChmod.mockResolvedValue(undefined);
124
182
  });
125
183
  describe('initialize', () => {
126
184
  it('should create sessions directory', async () => {
@@ -129,37 +187,191 @@ describe('Auth Module', () => {
129
187
  });
130
188
  });
131
189
  describe('hasSession', () => {
132
- it('should return true when session file exists', async () => {
190
+ it('should return true and use the URL domain when the session file exists', async () => {
133
191
  mockAccess.mockResolvedValue(undefined);
134
- const result = await authManager.hasSession('https://example.com/docs');
192
+ const result = await authManager.hasSession('https://docs.example.com/path/page');
135
193
  expect(result).toBe(true);
194
+ expect(mockAccess).toHaveBeenCalledWith(expect.stringContaining('docs.example.com'));
136
195
  });
137
196
  it('should return false when session file does not exist', async () => {
138
197
  mockAccess.mockRejectedValue(new Error('ENOENT'));
139
- const result = await authManager.hasSession('https://example.com/docs');
140
- expect(result).toBe(false);
141
- });
142
- it('should use domain for session path', async () => {
143
- mockAccess.mockResolvedValue(undefined);
144
- await authManager.hasSession('https://docs.example.com/path/page');
145
- expect(mockAccess).toHaveBeenCalledWith(expect.stringContaining('docs.example.com'));
198
+ await expect(authManager.hasSession('https://example.com/docs')).resolves.toBe(false);
146
199
  });
147
200
  });
148
201
  describe('loadSession', () => {
149
- it('should return null when session does not exist', async () => {
202
+ it.each([
203
+ { label: 'missing file', input: new Error('ENOENT') },
204
+ { label: 'invalid JSON', input: 'invalid json' },
205
+ { label: 'invalid structure', input: JSON.stringify({ invalid: 'structure' }) },
206
+ ])('should return null for $label', async ({ input }) => {
207
+ if (input instanceof Error) {
208
+ mockReadFile.mockRejectedValue(input);
209
+ }
210
+ else {
211
+ mockReadFile.mockResolvedValue(input);
212
+ }
213
+ await expect(authManager.loadSession('https://example.com')).resolves.toBeNull();
214
+ });
215
+ });
216
+ describe('createAuthenticatedContext', () => {
217
+ it('returns null without DNS or browser setup when no saved session exists', async () => {
150
218
  mockReadFile.mockRejectedValue(new Error('ENOENT'));
151
- const result = await authManager.loadSession('https://example.com');
152
- expect(result).toBeNull();
219
+ await expect(authManager.createAuthenticatedContext('https://example.com')).resolves.toBeNull();
220
+ expect(lookup).not.toHaveBeenCalled();
221
+ expect(mockChromiumLaunch).not.toHaveBeenCalled();
222
+ });
223
+ it('uses the pinned proxy without changing service workers or registering routes', async () => {
224
+ mockStoredSession([]);
225
+ const { mockBrowser, mockContext, expectPinnedProxy } = setupBrowserMock();
226
+ await expect(authManager.createAuthenticatedContext('https://example.com')).resolves.toEqual({
227
+ browser: mockBrowser,
228
+ context: mockContext,
229
+ });
230
+ expectPinnedProxy();
231
+ expect(lookup).not.toHaveBeenCalled();
232
+ });
233
+ });
234
+ describe('performInteractiveLogin', () => {
235
+ it('uses the pinned proxy without changing service workers or registering routes', async () => {
236
+ const { expectPinnedProxy } = setupBrowserMock();
237
+ await performLogin(authManager);
238
+ expectPinnedProxy({ viewport: { width: 1280, height: 800 } }, true);
239
+ });
240
+ it('does not wait for login when the proxy blocks the destination', async () => {
241
+ const { mockPage } = setupBrowserMock({ status: 403, blocked: true });
242
+ await expect(performLogin(authManager)).rejects.toThrow('Blocked outbound destination');
243
+ expect(mockPage.waitForURL).not.toHaveBeenCalled();
244
+ });
245
+ it.each([
246
+ ['tagged response', 'Blocked outbound destination'],
247
+ ['tunnel failure', 'Outbound destination unavailable'],
248
+ ])('rejects a main-frame %s emitted during goto', async (failureKind, expectedError) => {
249
+ const { mockPage, emitResponse, emitRequestFailed, navigationResponse, failedNavigation } = setupBrowserMock();
250
+ mockPage.goto.mockImplementation(async () => {
251
+ if (failureKind === 'tagged response') {
252
+ emitResponse(navigationResponse());
253
+ }
254
+ else {
255
+ emitRequestFailed(failedNavigation());
256
+ }
257
+ return {
258
+ status: () => 200,
259
+ headerValue: vi.fn().mockResolvedValue(null),
260
+ };
261
+ });
262
+ await expect(performLogin(authManager)).rejects.toThrow(expectedError);
263
+ expect(mockPage.waitForURL).not.toHaveBeenCalled();
264
+ expect(mockWriteFile).not.toHaveBeenCalled();
265
+ expect(mockPage.off).toHaveBeenCalledWith('response', expect.any(Function));
266
+ expect(mockPage.off).toHaveBeenCalledWith('requestfailed', expect.any(Function));
267
+ });
268
+ it.each([
269
+ ['blocked', 'http://127.0.0.1/login', 'Blocked outbound destination'],
270
+ ['failed', 'https://8.8.8.8/login', 'Outbound destination unavailable'],
271
+ ])('classifies an async %s requestfailed URL', async (_kind, failedUrl, expectedError) => {
272
+ const { mockPage, emitRequestFailed, failedNavigation } = setupBrowserMock();
273
+ mockPage.goto.mockImplementation(async () => {
274
+ emitRequestFailed(failedNavigation({ url: failedUrl }));
275
+ return { status: () => 200, headerValue: vi.fn().mockResolvedValue(null) };
276
+ });
277
+ await expect(performLogin(authManager)).rejects.toThrow(expectedError);
278
+ expect(mockPage.waitForURL).not.toHaveBeenCalled();
279
+ expect(mockWriteFile).not.toHaveBeenCalled();
280
+ });
281
+ it('awaits asynchronous requestfailed classification before continuing login', async () => {
282
+ const pendingLookup = deferred();
283
+ vi.mocked(lookup).mockImplementationOnce(() => pendingLookup.promise);
284
+ const { mockPage, emitRequestFailed, failedNavigation } = setupBrowserMock();
285
+ mockPage.goto.mockImplementation(async () => {
286
+ emitRequestFailed(failedNavigation({ url: 'https://redirected.example.com/login' }));
287
+ return { status: () => 200, headerValue: vi.fn().mockResolvedValue(null) };
288
+ });
289
+ const login = performLogin(authManager);
290
+ const isSettled = trackSettlement(login);
291
+ await vi.waitFor(() => expect(lookup).toHaveBeenCalled());
292
+ expect(isSettled()).toBe(false);
293
+ pendingLookup.resolve([{ address: '127.0.0.1', family: 4 }]);
294
+ await expect(login).rejects.toThrow('Blocked outbound destination');
295
+ });
296
+ it('awaits a deferred response marker before saving a successful login', async () => {
297
+ const { mockPage, emitResponse, navigationResponse } = setupBrowserMock();
298
+ const wait = deferred();
299
+ mockPage.waitForURL.mockImplementation(() => wait.promise);
300
+ const header = deferred();
301
+ const login = performLogin(authManager);
302
+ await vi.waitFor(() => expect(mockPage.waitForURL).toHaveBeenCalled());
303
+ emitResponse(navigationResponse({ headerValue: header.promise }));
304
+ wait.resolve();
305
+ await Promise.resolve();
306
+ await Promise.resolve();
307
+ expect(mockWriteFile).not.toHaveBeenCalled();
308
+ header.resolve('1');
309
+ await expect(login).rejects.toThrow('Blocked outbound destination');
310
+ expect(mockWriteFile).not.toHaveBeenCalled();
153
311
  });
154
- it('should return null for invalid session data', async () => {
155
- mockReadFile.mockResolvedValue('invalid json');
156
- const result = await authManager.loadSession('https://example.com');
157
- expect(result).toBeNull();
312
+ it('fails closed when a login response marker cannot be inspected', async () => {
313
+ const { mockPage, emitResponse, navigationResponse } = setupBrowserMock();
314
+ const wait = deferred();
315
+ mockPage.waitForURL.mockImplementation(() => wait.promise);
316
+ const login = performLogin(authManager);
317
+ await vi.waitFor(() => expect(mockPage.waitForURL).toHaveBeenCalled());
318
+ emitResponse(navigationResponse({ headerValue: Promise.reject(new Error('headers unavailable')) }));
319
+ wait.resolve();
320
+ await expect(login).rejects.toThrow('Failed to inspect outbound response: headers unavailable');
321
+ expect(mockWriteFile).not.toHaveBeenCalled();
158
322
  });
159
- it('should return null for session with invalid structure', async () => {
160
- mockReadFile.mockResolvedValue(JSON.stringify({ invalid: 'structure' }));
161
- const result = await authManager.loadSession('https://example.com');
162
- expect(result).toBeNull();
323
+ it('stops an OAuth wait when a later main-frame navigation is blocked', async () => {
324
+ const { mockPage, emitResponse, navigationResponse } = setupBrowserMock();
325
+ const wait = deferred();
326
+ mockPage.waitForURL.mockImplementation(() => wait.promise);
327
+ mockPage.close.mockImplementation(async () => wait.reject(new Error('Page closed')));
328
+ const login = performLogin(authManager);
329
+ await vi.waitFor(() => expect(mockPage.waitForURL).toHaveBeenCalled());
330
+ const isSettled = trackSettlement(login);
331
+ emitResponse(navigationResponse({ navigation: false }));
332
+ await Promise.resolve();
333
+ await Promise.resolve();
334
+ expect(isSettled()).toBe(false);
335
+ emitResponse(navigationResponse());
336
+ await expect(login).rejects.toThrow('Blocked outbound destination');
337
+ expect(mockPage.off).toHaveBeenCalledWith('response', expect.any(Function));
338
+ });
339
+ it('checks navigation policy after capturing storage state and before saving', async () => {
340
+ const { mockPage, mockContext, emitResponse, navigationResponse } = setupBrowserMock();
341
+ const blockedHeader = deferred();
342
+ mockContext.storageState.mockImplementation(async () => {
343
+ emitResponse(navigationResponse({ headerValue: blockedHeader.promise }));
344
+ return { cookies: [], origins: [] };
345
+ });
346
+ const login = performLogin(authManager);
347
+ await vi.waitFor(() => expect(mockContext.storageState).toHaveBeenCalled());
348
+ await Promise.resolve();
349
+ expect(mockWriteFile).not.toHaveBeenCalled();
350
+ blockedHeader.resolve('1');
351
+ await expect(login).rejects.toThrow('Blocked outbound destination');
352
+ expect(mockWriteFile).not.toHaveBeenCalled();
353
+ expect(mockPage.off).toHaveBeenCalledWith('response', expect.any(Function));
354
+ });
355
+ it('ignores an aborted OAuth navigation but stops on a later fatal tunnel failure', async () => {
356
+ const { mockPage, emitRequestFailed, failedNavigation } = setupBrowserMock();
357
+ const wait = deferred();
358
+ mockPage.waitForURL.mockImplementation(() => wait.promise);
359
+ mockPage.close.mockImplementation(async () => wait.reject(new Error('Page closed')));
360
+ const login = performLogin(authManager);
361
+ await vi.waitFor(() => expect(mockPage.waitForURL).toHaveBeenCalled());
362
+ const isSettled = trackSettlement(login);
363
+ emitRequestFailed(failedNavigation({ errorText: 'net::ERR_CONNECTION_REFUSED', navigation: false }));
364
+ await Promise.resolve();
365
+ expect(isSettled()).toBe(false);
366
+ for (const errorText of ['net::ERR_ABORTED', 'NS_BINDING_ABORTED', 'Load request cancelled']) {
367
+ emitRequestFailed(failedNavigation({ errorText }));
368
+ await Promise.resolve();
369
+ expect(isSettled()).toBe(false);
370
+ }
371
+ emitRequestFailed(failedNavigation());
372
+ await expect(login).rejects.toThrow('Outbound destination unavailable');
373
+ expect(mockPage.off).toHaveBeenCalledWith('response', expect.any(Function));
374
+ expect(mockPage.off).toHaveBeenCalledWith('requestfailed', expect.any(Function));
163
375
  });
164
376
  });
165
377
  describe('clearSession', () => {
@@ -199,19 +411,15 @@ describe('Auth Module', () => {
199
411
  });
200
412
  });
201
413
  });
202
- describe('BrowserType', () => {
203
- it('should accept valid browser types', () => {
204
- const validTypes = ['chromium', 'chrome', 'firefox', 'webkit', 'edge'];
205
- validTypes.forEach((type) => {
206
- expect(typeof type).toBe('string');
207
- });
208
- });
414
+ it.each(['http://127.0.0.1/login', 'http://[::1]/login'])('rejects private custom login URL %s before launching a browser', async (loginUrl) => {
415
+ const authManager = new AuthManager('/tmp/test-data');
416
+ await expect(authManager.performInteractiveLogin('https://example.com', { loginUrl })).rejects.toThrow('not allowed');
417
+ expect(mockChromiumLaunch).not.toHaveBeenCalled();
209
418
  });
210
419
  describe('validateSession', () => {
211
420
  let authManager;
212
421
  beforeEach(() => {
213
422
  authManager = new AuthManager('/tmp/test-data');
214
- mockMkdir.mockResolvedValue(undefined);
215
423
  });
216
424
  it('should return isValid=false when no session exists', async () => {
217
425
  mockReadFile.mockRejectedValue(new Error('ENOENT'));
@@ -222,31 +430,28 @@ describe('Auth Module', () => {
222
430
  describe('cookie expiration detection', () => {
223
431
  const expiredTimestamp = () => Math.floor(Date.now() / 1000) - 3600; // 1 hour ago
224
432
  const validTimestamp = () => Math.floor(Date.now() / 1000) + 3600; // 1 hour from now
225
- it('should detect expired cookies from stored session', async () => {
226
- mockStoredSession([createCookie({ name: 'session_token', expires: expiredTimestamp() })]);
227
- const result = await authManager.validateSession('https://example.com');
228
- expect(result.isValid).toBe(false);
229
- expect(result.reason).toContain('expired');
230
- });
231
- it('should detect expired auth-related cookies specifically', async () => {
232
- mockStoredSession([
233
- createCookie({ name: 'tracking_cookie', expires: validTimestamp() }),
234
- createCookie({ name: 'auth_token', expires: expiredTimestamp() }),
235
- ]);
236
- const result = await authManager.validateSession('https://example.com');
237
- expect(result.isValid).toBe(false);
238
- expect(result.reason).toContain('expired');
239
- });
240
- it('should handle cookies on parent domain (e.g., .example.com for sub.example.com)', async () => {
241
- mockStoredSession([createCookie({ name: 'auth_token', domain: '.example.com', expires: expiredTimestamp() })], 'sub.example.com');
242
- const result = await authManager.validateSession('https://sub.example.com');
243
- expect(result.isValid).toBe(false);
244
- expect(result.reason).toContain('expired');
245
- });
246
- it('should check all cookies when no domain-specific cookies found', async () => {
247
- // Auth cookies on different domain (e.g., github.com for github.io)
248
- mockStoredSession([createCookie({ name: 'user_session', domain: 'github.com', expires: expiredTimestamp() })], 'user.github.io');
249
- const result = await authManager.validateSession('https://user.github.io');
433
+ it.each([
434
+ {
435
+ label: 'an unrelated cookie is still valid',
436
+ cookies: () => [
437
+ createCookie({ name: 'tracking_cookie', expires: validTimestamp() }),
438
+ createCookie({ name: 'auth_token', expires: expiredTimestamp() }),
439
+ ],
440
+ domain: 'example.com',
441
+ },
442
+ {
443
+ label: 'the cookie belongs to a parent domain',
444
+ cookies: () => [createCookie({ name: 'auth_token', domain: '.example.com', expires: expiredTimestamp() })],
445
+ domain: 'sub.example.com',
446
+ },
447
+ {
448
+ label: 'no target-domain cookie exists',
449
+ cookies: () => [createCookie({ name: 'user_session', domain: 'github.com', expires: expiredTimestamp() })],
450
+ domain: 'user.github.io',
451
+ },
452
+ ])('should detect expired auth cookies when $label', async ({ cookies, domain }) => {
453
+ mockStoredSession(cookies(), domain);
454
+ const result = await authManager.validateSession(`https://${domain}`);
250
455
  expect(result.isValid).toBe(false);
251
456
  expect(result.reason).toContain('expired');
252
457
  });
@@ -286,6 +491,50 @@ describe('Auth Module', () => {
286
491
  expect(result.isValid).toBe(false);
287
492
  expect(result.reason).toContain(String(statusCode));
288
493
  });
494
+ it('does not classify a proxy policy rejection as expired credentials', async () => {
495
+ setupBrowserMock({ status: 403, blocked: true });
496
+ await expect(authManager.validateSession('https://example.com')).rejects.toThrow('Blocked outbound destination');
497
+ });
498
+ it('preserves the session when a post-load main-frame response is proxy-blocked', async () => {
499
+ const { mockPage, emitResponse, navigationResponse } = setupBrowserMock();
500
+ mockPage.waitForLoadState.mockImplementation(async () => {
501
+ emitResponse(navigationResponse());
502
+ });
503
+ await expect(authManager.validateSessionOrThrow('https://example.com')).rejects.toThrow('Blocked outbound destination');
504
+ expect(mockUnlink).not.toHaveBeenCalled();
505
+ expect(mockPage.off).toHaveBeenCalledWith('response', expect.any(Function));
506
+ });
507
+ it('preserves the session when a post-load main-frame request fails', async () => {
508
+ const { mockPage, emitRequestFailed, failedNavigation } = setupBrowserMock();
509
+ mockPage.waitForLoadState.mockImplementation(async () => {
510
+ emitRequestFailed(failedNavigation());
511
+ });
512
+ await expect(authManager.validateSessionOrThrow('https://example.com')).rejects.toThrow('Outbound destination unavailable');
513
+ expect(mockUnlink).not.toHaveBeenCalled();
514
+ expect(mockPage.off).toHaveBeenCalledWith('requestfailed', expect.any(Function));
515
+ });
516
+ it('fails closed without deleting the session when a validation marker cannot be inspected', async () => {
517
+ const { mockPage, emitResponse, navigationResponse } = setupBrowserMock();
518
+ mockPage.waitForLoadState.mockImplementation(async () => {
519
+ emitResponse(navigationResponse({ headerValue: Promise.reject(new Error('headers unavailable')) }));
520
+ });
521
+ await expect(authManager.validateSessionOrThrow('https://example.com')).rejects.toThrow('Failed to inspect outbound response: headers unavailable');
522
+ expect(mockUnlink).not.toHaveBeenCalled();
523
+ });
524
+ it('preserves the session when a blocked marker resolves during content inspection', async () => {
525
+ const { mockPage, emitResponse, navigationResponse } = setupBrowserMock();
526
+ const header = deferred();
527
+ mockPage.content.mockImplementation(async () => {
528
+ emitResponse(navigationResponse({ headerValue: header.promise }));
529
+ return '<html><body>Welcome!</body></html>';
530
+ });
531
+ mockPage.evaluate.mockImplementation(async () => {
532
+ header.resolve('1');
533
+ return 'Welcome to the site';
534
+ });
535
+ await expect(authManager.validateSessionOrThrow('https://example.com')).rejects.toThrow('Blocked outbound destination');
536
+ expect(mockUnlink).not.toHaveBeenCalled();
537
+ });
289
538
  it('should detect redirect to external login page as expired session', async () => {
290
539
  setupBrowserMock({
291
540
  url: 'https://company.okta.com/login',
@@ -328,9 +577,10 @@ describe('Auth Module', () => {
328
577
  expect(result.reason).toContain('Validation failed');
329
578
  });
330
579
  it('should consider session valid when page loads successfully', async () => {
331
- setupBrowserMock();
580
+ const { expectPinnedProxy } = setupBrowserMock();
332
581
  const result = await authManager.validateSession('https://example.com');
333
582
  expect(result.isValid).toBe(true);
583
+ expectPinnedProxy();
334
584
  });
335
585
  });
336
586
  });
@@ -1 +1 @@
1
- {"version":3,"file":"auth.test.js","sourceRoot":"","sources":["../../src/crawler/auth.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.test.js","sourceRoot":"","sources":["../../src/crawler/auth.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE9D,MAAM,EAAE,kBAAkB,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,kBAAkB,EAAE,GAAG,EAAE,CAAC,OAAO,CACtI,GAAG,EAAE,CAAC,CAAC;IACL,kBAAkB,EAAE,EAAE,CAAC,EAAE,EAAE;IAC3B,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;IAClB,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;IACrB,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;IACtB,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;IACnB,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;IAClB,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;IACnB,kBAAkB,EAAE,EAAE,CAAC,EAAE,EAAE;CAC5B,CAAC,CACH,CAAC;AAEF,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC;IAChC,OAAO,EAAE,kBAAkB;CAC5B,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,KAAK,EAAE,SAAS;IAChB,QAAQ,EAAE,YAAY;IACtB,SAAS,EAAE,aAAa;IACxB,MAAM,EAAE,UAAU;IAClB,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,UAAU;CACnB,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3B,QAAQ,EAAE;QACR,MAAM,EAAE,kBAAkB;KAC3B;IACD,OAAO,EAAE;QACP,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;KAChB;IACD,MAAM,EAAE;QACN,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;KAChB;CACF,CAAC,CAAC,CAAC;AAYJ,SAAS,QAAQ;IACf,IAAI,OAA4B,CAAC;IACjC,IAAI,MAA+B,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAI,CAAC,cAAc,EAAE,aAAa,EAAE,EAAE;QAC/D,OAAO,GAAG,cAAc,CAAC;QACzB,MAAM,GAAG,aAAa,CAAC;IACzB,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACtC,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAiB,EAAE,MAAM,GAAG,aAAa;IAClE,YAAY,CAAC,iBAAiB,CAC5B,IAAI,CAAC,SAAS,CAAC;QACb,MAAM;QACN,YAAY,EAAE,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QACtD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,OAAO,EAAE,UAAU;QACnB,OAAO,EAAE,CAAC;KACX,CAAC,CACH,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAqG,EAAE;IAC/H,MAAM,EACJ,MAAM,GAAG,GAAG,EACZ,OAAO,GAAG,KAAK,EACf,GAAG,GAAG,qBAAqB,EAC3B,OAAO,GAAG,oCAAoC,EAC9C,QAAQ,GAAG,qBAAqB,GACjC,GAAG,OAAO,CAAC;IACZ,MAAM,SAAS,GAAG,EAAE,CAAC;IACrB,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAA+C,CAAC;IACjF,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAA8C,CAAC;IAErF,MAAM,QAAQ,GAAG;QACf,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC9B,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM;YACpB,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE,CAAC,CAAC,OAAO,IAAI,IAAI,KAAK,wBAAwB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SAC7H,CAAC;QACF,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC;QACjC,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QACtD,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QACpD,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAChD,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC;QAC3C,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC;QAC7C,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAC3C,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC;QAC7C,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,KAAa,EAAE,QAAqD,EAAE,EAAE;YACjF,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;gBACzB,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAClC,CAAC;iBACI,IAAI,KAAK,KAAK,eAAe,EAAE,CAAC;gBACnC,sBAAsB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACvC,CAAC;QACH,CAAC,CAAC;QACF,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,KAAa,EAAE,QAAqD,EAAE,EAAE;YAClF,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;gBACzB,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACrC,CAAC;iBACI,IAAI,KAAK,KAAK,eAAe,EAAE,CAAC;gBACnC,sBAAsB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC,CAAC;KACH,CAAC;IACF,MAAM,WAAW,GAAG;QAClB,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC;QAC5C,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAC3C,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QACpD,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACrE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;KAC5C,CAAC;IACF,MAAM,WAAW,GAAG;QAClB,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,WAAW,CAAC;QAClD,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;KAC5C,CAAC;IACF,kBAAkB,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAElD,OAAO;QACL,QAAQ;QACR,WAAW;QACX,WAAW;QACX,YAAY,EAAE,CAAC,QAAiC,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAChH,iBAAiB,EAAE,CAAC,OAAgC,EAAE,EAAE,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACxH,kBAAkB,EAAE,CAAC,EAAE,WAAW,GAAG,GAAG,EAAE,UAAU,GAAG,IAAI,KAAsD,EAAE,EAAE,EAAE,CAAC,CAAC;YACvH,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG;YACjB,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,WAAW,CAAC;YACjD,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,mBAAmB,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;SACnF,CAAC;QACF,gBAAgB,EAAE,CAAC,EACjB,SAAS,GAAG,mCAAmC,EAC/C,UAAU,GAAG,IAAI,EACjB,GAAG,GAAG,uBAAuB,MACiC,EAAE,EAAE,EAAE,CAAC,CAAC;YACtE,mBAAmB,EAAE,GAAG,EAAE,CAAC,UAAU;YACrC,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS;YACtB,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;YAC9B,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG;SACf,CAAC;QACF,iBAAiB,EAAE,CAAC,WAAoC,EAAE,EAAE,KAAK,GAAG,KAAK,EAAE,EAAE;YAC3E,MAAM,cAAc,GAAG;gBACrB,GAAG,QAAQ;gBACX,KAAK,EAAE;oBACL,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC,6BAA6B,CAAC;oBAC5D,MAAM,EAAE,aAAa;iBACtB;aACF,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC;YACtH,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;YACrF,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACjD,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC5D,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,WAAwB;IAC5C,OAAO,WAAW,CAAC,uBAAuB,CAAC,qBAAqB,EAAE;QAChE,OAAO,EAAE,UAAU;QACnB,mBAAmB,EAAE,SAAS;KAC/B,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,OAAyB;IAChD,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,OAAO,CAAC,IAAI,CACf,GAAG,EAAE,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,EACtB,GAAG,EAAE,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,CACvB,CAAC;IACF,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;AACvB,CAAC;AAED,SAAS,YAAY,CAAC,YAA6B,EAAE;IACnD,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,eAAe;QACtB,MAAM,EAAE,aAAa;QACrB,IAAI,EAAE,GAAG;QACT,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,kCAAkC;AAElC,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,IAAI,CAAC;YACN,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,SAAS,CAAC;YAC/C,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,mBAAmB,EAAE,EAAE,QAAQ,CAAC;YAC9D,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,MAAM,CAAC;YAC1D,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,kBAAkB,EAAE,EAAE,QAAQ,CAAC;YACtD,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,kBAAkB,EAAE,EAAE,UAAU,CAAC;YAC1D,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,UAAU,CAAC;YACxD,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,SAAS,CAAC,EAAE,mBAAmB;SACrE,CAAC,CAAC,wBAAwB,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE;YAC3D,kBAAkB,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,MAAM,oBAAoB,EAAE,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,kBAAkB,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAEpE,MAAM,MAAM,GAAG,MAAM,oBAAoB,EAAE,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,IAAI,WAAwB,CAAC;QAE7B,UAAU,CAAC,GAAG,EAAE;YACd,WAAW,GAAG,IAAI,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;YAC1B,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;gBAChD,MAAM,WAAW,CAAC,UAAU,EAAE,CAAC;gBAE/B,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACnG,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;YAC1B,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;gBACtF,UAAU,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;gBAExC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,oCAAoC,CAAC,CAAC;gBAElF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC1B,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,CAAC;YACvF,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;gBACpE,UAAU,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAElD,MAAM,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,0BAA0B,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxF,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;YAC3B,EAAE,CAAC,IAAI,CAAC;gBACN,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE;gBACrD,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE;gBAChD,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE;aAChF,CAAC,CAAC,+BAA+B,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;gBACtD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;oBAC3B,YAAY,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBACxC,CAAC;qBACI,CAAC;oBACJ,YAAY,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBACxC,CAAC;gBAED,MAAM,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACnF,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;YAC1C,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;gBACtF,YAAY,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAEpD,MAAM,MAAM,CAAC,WAAW,CAAC,0BAA0B,CAAC,qBAAqB,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBAEhG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;gBACtC,MAAM,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACpD,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;gBAC5F,iBAAiB,CAAC,EAAE,CAAC,CAAC;gBACtB,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,GAAG,gBAAgB,EAAE,CAAC;gBAE3E,MAAM,MAAM,CAAC,WAAW,CAAC,0BAA0B,CAAC,qBAAqB,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;oBAC3F,OAAO,EAAE,WAAW;oBACpB,OAAO,EAAE,WAAW;iBACrB,CAAC,CAAC;gBAEH,iBAAiB,EAAE,CAAC;gBACpB,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACxC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACvC,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;gBAC5F,MAAM,EAAE,iBAAiB,EAAE,GAAG,gBAAgB,EAAE,CAAC;gBAEjD,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;gBAEhC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;YACtE,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;gBAC7E,MAAM,EAAE,QAAQ,EAAE,GAAG,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBAEtE,MAAM,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;gBAExF,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACrD,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,IAAI,CAAC;gBACN,CAAC,iBAAiB,EAAE,8BAA8B,CAAC;gBACnD,CAAC,gBAAgB,EAAE,kCAAkC,CAAC;aACvD,CAAC,CAAC,6CAA6C,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,EAAE;gBACrF,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,CAAC;gBAC/G,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;oBAC1C,IAAI,WAAW,KAAK,iBAAiB,EAAE,CAAC;wBACtC,YAAY,CAAC,kBAAkB,EAAE,CAAC,CAAC;oBACrC,CAAC;yBACI,CAAC;wBACJ,iBAAiB,CAAC,gBAAgB,EAAE,CAAC,CAAC;oBACxC,CAAC;oBACD,OAAO;wBACL,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG;wBACjB,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC;qBAC7C,CAAC;gBACJ,CAAC,CAAC,CAAC;gBAEH,MAAM,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;gBAEvE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;gBACnD,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;gBAC7C,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC5E,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;YACnF,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,IAAI,CAAC;gBACN,CAAC,SAAS,EAAE,wBAAwB,EAAE,8BAA8B,CAAC;gBACrE,CAAC,QAAQ,EAAE,uBAAuB,EAAE,kCAAkC,CAAC;aACxE,CAAC,CAAC,0CAA0C,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE;gBACvF,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,CAAC;gBAC7E,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;oBAC1C,iBAAiB,CAAC,gBAAgB,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;oBACxD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7E,CAAC,CAAC,CAAC;gBAEH,MAAM,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;gBAEvE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;gBACnD,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAC/C,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;gBACxF,MAAM,aAAa,GAAG,QAAQ,EAAyC,CAAC;gBACxE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,OAAgB,CAAC,CAAC;gBAC/E,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,CAAC;gBAC7E,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;oBAC1C,iBAAiB,CAAC,gBAAgB,CAAC,EAAE,GAAG,EAAE,sCAAsC,EAAE,CAAC,CAAC,CAAC;oBACrF,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7E,CAAC,CAAC,CAAC;gBAEH,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;gBACxC,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;gBACzC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC;gBAC1D,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAEhC,aAAa,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC7D,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;YACtE,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;gBAClF,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,kBAAkB,EAAE,GAAG,gBAAgB,EAAE,CAAC;gBAC1E,MAAM,IAAI,GAAG,QAAQ,EAAQ,CAAC;gBAC9B,QAAQ,CAAC,UAAU,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC3D,MAAM,MAAM,GAAG,QAAQ,EAAiB,CAAC;gBACzC,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;gBACxC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC;gBAEvE,YAAY,CAAC,kBAAkB,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAClE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBACxB,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBACxB,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;gBAE7C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAEpB,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;gBACpE,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAC/C,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;gBAC7E,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,kBAAkB,EAAE,GAAG,gBAAgB,EAAE,CAAC;gBAC1E,MAAM,IAAI,GAAG,QAAQ,EAAQ,CAAC;gBAC9B,QAAQ,CAAC,UAAU,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC3D,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;gBACxC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC;gBAEvE,YAAY,CAAC,kBAAkB,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACpG,IAAI,CAAC,OAAO,EAAE,CAAC;gBAEf,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC;gBAChG,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAC/C,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;gBACjF,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,kBAAkB,EAAE,GAAG,gBAAgB,EAAE,CAAC;gBAC1E,MAAM,IAAI,GAAG,QAAQ,EAAQ,CAAC;gBAC9B,QAAQ,CAAC,UAAU,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC3D,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;gBACrF,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;gBACxC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC;gBAEvE,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;gBACzC,YAAY,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;gBACxD,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBACxB,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBACxB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAEhC,YAAY,CAAC,kBAAkB,EAAE,CAAC,CAAC;gBAEnC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;gBACpE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC9E,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;gBACxF,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,kBAAkB,EAAE,GAAG,gBAAgB,EAAE,CAAC;gBACvF,MAAM,aAAa,GAAG,QAAQ,EAAiB,CAAC;gBAChD,WAAW,CAAC,YAAY,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;oBACrD,YAAY,CAAC,kBAAkB,CAAC,EAAE,WAAW,EAAE,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;oBACzE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;gBACtC,CAAC,CAAC,CAAC;gBACH,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;gBACxC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC;gBAC5E,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBACxB,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;gBAE7C,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAE3B,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;gBACpE,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;gBAC7C,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC9E,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;gBAC7F,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,CAAC;gBAC7E,MAAM,IAAI,GAAG,QAAQ,EAAQ,CAAC;gBAC9B,QAAQ,CAAC,UAAU,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC3D,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;gBACrF,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;gBACxC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC;gBAEvE,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;gBACzC,iBAAiB,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,6BAA6B,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;gBACrG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBACxB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAEhC,KAAK,MAAM,SAAS,IAAI,CAAC,kBAAkB,EAAE,oBAAoB,EAAE,wBAAwB,CAAC,EAAE,CAAC;oBAC7F,iBAAiB,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;oBACnD,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;oBACxB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClC,CAAC;gBAED,iBAAiB,CAAC,gBAAgB,EAAE,CAAC,CAAC;gBAEtC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;gBACxE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC5E,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;YACnF,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;YAC5B,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;gBAC1C,UAAU,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;gBAExC,MAAM,WAAW,CAAC,YAAY,CAAC,qBAAqB,CAAC,CAAC;gBAEtD,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC;YAClF,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;gBAC5D,UAAU,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAElD,MAAM,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YAC3F,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACzC,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;gBAC5C,UAAU,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;gBAExC,MAAM,WAAW,CAAC,UAAU,CAAC,yCAAyC,CAAC,CAAC;gBAExE,8CAA8C;gBAC9C,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,CAAC;gBACzD,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBACvC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBACxC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;gBAClD,6DAA6D;gBAC7D,MAAM,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACtE,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;gBAClD,UAAU,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;gBAExC,MAAM,WAAW,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;gBAEpD,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC;YAClF,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;YACvB,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;gBACvD,MAAM,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YAC7D,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC,CAAC,wBAAwB,EAAE,oBAAoB,CAAC,CAAC,CACvD,gEAAgE,EAChE,KAAK,EAAE,QAAQ,EAAE,EAAE;QACjB,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAEtD,MAAM,MAAM,CAAC,WAAW,CAAC,uBAAuB,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACtH,MAAM,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACpD,CAAC,CACF,CAAC;IAEF,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,IAAI,WAAwB,CAAC;QAE7B,UAAU,CAAC,GAAG,EAAE;YACd,WAAW,GAAG,IAAI,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,YAAY,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YAEpD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC;YAExE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;YAC3C,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,aAAa;YAClF,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,kBAAkB;YAErF,EAAE,CAAC,IAAI,CAAC;gBACN;oBACE,KAAK,EAAE,oCAAoC;oBAC3C,OAAO,EAAE,GAAG,EAAE,CAAC;wBACb,YAAY,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC;wBACpE,YAAY,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,gBAAgB,EAAE,EAAE,CAAC;qBAClE;oBACD,MAAM,EAAE,aAAa;iBACtB;gBACD;oBACE,KAAK,EAAE,uCAAuC;oBAC9C,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC;oBAC1G,MAAM,EAAE,iBAAiB;iBAC1B;gBACD;oBACE,KAAK,EAAE,gCAAgC;oBACvC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC;oBAC1G,MAAM,EAAE,gBAAgB;iBACzB;aACF,CAAC,CAAC,gDAAgD,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;gBACjF,iBAAiB,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;gBAErC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,eAAe,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC;gBAEtE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACnC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;YAC/C,EAAE,CAAC,IAAI,CAAC;gBACN,CAAC,kBAAkB,EAAE,SAAS,CAAC;gBAC/B,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;gBAClB,CAAC,WAAW,EAAE,CAAC,CAAC;aACjB,CAAC,CAAC,uDAAuD,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE;gBAC/F,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;gBAC9B,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;oBAC/B,MAAM,CAAC,OAAO,GAAG,YAAY,CAAC;gBAChC,CAAC;gBACD,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC5B,gBAAgB,EAAE,CAAC;gBAEnB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC;gBAExE,4EAA4E;gBAC5E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;YACxC,UAAU,CAAC,GAAG,EAAE;gBACd,wEAAwE;gBACxE,iBAAiB,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,IAAI,CAAC;gBACN,CAAC,GAAG,EAAE,cAAc,CAAC;gBACrB,CAAC,GAAG,EAAE,WAAW,CAAC;aACnB,CAAC,CAAC,mDAAmD,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE;gBACrF,gBAAgB,CAAC;oBACf,MAAM,EAAE,UAAU;oBAClB,OAAO,EAAE,eAAe,QAAQ,gBAAgB;oBAChD,QAAQ;iBACT,CAAC,CAAC;gBAEH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC;gBAExE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACnC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;YACtD,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;gBACjF,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBAEjD,MAAM,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;YACnH,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;gBAC3F,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,kBAAkB,EAAE,GAAG,gBAAgB,EAAE,CAAC;gBAC1E,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;oBACtD,YAAY,CAAC,kBAAkB,EAAE,CAAC,CAAC;gBACrC,CAAC,CAAC,CAAC;gBAEH,MAAM,MAAM,CAAC,WAAW,CAAC,sBAAsB,CAAC,qBAAqB,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;gBACxH,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;gBAC1C,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC9E,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;gBAC/E,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,CAAC;gBAC7E,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;oBACtD,iBAAiB,CAAC,gBAAgB,EAAE,CAAC,CAAC;gBACxC,CAAC,CAAC,CAAC;gBAEH,MAAM,MAAM,CAAC,WAAW,CAAC,sBAAsB,CAAC,qBAAqB,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;gBAC5H,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;gBAC1C,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;YACnF,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,wFAAwF,EAAE,KAAK,IAAI,EAAE;gBACtG,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,kBAAkB,EAAE,GAAG,gBAAgB,EAAE,CAAC;gBAC1E,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;oBACtD,YAAY,CAAC,kBAAkB,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACtG,CAAC,CAAC,CAAC;gBAEH,MAAM,MAAM,CAAC,WAAW,CAAC,sBAAsB,CAAC,qBAAqB,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACrF,0DAA0D,CAC3D,CAAC;gBACF,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAC5C,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,gFAAgF,EAAE,KAAK,IAAI,EAAE;gBAC9F,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,kBAAkB,EAAE,GAAG,gBAAgB,EAAE,CAAC;gBAC1E,MAAM,MAAM,GAAG,QAAQ,EAAiB,CAAC;gBACzC,QAAQ,CAAC,OAAO,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;oBAC7C,YAAY,CAAC,kBAAkB,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;oBAClE,OAAO,oCAAoC,CAAC;gBAC9C,CAAC,CAAC,CAAC;gBACH,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;oBAC9C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBACpB,OAAO,qBAAqB,CAAC;gBAC/B,CAAC,CAAC,CAAC;gBAEH,MAAM,MAAM,CAAC,WAAW,CAAC,sBAAsB,CAAC,qBAAqB,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;gBACxH,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAC5C,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;gBAChF,gBAAgB,CAAC;oBACf,GAAG,EAAE,gCAAgC;oBACrC,OAAO,EAAE,mCAAmC;oBAC5C,QAAQ,EAAE,qBAAqB;iBAChC,CAAC,CAAC;gBAEH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC;gBAExE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACnC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBACzC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YACjE,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;gBAC/E,MAAM,gBAAgB,GAAG;;;;;;;;;;;;SAYxB,CAAC;gBACF,gBAAgB,CAAC;oBACf,GAAG,EAAE,yBAAyB;oBAC9B,OAAO,EAAE,gBAAgB;oBACzB,QAAQ,EAAE,kEAAkE;iBAC7E,CAAC,CAAC;gBAEH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC;gBAExE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACnC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;gBACvD,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxD,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;gBAC1D,kBAAkB,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;gBAEzE,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC;gBAExE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACnC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;YACvD,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;gBAC1E,MAAM,EAAE,iBAAiB,EAAE,GAAG,gBAAgB,EAAE,CAAC;gBAEjD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC;gBAExE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAClC,iBAAiB,EAAE,CAAC;YACtB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +1,2 @@
1
1
  import { PlaywrightCrawlerOptions } from 'crawlee';
2
- export declare const getBrowserConfig: (requestQueue: PlaywrightCrawlerOptions["requestQueue"]) => Partial<PlaywrightCrawlerOptions>;
2
+ export declare const getBrowserConfig: (requestQueue: PlaywrightCrawlerOptions["requestQueue"]) => Promise<Partial<PlaywrightCrawlerOptions>>;
@@ -1,8 +1,9 @@
1
1
  import { log } from 'crawlee';
2
+ import { getOutboundProxyUrl } from '../util/outbound-request.js';
2
3
  // Suppress Crawlee's stdout logging for MCP compatibility
3
4
  // MCP servers must only output JSON-RPC messages to stdout
4
5
  log.setLevel(log.LEVELS.OFF);
5
- export const getBrowserConfig = (requestQueue) => ({
6
+ export const getBrowserConfig = async (requestQueue) => ({
6
7
  maxRequestsPerCrawl: 1000,
7
8
  requestQueue,
8
9
  maxConcurrency: 5,
@@ -10,6 +11,11 @@ export const getBrowserConfig = (requestQueue) => ({
10
11
  maxRequestRetries: 2,
11
12
  navigationTimeoutSecs: 30,
12
13
  requestHandlerTimeoutSecs: 60,
14
+ launchContext: {
15
+ launchOptions: {
16
+ proxy: { server: await getOutboundProxyUrl(), bypass: '<-loopback>' },
17
+ },
18
+ },
13
19
  browserPoolOptions: {
14
20
  maxOpenPagesPerBrowser: 3,
15
21
  useFingerprints: true,