@space-ai/contracts 0.1.1 → 0.1.2
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/README.md +25 -17
- package/dist/axios.js +2 -1
- package/dist/axios.js.map +1 -1
- package/dist/core/axios-instance.d.ts.map +1 -1
- package/dist/core/axios-instance.js +8 -6
- package/dist/core/axios-instance.js.map +1 -1
- package/dist/core/init.d.ts.map +1 -1
- package/dist/core/init.js +5 -3
- package/dist/core/init.js.map +1 -1
- package/dist/core/runtime.d.ts +7 -0
- package/dist/core/runtime.d.ts.map +1 -0
- package/dist/core/runtime.js +20 -0
- package/dist/core/runtime.js.map +1 -0
- package/dist/core/setup-api-client.d.ts.map +1 -1
- package/dist/core/setup-api-client.js +11 -7
- package/dist/core/setup-api-client.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
npm-пакет с TypeScript-типами и функциями HTTP-запросов к API.
|
|
4
4
|
|
|
5
|
-
Axios устанавливается автоматически как зависимость пакета. Базовый URL API задаётся через
|
|
5
|
+
Axios устанавливается автоматически как зависимость пакета. Базовый URL API задаётся через `BASE_API_URL` на глобальном объекте: **`window`** (браузер) или **`global`** / `globalThis` (Node.js, тесты).
|
|
6
6
|
|
|
7
7
|
## Содержание
|
|
8
8
|
|
|
9
9
|
- [Установка](#установка)
|
|
10
10
|
- [Быстрый старт](#быстрый-старт)
|
|
11
|
-
- [window
|
|
11
|
+
- [BASE_API_URL (window / global)](#base_api_url-window--global)
|
|
12
12
|
- [Способы инициализации](#способы-инициализации)
|
|
13
13
|
- [Использование API-функций](#использование-api-функций)
|
|
14
14
|
- [TypeScript](#typescript)
|
|
@@ -29,10 +29,14 @@ npm install @space-ai/contracts
|
|
|
29
29
|
|
|
30
30
|
## Быстрый старт
|
|
31
31
|
|
|
32
|
-
**1.** Задайте базовый URL API
|
|
32
|
+
**1.** Задайте базовый URL API:
|
|
33
33
|
|
|
34
34
|
```typescript
|
|
35
|
+
// браузер
|
|
35
36
|
window.BASE_API_URL = 'https://api.example.com';
|
|
37
|
+
|
|
38
|
+
// Node.js / тесты
|
|
39
|
+
global.BASE_API_URL = 'http://localhost:3000';
|
|
36
40
|
```
|
|
37
41
|
|
|
38
42
|
**2.** Подключите автоинициализацию axios (один раз в точке входа):
|
|
@@ -49,23 +53,27 @@ import { getUser } from '@space-ai/contracts';
|
|
|
49
53
|
const user = await getUser(1);
|
|
50
54
|
```
|
|
51
55
|
|
|
52
|
-
Axios создаётся с `baseURL:
|
|
56
|
+
Axios создаётся с `baseURL: BASE_API_URL`, сохраняется в `window.axios` / `global.axios` и используется всеми API-функциями.
|
|
53
57
|
|
|
54
58
|
---
|
|
55
59
|
|
|
56
|
-
## window
|
|
60
|
+
## BASE_API_URL (window / global)
|
|
61
|
+
|
|
62
|
+
Пакет читает и пишет одни и те же поля на `globalThis` — в браузере это `window`, в Node.js — `global`.
|
|
57
63
|
|
|
58
64
|
| Свойство | Тип | Описание |
|
|
59
65
|
|----------|-----|----------|
|
|
60
|
-
| `
|
|
61
|
-
| `
|
|
66
|
+
| `BASE_API_URL` | `string` | Базовый URL API → `axios.create({ baseURL })` |
|
|
67
|
+
| `axios` | `AxiosInstance` | Экземпляр axios (создаётся пакетом) |
|
|
62
68
|
|
|
63
|
-
|
|
69
|
+
Примеры:
|
|
64
70
|
|
|
65
71
|
```typescript
|
|
66
|
-
|
|
67
|
-
window.BASE_API_URL = '
|
|
68
|
-
|
|
72
|
+
// браузер
|
|
73
|
+
window.BASE_API_URL = '/api';
|
|
74
|
+
|
|
75
|
+
// Node.js, Vitest, Jest
|
|
76
|
+
global.BASE_API_URL = 'http://localhost:3000';
|
|
69
77
|
```
|
|
70
78
|
|
|
71
79
|
---
|
|
@@ -204,7 +212,7 @@ const created = await createUser({
|
|
|
204
212
|
Прямой доступ к axios (после инициализации):
|
|
205
213
|
|
|
206
214
|
```typescript
|
|
207
|
-
const client = window.axios
|
|
215
|
+
const client = globalThis.axios; // window.axios в браузере
|
|
208
216
|
await client.get('/health');
|
|
209
217
|
```
|
|
210
218
|
|
|
@@ -212,12 +220,12 @@ await client.get('/health');
|
|
|
212
220
|
|
|
213
221
|
## TypeScript
|
|
214
222
|
|
|
215
|
-
Пакет расширяет `
|
|
223
|
+
Пакет расширяет глобальную область (`global` / `window`):
|
|
216
224
|
|
|
217
225
|
```typescript
|
|
218
|
-
|
|
219
|
-
BASE_API_URL
|
|
220
|
-
axios
|
|
226
|
+
declare global {
|
|
227
|
+
var BASE_API_URL: string | undefined;
|
|
228
|
+
var axios: import('axios').AxiosInstance | undefined;
|
|
221
229
|
}
|
|
222
230
|
```
|
|
223
231
|
|
|
@@ -272,6 +280,6 @@ CI (`.github/workflows/publish.yml`) выполнит `npm publish` при те
|
|
|
272
280
|
|
|
273
281
|
| Симптом | Решение |
|
|
274
282
|
|---------|---------|
|
|
275
|
-
| `Axios не найден` | Задайте `window
|
|
283
|
+
| `Axios не найден` | Задайте `BASE_API_URL` на `window` / `global`, импортируйте `@space-ai/contracts/axios` или вызовите `setupApiClient()` |
|
|
276
284
|
| Запросы без baseURL | `BASE_API_URL` не был задан до инициализации — используйте **Способ 1** или **Способ 2** |
|
|
277
285
|
| Двойной axios | Не вызывайте и `setupApiClient()`, и `initApiClient()` с разными инстансами без необходимости |
|
package/dist/axios.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { enableAutoInit, setupApiClient } from './core/setup-api-client.js';
|
|
2
|
+
import { getBaseApiUrl } from './core/runtime.js';
|
|
2
3
|
enableAutoInit();
|
|
3
|
-
if (
|
|
4
|
+
if (getBaseApiUrl()) {
|
|
4
5
|
setupApiClient();
|
|
5
6
|
}
|
|
6
7
|
//# sourceMappingURL=axios.js.map
|
package/dist/axios.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"axios.js","sourceRoot":"","sources":["../src/axios.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"axios.js","sourceRoot":"","sources":["../src/axios.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,cAAc,EAAE,CAAC;AAEjB,IAAI,aAAa,EAAE,EAAE,CAAC;IACpB,cAAc,EAAE,CAAC;AACnB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"axios-instance.d.ts","sourceRoot":"","sources":["../../src/core/axios-instance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"axios-instance.d.ts","sourceRoot":"","sources":["../../src/core/axios-instance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAS3C,wBAAgB,QAAQ,IAAI,aAAa,CAoBxC;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAEnD;AAED,wBAAgB,UAAU,IAAI,IAAI,CAEjC"}
|
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
import { isAutoInitEnabled, setupApiClient } from './setup-api-client.js';
|
|
2
|
+
import { getBaseApiUrl, getRuntimeAxios } from './runtime.js';
|
|
2
3
|
import { getStoredAxios, resetStoredAxios, setStoredAxios, } from './state.js';
|
|
3
4
|
export function getAxios() {
|
|
4
5
|
let instance = getStoredAxios();
|
|
5
6
|
if (instance)
|
|
6
7
|
return instance;
|
|
7
|
-
if (isAutoInitEnabled() &&
|
|
8
|
+
if (isAutoInitEnabled() && getBaseApiUrl()) {
|
|
8
9
|
setupApiClient();
|
|
9
10
|
instance = getStoredAxios();
|
|
10
11
|
if (instance)
|
|
11
12
|
return instance;
|
|
12
13
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
const runtimeAxios = getRuntimeAxios();
|
|
15
|
+
if (runtimeAxios) {
|
|
16
|
+
setStoredAxios(runtimeAxios);
|
|
17
|
+
return runtimeAxios;
|
|
16
18
|
}
|
|
17
|
-
throw new Error('Axios не найден. Задайте
|
|
18
|
-
'вызовите setupApiClient() или initApiClient(axios)');
|
|
19
|
+
throw new Error('Axios не найден. Задайте global.BASE_API_URL / window.BASE_API_URL, ' +
|
|
20
|
+
'импортируйте @space-ai/contracts/axios, вызовите setupApiClient() или initApiClient(axios)');
|
|
19
21
|
}
|
|
20
22
|
export function setAxios(axios) {
|
|
21
23
|
setStoredAxios(axios);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"axios-instance.js","sourceRoot":"","sources":["../../src/core/axios-instance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,MAAM,UAAU,QAAQ;IACtB,IAAI,QAAQ,GAAG,cAAc,EAAE,CAAC;IAChC,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,IAAI,iBAAiB,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"axios-instance.js","sourceRoot":"","sources":["../../src/core/axios-instance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,MAAM,UAAU,QAAQ;IACtB,IAAI,QAAQ,GAAG,cAAc,EAAE,CAAC;IAChC,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,IAAI,iBAAiB,EAAE,IAAI,aAAa,EAAE,EAAE,CAAC;QAC3C,cAAc,EAAE,CAAC;QACjB,QAAQ,GAAG,cAAc,EAAE,CAAC;QAC5B,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;IAChC,CAAC;IAED,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,IAAI,YAAY,EAAE,CAAC;QACjB,cAAc,CAAC,YAAY,CAAC,CAAC;QAC7B,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,IAAI,KAAK,CACb,sEAAsE;QACpE,4FAA4F,CAC/F,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAoB;IAC3C,cAAc,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,gBAAgB,EAAE,CAAC;AACrB,CAAC"}
|
package/dist/core/init.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/core/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/core/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAI3C,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,IAAI,CAazD"}
|
package/dist/core/init.js
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { setAxios } from './axios-instance.js';
|
|
2
|
+
import { getRuntimeAxios } from './runtime.js';
|
|
2
3
|
export function initApiClient(axios) {
|
|
3
4
|
if (axios) {
|
|
4
5
|
setAxios(axios);
|
|
5
6
|
return;
|
|
6
7
|
}
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
const runtimeAxios = getRuntimeAxios();
|
|
9
|
+
if (runtimeAxios) {
|
|
10
|
+
setAxios(runtimeAxios);
|
|
9
11
|
return;
|
|
10
12
|
}
|
|
11
|
-
throw new Error('Не передан axios и нет window.axios');
|
|
13
|
+
throw new Error('Не передан axios и нет global.axios / window.axios');
|
|
12
14
|
}
|
|
13
15
|
//# sourceMappingURL=init.js.map
|
package/dist/core/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/core/init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,MAAM,UAAU,aAAa,CAAC,KAAqB;IACjD,IAAI,KAAK,EAAE,CAAC;QACV,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/core/init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,UAAU,aAAa,CAAC,KAAqB;IACjD,IAAI,KAAK,EAAE,CAAC;QACV,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,IAAI,YAAY,EAAE,CAAC;QACjB,QAAQ,CAAC,YAAY,CAAC,CAAC;QACvB,OAAO;IACT,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AxiosInstance } from 'axios';
|
|
2
|
+
/** Браузер (`window`) или Node.js (`global` / `globalThis`). */
|
|
3
|
+
export declare function getRuntime(): typeof globalThis | undefined;
|
|
4
|
+
export declare function getBaseApiUrl(): string | undefined;
|
|
5
|
+
export declare function getRuntimeAxios(): AxiosInstance | undefined;
|
|
6
|
+
export declare function setRuntimeAxios(instance: AxiosInstance): void;
|
|
7
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/core/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,gEAAgE;AAChE,wBAAgB,UAAU,IAAI,OAAO,UAAU,GAAG,SAAS,CAK1D;AAED,wBAAgB,aAAa,IAAI,MAAM,GAAG,SAAS,CAElD;AAED,wBAAgB,eAAe,IAAI,aAAa,GAAG,SAAS,CAE3D;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAK7D"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** Браузер (`window`) или Node.js (`global` / `globalThis`). */
|
|
2
|
+
export function getRuntime() {
|
|
3
|
+
if (typeof globalThis !== 'undefined') {
|
|
4
|
+
return globalThis;
|
|
5
|
+
}
|
|
6
|
+
return undefined;
|
|
7
|
+
}
|
|
8
|
+
export function getBaseApiUrl() {
|
|
9
|
+
return getRuntime()?.BASE_API_URL;
|
|
10
|
+
}
|
|
11
|
+
export function getRuntimeAxios() {
|
|
12
|
+
return getRuntime()?.axios;
|
|
13
|
+
}
|
|
14
|
+
export function setRuntimeAxios(instance) {
|
|
15
|
+
const runtime = getRuntime();
|
|
16
|
+
if (runtime) {
|
|
17
|
+
runtime.axios = instance;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/core/runtime.ts"],"names":[],"mappings":"AAEA,gEAAgE;AAChE,MAAM,UAAU,UAAU;IACxB,IAAI,OAAO,UAAU,KAAK,WAAW,EAAE,CAAC;QACtC,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,UAAU,EAAE,EAAE,YAAY,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,UAAU,EAAE,EAAE,KAAK,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAuB;IACrD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC;IAC3B,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-api-client.d.ts","sourceRoot":"","sources":["../../src/core/setup-api-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setup-api-client.d.ts","sourceRoot":"","sources":["../../src/core/setup-api-client.ts"],"names":[],"mappings":"AAWA,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED,wBAAgB,cAAc,IAAI,IAAI,CA0BrC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import axios from 'axios';
|
|
2
|
+
import { getBaseApiUrl, getRuntime, getRuntimeAxios, setRuntimeAxios, } from './runtime.js';
|
|
2
3
|
import { setStoredAxios } from './state.js';
|
|
3
4
|
let autoInitEnabled = false;
|
|
4
5
|
export function enableAutoInit() {
|
|
@@ -8,20 +9,23 @@ export function isAutoInitEnabled() {
|
|
|
8
9
|
return autoInitEnabled;
|
|
9
10
|
}
|
|
10
11
|
export function setupApiClient() {
|
|
11
|
-
|
|
12
|
+
const runtime = getRuntime();
|
|
13
|
+
if (!runtime) {
|
|
12
14
|
setStoredAxios(axios.create());
|
|
13
15
|
return;
|
|
14
16
|
}
|
|
15
|
-
const baseURL =
|
|
17
|
+
const baseURL = getBaseApiUrl();
|
|
16
18
|
if (!baseURL) {
|
|
17
|
-
console.warn('@space-ai/contracts:
|
|
19
|
+
console.warn('@space-ai/contracts: BASE_API_URL не задан (global / window) — axios создаётся без baseURL');
|
|
18
20
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
let instance = getRuntimeAxios();
|
|
22
|
+
if (!instance) {
|
|
23
|
+
instance = axios.create({ baseURL });
|
|
24
|
+
setRuntimeAxios(instance);
|
|
21
25
|
}
|
|
22
26
|
else if (baseURL) {
|
|
23
|
-
|
|
27
|
+
instance.defaults.baseURL = baseURL;
|
|
24
28
|
}
|
|
25
|
-
setStoredAxios(
|
|
29
|
+
setStoredAxios(instance);
|
|
26
30
|
}
|
|
27
31
|
//# sourceMappingURL=setup-api-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-api-client.js","sourceRoot":"","sources":["../../src/core/setup-api-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,IAAI,eAAe,GAAG,KAAK,CAAC;AAE5B,MAAM,UAAU,cAAc;IAC5B,eAAe,GAAG,IAAI,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,
|
|
1
|
+
{"version":3,"file":"setup-api-client.js","sourceRoot":"","sources":["../../src/core/setup-api-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,aAAa,EACb,UAAU,EACV,eAAe,EACf,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,IAAI,eAAe,GAAG,KAAK,CAAC;AAE5B,MAAM,UAAU,cAAc;IAC5B,eAAe,GAAG,IAAI,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,cAAc,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAEhC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,4FAA4F,CAC7F,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,GAAG,eAAe,EAAE,CAAC;IAEjC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QACrC,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;SAAM,IAAI,OAAO,EAAE,CAAC;QACnB,QAAQ,CAAC,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;IACtC,CAAC;IAED,cAAc,CAAC,QAAQ,CAAC,CAAC;AAC3B,CAAC"}
|