Hex Artifact Content
Not logged in

Artifact ab24e0014d192d4bfb6acb637c799203cd812307:


0000: 5c 20 6e 65 74 32 6f 20 47 55 49 0a 0a 5c 20 43  \ net2o GUI..\ C
0010: 6f 70 79 72 69 67 68 74 20 28 43 29 20 32 30 31  opyright (C) 201
0020: 38 20 20 20 42 65 72 6e 64 20 50 61 79 73 61 6e  8   Bernd Paysan
0030: 0a 0a 5c 20 54 68 69 73 20 70 72 6f 67 72 61 6d  ..\ This program
0040: 20 69 73 20 66 72 65 65 20 73 6f 66 74 77 61 72   is free softwar
0050: 65 3a 20 79 6f 75 20 63 61 6e 20 72 65 64 69 73  e: you can redis
0060: 74 72 69 62 75 74 65 20 69 74 20 61 6e 64 2f 6f  tribute it and/o
0070: 72 20 6d 6f 64 69 66 79 0a 5c 20 69 74 20 75 6e  r modify.\ it un
0080: 64 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66  der the terms of
0090: 20 74 68 65 20 47 4e 55 20 41 66 66 65 72 6f 20   the GNU Affero 
00a0: 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c  General Public L
00b0: 69 63 65 6e 73 65 20 61 73 20 70 75 62 6c 69 73  icense as publis
00c0: 68 65 64 20 62 79 0a 5c 20 74 68 65 20 46 72 65  hed by.\ the Fre
00d0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
00e0: 61 74 69 6f 6e 2c 20 65 69 74 68 65 72 20 76 65  ation, either ve
00f0: 72 73 69 6f 6e 20 33 20 6f 66 20 74 68 65 20 4c  rsion 3 of the L
0100: 69 63 65 6e 73 65 2c 20 6f 72 0a 5c 20 28 61 74  icense, or.\ (at
0110: 20 79 6f 75 72 20 6f 70 74 69 6f 6e 29 20 61 6e   your option) an
0120: 79 20 6c 61 74 65 72 20 76 65 72 73 69 6f 6e 2e  y later version.
0130: 0a 0a 5c 20 54 68 69 73 20 70 72 6f 67 72 61 6d  ..\ This program
0140: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
0150: 69 6e 20 74 68 65 20 68 6f 70 65 20 74 68 61 74  in the hope that
0160: 20 69 74 20 77 69 6c 6c 20 62 65 20 75 73 65 66   it will be usef
0170: 75 6c 2c 0a 5c 20 62 75 74 20 57 49 54 48 4f 55  ul,.\ but WITHOU
0180: 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b 20  T ANY WARRANTY; 
0190: 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68 65  without even the
01a0: 20 69 6d 70 6c 69 65 64 20 77 61 72 72 61 6e 74   implied warrant
01b0: 79 20 6f 66 0a 5c 20 4d 45 52 43 48 41 4e 54 41  y of.\ MERCHANTA
01c0: 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e 45 53  BILITY or FITNES
01d0: 53 20 46 4f 52 20 41 20 50 41 52 54 49 43 55 4c  S FOR A PARTICUL
01e0: 41 52 20 50 55 52 50 4f 53 45 2e 20 20 53 65 65  AR PURPOSE.  See
01f0: 20 74 68 65 0a 5c 20 47 4e 55 20 41 66 66 65 72   the.\ GNU Affer
0200: 6f 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63  o General Public
0210: 20 4c 69 63 65 6e 73 65 20 66 6f 72 20 6d 6f 72   License for mor
0220: 65 20 64 65 74 61 69 6c 73 2e 0a 0a 5c 20 59 6f  e details...\ Yo
0230: 75 20 73 68 6f 75 6c 64 20 68 61 76 65 20 72 65  u should have re
0240: 63 65 69 76 65 64 20 61 20 63 6f 70 79 20 6f 66  ceived a copy of
0250: 20 74 68 65 20 47 4e 55 20 41 66 66 65 72 6f 20   the GNU Affero 
0260: 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c  General Public L
0270: 69 63 65 6e 73 65 0a 5c 20 61 6c 6f 6e 67 20 77  icense.\ along w
0280: 69 74 68 20 74 68 69 73 20 70 72 6f 67 72 61 6d  ith this program
0290: 2e 20 20 49 66 20 6e 6f 74 2c 20 73 65 65 20 3c  .  If not, see <
02a0: 68 74 74 70 3a 2f 2f 77 77 77 2e 67 6e 75 2e 6f  http://www.gnu.o
02b0: 72 67 2f 6c 69 63 65 6e 73 65 73 2f 3e 2e 0a 0a  rg/licenses/>...
02c0: 72 65 71 75 69 72 65 20 6d 69 6e 6f 73 32 2f 77  require minos2/w
02d0: 69 64 67 65 74 73 2e 66 73 0a 0a 61 6c 73 6f 20  idgets.fs..also 
02e0: 6d 69 6e 6f 73 0a 0a 63 74 78 20 30 3d 20 5b 49  minos..ctx 0= [I
02f0: 46 5d 20 20 77 69 6e 64 6f 77 2d 69 6e 69 74 20  F]  window-init 
0300: 20 5b 54 48 45 4e 5d 0a 0a 72 65 71 75 69 72 65   [THEN]..require
0310: 20 6d 69 6e 6f 73 32 2f 66 6f 6e 74 2d 73 74 79   minos2/font-sty
0320: 6c 65 2e 66 73 0a 0a 3a 20 73 6c 69 64 65 2d 66  le.fs..: slide-f
0330: 72 61 6d 65 20 28 20 67 6c 75 65 20 63 6f 6c 6f  rame ( glue colo
0340: 72 20 2d 2d 20 6f 20 29 0a 20 20 20 20 66 6f 6e  r -- o ).    fon
0350: 74 2d 73 69 7a 65 23 20 37 30 25 20 66 2a 20 7d  t-size# 70% f* }
0360: 7d 66 72 61 6d 65 20 3b 0a 3a 20 62 61 72 2d 66  }frame ;.: bar-f
0370: 72 61 6d 65 20 28 20 67 6c 75 65 20 63 6f 6c 6f  rame ( glue colo
0380: 72 20 2d 2d 20 6f 20 29 0a 20 20 20 20 66 6f 6e  r -- o ).    fon
0390: 74 2d 73 69 7a 65 23 20 32 30 25 20 66 2a 20 7d  t-size# 20% f* }
03a0: 7d 66 72 61 6d 65 20 64 75 70 20 2e 62 75 74 74  }frame dup .butt
03b0: 6f 6e 33 20 3b 0a 3a 20 75 70 64 61 74 65 2d 73  on3 ;.: update-s
03c0: 69 7a 65 23 20 28 20 2d 2d 20 29 0a 20 20 20 20  ize# ( -- ).    
03d0: 73 63 72 65 65 6e 2d 70 77 68 20 6d 61 78 20 73  screen-pwh max s
03e0: 3e 66 0a 20 20 20 20 64 65 66 61 75 6c 74 2d 64  >f.    default-d
03f0: 69 61 67 20 73 63 72 65 65 6e 2d 64 69 61 67 20  iag screen-diag 
0400: 66 2f 20 66 73 71 72 74 20 64 65 66 61 75 6c 74  f/ fsqrt default
0410: 2d 73 63 61 6c 65 20 66 2a 20 31 2f 66 20 23 34  -scale f* 1/f #4
0420: 38 20 66 6d 2a 0a 20 20 20 20 66 2f 20 66 72 6f  8 fm*.    f/ fro
0430: 75 6e 64 20 74 6f 20 66 6f 6e 74 2d 73 69 7a 65  und to font-size
0440: 23 0a 20 20 20 20 66 6f 6e 74 2d 73 69 7a 65 23  #.    font-size#
0450: 20 31 33 33 25 20 66 2a 20 66 72 6f 75 6e 64 20   133% f* fround 
0460: 74 6f 20 62 61 73 65 6c 69 6e 65 23 0a 20 20 20  to baseline#.   
0470: 20 66 6f 6e 74 2d 73 69 7a 65 23 20 33 32 65 20   font-size# 32e 
0480: 66 2f 20 74 6f 20 70 69 78 65 6c 73 69 7a 65 23  f/ to pixelsize#
0490: 20 3b 0a 0a 75 70 64 61 74 65 2d 73 69 7a 65 23   ;..update-size#
04a0: 0a 0a 72 65 71 75 69 72 65 20 6d 69 6e 6f 73 32  ..require minos2
04b0: 2f 74 65 78 74 2d 73 74 79 6c 65 2e 66 73 0a 72  /text-style.fs.r
04c0: 65 71 75 69 72 65 20 6d 69 6e 6f 73 32 2f 6d 64  equire minos2/md
04d0: 2d 76 69 65 77 65 72 2e 66 73 0a 0a 67 6c 75 65  -viewer.fs..glue
04e0: 20 6e 65 77 20 43 6f 6e 73 74 61 6e 74 20 67 6c   new Constant gl
04f0: 75 65 2d 73 6c 65 66 74 0a 67 6c 75 65 20 6e 65  ue-sleft.glue ne
0500: 77 20 43 6f 6e 73 74 61 6e 74 20 67 6c 75 65 2d  w Constant glue-
0510: 73 72 69 67 68 74 0a 67 6c 75 65 20 27 20 6e 65  sright.glue ' ne
0520: 77 20 73 74 61 74 69 63 2d 61 20 77 69 74 68 2d  w static-a with-
0530: 61 6c 6c 6f 63 61 74 65 72 20 43 6f 6e 73 74 61  allocater Consta
0540: 6e 74 20 67 6c 75 65 2d 6c 65 66 74 0a 67 6c 75  nt glue-left.glu
0550: 65 20 27 20 6e 65 77 20 73 74 61 74 69 63 2d 61  e ' new static-a
0560: 20 77 69 74 68 2d 61 6c 6c 6f 63 61 74 65 72 20   with-allocater 
0570: 43 6f 6e 73 74 61 6e 74 20 67 6c 75 65 2d 72 69  Constant glue-ri
0580: 67 68 74 0a 0a 3a 20 67 6c 75 65 30 20 28 20 2d  ght..: glue0 ( -
0590: 2d 20 29 20 30 65 20 66 64 75 70 0a 20 20 20 20  - ) 0e fdup.    
05a0: 5b 20 67 6c 75 65 2d 6c 65 66 74 20 20 2e 68 67  [ glue-left  .hg
05b0: 6c 75 65 2d 63 20 5d 4c 20 64 66 21 0a 20 20 20  lue-c ]L df!.   
05c0: 20 5b 20 67 6c 75 65 2d 72 69 67 68 74 20 2e 68   [ glue-right .h
05d0: 67 6c 75 65 2d 63 20 5d 4c 20 64 66 21 20 3b 0a  glue-c ]L df! ;.
05e0: 67 6c 75 65 30 0a 0a 56 61 72 69 61 62 6c 65 20  glue0..Variable 
05f0: 73 6c 69 64 65 73 5b 5d 0a 56 61 72 69 61 62 6c  slides[].Variabl
0600: 65 20 73 6c 69 64 65 23 0a 0a 3a 20 3e 73 6c 69  e slide#..: >sli
0610: 64 65 73 20 28 20 6f 20 2d 2d 20 29 20 73 6c 69  des ( o -- ) sli
0620: 64 65 73 5b 5d 20 3e 73 74 61 63 6b 20 3b 0a 0a  des[] >stack ;..
0630: 3a 20 21 73 6c 69 64 65 73 20 28 20 6e 70 72 65  : !slides ( npre
0640: 76 20 6e 20 2d 2d 20 29 0a 20 20 20 20 6f 76 65  v n -- ).    ove
0650: 72 20 73 6c 69 64 65 23 20 21 0a 20 20 20 20 73  r slide# !.    s
0660: 6c 69 64 65 73 5b 5d 20 24 5b 5d 20 40 20 2f 66  lides[] $[] @ /f
0670: 6c 69 70 20 64 72 6f 70 0a 20 20 20 20 73 6c 69  lip drop.    sli
0680: 64 65 73 5b 5d 20 24 5b 5d 20 40 20 2f 66 6c 6f  des[] $[] @ /flo
0690: 70 20 64 72 6f 70 20 67 6c 75 65 30 20 3b 0a 3a  p drop glue0 ;.:
06a0: 20 61 6e 69 6d 21 73 6c 69 64 65 73 20 28 20 72   anim!slides ( r
06b0: 30 2e 2e 31 20 6e 20 2d 2d 20 29 0a 20 20 20 20  0..1 n -- ).    
06c0: 73 6c 69 64 65 73 5b 5d 20 24 5b 5d 20 40 20 2f  slides[] $[] @ /
06d0: 66 6c 6f 70 20 64 72 6f 70 0a 20 20 20 20 66 64  flop drop.    fd
06e0: 75 70 20 66 6e 65 67 61 74 65 20 64 70 79 2d 77  up fnegate dpy-w
06f0: 20 40 20 66 6d 2a 20 67 6c 75 65 2d 6c 65 66 74   @ fm* glue-left
0700: 20 20 2e 68 67 6c 75 65 2d 63 20 64 66 21 0a 20    .hglue-c df!. 
0710: 20 20 20 2d 31 65 20 66 2b 20 20 20 20 20 20 20     -1e f+       
0720: 64 70 79 2d 77 20 40 20 66 6d 2a 20 67 6c 75 65  dpy-w @ fm* glue
0730: 2d 72 69 67 68 74 20 2e 68 67 6c 75 65 2d 63 20  -right .hglue-c 
0740: 64 66 21 20 3b 0a 0a 3a 20 70 72 65 76 2d 61 6e  df! ;..: prev-an
0750: 69 6d 20 28 20 6e 20 72 30 2e 2e 31 20 2d 2d 20  im ( n r0..1 -- 
0760: 29 0a 20 20 20 20 64 75 70 20 30 3c 3d 20 49 46  ).    dup 0<= IF
0770: 20 20 64 72 6f 70 20 66 64 72 6f 70 20 20 45 58    drop fdrop  EX
0780: 49 54 20 20 54 48 45 4e 0a 20 20 20 20 66 64 75  IT  THEN.    fdu
0790: 70 20 31 65 20 66 3e 3d 20 49 46 20 20 66 64 72  p 1e f>= IF  fdr
07a0: 6f 70 0a 09 64 75 70 20 31 2d 20 73 77 61 70 20  op..dup 1- swap 
07b0: 21 73 6c 69 64 65 73 20 2b 73 79 6e 63 20 2b 72  !slides +sync +r
07c0: 65 73 69 7a 65 20 20 45 58 49 54 0a 20 20 20 20  esize  EXIT.    
07d0: 54 48 45 4e 0a 20 20 20 20 31 65 20 66 73 77 61  THEN.    1e fswa
07e0: 70 20 66 2d 20 31 2d 20 73 69 6e 2d 74 20 61 6e  p f- 1- sin-t an
07f0: 69 6d 21 73 6c 69 64 65 73 20 2b 73 79 6e 63 20  im!slides +sync 
0800: 2b 72 65 73 69 7a 65 20 3b 0a 0a 3a 20 6e 65 78  +resize ;..: nex
0810: 74 2d 61 6e 69 6d 20 28 20 6e 20 72 30 2e 2e 31  t-anim ( n r0..1
0820: 20 2d 2d 20 29 0a 20 20 20 20 64 75 70 20 73 6c   -- ).    dup sl
0830: 69 64 65 73 5b 5d 20 24 5b 5d 23 20 31 2d 20 75  ides[] $[]# 1- u
0840: 3e 3d 20 49 46 20 20 64 72 6f 70 20 66 64 72 6f  >= IF  drop fdro
0850: 70 20 20 45 58 49 54 20 20 54 48 45 4e 0a 20 20  p  EXIT  THEN.  
0860: 20 20 66 64 75 70 20 31 65 20 66 3e 3d 20 49 46    fdup 1e f>= IF
0870: 20 20 66 64 72 6f 70 0a 09 64 75 70 20 31 2b 20    fdrop..dup 1+ 
0880: 73 77 61 70 20 21 73 6c 69 64 65 73 20 2b 73 79  swap !slides +sy
0890: 6e 63 20 2b 72 65 73 69 7a 65 20 20 45 58 49 54  nc +resize  EXIT
08a0: 0a 20 20 20 20 54 48 45 4e 0a 20 20 20 20 31 2b  .    THEN.    1+
08b0: 20 73 69 6e 2d 74 20 61 6e 69 6d 21 73 6c 69 64   sin-t anim!slid
08c0: 65 73 20 2b 73 79 6e 63 20 2b 72 65 73 69 7a 65  es +sync +resize
08d0: 20 3b 0a 0a 30 2e 34 65 20 46 56 61 6c 75 65 20   ;..0.4e FValue 
08e0: 73 6c 69 64 65 2d 74 69 6d 65 25 0a 0a 3a 20 70  slide-time%..: p
08f0: 72 65 76 2d 73 6c 69 64 65 20 28 20 2d 2d 20 29  rev-slide ( -- )
0900: 0a 20 20 20 20 73 6c 69 64 65 2d 74 69 6d 65 25  .    slide-time%
0910: 20 61 6e 69 6d 73 5b 5d 20 24 40 6c 65 6e 20 49   anims[] $@len I
0920: 46 20 20 61 6e 69 6d 2d 65 6e 64 20 35 30 25 20  F  anim-end 50% 
0930: 66 2a 20 20 54 48 45 4e 0a 20 20 20 20 73 6c 69  f*  THEN.    sli
0940: 64 65 23 20 40 20 5b 27 5d 20 70 72 65 76 2d 61  de# @ ['] prev-a
0950: 6e 69 6d 20 3e 61 6e 69 6d 61 74 65 20 2b 74 65  nim >animate +te
0960: 78 74 75 72 65 73 20 2b 6c 61 6e 67 20 3b 0a 3a  xtures +lang ;.:
0970: 20 6e 65 78 74 2d 73 6c 69 64 65 20 28 20 2d 2d   next-slide ( --
0980: 20 29 0a 20 20 20 20 73 6c 69 64 65 2d 74 69 6d   ).    slide-tim
0990: 65 25 20 61 6e 69 6d 73 5b 5d 20 24 40 6c 65 6e  e% anims[] $@len
09a0: 20 49 46 20 20 61 6e 69 6d 2d 65 6e 64 20 35 30   IF  anim-end 50
09b0: 25 20 66 2a 20 20 54 48 45 4e 0a 20 20 20 20 73  % f*  THEN.    s
09c0: 6c 69 64 65 23 20 40 20 5b 27 5d 20 6e 65 78 74  lide# @ ['] next
09d0: 2d 61 6e 69 6d 20 3e 61 6e 69 6d 61 74 65 20 2b  -anim >animate +
09e0: 74 65 78 74 75 72 65 73 20 2b 6c 61 6e 67 20 3b  textures +lang ;
09f0: 0a 0a 5c 20 66 72 61 6d 65 73 0a 0a 30 20 56 61  ..\ frames..0 Va
0a00: 6c 75 65 20 70 77 2d 66 72 61 6d 65 0a 30 20 56  lue pw-frame.0 V
0a10: 61 6c 75 65 20 69 64 2d 66 72 61 6d 65 0a 30 20  alue id-frame.0 
0a20: 56 61 6c 75 65 20 63 68 61 74 2d 66 72 61 6d 65  Value chat-frame
0a30: 0a 30 20 56 61 6c 75 65 20 70 6f 73 74 2d 66 72  .0 Value post-fr
0a40: 61 6d 65 0a 0a 5c 20 70 61 73 73 77 6f 72 64 20  ame..\ password 
0a50: 73 63 72 65 65 6e 0a 0a 30 20 56 61 6c 75 65 20  screen..0 Value 
0a60: 70 77 2d 65 72 72 0a 30 20 56 61 6c 75 65 20 70  pw-err.0 Value p
0a70: 77 2d 6e 75 6d 0a 30 20 56 61 6c 75 65 20 70 68  w-num.0 Value ph
0a80: 72 61 73 65 2d 75 6e 6c 6f 63 6b 0a 30 20 56 61  rase-unlock.0 Va
0a90: 6c 75 65 20 63 72 65 61 74 65 2d 6e 65 77 2d 69  lue create-new-i
0aa0: 64 0a 30 20 56 61 6c 75 65 20 70 68 72 61 73 65  d.0 Value phrase
0ab0: 2d 66 69 72 73 74 0a 30 20 56 61 6c 75 65 20 70  -first.0 Value p
0ac0: 68 72 61 73 65 2d 61 67 61 69 6e 0a 30 20 56 61  hrase-again.0 Va
0ad0: 6c 75 65 20 70 6c 75 73 2d 6c 6f 67 69 6e 0a 30  lue plus-login.0
0ae0: 20 56 61 6c 75 65 20 6d 69 6e 75 73 2d 6c 6f 67   Value minus-log
0af0: 69 6e 0a 30 20 56 61 6c 75 65 20 6e 69 63 6b 2d  in.0 Value nick-
0b00: 65 64 69 74 0a 0a 3a 20 65 72 72 2d 66 61 64 65  edit..: err-fade
0b10: 20 28 20 72 20 61 64 64 72 20 2d 2d 20 29 0a 20   ( r addr -- ). 
0b20: 20 20 20 31 65 20 66 6f 76 65 72 20 5b 20 70 69     1e fover [ pi
0b30: 20 66 32 2a 20 5d 20 46 6c 69 74 65 72 61 6c 20   f2* ] Fliteral 
0b40: 66 2a 20 66 63 6f 73 20 31 65 20 66 2b 20 66 32  f* fcos 1e f+ f2
0b50: 2f 20 66 2d 0a 20 20 20 20 32 20 74 72 69 65 73  / f-.    2 tries
0b60: 23 20 40 20 6c 73 68 69 66 74 20 73 3e 66 20 66  # @ lshift s>f f
0b70: 2a 20 66 64 75 70 20 31 65 20 66 3e 20 49 46 20  * fdup 1e f> IF 
0b80: 66 64 72 6f 70 20 31 65 20 45 4c 53 45 20 2b 73  fdrop 1e ELSE +s
0b90: 79 6e 63 20 2b 72 65 73 69 7a 65 20 54 48 45 4e  ync +resize THEN
0ba0: 0a 20 20 20 20 2e 66 61 64 65 20 66 64 72 6f 70  .    .fade fdrop
0bb0: 20 3b 0a 0a 3a 20 73 68 61 6b 65 2d 6c 72 20 28   ;..: shake-lr (
0bc0: 20 72 20 61 64 64 72 20 2d 2d 20 29 0a 20 20 20   r addr -- ).   
0bd0: 20 5b 20 70 69 20 31 36 65 20 66 2a 20 5d 20 46   [ pi 16e f* ] F
0be0: 4c 69 74 65 72 61 6c 20 66 2a 20 66 73 69 6e 20  Literal f* fsin 
0bf0: 66 32 2f 20 30 2e 35 65 20 66 2b 20 5c 20 38 20  f2/ 0.5e f+ \ 8 
0c00: 74 69 6d 65 73 20 73 68 61 6b 65 0a 20 20 20 20  times shake.    
0c10: 66 6f 6e 74 2d 73 69 7a 65 23 20 66 32 2f 20 66  font-size# f2/ f
0c20: 2a 20 66 6f 6e 74 2d 73 69 7a 65 23 20 66 32 2f  * font-size# f2/
0c30: 20 66 6f 76 65 72 20 66 2d 0a 20 20 20 20 67 6c   fover f-.    gl
0c40: 75 65 2d 73 6c 65 66 74 20 20 3e 6f 20 30 67 20  ue-sleft  >o 0g 
0c50: 66 64 75 70 20 68 67 6c 75 65 2d 63 20 67 6c 75  fdup hglue-c glu
0c60: 65 21 20 6f 3e 0a 20 20 20 20 67 6c 75 65 2d 73  e! o>.    glue-s
0c70: 72 69 67 68 74 20 3e 6f 20 30 67 20 66 64 75 70  right >o 0g fdup
0c80: 20 68 67 6c 75 65 2d 63 20 67 6c 75 65 21 20 6f   hglue-c glue! o
0c90: 3e 20 2b 73 79 6e 63 20 2b 72 65 73 69 7a 65 20  > +sync +resize 
0ca0: 64 72 6f 70 20 3b 0a 0a 30 65 20 30 20 73 68 61  drop ;..0e 0 sha
0cb0: 6b 65 2d 6c 72 0a 0a 3a 20 70 72 65 73 2d 66 72  ke-lr..: pres-fr
0cc0: 61 6d 65 20 28 20 63 6f 6c 6f 72 20 2d 2d 20 6f  ame ( color -- o
0cd0: 31 20 6f 32 20 29 20 5c 20 64 72 6f 70 20 24 46  1 o2 ) \ drop $F
0ce0: 46 46 46 46 46 46 46 0a 20 20 20 20 67 6c 75 65  FFFFFFF.    glue
0cf0: 2a 77 68 20 73 6c 69 64 65 2d 66 72 61 6d 65 20  *wh slide-frame 
0d00: 64 75 70 20 2e 62 75 74 74 6f 6e 31 20 3b 0a 0a  dup .button1 ;..
0d10: 3a 20 65 72 72 2d 66 61 64 65 3f 20 28 20 2d 2d  : err-fade? ( --
0d20: 20 66 6c 61 67 20 29 20 30 20 7b 20 66 6c 61 67   flag ) 0 { flag
0d30: 20 7d 0a 20 20 20 20 61 6e 69 6d 73 40 20 30 20   }.    anims@ 0 
0d40: 3f 44 4f 0a 09 3e 6f 20 61 63 74 69 6f 6e 2d 6f  ?DO..>o action-o
0d50: 66 20 61 6e 69 6d 61 74 65 20 5b 27 5d 20 65 72  f animate ['] er
0d60: 72 2d 66 61 64 65 20 3d 20 66 6c 61 67 20 6f 72  r-fade = flag or
0d70: 20 74 6f 20 66 6c 61 67 0a 09 6f 20 61 6e 69 6d   to flag..o anim
0d80: 73 5b 5d 20 3e 73 74 61 63 6b 20 6f 3e 0a 20 20  s[] >stack o>.  
0d90: 20 20 4c 4f 4f 50 20 20 66 6c 61 67 20 3b 0a 0a    LOOP  flag ;..
0da0: 66 6f 72 77 61 72 64 20 73 68 6f 77 2d 6e 69 63  forward show-nic
0db0: 6b 73 0a 66 6f 72 77 61 72 64 20 67 75 69 2d 6d  ks.forward gui-m
0dc0: 73 67 73 0a 30 20 56 61 6c 75 65 20 74 69 74 6c  sgs.0 Value titl
0dd0: 65 2d 76 70 0a 30 20 56 61 6c 75 65 20 70 77 2d  e-vp.0 Value pw-
0de0: 66 69 65 6c 64 0a 30 20 56 61 6c 75 65 20 6e 69  field.0 Value ni
0df0: 63 6b 2d 66 69 65 6c 64 0a 30 20 56 61 6c 75 65  ck-field.0 Value
0e00: 20 6e 69 63 6b 2d 70 77 0a 30 20 56 61 6c 75 65   nick-pw.0 Value
0e10: 20 70 77 2d 62 61 63 6b 0a 0a 56 61 72 69 61 62   pw-back..Variab
0e20: 6c 65 20 6e 69 63 6b 24 0a 0a 3a 20 6e 69 63 6b  le nick$..: nick
0e30: 2d 64 6f 6e 65 20 28 20 6d 61 78 20 73 70 61 6e  -done ( max span
0e40: 20 61 64 64 72 20 70 6f 73 20 2d 2d 20 6d 61 78   addr pos -- max
0e50: 20 73 70 61 6e 20 61 64 64 72 20 70 6f 73 20 66   span addr pos f
0e60: 6c 61 67 20 29 0a 20 20 20 20 6f 76 65 72 20 33  lag ).    over 3
0e70: 20 70 69 63 6b 20 6e 69 63 6b 24 20 24 21 0a 20   pick nick$ $!. 
0e80: 20 20 20 30 65 20 70 77 2d 66 69 65 6c 64 20 5b     0e pw-field [
0e90: 3a 20 64 61 74 61 20 2e 65 6e 67 61 67 65 20 66  : data .engage f
0ea0: 64 72 6f 70 20 3b 5d 20 3e 61 6e 69 6d 61 74 65  drop ;] >animate
0eb0: 20 5c 20 65 6e 67 61 67 65 20 64 65 6c 61 79 65   \ engage delaye
0ec0: 64 0a 20 20 20 20 63 72 65 61 74 65 2d 6e 65 77  d.    create-new
0ed0: 2d 69 64 20 2f 68 66 6c 69 70 0a 20 20 20 20 70  -id /hflip.    p
0ee0: 68 72 61 73 65 2d 66 69 72 73 74 20 2f 66 6c 6f  hrase-first /flo
0ef0: 70 20 2b 6c 61 6e 67 0a 20 20 20 20 31 20 74 6f  p +lang.    1 to
0f00: 20 6e 69 63 6b 2d 70 77 20 20 74 72 75 65 20 3b   nick-pw  true ;
0f10: 0a 0a 3a 20 63 6c 65 61 72 2d 65 64 69 74 20 28  ..: clear-edit (
0f20: 20 6d 61 78 20 73 70 61 6e 20 61 64 64 72 20 70   max span addr p
0f30: 6f 73 20 2d 2d 20 6d 61 78 20 30 20 61 64 64 72  os -- max 0 addr
0f40: 20 30 20 74 72 75 65 20 29 0a 20 20 20 20 64 72   0 true ).    dr
0f50: 6f 70 20 6e 69 70 20 30 20 74 75 63 6b 20 74 72  op nip 0 tuck tr
0f60: 75 65 20 3b 0a 0a 3a 20 64 6f 2d 73 68 61 6b 65  ue ;..: do-shake
0f70: 20 28 20 6d 61 78 20 73 70 61 6e 20 61 64 64 72   ( max span addr
0f80: 20 70 6f 73 20 2d 2d 20 6d 61 78 20 73 70 61 6e   pos -- max span
0f90: 20 61 64 64 72 20 70 6f 73 20 66 6c 61 67 20 29   addr pos flag )
0fa0: 0a 20 20 20 20 6b 65 79 73 20 73 65 63 5b 5d 66  .    keys sec[]f
0fb0: 72 65 65 0a 20 20 20 20 63 6c 65 61 72 2d 65 64  ree.    clear-ed
0fc0: 69 74 20 69 6e 76 65 72 74 0a 20 20 20 20 31 65  it invert.    1e
0fd0: 20 6f 20 5b 27 5d 20 73 68 61 6b 65 2d 6c 72 20   o ['] shake-lr 
0fe0: 3e 61 6e 69 6d 61 74 65 0a 20 20 20 20 31 20 74  >animate.    1 t
0ff0: 72 69 65 73 23 20 40 20 6c 73 68 69 66 74 20 73  ries# @ lshift s
1000: 3e 66 20 66 32 2f 20 70 77 2d 65 72 72 20 5b 27  >f f2/ pw-err ['
1010: 5d 20 65 72 72 2d 66 61 64 65 20 3e 61 6e 69 6d  ] err-fade >anim
1020: 61 74 65 20 3b 0a 0a 3a 20 72 69 67 68 74 2d 70  ate ;..: right-p
1030: 68 72 61 73 65 20 28 20 6d 61 78 20 73 70 61 6e  hrase ( max span
1040: 20 61 64 64 72 20 70 6f 73 20 2d 2d 20 6d 61 78   addr pos -- max
1050: 20 73 70 61 6e 20 61 64 64 72 20 70 6f 73 20 66   span addr pos f
1060: 6c 61 67 20 29 0a 20 20 20 20 5c 20 2e 22 20 52  lag ).    \ ." R
1070: 69 67 68 74 20 70 61 73 73 70 68 72 61 73 65 22  ight passphrase"
1080: 20 63 72 0a 20 20 20 20 30 20 3e 6f 20 30 20 73   cr.    0 >o 0 s
1090: 65 63 72 65 74 2d 6b 65 79 20 69 6e 69 74 2d 63  ecret-key init-c
10a0: 6c 69 65 6e 74 20 3e 72 61 77 2d 6b 65 79 0a 20  lient >raw-key. 
10b0: 20 20 20 72 65 61 64 2d 63 68 61 74 67 72 6f 75     read-chatgrou
10c0: 70 73 20 61 6e 6e 6f 75 6e 63 65 2d 6d 65 0a 20  ps announce-me. 
10d0: 20 20 20 6f 3e 0a 20 20 20 20 73 68 6f 77 2d 6e     o>.    show-n
10e0: 69 63 6b 73 20 63 6c 65 61 72 2d 65 64 69 74 20  icks clear-edit 
10f0: 3b 0a 0a 3a 20 70 77 2d 64 6f 6e 65 20 28 20 6d  ;..: pw-done ( m
1100: 61 78 20 73 70 61 6e 20 61 64 64 72 20 70 6f 73  ax span addr pos
1110: 20 2d 2d 20 6d 61 78 20 73 70 61 6e 20 61 64 64   -- max span add
1120: 72 20 70 6f 73 20 66 6c 61 67 20 29 0a 20 20 20  r pos flag ).   
1130: 20 63 61 73 65 20 6e 69 63 6b 2d 70 77 0a 09 31   case nick-pw..1
1140: 20 6f 66 0a 09 20 20 20 20 31 20 2b 74 6f 20 6e   of..    1 +to n
1150: 69 63 6b 2d 70 77 0a 09 20 20 20 20 6f 76 65 72  ick-pw..    over
1160: 20 33 20 70 69 63 6b 20 3e 70 61 73 73 70 68 72   3 pick >passphr
1170: 61 73 65 20 2b 6b 65 79 0a 09 20 20 20 20 70 68  ase +key..    ph
1180: 72 61 73 65 2d 66 69 72 73 74 20 2f 68 66 6c 69  rase-first /hfli
1190: 70 0a 09 20 20 20 20 70 68 72 61 73 65 2d 61 67  p..    phrase-ag
11a0: 61 69 6e 20 2f 66 6c 6f 70 0a 09 20 20 20 20 63  ain /flop..    c
11b0: 6c 65 61 72 2d 65 64 69 74 20 69 6e 76 65 72 74  lear-edit invert
11c0: 20 2b 6c 61 6e 67 0a 09 65 6e 64 6f 66 0a 09 32   +lang..endof..2
11d0: 20 6f 66 0a 09 20 20 20 20 6f 76 65 72 20 33 20   of..    over 3 
11e0: 70 69 63 6b 20 3e 70 61 73 73 70 68 72 61 73 65  pick >passphrase
11f0: 20 6c 61 73 74 6b 65 79 40 20 73 74 72 3d 20 49   lastkey@ str= I
1200: 46 0a 09 09 5c 20 2e 22 20 43 72 65 61 74 65 20  F...\ ." Create 
1210: 6e 69 63 6b 20 22 20 6e 69 63 6b 24 20 24 2e 20  nick " nick$ $. 
1220: 2e 22 20 20 77 69 74 68 20 70 61 73 73 70 68 72  ."  with passphr
1230: 61 73 65 20 28 68 61 73 68 65 64 29 20 22 20 6c  ase (hashed) " l
1240: 61 73 74 6b 65 79 40 20 38 35 74 79 70 65 20 63  astkey@ 85type c
1250: 72 0a 09 09 67 65 6e 2d 6b 65 79 73 2d 64 69 72  r...gen-keys-dir
1260: 20 6e 69 63 6b 24 20 24 40 20 30 20 2e 6e 65 77   nick$ $@ 0 .new
1270: 2d 6b 65 79 2c 0a 09 09 72 69 67 68 74 2d 70 68  -key,...right-ph
1280: 72 61 73 65 0a 09 20 20 20 20 45 4c 53 45 0a 09  rase..    ELSE..
1290: 09 31 20 74 6f 20 6e 69 63 6b 2d 70 77 0a 09 09  .1 to nick-pw...
12a0: 70 68 72 61 73 65 2d 66 69 72 73 74 20 2f 66 6c  phrase-first /fl
12b0: 6f 70 0a 09 09 70 68 72 61 73 65 2d 61 67 61 69  op...phrase-agai
12c0: 6e 20 2f 68 66 6c 69 70 20 2b 6c 61 6e 67 0a 09  n /hflip +lang..
12d0: 09 31 20 74 72 69 65 73 23 20 21 20 64 6f 2d 73  .1 tries# ! do-s
12e0: 68 61 6b 65 0a 09 20 20 20 20 54 48 45 4e 0a 09  hake..    THEN..
12f0: 65 6e 64 6f 66 0a 09 65 72 72 2d 66 61 64 65 3f  endof..err-fade?
1300: 20 49 46 20 20 66 61 6c 73 65 20 20 45 58 49 54   IF  false  EXIT
1310: 20 20 54 48 45 4e 0a 09 64 72 6f 70 20 6f 76 65    THEN..drop ove
1320: 72 20 33 20 70 69 63 6b 20 3e 70 61 73 73 70 68  r 3 pick >passph
1330: 72 61 73 65 20 2b 6b 65 79 0a 09 72 65 61 64 2d  rase +key..read-
1340: 6b 65 79 73 20 73 65 63 72 65 74 2d 6b 65 79 73  keys secret-keys
1350: 23 20 30 3d 20 49 46 0a 09 20 20 20 20 5c 20 2e  # 0= IF..    \ .
1360: 22 20 57 72 6f 6e 67 20 70 61 73 73 70 68 72 61  " Wrong passphra
1370: 73 65 22 20 63 72 0a 09 20 20 20 20 31 20 74 72  se" cr..    1 tr
1380: 69 65 73 23 20 2b 21 20 74 72 69 65 73 23 20 40  ies# +! tries# @
1390: 20 30 20 3c 23 20 23 73 20 23 3e 20 70 77 2d 6e   0 <# #s #> pw-n
13a0: 75 6d 20 3e 6f 20 74 6f 20 74 65 78 74 24 20 6f  um >o to text$ o
13b0: 3e 0a 09 20 20 20 20 64 6f 2d 73 68 61 6b 65 0a  >..    do-shake.
13c0: 09 45 4c 53 45 0a 09 20 20 20 20 72 69 67 68 74  .ELSE..    right
13d0: 2d 70 68 72 61 73 65 0a 09 54 48 45 4e 20 20 30  -phrase..THEN  0
13e0: 0a 20 20 20 20 65 6e 64 63 61 73 65 20 3b 0a 0a  .    endcase ;..
13f0: 3a 20 32 30 25 62 74 20 28 20 6f 20 2d 2d 20 6f  : 20%bt ( o -- o
1400: 20 29 20 3e 6f 20 66 6f 6e 74 2d 73 69 7a 65 23   ) >o font-size#
1410: 20 32 30 25 20 66 2a 20 74 6f 20 62 6f 72 64 65   20% f* to borde
1420: 72 74 20 6f 20 6f 3e 20 3b 0a 3a 20 32 35 25 62  rt o o> ;.: 25%b
1430: 20 28 20 6f 20 2d 2d 20 6f 20 29 20 3e 6f 20 66   ( o -- o ) >o f
1440: 6f 6e 74 2d 73 69 7a 65 23 20 32 35 25 20 66 2a  ont-size# 25% f*
1450: 20 74 6f 20 62 6f 72 64 65 72 20 6f 20 6f 3e 20   to border o o> 
1460: 3b 0a 3a 20 32 35 25 62 76 20 28 20 6f 20 2d 2d  ;.: 25%bv ( o --
1470: 20 6f 20 29 20 3e 6f 20 66 6f 6e 74 2d 73 69 7a   o ) >o font-siz
1480: 65 23 20 32 35 25 20 66 2a 20 66 64 75 70 20 74  e# 25% f* fdup t
1490: 6f 20 62 6f 72 64 65 72 20 66 6e 65 67 61 74 65  o border fnegate
14a0: 20 74 6f 20 62 6f 72 64 65 72 76 20 6f 20 6f 3e   to borderv o o>
14b0: 20 3b 0a 3a 20 34 30 25 62 20 28 20 6f 20 2d 2d   ;.: 40%b ( o --
14c0: 20 6f 20 29 20 3e 6f 20 66 6f 6e 74 2d 73 69 7a   o ) >o font-siz
14d0: 65 23 20 34 30 25 20 66 2a 20 74 6f 20 62 6f 72  e# 40% f* to bor
14e0: 64 65 72 20 6f 20 6f 3e 20 3b 0a 0a 5c 20 70 61  der o o> ;..\ pa
14f0: 73 73 77 6f 72 64 20 66 72 61 6d 65 0a 0a 74 65  ssword frame..te
1500: 78 3a 20 6e 65 74 32 6f 2d 6c 6f 67 6f 0a 0a 24  x: net2o-logo..$
1510: 46 46 30 30 34 30 46 46 20 74 65 78 74 2d 63 6f  FF0040FF text-co
1520: 6c 6f 72 2c 20 46 56 61 6c 75 65 20 70 77 2d 6e  lor, FValue pw-n
1530: 75 6d 2d 63 6f 6c 23 0a 24 36 36 36 36 36 36 46  um-col#.$666666F
1540: 46 20 74 65 78 74 2d 63 6f 6c 6f 72 2c 20 46 56  F text-color, FV
1550: 61 6c 75 65 20 70 77 2d 74 65 78 74 2d 63 6f 6c  alue pw-text-col
1560: 23 0a 24 30 30 30 30 30 30 46 46 20 74 65 78 74  #.$000000FF text
1570: 2d 63 6f 6c 6f 72 2c 20 46 56 61 6c 75 65 20 73  -color, FValue s
1580: 68 6f 77 2d 73 69 67 6e 2d 63 6f 6c 6f 72 23 0a  how-sign-color#.
1590: 24 46 46 43 43 43 43 46 46 20 24 34 34 46 46 34  $FFCCCCFF $44FF4
15a0: 34 46 46 20 66 61 64 65 2d 63 6f 6c 6f 72 2c 20  4FF fade-color, 
15b0: 46 56 61 6c 75 65 20 70 77 2d 62 67 2d 63 6f 6c  FValue pw-bg-col
15c0: 23 0a 24 30 30 30 30 42 46 46 46 20 6e 65 77 2d  #.$0000BFFF new-
15d0: 63 6f 6c 6f 72 2c 20 46 56 61 6c 75 65 20 64 61  color, FValue da
15e0: 72 6b 2d 62 6c 75 65 23 0a 24 30 30 30 30 46 46  rk-blue#.$0000FF
15f0: 30 38 20 6e 65 77 2d 63 6f 6c 6f 72 2c 20 46 56  08 new-color, FV
1600: 61 6c 75 65 20 63 68 62 73 2d 63 6f 6c 23 0a 24  alue chbs-col#.$
1610: 46 46 46 46 46 46 46 46 20 6e 65 77 2d 63 6f 6c  FFFFFFFF new-col
1620: 6f 72 2c 20 46 56 61 6c 75 65 20 6c 6f 67 69 6e  or, FValue login
1630: 2d 62 67 2d 63 6f 6c 23 0a 24 46 46 30 30 30 30  -bg-col#.$FF0000
1640: 30 30 20 24 46 46 30 30 30 30 46 46 20 66 61 64  00 $FF0000FF fad
1650: 65 2d 63 6f 6c 6f 72 2c 20 46 56 61 6c 75 65 20  e-color, FValue 
1660: 70 77 2d 65 72 72 2d 63 6f 6c 23 0a 24 30 30 30  pw-err-col#.$000
1670: 30 30 30 46 46 20 64 75 70 20 74 65 78 74 2d 65  000FF dup text-e
1680: 6d 6f 6a 69 2d 63 6f 6c 6f 72 3a 20 62 6c 61 63  moji-color: blac
1690: 6b 2d 65 6d 6f 6a 69 0a 24 30 30 30 30 30 30 46  k-emoji.$000000F
16a0: 46 20 6e 65 77 2d 63 6f 6c 6f 72 2c 20 46 56 61  F new-color, FVa
16b0: 6c 75 65 20 6f 74 72 2d 63 6f 6c 23 0a 24 46 46  lue otr-col#.$FF
16c0: 46 46 46 46 46 46 20 6e 65 77 2d 63 6f 6c 6f 72  FFFFFF new-color
16d0: 2c 20 46 56 61 6c 75 65 20 63 68 61 74 2d 63 6f  , FValue chat-co
16e0: 6c 23 0a 24 38 30 46 46 46 46 46 46 20 6e 65 77  l#.$80FFFFFF new
16f0: 2d 63 6f 6c 6f 72 2c 20 46 56 61 6c 75 65 20 63  -color, FValue c
1700: 68 61 74 2d 62 67 2d 63 6f 6c 23 0a 24 46 46 46  hat-bg-col#.$FFF
1710: 46 46 46 46 46 20 6e 65 77 2d 63 6f 6c 6f 72 2c  FFFFF new-color,
1720: 20 46 56 61 6c 75 65 20 70 6f 73 74 69 6e 67 2d   FValue posting-
1730: 62 67 2d 63 6f 6c 23 0a 0a 3a 20 65 6e 74 72 6f  bg-col#..: entro
1740: 70 79 2d 63 6f 6c 6f 72 69 7a 65 20 28 20 2d 2d  py-colorize ( --
1750: 20 29 0a 20 20 20 20 70 72 65 76 2d 74 65 78 74   ).    prev-text
1760: 24 20 65 72 61 73 65 20 20 61 64 64 72 20 70 72  $ erase  addr pr
1770: 65 76 2d 74 65 78 74 24 20 24 66 72 65 65 0a 20  ev-text$ $free. 
1780: 20 20 20 65 64 69 74 2d 77 20 2e 74 65 78 74 24     edit-w .text$
1790: 20 70 61 73 73 70 68 72 61 73 65 2d 65 6e 74 72   passphrase-entr
17a0: 6f 70 79 20 31 65 20 66 6d 69 6e 20 70 77 2d 62  opy 1e fmin pw-b
17b0: 67 2d 63 6f 6c 23 20 66 2b 0a 20 20 20 20 70 77  g-col# f+.    pw
17c0: 2d 62 61 63 6b 20 3e 6f 20 74 6f 20 77 2d 63 6f  -back >o to w-co
17d0: 6c 6f 72 20 6f 3e 20 3b 0a 3a 20 73 69 7a 65 2d  lor o> ;.: size-
17e0: 6c 69 6d 69 74 20 28 20 2d 2d 20 29 0a 20 20 20  limit ( -- ).   
17f0: 20 65 64 69 74 2d 77 20 2e 74 65 78 74 24 20 6e   edit-w .text$ n
1800: 69 70 20 23 38 30 30 20 75 3e 20 49 46 0a 09 70  ip #800 u> IF..p
1810: 72 65 76 2d 74 65 78 74 24 20 65 64 69 74 2d 77  rev-text$ edit-w
1820: 20 3e 6f 20 74 6f 20 74 65 78 74 24 20 6f 3e 0a   >o to text$ o>.
1830: 20 20 20 20 54 48 45 4e 20 3b 0a 0a 67 6c 75 65      THEN ;..glue
1840: 20 6e 65 77 20 43 6f 6e 73 74 61 6e 74 20 67 6c   new Constant gl
1850: 75 65 2a 6c 6c 6c c2 b1 0a 67 6c 75 65 2a 6c 6c  ue*lll±.glue*ll
1860: 6c c2 b1 20 3e 6f 20 31 4d 67 6c 75 65 20 66 6e  l± >o 1Mglue fn
1870: 69 70 20 31 30 30 30 65 20 66 73 77 61 70 20 68  ip 1000e fswap h
1880: 67 6c 75 65 2d 63 20 67 6c 75 65 21 20 30 67 6c  glue-c glue! 0gl
1890: 75 65 20 66 6e 69 70 20 31 66 69 6c 6c 6c 20 66  ue fnip 1filll f
18a0: 73 77 61 70 20 64 67 6c 75 65 2d 63 20 67 6c 75  swap dglue-c glu
18b0: 65 21 20 31 67 6c 75 65 20 76 67 6c 75 65 2d 63  e! 1glue vglue-c
18c0: 20 67 6c 75 65 21 20 6f 3e 0a 0a 67 6c 75 65 20   glue! o>..glue 
18d0: 6e 65 77 20 43 6f 6e 73 74 61 6e 74 20 67 6c 75  new Constant glu
18e0: 65 2a 73 68 72 69 6e 6b 0a 67 6c 75 65 2a 73 68  e*shrink.glue*sh
18f0: 72 69 6e 6b 20 3e 6f 20 30 65 20 31 66 69 6c 6c  rink >o 0e 1fill
1900: 6c 20 30 65 20 68 67 6c 75 65 2d 63 20 67 6c 75  l 0e hglue-c glu
1910: 65 21 20 31 67 6c 75 65 20 64 67 6c 75 65 2d 63  e! 1glue dglue-c
1920: 20 67 6c 75 65 21 20 31 67 6c 75 65 20 76 67 6c   glue! 1glue vgl
1930: 75 65 2d 63 20 67 6c 75 65 21 20 6f 3e 0a 0a 27  ue-c glue! o>..'
1940: 20 64 61 72 6b 2d 62 6c 75 65 20 3e 62 6f 64 79   dark-blue >body
1950: 20 66 40 0a 0a 7b 7b 20 6c 6f 67 69 6e 2d 62 67   f@..{{ login-bg
1960: 2d 63 6f 6c 23 20 70 72 65 73 2d 66 72 61 6d 65  -col# pres-frame
1970: 0a 20 20 20 20 64 61 72 6b 2d 62 6c 75 65 23 20  .    dark-blue# 
1980: 27 20 64 61 72 6b 2d 62 6c 75 65 20 3e 62 6f 64  ' dark-blue >bod
1990: 79 20 66 21 0a 20 20 20 20 7b 7b 0a 09 7b 7b 20  y f!.    {{..{{ 
19a0: 67 6c 75 65 2a 6c 6c 6c c2 b1 20 7d 7d 67 6c 75  glue*lll± }}glu
19b0: 65 20 7d 7d 76 0a 09 27 20 6e 65 74 32 6f 2d 6c  e }}v..' net2o-l
19c0: 6f 67 6f 20 22 64 6f 63 2f 6e 65 74 32 6f 2e 70  ogo "doc/net2o.p
19d0: 6e 67 22 20 30 2e 36 36 36 65 20 7d 7d 69 6d 61  ng" 0.666e }}ima
19e0: 67 65 2d 66 69 6c 65 20 43 6f 6e 73 74 61 6e 74  ge-file Constant
19f0: 20 6e 65 74 32 6f 2d 67 6c 75 65 20 2f 63 65 6e   net2o-glue /cen
1a00: 74 65 72 0a 09 21 69 31 38 6e 20 6c 22 20 6e 65  ter..!i18n l" ne
1a10: 74 32 6f 20 47 55 49 22 20 2f 74 69 74 6c 65 0a  t2o GUI" /title.
1a20: 09 21 6c 69 74 0a 09 5c 66 6f 6f 74 6e 6f 74 65  .!lit..\footnote
1a30: 20 63 62 6c 20 64 61 72 6b 2d 62 6c 75 65 20 6e   cbl dark-blue n
1a40: 65 74 32 6f 2d 76 65 72 73 69 6f 6e 20 7d 7d 74  et2o-version }}t
1a50: 65 78 74 20 2f 63 65 6e 74 65 72 0a 09 7b 7b 0a  ext /center..{{.
1a60: 09 20 20 20 20 7b 7b 0a 09 09 67 6c 75 65 2a 6c  .    {{...glue*l
1a70: 6c 20 7d 7d 67 6c 75 65 0a 09 09 62 6c 61 63 6b  l }}glue...black
1a80: 69 73 68 20 5c 6c 61 72 67 65 20 22 f0 9f 91 a4  ish \large "👤
1a90: 22 20 7d 7d 74 65 78 74 20 5c 6e 6f 72 6d 61 6c  " }}text \normal
1aa0: 0a 09 09 7b 7b 0a 09 09 20 20 20 20 67 6c 75 65  ...{{...    glue
1ab0: 2a 6c 20 70 77 2d 62 67 2d 63 6f 6c 23 20 66 6f  *l pw-bg-col# fo
1ac0: 6e 74 2d 73 69 7a 65 23 20 66 32 2f 20 66 32 2f  nt-size# f2/ f2/
1ad0: 20 7d 7d 66 72 61 6d 65 20 64 75 70 20 2e 62 75   }}frame dup .bu
1ae0: 74 74 6f 6e 33 0a 09 09 20 20 20 20 7b 7b 0a 09  tton3...    {{..
1af0: 09 09 6e 74 0a 09 09 09 62 6c 61 63 6b 69 73 68  ..nt....blackish
1b00: 20 5c 62 6f 6c 64 0a 09 09 09 22 6e 69 63 6b 22   \bold...."nick"
1b10: 20 7d 7d 65 64 69 74 20 32 35 25 62 20 64 75 70   }}edit 25%b dup
1b20: 20 74 6f 20 6e 69 63 6b 2d 66 69 65 6c 64 0a 09   to nick-field..
1b30: 09 09 67 6c 75 65 2a 6c 6c 6c 20 7d 7d 67 6c 75  ..glue*lll }}glu
1b40: 65 20 5c 72 65 67 75 6c 61 72 0a 09 09 20 20 20  e \regular...   
1b50: 20 7d 7d 68 20 62 78 2d 74 61 62 20 6e 69 63 6b   }}h bx-tab nick
1b60: 2d 66 69 65 6c 64 20 27 20 6e 69 63 6b 2d 64 6f  -field ' nick-do
1b70: 6e 65 20 65 64 69 74 5b 5d 0a 09 09 7d 7d 7a 20  ne edit[]...}}z 
1b80: 62 6f 78 5b 5d 20 62 6c 61 63 6b 69 73 68 0a 09  box[] blackish..
1b90: 09 7b 7b 20 5c 6c 61 72 67 65 20 22 f0 9f 91 a4  .{{ \large "👤
1ba0: 22 20 7d 7d 74 65 78 74 20 5c 6e 6f 72 6d 61 6c  " }}text \normal
1bb0: 20 7d 7d 68 20 2f 70 68 61 6e 74 6f 6d 0a 09 09   }}h /phantom...
1bc0: 67 6c 75 65 2a 6c 6c 20 7d 7d 67 6c 75 65 0a 09  glue*ll }}glue..
1bd0: 20 20 20 20 7d 7d 68 20 62 6f 78 5b 5d 0a 09 7d      }}h box[]..}
1be0: 7d 76 20 62 6f 78 5b 5d 20 2f 76 66 6c 69 70 20  }v box[] /vflip 
1bf0: 64 75 70 20 74 6f 20 6e 69 63 6b 2d 65 64 69 74  dup to nick-edit
1c00: 0a 09 7b 7b 0a 09 20 20 20 20 67 6c 75 65 2a 6c  ..{{..    glue*l
1c10: 6c 6c 20 7d 7d 67 6c 75 65 0a 09 20 20 20 20 67  ll }}glue..    g
1c20: 6c 75 65 2d 73 6c 65 66 74 20 7d 7d 67 6c 75 65  lue-sleft }}glue
1c30: 0a 09 20 20 20 20 7b 7b 0a 09 09 5c 6c 61 72 67  ..    {{...\larg
1c40: 65 20 5c 73 61 6e 73 20 22 f0 9f 94 90 22 20 7d  e \sans "🔐" }
1c50: 7d 74 65 78 74 0a 09 09 5c 6c 61 72 67 65 20 70  }text...\large p
1c60: 77 2d 6e 75 6d 2d 63 6f 6c 23 20 74 6f 20 78 2d  w-num-col# to x-
1c70: 63 6f 6c 6f 72 20 73 22 20 22 20 7d 7d 74 65 78  color s" " }}tex
1c80: 74 0a 09 09 32 35 25 62 20 64 75 70 20 74 6f 20  t...25%b dup to 
1c90: 70 77 2d 6e 75 6d 20 2f 63 65 6e 74 65 72 0a 09  pw-num /center..
1ca0: 20 20 20 20 7d 7d 7a 0a 09 20 20 20 20 7b 7b 0a      }}z..    {{.
1cb0: 09 09 67 6c 75 65 2a 6c 20 70 77 2d 62 67 2d 63  ..glue*l pw-bg-c
1cc0: 6f 6c 23 20 66 6f 6e 74 2d 73 69 7a 65 23 20 66  ol# font-size# f
1cd0: 32 2f 20 66 32 2f 20 7d 7d 66 72 61 6d 65 20 64  2/ f2/ }}frame d
1ce0: 75 70 20 2e 62 75 74 74 6f 6e 33 0a 09 09 64 75  up .button3...du
1cf0: 70 20 74 6f 20 70 77 2d 62 61 63 6b 0a 09 09 5c  p to pw-back...\
1d00: 6d 6f 6e 6f 20 5c 6e 6f 72 6d 61 6c 0a 09 09 7b  mono \normal...{
1d10: 7b 20 63 68 62 73 2d 63 6f 6c 23 20 74 6f 20 78  { chbs-col# to x
1d20: 2d 63 6f 6c 6f 72 20 22 43 6f 72 72 65 63 74 20  -color "Correct 
1d30: 48 6f 72 73 65 20 42 61 74 74 65 72 79 20 53 74  Horse Battery St
1d40: 61 70 6c 65 22 20 7d 7d 74 65 78 74 20 32 35 25  aple" }}text 25%
1d50: 62 0a 09 09 67 6c 75 65 2a 6c 20 7d 7d 68 0a 09  b...glue*l }}h..
1d60: 09 7b 7b 0a 09 09 20 20 20 20 67 6c 75 65 2d 73  .{{...    glue-s
1d70: 72 69 67 68 74 20 7d 7d 67 6c 75 65 0a 09 09 20  right }}glue... 
1d80: 20 20 20 67 6c 75 65 2a 6c 20 7d 7d 67 6c 75 65     glue*l }}glue
1d90: 20 5c 62 6f 6c 64 0a 09 09 20 20 20 20 6c 22 20   \bold...    l" 
1da0: 77 72 6f 6e 67 20 70 61 73 73 70 68 72 61 73 65  wrong passphrase
1db0: 21 22 20 70 77 2d 65 72 72 2d 63 6f 6c 23 0a 09  !" pw-err-col#..
1dc0: 09 20 20 20 20 74 6f 20 78 2d 63 6f 6c 6f 72 20  .    to x-color 
1dd0: 7d 7d 69 31 38 6e 2d 74 65 78 74 20 5c 72 65 67  }}i18n-text \reg
1de0: 75 6c 61 72 0a 09 09 20 20 20 20 32 35 25 62 20  ular...    25%b 
1df0: 64 75 70 20 74 6f 20 70 77 2d 65 72 72 0a 09 09  dup to pw-err...
1e00: 20 20 20 20 67 6c 75 65 2a 6c 20 7d 7d 67 6c 75      glue*l }}glu
1e10: 65 0a 09 09 20 20 20 20 67 6c 75 65 2d 73 6c 65  e...    glue-sle
1e20: 66 74 20 7d 7d 67 6c 75 65 0a 09 09 7d 7d 68 0a  ft }}glue...}}h.
1e30: 09 09 62 6c 61 63 6b 69 73 68 0a 09 09 7b 7b 0a  ..blackish...{{.
1e40: 09 09 20 20 20 20 7b 7b 0a 09 09 09 70 77 2d 74  ..    {{....pw-t
1e50: 65 78 74 2d 63 6f 6c 23 20 74 6f 20 78 2d 63 6f  ext-col# to x-co
1e60: 6c 6f 72 0a 09 09 09 22 22 20 7d 7d 70 77 20 64  lor...."" }}pw d
1e70: 75 70 20 74 6f 20 70 77 2d 66 69 65 6c 64 0a 09  up to pw-field..
1e80: 09 09 32 35 25 62 20 3e 6f 20 63 6f 6e 66 69 67  ..25%b >o config
1e90: 3a 70 61 73 73 6d 6f 64 65 23 20 40 20 74 6f 20  :passmode# @ to 
1ea0: 70 77 2d 6d 6f 64 65 20 6f 20 6f 3e 0a 09 09 09  pw-mode o o>....
1eb0: 67 6c 75 65 2a 6c 6c 6c 20 7d 7d 67 6c 75 65 0a  glue*lll }}glue.
1ec0: 09 09 20 20 20 20 7d 7d 68 0a 09 09 20 20 20 20  ..    }}h...    
1ed0: 70 77 2d 66 69 65 6c 64 20 27 20 70 77 2d 64 6f  pw-field ' pw-do
1ee0: 6e 65 20 65 64 69 74 5b 5d 20 27 20 65 6e 74 72  ne edit[] ' entr
1ef0: 6f 70 79 2d 63 6f 6c 6f 72 69 7a 65 20 66 69 6c  opy-colorize fil
1f00: 74 65 72 5b 5d 0a 09 09 20 20 20 20 5c 6e 6f 72  ter[]...    \nor
1f10: 6d 61 6c 20 5c 73 61 6e 73 20 77 68 69 74 65 23  mal \sans white#
1f20: 20 74 6f 20 78 2d 63 6f 6c 6f 72 0a 09 09 20 20   to x-color...  
1f30: 20 20 22 ef 81 ae 22 20 7d 7d 74 65 78 74 20 62    "" }}text b
1f40: 6c 61 63 6b 69 73 68 0a 09 09 20 20 20 20 64 75  lackish...    du
1f50: 70 20 76 61 6c 75 65 20 73 68 6f 77 2d 70 77 2d  p value show-pw-
1f60: 73 69 67 6e 0a 09 09 20 20 20 20 5c 72 65 67 75  sign...    \regu
1f70: 6c 61 72 0a 09 09 20 20 20 20 3a 20 70 77 2d 73  lar...    : pw-s
1f80: 68 6f 77 2f 68 69 64 65 20 28 20 66 6c 61 67 20  how/hide ( flag 
1f90: 2d 2d 20 29 0a 09 09 09 64 75 70 20 49 46 20 20  -- )....dup IF  
1fa0: 22 ef 81 b0 22 20 20 45 4c 53 45 20 20 22 ef 81  ""  ELSE  "
1fb0: ae 22 20 20 54 48 45 4e 20 20 73 68 6f 77 2d 70  "  THEN  show-p
1fc0: 77 2d 73 69 67 6e 20 3e 6f 20 74 6f 20 74 65 78  w-sign >o to tex
1fd0: 74 24 20 6f 3e 0a 09 09 09 32 20 63 6f 6e 66 69  t$ o>....2 confi
1fe0: 67 3a 70 61 73 73 6d 6f 64 65 23 20 40 20 31 20  g:passmode# @ 1 
1ff0: 6d 69 6e 20 72 6f 74 20 73 65 6c 65 63 74 20 70  min rot select p
2000: 77 2d 66 69 65 6c 64 20 3e 6f 20 74 6f 20 70 77  w-field >o to pw
2010: 2d 6d 6f 64 65 20 6f 3e 0a 09 09 09 70 77 2d 66  -mode o>....pw-f
2020: 69 65 6c 64 20 65 6e 67 61 67 65 20 2b 73 79 6e  ield engage +syn
2030: 63 20 3b 0a 09 09 20 20 20 20 27 20 70 77 2d 73  c ;...    ' pw-s
2040: 68 6f 77 2f 68 69 64 65 20 63 6f 6e 66 69 67 3a  how/hide config:
2050: 70 61 73 73 6d 6f 64 65 23 20 40 20 31 20 3e 20  passmode# @ 1 > 
2060: 74 6f 67 67 6c 65 5b 5d 0a 09 09 20 20 20 20 5c  toggle[]...    \
2070: 6e 6f 72 6d 61 6c 0a 09 09 7d 7d 68 20 62 6f 78  normal...}}h box
2080: 5b 5d 0a 09 20 20 20 20 7d 7d 7a 20 62 6f 78 5b  []..    }}z box[
2090: 5d 20 62 78 2d 74 61 62 0a 09 20 20 20 20 7b 7b  ] bx-tab..    {{
20a0: 0a 09 09 5c 6c 61 72 67 65 0a 09 09 22 f0 9f 94  ...\large..."
20b0: b4 22 20 7d 7d 74 65 78 74 20 5c 6e 6f 72 6d 61  " }}text \norma
20c0: 6c 20 20 3e 6f 20 66 6f 6e 74 2d 73 69 7a 65 23  l  >o font-size#
20d0: 20 31 30 25 20 66 2a 20 74 6f 20 72 61 69 73 65   10% f* to raise
20e0: 20 6f 20 6f 3e 0a 09 09 22 e2 9e 95 22 20 7d 7d   o o>..."➕" }}
20f0: 74 65 78 74 20 2f 63 65 6e 74 65 72 20 64 75 70  text /center dup
2100: 20 74 6f 20 70 6c 75 73 2d 6c 6f 67 69 6e 0a 09   to plus-login..
2110: 09 22 e2 9e 96 22 20 7d 7d 74 65 78 74 20 2f 63  ."➖" }}text /c
2120: 65 6e 74 65 72 20 64 75 70 20 74 6f 20 6d 69 6e  enter dup to min
2130: 75 73 2d 6c 6f 67 69 6e 20 2f 76 66 6c 69 70 0a  us-login /vflip.
2140: 09 09 5c 6c 61 72 67 65 0a 09 09 3a 20 69 64 2d  ..\large...: id-
2150: 73 68 6f 77 2d 68 69 64 65 20 28 20 66 6c 61 67  show-hide ( flag
2160: 20 2d 2d 20 29 0a 09 09 20 20 20 20 49 46 0a 09   -- )...    IF..
2170: 09 09 70 68 72 61 73 65 2d 75 6e 6c 6f 63 6b 20  ..phrase-unlock 
2180: 2f 68 66 6c 69 70 0a 09 09 09 63 72 65 61 74 65  /hflip....create
2190: 2d 6e 65 77 2d 69 64 20 2f 66 6c 6f 70 0a 09 09  -new-id /flop...
21a0: 09 70 68 72 61 73 65 2d 66 69 72 73 74 20 2f 68  .phrase-first /h
21b0: 66 6c 69 70 0a 09 09 09 70 68 72 61 73 65 2d 61  flip....phrase-a
21c0: 67 61 69 6e 20 2f 68 66 6c 69 70 0a 09 09 09 70  gain /hflip....p
21d0: 6c 75 73 2d 6c 6f 67 69 6e 20 2f 66 6c 69 70 0a  lus-login /flip.
21e0: 09 09 09 6d 69 6e 75 73 2d 6c 6f 67 69 6e 20 2f  ...minus-login /
21f0: 66 6c 6f 70 0a 09 09 09 6e 69 63 6b 2d 65 64 69  flop....nick-edi
2200: 74 20 2f 66 6c 6f 70 0a 09 09 09 5b 20 78 2d 62  t /flop....[ x-b
2210: 61 73 65 6c 69 6e 65 20 5d 20 46 4c 69 74 65 72  aseline ] FLiter
2220: 61 6c 20 6e 69 63 6b 2d 65 64 69 74 20 3e 6f 0a  al nick-edit >o.
2230: 09 09 09 66 64 75 70 20 67 61 70 25 20 66 2a 20  ...fdup gap% f* 
2240: 74 6f 20 67 61 70 20 74 6f 20 62 61 73 65 6c 69  to gap to baseli
2250: 6e 65 20 6f 3e 0a 09 09 09 22 6e 69 63 6b 22 20  ne o>...."nick" 
2260: 6e 69 63 6b 2d 66 69 65 6c 64 20 65 6e 67 61 67  nick-field engag
2270: 65 2d 65 64 69 74 0a 09 09 20 20 20 20 45 4c 53  e-edit...    ELS
2280: 45 0a 09 09 09 70 68 72 61 73 65 2d 75 6e 6c 6f  E....phrase-unlo
2290: 63 6b 20 2f 66 6c 6f 70 0a 09 09 09 63 72 65 61  ck /flop....crea
22a0: 74 65 2d 6e 65 77 2d 69 64 20 2f 68 66 6c 69 70  te-new-id /hflip
22b0: 0a 09 09 09 70 68 72 61 73 65 2d 66 69 72 73 74  ....phrase-first
22c0: 20 2f 68 66 6c 69 70 0a 09 09 09 70 68 72 61 73   /hflip....phras
22d0: 65 2d 61 67 61 69 6e 20 2f 68 66 6c 69 70 0a 09  e-again /hflip..
22e0: 09 09 70 6c 75 73 2d 6c 6f 67 69 6e 20 2f 66 6c  ..plus-login /fl
22f0: 6f 70 0a 09 09 09 6d 69 6e 75 73 2d 6c 6f 67 69  op....minus-logi
2300: 6e 20 2f 66 6c 69 70 0a 09 09 09 6e 69 63 6b 2d  n /flip....nick-
2310: 65 64 69 74 20 2f 76 66 6c 69 70 0a 09 09 09 30  edit /vflip....0
2320: 65 20 6e 69 63 6b 2d 65 64 69 74 20 3e 6f 20 74  e nick-edit >o t
2330: 6f 20 62 61 73 65 6c 69 6e 65 20 6f 3e 0a 09 09  o baseline o>...
2340: 09 70 77 2d 66 69 65 6c 64 20 65 6e 67 61 67 65  .pw-field engage
2350: 0a 09 09 20 20 20 20 54 48 45 4e 20 2b 72 65 73  ...    THEN +res
2360: 69 7a 65 20 2b 6c 61 6e 67 20 3b 0a 09 09 5c 6e  ize +lang ;...\n
2370: 6f 72 6d 61 6c 0a 09 20 20 20 20 7d 7d 7a 20 27  ormal..    }}z '
2380: 20 69 64 2d 73 68 6f 77 2d 68 69 64 65 20 66 61   id-show-hide fa
2390: 6c 73 65 20 74 6f 67 67 6c 65 5b 5d 20 64 75 70  lse toggle[] dup
23a0: 20 56 61 6c 75 65 20 69 64 2d 74 6f 67 67 6c 65   Value id-toggle
23b0: 72 0a 09 20 20 20 20 67 6c 75 65 2d 73 72 69 67  r..    glue-srig
23c0: 68 74 20 7d 7d 67 6c 75 65 0a 09 20 20 20 20 67  ht }}glue..    g
23d0: 6c 75 65 2a 6c 6c 6c 20 7d 7d 67 6c 75 65 0a 09  lue*lll }}glue..
23e0: 7d 7d 68 20 62 6f 78 5b 5d 20 5c 73 6b 69 70 20  }}h box[] \skip 
23f0: 3e 62 6c 0a 09 5c 20 41 64 76 69 63 65 73 2c 20  >bl..\ Advices, 
2400: 63 6f 6e 74 65 78 74 20 73 65 6e 73 69 74 69 76  context sensitiv
2410: 65 0a 09 7b 7b 20 20 5c 73 6d 61 6c 6c 20 64 61  e..{{  \small da
2420: 72 6b 2d 62 6c 75 65 20 21 69 31 38 6e 0a 09 20  rk-blue !i18n.. 
2430: 20 20 20 6c 22 20 45 6e 74 65 72 20 70 61 73 73     l" Enter pass
2440: 70 68 72 61 73 65 20 74 6f 20 75 6e 6c 6f 63 6b  phrase to unlock
2450: 22 20 7d 7d 74 65 78 74 27 20 2f 63 65 6e 74 65  " }}text' /cente
2460: 72 20 64 75 70 20 74 6f 20 70 68 72 61 73 65 2d  r dup to phrase-
2470: 75 6e 6c 6f 63 6b 0a 09 20 20 20 20 6c 22 20 43  unlock..    l" C
2480: 72 65 61 74 65 20 6e 65 77 20 49 44 22 20 7d 7d  reate new ID" }}
2490: 74 65 78 74 27 20 2f 63 65 6e 74 65 72 20 64 75  text' /center du
24a0: 70 20 74 6f 20 63 72 65 61 74 65 2d 6e 65 77 2d  p to create-new-
24b0: 69 64 20 2f 68 66 6c 69 70 0a 09 20 20 20 20 6c  id /hflip..    l
24c0: 22 20 45 6e 74 65 72 20 6e 65 77 20 70 61 73 73  " Enter new pass
24d0: 70 68 72 61 73 65 22 20 7d 7d 74 65 78 74 27 20  phrase" }}text' 
24e0: 2f 63 65 6e 74 65 72 20 64 75 70 20 74 6f 20 70  /center dup to p
24f0: 68 72 61 73 65 2d 66 69 72 73 74 20 2f 68 66 6c  hrase-first /hfl
2500: 69 70 0a 09 20 20 20 20 6c 22 20 45 6e 74 65 72  ip..    l" Enter
2510: 20 6e 65 77 20 70 61 73 73 70 68 72 61 73 65 20   new passphrase 
2520: 61 67 61 69 6e 22 20 7d 7d 74 65 78 74 27 20 2f  again" }}text' /
2530: 63 65 6e 74 65 72 20 64 75 70 20 74 6f 20 70 68  center dup to ph
2540: 72 61 73 65 2d 61 67 61 69 6e 20 2f 68 66 6c 69  rase-again /hfli
2550: 70 0a 09 20 20 20 20 21 6c 69 74 0a 09 7d 7d 7a  p..    !lit..}}z
2560: 20 62 6f 78 5b 5d 20 2f 63 65 6e 74 65 72 20 3e   box[] /center >
2570: 62 6c 0a 09 7b 7b 20 67 6c 75 65 2a 6c 6c 6c 20  bl..{{ glue*lll 
2580: 7d 7d 67 6c 75 65 20 7d 7d 76 0a 20 20 20 20 7d  }}glue }}v.    }
2590: 7d 76 20 62 6f 78 5b 5d 0a 7d 7d 7a 20 62 6f 78  }v box[].}}z box
25a0: 5b 5d 20 74 6f 20 70 77 2d 66 72 61 6d 65 0a 0a  [] to pw-frame..
25b0: 27 20 64 61 72 6b 2d 62 6c 75 65 20 3e 62 6f 64  ' dark-blue >bod
25c0: 79 20 66 21 0a 0a 5c 20 69 64 20 66 72 61 6d 65  y f!..\ id frame
25d0: 0a 0a 30 20 56 61 6c 75 65 20 6d 79 6b 65 79 2d  ..0 Value mykey-
25e0: 62 6f 78 0a 30 20 56 61 6c 75 65 20 67 72 6f 75  box.0 Value grou
25f0: 70 73 2d 62 6f 78 0a 30 20 56 61 6c 75 65 20 6e  ps-box.0 Value n
2600: 69 63 6b 73 2d 62 6f 78 0a 30 20 56 61 6c 75 65  icks-box.0 Value
2610: 20 6d 73 67 73 2d 62 6f 78 0a 30 20 56 61 6c 75   msgs-box.0 Valu
2620: 65 20 6d 73 67 2d 62 6f 78 0a 30 20 56 61 6c 75  e msg-box.0 Valu
2630: 65 20 6d 73 67 2d 70 61 72 0a 30 20 56 61 6c 75  e msg-par.0 Valu
2640: 65 20 6d 73 67 2d 76 62 6f 78 0a 0a 30 20 56 61  e msg-vbox..0 Va
2650: 6c 75 65 20 67 72 6f 75 70 2d 6e 61 6d 65 0a 30  lue group-name.0
2660: 20 56 61 6c 75 65 20 67 72 6f 75 70 2d 6d 65 6d   Value group-mem
2670: 62 65 72 73 0a 0a 6e 65 77 2d 68 74 61 62 20 74  bers..new-htab t
2680: 61 62 2d 67 6c 75 65 3a 20 6e 61 6d 65 2d 74 61  ab-glue: name-ta
2690: 62 0a 6e 65 77 2d 68 74 61 62 20 74 61 62 2d 67  b.new-htab tab-g
26a0: 6c 75 65 3a 20 70 6b 2d 74 61 62 0a 6e 65 77 2d  lue: pk-tab.new-
26b0: 68 74 61 62 20 74 61 62 2d 67 6c 75 65 3a 20 67  htab tab-glue: g
26c0: 72 6f 75 70 2d 74 61 62 0a 6e 65 77 2d 68 74 61  roup-tab.new-hta
26d0: 62 20 74 61 62 2d 67 6c 75 65 3a 20 63 68 61 74  b tab-glue: chat
26e0: 6e 61 6d 65 2d 74 61 62 0a 0a 5b 49 46 55 4e 44  name-tab..[IFUND
26f0: 45 46 5d 20 63 68 69 6c 64 2b 0a 20 20 20 20 3a  EF] child+.    :
2700: 20 63 68 69 6c 64 2b 20 28 20 6f 20 2d 2d 20 29   child+ ( o -- )
2710: 20 6f 20 6f 76 65 72 20 3e 6f 20 74 6f 20 70 61   o over >o to pa
2720: 72 65 6e 74 2d 77 20 6f 3e 20 63 68 69 6c 64 73  rent-w o> childs
2730: 5b 5d 20 3e 73 74 61 63 6b 20 3b 0a 5b 54 48 45  [] >stack ;.[THE
2740: 4e 5d 0a 0a 43 72 65 61 74 65 20 6b 65 2d 69 6d  N]..Create ke-im
2750: 70 6f 72 74 73 23 72 67 62 0a 0a 43 72 65 61 74  ports#rgb..Creat
2760: 65 20 69 6d 70 6f 72 74 73 23 72 67 62 2d 62 67  e imports#rgb-bg
2770: 0a 24 33 33 45 45 33 33 46 46 20 6e 65 77 2d 63  .$33EE33FF new-c
2780: 6f 6c 6f 72 2c 20 73 66 2c 20 5c 20 6d 79 73 65  olor, sf, \ myse
2790: 6c 66 20 69 73 20 70 72 65 74 74 79 20 67 72 65  lf is pretty gre
27a0: 65 6e 0a 24 42 42 44 44 36 36 46 46 20 6e 65 77  en.$BBDD66FF new
27b0: 2d 63 6f 6c 6f 72 2c 20 73 66 2c 20 5c 20 6d 61  -color, sf, \ ma
27c0: 6e 75 61 6c 6c 79 20 69 6d 70 6f 72 74 65 64 20  nually imported 
27d0: 69 73 20 67 72 65 65 6e 2c 20 74 6f 6f 0a 24 35  is green, too.$5
27e0: 35 44 44 35 35 46 46 20 6e 65 77 2d 63 6f 6c 6f  5DD55FF new-colo
27f0: 72 2c 20 73 66 2c 20 5c 20 73 63 61 6e 6e 65 64  r, sf, \ scanned
2800: 20 69 73 20 6d 6f 72 65 20 67 72 65 65 6e 0a 24   is more green.$
2810: 43 43 45 45 35 35 46 46 20 6e 65 77 2d 63 6f 6c  CCEE55FF new-col
2820: 6f 72 2c 20 73 66 2c 20 5c 20 73 65 65 6e 20 69  or, sf, \ seen i
2830: 6e 20 63 68 61 74 20 69 73 20 6d 6f 72 65 20 79  n chat is more y
2840: 65 6c 6c 6f 77 0a 24 45 45 43 43 35 35 46 46 20  ellow.$EECC55FF 
2850: 6e 65 77 2d 63 6f 6c 6f 72 2c 20 73 66 2c 20 5c  new-color, sf, \
2860: 20 69 6d 70 6f 72 74 65 64 20 66 72 6f 6d 20 44   imported from D
2870: 48 54 20 69 73 20 70 72 65 74 74 79 20 79 65 6c  HT is pretty yel
2880: 6c 6f 77 0a 24 46 46 38 38 34 34 46 46 20 6e 65  low.$FF8844FF ne
2890: 77 2d 63 6f 6c 6f 72 2c 20 73 66 2c 20 5c 20 69  w-color, sf, \ i
28a0: 6e 76 69 74 65 64 20 69 73 20 76 65 72 79 20 79  nvited is very y
28b0: 65 6c 6c 6f 77 0a 24 46 46 36 36 30 30 46 46 20  ellow.$FF6600FF 
28c0: 6e 65 77 2d 63 6f 6c 6f 72 2c 20 73 66 2c 20 5c  new-color, sf, \
28d0: 20 70 72 6f 76 69 73 69 6f 6e 61 6c 20 69 73 20   provisional is 
28e0: 76 65 72 79 20 6f 72 61 6e 67 65 0a 24 46 46 30  very orange.$FF0
28f0: 30 30 30 46 46 20 6e 65 77 2d 63 6f 6c 6f 72 2c  000FF new-color,
2900: 20 73 66 2c 20 5c 20 75 6e 74 72 75 73 74 65 64   sf, \ untrusted
2910: 20 69 73 20 6c 61 73 74 0a 43 72 65 61 74 65 20   is last.Create 
2920: 69 6d 70 6f 72 74 73 23 72 67 62 2d 66 67 0a 24  imports#rgb-fg.$
2930: 30 30 33 33 30 30 46 46 20 74 65 78 74 2d 63 6f  003300FF text-co
2940: 6c 6f 72 2c 20 73 66 2c 0a 24 30 30 30 30 30 30  lor, sf,.$000000
2950: 46 46 20 74 65 78 74 2d 63 6f 6c 6f 72 2c 20 73  FF text-color, s
2960: 66 2c 0a 24 30 30 30 30 30 30 46 46 20 74 65 78  f,.$000000FF tex
2970: 74 2d 63 6f 6c 6f 72 2c 20 73 66 2c 0a 24 30 30  t-color, sf,.$00
2980: 30 30 30 30 46 46 20 74 65 78 74 2d 63 6f 6c 6f  0000FF text-colo
2990: 72 2c 20 73 66 2c 0a 24 30 30 30 30 46 46 46 46  r, sf,.$0000FFFF
29a0: 20 74 65 78 74 2d 63 6f 6c 6f 72 2c 20 73 66 2c   text-color, sf,
29b0: 0a 24 30 30 30 30 46 46 46 46 20 74 65 78 74 2d  .$0000FFFF text-
29c0: 63 6f 6c 6f 72 2c 20 73 66 2c 0a 24 30 30 30 30  color, sf,.$0000
29d0: 46 46 46 46 20 74 65 78 74 2d 63 6f 6c 6f 72 2c  FFFF text-color,
29e0: 20 73 66 2c 0a 24 30 30 46 46 46 46 46 46 20 74   sf,.$00FFFFFF t
29f0: 65 78 74 2d 63 6f 6c 6f 72 2c 20 73 66 2c 0a 0a  ext-color, sf,..
2a00: 5c 20 6d 6f 72 65 20 63 6f 6c 6f 72 73 0a 0a 24  \ more colors..$
2a10: 38 38 46 46 38 38 46 46 20 6e 65 77 2d 63 6f 6c  88FF88FF new-col
2a20: 6f 72 3a 20 6d 79 2d 73 69 67 6e 61 6c 0a 24 43  or: my-signal.$C
2a30: 43 46 46 43 43 46 46 20 6e 65 77 2d 63 6f 6c 6f  CFFCCFF new-colo
2a40: 72 3a 20 6f 74 68 65 72 2d 73 69 67 6e 61 6c 0a  r: other-signal.
2a50: 24 43 43 30 30 43 43 46 46 20 6e 65 77 2d 63 6f  $CC00CCFF new-co
2a60: 6c 6f 72 3a 20 6d 79 2d 73 69 67 6e 61 6c 2d 6f  lor: my-signal-o
2a70: 74 72 0a 24 38 38 30 30 38 38 46 46 20 6e 65 77  tr.$880088FF new
2a80: 2d 63 6f 6c 6f 72 3a 20 6f 74 68 65 72 2d 73 69  -color: other-si
2a90: 67 6e 61 6c 2d 6f 74 72 0a 24 34 34 34 34 43 43  gnal-otr.$4444CC
2aa0: 46 46 20 74 65 78 74 2d 63 6f 6c 6f 72 3a 20 6c  FF text-color: l
2ab0: 69 6e 6b 2d 62 6c 75 65 0a 24 34 34 43 43 34 34  ink-blue.$44CC44
2ac0: 46 46 20 74 65 78 74 2d 63 6f 6c 6f 72 3a 20 72  FF text-color: r
2ad0: 65 2d 67 72 65 65 6e 0a 24 43 43 34 34 34 34 46  e-green.$CC4444F
2ae0: 46 20 74 65 78 74 2d 63 6f 6c 6f 72 3a 20 6f 62  F text-color: ob
2af0: 6a 2d 72 65 64 0a 24 30 30 42 46 46 46 46 46 20  j-red.$00BFFFFF 
2b00: 74 65 78 74 2d 63 6f 6c 6f 72 3a 20 6c 69 67 68  text-color: ligh
2b10: 74 2d 62 6c 75 65 0a 24 34 34 46 46 34 34 46 46  t-blue.$44FF44FF
2b20: 20 74 65 78 74 2d 63 6f 6c 6f 72 3a 20 67 72 65   text-color: gre
2b30: 65 6e 69 73 68 0a 24 33 33 38 38 33 33 36 36 20  enish.$33883366 
2b40: 6e 65 77 2d 63 6f 6c 6f 72 3a 20 64 61 79 2d 63  new-color: day-c
2b50: 6f 6c 6f 72 0a 24 38 38 33 33 33 33 36 36 20 6e  olor.$88333366 n
2b60: 65 77 2d 63 6f 6c 6f 72 3a 20 68 6f 75 72 2d 63  ew-color: hour-c
2b70: 6f 6c 6f 72 0a 24 46 46 46 46 46 46 46 46 20 74  olor.$FFFFFFFF t
2b80: 65 78 74 2d 63 6f 6c 6f 72 3a 20 72 65 61 6c 77  ext-color: realw
2b90: 68 69 74 65 0a 24 46 46 46 46 46 46 46 46 20 6e  hite.$FFFFFFFF n
2ba0: 65 77 2d 63 6f 6c 6f 72 3a 20 65 64 69 74 2d 62  ew-color: edit-b
2bb0: 67 0a 24 38 30 46 46 38 30 46 46 20 6e 65 77 2d  g.$80FF80FF new-
2bc0: 63 6f 6c 6f 72 3a 20 73 65 6e 64 2d 63 6f 6c 6f  color: send-colo
2bd0: 72 0a 24 30 30 46 46 30 30 32 30 20 6e 65 77 2d  r.$00FF0020 new-
2be0: 63 6f 6c 6f 72 3a 20 70 65 74 2d 63 6f 6c 6f 72  color: pet-color
2bf0: 0a 24 46 46 46 46 38 30 46 46 20 6e 65 77 2d 63  .$FFFF80FF new-c
2c00: 6f 6c 6f 72 2c 20 66 76 61 6c 75 65 20 75 73 65  olor, fvalue use
2c10: 72 73 2d 63 6f 6c 6f 72 23 0a 0a 3a 20 6e 69 63  rs-color#..: nic
2c20: 6b 5b 5d 20 28 20 62 6f 78 20 6f 3a 6e 69 63 6b  k[] ( box o:nick
2c30: 20 2d 2d 20 62 6f 78 20 29 0a 20 20 20 20 5b 3a   -- box ).    [:
2c40: 20 64 61 74 61 20 3e 6f 20 2e 22 20 63 6c 69 63   data >o ." clic
2c50: 6b 65 64 20 6f 6e 20 22 20 6b 65 2d 6e 69 63 6b  ked on " ke-nick
2c60: 20 24 2e 20 63 72 20 6f 3e 20 3b 5d 20 6f 20 63   $. cr o> ;] o c
2c70: 6c 69 63 6b 5b 5d 20 3b 0a 0a 48 61 73 68 3a 20  lick[] ;..Hash: 
2c80: 61 76 61 74 61 72 23 0a 0a 67 6c 75 65 20 6e 65  avatar#..glue ne
2c90: 77 20 43 6f 6e 73 74 61 6e 74 20 67 6c 75 65 2a  w Constant glue*
2ca0: 61 76 61 74 61 72 0a 67 6c 75 65 2a 61 76 61 74  avatar.glue*avat
2cb0: 61 72 20 3e 6f 20 70 69 78 65 6c 73 69 7a 65 23  ar >o pixelsize#
2cc0: 20 36 34 20 66 6d 2a 20 30 65 20 30 67 20 67 6c   64 fm* 0e 0g gl
2cd0: 75 65 2d 64 75 70 20 68 67 6c 75 65 2d 63 20 67  ue-dup hglue-c g
2ce0: 6c 75 65 21 20 76 67 6c 75 65 2d 63 20 67 6c 75  lue! vglue-c glu
2cf0: 65 21 20 30 67 6c 75 65 20 64 67 6c 75 65 2d 63  e! 0glue dglue-c
2d00: 20 67 6c 75 65 21 20 6f 3e 0a 0a 3a 20 72 65 61   glue! o>..: rea
2d10: 64 2d 61 76 61 74 61 72 20 28 20 61 64 64 72 20  d-avatar ( addr 
2d20: 75 20 2d 2d 20 61 64 64 72 27 20 75 27 20 29 0a  u -- addr' u' ).
2d30: 20 20 20 20 3f 72 65 61 64 2d 65 6e 63 2d 68 61      ?read-enc-ha
2d40: 73 68 65 64 20 6d 65 6d 3e 74 68 75 6d 62 20 61  shed mem>thumb a
2d50: 74 6c 61 73 2d 72 65 67 69 6f 6e 20 3b 0a 3a 20  tlas-region ;.: 
2d60: 73 68 6f 77 2d 61 76 61 74 61 72 20 28 20 61 64  show-avatar ( ad
2d70: 64 72 20 75 20 2d 2d 20 6f 20 29 0a 20 20 20 20  dr u -- o ).    
2d80: 32 64 75 70 20 61 76 61 74 61 72 23 20 23 40 20  2dup avatar# #@ 
2d90: 6e 69 70 20 30 3d 20 49 46 0a 09 32 64 75 70 20  nip 0= IF..2dup 
2da0: 72 65 61 64 2d 61 76 61 74 61 72 20 32 73 77 61  read-avatar 2swa
2db0: 70 20 61 76 61 74 61 72 23 20 23 21 0a 20 20 20  p avatar# #!.   
2dc0: 20 45 4c 53 45 20 20 32 64 72 6f 70 20 20 54 48   ELSE  2drop  TH
2dd0: 45 4e 0a 20 20 20 20 67 6c 75 65 2a 61 76 61 74  EN.    glue*avat
2de0: 61 72 20 6c 61 73 74 23 20 63 65 6c 6c 2b 20 24  ar last# cell+ $
2df0: 40 20 64 72 6f 70 20 7d 7d 74 68 75 6d 62 0a 20  @ drop }}thumb. 
2e00: 20 20 20 3e 72 20 7b 7b 20 72 3e 20 7d 7d 76 20     >r {{ r> }}v 
2e10: 34 30 25 62 20 3b 0a 0a 3a 20 72 65 2d 61 76 61  40%b ;..: re-ava
2e20: 74 61 72 20 28 20 6c 61 73 74 23 20 2d 2d 20 29  tar ( last# -- )
2e30: 0a 20 20 20 20 3e 72 20 72 40 20 24 40 20 72 65  .    >r r@ $@ re
2e40: 61 64 2d 61 76 61 74 61 72 20 72 3e 20 63 65 6c  ad-avatar r> cel
2e50: 6c 2b 20 24 40 20 73 6d 6f 76 65 20 3b 0a 0a 3a  l+ $@ smove ;..:
2e60: 6e 6f 6e 61 6d 65 20 64 65 66 65 72 73 20 66 72  noname defers fr
2e70: 65 65 2d 74 68 75 6d 62 73 0a 20 20 20 20 61 76  ee-thumbs.    av
2e80: 61 74 61 72 23 20 5b 27 5d 20 72 65 2d 61 76 61  atar# ['] re-ava
2e90: 74 61 72 20 23 6d 61 70 20 3b 20 69 73 20 66 72  tar #map ; is fr
2ea0: 65 65 2d 74 68 75 6d 62 73 0a 0a 3a 20 3f 61 76  ee-thumbs..: ?av
2eb0: 61 74 61 72 20 28 20 61 64 64 72 20 75 20 2d 2d  atar ( addr u --
2ec0: 20 6f 20 2f 20 29 0a 20 20 20 20 6b 65 79 23 20   o / ).    key# 
2ed0: 23 40 20 49 46 0a 09 63 65 6c 6c 2b 20 2e 6b 65  #@ IF..cell+ .ke
2ee0: 2d 61 76 61 74 61 72 20 24 40 20 64 75 70 20 49  -avatar $@ dup I
2ef0: 46 0a 09 20 20 20 20 73 68 6f 77 2d 61 76 61 74  F..    show-avat
2f00: 61 72 0a 09 45 4c 53 45 20 20 32 64 72 6f 70 20  ar..ELSE  2drop 
2f10: 20 54 48 45 4e 0a 20 20 20 20 45 4c 53 45 20 20   THEN.    ELSE  
2f20: 64 72 6f 70 20 20 54 48 45 4e 20 3b 0a 0a 3a 20  drop  THEN ;..: 
2f30: 73 68 6f 77 2d 6e 69 63 6b 20 28 20 6f 3a 6b 65  show-nick ( o:ke
2f40: 79 20 2d 2d 20 29 0a 20 20 20 20 6b 65 2d 69 6d  y -- ).    ke-im
2f50: 70 6f 72 74 73 20 40 20 5b 20 31 20 69 6d 70 6f  ports @ [ 1 impo
2f60: 72 74 23 70 72 6f 76 69 73 69 6f 6e 61 6c 20 6c  rt#provisional l
2f70: 73 68 69 66 74 20 5d 4c 20 61 6e 64 20 3f 45 58  shift ]L and ?EX
2f80: 49 54 0a 20 20 20 20 6b 65 2d 69 6d 70 6f 72 74  IT.    ke-import
2f90: 73 20 40 20 3e 69 6d 2d 63 6f 6c 6f 72 23 20 73  s @ >im-color# s
2fa0: 66 6c 6f 61 74 73 20 7b 20 6b 69 20 7d 0a 20 20  floats { ki }.  
2fb0: 20 20 7b 7b 20 67 6c 75 65 2a 6c 20 69 6d 70 6f    {{ glue*l impo
2fc0: 72 74 73 23 72 67 62 2d 62 67 20 6b 69 20 2b 20  rts#rgb-bg ki + 
2fd0: 73 66 40 20 73 6c 69 64 65 2d 66 72 61 6d 65 20  sf@ slide-frame 
2fe0: 64 75 70 20 2e 62 75 74 74 6f 6e 31 0a 09 7b 7b  dup .button1..{{
2ff0: 0a 09 20 20 20 20 7b 7b 20 5c 6c 61 72 67 65 20  ..    {{ \large 
3000: 69 6d 70 6f 72 74 73 23 72 67 62 2d 66 67 20 6b  imports#rgb-fg k
3010: 69 20 2b 20 73 66 40 20 74 6f 20 78 2d 63 6f 6c  i + sf@ to x-col
3020: 6f 72 0a 09 09 6b 65 2d 61 76 61 74 61 72 20 24  or...ke-avatar $
3030: 40 20 64 75 70 20 49 46 20 20 73 68 6f 77 2d 61  @ dup IF  show-a
3040: 76 61 74 61 72 20 20 45 4c 53 45 20 20 32 64 72  vatar  ELSE  2dr
3050: 6f 70 20 20 54 48 45 4e 0a 09 09 6b 65 2d 73 6b  op  THEN...ke-sk
3060: 20 73 65 63 40 20 6e 69 70 20 49 46 20 20 5c 62   sec@ nip IF  \b
3070: 6f 6c 64 20 20 45 4c 53 45 20 20 5c 72 65 67 75  old  ELSE  \regu
3080: 6c 61 72 20 20 54 48 45 4e 20 20 5c 73 61 6e 73  lar  THEN  \sans
3090: 0a 09 09 5b 27 5d 20 2e 6e 69 63 6b 2d 62 61 73  ...['] .nick-bas
30a0: 65 20 24 74 6d 70 20 7d 7d 74 65 78 74 20 32 35  e $tmp }}text 25
30b0: 25 62 0a 09 09 6b 65 2d 70 65 74 73 5b 5d 20 24  %b...ke-pets[] $
30c0: 5b 5d 23 20 49 46 0a 09 09 20 20 20 20 7b 7b 0a  []# IF...    {{.
30d0: 09 09 09 78 2d 63 6f 6c 6f 72 20 67 6c 75 65 2a  ...x-color glue*
30e0: 6c 20 70 65 74 2d 63 6f 6c 6f 72 20 78 2d 63 6f  l pet-color x-co
30f0: 6c 6f 72 20 73 6c 69 64 65 2d 66 72 61 6d 65 20  lor slide-frame 
3100: 64 75 70 20 2e 62 75 74 74 6f 6e 33 20 74 6f 20  dup .button3 to 
3110: 78 2d 63 6f 6c 6f 72 0a 09 09 09 5b 27 5d 20 2e  x-color....['] .
3120: 70 65 74 2d 62 61 73 65 20 24 74 6d 70 20 7d 7d  pet-base $tmp }}
3130: 74 65 78 74 20 32 35 25 62 0a 09 09 20 20 20 20  text 25%b...    
3140: 7d 7d 7a 0a 09 09 54 48 45 4e 0a 09 20 20 20 20  }}z...THEN..    
3150: 67 6c 75 65 2a 6c 20 7d 7d 67 6c 75 65 20 7d 7d  glue*l }}glue }}
3160: 68 20 6e 61 6d 65 2d 74 61 62 0a 09 20 20 20 20  h name-tab..    
3170: 7b 7b 0a 09 09 7b 7b 20 5c 73 61 6e 73 20 5c 73  {{...{{ \sans \s
3180: 63 72 69 70 74 20 6b 65 2d 73 65 6c 66 73 69 67  cript ke-selfsig
3190: 20 24 40 20 5b 27 5d 20 2e 73 69 67 64 61 74 65   $@ ['] .sigdate
31a0: 73 20 24 74 6d 70 20 7d 7d 74 65 78 74 20 67 6c  s $tmp }}text gl
31b0: 75 65 2a 6c 20 7d 7d 67 6c 75 65 20 7d 7d 68 0a  ue*l }}glue }}h.
31c0: 09 09 7b 7b 20 5c 6d 6f 6e 6f 20 5c 73 63 72 69  ..{{ \mono \scri
31d0: 70 74 20 6b 65 2d 70 6b 20 24 40 20 6b 65 79 7c  pt ke-pk $@ key|
31e0: 20 5b 27 5d 20 38 35 74 79 70 65 20 24 74 6d 70   ['] 85type $tmp
31f0: 20 7d 7d 74 65 78 74 20 32 30 25 62 74 20 67 6c   }}text 20%bt gl
3200: 75 65 2a 6c 20 7d 7d 67 6c 75 65 20 7d 7d 68 20  ue*l }}glue }}h 
3210: 73 77 61 70 0a 09 20 20 20 20 7d 7d 76 20 70 6b  swap..    }}v pk
3220: 2d 74 61 62 0a 09 67 6c 75 65 2a 6c 6c 6c 20 7d  -tab..glue*lll }
3230: 7d 67 6c 75 65 20 7d 7d 68 0a 20 20 20 20 7d 7d  }glue }}h.    }}
3240: 7a 20 6e 69 63 6b 5b 5d 20 20 5c 72 65 67 75 6c  z nick[]  \regul
3250: 61 72 0a 20 20 20 20 6d 79 6b 65 79 2d 62 6f 78  ar.    mykey-box
3260: 20 6e 69 63 6b 73 2d 62 6f 78 20 6b 65 2d 73 6b   nicks-box ke-sk
3270: 20 73 65 63 40 20 6e 69 70 20 73 65 6c 65 63 74   sec@ nip select
3280: 20 2f 66 6c 6f 70 20 2e 63 68 69 6c 64 2b 20 3b   /flop .child+ ;
3290: 0a 0a 3a 20 66 69 6c 6c 2d 6e 69 63 6b 73 20 28  ..: fill-nicks (
32a0: 20 2d 2d 20 29 0a 20 20 20 20 6b 65 79 73 3e 73   -- ).    keys>s
32b0: 6f 72 74 5b 5d 0a 20 20 20 20 6b 65 79 2d 6c 69  ort[].    key-li
32c0: 73 74 5b 5d 20 24 40 20 62 6f 75 6e 64 73 20 3f  st[] $@ bounds ?
32d0: 44 4f 0a 09 49 20 40 20 2e 73 68 6f 77 2d 6e 69  DO..I @ .show-ni
32e0: 63 6b 0a 20 20 20 20 63 65 6c 6c 20 2b 4c 4f 4f  ck.    cell +LOO
32f0: 50 20 3b 0a 0a 3a 20 72 65 66 72 65 73 68 2d 74  P ;..: refresh-t
3300: 6f 70 20 28 20 2d 2d 20 29 0a 20 20 20 20 2b 73  op ( -- ).    +s
3310: 79 6e 63 20 2b 6c 61 6e 67 0a 20 20 20 20 74 6f  ync +lang.    to
3320: 70 2d 77 69 64 67 65 74 20 3e 6f 20 68 74 6f 70  p-widget >o htop
3330: 2d 72 65 73 69 7a 65 20 20 3c 64 72 61 77 2d 69  -resize  <draw-i
3340: 6e 69 74 20 64 72 61 77 2d 69 6e 69 74 20 64 72  nit draw-init dr
3350: 61 77 2d 69 6e 69 74 3e 20 68 74 6f 70 2d 72 65  aw-init> htop-re
3360: 73 69 7a 65 0a 20 20 20 20 66 61 6c 73 65 20 74  size.    false t
3370: 6f 20 67 72 61 62 2d 6d 6f 76 65 3f 20 6f 3e 20  o grab-move? o> 
3380: 3b 0a 0a 3a 20 73 68 6f 77 2d 63 6f 6e 6e 65 63  ;..: show-connec
3390: 74 65 64 20 28 20 2d 2d 20 29 20 6d 61 69 6e 2d  ted ( -- ) main-
33a0: 75 70 40 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2e  up@ connection .
33b0: 77 61 69 74 2d 74 61 73 6b 20 21 20 3b 0a 0a 3a  wait-task ! ;..:
33c0: 20 67 75 69 2d 63 68 61 74 2d 63 6f 6e 6e 65 63   gui-chat-connec
33d0: 74 73 20 28 20 2d 2d 20 29 0a 20 20 20 20 5b 3a  ts ( -- ).    [:
33e0: 20 75 70 40 20 77 61 69 74 2d 74 61 73 6b 20 21   up@ wait-task !
33f0: 20 3b 5d 20 49 53 20 64 6f 2d 63 6f 6e 6e 65 63   ;] IS do-connec
3400: 74 0a 20 20 20 20 5b 3a 20 63 68 61 74 2d 6b 65  t.    [: chat-ke
3410: 79 73 20 5b 3a 0a 09 20 20 20 20 32 64 75 70 20  ys [:..    2dup 
3420: 73 65 61 72 63 68 2d 63 6f 6e 6e 65 63 74 20 3f  search-connect ?
3430: 64 75 70 2d 49 46 20 20 3e 6f 20 2b 67 72 6f 75  dup-IF  >o +grou
3440: 70 20 67 72 65 65 74 20 6f 3e 20 32 64 72 6f 70  p greet o> 2drop
3450: 20 20 45 58 49 54 20 20 54 48 45 4e 0a 09 20 20    EXIT  THEN..  
3460: 20 20 32 64 75 70 20 70 6b 2d 70 65 65 6b 3f 20    2dup pk-peek? 
3470: 49 46 20 20 63 68 61 74 2d 63 6f 6e 6e 65 63 74  IF  chat-connect
3480: 20 74 72 75 65 20 21 21 63 6f 6e 6e 65 63 74 65   true !!connecte
3490: 64 21 21 0a 09 20 20 20 20 45 4c 53 45 20 20 32  d!!..    ELSE  2
34a0: 64 72 6f 70 20 20 54 48 45 4e 20 3b 5d 20 24 5b  drop  THEN ;] $[
34b0: 5d 6d 61 70 20 3b 5d 20 63 61 74 63 68 0a 20 20  ]map ;] catch.  
34c0: 20 20 5b 20 27 20 21 21 63 6f 6e 6e 65 63 74 65    [ ' !!connecte
34d0: 64 21 21 20 3e 62 6f 64 79 20 40 20 5d 4c 20 3d  d!! >body @ ]L =
34e0: 20 49 46 20 20 73 68 6f 77 2d 63 6f 6e 6e 65 63   IF  show-connec
34f0: 74 65 64 20 20 54 48 45 4e 20 3b 0a 0a 65 76 65  ted  THEN ;..eve
3500: 6e 74 3a 20 3a 3e 21 63 6f 6e 6e 65 63 74 69 6f  nt: :>!connectio
3510: 6e 20 20 20 20 74 6f 20 63 6f 6e 6e 65 63 74 69  n    to connecti
3520: 6f 6e 20 3b 0a 65 76 65 6e 74 3a 20 3a 3e 63 68  on ;.event: :>ch
3530: 61 74 2d 63 6f 6e 6e 65 63 74 73 20 20 67 75 69  at-connects  gui
3540: 2d 63 68 61 74 2d 63 6f 6e 6e 65 63 74 73 0a 20  -chat-connects. 
3550: 20 20 20 3c 65 76 65 6e 74 20 63 6f 6e 6e 65 63     <event connec
3560: 74 69 6f 6e 20 64 75 70 20 65 6c 69 74 2c 20 3a  tion dup elit, :
3570: 3e 21 63 6f 6e 6e 65 63 74 69 6f 6e 20 2e 77 61  >!connection .wa
3580: 69 74 2d 74 61 73 6b 20 40 20 65 76 65 6e 74 3e  it-task @ event>
3590: 20 3b 0a 0a 66 61 6c 73 65 20 56 61 6c 75 65 20   ;..false Value 
35a0: 69 6e 2d 67 72 6f 75 70 3f 0a 0a 3a 20 67 72 6f  in-group?..: gro
35b0: 75 70 5b 5d 20 28 20 62 6f 78 20 67 72 6f 75 70  up[] ( box group
35c0: 20 2d 2d 20 62 6f 78 20 29 0a 20 20 20 20 5b 3a   -- box ).    [:
35d0: 20 20 69 6e 2d 67 72 6f 75 70 3f 20 3f 45 58 49    in-group? ?EXI
35e0: 54 20 20 74 72 75 65 20 74 6f 20 69 6e 2d 67 72  T  true to in-gr
35f0: 6f 75 70 3f 0a 09 64 61 74 61 20 24 40 20 67 72  oup?..data $@ gr
3600: 6f 75 70 2d 6e 61 6d 65 20 3e 6f 20 74 6f 20 74  oup-name >o to t
3610: 65 78 74 24 20 6f 3e 0a 09 64 61 74 61 20 63 65  ext$ o>..data ce
3620: 6c 6c 2b 20 24 40 20 64 72 6f 70 20 63 65 6c 6c  ll+ $@ drop cell
3630: 2b 20 3e 6f 20 67 72 6f 75 70 73 3a 69 64 24 20  + >o groups:id$ 
3640: 67 72 6f 75 70 73 3a 6d 65 6d 62 65 72 5b 5d 20  groups:member[] 
3650: 6f 3e 0a 09 5b 3a 20 63 68 61 74 2d 6b 65 79 73  o>..[: chat-keys
3660: 20 24 2b 5b 5d 21 20 3b 5d 20 24 5b 5d 6d 61 70   $+[]! ;] $[]map
3670: 0a 09 67 75 69 2d 6d 73 67 73 20 20 3c 65 76 65  ..gui-msgs  <eve
3680: 6e 74 20 3a 3e 63 68 61 74 2d 63 6f 6e 6e 65 63  nt :>chat-connec
3690: 74 73 20 3f 71 75 65 72 79 2d 74 61 73 6b 20 65  ts ?query-task e
36a0: 76 65 6e 74 3e 0a 09 6e 65 78 74 2d 73 6c 69 64  vent>..next-slid
36b0: 65 0a 20 20 20 20 3b 5d 20 73 77 61 70 20 63 6c  e.    ;] swap cl
36c0: 69 63 6b 5b 5d 20 3b 0a 0a 3a 20 73 68 6f 77 2d  ick[] ;..: show-
36d0: 67 72 6f 75 70 20 28 20 6c 61 73 74 23 20 2d 2d  group ( last# --
36e0: 20 29 0a 20 20 20 20 64 75 70 20 7b 20 67 20 2d   ).    dup { g -
36f0: 2d 20 7d 20 63 65 6c 6c 2b 20 24 40 20 64 72 6f  - } cell+ $@ dro
3700: 70 20 63 65 6c 6c 2b 20 3e 6f 0a 20 20 20 20 7b  p cell+ >o.    {
3710: 7b 20 67 6c 75 65 2a 6c 20 63 68 61 74 2d 62 67  { glue*l chat-bg
3720: 2d 63 6f 6c 23 20 73 6c 69 64 65 2d 66 72 61 6d  -col# slide-fram
3730: 65 20 64 75 70 20 2e 62 75 74 74 6f 6e 31 0a 09  e dup .button1..
3740: 7b 7b 0a 09 20 20 20 20 7b 7b 20 5c 6c 61 72 67  {{..    {{ \larg
3750: 65 20 62 6c 61 63 6b 69 73 68 0a 09 09 5c 72 65  e blackish...\re
3760: 67 75 6c 61 72 20 5c 73 61 6e 73 20 67 20 24 40  gular \sans g $@
3770: 20 7d 7d 74 65 78 74 20 32 35 25 62 0a 09 20 20   }}text 25%b..  
3780: 20 20 67 6c 75 65 2a 6c 20 7d 7d 67 6c 75 65 20    glue*l }}glue 
3790: 7d 7d 68 20 6e 61 6d 65 2d 74 61 62 0a 09 20 20  }}h name-tab..  
37a0: 20 20 7b 7b 0a 09 09 7b 7b 0a 09 09 20 20 20 20    {{...{{...    
37b0: 5c 6d 6f 6e 6f 20 5c 62 6f 6c 64 20 5c 73 63 72  \mono \bold \scr
37c0: 69 70 74 20 67 72 6f 75 70 73 3a 69 64 24 0a 09  ipt groups:id$..
37d0: 09 20 20 20 20 32 64 75 70 20 67 20 24 40 20 73  .    2dup g $@ s
37e0: 74 72 3d 20 30 3d 20 49 46 20 20 6b 65 79 7c 20  tr= 0= IF  key| 
37f0: 5b 27 5d 20 38 35 74 79 70 65 20 24 74 6d 70 20  ['] 85type $tmp 
3800: 20 54 48 45 4e 0a 09 09 7d 7d 74 65 78 74 20 32   THEN...}}text 2
3810: 30 25 62 74 20 67 6c 75 65 2a 6c 20 7d 7d 67 6c  0%bt glue*l }}gl
3820: 75 65 20 7d 7d 68 0a 09 09 67 6c 75 65 2a 6c 20  ue }}h...glue*l 
3830: 7d 7d 67 6c 75 65 0a 09 20 20 20 20 7d 7d 76 20  }}glue..    }}v 
3840: 70 6b 2d 74 61 62 0a 09 67 6c 75 65 2a 6c 6c 6c  pk-tab..glue*lll
3850: 20 7d 7d 67 6c 75 65 20 7d 7d 68 0a 20 20 20 20   }}glue }}h.    
3860: 7d 7d 7a 20 67 20 67 72 6f 75 70 5b 5d 20 6f 3e  }}z g group[] o>
3870: 0a 20 20 20 20 67 72 6f 75 70 73 2d 62 6f 78 20  .    groups-box 
3880: 2f 66 6c 6f 70 20 2e 63 68 69 6c 64 2b 20 3b 0a  /flop .child+ ;.
3890: 0a 3a 20 66 69 6c 6c 2d 67 72 6f 75 70 73 20 28  .: fill-groups (
38a0: 20 2d 2d 20 29 0a 20 20 20 20 67 72 6f 75 70 73   -- ).    groups
38b0: 3e 73 6f 72 74 5b 5d 0a 20 20 20 20 67 72 6f 75  >sort[].    grou
38c0: 70 2d 6c 69 73 74 5b 5d 20 24 40 20 62 6f 75 6e  p-list[] $@ boun
38d0: 64 73 20 3f 44 4f 0a 09 49 20 40 20 73 68 6f 77  ds ?DO..I @ show
38e0: 2d 67 72 6f 75 70 0a 20 20 20 20 63 65 6c 6c 20  -group.    cell 
38f0: 2b 4c 4f 4f 50 20 3b 0a 0a 61 6c 73 6f 20 5b 69  +LOOP ;..also [i
3900: 66 64 65 66 5d 20 61 6e 64 72 6f 69 64 20 61 6e  fdef] android an
3910: 64 72 6f 69 64 20 5b 74 68 65 6e 5d 0a 0a 74 65  droid [then]..te
3920: 78 3a 20 76 70 2d 74 69 74 6c 65 0a 0a 24 46 31  x: vp-title..$F1
3930: 31 30 20 43 6f 6e 73 74 61 6e 74 20 27 73 70 69  10 Constant 'spi
3940: 6e 6e 65 72 27 0a 24 46 30 31 32 20 43 6f 6e 73  nner'.$F012 Cons
3950: 74 61 6e 74 20 27 73 69 67 6e 61 6c 27 0a 24 46  tant 'signal'.$F
3960: 32 33 34 20 43 6f 6e 73 74 61 6e 74 20 27 75 73  234 Constant 'us
3970: 65 72 2d 70 6c 75 73 27 0a 24 46 35 30 33 20 43  er-plus'.$F503 C
3980: 6f 6e 73 74 61 6e 74 20 27 75 73 65 72 2d 6d 69  onstant 'user-mi
3990: 6e 75 73 27 0a 24 46 32 33 35 20 43 6f 6e 73 74  nus'.$F235 Const
39a0: 61 6e 74 20 27 75 73 65 72 2d 74 69 6d 65 73 27  ant 'user-times'
39b0: 0a 0a 30 20 56 61 6c 75 65 20 6f 6e 6c 69 6e 65  ..0 Value online
39c0: 2d 66 6c 61 67 0a 0a 3a 20 6f 6e 6c 69 6e 65 2d  -flag..: online-
39d0: 73 79 6d 62 6f 6c 20 28 20 2d 2d 20 61 64 64 72  symbol ( -- addr
39e0: 20 75 20 29 0a 20 20 20 20 27 73 69 67 6e 61 6c   u ).    'signal
39f0: 27 20 27 73 70 69 6e 6e 65 72 27 20 6f 6e 6c 69  ' 'spinner' onli
3a00: 6e 65 3f 20 73 65 6c 65 63 74 20 5b 27 5d 20 78  ne? select ['] x
3a10: 65 6d 69 74 20 24 74 6d 70 20 3b 0a 3a 20 21 6f  emit $tmp ;.: !o
3a20: 6e 6c 69 6e 65 2d 73 79 6d 62 6f 6c 20 28 20 2d  nline-symbol ( -
3a30: 2d 20 29 0a 20 20 20 20 6f 6e 6c 69 6e 65 2d 73  - ).    online-s
3a40: 79 6d 62 6f 6c 20 6f 6e 6c 69 6e 65 2d 66 6c 61  ymbol online-fla
3a50: 67 20 3e 6f 20 74 6f 20 74 65 78 74 24 20 6f 3e  g >o to text$ o>
3a60: 20 2b 73 79 6e 63 20 3b 0a 3a 6e 6f 6e 61 6d 65   +sync ;.:noname
3a70: 20 20 74 72 75 65 20 74 6f 20 6f 6e 6c 69 6e 65    true to online
3a80: 3f 20 5b 27 5d 20 61 6e 6e 6f 75 6e 63 65 2d 6d  ? ['] announce-m
3a90: 65 20 63 61 74 63 68 20 30 3d 20 74 6f 20 6f 6e  e catch 0= to on
3aa0: 6c 69 6e 65 3f 0a 20 20 20 20 21 6f 6e 6c 69 6e  line?.    !onlin
3ab0: 65 2d 73 79 6d 62 6f 6c 20 3b 20 69 73 20 61 64  e-symbol ; is ad
3ac0: 64 72 2d 63 68 61 6e 67 65 64 0a 0a 3a 20 6e 69  dr-changed..: ni
3ad0: 63 6b 73 2d 74 69 74 6c 65 20 28 20 2d 2d 20 29  cks-title ( -- )
3ae0: 0a 20 20 20 20 7b 7b 20 67 6c 75 65 2a 6c 20 62  .    {{ glue*l b
3af0: 6c 61 63 6b 23 20 73 6c 69 64 65 2d 66 72 61 6d  lack# slide-fram
3b00: 65 20 64 75 70 20 2e 62 75 74 74 6f 6e 31 0a 09  e dup .button1..
3b10: 7b 7b 0a 09 20 20 20 20 7b 7b 0a 09 09 7b 7b 0a  {{..    {{...{{.
3b20: 09 09 20 20 20 20 7b 7b 20 5c 6c 61 72 67 65 20  ..    {{ \large 
3b30: 5c 62 6f 6c 64 20 5c 73 61 6e 73 20 72 65 61 6c  \bold \sans real
3b40: 77 68 69 74 65 0a 09 09 20 20 20 20 6c 22 20 4e  white...    l" N
3b50: 69 63 6b 2b 50 65 74 22 20 7d 7d 69 31 38 6e 2d  ick+Pet" }}i18n-
3b60: 74 65 78 74 20 32 35 25 62 20 67 6c 75 65 2a 6c  text 25%b glue*l
3b70: 20 7d 7d 67 6c 75 65 20 7d 7d 68 20 6e 61 6d 65   }}glue }}h name
3b80: 2d 74 61 62 0a 09 09 20 20 20 20 7b 7b 0a 09 09  -tab...    {{...
3b90: 09 7b 7b 20 5c 73 63 72 69 70 74 20 5c 6d 6f 6e  .{{ \script \mon
3ba0: 6f 20 5c 62 6f 6c 64 20 6c 22 20 50 75 62 6b 65  o \bold l" Pubke
3bb0: 79 22 20 20 20 7d 7d 69 31 38 6e 2d 74 65 78 74  y"   }}i18n-text
3bc0: 20 32 30 25 62 74 20 67 6c 75 65 2a 6c 20 7d 7d   20%bt glue*l }}
3bd0: 67 6c 75 65 20 7d 7d 68 0a 09 09 09 7b 7b 20 5c  glue }}h....{{ \
3be0: 73 63 72 69 70 74 20 5c 73 61 6e 73 20 5c 62 6f  script \sans \bo
3bf0: 6c 64 20 6c 22 20 4b 65 79 20 64 61 74 65 22 20  ld l" Key date" 
3c00: 7d 7d 69 31 38 6e 2d 74 65 78 74 20 67 6c 75 65  }}i18n-text glue
3c10: 2a 6c 20 7d 7d 67 6c 75 65 20 7d 7d 68 0a 09 09  *l }}glue }}h...
3c20: 20 20 20 20 7d 7d 76 20 70 6b 2d 74 61 62 0a 09      }}v pk-tab..
3c30: 09 20 20 20 20 67 6c 75 65 2a 6c 6c 6c c2 b1 20  .    glue*lll± 
3c40: 7d 7d 67 6c 75 65 0a 09 09 7d 7d 68 20 62 6f 78  }}glue...}}h box
3c50: 5b 5d 0a 09 20 20 20 20 76 70 2d 74 69 74 6c 65  []..    vp-title
3c60: 20 67 6c 75 65 2a 6c 6c 6c 20 5b 27 5d 20 76 70   glue*lll ['] vp
3c70: 2d 74 69 74 6c 65 20 7d 7d 76 70 20 76 70 5b 5d  -title }}vp vp[]
3c80: 20 64 75 70 20 74 6f 20 74 69 74 6c 65 2d 76 70   dup to title-vp
3c90: 0a 09 7d 7d 68 20 62 6f 78 5b 5d 0a 20 20 20 20  ..}}h box[].    
3ca0: 7d 7d 7a 20 62 6f 78 5b 5d 20 3b 0a 0a 70 72 65  }}z box[] ;..pre
3cb0: 76 69 6f 75 73 0a 0a 7b 7b 20 75 73 65 72 73 2d  vious..{{ users-
3cc0: 63 6f 6c 6f 72 23 20 70 72 65 73 2d 66 72 61 6d  color# pres-fram
3cd0: 65 0a 20 20 20 20 7b 7b 0a 09 7b 7b 0a 09 20 20  e.    {{..{{..  
3ce0: 20 20 6e 69 63 6b 73 2d 74 69 74 6c 65 0a 09 20    nicks-title.. 
3cf0: 20 20 20 67 6c 75 65 2a 73 68 72 69 6e 6b 20 7d     glue*shrink }
3d00: 7d 67 6c 75 65 0a 09 20 20 20 20 5c 4c 61 72 67  }glue..    \Larg
3d10: 65 0a 09 20 20 20 20 73 22 20 e2 9d 8c 22 20 24  e..    s" ❌" $
3d20: 34 34 34 34 34 34 46 46 20 6e 65 77 2d 63 6f 6c  444444FF new-col
3d30: 6f 72 2c 20 7d 7d 62 75 74 74 6f 6e 2d 6c 69 74  or, }}button-lit
3d40: 20 2f 68 66 69 78 20 5b 3a 20 2d 31 20 64 61 74   /hfix [: -1 dat
3d50: 61 20 2b 21 20 3b 5d 0a 09 20 20 20 20 5b 49 46  a +! ;]..    [IF
3d60: 44 45 46 5d 20 61 6e 64 72 6f 69 64 20 61 6e 64  DEF] android and
3d70: 72 6f 69 64 3a 6c 65 76 65 6c 23 20 5b 45 4c 53  roid:level# [ELS
3d80: 45 5d 20 6c 65 76 65 6c 23 20 5b 54 48 45 4e 5d  E] level# [THEN]
3d90: 20 63 6c 69 63 6b 5b 5d 0a 09 7d 7d 68 20 62 6f   click[]..}}h bo
3da0: 78 5b 5d 20 2f 76 66 69 78 0a 09 7b 7b 0a 09 20  x[] /vfix..{{.. 
3db0: 20 20 20 7b 7b 0a 09 09 7b 7b 20 67 6c 75 65 2a     {{...{{ glue*
3dc0: 6c 20 24 33 30 33 30 30 30 46 46 20 6e 65 77 2d  l $303000FF new-
3dd0: 63 6f 6c 6f 72 2c 20 62 61 72 2d 66 72 61 6d 65  color, bar-frame
3de0: 0a 09 09 7b 7b 20 5c 73 63 72 69 70 74 20 6c 22  ...{{ \script l"
3df0: 20 4d 79 20 6b 65 79 22 20 7d 7d 69 31 38 6e 2d   My key" }}i18n-
3e00: 74 65 78 74 20 32 35 25 62 20 67 6c 75 65 2a 6c  text 25%b glue*l
3e10: 20 7d 7d 67 6c 75 65 20 7d 7d 68 20 7d 7d 7a 0a   }}glue }}h }}z.
3e20: 09 09 7b 7b 20 7d 7d 76 20 62 6f 78 5b 5d 20 64  ..{{ }}v box[] d
3e30: 75 70 20 74 6f 20 6d 79 6b 65 79 2d 62 6f 78 0a  up to mykey-box.
3e40: 09 09 7b 7b 20 67 6c 75 65 2a 6c 20 24 33 30 30  ..{{ glue*l $300
3e50: 30 33 30 46 46 20 6e 65 77 2d 63 6f 6c 6f 72 2c  030FF new-color,
3e60: 20 62 61 72 2d 66 72 61 6d 65 0a 09 09 7b 7b 20   bar-frame...{{ 
3e70: 5c 73 63 72 69 70 74 20 6c 22 20 4d 79 20 67 72  \script l" My gr
3e80: 6f 75 70 73 22 20 7d 7d 69 31 38 6e 2d 74 65 78  oups" }}i18n-tex
3e90: 74 20 32 35 25 62 20 67 6c 75 65 2a 6c 20 7d 7d  t 25%b glue*l }}
3ea0: 67 6c 75 65 20 7d 7d 68 20 7d 7d 7a 0a 09 09 7b  glue }}h }}z...{
3eb0: 7b 20 7d 7d 76 20 62 6f 78 5b 5d 20 64 75 70 20  { }}v box[] dup 
3ec0: 74 6f 20 67 72 6f 75 70 73 2d 62 6f 78 20 2f 76  to groups-box /v
3ed0: 66 6c 69 70 0a 09 09 7b 7b 20 67 6c 75 65 2a 6c  flip...{{ glue*l
3ee0: 20 24 30 30 33 30 33 30 46 46 20 6e 65 77 2d 63   $003030FF new-c
3ef0: 6f 6c 6f 72 2c 20 62 61 72 2d 66 72 61 6d 65 0a  olor, bar-frame.
3f00: 09 09 7b 7b 20 5c 73 63 72 69 70 74 20 6c 22 20  ..{{ \script l" 
3f10: 4d 79 20 70 65 65 72 73 22 20 7d 7d 69 31 38 6e  My peers" }}i18n
3f20: 2d 74 65 78 74 20 32 35 25 62 20 67 6c 75 65 2a  -text 25%b glue*
3f30: 6c 20 7d 7d 67 6c 75 65 20 7d 7d 68 20 7d 7d 7a  l }}glue }}h }}z
3f40: 0a 09 09 7b 7b 20 7d 7d 76 20 62 6f 78 5b 5d 20  ...{{ }}v box[] 
3f50: 64 75 70 20 74 6f 20 6e 69 63 6b 73 2d 62 6f 78  dup to nicks-box
3f60: 20 2f 76 66 6c 69 70 0a 09 09 67 6c 75 65 2a 6c   /vflip...glue*l
3f70: 6c 6c 20 7d 7d 67 6c 75 65 0a 09 20 20 20 20 74  ll }}glue..    t
3f80: 65 78 3a 20 76 70 2d 6e 69 63 6b 73 20 76 70 2d  ex: vp-nicks vp-
3f90: 6e 69 63 6b 73 20 67 6c 75 65 2a 6c 6c 6c 20 27  nicks glue*lll '
3fa0: 20 76 70 2d 6e 69 63 6b 73 20 7d 7d 76 70 20 76   vp-nicks }}vp v
3fb0: 70 5b 5d 20 64 75 70 20 76 61 6c 75 65 20 70 65  p[] dup value pe
3fc0: 65 72 73 2d 62 6f 78 0a 09 20 20 20 20 24 34 34  ers-box..    $44
3fd0: 34 34 34 34 46 46 20 6e 65 77 2d 63 6f 6c 6f 72  4444FF new-color
3fe0: 2c 20 74 6f 20 73 6c 69 64 65 72 2d 63 6f 6c 6f  , to slider-colo
3ff0: 72 0a 09 20 20 20 20 24 43 43 43 43 43 43 46 46  r..    $CCCCCCFF
4000: 20 6e 65 77 2d 63 6f 6c 6f 72 2c 20 74 6f 20 73   new-color, to s
4010: 6c 69 64 65 72 2d 66 67 63 6f 6c 6f 72 0a 09 20  lider-fgcolor.. 
4020: 20 20 20 66 6f 6e 74 2d 73 69 7a 65 23 20 33 33     font-size# 33
4030: 25 20 66 2a 20 74 6f 20 73 6c 69 64 65 72 2d 62  % f* to slider-b
4040: 6f 72 64 65 72 0a 09 64 75 70 20 66 6f 6e 74 2d  order..dup font-
4050: 73 69 7a 65 23 20 36 36 25 20 66 2a 20 66 64 75  size# 66% f* fdu
4060: 70 20 76 73 6c 69 64 65 72 20 7d 7d 68 20 62 6f  p vslider }}h bo
4070: 78 5b 5d 0a 20 20 20 20 7d 7d 76 20 62 6f 78 5b  x[].    }}v box[
4080: 5d 0a 7d 7d 7a 20 62 6f 78 5b 5d 20 74 6f 20 69  ].}}z box[] to i
4090: 64 2d 66 72 61 6d 65 0a 0a 3a 20 73 68 6f 77 2d  d-frame..: show-
40a0: 6e 69 63 6b 73 20 28 20 2d 2d 20 29 0a 20 20 20  nicks ( -- ).   
40b0: 20 66 69 6c 6c 2d 6e 69 63 6b 73 20 66 69 6c 6c   fill-nicks fill
40c0: 2d 67 72 6f 75 70 73 20 21 6f 6e 6c 69 6e 65 2d  -groups !online-
40d0: 73 79 6d 62 6f 6c 0a 20 20 20 20 6e 65 78 74 2d  symbol.    next-
40e0: 73 6c 69 64 65 0a 20 20 20 20 70 65 65 72 73 2d  slide.    peers-
40f0: 62 6f 78 20 30 2e 30 31 65 20 5b 3a 20 2e 76 70  box 0.01e [: .vp
4100: 2d 74 6f 70 20 66 64 72 6f 70 20 74 69 74 6c 65  -top fdrop title
4110: 2d 76 70 20 2e 76 70 2d 74 6f 70 20 2b 73 79 6e  -vp .vp-top +syn
4120: 63 20 2b 72 65 73 69 7a 65 20 3b 5d 20 3e 61 6e  c +resize ;] >an
4130: 69 6d 61 74 65 20 3b 0a 0a 5c 20 6d 65 73 73 61  imate ;..\ messa
4140: 67 65 73 0a 0a 6d 73 67 2d 63 6c 61 73 73 20 63  ges..msg-class c
4150: 6c 61 73 73 0a 65 6e 64 2d 63 6c 61 73 73 20 77  lass.end-class w
4160: 6d 73 67 2d 63 6c 61 73 73 0a 0a 56 61 72 69 61  msg-class..Varia
4170: 62 6c 65 20 6c 61 73 74 2d 62 75 62 62 6c 65 2d  ble last-bubble-
4180: 70 6b 0a 30 20 56 61 6c 75 65 20 6c 61 73 74 2d  pk.0 Value last-
4190: 6f 74 72 3f 0a 30 20 56 61 6c 75 65 20 6c 61 73  otr?.0 Value las
41a0: 74 2d 62 75 62 62 6c 65 0a 36 34 23 30 20 36 34  t-bubble.64#0 64
41b0: 56 61 6c 75 65 20 6c 61 73 74 2d 74 69 63 6b 0a  Value last-tick.
41c0: 23 33 30 30 20 23 31 30 30 30 30 30 30 30 30 30  #300 #1000000000
41d0: 20 75 6d 2a 20 64 3e 36 34 20 36 34 43 6f 6e 73   um* d>64 64Cons
41e0: 74 61 6e 74 20 64 65 6c 74 61 2d 62 75 62 62 6c  tant delta-bubbl
41f0: 65 0a 0a 3a 20 3e 62 75 62 62 6c 65 2d 62 6f 72  e..: >bubble-bor
4200: 64 65 72 20 28 20 6f 20 6d 65 3f 20 2d 2d 20 29  der ( o me? -- )
4210: 0a 20 20 20 20 73 77 61 70 20 3e 6f 20 66 6f 6e  .    swap >o fon
4220: 74 2d 73 69 7a 65 23 20 32 35 25 20 66 2a 0a 20  t-size# 25% f*. 
4230: 20 20 20 49 46 0a 09 66 64 75 70 20 66 32 2a 20     IF..fdup f2* 
4240: 74 6f 20 62 6f 72 64 65 72 0a 09 66 6e 65 67 61  to border..fnega
4250: 74 65 20 66 64 75 70 20 74 6f 20 62 6f 72 64 65  te fdup to borde
4260: 72 6c 20 66 64 75 70 20 74 6f 20 62 6f 72 64 65  rl fdup to borde
4270: 72 76 20 74 6f 20 62 6f 72 64 65 72 74 0a 20 20  rv to bordert.  
4280: 20 20 45 4c 53 45 0a 09 66 64 75 70 20 66 32 2a    ELSE..fdup f2*
4290: 20 74 6f 20 62 6f 72 64 65 72 0a 09 30 65 20 74   to border..0e t
42a0: 6f 20 62 6f 72 64 65 72 6c 20 66 6e 65 67 61 74  o borderl fnegat
42b0: 65 20 66 32 2a 20 74 6f 20 62 6f 72 64 65 72 74  e f2* to bordert
42c0: 20 30 65 20 74 6f 20 62 6f 72 64 65 72 76 0a 20   0e to borderv. 
42d0: 20 20 20 54 48 45 4e 20 6f 20 6f 3e 20 3b 0a 3a     THEN o o> ;.:
42e0: 20 61 64 64 2d 64 74 6d 73 20 28 20 74 69 63 6b   add-dtms ( tick
42f0: 73 20 2d 2d 20 29 0a 20 20 20 20 5c 73 6d 61 6c  s -- ).    \smal
4300: 6c 20 62 6c 61 63 6b 69 73 68 0a 20 20 20 20 31  l blackish.    1
4310: 6e 20 66 6d 2a 20 3e 64 61 79 20 7b 20 64 61 79  n fm* >day { day
4320: 20 7d 20 64 61 79 20 6c 61 73 74 2d 64 61 79 20   } day last-day 
4330: 3c 3e 20 49 46 0a 09 7b 7b 0a 09 20 20 20 20 78  <> IF..{{..    x
4340: 2d 63 6f 6c 6f 72 20 7b 20 66 3a 20 78 63 20 7d  -color { f: xc }
4350: 0a 09 20 20 20 20 67 6c 75 65 2a 6c 20 64 61 79  ..    glue*l day
4360: 2d 63 6f 6c 6f 72 20 78 2d 63 6f 6c 6f 72 20 73  -color x-color s
4370: 6c 69 64 65 2d 66 72 61 6d 65 20 64 75 70 20 2e  lide-frame dup .
4380: 62 75 74 74 6f 6e 31 0a 09 20 20 20 20 78 63 20  button1..    xc 
4390: 74 6f 20 78 2d 63 6f 6c 6f 72 0a 09 20 20 20 20  to x-color..    
43a0: 5c 62 6f 6c 64 20 64 61 79 20 5b 27 5d 20 2e 64  \bold day ['] .d
43b0: 61 79 20 24 74 6d 70 20 7d 7d 74 65 78 74 20 32  ay $tmp }}text 2
43c0: 35 25 62 20 5c 72 65 67 75 6c 61 72 0a 09 7d 7d  5%b \regular..}}
43d0: 7a 20 2f 63 65 6e 74 65 72 20 6d 73 67 73 2d 62  z /center msgs-b
43e0: 6f 78 20 2e 63 68 69 6c 64 2b 0a 20 20 20 20 54  ox .child+.    T
43f0: 48 45 4e 20 20 64 61 79 20 74 6f 20 6c 61 73 74  HEN  day to last
4400: 2d 64 61 79 0a 20 20 20 20 32 34 20 66 6d 2a 20  -day.    24 fm* 
4410: 66 73 70 6c 69 74 20 7b 20 68 6f 75 72 20 7d 20  fsplit { hour } 
4420: 68 6f 75 72 20 6c 61 73 74 2d 68 6f 75 72 20 3c  hour last-hour <
4430: 3e 0a 20 20 20 20 36 30 20 66 6d 2a 20 66 73 70  >.    60 fm* fsp
4440: 6c 69 74 20 7b 20 6d 69 6e 75 74 65 20 7d 20 6d  lit { minute } m
4450: 69 6e 75 74 65 20 31 30 20 2f 20 6c 61 73 74 2d  inute 10 / last-
4460: 6d 69 6e 75 74 65 20 31 30 20 2f 20 3c 3e 20 6f  minute 10 / <> o
4470: 72 0a 20 20 20 20 49 46 0a 09 7b 7b 0a 09 20 20  r.    IF..{{..  
4480: 20 20 78 2d 63 6f 6c 6f 72 20 7b 20 66 3a 20 78    x-color { f: x
4490: 63 20 7d 0a 09 20 20 20 20 67 6c 75 65 2a 6c 20  c }..    glue*l 
44a0: 68 6f 75 72 2d 63 6f 6c 6f 72 20 78 2d 63 6f 6c  hour-color x-col
44b0: 6f 72 20 73 6c 69 64 65 2d 66 72 61 6d 65 20 64  or slide-frame d
44c0: 75 70 20 2e 62 75 74 74 6f 6e 31 0a 09 20 20 20  up .button1..   
44d0: 20 78 63 20 74 6f 20 78 2d 63 6f 6c 6f 72 0a 09   xc to x-color..
44e0: 20 20 20 20 36 30 20 66 6d 2a 20 66 73 70 6c 69      60 fm* fspli
44f0: 74 20 6d 69 6e 75 74 65 20 68 6f 75 72 0a 09 20  t minute hour.. 
4500: 20 20 20 5b 3a 20 2e 23 23 20 27 3a 27 20 65 6d     [: .## ':' em
4510: 69 74 20 2e 23 23 20 27 3a 27 20 65 6d 69 74 20  it .## ':' emit 
4520: 2e 23 23 20 27 5a 27 20 65 6d 69 74 20 3b 5d 20  .## 'Z' emit ;] 
4530: 24 74 6d 70 20 7d 7d 74 65 78 74 20 32 35 25 62  $tmp }}text 25%b
4540: 0a 09 7d 7d 7a 20 2f 63 65 6e 74 65 72 20 6d 73  ..}}z /center ms
4550: 67 73 2d 62 6f 78 20 2e 63 68 69 6c 64 2b 0a 20  gs-box .child+. 
4560: 20 20 20 54 48 45 4e 20 20 68 6f 75 72 20 74 6f     THEN  hour to
4570: 20 6c 61 73 74 2d 68 6f 75 72 20 20 6d 69 6e 75   last-hour  minu
4580: 74 65 20 74 6f 20 6c 61 73 74 2d 6d 69 6e 75 74  te to last-minut
4590: 65 0a 20 20 20 20 66 64 72 6f 70 20 5c 6e 6f 72  e.    fdrop \nor
45a0: 6d 61 6c 20 3b 0a 0a 3a 20 6f 74 72 3f 20 28 20  mal ;..: otr? ( 
45b0: 74 69 63 6b 20 2d 2d 20 66 6c 61 67 20 29 0a 20  tick -- flag ). 
45c0: 20 20 20 36 34 64 75 70 20 36 34 23 2d 31 20 36     64dup 64#-1 6
45d0: 34 3c 3e 20 3b 0a 3a 20 74 65 78 74 2d 63 6f 6c  4<> ;.: text-col
45e0: 6f 72 21 20 28 20 2d 2d 20 29 20 6c 61 73 74 2d  or! ( -- ) last-
45f0: 6f 74 72 3f 20 49 46 20 20 67 72 65 65 6e 69 73  otr? IF  greenis
4600: 68 20 20 45 4c 53 45 20 20 62 6c 61 63 6b 69 73  h  ELSE  blackis
4610: 68 20 20 54 48 45 4e 20 3b 0a 0a 5b 49 46 44 45  h  THEN ;..[IFDE
4620: 46 5d 20 61 6e 64 72 6f 69 64 0a 20 20 20 20 61  F] android.    a
4630: 6c 73 6f 20 6a 6e 69 0a 20 20 20 20 3a 20 6f 70  lso jni.    : op
4640: 65 6e 2d 75 72 6c 20 28 20 61 64 64 72 20 75 20  en-url ( addr u 
4650: 2d 2d 20 29 0a 09 63 6c 61 7a 7a 20 3e 6f 20 6d  -- )..clazz >o m
4660: 61 6b 65 2d 6a 73 74 72 69 6e 67 20 74 6f 20 61  ake-jstring to a
4670: 72 67 73 30 20 6f 3e 0a 09 5b 27 5d 20 73 74 61  rgs0 o>..['] sta
4680: 72 74 62 72 6f 77 73 65 72 20 70 6f 73 74 2d 69  rtbrowser post-i
4690: 74 20 3b 0a 20 20 20 20 70 72 65 76 69 6f 75 73  t ;.    previous
46a0: 0a 5b 45 4c 53 45 5d 0a 20 20 20 20 5b 49 46 44  .[ELSE].    [IFD
46b0: 45 46 5d 20 6c 69 6e 75 78 0a 09 3a 20 6f 70 65  EF] linux..: ope
46c0: 6e 2d 75 72 6c 20 28 20 61 64 64 72 20 75 20 2d  n-url ( addr u -
46d0: 2d 20 29 0a 09 20 20 20 20 5b 3a 20 2e 22 20 78  - )..    [: ." x
46e0: 64 67 2d 6f 70 65 6e 20 22 20 74 79 70 65 20 3b  dg-open " type ;
46f0: 5d 20 24 74 6d 70 20 73 79 73 74 65 6d 20 3b 0a  ] $tmp system ;.
4700: 20 20 20 20 5b 54 48 45 4e 5d 0a 5b 54 48 45 4e      [THEN].[THEN
4710: 5d 0a 0a 3a 20 2e 70 6f 73 74 69 6e 67 20 28 20  ]..: .posting ( 
4720: 61 64 64 72 20 75 20 2d 2d 20 29 0a 20 20 20 20  addr u -- ).    
4730: 32 64 75 70 20 6b 65 79 73 69 7a 65 20 2f 73 74  2dup keysize /st
4740: 72 69 6e 67 0a 20 20 20 20 32 64 75 70 20 70 72  ring.    2dup pr
4750: 69 6e 74 61 62 6c 65 3f 20 49 46 20 20 27 5b 27  intable? IF  '['
4760: 20 65 6d 69 74 20 74 79 70 65 20 27 40 27 20 65   emit type '@' e
4770: 6d 69 74 0a 20 20 20 20 45 4c 53 45 20 20 2e 22  mit.    ELSE  ."
4780: 20 23 5b 22 20 20 38 35 74 79 70 65 20 2e 22 20   #["  85type ." 
4790: 2f 40 22 20 20 54 48 45 4e 0a 20 20 20 20 6b 65  /@"  THEN.    ke
47a0: 79 7c 20 2e 6b 65 79 2d 69 64 3f 20 3b 0a 0a 68  y| .key-id? ;..h
47b0: 61 73 68 3a 20 63 68 61 69 6e 2d 74 61 67 73 23  ash: chain-tags#
47c0: 0a 0a 73 63 6f 70 65 7b 20 64 76 63 73 0a 64 76  ..scope{ dvcs.dv
47d0: 63 73 2d 6c 6f 67 2d 63 6c 61 73 73 20 63 6c 61  cs-log-class cla
47e0: 73 73 0a 65 6e 64 2d 63 6c 61 73 73 20 70 6f 73  ss.end-class pos
47f0: 74 69 6e 67 2d 6c 6f 67 2d 63 6c 61 73 73 0a 0a  ting-log-class..
4800: 56 61 72 69 61 62 6c 65 20 6c 69 6b 65 2d 63 68  Variable like-ch
4810: 61 72 0a 0a 3a 6e 6f 6e 61 6d 65 20 28 20 61 64  ar..:noname ( ad
4820: 64 72 20 75 20 2d 2d 20 29 0a 20 20 20 20 2b 20  dr u -- ).    + 
4830: 73 69 67 70 6b 73 69 7a 65 23 20 2d 20 5b 20 6b  sigpksize# - [ k
4840: 65 79 73 69 7a 65 20 24 31 30 20 2b 20 5d 4c 20  eysize $10 + ]L 
4850: 64 76 63 73 2d 6c 6f 67 3a 69 64 24 20 24 21 0a  dvcs-log:id$ $!.
4860: 20 20 20 20 6c 69 6b 65 2d 63 68 61 72 20 6f 66      like-char of
4870: 66 0a 3b 20 70 6f 73 74 69 6e 67 2d 6c 6f 67 2d  f.; posting-log-
4880: 63 6c 61 73 73 20 69 73 20 6d 73 67 3a 73 74 61  class is msg:sta
4890: 72 74 0a 3a 6e 6f 6e 61 6d 65 20 28 20 78 63 68  rt.:noname ( xch
48a0: 61 72 20 2d 2d 20 29 20 20 6c 69 6b 65 2d 63 68  ar -- )  like-ch
48b0: 61 72 20 21 20 3b 20 70 6f 73 74 69 6e 67 2d 6c  ar ! ; posting-l
48c0: 6f 67 2d 63 6c 61 73 73 20 69 73 20 6d 73 67 3a  og-class is msg:
48d0: 6c 69 6b 65 0a 27 20 32 64 72 6f 70 20 70 6f 73  like.' 2drop pos
48e0: 74 69 6e 67 2d 6c 6f 67 2d 63 6c 61 73 73 20 69  ting-log-class i
48f0: 73 20 6d 73 67 3a 74 61 67 0a 27 20 32 64 72 6f  s msg:tag.' 2dro
4900: 70 20 70 6f 73 74 69 6e 67 2d 6c 6f 67 2d 63 6c  p posting-log-cl
4910: 61 73 73 20 69 73 20 6d 73 67 3a 69 64 0a 27 20  ass is msg:id.' 
4920: 32 64 72 6f 70 20 70 6f 73 74 69 6e 67 2d 6c 6f  2drop posting-lo
4930: 67 2d 63 6c 61 73 73 20 69 73 20 6d 73 67 3a 74  g-class is msg:t
4940: 65 78 74 0a 27 20 32 64 72 6f 70 20 70 6f 73 74  ext.' 2drop post
4950: 69 6e 67 2d 6c 6f 67 2d 63 6c 61 73 73 20 69 73  ing-log-class is
4960: 20 6d 73 67 3a 61 63 74 69 6f 6e 0a 3a 6e 6f 6e   msg:action.:non
4970: 61 6d 65 20 28 20 61 64 64 72 20 75 20 2d 2d 20  ame ( addr u -- 
4980: 29 0a 20 20 20 20 6c 69 6b 65 2d 63 68 61 72 20  ).    like-char 
4990: 40 20 30 3d 20 49 46 20 20 32 64 72 6f 70 20 20  @ 0= IF  2drop  
49a0: 45 58 49 54 20 20 54 48 45 4e 0a 20 20 20 20 38  EXIT  THEN.    8
49b0: 20 75 6d 69 6e 20 7b 20 7c 20 77 5e 20 69 64 2b   umin { | w^ id+
49c0: 6c 69 6b 65 20 7d 0a 20 20 20 20 6c 69 6b 65 2d  like }.    like-
49d0: 63 68 61 72 20 40 20 64 76 63 73 2d 6c 6f 67 3a  char @ dvcs-log:
49e0: 69 64 24 20 24 40 20 5b 3a 20 66 6f 72 74 68 3a  id$ $@ [: forth:
49f0: 74 79 70 65 20 66 6f 72 74 68 3a 78 65 6d 69 74  type forth:xemit
4a00: 20 3b 5d 20 69 64 2b 6c 69 6b 65 20 24 65 78 65   ;] id+like $exe
4a10: 63 0a 20 20 20 20 69 64 2b 6c 69 6b 65 20 63 65  c.    id+like ce
4a20: 6c 6c 0a 20 20 20 20 32 6f 76 65 72 20 63 68 61  ll.    2over cha
4a30: 69 6e 2d 74 61 67 73 23 20 23 40 20 64 30 3d 20  in-tags# #@ d0= 
4a40: 49 46 0a 09 32 73 77 61 70 20 63 68 61 69 6e 2d  IF..2swap chain-
4a50: 74 61 67 73 23 20 23 21 0a 20 20 20 20 45 4c 53  tags# #!.    ELS
4a60: 45 0a 09 32 6e 69 70 20 6c 61 73 74 23 20 63 65  E..2nip last# ce
4a70: 6c 6c 2b 20 24 2b 21 0a 20 20 20 20 54 48 45 4e  ll+ $+!.    THEN
4a80: 0a 3b 20 70 6f 73 74 69 6e 67 2d 6c 6f 67 2d 63  .; posting-log-c
4a90: 6c 61 73 73 20 69 73 20 6d 73 67 3a 63 68 61 69  lass is msg:chai
4aa0: 6e 0a 3a 6e 6f 6e 61 6d 65 20 28 20 61 64 64 72  n.:noname ( addr
4ab0: 20 75 20 2d 2d 20 29 0a 20 20 20 20 5b 3a 20 64   u -- ).    [: d
4ac0: 76 63 73 2d 6c 6f 67 3a 69 64 24 20 24 2e 20 66  vcs-log:id$ $. f
4ad0: 6f 72 74 68 3a 74 79 70 65 20 3b 5d 20 64 76 63  orth:type ;] dvc
4ae0: 73 2d 6c 6f 67 3a 75 72 6c 73 5b 5d 20 64 75 70  s-log:urls[] dup
4af0: 20 24 5b 5d 23 20 73 77 61 70 20 24 5b 5d 20 24   $[]# swap $[] $
4b00: 65 78 65 63 0a 3b 20 70 6f 73 74 69 6e 67 2d 6c  exec.; posting-l
4b10: 6f 67 2d 63 6c 61 73 73 20 69 73 20 6d 73 67 3a  og-class is msg:
4b20: 75 72 6c 0a 0a 3a 20 6e 65 77 2d 70 6f 73 74 69  url..: new-posti
4b30: 6e 67 2d 6c 6f 67 20 28 20 2d 2d 20 6f 20 29 0a  ng-log ( -- o ).
4b40: 20 20 20 20 70 6f 73 74 69 6e 67 2d 6c 6f 67 2d      posting-log-
4b50: 63 6c 61 73 73 20 6e 65 77 20 3e 6f 20 6d 73 67  class new >o msg
4b60: 2d 74 61 62 6c 65 20 40 20 74 6f 6b 65 6e 2d 74  -table @ token-t
4b70: 61 62 6c 65 20 21 20 6f 20 6f 3e 20 3b 0a 7d 73  able ! o o> ;.}s
4b80: 63 6f 70 65 0a 0a 30 20 56 61 6c 75 65 20 70 6f  cope..0 Value po
4b90: 73 74 69 6e 67 2d 76 70 0a 0a 7b 7b 0a 20 20 20  sting-vp..{{.   
4ba0: 20 70 6f 73 74 69 6e 67 2d 62 67 2d 63 6f 6c 23   posting-bg-col#
4bb0: 20 70 72 65 73 2d 66 72 61 6d 65 0a 20 20 20 20   pres-frame.    
4bc0: 7b 7b 0a 09 7b 7b 0a 09 20 20 20 20 67 6c 75 65  {{..{{..    glue
4bd0: 2a 6c 20 24 30 30 30 30 30 30 46 46 20 6e 65 77  *l $000000FF new
4be0: 2d 63 6f 6c 6f 72 2c 20 73 6c 69 64 65 2d 66 72  -color, slide-fr
4bf0: 61 6d 65 20 64 75 70 20 2e 62 75 74 74 6f 6e 31  ame dup .button1
4c00: 0a 09 20 20 20 20 7b 7b 0a 09 09 5c 6c 61 72 67  ..    {{...\larg
4c10: 65 20 72 65 61 6c 77 68 69 74 65 0a 09 09 22 e2  e realwhite..."
4c20: ac 85 22 20 7d 7d 74 65 78 74 20 34 30 25 62 20  " }}text 40%b 
4c30: 5b 3a 20 70 72 65 76 2d 73 6c 69 64 65 20 3b 5d  [: prev-slide ;]
4c40: 20 6f 76 65 72 20 63 6c 69 63 6b 5b 5d 0a 09 09   over click[]...
4c50: 21 69 31 38 6e 20 6c 22 20 50 6f 73 74 22 20 7d  !i18n l" Post" }
4c60: 7d 74 65 78 74 27 20 21 6c 69 74 20 34 30 25 62  }text' !lit 40%b
4c70: 0a 09 09 67 6c 75 65 2a 6c 20 7d 7d 67 6c 75 65  ...glue*l }}glue
4c80: 0a 09 20 20 20 20 7d 7d 68 20 62 6f 78 5b 5d 0a  ..    }}h box[].
4c90: 09 7d 7d 7a 20 62 6f 78 5b 5d 0a 09 7b 7b 0a 09  .}}z box[]..{{..
4ca0: 20 20 20 20 7b 7b 0a 09 09 67 6c 75 65 2a 6c 6c      {{...glue*ll
4cb0: 20 7d 7d 67 6c 75 65 0a 09 09 74 65 78 3a 20 76   }}glue...tex: v
4cc0: 70 2d 6d 64 0a 09 20 20 20 20 67 6c 75 65 2a 6c  p-md..    glue*l
4cd0: 20 27 20 76 70 2d 6d 64 20 7d 7d 76 70 20 64 75   ' vp-md }}vp du
4ce0: 70 20 74 6f 20 70 6f 73 74 69 6e 67 2d 76 70 0a  p to posting-vp.
4cf0: 09 20 20 20 20 3e 6f 20 22 70 6f 73 74 69 6e 67  .    >o "posting
4d00: 22 20 74 6f 20 6e 61 6d 65 24 20 66 6f 6e 74 2d  " to name$ font-
4d10: 73 69 7a 65 23 20 64 70 79 2d 77 20 40 20 64 70  size# dpy-w @ dp
4d20: 79 2d 68 20 40 20 3e 20 5b 49 46 5d 20 20 64 70  y-h @ > [IF]  dp
4d30: 79 2d 77 20 40 20 32 35 25 20 66 6d 2a 20 66 6f  y-w @ 25% fm* fo
4d40: 76 65 72 20 66 2d 20 5b 45 4c 53 45 5d 20 30 65  ver f- [ELSE] 0e
4d50: 20 5b 54 48 45 4e 5d 20 66 64 75 70 20 66 6e 65   [THEN] fdup fne
4d60: 67 61 74 65 20 74 6f 20 62 6f 72 64 65 72 76 20  gate to borderv 
4d70: 66 2b 20 74 6f 20 62 6f 72 64 65 72 20 6f 20 6f  f+ to border o o
4d80: 3e 0a 09 64 75 70 20 66 6f 6e 74 2d 73 69 7a 65  >..dup font-size
4d90: 23 20 36 36 25 20 66 2a 20 66 64 75 70 20 76 73  # 66% f* fdup vs
4da0: 6c 69 64 65 72 20 7d 7d 68 20 62 6f 78 5b 5d 0a  lider }}h box[].
4db0: 09 3e 6f 20 22 70 6f 73 74 69 6e 67 2d 73 6c 69  .>o "posting-sli
4dc0: 64 65 72 22 20 74 6f 20 6e 61 6d 65 24 20 6f 20  der" to name$ o 
4dd0: 6f 3e 0a 20 20 20 20 7d 7d 76 20 62 6f 78 5b 5d  o>.    }}v box[]
4de0: 0a 20 20 20 20 3e 6f 20 22 70 6f 73 74 69 6e 67  .    >o "posting
4df0: 2d 76 62 6f 78 22 20 74 6f 20 6e 61 6d 65 24 20  -vbox" to name$ 
4e00: 6f 20 6f 3e 0a 7d 7d 7a 20 62 6f 78 5b 5d 0a 3e  o o>.}}z box[].>
4e10: 6f 20 22 70 6f 73 74 69 6e 67 2d 7a 62 6f 78 22  o "posting-zbox"
4e20: 20 74 6f 20 6e 61 6d 65 24 20 6f 20 6f 3e 0a 74   to name$ o o>.t
4e30: 6f 20 70 6f 73 74 2d 66 72 61 6d 65 0a 0a 68 61  o post-frame..ha
4e40: 73 68 3a 20 62 75 63 6b 65 74 73 23 0a 0a 3a 20  sh: buckets#..: 
4e50: 23 21 2b 20 28 20 61 64 64 72 20 75 20 68 61 73  #!+ ( addr u has
4e60: 68 20 2d 2d 20 29 20 3e 72 0a 20 20 20 20 32 64  h -- ) >r.    2d
4e70: 75 70 20 72 40 20 23 40 20 49 46 0a 09 31 20 73  up r@ #@ IF..1 s
4e80: 77 61 70 20 2b 21 20 20 72 64 72 6f 70 20 32 64  wap +!  rdrop 2d
4e90: 72 6f 70 0a 20 20 20 20 45 4c 53 45 0a 09 64 72  rop.    ELSE..dr
4ea0: 6f 70 20 31 20 7b 20 77 5e 20 6f 6e 65 20 7d 0a  op 1 { w^ one }.
4eb0: 09 6f 6e 65 20 63 65 6c 6c 20 32 73 77 61 70 20  .one cell 2swap 
4ec0: 72 3e 20 23 21 0a 20 20 20 20 54 48 45 4e 20 3b  r> #!.    THEN ;
4ed0: 0a 0a 56 61 72 69 61 62 6c 65 20 65 6d 6f 6a 69  ..Variable emoji
4ee0: 73 24 20 22 f0 9f 91 8d f0 9f 91 8e f0 9f a4 a3  s$ "👍👎🤣
4ef0: f0 9f 98 8d f0 9f 98 98 f0 9f 98 9b f0 9f a4 94  😍😘😛🤔
4f00: f0 9f 98 ad f0 9f 98 a1 f0 9f 98 b1 f0 9f 94 83  😭😡😱🔃
4f10: ef 87 a0 22 20 65 6d 6f 6a 69 73 24 20 24 21 20  " emojis$ $! 
4f20: 5c 20 6c 69 73 74 20 6e 65 65 64 20 74 6f 20 62  \ list need to b
4f30: 65 20 62 69 67 67 65 72 0a 0a 3a 20 63 68 61 69  e bigger..: chai
4f40: 6e 2d 73 74 72 69 6e 67 20 28 20 61 64 64 72 20  n-string ( addr 
4f50: 75 20 2d 2d 20 61 64 64 72 27 20 75 27 20 29 0a  u -- addr' u' ).
4f60: 20 20 20 20 62 75 63 6b 65 74 73 23 20 23 66 72      buckets# #fr
4f70: 65 65 73 0a 20 20 20 20 62 6f 75 6e 64 73 20 55  ees.    bounds U
4f80: 2b 44 4f 0a 09 49 20 24 40 20 5b 20 6b 65 79 73  +DO..I $@ [ keys
4f90: 69 7a 65 20 32 20 36 34 73 20 2b 20 5d 4c 20 2f  ize 2 64s + ]L /
4fa0: 73 74 72 69 6e 67 20 62 75 63 6b 65 74 73 23 20  string buckets# 
4fb0: 23 21 2b 0a 20 20 20 20 63 65 6c 6c 20 2b 4c 4f  #!+.    cell +LO
4fc0: 4f 50 0a 20 20 20 20 65 6d 6f 6a 69 73 24 20 24  OP.    emojis$ $
4fd0: 40 20 62 6f 75 6e 64 73 20 44 4f 0a 09 49 20 64  @ bounds DO..I d
4fe0: 75 70 20 49 27 20 6f 76 65 72 20 2d 20 78 2d 73  up I' over - x-s
4ff0: 69 7a 65 20 32 64 75 70 20 62 75 63 6b 65 74 73  ize 2dup buckets
5000: 23 20 23 40 0a 09 49 46 20 20 20 20 40 20 3e 72  # #@..IF    @ >r
5010: 20 74 75 63 6b 20 74 79 70 65 20 72 3e 20 2e 0a   tuck type r> ..
5020: 09 45 4c 53 45 20 20 64 72 6f 70 20 6e 69 70 20  .ELSE  drop nip 
5030: 20 54 48 45 4e 0a 20 20 20 20 2b 4c 4f 4f 50 20   THEN.    +LOOP 
5040: 3b 0a 3a 20 64 69 73 70 6c 61 79 2d 74 69 74 6c  ;.: display-titl
5050: 65 20 7b 20 64 3a 20 70 72 6a 20 7c 20 6b 69 20  e { d: prj | ki 
5060: 2d 2d 20 7d 0a 20 20 20 20 70 72 6a 20 6b 65 79  -- }.    prj key
5070: 3e 6f 20 3f 64 75 70 2d 49 46 20 20 2e 6b 65 2d  >o ?dup-IF  .ke-
5080: 69 6d 70 6f 72 74 73 20 40 20 3e 69 6d 2d 63 6f  imports @ >im-co
5090: 6c 6f 72 23 20 73 66 6c 6f 61 74 73 20 74 6f 20  lor# sfloats to 
50a0: 6b 69 20 20 54 48 45 4e 0a 20 20 20 20 7b 7b 0a  ki  THEN.    {{.
50b0: 09 67 6c 75 65 2a 6c 20 69 6d 70 6f 72 74 73 23  .glue*l imports#
50c0: 72 67 62 2d 62 67 20 6b 69 20 2b 20 73 66 40 20  rgb-bg ki + sf@ 
50d0: 73 6c 69 64 65 2d 66 72 61 6d 65 20 64 75 70 20  slide-frame dup 
50e0: 2e 62 75 74 74 6f 6e 31 0a 09 7b 7b 0a 09 20 20  .button1..{{..  
50f0: 20 20 70 72 6a 20 6b 65 79 7c 20 3f 61 76 61 74    prj key| ?avat
5100: 61 72 0a 09 20 20 20 20 5c 6c 61 72 67 65 20 69  ar..    \large i
5110: 6d 70 6f 72 74 73 23 72 67 62 2d 66 67 20 6b 69  mports#rgb-fg ki
5120: 20 2b 20 73 66 40 20 74 6f 20 78 2d 63 6f 6c 6f   + sf@ to x-colo
5130: 72 0a 09 20 20 20 20 70 72 6a 20 6b 65 79 7c 20  r..    prj key| 
5140: 5b 27 5d 20 2e 6b 65 79 2d 69 64 3f 20 24 74 6d  ['] .key-id? $tm
5150: 70 20 7d 7d 74 65 78 74 20 32 35 25 62 0a 09 20  p }}text 25%b.. 
5160: 20 20 20 67 6c 75 65 2a 6c 6c 20 7d 7d 67 6c 75     glue*ll }}glu
5170: 65 0a 09 20 20 20 20 5c 73 6d 61 6c 6c 20 70 72  e..    \small pr
5180: 6a 20 64 72 6f 70 20 6b 65 79 73 69 7a 65 20 2b  j drop keysize +
5190: 20 6c 65 2d 36 34 40 20 5b 3a 20 2e 74 69 63 6b   le-64@ [: .tick
51a0: 73 20 73 70 61 63 65 20 3b 5d 20 24 74 6d 70 20  s space ;] $tmp 
51b0: 7d 7d 74 65 78 74 20 32 35 25 62 0a 09 20 20 20  }}text 25%b..   
51c0: 20 5c 6e 6f 72 6d 61 6c 0a 09 20 20 20 20 70 72   \normal..    pr
51d0: 6a 20 64 72 6f 70 20 6b 65 79 73 69 7a 65 20 2b  j drop keysize +
51e0: 20 38 20 63 68 61 69 6e 2d 74 61 67 73 23 20 23   8 chain-tags# #
51f0: 40 0a 09 20 20 20 20 5b 27 5d 20 63 68 61 69 6e  @..    ['] chain
5200: 2d 73 74 72 69 6e 67 20 24 74 6d 70 20 7d 7d 74  -string $tmp }}t
5210: 65 78 74 20 32 35 25 62 20 62 6c 61 63 6b 69 73  ext 25%b blackis
5220: 68 0a 09 7d 7d 68 20 62 6f 78 5b 5d 0a 20 20 20  h..}}h box[].   
5230: 20 7d 7d 7a 20 62 6f 78 5b 5d 20 70 6f 73 74 69   }}z box[] posti
5240: 6e 67 2d 76 70 20 2e 63 68 69 6c 64 2b 20 3b 0a  ng-vp .child+ ;.
5250: 0a 3a 20 64 69 73 70 6c 61 79 2d 66 69 6c 65 20  .: display-file 
5260: 7b 20 64 3a 20 70 72 6a 20 2d 2d 20 7d 0a 20 20  { d: prj -- }.  
5270: 20 20 70 72 6a 20 64 69 73 70 6c 61 79 2d 74 69    prj display-ti
5280: 74 6c 65 0a 20 20 20 20 70 72 6a 20 5b 20 6b 65  tle.    prj [ ke
5290: 79 73 69 7a 65 20 24 31 30 20 2b 20 5d 4c 20 73  ysize $10 + ]L s
52a0: 61 66 65 2f 73 74 72 69 6e 67 0a 20 20 20 20 32  afe/string.    2
52b0: 64 75 70 20 22 66 69 6c 65 3a 22 20 73 74 72 69  dup "file:" stri
52c0: 6e 67 2d 70 72 65 66 69 78 3f 20 49 46 0a 09 30  ng-prefix? IF..0
52d0: 20 74 6f 20 76 2d 62 6f 78 0a 09 35 20 2f 73 74   to v-box..5 /st
52e0: 72 69 6e 67 20 5b 3a 20 2e 22 20 7e 2b 2f 22 20  ring [: ." ~+/" 
52f0: 74 79 70 65 20 3b 5d 20 24 74 6d 70 20 6d 61 72  type ;] $tmp mar
5300: 6b 64 6f 77 6e 2d 70 61 72 73 65 0a 09 76 2d 62  kdown-parse..v-b
5310: 6f 78 20 70 6f 73 74 69 6e 67 2d 76 70 20 2e 63  ox posting-vp .c
5320: 68 69 6c 64 2b 0a 09 64 70 79 2d 77 20 40 20 64  hild+..dpy-w @ d
5330: 70 79 2d 68 20 40 20 3e 20 49 46 20 20 64 70 79  py-h @ > IF  dpy
5340: 2d 77 20 40 20 35 30 25 20 66 6d 2a 0a 09 45 4c  -w @ 50% fm*..EL
5350: 53 45 20 20 64 70 79 2d 77 20 40 20 73 3e 66 20  SE  dpy-w @ s>f 
5360: 66 6f 6e 74 2d 73 69 7a 65 23 20 66 32 2a 20 66  font-size# f2* f
5370: 2d 20 20 54 48 45 4e 0a 09 70 2d 66 6f 72 6d 61  -  THEN..p-forma
5380: 74 0a 20 20 20 20 45 4c 53 45 20 20 32 64 72 6f  t.    ELSE  2dro
5390: 70 20 20 54 48 45 4e 20 3b 0a 3a 20 64 69 73 70  p  THEN ;.: disp
53a0: 6c 61 79 2d 70 6f 73 74 69 6e 67 20 28 20 61 64  lay-posting ( ad
53b0: 64 72 20 75 20 2d 2d 20 29 0a 20 20 20 20 70 6f  dr u -- ).    po
53c0: 73 74 69 6e 67 2d 76 70 20 3e 6f 20 64 69 73 70  sting-vp >o disp
53d0: 6f 73 65 2d 63 68 69 6c 64 73 20 20 66 72 65 65  ose-childs  free
53e0: 2d 74 68 75 6d 62 73 20 20 30 20 74 6f 20 61 63  -thumbs  0 to ac
53f0: 74 69 76 65 2d 77 20 6f 3e 0a 20 20 20 20 70 72  tive-w o>.    pr
5400: 6f 6a 65 63 74 3a 62 72 61 6e 63 68 24 20 24 40  oject:branch$ $@
5410: 20 7b 20 64 3a 20 62 72 61 6e 63 68 20 7d 0a 20   { d: branch }. 
5420: 20 20 20 64 76 63 73 3a 6e 65 77 2d 70 6f 73 74     dvcs:new-post
5430: 69 6e 67 2d 6c 6f 67 20 3e 6f 0a 20 20 20 20 3f  ing-log >o.    ?
5440: 6d 73 67 2d 6c 6f 67 20 20 6c 61 73 74 23 20 6d  msg-log  last# m
5450: 73 67 2d 6c 6f 67 40 20 32 64 75 70 20 7b 20 6c  sg-log@ 2dup { l
5460: 6f 67 20 75 20 7d 0a 20 20 20 20 62 6f 75 6e 64  og u }.    bound
5470: 73 20 3f 44 4f 0a 09 49 20 24 40 20 6d 73 67 3a  s ?DO..I $@ msg:
5480: 64 69 73 70 6c 61 79 20 5c 20 74 68 69 73 20 77  display \ this w
5490: 69 6c 6c 20 6f 6e 6c 79 20 73 65 74 20 74 68 65  ill only set the
54a0: 20 55 52 4c 73 0a 20 20 20 20 63 65 6c 6c 20 2b   URLs.    cell +
54b0: 4c 4f 4f 50 0a 20 20 20 20 67 6c 75 65 2a 6c 6c  LOOP.    glue*ll
54c0: 6c 20 7d 7d 67 6c 75 65 20 70 6f 73 74 69 6e 67  l }}glue posting
54d0: 2d 76 70 20 64 75 70 20 2e 61 63 74 20 30 3d 20  -vp dup .act 0= 
54e0: 49 46 20 20 76 70 5b 5d 20 20 54 48 45 4e 20 20  IF  vp[]  THEN  
54f0: 2e 63 68 69 6c 64 2b 0a 20 20 20 20 6c 6f 67 20  .child+.    log 
5500: 66 72 65 65 0a 20 20 20 20 64 76 63 73 2d 6c 6f  free.    dvcs-lo
5510: 67 3a 75 72 6c 73 5b 5d 20 5b 27 5d 20 64 69 73  g:urls[] ['] dis
5520: 70 6c 61 79 2d 66 69 6c 65 20 24 5b 5d 6d 61 70  play-file $[]map
5530: 0a 20 20 20 20 64 76 63 73 3a 64 69 73 70 6f 73  .    dvcs:dispos
5540: 65 2d 64 76 63 73 2d 6c 6f 67 20 6f 3e 20 3b 0a  e-dvcs-log o> ;.
5550: 3a 20 2e 70 6f 73 74 69 6e 67 2d 6c 6f 67 20 28  : .posting-log (
5560: 20 2d 2d 20 29 0a 20 20 20 20 64 76 63 73 3a 6e   -- ).    dvcs:n
5570: 65 77 2d 64 76 63 73 20 3e 6f 20 20 63 6f 6e 66  ew-dvcs >o  conf
5580: 69 67 3e 64 76 63 73 0a 20 20 20 20 70 72 6f 6a  ig>dvcs.    proj
5590: 65 63 74 3a 70 72 6f 6a 65 63 74 24 20 24 40 20  ect:project$ $@ 
55a0: 40 2f 20 32 64 72 6f 70 20 32 64 75 70 20 6c 6f  @/ 2drop 2dup lo
55b0: 61 64 2d 6d 73 67 0a 20 20 20 20 64 69 73 70 6c  ad-msg.    displ
55c0: 61 79 2d 70 6f 73 74 69 6e 67 0a 20 20 20 20 64  ay-posting.    d
55d0: 76 63 73 3a 64 69 73 70 6f 73 65 2d 64 76 63 73  vcs:dispose-dvcs
55e0: 20 6f 3e 20 3b 0a 3a 20 6f 70 65 6e 2d 70 6f 73   o> ;.: open-pos
55f0: 74 69 6e 67 20 7b 20 64 3a 20 70 72 6a 20 2d 2d  ting { d: prj --
5600: 20 7d 0a 20 20 20 20 3e 64 69 72 20 22 70 6f 73   }.    >dir "pos
5610: 74 73 22 20 7e 6e 65 74 32 6f 2d 63 61 63 68 65  ts" ~net2o-cache
5620: 2f 0a 20 20 20 20 2e 22 20 6f 70 65 6e 20 22 20  /.    ." open " 
5630: 70 72 6a 20 2e 70 6f 73 74 69 6e 67 20 63 72 0a  prj .posting cr.
5640: 20 20 20 20 70 72 6a 20 32 64 75 70 20 6b 65 79      prj 2dup key
5650: 73 69 7a 65 20 2f 73 74 72 69 6e 67 20 5b 3a 20  size /string [: 
5660: 74 79 70 65 20 27 40 27 20 65 6d 69 74 20 6b 65  type '@' emit ke
5670: 79 7c 20 2e 6b 65 79 2d 69 64 3f 20 3b 5d 20 24  y| .key-id? ;] $
5680: 74 6d 70 20 6e 69 63 6b 3e 63 68 61 74 0a 20 20  tmp nick>chat.  
5690: 20 20 68 61 6e 64 6c 65 2d 63 6c 6f 6e 65 0a 20    handle-clone. 
56a0: 20 20 20 70 72 6a 20 6b 65 79 73 69 7a 65 20 2f     prj keysize /
56b0: 73 74 72 69 6e 67 20 73 65 74 2d 64 69 72 20 74  string set-dir t
56c0: 68 72 6f 77 0a 20 20 20 20 2e 70 6f 73 74 69 6e  hrow.    .postin
56d0: 67 2d 6c 6f 67 20 6e 65 78 74 2d 73 6c 69 64 65  g-log next-slide
56e0: 0a 20 20 20 20 70 6f 73 74 69 6e 67 2d 76 70 20  .    posting-vp 
56f0: 30 2e 30 31 65 20 5b 3a 20 3e 6f 20 76 70 2d 74  0.01e [: >o vp-t
5700: 6f 70 20 62 6f 78 2d 66 6c 61 67 73 20 62 6f 78  op box-flags box
5710: 2d 74 6f 75 63 68 65 64 23 20 69 6e 76 65 72 74  -touched# invert
5720: 20 61 6e 64 20 74 6f 20 62 6f 78 2d 66 6c 61 67   and to box-flag
5730: 73 20 6f 3e 0a 09 66 64 72 6f 70 20 2b 73 79 6e  s o>..fdrop +syn
5740: 63 20 2b 72 65 73 69 7a 65 20 3b 5d 20 3e 61 6e  c +resize ;] >an
5750: 69 6d 61 74 65 0a 20 20 20 20 64 69 72 3e 20 3b  imate.    dir> ;
5760: 0a 0a 3a 6e 6f 6e 61 6d 65 20 28 20 2d 2d 20 29  ..:noname ( -- )
5770: 0a 20 20 20 20 67 6c 75 65 2a 6c 6c 20 7d 7d 67  .    glue*ll }}g
5780: 6c 75 65 20 6d 73 67 2d 62 6f 78 20 2e 63 68 69  lue msg-box .chi
5790: 6c 64 2b 0a 20 20 20 20 64 70 79 2d 77 20 40 20  ld+.    dpy-w @ 
57a0: 39 30 25 20 66 6d 2a 20 6d 73 67 2d 70 61 72 20  90% fm* msg-par 
57b0: 2e 70 61 72 2d 73 70 6c 69 74 0a 20 20 20 20 7b  .par-split.    {
57c0: 7b 20 6d 73 67 2d 70 61 72 20 75 6e 62 6f 78 20  { msg-par unbox 
57d0: 7d 7d 0a 20 20 20 20 64 75 70 20 3e 72 20 30 20  }}.    dup >r 0 
57e0: 3f 44 4f 20 20 49 20 70 69 63 6b 20 62 6f 78 5b  ?DO  I pick box[
57f0: 5d 20 22 75 6e 62 6f 78 65 64 22 20 6e 61 6d 65  ] "unboxed" name
5800: 21 20 64 72 6f 70 20 20 4c 4f 4f 50 20 20 72 3e  ! drop  LOOP  r>
5810: 0a 20 20 20 20 6d 73 67 2d 76 62 6f 78 20 2e 2b  .    msg-vbox .+
5820: 63 68 69 6c 64 73 0a 3b 20 77 6d 73 67 2d 63 6c  childs.; wmsg-cl
5830: 61 73 73 20 74 6f 20 6d 73 67 3a 65 6e 64 0a 3a  ass to msg:end.:
5840: 20 6e 65 77 2d 6d 73 67 2d 70 61 72 20 28 20 2d   new-msg-par ( -
5850: 2d 20 29 0a 20 20 20 20 7b 7b 20 7d 7d 70 20 22  - ).    {{ }}p "
5860: 6d 73 67 2d 70 61 72 22 20 6e 61 6d 65 21 0a 20  msg-par" name!. 
5870: 20 20 20 64 75 70 20 2e 73 75 62 62 6f 78 20 62     dup .subbox b
5880: 6f 78 5b 5d 20 64 72 6f 70 20 62 6f 78 5b 5d 20  ox[] drop box[] 
5890: 63 62 6c 20 3e 62 6c 0a 20 20 20 20 64 75 70 20  cbl >bl.    dup 
58a0: 2e 73 75 62 62 6f 78 20 22 6d 73 67 2d 62 6f 78  .subbox "msg-box
58b0: 22 20 6e 61 6d 65 21 0a 20 20 20 20 74 6f 20 6d  " name!.    to m
58c0: 73 67 2d 62 6f 78 20 74 6f 20 6d 73 67 2d 70 61  sg-box to msg-pa
58d0: 72 20 3b 0a 3a 6e 6f 6e 61 6d 65 20 7b 20 64 3a  r ;.:noname { d:
58e0: 20 70 6b 20 2d 2d 20 6f 20 7d 0a 20 20 20 20 70   pk -- o }.    p
58f0: 6b 20 5b 3a 20 2e 73 69 6d 70 6c 65 2d 69 64 20  k [: .simple-id 
5900: 2e 22 20 3a 20 22 20 3b 5d 20 24 74 6d 70 20 6e  ." : " ;] $tmp n
5910: 6f 74 69 66 79 2d 6e 69 63 6b 21 0a 20 20 20 20  otify-nick!.    
5920: 70 6b 20 6b 65 79 7c 20 70 6b 63 20 6f 76 65 72  pk key| pkc over
5930: 20 73 74 72 3d 20 7b 20 6d 65 3f 20 7d 0a 20 20   str= { me? }.  
5940: 20 20 70 6b 20 65 6e 64 64 61 74 65 40 20 6f 74    pk enddate@ ot
5950: 72 3f 20 7b 20 6f 74 72 20 7d 0a 20 20 20 20 70  r? { otr }.    p
5960: 6b 20 6b 65 79 7c 20 6c 61 73 74 2d 62 75 62 62  k key| last-bubb
5970: 6c 65 2d 70 6b 20 24 40 20 73 74 72 3d 20 6f 74  le-pk $@ str= ot
5980: 72 20 6c 61 73 74 2d 6f 74 72 3f 20 3d 20 61 6e  r last-otr? = an
5990: 64 0a 20 20 20 20 70 6b 20 73 74 61 72 74 64 61  d.    pk startda
59a0: 74 65 40 20 6c 61 73 74 2d 74 69 63 6b 20 36 34  te@ last-tick 64
59b0: 6f 76 65 72 20 74 6f 20 6c 61 73 74 2d 74 69 63  over to last-tic
59c0: 6b 0a 20 20 20 20 36 34 2d 20 64 65 6c 74 61 2d  k.    64- delta-
59d0: 62 75 62 62 6c 65 20 36 34 3c 20 61 6e 64 0a 20  bubble 64< and. 
59e0: 20 20 20 49 46 0a 09 6e 65 77 2d 6d 73 67 2d 70     IF..new-msg-p
59f0: 61 72 0a 20 20 20 20 45 4c 53 45 0a 09 70 6b 20  ar.    ELSE..pk 
5a00: 73 74 61 72 74 64 61 74 65 40 20 61 64 64 2d 64  startdate@ add-d
5a10: 74 6d 73 0a 09 70 6b 20 6b 65 79 7c 20 6c 61 73  tms..pk key| las
5a20: 74 2d 62 75 62 62 6c 65 2d 70 6b 20 24 21 20 20  t-bubble-pk $!  
5a30: 6f 74 72 20 74 6f 20 6c 61 73 74 2d 6f 74 72 3f  otr to last-otr?
5a40: 20 20 74 65 78 74 2d 63 6f 6c 6f 72 21 0a 09 7b    text-color!..{
5a50: 7b 0a 09 20 20 20 20 7b 7b 20 67 6c 75 65 2a 6c  {..    {{ glue*l
5a60: 20 7d 7d 67 6c 75 65 0a 09 09 7b 7b 20 5c 73 61   }}glue...{{ \sa
5a70: 6e 73 20 5c 6e 6f 72 6d 61 6c 0a 09 09 20 20 20  ns \normal...   
5a80: 20 7b 7b 0a 09 09 09 67 6c 75 65 2a 6c 20 7d 7d   {{....glue*l }}
5a90: 67 6c 75 65 0a 09 09 09 30 20 70 6b 20 6b 65 79  glue....0 pk key
5aa0: 7c 20 3f 61 76 61 74 61 72 20 64 75 70 20 49 46  | ?avatar dup IF
5ab0: 20 20 6e 69 70 0a 09 09 09 20 20 20 20 70 6b 20    nip....    pk 
5ac0: 5b 27 5d 20 2e 6b 65 79 2d 69 64 20 24 74 6d 70  ['] .key-id $tmp
5ad0: 20 32 64 72 6f 70 0a 09 09 09 45 4c 53 45 20 20   2drop....ELSE  
5ae0: 64 72 6f 70 0a 09 09 09 20 20 20 20 5c 62 6f 6c  drop....    \bol
5af0: 64 20 70 6b 20 5b 27 5d 20 2e 6b 65 79 2d 69 64  d pk ['] .key-id
5b00: 20 24 74 6d 70 20 7d 7d 74 65 78 74 20 32 35 25   $tmp }}text 25%
5b10: 62 0a 09 09 09 20 20 20 20 3e 6f 20 69 6d 70 6f  b....    >o impo
5b20: 72 74 73 23 72 67 62 2d 66 67 20 6c 61 73 74 2d  rts#rgb-fg last-
5b30: 6b 69 20 3e 69 6d 2d 63 6f 6c 6f 72 23 20 73 66  ki >im-color# sf
5b40: 6c 6f 61 74 73 20 2b 20 73 66 40 0a 09 09 09 20  loats + sf@.... 
5b50: 20 20 20 74 6f 20 74 65 78 74 2d 63 6f 6c 6f 72     to text-color
5b60: 20 20 6f 20 6f 3e 0a 09 09 09 54 48 45 4e 0a 09    o o>....THEN..
5b70: 09 09 6d 65 3f 20 49 46 20 20 73 77 61 70 20 20  ..me? IF  swap  
5b80: 54 48 45 4e 0a 09 09 09 5c 72 65 67 75 6c 61 72  THEN....\regular
5b90: 0a 09 09 20 20 20 20 7d 7d 68 0a 09 09 20 20 20  ...    }}h...   
5ba0: 20 67 6c 75 65 2a 6c 20 69 6d 70 6f 72 74 73 23   glue*l imports#
5bb0: 72 67 62 2d 62 67 20 6c 61 73 74 2d 6b 69 20 3e  rgb-bg last-ki >
5bc0: 69 6d 2d 63 6f 6c 6f 72 23 20 73 66 6c 6f 61 74  im-color# sfloat
5bd0: 73 20 2b 20 73 66 40 0a 09 09 20 20 20 20 73 6c  s + sf@...    sl
5be0: 69 64 65 2d 66 72 61 6d 65 20 64 75 70 20 2e 62  ide-frame dup .b
5bf0: 75 74 74 6f 6e 32 0a 09 09 20 20 20 20 73 77 61  utton2...    swa
5c00: 70 0a 09 09 7d 7d 7a 20 6d 65 3f 20 30 3d 20 49  p...}}z me? 0= I
5c10: 46 20 20 63 68 61 74 6e 61 6d 65 2d 74 61 62 20  F  chatname-tab 
5c20: 20 54 48 45 4e 0a 09 20 20 20 20 7d 7d 76 0a 09   THEN..    }}v..
5c30: 20 20 20 20 7b 7b 0a 09 09 67 6c 75 65 2a 6c 20      {{...glue*l 
5c40: 6c 61 73 74 2d 6f 74 72 3f 20 49 46 20 6f 74 72  last-otr? IF otr
5c50: 2d 63 6f 6c 23 20 45 4c 53 45 20 63 68 61 74 2d  -col# ELSE chat-
5c60: 63 6f 6c 23 20 54 48 45 4e 0a 09 09 73 6c 69 64  col# THEN...slid
5c70: 65 2d 66 72 61 6d 65 20 64 75 70 20 6d 65 3f 20  e-frame dup me? 
5c80: 49 46 20 2e 72 62 75 62 62 6c 65 20 45 4c 53 45  IF .rbubble ELSE
5c90: 20 2e 6c 62 75 62 62 6c 65 20 54 48 45 4e 0a 09   .lbubble THEN..
5ca0: 09 22 62 75 62 62 6c 65 22 20 6e 61 6d 65 21 0a  ."bubble" name!.
5cb0: 09 09 7b 7b 0a 09 09 20 20 20 20 6e 65 77 2d 6d  ..{{...    new-m
5cc0: 73 67 2d 70 61 72 0a 09 09 7d 7d 76 20 62 6f 78  sg-par...}}v box
5cd0: 5b 5d 20 64 75 70 20 74 6f 20 6d 73 67 2d 76 62  [] dup to msg-vb
5ce0: 6f 78 20 22 6d 73 67 2d 76 62 6f 78 22 20 6e 61  ox "msg-vbox" na
5cf0: 6d 65 21 0a 09 09 6d 65 3f 20 3e 62 75 62 62 6c  me!...me? >bubbl
5d00: 65 2d 62 6f 72 64 65 72 0a 09 20 20 20 20 7d 7d  e-border..    }}
5d10: 7a 20 62 6f 78 5b 5d 20 22 6d 73 67 2d 7a 62 6f  z box[] "msg-zbo
5d20: 78 22 20 6e 61 6d 65 21 0a 09 20 20 20 20 67 6c  x" name!..    gl
5d30: 75 65 2a 6c 6c 20 7d 7d 67 6c 75 65 0a 09 20 20  ue*ll }}glue..  
5d40: 20 20 6d 65 3f 20 49 46 20 20 73 77 61 70 20 72    me? IF  swap r
5d50: 6f 74 20 20 54 48 45 4e 0a 09 7d 7d 68 20 62 6f  ot  THEN..}}h bo
5d60: 78 5b 5d 20 22 6d 73 67 73 2d 62 6f 78 22 20 6e  x[] "msgs-box" n
5d70: 61 6d 65 21 20 6d 73 67 73 2d 62 6f 78 20 2e 63  ame! msgs-box .c
5d80: 68 69 6c 64 2b 0a 09 62 6c 61 63 6b 69 73 68 0a  hild+..blackish.
5d90: 20 20 20 20 54 48 45 4e 0a 3b 20 77 6d 73 67 2d      THEN.; wmsg-
5da0: 63 6c 61 73 73 20 74 6f 20 6d 73 67 3a 73 74 61  class to msg:sta
5db0: 72 74 0a 3a 6e 6f 6e 61 6d 65 20 7b 20 64 3a 20  rt.:noname { d: 
5dc0: 73 74 72 69 6e 67 20 2d 2d 20 6f 20 7d 0a 20 20  string -- o }.  
5dd0: 20 20 6c 69 6e 6b 2d 62 6c 75 65 20 5c 6d 6f 6e    link-blue \mon
5de0: 6f 20 73 74 72 69 6e 67 20 5b 3a 20 27 23 27 20  o string [: '#' 
5df0: 65 6d 69 74 20 74 79 70 65 20 3b 5d 20 24 74 6d  emit type ;] $tm
5e00: 70 0a 20 20 20 20 5b 27 5d 20 75 74 66 38 2d 73  p.    ['] utf8-s
5e10: 61 6e 69 74 69 7a 65 20 24 74 6d 70 20 7d 7d 74  anitize $tmp }}t
5e20: 65 78 74 20 74 65 78 74 2d 63 6f 6c 6f 72 21 20  ext text-color! 
5e30: 5c 73 61 6e 73 0a 20 20 20 20 6d 73 67 2d 62 6f  \sans.    msg-bo
5e40: 78 20 2e 63 68 69 6c 64 2b 0a 3b 20 77 6d 73 67  x .child+.; wmsg
5e50: 2d 63 6c 61 73 73 20 74 6f 20 6d 73 67 3a 74 61  -class to msg:ta
5e60: 67 0a 3a 6e 6f 6e 61 6d 65 20 7b 20 64 3a 20 73  g.:noname { d: s
5e70: 74 72 69 6e 67 20 2d 2d 20 6f 20 7d 0a 20 20 20  tring -- o }.   
5e80: 20 74 65 78 74 2d 63 6f 6c 6f 72 21 0a 20 20 20   text-color!.   
5e90: 20 73 74 72 69 6e 67 20 5b 27 5d 20 75 74 66 38   string ['] utf8
5ea0: 2d 73 61 6e 69 74 69 7a 65 20 24 74 6d 70 20 7d  -sanitize $tmp }
5eb0: 7d 74 65 78 74 20 32 35 25 62 76 0a 20 20 20 20  }text 25%bv.    
5ec0: 22 74 65 78 74 22 20 6e 61 6d 65 21 20 6d 73 67  "text" name! msg
5ed0: 2d 62 6f 78 20 2e 63 68 69 6c 64 2b 0a 3b 20 77  -box .child+.; w
5ee0: 6d 73 67 2d 63 6c 61 73 73 20 74 6f 20 6d 73 67  msg-class to msg
5ef0: 3a 74 65 78 74 0a 3a 6e 6f 6e 61 6d 65 20 7b 20  :text.:noname { 
5f00: 64 3a 20 73 74 72 69 6e 67 20 2d 2d 20 6f 20 7d  d: string -- o }
5f10: 0a 20 20 20 20 5c 69 74 61 6c 69 63 20 6c 61 73  .    \italic las
5f20: 74 2d 6f 74 72 3f 20 49 46 20 6c 69 67 68 74 2d  t-otr? IF light-
5f30: 62 6c 75 65 20 45 4c 53 45 20 64 61 72 6b 2d 62  blue ELSE dark-b
5f40: 6c 75 65 20 54 48 45 4e 0a 20 20 20 20 73 74 72  lue THEN.    str
5f50: 69 6e 67 20 5b 27 5d 20 75 74 66 38 2d 73 61 6e  ing ['] utf8-san
5f60: 69 74 69 7a 65 20 24 74 6d 70 20 7d 7d 74 65 78  itize $tmp }}tex
5f70: 74 20 32 35 25 62 76 20 5c 72 65 67 75 6c 61 72  t 25%bv \regular
5f80: 0a 20 20 20 20 74 65 78 74 2d 63 6f 6c 6f 72 21  .    text-color!
5f90: 0a 20 20 20 20 22 61 63 74 69 6f 6e 22 20 6e 61  .    "action" na
5fa0: 6d 65 21 20 6d 73 67 2d 62 6f 78 20 2e 63 68 69  me! msg-box .chi
5fb0: 6c 64 2b 0a 3b 20 77 6d 73 67 2d 63 6c 61 73 73  ld+.; wmsg-class
5fc0: 20 74 6f 20 6d 73 67 3a 61 63 74 69 6f 6e 0a 3a   to msg:action.:
5fd0: 6e 6f 6e 61 6d 65 20 7b 20 64 3a 20 73 74 72 69  noname { d: stri
5fe0: 6e 67 20 2d 2d 20 6f 20 7d 0a 20 20 20 20 6c 61  ng -- o }.    la
5ff0: 73 74 2d 6f 74 72 3f 20 49 46 20 6c 69 67 68 74  st-otr? IF light
6000: 2d 62 6c 75 65 20 45 4c 53 45 20 64 61 72 6b 2d  -blue ELSE dark-
6010: 62 6c 75 65 20 54 48 45 4e 0a 20 20 20 20 73 74  blue THEN.    st
6020: 72 69 6e 67 20 5b 27 5d 20 75 74 66 38 2d 73 61  ring ['] utf8-sa
6030: 6e 69 74 69 7a 65 20 24 74 6d 70 20 7d 7d 74 65  nitize $tmp }}te
6040: 78 74 20 5f 75 6e 64 65 72 6c 69 6e 65 5f 20 32  xt _underline_ 2
6050: 35 25 62 76 0a 20 20 20 20 74 65 78 74 2d 63 6f  5%bv.    text-co
6060: 6c 6f 72 21 0a 20 20 20 20 5b 3a 20 64 61 74 61  lor!.    [: data
6070: 20 3e 6f 20 74 65 78 74 24 20 6f 3e 20 6f 70 65   >o text$ o> ope
6080: 6e 2d 75 72 6c 20 3b 5d 0a 20 20 20 20 6f 76 65  n-url ;].    ove
6090: 72 20 63 6c 69 63 6b 5b 5d 0a 20 20 20 20 63 6c  r click[].    cl
60a0: 69 63 6b 28 20 2e 22 20 75 72 6c 3a 20 22 20 64  ick( ." url: " d
60b0: 75 70 20 2e 2e 70 61 72 65 6e 74 73 20 63 72 20  up ..parents cr 
60c0: 29 0a 20 20 20 20 22 75 72 6c 22 20 6e 61 6d 65  ).    "url" name
60d0: 21 20 6d 73 67 2d 62 6f 78 20 2e 63 68 69 6c 64  ! msg-box .child
60e0: 2b 0a 3b 20 77 6d 73 67 2d 63 6c 61 73 73 20 74  +.; wmsg-class t
60f0: 6f 20 6d 73 67 3a 75 72 6c 0a 3a 6e 6f 6e 61 6d  o msg:url.:nonam
6100: 65 20 7b 20 64 3a 20 73 74 72 69 6e 67 20 2d 2d  e { d: string --
6110: 20 6f 20 7d 0a 20 20 20 20 7b 7b 0a 09 67 6c 75   o }.    {{..glu
6120: 65 2a 6c 20 24 46 46 43 43 43 43 46 46 20 6e 65  e*l $FFCCCCFF ne
6130: 77 2d 63 6f 6c 6f 72 2c 20 73 6c 69 64 65 2d 66  w-color, slide-f
6140: 72 61 6d 65 20 64 75 70 20 2e 62 75 74 74 6f 6e  rame dup .button
6150: 31 0a 09 73 74 72 69 6e 67 20 5b 3a 20 2e 22 20  1..string [: ." 
6160: 20 47 50 53 3a 20 22 20 2e 63 6f 6f 72 64 73 20   GPS: " .coords 
6170: 3b 5d 20 24 74 6d 70 20 7d 7d 74 65 78 74 20 32  ;] $tmp }}text 2
6180: 35 25 62 0a 20 20 20 20 7d 7d 7a 20 22 67 70 73  5%b.    }}z "gps
6190: 22 20 6e 61 6d 65 21 20 6d 73 67 2d 62 6f 78 20  " name! msg-box 
61a0: 2e 63 68 69 6c 64 2b 0a 3b 20 77 6d 73 67 2d 63  .child+.; wmsg-c
61b0: 6c 61 73 73 20 74 6f 20 6d 73 67 3a 63 6f 6f 72  lass to msg:coor
61c0: 64 0a 3a 6e 6f 6e 61 6d 65 20 7b 20 64 3a 20 70  d.:noname { d: p
61d0: 6b 20 2d 2d 20 6f 20 7d 0a 20 20 20 20 7b 7b 0a  k -- o }.    {{.
61e0: 09 78 2d 63 6f 6c 6f 72 20 7b 20 66 3a 20 78 63  .x-color { f: xc
61f0: 20 7d 0a 09 70 6b 20 6b 65 79 7c 0a 09 32 64 75   }..pk key|..2du
6200: 70 20 30 20 2e 70 6b 40 20 6b 65 79 7c 20 73 74  p 0 .pk@ key| st
6210: 72 3d 0a 09 6c 61 73 74 2d 6f 74 72 3f 20 49 46  r=..last-otr? IF
6220: 20 20 49 46 20 20 6d 79 2d 73 69 67 6e 61 6c 2d    IF  my-signal-
6230: 6f 74 72 20 20 45 4c 53 45 20 20 6f 74 68 65 72  otr  ELSE  other
6240: 2d 73 69 67 6e 61 6c 2d 6f 74 72 20 20 54 48 45  -signal-otr  THE
6250: 4e 0a 09 45 4c 53 45 20 20 49 46 20 20 6d 79 2d  N..ELSE  IF  my-
6260: 73 69 67 6e 61 6c 20 20 45 4c 53 45 20 20 6f 74  signal  ELSE  ot
6270: 68 65 72 2d 73 69 67 6e 61 6c 20 20 54 48 45 4e  her-signal  THEN
6280: 20 20 54 48 45 4e 0a 09 78 2d 63 6f 6c 6f 72 20    THEN..x-color 
6290: 67 6c 75 65 2a 6c 20 73 6c 69 64 65 2d 66 72 61  glue*l slide-fra
62a0: 6d 65 20 64 75 70 20 2e 62 75 74 74 6f 6e 31 20  me dup .button1 
62b0: 34 30 25 62 20 3e 72 0a 09 62 6c 61 63 6b 23 20  40%b >r..black# 
62c0: 74 6f 20 78 2d 63 6f 6c 6f 72 0a 09 5b 3a 20 27  to x-color..[: '
62d0: 40 27 20 65 6d 69 74 20 2e 6b 65 79 2d 69 64 20  @' emit .key-id 
62e0: 3b 5d 20 24 74 6d 70 20 5b 27 5d 20 75 74 66 38  ;] $tmp ['] utf8
62f0: 2d 73 61 6e 69 74 69 7a 65 20 24 74 6d 70 20 7d  -sanitize $tmp }
6300: 7d 74 65 78 74 20 32 35 25 62 20 72 3e 20 73 77  }text 25%b r> sw
6310: 61 70 0a 09 78 63 20 74 6f 20 78 2d 63 6f 6c 6f  ap..xc to x-colo
6320: 72 0a 20 20 20 20 7d 7d 7a 20 6d 73 67 2d 62 6f  r.    }}z msg-bo
6330: 78 20 2e 63 68 69 6c 64 2b 0a 3b 20 77 6d 73 67  x .child+.; wmsg
6340: 2d 63 6c 61 73 73 20 74 6f 20 6d 73 67 3a 73 69  -class to msg:si
6350: 67 6e 61 6c 0a 3a 6e 6f 6e 61 6d 65 20 28 20 61  gnal.:noname ( a
6360: 64 64 72 20 75 20 2d 2d 20 29 0a 20 20 20 20 72  ddr u -- ).    r
6370: 65 2d 67 72 65 65 6e 20 5b 3a 20 2e 22 20 5b 22  e-green [: ." ["
6380: 20 38 35 74 79 70 65 20 2e 22 20 5d e2 86 92 22   85type ." ]→"
6390: 20 3b 5d 20 24 74 6d 70 20 7d 7d 74 65 78 74 20   ;] $tmp }}text 
63a0: 6d 73 67 2d 62 6f 78 20 2e 63 68 69 6c 64 2b 0a  msg-box .child+.
63b0: 20 20 20 20 74 65 78 74 2d 63 6f 6c 6f 72 21 0a      text-color!.
63c0: 3b 20 77 6d 73 67 2d 63 6c 61 73 73 20 74 6f 20  ; wmsg-class to 
63d0: 6d 73 67 3a 72 65 0a 3a 6e 6f 6e 61 6d 65 20 28  msg:re.:noname (
63e0: 20 61 64 64 72 20 75 20 2d 2d 20 29 0a 20 20 20   addr u -- ).   
63f0: 20 6f 62 6a 2d 72 65 64 20 5b 3a 20 2e 22 20 5b   obj-red [: ." [
6400: 22 20 38 35 74 79 70 65 20 2e 22 20 5d 3a 22 20  " 85type ." ]:" 
6410: 3b 5d 20 24 74 6d 70 20 7d 7d 74 65 78 74 20 6d  ;] $tmp }}text m
6420: 73 67 2d 62 6f 78 20 2e 63 68 69 6c 64 2b 0a 20  sg-box .child+. 
6430: 20 20 20 74 65 78 74 2d 63 6f 6c 6f 72 21 0a 3b     text-color!.;
6440: 20 77 6d 73 67 2d 63 6c 61 73 73 20 74 6f 20 6d   wmsg-class to m
6450: 73 67 3a 69 64 0a 3a 6e 6f 6e 61 6d 65 20 7b 20  sg:id.:noname { 
6460: 73 69 67 20 75 27 20 61 64 64 72 20 75 20 2d 2d  sig u' addr u --
6470: 20 7d 0a 20 20 20 20 75 27 20 36 34 27 2b 20 75   }.    u' 64'+ u
6480: 20 3d 20 20 75 20 73 69 67 73 69 7a 65 23 20 3d   =  u sigsize# =
6490: 20 61 6e 64 20 49 46 0a 09 6c 61 73 74 23 20 3e   and IF..last# >
64a0: 72 20 6c 61 73 74 23 20 24 40 20 3f 6d 73 67 2d  r last# $@ ?msg-
64b0: 6c 6f 67 0a 09 61 64 64 72 20 75 20 73 74 61 72  log..addr u star
64c0: 74 64 61 74 65 40 20 36 34 64 75 70 20 64 61 74  tdate@ 64dup dat
64d0: 65 3e 69 20 3e 72 20 36 34 23 31 20 36 34 2b 20  e>i >r 64#1 64+ 
64e0: 64 61 74 65 3e 69 27 20 72 3e 0a 09 5c 20 32 64  date>i' r>..\ 2d
64f0: 75 70 20 3d 20 49 46 20 20 2e 22 20 20 5b 6f 74  up = IF  ."  [ot
6500: 72 69 66 69 65 64 5d 20 22 20 20 61 64 64 72 20  rified] "  addr 
6510: 75 20 73 74 61 72 74 64 61 74 65 40 20 2e 74 69  u startdate@ .ti
6520: 63 6b 73 20 20 54 48 45 4e 0a 09 55 2b 44 4f 0a  cks  THEN..U+DO.
6530: 09 20 20 20 20 49 20 6c 61 73 74 23 20 63 65 6c  .    I last# cel
6540: 6c 2b 20 24 5b 5d 40 0a 09 20 20 20 20 32 64 75  l+ $[]@..    2du
6550: 70 20 64 75 70 20 73 69 67 70 6b 73 69 7a 65 23  p dup sigpksize#
6560: 20 2d 20 2f 73 74 72 69 6e 67 20 6b 65 79 7c 20   - /string key| 
6570: 6d 73 67 3a 69 64 24 20 73 74 72 3d 20 49 46 0a  msg:id$ str= IF.
6580: 09 09 64 75 70 20 75 20 2d 20 2f 73 74 72 69 6e  ..dup u - /strin
6590: 67 20 61 64 64 72 20 75 20 73 74 72 3d 20 49 46  g addr u str= IF
65a0: 0a 09 09 20 20 20 20 49 20 5b 3a 20 2e 22 20 20  ...    I [: ."  
65b0: 5b 4f 54 52 69 66 79 69 6e 67 5d 20 23 22 20 75  [OTRifying] #" u
65c0: 2e 20 66 6f 72 74 68 3a 63 72 20 3b 5d 20 64 6f  . forth:cr ;] do
65d0: 2d 64 65 62 75 67 0a 09 09 20 20 20 20 49 20 5b  -debug...    I [
65e0: 3a 20 2e 22 20 20 4f 54 52 69 66 79 20 23 22 20  : ."  OTRify #" 
65f0: 75 2e 20 3b 5d 20 24 74 6d 70 0a 09 09 20 20 20  u. ;] $tmp...   
6600: 20 5c 69 74 61 6c 69 63 20 7d 7d 74 65 78 74 20   \italic }}text 
6610: 32 35 25 62 76 20 5c 72 65 67 75 6c 61 72 20 6c  25%bv \regular l
6620: 69 67 68 74 2d 62 6c 75 65 20 74 65 78 74 2d 63  ight-blue text-c
6630: 6f 6c 6f 72 21 0a 09 09 20 20 20 20 22 6f 74 72  olor!...    "otr
6640: 69 66 79 22 20 6e 61 6d 65 21 20 6d 73 67 2d 62  ify" name! msg-b
6650: 6f 78 20 2e 63 68 69 6c 64 2b 0a 09 09 20 20 20  ox .child+...   
6660: 20 73 69 67 20 75 27 20 49 20 6c 61 73 74 23 20   sig u' I last# 
6670: 63 65 6c 6c 2b 20 24 5b 5d 40 20 72 65 70 6c 61  cell+ $[]@ repla
6680: 63 65 2d 73 69 67 0a 09 09 20 20 20 20 5c 20 21  ce-sig...    \ !
6690: 21 53 63 68 65 64 75 6c 65 20 6d 65 73 73 61 67  !Schedule messag
66a0: 65 20 73 61 76 69 6e 67 21 21 0a 09 09 45 4c 53  e saving!!...ELS
66b0: 45 0a 09 09 20 20 20 20 49 20 5b 3a 20 2e 22 20  E...    I [: ." 
66c0: 20 5b 4f 54 52 69 66 69 65 64 5d 20 23 22 20 75   [OTRified] #" u
66d0: 2e 20 66 6f 72 74 68 3a 63 72 20 3b 5d 20 64 6f  . forth:cr ;] do
66e0: 2d 64 65 62 75 67 0a 09 09 54 48 45 4e 0a 09 20  -debug...THEN.. 
66f0: 20 20 20 45 4c 53 45 0a 09 09 49 20 5b 3a 20 2e     ELSE...I [: .
6700: 22 20 20 5b 4f 54 52 69 66 69 67 6e 6f 72 65 5d  "  [OTRifignore]
6710: 20 23 22 20 75 2e 20 66 6f 72 74 68 3a 63 72 20   #" u. forth:cr 
6720: 3b 5d 20 64 6f 2d 64 65 62 75 67 0a 09 09 32 64  ;] do-debug...2d
6730: 72 6f 70 0a 09 20 20 20 20 54 48 45 4e 0a 09 4c  rop..    THEN..L
6740: 4f 4f 50 0a 09 72 3e 20 74 6f 20 6c 61 73 74 23  OOP..r> to last#
6750: 0a 20 20 20 20 54 48 45 4e 20 3b 20 77 6d 73 67  .    THEN ; wmsg
6760: 2d 63 6c 61 73 73 20 69 73 20 6d 73 67 3a 6f 74  -class is msg:ot
6770: 72 69 66 79 0a 3a 6e 6f 6e 61 6d 65 20 28 20 61  rify.:noname ( a
6780: 64 64 72 20 75 20 74 79 70 65 20 2d 2d 20 29 0a  ddr u type -- ).
6790: 20 20 20 20 6f 62 6a 2d 72 65 64 0a 20 20 20 20      obj-red.    
67a0: 5b 3a 20 63 61 73 65 20 30 20 3e 72 0a 09 20 20  [: case 0 >r..  
67b0: 20 20 6d 73 67 3a 69 6d 61 67 65 23 20 20 20 20    msg:image#    
67c0: 20 6f 66 20 20 2e 22 20 69 6d 67 5b 22 20 20 20   of  ." img["   
67d0: 20 20 20 38 35 74 79 70 65 20 20 65 6e 64 6f 66     85type  endof
67e0: 0a 09 20 20 20 20 6d 73 67 3a 74 68 75 6d 62 6e  ..    msg:thumbn
67f0: 61 69 6c 23 20 6f 66 20 20 2e 22 20 74 68 75 6d  ail# of  ." thum
6800: 62 5b 22 20 20 20 20 38 35 74 79 70 65 20 20 65  b["    85type  e
6810: 6e 64 6f 66 0a 09 20 20 20 20 6d 73 67 3a 70 61  ndof..    msg:pa
6820: 74 63 68 23 20 20 20 20 20 6f 66 20 20 2e 22 20  tch#     of  ." 
6830: 70 61 74 63 68 5b 22 20 20 20 20 38 35 74 79 70  patch["    85typ
6840: 65 20 20 65 6e 64 6f 66 0a 09 20 20 20 20 6d 73  e  endof..    ms
6850: 67 3a 73 6e 61 70 73 68 6f 74 23 20 20 6f 66 20  g:snapshot#  of 
6860: 20 2e 22 20 73 6e 61 70 73 68 6f 74 5b 22 20 38   ." snapshot[" 8
6870: 35 74 79 70 65 20 20 65 6e 64 6f 66 0a 09 20 20  5type  endof..  
6880: 20 20 6d 73 67 3a 6d 65 73 73 61 67 65 23 20 20    msg:message#  
6890: 20 6f 66 20 20 2e 22 20 6d 65 73 73 61 67 65 5b   of  ." message[
68a0: 22 20 20 38 35 74 79 70 65 20 20 65 6e 64 6f 66  "  85type  endof
68b0: 0a 09 20 20 20 20 6d 73 67 3a 70 6f 73 74 69 6e  ..    msg:postin
68c0: 67 23 20 20 20 6f 66 20 20 2e 22 20 70 6f 73 74  g#   of  ." post
68d0: 69 6e 67 22 0a 09 09 72 64 72 6f 70 20 32 64 75  ing"...rdrop 2du
68e0: 70 20 5b 64 3a 68 20 6f 70 65 6e 2d 70 6f 73 74  p [d:h open-post
68f0: 69 6e 67 20 3b 5d 20 3e 72 0a 09 09 2e 70 6f 73  ing ;] >r....pos
6900: 74 69 6e 67 0a 09 20 20 20 20 65 6e 64 6f 66 0a  ting..    endof.
6910: 09 65 6e 64 63 61 73 65 20 2e 22 20 5d 22 20 72  .endcase ." ]" r
6920: 3e 20 3b 5d 20 24 74 6d 70 20 7d 7d 74 65 78 74  > ;] $tmp }}text
6930: 0a 20 20 20 20 73 77 61 70 20 3f 64 75 70 2d 49  .    swap ?dup-I
6940: 46 20 20 30 20 63 6c 69 63 6b 5b 5d 20 20 54 48  F  0 click[]  TH
6950: 45 4e 0a 20 20 20 20 22 6f 62 6a 65 63 74 22 20  EN.    "object" 
6960: 6e 61 6d 65 21 20 6d 73 67 2d 62 6f 78 20 2e 63  name! msg-box .c
6970: 68 69 6c 64 2b 0a 20 20 20 20 74 65 78 74 2d 63  hild+.    text-c
6980: 6f 6c 6f 72 21 0a 3b 20 77 6d 73 67 2d 63 6c 61  olor!.; wmsg-cla
6990: 73 73 20 69 73 20 6d 73 67 3a 6f 62 6a 65 63 74  ss is msg:object
69a0: 0a 0a 69 6e 20 6e 65 74 32 6f 20 3a 20 6e 65 77  ..in net2o : new
69b0: 2d 77 6d 73 67 20 28 20 6f 3a 63 6f 6e 6e 65 63  -wmsg ( o:connec
69c0: 74 69 6f 6e 20 2d 2d 20 6f 20 29 0a 20 20 20 20  tion -- o ).    
69d0: 6f 20 77 6d 73 67 2d 63 6c 61 73 73 20 6e 65 77  o wmsg-class new
69e0: 20 3e 6f 20 20 70 61 72 65 6e 74 21 20 20 6d 73   >o  parent!  ms
69f0: 67 2d 74 61 62 6c 65 20 40 20 74 6f 6b 65 6e 2d  g-table @ token-
6a00: 74 61 62 6c 65 20 21 20 6f 20 6f 3e 20 3b 0a 27  table ! o o> ;.'
6a10: 20 6e 65 74 32 6f 3a 6e 65 77 2d 77 6d 73 67 20   net2o:new-wmsg 
6a20: 69 73 20 6e 65 74 32 6f 3a 6e 65 77 2d 6d 73 67  is net2o:new-msg
6a30: 0a 0a 77 6d 73 67 2d 63 6c 61 73 73 20 27 20 6e  ..wmsg-class ' n
6a40: 65 77 20 73 74 61 74 69 63 2d 61 20 77 69 74 68  ew static-a with
6a50: 2d 61 6c 6c 6f 63 61 74 65 72 20 43 6f 6e 73 74  -allocater Const
6a60: 61 6e 74 20 77 6d 73 67 2d 6f 0a 77 6d 73 67 2d  ant wmsg-o.wmsg-
6a70: 6f 20 3e 6f 20 6d 73 67 2d 74 61 62 6c 65 20 40  o >o msg-table @
6a80: 20 74 6f 6b 65 6e 2d 74 61 62 6c 65 20 21 20 6f   token-table ! o
6a90: 3e 0a 0a 3a 20 76 70 2d 73 6f 66 74 62 6f 74 74  >..: vp-softbott
6aa0: 6f 6d 20 28 20 6f 3a 76 69 65 77 70 6f 72 74 20  om ( o:viewport 
6ab0: 2d 2d 20 29 0a 20 20 20 20 61 63 74 20 3e 6f 20  -- ).    act >o 
6ac0: 6f 20 61 6e 69 6d 2d 64 65 6c 20 20 73 65 74 2d  o anim-del  set-
6ad0: 73 74 61 72 74 78 79 0a 20 20 20 20 30 65 20 20  startxy.    0e  
6ae0: 20 20 20 20 20 20 20 20 20 74 6f 20 76 6d 6f 74           to vmot
6af0: 69 6f 6e 2d 64 78 0a 20 20 20 20 76 70 2d 79 20  ion-dx.    vp-y 
6b00: 66 6e 65 67 61 74 65 20 74 6f 20 76 6d 6f 74 69  fnegate to vmoti
6b10: 6f 6e 2d 64 79 0a 20 20 20 20 30 2e 33 33 33 65  on-dy.    0.333e
6b20: 20 6f 20 5b 27 5d 20 76 70 2d 73 63 72 6f 6c 6c   o ['] vp-scroll
6b30: 20 3e 61 6e 69 6d 61 74 65 20 6f 3e 20 3b 0a 0a   >animate o> ;..
6b40: 3a 20 77 6d 73 67 2d 64 69 73 70 6c 61 79 20 28  : wmsg-display (
6b50: 20 61 64 64 72 20 75 20 2d 2d 20 29 0a 20 20 20   addr u -- ).   
6b60: 20 6d 73 67 2d 74 64 69 73 70 6c 61 79 0a 20 20   msg-tdisplay.  
6b70: 20 20 6d 73 67 73 2d 62 6f 78 20 3e 6f 20 5b 3a    msgs-box >o [:
6b80: 20 2b 73 79 6e 63 20 2b 72 65 73 69 7a 65 20 3b   +sync +resize ;
6b90: 5d 20 76 70 2d 6e 65 65 64 65 64 20 76 70 2d 62  ] vp-needed vp-b
6ba0: 6f 74 74 6f 6d 0a 20 20 20 20 2b 73 79 6e 63 20  ottom.    +sync 
6bb0: 2b 72 65 73 69 7a 65 20 6f 3e 20 3b 0a 27 20 77  +resize o> ;.' w
6bc0: 6d 73 67 2d 64 69 73 70 6c 61 79 20 77 6d 73 67  msg-display wmsg
6bd0: 2d 63 6c 61 73 73 20 74 6f 20 6d 73 67 3a 64 69  -class to msg:di
6be0: 73 70 6c 61 79 0a 0a 23 31 32 38 20 56 61 6c 75  splay..#128 Valu
6bf0: 65 20 67 75 69 2d 6d 73 67 73 23 20 5c 20 64 69  e gui-msgs# \ di
6c00: 73 70 6c 61 79 20 6c 61 73 74 20 31 32 38 20 6d  splay last 128 m
6c10: 65 73 73 61 67 65 73 0a 30 20 56 61 6c 75 65 20  essages.0 Value 
6c20: 63 68 61 74 2d 65 64 69 74 20 20 20 20 5c 20 63  chat-edit    \ c
6c30: 68 61 74 20 65 64 69 74 20 66 69 65 6c 64 0a 0a  hat edit field..
6c40: 3a 20 28 67 75 69 2d 6d 73 67 73 29 20 28 20 67  : (gui-msgs) ( g
6c50: 61 64 64 72 20 75 20 2d 2d 20 29 0a 20 20 20 20  addr u -- ).    
6c60: 72 65 73 65 74 2d 74 69 6d 65 0a 20 20 20 20 36  reset-time.    6
6c70: 34 23 30 20 74 6f 20 6c 61 73 74 2d 74 69 63 6b  4#0 to last-tick
6c80: 20 20 6c 61 73 74 2d 62 75 62 62 6c 65 2d 70 6b    last-bubble-pk
6c90: 20 24 66 72 65 65 0a 20 20 20 20 30 20 74 6f 20   $free.    0 to 
6ca0: 6d 73 67 2d 70 61 72 20 20 30 20 74 6f 20 6d 73  msg-par  0 to ms
6cb0: 67 2d 62 6f 78 0a 20 20 20 20 6d 73 67 73 2d 62  g-box.    msgs-b
6cc0: 6f 78 20 2e 64 69 73 70 6f 73 65 2d 63 68 69 6c  ox .dispose-chil
6cd0: 64 73 0a 20 20 20 20 67 6c 75 65 2a 6c 6c 6c 20  ds.    glue*lll 
6ce0: 7d 7d 67 6c 75 65 20 6d 73 67 73 2d 62 6f 78 20  }}glue msgs-box 
6cf0: 2e 63 68 69 6c 64 2b 0a 20 20 20 20 32 64 75 70  .child+.    2dup
6d00: 20 6c 6f 61 64 2d 6d 73 67 20 3f 6d 73 67 2d 6c   load-msg ?msg-l
6d10: 6f 67 0a 20 20 20 20 6c 61 73 74 23 20 6d 73 67  og.    last# msg
6d20: 2d 6c 6f 67 40 20 32 64 75 70 20 7b 20 6c 6f 67  -log@ 2dup { log
6d30: 20 75 20 7d 0a 20 20 20 20 64 75 70 20 67 75 69   u }.    dup gui
6d40: 2d 6d 73 67 73 23 20 63 65 6c 6c 73 20 2d 20 30  -msgs# cells - 0
6d50: 20 6d 61 78 20 2f 73 74 72 69 6e 67 20 62 6f 75   max /string bou
6d60: 6e 64 73 20 3f 44 4f 0a 09 49 20 24 40 20 7b 20  nds ?DO..I $@ { 
6d70: 64 3a 20 6d 73 67 74 20 7d 0a 09 6d 73 67 74 20  d: msgt }..msgt 
6d80: 5b 27 5d 20 77 6d 73 67 2d 64 69 73 70 6c 61 79  ['] wmsg-display
6d90: 20 77 6d 73 67 2d 6f 20 2e 63 61 74 63 68 20 49   wmsg-o .catch I
6da0: 46 0a 09 20 20 20 20 3c 65 72 72 3e 20 2e 22 20  F..    <err> ." 
6db0: 69 6e 76 61 6c 69 64 20 65 6e 74 72 79 22 20 3c  invalid entry" <
6dc0: 64 65 66 61 75 6c 74 3e 20 32 64 72 6f 70 0a 09  default> 2drop..
6dd0: 54 48 45 4e 0a 20 20 20 20 63 65 6c 6c 20 2b 4c  THEN.    cell +L
6de0: 4f 4f 50 0a 20 20 20 20 6c 6f 67 20 66 72 65 65  OOP.    log free
6df0: 20 74 68 72 6f 77 20 20 6d 73 67 73 2d 62 6f 78   throw  msgs-box
6e00: 20 3e 6f 20 72 65 73 69 7a 65 64 20 76 70 2d 62   >o resized vp-b
6e10: 6f 74 74 6f 6d 20 6f 3e 0a 20 20 20 20 63 68 61  ottom o>.    cha
6e20: 74 2d 65 64 69 74 20 65 6e 67 61 67 65 20 3b 0a  t-edit engage ;.
6e30: 0a 3a 20 67 75 69 2d 6d 73 67 73 20 28 20 67 61  .: gui-msgs ( ga
6e40: 64 64 72 20 75 20 2d 2d 20 29 0a 20 20 20 20 32  ddr u -- ).    2
6e50: 64 75 70 20 6d 73 67 2d 67 72 6f 75 70 24 20 24  dup msg-group$ $
6e60: 21 20 28 67 75 69 2d 6d 73 67 73 29 20 3b 0a 0a  ! (gui-msgs) ;..
6e70: 3a 20 6d 73 67 2d 77 72 65 64 69 73 70 6c 61 79  : msg-wredisplay
6e80: 20 28 20 6e 20 2d 2d 20 29 0a 20 20 20 20 64 72   ( n -- ).    dr
6e90: 6f 70 20 30 20 6f 74 72 2d 6d 6f 64 65 0a 20 20  op 0 otr-mode.  
6ea0: 20 20 5b 3a 20 6d 73 67 2d 67 72 6f 75 70 24 20    [: msg-group$ 
6eb0: 24 40 20 28 67 75 69 2d 6d 73 67 73 29 20 3b 5d  $@ (gui-msgs) ;]
6ec0: 20 21 77 72 61 70 70 65 72 0a 20 20 20 20 6d 73   !wrapper.    ms
6ed0: 67 73 2d 62 6f 78 20 3e 6f 20 5b 3a 20 2b 73 79  gs-box >o [: +sy
6ee0: 6e 63 20 2b 72 65 73 69 7a 65 20 3b 5d 20 76 70  nc +resize ;] vp
6ef0: 2d 6e 65 65 64 65 64 20 76 70 2d 62 6f 74 74 6f  -needed vp-botto
6f00: 6d 0a 20 20 20 20 2b 73 79 6e 63 20 2b 72 65 73  m.    +sync +res
6f10: 69 7a 65 20 6f 3e 20 20 3b 0a 27 20 6d 73 67 2d  ize o>  ;.' msg-
6f20: 77 72 65 64 69 73 70 6c 61 79 20 77 6d 73 67 2d  wredisplay wmsg-
6f30: 63 6c 61 73 73 20 69 73 20 6d 73 67 3a 72 65 64  class is msg:red
6f40: 69 73 70 6c 61 79 0a 0a 5b 49 46 44 45 46 5d 20  isplay..[IFDEF] 
6f50: 61 6e 64 72 6f 69 64 20 61 6c 73 6f 20 61 6e 64  android also and
6f60: 72 6f 69 64 20 5b 54 48 45 4e 5d 0a 0a 3a 20 63  roid [THEN]..: c
6f70: 68 61 74 2d 65 64 69 74 2d 65 6e 74 65 72 20 28  hat-edit-enter (
6f80: 20 6f 3a 65 64 69 74 2d 77 20 2d 2d 20 29 0a 20   o:edit-w -- ). 
6f90: 20 20 20 74 65 78 74 24 20 64 75 70 20 49 46 20     text$ dup IF 
6fa0: 20 64 6f 2d 63 68 61 74 2d 63 6d 64 3f 20 30 3d   do-chat-cmd? 0=
6fb0: 20 49 46 20 20 61 76 61 6c 61 6e 63 68 65 2d 74   IF  avalanche-t
6fc0: 65 78 74 20 20 54 48 45 4e 0a 20 20 20 20 45 4c  ext  THEN.    EL
6fd0: 53 45 20 20 32 64 72 6f 70 20 20 54 48 45 4e 0a  SE  2drop  THEN.
6fe0: 20 20 20 20 36 34 23 2d 31 20 6c 69 6e 65 2d 64      64#-1 line-d
6ff0: 61 74 65 20 36 34 21 20 20 24 6c 61 73 74 6c 69  ate 64!  $lastli
7000: 6e 65 20 24 66 72 65 65 20 3b 0a 0a 5c 20 2b 64  ne $free ;..\ +d
7010: 62 20 63 6c 69 63 6b 28 20 5c 20 29 0a 5c 20 2b  b click( \ ).\ +
7020: 64 62 20 63 6c 69 63 6b 2d 6f 28 20 5c 20 29 0a  db click-o( \ ).
7030: 5c 20 2b 64 62 20 67 75 69 28 20 5c 20 29 0a 0a  \ +db gui( \ )..
7040: 7b 7b 20 63 68 61 74 2d 62 67 2d 63 6f 6c 23 20  {{ chat-bg-col# 
7050: 70 72 65 73 2d 66 72 61 6d 65 0a 20 20 20 20 7b  pres-frame.    {
7060: 7b 0a 09 7b 7b 0a 09 20 20 20 20 67 6c 75 65 2a  {..{{..    glue*
7070: 6c 20 62 6c 61 63 6b 23 20 73 6c 69 64 65 2d 66  l black# slide-f
7080: 72 61 6d 65 20 64 75 70 20 2e 62 75 74 74 6f 6e  rame dup .button
7090: 31 0a 09 20 20 20 20 7b 7b 0a 09 09 5c 6c 61 72  1..    {{...\lar
70a0: 67 65 20 72 65 61 6c 77 68 69 74 65 0a 09 09 22  ge realwhite..."
70b0: e2 ac 85 22 20 7d 7d 74 65 78 74 20 34 30 25 62  ⬅" }}text 40%b
70c0: 20 5b 3a 20 69 6e 2d 67 72 6f 75 70 3f 20 30 3d   [: in-group? 0=
70d0: 20 3f 45 58 49 54 20 20 66 61 6c 73 65 20 74 6f   ?EXIT  false to
70e0: 20 69 6e 2d 67 72 6f 75 70 3f 0a 09 09 20 20 20   in-group?...   
70f0: 20 6c 65 61 76 65 2d 63 68 61 74 73 20 70 72 65   leave-chats pre
7100: 76 2d 73 6c 69 64 65 20 3b 5d 20 6f 76 65 72 20  v-slide ;] over 
7110: 63 6c 69 63 6b 5b 5d 0a 09 09 21 69 31 38 6e 20  click[]...!i18n 
7120: 6c 22 20 ef 82 86 22 20 7d 7d 74 65 78 74 27 20  l" " }}text' 
7130: 21 6c 69 74 20 34 30 25 62 0a 09 09 22 22 20 7d  !lit 40%b..."" }
7140: 7d 74 65 78 74 20 34 30 25 62 20 64 75 70 20 74  }text 40%b dup t
7150: 6f 20 67 72 6f 75 70 2d 6e 61 6d 65 0a 09 09 7b  o group-name...{
7160: 7b 0a 09 09 7d 7d 68 20 62 6f 78 5b 5d 20 64 75  {...}}h box[] du
7170: 70 20 74 6f 20 67 72 6f 75 70 2d 6d 65 6d 62 65  p to group-membe
7180: 72 73 0a 09 09 67 6c 75 65 2a 6c 20 7d 7d 67 6c  rs...glue*l }}gl
7190: 75 65 0a 09 20 20 20 20 7d 7d 68 20 62 6f 78 5b  ue..    }}h box[
71a0: 5d 0a 09 7d 7d 7a 20 62 6f 78 5b 5d 0a 09 7b 7b  ]..}}z box[]..{{
71b0: 0a 09 20 20 20 20 7b 7b 0a 09 09 7b 7b 0a 09 09  ..    {{...{{...
71c0: 74 65 78 3a 20 76 70 2d 63 68 61 74 73 20 76 70  tex: vp-chats vp
71d0: 2d 63 68 61 74 73 20 67 6c 75 65 2a 6c 6c 6c 20  -chats glue*lll 
71e0: 27 20 76 70 2d 63 68 61 74 73 20 7d 7d 76 70 20  ' vp-chats }}vp 
71f0: 76 70 5b 5d 0a 09 09 64 75 70 20 74 6f 20 6d 73  vp[]...dup to ms
7200: 67 73 2d 62 6f 78 0a 09 09 64 75 70 20 66 6f 6e  gs-box...dup fon
7210: 74 2d 73 69 7a 65 23 20 36 36 25 20 66 2a 20 66  t-size# 66% f* f
7220: 64 75 70 20 76 73 6c 69 64 65 72 0a 09 20 20 20  dup vslider..   
7230: 20 6f 76 65 72 20 3e 72 20 7d 7d 68 20 62 6f 78   over >r }}h box
7240: 5b 5d 20 72 3e 0a 09 20 20 20 20 66 6f 6e 74 2d  [] r>..    font-
7250: 73 69 7a 65 23 20 36 36 25 20 66 2a 20 66 64 75  size# 66% f* fdu
7260: 70 20 68 73 6c 69 64 65 72 0a 09 7d 7d 76 20 62  p hslider..}}v b
7270: 6f 78 5b 5d 0a 09 7b 7b 0a 09 20 20 20 20 7b 7b  ox[]..{{..    {{
7280: 20 67 6c 75 65 2a 6c 6c 6c 20 65 64 69 74 2d 62   glue*lll edit-b
7290: 67 20 78 2d 63 6f 6c 6f 72 20 66 6f 6e 74 2d 73  g x-color font-s
72a0: 69 7a 65 23 20 34 30 25 20 66 2a 20 7d 7d 66 72  ize# 40% f* }}fr
72b0: 61 6d 65 20 64 75 70 20 2e 62 75 74 74 6f 6e 33  ame dup .button3
72c0: 0a 09 09 7b 7b 20 5c 6e 6f 72 6d 61 6c 20 5c 72  ...{{ \normal \r
72d0: 65 67 75 6c 61 72 20 62 6c 61 63 6b 69 73 68 20  egular blackish 
72e0: 22 22 20 7d 7d 65 64 69 74 20 34 30 25 62 20 64  "" }}edit 40%b d
72f0: 75 70 20 74 6f 20 63 68 61 74 2d 65 64 69 74 20  up to chat-edit 
7300: 67 6c 75 65 2a 6c 20 7d 7d 67 6c 75 65 0a 09 09  glue*l }}glue...
7310: 20 20 20 20 67 6c 75 65 2a 6c 6c 6c 20 7d 7d 67      glue*lll }}g
7320: 6c 75 65 0a 09 09 7d 7d 68 20 62 6f 78 5b 5d 0a  lue...}}h box[].
7330: 09 20 20 20 20 7d 7d 7a 20 63 68 61 74 2d 65 64  .    }}z chat-ed
7340: 69 74 20 5b 3a 20 65 64 69 74 2d 77 20 2e 63 68  it [: edit-w .ch
7350: 61 74 2d 65 64 69 74 2d 65 6e 74 65 72 20 64 72  at-edit-enter dr
7360: 6f 70 20 6e 69 70 20 30 20 74 75 63 6b 20 66 61  op nip 0 tuck fa
7370: 6c 73 65 20 3b 5d 20 65 64 69 74 5b 5d 20 27 20  lse ;] edit[] ' 
7380: 73 69 7a 65 2d 6c 69 6d 69 74 20 66 69 6c 74 65  size-limit filte
7390: 72 5b 5d 0a 09 20 20 20 20 3e 6f 20 61 63 74 20  r[]..    >o act 
73a0: 3e 6f 20 5b 3a 20 63 6f 6e 6e 65 63 74 69 6f 6e  >o [: connection
73b0: 20 2e 63 68 61 74 2d 6e 65 78 74 2d 6c 69 6e 65   .chat-next-line
73c0: 20 3b 5d 20 69 73 20 65 64 69 74 2d 6e 65 78 74   ;] is edit-next
73d0: 2d 6c 69 6e 65 20 6f 3e 20 6f 20 6f 3e 0a 09 20  -line o> o o>.. 
73e0: 20 20 20 3e 6f 20 61 63 74 20 3e 6f 20 5b 3a 20     >o act >o [: 
73f0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2e 63 68 61 74  connection .chat
7400: 2d 70 72 65 76 2d 6c 69 6e 65 20 3b 5d 20 69 73  -prev-line ;] is
7410: 20 65 64 69 74 2d 70 72 65 76 2d 6c 69 6e 65 20   edit-prev-line 
7420: 6f 3e 20 6f 20 6f 3e 0a 09 20 20 20 20 7b 7b 0a  o> o o>..    {{.
7430: 09 09 67 6c 75 65 2a 6c 20 73 65 6e 64 2d 63 6f  ..glue*l send-co
7440: 6c 6f 72 20 78 2d 63 6f 6c 6f 72 20 66 6f 6e 74  lor x-color font
7450: 2d 73 69 7a 65 23 20 34 30 25 20 66 2a 20 7d 7d  -size# 40% f* }}
7460: 66 72 61 6d 65 20 64 75 70 20 2e 62 75 74 74 6f  frame dup .butto
7470: 6e 32 0a 09 09 62 6c 61 63 6b 69 73 68 20 21 69  n2...blackish !i
7480: 31 38 6e 20 6c 22 20 53 65 6e 64 22 20 7d 7d 74  18n l" Send" }}t
7490: 65 78 74 27 20 21 6c 69 74 20 34 30 25 62 0a 09  ext' !lit 40%b..
74a0: 09 5b 3a 20 64 61 74 61 20 3e 6f 20 63 68 61 74  .[: data >o chat
74b0: 2d 65 64 69 74 2d 65 6e 74 65 72 20 22 22 20 74  -edit-enter "" t
74c0: 6f 20 74 65 78 74 24 20 6f 3e 0a 09 09 20 20 20  o text$ o>...   
74d0: 20 63 68 61 74 2d 65 64 69 74 20 65 6e 67 61 67   chat-edit engag
74e0: 65 20 3b 5d 20 63 68 61 74 2d 65 64 69 74 20 63  e ;] chat-edit c
74f0: 6c 69 63 6b 5b 5d 0a 09 20 20 20 20 7d 7d 7a 20  lick[]..    }}z 
7500: 62 6f 78 5b 5d 0a 09 7d 7d 68 20 62 6f 78 5b 5d  box[]..}}h box[]
7510: 0a 20 20 20 20 7d 7d 76 20 62 6f 78 5b 5d 0a 7d  .    }}v box[].}
7520: 7d 7a 20 62 6f 78 5b 5d 20 74 6f 20 63 68 61 74  }z box[] to chat
7530: 2d 66 72 61 6d 65 0a 0a 5b 49 46 44 45 46 5d 20  -frame..[IFDEF] 
7540: 61 6e 64 72 6f 69 64 20 70 72 65 76 69 6f 75 73  android previous
7550: 20 5b 54 48 45 4e 5d 0a 0a 5c 20 74 6f 70 20 62   [THEN]..\ top b
7560: 6f 78 0a 0a 62 6f 78 2d 61 63 74 6f 72 20 63 6c  ox..box-actor cl
7570: 61 73 73 0a 65 6e 64 2d 63 6c 61 73 73 20 6e 65  ass.end-class ne
7580: 74 32 6f 2d 61 63 74 6f 72 0a 0a 3a 6e 6f 6e 61  t2o-actor..:nona
7590: 6d 65 20 28 20 65 6b 65 79 20 2d 2d 20 29 0a 20  me ( ekey -- ). 
75a0: 20 20 20 63 61 73 65 0a 09 6b 2d 66 35 20 6f 66     case..k-f5 of
75b0: 20 20 63 6f 6c 6f 72 2d 74 68 65 6d 65 20 30 3d    color-theme 0=
75c0: 20 20 49 46 20 20 61 6e 69 6d 2d 65 6e 64 20 30    IF  anim-end 0
75d0: 2e 32 35 65 20 6f 0a 09 09 5b 3a 20 20 20 20 20  .25e o...[:     
75e0: 20 20 20 20 20 20 20 20 66 64 75 70 20 66 3e 73          fdup f>s
75f0: 20 74 6f 20 63 6f 6c 6f 72 2d 74 68 65 6d 65 20   to color-theme 
7600: 30 2e 35 65 20 66 2b 20 43 6f 6c 6f 72 4d 6f 64  0.5e f+ ColorMod
7610: 65 21 20 2b 73 79 6e 63 20 2b 76 70 73 79 6e 63  e! +sync +vpsync
7620: 20 3b 5d 0a 09 09 3e 61 6e 69 6d 61 74 65 20 20   ;]...>animate  
7630: 54 48 45 4e 20 20 20 65 6e 64 6f 66 0a 09 6b 2d  THEN   endof..k-
7640: 66 36 20 6f 66 20 20 63 6f 6c 6f 72 2d 74 68 65  f6 of  color-the
7650: 6d 65 20 30 3c 3e 20 49 46 20 20 61 6e 69 6d 2d  me 0<> IF  anim-
7660: 65 6e 64 20 30 2e 32 35 65 20 6f 0a 09 09 5b 3a  end 0.25e o...[:
7670: 20 31 65 20 66 73 77 61 70 20 66 2d 20 66 64 75   1e fswap f- fdu
7680: 70 20 66 3e 73 20 74 6f 20 63 6f 6c 6f 72 2d 74  p f>s to color-t
7690: 68 65 6d 65 20 30 2e 35 65 20 66 2b 20 43 6f 6c  heme 0.5e f+ Col
76a0: 6f 72 4d 6f 64 65 21 20 2b 73 79 6e 63 20 2b 76  orMode! +sync +v
76b0: 70 73 79 6e 63 20 3b 5d 0a 09 09 3e 61 6e 69 6d  psync ;]...>anim
76c0: 61 74 65 20 20 54 48 45 4e 20 20 20 65 6e 64 6f  ate  THEN   endo
76d0: 66 0a 09 5b 20 62 6f 78 2d 61 63 74 6f 72 20 3a  f..[ box-actor :
76e0: 3a 20 65 6b 65 79 65 64 20 5d 20 20 45 58 49 54  : ekeyed ]  EXIT
76f0: 0a 20 20 20 20 65 6e 64 63 61 73 65 20 3b 20 6e  .    endcase ; n
7700: 65 74 32 6f 2d 61 63 74 6f 72 20 74 6f 20 65 6b  et2o-actor to ek
7710: 65 79 65 64 0a 0a 3a 20 6e 65 74 32 6f 5b 5d 20  eyed..: net2o[] 
7720: 28 20 6f 20 2d 2d 20 6f 20 29 0a 20 20 20 20 3e  ( o -- o ).    >
7730: 6f 20 6e 65 74 32 6f 2d 61 63 74 6f 72 20 6e 65  o net2o-actor ne
7740: 77 20 21 61 63 74 20 6f 20 6f 3e 20 3b 0a 0a 30  w !act o o> ;..0
7750: 20 56 61 6c 75 65 20 69 6e 76 69 74 61 74 69 6f   Value invitatio
7760: 6e 73 0a 30 20 56 61 6c 75 65 20 69 6e 76 69 74  ns.0 Value invit
7770: 61 74 69 6f 6e 73 2d 6c 69 73 74 0a 30 20 56 61  ations-list.0 Va
7780: 6c 75 65 20 69 6e 76 69 74 61 74 69 6f 6e 73 2d  lue invitations-
7790: 6e 6f 74 69 66 79 0a 56 61 72 69 61 62 6c 65 20  notify.Variable 
77a0: 69 6e 76 69 74 61 74 69 6f 6e 2d 73 74 61 63 6b  invitation-stack
77b0: 0a 0a 3a 20 69 6e 76 69 74 61 74 69 6f 6e 73 2d  ..: invitations-
77c0: 73 2f 68 20 28 20 66 6c 61 67 20 2d 2d 20 29 0a  s/h ( flag -- ).
77d0: 20 20 20 20 69 6e 76 69 74 61 74 69 6f 6e 73 20      invitations 
77e0: 73 77 61 70 20 20 49 46 20 20 2f 66 6c 6f 70 20  swap  IF  /flop 
77f0: 20 45 4c 53 45 20 20 2f 66 6c 69 70 20 20 54 48   ELSE  /flip  TH
7800: 45 4e 20 20 64 72 6f 70 20 2b 72 65 73 69 7a 65  EN  drop +resize
7810: 20 3b 0a 0a 3a 20 61 64 64 2d 75 73 65 72 20 28   ;..: add-user (
7820: 20 6b 65 79 2d 6f 20 2d 2d 20 29 0a 20 20 20 20   key-o -- ).    
7830: 64 61 74 61 20 3e 6f 20 70 65 72 6d 25 64 65 66  data >o perm%def
7840: 61 75 6c 74 20 6b 65 2d 6d 61 73 6b 20 21 0a 20  ault ke-mask !. 
7850: 20 20 20 6f 20 63 65 6c 6c 2d 20 6b 65 2d 65 6e     o cell- ke-en
7860: 64 20 6f 76 65 72 20 2d 20 6b 65 2d 70 6b 20 24  d over - ke-pk $
7870: 40 20 6b 65 79 7c 20 6b 65 79 23 20 23 21 20 6f  @ key| key# #! o
7880: 20 6f 3e 20 2e 64 69 73 70 6f 73 65 20 3b 0a 3a   o> .dispose ;.:
7890: 20 73 75 62 2d 75 73 65 72 20 28 20 6b 65 79 2d   sub-user ( key-
78a0: 6f 20 2d 2d 20 29 0a 20 20 20 20 64 61 74 61 20  o -- ).    data 
78b0: 3e 6f 20 70 65 72 6d 25 62 6c 6f 63 6b 65 64 20  >o perm%blocked 
78c0: 6b 65 2d 6d 61 73 6b 20 21 0a 20 20 20 20 6f 20  ke-mask !.    o 
78d0: 63 65 6c 6c 2d 20 6b 65 2d 65 6e 64 20 6f 76 65  cell- ke-end ove
78e0: 72 20 2d 20 6b 65 2d 70 6b 20 24 40 20 6b 65 79  r - ke-pk $@ key
78f0: 7c 20 6b 65 79 23 20 23 21 20 6f 20 6f 3e 20 2e  | key# #! o o> .
7900: 64 69 73 70 6f 73 65 20 3b 0a 0a 3a 20 61 64 64  dispose ;..: add
7910: 2d 69 6e 76 69 74 61 74 69 6f 6e 20 28 20 61 64  -invitation ( ad
7920: 64 72 20 75 20 2d 2d 20 29 0a 20 20 20 20 6f 76  dr u -- ).    ov
7930: 65 72 20 3e 72 20 72 65 61 64 2d 70 6b 32 6b 65  er >r read-pk2ke
7940: 79 24 20 73 61 6d 70 6c 65 2d 6b 65 79 20 2e 63  y$ sample-key .c
7950: 6c 6f 6e 65 20 3e 6f 0a 20 20 20 20 6f 20 69 6e  lone >o.    o in
7960: 76 69 74 61 74 69 6f 6e 2d 73 74 61 63 6b 20 3e  vitation-stack >
7970: 73 74 61 63 6b 0a 20 20 20 20 7b 7b 0a 09 6b 65  stack.    {{..ke
7980: 2d 6e 69 63 6b 20 24 40 20 7d 7d 74 65 78 74 0a  -nick $@ }}text.
7990: 09 67 6c 75 65 2a 6c 6c 20 7d 7d 67 6c 75 65 0a  .glue*ll }}glue.
79a0: 09 27 75 73 65 72 2d 70 6c 75 73 27 20 5b 27 5d  .'user-plus' [']
79b0: 20 78 65 6d 69 74 20 24 74 6d 70 20 7d 7d 74 65   xemit $tmp }}te
79c0: 78 74 0a 09 5b 27 5d 20 61 64 64 2d 75 73 65 72  xt..['] add-user
79d0: 20 6f 20 63 6c 69 63 6b 5b 5d 0a 09 27 75 73 65   o click[]..'use
79e0: 72 2d 6d 69 6e 75 73 27 20 5b 27 5d 20 78 65 6d  r-minus' ['] xem
79f0: 69 74 20 24 74 6d 70 20 7d 7d 74 65 78 74 0a 09  it $tmp }}text..
7a00: 5b 27 5d 20 73 75 62 2d 75 73 65 72 20 6f 20 63  ['] sub-user o c
7a10: 6c 69 63 6b 5b 5d 0a 20 20 20 20 7d 7d 68 20 62  lick[].    }}h b
7a20: 6f 78 5b 5d 20 32 35 25 62 20 69 6e 76 69 74 61  ox[] 25%b invita
7a30: 74 69 6f 6e 73 2d 6c 69 73 74 20 2e 63 68 69 6c  tions-list .chil
7a40: 64 2b 0a 20 20 20 20 69 6e 76 69 74 61 74 69 6f  d+.    invitatio
7a50: 6e 73 2d 6e 6f 74 69 66 79 20 2f 66 6c 6f 70 20  ns-notify /flop 
7a60: 64 72 6f 70 20 2b 72 65 73 69 7a 65 0a 20 20 20  drop +resize.   
7a70: 20 6f 3e 20 72 3e 20 66 72 65 65 20 74 68 72 6f   o> r> free thro
7a80: 77 20 3b 0a 0a 27 20 61 64 64 2d 69 6e 76 69 74  w ;..' add-invit
7a90: 61 74 69 6f 6e 20 69 73 20 64 6f 2d 69 6e 76 69  ation is do-invi
7aa0: 74 65 0a 0a 7b 7b 0a 20 20 20 20 7b 7b 0a 09 67  te..{{.    {{..g
7ab0: 6c 75 65 2d 6c 65 66 74 20 7d 7d 67 6c 75 65 0a  lue-left }}glue.
7ac0: 09 70 77 2d 66 72 61 6d 65 20 20 20 20 20 20 20  .pw-frame       
7ad0: 20 20 20 64 75 70 20 3e 73 6c 69 64 65 73 0a 09     dup >slides..
7ae0: 69 64 2d 66 72 61 6d 65 20 20 20 2f 66 6c 69 70  id-frame   /flip
7af0: 20 20 64 75 70 20 3e 73 6c 69 64 65 73 0a 09 63    dup >slides..c
7b00: 68 61 74 2d 66 72 61 6d 65 20 2f 66 6c 69 70 20  hat-frame /flip 
7b10: 20 64 75 70 20 3e 73 6c 69 64 65 73 0a 09 70 6f   dup >slides..po
7b20: 73 74 2d 66 72 61 6d 65 20 2f 66 6c 69 70 20 20  st-frame /flip  
7b30: 64 75 70 20 3e 73 6c 69 64 65 73 0a 09 67 6c 75  dup >slides..glu
7b40: 65 2d 72 69 67 68 74 20 7d 7d 67 6c 75 65 0a 20  e-right }}glue. 
7b50: 20 20 20 7d 7d 68 20 62 6f 78 5b 5d 0a 20 20 20     }}h box[].   
7b60: 20 7b 7b 0a 09 7b 7b 0a 09 20 20 20 20 67 6c 75   {{..{{..    glu
7b70: 65 2a 6c 6c 6c 20 7d 7d 67 6c 75 65 0a 09 20 20  e*lll }}glue..  
7b80: 20 20 5c 6c 61 72 67 65 0a 09 20 20 20 20 7b 7b    \large..    {{
7b90: 0a 09 09 27 75 73 65 72 2d 70 6c 75 73 27 20 27  ...'user-plus' '
7ba0: 20 78 65 6d 69 74 20 24 74 6d 70 20 7d 7d 74 65   xemit $tmp }}te
7bb0: 78 74 0a 09 20 20 20 20 7d 7d 68 20 27 20 69 6e  xt..    }}h ' in
7bc0: 76 69 74 61 74 69 6f 6e 73 2d 73 2f 68 20 30 20  vitations-s/h 0 
7bd0: 74 6f 67 67 6c 65 5b 5d 20 2f 66 6c 69 70 20 64  toggle[] /flip d
7be0: 75 70 20 74 6f 20 69 6e 76 69 74 61 74 69 6f 6e  up to invitation
7bf0: 73 2d 6e 6f 74 69 66 79 0a 09 20 20 20 20 6f 6e  s-notify..    on
7c00: 6c 69 6e 65 2d 73 79 6d 62 6f 6c 20 7d 7d 74 65  line-symbol }}te
7c10: 78 74 20 64 75 70 20 74 6f 20 6f 6e 6c 69 6e 65  xt dup to online
7c20: 2d 66 6c 61 67 0a 09 20 20 20 20 73 22 20 e2 9d  -flag..    s" 
7c30: 8c 22 20 24 34 34 34 34 34 34 46 46 20 6e 65 77  " $444444FF new
7c40: 2d 63 6f 6c 6f 72 2c 20 7d 7d 62 75 74 74 6f 6e  -color, }}button
7c50: 2d 6c 69 74 20 5b 3a 20 2d 31 20 64 61 74 61 20  -lit [: -1 data 
7c60: 2b 21 20 3b 5d 0a 09 20 20 20 20 5b 49 46 44 45  +! ;]..    [IFDE
7c70: 46 5d 20 61 6e 64 72 6f 69 64 20 61 6e 64 72 6f  F] android andro
7c80: 69 64 3a 6c 65 76 65 6c 23 20 5b 45 4c 53 45 5d  id:level# [ELSE]
7c90: 20 6c 65 76 65 6c 23 20 5b 54 48 45 4e 5d 20 63   level# [THEN] c
7ca0: 6c 69 63 6b 5b 5d 0a 09 7d 7d 68 20 62 6f 78 5b  lick[]..}}h box[
7cb0: 5d 20 2f 76 66 69 78 0a 09 7b 7b 0a 09 20 20 20  ] /vfix..{{..   
7cc0: 20 67 6c 75 65 2a 6c 6c 6c 20 7d 7d 67 6c 75 65   glue*lll }}glue
7cd0: 0a 09 20 20 20 20 7b 7b 0a 09 09 63 68 61 74 2d  ..    {{...chat-
7ce0: 62 67 2d 63 6f 6c 23 20 70 72 65 73 2d 66 72 61  bg-col# pres-fra
7cf0: 6d 65 0a 09 09 7b 7b 0a 09 09 20 20 20 20 5c 6e  me...{{...    \n
7d00: 6f 72 6d 61 6c 20 62 6c 61 63 6b 69 73 68 0a 09  ormal blackish..
7d10: 09 20 20 20 20 21 69 31 38 6e 20 6c 22 20 49 6e  .    !i18n l" In
7d20: 76 69 74 61 74 69 6f 6e 73 22 20 7d 7d 74 65 78  vitations" }}tex
7d30: 74 27 20 2f 63 65 6e 74 65 72 20 32 35 25 62 0a  t' /center 25%b.
7d40: 09 09 7d 7d 76 20 62 6f 78 5b 5d 20 64 75 70 20  ..}}v box[] dup 
7d50: 74 6f 20 69 6e 76 69 74 61 74 69 6f 6e 73 2d 6c  to invitations-l
7d60: 69 73 74 0a 09 20 20 20 20 7d 7d 7a 20 62 6f 78  ist..    }}z box
7d70: 5b 5d 0a 09 7d 7d 68 20 62 6f 78 5b 5d 0a 09 2f  []..}}h box[]../
7d80: 66 6c 69 70 20 64 75 70 20 74 6f 20 69 6e 76 69  flip dup to invi
7d90: 74 61 74 69 6f 6e 73 0a 09 67 6c 75 65 2a 6c 6c  tations..glue*ll
7da0: 6c 20 7d 7d 67 6c 75 65 0a 20 20 20 20 7d 7d 76  l }}glue.    }}v
7db0: 20 62 6f 78 5b 5d 0a 7d 7d 7a 20 6e 65 74 32 6f   box[].}}z net2o
7dc0: 5b 5d 0a 56 61 6c 75 65 20 6e 32 6f 2d 66 72 61  [].Value n2o-fra
7dd0: 6d 65 0a 0a 5c 20 74 6f 70 20 77 69 64 67 65 74  me..\ top widget
7de0: 73 0a 0a 3a 20 21 77 69 64 67 65 74 73 20 28 20  s..: !widgets ( 
7df0: 2d 2d 20 29 0a 20 20 20 20 74 6f 70 2d 77 69 64  -- ).    top-wid
7e00: 67 65 74 20 2e 68 74 6f 70 2d 72 65 73 69 7a 65  get .htop-resize
7e10: 0a 20 20 20 20 70 77 2d 66 69 65 6c 64 20 65 6e  .    pw-field en
7e20: 67 61 67 65 0a 20 20 20 20 31 65 20 61 6d 62 69  gage.    1e ambi
7e30: 65 6e 74 25 20 73 66 21 20 73 65 74 2d 75 6e 69  ent% sf! set-uni
7e40: 66 6f 72 6d 73 20 3b 0a 0a 5b 49 46 44 45 46 5d  forms ;..[IFDEF]
7e50: 20 78 31 31 0a 20 20 20 20 78 31 31 3a 58 43 6c   x11.    x11:XCl
7e60: 61 73 73 48 69 6e 74 20 62 75 66 66 65 72 3a 20  assHint buffer: 
7e70: 6e 65 74 32 6f 2d 77 6d 2d 63 6c 61 73 73 0a 5b  net2o-wm-class.[
7e80: 54 48 45 4e 5d 0a 0a 3a 20 6e 65 74 32 6f 2d 67  THEN]..: net2o-g
7e90: 75 69 20 28 20 2d 2d 20 29 0a 20 20 20 20 5b 49  ui ( -- ).    [I
7ea0: 46 44 45 46 5d 20 78 31 31 0a 09 64 70 79 20 77  FDEF] x11..dpy w
7eb0: 69 6e 20 6c 22 20 6e 65 74 32 6f 20 47 55 49 22  in l" net2o GUI"
7ec0: 20 6c 6f 63 61 6c 65 40 20 78 31 31 3a 58 53 74   locale@ x11:XSt
7ed0: 6f 72 65 4e 61 6d 65 20 64 72 6f 70 0a 09 22 6e  oreName drop.."n
7ee0: 65 74 32 6f 2d 67 75 69 5c 30 22 20 64 72 6f 70  et2o-gui\0" drop
7ef0: 20 64 75 70 20 6e 65 74 32 6f 2d 77 6d 2d 63 6c   dup net2o-wm-cl
7f00: 61 73 73 20 32 21 0a 09 64 70 79 20 77 69 6e 20  ass 2!..dpy win 
7f10: 6e 65 74 32 6f 2d 77 6d 2d 63 6c 61 73 73 20 78  net2o-wm-class x
7f20: 31 31 3a 58 53 65 74 43 6c 61 73 73 48 69 6e 74  11:XSetClassHint
7f30: 20 64 72 6f 70 0a 20 20 20 20 5b 54 48 45 4e 5d   drop.    [THEN]
7f40: 0a 20 20 20 20 6e 32 6f 2d 66 72 61 6d 65 20 74  .    n2o-frame t
7f50: 6f 20 74 6f 70 2d 77 69 64 67 65 74 0a 20 20 20  o top-widget.   
7f60: 20 22 50 41 53 53 50 48 52 41 53 45 22 20 67 65   "PASSPHRASE" ge
7f70: 74 65 6e 76 20 32 64 75 70 20 64 30 3d 20 49 46  tenv 2dup d0= IF
7f80: 20 20 32 64 72 6f 70 0a 20 20 20 20 45 4c 53 45    2drop.    ELSE
7f90: 0a 09 3e 70 61 73 73 70 68 72 61 73 65 20 2b 6b  ..>passphrase +k
7fa0: 65 79 20 20 72 65 61 64 2d 6b 65 79 73 0a 09 22  ey  read-keys.."
7fb0: 50 41 53 53 50 48 52 41 53 45 22 20 67 65 74 65  PASSPHRASE" gete
7fc0: 6e 76 20 65 72 61 73 65 20 5c 20 65 72 61 73 65  nv erase \ erase
7fd0: 20 70 61 73 73 70 68 72 61 73 65 20 61 66 74 65   passphrase afte
7fe0: 72 20 75 73 65 21 0a 20 20 20 20 54 48 45 4e 0a  r use!.    THEN.
7ff0: 20 20 20 20 73 65 63 72 65 74 2d 6b 65 79 73 23      secret-keys#
8000: 20 49 46 20 20 73 68 6f 77 2d 6e 69 63 6b 73 20   IF  show-nicks 
8010: 20 45 4c 53 45 0a 09 6c 61 63 6b 73 2d 6b 65 79   ELSE..lacks-key
8020: 3f 20 20 49 46 0a 09 20 20 20 20 30 65 20 30 20  ?  IF..    0e 0 
8030: 5b 3a 20 64 72 6f 70 20 6b 2d 65 6e 74 65 72 20  [: drop k-enter 
8040: 69 64 2d 74 6f 67 67 6c 65 72 20 2e 61 63 74 20  id-toggler .act 
8050: 2e 65 6b 65 79 65 64 20 3b 5d 20 3e 61 6e 69 6d  .ekeyed ;] >anim
8060: 61 74 65 0a 09 54 48 45 4e 0a 20 20 20 20 54 48  ate..THEN.    TH
8070: 45 4e 0a 20 20 20 20 31 63 6f 6e 66 69 67 20 20  EN.    1config  
8080: 21 77 69 64 67 65 74 73 0a 20 20 20 20 67 65 74  !widgets.    get
8090: 2d 6f 72 64 65 72 20 6e 3e 72 20 5b 27 5d 20 2f  -order n>r ['] /
80a0: 63 68 61 74 20 3e 62 6f 64 79 20 31 20 73 65 74  chat >body 1 set
80b0: 2d 6f 72 64 65 72 0a 20 20 20 20 5b 27 5d 20 77  -order.    ['] w
80c0: 69 64 67 65 74 73 2d 6c 6f 6f 70 20 63 61 74 63  idgets-loop catc
80d0: 68 0a 20 20 20 20 6e 72 3e 20 73 65 74 2d 6f 72  h.    nr> set-or
80e0: 64 65 72 20 74 68 72 6f 77 20 3b 0a 0a 27 20 6e  der throw ;..' n
80f0: 65 74 32 6f 2d 67 75 69 20 69 73 20 72 75 6e 2d  et2o-gui is run-
8100: 67 75 69 0a 0a 69 6e 63 6c 75 64 65 20 67 75 69  gui..include gui
8110: 2d 6e 69 67 68 74 2e 66 73 0a 0a 70 72 65 76 69  -night.fs..previ
8120: 6f 75 73 0a 0a 5c 20 6c 6f 63 61 6c 69 7a 61 74  ous..\ localizat
8130: 69 6f 6e 0a 0a 63 73 2d 73 63 6f 70 65 3a 20 6c  ion..cs-scope: l
8140: 61 6e 67 0a 0a 6c 6f 63 61 6c 65 20 65 6e 20 5c  ang..locale en \
8150: 20 6d 61 79 20 64 69 66 66 65 72 20 66 72 6f 6d   may differ from
8160: 20 64 65 76 65 6c 6f 70 6d 65 6e 74 20 6c 61 6e   development lan
8170: 67 75 61 67 65 0a 6c 6f 63 61 6c 65 20 64 65 20  guage.locale de 
8180: 5c 20 47 65 72 6d 61 6e 0a 6c 6f 63 61 6c 65 20  \ German.locale 
8190: 7a 68 20 5c 20 43 68 69 6e 65 73 65 0a 0a 7d 73  zh \ Chinese..}s
81a0: 63 6f 70 65 0a 0a 6c 61 6e 67 3a 64 65 20 69 6e  cope..lang:de in
81b0: 63 6c 75 64 65 2d 6c 6f 63 61 6c 65 20 6c 61 6e  clude-locale lan
81c0: 67 2f 64 65 0a 6c 61 6e 67 3a 7a 68 20 69 6e 63  g/de.lang:zh inc
81d0: 6c 75 64 65 2d 6c 6f 63 61 6c 65 20 6c 61 6e 67  lude-locale lang
81e0: 2f 7a 68 0a 6c 61 6e 67 3a 65 6e 20 69 6e 63 6c  /zh.lang:en incl
81f0: 75 64 65 2d 6c 6f 63 61 6c 65 20 6c 61 6e 67 2f  ude-locale lang/
8200: 65 6e 0a 0a 3a 20 3f 3f 6c 61 6e 67 20 28 20 61  en..: ??lang ( a
8210: 64 64 72 20 75 20 2d 2d 20 29 0a 20 20 20 20 5b  ddr u -- ).    [
8220: 27 5d 20 6c 61 6e 67 20 3e 62 6f 64 79 20 66 69  '] lang >body fi
8230: 6e 64 2d 6e 61 6d 65 2d 69 6e 20 3f 64 75 70 2d  nd-name-in ?dup-
8240: 49 46 20 20 65 78 65 63 75 74 65 20 20 54 48 45  IF  execute  THE
8250: 4e 20 3b 0a 0a 73 22 20 4c 41 4e 47 22 20 67 65  N ;..s" LANG" ge
8260: 74 65 6e 76 20 27 5f 27 20 24 73 70 6c 69 74 20  tenv '_' $split 
8270: 32 73 77 61 70 20 3f 3f 6c 61 6e 67 20 27 2e 27  2swap ??lang '.'
8280: 20 24 73 70 6c 69 74 20 3f 3f 6c 61 6e 67 20 3f   $split ??lang ?
8290: 3f 6c 61 6e 67 0a 0a 5c 20 6c 73 69 64 73 20 2e  ?lang..\ lsids .
82a0: 6c 73 69 64 73 0a 0a 5b 49 46 44 45 46 5d 20 6c  lsids..[IFDEF] l
82b0: 6f 61 64 2d 63 6f 76 20 20 6c 6f 61 64 2d 63 6f  oad-cov  load-co
82c0: 76 20 5b 54 48 45 4e 5d 0a 0a 5c 5c 5c 0a 4c 6f  v [THEN]..\\\.Lo
82d0: 63 61 6c 20 56 61 72 69 61 62 6c 65 73 3a 0a 66  cal Variables:.f
82e0: 6f 72 74 68 2d 6c 6f 63 61 6c 2d 77 6f 72 64 73  orth-local-words
82f0: 3a 0a 20 20 20 20 28 0a 20 20 20 20 20 28 28 22  :.    (.     (("
8300: 6e 65 74 32 6f 3a 22 20 22 2b 6e 65 74 32 6f 3a  net2o:" "+net2o:
8310: 22 29 20 64 65 66 69 6e 69 74 69 6f 6e 2d 73 74  ") definition-st
8320: 61 72 74 65 72 20 28 66 6f 6e 74 2d 6c 6f 63 6b  arter (font-lock
8330: 2d 6b 65 79 77 6f 72 64 2d 66 61 63 65 20 2e 20  -keyword-face . 
8340: 31 29 0a 20 20 20 20 20 20 22 5b 20 5c 74 5c 6e  1).      "[ \t\n
8350: 5d 22 20 74 20 6e 61 6d 65 20 28 66 6f 6e 74 2d  ]" t name (font-
8360: 6c 6f 63 6b 2d 66 75 6e 63 74 69 6f 6e 2d 6e 61  lock-function-na
8370: 6d 65 2d 66 61 63 65 20 2e 20 33 29 29 0a 20 20  me-face . 3)).  
8380: 20 20 20 28 22 5b 61 2d 7a 30 2d 39 5d 2b 28 22     ("[a-z0-9]+("
8390: 20 69 6d 6d 65 64 69 61 74 65 20 28 66 6f 6e 74   immediate (font
83a0: 2d 6c 6f 63 6b 2d 63 6f 6d 6d 65 6e 74 2d 66 61  -lock-comment-fa
83b0: 63 65 20 2e 20 31 29 0a 20 20 20 20 20 20 22 29  ce . 1).      ")
83c0: 22 20 6e 69 6c 20 63 6f 6d 6d 65 6e 74 20 28 66  " nil comment (f
83d0: 6f 6e 74 2d 6c 6f 63 6b 2d 63 6f 6d 6d 65 6e 74  ont-lock-comment
83e0: 2d 66 61 63 65 20 2e 20 31 29 29 0a 20 20 20 20  -face . 1)).    
83f0: 29 0a 66 6f 72 74 68 2d 6c 6f 63 61 6c 2d 69 6e  ).forth-local-in
8400: 64 65 6e 74 2d 77 6f 72 64 73 3a 0a 20 20 20 20  dent-words:.    
8410: 28 0a 20 20 20 20 20 28 28 22 6e 65 74 32 6f 3a  (.     (("net2o:
8420: 22 20 22 2b 6e 65 74 32 6f 3a 22 29 20 28 30 20  " "+net2o:") (0 
8430: 2e 20 32 29 20 28 30 20 2e 20 32 29 20 6e 6f 6e  . 2) (0 . 2) non
8440: 2d 69 6d 6d 65 64 69 61 74 65 29 0a 20 20 20 20  -immediate).    
8450: 20 28 28 22 7b 7b 22 29 20 28 30 20 2e 20 32 29   (("{{") (0 . 2)
8460: 20 28 30 20 2e 20 32 29 20 69 6d 6d 65 64 69 61   (0 . 2) immedia
8470: 74 65 29 0a 20 20 20 20 20 28 28 22 7d 7d 68 22  te).     (("}}h"
8480: 20 22 7d 7d 76 22 20 22 7d 7d 7a 22 20 22 7d 7d   "}}v" "}}z" "}}
8490: 76 70 22 20 22 7d 7d 70 22 29 20 28 2d 32 20 2e  vp" "}}p") (-2 .
84a0: 20 30 29 20 28 2d 32 20 2e 20 30 29 20 69 6d 6d   0) (-2 . 0) imm
84b0: 65 64 69 61 74 65 29 0a 20 20 20 20 29 0a 45 6e  ediate).    ).En
84c0: 64 3a 0a 5b 54 48 45 4e 5d 0a                    d:.[THEN].