|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 39936 (0x9c00) Types: Ada Source Notes: 03_class, FILE, R1k_Segment, e3_tag, generic, package body Object_Sets, seg_0045b3
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000 └─ ⟦cfc2e13cd⟧ »Space Info Vol 2« └─⟦this⟧
with Object_Info; package body Object_Sets is function "+" (This_Set : in Set; That_Set : in Set) return Set renames Union; function Empty_Set return Set is begin return Directory_Tools.Object.Create; end Empty_Set; function Is_Empty (This_Set : in Set) return Boolean is begin return Object_Info.Any.Is_Empty (This_Set); end Is_Empty; function Number_In (This_Set : in Set) return Natural is begin return Object_Info.Any.Number_In (This_Set); end Number_In; function Are_Equal (This_Set : in Set; That_Set : in Set) return Boolean is Working_Set : Set := This_Set; begin Directory_Tools.Object.Reset (Working_Set); while not Directory_Tools.Object.Done (Working_Set) loop if not Is_Member (That_Set, Directory_Tools.Object.Value (Working_Set)) then -- Found element in one set which isn't in other set. Directory_Tools.Object.Reset (Working_Set); return True; end if; Directory_Tools.Object.Next (Working_Set); end loop; Directory_Tools.Object.Reset (Working_Set); return False; exception when others => Directory_Tools.Object.Reset (Working_Set); return False; end Are_Equal; function Copy_Of (This_Set : in Set) return Set is Working_Set : Set := This_Set; Copy_Set : Set := Empty_Set; begin Directory_Tools.Object.Reset (Working_Set); while not Directory_Tools.Object.Done (Working_Set) loop Add (Directory_Tools.Object.Value (Working_Set), Copy_Set); Directory_Tools.Object.Next (Working_Set); end loop; Directory_Tools.Object.Reset (Working_Set); return Copy_Set; end Copy_Of; function Is_Member (This_Set : in Set; This_Element : in Element) return Boolean is begin return Directory_Tools.Object.Has (This_Set, This_Element); end Is_Member; procedure Add (This_Element : in Element; This_Set : in out Set) is Dummy : Boolean; begin if Object_Info.Any.Is_Good (This_Element) and then not Is_Member (This_Set, This_Element) then if Directory_Tools.Object.Is_Nil (This_Set) then This_Set := Directory_Tools.Object.Create; end if; Directory_Tools.Object.Add (This_Set, This_Element, Dummy); end if; end Add; procedure Remove (This_Element : in Element; This_Set : in out Set) is Dummy : Boolean; begin Directory_Tools.Object.Remove (This_Set, This_Element, Dummy); end Remove; procedure Sort (This_Set : in out Set) is type Sorted_Array is array (1 .. Number_In (This_Set)) of Boolean; Already_Sorted : Sorted_Array := (others => False); Remaining : Natural := Number_In (This_Set); Sorted_Set : Set := Empty_Set; Smallest_This_Pass : Element; Index_Of_Smallest : Natural; Current_Index : Natural; begin while Remaining > 0 loop Current_Index := 1; Directory_Tools.Object.Reset (This_Set); Smallest_This_Pass := Directory_Tools.Object.Value (This_Set); while not Directory_Tools.Object.Done (This_Set) loop if not Already_Sorted (Current_Index) then -- Current element hasn't already been put in -- the sorted array, so test it. if Directory_Tools.Object.Value (This_Set) < Smallest_This_Pass then -- Current element is smaller than the smallest -- element found so far on this pass, so make -- it the new smallest. Smallest_This_Pass := Directory_Tools.Object.Value (This_Set); Index_Of_Smallest := Current_Index; end if; end if; Directory_Tools.Object.Next (This_Set); Current_Index := Current_Index + 1; end loop; Add (Smallest_This_Pass, Sorted_Set); Already_Sorted (Index_Of_Smallest) := True; Remaining := Remaining - 1; end loop; This_Set := Sorted_Set; end Sort; procedure Filter (This_Set : in out Set) is New_Set : Set := Empty_Set; begin Directory_Tools.Object.Reset (This_Set); while not Directory_Tools.Object.Done (This_Set) loop if not Dont_Want (Directory_Tools.Object.Value (This_Set)) then -- Want current element, so add it. Add Directory_Tools.Object.Value (This_Set), New_Set); end if; Directory_Tools.Object.Next (This_Set); end loop; This_Set := New_Set; end Filter; procedure Process_Elements (This_Set : in out Set) is begin Directory_Tools.Object.Reset (This_Set); while not Directory_Tools.Object.Done (This_Set) loop declare Current_Element : Element := Directory_Tools.Object.Value (This_Set); begin Process (Current_Element); end; Directory_Tools.Object.Next (This_Set); end loop; end Process_Elements; procedure Process_Elements_With_State (This_Set : in out Set; This_State : in out Process_State) is begin Initialize (This_State); Directory_Tools.Object.Reset (This_Set); while not Directory_Tools.Object.Done (This_Set) loop declare Current_Element : Element := Directory_Tools.Object.Value (This_Set); begin Process (Current_Element, This_State); end; Directory_Tools.Object.Next (This_Set); end loop; Finalize (This_State); end Process_Elements_With_State; function Union (This_Set : in Set; That_Set : in Set) return Set is Union_Set : Set := Empty_Set; procedure Union_Copy (This_Set : in Set; New_Set : in out Set) is Working_Set : Set := This_Set; begin Directory_Tools.Object.Reset (Working_Set); while not Directory_Tools.Object.Done (Working_Set) loop Add (Directory_Tools.Object.Value (Working_Set), New_Set); Directory_Tools.Object.Next (Working_Set); end loop; end Union_Copy; begin Union_Copy (This_Set, Union_Set); Union_Copy (That_Set, Union_Set); return Union_Set; end Union; function Intersection (This_Set : in Set; That_Set : in Set) return Set is Working_Set : Set := This_Set; Intersection_Set : Set := Empty_Set; begin Directory_Tools.Object.Reset (Working_Set); while not Directory_Tools.Object.Done (Working_Set) loop if Is_Member (That_Set, Directory_Tools.Object.Value (Working_Set)) then -- Found an element in the one set which is also in the -- other set, so add it to the intersection set. Add (Directory_Tools.Object.Value (Working_Set), Intersection_Set); end if; Directory_Tools.Object.Next (Working_Set); end loop; return Intersection_Set; end Intersection; function Exclusive_Or (This_Set : in Set; That_Set : in Set) return Set is Xor_Set : Set := Empty_Set; procedure Xor_Copy (This_Set : in Set; Except_For : in Set; Into : in out Set) is Working_Set : Set := This_Set; begin Directory_Tools.Object.Reset (Working_Set); while not Directory_Tools.Object.Done (Working_Set) loop if not Is_Member (Except_For, Directory_Tools.Object.Value (Working_Set)) then -- Found an element in the one set which is not also -- in the other set, so add it to the new set. Add (Directory_Tools.Object.Value (Working_Set), Into); end if; Directory_Tools.Object.Next (Working_Set); end loop; end Xor_Copy; begin Xor_Copy (This_Set, That_Set, Xor_Set); Xor_Copy (That_Set, This_Set, Xor_Set); return Xor_Set; end Exclusive_Or; function Subtraction (This_Set : in Set; Except_For : in Set) return Set is Working_Set : Set := This_Set; Subtraction_Set : Set := Empty_Set; begin Directory_Tools.Object.Reset (Working_Set); while not Directory_Tools.Object.Done (Working_Set) loop if not Is_Member (Except_For, Directory_Tools.Object.Value (Working_Set)) then -- Found an element in the one set which is not also -- in the other set, so add it to the subtraction set. Add (Directory_Tools.Object.Value (Working_Set), Subtraction_Set); end if; Directory_Tools.Object.Next (Working_Set); end loop; return Subtraction_Set; end Subtraction; function Subset (This_Set : in Set; Contains : in Set) return Boolean is Working_Set : Set := Contains; Result : Boolean := True; begin Directory_Tools.Object.Reset (Working_Set); while not Directory_Tools.Object.Done (Working_Set) loop if not Is_Member (This_Set, Directory_Tools.Object.Value (Working_Set)) then -- Found an element in "Contains" which is not in the -- other set, so is not a subset of the other set. Result := False; exit; end if; Directory_Tools.Object.Next (Working_Set); end loop; return Result; end Subset; function Proper_Subset (This_Set : in Set; Contains : in Set) return Boolean is begin return Subset (This_Set, Contains) and then (Number_In (This_Set) > Number_In (Contains)); end Proper_Subset; procedure Screen (These_Units : in out Set; Exclude : in Set; Specs_Only : in Boolean; Include_Universe_Mirrors : in Boolean) is Screened : Set := Empty_Set; Current : Element; begin Directory_Tools.Object.Reset (These_Units); while not Directory_Tools.Object.Done (These_Units) loop Current := Directory_Tools.Object.Value (These_Units); if Object_Info.Any.Is_Bad (Current) then -- Current unit is bad, so don't add it. null; elsif Is_Member (Exclude, Current) then -- Already have the current unit, so don't add it. null; elsif Specs_Only and then not Object_Info.Ada.Is_Spec (Current) then -- Client wants specs only, and current unit is not a spec, -- so don't add it. null; elsif not Include_Universe_Mirrors and then Object_Info.Ada.Is_Universe_Mirror (Current) then -- Client doesn't want universe mirrors, and current unit is -- a universe mirror, so don't add it. null; else -- Current unit met all criteria, so add it. Add (Current, Screened); end if; Directory_Tools.Object.Next (These_Units); end loop; These_Units := Screened; end Screen; generic with function Immediate_Dependencies (This_Element : in Element; Code_Share_Generics : in Boolean; This_Activity : in Activity.Activity_Name) return Set; function Single_Unit_Dependency_Closure (Unit : in Element; Specs_Only : in Boolean := False; Transitive : in Boolean := True; Include_Universe_Mirrors : in Boolean := False; Code_Share_Generics : in Boolean := True; This_Activity : in Activity.Activity_Name := Activity.The_Current_Activity) return Set; function Single_Unit_Dependency_Closure (Unit : in Element; Specs_Only : in Boolean := False; Transitive : in Boolean := True; Include_Universe_Mirrors : in Boolean := False; Code_Share_Generics : in Boolean := True; This_Activity : in Activity.Activity_Name := Activity.The_Current_Activity) return Set is Closure : Set := Empty_Set; New_Units : Set := Empty_Set; procedure Get_Next_Units (These_Units : in out Set) is New_Units : Set := Empty_Set; begin Directory_Tools.Object.Reset (These_Units); while not Directory_Tools.Object.Done (These_Units) loop New_Units := New_Units + Immediate_Dependencies (Directory_Tools.Object.Value (These_Units), Code_Share_Generics, This_Activity); Directory_Tools.Object.Next (These_Units); end loop; These_Units := New_Units; end Get_Next_Units; begin New_Units := Immediate_Dependencies (Unit, Code_Share_Generics, This_Activity); loop Screen (New_Units, Closure, Specs_Only, Include_Universe_Mirrors); Closure := Closure + New_Units; if not Transitive then -- Only needed to calculate first level. exit; elsif Is_Empty (New_Units) then -- There were no new units, so closure is complete. exit; else -- There are more units requiring processing. Get_Next_Units (New_Units); end if; end loop; return Closure; end Single_Unit_Dependency_Closure; generic with function Single_Unit_Dependency_Closure_Instantiation (Unit : in Element; Specs_Only : in Boolean := False; Transitive : in Boolean := True; Include_Universe_Mirrors : in Boolean := False; Code_Share_Generics : in Boolean := True; This_Activity : in Activity.Activity_Name := Activity.The_Current_Activity) return Set; function Multiple_Unit_Dependency_Closure (Units : in Set; Specs_Only : in Boolean := False; Transitive : in Boolean := True; Include_Universe_Mirrors : in Boolean := False; Code_Share_Generics : in Boolean := True; This_Activity : in Activity.Activity_Name := Activity.The_Current_Activity) return Set; function Multiple_Unit_Dependency_Closure (Units : in Set; Specs_Only : in Boolean := False; Transitive : in Boolean := True; Include_Universe_Mirrors : in Boolean := False; Code_Share_Generics : in Boolean := True; This_Activity : in Activity.Activity_Name := Activity.The_Current_Activity) return Set is Working_Set : Set := Units; Closure : Set := Empty_Set; begin Directory_Tools.Object.Reset (Working_Set); while not Directory_Tools.Object.Done (Working_Set) loop Closure := Closure + Single_Unit_Dependency_Closure_Instantiation (Directory_Tools.Object.Value (Working_Set), Specs_Only, Transitive, Include_Universe_Mirrors, Code_Share_Generics, This_Activity); Directory_Tools.Object.Next (Working_Set); end loop; return Closure; end Multiple_Unit_Dependency_Closure; function Spec_Is_Generic_For (This_Element : in Element) return Boolean is -- Returns True if the spec associated with the specified element -- is a generic spec. begin return Object_Info.Ada.Is_Generic_Spec (Object_Info.Ada.Spec_For (This_Element)); end Spec_Is_Generic_For; function Immediate_Dependencies_On (This_Element : in Element; Code_Share_Generics : in Boolean; This_Activity : in Activity.Activity_Name) return Set is Dependencies : Set := Object_Info.Ada.Dependents_Of (This_Element); begin if Object_Info.Any.Is_Ada_Unit (This_Element) then -- Deal with question of code sharing. if not Code_Share_Generics and then Object_Info.Ada.Is_Body_Or_Subunit (This_Element) and then Spec_Is_Generic_For (This_Element) then -- Current element is body or subunit associated with -- a generic spec, and generic bodies are not code-shared. -- Therefore, the current element will be macro- -- inline expanded, and dependencies on the current -- element include dependencies on its spec. Dependencies := Dependencies + Object_Info.Ada.Dependents_Of (Object_Info.Ada.Spec_For (This_Element)); end if; -- Perform spec look-through. if Object_Info.Ada.Is_Spec_In_Load_View (This_Element) then -- The element is a spec in a load view, so it has an associated spec -- in a spec view. Anything that depends on the spec in the spec view -- in actuality depends on the current element, so add the spec view -- spec to the dependencies (so that the next pass will get the -- dependencies on it). Add (Object_Info.Ada.Spec_In_Other_View (This_Element, This_Activity), Dependencies); end if; end if; return Dependencies; end Immediate_Dependencies_On; function Dependencies_On_Single_Unit is new Single_Unit_Dependency_Closure (Immediate_Dependencies_On); function Dependencies_On (Unit : in Element; Specs_Only : in Boolean := False; Transitive : in Boolean := True; Include_Universe_Mirrors : in Boolean := False; Code_Share_Generics : in Boolean := True; This_Activity : in Activity.Activity_Name := Activity.The_Current_Activity) return Set is begin return Dependencies_On_Single_Unit (Unit, Specs_Only, Transitive, Include_Universe_Mirrors, Code_Share_Generics, This_Activity); end Dependencies_On; function Dependencies_On_Multiple_Units is new Multiple_Unit_Dependency_Closure (Dependencies_On); function Dependencies_On (Units : in Set; Specs_Only : in Boolean := False; Transitive : in Boolean := True; Include_Universe_Mirrors : in Boolean := False; Code_Share_Generics : in Boolean := True; This_Activity : in Activity.Activity_Name := Activity.The_Current_Activity) return Set is begin return Dependencies_On_Multiple_Units (Units, Specs_Only, Transitive, Include_Universe_Mirrors, Code_Share_Generics, This_Activity); end Dependencies_On; function Immediate_Dependencies_By (This_Element : in Element; Code_Share_Generics : in Boolean; This_Activity : in Activity.Activity_Name) return Set is Dependencies : Set := Object_Info.Ada.Specs_Withed_By (This_Element); Families_Of_Generic_Specs : Set := Empty_Set; Specs_In_Load_Views : Set := Empty_Set; begin if Object_Info.Any.Is_Ada_Unit (This_Element) then -- Deal with bodies and subunits. if Object_Info.Ada.Is_Subunit (This_Element) then Add (Object_Info.Ada.Parent_Of (This_Element), Dependencies); elsif Object_Info.Ada.Is_Body (This_Element) then Add (Object_Info.Ada.Spec_For (This_Element), Dependencies); end if; -- Deal with question of code sharing. if not Code_Share_Generics then Directory_Tools.Object.Reset (Dependencies); while not Directory_Tools.Object.Done (Dependencies) loop if Object_Info.Ada.Is_Generic_Spec (Directory_Tools.Object.Value (Dependencies)) then -- The element depends on a generic spec. Since the body and -- subunits of the generic spec are not code-shared, they -- will be macro-inline expanded. Therefore, the element -- depends on the entire family of the generic spec. Families_Of_Generic_Specs := Families_Of_Generic_Specs + Family (Directory_Tools.Object.Value (Dependencies)); end if; Directory_Tools.Object.Next (Dependencies); end loop; end if; Dependencies := Dependencies + Families_Of_Generic_Specs; -- Perform spec look-through. Directory_Tools.Object.Reset (Dependencies); while not Directory_Tools.Object.Done (Dependencies) loop if Object_Info.Ada.Is_Spec_In_Spec_View (Directory_Tools.Object.Value (Dependencies)) then -- The element depends on a spec in a spec view. So add -- the associated spec in the load view to the dependencies. Add (Object_Info.Ada.Spec_In_Other_View (Directory_Tools.Object.Value (Dependencies), This_Activity), Specs_In_Load_Views); end if; Directory_Tools.Object.Next (Dependencies); end loop; Dependencies := Dependencies + Specs_In_Load_Views; end if; return Dependencies; end Immediate_Dependencies_By; function Dependencies_By_Single_Unit is new Single_Unit_Dependency_Closure (Immediate_Dependencies_By); function Dependencies_By (Unit : in Element; Specs_Only : in Boolean := False; Transitive : in Boolean := True; Include_Universe_Mirrors : in Boolean := False; Code_Share_Generics : in Boolean := True; This_Activity : in Activity.Activity_Name := Activity.The_Current_Activity) return Set is begin return Dependencies_By_Single_Unit (Unit, Specs_Only, Transitive, Include_Universe_Mirrors, Code_Share_Generics, This_Activity); end Dependencies_By; function Dependencies_By_Multiple_Units is new Multiple_Unit_Dependency_Closure (Dependencies_By); function Dependencies_By (Units : in Set; Specs_Only : in Boolean := False; Transitive : in Boolean := True; Include_Universe_Mirrors : in Boolean := False; Code_Share_Generics : in Boolean := True; This_Activity : in Activity.Activity_Name := Activity.The_Current_Activity) return Set is begin return Dependencies_By_Multiple_Units (Units, Specs_Only, Transitive, Include_Universe_Mirrors, Code_Share_Generics, This_Activity); end Dependencies_By; function Immediate_Family_Dependencies_On (This_Element : in Element; Code_Share_Generics : in Boolean; This_Activity : in Activity.Activity_Name) return Set is Dependencies : Set := Object_Info.Ada.Subunits_Of (This_Element); begin if Object_Info.Ada.Is_Spec (This_Element) then -- Add body. Add (Object_Info.Ada.Body_For (This_Element), Dependencies); -- Add subunits. Dependencies := Dependencies + Object_Info.Ada.Subunits_Of (Object_Info.Ada.Body_For (This_Element)); -- Perform spec look-through. if Object_Info.Ada.Is_Spec_In_Spec_View (This_Element) then Add (Object_Info.Ada.Spec_In_Other_View (This_Element, This_Activity), Dependencies); end if; elsif Object_Info.Ada.Is_Body_Or_Subunit (This_Element) then -- Add subunits. Dependencies := Dependencies + Object_Info.Ada.Subunits_Of (This_Element); end if; return Dependencies; end Immediate_Family_Dependencies_On; function Family_Dependencies_On is new Single_Unit_Dependency_Closure (Immediate_Family_Dependencies_On); function Family (Unit : in Element; This_Activity : in Activity.Activity_Name := Activity.The_Current_Activity) return Set is Family_Dependencies : Set := Family_Dependencies_On (Unit, Specs_Only => False, Transitive => True, Include_Universe_Mirrors => True, Code_Share_Generics => True, This_Activity => This_Activity); begin if Object_Info.Any.Is_Ada_Unit (Unit) then Add (Unit, Family_Dependencies); end if; return Family_Dependencies; end Family; function Immediate_Execution_Closure_For (This_Element : in Element; Code_Share_Generics : in Boolean; This_Activity : in Activity.Activity_Name) return Set is Dependencies : Set := Object_Info.Ada.Specs_Withed_By (This_Element); Families_Of_Elements : Set := Empty_Set; Specs_In_Load_Views : Set := Empty_Set; begin if Object_Info.Any.Is_Ada_Unit (This_Element) then -- Add the element itself to the closure. Add (This_Element, Dependencies); -- Deal with bodies and subunits. if Object_Info.Ada.Is_Subunit (This_Element) then Add (Object_Info.Ada.Parent_Of (This_Element), Dependencies); elsif Object_Info.Ada.Is_Body (This_Element) then Add (Object_Info.Ada.Spec_For (This_Element), Dependencies); end if; -- Add families of all elements to dependencies. Directory_Tools.Object.Reset (Dependencies); while not Directory_Tools.Object.Done (Dependencies) loop Families_Of_Elements := Families_Of_Elements + Family (Directory_Tools.Object.Value (Dependencies)); Directory_Tools.Object.Next (Dependencies); end loop; Dependencies := Dependencies + Families_Of_Elements; -- Perform spec look-through. Directory_Tools.Object.Reset (Dependencies); while not Directory_Tools.Object.Done (Dependencies) loop if Object_Info.Ada.Is_Spec_In_Spec_View (Directory_Tools.Object.Value (Dependencies)) then -- The element depends on a spec in a spec view. So add -- the associated spec in the load view to the dependencies. Add (Object_Info.Ada.Spec_In_Other_View (Directory_Tools.Object.Value (Dependencies), This_Activity), Specs_In_Load_Views); end if; Directory_Tools.Object.Next (Dependencies); end loop; Dependencies := Dependencies + Specs_In_Load_Views; end if; return Dependencies; end Immediate_Execution_Closure_For; function Execution_Closure_For_Single_Unit is new Single_Unit_Dependency_Closure (Immediate_Execution_Closure_For); function Execution_Closure_For (Unit : in Element; Include_Universe_Mirrors : in Boolean := False; This_Activity : in Activity.Activity_Name := Activity.The_Current_Activity) return Set is begin return Execution_Closure_For_Single_Unit (Unit, Specs_Only => False, Transitive => True, Include_Universe_Mirrors => Include_Universe_Mirrors, Code_Share_Generics => True, This_Activity => This_Activity); end Execution_Closure_For; end Object_Sets;
nblk1=26 nid=0 hdr6=4c [0x00] rec0=20 rec1=00 rec2=01 rec3=062 [0x01] rec0=20 rec1=00 rec2=02 rec3=00a [0x02] rec0=00 rec1=00 rec2=26 rec3=006 [0x03] rec0=1d rec1=00 rec2=03 rec3=094 [0x04] rec0=15 rec1=00 rec2=04 rec3=04a [0x05] rec0=01 rec1=00 rec2=25 rec3=00c [0x06] rec0=19 rec1=00 rec2=05 rec3=028 [0x07] rec0=00 rec1=00 rec2=24 rec3=002 [0x08] rec0=1b rec1=00 rec2=06 rec3=026 [0x09] rec0=1d rec1=00 rec2=07 rec3=02c [0x0a] rec0=1a rec1=00 rec2=08 rec3=030 [0x0b] rec0=00 rec1=00 rec2=23 rec3=00a [0x0c] rec0=18 rec1=00 rec2=09 rec3=02a [0x0d] rec0=1a rec1=00 rec2=0a rec3=014 [0x0e] rec0=00 rec1=00 rec2=22 rec3=01a [0x0f] rec0=1a rec1=00 rec2=0b rec3=048 [0x10] rec0=17 rec1=00 rec2=0c rec3=02a [0x11] rec0=19 rec1=00 rec2=0d rec3=018 [0x12] rec0=18 rec1=00 rec2=0e rec3=006 [0x13] rec0=00 rec1=00 rec2=21 rec3=004 [0x14] rec0=17 rec1=00 rec2=0f rec3=022 [0x15] rec0=16 rec1=00 rec2=10 rec3=01c [0x16] rec0=15 rec1=00 rec2=11 rec3=00c [0x17] rec0=00 rec1=00 rec2=20 rec3=008 [0x18] rec0=1a rec1=00 rec2=12 rec3=00e [0x19] rec0=0f rec1=00 rec2=13 rec3=082 [0x1a] rec0=15 rec1=00 rec2=14 rec3=064 [0x1b] rec0=18 rec1=00 rec2=15 rec3=006 [0x1c] rec0=16 rec1=00 rec2=16 rec3=002 [0x1d] rec0=10 rec1=00 rec2=17 rec3=01c [0x1e] rec0=13 rec1=00 rec2=18 rec3=050 [0x1f] rec0=14 rec1=00 rec2=19 rec3=046 [0x20] rec0=15 rec1=00 rec2=1a rec3=044 [0x21] rec0=15 rec1=00 rec2=1b rec3=05c [0x22] rec0=15 rec1=00 rec2=1c rec3=09e [0x23] rec0=17 rec1=00 rec2=1d rec3=014 [0x24] rec0=11 rec1=00 rec2=1e rec3=00c [0x25] rec0=18 rec1=00 rec2=1f rec3=001 tail 0x217002150815c65541a1c 0x42a00088462061e03