System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 362e329fae6130c14e6a43129d8040f84334e988:


0000: 2f 2a 0d 0a 20 2a 20 49 6e 73 74 61 6c 6c 65 72  /*.. * Installer
0010: 2e 63 73 20 2d 2d 0d 0a 20 2a 0d 0a 20 2a 20 57  .cs --.. *.. * W
0020: 72 69 74 74 65 6e 20 62 79 20 4a 6f 65 20 4d 69  ritten by Joe Mi
0030: 73 74 61 63 68 6b 69 6e 2e 0d 0a 20 2a 20 52 65  stachkin... * Re
0040: 6c 65 61 73 65 64 20 74 6f 20 74 68 65 20 70 75  leased to the pu
0050: 62 6c 69 63 20 64 6f 6d 61 69 6e 2c 20 75 73 65  blic domain, use
0060: 20 61 74 20 79 6f 75 72 20 6f 77 6e 20 72 69 73   at your own ris
0070: 6b 21 0d 0a 20 2a 2f 0d 0a 0d 0a 75 73 69 6e 67  k!.. */....using
0080: 20 53 79 73 74 65 6d 2e 43 6f 6c 6c 65 63 74 69   System.Collecti
0090: 6f 6e 73 2e 47 65 6e 65 72 69 63 3b 0d 0a 75 73  ons.Generic;..us
00a0: 69 6e 67 20 53 79 73 74 65 6d 2e 44 69 61 67 6e  ing System.Diagn
00b0: 6f 73 74 69 63 73 3b 0d 0a 75 73 69 6e 67 20 53  ostics;..using S
00c0: 79 73 74 65 6d 2e 45 6e 74 65 72 70 72 69 73 65  ystem.Enterprise
00d0: 53 65 72 76 69 63 65 73 2e 49 6e 74 65 72 6e 61  Services.Interna
00e0: 6c 3b 0d 0a 75 73 69 6e 67 20 53 79 73 74 65 6d  l;..using System
00f0: 2e 49 4f 3b 0d 0a 75 73 69 6e 67 20 53 79 73 74  .IO;..using Syst
0100: 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 3b 0d 0a  em.Reflection;..
0110: 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 52 75 6e  using System.Run
0120: 74 69 6d 65 2e 43 6f 6d 70 69 6c 65 72 53 65 72  time.CompilerSer
0130: 76 69 63 65 73 3b 0d 0a 75 73 69 6e 67 20 53 79  vices;..using Sy
0140: 73 74 65 6d 2e 54 68 72 65 61 64 69 6e 67 3b 0d  stem.Threading;.
0150: 0a 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 57 69  .using System.Wi
0160: 6e 64 6f 77 73 2e 46 6f 72 6d 73 3b 0d 0a 75 73  ndows.Forms;..us
0170: 69 6e 67 20 53 79 73 74 65 6d 2e 58 6d 6c 3b 0d  ing System.Xml;.
0180: 0a 75 73 69 6e 67 20 4d 69 63 72 6f 73 6f 66 74  .using Microsoft
0190: 2e 57 69 6e 33 32 3b 0d 0a 0d 0a 6e 61 6d 65 73  .Win32;....names
01a0: 70 61 63 65 20 53 79 73 74 65 6d 2e 44 61 74 61  pace System.Data
01b0: 2e 53 51 4c 69 74 65 0d 0a 7b 0d 0a 20 20 20 20  .SQLite..{..    
01c0: 23 72 65 67 69 6f 6e 20 50 75 62 6c 69 63 20 44  #region Public D
01d0: 65 6c 65 67 61 74 65 73 0d 0a 20 20 20 20 69 6e  elegates..    in
01e0: 74 65 72 6e 61 6c 20 64 65 6c 65 67 61 74 65 20  ternal delegate 
01f0: 76 6f 69 64 20 54 72 61 63 65 43 61 6c 6c 62 61  void TraceCallba
0200: 63 6b 28 0d 0a 20 20 20 20 20 20 20 20 73 74 72  ck(..        str
0210: 69 6e 67 20 6d 65 73 73 61 67 65 2c 0d 0a 20 20  ing message,..  
0220: 20 20 20 20 20 20 73 74 72 69 6e 67 20 63 61 74        string cat
0230: 65 67 6f 72 79 0d 0a 20 20 20 20 29 3b 0d 0a 0d  egory..    );...
0240: 0a 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .    ///////////
0250: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0260: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0270: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0280: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0290: 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c  ....    internal
02a0: 20 64 65 6c 65 67 61 74 65 20 62 6f 6f 6c 20 46   delegate bool F
02b0: 72 61 6d 65 77 6f 72 6b 43 6f 6e 66 69 67 43 61  rameworkConfigCa
02c0: 6c 6c 62 61 63 6b 28 0d 0a 20 20 20 20 20 20 20  llback(..       
02d0: 20 73 74 72 69 6e 67 20 66 69 6c 65 4e 61 6d 65   string fileName
02e0: 2c 0d 0a 20 20 20 20 20 20 20 20 73 74 72 69 6e  ,..        strin
02f0: 67 20 69 6e 76 61 72 69 61 6e 74 2c 0d 0a 20 20  g invariant,..  
0300: 20 20 20 20 20 20 73 74 72 69 6e 67 20 6e 61 6d        string nam
0310: 65 2c 0d 0a 20 20 20 20 20 20 20 20 73 74 72 69  e,..        stri
0320: 6e 67 20 64 65 73 63 72 69 70 74 69 6f 6e 2c 0d  ng description,.
0330: 0a 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20  .        string 
0340: 74 79 70 65 4e 61 6d 65 2c 0d 0a 20 20 20 20 20  typeName,..     
0350: 20 20 20 41 73 73 65 6d 62 6c 79 4e 61 6d 65 20     AssemblyName 
0360: 61 73 73 65 6d 62 6c 79 4e 61 6d 65 2c 0d 0a 20  assemblyName,.. 
0370: 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 63 6c         object cl
0380: 69 65 6e 74 44 61 74 61 2c 0d 0a 20 20 20 20 20  ientData,..     
0390: 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d     bool whatIf,.
03a0: 0a 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65  .        bool ve
03b0: 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20 20  rbose,..        
03c0: 72 65 66 20 62 6f 6f 6c 20 73 61 76 65 64 2c 0d  ref bool saved,.
03d0: 0a 20 20 20 20 20 20 20 20 72 65 66 20 73 74 72  .        ref str
03e0: 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20 20 20 29  ing error..    )
03f0: 3b 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 2f 2f 2f 2f  ;....    ///////
0400: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0410: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0420: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0430: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0440: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 69 6e 74 65  ////....    inte
0450: 72 6e 61 6c 20 64 65 6c 65 67 61 74 65 20 62 6f  rnal delegate bo
0460: 6f 6c 20 46 72 61 6d 65 77 6f 72 6b 52 65 67 69  ol FrameworkRegi
0470: 73 74 72 79 43 61 6c 6c 62 61 63 6b 28 0d 0a 20  stryCallback(.. 
0480: 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79 4b         RegistryK
0490: 65 79 20 72 6f 6f 74 4b 65 79 2c 0d 0a 20 20 20  ey rootKey,..   
04a0: 20 20 20 20 20 73 74 72 69 6e 67 20 66 72 61 6d       string fram
04b0: 65 77 6f 72 6b 4e 61 6d 65 2c 0d 0a 20 20 20 20  eworkName,..    
04c0: 20 20 20 20 56 65 72 73 69 6f 6e 20 66 72 61 6d      Version fram
04d0: 65 77 6f 72 6b 56 65 72 73 69 6f 6e 2c 0d 0a 20  eworkVersion,.. 
04e0: 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 70 6c         string pl
04f0: 61 74 66 6f 72 6d 4e 61 6d 65 2c 0d 0a 20 20 20  atformName,..   
0500: 20 20 20 20 20 6f 62 6a 65 63 74 20 63 6c 69 65       object clie
0510: 6e 74 44 61 74 61 2c 0d 0a 20 20 20 20 20 20 20  ntData,..       
0520: 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20   bool whatIf,.. 
0530: 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62         bool verb
0540: 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 72 65  ose,..        re
0550: 66 20 73 74 72 69 6e 67 20 65 72 72 6f 72 0d 0a  f string error..
0560: 20 20 20 20 29 3b 0d 0a 0d 0a 20 20 20 20 2f 2f      );....    //
0570: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0580: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0590: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
05a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
05b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
05c0: 20 69 6e 74 65 72 6e 61 6c 20 64 65 6c 65 67 61   internal delega
05d0: 74 65 20 62 6f 6f 6c 20 56 69 73 75 61 6c 53 74  te bool VisualSt
05e0: 75 64 69 6f 52 65 67 69 73 74 72 79 43 61 6c 6c  udioRegistryCall
05f0: 62 61 63 6b 28 0d 0a 20 20 20 20 20 20 20 20 52  back(..        R
0600: 65 67 69 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b  egistryKey rootK
0610: 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 56 65 72  ey,..        Ver
0620: 73 69 6f 6e 20 76 73 56 65 72 73 69 6f 6e 2c 0d  sion vsVersion,.
0630: 0a 20 20 20 20 20 20 20 20 47 75 69 64 20 70 61  .        Guid pa
0640: 63 6b 61 67 65 49 64 2c 0d 0a 20 20 20 20 20 20  ckageId,..      
0650: 20 20 47 75 69 64 20 73 65 72 76 69 63 65 49 64    Guid serviceId
0660: 2c 0d 0a 20 20 20 20 20 20 20 20 47 75 69 64 20  ,..        Guid 
0670: 64 61 74 61 53 6f 75 72 63 65 49 64 2c 0d 0a 20  dataSourceId,.. 
0680: 20 20 20 20 20 20 20 47 75 69 64 20 64 61 74 61         Guid data
0690: 50 72 6f 76 69 64 65 72 49 64 2c 0d 0a 20 20 20  ProviderId,..   
06a0: 20 20 20 20 20 6f 62 6a 65 63 74 20 63 6c 69 65       object clie
06b0: 6e 74 44 61 74 61 2c 0d 0a 20 20 20 20 20 20 20  ntData,..       
06c0: 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20   bool whatIf,.. 
06d0: 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62         bool verb
06e0: 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 72 65  ose,..        re
06f0: 66 20 73 74 72 69 6e 67 20 65 72 72 6f 72 0d 0a  f string error..
0700: 20 20 20 20 29 3b 0d 0a 20 20 20 20 23 65 6e 64      );..    #end
0710: 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 2f 2f  region....    //
0720: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0730: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0740: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0750: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0760: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
0770: 20 23 72 65 67 69 6f 6e 20 50 75 62 6c 69 63 20   #region Public 
0780: 45 6e 75 6d 65 72 61 74 69 6f 6e 73 0d 0a 20 20  Enumerations..  
0790: 20 20 5b 46 6c 61 67 73 28 29 5d 0d 0a 20 20 20    [Flags()]..   
07a0: 20 70 75 62 6c 69 63 20 65 6e 75 6d 20 49 6e 73   public enum Ins
07b0: 74 61 6c 6c 46 6c 61 67 73 0d 0a 20 20 20 20 7b  tallFlags..    {
07c0: 0d 0a 20 20 20 20 20 20 20 20 4e 6f 6e 65 20 3d  ..        None =
07d0: 20 30 78 30 2c 0d 0a 20 20 20 20 20 20 20 20 47   0x0,..        G
07e0: 41 43 20 3d 20 30 78 31 2c 0d 0a 20 20 20 20 20  AC = 0x1,..     
07f0: 20 20 20 41 73 73 65 6d 62 6c 79 46 6f 6c 64 65     AssemblyFolde
0800: 72 73 20 3d 20 30 78 32 2c 0d 0a 20 20 20 20 20  rs = 0x2,..     
0810: 20 20 20 44 62 50 72 6f 76 69 64 65 72 46 61 63     DbProviderFac
0820: 74 6f 72 79 20 3d 20 30 78 34 2c 0d 0a 20 20 20  tory = 0x4,..   
0830: 20 20 20 20 20 56 73 50 61 63 6b 61 67 65 20 3d       VsPackage =
0840: 20 30 78 38 2c 0d 0a 20 20 20 20 20 20 20 20 56   0x8,..        V
0850: 73 44 61 74 61 53 6f 75 72 63 65 20 3d 20 30 78  sDataSource = 0x
0860: 31 30 2c 0d 0a 20 20 20 20 20 20 20 20 56 73 44  10,..        VsD
0870: 61 74 61 50 72 6f 76 69 64 65 72 20 3d 20 30 78  ataProvider = 0x
0880: 32 30 2c 0d 0a 20 20 20 20 20 20 20 20 46 72 61  20,..        Fra
0890: 6d 65 77 6f 72 6b 20 3d 20 47 41 43 20 7c 20 41  mework = GAC | A
08a0: 73 73 65 6d 62 6c 79 46 6f 6c 64 65 72 73 20 7c  ssemblyFolders |
08b0: 20 44 62 50 72 6f 76 69 64 65 72 46 61 63 74 6f   DbProviderFacto
08c0: 72 79 2c 0d 0a 20 20 20 20 20 20 20 20 56 73 20  ry,..        Vs 
08d0: 3d 20 56 73 50 61 63 6b 61 67 65 20 7c 20 56 73  = VsPackage | Vs
08e0: 44 61 74 61 53 6f 75 72 63 65 20 7c 20 56 73 44  DataSource | VsD
08f0: 61 74 61 50 72 6f 76 69 64 65 72 2c 0d 0a 20 20  ataProvider,..  
0900: 20 20 20 20 20 20 41 6c 6c 20 3d 20 46 72 61 6d        All = Fram
0910: 65 77 6f 72 6b 20 7c 20 56 73 2c 0d 0a 20 20 20  ework | Vs,..   
0920: 20 20 20 20 20 44 65 66 61 75 6c 74 20 3d 20 41       Default = A
0930: 6c 6c 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ll..    }....   
0940: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
0950: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0960: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0970: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0980: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
0990: 20 20 20 20 5b 46 6c 61 67 73 28 29 5d 0d 0a 20      [Flags()].. 
09a0: 20 20 20 70 75 62 6c 69 63 20 65 6e 75 6d 20 54     public enum T
09b0: 72 61 63 65 50 72 69 6f 72 69 74 79 0d 0a 20 20  racePriority..  
09c0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 4e 6f 6e    {..        Non
09d0: 65 20 3d 20 30 78 30 2c 0d 0a 20 20 20 20 20 20  e = 0x0,..      
09e0: 20 20 4c 6f 77 65 73 74 20 3d 20 30 78 31 2c 0d    Lowest = 0x1,.
09f0: 0a 20 20 20 20 20 20 20 20 4c 6f 77 65 72 20 3d  .        Lower =
0a00: 20 30 78 32 2c 0d 0a 20 20 20 20 20 20 20 20 4c   0x2,..        L
0a10: 6f 77 20 3d 20 30 78 34 2c 0d 0a 20 20 20 20 20  ow = 0x4,..     
0a20: 20 20 20 4d 65 64 69 75 6d 20 3d 20 30 78 38 2c     Medium = 0x8,
0a30: 0d 0a 20 20 20 20 20 20 20 20 48 69 67 68 20 3d  ..        High =
0a40: 20 30 78 31 30 2c 0d 0a 20 20 20 20 20 20 20 20   0x10,..        
0a50: 48 69 67 68 65 72 20 3d 20 30 78 32 30 2c 0d 0a  Higher = 0x20,..
0a60: 20 20 20 20 20 20 20 20 48 69 67 68 65 73 74 20          Highest 
0a70: 3d 20 30 78 34 30 2c 0d 0a 20 20 20 20 20 20 20  = 0x40,..       
0a80: 20 44 65 66 61 75 6c 74 20 3d 20 4d 65 64 69 75   Default = Mediu
0a90: 6d 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 23 65  m..    }..    #e
0aa0: 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20  ndregion....    
0ab0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0ac0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0ad0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0ae0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0af0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
0b00: 20 20 20 23 72 65 67 69 6f 6e 20 49 6e 73 74 61     #region Insta
0b10: 6c 6c 65 72 20 43 6c 61 73 73 0d 0a 20 20 20 20  ller Class..    
0b20: 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 69 63 20  internal static 
0b30: 63 6c 61 73 73 20 49 6e 73 74 61 6c 6c 65 72 0d  class Installer.
0b40: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20  .    {..        
0b50: 23 72 65 67 69 6f 6e 20 50 72 69 76 61 74 65 20  #region Private 
0b60: 48 65 6c 70 65 72 20 43 6c 61 73 73 65 73 0d 0a  Helper Classes..
0b70: 20 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20          #region 
0b80: 41 6e 79 50 61 69 72 20 43 6c 61 73 73 0d 0a 20  AnyPair Class.. 
0b90: 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73         private s
0ba0: 65 61 6c 65 64 20 63 6c 61 73 73 20 41 6e 79 50  ealed class AnyP
0bb0: 61 69 72 3c 54 31 2c 20 54 32 3e 0d 0a 20 20 20  air<T1, T2>..   
0bc0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
0bd0: 20 20 20 20 23 72 65 67 69 6f 6e 20 50 75 62 6c      #region Publ
0be0: 69 63 20 43 6f 6e 73 74 72 75 63 74 6f 72 73 0d  ic Constructors.
0bf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d  .            //.
0c00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
0c10: 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 63 6f  WARNING: This co
0c20: 6e 73 74 72 75 63 74 6f 72 20 70 72 6f 64 75 63  nstructor produc
0c30: 65 73 20 61 6e 20 69 6d 6d 75 74 61 62 6c 65 20  es an immutable 
0c40: 22 65 6d 70 74 79 22 20 70 61 69 72 0d 0a 20 20  "empty" pair..  
0c50: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
0c60: 20 20 20 20 20 20 6f 62 6a 65 63 74 2e 0d 0a 20        object... 
0c70: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
0c80: 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
0c90: 63 20 41 6e 79 50 61 69 72 28 29 0d 0a 20 20 20  c AnyPair()..   
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 62               : b
0cb0: 61 73 65 28 29 0d 0a 20 20 20 20 20 20 20 20 20  ase()..         
0cc0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
0cd0: 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f 74 68        // do noth
0ce0: 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ing...          
0cf0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
0d00: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
0d10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0d20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0d30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0d40: 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
0d50: 20 20 20 20 20 20 70 75 62 6c 69 63 20 41 6e 79        public Any
0d60: 50 61 69 72 28 54 31 20 78 29 0d 0a 20 20 20 20  Pair(T1 x)..    
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 74 68              : th
0d80: 69 73 28 29 0d 0a 20 20 20 20 20 20 20 20 20 20  is()..          
0d90: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
0da0: 20 20 20 20 20 74 68 69 73 2e 78 20 3d 20 78 3b       this.x = x;
0db0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
0dc0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
0dd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0de0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0df0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0e00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0e10: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
0e20: 20 20 70 75 62 6c 69 63 20 41 6e 79 50 61 69 72    public AnyPair
0e30: 28 54 31 20 78 2c 20 54 32 20 79 29 0d 0a 20 20  (T1 x, T2 y)..  
0e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20                : 
0e50: 74 68 69 73 28 78 29 0d 0a 20 20 20 20 20 20 20  this(x)..       
0e60: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
0e70: 20 20 20 20 20 20 20 20 74 68 69 73 2e 79 20 3d          this.y =
0e80: 20 79 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20   y;..           
0e90: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
0ea0: 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20  #endregion....  
0eb0: 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
0ec0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0ed0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0ee0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0ef0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
0f00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 72 65  .            #re
0f10: 67 69 6f 6e 20 50 75 62 6c 69 63 20 50 72 6f 70  gion Public Prop
0f20: 65 72 74 69 65 73 0d 0a 20 20 20 20 20 20 20 20  erties..        
0f30: 20 20 20 20 70 72 69 76 61 74 65 20 54 31 20 78      private T1 x
0f40: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ;..            p
0f50: 75 62 6c 69 63 20 54 31 20 58 0d 0a 20 20 20 20  ublic T1 X..    
0f60: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
0f70: 20 20 20 20 20 20 20 20 20 20 20 67 65 74 20 7b             get {
0f80: 20 72 65 74 75 72 6e 20 78 3b 20 7d 0d 0a 20 20   return x; }..  
0f90: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
0fa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
0fb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0fc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0fd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0fe0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
0ff0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ..            pr
1000: 69 76 61 74 65 20 54 32 20 79 3b 0d 0a 20 20 20  ivate T2 y;..   
1010: 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20           public 
1020: 54 32 20 59 0d 0a 20 20 20 20 20 20 20 20 20 20  T2 Y..          
1030: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
1040: 20 20 20 20 20 67 65 74 20 7b 20 72 65 74 75 72       get { retur
1050: 6e 20 79 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20  n y; }..        
1060: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1070: 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 20     #endregion.. 
1080: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1090: 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a    #endregion....
10a0: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
10b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
10f0: 0a 0d 0a 20 20 20 20 20 20 20 20 23 72 65 67 69  ...        #regi
1100: 6f 6e 20 54 72 61 63 65 4f 70 73 20 43 6c 61 73  on TraceOps Clas
1110: 73 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61  s..        priva
1120: 74 65 20 73 74 61 74 69 63 20 63 6c 61 73 73 20  te static class 
1130: 54 72 61 63 65 4f 70 73 0d 0a 20 20 20 20 20 20  TraceOps..      
1140: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
1150: 20 23 72 65 67 69 6f 6e 20 50 72 69 76 61 74 65   #region Private
1160: 20 43 6f 6e 73 74 61 6e 74 73 0d 0a 20 20 20 20   Constants..    
1170: 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
1180: 63 6f 6e 73 74 20 73 74 72 69 6e 67 20 49 73 6f  const string Iso
1190: 38 36 30 31 44 61 74 65 54 69 6d 65 4f 75 74 70  8601DateTimeOutp
11a0: 75 74 46 6f 72 6d 61 74 20 3d 0d 0a 20 20 20 20  utFormat =..    
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 79 79 79              "yyy
11c0: 79 2e 4d 4d 2e 64 64 54 48 48 3a 6d 6d 3a 73 73  y.MM.ddTHH:mm:ss
11d0: 2e 66 66 66 66 66 66 66 22 3b 0d 0a 20 20 20 20  .fffffff";..    
11e0: 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69          #endregi
11f0: 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  on....          
1200: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
1210: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1220: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1230: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1240: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
1250: 20 20 20 20 20 23 72 65 67 69 6f 6e 20 50 72 69       #region Pri
1260: 76 61 74 65 20 53 74 61 74 69 63 20 44 61 74 61  vate Static Data
1270: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ..            pr
1280: 69 76 61 74 65 20 73 74 61 74 69 63 20 6f 62 6a  ivate static obj
1290: 65 63 74 20 73 79 6e 63 52 6f 6f 74 20 3d 20 6e  ect syncRoot = n
12a0: 65 77 20 6f 62 6a 65 63 74 28 29 3b 0d 0a 20 20  ew object();..  
12b0: 20 20 20 20 20 20 20 20 20 20 70 72 69 76 61 74            privat
12c0: 65 20 73 74 61 74 69 63 20 6c 6f 6e 67 20 6e 65  e static long ne
12d0: 78 74 49 64 3b 0d 0a 20 20 20 20 20 20 20 20 20  xtId;..         
12e0: 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69     private stati
12f0: 63 20 54 72 61 63 65 50 72 69 6f 72 69 74 79 20  c TracePriority 
1300: 74 72 61 63 65 50 72 69 6f 72 69 74 79 20 3d 20  tracePriority = 
1310: 54 72 61 63 65 50 72 69 6f 72 69 74 79 2e 44 65  TracePriority.De
1320: 66 61 75 6c 74 3b 0d 0a 20 20 20 20 20 20 20 20  fault;..        
1330: 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a      #endregion..
1340: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
1350: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1360: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1370: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1380: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1390: 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  /....           
13a0: 20 23 72 65 67 69 6f 6e 20 50 75 62 6c 69 63 20   #region Public 
13b0: 53 74 61 74 69 63 20 50 72 6f 70 65 72 74 69 65  Static Propertie
13c0: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  s..            p
13d0: 75 62 6c 69 63 20 73 74 61 74 69 63 20 54 72 61  ublic static Tra
13e0: 63 65 50 72 69 6f 72 69 74 79 20 54 72 61 63 65  cePriority Trace
13f0: 50 72 69 6f 72 69 74 79 0d 0a 20 20 20 20 20 20  Priority..      
1400: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
1410: 20 20 20 20 20 20 20 20 20 67 65 74 20 7b 20 6c           get { l
1420: 6f 63 6b 20 28 73 79 6e 63 52 6f 6f 74 29 20 7b  ock (syncRoot) {
1430: 20 72 65 74 75 72 6e 20 74 72 61 63 65 50 72 69   return tracePri
1440: 6f 72 69 74 79 3b 20 7d 20 7d 0d 0a 20 20 20 20  ority; } }..    
1450: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
1460: 7b 20 6c 6f 63 6b 20 28 73 79 6e 63 52 6f 6f 74  { lock (syncRoot
1470: 29 20 7b 20 74 72 61 63 65 50 72 69 6f 72 69 74  ) { tracePriorit
1480: 79 20 3d 20 76 61 6c 75 65 3b 20 7d 20 7d 0d 0a  y = value; } }..
1490: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
14a0: 20 20 20 20 20 20 20 20 20 20 20 23 65 6e 64 72             #endr
14b0: 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  egion....       
14c0: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
14d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1500: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
1510: 20 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20          #region 
1520: 49 6e 74 65 72 61 63 74 69 76 65 20 53 75 70 70  Interactive Supp
1530: 6f 72 74 20 4d 65 74 68 6f 64 73 0d 0a 20 20 20  ort Methods..   
1540: 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20           public 
1550: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 47 65  static string Ge
1560: 74 41 73 73 65 6d 62 6c 79 54 69 74 6c 65 28 0d  tAssemblyTitle(.
1570: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1580: 20 41 73 73 65 6d 62 6c 79 20 61 73 73 65 6d 62   Assembly assemb
1590: 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ly..            
15a0: 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20      )..         
15b0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
15c0: 20 20 20 20 20 20 69 66 20 28 61 73 73 65 6d 62        if (assemb
15d0: 6c 79 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  ly != null)..   
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20      try..       
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
1620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1630: 20 20 20 20 20 20 20 20 69 66 20 28 61 73 73 65          if (asse
1640: 6d 62 6c 79 2e 49 73 44 65 66 69 6e 65 64 28 0d  mbly.IsDefined(.
1650: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1670: 20 74 79 70 65 6f 66 28 41 73 73 65 6d 62 6c 79   typeof(Assembly
1680: 54 69 74 6c 65 41 74 74 72 69 62 75 74 65 29 2c  TitleAttribute),
1690: 20 66 61 6c 73 65 29 29 0d 0a 20 20 20 20 20 20   false))..      
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 20 41 73 73 65 6d 62 6c 79 54 69 74 6c 65 41 74   AssemblyTitleAt
16e0: 74 72 69 62 75 74 65 20 74 69 74 6c 65 20 3d 0d  tribute title =.
16f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 28 41 73 73 65 6d 62 6c 79 54 69 74 6c 65 41   (AssemblyTitleA
1720: 74 74 72 69 62 75 74 65 29 0d 0a 20 20 20 20 20  ttribute)..     
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1740: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 6d             assem
1750: 62 6c 79 2e 47 65 74 43 75 73 74 6f 6d 41 74 74  bly.GetCustomAtt
1760: 72 69 62 75 74 65 73 28 0d 0a 20 20 20 20 20 20  ributes(..      
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 79                ty
1790: 70 65 6f 66 28 41 73 73 65 6d 62 6c 79 54 69 74  peof(AssemblyTit
17a0: 6c 65 41 74 74 72 69 62 75 74 65 29 2c 20 66 61  leAttribute), fa
17b0: 6c 73 65 29 5b 30 5d 3b 0d 0a 0d 0a 20 20 20 20  lse)[0];....    
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
17e0: 69 74 6c 65 2e 54 69 74 6c 65 3b 0d 0a 20 20 20  itle.Title;..   
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1800: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1810: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1830: 20 20 20 63 61 74 63 68 0d 0a 20 20 20 20 20 20     catch..      
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
1850: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1860: 20 20 20 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e           // do n
1870: 6f 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20  othing...       
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
18b0: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c       return null
18c0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
18d0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
18e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
18f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1900: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1910: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1920: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
1930: 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63     public static
1940: 20 44 69 61 6c 6f 67 52 65 73 75 6c 74 20 53 68   DialogResult Sh
1950: 6f 77 4d 65 73 73 61 67 65 28 0d 0a 20 20 20 20  owMessage(..    
1960: 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63              Trac
1970: 65 50 72 69 6f 72 69 74 79 20 74 72 61 63 65 50  ePriority traceP
1980: 72 69 6f 72 69 74 79 2c 0d 0a 20 20 20 20 20 20  riority,..      
1990: 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65 43            TraceC
19a0: 61 6c 6c 62 61 63 6b 20 74 72 61 63 65 43 61 6c  allback traceCal
19b0: 6c 62 61 63 6b 2c 0d 0a 20 20 20 20 20 20 20 20  lback,..        
19c0: 20 20 20 20 20 20 20 20 41 73 73 65 6d 62 6c 79          Assembly
19d0: 20 61 73 73 65 6d 62 6c 79 2c 0d 0a 20 20 20 20   assembly,..    
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
19f0: 6e 67 20 6d 65 73 73 61 67 65 2c 0d 0a 20 20 20  ng message,..   
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
1a10: 69 6e 67 20 63 61 74 65 67 6f 72 79 2c 0d 0a 20  ing category,.. 
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d                 M
1a30: 65 73 73 61 67 65 42 6f 78 42 75 74 74 6f 6e 73  essageBoxButtons
1a40: 20 62 75 74 74 6f 6e 73 2c 0d 0a 20 20 20 20 20   buttons,..     
1a50: 20 20 20 20 20 20 20 20 20 20 20 4d 65 73 73 61             Messa
1a60: 67 65 42 6f 78 49 63 6f 6e 20 69 63 6f 6e 0d 0a  geBoxIcon icon..
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a80: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
1a90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1aa0: 20 20 44 69 61 6c 6f 67 52 65 73 75 6c 74 20 72    DialogResult r
1ab0: 65 73 75 6c 74 20 3d 20 44 69 61 6c 6f 67 52 65  esult = DialogRe
1ac0: 73 75 6c 74 2e 4f 4b 3b 0d 0a 0d 0a 20 20 20 20  sult.OK;....    
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63              Trac
1ae0: 65 28 74 72 61 63 65 50 72 69 6f 72 69 74 79 2c  e(tracePriority,
1af0: 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20   traceCallback, 
1b00: 6d 65 73 73 61 67 65 2c 20 63 61 74 65 67 6f 72  message, categor
1b10: 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  y);....         
1b20: 20 20 20 20 20 20 20 69 66 20 28 53 79 73 74 65         if (Syste
1b30: 6d 49 6e 66 6f 72 6d 61 74 69 6f 6e 2e 55 73 65  mInformation.Use
1b40: 72 49 6e 74 65 72 61 63 74 69 76 65 29 0d 0a 20  rInteractive).. 
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
1b60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b70: 20 20 20 20 20 20 73 74 72 69 6e 67 20 74 69 74        string tit
1b80: 6c 65 20 3d 20 47 65 74 41 73 73 65 6d 62 6c 79  le = GetAssembly
1b90: 54 69 74 6c 65 28 61 73 73 65 6d 62 6c 79 29 3b  Title(assembly);
1ba0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1bb0: 20 20 20 20 20 20 20 20 69 66 20 28 74 69 74 6c          if (titl
1bc0: 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  e == null)..    
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 20 20 20 74 69 74 6c 65 20 3d 20 41 70 70 6c      title = Appl
1bf0: 69 63 61 74 69 6f 6e 2e 50 72 6f 64 75 63 74 4e  ication.ProductN
1c00: 61 6d 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ame;....        
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75              resu
1c20: 6c 74 20 3d 20 4d 65 73 73 61 67 65 42 6f 78 2e  lt = MessageBox.
1c30: 53 68 6f 77 28 6d 65 73 73 61 67 65 2c 20 74 69  Show(message, ti
1c40: 74 6c 65 2c 20 62 75 74 74 6f 6e 73 2c 20 69 63  tle, buttons, ic
1c50: 6f 6e 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  on);....        
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63              Trac
1c70: 65 28 74 72 61 63 65 50 72 69 6f 72 69 74 79 2c  e(tracePriority,
1c80: 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20   traceCallback, 
1c90: 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a  String.Format(..
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb0: 20 20 20 20 20 20 20 20 22 55 73 65 72 20 63 68          "User ch
1cc0: 6f 69 63 65 20 6f 66 20 5c 22 7b 30 7d 5c 22 2e  oice of \"{0}\".
1cd0: 22 2c 20 72 65 73 75 6c 74 29 2c 20 63 61 74 65  ", result), cate
1ce0: 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  gory);....      
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1d00: 74 75 72 6e 20 72 65 73 75 6c 74 3b 0d 0a 20 20  turn result;..  
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1d20: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1d30: 20 20 20 54 72 61 63 65 28 74 72 61 63 65 50 72     Trace(tracePr
1d40: 69 6f 72 69 74 79 2c 20 74 72 61 63 65 43 61 6c  iority, traceCal
1d50: 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f  lback, String.Fo
1d60: 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20  rmat(..         
1d70: 20 20 20 20 20 20 20 20 20 20 20 22 44 65 66 61             "Defa
1d80: 75 6c 74 20 63 68 6f 69 63 65 20 6f 66 20 5c 22  ult choice of \"
1d90: 7b 30 7d 5c 22 2e 22 2c 20 72 65 73 75 6c 74 29  {0}\".", result)
1da0: 2c 20 63 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a  , category);....
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc0: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0d 0a  return result;..
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1de0: 20 20 20 20 20 20 20 20 20 20 20 23 65 6e 64 72             #endr
1df0: 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  egion....       
1e00: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
1e10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e40: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
1e50: 20 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20          #region 
1e60: 54 72 61 63 69 6e 67 20 53 75 70 70 6f 72 74 20  Tracing Support 
1e70: 4d 65 74 68 6f 64 73 0d 0a 20 20 20 20 20 20 20  Methods..       
1e80: 20 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74       public stat
1e90: 69 63 20 6c 6f 6e 67 20 4e 65 78 74 49 64 28 29  ic long NextId()
1ea0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
1eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ec0: 20 72 65 74 75 72 6e 20 49 6e 74 65 72 6c 6f 63   return Interloc
1ed0: 6b 65 64 2e 49 6e 63 72 65 6d 65 6e 74 28 72 65  ked.Increment(re
1ee0: 66 20 6e 65 78 74 49 64 29 3b 0d 0a 20 20 20 20  f nextId);..    
1ef0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1f00: 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
1f10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1f20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1f30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1f40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
1f60: 69 63 20 73 74 61 74 69 63 20 73 74 72 69 6e 67  ic static string
1f70: 20 54 69 6d 65 53 74 61 6d 70 28 44 61 74 65 54   TimeStamp(DateT
1f80: 69 6d 65 20 64 61 74 65 54 69 6d 65 29 0d 0a 20  ime dateTime).. 
1f90: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1fb0: 74 75 72 6e 20 64 61 74 65 54 69 6d 65 2e 54 6f  turn dateTime.To
1fc0: 53 74 72 69 6e 67 28 49 73 6f 38 36 30 31 44 61  String(Iso8601Da
1fd0: 74 65 54 69 6d 65 4f 75 74 70 75 74 46 6f 72 6d  teTimeOutputForm
1fe0: 61 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  at);..          
1ff0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
2000: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
2010: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2020: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2030: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2040: 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
2050: 20 20 20 20 20 20 5b 4d 65 74 68 6f 64 49 6d 70        [MethodImp
2060: 6c 28 4d 65 74 68 6f 64 49 6d 70 6c 4f 70 74 69  l(MethodImplOpti
2070: 6f 6e 73 2e 4e 6f 49 6e 6c 69 6e 69 6e 67 29 5d  ons.NoInlining)]
2080: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ..            pr
2090: 69 76 61 74 65 20 73 74 61 74 69 63 20 73 74 72  ivate static str
20a0: 69 6e 67 20 47 65 74 4d 65 74 68 6f 64 4e 61 6d  ing GetMethodNam
20b0: 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e(..            
20c0: 20 20 20 20 53 74 61 63 6b 54 72 61 63 65 20 73      StackTrace s
20d0: 74 61 63 6b 54 72 61 63 65 2c 0d 0a 20 20 20 20  tackTrace,..    
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
20f0: 6c 65 76 65 6c 0d 0a 20 20 20 20 20 20 20 20 20  level..         
2100: 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20         )..      
2110: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
2120: 20 20 20 20 20 20 20 20 20 74 72 79 0d 0a 20 20           try..  
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
2140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2150: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
2170: 4e 4f 54 45 3a 20 49 66 20 61 20 76 61 6c 69 64  NOTE: If a valid
2180: 20 73 74 61 63 6b 20 74 72 61 63 65 20 77 61 73   stack trace was
2190: 20 6e 6f 74 20 73 75 70 70 6c 69 65 64 20 62 79   not supplied by
21a0: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20   the..          
21b0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
21c0: 20 20 20 63 61 6c 6c 65 72 2c 20 63 72 65 61 74     caller, creat
21d0: 65 20 6f 6e 65 20 6e 6f 77 20 62 61 73 65 64 20  e one now based 
21e0: 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0d 0a  on the current..
21f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2200: 20 20 20 20 2f 2f 20 20 20 20 20 20 20 65 78 65      //       exe
2210: 63 75 74 69 6f 6e 20 73 74 61 63 6b 2e 0d 0a 20  cution stack... 
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2230: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
2240: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73             if (s
2250: 74 61 63 6b 54 72 61 63 65 20 3d 3d 20 6e 75 6c  tackTrace == nul
2260: 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
2270: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
2280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2290: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22b0: 2f 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65  / NOTE: Grab the
22c0: 20 63 75 72 72 65 6e 74 20 65 78 65 63 75 74 69   current executi
22d0: 6f 6e 20 73 74 61 63 6b 2e 0d 0a 20 20 20 20 20  on stack...     
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f0: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2310: 74 61 63 6b 54 72 61 63 65 20 3d 20 6e 65 77 20  tackTrace = new 
2320: 53 74 61 63 6b 54 72 61 63 65 28 29 3b 0d 0a 0d  StackTrace();...
2330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2340: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2360: 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 41 6c       // NOTE: Al
2370: 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 63  ways skip this c
2380: 61 6c 6c 20 66 72 61 6d 65 20 77 68 65 6e 20 77  all frame when w
2390: 65 20 63 61 70 74 75 72 65 0d 0a 20 20 20 20 20  e capture..     
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b0: 20 20 20 2f 2f 20 20 20 20 20 20 20 74 68 65 20     //       the 
23c0: 73 74 61 63 6b 20 74 72 61 63 65 2e 0d 0a 20 20  stack trace...  
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e0: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2400: 20 20 6c 65 76 65 6c 2b 2b 3b 0d 0a 20 20 20 20    level++;..    
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2420: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
2430: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2450: 20 2f 2f 20 4e 4f 54 45 3a 20 47 65 74 20 74 68   // NOTE: Get th
2460: 65 20 73 70 65 63 69 66 69 65 64 20 73 74 61 63  e specified stac
2470: 6b 20 66 72 61 6d 65 20 28 61 6c 77 61 79 73 20  k frame (always 
2480: 61 64 64 20 6f 6e 65 20 74 6f 0d 0a 20 20 20 20  add one to..    
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 2f 2f 20 20 20 20 20 20 20 73 6b 69 70 20 74 68  //       skip th
24b0: 69 73 20 6d 65 74 68 6f 64 29 2e 0d 0a 20 20 20  is method)...   
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d0: 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
24e0: 20 20 20 20 20 20 20 20 20 53 74 61 63 6b 46 72           StackFr
24f0: 61 6d 65 20 73 74 61 63 6b 46 72 61 6d 65 20 3d  ame stackFrame =
2500: 20 73 74 61 63 6b 54 72 61 63 65 2e 47 65 74 46   stackTrace.GetF
2510: 72 61 6d 65 28 6c 65 76 65 6c 29 3b 0d 0a 0d 0a  rame(level);....
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2530: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
2540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e              // N
2550: 4f 54 45 3a 20 47 65 74 20 74 68 65 20 6d 65 74  OTE: Get the met
2560: 68 6f 64 20 66 6f 72 20 74 68 65 20 73 74 61 63  hod for the stac
2570: 6b 20 66 72 61 6d 65 2e 0d 0a 20 20 20 20 20 20  k frame...      
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
2590: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25a0: 20 20 20 20 20 20 4d 65 74 68 6f 64 42 61 73 65        MethodBase
25b0: 20 6d 65 74 68 6f 64 42 61 73 65 20 3d 20 73 74   methodBase = st
25c0: 61 63 6b 46 72 61 6d 65 2e 47 65 74 4d 65 74 68  ackFrame.GetMeth
25d0: 6f 64 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  od();....       
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d               //.
25f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2600: 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 47 65       // NOTE: Ge
2610: 74 20 74 68 65 20 74 79 70 65 20 66 6f 72 20 74  t the type for t
2620: 68 65 20 6d 65 74 68 6f 64 2e 0d 0a 20 20 20 20  he method...    
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
2650: 20 20 20 20 20 20 20 20 54 79 70 65 20 74 79 70          Type typ
2660: 65 20 3d 20 6d 65 74 68 6f 64 42 61 73 65 2e 44  e = methodBase.D
2670: 65 63 6c 61 72 69 6e 67 54 79 70 65 3b 0d 0a 0d  eclaringType;...
2680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2690: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
26b0: 4e 4f 54 45 3a 20 47 65 74 20 74 68 65 20 6e 61  NOTE: Get the na
26c0: 6d 65 20 6f 66 20 74 68 65 20 6d 65 74 68 6f 64  me of the method
26d0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
26e0: 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2700: 74 72 69 6e 67 20 6e 61 6d 65 20 3d 20 6d 65 74  tring name = met
2710: 68 6f 64 42 61 73 65 2e 4e 61 6d 65 3b 0d 0a 0d  hodBase.Name;...
2720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2730: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
2750: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65  NOTE: Return the
2760: 20 70 72 6f 70 65 72 6c 79 20 66 6f 72 6d 61 74   properly format
2770: 74 65 64 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20  ted result...   
2780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2790: 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
27a0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
27b0: 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a  String.Format(..
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 20 20 20 20 20 20 20 20 22 7b 30 7d 7b 31 7d 7b          "{0}{1}{
27e0: 32 7d 22 2c 20 74 79 70 65 2e 4e 61 6d 65 2c 20  2}", type.Name, 
27f0: 54 79 70 65 2e 44 65 6c 69 6d 69 74 65 72 2c 20  Type.Delimiter, 
2800: 6e 61 6d 65 29 3b 0d 0a 20 20 20 20 20 20 20 20  name);..        
2810: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2820: 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68             catch
2830: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2840: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
2850: 20 20 20 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e           // do n
2860: 6f 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20  othing...       
2870: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
2890: 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20  turn null;..    
28a0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
28b0: 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
28c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
28d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
28e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
28f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
2900: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
2910: 69 63 20 73 74 61 74 69 63 20 76 6f 69 64 20 54  ic static void T
2920: 72 61 63 65 43 6f 72 65 28 0d 0a 20 20 20 20 20  raceCore(..     
2930: 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e             strin
2940: 67 20 6d 65 73 73 61 67 65 2c 0d 0a 20 20 20 20  g message,..    
2950: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
2960: 6e 67 20 63 61 74 65 67 6f 72 79 0d 0a 20 20 20  ng category..   
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a               )..
2980: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
29a0: 6f 63 6b 20 28 73 79 6e 63 52 6f 6f 74 29 0d 0a  ock (syncRoot)..
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
29d0: 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 69         System.Di
29e0: 61 67 6e 6f 73 74 69 63 73 2e 54 72 61 63 65 2e  agnostics.Trace.
29f0: 57 72 69 74 65 4c 69 6e 65 28 6d 65 73 73 61 67  WriteLine(messag
2a00: 65 2c 20 63 61 74 65 67 6f 72 79 29 3b 0d 0a 20  e, category);.. 
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a20: 20 20 20 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f     System.Diagno
2a30: 73 74 69 63 73 2e 54 72 61 63 65 2e 46 6c 75 73  stics.Trace.Flus
2a40: 68 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  h();..          
2a50: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2a60: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2a70: 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
2a80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2a90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2aa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2ab0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
2ac0: 20 20 20 20 20 20 20 20 20 5b 4d 65 74 68 6f 64           [Method
2ad0: 49 6d 70 6c 28 4d 65 74 68 6f 64 49 6d 70 6c 4f  Impl(MethodImplO
2ae0: 70 74 69 6f 6e 73 2e 4e 6f 49 6e 6c 69 6e 69 6e  ptions.NoInlinin
2af0: 67 29 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  g)]..           
2b00: 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20 73   public static s
2b10: 74 72 69 6e 67 20 54 72 61 63 65 28 0d 0a 20 20  tring Trace(..  
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72                Tr
2b30: 61 63 65 50 72 69 6f 72 69 74 79 20 74 72 61 63  acePriority trac
2b40: 65 50 72 69 6f 72 69 74 79 2c 0d 0a 20 20 20 20  ePriority,..    
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63              Trac
2b60: 65 43 61 6c 6c 62 61 63 6b 20 74 72 61 63 65 43  eCallback traceC
2b70: 61 6c 6c 62 61 63 6b 2c 0d 0a 20 20 20 20 20 20  allback,..      
2b80: 20 20 20 20 20 20 20 20 20 20 45 78 63 65 70 74            Except
2b90: 69 6f 6e 20 65 78 63 65 70 74 69 6f 6e 2c 0d 0a  ion exception,..
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb0: 73 74 72 69 6e 67 20 63 61 74 65 67 6f 72 79 0d  string category.
2bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bd0: 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   )..            
2be0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2bf0: 20 20 20 69 66 20 28 65 78 63 65 70 74 69 6f 6e     if (exception
2c00: 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   != null)..     
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
2c20: 65 74 75 72 6e 20 54 72 61 63 65 28 74 72 61 63  eturn Trace(trac
2c30: 65 50 72 69 6f 72 69 74 79 2c 20 74 72 61 63 65  ePriority, trace
2c40: 43 61 6c 6c 62 61 63 6b 2c 0d 0a 20 20 20 20 20  Callback,..     
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c60: 20 20 20 6e 65 77 20 53 74 61 63 6b 54 72 61 63     new StackTrac
2c70: 65 28 65 78 63 65 70 74 69 6f 6e 2c 20 74 72 75  e(exception, tru
2c80: 65 29 2c 20 30 2c 0d 0a 20 20 20 20 20 20 20 20  e), 0,..        
2c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca0: 65 78 63 65 70 74 69 6f 6e 2e 54 6f 53 74 72 69  exception.ToStri
2cb0: 6e 67 28 29 2c 20 63 61 74 65 67 6f 72 79 29 3b  ng(), category);
2cc0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2cd0: 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b      return null;
2ce0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2cf0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
2d00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2d10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2d20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2d30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2d40: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
2d50: 20 20 5b 4d 65 74 68 6f 64 49 6d 70 6c 28 4d 65    [MethodImpl(Me
2d60: 74 68 6f 64 49 6d 70 6c 4f 70 74 69 6f 6e 73 2e  thodImplOptions.
2d70: 4e 6f 49 6e 6c 69 6e 69 6e 67 29 5d 0d 0a 20 20  NoInlining)]..  
2d80: 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
2d90: 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 54   static string T
2da0: 72 61 63 65 28 0d 0a 20 20 20 20 20 20 20 20 20  race(..         
2db0: 20 20 20 20 20 20 20 54 72 61 63 65 50 72 69 6f         TracePrio
2dc0: 72 69 74 79 20 74 72 61 63 65 50 72 69 6f 72 69  rity tracePriori
2dd0: 74 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ty,..           
2de0: 20 20 20 20 20 54 72 61 63 65 43 61 6c 6c 62 61       TraceCallba
2df0: 63 6b 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b  ck traceCallback
2e00: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
2e10: 20 20 20 73 74 72 69 6e 67 20 6d 65 73 73 61 67     string messag
2e20: 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e,..            
2e30: 20 20 20 20 73 74 72 69 6e 67 20 63 61 74 65 67      string categ
2e40: 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ory..           
2e50: 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20       )..        
2e60: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
2e70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 72         return Tr
2e80: 61 63 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ace(..          
2e90: 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65 50            traceP
2ea0: 72 69 6f 72 69 74 79 2c 20 74 72 61 63 65 43 61  riority, traceCa
2eb0: 6c 6c 62 61 63 6b 2c 20 6e 75 6c 6c 2c 20 31 2c  llback, null, 1,
2ec0: 20 6d 65 73 73 61 67 65 2c 20 63 61 74 65 67 6f   message, catego
2ed0: 72 79 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ry);..          
2ee0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
2ef0: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
2f00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2f10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2f20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2f30: 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
2f40: 20 20 20 20 20 20 5b 4d 65 74 68 6f 64 49 6d 70        [MethodImp
2f50: 6c 28 4d 65 74 68 6f 64 49 6d 70 6c 4f 70 74 69  l(MethodImplOpti
2f60: 6f 6e 73 2e 4e 6f 49 6e 6c 69 6e 69 6e 67 29 5d  ons.NoInlining)]
2f70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ..            pr
2f80: 69 76 61 74 65 20 73 74 61 74 69 63 20 73 74 72  ivate static str
2f90: 69 6e 67 20 54 72 61 63 65 28 0d 0a 20 20 20 20  ing Trace(..    
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63              Trac
2fb0: 65 50 72 69 6f 72 69 74 79 20 74 72 61 63 65 50  ePriority traceP
2fc0: 72 69 6f 72 69 74 79 2c 0d 0a 20 20 20 20 20 20  riority,..      
2fd0: 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65 43            TraceC
2fe0: 61 6c 6c 62 61 63 6b 20 74 72 61 63 65 43 61 6c  allback traceCal
2ff0: 6c 62 61 63 6b 2c 0d 0a 20 20 20 20 20 20 20 20  lback,..        
3000: 20 20 20 20 20 20 20 20 53 74 61 63 6b 54 72 61          StackTra
3010: 63 65 20 73 74 61 63 6b 54 72 61 63 65 2c 0d 0a  ce stackTrace,..
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3030: 69 6e 74 20 6c 65 76 65 6c 2c 0d 0a 20 20 20 20  int level,..    
3040: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
3050: 6e 67 20 6d 65 73 73 61 67 65 2c 0d 0a 20 20 20  ng message,..   
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
3070: 69 6e 67 20 63 61 74 65 67 6f 72 79 0d 0a 20 20  ing category..  
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0d                ).
3090: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b0: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
30c0: 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 49 66 20      // NOTE: If 
30d0: 74 68 65 20 70 72 69 6f 72 69 74 79 20 6f 66 20  the priority of 
30e0: 74 68 69 73 20 6d 65 73 73 61 67 65 20 69 73 20  this message is 
30f0: 6c 65 73 73 20 74 68 61 6e 20 77 68 61 74 0d 0a  less than what..
3100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3110: 2f 2f 20 20 20 20 20 20 20 77 65 20 63 75 72 72  //       we curr
3120: 65 6e 74 6c 79 20 63 61 72 65 20 61 62 6f 75 74  ently care about
3130: 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 6e 6f  , just return no
3140: 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  w...            
3150: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
3160: 20 20 20 20 20 20 20 20 69 66 20 28 74 72 61 63          if (trac
3170: 65 50 72 69 6f 72 69 74 79 20 3c 20 54 72 61 63  ePriority < Trac
3180: 65 50 72 69 6f 72 69 74 79 29 0d 0a 20 20 20 20  ePriority)..    
3190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a0: 72 65 74 75 72 6e 20 6d 65 73 73 61 67 65 3b 0d  return message;.
31b0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
31c0: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
31d0: 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20         // NOTE: 
31e0: 41 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69 73  Always skip this
31f0: 20 63 61 6c 6c 20 66 72 61 6d 65 20 69 66 20 74   call frame if t
3200: 68 65 20 73 74 61 63 6b 20 74 72 61 63 65 20 69  he stack trace i
3210: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s..             
3220: 20 20 20 2f 2f 20 20 20 20 20 20 20 67 6f 69 6e     //       goin
3230: 67 20 74 6f 20 62 65 20 63 61 70 74 75 72 65 64  g to be captured
3240: 20 62 79 20 47 65 74 4d 65 74 68 6f 64 4e 61 6d   by GetMethodNam
3250: 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e...            
3260: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
3270: 20 20 20 20 20 20 20 20 69 66 20 28 73 74 61 63          if (stac
3280: 6b 54 72 61 63 65 20 3d 3d 20 6e 75 6c 6c 29 0d  kTrace == null).
3290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32a0: 20 20 20 20 20 6c 65 76 65 6c 2b 2b 3b 0d 0a 0d       level++;...
32b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32c0: 20 69 66 20 28 74 72 61 63 65 43 61 6c 6c 62 61   if (traceCallba
32d0: 63 6b 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  ck == null)..   
32e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f0: 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 20 3d   traceCallback =
3300: 20 54 72 61 63 65 43 6f 72 65 3b 0d 0a 0d 0a 20   TraceCore;.... 
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
3320: 72 61 63 65 43 61 6c 6c 62 61 63 6b 28 53 74 72  raceCallback(Str
3330: 69 6e 67 2e 46 6f 72 6d 61 74 28 22 7b 30 7d 3a  ing.Format("{0}:
3340: 20 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20   {1}",..        
3350: 20 20 20 20 20 20 20 20 20 20 20 20 47 65 74 4d              GetM
3360: 65 74 68 6f 64 4e 61 6d 65 28 73 74 61 63 6b 54  ethodName(stackT
3370: 72 61 63 65 2c 20 6c 65 76 65 6c 29 2c 20 6d 65  race, level), me
3380: 73 73 61 67 65 29 2c 20 63 61 74 65 67 6f 72 79  ssage), category
3390: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
33a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 65 73        return mes
33b0: 73 61 67 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  sage;..         
33c0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
33d0: 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 20 20    #endregion..  
33e0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
33f0: 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20   #endregion.... 
3400: 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
3410: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3420: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3430: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3440: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
3450: 0d 0a 20 20 20 20 20 20 20 20 23 72 65 67 69 6f  ..        #regio
3460: 6e 20 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65  n MockRegistryKe
3470: 79 20 43 6c 61 73 73 0d 0a 20 20 20 20 20 20 20  y Class..       
3480: 20 70 72 69 76 61 74 65 20 73 65 61 6c 65 64 20   private sealed 
3490: 63 6c 61 73 73 20 4d 6f 63 6b 52 65 67 69 73 74  class MockRegist
34a0: 72 79 4b 65 79 20 3a 20 49 44 69 73 70 6f 73 61  ryKey : IDisposa
34b0: 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  ble..        {..
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 23 72 65 67              #reg
34d0: 69 6f 6e 20 50 72 69 76 61 74 65 20 43 6f 6e 73  ion Private Cons
34e0: 74 72 75 63 74 6f 72 73 0d 0a 20 20 20 20 20 20  tructors..      
34f0: 20 20 20 20 20 20 70 72 69 76 61 74 65 20 4d 6f        private Mo
3500: 63 6b 52 65 67 69 73 74 72 79 4b 65 79 28 29 0d  ckRegistryKey().
3510: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3530: 77 68 61 74 49 66 20 3d 20 74 72 75 65 3b 0d 0a  whatIf = true;..
3540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3550: 72 65 61 64 4f 6e 6c 79 20 3d 20 74 72 75 65 3b  readOnly = true;
3560: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3570: 20 20 73 61 66 65 20 3d 20 74 72 75 65 3b 0d 0a    safe = true;..
3580: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
3590: 20 20 20 20 20 20 20 20 20 20 20 23 65 6e 64 72             #endr
35a0: 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  egion....       
35b0: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
35c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
35d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
35e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
35f0: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
3600: 20 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20          #region 
3610: 50 75 62 6c 69 63 20 43 6f 6e 73 74 72 75 63 74  Public Construct
3620: 6f 72 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ors..           
3630: 20 70 75 62 6c 69 63 20 4d 6f 63 6b 52 65 67 69   public MockRegi
3640: 73 74 72 79 4b 65 79 28 0d 0a 20 20 20 20 20 20  stryKey(..      
3650: 20 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74            Regist
3660: 72 79 4b 65 79 20 6b 65 79 0d 0a 20 20 20 20 20  ryKey key..     
3670: 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20             )..  
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20                : 
3690: 74 68 69 73 28 29 0d 0a 20 20 20 20 20 20 20 20  this()..        
36a0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
36b0: 20 20 20 20 20 20 20 74 68 69 73 2e 6b 65 79 20         this.key 
36c0: 3d 20 6b 65 79 3b 0d 0a 20 20 20 20 20 20 20 20  = key;..        
36d0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
36e0: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
36f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3700: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3710: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3720: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
3730: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 4d          public M
3740: 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 28 0d  ockRegistryKey(.
3750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3760: 20 52 65 67 69 73 74 72 79 4b 65 79 20 6b 65 79   RegistryKey key
3770: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
3780: 20 20 20 73 74 72 69 6e 67 20 73 75 62 4b 65 79     string subKey
3790: 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
37a0: 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20        )..       
37b0: 20 20 20 20 20 20 20 20 20 3a 20 74 68 69 73 28           : this(
37c0: 6b 65 79 29 0d 0a 20 20 20 20 20 20 20 20 20 20  key)..          
37d0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
37e0: 20 20 20 20 20 74 68 69 73 2e 73 75 62 4b 65 79       this.subKey
37f0: 4e 61 6d 65 20 3d 20 73 75 62 4b 65 79 4e 61 6d  Name = subKeyNam
3800: 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
3810: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
3820: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
3830: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3840: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3850: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3860: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
3870: 20 20 20 20 70 75 62 6c 69 63 20 4d 6f 63 6b 52      public MockR
3880: 65 67 69 73 74 72 79 4b 65 79 28 0d 0a 20 20 20  egistryKey(..   
3890: 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 67               Reg
38a0: 69 73 74 72 79 4b 65 79 20 6b 65 79 2c 0d 0a 20  istryKey key,.. 
38b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
38c0: 74 72 69 6e 67 20 73 75 62 4b 65 79 4e 61 6d 65  tring subKeyName
38d0: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
38e0: 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 0d 0a     bool whatIf..
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3900: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
3910: 20 20 20 3a 20 74 68 69 73 28 6b 65 79 2c 20 73     : this(key, s
3920: 75 62 4b 65 79 4e 61 6d 65 29 0d 0a 20 20 20 20  ubKeyName)..    
3930: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
3940: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
3950: 77 68 61 74 49 66 20 3d 20 77 68 61 74 49 66 3b  whatIf = whatIf;
3960: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
3970: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
3980: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3990: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
39a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
39b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
39c0: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
39d0: 20 20 70 75 62 6c 69 63 20 4d 6f 63 6b 52 65 67    public MockReg
39e0: 69 73 74 72 79 4b 65 79 28 0d 0a 20 20 20 20 20  istryKey(..     
39f0: 20 20 20 20 20 20 20 20 20 20 20 52 65 67 69 73             Regis
3a00: 74 72 79 4b 65 79 20 6b 65 79 2c 0d 0a 20 20 20  tryKey key,..   
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
3a20: 69 6e 67 20 73 75 62 4b 65 79 4e 61 6d 65 2c 0d  ing subKeyName,.
3a30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3a40: 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20   bool whatIf,.. 
3a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
3a60: 6f 6f 6c 20 72 65 61 64 4f 6e 6c 79 0d 0a 20 20  ool readOnly..  
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0d                ).
3a80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3a90: 20 3a 20 74 68 69 73 28 6b 65 79 2c 20 73 75 62   : this(key, sub
3aa0: 4b 65 79 4e 61 6d 65 2c 20 77 68 61 74 49 66 29  KeyName, whatIf)
3ab0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
3ac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3ad0: 20 74 68 69 73 2e 72 65 61 64 4f 6e 6c 79 20 3d   this.readOnly =
3ae0: 20 72 65 61 64 4f 6e 6c 79 3b 0d 0a 20 20 20 20   readOnly;..    
3af0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
3b00: 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
3b10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3b20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3b30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3b40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
3b60: 69 63 20 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b  ic MockRegistryK
3b70: 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ey(..           
3b80: 20 20 20 20 20 52 65 67 69 73 74 72 79 4b 65 79       RegistryKey
3b90: 20 6b 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20   key,..         
3ba0: 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 73 75         string su
3bb0: 62 4b 65 79 4e 61 6d 65 2c 0d 0a 20 20 20 20 20  bKeyName,..     
3bc0: 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20             bool 
3bd0: 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20  whatIf,..       
3be0: 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 72 65           bool re
3bf0: 61 64 4f 6e 6c 79 2c 0d 0a 20 20 20 20 20 20 20  adOnly,..       
3c00: 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 73 61           bool sa
3c10: 66 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  fe..            
3c20: 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20      )..         
3c30: 20 20 20 20 20 20 20 3a 20 74 68 69 73 28 6b 65         : this(ke
3c40: 79 2c 20 73 75 62 4b 65 79 4e 61 6d 65 2c 20 77  y, subKeyName, w
3c50: 68 61 74 49 66 2c 20 72 65 61 64 4f 6e 6c 79 29  hatIf, readOnly)
3c60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
3c70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3c80: 20 74 68 69 73 2e 73 61 66 65 20 3d 20 73 61 66   this.safe = saf
3c90: 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
3ca0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
3cb0: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
3cc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3cd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3ce0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3cf0: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
3d00: 20 20 20 20 70 75 62 6c 69 63 20 4d 6f 63 6b 52      public MockR
3d10: 65 67 69 73 74 72 79 4b 65 79 28 0d 0a 20 20 20  egistryKey(..   
3d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 67               Reg
3d30: 69 73 74 72 79 4b 65 79 20 6b 65 79 2c 0d 0a 20  istryKey key,.. 
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
3d50: 6f 6f 6c 20 77 68 61 74 49 66 0d 0a 20 20 20 20  ool whatIf..    
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20              ).. 
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a                 :
3d80: 20 74 68 69 73 28 6b 65 79 2c 20 6e 75 6c 6c 2c   this(key, null,
3d90: 20 77 68 61 74 49 66 29 0d 0a 20 20 20 20 20 20   whatIf)..      
3da0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
3db0: 20 20 20 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e           // do n
3dc0: 6f 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20  othing...       
3dd0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
3de0: 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
3df0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3e00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3e10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3e20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
3e30: 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20           public 
3e40: 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 28  MockRegistryKey(
3e50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3e60: 20 20 52 65 67 69 73 74 72 79 4b 65 79 20 6b 65    RegistryKey ke
3e70: 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y,..            
3e80: 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c      bool whatIf,
3e90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3ea0: 20 20 62 6f 6f 6c 20 72 65 61 64 4f 6e 6c 79 0d    bool readOnly.
3eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3ec0: 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   )..            
3ed0: 20 20 20 20 3a 20 74 68 69 73 28 6b 65 79 2c 20      : this(key, 
3ee0: 6e 75 6c 6c 2c 20 77 68 61 74 49 66 2c 20 72 65  null, whatIf, re
3ef0: 61 64 4f 6e 6c 79 29 0d 0a 20 20 20 20 20 20 20  adOnly)..       
3f00: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
3f10: 20 20 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f          // do no
3f20: 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  thing...        
3f30: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
3f40: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
3f50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3f60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3f70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3f80: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
3f90: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 4d          public M
3fa0: 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 28 0d  ockRegistryKey(.
3fb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3fc0: 20 52 65 67 69 73 74 72 79 4b 65 79 20 6b 65 79   RegistryKey key
3fd0: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
3fe0: 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d     bool whatIf,.
3ff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4000: 20 62 6f 6f 6c 20 72 65 61 64 4f 6e 6c 79 2c 0d   bool readOnly,.
4010: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4020: 20 62 6f 6f 6c 20 73 61 66 65 0d 0a 20 20 20 20   bool safe..    
4030: 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20              ).. 
4040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a                 :
4050: 20 74 68 69 73 28 6b 65 79 2c 20 6e 75 6c 6c 2c   this(key, null,
4060: 20 77 68 61 74 49 66 2c 20 72 65 61 64 4f 6e 6c   whatIf, readOnl
4070: 79 2c 20 73 61 66 65 29 0d 0a 20 20 20 20 20 20  y, safe)..      
4080: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
4090: 20 20 20 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e           // do n
40a0: 6f 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20  othing...       
40b0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
40c0: 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a      #endregion..
40d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
40e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
40f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4100: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4110: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4120: 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  /....           
4130: 20 23 72 65 67 69 6f 6e 20 50 75 62 6c 69 63 20   #region Public 
4140: 4d 65 74 68 6f 64 73 0d 0a 20 20 20 20 20 20 20  Methods..       
4150: 20 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64       public void
4160: 20 43 6c 6f 73 65 28 29 0d 0a 20 20 20 20 20 20   Close()..      
4170: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
4180: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
4190: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
41a0: 4e 4f 54 45 3a 20 4e 6f 20 64 69 73 70 6f 73 65  NOTE: No dispose
41b0: 64 20 63 68 65 63 6b 20 68 65 72 65 20 62 65 63  d check here bec
41c0: 61 75 73 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  ause calling thi
41d0: 73 20 6d 65 74 68 6f 64 0d 0a 20 20 20 20 20 20  s method..      
41e0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
41f0: 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6a 75 73     should be jus
4200: 74 20 6c 69 6b 65 20 63 61 6c 6c 69 6e 67 20 44  t like calling D
4210: 69 73 70 6f 73 65 2e 0d 0a 20 20 20 20 20 20 20  ispose...       
4220: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
4230: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 69 73               Dis
4240: 70 6f 73 65 28 74 72 75 65 29 3b 0d 0a 20 20 20  pose(true);..   
4250: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
4260: 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
4270: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4280: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4290: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
42a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
42b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62  .            pub
42c0: 6c 69 63 20 4d 6f 63 6b 52 65 67 69 73 74 72 79  lic MockRegistry
42d0: 4b 65 79 20 43 72 65 61 74 65 53 75 62 4b 65 79  Key CreateSubKey
42e0: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
42f0: 20 20 20 73 74 72 69 6e 67 20 73 75 62 4b 65 79     string subKey
4300: 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
4310: 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20        )..       
4320: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
4330: 20 20 20 20 20 20 20 20 43 68 65 63 6b 44 69 73          CheckDis
4340: 70 6f 73 65 64 28 29 3b 0d 0a 20 20 20 20 20 20  posed();..      
4350: 20 20 20 20 20 20 20 20 20 20 43 68 65 63 6b 52            CheckR
4360: 65 61 64 4f 6e 6c 79 28 29 3b 0d 0a 0d 0a 20 20  eadOnly();....  
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
4380: 20 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a   (key == null)..
4390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43a0: 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b      return null;
43b0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
43c0: 20 20 20 20 69 66 20 28 77 68 61 74 49 66 29 0d      if (whatIf).
43d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
43e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
43f0: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4410: 2f 2f 20 48 41 43 4b 3a 20 41 74 74 65 6d 70 74  // HACK: Attempt
4420: 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 73 70 65   to open the spe
4430: 63 69 66 69 65 64 20 73 75 62 2d 6b 65 79 2e 20  cified sub-key. 
4440: 20 49 66 20 74 68 69 73 0d 0a 20 20 20 20 20 20   If this..      
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
4460: 20 20 20 20 20 20 20 66 61 69 6c 73 2c 20 77 65         fails, we
4470: 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 72 65 74   will simply ret
4480: 75 72 6e 20 74 68 65 20 77 72 61 70 70 65 64 20  urn the wrapped 
4490: 72 6f 6f 74 20 6b 65 79 0d 0a 20 20 20 20 20 20  root key..      
44a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
44b0: 20 20 20 20 20 20 20 69 74 73 65 6c 66 20 73 69         itself si
44c0: 6e 63 65 20 6e 6f 20 77 72 69 74 65 73 20 61 72  nce no writes ar
44d0: 65 20 61 6c 6c 6f 77 65 64 20 69 6e 20 27 77 68  e allowed in 'wh
44e0: 61 74 2d 69 66 27 0d 0a 20 20 20 20 20 20 20 20  at-if'..        
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
4500: 20 20 20 20 20 6d 6f 64 65 20 61 6e 79 68 6f 77       mode anyhow
4510: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
4520: 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52                 R
4540: 65 67 69 73 74 72 79 4b 65 79 20 73 75 62 4b 65  egistryKey subKe
4550: 79 20 3d 20 6b 65 79 2e 4f 70 65 6e 53 75 62 4b  y = key.OpenSubK
4560: 65 79 28 73 75 62 4b 65 79 4e 61 6d 65 29 3b 0d  ey(subKeyName);.
4570: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
4580: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 73         return (s
4590: 75 62 4b 65 79 20 21 3d 20 6e 75 6c 6c 29 20 3f  ubKey != null) ?
45a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
45b0: 20 20 20 20 20 20 20 20 20 20 6e 65 77 20 4d 6f            new Mo
45c0: 63 6b 52 65 67 69 73 74 72 79 4b 65 79 28 0d 0a  ckRegistryKey(..
45d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45f0: 73 75 62 4b 65 79 2c 20 77 68 61 74 49 66 2c 20  subKey, whatIf, 
4600: 72 65 61 64 4f 6e 6c 79 2c 20 73 61 66 65 29 20  readOnly, safe) 
4610: 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  :..             
4620: 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 20 4d             new M
4630: 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 28 0d  ockRegistryKey(.
4640: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4660: 20 6b 65 79 2c 20 73 75 62 4b 65 79 4e 61 6d 65   key, subKeyName
4670: 2c 20 77 68 61 74 49 66 2c 20 72 65 61 64 4f 6e  , whatIf, readOn
4680: 6c 79 2c 20 73 61 66 65 29 3b 0d 0a 20 20 20 20  ly, safe);..    
4690: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
46a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
46b0: 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  lse..           
46c0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
46d0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
46e0: 72 6e 20 6e 65 77 20 4d 6f 63 6b 52 65 67 69 73  rn new MockRegis
46f0: 74 72 79 4b 65 79 28 0d 0a 20 20 20 20 20 20 20  tryKey(..       
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4710: 20 6b 65 79 2e 43 72 65 61 74 65 53 75 62 4b 65   key.CreateSubKe
4720: 79 28 73 75 62 4b 65 79 4e 61 6d 65 29 2c 20 77  y(subKeyName), w
4730: 68 61 74 49 66 2c 20 72 65 61 64 4f 6e 6c 79 2c  hatIf, readOnly,
4740: 20 73 61 66 65 29 3b 0d 0a 20 20 20 20 20 20 20   safe);..       
4750: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
4760: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
4770: 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
4780: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4790: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
47a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
47b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
47d0: 69 63 20 76 6f 69 64 20 44 65 6c 65 74 65 53 75  ic void DeleteSu
47e0: 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20  bKey(..         
47f0: 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 73 75         string su
4800: 62 4b 65 79 4e 61 6d 65 0d 0a 20 20 20 20 20 20  bKeyName..      
4810: 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20            )..   
4820: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
4830: 20 20 20 20 20 20 20 20 20 20 20 20 43 68 65 63              Chec
4840: 6b 44 69 73 70 6f 73 65 64 28 29 3b 0d 0a 20 20  kDisposed();..  
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 68                Ch
4860: 65 63 6b 52 65 61 64 4f 6e 6c 79 28 29 3b 0d 0a  eckReadOnly();..
4870: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4880: 20 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e 75 6c    if (key == nul
4890: 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
48a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0d          return;.
48b0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
48c0: 20 20 20 69 66 20 28 21 77 68 61 74 49 66 29 0d     if (!whatIf).
48d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
48e0: 20 20 20 20 20 6b 65 79 2e 44 65 6c 65 74 65 53       key.DeleteS
48f0: 75 62 4b 65 79 28 73 75 62 4b 65 79 4e 61 6d 65  ubKey(subKeyName
4900: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
4910: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
4920: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
4930: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4940: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4950: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4960: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
4970: 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20      public void 
4980: 44 65 6c 65 74 65 53 75 62 4b 65 79 54 72 65 65  DeleteSubKeyTree
4990: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
49a0: 20 20 20 73 74 72 69 6e 67 20 73 75 62 4b 65 79     string subKey
49b0: 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
49c0: 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20        )..       
49d0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
49e0: 20 20 20 20 20 20 20 20 43 68 65 63 6b 44 69 73          CheckDis
49f0: 70 6f 73 65 64 28 29 3b 0d 0a 20 20 20 20 20 20  posed();..      
4a00: 20 20 20 20 20 20 20 20 20 20 43 68 65 63 6b 52            CheckR
4a10: 65 61 64 4f 6e 6c 79 28 29 3b 0d 0a 0d 0a 20 20  eadOnly();....  
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
4a30: 20 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a   (key == null)..
4a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a50: 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a 0d 0a 20      return;.... 
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
4a70: 66 20 28 21 77 68 61 74 49 66 29 0d 0a 20 20 20  f (!whatIf)..   
4a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a90: 20 6b 65 79 2e 44 65 6c 65 74 65 53 75 62 4b 65   key.DeleteSubKe
4aa0: 79 54 72 65 65 28 73 75 62 4b 65 79 4e 61 6d 65  yTree(subKeyName
4ab0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
4ac0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
4ad0: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
4ae0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4af0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4b00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4b10: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
4b20: 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20      public void 
4b30: 44 65 6c 65 74 65 56 61 6c 75 65 28 0d 0a 20 20  DeleteValue(..  
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
4b50: 72 69 6e 67 20 6e 61 6d 65 0d 0a 20 20 20 20 20  ring name..     
4b60: 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20             )..  
4b70: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 68 65               Che
4b90: 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 0d 0a 20  ckDisposed();.. 
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
4bb0: 68 65 63 6b 52 65 61 64 4f 6e 6c 79 28 29 3b 0d  heckReadOnly();.
4bc0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
4bd0: 20 20 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e 75     if (key == nu
4be0: 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
4bf0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
4c00: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
4c10: 20 20 20 20 69 66 20 28 21 77 68 61 74 49 66 29      if (!whatIf)
4c20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4c30: 20 20 20 20 20 20 6b 65 79 2e 44 65 6c 65 74 65        key.Delete
4c40: 56 61 6c 75 65 28 6e 61 6d 65 29 3b 0d 0a 20 20  Value(name);..  
4c50: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
4c60: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
4c70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4c80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4c90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4ca0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
4cb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ..            pu
4cc0: 62 6c 69 63 20 73 74 72 69 6e 67 5b 5d 20 47 65  blic string[] Ge
4cd0: 74 53 75 62 4b 65 79 4e 61 6d 65 73 28 29 0d 0a  tSubKeyNames()..
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
4d00: 68 65 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 0d  heckDisposed();.
4d10: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
4d20: 20 20 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e 75     if (key == nu
4d30: 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
4d40: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
4d50: 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  null;....       
4d60: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
4d70: 6b 65 79 2e 47 65 74 53 75 62 4b 65 79 4e 61 6d  key.GetSubKeyNam
4d80: 65 73 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  es();..         
4d90: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
4da0: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
4db0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4dc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4dd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4de0: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
4df0: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 6f 62         public ob
4e00: 6a 65 63 74 20 47 65 74 56 61 6c 75 65 28 0d 0a  ject GetValue(..
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e20: 73 74 72 69 6e 67 20 6e 61 6d 65 2c 0d 0a 20 20  string name,..  
4e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62                ob
4e40: 6a 65 63 74 20 64 65 66 61 75 6c 74 56 61 6c 75  ject defaultValu
4e50: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
4e60: 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20     )..          
4e70: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
4e80: 20 20 20 20 20 43 68 65 63 6b 44 69 73 70 6f 73       CheckDispos
4e90: 65 64 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ed();....       
4ea0: 20 20 20 20 20 20 20 20 20 69 66 20 28 6b 65 79           if (key
4eb0: 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
4ed0: 65 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20  eturn null;.... 
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
4ef0: 65 74 75 72 6e 20 6b 65 79 2e 47 65 74 56 61 6c  eturn key.GetVal
4f00: 75 65 28 6e 61 6d 65 2c 20 64 65 66 61 75 6c 74  ue(name, default
4f10: 56 61 6c 75 65 29 3b 0d 0a 20 20 20 20 20 20 20  Value);..       
4f20: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
4f30: 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
4f40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4f50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4f60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4f70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
4f80: 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20           public 
4f90: 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20  MockRegistryKey 
4fa0: 4f 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20 20  OpenSubKey(..   
4fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
4fc0: 69 6e 67 20 73 75 62 4b 65 79 4e 61 6d 65 0d 0a  ing subKeyName..
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fe0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
4ff0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5000: 20 20 43 68 65 63 6b 44 69 73 70 6f 73 65 64 28    CheckDisposed(
5010: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
5020: 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f 70 65        return Ope
5030: 6e 53 75 62 4b 65 79 28 73 75 62 4b 65 79 4e 61  nSubKey(subKeyNa
5040: 6d 65 2c 20 66 61 6c 73 65 29 3b 0d 0a 20 20 20  me, false);..   
5050: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
5060: 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
5070: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5080: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5090: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
50a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
50b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62  .            pub
50c0: 6c 69 63 20 4d 6f 63 6b 52 65 67 69 73 74 72 79  lic MockRegistry
50d0: 4b 65 79 20 4f 70 65 6e 53 75 62 4b 65 79 28 0d  Key OpenSubKey(.
50e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
50f0: 20 73 74 72 69 6e 67 20 73 75 62 4b 65 79 4e 61   string subKeyNa
5100: 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  me,..           
5110: 20 20 20 20 20 62 6f 6f 6c 20 77 72 69 74 61 62       bool writab
5120: 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  le..            
5130: 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20      )..         
5140: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
5150: 20 20 20 20 20 20 43 68 65 63 6b 44 69 73 70 6f        CheckDispo
5160: 73 65 64 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  sed();....      
5170: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 77 72            if (wr
5180: 69 74 61 62 6c 65 29 0d 0a 20 20 20 20 20 20 20  itable)..       
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 68 65               Che
51a0: 63 6b 52 65 61 64 4f 6e 6c 79 28 29 3b 0d 0a 0d  ckReadOnly();...
51b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
51c0: 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c   if (key == null
51d0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
51e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75         return nu
51f0: 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ll;....         
5200: 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79 4b         RegistryK
5210: 65 79 20 73 75 62 4b 65 79 20 3d 20 6b 65 79 2e  ey subKey = key.
5220: 4f 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20 20  OpenSubKey(..   
5230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5240: 20 73 75 62 4b 65 79 4e 61 6d 65 2c 20 77 68 61   subKeyName, wha
5250: 74 49 66 20 3f 20 66 61 6c 73 65 20 3a 20 77 72  tIf ? false : wr
5260: 69 74 61 62 6c 65 29 3b 0d 0a 0d 0a 20 20 20 20  itable);....    
5270: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
5280: 72 6e 20 28 73 75 62 4b 65 79 20 21 3d 20 6e 75  rn (subKey != nu
5290: 6c 6c 29 20 3f 0d 0a 20 20 20 20 20 20 20 20 20  ll) ?..         
52a0: 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 20 4d             new M
52b0: 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 28 73  ockRegistryKey(s
52c0: 75 62 4b 65 79 2c 20 77 68 61 74 49 66 2c 20 72  ubKey, whatIf, r
52d0: 65 61 64 4f 6e 6c 79 2c 20 73 61 66 65 29 20 3a  eadOnly, safe) :
52e0: 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20   null;..        
52f0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
5300: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
5310: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5320: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5330: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5340: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
5350: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 76          public v
5360: 6f 69 64 20 53 65 74 56 61 6c 75 65 28 0d 0a 20  oid SetValue(.. 
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
5380: 74 72 69 6e 67 20 6e 61 6d 65 2c 0d 0a 20 20 20  tring name,..   
5390: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a               obj
53a0: 65 63 74 20 76 61 6c 75 65 0d 0a 20 20 20 20 20  ect value..     
53b0: 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20             )..  
53c0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 68 65               Che
53e0: 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 0d 0a 20  ckDisposed();.. 
53f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
5400: 68 65 63 6b 52 65 61 64 4f 6e 6c 79 28 29 3b 0d  heckReadOnly();.
5410: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
5420: 20 20 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e 75     if (key == nu
5430: 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
5440: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
5450: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
5460: 20 20 20 20 69 66 20 28 21 77 68 61 74 49 66 29      if (!whatIf)
5470: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5480: 20 20 20 20 20 20 6b 65 79 2e 53 65 74 56 61 6c        key.SetVal
5490: 75 65 28 6e 61 6d 65 2c 20 76 61 6c 75 65 29 3b  ue(name, value);
54a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
54b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 65 6e  .            #en
54c0: 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20  dregion....     
54d0: 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
54e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
54f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5500: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5510: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
5520: 20 20 20 20 20 20 20 20 20 20 23 72 65 67 69 6f            #regio
5530: 6e 20 50 75 62 6c 69 63 20 50 72 6f 70 65 72 74  n Public Propert
5540: 69 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ies..           
5550: 20 70 75 62 6c 69 63 20 73 74 72 69 6e 67 20 4e   public string N
5560: 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
5570: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
5580: 20 20 20 20 67 65 74 0d 0a 20 20 20 20 20 20 20      get..       
5590: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55b0: 43 68 65 63 6b 44 69 73 70 6f 73 65 64 28 29 3b  CheckDisposed();
55c0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
55d0: 20 20 20 20 20 20 20 20 69 66 20 28 6b 65 79 20          if (key 
55e0: 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
55f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5600: 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a    return null;..
5610: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5620: 20 20 20 20 20 20 72 65 74 75 72 6e 20 21 53 74        return !St
5630: 72 69 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70  ring.IsNullOrEmp
5640: 74 79 28 73 75 62 4b 65 79 4e 61 6d 65 29 20 3f  ty(subKeyName) ?
5650: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5660: 20 20 20 20 20 20 20 20 20 20 53 74 72 69 6e 67            String
5670: 2e 46 6f 72 6d 61 74 28 22 7b 30 7d 5c 5c 7b 31  .Format("{0}\\{1
5680: 7d 22 2c 20 6b 65 79 2e 4e 61 6d 65 2c 20 73 75  }", key.Name, su
5690: 62 4b 65 79 4e 61 6d 65 29 20 3a 0d 0a 20 20 20  bKeyName) :..   
56a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56b0: 20 20 20 20 20 6b 65 79 2e 4e 61 6d 65 3b 0d 0a       key.Name;..
56c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56d0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
56e0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
56f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5700: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5710: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5720: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5730: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
5740: 20 20 20 70 72 69 76 61 74 65 20 52 65 67 69 73     private Regis
5750: 74 72 79 4b 65 79 20 6b 65 79 3b 0d 0a 20 20 20  tryKey key;..   
5760: 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20           public 
5770: 52 65 67 69 73 74 72 79 4b 65 79 20 4b 65 79 0d  RegistryKey Key.
5780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
5790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57a0: 67 65 74 20 7b 20 43 68 65 63 6b 44 69 73 70 6f  get { CheckDispo
57b0: 73 65 64 28 29 3b 20 43 68 65 63 6b 53 61 66 65  sed(); CheckSafe
57c0: 28 29 3b 20 72 65 74 75 72 6e 20 6b 65 79 3b 20  (); return key; 
57d0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
57e0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
57f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5800: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5810: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5820: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5830: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
5840: 20 20 20 70 72 69 76 61 74 65 20 73 74 72 69 6e     private strin
5850: 67 20 73 75 62 4b 65 79 4e 61 6d 65 3b 0d 0a 20  g subKeyName;.. 
5860: 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
5870: 63 20 73 74 72 69 6e 67 20 53 75 62 4b 65 79 4e  c string SubKeyN
5880: 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
5890: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
58a0: 20 20 20 20 67 65 74 20 7b 20 43 68 65 63 6b 44      get { CheckD
58b0: 69 73 70 6f 73 65 64 28 29 3b 20 72 65 74 75 72  isposed(); retur
58c0: 6e 20 73 75 62 4b 65 79 4e 61 6d 65 3b 20 7d 0d  n subKeyName; }.
58d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
58e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
58f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5900: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5910: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5920: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5930: 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  /....           
5940: 20 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 77 68   private bool wh
5950: 61 74 49 66 3b 0d 0a 20 20 20 20 20 20 20 20 20  atIf;..         
5960: 20 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c 20 57     public bool W
5970: 68 61 74 49 66 0d 0a 20 20 20 20 20 20 20 20 20  hatIf..         
5980: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
5990: 20 20 20 20 20 20 67 65 74 20 7b 20 43 68 65 63        get { Chec
59a0: 6b 44 69 73 70 6f 73 65 64 28 29 3b 20 72 65 74  kDisposed(); ret
59b0: 75 72 6e 20 77 68 61 74 49 66 3b 20 7d 0d 0a 20  urn whatIf; }.. 
59c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f              ////
59e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
59f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5a00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5a10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
5a20: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ...            p
5a30: 72 69 76 61 74 65 20 62 6f 6f 6c 20 72 65 61 64  rivate bool read
5a40: 4f 6e 6c 79 3b 0d 0a 20 20 20 20 20 20 20 20 20  Only;..         
5a50: 20 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c 20 52     public bool R
5a60: 65 61 64 4f 6e 6c 79 0d 0a 20 20 20 20 20 20 20  eadOnly..       
5a70: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
5a80: 20 20 20 20 20 20 20 20 67 65 74 20 7b 20 43 68          get { Ch
5a90: 65 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 20 72  eckDisposed(); r
5aa0: 65 74 75 72 6e 20 72 65 61 64 4f 6e 6c 79 3b 20  eturn readOnly; 
5ab0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
5ac0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
5ad0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5ae0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5af0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5b00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5b10: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
5b20: 20 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c 20 73     public bool s
5b30: 61 66 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  afe;..          
5b40: 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c 20 53 61    public bool Sa
5b50: 66 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  fe..            
5b60: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
5b70: 20 20 20 67 65 74 20 7b 20 43 68 65 63 6b 44 69     get { CheckDi
5b80: 73 70 6f 73 65 64 28 29 3b 20 72 65 74 75 72 6e  sposed(); return
5b90: 20 73 61 66 65 3b 20 7d 0d 0a 20 20 20 20 20 20   safe; }..      
5ba0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
5bb0: 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d       #endregion.
5bc0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
5bd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5be0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5bf0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5c00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5c10: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
5c20: 20 20 23 72 65 67 69 6f 6e 20 50 72 69 76 61 74    #region Privat
5c30: 65 20 4d 65 74 68 6f 64 73 0d 0a 20 20 20 20 20  e Methods..     
5c40: 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 76         private v
5c50: 6f 69 64 20 43 68 65 63 6b 52 65 61 64 4f 6e 6c  oid CheckReadOnl
5c60: 79 28 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y()..           
5c70: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
5c80: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
5c90: 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a          // NOTE:
5ca0: 20 49 6e 20 22 72 65 61 64 2d 6f 6e 6c 79 22 20   In "read-only" 
5cb0: 6d 6f 64 65 2c 20 77 65 20 64 69 73 61 6c 6c 6f  mode, we disallo
5cc0: 77 20 61 6c 6c 20 77 72 69 74 65 20 61 63 63 65  w all write acce
5cd0: 73 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ss...           
5ce0: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
5cf0: 20 20 20 20 20 20 20 20 20 69 66 20 28 21 72 65           if (!re
5d00: 61 64 4f 6e 6c 79 29 0d 0a 20 20 20 20 20 20 20  adOnly)..       
5d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
5d20: 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  urn;....        
5d30: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65          throw ne
5d40: 77 20 49 6e 76 61 6c 69 64 4f 70 65 72 61 74 69  w InvalidOperati
5d50: 6f 6e 45 78 63 65 70 74 69 6f 6e 28 29 3b 0d 0a  onException();..
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
5d70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f  .            ///
5d80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5d90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5da0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5db0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5dc0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
5dd0: 70 72 69 76 61 74 65 20 76 6f 69 64 20 43 68 65  private void Che
5de0: 63 6b 53 61 66 65 28 29 0d 0a 20 20 20 20 20 20  ckSafe()..      
5df0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
5e00: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
5e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
5e20: 4e 4f 54 45 3a 20 49 6e 20 22 73 61 66 65 22 20  NOTE: In "safe" 
5e30: 6d 6f 64 65 2c 20 77 65 20 64 69 73 61 6c 6c 6f  mode, we disallo
5e40: 77 20 61 6c 6c 20 64 69 72 65 63 74 20 61 63 63  w all direct acc
5e50: 65 73 73 20 74 6f 20 74 68 65 0d 0a 20 20 20 20  ess to the..    
5e60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
5e70: 20 20 20 20 20 63 6f 6e 74 61 69 6e 65 64 20 72       contained r
5e80: 65 67 69 73 74 72 79 20 6b 65 79 2e 0d 0a 20 20  egistry key...  
5e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
5ea0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5eb0: 20 20 69 66 20 28 21 73 61 66 65 29 0d 0a 20 20    if (!safe)..  
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ed0: 20 20 72 65 74 75 72 6e 3b 0d 0a 0d 0a 20 20 20    return;....   
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72               thr
5ef0: 6f 77 20 6e 65 77 20 49 6e 76 61 6c 69 64 4f 70  ow new InvalidOp
5f00: 65 72 61 74 69 6f 6e 45 78 63 65 70 74 69 6f 6e  erationException
5f10: 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ();..           
5f20: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
5f30: 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20  #endregion....  
5f40: 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
5f50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5f60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5f70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5f80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
5f90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 72 65  .            #re
5fa0: 67 69 6f 6e 20 53 79 73 74 65 6d 2e 4f 62 6a 65  gion System.Obje
5fb0: 63 74 20 4f 76 65 72 72 69 64 65 73 0d 0a 20 20  ct Overrides..  
5fc0: 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
5fd0: 20 6f 76 65 72 72 69 64 65 20 73 74 72 69 6e 67   override string
5fe0: 20 54 6f 53 74 72 69 6e 67 28 29 0d 0a 20 20 20   ToString()..   
5ff0: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
6000: 20 20 20 20 20 20 20 20 20 20 20 20 43 68 65 63              Chec
6010: 6b 44 69 73 70 6f 73 65 64 28 29 3b 0d 0a 0d 0a  kDisposed();....
6020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6030: 72 65 74 75 72 6e 20 74 68 69 73 2e 4e 61 6d 65  return this.Name
6040: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
6050: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 65  ..            #e
6060: 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20  ndregion....    
6070: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
6080: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6090: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
60a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
60b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
60c0: 20 20 20 20 20 20 20 20 20 20 20 23 72 65 67 69             #regi
60d0: 6f 6e 20 49 6d 70 6c 69 63 69 74 20 43 6f 6e 76  on Implicit Conv
60e0: 65 72 73 69 6f 6e 20 4f 70 65 72 61 74 6f 72 73  ersion Operators
60f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
6100: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
6110: 20 42 55 47 42 55 47 3a 20 54 68 65 20 27 77 68   BUGBUG: The 'wh
6120: 61 74 2d 69 66 27 20 6d 6f 64 65 20 73 65 74 74  at-if' mode sett
6130: 69 6e 67 20 68 65 72 65 20 73 68 6f 75 6c 64 20  ing here should 
6140: 70 72 6f 62 61 62 6c 79 20 62 65 20 62 61 73 65  probably be base
6150: 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  d..            /
6160: 2f 20 20 20 20 20 20 20 20 20 6f 6e 20 73 6f 6d  /         on som
6170: 65 20 73 74 61 74 69 63 20 70 72 6f 70 65 72 74  e static propert
6180: 79 2c 20 6e 6f 74 20 68 61 72 64 2d 63 6f 64 65  y, not hard-code
6190: 64 20 74 6f 20 74 72 75 65 3f 0d 0a 20 20 20 20  d to true?..    
61a0: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
61b0: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 73          public s
61c0: 74 61 74 69 63 20 69 6d 70 6c 69 63 69 74 20 6f  tatic implicit o
61d0: 70 65 72 61 74 6f 72 20 4d 6f 63 6b 52 65 67 69  perator MockRegi
61e0: 73 74 72 79 4b 65 79 28 0d 0a 20 20 20 20 20 20  stryKey(..      
61f0: 20 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74            Regist
6200: 72 79 4b 65 79 20 6b 65 79 0d 0a 20 20 20 20 20  ryKey key..     
6210: 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20             )..  
6220: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
6230: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
6240: 75 72 6e 20 6e 65 77 20 4d 6f 63 6b 52 65 67 69  urn new MockRegi
6250: 73 74 72 79 4b 65 79 28 6b 65 79 2c 20 6e 75 6c  stryKey(key, nul
6260: 6c 2c 20 74 72 75 65 2c 20 66 61 6c 73 65 2c 20  l, true, false, 
6270: 66 61 6c 73 65 29 3b 0d 0a 20 20 20 20 20 20 20  false);..       
6280: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
6290: 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
62a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
62b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
62c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
62d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
62e0: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
62f0: 20 20 20 20 20 20 20 20 20 2f 2f 20 42 55 47 42           // BUGB
6300: 55 47 3a 20 52 65 6d 6f 76 65 20 6d 65 3f 20 20  UG: Remove me?  
6310: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73  This should be s
6320: 61 66 65 20 62 65 63 61 75 73 65 20 69 6e 20 27  afe because in '
6330: 77 68 61 74 2d 69 66 27 0d 0a 20 20 20 20 20 20  what-if'..      
6340: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 20        //        
6350: 20 6d 6f 64 65 20 61 6c 6c 20 6b 65 79 73 20 61   mode all keys a
6360: 72 65 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f  re opened read-o
6370: 6e 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  nly...          
6380: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
6390: 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20    public static 
63a0: 69 6d 70 6c 69 63 69 74 20 6f 70 65 72 61 74 6f  implicit operato
63b0: 72 20 52 65 67 69 73 74 72 79 4b 65 79 28 0d 0a  r RegistryKey(..
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63d0: 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20  MockRegistryKey 
63e0: 6b 65 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20  key..           
63f0: 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20       )..        
6400: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
6410: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 6b         return (k
6420: 65 79 20 21 3d 20 6e 75 6c 6c 29 20 3f 20 6b 65  ey != null) ? ke
6430: 79 2e 4b 65 79 20 3a 20 6e 75 6c 6c 3b 0d 0a 20  y.Key : null;.. 
6440: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
6450: 20 20 20 20 20 20 20 20 20 20 23 65 6e 64 72 65            #endre
6460: 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  gion....        
6470: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
6480: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6490: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
64a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
64b0: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
64c0: 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 49         #region I
64d0: 44 69 73 70 6f 73 61 62 6c 65 20 22 50 61 74 74  Disposable "Patt
64e0: 65 72 6e 22 20 4d 65 6d 62 65 72 73 0d 0a 20 20  ern" Members..  
64f0: 20 20 20 20 20 20 20 20 20 20 70 72 69 76 61 74            privat
6500: 65 20 62 6f 6f 6c 20 64 69 73 70 6f 73 65 64 3b  e bool disposed;
6510: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ..            pr
6520: 69 76 61 74 65 20 76 6f 69 64 20 43 68 65 63 6b  ivate void Check
6530: 44 69 73 70 6f 73 65 64 28 29 20 2f 2a 20 74 68  Disposed() /* th
6540: 72 6f 77 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20  row */..        
6550: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
6560: 20 20 20 20 20 20 20 69 66 20 28 21 64 69 73 70         if (!disp
6570: 6f 73 65 64 29 0d 0a 20 20 20 20 20 20 20 20 20  osed)..         
6580: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
6590: 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  n;....          
65a0: 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20        throw new 
65b0: 4f 62 6a 65 63 74 44 69 73 70 6f 73 65 64 45 78  ObjectDisposedEx
65c0: 63 65 70 74 69 6f 6e 28 74 79 70 65 6f 66 28 4d  ception(typeof(M
65d0: 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 29 2e  ockRegistryKey).
65e0: 4e 61 6d 65 29 3b 0d 0a 20 20 20 20 20 20 20 20  Name);..        
65f0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
6600: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
6610: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6620: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6630: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6640: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
6650: 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
6660: 2f 2a 20 70 72 6f 74 65 63 74 65 64 20 76 69 72  /* protected vir
6670: 74 75 61 6c 20 2a 2f 20 76 6f 69 64 20 44 69 73  tual */ void Dis
6680: 70 6f 73 65 28 0d 0a 20 20 20 20 20 20 20 20 20  pose(..         
6690: 20 20 20 20 20 20 20 62 6f 6f 6c 20 64 69 73 70         bool disp
66a0: 6f 73 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 20  osing..         
66b0: 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20         )..      
66c0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
66d0: 20 20 20 20 20 20 20 20 20 69 66 20 28 21 64 69           if (!di
66e0: 73 70 6f 73 65 64 29 0d 0a 20 20 20 20 20 20 20  sposed)..       
66f0: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
6700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6710: 69 66 20 28 64 69 73 70 6f 73 69 6e 67 29 0d 0a  if (disposing)..
6720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6730: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
6740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6750: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6760: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6770: 2f 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ///..           
6780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
6790: 64 69 73 70 6f 73 65 20 6d 61 6e 61 67 65 64 20  dispose managed 
67a0: 72 65 73 6f 75 72 63 65 73 20 68 65 72 65 2e 2e  resources here..
67b0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
67c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
67d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
67e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
67f0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
6800: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6b             if (k
6810: 65 79 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  ey != null)..   
6820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6830: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
6840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6850: 20 20 20 20 6b 65 79 2e 43 6c 6f 73 65 28 29 3b      key.Close();
6860: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 65                ke
6880: 79 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20  y = null;..     
6890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68a0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
68b0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68d0: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
68e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
68f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 20 20 20 20 20  /////////..     
6900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6910: 2f 20 72 65 6c 65 61 73 65 20 75 6e 6d 61 6e 61  / release unmana
6920: 67 65 64 20 72 65 73 6f 75 72 63 65 73 20 68 65  ged resources he
6930: 72 65 2e 2e 2e 0d 0a 20 20 20 20 20 20 20 20 20  re.....         
6940: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
6950: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6960: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6970: 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  /....           
6980: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
6990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69a0: 20 2f 2f 20 4e 4f 54 45 3a 20 54 68 69 73 20 6f   // NOTE: This o
69b0: 62 6a 65 63 74 20 69 73 20 6e 6f 77 20 64 69 73  bject is now dis
69c0: 70 6f 73 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  posed...        
69d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
69e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69f0: 20 20 20 20 64 69 73 70 6f 73 65 64 20 3d 20 74      disposed = t
6a00: 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  rue;..          
6a10: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
6a20: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
6a30: 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a      #endregion..
6a40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
6a50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6a60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6a70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6a80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6a90: 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  /....           
6aa0: 20 23 72 65 67 69 6f 6e 20 49 44 69 73 70 6f 73   #region IDispos
6ab0: 61 62 6c 65 20 4d 65 6d 62 65 72 73 0d 0a 20 20  able Members..  
6ac0: 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
6ad0: 20 76 6f 69 64 20 44 69 73 70 6f 73 65 28 29 0d   void Dispose().
6ae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
6af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b00: 44 69 73 70 6f 73 65 28 74 72 75 65 29 3b 0d 0a  Dispose(true);..
6b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b20: 47 43 2e 53 75 70 70 72 65 73 73 46 69 6e 61 6c  GC.SuppressFinal
6b30: 69 7a 65 28 74 68 69 73 29 3b 0d 0a 20 20 20 20  ize(this);..    
6b40: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
6b50: 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f         #endregio
6b60: 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n....           
6b70: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
6b80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6b90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6ba0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6bb0: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
6bc0: 20 20 20 20 23 72 65 67 69 6f 6e 20 44 65 73 74      #region Dest
6bd0: 72 75 63 74 6f 72 0d 0a 20 20 20 20 20 20 20 20  ructor..        
6be0: 20 20 20 20 7e 4d 6f 63 6b 52 65 67 69 73 74 72      ~MockRegistr
6bf0: 79 4b 65 79 28 29 0d 0a 20 20 20 20 20 20 20 20  yKey()..        
6c00: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
6c10: 20 20 20 20 20 20 20 44 69 73 70 6f 73 65 28 66         Dispose(f
6c20: 61 6c 73 65 29 3b 0d 0a 20 20 20 20 20 20 20 20  alse);..        
6c30: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
6c40: 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 20     #endregion.. 
6c50: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
6c60: 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a    #endregion....
6c70: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
6c80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6c90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6ca0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6cb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
6cc0: 0a 0d 0a 20 20 20 20 20 20 20 20 23 72 65 67 69  ...        #regi
6cd0: 6f 6e 20 52 65 67 69 73 74 72 79 48 65 6c 70 65  on RegistryHelpe
6ce0: 72 20 43 6c 61 73 73 0d 0a 20 20 20 20 20 20 20  r Class..       
6cf0: 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
6d00: 63 6c 61 73 73 20 52 65 67 69 73 74 72 79 48 65  class RegistryHe
6d10: 6c 70 65 72 0d 0a 20 20 20 20 20 20 20 20 7b 0d  lper..        {.
6d20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 72 65  .            #re
6d30: 67 69 6f 6e 20 50 75 62 6c 69 63 20 53 74 61 74  gion Public Stat
6d40: 69 63 20 50 72 6f 70 65 72 74 69 65 73 0d 0a 20  ic Properties.. 
6d50: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 76 61             priva
6d60: 74 65 20 73 74 61 74 69 63 20 69 6e 74 20 73 75  te static int su
6d70: 62 4b 65 79 73 43 72 65 61 74 65 64 3b 0d 0a 20  bKeysCreated;.. 
6d80: 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
6d90: 63 20 73 74 61 74 69 63 20 69 6e 74 20 53 75 62  c static int Sub
6da0: 4b 65 79 73 43 72 65 61 74 65 64 0d 0a 20 20 20  KeysCreated..   
6db0: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
6dc0: 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 20              get 
6dd0: 7b 20 72 65 74 75 72 6e 20 73 75 62 4b 65 79 73  { return subKeys
6de0: 43 72 65 61 74 65 64 3b 20 7d 0d 0a 20 20 20 20  Created; }..    
6df0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
6e00: 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
6e10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6e20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6e30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6e40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 76              priv
6e60: 61 74 65 20 73 74 61 74 69 63 20 69 6e 74 20 73  ate static int s
6e70: 75 62 4b 65 79 73 44 65 6c 65 74 65 64 3b 0d 0a  ubKeysDeleted;..
6e80: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
6e90: 69 63 20 73 74 61 74 69 63 20 69 6e 74 20 53 75  ic static int Su
6ea0: 62 4b 65 79 73 44 65 6c 65 74 65 64 0d 0a 20 20  bKeysDeleted..  
6eb0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
6ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74               get
6ed0: 20 7b 20 72 65 74 75 72 6e 20 73 75 62 4b 65 79   { return subKey
6ee0: 73 44 65 6c 65 74 65 64 3b 20 7d 0d 0a 20 20 20  sDeleted; }..   
6ef0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
6f00: 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
6f10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6f20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6f30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6f40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
6f50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69  .            pri
6f60: 76 61 74 65 20 73 74 61 74 69 63 20 69 6e 74 20  vate static int 
6f70: 6b 65 79 56 61 6c 75 65 73 53 65 74 3b 0d 0a 20  keyValuesSet;.. 
6f80: 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
6f90: 63 20 73 74 61 74 69 63 20 69 6e 74 20 4b 65 79  c static int Key
6fa0: 56 61 6c 75 65 73 53 65 74 0d 0a 20 20 20 20 20  ValuesSet..     
6fb0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
6fc0: 20 20 20 20 20 20 20 20 20 20 67 65 74 20 7b 20            get { 
6fd0: 72 65 74 75 72 6e 20 6b 65 79 56 61 6c 75 65 73  return keyValues
6fe0: 53 65 74 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20  Set; }..        
6ff0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
7000: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
7010: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7020: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7030: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7040: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
7050: 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
7060: 73 74 61 74 69 63 20 69 6e 74 20 6b 65 79 56 61  static int keyVa
7070: 6c 75 65 73 44 65 6c 65 74 65 64 3b 0d 0a 20 20  luesDeleted;..  
7080: 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
7090: 20 73 74 61 74 69 63 20 69 6e 74 20 4b 65 79 56   static int KeyV
70a0: 61 6c 75 65 73 44 65 6c 65 74 65 64 0d 0a 20 20  aluesDeleted..  
70b0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74               get
70d0: 20 7b 20 72 65 74 75 72 6e 20 6b 65 79 56 61 6c   { return keyVal
70e0: 75 65 73 44 65 6c 65 74 65 64 3b 20 7d 0d 0a 20  uesDeleted; }.. 
70f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
7100: 20 20 20 20 20 20 20 20 20 20 23 65 6e 64 72 65            #endre
7110: 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  gion....        
7120: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
7130: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7140: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7150: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7160: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
7170: 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 50         #region P
7180: 75 62 6c 69 63 20 53 74 61 74 69 63 20 4d 65 74  ublic Static Met
7190: 68 6f 64 73 0d 0a 20 20 20 20 20 20 20 20 20 20  hods..          
71a0: 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20    public static 
71b0: 52 65 67 69 73 74 72 79 4b 65 79 20 47 65 74 52  RegistryKey GetR
71c0: 6f 6f 74 4b 65 79 42 79 4e 61 6d 65 28 0d 0a 20  ootKeyByName(.. 
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
71e0: 74 72 69 6e 67 20 6b 65 79 4e 61 6d 65 0d 0a 20  tring keyName.. 
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
7200: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
7210: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7220: 20 69 66 20 28 53 74 72 69 6e 67 2e 49 73 4e 75   if (String.IsNu
7230: 6c 6c 4f 72 45 6d 70 74 79 28 6b 65 79 4e 61 6d  llOrEmpty(keyNam
7240: 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e))..           
7250: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
7260: 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  null;....       
7270: 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68 20           switch 
7280: 28 6b 65 79 4e 61 6d 65 2e 54 6f 55 70 70 65 72  (keyName.ToUpper
7290: 49 6e 76 61 72 69 61 6e 74 28 29 29 0d 0a 20 20  Invariant())..  
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
72b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
72c0: 20 20 20 20 20 63 61 73 65 20 22 48 4b 43 52 22       case "HKCR"
72d0: 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  :..             
72e0: 20 20 20 20 20 20 20 63 61 73 65 20 22 48 4b 45         case "HKE
72f0: 59 5f 43 4c 41 53 53 45 53 5f 52 4f 4f 54 22 3a  Y_CLASSES_ROOT":
7300: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7310: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
7320: 20 52 65 67 69 73 74 72 79 2e 43 6c 61 73 73 65   Registry.Classe
7330: 73 52 6f 6f 74 3b 0d 0a 20 20 20 20 20 20 20 20  sRoot;..        
7340: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
7350: 20 22 48 4b 43 43 22 3a 0d 0a 20 20 20 20 20 20   "HKCC":..      
7360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
7370: 73 65 20 22 48 4b 45 59 5f 43 55 52 52 45 4e 54  se "HKEY_CURRENT
7380: 5f 43 4f 4e 46 49 47 22 3a 0d 0a 20 20 20 20 20  _CONFIG":..     
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73a0: 20 20 20 72 65 74 75 72 6e 20 52 65 67 69 73 74     return Regist
73b0: 72 79 2e 43 75 72 72 65 6e 74 43 6f 6e 66 69 67  ry.CurrentConfig
73c0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
73d0: 20 20 20 20 20 20 20 63 61 73 65 20 22 48 4b 43         case "HKC
73e0: 55 22 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  U":..           
73f0: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 22 48           case "H
7400: 4b 45 59 5f 43 55 52 52 45 4e 54 5f 55 53 45 52  KEY_CURRENT_USER
7410: 22 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ":..            
7420: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
7430: 72 6e 20 52 65 67 69 73 74 72 79 2e 43 75 72 72  rn Registry.Curr
7440: 65 6e 74 55 73 65 72 3b 0d 0a 20 20 20 20 20 20  entUser;..      
7450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
7460: 73 65 20 22 48 4b 44 44 22 3a 0d 0a 20 20 20 20  se "HKDD":..    
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7480: 63 61 73 65 20 22 48 4b 45 59 5f 44 59 4e 5f 44  case "HKEY_DYN_D
7490: 41 54 41 22 3a 0d 0a 20 20 20 20 20 20 20 20 20  ATA":..         
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
74b0: 65 74 75 72 6e 20 52 65 67 69 73 74 72 79 2e 44  eturn Registry.D
74c0: 79 6e 44 61 74 61 3b 0d 0a 20 20 20 20 20 20 20  ynData;..       
74d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73               cas
74e0: 65 20 22 48 4b 4c 4d 22 3a 0d 0a 20 20 20 20 20  e "HKLM":..     
74f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
7500: 61 73 65 20 22 48 4b 45 59 5f 4c 4f 43 41 4c 5f  ase "HKEY_LOCAL_
7510: 4d 41 43 48 49 4e 45 22 3a 0d 0a 20 20 20 20 20  MACHINE":..     
7520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7530: 20 20 20 72 65 74 75 72 6e 20 52 65 67 69 73 74     return Regist
7540: 72 79 2e 4c 6f 63 61 6c 4d 61 63 68 69 6e 65 3b  ry.LocalMachine;
7550: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7560: 20 20 20 20 20 20 63 61 73 65 20 22 48 4b 50 44        case "HKPD
7570: 22 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ":..            
7580: 20 20 20 20 20 20 20 20 63 61 73 65 20 22 48 4b          case "HK
7590: 45 59 5f 50 45 52 46 4f 52 4d 41 4e 43 45 5f 44  EY_PERFORMANCE_D
75a0: 41 54 41 22 3a 0d 0a 20 20 20 20 20 20 20 20 20  ATA":..         
75b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
75c0: 65 74 75 72 6e 20 52 65 67 69 73 74 72 79 2e 50  eturn Registry.P
75d0: 65 72 66 6f 72 6d 61 6e 63 65 44 61 74 61 3b 0d  erformanceData;.
75e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
75f0: 20 20 20 20 20 63 61 73 65 20 22 48 4b 55 22 3a       case "HKU":
7600: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7610: 20 20 20 20 20 20 63 61 73 65 20 22 48 4b 45 59        case "HKEY
7620: 5f 55 53 45 52 53 22 3a 0d 0a 20 20 20 20 20 20  _USERS":..      
7630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7640: 20 20 72 65 74 75 72 6e 20 52 65 67 69 73 74 72    return Registr
7650: 79 2e 55 73 65 72 73 3b 0d 0a 20 20 20 20 20 20  y.Users;..      
7660: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
7670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
7680: 65 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 20 20 20  eturn null;..   
7690: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
76a0: 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
76b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
76c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
76d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
76e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
76f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62  .            pub
7700: 6c 69 63 20 73 74 61 74 69 63 20 4d 6f 63 6b 52  lic static MockR
7710: 65 67 69 73 74 72 79 4b 65 79 20 4f 70 65 6e 53  egistryKey OpenS
7720: 75 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20  ubKey(..        
7730: 20 20 20 20 20 20 20 20 4d 6f 63 6b 52 65 67 69          MockRegi
7740: 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b 65 79 2c  stryKey rootKey,
7750: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7760: 20 20 73 74 72 69 6e 67 20 73 75 62 4b 65 79 4e    string subKeyN
7770: 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ame,..          
7780: 20 20 20 20 20 20 62 6f 6f 6c 20 77 72 69 74 61        bool writa
7790: 62 6c 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ble,..          
77a0: 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49        bool whatI
77b0: 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  f,..            
77c0: 20 20 20 20 62 6f 6f 6c 20 76 65 72 62 6f 73 65      bool verbose
77d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
77e0: 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20    )..           
77f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
7800: 20 20 20 20 69 66 20 28 72 6f 6f 74 4b 65 79 20      if (rootKey 
7810: 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
7820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
7830: 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20  turn null;....  
7840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
7850: 20 28 76 65 72 62 6f 73 65 29 0d 0a 20 20 20 20   (verbose)..    
7860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7870: 54 72 61 63 65 4f 70 73 2e 54 72 61 63 65 28 0d  TraceOps.Trace(.
7880: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7890: 20 20 20 20 20 20 20 20 20 77 72 69 74 61 62 6c           writabl
78a0: 65 20 3f 20 54 72 61 63 65 50 72 69 6f 72 69 74  e ? TracePriorit
78b0: 79 2e 48 69 67 68 65 73 74 20 3a 20 54 72 61 63  y.Highest : Trac
78c0: 65 50 72 69 6f 72 69 74 79 2e 48 69 67 68 65 72  ePriority.Higher
78d0: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
78e0: 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65             trace
78f0: 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67  Callback, String
7900: 2e 46 6f 72 6d 61 74 28 22 72 6f 6f 74 4b 65 79  .Format("rootKey
7910: 20 3d 20 7b 30 7d 2c 20 22 20 2b 0d 0a 20 20 20   = {0}, " +..   
7920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7930: 20 20 20 20 20 22 73 75 62 4b 65 79 4e 61 6d 65       "subKeyName
7940: 20 3d 20 7b 31 7d 2c 20 77 72 69 74 61 62 6c 65   = {1}, writable
7950: 20 3d 20 7b 32 7d 22 2c 20 46 6f 72 44 69 73 70   = {2}", ForDisp
7960: 6c 61 79 28 72 6f 6f 74 4b 65 79 29 2c 0d 0a 20  lay(rootKey),.. 
7970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7980: 20 20 20 20 20 20 20 46 6f 72 44 69 73 70 6c 61         ForDispla
7990: 79 28 73 75 62 4b 65 79 4e 61 6d 65 29 2c 20 77  y(subKeyName), w
79a0: 72 69 74 61 62 6c 65 29 2c 20 74 72 61 63 65 43  ritable), traceC
79b0: 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20  ategory);....   
79c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d               //.
79d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
79e0: 20 2f 2f 20 48 41 43 4b 3a 20 41 6c 77 61 79 73   // HACK: Always
79f0: 20 66 6f 72 62 69 64 20 77 72 69 74 61 62 6c 65   forbid writable
7a00: 20 61 63 63 65 73 73 20 77 68 65 6e 20 6f 70 65   access when ope
7a10: 72 61 74 69 6e 67 20 69 6e 0d 0a 20 20 20 20 20  rating in..     
7a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
7a30: 20 20 20 20 27 77 68 61 74 2d 69 66 27 20 6d 6f      'what-if' mo
7a40: 64 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  de...           
7a50: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
7a60: 20 20 20 20 20 20 20 20 20 4d 6f 63 6b 52 65 67           MockReg
7a70: 69 73 74 72 79 4b 65 79 20 6b 65 79 20 3d 20 72  istryKey key = r
7a80: 6f 6f 74 4b 65 79 2e 4f 70 65 6e 53 75 62 4b 65  ootKey.OpenSubKe
7a90: 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y(..            
7aa0: 20 20 20 20 20 20 20 20 73 75 62 4b 65 79 4e 61          subKeyNa
7ab0: 6d 65 2c 20 77 68 61 74 49 66 20 3f 20 66 61 6c  me, whatIf ? fal
7ac0: 73 65 20 3a 20 77 72 69 74 61 62 6c 65 29 3b 0d  se : writable);.
7ad0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
7ae0: 20 20 20 72 65 74 75 72 6e 20 28 6b 65 79 20 21     return (key !
7af0: 3d 20 6e 75 6c 6c 29 20 3f 0d 0a 20 20 20 20 20  = null) ?..     
7b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
7b10: 65 77 20 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b  ew MockRegistryK
7b20: 65 79 28 6b 65 79 2c 20 77 68 61 74 49 66 2c 20  ey(key, whatIf, 
7b30: 66 61 6c 73 65 2c 20 66 61 6c 73 65 29 20 3a 20  false, false) : 
7b40: 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20  null;..         
7b50: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
7b60: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
7b70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7b80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7b90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7ba0: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
7bb0: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 73 74         public st
7bc0: 61 74 69 63 20 4d 6f 63 6b 52 65 67 69 73 74 72  atic MockRegistr
7bd0: 79 4b 65 79 20 43 72 65 61 74 65 53 75 62 4b 65  yKey CreateSubKe
7be0: 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y(..            
7bf0: 20 20 20 20 4d 6f 63 6b 52 65 67 69 73 74 72 79      MockRegistry
7c00: 4b 65 79 20 72 6f 6f 74 4b 65 79 2c 0d 0a 20 20  Key rootKey,..  
7c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
7c20: 72 69 6e 67 20 73 75 62 4b 65 79 4e 61 6d 65 2c  ring subKeyName,
7c30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7c40: 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a    bool whatIf,..
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c60: 62 6f 6f 6c 20 76 65 72 62 6f 73 65 0d 0a 20 20  bool verbose..  
7c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0d                ).
7c80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
7c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ca0: 69 66 20 28 72 6f 6f 74 4b 65 79 20 3d 3d 20 6e  if (rootKey == n
7cb0: 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
7cc0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
7cd0: 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20   null;....      
7ce0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 76 65            if (ve
7cf0: 72 62 6f 73 65 29 0d 0a 20 20 20 20 20 20 20 20  rbose)..        
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63              Trac
7d10: 65 4f 70 73 2e 54 72 61 63 65 28 0d 0a 20 20 20  eOps.Trace(..   
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d30: 20 20 20 20 20 54 72 61 63 65 50 72 69 6f 72 69       TracePriori
7d40: 74 79 2e 48 69 67 68 65 73 74 2c 20 74 72 61 63  ty.Highest, trac
7d50: 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e  eCallback, Strin
7d60: 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20  g.Format(..     
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d80: 20 20 20 22 72 6f 6f 74 4b 65 79 20 3d 20 7b 30     "rootKey = {0
7d90: 7d 2c 20 73 75 62 4b 65 79 4e 61 6d 65 20 3d 20  }, subKeyName = 
7da0: 7b 31 7d 22 2c 20 46 6f 72 44 69 73 70 6c 61 79  {1}", ForDisplay
7db0: 28 72 6f 6f 74 4b 65 79 29 2c 0d 0a 20 20 20 20  (rootKey),..    
7dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dd0: 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28 73      ForDisplay(s
7de0: 75 62 4b 65 79 4e 61 6d 65 29 29 2c 20 74 72 61  ubKeyName)), tra
7df0: 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a  ceCategory);....
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e10: 74 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20  try..           
7e20: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
7e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
7e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e50: 20 20 20 20 2f 2f 20 48 41 43 4b 3a 20 41 6c 77      // HACK: Alw
7e60: 61 79 73 20 6f 70 65 6e 20 61 20 6b 65 79 2c 20  ays open a key, 
7e70: 72 61 74 68 65 72 20 74 68 61 6e 20 63 72 65 61  rather than crea
7e80: 74 69 6e 67 20 6f 6e 65 20 77 68 65 6e 0d 0a 20  ting one when.. 
7e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ea0: 20 20 20 2f 2f 20 20 20 20 20 20 20 6f 70 65 72     //       oper
7eb0: 61 74 69 6e 67 20 69 6e 20 27 77 68 61 74 2d 69  ating in 'what-i
7ec0: 66 27 20 6d 6f 64 65 2e 0d 0a 20 20 20 20 20 20  f' mode...      
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
7ee0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7ef0: 20 20 20 20 20 20 69 66 20 28 77 68 61 74 49 66        if (whatIf
7f00: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
7f10: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
7f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f30: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
7f50: 20 48 41 43 4b 3a 20 41 74 74 65 6d 70 74 20 74   HACK: Attempt t
7f60: 6f 20 6f 70 65 6e 20 74 68 65 20 73 70 65 63 69  o open the speci
7f70: 66 69 65 64 20 73 75 62 2d 6b 65 79 2e 20 20 49  fied sub-key.  I
7f80: 66 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f..             
7f90: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
7fa0: 20 20 20 20 74 68 69 73 20 66 61 69 6c 73 2c 20      this fails, 
7fb0: 77 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 72  we will simply r
7fc0: 65 74 75 72 6e 20 74 68 65 20 72 6f 6f 74 20 6b  eturn the root k
7fd0: 65 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey..            
7fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
7ff0: 20 20 20 20 20 69 74 73 65 6c 66 20 73 69 6e 63       itself sinc
8000: 65 20 6e 6f 20 77 72 69 74 65 73 20 61 72 65 20  e no writes are 
8010: 61 6c 6c 6f 77 65 64 20 69 6e 0d 0a 20 20 20 20  allowed in..    
8020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8030: 20 20 20 20 2f 2f 20 20 20 20 20 20 20 27 77 68      //       'wh
8040: 61 74 2d 69 66 27 20 6d 6f 64 65 20 61 6e 79 68  at-if' mode anyh
8050: 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ow...           
8060: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d               //.
8070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8080: 20 20 20 20 20 20 20 20 20 4d 6f 63 6b 52 65 67           MockReg
8090: 69 73 74 72 79 4b 65 79 20 6b 65 79 20 3d 20 72  istryKey key = r
80a0: 6f 6f 74 4b 65 79 2e 4f 70 65 6e 53 75 62 4b 65  ootKey.OpenSubKe
80b0: 79 28 73 75 62 4b 65 79 4e 61 6d 65 29 3b 0d 0a  y(subKeyName);..
80c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
80d0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
80e0: 20 28 6b 65 79 20 21 3d 20 6e 75 6c 6c 29 20 3f   (key != null) ?
80f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 65                ke
8110: 79 20 3a 20 6e 65 77 20 4d 6f 63 6b 52 65 67 69  y : new MockRegi
8120: 73 74 72 79 4b 65 79 28 0d 0a 20 20 20 20 20 20  stryKey(..      
8130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8140: 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74 4b 65            rootKe
8150: 79 2c 20 73 75 62 4b 65 79 4e 61 6d 65 2c 20 74  y, subKeyName, t
8160: 72 75 65 2c 20 66 61 6c 73 65 2c 20 66 61 6c 73  rue, false, fals
8170: 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e);..           
8180: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
8190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81a0: 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20  else..          
81b0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81d0: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 77 20       return new 
81e0: 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 28  MockRegistryKey(
81f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6f                ro
8210: 6f 74 4b 65 79 2e 43 72 65 61 74 65 53 75 62 4b  otKey.CreateSubK
8220: 65 79 28 73 75 62 4b 65 79 4e 61 6d 65 29 2c 20  ey(subKeyName), 
8230: 66 61 6c 73 65 2c 20 66 61 6c 73 65 2c 0d 0a 20  false, false,.. 
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8250: 20 20 20 20 20 20 20 20 20 20 20 66 61 6c 73 65             false
8260: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
8270: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
8280: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
8290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
82a0: 6e 61 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20 20  nally..         
82b0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 75                su
82d0: 62 4b 65 79 73 43 72 65 61 74 65 64 2b 2b 3b 0d  bKeysCreated++;.
82e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
82f0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
8300: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
8310: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
8320: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8330: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8340: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8350: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
8360: 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69      public stati
8370: 63 20 76 6f 69 64 20 44 65 6c 65 74 65 53 75 62  c void DeleteSub
8380: 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20  Key(..          
8390: 20 20 20 20 20 20 4d 6f 63 6b 52 65 67 69 73 74        MockRegist
83a0: 72 79 4b 65 79 20 72 6f 6f 74 4b 65 79 2c 0d 0a  ryKey rootKey,..
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83c0: 73 74 72 69 6e 67 20 73 75 62 4b 65 79 4e 61 6d  string subKeyNam
83d0: 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e,..            
83e0: 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c      bool whatIf,
83f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8400: 20 20 62 6f 6f 6c 20 76 65 72 62 6f 73 65 0d 0a    bool verbose..
8410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8420: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
8430: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8440: 20 20 69 66 20 28 72 6f 6f 74 4b 65 79 20 3d 3d    if (rootKey ==
8450: 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
8460: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
8470: 72 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  rn;....         
8480: 20 20 20 20 20 20 20 69 66 20 28 76 65 72 62 6f         if (verbo
8490: 73 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se)..           
84a0: 20 20 20 20 20 20 20 20 20 54 72 61 63 65 4f 70           TraceOp
84b0: 73 2e 54 72 61 63 65 28 0d 0a 20 20 20 20 20 20  s.Trace(..      
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84d0: 20 20 54 72 61 63 65 50 72 69 6f 72 69 74 79 2e    TracePriority.
84e0: 48 69 67 68 65 73 74 2c 20 74 72 61 63 65 43 61  Highest, traceCa
84f0: 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46  llback, String.F
8500: 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20  ormat(..        
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8520: 22 72 6f 6f 74 4b 65 79 20 3d 20 7b 30 7d 2c 20  "rootKey = {0}, 
8530: 73 75 62 4b 65 79 4e 61 6d 65 20 3d 20 7b 31 7d  subKeyName = {1}
8540: 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 72 6f  ", ForDisplay(ro
8550: 6f 74 4b 65 79 29 2c 0d 0a 20 20 20 20 20 20 20  otKey),..       
8560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8570: 20 46 6f 72 44 69 73 70 6c 61 79 28 73 75 62 4b   ForDisplay(subK
8580: 65 79 4e 61 6d 65 29 29 2c 20 74 72 61 63 65 43  eyName)), traceC
8590: 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20  ategory);....   
85a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
85b0: 28 21 77 68 61 74 49 66 29 0d 0a 20 20 20 20 20  (!whatIf)..     
85c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
85d0: 6f 6f 74 4b 65 79 2e 44 65 6c 65 74 65 53 75 62  ootKey.DeleteSub
85e0: 4b 65 79 28 73 75 62 4b 65 79 4e 61 6d 65 29 3b  Key(subKeyName);
85f0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
8600: 20 20 20 20 73 75 62 4b 65 79 73 44 65 6c 65 74      subKeysDelet
8610: 65 64 2b 2b 3b 0d 0a 20 20 20 20 20 20 20 20 20  ed++;..         
8620: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
8630: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
8640: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8650: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8660: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8670: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
8680: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 73 74         public st
8690: 61 74 69 63 20 76 6f 69 64 20 44 65 6c 65 74 65  atic void Delete
86a0: 53 75 62 4b 65 79 54 72 65 65 28 0d 0a 20 20 20  SubKeyTree(..   
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 6f 63               Moc
86c0: 6b 52 65 67 69 73 74 72 79 4b 65 79 20 72 6f 6f  kRegistryKey roo
86d0: 74 4b 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20  tKey,..         
86e0: 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 73 75         string su
86f0: 62 4b 65 79 4e 61 6d 65 2c 0d 0a 20 20 20 20 20  bKeyName,..     
8700: 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20             bool 
8710: 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20  whatIf,..       
8720: 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65           bool ve
8730: 72 62 6f 73 65 0d 0a 20 20 20 20 20 20 20 20 20  rbose..         
8740: 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20         )..      
8750: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
8760: 20 20 20 20 20 20 20 20 20 69 66 20 28 72 6f 6f           if (roo
8770: 74 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20  tKey == null).. 
8780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8790: 20 20 20 72 65 74 75 72 6e 3b 0d 0a 0d 0a 20 20     return;....  
87a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
87b0: 20 28 76 65 72 62 6f 73 65 29 0d 0a 20 20 20 20   (verbose)..    
87c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87d0: 54 72 61 63 65 4f 70 73 2e 54 72 61 63 65 28 0d  TraceOps.Trace(.
87e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
87f0: 20 20 20 20 20 20 20 20 20 54 72 61 63 65 50 72           TracePr
8800: 69 6f 72 69 74 79 2e 48 69 67 68 65 73 74 2c 20  iority.Highest, 
8810: 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53  traceCallback, S
8820: 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20  tring.Format(.. 
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8840: 20 20 20 20 20 20 20 22 72 6f 6f 74 4b 65 79 20         "rootKey 
8850: 3d 20 7b 30 7d 2c 20 73 75 62 4b 65 79 4e 61 6d  = {0}, subKeyNam
8860: 65 20 3d 20 7b 31 7d 22 2c 20 46 6f 72 44 69 73  e = {1}", ForDis
8870: 70 6c 61 79 28 72 6f 6f 74 4b 65 79 29 2c 0d 0a  play(rootKey),..
8880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8890: 20 20 20 20 20 20 20 20 46 6f 72 44 69 73 70 6c          ForDispl
88a0: 61 79 28 73 75 62 4b 65 79 4e 61 6d 65 29 29 2c  ay(subKeyName)),
88b0: 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b   traceCategory);
88c0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
88d0: 20 20 20 20 69 66 20 28 21 77 68 61 74 49 66 29      if (!whatIf)
88e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
88f0: 20 20 20 20 20 20 72 6f 6f 74 4b 65 79 2e 44 65        rootKey.De
8900: 6c 65 74 65 53 75 62 4b 65 79 54 72 65 65 28 73  leteSubKeyTree(s
8910: 75 62 4b 65 79 4e 61 6d 65 29 3b 0d 0a 0d 0a 20  ubKeyName);.... 
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
8930: 75 62 4b 65 79 73 44 65 6c 65 74 65 64 2b 2b 3b  ubKeysDeleted++;
8940: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
8950: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
8960: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8970: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8980: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8990: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
89a0: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
89b0: 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20    public static 
89c0: 73 74 72 69 6e 67 5b 5d 20 47 65 74 53 75 62 4b  string[] GetSubK
89d0: 65 79 4e 61 6d 65 73 28 0d 0a 20 20 20 20 20 20  eyNames(..      
89e0: 20 20 20 20 20 20 20 20 20 20 4d 6f 63 6b 52 65            MockRe
89f0: 67 69 73 74 72 79 4b 65 79 20 6b 65 79 2c 0d 0a  gistryKey key,..
8a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a10: 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20  bool whatIf,..  
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f                bo
8a30: 6f 6c 20 76 65 72 62 6f 73 65 0d 0a 20 20 20 20  ol verbose..    
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20              ).. 
8a50: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
8a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
8a70: 20 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a   (key == null)..
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a90: 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b      return null;
8aa0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
8ab0: 20 20 20 20 69 66 20 28 76 65 72 62 6f 73 65 29      if (verbose)
8ac0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8ad0: 20 20 20 20 20 20 54 72 61 63 65 4f 70 73 2e 54        TraceOps.T
8ae0: 72 61 63 65 28 0d 0a 20 20 20 20 20 20 20 20 20  race(..         
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
8b00: 72 61 63 65 50 72 69 6f 72 69 74 79 2e 48 69 67  racePriority.Hig
8b10: 68 2c 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b  h, traceCallback
8b20: 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  , String.Format(
8b30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8b40: 20 20 20 20 20 20 20 20 20 20 22 6b 65 79 20 3d            "key =
8b50: 20 7b 30 7d 22 2c 20 46 6f 72 44 69 73 70 6c 61   {0}", ForDispla
8b60: 79 28 6b 65 79 29 29 2c 20 74 72 61 63 65 43 61  y(key)), traceCa
8b70: 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20  tegory);....    
8b80: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
8b90: 72 6e 20 6b 65 79 2e 47 65 74 53 75 62 4b 65 79  rn key.GetSubKey
8ba0: 4e 61 6d 65 73 28 29 3b 0d 0a 20 20 20 20 20 20  Names();..      
8bb0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
8bc0: 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
8bd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8be0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8bf0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8c00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
8c10: 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
8c20: 20 73 74 61 74 69 63 20 6f 62 6a 65 63 74 20 47   static object G
8c30: 65 74 56 61 6c 75 65 28 0d 0a 20 20 20 20 20 20  etValue(..      
8c40: 20 20 20 20 20 20 20 20 20 20 4d 6f 63 6b 52 65            MockRe
8c50: 67 69 73 74 72 79 4b 65 79 20 6b 65 79 2c 0d 0a  gistryKey key,..
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c70: 73 74 72 69 6e 67 20 6e 61 6d 65 2c 0d 0a 20 20  string name,..  
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62                ob
8c90: 6a 65 63 74 20 64 65 66 61 75 6c 74 56 61 6c 75  ject defaultValu
8ca0: 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e,..            
8cb0: 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c      bool whatIf,
8cc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8cd0: 20 20 62 6f 6f 6c 20 76 65 72 62 6f 73 65 0d 0a    bool verbose..
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cf0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
8d00: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8d10: 20 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e 75 6c    if (key == nul
8d20: 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
8d30: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
8d40: 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ull;....        
8d50: 20 20 20 20 20 20 20 20 69 66 20 28 76 65 72 62          if (verb
8d60: 6f 73 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ose)..          
8d70: 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65 4f            TraceO
8d80: 70 73 2e 54 72 61 63 65 28 0d 0a 20 20 20 20 20  ps.Trace(..     
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8da0: 20 20 20 54 72 61 63 65 50 72 69 6f 72 69 74 79     TracePriority
8db0: 2e 48 69 67 68 2c 20 74 72 61 63 65 43 61 6c 6c  .High, traceCall
8dc0: 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72  back, String.For
8dd0: 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  mat(..          
8de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 6b                "k
8df0: 65 79 20 3d 20 7b 30 7d 2c 20 6e 61 6d 65 20 3d  ey = {0}, name =
8e00: 20 7b 31 7d 2c 20 64 65 66 61 75 6c 74 56 61 6c   {1}, defaultVal
8e10: 75 65 20 3d 20 7b 32 7d 22 2c 0d 0a 20 20 20 20  ue = {2}",..    
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e30: 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28 6b      ForDisplay(k
8e40: 65 79 29 2c 20 46 6f 72 44 69 73 70 6c 61 79 28  ey), ForDisplay(
8e50: 6e 61 6d 65 29 2c 0d 0a 20 20 20 20 20 20 20 20  name),..        
8e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e70: 46 6f 72 44 69 73 70 6c 61 79 28 64 65 66 61 75  ForDisplay(defau
8e80: 6c 74 56 61 6c 75 65 29 29 2c 20 74 72 61 63 65  ltValue)), trace
8e90: 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20  Category);....  
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
8eb0: 74 75 72 6e 20 6b 65 79 2e 47 65 74 56 61 6c 75  turn key.GetValu
8ec0: 65 28 6e 61 6d 65 2c 20 64 65 66 61 75 6c 74 56  e(name, defaultV
8ed0: 61 6c 75 65 29 3b 0d 0a 20 20 20 20 20 20 20 20  alue);..        
8ee0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
8ef0: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
8f00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8f10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8f20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8f30: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
8f40: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 73          public s
8f50: 74 61 74 69 63 20 76 6f 69 64 20 53 65 74 56 61  tatic void SetVa
8f60: 6c 75 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20  lue(..          
8f70: 20 20 20 20 20 20 4d 6f 63 6b 52 65 67 69 73 74        MockRegist
8f80: 72 79 4b 65 79 20 6b 65 79 2c 0d 0a 20 20 20 20  ryKey key,..    
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
8fa0: 6e 67 20 6e 61 6d 65 2c 0d 0a 20 20 20 20 20 20  ng name,..      
8fb0: 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
8fc0: 20 76 61 6c 75 65 2c 0d 0a 20 20 20 20 20 20 20   value,..       
8fd0: 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 77 68           bool wh
8fe0: 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20  atIf,..         
8ff0: 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62         bool verb
9000: 6f 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ose..           
9010: 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20       )..        
9020: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
9030: 20 20 20 20 20 20 20 69 66 20 28 6b 65 79 20 3d         if (key =
9040: 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
9050: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
9060: 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  urn;....        
9070: 20 20 20 20 20 20 20 20 69 66 20 28 76 65 72 62          if (verb
9080: 6f 73 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ose)..          
9090: 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65 4f            TraceO
90a0: 70 73 2e 54 72 61 63 65 28 0d 0a 20 20 20 20 20  ps.Trace(..     
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90c0: 20 20 20 54 72 61 63 65 50 72 69 6f 72 69 74 79     TracePriority
90d0: 2e 48 69 67 68 65 73 74 2c 20 74 72 61 63 65 43  .Highest, traceC
90e0: 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e  allback, String.
90f0: 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20  Format(..       
9100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9110: 20 22 6b 65 79 20 3d 20 7b 30 7d 2c 20 6e 61 6d   "key = {0}, nam
9120: 65 20 3d 20 7b 31 7d 2c 20 76 61 6c 75 65 20 3d  e = {1}, value =
9130: 20 7b 32 7d 22 2c 20 46 6f 72 44 69 73 70 6c 61   {2}", ForDispla
9140: 79 28 6b 65 79 29 2c 0d 0a 20 20 20 20 20 20 20  y(key),..       
9150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9160: 20 46 6f 72 44 69 73 70 6c 61 79 28 6e 61 6d 65   ForDisplay(name
9170: 29 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 76 61  ), ForDisplay(va
9180: 6c 75 65 29 29 2c 20 74 72 61 63 65 43 61 74 65  lue)), traceCate
9190: 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  gory);....      
91a0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 77            if (!w
91b0: 68 61 74 49 66 29 0d 0a 20 20 20 20 20 20 20 20  hatIf)..        
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 6b 65 79 2e              key.
91d0: 53 65 74 56 61 6c 75 65 28 6e 61 6d 65 2c 20 76  SetValue(name, v
91e0: 61 6c 75 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  alue);....      
91f0: 20 20 20 20 20 20 20 20 20 20 6b 65 79 56 61 6c            keyVal
9200: 75 65 73 53 65 74 2b 2b 3b 0d 0a 20 20 20 20 20  uesSet++;..     
9210: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
9220: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
9230: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9240: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9250: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9260: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
9270: 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
9280: 63 20 73 74 61 74 69 63 20 76 6f 69 64 20 44 65  c static void De
9290: 6c 65 74 65 56 61 6c 75 65 28 0d 0a 20 20 20 20  leteValue(..    
92a0: 20 20 20 20 20 20 20 20 20 20 20 20 4d 6f 63 6b              Mock
92b0: 52 65 67 69 73 74 72 79 4b 65 79 20 6b 65 79 2c  RegistryKey key,
92c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
92d0: 20 20 73 74 72 69 6e 67 20 6e 61 6d 65 2c 0d 0a    string name,..
92e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92f0: 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20  bool whatIf,..  
9300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f                bo
9310: 6f 6c 20 76 65 72 62 6f 73 65 0d 0a 20 20 20 20  ol verbose..    
9320: 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20              ).. 
9330: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
9340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
9350: 20 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a   (key == null)..
9360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9370: 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a 0d 0a 20      return;.... 
9380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
9390: 66 20 28 76 65 72 62 6f 73 65 29 0d 0a 20 20 20  f (verbose)..   
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93b0: 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63 65 28   TraceOps.Trace(
93c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
93d0: 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65 50            TraceP
93e0: 72 69 6f 72 69 74 79 2e 48 69 67 68 65 73 74 2c  riority.Highest,
93f0: 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20   traceCallback, 
9400: 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a  String.Format(..
9410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9420: 20 20 20 20 20 20 20 20 22 6b 65 79 20 3d 20 7b          "key = {
9430: 30 7d 2c 20 6e 61 6d 65 20 3d 20 7b 31 7d 22 2c  0}, name = {1}",
9440: 20 46 6f 72 44 69 73 70 6c 61 79 28 6b 65 79 29   ForDisplay(key)
9450: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
9460: 20 20 20 20 20 20 20 20 20 20 20 46 6f 72 44 69             ForDi
9470: 73 70 6c 61 79 28 6e 61 6d 65 29 29 2c 20 74 72  splay(name)), tr
9480: 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d  aceCategory);...
9490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
94a0: 20 69 66 20 28 21 77 68 61 74 49 66 29 0d 0a 20   if (!whatIf).. 
94b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94c0: 20 20 20 6b 65 79 2e 44 65 6c 65 74 65 56 61 6c     key.DeleteVal
94d0: 75 65 28 6e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20  ue(name);....   
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 65 79               key
94f0: 56 61 6c 75 65 73 44 65 6c 65 74 65 64 2b 2b 3b  ValuesDeleted++;
9500: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
9510: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 65 6e  .            #en
9520: 64 72 65 67 69 6f 6e 0d 0a 20 20 20 20 20 20 20  dregion..       
9530: 20 7d 0d 0a 20 20 20 20 20 20 20 20 23 65 6e 64   }..        #end
9540: 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20  region....      
9550: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
9560: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9570: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9580: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9590: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
95a0: 20 20 20 20 20 23 72 65 67 69 6f 6e 20 53 74 72       #region Str
95b0: 69 6e 67 4c 69 73 74 20 43 6c 61 73 73 0d 0a 20  ingList Class.. 
95c0: 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73         private s
95d0: 65 61 6c 65 64 20 63 6c 61 73 73 20 53 74 72 69  ealed class Stri
95e0: 6e 67 4c 69 73 74 20 3a 20 4c 69 73 74 3c 73 74  ngList : List<st
95f0: 72 69 6e 67 3e 0d 0a 20 20 20 20 20 20 20 20 7b  ring>..        {
9600: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ..            pu
9610: 62 6c 69 63 20 53 74 72 69 6e 67 4c 69 73 74 28  blic StringList(
9620: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
9630: 20 20 20 3a 20 62 61 73 65 28 29 0d 0a 20 20 20     : base()..   
9640: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
9650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 64              // d
9660: 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20 20 20  o nothing...    
9670: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
9680: 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
9690: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
96a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
96b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
96c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
96e0: 69 63 20 53 74 72 69 6e 67 4c 69 73 74 28 49 45  ic StringList(IE
96f0: 6e 75 6d 65 72 61 62 6c 65 3c 73 74 72 69 6e 67  numerable<string
9700: 3e 20 63 6f 6c 6c 65 63 74 69 6f 6e 29 0d 0a 20  > collection).. 
9710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a                 :
9720: 20 62 61 73 65 28 63 6f 6c 6c 65 63 74 69 6f 6e   base(collection
9730: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
9740: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9750: 20 20 2f 2f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e    // do nothing.
9760: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
9770: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
9780: 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a      #endregion..
9790: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f  ..        //////
97a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
97b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
97c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
97d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
97e0: 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 72 65  /....        #re
97f0: 67 69 6f 6e 20 53 74 72 69 6e 67 44 69 63 74 69  gion StringDicti
9800: 6f 6e 61 72 79 20 43 6c 61 73 73 0d 0a 20 20 20  onary Class..   
9810: 20 20 20 20 20 70 72 69 76 61 74 65 20 73 65 61       private sea
9820: 6c 65 64 20 63 6c 61 73 73 20 53 74 72 69 6e 67  led class String
9830: 44 69 63 74 69 6f 6e 61 72 79 20 3a 20 44 69 63  Dictionary : Dic
9840: 74 69 6f 6e 61 72 79 3c 73 74 72 69 6e 67 2c 20  tionary<string, 
9850: 73 74 72 69 6e 67 3e 0d 0a 20 20 20 20 20 20 20  string>..       
9860: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
9870: 70 75 62 6c 69 63 20 53 74 72 69 6e 67 44 69 63  public StringDic
9880: 74 69 6f 6e 61 72 79 28 29 0d 0a 20 20 20 20 20  tionary()..     
9890: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
98a0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 64 6f 20            // do 
98b0: 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20  nothing...      
98c0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
98d0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 23 65 6e 64   }..        #end
98e0: 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20  region....      
98f0: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
9900: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9910: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9920: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9930: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
9940: 20 20 20 20 20 23 72 65 67 69 6f 6e 20 56 65 72       #region Ver
9950: 73 69 6f 6e 4c 69 73 74 20 43 6c 61 73 73 0d 0a  sionList Class..
9960: 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
9970: 73 65 61 6c 65 64 20 63 6c 61 73 73 20 56 65 72  sealed class Ver
9980: 73 69 6f 6e 4c 69 73 74 20 3a 20 4c 69 73 74 3c  sionList : List<
9990: 56 65 72 73 69 6f 6e 3e 0d 0a 20 20 20 20 20 20  Version>..      
99a0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
99b0: 20 70 75 62 6c 69 63 20 56 65 72 73 69 6f 6e 4c   public VersionL
99c0: 69 73 74 28 29 0d 0a 20 20 20 20 20 20 20 20 20  ist()..         
99d0: 20 20 20 20 20 20 20 3a 20 62 61 73 65 28 29 0d         : base().
99e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
99f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a00: 2f 2f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a  // do nothing...
9a10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
9a20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f  .            ///
9a30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9a40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9a50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9a60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9a70: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
9a80: 70 75 62 6c 69 63 20 56 65 72 73 69 6f 6e 4c 69  public VersionLi
9a90: 73 74 28 49 45 6e 75 6d 65 72 61 62 6c 65 3c 56  st(IEnumerable<V
9aa0: 65 72 73 69 6f 6e 3e 20 63 6f 6c 6c 65 63 74 69  ersion> collecti
9ab0: 6f 6e 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  on)..           
9ac0: 20 20 20 20 20 3a 20 62 61 73 65 28 63 6f 6c 6c       : base(coll
9ad0: 65 63 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 20  ection)..       
9ae0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
9af0: 20 20 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f          // do no
9b00: 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  thing...        
9b10: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
9b20: 0d 0a 20 20 20 20 20 20 20 20 23 65 6e 64 72 65  ..        #endre
9b30: 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  gion....        
9b40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9b50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9b60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9b70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9b80: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
9b90: 20 20 20 23 72 65 67 69 6f 6e 20 56 65 72 73 69     #region Versi
9ba0: 6f 6e 4d 61 70 20 43 6c 61 73 73 0d 0a 20 20 20  onMap Class..   
9bb0: 20 20 20 20 20 70 72 69 76 61 74 65 20 73 65 61       private sea
9bc0: 6c 65 64 20 63 6c 61 73 73 20 56 65 72 73 69 6f  led class Versio
9bd0: 6e 4d 61 70 20 3a 20 44 69 63 74 69 6f 6e 61 72  nMap : Dictionar
9be0: 79 3c 73 74 72 69 6e 67 2c 20 56 65 72 73 69 6f  y<string, Versio
9bf0: 6e 4c 69 73 74 3e 0d 0a 20 20 20 20 20 20 20 20  nList>..        
9c00: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  {..            p
9c10: 75 62 6c 69 63 20 56 65 72 73 69 6f 6e 4d 61 70  ublic VersionMap
9c20: 28 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ()..            
9c30: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
9c40: 20 20 20 2f 2f 20 64 6f 20 6e 6f 74 68 69 6e 67     // do nothing
9c50: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ...            }
9c60: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
9c70: 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d       #endregion.
9c80: 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f  ...        /////
9c90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9ca0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9cb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9cc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9cd0: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 72  //....        #r
9ce0: 65 67 69 6f 6e 20 43 6f 6e 66 69 67 75 72 61 74  egion Configurat
9cf0: 69 6f 6e 20 43 6c 61 73 73 0d 0a 20 20 20 20 20  ion Class..     
9d00: 20 20 20 70 72 69 76 61 74 65 20 73 65 61 6c 65     private seale
9d10: 64 20 63 6c 61 73 73 20 43 6f 6e 66 69 67 75 72  d class Configur
9d20: 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 7b  ation..        {
9d30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 72  ..            #r
9d40: 65 67 69 6f 6e 20 50 72 69 76 61 74 65 20 43 6f  egion Private Co
9d50: 6e 73 74 61 6e 74 73 0d 0a 20 20 20 20 20 20 20  nstants..       
9d60: 20 20 20 20 20 70 72 69 76 61 74 65 20 63 6f 6e       private con
9d70: 73 74 20 63 68 61 72 20 53 77 69 74 63 68 20 3d  st char Switch =
9d80: 20 27 2d 27 3b 0d 0a 20 20 20 20 20 20 20 20 20   '-';..         
9d90: 20 20 20 70 72 69 76 61 74 65 20 63 6f 6e 73 74     private const
9da0: 20 63 68 61 72 20 41 6c 74 53 77 69 74 63 68 20   char AltSwitch 
9db0: 3d 20 27 2f 27 3b 0d 0a 0d 0a 20 20 20 20 20 20  = '/';....      
9dc0: 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
9dd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9de0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9df0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9e00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
9e10: 20 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65           private
9e20: 20 73 74 61 74 69 63 20 72 65 61 64 6f 6e 6c 79   static readonly
9e30: 20 63 68 61 72 5b 5d 20 53 77 69 74 63 68 43 68   char[] SwitchCh
9e40: 61 72 73 20 3d 20 7b 0d 0a 20 20 20 20 20 20 20  ars = {..       
9e50: 20 20 20 20 20 20 20 20 20 53 77 69 74 63 68 2c           Switch,
9e60: 20 41 6c 74 53 77 69 74 63 68 0d 0a 20 20 20 20   AltSwitch..    
9e70: 20 20 20 20 20 20 20 20 7d 3b 0d 0a 20 20 20 20          };..    
9e80: 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69          #endregi
9e90: 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  on....          
9ea0: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
9eb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9ec0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9ed0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9ee0: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
9ef0: 20 20 20 20 20 23 72 65 67 69 6f 6e 20 50 72 69       #region Pri
9f00: 76 61 74 65 20 43 6f 6e 73 74 72 75 63 74 6f 72  vate Constructor
9f10: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  s..            p
9f20: 72 69 76 61 74 65 20 43 6f 6e 66 69 67 75 72 61  rivate Configura
9f30: 74 69 6f 6e 28 0d 0a 20 20 20 20 20 20 20 20 20  tion(..         
9f40: 20 20 20 20 20 20 20 41 73 73 65 6d 62 6c 79 20         Assembly 
9f50: 61 73 73 65 6d 62 6c 79 2c 0d 0a 20 20 20 20 20  assembly,..     
9f60: 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e             strin
9f70: 67 20 6c 6f 67 46 69 6c 65 4e 61 6d 65 2c 0d 0a  g logFileName,..
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f90: 73 74 72 69 6e 67 20 64 69 72 65 63 74 6f 72 79  string directory
9fa0: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
9fb0: 20 20 20 73 74 72 69 6e 67 20 63 6f 72 65 46 69     string coreFi
9fc0: 6c 65 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20  leName,..       
9fd0: 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
9fe0: 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 2c 0d 0a 20  linqFileName,.. 
9ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
a000: 74 72 69 6e 67 20 64 65 73 69 67 6e 65 72 46 69  tring designerFi
a010: 6c 65 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20  leName,..       
a020: 20 20 20 20 20 20 20 20 20 49 6e 73 74 61 6c 6c           Install
a030: 46 6c 61 67 73 20 69 6e 73 74 61 6c 6c 46 6c 61  Flags installFla
a040: 67 73 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  gs,..           
a050: 20 20 20 20 20 54 72 61 63 65 50 72 69 6f 72 69       TracePriori
a060: 74 79 20 74 72 61 63 65 50 72 69 6f 72 69 74 79  ty tracePriority
a070: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
a080: 20 20 20 62 6f 6f 6c 20 69 6e 73 74 61 6c 6c 2c     bool install,
a090: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a0a0: 20 20 62 6f 6f 6c 20 6e 6f 44 65 73 6b 74 6f 70    bool noDesktop
a0b0: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
a0c0: 20 20 20 62 6f 6f 6c 20 6e 6f 43 6f 6d 70 61 63     bool noCompac
a0d0: 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t,..            
a0e0: 20 20 20 20 62 6f 6f 6c 20 6e 6f 4e 65 74 46 78      bool noNetFx
a0f0: 32 30 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  20,..           
a100: 20 20 20 20 20 62 6f 6f 6c 20 6e 6f 4e 65 74 46       bool noNetF
a110: 78 34 30 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  x40,..          
a120: 20 20 20 20 20 20 62 6f 6f 6c 20 6e 6f 56 73 32        bool noVs2
a130: 30 30 38 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  008,..          
a140: 20 20 20 20 20 20 62 6f 6f 6c 20 6e 6f 56 73 32        bool noVs2
a150: 30 31 30 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  010,..          
a160: 20 20 20 20 20 20 62 6f 6f 6c 20 6e 6f 54 72 61        bool noTra
a170: 63 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ce,..           
a180: 20 20 20 20 20 62 6f 6f 6c 20 6e 6f 43 6f 6e 73       bool noCons
a190: 6f 6c 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ole,..          
a1a0: 20 20 20 20 20 20 62 6f 6f 6c 20 6e 6f 4c 6f 67        bool noLog
a1b0: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
a1c0: 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d     bool whatIf,.
a1d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a1e0: 20 62 6f 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a   bool verbose,..
a1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a200: 62 6f 6f 6c 20 63 6f 6e 66 69 72 6d 0d 0a 20 20  bool confirm..  
a210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0d                ).
a220: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
a230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a240: 74 68 69 73 2e 61 73 73 65 6d 62 6c 79 20 3d 20  this.assembly = 
a250: 61 73 73 65 6d 62 6c 79 3b 0d 0a 20 20 20 20 20  assembly;..     
a260: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
a270: 6c 6f 67 46 69 6c 65 4e 61 6d 65 20 3d 20 6c 6f  logFileName = lo
a280: 67 46 69 6c 65 4e 61 6d 65 3b 0d 0a 20 20 20 20  gFileName;..    
a290: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
a2a0: 2e 64 69 72 65 63 74 6f 72 79 20 3d 20 64 69 72  .directory = dir
a2b0: 65 63 74 6f 72 79 3b 0d 0a 20 20 20 20 20 20 20  ectory;..       
a2c0: 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 63 6f           this.co
a2d0: 72 65 46 69 6c 65 4e 61 6d 65 20 3d 20 63 6f 72  reFileName = cor
a2e0: 65 46 69 6c 65 4e 61 6d 65 3b 0d 0a 20 20 20 20  eFileName;..    
a2f0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
a300: 2e 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 20 3d 20  .linqFileName = 
a310: 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 3b 0d 0a 20  linqFileName;.. 
a320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
a330: 68 69 73 2e 64 65 73 69 67 6e 65 72 46 69 6c 65  his.designerFile
a340: 4e 61 6d 65 20 3d 20 64 65 73 69 67 6e 65 72 46  Name = designerF
a350: 69 6c 65 4e 61 6d 65 3b 0d 0a 20 20 20 20 20 20  ileName;..      
a360: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 69            this.i
a370: 6e 73 74 61 6c 6c 46 6c 61 67 73 20 3d 20 69 6e  nstallFlags = in
a380: 73 74 61 6c 6c 46 6c 61 67 73 3b 0d 0a 20 20 20  stallFlags;..   
a390: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69               thi
a3a0: 73 2e 74 72 61 63 65 50 72 69 6f 72 69 74 79 20  s.tracePriority 
a3b0: 3d 20 74 72 61 63 65 50 72 69 6f 72 69 74 79 3b  = tracePriority;
a3c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a3d0: 20 20 74 68 69 73 2e 69 6e 73 74 61 6c 6c 20 3d    this.install =
a3e0: 20 69 6e 73 74 61 6c 6c 3b 0d 0a 20 20 20 20 20   install;..     
a3f0: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
a400: 6e 6f 44 65 73 6b 74 6f 70 20 3d 20 6e 6f 44 65  noDesktop = noDe
a410: 73 6b 74 6f 70 3b 0d 0a 20 20 20 20 20 20 20 20  sktop;..        
a420: 20 20 20 20 20 20 20 20 74 68 69 73 2e 6e 6f 43          this.noC
a430: 6f 6d 70 61 63 74 20 3d 20 6e 6f 43 6f 6d 70 61  ompact = noCompa
a440: 63 74 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ct;..           
a450: 20 20 20 20 20 74 68 69 73 2e 6e 6f 4e 65 74 46       this.noNetF
a460: 78 32 30 20 3d 20 6e 6f 4e 65 74 46 78 32 30 3b  x20 = noNetFx20;
a470: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a480: 20 20 74 68 69 73 2e 6e 6f 4e 65 74 46 78 34 30    this.noNetFx40
a490: 20 3d 20 6e 6f 4e 65 74 46 78 34 30 3b 0d 0a 20   = noNetFx40;.. 
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
a4b0: 68 69 73 2e 6e 6f 56 73 32 30 30 38 20 3d 20 6e  his.noVs2008 = n
a4c0: 6f 56 73 32 30 30 38 3b 0d 0a 20 20 20 20 20 20  oVs2008;..      
a4d0: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 6e            this.n
a4e0: 6f 56 73 32 30 31 30 20 3d 20 6e 6f 56 73 32 30  oVs2010 = noVs20
a4f0: 31 30 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  10;..           
a500: 20 20 20 20 20 74 68 69 73 2e 6e 6f 54 72 61 63       this.noTrac
a510: 65 20 3d 20 6e 6f 54 72 61 63 65 3b 0d 0a 20 20  e = noTrace;..  
a520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
a530: 69 73 2e 6e 6f 43 6f 6e 73 6f 6c 65 20 3d 20 6e  is.noConsole = n
a540: 6f 43 6f 6e 73 6f 6c 65 3b 0d 0a 20 20 20 20 20  oConsole;..     
a550: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
a560: 6e 6f 4c 6f 67 20 3d 20 6e 6f 4c 6f 67 3b 0d 0a  noLog = noLog;..
a570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a580: 74 68 69 73 2e 77 68 61 74 49 66 20 3d 20 77 68  this.whatIf = wh
a590: 61 74 49 66 3b 0d 0a 20 20 20 20 20 20 20 20 20  atIf;..         
a5a0: 20 20 20 20 20 20 20 74 68 69 73 2e 76 65 72 62         this.verb
a5b0: 6f 73 65 20 3d 20 76 65 72 62 6f 73 65 3b 0d 0a  ose = verbose;..
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5d0: 74 68 69 73 2e 63 6f 6e 66 69 72 6d 20 3d 20 63  this.confirm = c
a5e0: 6f 6e 66 69 72 6d 3b 0d 0a 20 20 20 20 20 20 20  onfirm;..       
a5f0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
a600: 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a      #endregion..
a610: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
a620: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a630: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a640: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a650: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a660: 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  /....           
a670: 20 23 72 65 67 69 6f 6e 20 50 72 69 76 61 74 65   #region Private
a680: 20 53 74 61 74 69 63 20 4d 65 74 68 6f 64 73 0d   Static Methods.
a690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69  .            pri
a6a0: 76 61 74 65 20 73 74 61 74 69 63 20 76 6f 69 64  vate static void
a6b0: 20 47 65 74 44 65 66 61 75 6c 74 46 69 6c 65 4e   GetDefaultFileN
a6c0: 61 6d 65 73 28 0d 0a 20 20 20 20 20 20 20 20 20  ames(..         
a6d0: 20 20 20 20 20 20 20 72 65 66 20 73 74 72 69 6e         ref strin
a6e0: 67 20 64 69 72 65 63 74 6f 72 79 2c 0d 0a 20 20  g directory,..  
a6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
a700: 66 20 73 74 72 69 6e 67 20 63 6f 72 65 46 69 6c  f string coreFil
a710: 65 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20  eName,..        
a720: 20 20 20 20 20 20 20 20 72 65 66 20 73 74 72 69          ref stri
a730: 6e 67 20 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 2c  ng linqFileName,
a740: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a750: 20 20 72 65 66 20 73 74 72 69 6e 67 20 64 65 73    ref string des
a760: 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65 0d 0a 20  ignerFileName.. 
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
a780: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
a790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a7a0: 20 69 66 20 28 74 68 69 73 41 73 73 65 6d 62 6c   if (thisAssembl
a7b0: 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  y == null)..    
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7d0: 72 65 74 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20 20  return;....     
a7e0: 20 20 20 20 20 20 20 20 20 20 20 64 69 72 65 63             direc
a7f0: 74 6f 72 79 20 3d 20 50 61 74 68 2e 47 65 74 44  tory = Path.GetD
a800: 69 72 65 63 74 6f 72 79 4e 61 6d 65 28 74 68 69  irectoryName(thi
a810: 73 41 73 73 65 6d 62 6c 79 2e 4c 6f 63 61 74 69  sAssembly.Locati
a820: 6f 6e 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  on);....        
a830: 20 20 20 20 20 20 20 20 69 66 20 28 53 74 72 69          if (Stri
a840: 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79  ng.IsNullOrEmpty
a850: 28 64 69 72 65 63 74 6f 72 79 29 29 0d 0a 20 20  (directory))..  
a860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a870: 20 20 72 65 74 75 72 6e 3b 0d 0a 0d 0a 20 20 20    return;....   
a880: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 72               cor
a890: 65 46 69 6c 65 4e 61 6d 65 20 3d 20 50 61 74 68  eFileName = Path
a8a0: 2e 43 6f 6d 62 69 6e 65 28 64 69 72 65 63 74 6f  .Combine(directo
a8b0: 72 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ry,..           
a8c0: 20 20 20 20 20 20 20 20 20 49 6e 73 74 61 6c 6c           Install
a8d0: 65 72 2e 43 6f 72 65 46 69 6c 65 4e 61 6d 65 29  er.CoreFileName)
a8e0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
a8f0: 20 20 20 20 20 6c 69 6e 71 46 69 6c 65 4e 61 6d       linqFileNam
a900: 65 20 3d 20 50 61 74 68 2e 43 6f 6d 62 69 6e 65  e = Path.Combine
a910: 28 64 69 72 65 63 74 6f 72 79 2c 0d 0a 20 20 20  (directory,..   
a920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a930: 20 49 6e 73 74 61 6c 6c 65 72 2e 4c 69 6e 71 46   Installer.LinqF
a940: 69 6c 65 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20  ileName);....   
a950: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 73               des
a960: 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65 20 3d 20  ignerFileName = 
a970: 50 61 74 68 2e 43 6f 6d 62 69 6e 65 28 64 69 72  Path.Combine(dir
a980: 65 63 74 6f 72 79 2c 0d 0a 20 20 20 20 20 20 20  ectory,..       
a990: 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 73               Ins
a9a0: 74 61 6c 6c 65 72 2e 44 65 73 69 67 6e 65 72 46  taller.DesignerF
a9b0: 69 6c 65 4e 61 6d 65 29 3b 0d 0a 20 20 20 20 20  ileName);..     
a9c0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
a9d0: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
a9e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a9f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
aa00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
aa10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
aa20: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 76 61             priva
aa30: 74 65 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 43  te static bool C
aa40: 68 65 63 6b 4f 70 74 69 6f 6e 28 0d 0a 20 20 20  heckOption(..   
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 66               ref
aa60: 20 73 74 72 69 6e 67 20 61 72 67 0d 0a 20 20 20   string arg..   
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a               )..
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
aaa0: 74 72 69 6e 67 20 72 65 73 75 6c 74 20 3d 20 61  tring result = a
aab0: 72 67 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  rg;....         
aac0: 20 20 20 20 20 20 20 69 66 20 28 21 53 74 72 69         if (!Stri
aad0: 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79  ng.IsNullOrEmpty
aae0: 28 72 65 73 75 6c 74 29 29 0d 0a 20 20 20 20 20  (result))..     
aaf0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab10: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
ab20: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54            // NOT
ab30: 45 3a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 6c 65  E: Remove all le
ab40: 61 64 69 6e 67 20 73 77 69 74 63 68 20 63 68 61  ading switch cha
ab50: 72 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rs...           
ab60: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
ab70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab80: 20 72 65 73 75 6c 74 20 3d 20 72 65 73 75 6c 74   result = result
ab90: 2e 54 72 69 6d 53 74 61 72 74 28 53 77 69 74 63  .TrimStart(Switc
aba0: 68 43 68 61 72 73 29 3b 0d 0a 0d 0a 20 20 20 20  hChars);....    
abb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abc0: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
abd0: 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a          // NOTE:
abe0: 20 48 6f 77 20 6d 61 6e 79 20 63 68 61 72 73 20   How many chars 
abf0: 77 65 72 65 20 72 65 6d 6f 76 65 64 3f 0d 0a 20  were removed?.. 
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac10: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
ac20: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 63             int c
ac30: 6f 75 6e 74 20 3d 20 61 72 67 2e 4c 65 6e 67 74  ount = arg.Lengt
ac40: 68 20 2d 20 72 65 73 75 6c 74 2e 4c 65 6e 67 74  h - result.Lengt
ac50: 68 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  h;....          
ac60: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
ac70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac80: 20 20 2f 2f 20 4e 4f 54 45 3a 20 57 61 73 20 74    // NOTE: Was t
ac90: 68 65 72 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  here at least on
aca0: 65 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e?..            
acb0: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
acc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acd0: 69 66 20 28 63 6f 75 6e 74 20 3e 20 30 29 0d 0a  if (count > 0)..
ace0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acf0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
ad00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ad10: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
ad20: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f             // NO
ad30: 54 45 3a 20 4f 6b 2c 20 72 65 70 6c 61 63 65 20  TE: Ok, replace 
ad40: 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 0d 0a  their original..
ad50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad60: 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
ad70: 20 61 72 67 75 6d 65 6e 74 2e 0d 0a 20 20 20 20   argument...    
ad80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad90: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adb0: 61 72 67 20 3d 20 72 65 73 75 6c 74 3b 0d 0a 0d  arg = result;...
adc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
add0: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
ade0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adf0: 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 59 65       // NOTE: Ye
ae00: 73 2c 20 74 68 69 73 20 69 73 20 61 20 73 77 69  s, this is a swi
ae10: 74 63 68 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  tch...          
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
ae30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ae40: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
ae50: 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20   true;..        
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
ae70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
ae80: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
ae90: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
aea0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
aeb0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
aec0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
aed0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
aee0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
aef0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
af00: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
af10: 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69     private stati
af20: 63 20 62 6f 6f 6c 20 4d 61 74 63 68 4f 70 74 69  c bool MatchOpti
af30: 6f 6e 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  on(..           
af40: 20 20 20 20 20 73 74 72 69 6e 67 20 61 72 67 2c       string arg,
af50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
af60: 20 20 73 74 72 69 6e 67 20 6f 70 74 69 6f 6e 0d    string option.
af70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
af80: 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   )..            
af90: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
afa0: 20 20 20 69 66 20 28 28 61 72 67 20 3d 3d 20 6e     if ((arg == n
afb0: 75 6c 6c 29 20 7c 7c 20 28 6f 70 74 69 6f 6e 20  ull) || (option 
afc0: 3d 3d 20 6e 75 6c 6c 29 29 0d 0a 20 20 20 20 20  == null))..     
afd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
afe0: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a  eturn false;....
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b000: 72 65 74 75 72 6e 20 53 74 72 69 6e 67 2e 43 6f  return String.Co
b010: 6d 70 61 72 65 28 61 72 67 2c 20 30 2c 20 6f 70  mpare(arg, 0, op
b020: 74 69 6f 6e 2c 20 30 2c 0d 0a 20 20 20 20 20 20  tion, 0,..      
b030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 72                ar
b040: 67 2e 4c 65 6e 67 74 68 2c 20 53 74 72 69 6e 67  g.Length, String
b050: 43 6f 6d 70 61 72 69 73 6f 6e 2e 4f 72 64 69 6e  Comparison.Ordin
b060: 61 6c 49 67 6e 6f 72 65 43 61 73 65 29 20 3d 3d  alIgnoreCase) ==
b070: 20 30 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20   0;..           
b080: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
b090: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
b0a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b0b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b0c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b0d0: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
b0e0: 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61       private sta
b0f0: 74 69 63 20 62 6f 6f 6c 3f 20 50 61 72 73 65 42  tic bool? ParseB
b100: 6f 6f 6c 65 61 6e 28 0d 0a 20 20 20 20 20 20 20  oolean(..       
b110: 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
b120: 74 65 78 74 0d 0a 20 20 20 20 20 20 20 20 20 20  text..          
b130: 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20        )..       
b140: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
b150: 20 20 20 20 20 20 20 20 69 66 20 28 21 53 74 72          if (!Str
b160: 69 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74  ing.IsNullOrEmpt
b170: 79 28 74 65 78 74 29 29 0d 0a 20 20 20 20 20 20  y(text))..      
b180: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
b190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1a0: 20 62 6f 6f 6c 20 76 61 6c 75 65 3b 0d 0a 0d 0a   bool value;....
b1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1c0: 20 20 20 20 69 66 20 28 62 6f 6f 6c 2e 54 72 79      if (bool.Try
b1d0: 50 61 72 73 65 28 74 65 78 74 2c 20 6f 75 74 20  Parse(text, out 
b1e0: 76 61 6c 75 65 29 29 0d 0a 20 20 20 20 20 20 20  value))..       
b1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b200: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 3b 0d 0a   return value;..
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b220: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
b230: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c       return null
b240: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
b250: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
b260: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b270: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b280: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b290: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b2a0: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
b2b0: 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69     private stati
b2c0: 63 20 6f 62 6a 65 63 74 20 50 61 72 73 65 45 6e  c object ParseEn
b2d0: 75 6d 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  um(..           
b2e0: 20 20 20 20 20 54 79 70 65 20 65 6e 75 6d 54 79       Type enumTy
b2f0: 70 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  pe,..           
b300: 20 20 20 20 20 73 74 72 69 6e 67 20 74 65 78 74       string text
b310: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
b320: 20 20 20 62 6f 6f 6c 20 6e 6f 43 61 73 65 0d 0a     bool noCase..
b330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b340: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
b350: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
b360: 20 20 69 66 20 28 28 65 6e 75 6d 54 79 70 65 20    if ((enumType 
b370: 3d 3d 20 6e 75 6c 6c 29 20 7c 7c 20 21 65 6e 75  == null) || !enu
b380: 6d 54 79 70 65 2e 49 73 45 6e 75 6d 29 0d 0a 20  mType.IsEnum).. 
b390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3a0: 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0d     return null;.
b3b0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
b3c0: 20 20 20 69 66 20 28 21 53 74 72 69 6e 67 2e 49     if (!String.I
b3d0: 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 74 65 78  sNullOrEmpty(tex
b3e0: 74 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t))..           
b3f0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
b400: 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 0d              try.
b410: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b420: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
b430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b440: 72 65 74 75 72 6e 20 45 6e 75 6d 2e 50 61 72 73  return Enum.Pars
b450: 65 28 65 6e 75 6d 54 79 70 65 2c 20 74 65 78 74  e(enumType, text
b460: 2c 20 6e 6f 43 61 73 65 29 3b 0d 0a 20 20 20 20  , noCase);..    
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b480: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
b490: 20 20 20 20 20 20 20 63 61 74 63 68 0d 0a 20 20         catch..  
b4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4b0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
b4d0: 64 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20 20  do nothing...   
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4f0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
b500: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
b510: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
b520: 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20  null;..         
b530: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
b540: 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a    #endregion....
b550: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f              ////
b560: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b570: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b580: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b590: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
b5a0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
b5b0: 72 65 67 69 6f 6e 20 50 75 62 6c 69 63 20 53 74  region Public St
b5c0: 61 74 69 63 20 4d 65 74 68 6f 64 73 0d 0a 20 20  atic Methods..  
b5d0: 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
b5e0: 20 73 74 61 74 69 63 20 43 6f 6e 66 69 67 75 72   static Configur
b5f0: 61 74 69 6f 6e 20 43 72 65 61 74 65 44 65 66 61  ation CreateDefa
b600: 75 6c 74 28 29 0d 0a 20 20 20 20 20 20 20 20 20  ult()..         
b610: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
b620: 20 20 20 20 20 20 73 74 72 69 6e 67 20 64 69 72        string dir
b630: 65 63 74 6f 72 79 20 3d 20 6e 75 6c 6c 3b 0d 0a  ectory = null;..
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b650: 73 74 72 69 6e 67 20 63 6f 72 65 46 69 6c 65 4e  string coreFileN
b660: 61 6d 65 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20  ame = null;..   
b670: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
b680: 69 6e 67 20 6c 69 6e 71 46 69 6c 65 4e 61 6d 65  ing linqFileName
b690: 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20   = null;..      
b6a0: 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
b6b0: 20 64 65 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d   designerFileNam
b6c0: 65 20 3d 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20  e = null;....   
b6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 47 65 74               Get
b6e0: 44 65 66 61 75 6c 74 46 69 6c 65 4e 61 6d 65 73  DefaultFileNames
b6f0: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
b700: 20 20 20 20 20 20 20 72 65 66 20 64 69 72 65 63         ref direc
b710: 74 6f 72 79 2c 20 72 65 66 20 63 6f 72 65 46 69  tory, ref coreFi
b720: 6c 65 4e 61 6d 65 2c 20 72 65 66 20 6c 69 6e 71  leName, ref linq
b730: 46 69 6c 65 4e 61 6d 65 2c 0d 0a 20 20 20 20 20  FileName,..     
b740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
b750: 65 66 20 64 65 73 69 67 6e 65 72 46 69 6c 65 4e  ef designerFileN
b760: 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ame);....       
b770: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
b780: 6e 65 77 20 43 6f 6e 66 69 67 75 72 61 74 69 6f  new Configuratio
b790: 6e 28 74 68 69 73 41 73 73 65 6d 62 6c 79 2c 20  n(thisAssembly, 
b7a0: 6e 75 6c 6c 2c 20 64 69 72 65 63 74 6f 72 79 2c  null, directory,
b7b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
b7c0: 20 20 20 20 20 20 63 6f 72 65 46 69 6c 65 4e 61        coreFileNa
b7d0: 6d 65 2c 20 6c 69 6e 71 46 69 6c 65 4e 61 6d 65  me, linqFileName
b7e0: 2c 20 64 65 73 69 67 6e 65 72 46 69 6c 65 4e 61  , designerFileNa
b7f0: 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  me,..           
b800: 20 20 20 20 20 20 20 20 20 49 6e 73 74 61 6c 6c           Install
b810: 46 6c 61 67 73 2e 44 65 66 61 75 6c 74 2c 20 54  Flags.Default, T
b820: 72 61 63 65 50 72 69 6f 72 69 74 79 2e 44 65 66  racePriority.Def
b830: 61 75 6c 74 2c 20 74 72 75 65 2c 20 66 61 6c 73  ault, true, fals
b840: 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e,..            
b850: 20 20 20 20 20 20 20 20 74 72 75 65 2c 20 66 61          true, fa
b860: 6c 73 65 2c 20 66 61 6c 73 65 2c 20 66 61 6c 73  lse, false, fals
b870: 65 2c 20 66 61 6c 73 65 2c 20 66 61 6c 73 65 2c  e, false, false,
b880: 20 66 61 6c 73 65 2c 20 66 61 6c 73 65 2c 0d 0a   false, false,..
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8a0: 20 20 20 20 74 72 75 65 2c 20 74 72 75 65 2c 20      true, true, 
b8b0: 66 61 6c 73 65 29 3b 0d 0a 20 20 20 20 20 20 20  false);..       
b8c0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
b8d0: 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
b8e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b8f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b900: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b910: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
b920: 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20           public 
b930: 73 74 61 74 69 63 20 62 6f 6f 6c 20 46 72 6f 6d  static bool From
b940: 41 72 67 73 28 0d 0a 20 20 20 20 20 20 20 20 20  Args(..         
b950: 20 20 20 20 20 20 20 73 74 72 69 6e 67 5b 5d 20         string[] 
b960: 61 72 67 73 2c 0d 0a 20 20 20 20 20 20 20 20 20  args,..         
b970: 20 20 20 20 20 20 20 62 6f 6f 6c 20 73 74 72 69         bool stri
b980: 63 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ct,..           
b990: 20 20 20 20 20 72 65 66 20 43 6f 6e 66 69 67 75       ref Configu
b9a0: 72 61 74 69 6f 6e 20 63 6f 6e 66 69 67 75 72 61  ration configura
b9b0: 74 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20  tion,..         
b9c0: 20 20 20 20 20 20 20 72 65 66 20 73 74 72 69 6e         ref strin
b9d0: 67 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20  g error..       
b9e0: 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20           )..    
b9f0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
ba00: 20 20 20 20 20 20 20 20 20 20 20 74 72 79 0d 0a             try..
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba20: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
ba30: 20 20 20 20 20 20 20 69 66 20 28 61 72 67 73 20         if (args 
ba40: 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba60: 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a    return true;..
ba70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ba80: 20 20 20 20 20 20 69 66 20 28 63 6f 6e 66 69 67        if (config
ba90: 75 72 61 74 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29  uration == null)
baa0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
bab0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69 67            config
bac0: 75 72 61 74 69 6f 6e 20 3d 20 43 6f 6e 66 69 67  uration = Config
bad0: 75 72 61 74 69 6f 6e 2e 43 72 65 61 74 65 44 65  uration.CreateDe
bae0: 66 61 75 6c 74 28 29 3b 0d 0a 0d 0a 20 20 20 20  fault();....    
baf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb00: 69 6e 74 20 6c 65 6e 67 74 68 20 3d 20 61 72 67  int length = arg
bb10: 73 2e 4c 65 6e 67 74 68 3b 0d 0a 0d 0a 20 20 20  s.Length;....   
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb30: 20 66 6f 72 20 28 69 6e 74 20 69 6e 64 65 78 20   for (int index 
bb40: 3d 20 30 3b 20 69 6e 64 65 78 20 3c 20 6c 65 6e  = 0; index < len
bb50: 67 74 68 3b 20 69 6e 64 65 78 2b 2b 29 0d 0a 20  gth; index++).. 
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb70: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
bb90: 72 69 6e 67 20 61 72 67 20 3d 20 61 72 67 73 5b  ring arg = args[
bba0: 69 6e 64 65 78 5d 3b 0d 0a 0d 0a 20 20 20 20 20  index];....     
bbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbc0: 20 20 20 69 66 20 28 53 74 72 69 6e 67 2e 49 73     if (String.Is
bbd0: 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 61 72 67 29  NullOrEmpty(arg)
bbe0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
bbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
bc00: 6f 6e 74 69 6e 75 65 3b 0d 0a 0d 0a 20 20 20 20  ontinue;....    
bc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc20: 20 20 20 20 73 74 72 69 6e 67 20 6e 65 77 41 72      string newAr
bc30: 67 20 3d 20 61 72 67 3b 0d 0a 0d 0a 20 20 20 20  g = arg;....    
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc50: 20 20 20 20 69 66 20 28 43 68 65 63 6b 4f 70 74      if (CheckOpt
bc60: 69 6f 6e 28 72 65 66 20 6e 65 77 41 72 67 29 29  ion(ref newArg))
bc70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
bc80: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bca0: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
bcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcc0: 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45           // NOTE
bcd0: 3a 20 41 6c 6c 20 74 68 65 20 73 75 70 70 6f 72  : All the suppor
bce0: 74 65 64 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  ted command line
bcf0: 20 6f 70 74 69 6f 6e 73 20 6d 75 73 74 0d 0a 20   options must.. 
bd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd10: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
bd20: 20 20 20 20 68 61 76 65 20 61 20 76 61 6c 75 65      have a value
bd30: 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 61 74 74  ; therefore, att
bd40: 65 6d 70 74 20 74 6f 20 61 64 76 61 6e 63 65 0d  empt to advance.
bd50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
bd70: 20 20 20 20 20 20 74 6f 20 69 74 20 6e 6f 77 2e        to it now.
bd80: 20 20 49 66 20 77 65 20 66 61 69 6c 2c 20 77 65    If we fail, we
bd90: 20 61 72 65 20 64 6f 6e 65 2e 0d 0a 20 20 20 20   are done...    
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdb0: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdd0: 20 20 20 20 20 20 20 20 69 6e 64 65 78 2b 2b 3b          index++;
bde0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be00: 69 66 20 28 69 6e 64 65 78 20 3e 3d 20 6c 65 6e  if (index >= len
be10: 67 74 68 29 0d 0a 20 20 20 20 20 20 20 20 20 20  gth)..          
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be30: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be50: 20 20 20 20 20 65 72 72 6f 72 20 3d 20 54 72 61       error = Tra
be60: 63 65 4f 70 73 2e 54 72 61 63 65 28 0d 0a 20 20  ceOps.Trace(..  
be70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be90: 20 20 54 72 61 63 65 50 72 69 6f 72 69 74 79 2e    TracePriority.
bea0: 4c 6f 77 65 73 74 2c 0d 0a 20 20 20 20 20 20 20  Lowest,..       
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61               tra
bed0: 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69  ceCallback, Stri
bee0: 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20  ng.Format(..    
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf10: 22 4d 69 73 73 69 6e 67 20 76 61 6c 75 65 20 66  "Missing value f
bf20: 6f 72 20 6f 70 74 69 6f 6e 3a 20 7b 30 7d 22 2c  or option: {0}",
bf30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
bf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf50: 20 20 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79        ForDisplay
bf60: 28 61 72 67 29 29 2c 20 74 72 61 63 65 43 61 74  (arg)), traceCat
bf70: 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20  egory);....     
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf90: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73             if (s
bfa0: 74 72 69 63 74 29 0d 0a 20 20 20 20 20 20 20 20  trict)..        
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
bfd0: 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20  rn false;....   
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
c000: 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ak;..           
c010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c020: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c040: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
c050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c060: 20 20 2f 2f 20 4e 4f 54 45 3a 20 47 72 61 62 20    // NOTE: Grab 
c070: 74 68 65 20 74 65 78 74 75 61 6c 20 76 61 6c 75  the textual valu
c080: 65 20 6f 66 20 74 68 69 73 20 63 6f 6d 6d 61 6e  e of this comman
c090: 64 20 6c 69 6e 65 0d 0a 20 20 20 20 20 20 20 20  d line..        
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0b0: 20 20 20 20 2f 2f 20 20 20 20 20 20 20 6f 70 74      //       opt
c0c0: 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ion...          
c0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0e0: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
c0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c100: 20 20 73 74 72 69 6e 67 20 74 65 78 74 20 3d 20    string text = 
c110: 61 72 67 73 5b 69 6e 64 65 78 5d 3b 0d 0a 0d 0a  args[index];....
c120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
c140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e              // N
c160: 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20  OTE: Figure out 
c170: 77 68 69 63 68 20 63 6f 6d 6d 61 6e 64 20 6c 69  which command li
c180: 6e 65 20 6f 70 74 69 6f 6e 20 74 68 69 73 20 69  ne option this i
c190: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s..             
c1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c1b0: 2f 20 20 20 20 20 20 20 28 62 61 73 65 64 20 6f  /       (based o
c1c0: 6e 20 61 20 70 61 72 74 69 61 6c 20 6e 61 6d 65  n a partial name
c1d0: 20 6d 61 74 63 68 29 20 61 6e 64 20 74 68 65 6e   match) and then
c1e0: 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20   try..          
c1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c200: 20 20 2f 2f 20 20 20 20 20 20 20 74 6f 20 69 6e    //       to in
c210: 74 65 72 70 72 65 74 20 74 68 65 20 74 65 78 74  terpret the text
c220: 75 61 6c 20 76 61 6c 75 65 20 61 73 20 74 68 65  ual value as the
c230: 20 63 6f 72 72 65 63 74 0d 0a 20 20 20 20 20 20   correct..      
c240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c250: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 74        //       t
c260: 79 70 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ype...          
c270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c280: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2a0: 20 20 69 66 20 28 4d 61 74 63 68 4f 70 74 69 6f    if (MatchOptio
c2b0: 6e 28 6e 65 77 41 72 67 2c 20 22 73 74 72 69 63  n(newArg, "stric
c2c0: 74 22 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  t"))..          
c2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2e0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
c2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c300: 20 20 20 20 20 62 6f 6f 6c 3f 20 76 61 6c 75 65       bool? value
c310: 20 3d 20 50 61 72 73 65 42 6f 6f 6c 65 61 6e 28   = ParseBoolean(
c320: 74 65 78 74 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  text);....      
c330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c340: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 76 61            if (va
c350: 6c 75 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  lue == null)..  
c360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
c380: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3a0: 20 20 20 20 20 65 72 72 6f 72 20 3d 20 54 72 61       error = Tra
c3b0: 63 65 4f 70 73 2e 54 72 61 63 65 28 0d 0a 20 20  ceOps.Trace(..  
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3e0: 20 20 20 20 20 20 54 72 61 63 65 50 72 69 6f 72        TracePrior
c3f0: 69 74 79 2e 4c 6f 77 65 73 74 2c 0d 0a 20 20 20  ity.Lowest,..   
c400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c420: 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61       traceCallba
c430: 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61  ck, String.Forma
c440: 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t(..            
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 20 20 20 20 20 20 20 20 20 20 20 20 22 49 6e 76              "Inv
c470: 61 6c 69 64 20 7b 30 7d 20 62 6f 6f 6c 65 61 6e  alid {0} boolean
c480: 20 76 61 6c 75 65 3a 20 7b 31 7d 22 2c 0d 0a 20   value: {1}",.. 
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4b0: 20 20 20 20 20 20 20 46 6f 72 44 69 73 70 6c 61         ForDispla
c4c0: 79 28 61 72 67 29 2c 20 46 6f 72 44 69 73 70 6c  y(arg), ForDispl
c4d0: 61 79 28 74 65 78 74 29 29 2c 0d 0a 20 20 20 20  ay(text)),..    
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c500: 20 20 20 20 74 72 61 63 65 43 61 74 65 67 6f 72      traceCategor
c510: 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  y);....         
c520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c530: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73             if (s
c540: 74 72 69 63 74 29 0d 0a 20 20 20 20 20 20 20 20  trict)..        
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c570: 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d  return false;...
c580: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5a0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a       continue;..
c5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5d0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
c5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5f0: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
c600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c610: 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45           // NOTE
c620: 3a 20 41 6c 6c 6f 77 20 74 68 65 20 63 6f 6d 6d  : Allow the comm
c630: 61 6e 64 20 6c 69 6e 65 20 61 72 67 75 6d 65 6e  and line argumen
c640: 74 73 20 74 6f 20 6f 76 65 72 72 69 64 65 0d 0a  ts to override..
c650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c670: 2f 2f 20 20 20 20 20 20 20 74 68 65 20 22 73 74  //       the "st
c680: 72 69 63 74 6e 65 73 73 22 20 73 65 74 74 69 6e  rictness" settin
c690: 67 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75  g provided by ou
c6a0: 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20  r caller...     
c6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
c6f0: 74 72 69 63 74 20 3d 20 28 62 6f 6f 6c 29 76 61  trict = (bool)va
c700: 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  lue;..          
c710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c720: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
c730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c740: 20 65 6c 73 65 20 69 66 20 28 4d 61 74 63 68 4f   else if (MatchO
c750: 70 74 69 6f 6e 28 6e 65 77 41 72 67 2c 20 22 6c  ption(newArg, "l
c760: 6f 67 46 69 6c 65 4e 61 6d 65 22 29 29 0d 0a 20  ogFileName")).. 
c770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c780: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
c790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
c7b0: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6c 6f 67 46  nfiguration.logF
c7c0: 69 6c 65 4e 61 6d 65 20 3d 20 74 65 78 74 3b 0d  ileName = text;.
c7d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c800: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
c810: 20 69 66 20 28 4d 61 74 63 68 4f 70 74 69 6f 6e   if (MatchOption
c820: 28 6e 65 77 41 72 67 2c 20 22 64 69 72 65 63 74  (newArg, "direct
c830: 6f 72 79 22 29 29 0d 0a 20 20 20 20 20 20 20 20  ory"))..        
c840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c850: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
c860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c870: 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61         configura
c880: 74 69 6f 6e 2e 64 69 72 65 63 74 6f 72 79 20 3d  tion.directory =
c890: 20 74 65 78 74 3b 0d 0a 0d 0a 20 20 20 20 20 20   text;....      
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8b0: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
c8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
c8e0: 20 4e 4f 54 45 3a 20 2a 53 50 45 43 49 41 4c 2a   NOTE: *SPECIAL*
c8f0: 20 4d 75 73 74 20 72 65 66 72 65 73 68 20 74 68   Must refresh th
c900: 65 20 66 69 6c 65 20 6e 61 6d 65 73 0d 0a 20 20  e file names..  
c910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
c930: 20 20 20 20 20 20 20 68 65 72 65 20 62 65 63 61         here beca
c940: 75 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  use the underlyi
c950: 6e 67 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  ng directory..  
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
c980: 20 20 20 20 20 20 20 68 61 73 20 63 68 61 6e 67         has chang
c990: 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ed...           
c9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9b0: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
c9e0: 63 6f 72 65 46 69 6c 65 4e 61 6d 65 20 3d 20 63  coreFileName = c
c9f0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 63 6f 72  onfiguration.cor
ca00: 65 46 69 6c 65 4e 61 6d 65 3b 0d 0a 0d 0a 20 20  eFileName;....  
ca10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
ca30: 20 28 21 53 74 72 69 6e 67 2e 49 73 4e 75 6c 6c   (!String.IsNull
ca40: 4f 72 45 6d 70 74 79 28 63 6f 72 65 46 69 6c 65  OrEmpty(coreFile
ca50: 4e 61 6d 65 29 29 0d 0a 20 20 20 20 20 20 20 20  Name))..        
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca70: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 72 65              core
ca80: 46 69 6c 65 4e 61 6d 65 20 3d 20 50 61 74 68 2e  FileName = Path.
ca90: 47 65 74 46 69 6c 65 4e 61 6d 65 28 63 6f 72 65  GetFileName(core
caa0: 46 69 6c 65 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20  FileName);....  
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
cad0: 20 28 53 74 72 69 6e 67 2e 49 73 4e 75 6c 6c 4f   (String.IsNullO
cae0: 72 45 6d 70 74 79 28 63 6f 72 65 46 69 6c 65 4e  rEmpty(coreFileN
caf0: 61 6d 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20  ame))..         
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb10: 20 20 20 20 20 20 20 20 20 20 20 63 6f 72 65 46             coreF
cb20: 69 6c 65 4e 61 6d 65 20 3d 20 49 6e 73 74 61 6c  ileName = Instal
cb30: 6c 65 72 2e 43 6f 72 65 46 69 6c 65 4e 61 6d 65  ler.CoreFileName
cb40: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb60: 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69       configurati
cb70: 6f 6e 2e 63 6f 72 65 46 69 6c 65 4e 61 6d 65 20  on.coreFileName 
cb80: 3d 20 50 61 74 68 2e 43 6f 6d 62 69 6e 65 28 0d  = Path.Combine(.
cb90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbb0: 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69       configurati
cbc0: 6f 6e 2e 64 69 72 65 63 74 6f 72 79 2c 20 63 6f  on.directory, co
cbd0: 72 65 46 69 6c 65 4e 61 6d 65 29 3b 0d 0a 0d 0a  reFileName);....
cbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc00: 73 74 72 69 6e 67 20 6c 69 6e 71 46 69 6c 65 4e  string linqFileN
cc10: 61 6d 65 20 3d 20 63 6f 6e 66 69 67 75 72 61 74  ame = configurat
cc20: 69 6f 6e 2e 6c 69 6e 71 46 69 6c 65 4e 61 6d 65  ion.linqFileName
cc30: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
cc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc50: 20 20 20 20 20 69 66 20 28 21 53 74 72 69 6e 67       if (!String
cc60: 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 6c  .IsNullOrEmpty(l
cc70: 69 6e 71 46 69 6c 65 4e 61 6d 65 29 29 0d 0a 20  inqFileName)).. 
cc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cca0: 20 20 20 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 20     linqFileName 
ccb0: 3d 20 50 61 74 68 2e 47 65 74 46 69 6c 65 4e 61  = Path.GetFileNa
ccc0: 6d 65 28 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 29  me(linqFileName)
ccd0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
cce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccf0: 20 20 20 20 20 69 66 20 28 53 74 72 69 6e 67 2e       if (String.
cd00: 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 6c 69  IsNullOrEmpty(li
cd10: 6e 71 46 69 6c 65 4e 61 6d 65 29 29 0d 0a 20 20  nqFileName))..  
cd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd40: 20 20 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 20 3d    linqFileName =
cd50: 20 49 6e 73 74 61 6c 6c 65 72 2e 4c 69 6e 71 46   Installer.LinqF
cd60: 69 6c 65 4e 61 6d 65 3b 0d 0a 0d 0a 20 20 20 20  ileName;....    
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66              conf
cd90: 69 67 75 72 61 74 69 6f 6e 2e 6c 69 6e 71 46 69  iguration.linqFi
cda0: 6c 65 4e 61 6d 65 20 3d 20 50 61 74 68 2e 43 6f  leName = Path.Co
cdb0: 6d 62 69 6e 65 28 0d 0a 20 20 20 20 20 20 20 20  mbine(..        
cdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdd0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66              conf
cde0: 69 67 75 72 61 74 69 6f 6e 2e 64 69 72 65 63 74  iguration.direct
cdf0: 6f 72 79 2c 20 6c 69 6e 71 46 69 6c 65 4e 61 6d  ory, linqFileNam
ce00: 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e);....         
ce10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce20: 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 64 65         string de
ce30: 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65 20 3d  signerFileName =
ce40: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 64   configuration.d
ce50: 65 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65 3b  esignerFileName;
ce60: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce80: 20 20 20 20 69 66 20 28 21 53 74 72 69 6e 67 2e      if (!String.
ce90: 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 64 65  IsNullOrEmpty(de
cea0: 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65 29 29  signerFileName))
ceb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ced0: 20 20 20 20 20 20 64 65 73 69 67 6e 65 72 46 69        designerFi
cee0: 6c 65 4e 61 6d 65 20 3d 20 50 61 74 68 2e 47 65  leName = Path.Ge
cef0: 74 46 69 6c 65 4e 61 6d 65 28 64 65 73 69 67 6e  tFileName(design
cf00: 65 72 46 69 6c 65 4e 61 6d 65 29 3b 0d 0a 0d 0a  erFileName);....
cf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf30: 69 66 20 28 53 74 72 69 6e 67 2e 49 73 4e 75 6c  if (String.IsNul
cf40: 6c 4f 72 45 6d 70 74 79 28 64 65 73 69 67 6e 65  lOrEmpty(designe
cf50: 72 46 69 6c 65 4e 61 6d 65 29 29 0d 0a 20 20 20  rFileName))..   
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf80: 20 64 65 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d   designerFileNam
cf90: 65 20 3d 20 49 6e 73 74 61 6c 6c 65 72 2e 44 65  e = Installer.De
cfa0: 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65 3b 0d  signerFileName;.
cfb0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
cfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfd0: 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e     configuration
cfe0: 2e 64 65 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d  .designerFileNam
cff0: 65 20 3d 20 50 61 74 68 2e 43 6f 6d 62 69 6e 65  e = Path.Combine
d000: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d020: 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61         configura
d030: 74 69 6f 6e 2e 64 69 72 65 63 74 6f 72 79 2c 20  tion.directory, 
d040: 64 65 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65  designerFileName
d050: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
d060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d070: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
d080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
d090: 6c 73 65 20 69 66 20 28 4d 61 74 63 68 4f 70 74  lse if (MatchOpt
d0a0: 69 6f 6e 28 6e 65 77 41 72 67 2c 20 22 63 6f 72  ion(newArg, "cor
d0b0: 65 46 69 6c 65 4e 61 6d 65 22 29 29 0d 0a 20 20  eFileName"))..  
d0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0d0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
d0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
d100: 66 69 67 75 72 61 74 69 6f 6e 2e 63 6f 72 65 46  figuration.coreF
d110: 69 6c 65 4e 61 6d 65 20 3d 20 74 65 78 74 3b 0d  ileName = text;.
d120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d130: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
d140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d150: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
d160: 20 69 66 20 28 4d 61 74 63 68 4f 70 74 69 6f 6e   if (MatchOption
d170: 28 6e 65 77 41 72 67 2c 20 22 6c 69 6e 71 46 69  (newArg, "linqFi
d180: 6c 65 4e 61 6d 65 22 29 29 0d 0a 20 20 20 20 20  leName"))..     
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1a0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1c0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69 67            config
d1d0: 75 72 61 74 69 6f 6e 2e 6c 69 6e 71 46 69 6c 65  uration.linqFile
d1e0: 4e 61 6d 65 20 3d 20 74 65 78 74 3b 0d 0a 20 20  Name = text;..  
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d200: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
d210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d220: 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66           else if
d230: 20 28 4d 61 74 63 68 4f 70 74 69 6f 6e 28 6e 65   (MatchOption(ne
d240: 77 41 72 67 2c 20 22 64 65 73 69 67 6e 65 72 46  wArg, "designerF
d250: 69 6c 65 4e 61 6d 65 22 29 29 0d 0a 20 20 20 20  ileName"))..    
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
d280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d290: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69             confi
d2a0: 67 75 72 61 74 69 6f 6e 2e 64 65 73 69 67 6e 65  guration.designe
d2b0: 72 46 69 6c 65 4e 61 6d 65 20 3d 20 74 65 78 74  rFileName = text
d2c0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
d2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
d2e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c                el
d300: 73 65 20 69 66 20 28 4d 61 74 63 68 4f 70 74 69  se if (MatchOpti
d310: 6f 6e 28 6e 65 77 41 72 67 2c 20 22 74 72 61 63  on(newArg, "trac
d320: 65 50 72 69 6f 72 69 74 79 22 29 29 0d 0a 20 20  ePriority"))..  
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d340: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a               obj
d370: 65 63 74 20 76 61 6c 75 65 20 3d 20 50 61 72 73  ect value = Pars
d380: 65 45 6e 75 6d 28 0d 0a 20 20 20 20 20 20 20 20  eEnum(..        
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3a0: 20 20 20 20 20 20 20 20 20 20 20 20 74 79 70 65              type
d3b0: 6f 66 28 54 72 61 63 65 50 72 69 6f 72 69 74 79  of(TracePriority
d3c0: 29 2c 20 74 65 78 74 2c 20 74 72 75 65 29 3b 0d  ), text, true);.
d3d0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3f0: 20 20 20 69 66 20 28 76 61 6c 75 65 20 3d 3d 20     if (value == 
d400: 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
d410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d420: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
d430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
d450: 72 6f 72 20 3d 20 54 72 61 63 65 4f 70 73 2e 54  ror = TraceOps.T
d460: 72 61 63 65 28 0d 0a 20 20 20 20 20 20 20 20 20  race(..         
d470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
d490: 72 61 63 65 50 72 69 6f 72 69 74 79 2e 4c 6f 77  racePriority.Low
d4a0: 65 73 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  est,..          
d4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
d4d0: 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72  aceCallback, Str
d4e0: 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20  ing.Format(..   
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d510: 20 20 20 20 20 22 49 6e 76 61 6c 69 64 20 74 72       "Invalid tr
d520: 61 63 65 20 70 72 69 6f 72 69 74 79 20 76 61 6c  ace priority val
d530: 75 65 3a 20 7b 30 7d 22 2c 0d 0a 20 20 20 20 20  ue: {0}",..     
d540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d560: 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28 74 65     ForDisplay(te
d570: 78 74 29 29 2c 20 74 72 61 63 65 43 61 74 65 67  xt)), traceCateg
d580: 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ory);....       
d590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
d5b0: 28 73 74 72 69 63 74 29 0d 0a 20 20 20 20 20 20  (strict)..      
d5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5e0: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d    return false;.
d5f0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d610: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
d620: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d640: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
d650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d660: 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61         configura
d670: 74 69 6f 6e 2e 74 72 61 63 65 50 72 69 6f 72 69  tion.tracePriori
d680: 74 79 20 3d 20 28 54 72 61 63 65 50 72 69 6f 72  ty = (TracePrior
d690: 69 74 79 29 76 61 6c 75 65 3b 0d 0a 20 20 20 20  ity)value;..    
d6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63              Trac
d6c0: 65 4f 70 73 2e 54 72 61 63 65 50 72 69 6f 72 69  eOps.TracePriori
d6d0: 74 79 20 3d 20 63 6f 6e 66 69 67 75 72 61 74 69  ty = configurati
d6e0: 6f 6e 2e 74 72 61 63 65 50 72 69 6f 72 69 74 79  on.tracePriority
d6f0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
d700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
d710: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c                el
d730: 73 65 20 69 66 20 28 4d 61 74 63 68 4f 70 74 69  se if (MatchOpti
d740: 6f 6e 28 6e 65 77 41 72 67 2c 20 22 69 6e 73 74  on(newArg, "inst
d750: 61 6c 6c 46 6c 61 67 73 22 29 29 0d 0a 20 20 20  allFlags"))..   
d760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d770: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
d780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d790: 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
d7a0: 63 74 20 76 61 6c 75 65 20 3d 20 50 61 72 73 65  ct value = Parse
d7b0: 45 6e 75 6d 28 0d 0a 20 20 20 20 20 20 20 20 20  Enum(..         
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 20 20 20 20 20 20 20 20 20 20 20 74 79 70 65 6f             typeo
d7e0: 66 28 49 6e 73 74 61 6c 6c 46 6c 61 67 73 29 2c  f(InstallFlags),
d7f0: 20 74 65 78 74 2c 20 74 72 75 65 29 3b 0d 0a 0d   text, true);...
d800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d820: 20 69 66 20 28 76 61 6c 75 65 20 3d 3d 20 6e 75   if (value == nu
d830: 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
d840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d850: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
d860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d870: 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
d880: 72 20 3d 20 54 72 61 63 65 4f 70 73 2e 54 72 61  r = TraceOps.Tra
d890: 63 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ce(..           
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61               Tra
d8c0: 63 65 50 72 69 6f 72 69 74 79 2e 4c 6f 77 65 73  cePriority.Lowes
d8d0: 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t,..            
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63              trac
d900: 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e  eCallback, Strin
d910: 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20  g.Format(..     
d920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d940: 20 20 20 22 49 6e 76 61 6c 69 64 20 69 6e 73 74     "Invalid inst
d950: 61 6c 6c 20 66 6c 61 67 73 20 76 61 6c 75 65 3a  all flags value:
d960: 20 7b 30 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20   {0}",..        
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d990: 46 6f 72 44 69 73 70 6c 61 79 28 74 65 78 74 29  ForDisplay(text)
d9a0: 29 2c 20 74 72 61 63 65 43 61 74 65 67 6f 72 79  ), traceCategory
d9b0: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
d9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9d0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73 74            if (st
d9e0: 72 69 63 74 29 0d 0a 20 20 20 20 20 20 20 20 20  rict)..         
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
da10: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a  eturn false;....
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da40: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20      continue;.. 
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
da70: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da90: 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f      configuratio
daa0: 6e 2e 69 6e 73 74 61 6c 6c 46 6c 61 67 73 20 3d  n.installFlags =
dab0: 20 28 49 6e 73 74 61 6c 6c 46 6c 61 67 73 29 76   (InstallFlags)v
dac0: 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alue;..         
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dae0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db00: 20 20 65 6c 73 65 20 69 66 20 28 4d 61 74 63 68    else if (Match
db10: 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67 2c 20 22  Option(newArg, "
db20: 69 6e 73 74 61 6c 6c 22 29 29 0d 0a 20 20 20 20  install"))..    
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db40: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
db50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db60: 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 3f             bool?
db70: 20 76 61 6c 75 65 20 3d 20 50 61 72 73 65 42 6f   value = ParseBo
db80: 6f 6c 65 61 6e 28 74 65 78 74 29 3b 0d 0a 0d 0a  olean(text);....
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbb0: 69 66 20 28 76 61 6c 75 65 20 3d 3d 20 6e 75 6c  if (value == nul
dbc0: 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbe0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc00: 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
dc10: 20 3d 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63   = TraceOps.Trac
dc20: 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e(..            
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63              Trac
dc50: 65 50 72 69 6f 72 69 74 79 2e 4c 6f 77 65 73 74  ePriority.Lowest
dc60: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc80: 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65             trace
dc90: 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67  Callback, String
dca0: 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20  .Format(..      
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcd0: 20 20 22 49 6e 76 61 6c 69 64 20 7b 30 7d 20 62    "Invalid {0} b
dce0: 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20 7b 31  oolean value: {1
dcf0: 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }",..           
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 6f 72               For
dd20: 44 69 73 70 6c 61 79 28 61 72 67 29 2c 20 46 6f  Display(arg), Fo
dd30: 72 44 69 73 70 6c 61 79 28 74 65 78 74 29 29 2c  rDisplay(text)),
dd40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd60: 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43            traceC
dd70: 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20  ategory);....   
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dda0: 20 69 66 20 28 73 74 72 69 63 74 29 0d 0a 20 20   if (strict)..  
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
dde0: 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  se;....         
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
de10: 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  nue;..          
de20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de30: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de50: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69             confi
de60: 67 75 72 61 74 69 6f 6e 2e 69 6e 73 74 61 6c 6c  guration.install
de70: 20 3d 20 28 62 6f 6f 6c 29 76 61 6c 75 65 3b 0d   = (bool)value;.
de80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
de90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
dec0: 20 69 66 20 28 4d 61 74 63 68 4f 70 74 69 6f 6e   if (MatchOption
ded0: 28 6e 65 77 41 72 67 2c 20 22 77 68 61 74 49 66  (newArg, "whatIf
dee0: 22 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  "))..           
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df00: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
df10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df20: 20 20 20 20 62 6f 6f 6c 3f 20 76 61 6c 75 65 20      bool? value 
df30: 3d 20 50 61 72 73 65 42 6f 6f 6c 65 61 6e 28 74  = ParseBoolean(t
df40: 65 78 74 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ext);....       
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df60: 20 20 20 20 20 20 20 20 20 69 66 20 28 76 61 6c           if (val
df70: 75 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  ue == null)..   
df80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfc0: 20 20 20 20 65 72 72 6f 72 20 3d 20 54 72 61 63      error = Trac
dfd0: 65 4f 70 73 2e 54 72 61 63 65 28 0d 0a 20 20 20  eOps.Trace(..   
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e000: 20 20 20 20 20 54 72 61 63 65 50 72 69 6f 72 69       TracePriori
e010: 74 79 2e 4c 6f 77 65 73 74 2c 0d 0a 20 20 20 20  ty.Lowest,..    
e020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e040: 20 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61 63      traceCallbac
e050: 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74  k, String.Format
e060: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
e070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e080: 20 20 20 20 20 20 20 20 20 20 20 22 49 6e 76 61             "Inva
e090: 6c 69 64 20 7b 30 7d 20 62 6f 6f 6c 65 61 6e 20  lid {0} boolean 
e0a0: 76 61 6c 75 65 3a 20 7b 31 7d 22 2c 0d 0a 20 20  value: {1}",..  
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0d0: 20 20 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79        ForDisplay
e0e0: 28 61 72 67 29 2c 20 46 6f 72 44 69 73 70 6c 61  (arg), ForDispla
e0f0: 79 28 74 65 78 74 29 29 2c 0d 0a 20 20 20 20 20  y(text)),..     
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e120: 20 20 20 74 72 61 63 65 43 61 74 65 67 6f 72 79     traceCategory
e130: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e150: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73 74            if (st
e160: 72 69 63 74 29 0d 0a 20 20 20 20 20 20 20 20 20  rict)..         
e170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
e190: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a  eturn false;....
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1c0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20      continue;.. 
e1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
e1f0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e210: 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f      configuratio
e220: 6e 2e 77 68 61 74 49 66 20 3d 20 28 62 6f 6f 6c  n.whatIf = (bool
e230: 29 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20  )value;..       
e240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e250: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
e260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e270: 20 20 20 20 65 6c 73 65 20 69 66 20 28 4d 61 74      else if (Mat
e280: 63 68 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67 2c  chOption(newArg,
e290: 20 22 76 65 72 62 6f 73 65 22 29 29 0d 0a 20 20   "verbose"))..  
e2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2b0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f               boo
e2e0: 6c 3f 20 76 61 6c 75 65 20 3d 20 50 61 72 73 65  l? value = Parse
e2f0: 42 6f 6f 6c 65 61 6e 28 74 65 78 74 29 3b 0d 0a  Boolean(text);..
e300: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e320: 20 20 69 66 20 28 76 61 6c 75 65 20 3d 3d 20 6e    if (value == n
e330: 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e350: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
e360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e370: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
e380: 6f 72 20 3d 20 54 72 61 63 65 4f 70 73 2e 54 72  or = TraceOps.Tr
e390: 61 63 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ace(..          
e3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72                Tr
e3c0: 61 63 65 50 72 69 6f 72 69 74 79 2e 4c 6f 77 65  acePriority.Lowe
e3d0: 73 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  st,..           
e3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61               tra
e400: 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69  ceCallback, Stri
e410: 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20  ng.Format(..    
e420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e440: 20 20 20 20 22 49 6e 76 61 6c 69 64 20 7b 30 7d      "Invalid {0}
e450: 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20   boolean value: 
e460: 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20  {1}",..         
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
e490: 6f 72 44 69 73 70 6c 61 79 28 61 72 67 29 2c 20  orDisplay(arg), 
e4a0: 46 6f 72 44 69 73 70 6c 61 79 28 74 65 78 74 29  ForDisplay(text)
e4b0: 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ),..            
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63              trac
e4e0: 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20  eCategory);.... 
e4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e510: 20 20 20 69 66 20 28 73 74 72 69 63 74 29 0d 0a     if (strict)..
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e540: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
e550: 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  alse;....       
e560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
e580: 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20  tinue;..        
e590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5a0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
e5d0: 66 69 67 75 72 61 74 69 6f 6e 2e 76 65 72 62 6f  figuration.verbo
e5e0: 73 65 20 3d 20 28 62 6f 6f 6c 29 76 61 6c 75 65  se = (bool)value
e5f0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
e600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
e610: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c                el
e630: 73 65 20 69 66 20 28 4d 61 74 63 68 4f 70 74 69  se if (MatchOpti
e640: 6f 6e 28 6e 65 77 41 72 67 2c 20 22 63 6f 6e 66  on(newArg, "conf
e650: 69 72 6d 22 29 29 0d 0a 20 20 20 20 20 20 20 20  irm"))..        
e660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e670: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
e680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e690: 20 20 20 20 20 20 20 62 6f 6f 6c 3f 20 76 61 6c         bool? val
e6a0: 75 65 20 3d 20 50 61 72 73 65 42 6f 6f 6c 65 61  ue = ParseBoolea
e6b0: 6e 28 74 65 78 74 29 3b 0d 0a 0d 0a 20 20 20 20  n(text);....    
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
e6e0: 76 61 6c 75 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a  value == null)..
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e710: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
e720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e730: 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 54         error = T
e740: 72 61 63 65 4f 70 73 2e 54 72 61 63 65 28 0d 0a  raceOps.Trace(..
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e770: 20 20 20 20 20 20 20 20 54 72 61 63 65 50 72 69          TracePri
e780: 6f 72 69 74 79 2e 4c 6f 77 65 73 74 2c 0d 0a 20  ority.Lowest,.. 
e790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7b0: 20 20 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c         traceCall
e7c0: 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72  back, String.For
e7d0: 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  mat(..          
e7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49                "I
e800: 6e 76 61 6c 69 64 20 7b 30 7d 20 62 6f 6f 6c 65  nvalid {0} boole
e810: 61 6e 20 76 61 6c 75 65 3a 20 7b 31 7d 22 2c 0d  an value: {1}",.
e820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e840: 20 20 20 20 20 20 20 20 20 46 6f 72 44 69 73 70           ForDisp
e850: 6c 61 79 28 61 72 67 29 2c 20 46 6f 72 44 69 73  lay(arg), ForDis
e860: 70 6c 61 79 28 74 65 78 74 29 29 2c 0d 0a 20 20  play(text)),..  
e870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e890: 20 20 20 20 20 20 74 72 61 63 65 43 61 74 65 67        traceCateg
e8a0: 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ory);....       
e8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
e8d0: 28 73 74 72 69 63 74 29 0d 0a 20 20 20 20 20 20  (strict)..      
e8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e900: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d    return false;.
e910: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
e920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e930: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
e940: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e960: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
e970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e980: 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61         configura
e990: 74 69 6f 6e 2e 63 6f 6e 66 69 72 6d 20 3d 20 28  tion.confirm = (
e9a0: 62 6f 6f 6c 29 76 61 6c 75 65 3b 0d 0a 20 20 20  bool)value;..   
e9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9c0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9e0: 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 20          else if 
e9f0: 28 4d 61 74 63 68 4f 70 74 69 6f 6e 28 6e 65 77  (MatchOption(new
ea00: 41 72 67 2c 20 22 6e 6f 44 65 73 6b 74 6f 70 22  Arg, "noDesktop"
ea10: 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
ea20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea30: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
ea40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea50: 20 20 20 62 6f 6f 6c 3f 20 76 61 6c 75 65 20 3d     bool? value =
ea60: 20 50 61 72 73 65 42 6f 6f 6c 65 61 6e 28 74 65   ParseBoolean(te
ea70: 78 74 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  xt);....        
ea80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea90: 20 20 20 20 20 20 20 20 69 66 20 28 76 61 6c 75          if (valu
eaa0: 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  e == null)..    
eab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
ead0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eaf0: 20 20 20 65 72 72 6f 72 20 3d 20 54 72 61 63 65     error = Trace
eb00: 4f 70 73 2e 54 72 61 63 65 28 0d 0a 20 20 20 20  Ops.Trace(..    
eb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb30: 20 20 20 20 54 72 61 63 65 50 72 69 6f 72 69 74      TracePriorit
eb40: 79 2e 4c 6f 77 65 73 74 2c 0d 0a 20 20 20 20 20  y.Lowest,..     
eb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb70: 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b     traceCallback
eb80: 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  , String.Format(
eb90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
eba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebb0: 20 20 20 20 20 20 20 20 20 20 22 49 6e 76 61 6c            "Inval
ebc0: 69 64 20 7b 30 7d 20 62 6f 6f 6c 65 61 6e 20 76  id {0} boolean v
ebd0: 61 6c 75 65 3a 20 7b 31 7d 22 2c 0d 0a 20 20 20  alue: {1}",..   
ebe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec00: 20 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28       ForDisplay(
ec10: 61 72 67 29 2c 20 46 6f 72 44 69 73 70 6c 61 79  arg), ForDisplay
ec20: 28 74 65 78 74 29 29 2c 0d 0a 20 20 20 20 20 20  (text)),..      
ec30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec50: 20 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29    traceCategory)
ec60: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec80: 20 20 20 20 20 20 20 20 20 69 66 20 28 73 74 72           if (str
ec90: 69 63 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ict)..          
eca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
ecc0: 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20  turn false;.... 
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ece0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecf0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20     continue;..  
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
ed20: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
ed30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed40: 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e     configuration
ed50: 2e 6e 6f 44 65 73 6b 74 6f 70 20 3d 20 28 62 6f  .noDesktop = (bo
ed60: 6f 6c 29 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20  ol)value;..     
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed80: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
ed90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eda0: 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 4d        else if (M
edb0: 61 74 63 68 4f 70 74 69 6f 6e 28 6e 65 77 41 72  atchOption(newAr
edc0: 67 2c 20 22 6e 6f 43 6f 6d 70 61 63 74 22 29 29  g, "noCompact"))
edd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ede0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
edf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee10: 20 62 6f 6f 6c 3f 20 76 61 6c 75 65 20 3d 20 50   bool? value = P
ee20: 61 72 73 65 42 6f 6f 6c 65 61 6e 28 74 65 78 74  arseBoolean(text
ee30: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
ee40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee50: 20 20 20 20 20 20 69 66 20 28 76 61 6c 75 65 20        if (value 
ee60: 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
ee70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee80: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
ee90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eeb0: 20 65 72 72 6f 72 20 3d 20 54 72 61 63 65 4f 70   error = TraceOp
eec0: 73 2e 54 72 61 63 65 28 0d 0a 20 20 20 20 20 20  s.Trace(..      
eed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eef0: 20 20 54 72 61 63 65 50 72 69 6f 72 69 74 79 2e    TracePriority.
ef00: 4c 6f 77 65 73 74 2c 0d 0a 20 20 20 20 20 20 20  Lowest,..       
ef10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef30: 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20   traceCallback, 
ef40: 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a  String.Format(..
ef50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef70: 20 20 20 20 20 20 20 20 22 49 6e 76 61 6c 69 64          "Invalid
ef80: 20 7b 30 7d 20 62 6f 6f 6c 65 61 6e 20 76 61 6c   {0} boolean val
ef90: 75 65 3a 20 7b 31 7d 22 2c 0d 0a 20 20 20 20 20  ue: {1}",..     
efa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efc0: 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28 61 72     ForDisplay(ar
efd0: 67 29 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 74  g), ForDisplay(t
efe0: 65 78 74 29 29 2c 0d 0a 20 20 20 20 20 20 20 20  ext)),..        
eff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f010: 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d  traceCategory);.
f020: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
f030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f040: 20 20 20 20 20 20 20 69 66 20 28 73 74 72 69 63         if (stric
f050: 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f070: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
f080: 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20  rn false;....   
f090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0b0: 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20   continue;..    
f0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0d0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
f0e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f100: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6e   configuration.n
f110: 6f 43 6f 6d 70 61 63 74 20 3d 20 28 62 6f 6f 6c  oCompact = (bool
f120: 29 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20  )value;..       
f130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f140: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
f150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f160: 20 20 20 20 65 6c 73 65 20 69 66 20 28 4d 61 74      else if (Mat
f170: 63 68 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67 2c  chOption(newArg,
f180: 20 22 6e 6f 4e 65 74 46 78 32 30 22 29 29 0d 0a   "noNetFx20"))..
f190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
f1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
f1d0: 6f 6f 6c 3f 20 76 61 6c 75 65 20 3d 20 50 61 72  ool? value = Par
f1e0: 73 65 42 6f 6f 6c 65 61 6e 28 74 65 78 74 29 3b  seBoolean(text);
f1f0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
f200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f210: 20 20 20 20 69 66 20 28 76 61 6c 75 65 20 3d 3d      if (value ==
f220: 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
f230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f240: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
f250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
f270: 72 72 6f 72 20 3d 20 54 72 61 63 65 4f 70 73 2e  rror = TraceOps.
f280: 54 72 61 63 65 28 0d 0a 20 20 20 20 20 20 20 20  Trace(..        
f290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2b0: 54 72 61 63 65 50 72 69 6f 72 69 74 79 2e 4c 6f  TracePriority.Lo
f2c0: 77 65 73 74 2c 0d 0a 20 20 20 20 20 20 20 20 20  west,..         
f2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
f2f0: 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74  raceCallback, St
f300: 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20  ring.Format(..  
f310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f330: 20 20 20 20 20 20 22 49 6e 76 61 6c 69 64 20 7b        "Invalid {
f340: 30 7d 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65  0} boolean value
f350: 3a 20 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20  : {1}",..       
f360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f380: 20 46 6f 72 44 69 73 70 6c 61 79 28 61 72 67 29   ForDisplay(arg)
f390: 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 74 65 78  , ForDisplay(tex
f3a0: 74 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  t)),..          
f3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
f3d0: 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d  aceCategory);...
f3e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f400: 20 20 20 20 20 69 66 20 28 73 74 72 69 63 74 29       if (strict)
f410: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f430: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
f440: 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20   false;....     
f450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
f470: 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20  ontinue;..      
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f490: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
f4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
f4c0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6e 6f 4e  onfiguration.noN
f4d0: 65 74 46 78 32 30 20 3d 20 28 62 6f 6f 6c 29 76  etFx20 = (bool)v
f4e0: 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alue;..         
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f500: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f520: 20 20 65 6c 73 65 20 69 66 20 28 4d 61 74 63 68    else if (Match
f530: 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67 2c 20 22  Option(newArg, "
f540: 6e 6f 4e 65 74 46 78 34 30 22 29 29 0d 0a 20 20  noNetFx40"))..  
f550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f560: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
f570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f               boo
f590: 6c 3f 20 76 61 6c 75 65 20 3d 20 50 61 72 73 65  l? value = Parse
f5a0: 42 6f 6f 6c 65 61 6e 28 74 65 78 74 29 3b 0d 0a  Boolean(text);..
f5b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5d0: 20 20 69 66 20 28 76 61 6c 75 65 20 3d 3d 20 6e    if (value == n
f5e0: 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f600: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
f610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f620: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
f630: 6f 72 20 3d 20 54 72 61 63 65 4f 70 73 2e 54 72  or = TraceOps.Tr
f640: 61 63 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ace(..          
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72                Tr
f670: 61 63 65 50 72 69 6f 72 69 74 79 2e 4c 6f 77 65  acePriority.Lowe
f680: 73 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  st,..           
f690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61               tra
f6b0: 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69  ceCallback, Stri
f6c0: 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20  ng.Format(..    
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6f0: 20 20 20 20 22 49 6e 76 61 6c 69 64 20 7b 30 7d      "Invalid {0}
f700: 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20   boolean value: 
f710: 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20  {1}",..         
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
f740: 6f 72 44 69 73 70 6c 61 79 28 61 72 67 29 2c 20  orDisplay(arg), 
f750: 46 6f 72 44 69 73 70 6c 61 79 28 74 65 78 74 29  ForDisplay(text)
f760: 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ),..            
f770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f780: 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63              trac
f790: 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20  eCategory);.... 
f7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7c0: 20 20 20 69 66 20 28 73 74 72 69 63 74 29 0d 0a     if (strict)..
f7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
f800: 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  alse;....       
f810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f820: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
f830: 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20  tinue;..        
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f850: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f870: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
f880: 66 69 67 75 72 61 74 69 6f 6e 2e 6e 6f 4e 65 74  figuration.noNet
f890: 46 78 34 30 20 3d 20 28 62 6f 6f 6c 29 76 61 6c  Fx40 = (bool)val
f8a0: 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue;..           
f8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8c0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
f8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8e0: 65 6c 73 65 20 69 66 20 28 4d 61 74 63 68 4f 70  else if (MatchOp
f8f0: 74 69 6f 6e 28 6e 65 77 41 72 67 2c 20 22 6e 6f  tion(newArg, "no
f900: 56 73 32 30 30 38 22 29 29 0d 0a 20 20 20 20 20  Vs2008"))..     
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f920: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
f930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f940: 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 3f 20            bool? 
f950: 76 61 6c 75 65 20 3d 20 50 61 72 73 65 42 6f 6f  value = ParseBoo
f960: 6c 65 61 6e 28 74 65 78 74 29 3b 0d 0a 0d 0a 20  lean(text);.... 
f970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
f990: 66 20 28 76 61 6c 75 65 20 3d 3d 20 6e 75 6c 6c  f (value == null
f9a0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9c0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
f9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9e0: 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20            error 
f9f0: 3d 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63 65  = TraceOps.Trace
fa00: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
fa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa20: 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65             Trace
fa30: 50 72 69 6f 72 69 74 79 2e 4c 6f 77 65 73 74 2c  Priority.Lowest,
fa40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
fa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa60: 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43            traceC
fa70: 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e  allback, String.
fa80: 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20  Format(..       
fa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fab0: 20 22 49 6e 76 61 6c 69 64 20 7b 30 7d 20 62 6f   "Invalid {0} bo
fac0: 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20 7b 31 7d  olean value: {1}
fad0: 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ",..            
fae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
faf0: 20 20 20 20 20 20 20 20 20 20 20 20 46 6f 72 44              ForD
fb00: 69 73 70 6c 61 79 28 61 72 67 29 2c 20 46 6f 72  isplay(arg), For
fb10: 44 69 73 70 6c 61 79 28 74 65 78 74 29 29 2c 0d  Display(text)),.
fb20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb40: 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61           traceCa
fb50: 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20  tegory);....    
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb80: 69 66 20 28 73 74 72 69 63 74 29 0d 0a 20 20 20  if (strict)..   
fb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbb0: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
fbc0: 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e;....          
fbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbe0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
fbf0: 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue;..           
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc10: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
fc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc30: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69 67            config
fc40: 75 72 61 74 69 6f 6e 2e 6e 6f 56 73 32 30 30 38  uration.noVs2008
fc50: 20 3d 20 28 62 6f 6f 6c 29 76 61 6c 75 65 3b 0d   = (bool)value;.
fc60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc90: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
fca0: 20 69 66 20 28 4d 61 74 63 68 4f 70 74 69 6f 6e   if (MatchOption
fcb0: 28 6e 65 77 41 72 67 2c 20 22 6e 6f 56 73 32 30  (newArg, "noVs20
fcc0: 31 30 22 29 29 0d 0a 20 20 20 20 20 20 20 20 20  10"))..         
fcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fce0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
fcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd00: 20 20 20 20 20 20 62 6f 6f 6c 3f 20 76 61 6c 75        bool? valu
fd10: 65 20 3d 20 50 61 72 73 65 42 6f 6f 6c 65 61 6e  e = ParseBoolean
fd20: 28 74 65 78 74 29 3b 0d 0a 0d 0a 20 20 20 20 20  (text);....     
fd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd40: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 76             if (v
fd50: 61 6c 75 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20  alue == null).. 
fd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
fd80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
fd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fda0: 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 54 72        error = Tr
fdb0: 61 63 65 4f 70 73 2e 54 72 61 63 65 28 0d 0a 20  aceOps.Trace(.. 
fdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fde0: 20 20 20 20 20 20 20 54 72 61 63 65 50 72 69 6f         TracePrio
fdf0: 72 69 74 79 2e 4c 6f 77 65 73 74 2c 0d 0a 20 20  rity.Lowest,..  
fe00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe20: 20 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c 62        traceCallb
fe30: 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d  ack, String.Form
fe40: 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  at(..           
fe50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe60: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49 6e               "In
fe70: 76 61 6c 69 64 20 7b 30 7d 20 62 6f 6f 6c 65 61  valid {0} boolea
fe80: 6e 20 76 61 6c 75 65 3a 20 7b 31 7d 22 2c 0d 0a  n value: {1}",..
fe90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
feb0: 20 20 20 20 20 20 20 20 46 6f 72 44 69 73 70 6c          ForDispl
fec0: 61 79 28 61 72 67 29 2c 20 46 6f 72 44 69 73 70  ay(arg), ForDisp
fed0: 6c 61 79 28 74 65 78 74 29 29 2c 0d 0a 20 20 20  lay(text)),..   
fee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff00: 20 20 20 20 20 74 72 61 63 65 43 61 74 65 67 6f       traceCatego
ff10: 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ry);....        
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff30: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
ff40: 73 74 72 69 63 74 29 0d 0a 20 20 20 20 20 20 20  strict)..       
ff50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff70: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a   return false;..
ff80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ff90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffa0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d        continue;.
ffb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ffc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffd0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
ffe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fff0: 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74        configurat
10000 69 6f 6e 2e 6e 6f 56 73 32 30 31 30 20 3d 20 28  ion.noVs2010 = (
10010 62 6f 6f 6c 29 76 61 6c 75 65 3b 0d 0a 20 20 20  bool)value;..   
10020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10030 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10050 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 20          else if 
10060 28 4d 61 74 63 68 4f 70 74 69 6f 6e 28 6e 65 77  (MatchOption(new
10070 41 72 67 2c 20 22 6e 6f 54 72 61 63 65 22 29 29  Arg, "noTrace"))
10080 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
100a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
100b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100c0 20 62 6f 6f 6c 3f 20 76 61 6c 75 65 20 3d 20 50   bool? value = P
100d0 61 72 73 65 42 6f 6f 6c 65 61 6e 28 74 65 78 74  arseBoolean(text
100e0 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
100f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10100 20 20 20 20 20 20 69 66 20 28 76 61 6c 75 65 20        if (value 
10110 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
10120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10130 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
10140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10160 20 65 72 72 6f 72 20 3d 20 54 72 61 63 65 4f 70   error = TraceOp
10170 73 2e 54 72 61 63 65 28 0d 0a 20 20 20 20 20 20  s.Trace(..      
10180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101a0 20 20 54 72 61 63 65 50 72 69 6f 72 69 74 79 2e    TracePriority.
101b0 4c 6f 77 65 73 74 2c 0d 0a 20 20 20 20 20 20 20  Lowest,..       
101c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101e0 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20   traceCallback, 
101f0 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a  String.Format(..
10200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10220 20 20 20 20 20 20 20 20 22 49 6e 76 61 6c 69 64          "Invalid
10230 20 7b 30 7d 20 62 6f 6f 6c 65 61 6e 20 76 61 6c   {0} boolean val
10240 75 65 3a 20 7b 31 7d 22 2c 0d 0a 20 20 20 20 20  ue: {1}",..     
10250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10270 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28 61 72     ForDisplay(ar
10280 67 29 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 74  g), ForDisplay(t
10290 65 78 74 29 29 2c 0d 0a 20 20 20 20 20 20 20 20  ext)),..        
102a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102c0 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d  traceCategory);.
102d0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
102e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102f0 20 20 20 20 20 20 20 69 66 20 28 73 74 72 69 63         if (stric
10300 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
10310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10320 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
10330 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20  rn false;....   
10340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10360 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20   continue;..    
10370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10380 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
10390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
103a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103b0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6e   configuration.n
103c0 6f 54 72 61 63 65 20 3d 20 28 62 6f 6f 6c 29 76  oTrace = (bool)v
103d0 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alue;..         
103e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103f0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
10400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10410 20 20 65 6c 73 65 20 69 66 20 28 4d 61 74 63 68    else if (Match
10420 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67 2c 20 22  Option(newArg, "
10430 6e 6f 43 6f 6e 73 6f 6c 65 22 29 29 0d 0a 20 20  noConsole"))..  
10440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10450 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
10460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10470 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f               boo
10480 6c 3f 20 76 61 6c 75 65 20 3d 20 50 61 72 73 65  l? value = Parse
10490 42 6f 6f 6c 65 61 6e 28 74 65 78 74 29 3b 0d 0a  Boolean(text);..
104a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
104b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104c0 20 20 69 66 20 28 76 61 6c 75 65 20 3d 3d 20 6e    if (value == n
104d0 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
104e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104f0 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
10500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10510 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
10520 6f 72 20 3d 20 54 72 61 63 65 4f 70 73 2e 54 72  or = TraceOps.Tr
10530 61 63 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ace(..          
10540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72                Tr
10560 61 63 65 50 72 69 6f 72 69 74 79 2e 4c 6f 77 65  acePriority.Lowe
10570 73 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  st,..           
10580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10590 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61               tra
105a0 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69  ceCallback, Stri
105b0 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20  ng.Format(..    
105c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105e0 20 20 20 20 22 49 6e 76 61 6c 69 64 20 7b 30 7d      "Invalid {0}
105f0 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20   boolean value: 
10600 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20  {1}",..         
10610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
10630 6f 72 44 69 73 70 6c 61 79 28 61 72 67 29 2c 20  orDisplay(arg), 
10640 46 6f 72 44 69 73 70 6c 61 79 28 74 65 78 74 29  ForDisplay(text)
10650 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ),..            
10660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10670 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63              trac
10680 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20  eCategory);.... 
10690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106b0 20 20 20 69 66 20 28 73 74 72 69 63 74 29 0d 0a     if (strict)..
106c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
106f0 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  alse;....       
10700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10710 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
10720 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20  tinue;..        
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10740 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
10750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10760 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
10770 66 69 67 75 72 61 74 69 6f 6e 2e 6e 6f 43 6f 6e  figuration.noCon
10780 73 6f 6c 65 20 3d 20 28 62 6f 6f 6c 29 76 61 6c  sole = (bool)val
10790 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue;..           
107a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107b0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
107c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107d0 65 6c 73 65 20 69 66 20 28 4d 61 74 63 68 4f 70  else if (MatchOp
107e0 74 69 6f 6e 28 6e 65 77 41 72 67 2c 20 22 6e 6f  tion(newArg, "no
107f0 4c 6f 67 22 29 29 0d 0a 20 20 20 20 20 20 20 20  Log"))..        
10800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10810 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
10820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10830 20 20 20 20 20 20 20 62 6f 6f 6c 3f 20 76 61 6c         bool? val
10840 75 65 20 3d 20 50 61 72 73 65 42 6f 6f 6c 65 61  ue = ParseBoolea
10850 6e 28 74 65 78 74 29 3b 0d 0a 0d 0a 20 20 20 20  n(text);....    
10860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10870 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
10880 76 61 6c 75 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a  value == null)..
10890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
108c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108d0 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 54         error = T
108e0 72 61 63 65 4f 70 73 2e 54 72 61 63 65 28 0d 0a  raceOps.Trace(..
108f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10910 20 20 20 20 20 20 20 20 54 72 61 63 65 50 72 69          TracePri
10920 6f 72 69 74 79 2e 4c 6f 77 65 73 74 2c 0d 0a 20  ority.Lowest,.. 
10930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10950 20 20 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c         traceCall
10960 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72  back, String.For
10970 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  mat(..          
10980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49                "I
109a0 6e 76 61 6c 69 64 20 7b 30 7d 20 62 6f 6f 6c 65  nvalid {0} boole
109b0 61 6e 20 76 61 6c 75 65 3a 20 7b 31 7d 22 2c 0d  an value: {1}",.
109c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
109d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109e0 20 20 20 20 20 20 20 20 20 46 6f 72 44 69 73 70           ForDisp
109f0 6c 61 79 28 61 72 67 29 2c 20 46 6f 72 44 69 73  lay(arg), ForDis
10a00 70 6c 61 79 28 74 65 78 74 29 29 2c 0d 0a 20 20  play(text)),..  
10a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a30 20 20 20 20 20 20 74 72 61 63 65 43 61 74 65 67        traceCateg
10a40 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ory);....       
10a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
10a70 28 73 74 72 69 63 74 29 0d 0a 20 20 20 20 20 20  (strict)..      
10a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10aa0 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d    return false;.
10ab0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
10ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ad0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
10ae0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b00 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
10b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b20 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61         configura
10b30 74 69 6f 6e 2e 6e 6f 4c 6f 67 20 3d 20 28 62 6f  tion.noLog = (bo
10b40 6f 6c 29 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20  ol)value;..     
10b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b60 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
10b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b80 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20        else..    
10b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ba0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
10bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bc0 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
10bd0 20 3d 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63   = TraceOps.Trac
10be0 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e(..            
10bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c00 20 20 20 20 20 20 20 20 54 72 61 63 65 50 72 69          TracePri
10c10 6f 72 69 74 79 2e 4c 6f 77 65 73 74 2c 0d 0a 20  ority.Lowest,.. 
10c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c40 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b     traceCallback
10c50 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  , String.Format(
10c60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c80 20 20 20 20 20 20 22 55 6e 73 75 70 70 6f 72 74        "Unsupport
10c90 65 64 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  ed command line 
10ca0 6f 70 74 69 6f 6e 3a 20 7b 30 7d 22 2c 0d 0a 20  option: {0}",.. 
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cd0 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28 61 72     ForDisplay(ar
10ce0 67 29 29 2c 20 74 72 61 63 65 43 61 74 65 67 6f  g)), traceCatego
10cf0 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ry);....        
10d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d10 20 20 20 20 20 20 20 20 69 66 20 28 73 74 72 69          if (stri
10d20 63 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ct)..           
10d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d40 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
10d50 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20  false;..        
10d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d70 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
10d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
10d90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10da0 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 0d 0a            else..
10db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10dc0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
10dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10de0 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 54         error = T
10df0 72 61 63 65 4f 70 73 2e 54 72 61 63 65 28 0d 0a  raceOps.Trace(..
10e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e20 54 72 61 63 65 50 72 69 6f 72 69 74 79 2e 4c 6f  TracePriority.Lo
10e30 77 65 73 74 2c 0d 0a 20 20 20 20 20 20 20 20 20  west,..         
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 20 20 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c         traceCall
10e60 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72  back, String.For
10e70 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  mat(..          
10e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e90 20 20 20 20 20 20 22 55 6e 73 75 70 70 6f 72 74        "Unsupport
10ea0 65 64 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  ed command line 
10eb0 61 72 67 75 6d 65 6e 74 3a 20 7b 30 7d 22 2c 0d  argument: {0}",.
10ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ee0 20 46 6f 72 44 69 73 70 6c 61 79 28 61 72 67 29   ForDisplay(arg)
10ef0 29 2c 20 74 72 61 63 65 43 61 74 65 67 6f 72 79  ), traceCategory
10f00 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
10f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f20 20 20 69 66 20 28 73 74 72 69 63 74 29 0d 0a 20    if (strict).. 
10f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
10f50 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20  eturn false;..  
10f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f70 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
10f80 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
10f90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10fa0 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
10fb0 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
10fc0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
10fd0 20 20 20 20 20 20 20 63 61 74 63 68 20 28 45 78         catch (Ex
10fe0 63 65 70 74 69 6f 6e 20 65 29 0d 0a 20 20 20 20  ception e)..    
10ff0 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
11000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11010 20 20 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63     TraceOps.Trac
11020 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e(..            
11030 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63              Trac
11040 65 50 72 69 6f 72 69 74 79 2e 48 69 67 68 65 73  ePriority.Highes
11050 74 2c 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b  t, traceCallback
11060 2c 20 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  , e,..          
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
11080 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d  aceCategory);...
11090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
110a0 20 20 20 20 20 65 72 72 6f 72 20 3d 20 22 46 61       error = "Fa
110b0 69 6c 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 63  iled to modify c
110c0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 22 3b 0d  onfiguration.";.
110d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
110e0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
110f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
11100 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se;..           
11110 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
11120 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
11130 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11140 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11150 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11160 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
11170 20 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74       public stat
11180 69 63 20 62 6f 6f 6c 20 50 72 6f 63 65 73 73 28  ic bool Process(
11190 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
111a0 20 20 73 74 72 69 6e 67 5b 5d 20 61 72 67 73 2c    string[] args,
111b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
111c0 20 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20    Configuration 
111d0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2c 0d 0a  configuration,..
111e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111f0 62 6f 6f 6c 20 73 74 72 69 63 74 2c 0d 0a 20 20  bool strict,..  
11200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
11210 66 20 73 74 72 69 6e 67 20 65 72 72 6f 72 0d 0a  f string error..
11220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11230 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
11240 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11250 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20 20    try..         
11260 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
11270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
11280 20 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20   (configuration 
11290 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
112a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
112b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
112c0 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d           error =
112d0 20 22 49 6e 76 61 6c 69 64 20 63 6f 6e 66 69 67   "Invalid config
112e0 75 72 61 74 69 6f 6e 2e 22 3b 0d 0a 20 20 20 20  uration.";..    
112f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11300 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
11310 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
11320 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
11330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11340 41 73 73 65 6d 62 6c 79 20 61 73 73 65 6d 62 6c  Assembly assembl
11350 79 20 3d 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  y = configuratio
11360 6e 2e 61 73 73 65 6d 62 6c 79 3b 0d 0a 0d 0a 20  n.assembly;.... 
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11380 20 20 20 69 66 20 28 61 73 73 65 6d 62 6c 79 20     if (assembly 
11390 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
113a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
113b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
113c0 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d           error =
113d0 20 22 49 6e 76 61 6c 69 64 20 61 73 73 65 6d 62   "Invalid assemb
113e0 6c 79 2e 22 3b 0d 0a 20 20 20 20 20 20 20 20 20  ly.";..         
113f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
11400 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20  eturn false;..  
11410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11420 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
11430 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
11440 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6e 6f  configuration.no
11450 54 72 61 63 65 29 0d 0a 20 20 20 20 20 20 20 20  Trace)..        
11460 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
11470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11480 20 20 20 20 20 20 20 69 66 20 28 21 63 6f 6e 66         if (!conf
11490 69 67 75 72 61 74 69 6f 6e 2e 6e 6f 4c 6f 67 20  iguration.noLog 
114a0 26 26 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  &&..            
114b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114c0 53 74 72 69 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45  String.IsNullOrE
114d0 6d 70 74 79 28 63 6f 6e 66 69 67 75 72 61 74 69  mpty(configurati
114e0 6f 6e 2e 6c 6f 67 46 69 6c 65 4e 61 6d 65 29 29  on.logFileName))
114f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11500 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
11510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11520 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75           configu
11530 72 61 74 69 6f 6e 2e 6c 6f 67 46 69 6c 65 4e 61  ration.logFileNa
11540 6d 65 20 3d 20 47 65 74 4c 6f 67 46 69 6c 65 4e  me = GetLogFileN
11550 61 6d 65 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  ame();..        
11560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11570 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
11580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f               ///
11590 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
115a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
115b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
115c0 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
115d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115e0 69 66 20 28 21 63 6f 6e 66 69 67 75 72 61 74 69  if (!configurati
115f0 6f 6e 2e 6e 6f 43 6f 6e 73 6f 6c 65 29 0d 0a 20  on.noConsole).. 
11600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11610 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
11620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11630 20 20 20 20 20 20 54 72 61 63 65 2e 4c 69 73 74        Trace.List
11640 65 6e 65 72 73 2e 41 64 64 28 6e 65 77 20 43 6f  eners.Add(new Co
11650 6e 73 6f 6c 65 54 72 61 63 65 4c 69 73 74 65 6e  nsoleTraceListen
11660 65 72 28 29 29 3b 0d 0a 20 20 20 20 20 20 20 20  er());..        
11670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11680 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
11690 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
116a0 28 21 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  (!configuration.
116b0 6e 6f 4c 6f 67 20 26 26 0d 0a 20 20 20 20 20 20  noLog &&..      
116c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116d0 20 20 20 20 20 20 21 53 74 72 69 6e 67 2e 49 73        !String.Is
116e0 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 63 6f 6e 66  NullOrEmpty(conf
116f0 69 67 75 72 61 74 69 6f 6e 2e 6c 6f 67 46 69 6c  iguration.logFil
11700 65 4e 61 6d 65 29 29 0d 0a 20 20 20 20 20 20 20  eName))..       
11710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11720 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
11730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11740 54 72 61 63 65 2e 4c 69 73 74 65 6e 65 72 73 2e  Trace.Listeners.
11750 41 64 64 28 6e 65 77 20 54 65 78 74 57 72 69 74  Add(new TextWrit
11760 65 72 54 72 61 63 65 4c 69 73 74 65 6e 65 72 28  erTraceListener(
11770 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11790 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e    configuration.
117a0 6c 6f 67 46 69 6c 65 4e 61 6d 65 29 29 3b 0d 0a  logFileName));..
117b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117c0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
117d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
117e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
117f0 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
11800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11810 2f 2f 20 4e 4f 54 45 3a 20 44 75 6d 70 20 74 68  // NOTE: Dump th
11820 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
11830 6e 6f 77 20 69 6e 20 63 61 73 65 20 77 65 20 6e  now in case we n
11840 65 65 64 20 74 6f 0d 0a 20 20 20 20 20 20 20 20  eed to..        
11850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
11860 20 20 20 20 20 74 72 6f 75 62 6c 65 73 68 6f 6f       troubleshoo
11870 74 20 61 6e 79 20 69 73 73 75 65 73 2e 0d 0a 20  t any issues... 
11880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11890 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
118a0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63             if (c
118b0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 74 72 61  onfiguration.tra
118c0 63 65 50 72 69 6f 72 69 74 79 20 3c 3d 20 54 72  cePriority <= Tr
118d0 61 63 65 50 72 69 6f 72 69 74 79 2e 4d 65 64 69  acePriority.Medi
118e0 75 6d 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  um)..           
118f0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
11900 66 69 67 75 72 61 74 69 6f 6e 2e 44 75 6d 70 28  figuration.Dump(
11910 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
11920 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
11930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11940 20 20 2f 2f 20 4e 4f 54 45 3a 20 53 68 6f 77 20    // NOTE: Show 
11950 77 68 65 72 65 20 77 65 20 61 72 65 20 72 75 6e  where we are run
11960 6e 69 6e 67 20 66 72 6f 6d 20 61 6e 64 20 68 6f  ning from and ho
11970 77 20 77 65 20 77 65 72 65 0d 0a 20 20 20 20 20  w we were..     
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11990 2f 20 20 20 20 20 20 20 69 6e 76 6f 6b 65 64 2e  /       invoked.
119a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
119b0 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
119d0 72 69 6e 67 20 6c 6f 63 61 74 69 6f 6e 20 3d 20  ring location = 
119e0 61 73 73 65 6d 62 6c 79 2e 4c 6f 63 61 74 69 6f  assembly.Locatio
119f0 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  n;....          
11a00 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65 4f            TraceO
11a10 70 73 2e 54 72 61 63 65 28 0d 0a 20 20 20 20 20  ps.Trace(..     
11a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a30 20 20 20 54 72 61 63 65 50 72 69 6f 72 69 74 79     TracePriority
11a40 2e 4d 65 64 69 75 6d 2c 20 74 72 61 63 65 43 61  .Medium, traceCa
11a50 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46  llback, String.F
11a60 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20  ormat(..        
11a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a80 22 4f 72 69 67 69 6e 61 6c 20 63 6f 6d 6d 61 6e  "Original comman
11a90 64 20 6c 69 6e 65 20 69 73 3a 20 7b 30 7d 22 2c  d line is: {0}",
11aa0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11ab0 20 20 20 20 20 20 20 20 20 20 45 6e 76 69 72 6f            Enviro
11ac0 6e 6d 65 6e 74 2e 43 6f 6d 6d 61 6e 64 4c 69 6e  nment.CommandLin
11ad0 65 29 2c 20 74 72 61 63 65 43 61 74 65 67 6f 72  e), traceCategor
11ae0 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  y);....         
11af0 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
11b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b10 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 49 66 20 74     // NOTE: If t
11b20 68 65 20 64 65 62 75 67 67 65 72 20 69 73 20 61  he debugger is a
11b30 74 74 61 63 68 65 64 20 61 6e 64 20 57 68 61 74  ttached and What
11b40 2d 49 66 20 6d 6f 64 65 20 69 73 0d 0a 20 20 20  -If mode is..   
11b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b60 20 2f 2f 20 20 20 20 20 20 20 5b 6e 6f 77 5d 20   //       [now] 
11b70 64 69 73 61 62 6c 65 64 2c 20 69 73 73 75 65 20  disabled, issue 
11b80 61 20 77 61 72 6e 69 6e 67 2e 0d 0a 20 20 20 20  a warning...    
11b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ba0 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
11bb0 20 20 20 20 20 20 20 20 69 66 20 28 21 63 6f 6e          if (!con
11bc0 66 69 67 75 72 61 74 69 6f 6e 2e 77 68 61 74 49  figuration.whatI
11bd0 66 20 26 26 20 44 65 62 75 67 67 65 72 2e 49 73  f && Debugger.Is
11be0 41 74 74 61 63 68 65 64 29 0d 0a 20 20 20 20 20  Attached)..     
11bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
11c00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11c10 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65 4f            TraceO
11c20 70 73 2e 54 72 61 63 65 28 0d 0a 20 20 20 20 20  ps.Trace(..     
11c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c40 20 20 20 20 20 20 20 54 72 61 63 65 50 72 69 6f         TracePrio
11c50 72 69 74 79 2e 4d 65 64 69 75 6d 2c 20 74 72 61  rity.Medium, tra
11c60 63 65 43 61 6c 6c 62 61 63 6b 2c 0d 0a 20 20 20  ceCallback,..   
11c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c80 20 20 20 20 20 20 20 20 20 22 46 6f 72 63 65 64           "Forced
11c90 20 74 6f 20 64 69 73 61 62 6c 65 20 5c 22 77 68   to disable \"wh
11ca0 61 74 2d 69 66 5c 22 20 6d 6f 64 65 20 77 69 74  at-if\" mode wit
11cb0 68 20 22 20 2b 0d 0a 20 20 20 20 20 20 20 20 20  h " +..         
11cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cd0 20 20 20 22 64 65 62 75 67 67 65 72 20 61 74 74     "debugger att
11ce0 61 63 68 65 64 2e 22 2c 20 74 72 61 63 65 43 61  ached.", traceCa
11cf0 74 65 67 6f 72 79 29 3b 0d 0a 20 20 20 20 20 20  tegory);..      
11d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
11d10 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
11d20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
11d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11d40 2f 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 63  / NOTE: If the c
11d50 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 68 61 73 20  ommand line has 
11d60 6e 6f 74 20 62 65 65 6e 20 6d 61 6e 75 61 6c 6c  not been manuall
11d70 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y..             
11d80 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20         //       
11d90 63 6f 6e 66 69 72 6d 65 64 20 28 69 2e 65 2e 20  confirmed (i.e. 
11da0 76 69 61 20 74 68 65 20 65 78 70 6c 69 63 69 74  via the explicit
11db0 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0d 0a 20   command line.. 
11dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11dd0 20 20 20 2f 2f 20 20 20 20 20 20 20 6f 70 74 69     //       opti
11de0 6f 6e 29 2c 20 74 68 65 6e 20 73 74 6f 70 20 70  on), then stop p
11df0 72 6f 63 65 73 73 69 6e 67 20 6e 6f 77 2e 20 20  rocessing now.  
11e00 57 65 20 65 6e 66 6f 72 63 65 0d 0a 20 20 20 20  We enforce..    
11e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e20 2f 2f 20 20 20 20 20 20 20 74 68 69 73 20 72 75  //       this ru
11e30 6c 65 20 73 6f 20 74 68 61 74 20 73 69 6d 70 6c  le so that simpl
11e40 79 20 64 6f 75 62 6c 65 2d 63 6c 69 63 6b 69 6e  y double-clickin
11e50 67 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20  g the..         
11e60 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
11e70 20 20 20 20 65 78 65 63 75 74 61 62 6c 65 20 77      executable w
11e80 69 6c 6c 20 6e 6f 74 20 72 65 73 75 6c 74 20 69  ill not result i
11e90 6e 20 61 6e 79 20 63 68 61 6e 67 65 73 20 62 65  n any changes be
11ea0 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ing..           
11eb0 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
11ec0 20 20 6d 61 64 65 20 74 6f 20 74 68 65 20 73 79    made to the sy
11ed0 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20 20 20 20  stem...         
11ee0 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
11ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f00 20 20 20 69 66 20 28 21 63 6f 6e 66 69 67 75 72     if (!configur
11f10 61 74 69 6f 6e 2e 63 6f 6e 66 69 72 6d 29 0d 0a  ation.confirm)..
11f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f30 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
11f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
11f50 72 72 6f 72 20 3d 20 22 43 61 6e 6e 6f 74 20 63  rror = "Cannot c
11f60 6f 6e 74 69 6e 75 65 2c 20 74 68 65 20 5c 22 63  ontinue, the \"c
11f70 6f 6e 66 69 72 6d 5c 22 20 6f 70 74 69 6f 6e 20  onfirm\" option 
11f80 69 73 20 22 20 2b 0d 0a 20 20 20 20 20 20 20 20  is " +..        
11f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fa0 20 20 20 20 22 6e 6f 74 20 65 6e 61 62 6c 65 64      "not enabled
11fb0 2e 22 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  .";....         
11fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
11fd0 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20  eturn false;..  
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ff0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
12000 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
12010 6e 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20 20  n true;..       
12020 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
12030 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63              catc
12040 68 20 28 45 78 63 65 70 74 69 6f 6e 20 65 29 0d  h (Exception e).
12050 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12060 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
12070 20 20 20 20 20 20 20 20 54 72 61 63 65 4f 70 73          TraceOps
12080 2e 54 72 61 63 65 28 0d 0a 20 20 20 20 20 20 20  .Trace(..       
12090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120a0 20 54 72 61 63 65 50 72 69 6f 72 69 74 79 2e 48   TracePriority.H
120b0 69 67 68 65 73 74 2c 20 74 72 61 63 65 43 61 6c  ighest, traceCal
120c0 6c 62 61 63 6b 2c 20 65 2c 0d 0a 20 20 20 20 20  lback, e,..     
120d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120e0 20 20 20 74 72 61 63 65 43 61 74 65 67 6f 72 79     traceCategory
120f0 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
12100 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20            error 
12110 3d 20 22 46 61 69 6c 65 64 20 74 6f 20 70 72 6f  = "Failed to pro
12120 63 65 73 73 20 63 6f 6e 66 69 67 75 72 61 74 69  cess configurati
12130 6f 6e 2e 22 3b 0d 0a 20 20 20 20 20 20 20 20 20  on.";..         
12140 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
12150 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
12160 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20  rn false;..     
12170 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
12180 20 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e        #endregion
12190 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
121a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
121b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
121c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
121d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
121e0 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
121f0 20 20 20 23 72 65 67 69 6f 6e 20 50 75 62 6c 69     #region Publi
12200 63 20 4d 65 74 68 6f 64 73 0d 0a 20 20 20 20 20  c Methods..     
12210 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 62 6f         public bo
12220 6f 6c 20 48 61 73 46 6c 61 67 73 28 0d 0a 20 20  ol HasFlags(..  
12230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e                In
12240 73 74 61 6c 6c 46 6c 61 67 73 20 68 61 73 46 6c  stallFlags hasFl
12250 61 67 73 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ags,..          
12260 20 20 20 20 20 20 62 6f 6f 6c 20 61 6c 6c 0d 0a        bool all..
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12280 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
12290 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
122a0 20 20 69 66 20 28 61 6c 6c 29 0d 0a 20 20 20 20    if (all)..    
122b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122c0 72 65 74 75 72 6e 20 28 28 69 6e 73 74 61 6c 6c  return ((install
122d0 46 6c 61 67 73 20 26 20 68 61 73 46 6c 61 67 73  Flags & hasFlags
122e0 29 20 3d 3d 20 68 61 73 46 6c 61 67 73 29 3b 0d  ) == hasFlags);.
122f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12300 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20   else..         
12310 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
12320 6e 20 28 28 69 6e 73 74 61 6c 6c 46 6c 61 67 73  n ((installFlags
12330 20 26 20 68 61 73 46 6c 61 67 73 29 20 21 3d 20   & hasFlags) != 
12340 49 6e 73 74 61 6c 6c 46 6c 61 67 73 2e 4e 6f 6e  InstallFlags.Non
12350 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e);..           
12360 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
12370 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
12380 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12390 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
123a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
123b0 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
123c0 20 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64       public void
123d0 20 44 75 6d 70 28 29 0d 0a 20 20 20 20 20 20 20   Dump()..       
123e0 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
123f0 20 20 20 20 20 20 20 20 69 66 20 28 74 72 61 63          if (trac
12400 65 43 61 6c 6c 62 61 63 6b 20 21 3d 20 6e 75 6c  eCallback != nul
12410 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
12420 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
12430 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65             trace
12440 43 61 6c 6c 62 61 63 6b 28 53 74 72 69 6e 67 2e  Callback(String.
12450 46 6f 72 6d 61 74 28 4e 61 6d 65 41 6e 64 56 61  Format(NameAndVa
12460 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a 20 20 20 20  lueFormat,..    
12470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12480 20 20 20 20 22 41 73 73 65 6d 62 6c 79 22 2c 20      "Assembly", 
12490 46 6f 72 44 69 73 70 6c 61 79 28 61 73 73 65 6d  ForDisplay(assem
124a0 62 6c 79 29 29 2c 0d 0a 20 20 20 20 20 20 20 20  bly)),..        
124b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124c0 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d  traceCategory);.
124d0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
124e0 20 20 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c         traceCall
124f0 62 61 63 6b 28 53 74 72 69 6e 67 2e 46 6f 72 6d  back(String.Form
12500 61 74 28 4e 61 6d 65 41 6e 64 56 61 6c 75 65 46  at(NameAndValueF
12510 6f 72 6d 61 74 2c 0d 0a 20 20 20 20 20 20 20 20  ormat,..        
12520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12530 22 4c 6f 67 46 69 6c 65 4e 61 6d 65 22 2c 20 46  "LogFileName", F
12540 6f 72 44 69 73 70 6c 61 79 28 6c 6f 67 46 69 6c  orDisplay(logFil
12550 65 4e 61 6d 65 29 29 2c 0d 0a 20 20 20 20 20 20  eName)),..      
12560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12570 20 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29    traceCategory)
12580 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
12590 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61           traceCa
125a0 6c 6c 62 61 63 6b 28 53 74 72 69 6e 67 2e 46 6f  llback(String.Fo
125b0 72 6d 61 74 28 4e 61 6d 65 41 6e 64 56 61 6c 75  rmat(NameAndValu
125c0 65 46 6f 72 6d 61 74 2c 0d 0a 20 20 20 20 20 20  eFormat,..      
125d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125e0 20 20 22 44 69 72 65 63 74 6f 72 79 22 2c 20 46    "Directory", F
125f0 6f 72 44 69 73 70 6c 61 79 28 64 69 72 65 63 74  orDisplay(direct
12600 6f 72 79 29 29 2c 0d 0a 20 20 20 20 20 20 20 20  ory)),..        
12610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12620 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d  traceCategory);.
12630 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
12640 20 20 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c         traceCall
12650 62 61 63 6b 28 53 74 72 69 6e 67 2e 46 6f 72 6d  back(String.Form
12660 61 74 28 4e 61 6d 65 41 6e 64 56 61 6c 75 65 46  at(NameAndValueF
12670 6f 72 6d 61 74 2c 0d 0a 20 20 20 20 20 20 20 20  ormat,..        
12680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12690 22 43 6f 72 65 46 69 6c 65 4e 61 6d 65 22 2c 20  "CoreFileName", 
126a0 46 6f 72 44 69 73 70 6c 61 79 28 63 6f 72 65 46  ForDisplay(coreF
126b0 69 6c 65 4e 61 6d 65 29 29 2c 0d 0a 20 20 20 20  ileName)),..    
126c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126d0 20 20 20 20 74 72 61 63 65 43 61 74 65 67 6f 72      traceCategor
126e0 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  y);....         
126f0 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65             trace
12700 43 61 6c 6c 62 61 63 6b 28 53 74 72 69 6e 67 2e  Callback(String.
12710 46 6f 72 6d 61 74 28 4e 61 6d 65 41 6e 64 56 61  Format(NameAndVa
12720 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a 20 20 20 20  lueFormat,..    
12730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12740 20 20 20 20 22 4c 69 6e 71 46 69 6c 65 4e 61 6d      "LinqFileNam
12750 65 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 6c  e", ForDisplay(l
12760 69 6e 71 46 69 6c 65 4e 61 6d 65 29 29 2c 0d 0a  inqFileName)),..
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12780 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74          traceCat
12790 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20  egory);....     
127a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
127b0 72 61 63 65 43 61 6c 6c 62 61 63 6b 28 53 74 72  raceCallback(Str
127c0 69 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65 41  ing.Format(NameA
127d0 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a  ndValueFormat,..
127e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127f0 20 20 20 20 20 20 20 20 22 44 65 73 69 67 6e 65          "Designe
12800 72 46 69 6c 65 4e 61 6d 65 22 2c 20 46 6f 72 44  rFileName", ForD
12810 69 73 70 6c 61 79 28 64 65 73 69 67 6e 65 72 46  isplay(designerF
12820 69 6c 65 4e 61 6d 65 29 29 2c 0d 0a 20 20 20 20  ileName)),..    
12830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12840 20 20 20 20 74 72 61 63 65 43 61 74 65 67 6f 72      traceCategor
12850 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  y);....         
12860 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65             trace
12870 43 61 6c 6c 62 61 63 6b 28 53 74 72 69 6e 67 2e  Callback(String.
12880 46 6f 72 6d 61 74 28 4e 61 6d 65 41 6e 64 56 61  Format(NameAndVa
12890 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a 20 20 20 20  lueFormat,..    
128a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128b0 20 20 20 20 22 49 6e 73 74 61 6c 6c 46 6c 61 67      "InstallFlag
128c0 73 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 69  s", ForDisplay(i
128d0 6e 73 74 61 6c 6c 46 6c 61 67 73 29 29 2c 0d 0a  nstallFlags)),..
128e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128f0 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74          traceCat
12900 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20  egory);....     
12910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
12920 72 61 63 65 43 61 6c 6c 62 61 63 6b 28 53 74 72  raceCallback(Str
12930 69 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65 41  ing.Format(NameA
12940 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a  ndValueFormat,..
12950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12960 20 20 20 20 20 20 20 20 22 54 72 61 63 65 50 72          "TracePr
12970 69 6f 72 69 74 79 22 2c 20 46 6f 72 44 69 73 70  iority", ForDisp
12980 6c 61 79 28 74 72 61 63 65 50 72 69 6f 72 69 74  lay(tracePriorit
12990 79 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  y)),..          
129a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
129b0 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d  aceCategory);...
129c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
129d0 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61       traceCallba
129e0 63 6b 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74  ck(String.Format
129f0 28 4e 61 6d 65 41 6e 64 56 61 6c 75 65 46 6f 72  (NameAndValueFor
12a00 6d 61 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  mat,..          
12a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49                "I
12a20 6e 73 74 61 6c 6c 22 2c 20 46 6f 72 44 69 73 70  nstall", ForDisp
12a30 6c 61 79 28 69 6e 73 74 61 6c 6c 29 29 2c 0d 0a  lay(install)),..
12a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a50 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74          traceCat
12a60 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20  egory);....     
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
12a80 72 61 63 65 43 61 6c 6c 62 61 63 6b 28 53 74 72  raceCallback(Str
12a90 69 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65 41  ing.Format(NameA
12aa0 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a  ndValueFormat,..
12ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ac0 20 20 20 20 20 20 20 20 22 4e 6f 44 65 73 6b 74          "NoDeskt
12ad0 6f 70 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28  op", ForDisplay(
12ae0 6e 6f 44 65 73 6b 74 6f 70 29 29 2c 0d 0a 20 20  noDesktop)),..  
12af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b00 20 20 20 20 20 20 74 72 61 63 65 43 61 74 65 67        traceCateg
12b10 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ory);....       
12b20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61               tra
12b30 63 65 43 61 6c 6c 62 61 63 6b 28 53 74 72 69 6e  ceCallback(Strin
12b40 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65 41 6e 64  g.Format(NameAnd
12b50 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a 20 20  ValueFormat,..  
12b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b70 20 20 20 20 20 20 22 4e 6f 43 6f 6d 70 61 63 74        "NoCompact
12b80 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 6e 6f  ", ForDisplay(no
12b90 43 6f 6d 70 61 63 74 29 29 2c 0d 0a 20 20 20 20  Compact)),..    
12ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bb0 20 20 20 20 74 72 61 63 65 43 61 74 65 67 6f 72      traceCategor
12bc0 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  y);....         
12bd0 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65             trace
12be0 43 61 6c 6c 62 61 63 6b 28 53 74 72 69 6e 67 2e  Callback(String.
12bf0 46 6f 72 6d 61 74 28 4e 61 6d 65 41 6e 64 56 61  Format(NameAndVa
12c00 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a 20 20 20 20  lueFormat,..    
12c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c20 20 20 20 20 22 4e 6f 4e 65 74 46 78 32 30 22 2c      "NoNetFx20",
12c30 20 46 6f 72 44 69 73 70 6c 61 79 28 6e 6f 4e 65   ForDisplay(noNe
12c40 74 46 78 32 30 29 29 2c 0d 0a 20 20 20 20 20 20  tFx20)),..      
12c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c60 20 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29    traceCategory)
12c70 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
12c80 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61           traceCa
12c90 6c 6c 62 61 63 6b 28 53 74 72 69 6e 67 2e 46 6f  llback(String.Fo
12ca0 72 6d 61 74 28 4e 61 6d 65 41 6e 64 56 61 6c 75  rmat(NameAndValu
12cb0 65 46 6f 72 6d 61 74 2c 0d 0a 20 20 20 20 20 20  eFormat,..      
12cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cd0 20 20 22 4e 6f 4e 65 74 46 78 34 30 22 2c 20 46    "NoNetFx40", F
12ce0 6f 72 44 69 73 70 6c 61 79 28 6e 6f 4e 65 74 46  orDisplay(noNetF
12cf0 78 34 30 29 29 2c 0d 0a 20 20 20 20 20 20 20 20  x40)),..        
12d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d10 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d  traceCategory);.
12d20 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
12d30 20 20 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c         traceCall
12d40 62 61 63 6b 28 53 74 72 69 6e 67 2e 46 6f 72 6d  back(String.Form
12d50 61 74 28 4e 61 6d 65 41 6e 64 56 61 6c 75 65 46  at(NameAndValueF
12d60 6f 72 6d 61 74 2c 0d 0a 20 20 20 20 20 20 20 20  ormat,..        
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d80 22 4e 6f 56 73 32 30 30 38 22 2c 20 46 6f 72 44  "NoVs2008", ForD
12d90 69 73 70 6c 61 79 28 6e 6f 56 73 32 30 30 38 29  isplay(noVs2008)
12da0 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ),..            
12db0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63              trac
12dc0 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20  eCategory);.... 
12dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12de0 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b     traceCallback
12df0 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 4e  (String.Format(N
12e00 61 6d 65 41 6e 64 56 61 6c 75 65 46 6f 72 6d 61  ameAndValueForma
12e10 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t,..            
12e20 20 20 20 20 20 20 20 20 20 20 20 20 22 4e 6f 56              "NoV
12e30 73 32 30 31 30 22 2c 20 46 6f 72 44 69 73 70 6c  s2010", ForDispl
12e40 61 79 28 6e 6f 56 73 32 30 31 30 29 29 2c 0d 0a  ay(noVs2010)),..
12e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e60 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74          traceCat
12e70 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20  egory);....     
12e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
12e90 72 61 63 65 43 61 6c 6c 62 61 63 6b 28 53 74 72  raceCallback(Str
12ea0 69 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65 41  ing.Format(NameA
12eb0 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a  ndValueFormat,..
12ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ed0 20 20 20 20 20 20 20 20 22 4e 6f 54 72 61 63 65          "NoTrace
12ee0 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 6e 6f  ", ForDisplay(no
12ef0 54 72 61 63 65 29 29 2c 0d 0a 20 20 20 20 20 20  Trace)),..      
12f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f10 20 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29    traceCategory)
12f20 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
12f30 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61           traceCa
12f40 6c 6c 62 61 63 6b 28 53 74 72 69 6e 67 2e 46 6f  llback(String.Fo
12f50 72 6d 61 74 28 4e 61 6d 65 41 6e 64 56 61 6c 75  rmat(NameAndValu
12f60 65 46 6f 72 6d 61 74 2c 0d 0a 20 20 20 20 20 20  eFormat,..      
12f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f80 20 20 22 4e 6f 43 6f 6e 73 6f 6c 65 22 2c 20 46    "NoConsole", F
12f90 6f 72 44 69 73 70 6c 61 79 28 6e 6f 43 6f 6e 73  orDisplay(noCons
12fa0 6f 6c 65 29 29 2c 0d 0a 20 20 20 20 20 20 20 20  ole)),..        
12fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fc0 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d  traceCategory);.
12fd0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
12fe0 20 20 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c         traceCall
12ff0 62 61 63 6b 28 53 74 72 69 6e 67 2e 46 6f 72 6d  back(String.Form
13000 61 74 28 4e 61 6d 65 41 6e 64 56 61 6c 75 65 46  at(NameAndValueF
13010 6f 72 6d 61 74 2c 0d 0a 20 20 20 20 20 20 20 20  ormat,..        
13020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13030 22 4e 6f 4c 6f 67 22 2c 20 46 6f 72 44 69 73 70  "NoLog", ForDisp
13040 6c 61 79 28 6e 6f 4c 6f 67 29 29 2c 0d 0a 20 20  lay(noLog)),..  
13050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13060 20 20 20 20 20 20 74 72 61 63 65 43 61 74 65 67        traceCateg
13070 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ory);....       
13080 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61               tra
13090 63 65 43 61 6c 6c 62 61 63 6b 28 53 74 72 69 6e  ceCallback(Strin
130a0 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65 41 6e 64  g.Format(NameAnd
130b0 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a 20 20  ValueFormat,..  
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130d0 20 20 20 20 20 20 22 57 68 61 74 49 66 22 2c 20        "WhatIf", 
130e0 46 6f 72 44 69 73 70 6c 61 79 28 77 68 61 74 49  ForDisplay(whatI
130f0 66 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  f)),..          
13100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
13110 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d  aceCategory);...
13120 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13130 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61       traceCallba
13140 63 6b 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74  ck(String.Format
13150 28 4e 61 6d 65 41 6e 64 56 61 6c 75 65 46 6f 72  (NameAndValueFor
13160 6d 61 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  mat,..          
13170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 56                "V
13180 65 72 62 6f 73 65 22 2c 20 46 6f 72 44 69 73 70  erbose", ForDisp
13190 6c 61 79 28 76 65 72 62 6f 73 65 29 29 2c 0d 0a  lay(verbose)),..
131a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131b0 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74          traceCat
131c0 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20  egory);....     
131d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
131e0 72 61 63 65 43 61 6c 6c 62 61 63 6b 28 53 74 72  raceCallback(Str
131f0 69 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65 41  ing.Format(NameA
13200 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a  ndValueFormat,..
13210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13220 20 20 20 20 20 20 20 20 22 43 6f 6e 66 69 72 6d          "Confirm
13230 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 63 6f  ", ForDisplay(co
13240 6e 66 69 72 6d 29 29 2c 0d 0a 20 20 20 20 20 20  nfirm)),..      
13250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13260 20 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29    traceCategory)
13270 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
13280 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
13290 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
132a0 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20   #endregion.... 
132b0 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
132c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
132d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
132e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
132f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
13300 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 72  ..            #r
13310 65 67 69 6f 6e 20 50 75 62 6c 69 63 20 50 72 6f  egion Public Pro
13320 70 65 72 74 69 65 73 0d 0a 20 20 20 20 20 20 20  perties..       
13330 20 20 20 20 20 70 72 69 76 61 74 65 20 41 73 73       private Ass
13340 65 6d 62 6c 79 20 61 73 73 65 6d 62 6c 79 3b 0d  embly assembly;.
13350 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62  .            pub
13360 6c 69 63 20 41 73 73 65 6d 62 6c 79 20 41 73 73  lic Assembly Ass
13370 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 20 20 20  embly..         
13380 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
13390 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74 75        get { retu
133a0 72 6e 20 61 73 73 65 6d 62 6c 79 3b 20 7d 0d 0a  rn assembly; }..
133b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133c0 73 65 74 20 7b 20 61 73 73 65 6d 62 6c 79 20 3d  set { assembly =
133d0 20 76 61 6c 75 65 3b 20 7d 0d 0a 20 20 20 20 20   value; }..     
133e0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
133f0 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
13400 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13410 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13420 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13430 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
13440 20 20 20 20 20 20 20 20 20 20 20 70 72 69 76 61             priva
13450 74 65 20 73 74 72 69 6e 67 20 6c 6f 67 46 69 6c  te string logFil
13460 65 4e 61 6d 65 3b 0d 0a 20 20 20 20 20 20 20 20  eName;..        
13470 20 20 20 20 70 75 62 6c 69 63 20 73 74 72 69 6e      public strin
13480 67 20 4c 6f 67 46 69 6c 65 4e 61 6d 65 0d 0a 20  g LogFileName.. 
13490 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
134a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65                ge
134b0 74 20 7b 20 72 65 74 75 72 6e 20 6c 6f 67 46 69  t { return logFi
134c0 6c 65 4e 61 6d 65 3b 20 7d 0d 0a 20 20 20 20 20  leName; }..     
134d0 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 7b             set {
134e0 20 6c 6f 67 46 69 6c 65 4e 61 6d 65 20 3d 20 76   logFileName = v
134f0 61 6c 75 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20  alue; }..       
13500 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
13510 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
13520 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13530 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13540 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13550 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
13560 20 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65           private
13570 20 73 74 72 69 6e 67 20 64 69 72 65 63 74 6f 72   string director
13580 79 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y;..            
13590 70 75 62 6c 69 63 20 73 74 72 69 6e 67 20 44 69  public string Di
135a0 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20  rectory..       
135b0 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
135c0 20 20 20 20 20 20 20 20 67 65 74 20 7b 20 72 65          get { re
135d0 74 75 72 6e 20 64 69 72 65 63 74 6f 72 79 3b 20  turn directory; 
135e0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
135f0 20 20 20 73 65 74 20 7b 20 64 69 72 65 63 74 6f     set { directo
13600 72 79 20 3d 20 76 61 6c 75 65 3b 20 7d 0d 0a 20  ry = value; }.. 
13610 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
13620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f              ////
13630 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13640 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13650 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13660 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
13670 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ...            p
13680 72 69 76 61 74 65 20 73 74 72 69 6e 67 20 63 6f  rivate string co
13690 72 65 46 69 6c 65 4e 61 6d 65 3b 0d 0a 20 20 20  reFileName;..   
136a0 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20           public 
136b0 73 74 72 69 6e 67 20 43 6f 72 65 46 69 6c 65 4e  string CoreFileN
136c0 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
136d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
136e0 20 20 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e      get { return
136f0 20 63 6f 72 65 46 69 6c 65 4e 61 6d 65 3b 20 7d   coreFileName; }
13700 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13710 20 20 73 65 74 20 7b 20 63 6f 72 65 46 69 6c 65    set { coreFile
13720 4e 61 6d 65 20 3d 20 76 61 6c 75 65 3b 20 7d 0d  Name = value; }.
13730 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
13740 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
13750 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13760 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13770 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13780 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13790 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  /....           
137a0 20 70 72 69 76 61 74 65 20 73 74 72 69 6e 67 20   private string 
137b0 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 3b 0d 0a 20  linqFileName;.. 
137c0 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
137d0 63 20 73 74 72 69 6e 67 20 4c 69 6e 71 46 69 6c  c string LinqFil
137e0 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20  eName..         
137f0 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
13800 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74 75        get { retu
13810 72 6e 20 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 3b  rn linqFileName;
13820 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
13830 20 20 20 20 73 65 74 20 7b 20 6c 69 6e 71 46 69      set { linqFi
13840 6c 65 4e 61 6d 65 20 3d 20 76 61 6c 75 65 3b 20  leName = value; 
13850 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
13860 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
13870 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13880 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13890 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
138a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
138b0 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
138c0 20 20 20 70 72 69 76 61 74 65 20 73 74 72 69 6e     private strin
138d0 67 20 64 65 73 69 67 6e 65 72 46 69 6c 65 4e 61  g designerFileNa
138e0 6d 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  me;..           
138f0 20 70 75 62 6c 69 63 20 73 74 72 69 6e 67 20 44   public string D
13900 65 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65 0d  esignerFileName.
13910 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
13920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13930 67 65 74 20 7b 20 72 65 74 75 72 6e 20 64 65 73  get { return des
13940 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65 3b 20 7d  ignerFileName; }
13950 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13960 20 20 73 65 74 20 7b 20 64 65 73 69 67 6e 65 72    set { designer
13970 46 69 6c 65 4e 61 6d 65 20 3d 20 76 61 6c 75 65  FileName = value
13980 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ; }..           
13990 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
139a0 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
139b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
139c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
139d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
139e0 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
139f0 20 20 20 20 20 70 72 69 76 61 74 65 20 49 6e 73       private Ins
13a00 74 61 6c 6c 46 6c 61 67 73 20 69 6e 73 74 61 6c  tallFlags instal
13a10 6c 46 6c 61 67 73 3b 0d 0a 20 20 20 20 20 20 20  lFlags;..       
13a20 20 20 20 20 20 70 75 62 6c 69 63 20 49 6e 73 74       public Inst
13a30 61 6c 6c 46 6c 61 67 73 20 49 6e 73 74 61 6c 6c  allFlags Install
13a40 46 6c 61 67 73 0d 0a 20 20 20 20 20 20 20 20 20  Flags..         
13a50 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
13a60 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74 75        get { retu
13a70 72 6e 20 69 6e 73 74 61 6c 6c 46 6c 61 67 73 3b  rn installFlags;
13a80 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
13a90 20 20 20 20 73 65 74 20 7b 20 69 6e 73 74 61 6c      set { instal
13aa0 6c 46 6c 61 67 73 20 3d 20 76 61 6c 75 65 3b 20  lFlags = value; 
13ab0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
13ac0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
13ad0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13ae0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13af0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13b00 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13b10 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
13b20 20 20 20 70 72 69 76 61 74 65 20 54 72 61 63 65     private Trace
13b30 50 72 69 6f 72 69 74 79 20 74 72 61 63 65 50 72  Priority tracePr
13b40 69 6f 72 69 74 79 3b 0d 0a 20 20 20 20 20 20 20  iority;..       
13b50 20 20 20 20 20 70 75 62 6c 69 63 20 54 72 61 63       public Trac
13b60 65 50 72 69 6f 72 69 74 79 20 54 72 61 63 65 50  ePriority TraceP
13b70 72 69 6f 72 69 74 79 0d 0a 20 20 20 20 20 20 20  riority..       
13b80 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
13b90 20 20 20 20 20 20 20 20 67 65 74 20 7b 20 72 65          get { re
13ba0 74 75 72 6e 20 74 72 61 63 65 50 72 69 6f 72 69  turn tracePriori
13bb0 74 79 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20  ty; }..         
13bc0 20 20 20 20 20 20 20 73 65 74 20 7b 20 74 72 61         set { tra
13bd0 63 65 50 72 69 6f 72 69 74 79 20 3d 20 76 61 6c  cePriority = val
13be0 75 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20  ue; }..         
13bf0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
13c00 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
13c10 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13c20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13c30 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13c40 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
13c50 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 62         private b
13c60 6f 6f 6c 20 69 6e 73 74 61 6c 6c 3b 0d 0a 20 20  ool install;..  
13c70 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
13c80 20 62 6f 6f 6c 20 49 6e 73 74 61 6c 6c 0d 0a 20   bool Install.. 
13c90 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
13ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65                ge
13cb0 74 20 7b 20 72 65 74 75 72 6e 20 69 6e 73 74 61  t { return insta
13cc0 6c 6c 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20  ll; }..         
13cd0 20 20 20 20 20 20 20 73 65 74 20 7b 20 69 6e 73         set { ins
13ce0 74 61 6c 6c 20 3d 20 76 61 6c 75 65 3b 20 7d 0d  tall = value; }.
13cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
13d00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
13d10 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13d20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13d30 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13d40 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13d50 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  /....           
13d60 20 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 6e 6f   private bool no
13d70 44 65 73 6b 74 6f 70 3b 0d 0a 20 20 20 20 20 20  Desktop;..      
13d80 20 20 20 20 20 20 70 75 62 6c 69 63 20 62 6f 6f        public boo
13d90 6c 20 4e 6f 44 65 73 6b 74 6f 70 0d 0a 20 20 20  l NoDesktop..   
13da0 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
13db0 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 20              get 
13dc0 7b 20 72 65 74 75 72 6e 20 6e 6f 44 65 73 6b 74  { return noDeskt
13dd0 6f 70 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20  op; }..         
13de0 20 20 20 20 20 20 20 73 65 74 20 7b 20 6e 6f 44         set { noD
13df0 65 73 6b 74 6f 70 20 3d 20 76 61 6c 75 65 3b 20  esktop = value; 
13e00 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
13e10 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
13e20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13e30 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13e40 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13e50 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13e60 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
13e70 20 20 20 70 72 69 76 61 74 65 20 62 6f 6f 6c 20     private bool 
13e80 6e 6f 43 6f 6d 70 61 63 74 3b 0d 0a 20 20 20 20  noCompact;..    
13e90 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 62          public b
13ea0 6f 6f 6c 20 4e 6f 43 6f 6d 70 61 63 74 0d 0a 20  ool NoCompact.. 
13eb0 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
13ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65                ge
13ed0 74 20 7b 20 72 65 74 75 72 6e 20 6e 6f 43 6f 6d  t { return noCom
13ee0 70 61 63 74 3b 20 7d 0d 0a 20 20 20 20 20 20 20  pact; }..       
13ef0 20 20 20 20 20 20 20 20 20 73 65 74 20 7b 20 6e           set { n
13f00 6f 43 6f 6d 70 61 63 74 20 3d 20 76 61 6c 75 65  oCompact = value
13f10 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ; }..           
13f20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
13f30 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
13f40 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13f50 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13f60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13f70 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
13f80 20 20 20 20 20 70 72 69 76 61 74 65 20 62 6f 6f       private boo
13f90 6c 20 6e 6f 4e 65 74 46 78 32 30 3b 0d 0a 20 20  l noNetFx20;..  
13fa0 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
13fb0 20 62 6f 6f 6c 20 4e 6f 4e 65 74 46 78 32 30 0d   bool NoNetFx20.
13fc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
13fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fe0 67 65 74 20 7b 20 72 65 74 75 72 6e 20 6e 6f 4e  get { return noN
13ff0 65 74 46 78 32 30 3b 20 7d 0d 0a 20 20 20 20 20  etFx20; }..     
14000 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 7b             set {
14010 20 6e 6f 4e 65 74 46 78 32 30 20 3d 20 76 61 6c   noNetFx20 = val
14020 75 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20  ue; }..         
14030 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
14040 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
14050 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14060 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14070 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14080 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
14090 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 62         private b
140a0 6f 6f 6c 20 6e 6f 4e 65 74 46 78 34 30 3b 0d 0a  ool noNetFx40;..
140b0 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
140c0 69 63 20 62 6f 6f 6c 20 4e 6f 4e 65 74 46 78 34  ic bool NoNetFx4
140d0 30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  0..            {
140e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
140f0 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e 20 6e    get { return n
14100 6f 4e 65 74 46 78 34 30 3b 20 7d 0d 0a 20 20 20  oNetFx40; }..   
14110 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
14120 20 7b 20 6e 6f 4e 65 74 46 78 34 30 20 3d 20 76   { noNetFx40 = v
14130 61 6c 75 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20  alue; }..       
14140 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
14150 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
14160 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14170 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14180 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14190 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
141a0 20 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65           private
141b0 20 62 6f 6f 6c 20 6e 6f 56 73 32 30 30 38 3b 0d   bool noVs2008;.
141c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62  .            pub
141d0 6c 69 63 20 62 6f 6f 6c 20 4e 6f 56 73 32 30 30  lic bool NoVs200
141e0 38 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  8..            {
141f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14200 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e 20 6e    get { return n
14210 6f 56 73 32 30 30 38 3b 20 7d 0d 0a 20 20 20 20  oVs2008; }..    
14220 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
14230 7b 20 6e 6f 56 73 32 30 30 38 20 3d 20 76 61 6c  { noVs2008 = val
14240 75 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20  ue; }..         
14250 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
14260 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
14270 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14280 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14290 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
142a0 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
142b0 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 62         private b
142c0 6f 6f 6c 20 6e 6f 56 73 32 30 31 30 3b 0d 0a 20  ool noVs2010;.. 
142d0 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
142e0 63 20 62 6f 6f 6c 20 4e 6f 56 73 32 30 31 30 0d  c bool NoVs2010.
142f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
14300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14310 67 65 74 20 7b 20 72 65 74 75 72 6e 20 6e 6f 56  get { return noV
14320 73 32 30 31 30 3b 20 7d 0d 0a 20 20 20 20 20 20  s2010; }..      
14330 20 20 20 20 20 20 20 20 20 20 73 65 74 20 7b 20            set { 
14340 6e 6f 56 73 32 30 31 30 20 3d 20 76 61 6c 75 65  noVs2010 = value
14350 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ; }..           
14360 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
14370 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
14380 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14390 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
143a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
143b0 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
143c0 20 20 20 20 20 70 72 69 76 61 74 65 20 62 6f 6f       private boo
143d0 6c 20 6e 6f 54 72 61 63 65 3b 0d 0a 20 20 20 20  l noTrace;..    
143e0 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 62          public b
143f0 6f 6f 6c 20 4e 6f 54 72 61 63 65 0d 0a 20 20 20  ool NoTrace..   
14400 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
14410 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 20              get 
14420 7b 20 72 65 74 75 72 6e 20 6e 6f 54 72 61 63 65  { return noTrace
14430 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ; }..           
14440 20 20 20 20 20 73 65 74 20 7b 20 6e 6f 54 72 61       set { noTra
14450 63 65 20 3d 20 76 61 6c 75 65 3b 20 7d 0d 0a 20  ce = value; }.. 
14460 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
14470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f              ////
14480 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14490 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
144a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
144b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
144c0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ...            p
144d0 72 69 76 61 74 65 20 62 6f 6f 6c 20 6e 6f 43 6f  rivate bool noCo
144e0 6e 73 6f 6c 65 3b 0d 0a 20 20 20 20 20 20 20 20  nsole;..        
144f0 20 20 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c 20      public bool 
14500 4e 6f 43 6f 6e 73 6f 6c 65 0d 0a 20 20 20 20 20  NoConsole..     
14510 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
14520 20 20 20 20 20 20 20 20 20 20 67 65 74 20 7b 20            get { 
14530 72 65 74 75 72 6e 20 6e 6f 43 6f 6e 73 6f 6c 65  return noConsole
14540 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ; }..           
14550 20 20 20 20 20 73 65 74 20 7b 20 6e 6f 43 6f 6e       set { noCon
14560 73 6f 6c 65 20 3d 20 76 61 6c 75 65 3b 20 7d 0d  sole = value; }.
14570 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
14580 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
14590 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
145a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
145b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
145c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
145d0 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  /....           
145e0 20 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 6e 6f   private bool no
145f0 4c 6f 67 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  Log;..          
14600 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c 20 4e 6f    public bool No
14610 4c 6f 67 0d 0a 20 20 20 20 20 20 20 20 20 20 20  Log..           
14620 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
14630 20 20 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e      get { return
14640 20 6e 6f 4c 6f 67 3b 20 7d 0d 0a 20 20 20 20 20   noLog; }..     
14650 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 7b             set {
14660 20 6e 6f 4c 6f 67 20 3d 20 76 61 6c 75 65 3b 20   noLog = value; 
14670 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
14680 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
14690 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
146a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
146b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
146c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
146d0 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
146e0 20 20 20 70 72 69 76 61 74 65 20 62 6f 6f 6c 20     private bool 
146f0 77 68 61 74 49 66 3b 0d 0a 20 20 20 20 20 20 20  whatIf;..       
14700 20 20 20 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c       public bool
14710 20 57 68 61 74 49 66 0d 0a 20 20 20 20 20 20 20   WhatIf..       
14720 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
14730 20 20 20 20 20 20 20 20 67 65 74 20 7b 20 72 65          get { re
14740 74 75 72 6e 20 77 68 61 74 49 66 3b 20 7d 0d 0a  turn whatIf; }..
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14760 73 65 74 20 7b 20 77 68 61 74 49 66 20 3d 20 76  set { whatIf = v
14770 61 6c 75 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20  alue; }..       
14780 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
14790 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
147a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
147b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
147c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
147d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
147e0 20 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65           private
147f0 20 62 6f 6f 6c 20 76 65 72 62 6f 73 65 3b 0d 0a   bool verbose;..
14800 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
14810 69 63 20 62 6f 6f 6c 20 56 65 72 62 6f 73 65 0d  ic bool Verbose.
14820 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
14830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14840 67 65 74 20 7b 20 72 65 74 75 72 6e 20 76 65 72  get { return ver
14850 62 6f 73 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20  bose; }..       
14860 20 20 20 20 20 20 20 20 20 73 65 74 20 7b 20 76           set { v
14870 65 72 62 6f 73 65 20 3d 20 76 61 6c 75 65 3b 20  erbose = value; 
14880 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
14890 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
148a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
148b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
148c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
148d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
148e0 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
148f0 20 20 20 70 72 69 76 61 74 65 20 62 6f 6f 6c 20     private bool 
14900 63 6f 6e 66 69 72 6d 3b 0d 0a 20 20 20 20 20 20  confirm;..      
14910 20 20 20 20 20 20 70 75 62 6c 69 63 20 62 6f 6f        public boo
14920 6c 20 43 6f 6e 66 69 72 6d 0d 0a 20 20 20 20 20  l Confirm..     
14930 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
14940 20 20 20 20 20 20 20 20 20 20 67 65 74 20 7b 20            get { 
14950 72 65 74 75 72 6e 20 63 6f 6e 66 69 72 6d 3b 20  return confirm; 
14960 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
14970 20 20 20 73 65 74 20 7b 20 63 6f 6e 66 69 72 6d     set { confirm
14980 20 3d 20 76 61 6c 75 65 3b 20 7d 0d 0a 20 20 20   = value; }..   
14990 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
149a0 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69          #endregi
149b0 6f 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  on..        }.. 
149c0 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f         #endregio
149d0 6e 0d 0a 20 20 20 20 20 20 20 20 23 65 6e 64 72  n..        #endr
149e0 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  egion....       
149f0 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
14a00 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14a10 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14a20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14a30 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
14a40 20 20 20 20 23 72 65 67 69 6f 6e 20 50 72 69 76      #region Priv
14a50 61 74 65 20 43 6f 6e 73 74 61 6e 74 20 44 61 74  ate Constant Dat
14a60 61 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61  a..        priva
14a70 74 65 20 63 6f 6e 73 74 20 73 74 72 69 6e 67 20  te const string 
14a80 43 6f 72 65 46 69 6c 65 4e 61 6d 65 20 3d 20 22  CoreFileName = "
14a90 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
14aa0 74 65 2e 64 6c 6c 22 3b 0d 0a 20 20 20 20 20 20  te.dll";..      
14ab0 20 20 70 72 69 76 61 74 65 20 63 6f 6e 73 74 20    private const 
14ac0 73 74 72 69 6e 67 20 4c 69 6e 71 46 69 6c 65 4e  string LinqFileN
14ad0 61 6d 65 20 3d 20 22 53 79 73 74 65 6d 2e 44 61  ame = "System.Da
14ae0 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64  ta.SQLite.Linq.d
14af0 6c 6c 22 3b 0d 0a 20 20 20 20 20 20 20 20 70 72  ll";..        pr
14b00 69 76 61 74 65 20 63 6f 6e 73 74 20 73 74 72 69  ivate const stri
14b10 6e 67 20 44 65 73 69 67 6e 65 72 46 69 6c 65 4e  ng DesignerFileN
14b20 61 6d 65 20 3d 20 22 53 51 4c 69 74 65 2e 44 65  ame = "SQLite.De
14b30 73 69 67 6e 65 72 2e 64 6c 6c 22 3b 0d 0a 20 20  signer.dll";..  
14b40 20 20 20 20 20 20 70 72 69 76 61 74 65 20 63 6f        private co
14b50 6e 73 74 20 73 74 72 69 6e 67 20 50 72 6f 76 69  nst string Provi
14b60 64 65 72 4e 61 6d 65 20 3d 20 22 53 51 4c 69 74  derName = "SQLit
14b70 65 20 44 61 74 61 20 50 72 6f 76 69 64 65 72 22  e Data Provider"
14b80 3b 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61  ;..        priva
14b90 74 65 20 63 6f 6e 73 74 20 73 74 72 69 6e 67 20  te const string 
14ba0 50 72 6f 6a 65 63 74 4e 61 6d 65 20 3d 20 22 53  ProjectName = "S
14bb0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
14bc0 65 22 3b 0d 0a 20 20 20 20 20 20 20 20 70 72 69  e";..        pri
14bd0 76 61 74 65 20 63 6f 6e 73 74 20 73 74 72 69 6e  vate const strin
14be0 67 20 4c 65 67 61 63 79 50 72 6f 6a 65 63 74 4e  g LegacyProjectN
14bf0 61 6d 65 20 3d 20 22 53 51 4c 69 74 65 22 3b 0d  ame = "SQLite";.
14c00 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65  .        private
14c10 20 63 6f 6e 73 74 20 73 74 72 69 6e 67 20 49 6e   const string In
14c20 76 61 72 69 61 6e 74 4e 61 6d 65 20 3d 20 22 53  variantName = "S
14c30 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
14c40 65 22 3b 0d 0a 20 20 20 20 20 20 20 20 70 72 69  e";..        pri
14c50 76 61 74 65 20 63 6f 6e 73 74 20 73 74 72 69 6e  vate const strin
14c60 67 20 46 61 63 74 6f 72 79 54 79 70 65 4e 61 6d  g FactoryTypeNam
14c70 65 20 3d 20 22 53 79 73 74 65 6d 2e 44 61 74 61  e = "System.Data
14c80 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 46 61  .SQLite.SQLiteFa
14c90 63 74 6f 72 79 22 3b 0d 0a 20 20 20 20 20 20 20  ctory";..       
14ca0 20 70 72 69 76 61 74 65 20 63 6f 6e 73 74 20 73   private const s
14cb0 74 72 69 6e 67 20 44 65 73 63 72 69 70 74 69 6f  tring Descriptio
14cc0 6e 20 3d 20 22 2e 4e 45 54 20 46 72 61 6d 65 77  n = ".NET Framew
14cd0 6f 72 6b 20 44 61 74 61 20 50 72 6f 76 69 64 65  ork Data Provide
14ce0 72 20 66 6f 72 20 53 51 4c 69 74 65 22 3b 0d 0a  r for SQLite";..
14cf0 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f  ..        //////
14d00 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14d10 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14d20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14d30 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14d40 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70 72 69  /....        pri
14d50 76 61 74 65 20 63 6f 6e 73 74 20 73 74 72 69 6e  vate const strin
14d60 67 20 4e 61 6d 65 41 6e 64 56 61 6c 75 65 46 6f  g NameAndValueFo
14d70 72 6d 61 74 20 3d 20 22 7b 30 7d 3a 20 7b 31 7d  rmat = "{0}: {1}
14d80 22 3b 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76  ";..        priv
14d90 61 74 65 20 63 6f 6e 73 74 20 73 74 72 69 6e 67  ate const string
14da0 20 54 72 61 63 65 46 6f 72 6d 61 74 20 3d 20 22   TraceFormat = "
14db0 23 7b 30 7d 20 40 20 7b 31 7d 3a 20 7b 32 7d 22  #{0} @ {1}: {2}"
14dc0 3b 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61  ;..        priva
14dd0 74 65 20 63 6f 6e 73 74 20 73 74 72 69 6e 67 20  te const string 
14de0 4c 6f 67 46 69 6c 65 53 75 66 66 69 78 20 3d 20  LogFileSuffix = 
14df0 22 2e 6c 6f 67 22 3b 0d 0a 0d 0a 20 20 20 20 20  ".log";....     
14e00 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
14e10 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14e20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14e30 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14e40 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
14e50 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74        private st
14e60 61 74 69 63 20 72 65 61 64 6f 6e 6c 79 20 73 74  atic readonly st
14e70 72 69 6e 67 20 56 73 49 64 46 6f 72 6d 61 74 20  ring VsIdFormat 
14e80 3d 20 22 42 22 3b 0d 0a 0d 0a 20 20 20 20 20 20  = "B";....      
14e90 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
14ea0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14eb0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14ec0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14ed0 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
14ee0 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61       private sta
14ef0 74 69 63 20 72 65 61 64 6f 6e 6c 79 20 73 74 72  tic readonly str
14f00 69 6e 67 20 46 72 61 6d 65 77 6f 72 6b 4b 65 79  ing FrameworkKey
14f10 4e 61 6d 65 20 3d 0d 0a 20 20 20 20 20 20 20 20  Name =..        
14f20 20 20 20 20 22 53 6f 66 74 77 61 72 65 5c 5c 4d      "Software\\M
14f30 69 63 72 6f 73 6f 66 74 5c 5c 2e 4e 45 54 46 72  icrosoft\\.NETFr
14f40 61 6d 65 77 6f 72 6b 22 3b 0d 0a 0d 0a 20 20 20  amework";....   
14f50 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
14f60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14f70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14f80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14f90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
14fa0 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
14fb0 73 74 61 74 69 63 20 72 65 61 64 6f 6e 6c 79 20  static readonly 
14fc0 73 74 72 69 6e 67 20 46 72 61 6d 65 77 6f 72 6b  string Framework
14fd0 53 64 6b 4b 65 79 4e 61 6d 65 20 3d 0d 0a 20 20  SdkKeyName =..  
14fe0 20 20 20 20 20 20 20 20 20 20 22 53 6f 66 74 77            "Softw
14ff0 61 72 65 5c 5c 4d 69 63 72 6f 73 6f 66 74 5c 5c  are\\Microsoft\\
15000 4d 69 63 72 6f 73 6f 66 74 20 53 44 4b 73 5c 5c  Microsoft SDKs\\
15010 2e 4e 45 54 46 72 61 6d 65 77 6f 72 6b 22 3b 0d  .NETFramework";.
15020 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f  ...        /////
15030 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15040 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15050 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15060 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15070 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70 72  //....        pr
15080 69 76 61 74 65 20 73 74 61 74 69 63 20 72 65 61  ivate static rea
15090 64 6f 6e 6c 79 20 73 74 72 69 6e 67 20 57 69 6e  donly string Win
150a0 64 6f 77 73 53 64 6b 4b 65 79 4e 61 6d 65 20 3d  dowsSdkKeyName =
150b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53  ..            "S
150c0 6f 66 74 77 61 72 65 5c 5c 4d 69 63 72 6f 73 6f  oftware\\Microso
150d0 66 74 5c 5c 4d 69 63 72 6f 73 6f 66 74 20 53 44  ft\\Microsoft SD
150e0 4b 73 5c 5c 57 69 6e 64 6f 77 73 22 3b 0d 0a 0d  Ks\\Windows";...
150f0 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f  .        ///////
15100 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15110 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15120 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15130 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15140 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76  ....        priv
15150 61 74 65 20 73 74 61 74 69 63 20 72 65 61 64 6f  ate static reado
15160 6e 6c 79 20 73 74 72 69 6e 67 20 58 50 61 74 68  nly string XPath
15170 46 6f 72 41 64 64 45 6c 65 6d 65 6e 74 20 3d 0d  ForAddElement =.
15180 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f  .            "co
15190 6e 66 69 67 75 72 61 74 69 6f 6e 2f 73 79 73 74  nfiguration/syst
151a0 65 6d 2e 64 61 74 61 2f 44 62 50 72 6f 76 69 64  em.data/DbProvid
151b0 65 72 46 61 63 74 6f 72 69 65 73 2f 61 64 64 5b  erFactories/add[
151c0 40 69 6e 76 61 72 69 61 6e 74 3d 5c 22 7b 30 7d  @invariant=\"{0}
151d0 5c 22 5d 22 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  \"]";....       
151e0 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
151f0 72 65 61 64 6f 6e 6c 79 20 73 74 72 69 6e 67 20  readonly string 
15200 58 50 61 74 68 46 6f 72 52 65 6d 6f 76 65 45 6c  XPathForRemoveEl
15210 65 6d 65 6e 74 20 3d 0d 0a 20 20 20 20 20 20 20  ement =..       
15220 20 20 20 20 20 22 63 6f 6e 66 69 67 75 72 61 74       "configurat
15230 69 6f 6e 2f 73 79 73 74 65 6d 2e 64 61 74 61 2f  ion/system.data/
15240 44 62 50 72 6f 76 69 64 65 72 46 61 63 74 6f 72  DbProviderFactor
15250 69 65 73 2f 72 65 6d 6f 76 65 5b 40 69 6e 76 61  ies/remove[@inva
15260 72 69 61 6e 74 3d 5c 22 7b 30 7d 5c 22 5d 22 3b  riant=\"{0}\"]";
15270 0d 0a 20 20 20 20 20 20 20 20 23 65 6e 64 72 65  ..        #endre
15280 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  gion....        
15290 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
152a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
152b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
152c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
152d0 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
152e0 20 20 20 23 72 65 67 69 6f 6e 20 50 72 69 76 61     #region Priva
152f0 74 65 20 44 61 74 61 0d 0a 20 20 20 20 20 20 20  te Data..       
15300 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
15310 41 73 73 65 6d 62 6c 79 20 74 68 69 73 41 73 73  Assembly thisAss
15320 65 6d 62 6c 79 20 3d 20 41 73 73 65 6d 62 6c 79  embly = Assembly
15330 2e 47 65 74 45 78 65 63 75 74 69 6e 67 41 73 73  .GetExecutingAss
15340 65 6d 62 6c 79 28 29 3b 0d 0a 0d 0a 20 20 20 20  embly();....    
15350 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
15360 69 63 20 73 74 72 69 6e 67 20 74 72 61 63 65 43  ic string traceC
15370 61 74 65 67 6f 72 79 20 3d 20 50 61 74 68 2e 47  ategory = Path.G
15380 65 74 46 69 6c 65 4e 61 6d 65 28 0d 0a 20 20 20  etFileName(..   
15390 20 20 20 20 20 20 20 20 20 74 68 69 73 41 73 73           thisAss
153a0 65 6d 62 6c 79 2e 4c 6f 63 61 74 69 6f 6e 29 3b  embly.Location);
153b0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76  ....        priv
153c0 61 74 65 20 73 74 61 74 69 63 20 54 72 61 63 65  ate static Trace
153d0 43 61 6c 6c 62 61 63 6b 20 74 72 61 63 65 43 61  Callback traceCa
153e0 6c 6c 62 61 63 6b 20 3d 20 41 70 70 54 72 61 63  llback = AppTrac
153f0 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  e;....        //
15400 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15410 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15420 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15430 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15440 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
15450 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
15460 52 65 67 69 73 74 72 79 4b 65 79 20 66 72 61 6d  RegistryKey fram
15470 65 77 6f 72 6b 52 6f 6f 74 4b 65 79 3b 0d 0a 20  eworkRootKey;.. 
15480 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73         private s
15490 74 61 74 69 63 20 53 74 72 69 6e 67 4c 69 73 74  tatic StringList
154a0 20 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 4c 69   frameworkNameLi
154b0 73 74 3b 0d 0a 20 20 20 20 20 20 20 20 70 72 69  st;..        pri
154c0 76 61 74 65 20 73 74 61 74 69 63 20 56 65 72 73  vate static Vers
154d0 69 6f 6e 4d 61 70 20 66 72 61 6d 65 77 6f 72 6b  ionMap framework
154e0 56 65 72 73 69 6f 6e 4d 61 70 3b 0d 0a 20 20 20  VersionMap;..   
154f0 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61       private sta
15500 74 69 63 20 53 74 72 69 6e 67 4c 69 73 74 20 70  tic StringList p
15510 6c 61 74 66 6f 72 6d 4e 61 6d 65 4c 69 73 74 3b  latformNameList;
15520 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f  ....        ////
15530 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15540 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15550 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15560 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15570 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70  ///....        p
15580 72 69 76 61 74 65 20 73 74 61 74 69 63 20 52 65  rivate static Re
15590 67 69 73 74 72 79 4b 65 79 20 76 73 52 6f 6f 74  gistryKey vsRoot
155a0 4b 65 79 3b 0d 0a 20 20 20 20 20 20 20 20 70 72  Key;..        pr
155b0 69 76 61 74 65 20 73 74 61 74 69 63 20 56 65 72  ivate static Ver
155c0 73 69 6f 6e 4c 69 73 74 20 76 73 56 65 72 73 69  sionList vsVersi
155d0 6f 6e 4c 69 73 74 3b 0d 0a 20 20 20 20 20 20 20  onList;..       
155e0 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
155f0 47 75 69 64 3f 20 76 73 50 61 63 6b 61 67 65 49  Guid? vsPackageI
15600 64 3b 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76  d;..        priv
15610 61 74 65 20 73 74 61 74 69 63 20 47 75 69 64 3f  ate static Guid?
15620 20 76 73 53 65 72 76 69 63 65 49 64 3b 0d 0a 20   vsServiceId;.. 
15630 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73         private s
15640 74 61 74 69 63 20 47 75 69 64 3f 20 76 73 44 61  tatic Guid? vsDa
15650 74 61 53 6f 75 72 63 65 73 49 64 3b 0d 0a 20 20  taSourcesId;..  
15660 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74        private st
15670 61 74 69 63 20 47 75 69 64 3f 20 76 73 44 61 74  atic Guid? vsDat
15680 61 50 72 6f 76 69 64 65 72 49 64 3b 0d 0a 20 20  aProviderId;..  
15690 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74        private st
156a0 61 74 69 63 20 47 75 69 64 3f 20 76 73 41 64 6f  atic Guid? vsAdo
156b0 4e 65 74 54 65 63 68 6e 6f 6c 6f 67 79 49 64 3b  NetTechnologyId;
156c0 0d 0a 20 20 20 20 20 20 20 20 23 65 6e 64 72 65  ..        #endre
156d0 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  gion....        
156e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
156f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15700 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15710 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15720 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
15730 20 20 20 23 72 65 67 69 6f 6e 20 54 72 61 63 65     #region Trace
15740 20 48 61 6e 64 6c 69 6e 67 0d 0a 20 20 20 20 20   Handling..     
15750 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69     private stati
15760 63 20 73 74 72 69 6e 67 20 47 65 74 4c 6f 67 46  c string GetLogF
15770 69 6c 65 4e 61 6d 65 28 29 0d 0a 20 20 20 20 20  ileName()..     
15780 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
15790 20 20 73 74 72 69 6e 67 20 72 65 73 75 6c 74 20    string result 
157a0 3d 20 50 61 74 68 2e 47 65 74 54 65 6d 70 46 69  = Path.GetTempFi
157b0 6c 65 4e 61 6d 65 28 29 3b 20 2f 2a 20 74 68 72  leName(); /* thr
157c0 6f 77 20 2a 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  ow */....       
157d0 20 20 20 20 20 46 69 6c 65 2e 4d 6f 76 65 28 72       File.Move(r
157e0 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 2b 20  esult, result + 
157f0 4c 6f 67 46 69 6c 65 53 75 66 66 69 78 29 3b 20  LogFileSuffix); 
15800 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a 20 20 20  /* throw */..   
15810 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20           result 
15820 2b 3d 20 4c 6f 67 46 69 6c 65 53 75 66 66 69 78  += LogFileSuffix
15830 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
15840 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0d   return result;.
15850 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
15860 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
15870 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15880 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15890 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
158a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
158b0 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65  .        private
158c0 20 73 74 61 74 69 63 20 76 6f 69 64 20 41 70 70   static void App
158d0 54 72 61 63 65 28 0d 0a 20 20 20 20 20 20 20 20  Trace(..        
158e0 20 20 20 20 73 74 72 69 6e 67 20 6d 65 73 73 61      string messa
158f0 67 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ge,..           
15900 20 73 74 72 69 6e 67 20 63 61 74 65 67 6f 72 79   string category
15910 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 0d  ..            ).
15920 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
15930 20 20 20 20 20 20 20 20 54 72 61 63 65 4f 70 73          TraceOps
15940 2e 54 72 61 63 65 43 6f 72 65 28 53 74 72 69 6e  .TraceCore(Strin
15950 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20  g.Format(..     
15960 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65             Trace
15970 46 6f 72 6d 61 74 2c 20 54 72 61 63 65 4f 70 73  Format, TraceOps
15980 2e 4e 65 78 74 49 64 28 29 2c 0d 0a 20 20 20 20  .NextId(),..    
15990 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63              Trac
159a0 65 4f 70 73 2e 54 69 6d 65 53 74 61 6d 70 28 44  eOps.TimeStamp(D
159b0 61 74 65 54 69 6d 65 2e 55 74 63 4e 6f 77 29 2c  ateTime.UtcNow),
159c0 20 6d 65 73 73 61 67 65 29 2c 20 63 61 74 65 67   message), categ
159d0 6f 72 79 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d  ory);..        }
159e0 0d 0a 20 20 20 20 20 20 20 20 23 65 6e 64 72 65  ..        #endre
159f0 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  gion....        
15a00 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15a10 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15a20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15a30 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15a40 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
15a50 20 20 20 23 72 65 67 69 6f 6e 20 47 65 6e 65 72     #region Gener
15a60 69 63 20 53 74 72 69 6e 67 20 48 61 6e 64 6c 69  ic String Handli
15a70 6e 67 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76  ng..        priv
15a80 61 74 65 20 73 74 61 74 69 63 20 73 74 72 69 6e  ate static strin
15a90 67 20 46 6f 72 44 69 73 70 6c 61 79 28 0d 0a 20  g ForDisplay(.. 
15aa0 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
15ab0 74 20 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 20  t value..       
15ac0 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20       )..        
15ad0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
15ae0 66 20 28 76 61 6c 75 65 20 3d 3d 20 6e 75 6c 6c  f (value == null
15af0 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
15b00 20 20 20 72 65 74 75 72 6e 20 22 3c 6e 75 6c 6c     return "<null
15b10 3e 22 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  >";....         
15b20 20 20 20 73 74 72 69 6e 67 20 72 65 73 75 6c 74     string result
15b30 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  ;..            T
15b40 79 70 65 20 74 79 70 65 20 3d 20 76 61 6c 75 65  ype type = value
15b50 2e 47 65 74 54 79 70 65 28 29 3b 0d 0a 0d 0a 20  .GetType();.... 
15b60 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 74             if (t
15b70 79 70 65 20 3d 3d 20 74 79 70 65 6f 66 28 58 6d  ype == typeof(Xm
15b80 6c 45 6c 65 6d 65 6e 74 29 29 0d 0a 20 20 20 20  lElement))..    
15b90 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
15ba0 20 20 20 20 20 20 20 20 20 20 20 58 6d 6c 45 6c             XmlEl
15bb0 65 6d 65 6e 74 20 65 6c 65 6d 65 6e 74 20 3d 20  ement element = 
15bc0 28 58 6d 6c 45 6c 65 6d 65 6e 74 29 76 61 6c 75  (XmlElement)valu
15bd0 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e;....          
15be0 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 65        result = e
15bf0 6c 65 6d 65 6e 74 2e 4f 75 74 65 72 58 6d 6c 3b  lement.OuterXml;
15c00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
15c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73  .            els
15c20 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  e..            {
15c30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15c40 20 20 72 65 73 75 6c 74 20 3d 20 76 61 6c 75 65    result = value
15c50 2e 54 6f 53 74 72 69 6e 67 28 29 3b 0d 0a 0d 0a  .ToString();....
15c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c70 69 66 20 28 72 65 73 75 6c 74 2e 4c 65 6e 67 74  if (result.Lengt
15c80 68 20 3d 3d 20 30 29 0d 0a 20 20 20 20 20 20 20  h == 0)..       
15c90 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
15ca0 75 72 6e 20 22 3c 65 6d 70 74 79 3e 22 3b 0d 0a  urn "<empty>";..
15cb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15cc0 20 20 72 65 73 75 6c 74 20 3d 20 53 74 72 69 6e    result = Strin
15cd0 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20  g.Format(..     
15ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
15cf0 79 70 65 2e 49 73 53 75 62 63 6c 61 73 73 4f 66  ype.IsSubclassOf
15d00 28 74 79 70 65 6f 66 28 56 61 6c 75 65 54 79 70  (typeof(ValueTyp
15d10 65 29 29 20 3f 20 22 7b 30 7d 22 20 3a 20 22 5c  e)) ? "{0}" : "\
15d20 22 7b 30 7d 5c 22 22 2c 0d 0a 20 20 20 20 20 20  "{0}\"",..      
15d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
15d40 73 75 6c 74 29 3b 0d 0a 20 20 20 20 20 20 20 20  sult);..        
15d50 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
15d60 20 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75       return resu
15d70 6c 74 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  lt;..        }..
15d80 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69          #endregi
15d90 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  on....        //
15da0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15db0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15dc0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15dd0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15de0 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
15df0 20 23 72 65 67 69 6f 6e 20 2e 4e 45 54 20 46 72   #region .NET Fr
15e00 61 6d 65 77 6f 72 6b 20 48 61 6e 64 6c 69 6e 67  amework Handling
15e10 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74  ..        privat
15e20 65 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  e static string 
15e30 47 65 74 46 72 61 6d 65 77 6f 72 6b 44 69 72 65  GetFrameworkDire
15e40 63 74 6f 72 79 28 0d 0a 20 20 20 20 20 20 20 20  ctory(..        
15e50 20 20 20 20 52 65 67 69 73 74 72 79 4b 65 79 20      RegistryKey 
15e60 72 6f 6f 74 4b 65 79 2c 0d 0a 20 20 20 20 20 20  rootKey,..      
15e70 20 20 20 20 20 20 56 65 72 73 69 6f 6e 20 66 72        Version fr
15e80 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 2c 0d  ameworkVersion,.
15e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f  .            boo
15ea0 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20  l whatIf,..     
15eb0 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62         bool verb
15ec0 6f 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ose..           
15ed0 20 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20   )..        {.. 
15ee0 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67             using
15ef0 20 28 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65   (MockRegistryKe
15f00 79 20 6b 65 79 20 3d 20 52 65 67 69 73 74 72 79  y key = Registry
15f10 48 65 6c 70 65 72 2e 4f 70 65 6e 53 75 62 4b 65  Helper.OpenSubKe
15f20 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y(..            
15f30 20 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c          rootKey,
15f40 20 46 72 61 6d 65 77 6f 72 6b 4b 65 79 4e 61 6d   FrameworkKeyNam
15f50 65 2c 20 66 61 6c 73 65 2c 20 77 68 61 74 49 66  e, false, whatIf
15f60 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a 20 20 20  , verbose))..   
15f70 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
15f80 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
15f90 6b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  key == null)..  
15fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fb0 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a    return null;..
15fc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15fd0 20 20 6f 62 6a 65 63 74 20 76 61 6c 75 65 20 3d    object value =
15fe0 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e   RegistryHelper.
15ff0 47 65 74 56 61 6c 75 65 28 0d 0a 20 20 20 20 20  GetValue(..     
16000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b                 k
16010 65 79 2c 20 22 49 6e 73 74 61 6c 6c 52 6f 6f 74  ey, "InstallRoot
16020 22 2c 20 6e 75 6c 6c 2c 20 77 68 61 74 49 66 2c  ", null, whatIf,
16030 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20   verbose);....  
16040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
16050 20 28 21 28 76 61 6c 75 65 20 69 73 20 73 74 72   (!(value is str
16060 69 6e 67 29 29 0d 0a 20 20 20 20 20 20 20 20 20  ing))..         
16070 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
16080 6e 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20  n null;....     
16090 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
160a0 6e 20 50 61 74 68 2e 43 6f 6d 62 69 6e 65 28 0d  n Path.Combine(.
160b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
160c0 20 20 20 20 20 28 73 74 72 69 6e 67 29 76 61 6c       (string)val
160d0 75 65 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61  ue, String.Forma
160e0 74 28 22 76 7b 30 7d 22 2c 20 66 72 61 6d 65 77  t("v{0}", framew
160f0 6f 72 6b 56 65 72 73 69 6f 6e 29 29 3b 0d 0a 20  orkVersion));.. 
16100 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
16110 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
16120 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
16130 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
16140 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
16150 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
16160 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
16170 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74        private st
16180 61 74 69 63 20 73 74 72 69 6e 67 20 47 65 74 53  atic string GetS
16190 64 6b 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  dkBinaryFileName
161a0 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 52  (..            R
161b0 65 67 69 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b  egistryKey rootK
161c0 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ey,..           
161d0 20 73 74 72 69 6e 67 20 66 69 6c 65 4e 61 6d 65   string fileName
161e0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ,..            b
161f0 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20  ool whatIf,..   
16200 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65           bool ve
16210 72 62 6f 73 65 0d 0a 20 20 20 20 20 20 20 20 20  rbose..         
16220 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d     )..        {.
16230 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 74 72  .            Str
16240 69 6e 67 44 69 63 74 69 6f 6e 61 72 79 20 72 65  ingDictionary re
16250 73 75 6c 74 73 20 3d 20 6e 65 77 20 53 74 72 69  sults = new Stri
16260 6e 67 44 69 63 74 69 6f 6e 61 72 79 28 29 3b 0d  ngDictionary();.
16270 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ...            s
16280 74 72 69 6e 67 5b 5d 20 6b 65 79 4e 61 6d 65 73  tring[] keyNames
16290 20 3d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20   = {..          
162a0 20 20 20 20 20 20 46 72 61 6d 65 77 6f 72 6b 4b        FrameworkK
162b0 65 79 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20  eyName,..       
162c0 20 20 20 20 20 20 20 20 20 46 72 61 6d 65 77 6f           Framewo
162d0 72 6b 53 64 6b 4b 65 79 4e 61 6d 65 2c 0d 0a 20  rkSdkKeyName,.. 
162e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
162f0 69 6e 64 6f 77 73 53 64 6b 4b 65 79 4e 61 6d 65  indowsSdkKeyName
16300 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 3b  ..            };
16310 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
16320 73 74 72 69 6e 67 5b 5d 20 76 61 6c 75 65 4e 61  string[] valueNa
16330 6d 65 73 20 3d 20 7b 0d 0a 20 20 20 20 20 20 20  mes = {..       
16340 20 20 20 20 20 20 20 20 20 22 73 64 6b 49 6e 73           "sdkIns
16350 74 61 6c 6c 52 6f 6f 74 76 32 2e 30 22 2c 0d 0a  tallRootv2.0",..
16360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16370 22 49 6e 73 74 61 6c 6c 61 74 69 6f 6e 46 6f 6c  "InstallationFol
16380 64 65 72 22 2c 0d 0a 20 20 20 20 20 20 20 20 20  der",..         
16390 20 20 20 20 20 20 20 22 49 6e 73 74 61 6c 6c 61         "Installa
163a0 74 69 6f 6e 46 6f 6c 64 65 72 22 0d 0a 20 20 20  tionFolder"..   
163b0 20 20 20 20 20 20 20 20 20 7d 3b 0d 0a 0d 0a 20           };.... 
163c0 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 5b             bool[
163d0 5d 20 75 73 65 53 75 62 4b 65 79 73 20 3d 20 7b  ] useSubKeys = {
163e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
163f0 20 20 66 61 6c 73 65 2c 0d 0a 20 20 20 20 20 20    false,..      
16400 20 20 20 20 20 20 20 20 20 20 74 72 75 65 2c 0d            true,.
16410 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16420 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20   true..         
16430 20 20 20 7d 3b 0d 0a 0d 0a 20 20 20 20 20 20 20     };....       
16440 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 6e       for (int in
16450 64 65 78 20 3d 20 30 3b 20 69 6e 64 65 78 20 3c  dex = 0; index <
16460 20 6b 65 79 4e 61 6d 65 73 2e 4c 65 6e 67 74 68   keyNames.Length
16470 3b 20 69 6e 64 65 78 2b 2b 29 0d 0a 20 20 20 20  ; index++)..    
16480 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
16490 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67             using
164a0 20 28 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65   (MockRegistryKe
164b0 79 20 6b 65 79 20 3d 20 52 65 67 69 73 74 72 79  y key = Registry
164c0 48 65 6c 70 65 72 2e 4f 70 65 6e 53 75 62 4b 65  Helper.OpenSubKe
164d0 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y(..            
164e0 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74              root
164f0 4b 65 79 2c 20 6b 65 79 4e 61 6d 65 73 5b 69 6e  Key, keyNames[in
16500 64 65 78 5d 2c 20 66 61 6c 73 65 2c 20 77 68 61  dex], false, wha
16510 74 49 66 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a  tIf, verbose))..
16520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16530 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
16540 20 20 20 20 20 20 20 69 66 20 28 6b 65 79 20 3d         if (key =
16550 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
16560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16570 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 0d 0a 20 20   continue;....  
16580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16590 20 20 69 66 20 28 75 73 65 53 75 62 4b 65 79 73    if (useSubKeys
165a0 5b 69 6e 64 65 78 5d 29 0d 0a 20 20 20 20 20 20  [index])..      
165b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
165c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
165d0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
165e0 20 28 73 74 72 69 6e 67 20 73 75 62 4b 65 79 4e   (string subKeyN
165f0 61 6d 65 20 69 6e 20 52 65 67 69 73 74 72 79 48  ame in RegistryH
16600 65 6c 70 65 72 2e 47 65 74 53 75 62 4b 65 79 4e  elper.GetSubKeyN
16610 61 6d 65 73 28 0d 0a 20 20 20 20 20 20 20 20 20  ames(..         
16620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16630 20 20 20 20 20 20 20 6b 65 79 2c 20 77 68 61 74         key, what
16640 49 66 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a 20  If, verbose)).. 
16650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16660 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
16670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16680 20 20 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63        using (Moc
16690 6b 52 65 67 69 73 74 72 79 4b 65 79 20 73 75 62  kRegistryKey sub
166a0 4b 65 79 20 3d 20 52 65 67 69 73 74 72 79 48 65  Key = RegistryHe
166b0 6c 70 65 72 2e 4f 70 65 6e 53 75 62 4b 65 79 28  lper.OpenSubKey(
166c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
166d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166e0 20 20 20 20 20 20 6b 65 79 2c 20 73 75 62 4b 65        key, subKe
166f0 79 4e 61 6d 65 2c 20 66 61 6c 73 65 2c 20 77 68  yName, false, wh
16700 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29 29 0d  atIf, verbose)).
16710 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16720 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
16730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16750 69 66 20 28 73 75 62 4b 65 79 20 3d 3d 20 6e 75  if (subKey == nu
16760 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
16770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16780 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
16790 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e;....          
167a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167b0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 76 61 6c        object val
167c0 75 65 20 3d 20 52 65 67 69 73 74 72 79 48 65 6c  ue = RegistryHel
167d0 70 65 72 2e 47 65 74 56 61 6c 75 65 28 0d 0a 20  per.GetValue(.. 
167e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16800 20 20 20 73 75 62 4b 65 79 2c 20 76 61 6c 75 65     subKey, value
16810 4e 61 6d 65 73 5b 69 6e 64 65 78 5d 2c 20 6e 75  Names[index], nu
16820 6c 6c 2c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20  ll, whatIf,..   
16830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16850 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20   verbose);....  
16860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
16880 20 28 21 28 76 61 6c 75 65 20 69 73 20 73 74 72   (!(value is str
16890 69 6e 67 29 29 0d 0a 20 20 20 20 20 20 20 20 20  ing))..         
168a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168b0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
168c0 6e 75 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nue;....        
168d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168e0 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 70          string p
168f0 61 74 68 20 3d 20 28 73 74 72 69 6e 67 29 76 61  ath = (string)va
16900 6c 75 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lue;....        
16910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16920 20 20 20 20 20 20 20 20 69 66 20 28 21 44 69 72          if (!Dir
16930 65 63 74 6f 72 79 2e 45 78 69 73 74 73 28 70 61  ectory.Exists(pa
16940 74 68 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  th))..          
16950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16960 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
16970 75 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ue;....         
16980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16990 20 20 20 20 20 20 20 70 61 74 68 20 3d 20 50 61         path = Pa
169a0 74 68 2e 43 6f 6d 62 69 6e 65 28 70 61 74 68 2c  th.Combine(path,
169b0 20 22 62 69 6e 22 29 3b 0d 0a 0d 0a 20 20 20 20   "bin");....    
169c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
169e0 21 44 69 72 65 63 74 6f 72 79 2e 45 78 69 73 74  !Directory.Exist
169f0 73 28 70 61 74 68 29 29 0d 0a 20 20 20 20 20 20  s(path))..      
16a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
16a20 6e 74 69 6e 75 65 3b 0d 0a 0d 0a 20 20 20 20 20  ntinue;....     
16a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a40 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 53             if (S
16a50 74 72 69 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d  tring.IsNullOrEm
16a60 70 74 79 28 66 69 6c 65 4e 61 6d 65 29 29 0d 0a  pty(fileName))..
16a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a90 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
16aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ab0 20 20 20 20 20 20 20 72 65 73 75 6c 74 73 2e 41         results.A
16ac0 64 64 28 73 75 62 4b 65 79 2e 4e 61 6d 65 2c 20  dd(subKey.Name, 
16ad0 70 61 74 68 29 3b 0d 0a 20 20 20 20 20 20 20 20  path);..        
16ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16af0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
16b00 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  inue;..         
16b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
16b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b40 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68              path
16b50 20 3d 20 50 61 74 68 2e 43 6f 6d 62 69 6e 65 28   = Path.Combine(
16b60 70 61 74 68 2c 20 66 69 6c 65 4e 61 6d 65 29 3b  path, fileName);
16b70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
16b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b90 20 20 20 20 69 66 20 28 46 69 6c 65 2e 45 78 69      if (File.Exi
16ba0 73 74 73 28 70 61 74 68 29 29 0d 0a 20 20 20 20  sts(path))..    
16bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bd0 72 65 73 75 6c 74 73 2e 41 64 64 28 73 75 62 4b  results.Add(subK
16be0 65 79 2e 4e 61 6d 65 2c 20 70 61 74 68 29 3b 0d  ey.Name, path);.
16bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16c00 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
16c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
16c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
16c40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16c50 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20        else..    
16c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c70 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
16c80 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
16c90 74 20 76 61 6c 75 65 20 3d 20 52 65 67 69 73 74  t value = Regist
16ca0 72 79 48 65 6c 70 65 72 2e 47 65 74 56 61 6c 75  ryHelper.GetValu
16cb0 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e(..            
16cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cd0 6b 65 79 2c 20 76 61 6c 75 65 4e 61 6d 65 73 5b  key, valueNames[
16ce0 69 6e 64 65 78 5d 2c 20 6e 75 6c 6c 2c 20 77 68  index], null, wh
16cf0 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d  atIf, verbose);.
16d00 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
16d10 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
16d20 28 76 61 6c 75 65 20 69 73 20 73 74 72 69 6e 67  (value is string
16d30 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
16d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d50 63 6f 6e 74 69 6e 75 65 3b 0d 0a 0d 0a 20 20 20  continue;....   
16d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d70 20 20 20 20 20 73 74 72 69 6e 67 20 70 61 74 68       string path
16d80 20 3d 20 28 73 74 72 69 6e 67 29 76 61 6c 75 65   = (string)value
16d90 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
16da0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
16db0 28 21 44 69 72 65 63 74 6f 72 79 2e 45 78 69 73  (!Directory.Exis
16dc0 74 73 28 70 61 74 68 29 29 0d 0a 20 20 20 20 20  ts(path))..     
16dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16de0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
16df0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
16e00 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68              path
16e10 20 3d 20 50 61 74 68 2e 43 6f 6d 62 69 6e 65 28   = Path.Combine(
16e20 70 61 74 68 2c 20 22 62 69 6e 22 29 3b 0d 0a 0d  path, "bin");...
16e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16e40 20 20 20 20 20 20 20 20 20 69 66 20 28 21 44 69           if (!Di
16e50 72 65 63 74 6f 72 79 2e 45 78 69 73 74 73 28 70  rectory.Exists(p
16e60 61 74 68 29 29 0d 0a 20 20 20 20 20 20 20 20 20  ath))..         
16e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e80 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 0d 0a     continue;....
16e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ea0 20 20 20 20 20 20 20 20 69 66 20 28 53 74 72 69          if (Stri
16eb0 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79  ng.IsNullOrEmpty
16ec0 28 66 69 6c 65 4e 61 6d 65 29 29 0d 0a 20 20 20  (fileName))..   
16ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ee0 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
16ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f00 20 20 20 20 72 65 73 75 6c 74 73 2e 41 64 64 28      results.Add(
16f10 6b 65 79 2e 4e 61 6d 65 2c 20 70 61 74 68 29 3b  key.Name, path);
16f20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
16f40 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20  ntinue;..       
16f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f60 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
16f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
16f80 74 68 20 3d 20 50 61 74 68 2e 43 6f 6d 62 69 6e  th = Path.Combin
16f90 65 28 70 61 74 68 2c 20 66 69 6c 65 4e 61 6d 65  e(path, fileName
16fa0 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
16fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
16fc0 20 28 46 69 6c 65 2e 45 78 69 73 74 73 28 70 61   (File.Exists(pa
16fd0 74 68 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  th))..          
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ff0 20 20 72 65 73 75 6c 74 73 2e 41 64 64 28 6b 65    results.Add(ke
17000 79 2e 4e 61 6d 65 2c 20 70 61 74 68 29 3b 0d 0a  y.Name, path);..
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17020 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
17030 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
17040 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
17050 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
17060 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20         // NOTE: 
17070 49 66 20 77 65 20 66 6f 75 6e 64 20 73 6f 6d 65  If we found some
17080 20 72 65 73 75 6c 74 73 2c 20 72 65 74 75 72 6e   results, return
17090 20 74 68 65 20 6c 61 73 74 20 28 6c 61 74 65 73   the last (lates
170a0 74 29 20 6f 6e 65 2e 0d 0a 20 20 20 20 20 20 20  t) one...       
170b0 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
170c0 20 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 73       if (results
170d0 2e 43 6f 75 6e 74 20 3e 20 30 29 0d 0a 20 20 20  .Count > 0)..   
170e0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
170f0 75 72 6e 20 72 65 73 75 6c 74 73 5b 6e 65 77 20  urn results[new 
17100 53 74 72 69 6e 67 4c 69 73 74 28 72 65 73 75 6c  StringList(resul
17110 74 73 2e 4b 65 79 73 29 5b 72 65 73 75 6c 74 73  ts.Keys)[results
17120 2e 43 6f 75 6e 74 20 2d 20 31 5d 5d 3b 0d 0a 0d  .Count - 1]];...
17130 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
17140 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20  urn null;..     
17150 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 23 65     }..        #e
17160 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20  ndregion....    
17170 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
17180 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
17190 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
171a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
171b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
171c0 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 50         #region P
171d0 65 72 2d 46 72 61 6d 65 77 6f 72 6b 2f 50 6c 61  er-Framework/Pla
171e0 74 66 6f 72 6d 20 48 61 6e 64 6c 69 6e 67 0d 0a  tform Handling..
171f0 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
17200 73 74 61 74 69 63 20 76 6f 69 64 20 49 6e 69 74  static void Init
17210 69 61 6c 69 7a 65 41 6c 6c 46 72 61 6d 65 77 6f  ializeAllFramewo
17220 72 6b 73 28 0d 0a 20 20 20 20 20 20 20 20 20 20  rks(..          
17230 20 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20    Configuration 
17240 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 20  configuration.. 
17250 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20             )..  
17260 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
17270 20 20 20 20 20 69 66 20 28 66 72 61 6d 65 77 6f       if (framewo
17280 72 6b 52 6f 6f 74 4b 65 79 20 3d 3d 20 6e 75 6c  rkRootKey == nul
17290 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
172a0 20 20 20 20 66 72 61 6d 65 77 6f 72 6b 52 6f 6f      frameworkRoo
172b0 74 4b 65 79 20 3d 20 52 65 67 69 73 74 72 79 2e  tKey = Registry.
172c0 4c 6f 63 61 6c 4d 61 63 68 69 6e 65 3b 0d 0a 0d  LocalMachine;...
172d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
172e0 28 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 4c 69  (frameworkNameLi
172f0 73 74 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  st == null)..   
17300 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
17310 20 20 20 20 20 20 20 20 20 20 20 20 66 72 61 6d              fram
17320 65 77 6f 72 6b 4e 61 6d 65 4c 69 73 74 20 3d 20  eworkNameList = 
17330 6e 65 77 20 53 74 72 69 6e 67 4c 69 73 74 28 29  new StringList()
17340 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
17350 20 20 20 20 20 69 66 20 28 28 63 6f 6e 66 69 67       if ((config
17360 75 72 61 74 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29  uration == null)
17370 20 7c 7c 20 21 63 6f 6e 66 69 67 75 72 61 74 69   || !configurati
17380 6f 6e 2e 4e 6f 44 65 73 6b 74 6f 70 29 0d 0a 20  on.NoDesktop).. 
17390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173a0 20 20 20 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65     frameworkName
173b0 4c 69 73 74 2e 41 64 64 28 22 2e 4e 45 54 46 72  List.Add(".NETFr
173c0 61 6d 65 77 6f 72 6b 22 29 3b 0d 0a 0d 0a 20 20  amework");....  
173d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
173e0 20 28 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   ((configuration
173f0 20 3d 3d 20 6e 75 6c 6c 29 20 7c 7c 20 21 63 6f   == null) || !co
17400 6e 66 69 67 75 72 61 74 69 6f 6e 2e 4e 6f 43 6f  nfiguration.NoCo
17410 6d 70 61 63 74 29 0d 0a 20 20 20 20 20 20 20 20  mpact)..        
17420 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
17430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
17440 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 4c 69 73 74  rameworkNameList
17450 2e 41 64 64 28 22 2e 4e 45 54 43 6f 6d 70 61 63  .Add(".NETCompac
17460 74 46 72 61 6d 65 77 6f 72 6b 22 29 3b 0d 0a 20  tFramework");.. 
17470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17480 20 20 20 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65     frameworkName
17490 4c 69 73 74 2e 41 64 64 28 22 2e 4e 45 54 43 6f  List.Add(".NETCo
174a0 6d 70 61 63 74 46 72 61 6d 65 77 6f 72 6b 22 29  mpactFramework")
174b0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
174c0 20 20 20 20 20 20 20 66 72 61 6d 65 77 6f 72 6b         framework
174d0 4e 61 6d 65 4c 69 73 74 2e 41 64 64 28 22 2e 4e  NameList.Add(".N
174e0 45 54 43 6f 6d 70 61 63 74 46 72 61 6d 65 77 6f  ETCompactFramewo
174f0 72 6b 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  rk");..         
17500 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
17510 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
17520 20 20 20 20 20 20 20 69 66 20 28 66 72 61 6d 65         if (frame
17530 77 6f 72 6b 56 65 72 73 69 6f 6e 4d 61 70 20 3d  workVersionMap =
17540 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
17550 20 20 20 20 20 20 20 20 20 66 72 61 6d 65 77 6f           framewo
17560 72 6b 56 65 72 73 69 6f 6e 4d 61 70 20 3d 20 6e  rkVersionMap = n
17570 65 77 20 56 65 72 73 69 6f 6e 4d 61 70 28 29 3b  ew VersionMap();
17580 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
17590 69 66 20 28 28 63 6f 6e 66 69 67 75 72 61 74 69  if ((configurati
175a0 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 20 7c 7c 20 21  on == null) || !
175b0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 4e 6f  configuration.No
175c0 44 65 73 6b 74 6f 70 29 0d 0a 20 20 20 20 20 20  Desktop)..      
175d0 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
175e0 20 20 20 20 20 20 20 20 20 56 65 72 73 69 6f 6e           Version
175f0 4c 69 73 74 20 64 65 73 6b 74 6f 70 56 65 72 73  List desktopVers
17600 69 6f 6e 4c 69 73 74 20 3d 20 6e 65 77 20 56 65  ionList = new Ve
17610 72 73 69 6f 6e 4c 69 73 74 28 29 3b 0d 0a 0d 0a  rsionList();....
17620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17630 69 66 20 28 28 63 6f 6e 66 69 67 75 72 61 74 69  if ((configurati
17640 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 20 7c 7c 20 21  on == null) || !
17650 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 4e 6f  configuration.No
17660 4e 65 74 46 78 32 30 29 0d 0a 20 20 20 20 20 20  NetFx20)..      
17670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
17680 73 6b 74 6f 70 56 65 72 73 69 6f 6e 4c 69 73 74  sktopVersionList
17690 2e 41 64 64 28 6e 65 77 20 56 65 72 73 69 6f 6e  .Add(new Version
176a0 28 32 2c 20 30 2c 20 35 30 37 32 37 29 29 3b 0d  (2, 0, 50727));.
176b0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
176c0 20 20 20 69 66 20 28 28 63 6f 6e 66 69 67 75 72     if ((configur
176d0 61 74 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 20 7c  ation == null) |
176e0 7c 20 21 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  | !configuration
176f0 2e 4e 6f 4e 65 74 46 78 34 30 29 0d 0a 20 20 20  .NoNetFx40)..   
17700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17710 20 64 65 73 6b 74 6f 70 56 65 72 73 69 6f 6e 4c   desktopVersionL
17720 69 73 74 2e 41 64 64 28 6e 65 77 20 56 65 72 73  ist.Add(new Vers
17730 69 6f 6e 28 34 2c 20 30 2c 20 33 30 33 31 39 29  ion(4, 0, 30319)
17740 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
17750 20 20 20 20 20 20 66 72 61 6d 65 77 6f 72 6b 56        frameworkV
17760 65 72 73 69 6f 6e 4d 61 70 2e 41 64 64 28 22 2e  ersionMap.Add(".
17770 4e 45 54 46 72 61 6d 65 77 6f 72 6b 22 2c 20 64  NETFramework", d
17780 65 73 6b 74 6f 70 56 65 72 73 69 6f 6e 4c 69 73  esktopVersionLis
17790 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t);..           
177a0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
177b0 20 20 69 66 20 28 28 63 6f 6e 66 69 67 75 72 61    if ((configura
177c0 74 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 20 7c 7c  tion == null) ||
177d0 20 21 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e   !configuration.
177e0 4e 6f 43 6f 6d 70 61 63 74 29 0d 0a 20 20 20 20  NoCompact)..    
177f0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
17800 20 20 20 20 20 20 20 20 20 20 20 66 72 61 6d 65             frame
17810 77 6f 72 6b 56 65 72 73 69 6f 6e 4d 61 70 2e 41  workVersionMap.A
17820 64 64 28 22 2e 4e 45 54 43 6f 6d 70 61 63 74 46  dd(".NETCompactF
17830 72 61 6d 65 77 6f 72 6b 22 2c 20 6e 65 77 20 56  ramework", new V
17840 65 72 73 69 6f 6e 4c 69 73 74 28 0d 0a 20 20 20  ersionList(..   
17850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17860 20 6e 65 77 20 56 65 72 73 69 6f 6e 5b 5d 20 7b   new Version[] {
17870 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17880 20 20 20 20 20 20 6e 65 77 20 56 65 72 73 69 6f        new Versio
17890 6e 28 32 2c 20 30 2c 20 30 2c 20 30 29 2c 20 6e  n(2, 0, 0, 0), n
178a0 65 77 20 56 65 72 73 69 6f 6e 28 33 2c 20 35 2c  ew Version(3, 5,
178b0 20 30 2c 20 30 29 0d 0a 20 20 20 20 20 20 20 20   0, 0)..        
178c0 20 20 20 20 20 20 20 20 7d 29 29 3b 0d 0a 20 20          }));..  
178d0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
178e0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 70             if (p
178f0 6c 61 74 66 6f 72 6d 4e 61 6d 65 4c 69 73 74 20  latformNameList 
17900 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
17910 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
17920 20 20 20 20 20 20 20 20 20 70 6c 61 74 66 6f 72           platfor
17930 6d 4e 61 6d 65 4c 69 73 74 20 3d 20 6e 65 77 20  mNameList = new 
17940 53 74 72 69 6e 67 4c 69 73 74 28 29 3b 0d 0a 0d  StringList();...
17950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17960 20 69 66 20 28 28 63 6f 6e 66 69 67 75 72 61 74   if ((configurat
17970 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 20 7c 7c 20  ion == null) || 
17980 21 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 4e  !configuration.N
17990 6f 44 65 73 6b 74 6f 70 29 0d 0a 20 20 20 20 20  oDesktop)..     
179a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
179b0 6c 61 74 66 6f 72 6d 4e 61 6d 65 4c 69 73 74 2e  latformNameList.
179c0 41 64 64 28 6e 75 6c 6c 29 3b 0d 0a 0d 0a 20 20  Add(null);....  
179d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
179e0 20 28 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   ((configuration
179f0 20 3d 3d 20 6e 75 6c 6c 29 20 7c 7c 20 21 63 6f   == null) || !co
17a00 6e 66 69 67 75 72 61 74 69 6f 6e 2e 4e 6f 43 6f  nfiguration.NoCo
17a10 6d 70 61 63 74 29 0d 0a 20 20 20 20 20 20 20 20  mpact)..        
17a20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
17a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
17a40 6c 61 74 66 6f 72 6d 4e 61 6d 65 4c 69 73 74 2e  latformNameList.
17a50 41 64 64 28 22 50 6f 63 6b 65 74 50 43 22 29 3b  Add("PocketPC");
17a60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17a70 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d 4e 61        platformNa
17a80 6d 65 4c 69 73 74 2e 41 64 64 28 22 53 6d 61 72  meList.Add("Smar
17a90 74 70 68 6f 6e 65 22 29 3b 0d 0a 20 20 20 20 20  tphone");..     
17aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
17ab0 6c 61 74 66 6f 72 6d 4e 61 6d 65 4c 69 73 74 2e  latformNameList.
17ac0 41 64 64 28 22 57 69 6e 64 6f 77 73 43 45 22 29  Add("WindowsCE")
17ad0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
17ae0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
17af0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
17b00 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f  ..        //////
17b10 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
17b20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
17b30 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
17b40 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
17b50 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70 72 69  /....        pri
17b60 76 61 74 65 20 73 74 61 74 69 63 20 62 6f 6f 6c  vate static bool
17b70 20 48 61 76 65 46 72 61 6d 65 77 6f 72 6b 28 0d   HaveFramework(.
17b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 52 65 67  .            Reg
17b90 69 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b 65 79  istryKey rootKey
17ba0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ,..            s
17bb0 74 72 69 6e 67 20 66 72 61 6d 65 77 6f 72 6b 4e  tring frameworkN
17bc0 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ame,..          
17bd0 20 20 56 65 72 73 69 6f 6e 20 66 72 61 6d 65 77    Version framew
17be0 6f 72 6b 56 65 72 73 69 6f 6e 2c 0d 0a 20 20 20  orkVersion,..   
17bf0 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
17c00 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 2c 0d 0a 20  platformName,.. 
17c10 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20             bool 
17c20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20  whatIf,..       
17c30 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62 6f 73       bool verbos
17c40 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  e..            )
17c50 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
17c60 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
17c70 66 6f 72 6d 61 74 20 3d 20 21 53 74 72 69 6e 67  format = !String
17c80 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 70  .IsNullOrEmpty(p
17c90 6c 61 74 66 6f 72 6d 4e 61 6d 65 29 20 3f 0d 0a  latformName) ?..
17ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cb0 22 53 6f 66 74 77 61 72 65 5c 5c 4d 69 63 72 6f  "Software\\Micro
17cc0 73 6f 66 74 5c 5c 7b 30 7d 5c 5c 76 7b 31 7d 5c  soft\\{0}\\v{1}\
17cd0 5c 7b 32 7d 22 20 3a 0d 0a 20 20 20 20 20 20 20  \{2}" :..       
17ce0 20 20 20 20 20 20 20 20 20 22 53 6f 66 74 77 61           "Softwa
17cf0 72 65 5c 5c 4d 69 63 72 6f 73 6f 66 74 5c 5c 7b  re\\Microsoft\\{
17d00 30 7d 5c 5c 76 7b 31 7d 22 3b 0d 0a 0d 0a 20 20  0}\\v{1}";....  
17d10 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
17d20 20 6b 65 79 4e 61 6d 65 20 3d 20 53 74 72 69 6e   keyName = Strin
17d30 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20  g.Format(..     
17d40 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 6d 61             forma
17d50 74 2c 20 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65  t, frameworkName
17d60 2c 20 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69  , frameworkVersi
17d70 6f 6e 2c 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65  on, platformName
17d80 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
17d90 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52 65 67    using (MockReg
17da0 69 73 74 72 79 4b 65 79 20 6b 65 79 20 3d 20 52  istryKey key = R
17db0 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 4f 70  egistryHelper.Op
17dc0 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20 20 20 20  enSubKey(..     
17dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
17de0 6f 6f 74 4b 65 79 2c 20 6b 65 79 4e 61 6d 65 2c  ootKey, keyName,
17df0 20 66 61 6c 73 65 2c 20 77 68 61 74 49 66 2c 20   false, whatIf, 
17e00 76 65 72 62 6f 73 65 29 29 0d 0a 20 20 20 20 20  verbose))..     
17e10 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
17e20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6b 65            if (ke
17e30 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  y == null)..    
17e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e50 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d  return false;...
17e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17e70 20 69 66 20 28 70 6c 61 74 66 6f 72 6d 4e 61 6d   if (platformNam
17e80 65 20 21 3d 20 6e 75 6c 6c 29 20 2f 2f 20 4e 4f  e != null) // NO
17e90 54 45 3a 20 53 6b 69 70 20 6e 6f 6e 2d 64 65 73  TE: Skip non-des
17ea0 6b 74 6f 70 20 66 72 61 6d 65 77 6f 72 6b 73 2e  ktop frameworks.
17eb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17ec0 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
17ed0 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e;....          
17ee0 20 20 20 20 20 20 73 74 72 69 6e 67 20 64 69 72        string dir
17ef0 65 63 74 6f 72 79 20 3d 20 47 65 74 46 72 61 6d  ectory = GetFram
17f00 65 77 6f 72 6b 44 69 72 65 63 74 6f 72 79 28 0d  eworkDirectory(.
17f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17f20 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20 66 72       rootKey, fr
17f30 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 2c 20  ameworkVersion, 
17f40 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29  whatIf, verbose)
17f50 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
17f60 20 20 20 20 20 69 66 20 28 53 74 72 69 6e 67 2e       if (String.
17f70 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 64 69  IsNullOrEmpty(di
17f80 72 65 63 74 6f 72 79 29 29 0d 0a 20 20 20 20 20  rectory))..     
17f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
17fa0 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a  eturn false;....
17fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fc0 69 66 20 28 21 44 69 72 65 63 74 6f 72 79 2e 45  if (!Directory.E
17fd0 78 69 73 74 73 28 64 69 72 65 63 74 6f 72 79 29  xists(directory)
17fe0 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
17ff0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
18000 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lse;....        
18010 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
18020 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  rue;..          
18030 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
18040 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f  ..        //////
18050 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
18060 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
18070 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
18080 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
18090 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70 72 69  /....        pri
180a0 76 61 74 65 20 73 74 61 74 69 63 20 62 6f 6f 6c  vate static bool
180b0 20 46 6f 72 45 61 63 68 46 72 61 6d 65 77 6f 72   ForEachFramewor
180c0 6b 43 6f 6e 66 69 67 28 0d 0a 20 20 20 20 20 20  kConfig(..      
180d0 20 20 20 20 20 20 46 72 61 6d 65 77 6f 72 6b 43        FrameworkC
180e0 6f 6e 66 69 67 43 61 6c 6c 62 61 63 6b 20 63 61  onfigCallback ca
180f0 6c 6c 62 61 63 6b 2c 0d 0a 20 20 20 20 20 20 20  llback,..       
18100 20 20 20 20 20 73 74 72 69 6e 67 20 69 6e 76 61       string inva
18110 72 69 61 6e 74 2c 0d 0a 20 20 20 20 20 20 20 20  riant,..        
18120 20 20 20 20 73 74 72 69 6e 67 20 6e 61 6d 65 2c      string name,
18130 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  ..            st
18140 72 69 6e 67 20 64 65 73 63 72 69 70 74 69 6f 6e  ring description
18150 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ,..            s
18160 74 72 69 6e 67 20 74 79 70 65 4e 61 6d 65 2c 0d  tring typeName,.
18170 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 73 73  .            Ass
18180 65 6d 62 6c 79 4e 61 6d 65 20 61 73 73 65 6d 62  emblyName assemb
18190 6c 79 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20  lyName,..       
181a0 20 20 20 20 20 6f 62 6a 65 63 74 20 63 6c 69 65       object clie
181b0 6e 74 44 61 74 61 2c 0d 0a 20 20 20 20 20 20 20  ntData,..       
181c0 20 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66       bool whatIf
181d0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ,..            b
181e0 6f 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a 20 20  ool verbose,..  
181f0 20 20 20 20 20 20 20 20 20 20 72 65 66 20 62 6f            ref bo
18200 6f 6c 20 73 61 76 65 64 2c 0d 0a 20 20 20 20 20  ol saved,..     
18210 20 20 20 20 20 20 20 72 65 66 20 73 74 72 69 6e         ref strin
18220 67 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20  g error..       
18230 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20       )..        
18240 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 52  {..            R
18250 65 67 69 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b  egistryKey rootK
18260 65 79 20 3d 20 66 72 61 6d 65 77 6f 72 6b 52 6f  ey = frameworkRo
18270 6f 74 4b 65 79 3b 0d 0a 0d 0a 20 20 20 20 20 20  otKey;....      
18280 20 20 20 20 20 20 69 66 20 28 72 6f 6f 74 4b 65        if (rootKe
18290 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  y == null)..    
182a0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
182b0 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
182c0 20 3d 20 22 69 6e 76 61 6c 69 64 20 72 6f 6f 74   = "invalid root
182d0 20 6b 65 79 22 3b 0d 0a 20 20 20 20 20 20 20 20   key";..        
182e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
182f0 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alse;..         
18300 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
18310 20 20 20 20 69 66 20 28 21 4f 62 6a 65 63 74 2e      if (!Object.
18320 52 65 66 65 72 65 6e 63 65 45 71 75 61 6c 73 28  ReferenceEquals(
18330 72 6f 6f 74 4b 65 79 2c 20 52 65 67 69 73 74 72  rootKey, Registr
18340 79 2e 43 75 72 72 65 6e 74 55 73 65 72 29 20 26  y.CurrentUser) &
18350 26 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &..             
18360 20 20 20 21 4f 62 6a 65 63 74 2e 52 65 66 65 72     !Object.Refer
18370 65 6e 63 65 45 71 75 61 6c 73 28 72 6f 6f 74 4b  enceEquals(rootK
18380 65 79 2c 20 52 65 67 69 73 74 72 79 2e 4c 6f 63  ey, Registry.Loc
18390 61 6c 4d 61 63 68 69 6e 65 29 29 0d 0a 20 20 20  alMachine))..   
183a0 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
183b0 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
183c0 72 20 3d 20 22 72 6f 6f 74 20 6b 65 79 20 6d 75  r = "root key mu
183d0 73 74 20 62 65 20 70 65 72 2d 75 73 65 72 20 6f  st be per-user o
183e0 72 20 70 65 72 2d 6d 61 63 68 69 6e 65 22 3b 0d  r per-machine";.
183f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18400 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a   return false;..
18410 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
18420 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
18430 28 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 4c 69  (frameworkNameLi
18440 73 74 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  st == null)..   
18450 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
18460 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
18470 72 20 3d 20 22 6e 6f 20 66 72 61 6d 65 77 6f 72  r = "no framewor
18480 6b 20 6e 61 6d 65 73 20 66 6f 75 6e 64 22 3b 0d  k names found";.
18490 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
184a0 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a   return false;..
184b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
184c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
184d0 28 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f  (frameworkVersio
184e0 6e 4d 61 70 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20  nMap == null).. 
184f0 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
18500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
18510 72 6f 72 20 3d 20 22 6e 6f 20 66 72 61 6d 65 77  ror = "no framew
18520 6f 72 6b 20 76 65 72 73 69 6f 6e 73 20 66 6f 75  ork versions fou
18530 6e 64 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  nd";..          
18540 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
18550 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se;..           
18560 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
18570 20 20 69 66 20 28 70 6c 61 74 66 6f 72 6d 4e 61    if (platformNa
18580 6d 65 4c 69 73 74 20 3d 3d 20 6e 75 6c 6c 29 0d  meList == null).
18590 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
185a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185b0 65 72 72 6f 72 20 3d 20 22 6e 6f 20 70 6c 61 74  error = "no plat
185c0 66 6f 72 6d 20 6e 61 6d 65 73 20 66 6f 75 6e 64  form names found
185d0 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ";..            
185e0 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
185f0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
18600 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
18610 69 66 20 28 66 72 61 6d 65 77 6f 72 6b 4e 61 6d  if (frameworkNam
18620 65 4c 69 73 74 2e 43 6f 75 6e 74 20 21 3d 20 70  eList.Count != p
18630 6c 61 74 66 6f 72 6d 4e 61 6d 65 4c 69 73 74 2e  latformNameList.
18640 43 6f 75 6e 74 29 0d 0a 20 20 20 20 20 20 20 20  Count)..        
18650 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
18660 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 53         error = S
18670 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 66 72  tring.Format("fr
18680 61 6d 65 77 6f 72 6b 20 6e 61 6d 65 20 63 6f 75  amework name cou
18690 6e 74 20 7b 30 7d 20 64 6f 65 73 20 6e 6f 74 20  nt {0} does not 
186a0 22 20 2b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " +..           
186b0 20 20 20 20 20 20 20 20 20 22 6d 61 74 63 68 20           "match 
186c0 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 63 6f  platform name co
186d0 75 6e 74 20 7b 31 7d 22 2c 20 66 72 61 6d 65 77  unt {1}", framew
186e0 6f 72 6b 4e 61 6d 65 4c 69 73 74 2e 43 6f 75 6e  orkNameList.Coun
186f0 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t,..            
18700 20 20 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d          platform
18710 4e 61 6d 65 4c 69 73 74 2e 43 6f 75 6e 74 29 3b  NameList.Count);
18720 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
18730 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
18740 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
18750 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
18760 66 6f 72 20 28 69 6e 74 20 69 6e 64 65 78 20 3d  for (int index =
18770 20 30 3b 20 69 6e 64 65 78 20 3c 20 66 72 61 6d   0; index < fram
18780 65 77 6f 72 6b 4e 61 6d 65 4c 69 73 74 2e 43 6f  eworkNameList.Co
18790 75 6e 74 3b 20 69 6e 64 65 78 2b 2b 29 0d 0a 20  unt; index++).. 
187a0 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
187b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
187c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
187d0 20 20 2f 2f 20 4e 4f 54 45 3a 20 47 72 61 62 20    // NOTE: Grab 
187e0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
187f0 66 72 61 6d 65 77 6f 72 6b 20 28 65 2e 67 2e 20  framework (e.g. 
18800 22 2e 4e 45 54 46 72 61 6d 65 77 6f 72 6b 22 29  ".NETFramework")
18810 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18820 20 20 2f 2f 20 20 20 20 20 20 20 61 6e 64 20 74    //       and t
18830 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70  he name of the p
18840 6c 61 74 66 6f 72 6d 20 28 65 2e 67 2e 20 22 57  latform (e.g. "W
18850 69 6e 64 6f 77 73 43 45 22 29 2e 0d 0a 20 20 20  indowsCE")...   
18860 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d               //.
18870 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18880 20 73 74 72 69 6e 67 20 66 72 61 6d 65 77 6f 72   string framewor
18890 6b 4e 61 6d 65 20 3d 20 66 72 61 6d 65 77 6f 72  kName = framewor
188a0 6b 4e 61 6d 65 4c 69 73 74 5b 69 6e 64 65 78 5d  kNameList[index]
188b0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
188c0 20 20 20 73 74 72 69 6e 67 20 70 6c 61 74 66 6f     string platfo
188d0 72 6d 4e 61 6d 65 20 3d 20 70 6c 61 74 66 6f 72  rmName = platfor
188e0 6d 4e 61 6d 65 4c 69 73 74 5b 69 6e 64 65 78 5d  mNameList[index]
188f0 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
18900 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
18910 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45           // NOTE
18920 3a 20 53 6b 69 70 20 61 6c 6c 20 6e 6f 6e 2d 64  : Skip all non-d
18930 65 73 6b 74 6f 70 20 66 72 61 6d 65 77 6f 72 6b  esktop framework
18940 73 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 70  s (i.e. if the p
18950 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20  latform..       
18960 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
18970 20 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 6e 75    name is not nu
18980 6c 6c 29 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ll)...          
18990 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
189a0 20 20 20 20 20 20 20 20 20 20 69 66 20 28 70 6c            if (pl
189b0 61 74 66 6f 72 6d 4e 61 6d 65 20 21 3d 20 6e 75  atformName != nu
189c0 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
189d0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
189e0 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e;....          
189f0 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
18a00 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54            // NOT
18a10 45 3a 20 47 72 61 62 20 74 68 65 20 73 75 70 70  E: Grab the supp
18a20 6f 72 74 65 64 20 76 65 72 73 69 6f 6e 73 20 6f  orted versions o
18a30 66 20 74 68 69 73 20 70 61 72 74 69 63 75 6c 61  f this particula
18a40 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r..             
18a50 20 20 20 2f 2f 20 20 20 20 20 20 20 66 72 61 6d     //       fram
18a60 65 77 6f 72 6b 2e 0d 0a 20 20 20 20 20 20 20 20  ework...        
18a70 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
18a80 20 20 20 20 20 20 20 20 20 20 20 20 56 65 72 73              Vers
18a90 69 6f 6e 4c 69 73 74 20 66 72 61 6d 65 77 6f 72  ionList framewor
18aa0 6b 56 65 72 73 69 6f 6e 4c 69 73 74 3b 0d 0a 0d  kVersionList;...
18ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18ac0 20 69 66 20 28 21 66 72 61 6d 65 77 6f 72 6b 56   if (!frameworkV
18ad0 65 72 73 69 6f 6e 4d 61 70 2e 54 72 79 47 65 74  ersionMap.TryGet
18ae0 56 61 6c 75 65 28 0d 0a 20 20 20 20 20 20 20 20  Value(..        
18af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b00 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 2c 20 6f  frameworkName, o
18b10 75 74 20 66 72 61 6d 65 77 6f 72 6b 56 65 72 73  ut frameworkVers
18b20 69 6f 6e 4c 69 73 74 29 20 7c 7c 0d 0a 20 20 20  ionList) ||..   
18b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b40 20 28 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69   (frameworkVersi
18b50 6f 6e 4c 69 73 74 20 3d 3d 20 6e 75 6c 6c 29 29  onList == null))
18b60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18b70 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
18b80 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
18b90 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
18ba0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
18bb0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
18bc0 20 28 56 65 72 73 69 6f 6e 20 66 72 61 6d 65 77   (Version framew
18bd0 6f 72 6b 56 65 72 73 69 6f 6e 20 69 6e 20 66 72  orkVersion in fr
18be0 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 4c 69  ameworkVersionLi
18bf0 73 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  st)..           
18c00 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
18c10 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63              Trac
18c20 65 4f 70 73 2e 54 72 61 63 65 28 0d 0a 20 20 20  eOps.Trace(..   
18c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c40 20 20 20 20 20 54 72 61 63 65 50 72 69 6f 72 69       TracePriori
18c50 74 79 2e 4c 6f 77 65 72 2c 20 74 72 61 63 65 43  ty.Lower, traceC
18c60 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e  allback, String.
18c70 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20  Format(..       
18c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c90 20 22 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 20   "frameworkName 
18ca0 3d 20 7b 30 7d 2c 20 66 72 61 6d 65 77 6f 72 6b  = {0}, framework
18cb0 56 65 72 73 69 6f 6e 20 3d 20 7b 31 7d 2c 20 22  Version = {1}, "
18cc0 20 2b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   +..            
18cd0 20 20 20 20 20 20 20 20 20 20 20 20 22 70 6c 61              "pla
18ce0 74 66 6f 72 6d 4e 61 6d 65 20 3d 20 7b 32 7d 22  tformName = {2}"
18cf0 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 66 72 61  , ForDisplay(fra
18d00 6d 65 77 6f 72 6b 4e 61 6d 65 29 2c 0d 0a 20 20  meworkName),..  
18d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d20 20 20 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79        ForDisplay
18d30 28 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f  (frameworkVersio
18d40 6e 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n),..           
18d50 20 20 20 20 20 20 20 20 20 20 20 20 20 46 6f 72               For
18d60 44 69 73 70 6c 61 79 28 70 6c 61 74 66 6f 72 6d  Display(platform
18d70 4e 61 6d 65 29 29 2c 20 74 72 61 63 65 43 61 74  Name)), traceCat
18d80 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20  egory);....     
18d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
18da0 66 20 28 21 48 61 76 65 46 72 61 6d 65 77 6f 72  f (!HaveFramewor
18db0 6b 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  k(..            
18dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18dd0 72 6f 6f 74 4b 65 79 2c 20 66 72 61 6d 65 77 6f  rootKey, framewo
18de0 72 6b 4e 61 6d 65 2c 20 66 72 61 6d 65 77 6f 72  rkName, framewor
18df0 6b 56 65 72 73 69 6f 6e 2c 0d 0a 20 20 20 20 20  kVersion,..     
18e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e10 20 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d 4e         platformN
18e20 61 6d 65 2c 20 77 68 61 74 49 66 2c 20 76 65 72  ame, whatIf, ver
18e30 62 6f 73 65 29 29 0d 0a 20 20 20 20 20 20 20 20  bose))..        
18e40 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
18e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e60 20 20 20 20 20 20 20 54 72 61 63 65 4f 70 73 2e         TraceOps.
18e70 54 72 61 63 65 28 0d 0a 20 20 20 20 20 20 20 20  Trace(..        
18e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e90 20 20 20 20 54 72 61 63 65 50 72 69 6f 72 69 74      TracePriorit
18ea0 79 2e 4c 6f 77 2c 20 74 72 61 63 65 43 61 6c 6c  y.Low, traceCall
18eb0 62 61 63 6b 2c 0d 0a 20 20 20 20 20 20 20 20 20  back,..         
18ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ed0 20 20 20 22 2e 4e 45 54 20 46 72 61 6d 65 77 6f     ".NET Framewo
18ee0 72 6b 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 73 6b  rk not found, sk
18ef0 69 70 70 69 6e 67 2e 2e 2e 22 2c 0d 0a 20 20 20  ipping...",..   
18f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f10 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61           traceCa
18f20 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20  tegory);....    
18f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f40 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20      continue;.. 
18f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f60 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
18f70 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
18f80 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 6e 75 6c 6c  callback == null
18f90 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
18fa0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
18fb0 6e 75 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nue;....        
18fc0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
18fd0 6e 67 20 64 69 72 65 63 74 6f 72 79 20 3d 20 47  ng directory = G
18fe0 65 74 46 72 61 6d 65 77 6f 72 6b 44 69 72 65 63  etFrameworkDirec
18ff0 74 6f 72 79 28 0d 0a 20 20 20 20 20 20 20 20 20  tory(..         
19000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
19010 6f 6f 74 4b 65 79 2c 20 66 72 61 6d 65 77 6f 72  ootKey, framewor
19020 6b 56 65 72 73 69 6f 6e 2c 20 77 68 61 74 49 66  kVersion, whatIf
19030 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20  , verbose);.... 
19040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19050 20 20 20 69 66 20 28 53 74 72 69 6e 67 2e 49 73     if (String.Is
19060 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 64 69 72 65  NullOrEmpty(dire
19070 63 74 6f 72 79 29 29 0d 0a 20 20 20 20 20 20 20  ctory))..       
19080 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
19090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190a0 20 20 20 20 20 20 20 20 54 72 61 63 65 4f 70 73          TraceOps
190b0 2e 54 72 61 63 65 28 0d 0a 20 20 20 20 20 20 20  .Trace(..       
190c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190d0 20 20 20 20 20 54 72 61 63 65 50 72 69 6f 72 69       TracePriori
190e0 74 79 2e 4c 6f 77 2c 20 74 72 61 63 65 43 61 6c  ty.Low, traceCal
190f0 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f  lback, String.Fo
19100 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20  rmat(..         
19110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19120 20 20 20 22 2e 4e 45 54 20 46 72 61 6d 65 77 6f     ".NET Framewo
19130 72 6b 20 76 7b 30 7d 20 64 69 72 65 63 74 6f 72  rk v{0} director
19140 79 20 69 73 20 69 6e 76 61 6c 69 64 2c 20 22 20  y is invalid, " 
19150 2b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +..             
19160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
19170 73 6b 69 70 70 69 6e 67 2e 2e 2e 22 2c 20 66 72  skipping...", fr
19180 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 29 2c  ameworkVersion),
19190 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b   traceCategory);
191a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
191b0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
191c0 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  inue;..         
191d0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
191e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191f0 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 3d 20      directory = 
19200 50 61 74 68 2e 43 6f 6d 62 69 6e 65 28 64 69 72  Path.Combine(dir
19210 65 63 74 6f 72 79 2c 20 22 43 6f 6e 66 69 67 22  ectory, "Config"
19220 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
19230 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 44            if (!D
19240 69 72 65 63 74 6f 72 79 2e 45 78 69 73 74 73 28  irectory.Exists(
19250 64 69 72 65 63 74 6f 72 79 29 29 0d 0a 20 20 20  directory))..   
19260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19270 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
19280 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63              Trac
19290 65 4f 70 73 2e 54 72 61 63 65 28 0d 0a 20 20 20  eOps.Trace(..   
192a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192b0 20 20 20 20 20 20 20 20 20 54 72 61 63 65 50 72           TracePr
192c0 69 6f 72 69 74 79 2e 4c 6f 77 2c 20 74 72 61 63  iority.Low, trac
192d0 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e  eCallback, Strin
192e0 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20  g.Format(..     
192f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19300 20 20 20 20 20 20 20 22 2e 4e 45 54 20 46 72 61         ".NET Fra
19310 6d 65 77 6f 72 6b 20 76 7b 30 7d 20 64 69 72 65  mework v{0} dire
19320 63 74 6f 72 79 20 5c 22 7b 31 7d 5c 22 20 64 6f  ctory \"{1}\" do
19330 65 73 20 6e 6f 74 20 22 20 2b 0d 0a 20 20 20 20  es not " +..    
19340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19350 20 20 20 20 20 20 20 20 22 65 78 69 73 74 2c 20          "exist, 
19360 73 6b 69 70 70 69 6e 67 2e 2e 2e 22 2c 20 66 72  skipping...", fr
19370 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 2c 20  ameworkVersion, 
19380 64 69 72 65 63 74 6f 72 79 29 2c 0d 0a 20 20 20  directory),..   
19390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193a0 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61           traceCa
193b0 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20  tegory);....    
193c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193d0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20      continue;.. 
193e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193f0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
19400 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
19410 6e 67 20 66 69 6c 65 4e 61 6d 65 20 3d 20 50 61  ng fileName = Pa
19420 74 68 2e 43 6f 6d 62 69 6e 65 28 64 69 72 65 63  th.Combine(direc
19430 74 6f 72 79 2c 20 22 6d 61 63 68 69 6e 65 2e 63  tory, "machine.c
19440 6f 6e 66 69 67 22 29 3b 0d 0a 0d 0a 20 20 20 20  onfig");....    
19450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19460 69 66 20 28 21 46 69 6c 65 2e 45 78 69 73 74 73  if (!File.Exists
19470 28 66 69 6c 65 4e 61 6d 65 29 29 0d 0a 20 20 20  (fileName))..   
19480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19490 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
194a0 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63              Trac
194b0 65 4f 70 73 2e 54 72 61 63 65 28 0d 0a 20 20 20  eOps.Trace(..   
194c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194d0 20 20 20 20 20 20 20 20 20 54 72 61 63 65 50 72           TracePr
194e0 69 6f 72 69 74 79 2e 4c 6f 77 2c 20 74 72 61 63  iority.Low, trac
194f0 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e  eCallback, Strin
19500 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20  g.Format(..     
19510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19520 20 20 20 20 20 20 20 22 2e 4e 45 54 20 46 72 61         ".NET Fra
19530 6d 65 77 6f 72 6b 20 76 7b 30 7d 20 66 69 6c 65  mework v{0} file
19540 20 5c 22 7b 31 7d 5c 22 20 64 6f 65 73 20 6e 6f   \"{1}\" does no
19550 74 20 65 78 69 73 74 2c 20 22 20 2b 0d 0a 20 20  t exist, " +..  
19560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19570 20 20 20 20 20 20 20 20 20 20 22 73 6b 69 70 70            "skipp
19580 69 6e 67 2e 2e 2e 22 2c 20 66 72 61 6d 65 77 6f  ing...", framewo
19590 72 6b 56 65 72 73 69 6f 6e 2c 20 66 69 6c 65 4e  rkVersion, fileN
195a0 61 6d 65 29 2c 0d 0a 20 20 20 20 20 20 20 20 20  ame),..         
195b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195c0 20 20 20 74 72 61 63 65 43 61 74 65 67 6f 72 79     traceCategory
195d0 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
195e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
195f0 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20  ntinue;..       
19600 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
19610 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19620 20 20 20 20 20 20 62 6f 6f 6c 20 6c 6f 63 61 6c        bool local
19630 53 61 76 65 64 20 3d 20 66 61 6c 73 65 3b 0d 0a  Saved = false;..
19640 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19650 20 20 20 20 20 20 69 66 20 28 21 63 61 6c 6c 62        if (!callb
19660 61 63 6b 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ack(..          
19670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19680 20 20 66 69 6c 65 4e 61 6d 65 2c 20 69 6e 76 61    fileName, inva
19690 72 69 61 6e 74 2c 20 6e 61 6d 65 2c 20 64 65 73  riant, name, des
196a0 63 72 69 70 74 69 6f 6e 2c 20 74 79 70 65 4e 61  cription, typeNa
196b0 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  me,..           
196c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196d0 20 61 73 73 65 6d 62 6c 79 4e 61 6d 65 2c 20 63   assemblyName, c
196e0 6c 69 65 6e 74 44 61 74 61 2c 20 77 68 61 74 49  lientData, whatI
196f0 66 2c 20 76 65 72 62 6f 73 65 2c 0d 0a 20 20 20  f, verbose,..   
19700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19710 20 20 20 20 20 20 20 20 20 72 65 66 20 6c 6f 63           ref loc
19720 61 6c 53 61 76 65 64 2c 20 72 65 66 20 65 72 72  alSaved, ref err
19730 6f 72 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  or))..          
19740 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
19750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19760 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
19770 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
19780 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
19790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
197a0 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  lse..           
197b0 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
197c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197d0 20 20 20 20 69 66 20 28 6c 6f 63 61 6c 53 61 76      if (localSav
197e0 65 64 20 26 26 20 21 73 61 76 65 64 29 0d 0a 20  ed && !saved).. 
197f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19800 20 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64             saved
19810 20 3d 20 74 72 75 65 3b 0d 0a 0d 0a 20 20 20 20   = true;....    
19820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19830 20 20 20 20 69 66 20 28 76 65 72 62 6f 73 65 29      if (verbose)
19840 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72                Tr
19860 61 63 65 4f 70 73 2e 54 72 61 63 65 28 0d 0a 20  aceOps.Trace(.. 
19870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
19890 72 61 63 65 50 72 69 6f 72 69 74 79 2e 4c 6f 77  racePriority.Low
198a0 65 73 74 2c 20 74 72 61 63 65 43 61 6c 6c 62 61  est, traceCallba
198b0 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61  ck, String.Forma
198c0 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t(..            
198d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198e0 20 20 20 20 22 6c 6f 63 61 6c 53 61 76 65 64 20      "localSaved 
198f0 3d 20 7b 30 7d 2c 20 73 61 76 65 64 20 3d 20 7b  = {0}, saved = {
19900 31 7d 22 2c 20 6c 6f 63 61 6c 53 61 76 65 64 2c  1}", localSaved,
19910 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19930 20 20 73 61 76 65 64 29 2c 20 74 72 61 63 65 43    saved), traceC
19940 61 74 65 67 6f 72 79 29 3b 0d 0a 20 20 20 20 20  ategory);..     
19950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
19960 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19970 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
19980 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
19990 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a    return true;..
199a0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
199b0 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
199c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
199d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
199e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
199f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
19a00 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
19a10 73 74 61 74 69 63 20 62 6f 6f 6c 20 46 6f 72 45  static bool ForE
19a20 61 63 68 46 72 61 6d 65 77 6f 72 6b 52 65 67 69  achFrameworkRegi
19a30 73 74 72 79 28 0d 0a 20 20 20 20 20 20 20 20 20  stry(..         
19a40 20 20 20 46 72 61 6d 65 77 6f 72 6b 52 65 67 69     FrameworkRegi
19a50 73 74 72 79 43 61 6c 6c 62 61 63 6b 20 63 61 6c  stryCallback cal
19a60 6c 62 61 63 6b 2c 0d 0a 20 20 20 20 20 20 20 20  lback,..        
19a70 20 20 20 20 6f 62 6a 65 63 74 20 63 6c 69 65 6e      object clien
19a80 74 44 61 74 61 2c 0d 0a 20 20 20 20 20 20 20 20  tData,..        
19a90 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c      bool whatIf,
19aa0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6f  ..            bo
19ab0 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a 20 20 20  ol verbose,..   
19ac0 20 20 20 20 20 20 20 20 20 72 65 66 20 73 74 72           ref str
19ad0 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20 20 20 20  ing error..     
19ae0 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20         )..      
19af0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
19b00 20 52 65 67 69 73 74 72 79 4b 65 79 20 72 6f 6f   RegistryKey roo
19b10 74 4b 65 79 20 3d 20 66 72 61 6d 65 77 6f 72 6b  tKey = framework
19b20 52 6f 6f 74 4b 65 79 3b 0d 0a 0d 0a 20 20 20 20  RootKey;....    
19b30 20 20 20 20 20 20 20 20 69 66 20 28 72 6f 6f 74          if (root
19b40 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  Key == null)..  
19b50 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
19b60 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
19b70 6f 72 20 3d 20 22 69 6e 76 61 6c 69 64 20 72 6f  or = "invalid ro
19b80 6f 74 20 6b 65 79 22 3b 0d 0a 20 20 20 20 20 20  ot key";..      
19b90 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
19ba0 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20   false;..       
19bb0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
19bc0 20 20 20 20 20 20 69 66 20 28 21 4f 62 6a 65 63        if (!Objec
19bd0 74 2e 52 65 66 65 72 65 6e 63 65 45 71 75 61 6c  t.ReferenceEqual
19be0 73 28 72 6f 6f 74 4b 65 79 2c 20 52 65 67 69 73  s(rootKey, Regis
19bf0 74 72 79 2e 43 75 72 72 65 6e 74 55 73 65 72 29  try.CurrentUser)
19c00 20 26 26 0d 0a 20 20 20 20 20 20 20 20 20 20 20   &&..           
19c10 20 20 20 20 20 21 4f 62 6a 65 63 74 2e 52 65 66       !Object.Ref
19c20 65 72 65 6e 63 65 45 71 75 61 6c 73 28 72 6f 6f  erenceEquals(roo
19c30 74 4b 65 79 2c 20 52 65 67 69 73 74 72 79 2e 4c  tKey, Registry.L
19c40 6f 63 61 6c 4d 61 63 68 69 6e 65 29 29 0d 0a 20  ocalMachine)).. 
19c50 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
19c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
19c70 72 6f 72 20 3d 20 22 72 6f 6f 74 20 6b 65 79 20  ror = "root key 
19c80 6d 75 73 74 20 62 65 20 70 65 72 2d 75 73 65 72  must be per-user
19c90 20 6f 72 20 70 65 72 2d 6d 61 63 68 69 6e 65 22   or per-machine"
19ca0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
19cb0 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
19cc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
19cd0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
19ce0 66 20 28 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65  f (frameworkName
19cf0 4c 69 73 74 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20  List == null).. 
19d00 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
19d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
19d20 72 6f 72 20 3d 20 22 6e 6f 20 66 72 61 6d 65 77  ror = "no framew
19d30 6f 72 6b 20 6e 61 6d 65 73 20 66 6f 75 6e 64 22  ork names found"
19d40 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
19d50 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
19d60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
19d70 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
19d80 66 20 28 66 72 61 6d 65 77 6f 72 6b 56 65 72 73  f (frameworkVers
19d90 69 6f 6e 4d 61 70 20 3d 3d 20 6e 75 6c 6c 29 0d  ionMap == null).
19da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
19db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19dc0 65 72 72 6f 72 20 3d 20 22 6e 6f 20 66 72 61 6d  error = "no fram
19dd0 65 77 6f 72 6b 20 76 65 72 73 69 6f 6e 73 20 66  ework versions f
19de0 6f 75 6e 64 22 3b 0d 0a 20 20 20 20 20 20 20 20  ound";..        
19df0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
19e00 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alse;..         
19e10 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
19e20 20 20 20 20 69 66 20 28 70 6c 61 74 66 6f 72 6d      if (platform
19e30 4e 61 6d 65 4c 69 73 74 20 3d 3d 20 6e 75 6c 6c  NameList == null
19e40 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
19e50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19e60 20 20 65 72 72 6f 72 20 3d 20 22 6e 6f 20 70 6c    error = "no pl
19e70 61 74 66 6f 72 6d 20 6e 61 6d 65 73 20 66 6f 75  atform names fou
19e80 6e 64 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  nd";..          
19e90 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
19ea0 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se;..           
19eb0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
19ec0 20 20 69 66 20 28 66 72 61 6d 65 77 6f 72 6b 4e    if (frameworkN
19ed0 61 6d 65 4c 69 73 74 2e 43 6f 75 6e 74 20 21 3d  ameList.Count !=
19ee0 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 4c 69 73   platformNameLis
19ef0 74 2e 43 6f 75 6e 74 29 0d 0a 20 20 20 20 20 20  t.Count)..      
19f00 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
19f10 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d           error =
19f20 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22   String.Format("
19f30 66 72 61 6d 65 77 6f 72 6b 20 6e 61 6d 65 20 63  framework name c
19f40 6f 75 6e 74 20 7b 30 7d 20 64 6f 65 73 20 6e 6f  ount {0} does no
19f50 74 20 22 20 2b 0d 0a 20 20 20 20 20 20 20 20 20  t " +..         
19f60 20 20 20 20 20 20 20 20 20 20 20 22 6d 61 74 63             "matc
19f70 68 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20  h platform name 
19f80 63 6f 75 6e 74 20 7b 31 7d 22 2c 20 66 72 61 6d  count {1}", fram
19f90 65 77 6f 72 6b 4e 61 6d 65 4c 69 73 74 2e 43 6f  eworkNameList.Co
19fa0 75 6e 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  unt,..          
19fb0 20 20 20 20 20 20 20 20 20 20 70 6c 61 74 66 6f            platfo
19fc0 72 6d 4e 61 6d 65 4c 69 73 74 2e 43 6f 75 6e 74  rmNameList.Count
19fd0 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
19fe0 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
19ff0 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se;..           
1a000 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1a010 20 20 66 6f 72 20 28 69 6e 74 20 69 6e 64 65 78    for (int index
1a020 20 3d 20 30 3b 20 69 6e 64 65 78 20 3c 20 66 72   = 0; index < fr
1a030 61 6d 65 77 6f 72 6b 4e 61 6d 65 4c 69 73 74 2e  ameworkNameList.
1a040 43 6f 75 6e 74 3b 20 69 6e 64 65 78 2b 2b 29 0d  Count; index++).
1a050 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
1a060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a070 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
1a080 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 47 72 61      // NOTE: Gra
1a090 62 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  b the name of th
1a0a0 65 20 66 72 61 6d 65 77 6f 72 6b 20 28 65 2e 67  e framework (e.g
1a0b0 2e 20 22 2e 4e 45 54 46 72 61 6d 65 77 6f 72 6b  . ".NETFramework
1a0c0 22 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ")..            
1a0d0 20 20 20 20 2f 2f 20 20 20 20 20 20 20 61 6e 64      //       and
1a0e0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1a0f0 20 70 6c 61 74 66 6f 72 6d 20 28 65 2e 67 2e 20   platform (e.g. 
1a100 22 57 69 6e 64 6f 77 73 43 45 22 29 2e 0d 0a 20  "WindowsCE")... 
1a110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a120 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
1a130 20 20 20 73 74 72 69 6e 67 20 66 72 61 6d 65 77     string framew
1a140 6f 72 6b 4e 61 6d 65 20 3d 20 66 72 61 6d 65 77  orkName = framew
1a150 6f 72 6b 4e 61 6d 65 4c 69 73 74 5b 69 6e 64 65  orkNameList[inde
1a160 78 5d 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x];..           
1a170 20 20 20 20 20 73 74 72 69 6e 67 20 70 6c 61 74       string plat
1a180 66 6f 72 6d 4e 61 6d 65 20 3d 20 70 6c 61 74 66  formName = platf
1a190 6f 72 6d 4e 61 6d 65 4c 69 73 74 5b 69 6e 64 65  ormNameList[inde
1a1a0 78 5d 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  x];....         
1a1b0 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
1a1c0 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f             // NO
1a1d0 54 45 3a 20 47 72 61 62 20 74 68 65 20 73 75 70  TE: Grab the sup
1a1e0 70 6f 72 74 65 64 20 76 65 72 73 69 6f 6e 73 20  ported versions 
1a1f0 6f 66 20 74 68 69 73 20 70 61 72 74 69 63 75 6c  of this particul
1a200 61 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ar..            
1a210 20 20 20 20 2f 2f 20 20 20 20 20 20 20 66 72 61      //       fra
1a220 6d 65 77 6f 72 6b 2e 0d 0a 20 20 20 20 20 20 20  mework...       
1a230 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
1a240 20 20 20 20 20 20 20 20 20 20 20 20 20 56 65 72               Ver
1a250 73 69 6f 6e 4c 69 73 74 20 66 72 61 6d 65 77 6f  sionList framewo
1a260 72 6b 56 65 72 73 69 6f 6e 4c 69 73 74 3b 0d 0a  rkVersionList;..
1a270 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a280 20 20 69 66 20 28 21 66 72 61 6d 65 77 6f 72 6b    if (!framework
1a290 56 65 72 73 69 6f 6e 4d 61 70 2e 54 72 79 47 65  VersionMap.TryGe
1a2a0 74 56 61 6c 75 65 28 0d 0a 20 20 20 20 20 20 20  tValue(..       
1a2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2c0 20 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 2c 20   frameworkName, 
1a2d0 6f 75 74 20 66 72 61 6d 65 77 6f 72 6b 56 65 72  out frameworkVer
1a2e0 73 69 6f 6e 4c 69 73 74 29 20 7c 7c 0d 0a 20 20  sionList) ||..  
1a2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a300 20 20 28 66 72 61 6d 65 77 6f 72 6b 56 65 72 73    (frameworkVers
1a310 69 6f 6e 4c 69 73 74 20 3d 3d 20 6e 75 6c 6c 29  ionList == null)
1a320 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
1a330 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
1a340 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1a350 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue;..           
1a360 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1a370 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
1a380 68 20 28 56 65 72 73 69 6f 6e 20 66 72 61 6d 65  h (Version frame
1a390 77 6f 72 6b 56 65 72 73 69 6f 6e 20 69 6e 20 66  workVersion in f
1a3a0 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 4c  rameworkVersionL
1a3b0 69 73 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ist)..          
1a3c0 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
1a3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61               Tra
1a3e0 63 65 4f 70 73 2e 54 72 61 63 65 28 0d 0a 20 20  ceOps.Trace(..  
1a3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a400 20 20 20 20 20 20 54 72 61 63 65 50 72 69 6f 72        TracePrior
1a410 69 74 79 2e 4c 6f 77 65 72 2c 20 74 72 61 63 65  ity.Lower, trace
1a420 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67  Callback, String
1a430 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20  .Format(..      
1a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a450 20 20 22 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65    "frameworkName
1a460 20 3d 20 7b 30 7d 2c 20 66 72 61 6d 65 77 6f 72   = {0}, framewor
1a470 6b 56 65 72 73 69 6f 6e 20 3d 20 7b 31 7d 2c 20  kVersion = {1}, 
1a480 22 20 2b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " +..           
1a490 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70 6c               "pl
1a4a0 61 74 66 6f 72 6d 4e 61 6d 65 20 3d 20 7b 32 7d  atformName = {2}
1a4b0 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 66 72  ", ForDisplay(fr
1a4c0 61 6d 65 77 6f 72 6b 4e 61 6d 65 29 2c 0d 0a 20  ameworkName),.. 
1a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4e0 20 20 20 20 20 20 20 46 6f 72 44 69 73 70 6c 61         ForDispla
1a4f0 79 28 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69  y(frameworkVersi
1a500 6f 6e 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  on),..          
1a510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 6f                Fo
1a520 72 44 69 73 70 6c 61 79 28 70 6c 61 74 66 6f 72  rDisplay(platfor
1a530 6d 4e 61 6d 65 29 29 2c 20 74 72 61 63 65 43 61  mName)), traceCa
1a540 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20  tegory);....    
1a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a560 69 66 20 28 21 48 61 76 65 46 72 61 6d 65 77 6f  if (!HaveFramewo
1a570 72 6b 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rk(..           
1a580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a590 20 72 6f 6f 74 4b 65 79 2c 20 66 72 61 6d 65 77   rootKey, framew
1a5a0 6f 72 6b 4e 61 6d 65 2c 20 66 72 61 6d 65 77 6f  orkName, framewo
1a5b0 72 6b 56 65 72 73 69 6f 6e 2c 0d 0a 20 20 20 20  rkVersion,..    
1a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5d0 20 20 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d          platform
1a5e0 4e 61 6d 65 2c 20 77 68 61 74 49 66 2c 20 76 65  Name, whatIf, ve
1a5f0 72 62 6f 73 65 29 29 0d 0a 20 20 20 20 20 20 20  rbose))..       
1a600 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
1a610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a620 20 20 20 20 20 20 20 20 54 72 61 63 65 4f 70 73          TraceOps
1a630 2e 54 72 61 63 65 28 54 72 61 63 65 50 72 69 6f  .Trace(TracePrio
1a640 72 69 74 79 2e 4c 6f 77 2c 20 74 72 61 63 65 43  rity.Low, traceC
1a650 61 6c 6c 62 61 63 6b 2c 0d 0a 20 20 20 20 20 20  allback,..      
1a660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a670 20 20 20 20 20 20 22 2e 4e 45 54 20 46 72 61 6d        ".NET Fram
1a680 65 77 6f 72 6b 20 6e 6f 74 20 66 6f 75 6e 64 2c  ework not found,
1a690 20 73 6b 69 70 70 69 6e 67 2e 2e 2e 22 2c 0d 0a   skipping...",..
1a6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6b0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63              trac
1a6c0 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20  eCategory);.... 
1a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6e0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
1a6f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a700 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1a720 66 20 28 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 6e  f (callback == n
1a730 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
1a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
1a750 6e 74 69 6e 75 65 3b 0d 0a 0d 0a 20 20 20 20 20  ntinue;....     
1a760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1a770 66 20 28 21 63 61 6c 6c 62 61 63 6b 28 0d 0a 20  f (!callback(.. 
1a780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a790 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74 4b             rootK
1a7a0 65 79 2c 20 66 72 61 6d 65 77 6f 72 6b 4e 61 6d  ey, frameworkNam
1a7b0 65 2c 20 66 72 61 6d 65 77 6f 72 6b 56 65 72 73  e, frameworkVers
1a7c0 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ion,..          
1a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7e0 20 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 2c 20    platformName, 
1a7f0 63 6c 69 65 6e 74 44 61 74 61 2c 20 77 68 61 74  clientData, what
1a800 49 66 2c 20 76 65 72 62 6f 73 65 2c 0d 0a 20 20  If, verbose,..  
1a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a820 20 20 20 20 20 20 20 20 20 20 72 65 66 20 65 72            ref er
1a830 72 6f 72 29 29 0d 0a 20 20 20 20 20 20 20 20 20  ror))..         
1a840 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
1a850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a860 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
1a870 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se;..           
1a880 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1a890 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1a8a0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
1a8b0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1a8c0 72 6e 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20  rn true;..      
1a8d0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 23 65 6e    }..        #en
1a8e0 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20  dregion....     
1a8f0 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
1a900 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a910 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a920 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a930 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
1a940 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 50 65        #region Pe
1a950 72 2d 56 69 73 75 61 6c 20 53 74 75 64 69 6f 20  r-Visual Studio 
1a960 56 65 72 73 69 6f 6e 20 48 61 6e 64 6c 69 6e 67  Version Handling
1a970 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74  ..        privat
1a980 65 20 73 74 61 74 69 63 20 76 6f 69 64 20 49 6e  e static void In
1a990 69 74 69 61 6c 69 7a 65 41 6c 6c 56 73 56 65 72  itializeAllVsVer
1a9a0 73 69 6f 6e 73 28 0d 0a 20 20 20 20 20 20 20 20  sions(..        
1a9b0 20 20 20 20 43 6f 6e 66 69 67 75 72 61 74 69 6f      Configuratio
1a9c0 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d  n configuration.
1a9d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a  .            )..
1a9e0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
1a9f0 20 20 20 20 20 20 20 69 66 20 28 76 73 52 6f 6f         if (vsRoo
1aa00 74 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20  tKey == null).. 
1aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76                 v
1aa20 73 52 6f 6f 74 4b 65 79 20 3d 20 52 65 67 69 73  sRootKey = Regis
1aa30 74 72 79 2e 4c 6f 63 61 6c 4d 61 63 68 69 6e 65  try.LocalMachine
1aa40 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
1aa50 20 69 66 20 28 76 73 41 64 6f 4e 65 74 54 65 63   if (vsAdoNetTec
1aa60 68 6e 6f 6c 6f 67 79 49 64 20 3d 3d 20 6e 75 6c  hnologyId == nul
1aa70 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
1aa80 20 20 20 20 76 73 41 64 6f 4e 65 74 54 65 63 68      vsAdoNetTech
1aa90 6e 6f 6c 6f 67 79 49 64 20 3d 20 6e 65 77 20 47  nologyId = new G
1aaa0 75 69 64 28 0d 0a 20 20 20 20 20 20 20 20 20 20  uid(..          
1aab0 20 20 20 20 20 20 20 20 20 20 22 37 37 41 42 39            "77AB9
1aac0 41 39 44 2d 37 38 42 39 2d 34 42 41 37 2d 39 31  A9D-78B9-4BA7-91
1aad0 41 43 2d 38 37 33 46 35 33 33 38 46 31 44 32 22  AC-873F5338F1D2"
1aae0 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
1aaf0 20 20 69 66 20 28 76 73 50 61 63 6b 61 67 65 49    if (vsPackageI
1ab00 64 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  d == null)..    
1ab10 20 20 20 20 20 20 20 20 20 20 20 20 76 73 50 61              vsPa
1ab20 63 6b 61 67 65 49 64 20 3d 20 6e 65 77 20 47 75  ckageId = new Gu
1ab30 69 64 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  id(..           
1ab40 20 20 20 20 20 20 20 20 20 22 44 43 42 45 36 43           "DCBE6C
1ab50 38 44 2d 30 45 35 37 2d 34 30 39 39 2d 41 31 38  8D-0E57-4099-A18
1ab60 33 2d 39 38 46 46 37 34 43 36 34 44 39 43 22 29  3-98FF74C64D9C")
1ab70 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
1ab80 20 69 66 20 28 76 73 53 65 72 76 69 63 65 49 64   if (vsServiceId
1ab90 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
1aba0 20 20 20 20 20 20 20 20 20 20 20 76 73 53 65 72             vsSer
1abb0 76 69 63 65 49 64 20 3d 20 6e 65 77 20 47 75 69  viceId = new Gui
1abc0 64 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d(..            
1abd0 20 20 20 20 20 20 20 20 22 44 43 42 45 36 43 38          "DCBE6C8
1abe0 44 2d 30 45 35 37 2d 34 30 39 39 2d 41 31 38 33  D-0E57-4099-A183
1abf0 2d 39 38 46 46 37 34 43 36 34 44 39 44 22 29 3b  -98FF74C64D9D");
1ac00 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1ac10 69 66 20 28 76 73 44 61 74 61 53 6f 75 72 63 65  if (vsDataSource
1ac20 73 49 64 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  sId == null)..  
1ac30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 73                vs
1ac40 44 61 74 61 53 6f 75 72 63 65 73 49 64 20 3d 20  DataSourcesId = 
1ac50 6e 65 77 20 47 75 69 64 28 0d 0a 20 20 20 20 20  new Guid(..     
1ac60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1ac70 30 45 42 41 41 42 36 45 2d 43 41 38 30 2d 34 42  0EBAAB6E-CA80-4B
1ac80 34 41 2d 38 44 44 46 2d 43 42 45 36 42 46 30 35  4A-8DDF-CBE6BF05
1ac90 38 43 37 31 22 29 3b 0d 0a 0d 0a 20 20 20 20 20  8C71");....     
1aca0 20 20 20 20 20 20 20 69 66 20 28 76 73 44 61 74         if (vsDat
1acb0 61 50 72 6f 76 69 64 65 72 49 64 20 3d 3d 20 6e  aProviderId == n
1acc0 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
1acd0 20 20 20 20 20 20 76 73 44 61 74 61 50 72 6f 76        vsDataProv
1ace0 69 64 65 72 49 64 20 3d 20 6e 65 77 20 47 75 69  iderId = new Gui
1acf0 64 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d(..            
1ad00 20 20 20 20 20 20 20 20 22 30 45 42 41 41 42 36          "0EBAAB6
1ad10 45 2d 43 41 38 30 2d 34 42 34 41 2d 38 44 44 46  E-CA80-4B4A-8DDF
1ad20 2d 43 42 45 36 42 46 30 35 38 43 37 30 22 29 3b  -CBE6BF058C70");
1ad30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1ad40 69 66 20 28 76 73 56 65 72 73 69 6f 6e 4c 69 73  if (vsVersionLis
1ad50 74 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  t == null)..    
1ad60 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
1ad70 20 20 20 20 20 20 20 20 20 20 20 76 73 56 65 72             vsVer
1ad80 73 69 6f 6e 4c 69 73 74 20 3d 20 6e 65 77 20 56  sionList = new V
1ad90 65 72 73 69 6f 6e 4c 69 73 74 28 29 3b 0d 0a 0d  ersionList();...
1ada0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1adb0 20 2f 2f 20 76 73 56 65 72 73 69 6f 6e 4c 69 73   // vsVersionLis
1adc0 74 2e 41 64 64 28 6e 65 77 20 56 65 72 73 69 6f  t.Add(new Versio
1add0 6e 28 38 2c 20 30 29 29 3b 20 2f 2f 20 56 69 73  n(8, 0)); // Vis
1ade0 75 61 6c 20 53 74 75 64 69 6f 20 32 30 30 35 0d  ual Studio 2005.
1adf0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1ae00 20 20 20 69 66 20 28 28 63 6f 6e 66 69 67 75 72     if ((configur
1ae10 61 74 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 20 7c  ation == null) |
1ae20 7c 20 21 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  | !configuration
1ae30 2e 4e 6f 56 73 32 30 30 38 29 0d 0a 20 20 20 20  .NoVs2008)..    
1ae40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae50 76 73 56 65 72 73 69 6f 6e 4c 69 73 74 2e 41 64  vsVersionList.Ad
1ae60 64 28 6e 65 77 20 56 65 72 73 69 6f 6e 28 39 2c  d(new Version(9,
1ae70 20 30 29 29 3b 20 2f 2f 20 56 69 73 75 61 6c 20   0)); // Visual 
1ae80 53 74 75 64 69 6f 20 32 30 30 38 0d 0a 0d 0a 20  Studio 2008.... 
1ae90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1aea0 66 20 28 28 63 6f 6e 66 69 67 75 72 61 74 69 6f  f ((configuratio
1aeb0 6e 20 3d 3d 20 6e 75 6c 6c 29 20 7c 7c 20 21 63  n == null) || !c
1aec0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 4e 6f 56  onfiguration.NoV
1aed0 73 32 30 31 30 29 0d 0a 20 20 20 20 20 20 20 20  s2010)..        
1aee0 20 20 20 20 20 20 20 20 20 20 20 20 76 73 56 65              vsVe
1aef0 72 73 69 6f 6e 4c 69 73 74 2e 41 64 64 28 6e 65  rsionList.Add(ne
1af00 77 20 56 65 72 73 69 6f 6e 28 31 30 2c 20 30 29  w Version(10, 0)
1af10 29 3b 2f 2f 20 56 69 73 75 61 6c 20 53 74 75 64  );// Visual Stud
1af20 69 6f 20 32 30 31 30 0d 0a 20 20 20 20 20 20 20  io 2010..       
1af30 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1af40 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  }....        ///
1af50 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1af60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1af70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1af80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1af90 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
1afa0 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 62  private static b
1afb0 6f 6f 6c 20 48 61 76 65 56 73 56 65 72 73 69 6f  ool HaveVsVersio
1afc0 6e 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n(..            
1afd0 52 65 67 69 73 74 72 79 4b 65 79 20 72 6f 6f 74  RegistryKey root
1afe0 4b 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  Key,..          
1aff0 20 20 56 65 72 73 69 6f 6e 20 76 73 56 65 72 73    Version vsVers
1b000 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ion,..          
1b010 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a    bool whatIf,..
1b020 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
1b030 20 76 65 72 62 6f 73 65 0d 0a 20 20 20 20 20 20   verbose..      
1b040 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20        )..       
1b050 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1b060 73 74 72 69 6e 67 20 66 6f 72 6d 61 74 20 3d 20  string format = 
1b070 22 53 6f 66 74 77 61 72 65 5c 5c 4d 69 63 72 6f  "Software\\Micro
1b080 73 6f 66 74 5c 5c 56 69 73 75 61 6c 53 74 75 64  soft\\VisualStud
1b090 69 6f 5c 5c 7b 30 7d 22 3b 0d 0a 20 20 20 20 20  io\\{0}";..     
1b0a0 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 6b 65         string ke
1b0b0 79 4e 61 6d 65 20 3d 20 53 74 72 69 6e 67 2e 46  yName = String.F
1b0c0 6f 72 6d 61 74 28 66 6f 72 6d 61 74 2c 20 76 73  ormat(format, vs
1b0d0 56 65 72 73 69 6f 6e 29 3b 0d 0a 0d 0a 20 20 20  Version);....   
1b0e0 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28           using (
1b0f0 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20  MockRegistryKey 
1b100 6b 65 79 20 3d 20 52 65 67 69 73 74 72 79 48 65  key = RegistryHe
1b110 6c 70 65 72 2e 4f 70 65 6e 53 75 62 4b 65 79 28  lper.OpenSubKey(
1b120 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b130 20 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20 6b        rootKey, k
1b140 65 79 4e 61 6d 65 2c 20 66 61 6c 73 65 2c 20 77  eyName, false, w
1b150 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29 29  hatIf, verbose))
1b160 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
1b170 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b180 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c   if (key == null
1b190 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
1b1a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
1b1b0 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lse;....        
1b1c0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 76          object v
1b1d0 61 6c 75 65 20 3d 20 52 65 67 69 73 74 72 79 48  alue = RegistryH
1b1e0 65 6c 70 65 72 2e 47 65 74 56 61 6c 75 65 28 0d  elper.GetValue(.
1b1f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b200 20 20 20 20 20 6b 65 79 2c 20 22 49 6e 73 74 61       key, "Insta
1b210 6c 6c 44 69 72 22 2c 20 6e 75 6c 6c 2c 20 77 68  llDir", null, wh
1b220 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d  atIf, verbose);.
1b230 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1b240 20 20 20 69 66 20 28 21 28 76 61 6c 75 65 20 69     if (!(value i
1b250 73 20 73 74 72 69 6e 67 29 29 0d 0a 20 20 20 20  s string))..    
1b260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b270 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d  return false;...
1b280 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b290 20 73 74 72 69 6e 67 20 64 69 72 65 63 74 6f 72   string director
1b2a0 79 20 3d 20 28 73 74 72 69 6e 67 29 76 61 6c 75  y = (string)valu
1b2b0 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e;....          
1b2c0 20 20 20 20 20 20 69 66 20 28 53 74 72 69 6e 67        if (String
1b2d0 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 64  .IsNullOrEmpty(d
1b2e0 69 72 65 63 74 6f 72 79 29 29 0d 0a 20 20 20 20  irectory))..    
1b2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b300 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d  return false;...
1b310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b320 20 69 66 20 28 21 44 69 72 65 63 74 6f 72 79 2e   if (!Directory.
1b330 45 78 69 73 74 73 28 64 69 72 65 63 74 6f 72 79  Exists(directory
1b340 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
1b350 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
1b360 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  alse;....       
1b370 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1b380 74 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  true;..         
1b390 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1b3a0 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f  ...        /////
1b3b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b3c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b3d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b3e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b3f0 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70 72  //....        pr
1b400 69 76 61 74 65 20 73 74 61 74 69 63 20 62 6f 6f  ivate static boo
1b410 6c 20 46 6f 72 45 61 63 68 56 73 56 65 72 73 69  l ForEachVsVersi
1b420 6f 6e 52 65 67 69 73 74 72 79 28 0d 0a 20 20 20  onRegistry(..   
1b430 20 20 20 20 20 20 20 20 20 56 69 73 75 61 6c 53           VisualS
1b440 74 75 64 69 6f 52 65 67 69 73 74 72 79 43 61 6c  tudioRegistryCal
1b450 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 2c 0d  lback callback,.
1b460 0a 20 20 20 20 20 20 20 20 20 20 20 20 47 75 69  .            Gui
1b470 64 20 70 61 63 6b 61 67 65 49 64 2c 0d 0a 20 20  d packageId,..  
1b480 20 20 20 20 20 20 20 20 20 20 47 75 69 64 20 73            Guid s
1b490 65 72 76 69 63 65 49 64 2c 0d 0a 20 20 20 20 20  erviceId,..     
1b4a0 20 20 20 20 20 20 20 47 75 69 64 20 64 61 74 61         Guid data
1b4b0 53 6f 75 72 63 65 49 64 2c 0d 0a 20 20 20 20 20  SourceId,..     
1b4c0 20 20 20 20 20 20 20 47 75 69 64 20 64 61 74 61         Guid data
1b4d0 50 72 6f 76 69 64 65 72 49 64 2c 0d 0a 20 20 20  ProviderId,..   
1b4e0 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
1b4f0 63 6c 69 65 6e 74 44 61 74 61 2c 0d 0a 20 20 20  clientData,..   
1b500 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 77 68           bool wh
1b510 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20  atIf,..         
1b520 20 20 20 62 6f 6f 6c 20 76 65 72 62 6f 73 65 2c     bool verbose,
1b530 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
1b540 66 20 73 74 72 69 6e 67 20 65 72 72 6f 72 0d 0a  f string error..
1b550 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20              ).. 
1b560 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
1b570 20 20 20 20 20 20 52 65 67 69 73 74 72 79 4b 65        RegistryKe
1b580 79 20 72 6f 6f 74 4b 65 79 20 3d 20 76 73 52 6f  y rootKey = vsRo
1b590 6f 74 4b 65 79 3b 0d 0a 0d 0a 20 20 20 20 20 20  otKey;....      
1b5a0 20 20 20 20 20 20 69 66 20 28 72 6f 6f 74 4b 65        if (rootKe
1b5b0 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  y == null)..    
1b5c0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
1b5d0 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
1b5e0 20 3d 20 22 69 6e 76 61 6c 69 64 20 72 6f 6f 74   = "invalid root
1b5f0 20 6b 65 79 22 3b 0d 0a 20 20 20 20 20 20 20 20   key";..        
1b600 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
1b610 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alse;..         
1b620 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1b630 20 20 20 20 69 66 20 28 21 4f 62 6a 65 63 74 2e      if (!Object.
1b640 52 65 66 65 72 65 6e 63 65 45 71 75 61 6c 73 28  ReferenceEquals(
1b650 72 6f 6f 74 4b 65 79 2c 20 52 65 67 69 73 74 72  rootKey, Registr
1b660 79 2e 43 75 72 72 65 6e 74 55 73 65 72 29 20 26  y.CurrentUser) &
1b670 26 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &..             
1b680 20 20 20 21 4f 62 6a 65 63 74 2e 52 65 66 65 72     !Object.Refer
1b690 65 6e 63 65 45 71 75 61 6c 73 28 72 6f 6f 74 4b  enceEquals(rootK
1b6a0 65 79 2c 20 52 65 67 69 73 74 72 79 2e 4c 6f 63  ey, Registry.Loc
1b6b0 61 6c 4d 61 63 68 69 6e 65 29 29 0d 0a 20 20 20  alMachine))..   
1b6c0 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
1b6e0 72 20 3d 20 22 72 6f 6f 74 20 6b 65 79 20 6d 75  r = "root key mu
1b6f0 73 74 20 62 65 20 70 65 72 2d 75 73 65 72 20 6f  st be per-user o
1b700 72 20 70 65 72 2d 6d 61 63 68 69 6e 65 22 3b 0d  r per-machine";.
1b710 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b720 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a   return false;..
1b730 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
1b740 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
1b750 28 76 73 56 65 72 73 69 6f 6e 4c 69 73 74 20 3d  (vsVersionList =
1b760 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
1b770 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1b780 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20          error = 
1b790 22 6e 6f 20 56 53 20 76 65 72 73 69 6f 6e 73 20  "no VS versions 
1b7a0 66 6f 75 6e 64 22 3b 0d 0a 20 20 20 20 20 20 20  found";..       
1b7b0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1b7c0 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20  false;..        
1b7d0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1b7e0 20 20 20 20 20 66 6f 72 65 61 63 68 20 28 56 65       foreach (Ve
1b7f0 72 73 69 6f 6e 20 76 73 56 65 72 73 69 6f 6e 20  rsion vsVersion 
1b800 69 6e 20 76 73 56 65 72 73 69 6f 6e 4c 69 73 74  in vsVersionList
1b810 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
1b820 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b830 20 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63 65    TraceOps.Trace
1b840 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
1b850 20 20 20 20 20 20 20 54 72 61 63 65 50 72 69 6f         TracePrio
1b860 72 69 74 79 2e 4c 6f 77 65 72 2c 20 74 72 61 63  rity.Lower, trac
1b870 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e  eCallback, Strin
1b880 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20  g.Format(..     
1b890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1b8a0 76 73 56 65 72 73 69 6f 6e 20 3d 20 7b 30 7d 22  vsVersion = {0}"
1b8b0 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 76 73 56  , ForDisplay(vsV
1b8c0 65 72 73 69 6f 6e 29 29 2c 0d 0a 20 20 20 20 20  ersion)),..     
1b8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1b8e0 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a  raceCategory);..
1b8f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b900 20 20 69 66 20 28 21 48 61 76 65 56 73 56 65 72    if (!HaveVsVer
1b910 73 69 6f 6e 28 72 6f 6f 74 4b 65 79 2c 20 76 73  sion(rootKey, vs
1b920 56 65 72 73 69 6f 6e 2c 20 77 68 61 74 49 66 2c  Version, whatIf,
1b930 20 76 65 72 62 6f 73 65 29 29 0d 0a 20 20 20 20   verbose))..    
1b940 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b960 20 20 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63     TraceOps.Trac
1b970 65 28 54 72 61 63 65 50 72 69 6f 72 69 74 79 2e  e(TracePriority.
1b980 4c 6f 77 2c 20 74 72 61 63 65 43 61 6c 6c 62 61  Low, traceCallba
1b990 63 6b 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ck,..           
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 56 69               "Vi
1b9b0 73 75 61 6c 20 53 74 75 64 69 6f 20 76 65 72 73  sual Studio vers
1b9c0 69 6f 6e 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 73  ion not found, s
1b9d0 6b 69 70 70 69 6e 67 2e 2e 2e 22 2c 0d 0a 20 20  kipping...",..  
1b9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9f0 20 20 20 20 20 20 74 72 61 63 65 43 61 74 65 67        traceCateg
1ba00 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ory);....       
1ba10 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
1ba20 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20  tinue;..        
1ba30 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1ba40 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1ba50 28 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 6e 75 6c  (callback == nul
1ba60 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
1ba70 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
1ba80 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
1ba90 20 20 20 20 20 69 66 20 28 21 63 61 6c 6c 62 61       if (!callba
1baa0 63 6b 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ck(..           
1bab0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f               roo
1bac0 74 4b 65 79 2c 20 76 73 56 65 72 73 69 6f 6e 2c  tKey, vsVersion,
1bad0 20 70 61 63 6b 61 67 65 49 64 2c 20 73 65 72 76   packageId, serv
1bae0 69 63 65 49 64 2c 0d 0a 20 20 20 20 20 20 20 20  iceId,..        
1baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb00 64 61 74 61 53 6f 75 72 63 65 49 64 2c 20 64 61  dataSourceId, da
1bb10 74 61 50 72 6f 76 69 64 65 72 49 64 2c 20 63 6c  taProviderId, cl
1bb20 69 65 6e 74 44 61 74 61 2c 20 77 68 61 74 49 66  ientData, whatIf
1bb30 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
1bb40 20 20 20 20 20 20 20 20 20 20 20 76 65 72 62 6f             verbo
1bb50 73 65 2c 20 72 65 66 20 65 72 72 6f 72 29 29 0d  se, ref error)).
1bb60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bb70 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1bb80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
1bb90 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alse;..         
1bba0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1bbb0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1bbc0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
1bbd0 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ue;..        }..
1bbe0 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69          #endregi
1bbf0 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  on....        //
1bc00 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bc10 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bc20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bc30 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bc40 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
1bc50 20 23 72 65 67 69 6f 6e 20 43 6f 6e 66 69 67 75   #region Configu
1bc60 72 61 74 69 6f 6e 20 46 69 6c 65 20 48 61 6e 64  ration File Hand
1bc70 6c 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 70 72  ling..        pr
1bc80 69 76 61 74 65 20 73 74 61 74 69 63 20 62 6f 6f  ivate static boo
1bc90 6c 20 41 64 64 44 62 50 72 6f 76 69 64 65 72 46  l AddDbProviderF
1bca0 61 63 74 6f 72 79 28 0d 0a 20 20 20 20 20 20 20  actory(..       
1bcb0 20 20 20 20 20 73 74 72 69 6e 67 20 66 69 6c 65       string file
1bcc0 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  Name,..         
1bcd0 20 20 20 73 74 72 69 6e 67 20 69 6e 76 61 72 69     string invari
1bce0 61 6e 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ant,..          
1bcf0 20 20 73 74 72 69 6e 67 20 6e 61 6d 65 2c 0d 0a    string name,..
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
1bd10 6e 67 20 64 65 73 63 72 69 70 74 69 6f 6e 2c 0d  ng description,.
1bd20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72  .            str
1bd30 69 6e 67 20 74 79 70 65 4e 61 6d 65 2c 0d 0a 20  ing typeName,.. 
1bd40 20 20 20 20 20 20 20 20 20 20 20 41 73 73 65 6d             Assem
1bd50 62 6c 79 4e 61 6d 65 20 61 73 73 65 6d 62 6c 79  blyName assembly
1bd60 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  Name,..         
1bd70 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d     bool whatIf,.
1bd80 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f  .            boo
1bd90 6c 20 76 65 72 62 6f 73 65 2c 0d 0a 20 20 20 20  l verbose,..    
1bda0 20 20 20 20 20 20 20 20 72 65 66 20 62 6f 6f 6c          ref bool
1bdb0 20 73 61 76 65 64 2c 0d 0a 20 20 20 20 20 20 20   saved,..       
1bdc0 20 20 20 20 20 72 65 66 20 73 74 72 69 6e 67 20       ref string 
1bdd0 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20  error..         
1bde0 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d     )..        {.
1bdf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f  .            boo
1be00 6c 20 64 69 72 74 79 20 3d 20 66 61 6c 73 65 3b  l dirty = false;
1be10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 58 6d  ..            Xm
1be20 6c 44 6f 63 75 6d 65 6e 74 20 64 6f 63 75 6d 65  lDocument docume
1be30 6e 74 20 3d 20 6e 65 77 20 58 6d 6c 44 6f 63 75  nt = new XmlDocu
1be40 6d 65 6e 74 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  ment();....     
1be50 20 20 20 20 20 20 20 64 6f 63 75 6d 65 6e 74 2e         document.
1be60 50 72 65 73 65 72 76 65 57 68 69 74 65 73 70 61  PreserveWhitespa
1be70 63 65 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20  ce = true;..    
1be80 20 20 20 20 20 20 20 20 64 6f 63 75 6d 65 6e 74          document
1be90 2e 4c 6f 61 64 28 66 69 6c 65 4e 61 6d 65 29 3b  .Load(fileName);
1bea0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1beb0 58 6d 6c 45 6c 65 6d 65 6e 74 20 65 6c 65 6d 65  XmlElement eleme
1bec0 6e 74 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 53 65  nt = document.Se
1bed0 6c 65 63 74 53 69 6e 67 6c 65 4e 6f 64 65 28 53  lectSingleNode(S
1bee0 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20  tring.Format(.. 
1bef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 58                 X
1bf00 50 61 74 68 46 6f 72 41 64 64 45 6c 65 6d 65 6e  PathForAddElemen
1bf10 74 2c 20 69 6e 76 61 72 69 61 6e 74 29 29 20 61  t, invariant)) a
1bf20 73 20 58 6d 6c 45 6c 65 6d 65 6e 74 3b 0d 0a 0d  s XmlElement;...
1bf30 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
1bf40 28 65 6c 65 6d 65 6e 74 20 3d 3d 20 6e 75 6c 6c  (element == null
1bf50 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
1bf60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1bf70 20 20 73 74 72 69 6e 67 5b 5d 20 65 6c 65 6d 65    string[] eleme
1bf80 6e 74 4e 61 6d 65 73 20 3d 20 7b 0d 0a 20 20 20  ntNames = {..   
1bf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfa0 20 20 20 20 20 22 73 79 73 74 65 6d 2e 64 61 74       "system.dat
1bfb0 61 22 2c 20 22 44 62 50 72 6f 76 69 64 65 72 46  a", "DbProviderF
1bfc0 61 63 74 6f 72 69 65 73 22 0d 0a 20 20 20 20 20  actories"..     
1bfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1bfe0 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
1bff0 20 20 20 20 20 58 6d 6c 45 6c 65 6d 65 6e 74 20       XmlElement 
1c000 70 72 65 76 69 6f 75 73 45 6c 65 6d 65 6e 74 20  previousElement 
1c010 3d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =..             
1c020 20 20 20 20 20 20 20 64 6f 63 75 6d 65 6e 74 2e         document.
1c030 44 6f 63 75 6d 65 6e 74 45 6c 65 6d 65 6e 74 3b  DocumentElement;
1c040 20 2f 2a 20 63 6f 6e 66 69 67 75 72 61 74 69 6f   /* configuratio
1c050 6e 20 2a 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  n */....        
1c060 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1c070 28 73 74 72 69 6e 67 20 65 6c 65 6d 65 6e 74 4e  (string elementN
1c080 61 6d 65 20 69 6e 20 65 6c 65 6d 65 6e 74 4e 61  ame in elementNa
1c090 6d 65 73 29 0d 0a 20 20 20 20 20 20 20 20 20 20  mes)..          
1c0a0 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
1c0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 65               ele
1c0c0 6d 65 6e 74 20 3d 20 70 72 65 76 69 6f 75 73 45  ment = previousE
1c0d0 6c 65 6d 65 6e 74 2e 53 65 6c 65 63 74 53 69 6e  lement.SelectSin
1c0e0 67 6c 65 4e 6f 64 65 28 0d 0a 20 20 20 20 20 20  gleNode(..      
1c0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c100 20 20 65 6c 65 6d 65 6e 74 4e 61 6d 65 29 20 61    elementName) a
1c110 73 20 58 6d 6c 45 6c 65 6d 65 6e 74 3b 0d 0a 0d  s XmlElement;...
1c120 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c130 20 20 20 20 20 69 66 20 28 65 6c 65 6d 65 6e 74       if (element
1c140 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
1c150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
1c160 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c170 20 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e            elemen
1c180 74 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 43 72 65  t = document.Cre
1c190 61 74 65 45 6c 65 6d 65 6e 74 28 0d 0a 20 20 20  ateElement(..   
1c1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1b0 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74           element
1c1c0 4e 61 6d 65 2c 20 53 74 72 69 6e 67 2e 45 6d 70  Name, String.Emp
1c1d0 74 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ty);....        
1c1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1f0 70 72 65 76 69 6f 75 73 45 6c 65 6d 65 6e 74 2e  previousElement.
1c200 41 70 70 65 6e 64 43 68 69 6c 64 28 65 6c 65 6d  AppendChild(elem
1c210 65 6e 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ent);..         
1c220 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
1c230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c240 20 20 20 20 70 72 65 76 69 6f 75 73 45 6c 65 6d      previousElem
1c250 65 6e 74 20 3d 20 65 6c 65 6d 65 6e 74 3b 0d 0a  ent = element;..
1c260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c270 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
1c280 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 3d 20 64       element = d
1c290 6f 63 75 6d 65 6e 74 2e 43 72 65 61 74 65 45 6c  ocument.CreateEl
1c2a0 65 6d 65 6e 74 28 0d 0a 20 20 20 20 20 20 20 20  ement(..        
1c2b0 20 20 20 20 20 20 20 20 20 20 20 20 22 61 64 64              "add
1c2c0 22 2c 20 53 74 72 69 6e 67 2e 45 6d 70 74 79 29  ", String.Empty)
1c2d0 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
1c2e0 20 20 20 20 20 70 72 65 76 69 6f 75 73 45 6c 65       previousEle
1c2f0 6d 65 6e 74 2e 41 70 70 65 6e 64 43 68 69 6c 64  ment.AppendChild
1c300 28 65 6c 65 6d 65 6e 74 29 3b 0d 0a 0d 0a 20 20  (element);....  
1c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
1c320 72 74 79 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20  rty = true;..   
1c330 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1c340 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 53            if (!S
1c350 74 72 69 6e 67 2e 45 71 75 61 6c 73 28 65 6c 65  tring.Equals(ele
1c360 6d 65 6e 74 2e 47 65 74 41 74 74 72 69 62 75 74  ment.GetAttribut
1c370 65 28 22 6e 61 6d 65 22 29 2c 0d 0a 20 20 20 20  e("name"),..    
1c380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c390 6e 61 6d 65 2c 20 53 74 72 69 6e 67 43 6f 6d 70  name, StringComp
1c3a0 61 72 69 73 6f 6e 2e 49 6e 76 61 72 69 61 6e 74  arison.Invariant
1c3b0 43 75 6c 74 75 72 65 29 29 0d 0a 20 20 20 20 20  Culture))..     
1c3c0 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
1c3d0 20 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e            elemen
1c3e0 74 2e 53 65 74 41 74 74 72 69 62 75 74 65 28 22  t.SetAttribute("
1c3f0 6e 61 6d 65 22 2c 20 6e 61 6d 65 29 3b 0d 0a 20  name", name);.. 
1c400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1c410 69 72 74 79 20 3d 20 74 72 75 65 3b 0d 0a 20 20  irty = true;..  
1c420 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1c430 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
1c440 53 74 72 69 6e 67 2e 45 71 75 61 6c 73 28 65 6c  String.Equals(el
1c450 65 6d 65 6e 74 2e 47 65 74 41 74 74 72 69 62 75  ement.GetAttribu
1c460 74 65 28 22 69 6e 76 61 72 69 61 6e 74 22 29 2c  te("invariant"),
1c470 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c480 20 20 20 20 20 20 69 6e 76 61 72 69 61 6e 74 2c        invariant,
1c490 20 53 74 72 69 6e 67 43 6f 6d 70 61 72 69 73 6f   StringCompariso
1c4a0 6e 2e 49 6e 76 61 72 69 61 6e 74 43 75 6c 74 75  n.InvariantCultu
1c4b0 72 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  re))..          
1c4c0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
1c4d0 20 20 20 20 20 65 6c 65 6d 65 6e 74 2e 53 65 74       element.Set
1c4e0 41 74 74 72 69 62 75 74 65 28 22 69 6e 76 61 72  Attribute("invar
1c4f0 69 61 6e 74 22 2c 20 69 6e 76 61 72 69 61 6e 74  iant", invariant
1c500 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
1c510 20 20 20 20 64 69 72 74 79 20 3d 20 74 72 75 65      dirty = true
1c520 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
1c530 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1c540 69 66 20 28 21 53 74 72 69 6e 67 2e 45 71 75 61  if (!String.Equa
1c550 6c 73 28 65 6c 65 6d 65 6e 74 2e 47 65 74 41 74  ls(element.GetAt
1c560 74 72 69 62 75 74 65 28 22 64 65 73 63 72 69 70  tribute("descrip
1c570 74 69 6f 6e 22 29 2c 0d 0a 20 20 20 20 20 20 20  tion"),..       
1c580 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 73               des
1c590 63 72 69 70 74 69 6f 6e 2c 20 53 74 72 69 6e 67  cription, String
1c5a0 43 6f 6d 70 61 72 69 73 6f 6e 2e 49 6e 76 61 72  Comparison.Invar
1c5b0 69 61 6e 74 43 75 6c 74 75 72 65 29 29 0d 0a 20  iantCulture)).. 
1c5c0 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
1c5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c                el
1c5e0 65 6d 65 6e 74 2e 53 65 74 41 74 74 72 69 62 75  ement.SetAttribu
1c5f0 74 65 28 22 64 65 73 63 72 69 70 74 69 6f 6e 22  te("description"
1c600 2c 20 64 65 73 63 72 69 70 74 69 6f 6e 29 3b 0d  , description);.
1c610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c620 20 64 69 72 74 79 20 3d 20 74 72 75 65 3b 0d 0a   dirty = true;..
1c630 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
1c640 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72  .            str
1c650 69 6e 67 20 66 75 6c 6c 54 79 70 65 4e 61 6d 65  ing fullTypeName
1c660 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74   = String.Format
1c670 28 22 7b 30 7d 2c 20 7b 31 7d 22 2c 0d 0a 20 20  ("{0}, {1}",..  
1c680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 79                ty
1c690 70 65 4e 61 6d 65 2c 20 61 73 73 65 6d 62 6c 79  peName, assembly
1c6a0 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  Name);....      
1c6b0 20 20 20 20 20 20 69 66 20 28 21 53 74 72 69 6e        if (!Strin
1c6c0 67 2e 45 71 75 61 6c 73 28 65 6c 65 6d 65 6e 74  g.Equals(element
1c6d0 2e 47 65 74 41 74 74 72 69 62 75 74 65 28 22 74  .GetAttribute("t
1c6e0 79 70 65 22 29 2c 0d 0a 20 20 20 20 20 20 20 20  ype"),..        
1c6f0 20 20 20 20 20 20 20 20 20 20 20 20 66 75 6c 6c              full
1c700 54 79 70 65 4e 61 6d 65 2c 20 53 74 72 69 6e 67  TypeName, String
1c710 43 6f 6d 70 61 72 69 73 6f 6e 2e 49 6e 76 61 72  Comparison.Invar
1c720 69 61 6e 74 43 75 6c 74 75 72 65 29 29 0d 0a 20  iantCulture)).. 
1c730 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
1c740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c                el
1c750 65 6d 65 6e 74 2e 53 65 74 41 74 74 72 69 62 75  ement.SetAttribu
1c760 74 65 28 22 74 79 70 65 22 2c 20 66 75 6c 6c 54  te("type", fullT
1c770 79 70 65 4e 61 6d 65 29 3b 0d 0a 20 20 20 20 20  ypeName);..     
1c780 20 20 20 20 20 20 20 20 20 20 20 64 69 72 74 79             dirty
1c790 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20   = true;..      
1c7a0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1c7b0 20 20 20 20 20 20 20 69 66 20 28 64 69 72 74 79         if (dirty
1c7c0 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
1c7d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c7e0 20 20 69 66 20 28 76 65 72 62 6f 73 65 29 0d 0a    if (verbose)..
1c7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c800 20 20 20 20 54 72 61 63 65 4f 70 73 2e 54 72 61      TraceOps.Tra
1c810 63 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ce(..           
1c820 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61               Tra
1c830 63 65 50 72 69 6f 72 69 74 79 2e 4c 6f 77 65 73  cePriority.Lowes
1c840 74 2c 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b  t, traceCallback
1c850 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  , String.Format(
1c860 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c870 20 20 20 20 20 20 20 20 20 20 22 65 6c 65 6d 65            "eleme
1c880 6e 74 20 3d 20 7b 30 7d 22 2c 20 46 6f 72 44 69  nt = {0}", ForDi
1c890 73 70 6c 61 79 28 65 6c 65 6d 65 6e 74 29 29 2c  splay(element)),
1c8a0 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b   traceCategory);
1c8b0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1c8c0 20 20 20 20 69 66 20 28 21 77 68 61 74 49 66 29      if (!whatIf)
1c8d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c8e0 20 20 20 20 20 20 64 6f 63 75 6d 65 6e 74 2e 53        document.S
1c8f0 61 76 65 28 66 69 6c 65 4e 61 6d 65 29 3b 0d 0a  ave(fileName);..
1c900 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c910 20 20 73 61 76 65 64 20 3d 20 74 72 75 65 3b 0d    saved = true;.
1c920 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1c930 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
1c940 74 75 72 6e 20 74 72 75 65 3b 0d 0a 20 20 20 20  turn true;..    
1c950 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1c960 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
1c970 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c980 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c990 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c9a0 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
1c9b0 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
1c9c0 69 63 20 62 6f 6f 6c 20 52 65 6d 6f 76 65 44 62  ic bool RemoveDb
1c9d0 50 72 6f 76 69 64 65 72 46 61 63 74 6f 72 79 28  ProviderFactory(
1c9e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  ..            st
1c9f0 72 69 6e 67 20 66 69 6c 65 4e 61 6d 65 2c 0d 0a  ring fileName,..
1ca00 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
1ca10 6e 67 20 69 6e 76 61 72 69 61 6e 74 2c 0d 0a 20  ng invariant,.. 
1ca20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20             bool 
1ca30 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20  whatIf,..       
1ca40 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62 6f 73       bool verbos
1ca50 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e,..            
1ca60 72 65 66 20 62 6f 6f 6c 20 73 61 76 65 64 2c 0d  ref bool saved,.
1ca70 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 66  .            ref
1ca80 20 73 74 72 69 6e 67 20 65 72 72 6f 72 0d 0a 20   string error.. 
1ca90 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20             )..  
1caa0 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
1cab0 20 20 20 20 20 62 6f 6f 6c 20 64 69 72 74 79 20       bool dirty 
1cac0 3d 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20  = false;..      
1cad0 20 20 20 20 20 20 58 6d 6c 44 6f 63 75 6d 65 6e        XmlDocumen
1cae0 74 20 64 6f 63 75 6d 65 6e 74 20 3d 20 6e 65 77  t document = new
1caf0 20 58 6d 6c 44 6f 63 75 6d 65 6e 74 28 29 3b 0d   XmlDocument();.
1cb00 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  ...            d
1cb10 6f 63 75 6d 65 6e 74 2e 50 72 65 73 65 72 76 65  ocument.Preserve
1cb20 57 68 69 74 65 73 70 61 63 65 20 3d 20 74 72 75  Whitespace = tru
1cb30 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
1cb40 64 6f 63 75 6d 65 6e 74 2e 4c 6f 61 64 28 66 69  document.Load(fi
1cb50 6c 65 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20  leName);....    
1cb60 20 20 20 20 20 20 20 20 58 6d 6c 45 6c 65 6d 65          XmlEleme
1cb70 6e 74 20 65 6c 65 6d 65 6e 74 20 3d 20 64 6f 63  nt element = doc
1cb80 75 6d 65 6e 74 2e 53 65 6c 65 63 74 53 69 6e 67  ument.SelectSing
1cb90 6c 65 4e 6f 64 65 28 53 74 72 69 6e 67 2e 46 6f  leNode(String.Fo
1cba0 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20  rmat(..         
1cbb0 20 20 20 20 20 20 20 58 50 61 74 68 46 6f 72 41         XPathForA
1cbc0 64 64 45 6c 65 6d 65 6e 74 2c 20 69 6e 76 61 72  ddElement, invar
1cbd0 69 61 6e 74 29 29 20 61 73 20 58 6d 6c 45 6c 65  iant)) as XmlEle
1cbe0 6d 65 6e 74 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ment;....       
1cbf0 20 20 20 20 20 69 66 20 28 65 6c 65 6d 65 6e 74       if (element
1cc00 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   != null)..     
1cc10 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
1cc20 20 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e            elemen
1cc30 74 2e 50 61 72 65 6e 74 4e 6f 64 65 2e 52 65 6d  t.ParentNode.Rem
1cc40 6f 76 65 43 68 69 6c 64 28 65 6c 65 6d 65 6e 74  oveChild(element
1cc50 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
1cc60 20 20 20 20 64 69 72 74 79 20 3d 20 74 72 75 65      dirty = true
1cc70 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
1cc80 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1cc90 65 6c 65 6d 65 6e 74 20 3d 20 64 6f 63 75 6d 65  element = docume
1cca0 6e 74 2e 53 65 6c 65 63 74 53 69 6e 67 6c 65 4e  nt.SelectSingleN
1ccb0 6f 64 65 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61  ode(String.Forma
1ccc0 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t(..            
1ccd0 20 20 20 20 58 50 61 74 68 46 6f 72 52 65 6d 6f      XPathForRemo
1cce0 76 65 45 6c 65 6d 65 6e 74 2c 20 69 6e 76 61 72  veElement, invar
1ccf0 69 61 6e 74 29 29 20 61 73 20 58 6d 6c 45 6c 65  iant)) as XmlEle
1cd00 6d 65 6e 74 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ment;....       
1cd10 20 20 20 20 20 69 66 20 28 65 6c 65 6d 65 6e 74       if (element
1cd20 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   != null)..     
1cd30 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
1cd40 20 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e            elemen
1cd50 74 2e 50 61 72 65 6e 74 4e 6f 64 65 2e 52 65 6d  t.ParentNode.Rem
1cd60 6f 76 65 43 68 69 6c 64 28 65 6c 65 6d 65 6e 74  oveChild(element
1cd70 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
1cd80 20 20 20 20 64 69 72 74 79 20 3d 20 74 72 75 65      dirty = true
1cd90 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
1cda0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1cdb0 69 66 20 28 64 69 72 74 79 29 0d 0a 20 20 20 20  if (dirty)..    
1cdc0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
1cdd0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 76             if (v
1cde0 65 72 62 6f 73 65 29 0d 0a 20 20 20 20 20 20 20  erbose)..       
1cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61               Tra
1ce00 63 65 4f 70 73 2e 54 72 61 63 65 28 0d 0a 20 20  ceOps.Trace(..  
1ce10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce20 20 20 20 20 20 20 54 72 61 63 65 50 72 69 6f 72        TracePrior
1ce30 69 74 79 2e 4c 6f 77 65 73 74 2c 20 74 72 61 63  ity.Lowest, trac
1ce40 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e  eCallback, Strin
1ce50 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20  g.Format(..     
1ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce70 20 20 20 22 65 6c 65 6d 65 6e 74 20 3d 20 7b 30     "element = {0
1ce80 7d 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 65  }", ForDisplay(e
1ce90 6c 65 6d 65 6e 74 29 29 2c 20 74 72 61 63 65 43  lement)), traceC
1cea0 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20  ategory);....   
1ceb0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1cec0 28 21 77 68 61 74 49 66 29 0d 0a 20 20 20 20 20  (!whatIf)..     
1ced0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1cee0 6f 63 75 6d 65 6e 74 2e 53 61 76 65 28 66 69 6c  ocument.Save(fil
1cef0 65 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20  eName);....     
1cf00 20 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64             saved
1cf10 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20   = true;..      
1cf20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1cf30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
1cf40 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ue;..        }..
1cf50 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f  ..        //////
1cf60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1cf70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1cf80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1cf90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1cfa0 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70 72 69  /....        pri
1cfb0 76 61 74 65 20 73 74 61 74 69 63 20 62 6f 6f 6c  vate static bool
1cfc0 20 50 72 6f 63 65 73 73 44 62 50 72 6f 76 69 64   ProcessDbProvid
1cfd0 65 72 46 61 63 74 6f 72 79 28 0d 0a 20 20 20 20  erFactory(..    
1cfe0 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 66          string f
1cff0 69 6c 65 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20  ileName,..      
1d000 20 20 20 20 20 20 73 74 72 69 6e 67 20 69 6e 76        string inv
1d010 61 72 69 61 6e 74 2c 0d 0a 20 20 20 20 20 20 20  ariant,..       
1d020 20 20 20 20 20 73 74 72 69 6e 67 20 6e 61 6d 65       string name
1d030 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ,..            s
1d040 74 72 69 6e 67 20 64 65 73 63 72 69 70 74 69 6f  tring descriptio
1d050 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n,..            
1d060 73 74 72 69 6e 67 20 74 79 70 65 4e 61 6d 65 2c  string typeName,
1d070 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 73  ..            As
1d080 73 65 6d 62 6c 79 4e 61 6d 65 20 61 73 73 65 6d  semblyName assem
1d090 62 6c 79 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20  blyName,..      
1d0a0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 63 6c 69        object cli
1d0b0 65 6e 74 44 61 74 61 2c 0d 0a 20 20 20 20 20 20  entData,..      
1d0c0 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49        bool whatI
1d0d0 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  f,..            
1d0e0 62 6f 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a 20  bool verbose,.. 
1d0f0 20 20 20 20 20 20 20 20 20 20 20 72 65 66 20 62             ref b
1d100 6f 6f 6c 20 73 61 76 65 64 2c 0d 0a 20 20 20 20  ool saved,..    
1d110 20 20 20 20 20 20 20 20 72 65 66 20 73 74 72 69          ref stri
1d120 6e 67 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20  ng error..      
1d130 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20        )..       
1d140 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1d150 41 6e 79 50 61 69 72 3c 73 74 72 69 6e 67 2c 20  AnyPair<string, 
1d160 62 6f 6f 6c 3e 20 70 61 69 72 20 3d 20 63 6c 69  bool> pair = cli
1d170 65 6e 74 44 61 74 61 20 61 73 20 41 6e 79 50 61  entData as AnyPa
1d180 69 72 3c 73 74 72 69 6e 67 2c 20 62 6f 6f 6c 3e  ir<string, bool>
1d190 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
1d1a0 20 69 66 20 28 70 61 69 72 20 3d 3d 20 6e 75 6c   if (pair == nul
1d1b0 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
1d1c0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1d1d0 20 20 20 65 72 72 6f 72 20 3d 20 22 69 6e 76 61     error = "inva
1d1e0 6c 69 64 20 66 72 61 6d 65 77 6f 72 6b 20 63 6f  lid framework co
1d1f0 6e 66 69 67 20 63 61 6c 6c 62 61 63 6b 20 64 61  nfig callback da
1d200 74 61 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ta";..          
1d210 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
1d220 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se;..           
1d230 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1d240 20 20 69 66 20 28 70 61 69 72 2e 59 29 0d 0a 20    if (pair.Y).. 
1d250 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
1d260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1d270 74 75 72 6e 20 52 65 6d 6f 76 65 44 62 50 72 6f  turn RemoveDbPro
1d280 76 69 64 65 72 46 61 63 74 6f 72 79 28 0d 0a 20  viderFactory(.. 
1d290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2a0 20 20 20 66 69 6c 65 4e 61 6d 65 2c 20 69 6e 76     fileName, inv
1d2b0 61 72 69 61 6e 74 2c 20 77 68 61 74 49 66 2c 20  ariant, whatIf, 
1d2c0 76 65 72 62 6f 73 65 2c 20 72 65 66 20 73 61 76  verbose, ref sav
1d2d0 65 64 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ed,..           
1d2e0 20 20 20 20 20 20 20 20 20 72 65 66 20 65 72 72           ref err
1d2f0 6f 72 29 20 26 26 0d 0a 20 20 20 20 20 20 20 20  or) &&..        
1d300 20 20 20 20 20 20 20 20 41 64 64 44 62 50 72 6f          AddDbPro
1d310 76 69 64 65 72 46 61 63 74 6f 72 79 28 0d 0a 20  viderFactory(.. 
1d320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d330 20 20 20 66 69 6c 65 4e 61 6d 65 2c 20 69 6e 76     fileName, inv
1d340 61 72 69 61 6e 74 2c 20 6e 61 6d 65 2c 20 64 65  ariant, name, de
1d350 73 63 72 69 70 74 69 6f 6e 2c 20 74 79 70 65 4e  scription, typeN
1d360 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ame,..          
1d370 20 20 20 20 20 20 20 20 20 20 61 73 73 65 6d 62            assemb
1d380 6c 79 4e 61 6d 65 2c 20 77 68 61 74 49 66 2c 20  lyName, whatIf, 
1d390 76 65 72 62 6f 73 65 2c 20 72 65 66 20 73 61 76  verbose, ref sav
1d3a0 65 64 2c 20 72 65 66 20 65 72 72 6f 72 29 3b 0d  ed, ref error);.
1d3b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1d3c0 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
1d3d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
1d3e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d3f0 20 72 65 74 75 72 6e 20 52 65 6d 6f 76 65 44 62   return RemoveDb
1d400 50 72 6f 76 69 64 65 72 46 61 63 74 6f 72 79 28  ProviderFactory(
1d410 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d420 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 2c 20        fileName, 
1d430 69 6e 76 61 72 69 61 6e 74 2c 20 77 68 61 74 49  invariant, whatI
1d440 66 2c 20 76 65 72 62 6f 73 65 2c 20 72 65 66 20  f, verbose, ref 
1d450 73 61 76 65 64 2c 0d 0a 20 20 20 20 20 20 20 20  saved,..        
1d460 20 20 20 20 20 20 20 20 20 20 20 20 72 65 66 20              ref 
1d470 65 72 72 6f 72 29 3b 0d 0a 20 20 20 20 20 20 20  error);..       
1d480 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1d490 7d 0d 0a 20 20 20 20 20 20 20 20 23 65 6e 64 72  }..        #endr
1d4a0 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  egion....       
1d4b0 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
1d4c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d4d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d4e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d4f0 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
1d500 20 20 20 20 23 72 65 67 69 6f 6e 20 41 73 73 65      #region Asse
1d510 6d 62 6c 79 20 46 6f 6c 64 65 72 73 20 48 61 6e  mbly Folders Han
1d520 64 6c 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 70  dling..        p
1d530 72 69 76 61 74 65 20 73 74 61 74 69 63 20 73 74  rivate static st
1d540 72 69 6e 67 20 47 65 74 41 73 73 65 6d 62 6c 79  ring GetAssembly
1d550 46 6f 6c 64 65 72 73 4b 65 79 4e 61 6d 65 28 0d  FoldersKeyName(.
1d560 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72  .            str
1d570 69 6e 67 20 66 72 61 6d 65 77 6f 72 6b 4e 61 6d  ing frameworkNam
1d580 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e,..            
1d590 56 65 72 73 69 6f 6e 20 66 72 61 6d 65 77 6f 72  Version framewor
1d5a0 6b 56 65 72 73 69 6f 6e 2c 0d 0a 20 20 20 20 20  kVersion,..     
1d5b0 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 70 6c         string pl
1d5c0 61 74 66 6f 72 6d 4e 61 6d 65 0d 0a 20 20 20 20  atformName..    
1d5d0 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20          )..     
1d5e0 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
1d5f0 20 20 73 74 72 69 6e 67 20 66 6f 72 6d 61 74 20    string format 
1d600 3d 20 21 53 74 72 69 6e 67 2e 49 73 4e 75 6c 6c  = !String.IsNull
1d610 4f 72 45 6d 70 74 79 28 70 6c 61 74 66 6f 72 6d  OrEmpty(platform
1d620 4e 61 6d 65 29 20 3f 0d 0a 20 20 20 20 20 20 20  Name) ?..       
1d630 20 20 20 20 20 20 20 20 20 22 53 6f 66 74 77 61           "Softwa
1d640 72 65 5c 5c 4d 69 63 72 6f 73 6f 66 74 5c 5c 7b  re\\Microsoft\\{
1d650 30 7d 5c 5c 76 7b 31 7d 5c 5c 7b 32 7d 5c 5c 41  0}\\v{1}\\{2}\\A
1d660 73 73 65 6d 62 6c 79 46 6f 6c 64 65 72 73 45 78  ssemblyFoldersEx
1d670 22 20 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " :..           
1d680 20 20 20 20 20 22 53 6f 66 74 77 61 72 65 5c 5c       "Software\\
1d690 4d 69 63 72 6f 73 6f 66 74 5c 5c 7b 30 7d 5c 5c  Microsoft\\{0}\\
1d6a0 76 7b 31 7d 5c 5c 41 73 73 65 6d 62 6c 79 46 6f  v{1}\\AssemblyFo
1d6b0 6c 64 65 72 73 45 78 22 3b 0d 0a 0d 0a 20 20 20  ldersEx";....   
1d6c0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1d6d0 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 66 6f  String.Format(fo
1d6e0 72 6d 61 74 2c 20 66 72 61 6d 65 77 6f 72 6b 4e  rmat, frameworkN
1d6f0 61 6d 65 2c 20 66 72 61 6d 65 77 6f 72 6b 56 65  ame, frameworkVe
1d700 72 73 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20  rsion,..        
1d710 20 20 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d          platform
1d720 4e 61 6d 65 29 3b 0d 0a 20 20 20 20 20 20 20 20  Name);..        
1d730 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  }....        ///
1d740 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d750 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d760 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d770 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d780 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
1d790 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 62  private static b
1d7a0 6f 6f 6c 20 41 64 64 54 6f 41 73 73 65 6d 62 6c  ool AddToAssembl
1d7b0 79 46 6f 6c 64 65 72 73 28 0d 0a 20 20 20 20 20  yFolders(..     
1d7c0 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79 4b         RegistryK
1d7d0 65 79 20 72 6f 6f 74 4b 65 79 2c 0d 0a 20 20 20  ey rootKey,..   
1d7e0 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
1d7f0 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 2c 0d 0a  frameworkName,..
1d800 20 20 20 20 20 20 20 20 20 20 20 20 56 65 72 73              Vers
1d810 69 6f 6e 20 66 72 61 6d 65 77 6f 72 6b 56 65 72  ion frameworkVer
1d820 73 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20  sion,..         
1d830 20 20 20 73 74 72 69 6e 67 20 70 6c 61 74 66 6f     string platfo
1d840 72 6d 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20  rmName,..       
1d850 20 20 20 20 20 73 74 72 69 6e 67 20 73 75 62 4b       string subK
1d860 65 79 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20  eyName,..       
1d870 20 20 20 20 20 73 74 72 69 6e 67 20 64 69 72 65       string dire
1d880 63 74 6f 72 79 2c 0d 0a 20 20 20 20 20 20 20 20  ctory,..        
1d890 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c      bool whatIf,
1d8a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6f  ..            bo
1d8b0 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a 20 20 20  ol verbose,..   
1d8c0 20 20 20 20 20 20 20 20 20 72 65 66 20 73 74 72           ref str
1d8d0 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20 20 20 20  ing error..     
1d8e0 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20         )..      
1d8f0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
1d900 20 73 74 72 69 6e 67 20 6b 65 79 4e 61 6d 65 20   string keyName 
1d910 3d 20 47 65 74 41 73 73 65 6d 62 6c 79 46 6f 6c  = GetAssemblyFol
1d920 64 65 72 73 4b 65 79 4e 61 6d 65 28 0d 0a 20 20  dersKeyName(..  
1d930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 72                fr
1d940 61 6d 65 77 6f 72 6b 4e 61 6d 65 2c 20 66 72 61  ameworkName, fra
1d950 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 2c 20 70  meworkVersion, p
1d960 6c 61 74 66 6f 72 6d 4e 61 6d 65 29 3b 0d 0a 0d  latformName);...
1d970 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69  .            usi
1d980 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73 74 72 79  ng (MockRegistry
1d990 4b 65 79 20 6b 65 79 20 3d 20 52 65 67 69 73 74  Key key = Regist
1d9a0 72 79 48 65 6c 70 65 72 2e 4f 70 65 6e 53 75 62  ryHelper.OpenSub
1d9b0 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20  Key(..          
1d9c0 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74 4b 65            rootKe
1d9d0 79 2c 20 6b 65 79 4e 61 6d 65 2c 20 74 72 75 65  y, keyName, true
1d9e0 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73  , whatIf, verbos
1d9f0 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e))..           
1da00 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1da10 20 20 20 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e      if (key == n
1da20 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
1da30 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
1da40 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
1da50 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d  or = String.Form
1da60 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  at(..           
1da70 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f               "co
1da80 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 72 65 67  uld not open reg
1da90 69 73 74 72 79 20 6b 65 79 3a 20 7b 30 7d 5c 5c  istry key: {0}\\
1daa0 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20  {1}",..         
1dab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1dac0 6f 6f 74 4b 65 79 2c 20 6b 65 79 4e 61 6d 65 29  ootKey, keyName)
1dad0 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
1dae0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1daf0 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20  false;..        
1db00 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1db10 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69               usi
1db20 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73 74 72 79  ng (MockRegistry
1db30 4b 65 79 20 73 75 62 4b 65 79 20 3d 20 52 65 67  Key subKey = Reg
1db40 69 73 74 72 79 48 65 6c 70 65 72 2e 43 72 65 61  istryHelper.Crea
1db50 74 65 53 75 62 4b 65 79 28 0d 0a 20 20 20 20 20  teSubKey(..     
1db60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db70 20 20 20 6b 65 79 2c 20 73 75 62 4b 65 79 4e 61     key, subKeyNa
1db80 6d 65 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62  me, whatIf, verb
1db90 6f 73 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20  ose))..         
1dba0 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
1dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1dbc0 20 28 73 75 62 4b 65 79 20 3d 3d 20 6e 75 6c 6c   (subKey == null
1dbd0 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
1dbe0 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
1dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc00 20 20 65 72 72 6f 72 20 3d 20 53 74 72 69 6e 67    error = String
1dc10 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20  .Format(..      
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc30 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74        "could not
1dc40 20 63 72 65 61 74 65 20 72 65 67 69 73 74 72 79   create registry
1dc50 20 6b 65 79 3a 20 7b 30 7d 5c 5c 7b 31 7d 22 2c   key: {0}\\{1}",
1dc60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1dc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 65                ke
1dc80 79 2c 20 73 75 62 4b 65 79 4e 61 6d 65 29 3b 0d  y, subKeyName);.
1dc90 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1dca0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1dcb0 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20  n false;..      
1dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1dcd0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1dce0 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79 48         RegistryH
1dcf0 65 6c 70 65 72 2e 53 65 74 56 61 6c 75 65 28 0d  elper.SetValue(.
1dd00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1dd10 20 20 20 20 20 20 20 20 20 73 75 62 4b 65 79 2c           subKey,
1dd20 20 6e 75 6c 6c 2c 20 64 69 72 65 63 74 6f 72 79   null, directory
1dd30 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73  , whatIf, verbos
1dd40 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e);..           
1dd50 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1dd60 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1dd70 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
1dd80 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  ;..        }....
1dd90 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
1dda0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ddb0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ddc0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ddd0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
1dde0 0a 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61  ...        priva
1ddf0 74 65 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 52  te static bool R
1de00 65 6d 6f 76 65 46 72 6f 6d 41 73 73 65 6d 62 6c  emoveFromAssembl
1de10 79 46 6f 6c 64 65 72 73 28 0d 0a 20 20 20 20 20  yFolders(..     
1de20 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79 4b         RegistryK
1de30 65 79 20 72 6f 6f 74 4b 65 79 2c 0d 0a 20 20 20  ey rootKey,..   
1de40 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
1de50 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 2c 0d 0a  frameworkName,..
1de60 20 20 20 20 20 20 20 20 20 20 20 20 56 65 72 73              Vers
1de70 69 6f 6e 20 66 72 61 6d 65 77 6f 72 6b 56 65 72  ion frameworkVer
1de80 73 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20  sion,..         
1de90 20 20 20 73 74 72 69 6e 67 20 70 6c 61 74 66 6f     string platfo
1dea0 72 6d 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20  rmName,..       
1deb0 20 20 20 20 20 73 74 72 69 6e 67 20 73 75 62 4b       string subK
1dec0 65 79 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20  eyName,..       
1ded0 20 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66       bool whatIf
1dee0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ,..            b
1def0 6f 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a 20 20  ool verbose,..  
1df00 20 20 20 20 20 20 20 20 20 20 72 65 66 20 73 74            ref st
1df10 72 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20 20 20  ring error..    
1df20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20          )..     
1df30 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
1df40 20 20 73 74 72 69 6e 67 20 6b 65 79 4e 61 6d 65    string keyName
1df50 20 3d 20 47 65 74 41 73 73 65 6d 62 6c 79 46 6f   = GetAssemblyFo
1df60 6c 64 65 72 73 4b 65 79 4e 61 6d 65 28 0d 0a 20  ldersKeyName(.. 
1df70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
1df80 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 2c 20 66 72  rameworkName, fr
1df90 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 2c 20  ameworkVersion, 
1dfa0 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 29 3b 0d 0a  platformName);..
1dfb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 73  ..            us
1dfc0 69 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73 74 72  ing (MockRegistr
1dfd0 79 4b 65 79 20 6b 65 79 20 3d 20 52 65 67 69 73  yKey key = Regis
1dfe0 74 72 79 48 65 6c 70 65 72 2e 4f 70 65 6e 53 75  tryHelper.OpenSu
1dff0 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20  bKey(..         
1e000 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74 4b             rootK
1e010 65 79 2c 20 6b 65 79 4e 61 6d 65 2c 20 66 61 6c  ey, keyName, fal
1e020 73 65 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62  se, whatIf, verb
1e030 6f 73 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20  ose))..         
1e040 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
1e050 20 20 20 20 20 20 69 66 20 28 6b 65 79 20 3d 3d        if (key ==
1e060 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
1e070 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
1e080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
1e090 72 72 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f  rror = String.Fo
1e0a0 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20  rmat(..         
1e0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1e0c0 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 72  could not open r
1e0d0 65 67 69 73 74 72 79 20 6b 65 79 3a 20 7b 30 7d  egistry key: {0}
1e0e0 5c 5c 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20  \\{1}",..       
1e0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e100 20 72 6f 6f 74 4b 65 79 2c 20 6b 65 79 4e 61 6d   rootKey, keyNam
1e110 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e);....         
1e120 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1e130 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20  n false;..      
1e140 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1e150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52                 R
1e160 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 44 65  egistryHelper.De
1e170 6c 65 74 65 53 75 62 4b 65 79 28 0d 0a 20 20 20  leteSubKey(..   
1e180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e190 20 6b 65 79 2c 20 73 75 62 4b 65 79 4e 61 6d 65   key, subKeyName
1e1a0 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73  , whatIf, verbos
1e1b0 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e);..           
1e1c0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1e1d0 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a    return true;..
1e1e0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1e1f0 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
1e200 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e210 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e220 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e230 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
1e240 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
1e250 73 74 61 74 69 63 20 62 6f 6f 6c 20 50 72 6f 63  static bool Proc
1e260 65 73 73 41 73 73 65 6d 62 6c 79 46 6f 6c 64 65  essAssemblyFolde
1e270 72 73 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rs(..           
1e280 20 52 65 67 69 73 74 72 79 4b 65 79 20 72 6f 6f   RegistryKey roo
1e290 74 4b 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20  tKey,..         
1e2a0 20 20 20 73 74 72 69 6e 67 20 66 72 61 6d 65 77     string framew
1e2b0 6f 72 6b 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20  orkName,..      
1e2c0 20 20 20 20 20 20 56 65 72 73 69 6f 6e 20 66 72        Version fr
1e2d0 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 2c 0d  ameworkVersion,.
1e2e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72  .            str
1e2f0 69 6e 67 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65  ing platformName
1e300 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  ,..            o
1e310 62 6a 65 63 74 20 63 6c 69 65 6e 74 44 61 74 61  bject clientData
1e320 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ,..            b
1e330 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20  ool whatIf,..   
1e340 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65           bool ve
1e350 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20 20  rbose,..        
1e360 20 20 20 20 72 65 66 20 73 74 72 69 6e 67 20 65      ref string e
1e370 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20  rror..          
1e380 20 20 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a    )..        {..
1e390 20 20 20 20 20 20 20 20 20 20 20 20 41 6e 79 50              AnyP
1e3a0 61 69 72 3c 73 74 72 69 6e 67 2c 20 62 6f 6f 6c  air<string, bool
1e3b0 3e 20 70 61 69 72 20 3d 20 63 6c 69 65 6e 74 44  > pair = clientD
1e3c0 61 74 61 20 61 73 20 41 6e 79 50 61 69 72 3c 73  ata as AnyPair<s
1e3d0 74 72 69 6e 67 2c 20 62 6f 6f 6c 3e 3b 0d 0a 0d  tring, bool>;...
1e3e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
1e3f0 28 70 61 69 72 20 3d 3d 20 6e 75 6c 6c 29 0d 0a  (pair == null)..
1e400 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
1e410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
1e420 72 72 6f 72 20 3d 20 22 69 6e 76 61 6c 69 64 20  rror = "invalid 
1e430 66 72 61 6d 65 77 6f 72 6b 20 63 61 6c 6c 62 61  framework callba
1e440 63 6b 20 64 61 74 61 22 3b 0d 0a 20 20 20 20 20  ck data";..     
1e450 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1e460 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20  n false;..      
1e470 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1e480 20 20 20 20 20 20 20 69 66 20 28 70 61 69 72 2e         if (pair.
1e490 59 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  Y)..            
1e4a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1e4b0 20 20 20 72 65 74 75 72 6e 20 52 65 6d 6f 76 65     return Remove
1e4c0 46 72 6f 6d 41 73 73 65 6d 62 6c 79 46 6f 6c 64  FromAssemblyFold
1e4d0 65 72 73 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ers(..          
1e4e0 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74 4b 65            rootKe
1e4f0 79 2c 20 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65  y, frameworkName
1e500 2c 20 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69  , frameworkVersi
1e510 6f 6e 2c 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65  on, platformName
1e520 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
1e530 20 20 20 20 20 20 20 4c 65 67 61 63 79 50 72 6f         LegacyPro
1e540 6a 65 63 74 4e 61 6d 65 2c 20 77 68 61 74 49 66  jectName, whatIf
1e550 2c 20 76 65 72 62 6f 73 65 2c 20 72 65 66 20 65  , verbose, ref e
1e560 72 72 6f 72 29 20 26 26 0d 0a 20 20 20 20 20 20  rror) &&..      
1e570 20 20 20 20 20 20 20 20 20 20 41 64 64 54 6f 41            AddToA
1e580 73 73 65 6d 62 6c 79 46 6f 6c 64 65 72 73 28 0d  ssemblyFolders(.
1e590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e5a0 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20 66 72       rootKey, fr
1e5b0 61 6d 65 77 6f 72 6b 4e 61 6d 65 2c 20 66 72 61  ameworkName, fra
1e5c0 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 2c 20 70  meworkVersion, p
1e5d0 6c 61 74 66 6f 72 6d 4e 61 6d 65 2c 0d 0a 20 20  latformName,..  
1e5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5f0 20 20 50 72 6f 6a 65 63 74 4e 61 6d 65 2c 20 70    ProjectName, p
1e600 61 69 72 2e 58 2c 20 77 68 61 74 49 66 2c 20 76  air.X, whatIf, v
1e610 65 72 62 6f 73 65 2c 20 72 65 66 20 65 72 72 6f  erbose, ref erro
1e620 72 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  r);..           
1e630 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1e640 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20  else..          
1e650 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
1e660 20 20 20 20 20 72 65 74 75 72 6e 20 52 65 6d 6f       return Remo
1e670 76 65 46 72 6f 6d 41 73 73 65 6d 62 6c 79 46 6f  veFromAssemblyFo
1e680 6c 64 65 72 73 28 0d 0a 20 20 20 20 20 20 20 20  lders(..        
1e690 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74              root
1e6a0 4b 65 79 2c 20 66 72 61 6d 65 77 6f 72 6b 4e 61  Key, frameworkNa
1e6b0 6d 65 2c 20 66 72 61 6d 65 77 6f 72 6b 56 65 72  me, frameworkVer
1e6c0 73 69 6f 6e 2c 20 70 6c 61 74 66 6f 72 6d 4e 61  sion, platformNa
1e6d0 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  me,..           
1e6e0 20 20 20 20 20 20 20 20 20 50 72 6f 6a 65 63 74           Project
1e6f0 4e 61 6d 65 2c 20 77 68 61 74 49 66 2c 20 76 65  Name, whatIf, ve
1e700 72 62 6f 73 65 2c 20 72 65 66 20 65 72 72 6f 72  rbose, ref error
1e710 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
1e720 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
1e730 20 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e        #endregion
1e740 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f  ....        ////
1e750 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e760 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e770 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e780 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e790 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  ///....        #
1e7a0 72 65 67 69 6f 6e 20 56 69 73 75 61 6c 20 53 74  region Visual St
1e7b0 75 64 69 6f 20 48 61 6e 64 6c 69 6e 67 0d 0a 20  udio Handling.. 
1e7c0 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73         private s
1e7d0 74 61 74 69 63 20 73 74 72 69 6e 67 20 47 65 74  tatic string Get
1e7e0 56 73 4b 65 79 4e 61 6d 65 28 0d 0a 20 20 20 20  VsKeyName(..    
1e7f0 20 20 20 20 20 20 20 20 56 65 72 73 69 6f 6e 20          Version 
1e800 76 73 56 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20  vsVersion..     
1e810 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20         )..      
1e820 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
1e830 20 72 65 74 75 72 6e 20 53 74 72 69 6e 67 2e 46   return String.F
1e840 6f 72 6d 61 74 28 22 53 6f 66 74 77 61 72 65 5c  ormat("Software\
1e850 5c 4d 69 63 72 6f 73 6f 66 74 5c 5c 56 69 73 75  \Microsoft\\Visu
1e860 61 6c 53 74 75 64 69 6f 5c 5c 7b 30 7d 22 2c 0d  alStudio\\{0}",.
1e870 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e880 20 76 73 56 65 72 73 69 6f 6e 29 3b 0d 0a 20 20   vsVersion);..  
1e890 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1e8a0 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
1e8b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e8c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e8d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e8e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
1e8f0 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 56 69        #region Vi
1e900 73 75 61 6c 20 53 74 75 64 69 6f 20 44 61 74 61  sual Studio Data
1e910 20 53 6f 75 72 63 65 20 48 61 6e 64 6c 69 6e 67   Source Handling
1e920 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74  ..        privat
1e930 65 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 41 64  e static bool Ad
1e940 64 56 73 44 61 74 61 53 6f 75 72 63 65 28 0d 0a  dVsDataSource(..
1e950 20 20 20 20 20 20 20 20 20 20 20 20 52 65 67 69              Regi
1e960 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b 65 79 2c  stryKey rootKey,
1e970 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 65  ..            Ve
1e980 72 73 69 6f 6e 20 76 73 56 65 72 73 69 6f 6e 2c  rsion vsVersion,
1e990 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 47 75  ..            Gu
1e9a0 69 64 20 64 61 74 61 53 6f 75 72 63 65 49 64 2c  id dataSourceId,
1e9b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 47 75  ..            Gu
1e9c0 69 64 20 64 61 74 61 50 72 6f 76 69 64 65 72 49  id dataProviderI
1e9d0 64 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d,..            
1e9e0 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20  bool whatIf,..  
1e9f0 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 76            bool v
1ea00 65 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20  erbose,..       
1ea10 20 20 20 20 20 72 65 66 20 73 74 72 69 6e 67 20       ref string 
1ea20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20  error..         
1ea30 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d     )..        {.
1ea40 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72  .            str
1ea50 69 6e 67 20 6b 65 79 4e 61 6d 65 20 3d 20 47 65  ing keyName = Ge
1ea60 74 56 73 4b 65 79 4e 61 6d 65 28 76 73 56 65 72  tVsKeyName(vsVer
1ea70 73 69 6f 6e 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  sion);....      
1ea80 20 20 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63        using (Moc
1ea90 6b 52 65 67 69 73 74 72 79 4b 65 79 20 6b 65 79  kRegistryKey key
1eaa0 20 3d 20 52 65 67 69 73 74 72 79 48 65 6c 70 65   = RegistryHelpe
1eab0 72 2e 4f 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20  r.OpenSubKey(.. 
1eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ead0 20 20 20 72 6f 6f 74 4b 65 79 2c 20 6b 65 79 4e     rootKey, keyN
1eae0 61 6d 65 2c 20 66 61 6c 73 65 2c 20 77 68 61 74  ame, false, what
1eaf0 49 66 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a 20  If, verbose)).. 
1eb00 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
1eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1eb20 20 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a   (key == null)..
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb40 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1eb50 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 53         error = S
1eb60 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20  tring.Format(.. 
1eb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb80 20 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f         "could no
1eb90 74 20 6f 70 65 6e 20 72 65 67 69 73 74 72 79 20  t open registry 
1eba0 6b 65 79 3a 20 7b 30 7d 5c 5c 7b 31 7d 22 2c 0d  key: {0}\\{1}",.
1ebb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ebc0 20 20 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79           rootKey
1ebd0 2c 20 6b 65 79 4e 61 6d 65 29 3b 0d 0a 0d 0a 20  , keyName);.... 
1ebe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebf0 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
1ec00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ec10 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1ec20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 4d 6f         using (Mo
1ec30 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20 73 75  ckRegistryKey su
1ec40 62 4b 65 79 20 3d 20 52 65 67 69 73 74 72 79 48  bKey = RegistryH
1ec50 65 6c 70 65 72 2e 4f 70 65 6e 53 75 62 4b 65 79  elper.OpenSubKey
1ec60 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
1ec70 20 20 20 20 20 20 20 20 20 20 20 6b 65 79 2c 20             key, 
1ec80 22 44 61 74 61 53 6f 75 72 63 65 73 22 2c 20 74  "DataSources", t
1ec90 72 75 65 2c 20 77 68 61 74 49 66 2c 20 76 65 72  rue, whatIf, ver
1eca0 62 6f 73 65 29 29 0d 0a 20 20 20 20 20 20 20 20  bose))..        
1ecb0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
1ecc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1ecd0 66 20 28 73 75 62 4b 65 79 20 3d 3d 20 6e 75 6c  f (subKey == nul
1ece0 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
1ecf0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
1ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed10 20 20 20 65 72 72 6f 72 20 3d 20 53 74 72 69 6e     error = Strin
1ed20 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20  g.Format(..     
1ed30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed40 20 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f         "could no
1ed50 74 20 6f 70 65 6e 20 72 65 67 69 73 74 72 79 20  t open registry 
1ed60 6b 65 79 3a 20 7b 30 7d 5c 5c 44 61 74 61 53 6f  key: {0}\\DataSo
1ed70 75 72 63 65 73 22 2c 0d 0a 20 20 20 20 20 20 20  urces",..       
1ed80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed90 20 20 20 20 20 6b 65 79 29 3b 0d 0a 0d 0a 20 20       key);....  
1eda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
1edc0 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se;..           
1edd0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1ede0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edf0 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52 65 67    using (MockReg
1ee00 69 73 74 72 79 4b 65 79 20 64 61 74 61 53 6f 75  istryKey dataSou
1ee10 72 63 65 4b 65 79 20 3d 20 52 65 67 69 73 74 72  rceKey = Registr
1ee20 79 48 65 6c 70 65 72 2e 43 72 65 61 74 65 53 75  yHelper.CreateSu
1ee30 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20  bKey(..         
1ee40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee50 20 20 20 73 75 62 4b 65 79 2c 20 64 61 74 61 53     subKey, dataS
1ee60 6f 75 72 63 65 49 64 2e 54 6f 53 74 72 69 6e 67  ourceId.ToString
1ee70 28 56 73 49 64 46 6f 72 6d 61 74 29 2c 20 77 68  (VsIdFormat), wh
1ee80 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20  atIf,..         
1ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eea0 20 20 20 76 65 72 62 6f 73 65 29 29 0d 0a 20 20     verbose))..  
1eeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eec0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
1eed0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1eee0 28 64 61 74 61 53 6f 75 72 63 65 4b 65 79 20 3d  (dataSourceKey =
1eef0 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
1ef00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef10 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1ef20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef30 65 72 72 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46  error = String.F
1ef40 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20  ormat(..        
1ef50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef60 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e          "could n
1ef70 6f 74 20 63 72 65 61 74 65 20 72 65 67 69 73 74  ot create regist
1ef80 72 79 20 6b 65 79 3a 20 7b 30 7d 5c 5c 7b 31 7d  ry key: {0}\\{1}
1ef90 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ",..            
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efb0 20 20 20 20 6b 65 79 2c 20 64 61 74 61 53 6f 75      key, dataSou
1efc0 72 63 65 49 64 2e 54 6f 53 74 72 69 6e 67 28 56  rceId.ToString(V
1efd0 73 49 64 46 6f 72 6d 61 74 29 29 3b 0d 0a 0d 0a  sIdFormat));....
1efe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eff0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1f000 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20  rn false;..     
1f010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f020 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1f030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f040 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 53  RegistryHelper.S
1f050 65 74 56 61 6c 75 65 28 0d 0a 20 20 20 20 20 20  etValue(..      
1f060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f070 20 20 20 20 20 20 64 61 74 61 53 6f 75 72 63 65        dataSource
1f080 4b 65 79 2c 20 6e 75 6c 6c 2c 20 53 74 72 69 6e  Key, null, Strin
1f090 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20  g.Format(..     
1f0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0b0 20 20 20 20 20 20 20 22 7b 30 7d 20 44 61 74 61         "{0} Data
1f0c0 62 61 73 65 20 46 69 6c 65 22 2c 20 50 72 6f 6a  base File", Proj
1f0d0 65 63 74 4e 61 6d 65 29 2c 20 77 68 61 74 49 66  ectName), whatIf
1f0e0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
1f0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76                 v
1f100 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20 20  erbose);....    
1f110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f120 20 20 20 20 52 65 67 69 73 74 72 79 48 65 6c 70      RegistryHelp
1f130 65 72 2e 43 72 65 61 74 65 53 75 62 4b 65 79 28  er.CreateSubKey(
1f140 64 61 74 61 53 6f 75 72 63 65 4b 65 79 2c 0d 0a  dataSourceKey,..
1f150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f160 20 20 20 20 20 20 20 20 20 20 20 20 53 74 72 69              Stri
1f170 6e 67 2e 46 6f 72 6d 61 74 28 22 53 75 70 70 6f  ng.Format("Suppo
1f180 72 74 69 6e 67 50 72 6f 76 69 64 65 72 73 5c 5c  rtingProviders\\
1f190 7b 30 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20  {0}",..         
1f1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1b0 20 20 20 64 61 74 61 50 72 6f 76 69 64 65 72 49     dataProviderI
1f1c0 64 2e 54 6f 53 74 72 69 6e 67 28 56 73 49 64 46  d.ToString(VsIdF
1f1d0 6f 72 6d 61 74 29 29 2c 20 77 68 61 74 49 66 2c  ormat)), whatIf,
1f1e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 65                ve
1f200 72 62 6f 73 65 29 3b 0d 0a 20 20 20 20 20 20 20  rbose);..       
1f210 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
1f220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f230 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
1f240 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1f250 72 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a 20 20  return true;..  
1f260 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1f270 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
1f280 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1f290 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1f2a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1f2b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
1f2c0 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74        private st
1f2d0 61 74 69 63 20 62 6f 6f 6c 20 52 65 6d 6f 76 65  atic bool Remove
1f2e0 56 73 44 61 74 61 53 6f 75 72 63 65 28 0d 0a 20  VsDataSource(.. 
1f2f0 20 20 20 20 20 20 20 20 20 20 20 52 65 67 69 73             Regis
1f300 74 72 79 4b 65 79 20 72 6f 6f 74 4b 65 79 2c 0d  tryKey rootKey,.
1f310 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 65 72  .            Ver
1f320 73 69 6f 6e 20 76 73 56 65 72 73 69 6f 6e 2c 0d  sion vsVersion,.
1f330 0a 20 20 20 20 20 20 20 20 20 20 20 20 47 75 69  .            Gui
1f340 64 20 64 61 74 61 53 6f 75 72 63 65 49 64 2c 0d  d dataSourceId,.
1f350 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f  .            boo
1f360 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20  l whatIf,..     
1f370 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62         bool verb
1f380 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ose,..          
1f390 20 20 72 65 66 20 73 74 72 69 6e 67 20 65 72 72    ref string err
1f3a0 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  or..            
1f3b0 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  )..        {..  
1f3c0 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
1f3d0 20 6b 65 79 4e 61 6d 65 20 3d 20 47 65 74 56 73   keyName = GetVs
1f3e0 4b 65 79 4e 61 6d 65 28 76 73 56 65 72 73 69 6f  KeyName(vsVersio
1f3f0 6e 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  n);....         
1f400 20 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52 65     using (MockRe
1f410 67 69 73 74 72 79 4b 65 79 20 6b 65 79 20 3d 20  gistryKey key = 
1f420 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 4f  RegistryHelper.O
1f430 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20 20 20  penSubKey(..    
1f440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f450 72 6f 6f 74 4b 65 79 2c 20 6b 65 79 4e 61 6d 65  rootKey, keyName
1f460 2c 20 66 61 6c 73 65 2c 20 77 68 61 74 49 66 2c  , false, whatIf,
1f470 20 76 65 72 62 6f 73 65 29 29 0d 0a 20 20 20 20   verbose))..    
1f480 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
1f490 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6b             if (k
1f4a0 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  ey == null)..   
1f4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
1f4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4d0 20 20 20 20 65 72 72 6f 72 20 3d 20 53 74 72 69      error = Stri
1f4e0 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20  ng.Format(..    
1f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f500 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 6f      "could not o
1f510 70 65 6e 20 72 65 67 69 73 74 72 79 20 6b 65 79  pen registry key
1f520 3a 20 7b 30 7d 5c 5c 7b 31 7d 22 2c 0d 0a 20 20  : {0}\\{1}",..  
1f530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f540 20 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20 6b        rootKey, k
1f550 65 79 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20  eyName);....    
1f560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f570 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20  return false;.. 
1f580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1f590 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1f5a0 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52      using (MockR
1f5b0 65 67 69 73 74 72 79 4b 65 79 20 73 75 62 4b 65  egistryKey subKe
1f5c0 79 20 3d 20 52 65 67 69 73 74 72 79 48 65 6c 70  y = RegistryHelp
1f5d0 65 72 2e 4f 70 65 6e 53 75 62 4b 65 79 28 0d 0a  er.OpenSubKey(..
1f5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5f0 20 20 20 20 20 20 20 20 6b 65 79 2c 20 22 44 61          key, "Da
1f600 74 61 53 6f 75 72 63 65 73 22 2c 20 74 72 75 65  taSources", true
1f610 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73  , whatIf, verbos
1f620 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e))..           
1f630 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1f640 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
1f650 73 75 62 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d  subKey == null).
1f660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f670 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1f680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f690 65 72 72 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46  error = String.F
1f6a0 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20  ormat(..        
1f6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6c0 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 6f      "could not o
1f6d0 70 65 6e 20 72 65 67 69 73 74 72 79 20 6b 65 79  pen registry key
1f6e0 3a 20 7b 30 7d 5c 5c 44 61 74 61 53 6f 75 72 63  : {0}\\DataSourc
1f6f0 65 73 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  es",..          
1f700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f710 20 20 6b 65 79 29 3b 0d 0a 0d 0a 20 20 20 20 20    key);....     
1f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f730 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
1f740 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f750 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1f760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52                 R
1f770 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 44 65  egistryHelper.De
1f780 6c 65 74 65 53 75 62 4b 65 79 54 72 65 65 28 0d  leteSubKeyTree(.
1f790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f7a0 20 20 20 20 20 20 20 20 20 73 75 62 4b 65 79 2c           subKey,
1f7b0 20 64 61 74 61 53 6f 75 72 63 65 49 64 2e 54 6f   dataSourceId.To
1f7c0 53 74 72 69 6e 67 28 56 73 49 64 46 6f 72 6d 61  String(VsIdForma
1f7d0 74 29 2c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20  t), whatIf,..   
1f7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7f0 20 20 20 20 20 76 65 72 62 6f 73 65 29 3b 0d 0a       verbose);..
1f800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f810 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
1f820 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1f830 72 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a 20 20  return true;..  
1f840 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1f850 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
1f860 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1f870 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1f880 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1f890 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
1f8a0 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74        private st
1f8b0 61 74 69 63 20 62 6f 6f 6c 20 50 72 6f 63 65 73  atic bool Proces
1f8c0 73 56 73 44 61 74 61 53 6f 75 72 63 65 28 0d 0a  sVsDataSource(..
1f8d0 20 20 20 20 20 20 20 20 20 20 20 20 52 65 67 69              Regi
1f8e0 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b 65 79 2c  stryKey rootKey,
1f8f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 65  ..            Ve
1f900 72 73 69 6f 6e 20 76 73 56 65 72 73 69 6f 6e 2c  rsion vsVersion,
1f910 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 47 75  ..            Gu
1f920 69 64 20 70 61 63 6b 61 67 65 49 64 2c 20 2f 2a  id packageId, /*
1f930 20 4e 4f 54 20 55 53 45 44 20 2a 2f 0d 0a 20 20   NOT USED */..  
1f940 20 20 20 20 20 20 20 20 20 20 47 75 69 64 20 73            Guid s
1f950 65 72 76 69 63 65 49 64 2c 20 2f 2a 20 4e 4f 54  erviceId, /* NOT
1f960 20 55 53 45 44 20 2a 2f 0d 0a 20 20 20 20 20 20   USED */..      
1f970 20 20 20 20 20 20 47 75 69 64 20 64 61 74 61 53        Guid dataS
1f980 6f 75 72 63 65 49 64 2c 0d 0a 20 20 20 20 20 20  ourceId,..      
1f990 20 20 20 20 20 20 47 75 69 64 20 64 61 74 61 50        Guid dataP
1f9a0 72 6f 76 69 64 65 72 49 64 2c 0d 0a 20 20 20 20  roviderId,..    
1f9b0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 63          object c
1f9c0 6c 69 65 6e 74 44 61 74 61 2c 0d 0a 20 20 20 20  lientData,..    
1f9d0 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61          bool wha
1f9e0 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  tIf,..          
1f9f0 20 20 62 6f 6f 6c 20 76 65 72 62 6f 73 65 2c 0d    bool verbose,.
1fa00 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 66  .            ref
1fa10 20 73 74 72 69 6e 67 20 65 72 72 6f 72 0d 0a 20   string error.. 
1fa20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20             )..  
1fa30 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
1fa40 20 20 20 20 20 41 6e 79 50 61 69 72 3c 73 74 72       AnyPair<str
1fa50 69 6e 67 2c 20 62 6f 6f 6c 3e 20 70 61 69 72 20  ing, bool> pair 
1fa60 3d 20 63 6c 69 65 6e 74 44 61 74 61 20 61 73 20  = clientData as 
1fa70 41 6e 79 50 61 69 72 3c 73 74 72 69 6e 67 2c 20  AnyPair<string, 
1fa80 62 6f 6f 6c 3e 3b 0d 0a 0d 0a 20 20 20 20 20 20  bool>;....      
1fa90 20 20 20 20 20 20 69 66 20 28 70 61 69 72 20 3d        if (pair =
1faa0 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
1fab0 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1fac0 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20          error = 
1fad0 22 69 6e 76 61 6c 69 64 20 56 53 20 63 61 6c 6c  "invalid VS call
1fae0 62 61 63 6b 20 64 61 74 61 22 3b 0d 0a 20 20 20  back data";..   
1faf0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
1fb00 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20  urn false;..    
1fb10 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1fb20 20 20 20 20 20 20 20 20 20 69 66 20 28 70 61 69           if (pai
1fb30 72 2e 59 29 0d 0a 20 20 20 20 20 20 20 20 20 20  r.Y)..          
1fb40 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
1fb50 20 20 20 20 20 72 65 74 75 72 6e 20 41 64 64 56       return AddV
1fb60 73 44 61 74 61 53 6f 75 72 63 65 28 0d 0a 20 20  sDataSource(..  
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb80 20 20 72 6f 6f 74 4b 65 79 2c 20 76 73 56 65 72    rootKey, vsVer
1fb90 73 69 6f 6e 2c 20 64 61 74 61 53 6f 75 72 63 65  sion, dataSource
1fba0 49 64 2c 20 64 61 74 61 50 72 6f 76 69 64 65 72  Id, dataProvider
1fbb0 49 64 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  Id,..           
1fbc0 20 20 20 20 20 20 20 20 20 77 68 61 74 49 66 2c           whatIf,
1fbd0 20 76 65 72 62 6f 73 65 2c 20 72 65 66 20 65 72   verbose, ref er
1fbe0 72 6f 72 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ror);..         
1fbf0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1fc00 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20    else..        
1fc10 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
1fc20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 52 65         return Re
1fc30 6d 6f 76 65 56 73 44 61 74 61 53 6f 75 72 63 65  moveVsDataSource
1fc40 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
1fc50 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20         rootKey, 
1fc60 76 73 56 65 72 73 69 6f 6e 2c 20 64 61 74 61 53  vsVersion, dataS
1fc70 6f 75 72 63 65 49 64 2c 20 77 68 61 74 49 66 2c  ourceId, whatIf,
1fc80 20 76 65 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20   verbose,..     
1fc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1fca0 65 66 20 65 72 72 6f 72 29 3b 0d 0a 20 20 20 20  ef error);..    
1fcb0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1fcc0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 23 65     }..        #e
1fcd0 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20  ndregion....    
1fce0 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
1fcf0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1fd00 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1fd10 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1fd20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
1fd30 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 56         #region V
1fd40 69 73 75 61 6c 20 53 74 75 64 69 6f 20 44 61 74  isual Studio Dat
1fd50 61 20 50 72 6f 76 69 64 65 72 20 48 61 6e 64 6c  a Provider Handl
1fd60 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 70 72 69  ing..        pri
1fd70 76 61 74 65 20 73 74 61 74 69 63 20 62 6f 6f 6c  vate static bool
1fd80 20 41 64 64 56 73 44 61 74 61 50 72 6f 76 69 64   AddVsDataProvid
1fd90 65 72 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  er(..           
1fda0 20 52 65 67 69 73 74 72 79 4b 65 79 20 72 6f 6f   RegistryKey roo
1fdb0 74 4b 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20  tKey,..         
1fdc0 20 20 20 56 65 72 73 69 6f 6e 20 76 73 56 65 72     Version vsVer
1fdd0 73 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20  sion,..         
1fde0 20 20 20 47 75 69 64 20 73 65 72 76 69 63 65 49     Guid serviceI
1fdf0 64 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d,..            
1fe00 47 75 69 64 20 64 61 74 61 50 72 6f 76 69 64 65  Guid dataProvide
1fe10 72 49 64 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  rId,..          
1fe20 20 20 73 74 72 69 6e 67 20 66 69 6c 65 4e 61 6d    string fileNam
1fe30 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e,..            
1fe40 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20  bool whatIf,..  
1fe50 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 76            bool v
1fe60 65 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20  erbose,..       
1fe70 20 20 20 20 20 72 65 66 20 73 74 72 69 6e 67 20       ref string 
1fe80 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20  error..         
1fe90 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d     )..        {.
1fea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
1feb0 28 76 73 41 64 6f 4e 65 74 54 65 63 68 6e 6f 6c  (vsAdoNetTechnol
1fec0 6f 67 79 49 64 20 3d 3d 20 6e 75 6c 6c 29 0d 0a  ogyId == null)..
1fed0 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
1fee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
1fef0 72 72 6f 72 20 3d 20 22 69 6e 76 61 6c 69 64 20  rror = "invalid 
1ff00 41 44 4f 2e 4e 45 54 20 74 65 63 68 6e 6f 6c 6f  ADO.NET technolo
1ff10 67 79 20 49 64 22 3b 0d 0a 20 20 20 20 20 20 20  gy Id";..       
1ff20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1ff30 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20  false;..        
1ff40 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1ff50 20 20 20 20 20 73 74 72 69 6e 67 20 6b 65 79 4e       string keyN
1ff60 61 6d 65 20 3d 20 47 65 74 56 73 4b 65 79 4e 61  ame = GetVsKeyNa
1ff70 6d 65 28 76 73 56 65 72 73 69 6f 6e 29 3b 0d 0a  me(vsVersion);..
1ff80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 73  ..            us
1ff90 69 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73 74 72  ing (MockRegistr
1ffa0 79 4b 65 79 20 6b 65 79 20 3d 20 52 65 67 69 73  yKey key = Regis
1ffb0 74 72 79 48 65 6c 70 65 72 2e 4f 70 65 6e 53 75  tryHelper.OpenSu
1ffc0 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20  bKey(..         
1ffd0 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74 4b             rootK
1ffe0 65 79 2c 20 6b 65 79 4e 61 6d 65 2c 20 66 61 6c  ey, keyName, fal
1fff0 73 65 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62  se, whatIf, verb
20000 6f 73 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20  ose))..         
20010 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
20020 20 20 20 20 20 20 69 66 20 28 6b 65 79 20 3d 3d        if (key ==
20030 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
20040 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
20050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
20060 72 72 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f  rror = String.Fo
20070 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20  rmat(..         
20080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
20090 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 72  could not open r
200a0 65 67 69 73 74 72 79 20 6b 65 79 3a 20 7b 30 7d  egistry key: {0}
200b0 5c 5c 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20  \\{1}",..       
200c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200d0 20 72 6f 6f 74 4b 65 79 2c 20 6b 65 79 4e 61 6d   rootKey, keyNam
200e0 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e);....         
200f0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
20100 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20  n false;..      
20110 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
20120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
20130 73 69 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73 74  sing (MockRegist
20140 72 79 4b 65 79 20 73 75 62 4b 65 79 20 3d 20 52  ryKey subKey = R
20150 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 4f 70  egistryHelper.Op
20160 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20 20 20 20  enSubKey(..     
20170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20180 20 20 20 6b 65 79 2c 20 22 44 61 74 61 50 72 6f     key, "DataPro
20190 76 69 64 65 72 73 22 2c 20 74 72 75 65 2c 20 77  viders", true, w
201a0 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29 29  hatIf, verbose))
201b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
201c0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
201d0 20 20 20 20 20 20 20 20 20 69 66 20 28 73 75 62           if (sub
201e0 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  Key == null)..  
201f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20200 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
20210 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
20220 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d  or = String.Form
20230 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  at(..           
20240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20250 20 22 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e   "could not open
20260 20 72 65 67 69 73 74 72 79 20 6b 65 79 3a 20 7b   registry key: {
20270 30 7d 5c 5c 44 61 74 61 50 72 6f 76 69 64 65 72  0}\\DataProvider
20280 73 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s",..           
20290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202a0 20 6b 65 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20   key);....      
202b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202c0 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d    return false;.
202d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
202e0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
202f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73                us
20300 69 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73 74 72  ing (MockRegistr
20310 79 4b 65 79 20 64 61 74 61 50 72 6f 76 69 64 65  yKey dataProvide
20320 72 4b 65 79 20 3d 20 52 65 67 69 73 74 72 79 48  rKey = RegistryH
20330 65 6c 70 65 72 2e 43 72 65 61 74 65 53 75 62 4b  elper.CreateSubK
20340 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ey(..           
20350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20360 20 73 75 62 4b 65 79 2c 20 64 61 74 61 50 72 6f   subKey, dataPro
20370 76 69 64 65 72 49 64 2e 54 6f 53 74 72 69 6e 67  viderId.ToString
20380 28 56 73 49 64 46 6f 72 6d 61 74 29 2c 20 77 68  (VsIdFormat), wh
20390 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20  atIf,..         
203a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203b0 20 20 20 76 65 72 62 6f 73 65 29 29 0d 0a 20 20     verbose))..  
203c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203d0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
203e0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
203f0 28 64 61 74 61 50 72 6f 76 69 64 65 72 4b 65 79  (dataProviderKey
20400 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
20410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20420 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
20430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20440 20 20 65 72 72 6f 72 20 3d 20 53 74 72 69 6e 67    error = String
20450 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20  .Format(..      
20460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20470 20 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64            "could
20480 20 6e 6f 74 20 63 72 65 61 74 65 20 72 65 67 69   not create regi
20490 73 74 72 79 20 6b 65 79 3a 20 7b 30 7d 5c 5c 7b  stry key: {0}\\{
204a0 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  1}",..          
204b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204c0 20 20 20 20 20 20 6b 65 79 2c 20 64 61 74 61 50        key, dataP
204d0 72 6f 76 69 64 65 72 49 64 2e 54 6f 53 74 72 69  roviderId.ToStri
204e0 6e 67 28 56 73 49 64 46 6f 72 6d 61 74 29 29 3b  ng(VsIdFormat));
204f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
20500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20510 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20  return false;.. 
20520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20530 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
20540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20550 20 20 20 20 52 65 67 69 73 74 72 79 48 65 6c 70      RegistryHelp
20560 65 72 2e 53 65 74 56 61 6c 75 65 28 0d 0a 20 20  er.SetValue(..  
20570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20580 20 20 20 20 20 20 20 20 20 20 64 61 74 61 50 72            dataPr
20590 6f 76 69 64 65 72 4b 65 79 2c 20 6e 75 6c 6c 2c  oviderKey, null,
205a0 20 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 77 68   Description, wh
205b0 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20  atIf,..         
205c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205d0 20 20 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a     verbose);....
205e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205f0 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79          Registry
20600 48 65 6c 70 65 72 2e 53 65 74 56 61 6c 75 65 28  Helper.SetValue(
20610 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
20630 74 61 50 72 6f 76 69 64 65 72 4b 65 79 2c 20 22  taProviderKey, "
20640 49 6e 76 61 72 69 61 6e 74 4e 61 6d 65 22 2c 20  InvariantName", 
20650 49 6e 76 61 72 69 61 6e 74 4e 61 6d 65 2c 0d 0a  InvariantName,..
20660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20670 20 20 20 20 20 20 20 20 20 20 20 20 77 68 61 74              what
20680 49 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d  If, verbose);...
20690 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
206a0 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72           Registr
206b0 79 48 65 6c 70 65 72 2e 53 65 74 56 61 6c 75 65  yHelper.SetValue
206c0 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
206d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
206e0 61 74 61 50 72 6f 76 69 64 65 72 4b 65 79 2c 20  ataProviderKey, 
206f0 22 54 65 63 68 6e 6f 6c 6f 67 79 22 2c 0d 0a 20  "Technology",.. 
20700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20710 20 20 20 20 20 20 20 20 20 20 20 28 28 47 75 69             ((Gui
20720 64 29 76 73 41 64 6f 4e 65 74 54 65 63 68 6e 6f  d)vsAdoNetTechno
20730 6c 6f 67 79 49 64 29 2e 54 6f 53 74 72 69 6e 67  logyId).ToString
20740 28 56 73 49 64 46 6f 72 6d 61 74 29 2c 0d 0a 20  (VsIdFormat),.. 
20750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20760 20 20 20 20 20 20 20 20 20 20 20 77 68 61 74 49             whatI
20770 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a  f, verbose);....
20780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20790 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79          Registry
207a0 48 65 6c 70 65 72 2e 53 65 74 56 61 6c 75 65 28  Helper.SetValue(
207b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
207c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
207d0 74 61 50 72 6f 76 69 64 65 72 4b 65 79 2c 20 22  taProviderKey, "
207e0 43 6f 64 65 42 61 73 65 22 2c 20 66 69 6c 65 4e  CodeBase", fileN
207f0 61 6d 65 2c 20 77 68 61 74 49 66 2c 0d 0a 20 20  ame, whatIf,..  
20800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20810 20 20 20 20 20 20 20 20 20 20 76 65 72 62 6f 73            verbos
20820 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e);....         
20830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52                 R
20840 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 53 65  egistryHelper.Se
20850 74 56 61 6c 75 65 28 0d 0a 20 20 20 20 20 20 20  tValue(..       
20860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20870 20 20 20 20 20 64 61 74 61 50 72 6f 76 69 64 65       dataProvide
20880 72 4b 65 79 2c 20 22 46 61 63 74 6f 72 79 53 65  rKey, "FactorySe
20890 72 76 69 63 65 22 2c 0d 0a 20 20 20 20 20 20 20  rvice",..       
208a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208b0 20 20 20 20 20 73 65 72 76 69 63 65 49 64 2e 54       serviceId.T
208c0 6f 53 74 72 69 6e 67 28 56 73 49 64 46 6f 72 6d  oString(VsIdForm
208d0 61 74 29 2c 20 77 68 61 74 49 66 2c 20 76 65 72  at), whatIf, ver
208e0 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  bose);....      
208f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20900 20 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72    RegistryHelper
20910 2e 43 72 65 61 74 65 53 75 62 4b 65 79 28 64 61  .CreateSubKey(da
20920 74 61 50 72 6f 76 69 64 65 72 4b 65 79 2c 0d 0a  taProviderKey,..
20930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20940 20 20 20 20 20 20 20 20 20 20 20 20 22 53 75 70              "Sup
20950 70 6f 72 74 65 64 4f 62 6a 65 63 74 73 5c 5c 44  portedObjects\\D
20960 61 74 61 43 6f 6e 6e 65 63 74 69 6f 6e 55 49 43  ataConnectionUIC
20970 6f 6e 74 72 6f 6c 22 2c 0d 0a 20 20 20 20 20 20  ontrol",..      
20980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20990 20 20 20 20 20 20 77 68 61 74 49 66 2c 20 76 65        whatIf, ve
209a0 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20 20 20  rbose);....     
209b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209c0 20 20 20 52 65 67 69 73 74 72 79 48 65 6c 70 65     RegistryHelpe
209d0 72 2e 43 72 65 61 74 65 53 75 62 4b 65 79 28 64  r.CreateSubKey(d
209e0 61 74 61 50 72 6f 76 69 64 65 72 4b 65 79 2c 0d  ataProviderKey,.
209f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20a00 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 75               "Su
20a10 70 70 6f 72 74 65 64 4f 62 6a 65 63 74 73 5c 5c  pportedObjects\\
20a20 44 61 74 61 43 6f 6e 6e 65 63 74 69 6f 6e 50 72  DataConnectionPr
20a30 6f 70 65 72 74 69 65 73 22 2c 0d 0a 20 20 20 20  operties",..    
20a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a50 20 20 20 20 20 20 20 20 77 68 61 74 49 66 2c 20          whatIf, 
20a60 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20  verbose);....   
20a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a80 20 20 20 20 20 52 65 67 69 73 74 72 79 48 65 6c       RegistryHel
20a90 70 65 72 2e 43 72 65 61 74 65 53 75 62 4b 65 79  per.CreateSubKey
20aa0 28 64 61 74 61 50 72 6f 76 69 64 65 72 4b 65 79  (dataProviderKey
20ab0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
20ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
20ad0 53 75 70 70 6f 72 74 65 64 4f 62 6a 65 63 74 73  SupportedObjects
20ae0 5c 5c 44 61 74 61 43 6f 6e 6e 65 63 74 69 6f 6e  \\DataConnection
20af0 53 75 70 70 6f 72 74 22 2c 20 77 68 61 74 49 66  Support", whatIf
20b00 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
20b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76                 v
20b20 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20 20  erbose);....    
20b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b40 20 20 20 20 52 65 67 69 73 74 72 79 48 65 6c 70      RegistryHelp
20b50 65 72 2e 43 72 65 61 74 65 53 75 62 4b 65 79 28  er.CreateSubKey(
20b60 64 61 74 61 50 72 6f 76 69 64 65 72 4b 65 79 2c  dataProviderKey,
20b70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
20b90 75 70 70 6f 72 74 65 64 4f 62 6a 65 63 74 73 5c  upportedObjects\
20ba0 5c 44 61 74 61 4f 62 6a 65 63 74 53 75 70 70 6f  \DataObjectSuppo
20bb0 72 74 22 2c 20 77 68 61 74 49 66 2c 0d 0a 20 20  rt", whatIf,..  
20bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20bd0 20 20 20 20 20 20 20 20 20 20 76 65 72 62 6f 73            verbos
20be0 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e);....         
20bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52                 R
20c00 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 43 72  egistryHelper.Cr
20c10 65 61 74 65 53 75 62 4b 65 79 28 64 61 74 61 50  eateSubKey(dataP
20c20 72 6f 76 69 64 65 72 4b 65 79 2c 0d 0a 20 20 20  roviderKey,..   
20c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c40 20 20 20 20 20 20 20 20 20 22 53 75 70 70 6f 72           "Suppor
20c50 74 65 64 4f 62 6a 65 63 74 73 5c 5c 44 61 74 61  tedObjects\\Data
20c60 56 69 65 77 53 75 70 70 6f 72 74 22 2c 20 77 68  ViewSupport", wh
20c70 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20  atIf,..         
20c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c90 20 20 20 76 65 72 62 6f 73 65 29 3b 0d 0a 20 20     verbose);..  
20ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cb0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
20cc0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
20cd0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
20ce0 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
20cf0 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  ;..        }....
20d00 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
20d10 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
20d20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
20d30 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
20d40 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
20d50 0a 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61  ...        priva
20d60 74 65 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 52  te static bool R
20d70 65 6d 6f 76 65 56 73 44 61 74 61 50 72 6f 76 69  emoveVsDataProvi
20d80 64 65 72 28 0d 0a 20 20 20 20 20 20 20 20 20 20  der(..          
20d90 20 20 52 65 67 69 73 74 72 79 4b 65 79 20 72 6f    RegistryKey ro
20da0 6f 74 4b 65 79 2c 0d 0a 20 20 20 20 20 20 20 20  otKey,..        
20db0 20 20 20 20 56 65 72 73 69 6f 6e 20 76 73 56 65      Version vsVe
20dc0 72 73 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20  rsion,..        
20dd0 20 20 20 20 47 75 69 64 20 64 61 74 61 50 72 6f      Guid dataPro
20de0 76 69 64 65 72 49 64 2c 0d 0a 20 20 20 20 20 20  viderId,..      
20df0 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49        bool whatI
20e00 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  f,..            
20e10 62 6f 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a 20  bool verbose,.. 
20e20 20 20 20 20 20 20 20 20 20 20 20 72 65 66 20 73             ref s
20e30 74 72 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20 20  tring error..   
20e40 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20           )..    
20e50 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
20e60 20 20 20 73 74 72 69 6e 67 20 6b 65 79 4e 61 6d     string keyNam
20e70 65 20 3d 20 47 65 74 56 73 4b 65 79 4e 61 6d 65  e = GetVsKeyName
20e80 28 76 73 56 65 72 73 69 6f 6e 29 3b 0d 0a 0d 0a  (vsVersion);....
20e90 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e              usin
20ea0 67 20 28 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b  g (MockRegistryK
20eb0 65 79 20 6b 65 79 20 3d 20 52 65 67 69 73 74 72  ey key = Registr
20ec0 79 48 65 6c 70 65 72 2e 4f 70 65 6e 53 75 62 4b  yHelper.OpenSubK
20ed0 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ey(..           
20ee0 20 20 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79           rootKey
20ef0 2c 20 6b 65 79 4e 61 6d 65 2c 20 66 61 6c 73 65  , keyName, false
20f00 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73  , whatIf, verbos
20f10 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e))..           
20f20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
20f30 20 20 20 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e      if (key == n
20f40 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
20f50 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
20f60 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
20f70 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d  or = String.Form
20f80 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  at(..           
20f90 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f               "co
20fa0 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 72 65 67  uld not open reg
20fb0 69 73 74 72 79 20 6b 65 79 3a 20 7b 30 7d 5c 5c  istry key: {0}\\
20fc0 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20  {1}",..         
20fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
20fe0 6f 6f 74 4b 65 79 2c 20 6b 65 79 4e 61 6d 65 29  ootKey, keyName)
20ff0 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
21000 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
21010 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20  false;..        
21020 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
21030 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69               usi
21040 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73 74 72 79  ng (MockRegistry
21050 4b 65 79 20 73 75 62 4b 65 79 20 3d 20 52 65 67  Key subKey = Reg
21060 69 73 74 72 79 48 65 6c 70 65 72 2e 4f 70 65 6e  istryHelper.Open
21070 53 75 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20  SubKey(..       
21080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21090 20 6b 65 79 2c 20 22 44 61 74 61 50 72 6f 76 69   key, "DataProvi
210a0 64 65 72 73 22 2c 20 74 72 75 65 2c 20 77 68 61  ders", true, wha
210b0 74 49 66 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a  tIf, verbose))..
210c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
210e0 20 20 20 20 20 20 20 69 66 20 28 73 75 62 4b 65         if (subKe
210f0 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  y == null)..    
21100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21110 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
21120 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
21130 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74   = String.Format
21140 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
21150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
21160 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 72  could not open r
21170 65 67 69 73 74 72 79 20 6b 65 79 3a 20 7b 30 7d  egistry key: {0}
21180 5c 5c 44 61 74 61 50 72 6f 76 69 64 65 72 73 22  \\DataProviders"
21190 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
211a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b                 k
211b0 65 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ey);....        
211c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211d0 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20  return false;.. 
211e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211f0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
21200 20 20 20 20 20 20 20 20 20 20 20 20 52 65 67 69              Regi
21210 73 74 72 79 48 65 6c 70 65 72 2e 44 65 6c 65 74  stryHelper.Delet
21220 65 53 75 62 4b 65 79 54 72 65 65 28 0d 0a 20 20  eSubKeyTree(..  
21230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21240 20 20 20 20 20 20 73 75 62 4b 65 79 2c 20 64 61        subKey, da
21250 74 61 50 72 6f 76 69 64 65 72 49 64 2e 54 6f 53  taProviderId.ToS
21260 74 72 69 6e 67 28 56 73 49 64 46 6f 72 6d 61 74  tring(VsIdFormat
21270 29 2c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20  ), whatIf,..    
21280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21290 20 20 20 20 76 65 72 62 6f 73 65 29 3b 0d 0a 20      verbose);.. 
212a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
212b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
212c0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ...            r
212d0 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a 20 20 20  eturn true;..   
212e0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
212f0 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
21300 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
21310 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
21320 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
21330 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
21340 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61       private sta
21350 74 69 63 20 62 6f 6f 6c 20 50 72 6f 63 65 73 73  tic bool Process
21360 56 73 44 61 74 61 50 72 6f 76 69 64 65 72 28 0d  VsDataProvider(.
21370 0a 20 20 20 20 20 20 20 20 20 20 20 20 52 65 67  .            Reg
21380 69 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b 65 79  istryKey rootKey
21390 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  ,..            V
213a0 65 72 73 69 6f 6e 20 76 73 56 65 72 73 69 6f 6e  ersion vsVersion
213b0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 47  ,..            G
213c0 75 69 64 20 70 61 63 6b 61 67 65 49 64 2c 20 2f  uid packageId, /
213d0 2a 20 4e 4f 54 20 55 53 45 44 20 2a 2f 0d 0a 20  * NOT USED */.. 
213e0 20 20 20 20 20 20 20 20 20 20 20 47 75 69 64 20             Guid 
213f0 73 65 72 76 69 63 65 49 64 2c 0d 0a 20 20 20 20  serviceId,..    
21400 20 20 20 20 20 20 20 20 47 75 69 64 20 64 61 74          Guid dat
21410 61 53 6f 75 72 63 65 49 64 2c 20 2f 2a 20 4e 4f  aSourceId, /* NO
21420 54 20 55 53 45 44 20 2a 2f 0d 0a 20 20 20 20 20  T USED */..     
21430 20 20 20 20 20 20 20 47 75 69 64 20 64 61 74 61         Guid data
21440 50 72 6f 76 69 64 65 72 49 64 2c 0d 0a 20 20 20  ProviderId,..   
21450 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
21460 63 6c 69 65 6e 74 44 61 74 61 2c 0d 0a 20 20 20  clientData,..   
21470 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 77 68           bool wh
21480 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20  atIf,..         
21490 20 20 20 62 6f 6f 6c 20 76 65 72 62 6f 73 65 2c     bool verbose,
214a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
214b0 66 20 73 74 72 69 6e 67 20 65 72 72 6f 72 0d 0a  f string error..
214c0 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20              ).. 
214d0 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
214e0 20 20 20 20 20 20 41 6e 79 50 61 69 72 3c 73 74        AnyPair<st
214f0 72 69 6e 67 2c 20 62 6f 6f 6c 3e 20 70 61 69 72  ring, bool> pair
21500 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 20 61 73   = clientData as
21510 20 41 6e 79 50 61 69 72 3c 73 74 72 69 6e 67 2c   AnyPair<string,
21520 20 62 6f 6f 6c 3e 3b 0d 0a 0d 0a 20 20 20 20 20   bool>;....     
21530 20 20 20 20 20 20 20 69 66 20 28 70 61 69 72 20         if (pair 
21540 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
21550 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
21560 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d           error =
21570 20 22 69 6e 76 61 6c 69 64 20 56 53 20 63 61 6c   "invalid VS cal
21580 6c 62 61 63 6b 20 64 61 74 61 22 3b 0d 0a 20 20  lback data";..  
21590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
215a0 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20  turn false;..   
215b0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
215c0 20 20 20 20 20 20 20 20 20 20 69 66 20 28 70 61            if (pa
215d0 69 72 2e 59 29 0d 0a 20 20 20 20 20 20 20 20 20  ir.Y)..         
215e0 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
215f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 41 64 64        return Add
21600 56 73 44 61 74 61 50 72 6f 76 69 64 65 72 28 0d  VsDataProvider(.
21610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21620 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20 76 73       rootKey, vs
21630 56 65 72 73 69 6f 6e 2c 20 73 65 72 76 69 63 65  Version, service
21640 49 64 2c 20 64 61 74 61 50 72 6f 76 69 64 65 72  Id, dataProvider
21650 49 64 2c 20 70 61 69 72 2e 58 2c 0d 0a 20 20 20  Id, pair.X,..   
21660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21670 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65   whatIf, verbose
21680 2c 20 72 65 66 20 65 72 72 6f 72 29 3b 0d 0a 20  , ref error);.. 
21690 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
216a0 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 0d 0a            else..
216b0 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
216c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
216d0 65 74 75 72 6e 20 52 65 6d 6f 76 65 56 73 44 61  eturn RemoveVsDa
216e0 74 61 50 72 6f 76 69 64 65 72 28 0d 0a 20 20 20  taProvider(..   
216f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21700 20 72 6f 6f 74 4b 65 79 2c 20 76 73 56 65 72 73   rootKey, vsVers
21710 69 6f 6e 2c 20 64 61 74 61 50 72 6f 76 69 64 65  ion, dataProvide
21720 72 49 64 2c 20 77 68 61 74 49 66 2c 20 76 65 72  rId, whatIf, ver
21730 62 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  bose,..         
21740 20 20 20 20 20 20 20 20 20 20 20 72 65 66 20 65             ref e
21750 72 72 6f 72 29 3b 0d 0a 20 20 20 20 20 20 20 20  rror);..        
21760 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
21770 0d 0a 20 20 20 20 20 20 20 20 23 65 6e 64 72 65  ..        #endre
21780 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  gion....        
21790 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
217a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
217b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
217c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
217d0 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
217e0 20 20 20 23 72 65 67 69 6f 6e 20 56 69 73 75 61     #region Visua
217f0 6c 20 53 74 75 64 69 6f 20 50 61 63 6b 61 67 65  l Studio Package
21800 20 48 61 6e 64 6c 69 6e 67 0d 0a 20 20 20 20 20   Handling..     
21810 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69     private stati
21820 63 20 62 6f 6f 6c 20 41 64 64 56 73 50 61 63 6b  c bool AddVsPack
21830 61 67 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20  age(..          
21840 20 20 52 65 67 69 73 74 72 79 4b 65 79 20 72 6f    RegistryKey ro
21850 6f 74 4b 65 79 2c 0d 0a 20 20 20 20 20 20 20 20  otKey,..        
21860 20 20 20 20 56 65 72 73 69 6f 6e 20 76 73 56 65      Version vsVe
21870 72 73 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20  rsion,..        
21880 20 20 20 20 47 75 69 64 20 70 61 63 6b 61 67 65      Guid package
21890 49 64 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  Id,..           
218a0 20 47 75 69 64 20 73 65 72 76 69 63 65 49 64 2c   Guid serviceId,
218b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  ..            st
218c0 72 69 6e 67 20 66 69 6c 65 4e 61 6d 65 2c 0d 0a  ring fileName,..
218d0 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
218e0 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20   whatIf,..      
218f0 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62 6f        bool verbo
21900 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se,..           
21910 20 72 65 66 20 73 74 72 69 6e 67 20 65 72 72 6f   ref string erro
21920 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  r..            )
21930 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
21940 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
21950 6b 65 79 4e 61 6d 65 20 3d 20 47 65 74 56 73 4b  keyName = GetVsK
21960 65 79 4e 61 6d 65 28 76 73 56 65 72 73 69 6f 6e  eyName(vsVersion
21970 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
21980 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52 65 67    using (MockReg
21990 69 73 74 72 79 4b 65 79 20 6b 65 79 20 3d 20 52  istryKey key = R
219a0 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 4f 70  egistryHelper.Op
219b0 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20 20 20 20  enSubKey(..     
219c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
219d0 6f 6f 74 4b 65 79 2c 20 6b 65 79 4e 61 6d 65 2c  ootKey, keyName,
219e0 20 66 61 6c 73 65 2c 20 77 68 61 74 49 66 2c 20   false, whatIf, 
219f0 76 65 72 62 6f 73 65 29 29 0d 0a 20 20 20 20 20  verbose))..     
21a00 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
21a10 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6b 65            if (ke
21a20 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  y == null)..    
21a30 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
21a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a50 20 20 20 65 72 72 6f 72 20 3d 20 53 74 72 69 6e     error = Strin
21a60 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20  g.Format(..     
21a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a80 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 6f 70     "could not op
21a90 65 6e 20 72 65 67 69 73 74 72 79 20 6b 65 79 3a  en registry key:
21aa0 20 7b 30 7d 5c 5c 7b 31 7d 22 2c 0d 0a 20 20 20   {0}\\{1}",..   
21ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ac0 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20 6b 65       rootKey, ke
21ad0 79 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20  yName);....     
21ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
21af0 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20  eturn false;..  
21b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
21b10 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
21b20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52 65     using (MockRe
21b30 67 69 73 74 72 79 4b 65 79 20 73 75 62 4b 65 79  gistryKey subKey
21b40 20 3d 20 52 65 67 69 73 74 72 79 48 65 6c 70 65   = RegistryHelpe
21b50 72 2e 4f 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20  r.OpenSubKey(.. 
21b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b70 20 20 20 20 20 20 20 6b 65 79 2c 20 22 50 61 63         key, "Pac
21b80 6b 61 67 65 73 22 2c 20 74 72 75 65 2c 20 77 68  kages", true, wh
21b90 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29 29 0d  atIf, verbose)).
21ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21bb0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
21bc0 20 20 20 20 20 20 20 20 69 66 20 28 73 75 62 4b          if (subK
21bd0 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  ey == null)..   
21be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bf0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
21c00 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
21c10 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61  r = String.Forma
21c20 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t(..            
21c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c40 22 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20  "could not open 
21c50 72 65 67 69 73 74 72 79 20 6b 65 79 3a 20 7b 30  registry key: {0
21c60 7d 5c 5c 50 61 63 6b 61 67 65 73 22 2c 0d 0a 20  }\\Packages",.. 
21c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c80 20 20 20 20 20 20 20 20 20 20 20 6b 65 79 29 3b             key);
21c90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
21ca0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
21cb0 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20  rn false;..     
21cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
21cd0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
21ce0 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 4d          using (M
21cf0 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20 70  ockRegistryKey p
21d00 61 63 6b 61 67 65 4b 65 79 20 3d 20 52 65 67 69  ackageKey = Regi
21d10 73 74 72 79 48 65 6c 70 65 72 2e 43 72 65 61 74  stryHelper.Creat
21d20 65 53 75 62 4b 65 79 28 0d 0a 20 20 20 20 20 20  eSubKey(..      
21d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d40 20 20 20 20 20 20 73 75 62 4b 65 79 2c 20 70 61        subKey, pa
21d50 63 6b 61 67 65 49 64 2e 54 6f 53 74 72 69 6e 67  ckageId.ToString
21d60 28 56 73 49 64 46 6f 72 6d 61 74 29 2c 20 77 68  (VsIdFormat), wh
21d70 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20  atIf,..         
21d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d90 20 20 20 76 65 72 62 6f 73 65 29 29 0d 0a 20 20     verbose))..  
21da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21db0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
21dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
21dd0 28 70 61 63 6b 61 67 65 4b 65 79 20 3d 3d 20 6e  (packageKey == n
21de0 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
21df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
21e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21e10 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
21e20 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d  or = String.Form
21e30 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  at(..           
21e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e50 20 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20       "could not 
21e60 63 72 65 61 74 65 20 72 65 67 69 73 74 72 79 20  create registry 
21e70 6b 65 79 3a 20 7b 30 7d 5c 5c 7b 31 7d 22 2c 0d  key: {0}\\{1}",.
21e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ea0 20 6b 65 79 2c 20 70 61 63 6b 61 67 65 49 64 2e   key, packageId.
21eb0 54 6f 53 74 72 69 6e 67 28 56 73 49 64 46 6f 72  ToString(VsIdFor
21ec0 6d 61 74 29 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  mat));....      
21ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ee0 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
21ef0 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se;..           
21f00 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
21f10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21f20 20 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74            Regist
21f30 72 79 48 65 6c 70 65 72 2e 53 65 74 56 61 6c 75  ryHelper.SetValu
21f40 65 28 70 61 63 6b 61 67 65 4b 65 79 2c 20 6e 75  e(packageKey, nu
21f50 6c 6c 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61  ll, String.Forma
21f60 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t(..            
21f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f80 22 7b 30 7d 20 44 65 73 69 67 6e 65 72 20 50 61  "{0} Designer Pa
21f90 63 6b 61 67 65 22 2c 20 50 72 6f 6a 65 63 74 4e  ckage", ProjectN
21fa0 61 6d 65 29 2c 20 77 68 61 74 49 66 2c 0d 0a 20  ame), whatIf,.. 
21fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fc0 20 20 20 20 20 20 20 20 20 20 20 76 65 72 62 6f             verbo
21fd0 73 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  se);....        
21fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ff0 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 53  RegistryHelper.S
22000 65 74 56 61 6c 75 65 28 70 61 63 6b 61 67 65 4b  etValue(packageK
22010 65 79 2c 20 22 43 6c 61 73 73 22 2c 0d 0a 20 20  ey, "Class",..  
22020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22030 20 20 20 20 20 20 20 20 20 20 22 53 51 4c 69 74            "SQLit
22040 65 2e 44 65 73 69 67 6e 65 72 2e 53 51 4c 69 74  e.Designer.SQLit
22050 65 50 61 63 6b 61 67 65 22 2c 20 77 68 61 74 49  ePackage", whatI
22060 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a  f, verbose);....
22070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22080 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79          Registry
22090 48 65 6c 70 65 72 2e 53 65 74 56 61 6c 75 65 28  Helper.SetValue(
220a0 70 61 63 6b 61 67 65 4b 65 79 2c 20 22 43 6f 64  packageKey, "Cod
220b0 65 42 61 73 65 22 2c 0d 0a 20 20 20 20 20 20 20  eBase",..       
220c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220d0 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 2c 20 77       fileName, w
220e0 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29 3b  hatIf, verbose);
220f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
22100 20 20 20 20 20 20 20 20 20 20 20 20 52 65 67 69              Regi
22110 73 74 72 79 48 65 6c 70 65 72 2e 53 65 74 56 61  stryHelper.SetVa
22120 6c 75 65 28 70 61 63 6b 61 67 65 4b 65 79 2c 20  lue(packageKey, 
22130 22 49 44 22 2c 20 34 30 30 2c 20 77 68 61 74 49  "ID", 400, whatI
22140 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  f,..            
22150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22160 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20  verbose);....   
22170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22180 20 20 20 20 20 52 65 67 69 73 74 72 79 48 65 6c       RegistryHel
22190 70 65 72 2e 53 65 74 56 61 6c 75 65 28 70 61 63  per.SetValue(pac
221a0 6b 61 67 65 4b 65 79 2c 20 22 49 6e 70 72 6f 63  kageKey, "Inproc
221b0 53 65 72 76 65 72 33 32 22 2c 0d 0a 20 20 20 20  Server32",..    
221c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221d0 20 20 20 20 20 20 20 20 50 61 74 68 2e 43 6f 6d          Path.Com
221e0 62 69 6e 65 28 45 6e 76 69 72 6f 6e 6d 65 6e 74  bine(Environment
221f0 2e 53 79 73 74 65 6d 44 69 72 65 63 74 6f 72 79  .SystemDirectory
22200 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
22210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22220 20 20 20 22 6d 73 63 6f 72 65 65 2e 64 6c 6c 22     "mscoree.dll"
22230 29 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f  ), whatIf, verbo
22240 73 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  se);....        
22250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22260 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 53  RegistryHelper.S
22270 65 74 56 61 6c 75 65 28 70 61 63 6b 61 67 65 4b  etValue(packageK
22280 65 79 2c 20 22 43 6f 6d 70 61 6e 79 4e 61 6d 65  ey, "CompanyName
22290 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ",..            
222a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222b0 22 68 74 74 70 3a 2f 2f 73 79 73 74 65 6d 2e 64  "http://system.d
222c0 61 74 61 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 22  ata.sqlite.org/"
222d0 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73  , whatIf, verbos
222e0 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e);....         
222f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52                 R
22300 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 53 65  egistryHelper.Se
22310 74 56 61 6c 75 65 28 70 61 63 6b 61 67 65 4b 65  tValue(packageKe
22320 79 2c 20 22 4d 69 6e 45 64 69 74 69 6f 6e 22 2c  y, "MinEdition",
22330 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 73                "s
22350 74 61 6e 64 61 72 64 22 2c 20 77 68 61 74 49 66  tandard", whatIf
22360 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20  , verbose);.... 
22370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22380 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79 48         RegistryH
22390 65 6c 70 65 72 2e 53 65 74 56 61 6c 75 65 28 70  elper.SetValue(p
223a0 61 63 6b 61 67 65 4b 65 79 2c 20 22 50 72 6f 64  ackageKey, "Prod
223b0 75 63 74 4e 61 6d 65 22 2c 0d 0a 20 20 20 20 20  uctName",..     
223c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223d0 20 20 20 20 20 20 20 53 74 72 69 6e 67 2e 46 6f         String.Fo
223e0 72 6d 61 74 28 22 7b 30 7d 20 44 65 73 69 67 6e  rmat("{0} Design
223f0 65 72 20 50 61 63 6b 61 67 65 22 2c 20 50 72 6f  er Package", Pro
22400 6a 65 63 74 4e 61 6d 65 29 2c 0d 0a 20 20 20 20  jectName),..    
22410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22420 20 20 20 20 20 20 20 20 77 68 61 74 49 66 2c 20          whatIf, 
22430 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20  verbose);....   
22440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22450 20 20 20 20 20 52 65 67 69 73 74 72 79 48 65 6c       RegistryHel
22460 70 65 72 2e 53 65 74 56 61 6c 75 65 28 70 61 63  per.SetValue(pac
22470 6b 61 67 65 4b 65 79 2c 20 22 50 72 6f 64 75 63  kageKey, "Produc
22480 74 56 65 72 73 69 6f 6e 22 2c 0d 0a 20 20 20 20  tVersion",..    
22490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224a0 20 20 20 20 20 20 20 20 22 31 2e 30 22 2c 20 77          "1.0", w
224b0 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29 3b  hatIf, verbose);
224c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
224d0 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e              usin
224e0 67 20 28 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b  g (MockRegistryK
224f0 65 79 20 74 6f 6f 6c 62 6f 78 4b 65 79 20 3d 20  ey toolboxKey = 
22500 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 43  RegistryHelper.C
22510 72 65 61 74 65 53 75 62 4b 65 79 28 0d 0a 20 20  reateSubKey(..  
22520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
22540 63 6b 61 67 65 4b 65 79 2c 20 22 54 6f 6f 6c 62  ckageKey, "Toolb
22550 6f 78 22 2c 20 77 68 61 74 49 66 2c 20 76 65 72  ox", whatIf, ver
22560 62 6f 73 65 29 29 0d 0a 20 20 20 20 20 20 20 20  bose))..        
22570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22580 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
22590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
225a0 66 20 28 74 6f 6f 6c 62 6f 78 4b 65 79 20 3d 3d  f (toolboxKey ==
225b0 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
225c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225d0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
225e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225f0 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 53         error = S
22600 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20  tring.Format(.. 
22610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22630 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 63 72     "could not cr
22640 65 61 74 65 20 72 65 67 69 73 74 72 79 20 6b 65  eate registry ke
22650 79 3a 20 7b 30 7d 5c 5c 54 6f 6f 6c 62 6f 78 22  y: {0}\\Toolbox"
22660 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
22670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22680 20 20 20 20 20 20 20 70 61 63 6b 61 67 65 4b 65         packageKe
22690 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  y);....         
226a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
226c0 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  lse;..          
226d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226e0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
226f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22700 20 20 20 52 65 67 69 73 74 72 79 48 65 6c 70 65     RegistryHelpe
22710 72 2e 53 65 74 56 61 6c 75 65 28 0d 0a 20 20 20  r.SetValue(..   
22720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22730 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 6f               too
22740 6c 62 6f 78 4b 65 79 2c 20 22 44 65 66 61 75 6c  lboxKey, "Defaul
22750 74 20 49 74 65 6d 73 22 2c 20 33 2c 20 77 68 61  t Items", 3, wha
22760 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  tIf,..          
22770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22780 20 20 20 20 20 20 76 65 72 62 6f 73 65 29 3b 0d        verbose);.
22790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
227a0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
227b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227c0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
227d0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
227e0 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 4d          using (M
227f0 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20 73  ockRegistryKey s
22800 75 62 4b 65 79 20 3d 20 52 65 67 69 73 74 72 79  ubKey = Registry
22810 48 65 6c 70 65 72 2e 4f 70 65 6e 53 75 62 4b 65  Helper.OpenSubKe
22820 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y(..            
22830 20 20 20 20 20 20 20 20 20 20 20 20 6b 65 79 2c              key,
22840 20 22 4d 65 6e 75 73 22 2c 20 74 72 75 65 2c 20   "Menus", true, 
22850 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29  whatIf, verbose)
22860 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
22870 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
22880 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73 75            if (su
22890 62 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20  bKey == null).. 
228a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228b0 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
228c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
228d0 72 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72  ror = String.For
228e0 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  mat(..          
228f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22900 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65    "could not ope
22910 6e 20 72 65 67 69 73 74 72 79 20 6b 65 79 3a 20  n registry key: 
22920 7b 30 7d 5c 5c 4d 65 6e 75 73 22 2c 0d 0a 20 20  {0}\\Menus",..  
22930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22940 20 20 20 20 20 20 20 20 20 20 6b 65 79 29 3b 0d            key);.
22950 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
22960 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
22970 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20  n false;..      
22980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
22990 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
229a0 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79 48         RegistryH
229b0 65 6c 70 65 72 2e 53 65 74 56 61 6c 75 65 28 0d  elper.SetValue(.
229c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
229d0 20 20 20 20 20 20 20 20 20 73 75 62 4b 65 79 2c           subKey,
229e0 20 70 61 63 6b 61 67 65 49 64 2e 54 6f 53 74 72   packageId.ToStr
229f0 69 6e 67 28 56 73 49 64 46 6f 72 6d 61 74 29 2c  ing(VsIdFormat),
22a00 20 22 2c 20 31 30 30 30 2c 20 33 22 2c 0d 0a 20   ", 1000, 3",.. 
22a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a20 20 20 20 20 20 20 20 77 68 61 74 49 66 2c 20 76         whatIf, v
22a30 65 72 62 6f 73 65 29 3b 0d 0a 20 20 20 20 20 20  erbose);..      
22a40 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
22a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
22a60 73 69 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73 74  sing (MockRegist
22a70 72 79 4b 65 79 20 73 75 62 4b 65 79 20 3d 20 52  ryKey subKey = R
22a80 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 4f 70  egistryHelper.Op
22a90 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20 20 20 20  enSubKey(..     
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ab0 20 20 20 6b 65 79 2c 20 22 53 65 72 76 69 63 65     key, "Service
22ac0 73 22 2c 20 74 72 75 65 2c 20 77 68 61 74 49 66  s", true, whatIf
22ad0 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a 20 20 20  , verbose))..   
22ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
22af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b00 20 20 20 20 69 66 20 28 73 75 62 4b 65 79 20 3d      if (subKey =
22b10 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
22b20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
22b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b40 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20          error = 
22b50 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a  String.Format(..
22b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b70 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 75              "cou
22b80 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 72 65 67 69  ld not open regi
22b90 73 74 72 79 20 6b 65 79 3a 20 7b 30 7d 5c 5c 53  stry key: {0}\\S
22ba0 65 72 76 69 63 65 73 22 2c 0d 0a 20 20 20 20 20  ervices",..     
22bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bc0 20 20 20 20 20 20 20 6b 65 79 29 3b 0d 0a 0d 0a         key);....
22bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22be0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
22bf0 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alse;..         
22c00 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
22c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c20 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52      using (MockR
22c30 65 67 69 73 74 72 79 4b 65 79 20 73 65 72 76 69  egistryKey servi
22c40 63 65 4b 65 79 20 3d 20 52 65 67 69 73 74 72 79  ceKey = Registry
22c50 48 65 6c 70 65 72 2e 43 72 65 61 74 65 53 75 62  Helper.CreateSub
22c60 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20  Key(..          
22c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c80 20 20 73 75 62 4b 65 79 2c 20 73 65 72 76 69 63    subKey, servic
22c90 65 49 64 2e 54 6f 53 74 72 69 6e 67 28 56 73 49  eId.ToString(VsI
22ca0 64 46 6f 72 6d 61 74 29 2c 20 77 68 61 74 49 66  dFormat), whatIf
22cb0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
22cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76                 v
22cd0 65 72 62 6f 73 65 29 29 0d 0a 20 20 20 20 20 20  erbose))..      
22ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
22cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22d00 20 20 20 20 20 20 20 20 20 69 66 20 28 73 65 72           if (ser
22d10 76 69 63 65 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29  viceKey == null)
22d20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22d30 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
22d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d50 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d           error =
22d60 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d   String.Format(.
22d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d90 20 22 63 6f 75 6c 64 20 6e 6f 74 20 63 72 65 61   "could not crea
22da0 74 65 20 72 65 67 69 73 74 72 79 20 6b 65 79 3a  te registry key:
22db0 20 7b 30 7d 5c 5c 7b 31 7d 22 2c 0d 0a 20 20 20   {0}\\{1}",..   
22dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 65 79               key
22de0 2c 20 73 65 72 76 69 63 65 49 64 2e 54 6f 53 74  , serviceId.ToSt
22df0 72 69 6e 67 28 56 73 49 64 46 6f 72 6d 61 74 29  ring(VsIdFormat)
22e00 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
22e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d    return false;.
22e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22e40 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
22e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e60 20 20 20 20 20 20 52 65 67 69 73 74 72 79 48 65        RegistryHe
22e70 6c 70 65 72 2e 53 65 74 56 61 6c 75 65 28 73 65  lper.SetValue(se
22e80 72 76 69 63 65 4b 65 79 2c 20 6e 75 6c 6c 2c 0d  rviceKey, null,.
22e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 63               pac
22eb0 6b 61 67 65 49 64 2e 54 6f 53 74 72 69 6e 67 28  kageId.ToString(
22ec0 56 73 49 64 46 6f 72 6d 61 74 29 2c 20 77 68 61  VsIdFormat), wha
22ed0 74 49 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a  tIf, verbose);..
22ee0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22ef0 20 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74            Regist
22f00 72 79 48 65 6c 70 65 72 2e 53 65 74 56 61 6c 75  ryHelper.SetValu
22f10 65 28 73 65 72 76 69 63 65 4b 65 79 2c 20 22 4e  e(serviceKey, "N
22f20 61 6d 65 22 2c 0d 0a 20 20 20 20 20 20 20 20 20  ame",..         
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f40 20 20 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74     String.Format
22f50 28 22 7b 30 7d 20 44 65 73 69 67 6e 65 72 20 53  ("{0} Designer S
22f60 65 72 76 69 63 65 22 2c 20 50 72 6f 6a 65 63 74  ervice", Project
22f70 4e 61 6d 65 29 2c 0d 0a 20 20 20 20 20 20 20 20  Name),..        
22f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f90 20 20 20 20 77 68 61 74 49 66 2c 20 76 65 72 62      whatIf, verb
22fa0 6f 73 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ose);..         
22fb0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
22fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
22fe0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
22ff0 74 75 72 6e 20 74 72 75 65 3b 0d 0a 20 20 20 20  turn true;..    
23000 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
23010 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
23020 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23030 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23040 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23050 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
23060 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
23070 69 63 20 62 6f 6f 6c 20 52 65 6d 6f 76 65 56 73  ic bool RemoveVs
23080 50 61 63 6b 61 67 65 28 0d 0a 20 20 20 20 20 20  Package(..      
23090 20 20 20 20 20 20 52 65 67 69 73 74 72 79 4b 65        RegistryKe
230a0 79 20 72 6f 6f 74 4b 65 79 2c 0d 0a 20 20 20 20  y rootKey,..    
230b0 20 20 20 20 20 20 20 20 56 65 72 73 69 6f 6e 20          Version 
230c0 76 73 56 65 72 73 69 6f 6e 2c 0d 0a 20 20 20 20  vsVersion,..    
230d0 20 20 20 20 20 20 20 20 47 75 69 64 20 70 61 63          Guid pac
230e0 6b 61 67 65 49 64 2c 0d 0a 20 20 20 20 20 20 20  kageId,..       
230f0 20 20 20 20 20 47 75 69 64 20 73 65 72 76 69 63       Guid servic
23100 65 49 64 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  eId,..          
23110 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a    bool whatIf,..
23120 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
23130 20 76 65 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20   verbose,..     
23140 20 20 20 20 20 20 20 72 65 66 20 73 74 72 69 6e         ref strin
23150 67 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20  g error..       
23160 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20       )..        
23170 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  {..            s
23180 74 72 69 6e 67 20 6b 65 79 4e 61 6d 65 20 3d 20  tring keyName = 
23190 47 65 74 56 73 4b 65 79 4e 61 6d 65 28 76 73 56  GetVsKeyName(vsV
231a0 65 72 73 69 6f 6e 29 3b 0d 0a 0d 0a 20 20 20 20  ersion);....    
231b0 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 4d          using (M
231c0 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20 6b  ockRegistryKey k
231d0 65 79 20 3d 20 52 65 67 69 73 74 72 79 48 65 6c  ey = RegistryHel
231e0 70 65 72 2e 4f 70 65 6e 53 75 62 4b 65 79 28 0d  per.OpenSubKey(.
231f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23200 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20 6b 65       rootKey, ke
23210 79 4e 61 6d 65 2c 20 66 61 6c 73 65 2c 20 77 68  yName, false, wh
23220 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29 29 0d  atIf, verbose)).
23230 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
23240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23250 69 66 20 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c 29  if (key == null)
23260 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23270 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
23280 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d           error =
23290 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d   String.Format(.
232a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
232b0 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64 20           "could 
232c0 6e 6f 74 20 6f 70 65 6e 20 72 65 67 69 73 74 72  not open registr
232d0 79 20 6b 65 79 3a 20 7b 30 7d 5c 5c 7b 31 7d 22  y key: {0}\\{1}"
232e0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
232f0 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74 4b             rootK
23300 65 79 2c 20 6b 65 79 4e 61 6d 65 29 3b 0d 0a 0d  ey, keyName);...
23310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23320 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
23330 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
23340 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
23350 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28           using (
23360 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20  MockRegistryKey 
23370 73 75 62 4b 65 79 20 3d 20 52 65 67 69 73 74 72  subKey = Registr
23380 79 48 65 6c 70 65 72 2e 4f 70 65 6e 53 75 62 4b  yHelper.OpenSubK
23390 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ey(..           
233a0 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 65 79               key
233b0 2c 20 22 50 61 63 6b 61 67 65 73 22 2c 20 74 72  , "Packages", tr
233c0 75 65 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62  ue, whatIf, verb
233d0 6f 73 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20  ose))..         
233e0 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
233f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
23400 20 28 73 75 62 4b 65 79 20 3d 3d 20 6e 75 6c 6c   (subKey == null
23410 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
23420 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
23430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23440 20 20 65 72 72 6f 72 20 3d 20 53 74 72 69 6e 67    error = String
23450 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20  .Format(..      
23460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23470 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74        "could not
23480 20 6f 70 65 6e 20 72 65 67 69 73 74 72 79 20 6b   open registry k
23490 65 79 3a 20 7b 30 7d 5c 5c 50 61 63 6b 61 67 65  ey: {0}\\Package
234a0 73 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s",..           
234b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234c0 20 6b 65 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20   key);....      
234d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234e0 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d    return false;.
234f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23500 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
23510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65                Re
23520 67 69 73 74 72 79 48 65 6c 70 65 72 2e 44 65 6c  gistryHelper.Del
23530 65 74 65 53 75 62 4b 65 79 54 72 65 65 28 0d 0a  eteSubKeyTree(..
23540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23550 20 20 20 20 20 20 20 20 6b 65 79 2c 20 70 61 63          key, pac
23560 6b 61 67 65 49 64 2e 54 6f 53 74 72 69 6e 67 28  kageId.ToString(
23570 56 73 49 64 46 6f 72 6d 61 74 29 2c 20 77 68 61  VsIdFormat), wha
23580 74 49 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a  tIf, verbose);..
23590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235a0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
235b0 20 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b       using (Mock
235c0 52 65 67 69 73 74 72 79 4b 65 79 20 73 75 62 4b  RegistryKey subK
235d0 65 79 20 3d 20 52 65 67 69 73 74 72 79 48 65 6c  ey = RegistryHel
235e0 70 65 72 2e 4f 70 65 6e 53 75 62 4b 65 79 28 0d  per.OpenSubKey(.
235f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23600 20 20 20 20 20 20 20 20 20 6b 65 79 2c 20 22 4d           key, "M
23610 65 6e 75 73 22 2c 20 74 72 75 65 2c 20 77 68 61  enus", true, wha
23620 74 49 66 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a  tIf, verbose))..
23630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23640 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
23650 20 20 20 20 20 20 20 69 66 20 28 73 75 62 4b 65         if (subKe
23660 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  y == null)..    
23670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23680 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
23690 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
236a0 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74   = String.Format
236b0 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
236c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
236d0 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 72  could not open r
236e0 65 67 69 73 74 72 79 20 6b 65 79 3a 20 7b 30 7d  egistry key: {0}
236f0 5c 5c 4d 65 6e 75 73 22 2c 0d 0a 20 20 20 20 20  \\Menus",..     
23700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23710 20 20 20 20 20 20 20 6b 65 79 29 3b 0d 0a 0d 0a         key);....
23720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23730 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
23740 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alse;..         
23750 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
23760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23770 20 20 20 20 52 65 67 69 73 74 72 79 48 65 6c 70      RegistryHelp
23780 65 72 2e 44 65 6c 65 74 65 56 61 6c 75 65 28 0d  er.DeleteValue(.
23790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
237a0 20 20 20 20 20 20 20 20 20 73 75 62 4b 65 79 2c           subKey,
237b0 20 70 61 63 6b 61 67 65 49 64 2e 54 6f 53 74 72   packageId.ToStr
237c0 69 6e 67 28 56 73 49 64 46 6f 72 6d 61 74 29 2c  ing(VsIdFormat),
237d0 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20   whatIf,..      
237e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237f0 20 20 76 65 72 62 6f 73 65 29 3b 0d 0a 20 20 20    verbose);..   
23800 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
23810 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23820 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52 65 67    using (MockReg
23830 69 73 74 72 79 4b 65 79 20 73 75 62 4b 65 79 20  istryKey subKey 
23840 3d 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72  = RegistryHelper
23850 2e 4f 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20  .OpenSubKey(..  
23860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23870 20 20 20 20 20 20 6b 65 79 2c 20 22 53 65 72 76        key, "Serv
23880 69 63 65 73 22 2c 20 74 72 75 65 2c 20 77 68 61  ices", true, wha
23890 74 49 66 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a  tIf, verbose))..
238a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
238c0 20 20 20 20 20 20 20 69 66 20 28 73 75 62 4b 65         if (subKe
238d0 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  y == null)..    
238e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
23900 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
23910 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74   = String.Format
23920 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
23930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
23940 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 72  could not open r
23950 65 67 69 73 74 72 79 20 6b 65 79 3a 20 7b 30 7d  egistry key: {0}
23960 5c 5c 53 65 72 76 69 63 65 73 22 2c 0d 0a 20 20  \\Services",..  
23970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23980 20 20 20 20 20 20 20 20 20 20 6b 65 79 29 3b 0d            key);.
23990 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
239a0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
239b0 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20  n false;..      
239c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
239d0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
239e0 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79 48         RegistryH
239f0 65 6c 70 65 72 2e 44 65 6c 65 74 65 53 75 62 4b  elper.DeleteSubK
23a00 65 79 54 72 65 65 28 0d 0a 20 20 20 20 20 20 20  eyTree(..       
23a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a20 20 73 75 62 4b 65 79 2c 20 73 65 72 76 69 63 65   subKey, service
23a30 49 64 2e 54 6f 53 74 72 69 6e 67 28 56 73 49 64  Id.ToString(VsId
23a40 46 6f 72 6d 61 74 29 2c 20 77 68 61 74 49 66 2c  Format), whatIf,
23a50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23a60 20 20 20 20 20 20 20 20 20 20 76 65 72 62 6f 73            verbos
23a70 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e);..           
23a80 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
23a90 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
23aa0 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
23ab0 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  ;..        }....
23ac0 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
23ad0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23ae0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23af0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23b00 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
23b10 0a 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61  ...        priva
23b20 74 65 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 50  te static bool P
23b30 72 6f 63 65 73 73 56 73 50 61 63 6b 61 67 65 28  rocessVsPackage(
23b40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 52 65  ..            Re
23b50 67 69 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b 65  gistryKey rootKe
23b60 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y,..            
23b70 56 65 72 73 69 6f 6e 20 76 73 56 65 72 73 69 6f  Version vsVersio
23b80 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n,..            
23b90 47 75 69 64 20 70 61 63 6b 61 67 65 49 64 2c 0d  Guid packageId,.
23ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 47 75 69  .            Gui
23bb0 64 20 73 65 72 76 69 63 65 49 64 2c 0d 0a 20 20  d serviceId,..  
23bc0 20 20 20 20 20 20 20 20 20 20 47 75 69 64 20 64            Guid d
23bd0 61 74 61 53 6f 75 72 63 65 49 64 2c 0d 0a 20 20  ataSourceId,..  
23be0 20 20 20 20 20 20 20 20 20 20 47 75 69 64 20 64            Guid d
23bf0 61 74 61 50 72 6f 76 69 64 65 72 49 64 2c 0d 0a  ataProviderId,..
23c00 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
23c10 63 74 20 63 6c 69 65 6e 74 44 61 74 61 2c 0d 0a  ct clientData,..
23c20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
23c30 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20   whatIf,..      
23c40 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62 6f        bool verbo
23c50 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se,..           
23c60 20 72 65 66 20 73 74 72 69 6e 67 20 65 72 72 6f   ref string erro
23c70 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  r..            )
23c80 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
23c90 20 20 20 20 20 20 20 20 20 41 6e 79 50 61 69 72           AnyPair
23ca0 3c 73 74 72 69 6e 67 2c 20 62 6f 6f 6c 3e 20 70  <string, bool> p
23cb0 61 69 72 20 3d 20 63 6c 69 65 6e 74 44 61 74 61  air = clientData
23cc0 20 61 73 20 41 6e 79 50 61 69 72 3c 73 74 72 69   as AnyPair<stri
23cd0 6e 67 2c 20 62 6f 6f 6c 3e 3b 0d 0a 0d 0a 20 20  ng, bool>;....  
23ce0 20 20 20 20 20 20 20 20 20 20 69 66 20 28 70 61            if (pa
23cf0 69 72 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  ir == null)..   
23d00 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
23d10 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
23d20 72 20 3d 20 22 69 6e 76 61 6c 69 64 20 56 53 20  r = "invalid VS 
23d30 63 61 6c 6c 62 61 63 6b 20 64 61 74 61 22 3b 0d  callback data";.
23d40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23d50 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a   return false;..
23d60 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
23d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
23d80 28 70 61 69 72 2e 59 29 0d 0a 20 20 20 20 20 20  (pair.Y)..      
23d90 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
23da0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
23db0 41 64 64 56 73 50 61 63 6b 61 67 65 28 0d 0a 20  AddVsPackage(.. 
23dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23dd0 20 20 20 72 6f 6f 74 4b 65 79 2c 20 76 73 56 65     rootKey, vsVe
23de0 72 73 69 6f 6e 2c 20 70 61 63 6b 61 67 65 49 64  rsion, packageId
23df0 2c 20 73 65 72 76 69 63 65 49 64 2c 20 70 61 69  , serviceId, pai
23e00 72 2e 58 2c 20 77 68 61 74 49 66 2c 0d 0a 20 20  r.X, whatIf,..  
23e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e20 20 20 76 65 72 62 6f 73 65 2c 20 72 65 66 20 65    verbose, ref e
23e30 72 72 6f 72 29 3b 0d 0a 20 20 20 20 20 20 20 20  rror);..        
23e40 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
23e50 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20     else..       
23e60 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
23e70 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 52          return R
23e80 65 6d 6f 76 65 56 73 50 61 63 6b 61 67 65 28 0d  emoveVsPackage(.
23e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23ea0 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20 76 73       rootKey, vs
23eb0 56 65 72 73 69 6f 6e 2c 20 70 61 63 6b 61 67 65  Version, package
23ec0 49 64 2c 20 73 65 72 76 69 63 65 49 64 2c 20 77  Id, serviceId, w
23ed0 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 2c 0d  hatIf, verbose,.
23ee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23ef0 20 20 20 20 20 72 65 66 20 65 72 72 6f 72 29 3b       ref error);
23f00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
23f10 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
23f20 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a      #endregion..
23f30 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69          #endregi
23f40 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  on....        //
23f50 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23f60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23f70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23f80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23f90 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
23fa0 20 23 72 65 67 69 6f 6e 20 41 70 70 6c 69 63 61   #region Applica
23fb0 74 69 6f 6e 20 45 6e 74 72 79 20 50 6f 69 6e 74  tion Entry Point
23fc0 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74  ..        privat
23fd0 65 20 73 74 61 74 69 63 20 69 6e 74 20 4d 61 69  e static int Mai
23fe0 6e 28 73 74 72 69 6e 67 5b 5d 20 61 72 67 73 29  n(string[] args)
23ff0 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
24000 20 20 20 20 20 20 20 20 20 43 6f 6e 66 69 67 75           Configu
24010 72 61 74 69 6f 6e 20 63 6f 6e 66 69 67 75 72 61  ration configura
24020 74 69 6f 6e 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20  tion = null;..  
24030 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
24040 20 65 72 72 6f 72 20 3d 20 6e 75 6c 6c 3b 0d 0a   error = null;..
24050 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
24060 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
24070 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
24080 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
24090 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
240a0 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  /....           
240b0 20 23 72 65 67 69 6f 6e 20 43 6f 6d 6d 61 6e 64   #region Command
240c0 20 4c 69 6e 65 20 50 72 6f 63 65 73 73 69 6e 67   Line Processing
240d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
240e0 20 28 21 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e   (!Configuration
240f0 2e 46 72 6f 6d 41 72 67 73 28 0d 0a 20 20 20 20  .FromArgs(..    
24100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24110 61 72 67 73 2c 20 74 72 75 65 2c 20 72 65 66 20  args, true, ref 
24120 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2c 20 72  configuration, r
24130 65 66 20 65 72 72 6f 72 29 20 7c 7c 0d 0a 20 20  ef error) ||..  
24140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 43                !C
24150 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 50 72 6f  onfiguration.Pro
24160 63 65 73 73 28 0d 0a 20 20 20 20 20 20 20 20 20  cess(..         
24170 20 20 20 20 20 20 20 20 20 20 20 61 72 67 73 2c             args,
24180 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2c 20   configuration, 
24190 74 72 75 65 2c 20 72 65 66 20 65 72 72 6f 72 29  true, ref error)
241a0 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
241b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
241c0 20 20 54 72 61 63 65 4f 70 73 2e 53 68 6f 77 4d    TraceOps.ShowM
241d0 65 73 73 61 67 65 28 0d 0a 20 20 20 20 20 20 20  essage(..       
241e0 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61               Tra
241f0 63 65 50 72 69 6f 72 69 74 79 2e 48 69 67 68 65  cePriority.Highe
24200 73 74 2c 20 74 72 61 63 65 43 61 6c 6c 62 61 63  st, traceCallbac
24210 6b 2c 20 74 68 69 73 41 73 73 65 6d 62 6c 79 2c  k, thisAssembly,
24220 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24230 20 20 20 20 20 20 65 72 72 6f 72 2c 20 74 72 61        error, tra
24240 63 65 43 61 74 65 67 6f 72 79 2c 20 4d 65 73 73  ceCategory, Mess
24250 61 67 65 42 6f 78 42 75 74 74 6f 6e 73 2e 4f 4b  ageBoxButtons.OK
24260 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
24270 20 20 20 20 20 20 20 4d 65 73 73 61 67 65 42 6f         MessageBo
24280 78 49 63 6f 6e 2e 45 72 72 6f 72 29 3b 0d 0a 0d  xIcon.Error);...
24290 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
242a0 20 72 65 74 75 72 6e 20 31 3b 0d 0a 20 20 20 20   return 1;..    
242b0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
242c0 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
242d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
242e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
242f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
24300 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
24310 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 69 74              Init
24320 69 61 6c 69 7a 65 41 6c 6c 46 72 61 6d 65 77 6f  ializeAllFramewo
24330 72 6b 73 28 63 6f 6e 66 69 67 75 72 61 74 69 6f  rks(configuratio
24340 6e 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n);..           
24350 20 49 6e 69 74 69 61 6c 69 7a 65 41 6c 6c 56 73   InitializeAllVs
24360 56 65 72 73 69 6f 6e 73 28 63 6f 6e 66 69 67 75  Versions(configu
24370 72 61 74 69 6f 6e 29 3b 0d 0a 20 20 20 20 20 20  ration);..      
24380 20 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e        #endregion
24390 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
243a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
243b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
243c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
243d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
243e0 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
243f0 20 20 20 41 73 73 65 6d 62 6c 79 4e 61 6d 65 20     AssemblyName 
24400 61 73 73 65 6d 62 6c 79 4e 61 6d 65 20 3d 20 41  assemblyName = A
24410 73 73 65 6d 62 6c 79 4e 61 6d 65 2e 47 65 74 41  ssemblyName.GetA
24420 73 73 65 6d 62 6c 79 4e 61 6d 65 28 0d 0a 20 20  ssemblyName(..  
24430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
24440 6e 66 69 67 75 72 61 74 69 6f 6e 2e 43 6f 72 65  nfiguration.Core
24450 46 69 6c 65 4e 61 6d 65 29 3b 20 2f 2a 20 74 68  FileName); /* th
24460 72 6f 77 20 2a 2f 0d 0a 0d 0a 20 20 20 20 20 20  row */....      
24470 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
24480 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
24490 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
244a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
244b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
244c0 20 20 20 20 20 20 20 20 20 41 6e 79 50 61 69 72           AnyPair
244d0 3c 73 74 72 69 6e 67 2c 20 62 6f 6f 6c 3e 20 64  <string, bool> d
244e0 69 72 65 63 74 6f 72 79 50 61 69 72 20 3d 20 6e  irectoryPair = n
244f0 65 77 20 41 6e 79 50 61 69 72 3c 73 74 72 69 6e  ew AnyPair<strin
24500 67 2c 20 62 6f 6f 6c 3e 28 0d 0a 20 20 20 20 20  g, bool>(..     
24510 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69             confi
24520 67 75 72 61 74 69 6f 6e 2e 44 69 72 65 63 74 6f  guration.Directo
24530 72 79 2c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ry, configuratio
24540 6e 2e 49 6e 73 74 61 6c 6c 29 3b 0d 0a 0d 0a 20  n.Install);.... 
24550 20 20 20 20 20 20 20 20 20 20 20 41 6e 79 50 61             AnyPa
24560 69 72 3c 73 74 72 69 6e 67 2c 20 62 6f 6f 6c 3e  ir<string, bool>
24570 20 66 69 6c 65 4e 61 6d 65 50 61 69 72 20 3d 20   fileNamePair = 
24580 6e 65 77 20 41 6e 79 50 61 69 72 3c 73 74 72 69  new AnyPair<stri
24590 6e 67 2c 20 62 6f 6f 6c 3e 28 0d 0a 20 20 20 20  ng, bool>(..    
245a0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66              conf
245b0 69 67 75 72 61 74 69 6f 6e 2e 44 65 73 69 67 6e  iguration.Design
245c0 65 72 46 69 6c 65 4e 61 6d 65 2c 20 63 6f 6e 66  erFileName, conf
245d0 69 67 75 72 61 74 69 6f 6e 2e 49 6e 73 74 61 6c  iguration.Instal
245e0 6c 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  l);....         
245f0 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
24600 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
24610 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
24620 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
24630 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
24640 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 2e 4e        #region .N
24650 45 54 20 47 41 43 20 49 6e 73 74 61 6c 6c 2f 52  ET GAC Install/R
24660 65 6d 6f 76 65 0d 0a 20 20 20 20 20 20 20 20 20  emove..         
24670 20 20 20 69 66 20 28 63 6f 6e 66 69 67 75 72 61     if (configura
24680 74 69 6f 6e 2e 48 61 73 46 6c 61 67 73 28 49 6e  tion.HasFlags(In
24690 73 74 61 6c 6c 46 6c 61 67 73 2e 47 41 43 2c 20  stallFlags.GAC, 
246a0 74 72 75 65 29 29 0d 0a 20 20 20 20 20 20 20 20  true))..        
246b0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
246c0 20 20 20 20 20 20 20 50 75 62 6c 69 73 68 20 70         Publish p
246d0 75 62 6c 69 73 68 20 3d 20 6e 65 77 20 50 75 62  ublish = new Pub
246e0 6c 69 73 68 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  lish();....     
246f0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63             if (c
24700 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 49 6e 73  onfiguration.Ins
24710 74 61 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  tall)..         
24720 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
24730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
24740 20 28 21 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   (!configuration
24750 2e 57 68 61 74 49 66 29 0d 0a 20 20 20 20 20 20  .WhatIf)..      
24760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24770 20 20 70 75 62 6c 69 73 68 2e 47 61 63 49 6e 73    publish.GacIns
24780 74 61 6c 6c 28 63 6f 6e 66 69 67 75 72 61 74 69  tall(configurati
24790 6f 6e 2e 43 6f 72 65 46 69 6c 65 4e 61 6d 65 29  on.CoreFileName)
247a0 3b 20 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a 0d  ; /* throw */...
247b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
247c0 20 20 20 20 20 54 72 61 63 65 4f 70 73 2e 54 72       TraceOps.Tr
247d0 61 63 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ace(..          
247e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72                Tr
247f0 61 63 65 50 72 69 6f 72 69 74 79 2e 48 69 67 68  acePriority.High
24800 65 73 74 2c 20 74 72 61 63 65 43 61 6c 6c 62 61  est, traceCallba
24810 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61  ck, String.Forma
24820 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t(..            
24830 20 20 20 20 20 20 20 20 20 20 20 20 22 47 61 63              "Gac
24840 49 6e 73 74 61 6c 6c 3a 20 61 73 73 65 6d 62 6c  Install: assembl
24850 79 50 61 74 68 20 3d 20 7b 30 7d 22 2c 0d 0a 20  yPath = {0}",.. 
24860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24870 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61         configura
24880 74 69 6f 6e 2e 43 6f 72 65 46 69 6c 65 4e 61 6d  tion.CoreFileNam
24890 65 29 2c 20 74 72 61 63 65 43 61 74 65 67 6f 72  e), traceCategor
248a0 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  y);....         
248b0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
248c0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 57 68  configuration.Wh
248d0 61 74 49 66 29 0d 0a 20 20 20 20 20 20 20 20 20  atIf)..         
248e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
248f0 75 62 6c 69 73 68 2e 47 61 63 49 6e 73 74 61 6c  ublish.GacInstal
24900 6c 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  l(configuration.
24910 4c 69 6e 71 46 69 6c 65 4e 61 6d 65 29 3b 20 2f  LinqFileName); /
24920 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a 0d 0a 20 20  * throw */....  
24930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24940 20 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63 65    TraceOps.Trace
24950 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
24960 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65             Trace
24970 50 72 69 6f 72 69 74 79 2e 48 69 67 68 65 73 74  Priority.Highest
24980 2c 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c  , traceCallback,
24990 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d   String.Format(.
249a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
249b0 20 20 20 20 20 20 20 20 20 22 47 61 63 49 6e 73           "GacIns
249c0 74 61 6c 6c 3a 20 61 73 73 65 6d 62 6c 79 50 61  tall: assemblyPa
249d0 74 68 20 3d 20 7b 30 7d 22 2c 0d 0a 20 20 20 20  th = {0}",..    
249e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249f0 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f      configuratio
24a00 6e 2e 4c 69 6e 71 46 69 6c 65 4e 61 6d 65 29 2c  n.LinqFileName),
24a10 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b   traceCategory);
24a20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24a30 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
24a40 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20       else..     
24a50 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
24a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a70 20 20 69 66 20 28 21 63 6f 6e 66 69 67 75 72 61    if (!configura
24a80 74 69 6f 6e 2e 57 68 61 74 49 66 29 0d 0a 20 20  tion.WhatIf)..  
24a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24aa0 20 20 20 20 20 20 70 75 62 6c 69 73 68 2e 47 61        publish.Ga
24ab0 63 52 65 6d 6f 76 65 28 63 6f 6e 66 69 67 75 72  cRemove(configur
24ac0 61 74 69 6f 6e 2e 4c 69 6e 71 46 69 6c 65 4e 61  ation.LinqFileNa
24ad0 6d 65 29 3b 20 2f 2a 20 74 68 72 6f 77 20 2a 2f  me); /* throw */
24ae0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
24af0 20 20 20 20 20 20 20 20 54 72 61 63 65 4f 70 73          TraceOps
24b00 2e 54 72 61 63 65 28 0d 0a 20 20 20 20 20 20 20  .Trace(..       
24b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b20 20 54 72 61 63 65 50 72 69 6f 72 69 74 79 2e 48   TracePriority.H
24b30 69 67 68 65 73 74 2c 20 74 72 61 63 65 43 61 6c  ighest, traceCal
24b40 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f  lback, String.Fo
24b50 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20  rmat(..         
24b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
24b70 47 61 63 52 65 6d 6f 76 65 3a 20 61 73 73 65 6d  GacRemove: assem
24b80 62 6c 79 50 61 74 68 20 3d 20 7b 30 7d 22 2c 0d  blyPath = {0}",.
24b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24ba0 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75           configu
24bb0 72 61 74 69 6f 6e 2e 4c 69 6e 71 46 69 6c 65 4e  ration.LinqFileN
24bc0 61 6d 65 29 2c 20 74 72 61 63 65 43 61 74 65 67  ame), traceCateg
24bd0 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ory);....       
24be0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
24bf0 28 21 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  (!configuration.
24c00 57 68 61 74 49 66 29 0d 0a 20 20 20 20 20 20 20  WhatIf)..       
24c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c20 20 70 75 62 6c 69 73 68 2e 47 61 63 52 65 6d 6f   publish.GacRemo
24c30 76 65 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ve(configuration
24c40 2e 43 6f 72 65 46 69 6c 65 4e 61 6d 65 29 3b 20  .CoreFileName); 
24c50 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a 0d 0a 20  /* throw */.... 
24c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c70 20 20 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63     TraceOps.Trac
24c80 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e(..            
24c90 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63              Trac
24ca0 65 50 72 69 6f 72 69 74 79 2e 48 69 67 68 65 73  ePriority.Highes
24cb0 74 2c 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b  t, traceCallback
24cc0 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  , String.Format(
24cd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24ce0 20 20 20 20 20 20 20 20 20 20 22 47 61 63 52 65            "GacRe
24cf0 6d 6f 76 65 3a 20 61 73 73 65 6d 62 6c 79 50 61  move: assemblyPa
24d00 74 68 20 3d 20 7b 30 7d 22 2c 0d 0a 20 20 20 20  th = {0}",..    
24d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f      configuratio
24d30 6e 2e 43 6f 72 65 46 69 6c 65 4e 61 6d 65 29 2c  n.CoreFileName),
24d40 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b   traceCategory);
24d50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24d60 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
24d70 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
24d80 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20  #endregion....  
24d90 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
24da0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
24db0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
24dc0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
24dd0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
24de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 72 65  .            #re
24df0 67 69 6f 6e 20 2e 4e 45 54 20 41 73 73 65 6d 62  gion .NET Assemb
24e00 6c 79 46 6f 6c 64 65 72 73 0d 0a 20 20 20 20 20  lyFolders..     
24e10 20 20 20 20 20 20 20 69 66 20 28 63 6f 6e 66 69         if (confi
24e20 67 75 72 61 74 69 6f 6e 2e 48 61 73 46 6c 61 67  guration.HasFlag
24e30 73 28 49 6e 73 74 61 6c 6c 46 6c 61 67 73 2e 41  s(InstallFlags.A
24e40 73 73 65 6d 62 6c 79 46 6f 6c 64 65 72 73 2c 20  ssemblyFolders, 
24e50 74 72 75 65 29 29 0d 0a 20 20 20 20 20 20 20 20  true))..        
24e60 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
24e70 20 20 20 20 20 20 20 69 66 20 28 21 46 6f 72 45         if (!ForE
24e80 61 63 68 46 72 61 6d 65 77 6f 72 6b 52 65 67 69  achFrameworkRegi
24e90 73 74 72 79 28 50 72 6f 63 65 73 73 41 73 73 65  stry(ProcessAsse
24ea0 6d 62 6c 79 46 6f 6c 64 65 72 73 2c 0d 0a 20 20  mblyFolders,..  
24eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ec0 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 50        directoryP
24ed0 61 69 72 2c 20 63 6f 6e 66 69 67 75 72 61 74 69  air, configurati
24ee0 6f 6e 2e 57 68 61 74 49 66 2c 0d 0a 20 20 20 20  on.WhatIf,..    
24ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f00 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f      configuratio
24f10 6e 2e 56 65 72 62 6f 73 65 2c 20 72 65 66 20 65  n.Verbose, ref e
24f20 72 72 6f 72 29 29 0d 0a 20 20 20 20 20 20 20 20  rror))..        
24f30 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
24f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
24f50 72 61 63 65 4f 70 73 2e 53 68 6f 77 4d 65 73 73  raceOps.ShowMess
24f60 61 67 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20  age(..          
24f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72                Tr
24f80 61 63 65 50 72 69 6f 72 69 74 79 2e 48 69 67 68  acePriority.High
24f90 65 73 74 2c 20 74 72 61 63 65 43 61 6c 6c 62 61  est, traceCallba
24fa0 63 6b 2c 20 6e 75 6c 6c 2c 0d 0a 20 20 20 20 20  ck, null,..     
24fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fc0 20 20 20 65 72 72 6f 72 2c 20 74 72 61 63 65 43     error, traceC
24fd0 61 74 65 67 6f 72 79 2c 20 4d 65 73 73 61 67 65  ategory, Message
24fe0 42 6f 78 42 75 74 74 6f 6e 73 2e 4f 4b 2c 0d 0a  BoxButtons.OK,..
24ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25000 20 20 20 20 20 20 20 20 4d 65 73 73 61 67 65 42          MessageB
25010 6f 78 49 63 6f 6e 2e 45 72 72 6f 72 29 3b 0d 0a  oxIcon.Error);..
25020 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25030 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0d        return 1;.
25040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25050 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
25060 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  }..            #
25070 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20  endregion....   
25080 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
25090 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
250a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
250b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
250c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
250d0 20 20 20 20 20 20 20 20 20 20 20 20 23 72 65 67              #reg
250e0 69 6f 6e 20 2e 4e 45 54 20 44 62 50 72 6f 76 69  ion .NET DbProvi
250f0 64 65 72 46 61 63 74 6f 72 79 0d 0a 20 20 20 20  derFactory..    
25100 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 6e 66          if (conf
25110 69 67 75 72 61 74 69 6f 6e 2e 48 61 73 46 6c 61  iguration.HasFla
25120 67 73 28 49 6e 73 74 61 6c 6c 46 6c 61 67 73 2e  gs(InstallFlags.
25130 44 62 50 72 6f 76 69 64 65 72 46 61 63 74 6f 72  DbProviderFactor
25140 79 2c 20 74 72 75 65 29 29 0d 0a 20 20 20 20 20  y, true))..     
25150 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
25160 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 73            bool s
25170 61 76 65 64 20 3d 20 66 61 6c 73 65 3b 0d 0a 0d  aved = false;...
25180 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25190 20 69 66 20 28 21 46 6f 72 45 61 63 68 46 72 61   if (!ForEachFra
251a0 6d 65 77 6f 72 6b 43 6f 6e 66 69 67 28 50 72 6f  meworkConfig(Pro
251b0 63 65 73 73 44 62 50 72 6f 76 69 64 65 72 46 61  cessDbProviderFa
251c0 63 74 6f 72 79 2c 0d 0a 20 20 20 20 20 20 20 20  ctory,..        
251d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251e0 49 6e 76 61 72 69 61 6e 74 4e 61 6d 65 2c 20 50  InvariantName, P
251f0 72 6f 76 69 64 65 72 4e 61 6d 65 2c 20 44 65 73  roviderName, Des
25200 63 72 69 70 74 69 6f 6e 2c 0d 0a 20 20 20 20 20  cription,..     
25210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25220 20 20 20 46 61 63 74 6f 72 79 54 79 70 65 4e 61     FactoryTypeNa
25230 6d 65 2c 20 61 73 73 65 6d 62 6c 79 4e 61 6d 65  me, assemblyName
25240 2c 20 64 69 72 65 63 74 6f 72 79 50 61 69 72 2c  , directoryPair,
25250 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25260 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69 67            config
25270 75 72 61 74 69 6f 6e 2e 57 68 61 74 49 66 2c 20  uration.WhatIf, 
25280 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 56 65  configuration.Ve
25290 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20 20  rbose,..        
252a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252b0 72 65 66 20 73 61 76 65 64 2c 20 72 65 66 20 65  ref saved, ref e
252c0 72 72 6f 72 29 29 0d 0a 20 20 20 20 20 20 20 20  rror))..        
252d0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
252e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
252f0 72 61 63 65 4f 70 73 2e 53 68 6f 77 4d 65 73 73  raceOps.ShowMess
25300 61 67 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20  age(..          
25310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72                Tr
25320 61 63 65 50 72 69 6f 72 69 74 79 2e 48 69 67 68  acePriority.High
25330 65 73 74 2c 20 74 72 61 63 65 43 61 6c 6c 62 61  est, traceCallba
25340 63 6b 2c 20 6e 75 6c 6c 2c 0d 0a 20 20 20 20 20  ck, null,..     
25350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25360 20 20 20 65 72 72 6f 72 2c 20 74 72 61 63 65 43     error, traceC
25370 61 74 65 67 6f 72 79 2c 20 4d 65 73 73 61 67 65  ategory, Message
25380 42 6f 78 42 75 74 74 6f 6e 73 2e 4f 4b 2c 0d 0a  BoxButtons.OK,..
25390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253a0 20 20 20 20 20 20 20 20 4d 65 73 73 61 67 65 42          MessageB
253b0 6f 78 49 63 6f 6e 2e 45 72 72 6f 72 29 3b 0d 0a  oxIcon.Error);..
253c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
253d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0d        return 1;.
253e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
253f0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
25400 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  }..            #
25410 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20  endregion....   
25420 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
25430 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
25440 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
25450 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
25460 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
25470 20 20 20 20 20 20 20 20 20 20 20 20 23 72 65 67              #reg
25480 69 6f 6e 20 56 53 20 50 61 63 6b 61 67 65 0d 0a  ion VS Package..
25490 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
254a0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 48 61  configuration.Ha
254b0 73 46 6c 61 67 73 28 49 6e 73 74 61 6c 6c 46 6c  sFlags(InstallFl
254c0 61 67 73 2e 56 73 50 61 63 6b 61 67 65 2c 20 74  ags.VsPackage, t
254d0 72 75 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20  rue))..         
254e0 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
254f0 20 20 20 20 20 20 69 66 20 28 21 46 6f 72 45 61        if (!ForEa
25500 63 68 56 73 56 65 72 73 69 6f 6e 52 65 67 69 73  chVsVersionRegis
25510 74 72 79 28 50 72 6f 63 65 73 73 56 73 50 61 63  try(ProcessVsPac
25520 6b 61 67 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  kage,..         
25530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
25540 47 75 69 64 29 76 73 50 61 63 6b 61 67 65 49 64  Guid)vsPackageId
25550 2c 20 28 47 75 69 64 29 76 73 53 65 72 76 69 63  , (Guid)vsServic
25560 65 49 64 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  eId,..          
25570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 47                (G
25580 75 69 64 29 76 73 44 61 74 61 53 6f 75 72 63 65  uid)vsDataSource
25590 73 49 64 2c 20 28 47 75 69 64 29 76 73 44 61 74  sId, (Guid)vsDat
255a0 61 50 72 6f 76 69 64 65 72 49 64 2c 0d 0a 20 20  aProviderId,..  
255b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255c0 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 50 61        fileNamePa
255d0 69 72 2c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ir, configuratio
255e0 6e 2e 57 68 61 74 49 66 2c 0d 0a 20 20 20 20 20  n.WhatIf,..     
255f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25600 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e     configuration
25610 2e 56 65 72 62 6f 73 65 2c 20 72 65 66 20 65 72  .Verbose, ref er
25620 72 6f 72 29 29 0d 0a 20 20 20 20 20 20 20 20 20  ror))..         
25630 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
25640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72                Tr
25650 61 63 65 4f 70 73 2e 53 68 6f 77 4d 65 73 73 61  aceOps.ShowMessa
25660 67 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ge(..           
25670 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61               Tra
25680 63 65 50 72 69 6f 72 69 74 79 2e 48 69 67 68 65  cePriority.Highe
25690 73 74 2c 20 74 72 61 63 65 43 61 6c 6c 62 61 63  st, traceCallbac
256a0 6b 2c 20 6e 75 6c 6c 2c 0d 0a 20 20 20 20 20 20  k, null,..      
256b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256c0 20 20 65 72 72 6f 72 2c 20 74 72 61 63 65 43 61    error, traceCa
256d0 74 65 67 6f 72 79 2c 20 4d 65 73 73 61 67 65 42  tegory, MessageB
256e0 6f 78 42 75 74 74 6f 6e 73 2e 4f 4b 2c 0d 0a 20  oxButtons.OK,.. 
256f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25700 20 20 20 20 20 20 20 4d 65 73 73 61 67 65 42 6f         MessageBo
25710 78 49 63 6f 6e 2e 45 72 72 6f 72 29 3b 0d 0a 0d  xIcon.Error);...
25720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25730 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0d 0a       return 1;..
25740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25750 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
25760 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 65  ..            #e
25770 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20  ndregion....    
25780 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
25790 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
257a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
257b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
257c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
257d0 20 20 20 20 20 20 20 20 20 20 20 23 72 65 67 69             #regi
257e0 6f 6e 20 56 53 20 44 61 74 61 53 6f 75 72 63 65  on VS DataSource
257f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
25800 20 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e   (configuration.
25810 48 61 73 46 6c 61 67 73 28 49 6e 73 74 61 6c 6c  HasFlags(Install
25820 46 6c 61 67 73 2e 56 73 44 61 74 61 53 6f 75 72  Flags.VsDataSour
25830 63 65 2c 20 74 72 75 65 29 29 0d 0a 20 20 20 20  ce, true))..    
25840 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
25850 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
25860 46 6f 72 45 61 63 68 56 73 56 65 72 73 69 6f 6e  ForEachVsVersion
25870 52 65 67 69 73 74 72 79 28 50 72 6f 63 65 73 73  Registry(Process
25880 56 73 44 61 74 61 53 6f 75 72 63 65 2c 0d 0a 20  VsDataSource,.. 
25890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258a0 20 20 20 20 20 20 20 28 47 75 69 64 29 76 73 50         (Guid)vsP
258b0 61 63 6b 61 67 65 49 64 2c 20 28 47 75 69 64 29  ackageId, (Guid)
258c0 76 73 53 65 72 76 69 63 65 49 64 2c 0d 0a 20 20  vsServiceId,..  
258d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258e0 20 20 20 20 20 20 28 47 75 69 64 29 76 73 44 61        (Guid)vsDa
258f0 74 61 53 6f 75 72 63 65 73 49 64 2c 20 28 47 75  taSourcesId, (Gu
25900 69 64 29 76 73 44 61 74 61 50 72 6f 76 69 64 65  id)vsDataProvide
25910 72 49 64 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  rId,..          
25920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
25930 6c 65 4e 61 6d 65 50 61 69 72 2c 20 63 6f 6e 66  leNamePair, conf
25940 69 67 75 72 61 74 69 6f 6e 2e 57 68 61 74 49 66  iguration.WhatIf
25950 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
25960 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69             confi
25970 67 75 72 61 74 69 6f 6e 2e 56 65 72 62 6f 73 65  guration.Verbose
25980 2c 20 72 65 66 20 65 72 72 6f 72 29 29 0d 0a 20  , ref error)).. 
25990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
259a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
259b0 20 20 20 20 20 20 54 72 61 63 65 4f 70 73 2e 53        TraceOps.S
259c0 68 6f 77 4d 65 73 73 61 67 65 28 0d 0a 20 20 20  howMessage(..   
259d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259e0 20 20 20 20 20 54 72 61 63 65 50 72 69 6f 72 69       TracePriori
259f0 74 79 2e 48 69 67 68 65 73 74 2c 20 74 72 61 63  ty.Highest, trac
25a00 65 43 61 6c 6c 62 61 63 6b 2c 20 6e 75 6c 6c 2c  eCallback, null,
25a10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25a20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 2c            error,
25a30 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 2c 20   traceCategory, 
25a40 4d 65 73 73 61 67 65 42 6f 78 42 75 74 74 6f 6e  MessageBoxButton
25a50 73 2e 4f 4b 2c 0d 0a 20 20 20 20 20 20 20 20 20  s.OK,..         
25a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d                 M
25a70 65 73 73 61 67 65 42 6f 78 49 63 6f 6e 2e 45 72  essageBoxIcon.Er
25a80 72 6f 72 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ror);....       
25a90 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
25aa0 75 72 6e 20 31 3b 0d 0a 20 20 20 20 20 20 20 20  urn 1;..        
25ab0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
25ac0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
25ad0 20 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e        #endregion
25ae0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
25af0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
25b00 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
25b10 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
25b20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
25b30 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
25b40 20 20 20 23 72 65 67 69 6f 6e 20 56 53 20 44 61     #region VS Da
25b50 74 61 50 72 6f 76 69 64 65 72 0d 0a 20 20 20 20  taProvider..    
25b60 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 6e 66          if (conf
25b70 69 67 75 72 61 74 69 6f 6e 2e 48 61 73 46 6c 61  iguration.HasFla
25b80 67 73 28 49 6e 73 74 61 6c 6c 46 6c 61 67 73 2e  gs(InstallFlags.
25b90 56 73 44 61 74 61 50 72 6f 76 69 64 65 72 2c 20  VsDataProvider, 
25ba0 74 72 75 65 29 29 0d 0a 20 20 20 20 20 20 20 20  true))..        
25bb0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
25bc0 20 20 20 20 20 20 20 69 66 20 28 21 46 6f 72 45         if (!ForE
25bd0 61 63 68 56 73 56 65 72 73 69 6f 6e 52 65 67 69  achVsVersionRegi
25be0 73 74 72 79 28 50 72 6f 63 65 73 73 56 73 44 61  stry(ProcessVsDa
25bf0 74 61 50 72 6f 76 69 64 65 72 2c 0d 0a 20 20 20  taProvider,..   
25c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c10 20 20 20 20 20 28 47 75 69 64 29 76 73 50 61 63       (Guid)vsPac
25c20 6b 61 67 65 49 64 2c 20 28 47 75 69 64 29 76 73  kageId, (Guid)vs
25c30 53 65 72 76 69 63 65 49 64 2c 0d 0a 20 20 20 20  ServiceId,..    
25c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c50 20 20 20 20 28 47 75 69 64 29 76 73 44 61 74 61      (Guid)vsData
25c60 53 6f 75 72 63 65 73 49 64 2c 20 28 47 75 69 64  SourcesId, (Guid
25c70 29 76 73 44 61 74 61 50 72 6f 76 69 64 65 72 49  )vsDataProviderI
25c80 64 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d,..            
25c90 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
25ca0 4e 61 6d 65 50 61 69 72 2c 20 63 6f 6e 66 69 67  NamePair, config
25cb0 75 72 61 74 69 6f 6e 2e 57 68 61 74 49 66 2c 0d  uration.WhatIf,.
25cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25cd0 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75           configu
25ce0 72 61 74 69 6f 6e 2e 56 65 72 62 6f 73 65 2c 20  ration.Verbose, 
25cf0 72 65 66 20 65 72 72 6f 72 29 29 0d 0a 20 20 20  ref error))..   
25d00 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
25d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d20 20 20 20 20 54 72 61 63 65 4f 70 73 2e 53 68 6f      TraceOps.Sho
25d30 77 4d 65 73 73 61 67 65 28 0d 0a 20 20 20 20 20  wMessage(..     
25d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d50 20 20 20 54 72 61 63 65 50 72 69 6f 72 69 74 79     TracePriority
25d60 2e 48 69 67 68 65 73 74 2c 20 74 72 61 63 65 43  .Highest, traceC
25d70 61 6c 6c 62 61 63 6b 2c 20 6e 75 6c 6c 2c 0d 0a  allback, null,..
25d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d90 20 20 20 20 20 20 20 20 65 72 72 6f 72 2c 20 74          error, t
25da0 72 61 63 65 43 61 74 65 67 6f 72 79 2c 20 4d 65  raceCategory, Me
25db0 73 73 61 67 65 42 6f 78 42 75 74 74 6f 6e 73 2e  ssageBoxButtons.
25dc0 4f 4b 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  OK,..           
25dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 65 73               Mes
25de0 73 61 67 65 42 6f 78 49 63 6f 6e 2e 45 72 72 6f  sageBoxIcon.Erro
25df0 72 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  r);....         
25e00 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
25e10 6e 20 31 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  n 1;..          
25e20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
25e30 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
25e40 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a      #endregion..
25e50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
25e60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
25e70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
25e80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
25e90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
25ea0 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  /....           
25eb0 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63 65 28   TraceOps.Trace(
25ec0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25ed0 20 20 54 72 61 63 65 50 72 69 6f 72 69 74 79 2e    TracePriority.
25ee0 48 69 67 68 65 72 2c 20 74 72 61 63 65 43 61 6c  Higher, traceCal
25ef0 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f  lback, String.Fo
25f00 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20  rmat(..         
25f10 20 20 20 20 20 20 20 22 73 75 62 4b 65 79 73 43         "subKeysC
25f20 72 65 61 74 65 64 20 3d 20 7b 30 7d 2c 20 73 75  reated = {0}, su
25f30 62 4b 65 79 73 44 65 6c 65 74 65 64 20 3d 20 7b  bKeysDeleted = {
25f40 31 7d 2c 20 22 20 2b 0d 0a 20 20 20 20 20 20 20  1}, " +..       
25f50 20 20 20 20 20 20 20 20 20 22 6b 65 79 56 61 6c           "keyVal
25f60 75 65 73 53 65 74 20 3d 20 7b 32 7d 2c 20 6b 65  uesSet = {2}, ke
25f70 79 56 61 6c 75 65 73 44 65 6c 65 74 65 64 20 3d  yValuesDeleted =
25f80 20 7b 33 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20   {3}",..        
25f90 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79          Registry
25fa0 48 65 6c 70 65 72 2e 53 75 62 4b 65 79 73 43 72  Helper.SubKeysCr
25fb0 65 61 74 65 64 2c 20 52 65 67 69 73 74 72 79 48  eated, RegistryH
25fc0 65 6c 70 65 72 2e 53 75 62 4b 65 79 73 44 65 6c  elper.SubKeysDel
25fd0 65 74 65 64 2c 0d 0a 20 20 20 20 20 20 20 20 20  eted,..         
25fe0 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79 48         RegistryH
25ff0 65 6c 70 65 72 2e 4b 65 79 56 61 6c 75 65 73 53  elper.KeyValuesS
26000 65 74 2c 20 52 65 67 69 73 74 72 79 48 65 6c 70  et, RegistryHelp
26010 65 72 2e 4b 65 79 56 61 6c 75 65 73 44 65 6c 65  er.KeyValuesDele
26020 74 65 64 29 2c 0d 0a 20 20 20 20 20 20 20 20 20  ted),..         
26030 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74 65         traceCate
26040 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  gory);....      
26050 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
26060 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
26070 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
26080 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
26090 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
260a0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
260b0 30 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  0;..        }.. 
260c0 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f         #endregio
260d0 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 23 65  n..    }..    #e
260e0 6e 64 72 65 67 69 6f 6e 0d 0a 7d 0d 0a           ndregion..}..