"""Q4: the deserializer's atom->offset table, the merge, and the blank-card path. Three questions, one batch. (a) THE WIRE SIDE. FUN_18013fe00 is the shared ITEM element deserializer. Print it IN FULL (never truncated -- see the absence trap) so the atom dispatch can be enumerated in every form: == 0xNN, != 0xNN, switch case labels and running-sum ladders. Atoms of interest: 0x274 rating, 0x287 resourceId, 0x23 assetId, 0x6b cardassetid, 0x6c cardsubtypeid, 0x23f playStyle, 0x24a preferredPosition, 0x31 attributeList, 0x271 rareflag, 0x172 itemState, 0x173 itemType. HYPOTHESIS: rating 0x274 -> record+0xb4, and playStyle 0x23f has NO arm (the live sweep found no 0xfa anywhere in a record although we send playStyle 250, and the player publisher reads PLAY_STYLE from +0x88). CONTROL: the same enumeration must FIND 0x274 and 0x287, which are known to be parsed. An enumeration that finds neither is a broken enumeration, not an absent atom. (b) THE MERGE. FUN_180141660 (dispatch on record+0x4c) and FUN_180135890 (players branch). Q4 asks what exactly the client failed to find for a blank card and what the minimum viable identity is. (c) THE ACCESSORS the player publisher uses, in full and untruncated, so each published UI key gets an exact record offset. """ import traceback ACC = [0x1801A8010, 0x1801A8020, 0x1801A8090, 0x1801A80A0, 0x1801A80C0, 0x1801A8100, 0x1801A8110, 0x1801A8120, 0x1801A8130, 0x1801A8140, 0x1801A8460, 0x1801A8480, 0x1801A8490, 0x1801A84A0, 0x1801A8550, 0x1801A8590, 0x1801A85C0, 0x1801A85D0, 0x1801A8600, 0x1801A8620, 0x1801A8640, 0x1801A8660, 0x1801A86A0, 0x1801A86B0, 0x1801A87F0, 0x1801A8890, 0x1801A88D0, 0x1801A8950, 0x1801A8940] try: print("=== C: accessors in full ===") for a in ACC: s = dec(a) print("--- %#x len=%d" % (a, len(s))) print(s) print() print("=== B: merge dispatch FUN_180141660 ===") s = dec(0x180141660) print("len=%d" % len(s)) print(s) print() print("=== B2: players merge FUN_180135890 ===") s = dec(0x180135890) print("len=%d" % len(s)) print(s) print() print("=== A: item deserializer FUN_18013fe00 IN FULL ===") s = dec(0x18013FE00, 600) print("len=%d" % len(s)) print(s) except Exception: traceback.print_exc()