@hrnec06/util 1.4.14

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 (74) hide show
  1. package/README.md +1 -0
  2. package/dist/cjs/array.d.ts +3 -0
  3. package/dist/cjs/array.js +27 -0
  4. package/dist/cjs/array.js.map +1 -0
  5. package/dist/cjs/general.d.ts +37 -0
  6. package/dist/cjs/general.js +151 -0
  7. package/dist/cjs/general.js.map +1 -0
  8. package/dist/cjs/index.d.ts +11 -0
  9. package/dist/cjs/index.js +28 -0
  10. package/dist/cjs/index.js.map +1 -0
  11. package/dist/cjs/lib/AsyncClass.d.ts +13 -0
  12. package/dist/cjs/lib/AsyncClass.js +37 -0
  13. package/dist/cjs/lib/AsyncClass.js.map +1 -0
  14. package/dist/cjs/lib/Listenable.d.ts +21 -0
  15. package/dist/cjs/lib/Listenable.js +51 -0
  16. package/dist/cjs/lib/Listenable.js.map +1 -0
  17. package/dist/cjs/lib/UnitsCalculator.d.ts +27 -0
  18. package/dist/cjs/lib/UnitsCalculator.js +88 -0
  19. package/dist/cjs/lib/UnitsCalculator.js.map +1 -0
  20. package/dist/cjs/math.d.ts +1 -0
  21. package/dist/cjs/math.js +11 -0
  22. package/dist/cjs/math.js.map +1 -0
  23. package/dist/cjs/polyfill.d.ts +1 -0
  24. package/dist/cjs/polyfill.js +15 -0
  25. package/dist/cjs/polyfill.js.map +1 -0
  26. package/dist/cjs/record.d.ts +28 -0
  27. package/dist/cjs/record.js +166 -0
  28. package/dist/cjs/record.js.map +1 -0
  29. package/dist/cjs/string.d.ts +32 -0
  30. package/dist/cjs/string.js +99 -0
  31. package/dist/cjs/string.js.map +1 -0
  32. package/dist/cjs/types.d.ts +36 -0
  33. package/dist/cjs/types.js +3 -0
  34. package/dist/cjs/types.js.map +1 -0
  35. package/dist/cjs/vector.d.ts +17 -0
  36. package/dist/cjs/vector.js +86 -0
  37. package/dist/cjs/vector.js.map +1 -0
  38. package/dist/esm/array.d.ts +3 -0
  39. package/dist/esm/array.js +22 -0
  40. package/dist/esm/array.js.map +1 -0
  41. package/dist/esm/general.d.ts +37 -0
  42. package/dist/esm/general.js +140 -0
  43. package/dist/esm/general.js.map +1 -0
  44. package/dist/esm/index.d.ts +11 -0
  45. package/dist/esm/index.js +12 -0
  46. package/dist/esm/index.js.map +1 -0
  47. package/dist/esm/lib/AsyncClass.d.ts +13 -0
  48. package/dist/esm/lib/AsyncClass.js +33 -0
  49. package/dist/esm/lib/AsyncClass.js.map +1 -0
  50. package/dist/esm/lib/Listenable.d.ts +21 -0
  51. package/dist/esm/lib/Listenable.js +48 -0
  52. package/dist/esm/lib/Listenable.js.map +1 -0
  53. package/dist/esm/lib/UnitsCalculator.d.ts +27 -0
  54. package/dist/esm/lib/UnitsCalculator.js +86 -0
  55. package/dist/esm/lib/UnitsCalculator.js.map +1 -0
  56. package/dist/esm/math.d.ts +1 -0
  57. package/dist/esm/math.js +8 -0
  58. package/dist/esm/math.js.map +1 -0
  59. package/dist/esm/polyfill.d.ts +1 -0
  60. package/dist/esm/polyfill.js +12 -0
  61. package/dist/esm/polyfill.js.map +1 -0
  62. package/dist/esm/record.d.ts +28 -0
  63. package/dist/esm/record.js +143 -0
  64. package/dist/esm/record.js.map +1 -0
  65. package/dist/esm/string.d.ts +32 -0
  66. package/dist/esm/string.js +88 -0
  67. package/dist/esm/string.js.map +1 -0
  68. package/dist/esm/types.d.ts +36 -0
  69. package/dist/esm/types.js +2 -0
  70. package/dist/esm/types.js.map +1 -0
  71. package/dist/esm/vector.d.ts +17 -0
  72. package/dist/esm/vector.js +68 -0
  73. package/dist/esm/vector.js.map +1 -0
  74. package/package.json +72 -0
@@ -0,0 +1,140 @@
1
+ import { keys } from "./record.js";
2
+ export function todo(message) {
3
+ if (!message) {
4
+ const callInfo = getCaller(3);
5
+ if (callInfo) {
6
+ message = callInfo.at ? callInfo.at + '()' : '';
7
+ message += ` at ${callInfo.file} [${callInfo.line}:${callInfo.char}]`;
8
+ }
9
+ }
10
+ message = 'TODO' + (message ? ': ' + message : '');
11
+ throw new Error(message);
12
+ }
13
+ export function assert(condition, error) {
14
+ if (!condition) {
15
+ if (error instanceof Error)
16
+ throw error;
17
+ if (typeof error === 'string')
18
+ throw new Error(error);
19
+ throw new Error(`Assert condition failed.`);
20
+ }
21
+ }
22
+ export function debounce(delay) {
23
+ return new Promise((resolve) => setTimeout(() => resolve(), delay));
24
+ }
25
+ export function countStep(currentValue, targetValue, step = 1) {
26
+ if (targetValue === currentValue)
27
+ return 0;
28
+ step = Math.abs(step);
29
+ const maxDiff = targetValue - currentValue;
30
+ if (currentValue > targetValue)
31
+ return Math.max(-step, (targetValue - currentValue));
32
+ if (currentValue < targetValue)
33
+ return Math.min(step, maxDiff);
34
+ return 0;
35
+ }
36
+ export function random(min, max, round = true) {
37
+ let r = min + Math.random() * (max - min + (round ? 1 : 0));
38
+ if (round)
39
+ return Math.floor(r);
40
+ return r;
41
+ }
42
+ export function duration({ milliseconds = 0, seconds = 0, minutes = 0, hours = 0, days = 0 }) {
43
+ return (milliseconds +
44
+ 1000 * seconds +
45
+ 1000 * 60 * minutes +
46
+ 1000 * 60 * 60 * hours +
47
+ 1000 * 60 * 60 * 24 * days);
48
+ }
49
+ export function deepCompare(itemA, itemB) {
50
+ if (itemA === itemB)
51
+ return true;
52
+ if (typeof itemA !== typeof itemB)
53
+ return false;
54
+ if (typeof itemA !== 'object' || itemA === null || typeof itemB !== 'object' || itemB === null)
55
+ return false;
56
+ // Is array or object
57
+ if (Array.isArray(itemA) && Array.isArray(itemB)) {
58
+ if (itemA.length !== itemB.length)
59
+ return false;
60
+ for (let i = 0; i < itemA.length; i++) {
61
+ if (!deepCompare(itemA[i], itemB[i]))
62
+ return false;
63
+ }
64
+ }
65
+ // Is object (not null) or array
66
+ if (Array.isArray(itemA) || Array.isArray(itemB))
67
+ return false;
68
+ // Is object
69
+ const keysA = keys(itemA);
70
+ const keysB = keys(itemB);
71
+ if (keysA.length !== keysB.length)
72
+ return false;
73
+ for (const key of keysA) {
74
+ if (!deepCompare(itemA[key], itemB[key]))
75
+ return false;
76
+ }
77
+ return true;
78
+ }
79
+ /**
80
+ * Parses error stack trace
81
+ *
82
+ * @deprecated Doesn't work right with fucking tsx or fucking next.js.
83
+ */
84
+ export function getErrorTrace() {
85
+ let stack;
86
+ try {
87
+ throw new Error();
88
+ }
89
+ catch (error) {
90
+ assert(error instanceof Error, 'Invalid error.');
91
+ stack = error.stack || '';
92
+ }
93
+ const stackList = stack.split("\n");
94
+ const stackTrace = [];
95
+ for (let i = 1; i < stackList.length; i++) {
96
+ const regexp = /^\s+at (.+) \((.+):(\d+):(\d+)\)$/;
97
+ const match = regexp.exec(stackList[i]);
98
+ if (!match) {
99
+ stackTrace.push({
100
+ value: stackList[i]
101
+ });
102
+ continue;
103
+ }
104
+ const name = match[1];
105
+ const path = match[2];
106
+ const line = parseInt(match[3]);
107
+ const position = parseInt(match[4]);
108
+ const item = {
109
+ name: name,
110
+ path: path,
111
+ line,
112
+ position
113
+ };
114
+ stackTrace.push(item);
115
+ }
116
+ return stackTrace;
117
+ }
118
+ export function getCaller(lineOffset = 2) {
119
+ const stack = new Error().stack;
120
+ if (!stack)
121
+ return null;
122
+ const lines = stack.split('\n');
123
+ const caller = lines[lineOffset];
124
+ if (!caller)
125
+ return null;
126
+ const callerParsed = /^\W*at (.+) \((.+):(\d+):(\d+)\)$/.exec(caller);
127
+ if (callerParsed === null)
128
+ return null;
129
+ const at = callerParsed[1] === '<anonymous>' ? null : callerParsed[1];
130
+ const file = callerParsed[2];
131
+ const line = parseInt(callerParsed[3]);
132
+ const char = parseInt(callerParsed[4]);
133
+ return {
134
+ at,
135
+ file,
136
+ line,
137
+ char
138
+ };
139
+ }
140
+ //# sourceMappingURL=general.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"general.js","sourceRoot":"","sources":["../../src/general.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export * from './array.js';
2
+ export * from './general.js';
3
+ export * from './record.js';
4
+ export * from './string.js';
5
+ export * from './vector.js';
6
+ export * from './math.js';
7
+ export * from './polyfill.js';
8
+ export * from './lib/UnitsCalculator.js';
9
+ export * from './lib/Listenable.js';
10
+ export * from './lib/AsyncClass.js';
11
+ export * from './types.js';
@@ -0,0 +1,12 @@
1
+ export * from './array.js';
2
+ export * from './general.js';
3
+ export * from './record.js';
4
+ export * from './string.js';
5
+ export * from './vector.js';
6
+ export * from './math.js';
7
+ export * from './polyfill.js';
8
+ export * from './lib/UnitsCalculator.js';
9
+ export * from './lib/Listenable.js';
10
+ export * from './lib/AsyncClass.js';
11
+ export * from './types.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAE9B,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AAEpC,cAAc,YAAY,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { Nullable, Promiseable } from '../types.js';
2
+ type AwaiterCallback<T> = (instance: T) => void;
3
+ export declare abstract class AsyncClass<T> {
4
+ private awaiters;
5
+ private instance;
6
+ constructor();
7
+ protected abstract loadInstance(): Promiseable<T>;
8
+ private init;
9
+ getInstance(): Nullable<T>;
10
+ getInstanceAsync(): Promiseable<T>;
11
+ onInstanceLoad(callback: AwaiterCallback<T>): void;
12
+ }
13
+ export {};
@@ -0,0 +1,33 @@
1
+ import { nextTick } from '../polyfill.js';
2
+ export class AsyncClass {
3
+ awaiters = [];
4
+ instance = null;
5
+ constructor() {
6
+ this.init();
7
+ }
8
+ async init() {
9
+ nextTick(async () => {
10
+ const result = await this.loadInstance();
11
+ this.instance = result;
12
+ for (const awaiter of this.awaiters)
13
+ awaiter(result);
14
+ this.awaiters = [];
15
+ });
16
+ }
17
+ getInstance() {
18
+ return this.instance;
19
+ }
20
+ getInstanceAsync() {
21
+ if (this.instance !== null)
22
+ return this.instance;
23
+ return new Promise((resolve) => this.onInstanceLoad((instance) => resolve(instance)));
24
+ }
25
+ onInstanceLoad(callback) {
26
+ if (this.instance !== null) {
27
+ callback(this.instance);
28
+ return;
29
+ }
30
+ this.awaiters.push(callback);
31
+ }
32
+ }
33
+ //# sourceMappingURL=AsyncClass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AsyncClass.js","sourceRoot":"","sources":["../../../src/lib/AsyncClass.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAI1C,MAAM,OAAgB,UAAU;IAEvB,QAAQ,GAA8B,EAAE,CAAC;IACzC,QAAQ,GAAgB,IAAI,CAAC;IAErC;QAEC,IAAI,CAAC,IAAI,EAAE,CAAC;IACb,CAAC;IAIO,KAAK,CAAC,IAAI;QAEjB,QAAQ,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YAEzC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC;YAEvB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ;gBAClC,OAAO,CAAC,MAAM,CAAC,CAAC;YAEjB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACpB,CAAC,CAAC,CAAC;IACJ,CAAC;IAEM,WAAW;QAEjB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAEM,gBAAgB;QAEtB,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;YACzB,OAAO,IAAI,CAAC,QAAQ,CAAC;QAEtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACvF,CAAC;IAEM,cAAc,CAAC,QAA4B;QAEjD,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAC1B,CAAC;YACA,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO;QACR,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;CACD"}
@@ -0,0 +1,21 @@
1
+ interface ListenerMap {
2
+ [key: string]: unknown;
3
+ }
4
+ type GetCallbackValue<R, L extends keyof R> = ParseCallbackValue<R[L]>;
5
+ type ParseCallbackValue<V> = [V] extends [CustomListener<infer A>] ? [...A] : (V extends void ? [] : [value: V]);
6
+ type GetCallback<V extends unknown[]> = V extends null ? () => void : (...value: V) => void;
7
+ declare const __listenerBrand: unique symbol;
8
+ export interface CustomListener<T extends unknown[]> {
9
+ readonly [__listenerBrand]: T;
10
+ }
11
+ export declare abstract class Listenable<R extends ListenerMap> {
12
+ private readonly maxListeners;
13
+ private listeners;
14
+ private listenerCount;
15
+ constructor(maxListeners?: number);
16
+ on<L extends keyof R>(listener: L, callback: GetCallback<GetCallbackValue<R, L>>, once?: boolean): string;
17
+ off(listener: keyof R): boolean;
18
+ off(listener: keyof R, id: string): boolean;
19
+ triggerListener<L extends keyof R>(listener: L, ...value: GetCallbackValue<R, L>): boolean;
20
+ }
21
+ export {};
@@ -0,0 +1,48 @@
1
+ import { v4 as uuidv4 } from 'uuid';
2
+ export class Listenable {
3
+ maxListeners;
4
+ listeners = {};
5
+ listenerCount = 0;
6
+ constructor(maxListeners = 1000) {
7
+ this.maxListeners = maxListeners;
8
+ }
9
+ on(listener, callback, once) {
10
+ if (this.maxListeners < this.listenerCount)
11
+ throw new Error(`Reached maximum of listeners for ${this.constructor.name}. (${this.maxListeners})`);
12
+ if (!this.listeners[listener])
13
+ this.listeners[listener] = {};
14
+ const uuid = uuidv4();
15
+ const entry = {
16
+ id: uuid,
17
+ once: once === true,
18
+ callback: callback
19
+ };
20
+ this.listeners[listener][uuid] = entry;
21
+ this.listenerCount++;
22
+ return uuid;
23
+ }
24
+ off(listener, id) {
25
+ if (!this.listeners[listener])
26
+ return false;
27
+ let result;
28
+ if (id)
29
+ result = delete this.listeners[listener][id];
30
+ else
31
+ result = delete this.listeners[listener];
32
+ if (result)
33
+ this.listenerCount--;
34
+ return result;
35
+ }
36
+ triggerListener(listener, ...value) {
37
+ if (!this.listeners[listener])
38
+ return false;
39
+ for (const key in this.listeners[listener]) {
40
+ const entry = this.listeners[listener][key];
41
+ entry.callback(...value);
42
+ if (entry.once)
43
+ this.off(listener, entry.id);
44
+ }
45
+ return true;
46
+ }
47
+ }
48
+ //# sourceMappingURL=Listenable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Listenable.js","sourceRoot":"","sources":["../../../src/lib/Listenable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAC,MAAM,MAAM,CAAC;AA8BnC,MAAM,OAAgB,UAAU;IAKb;IAJV,SAAS,GAA4D,EAAE,CAAA;IACvE,aAAa,GAAW,CAAC,CAAC;IAElC,YACkB,eAAuB,IAAI;QAA3B,iBAAY,GAAZ,YAAY,CAAe;IAC1C,CAAC;IAEG,EAAE,CAAoB,QAAW,EAAE,QAA6C,EAAE,IAAc;QACtG,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,aAAa;YACzC,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,CAAC,WAAW,CAAC,IAAI,MAAM,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QAEtG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;YAC5B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;QAE/B,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC;QAEtB,MAAM,KAAK,GAAkB;YAC5B,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,IAAI,KAAK,IAAI;YACnB,QAAQ,EAAE,QAAQ;SAClB,CAAC;QAEF,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAEvC,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,OAAO,IAAI,CAAC;IACb,CAAC;IAKM,GAAG,CAAC,QAAiB,EAAE,EAAW;QACxC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;YAC5B,OAAO,KAAK,CAAC;QAEd,IAAI,MAAe,CAAC;QACpB,IAAI,EAAE;YACL,MAAM,GAAG,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;;YAE7C,MAAM,GAAG,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAE1C,IAAI,MAAM;YACT,IAAI,CAAC,aAAa,EAAE,CAAC;QAEtB,OAAO,MAAM,CAAC;IACf,CAAC;IAEM,eAAe,CAAoB,QAAW,EAAE,GAAG,KAA6B;QACtF,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;YAC5B,OAAO,KAAK,CAAC;QAEd,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAE,CAAC;YAE7C,KAAK,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,CAAC;YAEzB,IAAI,KAAK,CAAC,IAAI;gBACb,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC;CACD"}
@@ -0,0 +1,27 @@
1
+ interface UnitFormat {
2
+ short: string;
3
+ full: string;
4
+ }
5
+ export declare class UnitCalculator<const U extends Record<string, number>> {
6
+ private units;
7
+ private format;
8
+ constructor(units: U, format: Record<keyof U, UnitFormat>);
9
+ getUnitFormat(unit: keyof U): UnitFormat;
10
+ convert(value: number, from: keyof U, to: keyof U): number;
11
+ scaleDownValue(value: number, unit: keyof U): {
12
+ value: number;
13
+ format: keyof U;
14
+ };
15
+ /**
16
+ * Format string
17
+ *
18
+ * @placeholder %v - Value
19
+ * @placeholder %V - Rounded value
20
+ * @placeholder %uu - Unit
21
+ * @placeholder %UU - Unit uppercase
22
+ * @placeholder %u - Short unit
23
+ * @placeholder %U . Short unit uppercase
24
+ */
25
+ formatValue(scaleDown: boolean, format: string, value: number, unit: keyof U, fractionDigits?: number): string;
26
+ }
27
+ export {};
@@ -0,0 +1,86 @@
1
+ import { countStep } from "../general.js";
2
+ import { keys, values } from "../record.js";
3
+ export class UnitCalculator {
4
+ units;
5
+ format;
6
+ constructor(units, format) {
7
+ this.units = units;
8
+ this.format = format;
9
+ }
10
+ getUnitFormat(unit) {
11
+ return this.format[unit];
12
+ }
13
+ convert(value, from, to) {
14
+ const unitKeys = keys(this.units);
15
+ const unitValues = values(this.units);
16
+ const fromIx = unitKeys.indexOf(from);
17
+ const toIx = unitKeys.indexOf(to);
18
+ if (fromIx === -1)
19
+ throw new Error(`Invalid unit '${from}'`);
20
+ if (toIx === -1)
21
+ throw new Error(`Invalid unit '${to}'`);
22
+ if (fromIx === toIx)
23
+ return value;
24
+ let convertedValue = value;
25
+ let conversionStep = fromIx;
26
+ while (conversionStep != toIx) {
27
+ const mp = unitValues[conversionStep + countStep(conversionStep, toIx, 1)];
28
+ if (mp === null || mp === undefined)
29
+ throw new Error('Invalid conversion step.');
30
+ if (conversionStep < toIx) {
31
+ conversionStep++;
32
+ convertedValue /= mp;
33
+ }
34
+ if (conversionStep > toIx) {
35
+ conversionStep--;
36
+ convertedValue *= mp;
37
+ }
38
+ }
39
+ return convertedValue;
40
+ }
41
+ scaleDownValue(value, unit) {
42
+ const keyList = keys(this.units).reverse();
43
+ for (const key of keyList) {
44
+ const formatted = this.convert(value, unit, key);
45
+ if (formatted >= 1.0)
46
+ return {
47
+ value: formatted,
48
+ format: key
49
+ };
50
+ }
51
+ return {
52
+ value: value,
53
+ format: unit
54
+ };
55
+ }
56
+ /**
57
+ * Format string
58
+ *
59
+ * @placeholder %v - Value
60
+ * @placeholder %V - Rounded value
61
+ * @placeholder %uu - Unit
62
+ * @placeholder %UU - Unit uppercase
63
+ * @placeholder %u - Short unit
64
+ * @placeholder %U . Short unit uppercase
65
+ */
66
+ formatValue(scaleDown, format, value, unit, fractionDigits = 2) {
67
+ const data = scaleDown
68
+ ? this.scaleDownValue(value, unit)
69
+ : {
70
+ value: value,
71
+ format: unit
72
+ };
73
+ const unitFormat = this.getUnitFormat(data.format);
74
+ let fullFormat = unitFormat.full;
75
+ if (value === 0 || value > 1)
76
+ fullFormat += 's';
77
+ return format
78
+ .replaceAll(/%v/g, data.value.toFixed(fractionDigits))
79
+ .replaceAll(/%V/g, Math.round(data.value).toString())
80
+ .replaceAll(/%uu/g, fullFormat)
81
+ .replaceAll(/%UU/g, fullFormat.toUpperCase())
82
+ .replaceAll(/%u/g, unitFormat.short)
83
+ .replaceAll(/%U/g, unitFormat.short.toUpperCase());
84
+ }
85
+ }
86
+ //# sourceMappingURL=UnitsCalculator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UnitsCalculator.js","sourceRoot":"","sources":["../../../src/lib/UnitsCalculator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function minmax(value: number, min?: number, max?: number): number;
@@ -0,0 +1,8 @@
1
+ export function minmax(value, min, max) {
2
+ if (min !== undefined)
3
+ value = Math.max(value, min);
4
+ if (max !== undefined)
5
+ value = Math.min(value, max);
6
+ return value;
7
+ }
8
+ //# sourceMappingURL=math.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/math.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,MAAM,CAAC,KAAa,EAAE,GAAY,EAAE,GAAY;IAC/D,IAAI,GAAG,KAAK,SAAS;QACpB,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAE9B,IAAI,GAAG,KAAK,SAAS;QACpB,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAE9B,OAAO,KAAK,CAAC;AACd,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function nextTick(callback: () => void): void;
@@ -0,0 +1,12 @@
1
+ export function nextTick(callback) {
2
+ if (typeof process !== 'undefined' && typeof process.nextTick === 'function') {
3
+ process.nextTick(callback);
4
+ return;
5
+ }
6
+ if (typeof queueMicrotask === 'function') {
7
+ queueMicrotask(callback);
8
+ return;
9
+ }
10
+ Promise.resolve().then(callback).catch(err => setTimeout(() => { throw err; }, 0));
11
+ }
12
+ //# sourceMappingURL=polyfill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polyfill.js","sourceRoot":"","sources":["../../src/polyfill.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ,CAAC,QAAoB;IAE5C,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,UAAU,EAC5E,CAAC;QACA,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC3B,OAAO;IACR,CAAC;IAED,IAAI,OAAO,cAAc,KAAK,UAAU,EACxC,CAAC;QACA,cAAc,CAAC,QAAQ,CAAC,CAAC;QACzB,OAAO;IACR,CAAC;IAED,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACpF,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { Voidable, Optional, RecordKeys } from "./types.js";
2
+ type RecordCallback<K, V, T> = (key: K, value: V, index: number) => T;
3
+ export declare function recordIn<K extends RecordKeys, V, KEY extends RecordKeys>(object: Partial<Record<K, V>>, key: KEY): object is Record<K | KEY, V>;
4
+ export declare function keys<K extends RecordKeys>(object: Partial<Record<K, unknown>>): K[];
5
+ export declare function values<K extends RecordKeys, const V>(object: Partial<Record<K, V>>): V[];
6
+ export declare function entries<K extends RecordKeys, const V>(object: Partial<Record<K, V>>): [K, V][];
7
+ export declare function entriesToRecord<K extends RecordKeys, V>(entries: [K, V][]): Record<K, V>;
8
+ export declare function keysToRecord<K extends RecordKeys, V>(keys: K[], callback: (key: K, index: number) => V): Record<K, V>;
9
+ export declare function valuesToRecord<K extends RecordKeys, V>(values: V[], callback: (value: V, index: number) => K): Record<K, V>;
10
+ export declare function length(object: Partial<Record<RecordKeys, unknown>>): number;
11
+ export declare function find<K extends RecordKeys, const V>(object: Partial<Record<K, V>>, callback: RecordCallback<K, V, Voidable<boolean>>): Optional<[K, V]>;
12
+ export declare function findKey<K extends RecordKeys, const V>(object: Partial<Record<K, V>>, callback: RecordCallback<K, V, Voidable<boolean>>): Optional<K>;
13
+ export declare function findValue<K extends RecordKeys, const V>(object: Partial<Record<K, V>>, callback: RecordCallback<K, V, Voidable<boolean>>): Optional<V>;
14
+ export declare function mapRecord<K extends RecordKeys, const V, RK extends RecordKeys, const RV>(object: Partial<Record<K, V>>, callback: RecordCallback<K, V, [RK, RV]>): Record<RK, RV>;
15
+ export declare function map<K extends RecordKeys, V, R>(object: Partial<Record<K, V>>, callback: RecordCallback<K, V, R>): R[];
16
+ export declare function mapKeys<K extends RecordKeys, const V, RK extends RecordKeys>(object: Partial<Record<K, V>>, callback: RecordCallback<K, V, RK>): Record<RK, V>;
17
+ export declare function mapValues<K extends RecordKeys, const V, RV>(object: Partial<Record<K, V>>, callback: RecordCallback<K, V, RV>): Record<K, RV>;
18
+ export declare function filter<K extends RecordKeys, const V>(object: Partial<Record<K, V>>, callback: RecordCallback<K, V, Voidable<boolean>>): Partial<Record<K, V>>;
19
+ export declare function forEach<K extends RecordKeys, V>(object: Partial<Record<K, V>>, callback: RecordCallback<K, V, void>): void;
20
+ export declare function every<K extends RecordKeys, V>(object: Partial<Record<K, V>>, callback: RecordCallback<K, V, Voidable<boolean>>): boolean;
21
+ export declare function some<K extends RecordKeys, V>(object: Partial<Record<K, V>>, callback: RecordCallback<K, V, Voidable<boolean>>): boolean;
22
+ export declare function recordify<T, R_K extends RecordKeys, R_V>(array: Array<T>, callback: (item: T, index: number) => [R_K, R_V]): Record<R_K, R_V>;
23
+ type Flatten<R extends Record<string, Record<string, unknown>>> = UnionToIntersection<R[keyof R]> extends infer M ? {
24
+ [K in keyof M]: M[K];
25
+ } : never;
26
+ type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
27
+ export declare function flat<R extends Record<string, Record<string, unknown>>>(record: R, includeParentKeys?: boolean): Flatten<R>;
28
+ export {};
@@ -0,0 +1,143 @@
1
+ export function recordIn(object, key) {
2
+ return key in object;
3
+ }
4
+ // Basic
5
+ export function keys(object) {
6
+ const keys = [];
7
+ for (const key in object)
8
+ keys.push(key);
9
+ return keys;
10
+ }
11
+ export function values(object) {
12
+ const values = [];
13
+ for (const key in object)
14
+ values.push(object[key]);
15
+ return values;
16
+ }
17
+ export function entries(object) {
18
+ const entries = [];
19
+ for (const key in object)
20
+ entries.push([key, object[key]]);
21
+ return entries;
22
+ }
23
+ export function entriesToRecord(entries) {
24
+ const record = {};
25
+ for (const entry of entries)
26
+ record[entry[0]] = entry[1];
27
+ return record;
28
+ }
29
+ export function keysToRecord(keys, callback) {
30
+ const record = {};
31
+ let ix = 0;
32
+ for (const key of keys)
33
+ record[key] = callback(key, ix++);
34
+ return record;
35
+ }
36
+ export function valuesToRecord(values, callback) {
37
+ const record = {};
38
+ let ix = 0;
39
+ for (const value of values)
40
+ record[callback(value, ix++)] = value;
41
+ return record;
42
+ }
43
+ export function length(object) {
44
+ return keys(object).length;
45
+ }
46
+ // Find
47
+ export function find(object, callback) {
48
+ let ix = 0;
49
+ for (const key in object) {
50
+ if (callback(key, object[key], ix++))
51
+ return [key, object[key]];
52
+ }
53
+ return undefined;
54
+ }
55
+ export function findKey(object, callback) {
56
+ const result = find(object, callback);
57
+ return result !== undefined ? result[0] : undefined;
58
+ }
59
+ export function findValue(object, callback) {
60
+ const result = find(object, callback);
61
+ return result !== undefined ? result[1] : undefined;
62
+ }
63
+ // Map
64
+ export function mapRecord(object, callback) {
65
+ const newObject = {};
66
+ let ix = 0;
67
+ for (const key in object) {
68
+ const result = callback(key, object[key], ix++);
69
+ newObject[result[0]] = result[1];
70
+ }
71
+ return newObject;
72
+ }
73
+ export function map(object, callback) {
74
+ const mapped = [];
75
+ let ix = 0;
76
+ for (const key in object) {
77
+ mapped.push(callback(key, object[key], ix++));
78
+ }
79
+ return mapped;
80
+ }
81
+ export function mapKeys(object, callback) {
82
+ return mapRecord(object, (k, v, i) => [callback(k, v, i), v]);
83
+ }
84
+ export function mapValues(object, callback) {
85
+ return mapRecord(object, (k, v, i) => [k, callback(k, v, i)]);
86
+ }
87
+ // Filter
88
+ export function filter(object, callback) {
89
+ const newObject = {};
90
+ let ix = 0;
91
+ for (const key in object) {
92
+ if (callback(key, object[key], ix++))
93
+ newObject[key] = object[key];
94
+ }
95
+ return newObject;
96
+ }
97
+ // Foreach
98
+ export function forEach(object, callback) {
99
+ let ix = 0;
100
+ for (const key in object) {
101
+ callback(key, object[key], ix++);
102
+ }
103
+ }
104
+ // Every & some
105
+ export function every(object, callback) {
106
+ let ix = 0;
107
+ for (const key in object) {
108
+ if (!callback(key, object[key], ix++))
109
+ return false;
110
+ }
111
+ return true;
112
+ }
113
+ export function some(object, callback) {
114
+ let ix = 0;
115
+ for (const key in object) {
116
+ if (callback(key, object[key], ix++))
117
+ return true;
118
+ }
119
+ return false;
120
+ }
121
+ // Recordify
122
+ export function recordify(array, callback) {
123
+ const record = {};
124
+ for (let i = 0; i < array.length; i++) {
125
+ const result = callback(array[i], i);
126
+ record[result[0]] = result[1];
127
+ }
128
+ return record;
129
+ }
130
+ export function flat(record, includeParentKeys = false) {
131
+ const result = {};
132
+ for (const parentKey in record) {
133
+ const inner = record[parentKey];
134
+ for (const childKey in inner) {
135
+ let key = childKey;
136
+ if (includeParentKeys)
137
+ key = parentKey + childKey;
138
+ result[key] = inner[childKey];
139
+ }
140
+ }
141
+ return result;
142
+ }
143
+ //# sourceMappingURL=record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/record.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,QAAQ,CAAkD,MAA6B,EAAE,GAAQ;IAChH,OAAO,GAAG,IAAI,MAAM,CAAC;AACtB,CAAC;AAED,QAAQ;AACR,MAAM,UAAU,IAAI,CAAuB,MAAmC;IAC7E,MAAM,IAAI,GAAQ,EAAE,CAAC;IAErB,KAAK,MAAM,GAAG,IAAI,MAAM;QACvB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEhB,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,MAAM,CAAgC,MAA6B;IAClF,MAAM,MAAM,GAAQ,EAAE,CAAC;IAEvB,KAAK,MAAM,GAAG,IAAI,MAAM;QACvB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAE,CAAC,CAAC;IAE3B,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,UAAU,OAAO,CAAgC,MAA6B;IACnF,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,GAAG,IAAI,MAAM;QACvB,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAE,CAAC,CAAC,CAAC;IAEnC,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAA0B,OAAiB;IACzE,MAAM,MAAM,GAA0B,EAAE,CAAC;IAEzC,KAAK,MAAM,KAAK,IAAI,OAAO;QAC1B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAE7B,OAAO,MAAsB,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,YAAY,CAA0B,IAAS,EAAE,QAAsC;IACtG,MAAM,MAAM,GAA0B,EAAE,CAAC;IAEzC,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,KAAK,MAAM,GAAG,IAAI,IAAI;QACrB,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IAEnC,OAAO,MAAsB,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,cAAc,CAA0B,MAAW,EAAE,QAAwC;IAC5G,MAAM,MAAM,GAA0B,EAAE,CAAC;IAEzC,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,KAAK,MAAM,KAAK,IAAI,MAAM;QACzB,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;IAEvC,OAAO,MAAsB,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,MAA4C;IAClE,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;AAC5B,CAAC;AAED,OAAO;AACP,MAAM,UAAU,IAAI,CAAgC,MAA6B,EAAE,QAAiD;IACnI,IAAI,EAAE,GAAG,CAAC,CAAC;IAEX,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QAC1B,IAAI,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAE,EAAE,EAAE,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAE,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,OAAO,CAAgC,MAA6B,EAAE,QAAiD;IACtI,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAEtC,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,SAAS,CAAgC,MAA6B,EAAE,QAAiD;IACxI,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAEtC,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACrD,CAAC;AAED,MAAM;AACN,MAAM,UAAU,SAAS,CAAiE,MAA6B,EAAE,QAAwC;IAChK,MAAM,SAAS,GAA4B,EAAE,CAAC;IAE9C,IAAI,EAAE,GAAG,CAAC,CAAC;IAEX,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAEjD,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,SAA2B,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,GAAG,CAA6B,MAA6B,EAAE,QAAiC;IAC/G,MAAM,MAAM,GAAQ,EAAE,CAAC;IAEvB,IAAI,EAAE,GAAG,CAAC,CAAC;IAEX,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,UAAU,OAAO,CAAuD,MAA6B,EAAE,QAAkC;IAC9I,OAAO,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,SAAS,CAAoC,MAA6B,EAAE,QAAkC;IAC7H,OAAO,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS;AACT,MAAM,UAAU,MAAM,CAAgC,MAA6B,EAAE,QAAiD;IACrI,MAAM,SAAS,GAA0B,EAAE,CAAC;IAE5C,IAAI,EAAE,GAAG,CAAC,CAAC;IAEX,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QAC1B,IAAI,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAE,EAAE,EAAE,EAAE,CAAC;YACpC,SAAS,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,UAAU;AAEV,MAAM,UAAU,OAAO,CAA0B,MAA6B,EAAE,QAAoC;IACnH,IAAI,EAAE,GAAG,CAAC,CAAC;IAEX,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACnC,CAAC;AACF,CAAC;AAED,eAAe;AAEf,MAAM,UAAU,KAAK,CAA0B,MAA6B,EAAE,QAAiD;IAC9H,IAAI,EAAE,GAAG,CAAC,CAAC;IAEX,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAE,EAAE,EAAE,EAAE,CAAC;YACrC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,IAAI,CAA0B,MAA6B,EAAE,QAAiD;IAC7H,IAAI,EAAE,GAAG,CAAC,CAAC;IAEX,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QAC1B,IAAI,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAE,EAAE,EAAE,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC;AAED,YAAY;AAEZ,MAAM,UAAU,SAAS,CAAiC,KAAe,EAAE,QAAgD;IAC1H,MAAM,MAAM,GAA8B,EAAE,CAAC;IAE7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,MAA0B,CAAC;AACnC,CAAC;AAYD,MAAM,UAAU,IAAI,CAAoD,MAAS,EAAE,oBAA6B,KAAK;IACnH,MAAM,MAAM,GAAgC,EAAE,CAAC;IAE/C,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QAChC,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;YACjC,IAAI,GAAG,GAAW,QAAQ,CAAC;YAE3B,IAAI,iBAAiB;gBACpB,GAAG,GAAG,SAAS,GAAG,QAAQ,CAAC;YAExB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO,MAAoB,CAAC;AAC9B,CAAC"}