@localizeaso/cli 0.1.0-preview.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.
Files changed (58) hide show
  1. package/README.md +24 -0
  2. package/package.json +35 -0
  3. package/packages/asc-shared/dist/app-store-review.d.ts +610 -0
  4. package/packages/asc-shared/dist/app-store-review.d.ts.map +1 -0
  5. package/packages/asc-shared/dist/app-store-review.js +242 -0
  6. package/packages/asc-shared/dist/aso-keyword-map.d.ts +94 -0
  7. package/packages/asc-shared/dist/aso-keyword-map.d.ts.map +1 -0
  8. package/packages/asc-shared/dist/aso-keyword-map.js +292 -0
  9. package/packages/asc-shared/dist/constants.d.ts +15 -0
  10. package/packages/asc-shared/dist/constants.d.ts.map +1 -0
  11. package/packages/asc-shared/dist/constants.js +130 -0
  12. package/packages/asc-shared/dist/cross-localization.d.ts +29 -0
  13. package/packages/asc-shared/dist/cross-localization.d.ts.map +1 -0
  14. package/packages/asc-shared/dist/cross-localization.js +189 -0
  15. package/packages/asc-shared/dist/dedupe.d.ts +17 -0
  16. package/packages/asc-shared/dist/dedupe.d.ts.map +1 -0
  17. package/packages/asc-shared/dist/dedupe.js +104 -0
  18. package/packages/asc-shared/dist/design-tokens.d.ts +83 -0
  19. package/packages/asc-shared/dist/design-tokens.d.ts.map +1 -0
  20. package/packages/asc-shared/dist/design-tokens.js +73 -0
  21. package/packages/asc-shared/dist/index.d.ts +16 -0
  22. package/packages/asc-shared/dist/index.d.ts.map +1 -0
  23. package/packages/asc-shared/dist/index.js +16 -0
  24. package/packages/asc-shared/dist/keywords.d.ts +48 -0
  25. package/packages/asc-shared/dist/keywords.d.ts.map +1 -0
  26. package/packages/asc-shared/dist/keywords.js +376 -0
  27. package/packages/asc-shared/dist/limits.d.ts +11 -0
  28. package/packages/asc-shared/dist/limits.d.ts.map +1 -0
  29. package/packages/asc-shared/dist/limits.js +9 -0
  30. package/packages/asc-shared/dist/locales.d.ts +10 -0
  31. package/packages/asc-shared/dist/locales.d.ts.map +1 -0
  32. package/packages/asc-shared/dist/locales.js +314 -0
  33. package/packages/asc-shared/dist/monetization-boundary.d.ts +148 -0
  34. package/packages/asc-shared/dist/monetization-boundary.d.ts.map +1 -0
  35. package/packages/asc-shared/dist/monetization-boundary.js +365 -0
  36. package/packages/asc-shared/dist/post-approval-paths.d.ts +30 -0
  37. package/packages/asc-shared/dist/post-approval-paths.d.ts.map +1 -0
  38. package/packages/asc-shared/dist/post-approval-paths.js +25 -0
  39. package/packages/asc-shared/dist/review-gate-summary.d.ts +166 -0
  40. package/packages/asc-shared/dist/review-gate-summary.d.ts.map +1 -0
  41. package/packages/asc-shared/dist/review-gate-summary.js +354 -0
  42. package/packages/asc-shared/dist/reviewer-feedback.d.ts +19 -0
  43. package/packages/asc-shared/dist/reviewer-feedback.d.ts.map +1 -0
  44. package/packages/asc-shared/dist/reviewer-feedback.js +94 -0
  45. package/packages/asc-shared/dist/screenshot-review.d.ts +478 -0
  46. package/packages/asc-shared/dist/screenshot-review.d.ts.map +1 -0
  47. package/packages/asc-shared/dist/screenshot-review.js +17 -0
  48. package/packages/asc-shared/dist/supabase.types.d.ts +541 -0
  49. package/packages/asc-shared/dist/supabase.types.d.ts.map +1 -0
  50. package/packages/asc-shared/dist/supabase.types.js +5 -0
  51. package/packages/asc-shared/dist/validation.d.ts +42 -0
  52. package/packages/asc-shared/dist/validation.d.ts.map +1 -0
  53. package/packages/asc-shared/dist/validation.js +113 -0
  54. package/scripts/ensure-shared-build.mjs +76 -0
  55. package/scripts/export-astro-mcp-apps.mjs +841 -0
  56. package/scripts/localizeaso.mjs +2100 -0
  57. package/scripts/review-agent.mjs +9092 -0
  58. package/scripts/review-mcp.mjs +5931 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedupe.d.ts","sourceRoot":"","sources":["../src/dedupe.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,CAAC;AAE7D,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB,CAAC;AAEF,eAAO,MAAM,kCAAkC,mQAuCrC,CAAC;AAEX,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,UAMlD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,YAKzC;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,YAKjD;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,EAAE,OAAO,CAAC,EAAE;IAAE,cAAc,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;CAAE,oBA6CjD"}
@@ -0,0 +1,104 @@
1
+ export const DEFAULT_IGNORED_DUPLICATE_KEYWORDS = [
2
+ "a",
3
+ "an",
4
+ "and",
5
+ "or",
6
+ "the",
7
+ "to",
8
+ "for",
9
+ "of",
10
+ "in",
11
+ "on",
12
+ "with",
13
+ "der",
14
+ "die",
15
+ "das",
16
+ "und",
17
+ "mit",
18
+ "fur",
19
+ "fuer",
20
+ "de",
21
+ "la",
22
+ "le",
23
+ "les",
24
+ "et",
25
+ "el",
26
+ "los",
27
+ "las",
28
+ "y",
29
+ "en",
30
+ "para",
31
+ "con",
32
+ "por",
33
+ "il",
34
+ "lo",
35
+ "gli",
36
+ "e",
37
+ "di",
38
+ "per",
39
+ "com",
40
+ ];
41
+ export function normalizeKeywordToken(value) {
42
+ return value
43
+ .normalize("NFD")
44
+ .replace(/[\u0300-\u036f]/g, "")
45
+ .replace(/[^\p{L}\p{N}\p{M}]+/gu, "")
46
+ .toLowerCase();
47
+ }
48
+ export function tokenizeText(value) {
49
+ return value
50
+ .split(/[,\s]+/)
51
+ .map((token) => normalizeKeywordToken(token))
52
+ .filter(Boolean);
53
+ }
54
+ export function tokenizeKeywordField(value) {
55
+ return value
56
+ .split(",")
57
+ .map((token) => normalizeKeywordToken(token))
58
+ .filter(Boolean);
59
+ }
60
+ export function findDuplicateKeywords(fields, options) {
61
+ const ignored = new Set(DEFAULT_IGNORED_DUPLICATE_KEYWORDS.map((keyword) => normalizeKeywordToken(keyword)));
62
+ if (options?.ignoreKeywords) {
63
+ for (const keyword of options.ignoreKeywords) {
64
+ const normalized = normalizeKeywordToken(keyword);
65
+ if (normalized)
66
+ ignored.add(normalized);
67
+ }
68
+ }
69
+ const map = new Map();
70
+ if (fields.title) {
71
+ for (const token of tokenizeText(fields.title)) {
72
+ if (ignored.has(token))
73
+ continue;
74
+ if (!map.has(token))
75
+ map.set(token, new Set());
76
+ map.get(token)?.add("title");
77
+ }
78
+ }
79
+ if (fields.subtitle) {
80
+ for (const token of tokenizeText(fields.subtitle)) {
81
+ if (ignored.has(token))
82
+ continue;
83
+ if (!map.has(token))
84
+ map.set(token, new Set());
85
+ map.get(token)?.add("subtitle");
86
+ }
87
+ }
88
+ if (fields.keywords) {
89
+ for (const token of tokenizeKeywordField(fields.keywords)) {
90
+ if (ignored.has(token))
91
+ continue;
92
+ if (!map.has(token))
93
+ map.set(token, new Set());
94
+ map.get(token)?.add("keywords");
95
+ }
96
+ }
97
+ const duplicates = [];
98
+ for (const [keyword, set] of map.entries()) {
99
+ if (set.size <= 1)
100
+ continue;
101
+ duplicates.push({ keyword, fields: Array.from(set) });
102
+ }
103
+ return duplicates;
104
+ }
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Design Tokens - Shared between Plugin and Dashboard
3
+ * These define the visual identity (colors, sizes, variants)
4
+ * but each app implements its own components using these values.
5
+ */
6
+ export declare const COLORS: {
7
+ readonly primary: "#007aff";
8
+ readonly primaryHover: "#3399ff";
9
+ readonly primaryActive: "#0056b3";
10
+ readonly secondary: "#2e3048";
11
+ readonly secondaryHover: "#3a3d5c";
12
+ readonly bgDark: "#0e1021";
13
+ readonly bgCard: "#15172e";
14
+ readonly bgInput: "#222436";
15
+ readonly textPrimary: "#ffffff";
16
+ readonly textSecondary: "#9499a6";
17
+ readonly textMuted: "#6b7280";
18
+ readonly border: "#2e3048";
19
+ readonly borderHover: "#3a3d5c";
20
+ readonly success: "#22c55e";
21
+ readonly warning: "#f59e0b";
22
+ readonly danger: "#ef4444";
23
+ readonly dangerHover: "#dc2626";
24
+ readonly accent: "#007aff";
25
+ readonly accentHover: "#3399ff";
26
+ };
27
+ export declare const BUTTON_VARIANTS: {
28
+ readonly primary: {
29
+ readonly bg: "#007aff";
30
+ readonly bgHover: "#3399ff";
31
+ readonly text: "#ffffff";
32
+ };
33
+ readonly secondary: {
34
+ readonly bg: "#2e3048";
35
+ readonly bgHover: "#3a3d5c";
36
+ readonly text: "#ffffff";
37
+ };
38
+ readonly ghost: {
39
+ readonly bg: "transparent";
40
+ readonly bgHover: "#2e3048";
41
+ readonly text: "#007aff";
42
+ };
43
+ readonly danger: {
44
+ readonly bg: "#ef4444";
45
+ readonly bgHover: "#dc2626";
46
+ readonly text: "#ffffff";
47
+ };
48
+ };
49
+ export declare const BUTTON_SIZES: {
50
+ readonly sm: {
51
+ readonly px: 12;
52
+ readonly py: 6;
53
+ readonly fontSize: 12;
54
+ readonly borderRadius: 8;
55
+ };
56
+ readonly md: {
57
+ readonly px: 16;
58
+ readonly py: 10;
59
+ readonly fontSize: 14;
60
+ readonly borderRadius: 10;
61
+ };
62
+ readonly lg: {
63
+ readonly px: 20;
64
+ readonly py: 14;
65
+ readonly fontSize: 16;
66
+ readonly borderRadius: 12;
67
+ };
68
+ };
69
+ export declare const INPUT_STYLES: {
70
+ readonly bg: "#222436";
71
+ readonly border: "#2e3048";
72
+ readonly borderFocus: "#007aff";
73
+ readonly text: "#ffffff";
74
+ readonly placeholder: "#9499a6";
75
+ readonly borderRadius: 8;
76
+ readonly padding: {
77
+ readonly x: 12;
78
+ readonly y: 10;
79
+ };
80
+ };
81
+ export type ButtonVariant = keyof typeof BUTTON_VARIANTS;
82
+ export type ButtonSize = keyof typeof BUTTON_SIZES;
83
+ //# sourceMappingURL=design-tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-tokens.d.ts","sourceRoot":"","sources":["../src/design-tokens.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;CAiCT,CAAC;AAGX,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;CAqBlB,CAAC;AAGX,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;CAIf,CAAC;AAGX,eAAO,MAAM,YAAY;;;;;;;;;;;CAQf,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,eAAe,CAAC;AACzD,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,YAAY,CAAC"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Design Tokens - Shared between Plugin and Dashboard
3
+ * These define the visual identity (colors, sizes, variants)
4
+ * but each app implements its own components using these values.
5
+ */
6
+ // App Store Blue Color Palette
7
+ export const COLORS = {
8
+ // Primary (App Store Blue)
9
+ primary: '#007aff',
10
+ primaryHover: '#3399ff',
11
+ primaryActive: '#0056b3',
12
+ // Secondary (Slate)
13
+ secondary: '#2e3048',
14
+ secondaryHover: '#3a3d5c',
15
+ // Backgrounds
16
+ bgDark: '#0e1021',
17
+ bgCard: '#15172e',
18
+ bgInput: '#222436',
19
+ // Text
20
+ textPrimary: '#ffffff',
21
+ textSecondary: '#9499a6',
22
+ textMuted: '#6b7280',
23
+ // Borders
24
+ border: '#2e3048',
25
+ borderHover: '#3a3d5c',
26
+ // Semantic
27
+ success: '#22c55e',
28
+ warning: '#f59e0b',
29
+ danger: '#ef4444',
30
+ dangerHover: '#dc2626',
31
+ // Accents
32
+ accent: '#007aff',
33
+ accentHover: '#3399ff',
34
+ };
35
+ // Button Variants
36
+ export const BUTTON_VARIANTS = {
37
+ primary: {
38
+ bg: COLORS.primary,
39
+ bgHover: COLORS.primaryHover,
40
+ text: COLORS.textPrimary,
41
+ },
42
+ secondary: {
43
+ bg: COLORS.secondary,
44
+ bgHover: COLORS.secondaryHover,
45
+ text: COLORS.textPrimary,
46
+ },
47
+ ghost: {
48
+ bg: 'transparent',
49
+ bgHover: COLORS.secondary,
50
+ text: COLORS.primary,
51
+ },
52
+ danger: {
53
+ bg: COLORS.danger,
54
+ bgHover: COLORS.dangerHover,
55
+ text: COLORS.textPrimary,
56
+ },
57
+ };
58
+ // Button Sizes
59
+ export const BUTTON_SIZES = {
60
+ sm: { px: 12, py: 6, fontSize: 12, borderRadius: 8 },
61
+ md: { px: 16, py: 10, fontSize: 14, borderRadius: 10 },
62
+ lg: { px: 20, py: 14, fontSize: 16, borderRadius: 12 },
63
+ };
64
+ // Input Styles
65
+ export const INPUT_STYLES = {
66
+ bg: COLORS.bgInput,
67
+ border: COLORS.border,
68
+ borderFocus: COLORS.primary,
69
+ text: COLORS.textPrimary,
70
+ placeholder: COLORS.textSecondary,
71
+ borderRadius: 8,
72
+ padding: { x: 12, y: 10 },
73
+ };
@@ -0,0 +1,16 @@
1
+ export * from './constants.js';
2
+ export * from './limits.js';
3
+ export * from './validation.js';
4
+ export * from './keywords.js';
5
+ export * from './locales.js';
6
+ export * from './dedupe.js';
7
+ export * from './design-tokens.js';
8
+ export * from './cross-localization.js';
9
+ export * from './screenshot-review.js';
10
+ export * from './app-store-review.js';
11
+ export * from './aso-keyword-map.js';
12
+ export * from './reviewer-feedback.js';
13
+ export * from './review-gate-summary.js';
14
+ export * from './post-approval-paths.js';
15
+ export * from './monetization-boundary.js';
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC"}
@@ -0,0 +1,16 @@
1
+ // Core exports (work everywhere)
2
+ export * from './constants.js';
3
+ export * from './limits.js';
4
+ export * from './validation.js';
5
+ export * from './keywords.js';
6
+ export * from './locales.js';
7
+ export * from './dedupe.js';
8
+ export * from './design-tokens.js';
9
+ export * from './cross-localization.js';
10
+ export * from './screenshot-review.js';
11
+ export * from './app-store-review.js';
12
+ export * from './aso-keyword-map.js';
13
+ export * from './reviewer-feedback.js';
14
+ export * from './review-gate-summary.js';
15
+ export * from './post-approval-paths.js';
16
+ export * from './monetization-boundary.js';
@@ -0,0 +1,48 @@
1
+ export type KeywordCSVRow = {
2
+ locale: string;
3
+ keyword: string;
4
+ popularity?: number;
5
+ difficulty?: number;
6
+ };
7
+ export type KeywordCandidate = {
8
+ keyword: string;
9
+ popularity?: number;
10
+ difficulty?: number;
11
+ };
12
+ export type AsoKeywordImportRow = {
13
+ locale: string;
14
+ keyword: string;
15
+ popularity?: number;
16
+ difficulty?: number;
17
+ isPreferred?: boolean;
18
+ };
19
+ export type AsoKeywordImportResult = {
20
+ rows: AsoKeywordImportRow[];
21
+ errors: string[];
22
+ skippedRows?: Array<{
23
+ rowNumber: number;
24
+ reason: 'unmapped_locale';
25
+ localeRaw: string;
26
+ keyword: string;
27
+ }>;
28
+ };
29
+ export type AsoKeywordRowMappingOptions = {
30
+ localeResolver?: (value: string) => string;
31
+ allowUnmappedLocales?: boolean;
32
+ };
33
+ export declare const ASO_KEYWORD_IMPORT_FIELDS: readonly ["locale", "keyword", "popularity", "difficulty", "isPreferred"];
34
+ export type AsoKeywordImportField = (typeof ASO_KEYWORD_IMPORT_FIELDS)[number];
35
+ export type AsoKeywordColumnMapping = Record<AsoKeywordImportField, number | null>;
36
+ export type ParsedCsvTable = {
37
+ header: string[];
38
+ rows: string[][];
39
+ };
40
+ export declare function parseKeywordList(input: string): string[];
41
+ export declare function parseCsvRows(input: string): string[][];
42
+ export declare function parseCsvTable(csv: string): ParsedCsvTable;
43
+ export declare function suggestAsoKeywordColumnMapping(header: string[]): AsoKeywordColumnMapping;
44
+ export declare function mapCsvTableToAsoKeywordRows(table: ParsedCsvTable, mapping: AsoKeywordColumnMapping, options?: AsoKeywordRowMappingOptions): AsoKeywordImportResult;
45
+ export declare function parseKeywordCSV(csv: string): KeywordCSVRow[];
46
+ export declare function groupKeywordsByLocale(rows: KeywordCSVRow[]): Record<string, KeywordCandidate[]>;
47
+ export declare function parseAsoKeywordCSV(csv: string): AsoKeywordImportResult;
48
+ //# sourceMappingURL=keywords.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keywords.d.ts","sourceRoot":"","sources":["../src/keywords.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,mBAAmB,EAAE,CAAC;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,CAAC,EAAE,KAAK,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,iBAAiB,CAAC;QAC1B,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3C,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC,CAAC;AAEF,eAAO,MAAM,yBAAyB,2EAM5B,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE/E,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;AAEnF,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;CAClB,CAAC;AAyDF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,YAK7C;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,CA8DtD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAWzD;AA+ED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,uBAAuB,CA2DxF;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,uBAAuB,EAChC,OAAO,CAAC,EAAE,2BAA2B,GACpC,sBAAsB,CAwDxB;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,EAAE,CAmC5D;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,aAAa,EAAE,sCAY1D;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,sBAAsB,CAKtE"}