J
J. Patrick Bedell
Guest
Hello,
I've been using the ASCO tool (http://asco.sf.net) for automated
circuit sizing and optimization. Because ASCO 0.4.6, the latest
version, doesn't support optimizing on multiple analyses (AC, TRAN,
DC, etc.) simultaneously with Spectre, I added that functionality.
Here's the patch, for anyone who is interested. I've encoded it in
base64 - to get the text of the patch, using the base64 code in GNU
coreutils, you can run "base64 -d <textfile>" where textfile has the
text block below. Let me know if you need any help with it...
Patrick
LS0tIHRtcC9hc2NvLTAuNC42L2luaXRpYWxpemUuaAkyMDA2LTA1LTE2IDA0OjQ4OjQ0LjAwMDAw
MDAwMCAtMDcwMAorKysgY29kZS9hc2NvL2luaXRpYWxpemUuaAkyMDA4LTExLTE2IDEyOjQ1OjM3
LjAwMDAwMDAwMCAtMDgwMApAQCAtNTAsNiArNTAsNyBAQAogICovCiB0eXBlZGVmIHN0cnVjdCB7
CiAJY2hhciBtZWFzX3N5bWJvbFtMT05HU1RSSU5HU0laRV07IC8qc3ltYm9sIGluIHRoZSBTUElD
RSBvdXRwdXQgZmlsZSB0aGF0IHdpbGwgYmUgbWVhc3VyZWQgKi8KKyAgaW50IGFuYWx5c2lzX3R5
cGU7ICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciBTcGVjdHJlIC0gd2hpY2ggYW5hbHlzaXMg
d2lsbCB0aGUgbWVhc3VyZW1lbnQgYmUgYWRkZWQgdG8/
ICovIAogCWNoYXIgbm9kZVtMT05HU1RS
SU5HU0laRV07ICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICovCiAJaW50IG9iamVjdGl2ZV9jb25zdHJhaW50OyAgICAgICAgIC8q
TUlOPTEsIE1BWD0yLCBNT049MywgTEU9NCwgR0U9NSwgRVE9NiAgICAgICAgICAgICAgICAgKi8K
IAlkb3VibGUgY29uc3RyYWludF92YWx1ZTsgICAgICAgICAgLypzcGVjaWZpZWQgYnkgdGhlIHVz
ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTcsNyArNTgsMTQgQEAK
IAlpbnQgY29uc3RyYWludF9tZXQ7ICAgICAgICAgICAgICAgLyoxIGlmIGNvbnN0cmFpbnQgaXMg
bWV0LCAwIG90aGVyd2lzZSAgICAgICAgICAgICAgICAgICAqLwogfSBtZWFzdXJlbWVudHNfbGlu
ZTsKIAotCisvKgorICogIHN0cnVjdCB0byBhY2NvbW9kYXRlIGluZm9ybWF0aW9uIGZvciBTcGVj
dHJlIE1ETCBmaWxlcy4KKyAqCisgKi8KK3R5cGVkZWYgc3RydWN0IHsgCisgIGNoYXIgbmFtZVtM
T05HU1RSSU5HU0laRV07IC8qIG5hbWUgb2YgYW5hbHlzaXMgKi8KKyAgaW50IHR5cGU7IC8qIERD
PTEsIEFDPTIsIFRSQU49MyAqLworfSBzcGVjdHJlX2FuYWx5c2lzOwogCiAKIGludCBpbml0aWFs
aXplKGNoYXIgKmZpbGVuYW1lKTsKQEAgLTY2LDEwICs3NCwxMSBAQAogZG91YmxlIHNjYWxldG8o
ZG91YmxlIHZhbHVlLCBkb3VibGUgaW5hLCBkb3VibGUgaW5iLCBkb3VibGUgb3V0YSwgZG91Ymxl
IG91dGIsIGludCBmb3JtYXQpOwogCiAKLQotCiBwYXJhbWV0ZXJzX2xpbmUgcGFyYW1ldGVyc1tN
QVhQQVJBTUVURVJTXTsgICAgICAgLyoqLwogbWVhc3VyZW1lbnRzX2xpbmUgbWVhc3VyZW1lbnRz
W01BWE1FQVNVUkVNRU5UU107IC8qKi8KK3NwZWN0cmVfYW5hbHlzaXMgYW5hbHlzaXNfbmFtZXNb
M107CisKKwogLyoKICAqIHRvIGtub3cgaWYgYW4gQUxURVIgYW5kL29yIE1DIHNpbXVsYXRpb24g
aXMgdG8gYmUgcGVyZm9ybWVkCiAgKiAwICAwICgwKSA9PiBub3RoaW5nCi0tLSB0bXAvYXNjby0w
LjQuNi9pbml0aWFsaXplLmMJMjAwNi0xMi0xOCAwMTo0ODozMy4wMDAwMDAwMDAgLTA4MDAKKysr
IGNvZGUvYXNjby9pbml0aWFsaXplLmMJMjAwOC0xMS0xNiAxMjo0OTozNS4wMDAwMDAwMDAgLTA4
MDAKQEAgLTEwOCw2ICsxMDgsMzEgQEAKIAogCiAKKy8qCisgKiBMb29rcyBpbiAic3RyZWFtIiBm
b3IgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgImtleSIgc3RhcnRpbmcgZnJvbSB0aGUgY3VycmVu
dCBzZWVrCisgKiBwb2ludC4gSWYgZm91bmQgIlJlc3VsdCIgY29udGFpbnMgdGhlIGxpbmUgd2hp
Y2ggaXMgJ1wwJyBvdGhlcndpc2UuCisgKi8KK3ZvaWQgUmVhZFN1YnN0cmluZ0tleShjaGFyICpS
ZXN1bHQsIGNoYXIgKmtleSwgRklMRSAqc3RyZWFtKQoreworICBjaGFyIGxrazFbTE9OR1NUUklO
R1NJWkVdOworICBjaGFyIFNUUjFbTE9OR1NUUklOR1NJWkVdOworICAKKyAgaW50IGtleV9sZW4g
PSBzdHJsZW4oa2V5KTsKKworICBmZ2V0czIobGtrMSwgTE9OR1NUUklOR1NJWkUsIHN0cmVhbSk7
CisKKyAgd2hpbGUgKChzdHJuY21wKChzcHJpbnRmKFNUUjEsICIlLipzIiwgKGludClzdHJsZW4o
a2V5KSwgbGtrMSksIFNUUjEpLCAKKwkJIGtleSwga2V5X2xlbikgIT0gMCkgJiAoIVBfZW9mKHN0
cmVhbSkpKQorICAgIGZnZXRzMihsa2sxLCBMT05HU1RSSU5HU0laRSwgc3RyZWFtKTsKKworICBp
ZiAoc3RybmNtcCgoc3ByaW50ZihTVFIxLCAiJS4qcyIsIChpbnQpc3RybGVuKGtleSksIGxrazEp
LCBTVFIxKSwgCisJICAgICAga2V5LCBrZXlfbGVuKSkKKyAgICBSZXN1bHRbMF09J1wwJzsKKyAg
ZWxzZQorICAgIHN0cmNweShSZXN1bHQsIGxrazEpOworfSAvKlJlYWRLZXkqLworCisKIAogLyoK
ICAqIHJlY2VpdmVzIGEgU1BJQ0Ugc3RyaW5nIGZyb20gdGhlIDxpbnB1dGZpbGU
+Liogd2l0aCAj
PHRleHQ
+IyBhbmQgcmVwbGFjZXMKQEAgLTIyMiwxMCArMjQ3LDE5IEBACiAJaW50IGksIGlpOwog
CWludCBjY29kZTsKIAljaGFyIGxhdXhbTE9OR1NUUklOR1NJWkVdLCBsYXV4MltTSE9SVFNUUklO
R1NJWkVdLCBob3N0bmFtZVtTSE9SVFNUUklOR1NJWkVdID0gIjAiOwotCisJY2hhciBsYXV4M1tM
T05HU1RSSU5HU0laRV0gPSAiMCI7CisJCiAJLyogICA8aW5wdXRmaWxlPi4qICAgPGlucHV0Zmls
ZT4uY2ZnIDxob3N0bmFtZT4udG1wIC9leHRyYWN0LzxmaWxlPiAqLwogCUZJTEUgKmZzcGljZV9z
b3VyY2UsICpmc3BpY2VfY2ZnLCAgICAqZnNwaWNlX3RtcCwgICAqZmV4dHJhY3Q7CiAKKworCWFu
YWx5c2lzX25hbWVzWzBdLnR5cGUgPSAxOworCWFuYWx5c2lzX25hbWVzWzBdLm5hbWVbMF0gPSAn
XDAnOyAKKwlhbmFseXNpc19uYW1lc1sxXS50eXBlID0gMjsKKwlhbmFseXNpc19uYW1lc1sxXS5u
YW1lWzBdID0gJ1wwJzsKKwlhbmFseXNpc19uYW1lc1syXS50eXBlID0gMzsKKwlhbmFseXNpc19u
YW1lc1syXS5uYW1lWzBdID0gJ1wwJzsKKwogCS8qKi8KIAkvKlN0ZXAxOiBPcHRpbWl6YXRpb24g
Rmxvdzogc2hvdWxkIEFsdGVyIGFuZC9vciBNb250ZUNhcmxvIGJlIGRvbmU/
Ki8KIAlzcHJpbnRm
KGxhdXgsICIlcyVzIiwgZmlsZW5hbWUsICIuY2ZnIik7CkBAIC0zMjEsNiArMzU1LDggQEAKIAkJ
CQlSZWFkU3ViS2V5KGxhdXgsIGxraywgJmlpLCAnOicsICc6JywgNSk7CiAJCQkJcGFyYW1ldGVy
c1tpXS5tYXhpbXVtPWFzYzJyZWFsKGxhdXgsIDEsIChpbnQpc3RybGVuKGxhdXgpKTsgLyptYXhp
bXVtICovCiAJCQkJaWYgKHBhcmFtZXRlcnNbaV0ubWluaW11bSA
+IHBhcmFtZXRlcnNbaV0ubWF4
aW11bSkgeyAvKmp1c3QgdG8gaGVscCovCisJCQkJICAgICAgICBwcmludGYoImluaXRpYWxpemUu
YyAtIFN0ZXAyIC0tIE1pbmltdW0gKCVmKSBpcyBsYXJnZXIgdGhhbiBNYXhpbXVtICglZikgaW4g
bGluZTogJXNcbiIsIAorCQkJCQkgICAgICAgcGFyYW1ldGVyc1tpXS5taW5pbXVtLCBwYXJhbWV0
ZXJzW2ldLm1heGltdW0sIGxrayk7CiAJCQkJCXByaW50ZigiaW5pdGlhbGl6ZS5jIC0gU3RlcDIg
LS0gTWluaW11bSBpcyBsYXJnZXIgdGhhbiBNYXhpbXVtIGluIGxpbmU6ICVzXG4iLCBsa2spOwog
CQkJCQlleGl0KEVYSVRfRkFJTFVSRSk7CiAJCQkJfQpAQCAtNTc5LDI1ICs2MTUsMzQgQEAKIAkJ
CQkJU3RyaXBTcGFjZXMobGF1eCk7ICAgICAgICAgICAvKmF2b2lkIHNwYWNlcyBhZnRlciB0aGUg
Y29tbWFuZCovCiAKIAkJCQkJaWYgKHN0cnBvczIobGF1eCwgIiBkYyAiLCAxKSkgewotCQkJCQkJ
ZnByaW50Zihmc3BpY2VfdG1wLCAiYWxpYXMgbWVhc3VyZW1lbnQgZGNfcnVuIHtcbiIpOwogCQkJ
CQkJaT1zdHJwb3MyKGxhdXgsICIgZGMgIiwgMSk7CiAJCQkJCQlzdHJzdWIobGF1eCwgbGtrLCAx
LCBpKTsKIAkJCQkJCVN0cmlwU3BhY2VzKGxhdXgpOwotCQkJCQkJZnByaW50Zihmc3BpY2VfdG1w
LCAicnVuICVzXG4iLCBsYXV4KTsKKwkJCQkJCWlmICggYW5hbHlzaXNfbmFtZXNbMF0ubmFtZVsw
XSAhPSAnXDAnICkgeyAKKwkJCQkJCSAgcHJpbnRmKCJpbml0aWFsaXplLmMgLSBTdGVwNC4xIC0g
b25seSBvbmUgREMgYW5hbHlzaXMgaXMgYWxsb3dlZC5cbiIpOworCQkJCQkJICBleGl0KEVYSVRf
RkFJTFVSRSk7CisJCQkJCQl9CisJCQkJCQlzdHJjcHkoYW5hbHlzaXNfbmFtZXNbMF0ubmFtZSwg
bGF1eCk7CiAJCQkJCX0KIAkJCQkJaWYgKHN0cnBvczIobGF1eCwgIiBhYyAiLCAxKSkgewotCQkJ
CQkJZnByaW50Zihmc3BpY2VfdG1wLCAiYWxpYXMgbWVhc3VyZW1lbnQgYWNfcnVuIHtcbiIpOwog
CQkJCQkJaT1zdHJwb3MyKGxhdXgsICIgYWMgIiwgMSk7CiAJCQkJCQlzdHJzdWIobGF1eCwgbGtr
LCAxLCBpKTsKIAkJCQkJCVN0cmlwU3BhY2VzKGxhdXgpOwotCQkJCQkJZnByaW50Zihmc3BpY2Vf
dG1wLCAicnVuICVzXG4iLCBsYXV4KTsKKwkJCQkJCWlmICggYW5hbHlzaXNfbmFtZXNbMV0ubmFt
ZVswXSAhPSAnXDAnICkgeyAKKwkJCQkJCSAgcHJpbnRmKCJpbml0aWFsaXplLmMgLSBTdGVwNC4x
IC0gb25seSBvbmUgQUMgYW5hbHlzaXMgaXMgYWxsb3dlZC5cbiIpOworCQkJCQkJICBleGl0KEVY
SVRfRkFJTFVSRSk7CisJCQkJCQl9CisJCQkJCQlzdHJjcHkoYW5hbHlzaXNfbmFtZXNbMV0ubmFt
ZSwgbGF1eCk7CiAJCQkJCX0KIAkJCQkJaWYgKHN0cnBvczIobGF1eCwgIiB0cmFuICIsIDEpKSB7
Ci0JCQkJCQlmcHJpbnRmKGZzcGljZV90bXAsICJhbGlhcyBtZWFzdXJlbWVudCB0cmFuX3J1biB7
XG4iKTsKIAkJCQkJCWk9c3RycG9zMihsYXV4LCAiIHRyYW4gIiwgMSk7CiAJCQkJCQlzdHJzdWIo
bGF1eCwgbGtrLCAxLCBpKTsKIAkJCQkJCVN0cmlwU3BhY2VzKGxhdXgpOwotCQkJCQkJZnByaW50
Zihmc3BpY2VfdG1wLCAicnVuICVzXG4iLCBsYXV4KTsKKwkJCQkJCWlmICggYW5hbHlzaXNfbmFt
ZXNbMl0ubmFtZVswXSAhPSAnXDAnICkgeyAKKwkJCQkJCSAgcHJpbnRmKCJpbml0aWFsaXplLmMg
LSBTdGVwNC4xIC0gb25seSBvbmUgVFJBTiBhbmFseXNpcyBpcyBhbGxvd2VkLlxuIik7CisJCQkJ
CQkgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKwkJCQkJCX0KKwkJCQkJCXN0cmNweShhbmFseXNpc19u
YW1lc1syXS5uYW1lLCBsYXV4KTsKIAkJCQkJfQogCQkJCX0KIAkJCX0KQEAgLTYyNCw4ICs2Njks
MzAgQEAKIAkJCXByaW50ZigiaW5pdGlhbGl6ZS5jIC0gU3RlcDQuMiAtLSBDYW5ub3QgZmluZCBt
ZWFzdXJlbWVudCBmaWxlOiAlc1xuIiwgbGtrKTsKIAkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKIAkJ
fQotCiAJCXN0cmNweShsYXV4LGxrayk7CisKKwkJLyogZmluZCB0aGUgYW5hbHlzaXMgdHlwZSBh
bmQgcHV0IGl0IGluIG1lYXN1cmVtZW50c1tpXS5hbmFseXNpc190eXBlICovIAorCQlSZWFkU3Vi
c3RyaW5nS2V5KGxhdXgzLCAiQW5hbHlzaXMgdHlwZToiLCBmZXh0cmFjdCk7IAorCQlpZiggc3Ry
cG9zMihsYXV4MywgIkFuYWx5c2lzIHR5cGU6IiwxKSApIHsKKwkJICBTdHIyTG93ZXIobGF1eDMp
OworCQkgIGlmICggc3RycG9zMihsYXV4MywiZGMiLDEpICkgeyAKKwkJICAgIG1lYXN1cmVtZW50
c1tpXS5hbmFseXNpc190eXBlID0gMTsKKwkJICB9CisJCSAgZWxzZSBpZiAoIHN0cnBvczIobGF1
eDMsImFjIiwxKSApIHsgCisJCSAgICBtZWFzdXJlbWVudHNbaV0uYW5hbHlzaXNfdHlwZSA9IDI7
CisJCSAgfQorCQkgIGVsc2UgaWYgKCBzdHJwb3MyKGxhdXgzLCJ0cmFuIiwxKSApIHsgCisJCSAg
ICBtZWFzdXJlbWVudHNbaV0uYW5hbHlzaXNfdHlwZSA9IDM7CisJCSAgfQorCQkgIGVsc2UgeyAK
KwkJICAgIHByaW50ZigiT25seSBEQywgQUMsIGFuZCBUUkFOIGFuYWx5c2lzIHR5cGVzIGFyZSBz
dXBwb3J0ZWQuXG4iKTsKKwkJICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKwkJICB9CisJCX0KKwkJ
ZWxzZSB7IAorCQkgIHByaW50ZigiXCJBbmFseXNpcyB0eXBlOlwiIGxpbmUgbXVzdCBiZSBwcmVz
ZW50IGluIGV4dHJhY3QgZmlsZSFcbiIpOworCQkgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKwkJfQog
CQlSZWFkS2V5KGxraywgIiMgQ29tbWFuZHMgIyIsIGZleHRyYWN0KTsKIAkJaWYgKHN0cmNtcChs
a2ssICIjIENvbW1hbmRzICMiKSkgeyAgICAgICAgICAgIC8qZmluZHMgIiMgQ29tbWFuZHMgIyIg
YW5kIHdyaXRlcyB0byA8aG9zdG5hbWU
+LnRtcCB1bnRpbCB0aGUgZW5kIG9mIGZpbGUqLwogCQkJ
cHJpbnRmKCJpbml0aWFsaXplLmMgLSBTdGVwNC4yIC0tIFdyb25nIGZvcm1hdCBpbiBmaWxlOiAl
c1xuIiwgbGF1eCk7CkBAIC02NDksNyArNzE2LDggQEAKICAgCQkJCWZwcmludGYoZnNwaWNlX3Rt
cCwgIiogJWkpIEV4dHJhY3QgXCclc1wnXG4iLCBpKzEsIGxrayk7CiAJCQkJYnJlYWs7CiAJCQlj
YXNlIDQ6IC8qU3BlY3RyZSovCi0gIAkJCQlmcHJpbnRmKGZzcGljZV90bXAsICIvLyAlaSkgRXh0
cmFjdCBcJyVzXCdcbiIsIGkrMSwgbGtrKTsKKwkJCSAgICAgICAgLyogaGFuZGxlIFNwZWN0cmUg
c2VwYXJhdGVseSAqLworICAJCQkJLyogZnByaW50Zihmc3BpY2VfdG1wLCAiLy8gJWkpIEV4dHJh
Y3QgXCclc1wnXG4iLCBpKzEsIGxrayk7ICovIAogCQkJCWJyZWFrOwogCQkJY2FzZSA1MDogLypR
dWNzKi8KICAgCQkJCWZwcmludGYoZnNwaWNlX3RtcCwgIiMgJWkpIEV4dHJhY3QgXCclc1wnXG4i
LCBpKzEsIGxrayk7CkBAIC02OTgsNyArNzY2LDggQEAKIAkJCQlEZWNvZGVTeW1ib2xOb2RlKGxr
aywgaSk7IC8qaGFzIHRvIHJlcGxhY2UgIzx0ZXh0PiMgaW4gdGhpcyBsaW5lKi8KIAkJCX0KIAkJ
CWlmIChsa2tbMF0hPScjJykgeyAvKmlmIGVuZCBvZiBibG9jayBoYXMgbm90IGJlZW4gcmVhY2hl
ZCovCi0JCQkJZnByaW50Zihmc3BpY2VfdG1wLCAiJXNcbiIsIGxrayk7IC8qIHdyaXRlcyB0byA8
aG9zdG5hbWU
+LnRtcCAqLworCQkJICBpZiAoIHNwaWNlICE9IDQgKSAvKiBoYW5kbGUgU3BlY3Ry
ZSB3cml0aW5nIHNlcGFyYXRlbHkgKi8gCisJCQkgICAgZnByaW50Zihmc3BpY2VfdG1wLCAiJXNc
biIsIGxrayk7IC8qIHdyaXRlcyB0byA8aG9zdG5hbWU
+LnRtcCAqLwogCQkJfQogCQkJZmdldHMy
KGxraywgTE9OR1NUUklOR1NJWkUsIGZleHRyYWN0KTsgLypyZWFkcyBmcm9tIGRpcmVjdG9yeSAi
ZXh0cmFjdC8iKi8KIAkJfQpAQCAtNzc2LDUzICs4NDUsNyBAQAogCQkJZnByaW50Zihmc3BpY2Vf
dG1wLCAiJXNcbiIsICIuZW5kIik7CiAJCQlicmVhazsKIAkJY2FzZSA0OiAvKlNwZWN0cmUqLwot
CS8qU3BlY2lhbCBjYXNlIHRvIGRlYWwgd2l0aCBTcGVjdHJlIE1ETCovCi0JCQljY29kZT0wOyAv
KiBhdCB0aGlzIG1vbW1lbnQsIG9ubHkgb25lIG1lYXN1cmVtZW50IGNhbiBleGlzdCBpbiB0aGUg
PGlucHV0ZmlsZT4uc2NzICovCi0JCQlmc2Vlayhmc3BpY2Vfc291cmNlLCAwLCBTRUVLX1NFVCk7
Ci0JCQlmcHJpbnRmKGZzcGljZV90bXAsICJ9XG5cbiIpOwotCQkJd2hpbGUgKCFQX2VvZihmc3Bp
Y2Vfc291cmNlKSkgewotCQkJCWZnZXRzMihsa2ssIExPTkdTVFJJTkdTSVpFLCBmc3BpY2Vfc291
cmNlKTsKLQkJCQlpZiAoIChsa2tbMF0gIT0gJyonKSAmJiAobGtrWzBdICE9ICdcMCcpICYmICgh
c3RycG9zMihsa2ssICIvLyIsIDEpKSApIHsKLQkJCQkJc3RyY3B5KGxhdXgsIGxrayk7ICAgICAg
ICAgICAvKmRldGVjdCAiVFJBTiIsICJ0cmFuIiwgIlRSYW4iLCAuLi4gKi8KLQkJCQkJU3RyMkxv
d2VyKGxhdXgpOwotCQkJCQlTdHJpcFNwYWNlcyhsYXV4KTsgICAgICAgICAgIC8qYXZvaWQgc3Bh
Y2VzIGFmdGVyIHRoZSBjb21tYW5kKi8KLQotCQkJCQlpZiAoc3RycG9zMihsYXV4LCAiIGRjICIs
IDEpKSB7Ci0JCQkJCQlpZiAoY2NvZGUhPTApIHsKLQkJCQkJCQlwcmludGYoImluaXRpYWxpemUu
YyAtIFN0ZXA0LjMgLS0gT25seSBvbmUgdHlwZSBvZiBzaW11bGF0aW9uIGlzIGltcGxlbWVtdGVk
IGF0IHRoaXMgdGltZSFcbiIpOwotCQkJCQkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKLQkJCQkJCX0K
LQkJCQkJCWNjb2RlKys7Ci0JCQkJCQlpPXN0cnBvczIobGF1eCwgIiBkYyAiLCAxKTsKLQkJCQkJ
CXN0cnN1YihsYXV4LCBsa2ssIDEsIGkpOwotCQkJCQkJU3RyaXBTcGFjZXMobGF1eCk7Ci0JCQkJ
CQlmcHJpbnRmKGZzcGljZV90bXAsICJydW4gZGNfcnVuIGFzIGRjMVxuIik7Ci0JCQkJCX0KLQkJ
CQkJaWYgKHN0cnBvczIobGF1eCwgIiBhYyAiLCAxKSkgewotCQkJCQkJaWYgKGNjb2RlIT0wKSB7
Ci0JCQkJCQkJcHJpbnRmKCJpbml0aWFsaXplLmMgLSBTdGVwNC4zIC0tIE9ubHkgb25lIHR5cGUg
b2Ygc2ltdWxhdGlvbiBpcyBpbXBsZW1lbXRlZCBhdCB0aGlzIHRpbWUhXG4iKTsKLQkJCQkJCQll
eGl0KEVYSVRfRkFJTFVSRSk7Ci0JCQkJCQl9Ci0JCQkJCQljY29kZSsrOwotCQkJCQkJaT1zdHJw
b3MyKGxhdXgsICIgYWMgIiwgMSk7Ci0JCQkJCQlzdHJzdWIobGF1eCwgbGtrLCAxLCBpKTsKLQkJ
CQkJCVN0cmlwU3BhY2VzKGxhdXgpOwotCQkJCQkJZnByaW50Zihmc3BpY2VfdG1wLCAicnVuIGFj
X3J1biBhcyBhYzFcbiIpOwotCQkJCQl9Ci0JCQkJCWlmIChzdHJwb3MyKGxhdXgsICIgdHJhbiAi
LCAxKSkgewotCQkJCQkJaWYgKGNjb2RlIT0wKSB7Ci0JCQkJCQkJcHJpbnRmKCJpbml0aWFsaXpl
LmMgLSBTdGVwNC4zIC0tIE9ubHkgb25lIHR5cGUgb2Ygc2ltdWxhdGlvbiBpcyBpbXBsZW1lbXRl
ZCBhdCB0aGlzIHRpbWUhXG4iKTsKLQkJCQkJCQlleGl0KEVYSVRfRkFJTFVSRSk7Ci0JCQkJCQl9
Ci0JCQkJCQljY29kZSsrOwotCQkJCQkJaT1zdHJwb3MyKGxhdXgsICIgdHJhbiAiLCAxKTsKLQkJ
CQkJCXN0cnN1YihsYXV4LCBsa2ssIDEsIGkpOwotCQkJCQkJU3RyaXBTcGFjZXMobGF1eCk7Ci0J
CQkJCQlmcHJpbnRmKGZzcGljZV90bXAsICJydW4gdHJhbl9ydW4gYXMgdHJhbjFcbiIpOwotCQkJ
CQl9Ci0JCQkJfQotCQkJfQotCS8qU3BlY2lhbCBjYXNlIHRvIGRlYWwgd2l0aCBTcGVjdHJlIE1E
TCovCisJCSAgLyogaGFuZGxlIFNwZWN0cmUgTURMIHNlcGFyYXRlbHkgKi8KIAkJCWJyZWFrOwog
CQljYXNlIDUwOiAvKlF1Y3MqLwogCQkJYnJlYWs7CkBAIC04MzMsNiArODU2LDQyIEBACiAJCQll
eGl0KEVYSVRfRkFJTFVSRSk7CiAJfQogCisJaWYgKCBzcGljZSA9PSA0ICkgeyAvKiBTcGVjdHJl
LXNwZWNpZmljIHJvdXRpbmUuICovCisJICAvKiBHbyB0aHJvdWdoIGVhY2ggb2YgdGhlIGFuYWx5
c2lzX25hbWVzIGVsZW1lbnRzIGFuZCBvdXRwdXQgc3RhdGVtZW50cyBpZiB0aGUgYW5hbHlzaXNf
bmFtZXNbaV0ubmFtZSBpcyBub3QgbnVsbC4gKi8JICAKKwkgIC8qIE9ubHkgREMsIEFDLCBhbmQg
VFJBTiBhbmFseXNpcyBpcyBzdXBwb3J0ZWQsIGF0IG1vc3Qgb25lIG9mIGVhY2guICovCisJICBp
ZiAoIGFuYWx5c2lzX25hbWVzWzBdLm5hbWVbMF0gIT0gJ1wwJyApIHsgCisJICAgIGZwcmludGYo
ZnNwaWNlX3RtcCwgImFsaWFzIG1lYXN1cmVtZW50IGRjX3J1biB7XG4iKTsKKwkgICAgZnByaW50
Zihmc3BpY2VfdG1wLCAicnVuICVzXG4iLCBhbmFseXNpc19uYW1lc1swXS5uYW1lKTsKKwkgICAg
aWYgKFNwZWN0cmVNRExTdGF0ZW1lbnRzKGZzcGljZV90bXAsIDEpICE9IDApIHsKKwkgICAgICBw
cmludGYoIlByb2JsZW0gd2l0aCBTcGVjdHJlTURMU3RhdGVtZW50cygpLlxuIik7CisJICAgICAg
ZXhpdChFWElUX0ZBSUxVUkUpOworCSAgICB9CisJICAgIGZwcmludGYoZnNwaWNlX3RtcCwgIn1c
biIpOworCSAgICBmcHJpbnRmKGZzcGljZV90bXAsICJydW4gZGNfcnVuIGFzIGRjMVxuXG4iKTsK
KwkgIH0KKwkgIGlmICggYW5hbHlzaXNfbmFtZXNbMV0ubmFtZVswXSAhPSAnXDAnICkgeyAKKwkg
ICAgZnByaW50Zihmc3BpY2VfdG1wLCAiYWxpYXMgbWVhc3VyZW1lbnQgYWNfcnVuIHtcbiIpOwor
CSAgICBmcHJpbnRmKGZzcGljZV90bXAsICJydW4gJXNcbiIsIGFuYWx5c2lzX25hbWVzWzFdLm5h
bWUpOworCSAgICBpZiAoU3BlY3RyZU1ETFN0YXRlbWVudHMoZnNwaWNlX3RtcCwgMikgIT0gMCkg
eworCSAgICAgIHByaW50ZigiUHJvYmxlbSB3aXRoIFNwZWN0cmVNRExTdGF0ZW1lbnRzKCkuXG4i
KTsKKwkgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisJICAgIH0KKwkgICAgZnByaW50Zihmc3Bp
Y2VfdG1wLCAifVxuIik7CisJICAgIGZwcmludGYoZnNwaWNlX3RtcCwgInJ1biBhY19ydW4gYXMg
YWMxXG5cbiIpOworCSAgICAKKwkgIH0KKwkgIGlmICggYW5hbHlzaXNfbmFtZXNbMl0ubmFtZVsw
XSAhPSAnXDAnICkgeyAKKwkgICAgZnByaW50Zihmc3BpY2VfdG1wLCAiYWxpYXMgbWVhc3VyZW1l
bnQgdHJhbl9ydW4ge1xuIik7CisJICAgIGZwcmludGYoZnNwaWNlX3RtcCwgInJ1biAlc1xuIiwg
YW5hbHlzaXNfbmFtZXNbMl0ubmFtZSk7CisJICAgIGlmIChTcGVjdHJlTURMU3RhdGVtZW50cyhm
c3BpY2VfdG1wLCAzKSAhPSAwKSB7CisJICAgICAgcHJpbnRmKCJQcm9ibGVtIHdpdGggU3BlY3Ry
ZU1ETFN0YXRlbWVudHMoKS5cbiIpOworCSAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKwkgICAg
fQorCSAgICBmcHJpbnRmKGZzcGljZV90bXAsICJ9XG4iKTsKKwkgICAgZnByaW50Zihmc3BpY2Vf
dG1wLCAicnVuIHRyYW5fcnVuIGFzIHRyYW4xXG4iKTsKKwkgIH0KKwl9CisJCiAJZmNsb3NlKGZz
cGljZV9zb3VyY2UpOwogCWZjbG9zZShmc3BpY2VfdG1wKTsKIApAQCAtODc2LDMgKzkzNSw2MyBA
QAogCS8qSW5pdGlhbGl6YXRpb243Ki8KIAlyZXR1cm4gRVhJVF9TVUNDRVNTOwogfQorCisvKgor
ICogIFRha2VzIHRoZSBNREwgZmlsZSBhdCBmc3BpY2VfdG1wIGFuZCB0aGUgYW5hbHlzaXMgdHlw
ZSwgdXNlcyBnbG9iYWwgCisgKiAgbWVhc3VyZW1lbnRzIGFycmF5IHRvIHdyaXRlIE1ETCBzdGF0
ZW1lbnRzIGZvciBhbmFseXNpc190eXBlLiAgCisgKiAgUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwu
CisgKi8KKworaW50IFNwZWN0cmVNRExTdGF0ZW1lbnRzKEZJTEUgKmZzcGljZV90bXAsIGludCBh
bmFseXNpc190eXBlKSB7IAorICBpbnQgayA9IDA7CisgIGludCBpaSA9IDA7CisgIEZJTEUgKmZl
eHRyYWN0OworICBjaGFyIGxrazJbTE9OR1NUUklOR1NJWkVdLCBsYXV4MltMT05HU1RSSU5HU0la
RV07CisKKyAgd2hpbGUgKCBzdHJjbXAobWVhc3VyZW1lbnRzW2tdLm1lYXNfc3ltYm9sLCJcMCIp
ICkgeyAKKyAgICBpZiAobWVhc3VyZW1lbnRzW2tdLmFuYWx5c2lzX3R5cGUgPT0gYW5hbHlzaXNf
dHlwZSkgeyAKKyAgICAgIHNwcmludGYobGtrMiwgIiVpIiwgayk7ICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAvKiB0byByZW1vdmUgaW50ZWdlciBhZGRlZCBpbiAoKikg
Ki8KKyAgICAgIGlpPShpbnQpc3RybGVuKGxrazIpOyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAvKiB0byByZW1vdmUgaW50ZWdlciBhZGRlZCBpbiAoKikgKi8KKyAg
ICAgIHNwcmludGYobGtrMiwgIiVzJXMiLCAiZXh0cmFjdC8iLCBtZWFzdXJlbWVudHNba10ubWVh
c19zeW1ib2wpOyAvKiB0byByZW1vdmUgaW50ZWdlciBhZGRlZCBpbiAoKikgKi8KKyAgICAgIGxr
azJbKGludClzdHJsZW4obGtrMiktaWldPSdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgLyogdG8gcmVtb3ZlIGludGVnZXIgYWRkZWQgaW4gKCopICovCisgICAgICBpZiAoKGZl
eHRyYWN0ID1mb3Blbihsa2syICwicnQiKSkgPT0gMCkgeworCXByaW50ZigiaW5pdGlhbGl6ZS5j
IC0gU3RlcDQuMiAtLSBDYW5ub3QgZmluZCBtZWFzdXJlbWVudCBmaWxlOiAlc1xuIiwgbGtrKTsK
KwlleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICB9CisgICAgICBzdHJjcHkobGF1eDIsIGxrazIp
OworCisgICAgICBSZWFkS2V5KGxrazIsICIjIENvbW1hbmRzICMiLCBmZXh0cmFjdCk7CisgICAg
ICBpZiAoc3RyY21wKGxrazIsICIjIENvbW1hbmRzICMiKSkgeyAgICAgICAgICAgIC8qZmluZHMg
IiMgQ29tbWFuZHMgIyIgYW5kIHdyaXRlcyB0byA8aG9zdG5hbWU
+LnRtcCB1bnRpbCB0aGUgZW5k
IG9mIGZpbGUqLworCXByaW50ZigiaW5pdGlhbGl6ZS5jIC0gU3RlcDQuMiAtLSBXcm9uZyBmb3Jt
YXQgaW4gZmlsZTogJXMgLSBzdHJpbmcgcmV0dXJuZWQgaXMgXCIlc1wiLlxuIiwgbGF1eDIsIGxr
azIpOworCWV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgIH0KKworICAgICAgc3ByaW50Zihsa2sy
LCAiJWkiLCBrKTsgICAgICAgICAgICAgICAgICAgIC8qIHRvIHJlbW92ZSBpbnRlZ2VyIGFkZGVk
IGluICgqKSAqLworICAgICAgaWk9KGludClzdHJsZW4obGtrMik7ICAgICAgICAgICAgICAgICAg
ICAgIC8qIHRvIHJlbW92ZSBpbnRlZ2VyIGFkZGVkIGluICgqKSAqLworICAgICAgc3RyY3B5KGxr
azIsIG1lYXN1cmVtZW50c1trXS5tZWFzX3N5bWJvbCk7IC8qIHRvIHJlbW92ZSBpbnRlZ2VyIGFk
ZGVkIGluICgqKSAqLworICAgICAgbGtrMlsoaW50KXN0cmxlbihsa2syKS1paV09J1wwJzsgICAg
ICAgICAgICAvKiB0byByZW1vdmUgaW50ZWdlciBhZGRlZCBpbiAoKikgKi8KKworICAgICAgZnBy
aW50Zihmc3BpY2VfdG1wLCAiLy8gJWkpIEV4dHJhY3QgXCclc1wnXG4iLCBrKzEsIGxrazIpOwor
CisgICAgICBmZ2V0czIobGtrMiwgTE9OR1NUUklOR1NJWkUsIGZleHRyYWN0KTsgLyogcmVhZHMg
ZnJvbSBkaXJlY3RvcnkgImV4dHJhY3QvIiAqLworICAgICAgd2hpbGUgKChsa2syWzBdICE9ICcj
JykgJiYgKGxrazJbMF0gIT0gJ1wwJykgJiYgKCFmZW9mKGZleHRyYWN0KSkpIHsKKwlpaT0xOwor
CVJlYWRTdWJLZXkobGF1eDIsIGxrazIsICZpaSwgJyMnLCAnIycsIDApOworCWlmIChsYXV4Mlsw
XSE9J1wwJykgeworCSAgRGVjb2RlU3ltYm9sTm9kZShsa2syLCBrKTsgLypoYXMgdG8gcmVwbGFj
ZSAjPHRleHQ
+IyBpbiB0aGlzIGxpbmUqLworCX0KKwlpZiAobGtrMlswXSE9JyMnKSB7IC8qaWYg
ZW5kIG9mIGJsb2NrIGhhcyBub3QgYmVlbiByZWFjaGVkKi8KKwkgIC8vIHByaW50ZigibGtrMiBp
cyBcIiVzXCJcbiIsIGxrazIpOworCSAgZnByaW50Zihmc3BpY2VfdG1wLCAiJXNcbiIsIGxrazIp
OyAvKiB3cml0ZXMgdG8gPGhvc3RuYW1lPi50bXAgKi8KKwkgIC8vIGZwcmludGYoZnNwaWNlX3Rt
cCwgIlxuIik7CisJfQorCWZnZXRzMihsa2syLCBMT05HU1RSSU5HU0laRSwgZmV4dHJhY3QpOyAv
KnJlYWRzIGZyb20gZGlyZWN0b3J5ICJleHRyYWN0LyIqLworICAgICAgfQorICAgICAgZmNsb3Nl
KGZleHRyYWN0KTsKKyAgICB9CisgICAgaysrOworICB9CisgIHJldHVybiAwOworfQorCisK
I've been using the ASCO tool (http://asco.sf.net) for automated
circuit sizing and optimization. Because ASCO 0.4.6, the latest
version, doesn't support optimizing on multiple analyses (AC, TRAN,
DC, etc.) simultaneously with Spectre, I added that functionality.
Here's the patch, for anyone who is interested. I've encoded it in
base64 - to get the text of the patch, using the base64 code in GNU
coreutils, you can run "base64 -d <textfile>" where textfile has the
text block below. Let me know if you need any help with it...
Patrick
LS0tIHRtcC9hc2NvLTAuNC42L2luaXRpYWxpemUuaAkyMDA2LTA1LTE2IDA0OjQ4OjQ0LjAwMDAw
MDAwMCAtMDcwMAorKysgY29kZS9hc2NvL2luaXRpYWxpemUuaAkyMDA4LTExLTE2IDEyOjQ1OjM3
LjAwMDAwMDAwMCAtMDgwMApAQCAtNTAsNiArNTAsNyBAQAogICovCiB0eXBlZGVmIHN0cnVjdCB7
CiAJY2hhciBtZWFzX3N5bWJvbFtMT05HU1RSSU5HU0laRV07IC8qc3ltYm9sIGluIHRoZSBTUElD
RSBvdXRwdXQgZmlsZSB0aGF0IHdpbGwgYmUgbWVhc3VyZWQgKi8KKyAgaW50IGFuYWx5c2lzX3R5
cGU7ICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciBTcGVjdHJlIC0gd2hpY2ggYW5hbHlzaXMg
d2lsbCB0aGUgbWVhc3VyZW1lbnQgYmUgYWRkZWQgdG8/
ICovIAogCWNoYXIgbm9kZVtMT05HU1RS
SU5HU0laRV07ICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICovCiAJaW50IG9iamVjdGl2ZV9jb25zdHJhaW50OyAgICAgICAgIC8q
TUlOPTEsIE1BWD0yLCBNT049MywgTEU9NCwgR0U9NSwgRVE9NiAgICAgICAgICAgICAgICAgKi8K
IAlkb3VibGUgY29uc3RyYWludF92YWx1ZTsgICAgICAgICAgLypzcGVjaWZpZWQgYnkgdGhlIHVz
ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTcsNyArNTgsMTQgQEAK
IAlpbnQgY29uc3RyYWludF9tZXQ7ICAgICAgICAgICAgICAgLyoxIGlmIGNvbnN0cmFpbnQgaXMg
bWV0LCAwIG90aGVyd2lzZSAgICAgICAgICAgICAgICAgICAqLwogfSBtZWFzdXJlbWVudHNfbGlu
ZTsKIAotCisvKgorICogIHN0cnVjdCB0byBhY2NvbW9kYXRlIGluZm9ybWF0aW9uIGZvciBTcGVj
dHJlIE1ETCBmaWxlcy4KKyAqCisgKi8KK3R5cGVkZWYgc3RydWN0IHsgCisgIGNoYXIgbmFtZVtM
T05HU1RSSU5HU0laRV07IC8qIG5hbWUgb2YgYW5hbHlzaXMgKi8KKyAgaW50IHR5cGU7IC8qIERD
PTEsIEFDPTIsIFRSQU49MyAqLworfSBzcGVjdHJlX2FuYWx5c2lzOwogCiAKIGludCBpbml0aWFs
aXplKGNoYXIgKmZpbGVuYW1lKTsKQEAgLTY2LDEwICs3NCwxMSBAQAogZG91YmxlIHNjYWxldG8o
ZG91YmxlIHZhbHVlLCBkb3VibGUgaW5hLCBkb3VibGUgaW5iLCBkb3VibGUgb3V0YSwgZG91Ymxl
IG91dGIsIGludCBmb3JtYXQpOwogCiAKLQotCiBwYXJhbWV0ZXJzX2xpbmUgcGFyYW1ldGVyc1tN
QVhQQVJBTUVURVJTXTsgICAgICAgLyoqLwogbWVhc3VyZW1lbnRzX2xpbmUgbWVhc3VyZW1lbnRz
W01BWE1FQVNVUkVNRU5UU107IC8qKi8KK3NwZWN0cmVfYW5hbHlzaXMgYW5hbHlzaXNfbmFtZXNb
M107CisKKwogLyoKICAqIHRvIGtub3cgaWYgYW4gQUxURVIgYW5kL29yIE1DIHNpbXVsYXRpb24g
aXMgdG8gYmUgcGVyZm9ybWVkCiAgKiAwICAwICgwKSA9PiBub3RoaW5nCi0tLSB0bXAvYXNjby0w
LjQuNi9pbml0aWFsaXplLmMJMjAwNi0xMi0xOCAwMTo0ODozMy4wMDAwMDAwMDAgLTA4MDAKKysr
IGNvZGUvYXNjby9pbml0aWFsaXplLmMJMjAwOC0xMS0xNiAxMjo0OTozNS4wMDAwMDAwMDAgLTA4
MDAKQEAgLTEwOCw2ICsxMDgsMzEgQEAKIAogCiAKKy8qCisgKiBMb29rcyBpbiAic3RyZWFtIiBm
b3IgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgImtleSIgc3RhcnRpbmcgZnJvbSB0aGUgY3VycmVu
dCBzZWVrCisgKiBwb2ludC4gSWYgZm91bmQgIlJlc3VsdCIgY29udGFpbnMgdGhlIGxpbmUgd2hp
Y2ggaXMgJ1wwJyBvdGhlcndpc2UuCisgKi8KK3ZvaWQgUmVhZFN1YnN0cmluZ0tleShjaGFyICpS
ZXN1bHQsIGNoYXIgKmtleSwgRklMRSAqc3RyZWFtKQoreworICBjaGFyIGxrazFbTE9OR1NUUklO
R1NJWkVdOworICBjaGFyIFNUUjFbTE9OR1NUUklOR1NJWkVdOworICAKKyAgaW50IGtleV9sZW4g
PSBzdHJsZW4oa2V5KTsKKworICBmZ2V0czIobGtrMSwgTE9OR1NUUklOR1NJWkUsIHN0cmVhbSk7
CisKKyAgd2hpbGUgKChzdHJuY21wKChzcHJpbnRmKFNUUjEsICIlLipzIiwgKGludClzdHJsZW4o
a2V5KSwgbGtrMSksIFNUUjEpLCAKKwkJIGtleSwga2V5X2xlbikgIT0gMCkgJiAoIVBfZW9mKHN0
cmVhbSkpKQorICAgIGZnZXRzMihsa2sxLCBMT05HU1RSSU5HU0laRSwgc3RyZWFtKTsKKworICBp
ZiAoc3RybmNtcCgoc3ByaW50ZihTVFIxLCAiJS4qcyIsIChpbnQpc3RybGVuKGtleSksIGxrazEp
LCBTVFIxKSwgCisJICAgICAga2V5LCBrZXlfbGVuKSkKKyAgICBSZXN1bHRbMF09J1wwJzsKKyAg
ZWxzZQorICAgIHN0cmNweShSZXN1bHQsIGxrazEpOworfSAvKlJlYWRLZXkqLworCisKIAogLyoK
ICAqIHJlY2VpdmVzIGEgU1BJQ0Ugc3RyaW5nIGZyb20gdGhlIDxpbnB1dGZpbGU
+Liogd2l0aCAj
PHRleHQ
+IyBhbmQgcmVwbGFjZXMKQEAgLTIyMiwxMCArMjQ3LDE5IEBACiAJaW50IGksIGlpOwog
CWludCBjY29kZTsKIAljaGFyIGxhdXhbTE9OR1NUUklOR1NJWkVdLCBsYXV4MltTSE9SVFNUUklO
R1NJWkVdLCBob3N0bmFtZVtTSE9SVFNUUklOR1NJWkVdID0gIjAiOwotCisJY2hhciBsYXV4M1tM
T05HU1RSSU5HU0laRV0gPSAiMCI7CisJCiAJLyogICA8aW5wdXRmaWxlPi4qICAgPGlucHV0Zmls
ZT4uY2ZnIDxob3N0bmFtZT4udG1wIC9leHRyYWN0LzxmaWxlPiAqLwogCUZJTEUgKmZzcGljZV9z
b3VyY2UsICpmc3BpY2VfY2ZnLCAgICAqZnNwaWNlX3RtcCwgICAqZmV4dHJhY3Q7CiAKKworCWFu
YWx5c2lzX25hbWVzWzBdLnR5cGUgPSAxOworCWFuYWx5c2lzX25hbWVzWzBdLm5hbWVbMF0gPSAn
XDAnOyAKKwlhbmFseXNpc19uYW1lc1sxXS50eXBlID0gMjsKKwlhbmFseXNpc19uYW1lc1sxXS5u
YW1lWzBdID0gJ1wwJzsKKwlhbmFseXNpc19uYW1lc1syXS50eXBlID0gMzsKKwlhbmFseXNpc19u
YW1lc1syXS5uYW1lWzBdID0gJ1wwJzsKKwogCS8qKi8KIAkvKlN0ZXAxOiBPcHRpbWl6YXRpb24g
Rmxvdzogc2hvdWxkIEFsdGVyIGFuZC9vciBNb250ZUNhcmxvIGJlIGRvbmU/
Ki8KIAlzcHJpbnRm
KGxhdXgsICIlcyVzIiwgZmlsZW5hbWUsICIuY2ZnIik7CkBAIC0zMjEsNiArMzU1LDggQEAKIAkJ
CQlSZWFkU3ViS2V5KGxhdXgsIGxraywgJmlpLCAnOicsICc6JywgNSk7CiAJCQkJcGFyYW1ldGVy
c1tpXS5tYXhpbXVtPWFzYzJyZWFsKGxhdXgsIDEsIChpbnQpc3RybGVuKGxhdXgpKTsgLyptYXhp
bXVtICovCiAJCQkJaWYgKHBhcmFtZXRlcnNbaV0ubWluaW11bSA
+IHBhcmFtZXRlcnNbaV0ubWF4
aW11bSkgeyAvKmp1c3QgdG8gaGVscCovCisJCQkJICAgICAgICBwcmludGYoImluaXRpYWxpemUu
YyAtIFN0ZXAyIC0tIE1pbmltdW0gKCVmKSBpcyBsYXJnZXIgdGhhbiBNYXhpbXVtICglZikgaW4g
bGluZTogJXNcbiIsIAorCQkJCQkgICAgICAgcGFyYW1ldGVyc1tpXS5taW5pbXVtLCBwYXJhbWV0
ZXJzW2ldLm1heGltdW0sIGxrayk7CiAJCQkJCXByaW50ZigiaW5pdGlhbGl6ZS5jIC0gU3RlcDIg
LS0gTWluaW11bSBpcyBsYXJnZXIgdGhhbiBNYXhpbXVtIGluIGxpbmU6ICVzXG4iLCBsa2spOwog
CQkJCQlleGl0KEVYSVRfRkFJTFVSRSk7CiAJCQkJfQpAQCAtNTc5LDI1ICs2MTUsMzQgQEAKIAkJ
CQkJU3RyaXBTcGFjZXMobGF1eCk7ICAgICAgICAgICAvKmF2b2lkIHNwYWNlcyBhZnRlciB0aGUg
Y29tbWFuZCovCiAKIAkJCQkJaWYgKHN0cnBvczIobGF1eCwgIiBkYyAiLCAxKSkgewotCQkJCQkJ
ZnByaW50Zihmc3BpY2VfdG1wLCAiYWxpYXMgbWVhc3VyZW1lbnQgZGNfcnVuIHtcbiIpOwogCQkJ
CQkJaT1zdHJwb3MyKGxhdXgsICIgZGMgIiwgMSk7CiAJCQkJCQlzdHJzdWIobGF1eCwgbGtrLCAx
LCBpKTsKIAkJCQkJCVN0cmlwU3BhY2VzKGxhdXgpOwotCQkJCQkJZnByaW50Zihmc3BpY2VfdG1w
LCAicnVuICVzXG4iLCBsYXV4KTsKKwkJCQkJCWlmICggYW5hbHlzaXNfbmFtZXNbMF0ubmFtZVsw
XSAhPSAnXDAnICkgeyAKKwkJCQkJCSAgcHJpbnRmKCJpbml0aWFsaXplLmMgLSBTdGVwNC4xIC0g
b25seSBvbmUgREMgYW5hbHlzaXMgaXMgYWxsb3dlZC5cbiIpOworCQkJCQkJICBleGl0KEVYSVRf
RkFJTFVSRSk7CisJCQkJCQl9CisJCQkJCQlzdHJjcHkoYW5hbHlzaXNfbmFtZXNbMF0ubmFtZSwg
bGF1eCk7CiAJCQkJCX0KIAkJCQkJaWYgKHN0cnBvczIobGF1eCwgIiBhYyAiLCAxKSkgewotCQkJ
CQkJZnByaW50Zihmc3BpY2VfdG1wLCAiYWxpYXMgbWVhc3VyZW1lbnQgYWNfcnVuIHtcbiIpOwog
CQkJCQkJaT1zdHJwb3MyKGxhdXgsICIgYWMgIiwgMSk7CiAJCQkJCQlzdHJzdWIobGF1eCwgbGtr
LCAxLCBpKTsKIAkJCQkJCVN0cmlwU3BhY2VzKGxhdXgpOwotCQkJCQkJZnByaW50Zihmc3BpY2Vf
dG1wLCAicnVuICVzXG4iLCBsYXV4KTsKKwkJCQkJCWlmICggYW5hbHlzaXNfbmFtZXNbMV0ubmFt
ZVswXSAhPSAnXDAnICkgeyAKKwkJCQkJCSAgcHJpbnRmKCJpbml0aWFsaXplLmMgLSBTdGVwNC4x
IC0gb25seSBvbmUgQUMgYW5hbHlzaXMgaXMgYWxsb3dlZC5cbiIpOworCQkJCQkJICBleGl0KEVY
SVRfRkFJTFVSRSk7CisJCQkJCQl9CisJCQkJCQlzdHJjcHkoYW5hbHlzaXNfbmFtZXNbMV0ubmFt
ZSwgbGF1eCk7CiAJCQkJCX0KIAkJCQkJaWYgKHN0cnBvczIobGF1eCwgIiB0cmFuICIsIDEpKSB7
Ci0JCQkJCQlmcHJpbnRmKGZzcGljZV90bXAsICJhbGlhcyBtZWFzdXJlbWVudCB0cmFuX3J1biB7
XG4iKTsKIAkJCQkJCWk9c3RycG9zMihsYXV4LCAiIHRyYW4gIiwgMSk7CiAJCQkJCQlzdHJzdWIo
bGF1eCwgbGtrLCAxLCBpKTsKIAkJCQkJCVN0cmlwU3BhY2VzKGxhdXgpOwotCQkJCQkJZnByaW50
Zihmc3BpY2VfdG1wLCAicnVuICVzXG4iLCBsYXV4KTsKKwkJCQkJCWlmICggYW5hbHlzaXNfbmFt
ZXNbMl0ubmFtZVswXSAhPSAnXDAnICkgeyAKKwkJCQkJCSAgcHJpbnRmKCJpbml0aWFsaXplLmMg
LSBTdGVwNC4xIC0gb25seSBvbmUgVFJBTiBhbmFseXNpcyBpcyBhbGxvd2VkLlxuIik7CisJCQkJ
CQkgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKwkJCQkJCX0KKwkJCQkJCXN0cmNweShhbmFseXNpc19u
YW1lc1syXS5uYW1lLCBsYXV4KTsKIAkJCQkJfQogCQkJCX0KIAkJCX0KQEAgLTYyNCw4ICs2Njks
MzAgQEAKIAkJCXByaW50ZigiaW5pdGlhbGl6ZS5jIC0gU3RlcDQuMiAtLSBDYW5ub3QgZmluZCBt
ZWFzdXJlbWVudCBmaWxlOiAlc1xuIiwgbGtrKTsKIAkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKIAkJ
fQotCiAJCXN0cmNweShsYXV4LGxrayk7CisKKwkJLyogZmluZCB0aGUgYW5hbHlzaXMgdHlwZSBh
bmQgcHV0IGl0IGluIG1lYXN1cmVtZW50c1tpXS5hbmFseXNpc190eXBlICovIAorCQlSZWFkU3Vi
c3RyaW5nS2V5KGxhdXgzLCAiQW5hbHlzaXMgdHlwZToiLCBmZXh0cmFjdCk7IAorCQlpZiggc3Ry
cG9zMihsYXV4MywgIkFuYWx5c2lzIHR5cGU6IiwxKSApIHsKKwkJICBTdHIyTG93ZXIobGF1eDMp
OworCQkgIGlmICggc3RycG9zMihsYXV4MywiZGMiLDEpICkgeyAKKwkJICAgIG1lYXN1cmVtZW50
c1tpXS5hbmFseXNpc190eXBlID0gMTsKKwkJICB9CisJCSAgZWxzZSBpZiAoIHN0cnBvczIobGF1
eDMsImFjIiwxKSApIHsgCisJCSAgICBtZWFzdXJlbWVudHNbaV0uYW5hbHlzaXNfdHlwZSA9IDI7
CisJCSAgfQorCQkgIGVsc2UgaWYgKCBzdHJwb3MyKGxhdXgzLCJ0cmFuIiwxKSApIHsgCisJCSAg
ICBtZWFzdXJlbWVudHNbaV0uYW5hbHlzaXNfdHlwZSA9IDM7CisJCSAgfQorCQkgIGVsc2UgeyAK
KwkJICAgIHByaW50ZigiT25seSBEQywgQUMsIGFuZCBUUkFOIGFuYWx5c2lzIHR5cGVzIGFyZSBz
dXBwb3J0ZWQuXG4iKTsKKwkJICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKwkJICB9CisJCX0KKwkJ
ZWxzZSB7IAorCQkgIHByaW50ZigiXCJBbmFseXNpcyB0eXBlOlwiIGxpbmUgbXVzdCBiZSBwcmVz
ZW50IGluIGV4dHJhY3QgZmlsZSFcbiIpOworCQkgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKwkJfQog
CQlSZWFkS2V5KGxraywgIiMgQ29tbWFuZHMgIyIsIGZleHRyYWN0KTsKIAkJaWYgKHN0cmNtcChs
a2ssICIjIENvbW1hbmRzICMiKSkgeyAgICAgICAgICAgIC8qZmluZHMgIiMgQ29tbWFuZHMgIyIg
YW5kIHdyaXRlcyB0byA8aG9zdG5hbWU
+LnRtcCB1bnRpbCB0aGUgZW5kIG9mIGZpbGUqLwogCQkJ
cHJpbnRmKCJpbml0aWFsaXplLmMgLSBTdGVwNC4yIC0tIFdyb25nIGZvcm1hdCBpbiBmaWxlOiAl
c1xuIiwgbGF1eCk7CkBAIC02NDksNyArNzE2LDggQEAKICAgCQkJCWZwcmludGYoZnNwaWNlX3Rt
cCwgIiogJWkpIEV4dHJhY3QgXCclc1wnXG4iLCBpKzEsIGxrayk7CiAJCQkJYnJlYWs7CiAJCQlj
YXNlIDQ6IC8qU3BlY3RyZSovCi0gIAkJCQlmcHJpbnRmKGZzcGljZV90bXAsICIvLyAlaSkgRXh0
cmFjdCBcJyVzXCdcbiIsIGkrMSwgbGtrKTsKKwkJCSAgICAgICAgLyogaGFuZGxlIFNwZWN0cmUg
c2VwYXJhdGVseSAqLworICAJCQkJLyogZnByaW50Zihmc3BpY2VfdG1wLCAiLy8gJWkpIEV4dHJh
Y3QgXCclc1wnXG4iLCBpKzEsIGxrayk7ICovIAogCQkJCWJyZWFrOwogCQkJY2FzZSA1MDogLypR
dWNzKi8KICAgCQkJCWZwcmludGYoZnNwaWNlX3RtcCwgIiMgJWkpIEV4dHJhY3QgXCclc1wnXG4i
LCBpKzEsIGxrayk7CkBAIC02OTgsNyArNzY2LDggQEAKIAkJCQlEZWNvZGVTeW1ib2xOb2RlKGxr
aywgaSk7IC8qaGFzIHRvIHJlcGxhY2UgIzx0ZXh0PiMgaW4gdGhpcyBsaW5lKi8KIAkJCX0KIAkJ
CWlmIChsa2tbMF0hPScjJykgeyAvKmlmIGVuZCBvZiBibG9jayBoYXMgbm90IGJlZW4gcmVhY2hl
ZCovCi0JCQkJZnByaW50Zihmc3BpY2VfdG1wLCAiJXNcbiIsIGxrayk7IC8qIHdyaXRlcyB0byA8
aG9zdG5hbWU
+LnRtcCAqLworCQkJICBpZiAoIHNwaWNlICE9IDQgKSAvKiBoYW5kbGUgU3BlY3Ry
ZSB3cml0aW5nIHNlcGFyYXRlbHkgKi8gCisJCQkgICAgZnByaW50Zihmc3BpY2VfdG1wLCAiJXNc
biIsIGxrayk7IC8qIHdyaXRlcyB0byA8aG9zdG5hbWU
+LnRtcCAqLwogCQkJfQogCQkJZmdldHMy
KGxraywgTE9OR1NUUklOR1NJWkUsIGZleHRyYWN0KTsgLypyZWFkcyBmcm9tIGRpcmVjdG9yeSAi
ZXh0cmFjdC8iKi8KIAkJfQpAQCAtNzc2LDUzICs4NDUsNyBAQAogCQkJZnByaW50Zihmc3BpY2Vf
dG1wLCAiJXNcbiIsICIuZW5kIik7CiAJCQlicmVhazsKIAkJY2FzZSA0OiAvKlNwZWN0cmUqLwot
CS8qU3BlY2lhbCBjYXNlIHRvIGRlYWwgd2l0aCBTcGVjdHJlIE1ETCovCi0JCQljY29kZT0wOyAv
KiBhdCB0aGlzIG1vbW1lbnQsIG9ubHkgb25lIG1lYXN1cmVtZW50IGNhbiBleGlzdCBpbiB0aGUg
PGlucHV0ZmlsZT4uc2NzICovCi0JCQlmc2Vlayhmc3BpY2Vfc291cmNlLCAwLCBTRUVLX1NFVCk7
Ci0JCQlmcHJpbnRmKGZzcGljZV90bXAsICJ9XG5cbiIpOwotCQkJd2hpbGUgKCFQX2VvZihmc3Bp
Y2Vfc291cmNlKSkgewotCQkJCWZnZXRzMihsa2ssIExPTkdTVFJJTkdTSVpFLCBmc3BpY2Vfc291
cmNlKTsKLQkJCQlpZiAoIChsa2tbMF0gIT0gJyonKSAmJiAobGtrWzBdICE9ICdcMCcpICYmICgh
c3RycG9zMihsa2ssICIvLyIsIDEpKSApIHsKLQkJCQkJc3RyY3B5KGxhdXgsIGxrayk7ICAgICAg
ICAgICAvKmRldGVjdCAiVFJBTiIsICJ0cmFuIiwgIlRSYW4iLCAuLi4gKi8KLQkJCQkJU3RyMkxv
d2VyKGxhdXgpOwotCQkJCQlTdHJpcFNwYWNlcyhsYXV4KTsgICAgICAgICAgIC8qYXZvaWQgc3Bh
Y2VzIGFmdGVyIHRoZSBjb21tYW5kKi8KLQotCQkJCQlpZiAoc3RycG9zMihsYXV4LCAiIGRjICIs
IDEpKSB7Ci0JCQkJCQlpZiAoY2NvZGUhPTApIHsKLQkJCQkJCQlwcmludGYoImluaXRpYWxpemUu
YyAtIFN0ZXA0LjMgLS0gT25seSBvbmUgdHlwZSBvZiBzaW11bGF0aW9uIGlzIGltcGxlbWVtdGVk
IGF0IHRoaXMgdGltZSFcbiIpOwotCQkJCQkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKLQkJCQkJCX0K
LQkJCQkJCWNjb2RlKys7Ci0JCQkJCQlpPXN0cnBvczIobGF1eCwgIiBkYyAiLCAxKTsKLQkJCQkJ
CXN0cnN1YihsYXV4LCBsa2ssIDEsIGkpOwotCQkJCQkJU3RyaXBTcGFjZXMobGF1eCk7Ci0JCQkJ
CQlmcHJpbnRmKGZzcGljZV90bXAsICJydW4gZGNfcnVuIGFzIGRjMVxuIik7Ci0JCQkJCX0KLQkJ
CQkJaWYgKHN0cnBvczIobGF1eCwgIiBhYyAiLCAxKSkgewotCQkJCQkJaWYgKGNjb2RlIT0wKSB7
Ci0JCQkJCQkJcHJpbnRmKCJpbml0aWFsaXplLmMgLSBTdGVwNC4zIC0tIE9ubHkgb25lIHR5cGUg
b2Ygc2ltdWxhdGlvbiBpcyBpbXBsZW1lbXRlZCBhdCB0aGlzIHRpbWUhXG4iKTsKLQkJCQkJCQll
eGl0KEVYSVRfRkFJTFVSRSk7Ci0JCQkJCQl9Ci0JCQkJCQljY29kZSsrOwotCQkJCQkJaT1zdHJw
b3MyKGxhdXgsICIgYWMgIiwgMSk7Ci0JCQkJCQlzdHJzdWIobGF1eCwgbGtrLCAxLCBpKTsKLQkJ
CQkJCVN0cmlwU3BhY2VzKGxhdXgpOwotCQkJCQkJZnByaW50Zihmc3BpY2VfdG1wLCAicnVuIGFj
X3J1biBhcyBhYzFcbiIpOwotCQkJCQl9Ci0JCQkJCWlmIChzdHJwb3MyKGxhdXgsICIgdHJhbiAi
LCAxKSkgewotCQkJCQkJaWYgKGNjb2RlIT0wKSB7Ci0JCQkJCQkJcHJpbnRmKCJpbml0aWFsaXpl
LmMgLSBTdGVwNC4zIC0tIE9ubHkgb25lIHR5cGUgb2Ygc2ltdWxhdGlvbiBpcyBpbXBsZW1lbXRl
ZCBhdCB0aGlzIHRpbWUhXG4iKTsKLQkJCQkJCQlleGl0KEVYSVRfRkFJTFVSRSk7Ci0JCQkJCQl9
Ci0JCQkJCQljY29kZSsrOwotCQkJCQkJaT1zdHJwb3MyKGxhdXgsICIgdHJhbiAiLCAxKTsKLQkJ
CQkJCXN0cnN1YihsYXV4LCBsa2ssIDEsIGkpOwotCQkJCQkJU3RyaXBTcGFjZXMobGF1eCk7Ci0J
CQkJCQlmcHJpbnRmKGZzcGljZV90bXAsICJydW4gdHJhbl9ydW4gYXMgdHJhbjFcbiIpOwotCQkJ
CQl9Ci0JCQkJfQotCQkJfQotCS8qU3BlY2lhbCBjYXNlIHRvIGRlYWwgd2l0aCBTcGVjdHJlIE1E
TCovCisJCSAgLyogaGFuZGxlIFNwZWN0cmUgTURMIHNlcGFyYXRlbHkgKi8KIAkJCWJyZWFrOwog
CQljYXNlIDUwOiAvKlF1Y3MqLwogCQkJYnJlYWs7CkBAIC04MzMsNiArODU2LDQyIEBACiAJCQll
eGl0KEVYSVRfRkFJTFVSRSk7CiAJfQogCisJaWYgKCBzcGljZSA9PSA0ICkgeyAvKiBTcGVjdHJl
LXNwZWNpZmljIHJvdXRpbmUuICovCisJICAvKiBHbyB0aHJvdWdoIGVhY2ggb2YgdGhlIGFuYWx5
c2lzX25hbWVzIGVsZW1lbnRzIGFuZCBvdXRwdXQgc3RhdGVtZW50cyBpZiB0aGUgYW5hbHlzaXNf
bmFtZXNbaV0ubmFtZSBpcyBub3QgbnVsbC4gKi8JICAKKwkgIC8qIE9ubHkgREMsIEFDLCBhbmQg
VFJBTiBhbmFseXNpcyBpcyBzdXBwb3J0ZWQsIGF0IG1vc3Qgb25lIG9mIGVhY2guICovCisJICBp
ZiAoIGFuYWx5c2lzX25hbWVzWzBdLm5hbWVbMF0gIT0gJ1wwJyApIHsgCisJICAgIGZwcmludGYo
ZnNwaWNlX3RtcCwgImFsaWFzIG1lYXN1cmVtZW50IGRjX3J1biB7XG4iKTsKKwkgICAgZnByaW50
Zihmc3BpY2VfdG1wLCAicnVuICVzXG4iLCBhbmFseXNpc19uYW1lc1swXS5uYW1lKTsKKwkgICAg
aWYgKFNwZWN0cmVNRExTdGF0ZW1lbnRzKGZzcGljZV90bXAsIDEpICE9IDApIHsKKwkgICAgICBw
cmludGYoIlByb2JsZW0gd2l0aCBTcGVjdHJlTURMU3RhdGVtZW50cygpLlxuIik7CisJICAgICAg
ZXhpdChFWElUX0ZBSUxVUkUpOworCSAgICB9CisJICAgIGZwcmludGYoZnNwaWNlX3RtcCwgIn1c
biIpOworCSAgICBmcHJpbnRmKGZzcGljZV90bXAsICJydW4gZGNfcnVuIGFzIGRjMVxuXG4iKTsK
KwkgIH0KKwkgIGlmICggYW5hbHlzaXNfbmFtZXNbMV0ubmFtZVswXSAhPSAnXDAnICkgeyAKKwkg
ICAgZnByaW50Zihmc3BpY2VfdG1wLCAiYWxpYXMgbWVhc3VyZW1lbnQgYWNfcnVuIHtcbiIpOwor
CSAgICBmcHJpbnRmKGZzcGljZV90bXAsICJydW4gJXNcbiIsIGFuYWx5c2lzX25hbWVzWzFdLm5h
bWUpOworCSAgICBpZiAoU3BlY3RyZU1ETFN0YXRlbWVudHMoZnNwaWNlX3RtcCwgMikgIT0gMCkg
eworCSAgICAgIHByaW50ZigiUHJvYmxlbSB3aXRoIFNwZWN0cmVNRExTdGF0ZW1lbnRzKCkuXG4i
KTsKKwkgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisJICAgIH0KKwkgICAgZnByaW50Zihmc3Bp
Y2VfdG1wLCAifVxuIik7CisJICAgIGZwcmludGYoZnNwaWNlX3RtcCwgInJ1biBhY19ydW4gYXMg
YWMxXG5cbiIpOworCSAgICAKKwkgIH0KKwkgIGlmICggYW5hbHlzaXNfbmFtZXNbMl0ubmFtZVsw
XSAhPSAnXDAnICkgeyAKKwkgICAgZnByaW50Zihmc3BpY2VfdG1wLCAiYWxpYXMgbWVhc3VyZW1l
bnQgdHJhbl9ydW4ge1xuIik7CisJICAgIGZwcmludGYoZnNwaWNlX3RtcCwgInJ1biAlc1xuIiwg
YW5hbHlzaXNfbmFtZXNbMl0ubmFtZSk7CisJICAgIGlmIChTcGVjdHJlTURMU3RhdGVtZW50cyhm
c3BpY2VfdG1wLCAzKSAhPSAwKSB7CisJICAgICAgcHJpbnRmKCJQcm9ibGVtIHdpdGggU3BlY3Ry
ZU1ETFN0YXRlbWVudHMoKS5cbiIpOworCSAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKwkgICAg
fQorCSAgICBmcHJpbnRmKGZzcGljZV90bXAsICJ9XG4iKTsKKwkgICAgZnByaW50Zihmc3BpY2Vf
dG1wLCAicnVuIHRyYW5fcnVuIGFzIHRyYW4xXG4iKTsKKwkgIH0KKwl9CisJCiAJZmNsb3NlKGZz
cGljZV9zb3VyY2UpOwogCWZjbG9zZShmc3BpY2VfdG1wKTsKIApAQCAtODc2LDMgKzkzNSw2MyBA
QAogCS8qSW5pdGlhbGl6YXRpb243Ki8KIAlyZXR1cm4gRVhJVF9TVUNDRVNTOwogfQorCisvKgor
ICogIFRha2VzIHRoZSBNREwgZmlsZSBhdCBmc3BpY2VfdG1wIGFuZCB0aGUgYW5hbHlzaXMgdHlw
ZSwgdXNlcyBnbG9iYWwgCisgKiAgbWVhc3VyZW1lbnRzIGFycmF5IHRvIHdyaXRlIE1ETCBzdGF0
ZW1lbnRzIGZvciBhbmFseXNpc190eXBlLiAgCisgKiAgUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwu
CisgKi8KKworaW50IFNwZWN0cmVNRExTdGF0ZW1lbnRzKEZJTEUgKmZzcGljZV90bXAsIGludCBh
bmFseXNpc190eXBlKSB7IAorICBpbnQgayA9IDA7CisgIGludCBpaSA9IDA7CisgIEZJTEUgKmZl
eHRyYWN0OworICBjaGFyIGxrazJbTE9OR1NUUklOR1NJWkVdLCBsYXV4MltMT05HU1RSSU5HU0la
RV07CisKKyAgd2hpbGUgKCBzdHJjbXAobWVhc3VyZW1lbnRzW2tdLm1lYXNfc3ltYm9sLCJcMCIp
ICkgeyAKKyAgICBpZiAobWVhc3VyZW1lbnRzW2tdLmFuYWx5c2lzX3R5cGUgPT0gYW5hbHlzaXNf
dHlwZSkgeyAKKyAgICAgIHNwcmludGYobGtrMiwgIiVpIiwgayk7ICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAvKiB0byByZW1vdmUgaW50ZWdlciBhZGRlZCBpbiAoKikg
Ki8KKyAgICAgIGlpPShpbnQpc3RybGVuKGxrazIpOyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAvKiB0byByZW1vdmUgaW50ZWdlciBhZGRlZCBpbiAoKikgKi8KKyAg
ICAgIHNwcmludGYobGtrMiwgIiVzJXMiLCAiZXh0cmFjdC8iLCBtZWFzdXJlbWVudHNba10ubWVh
c19zeW1ib2wpOyAvKiB0byByZW1vdmUgaW50ZWdlciBhZGRlZCBpbiAoKikgKi8KKyAgICAgIGxr
azJbKGludClzdHJsZW4obGtrMiktaWldPSdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgLyogdG8gcmVtb3ZlIGludGVnZXIgYWRkZWQgaW4gKCopICovCisgICAgICBpZiAoKGZl
eHRyYWN0ID1mb3Blbihsa2syICwicnQiKSkgPT0gMCkgeworCXByaW50ZigiaW5pdGlhbGl6ZS5j
IC0gU3RlcDQuMiAtLSBDYW5ub3QgZmluZCBtZWFzdXJlbWVudCBmaWxlOiAlc1xuIiwgbGtrKTsK
KwlleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICB9CisgICAgICBzdHJjcHkobGF1eDIsIGxrazIp
OworCisgICAgICBSZWFkS2V5KGxrazIsICIjIENvbW1hbmRzICMiLCBmZXh0cmFjdCk7CisgICAg
ICBpZiAoc3RyY21wKGxrazIsICIjIENvbW1hbmRzICMiKSkgeyAgICAgICAgICAgIC8qZmluZHMg
IiMgQ29tbWFuZHMgIyIgYW5kIHdyaXRlcyB0byA8aG9zdG5hbWU
+LnRtcCB1bnRpbCB0aGUgZW5k
IG9mIGZpbGUqLworCXByaW50ZigiaW5pdGlhbGl6ZS5jIC0gU3RlcDQuMiAtLSBXcm9uZyBmb3Jt
YXQgaW4gZmlsZTogJXMgLSBzdHJpbmcgcmV0dXJuZWQgaXMgXCIlc1wiLlxuIiwgbGF1eDIsIGxr
azIpOworCWV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgIH0KKworICAgICAgc3ByaW50Zihsa2sy
LCAiJWkiLCBrKTsgICAgICAgICAgICAgICAgICAgIC8qIHRvIHJlbW92ZSBpbnRlZ2VyIGFkZGVk
IGluICgqKSAqLworICAgICAgaWk9KGludClzdHJsZW4obGtrMik7ICAgICAgICAgICAgICAgICAg
ICAgIC8qIHRvIHJlbW92ZSBpbnRlZ2VyIGFkZGVkIGluICgqKSAqLworICAgICAgc3RyY3B5KGxr
azIsIG1lYXN1cmVtZW50c1trXS5tZWFzX3N5bWJvbCk7IC8qIHRvIHJlbW92ZSBpbnRlZ2VyIGFk
ZGVkIGluICgqKSAqLworICAgICAgbGtrMlsoaW50KXN0cmxlbihsa2syKS1paV09J1wwJzsgICAg
ICAgICAgICAvKiB0byByZW1vdmUgaW50ZWdlciBhZGRlZCBpbiAoKikgKi8KKworICAgICAgZnBy
aW50Zihmc3BpY2VfdG1wLCAiLy8gJWkpIEV4dHJhY3QgXCclc1wnXG4iLCBrKzEsIGxrazIpOwor
CisgICAgICBmZ2V0czIobGtrMiwgTE9OR1NUUklOR1NJWkUsIGZleHRyYWN0KTsgLyogcmVhZHMg
ZnJvbSBkaXJlY3RvcnkgImV4dHJhY3QvIiAqLworICAgICAgd2hpbGUgKChsa2syWzBdICE9ICcj
JykgJiYgKGxrazJbMF0gIT0gJ1wwJykgJiYgKCFmZW9mKGZleHRyYWN0KSkpIHsKKwlpaT0xOwor
CVJlYWRTdWJLZXkobGF1eDIsIGxrazIsICZpaSwgJyMnLCAnIycsIDApOworCWlmIChsYXV4Mlsw
XSE9J1wwJykgeworCSAgRGVjb2RlU3ltYm9sTm9kZShsa2syLCBrKTsgLypoYXMgdG8gcmVwbGFj
ZSAjPHRleHQ
+IyBpbiB0aGlzIGxpbmUqLworCX0KKwlpZiAobGtrMlswXSE9JyMnKSB7IC8qaWYg
ZW5kIG9mIGJsb2NrIGhhcyBub3QgYmVlbiByZWFjaGVkKi8KKwkgIC8vIHByaW50ZigibGtrMiBp
cyBcIiVzXCJcbiIsIGxrazIpOworCSAgZnByaW50Zihmc3BpY2VfdG1wLCAiJXNcbiIsIGxrazIp
OyAvKiB3cml0ZXMgdG8gPGhvc3RuYW1lPi50bXAgKi8KKwkgIC8vIGZwcmludGYoZnNwaWNlX3Rt
cCwgIlxuIik7CisJfQorCWZnZXRzMihsa2syLCBMT05HU1RSSU5HU0laRSwgZmV4dHJhY3QpOyAv
KnJlYWRzIGZyb20gZGlyZWN0b3J5ICJleHRyYWN0LyIqLworICAgICAgfQorICAgICAgZmNsb3Nl
KGZleHRyYWN0KTsKKyAgICB9CisgICAgaysrOworICB9CisgIHJldHVybiAwOworfQorCisK