@satelliteoflove/godot-mcp 3.16.0 → 3.17.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/addon/commands/input_commands.gd +4 -2
- package/addon/game_bridge/joy_names.gd +68 -0
- package/addon/game_bridge/joy_names.gd.uid +1 -0
- package/addon/game_bridge/mcp_game_bridge.gd +191 -68
- package/addon/plugin.cfg +1 -1
- package/dist/__tests__/tools/game-time.test.js +41 -0
- package/dist/__tests__/tools/game-time.test.js.map +1 -1
- package/dist/__tests__/tools/input.test.js +142 -2
- package/dist/__tests__/tools/input.test.js.map +1 -1
- package/dist/tools/game-time.d.ts +106 -4
- package/dist/tools/game-time.d.ts.map +1 -1
- package/dist/tools/game-time.js +13 -9
- package/dist/tools/game-time.js.map +1 -1
- package/dist/tools/input.d.ts +112 -4
- package/dist/tools/input.d.ts.map +1 -1
- package/dist/tools/input.js +132 -9
- package/dist/tools/input.js.map +1 -1
- package/package.json +1 -1
|
@@ -137,10 +137,12 @@ func _event_to_string(event: InputEvent) -> String:
|
|
|
137
137
|
return "Mouse Button %d" % mouse_event.button_index
|
|
138
138
|
elif event is InputEventJoypadButton:
|
|
139
139
|
var joy_event := event as InputEventJoypadButton
|
|
140
|
-
return "Joypad Button %d" % joy_event.button_index
|
|
140
|
+
return "Joypad Button %d (%s)" % [joy_event.button_index, MCPJoyNames.button_name(joy_event.button_index)]
|
|
141
141
|
elif event is InputEventJoypadMotion:
|
|
142
|
+
# The signed axis_value is the direction bit an agent needs to lift the
|
|
143
|
+
# binding straight into an injection (e.g. move_left = left_x, value -1.0).
|
|
142
144
|
var joy_motion := event as InputEventJoypadMotion
|
|
143
|
-
return "Joypad Axis %d" % joy_motion.axis
|
|
145
|
+
return "Joypad Axis %d (%s, value %+.1f)" % [joy_motion.axis, MCPJoyNames.axis_name(joy_motion.axis), joy_motion.axis_value]
|
|
144
146
|
return event.as_text()
|
|
145
147
|
|
|
146
148
|
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
@tool
|
|
2
|
+
class_name MCPJoyNames
|
|
3
|
+
extends RefCounted
|
|
4
|
+
## Canonical joypad name<->index tables, shared by the game bridge (event
|
|
5
|
+
## injection) and the editor input commands (get_input_map display) so the
|
|
6
|
+
## wire vocabulary and the displayed names can never drift apart.
|
|
7
|
+
|
|
8
|
+
const BUTTONS := {
|
|
9
|
+
"a": JOY_BUTTON_A,
|
|
10
|
+
"b": JOY_BUTTON_B,
|
|
11
|
+
"x": JOY_BUTTON_X,
|
|
12
|
+
"y": JOY_BUTTON_Y,
|
|
13
|
+
"back": JOY_BUTTON_BACK,
|
|
14
|
+
"guide": JOY_BUTTON_GUIDE,
|
|
15
|
+
"start": JOY_BUTTON_START,
|
|
16
|
+
"left_stick": JOY_BUTTON_LEFT_STICK,
|
|
17
|
+
"right_stick": JOY_BUTTON_RIGHT_STICK,
|
|
18
|
+
"left_shoulder": JOY_BUTTON_LEFT_SHOULDER,
|
|
19
|
+
"right_shoulder": JOY_BUTTON_RIGHT_SHOULDER,
|
|
20
|
+
"dpad_up": JOY_BUTTON_DPAD_UP,
|
|
21
|
+
"dpad_down": JOY_BUTTON_DPAD_DOWN,
|
|
22
|
+
"dpad_left": JOY_BUTTON_DPAD_LEFT,
|
|
23
|
+
"dpad_right": JOY_BUTTON_DPAD_RIGHT,
|
|
24
|
+
"misc1": JOY_BUTTON_MISC1,
|
|
25
|
+
"paddle1": JOY_BUTTON_PADDLE1,
|
|
26
|
+
"paddle2": JOY_BUTTON_PADDLE2,
|
|
27
|
+
"paddle3": JOY_BUTTON_PADDLE3,
|
|
28
|
+
"paddle4": JOY_BUTTON_PADDLE4,
|
|
29
|
+
"touchpad": JOY_BUTTON_TOUCHPAD,
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const AXES := {
|
|
33
|
+
"left_x": JOY_AXIS_LEFT_X,
|
|
34
|
+
"left_y": JOY_AXIS_LEFT_Y,
|
|
35
|
+
"right_x": JOY_AXIS_RIGHT_X,
|
|
36
|
+
"right_y": JOY_AXIS_RIGHT_Y,
|
|
37
|
+
"trigger_left": JOY_AXIS_TRIGGER_LEFT,
|
|
38
|
+
"trigger_right": JOY_AXIS_TRIGGER_RIGHT,
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
## Resolve a wire value (name string, or raw index as an escape hatch) to a
|
|
43
|
+
## JoyButton index. Returns -1 for anything unknown.
|
|
44
|
+
static func button_index(value: Variant) -> int:
|
|
45
|
+
if value is int or value is float:
|
|
46
|
+
var i := int(value)
|
|
47
|
+
return i if i >= 0 and i < JOY_BUTTON_SDL_MAX else -1
|
|
48
|
+
return int(BUTTONS.get(str(value), -1))
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
## Resolve a wire axis name to a JoyAxis index. Names only — the name itself
|
|
52
|
+
## is what tells an agent trigger (0..1) from stick (-1..1). Returns -1 if unknown.
|
|
53
|
+
static func axis_index(value: Variant) -> int:
|
|
54
|
+
return int(AXES.get(str(value), -1))
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
static func button_name(idx: int) -> String:
|
|
58
|
+
for n in BUTTONS:
|
|
59
|
+
if int(BUTTONS[n]) == idx:
|
|
60
|
+
return n
|
|
61
|
+
return "button_%d" % idx
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
static func axis_name(idx: int) -> String:
|
|
65
|
+
for n in AXES:
|
|
66
|
+
if int(AXES[n]) == idx:
|
|
67
|
+
return n
|
|
68
|
+
return "axis_%d" % idx
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
uid://row4hmo5gdem
|
|
@@ -137,16 +137,7 @@ func _sequence_process(delta: float) -> void:
|
|
|
137
137
|
|
|
138
138
|
while _sequence_events.size() > 0 and _sequence_events[0].time <= elapsed:
|
|
139
139
|
var seq_event: Dictionary = _sequence_events.pop_front()
|
|
140
|
-
|
|
141
|
-
input_event.action = seq_event.action
|
|
142
|
-
input_event.pressed = seq_event.is_press
|
|
143
|
-
input_event.strength = 1.0 if seq_event.is_press else 0.0
|
|
144
|
-
Input.parse_input_event(input_event)
|
|
145
|
-
if seq_event.is_press:
|
|
146
|
-
_held_actions[seq_event.action] = true
|
|
147
|
-
else:
|
|
148
|
-
_held_actions.erase(seq_event.action)
|
|
149
|
-
_actions_completed += 1
|
|
140
|
+
_actions_completed += _inject_timeline_event(seq_event)
|
|
150
141
|
|
|
151
142
|
# Trigger any frame captures whose offset has arrived (#239). Capture is
|
|
152
143
|
# deferred to frame_post_draw, so it completes a frame or two later; the
|
|
@@ -191,6 +182,7 @@ func _emit_sequence_result() -> void:
|
|
|
191
182
|
"frozen": _frozen,
|
|
192
183
|
"gameplay_ms": roundi(_sequence_gameplay_ms),
|
|
193
184
|
"wall_ms": Time.get_ticks_msec() - _sequence_start_time,
|
|
185
|
+
"input_kinds": _sequence_input_kinds,
|
|
194
186
|
}
|
|
195
187
|
|
|
196
188
|
if not _sequence_report.is_empty():
|
|
@@ -262,6 +254,11 @@ var _sequence_start_time: int = 0
|
|
|
262
254
|
var _sequence_running: bool = false
|
|
263
255
|
var _actions_completed: int = 0
|
|
264
256
|
var _actions_total: int = 0
|
|
257
|
+
# Entry counts by kind ({action, joy_button, axis}) for the current sequence /
|
|
258
|
+
# step window. Echoed in results: its PRESENCE is the version-skew signal a new
|
|
259
|
+
# server uses to detect an old bridge that silently dropped joypad entries.
|
|
260
|
+
var _sequence_input_kinds: Dictionary = {}
|
|
261
|
+
var _step_input_kinds: Dictionary = {}
|
|
265
262
|
# Game time (unpaused, scaled) accumulated across the sequence window — compared
|
|
266
263
|
# against wall time in the result to flag a sequence that ran under a pause/freeze.
|
|
267
264
|
var _sequence_gameplay_ms: float = 0.0
|
|
@@ -295,13 +292,19 @@ const SEQUENCE_MAX_CAPTURE_OFFSET_MS := 300000
|
|
|
295
292
|
# (new sequence) or the node leaves the tree — otherwise the dropped release
|
|
296
293
|
# latches the action "pressed" in the Input singleton (the stuck-held bug).
|
|
297
294
|
var _held_actions: Dictionary = {}
|
|
295
|
+
# Same guarantee for joypad state (#233): buttons whose press has fired
|
|
296
|
+
# (key "device:button") and axes whose last-set value is nonzero
|
|
297
|
+
# (key "device:axis") — a dropped end event would otherwise latch the polled
|
|
298
|
+
# Input singletons (is_joy_button_pressed / get_joy_axis) until game restart.
|
|
299
|
+
var _held_joy_buttons: Dictionary = {}
|
|
300
|
+
var _active_axes: Dictionary = {}
|
|
298
301
|
|
|
299
302
|
|
|
300
|
-
# Release any action still held
|
|
301
|
-
#
|
|
302
|
-
# when nothing is held.
|
|
303
|
+
# Release any action/button still held and re-zero any active axis from an
|
|
304
|
+
# interrupted sequence. A release here is a guaranteed cleanup, never a queued
|
|
305
|
+
# step that a clear could drop. Safe to call when nothing is held.
|
|
303
306
|
func _release_held_actions() -> void:
|
|
304
|
-
if _held_actions.is_empty():
|
|
307
|
+
if _held_actions.is_empty() and _held_joy_buttons.is_empty() and _active_axes.is_empty():
|
|
305
308
|
return
|
|
306
309
|
for action in _held_actions.keys():
|
|
307
310
|
var release := InputEventAction.new()
|
|
@@ -309,10 +312,26 @@ func _release_held_actions() -> void:
|
|
|
309
312
|
release.pressed = false
|
|
310
313
|
release.strength = 0.0
|
|
311
314
|
Input.parse_input_event(release)
|
|
315
|
+
for bkey in _held_joy_buttons.keys():
|
|
316
|
+
var binfo = _held_joy_buttons[bkey]
|
|
317
|
+
var brel := InputEventJoypadButton.new()
|
|
318
|
+
brel.device = int(binfo["device"])
|
|
319
|
+
brel.button_index = int(binfo["button"]) as JoyButton
|
|
320
|
+
brel.pressed = false
|
|
321
|
+
Input.parse_input_event(brel)
|
|
322
|
+
for akey in _active_axes.keys():
|
|
323
|
+
var ainfo = _active_axes[akey]
|
|
324
|
+
var azero := InputEventJoypadMotion.new()
|
|
325
|
+
azero.device = int(ainfo["device"])
|
|
326
|
+
azero.axis = int(ainfo["axis"]) as JoyAxis
|
|
327
|
+
azero.axis_value = 0.0
|
|
328
|
+
Input.parse_input_event(azero)
|
|
312
329
|
# Flush so the release takes effect immediately — _exit_tree may not get
|
|
313
330
|
# another frame, and a cleanup should be deterministic, not deferred.
|
|
314
331
|
Input.flush_buffered_events()
|
|
315
332
|
_held_actions.clear()
|
|
333
|
+
_held_joy_buttons.clear()
|
|
334
|
+
_active_axes.clear()
|
|
316
335
|
|
|
317
336
|
|
|
318
337
|
func _on_debugger_message(message: String, data: Array) -> bool:
|
|
@@ -1169,10 +1188,12 @@ func _event_to_string(event: InputEvent) -> String:
|
|
|
1169
1188
|
return "Mouse Button %d" % mouse_event.button_index
|
|
1170
1189
|
elif event is InputEventJoypadButton:
|
|
1171
1190
|
var joy_event := event as InputEventJoypadButton
|
|
1172
|
-
return "Joypad Button %d" % joy_event.button_index
|
|
1191
|
+
return "Joypad Button %d (%s)" % [joy_event.button_index, MCPJoyNames.button_name(joy_event.button_index)]
|
|
1173
1192
|
elif event is InputEventJoypadMotion:
|
|
1193
|
+
# The signed axis_value is the direction bit an agent needs to lift the
|
|
1194
|
+
# binding straight into an injection (e.g. move_left = left_x, value -1.0).
|
|
1174
1195
|
var joy_motion := event as InputEventJoypadMotion
|
|
1175
|
-
return "Joypad Axis %d" % joy_motion.axis
|
|
1196
|
+
return "Joypad Axis %d (%s, value %+.1f)" % [joy_motion.axis, MCPJoyNames.axis_name(joy_motion.axis), joy_motion.axis_value]
|
|
1176
1197
|
return event.as_text()
|
|
1177
1198
|
|
|
1178
1199
|
|
|
@@ -1182,6 +1203,11 @@ func _handle_execute_input_sequence(data: Array) -> void:
|
|
|
1182
1203
|
var screenshot_offsets: Array = data[2] if data.size() > 2 and data[2] is Array else []
|
|
1183
1204
|
var cap_max_width: int = int(data[3]) if data.size() > 3 else 640
|
|
1184
1205
|
|
|
1206
|
+
# Reset the skew echo up front: the result's input_kinds must reflect THIS
|
|
1207
|
+
# call's compile, never a stale value from a prior sequence (its absence is
|
|
1208
|
+
# how a new server detects an old bridge — a stale dict would mask that).
|
|
1209
|
+
_sequence_input_kinds = {"action": 0, "joy_button": 0, "axis": 0}
|
|
1210
|
+
|
|
1185
1211
|
if inputs.is_empty():
|
|
1186
1212
|
EngineDebugger.send_message("godot_mcp:input_sequence_result", [{
|
|
1187
1213
|
"error": "No inputs provided",
|
|
@@ -1233,34 +1259,14 @@ func _handle_execute_input_sequence(data: Array) -> void:
|
|
|
1233
1259
|
_sequence_captures_pending = 0
|
|
1234
1260
|
_sequence_capture_max_width = cap_max_width
|
|
1235
1261
|
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
if not InputMap.has_action(action_name):
|
|
1245
|
-
EngineDebugger.send_message("godot_mcp:input_sequence_result", [{
|
|
1246
|
-
"error": "Unknown action: %s" % action_name,
|
|
1247
|
-
}])
|
|
1248
|
-
return
|
|
1249
|
-
|
|
1250
|
-
_sequence_events.append({
|
|
1251
|
-
"time": start_ms,
|
|
1252
|
-
"action": action_name,
|
|
1253
|
-
"is_press": true,
|
|
1254
|
-
})
|
|
1255
|
-
_sequence_events.append({
|
|
1256
|
-
"time": start_ms + duration_ms,
|
|
1257
|
-
"action": action_name,
|
|
1258
|
-
"is_press": false,
|
|
1259
|
-
})
|
|
1260
|
-
|
|
1261
|
-
_sequence_events.sort_custom(func(a: Dictionary, b: Dictionary) -> bool:
|
|
1262
|
-
return a.time < b.time
|
|
1263
|
-
)
|
|
1262
|
+
var compiled := _compile_input_events(inputs)
|
|
1263
|
+
if compiled.has("error"):
|
|
1264
|
+
EngineDebugger.send_message("godot_mcp:input_sequence_result", [{
|
|
1265
|
+
"error": compiled["error"],
|
|
1266
|
+
}])
|
|
1267
|
+
return
|
|
1268
|
+
_sequence_events = compiled["events"]
|
|
1269
|
+
_sequence_input_kinds = compiled["kinds"]
|
|
1264
1270
|
|
|
1265
1271
|
# Baseline the effect probe at the last possible moment before any input fires.
|
|
1266
1272
|
_sequence_report = report_compiled
|
|
@@ -1514,6 +1520,10 @@ func _handle_game_time_step(data: Array) -> void:
|
|
|
1514
1520
|
_send_game_time_response("game_time_step", {"error": "Step already in progress"})
|
|
1515
1521
|
return
|
|
1516
1522
|
|
|
1523
|
+
# Reset the skew echo up front (see _handle_execute_input_sequence): the
|
|
1524
|
+
# step result's input_kinds must reflect this call, never a prior step's.
|
|
1525
|
+
_step_input_kinds = {"action": 0, "joy_button": 0, "axis": 0}
|
|
1526
|
+
|
|
1517
1527
|
var duration_ms: int = int(params.get("duration_ms", 0))
|
|
1518
1528
|
var frames: int = int(params.get("frames", 0))
|
|
1519
1529
|
if duration_ms <= 0 and frames <= 0:
|
|
@@ -1526,10 +1536,11 @@ func _handle_game_time_step(data: Array) -> void:
|
|
|
1526
1536
|
# from window start). Inputs must ride inside the step: an event injected
|
|
1527
1537
|
# while frozen lands on a frame gameplay never processes, so its
|
|
1528
1538
|
# is_action_just_pressed edge would be silently missed.
|
|
1529
|
-
var compiled :=
|
|
1539
|
+
var compiled := _compile_input_events(params.get("inputs", []))
|
|
1530
1540
|
if compiled.has("error"):
|
|
1531
1541
|
_send_game_time_response("game_time_step", {"error": compiled["error"]})
|
|
1532
1542
|
return
|
|
1543
|
+
_step_input_kinds = compiled["kinds"]
|
|
1533
1544
|
|
|
1534
1545
|
# Step from a running game is allowed — it freezes first, so "advance
|
|
1535
1546
|
# 500ms then wait for me" is a single atomic call.
|
|
@@ -1564,24 +1575,136 @@ func _handle_game_time_step(data: Array) -> void:
|
|
|
1564
1575
|
_update_processing()
|
|
1565
1576
|
|
|
1566
1577
|
|
|
1567
|
-
func
|
|
1568
|
-
# Builds the
|
|
1569
|
-
#
|
|
1578
|
+
func _compile_input_events(inputs: Array) -> Dictionary:
|
|
1579
|
+
# Builds the typed input timeline shared by input sequences and game-time
|
|
1580
|
+
# steps (#233). Each entry is discriminated by which key it carries:
|
|
1581
|
+
# `axis` (analog joypad axis), `joy_button`, or `action_name` (with optional
|
|
1582
|
+
# fractional `strength`). Returns {"events": [...], "kinds": {...}} or
|
|
1583
|
+
# {"error": ...} on an unknown action/button/axis. Every event carries:
|
|
1584
|
+
# time - ms offset from sequence/window start
|
|
1585
|
+
# phase - 0 = release/zero-set, 1 = press/set (the equal-time tie-break)
|
|
1586
|
+
# complete - completion credit, counted when the event fires (1 on ends)
|
|
1570
1587
|
var events: Array = []
|
|
1588
|
+
var kinds := {"action": 0, "joy_button": 0, "axis": 0}
|
|
1571
1589
|
for input in inputs:
|
|
1572
|
-
var action_name: String = input.get("action_name", "")
|
|
1573
|
-
if action_name.is_empty():
|
|
1574
|
-
continue
|
|
1575
|
-
if not InputMap.has_action(action_name):
|
|
1576
|
-
return {"error": "Unknown action: %s" % action_name}
|
|
1577
1590
|
var start_ms: int = int(input.get("start_ms", 0))
|
|
1578
1591
|
var dur: int = int(input.get("duration_ms", 0))
|
|
1579
|
-
|
|
1580
|
-
|
|
1592
|
+
# An instant tap (duration 0 — the schema default) must still emit its end
|
|
1593
|
+
# event STRICTLY AFTER its start, or the equal-time (time, phase) sort below
|
|
1594
|
+
# orders the release/zero-set before the press/set and the input latches
|
|
1595
|
+
# (press never paired with a release). One ms is enough: the time sort then
|
|
1596
|
+
# fires start-before-end even when both land in the same process frame.
|
|
1597
|
+
var end_ms: int = start_ms + maxi(dur, 1)
|
|
1598
|
+
if input.has("axis"):
|
|
1599
|
+
var axis := MCPJoyNames.axis_index(input["axis"])
|
|
1600
|
+
if axis < 0:
|
|
1601
|
+
return {"error": "Unknown joypad axis: %s (valid: %s)" % [str(input["axis"]), ", ".join(MCPJoyNames.AXES.keys())]}
|
|
1602
|
+
var device: int = int(input.get("device", 0))
|
|
1603
|
+
var value: float = clampf(float(input.get("value", 0.0)), -1.0, 1.0)
|
|
1604
|
+
kinds["axis"] += 1
|
|
1605
|
+
events.append({"time": start_ms, "phase": 1, "complete": 0,
|
|
1606
|
+
"kind": "axis", "axis": axis, "device": device, "value": value})
|
|
1607
|
+
events.append({"time": end_ms, "phase": 0, "complete": 1,
|
|
1608
|
+
"kind": "axis", "axis": axis, "device": device, "value": 0.0})
|
|
1609
|
+
elif input.has("joy_button"):
|
|
1610
|
+
var button := MCPJoyNames.button_index(input["joy_button"])
|
|
1611
|
+
if button < 0:
|
|
1612
|
+
return {"error": "Unknown joypad button: %s (valid: %s, or a raw index)" % [str(input["joy_button"]), ", ".join(MCPJoyNames.BUTTONS.keys())]}
|
|
1613
|
+
var bdevice: int = int(input.get("device", 0))
|
|
1614
|
+
kinds["joy_button"] += 1
|
|
1615
|
+
events.append({"time": start_ms, "phase": 1, "complete": 0,
|
|
1616
|
+
"kind": "joy_button", "button": button, "device": bdevice, "is_press": true})
|
|
1617
|
+
events.append({"time": end_ms, "phase": 0, "complete": 1,
|
|
1618
|
+
"kind": "joy_button", "button": button, "device": bdevice, "is_press": false})
|
|
1619
|
+
else:
|
|
1620
|
+
var action_name: String = input.get("action_name", "")
|
|
1621
|
+
if action_name.is_empty():
|
|
1622
|
+
continue
|
|
1623
|
+
if not InputMap.has_action(action_name):
|
|
1624
|
+
return {"error": "Unknown action: %s" % action_name}
|
|
1625
|
+
var strength: float = clampf(float(input.get("strength", 1.0)), 0.0, 1.0)
|
|
1626
|
+
kinds["action"] += 1
|
|
1627
|
+
events.append({"time": start_ms, "phase": 1, "complete": 0,
|
|
1628
|
+
"kind": "action", "action": action_name, "strength": strength, "is_press": true})
|
|
1629
|
+
events.append({"time": end_ms, "phase": 0, "complete": 1,
|
|
1630
|
+
"kind": "action", "action": action_name, "strength": strength, "is_press": false})
|
|
1631
|
+
# Releases/zero-sets fire before presses/sets at equal time, so a same-time
|
|
1632
|
+
# axis zero can never clobber a follow-on set of the same axis.
|
|
1581
1633
|
events.sort_custom(func(a: Dictionary, b: Dictionary) -> bool:
|
|
1582
|
-
|
|
1634
|
+
if a.time != b.time:
|
|
1635
|
+
return a.time < b.time
|
|
1636
|
+
return a.phase < b.phase
|
|
1583
1637
|
)
|
|
1584
|
-
|
|
1638
|
+
_cancel_redundant_axis_zeroes(events)
|
|
1639
|
+
return {"events": events, "kinds": kinds}
|
|
1640
|
+
|
|
1641
|
+
|
|
1642
|
+
func _cancel_redundant_axis_zeroes(events: Array) -> void:
|
|
1643
|
+
# Abutting same-axis entries (sweep ramps) must not bounce through zero:
|
|
1644
|
+
# both the zero-set and the next set pop in the same frame's while-loop, so
|
|
1645
|
+
# sort order alone cannot hide the transient zero from InputMap edge
|
|
1646
|
+
# detection (is_action_just_released would fire mid-sweep). Drop a zero-set
|
|
1647
|
+
# that lands at the same time as a follow-on set of the same (device, axis),
|
|
1648
|
+
# moving its completion credit to the survivor so counts stay exact.
|
|
1649
|
+
# Actions and buttons are deliberately NOT cancelled: release+press at the
|
|
1650
|
+
# same ms is a legitimate double-tap edge.
|
|
1651
|
+
var i := 0
|
|
1652
|
+
while i < events.size():
|
|
1653
|
+
var ev: Dictionary = events[i]
|
|
1654
|
+
if ev.kind == "axis" and ev.phase == 0:
|
|
1655
|
+
var j := i + 1
|
|
1656
|
+
while j < events.size() and events[j].time == ev.time:
|
|
1657
|
+
var nx: Dictionary = events[j]
|
|
1658
|
+
if nx.kind == "axis" and nx.phase == 1 and nx.axis == ev.axis and nx.device == ev.device:
|
|
1659
|
+
nx.complete = int(nx.complete) + int(ev.complete)
|
|
1660
|
+
events.remove_at(i)
|
|
1661
|
+
i -= 1
|
|
1662
|
+
break
|
|
1663
|
+
j += 1
|
|
1664
|
+
i += 1
|
|
1665
|
+
|
|
1666
|
+
|
|
1667
|
+
func _inject_timeline_event(ev: Dictionary) -> int:
|
|
1668
|
+
# Build and parse the engine event for one timeline entry, maintaining the
|
|
1669
|
+
# held-state registries that _release_held_actions uses for guaranteed
|
|
1670
|
+
# cleanup. Returns the event's completion credit. Joypad events drive the
|
|
1671
|
+
# polled Input singletons too (get_joy_axis / is_joy_button_pressed): unlike
|
|
1672
|
+
# the mouse cursor, parse_input_event updates joypad state for any device id
|
|
1673
|
+
# with no physical pad required.
|
|
1674
|
+
match str(ev.kind):
|
|
1675
|
+
"action":
|
|
1676
|
+
var ae := InputEventAction.new()
|
|
1677
|
+
ae.action = ev.action
|
|
1678
|
+
ae.pressed = ev.is_press
|
|
1679
|
+
ae.strength = float(ev.strength) if ev.is_press else 0.0
|
|
1680
|
+
Input.parse_input_event(ae)
|
|
1681
|
+
if ev.is_press:
|
|
1682
|
+
_held_actions[ev.action] = true
|
|
1683
|
+
else:
|
|
1684
|
+
_held_actions.erase(ev.action)
|
|
1685
|
+
"joy_button":
|
|
1686
|
+
var be := InputEventJoypadButton.new()
|
|
1687
|
+
be.device = ev.device
|
|
1688
|
+
be.button_index = ev.button as JoyButton
|
|
1689
|
+
be.pressed = ev.is_press
|
|
1690
|
+
Input.parse_input_event(be)
|
|
1691
|
+
var bkey := "%d:%d" % [ev.device, ev.button]
|
|
1692
|
+
if ev.is_press:
|
|
1693
|
+
_held_joy_buttons[bkey] = {"device": ev.device, "button": ev.button}
|
|
1694
|
+
else:
|
|
1695
|
+
_held_joy_buttons.erase(bkey)
|
|
1696
|
+
"axis":
|
|
1697
|
+
var me := InputEventJoypadMotion.new()
|
|
1698
|
+
me.device = ev.device
|
|
1699
|
+
me.axis = ev.axis as JoyAxis
|
|
1700
|
+
me.axis_value = ev.value
|
|
1701
|
+
Input.parse_input_event(me)
|
|
1702
|
+
var akey := "%d:%d" % [ev.device, ev.axis]
|
|
1703
|
+
if absf(float(ev.value)) > 0.0001:
|
|
1704
|
+
_active_axes[akey] = {"device": ev.device, "axis": ev.axis}
|
|
1705
|
+
else:
|
|
1706
|
+
_active_axes.erase(akey)
|
|
1707
|
+
return int(ev.get("complete", 0))
|
|
1585
1708
|
|
|
1586
1709
|
|
|
1587
1710
|
func _build_predicate_context() -> Dictionary:
|
|
@@ -1660,6 +1783,9 @@ func _handle_game_time_step_until(data: Array) -> void:
|
|
|
1660
1783
|
_send_game_time_response("game_time_step_until", {"error": "Step already in progress"})
|
|
1661
1784
|
return
|
|
1662
1785
|
|
|
1786
|
+
# Reset the skew echo up front (see _handle_execute_input_sequence).
|
|
1787
|
+
_step_input_kinds = {"action": 0, "joy_button": 0, "axis": 0}
|
|
1788
|
+
|
|
1663
1789
|
var src: String = str(params.get("until", "")).strip_edges()
|
|
1664
1790
|
if src.is_empty():
|
|
1665
1791
|
_send_game_time_response("game_time_step_until", {"error": "step_until requires a non-empty `until` expression"})
|
|
@@ -1693,14 +1819,17 @@ func _handle_game_time_step_until(data: Array) -> void:
|
|
|
1693
1819
|
return
|
|
1694
1820
|
var report_compiled: Array = report_result["report"]
|
|
1695
1821
|
|
|
1696
|
-
var compiled :=
|
|
1822
|
+
var compiled := _compile_input_events(params.get("inputs", []))
|
|
1697
1823
|
if compiled.has("error"):
|
|
1698
1824
|
_send_game_time_response("game_time_step_until", {"error": compiled["error"]})
|
|
1699
1825
|
return
|
|
1826
|
+
_step_input_kinds = compiled["kinds"]
|
|
1700
1827
|
|
|
1701
1828
|
_engage_freeze()
|
|
1702
1829
|
|
|
1703
1830
|
# Predicate already holds: advance nothing, stay frozen, report it.
|
|
1831
|
+
# input_kinds still rides along — its absence is the version-skew signal a
|
|
1832
|
+
# new server reads, so every success shape must carry it.
|
|
1704
1833
|
if bool(first_value):
|
|
1705
1834
|
var sc_result: Dictionary = {
|
|
1706
1835
|
"completed": true,
|
|
@@ -1711,6 +1840,7 @@ func _handle_game_time_step_until(data: Array) -> void:
|
|
|
1711
1840
|
"physics_ticks": 0,
|
|
1712
1841
|
"game_paused": _game_paused,
|
|
1713
1842
|
"predicate_met": true,
|
|
1843
|
+
"input_kinds": _step_input_kinds,
|
|
1714
1844
|
}
|
|
1715
1845
|
if not report_compiled.is_empty():
|
|
1716
1846
|
sc_result["report"] = _evaluate_report(report_compiled, ctx_inputs)
|
|
@@ -1772,17 +1902,9 @@ func _step_process(delta: float) -> void:
|
|
|
1772
1902
|
|
|
1773
1903
|
while _step_events.size() > 0 and _step_events[0].time <= _step_elapsed_ms:
|
|
1774
1904
|
var ev: Dictionary = _step_events.pop_front()
|
|
1775
|
-
|
|
1776
|
-
input_event.action = ev.action
|
|
1777
|
-
input_event.pressed = ev.is_press
|
|
1778
|
-
input_event.strength = 1.0 if ev.is_press else 0.0
|
|
1779
|
-
Input.parse_input_event(input_event)
|
|
1905
|
+
_inject_timeline_event(ev)
|
|
1780
1906
|
_step_events_fired += 1
|
|
1781
1907
|
_step_needs_settle = true
|
|
1782
|
-
if ev.is_press:
|
|
1783
|
-
_held_actions[ev.action] = true
|
|
1784
|
-
else:
|
|
1785
|
-
_held_actions.erase(ev.action)
|
|
1786
1908
|
|
|
1787
1909
|
var done := false
|
|
1788
1910
|
if _step_target_frames > 0:
|
|
@@ -1822,7 +1944,7 @@ func _step_process(delta: float) -> void:
|
|
|
1822
1944
|
func _finish_step() -> void:
|
|
1823
1945
|
# Releases are guaranteed cleanup, never queued steps: no holds survive
|
|
1824
1946
|
# across the freeze boundary (cross-step holds are a deliberate non-goal).
|
|
1825
|
-
var forced := _held_actions.size()
|
|
1947
|
+
var forced := _held_actions.size() + _held_joy_buttons.size() + _active_axes.size()
|
|
1826
1948
|
_release_held_actions()
|
|
1827
1949
|
var dropped := _step_events.size()
|
|
1828
1950
|
_step_events.clear()
|
|
@@ -1842,6 +1964,7 @@ func _finish_step() -> void:
|
|
|
1842
1964
|
"frames": _step_frames,
|
|
1843
1965
|
"physics_ticks": _step_physics_ticks,
|
|
1844
1966
|
"game_paused": _game_paused,
|
|
1967
|
+
"input_kinds": _step_input_kinds,
|
|
1845
1968
|
}
|
|
1846
1969
|
if _step_events_fired > 0:
|
|
1847
1970
|
result["events_fired"] = _step_events_fired
|
package/addon/plugin.cfg
CHANGED
|
@@ -111,6 +111,47 @@ describe('game_time tool', () => {
|
|
|
111
111
|
expect(data.game_paused).toBe(true);
|
|
112
112
|
expect(data.gameplay_ms).toBe(120);
|
|
113
113
|
});
|
|
114
|
+
it('accepts joypad entries, compiles stick sugar onto the wire, and surfaces input_kinds (#233)', async () => {
|
|
115
|
+
mock.mockResponse({
|
|
116
|
+
completed: true, frozen: true, elapsed_ms: 500, gameplay_ms: 500,
|
|
117
|
+
frames: 30, physics_ticks: 30, game_paused: false, events_fired: 6,
|
|
118
|
+
input_kinds: { action: 0, joy_button: 1, axis: 2 },
|
|
119
|
+
});
|
|
120
|
+
const ctx = createToolContext(mock);
|
|
121
|
+
const result = await gameTime.execute({
|
|
122
|
+
action: 'step',
|
|
123
|
+
duration_ms: 500,
|
|
124
|
+
inputs: [
|
|
125
|
+
{ stick: 'left', x: 0.5, y: -0.5, device: 0, start_ms: 0, duration_ms: 400 },
|
|
126
|
+
{ joy_button: 'a', device: 0, start_ms: 200, duration_ms: 50 },
|
|
127
|
+
],
|
|
128
|
+
}, ctx);
|
|
129
|
+
expect(mock.calls[0].params.inputs).toEqual([
|
|
130
|
+
{ axis: 'left_x', value: 0.5, device: 0, start_ms: 0, duration_ms: 400 },
|
|
131
|
+
{ axis: 'left_y', value: -0.5, device: 0, start_ms: 0, duration_ms: 400 },
|
|
132
|
+
// Non-stick entries pass through verbatim.
|
|
133
|
+
{ joy_button: 'a', device: 0, start_ms: 200, duration_ms: 50 },
|
|
134
|
+
]);
|
|
135
|
+
const data = structuredOf(result);
|
|
136
|
+
expect(data.input_kinds).toEqual({ action: 0, joy_button: 1, axis: 2 });
|
|
137
|
+
// Stable shape (#198 precedent): warnings is always an array, empty here.
|
|
138
|
+
expect(data.warnings).toEqual([]);
|
|
139
|
+
});
|
|
140
|
+
it('warns in the structured result when joypad entries hit an old addon (no input_kinds) (#233)', async () => {
|
|
141
|
+
mock.mockResponse({
|
|
142
|
+
completed: true, frozen: true, elapsed_ms: 500, gameplay_ms: 500,
|
|
143
|
+
frames: 30, physics_ticks: 30, game_paused: false,
|
|
144
|
+
});
|
|
145
|
+
const ctx = createToolContext(mock);
|
|
146
|
+
const result = await gameTime.execute({
|
|
147
|
+
action: 'step',
|
|
148
|
+
duration_ms: 500,
|
|
149
|
+
inputs: [{ axis: 'left_x', value: 1, device: 0, start_ms: 0, duration_ms: 200 }],
|
|
150
|
+
}, ctx);
|
|
151
|
+
const data = structuredOf(result);
|
|
152
|
+
expect(data.warnings).toHaveLength(1);
|
|
153
|
+
expect(data.warnings[0]).toContain('predates controller injection');
|
|
154
|
+
});
|
|
114
155
|
it('derives the per-request timeout and pushes the relay/wall budgets to the bridge (#276)', async () => {
|
|
115
156
|
mock.mockResponse({
|
|
116
157
|
completed: true, frozen: true, elapsed_ms: 500, gameplay_ms: 500,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"game-time.test.js","sourceRoot":"","sources":["../../../src/__tests__/tools/game-time.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"game-time.test.js","sourceRoot":"","sources":["../../../src/__tests__/tools/game-time.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAuB,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACjH,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,IAAyB,CAAC;IAE9B,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,GAAG,eAAe,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC5D,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1E,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3F,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7F,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9F,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvF,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxF,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;gBAC/B,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,GAAG;gBAChB,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;aACnE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChF,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3F,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtG,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6EAA6E,EAAE,GAAG,EAAE;YACrF,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7G,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9G,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1G,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7H,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7G,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;gBAC/B,MAAM,EAAE,YAAY;gBACpB,KAAK,EAAE,MAAM;gBACb,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;aACpE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3E,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;YACtC,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;YAC3E,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAEpC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,GAAG,CAAC,CAAC;YACjE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;YACzE,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAEpC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,GAAG,CAAC,CAAC;YACjE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;QACpB,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;YAChF,IAAI,CAAC,YAAY,CAAC;gBAChB,SAAS,EAAE,IAAI;gBACf,MAAM,EAAE,IAAI;gBACZ,UAAU,EAAE,GAAG;gBACf,WAAW,EAAE,GAAG;gBAChB,MAAM,EAAE,EAAE;gBACV,aAAa,EAAE,EAAE;gBACjB,WAAW,EAAE,KAAK;gBAClB,YAAY,EAAE,CAAC;aAChB,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAEpC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;gBACpC,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,GAAG;gBAChB,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;aACjE,EAAE,GAAG,CAAC,CAAC;YAER,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACrD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACpD,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,IAAI,CAAC,YAAY,CAAC;gBAChB,SAAS,EAAE,IAAI;gBACf,MAAM,EAAE,IAAI;gBACZ,UAAU,EAAE,GAAG;gBACf,WAAW,EAAE,GAAG;gBAChB,MAAM,EAAE,EAAE;gBACV,aAAa,EAAE,CAAC;gBAChB,WAAW,EAAE,IAAI;gBACjB,iBAAiB,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;aAClD,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAEpC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;YACjF,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6FAA6F,EAAE,KAAK,IAAI,EAAE;YAC3G,IAAI,CAAC,YAAY,CAAC;gBAChB,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG;gBAChE,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;gBAClE,WAAW,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;aACnD,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAEpC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;gBACpC,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,GAAG;gBAChB,MAAM,EAAE;oBACN,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;oBAC5E,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE;iBAC/D;aACF,EAAE,GAAG,CAAC,CAAC;YAER,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBAC1C,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;gBACxE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;gBACzE,2CAA2C;gBAC3C,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE;aAC/D,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YACxE,0EAA0E;YAC1E,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6FAA6F,EAAE,KAAK,IAAI,EAAE;YAC3G,IAAI,CAAC,YAAY,CAAC;gBAChB,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG;gBAChE,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK;aAClD,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAEpC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;gBACpC,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,GAAG;gBAChB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;aACjF,EAAE,GAAG,CAAC,CAAC;YAER,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACtC,MAAM,CAAE,IAAI,CAAC,QAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;QACpF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wFAAwF,EAAE,KAAK,IAAI,EAAE;YACtG,IAAI,CAAC,YAAY,CAAC;gBAChB,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG;gBAChE,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK;aAClD,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAEpC,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;YAClE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,8BAA8B;YAC7D,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACrD,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,gFAAgF,EAAE,KAAK,IAAI,EAAE;YAC9F,IAAI,CAAC,YAAY,CAAC;gBAChB,SAAS,EAAE,IAAI;gBACf,MAAM,EAAE,IAAI;gBACZ,UAAU,EAAE,IAAI;gBAChB,WAAW,EAAE,IAAI;gBACjB,MAAM,EAAE,GAAG;gBACX,aAAa,EAAE,GAAG;gBAClB,WAAW,EAAE,KAAK;gBAClB,aAAa,EAAE,IAAI;gBACnB,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE;aACxB,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAEpC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;gBACpC,MAAM,EAAE,YAAY;gBACpB,KAAK,EAAE,gDAAgD;gBACvD,MAAM,EAAE,IAAI;gBACZ,MAAM,EAAE,CAAC,QAAQ,CAAC;aACnB,EAAE,GAAG,CAAC,CAAC;YAER,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;YAC1F,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YACxD,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACrE,IAAI,CAAC,YAAY,CAAC;gBAChB,SAAS,EAAE,IAAI;gBACf,MAAM,EAAE,IAAI;gBACZ,UAAU,EAAE,IAAI;gBAChB,WAAW,EAAE,IAAI;gBACjB,MAAM,EAAE,GAAG;gBACX,aAAa,EAAE,GAAG;gBAClB,WAAW,EAAE,KAAK;gBAClB,aAAa,EAAE,KAAK;gBACpB,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE;aACxB,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAEpC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAC5H,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAC;YAC/E,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAEpC,MAAM,MAAM,CACV,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,GAAG,CAAC,CACxE,CAAC,OAAO,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;YACnF,IAAI,CAAC,YAAY,CAAC;gBAChB,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC;gBAC5D,MAAM,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI;aACrE,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAEpC,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;YACnF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,0CAA0C;YAC1E,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACrD,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kFAAkF,EAAE,KAAK,IAAI,EAAE;YAChG,IAAI,CAAC,YAAY,CAAC;gBAChB,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK;gBACpE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK;aAC5E,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAEpC,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;YACtE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,mFAAmF;YACnF,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;QACpB,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YAC3C,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;YAClG,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAEpC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;YAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5E,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAEpC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;YAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,IAAI,CAAC,YAAY,CAAC;gBAChB,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,KAAK;gBAClB,WAAW,EAAE,IAAI;gBACjB,iBAAiB,EAAE,GAAG;gBACtB,wBAAwB,EAAE,EAAE;gBAC5B,cAAc,EAAE,KAAK;gBACrB,kBAAkB,EAAE,CAAC;gBACrB,eAAe,EAAE,IAAI;aACtB,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAEpC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,GAAG,CAAC,CAAC;YACjE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACvD,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|