@vielzeug/i18nit 2.0.0 → 3.0.1

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 (46) hide show
  1. package/README.md +145 -51
  2. package/dist/format.d.ts +54 -0
  3. package/dist/format.d.ts.map +1 -0
  4. package/dist/i18n.cjs +1 -1
  5. package/dist/i18n.cjs.map +1 -1
  6. package/dist/i18n.d.ts +5 -77
  7. package/dist/i18n.d.ts.map +1 -1
  8. package/dist/i18n.js +156 -202
  9. package/dist/i18n.js.map +1 -1
  10. package/dist/index.cjs +1 -1
  11. package/dist/index.d.ts +3 -3
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +2 -2
  14. package/dist/types.d.ts +62 -83
  15. package/dist/types.d.ts.map +1 -1
  16. package/package.json +11 -12
  17. package/dist/core.cjs +0 -2
  18. package/dist/core.cjs.map +0 -1
  19. package/dist/core.d.ts +0 -35
  20. package/dist/core.d.ts.map +0 -1
  21. package/dist/core.js +0 -53
  22. package/dist/core.js.map +0 -1
  23. package/dist/helpers.cjs +0 -2
  24. package/dist/helpers.cjs.map +0 -1
  25. package/dist/helpers.d.ts +0 -20
  26. package/dist/helpers.d.ts.map +0 -1
  27. package/dist/helpers.js +0 -47
  28. package/dist/helpers.js.map +0 -1
  29. package/dist/i18nit.cjs +0 -2
  30. package/dist/i18nit.cjs.map +0 -1
  31. package/dist/i18nit.d.ts +0 -3
  32. package/dist/i18nit.d.ts.map +0 -1
  33. package/dist/i18nit.js +0 -2
  34. package/dist/i18nit.js.map +0 -1
  35. package/dist/interpolate.cjs +0 -2
  36. package/dist/interpolate.cjs.map +0 -1
  37. package/dist/interpolate.d.ts +0 -11
  38. package/dist/interpolate.d.ts.map +0 -1
  39. package/dist/interpolate.js +0 -13
  40. package/dist/interpolate.js.map +0 -1
  41. package/dist/intl.cjs +0 -2
  42. package/dist/intl.cjs.map +0 -1
  43. package/dist/intl.d.ts +0 -16
  44. package/dist/intl.d.ts.map +0 -1
  45. package/dist/intl.js +0 -65
  46. package/dist/intl.js.map +0 -1
package/dist/intl.cjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"intl.cjs","names":[],"sources":["../src/intl.ts"],"sourcesContent":["import type { Locale, PluralForm } from './types';\n\n/* -------------------- Cache Container -------------------- */\n\n/** Holds all Intl formatter caches for one I18n instance — GC'd with the instance. */\nexport type IntlCaches = {\n dateFormat: Map<string, Intl.DateTimeFormat>;\n listFormat: Map<string, Intl.ListFormat>;\n numberFormat: Map<string, Intl.NumberFormat>;\n pluralRules: Map<string, Intl.PluralRules>;\n relativeTimeFormat: Map<string, Intl.RelativeTimeFormat>;\n};\n\nexport function makeIntlCaches(): IntlCaches {\n return {\n dateFormat: new Map(),\n listFormat: new Map(),\n numberFormat: new Map(),\n pluralRules: new Map(),\n relativeTimeFormat: new Map(),\n };\n}\n\n/* -------------------- Cache Helpers -------------------- */\n\nfunction intlFmt<F extends object>(cache: Map<string, F>, key: string, build: () => F): F {\n let fmt = cache.get(key);\n\n if (!fmt) {\n fmt = build();\n cache.set(key, fmt);\n }\n\n return fmt;\n}\n\n/**\n * Builds a stable string key for an Intl formatter cache.\n * Call this once per formatter construction path — not on every format call — so key\n * serialization cost is paid only on cache misses.\n */\nfunction intlKey(locale: string, options?: object): string {\n return options ? `${locale}:${JSON.stringify(options, Object.keys(options).sort())}` : locale;\n}\n\n/* -------------------- Format Functions -------------------- */\n\nexport function formatNumber(\n caches: IntlCaches,\n value: number,\n options: Intl.NumberFormatOptions | undefined,\n locale: Locale,\n): string {\n const key = intlKey(locale, options);\n\n try {\n return intlFmt(caches.numberFormat, key, () => new Intl.NumberFormat(locale, options)).format(value);\n } catch {\n return String(value);\n }\n}\n\nexport function formatDate(\n caches: IntlCaches,\n value: Date | number,\n options: Intl.DateTimeFormatOptions | undefined,\n locale: Locale,\n): string {\n const d = typeof value === 'number' ? new Date(value) : value;\n const key = intlKey(locale, options);\n\n try {\n return intlFmt(caches.dateFormat, key, () => new Intl.DateTimeFormat(locale, options)).format(d);\n } catch {\n return d.toString();\n }\n}\n\nexport function formatRelative(\n caches: IntlCaches,\n value: number,\n unit: Intl.RelativeTimeFormatUnit,\n options: Intl.RelativeTimeFormatOptions | undefined,\n locale: Locale,\n): string {\n const key = intlKey(locale, options);\n\n try {\n return intlFmt(caches.relativeTimeFormat, key, () => new Intl.RelativeTimeFormat(locale, options)).format(\n value,\n unit,\n );\n } catch {\n return String(value);\n }\n}\n\nexport function formatList(caches: IntlCaches, items: unknown[], locale: string, type: 'and' | 'or'): string {\n if (items.length === 0) return '';\n\n const stringItems = items.map(String);\n const intlType = type === 'and' ? 'conjunction' : 'disjunction';\n\n try {\n return intlFmt(\n caches.listFormat,\n `${locale}:${intlType}`,\n () => new Intl.ListFormat(locale, { style: 'long', type: intlType }),\n ).format(stringItems);\n } catch {\n // Fallback for environments without Intl.ListFormat\n if (stringItems.length === 1) return stringItems[0];\n\n if (stringItems.length === 2) return `${stringItems[0]} ${type} ${stringItems[1]}`;\n\n return `${stringItems.slice(0, -1).join(', ')} ${type} ${stringItems.at(-1)}`;\n }\n}\n\nexport function getPluralForm(caches: IntlCaches, locale: Locale, count: number): PluralForm {\n const n = Math.floor(Math.abs(count));\n\n try {\n return intlFmt(caches.pluralRules, locale, () => new Intl.PluralRules(locale)).select(n) as PluralForm;\n } catch {\n return n === 1 ? 'one' : 'other';\n }\n}\n"],"mappings":"AAaA,SAAgB,GAA6B,CAC3C,MAAO,CACL,WAAY,IAAI,IAChB,WAAY,IAAI,IAChB,aAAc,IAAI,IAClB,YAAa,IAAI,IACjB,mBAAoB,IAAI,IACzB,CAKH,SAAS,EAA0B,EAAuB,EAAa,EAAmB,CACxF,IAAI,EAAM,EAAM,IAAI,EAAI,CAOxB,OALK,IACH,EAAM,GAAO,CACb,EAAM,IAAI,EAAK,EAAI,EAGd,EAQT,SAAS,EAAQ,EAAgB,EAA0B,CACzD,OAAO,EAAU,GAAG,EAAO,GAAG,KAAK,UAAU,EAAS,OAAO,KAAK,EAAQ,CAAC,MAAM,CAAC,GAAK,EAKzF,SAAgB,EACd,EACA,EACA,EACA,EACQ,CACR,IAAM,EAAM,EAAQ,EAAQ,EAAQ,CAEpC,GAAI,CACF,OAAO,EAAQ,EAAO,aAAc,MAAW,IAAI,KAAK,aAAa,EAAQ,EAAQ,CAAC,CAAC,OAAO,EAAM,MAC9F,CACN,OAAO,OAAO,EAAM,EAIxB,SAAgB,EACd,EACA,EACA,EACA,EACQ,CACR,IAAM,EAAI,OAAO,GAAU,SAAW,IAAI,KAAK,EAAM,CAAG,EAClD,EAAM,EAAQ,EAAQ,EAAQ,CAEpC,GAAI,CACF,OAAO,EAAQ,EAAO,WAAY,MAAW,IAAI,KAAK,eAAe,EAAQ,EAAQ,CAAC,CAAC,OAAO,EAAE,MAC1F,CACN,OAAO,EAAE,UAAU,EAIvB,SAAgB,EACd,EACA,EACA,EACA,EACA,EACQ,CACR,IAAM,EAAM,EAAQ,EAAQ,EAAQ,CAEpC,GAAI,CACF,OAAO,EAAQ,EAAO,mBAAoB,MAAW,IAAI,KAAK,mBAAmB,EAAQ,EAAQ,CAAC,CAAC,OACjG,EACA,EACD,MACK,CACN,OAAO,OAAO,EAAM,EAIxB,SAAgB,EAAW,EAAoB,EAAkB,EAAgB,EAA4B,CAC3G,GAAI,EAAM,SAAW,EAAG,MAAO,GAE/B,IAAM,EAAc,EAAM,IAAI,OAAO,CAC/B,EAAW,IAAS,MAAQ,cAAgB,cAElD,GAAI,CACF,OAAO,EACL,EAAO,WACP,GAAG,EAAO,GAAG,QACP,IAAI,KAAK,WAAW,EAAQ,CAAE,MAAO,OAAQ,KAAM,EAAU,CAAC,CACrE,CAAC,OAAO,EAAY,MACf,CAMN,OAJI,EAAY,SAAW,EAAU,EAAY,GAE7C,EAAY,SAAW,EAAU,GAAG,EAAY,GAAG,GAAG,EAAK,GAAG,EAAY,KAEvE,GAAG,EAAY,MAAM,EAAG,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,EAAK,GAAG,EAAY,GAAG,GAAG,IAI/E,SAAgB,EAAc,EAAoB,EAAgB,EAA2B,CAC3F,IAAM,EAAI,KAAK,MAAM,KAAK,IAAI,EAAM,CAAC,CAErC,GAAI,CACF,OAAO,EAAQ,EAAO,YAAa,MAAc,IAAI,KAAK,YAAY,EAAO,CAAC,CAAC,OAAO,EAAE,MAClF,CACN,OAAO,IAAM,EAAI,MAAQ"}
package/dist/intl.d.ts DELETED
@@ -1,16 +0,0 @@
1
- import type { Locale, PluralForm } from './types';
2
- /** Holds all Intl formatter caches for one I18n instance — GC'd with the instance. */
3
- export type IntlCaches = {
4
- dateFormat: Map<string, Intl.DateTimeFormat>;
5
- listFormat: Map<string, Intl.ListFormat>;
6
- numberFormat: Map<string, Intl.NumberFormat>;
7
- pluralRules: Map<string, Intl.PluralRules>;
8
- relativeTimeFormat: Map<string, Intl.RelativeTimeFormat>;
9
- };
10
- export declare function makeIntlCaches(): IntlCaches;
11
- export declare function formatNumber(caches: IntlCaches, value: number, options: Intl.NumberFormatOptions | undefined, locale: Locale): string;
12
- export declare function formatDate(caches: IntlCaches, value: Date | number, options: Intl.DateTimeFormatOptions | undefined, locale: Locale): string;
13
- export declare function formatRelative(caches: IntlCaches, value: number, unit: Intl.RelativeTimeFormatUnit, options: Intl.RelativeTimeFormatOptions | undefined, locale: Locale): string;
14
- export declare function formatList(caches: IntlCaches, items: unknown[], locale: string, type: 'and' | 'or'): string;
15
- export declare function getPluralForm(caches: IntlCaches, locale: Locale, count: number): PluralForm;
16
- //# sourceMappingURL=intl.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"intl.d.ts","sourceRoot":"","sources":["../src/intl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAIlD,sFAAsF;AACtF,MAAM,MAAM,UAAU,GAAG;IACvB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAC7C,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACzC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAC7C,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC3C,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;CAC1D,CAAC;AAEF,wBAAgB,cAAc,IAAI,UAAU,CAQ3C;AA0BD,wBAAgB,YAAY,CAC1B,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,IAAI,CAAC,mBAAmB,GAAG,SAAS,EAC7C,MAAM,EAAE,MAAM,GACb,MAAM,CAQR;AAED,wBAAgB,UAAU,CACxB,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,IAAI,GAAG,MAAM,EACpB,OAAO,EAAE,IAAI,CAAC,qBAAqB,GAAG,SAAS,EAC/C,MAAM,EAAE,MAAM,GACb,MAAM,CASR;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,IAAI,CAAC,sBAAsB,EACjC,OAAO,EAAE,IAAI,CAAC,yBAAyB,GAAG,SAAS,EACnD,MAAM,EAAE,MAAM,GACb,MAAM,CAWR;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,GAAG,MAAM,CAoB3G;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,CAQ3F"}
package/dist/intl.js DELETED
@@ -1,65 +0,0 @@
1
- //#region src/intl.ts
2
- function e() {
3
- return {
4
- dateFormat: /* @__PURE__ */ new Map(),
5
- listFormat: /* @__PURE__ */ new Map(),
6
- numberFormat: /* @__PURE__ */ new Map(),
7
- pluralRules: /* @__PURE__ */ new Map(),
8
- relativeTimeFormat: /* @__PURE__ */ new Map()
9
- };
10
- }
11
- function t(e, t, n) {
12
- let r = e.get(t);
13
- return r || (r = n(), e.set(t, r)), r;
14
- }
15
- function n(e, t) {
16
- return t ? `${e}:${JSON.stringify(t, Object.keys(t).sort())}` : e;
17
- }
18
- function r(e, r, i, a) {
19
- let o = n(a, i);
20
- try {
21
- return t(e.numberFormat, o, () => new Intl.NumberFormat(a, i)).format(r);
22
- } catch {
23
- return String(r);
24
- }
25
- }
26
- function i(e, r, i, a) {
27
- let o = typeof r == "number" ? new Date(r) : r, s = n(a, i);
28
- try {
29
- return t(e.dateFormat, s, () => new Intl.DateTimeFormat(a, i)).format(o);
30
- } catch {
31
- return o.toString();
32
- }
33
- }
34
- function a(e, r, i, a, o) {
35
- let s = n(o, a);
36
- try {
37
- return t(e.relativeTimeFormat, s, () => new Intl.RelativeTimeFormat(o, a)).format(r, i);
38
- } catch {
39
- return String(r);
40
- }
41
- }
42
- function o(e, n, r, i) {
43
- if (n.length === 0) return "";
44
- let a = n.map(String), o = i === "and" ? "conjunction" : "disjunction";
45
- try {
46
- return t(e.listFormat, `${r}:${o}`, () => new Intl.ListFormat(r, {
47
- style: "long",
48
- type: o
49
- })).format(a);
50
- } catch {
51
- return a.length === 1 ? a[0] : a.length === 2 ? `${a[0]} ${i} ${a[1]}` : `${a.slice(0, -1).join(", ")} ${i} ${a.at(-1)}`;
52
- }
53
- }
54
- function s(e, n, r) {
55
- let i = Math.floor(Math.abs(r));
56
- try {
57
- return t(e.pluralRules, n, () => new Intl.PluralRules(n)).select(i);
58
- } catch {
59
- return i === 1 ? "one" : "other";
60
- }
61
- }
62
- //#endregion
63
- export { i as formatDate, o as formatList, r as formatNumber, a as formatRelative, s as getPluralForm, e as makeIntlCaches };
64
-
65
- //# sourceMappingURL=intl.js.map
package/dist/intl.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"intl.js","names":[],"sources":["../src/intl.ts"],"sourcesContent":["import type { Locale, PluralForm } from './types';\n\n/* -------------------- Cache Container -------------------- */\n\n/** Holds all Intl formatter caches for one I18n instance — GC'd with the instance. */\nexport type IntlCaches = {\n dateFormat: Map<string, Intl.DateTimeFormat>;\n listFormat: Map<string, Intl.ListFormat>;\n numberFormat: Map<string, Intl.NumberFormat>;\n pluralRules: Map<string, Intl.PluralRules>;\n relativeTimeFormat: Map<string, Intl.RelativeTimeFormat>;\n};\n\nexport function makeIntlCaches(): IntlCaches {\n return {\n dateFormat: new Map(),\n listFormat: new Map(),\n numberFormat: new Map(),\n pluralRules: new Map(),\n relativeTimeFormat: new Map(),\n };\n}\n\n/* -------------------- Cache Helpers -------------------- */\n\nfunction intlFmt<F extends object>(cache: Map<string, F>, key: string, build: () => F): F {\n let fmt = cache.get(key);\n\n if (!fmt) {\n fmt = build();\n cache.set(key, fmt);\n }\n\n return fmt;\n}\n\n/**\n * Builds a stable string key for an Intl formatter cache.\n * Call this once per formatter construction path — not on every format call — so key\n * serialization cost is paid only on cache misses.\n */\nfunction intlKey(locale: string, options?: object): string {\n return options ? `${locale}:${JSON.stringify(options, Object.keys(options).sort())}` : locale;\n}\n\n/* -------------------- Format Functions -------------------- */\n\nexport function formatNumber(\n caches: IntlCaches,\n value: number,\n options: Intl.NumberFormatOptions | undefined,\n locale: Locale,\n): string {\n const key = intlKey(locale, options);\n\n try {\n return intlFmt(caches.numberFormat, key, () => new Intl.NumberFormat(locale, options)).format(value);\n } catch {\n return String(value);\n }\n}\n\nexport function formatDate(\n caches: IntlCaches,\n value: Date | number,\n options: Intl.DateTimeFormatOptions | undefined,\n locale: Locale,\n): string {\n const d = typeof value === 'number' ? new Date(value) : value;\n const key = intlKey(locale, options);\n\n try {\n return intlFmt(caches.dateFormat, key, () => new Intl.DateTimeFormat(locale, options)).format(d);\n } catch {\n return d.toString();\n }\n}\n\nexport function formatRelative(\n caches: IntlCaches,\n value: number,\n unit: Intl.RelativeTimeFormatUnit,\n options: Intl.RelativeTimeFormatOptions | undefined,\n locale: Locale,\n): string {\n const key = intlKey(locale, options);\n\n try {\n return intlFmt(caches.relativeTimeFormat, key, () => new Intl.RelativeTimeFormat(locale, options)).format(\n value,\n unit,\n );\n } catch {\n return String(value);\n }\n}\n\nexport function formatList(caches: IntlCaches, items: unknown[], locale: string, type: 'and' | 'or'): string {\n if (items.length === 0) return '';\n\n const stringItems = items.map(String);\n const intlType = type === 'and' ? 'conjunction' : 'disjunction';\n\n try {\n return intlFmt(\n caches.listFormat,\n `${locale}:${intlType}`,\n () => new Intl.ListFormat(locale, { style: 'long', type: intlType }),\n ).format(stringItems);\n } catch {\n // Fallback for environments without Intl.ListFormat\n if (stringItems.length === 1) return stringItems[0];\n\n if (stringItems.length === 2) return `${stringItems[0]} ${type} ${stringItems[1]}`;\n\n return `${stringItems.slice(0, -1).join(', ')} ${type} ${stringItems.at(-1)}`;\n }\n}\n\nexport function getPluralForm(caches: IntlCaches, locale: Locale, count: number): PluralForm {\n const n = Math.floor(Math.abs(count));\n\n try {\n return intlFmt(caches.pluralRules, locale, () => new Intl.PluralRules(locale)).select(n) as PluralForm;\n } catch {\n return n === 1 ? 'one' : 'other';\n }\n}\n"],"mappings":";AAaA,SAAgB,IAA6B;AAC3C,QAAO;EACL,4BAAY,IAAI,KAAK;EACrB,4BAAY,IAAI,KAAK;EACrB,8BAAc,IAAI,KAAK;EACvB,6BAAa,IAAI,KAAK;EACtB,oCAAoB,IAAI,KAAK;EAC9B;;AAKH,SAAS,EAA0B,GAAuB,GAAa,GAAmB;CACxF,IAAI,IAAM,EAAM,IAAI,EAAI;AAOxB,QALK,MACH,IAAM,GAAO,EACb,EAAM,IAAI,GAAK,EAAI,GAGd;;AAQT,SAAS,EAAQ,GAAgB,GAA0B;AACzD,QAAO,IAAU,GAAG,EAAO,GAAG,KAAK,UAAU,GAAS,OAAO,KAAK,EAAQ,CAAC,MAAM,CAAC,KAAK;;AAKzF,SAAgB,EACd,GACA,GACA,GACA,GACQ;CACR,IAAM,IAAM,EAAQ,GAAQ,EAAQ;AAEpC,KAAI;AACF,SAAO,EAAQ,EAAO,cAAc,SAAW,IAAI,KAAK,aAAa,GAAQ,EAAQ,CAAC,CAAC,OAAO,EAAM;SAC9F;AACN,SAAO,OAAO,EAAM;;;AAIxB,SAAgB,EACd,GACA,GACA,GACA,GACQ;CACR,IAAM,IAAI,OAAO,KAAU,WAAW,IAAI,KAAK,EAAM,GAAG,GAClD,IAAM,EAAQ,GAAQ,EAAQ;AAEpC,KAAI;AACF,SAAO,EAAQ,EAAO,YAAY,SAAW,IAAI,KAAK,eAAe,GAAQ,EAAQ,CAAC,CAAC,OAAO,EAAE;SAC1F;AACN,SAAO,EAAE,UAAU;;;AAIvB,SAAgB,EACd,GACA,GACA,GACA,GACA,GACQ;CACR,IAAM,IAAM,EAAQ,GAAQ,EAAQ;AAEpC,KAAI;AACF,SAAO,EAAQ,EAAO,oBAAoB,SAAW,IAAI,KAAK,mBAAmB,GAAQ,EAAQ,CAAC,CAAC,OACjG,GACA,EACD;SACK;AACN,SAAO,OAAO,EAAM;;;AAIxB,SAAgB,EAAW,GAAoB,GAAkB,GAAgB,GAA4B;AAC3G,KAAI,EAAM,WAAW,EAAG,QAAO;CAE/B,IAAM,IAAc,EAAM,IAAI,OAAO,EAC/B,IAAW,MAAS,QAAQ,gBAAgB;AAElD,KAAI;AACF,SAAO,EACL,EAAO,YACP,GAAG,EAAO,GAAG,WACP,IAAI,KAAK,WAAW,GAAQ;GAAE,OAAO;GAAQ,MAAM;GAAU,CAAC,CACrE,CAAC,OAAO,EAAY;SACf;AAMN,SAJI,EAAY,WAAW,IAAU,EAAY,KAE7C,EAAY,WAAW,IAAU,GAAG,EAAY,GAAG,GAAG,EAAK,GAAG,EAAY,OAEvE,GAAG,EAAY,MAAM,GAAG,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,EAAK,GAAG,EAAY,GAAG,GAAG;;;AAI/E,SAAgB,EAAc,GAAoB,GAAgB,GAA2B;CAC3F,IAAM,IAAI,KAAK,MAAM,KAAK,IAAI,EAAM,CAAC;AAErC,KAAI;AACF,SAAO,EAAQ,EAAO,aAAa,SAAc,IAAI,KAAK,YAAY,EAAO,CAAC,CAAC,OAAO,EAAE;SAClF;AACN,SAAO,MAAM,IAAI,QAAQ"}