System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 7851d012e8fc5f4091cb2f610854f5f15ee4e8ef:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0050: 0a 23 0d 0a 23 20 75 70 64 61 74 65 2e 65 61 67  .#..# update.eag
0060: 6c 65 20 2d 2d 0d 0a 23 0d 0a 23 20 45 78 74 65  le --..#..# Exte
0070: 6e 73 69 62 6c 65 20 41 64 61 70 74 61 62 6c 65  nsible Adaptable
0080: 20 47 65 6e 65 72 61 6c 69 7a 65 64 20 4c 6f 67   Generalized Log
0090: 69 63 20 45 6e 67 69 6e 65 20 28 45 61 67 6c 65  ic Engine (Eagle
00a0: 29 0d 0a 23 20 45 61 67 6c 65 20 55 70 64 61 74  )..# Eagle Updat
00b0: 65 20 50 61 63 6b 61 67 65 20 46 69 6c 65 0d 0a  e Package File..
00c0: 23 0d 0a 23 20 43 6f 70 79 72 69 67 68 74 20 28  #..# Copyright (
00d0: 63 29 20 32 30 30 37 2d 32 30 31 32 20 62 79 20  c) 2007-2012 by 
00e0: 4a 6f 65 20 4d 69 73 74 61 63 68 6b 69 6e 2e 20  Joe Mistachkin. 
00f0: 20 41 6c 6c 20 72 69 67 68 74 73 20 72 65 73 65   All rights rese
0100: 72 76 65 64 2e 0d 0a 23 0d 0a 23 20 53 65 65 20  rved...#..# See 
0110: 74 68 65 20 66 69 6c 65 20 22 6c 69 63 65 6e 73  the file "licens
0120: 65 2e 74 65 72 6d 73 22 20 66 6f 72 20 69 6e 66  e.terms" for inf
0130: 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 75 73 61 67  ormation on usag
0140: 65 20 61 6e 64 20 72 65 64 69 73 74 72 69 62 75  e and redistribu
0150: 74 69 6f 6e 20 6f 66 0d 0a 23 20 74 68 69 73 20  tion of..# this 
0160: 66 69 6c 65 2c 20 61 6e 64 20 66 6f 72 20 61 20  file, and for a 
0170: 44 49 53 43 4c 41 49 4d 45 52 20 4f 46 20 41 4c  DISCLAIMER OF AL
0180: 4c 20 57 41 52 52 41 4e 54 49 45 53 2e 0d 0a 23  L WARRANTIES...#
0190: 0d 0a 23 20 52 43 53 3a 20 40 28 23 29 20 24 49  ..# RCS: @(#) $I
01a0: 64 3a 20 24 0d 0a 23 0d 0a 23 23 23 23 23 23 23  d: $..#..#######
01b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01f0: 23 23 23 23 23 23 23 23 0d 0a 0d 0a 23 0d 0a 23  ########....#..#
0200: 20 4e 4f 54 45 3a 20 55 73 65 20 6f 75 72 20 6f   NOTE: Use our o
0210: 77 6e 20 6e 61 6d 65 73 70 61 63 65 20 68 65 72  wn namespace her
0220: 65 20 62 65 63 61 75 73 65 20 65 76 65 6e 20 74  e because even t
0230: 68 6f 75 67 68 20 77 65 20 64 6f 20 6e 6f 74 20  hough we do not 
0240: 64 69 72 65 63 74 6c 79 0d 0a 23 20 20 20 20 20  directly..#     
0250: 20 20 73 75 70 70 6f 72 74 20 6e 61 6d 65 73 70    support namesp
0260: 61 63 65 73 20 6f 75 72 73 65 6c 76 65 73 2c 20  aces ourselves, 
0270: 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  we do not want t
0280: 6f 20 70 6f 6c 6c 75 74 65 20 74 68 65 20 67 6c  o pollute the gl
0290: 6f 62 61 6c 0d 0a 23 20 20 20 20 20 20 20 6e 61  obal..#       na
02a0: 6d 65 73 70 61 63 65 20 69 66 20 74 68 69 73 20  mespace if this 
02b0: 73 63 72 69 70 74 20 61 63 74 75 61 6c 6c 79 20  script actually 
02c0: 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 65 76  ends up being ev
02d0: 61 6c 75 61 74 65 64 20 69 6e 20 54 63 6c 2e 0d  aluated in Tcl..
02e0: 0a 23 0d 0a 6e 61 6d 65 73 70 61 63 65 20 65 76  .#..namespace ev
02f0: 61 6c 20 3a 3a 45 61 67 6c 65 20 7b 0d 0a 20 20  al ::Eagle {..  
0300: 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 54 68 69  #..  # NOTE: Thi
0310: 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75  s procedure retu
0320: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  rns non-zero if 
0330: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 75  the specified pu
0340: 62 6c 69 63 20 6b 65 79 20 74 6f 6b 65 6e 0d 0a  blic key token..
0350: 20 20 23 20 20 20 20 20 20 20 6d 61 74 63 68 65    #       matche
0360: 73 20 74 68 65 20 6f 6e 65 20 69 6e 20 75 73 65  s the one in use
0370: 20 62 79 20 74 68 65 20 45 61 67 6c 65 20 73 63   by the Eagle sc
0380: 72 69 70 74 20 65 6e 67 69 6e 65 2e 0d 0a 20 20  ript engine...  
0390: 23 0d 0a 20 20 70 72 6f 63 20 6d 61 74 63 68 45  #..  proc matchE
03a0: 6e 67 69 6e 65 50 75 62 6c 69 63 4b 65 79 54 6f  nginePublicKeyTo
03b0: 6b 65 6e 20 7b 20 70 75 62 6c 69 63 4b 65 79 54  ken { publicKeyT
03c0: 6f 6b 65 6e 20 7d 20 7b 0d 0a 20 20 20 20 69 66  oken } {..    if
03d0: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
03e0: 20 24 70 75 62 6c 69 63 4b 65 79 54 6f 6b 65 6e   $publicKeyToken
03f0: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
0400: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
0410: 65 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  e..    }....    
0420: 73 65 74 20 65 6e 67 69 6e 65 50 75 62 6c 69 63  set enginePublic
0430: 4b 65 79 54 6f 6b 65 6e 20 5b 69 6e 66 6f 20 65  KeyToken [info e
0440: 6e 67 69 6e 65 20 50 75 62 6c 69 63 4b 65 79 54  ngine PublicKeyT
0450: 6f 6b 65 6e 5d 0d 0a 0d 0a 20 20 20 20 69 66 20  oken]....    if 
0460: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
0470: 24 65 6e 67 69 6e 65 50 75 62 6c 69 63 4b 65 79  $enginePublicKey
0480: 54 6f 6b 65 6e 5d 20 3d 3d 20 30 7d 20 74 68 65  Token] == 0} the
0490: 6e 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72  n {..      retur
04a0: 6e 20 74 72 75 65 0d 0a 20 20 20 20 7d 0d 0a 0d  n true..    }...
04b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70  .    return [exp
04c0: 72 20 7b 24 70 75 62 6c 69 63 4b 65 79 54 6f 6b  r {$publicKeyTok
04d0: 65 6e 20 65 71 20 24 65 6e 67 69 6e 65 50 75 62  en eq $enginePub
04e0: 6c 69 63 4b 65 79 54 6f 6b 65 6e 7d 5d 0d 0a 20  licKeyToken}].. 
04f0: 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a 20 20 23 20   }.....  #..  # 
0500: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
0510: 64 75 72 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e  dure returns non
0520: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70 65  -zero if the spe
0530: 63 69 66 69 65 64 20 65 6e 67 69 6e 65 20 6e 61  cified engine na
0540: 6d 65 0d 0a 20 20 23 20 20 20 20 20 20 20 6d 61  me..  #       ma
0550: 74 63 68 65 73 20 74 68 65 20 45 61 67 6c 65 20  tches the Eagle 
0560: 73 63 72 69 70 74 20 65 6e 67 69 6e 65 2e 0d 0a  script engine...
0570: 20 20 23 0d 0a 20 20 70 72 6f 63 20 6d 61 74 63    #..  proc matc
0580: 68 45 6e 67 69 6e 65 4e 61 6d 65 20 7b 20 6e 61  hEngineName { na
0590: 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 72 65 74 75  me } {..    retu
05a0: 72 6e 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e  rn [expr {[strin
05b0: 67 20 6c 65 6e 67 74 68 20 24 6e 61 6d 65 5d 20  g length $name] 
05c0: 3d 3d 20 30 20 7c 7c 20 5c 0d 0a 20 20 20 20 20  == 0 || \..     
05d0: 20 20 20 24 6e 61 6d 65 20 65 71 20 5b 69 6e 66     $name eq [inf
05e0: 6f 20 65 6e 67 69 6e 65 20 4e 61 6d 65 5d 7d 5d  o engine Name]}]
05f0: 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a 20  ..  }.....  #.. 
0600: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
0610: 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20  ocedure returns 
0620: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
0630: 73 70 65 63 69 66 69 65 64 20 63 75 6c 74 75 72  specified cultur
0640: 65 20 6d 61 74 63 68 65 73 0d 0a 20 20 23 20 20  e matches..  #  
0650: 20 20 20 20 20 74 68 65 20 6f 6e 65 20 69 6e 20       the one in 
0660: 75 73 65 20 62 79 20 74 68 65 20 45 61 67 6c 65  use by the Eagle
0670: 20 73 63 72 69 70 74 20 65 6e 67 69 6e 65 2e 0d   script engine..
0680: 0a 20 20 23 0d 0a 20 20 70 72 6f 63 20 6d 61 74  .  #..  proc mat
0690: 63 68 45 6e 67 69 6e 65 43 75 6c 74 75 72 65 20  chEngineCulture 
06a0: 7b 20 63 75 6c 74 75 72 65 20 7d 20 7b 0d 0a 20  { culture } {.. 
06b0: 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20     return [expr 
06c0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
06d0: 24 63 75 6c 74 75 72 65 5d 20 3d 3d 20 30 20 7c  $culture] == 0 |
06e0: 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 24 63 75  | \..        $cu
06f0: 6c 74 75 72 65 20 65 71 20 5b 69 6e 66 6f 20 65  lture eq [info e
0700: 6e 67 69 6e 65 20 43 75 6c 74 75 72 65 5d 7d 5d  ngine Culture]}]
0710: 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a 20  ..  }.....  #.. 
0720: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
0730: 6f 63 65 64 75 72 65 20 65 73 63 61 70 65 73 20  ocedure escapes 
0740: 74 68 65 20 72 65 73 65 72 76 65 64 20 63 68 61  the reserved cha
0750: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73  racters in the s
0760: 70 65 63 69 66 69 65 64 0d 0a 20 20 23 20 20 20  pecified..  #   
0770: 20 20 20 20 75 70 64 61 74 65 20 6e 6f 74 65 73      update notes
0780: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65   and returns the
0790: 20 72 65 73 75 6c 74 69 6e 67 20 73 74 72 69 6e   resulting strin
07a0: 67 2e 0d 0a 20 20 23 0d 0a 20 20 70 72 6f 63 20  g...  #..  proc 
07b0: 65 73 63 61 70 65 55 70 64 61 74 65 4e 6f 74 65  escapeUpdateNote
07c0: 73 20 7b 20 6e 6f 74 65 73 20 7d 20 7b 0d 0a 20  s { notes } {.. 
07d0: 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45     #..    # NOTE
07e0: 3a 20 45 73 63 61 70 65 20 61 6e 79 20 65 6d 62  : Escape any emb
07f0: 65 64 64 65 64 20 74 61 62 20 61 6e 64 20 6c 69  edded tab and li
0800: 6e 65 2d 65 6e 64 69 6e 67 20 63 68 61 72 61 63  ne-ending charac
0810: 74 65 72 73 2e 0d 0a 20 20 20 20 23 0d 0a 20 20  ters...    #..  
0820: 20 20 72 65 74 75 72 6e 20 5b 73 74 72 69 6e 67    return [string
0830: 20 6d 61 70 20 5c 0d 0a 20 20 20 20 20 20 20 20   map \..        
0840: 5b 6c 69 73 74 20 26 20 26 61 6d 70 5c 3b 20 5c  [list & &amp\; \
0850: 74 20 26 68 74 61 62 5c 3b 20 5c 76 20 26 76 74  t &htab\; \v &vt
0860: 61 62 5c 3b 20 5c 6e 20 26 6c 66 5c 3b 20 5c 72  ab\; \n &lf\; \r
0870: 20 26 63 72 5c 3b 5d 20 24 6e 6f 74 65 73 5d 0d   &cr\;] $notes].
0880: 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a 20 20  .  }.....  #..  
0890: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
08a0: 63 65 64 75 72 65 20 75 6e 65 73 63 61 70 65 73  cedure unescapes
08b0: 20 72 65 73 65 72 76 65 64 20 63 68 61 72 61 63   reserved charac
08c0: 74 65 72 73 20 69 6e 20 74 68 65 20 73 70 65 63  ters in the spec
08d0: 69 66 69 65 64 0d 0a 20 20 23 20 20 20 20 20 20  ified..  #      
08e0: 20 75 70 64 61 74 65 20 6e 6f 74 65 73 20 61 6e   update notes an
08f0: 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 72 65  d returns the re
0900: 73 75 6c 74 69 6e 67 20 73 74 72 69 6e 67 2e 0d  sulting string..
0910: 0a 20 20 23 0d 0a 20 20 70 72 6f 63 20 75 6e 65  .  #..  proc une
0920: 73 63 61 70 65 55 70 64 61 74 65 4e 6f 74 65 73  scapeUpdateNotes
0930: 20 7b 20 6e 6f 74 65 73 20 7d 20 7b 0d 0a 20 20   { notes } {..  
0940: 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
0950: 20 55 6e 65 73 63 61 70 65 20 61 6e 79 20 65 6d   Unescape any em
0960: 62 65 64 64 65 64 20 74 61 62 20 61 6e 64 20 6c  bedded tab and l
0970: 69 6e 65 2d 65 6e 64 69 6e 67 20 63 68 61 72 61  ine-ending chara
0980: 63 74 65 72 73 2e 0d 0a 20 20 20 20 23 0d 0a 20  cters...    #.. 
0990: 20 20 20 72 65 74 75 72 6e 20 5b 73 74 72 69 6e     return [strin
09a0: 67 20 6d 61 70 20 5c 0d 0a 20 20 20 20 20 20 20  g map \..       
09b0: 20 5b 6c 69 73 74 20 26 68 74 61 62 5c 3b 20 5c   [list &htab\; \
09c0: 74 20 26 76 74 61 62 5c 3b 20 5c 76 20 26 6c 66  t &vtab\; \v &lf
09d0: 5c 3b 20 5c 6e 20 26 63 72 5c 3b 20 5c 72 20 26  \; \n &cr\; \r &
09e0: 61 6d 70 5c 3b 20 26 5d 20 24 6e 6f 74 65 73 5d  amp\; &] $notes]
09f0: 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a 20  ..  }.....  #.. 
0a00: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
0a10: 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20  ocedure returns 
0a20: 74 68 65 20 6c 69 73 74 20 6f 66 20 61 72 67 75  the list of argu
0a30: 6d 65 6e 74 73 20 74 6f 20 62 65 20 70 61 73 73  ments to be pass
0a40: 65 64 20 74 6f 20 74 68 65 0d 0a 20 20 23 20 20  ed to the..  #  
0a50: 20 20 20 20 20 5b 75 72 69 20 64 6f 77 6e 6c 6f       [uri downlo
0a60: 61 64 5d 20 63 61 6c 6c 20 74 68 61 74 20 70 65  ad] call that pe
0a70: 72 66 6f 72 6d 73 20 74 68 65 20 61 75 74 6f 2d  rforms the auto-
0a80: 75 70 64 61 74 65 20 63 68 65 63 6b 2e 0d 0a 20  update check... 
0a90: 20 23 0d 0a 20 20 70 72 6f 63 20 67 65 74 46 65   #..  proc getFe
0aa0: 74 63 68 55 70 64 61 74 65 41 72 67 73 20 7b 20  tchUpdateArgs { 
0ab0: 62 61 73 65 55 72 69 20 70 61 74 63 68 4c 65 76  baseUri patchLev
0ac0: 65 6c 20 74 79 70 65 20 64 69 72 65 63 74 6f 72  el type director
0ad0: 79 20 65 78 74 65 6e 73 69 6f 6e 20 7d 20 7b 0d  y extension } {.
0ae0: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
0af0: 54 45 3a 20 49 6e 69 74 69 61 6c 6c 79 2c 20 73  TE: Initially, s
0b00: 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 74 6f  et the result to
0b10: 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 20 74   an empty list t
0b20: 6f 20 69 6e 64 69 63 61 74 65 0d 0a 20 20 20 20  o indicate..    
0b30: 23 20 20 20 20 20 20 20 75 6e 72 65 63 6f 67 6e  #       unrecogn
0b40: 69 7a 65 64 20 69 6e 70 75 74 2e 0d 0a 20 20 20  ized input...   
0b50: 20 23 0d 0a 20 20 20 20 73 65 74 20 72 65 73 75   #..    set resu
0b60: 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20  lt [list]....   
0b70: 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
0b80: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 62 61  Make sure the ba
0b90: 73 65 20 55 52 49 20 69 73 20 76 61 6c 69 64 2e  se URI is valid.
0ba0: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20  ..    #..    if 
0bb0: 7b 5b 75 72 69 20 69 73 76 61 6c 69 64 20 24 62  {[uri isvalid $b
0bc0: 61 73 65 55 72 69 5d 7d 20 74 68 65 6e 20 7b 0d  aseUri]} then {.
0bd0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
0be0: 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72  # NOTE: Make sur
0bf0: 65 20 74 68 65 20 70 61 74 63 68 20 6c 65 76 65  e the patch leve
0c00: 6c 20 6c 6f 6f 6b 73 20 76 61 6c 69 64 2e 0d 0a  l looks valid...
0c10: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
0c20: 66 20 7b 5b 72 65 67 65 78 70 20 2d 2d 20 7b 5e  f {[regexp -- {^
0c30: 5c 64 2b 5c 2e 5c 64 2b 5c 2e 5c 64 2b 5c 2e 5c  \d+\.\d+\.\d+\.\
0c40: 64 2b 24 7d 20 24 70 61 74 63 68 4c 65 76 65 6c  d+$} $patchLevel
0c50: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
0c60: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
0c70: 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20  NOTE: Make sure 
0c80: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73  the directory is
0c90: 20 65 69 74 68 65 72 20 65 6d 70 74 79 20 6f 72   either empty or
0ca0: 20 61 6e 20 65 78 69 73 74 69 6e 67 0d 0a 20 20   an existing..  
0cb0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
0cc0: 6c 69 64 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a  lid directory...
0cd0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
0ce0: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
0cf0: 65 6e 67 74 68 20 24 64 69 72 65 63 74 6f 72 79  ength $directory
0d00: 5d 20 3d 3d 20 30 20 7c 7c 20 5c 0d 0a 20 20 20  ] == 0 || \..   
0d10: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 69           [file i
0d20: 73 64 69 72 65 63 74 6f 72 79 20 24 64 69 72 65  sdirectory $dire
0d30: 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ctory]} then {..
0d40: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
0d50: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d         # NOTE: M
0d60: 61 6b 65 20 73 75 72 65 20 74 68 65 20 65 78 74  ake sure the ext
0d70: 65 6e 73 69 6f 6e 20 69 73 20 73 75 70 70 6f 72  ension is suppor
0d80: 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ted...          
0d90: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
0da0: 7b 24 65 78 74 65 6e 73 69 6f 6e 20 65 71 20 22  {$extension eq "
0db0: 2e 65 78 65 22 20 7c 7c 20 24 65 78 74 65 6e 73  .exe" || $extens
0dc0: 69 6f 6e 20 65 71 20 22 2e 72 61 72 22 7d 20 74  ion eq ".rar"} t
0dd0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
0de0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
0df0: 20 20 23 20 4e 4f 54 45 3a 20 53 74 61 72 74 20    # NOTE: Start 
0e00: 77 69 74 68 20 74 68 65 20 55 52 49 20 63 6f 6d  with the URI com
0e10: 70 6f 6e 65 6e 74 73 20 63 6f 6d 6d 6f 6e 20 74  ponents common t
0e20: 6f 20 61 6c 6c 20 64 6f 77 6e 6c 6f 61 64 0d 0a  o all download..
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
0e40: 20 20 20 20 74 79 70 65 73 2e 0d 0a 20 20 20 20      types...    
0e50: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
0e60: 20 20 20 20 20 20 20 73 65 74 20 63 6f 6d 70 6f         set compo
0e70: 6e 65 6e 74 73 20 5b 6c 69 73 74 20 24 62 61 73  nents [list $bas
0e80: 65 55 72 69 20 72 65 6c 65 61 73 65 73 20 24 70  eUri releases $p
0e90: 61 74 63 68 4c 65 76 65 6c 5d 0d 0a 0d 0a 20 20  atchLevel]....  
0ea0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
0eb0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
0ec0: 20 4e 65 78 74 2c 20 66 69 67 75 72 65 20 6f 75   Next, figure ou
0ed0: 74 20 77 68 61 74 20 74 79 70 65 20 6f 66 20 64  t what type of d
0ee0: 6f 77 6e 6c 6f 61 64 20 69 73 20 62 65 69 6e 67  ownload is being
0ef0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
0f00: 20 20 20 20 20 20 72 65 71 75 65 73 74 65 64 2e        requested.
0f10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
0f20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 77 69  .            swi
0f30: 74 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61  tch -exact -noca
0f40: 73 65 20 2d 2d 20 24 74 79 70 65 20 7b 0d 0a 20  se -- $type {.. 
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 75               sou
0f60: 72 63 65 20 2d 0d 0a 20 20 20 20 20 20 20 20 20  rce -..         
0f70: 20 20 20 20 20 73 65 74 75 70 20 2d 0d 0a 20 20       setup -..  
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 61              bina
0f90: 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ry {..          
0fa0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
0fb0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
0fc0: 20 53 6f 75 72 63 65 20 63 6f 64 65 2c 20 73 65   Source code, se
0fd0: 74 75 70 2c 20 6f 72 20 62 69 6e 61 72 79 20 64  tup, or binary d
0fe0: 6f 77 6e 6c 6f 61 64 2e 20 20 54 68 69 73 20 6d  ownload.  This m
0ff0: 61 79 20 62 65 0d 0a 20 20 20 20 20 20 20 20 20  ay be..         
1000: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
1010: 20 52 41 52 20 6f 72 20 61 6e 20 45 58 45 20 66   RAR or an EXE f
1020: 69 6c 65 2e 20 20 41 70 70 65 6e 64 20 74 68 65  ile.  Append the
1030: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 69 6c   appropriate fil
1040: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
1050: 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 20     #       name 
1060: 61 6e 64 20 74 68 65 6e 20 6a 6f 69 6e 20 61 6c  and then join al
1070: 6c 20 74 68 65 20 55 52 49 20 63 6f 6d 70 6f 6e  l the URI compon
1080: 65 6e 74 73 20 74 6f 20 66 6f 72 6d 20 74 68 65  ents to form the
1090: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10a0: 20 20 23 20 20 20 20 20 20 20 66 69 6e 61 6c 20    #       final 
10b0: 55 52 49 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  URI...          
10c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10d0: 20 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c           set fil
10e0: 65 4e 61 6d 65 20 5b 61 70 70 65 6e 64 41 72 67  eName [appendArg
10f0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1100: 20 20 20 20 20 20 20 20 20 5b 69 6e 66 6f 20 65           [info e
1110: 6e 67 69 6e 65 5d 20 5b 73 74 72 69 6e 67 20 74  ngine] [string t
1120: 6f 74 69 74 6c 65 20 24 74 79 70 65 5d 20 24 70  otitle $type] $p
1130: 61 74 63 68 4c 65 76 65 6c 20 5c 0d 0a 20 20 20  atchLevel \..   
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1150: 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20   [expr {[string 
1160: 74 6f 6c 6f 77 65 72 20 24 74 79 70 65 5d 20 65  tolower $type] e
1170: 71 20 22 73 65 74 75 70 22 20 3f 20 22 2e 65 78  q "setup" ? ".ex
1180: 65 22 20 3a 20 5c 0d 0a 20 20 20 20 20 20 20 20  e" : \..        
1190: 20 20 20 20 20 20 20 20 20 20 20 20 24 65 78 74              $ext
11a0: 65 6e 73 69 6f 6e 7d 5d 5d 0d 0a 0d 0a 20 20 20  ension}]]....   
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70               lap
11c0: 70 65 6e 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 20  pend components 
11d0: 24 66 69 6c 65 4e 61 6d 65 0d 0a 0d 0a 20 20 20  $fileName....   
11e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
11f0: 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 5b 65   result [list [e
1200: 76 61 6c 20 75 72 69 20 6a 6f 69 6e 20 24 63 6f  val uri join $co
1210: 6d 70 6f 6e 65 6e 74 73 5d 20 5b 66 69 6c 65 20  mponents] [file 
1220: 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
1230: 20 20 20 20 20 20 20 20 20 20 20 20 24 64 69 72              $dir
1240: 65 63 74 6f 72 79 20 24 66 69 6c 65 4e 61 6d 65  ectory $fileName
1250: 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]]..            
1260: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
1270: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
1280: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1290: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
12a0: 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
12b0: 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a 20  ..  }.....  #.. 
12c0: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
12d0: 6f 63 65 64 75 72 65 20 66 65 74 63 68 65 73 20  ocedure fetches 
12e0: 61 6e 20 75 70 64 61 74 65 20 70 61 63 6b 61 67  an update packag
12f0: 65 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  e with the speci
1300: 66 69 65 64 20 70 61 74 63 68 0d 0a 20 20 23 20  fied patch..  # 
1310: 20 20 20 20 20 20 6c 65 76 65 6c 20 61 6e 64 20        level and 
1320: 70 61 63 6b 61 67 65 20 74 79 70 65 20 61 6e 64  package type and
1330: 20 74 68 65 6e 20 73 61 76 65 73 20 69 74 20 74   then saves it t
1340: 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  o the specified 
1350: 6c 6f 63 61 6c 0d 0a 20 20 23 20 20 20 20 20 20  local..  #      
1360: 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20 23   directory...  #
1370: 0d 0a 20 20 70 72 6f 63 20 66 65 74 63 68 55 70  ..  proc fetchUp
1380: 64 61 74 65 20 7b 20 62 61 73 65 55 72 69 20 70  date { baseUri p
1390: 61 74 63 68 4c 65 76 65 6c 20 74 79 70 65 20 64  atchLevel type d
13a0: 69 72 65 63 74 6f 72 79 20 7d 20 7b 0d 0a 20 20  irectory } {..  
13b0: 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
13c0: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
13d0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 69 6c 65  appropriate file
13e0: 20 65 78 74 65 6e 73 69 6f 6e 20 74 6f 20 64 6f   extension to do
13f0: 77 6e 6c 6f 61 64 20 66 6f 72 0d 0a 20 20 20 20  wnload for..    
1400: 23 20 20 20 20 20 20 20 74 68 69 73 20 70 6c 61  #       this pla
1410: 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 23 0d 0a 20  tform...    #.. 
1420: 20 20 20 73 65 74 20 65 78 74 65 6e 73 69 6f 6e     set extension
1430: 20 5b 65 78 70 72 20 7b 5b 69 73 57 69 6e 64 6f   [expr {[isWindo
1440: 77 73 5d 20 3f 20 22 2e 65 78 65 22 20 3a 20 22  ws] ? ".exe" : "
1450: 2e 72 61 72 22 7d 5d 0d 0a 0d 0a 20 20 20 20 23  .rar"}]....    #
1460: 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75  ..    # NOTE: Bu
1470: 69 6c 64 20 74 68 65 20 6e 65 63 65 73 73 61 72  ild the necessar
1480: 79 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20  y arguments for 
1490: 74 68 65 20 64 6f 77 6e 6c 6f 61 64 2e 0d 0a 20  the download... 
14a0: 20 20 20 23 0d 0a 20 20 20 20 73 65 74 20 61 72     #..    set ar
14b0: 67 73 20 5b 67 65 74 46 65 74 63 68 55 70 64 61  gs [getFetchUpda
14c0: 74 65 41 72 67 73 20 24 62 61 73 65 55 72 69 20  teArgs $baseUri 
14d0: 24 70 61 74 63 68 4c 65 76 65 6c 20 24 74 79 70  $patchLevel $typ
14e0: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 24 64 69  e \..        $di
14f0: 72 65 63 74 6f 72 79 20 24 65 78 74 65 6e 73 69  rectory $extensi
1500: 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b  on]....    if {[
1510: 6c 6c 65 6e 67 74 68 20 24 61 72 67 73 5d 20 3e  llength $args] >
1520: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1530: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1540: 45 3a 20 53 74 61 72 74 20 74 72 75 73 74 69 6e  E: Start trustin
1550: 67 20 4f 4e 4c 59 20 6f 75 72 20 73 65 6c 66 2d  g ONLY our self-
1560: 73 69 67 6e 65 64 20 53 53 4c 20 63 65 72 74 69  signed SSL certi
1570: 66 69 63 61 74 65 2e 0d 0a 20 20 20 20 20 20 23  ficate...      #
1580: 0d 0a 20 20 20 20 20 20 73 65 74 20 74 72 75 73  ..      set trus
1590: 74 65 64 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20  ted true....    
15a0: 20 20 69 66 20 7b 5b 6c 69 6e 64 65 78 20 5b 75    if {[lindex [u
15b0: 72 69 20 73 6f 66 74 77 61 72 65 75 70 64 61 74  ri softwareupdat
15c0: 65 73 5d 20 65 6e 64 5d 20 65 71 20 22 75 6e 74  es] end] eq "unt
15d0: 72 75 73 74 65 64 22 7d 20 74 68 65 6e 20 7b 0d  rusted"} then {.
15e0: 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
15f0: 75 72 69 20 73 6f 66 74 77 61 72 65 75 70 64 61  uri softwareupda
1600: 74 65 73 20 74 72 75 65 7d 0d 0a 20 20 20 20 20  tes true}..     
1610: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1620: 20 20 20 73 65 74 20 74 72 75 73 74 65 64 20 66     set trusted f
1630: 61 6c 73 65 3b 20 23 20 4e 4f 54 45 3a 20 41 6c  alse; # NOTE: Al
1640: 72 65 61 64 79 20 74 72 75 73 74 65 64 2e 0d 0a  ready trusted...
1650: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1660: 20 74 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20   try {..        
1670: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1680: 45 3a 20 44 6f 77 6e 6c 6f 61 64 20 74 68 65 20  E: Download the 
1690: 66 69 6c 65 20 66 72 6f 6d 20 74 68 65 20 77 65  file from the we
16a0: 62 20 73 69 74 65 2e 0d 0a 20 20 20 20 20 20 20  b site...       
16b0: 20 23 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c   #..        eval
16c0: 20 75 72 69 20 64 6f 77 6e 6c 6f 61 64 20 24 61   uri download $a
16d0: 72 67 73 3b 20 23 20 73 79 6e 63 68 72 6f 6e 6f  rgs; # synchrono
16e0: 75 73 2e 0d 0a 20 20 20 20 20 20 7d 20 66 69 6e  us...      } fin
16f0: 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20  ally {..        
1700: 69 66 20 7b 24 74 72 75 73 74 65 64 20 26 26 20  if {$trusted && 
1710: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
1720: 6c 69 6e 64 65 78 20 5b 75 72 69 20 73 6f 66 74  lindex [uri soft
1730: 77 61 72 65 75 70 64 61 74 65 73 5d 20 65 6e 64  wareupdates] end
1740: 5d 20 65 71 20 22 74 72 75 73 74 65 64 22 7d 20  ] eq "trusted"} 
1750: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1760: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
1770: 20 4e 4f 54 45 3a 20 53 74 6f 70 20 74 72 75 73   NOTE: Stop trus
1780: 74 69 6e 67 20 4f 4e 4c 59 20 6f 75 72 20 73 65  ting ONLY our se
1790: 6c 66 2d 73 69 67 6e 65 64 20 53 53 4c 20 63 65  lf-signed SSL ce
17a0: 72 74 69 66 69 63 61 74 65 2e 0d 0a 20 20 20 20  rtificate...    
17b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17c0: 20 20 20 63 61 74 63 68 20 7b 75 72 69 20 73 6f     catch {uri so
17d0: 66 74 77 61 72 65 75 70 64 61 74 65 73 20 66 61  ftwareupdates fa
17e0: 6c 73 65 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  lse}..        }.
17f0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1800: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1810: 45 3a 20 52 65 74 75 72 6e 20 61 20 72 65 73 75  E: Return a resu
1820: 6c 74 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68  lt indicating wh
1830: 61 74 20 77 61 73 20 64 6f 6e 65 2e 0d 0a 20 20  at was done...  
1840: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
1850: 75 72 6e 20 5b 61 70 70 65 6e 64 41 72 67 73 20  urn [appendArgs 
1860: 22 64 6f 77 6e 6c 6f 61 64 65 64 20 55 52 49 20  "downloaded URI 
1870: 22 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20  " [lindex $args 
1880: 30 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  0] \..          
1890: 22 20 74 6f 20 64 69 72 65 63 74 6f 72 79 20 5c  " to directory \
18a0: 22 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c 22  "" $directory \"
18b0: 5d 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  ]..    } else {.
18c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 63  .      return "c
18d0: 61 6e 6e 6f 74 20 66 65 74 63 68 20 75 70 64 61  annot fetch upda
18e0: 74 65 2c 20 74 68 65 20 55 52 49 20 69 73 20 69  te, the URI is i
18f0: 6e 76 61 6c 69 64 22 0d 0a 20 20 20 20 7d 0d 0a  nvalid"..    }..
1900: 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a 20 20 23    }.....  #..  #
1910: 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63   NOTE: This proc
1920: 65 64 75 72 65 20 72 75 6e 73 20 74 68 65 20 75  edure runs the u
1930: 70 64 61 74 65 72 20 74 6f 6f 6c 20 61 6e 64 20  pdater tool and 
1940: 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  then immediately
1950: 20 65 78 69 74 73 0d 0a 20 20 23 20 20 20 20 20   exits..  #     
1960: 20 20 74 68 65 20 70 72 6f 63 65 73 73 2e 0d 0a    the process...
1970: 20 20 23 0d 0a 20 20 70 72 6f 63 20 72 75 6e 55    #..  proc runU
1980: 70 64 61 74 65 41 6e 64 45 78 69 74 20 7b 20 7b  pdateAndExit { {
1990: 61 75 74 6f 6d 61 74 69 63 20 66 61 6c 73 65 7d  automatic false}
19a0: 20 7d 20 7b 0d 0a 20 20 20 20 67 6c 6f 62 61 6c   } {..    global
19b0: 20 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 0d 0a 0d   tcl_platform...
19c0: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
19d0: 54 45 3a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  TE: Determine th
19e0: 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
19f0: 64 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20  d file name for 
1a00: 74 68 65 20 75 70 64 61 74 65 72 2e 20 20 49 66  the updater.  If
1a10: 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 69 74  ..    #       it
1a20: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
1a30: 65 2c 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6e  e, we cannot con
1a40: 74 69 6e 75 65 2e 0d 0a 20 20 20 20 23 0d 0a 20  tinue...    #.. 
1a50: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
1a60: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c 65  [file join [file
1a70: 20 6e 6f 72 6d 61 6c 69 7a 65 20 5c 0d 0a 20 20   normalize \..  
1a80: 20 20 20 20 20 20 5b 66 69 6c 65 20 64 69 72 6e        [file dirn
1a90: 61 6d 65 20 5b 69 6e 66 6f 20 6e 61 6d 65 6f 66  ame [info nameof
1aa0: 65 78 65 63 75 74 61 62 6c 65 5d 5d 5d 20 48 69  executable]]] Hi
1ab0: 70 70 6f 67 72 69 66 66 2e 65 78 65 5d 0d 0a 0d  ppogriff.exe]...
1ac0: 0a 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20  .    if {![file 
1ad0: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
1ae0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1af0: 20 65 72 72 6f 72 20 5b 61 70 70 65 6e 64 41 72   error [appendAr
1b00: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1b10: 22 75 70 64 61 74 65 72 20 65 78 65 63 75 74 61  "updater executa
1b20: 62 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ble \"" $fileNam
1b30: 65 20 22 5c 22 20 69 73 20 6e 6f 74 20 61 76 61  e "\" is not ava
1b40: 69 6c 61 62 6c 65 22 5d 0d 0a 20 20 20 20 7d 0d  ilable"]..    }.
1b50: 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  ...    #..    # 
1b60: 4e 4f 54 45 3a 20 46 6f 72 20 2e 4e 45 54 20 43  NOTE: For .NET C
1b70: 6f 72 65 2c 20 75 70 64 61 74 69 6e 67 20 76 69  ore, updating vi
1b80: 61 20 74 68 65 20 75 70 64 61 74 65 72 20 74 6f  a the updater to
1b90: 6f 6c 20 69 73 20 75 6e 73 75 70 70 6f 72 74 65  ol is unsupporte
1ba0: 64 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69  d...    #..    i
1bb0: 66 20 7b 5b 69 73 44 6f 74 4e 65 74 43 6f 72 65  f {[isDotNetCore
1bc0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1bd0: 20 65 72 72 6f 72 20 5b 61 70 70 65 6e 64 41 72   error [appendAr
1be0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1bf0: 22 75 70 64 61 74 65 72 20 65 78 65 63 75 74 61  "updater executa
1c00: 62 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ble \"" $fileNam
1c10: 65 20 22 5c 22 20 75 6e 73 75 70 70 6f 72 74 65  e "\" unsupporte
1c20: 64 20 6f 6e 20 2e 4e 45 54 20 43 6f 72 65 22 5d  d on .NET Core"]
1c30: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23  ..    }....    #
1c40: 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 74  ..    # NOTE: St
1c50: 61 72 74 20 6f 75 74 20 77 69 74 68 20 6a 75 73  art out with jus
1c60: 74 20 74 68 65 20 62 61 73 65 20 5b 65 78 65 63  t the base [exec
1c70: 5d 20 63 6f 6d 6d 61 6e 64 2c 20 2d 73 68 65 6c  ] command, -shel
1c80: 6c 20 6f 70 74 69 6f 6e 2c 0d 0a 20 20 20 20 23  l option,..    #
1c90: 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 65         and the e
1ca0: 6e 64 2d 6f 66 2d 6f 70 74 69 6f 6e 73 20 6d 61  nd-of-options ma
1cb0: 72 6b 65 72 2e 0d 0a 20 20 20 20 23 0d 0a 20 20  rker...    #..  
1cc0: 20 20 73 65 74 20 63 6f 6d 6d 61 6e 64 20 5b 6c    set command [l
1cd0: 69 73 74 20 65 78 65 63 20 2d 73 68 65 6c 6c 20  ist exec -shell 
1ce0: 2d 2d 5d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20  --]....    #..  
1cf0: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
1d00: 66 6f 72 20 6e 61 74 69 76 65 20 54 63 6c 20 61  for native Tcl a
1d10: 6e 64 20 4d 6f 6e 6f 20 62 65 63 61 75 73 65 20  nd Mono because 
1d20: 74 68 69 73 20 69 6d 70 61 63 74 73 20 68 6f 77  this impacts how
1d30: 20 74 68 65 0d 0a 20 20 20 20 23 20 20 20 20 20   the..    #     
1d40: 20 20 73 68 65 6c 6c 20 65 78 65 63 75 74 61 62    shell executab
1d50: 6c 65 20 6e 61 6d 65 20 69 73 20 64 65 74 65 72  le name is deter
1d60: 6d 69 6e 65 64 2e 0d 0a 20 20 20 20 23 0d 0a 20  mined...    #.. 
1d70: 20 20 20 69 66 20 7b 5b 69 73 45 61 67 6c 65 5d     if {[isEagle]
1d80: 20 26 26 20 5b 69 73 4d 6f 6e 6f 5d 7d 20 74 68   && [isMono]} th
1d90: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  en {..      #.. 
1da0: 20 20 20 20 20 23 20 48 41 43 4b 3a 20 41 73 73       # HACK: Ass
1db0: 75 6d 65 20 74 68 61 74 20 4d 6f 6e 6f 20 69 73  ume that Mono is
1dc0: 20 73 6f 6d 65 77 68 65 72 65 20 61 6c 6f 6e 67   somewhere along
1dd0: 20 74 68 65 20 50 41 54 48 2e 0d 0a 20 20 20 20   the PATH...    
1de0: 20 20 23 0d 0a 20 20 20 20 20 20 6c 61 70 70 65    #..      lappe
1df0: 6e 64 20 63 6f 6d 6d 61 6e 64 20 6d 6f 6e 6f 20  nd command mono 
1e00: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 61 70  \..          [ap
1e10: 70 65 6e 64 41 72 67 73 20 5c 22 20 5b 66 69 6c  pendArgs \" [fil
1e20: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 24 66 69  e nativename $fi
1e30: 6c 65 4e 61 6d 65 5d 20 5c 22 5d 0d 0a 20 20 20  leName] \"]..   
1e40: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1e50: 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64   lappend command
1e60: 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
1e70: 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  }....    #..    
1e80: 23 20 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20  # NOTE: Add the 
1e90: 62 61 73 65 20 6f 70 74 69 6f 6e 73 20 74 6f 20  base options to 
1ea0: 74 68 65 20 75 70 64 61 74 65 72 20 65 78 65 63  the updater exec
1eb0: 75 74 61 62 6c 65 2e 20 20 54 79 70 69 63 61 6c  utable.  Typical
1ec0: 6c 79 2c 0d 0a 20 20 20 20 23 20 20 20 20 20 20  ly,..    #      
1ed0: 20 74 68 69 73 20 6f 6e 6c 79 20 69 6e 63 6c 75   this only inclu
1ee0: 64 65 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20  des the initial 
1ef0: 28 6d 75 74 65 78 20 63 68 65 63 6b 69 6e 67 29  (mutex checking)
1f00: 20 64 65 6c 61 79 2e 0d 0a 20 20 20 20 23 0d 0a   delay...    #..
1f10: 20 20 20 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d      lappend comm
1f20: 61 6e 64 20 2d 64 65 6c 61 79 20 32 30 30 30 0d  and -delay 2000.
1f30: 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  ...    #..    # 
1f40: 48 41 43 4b 3a 20 54 68 65 20 6e 61 74 69 76 65  HACK: The native
1f50: 20 53 74 72 6f 6e 67 4e 61 6d 65 53 69 67 6e 61   StrongNameSigna
1f60: 74 75 72 65 56 65 72 69 66 69 63 61 74 69 6f 6e  tureVerification
1f70: 45 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 64 6f  Ex() function do
1f80: 65 73 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20  es..    #       
1f90: 6e 6f 74 20 61 70 70 65 61 72 20 74 6f 20 77 6f  not appear to wo
1fa0: 72 6b 20 6f 6e 20 57 4f 41 20 28 57 69 6e 64 6f  rk on WOA (Windo
1fb0: 77 73 2d 6f 6e 2d 41 52 4d 29 20 6f 6e 20 74 68  ws-on-ARM) on th
1fc0: 65 20 53 75 72 66 61 63 65 20 52 54 0d 0a 20 20  e Surface RT..  
1fd0: 20 20 23 20 20 20 20 20 20 20 74 61 62 6c 65 74    #       tablet
1fe0: 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 61 74 74  ; therefore, att
1ff0: 65 6d 70 74 20 74 6f 20 64 69 73 61 62 6c 65 20  empt to disable 
2000: 69 74 73 20 75 73 65 20 77 68 65 6e 20 63 61 6c  its use when cal
2010: 6c 69 6e 67 0d 0a 20 20 20 20 23 20 20 20 20 20  ling..    #     
2020: 20 20 69 6e 74 6f 20 74 68 65 20 75 70 64 61 74    into the updat
2030: 65 72 20 6f 6e 20 74 68 61 74 20 70 6c 61 74 66  er on that platf
2040: 6f 72 6d 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20  orm...    #..   
2050: 20 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73 5d   if {[isWindows]
2060: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b   && \..        [
2070: 69 6e 66 6f 20 65 78 69 73 74 73 20 74 63 6c 5f  info exists tcl_
2080: 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65  platform(machine
2090: 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
20a0: 20 24 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d   $tcl_platform(m
20b0: 61 63 68 69 6e 65 29 20 65 71 20 22 61 72 6d 22  achine) eq "arm"
20c0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
20d0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
20e0: 20 57 65 20 61 70 70 65 61 72 20 74 6f 20 62 65   We appear to be
20f0: 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 57 4f 41 20   running on WOA 
2100: 28 57 69 6e 64 6f 77 73 2d 6f 6e 2d 41 52 4d 29  (Windows-on-ARM)
2110: 2c 20 61 64 64 20 74 68 65 0d 0a 20 20 20 20 20  , add the..     
2120: 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64   #       command
2130: 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 74 68 61   line option tha
2140: 74 20 73 6b 69 70 73 20 73 74 72 6f 6e 67 20 6e  t skips strong n
2150: 61 6d 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ame verification
2160: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
2170: 20 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61 6e    lappend comman
2180: 64 20 2d 6e 6f 53 74 72 6f 6e 67 4e 61 6d 65 53  d -noStrongNameS
2190: 69 67 6e 65 64 20 74 72 75 65 0d 0a 20 20 20 20  igned true..    
21a0: 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  }....    #..    
21b0: 23 20 4e 4f 54 45 3a 20 49 66 20 72 65 71 75 65  # NOTE: If reque
21c0: 73 74 65 64 2c 20 65 6e 61 62 6c 65 20 66 75 6c  sted, enable ful
21d0: 6c 79 20 61 75 74 6f 6d 61 74 69 63 20 75 70 64  ly automatic upd
21e0: 61 74 65 20 6d 6f 64 65 2e 0d 0a 20 20 20 20 23  ate mode...    #
21f0: 0d 0a 20 20 20 20 69 66 20 7b 24 61 75 74 6f 6d  ..    if {$autom
2200: 61 74 69 63 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  atic} then {..  
2210: 20 20 20 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d      lappend comm
2220: 61 6e 64 20 2d 73 69 6c 65 6e 74 20 74 72 75 65  and -silent true
2230: 20 2d 63 6f 6e 66 69 72 6d 20 66 61 6c 73 65 0d   -confirm false.
2240: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 73 65  .    }....    se
2250: 74 20 62 61 73 65 55 72 69 20 5b 67 65 74 55 70  t baseUri [getUp
2260: 64 61 74 65 42 61 73 65 55 72 69 5d 0d 0a 0d 0a  dateBaseUri]....
2270: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
2280: 6c 65 6e 67 74 68 20 24 62 61 73 65 55 72 69 5d  length $baseUri]
2290: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
22a0: 20 20 20 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d      lappend comm
22b0: 61 6e 64 20 2d 62 61 73 65 55 72 69 20 24 62 61  and -baseUri $ba
22c0: 73 65 55 72 69 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  seUri..    }....
22d0: 20 20 20 20 73 65 74 20 70 61 74 68 41 6e 64 51      set pathAndQ
22e0: 75 65 72 79 20 5b 67 65 74 55 70 64 61 74 65 50  uery [getUpdateP
22f0: 61 74 68 41 6e 64 51 75 65 72 79 5d 0d 0a 0d 0a  athAndQuery]....
2300: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
2310: 6c 65 6e 67 74 68 20 24 70 61 74 68 41 6e 64 51  length $pathAndQ
2320: 75 65 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  uery] > 0} then 
2330: 7b 0d 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64  {..      lappend
2340: 20 63 6f 6d 6d 61 6e 64 20 2d 74 61 67 50 61 74   command -tagPat
2350: 68 41 6e 64 51 75 65 72 79 20 24 70 61 74 68 41  hAndQuery $pathA
2360: 6e 64 51 75 65 72 79 0d 0a 20 20 20 20 7d 0d 0a  ndQuery..    }..
2370: 0d 0a 20 20 20 20 65 76 61 6c 20 24 63 6f 6d 6d  ..    eval $comm
2380: 61 6e 64 20 26 3b 20 65 78 69 74 20 2d 66 6f 72  and &; exit -for
2390: 63 65 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d  ce..  }.....  #.
23a0: 0a 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20  .  # NOTE: This 
23b0: 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e  procedure return
23c0: 73 20 74 68 65 20 62 61 73 65 20 55 52 49 20 74  s the base URI t
23d0: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
23e0: 65 64 20 74 6f 20 63 68 65 63 6b 0d 0a 20 20 23  ed to check..  #
23f0: 20 20 20 20 20 20 20 66 6f 72 20 61 76 61 69 6c         for avail
2400: 61 62 6c 65 20 75 70 64 61 74 65 73 2e 0d 0a 20  able updates... 
2410: 20 23 0d 0a 20 20 70 72 6f 63 20 67 65 74 55 70   #..  proc getUp
2420: 64 61 74 65 42 61 73 65 55 72 69 20 7b 7d 20 7b  dateBaseUri {} {
2430: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
2440: 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63  OTE: Check the c
2450: 75 72 72 65 6e 74 20 62 61 73 65 20 55 52 49 20  urrent base URI 
2460: 66 6f 72 20 75 70 64 61 74 65 73 20 61 67 61 69  for updates agai
2470: 6e 73 74 20 74 68 65 20 6f 6e 65 20 62 61 6b 65  nst the one bake
2480: 64 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 69  d..    #       i
2490: 6e 74 6f 20 74 68 65 20 61 73 73 65 6d 62 6c 79  nto the assembly
24a0: 2e 20 20 49 66 20 74 68 65 79 20 61 72 65 20 64  .  If they are d
24b0: 69 66 66 65 72 65 6e 74 2c 20 74 68 65 6e 20 74  ifferent, then t
24c0: 68 65 20 62 61 73 65 20 55 52 49 0d 0a 20 20 20  he base URI..   
24d0: 20 23 20 20 20 20 20 20 20 6d 75 73 74 20 68 61   #       must ha
24e0: 76 65 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64  ve been overridd
24f0: 65 6e 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  en.  In that cas
2500: 65 2c 20 77 65 20 6d 75 73 74 20 72 65 74 75 72  e, we must retur
2510: 6e 20 74 68 65 0d 0a 20 20 20 20 23 20 20 20 20  n the..    #    
2520: 20 20 20 63 75 72 72 65 6e 74 20 62 61 73 65 20     current base 
2530: 55 52 49 3b 20 6f 74 68 65 72 77 69 73 65 2c 20  URI; otherwise, 
2540: 77 65 20 6d 75 73 74 20 72 65 74 75 72 6e 20 61  we must return a
2550: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d  n empty string..
2560: 0a 20 20 20 20 23 0d 0a 20 20 20 20 73 65 74 20  .    #..    set 
2570: 62 61 73 65 55 72 69 28 30 29 20 5b 69 6e 66 6f  baseUri(0) [info
2580: 20 65 6e 67 69 6e 65 20 55 70 64 61 74 65 42 61   engine UpdateBa
2590: 73 65 55 72 69 20 66 61 6c 73 65 5d 3b 20 23 20  seUri false]; # 
25a0: 4e 4f 54 45 3a 20 43 75 72 72 65 6e 74 2e 0d 0a  NOTE: Current...
25b0: 20 20 20 20 73 65 74 20 62 61 73 65 55 72 69 28      set baseUri(
25c0: 31 29 20 5b 69 6e 66 6f 20 65 6e 67 69 6e 65 20  1) [info engine 
25d0: 55 70 64 61 74 65 42 61 73 65 55 72 69 20 74 72  UpdateBaseUri tr
25e0: 75 65 5d 3b 20 20 23 20 4e 4f 54 45 3a 20 44 65  ue];  # NOTE: De
25f0: 66 61 75 6c 74 2e 0d 0a 0d 0a 20 20 20 20 69 66  fault.....    if
2600: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
2610: 20 24 62 61 73 65 55 72 69 28 30 29 5d 20 3e 20   $baseUri(0)] > 
2620: 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  0 && \..        
2630: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
2640: 62 61 73 65 55 72 69 28 31 29 5d 20 3e 20 30 7d  baseUri(1)] > 0}
2650: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23   then {..      #
2660: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
2670: 4f 6b 2c 20 74 68 65 79 20 61 72 65 20 62 6f 74  Ok, they are bot
2680: 68 20 76 61 6c 69 64 2e 20 20 41 72 65 20 74 68  h valid.  Are th
2690: 65 79 20 64 69 66 66 65 72 65 6e 74 3f 0d 0a 20  ey different?.. 
26a0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
26b0: 20 7b 24 62 61 73 65 55 72 69 28 30 29 20 6e 65   {$baseUri(0) ne
26c0: 20 24 62 61 73 65 55 72 69 28 31 29 7d 20 74 68   $baseUri(1)} th
26d0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
26e0: 74 75 72 6e 20 24 62 61 73 65 55 72 69 28 30 29  turn $baseUri(0)
26f0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
2700: 0d 0a 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 22  ....    return "
2710: 22 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a  "..  }.....  #..
2720: 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70    # NOTE: This p
2730: 72 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73  rocedure returns
2740: 20 74 68 65 20 70 61 74 68 20 61 6e 64 20 71 75   the path and qu
2750: 65 72 79 20 70 6f 72 74 69 6f 6e 73 20 6f 66 20  ery portions of 
2760: 74 68 65 20 55 52 49 0d 0a 20 20 23 20 20 20 20  the URI..  #    
2770: 20 20 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62     that should b
2780: 65 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  e used to check 
2790: 66 6f 72 20 61 76 61 69 6c 61 62 6c 65 20 75 70  for available up
27a0: 64 61 74 65 73 2e 0d 0a 20 20 23 0d 0a 20 20 70  dates...  #..  p
27b0: 72 6f 63 20 67 65 74 55 70 64 61 74 65 50 61 74  roc getUpdatePat
27c0: 68 41 6e 64 51 75 65 72 79 20 7b 7d 20 7b 0d 0a  hAndQuery {} {..
27d0: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
27e0: 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75 72  E: Check the cur
27f0: 72 65 6e 74 20 74 61 67 20 70 61 74 68 20 61 6e  rent tag path an
2800: 64 20 71 75 65 72 79 20 66 6f 72 20 75 70 64 61  d query for upda
2810: 74 65 73 20 61 67 61 69 6e 73 74 20 74 68 65 0d  tes against the.
2820: 0a 20 20 20 20 23 20 20 20 20 20 20 20 6f 6e 65  .    #       one
2830: 20 62 61 6b 65 64 20 69 6e 74 6f 20 74 68 65 20   baked into the 
2840: 61 73 73 65 6d 62 6c 79 2e 20 20 49 66 20 74 68  assembly.  If th
2850: 65 79 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  ey are different
2860: 2c 20 74 68 65 6e 20 74 68 65 0d 0a 20 20 20 20  , then the..    
2870: 23 20 20 20 20 20 20 20 74 61 67 20 70 61 74 68  #       tag path
2880: 20 61 6e 64 20 71 75 65 72 79 20 6d 75 73 74 20   and query must 
2890: 68 61 76 65 20 62 65 65 6e 20 6f 76 65 72 72 69  have been overri
28a0: 64 64 65 6e 2e 20 20 49 6e 20 74 68 61 74 20 63  dden.  In that c
28b0: 61 73 65 2c 0d 0a 20 20 20 20 23 20 20 20 20 20  ase,..    #     
28c0: 20 20 77 65 20 6d 75 73 74 20 72 65 74 75 72 6e    we must return
28d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 67   the current tag
28e0: 20 70 61 74 68 20 61 6e 64 20 71 75 65 72 79 3b   path and query;
28f0: 20 6f 74 68 65 72 77 69 73 65 2c 20 77 65 0d 0a   otherwise, we..
2900: 20 20 20 20 23 20 20 20 20 20 20 20 6d 75 73 74      #       must
2910: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
2920: 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 23 0d   string...    #.
2930: 0a 20 20 20 20 73 65 74 20 70 61 74 68 41 6e 64  .    set pathAnd
2940: 51 75 65 72 79 28 30 29 20 5b 69 6e 66 6f 20 65  Query(0) [info e
2950: 6e 67 69 6e 65 20 55 70 64 61 74 65 50 61 74 68  ngine UpdatePath
2960: 41 6e 64 51 75 65 72 79 20 5c 0d 0a 20 20 20 20  AndQuery \..    
2970: 20 20 20 20 66 61 6c 73 65 5d 3b 20 23 20 4e 4f      false]; # NO
2980: 54 45 3a 20 43 75 72 72 65 6e 74 2e 0d 0a 0d 0a  TE: Current.....
2990: 20 20 20 20 73 65 74 20 70 61 74 68 41 6e 64 51      set pathAndQ
29a0: 75 65 72 79 28 31 29 20 5b 69 6e 66 6f 20 65 6e  uery(1) [info en
29b0: 67 69 6e 65 20 55 70 64 61 74 65 50 61 74 68 41  gine UpdatePathA
29c0: 6e 64 51 75 65 72 79 20 5c 0d 0a 20 20 20 20 20  ndQuery \..     
29d0: 20 20 20 74 72 75 65 5d 3b 20 20 23 20 4e 4f 54     true];  # NOT
29e0: 45 3a 20 44 65 66 61 75 6c 74 2e 0d 0a 0d 0a 20  E: Default..... 
29f0: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
2a00: 65 6e 67 74 68 20 24 70 61 74 68 41 6e 64 51 75  ength $pathAndQu
2a10: 65 72 79 28 30 29 5d 20 3e 20 30 20 26 26 20 5c  ery(0)] > 0 && \
2a20: 0d 0a 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e  ..        [strin
2a30: 67 20 6c 65 6e 67 74 68 20 24 70 61 74 68 41 6e  g length $pathAn
2a40: 64 51 75 65 72 79 28 31 29 5d 20 3e 20 30 7d 20  dQuery(1)] > 0} 
2a50: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d  then {..      #.
2a60: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f  .      # NOTE: O
2a70: 6b 2c 20 74 68 65 79 20 61 72 65 20 62 6f 74 68  k, they are both
2a80: 20 76 61 6c 69 64 2e 20 20 41 72 65 20 74 68 65   valid.  Are the
2a90: 79 20 64 69 66 66 65 72 65 6e 74 3f 0d 0a 20 20  y different?..  
2aa0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
2ab0: 7b 24 70 61 74 68 41 6e 64 51 75 65 72 79 28 30  {$pathAndQuery(0
2ac0: 29 20 6e 65 20 24 70 61 74 68 41 6e 64 51 75 65  ) ne $pathAndQue
2ad0: 72 79 28 31 29 7d 20 74 68 65 6e 20 7b 0d 0a 20  ry(1)} then {.. 
2ae0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 70         return $p
2af0: 61 74 68 41 6e 64 51 75 65 72 79 28 30 29 0d 0a  athAndQuery(0)..
2b00: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
2b10: 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d  ..    return "".
2b20: 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a 20 20  .  }.....  #..  
2b30: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
2b40: 63 65 64 75 72 65 20 64 6f 77 6e 6c 6f 61 64 73  cedure downloads
2b50: 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 75   the available u
2b60: 70 64 61 74 65 20 64 61 74 61 20 61 6e 64 20 72  pdate data and r
2b70: 65 74 75 72 6e 73 0d 0a 20 20 23 20 20 20 20 20  eturns..  #     
2b80: 20 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a    it verbatim...
2b90: 20 20 23 0d 0a 20 20 70 72 6f 63 20 67 65 74 55    #..  proc getU
2ba0: 70 64 61 74 65 44 61 74 61 20 7b 20 75 72 69 20  pdateData { uri 
2bb0: 7d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  } {..    #..    
2bc0: 23 20 4e 4f 54 45 3a 20 53 74 61 72 74 20 74 72  # NOTE: Start tr
2bd0: 75 73 74 69 6e 67 20 4f 4e 4c 59 20 6f 75 72 20  usting ONLY our 
2be0: 6f 77 6e 20 73 65 6c 66 2d 73 69 67 6e 65 64 20  own self-signed 
2bf0: 53 53 4c 20 63 65 72 74 69 66 69 63 61 74 65 2e  SSL certificate.
2c00: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 73 65 74  ..    #..    set
2c10: 20 74 72 75 73 74 65 64 20 74 72 75 65 0d 0a 0d   trusted true...
2c20: 0a 20 20 20 20 69 66 20 7b 5b 6c 69 6e 64 65 78  .    if {[lindex
2c30: 20 5b 75 72 69 20 73 6f 66 74 77 61 72 65 75 70   [uri softwareup
2c40: 64 61 74 65 73 5d 20 65 6e 64 5d 20 65 71 20 22  dates] end] eq "
2c50: 75 6e 74 72 75 73 74 65 64 22 7d 20 74 68 65 6e  untrusted"} then
2c60: 20 7b 0d 0a 20 20 20 20 20 20 63 61 74 63 68 20   {..      catch 
2c70: 7b 75 72 69 20 73 6f 66 74 77 61 72 65 75 70 64  {uri softwareupd
2c80: 61 74 65 73 20 74 72 75 65 7d 0d 0a 20 20 20 20  ates true}..    
2c90: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
2ca0: 73 65 74 20 74 72 75 73 74 65 64 20 66 61 6c 73  set trusted fals
2cb0: 65 3b 20 23 20 4e 4f 54 45 3a 20 41 6c 72 65 61  e; # NOTE: Alrea
2cc0: 64 79 20 74 72 75 73 74 65 64 2e 0d 0a 20 20 20  dy trusted...   
2cd0: 20 7d 0d 0a 0d 0a 20 20 20 20 74 72 79 20 7b 0d   }....    try {.
2ce0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
2cf0: 23 20 4e 4f 54 45 3a 20 44 6f 77 6e 6c 6f 61 64  # NOTE: Download
2d00: 20 74 68 65 20 74 61 67 20 66 69 6c 65 20 66 72   the tag file fr
2d10: 6f 6d 20 74 68 65 20 77 65 62 20 73 69 74 65 2e  om the web site.
2d20: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
2d30: 20 72 65 74 75 72 6e 20 5b 75 72 69 20 64 6f 77   return [uri dow
2d40: 6e 6c 6f 61 64 20 2d 69 6e 6c 69 6e 65 20 24 75  nload -inline $u
2d50: 72 69 5d 3b 20 23 20 73 79 6e 63 68 72 6f 6e 6f  ri]; # synchrono
2d60: 75 73 2e 0d 0a 20 20 20 20 7d 20 66 69 6e 61 6c  us...    } final
2d70: 6c 79 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b  ly {..      if {
2d80: 24 74 72 75 73 74 65 64 20 26 26 20 5c 0d 0a 20  $trusted && \.. 
2d90: 20 20 20 20 20 20 20 20 20 5b 6c 69 6e 64 65 78           [lindex
2da0: 20 5b 75 72 69 20 73 6f 66 74 77 61 72 65 75 70   [uri softwareup
2db0: 64 61 74 65 73 5d 20 65 6e 64 5d 20 65 71 20 22  dates] end] eq "
2dc0: 74 72 75 73 74 65 64 22 7d 20 74 68 65 6e 20 7b  trusted"} then {
2dd0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2de0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 74 6f       # NOTE: Sto
2df0: 70 20 74 72 75 73 74 69 6e 67 20 4f 4e 4c 59 20  p trusting ONLY 
2e00: 6f 75 72 20 6f 77 6e 20 73 65 6c 66 2d 73 69 67  our own self-sig
2e10: 6e 65 64 20 53 53 4c 20 63 65 72 74 69 66 69 63  ned SSL certific
2e20: 61 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ate...        #.
2e30: 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
2e40: 75 72 69 20 73 6f 66 74 77 61 72 65 75 70 64 61  uri softwareupda
2e50: 74 65 73 20 66 61 6c 73 65 7d 0d 0a 20 20 20 20  tes false}..    
2e60: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d    }..    }..  }.
2e70: 0a 0c 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54  ....  #..  # NOT
2e80: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
2e90: 65 20 64 6f 77 6e 6c 6f 61 64 73 20 61 6e 20 75  e downloads an u
2ea0: 70 64 61 74 65 20 73 63 72 69 70 74 20 61 6e 64  pdate script and
2eb0: 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 69 74   then returns it
2ec0: 0d 0a 20 20 23 20 20 20 20 20 20 20 76 65 72 62  ..  #       verb
2ed0: 61 74 69 6d 2e 0d 0a 20 20 23 0d 0a 20 20 70 72  atim...  #..  pr
2ee0: 6f 63 20 67 65 74 55 70 64 61 74 65 53 63 72 69  oc getUpdateScri
2ef0: 70 74 44 61 74 61 20 7b 20 75 72 69 20 7d 20 7b  ptData { uri } {
2f00: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
2f10: 4f 54 45 3a 20 53 74 61 72 74 20 74 72 75 73 74  OTE: Start trust
2f20: 69 6e 67 20 4f 4e 4c 59 20 6f 75 72 20 6f 77 6e  ing ONLY our own
2f30: 20 73 65 6c 66 2d 73 69 67 6e 65 64 20 53 53 4c   self-signed SSL
2f40: 20 63 65 72 74 69 66 69 63 61 74 65 2e 0d 0a 20   certificate... 
2f50: 20 20 20 23 0d 0a 20 20 20 20 73 65 74 20 74 72     #..    set tr
2f60: 75 73 74 65 64 20 74 72 75 65 0d 0a 0d 0a 20 20  usted true....  
2f70: 20 20 69 66 20 7b 5b 6c 69 6e 64 65 78 20 5b 75    if {[lindex [u
2f80: 72 69 20 73 6f 66 74 77 61 72 65 75 70 64 61 74  ri softwareupdat
2f90: 65 73 5d 20 65 6e 64 5d 20 65 71 20 22 75 6e 74  es] end] eq "unt
2fa0: 72 75 73 74 65 64 22 7d 20 74 68 65 6e 20 7b 0d  rusted"} then {.
2fb0: 0a 20 20 20 20 20 20 63 61 74 63 68 20 7b 75 72  .      catch {ur
2fc0: 69 20 73 6f 66 74 77 61 72 65 75 70 64 61 74 65  i softwareupdate
2fd0: 73 20 74 72 75 65 7d 0d 0a 20 20 20 20 7d 20 65  s true}..    } e
2fe0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  lse {..      set
2ff0: 20 74 72 75 73 74 65 64 20 66 61 6c 73 65 3b 20   trusted false; 
3000: 23 20 4e 4f 54 45 3a 20 41 6c 72 65 61 64 79 20  # NOTE: Already 
3010: 74 72 75 73 74 65 64 2e 0d 0a 20 20 20 20 7d 0d  trusted...    }.
3020: 0a 0d 0a 20 20 20 20 74 72 79 20 7b 0d 0a 20 20  ...    try {..  
3030: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
3040: 4f 54 45 3a 20 44 6f 77 6e 6c 6f 61 64 20 74 68  OTE: Download th
3050: 65 20 73 63 72 69 70 74 20 66 69 6c 65 20 66 72  e script file fr
3060: 6f 6d 20 74 68 65 20 77 65 62 20 73 69 74 65 2e  om the web site.
3070: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
3080: 20 72 65 74 75 72 6e 20 5b 69 6e 74 65 72 70 20   return [interp 
3090: 72 65 61 64 6f 72 67 65 74 73 63 72 69 70 74 66  readorgetscriptf
30a0: 69 6c 65 20 2d 2d 20 22 22 20 24 75 72 69 5d 3b  ile -- "" $uri];
30b0: 20 23 20 73 79 6e 63 68 72 6f 6e 6f 75 73 2e 0d   # synchronous..
30c0: 0a 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b  .    } finally {
30d0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 74 72 75  ..      if {$tru
30e0: 73 74 65 64 20 26 26 20 5c 0d 0a 20 20 20 20 20  sted && \..     
30f0: 20 20 20 20 20 5b 6c 69 6e 64 65 78 20 5b 75 72       [lindex [ur
3100: 69 20 73 6f 66 74 77 61 72 65 75 70 64 61 74 65  i softwareupdate
3110: 73 5d 20 65 6e 64 5d 20 65 71 20 22 74 72 75 73  s] end] eq "trus
3120: 74 65 64 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ted"} then {..  
3130: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
3140: 20 23 20 4e 4f 54 45 3a 20 53 74 6f 70 20 74 72   # NOTE: Stop tr
3150: 75 73 74 69 6e 67 20 4f 4e 4c 59 20 6f 75 72 20  usting ONLY our 
3160: 6f 77 6e 20 73 65 6c 66 2d 73 69 67 6e 65 64 20  own self-signed 
3170: 53 53 4c 20 63 65 72 74 69 66 69 63 61 74 65 2e  SSL certificate.
3180: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
3190: 20 20 20 20 20 63 61 74 63 68 20 7b 75 72 69 20       catch {uri 
31a0: 73 6f 66 74 77 61 72 65 75 70 64 61 74 65 73 20  softwareupdates 
31b0: 66 61 6c 73 65 7d 0d 0a 20 20 20 20 20 20 7d 0d  false}..      }.
31c0: 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a  .    }..  }.....
31d0: 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 54    #..  # NOTE: T
31e0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
31f0: 74 75 72 6e 73 20 74 68 65 20 62 61 73 65 20 55  turns the base U
3200: 52 49 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  RI that should b
3210: 65 20 75 73 65 64 20 74 6f 20 64 6f 77 6e 6c 6f  e used to downlo
3220: 61 64 0d 0a 20 20 23 20 20 20 20 20 20 20 61 76  ad..  #       av
3230: 61 69 6c 61 62 6c 65 20 75 70 64 61 74 65 73 2c  ailable updates,
3240: 20 69 66 20 61 20 73 70 65 63 69 66 69 63 20 62   if a specific b
3250: 61 73 65 20 55 52 49 20 69 73 20 6e 6f 74 20 73  ase URI is not s
3260: 70 65 63 69 66 69 65 64 20 76 69 61 20 74 68 65  pecified via the
3270: 0d 0a 20 20 23 20 20 20 20 20 20 20 6d 61 6e 69  ..  #       mani
3280: 66 65 73 74 20 6f 66 20 61 76 61 69 6c 61 62 6c  fest of availabl
3290: 65 20 75 70 64 61 74 65 73 2e 0d 0a 20 20 23 0d  e updates...  #.
32a0: 0a 20 20 70 72 6f 63 20 67 65 74 44 6f 77 6e 6c  .  proc getDownl
32b0: 6f 61 64 42 61 73 65 55 72 69 20 7b 7d 20 7b 0d  oadBaseUri {} {.
32c0: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
32d0: 54 45 3a 20 4a 75 73 74 20 72 65 74 75 72 6e 20  TE: Just return 
32e0: 74 68 65 20 63 75 72 72 65 6e 74 20 62 61 73 65  the current base
32f0: 20 55 52 49 20 66 6f 72 20 64 6f 77 6e 6c 6f 61   URI for downloa
3300: 64 73 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  ds...    #..    
3310: 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20 65 6e 67  return [info eng
3320: 69 6e 65 20 44 6f 77 6e 6c 6f 61 64 42 61 73 65  ine DownloadBase
3330: 55 72 69 5d 3b 20 23 20 4e 4f 54 45 3a 20 43 75  Uri]; # NOTE: Cu
3340: 72 72 65 6e 74 2e 0d 0a 20 20 7d 0d 0a 0c 0d 0a  rrent...  }.....
3350: 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 54    #..  # NOTE: T
3360: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
3370: 74 75 72 6e 73 20 74 68 65 20 62 61 73 65 20 55  turns the base U
3380: 52 49 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  RI that should b
3390: 65 20 75 73 65 64 20 74 6f 20 64 6f 77 6e 6c 6f  e used to downlo
33a0: 61 64 0d 0a 20 20 23 20 20 20 20 20 20 20 61 76  ad..  #       av
33b0: 61 69 6c 61 62 6c 65 20 73 63 72 69 70 74 73 2c  ailable scripts,
33c0: 20 69 66 20 61 20 73 70 65 63 69 66 69 63 20 62   if a specific b
33d0: 61 73 65 20 55 52 49 20 69 73 20 6e 6f 74 20 73  ase URI is not s
33e0: 70 65 63 69 66 69 65 64 20 76 69 61 20 74 68 65  pecified via the
33f0: 0d 0a 20 20 23 20 20 20 20 20 20 20 6d 61 6e 69  ..  #       mani
3400: 66 65 73 74 20 6f 66 20 61 76 61 69 6c 61 62 6c  fest of availabl
3410: 65 20 73 63 72 69 70 74 73 2e 0d 0a 20 20 23 0d  e scripts...  #.
3420: 0a 20 20 70 72 6f 63 20 67 65 74 53 63 72 69 70  .  proc getScrip
3430: 74 42 61 73 65 55 72 69 20 7b 7d 20 7b 0d 0a 20  tBaseUri {} {.. 
3440: 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45     #..    # NOTE
3450: 3a 20 4a 75 73 74 20 72 65 74 75 72 6e 20 74 68  : Just return th
3460: 65 20 63 75 72 72 65 6e 74 20 62 61 73 65 20 55  e current base U
3470: 52 49 20 66 6f 72 20 73 63 72 69 70 74 73 2e 0d  RI for scripts..
3480: 0a 20 20 20 20 23 0d 0a 20 20 20 20 72 65 74 75  .    #..    retu
3490: 72 6e 20 5b 69 6e 66 6f 20 65 6e 67 69 6e 65 20  rn [info engine 
34a0: 53 63 72 69 70 74 42 61 73 65 55 72 69 5d 3b 20  ScriptBaseUri]; 
34b0: 23 20 4e 4f 54 45 3a 20 43 75 72 72 65 6e 74 2e  # NOTE: Current.
34c0: 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a 20  ..  }.....  #.. 
34d0: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
34e0: 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20  ocedure returns 
34f0: 74 68 65 20 62 61 73 65 20 55 52 49 20 74 68 61  the base URI tha
3500: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
3510: 20 74 6f 20 64 6f 77 6e 6c 6f 61 64 0d 0a 20 20   to download..  
3520: 23 20 20 20 20 20 20 20 61 75 78 69 6c 69 61 72  #       auxiliar
3530: 79 20 64 61 74 61 2e 0d 0a 20 20 23 0d 0a 20 20  y data...  #..  
3540: 70 72 6f 63 20 67 65 74 41 75 78 69 6c 69 61 72  proc getAuxiliar
3550: 79 42 61 73 65 55 72 69 20 7b 7d 20 7b 0d 0a 20  yBaseUri {} {.. 
3560: 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45     #..    # NOTE
3570: 3a 20 4a 75 73 74 20 72 65 74 75 72 6e 20 74 68  : Just return th
3580: 65 20 63 75 72 72 65 6e 74 20 62 61 73 65 20 55  e current base U
3590: 52 49 20 66 6f 72 20 61 75 78 69 6c 69 61 72 79  RI for auxiliary
35a0: 20 64 61 74 61 2e 0d 0a 20 20 20 20 23 0d 0a 20   data...    #.. 
35b0: 20 20 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20     return [info 
35c0: 65 6e 67 69 6e 65 20 41 75 78 69 6c 69 61 72 79  engine Auxiliary
35d0: 42 61 73 65 55 72 69 5d 3b 20 23 20 4e 4f 54 45  BaseUri]; # NOTE
35e0: 3a 20 43 75 72 72 65 6e 74 2e 0d 0a 20 20 7d 0d  : Current...  }.
35f0: 0a 0c 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54  ....  #..  # NOT
3600: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
3610: 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65  e is used to che
3620: 63 6b 20 66 6f 72 20 6e 65 77 20 76 65 72 73 69  ck for new versi
3630: 6f 6e 73 20 2d 4f 52 2d 20 6e 65 77 20 75 70 64  ons -OR- new upd
3640: 61 74 65 0d 0a 20 20 23 20 20 20 20 20 20 20 73  ate..  #       s
3650: 63 72 69 70 74 73 20 66 6f 72 20 74 68 65 20 72  cripts for the r
3660: 75 6e 74 69 6d 65 20 77 68 65 6e 20 61 20 75 73  untime when a us
3670: 65 72 20 65 78 65 63 75 74 65 73 20 74 68 65 20  er executes the 
3680: 69 6e 74 65 72 61 63 74 69 76 65 0d 0a 20 20 23  interactive..  #
3690: 20 20 20 20 20 20 20 22 23 63 68 65 63 6b 22 20         "#check" 
36a0: 63 6f 6d 6d 61 6e 64 2e 20 20 54 6f 20 64 69 73  command.  To dis
36b0: 61 62 6c 65 20 74 68 69 73 20 66 75 6e 63 74 69  able this functi
36c0: 6f 6e 61 6c 69 74 79 2c 20 73 69 6d 70 6c 79 20  onality, simply 
36d0: 72 65 64 65 66 69 6e 65 0d 0a 20 20 23 20 20 20  redefine..  #   
36e0: 20 20 20 20 74 68 69 73 20 70 72 6f 63 65 64 75      this procedu
36f0: 72 65 20 74 6f 20 64 6f 20 6e 6f 74 68 69 6e 67  re to do nothing
3700: 2e 0d 0a 20 20 23 0d 0a 20 20 70 72 6f 63 20 63  ...  #..  proc c
3710: 68 65 63 6b 46 6f 72 55 70 64 61 74 65 20 7b 0d  heckForUpdate {.
3720: 0a 20 20 20 20 20 20 20 20 20 20 7b 77 61 6e 74  .          {want
3730: 53 63 72 69 70 74 73 20 66 61 6c 73 65 7d 20 7b  Scripts false} {
3740: 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7b 70 72  quiet false} {pr
3750: 6f 6d 70 74 20 66 61 6c 73 65 7d 0d 0a 20 20 20  ompt false}..   
3760: 20 20 20 20 20 20 20 7b 61 75 74 6f 6d 61 74 69         {automati
3770: 63 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  c false} } {..  
3780: 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
3790: 20 47 72 61 62 20 74 68 65 20 62 61 73 65 20 55   Grab the base U
37a0: 52 49 20 66 6f 72 20 75 70 64 61 74 65 73 2e 0d  RI for updates..
37b0: 0a 20 20 20 20 23 0d 0a 20 20 20 20 73 65 74 20  .    #..    set 
37c0: 75 70 64 61 74 65 42 61 73 65 55 72 69 20 5b 69  updateBaseUri [i
37d0: 6e 66 6f 20 65 6e 67 69 6e 65 20 55 70 64 61 74  nfo engine Updat
37e0: 65 42 61 73 65 55 72 69 5d 0d 0a 0d 0a 20 20 20  eBaseUri]....   
37f0: 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
3800: 47 72 61 62 20 74 68 65 20 75 70 64 61 74 65 20  Grab the update 
3810: 70 61 74 68 20 61 6e 64 20 71 75 65 72 79 20 73  path and query s
3820: 74 72 69 6e 67 20 75 73 65 64 20 66 6f 72 20 75  tring used for u
3830: 70 64 61 74 65 73 2e 0d 0a 20 20 20 20 23 0d 0a  pdates...    #..
3840: 20 20 20 20 73 65 74 20 75 70 64 61 74 65 50 61      set updatePa
3850: 74 68 41 6e 64 51 75 65 72 79 20 5b 69 6e 66 6f  thAndQuery [info
3860: 20 65 6e 67 69 6e 65 20 55 70 64 61 74 65 50 61   engine UpdatePa
3870: 74 68 41 6e 64 51 75 65 72 79 5d 0d 0a 0d 0a 20  thAndQuery].... 
3880: 20 20 20 23 0d 0a 20 20 20 20 23 20 48 41 43 4b     #..    # HACK
3890: 3a 20 45 78 72 61 63 74 20 74 68 65 20 55 52 49  : Exract the URI
38a0: 20 74 79 70 65 20 28 65 2e 67 2e 20 22 73 74 61   type (e.g. "sta
38b0: 62 6c 65 22 20 6f 72 20 22 6c 61 74 65 73 74 22  ble" or "latest"
38c0: 29 20 66 72 6f 6d 20 74 68 65 0d 0a 20 20 20 20  ) from the..    
38d0: 23 20 20 20 20 20 20 20 75 70 64 61 74 65 20 70  #       update p
38e0: 61 74 68 20 61 6e 64 20 71 75 65 72 79 2e 20 20  ath and query.  
38f0: 54 68 69 73 20 63 6f 64 65 20 6d 61 79 20 6e 65  This code may ne
3900: 65 64 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65  ed to be modifie
3910: 64 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 69  d..    #       i
3920: 6e 20 74 68 65 20 66 75 74 75 72 65 2e 0d 0a 20  n the future... 
3930: 20 20 20 23 0d 0a 20 20 20 20 73 65 74 20 75 70     #..    set up
3940: 64 61 74 65 55 72 69 54 79 70 65 20 5b 6c 69 6e  dateUriType [lin
3950: 64 65 78 20 5b 73 70 6c 69 74 20 24 75 70 64 61  dex [split $upda
3960: 74 65 50 61 74 68 41 6e 64 51 75 65 72 79 20 2e  tePathAndQuery .
3970: 5d 20 30 5d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20  ] 0]....    #.. 
3980: 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 6d 62 69     # NOTE: Combi
3990: 6e 65 20 74 68 65 6d 20 74 6f 20 66 6f 72 6d 20  ne them to form 
39a0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 75 70 64  the complete upd
39b0: 61 74 65 20 55 52 49 2e 0d 0a 20 20 20 20 23 0d  ate URI...    #.
39c0: 0a 20 20 20 20 73 65 74 20 75 70 64 61 74 65 55  .    set updateU
39d0: 72 69 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  ri [appendArgs $
39e0: 75 70 64 61 74 65 42 61 73 65 55 72 69 20 24 75  updateBaseUri $u
39f0: 70 64 61 74 65 50 61 74 68 41 6e 64 51 75 65 72  pdatePathAndQuer
3a00: 79 5d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20  y]....    #..   
3a10: 20 23 20 4e 4f 54 45 3a 20 46 65 74 63 68 20 74   # NOTE: Fetch t
3a20: 68 65 20 6d 61 73 74 65 72 20 75 70 64 61 74 65  he master update
3a30: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64   data from the d
3a40: 69 73 74 72 69 62 75 74 69 6f 6e 20 73 69 74 65  istribution site
3a50: 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 61 6e  ..    #       an
3a60: 64 20 6e 6f 72 6d 61 6c 69 7a 65 20 74 6f 20 55  d normalize to U
3a70: 6e 69 78 2d 73 74 79 6c 65 20 6c 69 6e 65 2d 65  nix-style line-e
3a80: 6e 64 69 6e 67 73 2e 0d 0a 20 20 20 20 23 0d 0a  ndings...    #..
3a90: 20 20 20 20 73 65 74 20 75 70 64 61 74 65 44 61      set updateDa
3aa0: 74 61 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b  ta [string map [
3ab0: 6c 69 73 74 20 5c 72 5c 6e 20 5c 6e 5d 20 5b 67  list \r\n \n] [g
3ac0: 65 74 55 70 64 61 74 65 44 61 74 61 20 24 75 70  etUpdateData $up
3ad0: 64 61 74 65 55 72 69 5d 5d 0d 0a 0d 0a 20 20 20  dateUri]]....   
3ae0: 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
3af0: 53 70 6c 69 74 20 74 68 65 20 64 61 74 61 20 69  Split the data i
3b00: 6e 74 6f 20 6c 69 6e 65 73 2e 0d 0a 20 20 20 20  nto lines...    
3b10: 23 0d 0a 20 20 20 20 73 65 74 20 6c 69 6e 65 73  #..    set lines
3b20: 20 5b 73 70 6c 69 74 20 24 75 70 64 61 74 65 44   [split $updateD
3b30: 61 74 61 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 23  ata \n]....    #
3b40: 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 4b 65  ..    # NOTE: Ke
3b50: 65 70 20 74 72 61 63 6b 20 6f 66 20 68 6f 77 20  ep track of how 
3b60: 6d 61 6e 79 20 75 70 64 61 74 65 20 73 63 72 69  many update scri
3b70: 70 74 73 20 61 72 65 20 70 72 6f 63 65 73 73 65  pts are processe
3b80: 64 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 61  d...    #..    a
3b90: 72 72 61 79 20 73 65 74 20 73 63 72 69 70 74 43  rray set scriptC
3ba0: 6f 75 6e 74 20 7b 0d 0a 20 20 20 20 20 20 69 6e  ount {..      in
3bb0: 76 61 6c 69 64 20 20 20 20 20 20 20 20 20 20 20  valid           
3bc0: 20 30 20 66 61 69 6c 20 20 20 20 20 20 20 20 20   0 fail         
3bd0: 20 20 20 20 20 20 30 20 62 61 64 20 20 20 20 20        0 bad     
3be0: 20 20 20 20 20 20 20 20 20 20 20 30 0d 0a 20 20             0..  
3bf0: 20 20 20 20 6f 6b 20 20 20 20 20 20 20 20 20 20      ok          
3c00: 20 20 20 20 20 20 20 30 20 65 72 72 6f 72 20 20         0 error  
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 30 0d 0a 20              0.. 
3c20: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20     }....    #.. 
3c30: 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
3c40: 20 65 61 63 68 20 6c 69 6e 65 20 74 6f 20 66 69   each line to fi
3c50: 6e 64 20 74 68 65 20 62 75 69 6c 64 20 69 6e 66  nd the build inf
3c60: 6f 72 6d 61 74 69 6f 6e 2e 2e 2e 0d 0a 20 20 20  ormation.....   
3c70: 20 23 0d 0a 20 20 20 20 66 6f 72 65 61 63 68 20   #..    foreach 
3c80: 6c 69 6e 65 20 24 6c 69 6e 65 73 20 7b 0d 0a 20  line $lines {.. 
3c90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
3ca0: 4e 4f 54 45 3a 20 52 65 6d 6f 76 65 20 65 78 63  NOTE: Remove exc
3cb0: 65 73 73 20 77 68 69 74 65 73 70 61 63 65 2e 0d  ess whitespace..
3cc0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3cd0: 73 65 74 20 6c 69 6e 65 20 5b 73 74 72 69 6e 67  set line [string
3ce0: 20 74 72 69 6d 20 24 6c 69 6e 65 5d 0d 0a 0d 0a   trim $line]....
3cf0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
3d00: 20 4e 4f 54 45 3a 20 53 6b 69 70 20 62 6c 61 6e   NOTE: Skip blan
3d10: 6b 20 6c 69 6e 65 73 2e 0d 0a 20 20 20 20 20 20  k lines...      
3d20: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
3d30: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6c 69 6e  ring length $lin
3d40: 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
3d50: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3d60: 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
3d70: 63 6f 6d 6d 65 6e 74 20 6c 69 6e 65 73 2e 0d 0a  comment lines...
3d80: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3d90: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69     if {[string i
3da0: 6e 64 65 78 20 24 6c 69 6e 65 20 30 5d 20 6e 65  ndex $line 0] ne
3db0: 20 22 23 22 20 26 26 20 5c 0d 0a 20 20 20 20 20   "#" && \..     
3dc0: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 69         [string i
3dd0: 6e 64 65 78 20 24 6c 69 6e 65 20 30 5d 20 6e 65  ndex $line 0] ne
3de0: 20 22 3b 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   ";"} then {..  
3df0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3e00: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 70 6c       # NOTE: Spl
3e10: 69 74 20 74 68 65 20 74 61 62 2d 64 65 6c 69 6d  it the tab-delim
3e20: 69 74 65 64 20 6c 69 6e 65 20 69 6e 74 6f 20 66  ited line into f
3e30: 69 65 6c 64 73 2e 20 20 54 68 65 20 66 6f 72 6d  ields.  The form
3e40: 61 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  at..          # 
3e50: 20 20 20 20 20 20 6f 66 20 61 6c 6c 20 6c 69 6e        of all lin
3e60: 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 20 6d  es in the data m
3e70: 75 73 74 20 62 65 20 61 73 20 66 6f 6c 6c 6f 77  ust be as follow
3e80: 73 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  s:..          #.
3e90: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
3ea0: 20 20 20 3c 73 74 61 72 74 4c 69 6e 65 3e 20 70     <startLine> p
3eb0: 72 6f 74 6f 63 6f 6c 49 64 20 3c 74 61 62 3e 20  rotocolId <tab> 
3ec0: 70 75 62 6c 69 63 4b 65 79 54 6f 6b 65 6e 20 3c  publicKeyToken <
3ed0: 74 61 62 3e 20 6e 61 6d 65 0d 0a 20 20 20 20 20  tab> name..     
3ee0: 20 20 20 20 20 23 20 20 20 20 20 20 20 3c 74 61       #       <ta
3ef0: 62 3e 20 63 75 6c 74 75 72 65 20 3c 74 61 62 3e  b> culture <tab>
3f00: 20 70 61 74 63 68 4c 65 76 65 6c 20 3c 74 61 62   patchLevel <tab
3f10: 3e 20 74 69 6d 65 53 74 61 6d 70 20 3c 74 61 62  > timeStamp <tab
3f20: 3e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  >..          #  
3f30: 20 20 20 20 20 62 61 73 65 55 72 69 20 3c 74 61       baseUri <ta
3f40: 62 3e 20 6d 64 35 48 61 73 68 20 3c 74 61 62 3e  b> md5Hash <tab>
3f50: 20 73 68 61 31 48 61 73 68 20 3c 74 61 62 3e 20   sha1Hash <tab> 
3f60: 73 68 61 35 31 32 48 61 73 68 0d 0a 20 20 20 20  sha512Hash..    
3f70: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 3c 74        #       <t
3f80: 61 62 3e 20 6e 6f 74 65 73 20 3c 6e 65 77 4c 69  ab> notes <newLi
3f90: 6e 65 3e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ne>..          #
3fa0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
3fb0: 66 69 65 6c 64 73 20 5b 73 70 6c 69 74 20 24 6c  fields [split $l
3fc0: 69 6e 65 20 5c 74 5d 0d 0a 0d 0a 20 20 20 20 20  ine \t]....     
3fd0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
3fe0: 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74    # NOTE: Grab t
3ff0: 68 65 20 70 72 6f 74 6f 63 6f 6c 20 49 64 20 66  he protocol Id f
4000: 69 65 6c 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  ield...         
4010: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
4020: 74 20 70 72 6f 74 6f 63 6f 6c 49 64 20 5b 6c 69  t protocolId [li
4030: 6e 64 65 78 20 24 66 69 65 6c 64 73 20 30 5d 0d  ndex $fields 0].
4040: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
4050: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
4060: 3a 20 47 72 61 62 20 74 68 65 20 70 75 62 6c 69  : Grab the publi
4070: 63 20 6b 65 79 20 74 6f 6b 65 6e 20 66 69 65 6c  c key token fiel
4080: 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  d...          #.
4090: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70  .          set p
40a0: 75 62 6c 69 63 4b 65 79 54 6f 6b 65 6e 20 5b 6c  ublicKeyToken [l
40b0: 69 6e 64 65 78 20 24 66 69 65 6c 64 73 20 31 5d  index $fields 1]
40c0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
40d0: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
40e0: 45 3a 20 47 72 61 62 20 74 68 65 20 6e 61 6d 65  E: Grab the name
40f0: 20 66 69 65 6c 64 2e 0d 0a 20 20 20 20 20 20 20   field...       
4100: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
4110: 73 65 74 20 6e 61 6d 65 20 5b 6c 69 6e 64 65 78  set name [lindex
4120: 20 24 66 69 65 6c 64 73 20 32 5d 0d 0a 0d 0a 20   $fields 2].... 
4130: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
4140: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72        # NOTE: Gr
4150: 61 62 20 74 68 65 20 63 75 6c 74 75 72 65 20 66  ab the culture f
4160: 69 65 6c 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  ield...         
4170: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
4180: 74 20 63 75 6c 74 75 72 65 20 5b 6c 69 6e 64 65  t culture [linde
4190: 78 20 24 66 69 65 6c 64 73 20 33 5d 0d 0a 0d 0a  x $fields 3]....
41a0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
41b0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
41c0: 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20  igure out which 
41d0: 70 72 6f 74 6f 63 6f 6c 20 69 73 20 69 6e 20 75  protocol is in u
41e0: 73 65 20 66 6f 72 20 74 68 69 73 20 6c 69 6e 65  se for this line
41f0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  ...          #  
4200: 20 20 20 20 20 54 68 65 20 76 61 6c 75 65 20 22       The value "
4210: 31 22 20 6d 65 61 6e 73 20 74 68 69 73 20 6c 69  1" means this li
4220: 6e 65 20 73 70 65 63 69 66 69 65 73 20 61 20 62  ne specifies a b
4230: 75 69 6c 64 20 6f 66 0d 0a 20 20 20 20 20 20 20  uild of..       
4240: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 73     #       the s
4250: 63 72 69 70 74 20 65 6e 67 69 6e 65 2e 20 20 54  cript engine.  T
4260: 68 65 20 76 61 6c 75 65 20 22 32 22 20 6d 65 61  he value "2" mea
4270: 6e 73 20 74 68 69 73 20 6c 69 6e 65 0d 0a 20 20  ns this line..  
4280: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4290: 73 70 65 63 69 66 69 65 73 20 61 6e 20 75 70 64  specifies an upd
42a0: 61 74 65 20 73 63 72 69 70 74 20 28 76 69 61 20  ate script (via 
42b0: 61 20 55 52 49 29 20 74 6f 20 65 76 61 6c 75 61  a URI) to evalua
42c0: 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  te...          #
42d0: 20 20 20 20 20 20 20 41 6c 6c 20 6f 74 68 65 72         All other
42e0: 20 76 61 6c 75 65 73 20 61 72 65 20 63 75 72 72   values are curr
42f0: 65 6e 74 6c 79 20 72 65 73 65 72 76 65 64 20 61  ently reserved a
4300: 6e 64 20 69 67 6e 6f 72 65 64 2e 0d 0a 20 20 20  nd ignored...   
4310: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4320: 20 20 20 20 73 65 74 20 63 68 65 63 6b 42 75 69      set checkBui
4330: 6c 64 20 5b 65 78 70 72 20 7b 21 24 77 61 6e 74  ld [expr {!$want
4340: 53 63 72 69 70 74 73 20 26 26 20 24 70 72 6f 74  Scripts && $prot
4350: 6f 63 6f 6c 49 64 20 65 71 20 22 31 22 7d 5d 0d  ocolId eq "1"}].
4360: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63  .          set c
4370: 68 65 63 6b 53 63 72 69 70 74 20 5b 65 78 70 72  heckScript [expr
4380: 20 7b 24 77 61 6e 74 53 63 72 69 70 74 73 20 26   {$wantScripts &
4390: 26 20 24 70 72 6f 74 6f 63 6f 6c 49 64 20 65 71  & $protocolId eq
43a0: 20 22 32 22 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20   "2"}]....      
43b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
43c0: 20 23 20 4e 4f 54 45 3a 20 57 65 20 6f 6e 6c 79   # NOTE: We only
43d0: 20 77 61 6e 74 20 74 6f 20 66 69 6e 64 20 74 68   want to find th
43e0: 65 20 66 69 72 73 74 20 6c 69 6e 65 20 74 68 61  e first line tha
43f0: 74 20 6d 61 74 63 68 65 73 20 6f 75 72 0d 0a 20  t matches our.. 
4400: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
4410: 20 65 6e 67 69 6e 65 2e 20 20 54 68 65 20 70 75   engine.  The pu
4420: 62 6c 69 63 20 6b 65 79 20 74 6f 6b 65 6e 20 69  blic key token i
4430: 73 20 62 65 69 6e 67 20 75 73 65 64 20 68 65 72  s being used her
4440: 65 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 20 20  e to..          
4450: 23 20 20 20 20 20 20 20 6d 61 6b 65 20 73 75 72  #       make sur
4460: 65 20 77 65 20 67 65 74 20 74 68 65 20 73 61 6d  e we get the sam
4470: 65 20 22 66 6c 61 76 6f 72 22 20 6f 66 20 74 68  e "flavor" of th
4480: 65 20 65 6e 67 69 6e 65 2e 0d 0a 20 20 20 20 20  e engine...     
4490: 20 20 20 20 20 23 20 20 20 20 20 20 20 54 68 65       #       The
44a0: 20 6c 69 6e 65 73 20 61 72 65 20 6f 72 67 61 6e   lines are organ
44b0: 69 7a 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  ized so that the
44c0: 20 22 6c 61 74 65 73 74 20 73 74 61 62 6c 65 0d   "latest stable.
44d0: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
44e0: 20 20 20 76 65 72 73 69 6f 6e 22 20 69 73 20 6f     version" is o
44f0: 6e 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65  n the first line
4500: 20 28 66 6f 72 20 61 20 67 69 76 65 6e 20 70 75   (for a given pu
4510: 62 6c 69 63 20 6b 65 79 0d 0a 20 20 20 20 20 20  blic key..      
4520: 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 6b 65      #       toke
4530: 6e 29 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  n), followed by 
4540: 64 65 76 65 6c 6f 70 6d 65 6e 74 20 62 75 69 6c  development buil
4550: 64 73 2c 20 65 78 70 65 72 69 6d 65 6e 74 61 6c  ds, experimental
4560: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
4570: 20 20 20 20 62 75 69 6c 64 73 2c 20 65 74 63 2e      builds, etc.
4580: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
4590: 20 20 20 20 20 20 20 20 20 69 66 20 7b 28 24 63           if {($c
45a0: 68 65 63 6b 42 75 69 6c 64 20 7c 7c 20 24 63 68  heckBuild || $ch
45b0: 65 63 6b 53 63 72 69 70 74 29 20 26 26 20 5c 0d  eckScript) && \.
45c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
45d0: 6d 61 74 63 68 45 6e 67 69 6e 65 50 75 62 6c 69  matchEnginePubli
45e0: 63 4b 65 79 54 6f 6b 65 6e 20 24 70 75 62 6c 69  cKeyToken $publi
45f0: 63 4b 65 79 54 6f 6b 65 6e 5d 20 26 26 20 5c 0d  cKeyToken] && \.
4600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
4610: 6d 61 74 63 68 45 6e 67 69 6e 65 4e 61 6d 65 20  matchEngineName 
4620: 24 6e 61 6d 65 5d 20 26 26 20 5c 0d 0a 20 20 20  $name] && \..   
4630: 20 20 20 20 20 20 20 20 20 20 20 5b 6d 61 74 63             [matc
4640: 68 45 6e 67 69 6e 65 43 75 6c 74 75 72 65 20 24  hEngineCulture $
4650: 63 75 6c 74 75 72 65 5d 7d 20 74 68 65 6e 20 7b  culture]} then {
4660: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
4670: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
4680: 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20 70 61  OTE: Grab the pa
4690: 74 63 68 20 6c 65 76 65 6c 20 66 69 65 6c 64 2e  tch level field.
46a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
46b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
46c0: 20 70 61 74 63 68 4c 65 76 65 6c 20 5b 6c 69 6e   patchLevel [lin
46d0: 64 65 78 20 24 66 69 65 6c 64 73 20 34 5d 0d 0a  dex $fields 4]..
46e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
46f0: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
4700: 20 24 70 61 74 63 68 4c 65 76 65 6c 5d 20 3d 3d   $patchLevel] ==
4710: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
4720: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70 61            set pa
4730: 74 63 68 4c 65 76 65 6c 20 30 2e 30 2e 30 2e 30  tchLevel 0.0.0.0
4740: 3b 20 23 20 6e 6f 20 70 61 74 63 68 20 6c 65 76  ; # no patch lev
4750: 65 6c 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 20  el?..           
4760: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
4770: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
4780: 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68   # NOTE: Grab th
4790: 65 20 74 69 6d 65 2d 73 74 61 6d 70 20 66 69 65  e time-stamp fie
47a0: 6c 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ld...           
47b0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
47c0: 73 65 74 20 74 69 6d 65 53 74 61 6d 70 20 5b 6c  set timeStamp [l
47d0: 69 6e 64 65 78 20 24 66 69 65 6c 64 73 20 35 5d  index $fields 5]
47e0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
47f0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
4800: 74 68 20 24 74 69 6d 65 53 74 61 6d 70 5d 20 3d  th $timeStamp] =
4810: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
4820: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 74             set t
4830: 69 6d 65 53 74 61 6d 70 20 30 3b 20 23 6e 65 76  imeStamp 0; #nev
4840: 65 72 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 20  er?..           
4850: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
4860: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
4870: 20 23 20 4e 4f 54 45 3a 20 57 68 61 74 20 73 68   # NOTE: What sh
4880: 6f 75 6c 64 20 74 68 65 20 44 61 74 65 54 69 6d  ould the DateTim
4890: 65 20 66 6f 72 6d 61 74 20 62 65 20 66 6f 72 20  e format be for 
48a0: 64 69 73 70 6c 61 79 3f 20 20 54 68 69 73 0d 0a  display?  This..
48b0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
48c0: 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 73 6f      should be so
48d0: 6d 65 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20  me variation on 
48e0: 49 53 4f 2d 38 36 30 31 2e 0d 0a 20 20 20 20 20  ISO-8601...     
48f0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4900: 20 20 20 20 20 20 73 65 74 20 64 61 74 65 54 69        set dateTi
4910: 6d 65 46 6f 72 6d 61 74 20 79 79 79 79 2d 4d 4d  meFormat yyyy-MM
4920: 2d 64 64 54 48 48 3a 6d 6d 3a 73 73 0d 0a 0d 0a  -ddTHH:mm:ss....
4930: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
4940: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
4950: 45 3a 20 44 6f 65 73 20 69 74 20 6c 6f 6f 6b 20  E: Does it look 
4960: 6c 69 6b 65 20 74 68 65 20 6e 75 6d 62 65 72 20  like the number 
4970: 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  of seconds since
4980: 20 74 68 65 20 65 70 6f 63 68 0d 0a 20 20 20 20   the epoch..    
4990: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
49a0: 6f 72 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20  or some kind of 
49b0: 64 61 74 65 2f 74 69 6d 65 20 73 74 72 69 6e 67  date/time string
49c0: 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ?..            #
49d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
49e0: 20 7b 5b 73 74 72 69 6e 67 20 69 73 20 69 6e 74   {[string is int
49f0: 65 67 65 72 20 2d 73 74 72 69 63 74 20 24 74 69  eger -strict $ti
4a00: 6d 65 53 74 61 6d 70 5d 7d 20 74 68 65 6e 20 7b  meStamp]} then {
4a10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4a20: 73 65 74 20 64 61 74 65 54 69 6d 65 20 5b 63 6c  set dateTime [cl
4a30: 6f 63 6b 20 66 6f 72 6d 61 74 20 5c 0d 0a 20 20  ock format \..  
4a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a50: 24 74 69 6d 65 53 74 61 6d 70 20 2d 66 6f 72 6d  $timeStamp -form
4a60: 61 74 20 24 64 61 74 65 54 69 6d 65 46 6f 72 6d  at $dateTimeForm
4a70: 61 74 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  at]..           
4a80: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
4a90: 20 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74           set dat
4aa0: 65 54 69 6d 65 20 5b 63 6c 6f 63 6b 20 66 6f 72  eTime [clock for
4ab0: 6d 61 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  mat \..         
4ac0: 20 20 20 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20           [clock 
4ad0: 73 63 61 6e 20 24 74 69 6d 65 53 74 61 6d 70 5d  scan $timeStamp]
4ae0: 20 2d 66 6f 72 6d 61 74 20 24 64 61 74 65 54 69   -format $dateTi
4af0: 6d 65 46 6f 72 6d 61 74 5d 0d 0a 20 20 20 20 20  meFormat]..     
4b00: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
4b10: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
4b20: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47         # NOTE: G
4b30: 72 61 62 20 74 68 65 20 70 61 74 63 68 20 6c 65  rab the patch le
4b40: 76 65 6c 20 66 6f 72 20 74 68 65 20 72 75 6e 6e  vel for the runn
4b50: 69 6e 67 20 65 6e 67 69 6e 65 2e 0d 0a 20 20 20  ing engine...   
4b60: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
4b70: 20 20 20 20 20 20 20 20 73 65 74 20 65 6e 67 69          set engi
4b80: 6e 65 50 61 74 63 68 4c 65 76 65 6c 20 5b 69 6e  nePatchLevel [in
4b90: 66 6f 20 65 6e 67 69 6e 65 20 50 61 74 63 68 4c  fo engine PatchL
4ba0: 65 76 65 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  evel]....       
4bb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4bc0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62      # NOTE: Grab
4bd0: 20 74 68 65 20 74 69 6d 65 2d 73 74 61 6d 70 20   the time-stamp 
4be0: 66 6f 72 20 74 68 65 20 72 75 6e 6e 69 6e 67 20  for the running 
4bf0: 65 6e 67 69 6e 65 2e 0d 0a 20 20 20 20 20 20 20  engine...       
4c00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4c10: 20 20 20 20 73 65 74 20 65 6e 67 69 6e 65 54 69      set engineTi
4c20: 6d 65 53 74 61 6d 70 20 5b 69 6e 66 6f 20 65 6e  meStamp [info en
4c30: 67 69 6e 65 20 54 69 6d 65 53 74 61 6d 70 5d 0d  gine TimeStamp].
4c40: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
4c50: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
4c60: 68 20 24 65 6e 67 69 6e 65 54 69 6d 65 53 74 61  h $engineTimeSta
4c70: 6d 70 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  mp] == 0} then {
4c80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4c90: 73 65 74 20 65 6e 67 69 6e 65 54 69 6d 65 53 74  set engineTimeSt
4ca0: 61 6d 70 20 30 3b 20 23 6e 65 76 65 72 3f 0d 0a  amp 0; #never?..
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
4cc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
4cd0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
4ce0: 54 45 3a 20 44 6f 65 73 20 69 74 20 6c 6f 6f 6b  TE: Does it look
4cf0: 20 6c 69 6b 65 20 74 68 65 20 6e 75 6d 62 65 72   like the number
4d00: 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   of seconds sinc
4d10: 65 20 74 68 65 20 65 70 6f 63 68 0d 0a 20 20 20  e the epoch..   
4d20: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
4d30: 20 6f 72 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66   or some kind of
4d40: 20 64 61 74 65 2f 74 69 6d 65 20 73 74 72 69 6e   date/time strin
4d50: 67 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  g?..            
4d60: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  #..            i
4d70: 66 20 7b 5b 73 74 72 69 6e 67 20 69 73 20 69 6e  f {[string is in
4d80: 74 65 67 65 72 20 2d 73 74 72 69 63 74 20 24 65  teger -strict $e
4d90: 6e 67 69 6e 65 54 69 6d 65 53 74 61 6d 70 5d 7d  ngineTimeStamp]}
4da0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
4db0: 20 20 20 20 20 20 20 73 65 74 20 65 6e 67 69 6e         set engin
4dc0: 65 44 61 74 65 54 69 6d 65 20 5b 63 6c 6f 63 6b  eDateTime [clock
4dd0: 20 66 6f 72 6d 61 74 20 5c 0d 0a 20 20 20 20 20   format \..     
4de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 24 65 6e               $en
4df0: 67 69 6e 65 54 69 6d 65 53 74 61 6d 70 20 2d 66  gineTimeStamp -f
4e00: 6f 72 6d 61 74 20 24 64 61 74 65 54 69 6d 65 46  ormat $dateTimeF
4e10: 6f 72 6d 61 74 5d 0d 0a 20 20 20 20 20 20 20 20  ormat]..        
4e20: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
4e30: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
4e40: 65 6e 67 69 6e 65 44 61 74 65 54 69 6d 65 20 5b  engineDateTime [
4e50: 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5c 0d 0a  clock format \..
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e70: 20 20 5b 63 6c 6f 63 6b 20 73 63 61 6e 20 24 65    [clock scan $e
4e80: 6e 67 69 6e 65 54 69 6d 65 53 74 61 6d 70 5d 20  ngineTimeStamp] 
4e90: 2d 66 6f 72 6d 61 74 20 24 64 61 74 65 54 69 6d  -format $dateTim
4ea0: 65 46 6f 72 6d 61 74 5d 0d 0a 20 20 20 20 20 20  eFormat]..      
4eb0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
4ec0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4ed0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f        # NOTE: Fo
4ee0: 72 20 62 75 69 6c 64 20 6c 69 6e 65 73 2c 20 63  r build lines, c
4ef0: 6f 6d 70 61 72 65 20 74 68 65 20 70 61 74 63 68  ompare the patch
4f00: 20 6c 65 76 65 6c 20 66 72 6f 6d 20 74 68 65 20   level from the 
4f10: 6c 69 6e 65 0d 0a 20 20 20 20 20 20 20 20 20 20  line..          
4f20: 20 20 23 20 20 20 20 20 20 20 74 6f 20 74 68 65    #       to the
4f30: 20 6f 6e 65 20 77 65 20 61 72 65 20 63 75 72 72   one we are curr
4f40: 65 6e 74 6c 79 20 75 73 69 6e 67 20 75 73 69 6e  ently using usin
4f50: 67 20 61 20 73 69 6d 70 6c 65 20 70 61 74 63 68  g a simple patch
4f60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
4f70: 20 20 20 20 20 20 6c 65 76 65 6c 20 63 6f 6d 70        level comp
4f80: 61 72 69 73 6f 6e 2e 0d 0a 20 20 20 20 20 20 20  arison...       
4f90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4fa0: 20 20 20 20 69 66 20 7b 24 63 68 65 63 6b 42 75      if {$checkBu
4fb0: 69 6c 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ild} then {..   
4fc0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63             set c
4fd0: 6f 6d 70 61 72 65 20 5b 70 61 63 6b 61 67 65 20  ompare [package 
4fe0: 76 63 6f 6d 70 61 72 65 20 24 70 61 74 63 68 4c  vcompare $patchL
4ff0: 65 76 65 6c 20 24 65 6e 67 69 6e 65 50 61 74 63  evel $enginePatc
5000: 68 4c 65 76 65 6c 5d 0d 0a 20 20 20 20 20 20 20  hLevel]..       
5010: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
5020: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
5030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
5040: 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 20 6e 6f  NOTE: This is no
5050: 74 20 61 20 62 75 69 6c 64 20 6c 69 6e 65 2c 20  t a build line, 
5060: 6e 6f 20 6d 61 74 63 68 2e 0d 0a 20 20 20 20 20  no match...     
5070: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
5080: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63 6f            set co
5090: 6d 70 61 72 65 20 2d 31 0d 0a 20 20 20 20 20 20  mpare -1..      
50a0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
50b0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
50c0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f        # NOTE: Fo
50d0: 72 20 73 63 72 69 70 74 20 6c 69 6e 65 73 2c 20  r script lines, 
50e0: 75 73 65 20 72 65 67 75 6c 61 72 20 65 78 70 72  use regular expr
50f0: 65 73 73 69 6f 6e 20 6d 61 74 63 68 69 6e 67 2e  ession matching.
5100: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
5110: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
5120: 7b 24 63 68 65 63 6b 53 63 72 69 70 74 7d 20 74  {$checkScript} t
5130: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
5140: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5150: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
5160: 65 20 5b 63 61 74 63 68 5d 20 68 65 72 65 20 74  e [catch] here t
5170: 6f 20 70 72 65 76 65 6e 74 20 72 61 69 73 69 6e  o prevent raisin
5180: 67 20 61 20 73 63 72 69 70 74 20 65 72 72 6f 72  g a script error
5190: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
51a0: 23 20 20 20 20 20 20 20 64 75 65 20 74 6f 20 61  #       due to a
51b0: 20 6d 61 6c 66 6f 72 6d 65 64 20 70 61 74 63 68   malformed patch
51c0: 20 6c 65 76 65 6c 20 72 65 67 75 6c 61 72 20 65   level regular e
51d0: 78 70 72 65 73 73 69 6f 6e 2e 0d 0a 20 20 20 20  xpression...    
51e0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
51f0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
5200: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
5210: 20 20 20 20 20 20 20 20 20 72 65 67 65 78 70 20           regexp 
5220: 2d 6e 6f 63 61 73 65 20 2d 2d 20 24 70 61 74 63  -nocase -- $patc
5230: 68 4c 65 76 65 6c 20 24 65 6e 67 69 6e 65 50 61  hLevel $enginePa
5240: 74 63 68 4c 65 76 65 6c 0d 0a 20 20 20 20 20 20  tchLevel..      
5250: 20 20 20 20 20 20 20 20 7d 20 6d 61 74 63 68 5d          } match]
5260: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
5270: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
5280: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
5290: 4f 54 45 3a 20 54 68 65 20 70 61 74 63 68 20 6c  OTE: The patch l
52a0: 65 76 65 6c 20 66 72 6f 6d 20 74 68 65 20 73 63  evel from the sc
52b0: 72 69 70 74 20 6c 69 6e 65 20 77 61 73 20 6d 6f  ript line was mo
52c0: 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  st..            
52d0: 20 20 20 20 23 20 20 20 20 20 20 20 6c 69 6b 65      #       like
52e0: 6c 79 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 72  ly not a valid r
52f0: 65 67 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  egular expressio
5300: 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n...            
5310: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
5320: 20 20 20 20 20 20 20 73 65 74 20 6d 61 74 63 68         set match
5330: 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20   false..        
5340: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
5350: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
5360: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
5380: 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 20 6e 6f  NOTE: This is no
5390: 74 20 61 20 73 63 72 69 70 74 20 6c 69 6e 65 2c  t a script line,
53a0: 20 6e 6f 20 6d 61 74 63 68 2e 0d 0a 20 20 20 20   no match...    
53b0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
53c0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d             set m
53d0: 61 74 63 68 20 66 61 6c 73 65 0d 0a 20 20 20 20  atch false..    
53e0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
53f0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
5400: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
5410: 41 72 65 20 77 65 20 69 6e 74 65 72 65 73 74 65  Are we intereste
5420: 64 20 69 6e 20 66 75 72 74 68 65 72 20 70 72 6f  d in further pro
5430: 63 65 73 73 69 6e 67 20 74 68 69 73 20 6c 69 6e  cessing this lin
5440: 65 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e?..            
5450: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  #..            i
5460: 66 20 7b 28 24 63 68 65 63 6b 42 75 69 6c 64 20  f {($checkBuild 
5470: 26 26 20 24 63 6f 6d 70 61 72 65 20 3e 20 30 29  && $compare > 0)
5480: 20 7c 7c 0d 0a 20 20 20 20 20 20 20 20 20 20 20   ||..           
5490: 20 20 20 20 20 28 24 63 68 65 63 6b 53 63 72 69       ($checkScri
54a0: 70 74 20 26 26 20 24 6d 61 74 63 68 29 7d 20 74  pt && $match)} t
54b0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
54c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
54d0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72        # NOTE: Gr
54e0: 61 62 20 74 68 65 20 62 61 73 65 20 55 52 49 20  ab the base URI 
54f0: 66 69 65 6c 64 20 28 69 2e 65 2e 20 69 74 20 6d  field (i.e. it m
5500: 61 79 20 62 65 20 61 20 6d 69 72 72 6f 72 0d 0a  ay be a mirror..
5510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
5520: 20 20 20 20 20 20 73 69 74 65 29 2e 0d 0a 20 20        site)...  
5530: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
5550: 20 62 61 73 65 55 72 69 20 5b 6c 69 6e 64 65 78   baseUri [lindex
5560: 20 24 66 69 65 6c 64 73 20 36 5d 0d 0a 0d 0a 20   $fields 6].... 
5570: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
5580: 7b 24 63 68 65 63 6b 42 75 69 6c 64 7d 20 74 68  {$checkBuild} th
5590: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
55a0: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
55b0: 67 20 6c 65 6e 67 74 68 20 24 62 61 73 65 55 72  g length $baseUr
55c0: 69 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  i] > 0} then {..
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55e0: 20 20 73 65 74 20 62 75 69 6c 64 55 72 69 20 24    set buildUri $
55f0: 62 61 73 65 55 72 69 0d 0a 20 20 20 20 20 20 20  baseUri..       
5600: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
5610: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
5620: 20 20 20 20 20 73 65 74 20 62 75 69 6c 64 55 72       set buildUr
5630: 69 20 5b 67 65 74 44 6f 77 6e 6c 6f 61 64 42 61  i [getDownloadBa
5640: 73 65 55 72 69 5d 3b 20 23 20 70 72 69 6d 61 72  seUri]; # primar
5650: 79 20 73 69 74 65 2e 0d 0a 20 20 20 20 20 20 20  y site...       
5660: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
5670: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
5680: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
5690: 7b 24 63 68 65 63 6b 53 63 72 69 70 74 7d 20 74  {$checkScript} t
56a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
56b0: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
56c0: 6e 67 20 6c 65 6e 67 74 68 20 24 62 61 73 65 55  ng length $baseU
56d0: 72 69 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ri] > 0} then {.
56e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
56f0: 20 20 20 73 65 74 20 73 63 72 69 70 74 55 72 69     set scriptUri
5700: 20 24 62 61 73 65 55 72 69 0d 0a 20 20 20 20 20   $baseUri..     
5710: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
5720: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
5730: 20 20 20 20 20 20 20 73 65 74 20 73 63 72 69 70         set scrip
5740: 74 55 72 69 20 5b 67 65 74 53 63 72 69 70 74 42  tUri [getScriptB
5750: 61 73 65 55 72 69 5d 3b 20 23 20 70 72 69 6d 61  aseUri]; # prima
5760: 72 79 20 73 69 74 65 2e 0d 0a 20 20 20 20 20 20  ry site...      
5770: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
5780: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
5790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
57a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
57b0: 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20   NOTE: Grab the 
57c0: 6e 6f 74 65 73 20 66 69 65 6c 64 20 28 77 68 69  notes field (whi
57d0: 63 68 20 6d 61 79 20 62 65 20 65 6d 70 74 79 29  ch may be empty)
57e0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
57f0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
5800: 20 20 73 65 74 20 6e 6f 74 65 73 20 5b 6c 69 6e    set notes [lin
5810: 64 65 78 20 24 66 69 65 6c 64 73 20 31 30 5d 0d  dex $fields 10].
5820: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
5830: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
5840: 67 74 68 20 24 6e 6f 74 65 73 5d 20 3e 20 30 7d  gth $notes] > 0}
5850: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
5860: 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f 74           set not
5870: 65 73 20 5b 75 6e 65 73 63 61 70 65 55 70 64 61  es [unescapeUpda
5880: 74 65 4e 6f 74 65 73 20 24 6e 6f 74 65 73 5d 0d  teNotes $notes].
5890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
58a0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
58b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
58c0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 65     # NOTE: The e
58d0: 6e 67 69 6e 65 20 70 61 74 63 68 20 6c 65 76 65  ngine patch leve
58e0: 6c 20 66 72 6f 6d 20 74 68 65 20 6c 69 6e 65 20  l from the line 
58f0: 69 73 20 67 72 65 61 74 65 72 2c 0d 0a 20 20 20  is greater,..   
5900: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
5910: 20 20 20 77 65 20 61 72 65 20 6f 75 74 2d 6f 66     we are out-of
5920: 2d 64 61 74 65 2e 20 20 52 65 74 75 72 6e 20 74  -date.  Return t
5930: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 72  he result of our
5940: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5950: 23 20 20 20 20 20 20 20 63 68 65 63 6b 69 6e 67  #       checking
5960: 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20   now...         
5970: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5980: 20 20 20 20 20 20 69 66 20 7b 24 63 68 65 63 6b        if {$check
5990: 42 75 69 6c 64 7d 20 74 68 65 6e 20 7b 0d 0a 20  Build} then {.. 
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
59b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
59c0: 20 20 23 20 4e 4f 54 45 3a 20 41 72 65 20 77 65    # NOTE: Are we
59d0: 20 73 75 70 70 6f 73 65 64 20 74 6f 20 70 72 6f   supposed to pro
59e0: 6d 70 74 20 74 68 65 20 69 6e 74 65 72 61 63 74  mpt the interact
59f0: 69 76 65 20 75 73 65 72 2c 0d 0a 20 20 20 20 20  ive user,..     
5a00: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
5a10: 20 20 20 69 66 20 61 6e 79 2c 20 74 6f 20 75 70     if any, to up
5a20: 67 72 61 64 65 20 6e 6f 77 3f 0d 0a 20 20 20 20  grade now?..    
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
5a50: 65 74 20 74 65 78 74 20 5b 61 70 70 65 6e 64 41  et text [appendA
5a60: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
5a70: 20 20 20 20 20 20 20 20 20 20 20 24 75 70 64 61             $upda
5a80: 74 65 55 72 69 54 79 70 65 20 22 20 62 75 69 6c  teUriType " buil
5a90: 64 20 22 20 24 70 61 74 63 68 4c 65 76 65 6c 20  d " $patchLevel 
5aa0: 22 2c 20 64 61 74 65 64 20 22 20 5c 0d 0a 20 20  ", dated " \..  
5ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ac0: 20 20 24 64 61 74 65 54 69 6d 65 20 22 2c 20 69    $dateTime ", i
5ad0: 73 20 6e 65 77 65 72 20 74 68 61 6e 20 74 68 65  s newer than the
5ae0: 20 72 75 6e 6e 69 6e 67 20 62 75 69 6c 64 20 22   running build "
5af0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
5b00: 20 20 20 20 20 20 20 20 24 65 6e 67 69 6e 65 50          $engineP
5b10: 61 74 63 68 4c 65 76 65 6c 20 22 2c 20 64 61 74  atchLevel ", dat
5b20: 65 64 20 22 20 24 65 6e 67 69 6e 65 44 61 74 65  ed " $engineDate
5b30: 54 69 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Time \..        
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 22 2c 20 62              ", b
5b50: 61 73 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  ased on the data
5b60: 20 66 72 6f 6d 20 22 20 24 75 70 64 61 74 65 42   from " $updateB
5b70: 61 73 65 55 72 69 5d 0d 0a 0d 0a 20 20 20 20 20  aseUri]....     
5b80: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24             if {$
5b90: 70 72 6f 6d 70 74 20 26 26 20 5b 69 73 49 6e 74  prompt && [isInt
5ba0: 65 72 61 63 74 69 76 65 5d 7d 20 74 68 65 6e 20  eractive]} then 
5bb0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
5bc0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5bd0: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
5be0: 3a 20 49 73 20 74 68 65 20 5b 6f 62 6a 65 63 74  : Is the [object
5bf0: 5d 20 63 6f 6d 6d 61 6e 64 20 61 76 61 69 6c 61  ] command availa
5c00: 62 6c 65 3f 20 20 49 66 20 6e 6f 74 2c 0d 0a 20  ble?  If not,.. 
5c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c20: 20 23 20 20 20 20 20 20 20 74 68 69 73 20 63 61   #       this ca
5c30: 6e 6e 6f 74 20 62 65 20 64 6f 6e 65 2e 0d 0a 20  nnot be done... 
5c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c50: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
5c60: 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67        if {[lleng
5c70: 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64  th [info command
5c80: 73 20 6f 62 6a 65 63 74 5d 5d 20 3e 20 30 7d 20  s object]] > 0} 
5c90: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
5ca0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
5cb0: 6d 65 73 73 61 67 65 43 61 70 74 69 6f 6e 20 5b  messageCaption [
5cc0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ce0: 20 20 20 20 20 20 5b 69 6e 66 6f 20 65 6e 67 69        [info engi
5cf0: 6e 65 20 4e 61 6d 65 5d 20 22 20 28 22 20 5b 6c  ne Name] " (" [l
5d00: 69 6e 64 65 78 20 5b 69 6e 66 6f 20 6c 65 76 65  index [info leve
5d10: 6c 20 30 5d 20 30 5d 20 5c 0d 0a 20 20 20 20 20  l 0] 0] \..     
5d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d30: 20 20 20 22 20 73 63 72 69 70 74 29 22 5d 0d 0a     " script)"]..
5d40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5d50: 20 20 20 20 20 20 73 65 74 20 6d 65 73 73 61 67        set messag
5d60: 65 54 65 78 74 20 5b 61 70 70 65 6e 64 41 72 67  eText [appendArg
5d70: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 54 68               "Th
5d90: 65 20 22 20 24 74 65 78 74 20 5c 6e 5c 6e 20 22  e " $text \n\n "
5da0: 52 75 6e 20 74 68 65 20 75 70 64 61 74 65 72 20  Run the updater 
5db0: 6e 6f 77 3f 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  now?"]....      
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
5dd0: 20 7b 24 61 75 74 6f 6d 61 74 69 63 7d 20 74 68   {$automatic} th
5de0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65              appe
5e00: 6e 64 20 6d 65 73 73 61 67 65 54 65 78 74 20 5c  nd messageText \
5e10: 6e 5c 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  n\n \..         
5e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e30: 20 22 57 41 52 4e 49 4e 47 3a 20 54 68 65 20 75   "WARNING: The u
5e40: 70 64 61 74 65 72 20 70 72 6f 63 65 73 73 20 77  pdater process w
5e50: 69 6c 6c 20 62 65 20 72 75 6e 20 22 20 5c 0d 0a  ill be run " \..
5e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e70: 20 20 20 20 20 20 20 20 20 20 22 69 6e 20 61 75            "in au
5e80: 74 6f 6d 61 74 69 63 20 6d 6f 64 65 20 61 6e 64  tomatic mode and
5e90: 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e   there will be n
5ea0: 6f 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  o " \..         
5eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ec0: 20 22 66 75 72 74 68 65 72 20 70 72 6f 6d 70 74   "further prompt
5ed0: 73 2e 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s."..           
5ee0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
5ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f00: 20 20 69 66 20 7b 5b 6f 62 6a 65 63 74 20 69 6e    if {[object in
5f10: 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
5f20: 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
5f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f40: 20 20 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65    Eagle._Compone
5f50: 6e 74 73 2e 50 72 69 76 61 74 65 2e 57 69 6e 64  nts.Private.Wind
5f60: 6f 77 4f 70 73 20 59 65 73 4f 72 4e 6f 20 5c 0d  owOps YesOrNo \.
5f70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5f80: 20 20 20 20 20 20 20 20 20 24 6d 65 73 73 61 67           $messag
5f90: 65 54 65 78 74 20 24 6d 65 73 73 61 67 65 43 61  eText $messageCa
5fa0: 70 74 69 6f 6e 20 66 61 6c 73 65 5d 7d 20 74 68  ption false]} th
5fb0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
5fc0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fe0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f 6b 2c       # NOTE: Ok,
5ff0: 20 72 75 6e 20 74 68 65 20 75 70 64 61 74 65 72   run the updater
6000: 20 6e 6f 77 20 61 6e 64 20 74 68 65 6e 20 65 78   now and then ex
6010: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  it...           
6020: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
6030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6040: 20 20 20 20 72 75 6e 55 70 64 61 74 65 41 6e 64      runUpdateAnd
6050: 45 78 69 74 20 24 61 75 74 6f 6d 61 74 69 63 0d  Exit $automatic.
6060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6070: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
6080: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
6090: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
60a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
60b0: 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24    return [list $
60c0: 74 65 78 74 20 5b 6c 69 73 74 20 24 62 75 69 6c  text [list $buil
60d0: 64 55 72 69 20 24 70 61 74 63 68 4c 65 76 65 6c  dUri $patchLevel
60e0: 5d 20 5b 6c 69 73 74 20 24 6e 6f 74 65 73 5d 5d  ] [list $notes]]
60f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6100: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
6110: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
6120: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
6130: 73 63 72 69 70 74 20 70 61 74 63 68 20 6c 65 76  script patch lev
6140: 65 6c 20 66 72 6f 6d 20 74 68 65 20 6c 69 6e 65  el from the line
6150: 20 6d 61 74 63 68 65 73 20 74 68 65 0d 0a 20 20   matches the..  
6160: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
6170: 20 20 20 20 63 75 72 72 65 6e 74 20 65 6e 67 69      current engi
6180: 6e 65 20 70 61 74 63 68 20 6c 65 76 65 6c 20 65  ne patch level e
6190: 78 61 63 74 6c 79 2c 20 74 68 69 73 20 73 63 72  xactly, this scr
61a0: 69 70 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ipt..           
61b0: 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c     #       shoul
61c0: 64 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 69  d be evaluated i
61d0: 66 20 69 74 20 63 61 6e 20 62 65 20 61 75 74 68  f it can be auth
61e0: 65 6e 74 69 63 61 74 65 64 2e 0d 0a 20 20 20 20  enticated...    
61f0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
6200: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24             if {$
6210: 63 68 65 63 6b 53 63 72 69 70 74 7d 20 74 68 65  checkScript} the
6220: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
6230: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6240: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
6250: 46 69 72 73 74 2c 20 73 65 74 20 74 68 65 20 64  First, set the d
6260: 65 66 61 75 6c 74 20 63 68 61 6e 6e 65 6c 20 66  efault channel f
6270: 6f 72 20 75 70 64 61 74 65 20 73 63 72 69 70 74  or update script
6280: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6290: 20 20 23 20 20 20 20 20 20 20 73 74 61 74 75 73    #       status
62a0: 20 6d 65 73 73 61 67 65 73 2e 20 20 49 66 20 74   messages.  If t
62b0: 68 65 20 74 65 73 74 20 63 68 61 6e 6e 65 6c 20  he test channel 
62c0: 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20  has been..      
62d0: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
62e0: 20 20 73 65 74 20 28 69 2e 65 2e 20 62 79 20 74    set (i.e. by t
62f0: 68 65 20 74 65 73 74 20 73 75 69 74 65 29 2c 20  he test suite), 
6300: 69 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 0d  it will be used.
6310: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6320: 20 23 20 20 20 20 20 20 20 69 6e 73 74 65 61 64   #       instead
6330: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
6340: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
6350: 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
6360: 20 65 78 69 73 74 73 20 63 68 61 6e 6e 65 6c 5d   exists channel]
6370: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6380: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
6390: 63 68 61 6e 6e 65 6c 20 5b 65 78 70 72 20 7b 5b  channel [expr {[
63a0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
63b0: 73 74 5f 63 68 61 6e 6e 65 6c 5d 20 3f 20 5c 0d  st_channel] ? \.
63c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
63d0: 20 20 20 20 20 20 20 24 3a 3a 74 65 73 74 5f 63         $::test_c
63e0: 68 61 6e 6e 65 6c 20 3a 20 22 73 74 64 6f 75 74  hannel : "stdout
63f0: 22 7d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  "}]..           
6400: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
6410: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
6420: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
6430: 4f 54 45 3a 20 4e 65 78 74 2c 20 76 65 72 69 66  OTE: Next, verif
6440: 79 20 74 68 65 20 73 63 72 69 70 74 20 68 61 73  y the script has
6450: 20 61 20 76 61 6c 69 64 20 62 61 73 65 20 55 52   a valid base UR
6460: 49 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  I...            
6470: 20 20 20 20 23 20 20 20 20 20 20 20 46 6f 72 20      #       For 
6480: 75 70 64 61 74 65 20 73 63 72 69 70 74 73 2c 20  update scripts, 
6490: 74 68 69 73 20 6d 75 73 74 20 62 65 20 74 68 65  this must be the
64a0: 20 6c 6f 63 61 74 69 6f 6e 0d 0a 20 20 20 20 20   location..     
64b0: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
64c0: 20 20 20 77 68 65 72 65 20 74 68 65 20 75 70 64     where the upd
64d0: 61 74 65 20 73 63 72 69 70 74 20 64 61 74 61 20  ate script data 
64e0: 63 61 6e 20 62 65 20 64 6f 77 6e 6c 6f 61 64 65  can be downloade
64f0: 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d...            
6500: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
6510: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
6520: 6e 67 20 6c 65 6e 67 74 68 20 24 73 63 72 69 70  ng length $scrip
6530: 74 55 72 69 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  tUri] == 0} then
6540: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
6550: 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
6560: 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
6580: 71 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  qputs $channel [
6590: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
65a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65b0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 69 6e 76 61        "---- inva
65c0: 6c 69 64 20 62 61 73 65 55 72 69 20 76 61 6c 75  lid baseUri valu
65d0: 65 20 66 6f 72 20 75 70 64 61 74 65 20 73 63 72  e for update scr
65e0: 69 70 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ipt " \..       
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6600: 20 22 6c 69 6e 65 3a 20 22 20 24 6c 69 6e 65 20   "line: " $line 
6610: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
6620: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
6640: 63 72 20 73 63 72 69 70 74 43 6f 75 6e 74 28 69  cr scriptCount(i
6650: 6e 76 61 6c 69 64 29 3b 20 63 6f 6e 74 69 6e 75  nvalid); continu
6660: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
6670: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
6680: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
6690: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
66a0: 45 3a 20 4e 65 78 74 2c 20 67 72 61 62 20 74 68  E: Next, grab th
66b0: 65 20 6d 64 35 20 66 69 65 6c 64 20 61 6e 64 20  e md5 field and 
66c0: 73 65 65 20 69 66 20 69 74 20 6c 6f 6f 6b 73 20  see if it looks 
66d0: 76 61 6c 69 64 2e 0d 0a 20 20 20 20 20 20 20 20  valid...        
66e0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
66f0: 42 65 6c 6f 77 2c 20 74 68 65 20 76 61 6c 75 65  Below, the value
6700: 20 6f 66 20 74 68 69 73 20 66 69 65 6c 64 20 77   of this field w
6710: 69 6c 6c 20 62 65 20 63 6f 6d 70 61 72 65 64 20  ill be compared 
6720: 74 6f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  to..            
6730: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74      #       that
6740: 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20 4d   of the actual M
6750: 44 35 20 68 61 73 68 20 6f 66 20 74 68 65 20 64  D5 hash of the d
6760: 6f 77 6e 6c 6f 61 64 65 64 20 73 63 72 69 70 74  ownloaded script
6770: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6780: 20 20 23 20 20 20 20 20 20 20 64 61 74 61 2e 0d    #       data..
6790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
67a0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
67b0: 20 20 20 20 73 65 74 20 6c 69 6e 65 4d 64 35 20      set lineMd5 
67c0: 5b 6c 69 6e 64 65 78 20 24 66 69 65 6c 64 73 20  [lindex $fields 
67d0: 37 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  7]....          
67e0: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
67f0: 67 20 6c 65 6e 67 74 68 20 24 6c 69 6e 65 4d 64  g length $lineMd
6800: 35 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  5] == 0} then {.
6810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6820: 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
6830: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
6840: 20 20 20 20 20 20 20 20 20 20 20 20 74 71 70 75              tqpu
6850: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
6860: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
6870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6880: 20 20 20 22 2d 2d 2d 2d 20 69 6e 76 61 6c 69 64     "---- invalid
6890: 20 6d 64 35 20 76 61 6c 75 65 20 66 6f 72 20 75   md5 value for u
68a0: 70 64 61 74 65 20 73 63 72 69 70 74 20 22 20 5c  pdate script " \
68b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
68c0: 20 20 20 20 20 20 20 20 20 20 22 6c 69 6e 65 3a            "line:
68d0: 20 22 20 24 6c 69 6e 65 20 5c 22 5c 6e 5d 0d 0a   " $line \"\n]..
68e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68f0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
6900: 20 20 20 20 20 20 20 69 6e 63 72 20 73 63 72 69         incr scri
6910: 70 74 43 6f 75 6e 74 28 69 6e 76 61 6c 69 64 29  ptCount(invalid)
6920: 3b 20 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20 20  ; continue..    
6930: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
6940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6950: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
6960: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 65 78 74      # NOTE: Next
6970: 2c 20 67 72 61 62 20 74 68 65 20 73 68 61 31 20  , grab the sha1 
6980: 66 69 65 6c 64 20 61 6e 64 20 73 65 65 20 69 66  field and see if
6990: 20 69 74 20 6c 6f 6f 6b 73 20 76 61 6c 69 64 2e   it looks valid.
69a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
69b0: 20 20 23 20 20 20 20 20 20 20 42 65 6c 6f 77 2c    #       Below,
69c0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
69d0: 69 73 20 66 69 65 6c 64 20 77 69 6c 6c 20 62 65  is field will be
69e0: 20 63 6f 6d 70 61 72 65 64 20 74 6f 0d 0a 20 20   compared to..  
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
6a00: 20 20 20 20 20 20 74 68 61 74 20 6f 66 20 74 68        that of th
6a10: 65 20 61 63 74 75 61 6c 20 53 48 41 31 20 68 61  e actual SHA1 ha
6a20: 73 68 20 6f 66 20 74 68 65 20 64 6f 77 6e 6c 6f  sh of the downlo
6a30: 61 64 65 64 20 73 63 72 69 70 74 0d 0a 20 20 20  aded script..   
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
6a50: 20 20 20 20 20 64 61 74 61 2e 0d 0a 20 20 20 20       data...    
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
6a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
6a80: 65 74 20 6c 69 6e 65 53 68 61 31 20 5b 6c 69 6e  et lineSha1 [lin
6a90: 64 65 78 20 24 66 69 65 6c 64 73 20 38 5d 0d 0a  dex $fields 8]..
6aa0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6ab0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
6ac0: 6e 67 74 68 20 24 6c 69 6e 65 53 68 61 31 5d 20  ngth $lineSha1] 
6ad0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6af0: 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
6b00: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
6b10: 20 20 20 20 20 20 20 20 20 74 71 70 75 74 73 20           tqputs 
6b20: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
6b30: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
6b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b50: 22 2d 2d 2d 2d 20 69 6e 76 61 6c 69 64 20 73 68  "---- invalid sh
6b60: 61 31 20 76 61 6c 75 65 20 66 6f 72 20 75 70 64  a1 value for upd
6b70: 61 74 65 20 73 63 72 69 70 74 20 22 20 5c 0d 0a  ate script " \..
6b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b90: 20 20 20 20 20 20 20 20 22 6c 69 6e 65 3a 20 22          "line: "
6ba0: 20 24 6c 69 6e 65 20 5c 22 5c 6e 5d 0d 0a 20 20   $line \"\n]..  
6bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bc0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
6bd0: 20 20 20 20 20 69 6e 63 72 20 73 63 72 69 70 74       incr script
6be0: 43 6f 75 6e 74 28 69 6e 76 61 6c 69 64 29 3b 20  Count(invalid); 
6bf0: 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20 20 20 20  continue..      
6c00: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
6c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
6c20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6c30: 20 20 23 20 4e 4f 54 45 3a 20 4e 65 78 74 2c 20    # NOTE: Next, 
6c40: 67 72 61 62 20 74 68 65 20 73 68 61 35 31 32 20  grab the sha512 
6c50: 66 69 65 6c 64 20 61 6e 64 20 73 65 65 20 69 66  field and see if
6c60: 20 69 74 20 6c 6f 6f 6b 73 0d 0a 20 20 20 20 20   it looks..     
6c70: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
6c80: 20 20 20 76 61 6c 69 64 2e 20 20 42 65 6c 6f 77     valid.  Below
6c90: 2c 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  , the value of t
6ca0: 68 69 73 20 66 69 65 6c 64 20 77 69 6c 6c 20 62  his field will b
6cb0: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
6cc0: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70 61     #       compa
6cd0: 72 65 64 20 74 6f 20 74 68 61 74 20 6f 66 20 74  red to that of t
6ce0: 68 65 20 61 63 74 75 61 6c 20 53 48 41 35 31 32  he actual SHA512
6cf0: 20 68 61 73 68 20 6f 66 20 74 68 65 0d 0a 20 20   hash of the..  
6d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
6d10: 20 20 20 20 20 20 64 6f 77 6e 6c 6f 61 64 65 64        downloaded
6d20: 20 73 63 72 69 70 74 20 64 61 74 61 2e 0d 0a 20   script data... 
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
6d40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6d50: 20 20 73 65 74 20 6c 69 6e 65 53 68 61 35 31 32    set lineSha512
6d60: 20 5b 6c 69 6e 64 65 78 20 24 66 69 65 6c 64 73   [lindex $fields
6d70: 20 39 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20   9]....         
6d80: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
6d90: 6e 67 20 6c 65 6e 67 74 68 20 24 6c 69 6e 65 53  ng length $lineS
6da0: 68 61 35 31 32 5d 20 3d 3d 20 30 7d 20 74 68 65  ha512] == 0} the
6db0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
6dc0: 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
6dd0: 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6df0: 74 71 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20  tqputs $channel 
6e00: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e20: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 69 6e 76         "---- inv
6e30: 61 6c 69 64 20 73 68 61 35 31 32 20 76 61 6c 75  alid sha512 valu
6e40: 65 20 66 6f 72 20 75 70 64 61 74 65 20 73 63 72  e for update scr
6e50: 69 70 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ipt " \..       
6e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e70: 20 22 6c 69 6e 65 3a 20 22 20 24 6c 69 6e 65 20   "line: " $line 
6e80: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
6e90: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
6ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
6eb0: 63 72 20 73 63 72 69 70 74 43 6f 75 6e 74 28 69  cr scriptCount(i
6ec0: 6e 76 61 6c 69 64 29 3b 20 63 6f 6e 74 69 6e 75  nvalid); continu
6ed0: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
6ee0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
6ef0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
6f00: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
6f10: 45 3a 20 4e 65 78 74 2c 20 73 68 6f 77 20 74 68  E: Next, show th
6f20: 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  e extra informat
6f30: 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77  ion associated w
6f40: 69 74 68 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ith..           
6f50: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 69       #       thi
6f60: 73 20 75 70 64 61 74 65 20 73 63 72 69 70 74 2c  s update script,
6f70: 20 69 66 20 61 6e 79 2e 0d 0a 20 20 20 20 20 20   if any...      
6f80: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
6fa0: 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
6fb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6fc0: 20 20 20 20 74 71 70 75 74 73 20 24 63 68 61 6e      tqputs $chan
6fd0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
6fe0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
6ff0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
7000: 65 74 63 68 69 6e 67 20 75 70 64 61 74 65 20 73  etching update s
7010: 63 72 69 70 74 20 66 72 6f 6d 20 5c 22 22 20 24  cript from \"" $
7020: 73 63 72 69 70 74 55 72 69 20 5c 0d 0a 20 20 20  scriptUri \..   
7030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7040: 20 20 20 22 5c 22 20 28 22 20 24 64 61 74 65 54     "\" (" $dateT
7050: 69 6d 65 20 22 29 20 77 69 74 68 20 6e 6f 74 65  ime ") with note
7060: 73 3a 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  s:\n"]....      
7070: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
7080: 74 72 69 6d 4e 6f 74 65 73 20 5b 73 74 72 69 6e  trimNotes [strin
7090: 67 20 74 72 69 6d 20 24 6e 6f 74 65 73 5d 0d 0a  g trim $notes]..
70a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
70b0: 20 20 20 20 74 71 70 75 74 73 20 24 63 68 61 6e      tqputs $chan
70c0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
70d0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
70e0: 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b           [expr {
70f0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
7100: 74 72 69 6d 4e 6f 74 65 73 5d 20 3e 20 30 20 3f  trimNotes] > 0 ?
7110: 20 24 74 72 69 6d 4e 6f 74 65 73 20 3a 20 5c 0d   $trimNotes : \.
7120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7130: 20 20 20 20 20 20 20 22 3c 6e 6f 6e 65 3e 22 7d         "<none>"}
7140: 5d 20 22 5c 6e 2d 2d 2d 2d 20 65 6e 64 20 6f 66  ] "\n---- end of
7150: 20 75 70 64 61 74 65 20 73 63 72 69 70 74 20 6e   update script n
7160: 6f 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  otes\n"]..      
7170: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
7190: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
71a0: 20 20 23 20 4e 4f 54 45 3a 20 4e 65 78 74 2c 20    # NOTE: Next, 
71b0: 61 74 74 65 6d 70 74 20 74 6f 20 66 65 74 63 68  attempt to fetch
71c0: 20 74 68 65 20 75 70 64 61 74 65 20 73 63 72 69   the update scri
71d0: 70 74 20 64 61 74 61 2e 0d 0a 20 20 20 20 20 20  pt data...      
71e0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
7200: 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b 67 65   code [catch {ge
7210: 74 55 70 64 61 74 65 53 63 72 69 70 74 44 61 74  tUpdateScriptDat
7220: 61 20 24 73 63 72 69 70 74 55 72 69 7d 20 72 65  a $scriptUri} re
7230: 73 75 6c 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  sult]....       
7240: 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 63 6f           if {$co
7250: 64 65 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  de == 0} then {.
7260: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7270: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
7280: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
7290: 53 75 63 63 65 73 73 2c 20 73 65 74 20 74 68 65  Success, set the
72a0: 20 73 63 72 69 70 74 20 64 61 74 61 20 66 72 6f   script data fro
72b0: 6d 20 74 68 65 20 72 65 73 75 6c 74 2e 0d 0a 20  m the result... 
72c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72d0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
72e0: 20 20 20 20 20 20 73 65 74 20 73 63 72 69 70 74        set script
72f0: 44 61 74 61 20 24 72 65 73 75 6c 74 0d 0a 20 20  Data $result..  
7300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
7310: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
7320: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
7330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
7340: 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c 20   NOTE: Failure, 
7350: 72 65 70 6f 72 74 20 74 68 65 20 65 72 72 6f 72  report the error
7360: 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68 65 20   message to the 
7370: 6c 6f 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  log...          
7380: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
73a0: 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
73b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
73c0: 20 20 20 20 20 20 74 71 70 75 74 73 20 24 63 68        tqputs $ch
73d0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
73e0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
73f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
7400: 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 66 65 74  -- failed to fet
7410: 63 68 20 75 70 64 61 74 65 20 73 63 72 69 70 74  ch update script
7420: 3a 20 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  : " $result \n].
7430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7440: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
7450: 20 20 20 20 20 20 20 20 69 6e 63 72 20 73 63 72          incr scr
7460: 69 70 74 43 6f 75 6e 74 28 66 61 69 6c 29 3b 20  iptCount(fail); 
7470: 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20 20 20 20  continue..      
7480: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
7490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
74a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
74b0: 20 20 23 20 4e 4f 54 45 3a 20 4e 65 78 74 2c 20    # NOTE: Next, 
74c0: 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
74d0: 6d 64 35 2c 20 73 68 61 31 2c 20 61 6e 64 20 73  md5, sha1, and s
74e0: 68 61 35 31 32 0d 0a 20 20 20 20 20 20 20 20 20  ha512..         
74f0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 68         #       h
7500: 61 73 68 65 73 20 6f 66 20 74 68 65 20 72 61 77  ashes of the raw
7510: 20 73 63 72 69 70 74 20 64 61 74 61 20 6d 61 74   script data mat
7520: 63 68 20 77 68 61 74 20 77 61 73 0d 0a 20 20 20  ch what was..   
7530: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
7540: 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20 69       specified i
7550: 6e 20 74 68 65 20 6d 64 35 2c 20 73 68 61 31 2c  n the md5, sha1,
7560: 20 61 6e 64 20 73 68 61 35 31 32 20 66 69 65 6c   and sha512 fiel
7570: 64 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ds...           
7580: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7590: 20 20 20 20 20 20 20 20 73 65 74 20 73 63 72 69          set scri
75a0: 70 74 4d 64 35 20 5b 68 61 73 68 20 6e 6f 72 6d  ptMd5 [hash norm
75b0: 61 6c 20 6d 64 35 20 24 73 63 72 69 70 74 44 61  al md5 $scriptDa
75c0: 74 61 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ta]....         
75d0: 20 20 20 20 20 20 20 69 66 20 7b 21 5b 73 74 72         if {![str
75e0: 69 6e 67 20 65 71 75 61 6c 20 2d 6e 6f 63 61 73  ing equal -nocas
75f0: 65 20 24 6c 69 6e 65 4d 64 35 20 24 73 63 72 69  e $lineMd5 $scri
7600: 70 74 4d 64 35 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ptMd5]} then {..
7610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7620: 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
7630: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
7640: 20 20 20 20 20 20 20 20 20 20 20 74 71 70 75 74             tqput
7650: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
7660: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
7670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7680: 20 20 22 2d 2d 2d 2d 20 77 72 6f 6e 67 20 6d 64    "---- wrong md
7690: 35 20 76 61 6c 75 65 20 5c 22 22 20 24 73 63 72  5 value \"" $scr
76a0: 69 70 74 4d 64 35 20 5c 0d 0a 20 20 20 20 20 20  iptMd5 \..      
76b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76c0: 20 20 22 5c 22 20 66 6f 72 20 75 70 64 61 74 65    "\" for update
76d0: 20 73 63 72 69 70 74 20 6c 69 6e 65 3a 20 22 20   script line: " 
76e0: 24 6c 69 6e 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  $line \"\n]..   
76f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
7700: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7710: 20 20 20 20 69 6e 63 72 20 73 63 72 69 70 74 43      incr scriptC
7720: 6f 75 6e 74 28 62 61 64 29 3b 20 63 6f 6e 74 69  ount(bad); conti
7730: 6e 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  nue..           
7740: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
7750: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 63            set sc
7760: 72 69 70 74 53 68 61 31 20 5b 68 61 73 68 20 6e  riptSha1 [hash n
7770: 6f 72 6d 61 6c 20 73 68 61 31 20 24 73 63 72 69  ormal sha1 $scri
7780: 70 74 44 61 74 61 5d 0d 0a 0d 0a 20 20 20 20 20  ptData]....     
7790: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
77a0: 5b 73 74 72 69 6e 67 20 65 71 75 61 6c 20 2d 6e  [string equal -n
77b0: 6f 63 61 73 65 20 24 6c 69 6e 65 53 68 61 31 20  ocase $lineSha1 
77c0: 24 73 63 72 69 70 74 53 68 61 31 5d 7d 20 74 68  $scriptSha1]} th
77d0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
77e0: 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
77f0: 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
7800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7810: 20 74 71 70 75 74 73 20 24 63 68 61 6e 6e 65 6c   tqputs $channel
7820: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
7830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7840: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 77 72          "---- wr
7850: 6f 6e 67 20 73 68 61 31 20 76 61 6c 75 65 20 5c  ong sha1 value \
7860: 22 22 20 24 73 63 72 69 70 74 53 68 61 31 20 5c  "" $scriptSha1 \
7870: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7880: 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 66 6f            "\" fo
7890: 72 20 75 70 64 61 74 65 20 73 63 72 69 70 74 20  r update script 
78a0: 6c 69 6e 65 3a 20 22 20 24 6c 69 6e 65 20 5c 22  line: " $line \"
78b0: 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
78c0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
78d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 63 72              incr
78e0: 20 73 63 72 69 70 74 43 6f 75 6e 74 28 62 61 64   scriptCount(bad
78f0: 29 3b 20 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20  ); continue..   
7900: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
7910: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7920: 20 20 73 65 74 20 73 63 72 69 70 74 53 68 61 35    set scriptSha5
7930: 31 32 20 5b 68 61 73 68 20 6e 6f 72 6d 61 6c 20  12 [hash normal 
7940: 73 68 61 35 31 32 20 24 73 63 72 69 70 74 44 61  sha512 $scriptDa
7950: 74 61 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ta]....         
7960: 20 20 20 20 20 20 20 69 66 20 7b 21 5b 73 74 72         if {![str
7970: 69 6e 67 20 65 71 75 61 6c 20 2d 6e 6f 63 61 73  ing equal -nocas
7980: 65 20 24 6c 69 6e 65 53 68 61 35 31 32 20 24 73  e $lineSha512 $s
7990: 63 72 69 70 74 53 68 61 35 31 32 5d 7d 20 74 68  criptSha512]} th
79a0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
79b0: 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
79c0: 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79e0: 20 74 71 70 75 74 73 20 24 63 68 61 6e 6e 65 6c   tqputs $channel
79f0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a10: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 77 72          "---- wr
7a20: 6f 6e 67 20 73 68 61 35 31 32 20 76 61 6c 75 65  ong sha512 value
7a30: 20 5c 22 22 20 24 73 63 72 69 70 74 53 68 61 35   \"" $scriptSha5
7a40: 31 32 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  12 \..          
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
7a60: 22 20 66 6f 72 20 75 70 64 61 74 65 20 73 63 72  " for update scr
7a70: 69 70 74 20 6c 69 6e 65 3a 20 22 20 24 6c 69 6e  ipt line: " $lin
7a80: 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  e \"\n]..       
7a90: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ab0: 69 6e 63 72 20 73 63 72 69 70 74 43 6f 75 6e 74  incr scriptCount
7ac0: 28 62 61 64 29 3b 20 63 6f 6e 74 69 6e 75 65 0d  (bad); continue.
7ad0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7ae0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
7af0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7b00: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
7b10: 20 46 69 6e 61 6c 6c 79 2c 20 65 76 65 72 79 74   Finally, everyt
7b20: 68 69 6e 67 20 6c 6f 6f 6b 73 20 67 6f 6f 64 2e  hing looks good.
7b30: 20 20 54 68 65 72 65 66 6f 72 65 2c 20 6a 75 73    Therefore, jus
7b40: 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t..             
7b50: 20 20 20 23 20 20 20 20 20 20 20 65 76 61 6c 75     #       evalu
7b60: 61 74 65 20 74 68 65 20 75 70 64 61 74 65 20 73  ate the update s
7b70: 63 72 69 70 74 20 61 6e 64 20 70 72 69 6e 74 20  cript and print 
7b80: 74 68 65 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20  the result...   
7b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
7ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bb0: 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
7bc0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
7bd0: 20 20 20 20 20 20 20 74 71 70 75 74 73 20 24 63         tqputs $c
7be0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
7bf0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
7c00: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
7c10: 2d 20 65 76 61 6c 75 61 74 69 6e 67 20 75 70 64  - evaluating upd
7c20: 61 74 65 20 73 63 72 69 70 74 20 66 72 6f 6d 20  ate script from 
7c30: 5c 22 22 20 24 73 63 72 69 70 74 55 72 69 20 5c  \"" $scriptUri \
7c40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7c50: 20 20 20 20 20 20 20 20 5c 22 2e 2e 2e 5c 6e 5d          \"...\n]
7c60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7c70: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
7c80: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
7c90: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
7ca0: 3a 20 52 65 73 65 74 20 74 68 65 20 76 61 72 69  : Reset the vari
7cb0: 61 62 6c 65 73 20 74 68 61 74 20 77 69 6c 6c 20  ables that will 
7cc0: 62 65 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 61  be used to conta
7cd0: 69 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  in..            
7ce0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
7cf0: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 75 70  result of the up
7d00: 64 61 74 65 20 73 63 72 69 70 74 2e 0d 0a 20 20  date script...  
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
7d20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7d30: 20 73 65 74 20 63 6f 64 65 20 30 3b 20 73 65 74   set code 0; set
7d40: 20 72 65 73 75 6c 74 20 22 22 0d 0a 0d 0a 20 20   result ""....  
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
7d60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7d70: 20 23 20 4e 4f 54 45 3a 20 4d 61 6e 75 61 6c 6c   # NOTE: Manuall
7d80: 79 20 6f 76 65 72 72 69 64 65 20 66 69 6c 65 20  y override file 
7d90: 6e 61 6d 65 20 74 6f 20 62 65 20 72 65 74 75 72  name to be retur
7da0: 6e 65 64 20 62 79 0d 0a 20 20 20 20 20 20 20 20  ned by..        
7db0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
7dc0: 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 20 74 6f  [info script] to
7dd0: 20 72 65 66 65 72 20 62 61 63 6b 20 74 6f 20 74   refer back to t
7de0: 68 65 20 6f 72 69 67 69 6e 61 6c 6c 79 0d 0a 20  he originally.. 
7df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
7e00: 20 20 20 20 20 20 20 72 65 61 64 20 73 63 72 69         read scri
7e10: 70 74 20 62 61 73 65 20 55 52 49 2e 0d 0a 20 20  pt base URI...  
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
7e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7e40: 20 73 65 74 20 70 75 73 68 65 64 20 66 61 6c 73   set pushed fals
7e50: 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e....           
7e60: 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74       if {[llengt
7e70: 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73  h [info commands
7e80: 20 6f 62 6a 65 63 74 5d 5d 20 3e 20 30 7d 20 74   object]] > 0} t
7e90: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
7ea0: 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
7eb0: 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
7ec0: 6f 6e 50 75 62 6c 69 63 20 49 6e 74 65 72 70 72  onPublic Interpr
7ed0: 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 5c  eter.GetActive \
7ee0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7ef0: 20 20 20 20 20 20 20 20 50 75 73 68 53 63 72 69          PushScri
7f00: 70 74 4c 6f 63 61 74 69 6f 6e 20 24 73 63 72 69  ptLocation $scri
7f10: 70 74 55 72 69 20 74 72 75 65 0d 0a 0d 0a 20 20  ptUri true....  
7f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f30: 73 65 74 20 70 75 73 68 65 64 20 74 72 75 65 0d  set pushed true.
7f40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7f50: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
7f60: 20 20 20 20 20 20 74 72 79 20 7b 0d 0a 20 20 20        try {..   
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
7f80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7f90: 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c      # NOTE: Eval
7fa0: 75 61 74 65 20 74 68 65 20 75 70 64 61 74 65 20  uate the update 
7fb0: 73 63 72 69 70 74 20 69 6e 20 74 68 65 20 63 6f  script in the co
7fc0: 6e 74 65 78 74 20 6f 66 0d 0a 20 20 20 20 20 20  ntext of..      
7fd0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
7fe0: 20 20 20 20 74 68 65 20 63 61 6c 6c 65 72 2e 0d      the caller..
7ff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8000: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
8010: 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65          set code
8020: 20 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c   [catch {uplevel
8030: 20 31 20 24 73 63 72 69 70 74 44 61 74 61 7d 20   1 $scriptData} 
8040: 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20 20  result]..       
8050: 20 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c           } final
8060: 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ly {..          
8070: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8080: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
8090: 4f 54 45 3a 20 52 65 73 65 74 20 6d 61 6e 75 61  OTE: Reset manua
80a0: 6c 20 6f 76 65 72 72 69 64 65 20 6f 66 20 74 68  l override of th
80b0: 65 20 73 63 72 69 70 74 20 66 69 6c 65 20 6e 61  e script file na
80c0: 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  me..            
80d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
80e0: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
80f0: 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 2e 0d 0a  [info script]...
8100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8110: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
8120: 20 20 20 20 20 20 20 69 66 20 7b 24 70 75 73 68         if {$push
8130: 65 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ed} then {..    
8140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8150: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
8160: 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
8170: 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41  Interpreter.GetA
8180: 63 74 69 76 65 20 5c 0d 0a 20 20 20 20 20 20 20  ctive \..       
8190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81a0: 20 50 6f 70 53 63 72 69 70 74 4c 6f 63 61 74 69   PopScriptLocati
81b0: 6f 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  on true..       
81c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
81e0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
81f0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
8200: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4b 65        # NOTE: Ke
8210: 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ep track of the 
8220: 6e 75 6d 62 65 72 20 6f 66 20 75 70 64 61 74 65  number of update
8230: 20 73 63 72 69 70 74 73 20 74 68 61 74 0d 0a 20   scripts that.. 
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
8250: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 20         generate 
8260: 4f 6b 20 61 6e 64 20 45 72 72 6f 72 20 72 65 74  Ok and Error ret
8270: 75 72 6e 20 63 6f 64 65 73 2e 0d 0a 20 20 20 20  urn codes...    
8280: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
8290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
82a0: 66 20 7b 24 63 6f 64 65 20 3d 3d 20 30 7d 20 74  f {$code == 0} t
82b0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
82c0: 20 20 20 20 20 20 20 20 20 69 6e 63 72 20 73 63           incr sc
82d0: 72 69 70 74 43 6f 75 6e 74 28 6f 6b 29 0d 0a 20  riptCount(ok).. 
82e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
82f0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
8300: 20 20 20 20 20 20 20 20 20 20 20 69 6e 63 72 20             incr 
8310: 73 63 72 69 70 74 43 6f 75 6e 74 28 65 72 72 6f  scriptCount(erro
8320: 72 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  r)..            
8330: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
8340: 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
8350: 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8370: 68 6f 73 74 20 72 65 73 75 6c 74 20 24 63 6f 64  host result $cod
8380: 65 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 20  e $result..     
8390: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 71 70               tqp
83a0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 5c 6e  uts $channel "\n
83b0: 2d 2d 2d 2d 20 65 6e 64 20 6f 66 20 75 70 64 61  ---- end of upda
83c0: 74 65 20 73 63 72 69 70 74 20 72 65 73 75 6c 74  te script result
83d0: 73 5c 6e 22 0d 0a 20 20 20 20 20 20 20 20 20 20  s\n"..          
83e0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
83f0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
8400: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
8410: 24 63 68 65 63 6b 42 75 69 6c 64 20 26 26 20 24  $checkBuild && $
8420: 63 6f 6d 70 61 72 65 20 3c 20 30 7d 20 74 68 65  compare < 0} the
8430: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
8440: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
8450: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
8460: 70 61 74 63 68 20 6c 65 76 65 6c 20 66 72 6f 6d  patch level from
8470: 20 74 68 65 20 6c 69 6e 65 20 69 73 20 6c 65 73   the line is les
8480: 73 2c 20 77 65 20 61 72 65 20 6d 6f 72 65 0d 0a  s, we are more..
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
84a0: 20 20 20 20 20 20 75 70 2d 74 6f 2d 64 61 74 65        up-to-date
84b0: 20 74 68 61 6e 20 74 68 65 20 6c 61 74 65 73 74   than the latest
84c0: 20 76 65 72 73 69 6f 6e 3f 0d 0a 20 20 20 20 20   version?..     
84d0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
84e0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
84f0: 20 5b 6c 69 73 74 20 5b 61 70 70 65 6e 64 41 72   [list [appendAr
8500: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
8510: 20 20 20 20 20 20 20 20 22 72 75 6e 6e 69 6e 67          "running
8520: 20 62 75 69 6c 64 20 22 20 24 65 6e 67 69 6e 65   build " $engine
8530: 50 61 74 63 68 4c 65 76 65 6c 20 22 2c 20 64 61  PatchLevel ", da
8540: 74 65 64 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ted " \..       
8550: 20 20 20 20 20 20 20 20 20 20 20 24 65 6e 67 69             $engi
8560: 6e 65 44 61 74 65 54 69 6d 65 20 22 2c 20 69 73  neDateTime ", is
8570: 20 6e 65 77 65 72 20 74 68 61 6e 20 74 68 65 20   newer than the 
8580: 22 20 24 75 70 64 61 74 65 55 72 69 54 79 70 65  " $updateUriType
8590: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
85a0: 20 20 20 20 20 20 22 20 62 75 69 6c 64 20 22 20        " build " 
85b0: 24 70 61 74 63 68 4c 65 76 65 6c 20 22 2c 20 64  $patchLevel ", d
85c0: 61 74 65 64 20 22 20 24 64 61 74 65 54 69 6d 65  ated " $dateTime
85d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
85e0: 20 20 20 20 20 20 22 2c 20 62 61 73 65 64 20 6f        ", based o
85f0: 6e 20 74 68 65 20 64 61 74 61 20 22 20 22 66 72  n the data " "fr
8600: 6f 6d 20 22 20 24 75 70 64 61 74 65 42 61 73 65  om " $updateBase
8610: 55 72 69 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20  Uri]]..         
8620: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63 68     } elseif {$ch
8630: 65 63 6b 42 75 69 6c 64 7d 20 74 68 65 6e 20 7b  eckBuild} then {
8640: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8650: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
8660: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 70 61 74   # NOTE: The pat
8670: 63 68 20 6c 65 76 65 6c 73 20 61 72 65 20 65 71  ch levels are eq
8680: 75 61 6c 2c 20 77 65 20 61 72 65 20 75 70 2d 74  ual, we are up-t
8690: 6f 2d 64 61 74 65 2e 0d 0a 20 20 20 20 20 20 20  o-date...       
86a0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
86b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
86c0: 6c 69 73 74 20 5b 61 70 70 65 6e 64 41 72 67 73  list [appendArgs
86d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
86e0: 20 20 20 20 20 20 22 72 75 6e 6e 69 6e 67 20 62        "running b
86f0: 75 69 6c 64 20 22 20 24 65 6e 67 69 6e 65 50 61  uild " $enginePa
8700: 74 63 68 4c 65 76 65 6c 20 22 2c 20 64 61 74 65  tchLevel ", date
8710: 64 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  d " \..         
8720: 20 20 20 20 20 20 20 20 20 24 65 6e 67 69 6e 65           $engine
8730: 44 61 74 65 54 69 6d 65 20 22 2c 20 69 73 20 74  DateTime ", is t
8740: 68 65 20 22 20 24 75 70 64 61 74 65 55 72 69 54  he " $updateUriT
8750: 79 70 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ype \..         
8760: 20 20 20 20 20 20 20 20 20 22 20 62 75 69 6c 64           " build
8770: 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 64  , based on the d
8780: 61 74 61 20 66 72 6f 6d 20 22 20 24 75 70 64 61  ata from " $upda
8790: 74 65 42 61 73 65 55 72 69 5d 5d 0d 0a 20 20 20  teBaseUri]]..   
87a0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
87b0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
87c0: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
87d0: 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20   }....    #..   
87e0: 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20   # NOTE: Figure 
87f0: 6f 75 74 20 77 68 61 74 20 74 68 65 20 66 69 6e  out what the fin
8800: 61 6c 20 72 65 73 75 6c 74 20 73 68 6f 75 6c 64  al result should
8810: 20 62 65 2e 20 20 49 66 20 77 65 20 67 65 74 0d   be.  If we get.
8820: 0a 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20  .    #       to 
8830: 74 68 69 73 20 70 6f 69 6e 74 20 77 68 65 6e 20  this point when 
8840: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 6e  checking for a n
8850: 65 77 20 62 75 69 6c 64 2c 20 73 6f 6d 65 74 68  ew build, someth
8860: 69 6e 67 0d 0a 20 20 20 20 23 20 20 20 20 20 20  ing..    #      
8870: 20 6d 75 73 74 20 68 61 76 65 20 67 6f 6e 65 20   must have gone 
8880: 61 77 72 79 2e 20 20 4f 74 68 65 72 77 69 73 65  awry.  Otherwise
8890: 2c 20 72 65 70 6f 72 74 20 74 68 65 20 6e 75 6d  , report the num
88a0: 62 65 72 20 6f 66 0d 0a 20 20 20 20 23 20 20 20  ber of..    #   
88b0: 20 20 20 20 75 70 64 61 74 65 20 73 63 72 69 70      update scrip
88c0: 74 73 20 74 68 61 74 20 77 65 72 65 20 73 75 63  ts that were suc
88d0: 63 65 73 73 66 75 6c 6c 79 20 70 72 6f 63 65 73  cessfully proces
88e0: 73 65 64 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20  sed...    #..   
88f0: 20 69 66 20 7b 24 77 61 6e 74 53 63 72 69 70 74   if {$wantScript
8900: 73 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  s} then {..     
8910: 20 73 65 74 20 73 63 72 69 70 74 43 6f 75 6e 74   set scriptCount
8920: 28 74 6f 74 61 6c 29 20 5b 65 78 70 72 20 5b 6a  (total) [expr [j
8930: 6f 69 6e 20 5b 61 72 72 61 79 20 76 61 6c 75 65  oin [array value
8940: 73 20 73 63 72 69 70 74 43 6f 75 6e 74 5d 20 2b  s scriptCount] +
8950: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  ]]....      if {
8960: 24 73 63 72 69 70 74 43 6f 75 6e 74 28 74 6f 74  $scriptCount(tot
8970: 61 6c 29 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  al) > 0} then {.
8980: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8990: 5b 6c 69 73 74 20 5b 61 70 70 65 6e 64 41 72 67  [list [appendArg
89a0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
89b0: 20 22 70 72 6f 63 65 73 73 65 64 20 22 20 24 73   "processed " $s
89c0: 63 72 69 70 74 43 6f 75 6e 74 28 74 6f 74 61 6c  criptCount(total
89d0: 29 20 22 20 75 70 64 61 74 65 20 73 63 72 69 70  ) " update scrip
89e0: 74 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ts: " \..       
89f0: 20 20 20 20 20 5b 61 72 72 61 79 20 67 65 74 20       [array get 
8a00: 73 63 72 69 70 74 43 6f 75 6e 74 5d 5d 5d 0d 0a  scriptCount]]]..
8a10: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
8a20: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
8a30: 6c 69 73 74 20 22 6e 6f 20 75 70 64 61 74 65 20  list "no update 
8a40: 73 63 72 69 70 74 73 20 77 65 72 65 20 70 72 6f  scripts were pro
8a50: 63 65 73 73 65 64 22 5d 0d 0a 20 20 20 20 20 20  cessed"]..      
8a60: 7d 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  }..    } else {.
8a70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c  .      return [l
8a80: 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
8a90: 20 22 63 6f 75 6c 64 20 6e 6f 74 20 64 65 74 65   "could not dete
8aa0: 72 6d 69 6e 65 20 69 66 20 72 75 6e 6e 69 6e 67  rmine if running
8ab0: 20 62 75 69 6c 64 20 69 73 20 74 68 65 20 6c 61   build is the la
8ac0: 74 65 73 74 20 62 75 69 6c 64 22 5d 0d 0a 20 20  test build"]..  
8ad0: 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23    }..  }.....  #
8ae0: 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 50 72 6f 76  ..  # NOTE: Prov
8af0: 69 64 65 20 74 68 65 20 45 61 67 6c 65 20 22 75  ide the Eagle "u
8b00: 70 64 61 74 65 22 20 70 61 63 6b 61 67 65 20 74  pdate" package t
8b10: 6f 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  o the interprete
8b20: 72 2e 0d 0a 20 20 23 0d 0a 20 20 70 61 63 6b 61  r...  #..  packa
8b30: 67 65 20 70 72 6f 76 69 64 65 20 45 61 67 6c 65  ge provide Eagle
8b40: 2e 55 70 64 61 74 65 20 5c 0d 0a 20 20 20 20 5b  .Update \..    [
8b50: 65 78 70 72 20 7b 5b 69 73 45 61 67 6c 65 5d 20  expr {[isEagle] 
8b60: 3f 20 5b 69 6e 66 6f 20 65 6e 67 69 6e 65 20 50  ? [info engine P
8b70: 61 74 63 68 4c 65 76 65 6c 5d 20 3a 20 22 31 2e  atchLevel] : "1.
8b80: 30 22 7d 5d 0d 0a 7d 0d 0a 0c                    0"}]..}...