next-formatter 2.0.5 → 2.2.0
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 +23 -7
- package/dist/cjs/server.js +2 -20
- package/dist/esm/server.mjs +3 -20
- package/dist/types/client.d.ts +1 -10
- package/dist/types/core.d.ts +0 -1
- package/dist/types/create.d.ts +0 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/server.d.ts +0 -57
- package/package.json +1 -10
- package/dist/types/client.d.ts.map +0 -1
- package/dist/types/core.d.ts.map +0 -1
- package/dist/types/create.d.ts.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/server.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# next-formatter
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A universal formatter for numbers, currency, dates, and relative time - built for Next.js App Router, supporting **server components**, **client components**, and **Node.js backends**.
|
|
4
4
|
|
|
5
5
|
[→ View Full Documentation](https://gauravgorade.github.io/next-formatter/)
|
|
6
6
|
|
|
@@ -32,20 +32,36 @@ export const getFormatter = () => _getFormatter(config);
|
|
|
32
32
|
|
|
33
33
|
## 1. Add the Provider
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
Create a client wrapper component and add it to your root layout.
|
|
36
36
|
|
|
37
|
-
**app/
|
|
37
|
+
**app/providers/formatter-provider.tsx**
|
|
38
38
|
```tsx
|
|
39
|
-
|
|
39
|
+
"use client";
|
|
40
|
+
|
|
41
|
+
import { FormattersProvider } from "next-formatter/client";
|
|
40
42
|
import { formatterConfig } from "@/lib/formatter";
|
|
43
|
+
import { ReactNode } from "react";
|
|
44
|
+
|
|
45
|
+
export function AppFormattersProvider({ children }: { children: ReactNode }) {
|
|
46
|
+
return (
|
|
47
|
+
<FormattersProvider config={formatterConfig}>
|
|
48
|
+
{children}
|
|
49
|
+
</FormattersProvider>
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**app/layout.tsx**
|
|
55
|
+
```tsx
|
|
56
|
+
import { AppFormattersProvider } from "@/app/providers/formatter-provider";
|
|
41
57
|
|
|
42
|
-
export default
|
|
58
|
+
export default function RootLayout({ children }: { children: React.ReactNode }) {
|
|
43
59
|
return (
|
|
44
60
|
<html lang="en">
|
|
45
61
|
<body>
|
|
46
|
-
<
|
|
62
|
+
<AppFormattersProvider>
|
|
47
63
|
{children}
|
|
48
|
-
</
|
|
64
|
+
</AppFormattersProvider>
|
|
49
65
|
</body>
|
|
50
66
|
</html>
|
|
51
67
|
);
|
package/dist/cjs/server.js
CHANGED
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var react = require('react');
|
|
4
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
-
|
|
6
|
-
// src/client.tsx
|
|
7
|
-
|
|
8
3
|
// src/core.ts
|
|
9
4
|
var DEFAULT_RULES = {
|
|
10
5
|
compactThreshold: 1e4,
|
|
@@ -199,15 +194,6 @@ function createFormatters(config = {}) {
|
|
|
199
194
|
};
|
|
200
195
|
return formatters;
|
|
201
196
|
}
|
|
202
|
-
var FormatterContext = react.createContext(null);
|
|
203
|
-
function FormattersProvider({ config, children }) {
|
|
204
|
-
const formatters = react.useMemo(
|
|
205
|
-
() => createFormatters(config),
|
|
206
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
207
|
-
[config.locale, config.currency, config.fallback, JSON.stringify(config.rules)]
|
|
208
|
-
);
|
|
209
|
-
return /* @__PURE__ */ jsxRuntime.jsx(FormatterContext.Provider, { value: formatters, children });
|
|
210
|
-
}
|
|
211
197
|
|
|
212
198
|
// src/create.ts
|
|
213
199
|
async function resolveLocale(resolver, defaultLocale) {
|
|
@@ -231,11 +217,8 @@ async function resolveCurrency(resolver, defaultCurrency) {
|
|
|
231
217
|
if (resolved) return resolved;
|
|
232
218
|
return defaultCurrency ?? "USD";
|
|
233
219
|
}
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
const currency = await resolveCurrency(config.getCurrency, config.currency);
|
|
237
|
-
return /* @__PURE__ */ jsxRuntime.jsx(FormattersProvider, { config: { locale, currency, fallback: config.fallback, rules: config.rules }, children });
|
|
238
|
-
}
|
|
220
|
+
|
|
221
|
+
// src/server.tsx
|
|
239
222
|
async function getFormatter(config = {}) {
|
|
240
223
|
const locale = await resolveLocale(config.getLocale, config.locale);
|
|
241
224
|
const currency = await resolveCurrency(config.getCurrency, config.currency);
|
|
@@ -247,5 +230,4 @@ async function getFormatter(config = {}) {
|
|
|
247
230
|
});
|
|
248
231
|
}
|
|
249
232
|
|
|
250
|
-
exports.NextFormatterProvider = NextFormatterProvider;
|
|
251
233
|
exports.getFormatter = getFormatter;
|
package/dist/esm/server.mjs
CHANGED
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
import { createContext, useMemo } from 'react';
|
|
2
|
-
import { jsx } from 'react/jsx-runtime';
|
|
3
|
-
|
|
4
|
-
// src/client.tsx
|
|
5
|
-
|
|
6
1
|
// src/core.ts
|
|
7
2
|
var DEFAULT_RULES = {
|
|
8
3
|
compactThreshold: 1e4,
|
|
@@ -197,15 +192,6 @@ function createFormatters(config = {}) {
|
|
|
197
192
|
};
|
|
198
193
|
return formatters;
|
|
199
194
|
}
|
|
200
|
-
var FormatterContext = createContext(null);
|
|
201
|
-
function FormattersProvider({ config, children }) {
|
|
202
|
-
const formatters = useMemo(
|
|
203
|
-
() => createFormatters(config),
|
|
204
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
205
|
-
[config.locale, config.currency, config.fallback, JSON.stringify(config.rules)]
|
|
206
|
-
);
|
|
207
|
-
return /* @__PURE__ */ jsx(FormatterContext.Provider, { value: formatters, children });
|
|
208
|
-
}
|
|
209
195
|
|
|
210
196
|
// src/create.ts
|
|
211
197
|
async function resolveLocale(resolver, defaultLocale) {
|
|
@@ -229,11 +215,8 @@ async function resolveCurrency(resolver, defaultCurrency) {
|
|
|
229
215
|
if (resolved) return resolved;
|
|
230
216
|
return defaultCurrency ?? "USD";
|
|
231
217
|
}
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
const currency = await resolveCurrency(config.getCurrency, config.currency);
|
|
235
|
-
return /* @__PURE__ */ jsx(FormattersProvider, { config: { locale, currency, fallback: config.fallback, rules: config.rules }, children });
|
|
236
|
-
}
|
|
218
|
+
|
|
219
|
+
// src/server.tsx
|
|
237
220
|
async function getFormatter(config = {}) {
|
|
238
221
|
const locale = await resolveLocale(config.getLocale, config.locale);
|
|
239
222
|
const currency = await resolveCurrency(config.getCurrency, config.currency);
|
|
@@ -245,4 +228,4 @@ async function getFormatter(config = {}) {
|
|
|
245
228
|
});
|
|
246
229
|
}
|
|
247
230
|
|
|
248
|
-
export {
|
|
231
|
+
export { getFormatter };
|
package/dist/types/client.d.ts
CHANGED
|
@@ -4,17 +4,9 @@ interface FormattersProviderProps {
|
|
|
4
4
|
config: FormatterConfig;
|
|
5
5
|
}
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
7
|
+
* Client provider. Accepts a pre-resolved config object with plain
|
|
8
8
|
* string `locale` and `currency` values — no async resolvers.
|
|
9
9
|
*
|
|
10
|
-
* Prefer `<NextFormatterProvider>` in your root layout when you need dynamic
|
|
11
|
-
* config resolution (e.g. locale/currency from session, cookies, or headers).
|
|
12
|
-
* `NextFormatterProvider` resolves async config server-side and passes the
|
|
13
|
-
* result to this provider internally.
|
|
14
|
-
*
|
|
15
|
-
* Use `<FormattersProvider>` directly only when you already have resolved
|
|
16
|
-
* values, e.g. in Storybook, tests, or non-Next.js React apps.
|
|
17
|
-
*
|
|
18
10
|
* @example
|
|
19
11
|
* // layout.tsx
|
|
20
12
|
* import { FormattersProvider } from "next-formatter/client";
|
|
@@ -47,4 +39,3 @@ export declare function FormattersProvider({ config, children }: PropsWithChildr
|
|
|
47
39
|
*/
|
|
48
40
|
export declare function useFormatter(): Formatter;
|
|
49
41
|
export {};
|
|
50
|
-
//# sourceMappingURL=client.d.ts.map
|
package/dist/types/core.d.ts
CHANGED
package/dist/types/create.d.ts
CHANGED
|
@@ -43,4 +43,3 @@ export type NextFormatterConfig = {
|
|
|
43
43
|
};
|
|
44
44
|
export declare function resolveLocale(resolver: (() => string | undefined | Promise<string | undefined>) | undefined, defaultLocale: string | undefined): Promise<string>;
|
|
45
45
|
export declare function resolveCurrency(resolver: (() => string | undefined | Promise<string | undefined>) | undefined, defaultCurrency: string | undefined): Promise<string>;
|
|
46
|
-
//# sourceMappingURL=create.d.ts.map
|
package/dist/types/index.d.ts
CHANGED
package/dist/types/server.d.ts
CHANGED
|
@@ -1,61 +1,5 @@
|
|
|
1
|
-
import { type PropsWithChildren } from "react";
|
|
2
1
|
import { type Formatter } from "./core";
|
|
3
2
|
import { type NextFormatterConfig } from "./create";
|
|
4
|
-
/**
|
|
5
|
-
* Root provider for Next.js App Router. Place in `app/layout.tsx`.
|
|
6
|
-
*
|
|
7
|
-
* Async Server Component — resolves locale and currency server-side per request,
|
|
8
|
-
* then passes the resolved config to the client-side context. Zero client bundle cost.
|
|
9
|
-
*
|
|
10
|
-
* Resolution order for locale:
|
|
11
|
-
* 1. `getLocale()` resolver (session, db, cookie)
|
|
12
|
-
* 2. `locale` static value
|
|
13
|
-
* 3. `accept-language` request header
|
|
14
|
-
* 4. `"en-US"` default
|
|
15
|
-
*
|
|
16
|
-
* Resolution order for currency:
|
|
17
|
-
* 1. `getCurrency()` resolver (session, db, cookie)
|
|
18
|
-
* 2. `currency` static value
|
|
19
|
-
* 3. `"USD"` default
|
|
20
|
-
*
|
|
21
|
-
* @example
|
|
22
|
-
* // Zero config — locale auto-detected from accept-language header
|
|
23
|
-
* <NextFormatterProvider>{children}</NextFormatterProvider>
|
|
24
|
-
*
|
|
25
|
-
* @example
|
|
26
|
-
* // Static locale and currency
|
|
27
|
-
* <NextFormatterProvider config={{ locale: "de-DE", currency: "EUR" }}>
|
|
28
|
-
* {children}
|
|
29
|
-
* </NextFormatterProvider>
|
|
30
|
-
*
|
|
31
|
-
* @example
|
|
32
|
-
* // Dynamic locale and currency from session
|
|
33
|
-
* <NextFormatterProvider
|
|
34
|
-
* config={{
|
|
35
|
-
* getLocale: async () => (await auth())?.user?.locale,
|
|
36
|
-
* getCurrency: async () => (await auth())?.user?.currency,
|
|
37
|
-
* fallback: "N/A",
|
|
38
|
-
* rules: {
|
|
39
|
-
* compactThreshold: 50_000,
|
|
40
|
-
* currencyDisplay: "symbol",
|
|
41
|
-
* dateFormat: { year: "numeric", month: "long", day: "2-digit" },
|
|
42
|
-
* },
|
|
43
|
-
* }}
|
|
44
|
-
* >
|
|
45
|
-
* {children}
|
|
46
|
-
* </NextFormatterProvider>
|
|
47
|
-
*
|
|
48
|
-
* @example
|
|
49
|
-
* // Recommended — define config once in lib/formatter.ts, import everywhere
|
|
50
|
-
* import { formatterConfig } from "@/lib/formatter";
|
|
51
|
-
*
|
|
52
|
-
* <NextFormatterProvider config={formatterConfig}>
|
|
53
|
-
* {children}
|
|
54
|
-
* </NextFormatterProvider>
|
|
55
|
-
*/
|
|
56
|
-
export declare function NextFormatterProvider({ config, children }: PropsWithChildren<{
|
|
57
|
-
config?: NextFormatterConfig;
|
|
58
|
-
}>): Promise<import("react/jsx-runtime").JSX.Element>;
|
|
59
3
|
/**
|
|
60
4
|
* Use in Server Components or Server Actions.
|
|
61
5
|
* Locale is auto-detected from request headers — pass config only to override.
|
|
@@ -91,4 +35,3 @@ export declare function NextFormatterProvider({ config, children }: PropsWithChi
|
|
|
91
35
|
* const fmt = await getFormatter(formatterConfig);
|
|
92
36
|
*/
|
|
93
37
|
export declare function getFormatter(config?: NextFormatterConfig): Promise<Formatter>;
|
|
94
|
-
//# sourceMappingURL=server.d.ts.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "next-formatter",
|
|
3
|
-
"version": "2.0
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"description": "A universal formatter for numbers, currency, dates, and relative time — built for Next.js App Router, supporting server components, client components, and Node.js backends.",
|
|
5
5
|
"author": "gauravgorade",
|
|
6
6
|
"license": "MIT",
|
|
@@ -86,14 +86,5 @@
|
|
|
86
86
|
"tsup": "^8.0.0",
|
|
87
87
|
"typescript": "^5.0.0",
|
|
88
88
|
"vitest": "^3.0.0"
|
|
89
|
-
},
|
|
90
|
-
"peerDependencies": {
|
|
91
|
-
"next": ">=14.0.0",
|
|
92
|
-
"react": ">=18.3.0"
|
|
93
|
-
},
|
|
94
|
-
"peerDependenciesMeta": {
|
|
95
|
-
"next": {
|
|
96
|
-
"optional": true
|
|
97
|
-
}
|
|
98
89
|
}
|
|
99
90
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAsC,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AACnF,OAAO,EAAoB,KAAK,SAAS,EAAE,KAAK,eAAe,EAAE,MAAM,QAAQ,CAAC;AAIhF,UAAU,uBAAuB;IAC/B,MAAM,EAAE,eAAe,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,iBAAiB,CAAC,uBAAuB,CAAC,2CAQlG;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAWxC"}
|
package/dist/types/core.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/core.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;AAC9D,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;AAIlE,MAAM,MAAM,aAAa,GAAG,IAAI,CAC9B,IAAI,CAAC,mBAAmB,EACtB,UAAU,GACV,uBAAuB,GACvB,uBAAuB,GACvB,0BAA0B,GAC1B,0BAA0B,GAC1B,sBAAsB,GACtB,aAAa,GACb,aAAa,CAChB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,aAAa,GAAG;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,QAAQ,GAAG,cAAc,GAAG,MAAM,GAAG,MAAM,CAAC;IAC9D,YAAY,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAClC,IAAI,CAAC,mBAAmB,EACxB,uBAAuB,GAAG,uBAAuB,GAAG,0BAA0B,GAAG,0BAA0B,GAAG,aAAa,CAC5H,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,qBAAqB,CAAC;AACrD,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,qBAAqB,CAAC;AAIzD,MAAM,MAAM,cAAc,GAAG;IAC3B,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,8DAA8D;IAC9D,eAAe,CAAC,EAAE,QAAQ,GAAG,cAAc,GAAG,MAAM,GAAG,MAAM,CAAC;IAC9D,kCAAkC;IAClC,UAAU,CAAC,EAAE,IAAI,CAAC,qBAAqB,CAAC;IACxC,sCAAsC;IACtC,cAAc,CAAC,EAAE,IAAI,CAAC,qBAAqB,CAAC;IAC5C,qEAAqE;IACrE,YAAY,CAAC,EAAE,aAAa,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,cAAc,CAAC;CACxB,CAAC;AAuBF,wBAAgB,gBAAgB,CAAC,MAAM,GAAE,eAAoB;IA4EzD;;;;;;OAMG;kBACW,YAAY,YAAW,aAAa,GAAQ,MAAM;IAkBhE;;;;;;;OAOG;oBACa,YAAY,YAAW,eAAe,GAAQ,MAAM;IAsBpE;;;;;;;;;OASG;sBACe,YAAY,YAAW,iBAAiB,GAAQ,MAAM;IAuBxE;;;;;OAKG;oBACa,YAAY,GAAG,MAAM;IAQrC;;;;;OAKG;gBACS,SAAS,YAAW,WAAW,GAAQ,MAAM;oBASzC,SAAS,YAAW,eAAe,GAAQ,MAAM;IAQjE;;;;;;;OAOG;wBACiB,SAAS,QAAO,MAAM,GAAgB,MAAM;EAsBnE;AAED,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,QAAQ,CAAC;AAEnF,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC;AAE3C,MAAM,MAAM,mBAAmB,GAAG;IAChC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,KAAK,CAAC,EAAE,cAAc,CAAC;IAEvB;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAEnE;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACtE,CAAC;AAIF,wBAAsB,aAAa,CACjC,QAAQ,EAAE,CAAC,MAAM,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,GAAG,SAAS,EAC9E,aAAa,EAAE,MAAM,GAAG,SAAS,GAChC,OAAO,CAAC,MAAM,CAAC,CAuBjB;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,CAAC,MAAM,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,GAAG,SAAS,EAC9E,eAAe,EAAE,MAAM,GAAG,SAAS,GAClC,OAAO,CAAC,MAAM,CAAC,CAIjB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,iBAAiB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACnL,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAE/C,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EAAkC,KAAK,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEpF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,wBAAsB,qBAAqB,CAAC,EAAE,MAAW,EAAE,QAAQ,EAAE,EAAE,iBAAiB,CAAC;IAAE,MAAM,CAAC,EAAE,mBAAmB,CAAA;CAAE,CAAC,oDAKzH;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAsB,YAAY,CAAC,MAAM,GAAE,mBAAwB,GAAG,OAAO,CAAC,SAAS,CAAC,CAUvF"}
|