@google/gemini-cli-core 0.34.0-preview.2 → 0.34.0-preview.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/google-gemini-cli-core-0.34.0-preview.2.tgz +0 -0
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/mcp/oauth-token-storage.test.js +10 -6
- package/dist/src/mcp/oauth-token-storage.test.js.map +1 -1
- package/dist/src/mcp/token-storage/hybrid-token-storage.js +9 -21
- package/dist/src/mcp/token-storage/hybrid-token-storage.js.map +1 -1
- package/dist/src/mcp/token-storage/hybrid-token-storage.test.js +10 -59
- package/dist/src/mcp/token-storage/hybrid-token-storage.test.js.map +1 -1
- package/dist/src/mcp/token-storage/index.d.ts +1 -1
- package/dist/src/mcp/token-storage/index.js +1 -1
- package/dist/src/mcp/token-storage/index.js.map +1 -1
- package/dist/src/mcp/token-storage/keychain-token-storage.d.ts +1 -0
- package/dist/src/mcp/token-storage/keychain-token-storage.js +3 -0
- package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -1
- package/dist/src/services/fileKeychain.d.ts +24 -0
- package/dist/src/services/fileKeychain.js +123 -0
- package/dist/src/services/fileKeychain.js.map +1 -0
- package/dist/src/services/keychainService.d.ts +5 -0
- package/dist/src/services/keychainService.js +30 -13
- package/dist/src/services/keychainService.js.map +1 -1
- package/dist/src/services/keychainService.test.js +52 -22
- package/dist/src/services/keychainService.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/dist/google-gemini-cli-core-0.34.0-preview.1.tgz +0 -0
- package/dist/src/mcp/token-storage/file-token-storage.d.ts +0 -24
- package/dist/src/mcp/token-storage/file-token-storage.js +0 -152
- package/dist/src/mcp/token-storage/file-token-storage.js.map +0 -1
- package/dist/src/mcp/token-storage/file-token-storage.test.d.ts +0 -6
- package/dist/src/mcp/token-storage/file-token-storage.test.js +0 -276
- package/dist/src/mcp/token-storage/file-token-storage.test.js.map +0 -1
|
@@ -9,6 +9,8 @@ import { KeychainAvailabilityEvent } from '../telemetry/types.js';
|
|
|
9
9
|
import { debugLogger } from '../utils/debugLogger.js';
|
|
10
10
|
import { KeychainSchema, KEYCHAIN_TEST_PREFIX, } from './keychainTypes.js';
|
|
11
11
|
import { isRecord } from '../utils/markdownUtils.js';
|
|
12
|
+
import { FileKeychain } from './fileKeychain.js';
|
|
13
|
+
export const FORCE_FILE_STORAGE_ENV_VAR = 'GEMINI_FORCE_FILE_STORAGE';
|
|
12
14
|
/**
|
|
13
15
|
* Service for interacting with OS-level secure storage (e.g. keytar).
|
|
14
16
|
*/
|
|
@@ -25,6 +27,13 @@ export class KeychainService {
|
|
|
25
27
|
async isAvailable() {
|
|
26
28
|
return (await this.getKeychain()) !== null;
|
|
27
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* Returns true if the service is using the encrypted file fallback backend.
|
|
32
|
+
*/
|
|
33
|
+
async isUsingFileFallback() {
|
|
34
|
+
const keychain = await this.getKeychain();
|
|
35
|
+
return keychain instanceof FileKeychain;
|
|
36
|
+
}
|
|
28
37
|
/**
|
|
29
38
|
* Retrieves a secret for the given account.
|
|
30
39
|
* @throws Error if the keychain is unavailable.
|
|
@@ -71,23 +80,31 @@ export class KeychainService {
|
|
|
71
80
|
// High-level orchestration of the loading and testing cycle.
|
|
72
81
|
async initializeKeychain() {
|
|
73
82
|
let resultKeychain = null;
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
83
|
+
const forceFileStorage = process.env[FORCE_FILE_STORAGE_ENV_VAR] === 'true';
|
|
84
|
+
if (!forceFileStorage) {
|
|
85
|
+
try {
|
|
86
|
+
const keychainModule = await this.loadKeychainModule();
|
|
87
|
+
if (keychainModule) {
|
|
88
|
+
if (await this.isKeychainFunctional(keychainModule)) {
|
|
89
|
+
resultKeychain = keychainModule;
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
debugLogger.log('Keychain functional verification failed');
|
|
93
|
+
}
|
|
82
94
|
}
|
|
83
95
|
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
// Avoid logging full error objects to prevent PII exposure.
|
|
98
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
99
|
+
debugLogger.log('Keychain initialization encountered an error:', message);
|
|
100
|
+
}
|
|
84
101
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
102
|
+
coreEvents.emitTelemetryKeychainAvailability(new KeychainAvailabilityEvent(resultKeychain !== null && !forceFileStorage));
|
|
103
|
+
// Fallback to FileKeychain if native keychain is unavailable or file storage is forced
|
|
104
|
+
if (!resultKeychain) {
|
|
105
|
+
resultKeychain = new FileKeychain();
|
|
106
|
+
debugLogger.log('Using FileKeychain fallback for secure storage.');
|
|
89
107
|
}
|
|
90
|
-
coreEvents.emitTelemetryKeychainAvailability(new KeychainAvailabilityEvent(resultKeychain !== null));
|
|
91
108
|
return resultKeychain;
|
|
92
109
|
}
|
|
93
110
|
// Low-level dynamic loading and structural validation.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keychainService.js","sourceRoot":"","sources":["../../../src/services/keychainService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAEL,cAAc,EACd,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"keychainService.js","sourceRoot":"","sources":["../../../src/services/keychainService.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,17 +3,27 @@
|
|
|
3
3
|
* Copyright 2026 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
6
|
+
import { describe, it, expect, vi, beforeEach, afterEach, } from 'vitest';
|
|
7
7
|
import { KeychainService } from './keychainService.js';
|
|
8
8
|
import { coreEvents } from '../utils/events.js';
|
|
9
9
|
import { debugLogger } from '../utils/debugLogger.js';
|
|
10
|
+
import { FileKeychain } from './fileKeychain.js';
|
|
10
11
|
const mockKeytar = {
|
|
11
12
|
getPassword: vi.fn(),
|
|
12
13
|
setPassword: vi.fn(),
|
|
13
14
|
deletePassword: vi.fn(),
|
|
14
15
|
findCredentials: vi.fn(),
|
|
15
16
|
};
|
|
17
|
+
const mockFileKeychain = {
|
|
18
|
+
getPassword: vi.fn(),
|
|
19
|
+
setPassword: vi.fn(),
|
|
20
|
+
deletePassword: vi.fn(),
|
|
21
|
+
findCredentials: vi.fn(),
|
|
22
|
+
};
|
|
16
23
|
vi.mock('keytar', () => ({ default: mockKeytar }));
|
|
24
|
+
vi.mock('./fileKeychain.js', () => ({
|
|
25
|
+
FileKeychain: vi.fn(() => mockFileKeychain),
|
|
26
|
+
}));
|
|
17
27
|
vi.mock('../utils/events.js', () => ({
|
|
18
28
|
coreEvents: { emitTelemetryKeychainAvailability: vi.fn() },
|
|
19
29
|
}));
|
|
@@ -24,11 +34,13 @@ describe('KeychainService', () => {
|
|
|
24
34
|
let service;
|
|
25
35
|
const SERVICE_NAME = 'test-service';
|
|
26
36
|
let passwords = {};
|
|
37
|
+
const originalEnv = process.env;
|
|
27
38
|
beforeEach(() => {
|
|
28
39
|
vi.clearAllMocks();
|
|
40
|
+
process.env = { ...originalEnv };
|
|
29
41
|
service = new KeychainService(SERVICE_NAME);
|
|
30
42
|
passwords = {};
|
|
31
|
-
// Stateful mock implementation
|
|
43
|
+
// Stateful mock implementation for native keychain
|
|
32
44
|
mockKeytar.setPassword?.mockImplementation((_svc, acc, val) => {
|
|
33
45
|
passwords[acc] = val;
|
|
34
46
|
return Promise.resolve();
|
|
@@ -43,35 +55,65 @@ describe('KeychainService', () => {
|
|
|
43
55
|
account,
|
|
44
56
|
password,
|
|
45
57
|
}))));
|
|
58
|
+
// Stateful mock implementation for fallback file keychain
|
|
59
|
+
mockFileKeychain.setPassword?.mockImplementation((_svc, acc, val) => {
|
|
60
|
+
passwords[acc] = val;
|
|
61
|
+
return Promise.resolve();
|
|
62
|
+
});
|
|
63
|
+
mockFileKeychain.getPassword?.mockImplementation((_svc, acc) => Promise.resolve(passwords[acc] ?? null));
|
|
64
|
+
mockFileKeychain.deletePassword?.mockImplementation((_svc, acc) => {
|
|
65
|
+
const exists = !!passwords[acc];
|
|
66
|
+
delete passwords[acc];
|
|
67
|
+
return Promise.resolve(exists);
|
|
68
|
+
});
|
|
69
|
+
mockFileKeychain.findCredentials?.mockImplementation(() => Promise.resolve(Object.entries(passwords).map(([account, password]) => ({
|
|
70
|
+
account,
|
|
71
|
+
password,
|
|
72
|
+
}))));
|
|
73
|
+
});
|
|
74
|
+
afterEach(() => {
|
|
75
|
+
process.env = originalEnv;
|
|
46
76
|
});
|
|
47
77
|
describe('isAvailable', () => {
|
|
48
|
-
it('should return true and emit telemetry on successful functional test', async () => {
|
|
78
|
+
it('should return true and emit telemetry on successful functional test with native keychain', async () => {
|
|
49
79
|
const available = await service.isAvailable();
|
|
50
80
|
expect(available).toBe(true);
|
|
51
81
|
expect(mockKeytar.setPassword).toHaveBeenCalled();
|
|
52
82
|
expect(coreEvents.emitTelemetryKeychainAvailability).toHaveBeenCalledWith(expect.objectContaining({ available: true }));
|
|
53
83
|
});
|
|
54
|
-
it('should return
|
|
84
|
+
it('should return true (via fallback), log error, and emit telemetry indicating native is unavailable on failed functional test', async () => {
|
|
55
85
|
mockKeytar.setPassword?.mockRejectedValue(new Error('locked'));
|
|
56
86
|
const available = await service.isAvailable();
|
|
57
|
-
|
|
87
|
+
// Because it falls back to FileKeychain, it is always available.
|
|
88
|
+
expect(available).toBe(true);
|
|
58
89
|
expect(debugLogger.log).toHaveBeenCalledWith(expect.stringContaining('encountered an error'), 'locked');
|
|
59
90
|
expect(coreEvents.emitTelemetryKeychainAvailability).toHaveBeenCalledWith(expect.objectContaining({ available: false }));
|
|
91
|
+
expect(debugLogger.log).toHaveBeenCalledWith(expect.stringContaining('Using FileKeychain fallback'));
|
|
92
|
+
expect(FileKeychain).toHaveBeenCalled();
|
|
60
93
|
});
|
|
61
|
-
it('should return
|
|
94
|
+
it('should return true (via fallback), log validation error, and emit telemetry on module load failure', async () => {
|
|
62
95
|
const originalMock = mockKeytar.getPassword;
|
|
63
96
|
mockKeytar.getPassword = undefined; // Break schema
|
|
64
97
|
const available = await service.isAvailable();
|
|
65
|
-
expect(available).toBe(
|
|
98
|
+
expect(available).toBe(true);
|
|
66
99
|
expect(debugLogger.log).toHaveBeenCalledWith(expect.stringContaining('failed structural validation'), expect.objectContaining({ getPassword: expect.any(Array) }));
|
|
67
100
|
expect(coreEvents.emitTelemetryKeychainAvailability).toHaveBeenCalledWith(expect.objectContaining({ available: false }));
|
|
101
|
+
expect(FileKeychain).toHaveBeenCalled();
|
|
68
102
|
mockKeytar.getPassword = originalMock;
|
|
69
103
|
});
|
|
70
|
-
it('should log failure if functional test cycle returns false', async () => {
|
|
104
|
+
it('should log failure if functional test cycle returns false, then fallback', async () => {
|
|
71
105
|
mockKeytar.getPassword?.mockResolvedValue('wrong-password');
|
|
72
106
|
const available = await service.isAvailable();
|
|
73
|
-
expect(available).toBe(
|
|
107
|
+
expect(available).toBe(true);
|
|
74
108
|
expect(debugLogger.log).toHaveBeenCalledWith(expect.stringContaining('functional verification failed'));
|
|
109
|
+
expect(FileKeychain).toHaveBeenCalled();
|
|
110
|
+
});
|
|
111
|
+
it('should fallback to FileKeychain when GEMINI_FORCE_FILE_STORAGE is true', async () => {
|
|
112
|
+
process.env['GEMINI_FORCE_FILE_STORAGE'] = 'true';
|
|
113
|
+
const available = await service.isAvailable();
|
|
114
|
+
expect(available).toBe(true);
|
|
115
|
+
expect(FileKeychain).toHaveBeenCalled();
|
|
116
|
+
expect(coreEvents.emitTelemetryKeychainAvailability).toHaveBeenCalledWith(expect.objectContaining({ available: false }));
|
|
75
117
|
});
|
|
76
118
|
it('should cache the result and handle concurrent initialization attempts once', async () => {
|
|
77
119
|
await Promise.all([
|
|
@@ -103,18 +145,6 @@ describe('KeychainService', () => {
|
|
|
103
145
|
expect(await service.getPassword('missing')).toBeNull();
|
|
104
146
|
});
|
|
105
147
|
});
|
|
106
|
-
|
|
107
|
-
beforeEach(() => {
|
|
108
|
-
mockKeytar.setPassword?.mockRejectedValue(new Error('Unavailable'));
|
|
109
|
-
});
|
|
110
|
-
it.each([
|
|
111
|
-
{ method: 'getPassword', args: ['acc'] },
|
|
112
|
-
{ method: 'setPassword', args: ['acc', 'val'] },
|
|
113
|
-
{ method: 'deletePassword', args: ['acc'] },
|
|
114
|
-
{ method: 'findCredentials', args: [] },
|
|
115
|
-
])('$method should throw a consistent error', async ({ method, args }) => {
|
|
116
|
-
await expect(service[method](...args)).rejects.toThrow('Keychain is not available');
|
|
117
|
-
});
|
|
118
|
-
});
|
|
148
|
+
// Removing 'When Unavailable' tests since the service is always available via fallback
|
|
119
149
|
});
|
|
120
150
|
//# sourceMappingURL=keychainService.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keychainService.test.js","sourceRoot":"","sources":["../../../src/services/keychainService.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"keychainService.test.js","sourceRoot":"","sources":["../../../src/services/keychainService.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,QAAQ,EACR,EAAE,EACF,MAAM,EACN,EAAE,EACF,UAAU,EACV,SAAS,GAEV,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AASjD,MAAM,UAAU,GAAiB;IAC/B,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;IACpB,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;IACpB,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;IACvB,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE;CACzB,CAAC;AAEF,MAAM,gBAAgB,GAAiB;IACrC,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;IACpB,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;IACpB,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;IACvB,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE;CACzB,CAAC;AAEF,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;AAEnD,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC;IAClC,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC;CAC5C,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,UAAU,EAAE,EAAE,iCAAiC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE;CAC3D,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,WAAW,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE;CAC9B,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,IAAI,OAAwB,CAAC;IAC7B,MAAM,YAAY,GAAG,cAAc,CAAC;IACpC,IAAI,SAAS,GAA2B,EAAE,CAAC;IAC3C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC;IAEhC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;QACjC,OAAO,GAAG,IAAI,eAAe,CAAC,YAAY,CAAC,CAAC;QAC5C,SAAS,GAAG,EAAE,CAAC;QAEf,mDAAmD;QACnD,UAAU,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YAC5D,SAAS,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;YACrB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;QACH,UAAU,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CACvD,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CACxC,CAAC;QACF,UAAU,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;YAC1D,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAChC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;YACtB,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QACH,UAAU,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,EAAE,CAClD,OAAO,CAAC,OAAO,CACb,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;YACtD,OAAO;YACP,QAAQ;SACT,CAAC,CAAC,CACJ,CACF,CAAC;QAEF,0DAA0D;QAC1D,gBAAgB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YAClE,SAAS,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;YACrB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;QACH,gBAAgB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAC7D,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CACxC,CAAC;QACF,gBAAgB,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;YAChE,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAChC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;YACtB,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QACH,gBAAgB,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,EAAE,CACxD,OAAO,CAAC,OAAO,CACb,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;YACtD,OAAO;YACP,QAAQ;SACT,CAAC,CAAC,CACJ,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,GAAG,GAAG,WAAW,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,0FAA0F,EAAE,KAAK,IAAI,EAAE;YACxG,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;YAE9C,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,gBAAgB,EAAE,CAAC;YAClD,MAAM,CAAC,UAAU,CAAC,iCAAiC,CAAC,CAAC,oBAAoB,CACvE,MAAM,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAC7C,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6HAA6H,EAAE,KAAK,IAAI,EAAE;YAC3I,UAAU,CAAC,WAAW,EAAE,iBAAiB,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YAE/D,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;YAE9C,iEAAiE;YACjE,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAC1C,MAAM,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,EAC/C,QAAQ,CACT,CAAC;YACF,MAAM,CAAC,UAAU,CAAC,iCAAiC,CAAC,CAAC,oBAAoB,CACvE,MAAM,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAC9C,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAC1C,MAAM,CAAC,gBAAgB,CAAC,6BAA6B,CAAC,CACvD,CAAC;YACF,MAAM,CAAC,YAAY,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oGAAoG,EAAE,KAAK,IAAI,EAAE;YAClH,MAAM,YAAY,GAAG,UAAU,CAAC,WAAW,CAAC;YAC5C,UAAU,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC,eAAe;YAEnD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;YAE9C,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAC1C,MAAM,CAAC,gBAAgB,CAAC,8BAA8B,CAAC,EACvD,MAAM,CAAC,gBAAgB,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAC5D,CAAC;YACF,MAAM,CAAC,UAAU,CAAC,iCAAiC,CAAC,CAAC,oBAAoB,CACvE,MAAM,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAC9C,CAAC;YACF,MAAM,CAAC,YAAY,CAAC,CAAC,gBAAgB,EAAE,CAAC;YAExC,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;YACxF,UAAU,CAAC,WAAW,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;YAE5D,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;YAE9C,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAC1C,MAAM,CAAC,gBAAgB,CAAC,gCAAgC,CAAC,CAC1D,CAAC;YACF,MAAM,CAAC,YAAY,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;YACtF,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,GAAG,MAAM,CAAC;YAClD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;YAC9C,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,CAAC,YAAY,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACxC,MAAM,CAAC,UAAU,CAAC,iCAAiC,CAAC,CAAC,oBAAoB,CACvE,MAAM,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAC9C,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;YAC1F,MAAM,OAAO,CAAC,GAAG,CAAC;gBAChB,OAAO,CAAC,WAAW,EAAE;gBACrB,OAAO,CAAC,WAAW,EAAE;gBACrB,OAAO,CAAC,WAAW,EAAE;aACtB,CAAC,CAAC;YAEH,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;YAC5B,EAAE,CAAC,aAAa,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACtE,MAAM,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC7C,MAAM,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAE7C,MAAM,CAAC,MAAM,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1D,MAAM,CAAC,MAAM,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAE1D,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,eAAe,EAAE,CAAC;YAC9C,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;YAEvE,MAAM,CAAC,MAAM,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxD,MAAM,CAAC,MAAM,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YACrD,MAAM,CAAC,MAAM,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,CAAC,MAAM,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,uFAAuF;AACzF,CAAC,CAAC,CAAC"}
|