#!python

import os, sys, base64

VERSIONEER_b64 = """
CiMgVmVyc2lvbjogMC4xNQoKIiIiClRoZSBWZXJzaW9uZWVyCj09PT09PT09
PT09PT09CgoqIGxpa2UgYSByb2NrZXRlZXIsIGJ1dCBmb3IgdmVyc2lvbnMh
CiogaHR0cHM6Ly9naXRodWIuY29tL3dhcm5lci9weXRob24tdmVyc2lvbmVl
cgoqIEJyaWFuIFdhcm5lcgoqIExpY2Vuc2U6IFB1YmxpYyBEb21haW4KKiBD
b21wYXRpYmxlIFdpdGg6IHB5dGhvbjIuNiwgMi43LCAzLjIsIDMuMywgMy40
LCBhbmQgcHlweQoqIFshW0xhdGVzdCBWZXJzaW9uXQooaHR0cHM6Ly9weXBp
cC5pbi92ZXJzaW9uL3ZlcnNpb25lZXIvYmFkZ2Uuc3ZnP3N0eWxlPWZsYXQp
Cl0oaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaS92ZXJzaW9uZWVyLykK
KiBbIVtCdWlsZCBTdGF0dXNdCihodHRwczovL3RyYXZpcy1jaS5vcmcvd2Fy
bmVyL3B5dGhvbi12ZXJzaW9uZWVyLnBuZz9icmFuY2g9bWFzdGVyKQpdKGh0
dHBzOi8vdHJhdmlzLWNpLm9yZy93YXJuZXIvcHl0aG9uLXZlcnNpb25lZXIp
CgpUaGlzIGlzIGEgdG9vbCBmb3IgbWFuYWdpbmcgYSByZWNvcmRlZCB2ZXJz
aW9uIG51bWJlciBpbiBkaXN0dXRpbHMtYmFzZWQKcHl0aG9uIHByb2plY3Rz
LiBUaGUgZ29hbCBpcyB0byByZW1vdmUgdGhlIHRlZGlvdXMgYW5kIGVycm9y
LXByb25lICJ1cGRhdGUKdGhlIGVtYmVkZGVkIHZlcnNpb24gc3RyaW5nIiBz
dGVwIGZyb20geW91ciByZWxlYXNlIHByb2Nlc3MuIE1ha2luZyBhIG5ldwpy
ZWxlYXNlIHNob3VsZCBiZSBhcyBlYXN5IGFzIHJlY29yZGluZyBhIG5ldyB0
YWcgaW4geW91ciB2ZXJzaW9uLWNvbnRyb2wKc3lzdGVtLCBhbmQgbWF5YmUg
bWFraW5nIG5ldyB0YXJiYWxscy4KCgojIyBRdWljayBJbnN0YWxsCgoqIGBw
aXAgaW5zdGFsbCB2ZXJzaW9uZWVyYCB0byBzb21ld2hlcmUgdG8geW91ciAk
UEFUSAoqIGFkZCBhIGBbdmVyc2lvbmVlcl1gIHNlY3Rpb24gdG8geW91ciBz
ZXR1cC5jZmcgKHNlZSBiZWxvdykKKiBydW4gYHZlcnNpb25lZXIgaW5zdGFs
bGAgaW4geW91ciBzb3VyY2UgdHJlZSwgY29tbWl0IHRoZSByZXN1bHRzCgoj
IyBWZXJzaW9uIElkZW50aWZpZXJzCgpTb3VyY2UgdHJlZXMgY29tZSBmcm9t
IGEgdmFyaWV0eSBvZiBwbGFjZXM6CgoqIGEgdmVyc2lvbi1jb250cm9sIHN5
c3RlbSBjaGVja291dCAobW9zdGx5IHVzZWQgYnkgZGV2ZWxvcGVycykKKiBh
IG5pZ2h0bHkgdGFyYmFsbCwgcHJvZHVjZWQgYnkgYnVpbGQgYXV0b21hdGlv
bgoqIGEgc25hcHNob3QgdGFyYmFsbCwgcHJvZHVjZWQgYnkgYSB3ZWItYmFz
ZWQgVkNTIGJyb3dzZXIsIGxpa2UgZ2l0aHViJ3MKICAidGFyYmFsbCBmcm9t
IHRhZyIgZmVhdHVyZQoqIGEgcmVsZWFzZSB0YXJiYWxsLCBwcm9kdWNlZCBi
eSAic2V0dXAucHkgc2Rpc3QiLCBkaXN0cmlidXRlZCB0aHJvdWdoIFB5UEkK
CldpdGhpbiBlYWNoIHNvdXJjZSB0cmVlLCB0aGUgdmVyc2lvbiBpZGVudGlm
aWVyIChlaXRoZXIgYSBzdHJpbmcgb3IgYSBudW1iZXIsCnRoaXMgdG9vbCBp
cyBmb3JtYXQtYWdub3N0aWMpIGNhbiBjb21lIGZyb20gYSB2YXJpZXR5IG9m
IHBsYWNlczoKCiogYXNrIHRoZSBWQ1MgdG9vbCBpdHNlbGYsIGUuZy4gImdp
dCBkZXNjcmliZSIgKGZvciBjaGVja291dHMpLCB3aGljaCBrbm93cwogIGFi
b3V0IHJlY2VudCAidGFncyIgYW5kIGFuIGFic29sdXRlIHJldmlzaW9uLWlk
CiogdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSB0
YXJiYWxsIHdhcyB1bnBhY2tlZAoqIGFuIGV4cGFuZGVkIFZDUyBrZXl3b3Jk
ICgkSWQkLCBldGMpCiogYSBgX3ZlcnNpb24ucHlgIGNyZWF0ZWQgYnkgc29t
ZSBlYXJsaWVyIGJ1aWxkIHN0ZXAKCkZvciByZWxlYXNlZCBzb2Z0d2FyZSwg
dGhlIHZlcnNpb24gaWRlbnRpZmllciBpcyBjbG9zZWx5IHJlbGF0ZWQgdG8g
YSBWQ1MKdGFnLiBTb21lIHByb2plY3RzIHVzZSB0YWcgbmFtZXMgdGhhdCBp
bmNsdWRlIG1vcmUgdGhhbiBqdXN0IHRoZSB2ZXJzaW9uCnN0cmluZyAoZS5n
LiAibXlwcm9qZWN0LTEuMiIgaW5zdGVhZCBvZiBqdXN0ICIxLjIiKSwgaW4g
d2hpY2ggY2FzZSB0aGUgdG9vbApuZWVkcyB0byBzdHJpcCB0aGUgdGFnIHBy
ZWZpeCB0byBleHRyYWN0IHRoZSB2ZXJzaW9uIGlkZW50aWZpZXIuIEZvcgp1
bnJlbGVhc2VkIHNvZnR3YXJlIChiZXR3ZWVuIHRhZ3MpLCB0aGUgdmVyc2lv
biBpZGVudGlmaWVyIHNob3VsZCBwcm92aWRlCmVub3VnaCBpbmZvcm1hdGlv
biB0byBoZWxwIGRldmVsb3BlcnMgcmVjcmVhdGUgdGhlIHNhbWUgdHJlZSwg
d2hpbGUgYWxzbwpnaXZpbmcgdGhlbSBhbiBpZGVhIG9mIHJvdWdobHkgaG93
IG9sZCB0aGUgdHJlZSBpcyAoYWZ0ZXIgdmVyc2lvbiAxLjIsIGJlZm9yZQp2
ZXJzaW9uIDEuMykuIE1hbnkgVkNTIHN5c3RlbXMgY2FuIHJlcG9ydCBhIGRl
c2NyaXB0aW9uIHRoYXQgY2FwdHVyZXMgdGhpcywKZm9yIGV4YW1wbGUgYGdp
dCBkZXNjcmliZSAtLXRhZ3MgLS1kaXJ0eSAtLWFsd2F5c2AgcmVwb3J0cyB0
aGluZ3MgbGlrZQoiMC43LTEtZzU3NGFiOTgtZGlydHkiIHRvIGluZGljYXRl
IHRoYXQgdGhlIGNoZWNrb3V0IGlzIG9uZSByZXZpc2lvbiBwYXN0IHRoZQow
LjcgdGFnLCBoYXMgYSB1bmlxdWUgcmV2aXNpb24gaWQgb2YgIjU3NGFiOTgi
LCBhbmQgaXMgImRpcnR5IiAoaXQgaGFzCnVuY29tbWl0dGVkIGNoYW5nZXMu
CgpUaGUgdmVyc2lvbiBpZGVudGlmaWVyIGlzIHVzZWQgZm9yIG11bHRpcGxl
IHB1cnBvc2VzOgoKKiB0byBhbGxvdyB0aGUgbW9kdWxlIHRvIHNlbGYtaWRl
bnRpZnkgaXRzIHZlcnNpb246IGBteXByb2plY3QuX192ZXJzaW9uX19gCiog
dG8gY2hvb3NlIGEgbmFtZSBhbmQgcHJlZml4IGZvciBhICdzZXR1cC5weSBz
ZGlzdCcgdGFyYmFsbAoKIyMgVGhlb3J5IG9mIE9wZXJhdGlvbgoKVmVyc2lv
bmVlciB3b3JrcyBieSBhZGRpbmcgYSBzcGVjaWFsIGBfdmVyc2lvbi5weWAg
ZmlsZSBpbnRvIHlvdXIgc291cmNlCnRyZWUsIHdoZXJlIHlvdXIgYF9faW5p
dF9fLnB5YCBjYW4gaW1wb3J0IGl0LiBUaGlzIGBfdmVyc2lvbi5weWAga25v
d3MgaG93IHRvCmR5bmFtaWNhbGx5IGFzayB0aGUgVkNTIHRvb2wgZm9yIHZl
cnNpb24gaW5mb3JtYXRpb24gYXQgaW1wb3J0IHRpbWUuCgpgX3ZlcnNpb24u
cHlgIGFsc28gY29udGFpbnMgYCRSZXZpc2lvbiRgIG1hcmtlcnMsIGFuZCB0
aGUgaW5zdGFsbGF0aW9uCnByb2Nlc3MgbWFya3MgYF92ZXJzaW9uLnB5YCB0
byBoYXZlIHRoaXMgbWFya2VyIHJld3JpdHRlbiB3aXRoIGEgdGFnIG5hbWUK
ZHVyaW5nIHRoZSBgZ2l0IGFyY2hpdmVgIGNvbW1hbmQuIEFzIGEgcmVzdWx0
LCBnZW5lcmF0ZWQgdGFyYmFsbHMgd2lsbApjb250YWluIGVub3VnaCBpbmZv
cm1hdGlvbiB0byBnZXQgdGhlIHByb3BlciB2ZXJzaW9uLgoKVG8gYWxsb3cg
YHNldHVwLnB5YCB0byBjb21wdXRlIGEgdmVyc2lvbiB0b28sIGEgYHZlcnNp
b25lZXIucHlgIGlzIGFkZGVkIHRvCnRoZSB0b3AgbGV2ZWwgb2YgeW91ciBz
b3VyY2UgdHJlZSwgbmV4dCB0byBgc2V0dXAucHlgIGFuZCB0aGUgYHNldHVw
LmNmZ2AKdGhhdCBjb25maWd1cmVzIGl0LiBUaGlzIG92ZXJyaWRlcyBzZXZl
cmFsIGRpc3R1dGlscy9zZXR1cHRvb2xzIGNvbW1hbmRzIHRvCmNvbXB1dGUg
dGhlIHZlcnNpb24gd2hlbiBpbnZva2VkLCBhbmQgY2hhbmdlcyBgc2V0dXAu
cHkgYnVpbGRgIGFuZCBgc2V0dXAucHkKc2Rpc3RgIHRvIHJlcGxhY2UgYF92
ZXJzaW9uLnB5YCB3aXRoIGEgc21hbGwgc3RhdGljIGZpbGUgdGhhdCBjb250
YWlucyBqdXN0CnRoZSBnZW5lcmF0ZWQgdmVyc2lvbiBkYXRhLgoKIyMgSW5z
dGFsbGF0aW9uCgpGaXJzdCwgZGVjaWRlIG9uIHZhbHVlcyBmb3IgdGhlIGZv
bGxvd2luZyBjb25maWd1cmF0aW9uIHZhcmlhYmxlczoKCiogYFZDU2A6IHRo
ZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtIHlvdSB1c2UuIEN1cnJlbnRseSBh
Y2NlcHRzICJnaXQiLgoKKiBgc3R5bGVgOiB0aGUgc3R5bGUgb2YgdmVyc2lv
biBzdHJpbmcgdG8gYmUgcHJvZHVjZWQuIFNlZSAiU3R5bGVzIiBiZWxvdyBm
b3IKICBkZXRhaWxzLiBEZWZhdWx0cyB0byAicGVwNDQwIiwgd2hpY2ggbG9v
a3MgbGlrZQogIGBUQUdbK0RJU1RBTkNFLmdTSE9SVEhBU0hbLmRpcnR5XV1g
LgoKKiBgdmVyc2lvbmZpbGVfc291cmNlYDoKCiAgQSBwcm9qZWN0LXJlbGF0
aXZlIHBhdGhuYW1lIGludG8gd2hpY2ggdGhlIGdlbmVyYXRlZCB2ZXJzaW9u
IHN0cmluZ3Mgc2hvdWxkCiAgYmUgd3JpdHRlbi4gVGhpcyBpcyB1c3VhbGx5
IGEgYF92ZXJzaW9uLnB5YCBuZXh0IHRvIHlvdXIgcHJvamVjdCdzIG1haW4K
ICBgX19pbml0X18ucHlgIGZpbGUsIHNvIGl0IGNhbiBiZSBpbXBvcnRlZCBh
dCBydW50aW1lLiBJZiB5b3VyIHByb2plY3QgdXNlcwogIGBzcmMvbXlwcm9q
ZWN0L19faW5pdF9fLnB5YCwgdGhpcyBzaG91bGQgYmUgYHNyYy9teXByb2pl
Y3QvX3ZlcnNpb24ucHlgLgogIFRoaXMgZmlsZSBzaG91bGQgYmUgY2hlY2tl
ZCBpbiB0byB5b3VyIFZDUyBhcyB1c3VhbDogdGhlIGNvcHkgY3JlYXRlZCBi
ZWxvdwogIGJ5IGBzZXR1cC5weSBzZXR1cF92ZXJzaW9uZWVyYCB3aWxsIGlu
Y2x1ZGUgY29kZSB0aGF0IHBhcnNlcyBleHBhbmRlZCBWQ1MKICBrZXl3b3Jk
cyBpbiBnZW5lcmF0ZWQgdGFyYmFsbHMuIFRoZSAnYnVpbGQnIGFuZCAnc2Rp
c3QnIGNvbW1hbmRzIHdpbGwKICByZXBsYWNlIGl0IHdpdGggYSBjb3B5IHRo
YXQgaGFzIGp1c3QgdGhlIGNhbGN1bGF0ZWQgdmVyc2lvbiBzdHJpbmcuCgog
IFRoaXMgbXVzdCBiZSBzZXQgZXZlbiBpZiB5b3VyIHByb2plY3QgZG9lcyBu
b3QgaGF2ZSBhbnkgbW9kdWxlcyAoYW5kIHdpbGwKICB0aGVyZWZvcmUgbmV2
ZXIgaW1wb3J0IGBfdmVyc2lvbi5weWApLCBzaW5jZSAic2V0dXAucHkgc2Rp
c3QiIC1iYXNlZCB0cmVlcwogIHN0aWxsIG5lZWQgc29tZXdoZXJlIHRvIHJl
Y29yZCB0aGUgcHJlLWNhbGN1bGF0ZWQgdmVyc2lvbiBzdHJpbmdzLiBBbnl3
aGVyZQogIGluIHRoZSBzb3VyY2UgdHJlZSBzaG91bGQgZG8uIElmIHRoZXJl
IGlzIGEgYF9faW5pdF9fLnB5YCBuZXh0IHRvIHlvdXIKICBgX3ZlcnNpb24u
cHlgLCB0aGUgYHNldHVwLnB5IHNldHVwX3ZlcnNpb25lZXJgIGNvbW1hbmQg
KGRlc2NyaWJlZCBiZWxvdykKICB3aWxsIGFwcGVuZCBzb21lIGBfX3ZlcnNp
b25fX2Atc2V0dGluZyBhc3NpZ25tZW50cywgaWYgdGhleSBhcmVuJ3QgYWxy
ZWFkeQogIHByZXNlbnQuCgoqIGB2ZXJzaW9uZmlsZV9idWlsZGA6CgogIExp
a2UgYHZlcnNpb25maWxlX3NvdXJjZWAsIGJ1dCByZWxhdGl2ZSB0byB0aGUg
YnVpbGQgZGlyZWN0b3J5IGluc3RlYWQgb2YKICB0aGUgc291cmNlIGRpcmVj
dG9yeS4gVGhlc2Ugd2lsbCBkaWZmZXIgd2hlbiB5b3VyIHNldHVwLnB5IHVz
ZXMKICAncGFja2FnZV9kaXI9Jy4gSWYgeW91IGhhdmUgYHBhY2thZ2VfZGly
PXsnbXlwcm9qZWN0JzogJ3NyYy9teXByb2plY3QnfWAsCiAgdGhlbiB5b3Ug
d2lsbCBwcm9iYWJseSBoYXZlIGB2ZXJzaW9uZmlsZV9idWlsZD0nbXlwcm9q
ZWN0L192ZXJzaW9uLnB5J2AgYW5kCiAgYHZlcnNpb25maWxlX3NvdXJjZT0n
c3JjL215cHJvamVjdC9fdmVyc2lvbi5weSdgLgoKICBJZiB0aGlzIGlzIHNl
dCB0byBOb25lLCB0aGVuIGBzZXR1cC5weSBidWlsZGAgd2lsbCBub3QgYXR0
ZW1wdCB0byByZXdyaXRlCiAgYW55IGBfdmVyc2lvbi5weWAgaW4gdGhlIGJ1
aWx0IHRyZWUuIElmIHlvdXIgcHJvamVjdCBkb2VzIG5vdCBoYXZlIGFueQog
IGxpYnJhcmllcyAoZS5nLiBpZiBpdCBvbmx5IGJ1aWxkcyBhIHNjcmlwdCks
IHRoZW4geW91IHNob3VsZCB1c2UKICBgdmVyc2lvbmZpbGVfYnVpbGQgPSBO
b25lYCBhbmQgb3ZlcnJpZGUgYGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX3Nj
cmlwdHNgCiAgdG8gZXhwbGljaXRseSBpbnNlcnQgYSBjb3B5IG9mIGB2ZXJz
aW9uZWVyLmdldF92ZXJzaW9uKClgIGludG8geW91cgogIGdlbmVyYXRlZCBz
Y3JpcHQuCgoqIGB0YWdfcHJlZml4YDoKCiAgYSBzdHJpbmcsIGxpa2UgJ1BS
T0pFQ1ROQU1FLScsIHdoaWNoIGFwcGVhcnMgYXQgdGhlIHN0YXJ0IG9mIGFs
bCBWQ1MgdGFncy4KICBJZiB5b3VyIHRhZ3MgbG9vayBsaWtlICdteXByb2pl
Y3QtMS4yLjAnLCB0aGVuIHlvdSBzaG91bGQgdXNlCiAgdGFnX3ByZWZpeD0n
bXlwcm9qZWN0LScuIElmIHlvdSB1c2UgdW5wcmVmaXhlZCB0YWdzIGxpa2Ug
JzEuMi4wJywgdGhpcwogIHNob3VsZCBiZSBhbiBlbXB0eSBzdHJpbmcuCgoq
IGBwYXJlbnRkaXJfcHJlZml4YDoKCiAgYSBvcHRpb25hbCBzdHJpbmcsIGZy
ZXF1ZW50bHkgdGhlIHNhbWUgYXMgdGFnX3ByZWZpeCwgd2hpY2ggYXBwZWFy
cyBhdCB0aGUKICBzdGFydCBvZiBhbGwgdW5wYWNrZWQgdGFyYmFsbCBmaWxl
bmFtZXMuIElmIHlvdXIgdGFyYmFsbCB1bnBhY2tzIGludG8KICAnbXlwcm9q
ZWN0LTEuMi4wJywgdGhpcyBzaG91bGQgYmUgJ215cHJvamVjdC0nLiBUbyBk
aXNhYmxlIHRoaXMgZmVhdHVyZSwKICBqdXN0IG9taXQgdGhlIGZpZWxkIGZy
b20geW91ciBgc2V0dXAuY2ZnYC4KClRoaXMgdG9vbCBwcm92aWRlcyBvbmUg
c2NyaXB0LCBuYW1lZCBgdmVyc2lvbmVlcmAuIFRoYXQgc2NyaXB0IGhhcyBv
bmUgbW9kZSwKImluc3RhbGwiLCB3aGljaCB3cml0ZXMgYSBjb3B5IG9mIGB2
ZXJzaW9uZWVyLnB5YCBpbnRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeQphbmQg
cnVucyBgdmVyc2lvbmVlci5weSBzZXR1cGAgdG8gZmluaXNoIHRoZSBpbnN0
YWxsYXRpb24uCgpUbyB2ZXJzaW9uZWVyLWVuYWJsZSB5b3VyIHByb2plY3Q6
CgoqIDE6IE1vZGlmeSB5b3VyIGBzZXR1cC5jZmdgLCBhZGRpbmcgYSBzZWN0
aW9uIG5hbWVkIGBbdmVyc2lvbmVlcl1gIGFuZAogIHBvcHVsYXRpbmcgaXQg
d2l0aCB0aGUgY29uZmlndXJhdGlvbiB2YWx1ZXMgeW91IGRlY2lkZWQgZWFy
bGllciAobm90ZSB0aGF0CiAgdGhlIG9wdGlvbiBuYW1lcyBhcmUgbm90IGNh
c2Utc2Vuc2l0aXZlKToKCiAgYGBgYAogIFt2ZXJzaW9uZWVyXQogIFZDUyA9
IGdpdAogIHN0eWxlID0gcGVwNDQwCiAgdmVyc2lvbmZpbGVfc291cmNlID0g
c3JjL215cHJvamVjdC9fdmVyc2lvbi5weQogIHZlcnNpb25maWxlX2J1aWxk
ID0gbXlwcm9qZWN0L192ZXJzaW9uLnB5CiAgdGFnX3ByZWZpeCA9ICIiCiAg
cGFyZW50ZGlyX3ByZWZpeCA9IG15cHJvamVjdC0KICBgYGBgCgoqIDI6IFJ1
biBgdmVyc2lvbmVlciBpbnN0YWxsYC4gVGhpcyB3aWxsIGRvIHRoZSBmb2xs
b3dpbmc6CgogICogY29weSBgdmVyc2lvbmVlci5weWAgaW50byB0aGUgdG9w
IG9mIHlvdXIgc291cmNlIHRyZWUKICAqIGNyZWF0ZSBgX3ZlcnNpb24ucHlg
IGluIHRoZSByaWdodCBwbGFjZSAoYHZlcnNpb25maWxlX3NvdXJjZWApCiAg
KiBtb2RpZnkgeW91ciBgX19pbml0X18ucHlgIChpZiBvbmUgZXhpc3RzIG5l
eHQgdG8gYF92ZXJzaW9uLnB5YCkgdG8gZGVmaW5lCiAgICBgX192ZXJzaW9u
X19gIChieSBjYWxsaW5nIGEgZnVuY3Rpb24gZnJvbSBgX3ZlcnNpb24ucHlg
KQogICogbW9kaWZ5IHlvdXIgYE1BTklGRVNULmluYCB0byBpbmNsdWRlIGJv
dGggYHZlcnNpb25lZXIucHlgIGFuZCB0aGUKICAgIGdlbmVyYXRlZCBgX3Zl
cnNpb24ucHlgIGluIHNkaXN0IHRhcmJhbGxzCgogIGB2ZXJzaW9uZWVyIGlu
c3RhbGxgIHdpbGwgY29tcGxhaW4gYWJvdXQgYW55IHByb2JsZW1zIGl0IGZp
bmRzIHdpdGggeW91cgogIGBzZXR1cC5weWAgb3IgYHNldHVwLmNmZ2AuIFJ1
biBpdCBtdWx0aXBsZSB0aW1lcyB1bnRpbCB5b3UgaGF2ZSBmaXhlZCBhbGwK
ICB0aGUgcHJvYmxlbXMuCgoqIDM6IGFkZCBhIGBpbXBvcnQgdmVyc2lvbmVl
cmAgdG8geW91ciBzZXR1cC5weSwgYW5kIGFkZCB0aGUgZm9sbG93aW5nCiAg
YXJndW1lbnRzIHRvIHRoZSBzZXR1cCgpIGNhbGw6CgogICAgICAgIHZlcnNp
b249dmVyc2lvbmVlci5nZXRfdmVyc2lvbigpLAogICAgICAgIGNtZGNsYXNz
PXZlcnNpb25lZXIuZ2V0X2NtZGNsYXNzKCksCgoqIDQ6IGNvbW1pdCB0aGVz
ZSBjaGFuZ2VzIHRvIHlvdXIgVkNTLiBUbyBtYWtlIHN1cmUgeW91IHdvbid0
IGZvcmdldCwKICBgdmVyc2lvbmVlciBpbnN0YWxsYCB3aWxsIG1hcmsgZXZl
cnl0aGluZyBpdCB0b3VjaGVkIGZvciBhZGRpdGlvbiB1c2luZwogIGBnaXQg
YWRkYC4gRG9uJ3QgZm9yZ2V0IHRvIGFkZCBgc2V0dXAucHlgIGFuZCBgc2V0
dXAuY2ZnYCB0b28uCgojIyBQb3N0LUluc3RhbGxhdGlvbiBVc2FnZQoKT25j
ZSBlc3RhYmxpc2hlZCwgYWxsIHVzZXMgb2YgeW91ciB0cmVlIGZyb20gYSBW
Q1MgY2hlY2tvdXQgc2hvdWxkIGdldCB0aGUKY3VycmVudCB2ZXJzaW9uIHN0
cmluZy4gQWxsIGdlbmVyYXRlZCB0YXJiYWxscyBzaG91bGQgaW5jbHVkZSBh
biBlbWJlZGRlZAp2ZXJzaW9uIHN0cmluZyAoc28gdXNlcnMgd2hvIHVucGFj
ayB0aGVtIHdpbGwgbm90IG5lZWQgYSBWQ1MgdG9vbCBpbnN0YWxsZWQpLgoK
SWYgeW91IGRpc3RyaWJ1dGUgeW91ciBwcm9qZWN0IHRocm91Z2ggUHlQSSwg
dGhlbiB0aGUgcmVsZWFzZSBwcm9jZXNzIHNob3VsZApib2lsIGRvd24gdG8g
dHdvIHN0ZXBzOgoKKiAxOiBnaXQgdGFnIDEuMAoqIDI6IHB5dGhvbiBzZXR1
cC5weSByZWdpc3RlciBzZGlzdCB1cGxvYWQKCklmIHlvdSBkaXN0cmlidXRl
IGl0IHRocm91Z2ggZ2l0aHViIChpLmUuIHVzZXJzIHVzZSBnaXRodWIgdG8g
Z2VuZXJhdGUKdGFyYmFsbHMgd2l0aCBgZ2l0IGFyY2hpdmVgKSwgdGhlIHBy
b2Nlc3MgaXM6CgoqIDE6IGdpdCB0YWcgMS4wCiogMjogZ2l0IHB1c2g7IGdp
dCBwdXNoIC0tdGFncwoKVmVyc2lvbmVlciB3aWxsIHJlcG9ydCAiMCt1bnRh
Z2dlZC5OVU1DT01NSVRTLmdIQVNIIiB1bnRpbCB5b3VyIHRyZWUgaGFzIGF0
CmxlYXN0IG9uZSB0YWcgaW4gaXRzIGhpc3RvcnkuCgojIyBWZXJzaW9uLVN0
cmluZyBGbGF2b3JzCgpDb2RlIHdoaWNoIHVzZXMgVmVyc2lvbmVlciBjYW4g
bGVhcm4gYWJvdXQgaXRzIHZlcnNpb24gc3RyaW5nIGF0IHJ1bnRpbWUgYnkK
aW1wb3J0aW5nIGBfdmVyc2lvbmAgZnJvbSB5b3VyIG1haW4gYF9faW5pdF9f
LnB5YCBmaWxlIGFuZCBydW5uaW5nIHRoZQpgZ2V0X3ZlcnNpb25zKClgIGZ1
bmN0aW9uLiBGcm9tIHRoZSAib3V0c2lkZSIgKGUuZy4gaW4gYHNldHVwLnB5
YCksIHlvdSBjYW4KaW1wb3J0IHRoZSB0b3AtbGV2ZWwgYHZlcnNpb25lZXIu
cHlgIGFuZCBydW4gYGdldF92ZXJzaW9ucygpYC4KCkJvdGggZnVuY3Rpb25z
IHJldHVybiBhIGRpY3Rpb25hcnkgd2l0aCBkaWZmZXJlbnQgZmxhdm9ycyBv
ZiB2ZXJzaW9uCmluZm9ybWF0aW9uOgoKKiBgWyd2ZXJzaW9uJ11gOiBBIGNv
bmRlbnNlZCB2ZXJzaW9uIHN0cmluZywgcmVuZGVyZWQgdXNpbmcgdGhlIHNl
bGVjdGVkCiAgc3R5bGUuIFRoaXMgaXMgdGhlIG1vc3QgY29tbW9ubHkgdXNl
ZCB2YWx1ZSBmb3IgdGhlIHByb2plY3QncyB2ZXJzaW9uCiAgc3RyaW5nLiBU
aGUgZGVmYXVsdCAicGVwNDQwIiBzdHlsZSB5aWVsZHMgc3RyaW5ncyBsaWtl
IGAwLjExYCwKICBgMC4xMSsyLmcxMDc2Yzk3YCwgb3IgYDAuMTErMi5nMTA3
NmM5Ny5kaXJ0eWAuIFNlZSB0aGUgIlN0eWxlcyIgc2VjdGlvbgogIGJlbG93
IGZvciBhbHRlcm5hdGl2ZSBzdHlsZXMuCgoqIGBbJ2Z1bGwtcmV2aXNpb25p
ZCddYDogZGV0YWlsZWQgcmV2aXNpb24gaWRlbnRpZmllci4gRm9yIEdpdCwg
dGhpcyBpcyB0aGUKICBmdWxsIFNIQTEgY29tbWl0IGlkLCBlLmcuICIxMDc2
Yzk3OGE4ZDNjZmM3MGY0MDhmZTU5NzRhYTZjMDkyYzk0OWFjIi4KCiogYFsn
ZGlydHknXWA6IGEgYm9vbGVhbiwgVHJ1ZSBpZiB0aGUgdHJlZSBoYXMgdW5j
b21taXR0ZWQgY2hhbmdlcy4gTm90ZSB0aGF0CiAgdGhpcyBpcyBvbmx5IGFj
Y3VyYXRlIGlmIHJ1biBpbiBhIFZDUyBjaGVja291dCwgb3RoZXJ3aXNlIGl0
IGlzIGxpa2VseSB0bwogIGJlIEZhbHNlIG9yIE5vbmUKCiogYFsnZXJyb3In
XWA6IGlmIHRoZSB2ZXJzaW9uIHN0cmluZyBjb3VsZCBub3QgYmUgY29tcHV0
ZWQsIHRoaXMgd2lsbCBiZSBzZXQKICB0byBhIHN0cmluZyBkZXNjcmliaW5n
IHRoZSBwcm9ibGVtLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBOb25lLiBJdCBt
YXkgYmUKICB1c2VmdWwgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGluIHNldHVw
LnB5IGlmIHRoaXMgaXMgc2V0LCB0byBhdm9pZCBlLmcuCiAgY3JlYXRpbmcg
dGFyYmFsbHMgd2l0aCBhIHZlcnNpb24gc3RyaW5nIG9mICJ1bmtub3duIi4K
ClNvbWUgdmFyaWFudHMgYXJlIG1vcmUgdXNlZnVsIHRoYW4gb3RoZXJzLiBJ
bmNsdWRpbmcgYGZ1bGwtcmV2aXNpb25pZGAgaW4gYQpidWcgcmVwb3J0IHNo
b3VsZCBhbGxvdyBkZXZlbG9wZXJzIHRvIHJlY29uc3RydWN0IHRoZSBleGFj
dCBjb2RlIGJlaW5nIHRlc3RlZAoob3IgaW5kaWNhdGUgdGhlIHByZXNlbmNl
IG9mIGxvY2FsIGNoYW5nZXMgdGhhdCBzaG91bGQgYmUgc2hhcmVkIHdpdGgg
dGhlCmRldmVsb3BlcnMpLiBgdmVyc2lvbmAgaXMgc3VpdGFibGUgZm9yIGRp
c3BsYXkgaW4gYW4gImFib3V0IiBib3ggb3IgYSBDTEkKYC0tdmVyc2lvbmAg
b3V0cHV0OiBpdCBjYW4gYmUgZWFzaWx5IGNvbXBhcmVkIGFnYWluc3QgcmVs
ZWFzZSBub3RlcyBhbmQgbGlzdHMKb2YgYnVncyBmaXhlZCBpbiB2YXJpb3Vz
IHJlbGVhc2VzLgoKVGhlIGluc3RhbGxlciBhZGRzIHRoZSBmb2xsb3dpbmcg
dGV4dCB0byB5b3VyIGBfX2luaXRfXy5weWAgdG8gcGxhY2UgYSBiYXNpYwp2
ZXJzaW9uIGluIGBZT1VSUFJPSkVDVC5fX3ZlcnNpb25fX2A6CgogICAgZnJv
bSAuX3ZlcnNpb24gaW1wb3J0IGdldF92ZXJzaW9ucwogICAgX192ZXJzaW9u
X18gPSBnZXRfdmVyc2lvbnMoKVsndmVyc2lvbiddCiAgICBkZWwgZ2V0X3Zl
cnNpb25zCgojIyBTdHlsZXMKClRoZSBzZXR1cC5jZmcgYHN0eWxlPWAgY29u
ZmlndXJhdGlvbiBjb250cm9scyBob3cgdGhlIFZDUyBpbmZvcm1hdGlvbiBp
cwpyZW5kZXJlZCBpbnRvIGEgdmVyc2lvbiBzdHJpbmcuCgpUaGUgZGVmYXVs
dCBzdHlsZSwgInBlcDQ0MCIsIHByb2R1Y2VzIGEgUEVQNDQwLWNvbXBsaWFu
dCBzdHJpbmcsIGVxdWFsIHRvIHRoZQp1bi1wcmVmaXhlZCB0YWcgbmFtZSBm
b3IgYWN0dWFsIHJlbGVhc2VzLCBhbmQgY29udGFpbmluZyBhbiBhZGRpdGlv
bmFsICJsb2NhbAp2ZXJzaW9uIiBzZWN0aW9uIHdpdGggbW9yZSBkZXRhaWwg
Zm9yIGluLWJldHdlZW4gYnVpbGRzLiBGb3IgR2l0LCB0aGlzIGlzClRBR1sr
RElTVEFOQ0UuZ0hFWFsuZGlydHldXSAsIHVzaW5nIGluZm9ybWF0aW9uIGZy
b20gYGdpdCBkZXNjcmliZSAtLXRhZ3MKLS1kaXJ0eSAtLWFsd2F5c2AuIEZv
ciBleGFtcGxlICIwLjExKzIuZzEwNzZjOTcuZGlydHkiIGluZGljYXRlcyB0
aGF0IHRoZQp0cmVlIGlzIGxpa2UgdGhlICIxMDc2Yzk3IiBjb21taXQgYnV0
IGhhcyB1bmNvbW1pdHRlZCBjaGFuZ2VzICgiLmRpcnR5IiksIGFuZAp0aGF0
IHRoaXMgY29tbWl0IGlzIHR3byByZXZpc2lvbnMgKCIrMiIpIGJleW9uZCB0
aGUgIjAuMTEiIHRhZy4gRm9yIHJlbGVhc2VkCnNvZnR3YXJlIChleGFjdGx5
IGVxdWFsIHRvIGEga25vd24gdGFnKSwgdGhlIGlkZW50aWZpZXIgd2lsbCBv
bmx5IGNvbnRhaW4gdGhlCnN0cmlwcGVkIHRhZywgZS5nLiAiMC4xMSIuCgpP
dGhlciBzdHlsZXMgYXJlIGF2YWlsYWJsZS4gU2VlIGRldGFpbHMubWQgaW4g
dGhlIFZlcnNpb25lZXIgc291cmNlIHRyZWUgZm9yCmRlc2NyaXB0aW9ucy4K
CiMjIERlYnVnZ2luZwoKVmVyc2lvbmVlciB0cmllcyB0byBhdm9pZCBmYXRh
bCBlcnJvcnM6IGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLCBpdCB3aWxsIHRl
bmQKdG8gcmV0dXJuIGEgdmVyc2lvbiBvZiAiMCt1bmtub3duIi4gVG8gaW52
ZXN0aWdhdGUgdGhlIHByb2JsZW0sIHJ1biBgc2V0dXAucHkKdmVyc2lvbmAs
IHdoaWNoIHdpbGwgcnVuIHRoZSB2ZXJzaW9uLWxvb2t1cCBjb2RlIGluIGEg
dmVyYm9zZSBtb2RlLCBhbmQgd2lsbApkaXNwbGF5IHRoZSBmdWxsIGNvbnRl
bnRzIG9mIGBnZXRfdmVyc2lvbnMoKWAgKGluY2x1ZGluZyB0aGUgYGVycm9y
YCBzdHJpbmcsCndoaWNoIG1heSBoZWxwIGlkZW50aWZ5IHdoYXQgd2VudCB3
cm9uZykuCgojIyBVcGRhdGluZyBWZXJzaW9uZWVyCgpUbyB1cGdyYWRlIHlv
dXIgcHJvamVjdCB0byBhIG5ldyByZWxlYXNlIG9mIFZlcnNpb25lZXIsIGRv
IHRoZSBmb2xsb3dpbmc6CgoqIGluc3RhbGwgdGhlIG5ldyBWZXJzaW9uZWVy
IChgcGlwIGluc3RhbGwgLVUgdmVyc2lvbmVlcmAgb3IgZXF1aXZhbGVudCkK
KiBlZGl0IGBzZXR1cC5jZmdgLCBpZiBuZWNlc3NhcnksIHRvIGluY2x1ZGUg
YW55IG5ldyBjb25maWd1cmF0aW9uIHNldHRpbmdzCiAgaW5kaWNhdGVkIGJ5
IHRoZSByZWxlYXNlIG5vdGVzCiogcmUtcnVuIGB2ZXJzaW9uZWVyIGluc3Rh
bGxgIGluIHlvdXIgc291cmNlIHRyZWUsIHRvIHJlcGxhY2UKICBgU1JDL192
ZXJzaW9uLnB5YAoqIGNvbW1pdCBhbnkgY2hhbmdlZCBmaWxlcwoKIyMjIFVw
Z3JhZGluZyB0byAwLjE1CgpTdGFydGluZyB3aXRoIHRoaXMgdmVyc2lvbiwg
VmVyc2lvbmVlciBpcyBjb25maWd1cmVkIHdpdGggYSBgW3ZlcnNpb25lZXJd
YApzZWN0aW9uIGluIHlvdXIgYHNldHVwLmNmZ2AgZmlsZS4gRWFybGllciB2
ZXJzaW9ucyByZXF1aXJlZCB0aGUgYHNldHVwLnB5YCB0bwpzZXQgYXR0cmli
dXRlcyBvbiB0aGUgYHZlcnNpb25lZXJgIG1vZHVsZSBpbW1lZGlhdGVseSBh
ZnRlciBpbXBvcnQuIFRoZSBuZXcKdmVyc2lvbiB3aWxsIHJlZnVzZSB0byBy
dW4gKHJhaXNpbmcgYW4gZXhjZXB0aW9uIGR1cmluZyBpbXBvcnQpIHVudGls
IHlvdQpoYXZlIHByb3ZpZGVkIHRoZSBuZWNlc3NhcnkgYHNldHVwLmNmZ2Ag
c2VjdGlvbi4KCkluIGFkZGl0aW9uLCB0aGUgVmVyc2lvbmVlciBwYWNrYWdl
IHByb3ZpZGVzIGFuIGV4ZWN1dGFibGUgbmFtZWQKYHZlcnNpb25lZXJgLCBh
bmQgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzIGlzIGRyaXZlbiBieSBydW5u
aW5nIGB2ZXJzaW9uZWVyCmluc3RhbGxgLiBJbiAwLjE0IGFuZCBlYXJsaWVy
LCB0aGUgZXhlY3V0YWJsZSB3YXMgbmFtZWQKYHZlcnNpb25lZXItaW5zdGFs
bGVyYCBhbmQgd2FzIHJ1biB3aXRob3V0IGFuIGFyZ3VtZW50LgoKIyMjIFVw
Z3JhZGluZyB0byAwLjE0CgowLjE0IGNoYW5nZXMgdGhlIGZvcm1hdCBvZiB0
aGUgdmVyc2lvbiBzdHJpbmcuIDAuMTMgYW5kIGVhcmxpZXIgdXNlZApoeXBo
ZW4tc2VwYXJhdGVkIHN0cmluZ3MgbGlrZSAiMC4xMS0yLWcxMDc2Yzk3LWRp
cnR5Ii4gMC4xNCBhbmQgYmV5b25kIHVzZSBhCnBsdXMtc2VwYXJhdGVkICJs
b2NhbCB2ZXJzaW9uIiBzZWN0aW9uIHN0cmluZ3MsIHdpdGggZG90LXNlcGFy
YXRlZApjb21wb25lbnRzLCBsaWtlICIwLjExKzIuZzEwNzZjOTciLiBQRVA0
NDAtc3RyaWN0IHRvb2xzIGRpZCBub3QgbGlrZSB0aGUgb2xkCmZvcm1hdCwg
YnV0IHNob3VsZCBiZSBvayB3aXRoIHRoZSBuZXcgb25lLgoKIyMjIFVwZ3Jh
ZGluZyBmcm9tIDAuMTEgdG8gMC4xMgoKTm90aGluZyBzcGVjaWFsLgoKIyMj
IFVwZ3JhZGluZyBmcm9tIDAuMTAgdG8gMC4xMQoKWW91IG11c3QgYWRkIGEg
YHZlcnNpb25lZXIuVkNTID0gImdpdCJgIHRvIHlvdXIgYHNldHVwLnB5YCBi
ZWZvcmUgcmUtcnVubmluZwpgc2V0dXAucHkgc2V0dXBfdmVyc2lvbmVlcmAu
IFRoaXMgd2lsbCBlbmFibGUgdGhlIHVzZSBvZiBhZGRpdGlvbmFsCnZlcnNp
b24tY29udHJvbCBzeXN0ZW1zIChTVk4sIGV0YykgaW4gdGhlIGZ1dHVyZS4K
CiMjIEZ1dHVyZSBEaXJlY3Rpb25zCgpUaGlzIHRvb2wgaXMgZGVzaWduZWQg
dG8gbWFrZSBpdCBlYXNpbHkgZXh0ZW5kZWQgdG8gb3RoZXIgdmVyc2lvbi1j
b250cm9sCnN5c3RlbXM6IGFsbCBWQ1Mtc3BlY2lmaWMgY29tcG9uZW50cyBh
cmUgaW4gc2VwYXJhdGUgZGlyZWN0b3JpZXMgbGlrZQpzcmMvZ2l0LyAuIFRo
ZSB0b3AtbGV2ZWwgYHZlcnNpb25lZXIucHlgIHNjcmlwdCBpcyBhc3NlbWJs
ZWQgZnJvbSB0aGVzZQpjb21wb25lbnRzIGJ5IHJ1bm5pbmcgbWFrZS12ZXJz
aW9uZWVyLnB5IC4gSW4gdGhlIGZ1dHVyZSwgbWFrZS12ZXJzaW9uZWVyLnB5
CndpbGwgdGFrZSBhIFZDUyBuYW1lIGFzIGFuIGFyZ3VtZW50LCBhbmQgd2ls
bCBjb25zdHJ1Y3QgYSB2ZXJzaW9uIG9mCmB2ZXJzaW9uZWVyLnB5YCB0aGF0
IGlzIHNwZWNpZmljIHRvIHRoZSBnaXZlbiBWQ1MuIEl0IG1pZ2h0IGFsc28g
dGFrZSB0aGUKY29uZmlndXJhdGlvbiBhcmd1bWVudHMgdGhhdCBhcmUgY3Vy
cmVudGx5IHByb3ZpZGVkIG1hbnVhbGx5IGR1cmluZwppbnN0YWxsYXRpb24g
YnkgZWRpdGluZyBzZXR1cC5weSAuIEFsdGVybmF0aXZlbHksIGl0IG1pZ2h0
IGdvIHRoZSBvdGhlcgpkaXJlY3Rpb24gYW5kIGluY2x1ZGUgY29kZSBmcm9t
IGFsbCBzdXBwb3J0ZWQgVkNTIHN5c3RlbXMsIHJlZHVjaW5nIHRoZQpudW1i
ZXIgb2YgaW50ZXJtZWRpYXRlIHNjcmlwdHMuCgoKIyMgTGljZW5zZQoKVG8g
bWFrZSBWZXJzaW9uZWVyIGVhc2llciB0byBlbWJlZCwgYWxsIGl0cyBjb2Rl
IGlzIGhlcmVieSByZWxlYXNlZCBpbnRvIHRoZQpwdWJsaWMgZG9tYWluLiBU
aGUgYF92ZXJzaW9uLnB5YCB0aGF0IGl0IGNyZWF0ZXMgaXMgYWxzbyBpbiB0
aGUgcHVibGljCmRvbWFpbi4KCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9y
dCBwcmludF9mdW5jdGlvbgp0cnk6CiAgICBpbXBvcnQgY29uZmlncGFyc2Vy
CmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGltcG9ydCBDb25maWdQYXJzZXIg
YXMgY29uZmlncGFyc2VyCmltcG9ydCBlcnJubwppbXBvcnQganNvbgppbXBv
cnQgb3MKaW1wb3J0IHJlCmltcG9ydCBzdWJwcm9jZXNzCmltcG9ydCBzeXMK
CgpjbGFzcyBWZXJzaW9uZWVyQ29uZmlnOgogICAgcGFzcwoKCmRlZiBnZXRf
cm9vdCgpOgogICAgIyB3ZSByZXF1aXJlIHRoYXQgYWxsIGNvbW1hbmRzIGFy
ZSBydW4gZnJvbSB0aGUgcHJvamVjdCByb290LCBpLmUuIHRoZQogICAgIyBk
aXJlY3RvcnkgdGhhdCBjb250YWlucyBzZXR1cC5weSwgc2V0dXAuY2ZnLCBh
bmQgdmVyc2lvbmVlci5weSAuCiAgICByb290ID0gb3MucGF0aC5yZWFscGF0
aChvcy5wYXRoLmFic3BhdGgob3MuZ2V0Y3dkKCkpKQogICAgc2V0dXBfcHkg
PSBvcy5wYXRoLmpvaW4ocm9vdCwgInNldHVwLnB5IikKICAgIHZlcnNpb25l
ZXJfcHkgPSBvcy5wYXRoLmpvaW4ocm9vdCwgInZlcnNpb25lZXIucHkiKQog
ICAgaWYgbm90IChvcy5wYXRoLmV4aXN0cyhzZXR1cF9weSkgb3Igb3MucGF0
aC5leGlzdHModmVyc2lvbmVlcl9weSkpOgogICAgICAgICMgYWxsb3cgJ3B5
dGhvbiBwYXRoL3RvL3NldHVwLnB5IENPTU1BTkQnCiAgICAgICAgcm9vdCA9
IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLnJlYWxwYXRoKG9zLnBhdGguYWJz
cGF0aChzeXMuYXJndlswXSkpKQogICAgICAgIHNldHVwX3B5ID0gb3MucGF0
aC5qb2luKHJvb3QsICJzZXR1cC5weSIpCiAgICAgICAgdmVyc2lvbmVlcl9w
eSA9IG9zLnBhdGguam9pbihyb290LCAidmVyc2lvbmVlci5weSIpCiAgICBp
ZiBub3QgKG9zLnBhdGguZXhpc3RzKHNldHVwX3B5KSBvciBvcy5wYXRoLmV4
aXN0cyh2ZXJzaW9uZWVyX3B5KSk6CiAgICAgICAgZXJyID0gKCJWZXJzaW9u
ZWVyIHdhcyB1bmFibGUgdG8gcnVuIHRoZSBwcm9qZWN0IHJvb3QgZGlyZWN0
b3J5LiAiCiAgICAgICAgICAgICAgICJWZXJzaW9uZWVyIHJlcXVpcmVzIHNl
dHVwLnB5IHRvIGJlIGV4ZWN1dGVkIGZyb20gIgogICAgICAgICAgICAgICAi
aXRzIGltbWVkaWF0ZSBkaXJlY3RvcnkgKGxpa2UgJ3B5dGhvbiBzZXR1cC5w
eSBDT01NQU5EJyksICIKICAgICAgICAgICAgICAgIm9yIGluIGEgd2F5IHRo
YXQgbGV0cyBpdCB1c2Ugc3lzLmFyZ3ZbMF0gdG8gZmluZCB0aGUgcm9vdCAi
CiAgICAgICAgICAgICAgICIobGlrZSAncHl0aG9uIHBhdGgvdG8vc2V0dXAu
cHkgQ09NTUFORCcpLiIpCiAgICAgICAgcmFpc2UgVmVyc2lvbmVlckJhZFJv
b3RFcnJvcihlcnIpCiAgICB0cnk6CiAgICAgICAgIyBDZXJ0YWluIHJ1bnRp
bWUgd29ya2Zsb3dzIChzZXR1cC5weSBpbnN0YWxsL2RldmVsb3AgaW4gYSBz
ZXR1cHRvb2xzCiAgICAgICAgIyB0cmVlKSBleGVjdXRlIGFsbCBkZXBlbmRl
bmNpZXMgaW4gYSBzaW5nbGUgcHl0aG9uIHByb2Nlc3MsIHNvCiAgICAgICAg
IyAidmVyc2lvbmVlciIgbWF5IGJlIGltcG9ydGVkIG11bHRpcGxlIHRpbWVz
LCBhbmQgcHl0aG9uJ3Mgc2hhcmVkCiAgICAgICAgIyBtb2R1bGUtaW1wb3J0
IHRhYmxlIHdpbGwgY2FjaGUgdGhlIGZpcnN0IG9uZS4gU28gd2UgY2FuJ3Qg
dXNlCiAgICAgICAgIyBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCBhcyB0
aGF0IHdpbGwgZmluZCB3aGljaGV2ZXIKICAgICAgICAjIHZlcnNpb25lZXIu
cHkgd2FzIGZpcnN0IGltcG9ydGVkLCBldmVuIGluIGxhdGVyIHByb2plY3Rz
LgogICAgICAgIG1lID0gb3MucGF0aC5yZWFscGF0aChvcy5wYXRoLmFic3Bh
dGgoX19maWxlX18pKQogICAgICAgIGlmIG9zLnBhdGguc3BsaXRleHQobWUp
WzBdICE9IG9zLnBhdGguc3BsaXRleHQodmVyc2lvbmVlcl9weSlbMF06CiAg
ICAgICAgICAgIHByaW50KCJXYXJuaW5nOiBidWlsZCBpbiAlcyBpcyB1c2lu
ZyB2ZXJzaW9uZWVyLnB5IGZyb20gJXMiCiAgICAgICAgICAgICAgICAgICUg
KG9zLnBhdGguZGlybmFtZShtZSksIHZlcnNpb25lZXJfcHkpKQogICAgZXhj
ZXB0IE5hbWVFcnJvcjoKICAgICAgICBwYXNzCiAgICByZXR1cm4gcm9vdAoK
CmRlZiBnZXRfY29uZmlnX2Zyb21fcm9vdChyb290KToKICAgICMgVGhpcyBt
aWdodCByYWlzZSBFbnZpcm9ubWVudEVycm9yIChpZiBzZXR1cC5jZmcgaXMg
bWlzc2luZyksIG9yCiAgICAjIGNvbmZpZ3BhcnNlci5Ob1NlY3Rpb25FcnJv
ciAoaWYgaXQgbGFja3MgYSBbdmVyc2lvbmVlcl0gc2VjdGlvbiksIG9yCiAg
ICAjIGNvbmZpZ3BhcnNlci5Ob09wdGlvbkVycm9yIChpZiBpdCBsYWNrcyAi
VkNTPSIpLiBTZWUgdGhlIGRvY3N0cmluZyBhdAogICAgIyB0aGUgdG9wIG9m
IHZlcnNpb25lZXIucHkgZm9yIGluc3RydWN0aW9ucyBvbiB3cml0aW5nIHlv
dXIgc2V0dXAuY2ZnIC4KICAgIHNldHVwX2NmZyA9IG9zLnBhdGguam9pbihy
b290LCAic2V0dXAuY2ZnIikKICAgIHBhcnNlciA9IGNvbmZpZ3BhcnNlci5T
YWZlQ29uZmlnUGFyc2VyKCkKICAgIHdpdGggb3BlbihzZXR1cF9jZmcsICJy
IikgYXMgZjoKICAgICAgICBwYXJzZXIucmVhZGZwKGYpCiAgICBWQ1MgPSBw
YXJzZXIuZ2V0KCJ2ZXJzaW9uZWVyIiwgIlZDUyIpICAjIG1hbmRhdG9yeQoK
ICAgIGRlZiBnZXQocGFyc2VyLCBuYW1lKToKICAgICAgICBpZiBwYXJzZXIu
aGFzX29wdGlvbigidmVyc2lvbmVlciIsIG5hbWUpOgogICAgICAgICAgICBy
ZXR1cm4gcGFyc2VyLmdldCgidmVyc2lvbmVlciIsIG5hbWUpCiAgICAgICAg
cmV0dXJuIE5vbmUKICAgIGNmZyA9IFZlcnNpb25lZXJDb25maWcoKQogICAg
Y2ZnLlZDUyA9IFZDUwogICAgY2ZnLnN0eWxlID0gZ2V0KHBhcnNlciwgInN0
eWxlIikgb3IgIiIKICAgIGNmZy52ZXJzaW9uZmlsZV9zb3VyY2UgPSBnZXQo
cGFyc2VyLCAidmVyc2lvbmZpbGVfc291cmNlIikKICAgIGNmZy52ZXJzaW9u
ZmlsZV9idWlsZCA9IGdldChwYXJzZXIsICJ2ZXJzaW9uZmlsZV9idWlsZCIp
CiAgICBjZmcudGFnX3ByZWZpeCA9IGdldChwYXJzZXIsICJ0YWdfcHJlZml4
IikKICAgIGNmZy5wYXJlbnRkaXJfcHJlZml4ID0gZ2V0KHBhcnNlciwgInBh
cmVudGRpcl9wcmVmaXgiKQogICAgY2ZnLnZlcmJvc2UgPSBnZXQocGFyc2Vy
LCAidmVyYm9zZSIpCiAgICByZXR1cm4gY2ZnCgoKY2xhc3MgTm90VGhpc01l
dGhvZChFeGNlcHRpb24pOgogICAgcGFzcwoKIyB0aGVzZSBkaWN0aW9uYXJp
ZXMgY29udGFpbiBWQ1Mtc3BlY2lmaWMgdG9vbHMKTE9OR19WRVJTSU9OX1BZ
ID0ge30KSEFORExFUlMgPSB7fQoKCmRlZiByZWdpc3Rlcl92Y3NfaGFuZGxl
cih2Y3MsIG1ldGhvZCk6ICAjIGRlY29yYXRvcgogICAgZGVmIGRlY29yYXRl
KGYpOgogICAgICAgIGlmIHZjcyBub3QgaW4gSEFORExFUlM6CiAgICAgICAg
ICAgIEhBTkRMRVJTW3Zjc10gPSB7fQogICAgICAgIEhBTkRMRVJTW3Zjc11b
bWV0aG9kXSA9IGYKICAgICAgICByZXR1cm4gZgogICAgcmV0dXJuIGRlY29y
YXRlCgoKZGVmIHJ1bl9jb21tYW5kKGNvbW1hbmRzLCBhcmdzLCBjd2Q9Tm9u
ZSwgdmVyYm9zZT1GYWxzZSwgaGlkZV9zdGRlcnI9RmFsc2UpOgogICAgYXNz
ZXJ0IGlzaW5zdGFuY2UoY29tbWFuZHMsIGxpc3QpCiAgICBwID0gTm9uZQog
ICAgZm9yIGMgaW4gY29tbWFuZHM6CiAgICAgICAgdHJ5OgogICAgICAgICAg
ICBkaXNwY21kID0gc3RyKFtjXSArIGFyZ3MpCiAgICAgICAgICAgICMgcmVt
ZW1iZXIgc2hlbGw9RmFsc2UsIHNvIHVzZSBnaXQuY21kIG9uIHdpbmRvd3Ms
IG5vdCBqdXN0IGdpdAogICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Bl
bihbY10gKyBhcmdzLCBjd2Q9Y3dkLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBF
LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9KHN1
YnByb2Nlc3MuUElQRSBpZiBoaWRlX3N0ZGVycgogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgTm9uZSkpCiAgICAgICAg
ICAgIGJyZWFrCiAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3I6CiAg
ICAgICAgICAgIGUgPSBzeXMuZXhjX2luZm8oKVsxXQogICAgICAgICAgICBp
ZiBlLmVycm5vID09IGVycm5vLkVOT0VOVDoKICAgICAgICAgICAgICAgIGNv
bnRpbnVlCiAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAg
ICBwcmludCgidW5hYmxlIHRvIHJ1biAlcyIgJSBkaXNwY21kKQogICAgICAg
ICAgICAgICAgcHJpbnQoZSkKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAg
IGVsc2U6CiAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgcHJpbnQo
InVuYWJsZSB0byBmaW5kIGNvbW1hbmQsIHRyaWVkICVzIiAlIChjb21tYW5k
cywpKQogICAgICAgIHJldHVybiBOb25lCiAgICBzdGRvdXQgPSBwLmNvbW11
bmljYXRlKClbMF0uc3RyaXAoKQogICAgaWYgc3lzLnZlcnNpb25faW5mb1sw
XSA+PSAzOgogICAgICAgIHN0ZG91dCA9IHN0ZG91dC5kZWNvZGUoKQogICAg
aWYgcC5yZXR1cm5jb2RlICE9IDA6CiAgICAgICAgaWYgdmVyYm9zZToKICAg
ICAgICAgICAgcHJpbnQoInVuYWJsZSB0byBydW4gJXMgKGVycm9yKSIgJSBk
aXNwY21kKQogICAgICAgIHJldHVybiBOb25lCiAgICByZXR1cm4gc3Rkb3V0
CkxPTkdfVkVSU0lPTl9QWVsnZ2l0J10gPSAnJycKIyBUaGlzIGZpbGUgaGVs
cHMgdG8gY29tcHV0ZSBhIHZlcnNpb24gbnVtYmVyIGluIHNvdXJjZSB0cmVl
cyBvYnRhaW5lZCBmcm9tCiMgZ2l0LWFyY2hpdmUgdGFyYmFsbCAoc3VjaCBh
cyB0aG9zZSBwcm92aWRlZCBieSBnaXRodWJzIGRvd25sb2FkLWZyb20tdGFn
CiMgZmVhdHVyZSkuIERpc3RyaWJ1dGlvbiB0YXJiYWxscyAoYnVpbHQgYnkg
c2V0dXAucHkgc2Rpc3QpIGFuZCBidWlsZAojIGRpcmVjdG9yaWVzIChwcm9k
dWNlZCBieSBzZXR1cC5weSBidWlsZCkgd2lsbCBjb250YWluIGEgbXVjaCBz
aG9ydGVyIGZpbGUKIyB0aGF0IGp1c3QgY29udGFpbnMgdGhlIGNvbXB1dGVk
IHZlcnNpb24gbnVtYmVyLgoKIyBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgaW50
byB0aGUgcHVibGljIGRvbWFpbi4gR2VuZXJhdGVkIGJ5CiMgdmVyc2lvbmVl
ci0wLjE1IChodHRwczovL2dpdGh1Yi5jb20vd2FybmVyL3B5dGhvbi12ZXJz
aW9uZWVyKQoKaW1wb3J0IGVycm5vCmltcG9ydCBvcwppbXBvcnQgcmUKaW1w
b3J0IHN1YnByb2Nlc3MKaW1wb3J0IHN5cwoKCmRlZiBnZXRfa2V5d29yZHMo
KToKICAgICMgdGhlc2Ugc3RyaW5ncyB3aWxsIGJlIHJlcGxhY2VkIGJ5IGdp
dCBkdXJpbmcgZ2l0LWFyY2hpdmUuCiAgICAjIHNldHVwLnB5L3ZlcnNpb25l
ZXIucHkgd2lsbCBncmVwIGZvciB0aGUgdmFyaWFibGUgbmFtZXMsIHNvIHRo
ZXkgbXVzdAogICAgIyBlYWNoIGJlIGRlZmluZWQgb24gYSBsaW5lIG9mIHRo
ZWlyIG93bi4gX3ZlcnNpb24ucHkgd2lsbCBqdXN0IGNhbGwKICAgICMgZ2V0
X2tleXdvcmRzKCkuCiAgICBnaXRfcmVmbmFtZXMgPSAiJShET0xMQVIpc0Zv
cm1hdDolJWQlKERPTExBUilzIgogICAgZ2l0X2Z1bGwgPSAiJShET0xMQVIp
c0Zvcm1hdDolJUglKERPTExBUilzIgogICAga2V5d29yZHMgPSB7InJlZm5h
bWVzIjogZ2l0X3JlZm5hbWVzLCAiZnVsbCI6IGdpdF9mdWxsfQogICAgcmV0
dXJuIGtleXdvcmRzCgoKY2xhc3MgVmVyc2lvbmVlckNvbmZpZzoKICAgIHBh
c3MKCgpkZWYgZ2V0X2NvbmZpZygpOgogICAgIyB0aGVzZSBzdHJpbmdzIGFy
ZSBmaWxsZWQgaW4gd2hlbiAnc2V0dXAucHkgdmVyc2lvbmVlcicgY3JlYXRl
cwogICAgIyBfdmVyc2lvbi5weQogICAgY2ZnID0gVmVyc2lvbmVlckNvbmZp
ZygpCiAgICBjZmcuVkNTID0gImdpdCIKICAgIGNmZy5zdHlsZSA9ICIlKFNU
WUxFKXMiCiAgICBjZmcudGFnX3ByZWZpeCA9ICIlKFRBR19QUkVGSVgpcyIK
ICAgIGNmZy5wYXJlbnRkaXJfcHJlZml4ID0gIiUoUEFSRU5URElSX1BSRUZJ
WClzIgogICAgY2ZnLnZlcnNpb25maWxlX3NvdXJjZSA9ICIlKFZFUlNJT05G
SUxFX1NPVVJDRSlzIgogICAgY2ZnLnZlcmJvc2UgPSBGYWxzZQogICAgcmV0
dXJuIGNmZwoKCmNsYXNzIE5vdFRoaXNNZXRob2QoRXhjZXB0aW9uKToKICAg
IHBhc3MKCgpMT05HX1ZFUlNJT05fUFkgPSB7fQpIQU5ETEVSUyA9IHt9CgoK
ZGVmIHJlZ2lzdGVyX3Zjc19oYW5kbGVyKHZjcywgbWV0aG9kKTogICMgZGVj
b3JhdG9yCiAgICBkZWYgZGVjb3JhdGUoZik6CiAgICAgICAgaWYgdmNzIG5v
dCBpbiBIQU5ETEVSUzoKICAgICAgICAgICAgSEFORExFUlNbdmNzXSA9IHt9
CiAgICAgICAgSEFORExFUlNbdmNzXVttZXRob2RdID0gZgogICAgICAgIHJl
dHVybiBmCiAgICByZXR1cm4gZGVjb3JhdGUKCgpkZWYgcnVuX2NvbW1hbmQo
Y29tbWFuZHMsIGFyZ3MsIGN3ZD1Ob25lLCB2ZXJib3NlPUZhbHNlLCBoaWRl
X3N0ZGVycj1GYWxzZSk6CiAgICBhc3NlcnQgaXNpbnN0YW5jZShjb21tYW5k
cywgbGlzdCkKICAgIHAgPSBOb25lCiAgICBmb3IgYyBpbiBjb21tYW5kczoK
ICAgICAgICB0cnk6CiAgICAgICAgICAgIGRpc3BjbWQgPSBzdHIoW2NdICsg
YXJncykKICAgICAgICAgICAgIyByZW1lbWJlciBzaGVsbD1GYWxzZSwgc28g
dXNlIGdpdC5jbWQgb24gd2luZG93cywgbm90IGp1c3QgZ2l0CiAgICAgICAg
ICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtjXSArIGFyZ3MsIGN3ZD1jd2Qs
IHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHN0ZGVycj0oc3VicHJvY2Vzcy5QSVBFIGlmIGhpZGVf
c3RkZXJyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZWxzZSBOb25lKSkKICAgICAgICAgICAgYnJlYWsKICAgICAgICBleGNl
cHQgRW52aXJvbm1lbnRFcnJvcjoKICAgICAgICAgICAgZSA9IHN5cy5leGNf
aW5mbygpWzFdCiAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRU5P
RU5UOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYg
dmVyYm9zZToKICAgICAgICAgICAgICAgIHByaW50KCJ1bmFibGUgdG8gcnVu
ICUlcyIgJSUgZGlzcGNtZCkKICAgICAgICAgICAgICAgIHByaW50KGUpCiAg
ICAgICAgICAgIHJldHVybiBOb25lCiAgICBlbHNlOgogICAgICAgIGlmIHZl
cmJvc2U6CiAgICAgICAgICAgIHByaW50KCJ1bmFibGUgdG8gZmluZCBjb21t
YW5kLCB0cmllZCAlJXMiICUlIChjb21tYW5kcywpKQogICAgICAgIHJldHVy
biBOb25lCiAgICBzdGRvdXQgPSBwLmNvbW11bmljYXRlKClbMF0uc3RyaXAo
KQogICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA+PSAzOgogICAgICAgIHN0
ZG91dCA9IHN0ZG91dC5kZWNvZGUoKQogICAgaWYgcC5yZXR1cm5jb2RlICE9
IDA6CiAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgcHJpbnQoInVu
YWJsZSB0byBydW4gJSVzIChlcnJvcikiICUlIGRpc3BjbWQpCiAgICAgICAg
cmV0dXJuIE5vbmUKICAgIHJldHVybiBzdGRvdXQKCgpkZWYgdmVyc2lvbnNf
ZnJvbV9wYXJlbnRkaXIocGFyZW50ZGlyX3ByZWZpeCwgcm9vdCwgdmVyYm9z
ZSk6CiAgICAjIFNvdXJjZSB0YXJiYWxscyBjb252ZW50aW9uYWxseSB1bnBh
Y2sgaW50byBhIGRpcmVjdG9yeSB0aGF0IGluY2x1ZGVzCiAgICAjIGJvdGgg
dGhlIHByb2plY3QgbmFtZSBhbmQgYSB2ZXJzaW9uIHN0cmluZy4KICAgIGRp
cm5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHJvb3QpCiAgICBpZiBub3QgZGly
bmFtZS5zdGFydHN3aXRoKHBhcmVudGRpcl9wcmVmaXgpOgogICAgICAgIGlm
IHZlcmJvc2U6CiAgICAgICAgICAgIHByaW50KCJndWVzc2luZyByb290ZGly
IGlzICclJXMnLCBidXQgJyUlcycgZG9lc24ndCBzdGFydCB3aXRoICIKICAg
ICAgICAgICAgICAgICAgInByZWZpeCAnJSVzJyIgJSUgKHJvb3QsIGRpcm5h
bWUsIHBhcmVudGRpcl9wcmVmaXgpKQogICAgICAgIHJhaXNlIE5vdFRoaXNN
ZXRob2QoInJvb3RkaXIgZG9lc24ndCBzdGFydCB3aXRoIHBhcmVudGRpcl9w
cmVmaXgiKQogICAgcmV0dXJuIHsidmVyc2lvbiI6IGRpcm5hbWVbbGVuKHBh
cmVudGRpcl9wcmVmaXgpOl0sCiAgICAgICAgICAgICJmdWxsLXJldmlzaW9u
aWQiOiBOb25lLAogICAgICAgICAgICAiZGlydHkiOiBGYWxzZSwgImVycm9y
IjogTm9uZX0KCgpAcmVnaXN0ZXJfdmNzX2hhbmRsZXIoImdpdCIsICJnZXRf
a2V5d29yZHMiKQpkZWYgZ2l0X2dldF9rZXl3b3Jkcyh2ZXJzaW9uZmlsZV9h
YnMpOgogICAgIyB0aGUgY29kZSBlbWJlZGRlZCBpbiBfdmVyc2lvbi5weSBj
YW4ganVzdCBmZXRjaCB0aGUgdmFsdWUgb2YgdGhlc2UKICAgICMga2V5d29y
ZHMuIFdoZW4gdXNlZCBmcm9tIHNldHVwLnB5LCB3ZSBkb24ndCB3YW50IHRv
IGltcG9ydCBfdmVyc2lvbi5weSwKICAgICMgc28gd2UgZG8gaXQgd2l0aCBh
IHJlZ2V4cCBpbnN0ZWFkLiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCB1c2VkIGZy
b20KICAgICMgX3ZlcnNpb24ucHkuCiAgICBrZXl3b3JkcyA9IHt9CiAgICB0
cnk6CiAgICAgICAgZiA9IG9wZW4odmVyc2lvbmZpbGVfYWJzLCAiciIpCiAg
ICAgICAgZm9yIGxpbmUgaW4gZi5yZWFkbGluZXMoKToKICAgICAgICAgICAg
aWYgbGluZS5zdHJpcCgpLnN0YXJ0c3dpdGgoImdpdF9yZWZuYW1lcyA9Iik6
CiAgICAgICAgICAgICAgICBtbyA9IHJlLnNlYXJjaChyJz1ccyoiKC4qKSIn
LCBsaW5lKQogICAgICAgICAgICAgICAgaWYgbW86CiAgICAgICAgICAgICAg
ICAgICAga2V5d29yZHNbInJlZm5hbWVzIl0gPSBtby5ncm91cCgxKQogICAg
ICAgICAgICBpZiBsaW5lLnN0cmlwKCkuc3RhcnRzd2l0aCgiZ2l0X2Z1bGwg
PSIpOgogICAgICAgICAgICAgICAgbW8gPSByZS5zZWFyY2gocic9XHMqIigu
KikiJywgbGluZSkKICAgICAgICAgICAgICAgIGlmIG1vOgogICAgICAgICAg
ICAgICAgICAgIGtleXdvcmRzWyJmdWxsIl0gPSBtby5ncm91cCgxKQogICAg
ICAgIGYuY2xvc2UoKQogICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3I6CiAg
ICAgICAgcGFzcwogICAgcmV0dXJuIGtleXdvcmRzCgoKQHJlZ2lzdGVyX3Zj
c19oYW5kbGVyKCJnaXQiLCAia2V5d29yZHMiKQpkZWYgZ2l0X3ZlcnNpb25z
X2Zyb21fa2V5d29yZHMoa2V5d29yZHMsIHRhZ19wcmVmaXgsIHZlcmJvc2Up
OgogICAgaWYgbm90IGtleXdvcmRzOgogICAgICAgIHJhaXNlIE5vdFRoaXNN
ZXRob2QoIm5vIGtleXdvcmRzIGF0IGFsbCwgd2VpcmQiKQogICAgcmVmbmFt
ZXMgPSBrZXl3b3Jkc1sicmVmbmFtZXMiXS5zdHJpcCgpCiAgICBpZiByZWZu
YW1lcy5zdGFydHN3aXRoKCIkRm9ybWF0Iik6CiAgICAgICAgaWYgdmVyYm9z
ZToKICAgICAgICAgICAgcHJpbnQoImtleXdvcmRzIGFyZSB1bmV4cGFuZGVk
LCBub3QgdXNpbmciKQogICAgICAgIHJhaXNlIE5vdFRoaXNNZXRob2QoInVu
ZXhwYW5kZWQga2V5d29yZHMsIG5vdCBhIGdpdC1hcmNoaXZlIHRhcmJhbGwi
KQogICAgcmVmcyA9IHNldChbci5zdHJpcCgpIGZvciByIGluIHJlZm5hbWVz
LnN0cmlwKCIoKSIpLnNwbGl0KCIsIildKQogICAgIyBzdGFydGluZyBpbiBn
aXQtMS44LjMsIHRhZ3MgYXJlIGxpc3RlZCBhcyAidGFnOiBmb28tMS4wIiBp
bnN0ZWFkIG9mCiAgICAjIGp1c3QgImZvby0xLjAiLiBJZiB3ZSBzZWUgYSAi
dGFnOiAiIHByZWZpeCwgcHJlZmVyIHRob3NlLgogICAgVEFHID0gInRhZzog
IgogICAgdGFncyA9IHNldChbcltsZW4oVEFHKTpdIGZvciByIGluIHJlZnMg
aWYgci5zdGFydHN3aXRoKFRBRyldKQogICAgaWYgbm90IHRhZ3M6CiAgICAg
ICAgIyBFaXRoZXIgd2UncmUgdXNpbmcgZ2l0IDwgMS44LjMsIG9yIHRoZXJl
IHJlYWxseSBhcmUgbm8gdGFncy4gV2UgdXNlCiAgICAgICAgIyBhIGhldXJp
c3RpYzogYXNzdW1lIGFsbCB2ZXJzaW9uIHRhZ3MgaGF2ZSBhIGRpZ2l0LiBU
aGUgb2xkIGdpdCAlJWQKICAgICAgICAjIGV4cGFuc2lvbiBiZWhhdmVzIGxp
a2UgZ2l0IGxvZyAtLWRlY29yYXRlPXNob3J0IGFuZCBzdHJpcHMgb3V0IHRo
ZQogICAgICAgICMgcmVmcy9oZWFkcy8gYW5kIHJlZnMvdGFncy8gcHJlZml4
ZXMgdGhhdCB3b3VsZCBsZXQgdXMgZGlzdGluZ3Vpc2gKICAgICAgICAjIGJl
dHdlZW4gYnJhbmNoZXMgYW5kIHRhZ3MuIEJ5IGlnbm9yaW5nIHJlZm5hbWVz
IHdpdGhvdXQgZGlnaXRzLCB3ZQogICAgICAgICMgZmlsdGVyIG91dCBtYW55
IGNvbW1vbiBicmFuY2ggbmFtZXMgbGlrZSAicmVsZWFzZSIgYW5kCiAgICAg
ICAgIyAic3RhYmlsaXphdGlvbiIsIGFzIHdlbGwgYXMgIkhFQUQiIGFuZCAi
bWFzdGVyIi4KICAgICAgICB0YWdzID0gc2V0KFtyIGZvciByIGluIHJlZnMg
aWYgcmUuc2VhcmNoKHInXGQnLCByKV0pCiAgICAgICAgaWYgdmVyYm9zZToK
ICAgICAgICAgICAgcHJpbnQoImRpc2NhcmRpbmcgJyUlcycsIG5vIGRpZ2l0
cyIgJSUgIiwiLmpvaW4ocmVmcy10YWdzKSkKICAgIGlmIHZlcmJvc2U6CiAg
ICAgICAgcHJpbnQoImxpa2VseSB0YWdzOiAlJXMiICUlICIsIi5qb2luKHNv
cnRlZCh0YWdzKSkpCiAgICBmb3IgcmVmIGluIHNvcnRlZCh0YWdzKToKICAg
ICAgICAjIHNvcnRpbmcgd2lsbCBwcmVmZXIgZS5nLiAiMi4wIiBvdmVyICIy
LjByYzEiCiAgICAgICAgaWYgcmVmLnN0YXJ0c3dpdGgodGFnX3ByZWZpeCk6
CiAgICAgICAgICAgIHIgPSByZWZbbGVuKHRhZ19wcmVmaXgpOl0KICAgICAg
ICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgICAgIHByaW50KCJwaWNr
aW5nICUlcyIgJSUgcikKICAgICAgICAgICAgcmV0dXJuIHsidmVyc2lvbiI6
IHIsCiAgICAgICAgICAgICAgICAgICAgImZ1bGwtcmV2aXNpb25pZCI6IGtl
eXdvcmRzWyJmdWxsIl0uc3RyaXAoKSwKICAgICAgICAgICAgICAgICAgICAi
ZGlydHkiOiBGYWxzZSwgImVycm9yIjogTm9uZQogICAgICAgICAgICAgICAg
ICAgIH0KICAgICMgbm8gc3VpdGFibGUgdGFncywgc28gdmVyc2lvbiBpcyAi
MCt1bmtub3duIiwgYnV0IGZ1bGwgaGV4IGlzIHN0aWxsIHRoZXJlCiAgICBp
ZiB2ZXJib3NlOgogICAgICAgIHByaW50KCJubyBzdWl0YWJsZSB0YWdzLCB1
c2luZyB1bmtub3duICsgZnVsbCByZXZpc2lvbiBpZCIpCiAgICByZXR1cm4g
eyJ2ZXJzaW9uIjogIjArdW5rbm93biIsCiAgICAgICAgICAgICJmdWxsLXJl
dmlzaW9uaWQiOiBrZXl3b3Jkc1siZnVsbCJdLnN0cmlwKCksCiAgICAgICAg
ICAgICJkaXJ0eSI6IEZhbHNlLCAiZXJyb3IiOiAibm8gc3VpdGFibGUgdGFn
cyJ9CgoKQHJlZ2lzdGVyX3Zjc19oYW5kbGVyKCJnaXQiLCAicGllY2VzX2Zy
b21fdmNzIikKZGVmIGdpdF9waWVjZXNfZnJvbV92Y3ModGFnX3ByZWZpeCwg
cm9vdCwgdmVyYm9zZSwgcnVuX2NvbW1hbmQ9cnVuX2NvbW1hbmQpOgogICAg
IyB0aGlzIHJ1bnMgJ2dpdCcgZnJvbSB0aGUgcm9vdCBvZiB0aGUgc291cmNl
IHRyZWUuIFRoaXMgb25seSBnZXRzIGNhbGxlZAogICAgIyBpZiB0aGUgZ2l0
LWFyY2hpdmUgJ3N1YnN0JyBrZXl3b3JkcyB3ZXJlICpub3QqIGV4cGFuZGVk
LCBhbmQKICAgICMgX3ZlcnNpb24ucHkgaGFzbid0IGFscmVhZHkgYmVlbiBy
ZXdyaXR0ZW4gd2l0aCBhIHNob3J0IHZlcnNpb24gc3RyaW5nLAogICAgIyBt
ZWFuaW5nIHdlJ3JlIGluc2lkZSBhIGNoZWNrZWQgb3V0IHNvdXJjZSB0cmVl
LgoKICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4ocm9v
dCwgIi5naXQiKSk6CiAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAg
cHJpbnQoIm5vIC5naXQgaW4gJSVzIiAlJSByb290KQogICAgICAgIHJhaXNl
IE5vdFRoaXNNZXRob2QoIm5vIC5naXQgZGlyZWN0b3J5IikKCiAgICBHSVRT
ID0gWyJnaXQiXQogICAgaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CiAg
ICAgICAgR0lUUyA9IFsiZ2l0LmNtZCIsICJnaXQuZXhlIl0KICAgICMgaWYg
dGhlcmUgaXMgYSB0YWcsIHRoaXMgeWllbGRzIFRBRy1OVU0tZ0hFWFstZGly
dHldCiAgICAjIGlmIHRoZXJlIGFyZSBubyB0YWdzLCB0aGlzIHlpZWxkcyBI
RVhbLWRpcnR5XSAobm8gTlVNKQogICAgZGVzY3JpYmVfb3V0ID0gcnVuX2Nv
bW1hbmQoR0lUUywgWyJkZXNjcmliZSIsICItLXRhZ3MiLCAiLS1kaXJ0eSIs
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tYWx3
YXlzIiwgIi0tbG9uZyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY3dkPXJvb3QpCiAgICAjIC0tbG9uZyB3YXMgYWRkZWQgaW4gZ2l0LTEu
NS41CiAgICBpZiBkZXNjcmliZV9vdXQgaXMgTm9uZToKICAgICAgICByYWlz
ZSBOb3RUaGlzTWV0aG9kKCInZ2l0IGRlc2NyaWJlJyBmYWlsZWQiKQogICAg
ZGVzY3JpYmVfb3V0ID0gZGVzY3JpYmVfb3V0LnN0cmlwKCkKICAgIGZ1bGxf
b3V0ID0gcnVuX2NvbW1hbmQoR0lUUywgWyJyZXYtcGFyc2UiLCAiSEVBRCJd
LCBjd2Q9cm9vdCkKICAgIGlmIGZ1bGxfb3V0IGlzIE5vbmU6CiAgICAgICAg
cmFpc2UgTm90VGhpc01ldGhvZCgiJ2dpdCByZXYtcGFyc2UnIGZhaWxlZCIp
CiAgICBmdWxsX291dCA9IGZ1bGxfb3V0LnN0cmlwKCkKCiAgICBwaWVjZXMg
PSB7fQogICAgcGllY2VzWyJsb25nIl0gPSBmdWxsX291dAogICAgcGllY2Vz
WyJzaG9ydCJdID0gZnVsbF9vdXRbOjddICAjIG1heWJlIGltcHJvdmVkIGxh
dGVyCiAgICBwaWVjZXNbImVycm9yIl0gPSBOb25lCgogICAgIyBwYXJzZSBk
ZXNjcmliZV9vdXQuIEl0IHdpbGwgYmUgbGlrZSBUQUctTlVNLWdIRVhbLWRp
cnR5XSBvciBIRVhbLWRpcnR5XQogICAgIyBUQUcgbWlnaHQgaGF2ZSBoeXBo
ZW5zLgogICAgZ2l0X2Rlc2NyaWJlID0gZGVzY3JpYmVfb3V0CgogICAgIyBs
b29rIGZvciAtZGlydHkgc3VmZml4CiAgICBkaXJ0eSA9IGdpdF9kZXNjcmli
ZS5lbmRzd2l0aCgiLWRpcnR5IikKICAgIHBpZWNlc1siZGlydHkiXSA9IGRp
cnR5CiAgICBpZiBkaXJ0eToKICAgICAgICBnaXRfZGVzY3JpYmUgPSBnaXRf
ZGVzY3JpYmVbOmdpdF9kZXNjcmliZS5yaW5kZXgoIi1kaXJ0eSIpXQoKICAg
ICMgbm93IHdlIGhhdmUgVEFHLU5VTS1nSEVYIG9yIEhFWAoKICAgIGlmICIt
IiBpbiBnaXRfZGVzY3JpYmU6CiAgICAgICAgIyBUQUctTlVNLWdIRVgKICAg
ICAgICBtbyA9IHJlLnNlYXJjaChyJ14oLispLShcZCspLWcoWzAtOWEtZl0r
KSQnLCBnaXRfZGVzY3JpYmUpCiAgICAgICAgaWYgbm90IG1vOgogICAgICAg
ICAgICAjIHVucGFyc2VhYmxlLiBNYXliZSBnaXQtZGVzY3JpYmUgaXMgbWlz
YmVoYXZpbmc/CiAgICAgICAgICAgIHBpZWNlc1siZXJyb3IiXSA9ICgidW5h
YmxlIHRvIHBhcnNlIGdpdC1kZXNjcmliZSBvdXRwdXQ6ICclJXMnIgogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgJSUgZGVzY3JpYmVfb3V0KQog
ICAgICAgICAgICByZXR1cm4gcGllY2VzCgogICAgICAgICMgdGFnCiAgICAg
ICAgZnVsbF90YWcgPSBtby5ncm91cCgxKQogICAgICAgIGlmIG5vdCBmdWxs
X3RhZy5zdGFydHN3aXRoKHRhZ19wcmVmaXgpOgogICAgICAgICAgICBpZiB2
ZXJib3NlOgogICAgICAgICAgICAgICAgZm10ID0gInRhZyAnJSVzJyBkb2Vz
bid0IHN0YXJ0IHdpdGggcHJlZml4ICclJXMnIgogICAgICAgICAgICAgICAg
cHJpbnQoZm10ICUlIChmdWxsX3RhZywgdGFnX3ByZWZpeCkpCiAgICAgICAg
ICAgIHBpZWNlc1siZXJyb3IiXSA9ICgidGFnICclJXMnIGRvZXNuJ3Qgc3Rh
cnQgd2l0aCBwcmVmaXggJyUlcyciCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAlJSAoZnVsbF90YWcsIHRhZ19wcmVmaXgpKQogICAgICAgICAg
ICByZXR1cm4gcGllY2VzCiAgICAgICAgcGllY2VzWyJjbG9zZXN0LXRhZyJd
ID0gZnVsbF90YWdbbGVuKHRhZ19wcmVmaXgpOl0KCiAgICAgICAgIyBkaXN0
YW5jZTogbnVtYmVyIG9mIGNvbW1pdHMgc2luY2UgdGFnCiAgICAgICAgcGll
Y2VzWyJkaXN0YW5jZSJdID0gaW50KG1vLmdyb3VwKDIpKQoKICAgICAgICAj
IGNvbW1pdDogc2hvcnQgaGV4IHJldmlzaW9uIElECiAgICAgICAgcGllY2Vz
WyJzaG9ydCJdID0gbW8uZ3JvdXAoMykKCiAgICBlbHNlOgogICAgICAgICMg
SEVYOiBubyB0YWdzCiAgICAgICAgcGllY2VzWyJjbG9zZXN0LXRhZyJdID0g
Tm9uZQogICAgICAgIGNvdW50X291dCA9IHJ1bl9jb21tYW5kKEdJVFMsIFsi
cmV2LWxpc3QiLCAiSEVBRCIsICItLWNvdW50Il0sCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgY3dkPXJvb3QpCiAgICAgICAgcGllY2VzWyJk
aXN0YW5jZSJdID0gaW50KGNvdW50X291dCkgICMgdG90YWwgbnVtYmVyIG9m
IGNvbW1pdHMKCiAgICByZXR1cm4gcGllY2VzCgoKZGVmIHBsdXNfb3JfZG90
KHBpZWNlcyk6CiAgICBpZiAiKyIgaW4gcGllY2VzLmdldCgiY2xvc2VzdC10
YWciLCAiIik6CiAgICAgICAgcmV0dXJuICIuIgogICAgcmV0dXJuICIrIgoK
CmRlZiByZW5kZXJfcGVwNDQwKHBpZWNlcyk6CiAgICAjIG5vdyBidWlsZCB1
cCB2ZXJzaW9uIHN0cmluZywgd2l0aCBwb3N0LXJlbGVhc2UgImxvY2FsIHZl
cnNpb24KICAgICMgaWRlbnRpZmllciIuIE91ciBnb2FsOiBUQUdbK0RJU1RB
TkNFLmdIRVhbLmRpcnR5XV0gLiBOb3RlIHRoYXQgaWYgeW91CiAgICAjIGdl
dCBhIHRhZ2dlZCBidWlsZCBhbmQgdGhlbiBkaXJ0eSBpdCwgeW91J2xsIGdl
dCBUQUcrMC5nSEVYLmRpcnR5CgogICAgIyBleGNlcHRpb25zOgogICAgIyAx
OiBubyB0YWdzLiBnaXRfZGVzY3JpYmUgd2FzIGp1c3QgSEVYLiAwK3VudGFn
Z2VkLkRJU1RBTkNFLmdIRVhbLmRpcnR5XQoKICAgIGlmIHBpZWNlc1siY2xv
c2VzdC10YWciXToKICAgICAgICByZW5kZXJlZCA9IHBpZWNlc1siY2xvc2Vz
dC10YWciXQogICAgICAgIGlmIHBpZWNlc1siZGlzdGFuY2UiXSBvciBwaWVj
ZXNbImRpcnR5Il06CiAgICAgICAgICAgIHJlbmRlcmVkICs9IHBsdXNfb3Jf
ZG90KHBpZWNlcykKICAgICAgICAgICAgcmVuZGVyZWQgKz0gIiUlZC5nJSVz
IiAlJSAocGllY2VzWyJkaXN0YW5jZSJdLCBwaWVjZXNbInNob3J0Il0pCiAg
ICAgICAgICAgIGlmIHBpZWNlc1siZGlydHkiXToKICAgICAgICAgICAgICAg
IHJlbmRlcmVkICs9ICIuZGlydHkiCiAgICBlbHNlOgogICAgICAgICMgZXhj
ZXB0aW9uICMxCiAgICAgICAgcmVuZGVyZWQgPSAiMCt1bnRhZ2dlZC4lJWQu
ZyUlcyIgJSUgKHBpZWNlc1siZGlzdGFuY2UiXSwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGllY2VzWyJzaG9ydCJdKQog
ICAgICAgIGlmIHBpZWNlc1siZGlydHkiXToKICAgICAgICAgICAgcmVuZGVy
ZWQgKz0gIi5kaXJ0eSIKICAgIHJldHVybiByZW5kZXJlZAoKCmRlZiByZW5k
ZXJfcGVwNDQwX3ByZShwaWVjZXMpOgogICAgIyBUQUdbLnBvc3QuZGV2RElT
VEFOQ0VdIC4gTm8gLWRpcnR5CgogICAgIyBleGNlcHRpb25zOgogICAgIyAx
OiBubyB0YWdzLiAwLnBvc3QuZGV2RElTVEFOQ0UKCiAgICBpZiBwaWVjZXNb
ImNsb3Nlc3QtdGFnIl06CiAgICAgICAgcmVuZGVyZWQgPSBwaWVjZXNbImNs
b3Nlc3QtdGFnIl0KICAgICAgICBpZiBwaWVjZXNbImRpc3RhbmNlIl06CiAg
ICAgICAgICAgIHJlbmRlcmVkICs9ICIucG9zdC5kZXYlJWQiICUlIHBpZWNl
c1siZGlzdGFuY2UiXQogICAgZWxzZToKICAgICAgICAjIGV4Y2VwdGlvbiAj
MQogICAgICAgIHJlbmRlcmVkID0gIjAucG9zdC5kZXYlJWQiICUlIHBpZWNl
c1siZGlzdGFuY2UiXQogICAgcmV0dXJuIHJlbmRlcmVkCgoKZGVmIHJlbmRl
cl9wZXA0NDBfcG9zdChwaWVjZXMpOgogICAgIyBUQUdbLnBvc3RESVNUQU5D
RVsuZGV2MF0rZ0hFWF0gLiBUaGUgIi5kZXYwIiBtZWFucyBkaXJ0eS4gTm90
ZSB0aGF0CiAgICAjIC5kZXYwIHNvcnRzIGJhY2t3YXJkcyAoYSBkaXJ0eSB0
cmVlIHdpbGwgYXBwZWFyICJvbGRlciIgdGhhbiB0aGUKICAgICMgY29ycmVz
cG9uZGluZyBjbGVhbiBvbmUpLCBidXQgeW91IHNob3VsZG4ndCBiZSByZWxl
YXNpbmcgc29mdHdhcmUgd2l0aAogICAgIyAtZGlydHkgYW55d2F5cy4KCiAg
ICAjIGV4Y2VwdGlvbnM6CiAgICAjIDE6IG5vIHRhZ3MuIDAucG9zdERJU1RB
TkNFWy5kZXYwXQoKICAgIGlmIHBpZWNlc1siY2xvc2VzdC10YWciXToKICAg
ICAgICByZW5kZXJlZCA9IHBpZWNlc1siY2xvc2VzdC10YWciXQogICAgICAg
IGlmIHBpZWNlc1siZGlzdGFuY2UiXSBvciBwaWVjZXNbImRpcnR5Il06CiAg
ICAgICAgICAgIHJlbmRlcmVkICs9ICIucG9zdCUlZCIgJSUgcGllY2VzWyJk
aXN0YW5jZSJdCiAgICAgICAgICAgIGlmIHBpZWNlc1siZGlydHkiXToKICAg
ICAgICAgICAgICAgIHJlbmRlcmVkICs9ICIuZGV2MCIKICAgICAgICAgICAg
cmVuZGVyZWQgKz0gcGx1c19vcl9kb3QocGllY2VzKQogICAgICAgICAgICBy
ZW5kZXJlZCArPSAiZyUlcyIgJSUgcGllY2VzWyJzaG9ydCJdCiAgICBlbHNl
OgogICAgICAgICMgZXhjZXB0aW9uICMxCiAgICAgICAgcmVuZGVyZWQgPSAi
MC5wb3N0JSVkIiAlJSBwaWVjZXNbImRpc3RhbmNlIl0KICAgICAgICBpZiBw
aWVjZXNbImRpcnR5Il06CiAgICAgICAgICAgIHJlbmRlcmVkICs9ICIuZGV2
MCIKICAgICAgICByZW5kZXJlZCArPSAiK2clJXMiICUlIHBpZWNlc1sic2hv
cnQiXQogICAgcmV0dXJuIHJlbmRlcmVkCgoKZGVmIHJlbmRlcl9wZXA0NDBf
b2xkKHBpZWNlcyk6CiAgICAjIFRBR1sucG9zdERJU1RBTkNFWy5kZXYwXV0g
LiBUaGUgIi5kZXYwIiBtZWFucyBkaXJ0eS4KCiAgICAjIGV4Y2VwdGlvbnM6
CiAgICAjIDE6IG5vIHRhZ3MuIDAucG9zdERJU1RBTkNFWy5kZXYwXQoKICAg
IGlmIHBpZWNlc1siY2xvc2VzdC10YWciXToKICAgICAgICByZW5kZXJlZCA9
IHBpZWNlc1siY2xvc2VzdC10YWciXQogICAgICAgIGlmIHBpZWNlc1siZGlz
dGFuY2UiXSBvciBwaWVjZXNbImRpcnR5Il06CiAgICAgICAgICAgIHJlbmRl
cmVkICs9ICIucG9zdCUlZCIgJSUgcGllY2VzWyJkaXN0YW5jZSJdCiAgICAg
ICAgICAgIGlmIHBpZWNlc1siZGlydHkiXToKICAgICAgICAgICAgICAgIHJl
bmRlcmVkICs9ICIuZGV2MCIKICAgIGVsc2U6CiAgICAgICAgIyBleGNlcHRp
b24gIzEKICAgICAgICByZW5kZXJlZCA9ICIwLnBvc3QlJWQiICUlIHBpZWNl
c1siZGlzdGFuY2UiXQogICAgICAgIGlmIHBpZWNlc1siZGlydHkiXToKICAg
ICAgICAgICAgcmVuZGVyZWQgKz0gIi5kZXYwIgogICAgcmV0dXJuIHJlbmRl
cmVkCgoKZGVmIHJlbmRlcl9naXRfZGVzY3JpYmUocGllY2VzKToKICAgICMg
VEFHWy1ESVNUQU5DRS1nSEVYXVstZGlydHldLCBsaWtlICdnaXQgZGVzY3Jp
YmUgLS10YWdzIC0tZGlydHkKICAgICMgLS1hbHdheXMnCgogICAgIyBleGNl
cHRpb25zOgogICAgIyAxOiBubyB0YWdzLiBIRVhbLWRpcnR5XSAgKG5vdGU6
IG5vICdnJyBwcmVmaXgpCgogICAgaWYgcGllY2VzWyJjbG9zZXN0LXRhZyJd
OgogICAgICAgIHJlbmRlcmVkID0gcGllY2VzWyJjbG9zZXN0LXRhZyJdCiAg
ICAgICAgaWYgcGllY2VzWyJkaXN0YW5jZSJdOgogICAgICAgICAgICByZW5k
ZXJlZCArPSAiLSUlZC1nJSVzIiAlJSAocGllY2VzWyJkaXN0YW5jZSJdLCBw
aWVjZXNbInNob3J0Il0pCiAgICBlbHNlOgogICAgICAgICMgZXhjZXB0aW9u
ICMxCiAgICAgICAgcmVuZGVyZWQgPSBwaWVjZXNbInNob3J0Il0KICAgIGlm
IHBpZWNlc1siZGlydHkiXToKICAgICAgICByZW5kZXJlZCArPSAiLWRpcnR5
IgogICAgcmV0dXJuIHJlbmRlcmVkCgoKZGVmIHJlbmRlcl9naXRfZGVzY3Jp
YmVfbG9uZyhwaWVjZXMpOgogICAgIyBUQUctRElTVEFOQ0UtZ0hFWFstZGly
dHldLCBsaWtlICdnaXQgZGVzY3JpYmUgLS10YWdzIC0tZGlydHkKICAgICMg
LS1hbHdheXMgLWxvbmcnLiBUaGUgZGlzdGFuY2UvaGFzaCBpcyB1bmNvbmRp
dGlvbmFsLgoKICAgICMgZXhjZXB0aW9uczoKICAgICMgMTogbm8gdGFncy4g
SEVYWy1kaXJ0eV0gIChub3RlOiBubyAnZycgcHJlZml4KQoKICAgIGlmIHBp
ZWNlc1siY2xvc2VzdC10YWciXToKICAgICAgICByZW5kZXJlZCA9IHBpZWNl
c1siY2xvc2VzdC10YWciXQogICAgICAgIHJlbmRlcmVkICs9ICItJSVkLWcl
JXMiICUlIChwaWVjZXNbImRpc3RhbmNlIl0sIHBpZWNlc1sic2hvcnQiXSkK
ICAgIGVsc2U6CiAgICAgICAgIyBleGNlcHRpb24gIzEKICAgICAgICByZW5k
ZXJlZCA9IHBpZWNlc1sic2hvcnQiXQogICAgaWYgcGllY2VzWyJkaXJ0eSJd
OgogICAgICAgIHJlbmRlcmVkICs9ICItZGlydHkiCiAgICByZXR1cm4gcmVu
ZGVyZWQKCgpkZWYgcmVuZGVyKHBpZWNlcywgc3R5bGUpOgogICAgaWYgcGll
Y2VzWyJlcnJvciJdOgogICAgICAgIHJldHVybiB7InZlcnNpb24iOiAidW5r
bm93biIsCiAgICAgICAgICAgICAgICAiZnVsbC1yZXZpc2lvbmlkIjogcGll
Y2VzLmdldCgibG9uZyIpLAogICAgICAgICAgICAgICAgImRpcnR5IjogTm9u
ZSwKICAgICAgICAgICAgICAgICJlcnJvciI6IHBpZWNlc1siZXJyb3IiXX0K
CiAgICBpZiBub3Qgc3R5bGUgb3Igc3R5bGUgPT0gImRlZmF1bHQiOgogICAg
ICAgIHN0eWxlID0gInBlcDQ0MCIgICMgdGhlIGRlZmF1bHQKCiAgICBpZiBz
dHlsZSA9PSAicGVwNDQwIjoKICAgICAgICByZW5kZXJlZCA9IHJlbmRlcl9w
ZXA0NDAocGllY2VzKQogICAgZWxpZiBzdHlsZSA9PSAicGVwNDQwLXByZSI6
CiAgICAgICAgcmVuZGVyZWQgPSByZW5kZXJfcGVwNDQwX3ByZShwaWVjZXMp
CiAgICBlbGlmIHN0eWxlID09ICJwZXA0NDAtcG9zdCI6CiAgICAgICAgcmVu
ZGVyZWQgPSByZW5kZXJfcGVwNDQwX3Bvc3QocGllY2VzKQogICAgZWxpZiBz
dHlsZSA9PSAicGVwNDQwLW9sZCI6CiAgICAgICAgcmVuZGVyZWQgPSByZW5k
ZXJfcGVwNDQwX29sZChwaWVjZXMpCiAgICBlbGlmIHN0eWxlID09ICJnaXQt
ZGVzY3JpYmUiOgogICAgICAgIHJlbmRlcmVkID0gcmVuZGVyX2dpdF9kZXNj
cmliZShwaWVjZXMpCiAgICBlbGlmIHN0eWxlID09ICJnaXQtZGVzY3JpYmUt
bG9uZyI6CiAgICAgICAgcmVuZGVyZWQgPSByZW5kZXJfZ2l0X2Rlc2NyaWJl
X2xvbmcocGllY2VzKQogICAgZWxzZToKICAgICAgICByYWlzZSBWYWx1ZUVy
cm9yKCJ1bmtub3duIHN0eWxlICclJXMnIiAlJSBzdHlsZSkKCiAgICByZXR1
cm4geyJ2ZXJzaW9uIjogcmVuZGVyZWQsICJmdWxsLXJldmlzaW9uaWQiOiBw
aWVjZXNbImxvbmciXSwKICAgICAgICAgICAgImRpcnR5IjogcGllY2VzWyJk
aXJ0eSJdLCAiZXJyb3IiOiBOb25lfQoKCmRlZiBnZXRfdmVyc2lvbnMoKToK
ICAgICMgSSBhbSBpbiBfdmVyc2lvbi5weSwgd2hpY2ggbGl2ZXMgYXQgUk9P
VC9WRVJTSU9ORklMRV9TT1VSQ0UuIElmIHdlIGhhdmUKICAgICMgX19maWxl
X18sIHdlIGNhbiB3b3JrIGJhY2t3YXJkcyBmcm9tIHRoZXJlIHRvIHRoZSBy
b290LiBTb21lCiAgICAjIHB5MmV4ZS9iYmZyZWV6ZS9ub24tQ1B5dGhvbiBp
bXBsZW1lbnRhdGlvbnMgZG9uJ3QgZG8gX19maWxlX18sIGluIHdoaWNoCiAg
ICAjIGNhc2Ugd2UgY2FuIG9ubHkgdXNlIGV4cGFuZGVkIGtleXdvcmRzLgoK
ICAgIGNmZyA9IGdldF9jb25maWcoKQogICAgdmVyYm9zZSA9IGNmZy52ZXJi
b3NlCgogICAgdHJ5OgogICAgICAgIHJldHVybiBnaXRfdmVyc2lvbnNfZnJv
bV9rZXl3b3JkcyhnZXRfa2V5d29yZHMoKSwgY2ZnLnRhZ19wcmVmaXgsCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJv
c2UpCiAgICBleGNlcHQgTm90VGhpc01ldGhvZDoKICAgICAgICBwYXNzCgog
ICAgdHJ5OgogICAgICAgIHJvb3QgPSBvcy5wYXRoLnJlYWxwYXRoKF9fZmls
ZV9fKQogICAgICAgICMgdmVyc2lvbmZpbGVfc291cmNlIGlzIHRoZSByZWxh
dGl2ZSBwYXRoIGZyb20gdGhlIHRvcCBvZiB0aGUgc291cmNlCiAgICAgICAg
IyB0cmVlICh3aGVyZSB0aGUgLmdpdCBkaXJlY3RvcnkgbWlnaHQgbGl2ZSkg
dG8gdGhpcyBmaWxlLiBJbnZlcnQKICAgICAgICAjIHRoaXMgdG8gZmluZCB0
aGUgcm9vdCBmcm9tIF9fZmlsZV9fLgogICAgICAgIGZvciBpIGluIGNmZy52
ZXJzaW9uZmlsZV9zb3VyY2Uuc3BsaXQoJy8nKToKICAgICAgICAgICAgcm9v
dCA9IG9zLnBhdGguZGlybmFtZShyb290KQogICAgZXhjZXB0IE5hbWVFcnJv
cjoKICAgICAgICByZXR1cm4geyJ2ZXJzaW9uIjogIjArdW5rbm93biIsICJm
dWxsLXJldmlzaW9uaWQiOiBOb25lLAogICAgICAgICAgICAgICAgImRpcnR5
IjogTm9uZSwKICAgICAgICAgICAgICAgICJlcnJvciI6ICJ1bmFibGUgdG8g
ZmluZCByb290IG9mIHNvdXJjZSB0cmVlIn0KCiAgICB0cnk6CiAgICAgICAg
cGllY2VzID0gZ2l0X3BpZWNlc19mcm9tX3ZjcyhjZmcudGFnX3ByZWZpeCwg
cm9vdCwgdmVyYm9zZSkKICAgICAgICByZXR1cm4gcmVuZGVyKHBpZWNlcywg
Y2ZnLnN0eWxlKQogICAgZXhjZXB0IE5vdFRoaXNNZXRob2Q6CiAgICAgICAg
cGFzcwoKICAgIHRyeToKICAgICAgICBpZiBjZmcucGFyZW50ZGlyX3ByZWZp
eDoKICAgICAgICAgICAgcmV0dXJuIHZlcnNpb25zX2Zyb21fcGFyZW50ZGly
KGNmZy5wYXJlbnRkaXJfcHJlZml4LCByb290LCB2ZXJib3NlKQogICAgZXhj
ZXB0IE5vdFRoaXNNZXRob2Q6CiAgICAgICAgcGFzcwoKICAgIHJldHVybiB7
InZlcnNpb24iOiAiMCt1bmtub3duIiwgImZ1bGwtcmV2aXNpb25pZCI6IE5v
bmUsCiAgICAgICAgICAgICJkaXJ0eSI6IE5vbmUsCiAgICAgICAgICAgICJl
cnJvciI6ICJ1bmFibGUgdG8gY29tcHV0ZSB2ZXJzaW9uIn0KJycnCgoKQHJl
Z2lzdGVyX3Zjc19oYW5kbGVyKCJnaXQiLCAiZ2V0X2tleXdvcmRzIikKZGVm
IGdpdF9nZXRfa2V5d29yZHModmVyc2lvbmZpbGVfYWJzKToKICAgICMgdGhl
IGNvZGUgZW1iZWRkZWQgaW4gX3ZlcnNpb24ucHkgY2FuIGp1c3QgZmV0Y2gg
dGhlIHZhbHVlIG9mIHRoZXNlCiAgICAjIGtleXdvcmRzLiBXaGVuIHVzZWQg
ZnJvbSBzZXR1cC5weSwgd2UgZG9uJ3Qgd2FudCB0byBpbXBvcnQgX3ZlcnNp
b24ucHksCiAgICAjIHNvIHdlIGRvIGl0IHdpdGggYSByZWdleHAgaW5zdGVh
ZC4gVGhpcyBmdW5jdGlvbiBpcyBub3QgdXNlZCBmcm9tCiAgICAjIF92ZXJz
aW9uLnB5LgogICAga2V5d29yZHMgPSB7fQogICAgdHJ5OgogICAgICAgIGYg
PSBvcGVuKHZlcnNpb25maWxlX2FicywgInIiKQogICAgICAgIGZvciBsaW5l
IGluIGYucmVhZGxpbmVzKCk6CiAgICAgICAgICAgIGlmIGxpbmUuc3RyaXAo
KS5zdGFydHN3aXRoKCJnaXRfcmVmbmFtZXMgPSIpOgogICAgICAgICAgICAg
ICAgbW8gPSByZS5zZWFyY2gocic9XHMqIiguKikiJywgbGluZSkKICAgICAg
ICAgICAgICAgIGlmIG1vOgogICAgICAgICAgICAgICAgICAgIGtleXdvcmRz
WyJyZWZuYW1lcyJdID0gbW8uZ3JvdXAoMSkKICAgICAgICAgICAgaWYgbGlu
ZS5zdHJpcCgpLnN0YXJ0c3dpdGgoImdpdF9mdWxsID0iKToKICAgICAgICAg
ICAgICAgIG1vID0gcmUuc2VhcmNoKHInPVxzKiIoLiopIicsIGxpbmUpCiAg
ICAgICAgICAgICAgICBpZiBtbzoKICAgICAgICAgICAgICAgICAgICBrZXl3
b3Jkc1siZnVsbCJdID0gbW8uZ3JvdXAoMSkKICAgICAgICBmLmNsb3NlKCkK
ICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yOgogICAgICAgIHBhc3MKICAg
IHJldHVybiBrZXl3b3JkcwoKCkByZWdpc3Rlcl92Y3NfaGFuZGxlcigiZ2l0
IiwgImtleXdvcmRzIikKZGVmIGdpdF92ZXJzaW9uc19mcm9tX2tleXdvcmRz
KGtleXdvcmRzLCB0YWdfcHJlZml4LCB2ZXJib3NlKToKICAgIGlmIG5vdCBr
ZXl3b3JkczoKICAgICAgICByYWlzZSBOb3RUaGlzTWV0aG9kKCJubyBrZXl3
b3JkcyBhdCBhbGwsIHdlaXJkIikKICAgIHJlZm5hbWVzID0ga2V5d29yZHNb
InJlZm5hbWVzIl0uc3RyaXAoKQogICAgaWYgcmVmbmFtZXMuc3RhcnRzd2l0
aCgiJEZvcm1hdCIpOgogICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAg
IHByaW50KCJrZXl3b3JkcyBhcmUgdW5leHBhbmRlZCwgbm90IHVzaW5nIikK
ICAgICAgICByYWlzZSBOb3RUaGlzTWV0aG9kKCJ1bmV4cGFuZGVkIGtleXdv
cmRzLCBub3QgYSBnaXQtYXJjaGl2ZSB0YXJiYWxsIikKICAgIHJlZnMgPSBz
ZXQoW3Iuc3RyaXAoKSBmb3IgciBpbiByZWZuYW1lcy5zdHJpcCgiKCkiKS5z
cGxpdCgiLCIpXSkKICAgICMgc3RhcnRpbmcgaW4gZ2l0LTEuOC4zLCB0YWdz
IGFyZSBsaXN0ZWQgYXMgInRhZzogZm9vLTEuMCIgaW5zdGVhZCBvZgogICAg
IyBqdXN0ICJmb28tMS4wIi4gSWYgd2Ugc2VlIGEgInRhZzogIiBwcmVmaXgs
IHByZWZlciB0aG9zZS4KICAgIFRBRyA9ICJ0YWc6ICIKICAgIHRhZ3MgPSBz
ZXQoW3JbbGVuKFRBRyk6XSBmb3IgciBpbiByZWZzIGlmIHIuc3RhcnRzd2l0
aChUQUcpXSkKICAgIGlmIG5vdCB0YWdzOgogICAgICAgICMgRWl0aGVyIHdl
J3JlIHVzaW5nIGdpdCA8IDEuOC4zLCBvciB0aGVyZSByZWFsbHkgYXJlIG5v
IHRhZ3MuIFdlIHVzZQogICAgICAgICMgYSBoZXVyaXN0aWM6IGFzc3VtZSBh
bGwgdmVyc2lvbiB0YWdzIGhhdmUgYSBkaWdpdC4gVGhlIG9sZCBnaXQgJWQK
ICAgICAgICAjIGV4cGFuc2lvbiBiZWhhdmVzIGxpa2UgZ2l0IGxvZyAtLWRl
Y29yYXRlPXNob3J0IGFuZCBzdHJpcHMgb3V0IHRoZQogICAgICAgICMgcmVm
cy9oZWFkcy8gYW5kIHJlZnMvdGFncy8gcHJlZml4ZXMgdGhhdCB3b3VsZCBs
ZXQgdXMgZGlzdGluZ3Vpc2gKICAgICAgICAjIGJldHdlZW4gYnJhbmNoZXMg
YW5kIHRhZ3MuIEJ5IGlnbm9yaW5nIHJlZm5hbWVzIHdpdGhvdXQgZGlnaXRz
LCB3ZQogICAgICAgICMgZmlsdGVyIG91dCBtYW55IGNvbW1vbiBicmFuY2gg
bmFtZXMgbGlrZSAicmVsZWFzZSIgYW5kCiAgICAgICAgIyAic3RhYmlsaXph
dGlvbiIsIGFzIHdlbGwgYXMgIkhFQUQiIGFuZCAibWFzdGVyIi4KICAgICAg
ICB0YWdzID0gc2V0KFtyIGZvciByIGluIHJlZnMgaWYgcmUuc2VhcmNoKHIn
XGQnLCByKV0pCiAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgcHJp
bnQoImRpc2NhcmRpbmcgJyVzJywgbm8gZGlnaXRzIiAlICIsIi5qb2luKHJl
ZnMtdGFncykpCiAgICBpZiB2ZXJib3NlOgogICAgICAgIHByaW50KCJsaWtl
bHkgdGFnczogJXMiICUgIiwiLmpvaW4oc29ydGVkKHRhZ3MpKSkKICAgIGZv
ciByZWYgaW4gc29ydGVkKHRhZ3MpOgogICAgICAgICMgc29ydGluZyB3aWxs
IHByZWZlciBlLmcuICIyLjAiIG92ZXIgIjIuMHJjMSIKICAgICAgICBpZiBy
ZWYuc3RhcnRzd2l0aCh0YWdfcHJlZml4KToKICAgICAgICAgICAgciA9IHJl
ZltsZW4odGFnX3ByZWZpeCk6XQogICAgICAgICAgICBpZiB2ZXJib3NlOgog
ICAgICAgICAgICAgICAgcHJpbnQoInBpY2tpbmcgJXMiICUgcikKICAgICAg
ICAgICAgcmV0dXJuIHsidmVyc2lvbiI6IHIsCiAgICAgICAgICAgICAgICAg
ICAgImZ1bGwtcmV2aXNpb25pZCI6IGtleXdvcmRzWyJmdWxsIl0uc3RyaXAo
KSwKICAgICAgICAgICAgICAgICAgICAiZGlydHkiOiBGYWxzZSwgImVycm9y
IjogTm9uZQogICAgICAgICAgICAgICAgICAgIH0KICAgICMgbm8gc3VpdGFi
bGUgdGFncywgc28gdmVyc2lvbiBpcyAiMCt1bmtub3duIiwgYnV0IGZ1bGwg
aGV4IGlzIHN0aWxsIHRoZXJlCiAgICBpZiB2ZXJib3NlOgogICAgICAgIHBy
aW50KCJubyBzdWl0YWJsZSB0YWdzLCB1c2luZyB1bmtub3duICsgZnVsbCBy
ZXZpc2lvbiBpZCIpCiAgICByZXR1cm4geyJ2ZXJzaW9uIjogIjArdW5rbm93
biIsCiAgICAgICAgICAgICJmdWxsLXJldmlzaW9uaWQiOiBrZXl3b3Jkc1si
ZnVsbCJdLnN0cmlwKCksCiAgICAgICAgICAgICJkaXJ0eSI6IEZhbHNlLCAi
ZXJyb3IiOiAibm8gc3VpdGFibGUgdGFncyJ9CgoKQHJlZ2lzdGVyX3Zjc19o
YW5kbGVyKCJnaXQiLCAicGllY2VzX2Zyb21fdmNzIikKZGVmIGdpdF9waWVj
ZXNfZnJvbV92Y3ModGFnX3ByZWZpeCwgcm9vdCwgdmVyYm9zZSwgcnVuX2Nv
bW1hbmQ9cnVuX2NvbW1hbmQpOgogICAgIyB0aGlzIHJ1bnMgJ2dpdCcgZnJv
bSB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuIFRoaXMgb25seSBnZXRz
IGNhbGxlZAogICAgIyBpZiB0aGUgZ2l0LWFyY2hpdmUgJ3N1YnN0JyBrZXl3
b3JkcyB3ZXJlICpub3QqIGV4cGFuZGVkLCBhbmQKICAgICMgX3ZlcnNpb24u
cHkgaGFzbid0IGFscmVhZHkgYmVlbiByZXdyaXR0ZW4gd2l0aCBhIHNob3J0
IHZlcnNpb24gc3RyaW5nLAogICAgIyBtZWFuaW5nIHdlJ3JlIGluc2lkZSBh
IGNoZWNrZWQgb3V0IHNvdXJjZSB0cmVlLgoKICAgIGlmIG5vdCBvcy5wYXRo
LmV4aXN0cyhvcy5wYXRoLmpvaW4ocm9vdCwgIi5naXQiKSk6CiAgICAgICAg
aWYgdmVyYm9zZToKICAgICAgICAgICAgcHJpbnQoIm5vIC5naXQgaW4gJXMi
ICUgcm9vdCkKICAgICAgICByYWlzZSBOb3RUaGlzTWV0aG9kKCJubyAuZ2l0
IGRpcmVjdG9yeSIpCgogICAgR0lUUyA9IFsiZ2l0Il0KICAgIGlmIHN5cy5w
bGF0Zm9ybSA9PSAid2luMzIiOgogICAgICAgIEdJVFMgPSBbImdpdC5jbWQi
LCAiZ2l0LmV4ZSJdCiAgICAjIGlmIHRoZXJlIGlzIGEgdGFnLCB0aGlzIHlp
ZWxkcyBUQUctTlVNLWdIRVhbLWRpcnR5XQogICAgIyBpZiB0aGVyZSBhcmUg
bm8gdGFncywgdGhpcyB5aWVsZHMgSEVYWy1kaXJ0eV0gKG5vIE5VTSkKICAg
IGRlc2NyaWJlX291dCA9IHJ1bl9jb21tYW5kKEdJVFMsIFsiZGVzY3JpYmUi
LCAiLS10YWdzIiwgIi0tZGlydHkiLAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICItLWFsd2F5cyIsICItLWxvbmciXSwKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGN3ZD1yb290KQogICAgIyAtLWxv
bmcgd2FzIGFkZGVkIGluIGdpdC0xLjUuNQogICAgaWYgZGVzY3JpYmVfb3V0
IGlzIE5vbmU6CiAgICAgICAgcmFpc2UgTm90VGhpc01ldGhvZCgiJ2dpdCBk
ZXNjcmliZScgZmFpbGVkIikKICAgIGRlc2NyaWJlX291dCA9IGRlc2NyaWJl
X291dC5zdHJpcCgpCiAgICBmdWxsX291dCA9IHJ1bl9jb21tYW5kKEdJVFMs
IFsicmV2LXBhcnNlIiwgIkhFQUQiXSwgY3dkPXJvb3QpCiAgICBpZiBmdWxs
X291dCBpcyBOb25lOgogICAgICAgIHJhaXNlIE5vdFRoaXNNZXRob2QoIidn
aXQgcmV2LXBhcnNlJyBmYWlsZWQiKQogICAgZnVsbF9vdXQgPSBmdWxsX291
dC5zdHJpcCgpCgogICAgcGllY2VzID0ge30KICAgIHBpZWNlc1sibG9uZyJd
ID0gZnVsbF9vdXQKICAgIHBpZWNlc1sic2hvcnQiXSA9IGZ1bGxfb3V0Wzo3
XSAgIyBtYXliZSBpbXByb3ZlZCBsYXRlcgogICAgcGllY2VzWyJlcnJvciJd
ID0gTm9uZQoKICAgICMgcGFyc2UgZGVzY3JpYmVfb3V0LiBJdCB3aWxsIGJl
IGxpa2UgVEFHLU5VTS1nSEVYWy1kaXJ0eV0gb3IgSEVYWy1kaXJ0eV0KICAg
ICMgVEFHIG1pZ2h0IGhhdmUgaHlwaGVucy4KICAgIGdpdF9kZXNjcmliZSA9
IGRlc2NyaWJlX291dAoKICAgICMgbG9vayBmb3IgLWRpcnR5IHN1ZmZpeAog
ICAgZGlydHkgPSBnaXRfZGVzY3JpYmUuZW5kc3dpdGgoIi1kaXJ0eSIpCiAg
ICBwaWVjZXNbImRpcnR5Il0gPSBkaXJ0eQogICAgaWYgZGlydHk6CiAgICAg
ICAgZ2l0X2Rlc2NyaWJlID0gZ2l0X2Rlc2NyaWJlWzpnaXRfZGVzY3JpYmUu
cmluZGV4KCItZGlydHkiKV0KCiAgICAjIG5vdyB3ZSBoYXZlIFRBRy1OVU0t
Z0hFWCBvciBIRVgKCiAgICBpZiAiLSIgaW4gZ2l0X2Rlc2NyaWJlOgogICAg
ICAgICMgVEFHLU5VTS1nSEVYCiAgICAgICAgbW8gPSByZS5zZWFyY2gocide
KC4rKS0oXGQrKS1nKFswLTlhLWZdKykkJywgZ2l0X2Rlc2NyaWJlKQogICAg
ICAgIGlmIG5vdCBtbzoKICAgICAgICAgICAgIyB1bnBhcnNlYWJsZS4gTWF5
YmUgZ2l0LWRlc2NyaWJlIGlzIG1pc2JlaGF2aW5nPwogICAgICAgICAgICBw
aWVjZXNbImVycm9yIl0gPSAoInVuYWJsZSB0byBwYXJzZSBnaXQtZGVzY3Jp
YmUgb3V0cHV0OiAnJXMnIgogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgJSBkZXNjcmliZV9vdXQpCiAgICAgICAgICAgIHJldHVybiBwaWVjZXMK
CiAgICAgICAgIyB0YWcKICAgICAgICBmdWxsX3RhZyA9IG1vLmdyb3VwKDEp
CiAgICAgICAgaWYgbm90IGZ1bGxfdGFnLnN0YXJ0c3dpdGgodGFnX3ByZWZp
eCk6CiAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAgICBm
bXQgPSAidGFnICclcycgZG9lc24ndCBzdGFydCB3aXRoIHByZWZpeCAnJXMn
IgogICAgICAgICAgICAgICAgcHJpbnQoZm10ICUgKGZ1bGxfdGFnLCB0YWdf
cHJlZml4KSkKICAgICAgICAgICAgcGllY2VzWyJlcnJvciJdID0gKCJ0YWcg
JyVzJyBkb2Vzbid0IHN0YXJ0IHdpdGggcHJlZml4ICclcyciCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAlIChmdWxsX3RhZywgdGFnX3ByZWZp
eCkpCiAgICAgICAgICAgIHJldHVybiBwaWVjZXMKICAgICAgICBwaWVjZXNb
ImNsb3Nlc3QtdGFnIl0gPSBmdWxsX3RhZ1tsZW4odGFnX3ByZWZpeCk6XQoK
ICAgICAgICAjIGRpc3RhbmNlOiBudW1iZXIgb2YgY29tbWl0cyBzaW5jZSB0
YWcKICAgICAgICBwaWVjZXNbImRpc3RhbmNlIl0gPSBpbnQobW8uZ3JvdXAo
MikpCgogICAgICAgICMgY29tbWl0OiBzaG9ydCBoZXggcmV2aXNpb24gSUQK
ICAgICAgICBwaWVjZXNbInNob3J0Il0gPSBtby5ncm91cCgzKQoKICAgIGVs
c2U6CiAgICAgICAgIyBIRVg6IG5vIHRhZ3MKICAgICAgICBwaWVjZXNbImNs
b3Nlc3QtdGFnIl0gPSBOb25lCiAgICAgICAgY291bnRfb3V0ID0gcnVuX2Nv
bW1hbmQoR0lUUywgWyJyZXYtbGlzdCIsICJIRUFEIiwgIi0tY291bnQiXSwK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2Q9cm9vdCkKICAg
ICAgICBwaWVjZXNbImRpc3RhbmNlIl0gPSBpbnQoY291bnRfb3V0KSAgIyB0
b3RhbCBudW1iZXIgb2YgY29tbWl0cwoKICAgIHJldHVybiBwaWVjZXMKCgpk
ZWYgZG9fdmNzX2luc3RhbGwobWFuaWZlc3RfaW4sIHZlcnNpb25maWxlX3Nv
dXJjZSwgaXB5KToKICAgIEdJVFMgPSBbImdpdCJdCiAgICBpZiBzeXMucGxh
dGZvcm0gPT0gIndpbjMyIjoKICAgICAgICBHSVRTID0gWyJnaXQuY21kIiwg
ImdpdC5leGUiXQogICAgZmlsZXMgPSBbbWFuaWZlc3RfaW4sIHZlcnNpb25m
aWxlX3NvdXJjZV0KICAgIGlmIGlweToKICAgICAgICBmaWxlcy5hcHBlbmQo
aXB5KQogICAgdHJ5OgogICAgICAgIG1lID0gX19maWxlX18KICAgICAgICBp
ZiBtZS5lbmRzd2l0aCgiLnB5YyIpIG9yIG1lLmVuZHN3aXRoKCIucHlvIik6
CiAgICAgICAgICAgIG1lID0gb3MucGF0aC5zcGxpdGV4dChtZSlbMF0gKyAi
LnB5IgogICAgICAgIHZlcnNpb25lZXJfZmlsZSA9IG9zLnBhdGgucmVscGF0
aChtZSkKICAgIGV4Y2VwdCBOYW1lRXJyb3I6CiAgICAgICAgdmVyc2lvbmVl
cl9maWxlID0gInZlcnNpb25lZXIucHkiCiAgICBmaWxlcy5hcHBlbmQodmVy
c2lvbmVlcl9maWxlKQogICAgcHJlc2VudCA9IEZhbHNlCiAgICB0cnk6CiAg
ICAgICAgZiA9IG9wZW4oIi5naXRhdHRyaWJ1dGVzIiwgInIiKQogICAgICAg
IGZvciBsaW5lIGluIGYucmVhZGxpbmVzKCk6CiAgICAgICAgICAgIGlmIGxp
bmUuc3RyaXAoKS5zdGFydHN3aXRoKHZlcnNpb25maWxlX3NvdXJjZSk6CiAg
ICAgICAgICAgICAgICBpZiAiZXhwb3J0LXN1YnN0IiBpbiBsaW5lLnN0cmlw
KCkuc3BsaXQoKVsxOl06CiAgICAgICAgICAgICAgICAgICAgcHJlc2VudCA9
IFRydWUKICAgICAgICBmLmNsb3NlKCkKICAgIGV4Y2VwdCBFbnZpcm9ubWVu
dEVycm9yOgogICAgICAgIHBhc3MKICAgIGlmIG5vdCBwcmVzZW50OgogICAg
ICAgIGYgPSBvcGVuKCIuZ2l0YXR0cmlidXRlcyIsICJhKyIpCiAgICAgICAg
Zi53cml0ZSgiJXMgZXhwb3J0LXN1YnN0XG4iICUgdmVyc2lvbmZpbGVfc291
cmNlKQogICAgICAgIGYuY2xvc2UoKQogICAgICAgIGZpbGVzLmFwcGVuZCgi
LmdpdGF0dHJpYnV0ZXMiKQogICAgcnVuX2NvbW1hbmQoR0lUUywgWyJhZGQi
LCAiLS0iXSArIGZpbGVzKQoKCmRlZiB2ZXJzaW9uc19mcm9tX3BhcmVudGRp
cihwYXJlbnRkaXJfcHJlZml4LCByb290LCB2ZXJib3NlKToKICAgICMgU291
cmNlIHRhcmJhbGxzIGNvbnZlbnRpb25hbGx5IHVucGFjayBpbnRvIGEgZGly
ZWN0b3J5IHRoYXQgaW5jbHVkZXMKICAgICMgYm90aCB0aGUgcHJvamVjdCBu
YW1lIGFuZCBhIHZlcnNpb24gc3RyaW5nLgogICAgZGlybmFtZSA9IG9zLnBh
dGguYmFzZW5hbWUocm9vdCkKICAgIGlmIG5vdCBkaXJuYW1lLnN0YXJ0c3dp
dGgocGFyZW50ZGlyX3ByZWZpeCk6CiAgICAgICAgaWYgdmVyYm9zZToKICAg
ICAgICAgICAgcHJpbnQoImd1ZXNzaW5nIHJvb3RkaXIgaXMgJyVzJywgYnV0
ICclcycgZG9lc24ndCBzdGFydCB3aXRoICIKICAgICAgICAgICAgICAgICAg
InByZWZpeCAnJXMnIiAlIChyb290LCBkaXJuYW1lLCBwYXJlbnRkaXJfcHJl
Zml4KSkKICAgICAgICByYWlzZSBOb3RUaGlzTWV0aG9kKCJyb290ZGlyIGRv
ZXNuJ3Qgc3RhcnQgd2l0aCBwYXJlbnRkaXJfcHJlZml4IikKICAgIHJldHVy
biB7InZlcnNpb24iOiBkaXJuYW1lW2xlbihwYXJlbnRkaXJfcHJlZml4KTpd
LAogICAgICAgICAgICAiZnVsbC1yZXZpc2lvbmlkIjogTm9uZSwKICAgICAg
ICAgICAgImRpcnR5IjogRmFsc2UsICJlcnJvciI6IE5vbmV9CgpTSE9SVF9W
RVJTSU9OX1BZID0gIiIiCiMgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkg
J3ZlcnNpb25lZXIucHknICgwLjE1KSBmcm9tCiMgcmV2aXNpb24tY29udHJv
bCBzeXN0ZW0gZGF0YSwgb3IgZnJvbSB0aGUgcGFyZW50IGRpcmVjdG9yeSBu
YW1lIG9mIGFuCiMgdW5wYWNrZWQgc291cmNlIGFyY2hpdmUuIERpc3RyaWJ1
dGlvbiB0YXJiYWxscyBjb250YWluIGEgcHJlLWdlbmVyYXRlZCBjb3B5CiMg
b2YgdGhpcyBmaWxlLgoKaW1wb3J0IGpzb24KaW1wb3J0IHN5cwoKdmVyc2lv
bl9qc29uID0gJycnCiVzCicnJyAgIyBFTkQgVkVSU0lPTl9KU09OCgoKZGVm
IGdldF92ZXJzaW9ucygpOgogICAgcmV0dXJuIGpzb24ubG9hZHModmVyc2lv
bl9qc29uKQoiIiIKCgpkZWYgdmVyc2lvbnNfZnJvbV9maWxlKGZpbGVuYW1l
KToKICAgIHRyeToKICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUpIGFzIGY6
CiAgICAgICAgICAgIGNvbnRlbnRzID0gZi5yZWFkKCkKICAgIGV4Y2VwdCBF
bnZpcm9ubWVudEVycm9yOgogICAgICAgIHJhaXNlIE5vdFRoaXNNZXRob2Qo
InVuYWJsZSB0byByZWFkIF92ZXJzaW9uLnB5IikKICAgIG1vID0gcmUuc2Vh
cmNoKHIidmVyc2lvbl9qc29uID0gJycnXG4oLiopJycnICAjIEVORCBWRVJT
SU9OX0pTT04iLAogICAgICAgICAgICAgICAgICAgY29udGVudHMsIHJlLk0g
fCByZS5TKQogICAgaWYgbm90IG1vOgogICAgICAgIHJhaXNlIE5vdFRoaXNN
ZXRob2QoIm5vIHZlcnNpb25fanNvbiBpbiBfdmVyc2lvbi5weSIpCiAgICBy
ZXR1cm4ganNvbi5sb2Fkcyhtby5ncm91cCgxKSkKCgpkZWYgd3JpdGVfdG9f
dmVyc2lvbl9maWxlKGZpbGVuYW1lLCB2ZXJzaW9ucyk6CiAgICBvcy51bmxp
bmsoZmlsZW5hbWUpCiAgICBjb250ZW50cyA9IGpzb24uZHVtcHModmVyc2lv
bnMsIHNvcnRfa2V5cz1UcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAg
IGluZGVudD0xLCBzZXBhcmF0b3JzPSgiLCIsICI6ICIpKQogICAgd2l0aCBv
cGVuKGZpbGVuYW1lLCAidyIpIGFzIGY6CiAgICAgICAgZi53cml0ZShTSE9S
VF9WRVJTSU9OX1BZICUgY29udGVudHMpCgogICAgcHJpbnQoInNldCAlcyB0
byAnJXMnIiAlIChmaWxlbmFtZSwgdmVyc2lvbnNbInZlcnNpb24iXSkpCgoK
ZGVmIHBsdXNfb3JfZG90KHBpZWNlcyk6CiAgICBpZiAiKyIgaW4gcGllY2Vz
LmdldCgiY2xvc2VzdC10YWciLCAiIik6CiAgICAgICAgcmV0dXJuICIuIgog
ICAgcmV0dXJuICIrIgoKCmRlZiByZW5kZXJfcGVwNDQwKHBpZWNlcyk6CiAg
ICAjIG5vdyBidWlsZCB1cCB2ZXJzaW9uIHN0cmluZywgd2l0aCBwb3N0LXJl
bGVhc2UgImxvY2FsIHZlcnNpb24KICAgICMgaWRlbnRpZmllciIuIE91ciBn
b2FsOiBUQUdbK0RJU1RBTkNFLmdIRVhbLmRpcnR5XV0gLiBOb3RlIHRoYXQg
aWYgeW91CiAgICAjIGdldCBhIHRhZ2dlZCBidWlsZCBhbmQgdGhlbiBkaXJ0
eSBpdCwgeW91J2xsIGdldCBUQUcrMC5nSEVYLmRpcnR5CgogICAgIyBleGNl
cHRpb25zOgogICAgIyAxOiBubyB0YWdzLiBnaXRfZGVzY3JpYmUgd2FzIGp1
c3QgSEVYLiAwK3VudGFnZ2VkLkRJU1RBTkNFLmdIRVhbLmRpcnR5XQoKICAg
IGlmIHBpZWNlc1siY2xvc2VzdC10YWciXToKICAgICAgICByZW5kZXJlZCA9
IHBpZWNlc1siY2xvc2VzdC10YWciXQogICAgICAgIGlmIHBpZWNlc1siZGlz
dGFuY2UiXSBvciBwaWVjZXNbImRpcnR5Il06CiAgICAgICAgICAgIHJlbmRl
cmVkICs9IHBsdXNfb3JfZG90KHBpZWNlcykKICAgICAgICAgICAgcmVuZGVy
ZWQgKz0gIiVkLmclcyIgJSAocGllY2VzWyJkaXN0YW5jZSJdLCBwaWVjZXNb
InNob3J0Il0pCiAgICAgICAgICAgIGlmIHBpZWNlc1siZGlydHkiXToKICAg
ICAgICAgICAgICAgIHJlbmRlcmVkICs9ICIuZGlydHkiCiAgICBlbHNlOgog
ICAgICAgICMgZXhjZXB0aW9uICMxCiAgICAgICAgcmVuZGVyZWQgPSAiMCt1
bnRhZ2dlZC4lZC5nJXMiICUgKHBpZWNlc1siZGlzdGFuY2UiXSwKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGllY2VzWyJz
aG9ydCJdKQogICAgICAgIGlmIHBpZWNlc1siZGlydHkiXToKICAgICAgICAg
ICAgcmVuZGVyZWQgKz0gIi5kaXJ0eSIKICAgIHJldHVybiByZW5kZXJlZAoK
CmRlZiByZW5kZXJfcGVwNDQwX3ByZShwaWVjZXMpOgogICAgIyBUQUdbLnBv
c3QuZGV2RElTVEFOQ0VdIC4gTm8gLWRpcnR5CgogICAgIyBleGNlcHRpb25z
OgogICAgIyAxOiBubyB0YWdzLiAwLnBvc3QuZGV2RElTVEFOQ0UKCiAgICBp
ZiBwaWVjZXNbImNsb3Nlc3QtdGFnIl06CiAgICAgICAgcmVuZGVyZWQgPSBw
aWVjZXNbImNsb3Nlc3QtdGFnIl0KICAgICAgICBpZiBwaWVjZXNbImRpc3Rh
bmNlIl06CiAgICAgICAgICAgIHJlbmRlcmVkICs9ICIucG9zdC5kZXYlZCIg
JSBwaWVjZXNbImRpc3RhbmNlIl0KICAgIGVsc2U6CiAgICAgICAgIyBleGNl
cHRpb24gIzEKICAgICAgICByZW5kZXJlZCA9ICIwLnBvc3QuZGV2JWQiICUg
cGllY2VzWyJkaXN0YW5jZSJdCiAgICByZXR1cm4gcmVuZGVyZWQKCgpkZWYg
cmVuZGVyX3BlcDQ0MF9wb3N0KHBpZWNlcyk6CiAgICAjIFRBR1sucG9zdERJ
U1RBTkNFWy5kZXYwXStnSEVYXSAuIFRoZSAiLmRldjAiIG1lYW5zIGRpcnR5
LiBOb3RlIHRoYXQKICAgICMgLmRldjAgc29ydHMgYmFja3dhcmRzIChhIGRp
cnR5IHRyZWUgd2lsbCBhcHBlYXIgIm9sZGVyIiB0aGFuIHRoZQogICAgIyBj
b3JyZXNwb25kaW5nIGNsZWFuIG9uZSksIGJ1dCB5b3Ugc2hvdWxkbid0IGJl
IHJlbGVhc2luZyBzb2Z0d2FyZSB3aXRoCiAgICAjIC1kaXJ0eSBhbnl3YXlz
LgoKICAgICMgZXhjZXB0aW9uczoKICAgICMgMTogbm8gdGFncy4gMC5wb3N0
RElTVEFOQ0VbLmRldjBdCgogICAgaWYgcGllY2VzWyJjbG9zZXN0LXRhZyJd
OgogICAgICAgIHJlbmRlcmVkID0gcGllY2VzWyJjbG9zZXN0LXRhZyJdCiAg
ICAgICAgaWYgcGllY2VzWyJkaXN0YW5jZSJdIG9yIHBpZWNlc1siZGlydHki
XToKICAgICAgICAgICAgcmVuZGVyZWQgKz0gIi5wb3N0JWQiICUgcGllY2Vz
WyJkaXN0YW5jZSJdCiAgICAgICAgICAgIGlmIHBpZWNlc1siZGlydHkiXToK
ICAgICAgICAgICAgICAgIHJlbmRlcmVkICs9ICIuZGV2MCIKICAgICAgICAg
ICAgcmVuZGVyZWQgKz0gcGx1c19vcl9kb3QocGllY2VzKQogICAgICAgICAg
ICByZW5kZXJlZCArPSAiZyVzIiAlIHBpZWNlc1sic2hvcnQiXQogICAgZWxz
ZToKICAgICAgICAjIGV4Y2VwdGlvbiAjMQogICAgICAgIHJlbmRlcmVkID0g
IjAucG9zdCVkIiAlIHBpZWNlc1siZGlzdGFuY2UiXQogICAgICAgIGlmIHBp
ZWNlc1siZGlydHkiXToKICAgICAgICAgICAgcmVuZGVyZWQgKz0gIi5kZXYw
IgogICAgICAgIHJlbmRlcmVkICs9ICIrZyVzIiAlIHBpZWNlc1sic2hvcnQi
XQogICAgcmV0dXJuIHJlbmRlcmVkCgoKZGVmIHJlbmRlcl9wZXA0NDBfb2xk
KHBpZWNlcyk6CiAgICAjIFRBR1sucG9zdERJU1RBTkNFWy5kZXYwXV0gLiBU
aGUgIi5kZXYwIiBtZWFucyBkaXJ0eS4KCiAgICAjIGV4Y2VwdGlvbnM6CiAg
ICAjIDE6IG5vIHRhZ3MuIDAucG9zdERJU1RBTkNFWy5kZXYwXQoKICAgIGlm
IHBpZWNlc1siY2xvc2VzdC10YWciXToKICAgICAgICByZW5kZXJlZCA9IHBp
ZWNlc1siY2xvc2VzdC10YWciXQogICAgICAgIGlmIHBpZWNlc1siZGlzdGFu
Y2UiXSBvciBwaWVjZXNbImRpcnR5Il06CiAgICAgICAgICAgIHJlbmRlcmVk
ICs9ICIucG9zdCVkIiAlIHBpZWNlc1siZGlzdGFuY2UiXQogICAgICAgICAg
ICBpZiBwaWVjZXNbImRpcnR5Il06CiAgICAgICAgICAgICAgICByZW5kZXJl
ZCArPSAiLmRldjAiCiAgICBlbHNlOgogICAgICAgICMgZXhjZXB0aW9uICMx
CiAgICAgICAgcmVuZGVyZWQgPSAiMC5wb3N0JWQiICUgcGllY2VzWyJkaXN0
YW5jZSJdCiAgICAgICAgaWYgcGllY2VzWyJkaXJ0eSJdOgogICAgICAgICAg
ICByZW5kZXJlZCArPSAiLmRldjAiCiAgICByZXR1cm4gcmVuZGVyZWQKCgpk
ZWYgcmVuZGVyX2dpdF9kZXNjcmliZShwaWVjZXMpOgogICAgIyBUQUdbLURJ
U1RBTkNFLWdIRVhdWy1kaXJ0eV0sIGxpa2UgJ2dpdCBkZXNjcmliZSAtLXRh
Z3MgLS1kaXJ0eQogICAgIyAtLWFsd2F5cycKCiAgICAjIGV4Y2VwdGlvbnM6
CiAgICAjIDE6IG5vIHRhZ3MuIEhFWFstZGlydHldICAobm90ZTogbm8gJ2cn
IHByZWZpeCkKCiAgICBpZiBwaWVjZXNbImNsb3Nlc3QtdGFnIl06CiAgICAg
ICAgcmVuZGVyZWQgPSBwaWVjZXNbImNsb3Nlc3QtdGFnIl0KICAgICAgICBp
ZiBwaWVjZXNbImRpc3RhbmNlIl06CiAgICAgICAgICAgIHJlbmRlcmVkICs9
ICItJWQtZyVzIiAlIChwaWVjZXNbImRpc3RhbmNlIl0sIHBpZWNlc1sic2hv
cnQiXSkKICAgIGVsc2U6CiAgICAgICAgIyBleGNlcHRpb24gIzEKICAgICAg
ICByZW5kZXJlZCA9IHBpZWNlc1sic2hvcnQiXQogICAgaWYgcGllY2VzWyJk
aXJ0eSJdOgogICAgICAgIHJlbmRlcmVkICs9ICItZGlydHkiCiAgICByZXR1
cm4gcmVuZGVyZWQKCgpkZWYgcmVuZGVyX2dpdF9kZXNjcmliZV9sb25nKHBp
ZWNlcyk6CiAgICAjIFRBRy1ESVNUQU5DRS1nSEVYWy1kaXJ0eV0sIGxpa2Ug
J2dpdCBkZXNjcmliZSAtLXRhZ3MgLS1kaXJ0eQogICAgIyAtLWFsd2F5cyAt
bG9uZycuIFRoZSBkaXN0YW5jZS9oYXNoIGlzIHVuY29uZGl0aW9uYWwuCgog
ICAgIyBleGNlcHRpb25zOgogICAgIyAxOiBubyB0YWdzLiBIRVhbLWRpcnR5
XSAgKG5vdGU6IG5vICdnJyBwcmVmaXgpCgogICAgaWYgcGllY2VzWyJjbG9z
ZXN0LXRhZyJdOgogICAgICAgIHJlbmRlcmVkID0gcGllY2VzWyJjbG9zZXN0
LXRhZyJdCiAgICAgICAgcmVuZGVyZWQgKz0gIi0lZC1nJXMiICUgKHBpZWNl
c1siZGlzdGFuY2UiXSwgcGllY2VzWyJzaG9ydCJdKQogICAgZWxzZToKICAg
ICAgICAjIGV4Y2VwdGlvbiAjMQogICAgICAgIHJlbmRlcmVkID0gcGllY2Vz
WyJzaG9ydCJdCiAgICBpZiBwaWVjZXNbImRpcnR5Il06CiAgICAgICAgcmVu
ZGVyZWQgKz0gIi1kaXJ0eSIKICAgIHJldHVybiByZW5kZXJlZAoKCmRlZiBy
ZW5kZXIocGllY2VzLCBzdHlsZSk6CiAgICBpZiBwaWVjZXNbImVycm9yIl06
CiAgICAgICAgcmV0dXJuIHsidmVyc2lvbiI6ICJ1bmtub3duIiwKICAgICAg
ICAgICAgICAgICJmdWxsLXJldmlzaW9uaWQiOiBwaWVjZXMuZ2V0KCJsb25n
IiksCiAgICAgICAgICAgICAgICAiZGlydHkiOiBOb25lLAogICAgICAgICAg
ICAgICAgImVycm9yIjogcGllY2VzWyJlcnJvciJdfQoKICAgIGlmIG5vdCBz
dHlsZSBvciBzdHlsZSA9PSAiZGVmYXVsdCI6CiAgICAgICAgc3R5bGUgPSAi
cGVwNDQwIiAgIyB0aGUgZGVmYXVsdAoKICAgIGlmIHN0eWxlID09ICJwZXA0
NDAiOgogICAgICAgIHJlbmRlcmVkID0gcmVuZGVyX3BlcDQ0MChwaWVjZXMp
CiAgICBlbGlmIHN0eWxlID09ICJwZXA0NDAtcHJlIjoKICAgICAgICByZW5k
ZXJlZCA9IHJlbmRlcl9wZXA0NDBfcHJlKHBpZWNlcykKICAgIGVsaWYgc3R5
bGUgPT0gInBlcDQ0MC1wb3N0IjoKICAgICAgICByZW5kZXJlZCA9IHJlbmRl
cl9wZXA0NDBfcG9zdChwaWVjZXMpCiAgICBlbGlmIHN0eWxlID09ICJwZXA0
NDAtb2xkIjoKICAgICAgICByZW5kZXJlZCA9IHJlbmRlcl9wZXA0NDBfb2xk
KHBpZWNlcykKICAgIGVsaWYgc3R5bGUgPT0gImdpdC1kZXNjcmliZSI6CiAg
ICAgICAgcmVuZGVyZWQgPSByZW5kZXJfZ2l0X2Rlc2NyaWJlKHBpZWNlcykK
ICAgIGVsaWYgc3R5bGUgPT0gImdpdC1kZXNjcmliZS1sb25nIjoKICAgICAg
ICByZW5kZXJlZCA9IHJlbmRlcl9naXRfZGVzY3JpYmVfbG9uZyhwaWVjZXMp
CiAgICBlbHNlOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVua25vd24g
c3R5bGUgJyVzJyIgJSBzdHlsZSkKCiAgICByZXR1cm4geyJ2ZXJzaW9uIjog
cmVuZGVyZWQsICJmdWxsLXJldmlzaW9uaWQiOiBwaWVjZXNbImxvbmciXSwK
ICAgICAgICAgICAgImRpcnR5IjogcGllY2VzWyJkaXJ0eSJdLCAiZXJyb3Ii
OiBOb25lfQoKCmNsYXNzIFZlcnNpb25lZXJCYWRSb290RXJyb3IoRXhjZXB0
aW9uKToKICAgIHBhc3MKCgpkZWYgZ2V0X3ZlcnNpb25zKHZlcmJvc2U9RmFs
c2UpOgogICAgIyByZXR1cm5zIGRpY3Qgd2l0aCB0d28ga2V5czogJ3ZlcnNp
b24nIGFuZCAnZnVsbCcKCiAgICBpZiAidmVyc2lvbmVlciIgaW4gc3lzLm1v
ZHVsZXM6CiAgICAgICAgIyBzZWUgdGhlIGRpc2N1c3Npb24gaW4gY21kY2xh
c3MucHk6Z2V0X2NtZGNsYXNzKCkKICAgICAgICBkZWwgc3lzLm1vZHVsZXNb
InZlcnNpb25lZXIiXQoKICAgIHJvb3QgPSBnZXRfcm9vdCgpCiAgICBjZmcg
PSBnZXRfY29uZmlnX2Zyb21fcm9vdChyb290KQoKICAgIGFzc2VydCBjZmcu
VkNTIGlzIG5vdCBOb25lLCAicGxlYXNlIHNldCBbdmVyc2lvbmVlcl1WQ1M9
IGluIHNldHVwLmNmZyIKICAgIGhhbmRsZXJzID0gSEFORExFUlMuZ2V0KGNm
Zy5WQ1MpCiAgICBhc3NlcnQgaGFuZGxlcnMsICJ1bnJlY29nbml6ZWQgVkNT
ICclcyciICUgY2ZnLlZDUwogICAgdmVyYm9zZSA9IHZlcmJvc2Ugb3IgY2Zn
LnZlcmJvc2UKICAgIGFzc2VydCBjZmcudmVyc2lvbmZpbGVfc291cmNlIGlz
IG5vdCBOb25lLCBcCiAgICAgICAgInBsZWFzZSBzZXQgdmVyc2lvbmVlci52
ZXJzaW9uZmlsZV9zb3VyY2UiCiAgICBhc3NlcnQgY2ZnLnRhZ19wcmVmaXgg
aXMgbm90IE5vbmUsICJwbGVhc2Ugc2V0IHZlcnNpb25lZXIudGFnX3ByZWZp
eCIKCiAgICB2ZXJzaW9uZmlsZV9hYnMgPSBvcy5wYXRoLmpvaW4ocm9vdCwg
Y2ZnLnZlcnNpb25maWxlX3NvdXJjZSkKCiAgICAjIGV4dHJhY3QgdmVyc2lv
biBmcm9tIGZpcnN0IG9mOiBfdmVyc2lvbi5weSwgVkNTIGNvbW1hbmQgKGUu
Zy4gJ2dpdAogICAgIyBkZXNjcmliZScpLCBwYXJlbnRkaXIuIFRoaXMgaXMg
bWVhbnQgdG8gd29yayBmb3IgZGV2ZWxvcGVycyB1c2luZyBhCiAgICAjIHNv
dXJjZSBjaGVja291dCwgZm9yIHVzZXJzIG9mIGEgdGFyYmFsbCBjcmVhdGVk
IGJ5ICdzZXR1cC5weSBzZGlzdCcsCiAgICAjIGFuZCBmb3IgdXNlcnMgb2Yg
YSB0YXJiYWxsL3ppcGJhbGwgY3JlYXRlZCBieSAnZ2l0IGFyY2hpdmUnIG9y
IGdpdGh1YidzCiAgICAjIGRvd25sb2FkLWZyb20tdGFnIGZlYXR1cmUgb3Ig
dGhlIGVxdWl2YWxlbnQgaW4gb3RoZXIgVkNTZXMuCgogICAgZ2V0X2tleXdv
cmRzX2YgPSBoYW5kbGVycy5nZXQoImdldF9rZXl3b3JkcyIpCiAgICBmcm9t
X2tleXdvcmRzX2YgPSBoYW5kbGVycy5nZXQoImtleXdvcmRzIikKICAgIGlm
IGdldF9rZXl3b3Jkc19mIGFuZCBmcm9tX2tleXdvcmRzX2Y6CiAgICAgICAg
dHJ5OgogICAgICAgICAgICBrZXl3b3JkcyA9IGdldF9rZXl3b3Jkc19mKHZl
cnNpb25maWxlX2FicykKICAgICAgICAgICAgdmVyID0gZnJvbV9rZXl3b3Jk
c19mKGtleXdvcmRzLCBjZmcudGFnX3ByZWZpeCwgdmVyYm9zZSkKICAgICAg
ICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgICAgIHByaW50KCJnb3Qg
dmVyc2lvbiBmcm9tIGV4cGFuZGVkIGtleXdvcmQgJXMiICUgdmVyKQogICAg
ICAgICAgICByZXR1cm4gdmVyCiAgICAgICAgZXhjZXB0IE5vdFRoaXNNZXRo
b2Q6CiAgICAgICAgICAgIHBhc3MKCiAgICB0cnk6CiAgICAgICAgdmVyID0g
dmVyc2lvbnNfZnJvbV9maWxlKHZlcnNpb25maWxlX2FicykKICAgICAgICBp
ZiB2ZXJib3NlOgogICAgICAgICAgICBwcmludCgiZ290IHZlcnNpb24gZnJv
bSBmaWxlICVzICVzIiAlICh2ZXJzaW9uZmlsZV9hYnMsIHZlcikpCiAgICAg
ICAgcmV0dXJuIHZlcgogICAgZXhjZXB0IE5vdFRoaXNNZXRob2Q6CiAgICAg
ICAgcGFzcwoKICAgIGZyb21fdmNzX2YgPSBoYW5kbGVycy5nZXQoInBpZWNl
c19mcm9tX3ZjcyIpCiAgICBpZiBmcm9tX3Zjc19mOgogICAgICAgIHRyeToK
ICAgICAgICAgICAgcGllY2VzID0gZnJvbV92Y3NfZihjZmcudGFnX3ByZWZp
eCwgcm9vdCwgdmVyYm9zZSkKICAgICAgICAgICAgdmVyID0gcmVuZGVyKHBp
ZWNlcywgY2ZnLnN0eWxlKQogICAgICAgICAgICBpZiB2ZXJib3NlOgogICAg
ICAgICAgICAgICAgcHJpbnQoImdvdCB2ZXJzaW9uIGZyb20gVkNTICVzIiAl
IHZlcikKICAgICAgICAgICAgcmV0dXJuIHZlcgogICAgICAgIGV4Y2VwdCBO
b3RUaGlzTWV0aG9kOgogICAgICAgICAgICBwYXNzCgogICAgdHJ5OgogICAg
ICAgIGlmIGNmZy5wYXJlbnRkaXJfcHJlZml4OgogICAgICAgICAgICB2ZXIg
PSB2ZXJzaW9uc19mcm9tX3BhcmVudGRpcihjZmcucGFyZW50ZGlyX3ByZWZp
eCwgcm9vdCwgdmVyYm9zZSkKICAgICAgICAgICAgaWYgdmVyYm9zZToKICAg
ICAgICAgICAgICAgIHByaW50KCJnb3QgdmVyc2lvbiBmcm9tIHBhcmVudGRp
ciAlcyIgJSB2ZXIpCiAgICAgICAgICAgIHJldHVybiB2ZXIKICAgIGV4Y2Vw
dCBOb3RUaGlzTWV0aG9kOgogICAgICAgIHBhc3MKCiAgICBpZiB2ZXJib3Nl
OgogICAgICAgIHByaW50KCJ1bmFibGUgdG8gY29tcHV0ZSB2ZXJzaW9uIikK
CiAgICByZXR1cm4geyJ2ZXJzaW9uIjogIjArdW5rbm93biIsICJmdWxsLXJl
dmlzaW9uaWQiOiBOb25lLAogICAgICAgICAgICAiZGlydHkiOiBOb25lLCAi
ZXJyb3IiOiAidW5hYmxlIHRvIGNvbXB1dGUgdmVyc2lvbiJ9CgoKZGVmIGdl
dF92ZXJzaW9uKCk6CiAgICByZXR1cm4gZ2V0X3ZlcnNpb25zKClbInZlcnNp
b24iXQoKCmRlZiBnZXRfY21kY2xhc3MoKToKICAgIGlmICJ2ZXJzaW9uZWVy
IiBpbiBzeXMubW9kdWxlczoKICAgICAgICBkZWwgc3lzLm1vZHVsZXNbInZl
cnNpb25lZXIiXQogICAgICAgICMgdGhpcyBmaXhlcyB0aGUgInB5dGhvbiBz
ZXR1cC5weSBkZXZlbG9wIiBjYXNlIChhbHNvICdpbnN0YWxsJyBhbmQKICAg
ICAgICAjICdlYXN5X2luc3RhbGwgLicpLCBpbiB3aGljaCBzdWJkZXBlbmRl
bmNpZXMgb2YgdGhlIG1haW4gcHJvamVjdCBhcmUKICAgICAgICAjIGJ1aWx0
ICh1c2luZyBzZXR1cC5weSBiZGlzdF9lZ2cpIGluIHRoZSBzYW1lIHB5dGhv
biBwcm9jZXNzLiBBc3N1bWUKICAgICAgICAjIGEgbWFpbiBwcm9qZWN0IEEg
YW5kIGEgZGVwZW5kZW5jeSBCLCB3aGljaCB1c2UgZGlmZmVyZW50IHZlcnNp
b25zCiAgICAgICAgIyBvZiBWZXJzaW9uZWVyLiBBJ3Mgc2V0dXAucHkgaW1w
b3J0cyBBJ3MgVmVyc2lvbmVlciwgbGVhdmluZyBpdCBpbgogICAgICAgICMg
c3lzLm1vZHVsZXMgYnkgdGhlIHRpbWUgQidzIHNldHVwLnB5IGlzIGV4ZWN1
dGVkLCBjYXVzaW5nIEIgdG8gcnVuCiAgICAgICAgIyB3aXRoIHRoZSB3cm9u
ZyB2ZXJzaW9uZWVyLiBTZXR1cHRvb2xzIHdyYXBzIHRoZSBzdWItZGVwIGJ1
aWxkcyBpbiBhCiAgICAgICAgIyBzYW5kYm94IHRoYXQgcmVzdG9yZXMgc3lz
Lm1vZHVsZXMgdG8gaXQncyBwcmUtYnVpbGQgc3RhdGUsIHNvIHRoZQogICAg
ICAgICMgcGFyZW50IGlzIHByb3RlY3RlZCBhZ2FpbnN0IHRoZSBjaGlsZCdz
ICJpbXBvcnQgdmVyc2lvbmVlciIuIEJ5CiAgICAgICAgIyByZW1vdmluZyBv
dXJzZWx2ZXMgZnJvbSBzeXMubW9kdWxlcyBoZXJlLCBiZWZvcmUgdGhlIGNo
aWxkIGJ1aWxkCiAgICAgICAgIyBoYXBwZW5zLCB3ZSBwcm90ZWN0IHRoZSBj
aGlsZCBmcm9tIHRoZSBwYXJlbnQncyB2ZXJzaW9uZWVyIHRvby4KICAgICAg
ICAjIEFsc28gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS93YXJuZXIvcHl0aG9u
LXZlcnNpb25lZXIvaXNzdWVzLzUyCgogICAgY21kcyA9IHt9CgogICAgIyB3
ZSBhZGQgInZlcnNpb24iIHRvIGJvdGggZGlzdHV0aWxzIGFuZCBzZXR1cHRv
b2xzCiAgICBmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBDb21tYW5kCgog
ICAgY2xhc3MgY21kX3ZlcnNpb24oQ29tbWFuZCk6CiAgICAgICAgZGVzY3Jp
cHRpb24gPSAicmVwb3J0IGdlbmVyYXRlZCB2ZXJzaW9uIHN0cmluZyIKICAg
ICAgICB1c2VyX29wdGlvbnMgPSBbXQogICAgICAgIGJvb2xlYW5fb3B0aW9u
cyA9IFtdCgogICAgICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6
CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgZGVmIGZpbmFsaXplX29wdGlv
bnMoc2VsZik6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgZGVmIHJ1bihz
ZWxmKToKICAgICAgICAgICAgdmVycyA9IGdldF92ZXJzaW9ucyh2ZXJib3Nl
PVRydWUpCiAgICAgICAgICAgIHByaW50KCJWZXJzaW9uOiAlcyIgJSB2ZXJz
WyJ2ZXJzaW9uIl0pCiAgICAgICAgICAgIHByaW50KCIgZnVsbC1yZXZpc2lv
bmlkOiAlcyIgJSB2ZXJzLmdldCgiZnVsbC1yZXZpc2lvbmlkIikpCiAgICAg
ICAgICAgIHByaW50KCIgZGlydHk6ICVzIiAlIHZlcnMuZ2V0KCJkaXJ0eSIp
KQogICAgICAgICAgICBpZiB2ZXJzWyJlcnJvciJdOgogICAgICAgICAgICAg
ICAgcHJpbnQoIiBlcnJvcjogJXMiICUgdmVyc1siZXJyb3IiXSkKICAgIGNt
ZHNbInZlcnNpb24iXSA9IGNtZF92ZXJzaW9uCgogICAgIyB3ZSBvdmVycmlk
ZSAiYnVpbGRfcHkiIGluIGJvdGggZGlzdHV0aWxzIGFuZCBzZXR1cHRvb2xz
CiAgICAjCiAgICAjIG1vc3QgaW52b2NhdGlvbiBwYXRod2F5cyBlbmQgdXAg
cnVubmluZyBidWlsZF9weToKICAgICMgIGRpc3R1dGlscy9idWlsZCAtPiBi
dWlsZF9weQogICAgIyAgZGlzdHV0aWxzL2luc3RhbGwgLT4gZGlzdHV0aWxz
L2J1aWxkIC0+Li4KICAgICMgIHNldHVwdG9vbHMvYmRpc3Rfd2hlZWwgLT4g
ZGlzdHV0aWxzL2luc3RhbGwgLT4uLgogICAgIyAgc2V0dXB0b29scy9iZGlz
dF9lZ2cgLT4gZGlzdHV0aWxzL2luc3RhbGxfbGliIC0+IGJ1aWxkX3B5CiAg
ICAjICBzZXR1cHRvb2xzL2luc3RhbGwgLT4gYmRpc3RfZWdnIC0+Li4KICAg
ICMgIHNldHVwdG9vbHMvZGV2ZWxvcCAtPiA/CgogICAgZnJvbSBkaXN0dXRp
bHMuY29tbWFuZC5idWlsZF9weSBpbXBvcnQgYnVpbGRfcHkgYXMgX2J1aWxk
X3B5CgogICAgY2xhc3MgY21kX2J1aWxkX3B5KF9idWlsZF9weSk6CiAgICAg
ICAgZGVmIHJ1bihzZWxmKToKICAgICAgICAgICAgcm9vdCA9IGdldF9yb290
KCkKICAgICAgICAgICAgY2ZnID0gZ2V0X2NvbmZpZ19mcm9tX3Jvb3Qocm9v
dCkKICAgICAgICAgICAgdmVyc2lvbnMgPSBnZXRfdmVyc2lvbnMoKQogICAg
ICAgICAgICBfYnVpbGRfcHkucnVuKHNlbGYpCiAgICAgICAgICAgICMgbm93
IGxvY2F0ZSBfdmVyc2lvbi5weSBpbiB0aGUgbmV3IGJ1aWxkLyBkaXJlY3Rv
cnkgYW5kIHJlcGxhY2UKICAgICAgICAgICAgIyBpdCB3aXRoIGFuIHVwZGF0
ZWQgdmFsdWUKICAgICAgICAgICAgaWYgY2ZnLnZlcnNpb25maWxlX2J1aWxk
OgogICAgICAgICAgICAgICAgdGFyZ2V0X3ZlcnNpb25maWxlID0gb3MucGF0
aC5qb2luKHNlbGYuYnVpbGRfbGliLAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZy52ZXJzaW9uZmlsZV9i
dWlsZCkKICAgICAgICAgICAgICAgIHByaW50KCJVUERBVElORyAlcyIgJSB0
YXJnZXRfdmVyc2lvbmZpbGUpCiAgICAgICAgICAgICAgICB3cml0ZV90b192
ZXJzaW9uX2ZpbGUodGFyZ2V0X3ZlcnNpb25maWxlLCB2ZXJzaW9ucykKICAg
IGNtZHNbImJ1aWxkX3B5Il0gPSBjbWRfYnVpbGRfcHkKCiAgICBpZiAiY3hf
RnJlZXplIiBpbiBzeXMubW9kdWxlczogICMgY3hfZnJlZXplIGVuYWJsZWQ/
CiAgICAgICAgZnJvbSBjeF9GcmVlemUuZGlzdCBpbXBvcnQgYnVpbGRfZXhl
IGFzIF9idWlsZF9leGUKCiAgICAgICAgY2xhc3MgY21kX2J1aWxkX2V4ZShf
YnVpbGRfZXhlKToKICAgICAgICAgICAgZGVmIHJ1bihzZWxmKToKICAgICAg
ICAgICAgICAgIHJvb3QgPSBnZXRfcm9vdCgpCiAgICAgICAgICAgICAgICBj
ZmcgPSBnZXRfY29uZmlnX2Zyb21fcm9vdChyb290KQogICAgICAgICAgICAg
ICAgdmVyc2lvbnMgPSBnZXRfdmVyc2lvbnMoKQogICAgICAgICAgICAgICAg
dGFyZ2V0X3ZlcnNpb25maWxlID0gY2ZnLnZlcnNpb25maWxlX3NvdXJjZQog
ICAgICAgICAgICAgICAgcHJpbnQoIlVQREFUSU5HICVzIiAlIHRhcmdldF92
ZXJzaW9uZmlsZSkKICAgICAgICAgICAgICAgIHdyaXRlX3RvX3ZlcnNpb25f
ZmlsZSh0YXJnZXRfdmVyc2lvbmZpbGUsIHZlcnNpb25zKQoKICAgICAgICAg
ICAgICAgIF9idWlsZF9leGUucnVuKHNlbGYpCiAgICAgICAgICAgICAgICBv
cy51bmxpbmsodGFyZ2V0X3ZlcnNpb25maWxlKQogICAgICAgICAgICAgICAg
d2l0aCBvcGVuKGNmZy52ZXJzaW9uZmlsZV9zb3VyY2UsICJ3IikgYXMgZjoK
ICAgICAgICAgICAgICAgICAgICBMT05HID0gTE9OR19WRVJTSU9OX1BZW2Nm
Zy5WQ1NdCiAgICAgICAgICAgICAgICAgICAgZi53cml0ZShMT05HICUKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHsiRE9MTEFSIjogIiQiLAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICJTVFlMRSI6IGNmZy5zdHlsZSwK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFHX1BSRUZJWCI6IGNm
Zy50YWdfcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQ
QVJFTlRESVJfUFJFRklYIjogY2ZnLnBhcmVudGRpcl9wcmVmaXgsCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIlZFUlNJT05GSUxFX1NPVVJDRSI6
IGNmZy52ZXJzaW9uZmlsZV9zb3VyY2UsCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgfSkKICAgICAgICBjbWRzWyJidWlsZF9leGUiXSA9IGNtZF9i
dWlsZF9leGUKICAgICAgICBkZWwgY21kc1siYnVpbGRfcHkiXQoKICAgICMg
d2Ugb3ZlcnJpZGUgZGlmZmVyZW50ICJzZGlzdCIgY29tbWFuZHMgZm9yIGJv
dGggZW52aXJvbm1lbnRzCiAgICBpZiAic2V0dXB0b29scyIgaW4gc3lzLm1v
ZHVsZXM6CiAgICAgICAgZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuc2Rpc3Qg
aW1wb3J0IHNkaXN0IGFzIF9zZGlzdAogICAgZWxzZToKICAgICAgICBmcm9t
IGRpc3R1dGlscy5jb21tYW5kLnNkaXN0IGltcG9ydCBzZGlzdCBhcyBfc2Rp
c3QKCiAgICBjbGFzcyBjbWRfc2Rpc3QoX3NkaXN0KToKICAgICAgICBkZWYg
cnVuKHNlbGYpOgogICAgICAgICAgICB2ZXJzaW9ucyA9IGdldF92ZXJzaW9u
cygpCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb25lZXJfZ2VuZXJhdGVkX3Zl
cnNpb25zID0gdmVyc2lvbnMKICAgICAgICAgICAgIyB1bmxlc3Mgd2UgdXBk
YXRlIHRoaXMsIHRoZSBjb21tYW5kIHdpbGwga2VlcCB1c2luZyB0aGUgb2xk
CiAgICAgICAgICAgICMgdmVyc2lvbgogICAgICAgICAgICBzZWxmLmRpc3Ry
aWJ1dGlvbi5tZXRhZGF0YS52ZXJzaW9uID0gdmVyc2lvbnNbInZlcnNpb24i
XQogICAgICAgICAgICByZXR1cm4gX3NkaXN0LnJ1bihzZWxmKQoKICAgICAg
ICBkZWYgbWFrZV9yZWxlYXNlX3RyZWUoc2VsZiwgYmFzZV9kaXIsIGZpbGVz
KToKICAgICAgICAgICAgcm9vdCA9IGdldF9yb290KCkKICAgICAgICAgICAg
Y2ZnID0gZ2V0X2NvbmZpZ19mcm9tX3Jvb3Qocm9vdCkKICAgICAgICAgICAg
X3NkaXN0Lm1ha2VfcmVsZWFzZV90cmVlKHNlbGYsIGJhc2VfZGlyLCBmaWxl
cykKICAgICAgICAgICAgIyBub3cgbG9jYXRlIF92ZXJzaW9uLnB5IGluIHRo
ZSBuZXcgYmFzZV9kaXIgZGlyZWN0b3J5CiAgICAgICAgICAgICMgKHJlbWVt
YmVyaW5nIHRoYXQgaXQgbWF5IGJlIGEgaGFyZGxpbmspIGFuZCByZXBsYWNl
IGl0IHdpdGggYW4KICAgICAgICAgICAgIyB1cGRhdGVkIHZhbHVlCiAgICAg
ICAgICAgIHRhcmdldF92ZXJzaW9uZmlsZSA9IG9zLnBhdGguam9pbihiYXNl
X2RpciwgY2ZnLnZlcnNpb25maWxlX3NvdXJjZSkKICAgICAgICAgICAgcHJp
bnQoIlVQREFUSU5HICVzIiAlIHRhcmdldF92ZXJzaW9uZmlsZSkKICAgICAg
ICAgICAgd3JpdGVfdG9fdmVyc2lvbl9maWxlKHRhcmdldF92ZXJzaW9uZmls
ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3Zl
cnNpb25lZXJfZ2VuZXJhdGVkX3ZlcnNpb25zKQogICAgY21kc1sic2Rpc3Qi
XSA9IGNtZF9zZGlzdAoKICAgIHJldHVybiBjbWRzCgoKQ09ORklHX0VSUk9S
ID0gIiIiCnNldHVwLmNmZyBpcyBtaXNzaW5nIHRoZSBuZWNlc3NhcnkgVmVy
c2lvbmVlciBjb25maWd1cmF0aW9uLiBZb3UgbmVlZAphIHNlY3Rpb24gbGlr
ZToKCiBbdmVyc2lvbmVlcl0KIFZDUyA9IGdpdAogc3R5bGUgPSBwZXA0NDAK
IHZlcnNpb25maWxlX3NvdXJjZSA9IHNyYy9teXByb2plY3QvX3ZlcnNpb24u
cHkKIHZlcnNpb25maWxlX2J1aWxkID0gbXlwcm9qZWN0L192ZXJzaW9uLnB5
CiB0YWdfcHJlZml4ID0gIiIKIHBhcmVudGRpcl9wcmVmaXggPSBteXByb2pl
Y3QtCgpZb3Ugd2lsbCBhbHNvIG5lZWQgdG8gZWRpdCB5b3VyIHNldHVwLnB5
IHRvIHVzZSB0aGUgcmVzdWx0czoKCiBpbXBvcnQgdmVyc2lvbmVlcgogc2V0
dXAodmVyc2lvbj12ZXJzaW9uZWVyLmdldF92ZXJzaW9uKCksCiAgICAgICBj
bWRjbGFzcz12ZXJzaW9uZWVyLmdldF9jbWRjbGFzcygpLCAuLi4pCgpQbGVh
c2UgcmVhZCB0aGUgZG9jc3RyaW5nIGluIC4vdmVyc2lvbmVlci5weSBmb3Ig
Y29uZmlndXJhdGlvbiBpbnN0cnVjdGlvbnMsCmVkaXQgc2V0dXAuY2ZnLCBh
bmQgcmUtcnVuIHRoZSBpbnN0YWxsZXIgb3IgJ3B5dGhvbiB2ZXJzaW9uZWVy
LnB5IHNldHVwJy4KIiIiCgpTQU1QTEVfQ09ORklHID0gIiIiCiMgU2VlIHRo
ZSBkb2NzdHJpbmcgaW4gdmVyc2lvbmVlci5weSBmb3IgaW5zdHJ1Y3Rpb25z
LiBOb3RlIHRoYXQgeW91IG11c3QKIyByZS1ydW4gJ3ZlcnNpb25lZXIucHkg
c2V0dXAnIGFmdGVyIGNoYW5naW5nIHRoaXMgc2VjdGlvbiwgYW5kIGNvbW1p
dCB0aGUKIyByZXN1bHRpbmcgZmlsZXMuCgpbdmVyc2lvbmVlcl0KI1ZDUyA9
IGdpdAojc3R5bGUgPSBwZXA0NDAKI3ZlcnNpb25maWxlX3NvdXJjZSA9CiN2
ZXJzaW9uZmlsZV9idWlsZCA9CiN0YWdfcHJlZml4ID0KI3BhcmVudGRpcl9w
cmVmaXggPQoKIiIiCgpJTklUX1BZX1NOSVBQRVQgPSAiIiIKZnJvbSAuX3Zl
cnNpb24gaW1wb3J0IGdldF92ZXJzaW9ucwpfX3ZlcnNpb25fXyA9IGdldF92
ZXJzaW9ucygpWyd2ZXJzaW9uJ10KZGVsIGdldF92ZXJzaW9ucwoiIiIKCgpk
ZWYgZG9fc2V0dXAoKToKICAgIHJvb3QgPSBnZXRfcm9vdCgpCiAgICB0cnk6
CiAgICAgICAgY2ZnID0gZ2V0X2NvbmZpZ19mcm9tX3Jvb3Qocm9vdCkKICAg
IGV4Y2VwdCAoRW52aXJvbm1lbnRFcnJvciwgY29uZmlncGFyc2VyLk5vU2Vj
dGlvbkVycm9yLAogICAgICAgICAgICBjb25maWdwYXJzZXIuTm9PcHRpb25F
cnJvcikgYXMgZToKICAgICAgICBpZiBpc2luc3RhbmNlKGUsIChFbnZpcm9u
bWVudEVycm9yLCBjb25maWdwYXJzZXIuTm9TZWN0aW9uRXJyb3IpKToKICAg
ICAgICAgICAgcHJpbnQoIkFkZGluZyBzYW1wbGUgdmVyc2lvbmVlciBjb25m
aWcgdG8gc2V0dXAuY2ZnIiwKICAgICAgICAgICAgICAgICAgZmlsZT1zeXMu
c3RkZXJyKQogICAgICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKHJv
b3QsICJzZXR1cC5jZmciKSwgImEiKSBhcyBmOgogICAgICAgICAgICAgICAg
Zi53cml0ZShTQU1QTEVfQ09ORklHKQogICAgICAgIHByaW50KENPTkZJR19F
UlJPUiwgZmlsZT1zeXMuc3RkZXJyKQogICAgICAgIHJldHVybiAxCgogICAg
cHJpbnQoIiBjcmVhdGluZyAlcyIgJSBjZmcudmVyc2lvbmZpbGVfc291cmNl
KQogICAgd2l0aCBvcGVuKGNmZy52ZXJzaW9uZmlsZV9zb3VyY2UsICJ3Iikg
YXMgZjoKICAgICAgICBMT05HID0gTE9OR19WRVJTSU9OX1BZW2NmZy5WQ1Nd
CiAgICAgICAgZi53cml0ZShMT05HICUgeyJET0xMQVIiOiAiJCIsCiAgICAg
ICAgICAgICAgICAgICAgICAgICJTVFlMRSI6IGNmZy5zdHlsZSwKICAgICAg
ICAgICAgICAgICAgICAgICAgIlRBR19QUkVGSVgiOiBjZmcudGFnX3ByZWZp
eCwKICAgICAgICAgICAgICAgICAgICAgICAgIlBBUkVOVERJUl9QUkVGSVgi
OiBjZmcucGFyZW50ZGlyX3ByZWZpeCwKICAgICAgICAgICAgICAgICAgICAg
ICAgIlZFUlNJT05GSUxFX1NPVVJDRSI6IGNmZy52ZXJzaW9uZmlsZV9zb3Vy
Y2UsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgaXB5ID0gb3Mu
cGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShjZmcudmVyc2lvbmZpbGVfc291
cmNlKSwKICAgICAgICAgICAgICAgICAgICAgICAiX19pbml0X18ucHkiKQog
ICAgaWYgb3MucGF0aC5leGlzdHMoaXB5KToKICAgICAgICB0cnk6CiAgICAg
ICAgICAgIHdpdGggb3BlbihpcHksICJyIikgYXMgZjoKICAgICAgICAgICAg
ICAgIG9sZCA9IGYucmVhZCgpCiAgICAgICAgZXhjZXB0IEVudmlyb25tZW50
RXJyb3I6CiAgICAgICAgICAgIG9sZCA9ICIiCiAgICAgICAgaWYgSU5JVF9Q
WV9TTklQUEVUIG5vdCBpbiBvbGQ6CiAgICAgICAgICAgIHByaW50KCIgYXBw
ZW5kaW5nIHRvICVzIiAlIGlweSkKICAgICAgICAgICAgd2l0aCBvcGVuKGlw
eSwgImEiKSBhcyBmOgogICAgICAgICAgICAgICAgZi53cml0ZShJTklUX1BZ
X1NOSVBQRVQpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJpbnQoIiAl
cyB1bm1vZGlmaWVkIiAlIGlweSkKICAgIGVsc2U6CiAgICAgICAgcHJpbnQo
IiAlcyBkb2Vzbid0IGV4aXN0LCBvayIgJSBpcHkpCiAgICAgICAgaXB5ID0g
Tm9uZQoKICAgICMgTWFrZSBzdXJlIGJvdGggdGhlIHRvcC1sZXZlbCAidmVy
c2lvbmVlci5weSIgYW5kIHZlcnNpb25maWxlX3NvdXJjZQogICAgIyAoUEtH
L192ZXJzaW9uLnB5LCB1c2VkIGJ5IHJ1bnRpbWUgY29kZSkgYXJlIGluIE1B
TklGRVNULmluLCBzbwogICAgIyB0aGV5J2xsIGJlIGNvcGllZCBpbnRvIHNv
dXJjZSBkaXN0cmlidXRpb25zLiBQaXAgd29uJ3QgYmUgYWJsZSB0bwogICAg
IyBpbnN0YWxsIHRoZSBwYWNrYWdlIHdpdGhvdXQgdGhpcy4KICAgIG1hbmlm
ZXN0X2luID0gb3MucGF0aC5qb2luKHJvb3QsICJNQU5JRkVTVC5pbiIpCiAg
ICBzaW1wbGVfaW5jbHVkZXMgPSBzZXQoKQogICAgdHJ5OgogICAgICAgIHdp
dGggb3BlbihtYW5pZmVzdF9pbiwgInIiKSBhcyBmOgogICAgICAgICAgICBm
b3IgbGluZSBpbiBmOgogICAgICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3
aXRoKCJpbmNsdWRlICIpOgogICAgICAgICAgICAgICAgICAgIGZvciBpbmNs
dWRlIGluIGxpbmUuc3BsaXQoKVsxOl06CiAgICAgICAgICAgICAgICAgICAg
ICAgIHNpbXBsZV9pbmNsdWRlcy5hZGQoaW5jbHVkZSkKICAgIGV4Y2VwdCBF
bnZpcm9ubWVudEVycm9yOgogICAgICAgIHBhc3MKICAgICMgVGhhdCBkb2Vz
bid0IGNvdmVyIGV2ZXJ5dGhpbmcgTUFOSUZFU1QuaW4gY2FuIGRvCiAgICAj
IChodHRwOi8vZG9jcy5weXRob24ub3JnLzIvZGlzdHV0aWxzL3NvdXJjZWRp
c3QuaHRtbCNjb21tYW5kcyksIHNvCiAgICAjIGl0IG1pZ2h0IGdpdmUgc29t
ZSBmYWxzZSBuZWdhdGl2ZXMuIEFwcGVuZGluZyByZWR1bmRhbnQgJ2luY2x1
ZGUnCiAgICAjIGxpbmVzIGlzIHNhZmUsIHRob3VnaC4KICAgIGlmICJ2ZXJz
aW9uZWVyLnB5IiBub3QgaW4gc2ltcGxlX2luY2x1ZGVzOgogICAgICAgIHBy
aW50KCIgYXBwZW5kaW5nICd2ZXJzaW9uZWVyLnB5JyB0byBNQU5JRkVTVC5p
biIpCiAgICAgICAgd2l0aCBvcGVuKG1hbmlmZXN0X2luLCAiYSIpIGFzIGY6
CiAgICAgICAgICAgIGYud3JpdGUoImluY2x1ZGUgdmVyc2lvbmVlci5weVxu
IikKICAgIGVsc2U6CiAgICAgICAgcHJpbnQoIiAndmVyc2lvbmVlci5weScg
YWxyZWFkeSBpbiBNQU5JRkVTVC5pbiIpCiAgICBpZiBjZmcudmVyc2lvbmZp
bGVfc291cmNlIG5vdCBpbiBzaW1wbGVfaW5jbHVkZXM6CiAgICAgICAgcHJp
bnQoIiBhcHBlbmRpbmcgdmVyc2lvbmZpbGVfc291cmNlICgnJXMnKSB0byBN
QU5JRkVTVC5pbiIgJQogICAgICAgICAgICAgIGNmZy52ZXJzaW9uZmlsZV9z
b3VyY2UpCiAgICAgICAgd2l0aCBvcGVuKG1hbmlmZXN0X2luLCAiYSIpIGFz
IGY6CiAgICAgICAgICAgIGYud3JpdGUoImluY2x1ZGUgJXNcbiIgJSBjZmcu
dmVyc2lvbmZpbGVfc291cmNlKQogICAgZWxzZToKICAgICAgICBwcmludCgi
IHZlcnNpb25maWxlX3NvdXJjZSBhbHJlYWR5IGluIE1BTklGRVNULmluIikK
CiAgICAjIE1ha2UgVkNTLXNwZWNpZmljIGNoYW5nZXMuIEZvciBnaXQsIHRo
aXMgbWVhbnMgY3JlYXRpbmcvY2hhbmdpbmcKICAgICMgLmdpdGF0dHJpYnV0
ZXMgdG8gbWFyayBfdmVyc2lvbi5weSBmb3IgZXhwb3J0LXRpbWUga2V5d29y
ZAogICAgIyBzdWJzdGl0dXRpb24uCiAgICBkb192Y3NfaW5zdGFsbChtYW5p
ZmVzdF9pbiwgY2ZnLnZlcnNpb25maWxlX3NvdXJjZSwgaXB5KQogICAgcmV0
dXJuIDAKCgpkZWYgc2Nhbl9zZXR1cF9weSgpOgogICAgZm91bmQgPSBzZXQo
KQogICAgc2V0dGVycyA9IEZhbHNlCiAgICBlcnJvcnMgPSAwCiAgICB3aXRo
IG9wZW4oInNldHVwLnB5IiwgInIiKSBhcyBmOgogICAgICAgIGZvciBsaW5l
IGluIGYucmVhZGxpbmVzKCk6CiAgICAgICAgICAgIGlmICJpbXBvcnQgdmVy
c2lvbmVlciIgaW4gbGluZToKICAgICAgICAgICAgICAgIGZvdW5kLmFkZCgi
aW1wb3J0IikKICAgICAgICAgICAgaWYgInZlcnNpb25lZXIuZ2V0X2NtZGNs
YXNzKCkiIGluIGxpbmU6CiAgICAgICAgICAgICAgICBmb3VuZC5hZGQoImNt
ZGNsYXNzIikKICAgICAgICAgICAgaWYgInZlcnNpb25lZXIuZ2V0X3ZlcnNp
b24oKSIgaW4gbGluZToKICAgICAgICAgICAgICAgIGZvdW5kLmFkZCgiZ2V0
X3ZlcnNpb24iKQogICAgICAgICAgICBpZiAidmVyc2lvbmVlci5WQ1MiIGlu
IGxpbmU6CiAgICAgICAgICAgICAgICBzZXR0ZXJzID0gVHJ1ZQogICAgICAg
ICAgICBpZiAidmVyc2lvbmVlci52ZXJzaW9uZmlsZV9zb3VyY2UiIGluIGxp
bmU6CiAgICAgICAgICAgICAgICBzZXR0ZXJzID0gVHJ1ZQogICAgaWYgbGVu
KGZvdW5kKSAhPSAzOgogICAgICAgIHByaW50KCIiKQogICAgICAgIHByaW50
KCJZb3VyIHNldHVwLnB5IGFwcGVhcnMgdG8gYmUgbWlzc2luZyBzb21lIGlt
cG9ydGFudCBpdGVtcyIpCiAgICAgICAgcHJpbnQoIihidXQgSSBtaWdodCBi
ZSB3cm9uZykuIFBsZWFzZSBtYWtlIHN1cmUgaXQgaGFzIHNvbWV0aGluZyIp
CiAgICAgICAgcHJpbnQoInJvdWdobHkgbGlrZSB0aGUgZm9sbG93aW5nOiIp
CiAgICAgICAgcHJpbnQoIiIpCiAgICAgICAgcHJpbnQoIiBpbXBvcnQgdmVy
c2lvbmVlciIpCiAgICAgICAgcHJpbnQoIiBzZXR1cCggdmVyc2lvbj12ZXJz
aW9uZWVyLmdldF92ZXJzaW9uKCksIikKICAgICAgICBwcmludCgiICAgICAg
ICBjbWRjbGFzcz12ZXJzaW9uZWVyLmdldF9jbWRjbGFzcygpLCAgLi4uKSIp
CiAgICAgICAgcHJpbnQoIiIpCiAgICAgICAgZXJyb3JzICs9IDEKICAgIGlm
IHNldHRlcnM6CiAgICAgICAgcHJpbnQoIllvdSBzaG91bGQgcmVtb3ZlIGxp
bmVzIGxpa2UgJ3ZlcnNpb25lZXIuVkNTID0gJyBhbmQiKQogICAgICAgIHBy
aW50KCIndmVyc2lvbmVlci52ZXJzaW9uZmlsZV9zb3VyY2UgPSAnIC4gVGhp
cyBjb25maWd1cmF0aW9uIikKICAgICAgICBwcmludCgibm93IGxpdmVzIGlu
IHNldHVwLmNmZywgYW5kIHNob3VsZCBiZSByZW1vdmVkIGZyb20gc2V0dXAu
cHkiKQogICAgICAgIHByaW50KCIiKQogICAgICAgIGVycm9ycyArPSAxCiAg
ICByZXR1cm4gZXJyb3JzCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgog
ICAgY21kID0gc3lzLmFyZ3ZbMV0KICAgIGlmIGNtZCA9PSAic2V0dXAiOgog
ICAgICAgIGVycm9ycyA9IGRvX3NldHVwKCkKICAgICAgICBlcnJvcnMgKz0g
c2Nhbl9zZXR1cF9weSgpCiAgICAgICAgaWYgZXJyb3JzOgogICAgICAgICAg
ICBzeXMuZXhpdCgxKQo=

"""
newver = "0.15"

if len(sys.argv) < 2:
    print("Usage: versioneer install")
    sys.exit(1)

command = sys.argv[1]
if command == "version":
    print("versioneer (installer) %s" % newver)
    sys.exit(0)

if command != "install":
    print("Usage: versioneer install")
    sys.exit(1)

v = base64.b64decode(VERSIONEER_b64)
if os.path.exists("versioneer.py"):
    for line in open("versioneer.py").readlines()[:5]:
        if line.startswith("# Version: "):
            oldver = line[len("# Version: "):].strip()
            if oldver != newver:
                print("replacing old versioneer.py (%s)" % oldver)
            break
    else:
        print("overwriting existing versioneer.py")
with open("versioneer.py", "wb") as f:
    f.write(v)
print("versioneer.py (%s) installed into local tree" % newver)
print("Now running 'versioneer.py setup' to install the generated files..")
os.execl(sys.executable, sys.executable, "versioneer.py", "setup")
