@hotlap.ai/telemetry 1.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.
package/dist/cli.js ADDED
@@ -0,0 +1,261 @@
1
+ #!/usr/bin/env bun
2
+ // @bun
3
+ import {
4
+ parseIbt
5
+ } from "./ibt.js";
6
+ import {
7
+ createIRSDK
8
+ } from "./live.js";
9
+ import"./index-k5bgtn4c.js";
10
+ import"./binary-reader.js";
11
+ import {
12
+ VERSION
13
+ } from "./constants.js";
14
+
15
+ // src/cli.ts
16
+ import { parseArgs } from "util";
17
+ var { values, positionals } = parseArgs({
18
+ args: Bun.argv.slice(2),
19
+ options: {
20
+ version: { type: "boolean", short: "v" },
21
+ help: { type: "boolean", short: "h" },
22
+ test: { type: "string", short: "t" },
23
+ dump: { type: "string", short: "d" },
24
+ parse: { type: "string", short: "p" },
25
+ info: { type: "boolean", short: "i" },
26
+ vars: { type: "boolean" },
27
+ get: { type: "string", short: "g" },
28
+ "get-all": { type: "string" },
29
+ session: { type: "string", short: "s" },
30
+ output: { type: "string", short: "o" },
31
+ format: { type: "string", short: "f" },
32
+ live: { type: "boolean", short: "l" }
33
+ },
34
+ allowPositionals: true
35
+ });
36
+ function printHelp() {
37
+ console.log(`
38
+ Bun iRacing SDK v${VERSION}
39
+
40
+ Usage: irsdk [options] [file.ibt]
41
+
42
+ Options:
43
+ -v, --version Show version
44
+ -h, --help Show help
45
+ -t, --test <file> Use test file as IRSDK memory map
46
+ -d, --dump <file> Dump IRSDK memory map to file
47
+ -p, --parse <file> Parse IBT file and output to file
48
+ -i, --info Show file/session info
49
+ --vars List all available variables
50
+ -g, --get <var> Get a single variable value
51
+ --get-all <var> Get all values of a variable (IBT only)
52
+ -s, --session <key> Get session info by key
53
+ -o, --output <file> Output file for export
54
+ -f, --format <fmt> Output format: json, csv, ndjson (default: json)
55
+ -l, --live Connect to live iRacing session
56
+
57
+ Examples:
58
+ irsdk mytelemetry.ibt --info
59
+ irsdk mytelemetry.ibt --vars
60
+ irsdk mytelemetry.ibt -g Speed
61
+ irsdk mytelemetry.ibt --get-all Speed -o speed.json
62
+ irsdk mytelemetry.ibt -s WeekendInfo
63
+ irsdk --live -g Speed
64
+ irsdk --test dump.bin -g Throttle
65
+ `);
66
+ }
67
+ async function main() {
68
+ if (values.version) {
69
+ console.log(`Bun iRacing SDK v${VERSION}`);
70
+ return;
71
+ }
72
+ if (values.help) {
73
+ printHelp();
74
+ return;
75
+ }
76
+ const ibtFile = positionals[0];
77
+ if (values.live) {
78
+ await runLive();
79
+ return;
80
+ }
81
+ if (ibtFile) {
82
+ await processIbtFile(ibtFile);
83
+ return;
84
+ }
85
+ if (values.test || values.dump) {
86
+ await runWithTestFile();
87
+ return;
88
+ }
89
+ printHelp();
90
+ }
91
+ async function runLive() {
92
+ const ir = createIRSDK();
93
+ const connected = await ir.startup(values.test, values.dump);
94
+ if (!connected) {
95
+ console.error("Failed to connect to iRacing");
96
+ process.exit(1);
97
+ }
98
+ console.log("Connected to iRacing");
99
+ if (values.vars) {
100
+ const names = ir.varHeaderNames;
101
+ if (names) {
102
+ console.log(`
103
+ Available variables:`);
104
+ for (const name of names.sort()) {
105
+ console.log(` ${name}`);
106
+ }
107
+ }
108
+ ir.shutdown();
109
+ return;
110
+ }
111
+ if (values.get) {
112
+ const value = ir.get(values.get);
113
+ console.log(`${values.get}: ${JSON.stringify(value)}`);
114
+ ir.shutdown();
115
+ return;
116
+ }
117
+ if (values.session) {
118
+ const info = ir.getSessionInfo(values.session);
119
+ console.log(JSON.stringify(info, null, 2));
120
+ ir.shutdown();
121
+ return;
122
+ }
123
+ console.log(`
124
+ Basic telemetry:`);
125
+ const vars = ["Speed", "RPM", "Gear", "Throttle", "Brake", "Lap", "LapDistPct"];
126
+ for (const v of vars) {
127
+ const value = ir.get(v);
128
+ if (value !== null) {
129
+ console.log(` ${v}: ${value}`);
130
+ }
131
+ }
132
+ ir.shutdown();
133
+ }
134
+ async function processIbtFile(filePath) {
135
+ console.log(`Opening ${filePath}...`);
136
+ const ibt = await parseIbt(filePath);
137
+ if (values.info) {
138
+ console.log(`
139
+ File Info:`);
140
+ console.log(` Records: ${ibt.recordCount}`);
141
+ console.log(` Laps: ${ibt.sessionLapCount}`);
142
+ console.log(` Tick Rate: ${ibt.tickRate} Hz`);
143
+ console.log(` Duration: ${((ibt.sessionEndTime - ibt.sessionStartTime) / 60).toFixed(2)} minutes`);
144
+ console.log(` Buffer Length: ${ibt.bufLen} bytes`);
145
+ const weekendInfo = ibt.getSessionInfo("WeekendInfo");
146
+ if (weekendInfo) {
147
+ console.log(` Track: ${weekendInfo.TrackDisplayName || weekendInfo.TrackName || "Unknown"}`);
148
+ }
149
+ const driverInfo = ibt.getSessionInfo("DriverInfo");
150
+ if (driverInfo?.Drivers?.[0]) {
151
+ console.log(` Driver: ${driverInfo.Drivers[0].UserName || "Unknown"}`);
152
+ console.log(` Car: ${driverInfo.Drivers[0].CarScreenName || "Unknown"}`);
153
+ }
154
+ ibt.close();
155
+ return;
156
+ }
157
+ if (values.vars) {
158
+ const names = ibt.varHeaderNames;
159
+ if (names) {
160
+ console.log(`
161
+ Available variables:`);
162
+ for (const name of names.sort()) {
163
+ const header = ibt.getVarHeader(name);
164
+ console.log(` ${name.padEnd(30)} ${header?.unit || ""} (${header?.desc || ""})`);
165
+ }
166
+ }
167
+ ibt.close();
168
+ return;
169
+ }
170
+ if (values.get) {
171
+ const value = ibt.get(ibt.recordCount - 1, values.get);
172
+ console.log(`${values.get} (last record): ${JSON.stringify(value)}`);
173
+ ibt.close();
174
+ return;
175
+ }
176
+ if (values["get-all"]) {
177
+ const varName = values["get-all"];
178
+ console.log(`Getting all values for ${varName}...`);
179
+ const data = ibt.getAllTyped(varName) ?? ibt.getAll(varName);
180
+ if (!data) {
181
+ console.error(`Variable ${varName} not found`);
182
+ ibt.close();
183
+ process.exit(1);
184
+ }
185
+ const format = values.format || "json";
186
+ const output = values.output;
187
+ let content;
188
+ if (format === "csv") {
189
+ content = `index,${varName}
190
+ ` + Array.from(data).map((v, i) => `${i},${v}`).join(`
191
+ `);
192
+ } else if (format === "ndjson") {
193
+ content = Array.from(data).map((v, i) => JSON.stringify({ index: i, [varName]: v })).join(`
194
+ `);
195
+ } else {
196
+ content = JSON.stringify({ variable: varName, count: data.length, data: Array.from(data) }, null, 2);
197
+ }
198
+ if (output) {
199
+ await Bun.write(output, content);
200
+ console.log(`Written to ${output}`);
201
+ } else {
202
+ console.log(content);
203
+ }
204
+ ibt.close();
205
+ return;
206
+ }
207
+ if (values.session) {
208
+ const info = ibt.getSessionInfo(values.session);
209
+ if (info) {
210
+ console.log(JSON.stringify(info, null, 2));
211
+ } else {
212
+ console.error(`Session key ${values.session} not found`);
213
+ }
214
+ ibt.close();
215
+ return;
216
+ }
217
+ if (values.parse) {
218
+ console.log(`Parsing to ${values.parse}...`);
219
+ const output = [];
220
+ const rawSession = ibt.getRawSessionInfo();
221
+ if (rawSession) {
222
+ output.push(rawSession);
223
+ output.push(`
224
+ --- Variables ---
225
+ `);
226
+ }
227
+ const names = ibt.varHeaderNames?.sort() ?? [];
228
+ for (const name of names) {
229
+ const value = ibt.get(ibt.recordCount - 1, name);
230
+ output.push(`${name.padEnd(32)}${JSON.stringify(value)}`);
231
+ }
232
+ await Bun.write(values.parse, output.join(`
233
+ `));
234
+ console.log("Done");
235
+ ibt.close();
236
+ return;
237
+ }
238
+ console.log(`
239
+ Use --info, --vars, --get, --get-all, or --session to explore the file`);
240
+ ibt.close();
241
+ }
242
+ async function runWithTestFile() {
243
+ const ir = createIRSDK();
244
+ const connected = await ir.startup(values.test, values.dump);
245
+ if (!connected) {
246
+ console.error("Failed to initialize from test file");
247
+ process.exit(1);
248
+ }
249
+ if (values.dump) {
250
+ console.log(`Dumped to ${values.dump}`);
251
+ }
252
+ if (values.get) {
253
+ const value = ir.get(values.get);
254
+ console.log(`${values.get}: ${JSON.stringify(value)}`);
255
+ }
256
+ ir.shutdown();
257
+ }
258
+ main().catch((err) => {
259
+ console.error(err);
260
+ process.exit(1);
261
+ });
@@ -0,0 +1,244 @@
1
+ export declare const VERSION = "1.0.0";
2
+ export declare const SIM_STATUS_URL = "http://127.0.0.1:32034/get_sim_status?object=simStatus";
3
+ export declare const DATA_VALID_EVENT_NAME = "LocalIRSDKDataValidEvent";
4
+ export declare const MEMMAPFILE = "LocalIRSDKMemMapFileName";
5
+ export declare const MEMMAPFILESIZE: number;
6
+ export declare const BROADCASTMSGNAME = "IRSDK_BROADCASTMSG";
7
+ export declare const VAR_TYPE_SIZES: readonly [1, 1, 4, 4, 4, 8];
8
+ export type VarType = 0 | 1 | 2 | 3 | 4 | 5;
9
+ export declare const HEADER_SIZE = 112;
10
+ export declare const VAR_HEADER_SIZE = 144;
11
+ export declare const VAR_BUFFER_SIZE = 16;
12
+ export declare const DISK_SUB_HEADER_OFFSET = 112;
13
+ export declare const DISK_SUB_HEADER_SIZE = 32;
14
+ export declare const YAML_CODE_PAGE = "windows-1252";
15
+ export declare const StatusField: {
16
+ readonly STATUS_CONNECTED: 1;
17
+ };
18
+ export declare const EngineWarnings: {
19
+ readonly WATER_TEMP_WARNING: 1;
20
+ readonly FUEL_PRESSURE_WARNING: 2;
21
+ readonly OIL_PRESSURE_WARNING: 4;
22
+ readonly ENGINE_STALLED: 8;
23
+ readonly PIT_SPEED_LIMITER: 16;
24
+ readonly REV_LIMITER_ACTIVE: 32;
25
+ readonly OIL_TEMP_WARNING: 64;
26
+ };
27
+ export declare const Flags: {
28
+ readonly CHECKERED: 1;
29
+ readonly WHITE: 2;
30
+ readonly GREEN: 4;
31
+ readonly YELLOW: 8;
32
+ readonly RED: 16;
33
+ readonly BLUE: 32;
34
+ readonly DEBRIS: 64;
35
+ readonly CROSSED: 128;
36
+ readonly YELLOW_WAVING: 256;
37
+ readonly ONE_LAP_TO_GREEN: 512;
38
+ readonly GREEN_HELD: 1024;
39
+ readonly TEN_TO_GO: 2048;
40
+ readonly FIVE_TO_GO: 4096;
41
+ readonly RANDOM_WAVING: 8192;
42
+ readonly CAUTION: 16384;
43
+ readonly CAUTION_WAVING: 32768;
44
+ readonly BLACK: 65536;
45
+ readonly DISQUALIFY: 131072;
46
+ readonly SERVICIBLE: 262144;
47
+ readonly FURLED: 524288;
48
+ readonly REPAIR: 1048576;
49
+ readonly START_HIDDEN: 268435456;
50
+ readonly START_READY: 536870912;
51
+ readonly START_SET: 1073741824;
52
+ readonly START_GO: 2147483648;
53
+ };
54
+ export declare const TrkLoc: {
55
+ readonly NOT_IN_WORLD: -1;
56
+ readonly OFF_TRACK: 0;
57
+ readonly IN_PIT_STALL: 1;
58
+ readonly APPROACHING_PITS: 2;
59
+ readonly ON_TRACK: 3;
60
+ };
61
+ export declare const TrkSurf: {
62
+ readonly NOT_IN_WORLD: -1;
63
+ readonly UNDEFINED: 0;
64
+ readonly ASPHALT_1: 1;
65
+ readonly ASPHALT_2: 2;
66
+ readonly ASPHALT_3: 3;
67
+ readonly ASPHALT_4: 4;
68
+ readonly CONCRETE_1: 5;
69
+ readonly CONCRETE_2: 6;
70
+ readonly RACING_DIRT_1: 7;
71
+ readonly RACING_DIRT_2: 8;
72
+ readonly PAINT_1: 9;
73
+ readonly PAINT_2: 10;
74
+ readonly RUMBLE_1: 11;
75
+ readonly RUMBLE_2: 12;
76
+ readonly RUMBLE_3: 13;
77
+ readonly RUMBLE_4: 14;
78
+ readonly GRASS_1: 15;
79
+ readonly GRASS_2: 16;
80
+ readonly GRASS_3: 17;
81
+ readonly GRASS_4: 18;
82
+ readonly DIRT_1: 19;
83
+ readonly DIRT_2: 20;
84
+ readonly DIRT_3: 21;
85
+ readonly DIRT_4: 22;
86
+ readonly SAND: 23;
87
+ readonly GRAVEL_1: 24;
88
+ readonly GRAVEL_2: 25;
89
+ readonly GRASSCRETE: 26;
90
+ readonly ASTROTURF: 27;
91
+ };
92
+ export declare const SessionState: {
93
+ readonly INVALID: 0;
94
+ readonly GET_IN_CAR: 1;
95
+ readonly WARMUP: 2;
96
+ readonly PARADE_LAPS: 3;
97
+ readonly RACING: 4;
98
+ readonly CHECKERED: 5;
99
+ readonly COOL_DOWN: 6;
100
+ };
101
+ export declare const CameraState: {
102
+ readonly IS_SESSION_SCREEN: 1;
103
+ readonly IS_SCENIC_ACTIVE: 2;
104
+ readonly CAM_TOOL_ACTIVE: 4;
105
+ readonly UI_HIDDEN: 8;
106
+ readonly USE_AUTO_SHOT_SELECTION: 16;
107
+ readonly USE_TEMPORARY_EDITS: 32;
108
+ readonly USE_KEY_ACCELERATION: 64;
109
+ readonly USE_KEY10X_ACCELERATION: 128;
110
+ readonly USE_MOUSE_AIM_MODE: 256;
111
+ };
112
+ export declare const BroadcastMsg: {
113
+ readonly CAM_SWITCH_POS: 0;
114
+ readonly CAM_SWITCH_NUM: 1;
115
+ readonly CAM_SET_STATE: 2;
116
+ readonly REPLAY_SET_PLAY_SPEED: 3;
117
+ readonly REPLAY_SET_PLAY_POSITION: 4;
118
+ readonly REPLAY_SEARCH: 5;
119
+ readonly REPLAY_SET_STATE: 6;
120
+ readonly RELOAD_TEXTURES: 7;
121
+ readonly CHAT_COMMAND: 8;
122
+ readonly PIT_COMMAND: 9;
123
+ readonly TELEM_COMMAND: 10;
124
+ readonly FFB_COMMAND: 11;
125
+ readonly REPLAY_SEARCH_SESSION_TIME: 12;
126
+ readonly VIDEO_CAPTURE: 13;
127
+ };
128
+ export declare const ChatCommandMode: {
129
+ readonly MACRO: 0;
130
+ readonly BEGIN_CHAT: 1;
131
+ readonly REPLY: 2;
132
+ readonly CANCEL: 3;
133
+ };
134
+ export declare const PitCommandMode: {
135
+ readonly CLEAR: 0;
136
+ readonly WS: 1;
137
+ readonly FUEL: 2;
138
+ readonly LF: 3;
139
+ readonly RF: 4;
140
+ readonly LR: 5;
141
+ readonly RR: 6;
142
+ readonly CLEAR_TIRES: 7;
143
+ readonly FR: 8;
144
+ readonly CLEAR_WS: 9;
145
+ readonly CLEAR_FR: 10;
146
+ readonly CLEAR_FUEL: 11;
147
+ };
148
+ export declare const TelemCommandMode: {
149
+ readonly STOP: 0;
150
+ readonly START: 1;
151
+ readonly RESTART: 2;
152
+ };
153
+ export declare const RpyStateMode: {
154
+ readonly ERASE_TAPE: 0;
155
+ };
156
+ export declare const ReloadTexturesMode: {
157
+ readonly ALL: 0;
158
+ readonly CAR_IDX: 1;
159
+ };
160
+ export declare const RpySrchMode: {
161
+ readonly TO_START: 0;
162
+ readonly TO_END: 1;
163
+ readonly PREV_SESSION: 2;
164
+ readonly NEXT_SESSION: 3;
165
+ readonly PREV_LAP: 4;
166
+ readonly NEXT_LAP: 5;
167
+ readonly PREV_FRAME: 6;
168
+ readonly NEXT_FRAME: 7;
169
+ readonly PREV_INCIDENT: 8;
170
+ readonly NEXT_INCIDENT: 9;
171
+ };
172
+ export declare const RpyPosMode: {
173
+ readonly BEGIN: 0;
174
+ readonly CURRENT: 1;
175
+ readonly END: 2;
176
+ };
177
+ export declare const CsMode: {
178
+ readonly AT_INCIDENT: -3;
179
+ readonly AT_LEADER: -2;
180
+ readonly AT_EXCITING: -1;
181
+ };
182
+ export declare const PitSvFlags: {
183
+ readonly LF_TIRE_CHANGE: 1;
184
+ readonly RF_TIRE_CHANGE: 2;
185
+ readonly LR_TIRE_CHANGE: 4;
186
+ readonly RR_TIRE_CHANGE: 8;
187
+ readonly FUEL_FILL: 16;
188
+ readonly WINDSHIELD_TEAROFF: 32;
189
+ readonly FAST_REPAIR: 64;
190
+ };
191
+ export declare const PitSvStatus: {
192
+ readonly NONE: 0;
193
+ readonly IN_PROGRESS: 1;
194
+ readonly COMPLETE: 2;
195
+ readonly TOO_FAR_LEFT: 100;
196
+ readonly TOO_FAR_RIGHT: 101;
197
+ readonly TOO_FAR_FORWARD: 102;
198
+ readonly TOO_FAR_BACK: 103;
199
+ readonly BAD_ANGLE: 104;
200
+ readonly CANT_FIX_THAT: 105;
201
+ };
202
+ export declare const PaceMode: {
203
+ readonly SINGLE_FILE_START: 0;
204
+ readonly DOUBLE_FILE_START: 1;
205
+ readonly SINGLE_FILE_RESTART: 2;
206
+ readonly DOUBLE_FILE_RESTART: 3;
207
+ readonly NOT_PACING: 4;
208
+ };
209
+ export declare const PaceFlags: {
210
+ readonly END_OF_LINE: 1;
211
+ readonly FREE_PASS: 2;
212
+ readonly WAVED_AROUND: 4;
213
+ };
214
+ export declare const CarLeftRight: {
215
+ readonly OFF: 0;
216
+ readonly CLEAR: 1;
217
+ readonly CAR_LEFT: 2;
218
+ readonly CAR_RIGHT: 3;
219
+ readonly CAR_LEFT_RIGHT: 4;
220
+ readonly TWO_CARS_LEFT: 5;
221
+ readonly TWO_CARS_RIGHT: 6;
222
+ };
223
+ export declare const FFBCommandMode: {
224
+ readonly FFB_COMMAND_MAX_FORCE: 0;
225
+ };
226
+ export declare const VideoCaptureMode: {
227
+ readonly TRIGGER_SCREEN_SHOT: 0;
228
+ readonly START_VIDEO_CAPTURE: 1;
229
+ readonly END_VIDEO_CAPTURE: 2;
230
+ readonly TOGGLE_VIDEO_CAPTURE: 3;
231
+ readonly SHOW_VIDEO_TIMER: 4;
232
+ readonly HIDE_VIDEO_TIMER: 5;
233
+ };
234
+ export declare const TrackWetness: {
235
+ readonly UNKNOWN: 0;
236
+ readonly DRY: 1;
237
+ readonly MOSTLY_DRY: 2;
238
+ readonly VERY_LIGHTLY_WET: 3;
239
+ readonly LIGHTLY_WET: 4;
240
+ readonly MODERATELY_WET: 5;
241
+ readonly VERY_WET: 6;
242
+ readonly EXTREMELY_WET: 7;
243
+ };
244
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,UAAU,CAAC;AAE/B,eAAO,MAAM,cAAc,2DAA2D,CAAC;AACvF,eAAO,MAAM,qBAAqB,6BAA8B,CAAC;AACjE,eAAO,MAAM,UAAU,6BAA8B,CAAC;AACtD,eAAO,MAAM,cAAc,QAAc,CAAC;AAC1C,eAAO,MAAM,gBAAgB,uBAAuB,CAAC;AAErD,eAAO,MAAM,cAAc,6BAA8B,CAAC;AAC1D,MAAM,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAE5C,eAAO,MAAM,WAAW,MAAM,CAAC;AAC/B,eAAO,MAAM,eAAe,MAAM,CAAC;AACnC,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAC1C,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC,eAAO,MAAM,cAAc,iBAAiB,CAAC;AAE7C,eAAO,MAAM,WAAW;;CAEd,CAAC;AAEX,eAAO,MAAM,cAAc;;;;;;;;CAQjB,CAAC;AAEX,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BR,CAAC;AAEX,eAAO,MAAM,MAAM;;;;;;CAMT,CAAC;AAEX,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BV,CAAC;AAEX,eAAO,MAAM,YAAY;;;;;;;;CAQf,CAAC;AAEX,eAAO,MAAM,WAAW;;;;;;;;;;CAUd,CAAC;AAEX,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;CAef,CAAC;AAEX,eAAO,MAAM,eAAe;;;;;CAKlB,CAAC;AAEX,eAAO,MAAM,cAAc;;;;;;;;;;;;;CAajB,CAAC;AAEX,eAAO,MAAM,gBAAgB;;;;CAInB,CAAC;AAEX,eAAO,MAAM,YAAY;;CAEf,CAAC;AAEX,eAAO,MAAM,kBAAkB;;;CAGrB,CAAC;AAEX,eAAO,MAAM,WAAW;;;;;;;;;;;CAWd,CAAC;AAEX,eAAO,MAAM,UAAU;;;;CAIb,CAAC;AAEX,eAAO,MAAM,MAAM;;;;CAIT,CAAC;AAEX,eAAO,MAAM,UAAU;;;;;;;;CAQb,CAAC;AAEX,eAAO,MAAM,WAAW;;;;;;;;;;CAUd,CAAC;AAEX,eAAO,MAAM,QAAQ;;;;;;CAMX,CAAC;AAEX,eAAO,MAAM,SAAS;;;;CAIZ,CAAC;AAEX,eAAO,MAAM,YAAY;;;;;;;;CAQf,CAAC;AAEX,eAAO,MAAM,cAAc;;CAEjB,CAAC;AAEX,eAAO,MAAM,gBAAgB;;;;;;;CAOnB,CAAC;AAEX,eAAO,MAAM,YAAY;;;;;;;;;CASf,CAAC"}