wooks 0.0.1-beta.3 → 0.0.1-beta.5

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 CHANGED
@@ -306,6 +306,16 @@ app.get('test', async () => {
306
306
  })
307
307
  ```
308
308
 
309
+ Another hook for set header
310
+
311
+ ```js
312
+ import { useRespHeader } from 'wooks'
313
+ app.get('test', async () => {
314
+ const server = useRespHeader('server')
315
+ server.value = 'myServer v1.0'
316
+ })
317
+ ```
318
+
309
319
  ### Response Cookies (Set-Cookie)
310
320
 
311
321
  A function `useSetCookies` provides variety of set-cookie helpers:
@@ -332,6 +342,25 @@ app.get('test', async () => {
332
342
  })
333
343
  ```
334
344
 
345
+ Another hook for set-cookie
346
+
347
+ ```js
348
+ import { useRespCookie } from 'wooks'
349
+ app.get('test', async () => {
350
+ const session = useRespCookie('session')
351
+ session.value = 'value'
352
+ session.attrs = {
353
+ expires: '2029-01-01', // Date | string | number;
354
+ maxAge: '1h', // number | TProstoTimeMultiString;
355
+ domain: 'my-domain', // string;
356
+ path: '/home', // string;
357
+ secure: true, // boolean;
358
+ httpOnly: false, // boolean;
359
+ sameSite: true, // boolean | 'Lax' | 'None' | 'Strict';
360
+ }
361
+ })
362
+ ```
363
+
335
364
  ### Response Status
336
365
 
337
366
  It's possible to control the response status via `status` function that is available in `useResponse()`
@@ -346,6 +375,16 @@ app.get('test', async () => {
346
375
  })
347
376
  ```
348
377
 
378
+ Another status hook:
379
+ ```js
380
+ import { useStatus } from 'wooks'
381
+ app.get('test', async () => {
382
+ const status = useStatus()
383
+ status.value = 201
384
+ return 'response with status 201'
385
+ })
386
+ ```
387
+
349
388
  ### Cache-Control
350
389
 
351
390
  `useSetCacheControl` function provides helpers for headers responsible for cache control
@@ -376,6 +415,59 @@ app.get('static/*', () => {
376
415
  })
377
416
  ```
378
417
 
418
+ ### Proxy Requests
419
+
420
+ Wooks provides support for proxy request/response
421
+
422
+ ```js
423
+ import { useProxy } from 'wooks'
424
+ //...
425
+ app.get('*', async () => {
426
+ const proxy = useProxy()
427
+ const { getRouteParam } = useRouteParams()
428
+ const result = await proxy('https://www.google.com', {
429
+ // target url path
430
+ path: getRouteParam('*'),
431
+
432
+ // passReqHeaders: true - to enable req headers to pass
433
+ passReqHeaders: true,
434
+
435
+ // list of blocked req headers
436
+ blockReqHeaders: ['referer'],
437
+
438
+ // passResCookies: true - pass all the cookies to the response
439
+ // passResCookies: string[] - pass only specific cookies
440
+ // to the response
441
+ passResCookies: true,
442
+
443
+ // debug: true - to see proxy debug info
444
+ debug: false,
445
+
446
+ // optional method (GET, POST, ...)
447
+ // by default the same as the original request's method
448
+ method: 'GET',
449
+
450
+ // reqHeaders - to specify additional headers of the req
451
+ reqHeaders: { 'custom-header': 'value' },
452
+
453
+ // passReqCookies: true - pass all the cookies to the request
454
+ // passReqCookies: string[] - pass only specific cookies
455
+ // to the response
456
+ passReqCookies: true
457
+
458
+ // custom host header
459
+ // by default same as target host
460
+ host: 'customhost.com'
461
+ })
462
+ return result // body as a stream
463
+ //
464
+ // to return buffered body use asUint8Array or asText methods:
465
+ // return result && result.asUint8Array()
466
+ // return result && result.asText()
467
+ })
468
+ //...
469
+ ```
470
+
379
471
  ### Serve File (Serve-Static)
380
472
 
381
473
  Function `serveFile` returns a readable stream and prepares all the neccessary response headers (like content-length, content-type etc).
@@ -5,7 +5,7 @@ export declare function useSetHeaders(): {
5
5
  setHeader: (name: string, value: string | number) => void;
6
6
  removeHeader: (name: string) => void;
7
7
  setContentType: (value: string) => void;
8
- headers: Record<string, string>;
8
+ headers: Record<string, string | string[]>;
9
9
  enableCors: (origin?: string) => void;
10
10
  };
11
11
  //# sourceMappingURL=headers.d.ts.map
@@ -9,4 +9,5 @@ export * from './body';
9
9
  export * from './core-test';
10
10
  export { useCurrentWooksContext, useCacheObject, clearCacheObject, } from './core';
11
11
  export * from './hooks';
12
+ export * from './proxy';
12
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/composables/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,wBAAwB,CAAA;AACtC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,QAAQ,CAAA;AACtB,cAAc,aAAa,CAAA;AAC3B,OAAO,EACH,sBAAsB,EACtB,cAAc,EACd,gBAAgB,GACnB,MAAM,QAAQ,CAAA;AACf,cAAc,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/composables/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,wBAAwB,CAAA;AACtC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,QAAQ,CAAA;AACtB,cAAc,aAAa,CAAA;AAC3B,OAAO,EACH,sBAAsB,EACtB,cAAc,EACd,gBAAgB,GACnB,MAAM,QAAQ,CAAA;AACf,cAAc,SAAS,CAAA;AACvB,cAAc,SAAS,CAAA"}
@@ -0,0 +1,17 @@
1
+ export declare function useProxy(): (targetHost: string, opts?: TWooksProxyOptions) => Promise<TWooksProxyResponse | undefined>;
2
+ export interface TWooksProxyResponse extends ReadableStream<Uint8Array> {
3
+ asUint8Array(): Promise<Uint8Array>;
4
+ asText(): Promise<string>;
5
+ }
6
+ export interface TWooksProxyOptions {
7
+ path?: string;
8
+ method?: string;
9
+ reqHeaders?: Record<string, string>;
10
+ passReqHeaders?: boolean | string[];
11
+ blockReqHeaders?: string[];
12
+ passReqCookies?: boolean | string[];
13
+ passResCookies?: boolean | string[];
14
+ host?: string;
15
+ debug?: boolean;
16
+ }
17
+ //# sourceMappingURL=proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../../src/composables/proxy.ts"],"names":[],"mappings":"AAMA,wBAAgB,QAAQ,iBAMoB,MAAM,SAAS,kBAAkB,KAAG,QAAQ,mBAAmB,GAAG,SAAS,CAAC,CAyGvH;AAED,MAAM,WAAW,mBAAoB,SAAQ,cAAc,CAAC,UAAU,CAAC;IACnE,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC,CAAA;IACnC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;CAC5B;AAED,MAAM,WAAW,kBAAkB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,EAAE,CAAA;IACnC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,EAAE,CAAA;IACnC,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,EAAE,CAAA;IACnC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,OAAO,CAAA;CAClB"}
@@ -24,7 +24,7 @@ export declare class BaseWooksResponse<BodyType = unknown> {
24
24
  setHeader(name: string, value: string): this;
25
25
  getHeader(name: string): string | string[];
26
26
  protected mergeHeaders(): this;
27
- protected mergeStatus(renderedBody: string): this;
27
+ protected mergeStatus(renderedBody: string | Uint8Array): this;
28
28
  respond(): void;
29
29
  }
30
30
  //# sourceMappingURL=core.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/response/core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAEtD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,OAAO,EAAgB,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAErE,OAAO,EAAsB,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAY1E,qBAAa,iBAAiB,CAAC,QAAQ,GAAG,OAAO;IACjC,SAAS,CAAC,QAAQ,EAAE,yBAAyB;gBAAnC,QAAQ,GAAE,yBAAwC;IAExE,SAAS,CAAC,OAAO,EAAE,eAAe,CAAI;IAEtC,SAAS,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAA;IAE1B,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAK;IAE1D,IAAI,MAAM,IAIQ,eAAe,CAFhC;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,eAAe,EAEhC;IAED,IAAI,IAAI,IAIQ,QAAQ,GAAG,SAAS,CAFnC;IAED,IAAI,IAAI,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,EAEnC;IAED,SAAS,CAAC,KAAK,EAAE,eAAe;IAKhC,OAAO,CAAC,KAAK,EAAE,QAAQ;IAKvB,cAAc;IAId,cAAc,CAAC,KAAK,EAAE,MAAM;IAK5B,UAAU,CAAC,MAAM,GAAE,MAAY;IAK/B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC;IAMzE,eAAe,CAAC,IAAI,EAAE,aAAa;IAInC,YAAY,CAAC,QAAQ,EAAE,MAAM;IAM7B,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAKlC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAIrC,SAAS,CAAC,IAAI,EAAE,MAAM;IAItB,SAAS,CAAC,YAAY;IAmBtB,SAAS,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM;IAS1C,OAAO;CAuCV"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/response/core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAEtD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,OAAO,EAAgB,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAErE,OAAO,EAAsB,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAY1E,qBAAa,iBAAiB,CAAC,QAAQ,GAAG,OAAO;IACjC,SAAS,CAAC,QAAQ,EAAE,yBAAyB;gBAAnC,QAAQ,GAAE,yBAAwC;IAExE,SAAS,CAAC,OAAO,EAAE,eAAe,CAAI;IAEtC,SAAS,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAA;IAE1B,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAK;IAE1D,IAAI,MAAM,IAIQ,eAAe,CAFhC;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,eAAe,EAEhC;IAED,IAAI,IAAI,IAIQ,QAAQ,GAAG,SAAS,CAFnC;IAED,IAAI,IAAI,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,EAEnC;IAED,SAAS,CAAC,KAAK,EAAE,eAAe;IAKhC,OAAO,CAAC,KAAK,EAAE,QAAQ;IAKvB,cAAc;IAId,cAAc,CAAC,KAAK,EAAE,MAAM;IAK5B,UAAU,CAAC,MAAM,GAAE,MAAY;IAK/B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC;IAMzE,eAAe,CAAC,IAAI,EAAE,aAAa;IAInC,YAAY,CAAC,QAAQ,EAAE,MAAM;IAM7B,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAKlC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAIrC,SAAS,CAAC,IAAI,EAAE,MAAM;IAItB,SAAS,CAAC,YAAY;IAoBtB,SAAS,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,UAAU;IASvD,OAAO;CAqDV"}
@@ -1,8 +1,8 @@
1
1
  import { BaseWooksResponse } from './core';
2
2
  export declare class BaseWooksResponseRenderer<T = unknown> implements TWooksResponseRenderer<T> {
3
- render(response: BaseWooksResponse<T>): string;
3
+ render(response: BaseWooksResponse<T>): string | Uint8Array;
4
4
  }
5
5
  export interface TWooksResponseRenderer<T = unknown> {
6
- render: (response: BaseWooksResponse<T>) => string;
6
+ render: (response: BaseWooksResponse<T>) => string | Uint8Array;
7
7
  }
8
8
  //# sourceMappingURL=renderer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../../src/response/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AAI1C,qBAAa,yBAAyB,CAAC,CAAC,GAAG,OAAO,CAAE,YAAW,sBAAsB,CAAC,CAAC,CAAC;IACpF,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,MAAM;CAcjD;AAED,MAAM,WAAW,sBAAsB,CAAC,CAAC,GAAG,OAAO;IAC/C,MAAM,EAAE,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,MAAM,CAAA;CACrD"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../../src/response/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AAI1C,qBAAa,yBAAyB,CAAC,CAAC,GAAG,OAAO,CAAE,YAAW,sBAAsB,CAAC,CAAC,CAAC;IACpF,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,UAAU;CAiB9D;AAED,MAAM,WAAW,sBAAsB,CAAC,CAAC,GAAG,OAAO;IAC/C,MAAM,EAAE,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,UAAU,CAAA;CAClE"}
@@ -0,0 +1,5 @@
1
+ export declare function log(text: string): void;
2
+ export declare function logBright(text: string): void;
3
+ export declare function warn(text: string): void;
4
+ export declare function logError(error: string): void;
5
+ //# sourceMappingURL=log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../../src/utils/log.ts"],"names":[],"mappings":"AAGA,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,QAE/B;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,QAErC;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,QAEhC;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,QAErC"}
@@ -8,6 +8,7 @@ export declare class Wooks {
8
8
  protected server?: Server;
9
9
  protected _uncoughtExceptionHandler: (error: Error) => void;
10
10
  constructor(options?: TWooksOptions | undefined);
11
+ getRouter(): ProstoRouter<TWooksHandler<unknown>>;
11
12
  listen(port: number): Promise<void>;
12
13
  listen(port: number, cb: () => void): Promise<void>;
13
14
  listen(port: number, hostname: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"wooks.d.ts","sourceRoot":"","sources":["../../src/wooks.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpG,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,MAAM,CAAA;AAK9D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAItD,qBAAa,KAAK;IAOF,OAAO,CAAC,OAAO,CAAC;IAN5B,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC,aAAa,CAAC,CAAA;IAE7C,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IAEzB,SAAS,CAAC,yBAAyB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;gBAEvC,OAAO,CAAC,2BAAe;IAOpC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAEnC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAEnD,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAErD,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BrE,KAAK;IAUZ,SAAS,CAAC,cAAc,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc;cAiClD,eAAe,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,mBAAmB,CAAC,aAAa,CAAC;IA0BpH,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK;IAO3C,GAAG,CAAC,OAAO,GAAG,OAAO,EAAE,UAAU,GAAG,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC;IAKpG,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,UAAU,GAAG,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC;IAIrG,GAAG,CAAC,OAAO,GAAG,OAAO,EAAE,UAAU,GAAG,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC;IAIpG,MAAM,CAAC,OAAO,GAAG,OAAO,EAAE,UAAU,GAAG,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC;IAIvG,KAAK,CAAC,OAAO,GAAG,OAAO,EAAE,UAAU,GAAG,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC;IAItG,EAAE,CAAC,OAAO,GAAG,OAAO,EAAE,UAAU,GAAG,iBAAiB,EAAE,MAAM,EAAE,WAAW,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC;CAGjI"}
1
+ {"version":3,"file":"wooks.d.ts","sourceRoot":"","sources":["../../src/wooks.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpG,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,MAAM,CAAA;AAK9D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAItD,qBAAa,KAAK;IAOF,OAAO,CAAC,OAAO,CAAC;IAN5B,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC,aAAa,CAAC,CAAA;IAE7C,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IAEzB,SAAS,CAAC,yBAAyB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;gBAEvC,OAAO,CAAC,2BAAe;IAOpC,SAAS;IAIT,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAEnC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAEnD,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAErD,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BrE,KAAK;IAUZ,SAAS,CAAC,cAAc,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc;cAiClD,eAAe,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,mBAAmB,CAAC,aAAa,CAAC;IA0BpH,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK;IAO3C,GAAG,CAAC,OAAO,GAAG,OAAO,EAAE,UAAU,GAAG,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC;IAKpG,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,UAAU,GAAG,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC;IAIrG,GAAG,CAAC,OAAO,GAAG,OAAO,EAAE,UAAU,GAAG,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC;IAIpG,MAAM,CAAC,OAAO,GAAG,OAAO,EAAE,UAAU,GAAG,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC;IAIvG,KAAK,CAAC,OAAO,GAAG,OAAO,EAAE,UAAU,GAAG,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC;IAItG,EAAE,CAAC,OAAO,GAAG,OAAO,EAAE,UAAU,GAAG,iBAAiB,EAAE,MAAM,EAAE,WAAW,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC;CAGjI"}