home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MYUTIL / COMPTREE.I < prev    next >
Encoding:
Text File  |  1993-12-30  |  11.0 KB  |  3 lines

  1. ⓪ IMPLEMENTATION MODULE CompTree;
  2. ⓪ 
  3. ⓪ (*$Y+,H+,Z+*)
  4. ⓪ 
  5. ⓪ (*
  6. ⓪ IMPORT TOSDebug;
  7. ⓪ *)
  8. ⓪ 
  9. ⓪ (*$N+*)
  10. ⓪ IMPORT Runtime;
  11. ⓪ FROM SYSTEM IMPORT ADDRESS, ASSEMBLER, BYTE;
  12. ⓪ FROM Strings IMPORT String, StrEqual, Assign, Append;
  13. ⓪ FROM Storage IMPORT ALLOCATE, DEALLOCATE, MemAvail;
  14. ⓪ IMPORT Files, Binary;
  15. ⓪ 
  16. ⓪ TYPE PtrPtr = POINTER TO PtrItem;
  17. ⓪ 
  18. ⓪ VAR Code: ADDRESS;
  19. ⓪$ok: BOOLEAN;
  20. ⓪ 
  21. ⓪ PROCEDURE ptr (item: PtrItem; ofs: LONGINT): PtrItem;
  22. ⓪"(*$L-*)
  23. ⓪"BEGIN
  24. ⓪$ASSEMBLER
  25. ⓪(MOVE.L  -(A3),A0
  26. ⓪(ADDA.L  -(A3),A0
  27. ⓪(ADDA.L  TreeBase,A0
  28. ⓪(MOVE.L  (A0),D0
  29. ⓪$END
  30. ⓪"END ptr;
  31. ⓪"(*$L=*)
  32. ⓪ 
  33. ⓪ PROCEDURE long (item: PtrItem; ofs: LONGINT): LONGCARD;
  34. ⓪"(*$L-*)
  35. ⓪"BEGIN
  36. ⓪$ASSEMBLER
  37. ⓪(MOVE.L  -(A3),A0
  38. ⓪(ADDA.L  -(A3),A0
  39. ⓪(ADDA.L  TreeBase,A0
  40. ⓪(MOVE.L  (A0),D0
  41. ⓪$END
  42. ⓪"END long;
  43. ⓪"(*$L=*)
  44. ⓪ 
  45. ⓪ PROCEDURE card (item: PtrItem; ofs: LONGINT): CARDINAL;
  46. ⓪"(*$L-*)
  47. ⓪"BEGIN
  48. ⓪$ASSEMBLER
  49. ⓪(MOVE.L  -(A3),A0
  50. ⓪(ADDA.L  -(A3),A0
  51. ⓪(ADDA.L  TreeBase,A0
  52. ⓪(MOVE.W  (A0),D0
  53. ⓪$END
  54. ⓪"END card;
  55. ⓪"(*$L=*)
  56. ⓪ 
  57. ⓪ PROCEDURE int (item: PtrItem; ofs: LONGINT): INTEGER;
  58. ⓪"(*$L-*)
  59. ⓪"BEGIN
  60. ⓪$ASSEMBLER
  61. ⓪(MOVE.L  -(A3),A0
  62. ⓪(ADDA.L  -(A3),A0
  63. ⓪(ADDA.L  TreeBase,A0
  64. ⓪(MOVE.W  (A0),D0
  65. ⓪$END
  66. ⓪"END int;
  67. ⓪"(*$L=*)
  68. ⓪ 
  69. ⓪ PROCEDURE byte (item: PtrItem; ofs: LONGINT): BYTE;
  70. ⓪"(*$L-*)
  71. ⓪"BEGIN
  72. ⓪$ASSEMBLER
  73. ⓪(MOVE.L  -(A3),A0
  74. ⓪(ADDA.L  -(A3),A0
  75. ⓪(ADDA.L  TreeBase,A0
  76. ⓪(MOVE.B  (A0),D0
  77. ⓪$END
  78. ⓪"END byte;
  79. ⓪"(*$L=*)
  80. ⓪ 
  81. ⓪ (*$D-*)
  82. ⓪ 
  83. ⓪ PROCEDURE ScanWholeTree (scanner: TreeProc; new: NewTreeProc);
  84. ⓪"VAR tr: PtrItem; sp: PtrPtr; tt: TreeType;
  85. ⓪"BEGIN
  86. ⓪$sp:= PtrPtr (DisplayStack);
  87. ⓪$LOOP
  88. ⓪&tr:= sp^;
  89. ⓪&IF tr = 1 THEN EXIT END;
  90. ⓪&INC (sp, SIZE (sp^));
  91. ⓪&IF tr = 0 THEN
  92. ⓪(IF new (newscope) THEN END
  93. ⓪&ELSE
  94. ⓪(IF sp^ = 1 THEN tt:= global ELSE tt:= local END;
  95. ⓪(IF new (tt) THEN
  96. ⓪*ScanLocalTree (scanner, tr)
  97. ⓪(END
  98. ⓪&END
  99. ⓪$END;
  100. ⓪$(* Relocation Stack abarbeiten (lokale Module) *)
  101. ⓪$sp:= RelocationStack;
  102. ⓪$WHILE sp^ # NoItem DO
  103. ⓪&IF new (module) THEN
  104. ⓪(ScanLocalTree (scanner, sp^);
  105. ⓪&END;
  106. ⓪&INC (sp, SIZE (sp^))
  107. ⓪$END;
  108. ⓪$IF new (pervasive) THEN
  109. ⓪&ScanLocalTree (scanner, 0);  (* pervasives *)
  110. ⓪$END
  111. ⓪"END ScanWholeTree;
  112. ⓪ 
  113. ⓪ PROCEDURE fetch (VAR ptr: PtrItem; VAR name: ARRAY OF CHAR);
  114. ⓪"(*
  115. ⓪#* Liest Namen aus Baum ein. 'ptr' muß auf das Zeichen vor dem Namen zeigen
  116. ⓪#* hinterher zeigt 'ptr' hinter den Text.
  117. ⓪#*)
  118. ⓪"VAR (*$Reg*)c: CARDINAL; (*$Reg*)by: BYTE;
  119. ⓪"BEGIN
  120. ⓪$c:= 0;
  121. ⓪$LOOP
  122. ⓪&IF (c+1) > HIGH (name) THEN HALT END;
  123. ⓪&DEC (ptr);
  124. ⓪&by:= byte (ptr, 0);
  125. ⓪&IF ORD (by) >= $FE THEN
  126. ⓪(IF ORD (byte (ptr, 0)) = $FE THEN DEC (ptr); END;
  127. ⓪(IF c = 0 THEN
  128. ⓪*name[0]:= '*';        (* anonym-Kennung *)
  129. ⓪*c:= 1
  130. ⓪(END;
  131. ⓪(name[c]:= 0C;
  132. ⓪(RETURN
  133. ⓪&END;
  134. ⓪&name [c]:= CHR (ORD (by));
  135. ⓪&INC (c)
  136. ⓪$END
  137. ⓪"END fetch;
  138. ⓪ 
  139. ⓪ (*$D-*)
  140. ⓪ 
  141. ⓪ PROCEDURE ScanLocalTree (scanner: TreeProc; tree: PtrItem);
  142. ⓪ 
  143. ⓪"FORWARD scan (tree: PtrItem);
  144. ⓪ 
  145. ⓪"PROCEDURE doit (it: PtrItem);
  146. ⓪$VAR name: String; c: CARDINAL;
  147. ⓪$BEGIN
  148. ⓪&fetch (it, name);
  149. ⓪&(* Relays werden direkt gemeldet
  150. ⓪(IF ORD (byte (it, -1)) = 0 THEN
  151. ⓪*(* relay *)
  152. ⓪*it:= ptr (it, -6)
  153. ⓪(END;
  154. ⓪&*)
  155. ⓪&(* IF int (it, -2) < 0 THEN (* kein Modula-Wort, sondern User-ID *) *)
  156. ⓪((* auch dies muß der 'scanner' selbst veranlassen
  157. ⓪*c:= ORD (byte (it, -1));
  158. ⓪*IF (c=15) (* lok.Modul *) OR (c=16) (* qualifier *) THEN
  159. ⓪,IF ptr (it, -6) # NoItem THEN scan (ptr (it, -6)) END
  160. ⓪*END;
  161. ⓪(*)
  162. ⓪(scanner (name, it)
  163. ⓪&(* END *)
  164. ⓪$END doit;
  165. ⓪ 
  166. ⓪"PROCEDURE scan (tree: PtrItem);
  167. ⓪$(* lokale Funktion, um Stackplatz f. Rekursion zu sparen *)
  168. ⓪$VAR it: PtrItem;
  169. ⓪$BEGIN
  170. ⓪&(* linker Ast *)
  171. ⓪&it:= ptr (tree, -4);
  172. ⓪&IF it # NoItem THEN
  173. ⓪(scan (it);
  174. ⓪&END;
  175. ⓪&(* rechter Ast *)
  176. ⓪&it:= ptr (tree, -8);
  177. ⓪&IF it # NoItem THEN
  178. ⓪(scan (it);
  179. ⓪&END;
  180. ⓪&doit (tree - 8)
  181. ⓪$END scan;
  182. ⓪$
  183. ⓪"BEGIN
  184. ⓪$scan (tree);
  185. ⓪"END ScanLocalTree;
  186. ⓪ 
  187. ⓪ PROCEDURE FindItemByName (REF name: ARRAY OF CHAR; VAR item: PtrItem);
  188. ⓪"
  189. ⓪"PROCEDURE scanTree (REF currname: ARRAY OF CHAR; curritem: PtrItem);
  190. ⓪$BEGIN
  191. ⓪&(* nur ersten gefundenen Namen übernehmen *)
  192. ⓪&IF item = NoItem THEN
  193. ⓪(IF StrEqual (name, currname) THEN
  194. ⓪*item:= curritem
  195. ⓪(END
  196. ⓪&END
  197. ⓪$END scanTree;
  198. ⓪"
  199. ⓪"PROCEDURE newTree (typ: TreeType): BOOLEAN;
  200. ⓪$BEGIN
  201. ⓪&(* nur lokale/globale Level *)
  202. ⓪&RETURN (typ <= global)
  203. ⓪$END newTree;
  204. ⓪"
  205. ⓪"BEGIN
  206. ⓪$item:= NoItem;
  207. ⓪$ScanWholeTree (scanTree, newTree);
  208. ⓪"END FindItemByName;
  209. ⓪ 
  210. ⓪ PROCEDURE GetNameOfItem (item: PtrItem;
  211. ⓪9VAR name: ARRAY OF CHAR; VAR found: BOOLEAN);
  212. ⓪"
  213. ⓪"PROCEDURE scanTree (REF currname: ARRAY OF CHAR; curritem: PtrItem);
  214. ⓪$BEGIN
  215. ⓪&IF item = curritem THEN
  216. ⓪(found:= TRUE;
  217. ⓪(Assign (currname, name, ok)
  218. ⓪&END
  219. ⓪$END scanTree;
  220. ⓪"
  221. ⓪"PROCEDURE newTree (typ: TreeType): BOOLEAN;
  222. ⓪$BEGIN
  223. ⓪&(* alle Level *)
  224. ⓪&RETURN TRUE
  225. ⓪$END newTree;
  226. ⓪"
  227. ⓪"BEGIN
  228. ⓪$found:= FALSE;
  229. ⓪$name[0]:= 0C;
  230. ⓪$ScanWholeTree (scanTree, newTree);
  231. ⓪"END GetNameOfItem;
  232. ⓪ 
  233. ⓪ PROCEDURE GetItemDesc (item: PtrItem; VAR desc: ItemDesc): BOOLEAN;
  234. ⓪"BEGIN
  235. ⓪$IF item = NoItem THEN
  236. ⓪&RETURN FALSE
  237. ⓪$ELSE
  238. ⓪&WITH desc DO
  239. ⓪(flag:= ItemFlags (byte (item, -2));
  240. ⓪(kind:= ORD (byte (item, -1))
  241. ⓪&END;
  242. ⓪&RETURN TRUE
  243. ⓪$END
  244. ⓪"END GetItemDesc;
  245. ⓪ 
  246. ⓪ PROCEDURE SystemType (REF desc: ItemDesc): BOOLEAN;
  247. ⓪"TYPE FS = SET OF [0..63];
  248. ⓪"BEGIN
  249. ⓪$RETURN desc.kind IN FS {1,2,3,4,21,22,23,24,25,26,27,29,
  250. ⓪<30,31,33,34,35,36,37,38,39,40,41,43}
  251. ⓪"END SystemType;
  252. ⓪"
  253. ⓪ PROCEDURE Kind (REF desc: ItemDesc): String;
  254. ⓪"VAR name: String;
  255. ⓪"BEGIN
  256. ⓪$CASE desc.kind OF
  257. ⓪$| 0: name:= "Relay"
  258. ⓪$| 1: name:= "LONGINT"
  259. ⓪$| 2: name:= "LONGREAL"
  260. ⓪$| 3: name:= "CHAR"
  261. ⓪$| 4: name:= "ZZ"
  262. ⓪$| 5: name:= "SET(large)"
  263. ⓪$| 6: name:= "Prozedur"
  264. ⓪$| 7: name:= "Parameter"
  265. ⓪$| 8: name:= "Opaque"
  266. ⓪$| 9: name:= "Enum-Typ"
  267. ⓪$|10: name:= "Enum-Elem"
  268. ⓪$|11: name:= "Subrange"
  269. ⓪$|12: name:= "ARRAY"
  270. ⓪$|13: name:= "RECORD"
  271. ⓪$|14: name:= "Rec-Feld"
  272. ⓪$|15: name:= "Lok.Modul"
  273. ⓪$|16: name:= "Qualifier"
  274. ⓪$|17: name:= "Variable"
  275. ⓪$|18: name:= "CONST(old)"
  276. ⓪$|19: name:= "PROCEDURE"
  277. ⓪$|20: name:= "POINTER"
  278. ⓪$|21: name:= "WORD"
  279. ⓪$|22: name:= "LONGCARD"
  280. ⓪$|23: name:= "ADDRESS"
  281. ⓪$|24: name:= "BOOLEAN"
  282. ⓪$|25: name:= "Opaque"
  283. ⓪$|26: name:= "LONGWORD"
  284. ⓪$|27: name:= "String"
  285. ⓪$|28: name:= "TABLE"
  286. ⓪$|29: name:= "Asm-Label"
  287. ⓪$|30: name:= "LONGBOTH"
  288. ⓪$|31: name:= "StrConst"
  289. ⓪$|32: name:= "OpenArray"
  290. ⓪$|33: name:= "INTEGER"
  291. ⓪$|34: name:= "CARDINAL"
  292. ⓪$|35: name:= "SHORTBOTH"
  293. ⓪$|36: name:= "StdFunc"
  294. ⓪$|37: name:= "StdFunc-Parm"
  295. ⓪$|38: name:= "BYTE"
  296. ⓪$|39: name:= "BYTE(signed)"
  297. ⓪$|40: name:= "REAL"
  298. ⓪$|41: name:= "BITNUM"
  299. ⓪$|42: name:= "LongOpArr"
  300. ⓪$|43: name:= "StructConst"
  301. ⓪$|44: name:= "Long-PROC-Typ"
  302. ⓪$|45: name:= "SET(32Bit)"
  303. ⓪$|46: name:= "Tag-Field"
  304. ⓪$|47: name:= "Rec-Variante"
  305. ⓪$|50: name:= "CONST(new)"
  306. ⓪$ELSE
  307. ⓪&name:= "???"
  308. ⓪$END;
  309. ⓪$RETURN name;
  310. ⓪"END Kind;
  311. ⓪ 
  312. ⓪ PROCEDURE flag (REF desc: ItemDesc; flagNo: CARDINAL): String;
  313. ⓪"VAR name: String;
  314. ⓪"BEGIN
  315. ⓪$WITH desc DO
  316. ⓪&CASE flagNo OF
  317. ⓪&| 7: name:= "Userdef"
  318. ⓪&| 6: name:= "Exported"
  319. ⓪&| 5: name:= "Imported"
  320. ⓪&| 4: name:= "External"
  321. ⓪&| 3: name:= "VAR-Parm"
  322. ⓪&| 2: name:= "Type"
  323. ⓪&| 1: IF 2 IN flag THEN name:= "Anonym" ELSE name:= "Global" END
  324. ⓪&| 0: IF 2 IN flag THEN name:= "Scalar" ELSIF kind = 17 THEN
  325. ⓪,name:= "Read-only" ELSE name:= "D0-Return" END
  326. ⓪&END
  327. ⓪$END;
  328. ⓪$RETURN name;
  329. ⓪"END flag;
  330. ⓪ 
  331. ⓪ PROCEDURE Flags (REF desc: ItemDesc): String;
  332. ⓪"VAR name: String; i: CARDINAL; first: BOOLEAN;
  333. ⓪"BEGIN
  334. ⓪$name[0]:= 0C;
  335. ⓪$first:= TRUE;
  336. ⓪$FOR i:= 7 TO 0 BY -1 DO
  337. ⓪&IF i IN desc.flag THEN
  338. ⓪(IF NOT first THEN Append ('/', name, ok); END;
  339. ⓪(Append (flag (desc, i), name, ok);
  340. ⓪(first:= FALSE
  341. ⓪&END
  342. ⓪$END;
  343. ⓪$RETURN name;
  344. ⓪"END Flags;
  345. ⓪ 
  346. ⓪ PROCEDURE ItemTable;
  347. ⓪"(*$L-*)
  348. ⓪"BEGIN
  349. ⓪$ASSEMBLER
  350. ⓪(DC.W    0,1,0             ;Relay
  351. ⓪(DC.W    6,2,1,1,2,7,8,0   ;PROC
  352. ⓪(DC.W    5,2,1,0       ;SET
  353. ⓪(DC.W    45,2,1,0      ;SET (neue Ordnung)
  354. ⓪(DC.W    7,1,1,3,0     ;PARAM
  355. ⓪(DC.W    8,2,0         ;REDECLARABLE OPAQUE
  356. ⓪(DC.W    9,2,2,5,0     ;ENUM
  357. ⓪(DC.W    10,3,1,5,0    ;ENUM.ELEMENT
  358. ⓪(DC.W    11,2,2,2,1,0  ;SUBR
  359. ⓪(DC.W    12,2,1,1,0    ;ARRAY
  360. ⓪(DC.W    13,2,1,4,0    ;RECORD
  361. ⓪(DC.W    14,2,1,1,0    ;REC.FELD
  362. ⓪(DC.W    15,4,0        ;Lok. Modul
  363. ⓪(DC.W    16,4,0        ;Qualifier
  364. ⓪(DC.W    17,2,1,2,7,2,0;VAR
  365. ⓪(DC.W    18,1,6,0      ;CONST
  366. ⓪(DC.W    19,2,1,1,0    ;PROC.TYPE
  367. ⓪(DC.W    20,2,1,0      ;PTR
  368. ⓪(DC.W    25,2,0        ;OPAQUE
  369. ⓪(DC.W    27,2,2,0      ;STRING
  370. ⓪(DC.W    32,1,0        ;OPEN ARRAY
  371. ⓪(DC.W    42,1,0        ;OPEN LONGARRAY
  372. ⓪(DC.W    1,2,0         ;LINT
  373. ⓪(DC.W    2,2,0         ;LONGREAL
  374. ⓪(DC.W    3,2,0         ;CHAR
  375. ⓪(DC.W    4,2,0         ;ZZ
  376. ⓪(DC.W    21,2,0        ;WORD
  377. ⓪(DC.W    22,2,0        ;LCARD
  378. ⓪(DC.W    23,2,1,0      ;ADDRESS
  379. ⓪(DC.W    24,2,0        ;BOOLEAN
  380. ⓪(DC.W    26,2,0        ;LONG
  381. ⓪(DC.W    30,2,0        ;LBOTH
  382. ⓪(DC.W    33,2,0        ;SINT
  383. ⓪(DC.W    34,2,0        ;SCARD
  384. ⓪(DC.W    35,2,0        ;SBOTH
  385. ⓪(DC.W    36,3,1,0      ;StandardProc
  386. ⓪(DC.W    37,1,1,1,0    ;StandardProcParams
  387. ⓪(DC.W    38,2,0        ;BYTE
  388. ⓪(DC.W    39,2,0        ;Signed BYTE
  389. ⓪(DC.W    40,2,0        ;REAL
  390. ⓪(DC.W    41,2,0        ;BITNUM
  391. ⓪(DC.W    43,2,0        ;untyped Constant
  392. ⓪(DC.W    44,2,1,0      ;PROC.TYPE bei Parametern (8 Byte Länge)
  393. ⓪(DC.W    46,1,2,2,1,0  ;Record-Tag
  394. ⓪(DC.W    47,2,1,1,1,1,0;Rec-Variante
  395. ⓪(DC.W    50,2,1,7,4,6,0 ;CONST neu (nun incl. String-Literals)
  396. ⓪(DC.W    63,0          ;Dummy-Eintrag
  397. ⓪(DC.W    0
  398. ⓪$END
  399. ⓪"END ItemTable;
  400. ⓪"(*$L=*)
  401. ⓪ 
  402. ⓪ PROCEDURE ScanItem (scanner: ItemProc; item: PtrItem);
  403. ⓪"VAR no: CARDINAL; pt: POINTER TO CARDINAL; entry: ItemEntry; ofs: INTEGER;
  404. ⓪"BEGIN
  405. ⓪$no:= ORD (byte (item, -1));
  406. ⓪$(* zuerst die Item-Beschreibung in der Tabelle suchen *)
  407. ⓪$ASSEMBLER
  408. ⓪(LEA     ItemTable,A0
  409. ⓪(MOVE.L  A0,pt(A6)
  410. ⓪$END;
  411. ⓪$LOOP
  412. ⓪&IF no = pt^ THEN EXIT END;
  413. ⓪&REPEAT INC (pt, 2); UNTIL pt^ = 0;
  414. ⓪&INC (pt, 2);
  415. ⓪&IF pt^ = 0 THEN HALT END (* Nicht gefunden! *)
  416. ⓪$END;
  417. ⓪$INC (pt, 2);
  418. ⓪$ofs:= -2;
  419. ⓪$LOOP
  420. ⓪&no:= pt^;
  421. ⓪&IF no = 0 THEN EXIT END;
  422. ⓪&INC (pt, 2);
  423. ⓪&WITH entry DO
  424. ⓪(name:= '';
  425. ⓪(CASE no OF
  426. ⓪(| 1,5: type:= pointer; DEC (ofs, 4); ptrVal:= ptr (item, ofs);
  427. ⓪(| 2: type:= const; DEC (ofs, 4); constVal:= long (item, ofs);
  428. ⓪(| 3: type:= const; DEC (ofs, 2); constVal:= card (item, ofs);
  429. ⓪(| 4: type:= scope; DEC (ofs, 4); ptrVal:= ptr (item, ofs);
  430. ⓪(| 6: DEC (ofs, 2);
  431. ⓪(| 7: DEC (ofs, pt^); INC (pt, 2);
  432. ⓪(ELSE
  433. ⓪*HALT
  434. ⓪(END
  435. ⓪&END;
  436. ⓪&IF no <= 5 THEN scanner (entry, pt^ # 0) END;
  437. ⓪$END;
  438. ⓪"END ScanItem;
  439. ⓪ 
  440. ⓪ PROCEDURE LoadDef (REF name: ARRAY OF CHAR);
  441. ⓪"VAR size, l: LONGCARD; f: Files.File;
  442. ⓪"BEGIN
  443. ⓪$IF Buffer # NIL THEN DEALLOCATE (Buffer, 0) END;
  444. ⓪$
  445. ⓪$size:= MemAvail () DIV 2; IF ODD (size) THEN DEC (size) END;
  446. ⓪$ALLOCATE (Buffer, size);
  447. ⓪$IF Buffer = NIL THEN HALT END;
  448. ⓪$
  449. ⓪$Files.Open (f, name, Files.readOnly);
  450. ⓪$IF Binary.FileSize (f) * 4 > size THEN HALT END;
  451. ⓪$Binary.ReadBytes (f, Buffer, Binary.FileSize (f), l);
  452. ⓪$IF Binary.FileSize (f) # l THEN HALT END;
  453. ⓪$Files.Close (f);
  454. ⓪$
  455. ⓪$Code:= Buffer + 8;
  456. ⓪$
  457. ⓪$(* ächz! *)
  458. ⓪$
  459. ⓪"END LoadDef;
  460. ⓪ 
  461. ⓪ END CompTree.
  462. ⓪ ə
  463. (* $FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$00002315$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EEÇ$00001631T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$00001630$00001923$00002315$000022D9$00000CA6$00000ACD$00000B08$00000759$FFE9B44A$FFE9B44A$FFE9B44A$00000759$000005C3$000013FD$0000190C$00001923ÉÇé*)
  464.