TranslateImpl.mesa
Copyright © 1985 by Xerox Corporation. All rights reserved.
Last edited by Tim Diebert: May 13, 1985 1:34:03 pm PDT
Last Edited by: McCreight, February 26, 1985 11:57:55 am PST
DIRECTORY IO, IOUtils, SafeStorage, TapeStreams, Translate;
TranslateImpl: CEDAR PROGRAM IMPORTS IO, IOUtils, SafeStorage
EXPORTS Translate SHARES TapeStreams = BEGIN
OPEN TapeStreams;
STREAM: TYPE = IO.STREAM;
AsciiToEbcdicData: TYPE ~ RECORD [fo: TapeStreams.FillBlockOptions,
lrecl: CARDINAL ← 0, count: CARDINAL ← 0];
AsciiToEbcdicProc: TapeStreams.Conversion = BEGIN
PROC [ base: STREAM , clientData: REF ANYNIL] RETURNS [ s: IO.STREAM ];
p: REF IO.StreamProcs = IO.CreateStreamProcs[
variety: output,
class: $Translation,
putChar: PutCharAsciiToEbcdic,
putBlock: NIL,
flush: FlushEbcdic];
padding: TapeStreams.FillBlockOptions ← blanks;
lrecl: CARDINAL ← 0;
FOR prev: IO.STREAM ← base, prev.backingStream WHILE prev # NIL DO
WITH prev.streamData SELECT FROM
t: TapeStreams.TapeStreamState => {padding ← t.padding; EXIT};
ENDCASE => NULL;
ENDLOOP;
lrecl ← IF clientData = NIL THEN 0
ELSE NARROW [clientData, REF CARDINAL
! SafeStorage.NarrowFault, SafeStorage.NarrowRefFault => CONTINUE]^;
IOUtils.StoreProc[p, $FlushBlock, NEW[FlushBlockProc ← FlushEbcdicBlock]];
s ← IO.CreateStream[
streamProcs: p,
streamData: NEW[AsciiToEbcdicData ← [padding, lrecl, 0]],
backingStream: base];
END;
PutCharAsciiToEbcdic: PROC [ self: IO.STREAM, char: CHAR ] = BEGIN
data: REF AsciiToEbcdicData ← NARROW [self.streamData];
IF data.lrecl # 0
THEN BEGIN
IF char = IO.CR
THEN BEGIN
FOR i: CARDINAL IN [data.count .. data.lrecl) DO
self.backingStream.PutChar[AsciiToEbcdicTable[IO.SP]];
ENDLOOP;
data.count ← 0;
END
ELSE BEGIN
self.backingStream.PutChar[AsciiToEbcdicTable[char]];
data.count ← data.count + 1; IF data.count = data.lrecl THEN data.count ← 0;
END;
END
ELSE self.backingStream.PutChar[AsciiToEbcdicTable[char]];
END;
FlushEbcdic: PROC [ self: IO.STREAM ] =
BEGIN
fbo: TapeStreams.FillBlockOptions = NARROW [self.streamData, REF AsciiToEbcdicData]^.fo;
fb: FlushBlockProc = NARROW[IOUtils.LookupProc[self, $FlushBlock], REF FlushBlockProc]^;
fb[self: self, padChar: (IF fbo = blanks THEN ' ELSE '\000), truncate: fbo = truncate];
END;
FlushEbcdicBlock: PROC [ self: IO.STREAM, padChar: CHAR ← '\000, bytesRequired: INTLAST[INT], truncate: BOOLFALSE ] -- TapeStreams.FlushBlockProc -- =
BEGIN
fb: FlushBlockProc = NARROW[IOUtils.LookupProc[self.backingStream, $FlushBlock], REF FlushBlockProc]^;
fb[self: self.backingStream, padChar: AsciiToEbcdicTable[padChar], bytesRequired: bytesRequired, truncate: truncate];
END;
AsciiToEbcdic: PUBLIC PROC
[lrecl: CARDINAL ← 0] RETURNS [t: TapeStreams.ConversionList] = {
rc: REF CARDINALNEW [CARDINAL];
rc^ ← lrecl;
RETURN [CONS[NEW[
TapeStreams.ConversionRecord ← [$ToEbcdic, AsciiToEbcdicProc, rc]], NIL]]};
EbcdicToAsciiProc: TapeStreams.Conversion = BEGIN
PROC [ base: STREAM , clientData: REF ANYNIL] RETURNS [ s: IO.STREAM ];
s ← IO.CreateStream[
streamProcs: IO.CreateStreamProcs[
variety: input,
class: $Translation,
getChar: GetCharEbcdicToAscii,
getBlock: NIL],
streamData: NIL,
backingStream: base];
END;
GetCharEbcdicToAscii: PROC [ self: IO.STREAM ] RETURNS [ CHAR ] =
{RETURN[EbcdicToAsciiTable[self.backingStream.GetChar[]]]};
EbcdicToAscii: PUBLIC PROC [] RETURNS [TapeStreams.ConversionList] =
{RETURN[CONS[NEW[TapeStreams.ConversionRecord ←
[$FromEbcdic, EbcdicToAsciiProc, NIL]], NIL]]};
EbcdicToAsciiTable: PUBLIC Translate.TranslationTable ←
NEW[PACKED ARRAY CHAR OF CHAR ← [
LOOPHOLE[000, CHAR], -- nul
LOOPHOLE[001, CHAR], -- soh
LOOPHOLE[002, CHAR], -- stx
LOOPHOLE[003, CHAR], -- etx
LOOPHOLE[004, CHAR], -- eot
LOOPHOLE[009, CHAR], -- ht
LOOPHOLE[006, CHAR], -- ack
LOOPHOLE[007, CHAR], -- bel
LOOPHOLE[008, CHAR], -- bs
LOOPHOLE[005, CHAR], -- enq
LOOPHOLE[021, CHAR], -- nak
LOOPHOLE[011, CHAR], -- vt
LOOPHOLE[012, CHAR], -- ff
LOOPHOLE[013, CHAR], -- cr
LOOPHOLE[014, CHAR], -- so
LOOPHOLE[015, CHAR], -- si
LOOPHOLE[016, CHAR], -- dle
LOOPHOLE[017, CHAR], -- dc one
LOOPHOLE[018, CHAR], -- dc two
LOOPHOLE[019, CHAR], -- dc three
LOOPHOLE[020, CHAR], -- dc four
LOOPHOLE[010, CHAR], -- lf
LOOPHOLE[022, CHAR], -- syn
LOOPHOLE[023, CHAR], -- etb
LOOPHOLE[024, CHAR], -- can
LOOPHOLE[025, CHAR], -- em
LOOPHOLE[026, CHAR], -- sub
LOOPHOLE[027, CHAR], -- esc
LOOPHOLE[028, CHAR], -- fs
LOOPHOLE[029, CHAR], -- gs
LOOPHOLE[030, CHAR], -- rs
LOOPHOLE[031, CHAR], -- us
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[032, CHAR], -- sp
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[096, CHAR], -- cent sign // becomes an accent grave
LOOPHOLE[046, CHAR], -- period
LOOPHOLE[060, CHAR], -- <
LOOPHOLE[040, CHAR], -- (
LOOPHOLE[043, CHAR], -- +
LOOPHOLE[124, CHAR], -- |
LOOPHOLE[038, CHAR], -- &
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[033, CHAR], -- !
LOOPHOLE[036, CHAR], -- $
LOOPHOLE[042, CHAR], -- *
LOOPHOLE[041, CHAR], -- )
LOOPHOLE[059, CHAR], -- --
LOOPHOLE[126, CHAR], -- not sign // becomes a ~ (tilde)
LOOPHOLE[045, CHAR], -- -
LOOPHOLE[047, CHAR], -- slash
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[094, CHAR], -- circumflex ^
LOOPHOLE[044, CHAR], -- ,
LOOPHOLE[037, CHAR], -- %
LOOPHOLE[095, CHAR], -- underscore
LOOPHOLE[062, CHAR], -- >
LOOPHOLE[063, CHAR], -- ?
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[058, CHAR], -- :
LOOPHOLE[035, CHAR], -- #
LOOPHOLE[064, CHAR], -- @
LOOPHOLE[039, CHAR], -- '
LOOPHOLE[061, CHAR], -- =
LOOPHOLE[034, CHAR], -- "
LOOPHOLE[000, CHAR], --null
LOOPHOLE[097, CHAR], -- a
LOOPHOLE[098, CHAR], -- b
LOOPHOLE[099, CHAR], -- c
LOOPHOLE[100, CHAR], -- d
LOOPHOLE[101, CHAR], -- e
LOOPHOLE[102, CHAR], -- f
LOOPHOLE[103, CHAR], -- g
LOOPHOLE[104, CHAR], -- h
LOOPHOLE[105, CHAR], -- i
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[106, CHAR], -- j
LOOPHOLE[107, CHAR], -- k
LOOPHOLE[108, CHAR], -- l
LOOPHOLE[109, CHAR], -- m
LOOPHOLE[110, CHAR], -- n
LOOPHOLE[111, CHAR], -- o
LOOPHOLE[112, CHAR], -- p
LOOPHOLE[113, CHAR], -- q
LOOPHOLE[114, CHAR], -- r
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[115, CHAR], -- s
LOOPHOLE[116, CHAR], -- t
LOOPHOLE[117, CHAR], -- u
LOOPHOLE[118, CHAR], -- v
LOOPHOLE[119, CHAR], -- w
LOOPHOLE[120, CHAR], -- x
LOOPHOLE[121, CHAR], -- y
LOOPHOLE[122, CHAR], -- z
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[092, CHAR], -- back slash \
LOOPHOLE[123, CHAR], -- left curly bracket {
LOOPHOLE[125, CHAR], -- right curly bracket }
LOOPHOLE[091, CHAR], -- left square bracket [
LOOPHOLE[093, CHAR], -- right square bracket ]
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[065, CHAR], -- A
LOOPHOLE[066, CHAR], -- B
LOOPHOLE[067, CHAR], -- C
LOOPHOLE[068, CHAR], -- D
LOOPHOLE[069, CHAR], -- E
LOOPHOLE[070, CHAR], -- F
LOOPHOLE[071, CHAR], -- G
LOOPHOLE[072, CHAR], -- H
LOOPHOLE[073, CHAR], -- I
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[074, CHAR], -- J
LOOPHOLE[075, CHAR], -- K
LOOPHOLE[076, CHAR], -- L
LOOPHOLE[077, CHAR], -- M
LOOPHOLE[078, CHAR], -- N
LOOPHOLE[079, CHAR], -- O
LOOPHOLE[080, CHAR], -- P
LOOPHOLE[081, CHAR], -- Q
LOOPHOLE[082, CHAR], -- R
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[083, CHAR], -- S
LOOPHOLE[084, CHAR], -- T
LOOPHOLE[085, CHAR], -- U
LOOPHOLE[086, CHAR], -- V
LOOPHOLE[087, CHAR], -- W
LOOPHOLE[088, CHAR], -- X
LOOPHOLE[089, CHAR], -- Y
LOOPHOLE[090, CHAR], -- Z
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[048, CHAR], -- zero
LOOPHOLE[049, CHAR], -- one
LOOPHOLE[050, CHAR], -- two
LOOPHOLE[051, CHAR], -- three
LOOPHOLE[052, CHAR], -- four
LOOPHOLE[053, CHAR], -- five
LOOPHOLE[054, CHAR], -- six
LOOPHOLE[055, CHAR], -- seven
LOOPHOLE[056, CHAR], -- eight
LOOPHOLE[057, CHAR], -- nine
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[000, CHAR], --null
LOOPHOLE[127, CHAR] -- del
]];
AsciiToEbcdicTable: PUBLIC Translate.TranslationTable ←
NEW[PACKED ARRAY CHAR OF CHAR ← [
LOOPHOLE[0, CHAR], -- high-order bit 0
LOOPHOLE[1, CHAR],
LOOPHOLE[2, CHAR],
LOOPHOLE[3, CHAR],
LOOPHOLE[4, CHAR],
LOOPHOLE[9, CHAR],
LOOPHOLE[6, CHAR],
LOOPHOLE[7, CHAR],
LOOPHOLE[8, CHAR],
LOOPHOLE[5, CHAR],
LOOPHOLE[21, CHAR],
LOOPHOLE[11, CHAR],
LOOPHOLE[12, CHAR],
LOOPHOLE[13, CHAR],
LOOPHOLE[14, CHAR],
LOOPHOLE[15, CHAR],
LOOPHOLE[16, CHAR],
LOOPHOLE[17, CHAR],
LOOPHOLE[18, CHAR],
LOOPHOLE[19, CHAR],
LOOPHOLE[20, CHAR],
LOOPHOLE[10, CHAR],
LOOPHOLE[22, CHAR],
LOOPHOLE[23, CHAR],
LOOPHOLE[24, CHAR],
LOOPHOLE[25, CHAR],
LOOPHOLE[26, CHAR],
LOOPHOLE[27, CHAR],
LOOPHOLE[28, CHAR],
LOOPHOLE[29, CHAR],
LOOPHOLE[30, CHAR],
LOOPHOLE[31, CHAR],
LOOPHOLE[64, CHAR],
LOOPHOLE[90, CHAR],
LOOPHOLE[127, CHAR],
LOOPHOLE[123, CHAR],
LOOPHOLE[91, CHAR],
LOOPHOLE[108, CHAR],
LOOPHOLE[80, CHAR],
LOOPHOLE[125, CHAR],
LOOPHOLE[77, CHAR],
LOOPHOLE[93, CHAR],
LOOPHOLE[92, CHAR],
LOOPHOLE[78, CHAR],
LOOPHOLE[107, CHAR],
LOOPHOLE[96, CHAR],
LOOPHOLE[75, CHAR],
LOOPHOLE[97, CHAR],
LOOPHOLE[240, CHAR],
LOOPHOLE[241, CHAR],
LOOPHOLE[242, CHAR],
LOOPHOLE[243, CHAR],
LOOPHOLE[244, CHAR],
LOOPHOLE[245, CHAR],
LOOPHOLE[246, CHAR],
LOOPHOLE[247, CHAR],
LOOPHOLE[248, CHAR],
LOOPHOLE[249, CHAR],
LOOPHOLE[122, CHAR],
LOOPHOLE[94, CHAR],
LOOPHOLE[76, CHAR],
LOOPHOLE[126, CHAR],
LOOPHOLE[110, CHAR],
LOOPHOLE[111, CHAR],
LOOPHOLE[124, CHAR],
LOOPHOLE[193, CHAR],
LOOPHOLE[194, CHAR],
LOOPHOLE[195, CHAR],
LOOPHOLE[196, CHAR],
LOOPHOLE[197, CHAR],
LOOPHOLE[198, CHAR],
LOOPHOLE[199, CHAR],
LOOPHOLE[200, CHAR],
LOOPHOLE[201, CHAR],
LOOPHOLE[209, CHAR],
LOOPHOLE[210, CHAR],
LOOPHOLE[211, CHAR],
LOOPHOLE[212, CHAR],
LOOPHOLE[213, CHAR],
LOOPHOLE[214, CHAR],
LOOPHOLE[215, CHAR],
LOOPHOLE[216, CHAR],
LOOPHOLE[217, CHAR],
LOOPHOLE[226, CHAR],
LOOPHOLE[227, CHAR],
LOOPHOLE[228, CHAR],
LOOPHOLE[229, CHAR],
LOOPHOLE[230, CHAR],
LOOPHOLE[231, CHAR],
LOOPHOLE[232, CHAR],
LOOPHOLE[233, CHAR],
LOOPHOLE[180, CHAR],
LOOPHOLE[177, CHAR],
LOOPHOLE[181, CHAR],
LOOPHOLE[106, CHAR],
LOOPHOLE[109, CHAR],
LOOPHOLE[74, CHAR],
LOOPHOLE[129, CHAR],
LOOPHOLE[130, CHAR],
LOOPHOLE[131, CHAR],
LOOPHOLE[132, CHAR],
LOOPHOLE[133, CHAR],
LOOPHOLE[134, CHAR],
LOOPHOLE[135, CHAR],
LOOPHOLE[136, CHAR],
LOOPHOLE[137, CHAR],
LOOPHOLE[145, CHAR],
LOOPHOLE[146, CHAR],
LOOPHOLE[147, CHAR],
LOOPHOLE[148, CHAR],
LOOPHOLE[149, CHAR],
LOOPHOLE[150, CHAR],
LOOPHOLE[151, CHAR],
LOOPHOLE[152, CHAR],
LOOPHOLE[153, CHAR],
LOOPHOLE[162, CHAR],
LOOPHOLE[163, CHAR],
LOOPHOLE[164, CHAR],
LOOPHOLE[165, CHAR],
LOOPHOLE[166, CHAR],
LOOPHOLE[167, CHAR],
LOOPHOLE[168, CHAR],
LOOPHOLE[169, CHAR],
LOOPHOLE[178, CHAR],
LOOPHOLE[79, CHAR],
LOOPHOLE[179, CHAR],
LOOPHOLE[95, CHAR],
LOOPHOLE[255, CHAR],
LOOPHOLE[0, CHAR], -- high-order bit 1
LOOPHOLE[1, CHAR],
LOOPHOLE[2, CHAR],
LOOPHOLE[3, CHAR],
LOOPHOLE[4, CHAR],
LOOPHOLE[9, CHAR],
LOOPHOLE[6, CHAR],
LOOPHOLE[7, CHAR],
LOOPHOLE[8, CHAR],
LOOPHOLE[5, CHAR],
LOOPHOLE[21, CHAR],
LOOPHOLE[11, CHAR],
LOOPHOLE[12, CHAR],
LOOPHOLE[13, CHAR],
LOOPHOLE[14, CHAR],
LOOPHOLE[15, CHAR],
LOOPHOLE[16, CHAR],
LOOPHOLE[17, CHAR],
LOOPHOLE[18, CHAR],
LOOPHOLE[19, CHAR],
LOOPHOLE[20, CHAR],
LOOPHOLE[10, CHAR],
LOOPHOLE[22, CHAR],
LOOPHOLE[23, CHAR],
LOOPHOLE[24, CHAR],
LOOPHOLE[25, CHAR],
LOOPHOLE[26, CHAR],
LOOPHOLE[27, CHAR],
LOOPHOLE[28, CHAR],
LOOPHOLE[29, CHAR],
LOOPHOLE[30, CHAR],
LOOPHOLE[31, CHAR],
LOOPHOLE[64, CHAR],
LOOPHOLE[90, CHAR],
LOOPHOLE[127, CHAR],
LOOPHOLE[123, CHAR],
LOOPHOLE[91, CHAR],
LOOPHOLE[108, CHAR],
LOOPHOLE[80, CHAR],
LOOPHOLE[125, CHAR],
LOOPHOLE[77, CHAR],
LOOPHOLE[93, CHAR],
LOOPHOLE[92, CHAR],
LOOPHOLE[78, CHAR],
LOOPHOLE[107, CHAR],
LOOPHOLE[96, CHAR],
LOOPHOLE[75, CHAR],
LOOPHOLE[97, CHAR],
LOOPHOLE[240, CHAR],
LOOPHOLE[241, CHAR],
LOOPHOLE[242, CHAR],
LOOPHOLE[243, CHAR],
LOOPHOLE[244, CHAR],
LOOPHOLE[245, CHAR],
LOOPHOLE[246, CHAR],
LOOPHOLE[247, CHAR],
LOOPHOLE[248, CHAR],
LOOPHOLE[249, CHAR],
LOOPHOLE[122, CHAR],
LOOPHOLE[94, CHAR],
LOOPHOLE[76, CHAR],
LOOPHOLE[126, CHAR],
LOOPHOLE[110, CHAR],
LOOPHOLE[111, CHAR],
LOOPHOLE[124, CHAR],
LOOPHOLE[193, CHAR],
LOOPHOLE[194, CHAR],
LOOPHOLE[195, CHAR],
LOOPHOLE[196, CHAR],
LOOPHOLE[197, CHAR],
LOOPHOLE[198, CHAR],
LOOPHOLE[199, CHAR],
LOOPHOLE[200, CHAR],
LOOPHOLE[201, CHAR],
LOOPHOLE[209, CHAR],
LOOPHOLE[210, CHAR],
LOOPHOLE[211, CHAR],
LOOPHOLE[212, CHAR],
LOOPHOLE[213, CHAR],
LOOPHOLE[214, CHAR],
LOOPHOLE[215, CHAR],
LOOPHOLE[216, CHAR],
LOOPHOLE[217, CHAR],
LOOPHOLE[226, CHAR],
LOOPHOLE[227, CHAR],
LOOPHOLE[228, CHAR],
LOOPHOLE[229, CHAR],
LOOPHOLE[230, CHAR],
LOOPHOLE[231, CHAR],
LOOPHOLE[232, CHAR],
LOOPHOLE[233, CHAR],
LOOPHOLE[180, CHAR],
LOOPHOLE[177, CHAR],
LOOPHOLE[181, CHAR],
LOOPHOLE[106, CHAR],
LOOPHOLE[109, CHAR],
LOOPHOLE[74, CHAR],
LOOPHOLE[129, CHAR],
LOOPHOLE[130, CHAR],
LOOPHOLE[131, CHAR],
LOOPHOLE[132, CHAR],
LOOPHOLE[133, CHAR],
LOOPHOLE[134, CHAR],
LOOPHOLE[135, CHAR],
LOOPHOLE[136, CHAR],
LOOPHOLE[137, CHAR],
LOOPHOLE[145, CHAR],
LOOPHOLE[146, CHAR],
LOOPHOLE[147, CHAR],
LOOPHOLE[148, CHAR],
LOOPHOLE[149, CHAR],
LOOPHOLE[150, CHAR],
LOOPHOLE[151, CHAR],
LOOPHOLE[152, CHAR],
LOOPHOLE[153, CHAR],
LOOPHOLE[162, CHAR],
LOOPHOLE[163, CHAR],
LOOPHOLE[164, CHAR],
LOOPHOLE[165, CHAR],
LOOPHOLE[166, CHAR],
LOOPHOLE[167, CHAR],
LOOPHOLE[168, CHAR],
LOOPHOLE[169, CHAR],
LOOPHOLE[178, CHAR],
LOOPHOLE[79, CHAR],
LOOPHOLE[179, CHAR],
LOOPHOLE[95, CHAR],
LOOPHOLE[255, CHAR]
]];
END.