Subject: Re: Smarter make update / pkg_chk algo
To: Hubert Feyrer <hubert@feyrer.de>
From: David Brownlee <abs@NetBSD.org>
List: tech-pkg
Date: 05/24/2005 17:49:56
  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.

--0-1288579207-1116953396=:470
Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed

 	I've had a quick spin at this, and rather than make things more
 	complicated had a pass at making things simpler.

 	In the attached 'pkg_chk -u' will, if any packages are out of date:
 	  - generate a list of all installed packages (pkgchk_update.conf)
 	  - merge in any previous pkg_update -u run
 	  - remove out of date packages
 	  - install all 'missing' packages
 	  - if installed successfully, delete pkgchk_update.conf

 	It also now works against binary packages.

 	It does mean that all out of date packages are removed before
 	any are installed, but that is what I've been doing (with
 	pkg_chk -r ... ; pkg_chk -aks) for years anyway.

 	The resultant script is one line shorter and slightly smaller :)

 	What do people think?

-- 
 		David/absolute       -- www.NetBSD.org: No hype required --
--0-1288579207-1116953396=:470
Content-Type: TEXT/PLAIN; charset=US-ASCII; name=pkg_chk.sh
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.NEB.4.62.0505241749560.470@localhost.>
Content-Description: 
Content-Disposition: attachment; filename=pkg_chk.sh

IyFAU0hAIC1lDQojDQojICRJZDogcGtnX2Noay5zaCx2IDEuMTQgMjAwNS8w
NC8yMCAxNTozMjoyNSBhYnMgRXhwICQNCiMNCiMgVE9ETzogSGFuZGxlIHVw
ZGF0ZXMgd2l0aCBkZXBlbmRlbmNpZXMgdmlhIGJpbmFyeSBwYWNrYWdlcw0K
DQpQQVRIPS91c3Ivc2JpbjovdXNyL2Jpbjoke1BBVEh9DQoNCmNoZWNrX3Bh
Y2thZ2VzX2luc3RhbGxlZCgpDQogICAgew0KICAgIE1JU1NJTkdfVE9ETz0N
CiAgICBNSVNNQVRDSF9UT0RPPQ0KDQogICAgZm9yIHBrZ2RpciBpbiAkKiA7
IGRvDQoNCglpZiBbIC1uICIkb3B0X0IiIF07dGhlbg0KCSAgICBleHRyYWN0
X3BrZ192YXJzICRwa2dkaXIgUEtHTkFNRSBGSUxFU0RJUiBQS0dESVIgRElT
VElORk9fRklMRSBQQVRDSERJUg0KCWVsc2UNCgkgICAgZXh0cmFjdF9wa2df
dmFycyAkcGtnZGlyIFBLR05BTUUNCglmaQ0KCWlmIFsgLXogIiRQS0dOQU1F
IiBdOyB0aGVuDQoJICAgIE1JU1NfRE9ORT0kTUlTU19ET05FIiAiJHBrZ2Rp
cg0KCSAgICBjb250aW51ZQ0KCWZpDQoJaWYgWyAhIC1kICRQS0dfREJESVIv
JFBLR05BTUUgXTt0aGVuDQoJICAgIG1zZ19uICIkUEtHTkFNRTogIg0KCSAg
ICBwa2c9JChlY2hvICRQS0dOQU1FIHwgJHtTRUR9ICdzLy1bMC05XS4qLy8n
KQ0KCSAgICBwa2dpbnN0YWxsZWQ9JChzaCAtYyAiJHtQS0dfSU5GT30gLWUg
JHBrZyIgfHwgdHJ1ZSkNCgkgICAgSU5TVEFMTD0NCgkgICAgaWYgWyAtbiAi
JHBrZ2luc3RhbGxlZCIgXTt0aGVuDQoJCW1zZ19uICJ2ZXJzaW9uIG1pc21h
dGNoIC0gJHBrZ2luc3RhbGxlZCINCgkJTUlTTUFUQ0hfVE9ETz0iJE1JU01B
VENIX1RPRE8gJHBrZ2luc3RhbGxlZCINCgkgICAgZWxzZQ0KCQltc2dfbiAi
bWlzc2luZyINCgkJTUlTU0lOR19UT0RPPSIkTUlTU0lOR19UT0RPICRQS0dO
QU1FICRwa2dkaXIiDQoJICAgIGZpDQoJICAgIGlmIFsgLWYgJFBBQ0tBR0VT
LyRQS0dOQU1FLnRneiBdIDt0aGVuDQoJCW1zZ19uICIgKGJpbmFyeSBwYWNr
YWdlIGF2YWlsYWJsZSkiDQoJICAgIGZpDQoJICAgIG1zZw0KCWVsc2UNCgkg
ICAgaWYgWyAtbiAiJG9wdF9CIiBdO3RoZW4NCgkJY3VycmVudF9idWlsZF92
ZXI9JChnZXRfYnVpbGRfdmVyKQ0KCQlpbnN0YWxsZWRfYnVpbGRfdmVyPSQo
JHtTRUR9ICJzfF5bXjpdKi9bXjpdKjp8fCIgJFBLR19EQkRJUi8kUEtHTkFN
RS8rQlVJTERfVkVSU0lPTikNCgkJaWYgWyB4IiRjdXJyZW50X2J1aWxkX3Zl
ciIgIT0geCIkaW5zdGFsbGVkX2J1aWxkX3ZlciIgXTt0aGVuDQoJCSAgICBt
c2cgIiRQS0dOQU1FOiBidWlsZC12ZXJzaW9uIG1pc21hdGNoIg0KCQkgICAg
dmVyYm9zZSAiLS1jdXJyZW50LS0iDQoJCSAgICB2ZXJib3NlICIkY3VycmVu
dF9idWlsZF92ZXIiDQoJCSAgICB2ZXJib3NlICItLWluc3RhbGxlZC0tIg0K
CQkgICAgdmVyYm9zZSAiJGluc3RhbGxlZF9idWlsZF92ZXIiDQoJCSAgICB2
ZXJib3NlICItLS0tIg0KCQkgICAgTUlTTUFUQ0hfVE9ETz0iJE1JU01BVENI
X1RPRE8gJFBLR05BTUUiDQoJCWVsc2UNCgkJICAgIHZlcmJvc2UgIiRQS0dO
QU1FOiBPSyINCgkJZmkNCgkgICAgZWxzZQ0KCQl2ZXJib3NlICIkUEtHTkFN
RTogT0siDQoJICAgIGZpDQoJZmkNCiAgICBkb25lDQogICAgfQ0KDQpkZWxl
dGVfcGtncygpDQogICAgew0KICAgIGZvciBwa2cgaW4gJCogOyBkbw0KCWlm
IFsgLWQgJFBLR19EQkRJUi8kcGtnIF0gOyB0aGVuDQoJICAgIHJ1bl9jbWQg
IiR7UEtHX0RFTEVURX0gLXIgJHBrZyIgMQ0KCWZpDQogICAgZG9uZQ0KICAg
IH0NCg0KZXh0cmFjdF9tYWtlX3ZhcnMoKQ0KICAgIHsNCiAgICBNQUtFRklM
RT0kMQ0KICAgIHNoaWZ0DQogICAgdmVyYm9zZSAiRXh0cmFjdCAkQCBmcm9t
ICRNQUtFRklMRSINCiAgICBNQUtFREFUQT0iLlBIT05ZOiB4XG54OlxuIjsN
CiAgICBmb3IgdmFyIGluICQqIDsgZG8NCglNQUtFREFUQT0kTUFLRURBVEEi
XHRAZWNobyAkdmFyPVwkeyR2YXJ9XG4iDQogICAgZG9uZQ0KICAgIGV2YWwg
JChwcmludGYgIiRNQUtFREFUQSIgfCAke01BS0V9IC1mIC0gLWYgJE1BS0VG
SUxFIHggfCBcDQoJCQkJCSR7U0VEfSAtZSAncy9bXj1dKj0vJiIvJyAtZSAn
cy8kLyIvJykNCiAgICB9DQoNCiMgJDEgPSBuYW1lIG9mIHZhcmlhYmxlDQoj
ICQyID0gZGVmYXVsdCB2YWx1ZQ0KZXh0cmFjdF9ta19kaXJfdmFyKCkNCiAg
ICB7DQogICAgaWYgWyAteiAiYGV2YWwgZWNobyBcXCQkMWAiIF0gOyB0aGVu
DQoJZXZhbCAkKHByaW50ZiAiQlNEX1BLR19NSz0xXG4uUEhPTlk6IHhcbng6
XG5cdEBlY2hvICQxPSInJCcieyQxfVxuIiB8ICR7TUFLRX0gLWYgLSAtZiAk
TUFLRUNPTkYgeCkNCglpZiBbIC16ICJgZXZhbCBlY2hvIFxcJCQxYCIgXTsg
dGhlbg0KCSAgICBldmFsICIkMT0kMiINCglmaQ0KCWlmIFsgISAtZCBgZXZh
bCBlY2hvIFxcJCQxYCBdO3RoZW4NCgkgICAgZmF0YWwgIlVuYWJsZSB0byBs
b2NhdGUgJDEgYGV2YWwgZWNobyBcXCQkMWAiDQoJZmkNCiAgICBmaQ0KICAg
IH0NCg0KZXh0cmFjdF9wa2dfdmFycygpDQogICAgew0KICAgIFBLR0RJUj0k
MQ0KICAgIFBLR05BTUU9DQogICAgc2hpZnQ7DQogICAgaWYgWyAtbiAiJG9w
dF9iIiAtYSAteiAiJG9wdF9zIiBdIDsgdGhlbg0KCWZvciBwa2cgaW4gJFBL
R0RCIDsgZG8NCgkgICAgY2FzZSAkcGtnIGluDQoJCSIkUEtHRElSOiIqKQ0K
CQkgICAgUEtHTkFNRT1gZWNobyAkcGtnfCAke1NFRH0gJ3MvW146XSo6Ly8n
YA0KCQkgICAgcmV0dXJuOw0KCQk7Ow0KCSAgICBlc2FjDQoJZG9uZQ0KCW1z
ZyAiV0FSTklORzogTm8gYmluYXJ5IHBhY2thZ2UgZm9yICRQS0dESVIiDQog
ICAgZWxzZQ0KCWlmIFsgISAtZiAkUEtHU1JDRElSLyRwa2dkaXIvTWFrZWZp
bGUgXTt0aGVuDQoJICAgIG1zZyAiV0FSTklORzogTm8gJHBrZ2Rpci9NYWtl
ZmlsZSAtIHBhY2thZ2UgbW92ZWQgb3Igb2Jzb2xldGU/Ig0KCSAgICByZXR1
cm4NCglmaQ0KCWNkICRQS0dTUkNESVIvJFBLR0RJUg0KCWV4dHJhY3RfbWFr
ZV92YXJzIE1ha2VmaWxlICIkQCINCglpZiBbIC16ICIkUEtHTkFNRSIgXTsg
dGhlbg0KCSAgICBmYXRhbCAiVW5hYmxlIHRvIGV4dHJhY3QgUEtHTkFNRSBm
b3IgJHBrZ2RpciINCglmaQ0KICAgIGZpDQogICAgfQ0KDQpleHRyYWN0X3Zh
cmlhYmxlcygpDQogICAgew0KICAgIGV4dHJhY3RfbWtfZGlyX3ZhciBQS0dT
UkNESVIgL3Vzci9wa2dzcmMNCiAgICBleHRyYWN0X21rX2Rpcl92YXIgUEtH
X0RCRElSIC92YXIvZGIvcGtnDQoNCiAgICAjIE5vdyB3ZSBoYXZlIFBLR1NS
Q0RJUiwgdXNlIGl0IHRvIGRldGVybWluZSBQQUNLQUdFUywgYW5kIFBLR0NI
S19DT05GDQogICAgIyBhcyB3ZWxsIGFzIEFXSywgR1JFUCwgU0VELCBQS0dD
SEtfVEFHUyBhbmQgUEtHQ0hLX05PVEFHUw0KICAgICMNCg0KICAgIGlmIFsg
LXogIiRvcHRfYiIgLW8gLW4gIiRvcHRfcyIgLW8gLWQgJFBLR1NSQ0RJUi9w
a2d0b29scy9wa2dfY2hrIF0gOyB0aGVuDQoJY2QgJFBLR1NSQ0RJUi9wa2d0
b29scy9wa2dfY2hrDQoJZXh0cmFjdF9tYWtlX3ZhcnMgTWFrZWZpbGUgQVdL
IEdSRVAgU0VEIFBBQ0tBR0VTIFBLR19JTkZPIFBLR19BREQgXA0KCQkJUEtH
X0RFTEVURSBQS0dDSEtfQ09ORiBQS0dDSEtfVVBEQVRFX0NPTkYgXA0KCQkJ
UEtHQ0hLX1RBR1MgUEtHQ0hLX05PVEFHUw0KCWlmIFsgLXogIiRQQUNLQUdF
UyIgXTt0aGVuDQoJICAgIFBBQ0tBR0VTPSRQS0dTUkNESVIvcGFja2FnZXMN
CglmaQ0KICAgIGVsaWYgWyAkTUFLRUNPTkYgIT0gL2Rldi9udWxsIF0gOyB0
aGVuDQoJZXh0cmFjdF9tYWtlX3ZhcnMgJE1BS0VDT05GIFBBQ0tBR0VTIFBL
R0NIS19DT05GIFBLR0NIS19VUERBVEVfQ09ORiBcDQoJCQlQS0dDSEtfVEFH
UyBQS0dDSEtfTk9UQUdTDQoJaWYgWyAteiAiJFBBQ0tBR0VTIiBdIDsgdGhl
bg0KCSAgICBQQUNLQUdFUz1gcHdkYA0KCWZpDQogICAgZmkNCg0KICAgIGlm
IFsgLXogIiRQS0dDSEtfQ09ORiIgXTt0aGVuDQoJUEtHQ0hLX0NPTkY9JFBL
R1NSQ0RJUi9wa2djaGsuY29uZg0KICAgIGZpDQogICAgaWYgWyAteiAiJFBL
R0NIS19VUERBVEVfQ09ORiIgXTt0aGVuDQoJUEtHQ0hLX1VQREFURV9DT05G
PSRQS0dTUkNESVIvcGtnY2hrX3VwZGF0ZS0kKGhvc3RuYW1lKS5jb25mDQog
ICAgZmkNCiAgICB9DQoNCmZhdGFsKCkNCiAgICB7DQogICAgbXNnICIqKiog
JEAiDQogICAgZXhpdCAxDQogICAgfQ0KDQpmYXRhbF9tYXliZSgpDQogICAg
ew0KICAgIG1zZyAiJEAiDQogICAgaWYgWyAteiAiJG9wdF9rIiBdO3RoZW4N
CglleGl0IDENCiAgICBmaQ0KICAgIH0NCg0KZ2VuZXJhdGVfY29uZl9mcm9t
X2luc3RhbGxlZCgpDQogICAgew0KICAgIEZJTEU9JDENCiAgICBpZiBbIC1y
ICRGSUxFIF07IHRoZW4NCgltdiAkRklMRSAke0ZJTEV9Lm9sZA0KICAgIGZp
DQogICAgZWNobyAiIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBhdCAkKGRh
dGUpIiA+ICRGSUxFDQogICAgZWNobyAkKHBrZ2RpcnNfZnJvbV9pbnN0YWxs
ZWQpIHwgZm10IC0xIAk+PiAkRklMRQ0KICAgIH0NCg0KZ2V0X2J1aWxkX3Zl
cigpDQogICAgew0KICAgIGlmIFsgLW4gIiRvcHRfYiIgLWEgLXogIiRvcHRf
cyIgXSA7IHRoZW4NCgkke1BLR19JTkZPfSAtLiAtYiAkUEFDS0FHRVMvJFBL
R05BTUUudGd6IHwgdGFpbCArNCB8ICR7U0VEfSAic3xeW146XSovW146XSo6
fHwiIHwgJHtHUkVQfSAuDQoJcmV0dXJuDQogICAgZmkNCiAgICBmaWxlcz0i
Ig0KICAgIGZvciBmIGluIE1ha2VmaWxlICR7RklMRVNESVJ9LyogJHtQS0dE
SVJ9Lyo7IGRvDQoJaWYgWyAtZiAkZiBdO3RoZW4NCgkgICAgZmlsZXM9IiRm
aWxlcyAkZiINCglmaQ0KICAgIGRvbmUNCiAgICBpZiBbIC1mICR7RElTVElO
Rk9fRklMRX0gXTsgdGhlbg0KCWZvciBmIGluICQoJHtBV0t9ICdORiA9PSA0
ICYmICQzID09ICI9IiB7IGdzdWIoIlsoKV0iLCAiIiwgJDIpOyBwcmludCAk
MiB9JyA8ICR7RElTVElORk9fRklMRX0pOyBkbyANCgkgICAgaWYgWyAtZiAk
e1BBVENIRElSfS8kZiBdOyB0aGVuDQoJCWZpbGVzPSIkZmlsZXMgJHtQQVRD
SERJUn0vJGYiOw0KCSAgICBmaTsNCglkb25lDQogICAgZmkNCiAgICBpZiBb
IC1kICR7UEFUQ0hESVJ9IF07IHRoZW4NCglmb3IgZiBpbiAke1BBVENIRElS
fS9wYXRjaC0qOyBkbw0KCSAgICBjYXNlICRmIGluDQoJICAgICoub3JpZ3wq
LnJlanwqfikgOzsNCgkgICAgJHtQQVRDSERJUn0vcGF0Y2gtbG9jYWwtKikN
CgkJZmlsZXM9IiRmaWxlcyAkZiIgOzsNCgkgICAgZXNhYw0KCWRvbmUNCiAg
ICBmaQ0KICAgIGNhdCAkZmlsZXMgfCAke0dSRVB9ICdcJE5ldEJTRCcNCiAg
ICB9DQoNCmxpc3RfcGFja2FnZXMoKQ0KICAgIHsNCiAgICBDSEVDS0xJU1Q9
JyAnDQogICAgZm9yIHBrZ2RpciBpbiAkKiA7IGRvDQoJZXh0cmFjdF9wa2df
dmFycyAkcGtnZGlyIFBLR05BTUUNCglpZiBbIC16ICIkUEtHTkFNRSIgXTsg
dGhlbg0KCSAgICBjb250aW51ZQ0KCWZpDQoJaWYgWyAhIC1mICRQQUNLQUdF
Uy8kUEtHTkFNRS50Z3ogXSA7dGhlbg0KCSAgICBmYXRhbF9tYXliZSAiICoq
ICRQS0dOQU1FIC0gYmluYXJ5IHBhY2thZ2UgbWlzc2luZyINCgkgICAgY29u
dGludWUNCglmaQ0KCXZlcmJvc2UgIiRQS0dOQU1FLnRnejogZm91bmQiDQoJ
Q0hFQ0tMSVNUPSIkQ0hFQ0tMSVNUJFBLR05BTUUgIjsNCiAgICBkb25lDQog
ICAgd2hpbGUgWyAiJENIRUNLTElTVCIgIT0gJyAnIF07IGRvDQoJUEtHTElT
VD0iJFBLR0xJU1QkQ0hFQ0tMSVNUIg0KCU5FWFRDSEVDSz0nICcNCglmb3Ig
cGtnIGluICRDSEVDS0xJU1QgOyBkbw0KCSAgICBpZiBbICEgLWYgJFBBQ0tB
R0VTLyRwa2cudGd6IF0gOyB0aGVuDQoJCWZhdGFsX21heWJlICIgKiogJHBr
Zy50Z3ogLSBiaW5hcnkgcGFja2FnZSBkZXBlbmRlbmN5IG1pc3NpbmciDQoJ
CWNvbnRpbnVlDQoJICAgIGZpDQoJICAgIGZvciBkZXAgaW4gJCgke1BLR19J
TkZPfSAtLiAtTiAkUEFDS0FHRVMvJHBrZy50Z3ogfCAke1NFRH0gJzEsL0J1
aWx0IHVzaW5nOi9kJyB8ICR7R1JFUH0gLi4pIDsgZG8NCgkJY2FzZSAiJFBL
R0xJU1QkTkVYVENIRUNLIiBpbg0KCQkgICAgKlwgJGRlcFwgKikNCgkJCXZl
cmJvc2UgIiRwa2c6IER1cGxpY2F0ZSBkZXBlbmQgJGRlcCINCgkJCTs7DQoJ
CSAgICAqKQ0KCQkJTkVYVENIRUNLPSIkTkVYVENIRUNLJGRlcCAiDQoJCQl2
ZXJib3NlICIkcGtnOiBBZGQgZGVwZW5kICRkZXAiDQoJCQk7Ow0KCQllc2Fj
DQoJICAgIGRvbmUNCglkb25lDQoJQ0hFQ0tMSVNUPSIkTkVYVENIRUNLIg0K
ICAgIGRvbmUNCiAgICBmb3IgcGtnIGluICRQS0dMSVNUIDsgZG8NCgllY2hv
ICRwa2cudGd6DQogICAgZG9uZQ0KICAgIH0NCg0KcGtnZGlyc19mcm9tX2Nv
bmYoKQ0KICAgIHsNCiAgICBDT05GPSQxOyBzaGlmdA0KICAgIExJU1Q9IiQq
Ig0KICAgIGlmIFsgISAtciAkQ09ORiBdO3RoZW4NCglmYXRhbCAiVW5hYmxl
IHRvIHJlYWQgUEtHQ0hLX0NPTkYgJyRDT05GJyINCiAgICBmaQ0KDQogICAg
IyBEZXRlcm1pbmUgbGlzdCBvZiB0YWdzDQogICAgIw0KICAgIGV4dHJhY3Rf
bWFrZV92YXJzIE1ha2VmaWxlIE9QU1lTIE9TX1ZFUlNJT04gTUFDSElORV9B
UkNIDQogICAgVEFHUz0iJChob3N0bmFtZSB8ICR7U0VEfSAtZSAncyxcLi4q
LCwnKSwkKGhvc3RuYW1lKSwkT1BTWVMtJE9TX1ZFUlNJT04tJE1BQ0hJTkVf
QVJDSCwkT1BTWVMtJE9TX1ZFUlNJT04sJE9QU1lTLSRNQUNISU5FX0FSQ0gs
JE9QU1lTLCRPU19WRVJTSU9OLCRNQUNISU5FX0FSQ0giDQogICAgaWYgWyAt
ZiAvdXNyL1gxMVI2L2xpYi9saWJYMTEuc28gLW8gLWYgL3Vzci9YMTFSNi9s
aWIvbGliWDExLmEgXTt0aGVuDQoJVEFHUz0iJFRBR1MseDExIg0KICAgIGZp
DQogICAgaWYgWyAtbiAiJFBLR0NIS19UQUdTIiBdO3RoZW4NCglUQUdTPSIk
VEFHUywkUEtHQ0hLX1RBR1MiDQogICAgZmkNCiAgICBpZiBbIC1uICIkUEtH
Q0hLX05PVEFHUyIgXTt0aGVuDQoJaWYgWyAtbiAiJG9wdF9VIiBdO3RoZW4N
CgkJb3B0X1U9IiRvcHRfVSwkUEtHQ0hLX05PVEFHUyINCgllbHNlDQoJCW9w
dF9VPSIkUEtHQ0hLX05PVEFHUyINCglmaQ0KICAgIGZpDQogICAgaWYgWyAt
biAiJG9wdF9EIiBdO3RoZW4NCglUQUdTPSIkVEFHUywkb3B0X0QiDQogICAg
ZmkNCiAgICB2ZXJib3NlICJzZXQgICBUQUdTPSRUQUdTIg0KICAgIHZlcmJv
c2UgInVuc2V0IFRBR1M9JG9wdF9VIg0KDQogICAgIyBFeHRyYWN0IGxpc3Qg
b2YgdmFsaWQgcGtnZGlycyAoc2tpcCBhbnkgJ2FscmVhZHlzZXQnIGluICRM
SVNUKQ0KICAgICMNCiAgICBMSVNUPSIkTElTVCAiJCgke0FXS30gLXYgYWxy
ZWFkeXNldD0iJExJU1QiIC12IHNldGxpc3Q9JFRBR1MgLXYgdW5zZXRsaXN0
PSRvcHRfVSAnDQogICAgQkVHSU4gew0KCXNwbGl0KGFscmVhZHlzZXQsIHRt
cCwgIiAiKTsNCglmb3IgKHRhZyBpbiB0bXApIHsgc2tpcFt0bXBbdGFnXV0g
PSAxOyB9DQoNCglzcGxpdChzZXRsaXN0LCB0bXAsICIsIik7DQoJZm9yICh0
YWcgaW4gdG1wKSB7IHRhZ2xpc3RbdG1wW3RhZ11dID0gMTsgfQ0KDQoJc3Bs
aXQodW5zZXRsaXN0LCB0bXAsICIsIik7DQoJZm9yICh0YWcgaW4gdG1wKSB7
IHNraXBbdG1wW3RhZ11dID0gMTsgZGVsZXRlIHRhZ2xpc3RbdG1wW3RhZ11d
IH0NCg0KCXRhZ2xpc3RbIioiXSA9ICIqIg0KICAgIH0NCiAgICBmdW5jdGlv
biBhbmRfZXhwcl93aXRoX2RpY3QoZXhwciwgZGljdCwgYXJ5LCBpLCByLCBk
KSB7DQoJc3BsaXQoZXhwcixhcnksL1wrLyk7DQoJciA9IDE7DQoJZm9yIChp
IGluIGFyeSkgew0KCQlpZiAoYXJ5W2ldIH4gL15cLy8pIHsNCgkJCWlmIChn
ZXRsaW5lIGQgPCBhcnlbaV0gPT0gLTEpDQoJCQkgICAgeyByID0gMDsgYnJl
YWsgO30NCgkJfQ0KCQllbHNlIGlmICghIChhcnlbaV0gaW4gZGljdCkpDQoJ
CQl7IHIgPSAwOyBicmVhayA7fQ0KCX0NCglyZXR1cm4gcjsNCiAgICB9DQog
ICAgew0KICAgIHN1YigiIy4qIiwgIiIpOw0KICAgIGlmIChza2lwWyQxXSkN
Cgl7IG5leHQ7IH0NCiAgICBuZWVkID0gMDsNCiAgICBmb3IgKGYgPSAxIDsg
Zjw9TkYgOyArK2YpIHsJCQkjIEZvciBlYWNoIHdvcmQgb24gdGhlIGxpbmUN
CglpZiAoc3ViKCJeLSIsICIiLCAkZikpIHsgCSMgSWYgaXQgYmVnaW5zIHdp
dGggYSAnLScNCgkJaWYgKGFuZF9leHByX3dpdGhfZGljdCgkZiwgdGFnbGlz
dCkpDQoJCQluZXh0OwkJIyBJZiBpdCBpcyB0cnVlLCBkaXNjYXJkDQoJfSBl
bHNlIHsNCgkJaWYgKGFuZF9leHByX3dpdGhfZGljdCgkZiwgdGFnbGlzdCkp
DQoJCQluZWVkID0gMTsJIyBJZiBpdCBpcyB0cnVlLCBub3RlIG5lZWRlZA0K
CX0NCiAgICB9DQogICAgaWYgKE5GID09IDEgfHwgbmVlZCkNCgl7IHByaW50
ICQxIH0NCiAgICB9DQogICAgJyA8ICRDT05GDQogICAgKQ0KICAgIGVjaG8g
JExJU1QNCiAgICB9DQoNCnBrZ2RpcnNfZnJvbV9pbnN0YWxsZWQoKQ0KICAg
IHsNCiAgICAke1BLR19JTkZPfSAtQnFhIHwgJHtBV0t9IC1GPSAnL1BLR1BB
VEg9L3twcmludCAkMn0nIHwgc29ydA0KICAgIH0NCg0KbXNnKCkNCiAgICB7
DQogICAgaWYgWyAtbiAiJG9wdF9MIiBdIDsgdGhlbg0KCWVjaG8gIiRAIiA+
PiAiJG9wdF9MIg0KICAgIGZpDQogICAgaWYgWyAtbiAiJG9wdF9sIiBdIDsg
dGhlbg0KCWVjaG8gIiRAIiA+JjINCiAgICBlbHNlDQoJZWNobyAiJEAiDQog
ICAgZmkNCiAgICB9DQoNCm1zZ19wcm9ncmVzcygpDQogICAgew0KICAgIG1z
ZyAiWyAkQCBdIg0KICAgIH0NCg0KbXNnX24oKQ0KICAgIHsNCiAgICBtc2cg
JGFjX24gIiQqIiRhY19jDQogICAgfQ0KDQpwa2dfZmV0Y2goKQ0KICAgIHsN
CiAgICBQS0dOQU1FPSQxDQogICAgUEtHRElSPSQyDQoNCiAgICBydW5fY21k
ICJjZCAkUEtHU1JDRElSLyRQS0dESVIgJiYgJHtNQUtFfSBmZXRjaC1saXN0
IHwgc2giDQogICAgaWYgWyAtbiAiJEZBSUwiIF07IHRoZW4NCglGQUlMX0RP
TkU9JEZBSUxfRE9ORSIgIiRQS0dOQU1FDQogICAgZWxzZQ0KCUZFVENIX0RP
TkU9JEZFVENIX0RPTkUiICIkUEtHTkFNRQ0KICAgIGZpDQogICAgfQ0KDQpw
a2dfZmV0Y2hsaXN0KCkNCiAgICB7DQogICAgUEtHTElTVD0kQA0KICAgIG1z
Z19wcm9ncmVzcyBGZXRjaA0KICAgIHdoaWxlIFsgJCMgIT0gMCBdOyBkbyAN
Cglwa2dfZmV0Y2ggJDEgJDINCglzaGlmdCA7IHNoaWZ0Ow0KICAgIGRvbmUN
CiAgICB9DQoNCnBrZ19pbnN0YWxsKCkNCiAgICB7DQogICAgUEtHTkFNRT0k
MQ0KICAgIFBLR0RJUj0kMg0KICAgIElOU1RBTEw9JDMNCg0KICAgIGlmIFsg
LWQgJFBLR19EQkRJUi8kUEtHTkFNRSBdO3RoZW4NCgltc2cgIiRQS0dOQU1F
IGluc3RhbGxlZCBpbiBwcmV2aW91cyBzdGFnZSINCiAgICBlbGlmIFsgLW4g
IiRvcHRfYiIgLWEgLWYgJFBBQ0tBR0VTLyRQS0dOQU1FLnRneiBdIDsgdGhl
bg0KCWlmIFsgLW4gIiRzYXZlZF9QS0dfUEFUSCIgXSA7IHRoZW4NCgkgICAg
ZXhwb3J0IFBLR19QQVRIPSRzYXZlZF9QS0dfUEFUSA0KCWZpDQoJY2QgJFBB
Q0tBR0VTDQoJcnVuX2NtZCAiJHtQS0dfQUREfSAkUEtHTkFNRS50Z3oiDQoJ
aWYgWyAtbiAiJHNhdmVkX1BLR19QQVRIIiBdIDsgdGhlbg0KCSAgICB1bnNl
dCBQS0dfUEFUSA0KCWZpDQogICAgZWxpZiBbIC1uICIkb3B0X3MiIF07IHRo
ZW4NCglydW5fY21kICJjZCAkUEtHU1JDRElSLyRQS0dESVIgJiYgJHtNQUtF
fSB1cGRhdGUgQ0xFQU5ERVBFTkRTPXllcyINCiAgICBmaQ0KDQogICAgaWYg
WyAteiAiJG9wdF9uIiAtYSAhIC1kICRQS0dfREJESVIvJFBLR05BTUUgXTt0
aGVuDQoJRkFJTD0xDQogICAgZmkNCg0KICAgIGlmIFsgLW4gIiRGQUlMIiBd
OyB0aGVuDQoJRkFJTF9ET05FPSRGQUlMX0RPTkUiICIkUEtHTkFNRQ0KICAg
IGVsc2UNCglJTlNUQUxMX0RPTkU9JElOU1RBTExfRE9ORSIgIiRQS0dOQU1F
DQogICAgZmkNCiAgICB9DQoNCnBrZ19pbnN0YWxsbGlzdCgpDQogICAgew0K
ICAgIElOU1RBTEw9JDEgOyBzaGlmdA0KICAgIG1zZ19wcm9ncmVzcyAkSU5T
VEFMTA0KICAgIHdoaWxlIFsgJCMgIT0gMCBdOyBkbw0KCXBrZ19pbnN0YWxs
ICQxICQyICRJTlNUQUxMDQoJc2hpZnQgOyBzaGlmdDsNCiAgICBkb25lDQog
ICAgfQ0KDQpydW5fY21kKCkNCiAgICB7DQogICAgRkFJTD0NCiAgICBpZiBb
IC1uICIkMiIgXTsgdGhlbg0KCUZBSUxPSz0kMg0KICAgIGVsc2UNCglGQUlM
T0s9JG9wdF9rDQogICAgZmkNCiAgICBtc2cgJDENCiAgICBpZiBbIC16ICIk
b3B0X24iIF07dGhlbg0KCWlmIFsgLW4gIiRvcHRfTCIgXSA7IHRoZW4NCgkg
ICAgc2ggLWMgIiQxIiA+PiAiJG9wdF9MIiAyPiYxIHx8IEZBSUw9MQ0KCWVs
c2UNCgkgICAgc2ggLWMgIiQxIiB8fCBGQUlMPTENCglmaQ0KCWlmIFsgLW4g
IiRGQUlMIiBdIDsgdGhlbg0KICAgICAgICAgICAgbXNnICIqKiAnJDEnIGZh
aWxlZCINCgkgICAgaWYgWyAtbiAiJG9wdF9MIiBdIDsgdGhlbg0KCQl0YWls
IC0xMDAgIiRvcHRfTCIgfCBlZ3JlcCAtdiAnXihcKlwqXCogRXJyb3IgY29k
ZSAxfFN0b3BcLiknIHxcDQoJCQl0YWlsIC00MA0KCSAgICBmaQ0KICAgICAg
ICAgICAgaWYgWyAiJEZBSUxPSyIgIT0gMSBdOyB0aGVuDQogICAgICAgICAg
ICAgICAgZXhpdCAxDQogICAgICAgICAgICBmaQ0KICAgICAgICBmaQ0KICAg
IGZpDQogICAgfQ0KDQp1c2FnZSgpDQogICAgew0KICAgIGlmIFsgLW4gIiQx
IiBdIDsgdGhlbg0KCWVjaG8gIiRAIg0KCWVjaG8NCiAgICBmaQ0KICAgIGVj
aG8gJ1VzYWdlOiBwa2dfY2hrIFtvcHRzXQ0KCS1hICAgICAgQWRkIGFsbCBt
aXNzaW5nIHBhY2thZ2VzIChpbXBsaWVzIC1jKQ0KCS1CICAgICAgQ2hlY2sg
dGhlICJCdWlsZCB2ZXJzaW9uIiBvZiBwYWNrYWdlcyAoaW1wbGllcyAtaSkN
CgktYiAgICAgIEluc3RhbGwgYmluYXJ5IHBhY2thZ2VzDQoJLUMgY29uZiBV
c2UgcGtnY2hrLmNvbmYgZmlsZSAnY29uZicNCgktYyAgICAgIENoZWNrIGlu
c3RhbGxlZCBwYWNrYWdlcyBhZ2FpbnN0IHBrZ2Noay5jb25mDQoJLUQgdGFn
cyBDb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBhZGRpdGlvbmFsIHBrZ2Noay5j
b25mIHRhZ3MgdG8gc2V0DQoJLWYgICAgICBQZXJmb3JtIGEgJ21ha2UgZmV0
Y2gnIGZvciBhbGwgcmVxdWlyZWQgcGFja2FnZXMNCgktZyAgICAgIEdlbmVy
YXRlIGFuIGluaXRpYWwgcGtnY2hrLmNvbmYgZmlsZQ0KCS1oICAgICAgVGhp
cyBoZWxwDQoJLWkJQ2hlY2sgdmVyc2lvbnMgb2YgaW5zdGFsbGVkIHBhY2th
Z2VzIChub3QgdXNpbmcgcGtnY2hrLmNvbmYpDQoJLWsJQ29udGludWUgd2l0
aCBmdXJ0aGVyIHBhY2thZ2VzIGlmIGVycm9ycyBhcmUgZW5jb3VudGVyZWQN
CgktTCBmaWxlIFJlZGlyZWN0IG91dHB1dCBmcm9tIGNvbW1hbmRzIHJ1biBp
bnRvIGZpbGUgKHNob3VsZCBiZSBmdWxscGF0aCkNCgktbAlMaXN0IGJpbmFy
eSBwYWNrYWdlcyBpbmNsdWRpbmcgZGVwZW5kZW5jaWVzIChpbXBsaWVzIC1j
KQ0KCS1OCUxpc3QgaW5zdGFsbGVkIHBhY2thZ2VzIGZvciB3aGljaCBhIG5l
d2VyIHZlcnNpb24gaXMgaW4gVE9ETw0KCS1uCURpc3BsYXkgYWN0aW9ucyB0
aGF0IHdvdWxkIGJlIHRha2VuLCBidXQgZG8gbm90IHBlcmZvcm0gdGhlbQ0K
CS1QIGRpciAgU2V0IFBBQ0tBR0VTIGRpciAob3ZlcnJpZGVzIGFueSBvdGhl
ciBzZXR0aW5nKQ0KCS1yCVJlY3Vyc2l2ZWx5IHJlbW92ZSBtaXNtYXRjaGVz
ICh1c2Ugd2l0aCBjYXJlKSAoaW1wbGllcyAtaSkNCgktcyAgICAgIEluc3Rh
bGwgcGFja2FnZXMgYnkgYnVpbGRpbmcgZnJvbSBzb3VyY2UNCgktVSB0YWdz
IENvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHBrZ2Noay5jb25mIHRhZ3MgdG8g
dW5zZXQNCgktdSAgICAgIFVwZGF0ZSBhbGwgbWlzbWF0Y2hlZCBwYWNrYWdl
cyAoaW1wbGllcyAtaSkNCgktdiAgICAgIFZlcmJvc2UNCg0KcGtnX2NoayB2
ZXJpZmllcyBpbnN0YWxsZWQgcGFja2FnZXMgYWdhaW5zdCBwa2dzcmMuDQpU
aGUgbW9zdCBjb21tb24gdXNhZ2UgaXMgJ3BrZ19jaGsgLWknIHRvIGNoZWNr
IGFsbCBpbnN0YWxsZWQgcGFja2FnZXMgb3INCidwa2dfY2hrIC11JyB0byB1
cGRhdGUgYWxsIG91dCBvZiBkYXRlIHBhY2thZ2VzLg0KRm9yIG1vcmUgYWR2
YW5jZWQgdXNhZ2UsIGluY2x1ZGluZyBkZWZpbmluZyBhIHNldCBvZiBkZXNp
cmVkIHBhY2thZ2VzIGJhc2VkDQpvbiBob3N0bmFtZSBhbmQgdHlwZSwgc2Vl
IHBrZ19jaGsoOCkuDQoNCklmIG5laXRoZXIgLWIgbm9yIC1zIGlzIGdpdmVu
LCBib3RoIGFyZSBhc3N1bWVkIHdpdGggLWIgcHJlZmVycmVkLg0KJw0KICAg
IGV4aXQgMQ0KICAgIH0NCg0KdmVyYm9zZSgpDQogICAgew0KICAgIGlmIFsg
LW4gIiRvcHRfdiIgXSA7IHRoZW4NCgltc2cgIiRAIiA+JjINCiAgICBmaQ0K
ICAgIH0NCg0KYXJncz0kKGdldG9wdCBCQzpEOkw6UDpVOmFiY2ZnaGlrbE5u
cnN1diAkKikNCmlmIFsgJD8gIT0gMCBdOyB0aGVuDQogICAgb3B0X2g9MQ0K
ZmkNCnNldCAtLSAkYXJncw0Kd2hpbGUgWyAkIyAhPSAwIF07IGRvDQogICAg
Y2FzZSAiJDEiIGluDQoJLWEgKQlvcHRfYT0xIDsgb3B0X2M9MSA7Ow0KCS1C
ICkgICAgb3B0X0I9MSA7IG9wdF9pPTEgOzsNCgktYiApCW9wdF9iPTEgOzsN
CgktQyApCW9wdF9DPSIkMiIgOyBzaGlmdDs7DQoJLWMgKQlvcHRfYz0xIDs7
DQoJLUQgKQlvcHRfRD0iJDIiIDsgc2hpZnQ7Ow0KCS1mICkJb3B0X2Y9MSA7
Ow0KCS1nICkJb3B0X2c9MSA7Ow0KCS1oICkJb3B0X2g9MSA7Ow0KCS1pICkJ
b3B0X2k9MSA7Ow0KCS1rICkJb3B0X2s9MSA7Ow0KCS1MICkJb3B0X0w9IiQy
IiA7IHNoaWZ0OzsNCgktbCApCW9wdF9sPTEgOzsNCgktTiApCW9wdF9OPTEg
OzsNCgktbiApCW9wdF9uPTEgOzsNCgktUCApCW9wdF9QPSIkMiIgOyBzaGlm
dDs7DQoJLXIgKQlvcHRfcj0xIDsgb3B0X2k9MSA7Ow0KCS1zICkJb3B0X3M9
MSA7Ow0KCS1VICkJb3B0X1U9IiQyIiA7IHNoaWZ0OzsNCgktdSApCW9wdF91
PTEgOyBvcHRfaT0xIDs7DQoJLXYgKQlvcHRfdj0xIDs7DQoJLS0gKQlzaGlm
dDsgYnJlYWsgOzsNCiAgICBlc2FjDQogICAgc2hpZnQNCmRvbmUNCg0KaWYg
WyAteiAiJG9wdF9iIiAtYSAteiAiJG9wdF9zIiBdO3RoZW4NCiAgICBvcHRf
Yj0xOyBvcHRfcz0xOw0KZmkNCg0KaWYgWyAteiAiJG9wdF9hIiAtYSAteiAi
JG9wdF9jIiAtYSAteiAiJG9wdF9nIiAtYSAteiAiJG9wdF9pIiAtYSAteiAi
JG9wdF9OIiAtYSAteiAiJG9wdF9sIiBdOw0KdGhlbg0KICAgIHVzYWdlICJN
dXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIG9mIC1hLCAtYywgLWcsIC1pLCAt
bCwgLU4sIG9yIC11IjsNCmZpDQoNCmlmIFsgLW4gIiRvcHRfaCIgLW8gJCMg
IT0gMCBdO3RoZW4NCiAgICB1c2FnZQ0KZmkNCg0KIyBIaWRlIFBLR19QQVRI
IHRvIGF2b2lkIGJyZWFrYWdlIGluICdtYWtlJyBjYWxscw0Kc2F2ZWRfUEtH
X1BBVEg9JFBLR19QQVRIDQp1bnNldCBQS0dfUEFUSCB8fCB0cnVlDQoNCnRl
c3QgLW4gIiRBV0siIHx8IEFXSz0iQEFXS0AiDQp0ZXN0IC1uICIkR1JFUCIg
fHwgR1JFUD0iQEdSRVBAIg0KdGVzdCAtbiAiJE1BS0UiIHx8IE1BS0U9IkBN
QUtFQCINCnRlc3QgLW4gIiRNQUtFQ09ORiIgfHwgTUFLRUNPTkY9IkBNQUtF
Q09ORkAiDQp0ZXN0IC1uICIkUEtHX0lORk8iIHx8IFBLR19JTkZPPSJAUEtH
X0lORk9AIg0KdGVzdCAtbiAiJFNFRCIgfHwgU0VEPSJAU0VEQCINCg0KaWYg
WyAhIC1mICRNQUtFQ09ORiBdIDsgdGhlbg0KICAgIGlmIFsgLWYgL2V0Yy9t
ay5jb25mIF0gOyB0aGVuDQoJTUFLRUNPTkY9L2V0Yy9tay5jb25mDQogICAg
ZWxzZQ0KCU1BS0VDT05GPS9kZXYvbnVsbA0KICAgIGZpDQpmaQ0KDQojIGdy
YWJiZWQgZnJvbSBHTlUgY29uZmlndXJlDQppZiAoZWNobyAidGVzdGluZ1xj
IjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbg0KICAj
IFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hh
emlAY2FpcC5ydXRnZXJzLmVkdS4NCiAgaWYgKGVjaG8gLW4gdGVzdGluZzsg
ZWNobyAxLDIsMykgfCAke1NFRH0gcy8tbi94bi8gfCBncmVwIHhuID4vZGV2
L251bGw7IHRoZW4NCiAgICBhY19uPSBhY19jPScNCicgYWNfdD0nCScNCiAg
ZWxzZQ0KICAgIGFjX249LW4gYWNfYz0gYWNfdD0NCiAgZmkNCmVsc2UNCiAg
YWNfbj0gYWNfYz0nXGMnIGFjX3Q9DQpmaQ0KDQppZiBbIC1uICIkb3B0X0wi
IF0gOyB0aGVuDQogICAgcm0gLWYgJG9wdF9MDQpmaQ0KDQpleHRyYWN0X3Zh
cmlhYmxlcw0KaWYgWyAtbiAiJG9wdF9DIiBdIDsgdGhlbg0KICAgIFBLR0NI
S19DT05GPSIkb3B0X0MiDQpmaQ0KaWYgWyAtbiAiJG9wdF9QIiBdIDsgdGhl
bg0KICAgIFBBQ0tBR0VTPSIkb3B0X1AiDQpmaQ0KaWYgWyAtZCAkUEFDS0FH
RVMvQWxsIF0gOyB0aGVuDQogICAgUEFDS0FHRVM9IiRQQUNLQUdFUy9BbGwi
DQpmaQ0KDQppZiBbIC1uICIkb3B0X04iIF07IHRoZW4NCgkke1BLR19JTkZP
fSB8IFwNCgkJJHtTRUR9IC1lICJzL1sgCV0uKi8vIiAtZSAicy8tW14tXSok
Ly8iIFwNCgkJICAgICAgIC1lICJzL3B5WzAtOV1bMC05XXB0aC0vcHktLyIg
XA0KCQkgICAgICAgLWUgInMvcHlbMC05XVswLTldLS9weS0vIiB8IFwNCgkJ
d2hpbGUgcmVhZCBhDQoJCWRvDQoJCQliPSQoZ3JlcCAibyAkYS1bMC05XSIg
JFBLR1NSQ0RJUi9kb2MvVE9ETyB8IFwNCgkJCQlzZWQgLWUgInMvWyAJXSpv
IC8vIikNCgkJaWYgWyAiJGIiIF0NCgkJdGhlbg0KCQkJZWNobyAkYTogJGIN
CgkJZmkNCglkb25lDQpmaQ0KDQppZiBbIC1uICIkb3B0X2IiIC1hIC16ICIk
b3B0X3MiIC1hIC1kICRQQUNLQUdFUyBdIDsgdGhlbg0KICAgIG1zZ19wcm9n
cmVzcyBTY2FuICRQQUNLQUdFUw0KICAgIGNkICRQQUNLQUdFUw0KICAgIGZv
ciBmIGluIGBscyAtdCAqLnRnemAgOyBkbyAjIFNvcnQgYnkgdGltZSB0byBw
aWNrIHVwIG5ld2VzdCBmaXJzdA0KCVBLR0RJUj1gJHtQS0dfSU5GT30gLS4g
LUIgJFBBQ0tBR0VTLyRmfCR7QVdLfSAtRj0gJyQxPT0iUEtHUEFUSCJ7cHJp
bnQgJDJ9J2ANCglQS0dOQU1FPWBlY2hvICRmIHwgJHtTRUR9ICdzL1wudGd6
JC8vJ2ANCglQS0dEQj0iJHtQS0dEQn0gJFBLR0RJUjokUEtHTkFNRSINCiAg
ICBkb25lDQpmaQ0KDQpjZCAkUEtHU1JDRElSDQpyZWFsX3BrZ3NyY2Rpcj0k
KHB3ZCkNCg0KaWYgWyAtbiAiJG9wdF9nIiBdOyB0aGVuDQogICAgdmVyYm9z
ZSAiV3JpdGUgJFBLR0NIS19DT05GIGJhc2VkIG9uIGluc3RhbGxlZCBwYWNr
YWdlcyINCiAgICBnZW5lcmF0ZV9jb25mX2Zyb21faW5zdGFsbGVkICRQS0dD
SEtfQ09ORg0KZmkNCg0KaWYgWyAtbiAiJG9wdF9pIiBdO3RoZW4NCiAgICB2
ZXJib3NlICJFbnVtZXJhdGUgUEtHRElSTElTVCBmcm9tIGluc3RhbGxlZCBw
YWNrYWdlcyINCiAgICBQS0dESVJMSVNUPSQocGtnZGlyc19mcm9tX2luc3Rh
bGxlZCkNCmZpDQoNCmlmIFsgLW4gIiRvcHRfYyIgLW8gLW4gIiRvcHRfbCIg
XTt0aGVuCSMgQXBwZW5kIHRvIFBLR0RJUkxJU1QgYmFzZWQgb24gY29uZg0K
ICAgIHZlcmJvc2UgIkFwcGVuZCB0byBQS0dESVJMSVNUIGJhc2VkIG9uIGNv
bmZpZyAkUEtHQ0hLX0NPTkYiDQogICAgUEtHRElSTElTVD0iJChwa2dkaXJz
X2Zyb21fY29uZiAkUEtHQ0hLX0NPTkYgJFBLR0RJUkxJU1QpIg0KZmkNCg0K
aWYgWyAtbiAiJG9wdF9sIiBdIDsgdGhlbg0KICAgIGxpc3RfcGFja2FnZXMg
JFBLR0RJUkxJU1QNCmVsc2UNCiAgICBjaGVja19wYWNrYWdlc19pbnN0YWxs
ZWQgJFBLR0RJUkxJU1QNCmZpDQoNCmlmIFsgLW4gIiRNSVNNQVRDSF9UT0RP
IiBdOyB0aGVuDQogICAgZGVsZXRlX2FuZF9yZWNoZWNrPTENCmVsaWYgWyAt
biAiJG9wdF91IiAtYSAtZiAkUEtHQ0hLX1VQREFURV9DT05GIF0gOyB0aGVu
DQogICAgZGVsZXRlX2FuZF9yZWNoZWNrPTENCmZpDQoNCmlmIFsgLW4gIiRk
ZWxldGVfYW5kX3JlY2hlY2siIF07IHRoZW4NCiAgICBpZiBbIC1uICIkb3B0
X3UiIF0gOyB0aGVuCQkgIyBTYXZlIGN1cnJlbnQgaW5zdGFsbGVkIGxpc3QN
CglpZiBbIC1mICRQS0dDSEtfVVBEQVRFX0NPTkYgXSA7IHRoZW4NCgkgICAg
bXNnICJNZXJnaW5nIGluIHByZXZpb3VzICRQS0dDSEtfVVBEQVRFX0NPTkYi
DQoJICAgIHRtcD0kKGNhdCAkUEtHQ0hLX1VQREFURV9DT05GO2VjaG8gJChw
a2dkaXJzX2Zyb21faW5zdGFsbGVkKXxmbXQgLTEpDQoJICAgIGVjaG8gJHRt
cCB8IGZtdCAtMSB8IHNvcnQgLXUgPiAkUEtHQ0hLX1VQREFURV9DT05GDQoJ
ICAgIHRtcD0NCgllbHNlDQoJICAgIGVjaG8gJChwa2dkaXJzX2Zyb21faW5z
dGFsbGVkKSB8IGZtdCAtMSA+ICRQS0dDSEtfVVBEQVRFX0NPTkYNCglmaQ0K
ICAgIGZpDQogICAgaWYgWyAtbiAiJG9wdF9yIiAtbyAtbiAiJG9wdF91IiBd
IDsgdGhlbg0KCWlmIFsgLW4gIiRNSVNNQVRDSF9UT0RPIiBdOyB0aGVuDQoJ
ICAgIGRlbGV0ZV9wa2dzICRNSVNNQVRDSF9UT0RPDQoJICAgIG1zZ19wcm9n
cmVzcyBSZWNoZWNraW5nIHBhY2thZ2VzIGFmdGVyIGRlbGV0aW9ucw0KCWZp
DQoJaWYgWyAtbiAiJG9wdF91IiBdOyB0aGVuDQoJICAgIFBLR0RJUkxJU1Q9
IiQocGtnZGlyc19mcm9tX2NvbmYgJFBLR0NIS19VUERBVEVfQ09ORiAkUEtH
RElSTElTVCkiDQoJZmkNCglpZiBbIC1uICIkb3B0X3UiIC1vIC1uICIkb3B0
X2EiIF07IHRoZW4NCgkgICAgY2hlY2tfcGFja2FnZXNfaW5zdGFsbGVkICRQ
S0dESVJMSVNUICMgTWF5IG5lZWQgdG8gYWRkIG1vcmUNCglmaQ0KICAgIGZp
DQpmaQ0KDQppZiBbIC1uICIkb3B0X2YiIF0gOyB0aGVuDQogICAgcGtnX2Zl
dGNobGlzdCAkTUlTU0lOR19UT0RPDQpmaQ0KDQppZiBbIC1uICIkTUlTU0lO
R19UT0RPIiBdIDsgdGhlbg0KICAgIGlmIFsgLW4gIiRvcHRfYSIgLW8gLW4g
IiRvcHRfdSIgXSA7IHRoZW4NCglwa2dfaW5zdGFsbGxpc3QgSW5zdGFsbCAk
TUlTU0lOR19UT0RPDQogICAgZmkNCmZpDQoNCmlmIFsgLW4gIiRvcHRfdSIg
LWEgLXogIiRGQUlMX0RPTkUiIC1hIC1mICRQS0dDSEtfVVBEQVRFX0NPTkYg
XSA7IHRoZW4NCiAgICBydW5fY21kICJybSAtZiAkUEtHQ0hLX1VQREFURV9D
T05GIg0KZmkNCg0KWyAtbiAiJElOU1RBTExfRE9ORSIgXSAmJgltc2cgIklu
c3RhbGxlZDokSU5TVEFMTF9ET05FIg0KWyAtbiAiJEZBSUxfRE9ORSIgXSAm
JgkJbXNnICJGYWlsZWQ6JEZBSUxfRE9ORSINClsgLW4gIiRNSVNTX0RPTkUi
IF0gJiYJCW1zZyAiTWlzc2luZzokTUlTU19ET05FIg0K

--0-1288579207-1116953396=:470--