add support for loading extensions at runtime from a library

FossilOrigin-Name: 167b8770f5c07d3b6d7286f1af297c0e4c1c1b776900b361a194db12e46ac10c
This commit is contained in:
crc 2023-12-11 12:42:14 +00:00
parent 164dbffec2
commit 5ed4511bb9
5 changed files with 294 additions and 124 deletions

View file

@ -80,6 +80,7 @@ DEVICES += interface/block.retro
DEVICES += interface/deprecated.retro
DEVICES += interface/error.retro
DEVICES += interface/final.retro
DEVICES += interface/library.retro
# -------------------------------------------------------------

View file

@ -54,5 +54,7 @@
- use constants for device identifiers in nga-c
- use constants for device identifiers in the Forth part of
the device handlers
- support loading extensions at runtime via `library:load`
(searches ./library/ and ~/.config/retroforth/library/)
================================================================

24
interface/library.retro Normal file
View file

@ -0,0 +1,24 @@
~~~
'HOME d:create #1025 allot
'%s/.config/retroforth/library/%s.retro 'library:.CONFIG s:const
'./library/%s.retro 'library:CWD s:const
:library:cwd library:CWD s:format ;
:library:.config
'HOME &HOME unix:getenv
&HOME library:.CONFIG s:format ;
:library:filename (s-s)
dup library:cwd
dup file:exists? [ nip ] if; drop
library:.config dup file:exists? [ ] if; drop s:empty ;
:library:contains? (s-f)
&library:cwd &library:.config bi &file:exists? bi@ or ;
:library:load
dup library:contains? [ library:filename include ]
[ 'ERROR:_Libray_`%s`_was_not_found s:format s:put nl ] choose ;
~~~

75
library/x11.retro Normal file
View file

@ -0,0 +1,75 @@
~~~
:pixel (xyc-) #33 io:scan-for io:invoke ;
:get-pixel (xy-c) #34 io:scan-for io:invoke ;
:mouse (-xyb) #35 io:scan-for io:invoke ;
:hline (xyw-)
[ dup-pair #1 pixel &n:inc dip ] times drop-pair ;
:vline (xyh-)
[ dup-pair #1 pixel n:inc ] times drop-pair ;
:dline\ (xyl-)
[ dup-pair #1 pixel &n:inc bi@ ] times drop-pair ;
:dline/ (xyl-)
[ dup-pair #1 pixel &n:dec &n:inc bi* ] times drop-pair ;
'X var 'Y var 'H var 'W var
:rect (xyhw-) !W !H !Y !X
@X @Y @W hline @X @Y @H n:add @W hline
@X @Y @H vline @X @W n:add @Y @H vline ;
'XC var 'YC var 'X var 'Y var
:octant (xc,yc,x,y)
!Y !X !YC !XC
@XC @X n:add @YC @Y n:add #1 pixel
@XC @X n:sub @YC @Y n:add #1 pixel
@XC @X n:add @YC @Y n:sub #1 pixel
@XC @X n:sub @YC @Y n:sub #1 pixel
@XC @Y n:add @YC @X n:add #1 pixel
@XC @Y n:sub @YC @X n:add #1 pixel
@XC @Y n:add @YC @X n:sub #1 pixel
@XC @Y n:sub @YC @X n:sub #1 pixel ;
'XC var 'YC var 'X var 'Y var 'D var 'R var
:circle (xyr-)
!R !YC !XC #0 !X @R [ !Y ] [ !D ] bi
@XC @YC @X @Y octant
[ &X v:inc
@D n:strictly-positive?
[ &Y v:dec @X @Y n:sub @R n:mul #2 n:mul @D n:add !D ]
[ #2 @R n:mul @X n:mul @D n:add !D ] choose
@XC @YC @X @Y octant
@Y @X gteq? ] while ;
'X var 'Y var 'C var 'D var 'R var
:t:raise #0 !C ;
:t:lower #1 !C ;
:t:left [ &X v:dec ] !D ;
:t:right [ &X v:inc ] !D ;
:t:up [ &Y v:dec ] !D ;
:t:down [ &Y v:inc ] !D ;
:t:at (xy-) !Y !X ;
:t:forward (n-) [ @X @Y @C pixel @D call ] times ;
#320 #240 t:at t:lower t:right
:t:down-right [ &Y v:inc &X v:inc ] !D ;
:t:down-left [ &Y v:inc &X v:dec ] !D ;
:t:up-left [ &Y v:dec &X v:dec ] !D ;
:t:up-right [ &Y v:dec &X v:inc ] !D ;
'Rotations d:create #8 ,
&t:right , &t:down-right , &t:down ,
&t:down-left , &t:left , &t:up-left ,
&t:up , &t:up-right ,
:t:rotate
&R v:inc @R #8 eq? [ #0 !R ] if &Rotations @R a:fetch call ;
~~~

View file

@ -10,8 +10,8 @@
#define CELL_MAX LLONG_MAX - 1
#endif
#endif
CELL ngaImageCells = 21408;
CELL ngaImage[] = { 1793,19766,21388,21407,202404,417,389,1249,1535,0,11277,0,10,1,10,2,10,3,10,
CELL ngaImageCells = 22771;
CELL ngaImage[] = { 1793,21129,22751,22770,202404,417,389,1249,1535,0,11277,0,10,1,10,2,10,3,10,
4,10,5,10,6,10,7,10,8,10,11,10,12,10,13,10,14,10,15,10,
16,10,17,10,18,10,19,10,20,10,21,10,22,10,23,10,24,10,25,68223234,
1,2575,85000450,1,656912,163,180,268505089,65,64,285281281,0,65,2063,10,101384453,0,9,10,68485378,
@ -20,8 +20,8 @@ CELL ngaImage[] = { 1793,19766,21388,21407,202404,417,389,1249,1535,0,11277,0,10
1,251790353,101777669,1,17565186,109,524545,113,66,167838467,-1,134287105,3,61,659457,3,459023,130,2049,58,
25,2049,130,1793,137,2049,137,117506307,0,130,0,524545,28,135,168820993,0,149,1642241,149,134283523,
13,135,1793,130,524545,2049,130,1793,130,16846593,149,163,180,1793,66,16846593,149,135,180,1793,
66,7,10,659713,1,659713,2,659713,3,659713,4,659713,5,1793,20053,17108737,3,2,524559,130,
2049,130,2049,130,524545,0,130,524545,0,130,2049,144,1048838,2,1642241,10,7,19043,8246457295145463473,167841793,
66,7,10,659713,1,659713,2,659713,3,659713,4,659713,5,1793,21416,17108737,3,2,524559,130,
2049,130,2049,130,524545,0,130,524545,0,130,2049,144,1048838,2,1642241,10,7,20406,8246457295145463473,167841793,
216,11,17826049,0,216,2,15,25,524546,18524,134287105,217,29,2305,218,459023,226,2049,4874,134287361,
217,221,659201,216,10,659969,7,2049,58,25,17694978,58,244,9,84152833,48,319750404,243,117507601,246,
184618754,45,25,16974851,-1,168886532,1,134284289,1,259,134284289,0,246,660227,32,0,0,115,105,103,
@ -30,7 +30,7 @@ CELL ngaImage[] = { 1793,19766,21388,21407,202404,417,389,1249,1535,0,11277,0,10
251727617,3,2,2049,182,16,168820993,-1,149,2049,182,2575,2049,236,17563906,0,328,9,1793,156,
285282049,3,2,134287105,149,325,524545,1793,130,16846593,3,0,130,8,659201,3,524545,28,135,17043201,
3,13,2049,135,2049,130,268505092,149,1642241,149,656131,659201,3,524545,13,135,2049,130,459009,25,
135,459009,57,135,459009,21,135,459009,23,135,1793,19778,10,524546,182,134284303,184,1807,1249,1642241,
135,459009,57,135,459009,21,135,459009,23,135,1793,21141,10,524546,182,134284303,184,1807,1249,1642241,
275,285282049,397,1,459012,392,117509889,216,392,134287105,397,236,16845825,0,405,389,1793,66,1793,419,
17826050,397,294,8,117506305,398,408,66,2116,11340,11700,11400,13685,13104,12432,12402,9603,9801,11514,11413,
11110,12528,11948,10302,13340,9700,13455,12753,10500,10670,12654,13320,11960,13908,10088,10605,11865,11025,0,2049,
@ -74,8 +74,8 @@ CELL ngaImage[] = { 1793,19766,21388,21407,202404,417,389,1249,1535,0,11277,0,10
110,112,97,99,107,0,1193,186,168,504,7572226160734292,100,58,115,111,117,114,99,101,0,
1205,188,168,504,6953375310887,100,58,104,97,115,104,0,1219,389,168,504,-3366153855364863819,101,114,114,
58,110,111,116,102,111,117,110,100,0,105,109,97,103,101,58,115,97,118,101,
0,103,101,0,114,109,105,110,97,46,114,101,116,114,111,0,111,0,70,76,
79,87,0,0,102,111,117,110,100,0,46,49,47,83,79,67,75,69,84,83,
0,103,101,0,114,109,105,110,97,46,114,101,116,114,111,0,111,0,102,111,
117,110,100,0,114,101,116,114,111,0,46,49,47,83,79,67,75,69,84,83,
46,109,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@ -170,7 +170,7 @@ CELL ngaImage[] = { 1793,19766,21388,21407,202404,417,389,1249,1535,0,11277,0,10
110,58,105,110,99,0,659713,1,10,3114,3139,168,12542,210720197721,110,58,100,101,99,0,
659969,1,10,3128,3158,168,12542,8246617666422322998,110,58,98,101,116,119,101,101,110,63,0,67503109,
1793,3166,67503109,67503109,2049,3106,10,1,3161,2049,2241,11,10,3142,3187,168,12542,249861296566813883,83,99,
111,112,101,76,105,115,116,0,20468,20581,10,3172,3198,168,12542,5864091,123,123,0,2049,
111,112,101,76,105,115,116,0,21831,21944,10,3172,3198,168,12542,5864091,123,123,0,2049,
1576,2,1,3187,2049,61,16,10,3190,3225,168,12542,-6305314778776785742,45,45,45,114,101,118,101,
97,108,45,45,45,0,2049,1576,1,3187,2049,3125,16,10,3207,3241,168,12542,5864159,125,
125,0,1,3187,2049,58,4,15,11,1793,3255,3841,3187,4097,2,10,1,3250,1793,3281,
@ -228,7 +228,7 @@ CELL ngaImage[] = { 1793,19766,21388,21407,202404,417,389,1249,1535,0,11277,0,10
10,4239,4297,156,12542,-4600587576916820603,84,101,109,112,83,116,114,105,110,103,115,0,32,4280,
4317,156,12542,7474516786580364824,84,101,109,112,83,116,114,105,110,103,77,97,120,0,512,4298,
4331,168,12542,229440420829967,83,84,82,73,78,71,83,0,2049,1545,3841,4297,3841,4317,19,18,
10,4318,4353,156,0,0,67,117,114,114,101,110,116,0,12,10,4340,4370,168,0,
10,4318,4353,156,0,0,67,117,114,114,101,110,116,0,24,10,4340,4370,168,0,
0,115,58,112,111,105,110,116,101,114,0,3841,4353,3841,4317,19,2049,4331,17,10,
4355,4391,168,0,0,115,58,110,101,120,116,0,1,4353,2049,3864,3841,4353,3841,4297,
11,1793,4407,1,0,4097,4353,10,1,4402,9,10,4318,4423,168,12542,6953962777192,115,58,116,
@ -962,123 +962,191 @@ CELL ngaImage[] = { 1793,19766,21388,21407,202404,417,389,1249,1535,0,11277,0,10
115,101,116,45,100,101,102,97,117,108,116,115,0,1,18842,1,1,2049,18761,1,
18903,1,2,2049,18761,10,105,110,116,101,114,102,97,99,101,47,101,114,114,111,
114,46,114,101,116,114,111,0,1793,19028,1,192,1,2,17,8,2049,1576,2049,190,
3841,11262,8,2049,1576,2049,188,16,10,1,19009,18950,19039,168,19817,193470948,84,73,66,0,
1,7,15,10,19030,19059,168,19817,8246457295145463473,105,109,97,103,101,58,115,97,118,101,0,
1,1000,2049,10835,2049,10816,10,19043,19077,168,0,210711039690,101,100,105,116,63,0,2,1793,
19084,1,8,11,10,1,19080,1793,19092,1,127,11,10,1,19088,2049,2255,22,10,19066,
19110,168,0,6953539406400,103,97,116,104,101,114,0,2049,19077,1,17,1,4134,2049,66,10,
19098,19130,168,0,210709415765,99,121,99,108,101,0,2049,11146,2049,2217,4,8,2049,2644,25,
3,2049,19110,1,19130,7,10,19043,19163,168,19817,-4557881830897049127,112,97,114,115,101,45,117,110,
116,105,108,0,1793,19175,2049,4451,2049,4234,2049,19130,771,2049,4096,10,1,19165,2049,4260,
10,19146,19191,168,19817,210726130610,115,58,103,101,116,0,1793,19213,1793,19199,1,13,11,10,
1,19195,1793,19207,1,10,11,10,1,19203,2049,2255,22,10,1,19193,2049,19163,10,19180,
19229,168,19817,210708950412,99,108,101,97,114,0,2049,4472,92,94,91,50,74,92,94,91,
48,59,48,72,0,1,19231,2049,8245,2049,10941,10,19218,19260,156,0,193454829,69,79,84,
0,0,19251,19275,156,0,7571133383038306,73,103,110,111,114,105,110,103,0,0,19261,19289,168,
0,229486327000139,118,101,114,115,105,111,110,0,3841,4,1,100,20,10,19276,19306,168,0,
210710254026,100,111,110,101,63,0,2,4097,19260,1793,19315,1,13,11,10,1,19311,1793,19323,
1,10,11,10,1,19319,1793,19331,1,32,11,10,1,19327,2049,2298,22,22,10,19295,
19348,168,0,6385195044,101,111,108,63,0,3841,19260,1793,19356,1,13,11,10,1,19352,1793,
19364,1,10,11,10,1,19360,2049,2255,22,10,19338,19382,168,0,6954126150804,118,97,108,105,
100,63,0,2,2049,104,2049,2812,10,19370,19403,168,0,249883998779477802,99,104,101,99,107,45,
101,111,102,0,2,1793,19410,1,-1,11,10,1,19406,1793,19418,1,4,11,10,1,
19414,2049,2255,22,1,11213,9,10,19388,19435,168,0,5863258,98,115,0,2049,4212,1,2,
2049,2675,1793,19447,2049,4160,3,10,1,19443,9,2049,4160,3,10,19427,19468,168,0,7572242387256805,
99,104,101,99,107,45,98,115,0,2,1793,19475,1,8,11,10,1,19471,1793,19483,
1,127,11,10,1,19479,2049,2255,22,1,19435,9,10,19454,19503,168,0,210708806723,99,104,
101,99,107,0,2049,19403,2049,19468,10,19492,19523,168,0,249883994190734226,99,104,97,114,97,99,
116,101,114,0,2049,11146,2,2049,4134,10,19508,19541,168,0,6953366942559,98,117,102,102,101,
114,0,1793,19551,2049,19039,2049,4234,8,2049,4096,10,1,19543,2049,4260,10,19529,19572,168,
0,8246863741238799215,114,101,97,100,45,116,111,107,101,110,0,1793,19588,1793,19583,2049,19523,2049,
19503,2049,19306,10,1,19576,2049,2397,10,1,19574,2049,19541,2049,4587,10,19556,19606,168,0,
210716150453,105,110,112,117,116,0,2049,19572,2049,19382,10,19595,19624,168,0,229479082815460,112,114,111,
99,101,115,115,0,3841,19275,1793,19642,771,2049,19348,1793,19638,1,19275,2049,3931,10,1,
19633,9,10,1,19628,2049,2862,1,417,1,17,2049,66,10,19218,19661,180,19817,5861507,47,
47,0,2049,17195,1,19275,2049,3916,10,19653,19680,168,19817,6953343520347,98,97,110,110,101,114,
0,2049,19289,2049,4472,82,69,84,82,79,32,49,50,32,40,37,110,46,37,110,
41,92,110,0,1,19684,2049,8245,2049,10941,2049,9334,2049,1545,2049,9334,18,2049,1545,2049,
4472,37,110,32,77,97,120,44,32,37,110,32,85,115,101,100,44,32,37,110,
32,70,114,101,101,92,110,0,1,19720,2049,8245,2049,10941,10,19668,19766,168,19817,6953744547860,
108,105,115,116,101,110,0,2049,19680,2049,19606,2049,19624,1,19768,7,10,1793,19815,2049,
4472,69,82,82,79,82,58,32,87,111,114,100,32,78,111,116,32,70,111,117,
110,100,58,32,0,1,19780,2049,10941,2049,19039,2049,10941,2049,10898,10,1,19778,105,110,
116,101,114,102,97,99,101,47,114,101,116,114,111,45,117,110,105,120,46,114,
101,116,114,111,0,19754,19857,156,0,229441520490121,83,111,117,114,99,101,115,0,4,20106,
20300,20491,20783,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3841,11262,8,2049,1576,2049,188,16,10,1,19009,18950,19040,156,0,6384117006,72,79,77,69,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,19844,19997,168,0,6953711201841,107,110,111,119,110,63,0,2,1,
19857,2049,9098,10,19985,20014,168,0,210716136861,105,110,100,101,120,0,1,19857,4,2049,9774,
1,19857,4,2049,9244,10,20003,20037,168,0,6953974036516,114,101,99,111,114,100,0,2049,4500,
2,1,19857,2049,3864,3841,19857,1,19857,17,16,10,1793,20104,2049,17130,2049,19997,1793,20062,
2049,20014,10,1,20059,1793,20069,2049,20037,10,1,20066,2049,66,1793,20082,1,192,1,2,
17,8,10,1,20075,2049,2229,2049,1576,2049,186,16,2049,1576,2049,190,3841,11262,8,2049,
1576,2049,188,16,10,1,20053,100,105,99,116,45,119,111,114,100,115,45,108,105,
115,116,105,110,103,46,102,111,114,116,104,0,19754,20144,168,20106,229461403550098,100,58,119,
111,114,100,115,0,1793,20153,2049,190,2049,10941,2049,10911,10,1,20146,2049,8490,10,20131,
20176,168,20106,-3502157631813457253,100,58,119,111,114,100,115,45,119,105,116,104,0,2049,1977,2049,
5572,1793,20207,2049,190,2,2049,1977,2049,5285,1793,20196,2049,10941,2049,10911,10,1,20191,1793,
20202,3,10,1,20200,2049,66,10,1,20182,2049,8490,10,20158,20233,168,20106,2818131571306626127,100,105,
115,112,108,97,121,45,105,102,45,108,101,102,116,0,2,2049,1977,2049,5518,1793,
20245,2049,10941,2049,10911,10,1,20240,1793,20251,3,10,1,20249,2049,66,10,20158,20284,168,
20106,2947807019553410009,100,58,119,111,114,100,115,45,98,101,103,105,110,110,105,110,103,45,
119,105,116,104,0,2049,1977,2049,5572,1793,20295,2049,190,2049,20233,10,1,20290,2049,8490,
10,101,120,116,101,110,115,105,111,110,115,47,100,111,117,98,108,101,46,114,
101,116,114,111,0,20256,20340,168,20300,8246228896775126019,100,111,117,98,108,101,58,118,97,114,
0,2049,2075,4,2049,130,2049,130,10,20324,20366,168,20300,-3421095308458227740,100,111,117,98,108,101,
58,102,101,116,99,104,0,2049,58,4,15,10,20348,20389,168,20300,-3421095308442276665,100,111,117,
98,108,101,58,115,116,111,114,101,0,1,19,2049,2229,2049,61,16,10,20371,20415,
168,20300,-3421095308461432127,100,111,117,98,108,101,58,99,111,110,115,116,0,2049,20340,1,20366,
2049,8459,10,20397,20439,168,20300,-4575607512064199915,100,111,117,98,108,101,58,115,119,97,112,0,
67503109,5,67503109,6,10,20422,20460,168,20300,8246228896775106679,100,111,117,98,108,101,58,100,105,112,
0,67503109,67503109,5,5,8,6,6,10,20444,20484,168,20300,8246228896775123014,100,111,117,98,108,101,
58,115,105,112,0,1,2217,2049,2229,2049,20460,10,101,120,116,101,110,115,105,111,
110,115,47,109,97,108,108,111,99,46,114,101,116,114,111,0,20468,20531,168,20491,
8246632143337714634,109,101,109,58,105,110,118,111,107,101,0,1,15,2049,10835,2049,10816,10,20515,
0,156,20491,210667451248,65,76,76,79,67,0,20538,1,156,20491,6384048135,70,82,69,69,0,
20549,2,156,20491,210689088690,83,84,79,82,69,0,20559,3,156,20491,210673137615,70,69,84,67,
72,0,20570,4,156,20491,6952683137271,82,69,83,73,90,69,0,20468,20608,168,20491,249897943727936361,109,
101,109,58,97,108,108,111,99,0,1,0,2049,20531,10,20593,20628,168,20491,249897943749573803,109,
101,109,58,115,116,111,114,101,0,1,2,2049,20531,10,20613,20648,168,20491,249897943733622728,109,
101,109,58,102,101,116,99,104,0,1,3,2049,20531,10,20633,20667,168,20491,7572664961638592,109,
101,109,58,102,114,101,101,0,1,1,2049,20531,10,20653,20688,168,20491,8246632143679146032,109,101,
109,58,114,101,115,105,122,101,0,1,4,2049,20531,10,20672,20708,168,20491,249897943730056489,109,
101,109,58,99,101,108,108,43,0,1,8,19,17,10,20693,20735,168,20491,1050530996183190288,109,
101,109,58,102,101,116,99,104,45,100,111,117,98,108,101,0,2,1,1,2049,
20708,15,5,2049,20648,6,10,20713,20768,168,20491,1730340976492540563,109,101,109,58,115,116,111,114,
101,45,100,111,117,98,108,101,0,5,5,2049,2217,1,1,2049,20708,6,2049,20628,
6,2049,20628,10,101,120,116,101,110,115,105,111,110,115,47,116,101,114,109,105,
110,97,46,114,101,116,114,111,0,20746,20822,156,20783,7572966533140508,116,105,58,119,105,100,
116,104,0,74,20808,20838,156,20783,249907895002027829,116,105,58,104,101,105,103,104,116,0,25,
20823,20851,168,20783,6954146882628,118,116,58,101,115,99,0,1,27,2049,10883,10,20839,20868,168,
20783,6954146880456,118,116,58,99,115,105,0,2049,20851,1,91,2049,10883,10,20856,20888,168,20783,
229486847230610,118,116,58,104,111,109,101,0,2049,20868,1,72,2049,10883,10,20875,20911,168,20783,
8247068841851033643,118,116,58,114,111,119,44,99,111,108,0,2049,20868,4,2049,10957,1,59,2049,
10883,2049,10957,1,72,2049,10883,10,20895,20938,168,20783,210731724238,118,116,58,117,112,0,2049,
20868,2049,10957,1,65,2049,10883,10,20927,20960,168,20783,229486847087201,118,116,58,100,111,119,110,
0,2049,20868,2049,10957,1,66,2049,10883,10,20947,20983,168,20783,7573065970247399,118,116,58,114,105,
103,104,116,0,2049,20868,2049,10957,1,67,2049,10883,10,20969,21005,168,20783,229486847363252,118,116,
58,108,101,102,116,0,2049,20868,2049,10957,1,68,2049,10883,10,20992,21028,168,20783,7573065952563984,
118,116,58,99,108,101,97,114,0,2049,20868,2049,4472,50,74,0,1,21032,2049,10941,
10,21014,21054,168,20783,7573065970116620,118,116,58,114,101,115,101,116,0,2049,20868,2049,4472,48,
109,0,1,21058,2049,10941,10,21040,21084,168,20783,-2506394144308805245,118,116,58,115,101,116,47,99,
111,108,111,114,0,2049,20868,2049,4472,49,59,51,52,59,0,1,21088,2049,10941,2049,
10957,1,109,2049,10883,10,21066,21119,168,20783,7572367267202537,102,103,58,98,108,97,99,107,0,
1,30,2049,21084,10,21105,21138,168,20783,7572196793430629,98,103,58,98,108,97,99,107,0,1,
40,2049,21084,10,21124,21155,168,20783,6953505313063,102,103,58,114,101,100,0,1,31,2049,21084,
10,21143,21172,168,20783,6953348771491,98,103,58,114,101,100,0,1,41,2049,21084,10,21160,21191,
168,20783,7572367273352189,102,103,58,103,114,101,101,110,0,1,32,2049,21084,10,21177,21210,168,
20783,7572196799580281,98,103,58,103,114,101,101,110,0,1,42,2049,21084,10,21196,21230,168,20783,
249888120709901672,102,103,58,121,101,108,108,111,119,0,1,33,2049,21084,10,21215,21250,168,20783,
249882495075428708,98,103,58,121,101,108,108,111,119,0,1,43,2049,21084,10,21235,21268,168,20783,
229465674764372,102,103,58,98,108,117,101,0,1,34,2049,21084,10,21255,21286,168,20783,229460508892496,98,
103,58,98,108,117,101,0,1,44,2049,21084,10,21273,21307,168,20783,8246307967766415721,102,103,58,
109,97,103,101,110,116,97,0,1,35,2049,21084,10,21291,21328,168,20783,8246122321828807909,98,103,
58,109,97,103,101,110,116,97,0,1,45,2049,21084,10,21312,21346,168,20783,229465674813815,102,
103,58,99,121,97,110,0,1,36,2049,21084,10,21333,21364,168,20783,229460508941939,98,103,58,
99,121,97,110,0,1,46,2049,21084,10,21351,21383,168,20783,7572367291972397,102,103,58,119,104,
105,116,101,0,1,37,2049,21084,10,21369,21402,168,20783,7572196818200489,98,103,58,119,104,105,
116,101,0,1,47,2049,21084,10,0 };
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,37,115,47,46,99,111,110,102,105,103,47,114,101,116,
114,111,102,111,114,116,104,47,108,105,98,114,97,114,121,47,37,115,46,114,
101,116,114,111,0,19030,20065,156,0,6061648467740287960,108,105,98,114,97,114,121,58,46,67,
79,78,70,73,71,0,46,47,108,105,98,114,97,114,121,47,37,115,46,114,
101,116,114,111,0,20104,20125,156,0,-4563659402581934926,108,105,98,114,97,114,121,58,67,87,
68,0,20144,20178,168,0,-4563659402581898990,108,105,98,114,97,114,121,58,99,119,100,0,1,
20125,2049,8245,10,20161,20204,168,0,6061648469031755928,108,105,98,114,97,114,121,58,46,99,111,
110,102,105,103,0,2049,4472,72,79,77,69,0,1,20206,1,19040,2049,16048,1,19040,
1,20065,2049,8245,10,20183,20246,168,0,-2879782938503308011,108,105,98,114,97,114,121,58,102,105,
108,101,110,97,109,101,0,2,2049,20178,2,2049,15262,1793,20256,772,10,1,20254,2049,
2862,3,2049,20204,2,2049,15262,1793,20269,10,1,20268,2049,2862,3,2049,4451,10,20224,20300,
168,0,-2799120562421764174,108,105,98,114,97,114,121,58,99,111,110,116,97,105,110,115,63,
0,1,20178,1,20204,2049,2255,1,15262,2049,2285,22,10,20277,20330,168,0,-3026807695525939020,108,105,
98,114,97,114,121,58,108,111,97,100,0,2,2049,20300,1793,20340,2049,20246,2049,17076,
10,1,20335,1793,20388,2049,4472,69,82,82,79,82,58,32,76,105,98,114,97,121,
32,96,37,115,96,32,119,97,115,32,110,111,116,32,102,111,117,110,100,0,
1,20346,2049,8245,2049,10941,2049,10898,10,1,20344,2049,66,10,20312,20402,168,21180,193470948,84,
73,66,0,1,7,15,10,20393,20422,168,21180,8246457295145463473,105,109,97,103,101,58,115,97,
118,101,0,1,1000,2049,10835,2049,10816,10,20406,20440,168,0,210711039690,101,100,105,116,63,
0,2,1793,20447,1,8,11,10,1,20443,1793,20455,1,127,11,10,1,20451,2049,2255,
22,10,20429,20473,168,0,6953539406400,103,97,116,104,101,114,0,2049,20440,1,17,1,4134,
2049,66,10,20461,20493,168,0,210709415765,99,121,99,108,101,0,2049,11146,2049,2217,4,8,
2049,2644,25,3,2049,20473,1,20493,7,10,20406,20526,168,21180,-4557881830897049127,112,97,114,115,101,
45,117,110,116,105,108,0,1793,20538,2049,4451,2049,4234,2049,20493,771,2049,4096,10,1,
20528,2049,4260,10,20509,20554,168,21180,210726130610,115,58,103,101,116,0,1793,20576,1793,20562,1,
13,11,10,1,20558,1793,20570,1,10,11,10,1,20566,2049,2255,22,10,1,20556,2049,
20526,10,20543,20592,168,21180,210708950412,99,108,101,97,114,0,2049,4472,92,94,91,50,74,
92,94,91,48,59,48,72,0,1,20594,2049,8245,2049,10941,10,20581,20623,156,0,193454829,
69,79,84,0,0,20614,20638,156,0,7571133383038306,73,103,110,111,114,105,110,103,0,0,
20624,20652,168,0,229486327000139,118,101,114,115,105,111,110,0,3841,4,1,100,20,10,20639,
20669,168,0,210710254026,100,111,110,101,63,0,2,4097,20623,1793,20678,1,13,11,10,1,
20674,1793,20686,1,10,11,10,1,20682,1793,20694,1,32,11,10,1,20690,2049,2298,22,
22,10,20658,20711,168,0,6385195044,101,111,108,63,0,3841,20623,1793,20719,1,13,11,10,
1,20715,1793,20727,1,10,11,10,1,20723,2049,2255,22,10,20701,20745,168,0,6954126150804,118,
97,108,105,100,63,0,2,2049,104,2049,2812,10,20733,20766,168,0,249883998779477802,99,104,101,
99,107,45,101,111,102,0,2,1793,20773,1,-1,11,10,1,20769,1793,20781,1,4,
11,10,1,20777,2049,2255,22,1,11213,9,10,20751,20798,168,0,5863258,98,115,0,2049,
4212,1,2,2049,2675,1793,20810,2049,4160,3,10,1,20806,9,2049,4160,3,10,20790,20831,
168,0,7572242387256805,99,104,101,99,107,45,98,115,0,2,1793,20838,1,8,11,10,1,
20834,1793,20846,1,127,11,10,1,20842,2049,2255,22,1,20798,9,10,20817,20866,168,0,
210708806723,99,104,101,99,107,0,2049,20766,2049,20831,10,20855,20886,168,0,249883994190734226,99,104,97,
114,97,99,116,101,114,0,2049,11146,2,2049,4134,10,20871,20904,168,0,6953366942559,98,117,
102,102,101,114,0,1793,20914,2049,20402,2049,4234,8,2049,4096,10,1,20906,2049,4260,10,
20892,20935,168,0,8246863741238799215,114,101,97,100,45,116,111,107,101,110,0,1793,20951,1793,20946,
2049,20886,2049,20866,2049,20669,10,1,20939,2049,2397,10,1,20937,2049,20904,2049,4587,10,20919,
20969,168,0,210716150453,105,110,112,117,116,0,2049,20935,2049,20745,10,20958,20987,168,0,229479082815460,
112,114,111,99,101,115,115,0,3841,20638,1793,21005,771,2049,20711,1793,21001,1,20638,2049,
3931,10,1,20996,9,10,1,20991,2049,2862,1,417,1,17,2049,66,10,20581,21024,180,
21180,5861507,47,47,0,2049,17195,1,20638,2049,3916,10,21016,21043,168,21180,6953343520347,98,97,110,
110,101,114,0,2049,20652,2049,4472,82,69,84,82,79,32,49,50,32,40,37,110,
46,37,110,41,92,110,0,1,21047,2049,8245,2049,10941,2049,9334,2049,1545,2049,9334,18,
2049,1545,2049,4472,37,110,32,77,97,120,44,32,37,110,32,85,115,101,100,44,
32,37,110,32,70,114,101,101,92,110,0,1,21083,2049,8245,2049,10941,10,21031,21129,
168,21180,6953744547860,108,105,115,116,101,110,0,2049,21043,2049,20969,2049,20987,1,21131,7,10,
1793,21178,2049,4472,69,82,82,79,82,58,32,87,111,114,100,32,78,111,116,32,
70,111,117,110,100,58,32,0,1,21143,2049,10941,2049,20402,2049,10941,2049,10898,10,1,
21141,105,110,116,101,114,102,97,99,101,47,114,101,116,114,111,45,117,110,105,
120,46,114,101,116,114,111,0,21117,21220,156,0,229441520490121,83,111,117,114,99,101,115,
0,4,21469,21663,21854,22146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,21207,21360,168,0,6953711201841,107,110,111,119,110,63,
0,2,1,21220,2049,9098,10,21348,21377,168,0,210716136861,105,110,100,101,120,0,1,21220,
4,2049,9774,1,21220,4,2049,9244,10,21366,21400,168,0,6953974036516,114,101,99,111,114,100,
0,2049,4500,2,1,21220,2049,3864,3841,21220,1,21220,17,16,10,1793,21467,2049,17130,2049,
21360,1793,21425,2049,21377,10,1,21422,1793,21432,2049,21400,10,1,21429,2049,66,1793,21445,1,
192,1,2,17,8,10,1,21438,2049,2229,2049,1576,2049,186,16,2049,1576,2049,190,3841,
11262,8,2049,1576,2049,188,16,10,1,21416,100,105,99,116,45,119,111,114,100,115,
45,108,105,115,116,105,110,103,46,102,111,114,116,104,0,21117,21507,168,21469,229461403550098,
100,58,119,111,114,100,115,0,1793,21516,2049,190,2049,10941,2049,10911,10,1,21509,2049,
8490,10,21494,21539,168,21469,-3502157631813457253,100,58,119,111,114,100,115,45,119,105,116,104,0,
2049,1977,2049,5572,1793,21570,2049,190,2,2049,1977,2049,5285,1793,21559,2049,10941,2049,10911,10,
1,21554,1793,21565,3,10,1,21563,2049,66,10,1,21545,2049,8490,10,21521,21596,168,21469,
2818131571306626127,100,105,115,112,108,97,121,45,105,102,45,108,101,102,116,0,2,2049,1977,
2049,5518,1793,21608,2049,10941,2049,10911,10,1,21603,1793,21614,3,10,1,21612,2049,66,10,
21521,21647,168,21469,2947807019553410009,100,58,119,111,114,100,115,45,98,101,103,105,110,110,105,
110,103,45,119,105,116,104,0,2049,1977,2049,5572,1793,21658,2049,190,2049,21596,10,1,
21653,2049,8490,10,101,120,116,101,110,115,105,111,110,115,47,100,111,117,98,108,
101,46,114,101,116,114,111,0,21619,21703,168,21663,8246228896775126019,100,111,117,98,108,101,58,
118,97,114,0,2049,2075,4,2049,130,2049,130,10,21687,21729,168,21663,-3421095308458227740,100,111,117,
98,108,101,58,102,101,116,99,104,0,2049,58,4,15,10,21711,21752,168,21663,-3421095308442276665,
100,111,117,98,108,101,58,115,116,111,114,101,0,1,19,2049,2229,2049,61,16,
10,21734,21778,168,21663,-3421095308461432127,100,111,117,98,108,101,58,99,111,110,115,116,0,2049,
21703,1,21729,2049,8459,10,21760,21802,168,21663,-4575607512064199915,100,111,117,98,108,101,58,115,119,
97,112,0,67503109,5,67503109,6,10,21785,21823,168,21663,8246228896775106679,100,111,117,98,108,101,58,
100,105,112,0,67503109,67503109,5,5,8,6,6,10,21807,21847,168,21663,8246228896775123014,100,111,117,
98,108,101,58,115,105,112,0,1,2217,2049,2229,2049,21823,10,101,120,116,101,110,
115,105,111,110,115,47,109,97,108,108,111,99,46,114,101,116,114,111,0,21831,
21894,168,21854,8246632143337714634,109,101,109,58,105,110,118,111,107,101,0,1,15,2049,10835,2049,
10816,10,21878,0,156,21854,210667451248,65,76,76,79,67,0,21901,1,156,21854,6384048135,70,82,
69,69,0,21912,2,156,21854,210689088690,83,84,79,82,69,0,21922,3,156,21854,210673137615,70,
69,84,67,72,0,21933,4,156,21854,6952683137271,82,69,83,73,90,69,0,21831,21971,168,
21854,249897943727936361,109,101,109,58,97,108,108,111,99,0,1,0,2049,21894,10,21956,21991,168,
21854,249897943749573803,109,101,109,58,115,116,111,114,101,0,1,2,2049,21894,10,21976,22011,168,
21854,249897943733622728,109,101,109,58,102,101,116,99,104,0,1,3,2049,21894,10,21996,22030,168,
21854,7572664961638592,109,101,109,58,102,114,101,101,0,1,1,2049,21894,10,22016,22051,168,21854,
8246632143679146032,109,101,109,58,114,101,115,105,122,101,0,1,4,2049,21894,10,22035,22071,168,
21854,249897943730056489,109,101,109,58,99,101,108,108,43,0,1,8,19,17,10,22056,22098,168,
21854,1050530996183190288,109,101,109,58,102,101,116,99,104,45,100,111,117,98,108,101,0,2,
1,1,2049,22071,15,5,2049,22011,6,10,22076,22131,168,21854,1730340976492540563,109,101,109,58,115,
116,111,114,101,45,100,111,117,98,108,101,0,5,5,2049,2217,1,1,2049,22071,
6,2049,21991,6,2049,21991,10,101,120,116,101,110,115,105,111,110,115,47,116,101,
114,109,105,110,97,46,114,101,116,114,111,0,22109,22185,156,22146,7572966533140508,116,105,58,
119,105,100,116,104,0,74,22171,22201,156,22146,249907895002027829,116,105,58,104,101,105,103,104,
116,0,25,22186,22214,168,22146,6954146882628,118,116,58,101,115,99,0,1,27,2049,10883,10,
22202,22231,168,22146,6954146880456,118,116,58,99,115,105,0,2049,22214,1,91,2049,10883,10,22219,
22251,168,22146,229486847230610,118,116,58,104,111,109,101,0,2049,22231,1,72,2049,10883,10,22238,
22274,168,22146,8247068841851033643,118,116,58,114,111,119,44,99,111,108,0,2049,22231,4,2049,10957,
1,59,2049,10883,2049,10957,1,72,2049,10883,10,22258,22301,168,22146,210731724238,118,116,58,117,
112,0,2049,22231,2049,10957,1,65,2049,10883,10,22290,22323,168,22146,229486847087201,118,116,58,100,
111,119,110,0,2049,22231,2049,10957,1,66,2049,10883,10,22310,22346,168,22146,7573065970247399,118,116,
58,114,105,103,104,116,0,2049,22231,2049,10957,1,67,2049,10883,10,22332,22368,168,22146,
229486847363252,118,116,58,108,101,102,116,0,2049,22231,2049,10957,1,68,2049,10883,10,22355,22391,
168,22146,7573065952563984,118,116,58,99,108,101,97,114,0,2049,22231,2049,4472,50,74,0,1,
22395,2049,10941,10,22377,22417,168,22146,7573065970116620,118,116,58,114,101,115,101,116,0,2049,22231,
2049,4472,48,109,0,1,22421,2049,10941,10,22403,22447,168,22146,-2506394144308805245,118,116,58,115,101,
116,47,99,111,108,111,114,0,2049,22231,2049,4472,49,59,51,52,59,0,1,22451,
2049,10941,2049,10957,1,109,2049,10883,10,22429,22482,168,22146,7572367267202537,102,103,58,98,108,97,
99,107,0,1,30,2049,22447,10,22468,22501,168,22146,7572196793430629,98,103,58,98,108,97,99,
107,0,1,40,2049,22447,10,22487,22518,168,22146,6953505313063,102,103,58,114,101,100,0,1,
31,2049,22447,10,22506,22535,168,22146,6953348771491,98,103,58,114,101,100,0,1,41,2049,22447,
10,22523,22554,168,22146,7572367273352189,102,103,58,103,114,101,101,110,0,1,32,2049,22447,10,
22540,22573,168,22146,7572196799580281,98,103,58,103,114,101,101,110,0,1,42,2049,22447,10,22559,
22593,168,22146,249888120709901672,102,103,58,121,101,108,108,111,119,0,1,33,2049,22447,10,22578,
22613,168,22146,249882495075428708,98,103,58,121,101,108,108,111,119,0,1,43,2049,22447,10,22598,
22631,168,22146,229465674764372,102,103,58,98,108,117,101,0,1,34,2049,22447,10,22618,22649,168,
22146,229460508892496,98,103,58,98,108,117,101,0,1,44,2049,22447,10,22636,22670,168,22146,8246307967766415721,
102,103,58,109,97,103,101,110,116,97,0,1,35,2049,22447,10,22654,22691,168,22146,
8246122321828807909,98,103,58,109,97,103,101,110,116,97,0,1,45,2049,22447,10,22675,22709,168,
22146,229465674813815,102,103,58,99,121,97,110,0,1,36,2049,22447,10,22696,22727,168,22146,229460508941939,
98,103,58,99,121,97,110,0,1,46,2049,22447,10,22714,22746,168,22146,7572367291972397,102,103,
58,119,104,105,116,101,0,1,37,2049,22447,10,22732,22765,168,22146,7572196818200489,98,103,58,
119,104,105,116,101,0,1,47,2049,22447,10,0 };