source: tol/tolbase/lib/toltk/tolpkg_gui.tcl @ a4a32ef

1941-docker-image-to-testdevel
Last change on this file since a4a32ef was e70625a, checked in by Jorge Pérez <josp.jorge@…>, 15 years ago

refs #1191, se corrige un error en el empaquetado de -customgui y el título de la ventana de diálogo de proceso de tareas de instalación

git-svn-id: ​https://www.tol-project.org/svn/tolp/trunk@4054 be4846ae-f051-483a-831f-b64e7d08527f

  • Property mode set to 100644
File size: 66.1 KB
Line 
1package require wtree
2package require BWidget
3package require msgcat
4
5namespace eval ::TolPkgGUI {
6
7  namespace import ::msgcat::*
8
9  variable widgets
10
11  variable cwd [ file normalize [ file dir [ info script ] ] ]
12
13  variable urlmap
14
15  array set urlmap {
16    http://packages.tol-project.org/OfficialTolArchiveNetwork/repository.php OTAN
17    OTAN http://packages.tol-project.org/OfficialTolArchiveNetwork/repository.php
18    http://packages.localbayes.es/BayesPrivateTolPackages/repository.php BPTP
19    BPTP http://packages.localbayes.es/BayesPrivateTolPackages/repository.php
20  }
21 
22  variable win
23
24  variable packSyncInfo
25  variable versSyncInfo
26  variable localVersionInfo
27  variable localMostRecent
28
29  variable nodesInfo
30  variable treeParents
31
32  if { ![ info exists localInfo ] } {
33    array set localInfo {}
34  }
35
36  if { [ lsearch [ image names ] green_light ] == -1 } {
37    image create photo green_light -data {
38      R0lGODlhEAAQAOedABoaGh0eHSUlJScnJykpKUtLS0xMTFxcXFxdXF1dXWNjY0l4KUt4LEt5LU57
39      L1Z4QG1ubVd5QW9wb0iJG0mLG2yBX22BYFiQM3KEZ1eSMXaGa3OJZHSJZ3mHb4KDgYOEgoSEhISG
40      g3yKdIWGhHCRWoWHhHCTWIeIhlegJliiJnSUYF+jM3eZYY6OjmClM1+oL2CqLouXg3ufZo2YhoCh
41      bIGibZqbmpubm4mldpucm4emdZifk52dnZ2fnJ6fnI6ofZ2jmJ+inZGqgXO4UaCknpSshHS7UaSm
42      oqSmo4e4ZaqsqKSvnKutqqSxnI69bK2urHfPPLGzr3jQPIjLW7S2sn3URX3VQ4zOYLa6s4/OdYLW
43      Wbm9tYTYUILYWJHRdoTZTp/NiqDNjL3Au7/AvsDAwL/BvsHBwcDDvsPDwrfKrMTEw7nKr4riUrzK
44      sovjVL3Ls5DkXZHkX5TmaJbmZ5Xma5fmZ67anJfmaZnnbZ3ncM/Pzpzoc53odNHR0ZrqgqHpeqXo
45      eaHpe6Xoep/qgJzrhaHqgqXpg6XphNTU1K7rh9fX1q/ridfY19TjycHto9fmzcPwpcPwpsTwp9fv
46      xdfvxtnzx9X2zNr1yNb2zuL52+P53ev25Oz35P//////////////////////////////////////
47      ////////////////////////////////////////////////////////////////////////////
48      ////////////////////////////////////////////////////////////////////////////
49      ////////////////////////////////////////////////////////////////////////////
50      ////////////////////////////////////////////////////////////////////////////
51      /////////////////////////////////////////////////////yH+EUNyZWF0ZWQgd2l0aCBH
52      SU1QACH5BAEKAP8ALAAAAAAQABAAAAjfAP8JHHiDjBkeAxMO7HNmhoUKMcQgUiiQkYgHQtq8KRKh
53      gyKFejQwaLSJE6dNjxxg6DMQBJAGSShVunSp0iQnC3a0EIiGw4QpjiJJkgTJ0RUKG9QIfKICBRRA
54      iRYtSiRISgoSTAQiYfGiips6efLUYWMFhokjAnv8WMElzh08eObA+eIChw+BNpZc0EKHT6A/e+R0
55      ydAkh8ADQXQMIVTokKFBfozUIKJg4AgsNLJg0pTJkhcZW04kFOAhypowduyASUPlAwGFACCEUDKm
56      DJMSEgJQFCigAIIEBgbsHk4xIAA7
57    }
58  }
59 
60  if { [ lsearch [ image names ] ok_green_16 ] == -1 } {
61    image create photo ok_green_16 -data {
62      R0lGODlhEAAQAOelAEhfPU5hRlFiTFNiTk5oP1NmS1VlUFRmTVllWFloUlxoW15rXF1sV1dwSVpy
63      S11yUmlyaGl0ZWxzbmB6UGaET1yOMXqCeWqLUV6XLH+Ie1KhCFOhCFOiCFSiCFWiCVejDVekDFik
64      DnGWVFqkEVilDlmmD1ymFF2nFl6nGGCpGoqSimGqHHWkTnijVGyxKm6yLmm7G3O2M3W2N5qimXyz
65      SWq/GZ6jnpykm3e5OH27Qn29P36/QYS9UoLBR3DNF3HOFnLQFonFT3PSFnTSGHjTHo/HW3jUHnjU
66      H3rUIXvVJLO3s5TKYX/WKpTLXbS5tJHNV5LOWIXWNpPPWbe8t5DSUYjZOYnZOorZPLu+vY/XSIra
67      PZXUWozaQJnTYY3aQY/ZRo3aQp/Rbo7bQ4/bRJDbRpDbR5vVZJDcRpLcSZLcSpTbT5PcS5PcTJvY
68      XpTcTZvZX5TdTZTdTpbdUMHFxJfdVJfeUpjeU5rdWpneVZvdWpzdXpveWpzeW5rfV6DcZZ7dYaPb
69      a5zfWp3fW6HdaKfadZ3gXJ/fYZ/gX6DhYaHhY6fecqLhZKPhZazcfaPhZq3cf6PiZqzfe63hfKvk
70      c8/Rz63kd7Higa7kd9DS0bDlfrPkgrTkhrrmj9ja2dvb29zd3eDh4OTl4+Xm4+7v7vLy8f//////
71      ////////////////////////////////////////////////////////////////////////////
72      ////////////////////////////////////////////////////////////////////////////
73      ////////////////////////////////////////////////////////////////////////////
74      ////////////////////////////////////////////////////////////////////////////
75      /////////////////////////////////////////////////////yH+EUNyZWF0ZWQgd2l0aCBH
76      SU1QACH5BAEKAP8ALAAAAAAQABAAAAjmAP8JHPiPAweCCAV+6NHFzyAzQUYk/OdCkZsqVq5wwSNJ
77      BsIXlc6QQbMGjpwLFBrlGBjCEh48fQIVOlQEApYBnFAIXDJpkSNGixIhevDJRgtIYQQ+MiTiwBZB
78      gXhYGGWAjp1IBTexkEBJAJU6E0CpoMEmTSYPHTSpceAEU4EsC0glGCMGzCUQ/wiV+dJgihIAM+ZU
79      MJKECSAN/5rE0RIlQKcbnjLUECLkCBSBJv4MEQJDQShRDCgLuZNiYAw2lDEgiECAshcdCHHoQSLk
80      hw8gRPLsmHjiSRs+e95IWTFx4AYSJTYkDAgAOw==
81    }
82  }
83  if { [ lsearch [ image names ] yellow_light ] == -1 } {
84    image create photo yellow_light -data {
85      R0lGODlhEAAQAPcAABoaGh4eHSUlJScnJykpKX9qOUtLS0xMTFxcXF1dXF1dXWNjY25ubXBwb5ds
86      DZptDIJkH4JlIoNmI4VnJZ56JZx5J4BrOoV5W4V5XId9Y4l/aLOBFbCAFriJH7qKHrKHJbSIJOKp
87      KeOqKeexMuixMeu5POq4PpuEUZmEUpuHWaCLWqaSX46AYI2BY4qBbI2EcaiWZamWZqybbquacK6e
88      eK+ge7GifsWmQ8mpQ9mtTMOiWtywUcenYujDR+bCSfXAQPXAQfXFTPXGTvbJVvbJV/bKV/bLWPbO
89      WPbPW/fNXffOXtrDat3HavfNYffMa/fNa/fQZPfRZffUbPjUbffccvbYdvbYd/jddfjSefjTevjU
90      fPjmdfjneISDgYWEgoaFg4SEhIaFhIeGhIiIho6OjpmSgZqTg5uampubm5ycm52dnZ+enKGckqCe
91      nKWgl6KgnKSinbGrmrSsmaeloaemo6yrqK2sqa2sqq6tq7Syrre1sbu5sr67tMG/u9bEgdbEg+LT
92      lPfamfrdnPrdnc7EqM3Drs7FrM3Er8HAvcHAvsPBvsDAwMHBwcPDwsTEw8/PztHR0dLR0dTU1NjX
93      1tjY1+fcxenfyvXkwPnowfvpwvz1xvz1yP342P342fjx4vny4gAAAAAAAAAAAAAAAAAAAAAAAAAA
94      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
95      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
96      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
97      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
98      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAKAALAAAAAAQABAA
99      AAjfAEEJHIhmESM1AxMOhKTIDIYLZfpIUiiQ0osCNQodsmHBxSSFjzREqOTp0ydPliZkiDQQjBsJ
100      Oi5hypQJ0yUeENiQEdiohYMcgQQNGiQo0I4HLBwJxJOCQwgnWbRowfJExAYUdwTSUdFhBBAiTZoM
101      +UHCw4k5AtfQ+GBCiBElSYoEKQFiRhuBZ+JU8IEkyhQpUI70oCAnjUAEb2Tc4HLFShUqW3DEgLNg
102      YJg9MJZs6sRJE5MVfMYkFNAlj6E/gAD5IaTHCwGFABh8qYMokR0xDQJQFCjAQAIFBwbsHk4xIAA7
103    }
104  }
105
106  if { [ lsearch [ image names ] refresh_yellow_16 ] == -1 } {
107    image create photo refresh_yellow_16 -data {
108      R0lGODlhEAAQAMZJAI99Ob2SKdGaI9SbI8+fIOCjHbynYsSpSLypbeKmHL+qZdWsGryrd+upGdyw
109      FsaycuS0E+yzE+W3E/u0Evu1EfK4D+i7GPu3EPy4D/y4EPy6Dvy7Dfy9DPy+DP2+C/3ACv3BCv3C
110      Cf3DCP3DCf3ECP7ECOTEWfzGB/7GBv7GB/7HBv7JCP7JCf3JDP7KDPHJPf/MEP3MGf/MFPjMLf/N
111      Fv/NGv/PIf7PJf7QJ//QKv/SMv/TNv/TOP/VQ/7WR/7WSPjXaP/YU//YVf/ZWP/bZP/bZv/edf/e
112      d/7ggf//////////////////////////////////////////////////////////////////////
113      ////////////////////////////////////////////////////////////////////////////
114      /////////////////////////////////////////////////////////////////////////yH+
115      EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAH8ALAAAAAAQABAAAAdpgH+Cg4SFhoeIf0gKiYMPRkRB
116      PTo2MBKHQEM+OzcyKykjFYcvOTEtJyIfHBoBhxYAgwQZEw2NjQwIBraCR0VCB4MOEIcmPzw4NCwo
117      qRGHMzUuKiUgHRoXCYcLJCEeGxgUBbt/AgPi5o2BADs=
118    }
119  }
120
121  if { [ lsearch [ image names ] red_stop_16 ] == -1 } {
122    image create photo red_stop_16 -data {
123      R0lGODlhEAAQAOeLAKkAAKoAAKoBAasEBKsGBqwGBqsHB60ICMwAAKwJCcwCAq0NDa8PD68QEM4I
124      CMcMDLATE84MDLEUFLYbG4YpKoUrK4UtLbcjI4c0NLgnJ7srK4g7O9MnJ9QnJ7wvL5E7O7swMNQq
125      Kr4wMNUuLtUvL7w4OME3N8I4ONc0NMA7O9c1Ndc4OMU+Ptg6Otg7O9g9PcdCQtk/P9lCQshHR9pE
126      RNpFRdpGRtpHR9pISM5NTdpKSttKStpLS89OTtlMTNBPT9tNTdpPT9xPT81UVNxQUNZSUtdSUtxR
127      UdxSUtNVVd1UVNpVVc1ZWd1VVYFubtVZWYRvb91XV91YWNpZWd5YWNpbW9pgYNRlZdxmZuBmZtpr
128      a+Fra91xcd9xceJyctx2dpuIh5aKiI+NieB3d+R2duF3d56LiuJ7e6COjaOSkaaVlOSFhaiYl6eb
129      maubm6KfnKydnLKpp6+tqru+uL/CvcPFwMfJxcvNyc7QzNDSzdLU0dPV0dbY1NfY1Nrc2Nzd2d7f
130      3N/h3uLj4OPk4eXm5Obn5enq6Orr6e7u7fHy8fX19P//////////////////////////////////
131      ////////////////////////////////////////////////////////////////////////////
132      ////////////////////////////////////////////////////////////////////////////
133      ////////////////////////////////////////////////////////////////////////////
134      ////////////////////////////////////////////////////////////////////////////
135      ////////////////////////////////////////////////////////////////////////////
136      /////////////////////////////////////////////////////yH+EUNyZWF0ZWQgd2l0aCBH
137      SU1QACH5BAEKAP8ALAAAAAAQABAAAAjXAP8JHPgvQACCCAUSYJFkSpUnMxIk/HcBywsOHUKMqNHF
138      A8IMW1CoWNHiRQwZNsikGGhgDI0aN3YAIYKkCZUoaxoIZJKlSZQoTZQgOUJECBApVwR+QQIFjhs2
139      atKgMQPGCQwuBc/giKMoEaJDhQYF+iOnhBcBAcrEaGOIkCBAfvrsyfMGxJYB/7SoCMNHD547durQ
140      mSNmghUA/4a8+LABg4UKkCFTeNBD4IIlChBo3rzZB4SBGlxw5kzCBEIRQSJwdsDjxEQGOYoA0WHk
141      h4SJAwEUOIAYYUAAOw==
142    }
143  }
144
145  if { [ lsearch [ image names ] yellow_stop_16 ] == -1 } {
146    image create photo yellow_stop_16 -data {
147      R0lGODlhEAAQAOeQAIWFbpSLK4iIb5SMLZaNKpSNNJWOO5+WO5CTiZiaiZ6fh6GiiqOkjcqnDaKl
148      nMqoDcuoDcupDMupDaankcupE8yqEMuqE8yrEsyrFqiplKmpmc2sFM2sGs6uGs2uHausl8+vHq6u
149      m9CxIK+vnK+yqtS3LrO1p9W4MtG+G9e8NNe8OdHBMNq/ONLDOLu+uNrBRNzDP93EQL/Cvd7GR8PF
150      wODKTubPDN3NQsfJxe3UAO3UAuPPWuPPYO7VCMvNyebRUubRU+7WDOjTU87QzOnWWdDSzfDaJ+jW
151      afDbJ/DbKurYXdLU0fDcLvDcL9PV0e3aVPHdNO3bVPHdNfHdOPHeOvHeO/HePfHfP9bY1O/dW9fY
152      1PLfQu/eVu/dYfLfRfDfTPHfS/HfUO7dbfLgRPLgRfLgRvLgR/LgSO/fXPLgSvLgTfLhSvLhTfPh
153      T/PhUPDgaO7fevPiUPPiUfPiUtrc2PPiVPPiVfDgc/PjV/PjWNzd2fLjcvHjeN7f3PTlZvTla/Tm
154      a/Pled/h3vPlffTmcuLj4PbodvTohuPk4eXm5Obn5enq6Orr6e7u7fHy8fX19P//////////////
155      ////////////////////////////////////////////////////////////////////////////
156      ////////////////////////////////////////////////////////////////////////////
157      ////////////////////////////////////////////////////////////////////////////
158      ////////////////////////////////////////////////////////////////////////////
159      ////////////////////////////////////////////////////////////////////////////
160      /////////////////////////////////////////////////////yH+EUNyZWF0ZWQgd2l0aCBH
161      SU1QACH5BAEKAP8ALAAAAAAQABAAAAjWAP8JHPjvAQSCCAVSmEEkCxolNTAk/FfijRUjSJIw8bJH
162      BcITgKBImULFypUtZQy9GGiBzxgyZtawcTPHTh48hzwI5OHHDh48durMkROnDZs8RwTCmSNgRIgP
163      GSYwWKAAwI07/yAMOmPikaNGjBQhEqSHRAtCEiIEuqJhUaJCfehocVLEwYo/Ff6JkZIAy5IhPnDQ
164      kOECAYouAndYOWCgwIAAkCETsAFEIAcuOnJo3rz5C4iBKapw5twEBkIWYYJw7gEmxsQOP56oSRNF
165      iIiJBC9saJAwIAA7
166    }
167  }
168
169  if { [ lsearch [ image names ] red_light ] == -1 } {
170    image create photo red_light -data {
171      R0lGODlhEAAQAPcAABoaGh4dHSUlJScnJykpKUtLS0xMTFxcXF1cXF1dXWNjY25tbXBvb54KB4ge
172      GqEJBrgTD7sSDocgHYgiH6QkH7siHbkkHoojIIM4NoQ5NqInIsIbFsAdGOwmIO0mIPEvKPAxKfM/
173      NvQ9NMxLPdBLPf5AN/5BOPFSP55QTZxST4dbWYhcWp5YVqRZVpBgXqpgXIljYotoZoxsa5BjYY5x
174      cKtnYq1mY7Bva65wbrF3dbJ7ebR+fMhXVcxfXeFJReNOS/5ORO5TQf5QRv9XTv9YT/9aT/9bUf5f
175      UP5iU/9hVv9iVv9iWf5pXf5rXv5pZP5qZeB1ZON3Zf9yZf9yZv5/bP95c/1+cP1/cf95dP98dtuI
176      fdqKf/6Cb/+Lbv+PcoSBgYWCgoaDg4SEhIaEhIiEhImGho6OjpqBgJyDgpuampubm5ybm52dnZ+c
177      nKKRkaWXl6CcnKOcnKWdnbOambaamaehoaejo6yoqK6pqa6qqq+rq7Svrreysbyzsr+1tOadkOed
178      kPyXlPyYlf6al/6bl/+cmc+trc+urtCpptCtqsG6u8G9vcG+vsS+vve/vvi/vvzAv8DAwMHBwcPC
179      wsTDw8/OztHR0dLR0dTU1NjW1tjX1+jExOvJyP7BwP/RxP/Sxv/e1v/g2Pnh4fvh4QAAAAAAAAAA
180      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
181      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
182      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
183      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
184      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAKQALAAAAAAQABAA
185      AAjfAEkJHKgmkiQ2AxMOtNQIzQoVZxRhUihQEw0MOgwd2pFBRiaFlWJI2CRq1ChRnC7AuDRQzJsJ
186      PBxB6tQJ0qMeDtyYEThpRgMfgggVKjQo0I8HLigJ1MMCQgcnWLJkqfLEQ4QUeQTaacEBhAkiS5YM
187      KfFhA4o6AtvksBBCiBElSYoAEVEBBxyBaeZoCIKkyRQpTI6coEBnjcADcW6M8MLlihUqXUjYkKNg
188      4Jg+NaB8CgXKU5QXfsokFPBlT6ItfwBpQcQHDAGFABaEubOIER4yDAJQFCigAIIEBgbsHk4xIAA7
189    }
190  }
191 
192  if { [ lsearch [ image names ] database_refresh_32 ] == -1 } {
193    image create photo database_refresh_32 -data {
194      R0lGODlhIAAgAOf/ADRnADpsADpyAD53AEJ6BD18ADd/AEV7ADmAADKDADqBADuDAD2EAESCAD+G
195      AmtvckeFA0GHBUOJAGtzekaLAHJyh0iNAE6MD0qPAFWRB1uKO1SWAF6RM36Dhl2ZFWeUPn6GjnyI
196      iFihAIGFoIGIkGChAGWfEX2MkoeHqW6YUIWNlYOPkG2hIoePloiQmHWlAHylAJCQpnKqAHSiS46S
197      oXGkRW+kTIyUm4aWnHmlSIGqBIKrAH6tAIuaoXisLnSyAH2pS5KaonyqU4KxAJScpJWdpZaeppCg
198      pnq4AIOtY4OvUZigqIG4BX26AJmhqYKyRZmgtZOjqZmzAIurgpujq4G+AJ22AITAAJ28BKKqspS0
199      eZrAAKCsuYTHAJXCAKOstJHEAKSttZjEAKautpq0n57DAJa+Up22j47FK5rGAKSwvpvIAJ3JAK2x
200      wKqzu6qyx5/DQJnMBKK7k6HMAK+zz5zOAKHNDJ7QAKjEYaTPAJnTAKPPEqDSAK66x5XWAKHTAKy/
201      q7O7w7HLOrS70Z7XAK3RGafTGLHQKLa/x7jAyLnByZ/eALrCyrTHs7rC17vDy7zEzL3FzajgAL7G
202      z57lAL/H0L/G3LzI1sbG3cDJ0cHWVq/hLL/L2cLL08LK38PM1MnJ7cTN1azqAMTaWrLkMMbO1sjN
203      3MjM6cLdVMPP3cfP18XcY8TQ3s3N5cjQ2MbfTsnR2svP7MneXsbS4NHQ6MvT3Mjgbs/U18zV3czU
204      6tDU5M3W3tDhcMrjcM7X38rmZM/Y4NDX7c3Z59DZ4djic9LpR9fX79HpUNLa4svobdbjgdPb5Nba
205      6tPb8dTc5drb5dXd5tXmkNTohNbe59ne7tnojNfoktnd+tfg6Nvf797e9dnh6tzg8OTonOLootvj
206      7Nzsltno29zk+t3l7uTj++Hk/9/n8O3sqOPn9+Dp8eTp7OHq8ufvr+fn/+Ps9Orq/+jt8PHys+ru
207      /vXzwuzx9Ory+/Dx++7z9vb2//P4+/T5/PX6/fb7/vj+//7//P///yH+EUNyZWF0ZWQgd2l0aCBH
208      SU1QACH5BAEKAP8ALAAAAAAgACAAAAj+AP8JFHhkyRInCBMqNHhkoMOH/4xEGZPIFa505jJqzJgO
209      l6tEY5wYgTiwyBhc26ZBQ8aypUuW0KZtQzamCMl/UXbtwlWrp8+fQGvh0hnl5pFxnz6VWsq0qdNS
210      Scc1JFmE37dMjyBBisS1q1etjzJ940fFaKR7++rNVNWprdu2qpBtq5fWFBSjgRJ1QrYOnj59+QIL
211      /gtPHbJPjhJ8uGkkEaNHkTJ1KuXKF7KYyHzhYpWKU6ZLmBjoaEBVESOuk13tAoZsGrZnzJgFy0Wr
212      1SlQDIjpYADxxBjIkimvRoaNWzZhSTIgWK6AAQJlo3iQdqgiyxhFqWtZRpaNnBYPZqL+gStW7Nix
213      YtHEyBoCwWGQdWOIOHETKFInYN2BPLGGqtCePAACmMaAv1jgUA+d0LPOLYy4kQUXXLyRwhPSGBLH
214      HXxkqOEdGDJxwIGJJFIKNPDQww8//YSTQTJ/6KHHFSVQwMCMDBBCSBMDPNSDaVtl8okquDQzAxqb
215      +EFICRecAUgstzEgSRU5PhQEI6fZR5kv2iBAyiKLdHFBLrmY8gloDnQR5UMgjNFjasAIg4AolFAi
216      ghzBzFJKJpFYwsCZaFqHHWW1AAOMcggooEAjxujCSieZ9PHGCP9YQAEFFhj4zw3uxDdffZxkI047
217      77RTzjU1JDAIF06M4c5dLMzTzTnuluLwiYIMOgihGmq08QYdHMDAgCe+jGOPKTQogIc3VlgRa4gj
218      lsjPPtDuw48/SrwQDwP4kJMKGVMw4AM7gmCxQwEC3cBjZD9qx105NrxQTTWFMmcCHNZoskUZll5K
219      JWrCAfOMODnIwIsYthRsMC+rHFJGGhsIMBAOikBmpWr+koPAKwOmYcfGGw+YhxgbEOBQB0EoEpwr
220      texyGcA/8MGhhhn+AYYMFgAA0QQtBJFFII+whs036MgjBBI2MhCBBJNSAEEANw30QAgktNDCCitI
221      HYMGVUhCAQoVNO31TQN0ke/XZDt0wNhlp6322moHBAA7
222    }
223  }
224  if { [ lsearch [ image names ] install_zip_32 ] == -1 } {
225    image create photo install_zip_32 -data {
226      R0lGODlhIAAgAPcAACUmJSYoJikpJyorKD4/PFA0Clg7DEY2Gl0/Ez9BPm5EBmpECXBHCXJJC2VF
227      FWlIF2lJGHROEFdMNWtQJFBRTVpZUlxeWl9iXnpsUn5zXGJnYWlqZ21wbndwY3FybXx3and4dXt8
228      eJ9pEJJkG5hnG5loHKBmCqJoDqJtFKl0HpZpJZZrK4xpMKp1IqFzL698LLF8KaF1MqN4NopvR5F0
229      RJ58RIZ2WaB+SbaBLqmAP7WCNbWDOLuKPcaRP8+WPqWDS7WJRLiLRKeGU66LVK+PXbGPW7eRVrOR
230      WoGDf52Oda6RY7KTYbyZYr2caKuTcMeSQ82WQ8qXSsyaTtObRtSeS8OXUc+cUcacXNCfU9miTs6h
231      XNKiV9mjUdSlXdypW+CsXcOdYMmiZMikbNytZNKqa9uvad2wa9Svddy0ddi0fOGuYOa0Zum5buG1
232      cOa5c+y9dISFg4eJhYuLi52UhZSSiZSVlJeYlZiZl5eZmJydm6idjqukl6Chn6qmnqSlo6appauo
233      o6anqaepqqurqrCtpLOzramtsbS0s7i5t7u8u926hb7BvODAjcDBvvfVoPncr8XFxMfIxsnKx8vM
234      y9LPx8/QzsjL0NTU09fZ09nZ19bY29zc297g3+Dh393e4N/i5uTl4+fo5+nq5+bn6ezs6/Dx7vT0
235      8/n59/f4+P39/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
236      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
237      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
238      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
239      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAKoAIf8LSUNDUkdC
240      RzEwMTL/AAAMSExpbm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVD
241      IHNSR0IAAAAAAAAAAAAAAAEAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
242      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAA
243      AAAUYmtwdAAAAgQAAAAUclhZWgAAAhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAA
244      AlQAAABwZG1kZAAAAsQAAACIdnVlZAAAA0wAAACGdmll/3cAAAPUAAAAJGx1bWkAAAP4AAAAFG1l
245      YXMAAAQMAAAAJHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAI
246      DHRleHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55AABkZXNj
247      AAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAA
248      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA
249      81EAAf8AAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAA
250      AAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8v
251      d3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAA
252      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4x
253      IERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0L/AAAAAAAAAAAAAAAuSUVDIDYxOTY2LTIu
254      MSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRl
255      c2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAA
256      AAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAA
257      AAAAAAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAAAAFY
258      WVog/wAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAACjwAAAAJz
259      aWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBP
260      AFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA
261      4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGS
262      AZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAv8UAh0CJgIvAjgCQQJLAlQCXQJnAnECegKE
263      Ao4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oD
264      xwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJ
265      BVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkH
266      Kwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglP
267      CWT/CXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5C1ELaQuAC5gLsAvI
268      C+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3eDfgOEw4uDkkOZA5/DpsO
269      tg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExExEU8RbRGMEaoRyRHo
270      EgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgV
271      mxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kX/64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZ
272      kRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3s
273      HhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i
274      3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgN
275      KD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last
276      4f8uFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz
277      8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0
278      OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpB
279      rEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kd
280      SWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk3/Sk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EG
281      UVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZ
282      uFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKc
283      YvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2una/9s
284      V2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0zHUodYV14XY+
285      /3abdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4Co
286      gQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL
287      /IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1
288      l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj
289      5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqv8cqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACw
290      dbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P
291      vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbL
292      tsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx
293      2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LxU
294      6Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4
295      qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf//ACwAAAAAIAAgAAAI/gBVCRxIEASfO3f4KOQz6A8c
296      ghAjQhxkKtWpi6dSpaqU6FIkDRJDChyUqlQpUidLneqDJA8fSZUsiIwY4qKpmzdTNZJz6FChP5cG
297      zSRIYZLGoxpNcYATJw6eQ4g4cZhpARGkSEiRmmoUyU4FOoUIUcoztE7Ws6kO2cgRBIjbIDp0vBCZ
298      B61GTR8mqHARwwXfGDJkhKkiEtHRjKlQ+ZFgYMGCBpAhM1CgwMgjHiEJQEJ6ycOBAgYQOIDwgPRo
299      CA6OOOoi8kKlVKb6YKBxQwgRJmLOpEmjqHdvRmSgoIhYp6ecRHI6ELkCJgyZMm+iS3/D5k0ZVSlM
300      EIxzqNIlTZDq/mgaBUjJlS5hxnz54oVLlixTpviwMpzg8UmJIE3aJIoUKlSHLKFFFwRusYUVUkTx
301      xIJVpAARIpcgkt8lnoxCyk2kzDECCSV06OGHIpxAUB2bTHLVeCiVMsomo1gygwoqrCDjjDK6UMKD
302      o1xyySagTIJIhZdkssknSbyww5FIIhlECwTBMQkpn3xCyiQCIZJJJpVoAsoeT0DhAxRggunDFFTA
303      YN8lppCC0iEDBWlJJp4AAkV88VFB5xRc4ACRJLDdtAmbg3hSCUyb6EEmFYgmiugYOkB0SGKpkBLK
304      Jpt0cslVlVjixHtcdOqpe2NgZl8psAkqSSSJABKIIYjk0cQatmqMIesYZZRhRhtomDmRRpDAccgg
305      gAgCyCCDBGJDBCzUUMMNPwxxxBEq1BcRIqeM4oddfgQgRyCBHJLIJKAYMlQgm/yhiSkpoWRKJx5U
306      4h0mnIRSykNDqQLCHaeI0h8p+pYySCOl6CuKKZDUS5AkpFB6ZaWg2NEIKKCIAsoGBg9EgSSdYKIx
307      JpVwwskfi4jSSQgVE5SAHYgsskgjjawsSSN/XFByRAEMYPMAAdQ8wMw89+xzRAEBADs=
308    }
309  }
310  if { [ lsearch [ image names ] database_add_32 ] == -1 } {
311    image create photo database_add_32 -data {
312      R0lGODlhIAAgAOfXADpyADx0AD52AEV7ADmAADqBADuCAEKAADyDAD6FAUaEAmtvckeFBEKHAEOI
313      AESJAGtzekaLAEmOAEqPAFuJM0+SAFCTAFOWAFmRIliUDX6Dhl6aF36FjWGYKn+GjnyIiIGIkIKJ
314      kX2MkoSMk4WNlG2eOYOPkIaOlYePlm6hQomRmIqSpouTmoaVm4yUm4eWnI2VnGmwBGSyAHimT4ua
315      oW6zAJGZoZKaom+1AHazAJCbqJObo5ScpHG3AGu5AHK4AJWdpZibt3m3AHO5AJaeppCgpnS6ApGh
316      p5igqHe7AHa7BZmhqXi8AJOjqZqiqnm9AJSkqnq+AJujq368DIDEAKGqsYPGAKKrs4rFAKCsuYTH
317      AKOstIXIAKGtuofFHKSttYfJAKKuvKauto3IAKevt47JAInLAKiwuJLBU5DLAKiwxYvNAJLII6qy
318      upPJJauzu5DMGZvDV6y0vJLNG6m5oK21vZvFXpHSAK+3v6S+qZ7IYbK7w7S9xZ3TMbW+xra/x6XT
319      M7jAyLXBz7nBybrCyrvDy6nVWLzEzK/UWLfJtb3Fzb7Gz8XE3L/H0L/G3MDJ0cHI3sTI2MHK0rTa
320      ZcLL08DM2sPM1MTN1brbbsbO1sfP18TQ3sjQ2MfP5cnR2srS28vT3M/U18/T48zV3cHhiM3U6sXg
321      j83W3s7X38Tji9LW5sjikc/Y4M3Z59DZ4dDY7c7a6MjkmdLa4s/b6tPb5NTc5cvnndTc8tva8tXd
322      5tzb89be59fg6Nvf79jh6dni6trj69vk7N3l7t7m79/n8ODp8eTp7OHq8uXq7eLr8+Ps9Oft7+nu
323      8Ojw+evw8+zx9Orz++7z9vP4+/T5/PX6/fb7/v7//P//////////////////////////////////
324      ////////////////////////////////////////////////////////////////////////////
325      /////////////////////////////////////////////////////yH+EUNyZWF0ZWQgd2l0aCBH
326      SU1QACH5BAEKAP8ALAAAAAAgACAAAAj+AP8JFFgECZIlCBMqNFhkoMOH/4hAEROI06hixDJqzFhs
327      FKdAYpYQgTgQiJhRvnblksWypUuWuXb5kiUGCMl/TU6dGgWqp8+fQEGN0tnkZhFhlixlWsq0qdNM
328      SYU1JAmkGrBHhQ4dUsS1q1ethR4BqybFqKJo1KD9kqWJktu3bjXJ+gWNmjNFUyEe8ROIkqxjzKZN
329      k0a4sGBmxmRZChToyE0igQgVUvSIUiZOqGTFlIVqlCZLjxQdIjRoJNVBhLha5nSKlaxdvFie4vQ5
330      dCFCNkmKEDO58uXWr2PLml1btJwQN0dUETNoNajMsnj5WokKFKdMlBThETPi5o1kZHj+OGmzRxEl
331      VLt+AYudKXSdKkvEIENykwalZ8dCEXpTpb+YM2d0kUV/chQyijHNUEJDfYxlkssyz1RDzYSCTUhN
332      Nc0ss0smgQiiQ32obfWIJZo8p9kunHmUSSWRQOIII0HcZAMhqZn3m2uwycbJJp3Q0QECCCQQgQMQ
333      cUCGiKsBlyNnopQygwRomGKLLavYkQEDDnmwXHOXgXIKS9KtJMsrKVywiiFTxBDDFIjEsgGWAsGg
334      THjjledXeuvJokoeEpDiRQ84WGMNDj14kUoGA71gCX768ecfgF10oQYGcbiRRBKBDnqpG3ooIFAL
335      DT4YoYUVVmMNAZNE0UMPMggqw6rDUWASgUAuhEgZiSZu1gouBfSRhKDAApsEILP+wwKNqt0YnCyw
336      6FIAHFEEG2wUcBTbwiCT2cgajrE1WwAVVEQRhQ+C+iAuFWMUq8EOg0ji3Jey+PJLLrPcUkIMYIAR
337      rqBRUJFvDgcMBIEKO1TBRyGu8QLMMMQE80sviUgwhhn6CuqvGWVcQNICH4CAwgkmmEDCyCegsAIF
338      F6SxRr75rpHGBQLcJLNDAVQgxBp33LGGEBUEMPPPAw0QwdARDAD00UgnnXRAADs=
339    }
340  }
341  if { [ lsearch [ image names ] system_upgrade_32 ] == -1 } {
342    image create photo system_upgrade_32 -data {
343      R0lGODlhIAAgAOf/ACwsNDg2Oi09LSRGHUo7V0BERkNFQh9hETlXM2BdYS17GkB5MGdqeGlqc3Zn
344      jCmJHm9tcTmGJHBtfEuBRXNwf3FyeyKWFAegEnp2hnx2gVOJTECTKSqbGxWkGACwBQ6rE0WYLiuk
345      GkCdMQC1AGOOX4SChgC3AA+zAIKDjAC4AFCbOR+wBwC7AxaxJoWGj4iGihC2Ehi2AGOXZTmpM1ue
346      PSKzHjCtNoyImTGxHUWnSQm/DIiNkB67GpCNnXiaeCi+DSO+HpGSnEW2JFWtTzy5JyPBLJSWkzq+
347      EC3DJZmZo0jAJC7HM3KuZz7EJznFO52eqHG0UT/GNKGeojzHPUPHKpygr6Cgt0zHNZ+kpqOiuVvH
348      LqSkulTKMKWnpIy0iU3NS1PNO6envqqorFLORZeykKaquVnMTGPKQ6mpv1/NPV3ORq6ssIW/cVzP
349      T2HNVa+tsaquvq2vrK2ut5+0pmjOR62txF7TObGuv1/SUZS8kbKwtLCwumjRUZm8mWzSTLK0sbOz
350      vbayw7ezxWzVVbW1v7i1unTWXnnWULq3yG3ZYLW5ybi6t3zVX7m5w6DEoHvWZnXZaHrZW7i8zKzC
351      tL68wLi+wLq+znrcZIDaa8G9z3zeZobacofcX73CxL3B0cbAy4XeZ8LCzL/D0oXfb8bDyMPFwrnM
352      uIficoziZIria8bH0ZDjc5XheorldMjJ08vJzZjidLvRw5PldtHK1p7lcZzld5boeM3O2NDO0sjR
353      zMvQ0pjnhbzXwdDR26LpidbS5KLsftnS3tTU387Y09jW2rnnn6Pwh9Xa3KfxgtzZ3tna5LHyhdvc
354      5rjupdze27Pykt/c7t3e6ODe4rH1juHf49bl2MLwqLX3ieDh6+Ph5eTh8+jh7d3m4ebj6MfyuN7o
355      4r/4oOXm8L77lOnm69D0u+ro7OXq7ejp8+vp7e3q7+Tu6err9u/s8dD9re3v6/Du8vLv9O/x7unz
356      7vTx9u7z9vHz8Pbz+Pj1+vz1//n3+/j69/37//j9//v9+v3//P///yH+EUNyZWF0ZWQgd2l0aCBH
357      SU1QACH5BAEKAP8ALAAAAAAgACAAAAj+AP8JHEiwoMGDCBP+A+TPHyCFEAXiIvik4ROCEyMOLGTP
358      X6OBSRpiGZjJX75CGv9VaMgPAqVt6jbx2WWNXDNWjLw5SPnvVj9++/w9SuPrGbJly66Ja1dLC8Fi
359      ClHwy1ePyKhTqU7JkmULGLCj4CIJhEWroBxKAsXks3cvBKRBhhJd0nS11VZbtozBkjUNVcFu9saJ
360      sQdvnwg3Y9S0WYwkRQoWURJd1cqVE0FA99i9g8cOnqMZUZxM+QLEhIcLHVawiEEF06VLoEaJJeji
361      XDp06PApWFKkiBPHDw4MEIAgApEfTRgpZ3TIIIB048rFssCDBxAeKTgQDEBgQ5MjV/j+iPdjMMi4
362      budk1IABg0eMGgYXcFFyxYx9M2cMAsJGbduEGh7EEIMJOBhkRxp00KFGGlQcocRAr5BCSS/MMBOM
363      Bi14YIIJLBwkhAggqCAiDVCwMYtAmdyiTDQVBkOCDQPG0OFBGfTwyS/QaAPNL54IhMYWWWxRRyCu
364      +DCECRBJsYcqgdwRRpBoCIQBBRJY8aQkczDxAURydNJIFmFYIQEFGBR0w49oUONFDgoZ4YozZWyB
365      xg0IMVAHGmikM0keClUijDlloFEHAwgl0GQgntDDSx8IURKOPZ4cmsBBhCByhyWKSMKMOtWYQgZB
366      ceCSzjzKSKKIJXcgQkhBVaBxRyCyosQaCjbycMPNMLnockw65dyTTSixitIkGlUUlCocDQijyi0q
367      xlOPOdCyY489yjCrijANwGGpQQ00IFAF0fQiTDLJUGNOPPCkQw25xPQSTQUCdQtRCdRkI0023Yyj
368      73n2ZkNNCTz9Q0y588DjzsEIwzPPusTwtEa57xiwQynu1FOPO6XsUMA7676R0gvJCDZQFxZ3MZAY
369      5STzQsB6EPRHPPH8QVDLARu0iD76LFLzzhAFBAA7
370    }
371  }
372  if { [ lsearch [ image names ] product_update_32 ] == -1 } {
373    image create photo product_update_32 -data {
374      R0lGODlhIAAgAOf/AAAjAgEkAAQwBhM1DQM8AAA/AAs+Dhk7EwpCAxhAEQBKAQNOACVBHxRJCgBS
375      ABJNDipHJAVYABlQGABdAC5NLx9WHUVHRClTKABoAABvAAZtBjZbNRZyAEJgPEBiN0FjOCFxDhB4
376      ACtuJTFvM0RpQz1tOSt1JACGAACHACh5IDxxNhp/ERCDB2FjYE5sRyZ/HQCPAEF3PByJEWlraACZ
377      BAGcADSLKCCUElGBTA2fAEOKOCiUJ0CLPnd5dmOCW3V6fGGDYlCLR0uQN2CGXlWORBilGXx+e3uA
378      ghisACOoEBGtFEiYRH6DhYGDgFuWUi2oKQy1ECiuJDioMoiKh1ufWG+YYyK7BI2RlFmpU2yiYzu5
379      JmWqT0q1N12wUi3DJSvGGm+rZUy5Q2SvYHmoale5RG6wYnqrc1u4Uj7FMzDOJXiyeD7MJHi0bVHF
380      RZeplnS5cKKnqUHRNKaopU/MQ1/ISXDBaT7XMIu4hqesrpuyl17NXDreK62vrKuwsnrFdHPKape8
381      jLCyr4zBjWHUU1DdQE3dSUngOVXbUKG9m5fCiovIf5LFi33OdXDUZGHcUnbUa1zfTJjKkLLAtK3E
382      qbDDr3DebKvHpI3TiILZd2XmU4fYfl/qTX/dc1btT1rtR17rVlHxSnHma2DtWKjQpbjKt2zpZb7I
383      w7zKvnvmbJvZj8HMupTfjKrYpITodsDQtqDcn2H2V77VuqDhnbjXuqPhl6fgnWz4Y8DYvLHfq4P0
384      cZ3plbbfs8/U18bZxc/Wy4/wi73hvKzoq5L1iIH8d9Lb1sjgxL3mud3a39fc36bynrTtqs7izeLb
385      59rf4tfh3N7g3Nzh5L/uutPm0s3o0uLg5MPtwLfztcjtyN/k57L5rOni79Ts0Ofl6dDw0uPo6ubp
386      5eHr5uXq7e7n8+vp7ffp9+zu6+/t8env8ffs8+vx5vTt+dL8z+b058/+yezy9PPw9e/y7vL08fbz
387      +PD19+P83/3y+fvz//n3+/P5+/f59vX88Pf9//v9+v78//3//P///yH+EUNyZWF0ZWQgd2l0aCBH
388      SU1QACH5BAEKAP8ALAAAAAAgACAAAAj+AP8JHEiwoMGDBwP5W8iwocOHC6ckhEiRH798+PDlm+eP
389      ycR9FS1azIcxX7x57jpObLjPYr+XMO+R3BgPnrt9RyaKdNmPH7117dbRy3fvHkp4SPnlNKhwZz99
390      2XLZggWrU6ZKwdjdc/cO3jmcOvn18xcNkh07hjZ12kToC5Iwu+B9O3cOn5Gw/mRZgYIEjSNUrUId
391      QnMjgggcPsyFszsxn79dMFCwkLKqWzp46a49kqLiQQEElMzNu2uQj79+8UQsqKADV7979d6ps1cv
392      lZQuNzLcUTfvx8E+C90AYDDiVb93riKlWqRKXa1GmDApefJNXo+Dpv11ELChTD90iSD+2RqWbBAi
393      adY01fmD5I4936X9fRsAoQSrfpO8GKpU7doeLaao8802yvixiDzwFWSaLwl4EMQ09mxBQxSRvHNJ
394      EjWMMQ43HHIDzTkJEmRaOafEcks58AjhwAuW3MOGDRM4saEzzjxDzTnXxXdPP/XI8845RLiQBylm
395      9KIAAVWI00sWQ5AgyTshDoSHP8WMMosv6KgDCAcgrBDCLSZgMIk4o8RAQQBP5liQHP6w8gQPVAgS
396      yzNbnJADFFHcAAY14rzxwQEJEDNOlALh0Q84SbTBCBZLqEGNInQ4Qscix2hTDA8UAAAEN96oSZAc
397      +dQjBgpc/BEGLuRo8wwxzWijzTL+WFxgAAKn3EjoP3Lg8w4lC0Rggg5k4IKNq9o0s8sZKWiQARjc
398      NDPaQXDMEw42F0jQQAM7oFHJKrSswskcReTwlo3e7NPEQXK44804lJDyhgw0eFHIJ6KwtcYXaTTi
399      DKfnqGQQHO94g80443zDih5xGOKJJ6AsXEot1HATzjkpeTpQuthgAw001KgKjC6/CCNMMsY8ow03
400      3yAFjz8zQGuOxtA0I/MxzDBzzM01U+NNOe7YdBNCcpyz8czNIGO00TdHPM477jQ9TzkIwTGOzDIf
401      jfQxzWDjzTk2wYOPP/ksVRo+4YTjjTeccno21/jwAxI/8/ByBUICtdDEEXjnbQQS3kY0McXfUzQx
402      gwV0F2644QEBADs=
403    }
404  }
405  if { [ lsearch [ image names ] file_remove_32 ] == -1 } {
406    image create photo file_remove_32 -data {
407      R0lGODlhIAAgAOf/AMIABToqFMMWGMUaIFZBH1pFI11HJcYpKcYpL19JJ8gqKmBKKGFLKExOS2NM
408      JMIvLmVNJmZOJlFTUGlRKWxTJW5VJ3BXKcc9Os48PXhZLHBaPNE+P3ddL19hXntdNnpgMYFgLtFH
409      R4RjMHRnUWhqZ4hmM9FPT4VuT5JuNYtvQJNvNpRwN5VxOJZyOZdzOnZ4dZh0O5p1PIJ4bJt2PZx3
410      Pp14P555QJ96QKB7QYh+cs5qa4OAcqF8QqJ9Q8ttbKN+RKJ+SsxubaR/RZ2AUKN/S6aARqWATKeB
411      R6GDTaiCSKKETqmDSY6GgKWFSaOFT6qESqWGUKuFS5qIZ6yGTImLiK2HTaiJU66ITq2IVLCJT9l6
412      eLGKUJONjN95erKLUbGMV7OMUo+Rjq2OV7SNU7ONWbWOU6yPZLaPVLWPWt9/fZKUkbGRVKKTfLOS
413      VZmUkraRXOGBf7OTXLWUV7SUXbiTXeKDhrWVXrqUXraWX5ial7iXWreXYK2ZceGIibmZYaybfqib
414      irqaY+SLi7ycZL2dZZ+hnr6eZr+fZ8CgaOSSkMGhacChb8KiasOja+CWl8KjceaVmcSkbMalbcOl
415      eaeppcembsWmdKiqp+Sam8inb+Ccm8mocMiodsqpccmpd8uqcs2sc8yses+tdc2te7Cyruejoc2v
416      gsixgs+wfc6wg+mlo7K0sbO1su2opsa2n9G0s8y2ssi7qby+u+izsr2/vL7BvcHDv8LEwcPFwsTG
417      w8XHxMbIxdHFxeq+wcfJxu2/vMjKx9THx8nLyNTJvNXIyMrMye/CxenExcvOys3Py+3HyM7QzdvO
418      z+/JytHT0NLU0djT0tPV0t/S0tXX1OHU1NvW1NbY1enU19ja1t7Z2Nnb19rc2dze293f3N7g3d/h
419      3ubh3+Hk4Ojj4uPl4eTm4+Xn5Ozm5ebo5efp5ujq5+nr6Ors6fDr6evu6u3v6+7w7e/x7vXw7vDy
420      7/Hz8Pjy8fL08fP18vT38/b49Pf59vj69/n7+Pr8+fv9+v3//P///yH+EUNyZWF0ZWQgd2l0aCBH
421      SU1QACH5BAEKAP8ALAAAAAAgACAAAAj+AP8JHEiwoMGDCAXWQkjFG7qEEHGhe1jQ1jhv7ihCLEgJ
422      XTp46brlEehN3blv796F2VjQWbp079y1a+fw3bpz4eDBY8WS4LN06tbNa5dxHLyM5+bNE9ZzYLSg
423      7ea5ewcv3Dx569Ldu4etqcBo64i+mwdPnrp59o7m0/fN679pRKfWk4d2Hr6r+/Spcwt3Krx69e7h
424      y7cPH75++OS5xeZ3XmDC/Pr587dP6WKqdO9BnjwZH9GejEaFGoXKlGlTqFKdNp3q1ClLnDwtSlhJ
425      lG3bnzbp3pQpUyVJwCU1YsSo0SPalX4DbzRckSJEhw4ZIkQo0KRhyc6p05bsIHTp1AP+iQ+0pzye
426      83RcYUMHz7E9e/N2ESy/5zweO3PmxEGD5kyZMmOAEYs26phDVz32xENPPV0JhIUVUESohBJIGGGh
427      hUBkyEd215SijFLxGKNMPPPIMlAVRRTxw4or8uDiizzcMg01iSQCyTHszKJKK7/M804HAolRRRVT
428      TBHFkU88scQSTSRhBi3dgKNJHX0IgomNmDTjIyUCtQHgGAF6scUWWWQxZBV/5MLNOOA40kUacFDZ
429      C13vICOQHnTkyR9/ZPRJxpiA4KJNOOFQY8IGGISgRTrrvNPONALJsd8ZXoY5pplVsHHJLs8QgwAA
430      oIIaRDfeYOOLQGW0YWmZQxqZpBTWheTCywOhDhCqDt5Mw9M/YmJKZBRKLpHEEUUMoYYtsAggKjQX
431      gHpANtFQIRCRrgo7bIoquijDKr68IoAP2GDD7AHMTHOqQEpem2KLPOBwww02pMCFLcUEM0242lQj
432      zTTJkDAQtj+86K4NNtRAwwwxxHCCG7cAk0w0907zDDLSDiQwvDUYjLALHLfAwgoe7ECKLsAIg0wx
433      skhQUAwF03BwDBy74PEKKqiAwgoulKDBCDkw8UIDBxVQggggfMBBBhZUQMEEEUDgwNMQMLBAAgYQ
434      EIBbWB8UEAA7
435    }
436  }
437  if { [ lsearch [ image names ] check_connection_32 ] == -1 } {
438    image create photo check_connection_32 -data {
439      R0lGODlhIAAgAOeWAGhoaGlpaQCUAGxsbACYAG5ubgCbAHFxcQCeAHNzcwChAACiAHR0dHV1dXZ2
440      dgClAHd3d3h4eACoAHl5eQumC3p6egCrAHt7ewCsAA6nDnx8fA+oD319fQCvAH5+foCAgACzAIGB
441      gQC1AIKCggC2AIODgwC4AEKeQoSEhAC5AIWFhYaGhoeHhwC9AImJiYqKioyMjI2NjY6Ojo+Pj5CQ
442      kJGRkZKSkpOTk5SUlJWVlZaWlpiYmJmZmVS3VJubm5ycnJ6enlS8VJ+fn6GhoaKioqOjo2y9bKen
443      p6ioqJSylKurq6ysrK6urq+vr7CwsLKysrOzs7S0tLW1tbe3t7i4uIfPh7y8vL29vb+/v8PDw8TE
444      xMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0rrcutPT09TU1NXV1dbW
445      1tfX19jY2NnZ2dra2tvb28jjyNzc3N3d3d7e3t/f3+Dg4OHh4eLi4uLj4uPj4+Tk5OXl5ebm5ufn
446      5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pr6+vn7
447      +fv7+/z8/P//////////////////////////////////////////////////////////////////
448      ////////////////////////////////////////////////////////////////////////////
449      ////////////////////////////////////////////////////////////////////////////
450      ////////////////////////////////////////////////////////////////////////////
451      ////////////////////////////////////////////////////////////////////////////
452      /////////////////////////////////////////////////////yH+EUNyZWF0ZWQgd2l0aCBH
453      SU1QACH5BAEKAP8ALAAAAAAgACAAAAj+AP8JHEiwoMGDCBMqXMiwoUOFLJCsMAjgocEYY9qooUGQ
454      RgCLBF+YWYPmjRwfXdZsqQFyoAs0cAqRKUMHzxEwcVoKZKGmDp0/isygsfPnyBudKtjkgYPmzqCg
455      SvX8aFnCTZ8/kNyoyVNI0Zk3fOSosDiiDSCihiC9YdMHkSI0cf6YsfiEUCM9awQhUvsG6KKhb4o0
456      rEDjRhtFlPi0IaQIEhw5ghopGqMFCEMOdCwJ4aGGUeI3hxhFimNHkJwtShhWaFMpUCMcO8o8Siwn
457      kaNIbtZoWcLwgplIlCrFYQRDxxhIlfrYYaSIThYmDCd8abToUSVJcAKNuOFFUvI6b7T+NNHAMEtj
458      OIIYVcJd50INLpQWmcnixMNAAQivHDr0SG2gRZU80gYaDchAhRv0cTAQAQwaNAUhd9xRyCOOmJVI
459      JYyo0cUBGtCwRAgDGSCiiATN8McgFZb2CCNr+GHIJHOEYcUEL9gnEAI44liQB1f0EdoadADyyFt7
460      BJFBGljwQJACCzS5wEElTJHHIYqoIYcfkCDSwwMPbJAECgNxKSZCDHzQxB2HJHJGHHxAUoUEcFJA
461      EJxwKjTCBEjAcYghZcCBxyFGYCCoBQIJKuhCb1SQABFoHELIGHKEIcUJHVRqaaUMxQFGBAX4IMYh
462      gHgRRQz/gGDqqSAwVMMWa3QBwQAtOWjRBRQzDCQCCbiSwFAAHA3kwAAqDGFDQSakkEJDFRXkgAMK
463      GtSCTtBG+1BAADs=
464    }
465  }
466  if { [ lsearch [ image names ] package_down_16 ] == -1 } {
467    image create photo package_down_16 -data {
468      R0lGODlhEAAQAPcAADJwKjZ6MUFqIkNsJ0ZvJkBvK096LVyAPUePQEuPQUqMRUuNRk2PSFeNQ1CS
469      S1WaTleZUVejTlikT2a2XGi4XWytZXysZ22+Yny/dnDCZXLFZnPGZ3THaH7AecODIsOEI8CFJcSF
470      JMWHJsaKKMeNK8iPLcmQLsmSL8iVMsuVMsyYNMiUO86dOd6fMtGkP+KqN+KpOOOrOua0Pea1P+y2
471      OOm1PcqQStCXU9KlQNOoQtSqRNWsRdWtR9awSdewSteyS9iyS9i0TNi0Tdm1Tdm1Ttm3T9WmUdqt
472      UNuxVuGnQOa1QuaxR+i+Q+m9ReSxTOi/SOi7T/W9QOWvVtuyYt25ada4cNy9d+a2a+W/b+SzdIDB
473      eoLCfYXDfuzFR/nESOHAcuDAfeDGfvXPf//Vd/XQePXQf/7WeIfFgZHKiZPLjJ3QlaDSl6nXoKvY
474      otvDidfTj97JlezFg+7Eg+3Gh+zKhOvMhOfMiO7KiPHPhvvchPfViffXi/DQjOXPku3SkurVnPHV
475      kPXXkPLWlf7flfjbnf/hm+3ZpfLdr+3evv/kpfnhqvrjqv/oq/fksvrksP/qs//ptv/rt/blv//q
476      uf/ruv/rvf/tvv/uwf/vwfvty//vyPnrzfrszv/wyf/yzvXr0vfu0f/z1P/z1f/01//12f/02v/2
477      2//23fz24v324v724/744f344vz45v775//+8P//9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
478      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
479      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
480      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
481      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAALEALAAAAAAQABAA
482      AAjnAGMJHBgLiA+CCAcK+fHHzg4dCQcG6dNK1aFGX1wkJBIGFKxXmY7sUSRoCguBRYYY+oQIjpsq
483      VAKJIbSIjpEUQlZt8lMHC5IVnEhNGjQmUZ4TP1iFcoSnDBknjiAVMhOlBqASPVKVElVJD4cNGS54
484      ofEECh8SPFCN8qSJkoY2bCh0aaJkyZ0ROlCF6mTp0YQ1aiQwmREjSRwROVydwhSJUYQ0aBDIgNHi
485      ipwQOKxIMnXpzYMzXAK8kDIniw0PAlmAsZCgwhYtDgAcuPEBoQoUDSB0wLCgAIjaEU0YYKBgQIiI
486      CAkIiBgQADs=
487    }
488  }
489  if { [ lsearch [ image names ] software_update_16 ] == -1 } {
490    image create photo software_update_16 -data {
491      R0lGODlhEAAQAPYAAM5cAM5dAM9dAM5dAc9dAc9eAc9eAs9fAs9eA89fBNBeAdBfAtBfA9FhBNFh
492      BdBhBtBiB9FjCNFjCtFkCtJkCtNlC9RlCNJmDdJnD9ptDdJoENNoENNpEt1xENhzHN96IN97IuF/
493      JfaDE/WEEvaFE/aGFfaFF/aKGfKIH/eNH/iQG/iRHfiSH9+FMeKAJu6FIO+FIfCHIvCHI/OKIPaL
494      I/KNK/iWIfWSL+OOPPGTNPSWN/iYMfmeMviaNPmhOfmhPfqmPvafRfahRvmiQfqnQPqoQfemTvSm
495      UveoUPWrV/u0V/u3XvayYvSzZvW0aPa3a/q0avq0a/u3bfa4bPm4aPu6cfu6cvm9cfrAdPvBdPzB
496      df7kv//qzQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
497      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
498      BAEAAF0ALAAAAAAQABAAAAeYgF2Cg4SFhoIHCYeGBy04C4tdEhwGE1dYGgQYFwCFG1pTTUtKTk9Z
499      HoYBTEVEW1tEQFQIhQURRz42XFw2PEkVkIIEIEZDLCq6Kis/SC4GggYfQT1WurpVO0IhzoICEDkp
500      UrpSJzoUCoY1JSRRUCQjNwOGDjQyLyYiMDE0FoYMEAUMUMxwUOBBg06HBGTocC7SoAIEHEoUFAgA
501      Ow==
502    }
503  }
504  if { [ lsearch [ image names ] check_green_16 ] == -1 } {
505    image create photo check_green_16 -data {
506      R0lGODlhEAAQAPYAAACVAACWAACXAACYAACZAAKaAgOaAwecBwidCAmdCA6gDQ+gDhCgDxOgERWj
507      ExymGiSlISirJSqsJCqsJi+uKzCvLDKvLzayMTeyMjixNDy1Nz21OD61OT+1O0C2O0O1P0O4PUS4
508      PkW4P0m2REe5Qki7Q0q7REu7RlC+SlG6TFK6TF3CV17EWGjLWm3FZmnJYm7JZ3LMZnnNb3TQbHjU
509      a3vPcHrTcoDTdYDUeYXWeYbQfoXUfYfeeojeeovaf43VhY/VhY7WhonYgozdgI/dhJDXh5Peh5HV
510      iJHWiZLWiZLaiZPaiZbdjJTfjJnbkJ3elJHmhJTkh5rljpnikJ/ml57rkZ/qkqDgl6HgmKHimKbl
511      nKjmn6XsmajqnanvnanmoKnooKzroazoo6zuoK7qpbHtp7LsqLPtqbLuqbfzrLnzr7zzsr/1tQAA
512      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
513      BAEAAG0ALAAAAAAQABAAAAeZgG2Cg4SCBQgLhYptBSouKQ+LgwYfRzJIEpKCDD8xMUUTmgkwSy1P
514      KxSaFlc0TDsVmgtKRkNZHoIAECMNBJssWj1kLxeCATpAQRYHbRFiUWFNGIMCSTU3VyQOQl1WZSWE
515      AxlOOT5bOGdVazMahQUdWEQ8ZlxpVBuLCidfUlBeaiiaHmwAM4aNDRCa2kwwgWZKiISCMHAQISkQ
516      ADs=
517    }
518  }
519  if { [ lsearch [ image names ] cdr_tick_16 ] == -1 } {
520    image create photo cdr_tick_16 -data {
521      R0lGODlhEAAQAPZ2ADd7MTh8Mph/Mpl/Mpp/MjqUMECFOWuPPUijPFWcTVKtQ1ymUlyjVGuqXGC1
522      UGi3XmyyYnS5ZZmAMo2vZo6waY+ya5Czb821b861cM63cs+3cs+3c9C4ddC4dtC5dtC5d9G6edK8
523      fdO9f4HKdoPJeILLeIbJeYXLeYXIeoXJeofMe4bMfIfNfInNfYnOfovPf9S+gNS/gtW/g43PgZDS
524      hK/LlcDAhdbAhdnGjtnGj9nGkNrHkdvJldzKltzKl93Mmt7NnN7NneTWruTXsObZs+batebatufb
525      t+fbuOfduujduujdvOnevtPhvurgwOvhwuvixezixOzixezjx+3jyO3kyu7lzO7mzO/mze/mzu/n
526      z/Dp1PHq1fHr1/Lr1vLr1/Lr2PTv3vXv3/Xw4fXx4vby5Pfz5vj16vn27Pn27fn37fv48fz69Pz6
527      9fz69vz79v379/37+P78+v79+/7+/P///v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
528      BAEAAHcALAAAAAAQABAAAAfMgHeCg4SFhjxOXGRgPgSOhR9zYjg/WHN1cx+PdwQfa3ZwITJedm5v
529      dpqDXzdbdj0ZY3NncnRzjgQ+QSAdUFlDYWpncWxtjQRMMCAePSKOMW1lXVJMjlEcHyBFtwRXQDoU
530      DQcEURsYF0fbTzsTECgJBEsaFzlbMY4iRBYQMy8GuEZWzIRp8qAGkgoQWrAIQEDQnDRfpkQwscCG
531      gxUnGDbshEaLEgU0UkAgUSLABwmEPoyhIgSBCxUjTG4ixCNJlQIMGAowRGgAAQANCQUCADs=
532    }
533  }
534  if { [ lsearch [ image names ] database_1_16 ] == -1 } {
535    image create photo database_1_16 -data {
536      R0lGODlhEAAQAPeLAEdHR0dHSEtMTEtMTU1OTlNUVFRVVVZYWFdYWGFjY2JjY2JkZGNkZGVlZWRn
537      Z2VnZ2hoaGhpaWttbW5vb29xcXN1dXV3d3Z2eHh5eXl5eXh6enl6enp6en19f3x+fn6AgICCgoGD
538      g4mLi4qKjI6Ojo6OkJGRkZGRk5OUlJSUlZSUlpSVlpWWlpaXl5iXl5aXmJeYmJeYmZmYmJmampqb
539      m5ydnZycn5+fn6CgoKCgoqGioqCjo6Smpqeoqautraytrq2urq2vr66vr66wr62vsLCxsbCysrGy
540      s7Gzs7Kzs7GztLKztbK0tbO1trS1tbW1tbS1trW2trW2t7W3t7e3ura4uLe4uLe6uri4ubm7u7q7
541      u7u7vru8vr29vb6/wb6/wr/AwMLCwsPDxMXFxcXGxsXGx8bGxsXFyMbHycjIycjJysvKysvLy8rL
542      zcvLzcvNzcvMzs3Nz8/Ozs7Oz8/Pz8/Q0tHR0tLS1NfX19bX2Nvb29vc3Nzc3Nzd3d3e3t/f39/g
543      4Ofn5/Dx8fX19vj4+fn5+fz8+/v8/Pz9/P39/f7+/v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
544      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
545      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
546      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
547      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
548      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
549      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAIwALAAAAAAQABAA
550      AAjOABkJHEiwYEEyRnYg0fPnzRWDc+7YiaOmjBUtZNjIWUOQyZYveQQFamFBBI8xWQhCoYJmkKE9
551      QT4kqFBkCsEmXNoQStTHx4cFGKI4IRjjgoo0fMzMmICAQQYZBInYGJGiBokGAgpMuHGEoJQtbggh
552      2gMkxIMNTqoQVLIFDiFFfoD8xPAkCcEXF06IwROGhYQDCji4ILgkRwkYOExAIGCAgg6bA3t4aVOI
553      pxCzGqz8ILjiTJ1DiwANAeHAAxgaBQN0wEKnC4oIAwQAMEjbYEAAOw==
554    }
555  }
556  if { [ lsearch [ image names ] back_to_ou_16 ] == -1 } {
557    image create photo back_to_ou_16 -data {
558      R0lGODlhEAAQAPYAALRmJ33VJtuPGd+aHeGhHt+bL+WwKuaxPOe4PYnVPu3UAO3VE+3QF+7VHPDb
559      KvDYL/HdN8+kU+m9Q82nYt62Ztq1aeewY+K1dY3cQJDXSpXdUZvdW4jCZZHJaJbObu7PR+zJS/Hd
560      QezHU/DYVPLgTPPiWfPjWfPfZmZ3mHiGq3aIsH+Pt6u816Kx3LPA4b/P4r3F9L3G9s7Pzs/Pz8/S
561      18/T19LX3dLY39jY2Nvb29zc3N3d3cHM48vZ68vb79LY4Nba4NPV8dPZ+ePj4+np6ert/PHx8QAA
562      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
563      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
564      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
565      BAEAAEcALAAAAAAQABAAAAd8gEeCg4SFhR8RLIoshoIDBw8MFT0+Pi+GCCQQDgoNF0VFPIUEJiUg
566      IQsUQUJCLoUSJwJHIxMwMbcthQYiggUqKykrKyiGFo3HRwDIy8xAPz80RzY3NzVHHhwcHYJERkY5
567      R0PeOkcbGBgagjtDQzNHOOwyRxkBAQnM+Pn5gQA7
568    }
569  }
570
571  if { [ lsearch [ image names ] folder_yellow_16 ] == -1 } {
572    image create photo folder_yellow_16 -data {
573      R0lGODlhEAAQAPYAAK+KGLGMGLOOGbKNGrKMG7OMG7OOG7SOGbSPGbWPH7SQGaOFI8GLNMmJN8Se
574      MMSXOcSfO9eQOuOePN6xLcOhN8WgNMahNcehNcmjNMijN8mmNcukN8ulN8umNsumN8KgOMeiOMei
575      OcemPMekPselPsemPtGnN9uqNeG9K+K4LeO/LOS8LeW/LeytO/G5OeTALPTHN/XMNvTBOffQNcun
576      QtGtQtCuSd6+Q922Sum8S/TCTvjETvjITvjOTe/USO7USfrTTfzaS/veTPzgTPzkTfzmUfvpXd3A
577      ZurTg/rrhvLgl/nrqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
578      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
579      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
580      BAEAAEwALAAAAAAQABAAAAeSgEyCg4SFhoeGBwgICgGIggYTKSssAgqXlwiEAC4yMDEzKi8vKioo
581      A4MALScYGxwesLAdFRcgTAASJj9GSUu+v0tKFkwEERlCREW8wEtIIUwFDTVAQUPJy75HggUMODw9
582      1NbKvTbbDzk7O9/h1w7bEDrp6evVPhqCCTTy++s3gwsfSJQoQWIEiYIjRFB4xLAhoUAAOw==
583    }
584  }
585}
586
587source [ file join $::TolPkgGUI::cwd tolpkg.tcl ]
588
589proc ::TolPkgGUI::CmpVersion { v1 v2 } {
590  foreach { v11 v12 } { {} {} } break
591  foreach { n1 v11 v12 } [ split $v1 . ] break
592  foreach { v21 v22 } { {} {} } break
593  foreach { n2 v21 v22 } [ split $v2 . ] break
594  set cmp [ string compare $n1 $n2 ]
595  if { $cmp } {
596    return $cmp
597  } else {
598    return [ expr { $v11 < $v21 ? -1 : ( $v11 > $v21 ? 1 : ( $v12 < $v22 ? -1 : ( $v12 > $v22 ? 1 : 0 ) ) ) } ]
599  }
600}
601
602proc ::TolPkgGUI::ReadPackSyncInfo { } {
603  variable packSyncInfo
604
605  array unset packSyncInfo
606  foreach p [ ::TolPkg::GetPkgSyncInfo ] {
607    array set packSyncInfo $p
608  }
609}
610
611proc ::TolPkgGUI::ReadVersSyncInfo { } {
612  variable versSyncInfo
613
614  array unset versSyncInfo
615  foreach p [ ::TolPkg::GetVersSyncInfo ] {
616    array set versSyncInfo $p
617  }
618}
619
620proc ::TolPkgGUI::ReadLocalVersionInfo { } {
621  variable localVersionInfo
622
623  array unset localVersionInfo
624  foreach pv [ ::TolPkg::GetLocalPackages ] {
625    array set localVersionInfo $pv
626  }
627}
628
629proc ::TolPkgGUI::GetRepoId { url } {
630  variable urlmap
631
632  set url [ expr { [ string range $url end-13 end ] eq "repository.php" ?
633                   $url : "${url}repository.php" } ]
634  set repo [ expr { [ info exists urlmap($url) ] ? $urlmap($url) : "unknown" } ] 
635
636  return $repo
637}
638
639proc ::TolPkgGUI::GetPkgNode { T url p } {
640  variable urlmap
641  variable treeParents
642  variable nodesInfo
643  variable packSyncInfo
644
645  if { [ info exists treeParents($p) ] } {
646    return treeParents($p)
647  }
648  set url [ expr { [ string range $url end-13 end ] eq "repository.php" ?
649                   $url : "${url}repository.php" } ]
650  set repo [ expr { [ info exists urlmap($url) ] ? $urlmap($url) : "unknown" } ]
651  if { [ info exists packSyncInfo($p) ] } {
652    array set packSync $packSyncInfo($p)
653    set lastlocal $packSync(lastlocal)
654    set lastremote $packSync(lastremote)
655    if { $lastlocal eq "" } {
656      set img "package_down_16"
657      set nodeStatus new
658      set statusLabel "new ($lastremote)"
659    } else {
660      set idx [ CmpVersion $lastremote $lastlocal ]
661      if { $idx <= 0 } {
662        # could be -1 (because of date error)
663        set img "cdr_tick_16"
664        set nodeStatus ok
665        set statusLabel "ok"
666      } else {
667        puts "$lastremote > $lastlocal"
668        set img "software_update_16"
669        set nodeStatus upgrade
670        set statusLabel "upgrade ($lastremote)"
671      }
672    }
673  } else {
674    set img ""
675    set nodeStatus unknown
676    set statusLabel "unknown"
677 }
678  set treeParents($p) [ $T insert [ list [ list $img $p ] [ list $statusLabel ] \
679                                        [ list $repo ] ] -at end -relative root \
680                                        -button auto ]
681  set nodesInfo($treeParents($p),type) pkg
682  set nodesInfo($treeParents($p),status) $nodeStatus
683  lappend nodesInfo($nodeStatus) $treeParents($p)
684}
685
686proc ::TolPkgGUI::FillTreeInfo { T } {
687  variable packSyncInfo
688  variable versSyncInfo
689  variable localVersionInfo
690  variable treeParents
691  variable nodesInfo
692  variable localMostRecent
693
694  array unset treeParents
695  array unset nodesInfo
696  ReadPackSyncInfo
697  ReadVersSyncInfo
698  ReadLocalVersionInfo
699
700  $T configure -table no -filter yes -columns {
701    { {image text} -tags NAME -label "Name" }
702    { {text} -tags STATUS -label "Status" }
703    { {text} -tags REPO -label "Repository" }
704  }
705
706  # insert package information
707  foreach p [ lsort [ array names packSyncInfo ] ] {
708    array unset pkg
709    array set pkg $packSyncInfo($p)
710    set url $pkg(url)
711    set pkgRepo [ expr { [ string range $url end-13 end ] eq "repository.php" ?
712                         $url : "${url}repository.php" } ]
713    GetPkgNode $T $pkgRepo $p
714  }
715 
716  set localVersionNames [ lsort -decreasing -command ::TolPkgGUI::CmpVersion \
717                              [ array names localVersionInfo ] ]
718
719  array unset localMostRecent
720  # insert version information
721  foreach pv $localVersionNames {
722    array unset pkg
723    array set pkg $localVersionInfo($pv)
724    set pkgRoot [ lindex [ split $pv . ] 0 ]
725    set url $pkg(_.autodoc.url)
726    set pkgRepo [ expr { [ string range $url end-13 end ] eq "repository.php" ?
727                         $url : "${url}repository.php" } ]
728    GetPkgNode $T $pkgRepo $pkgRoot
729
730    if { ![ info exists localMostRecent($pkgRoot) ] } {
731      # will be used in contextual menu
732      set localMostRecent($pkgRoot) $pv
733    }
734    if { [ info exists versSyncInfo($pv) ] } {
735      array set versSync $versSyncInfo($pv)
736      set dateremote $versSync(dateremote)
737      set datelocal $versSync(datelocal)
738      if { $datelocal eq "TheBegin" } {
739        set img "package_down_16"
740        set nodeStatus new
741        set statusLabel "new"
742      } else {
743        set idx [ string compare $dateremote $datelocal ]
744        if { $idx <= 0 } {
745          # could be -1 (because of date error)
746          set img "cdr_tick_16"
747          set nodeStatus ok
748          set statusLabel "ok"
749        } else {
750          puts "$pv OUTDATED : $dateremote > $datelocal"
751          set img "software_update_16"
752          set nodeStatus update
753          set statusLabel "outdated"
754        }
755      }
756    } else {
757      set img ""
758      set nodeStatus unknown
759    }
760    set repo [ GetRepoId $pkgRepo ]
761    set nid [ $T insert [ list [ list $img $pv ] [ list $statusLabel ] [ list $repo ] ] \
762                  -at end -relative $treeParents($pkgRoot) -button auto ]
763    set nodesInfo($nid,type) pkgver
764    set nodesInfo($nid,status) $nodeStatus
765    lappend nodesInfo($nodeStatus) $nid
766    foreach {{} d} $pkg(_.autodoc.dependencies) {
767      set _nid [ $T insert [ list [ list back_to_ou_16 $d ] ] \
768                    -at end -relative $nid -button no ]
769      set nodesInfo($_nid,type) pkgdep
770    }
771  }
772}
773
774proc ::TolPkgGUI::CreateTreeWidget { t } {
775  variable tree $t
776
777  wtree $t
778  grid $t -row 1 -column 0 -sticky "snew"
779  set f [ winfo parent $t ]
780  grid rowconfigure $f 1 -weight 1
781  grid columnconfigure $f 0 -weight 1
782}
783
784proc ::TolPkgGUI::CreateTree { t } {
785  variable widgets
786
787  CreateTreeWidget $t
788
789  menu $t.cmenu -tearoff 0 \
790      -postcommand [ list ::TolPkgGUI::PostContextMenu $t $t.cmenu ]
791  $t configure -contextmenu $t.cmenu
792}
793
794proc ::TolPkgGUI::EntryState { listName } {
795  upvar $listName v
796
797  if { [ info exists v ] && [ llength $v ] } {
798    return "normal"
799  } else {
800    return "disabled"
801  }
802}
803
804proc ::TolPkgGUI::PostContextMenu { T w } {
805  variable nodesInfo
806  variable packSyncInfo
807  variable versSyncInfo
808  variable localVersionInfo
809  variable localMostRecent
810
811  $w delete 0 end
812  array set selectionInfo {
813    repo   ""
814    pkg    ""
815    pkgver ""
816  }
817  foreach nid [ $T selection get ] {
818    lappend selectionInfo($nodesInfo($nid,type)) $nid
819  }
820  $w add command  -label "[ mc {Add New Repository} ]..." \
821      -command ::TolPkgGUI::AddNewRepository
822  set lenRepo [ llength $selectionInfo(repo) ]
823  if { $lenRepo } {
824    $w add cascade  -label "[ mc {Check Repository} ]" \
825        -menu $w.check
826    if { [ winfo exists $w.check ] } {
827      $w.check delete 0 end
828    } else {
829      menu $w.check -tearoff 0
830    }
831    if { $lenRepo > 1 } {
832      set labelCheck [ mc "Selected" ]
833    } else {
834      set labelCheck [ $T item text [ lindex $selectionInfo(repo) 0 ] 0 ]
835    }
836    $w.check add command -label $labelCheck \
837        -command "::TolPkgGUI::CheckRepository $labelCheck $lenRepo"
838    $w.check add command -label [ mc "All" ] \
839        -command "::TolPkgGUI::CheckRepository ALL -1"
840  }
841  $w add command -label [ mc "Sync with servers" ] \
842      -command "::TolPkgGUI::SyncServers"
843  $w add separator
844  # preprocess selection of packages
845  set listNEW {}
846  set listUPD {}
847  set listUPG {}
848  set listEXP {}
849 
850  # process first the list of pkg
851  foreach nid $selectionInfo(pkg) {
852    set pkg [ $T item text $nid 0 ]
853    array unset pkgInfo
854    if { [ info exists packSyncInfo($pkg) ] } {
855      array set pkgInfo $packSyncInfo($pkg)
856    } else {
857      set pkgInfo(lastremote) $localMostRecent($pkg)
858    }
859    switch -exact $nodesInfo($nid,status) {
860      "new" {
861        lappend listNEW [ list $pkgInfo(lastremote) $nid ]
862      }
863      "upgrade" {
864        lappend listUPG [ list $pkg $nid ]
865      }
866      "ok" {
867      }
868      "unknown" {
869      }
870      default {
871        puts "unexpected status $status for pkg $pkg"
872      }
873    }
874    lappend listEXP [ list $pkgInfo(lastremote) $nodesInfo($nid,status) $nid ]
875  }
876  # next process the list of pkgver
877  foreach nid $selectionInfo(pkgver) {
878    set pkg [ $T item text $nid 0 ]
879    switch -exact $nodesInfo($nid,status) {
880      "new" {
881        if { [ lsearch $listNEW $pkg ] == -1 } {
882          lappend listNEW [ list $pkg $nid ]
883        }
884      }
885      "update" {
886        lappend listUPD [ list $pkg $nid ]
887      }
888      "ok" {
889      }
890      default {
891        puts "unexpected status $status for pkg $pkg"
892      }
893    }
894    if { [ lsearch $listEXP $pkg ] == -1 } {
895      lappend listEXP [ list $pkg $nodesInfo($nid,status) $nid ]
896    }
897  }
898  # install list
899  if { [ llength $listNEW ] == 1 } {
900    $w add command -label [ mc "Install %s" [ lindex [ lindex $listNEW 0 ] 0 ] ] \
901        -command [ list ::TolPkgGUI::InstallPackages $listNEW ]
902  } elseif { [ llength $listNEW ] > 1 } {
903    $w add command -label [ mc "Install selected" ]... \
904        -command [ list ::TolPkgGUI::InstallPackages $listNEW ]
905  }
906  $w add command -label [ mc "Install ZIP" ]... \
907      -command "::TolPkgGUI::InstallZip"
908  # update list
909  if { [ llength $listUPD ] == 1 } {
910    $w add command \
911        -label [ mc "Update %s" [ lindex [ lindex $listUPD 0 ] 0 ] ] \
912        -command [ list ::TolPkgGUI::UpdatePackageVersion $listUPD ]
913  } elseif { [ llength $listUPD ] > 1 } {
914    $w add command -label [ mc "Update selected" ]... \
915        -command [ list ::TolPkgGUI::UpdatePackageVersion $listUPD ]
916  }
917  $w add command -label [ mc "Update all" ]... \
918      -command "::TolPkgGUI::UpdatePackageVersion" \
919      -state [ EntryState nodesInfo(update) ]
920  # upgrade list
921  if { [ llength $listUPG ] == 1 } {
922    $w add command \
923        -label [ mc "Upgrade %s" [ lindex [ lindex $listUPG 0 ] 0 ] ] \
924        -command [ list ::TolPkgGUI::UpgradePackages $listUPG ]
925  } elseif { [ llength $listUPG ] > 1 } {
926    $w add command -label [ mc "Upgrade selected" ]... \
927        -command [ list ::TolPkgGUI::UpgradePackages $listUPG ]
928  }
929  $w add command -label [ mc "Upgrade all" ]... \
930      -command "::TolPkgGUI::UpgradePackages" \
931      -state [ EntryState nodesInfo(upgrade) ]
932
933  # export options
934  $w add separator
935  if { [ llength $listEXP ] == 1 } {
936    $w add command -label [ mc "Export %s" [ lindex [ lindex $listEXP 0 ] 0 ] ]... \
937        -command [ list ::TolPkgGUI::ExportPackageVersion $listEXP ]
938  } elseif { [ llength $listEXP ] > 1 } {
939    $w add command -label [ mc "Export selected" ]... \
940        -command [ list ::TolPkgGUI::ExportPackageVersion $listEXP ]
941  } 
942  $w add command -label [ mc "Export all" ]... \
943      -command [ list ::TolPkgGUI::ExportPackageVersion ]
944  # SyncInfo import/export
945  $w add separator
946  $w add command -label [ mc "Import SyncInfo" ]... \
947      -command [ list ::TolPkgGUI::ImportSyncInfo ]
948  $w add command -label [ mc "Export SyncInfo" ]... \
949      -command [ list ::TolPkgGUI::ExportSyncInfo ]
950 
951}
952
953proc ::TolPkgGUI::AddNewRepository { } {
954  variable win
955  variable urlmap
956
957  set w $win.dlgAdd
958  if { ![ winfo exist $w ] } {
959    Dialog $w -title [ mc "Add repository"] \
960        -parent $win -modal local
961    set f [ $w getframe ]
962    label $f.lb -text [ mc "Repository" ]:
963    ComboBox $f.cb -values BPTP
964    grid $f.lb -row 0 -column 0 -sticky ew
965    grid $f.cb -row 0 -column 1 -sticky ew
966    grid columnconfigure $f 1 -weight 1
967    $w add -text Ok
968    $w add -text Cancel
969  }
970  set ans [ $w draw ]
971  if { $ans == 0 } {
972    set repo [ string trim [ [$w getframe].cb get ] ]
973    if { [ string range $repo 0 3 ] eq "http" } {
974      set url $repo
975    } else {
976      if { [ info exists urlmap($repo) ] } {
977        set url $urlmap($repo)
978      } else {
979       
980      }
981    }
982    puts "::TolPkg::AddRepository $url"
983    ::TolPkg::AddRepository $url
984  }
985}
986
987proc ::TolPkgGUI::RefreshTree { } {
988  variable tree
989
990  $tree item delete all
991  FillTreeInfo $tree
992}
993
994proc ::TolPkgGUI::SyncServers { } {
995  variable tree
996  update
997  ::TolPkg::UpdateRepositoryInfo
998  RefreshTree
999}
1000
1001proc ::TolPkgGUI::StartProgressBar { } {
1002  variable win
1003  variable Progress
1004
1005  set Progress(status) "working"
1006  set Progress(state) 0
1007  $win configure -cursor watch
1008  foreach wc [ winfo children $win.dlgInstall ] {
1009    catch { $wc configure -cursor watch }
1010  }
1011}
1012
1013proc ::TolPkgGUI::DoneProgress { } {
1014  variable win
1015  variable Progress
1016
1017  set Progress(status) "stopped"
1018  Dialog::enddialog $win.dlgInstall 1
1019  $win configure -cursor ""
1020  foreach wc [ winfo children $win.dlgInstall ] {
1021    catch { $wc configure -cursor "" }
1022  }
1023}
1024
1025proc ::TolPkgGUI::AdvanceProgress { x } {
1026  variable Progress
1027
1028  if { $Progress(status) eq "working" } {
1029    set Progress(state) $x
1030    update
1031  }
1032}
1033
1034proc ::TolPkgGUI::InstallBtn1 { remote } {
1035  variable win
1036  variable Progress
1037
1038  set w $win.dlgInstall
1039  $w itemconfigure 0 -state disabled
1040  $w itemconfigure 1 -command ::TolPkgGUI::DoneProgress
1041  set f [ $w getframe ]
1042  $f.lb1 configure -text [ mc "Installing" ]...
1043  InstallTask $remote
1044}
1045
1046proc ::TolPkgGUI::DlgProcessBtn1 { } {
1047  variable win
1048  variable DlgProcessData
1049
1050  set w [ DlgProcessGetWin ]
1051  # disable button Ok
1052  $w itemconfigure 0 -state disabled
1053  # set cancel to finish progress
1054  $w itemconfigure 1 -command ::TolPkgGUI::DlgProcessStop
1055  eval $DlgProcessData(-beforestart)
1056  DlgProcessTask
1057}
1058
1059proc ::TolPkgGUI::DlgProcess { pkgs args } {
1060  variable win
1061  variable DlgProcessData
1062
1063  array unset DlgProcessData
1064  array set DlgProcessData {
1065    -title "Process packages"
1066    -beforestart ""
1067    -cmditem ""
1068    -cmdlabelitem ""
1069    -customgui ""
1070    -refreshtree 0
1071  }
1072  set DlgProcessData(-label) [ mc "You are about to process"]:
1073  array set DlgProcessData $args
1074  set DlgProcessData(items) $pkgs
1075  set DlgProcessData(status) "stopped"
1076  set DlgProcessData(state) ""
1077  set w [ DlgProcessGetWin ]
1078  if { ![ winfo exists $w ] } {
1079    Dialog $w -title $DlgProcessData(-title) \
1080        -parent $win -modal local -cancel 1 -separator 1
1081    set f [ $w getframe ]
1082    label $f.lb1
1083    listbox $f.list -selectmode single -background white \
1084        -relief flat -borderwidth 1 -highlightthickness 0 \
1085        -selectbackground #c3c3ff
1086    frame $f.cgui
1087    ProgressBar $f.pbar
1088    $w add -text Ok
1089    $w add -text Cancel
1090    grid $f.lb1 -row 0 -column 0 -sticky w
1091    grid $f.list -row 1 -column 0 -sticky snew
1092    grid $f.pbar -row 2 -column 0 -sticky e
1093    grid columnconfigure $f 0 -weight 1
1094    grid rowconfigure $f 1 -weight 1
1095  } else {
1096    wm title $w $DlgProcessData(-title)
1097    set f [ DlgProcessGetFrame ]
1098  }
1099  if { $DlgProcessData(-customgui) ne "" } {
1100    grid $f.cgui -row 3 -column 0 -sticky snew
1101    eval $DlgProcessData(-customgui) $f.cgui
1102  } else {
1103    grid remove $f.cgui
1104    grid rowconfigure $f 3 -weight 0
1105  }
1106  $f.pbar configure -maximum 1 \
1107      -variable ::TolPkgGUI::DlgProcessData(state,0)
1108  $f.pbar configure -variable ::TolPkgGUI::DlgProcessData(state)
1109 
1110  $f.lb1 configure -text $DlgProcessData(-label)
1111  $w itemconfigure 0 -state normal \
1112      -command [ list ::TolPkgGUI::DlgProcessBtn1 ]
1113  $w itemconfigure 1 -command "Dialog::enddialog $w 1"
1114  set lb [ DlgProcessGetList ]
1115  $lb delete 0 end
1116  foreach it $DlgProcessData(items) {
1117    if { $DlgProcessData(-cmdlabelitem) ne "" } {
1118      set labelIt [ $DlgProcessData(-cmdlabelitems) $it ]
1119    } else {
1120      set labelIt $it
1121    }
1122    $f.list insert end $it
1123  }
1124  set DlgProcessData(state) ""
1125  $w draw
1126  foreach wc [ winfo children $f.cgui ] {
1127    destroy $wc
1128  }
1129}
1130
1131proc ::TolPkgGUI::DlgProcessGetCurrentIndex { } {
1132  variable DlgProcessData
1133
1134  return $DlgProcessData(current)
1135}
1136
1137proc ::TolPkgGUI::DlgProcessStart { } {
1138  variable win
1139  variable DlgProcessData
1140
1141  set lb [ DlgProcessGetList ]
1142  set total [ llength $DlgProcessData(items) ]
1143  set DlgProcessData(current) 0
1144  $lb selection clear 0 end
1145  $lb selection set 0
1146  $lb see 0
1147  set DlgProcessData(status) "working"
1148  set DlgProcessData(state) 0
1149  $win configure -cursor watch
1150  set w [ DlgProcessGetWin ]
1151  foreach wc [ winfo children $w ] {
1152    catch { $wc configure -cursor watch }
1153  }
1154}
1155
1156proc ::TolPkgGUI::DlgProcessAdvance { } {
1157  variable DlgProcessData
1158
1159  set i [ incr DlgProcessData(current) ]
1160  set lb [ DlgProcessGetList ]
1161  set total [ llength $DlgProcessData(items) ]
1162  $lb selection set $i
1163  $lb selection anchor $i
1164  $lb see $i
1165  if { $DlgProcessData(status) eq "working" } {
1166    set DlgProcessData(state) [ expr { double($i) / $total } ]
1167    update
1168  }
1169}
1170
1171proc ::TolPkgGUI::DlgProcessItem { p } {
1172  variable DlgProcessData
1173
1174  if { $DlgProcessData(-cmditem) ne "" } {
1175    $DlgProcessData(-cmditem) $p
1176  }
1177}
1178
1179proc ::TolPkgGUI::DlgProcessStop { } {
1180  variable win
1181  variable DlgProcessData
1182 
1183  set w [ DlgProcessGetWin ]
1184  $win configure -cursor ""
1185  foreach wc [ winfo children $w ] {
1186    catch { $wc configure -cursor "" }
1187  }
1188  set DlgProcessData(status) "stopped"
1189  Dialog::enddialog $w 1
1190}
1191
1192proc ::TolPkgGUI::DlgProcessGetWin { } {
1193  variable win
1194
1195  return $win.dlgProcess
1196}
1197
1198proc ::TolPkgGUI::DlgProcessGetFrame { } {
1199  variable win
1200
1201  set w [ DlgProcessGetWin ]
1202  return [ $w getframe ]
1203}
1204
1205proc ::TolPkgGUI::DlgProcessGetList { } {
1206  variable win
1207
1208  set w [ DlgProcessGetFrame ]
1209  return $w.list
1210}
1211
1212proc ::TolPkgGUI::DlgProcessSetLabel { text } {
1213  variable win
1214 
1215  set f [ DlgProcessGetFrame ]
1216  $f.lb1 configure -text $text
1217}
1218
1219proc ::TolPkgGUI::InstallPackages { pkgs } {
1220  variable win
1221  variable installData
1222
1223  array unset installData
1224  foreach p $pkgs {
1225    array set installData $p
1226    lappend _pkgs [ lindex $p 0 ]
1227  }
1228  set InstallList [ TolPkg::CheckPackagesToInstall $_pkgs ]
1229  if { ![ llength $InstallList ] } {
1230    set ans [ MessageDlg $win.ask -title [ mc "Install packages" ] \
1231                  -icon error \
1232                  -parent $win \
1233                  -type ok -aspect 75 \
1234                  -message [ mc "Could not connect with remote repository" ] ]
1235    return
1236  }
1237  puts "InstallPackages: $InstallList"
1238  DlgProcess $InstallList -title [ mc "Install packages" ] \
1239      -label [ mc "You are about to install"]: \
1240      -beforestart ::TolPkgGUI::Installing \
1241      -cmditem "InstallThisPackage" -refreshtree 1
1242 
1243}
1244
1245proc ::TolPkgGUI::DlgProcessGetVariableName { name } {
1246  return ::TolPkgGUI::DlgProcessData($name)
1247}
1248
1249proc ::TolPkgGUI::DlgProcessGetVariable { name } {
1250  variable DlgProcessData
1251
1252  return $DlgProcessData($name)
1253}
1254
1255proc ::TolPkgGUI::DlgProcessTask { } {
1256  variable win
1257  variable Progress
1258  variable DlgProcessData
1259 
1260  DlgProcessStart
1261  set hasProcessed 0
1262  foreach p $DlgProcessData(items) {
1263    if { $DlgProcessData(status) ne "working" } break
1264    DlgProcessItem $p
1265    DlgProcessAdvance
1266    set hasProcessed 1
1267  }
1268  DlgProcessStop
1269  if { $DlgProcessData(-refreshtree) && $hasProcessed } {
1270    after idle ::TolPkgGUI::RefreshTree
1271  }
1272}
1273
1274proc ::TolPkgGUI::InstallTask { remote } {
1275  variable win
1276  variable Progress
1277  variable InstallList
1278 
1279  set w $win.dlgInstall
1280  set f [ $w getframe ]
1281  set total [ llength $InstallList ]
1282  set i 0
1283  $f.list selection clear 0 end
1284  $f.list selection set 0
1285  $f.list see 0
1286  StartProgressBar
1287  foreach p $InstallList {
1288    if { $Progress(status) ne "working" } break
1289    if { $remote } {
1290      TolPkg::RemoteInstall $p
1291    } else {
1292      TolPkg::ZipInstall $p
1293    }
1294    incr i
1295    $f.list selection set $i
1296    $f.list selection anchor $i
1297    $f.list see $i
1298    AdvanceProgress [ expr { double($i) / $total } ]
1299  }
1300  DoneProgress
1301 
1302}
1303
1304proc ::TolPkgGUI::InstallZip { } {
1305  variable win
1306  variable installZipData
1307
1308  set installZipData [ tk_getOpenFile -defaultextension .zip -multiple 1 \
1309                           -parent $win -title [ mc "Select zip packages" ] \
1310                           -filetypes {{zip {.zip}}} ]
1311  if { $installZipData ne "" } {
1312    foreach f $installZipData {
1313      lappend zipList [ file tail $f ]
1314    }
1315    DlgProcess $zipList -title [ mc "Install Zip's" ] \
1316        -label [ mc "You are about to install zip"]: \
1317        -beforestart ::TolPkgGUI::InstallingZip \
1318        -cmditem InstallThisZip -refreshtree 1
1319  }
1320}
1321
1322proc ::TolPkgGUI::CheckConnectionConfig { } {
1323  variable win
1324
1325  array set connConfig [ ::TolPkg::GetUpgradeConfig ]
1326  if { $connConfig(localPKG) } {
1327    MessageDlg $win.ask -title [ mc "Warning" ] \
1328        -icon warning \
1329        -type ok \
1330        -message [ mc "Can not continue. You have configured to use only local packages. Check the value of\nTolConfigManager::Config::Upgrading::TolPackage::LocalOnly." ]
1331    return 0
1332  }
1333  return 1
1334}
1335
1336proc ::TolPkgGUI::UpgradePackages { { pkgs {} } } {
1337  variable installData
1338  variable nodesInfo
1339  variable tree
1340
1341  if { ![ CheckConnectionConfig ] } {
1342    return
1343  }
1344  array unset installData
1345  if { [ llength $pkgs ] } {
1346    foreach p $pkgs {
1347      array set installData $p
1348      lappend upgradeList [ lindex $p 0 ]
1349    }
1350  } else {
1351    # upgrade all, look for the list
1352    if { [ info exists nodesInfo(upgrade) ] } {
1353      foreach nid $nodesInfo(upgrade) {
1354        set p [ $tree item text $nid 0 ]
1355        lappend upgradeList $p
1356        set installData($p) $nid
1357      }
1358    } else {
1359      return
1360    }
1361  }
1362  DlgProcess $upgradeList -title [ mc "Upgrade packages" ] \
1363      -label [ mc "You are about to upgrade"]: \
1364      -beforestart ::TolPkgGUI::Upgrading \
1365      -cmditem "InstallThisPackage" -refreshtree 1
1366}
1367
1368proc ::TolPkgGUI::UpdatePackageVersion { { pkgs {} } } {
1369  variable installData
1370  variable nodesInfo
1371  variable tree
1372
1373  puts "UpdatePackageVersion: $pkgs"
1374  if { ![ CheckConnectionConfig ] } {
1375    return
1376  }
1377 
1378  array unset installData
1379  set updateList {}
1380  if { [ llength $pkgs ] } {
1381    foreach p $pkgs {
1382      array set installData $p
1383      lappend updateList [ lindex $p 0 ]
1384    }
1385  } else {
1386    # update all, look for the list
1387    if { [ info exists nodesInfo(update) ] } {
1388      foreach nid $nodesInfo(update) {
1389        set p [ $tree item text $nid 0 ]
1390        lappend updateList $p
1391        set installData($p) $nid
1392      }
1393    } else {
1394      return
1395    }
1396  }
1397  DlgProcess $updateList -title [ mc "Update packages" ] \
1398      -label [ mc "You are about to update"]: \
1399      -beforestart ::TolPkgGUI::Updating \
1400      -cmditem "InstallThisPackage" -refreshtree 1
1401}
1402
1403proc ::TolPkgGUI::ImportSyncInfo { } {
1404  Unimplemented "Import Sync Info"
1405}
1406
1407proc ::TolPkgGUI::ExportSyncInfo { } {
1408  Unimplemented "Export Sync Info"
1409}
1410
1411proc ::TolPkgGUI::Unimplemented { title } {
1412  variable win
1413
1414  MessageDlg $win.ask -parent $win -title [ mc $title ] \
1415      -icon warning \
1416      -type ok -message [ mc "Unimplemented option" ]
1417}
1418
1419##
1420# Export packages --
1421#
1422# p == "" then the last installed version of every package is
1423# exported,
1424#
1425# [ llength $p ]>0 then all specified package is exported, if some
1426# packages is not installed then it is requested from the remote
1427# repository.
1428#
1429
1430# Funciones que hacen falta:
1431#
1432#  1- Crear un zip de un paquete local
1433#  2- Descargar un zip de un paquete remoto
1434#
1435proc ::TolPkgGUI::ExportPackageVersion { {pkgs ""} } {
1436  variable win
1437
1438  if { ![ CheckConnectionConfig ] } {
1439    return
1440  }
1441  if { ![ llength $pkgs ] } {
1442    Unimplemented "Export all packages"
1443    return
1444  }
1445  set remote {}
1446  set local {}
1447  foreach _p $pkgs {
1448    foreach { p s } $_p break
1449    if { $s eq "upgrade" || $s eq "new" } {
1450      lappend remote $p
1451    } else {
1452      lappend local $p
1453    }
1454  }
1455  if { [ llength $remote ] } {
1456    set ans [ MessageDlg $win.ask -title [ mc "Export packages" ] \
1457                  -icon warning \
1458                  -type okcancel -aspect 75 \
1459                  -message [ mc "The following package can not be exported because they are not installed:\n%s\n\nContinue?" $remote ] ]
1460    if { $ans == 1 } {
1461      return
1462    }
1463  }
1464  puts "ExportPackageVersion: $local"
1465  if { [ llength $local ] } {
1466    DlgProcess $local -title [ mc "Export packages" ] \
1467        -label [ mc "You are about to export"]: \
1468        -beforestart ::TolPkgGUI::Exporting \
1469        -customgui "CreateSelectDir" \
1470        -cmditem "ExportThisPackage" -refreshtree 0
1471  }
1472}
1473
1474proc ::TolPkgGUI::Exporting { } {
1475  DlgProcessSetLabel [ mc "Exporting" ]...
1476}
1477
1478proc ::TolPkgGUI::Installing { } {
1479  DlgProcessSetLabel [ mc "Installing" ]...
1480}
1481
1482proc ::TolPkgGUI::Upgrading { } {
1483  DlgProcessSetLabel [ mc "Upgrading" ]...
1484}
1485
1486proc ::TolPkgGUI::Updating { } {
1487  DlgProcessSetLabel [ mc "Updating" ]...
1488}
1489
1490proc ::TolPkgGUI::InstallingZip { } {
1491  DlgProcessSetLabel [ mc "Installing Zip" ]...
1492}
1493
1494proc ::TolPkgGUI::CreateSelectDir { f } {
1495  set varname [ DlgProcessGetVariableName "directory" ]
1496  upvar \#0 $varname var
1497
1498
1499  if { ![ info exists $varname ] } {
1500    trace add variable $varname write ::TolPkgGUI::OnChangeDirectory
1501  }
1502  label $f.lb -text [ mc "Output directory" ]:
1503  entry $f.ent -textvariable $varname
1504  button $f.btn -image folder_yellow_16 \
1505      -command "::TolPkgGUI::ChooseDir $varname"
1506  grid $f.lb -row 0 -column 0 -sticky w
1507  grid $f.ent -row 0 -column 1 -sticky ew
1508  grid $f.btn -row 0 -column 2 -sticky ew
1509  grid columnconfigure $f 1 -weight 1
1510  if { $var eq "" } {
1511    set var [ pwd ]
1512  } else {
1513    set var $var
1514  }
1515}
1516
1517proc ::TolPkgGUI::OnChangeDirectory { args } {
1518  set w [ DlgProcessGetWin ]
1519  set dir [ DlgProcessGetVariable directory ]
1520  if { [ file exists $dir ] && [ file writable $dir ] } {
1521    $w itemconfigure 0 -state normal
1522  } else {
1523    $w itemconfigure 0 -state disabled
1524  }
1525}
1526
1527proc ::TolPkgGUI::ChooseDir { varname } {
1528  variable win
1529 
1530  puts "upvar \#0 $varname var"
1531  upvar \#0 $varname var
1532
1533  set res [ tk_chooseDirectory -parent $win -initialdir $var \
1534                -mustexist 1 -title [ mc "Select output directory" ] ]
1535  if { $res ne "" } {
1536    set var $res
1537  }
1538}
1539
1540proc ::TolPkgGUI::ExportThisPackage { p } {
1541  set status [ TolPkg::ExportPackage $p [ DlgProcessGetVariable "directory" ] ]
1542  puts "::TolPkgGUI::ExportThisPackage $p ==> $status"
1543}
1544
1545proc ::TolPkgGUI::InstallThisPackage { p } {
1546  variable win
1547  variable urlmap
1548  variable installData
1549 
1550  if { [ info exists installData($p) ] } {
1551    set nid $installData($p)
1552    set REPO [ $win.tree item text $nid REPO ]
1553    set repo $urlmap($REPO)
1554  } else {
1555    # packages requested as a dependencie
1556    set repo ""
1557  }
1558  set result [ TolPkg::RemoteInstall $p $repo ]
1559  puts "TolPkg::RemoteInstall $p: $result"
1560}
1561
1562proc ::TolPkgGUI::InstallThisZip { p } {
1563  variable win
1564  variable urlmap
1565  variable installZipData
1566 
1567  puts "::TolPkgGUI::InstallThisZip $p"
1568  set idx [ DlgProcessGetCurrentIndex ]
1569  set thisZip [ lindex $installZipData $idx ]
1570  set result [ TolPkg::ZipInstall $thisZip ]
1571  puts "::TolPkgGUI::InstallThisZip $p: $result"
1572}
1573
1574proc ::TolPkgGUI::Show { } {
1575  variable win
1576
1577  set win .tolpkg
1578
1579  if { [ winfo exists $win ] } {
1580    raise $win
1581  } else {
1582    toplevel $win
1583    wm state $win withdrawn
1584    CreateTree $win.tree
1585    FillTreeInfo $win.tree
1586    wm state $win normal
1587  }
1588}
1589
1590proc ::TolPkgGUI::test { } {
1591  destroy .tolpkg
1592  ::TolPkgGUI::Show
1593}
1594
1595if { 0 } {
1596  ::TolPkg::UpdateRepositoryInfo
1597  ::TolPkgGUI::test
1598}
Note: See TracBrowser for help on using the repository browser.