@peteanderson/ansi 2.3.0 → 3.0.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 (114) hide show
  1. package/README.md +12 -12
  2. package/dist/cjs/ansi.d.ts +2 -2
  3. package/dist/cjs/ansi.d.ts.map +1 -1
  4. package/dist/cjs/ansi.js +4 -4
  5. package/dist/cjs/ansi.js.map +1 -1
  6. package/dist/cjs/{caret.d.ts → cursor.d.ts} +4 -4
  7. package/dist/cjs/cursor.d.ts.map +1 -0
  8. package/dist/cjs/{caret.js → cursor.js} +5 -5
  9. package/dist/cjs/cursor.js.map +1 -0
  10. package/dist/cjs/features/build.d.ts +1 -1
  11. package/dist/cjs/features/build.d.ts.map +1 -1
  12. package/dist/cjs/features/build.js +4 -4
  13. package/dist/cjs/features/build.js.map +1 -1
  14. package/dist/cjs/features/detect.js +1 -1
  15. package/dist/cjs/features/detect.js.map +1 -1
  16. package/dist/cjs/features/features.js +4 -4
  17. package/dist/cjs/features/features.js.map +1 -1
  18. package/dist/cjs/features/types.d.ts +1 -1
  19. package/dist/cjs/features/types.d.ts.map +1 -1
  20. package/dist/cjs/index.d.ts +2 -2
  21. package/dist/cjs/sgr/combine.d.ts.map +1 -1
  22. package/dist/cjs/sgr/combine.js +1 -1
  23. package/dist/cjs/sgr/combine.js.map +1 -1
  24. package/dist/cjs/sgr/format-builder.d.ts.map +1 -1
  25. package/dist/cjs/sgr/format-builder.js +1 -3
  26. package/dist/cjs/sgr/format-builder.js.map +1 -1
  27. package/dist/cjs/sgr/reset.d.ts.map +1 -1
  28. package/dist/cjs/sgr/reset.js +1 -1
  29. package/dist/cjs/sgr/reset.js.map +1 -1
  30. package/dist/cjs/sgr/types.d.ts +1 -1
  31. package/dist/cjs/sgr/types.d.ts.map +1 -1
  32. package/dist/cjs/simplify/lookup.d.ts +2 -2
  33. package/dist/cjs/simplify/lookup.d.ts.map +1 -1
  34. package/dist/cjs/simplify/lookup.js +1 -0
  35. package/dist/cjs/simplify/lookup.js.map +1 -1
  36. package/dist/cjs/simplify/simplify.js +2 -2
  37. package/dist/cjs/simplify/simplify.js.map +1 -1
  38. package/dist/cjs/simplify/state.d.ts +3 -3
  39. package/dist/cjs/simplify/state.d.ts.map +1 -1
  40. package/dist/cjs/simplify/state.js.map +1 -1
  41. package/dist/cjs/simplify/types.d.ts +5 -4
  42. package/dist/cjs/simplify/types.d.ts.map +1 -1
  43. package/dist/cjs/simplify/utils.d.ts +2 -1
  44. package/dist/cjs/simplify/utils.d.ts.map +1 -1
  45. package/dist/cjs/simplify/utils.js.map +1 -1
  46. package/dist/cjs/types.d.ts +2 -2
  47. package/dist/cjs/types.d.ts.map +1 -1
  48. package/dist/esm/ansi.d.ts +2 -2
  49. package/dist/esm/ansi.d.ts.map +1 -1
  50. package/dist/esm/ansi.js +3 -3
  51. package/dist/esm/ansi.js.map +1 -1
  52. package/dist/esm/{caret.d.ts → cursor.d.ts} +4 -4
  53. package/dist/esm/cursor.d.ts.map +1 -0
  54. package/dist/esm/{caret.js → cursor.js} +3 -3
  55. package/dist/esm/cursor.js.map +1 -0
  56. package/dist/esm/features/build.d.ts +1 -1
  57. package/dist/esm/features/build.d.ts.map +1 -1
  58. package/dist/esm/features/build.js +4 -4
  59. package/dist/esm/features/build.js.map +1 -1
  60. package/dist/esm/features/detect.js +1 -1
  61. package/dist/esm/features/detect.js.map +1 -1
  62. package/dist/esm/features/features.js +4 -4
  63. package/dist/esm/features/features.js.map +1 -1
  64. package/dist/esm/features/types.d.ts +1 -1
  65. package/dist/esm/features/types.d.ts.map +1 -1
  66. package/dist/esm/sgr/combine.d.ts.map +1 -1
  67. package/dist/esm/sgr/combine.js +1 -1
  68. package/dist/esm/sgr/combine.js.map +1 -1
  69. package/dist/esm/sgr/format-builder.d.ts.map +1 -1
  70. package/dist/esm/sgr/format-builder.js +1 -3
  71. package/dist/esm/sgr/format-builder.js.map +1 -1
  72. package/dist/esm/sgr/reset.d.ts.map +1 -1
  73. package/dist/esm/sgr/reset.js +1 -1
  74. package/dist/esm/sgr/reset.js.map +1 -1
  75. package/dist/esm/sgr/types.d.ts +1 -1
  76. package/dist/esm/sgr/types.d.ts.map +1 -1
  77. package/dist/esm/simplify/lookup.d.ts +2 -2
  78. package/dist/esm/simplify/lookup.d.ts.map +1 -1
  79. package/dist/esm/simplify/lookup.js +1 -0
  80. package/dist/esm/simplify/lookup.js.map +1 -1
  81. package/dist/esm/simplify/simplify.js +2 -2
  82. package/dist/esm/simplify/simplify.js.map +1 -1
  83. package/dist/esm/simplify/state.d.ts +3 -3
  84. package/dist/esm/simplify/state.d.ts.map +1 -1
  85. package/dist/esm/simplify/state.js.map +1 -1
  86. package/dist/esm/simplify/types.d.ts +5 -4
  87. package/dist/esm/simplify/types.d.ts.map +1 -1
  88. package/dist/esm/simplify/utils.d.ts +2 -1
  89. package/dist/esm/simplify/utils.d.ts.map +1 -1
  90. package/dist/esm/simplify/utils.js.map +1 -1
  91. package/dist/esm/types.d.ts +2 -2
  92. package/dist/esm/types.d.ts.map +1 -1
  93. package/package.json +1 -1
  94. package/src/ansi.ts +3 -3
  95. package/src/{caret.ts → cursor.ts} +4 -4
  96. package/src/features/build.ts +4 -4
  97. package/src/features/detect.ts +1 -1
  98. package/src/features/features.ts +4 -4
  99. package/src/features/types.ts +1 -1
  100. package/src/sgr/combine.ts +1 -1
  101. package/src/sgr/format-builder.ts +1 -4
  102. package/src/sgr/reset.ts +1 -1
  103. package/src/sgr/types.ts +1 -1
  104. package/src/simplify/lookup.ts +4 -3
  105. package/src/simplify/simplify.ts +3 -3
  106. package/src/simplify/state.ts +4 -4
  107. package/src/simplify/types.ts +7 -4
  108. package/src/simplify/utils.ts +5 -3
  109. package/src/types.ts +2 -2
  110. package/src/utility-types.d.ts +5 -1
  111. package/dist/cjs/caret.d.ts.map +0 -1
  112. package/dist/cjs/caret.js.map +0 -1
  113. package/dist/esm/caret.d.ts.map +0 -1
  114. package/dist/esm/caret.js.map +0 -1
@@ -3,4 +3,4 @@ import {State} from "../simplify/state";
3
3
  import type {Code} from "./types";
4
4
 
5
5
  export const combineCodes = (base: Code, ...codes: Code[]): Code =>
6
- new State().update([base, ...codes].flat()).map(code => code === "" ? 0 : code);
6
+ new State().update([base, ...codes].flat());
@@ -4,10 +4,7 @@ import {lazy} from "./lazy";
4
4
 
5
5
  import type {ChainBuilder, ChainKey, Code, Format, FormatBase, FormatBuilder} from "./types";
6
6
 
7
- const codeSequence = (code: Code): string | number =>
8
- Array.isArray(code)
9
- ? code.map(c => c ? c : "").join(';')
10
- : code ? code : "";
7
+ const codeSequence = (code: Code): string | number => Array.isArray(code) ? code.join(';') : code;
11
8
 
12
9
  const chain = <Keys extends ChainKey>(
13
10
  makeChain : ChainBuilder,
package/src/sgr/reset.ts CHANGED
@@ -1 +1 @@
1
- export const makeReset = (enabled = true): string => enabled ? "\x1b[0m" : "";
1
+ export const makeReset = (enabled = true): string => enabled ? "\x1b[m" : "";
package/src/sgr/types.ts CHANGED
@@ -22,7 +22,7 @@ export type ChainBuilder = <Keys extends ChainKey>(
22
22
  baseFormat : FormatBase,
23
23
  ) => Chain<Keys>;
24
24
 
25
- export type Code = number | number[];
25
+ export type Code = number | "" | ReadonlyArray<number | "">;
26
26
 
27
27
  export interface FormatBase {
28
28
  (text: string): string;
@@ -1,8 +1,9 @@
1
1
  import {buildExtendedColorAtom, buildIntensityAtom} from "./atom";
2
2
 
3
- import type {Atom, Attribute, AttributeMap, BuildAtom} from "./types";
3
+ import type {Atom, Attribute, AttributeMap, BuildAtom, CodeArray} from "./types";
4
4
 
5
- const codeMap: Record<number, [attribute: Attribute, buildAtom?: BuildAtom]> = {
5
+ const codeMap: Record<number | "", [attribute: Attribute, buildAtom?: BuildAtom]> = {
6
+ "" : ["reset"],
6
7
  0 : ["reset"],
7
8
  1 : ["intensity", buildIntensityAtom],
8
9
  2 : ["intensity", buildIntensityAtom],
@@ -61,7 +62,7 @@ const codeMap: Record<number, [attribute: Attribute, buildAtom?: BuildAtom]> = {
61
62
  107 : ["bg"],
62
63
  };
63
64
 
64
- export function lookUpAtom(codes: readonly number[], index: number, state: AttributeMap): Atom {
65
+ export function lookUpAtom(codes: CodeArray, index: number, state: AttributeMap): Atom {
65
66
  const code = codes[index];
66
67
  const entry = codeMap[code];
67
68
 
@@ -9,12 +9,12 @@ export function simplify(text: string): string {
9
9
  let result = parts[0];
10
10
 
11
11
  for (let i = 1; i < parts.length; ) {
12
- let codes = parts[i++].split(";").map(Number);
13
- let chunk = parts[i++];
12
+ const codes = parts[i++].split(";").map(s => s ? Number(s) : "");
13
+ let chunk = parts[i++];
14
14
 
15
15
  while (!chunk && i < parts.length) {
16
16
  // Merge consecutive SGR sequences with no text between them.
17
- codes.push(...parts[i++].split(";").map(Number));
17
+ codes.push(...parts[i++].split(";").map(s => s ? Number(s) : ""));
18
18
  chunk = parts[i++];
19
19
  }
20
20
 
@@ -1,9 +1,9 @@
1
1
  import {lookUpAtom} from "./lookup";
2
2
  import {arraysEqual, transitionIntensity} from "./utils";
3
3
 
4
- import type {Attribute, AttributeMap} from "./types";
4
+ import type {Attribute, AttributeMap, CodeArray} from "./types";
5
5
 
6
- const defaultCodes: Map<Attribute, readonly number[]> = new Map([
6
+ const defaultCodes: Map<Attribute, CodeArray> = new Map([
7
7
  ["intensity", [22]],
8
8
  ["italic", [23]],
9
9
  ["underline", [24]],
@@ -16,7 +16,7 @@ const defaultCodes: Map<Attribute, readonly number[]> = new Map([
16
16
  ["overline", [55]],
17
17
  ]);
18
18
 
19
- export class State extends Map<Attribute, readonly number[]> implements AttributeMap {
19
+ export class State extends Map<Attribute, CodeArray> implements AttributeMap {
20
20
  #isDefaultState(except?: Attribute): boolean {
21
21
  for (const [attribute, defaultCode] of defaultCodes) {
22
22
  if (attribute === except)
@@ -29,7 +29,7 @@ export class State extends Map<Attribute, readonly number[]> implements Attribut
29
29
  return true;
30
30
  }
31
31
 
32
- update(codes: readonly number[]): Array<number | ""> {
32
+ update(codes: CodeArray): CodeArray {
33
33
  let snapshot: AttributeMap = new Map(this);
34
34
 
35
35
  const attributes = new Set<Attribute>();
@@ -1,3 +1,5 @@
1
+ export type CodeArray = ReadonlyArray<number | "">;
2
+
1
3
  export type Attribute =
2
4
  | "intensity"
3
5
  | "italic"
@@ -10,19 +12,20 @@ export type Attribute =
10
12
  | "frame"
11
13
  | "overline"
12
14
  | "reset"
13
- | number;
15
+ | number
16
+ | "";
14
17
 
15
- export type AttributeMap = Map<Attribute, readonly number[]>;
18
+ export type AttributeMap = Map<Attribute, CodeArray>;
16
19
 
17
20
  export interface Atom {
18
21
  attribute : Attribute;
19
- code : readonly number[];
22
+ code : CodeArray;
20
23
  skip? : number;
21
24
  }
22
25
 
23
26
  export type BuildAtom = (
24
27
  attribute : Attribute,
25
- codes : readonly number[],
28
+ codes : CodeArray,
26
29
  index : number,
27
30
  state : AttributeMap,
28
31
  ) => Atom;
@@ -1,3 +1,5 @@
1
+ import type {CodeArray} from "./types";
2
+
1
3
  export function arraysEqual<T>(a: readonly T[] | undefined, b: readonly T[] | undefined): boolean {
2
4
  if (a === b)
3
5
  return true;
@@ -14,9 +16,9 @@ export function arraysEqual<T>(a: readonly T[] | undefined, b: readonly T[] | un
14
16
  }
15
17
 
16
18
  export function transitionIntensity(
17
- previous : readonly number[] | undefined,
18
- current : readonly number[],
19
- ): readonly number[] {
19
+ previous : CodeArray | undefined,
20
+ current : CodeArray,
21
+ ): CodeArray {
20
22
  if (!previous || previous[0] === 22 || current[0] === 22)
21
23
  return current;
22
24
 
package/src/types.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type {Caret} from "./caret";
1
+ import type {Cursor} from "./cursor";
2
2
  import type {Erase} from "./erase";
3
3
  import type {Features} from "./features";
4
4
  import type {PadEnd, PadStart} from "./pad";
@@ -10,7 +10,7 @@ import type {Sanitize, Strip, VisibleLength} from "./strip";
10
10
  import type {Terminal} from "./terminal";
11
11
 
12
12
  export type Ansi = SGR & {
13
- caret : Caret;
13
+ cursor : Cursor;
14
14
  erase : Erase;
15
15
  scroll : Scroll;
16
16
  terminal : Terminal;
@@ -15,4 +15,8 @@ type EntriesOf<T, K extends [...(keyof T)[]] = (keyof T)[]> = {
15
15
  [P in keyof K]: K[P] extends keyof T ? EntryOf<T, K[P]> : never;
16
16
  };
17
17
 
18
- type SkipFirst<T> = T extends [infer First, ...infer Rest] ? Rest : [];
18
+ type SkipFirst<T> = T extends [infer First, ...infer Rest] ? Rest : [];
19
+
20
+ interface ArrayConstructor {
21
+ isArray(value: unknown): value is readonly unknown[];
22
+ }
@@ -1 +0,0 @@
1
- {"version":3,"file":"caret.d.ts","sourceRoot":"","sources":["../../src/caret.ts"],"names":[],"mappings":"AAKA,QAAA,MAAM,KAAK;iBAL6B,MAAM,KAAG,MAAM;mBAAf,MAAM,KAAG,MAAM;sBAAf,MAAM,KAAG,MAAM;uBAAf,MAAM,KAAG,MAAM;uBAAf,MAAM,KAAG,MAAM;uBAAf,MAAM,KAAG,MAAM;WAa/C,MAAM,KAAG,MAAM;;;;;;;iBAkBZ,MAAM,KAAK,MAAM,KAAG,MAAM;;;;;;;;;;;CAYpC,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC;AAkCjC,eAAO,MAAM,SAAS,GAAI,iBAAc,KAAG,KAAmC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"caret.js","sourceRoot":"","sources":["../../src/caret.ts"],"names":[],"mappings":";;;AAAA,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,KAAc,EAAU,EAAE,CACzD,QAAQ,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;AAEjE,MAAM,IAAI,GAAG,GAAW,EAAE,CAAC,EAAE,CAAC;AAE9B,MAAM,KAAK,GAAG;IACb,EAAE,EAAS,IAAI,CAAC,GAAG,CAAC;IACpB,IAAI,EAAO,IAAI,CAAC,GAAG,CAAC;IACpB,OAAO,EAAI,IAAI,CAAC,GAAG,CAAC;IACpB,QAAQ,EAAG,IAAI,CAAC,GAAG,CAAC;IACpB,QAAQ,EAAG,IAAI,CAAC,GAAG,CAAC;IACpB,QAAQ,EAAG,IAAI,CAAC,GAAG,CAAC;IAEpB,CAAC,EAAE,CAAC,CAAS,EAAU,EAAE,CAAC,QAAQ,CAAC,GAAG;IAEtC,4FAA4F;IAC5F,+FAA+F;IAC/F,yDAAyD;IACzD,EAAE;IACF,MAAM;IACN,sBAAsB;IACtB,sBAAsB;IACtB,MAAM;IACN,IAAI,EAAM,OAAO;IACjB,OAAO,EAAG,OAAO;IAEjB,IAAI,EAAG,WAAW;IAClB,IAAI,EAAG,WAAW;IAElB,QAAQ,EAAE;QACT,GAAG,EAAE,SAAS;QACd,GAAG,EAAE,CAAC,CAAS,EAAE,CAAS,EAAU,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG;KACxD;IAED,KAAK,EAAE;QACN,WAAW,EAAS,UAAU;QAC9B,SAAS,EAAW,UAAU;QAC9B,eAAe,EAAK,UAAU;QAC9B,aAAa,EAAO,UAAU;QAC9B,WAAW,EAAS,UAAU;QAC9B,iBAAiB,EAAG,UAAU;QAC9B,OAAO,EAAa,UAAU;KAC9B;CACD,CAAC;AAIF,MAAM,QAAQ,GAAU;IACvB,EAAE,EAAS,IAAI;IACf,IAAI,EAAO,IAAI;IACf,OAAO,EAAI,IAAI;IACf,QAAQ,EAAG,IAAI;IACf,QAAQ,EAAG,IAAI;IACf,QAAQ,EAAG,IAAI;IAEf,CAAC,EAAE,IAAI;IAEP,IAAI,EAAM,EAAE;IACZ,OAAO,EAAG,EAAE;IAEZ,IAAI,EAAG,EAAE;IACT,IAAI,EAAG,EAAE;IAET,QAAQ,EAAE;QACT,GAAG,EAAE,EAAE;QACP,GAAG,EAAE,IAAI;KACT;IAED,KAAK,EAAE;QACN,WAAW,EAAS,EAAE;QACtB,SAAS,EAAW,EAAE;QACtB,eAAe,EAAK,EAAE;QACtB,aAAa,EAAO,EAAE;QACtB,WAAW,EAAS,EAAE;QACtB,iBAAiB,EAAG,EAAE;QACtB,OAAO,EAAa,EAAE;KACtB;CACD,CAAC;AAEK,MAAM,SAAS,GAAG,CAAC,OAAO,GAAG,IAAI,EAAS,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AAAlE,QAAA,SAAS,aAAyD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"caret.d.ts","sourceRoot":"","sources":["../../src/caret.ts"],"names":[],"mappings":"AAKA,QAAA,MAAM,KAAK;iBAL6B,MAAM,KAAG,MAAM;mBAAf,MAAM,KAAG,MAAM;sBAAf,MAAM,KAAG,MAAM;uBAAf,MAAM,KAAG,MAAM;uBAAf,MAAM,KAAG,MAAM;uBAAf,MAAM,KAAG,MAAM;WAa/C,MAAM,KAAG,MAAM;;;;;;;iBAkBZ,MAAM,KAAK,MAAM,KAAG,MAAM;;;;;;;;;;;CAYpC,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC;AAkCjC,eAAO,MAAM,SAAS,GAAI,iBAAc,KAAG,KAAmC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"caret.js","sourceRoot":"","sources":["../../src/caret.ts"],"names":[],"mappings":"AAAA,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,KAAc,EAAU,EAAE,CACzD,QAAQ,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;AAEjE,MAAM,IAAI,GAAG,GAAW,EAAE,CAAC,EAAE,CAAC;AAE9B,MAAM,KAAK,GAAG;IACb,EAAE,EAAS,IAAI,CAAC,GAAG,CAAC;IACpB,IAAI,EAAO,IAAI,CAAC,GAAG,CAAC;IACpB,OAAO,EAAI,IAAI,CAAC,GAAG,CAAC;IACpB,QAAQ,EAAG,IAAI,CAAC,GAAG,CAAC;IACpB,QAAQ,EAAG,IAAI,CAAC,GAAG,CAAC;IACpB,QAAQ,EAAG,IAAI,CAAC,GAAG,CAAC;IAEpB,CAAC,EAAE,CAAC,CAAS,EAAU,EAAE,CAAC,QAAQ,CAAC,GAAG;IAEtC,4FAA4F;IAC5F,+FAA+F;IAC/F,yDAAyD;IACzD,EAAE;IACF,MAAM;IACN,sBAAsB;IACtB,sBAAsB;IACtB,MAAM;IACN,IAAI,EAAM,OAAO;IACjB,OAAO,EAAG,OAAO;IAEjB,IAAI,EAAG,WAAW;IAClB,IAAI,EAAG,WAAW;IAElB,QAAQ,EAAE;QACT,GAAG,EAAE,SAAS;QACd,GAAG,EAAE,CAAC,CAAS,EAAE,CAAS,EAAU,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG;KACxD;IAED,KAAK,EAAE;QACN,WAAW,EAAS,UAAU;QAC9B,SAAS,EAAW,UAAU;QAC9B,eAAe,EAAK,UAAU;QAC9B,aAAa,EAAO,UAAU;QAC9B,WAAW,EAAS,UAAU;QAC9B,iBAAiB,EAAG,UAAU;QAC9B,OAAO,EAAa,UAAU;KAC9B;CACD,CAAC;AAIF,MAAM,QAAQ,GAAU;IACvB,EAAE,EAAS,IAAI;IACf,IAAI,EAAO,IAAI;IACf,OAAO,EAAI,IAAI;IACf,QAAQ,EAAG,IAAI;IACf,QAAQ,EAAG,IAAI;IACf,QAAQ,EAAG,IAAI;IAEf,CAAC,EAAE,IAAI;IAEP,IAAI,EAAM,EAAE;IACZ,OAAO,EAAG,EAAE;IAEZ,IAAI,EAAG,EAAE;IACT,IAAI,EAAG,EAAE;IAET,QAAQ,EAAE;QACT,GAAG,EAAE,EAAE;QACP,GAAG,EAAE,IAAI;KACT;IAED,KAAK,EAAE;QACN,WAAW,EAAS,EAAE;QACtB,SAAS,EAAW,EAAE;QACtB,eAAe,EAAK,EAAE;QACtB,aAAa,EAAO,EAAE;QACtB,WAAW,EAAS,EAAE;QACtB,iBAAiB,EAAG,EAAE;QACtB,OAAO,EAAa,EAAE;KACtB;CACD,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAO,GAAG,IAAI,EAAS,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC"}