[Zope] Worldpilot and me ... (and UW-IMAP)

Andrew Kenneth Milton akm@mail.theinternet.com.au
Sat, 15 Apr 2000 10:02:24 +1000 (EST)


--ELM955756944-39062-2_
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit

+----[ Christian Pfeiffer ]---------------------------------------------
|
| > Perhaps we can add seperationCharacter to IMAPHACK.py, although it'd be real nice
| > if it worked it out itself, because I have two worldpilot objects in the same Zope
| > Site pointing at two different IMAP Servers.
| 
| Hi,
| 
| I'd love to have a look at your hacks ;-) 
| 
| Do you have an idea where to look for that '.' vs. '/' problem? I think
| adding a choice in IMAPHACK.py should be easy (but I know very little
| about IMAP internals).

Ok here's a copy of WorldPilot.py and WPUtil.py, you should run diff on these
against your native copy and make sure that you are happy I haven't slipped any
trojans in.

You should also be aware that this works for me, but, may not work for anyone else,
and, some of these changes are extremely ugly.

e.g. Exchange refuses to return the folder list in hierarchical order, so sub folders
do not get displayed. My fix is disgusting, and I don't think it works for more than
one folder level (but, that's all I need at this point).

If I thought that these were elegant solutions I would have posted patches 
when I finished them :-)

There must be a few non-7bit chars in the WorldPilot.py file because it's trying
to attach as binary... (sorry).

-- 
Totally Holistic Enterprises Internet|  P:+61 7 3870 0066   | Andrew Milton
The Internet (Aust) Pty Ltd          |  F:+61 7 3870 4477   | 
ACN: 082 081 472                     |  M:+61 416 022 411   | Carpe Daemon
PO Box 837 Indooroopilly QLD 4068    |akm@theinternet.com.au| 

--ELM955756944-39062-2_
Content-Type: text/plain; charset=US-ASCII
Content-Disposition: attachment; filename=WorldPilot.py
Content-Description: WorldPilot.py
Content-Transfer-Encoding: base64

IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMNCiMNCiMgV29ybGRQaWxvdCBQdWJsaWMgTGljZW5zZSAoV1BMKSBW
ZXJzaW9uIDAuOTkNCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyAN
CiMgQ29weXJpZ2h0IChjKSBOZXViZXJnZXIgJiBIdWdoZXMgR21iSC4gIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuDQojIENvcHlyaWdodCAoYykgUnlhbiBIdWdoZXMuICAgICAgICAgICAgICBBbGwgcmln
aHRzIHJlc2VydmVkLg0KIyANCiMgDQojIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KIyBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQojIG1l
dDoNCiMgDQojIDEuIFJlZGlzdHJpYnV0aW9ucyBpbiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0DQojICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMs
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQojIA0KIyAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodA0KIyAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluDQojICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUNCiMgICAgZGlzdHJpYnV0aW9uLg0KIyANCiMgMy4gTmV1YmVyZ2VyICYg
SHVnaGVzIEdtYkggcmVxdWVzdHMgdGhhdCBhdHRyaWJ1dGlvbiBiZSBnaXZlbiB0bw0KIyAgICBX
b3JsZHBpbG90IGluIGFueSBtYW5uZXIgcG9zc2libGUuIFdvcmxkcGlsb3QgaW5jbHVkZXMgYQ0K
IyAgICAid29ybGRwaWxvdCIgYnV0dG9uIHRoYXQgaXMgaW5zdGFsbGVkIGJ5IGRlZmF1bHQuIFdo
aWxlIGl0IGlzIG5vdCBhDQojICAgIGxpY2Vuc2UgdmlvbGF0aW9uIHRvIHJlbW92ZSB0aGlzIGJ1
dHRvbiwgaXQgaXMgcmVxdWVzdGVkIHRoYXQgdGhlDQojICAgIGF0dHJpYnV0aW9uIHJlbWFpbi4g
QSBzaWduaWZpY2FudCBpbnZlc3RtZW50IGhhcyBiZWVuIHB1dCBpbnRvDQojICAgIHdvcmxkcGls
b3QsIGFuZCB0aGlzIGVmZm9ydCB3aWxsIGNvbnRpbnVlIGlmIHRoZSB3b3JsZHBpbG90IGNvbW11
bml0eQ0KIyAgICBjb250aW51ZXMgdG8gZ3Jvdy4gVGhpcyBpcyBvbmUgd2F5IHRvIGFzc3VyZSB0
aGF0IGdyb3d0aC4NCiMgDQojIDQuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgYW5kIGRvY3Vt
ZW50YXRpb24gbWVudGlvbmluZw0KIyAgICBmZWF0dXJlcyBkZXJpdmVkIGZyb20gb3IgdXNlIG9m
IHRoaXMgc29mdHdhcmUgbXVzdCBkaXNwbGF5DQojICAgIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVk
Z2VtZW50Og0KIyANCiMgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVs
b3BlZCBieSBOZXViZXJnZXIgJiBIdWdoZXMNCiMgICAgICBHbWJIIGZvciB1c2UgaW4gdGhlIFdv
cmxkcGlsb3QgT3JnYW5pemVyIGFuZCBNZXNzYWdpbmcgU2VydmVyDQojICAgICAgKGh0dHA6Ly93
d3cud29ybGRwaWxvdC5vcmcvKS4iDQojIA0KIyAgICBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgcHJv
ZHVjdCBiZWluZyBhZHZlcnRpc2VkIGluY2x1ZGVzIGFuDQojICAgIGludGFjdCBXb3JsZFBpbG90
IGRpc3RyaWJ1dGlvbiAod2l0aCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5jbHVkZWQpDQojICAg
IHRoZW4gdGhpcyBjbGF1c2UgaXMgd2FpdmVkLg0KIyANCiMgNS4gTmFtZXMgYXNzb2NpYXRlZCB3
aXRoIFdvcmxkcGlsb3Qgb3IgTmV1YmVyZ2VyICYgSHVnaGVzIEdtYkgNCiMgICAgbXVzdCBub3Qg
YmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMN
CiMgICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gZnJvbSBOZXVi
ZXJnZXIgJiBIdWdoZXMgR21iSC4NCiMgDQojIDYuIE1vZGlmaWVkIHJlZGlzdHJpYnV0aW9ucyBv
ZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluDQojICAgIHRoZSBmb2xsb3dpbmcgYWNr
bm93bGVkZ21lbnQ6DQojIA0KIyAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUg
ZGV2ZWxvcGVkIGJ5IE5ldWJlcmdlciAmIEh1Z2hlcw0KIyAgICAgIEdtYkggZm9yIHVzZSBpbiB0
aGUgV29ybGRwaWxvdCBPcmdhbml6ZXIgYW5kIE1lc3NhZ2luZyBTZXJ2ZXINCiMgICAgICAoaHR0
cDovL3d3dy53b3JsZHBpbG90Lm9yZy8pLiINCiMgDQojICAgIEludGFjdCAocmUtKWRpc3RyaWJ1
dGlvbnMgb2YgYW55IG9mZmljaWFsIFdvcmxkUGlsb3QgcmVsZWFzZSBkbyBub3QNCiMgICAgcmVx
dWlyZSBhbiBleHRlcm5hbCBhY2tub3dsZWRnZW1lbnQuDQojIA0KIyA3LiBNb2RpZmljYXRpb25z
IGFyZSBlbmNvdXJhZ2VkIGJ1dCBtdXN0IGJlIHBhY2thZ2VkIHNlcGFyYXRlbHkgYXMNCiMgICAg
cGF0Y2hlcyB0byBvZmZpY2lhbCBXb3JsZFBpbG90IHJlbGVhc2VzLiAgRGlzdHJpYnV0aW9ucyB0
aGF0IGRvIG5vdA0KIyAgICBjbGVhcmx5IHNlcGFyYXRlIHRoZSBwYXRjaGVzIGZyb20gdGhlIG9y
aWdpbmFsIHdvcmsgbXVzdCBiZSBjbGVhcmx5DQojICAgIGxhYmVsZWQgYXMgdW5vZmZpY2lhbCBk
aXN0cmlidXRpb25zLiAgTW9kaWZpY2F0aW9ucyB3aGljaCBkbyBub3QNCiMgICAgY2FycnkgdGhl
IG5hbWUgV29ybGRwaWxvdCBtYXkgYmUgcGFja2FnZWQgaW4gYW55IGZvcm0sIGFzIGxvbmcgYXMg
dGhleQ0KIyAgICBjb25mb3JtIHRvIGFsbCBvZiB0aGUgY2xhdXNlcyBhYm92ZS4NCiMgDQojIA0K
IyBEaXNjbGFpbWVyDQojIA0KIyAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgTkVVQkVS
R1JFICYgSFVHSEVTIEdNQkggYGBBUyBJUycnIEFORCBBTlkNCiMgICBFWFBSRVNTRUQgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFDQojICAg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSDQojICAgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IERJR0lUQUwgQ1JFQVRJT05TIE9SIElUUw0KIyAgIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KIyAgIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCiMgICBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GDQojICAgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORA0KIyAgIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLA0KIyAgIE9SIFRPUlQgKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVA0KIyAgIE9G
IFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRg0KIyAgIFNVQ0ggREFNQUdFLg0KIyANCiMgDQojIFRoaXMgc29mdHdhcmUgY29uc2lz
dHMgb2YgY29udHJpYnV0aW9ucyBtYWRlIGJ5IE5ldWJlcmdlciAmIEh1Z2hlcyBHbWJIDQojIGFu
ZCBtYW55IGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiBOZXViZXJnZXIgJiBIdWdoZXMgR21iSC4N
CiMgU3BlY2lmaWMgYXR0cmlidXRpb25zIGFyZSBsaXN0ZWQgaW4gdGhlIGFjY29tcGFueWluZyB3
b3JsZHBpbG90IGNyZWRpdHMNCiMgZmlsZS4NCiMgDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KDQoi
IiJXb3JsZFBpbG90IGFzIGEgWm9wZSBQcm9kdWN0DQoiIiINCg0KaW1wb3J0IEFjcXVpc2l0aW9u
DQppbXBvcnQgQWNjZXNzQ29udHJvbA0KaW1wb3J0IE9GUw0KZnJvbSBHbG9iYWxzIGltcG9ydCBI
VE1MRmlsZSwgSFRNTCwgTWVzc2FnZURpYWxvZywgUGVyc2lzdGVudA0KZnJvbSBJbWFnZUZpbGUg
aW1wb3J0IEltYWdlRmlsZQ0KZnJvbSBXUFV0aWwgaW1wb3J0IENyZWF0ZVN0cnVjdCwgbWFrZW1h
cCwgSW50ZXJuYWxkYXRlMnR1cGxlDQppbXBvcnQgc3RyaW5nDQppbXBvcnQgdGltZQ0KaW1wb3J0
IHN5cw0Kc3lzLnBhdGguYXBwZW5kKCcvZWFzeWJpbicpDQpmcm9tIEFjY2Vzc0NvbnRyb2wuUGVy
bWlzc2lvbiBpbXBvcnQgUGVybWlzc2lvbg0KDQppbXBvcnQgUmVzb3VyY2UNCg0KaW1wb3J0IFdQ
aW1hcGxpYg0KdHJ5Og0KICAgIGltcG9ydCBEYXRlVGltZQ0KZXhjZXB0OiBwYXNzDQoNCmltcG9y
dCBTdHJpbmdJTw0KaW1wb3J0IG1pbWV0b29scw0KaW1wb3J0IG1pbWV0eXBlcw0KaW1wb3J0IHJl
DQppbXBvcnQgcmZjODIyDQppbXBvcnQgb3MNCmZyb20gT0ZTIGltcG9ydCBjb250ZW50X3R5cGVz
DQoNCnRyeToNCglpbXBvcnQgZWFzeVJlZw0KICAgICAgICBXUERvbWFpbj1lYXN5UmVnLkRhdGFb
J0RvbWFpbk5hbWUnXVsnVmFsdWUnXQ0KZXhjZXB0Og0KCXRyeToNCiAgICAgICAgCWltcG9ydCBE
T01BSU4NCiAgICAgICAgICAgICAgICBXUERvbWFpbj1ET01BSU4uZG9tYWluDQogICAgICAgICAg
ICAgICAgI3ByaW50ICJET01BSU46ICIsV1BEb21haW4NCiAgICAgICAgZXhjZXB0Og0KCQlXUERv
bWFpbj0iaGV5LnNldHVwLnlvdXIud29ybGRwaWxvdC5kb21haW4iDQoNCmltcG9ydCBJTUFQSEFD
Sw0KICAgICAgICANCmNsYXNzIElNQVBIZWFkZXJMaXN0Og0KCWRlZiBfX2luaXRfXyhzZWxmLCBP
ZmZzZXQ9MCwgTGVuPU5vbmUpOg0KICAgICAgICAJc2VsZi5PZmZzZXQ9T2Zmc2V0DQogICAgICAg
ICAgICAgICAgc2VsZi5MaXN0PVtdDQogICAgICAgICAgICAgICAgI3NlbGYuTGVuPUxlbg0KICAg
ICAgICAgICAgICAgIHNlbGYuSW5kZXhlcz17fQ0KICAgICAgICAgICAgICAgIHNlbGYuQ3VycmVu
dEluZGV4PXNlbGYuTGlzdA0KDQogICAgICAgIGRlZiBhcHBlbmQoc2VsZiwgSXRlbSk6DQogICAg
ICAgIAlzZWxmLkxpc3QuYXBwZW5kKEl0ZW0pDQoNCiAgICAgICAgZGVmIHJldmVyc2Uoc2VsZik6
DQogICAgICAgIAlzZWxmLkxpc3QucmV2ZXJzZSgpDQoNCiAgICAgICAgZGVmIF9fZ2V0aXRlbV9f
KHNlbGYsIEl0ZW1Ocik6DQogICAgICAgIAlyZXR1cm4gc2VsZi5DdXJyZW50SW5kZXhbSXRlbU5y
LXNlbGYuT2Zmc2V0XQ0KDQogICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOg0KICAgICAgICAJcmV0
dXJuIHNlbGYuT2Zmc2V0K2xlbihzZWxmLkxpc3QpDQoNCiAgICAgICAgZGVmIGNyZWF0ZUluZGV4
KHNlbGYsIEluZGV4LCBPcmRlcj0iRG93biIpOg0KICAgICAgICAJaWYgSW5kZXg9PU5vbmUgb3Ig
SW5kZXg9PSIiOg0KICAgICAgICAgICAgICAgIAlzZWxmLkN1cnJlbnRJbmRleD1zZWxmLkxpc3QN
CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLkxpc3QNCiAgICAgICAgCWlmIHNl
bGYuSW5kZXhlcy5oYXNfa2V5KEluZGV4KyIuIitPcmRlcik6DQogICAgICAgICAgICAgICAgCXNl
bGYuQ3VycmVudEluZGV4PXNlbGYuSW5kZXhlc1tJbmRleCsiLiIrT3JkZXJdDQogICAgICAgICAg
ICAgICAgCXJldHVybiBzZWxmLkluZGV4ZXNbSW5kZXgrIi4iK09yZGVyXQ0KICAgICAgICAgICAg
ICAgIGVsaWYgT3JkZXI9PSJVcCIgYW5kIHNlbGYuSW5kZXhlcy5oYXNfa2V5KEluZGV4KyIuIisi
RG93biIpOg0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5JbmRleGVzW0luZGV4KyIuIitP
cmRlcl09c2VsZi5JbmRleGVzW0luZGV4KyIuIisiRG93biJdWzpdDQogICAgICAgICAgICAgICAg
ICAgICAgICBzZWxmLkluZGV4ZXNbSW5kZXgrIi4iK09yZGVyXS5yZXZlcnNlKCkNCiAgICAgICAg
ICAgICAgICAJc2VsZi5DdXJyZW50SW5kZXg9c2VsZi5JbmRleGVzW0luZGV4KyIuIitPcmRlcl0N
CiAgICAgICAgICAgICAgICAJcmV0dXJuIHNlbGYuSW5kZXhlc1tJbmRleCsiLiIrT3JkZXJdDQog
ICAgICAgICAgICAgICAgDQogICAgICAgIAlzPVtdDQogICAgICAgIAlmb3IgSXRlbSBpbiBzZWxm
Lkxpc3Q6DQogICAgICAgICAgICAgICAgCWtleT1nZXRhdHRyKEl0ZW0sIEluZGV4KQ0KICAgICAg
ICAgICAgICAgICAgICAgICAgcy5hcHBlbmQoKGtleSxJdGVtKSkNCiAgICAgICAgICAgICAgICBz
LnNvcnQoKQ0KICAgICAgICAgICAgICAgIGk9W10NCiAgICAgICAgICAgICAgICBmb3Iga2V5LCB2
YWx1ZSBpbiBzOiBpLmFwcGVuZCh2YWx1ZSkNCiAgICAgICAgICAgICAgICBpZiBPcmRlcj09IlVw
IjogaS5yZXZlcnNlKCkNCiAgICAgICAgICAgICAgICBzZWxmLkluZGV4ZXNbSW5kZXgrIi4iK09y
ZGVyXT1pDQogICAgICAgICAgICAgICAJc2VsZi5DdXJyZW50SW5kZXg9c2VsZi5JbmRleGVzW0lu
ZGV4KyIuIitPcmRlcl0NCiAgICAgICAgICAgICAgICByZXR1cm4gaQ0KICAgICAgICAgICAgICAg
IA0KDQpjbGFzcyBJTUFQSGVhZGVyOg0KCWRlZiBfX2luaXRfXyhzZWxmLCBJRCwgRmxhZ3MsIEZy
b21OYW1lLCBGcm9tQWRkcmVzcywgVG9OYW1lLCBUb0FkZHJlc3MsIERhdGUsIFN1YmplY3QsIFNp
emUsIEJvZHkpOg0KCQlzZWxmLlVJRD1JRA0KCQlzZWxmLkZsYWdzPUZsYWdzDQoJCXNlbGYuRnJv
bU5hbWU9RnJvbU5hbWUNCgkJc2VsZi5Gcm9tQWRkcmVzcz1Gcm9tQWRkcmVzcw0KCQlzZWxmLlRv
TmFtZT1Ub05hbWUNCgkJc2VsZi5Ub0FkZHJlc3M9VG9BZGRyZXNzDQoJCXNlbGYuRGF0ZT1EYXRl
DQoJCXNlbGYuU3ViamVjdD1TdWJqZWN0DQoJCXNlbGYuU2l6ZT1TaXplDQoJCXNlbGYuQm9keT1C
b2R5DQoNCmNsYXNzIElNQVBGb2xkZXI6DQoJZGVmIF9faW5pdF9fKHNlbGYsIE5hbWUsIEZ1bGxO
YW1lPSIiLCBQYWRkZWROYW1lPSIiKToNCgkJc2VsZi5DaGlsZHJlbj1bXQ0KCQlzZWxmLk5hbWU9
TmFtZQ0KCQlzZWxmLkZ1bGxOYW1lPUZ1bGxOYW1lDQogICAgICAgICAgICAgICAgc2VsZi5QYWRk
ZWROYW1lPVBhZGRlZE5hbWUNCgkJc2VsZi5NYXA9e30NCiAgICAgICAgICAgICAgICANCglkZWYg
dHBJZChzZWxmKToNCgkJcmV0dXJuIHNlbGYuTmFtZQ0KCWRlZiB0cFVSTChzZWxmKToNCgkJcmV0
dXJuIHNlbGYuTmFtZQ0KCWRlZiBBZGRDaGlsZChzZWxmLCBDaGlsZCk6DQoJCXRyeToNCgkJCWlm
IHNlbGYuTWFwW0NoaWxkLk5hbWVdOg0KCQkJCXBhc3MNCgkJZXhjZXB0Og0KCQkJc2VsZi5DaGls
ZHJlbi5hcHBlbmQoQ2hpbGQpDQoJCQlzZWxmLk1hcFtDaGlsZC5OYW1lXT1DaGlsZA0KCWRlZiBH
ZXRDaGlsZChzZWxmLCBDaGlsZE5hbWUpOg0KCQlyZXR1cm4gKHNlbGYuTWFwW0NoaWxkTmFtZV0p
DQoJZGVmIEdldENoaWxkcmVuKHNlbGYpOg0KCQlyZXR1cm4gc2VsZi5DaGlsZHJlbg0KICAgIA0K
DQoNCmNsYXNzIE1zZ1BhcnQ6DQoJZGVmIF9faW5pdF9fKHNlbGYsIEJvZHlQYXJ0LCBCb2R5VHlw
ZSwgQm9keVN1YnR5cGUsIEJvZHlQYXJhbWV0ZXJMaXN0PU5vbmUsIEJvZHlJZD1Ob25lLCBCb2R5
RGVzY3JpcHRpb249Tm9uZSwgQm9keUVuY29kaW5nPU5vbmUsIEJvZHlTaXplPU5vbmUsIEJvZHlF
bnZlbG9wZT1Ob25lLCBCb2R5TGluZXM9Tm9uZSwgQm9keU1ENT1Ob25lLCBCb2R5RGlzcG9zaXRp
b249Tm9uZSwgQm9keUxhbmd1YWdlPU5vbmUsIEJvZHlIZWFkZXI9Tm9uZSwgQm9keVRleHQ9Tm9u
ZSwgQm9keU1pbWU9Tm9uZSwgQm9keUF0dGFjaG1lbnQ9Tm9uZSwgQm9keUNvbnRlbnRUeXBlPU5v
bmUpOg0KICAgICAgICAJc2VsZi5Cb2R5UGFydD1Cb2R5UGFydA0KCQlzZWxmLkJvZHlUeXBlPUJv
ZHlUeXBlDQogICAgICAgIAlzZWxmLkJvZHlTdWJ0eXBlPUJvZHlTdWJ0eXBlDQogICAgICAgICAg
ICAgICAgc2VsZi5Cb2R5UGFyYW1ldGVyTGlzdD1Cb2R5UGFyYW1ldGVyTGlzdA0KCQlzZWxmLkJv
ZHlJZD1Cb2R5SWQNCgkgICAgICAgIHNlbGYuQm9keURlc2NyaXB0aW9uPUJvZHlEZXNjcmlwdGlv
bg0KICAgICAgICAJc2VsZi5Cb2R5RW5jb2Rpbmc9Qm9keUVuY29kaW5nDQogICAgICAgICAgICAg
ICAgc2VsZi5Cb2R5U2l6ZT1Cb2R5U2l6ZQ0KCSAgICAgICAgc2VsZi5Cb2R5RW52ZWxvcGU9Qm9k
eUVudmVsb3BlDQogICAgICAgICAgICAgICAgc2VsZi5Cb2R5TGluZXM9Qm9keUxpbmVzDQoJICAg
ICAgICBzZWxmLkJvZHlNRDU9Qm9keU1ENQ0KICAgICAgICAJc2VsZi5Cb2R5RGlzcG9zaXRpb249
Qm9keURpc3Bvc2l0aW9uDQogICAgICAgICAgICAgICAgc2VsZi5Cb2R5TGFuZ3VhZ2U9Qm9keUxh
bmd1YWdlDQogICAgICAgICAgICAgICAgc2VsZi5Cb2R5SGVhZGVyPUJvZHlIZWFkZXINCiAgICAg
ICAgICAgICAgICBzZWxmLkJvZHlUZXh0PUJvZHlUZXh0DQogICAgICAgICAgICAgICAgc2VsZi5C
b2R5TWltZT1Cb2R5TWltZQ0KICAgICAgICAgICAgICAgIHNlbGYuQm9keUF0dGFjaG1lbnQ9Qm9k
eUF0dGFjaG1lbnQNCiAgICAgICAgICAgICAgICBzZWxmLkJvZHlDb250ZW50VHlwZT1Cb2R5Q29u
dGVudFR5cGUNCg0KY2xhc3MgTXNnRW52ZWxvcGU6DQoJZGVmIF9faW5pdF9fKHNlbGYsIEVudkRh
dGUsIEVudlN1YmplY3QsIEVudkZyb20sIEVudlNlbmRlciwgRW52UmVwbHlUbywgRW52VG8sIEVu
dkNjLCBFbnZCY2MsIEVudkluUmVwbHlUbywgRW52TWVzc2FnZUlkKToNCgkJc2VsZi5FbnZEYXRl
PUVudkRhdGUNCiAgICAgICAgICAgICAgICBzZWxmLkVudlN1YmplY3Q9RW52U3ViamVjdA0KICAg
ICAgICAgICAgICAgIHNlbGYuRW52RnJvbT1FbnZGcm9tDQogICAgICAgICAgICAgICAgc2VsZi5F
bnZTZW5kZXI9RW52U2VuZGVyDQogICAgICAgICAgICAgICAgc2VsZi5FbnZSZXBseVRvPUVudlJl
cGx5VG8NCiAgICAgICAgICAgICAgICBzZWxmLkVudlRvPUVudlRvDQogICAgICAgICAgICAgICAg
c2VsZi5FbnZDYz1FbnZDYw0KICAgICAgICAgICAgICAgIHNlbGYuRW52QmNjPUVudkJjYw0KICAg
ICAgICAgICAgICAgIHNlbGYuRW52SW5SZXBseVRvPUVudkluUmVwbHlUbw0KICAgICAgICAgICAg
ICAgIHNlbGYuRW52TWVzc2FnZUlkPUVudk1lc3NhZ2VJZA0KDQpjbGFzcyBNc2dBZGRyZXNzOg0K
CWRlZiBfX2luaXRfXyhzZWxmLCBBZGRyUGVyc29uYWxOYW1lLCBBZGRyQXREb21haW5MaXN0LCBB
ZGRyTWFpbGJveE5hbWUsIEFkZHJIb3N0TmFtZSk6DQoJCXNlbGYuQWRkclBlcnNvbmFsTmFtZT1B
ZGRyUGVyc29uYWxOYW1lDQogICAgICAgICAgICAgICAgc2VsZi5BZGRyQXREb21haW5MaXN0PUFk
ZHJBdERvbWFpbkxpc3QNCiAgICAgICAgICAgICAgICBzZWxmLkFkZHJNYWlsYm94TmFtZT1BZGRy
TWFpbGJveE5hbWUNCiAgICAgICAgICAgICAgICBzZWxmLkFkZHJIb3N0TmFtZT1BZGRySG9zdE5h
bWUNCg0KDQpjbGFzcyBNc2dQYXJhbWV0ZXI6DQoJZGVmIF9faW5pdF9fKHNlbGYsIFBhcmFtZXRl
ck5hbWUsIFBhcmFtZXRlclZhbHVlKToNCgkJc2VsZi5QYXJhbWV0ZXJOYW1lPVBhcmFtZXRlck5h
bWUNCgkJc2VsZi5QYXJhbWV0ZXJWYWx1ZT1QYXJhbWV0ZXJWYWx1ZQ0KDQpjbGFzcyBQYXJ0RGlz
cG9zaXRpb246DQoJZGVmIF9faW5pdF9fKHNlbGYsIFBhcnREaXNwb3NpdGlvblR5cGUsIFBhcnRE
aXNwb3NpdGlvbkF0dHIsIFBhcnREaXNwb3NpdGlvbkF0dHJNYXA9Tm9uZSk6DQoJCXNlbGYuUGFy
dERpc3Bvc2l0aW9uVHlwZT1QYXJ0RGlzcG9zaXRpb25UeXBlDQogICAgICAgICAgICAgICAgc2Vs
Zi5QYXJ0RGlzcG9zaXRpb25BdHRyPVBhcnREaXNwb3NpdGlvbkF0dHINCiAgICAgICAgICAgICAg
ICBpZiBQYXJ0RGlzcG9zaXRpb25BdHRyTWFwOg0KCSAgICAgICAgICAgICAgICBzZWxmLlBhcnRE
aXNwb3NpdGlvbkF0dHJNYXA9UGFydERpc3Bvc2l0aW9uQXR0ck1hcA0KICAgICAgICAgICAgICAg
IGVsc2U6DQogICAgICAgICAgICAgICAgCWlmIFBhcnREaXNwb3NpdGlvbkF0dHI6DQoJICAgICAg
ICAgICAgICAgIAlzZWxmLlBhcnREaXNwb3NpdGlvbkF0dHJNYXA9e30NCiAgICAgICAgCSAgICAg
ICAgCWZvciBpIGluIFBhcnREaXNwb3NpdGlvbkF0dHI6DQogICAgICAgICAgICAgICAgCSAgICAg
ICAgCXNlbGYuUGFydERpc3Bvc2l0aW9uQXR0ck1hcFtpLlBhcmFtZXRlck5hbWVdPWkNCiAgICAg
ICAgICAgICAgICAgICAgICAgIAkNCg0KY2xhc3MgTXNnTWVzc2FnZToNCglkZWYgX19pbml0X18o
c2VsZiwgTXNnVWlkLCBNc2dGbGFncywgTXNnSW50ZXJuYWxEYXRlLCBNc2dSZmM4MjJTaXplLCBN
c2dFbnZlbG9wZSwgTXNnUGFydHMsIE1zZ1RleHQsIE1zZ1RleHRQYXJ0PU5vbmUpOg0KCQlzZWxm
Lk1zZ1VpZD1Nc2dVaWQNCiAgICAgICAgICAgICAgICBzZWxmLk1zZ0ZsYWdzPU1zZ0ZsYWdzDQog
ICAgICAgICAgICAgICAgc2VsZi5Nc2dJbnRlcm5hbERhdGU9TXNnSW50ZXJuYWxEYXRlDQogICAg
ICAgICAgICAgICAgc2VsZi5Nc2dSZmM4MjJTaXplPU1zZ1JmYzgyMlNpemUNCiAgICAgICAgICAg
ICAgICBzZWxmLk1zZ0VudmVsb3BlPU1zZ0VudmVsb3BlDQogICAgICAgICAgICAgICAgc2VsZi5N
c2dQYXJ0cz1Nc2dQYXJ0cw0KICAgICAgICAgICAgICAgIHNlbGYuTXNnVGV4dD1Nc2dUZXh0DQog
ICAgICAgICAgICAgICAgc2VsZi5Nc2dUZXh0UGFydD1Nc2dUZXh0UGFydA0KDQoNCmNsYXNzIExv
Z29uOg0KCXVzZWRVSURzPXt9DQoJZGVmIF9faW5pdF9fKHNlbGYsVXNlcixQYXNzd2QsSVAsaW1h
cHNlcnZlcik6DQogICAgICAgIAlzZWxmLlVzZXI9VXNlcg0KICAgICAgICAgICAgICAgIHNlbGYu
UGFzc3dkPVBhc3N3ZA0KICAgICAgICAgICAgICAgIHNlbGYuSVA9SVANCiAgICAgICAgICAgICAg
ICBzZWxmLkNhY2hlcz17fQ0KICAgICAgICAgICAgICAgIHNlbGYuVUlEPXNlbGYuZ2VuVUlEKCkN
CiAgICAgICAgICAgICAgICBzZWxmLmltYXBzZXJ2ZXI9aW1hcHNlcnZlcg0KICAgICAgICAgICAg
ICAgIHNlbGYuU2V0dXAoKQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICBkZWYgU2V0dXAoc2Vs
Zik6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIAlzZWxmLlNpZ25hdHVy
ZT1vcGVuKCIvdmFyL3Nwb29sL3dvcmxkcGlsb3QvdXNlci8lcy9zaWduYXR1cmUiICUgKHNlbGYu
VXNlciksICJyIikucmVhZCgpDQogICAgICAgICAgICAgICAgZXhjZXB0Og0KICAgICAgICAgICAg
ICAgICAgICAgICAgc2VsZi5TaWduYXR1cmU9UmVzb3VyY2UuU3RhbmRhcmQuZ2V0UmVzb3VyY2VN
YXBwaW5nKCd1cycpWyJkZWZhdWx0U2lnbmF0dXJlIl0ucmF3DQogICAgICAgICAgICAgICAgdHJ5
Og0KICAgICAgICAgICAgICAgIAlzZWxmLklkZW50aXR5TmFtZT1vcGVuKCIvdmFyL3Nwb29sL3dv
cmxkcGlsb3QvdXNlci8lcy9JZGVudGl0eU5hbWUiICUgKHNlbGYuVXNlciksICJyIikucmVhZCgp
DQogICAgICAgICAgICAgICAgZXhjZXB0Og0KCQkJc2VsZi5JZGVudGl0eU5hbWU9c2VsZi5nZXRV
c2VyKCkNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgCXNlbGYuSWRlbnRp
dHlFTWFpbD1vcGVuKCIvdmFyL3Nwb29sL3dvcmxkcGlsb3QvdXNlci8lcy9JZGVudGl0eUVNYWls
IiAlIChzZWxmLlVzZXIpLCAiciIpLnJlYWQoKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdDoNCiAg
ICAgICAgICAgICAgICAJc2VsZi5JZGVudGl0eUVNYWlsPXNlbGYuZ2V0VXNlcigpKyJAIitXUERv
bWFpbg0KICAgICAgICAgICAgICAgIA0KICAgICAgICBkZWYgZ2V0VXNlcihzZWxmKToNCiAgICAg
ICAgCXJldHVybiBzdHIoc2VsZi5Vc2VyKQ0KDQogICAgICAgIGRlZiBnZXRQYXNzd2Qoc2VsZik6
DQogICAgICAgIAlyZXR1cm4gc2VsZi5QYXNzd2QNCg0KICAgICAgICBkZWYgY2hlY2soc2VsZiwg
UGFzc3dkPU5vbmUpOg0KICAgICAgICAJaWYgUGFzc3dkIT1Ob25lOg0KICAgICAgICAgICAgICAg
IAlzZWxmLlBhc3N3ZD1QYXNzd2QNCiAgICAgICAgCXJldHVybiBzZWxmLmNoZWNrUGFzc3dkKCkN
Cg0KICAgICAgICBkZWYgZ2V0VUlEKHNlbGYpOg0KICAgICAgICAJcmV0dXJuIHNlbGYuVUlEDQoA
DQogICAgICAgIGRlZiBnZW5VSUQoc2VsZik6DQogICAgICAgIAlpbXBvcnQgcmFuZG9tDQogICAg
ICAgICAgICAgICAgdT1pbnQoMTAwMDAwMDAwMCpyYW5kb20ucmFuZG9tKCkpDQogICAgICAgICAg
ICAgICAgd2hpbGUgTG9nb24udXNlZFVJRHMuaGFzX2tleSh1KToNCiAgICAgICAgICAgICAgICAJ
dT1pbnQoMTAwMDAwMDAwMCpyYW5kb20ucmFuZG9tKCkpDQogICAgICAgICAgICAgICAgcmV0dXJu
IHN0cih1KQ0KDQogICAgICAgIGRlZiBzYXZlU2lnbmF0dXJlKHNlbGYsIFNpZ25hdHVyZSk6DQog
ICAgICAgIAkjIHRoaXMgaGFzIHRvIG1vdmUgdG8gYSBzdG9yYWdlIGNsYXNzIG5vdw0KICAgICAg
ICAJc2VsZi5TaWduYXR1cmU9U2lnbmF0dXJlDQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAg
ICAgICAgICAgIAlvcGVuKCIvdmFyL3Nwb29sL3dvcmxkcGlsb3QvdXNlci8lcy9zaWduYXR1cmUi
ICUgKHNlbGYuVXNlciksICJ3Iikud3JpdGUoU2lnbmF0dXJlKQ0KICAgICAgICAgICAgICAgIGV4
Y2VwdDoNCiAgICAgICAgICAgICAgICAJdHJ5Og0KCSAgICAgICAgICAgICAgICAgICAgICAgIG9z
Lm1rZGlyKCIvdmFyL3Nwb29sL3dvcmxkcGlsb3QvdXNlci8lcyIgJSAoc2VsZi5Vc2VyKSkNCiAg
ICAgICAgCSAgICAgICAgCW9wZW4oIi92YXIvc3Bvb2wvd29ybGRwaWxvdC91c2VyLyVzL3NpZ25h
dHVyZSIgJSAoc2VsZi5Vc2VyKSwgInciKS53cml0ZShTaWduYXR1cmUpDQogICAgICAgICAgICAg
ICAgICAgICAgICBleGNlcHQ6DQogICAgICAgICAgICAgICAgICAgICAgICAJcmV0dXJuIDANCgkJ
cmV0dXJuIDENCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICBkZWYgc2F2ZUlkZW50
aXR5TmFtZShzZWxmLCBJZGVudGl0eU5hbWUpOg0KICAgICAgICAJIyB0aGlzIGhhcyB0byBtb3Zl
IHRvIGEgc3RvcmFnZSBjbGFzcyBub3cNCiAgICAgICAgCXNlbGYuSWRlbnRpdHlOYW1lPUlkZW50
aXR5TmFtZQ0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAJb3BlbigiL3Zh
ci9zcG9vbC93b3JsZHBpbG90L3VzZXIvJXMvSWRlbnRpdHlOYW1lIiAlIChzZWxmLlVzZXIpLCAi
dyIpLndyaXRlKElkZW50aXR5TmFtZSkNCiAgICAgICAgICAgICAgICBleGNlcHQ6DQogICAgICAg
ICAgICAgICAgCXRyeToNCgkgICAgICAgICAgICAgICAgICAgICAgICBvcy5ta2RpcigiL3Zhci9z
cG9vbC93b3JsZHBpbG90L3VzZXIvJXMiICUgKHNlbGYuVXNlcikpDQogICAgICAgIAkgICAgICAg
IAlvcGVuKCIvdmFyL3Nwb29sL3dvcmxkcGlsb3QvdXNlci8lcy9JZGVudGl0eU5hbWUiICUgKHNl
bGYuVXNlciksICJ3Iikud3JpdGUoSWRlbnRpdHlOYW1lKQ0KICAgICAgICAgICAgICAgICAgICAg
ICAgZXhjZXB0Og0KICAgICAgICAgICAgICAgICAgICAgICAgCXJldHVybiAwDQoJCXJldHVybiAx
DQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgZGVmIHNhdmVJZGVudGl0eUVNYWls
KHNlbGYsIElkZW50aXR5RU1haWwpOg0KICAgICAgICAJIyB0aGlzIGhhcyB0byBtb3ZlIHRvIGEg
c3RvcmFnZSBjbGFzcyBub3cNCiAgICAgICAgCXNlbGYuSWRlbnRpdHlFTWFpbD1JZGVudGl0eUVN
YWlsDQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIAlvcGVuKCIvdmFyL3Nw
b29sL3dvcmxkcGlsb3QvdXNlci8lcy9JZGVudGl0eUVNYWlsIiAlIChzZWxmLlVzZXIpLCAidyIp
LndyaXRlKElkZW50aXR5RU1haWwpDQogICAgICAgICAgICAgICAgZXhjZXB0Og0KICAgICAgICAg
ICAgICAgIAl0cnk6DQoJICAgICAgICAgICAgICAgICAgICAgICAgb3MubWtkaXIoIi92YXIvc3Bv
b2wvd29ybGRwaWxvdC91c2VyLyVzIiAlIChzZWxmLlVzZXIpKQ0KICAgICAgICAJICAgICAgICAJ
b3BlbigiL3Zhci9zcG9vbC93b3JsZHBpbG90L3VzZXIvJXMvSWRlbnRpdHlFTWFpbCIgJSAoc2Vs
Zi5Vc2VyKSwgInciKS53cml0ZShJZGVudGl0eUVNYWlsKQ0KICAgICAgICAgICAgICAgICAgICAg
ICAgZXhjZXB0Og0KICAgICAgICAgICAgICAgICAgICAgICAgCXJldHVybiAwDQoJCXJldHVybiAx
DQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgZGVmIGNhbGxSZXNvdXJjZShzZWxm
LCBSZXNvdXJjZU5hbWUsIGNsaWVudCwgbWFwcGluZz1Ob25lKToNCiAgICAgICAgICAgICAgICBy
ZXR1cm4gUmVzb3VyY2UuU3RhbmRhcmQuY2FsbFJlc291cmNlKFJlc291cmNlTmFtZSwndXMnLCBj
bGllbnQ9Y2xpZW50LCBtYXBwaW5nPW1hcHBpbmcpDQoNCglkZWYgY2hlY2tQYXNzd2Qoc2VsZik6
DQoJICAgICAgICB0cnk6DQoJCQkjc2VsZi5Db25uZWN0aW9uPVdQaW1hcGxpYi5JTUFQNChzZWxm
LmltYXBzZXJ2ZXIpDQoJCQlDb25uZWN0aW9uPVdQaW1hcGxpYi5JTUFQNChzZWxmLmltYXBzZXJ2
ZXIpDQoJCQkjcmV0dXJuIHNlbGYuQ29ubmVjdGlvbi5sb2dpbihzZWxmLlVzZXIsIHNlbGYuUGFz
c3dkKQ0KCQkJcmV0dXJuIENvbm5lY3Rpb24ubG9naW4oc2VsZi5Vc2VyLCBzZWxmLlBhc3N3ZCkN
CgkgICAgICAgIGV4Y2VwdDoNCiAgICAgICAgCQlyZXR1cm4gTm9uZQ0KDQoJZGVmIGdldENvbm5l
Y3Rpb24oc2VsZiwgUkVRVUVTVD1Ob25lKToNCiAgICAgICAgCWlmIFJFUVVFU1QgYW5kIFJFUVVF
U1QuaGFzX2tleSgnRm9sZGVyJyk6IEZvbGRlcj1SRVFVRVNUWydGb2xkZXInXQ0KICAgICAgICAg
ICAgICAgIGVsc2U6IEZvbGRlcj0iSU5CT1giDQogICAgICAgIAlNPXNlbGYuZ2V0TmV3Q29ubmVj
dGlvbigpDQoJCU0uc2VsZWN0KEZvbGRlcikNCiAgICAgICAgICAgICAgICByZXR1cm4gTQ0KDQog
ICAgICAgIGRlZiBjbGVhckNhY2hlKHNlbGYsIFJFUVVFU1QpOg0KICAgICAgICAJc2VsZi5DYWNo
ZXM9e30NCg0KICAgICAgICBkZWYgY2xlYXJDYWNoZUZvbGRlcihzZWxmLCBGb2xkZXIsIFJFUVVF
U1Q9Tm9uZSk6DQogICAgICAgIAl0cnk6DQoJCQlkZWwgc2VsZi5DYWNoZXNbRm9sZGVyXQ0KICAg
ICAgICAgICAgICAgIGV4Y2VwdDoNCiAgICAgICAgICAgICAgICAJcGFzcw0KICAgICAgICAgICAg
ICAgIA0KDQoJZGVmIGdldE5ld0Nvbm5lY3Rpb24oc2VsZik6DQoJICAgICAgICB0cnk6DQoJCQlj
b25uPVdQaW1hcGxpYi5JTUFQNChzZWxmLmltYXBzZXJ2ZXIpDQoJCQlpZiBjb25uLmxvZ2luKHNl
bGYuVXNlciwgc2VsZi5QYXNzd2QpOg0KICAgICAgICAgICAgICAgICAgICAgICAgCXJldHVybiBj
b25uDQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAg
ICAgCXJldHVybiBOb25lDQoJICAgICAgICBleGNlcHQ6DQogICAgICAgIAkJcmV0dXJuIE5vbmUN
CiAgICAgICAgCQ0KCWRlZiBnZXRJTUFQRm9sZGVycyhzZWxmLCBSRVFVRVNUKToNCgkgICAgICAg
ICJEb2MgU3RyaW5nIDotKSINCgkJc3Q9W10NCiAgICAgICAgICAgICAgICBNPXNlbGYuZ2V0Q29u
bmVjdGlvbihSRVFVRVNUKQ0KDQogICAgICAgICAgICAgICAgaWYgSU1BUEhBQ0suVXNlTFNVQjoN
CgkJICAgIEY9TS5sc3ViKElNQVBIQUNLLk1haWxMaXN0Um9vdCkNCiAgICAgICAgICAgICAgICBl
bHNlOg0KCQkgICAgRj1NLmxpc3QoSU1BUEhBQ0suTWFpbExpc3RSb290KQ0KICAgICAgICAgICAg
ICAgICAgICANCgkJRlM9Q3JlYXRlU3RydWN0KEZbMV0pDQoJCXJmPUlNQVBGb2xkZXIoJ3Jvb3Qn
KQ0KCQlmb3IgZm9sZGVyIGluIEZTOg0KCQkJRm9sZGVyRnVsbE5hbWU9Zm9sZGVyWzJdDQoJCQlj
Zj1yZg0KCQkJaWYgc3RyaW5nLmZpbmQoRm9sZGVyRnVsbE5hbWUsJy8nKToNCgkJCQlGb2xkZXJz
PXJlLnNwbGl0KHInXC8nLCBGb2xkZXJGdWxsTmFtZSkNCgkJCWVsc2U6DQoJCQkJRm9sZGVycz1y
ZS5zcGxpdChyJ1wuJywgRm9sZGVyRnVsbE5hbWUpDQoJCQkJDQojCQkJcHJpbnQgRm9sZGVycw0K
DQoJCQlpZiBub3QgRm9sZGVyczoNCgkJCQlGb2xkZXJzPUZvbGRlckZ1bGxOYW1lDQoJCQkNCiAg
ICAgICAgICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgICAgIAlwYWRk
aW5nPSIiDQoJCQkJZm9sZGVyQ291bnQ9MA0KCQkJCWZvciBGb2xkZXIgaW4gRm9sZGVyc1s6LTFd
Og0KIwkJCQkJcHJpbnQgRm9sZGVyDQoJCQkJCXRyeToNCgkJCQkJCWNmPWNmLkdldENoaWxkKEZv
bGRlcikNCgkJCQkJZXhjZXB0Og0KCQkJCQkJY2YuQWRkQ2hpbGQoSU1BUEZvbGRlcihGb2xkZXIs
Rm9sZGVyLHBhZGRpbmcrRm9sZGVyKSkNCgkJCQkJCWNmPWNmLkdldENoaWxkKEZvbGRlcikNCiMJ
CQkJCXByaW50IEZvbGRlcnNbOi0xXQ0KCQkJCQlmb2xkZXJDb3VudD1mb2xkZXJDb3VudCsxDQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZz1wYWRkaW5nKyIm
bmJzcDsmbmJzcDsiDQoJCQkJY2YuQWRkQ2hpbGQoSU1BUEZvbGRlcihGb2xkZXJzWy0xXSxGb2xk
ZXJGdWxsTmFtZSwgcGFkZGluZytGb2xkZXJzWy0xXSkpDQogICAgICAgICAgICAgICAgICAgICAg
ICBleGNlcHQ6DQogICAgICAgICAgICAgICAgICAgICAgICAJcGFzcw0KCQlyZXR1cm4gcmYNCg0K
ICAgICAgICBkZWYgYWRkQ2hpbGRyZW5Ub0xpc3Qoc2VsZiwgTGlzdCwgVHJlZSk6DQogICAgICAg
IAlpZiBUcmVlLkZ1bGxOYW1lIT0iIjoNCiAgICAgICAgICAgICAgICAJTGlzdC5hcHBlbmQoVHJl
ZSkNCiAgICAgICAgICAgICAgICBmb3IgY2hpbGQgaW4gVHJlZS5HZXRDaGlsZHJlbigpOg0KICAg
ICAgICAgICAgICAgIAlzZWxmLmFkZENoaWxkcmVuVG9MaXN0KExpc3QsIGNoaWxkKQ0KICAgICAg
ICAgICAgICAgIA0KCWRlZiBnZXRJTUFQRm9sZGVyc0xpc3Qoc2VsZiwgUkVRVUVTVCk6DQogICAg
ICAgIAlMaXN0PVtdDQogICAgICAgIAlGb2xkZXJUcmVlPXNlbGYuZ2V0SU1BUEZvbGRlcnMoUkVR
VUVTVCkNCiAgICAgICAgICAgICAgICBzZWxmLmFkZENoaWxkcmVuVG9MaXN0KExpc3QsIEZvbGRl
clRyZWUpDQogICAgICAgICAgICAgICAgcmV0dXJuIExpc3QNCg0KICAgICAgICBkZWYgbW92ZU1l
c3NhZ2VzKHNlbGYsIFJFUVVFU1QpOg0KICAgICAgICAJaWYgUkVRVUVTVC5oYXNfa2V5KCdGb2xk
ZXInKTogRm9sZGVyPVJFUVVFU1RbJ0ZvbGRlciddDQogICAgICAgICAgICAgICAgZWxzZTogRm9s
ZGVyPSJJTkJPWCINCiAgICAgICAgCWlmIFJFUVVFU1QuaGFzX2tleSgnTWVzc2FnZXMnKTogTWVz
c2FnZXM9UkVRVUVTVFsnTWVzc2FnZXMnXQ0KICAgICAgICAgICAgICAgIGVsc2U6IE1lc3NhZ2Vz
PVtdDQogICAgICAgIAlpZiBSRVFVRVNULmhhc19rZXkoJ01vdmVUb0ZvbGRlcicpOiBNb3ZlVG9G
b2xkZXI9UkVRVUVTVFsnTW92ZVRvRm9sZGVyJ10NCiAgICAgICAgICAgICAgICBlbHNlOiBNb3Zl
VG9Gb2xkZXI9IiINCiAgICAgICAgICAgICAgICBpZiBsZW4oTWVzc2FnZXMpOg0KCSAgICAgICAg
ICAgICAgICBNPXNlbGYuZ2V0Q29ubmVjdGlvbihSRVFVRVNUKQ0KICAgICAgICAJICAgICAgICBy
ZXN1bHQ9TS51aWQoIkNPUFkiLCBzdHJpbmcuam9pbihNZXNzYWdlcywiLCIpLCAgTW92ZVRvRm9s
ZGVyKQ0KICAgICAgICAgICAgICAgIAlyZXN1bHQyPU0udWlkKCJTVE9SRSIsIHN0cmluZy5qb2lu
KE1lc3NhZ2VzLCIsIiksICcrRkxBR1MnLCAnKFxEZWxldGVkKScpDQoJICAgICAgICBSRVFVRVNU
WydSZXN1bHQnXT1zdHIocmVzdWx0KStzdHIoTW92ZVRvRm9sZGVyKStzdHIocmVzdWx0MikrIiEi
DQogICAgICAgIAkNCiAgICAgICAgZGVmIGRlbGV0ZU1lc3NhZ2VzKHNlbGYsIFJFUVVFU1QpOg0K
ICAgICAgICAJaWYgUkVRVUVTVC5oYXNfa2V5KCdGb2xkZXInKTogRm9sZGVyPVJFUVVFU1RbJ0Zv
bGRlciddDQogICAgICAgICAgICAgICAgZWxzZTogRm9sZGVyPSJJTkJPWCINCiAgICAgICAgCWlm
IFJFUVVFU1QuaGFzX2tleSgnTWVzc2FnZXMnKTogTWVzc2FnZXM9UkVRVUVTVFsnTWVzc2FnZXMn
XQ0KICAgICAgICAgICAgICAgIGVsc2U6IE1lc3NhZ2VzPVtdDQogICAgICAgICAgICAgICAgaWYg
Rm9sZGVyPT0iSU5CT1guVHJhc2giOg0KICAgICAgICAJICAgICAgICBNPXNlbGYuZ2V0Q29ubmVj
dGlvbihSRVFVRVNUKQ0KCSAgICAgICAgICAgICAgICByZXN1bHQ9TS51aWQoIlNUT1JFIiwgc3Ry
aW5nLmpvaW4oTWVzc2FnZXMsIiwiKSwgJytGTEFHUycsICcoXERlbGV0ZWQpJykNCiAgICAgICAg
ICAgICAgICAgICAgICAgIHJlc3VsdDI9TS5leHB1bmdlKCkNCiAgICAgICAgCSAgICAgICAgUkVR
VUVTVFsnUmVzdWx0J109c3RyKHJlc3VsdCkrc3RyKEZvbGRlcikrc3RyKHJlc3VsdDIpKyIhIg0K
ICAgICAgICAgICAgICAgIGVsc2U6DQoJICAgICAgICAgICAgICAgIE1vdmVUb0ZvbGRlcj0iSU5C
T1guVHJhc2giDQogICAgICAgIAkgICAgICAgIE09c2VsZi5nZXRDb25uZWN0aW9uKFJFUVVFU1Qp
DQogICAgICAgICAgICAgICAgCXJlc3VsdD1NLnVpZCgiQ09QWSIsIHN0cmluZy5qb2luKE1lc3Nh
Z2VzLCIsIiksICBNb3ZlVG9Gb2xkZXIpDQoJICAgICAgICAgICAgICAgIHJlc3VsdDI9TS51aWQo
IlNUT1JFIiwgc3RyaW5nLmpvaW4oTWVzc2FnZXMsIiwiKSwgJytGTEFHUycsICcoXERlbGV0ZWQp
JykNCiAgICAgICAgCSAgICAgICAgUkVRVUVTVFsnUmVzdWx0J109c3RyKHJlc3VsdCkrc3RyKE1v
dmVUb0ZvbGRlcikrc3RyKHJlc3VsdDIpKyIhIg0KICAgICAgICAgICAgICAgIAkjUHVyZ2UgXERl
bGV0ZWQgTWVzc2FnZXMgT3B0aW9uIHN0aWxsIG5lZWRlZC4uLg0KDQogICAgICAgIGRlZiBhcHBl
bmRNZXNzYWdlKHNlbGYsIEZvbGRlciwgRmxhZ3MsIHNhdmUsIFJFUVVFU1Q9Tm9uZSk6DQogICAg
ICAgICAgICAgICAgTT1zZWxmLmdldENvbm5lY3Rpb24oUkVRVUVTVCkNCiAgICAgICAgICAgICAg
ICBNLmFwcGVuZChGb2xkZXIsIEZsYWdzLCBOb25lLCBzYXZlLnJlYWQoKSkNCiAgICAgICAgICAg
ICAgICBzZWxmLmNsZWFyQ2FjaGVGb2xkZXIoRm9sZGVyKQ0KDQogICAgICAgIGRlZiBjcmVhdGVG
b2xkZXIoc2VsZiwgRm9sZGVyLCBSRVFVRVNUPU5vbmUpOg0KICAgICAgICAgICAgICAgIE09c2Vs
Zi5nZXRDb25uZWN0aW9uKFJFUVVFU1QpDQoJCXByaW50ICdDcmVhdGluZyBGb2xkZXI6ICcrIEZv
bGRlcg0KICAgICAgICAgICAgICAgIE0uY3JlYXRlKEZvbGRlcikNCiAgICAgICAgICAgICAgICAj
c2VsZi5jbGVhckNhY2hlRm9sZGVyKEZvbGRlcikNCg0KICAgICAgICBkZWYgZGVsZXRlRm9sZGVy
KHNlbGYsIEZvbGRlciwgUkVRVUVTVD1Ob25lKToNCiAgICAgICAgICAgICAgICBNPXNlbGYuZ2V0
Q29ubmVjdGlvbihSRVFVRVNUKQ0KICAgICAgICAgICAgICAgIFJlc3VsdD1NLmRlbGV0ZShGb2xk
ZXIpDQogICAgICAgICAgICAgICAgUkVRVUVTVFsnUmVzdWx0J109c3RyKFJlc3VsdCkNCiAgICAg
ICAgICAgICAgICAjc2VsZi5jbGVhckNhY2hlRm9sZGVyKEZvbGRlcikNCg0KICAgICAgICBkZWYg
ZHJhZnRNZXNzYWdlKHNlbGYsIFByZXZVSUQsIEZvbGRlciwgRmxhZ3MsIHNhdmUsIFJFUVVFU1Q9
Tm9uZSk6DQogICAgICAgIAlzZWxmLmFwcGVuZE1lc3NhZ2UoRm9sZGVyLCBGbGFncywgc2F2ZSwg
UkVRVUVTVCkNCiAgICAgICAgICAgICAgICBNPXNlbGYuZ2V0Q29ubmVjdGlvbihSRVFVRVNUKQ0K
ICAgICAgICAgICAgICAgIGlmIFByZXZVSUQ6DQoJICAgICAgICAgICAgICAgIE0udWlkKCJTVE9S
RSIsIHN0cihQcmV2VUlEKSwgJytGTEFHUycsICcoXERlbGV0ZWQpJykNCg0KCWRlZiBjYWNoZUlN
QVBGZXRjaChzZWxmLCBSRVFVRVNUKToNCgkgICAgICAgICJEb2MgU3RyaW5nIDotKSINCiAgICAg
ICAgCWlmIFJFUVVFU1QuaGFzX2tleSgnRm9sZGVyJyk6IEZvbGRlcj1SRVFVRVNUWydGb2xkZXIn
XQ0KICAgICAgICAgICAgICAgIGVsc2U6IEZvbGRlcj0iSU5CT1giDQogICAgICAgIAlpZiBSRVFV
RVNULmhhc19rZXkoJ0luZGV4Jyk6IEluZGV4PVJFUVVFU1RbJ0luZGV4J10NCiAgICAgICAgICAg
ICAgICBlbHNlOiBJbmRleD1Ob25lDQogICAgICAgIAlpZiBSRVFVRVNULmhhc19rZXkoJ09yZGVy
Jyk6IE9yZGVyPVJFUVVFU1RbJ09yZGVyJ10NCiAgICAgICAgICAgICAgICBlbHNlOiBPcmRlcj0i
RG93biINCiAgICAgICAgICAgICAgICBpZiBzZWxmLkNhY2hlcy5oYXNfa2V5KEZvbGRlcik6DQog
ICAgICAgICAgICAgICAgCXNlbGYuQ2FjaGVzW0ZvbGRlcl0uY3JlYXRlSW5kZXgoSW5kZXgsIE9y
ZGVyKQ0KICAgICAgICAgICAgICAgIAlyZXR1cm4gc2VsZi5DYWNoZXNbRm9sZGVyXQ0KICAgICAg
ICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgCXN0PUlNQVBIZWFkZXJMaXN0KCkNCiAg
ICAgICAgICAgICAgICAgICAgICAgIHNlbGYuQ2FjaGVzW0ZvbGRlcl09c3QNCiAgICAgICAgICAg
ICAgICAJcGFzcw0KICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgTT1z
ZWxmLmdldENvbm5lY3Rpb24oUkVRVUVTVCkNCiAgICAgICAgICAgICAgICAgICAgICAgIA0KCQlN
LnNlbGVjdChGb2xkZXIpDQoJCSNFPU0uZmV0Y2goJzE6KicsICcoVUlEIEZMQUdTIElOVEVSTkFM
REFURSBSRkM4MjIuU0laRSBFTlZFTE9QRSknKQ0KCQlFPU0udWlkKCdGRVRDSCcsICcxOionLCAn
QUxMJykNCgkJaWYgRVsxXVswXSE9Tm9uZToNCgkJCUVTPUNyZWF0ZVN0cnVjdChFWzFdKQ0KICAg
ICAgICAgICAgICAgIGVsc2U6DQoJCQlyZXR1cm4gKCkNCgkJZm9yIG1haWwgaW4gRVM6DQoJCQlz
ZXF1ZW5jZV9udW1iZXI9bWFpbFswXQ0KICAgICAgICAgICAgICAgICAgICAgICAgbWk9bWFrZW1h
cChtYWlsWzFdKQ0KCQkJdHJ5Og0KCQkJCURhdGU9RGF0ZVRpbWUuRGF0ZVRpbWUoMCkNCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZT1zZWxmLm1ha2VEYXRlVGltZUZyb21SZmM4
MjIobWlbJ0VOVkVMT1BFJ11bMF0pDQoJCQlleGNlcHQ6DQogICAgICAgICAgICAgICAgICAgICAg
ICAJcGFzcw0KICAgICAgICAgICAgICAgICAgICAgICAgI0lELCBGbGFncywgRnJvbU5hbWUsIEZy
b21BZGRyZXNzLCBUb05hbWUsIFRvQWRkcmVzcywgRGF0ZSwgU3ViamVjdCwgU2l6ZSwgQm9keQ0K
ICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OglGbGFncz1taVsnRkxBR1MnXQ0KICAgICAgICAg
ICAgICAgICAgICAgICAgZXhjZXB0OglGbGFncz0iIg0KICAgICAgICAgICAgICAgICAgICAgICAg
dHJ5OglGcm9tQWRkcmVzcz1taVsnRU5WRUxPUEUnXVsyXVswXVsyXSsiQCIrbWlbJ0VOVkVMT1BF
J11bMl1bMF1bM10NCiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdDoJRnJvbUFkZHJlc3M9
IiINCiAgICAgICAgICAgICAgICAgICAgICAgIHRyeToJRnJvbU5hbWU9bWlbJ0VOVkVMT1BFJ11b
Ml1bMF1bMF0NCiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdDoJRnJvbU5hbWU9RnJvbUFk
ZHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgIHRyeToJVG9BZGRyZXNzPW1pWydFTlZFTE9Q
RSddWzVdWzBdWzJdKyJAIittaVsnRU5WRUxPUEUnXVs1XVswXVszXQ0KICAgICAgICAgICAgICAg
ICAgICAgICAgZXhjZXB0OglUb0FkZHJlc3M9IiINCiAgICAgICAgICAgICAgICAgICAgICAgIHRy
eToJVG9OYW1lPW1pWydFTlZFTE9QRSddWzVdWzBdWzBdDQogICAgICAgICAgICAgICAgICAgICAg
ICBleGNlcHQ6CVRvTmFtZT1Ub0FkZHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgIHRyeToJ
U3ViamVjdD1taVsnRU5WRUxPUEUnXVsxXQ0KICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0
OglTdWJqZWN0PSIiDQogICAgICAgICAgICAgICAgICAgICAgICB0cnk6CVNpemU9bWlbJ1JGQzgy
Mi5TSVpFJ10NCiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdDoJU2l6ZT0xDQogICAgICAg
ICAgICAgICAgICAgICAgICBCb2R5PSIiDQogICAgICAgICAgICAgICAgICAgICAgICANCgkJCXRy
eToNCiAgICAgICAgICAgICAgICAgICAgICAgIAlpZiBub3QgJ1xcRGVsZXRlZCcgaW4gRmxhZ3M6
DQoJICAgICAgICAgICAgICAgICAgICAgICAgCXN0LmFwcGVuZChJTUFQSGVhZGVyKG1pWydVSUQn
XSxGbGFncywgRnJvbU5hbWUsIEZyb21BZGRyZXNzLCBUb05hbWUsIFRvQWRkcmVzcywgRGF0ZSwg
U3ViamVjdCwgU2l6ZSwgQm9keSkpDQoJCQlleGNlcHQ6DQoJCQkJcGFzcw0KCQlzdC5yZXZlcnNl
KCkNCiAgICAgICAgICAgICAgICBzdC5jcmVhdGVJbmRleChJbmRleCwgT3JkZXIpDQoJCXJldHVy
biBzdA0KDQoJZGVmIG1ha2VBZGRyZXNzTGlzdChzZWxmLFNUKToNCiAgICAgICAgCWlmIFNUOg0K
CSAgICAgICAgCWFsPVtdDQogICAgICAgICAgICAgICAgCWZvciBBRERSIGluIFNUOg0KICAgICAg
ICAgICAgICAgICAgICAgICAgCWFsLmFwcGVuZChNc2dBZGRyZXNzKEFERFJbMF0sQUREUlsxXSxB
RERSWzJdLEFERFJbM10pKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsDQogICAg
ICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAJcmV0dXJuIE5vbmUNCiAgICAgICAg
ICAgICAgICAgICAgICAgIAkNCg0KCWRlZiBtYWtlRW52ZWxvcGUoc2VsZiwgU1QpOg0KICAgICAg
ICAJI3ByaW50ICJFTlZFTE9QRVNPVVJDRSIsIFNUDQogICAgICAgIAlpZiBTVDoNCiAgICAgICAg
ICAgICAgICAJcmV0dXJuKE1zZ0VudmVsb3BlKA0KICAgICAgICAgICAgICAgICAgICAgICAgCXNl
bGYubWFrZURhdGVUaW1lRnJvbVJmYzgyMihTVFswXSksDQogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIFNUWzFdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1h
a2VBZGRyZXNzTGlzdChTVFsyXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNl
bGYubWFrZUFkZHJlc3NMaXN0KFNUWzNdKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgc2VsZi5tYWtlQWRkcmVzc0xpc3QoU1RbNF0pLA0KICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBzZWxmLm1ha2VBZGRyZXNzTGlzdChTVFs1XSksDQogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHNlbGYubWFrZUFkZHJlc3NMaXN0KFNUWzZdKSwNCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgc2VsZi5tYWtlQWRkcmVzc0xpc3QoU1RbN10pLA0KICAgICAgICAg
ICAgICAgICAgICAgICAgCVNUWzhdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBT
VFs5XSwNCiAgICAgICAgICAgICAgICAgICAgICAgIAkpKQ0KICAgICAgICAgICAgICAgIGVsc2U6
DQogICAgICAgICAgICAgICAgCXJldHVybiBOb25lDQoNCglkZWYgbWFrZVBhcnREaXNwb3NpdGlv
bihzZWxmLCBTVCk6DQogICAgICAgIAlpZiBTVDoNCiAgICAgICAgICAgICAgICAJbD1bXQ0KICAg
ICAgICAgICAgICAgICAgICAgICAgbT17fQ0KICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXk9
U1RbMV0NCgkJCWZvciBpIGluIHJhbmdlKDAsbGVuKGFycmF5KSwyKToNCgkJCQlpdGVtPWFycmF5
W2ldDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPWFycmF5W2krMV0NCgkJ
CQlsLmFwcGVuZChNc2dQYXJhbWV0ZXIoaXRlbSwgdmFsdWUpKQ0KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBtW2l0ZW1dPXZhbHVlDQogICAgICAgICAgICAgICAgCXJldHVybiBQYXJ0
RGlzcG9zaXRpb24oU1RbMF0sIGwsIG0pDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAg
ICAgICAgICAJcmV0dXJuIE5vbmUNCiAgICAgICAgDQoJZGVmIG1ha2VQYXJ0TGlzdChzZWxmLCBN
LCBVSUQsIFBhcnQsIFBMLCBTVCwgRGVwdGgpOg0KICAgICAgICAJTXNnVGV4dD1Ob25lDQogICAg
ICAgICAgICAgICAgTXNnVGV4dFBhcnQ9Tm9uZQ0KICAgICAgICAgICAgICAgIE11bHRpUGFydHM9
W10NCiAgICAgICAgCXBhcnRucj0wDQoJCXdoaWxlIHR5cGUoU1RbcGFydG5yXSk9PXR5cGUoW10p
Og0KICAgICAgICAgICAgICAgIAlNdWx0aVBhcnRzLmFwcGVuZChTVFtwYXJ0bnJdKQ0KICAgICAg
ICAgICAgICAgICAgICAgICAgcGFydG5yPXBhcnRucisxDQogICAgICAgICAgICAgICAgICAgICAg
ICANCiAgICAgICAgICAgICAgICBpZiBwYXJ0bnI+MDoNCiAgICAgICAgICAgICAgICAJIiIiTXVs
dGlwYXJ0IFBhcnQiIiINCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHlUeXBlPSJNVUxUSVBB
UlQiDQogICAgICAgICAgICAgICAgICAgICAgICBCb2R5U3VidHlwZT1TVFtwYXJ0bnIrMF0NCiAg
ICAgICAgICAgICAgICAgICAgICAgIEJvZHlQYXJhbWV0ZXJMaXN0PVNUW3BhcnRucisxXQ0KICAg
ICAgICAgICAgICAgICAgICAgICAgQm9keURpc3Bvc2l0aW9uPXNlbGYubWFrZVBhcnREaXNwb3Np
dGlvbihTVFtwYXJ0bnIrMl0pDQogICAgICAgICAgICAgICAgICAgICAgICBCb2R5TGFuZ3VhZ2U9
U1RbcGFydG5yKzNdDQogICAgICAgICAgICAgICAgICAgICAgICBpZiBQYXJ0PT0iIjoNCiAgICAg
ICAgICAgICAgICAgICAgICAgIAlIZWFkZXJQYXJ0PSJSRkM4MjIuSEVBREVSIg0KICAgICAgICAg
ICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgIAlIZWFkZXJQYXJ0
PSJCT0RZWyIrUGFydCsiLkhFQURFUl0iDQoJICAgICAgICAgICAgICAgIHRmPU0udWlkKCdGRVRD
SCcsICclZCclKFVJRCwpLCAnJXMnJShIZWFkZXJQYXJ0KSkNCiAgICAgICAgICAgICAgICAgICAg
ICAgCXRzPUNyZWF0ZVN0cnVjdCh0ZlsxXSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHRtPW1h
a2VtYXAodHNbMF1bMV0pDQoJCQlCb2R5SGVhZGVyPXRtW0hlYWRlclBhcnRdDQogICAgICAgICAg
ICAgICAgICAgICAgICBCb2R5QXR0YWNobWVudD1Ob25lDQoJCQlQTC5hcHBlbmQoTXNnUGFydCgN
CiAgICAgICAgICAgICAgICAgICAgICAgIAlCb2R5UGFydD1QYXJ0LA0KCQkgICAgICAgICAgICAg
ICAgQm9keVR5cGU9Qm9keVR5cGUsDQogICAgICAgIAkgICAgICAgICAgICAgICAgQm9keVN1YnR5
cGU9Qm9keVN1YnR5cGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvZHlDb250
ZW50VHlwZT1Cb2R5VHlwZSsiLyIrQm9keVN1YnR5cGUsDQogICAgICAgICAgICAgICAgCSAgICAg
ICAgQm9keVBhcmFtZXRlckxpc3Q9Qm9keVBhcmFtZXRlckxpc3QsDQogICAgICAgICAgICAgICAg
ICAgICAgICAJI0JvZHlJZD1Cb2R5SWQsDQoJICAgICAgICAgICAgICAgICAgICAgICAgI0JvZHlE
ZXNjcmlwdGlvbj1Cb2R5RGVzY3JpcHRpb24sDQogICAgICAgIAkgICAgICAgICAgICAgICAgI0Jv
ZHlFbmNvZGluZz1Cb2R5RW5jb2RpbmcsDQogICAgICAgICAgICAgICAgCSAgICAgICAgI0JvZHlT
aXplPUJvZHlTaXplLA0KCSAgICAgICAgICAgICAgICAgICAgICAgICNCb2R5RW52ZWxvcGU9Qm9k
eUVudmVsb3BlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjQm9keUxpbmVzPUJv
ZHlMaW5lcywNCgkgICAgICAgICAgICAgICAgICAgICAgICAjQm9keU1ENT1Cb2R5TUQ1LA0KICAg
ICAgICAJICAgICAgICAgICAgICAgIEJvZHlEaXNwb3NpdGlvbj1Cb2R5RGlzcG9zaXRpb24sDQog
ICAgICAgICAgICAgICAgCSAgICAgICAgQm9keUxhbmd1YWdlPUJvZHlMYW5ndWFnZSwNCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9keUhlYWRlcj1Cb2R5SGVhZGVyLA0KICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAjQm9keVRleHQ9Qm9keVRleHQsDQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIEJvZHlBdHRhY2htZW50PUJvZHlBdHRhY2htZW50LA0KICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQog
ICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ9MA0KCSAgICAgICAgICAgICAgICBCb2R5VHlw
ZT1TVFswXQ0KICAgICAgICAgICAgICAgICAgICAgICAgQm9keVN1YnR5cGU9U1RbMV0NCiAgICAg
ICAgICAgICAgICAgICAgICAgIEJvZHlQYXJhbWV0ZXJMaXN0PVNUWzJdDQogICAgICAgICAgICAg
ICAgICAgICAgICBCb2R5SWQ9U1RbM10NCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHlEZXNj
cmlwdGlvbj1TVFs0XQ0KICAgICAgICAgICAgICAgICAgICAgICAgQm9keUVuY29kaW5nPVNUWzVd
DQogICAgICAgICAgICAgICAgICAgICAgICBCb2R5U2l6ZT1TVFs2XQ0KICAgICAgICAgICAgICAg
ICAgICAgICAgQm9keUVuY29kaW5nPXN0cmluZy5sb3dlcihCb2R5RW5jb2RpbmcpDQogICAgICAg
ICAgICAgICAgICAgICAgICBCb2R5RW52ZWxvcGU9Tm9uZQ0KICAgICAgICAgICAgICAgICAgICAg
ICAgQm9keVN0cnVjdHVyZT1Ob25lDQogICAgICAgICAgICAgICAgICAgICAgICBCb2R5TGluZXM9
Tm9uZQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgQm9keVR5cGU9PSJNRVNTQUdFIiBhbmQg
Qm9keVN1YnR5cGU9PSJSRkM4MjIiOg0KICAgICAgICAgICAgICAgICAgICAgICAgCXRyeToNCgkJ
ICAgICAgICAgICAgICAgICAgICAgICAgQm9keUVudmVsb3BlPXNlbGYubWFrZUVudmVsb3BlKFNU
WzddKQ0KCQkgICAgICAgICAgICAgICAgICAgICAgICBCb2R5U3RydWN0dXJlPVNUWzcrMV0NCiAg
ICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEJvZHlMaW5lcz1TVFs3KzJdDQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdDoNCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgCXBhc3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0PTMN
CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIEJvZHlUeXBlPT0iVEVYVCI6DQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIEJvZHlMaW5lcz1TVFs3XQ0KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBvZmZzZXQ9MQ0KICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAg
ICAgICAgICAgICAgICAgICBCb2R5TUQ1PVNUWzcrb2Zmc2V0XQ0KICAgICAgICAgICAgICAgICAg
ICAgICAgQm9keURpc3Bvc2l0aW9uPXNlbGYubWFrZVBhcnREaXNwb3NpdGlvbihTVFs4K29mZnNl
dF0pDQogICAgICAgICAgICAgICAgICAgICAgICBCb2R5TGFuZ3VhZ2U9U1RbOStvZmZzZXRdDQoN
CiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHlUZXh0PU5vbmUNCiAgICAgICAgICAgICAgICAg
ICAgICAgIEJvZHlIZWFkZXI9Tm9uZQ0KICAgICAgICAgICAgICAgICAgICAgICAgQm9keU1pbWU9
Tm9uZQ0KICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAj
cHJpbnQNCiAgICAgICAgCSAgICAgICAgI3ByaW50IEJvZHlUeXBlLCBCb2R5U3VidHlwZQ0KICAg
ICAgICAgICAgICAgICAgICAgICAgI3ByaW50DQogICAgICAgICAgICAgICAgICAgICAgICANCiAg
ICAgICAgCSAgICAgICAgaWYgKEJvZHlUeXBlPT0nVEVYVCcgI2FuZCBCb2R5U3VidHlwZT09J1BM
QUlOJw0KICAgICAgICAgICAgICAgICAgICAgICAgCW9yIEJvZHlUeXBlPT0iTUVTU0FHRSIgYW5k
IEJvZHlTdWJ0eXBlIT0iUkZDODIyIg0KICAgICAgICAgICAgICAgICAgICAgICAgCSk6DQogICAg
ICAgICAgICAgICAgICAgICAgICAJQm9keVBhcnQ9IkJPRFlbIitQYXJ0KyJdIg0KICAgICAgICAg
ICAgICAgICAgICAgICAgCWlmIFBhcnQ9PSIiOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAJSGVhZGVyUGFydD0iUkZDODIyLkhFQURFUiINCgkJICAgICAgICAJICAgICAgICBpZiAo
Qm9keVR5cGU9PSdURVhUJyBhbmQgQm9keVN1YnR5cGU9PSdQTEFJTicpOg0KICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAJCVRleHRQYXJ0PSJSRkM4MjIuVEVYVCINCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAJCVRleHRQYXJ0PSJSRkM4MjIuVEVYVCINCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZWxzZToNCgkJICAgICAgICAJICAgICAgICBpZiAoQm9keVR5cGU9PSdURVhU
JyBhbmQgQm9keVN1YnR5cGU9PSdQTEFJTicpOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAJCVRleHRQYXJ0PSJCT0RZWyIrUGFydCsiLlRFWFRdIg0KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAJCUhlYWRlclBhcnQ9IkJPRFlbIitQYXJ0KyIuSEVBREVSXSINCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAJCUhlYWRlclBhcnQ9IkJPRFlbIitQYXJ0KyIuSEVBREVSXSINCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlUZXh0UGFydD0iQk9EWVsiK1BhcnQrIi5U
RVhUXSINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgSGVhZGVyUGFydCE9IiI6
DQoJICAgICAgICAgICAgICAgIAkJdGY9TS51aWQoJ0ZFVENIJywgJyVkJyUoVUlELCksICcoJXMg
JXMpJyUoSGVhZGVyUGFydCwgVGV4dFBhcnQpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBlbHNlOg0KCSAgICAgICAgICAgICAgICAJCXRmPU0udWlkKCdGRVRDSCcsICclZCclKFVJ
RCwpLCAnJXMnJShUZXh0UGFydCkpDQogICAgICAgICAgICAgICAgICAgICAgIAkJdHM9Q3JlYXRl
U3RydWN0KHRmWzFdKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAl0bT1tYWtlbWFw
KHRzWzBdWzFdKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcHJpbnQgdG0NCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgSGVhZGVyUGFydCE9IiI6DQoJCQkJCUJv
ZHlIZWFkZXI9dG1bSGVhZGVyUGFydF0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
I2lmIEJvZHlUeXBlPT0iTUVTU0FHRSIgYW5kIEJvZHlTdWJ0eXBlPT0iUkZDODIyIjoNCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIwlCb2R5VGV4dD1Ob25lDQogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICNlbHNlOg0KCQkJCUJvZHlUZXh0PXRtW1RleHRQYXJ0XQ0KICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBCb2R5VGV4dD09Tm9uZToNCgkgICAgICAg
ICAgICAgICAgCQl0Zj1NLnVpZCgnRkVUQ0gnLCAnJWQnJShVSUQsKSwgJyVzJyUoQm9keVBhcnQp
KQ0KCSAgICAgICAgICAgICAgICAgICAgICAgCQl0cz1DcmVhdGVTdHJ1Y3QodGZbMV0pDQogICAg
ICAgIAkgICAgICAgICAgICAgICAgICAgICAgIAl0bT1tYWtlbWFwKHRzWzBdWzFdKQ0KCQkJCQlC
b2R5VGV4dD10bVtCb2R5UGFydF0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3By
aW50ICJCT0RZRU5DT0RJTkciLCBCb2R5RW5jb2RpbmcNCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgQm9keUVuY29kaW5nIGluICgncXVvdGVkLXByaW50YWJsZScsICdiYXNlNjQn
KToNCgkJCQkJSW5wdXQ9U3RyaW5nSU8uU3RyaW5nSU8oQm9keVRleHQpDQogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIAlEZWNvZGVkVGV4dD1TdHJpbmdJTy5TdHJpbmdJTygpDQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3ByaW50ICJERUNPREVJTkciLCBC
b2R5RW5jb2RpbmcNCgkJCQkJbWltZXRvb2xzLmRlY29kZShJbnB1dCwgRGVjb2RlZFRleHQsIEJv
ZHlFbmNvZGluZykNCiAgICAgICAgICAgICAgICAJCQlCb2R5VGV4dD1EZWNvZGVkVGV4dC5nZXR2
YWx1ZSgpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBNc2dUZXh0IGFuZCBCb2R5U3VidHlwZT09
J1BMQUlOJzojYW5kIFBhcnQ9PSIiIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJ
TXNnVGV4dD1Cb2R5VGV4dA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IE1zZ1RleHRQYXJ0PVBhcnQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3ByaW50
ICJIRUFERVI6IiwgQm9keUhlYWRlcg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAj
cHJpbnQgIlRFWFQ6IiwgQm9keVRleHQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Qm9keUF0dGFjaG1lbnQ9Tm9uZQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBCb2R5VHlw
ZT09Ik1FU1NBR0UiIGFuZCBCb2R5U3VidHlwZT09IlJGQzgyMiI6DQogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGlmIEJvZHlFbmNvZGluZyBhbmQgQm9keUVuY29kaW5nIGluICgnN2Jp
dCcsJzhiaXQnLCdxdW90ZWQtcHJpbnRhYmxlJyk6DQogICAgICAgIAkgICAgICAgICAgICAgICAg
ICAgICAgICBCb2R5QXR0YWNobWVudD1Ob25lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGVsc2U6DQoJICAgICAgICAgICAgICAgICAgICAgICAgCUJvZHlBdHRhY2htZW50PTENCiAg
ICAgICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICAJQm9k
eUF0dGFjaG1lbnQ9MQ0KICAgICAgICAgICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAg
ICAgICAgICAgICAgCU1pbWVQYXJ0PSJCT0RZWyIrUGFydCsiLk1JTUVdIg0KCQkgICAgICAgICAg
ICAgICAgdGY9TS51aWQoJ0ZFVENIJywgJyVkJyUoVUlELCksICclcyclKE1pbWVQYXJ0KSkNCiAg
ICAgICAgCSAgICAgICAgICAgICAgIAl0cz1DcmVhdGVTdHJ1Y3QodGZbMV0pDQogICAgICAgICAg
ICAgICAgCSAgICAgICAgdG09bWFrZW1hcCh0c1swXVsxXSkNCiAgICAgICAgICAgICAgICAgICAg
ICAgIAkjcHJpbnQgdG0NCgkJCQlCb2R5TWltZT10bVtNaW1lUGFydF0NCiAgICAgICAgICAgICAg
ICAgICAgICAgIGV4Y2VwdDoNCiAgICAgICAgICAgICAgICAgICAgICAgIAlwYXNzDQoNCgkJCVBM
LmFwcGVuZChNc2dQYXJ0KA0KICAgICAgICAgICAgICAgICAgICAgICAgCUJvZHlQYXJ0PVBhcnQs
DQoJCSAgICAgICAgICAgICAgICBCb2R5VHlwZT1Cb2R5VHlwZSwNCiAgICAgICAgCSAgICAgICAg
ICAgICAgICBCb2R5U3VidHlwZT1Cb2R5U3VidHlwZSwNCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgQm9keUNvbnRlbnRUeXBlPUJvZHlUeXBlKyIvIitCb2R5U3VidHlwZSwNCiAgICAg
ICAgICAgICAgICAJICAgICAgICBCb2R5UGFyYW1ldGVyTGlzdD1Cb2R5UGFyYW1ldGVyTGlzdCwN
CiAgICAgICAgICAgICAgICAgICAgICAgIAlCb2R5SWQ9Qm9keUlkLA0KCSAgICAgICAgICAgICAg
ICAgICAgICAgIEJvZHlEZXNjcmlwdGlvbj1Cb2R5RGVzY3JpcHRpb24sDQogICAgICAgIAkgICAg
ICAgICAgICAgICAgQm9keUVuY29kaW5nPUJvZHlFbmNvZGluZywNCiAgICAgICAgICAgICAgICAJ
ICAgICAgICBCb2R5U2l6ZT1Cb2R5U2l6ZSwNCgkgICAgICAgICAgICAgICAgICAgICAgICBCb2R5
RW52ZWxvcGU9Qm9keUVudmVsb3BlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBC
b2R5TGluZXM9Qm9keUxpbmVzLA0KCSAgICAgICAgICAgICAgICAgICAgICAgIEJvZHlNRDU9Qm9k
eU1ENSwNCiAgICAgICAgCSAgICAgICAgICAgICAgICBCb2R5RGlzcG9zaXRpb249Qm9keURpc3Bv
c2l0aW9uLA0KICAgICAgICAgICAgICAgIAkgICAgICAgIEJvZHlMYW5ndWFnZT1Cb2R5TGFuZ3Vh
Z2UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvZHlIZWFkZXI9Qm9keUhlYWRl
ciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9keVRleHQ9Qm9keVRleHQsDQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvZHlNaW1lPUJvZHlNaW1lLA0KICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBCb2R5QXR0YWNobWVudD1Cb2R5QXR0YWNobWVudCwN
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkNCiAgICAgICAgICAgICAgICBpZiBE
ZXB0aD4wOg0KICAgICAgICAgICAgICAgIAlEZXB0aD1EZXB0aC0xDQoJCQlpZiBCb2R5VHlwZT09
Ik1FU1NBR0UiIGFuZCBCb2R5U3VidHlwZT09IlJGQzgyMiIgYW5kIG5vdCBCb2R5QXR0YWNobWVu
dDoNCgkJICAgICAgICAJc2VsZi5tYWtlUGFydExpc3QoTSwgVUlELCBQYXJ0LCBQTCwgQm9keVN0
cnVjdHVyZSwgRGVwdGgpDQogICAgICAgICAgICAgICAgCXBhcnRucj0wDQoJCQl3aGlsZSBwYXJ0
bnI8bGVuKE11bHRpUGFydHMpOg0KICAgICAgICAJICAgICAgICAJaWYgUGFydCE9IiI6DQogICAg
ICAgICAgICAgICAgCSAgICAgICAgCVRoaXNQYXJ0PVBhcnQrIi4iK3N0cihwYXJ0bnIrMSkNCiAg
ICAgICAgICAgICAgICAgICAgICAgIAllbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgCQlU
aGlzUGFydD1zdHIocGFydG5yKzEpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlm
IG5vdCBNc2dUZXh0Og0KCQkgICAgICAgICAgICAgICAgCU1zZ1RleHRQYXJ0LCBNc2dUZXh0PXNl
bGYubWFrZVBhcnRMaXN0KE0sIFVJRCwgVGhpc1BhcnQsIFBMLCBTVFtwYXJ0bnJdLCBEZXB0aCkN
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToNCgkJICAgICAgICAgICAgICAg
IAlzZWxmLm1ha2VQYXJ0TGlzdChNLCBVSUQsIFRoaXNQYXJ0LCBQTCwgU1RbcGFydG5yXSwgRGVw
dGgpDQogICAgICAgIAkgICAgICAgICAgICAgICAgcGFydG5yPXBhcnRucisxDQogICAgICAgICAg
ICAgICAgcmV0dXJuIE1zZ1RleHRQYXJ0LCBNc2dUZXh0IA0KICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICANCiAgICAgICAgZGVmIG1ha2VEYXRlVGltZUZyb21JbnRlcm5hbGRhdGUoc2Vs
ZiwgdGlzKToNCiAgICAgICAgCWlmIGxlbih0aXMpPjIwOg0KCQkJdGk9SW50ZXJuYWxkYXRlMnR1
cGxlKCdJTlRFUk5BTERBVEUgIicrIHRpcyArICciJykNCiAgICAgICAgICAgICAgICBlbHNlOg0K
CQkJdGk9SW50ZXJuYWxkYXRlMnR1cGxlKCdJTlRFUk5BTERBVEUgIicrIHRpcyArICcgKzAwMDAi
JykNCgkJdHJ5Og0KCQkJZHQ9Tm9uZQ0KCQkJZHQ9RGF0ZVRpbWUuRGF0ZVRpbWUoKQ0KCQkJZHQ9
RGF0ZVRpbWUuRGF0ZVRpbWUodGltZS5ta3RpbWUodGkpKQ0KCQlleGNlcHQ6DQogICAgICAgICAg
ICAgICAgCXBhc3MNCiAgICAgICAgICAgICAgICByZXR1cm4gZHQNCiAgICAgICAgICAgICAgICAg
ICAgICAgIAkNCiAgICAgICAgZGVmIG1ha2VEYXRlVGltZUZyb21SZmM4MjIoc2VsZiwgdGlzKToN
CiAgICAgICAgCWlmIGxlbih0aXMpPjI1Og0KICAgICAgICAgICAgICAgIAl0aT1yZmM4MjIubWt0
aW1lX3R6KHJmYzgyMi5wYXJzZWRhdGVfdHoodGlzKSkNCiAgICAgICAgICAgICAgICBlbHNlOg0K
ICAgICAgICAgICAgICAgIAl0aT10aW1lLm1rdGltZShyZmM4MjIucGFyc2VkYXRlKHRpcykpDQoJ
CXRyeToNCgkJCWR0PU5vbmUNCgkJCWR0PURhdGVUaW1lLkRhdGVUaW1lKCkNCgkJCWR0PURhdGVU
aW1lLkRhdGVUaW1lKHRpKQ0KCQlleGNlcHQ6DQogICAgICAgICAgICAgICAgCXBhc3MNCiAgICAg
ICAgICAgICAgICByZXR1cm4gZHQNCiAgICAgICAgICAgICAgICAgICAgICAgIAkNCglkZWYgbWFr
ZU1lc3NhZ2Uoc2VsZiwgTSwgRGVwdGgsIFNUKToNCiAgICAgICAgCSNwcmludCBTVA0KICAgICAg
ICAJTXNnUGFydHM9W10NCiAgICAgICAgCU1zZ1VpZD1TVFsnVUlEJ10NCiAgICAgICAgICAgICAg
ICBNc2dGbGFncz1TVFsnRkxBR1MnXQ0KICAgICAgICAgICAgICAgIE1zZ0ludGVybmFsRGF0ZT1z
ZWxmLm1ha2VEYXRlVGltZUZyb21JbnRlcm5hbGRhdGUoU1RbJ0lOVEVSTkFMREFURSddKQ0KICAg
ICAgICAgICAgICAgIE1zZ1JmYzgyMlNpemU9WydSRkM4MjIuU0laRSddDQogICAgICAgICAgICAg
ICAgTXNnRW52ZWxvcGU9c2VsZi5tYWtlRW52ZWxvcGUoU1RbJ0VOVkVMT1BFJ10pDQoJCU1zZ1Rl
eHRQYXJ0LE1zZ1RleHQ9c2VsZi5tYWtlUGFydExpc3QoTSwgTXNnVWlkLCAiIiwgTXNnUGFydHMs
IFNUWydCT0RZU1RSVUNUVVJFJ10sIERlcHRoKQ0KICAgICAgICAgICAgICAgIHJldHVybiggTXNn
TWVzc2FnZSgNCgkJCU1zZ1VpZD1Nc2dVaWQsDQogICAgICAgICAgICAgICAgCU1zZ0ZsYWdzPU1z
Z0ZsYWdzLA0KICAgICAgICAgICAgICAgIAlNc2dJbnRlcm5hbERhdGU9TXNnSW50ZXJuYWxEYXRl
LA0KICAgICAgICAgICAgICAgIAlNc2dSZmM4MjJTaXplPU1zZ1JmYzgyMlNpemUsDQogICAgICAg
ICAgICAgICAgICAgICAgICBNc2dFbnZlbG9wZT1Nc2dFbnZlbG9wZSwNCiAgICAgICAgICAgICAg
ICAJTXNnUGFydHM9TXNnUGFydHMsDQogICAgICAgICAgICAgICAgICAgICAgICBNc2dUZXh0PU1z
Z1RleHQsDQogICAgICAgICAgICAgICAgICAgICAgICBNc2dUZXh0UGFydD1Nc2dUZXh0UGFydCwN
CiAgICAgICAgICAgICAgICAgICAgICAgICkpDQoNCglkZWYgZ2V0UGFydChzZWxmLCBSRVFVRVNU
LCBSRVNQT05TRSk6DQogICAgICAgIAlpZiBSRVFVRVNULmhhc19rZXkoJ0ZvbGRlcicpOiBGb2xk
ZXI9UkVRVUVTVFsnRm9sZGVyJ10NCiAgICAgICAgICAgICAgICBlbHNlOiBGb2xkZXI9IklOQk9Y
Ig0KICAgICAgICAJaWYgUkVRVUVTVC5oYXNfa2V5KCdNZXNzYWdlJyk6IE1lc3NhZ2U9UkVRVUVT
VFsnTWVzc2FnZSddDQogICAgICAgICAgICAgICAgZWxzZTogTWVzc2FnZT0xDQogICAgICAgIAlp
ZiBSRVFVRVNULmhhc19rZXkoJ1BhcnQnKTogUGFydD1SRVFVRVNUWydQYXJ0J10NCiAgICAgICAg
ICAgICAgICBlbHNlOiBQYXJ0PSIxIg0KICAgICAgICAJaWYgUkVRVUVTVC5oYXNfa2V5KCdNaW1l
RW5jb2RpbmcnKTogTWltZUVuY29kaW5nPXN0cmluZy5sb3dlcihSRVFVRVNUWydNaW1lRW5jb2Rp
bmcnXSkNCiAgICAgICAgICAgICAgICBlbHNlOiBNaW1lRW5jb2Rpbmc9ImJhc2U2NCINCiAgICAg
ICAgCWlmIFJFUVVFU1QuaGFzX2tleSgnQXR0VHlwZScpOiBBdHRUeXBlPXN0cmluZy5sb3dlcihS
RVFVRVNUWydBdHRUeXBlJ10pDQogICAgICAgICAgICAgICAgZWxzZTogQXR0VHlwZT0iIg0KICAg
ICAgICAJaWYgUkVRVUVTVC5oYXNfa2V5KCdBdHRTdWJUeXBlJyk6IEF0dFN1YlR5cGU9c3RyaW5n
Lmxvd2VyKFJFUVVFU1RbJ0F0dFN1YlR5cGUnXSkNCiAgICAgICAgICAgICAgICBlbHNlOiBBdHRT
dWJUeXBlPSIiDQogICAgICAgIAlpZiBSRVFVRVNULmhhc19rZXkoJ0ZpbGVOYW1lJyk6IEZpbGVO
YW1lPXN0cmluZy5sb3dlcihSRVFVRVNUWydGaWxlTmFtZSddKQ0KICAgICAgICAgICAgICAgIGVs
c2U6IEZpbGVOYW1lPSJBVFQwMDAxLkRBVCINCiAgICAgICAgCU09c2VsZi5nZXROZXdDb25uZWN0
aW9uKCkNCgkJTS5zZWxlY3QoRm9sZGVyKQ0KCQlFPU0udWlkKCdGRVRDSCcsICclcyclKE1lc3Nh
Z2UpLCAnQk9EWVslc10nJShQYXJ0KSkNCgkJRVM9Q3JlYXRlU3RydWN0KEVbMV0pDQoJCUVNPW1h
a2VtYXAoRVNbMF1bMV0pDQoJCWlucHV0PVN0cmluZ0lPLlN0cmluZ0lPKEVNWydCT0RZWyVzXScl
KFBhcnQpXSkNCiAgICAgICAgICAgICAgICBvdXRwdXQ9U3RyaW5nSU8uU3RyaW5nSU8oKQ0KCQlt
aW1ldG9vbHMuZGVjb2RlKGlucHV0LCBvdXRwdXQsIE1pbWVFbmNvZGluZykNCiAgICAgICAgICAg
ICAgICBkZWNvZGVkZGF0YT1vdXRwdXQuZ2V0dmFsdWUoKQ0KCQlvcGVuKCIvdG1wL2F0dDIiLCJ3
Iikud3JpdGUoZGVjb2RlZGRhdGEpDQogICAgICAgICAgICAgICAgdW5kZWNvZGVkZGF0YT1pbnB1
dC5nZXR2YWx1ZSgpDQoJCW9wZW4oIi90bXAvYXR0IiwidyIpLndyaXRlKHVuZGVjb2RlZGRhdGEp
DQogICAgICAgICAgICAgICAgI1JFU1BPTlNFLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgQXR0
VHlwZSsnLycrQXR0U3ViVHlwZSsnOyBuYW1lPSJNeU5hbWUudGd6IicpDQogICAgICAgICAgICAg
ICAgUkVTUE9OU0Uuc2V0SGVhZGVyKCdjb250ZW50LXR5cGUnLCBBdHRUeXBlKycvJytBdHRTdWJU
eXBlKQ0KICAgICAgICAgICAgICAgIFJFU1BPTlNFLnNldEhlYWRlcignY29udGVudC1sZW5ndGgn
LCBsZW4oZGVjb2RlZGRhdGEpKQ0KICAgICAgICAgICAgICAgIFJFU1BPTlNFLnNldEhlYWRlcign
Y29udGVudC1kaXNwb3NpdGlvbicsICdhdHRhY2htZW50OyBmaWxlbmFtZT0iJytGaWxlTmFtZSsn
IicpDQogICAgICAgICAgICAgICAgcmV0dXJuIGRlY29kZWRkYXRhDQogICAgICAgICAgICAgICAg
DQogICAgICAgICAgICAgICAgDQoJZGVmIGdldFBhcnRSYXcoc2VsZiwgUGFydCwgT3V0cHV0LCBS
RVFVRVNUKToNCiAgICAgICAgCWlmIFJFUVVFU1QuaGFzX2tleSgnRm9sZGVyJyk6IEZvbGRlcj1S
RVFVRVNUWydGb2xkZXInXQ0KICAgICAgICAgICAgICAgIGVsc2U6IEZvbGRlcj0iSU5CT1giDQog
ICAgICAgIAlpZiBSRVFVRVNULmhhc19rZXkoJ01lc3NhZ2UnKTogTWVzc2FnZT1SRVFVRVNUWydN
ZXNzYWdlJ10NCiAgICAgICAgICAgICAgICBlbHNlOiBNZXNzYWdlPTENCiAgICAgICAgCSNpZiBS
RVFVRVNULmhhc19rZXkoJ01pbWVFbmNvZGluZycpOiBNaW1lRW5jb2Rpbmc9c3RyaW5nLmxvd2Vy
KFJFUVVFU1RbJ01pbWVFbmNvZGluZyddKQ0KICAgICAgICAgICAgICAgICNlbHNlOiBNaW1lRW5j
b2Rpbmc9ImJhc2U2NCINCiAgICAgICAgCSNpZiBSRVFVRVNULmhhc19rZXkoJ0F0dFR5cGUnKTog
QXR0VHlwZT1zdHJpbmcubG93ZXIoUkVRVUVTVFsnQXR0VHlwZSddKQ0KICAgICAgICAgICAgICAg
ICNlbHNlOiBBdHRUeXBlPSIiDQogICAgICAgIAkjaWYgUkVRVUVTVC5oYXNfa2V5KCdBdHRTdWJU
eXBlJyk6IEF0dFN1YlR5cGU9c3RyaW5nLmxvd2VyKFJFUVVFU1RbJ0F0dFN1YlR5cGUnXSkNCiAg
ICAgICAgICAgICAgICAjZWxzZTogQXR0U3ViVHlwZT0iIg0KICAgICAgICAJTT1zZWxmLmdldE5l
d0Nvbm5lY3Rpb24oKQ0KCQlNLnNlbGVjdChGb2xkZXIpDQoJCUU9TS51aWQoJ0ZFVENIJywgJyVz
JyUoTWVzc2FnZSksICdCT0RZWyVzXSclKFBhcnQpKQ0KCQlFUz1DcmVhdGVTdHJ1Y3QoRVsxXSkN
CgkJRU09bWFrZW1hcChFU1swXVsxXSkNCiAgICAgICAgICAgICAgICBPdXRwdXQud3JpdGUoRU1b
J0JPRFlbJXNdJyUoUGFydCldKQ0KICAgICAgICAgICAgICAgIHJldHVybiAxDQogICAgICAgICAg
ICAgICAgDQogICAgICAgICAgICAgICAgDQoJZGVmIGdldElNQVBNc2coc2VsZiwgRGVwdGg9MjAs
IFJFUVVFU1Q9Tm9uZSk6DQogICAgICAgIAlpZiBSRVFVRVNULmhhc19rZXkoJ0ZvbGRlcicpOiBG
b2xkZXI9UkVRVUVTVFsnRm9sZGVyJ10NCiAgICAgICAgICAgICAgICBlbHNlOiBGb2xkZXI9IklO
Qk9YIg0KICAgICAgICAJaWYgUkVRVUVTVC5oYXNfa2V5KCdNZXNzYWdlJyk6IE1lc3NhZ2U9UkVR
VUVTVFsnTWVzc2FnZSddDQogICAgICAgICAgICAgICAgZWxzZTogTWVzc2FnZT0iMSINCgkJc3Q9
W10NCiAgICAgICAgICAgICAgICBNPXNlbGYuZ2V0Q29ubmVjdGlvbihSRVFVRVNUKQ0KICAgICAg
ICAgICAgICAgIA0KCQlNLnNlbGVjdChGb2xkZXIpDQoJCUU9TS51aWQoJ0ZFVENIJywgJyVkJyUo
aW50KE1lc3NhZ2UpKSwgJyhGTEFHUyBJTlRFUk5BTERBVEUgUkZDODIyLlNJWkUgRU5WRUxPUEUg
Qk9EWVNUUlVDVFVSRSknKQ0KICAgICAgICAgICAgICAgICNwcmludCBFWzFdDQoJCWlmIEVbMV1b
MF0hPU5vbmU6DQoJCQlFUz1DcmVhdGVTdHJ1Y3QoRVsxXSkNCgkJZWxzZToNCgkJCXJldHVybiAo
KQ0KCQlmb3IgbWFpbCBpbiBFUzoNCgkJCXNlcXVlbmNlX251bWJlcj1tYWlsWzBdDQogICAgICAg
ICAgICAgICAgICAgICAgICBtaT1tYWtlbWFwKG1haWxbMV0pDQogICAgICAgICAgICAgICAgICAg
ICAgICBpZiBzZWxmLkNhY2hlcy5oYXNfa2V5KEZvbGRlcik6DQogICAgICAgICAgICAgICAgICAg
ICAgICAJZm9yIG0gaW4gc2VsZi5DYWNoZXNbRm9sZGVyXS5MaXN0Og0KICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAJaWYgbS5VSUQ9PWludChNZXNzYWdlKToNCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAJbS5GbGFncy5hcHBlbmQoJ1xTZWVuJykNCgkgICAg
ICAgICAgICAgICAgI3Jlc3VsdD1NLnVpZCgiU1RPUkUiLCBNZXNzYWdlLCAnK0ZMQUdTJywgJyhc
U2VlbiknKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYubWFrZU1lc3NhZ2Uo
TSwgRGVwdGgsIG1pKQ0KDQoNCg0KY2xhc3MgTG9nb25zOg0KCWRlZiBfX2luaXRfXyhzZWxmKToN
CiAgICAgICAgCXNlbGYuVXNlck1hcD17fQ0KICAgICAgICAJc2VsZi5VSURNYXA9e30NCg0KICAg
ICAgICBkZWYgYWRkTG9nb24oc2VsZiwgTG9nb24pOg0KICAgICAgICAJc2VsZi5Vc2VyTWFwW0xv
Z29uLmdldFVzZXIoKV09TG9nb24NCiAgICAgICAgCXNlbGYuVUlETWFwW0xvZ29uLmdldFVJRCgp
XT1Mb2dvbg0KDQogICAgICAgIGRlZiBkZWxMb2dvbihzZWxmLCBVSUQpOg0KICAgICAgICAgICAg
ICAgIGRlbCBzZWxmLlVzZXJNYXBbc2VsZi5VSURNYXBbVUlEXS5nZXRVc2VyKCldDQogICAgICAg
ICAgICAgICAgZGVsIHNlbGYuVUlETWFwW1VJRF0NCiAgICAgICAgICAgICAgICANCiAgICAgICAg
ZGVmIGNoZWNrVUlEKHNlbGYsIFVJRCwgUkVRVUVTVCk6DQogICAgICAgIAlpZiBzZWxmLlVJRE1h
cC5oYXNfa2V5KFVJRCk6DQogICAgICAgICAgICAgICAgCVJFUVVFU1RbJ1VzZXInXT1zZWxmLlVJ
RE1hcFtVSURdLmdldFVzZXIoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgUkVRVUVTVFsnTG9n
b24nXT1zZWxmLlVJRE1hcFtVSURdDQogICAgICAgICAgICAgICAgICAgICAgICBSRVFVRVNUWydM
b2dvblVJRCddPVVJRA0KICAgICAgICAgICAgICAgICAgICAgICAgZHQ9RGF0ZVRpbWUuRGF0ZVRp
bWUoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgdHo9ZHQuX2xvY2Fsem9uZQ0KICAgICAgICAg
ICAgICAgICAgICAgICAgUkVRVUVTVFsnVGltZVpvbmUnXT10eg0KICAgICAgICAgICAgICAgICAg
ICAgICAgUkVRVUVTVFsnRFQnXT1kdA0KICAgICAgICAgICAgICAgIAlyZXR1cm4gc2VsZi5VSURN
YXBbVUlEXQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgCXJldHVybiBO
b25lDQoNCiAgICAgICAgZGVmIGNoZWNrTG9nb24oc2VsZiwgdGhpc0xvZ29uLCBSRVFVRVNUKToN
CiAgICAgICAgCVVJRD10aGlzTG9nb24uZ2V0VUlEKCkNCiAgICAgICAgCWlmIHNlbGYuVUlETWFw
Lmhhc19rZXkoVUlEKToNCiAgICAgICAgICAgICAgICAJUkVRVUVTVFsnVXNlciddPXNlbGYuVUlE
TWFwW1VJRF0uZ2V0VXNlcigpDQogICAgICAgICAgICAgICAgICAgICAgICBSRVFVRVNUWydMb2dv
biddPXNlbGYuVUlETWFwW1VJRF0NCiAgICAgICAgICAgICAgICAgICAgICAgIFJFUVVFU1RbJ0xv
Z29uVUlEJ109VUlEDQogICAgICAgICAgICAgICAgICAgICAgICBkdD1EYXRlVGltZS5EYXRlVGlt
ZSgpDQogICAgICAgICAgICAgICAgICAgICAgICB0ej1kdC5fbG9jYWx6b25lDQogICAgICAgICAg
ICAgICAgICAgICAgICBSRVFVRVNUWydUaW1lWm9uZWInXT10eg0KICAgICAgICAgICAgICAgICAg
ICAgICAgUkVRVUVTVFsnRFQnXT1kdA0KICAgICAgICAgICAgICAgIAlyZXR1cm4gc2VsZi5VSURN
YXBbVUlEXQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgCXJldHVybiBO
b25lDQoNCkRlZmF1bHRMb2dvbj1Mb2dvbihOb25lLE5vbmUsTm9uZSxOb25lKQ0KDQpTRVNTSU9O
Uk9PVD0iL3Zhci9zcG9vbC93b3JsZHBpbG90L3Nlc3Npb25zIg0KDQppbXBvcnQgY1BpY2tsZQ0K
DQpjbGFzcyBTZXNzaW9ucygNCglBY3F1aXNpdGlvbi5JbXBsaWNpdCwNCglQZXJzaXN0ZW50LA0K
CUFjY2Vzc0NvbnRyb2wuUm9sZS5Sb2xlTWFuYWdlciwNCiAgICAgICAgT0ZTLkZvbGRlci5Gb2xk
ZXIsDQoJKToNCiAgICAgICAgIkRvYyBTdHJpbmcgOi0pIg0KICAgICAgICBzZXNzPXt9DQogICAg
ICAgIGxvZ29ucz17fQ0KICAgICAgICBpbml0aWFsaXplZD0wDQogICAgICAgIERlZmF1bHRXb3Js
ZFBpbG90PU5vbmUNCiAgICAgICAgDQogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToNCiAgICAg
ICAgCSNTZXNzaW9ucy5zZXNzWydfX3JvbGVzX18nXT1Ob25lDQogICAgICAgICAgICAgICAgc2Vs
Zi5pZD0ic2Vzc2lvbnMiDQogICAgICAgICAgICAgICAgcGFzcw0KDQogICAgICAgIGRlZiB0cElk
KHNlbGYpOg0KICAgICAgICAJcmV0dXJuICJzZXNzaW9ucyINCiAgICAgICAgICAgICAgICANCiAg
ICAgICAgZGVmIHRwVVJMKHNlbGYpOg0KICAgICAgICAJcmV0dXJuICJzZXNzaW9ucyINCiAgICAg
ICAgICAgICAgICANCglkZWYgdHBWYWx1ZXMoc2VsZik6DQoJCSIiIlJldHVybnMgYSBsaXN0IG9m
IHRoZSBmb2xkZXIncyBzdWItZm9sZGVycywgdXNlZCBieSB0cmVlIHRhZy4iIiINCiAgICAgICAg
ICAgICAgICByZXR1cm4gc2VsZi5fZ2V0U2Vzc2lvbnMoKQ0KDQogICAgICAgIGRlZiBtYW5hZ2Vf
d29ya3NwYWNlKHNlbGYsIFJFUVVFU1Q9Tm9uZSk6DQoJICAgICAgICAiRG9jIFN0cmluZyA6LSki
DQogICAgICAgIAlyZXR1cm4gRGVmYXVsdExvZ29uLmNhbGxSZXNvdXJjZSgnc2Vzc2lvbnNfbWFu
YWdlX3dvcmtzcGFjZScsIGNsaWVudD1zZWxmLCBtYXBwaW5nPVJFUVVFU1QpDQoNCg0KICAgICAg
ICBkZWYgYWRkU2Vzc2lvbihzZWxmLCBJRCwgbGluayk6DQogICAgICAgIAlTZXNzaW9ucy5zZXNz
W0lEXT1saW5rDQoNCiAgICAgICAgZGVmIGRlbFNlc3Npb24oc2VsZiwgSUQpOg0KICAgICAgICAJ
ZGVsIFNlc3Npb25zLnNlc3NbSURdDQogICAgICAgICAgICAgICAgZGVsIFNlc3Npb25zLmxvZ29u
c1tJRF0NCiAgICAgICAgICAgICAgICBzZWxmLkNvbW1pdCgpDQoNCiAgICAgICAgZGVmIF9nZXRT
ZXNzaW9ucyhzZWxmKToNCiAgICAgICAgCXI9W10NCiAgICAgICAgICAgICAgICBmb3IgaSBpbiBT
ZXNzaW9ucy5zZXNzLmtleXMoKToNCiAgICAgICAgICAgICAgICAJci5hcHBlbmQoU2Vzc2lvbnMu
c2Vzc1tpXSkNCiAgICAgICAgCXJldHVybiByDQoNCiAgICAgICAgZGVmIGZpbmRQcmV2aW91c1Nl
c3Npb24oc2VsZiwgUkVRVUVTVCk6DQogICAgICAgIAlmb3VuZD1Ob25lDQogICAgICAgIAlpZiBS
RVFVRVNULmhhc19rZXkoJ1VzZXInKSBhbmQgUkVRVUVTVC5oYXNfa2V5KCdQYXNzd2QnKToNCiAg
ICAgICAgICAgICAgICAJZm9yIHNlc3NpZCBpbiBTZXNzaW9ucy5zZXNzLmtleXMoKToNCiAgICAg
ICAgICAgICAgICAgICAgICAgIAlzZXNzaW9uPVNlc3Npb25zLnNlc3Nbc2Vzc2lkXQ0KICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZXNzaW9uLl9Mb2dvbi5nZXRVc2VyKCk9PVJF
UVVFU1RbJ1VzZXInXToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWlmIG5vdCBm
b3VuZDoNCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlpZiBzZXNzaW9uLl9Mb2dv
bi5jaGVjayhSRVFVRVNUWydQYXNzd2QnXSk6DQogICAgICAgIAkgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIAlmb3VuZD1zZXNzaW9uLl9Mb2dvbg0KICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGVsc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIAkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHNlbGYuZGVsU2Vzc2lvbihzZXNzaWQpDQogICAgICAgICAgICAgICAgaWYgZm91bmQ6IHNlbGYu
Q29tbWl0KCkNCiAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQNCiAgICAgICAgDQogICAgICAg
IGRlZiByZWdpc3RlckxvZ29uKHNlbGYsIHRoaXNMb2dvbik6DQoJCVNlc3Npb25zLmxvZ29uc1t0
aGlzTG9nb24uZ2V0VUlEKCldPXRoaXNMb2dvbg0KICAgICAgICAgICAgICAgIHNlbGYuQ29tbWl0
KCkNCiAgICAgICAgICAgICAgICANCiAgICAgICAgZGVmIENvbW1pdChzZWxmKToNCiAgICAgICAg
ICAgICAgICBwYXRoPVNFU1NJT05ST09UDQogICAgICAgIAlpZiBub3Qgb3MucGF0aC5pc2Rpcihw
YXRoKToNCiAgICAgICAgICAgICAgICAJb3MubWFrZWRpcnMocGF0aCkNCiAgICAgICAgCWNQaWNr
bGUuUGlja2xlcihvcGVuKFNFU1NJT05ST09UKycvTG9nb25zJywnd2InKSkuZHVtcChTZXNzaW9u
cy5sb2dvbnMpDQogICAgICAgICAgICAgICAgDQogICAgICAgIGRlZiBpbml0aWFsaXplKHNlbGYs
IHBhcmVudCk6DQogICAgICAgIAlpZiBTZXNzaW9ucy5pbml0aWFsaXplZDoNCiAgICAgICAgICAg
ICAgICAJcmV0dXJuIDENCiAgICAgICAgICAgICAgICBTZXNzaW9ucy5pbml0aWFsaXplZD0xDQoJ
CWlmIGhhc2F0dHIocGFyZW50LCAnaW1hcHNlcnZlcicpIGFuZCBwYXJlbnQuaW1hcHNlcnZlciE9
IiI6DQoJCSAgICBpbWFwc2VydmVyID0gcGFyZW50LmltYXBzZXJ2ZXINCgkJZWxzZTogDQoJCSAg
ICBpbWFwc2VydmVyID0gJ2xvY2FsaG9zdCcNCgkJaWYgaGFzYXR0cihwYXJlbnQsICdzbXRwc2Vy
dmVyJykgYW5kIHBhcmVudC5zbXRwc2VydmVyIT0iIjoNCgkJICAgIHNtdHBzZXJ2ZXIgPSBwYXJl
bnQuc210cHNlcnZlcg0KCQllbHNlOiANCgkJICAgIHNtdHBzZXJ2ZXIgPSAnbG9jYWxob3N0Jw0K
ICAgICAgICAgICAgICAgIA0KICAgICAgICAJI3ByaW50ICJJTklUSUFMSVpJTkcgU0VTU0lPTlMi
DQogICAgICAgIAl0cnk6DQoJCQlTZXNzaW9ucy5sb2dvbnM9Y1BpY2tsZS5VbnBpY2tsZXIob3Bl
bihTRVNTSU9OUk9PVCsnL0xvZ29ucycsJ3JiJykpLmxvYWQoKSAgICAgICAgICAgICAgICANCiAg
ICAgICAgCSAgICAgICAgZm9yIGxvZ29uIGluIFNlc3Npb25zLmxvZ29ucy5rZXlzKCk6DQogICAg
ICAgICAgICAgICAgCQlzZWxmLmNyZWF0ZVdvcmxkUGlsb3RTZXNzaW9uKHBhcmVudCwgU2Vzc2lv
bnMubG9nb25zW2xvZ29uXSwgaW1hcHNlcnZlciwgc210cHNlcnZlcikNCiAgICAgICAgICAgICAg
ICBleGNlcHQ6DQogICAgICAgICAgICAgICAgCXBhc3MNCiAgICAgICAgICAgICAgICAgICAgICAg
ICNwcmludCAiRElETlQgV09SSyBUTyBMT0FEIFNFU1NJT05TIg0KDQogICAgICAgIGRlZiBjcmVh
dGVXb3JsZFBpbG90U2Vzc2lvbihzZWxmLCBwYXJlbnQsIHRoaXNMb2dvbiwgaW1hcHNlcnZlciwg
c210cHNlcnZlciwgUkVRVUVTVD1Ob25lKToNCiAgICAgICAgICAgICAgICBpZiB0aGlzTG9nb249
PU5vbmU6DQoJICAgICAgICAJcHJldmlvdXM9c2VsZi5maW5kUHJldmlvdXNTZXNzaW9uKFJFUVVF
U1QpDQogICAgICAgIAkgICAgICAgIGlmIHByZXZpb3VzOg0KICAgICAgICAgICAgICAgICAgICAg
ICAgCXRoaXNMb2dvbj1wcmV2aW91cw0KCQkJCWlmIG5vdCBSRVFVRVNUIGlzIE5vbmU6DQogICAg
ICAgICAgICAgICAgCQkJUkVRVUVTVFsnTG9nb25VSUQnXT10aGlzTG9nb24uZ2V0VUlEKCkNCgkJ
ICAgICAgICAJCVJFUVVFU1RbJ0xvZ29uJ109dGhpc0xvZ29uDQogICAgICAgICAgICAgICAgICAg
ICAgICAJcmV0dXJuIHByZXZpb3VzDQogICAgICAgICAgICAgICAgaWYgdGhpc0xvZ29uPT1Ob25l
Og0KICAgICAgICAgICAgICAgIAlpZiBSRVFVRVNULmhhc19rZXkoJ1VzZXInKSBhbmQgUkVRVUVT
VC5oYXNfa2V5KCdQYXNzd2QnKToNCiAgICAgICAgICAgICAgICAgICAgICAgIAkjcHJpbnQgIiFI
QVMgVVNFUiINCgkgICAgICAgIAkJdGhpc0xvZ29uPUxvZ29uKFJFUVVFU1RbJ1VzZXInXSwgUkVR
VUVTVFsnUGFzc3dkJ10sICIxNzIiLCBpbWFwc2VydmVyKQ0KICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAjcHJpbnQgdGhpc0xvZ29uDQoJCSAgICAgICAgCWlmIHRoaXNMb2dvbi5jaGVj
aygpOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJI3ByaW50ICJDSEVDS0VEIg0K
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJMb2dv
bih0aGlzTG9nb24pDQogICAgICAgICAgICAgICAgCQllbHNlOg0KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAJI3ByaW50ICJGQUlMRUQiDQogICAgICAgICAgICAgICAgICAgICAgICAJ
CXJldHVybiBOb25lDQogICAgICAgICAgICAgICAgCWVsc2U6DQogICAgICAgICAgICAgICAgICAg
ICAgICAJcmV0dXJuIE5vbmUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJCWlm
IG5vdCBSRVFVRVNUIGlzIE5vbmU6DQogICAgICAgICAgICAgICAgCVJFUVVFU1RbJ0xvZ29uVUlE
J109dGhpc0xvZ29uLmdldFVJRCgpDQogICAgICAgIAkJUkVRVUVTVFsnTG9nb24nXT10aGlzTG9n
b24NCgkJTmV3V29ybGRQaWxvdD1Xb3JsZFBpbG90U2Vzc2lvbigNCgkJCQkJCXRoaXNMb2dvbi5n
ZXRVSUQoKSwNCgkJCQkJCXRoaXNMb2dvbi5nZXRVc2VyKCksDQoJCQkJCQl0aGlzTG9nb24uZ2V0
VXNlcigpLA0KCQkJCQkJc210cHNlcnZlciwNCiAgICAgICAgICAgICAgICAJCQkgICAgICAgICkN
CgkJTmV3V29ybGRQaWxvdC5hcV9wYXJlbnQ9cGFyZW50DQogICAgICAgIAlOZXdXb3JsZFBpbG90
Ll9Xb3JsZFBpbG90PXBhcmVudA0KCQlOZXdXb3JsZFBpbG90Ll9Mb2dvbj10aGlzTG9nb24NCgkJ
cD1QZXJtaXNzaW9uKCdWaWV3JyxXb3JsZFBpbG90LnB1YmxpY21ldGhvZHMsIE5ld1dvcmxkUGls
b3QpDQoJCXAuc2V0Um9sZXMoKCdBbm9ueW1vdXMnLCdNYW5hZ2VyJykpDQoJICAgICAgICBzZWxm
LmFkZFNlc3Npb24odGhpc0xvZ29uLmdldFVJRCgpLE5ld1dvcmxkUGlsb3QpDQogICAgICAgICAg
ICAgICAgdGhpc0xvZ29uLlNldHVwKCkNCgkJcmV0dXJuIHRoaXNMb2dvbg0KICAgICAgICAgICAg
ICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgDQogICAgICAgIGRlZiBfX2JvYm9fdHJhdmVy
c2VfXyhzZWxmLCBSRVFVRVNUPU5vbmUsIGtleT1Ob25lKToNCiAgICAgICAgCXRyeTogcmV0dXJu
IGdldGF0dHIoc2VsZiwga2V5KQ0KICAgICAgICAgICAgICAgIGV4Y2VwdDogDQoJICAgICAgICAJ
dHJ5Og0KICAgICAgICAJCQlyZXR1cm4gU2Vzc2lvbnMuc2Vzc1trZXldDQogICAgICAgICAgICAg
ICAgCWV4Y2VwdDoNCiAgICAgICAgICAgICAgICAJCXJhaXNlIEtleUVycm9yDQogICAgICAgICAg
ICAgICAgICAgICAgICANCg0KaW1wb3J0IEdsb2JhbHMNCmltcG9ydCBPRlMuRm9sZGVyDQppbXBv
cnQgc3lzDQppbXBvcnQgWk9EQi5GaWxlU3RvcmFnZQ0KaW1wb3J0IFpPREINCmltcG9ydCBab3Bl
DQppbXBvcnQgWk9EQi5aQXBwbGljYXRpb24NCmltcG9ydCBPRlMuQXBwbGljYXRpb24NCg0KDQoN
CmNsYXNzIENvbXBvc2VyczogIyhBY2Nlc3NDb250cm9sLlJvbGUuUm9sZU1hbmFnZXIpOg0KICAg
ICAgICAiRG9jIFN0cmluZyA6LSkiDQogICAgICAgIHNlc3M9e30NCiAgICAgICAgRGVmYXVsdFdv
cmxkUGlsb3Q9Tm9uZQ0KICAgICAgICBkZWYgX19pbml0X18oc2VsZik6DQogICAgICAgIAlDb21w
b3NlcnMuc2Vzc1snX19yb2xlc19fJ109Tm9uZQ0KICAgICAgICAgICAgICAgIHNlbGYubmV4dGlk
PTENCg0KICAgICAgICAgICAgICAgIA0KICAgICAgICBkZWYgbmV4dElEKHNlbGYpOg0KICAgICAg
ICAJSUQ9c3RyKHNlbGYubmV4dGlkKQ0KICAgICAgICAgICAgICAgIHNlbGYubmV4dGlkPXNlbGYu
bmV4dGlkKzENCiAgICAgICAgICAgICAgICByZXR1cm4gSUQNCiAgICAgICAgICAgICAgICANCiAg
ICAgICAgZGVmIGFkZFNlc3Npb24oc2VsZiwgSUQ9Tm9uZSwgbGluaz1Ob25lKToNCiAgICAgICAg
CUNvbXBvc2Vycy5zZXNzW0lEXT1saW5rDQogICAgICAgICAgICAgICAgcmV0dXJuIElEDQoNCiAg
ICAgICAgZGVmIGRlbFNlc3Npb24oc2VsZiwgSUQpOg0KICAgICAgICAJZGVsIENvbXBvc2Vycy5z
ZXNzW0lEXQ0KDQogICAgICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBrZXkpOg0KICAgICAgICAJ
dHJ5Og0KICAgICAgICAJCXJldHVybiBDb21wb3NlcnMuc2Vzc1trZXldDQogICAgICAgICAgICAg
ICAgZXhjZXB0Og0KICAgICAgICAgICAgICAgIAl0cnk6DQogICAgICAgICAgICAgICAgICAgICAg
ICAJaW50KGtleSkNCgkgICAgICAgICAgICAgICAgCWlmIG5vdCBDb21wb3NlcnMuRGVmYXVsdFdv
cmxkUGlsb3Q6DQoJCQkJCUNvbXBvc2Vycy5EZWZhdWx0V29ybGRQaWxvdD1Xb3JsZFBpbG90KA0K
CQkJCQkJIjAwNyIsDQoJCQkJCQlOb25lLA0KCQkJCQkJTm9uZSwNCgkJCQkJCSgxLDIsMykpDQoJ
CQkJCXA9UGVybWlzc2lvbignVmlldycsIFdvcmxkUGlsb3QucHVibGljbWV0aG9kcywgU2Vzc2lv
bnMuRGVmYXVsdFdvcmxkUGlsb3QpDQoJCQkJCXAuc2V0Um9sZXMoKCdBbm9ueW1vdXMnLCdNYW5h
Z2VyJykpDQogICAgICAgICAgICAgICAgCQlyZXR1cm4gQ29tcG9zZXJzLkRlZmF1bHRXb3JsZFBp
bG90DQogICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQ6DQogICAgICAgICAgICAgICAgICAg
ICAgICAJcmFpc2UgS2V5RXJyb3INCg0KDQppbXBvcnQgV1BzbXRwbGliDQoNCmNsYXNzIFdQU210
cChXUHNtdHBsaWIuU01UUCk6DQoJZG90bGluZT1yZS5jb21waWxlKCdeXC4kJywgcmUuTSkNCglk
ZWYgc2VuZG1haWwoc2VsZixmcm9tX2FkZHIsdG9fYWRkcnMsbXNncyxzYXZlKToNCgkJaWYgbm90
IHNlbGYuaGVsb19yZXNwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgDQoJCQlzZWxmLmhlbG8oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIA0KCQkoY29kZSxyZXNwKT1zZWxmLm1haWwoZnJvbV9h
ZGRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkJaWYgY29kZSA8
PjI1MDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgDQoJCQlzZWxmLnJzZXQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIA0KCQkJcmFpc2UgV1BzbXRwbGliLlNNVFBTZW5kZXJSZWZ1
c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJCXNlbmRl
cnJzPXt9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIA0KCQlmb3IgZWFjaCBpbiB0b19hZGRyczogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkJCShjb2RlLHJlc3ApPXNlbGYucmNwdChl
YWNoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJCQlpZiAoY29k
ZSA8PiAyNTApIGFuZCAoY29kZSA8PiAyNTEpOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIA0KCQkJCXNlbmRlcnJzW2VhY2hdPShjb2RlLHJlc3ApICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICANCgkJaWYgbGVuKHNlbmRlcnJzKT09bGVuKHRvX2FkZHJzKTogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJCQkjdGgnIHNlcnZlciByZWZ1
c2VkIGFsbCBvdXIgcmVjaXBpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCQkJ
c2VsZi5yc2V0KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICANCgkJCXJhaXNlIFdQc210cGxpYi5TTVRQUmVjaXBpZW50c1JlZnVzZWQgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCQljb2RlPXNlbGYuZGF0YSht
c2dzLHNhdmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICANCgkJaWYgY29kZSA8PjI1MCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgDQoJCQlzZWxmLnJzZXQoKSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCQkJcmFpc2UgV1BzbXRw
bGliLlNNVFBEYXRhRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgDQoJCSNpZiB3ZSBnb3QgaGVyZSB0aGVuIHNvbWVib2R5IGdvdCBvdXIgbWFpbCAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCQlyZXR1cm4gc2VuZGVycnMNCiAgICAgICAg
ICAgICAgICANCiAgICAgICAgZGVmIGRhdGEoc2VsZixtc2dzLHNhdmUpOg0KICAgICAgICAJc2Vs
Zi5wdXRjbWQoImRhdGEiKQ0KICAgICAgICAgICAgICAgIChjb2RlLHJlcGwpPXNlbGYuZ2V0cmVw
bHkoKQ0KICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWdsZXZlbCA+MCA6IHByaW50ICJkYXRh
OiIsIChjb2RlLHJlcGwpDQogICAgICAgICAgICAgICAgaWYgY29kZSA8PiAzNTQ6DQogICAgICAg
ICAgICAgICAgCXJldHVybiAtMQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgIAkJZm9y
IG1zZyBpbiBtc2dzOg0KICAgICAgICAgICAgICAgIAkJd2hpbGUgMToNCiAgICAgICAgICAgICAg
ICAgICAgICAgIAkJbGluZT1tc2cucmVhZGxpbmUoKQ0KCSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrDQogICAgICAgIAkgICAgICAgICAgICAgICAgICAg
ICAgICBpZiBsZW4obGluZSk+MSBhbmQgbGluZVstMl09PSJcMDE1IjoNCiAgICAgICAgICAgICAg
ICAJICAgICAgICAgICAgICAgIAlwYXNzICNsaW5lPWxpbmUrIlwwMTIiDQogICAgICAgICAgICAg
ICAgICAgICAgICAJICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAJCWxpbmU9bGluZVs6LTFdKyJcMDE1XDAxMiINCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBzYXZlLndyaXRlKGxpbmUpDQoJICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBpZiBsZW4obGluZSk9PTMgYW5kIGxpbmVbMF09PSIuIjoNCiAgICAgICAgCSAgICAg
ICAgICAgICAgICAgICAgICAgIAlsaW5lPSIuLiIrIlwwMTVcMDEyIg0KICAgICAgICAgICAgICAg
IAkgICAgICAgICAgICAgICAgc2VsZi5zZW5kKGxpbmUpDQoJICAgICAgICAgICAgICAgIHNlbGYu
c2VuZCgiXDAxNVwwMTIuXDAxNVwwMTIiKQ0KICAgICAgICAJICAgICAgICAoY29kZSxtc2cpPXNl
bGYuZ2V0cmVwbHkoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1Z2xldmVs
ID4wIDogcHJpbnQgImRhdGE6IiwgKGNvZGUsbXNnKQ0KICAgICAgICAgICAgICAgICAgICAgICAg
cmV0dXJuIGNvZGUNCg0KDQpTdHJpbmdUeXBlPXR5cGUoJycpDQoNCg0KDQppbXBvcnQgU3RvcmFn
ZS5Mb2NhbFN0b3JhZ2UNCmltcG9ydCBDb21wb25lbnRzLk5vdGVzDQppbXBvcnQgQ29tcG9uZW50
cy5Ub0RvDQppbXBvcnQgQ29tcG9uZW50cy5FdmVudHMNCmltcG9ydCBDb21wb25lbnRzLkFkZHJl
c3NDYXJkcw0KDQpTdG9yYWdlLkxvY2FsU3RvcmFnZS5EZWZhdWx0TG9nb249RGVmYXVsdExvZ29u
DQoNCg0KDQpjbGFzcyBNeVdvcmxkUGlsb3RVc2VyU3RvcmFnZSgNCglTdG9yYWdlLkxvY2FsU3Rv
cmFnZS5Xb3JsZFBpbG90VXNlclN0b3JhZ2UsDQogICAgICAgICk6DQogICAgICAgICJEb2MgU3Ry
aW5nIDotKSINCiAgICAgICAgZGVmIGluaXRpYWxpemUoc2VsZik6DQogICAgICAgICAgICAgICAg
aWYgbm90IG9zLnBhdGguaXNkaXIoc2VsZi5wYXRoKToNCiAgICAgICAgICAgICAgICAJb3MubWFr
ZWRpcnMoc2VsZi5wYXRoKQ0KICAgICAgICAgICAgICAgIHNlbGYubG9hZFN1YkZvbGRlcnMoKQ0K
ICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9zdWJmb2xkZXJzLmhhc19rZXkoJ05vdGVzJyk6
DQogICAgICAgICAgICAgICAgCU5vdGVzPUNvbXBvbmVudHMuTm90ZXMuV29ybGRQaWxvdE5vdGVz
Rm9sZGVyKCdOb3RlcycsICdOb3RlcycsIHNlbGYucGF0aCsnL05vdGVzJykNCiAgICAgICAgICAg
ICAgICAgICAgICAgIE5vdGVzLkNvbW1pdCgpDQogICAgICAgICAgICAgICAgICAgICAgICBkZWwg
Tm90ZXMNCiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5fc3ViZm9sZGVycy5oYXNfa2V5KCdU
b0RvJyk6DQogICAgICAgICAgICAgICAgCVRvRG89Q29tcG9uZW50cy5Ub0RvLldvcmxkUGlsb3RU
b0RvRm9sZGVyKCdUb0RvJywgJ1RvRG8nLCBzZWxmLnBhdGgrJy9Ub0RvJykNCiAgICAgICAgICAg
ICAgICAgICAgICAgIFRvRG8uQ29tbWl0KCkNCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBU
b0RvDQogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuX3N1YmZvbGRlcnMuaGFzX2tleSgnRXZl
bnRzJyk6DQogICAgICAgICAgICAgICAgCUV2ZW50cz1Db21wb25lbnRzLkV2ZW50cy5Xb3JsZFBp
bG90RXZlbnRzRm9sZGVyKCdFdmVudHMnLCAnRXZlbnRzJywgc2VsZi5wYXRoKycvRXZlbnRzJykN
CiAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50cy5Db21taXQoKQ0KICAgICAgICAgICAgICAg
ICAgICAgICAgZGVsIEV2ZW50cw0KICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9zdWJmb2xk
ZXJzLmhhc19rZXkoJ0FkZHJlc3NDYXJkcycpOg0KICAgICAgICAgICAgICAgIAlBZGRyZXNzQ2Fy
ZHM9Q29tcG9uZW50cy5BZGRyZXNzQ2FyZHMuV29ybGRQaWxvdEFkZHJlc3NDYXJkc0ZvbGRlcign
QWRkcmVzc0NhcmRzJywgJ0FkZHJlc3NDYXJkcycsIHNlbGYucGF0aCsnL0FkZHJlc3NDYXJkcycp
DQogICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzQ2FyZHMuQ29tbWl0KCkNCiAgICAgICAg
ICAgICAgICAgICAgICAgIGRlbCBBZGRyZXNzQ2FyZHMNCiAgICAgICAgICAgICAgICBzZWxmLmxv
YWRTdWJGb2xkZXJzKCkNCg0KDQoNCg0KY2xhc3MgV29ybGRQaWxvdE1haWwoDQoJQWNxdWlzaXRp
b24uSW1wbGljaXQsDQoJUGVyc2lzdGVudCwNCglBY2Nlc3NDb250cm9sLlJvbGUuUm9sZU1hbmFn
ZXIsDQogICAgICAgIE9GUy5Gb2xkZXIuRm9sZGVyLA0KCSk6DQoJIiIiQSBXb3JsZFBpbG90IHBy
b2R1Y3QuIiIiDQoJDQoJaWNvbj0nbWlzY18vV29ybGRQaWxvdC93b3JsZHBpbG90Jw0KCQ0KCW1l
dGFfdHlwZT0nV29ybGRQaWxvdCcNCgkNCgltYW5hZ2Vfb3B0aW9ucz0oDQoJCXsnbGFiZWwnOidQ
cm9wZXJ0aWVzJywnYWN0aW9uJzonbWFuYWdlX21haW4nfSwNCgkJeydsYWJlbCc6J1ZpZXcnLCdh
Y3Rpb24nOicnfSwNCgkJeydsYWJlbCc6J1NlY3VyaXR5JywnYWN0aW9uJzonbWFuYWdlX2FjY2Vz
cyd9LA0KCQkpDQoNCglfX2FjX3Blcm1pc3Npb25zX189KA0KCQkoJ1ZpZXcgbWFuYWdlbWVudCBz
Y3JlZW5zJywoJ21hbmFnZV90YWJzJywnbWFuYWdlX21haW4nKSksDQoJCSgnQ2hhbmdlIHBlcm1p
c3Npb25zJywoJ21hbmFnZV9hY2Nlc3MnLCkpLA0KCQkoJ1ZpZXcnLCgnJywnbWVudScsJ3Byb2cn
LCdsb2dvbmh0bWwnKSwoJ0Fub255bW91cycsJ01hbmFnZXInKSksDQoJCSkNCg0KCWRlZiBfX2lu
aXRfXyhzZWxmLGlkLHRpdGxlLFNlc3Npb24sIHNtdHBzZXJ2ZXIpOg0KCQlzZWxmLmlkPWlkDQoJ
CXNlbGYudGl0bGU9dGl0bGUNCiAgICAgICAgICAgICAgICBzZWxmLl9TZXNzaW9uPVNlc3Npb24N
CiAgICAgICAgICAgICAgICBzZWxmLmNvbXBvc2Vycz1Db21wb3NlcnMoKQ0KCQlzZWxmLnNtdHBz
ZXJ2ZXIgPSBzbXRwc2VydmVyDQoJDQoJTXlMb2dvbnM9TG9nb25zKCkNCiAgICAgICAgDQoJcHJv
Z19fcm9sZXNfXz1Ob25lDQoJbWVudV9fcm9sZXNfXz1Ob25lDQogICAgICAgIA0KCW1hbmFnZV9t
YWluPUhUTUxGaWxlKCd3b3JsZHBpbG90SW5mbycsZ2xvYmFscygpKQ0KCW1hbmFnZV93b3Jrc3Bh
Y2U9SFRNTEZpbGUoJ3dvcmxkcGlsb3RJbmZvJyxnbG9iYWxzKCkpDQogICAgICAgIA0KCSNtYW5h
Z2Vfd29ya3NwYWNlPUhUTUwod29ybGRwaWxvdF9tYW5hZ2Vfd29ya3NwYWNlLGdsb2JhbHMoKSkN
Cg0KICAgICAgICBsb2dvPUltYWdlRmlsZSgnbG9nby5naWYnLGdsb2JhbHMoKSkNCiAgICAgICAg
c2hvcnRjdXQ9SW1hZ2VGaWxlKCdzaG9ydGN1dC5naWYnLGdsb2JhbHMoKSkNCiAgICAgICAgcGl4
ZWw9SW1hZ2VGaWxlKCdwaXhlbC5naWYnLGdsb2JhbHMoKSkNCiAgICAgICAgZm9sZGVyPUltYWdl
RmlsZSgnZm9sZGVyLmdpZicsZ2xvYmFscygpKQ0KICAgICAgICB3cGRvd249SW1hZ2VGaWxlKCd3
cGRvd24uZ2lmJyxnbG9iYWxzKCkpDQogICAgICAgIHdwdXA9SW1hZ2VGaWxlKCd3cHVwLmdpZics
Z2xvYmFscygpKQ0KICAgICAgICB3cG5hdmRvd249SW1hZ2VGaWxlKCd3cG5hdmRvd24uZ2lmJyxn
bG9iYWxzKCkpDQogICAgICAgIHdwbmF2dXA9SW1hZ2VGaWxlKCd3cG5hdnVwLmdpZicsZ2xvYmFs
cygpKQ0KICAgICAgICB3cG5hdm1vcmU9SW1hZ2VGaWxlKCd3cG5hdm1vcmUuZ2lmJyxnbG9iYWxz
KCkpDQogICAgICAgIHdwbmF2bGVzcz1JbWFnZUZpbGUoJ3dwbmF2bGVzcy5naWYnLGdsb2JhbHMo
KSkNCiAgICAgICAgd3BuYXZ0b3A9SW1hZ2VGaWxlKCd3cG5hdnRvcC5naWYnLGdsb2JhbHMoKSkN
CiAgICAgICAgd3BuYXZib3Q9SW1hZ2VGaWxlKCd3cG5hdmJvdC5naWYnLGdsb2JhbHMoKSkNCiAg
ICAgICAgd3BuYXZtYXg9SW1hZ2VGaWxlKCd3cG5hdm1heC5naWYnLGdsb2JhbHMoKSkNCiAgICAg
ICAgd3BuYXZtaW49SW1hZ2VGaWxlKCd3cG5hdm1pbi5naWYnLGdsb2JhbHMoKSkNCiAgICAgICAg
d3BpZHh1cD1JbWFnZUZpbGUoJ3dwaWR4dXAuZ2lmJyxnbG9iYWxzKCkpDQogICAgICAgIHdwaWR4
ZG93bj1JbWFnZUZpbGUoJ3dwaWR4ZG93bi5naWYnLGdsb2JhbHMoKSkNCiAgICAgICAgd3BhcnJv
dz1JbWFnZUZpbGUoJ3dwYXJyb3cuZ2lmJyxnbG9iYWxzKCkpDQoNCiAgICAgICAgTG9nSUQ9IiIN
Cg0KDQogICAgICAgIHNlc3Npb25zPVNlc3Npb25zKCkNCiAgICAgICAgDQogICAgICAgIHdwaWNv
bj1JbWFnZUZpbGUoJ01haWwuZ2lmJyxnbG9iYWxzKCkpDQogICAgICAgIA0KCXB1YmxpY21ldGhv
ZHM9KCcnLCAnc2lnbmF0dXJlJywnZm9sZGVycycsJ2NvbXBvc2UnLCdjb21wb3NlcmhlYWQnLCdj
b21wb3NlcmJvZHknLCdsb2dvZmYnLCdtZW51JywncHJvZycsKQ0KICAgICAgICANCiAgICAgICAg
ZGVmIGxvZ29uKHNlbGYsIFJFUVVFU1Q9Tm9uZSk6DQogICAgICAgIAkibG9ncyBvbiINCiAgICAg
ICAgICAgICAgICBpZiBSRVFVRVNULmhhc19rZXkoJ1VzZXInKSBhbmQgUkVRVUVTVC5oYXNfa2V5
KCdQYXNzd2QnKToNCgkgICAgICAgIAl0aGlzTG9nb249TG9nb24oUkVRVUVTVFsnVXNlciddLCBS
RVFVRVNUWydQYXNzd2QnXSwgIjE3MiIpDQogICAgICAgIAkgICAgICAgIGlmIHRoaXNMb2dvbi5j
aGVjaygpOg0KICAgICAgICAgICAgICAgIAkJI3JldHVybiBzdHIoZGlyKHNlbGYpKQ0KICAgICAg
ICAgICAgICAgIAkJV29ybGRQaWxvdC5NeUxvZ29ucy5hZGRMb2dvbih0aGlzTG9nb24pDQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFUVVFU1RbJ0xvZ29uVUlEJ109dGhpc0xvZ29u
LmdldFVJRCgpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFUVVFU1RbJ0xvZ29u
J109dGhpc0xvZ29uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld1dvcmxkUGls
b3Q9V29ybGRQaWxvdCgNCgkJCQkJdGhpc0xvZ29uLmdldFVJRCgpLA0KCQkJCQl0aGlzTG9nb24u
Z2V0VXNlcigpLA0KCQkJCQkiIiwgICAgICAgICAgICAgICAgDQoJCQkJCVtdKQ0KICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBOZXdXb3JsZFBpbG90LmFxX3BhcmVudD1zZWxmDQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICNOZXdXb3JsZFBpbG90LnN0b3JhZ2U9YXBwPVpv
cGUuYXBwKClbJ1N0b3JhZ2UnXQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwPVBl
cm1pc3Npb24oJ1ZpZXcnLFdvcmxkUGlsb3QucHVibGljbWV0aG9kcywgTmV3V29ybGRQaWxvdCkN
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5zZXRSb2xlcygoJ0Fub255bW91cycs
J01hbmFnZXInKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29ybGRQaWxvdC5z
ZXNzaW9ucy5hZGRTZXNzaW9uKFJFUVVFU1RbJ0xvZ29uVUlEJ10sTmV3V29ybGRQaWxvdCkNCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICNXb3JsZFBpbG90LnN0b3JhZ2VzLmFxX3BhcmVudD1zZWxmDQoNCgkJCQlyZXR1cm4g
dGhpc0xvZ29uDQoJICAgICAgICAgICAgICAgIGVsc2U6DQoJCQkJcmV0dXJuIE5vbmUNCiAgICAg
ICAgICAgICAgICBlbHNlOg0KCQkJcmV0dXJuIE5vbmUNCg0KICAgICAgICBkZWYgdHBWYWx1ZXMo
c2VsZik6DQogICAgICAgIAlyZXR1cm4gKCkNCg0KICAgICAgICBkZWYgbWFuYWdlX3dvcmtzcGFj
ZShzZWxmLCBSRVFVRVNUPU5vbmUpOg0KCSAgICAgICAgIkRvYyBTdHJpbmcgOi0pIg0KICAgICAg
ICAJcmV0dXJuIERlZmF1bHRMb2dvbi5jYWxsUmVzb3VyY2UoJ3Nlc3Npb25zX21hbmFnZV93b3Jr
c3BhY2UnLCBjbGllbnQ9c2VsZiwgbWFwcGluZz1SRVFVRVNUKQ0KDQogICAgICAgIGRlZiBzZXRM
aXN0Q29udHJvbChzZWxmLCBSRVFVRVNUPU5vbmUpOg0KICAgICAgICAJaWYgbm90IFJFUVVFU1Qu
aGFzX2tleSgnTGlzdFNpemUnKToNCiAgICAgICAgICAgICAgICAJUkVRVUVTVFsnTGlzdFNpemUn
XT0yMA0KICAgICAgICAgICAgICAgIGlmIFJFUVVFU1QuaGFzX2tleSgnR09UTycpOg0KICAgICAg
ICAgICAgICAgIAlpZiBSRVFVRVNULmhhc19rZXkoJ3F1ZXJ5X3N0YXJ0Jyk6DQogICAgICAgICAg
ICAgICAgICAgICAgICAJUkVRVUVTVFsncXVlcnlfc3RhcnQnXT0iMSINCiAgICAgICAgDQogICAg
ICAgIGRlZiBhZGRDb21wb3NlcihzZWxmLCBSRVFVRVNUPU5vbmUpOg0KICAgICAgICAJImFkZHMg
YSBDb21wb3NlciINCiAgICAgICAgICAgICAgICBJRD1zZWxmLmNvbXBvc2Vycy5uZXh0SUQoKQ0K
ICAgICAgICAgICAgICAgIE5ld1dvcmxkUGlsb3Q9V29ybGRQaWxvdE1haWwoDQoJCQlJRCwNCgkJ
CXNlbGYudGl0bGUsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9TZXNzaW9uLA0KCQkJ
c2VsZi5zbXRwc2VydmVyLA0KICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAg
ICAgIE5ld1dvcmxkUGlsb3QuYXFfcGFyZW50PXNlbGYNCiAgICAgICAgICAgICAgICBwPVBlcm1p
c3Npb24oJ1ZpZXcnLCBXb3JsZFBpbG90LnB1YmxpY21ldGhvZHMsIE5ld1dvcmxkUGlsb3QpDQog
ICAgICAgICAgICAgICAgcC5zZXRSb2xlcygoJ0Fub255bW91cycsJ01hbmFnZXInKSkNCiAgICAg
ICAgICAgICAgICBSRVFVRVNUWydDb21wb3NlcklEJ109SUQNCiAgICAgICAgICAgICAgICBOZXdX
b3JsZFBpbG90LmxvYWREcmFmdChSRVFVRVNUKQ0KICAgICAgICAgICAgICAgIHNlbGYuY29tcG9z
ZXJzLmFkZFNlc3Npb24oSUQsTmV3V29ybGRQaWxvdCkNCg0KICAgICAgICBkZWYgY3JlYXRlUGFy
dFRtcChzZWxmLCBTdGFydD0yLCBSRVFVRVNUPU5vbmUpOg0KCQl0aGlzTG9nb24gPSBzZWxmLmdl
dExvZ29uKFJFUVVFU1QpDQogICAgICAgIAl0cnk6DQogICAgICAgICAgICAgICAgCU5leHRQYXJ0
SUQ9c2VsZi5OZXh0UGFydElEDQogICAgICAgICAgICAgICAgZXhjZXB0Og0KICAgICAgICAgICAg
ICAgIAl0cnk6DQoJCSAgICAgICAgCXRyeTogb3MubWtkaXIoIi92YXIvc3Bvb2wvd29ybGRwaWxv
dC8iICsgc3RyKHRoaXNMb2dvbi5nZXRVSUQoKSkgKQ0KICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBleGNlcHQ6IHBhc3MNCgkJICAgICAgICAJdHJ5OiBvcy5ta2RpcigiL3Zhci9zcG9v
bC93b3JsZHBpbG90LyIgKyBzdHIodGhpc0xvZ29uLmdldFVJRCgpKSArICIvIiArIFJFUVVFU1Rb
J0NvbXBvc2VySUQnXSApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdDog
cGFzcw0KICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0Og0KICAgICAgICAgICAgICAgICAg
ICAgICAgCXBhc3MNCiAgICAgICAgICAgICAgICAgICAgICAgIE5leHRQYXJ0SUQ9U3RhcnQNCiAg
ICAgICAgICAgICAgICBzZWxmLk5leHRQYXJ0SUQ9TmV4dFBhcnRJRCsxDQogICAgICAgICAgICAg
ICAgcmV0dXJuIE5leHRQYXJ0SUQsb3BlbigiL3Zhci9zcG9vbC93b3JsZHBpbG90LyIgKyBzdHIo
dGhpc0xvZ29uLmdldFVJRCgpKSArIi8iICsgUkVRVUVTVFsnQ29tcG9zZXJJRCddICsgIi8iICtz
dHIoTmV4dFBhcnRJRCksICJ3IikNCg0KICAgICAgICBkZWYgb3BlblBhcnRUbXAoc2VsZiwgUGFy
dElELCBSRVFVRVNUKToNCgkJdGhpc0xvZ29uID0gc2VsZi5nZXRMb2dvbihSRVFVRVNUKQ0KICAg
ICAgICAJdHJ5Og0KCSAgICAgICAgICAgICAgICByZXR1cm4gb3BlbigiL3Zhci9zcG9vbC93b3Js
ZHBpbG90LyIgKyBzdHIodGhpc0xvZ29uLmdldFVJRCgpKSArIi8iICsgUkVRVUVTVFsnQ29tcG9z
ZXJJRCddICsgIi8iICtzdHIoUGFydElEKSwgInIiKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdDoN
CiAgICAgICAgICAgICAgICAJcmV0dXJuIFN0cmluZ0lPLlN0cmluZ0lPKCcnKQ0KDQogICAgICAg
IGRlZiBjcmVhdGVNZXNzYWdlVG1wKHNlbGYsIFJFUVVFU1QpOg0KCQl0aGlzTG9nb24gPSBzZWxm
LmdldExvZ29uKFJFUVVFU1QpDQogICAgICAgIAl0cnk6DQoJICAgICAgICAgICAgICAgIHJldHVy
biBvcGVuKCIvdmFyL3Nwb29sL3dvcmxkcGlsb3QvIiArIHN0cih0aGlzTG9nb24uZ2V0VUlEKCkp
ICsgIi8iICsgUkVRVUVTVFsnQ29tcG9zZXJJRCddICsgIi8iICsgIm1lc3NhZ2UiLCAidyIpDQog
ICAgICAgICAgICAgICAgZXhjZXB0Og0KICAgICAgICAgICAgICAgIAl0cnk6DQoJCSAgICAgICAg
CXRyeTogb3MubWtkaXIoIi92YXIvc3Bvb2wvd29ybGRwaWxvdC8iICsgc3RyKHRoaXNMb2dvbi5n
ZXRVSUQoKSkgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQ6IHBhc3MN
CgkJICAgICAgICAJdHJ5OiBvcy5ta2RpcigiL3Zhci9zcG9vbC93b3JsZHBpbG90LyIgKyBzdHIo
dGhpc0xvZ29uLmdldFVJRCgpKSArICIvIiArIFJFUVVFU1RbJ0NvbXBvc2VySUQnXSApDQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdDogcGFzcw0KICAgICAgICAgICAgICAg
ICAgICAgICAgZXhjZXB0Og0KICAgICAgICAgICAgICAgICAgICAgICAgCXBhc3MNCgkgICAgICAg
IHJldHVybiBvcGVuKCIvdmFyL3Nwb29sL3dvcmxkcGlsb3QvIiArIHN0cih0aGlzTG9nb24uZ2V0
VUlEKCkpICsgIi8iICsgUkVRVUVTVFsnQ29tcG9zZXJJRCddICsgIi8iICsgIm1lc3NhZ2UiLCAi
dyIpDQoNCiAgICAgICAgZGVmIG9wZW5NZXNzYWdlVG1wKHNlbGYsIFJFUVVFU1QpOg0KCQl0aGlz
TG9nb24gPSBzZWxmLmdldExvZ29uKFJFUVVFU1QpDQogICAgICAgIAl0cnk6DQoJICAgICAgICAg
ICAgICAgIHJldHVybiBvcGVuKCIvdmFyL3Nwb29sL3dvcmxkcGlsb3QvIiArIHN0cih0aGlzTG9n
b24uZ2V0VUlEKCkpICsgIi8iICsgUkVRVUVTVFsnQ29tcG9zZXJJRCddICsgIi8iICsgIm1lc3Nh
Z2UiLCAiciIpDQogICAgICAgICAgICAgICAgZXhjZXB0Og0KICAgICAgICAgICAgICAgIAlyZXR1
cm4gU3RyaW5nSU8uU3RyaW5nSU8oJycpDQoNCiAgICAgICAgZGVmIGxvYWREcmFmdChzZWxmLCBS
RVFVRVNUKToNCiAgICAgICAgCUNvbXBvc2VVSUQ9Tm9uZQ0KICAgICAgICAJQ29tcG9zZVN1Ympl
Y3Q9IiINCiAgICAgICAgICAgICAgICBDb21wb3NlRW52VG89Tm9uZQ0KICAgICAgICAgICAgICAg
IENvbXBvc2VFbnZDYz1Ob25lDQogICAgICAgICAgICAgICAgQ29tcG9zZUVudkJjYz1Ob25lDQog
ICAgICAgICAgICAgICAgQ29tcG9zZUVudkluUmVwbHlUbz1Ob25lDQogICAgICAgICAgICAgICAg
Q29tcG9zZVRleHQ9IiINCiAgICAgICAgICAgICAgICBDb21wb3NlUGFydHM9W05vbmVdDQogICAg
ICAgICAgICAgICAgQ29tcG9zZUVudk1lc3NhZ2VJZD1Ob25lDQogICAgICAgICAgICAgICAgQ29t
cG9zZU1zZz1Ob25lDQoJCXRoaXNMb2dvbiA9IHNlbGYuZ2V0TG9nb24oUkVRVUVTVCkNCiAgICAg
ICAgICAgICAgICBpZiB0aGlzTG9nb246DQogICAgICAgICAgICAgICAgCUNvbXBvc2VUZXh0PXRo
aXNMb2dvbi5TaWduYXR1cmUNCiAgICAgICAgICAgICAgICANCiAgICAgICAgCXRyeToNCgkgICAg
ICAgIAlpZiAoUkVRVUVTVC5oYXNfa2V5KCdEcmFmdFNvdXJjZScpIGFuZCBSRVFVRVNUWydEcmFm
dFNvdXJjZSddPT0nRm9yd2FyZCcgb3INCiAgICAgICAgICAgICAgICAgICAgICAgIAlSRVFVRVNU
Lmhhc19rZXkoJ0RyYWZ0U291cmNlRm9yd2FyZCcpKToNCgkJICAgICAgICAgICAgICAgIHRoaXNM
b2dvbiA9IHNlbGYuZ2V0TG9nb24oUkVRVUVTVCkNCiAgICAgICAgICAgICAgICAJCWlmIHRoaXNM
b2dvbjoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VNc2c9
dGhpc0xvZ29uLmdldElNQVBNc2coMSwgUkVRVUVTVCkNCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBpZiBTb3VyY2VNc2cuTXNnRW52ZWxvcGUuRW52U3ViamVjdCE9Tm9u
ZToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJQ29tcG9zZVN1Ympl
Y3Q9U291cmNlTXNnLk1zZ0VudmVsb3BlLkVudlN1YmplY3QNCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIAlDb21wb3NlU3ViamVjdD0iIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIENvbXBvc2VTdWJqZWN0PSJGdzogIiArIENvbXBvc2VTdWJqZWN0DQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydElELFBhcnRUbXBJTz1zZWxm
LmNyZWF0ZVBhcnRUbXAoMiwgUkVRVUVTVCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB0aGlzTG9nb24uZ2V0UGFydFJhdyggIiIsIFBhcnRUbXBJTywgUkVRVUVTVCkN
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb2R5VHlwZT0nbWVzc2Fn
ZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb2R5U3VidHlwZT0n
cmZjODIyJw0KCQkJCQlCb2R5RW5jb2Rpbmc9IjdiaXQiDQoJCQkJCXBhcmFtcz0iIg0KCQkJCQlN
SD0iIg0KCQkJCQlNSD1NSCsnQ29udGVudC1UeXBlOiAlcy8lcyVzXG4nICUgKEJvZHlUeXBlLCBC
b2R5U3VidHlwZSwgcGFyYW1zKQ0KCQkJCQlNSD1NSCsiQ29udGVudC1UcmFuc2Zlci1FbmNvZGlu
ZzogJXNcbiIgJSAoQm9keUVuY29kaW5nKQ0KCQkJCQlNSD1NSCsiXG4iDQoNCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NlUGFydHM9Ww0KICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlOb25lLA0KCQkJCQkJTXNnUGFydCgNCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJc3RyKFBhcnRJRCksCSNCb2R5UGFy
dA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9keVR5
cGU9Qm9keVR5cGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBCb2R5U3VidHlwZT1Cb2R5U3VidHlwZSwgICAgDQogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBCb2R5UGFyYW1ldGVyTGlzdD1Ob25lLA0KICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9keUlkPU5vbmUsDQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb2R5RGVzY3Jp
cHRpb249Tm9uZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJQm9k
eUVuY29kaW5nPUJvZHlFbmNvZGluZywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIEJvZHlTaXplPU5vbmUsDQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBCb2R5RW52ZWxvcGU9Tm9uZSwNCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvZHlMaW5lcz1Ob25lLA0KICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9keU1ENT1Ob25lLA0K
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9keURpc3Bv
c2l0aW9uPVBhcnREaXNwb3NpdGlvbigNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIAkiaW5saW5lIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwNCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwNCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkpLA0KICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9keUxhbmd1YWdlPU5vbmUsDQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb2R5SGVhZGVyPU5vbmUsDQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb2R5VGV4dD1O
b25lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9k
eU1pbWU9TUgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBCb2R5QXR0YWNobWVudD0xLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgQm9keUNvbnRlbnRUeXBlPU5vbmUsDQogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBdDQoJICAgICAgICAJZWxpZiAoUkVRVUVTVC5oYXNfa2V5KCdE
cmFmdFNvdXJjZScpIGFuZCBSRVFVRVNUWydEcmFmdFNvdXJjZSddPT0nUmVwbHknIG9yDQogICAg
ICAgICAgICAgICAgICAgICAgICAJUkVRVUVTVC5oYXNfa2V5KCdEcmFmdFNvdXJjZVJlcGx5Jykp
Og0KCQkgICAgICAgICAgICAgICAgdGhpc0xvZ29uID0gc2VsZi5nZXRMb2dvbihSRVFVRVNUKQ0K
ICAgICAgICAgICAgICAgIAkJaWYgdGhpc0xvZ29uOg0KICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFNvdXJjZU1zZz10aGlzTG9nb24uZ2V0SU1BUE1zZygxLCBSRVFVRVNU
KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIFNvdXJjZU1zZy5N
c2dFbnZlbG9wZS5FbnZTdWJqZWN0IT1Ob25lOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIAlDb21wb3NlU3ViamVjdD1Tb3VyY2VNc2cuTXNnRW52ZWxvcGUuRW52U3Vi
amVjdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCUNvbXBvc2VTdWJqZWN0PSIiDQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zZVN1YmplY3Q9IlJl
OiAiICsgQ29tcG9zZVN1YmplY3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBDb21wb3NlRW52VG89U291cmNlTXNnLk1zZ0VudmVsb3BlLkVudkZyb20NCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NlVGV4dD0iPiAiICsgc3RyaW5n
LmpvaW4oc3RyaW5nLnNwbGl0KFNvdXJjZU1zZy5Nc2dUZXh0LCAiXG4iKSwgIlxuPiAiKSsgIlxu
IiArIHRoaXNMb2dvbi5TaWduYXR1cmUNCiAgICAgICAgICAgICAgICAgICAgICAgIAkNCgkgICAg
ICAgIAllbGlmIChSRVFVRVNULmhhc19rZXkoJ0RyYWZ0U291cmNlJykgYW5kIFJFUVVFU1RbJ0Ry
YWZ0U291cmNlJ109PSdEcmFmdCcpOg0KCQkgICAgICAgICAgICAgICAgdGhpc0xvZ29uID0gc2Vs
Zi5nZXRMb2dvbihSRVFVRVNUKQ0KICAgICAgICAgICAgICAgIAkJaWYgdGhpc0xvZ29uOg0KICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZU1zZz10aGlzTG9nb24u
Z2V0SU1BUE1zZygxLCBSRVFVRVNUKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICNDb21wb3NlVUlEPVNvdXJjZU1zZy5Nc2dVaWQNCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAjQ29tcG9zZVN1YmplY3Q9U291cmNlTXNnLk1zZ0VudmVsb3Bl
LkVudlN1YmplY3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjQ29t
cG9zZVRleHQ9U291cmNlTXNnLk1zZ1RleHQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBDb21wb3NlTXNnPVNvdXJjZU1zZw0KICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGZvciBQYXJ0IGluIENvbXBvc2VNc2cuTXNnUGFydHM6DQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWlmIFBhcnQuQm9keVBhcnQhPUNvbXBv
c2VNc2cuTXNnVGV4dFBhcnQ6DQoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIAlQYXJ0SUQsUGFydFRtcElPPXNlbGYuY3JlYXRlUGFydFRtcCgyLCBSRVFVRVNUKQ0KICAg
ICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJdGhpc0xvZ29uLmdldFBhcnRS
YXcoIFBhcnQuQm9keVBhcnQsIFBhcnRUbXBJTywgUkVRVUVTVCkNCiAgICAgICAgICAgICAgICAg
ICAgICAgIAkNCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6ICNOZXcNCgkgICAgICAgICAg
ICAgICAgCUNvbXBvc2VFbnZUbz1zZWxmLmNvbXBvc2VNc2dBZGRyZXNzKCdDb21wb3NlRW52VG8n
LCBSRVFVRVNUKQ0KICAgICAgICAgICAgICAgICAgICAgICAgCXBhc3MNCiAgICAgICAgICAgICAg
ICBleGNlcHQ6DQoJCQlwYXNzDQoJCWlmIG5vdCBDb21wb3NlTXNnOg0KICAgICAgICAgICAgICAg
IAl0cnk6DQogICAgICAgICAgICAgICAgICAgICAgICAJRnJvbVVzZXIsRnJvbURvbWFpbj1zdHJp
bmcuc3BsaXQodGhpc0xvZ29uLklkZW50aXR5RU1haWwsJ0AnKQ0KICAgICAgICAgICAgICAgICAg
ICAgICAgZXhjZXB0Og0KICAgICAgICAgICAgICAgICAgICAgICAgCUZyb21Vc2VyPXRoaXNMb2dv
bi5nZXRVc2VyKCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJvbURvbWFpbj1X
UERvbWFpbg0KICAgICAgICAgICAgICAgICAgICAgICAgI3ByaW50ICJGUk9NIiwgdGhpc0xvZ29u
LklkZW50aXR5TmFtZSwgRnJvbVVzZXIsIEZyb21Eb21haW4NCgkJCUNvbXBvc2VGcm9tPVtNc2dB
ZGRyZXNzKHRoaXNMb2dvbi5JZGVudGl0eU5hbWUsIE5vbmUsIEZyb21Vc2VyLCBGcm9tRG9tYWlu
KV0NCiAgICAgICAgCQ0KCQkJQ29tcG9zZUVudmVsb3BlPU1zZ0VudmVsb3BlKA0KCQkJCU5vbmUs
IAkJCSNFbnZEYXRlDQoJICAgICAgICAgICAgICAgIAlDb21wb3NlU3ViamVjdCwgCSNFbnZTdWJq
ZWN0DQogICAgICAgIAkgICAgICAgIAlDb21wb3NlRnJvbSwgCQkjRW52RnJvbQ0KICAgICAgICAg
ICAgICAgIAkJTm9uZSwgCQkJI0NvbXBvc2VTZW5kZXI9RW52U2VuZGVyDQogICAgICAgICAgICAg
ICAgCQlOb25lLCAJCQkjQ29tcG9zZVJlcGx5VG89RW52UmVwbHlUbw0KCSAgICAgICAgICAgICAg
ICAJQ29tcG9zZUVudlRvLCAJCSM9RW52VG8NCiAgICAgICAgCSAgICAgICAgCUNvbXBvc2VFbnZD
YywgCQkjPUVudkNjDQogICAgICAgICAgICAgICAgCQlDb21wb3NlRW52QmNjLCAJCSM9RW52QmNj
DQogICAgICAgICAgICAgICAgCQlDb21wb3NlRW52SW5SZXBseVRvLCAJIz1FbnZJblJlcGx5VG8N
CgkgICAgICAgICAgICAgICAgCUNvbXBvc2VFbnZNZXNzYWdlSWQsCSM9RW52TWVzc2FnZUlkDQog
ICAgICAgIAkgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgIAkNCiAgICAgICAgICAg
ICAgICAJc2VsZi5Db21wb3NlTXNnPU1zZ01lc3NhZ2UoDQogICAgICAgICAgICAgICAgCQlDb21w
b3NlVUlELCAJI01zZ1VpZA0KCSAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIAkJI01zZ0Zs
YWdzDQogICAgICAgIAkgICAgICAgICAgICAgICAgTm9uZSwgCQkjTXNnSW50ZXJuYWxEYXRlDQog
ICAgICAgICAgICAgICAgCSAgICAgICAgTm9uZSwgCQkjTXNnUmZjODIyU2l6ZQ0KICAgICAgICAg
ICAgICAgICAgICAgICAgCUNvbXBvc2VFbnZlbG9wZSwjTXNnRW52ZWxvcGUNCgkgICAgICAgICAg
ICAgICAgICAgICAgICBDb21wb3NlUGFydHMsCSNNc2dQYXJ0cw0KICAgICAgICAJICAgICAgICAg
ICAgICAgIENvbXBvc2VUZXh0LAkjTXNnVGV4dA0KICAgICAgICAgICAgICAgIAkgICAgICAgICkN
CiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5Db21w
b3NlTXNnPUNvbXBvc2VNc2cNCg0KICAgICAgICBkZWYgZnJhbWVzZXQoc2VsZiwgUkVRVUVTVD1O
b25lKToNCgkgICAgICAgICJEb2MgU3RyaW5nIDotKSINCiAgICAgICAgCXJldHVybiBzZWxmLmRp
c3BsYXlJZkxvZ2dlZE9uKCdtYWlsX2ZyYW1lc2V0JywgUkVRVUVTVCwgc2VsZi5sb2dvblNjcmVl
bikNCiAgICAgICAgICAgICAgICANCiAgICAgICAgZGVmIGhhbmRsZShzZWxmLCBSRVFVRVNUPU5v
bmUpOg0KCSAgICAgICAgIkRvYyBTdHJpbmcgOi0pIg0KICAgICAgICAJcmV0dXJuIHNlbGYuZGlz
cGxheUlmTG9nZ2VkT24oJ21haWxfaGFuZGxlJywgUkVRVUVTVCwgc2VsZi5sb2dvblNjcmVlbikN
CiAgICAgICAgICAgICAgICANCglkZWYgY29tcG9zZU1zZ0FkZHJlc3Moc2VsZiwgTmFtZSwgUkVR
VUVTVCk6DQogICAgICAgIAlhbD1bXQ0KICAgICAgICAJaWYgUkVRVUVTVC5oYXNfa2V5KE5hbWUp
Og0KICAgICAgICAgICAgICAgIAlhc3RyPXJmYzgyMi5BZGRybGlzdENsYXNzKFJFUVVFU1RbTmFt
ZV0pLmdldGFkZHJsaXN0KCkNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhIGluIGFzdHI6
DQogICAgICAgICAgICAgICAgICAgICAgICAJdHJ5Og0KCQkJCQlBZGRyUGVyc29uYWxOYW1lPWFb
MF0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyQXREb21haW5M
aXN0PU5vbmUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyTWFp
bGJveE5hbWUsIEFkZHJIb3N0TmFtZT1zdHJpbmcuc3BsaXQoYVsxXSwgJ0AnLCAxKQ0KCSAgICAg
ICAgICAgICAgICAgICAgICAgIAlhbC5hcHBlbmQoTXNnQWRkcmVzcygNCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAJQWRkclBlcnNvbmFsTmFtZSwNCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJBdERvbWFpbkxpc3QsDQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyTWFpbGJv
eE5hbWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBB
ZGRySG9zdE5hbWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSkp
DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdDoNCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgCXBhc3MNCiAgICAgICAgICAgICAgICBpZiBsZW4oYWwpOg0KICAg
ICAgICAgICAgICAgIAlyZXR1cm4gYWwNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAg
ICAgICAgIAlyZXR1cm4gTm9uZQ0KDQoJZGVmIGNvbXBvc2VBZGRyZXNzTGlzdEhlYWRlcihzZWxm
LCBNc2dBZGRyZXNzTGlzdCk6DQogICAgICAgIAlUb0xpc3Q9W10NCiAgICAgICAgICAgICAgICBU
b0hlYWRlcj0iIg0KICAgICAgICAgICAgICAgIGlmIE1zZ0FkZHJlc3NMaXN0IT1Ob25lOg0KICAg
ICAgICAgICAgICAgIAlmb3IgaSBpbiBNc2dBZGRyZXNzTGlzdDoNCiAgICAgICAgICAgICAgICAg
ICAgICAgIAlUb0xpc3QuYXBwZW5kKHN0cihpLkFkZHJNYWlsYm94TmFtZSkrIkAiK3N0cihpLkFk
ZHJIb3N0TmFtZSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGkuQWRkclBl
cnNvbmFsTmFtZSBhbmQgaS5BZGRyUGVyc29uYWxOYW1lIT0iIjoNCgkgICAgICAgICAgICAgICAg
ICAgICAgICAJVG9IZWFkZXI9VG9IZWFkZXIrJyInKyBzdHIoaS5BZGRyUGVyc29uYWxOYW1lKSAr
ICciICcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9IZWFkZXI9VG9IZWFkZXIr
JzwnKyBzdHIoaS5BZGRyTWFpbGJveE5hbWUpKyJAIitzdHIoaS5BZGRySG9zdE5hbWUpICsgJz4s
Jw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGVuKFRvSGVhZGVyKTogVG9IZWFkZXI9VG9I
ZWFkZXJbOi0xXQ0KICAgICAgICAgICAgICAgIAlyZXR1cm4gVG9MaXN0LFRvSGVhZGVyDQogICAg
ICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAJcmV0dXJuIE5vbmUsTm9uZQ0KDQoJ
ZGVmIGNvbXBvc2luZyhzZWxmLCBSRVFVRVNUKToNCgkgICAgICAgICJEb2MgU3RyaW5nIDotKSIN
CiAgICAgICAgICAgICAgICBzZWxmLmdldENvbXBvc2VySUQoUkVRVUVTVCkNCiAgICAgICAgICAg
ICAgICBDb21wb3NlTXNnPXNlbGYuQ29tcG9zZU1zZw0KICAgICAgICAgICAgICAgIENvbXBvc2VN
c2cuTXNnRW52ZWxvcGUuRW52VG89c2VsZi5jb21wb3NlTXNnQWRkcmVzcygnQ29tcG9zZUVudlRv
JywgUkVRVUVTVCkNCiAgICAgICAgICAgICAgICBDb21wb3NlTXNnLk1zZ0VudmVsb3BlLkVudkNj
PXNlbGYuY29tcG9zZU1zZ0FkZHJlc3MoJ0NvbXBvc2VFbnZDYycsIFJFUVVFU1QpDQogICAgICAg
ICAgICAgICAgQ29tcG9zZU1zZy5Nc2dFbnZlbG9wZS5FbnZCY2M9c2VsZi5jb21wb3NlTXNnQWRk
cmVzcygnQ29tcG9zZUVudkJjYycsIFJFUVVFU1QpDQogICAgICAgICAgICAgICAgaWYgUkVRVUVT
VC5oYXNfa2V5KCdDb21wb3NlRW52U3ViamVjdCcpOg0KICAgICAgICAgICAgICAgIAlDb21wb3Nl
TXNnLk1zZ0VudmVsb3BlLkVudlN1YmplY3Q9UkVRVUVTVFsnQ29tcG9zZUVudlN1YmplY3QnXQ0K
ICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgCUNvbXBvc2VNc2cuTXNnRW52
ZWxvcGUuRW52U3ViamVjdD0iIg0KICAgICAgICAgICAgICAgIGlmIFJFUVVFU1QuaGFzX2tleSgn
Q29tcG9zZU1zZ1RleHQnKToNCiAgICAgICAgICAgICAgICAJQ29tcG9zZU1zZy5Nc2dUZXh0PVJF
UVVFU1RbJ0NvbXBvc2VNc2dUZXh0J10NCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAg
ICAgICAgIAlDb21wb3NlTXNnLk1zZ1RleHQ9IiINCiAgICAgICAgICAgICAgICAgICAgICAgIA0K
ICAgICAgICAgICAgICAgIGlmIFJFUVVFU1QuaGFzX2tleSgnQXR0YWNoJyk6DQogICAgICAgICAg
ICAgICAgICAgICAgICBpZiBSRVFVRVNULmhhc19rZXkoJ2ZpbGUnKSBhbmQgUkVRVUVTVFsnZmls
ZSddLmZpbGVuYW1lOg0KICAgICAgICAgICAgICAgICAgICAgICAgCWZpbGU9UkVRVUVTVFsnZmls
ZSddDQoJCQkJaGVhZGVycz1oYXNhdHRyKGZpbGUsICdoZWFkZXJzJykgYW5kIGZpbGUuaGVhZGVy
cyBvciBOb25lDQoJCQkJZGF0YT0oaGVhZGVycyBpcyBOb25lKSBhbmQgZmlsZSBvciBmaWxlLnJl
YWQoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGU9Tm9uZQ0K
CQkJCWlmIGhlYWRlcnMgYW5kIGhlYWRlcnMuaGFzX2tleSgnY29udGVudC10eXBlJyk6ICAgICAg
ICAgICAgICAgICANCgkJCQkJY29udGVudF90eXBlPWhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIA0KCQkJCWlmIG5vdCBjb250ZW50X3R5cGU6ICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJCQkJCSNjb250
ZW50X3R5cGUsIGVuYz1taW1ldHlwZXMuZ3Vlc3NfdHlwZShzZWxmLmlkKCkpDQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlPU5vbmUNCgkJCQkJaWYg
bm90IGNvbnRlbnRfdHlwZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0K
CQkJCQkJaWYgY29udGVudF90eXBlcy5maW5kX2JpbmFyeShkYXRhKSA+PSAwOiAgICAgICAgICAg
ICAgIA0KCQkJCQkJCWNvbnRlbnRfdHlwZT0nYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyAgICAg
ICAgICAgDQoJCQkJCQllbHNlOiBjb250ZW50X3R5cGU9Y29udGVudF90eXBlcy50ZXh0X3R5cGUo
ZGF0YSkgICAgICAgICAgICAgDQoJCQkJY29udGVudF90eXBlPXN0cmluZy5sb3dlcihjb250ZW50
X3R5cGUpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvZHlUeXBlLEJvZHlTdWJ0
eXBlPXN0cmluZy5zcGxpdChjb250ZW50X3R5cGUsICIvIikNCgkJCQkjc2VsZi51cGRhdGVfZGF0
YShkYXRhLCBjb250ZW50X3R5cGUpDQoJCQkJaW5wdXQ9U3RyaW5nSU8uU3RyaW5nSU8oZGF0YSkN
CgkgICAgICAgICAgICAgICAgCVBhcnRJRCxQYXJ0VG1wSU89c2VsZi5jcmVhdGVQYXJ0VG1wKDIs
IFJFUVVFU1QpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvZHlFbmNvZGluZz0i
YmFzZTY0Ig0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NlUGFyYW1ldGVy
cz1bTXNnUGFyYW1ldGVyKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJUGFyYW1l
dGVyTmFtZT0iZmlsZW5hbWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIFBhcmFtZXRlclZhbHVlPWZpbGUuZmlsZW5hbWUpDQogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgXQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJh
bXM9JzsgbmFtZT0iJXMiJyAlIChmaWxlLmZpbGVuYW1lKQ0KICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBNSD0iIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjTUg9c3Ry
KGhlYWRlcnMpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwbGl0cz1yZS5zcGxp
dCgiWy9cXFxcXSIsZmlsZS5maWxlbmFtZSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZmlsZW5hbWU9c3BsaXRzWy0xXQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBN
SD1NSCsnQ29udGVudC1UeXBlOiAlcy8lcyVzXG4nICUgKEJvZHlUeXBlLCBCb2R5U3VidHlwZSwg
cGFyYW1zKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSD1NSCsnQ29udGVudC1U
cmFuc2Zlci1FbmNvZGluZzogJXNcbicgJSAoQm9keUVuY29kaW5nKQ0KICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBNSD1NSCsnQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOyBmaWxl
bmFtZT0iJXMiXG4nJShmaWxlLmZpbGVuYW1lKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBNSD1NSCsiXG4iDQoNCgkJCQltaW1ldG9vbHMuZW5jb2RlKGlucHV0LCBQYXJ0VG1wSU8s
IEJvZHlFbmNvZGluZykNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qg
c2VsZi5Db21wb3NlTXNnLk1zZ1BhcnRzOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAJc2VsZi5Db21wb3NlTXNnLk1zZ1BhcnRzPVtOb25lXQ0KICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBzZWxmLkNvbXBvc2VNc2cuTXNnUGFydHMuYXBwZW5kKA0KCQkJCQlNc2dQYXJ0
KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlzdHIoUGFydElEKSwJ
I0JvZHlQYXJ0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBCb2R5VHlwZT1Cb2R5VHlwZSwgCSNCb2R5VHlwZQ0KICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgQm9keVN1YnR5cGU9Qm9keVN1YnR5cGUsCSNCb2R5U3Vi
dHlwZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9k
eVBhcmFtZXRlckxpc3Q9Tm9uZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIEJvZHlJZD1Ob25lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgQm9keURlc2NyaXB0aW9uPU5vbmUsDQogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgCUJvZHlFbmNvZGluZz1Cb2R5RW5jb2RpbmcsDQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb2R5U2l6ZT1Ob25l
LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9keUVu
dmVsb3BlPU5vbmUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBCb2R5TGluZXM9Tm9uZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIEJvZHlNRDU9Tm9uZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIEJvZHlEaXNwb3NpdGlvbj1QYXJ0RGlzcG9zaXRpb24oDQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJImlubGluZSIsDQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENv
bXBvc2VQYXJhbWV0ZXJzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBOb25lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgCSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBCb2R5TGFuZ3VhZ2U9Tm9uZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIEJvZHlIZWFkZXI9Tm9uZSwNCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvZHlUZXh0PU5vbmUsDQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb2R5TWltZT1NSCwNCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvZHlBdHRhY2htZW50
PTEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb2R5
Q29udGVudFR5cGU9Tm9uZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQog
ICAgICAgICAgICAgICAgCXJldHVybiBzZWxmLmRpc3BsYXlJZkxvZ2dlZE9uKCdjb21wb3NlcmJv
ZHknLCBSRVFVRVNULCBzZWxmLmxvZ29uU2NyZWVuKQ0KICAgICAgICAgICAgICAgICAgICAgICAg
DQogICAgICAgICAgICAgICAgCQ0KICAgICAgICAgICAgICAgIGlmIFJFUVVFU1QuaGFzX2tleSgn
U2VuZCcpIG9yIFJFUVVFU1QuaGFzX2tleSgnU2F2ZURyYWZ0Jyk6DQogICAgICAgICAgICAgICAg
CVRvTGlzdCxUb0hlYWRlcj1zZWxmLmNvbXBvc2VBZGRyZXNzTGlzdEhlYWRlcihDb21wb3NlTXNn
Lk1zZ0VudmVsb3BlLkVudlRvKQ0KICAgICAgICAgICAgICAgIAlDY0xpc3QsQ2NIZWFkZXI9c2Vs
Zi5jb21wb3NlQWRkcmVzc0xpc3RIZWFkZXIoQ29tcG9zZU1zZy5Nc2dFbnZlbG9wZS5FbnZDYykN
CiAgICAgICAgICAgICAgICAJQmNjTGlzdCxCY2NIZWFkZXI9c2VsZi5jb21wb3NlQWRkcmVzc0xp
c3RIZWFkZXIoQ29tcG9zZU1zZy5Nc2dFbnZlbG9wZS5FbnZCY2MpDQogICAgICAgICAgICAgICAg
CUZyb21MaXN0LEZyb21IZWFkZXI9c2VsZi5jb21wb3NlQWRkcmVzc0xpc3RIZWFkZXIoQ29tcG9z
ZU1zZy5Nc2dFbnZlbG9wZS5FbnZGcm9tKQ0KICAgICAgICAgICAgICAgIAlTbXRwPVdQU210cChz
ZWxmLnNtdHBzZXJ2ZXIsMjUpDQoNCgkJCU1zZ3M9W10NCg0KICAgICAgICAgICAgICAgICAgICAg
ICAgSD0iIg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgMToJSD1IKyJGcm9tOiAiICsgRnJv
bUhlYWRlciArICJcbiINCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIFRvSGVhZGVyOg0KICAg
ICAgICAgICAgICAgICAgICAgICAgCUg9SCsiVG86ICIgKyBUb0hlYWRlciArICJcbiIgDQogICAg
ICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgCXBhc3Mg
IyBubyB3YXkNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIENjSGVhZGVyOg0KICAgICAgICAg
ICAgICAgICAgICAgICAgCUg9SCsiQ2M6ICIgKyBDY0hlYWRlciArICJcbiINCiAgICAgICAgICAg
ICAgICAgICAgICAgIGlmIDE6DQogICAgICAgICAgICAgICAgICAgICAgICAJSD1IKyJTdWJqZWN0
OiAiICsgQ29tcG9zZU1zZy5Nc2dFbnZlbG9wZS5FbnZTdWJqZWN0ICsgIlxuIiANCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgSD1IKyJEYXRlOiAiICsgRGF0ZVRpbWUuRGF0ZVRpbWUo
KS5yZmM4MjIoKSArICJcbiIgICAgIyEhIVRpbWV6b25lDQogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIEg9SCsiTWltZS1WZXJzaW9uOiAxLjBcbiINCiAgICAgICAgICAgICAgICAgICAg
ICAgIGlmIENvbXBvc2VNc2cuTXNnUGFydHMgYW5kIGxlbihDb21wb3NlTXNnLk1zZ1BhcnRzKT4x
Og0KICAgICAgICAgICAgICAgICAgICAgICAgCWJvdW5kYXJ5PSItLS0tLS0tLS0tLS0iK21pbWV0
b29scy5jaG9vc2VfYm91bmRhcnkoKSsiLS0tLS0tLS0tLS0tIg0KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBIPUgrJ0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFy
eT0iJXMiXG4nICUgIChib3VuZGFyeSwpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IEg9SCsnXG4nDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEg9SCsnVGhpcyBpcyBh
IG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC5cbicNCiAgICAgICAgICAgICAgICAg
ICAgICAgIAkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgTUg9IiINCgkJCU1IPU1IKydDb250
ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9Imlzby04ODU5LTEiXG4nIA0KICAgICAgICAg
ICAgICAgICAgICAgICAgTUg9TUgrIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IHF1b3RlZC1w
cmludGFibGVcbiIgDQogICAgICAgICAgICAgICAgICAgICAgICBNSD1NSCsiXG4iDQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgSGVhZGVy
SU89U3RyaW5nSU8uU3RyaW5nSU8oSCkNCiAgICAgICAgICAgICAgICAgICAgICAgIE1zZ3MuYXBw
ZW5kKEhlYWRlcklPKQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBNaW1lSGVhZGVySU89U3Ry
aW5nSU8uU3RyaW5nSU8oTUgpDQogICAgICAgICAgICAgICAgICAgICAgICBpZiBDb21wb3NlTXNn
Lk1zZ1BhcnRzIGFuZCBsZW4oQ29tcG9zZU1zZy5Nc2dQYXJ0cyk+MToNCgkJCQlNc2dzLmFwcGVu
ZChTdHJpbmdJTy5TdHJpbmdJTygiLS0iK2JvdW5kYXJ5KyJcbiIpKQ0KICAgICAgICAgICAgICAg
ICAgICAgICAgCU1zZ3MuYXBwZW5kKE1pbWVIZWFkZXJJTykNCiAgICAgICAgICAgICAgICAgICAg
ICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICAJTXNncy5hcHBlbmQoTWltZUhlYWRl
cklPKQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZiBsZW4oQ29tcG9zZU1zZy5Nc2dUZXh0
KSBhbmQgQ29tcG9zZU1zZy5Nc2dUZXh0Wy0xXT09J1xuJzoNCgkgICAgICAgICAgICAgICAgICAg
ICAgICBNc2dUZXh0SU89U3RyaW5nSU8uU3RyaW5nSU8oQ29tcG9zZU1zZy5Nc2dUZXh0KyJcbiIp
DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOg0KCSAgICAgICAgICAgICAgICAgICAgICAg
IE1zZ1RleHRJTz1TdHJpbmdJTy5TdHJpbmdJTyhDb21wb3NlTXNnLk1zZ1RleHQrIlxuXG4iKQ0K
ICAgICAgICAgICAgICAgICAgICAgICAgTXNnVGV4dFF1b3RlZElPPVN0cmluZ0lPLlN0cmluZ0lP
KCkNCiAgICAgICAgICAgICAgICAgICAgICAgIG1pbWV0b29scy5lbmNvZGUoTXNnVGV4dElPLCBN
c2dUZXh0UXVvdGVkSU8sICdxdW90ZWQtcHJpbnRhYmxlJykNCiAgICAgICAgICAgICAgICAgICAg
ICAgIE1zZ1RleHRRdW90ZWRJTy5zZWVrKDApDQogICAgICAgICAgICAgICAgICAgICAgICBNc2dz
LmFwcGVuZChNc2dUZXh0UXVvdGVkSU8pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIENv
bXBvc2VNc2cuTXNnUGFydHMgYW5kIGxlbihDb21wb3NlTXNnLk1zZ1BhcnRzKT4xOg0KICAgICAg
ICAgICAgICAgICAgICAgICAgCWZvciBQYXJ0IGluIENvbXBvc2VNc2cuTXNnUGFydHM6DQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlpZiBQYXJ0IGFuZCBQYXJ0LkJvZHlBdHRhY2ht
ZW50Og0KCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCU1IPSIiDQogICAgICAgIAkg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcz0iIg0KICAgICAgICAgICAgICAg
IAkgICAgICAgICAgICAgICAgICAgICAgICBpZiBQYXJ0LkJvZHlQYXJhbWV0ZXJMaXN0Og0KICAg
ICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJcGFzcyAjIG1ha2UgcGFyYW0g
bGlzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBNSD1NSCsnQ29u
dGVudC1UeXBlOiAlcy8lcyVzXG4nICUgKFBhcnQuQm9keVR5cGUsIFBhcnQuQm9keVN1YnR5cGUs
IHBhcmFtcykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlNSD1NSCsiQ29udGVu
dC1UcmFuc2Zlci1FbmNvZGluZzogJXNcbiIgJSAoUGFydC5Cb2R5RW5jb2RpbmcpDQoJICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1IPU1IKyJcbiINCiAgICAgICAgCSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUg9UGFydC5Cb2R5TWltZQ0KDQogICAgICAg
ICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIE1zZ3MuYXBwZW5kKFN0cmluZ0lPLlN0
cmluZ0lPKCItLSIrYm91bmRhcnkrIlxuIikpDQogICAgICAgICAgICAgICAgICAgICAgICAJICAg
ICAgICAgICAgICAgIE1pbWVIZWFkZXJJTz1TdHJpbmdJTy5TdHJpbmdJTyhNSCkNCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgTXNncy5hcHBlbmQoTWltZUhlYWRlcklP
KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlNc2dzLmFwcGVuZChz
ZWxmLm9wZW5QYXJ0VG1wKFBhcnQuQm9keVBhcnQsIFJFUVVFU1QpKQ0KICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBNc2dzLmFwcGVuZChTdHJpbmdJTy5TdHJpbmdJTygiLS0iK2JvdW5kYXJ5KyItLVxuXG4iKSkN
CiAgICAgICAgICAgICAgICAgICAgICAgIA0KDQogICAgICAgICAgICAgICAgICAgICAgICBTZW5k
VG9MaXN0PVtdDQogICAgICAgICAgICAgICAgICAgICAgICBpZiBUb0xpc3Q6IFNlbmRUb0xpc3Q9
U2VuZFRvTGlzdCtUb0xpc3QNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIENjTGlzdDogU2Vu
ZFRvTGlzdD1TZW5kVG9MaXN0K0NjTGlzdA0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgQmNj
TGlzdDogU2VuZFRvTGlzdD1TZW5kVG9MaXN0K0JjY0xpc3QNCiAgICAgICAgICAgICAgICAgICAg
ICAgIA0KCQkgICAgICAgIHRoaXNMb2dvbiA9IHNlbGYuZ2V0TG9nb24oUkVRVUVTVCkNCiAgICAg
ICAgICAgICAgICAgICAgICAgIGlmIFJFUVVFU1QuaGFzX2tleSgnU2VuZCcpOg0KCSAgICAgICAg
ICAgICAgICAJaWYgdGhpc0xvZ29uOg0KICAgICAgICAJICAgICAgICAgICAgICAgIAlzYXZlPXNl
bGYuY3JlYXRlTWVzc2FnZVRtcChSRVFVRVNUKQ0KCSAgICAgICAgCSAgICAgICAgICAgICAgICBT
bXRwLnNlbmRtYWlsKEZyb21MaXN0WzBdLCBTZW5kVG9MaXN0LCBNc2dzLCBzYXZlKQ0KICAgICAg
ICAJICAgICAgICAJICAgICAgICBTbXRwLnF1aXQoKQ0KICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAJc2F2ZS5jbG9zZSgpDQoJICAgICAgICAgICAgICAgICAgICAgICAgCXNhdmU9c2Vs
Zi5vcGVuTWVzc2FnZVRtcChSRVFVRVNUKQ0KICAgICAgICAJICAgICAgICAgICAgICAgIAl0aGlz
TG9nb24uYXBwZW5kTWVzc2FnZSgiSU5CT1guU2VudCIsICJcXFNlZW4iLCBzYXZlLCBSRVFVRVNU
KQ0KCSAgICAgICAgICAgICAgICAJcmV0dXJuIHNlbGYuZGlzcGxheUlmTG9nZ2VkT24oJ2NvbXBv
c2Vyc2VudCcsIFJFUVVFU1QsIHNlbGYubG9nb25TY3JlZW4pDQogICAgICAgICAgICAgICAgICAg
ICAgICBpZiBSRVFVRVNULmhhc19rZXkoJ1NhdmVEcmFmdCcpOg0KCSAgICAgICAgICAgICAgICAJ
aWYgdGhpc0xvZ29uOg0KICAgICAgICAJICAgICAgICAgICAgICAgIAlzYXZlPXNlbGYuY3JlYXRl
TWVzc2FnZVRtcChSRVFVRVNUKQ0KICAgICAgICAgICAgICAgICAgICAgICAgDQoJCSAgICAgICAg
CQlmb3IgbXNnIGluIE1zZ3M6DQogICAgICAgICAgICAgICAgCQkJCXdoaWxlIDE6DQogICAgICAg
ICAgICAgICAgICAgICAgICAJCQkJbGluZT1tc2cucmVhZGxpbmUoKQ0KCQkJICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBpZiBub3QgbGluZTogYnJlYWsNCiAgICAgICAgCQkJICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgbGVuKGxpbmUpPjEgYW5kIGxpbmVbLTJdPT0iXDAxNSI6DQog
ICAgICAgICAgICAgICAgCSAgICAgICAgCQkgICAgICAgIAlwYXNzICNsaW5lPWxpbmUrIlwwMTIi
DQoJCSAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGVsc2U6DQogICAgICAgICAgICAg
ICAgCQkgICAgICAgICAgICAgICAgCQlsaW5lPWxpbmVbOi0xXSsiXDAxNVwwMTIiDQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIAkJICAgICAgICBzYXZlLndyaXRlKGxpbmUpDQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlzYXZlLmNsb3NlKCkNCgkgICAgICAgICAgICAg
ICAgICAgICAgICAJc2F2ZT1zZWxmLm9wZW5NZXNzYWdlVG1wKFJFUVVFU1QpDQogICAgICAgIAkg
ICAgICAgICAgICAgICAgCXRoaXNMb2dvbi5kcmFmdE1lc3NhZ2UoQ29tcG9zZU1zZy5Nc2dVaWQs
ICJJTkJPWC5EcmFmdHMiLCAiXFxTZWVuIFxcRHJhZnQiLCBzYXZlLCBSRVFVRVNUKQ0KICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAJCXJldHVybiBzZWxm
LmRpc3BsYXlJZkxvZ2dlZE9uKCdjb21wb3NlcnNhdmVkJywgUkVRVUVTVCwgc2VsZi5sb2dvblNj
cmVlbikNCiAgICAgICAgICAgICAgICBpZiBSRVFVRVNULmhhc19rZXkoJ0NhbmNlbCcpOg0KICAg
ICAgICAgICAgICAgIAlyZXR1cm4gc2VsZi5kaXNwbGF5SWZMb2dnZWRPbignY29tcG9zZXJjYW5j
ZWxlZCcsIFJFUVVFU1QsIHNlbGYubG9nb25TY3JlZW4pDQogICAgICAgICAgICAgICAgZWxzZToN
CiAgICAgICAgICAgICAgICAJcmV0dXJuIHNlbGYuZGlzcGxheUlmTG9nZ2VkT24oJ2NvbXBvc2Vy
Ym9keScsIFJFUVVFU1QsIHNlbGYubG9nb25TY3JlZW4pDQogICAgICAgICAgICAgICAgDQoNCiAg
ICAgICAgICAgICAgICANCglkZWYgY2hlY2tMb2dvblVJRChzZWxmLExvZ29uVUlEPU5vbmUsIFJF
UVVFU1Q9Tm9uZSk6DQogICAgICAgIAkiY2hlY2tzIHRoZSBMb2dvblVJRCINCiAgICAgICAgICAg
ICAgICBpZiBMb2dvblVJRD09Tm9uZToNCgkJCUxvZ29uVUlEPSIiDQoJCXJldHVybiBXb3JsZFBp
bG90Lk15TG9nb25zLmNoZWNrVUlEKExvZ29uVUlELCBSRVFVRVNUKQ0KDQoNCglkZWYgZ2V0TG9n
b24oc2VsZiwgUkVRVUVTVD1Ob25lKToNCiAgICAgICAgCXJldHVybiBzZWxmLl9TZXNzaW9uLmdl
dExvZ29uKFJFUVVFU1QpDQoNCg0KICAgICAgICBkZWYgY2hlY2tOb3RMb2dnZWRPbihzZWxmLCBS
RVFVRVNUPU5vbmUpOg0KCQlpZiBSRVFVRVNULmhhc19rZXkoJ0xvZ29uVUlEJykgYW5kIHNlbGYu
Y2hlY2tMb2dvblVJRChSRVFVRVNUWydMb2dvblVJRCddLCBSRVFVRVNUKToNCiAgICAgICAgICAg
ICAgICAJcmV0dXJuIDANCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIAl0
cnk6DQogICAgICAgICAgICAgICAgICAgICAgICAJc3BsPXN0cmluZy5zcGxpdChSRVFVRVNUWydV
UkwwJ10sICcvJykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc3BsWy0zXT09
InNlc3Npb25zIiBhbmQgc2VsZi5jaGVja0xvZ29uVUlEKHNwbFstMl0sIFJFUVVFU1QpOg0KCQkJ
CQlyZXR1cm4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIGxlbihzcGwp
PjQgYW5kIHNwbFstNV09PSJzZXNzaW9ucyIgYW5kIHNlbGYuY2hlY2tMb2dvblVJRChzcGxbLTRd
LCBSRVFVRVNUKToNCgkJCQkJcmV0dXJuIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZWxzZToNCgkJCQkJcmFpc2UgS2V5RXJyb3INCiAgICAgICAgICAgICAgICAgICAgICAgIGV4
Y2VwdDoNCgkgICAgICAgICAgICAgICAgCWlmIHNlbGYubG9nb24oUkVRVUVTVCk6DQoJCSAgICAg
ICAgICAgICAgICAJcmV0dXJuIDANCiAgICAgICAgICAgICAgICAJICAgICAgICBlbHNlOg0KICAg
ICAgICAJICAgICAgICAJCXJldHVybiAxDQoNCiAgICAgICAgZGVmIHN0YW5kYXJkX2Vycm9yX21l
c3NhZ2Uoc2VsZiwgUkVRVUVTVD1Ob25lKToNCiAgICAgICAgCXJldHVybiBEZWZhdWx0TG9nb24u
Y2FsbFJlc291cmNlKCdnb3RvbG9nb24nLCBjbGllbnQ9c2VsZiwgbWFwcGluZz1SRVFVRVNUKQ0K
DQogICAgICAgIGRlZiBkaXNwbGF5TG9nb25TY3JlZW4oc2VsZiwgUkVRVUVTVD1Ob25lKToNCiAg
ICAgICAgCXJldHVybiBEZWZhdWx0TG9nb24uY2FsbFJlc291cmNlKCdnb3RvbG9nb24nLCBjbGll
bnQ9c2VsZiwgbWFwcGluZz1SRVFVRVNUKQ0KDQogICAgICAgIGRlZiBkaXNwbGF5SWZMb2dnZWRP
bihzZWxmLCBSZXNvdXJjZU5hbWUsIFJFUVVFU1Q9Tm9uZSwgTG9nb25TY3JlZW49Tm9uZSk6DQoJ
ICAgICAgICAiRG9jIFN0cmluZyA6LSkiDQogICAgICAgICAgICAgICAgdGhpc0xvZ29uID0gc2Vs
Zi5nZXRMb2dvbihSRVFVRVNUKQ0KICAgICAgICAgICAgICAgIGlmIG5vdCB0aGlzTG9nb246DQog
ICAgICAgICAgICAgICAgCWlmIG5vdCBMb2dvblNjcmVlbjogTG9nb25TY3JlZW49c2VsZi5kaXNw
bGF5TG9nb25TY3JlZW4NCiAgICAgICAgICAgICAgICAJcmV0dXJuIExvZ29uU2NyZWVuKFJFUVVF
U1QpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAJcmV0dXJuIHRoaXNM
b2dvbi5jYWxsUmVzb3VyY2UoUmVzb3VyY2VOYW1lLCBjbGllbnQ9c2VsZiwgbWFwcGluZz1SRVFV
RVNUKQ0KDQoJZGVmIGxvZ29uU2NyZWVuKHNlbGYsIFJFUVVFU1QpOg0KCSAgICAgICAgIkRvYyBT
dHJpbmcgOi0pIg0KICAgICAgICAJcmV0dXJuIERlZmF1bHRMb2dvbi5jYWxsUmVzb3VyY2UoJ2xv
Z29uJywgY2xpZW50PXNlbGYsIG1hcHBpbmc9UkVRVUVTVCkNCiAgICAgICAgICAgICAgICAJDQoJ
ZGVmIGluZGV4X2h0bWwoc2VsZiwgUkVRVUVTVCk6DQoJICAgICAgICAiRG9jIFN0cmluZyA6LSki
DQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGlzcGxheUlmTG9nZ2VkT24oJ2luZGV4X2h0
bWwnLCBSRVFVRVNULCBzZWxmLmxvZ29uU2NyZWVuKQ0KICAgICAgICAgICAgICAgIA0KICAgICAg
ICBkZWYgZ2V0Q29tcG9zZXJJRChzZWxmLCBSRVFVRVNUKToNCiAgICAgICAgCXRyeToNCiAgICAg
ICAgICAgICAgICAJc3BsPXN0cmluZy5zcGxpdChSRVFVRVNUWydVUkwwJ10sICcvJykNCiAgICAg
ICAgICAgICAgICAgICAgICAgIGlmIHNwbFstM109PSJjb21wb3NlcnMiOg0KICAgICAgICAgICAg
ICAgICAgICAgICAgCVJFUVVFU1RbJ0NvbXBvc2VySUQnXT1zcGxbLTJdDQoJCQkJcmV0dXJuIHNw
bFstMl0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6DQoJCQkJcmFpc2UgS2V5RXJyb3IN
CiAgICAgICAgICAgICAgICBleGNlcHQ6DQogICAgICAgIAkJcmV0dXJuIE5vbmUNCiAgICAgICAg
ICAgICAgICANCglkZWYgY29tcG9zZXJoZWFkKHNlbGYsIFJFUVVFU1QpOg0KCSAgICAgICAgIkRv
YyBTdHJpbmcgOi0pIg0KICAgICAgICAgICAgICAgIHNlbGYuZ2V0Q29tcG9zZXJJRChSRVFVRVNU
KQ0KICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRpc3BsYXlJZkxvZ2dlZE9uKCdjb21wb3Nl
cmhlYWQnLCBSRVFVRVNULCBzZWxmLmxvZ29uU2NyZWVuKQ0KICAgICAgICAgICAgICAgIA0KCWRl
ZiBjb21wb3NlcmJvZHkoc2VsZiwgUkVRVUVTVCk6DQoJICAgICAgICAiRG9jIFN0cmluZyA6LSki
DQogICAgICAgICAgICAgICAgc2VsZi5nZXRDb21wb3NlcklEKFJFUVVFU1QpDQogICAgICAgICAg
ICAgICAgcmV0dXJuIHNlbGYuZGlzcGxheUlmTG9nZ2VkT24oJ2NvbXBvc2VyYm9keScsIFJFUVVF
U1QsIHNlbGYubG9nb25TY3JlZW4pDQogICAgICAgICAgICAgICAgDQoJZGVmIGNvbXBvc2Uoc2Vs
ZiwgUkVRVUVTVCk6DQoJICAgICAgICAiRG9jIFN0cmluZyA6LSkiDQogICAgICAgICAgICAgICAg
c2VsZi5hZGRDb21wb3NlcihSRVFVRVNUKQ0KICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRp
c3BsYXlJZkxvZ2dlZE9uKCdjb21wb3NlcmZzJywgUkVRVUVTVCwgc2VsZi5sb2dvblNjcmVlbikN
CiAgICAgICAgICAgICAgICANCglkZWYgbG9nb2ZmKHNlbGYsIFJFUVVFU1QpOg0KCSAgICAgICAg
IkRvYyBTdHJpbmcgOi0pIg0KICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRpc3BsYXlJZkxv
Z2dlZE9uKCdnb29kYnllJywgUkVRVUVTVCwgc2VsZi5sb2dvblNjcmVlbikNCiAgICAgICAgICAg
ICAgICANCglkZWYgZ2V0cGFydChzZWxmLCBSRVFVRVNULCBSRVNQT05TRSk6DQogICAgICAgIAki
Z2V0cyBhIHBhcnQiDQogICAgICAgICAgICAgICAgdGhpc0xvZ29uID0gc2VsZi5nZXRMb2dvbihS
RVFVRVNUKQ0KICAgICAgICAgICAgICAgIFJFUVVFU1RbJ1JFUVVFU1QnXT1SRVFVRVNUDQogICAg
ICAgICAgICAgICAgaWYgbm90IHRoaXNMb2dvbjoNCiAgICAgICAgICAgICAgICAJcmV0dXJuIHNl
bGYuZGlzcGxheUxvZ29uU2NyZWVuKFJFUVVFU1QpDQogICAgICAgICAgICAgICAgZWxzZToNCiAg
ICAgICAgICAgICAgICAJcmV0dXJuIHRoaXNMb2dvbi5nZXRQYXJ0KFJFUVVFU1QsIFJFU1BPTlNF
KQ0KDQoJZGVmIHByb2coc2VsZiwgUkVRVUVTVCk6DQoJICAgICAgICAiRG9jIFN0cmluZyA6LSki
DQogICAgICAgICAgICAgICAgdGhpc0xvZ29uID0gc2VsZi5nZXRMb2dvbihSRVFVRVNUKQ0KCQlp
ZiB0aGlzTG9nb246DQogICAgICAgICAgICAgICAgCWlmIFJFUVVFU1QuaGFzX2tleSgnTW92ZVRv
JykgYW5kIFJFUVVFU1QuaGFzX2tleSgnTWVzc2FnZXMnKToNCiAgICAgICAgICAgICAgICAgICAg
ICAgIAl0aGlzTG9nb24ubW92ZU1lc3NhZ2VzKFJFUVVFU1QpDQoJICAgICAgICAgICAgICAgICAg
ICAgICAgdGhpc0xvZ29uLmNsZWFyQ2FjaGUoUkVRVUVTVCkNCiAgICAgICAgICAgICAgICAJaWYg
UkVRVUVTVC5oYXNfa2V5KCdEZWxldGUnKSBhbmQgUkVRVUVTVC5oYXNfa2V5KCdNZXNzYWdlcycp
Og0KICAgICAgICAgICAgICAgICAgICAgICAgCXRoaXNMb2dvbi5kZWxldGVNZXNzYWdlcyhSRVFV
RVNUKQ0KCSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNMb2dvbi5jbGVhckNhY2hlKFJFUVVF
U1QpDQogICAgICAgICAgICAgICAgCWlmIFJFUVVFU1QuaGFzX2tleSgnUmVmcmVzaCcpOg0KCSAg
ICAgICAgICAgICAgICAgICAgICAgIHRoaXNMb2dvbi5jbGVhckNhY2hlKFJFUVVFU1QpDQogICAg
ICAgICAgICAgICAgICAgICAgICBpZiBSRVFVRVNULmhhc19rZXkoJ0RyYWZ0U291cmNlJykgb3Ig
UkVRVUVTVC5oYXNfa2V5KCdEcmFmdFNvdXJjZVJlcGx5Jykgb3IgUkVRVUVTVC5oYXNfa2V5KCdE
cmFmdFNvdXJjZUZvcndhcmQnKSBvciBSRVFVRVNULmhhc19rZXkoJ0NvbXBvc2UnKToNCgkJICAg
ICAgICAgICAgICAgIHNlbGYuYWRkQ29tcG9zZXIoUkVRVUVTVCkNCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgdXJsPVJFUVVFU1RbJ1VSTDEnXSArICIvY29tcG9zZXJzLyIgKyBSRVFV
RVNUWydDb21wb3NlcklEJ10gKyAiL2NvbXBvc2VyYm9keT9CTEE9YmxhIg0KICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBpZiBSRVFVRVNULmhhc19rZXkoJ0RyYWZ0U291cmNlJyk6DQoJ
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw9dXJsKyImRHJhZnRTb3VyY2U9IiAr
IFJFUVVFU1RbJ0RyYWZ0U291cmNlJ10NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgUkVRVUVTVC5oYXNf
a2V5KCdNZXNzYWdlJyk6DQoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw9dXJs
KyImTWVzc2FnZT0iICsgUkVRVUVTVFsnTWVzc2FnZSddDQogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBSRVFVRVNULmhh
c19rZXkoJ0ZvbGRlcicpOg0KCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsPXVy
bCsiJkZvbGRlcj0iICsgUkVRVUVTVFsnRm9sZGVyJ10NCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2Ug
J1JlZGlyZWN0JywgdXJsDQogICAgICAgICAgICAgICAgCWlmIFJFUVVFU1QuaGFzX2tleSgnVmll
d01zZycpIGFuZCBub3QgUkVRVUVTVC5oYXNfa2V5KCdDYW5jZWwnKToNCgkJICAgICAgICAgICAg
ICAgIHJldHVybiBzZWxmLmRpc3BsYXlJZkxvZ2dlZE9uKCd2aWV3bXNnJywgUkVRVUVTVCkNCiAg
ICAgICAgICAgICAgICAJaWYgUkVRVUVTVC5oYXNfa2V5KCdHb1RvJyk6DQogICAgICAgICAgICAg
ICAgICAgICAgICAJUkVRVUVTVFsnRm9sZGVyJ109UkVRVUVTVFsnTW92ZVRvRm9sZGVyJ10NCiAg
ICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kaXNwbGF5SWZMb2dn
ZWRPbigncHJvZycsIFJFUVVFU1QpDQoNCglkZWYgdmlld21zZyhzZWxmLCBSRVFVRVNUKToNCgkg
ICAgICAgICJEb2MgU3RyaW5nIDotKSINCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kaXNw
bGF5SWZMb2dnZWRPbigndmlld21zZycsIFJFUVVFU1QpDQoNCglkZWYgbWVudShzZWxmLCBSRVFV
RVNUKToNCgkgICAgICAgICJEb2MgU3RyaW5nIDotKSINCiAgICAgICAgICAgICAgICByZXR1cm4g
c2VsZi5kaXNwbGF5SWZMb2dnZWRPbignbWVudScsIFJFUVVFU1QpDQoNCglkZWYgZm9sZGVycyhz
ZWxmLCBSRVFVRVNUKToNCgkgICAgICAgICJEb2MgU3RyaW5nIDotKSINCgkJdGhpc0xvZ29uID0g
c2VsZi5nZXRMb2dvbihSRVFVRVNUKQ0KICAgICAgICAgICAgICAgIEVycm9yPU5vbmUNCgkgICAg
ICAgIGlmIHRoaXNMb2dvbjoNCiAgICAgICAgICAgICAgICAJaWYgUkVRVUVTVC5oYXNfa2V5KCdD
cmVhdGVGb2xkZXInKToNCiAgICAgICAgICAgICAgICAgICAgICAgIAlpZiBSRVFVRVNULmhhc19r
ZXkoJ05ld0ZvbGRlcicpIGFuZCBSRVFVRVNUWydOZXdGb2xkZXInXSE9Jyc6DQoJICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBpZiBSRVFVRVNULmhhc19rZXkoJ1BpY2tlZEZvbGRlckZ1
bGxOYW1lJykgYW5kIFJFUVVFU1RbJ1BpY2tlZEZvbGRlckZ1bGxOYW1lJ10hPSIiOg0KCQkgICAg
ICAgICAgICAgICAgICAgICAgICAJdGhpc0xvZ29uLmNyZWF0ZUZvbGRlcihSRVFVRVNUWydQaWNr
ZWRGb2xkZXJGdWxsTmFtZSddKyIuIitSRVFVRVNUWydOZXdGb2xkZXInXSwgUkVRVUVTVCkNCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOglFcnJvcj0iRXJyUGlj
a0luRm9sZGVyIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOglFcnJvcj0i
RXJyRW50ZXJOZXdGb2xkZXIiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgCQ0KICAgICAgICAgICAgICAgIAlpZiBSRVFVRVNULmhhc19rZXkoJ0RlbGV0ZUZvbGRlcicp
Og0KICAgICAgICAgICAgICAgICAgICAgICAgCWlmIFJFUVVFU1QuaGFzX2tleSgnUGlja2VkRm9s
ZGVyRnVsbE5hbWUnKSBhbmQgUkVRVUVTVFsnUGlja2VkRm9sZGVyRnVsbE5hbWUnXSE9Jyc6DQoJ
ICAgICAgICAgICAgICAgICAgICAgICAgCXRoaXNMb2dvbi5kZWxldGVGb2xkZXIoUkVRVUVTVFsn
UGlja2VkRm9sZGVyRnVsbE5hbWUnXSwgUkVRVUVTVCkNCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZWxzZToJRXJyb3I9IkVyclBpY2tEZWxldGVGb2xkZXIiDQogICAgICAgICAgICAg
ICAgaWYgRXJyb3I6IFJFUVVFU1RbJ0Vycm9yJ109RXJyb3INCiAgICAgICAgICAgICAgICAJDQog
ICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGlzcGxheUlmTG9nZ2VkT24oJ2ZvbGRlcnMnLCBS
RVFVRVNUKQ0KDQoJZGVmIHNpZ25hdHVyZShzZWxmLCBSRVFVRVNUKToNCiAgICAgICAgCSJzaWdu
YXR1cmUiDQoJCXRoaXNMb2dvbiA9IHNlbGYuZ2V0TG9nb24oUkVRVUVTVCkNCiAgICAgICAgICAg
ICAgICBFcnJvcj1Ob25lDQoJICAgICAgICBpZiB0aGlzTG9nb246DQogICAgICAgICAgICAgICAg
CWlmIFJFUVVFU1QuaGFzX2tleSgnU2F2ZScpOg0KICAgICAgICAgICAgICAgICAgICAgICAgCWlm
IFJFUVVFU1QuaGFzX2tleSgnU2lnbmF0dXJlVGV4dCcpOiAjIGFuZCBSRVFVRVNUWydTaWduYXR1
cmVUZXh0J10hPScnOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJdGhpc0xvZ29u
LnNhdmVTaWduYXR1cmUoUkVRVUVTVFsnU2lnbmF0dXJlVGV4dCddKQ0KICAgICAgICAgICAgICAg
ICAgICAgICAgCWlmIFJFUVVFU1QuaGFzX2tleSgnSWRlbnRpdHlOYW1lJyk6ICMgYW5kIFJFUVVF
U1RbJ1NpZ25hdHVyZVRleHQnXSE9Jyc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IAl0aGlzTG9nb24uc2F2ZUlkZW50aXR5TmFtZShSRVFVRVNUWydJZGVudGl0eU5hbWUnXSkNCiAg
ICAgICAgICAgICAgICAgICAgICAgIAlpZiBSRVFVRVNULmhhc19rZXkoJ0lkZW50aXR5RU1haWwn
KTogIyBhbmQgUkVRVUVTVFsnU2lnbmF0dXJlVGV4dCddIT0nJzoNCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgCXRoaXNMb2dvbi5zYXZlSWRlbnRpdHlFTWFpbChSRVFVRVNUWydJZGVu
dGl0eUVNYWlsJ10pDQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGlzcGxheUlmTG9nZ2Vk
T24oJ3NpZ25hdHVyZScsIFJFUVVFU1QpDQogICAgICAgICAgICAgICAgDQoNCglkZWYgbWFuYWdl
X2VkaXQoc2VsZix0aXRsZSxSRVFVRVNUPU5vbmUpOg0KCQkiIiJXb3JsZHBpbG90IHNldHRpbmdz
DQoJCQ0KCQkiIiINCgkJc2VsZi50aXRsZT10aXRsZQ0KCQlpZiBSRVFVRVNUIGlzIG5vdCBOb25l
Og0KCQkJcmV0dXJuIE1lc3NhZ2VEaWFsb2coDQoJCQkJdGl0bGU9J0VkaXRlZCcsDQoJCQkJbWVz
c2FnZT0nPHN0cm9uZz4lczwvc3Ryb25nPiBoYXMgYmVlbiBlZGl0ZWQuJyAlIHNlbGYuaWQsDQoJ
CQkJYWN0aW9uID0nLi9tYW5hZ2VfbWFpbicsDQoJCQkJKQ0KDQpjbGFzcyBXb3JsZFBpbG90U2Vz
c2lvbigNCglBY3F1aXNpdGlvbi5JbXBsaWNpdCwNCglBY2Nlc3NDb250cm9sLlJvbGUuUm9sZU1h
bmFnZXIsDQogICAgICAgIE9GUy5Gb2xkZXIuRm9sZGVyLA0KCSk6DQoJIkRvYyBTdHJpbmcgOi0p
Ig0KCQ0KCWljb249J21pc2NfL1dvcmxkUGlsb3Qvd29ybGRwaWxvdCcNCgkNCgltZXRhX3R5cGU9
J1dvcmxkUGlsb3QnDQoJDQoJbWFuYWdlX29wdGlvbnM9KA0KCQl7J2xhYmVsJzonUHJvcGVydGll
cycsJ2FjdGlvbic6J21hbmFnZV9tYWluJ30sDQoJCXsnbGFiZWwnOidWaWV3JywnYWN0aW9uJzon
J30sDQoJCXsnbGFiZWwnOidTZWN1cml0eScsJ2FjdGlvbic6J21hbmFnZV9hY2Nlc3MnfSwNCgkJ
KQ0KDQoJX19hY19wZXJtaXNzaW9uc19fPSgNCgkJKCdWaWV3IG1hbmFnZW1lbnQgc2NyZWVucycs
KCdtYW5hZ2VfdGFicycsJ21hbmFnZV9tYWluJykpLA0KCQkoJ0NoYW5nZSBwZXJtaXNzaW9ucycs
KCdtYW5hZ2VfYWNjZXNzJywpKSwNCgkJKCdDaGFuZ2UgV29ybGRQaWxvdHMnLCgnbWFuYWdlX2Vk
aXQnKSwoJ01hbmFnZXInLCkpLA0KCQkoJ1ZpZXcnLCgnJywnbWVudScsJ3Byb2cnLCdsb2dvbmh0
bWwnKSwoJ0Fub255bW91cycsJ01hbmFnZXInKSksDQoJCSkNCg0KCWRlZiBfX2luaXRfXyhzZWxm
LGlkLHRpdGxlLHVzZXIsc210cHNlcnZlcik6IyxxdWVzdGlvbixjaG9pY2VzKToNCgkJc2VsZi5p
ZD1pZA0KCQlzZWxmLnRpdGxlPXRpdGxlDQogICAgICAgICAgICAgICAgc2VsZi5tYWlsPVdvcmxk
UGlsb3RNYWlsKCdtYWlsJywnTWFpbCcsc2VsZixzbXRwc2VydmVyKQ0KICAgICAgICAgICAgICAg
ICMgY3JlYXRlIHVzZXIgc3RvcmFnZSBpZiBuZWNlc3NhcnkNCiAgICAgICAgICAgICAgICBXb3Js
ZFBpbG90LnN0b3JhZ2UudXNlci5nZXRVc2VyU3RvcmFnZSh1c2VyKQ0KICAgICAgICAgICAgICAg
ICNsaW5rIHRvIG1haW4gc3RvcmFnZQ0KICAgICAgICAgICAgICAgIHNlbGYuc3RvcmFnZT1Xb3Js
ZFBpbG90LnN0b3JhZ2UudXNlcg0KICAgICAgICAgICAgICAgICNzZWxmLnN0b3JhZ2U9U3RvcmFn
ZS5Mb2NhbFN0b3JhZ2UuV29ybGRQaWxvdFN0b3JhZ2VzTWFwcGluZygnc3RvcmFnZScsJ1N0b3Jh
Z2UnLA0KCSAgICAgICAgIyAgICAgICAgKFdvcmxkUGlsb3Quc3RvcmFnZS51c2VyLmdldFVzZXJT
dG9yYWdlKHVzZXIpLCkNCiAgICAgICAgICAgICAgICAjICAgICAgICApDQogICAgICAgICAgICAg
ICAgDQogICAgICAgICAgICAgICAgc2VsZi5jb21wb3NlcnM9Q29tcG9zZXJzKCkNCgkNCglNeUxv
Z29ucz1Mb2dvbnMoKQ0KICAgICAgICANCglwcm9nX19yb2xlc19fPU5vbmUNCgltZW51X19yb2xl
c19fPU5vbmUNCiAgICAgICAgDQoJbWFuYWdlX21haW49SFRNTEZpbGUoJ3dvcmxkcGlsb3RJbmZv
JyxnbG9iYWxzKCkpDQoJbWFuYWdlX3dvcmtzcGFjZT1IVE1MRmlsZSgnd29ybGRwaWxvdEluZm8n
LGdsb2JhbHMoKSkNCg0KICAgICAgICBsb2dvPUltYWdlRmlsZSgnbG9nby5naWYnLGdsb2JhbHMo
KSkNCiAgICAgICAgc2hvcnRjdXQ9SW1hZ2VGaWxlKCdzaG9ydGN1dC5naWYnLGdsb2JhbHMoKSkN
CiAgICAgICAgcGl4ZWw9SW1hZ2VGaWxlKCdwaXhlbC5naWYnLGdsb2JhbHMoKSkNCiAgICAgICAg
Zm9sZGVyPUltYWdlRmlsZSgnZm9sZGVyLmdpZicsZ2xvYmFscygpKQ0KICAgICAgICB3cGRvd249
SW1hZ2VGaWxlKCd3cGRvd24uZ2lmJyxnbG9iYWxzKCkpDQogICAgICAgIHdwdXA9SW1hZ2VGaWxl
KCd3cHVwLmdpZicsZ2xvYmFscygpKQ0KICAgICAgICB3cGxlZnQ9SW1hZ2VGaWxlKCd3cGxlZnQu
Z2lmJyxnbG9iYWxzKCkpDQogICAgICAgIHdwcmlnaHQ9SW1hZ2VGaWxlKCd3cHJpZ2h0LmdpZics
Z2xvYmFscygpKQ0KICAgICAgICB3cGlkeHVwPUltYWdlRmlsZSgnd3BpZHh1cC5naWYnLGdsb2Jh
bHMoKSkNCiAgICAgICAgd3BpZHhkb3duPUltYWdlRmlsZSgnd3BpZHhkb3duLmdpZicsZ2xvYmFs
cygpKQ0KICAgICAgICB3cGFycm93PUltYWdlRmlsZSgnd3BhcnJvdy5naWYnLGdsb2JhbHMoKSkN
CiAgICAgICAgbmhsb2dvPUltYWdlRmlsZSgnbmhsb2dvLmdpZicsZ2xvYmFscygpKQ0KICAgICAg
ICBwYnB5dGhvbj1JbWFnZUZpbGUoJ1B5dGhvblBvd2VyZWRTbWFsbC5naWYnLGdsb2JhbHMoKSkN
CiAgICAgICAgcGJ6b3BlPUltYWdlRmlsZSgnWm9wZUJ1dHRvbi5naWYnLGdsb2JhbHMoKSkNCiAg
ICAgICAgDQoNCiAgICAgICAgTG9nSUQ9IiINCg0KDQogICAgICAgIHNlc3Npb25zPVNlc3Npb25z
KCkNCiAgICAgICAgI3N0b3JhZ2VzPVN0b3JhZ2VzKCkNCiAgICAgICAgDQoJcHVibGljbWV0aG9k
cz0oJycsJ3N0b3JhZ2UnLCAnbG9nb2ZmJywpDQogICAgICAgIA0KCWRlZiBfX2JvYm9fdHJhdmVy
c2VfXyhzZWxmLCBSRVFVRVNUPU5vbmUsIG5hbWU9Tm9uZSk6DQoJCXRoaXNMb2dvbiA9IHNlbGYu
Z2V0TG9nb24oUkVRVUVTVCkNCiAgICAgICAgICAgICAgICBSRVFVRVNUWydTZXNzaW9uJ109c2Vs
Zg0KICAgICAgICAJI3ByaW50ICJUUkFWRVJTSU5HIiwgbmFtZQ0KCQlyZXR1cm4gZ2V0YXR0cihz
ZWxmLCBuYW1lKQ0KICAgICAgICAgICAgICAgICANCiAgICAgICAgZGVmIGxvZ29uKHNlbGYsIFJF
UVVFU1Q9Tm9uZSk6DQogICAgICAgIAkibG9ncyBvbiINCiAgICAgICAgICAgICAgICBpZiBSRVFV
RVNULmhhc19rZXkoJ1VzZXInKSBhbmQgUkVRVUVTVC5oYXNfa2V5KCdQYXNzd2QnKToNCgkgICAg
ICAgIAl0aGlzTG9nb249TG9nb24oUkVRVUVTVFsnVXNlciddLCBSRVFVRVNUWydQYXNzd2QnXSwg
IjE3MiIpDQogICAgICAgIAkgICAgICAgIGlmIHRoaXNMb2dvbi5jaGVjaygpOg0KICAgICAgICAg
ICAgICAgIAkJI3JldHVybiBzdHIoZGlyKHNlbGYpKQ0KICAgICAgICAgICAgICAgIAkJV29ybGRQ
aWxvdC5NeUxvZ29ucy5hZGRMb2dvbih0aGlzTG9nb24pDQogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIFJFUVVFU1RbJ0xvZ29uVUlEJ109dGhpc0xvZ29uLmdldFVJRCgpDQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFJFUVVFU1RbJ0xvZ29uJ109dGhpc0xvZ29uDQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld1dvcmxkUGlsb3Q9V29ybGRQaWxvdCgNCgkJ
CQkJdGhpc0xvZ29uLmdldFVJRCgpLA0KCQkJCQl0aGlzTG9nb24uZ2V0VXNlcigpLA0KCQkJCQki
IiwgICAgICAgICAgICAgICAgDQoJCQkJCVtdKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBOZXdXb3JsZFBpbG90LmFxX3BhcmVudD1zZWxmDQogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICNOZXdXb3JsZFBpbG90LnN0b3JhZ2U9YXBwPVpvcGUuYXBwKClbJ1N0b3JhZ2Un
XQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwPVBlcm1pc3Npb24oJ1ZpZXcnLFdv
cmxkUGlsb3QucHVibGljbWV0aG9kcywgTmV3V29ybGRQaWxvdCkNCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgcC5zZXRSb2xlcygoJ0Fub255bW91cycsJ01hbmFnZXInKSkNCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgV29ybGRQaWxvdC5zZXNzaW9ucy5hZGRTZXNzaW9u
KFJFUVVFU1RbJ0xvZ29uVUlEJ10sTmV3V29ybGRQaWxvdCkNCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNXb3JsZFBpbG90
LnN0b3JhZ2VzLmFxX3BhcmVudD1zZWxmDQoNCgkJCQlyZXR1cm4gdGhpc0xvZ29uDQoJICAgICAg
ICAgICAgICAgIGVsc2U6DQoJCQkJcmV0dXJuIE5vbmUNCiAgICAgICAgICAgICAgICBlbHNlOg0K
CQkJcmV0dXJuIE5vbmUNCg0KICAgICAgICBkZWYgdHBWYWx1ZXMoc2VsZik6DQogICAgICAgIAkj
cHJpbnQgIlRQVkFMVUVTIg0KICAgICAgICAJcmV0dXJuIChzZWxmLm1haWwsc2VsZi5zdG9yYWdl
KSNzZWxmLl9tb3VudHBvaW50c1snc3RvcmUnXSkNCg0KICAgICAgICBkZWYgbWFuYWdlX3dvcmtz
cGFjZShzZWxmLCBSRVFVRVNUPU5vbmUpOg0KICAgICAgICAJImRmZHNmZHNmIg0KICAgICAgICAJ
cmV0dXJuIERlZmF1bHRMb2dvbi5jYWxsUmVzb3VyY2UoJ3Nlc3Npb25zX21hbmFnZV93b3Jrc3Bh
Y2UnLCBjbGllbnQ9c2VsZiwgbWFwcGluZz1SRVFVRVNUKQ0KDQoJZGVmIGxvZ29mZkxvZ2luKHNl
bGYsIFJFUVVFU1QpOg0KICAgICAgICAJImxvZ3Mgb2ZmIg0KICAgICAgICAgICAgICAgIHRoaXNM
b2dvbiA9IHNlbGYuZ2V0TG9nb24oUkVRVUVTVCkNCiAgICAgICAgICAgICAgICBpZiB0aGlzTG9n
b246DQogICAgICAgICAgICAgICAgCVdvcmxkUGlsb3Quc2Vzc2lvbnMuZGVsU2Vzc2lvbih0aGlz
TG9nb24uZ2V0VUlEKCkpDQogICAgICAgICAgICAgICAgCSNXb3JsZFBpbG90Lk15TG9nb25zLmRl
bExvZ29uKHRoaXNMb2dvbi5nZXRVSUQoKSkNCgkJCXJldHVybiAxDQogICAgICAgICAgICAgICAg
ZWxzZToNCgkJCXJldHVybiAwDQoNCglkZWYgY2hlY2tMb2dvblVJRChzZWxmLExvZ29uVUlEPU5v
bmUsIFJFUVVFU1Q9Tm9uZSk6DQogICAgICAgIAkiY2hlY2tzIHRoZSBMb2dvblVJRCINCiAgICAg
ICAgICAgICAgICBpZiBMb2dvblVJRD09Tm9uZToNCgkJCUxvZ29uVUlEPSIiDQoJCXJldHVybiBX
b3JsZFBpbG90Lk15TG9nb25zLmNoZWNrVUlEKExvZ29uVUlELCBSRVFVRVNUKQ0KDQogICAgICAg
IGRlZiBjaGVja0xvZ29uKHNlbGYsIHRoaXNMb2dvbiwgUkVRVUVTVCk6DQogICAgICAgICAgICAg
ICAgUkVRVUVTVFsnVXNlciddPXRoaXNMb2dvbi5nZXRVc2VyKCkNCiAgICAgICAgICAgICAgICBS
RVFVRVNUWydMb2dvbiddPXRoaXNMb2dvbg0KICAgICAgICAgICAgICAgIFJFUVVFU1RbJ0xvZ29u
VUlEJ109dGhpc0xvZ29uLmdldFVJRCgpDQogICAgICAgICAgICAgICAgZHQ9RGF0ZVRpbWUuRGF0
ZVRpbWUoKQ0KICAgICAgICAgICAgICAgIHR6PWR0Ll9sb2NhbHpvbmUNCiAgICAgICAgICAgICAg
ICBSRVFVRVNUWydUaW1lWm9uZSddPXR6DQogICAgICAgICAgICAgICAgUkVRVUVTVFsnRFQnXT1k
dA0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzTG9nb24NCg0KDQoJZGVmIGdldExvZ29uKHNl
bGYsIFJFUVVFU1Q9Tm9uZSk6DQogICAgICAgIAl0cnk6DQoJICAgICAgICAJI3JldHVybiBXb3Js
ZFBpbG90Lk15TG9nb25zLmNoZWNrTG9nb24oc2VsZi5fTG9nb24sIFJFUVVFU1QpDQoJICAgICAg
ICAJcmV0dXJuIHNlbGYuY2hlY2tMb2dvbihzZWxmLl9Mb2dvbiwgUkVRVUVTVCkNCiAgICAgICAg
ICAgICAgICAJc3BsPXN0cmluZy5zcGxpdChSRVFVRVNUWydVUkwwJ10sICcvJykNCgkJCWlmIHNw
bFstM109PSJzZXNzaW9ucyI6DQogICAgICAgICAgICAgICAgICAgICAgICAJcmV0dXJuIHNlbGYu
Y2hlY2tMb2dvblVJRChzcGxbLTJdLCBSRVFVRVNUKQ0KICAgICAgICAgICAgICAgICAgICAgICAg
ZWxpZiBsZW4oc3BsKT40IGFuZCBzcGxbLTVdPT0ic2Vzc2lvbnMiOg0KICAgICAgICAgICAgICAg
ICAgICAgICAgCXJldHVybiBzZWxmLmNoZWNrTG9nb25VSUQoc3BsWy00XSwgUkVRVUVTVCkNCiAg
ICAgICAgICAgICAgICAgICAgICAgIGVsc2U6DQoJCQkJcmFpc2UgS2V5RXJyb3INCiAgICAgICAg
ICAgICAgICBleGNlcHQ6DQoJICAgICAgICAJcmV0dXJuIHNlbGYubG9nb24oUkVRVUVTVCkNCg0K
DQogICAgICAgIGRlZiBjaGVja05vdExvZ2dlZE9uKHNlbGYsIFJFUVVFU1Q9Tm9uZSk6DQoJCWlm
IFJFUVVFU1QuaGFzX2tleSgnTG9nb25VSUQnKSBhbmQgc2VsZi5jaGVja0xvZ29uVUlEKFJFUVVF
U1RbJ0xvZ29uVUlEJ10sIFJFUVVFU1QpOg0KICAgICAgICAgICAgICAgIAlyZXR1cm4gMA0KICAg
ICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgCXRyeToNCiAgICAgICAgICAgICAg
ICAgICAgICAgIAlzcGw9c3RyaW5nLnNwbGl0KFJFUVVFU1RbJ1VSTDAnXSwgJy8nKQ0KICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzcGxbLTNdPT0ic2Vzc2lvbnMiIGFuZCBzZWxm
LmNoZWNrTG9nb25VSUQoc3BsWy0yXSwgUkVRVUVTVCk6DQoJCQkJCXJldHVybiAwDQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgbGVuKHNwbCk+NCBhbmQgc3BsWy01XT09InNl
c3Npb25zIiBhbmQgc2VsZi5jaGVja0xvZ29uVUlEKHNwbFstNF0sIFJFUVVFU1QpOg0KCQkJCQly
ZXR1cm4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOg0KCQkJCQlyYWlz
ZSBLZXlFcnJvcg0KICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0Og0KCSAgICAgICAgICAg
ICAgICAJaWYgc2VsZi5sb2dvbihSRVFVRVNUKToNCgkJICAgICAgICAgICAgICAgIAlyZXR1cm4g
MA0KICAgICAgICAgICAgICAgIAkgICAgICAgIGVsc2U6DQogICAgICAgIAkgICAgICAgIAkJcmV0
dXJuIDENCg0KICAgICAgICBkZWYgc3RhbmRhcmRfZXJyb3JfbWVzc2FnZShzZWxmLCBSRVFVRVNU
PU5vbmUpOg0KICAgICAgICAJcmV0dXJuIERlZmF1bHRMb2dvbi5jYWxsUmVzb3VyY2UoJ2dvdG9s
b2dvbicsIGNsaWVudD1zZWxmLCBtYXBwaW5nPVJFUVVFU1QpDQoNCiAgICAgICAgZGVmIGRpc3Bs
YXlMb2dvblNjcmVlbihzZWxmLCBSRVFVRVNUPU5vbmUpOg0KICAgICAgICAJcmV0dXJuIERlZmF1
bHRMb2dvbi5jYWxsUmVzb3VyY2UoJ2dvdG9sb2dvbicsIGNsaWVudD1zZWxmLCBtYXBwaW5nPVJF
UVVFU1QpDQoNCiAgICAgICAgZGVmIGRpc3BsYXlJZkxvZ2dlZE9uKHNlbGYsIFJlc291cmNlTmFt
ZSwgUkVRVUVTVD1Ob25lLCBMb2dvblNjcmVlbj1Ob25lLCBDbGllbnQ9Tm9uZSk6DQogICAgICAg
ICAgICAgICAgdGhpc0xvZ29uID0gc2VsZi5nZXRMb2dvbihSRVFVRVNUKQ0KCQlpZiBDbGllbnQg
aXMgTm9uZToNCiAgICAgICAgICAgICAgICAJQ2xpZW50PXNlbGYNCiAgICAgICAgICAgICAgICBp
ZiBub3QgdGhpc0xvZ29uOg0KICAgICAgICAgICAgICAgIAlpZiBub3QgTG9nb25TY3JlZW46IExv
Z29uU2NyZWVuPXNlbGYuZGlzcGxheUxvZ29uU2NyZWVuDQogICAgICAgICAgICAgICAgCXJldHVy
biBMb2dvblNjcmVlbihSRVFVRVNUKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAg
ICAgICAgCXJldHVybiB0aGlzTG9nb24uY2FsbFJlc291cmNlKFJlc291cmNlTmFtZSwgY2xpZW50
PUNsaWVudCwgbWFwcGluZz1SRVFVRVNUKQ0KDQoJZGVmIGluZGV4X2h0bWwoc2VsZiwgUkVRVUVT
VCk6DQoJICAgICAgICAiRG9jIFN0cmluZyA6LSkiDQogICAgICAgICAgICAgICAgcmV0dXJuIHNl
bGYuZGlzcGxheUlmTG9nZ2VkT24oJ2luZGV4X2h0bWwnLCBSRVFVRVNULCBzZWxmLl9Xb3JsZFBp
bG90LmxvZ29uU2NyZWVuKQ0KICAgICAgICAgICAgICAgIA0KCWRlZiBiYW5uZXIoc2VsZiwgUkVR
VUVTVCk6DQoJICAgICAgICAiRG9jIFN0cmluZyA6LSkiDQogICAgICAgICAgICAgICAgI3JldHVy
biBzZWxmLmRpc3BsYXlJZkxvZ2dlZE9uKCdtYWluX2Jhbm5lcicsIFJFUVVFU1QsIHNlbGYuX1dv
cmxkUGlsb3QubG9nb25TY3JlZW4pDQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGlzcGxh
eUlmTG9nZ2VkT24oJ21haW5fYmFubmVyJywgUkVRVUVTVCwgTm9uZSkNCiAgICAgICAgICAgICAg
ICANCglkZWYgbWVudShzZWxmLCBSRVFVRVNUKToNCgkgICAgICAgICJEb2MgU3RyaW5nIDotKSIN
CiAgICAgICAgICAgICAgICAjcmV0dXJuIHNlbGYuZGlzcGxheUlmTG9nZ2VkT24oJ21haW5fbWVu
dScsIFJFUVVFU1QsIHNlbGYuX1dvcmxkUGlsb3QubG9nb25TY3JlZW4pDQogICAgICAgICAgICAg
ICAgcmV0dXJuIHNlbGYuZGlzcGxheUlmTG9nZ2VkT24oJ21haW5fbWVudScsIFJFUVVFU1QsIE5v
bmUpDQogICAgICAgICAgICAgICAgDQoJZGVmIHRvZGF5KHNlbGYsIFJFUVVFU1QpOg0KCSAgICAg
ICAgIkRvYyBTdHJpbmcgOi0pIg0KICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRpc3BsYXlJ
ZkxvZ2dlZE9uKCd0b2RheV9mcmFtZXNldCcsIFJFUVVFU1QsIHNlbGYuX1dvcmxkUGlsb3QubG9n
b25TY3JlZW4pDQogICAgICAgICAgICAgICAgDQoJZGVmIGFib3V0KHNlbGYsIFJFUVVFU1QpOg0K
CSAgICAgICAgIkRvYyBTdHJpbmcgOi0pIg0KICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRp
c3BsYXlJZkxvZ2dlZE9uKCdhYm91dF9mcmFtZXNldCcsIFJFUVVFU1QsIE5vbmUpDQogICAgICAg
ICAgICAgICAgDQoJZGVmIGFib3V0X2hhbmRsZShzZWxmLCBSRVFVRVNUKToNCgkgICAgICAgICJE
b2MgU3RyaW5nIDotKSINCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kaXNwbGF5SWZMb2dn
ZWRPbignYWJvdXRfaGFuZGxlJywgUkVRVUVTVCwgTm9uZSkNCiAgICAgICAgICAgICAgICANCglk
ZWYgYWJvdXRfaW5mbyhzZWxmLCBSRVFVRVNUKToNCgkgICAgICAgICJEb2MgU3RyaW5nIDotKSIN
CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kaXNwbGF5SWZMb2dnZWRPbignYWJvdXRfaW5m
bycsIFJFUVVFU1QsIE5vbmUpDQogICAgICAgICAgICAgICAgDQogICAgICAgIGRlZiBnZXRDb21w
b3NlcklEKHNlbGYsIFJFUVVFU1QpOg0KICAgICAgICAJdHJ5Og0KICAgICAgICAgICAgICAgIAlz
cGw9c3RyaW5nLnNwbGl0KFJFUVVFU1RbJ1VSTDAnXSwgJy8nKQ0KICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgc3BsWy0zXT09ImNvbXBvc2VycyI6DQogICAgICAgICAgICAgICAgICAgICAgICAJ
UkVRVUVTVFsnQ29tcG9zZXJJRCddPXNwbFstMl0NCgkJCQlyZXR1cm4gc3BsWy0yXQ0KICAgICAg
ICAgICAgICAgICAgICAgICAgZWxzZToNCgkJCQlyYWlzZSBLZXlFcnJvcg0KICAgICAgICAgICAg
ICAgIGV4Y2VwdDoNCiAgICAgICAgCQlyZXR1cm4gTm9uZQ0KICAgICAgICAgICAgICAgIA0KICAg
ICAgICAgICAgICAgIA0KCWRlZiBsb2dvZmYoc2VsZiwgUkVRVUVTVCk6DQoJICAgICAgICAiRG9j
IFN0cmluZyA6LSkiDQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGlzcGxheUlmTG9nZ2Vk
T24oJ2dvb2RieWUnLCBSRVFVRVNULCBOb25lKSAjc2VsZi5fV29ybGRQaWxvdC5sb2dvblNjcmVl
bikNCiAgICAgICAgICAgICAgICANCg0KDQpjbGFzcyBXb3JsZFBpbG90KA0KCUFjcXVpc2l0aW9u
LkltcGxpY2l0LA0KCVBlcnNpc3RlbnQsDQoJQWNjZXNzQ29udHJvbC5Sb2xlLlJvbGVNYW5hZ2Vy
LA0KICAgICAgICBPRlMuRm9sZGVyLkZvbGRlciwNCgkjT0ZTLlNpbXBsZUl0ZW0uSXRlbSwNCgkp
Og0KCSIiIkEgV29ybGRQaWxvdCBwcm9kdWN0LiANCgkiIiINCgkNCglpY29uPSdtaXNjXy9Xb3Js
ZFBpbG90L3dvcmxkcGlsb3QnDQoJDQoJbWV0YV90eXBlPSdXb3JsZFBpbG90Jw0KCQ0KCW1hbmFn
ZV9vcHRpb25zPSgNCgkJeydsYWJlbCc6J1Byb3BlcnRpZXMnLCdhY3Rpb24nOidtYW5hZ2VfbWFp
bid9LA0KCQl7J2xhYmVsJzonVmlldycsJ2FjdGlvbic6Jyd9LA0KCQl7J2xhYmVsJzonU2VjdXJp
dHknLCdhY3Rpb24nOidtYW5hZ2VfYWNjZXNzJ30sDQoJCSkNCg0KCV9fYWNfcGVybWlzc2lvbnNf
Xz0oDQoJCSgnVmlldyBtYW5hZ2VtZW50IHNjcmVlbnMnLCgnbWFuYWdlX3RhYnMnLCdtYW5hZ2Vf
bWFpbicpKSwNCgkJKCdDaGFuZ2UgcGVybWlzc2lvbnMnLCgnbWFuYWdlX2FjY2VzcycsKSksDQoJ
CSgnQ2hhbmdlIFdvcmxkUGlsb3RzJywoJ21hbmFnZV9lZGl0JyksKCdNYW5hZ2VyJywpKSwNCgkJ
KCdWaWV3JywoJycsJ21lbnUnLCdwcm9nJywnbG9nb25odG1sJyksKCdBbm9ueW1vdXMnLCdNYW5h
Z2VyJykpLA0KCQkpDQoNCglkZWYgX19pbml0X18oc2VsZixpZCx0aXRsZSxpbWFwc2VydmVyLHNt
dHBzZXJ2ZXIpOg0KCQlzZWxmLmlkPWlkDQoJCXNlbGYudGl0bGU9dGl0bGUNCgkJc2VsZi5pbWFw
c2VydmVyPWltYXBzZXJ2ZXINCgkJc2VsZi5zbXRwc2VydmVyPXNtdHBzZXJ2ZXINCiAgICAgICAg
ICAgICAgICBzZWxmLmNvbXBvc2Vycz1Db21wb3NlcnMoKQ0KCQ0KCU15TG9nb25zPUxvZ29ucygp
DQogICAgICAgIA0KCXByb2dfX3JvbGVzX189Tm9uZQ0KCW1lbnVfX3JvbGVzX189Tm9uZQ0KICAg
ICAgICANCgltYW5hZ2VfbWFpbj1IVE1MRmlsZSgnd29ybGRwaWxvdEVkaXQnLGdsb2JhbHMoKSkN
Cg0KICAgICAgICBsb2dvPUltYWdlRmlsZSgnbG9nby5naWYnLGdsb2JhbHMoKSkNCiAgICAgICAg
bG9nb29ud2hpdGU9SW1hZ2VGaWxlKCdsb2dvb253aGl0ZS5naWYnLGdsb2JhbHMoKSkNCiAgICAg
ICAgc2hvcnRjdXQ9SW1hZ2VGaWxlKCdzaG9ydGN1dC5naWYnLGdsb2JhbHMoKSkNCiAgICAgICAg
cGl4ZWw9SW1hZ2VGaWxlKCdwaXhlbC5naWYnLGdsb2JhbHMoKSkNCiAgICAgICAgZm9sZGVyPUlt
YWdlRmlsZSgnZm9sZGVyLmdpZicsZ2xvYmFscygpKQ0KICAgICAgICB3cGRvd249SW1hZ2VGaWxl
KCd3cGRvd24uZ2lmJyxnbG9iYWxzKCkpDQogICAgICAgIHdwdXA9SW1hZ2VGaWxlKCd3cHVwLmdp
ZicsZ2xvYmFscygpKQ0KICAgICAgICB3cGxlZnQ9SW1hZ2VGaWxlKCd3cGxlZnQuZ2lmJyxnbG9i
YWxzKCkpDQogICAgICAgIHdwcmlnaHQ9SW1hZ2VGaWxlKCd3cHJpZ2h0LmdpZicsZ2xvYmFscygp
KQ0KICAgICAgICB3cGlkeHVwPUltYWdlRmlsZSgnd3BpZHh1cC5naWYnLGdsb2JhbHMoKSkNCiAg
ICAgICAgd3BpZHhkb3duPUltYWdlRmlsZSgnd3BpZHhkb3duLmdpZicsZ2xvYmFscygpKQ0KDQog
ICAgICAgIExvZ0lEPSIiDQoNCg0KICAgICAgICBzdG9yYWdlPVN0b3JhZ2UuTG9jYWxTdG9yYWdl
LldvcmxkUGlsb3RTdG9yYWdlKCJzdG9yYWdlIiwiU3RvcmFnZSIsTXlXb3JsZFBpbG90VXNlclN0
b3JhZ2UpDQogICAgICAgIHN0b3JhZ2UuaW5pdGlhbGl6ZSgpDQogICAgICAgIFN0b3JhZ2UuTG9j
YWxTdG9yYWdlLnN0b3JhZ2Vyb290PXN0b3JhZ2UudXNlcg0KICAgICAgICBzZXNzaW9ucz1TZXNz
aW9ucygpDQogICAgICAgIA0KCXB1YmxpY21ldGhvZHM9KCcnLCAnbG9nb2ZmJywpDQogICAgICAg
IA0KICAgICAgICBkZWYgX19ib2JvX3RyYXZlcnNlX18oc2VsZiwgUkVRVUVTVD1Ob25lLCBrZXk9
Tm9uZSk6DQogICAgICAgICAgICAgICAgV29ybGRQaWxvdC5zZXNzaW9ucy5pbml0aWFsaXplKHNl
bGYpDQogICAgICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZiwga2V5KQ0KDQogICAgICAg
IGRlZiBsb2dvbihzZWxmLCBSRVFVRVNUPU5vbmUpOg0KICAgICAgICAJImxvZ3Mgb24iDQogICAg
ICAgICAgICAgICAgcmV0dXJuIFdvcmxkUGlsb3Quc2Vzc2lvbnMuY3JlYXRlV29ybGRQaWxvdFNl
c3Npb24oc2VsZiwgTm9uZSwgc2VsZi5pbWFwc2VydmVyLCBzZWxmLnNtdHBzZXJ2ZXIsIFJFUVVF
U1QpDQogICAgICAgICAgICAgICAgaWYgUkVRVUVTVC5oYXNfa2V5KCdVc2VyJykgYW5kIFJFUVVF
U1QuaGFzX2tleSgnUGFzc3dkJyk6DQoJICAgICAgICAJdGhpc0xvZ29uPUxvZ29uKFJFUVVFU1Rb
J1VzZXInXSwgUkVRVUVTVFsnUGFzc3dkJ10sICIxNzIiKQ0KICAgICAgICAJICAgICAgICBpZiB0
aGlzTG9nb24uY2hlY2soKToNCgkJCQlyZXR1cm4gdGhpc0xvZ29uDQoJICAgICAgICAgICAgICAg
IGVsc2U6DQoJCQkJcmV0dXJuIE5vbmUNCiAgICAgICAgICAgICAgICBlbHNlOg0KCQkJcmV0dXJu
IE5vbmUNCg0KCWRlZiB0cFZhbHVlcyhzZWxmKToNCgkJIiIiUmV0dXJucyBhIGxpc3Qgb2YgdGhl
IGZvbGRlcidzIHN1Yi1mb2xkZXJzLCB1c2VkIGJ5IHRyZWUgdGFnLiIiIg0KICAgICAgICAJV29y
bGRQaWxvdC5zZXNzaW9ucy5pbml0aWFsaXplKHNlbGYpDQogICAgICAgICAgICAgICAgcmV0dXJu
IChXb3JsZFBpbG90LnNlc3Npb25zLCBXb3JsZFBpbG90LnN0b3JhZ2UpDQogICAgICAgICAgICAg
ICAgDQoJZGVmIGxvZ29mZkxvZ2luKHNlbGYsIFJFUVVFU1QpOg0KICAgICAgICAJImxvZ3Mgb2Zm
Ig0KICAgICAgICAgICAgICAgIHRoaXNMb2dvbiA9IHNlbGYuZ2V0TG9nb24oUkVRVUVTVCkNCiAg
ICAgICAgICAgICAgICBpZiB0aGlzTG9nb246DQogICAgICAgICAgICAgICAgCVdvcmxkUGlsb3Qu
c2Vzc2lvbnMuZGVsU2Vzc2lvbih0aGlzTG9nb24uZ2V0VUlEKCkpDQogICAgICAgICAgICAgICAg
CSNXb3JsZFBpbG90Lk15TG9nb25zLmRlbExvZ29uKHRoaXNMb2dvbi5nZXRVSUQoKSkNCgkJCXJl
dHVybiAxDQogICAgICAgICAgICAgICAgZWxzZToNCgkJCXJldHVybiAwDQoNCglkZWYgY2hlY2tM
b2dvblVJRChzZWxmLExvZ29uVUlEPU5vbmUsIFJFUVVFU1Q9Tm9uZSk6DQogICAgICAgIAkiY2hl
Y2tzIHRoZSBMb2dvblVJRCINCiAgICAgICAgICAgICAgICBpZiBMb2dvblVJRD09Tm9uZToNCgkJ
CUxvZ29uVUlEPSIiDQoJCXJldHVybiBXb3JsZFBpbG90Lk15TG9nb25zLmNoZWNrVUlEKExvZ29u
VUlELCBSRVFVRVNUKQ0KDQoJZGVmIGdldExvZ29uKHNlbGYsIFJFUVVFU1Q9Tm9uZSk6DQogICAg
ICAgIAl0cnk6DQogICAgICAgICAgICAgICAgCXNwbD1zdHJpbmcuc3BsaXQoUkVRVUVTVFsnVVJM
MCddLCAnLycpDQoJCQlpZiBzcGxbLTNdPT0ic2Vzc2lvbnMiOg0KICAgICAgICAgICAgICAgICAg
ICAgICAgCXJldHVybiBzZWxmLmNoZWNrTG9nb25VSUQoc3BsWy0yXSwgUkVRVUVTVCkNCiAgICAg
ICAgICAgICAgICAgICAgICAgIGVsaWYgbGVuKHNwbCk+NCBhbmQgc3BsWy01XT09InNlc3Npb25z
IjoNCiAgICAgICAgICAgICAgICAgICAgICAgIAlyZXR1cm4gc2VsZi5jaGVja0xvZ29uVUlEKHNw
bFstNF0sIFJFUVVFU1QpDQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOg0KCQkJCXJhaXNl
IEtleUVycm9yDQogICAgICAgICAgICAgICAgZXhjZXB0Og0KCSAgICAgICAgCXJldHVybiBzZWxm
LmxvZ29uKFJFUVVFU1QpDQoNCiAgICAgICAgZGVmIHN0YW5kYXJkX2Vycm9yX21lc3NhZ2Uoc2Vs
ZiwgUkVRVUVTVD1Ob25lKToNCiAgICAgICAgCXJldHVybiBEZWZhdWx0TG9nb24uY2FsbFJlc291
cmNlKCdnb3RvbG9nb24nLCBjbGllbnQ9c2VsZiwgbWFwcGluZz1SRVFVRVNUKQ0KDQogICAgICAg
IGRlZiBkaXNwbGF5TG9nb25TY3JlZW4oc2VsZiwgUkVRVUVTVD1Ob25lKToNCiAgICAgICAgCXJl
dHVybiBEZWZhdWx0TG9nb24uY2FsbFJlc291cmNlKCdnb3RvbG9nb24nLCBjbGllbnQ9c2VsZiwg
bWFwcGluZz1SRVFVRVNUKQ0KICAgICAgICANCiAgICAgICAgZGVmIGRpc3BsYXlJZkxvZ2dlZE9u
KHNlbGYsIFJlc291cmNlTmFtZSwgUkVRVUVTVD1Ob25lLCBMb2dvblNjcmVlbj1Ob25lKToNCgkg
ICAgICAgICJEb2MgU3RyaW5nIDotKSINCiAgICAgICAgICAgICAgICB0aGlzTG9nb24gPSBzZWxm
LmdldExvZ29uKFJFUVVFU1QpDQogICAgICAgICAgICAgICAgaWYgbm90IHRoaXNMb2dvbjoNCiAg
ICAgICAgICAgICAgICAJaWYgbm90IExvZ29uU2NyZWVuOiBMb2dvblNjcmVlbj1zZWxmLmRpc3Bs
YXlMb2dvblNjcmVlbg0KICAgICAgICAgICAgICAgIAlyZXR1cm4gTG9nb25TY3JlZW4oUkVRVUVT
VCkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIAlyZXR1cm4gdGhpc0xv
Z29uLmNhbGxSZXNvdXJjZShSZXNvdXJjZU5hbWUsIGNsaWVudD1zZWxmLCBtYXBwaW5nPVJFUVVF
U1QpDQoNCglkZWYgbG9nb25TY3JlZW4oc2VsZiwgUkVRVUVTVCk6DQoJICAgICAgICAiRG9jIFN0
cmluZyA6LSkiDQogICAgICAgIAlyZXR1cm4gRGVmYXVsdExvZ29uLmNhbGxSZXNvdXJjZSgnbG9n
b24nLCBjbGllbnQ9c2VsZiwgbWFwcGluZz1SRVFVRVNUKQ0KICAgICAgICAgICAgICAgIAkNCglk
ZWYgaW5kZXhfaHRtbChzZWxmLCBSRVFVRVNUKToNCgkgICAgICAgICJEb2MgU3RyaW5nIDotKSIN
CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kaXNwbGF5SWZMb2dnZWRPbignaW5kZXhfaHRt
bCcsIFJFUVVFU1QsIHNlbGYubG9nb25TY3JlZW4pDQoNCglkZWYgbWFuYWdlX2VkaXQoc2VsZix0
aXRsZSxSRVFVRVNUPU5vbmUpOg0KCQkiIiJXb3JsZHBpbG90IHNldHRpbmdzDQoJCQ0KCQkiIiIN
CgkJc2VsZi50aXRsZT10aXRsZQ0KCQlpZiBSRVFVRVNUIGlzIG5vdCBOb25lOg0KCQkJcmV0dXJu
IE1lc3NhZ2VEaWFsb2coDQoJCQkJdGl0bGU9J0VkaXRlZCcsDQoJCQkJbWVzc2FnZT0nPHN0cm9u
Zz4lczwvc3Ryb25nPiBoYXMgYmVlbiBlZGl0ZWQuJyAlIHNlbGYuaWQsDQoJCQkJYWN0aW9uID0n
Li9tYW5hZ2VfbWFpbicsDQoJCQkJKQ0KDQoNCg0KCQkNCmFkZFdvcmxkUGlsb3RGb3JtPUhUTUxG
aWxlKCd3b3JsZHBpbG90QWRkJyxnbG9iYWxzKCkpDQoNCmRlZiBhZGRXb3JsZFBpbG90KHNlbGYs
aWQsdGl0bGUsaW1hcHNlcnZlciwgc210cHNlcnZlciwgUkVRVUVTVD1Ob25lKToNCgkiIiJDcmVh
dGUgYSB3b3JsZHBpbG90IGFuZCBpbnN0YWxsIGl0IGluIGl0cyBwYXJlbnQgRm9sZGVyIg0KCQ0K
CVRoZSBhcmd1bWVudCAnc2VsZicgd2lsbCBiZSBib3VuZCB0byB0aGUgcGFyZW50IEZvbGRlci4N
CgkiIiINCgl3b3JsZHBpbG90PVdvcmxkUGlsb3QoaWQsIHRpdGxlLCBpbWFwc2VydmVyLCBzbXRw
c2VydmVyKQ0KCXNlbGYuX3NldE9iamVjdChpZCwgd29ybGRwaWxvdCkNCglpZiBSRVFVRVNUIGlz
IG5vdCBOb25lOg0KCQlyZXR1cm4gc2VsZi5tYW5hZ2VfbWFpbihzZWxmLFJFUVVFU1QpDQo=

--ELM955756944-39062-2_
Content-Type: text/plain; charset=US-ASCII
Content-Disposition: attachment; filename=WPUtil.py
Content-Description: WPUtil.py
Content-Transfer-Encoding: 7bit

##########################################################################
#
# WorldPilot Public License (WPL) Version 0.99
# -------------------------------------
# 
# Copyright (c) Neuberger & Hughes GmbH.  All rights reserved.
# Copyright (c) Ryan Hughes.              All rights reserved.
# 
# 
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
# 
# 1. Redistributions in source code must retain the above copyright
#    notice, this list of conditions, and the following disclaimer.
# 
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions, and the following disclaimer in
#    the documentation and/or other materials provided with the
#    distribution.
# 
# 3. Neuberger & Hughes GmbH requests that attribution be given to
#    Worldpilot in any manner possible. Worldpilot includes a
#    "worldpilot" button that is installed by default. While it is not a
#    license violation to remove this button, it is requested that the
#    attribution remain. A significant investment has been put into
#    worldpilot, and this effort will continue if the worldpilot community
#    continues to grow. This is one way to assure that growth.
# 
# 4. All advertising materials and documentation mentioning
#    features derived from or use of this software must display
#    the following acknowledgement:
# 
#      "This product includes software developed by Neuberger & Hughes
#      GmbH for use in the Worldpilot Organizer and Messaging Server
#      (http://www.worldpilot.org/)."
# 
#    In the event that the product being advertised includes an
#    intact WorldPilot distribution (with copyright and license included)
#    then this clause is waived.
# 
# 5. Names associated with Worldpilot or Neuberger & Hughes GmbH
#    must not be used to endorse or promote products derived from this
#    software without prior written permission from Neuberger & Hughes GmbH.
# 
# 6. Modified redistributions of any form whatsoever must retain
#    the following acknowledgment:
# 
#      "This product includes software developed by Neuberger & Hughes
#      GmbH for use in the Worldpilot Organizer and Messaging Server
#      (http://www.worldpilot.org/)."
# 
#    Intact (re-)distributions of any official WorldPilot release do not
#    require an external acknowledgement.
# 
# 7. Modifications are encouraged but must be packaged separately as
#    patches to official WorldPilot releases.  Distributions that do not
#    clearly separate the patches from the original work must be clearly
#    labeled as unofficial distributions.  Modifications which do not
#    carry the name Worldpilot may be packaged in any form, as long as they
#    conform to all of the clauses above.
# 
# 
# Disclaimer
# 
#   THIS SOFTWARE IS PROVIDED BY NEUBERGRE & HUGHES GMBH ``AS IS'' AND ANY
#   EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
#   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
#   PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
#   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
#   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
#   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
#   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
#   OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
#   SUCH DAMAGE.
# 
# 
# This software consists of contributions made by Neuberger & Hughes GmbH
# and many individuals on behalf of Neuberger & Hughes GmbH.
# Specific attributions are listed in the accompanying worldpilot credits
# file.
# 
###########################################################################



from imaplib import *
import re
import time
import string
try:
    import DateTime
except: pass

InternalDate = re.compile(r'.*INTERNALDATE "'
      r'[A-Za-z ,]*?(?P<day>[ 123][0-9])[- ](?P<mon>[A-Z][a-z][a-z])[- ](?P<year>[0-9][0-9][0-9][0-9])'
      r' (?P<hour>[0-9][0-9]):(?P<min>[0-9][0-9]):(?P<sec>[0-9][0-9])'
      r' (?P<zonen>[-+])(?P<zoneh>[0-9][0-9])(?P<zonem>[0-9][0-9])'
      r'.*"')

LiteralString = re.compile(r'\s*\{(?P<Size>\d+)\}(?P<Rest>.*)')
QuotedString = re.compile(r'\s*"(?P<String>[^"]*)"(?P<Rest>.*)')
ListOpen = re.compile(r'\s*\((?P<Rest>.*)')
ListClose = re.compile(r'\s*\)(?P<Rest>.*)')
Atom = re.compile(r'\s*(?P<Atom>\\?[\w\[\]\./]+)(?P<Rest>.*)')
#Atom2 = re.compile(r'\s*(?P<Atom>\\?[\w\[\]/]+)(?P<Rest>.*)')
Number = re.compile(r'\s*(?P<Number>\\?[\d]+)(?P<Rest>.*)')
NIL = re.compile(r'\s*(?P<NIL>NIL)(?P<Rest>.*)')
SLASH = re.compile(r'\s*(?P<NIL>"/")(?P<Rest>.*)')


def Internaldate2tuple(resp):

	"""Convert IMAP4 INTERNALDATE to UT.

	Returns Python time module tuple.
	"""

	mo = InternalDate.match(resp)
	if not mo:
		return None

	mon = Mon2num[mo.group('mon')]
	zonen = mo.group('zonen')

	for name in ('day', 'year', 'hour', 'min', 'sec', 'zoneh', 'zonem'):
		exec "%s = string.atoi(mo.group('%s'))" % (name, name)

	# INTERNALDATE timezone must be subtracted to get UT

	zone = (zoneh*60 + zonem)*60
	if zonen == '-':
		zone = -zone

	tt = (year, mon, day, hour, min, sec, -1, -1, -1)

	utc = time.mktime(tt)

	# Following is necessary because the time module has no 'mkgmtime'.
	# 'mktime' assumes arg in local timezone, so adds timezone/altzone.

	lt = time.localtime(utc)
	if time.daylight and lt[-1]:
		zone = zone + time.altzone
	else:
		zone = zone + time.timezone

	return time.localtime(utc - zone)





def CreateStruct(data):
    c=[]
    s=[c]
    newrec=1
    while data:
        if newrec:
            c=s[0]
            n=[]
            c.append(n)
            c=n
        newrec=1
        if type(data[0])==type(()):
            conts=data[0]
        else:
            conts=[data[0]]
        data=data[1:]
        while conts:
            line=conts[0]
	    conts=conts[1:]

            while line!="":
                m=QuotedString.match(line)
                if m:
                    c.append(m.group('String'))
                    line=m.group('Rest')
                    continue
                m=ListOpen.match(line)
                if m:
                    n=[]
                    c.append(n)
                    s.append(c)
                    c=n
                    line=m.group('Rest')
                    continue
                m=ListClose.match(line)
                if m:
                    c=s[-1]
                    s=s[:-1]
                    line=m.group('Rest')
                    continue
                m=NIL.match(line)
                if m:
                    c.append(None)
                    line=m.group('Rest')
                    continue
##	        m=SLASH.match(line)
##		if m:
##		    c.append(None)
##		    line=m.group('Rest')
                m=Number.match(line)
                if m:
                    c.append(int(m.group('Number')))
                    line=m.group('Rest')
                    continue
                m=Atom.match(line)
                if m:
                    c.append(m.group('Atom'))
                    line=m.group('Rest')
                    continue
##	        m=Atom2.match(line)
##                if m:
##                    c.append(m.group('Atom'))
##                    line=m.group('Rest')
##                    continue

                m=LiteralString.match(line)
                if m:
                    try:    
                        line=conts[0]
                        conts=conts[1:]
                        c.append(line)
                    except:
                        pass
                    line=""
                    newrec=0
                    continue
                else:
                    line=""
                    newrec=0
    c=s[0]
    return c
    

def makemap(array):
    mi={}
    for i in range(0,len(array),2):
        item=array[i]
        value=array[i+1]
        mi[item]=value
    return mi

        	

--ELM955756944-39062-2_--