[Mono-list] Test-suite for System.Collections.SortedList

jr jaaksimm@firm.ee
Fri, 22 Mar 2002 17:02:47 -0000


This is a multi-part message in MIME format.

----------part3c9b63b7ba1f5
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit


> Nick D. wrote:
> One comment about the way you used AssertEquals().  You should put the
> expected value as the 2nd parameter, and the actual value as the third.
> NUnit will provide a nice message saying \"...Expected <blah> but got
> <halb>..\" or some such. So, you don\'t need to build up your own error
> message in AssertEquals().
> 
ok, i fixed the orders of the parameters in AssertEquals().
The new SortedListTest.cs is attached.

> We have a place to document these kind of discrepancies.  Please add an
> entry to mcs/class/doc/API-notes.  You\'ll see examples there.  I also 
click
> that link on the bottom of the MSDN docs to report \"feedback\" and tell 
them
> directly about it.  Both times I did so, I got a reply thank you from
> Microsoft.  It wasn\'t just an automated response, mind, it was a real 
human
> being taking the time to thank me.  Unusually nice.
> 
I added the entry to API-notes. As I am not very familiar with the exact 
procedure it will be added to the CVS, I just attached API-notes file with 
the added entry. I'll look into that Microsoft doc link.

> | - IEnumerable.GetEnumerator [Explicit Interface Implementation].
> | Could not
> | figure out what to do with such strange thing. :(
> 
> You need to call GetEnumerator() on a SortedList to test this.  See
> TestGetEnumerator() in mcs/class/corlib/Test/ArrayTest.cs for an example of
> this.
> 
The tests for standard GetEnumerator() method are already implemented (like 
in ArrayTest.cs). But MSDN documentation noted an explicit interface 
implementation called IEnumerable.GetEnumerator(), which cannot be called 
through SortedList objects. Thus, there are no tests for that explicit 
interface implementation.

Regards,
Jaak Simm

----------part3c9b63b7ba1f5
Content-Type: application/octet-stream; name="SortedListTest.cs"
Content-Transfer-Encoding: base64

Ly8gU29ydGVkTGlzdFRlc3QuY3MgLSBOVW5pdCBUZXN0IENhc2VzIGZvciB0aGUgU3lzdGVtLkNv
bGxlY3Rpb25zLlNvcnRlZExpc3QgY2xhc3MNCi8vDQovLyBKYWFrIFNpbW0NCi8vDQovLyBUaGFu
a3MgZ28gdG8gRGF2aWQgQnJhbmR0IChidWNreUBrZXlzdHJlYW1zLmNvbSksDQovLyBiZWNhdXNl
IHRoaXMgZmlsZSBpcyBiYXNlZCBvbiBoaXMgQXJyYXlMaXN0VGVzdC5jcw0KLy8NCi8vIChDKSBY
aW1pYW4sIEluYy4gIGh0dHA6Ly93d3cueGltaWFuLmNvbQ0KLy8gDQovLyBtYWluIFRPRE86IGFk
ZGl0aW9uYWwgdGVzdHMgZm9yIGZ1bmN0aW9ucyBhZmZlY3RlZCBieQ0KLy8gICAgICAgICAgICBm
aXhlZHNpemUgYW5kIHJlYWQtb25seSBwcm9wZXJ0aWVzIA0KDQoNCnVzaW5nIFN5c3RlbTsNCnVz
aW5nIFN5c3RlbS5Db2xsZWN0aW9uczsNCg0KdXNpbmcgTlVuaXQuRnJhbWV3b3JrOw0KDQoNCm5h
bWVzcGFjZSBNb25vVGVzdHMuU3lzdGVtLkNvbGxlY3Rpb25zIHsNCg0KDQovLy8gPHN1bW1hcnk+
U29ydGVkTGlzdCB0ZXN0Ljwvc3VtbWFyeT4NCnB1YmxpYyBjbGFzcyBTb3J0ZWRMaXN0VGVzdCA6
IFRlc3RDYXNlIHsNCglwdWJsaWMgU29ydGVkTGlzdFRlc3QoKSA6IGJhc2UgKCJNb25vVGVzdHMu
U3lzdGVtLlNvcnRlZExpc3RUZXN0IHRlc3RzdWl0ZSIpIHt9DQoJcHVibGljIFNvcnRlZExpc3RU
ZXN0KHN0cmluZyBuYW1lKSA6IGJhc2UobmFtZSkge30NCg0KCXByb3RlY3RlZCBTb3J0ZWRMaXN0
IHNsMTsNCglwcm90ZWN0ZWQgU29ydGVkTGlzdCBzbDI7DQoJcHJvdGVjdGVkIFNvcnRlZExpc3Qg
ZW1wdHlzbDsNCglwcm90ZWN0ZWQgY29uc3QgaW50IGljYXA9MTY7DQoJCQ0KCXByb3RlY3RlZCBv
dmVycmlkZSB2b2lkIFNldFVwKCkgDQoJew0KCX0NCg0KCXByb3RlY3RlZCBvdmVycmlkZSB2b2lk
IFRlYXJEb3duKCkgDQoJew0KCX0NCg0KCXB1YmxpYyBzdGF0aWMgSVRlc3QgU3VpdGUgew0KCQln
ZXQgeyANCgkJCXJldHVybiBuZXcgVGVzdFN1aXRlKHR5cGVvZihTb3J0ZWRMaXN0VGVzdCkpOyAN
CgkJfQ0KCX0NCgkNCglwdWJsaWMgdm9pZCBUZXN0Q29uc3RydWN0b3IxKCkgew0KCQlTb3J0ZWRM
aXN0IHRlbXAxID0gbmV3IFNvcnRlZExpc3QoKTsNCgkJQXNzZXJ0Tm90TnVsbCgic2wuY29uc3Ry
dWN0b3ItMTogcmV0dXJucyBudWxsIiwgdGVtcDEpOw0KCQlBc3NlcnRFcXVhbHMoInNsLmNvbnN0
cnVjdG9yLTE6IGluY29ycmVjdCBpbml0aWFsIGNhcGFjaXR5IiwgaWNhcCwgdGVtcDEuQ2FwYWNp
dHkpOw0KCX0NCgkNCglwdWJsaWMgdm9pZCBUZXN0Q29uc3RydWN0b3IyKCkgew0KCQlDb21wYXJl
ciBjID0gQ29tcGFyZXIuRGVmYXVsdDsNCgkJU29ydGVkTGlzdCB0ZW1wMSA9IG5ldyBTb3J0ZWRM
aXN0KGMpOw0KCQlBc3NlcnROb3ROdWxsKCJzbC5jb25zdHJ1Y3Rvci0yOiByZXR1cm5zIG51bGwi
LCB0ZW1wMSk7DQoJCUFzc2VydEVxdWFscygic2wuY29uc3RydWN0b3ItMjogaW5jb3JyZWN0IGlu
aXRpYWwgY2FwYWNpdHkiLCBpY2FwLCB0ZW1wMS5DYXBhY2l0eSk7DQoJfQ0KDQoJcHVibGljIHZv
aWQgVGVzdENvbnN0cnVjdG9yMygpIHsNCgkJSGFzaHRhYmxlIGQgPSBuZXcgSGFzaHRhYmxlKCk7
DQoJCWQuQWRkKCJvbmUiLCAiTWlyY29zb2Z0Iik7DQoJCWQuQWRkKCJ0d28iLCAid2lsbCIpOw0K
CQlkLkFkZCgidGhyZWUiLCAicnVsZSIpOw0KCQlkLkFkZCgiZm91ciIsICJ0aGUgd29ybGQiKTsN
CgkJDQoJCVNvcnRlZExpc3QgdGVtcDEgPSBuZXcgU29ydGVkTGlzdChkKTsNCgkJQXNzZXJ0Tm90
TnVsbCgic2wuY29uc3RydWN0b3ItMzogcmV0dXJucyBudWxsIiwgdGVtcDEpOw0KCQlBc3NlcnRF
cXVhbHMoInNsLmNvbnN0cnVjdG9yLTM6IGluY29ycmVjdCBpbml0aWFsIGNhcGFjaXR5IiwgNCwg
dGVtcDEuQ2FwYWNpdHkpOw0KCQlBc3NlcnRFcXVhbHMoInNsLmNvbnN0cnVjdG9yLTM6IGluY29y
cmVjdCBjb3VudCIsIDQsIHRlbXAxLkNvdW50KTsNCg0KCQl0cnkgew0KCQkJZD1udWxsOw0KCQkJ
dGVtcDEgPSBuZXcgU29ydGVkTGlzdChkKTsNCgkJCUZhaWwgKCJzbC5jb25zdHJ1Y3Rvci0zOiBk
b2VzIG5vdCB0aHJvdyBBcmd1bWVudE51bGxFeGNlcHRpb24iKTsNCgkJfSBjYXRjaCAoQXJndW1l
bnROdWxsRXhjZXB0aW9uKSB7fQ0KCQl0cnkgew0KCQkJZCA9IG5ldyBIYXNodGFibGUoKTsNCgkJ
CWQuQWRkKCJvbmUiLCAiTWlyY29zb2Z0Iik7DQoJCQlkLkFkZCgidHdvIiwgIndpbGwiKTsNCgkJ
CWQuQWRkKCJ0aHJlZSIsICJydWxlIik7DQoJCQlkLkFkZCgiZm91ciIsICJ0aGUgd29ybGQiKTsN
CgkJCWQuQWRkKDc5ODcsImxraiIpOw0KCQkJdGVtcDEgPSBuZXcgU29ydGVkTGlzdChkKTsNCgkJ
CUZhaWwgKCJzbC5jb25zdHJ1Y3Rvci0zOiBkb2VzIG5vdCB0aHJvdyBJbnZhbGlkQ2FzdEV4Y2Vw
dGlvbiIpOw0KCQl9IGNhdGNoIChJbnZhbGlkQ2FzdEV4Y2VwdGlvbikgeyAvLyBJUyBOT1QgVEhS
T1dOIGFzIHN0YXRlZCBpbiBNU0RODQoJCQkvL0NvbnNvbGUuV3JpdGVMaW5lKCJJbnZhbGlkQ2Fz
dEV4Y2VwdGlvbiBIYW5kbGVyOiB7MH0iLCBlLlRvU3RyaW5nKCkpOw0KCQl9IGNhdGNoIChJbnZh
bGlkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsgLy8gaW5zdGVhZCBpdCB0aHJvd3MgdGhpcw0KCQkJ
Q29uc29sZS5Xcml0ZUxpbmUoInNsLmNvbnN0cnVjdG9yLTM6IFt1bmRvY3VtZW50ZWRdIEludmFs
aWRPcGVyYXRpb25FeGNlcHRpb24gSGFuZGxlcjogezB9IiwgZS5Ub1N0cmluZygpKTsNCgkJfQ0K
CX0NCgkNCglwdWJsaWMgdm9pZCBUZXN0Q29uc3RydWN0b3I0KCkgew0KCQlTb3J0ZWRMaXN0IHRl
bXAxID0gbmV3IFNvcnRlZExpc3QoMTcpOw0KCQlBc3NlcnROb3ROdWxsKCJzbC5jb25zdHJ1Y3Rv
ci00OiByZXR1cm5zIG51bGwiLCB0ZW1wMSk7DQoJCUFzc2VydEVxdWFscygic2wuY29uc3RydWN0
b3ItNDogaW5jb3JyZWN0IGluaXRpYWwgY2FwYWNpdHkiLCAxNywgdGVtcDEuQ2FwYWNpdHkpOw0K
CQl0cnkgew0KCQkJdGVtcDEgPSBuZXcgU29ydGVkTGlzdCgtNik7DQoJCQlGYWlsICgic2wuY29u
c3RydWN0b3ItNDogZG9lcyBub3QgdGhyb3cgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uLCB3
aXRoIG5lZ2F0aXZlIHZhbHVlcyIpOw0KCQl9IGNhdGNoIChBcmd1bWVudE91dE9mUmFuZ2VFeGNl
cHRpb24pIHt9DQoJCXRyeSB7DQoJCQl0ZW1wMSA9IG5ldyBTb3J0ZWRMaXN0KDApOw0KCQl9IGNh
dGNoIChBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24pIHsNCgkJCUZhaWwgKCJzbC5jb25zdHJ1
Y3Rvci00OiB0aHJvd3MgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uIHdpdGggMCIpOw0KCQl9
DQoJfQ0KDQoJcHVibGljIHZvaWQgVGVzdENvbnN0cnVjdG9yNSgpIHsNCgkJQ29tcGFyZXIgYyA9
IENvbXBhcmVyLkRlZmF1bHQ7DQoJCVNvcnRlZExpc3QgdGVtcDEgPSBuZXcgU29ydGVkTGlzdChj
LDI3KTsNCgkJQXNzZXJ0Tm90TnVsbCgic2wuY29uc3RydWN0b3ItNTogcmV0dXJucyBudWxsIiwg
dGVtcDEpOw0KCQlBc3NlcnRFcXVhbHMoInNsLmNvbnN0cnVjdG9yLTU6IGluY29ycmVjdCBpbml0
aWFsIGNhcGFjaXR5IiwgMjcsIHRlbXAxLkNhcGFjaXR5KTsNCgkJdHJ5IHsNCgkJCXRlbXAxID0g
bmV3IFNvcnRlZExpc3QoLTEyKTsNCgkJCUZhaWwgKCJzbC5jb25zdHJ1Y3Rvci01OiBkb2VzIG5v
dCB0aHJvdyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24sIHdpdGggbmVnYXRpdmUgdmFsdWVz
Iik7DQoJCX0gY2F0Y2ggKEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbikge30NCgl9DQoNCglw
dWJsaWMgdm9pZCBUZXN0SXNTeW5jaHJvbml6ZWQoKSB7DQoJCVNvcnRlZExpc3Qgc2wxID0gbmV3
IFNvcnRlZExpc3QoKTsNCgkJQXNzZXJ0KCJzbDogc2hvdWxkIG5vdCBiZSBzeW5jaHJvbml6ZWQg
YnkgZGVmYXVsdCIsIA0KCQkgICAgICAgIXNsMS5Jc1N5bmNocm9uaXplZCk7DQoJCVNvcnRlZExp
c3Qgc2wyID0gU29ydGVkTGlzdC5TeW5jaHJvbml6ZWQoc2wxKTsNCgkJQXNzZXJ0KCJzbDogc3lu
Y2hyb25pemVkIHdyYXBwZXIgbm90IHdvcmtpbmciLCBzbDIuSXNTeW5jaHJvbml6ZWQpOw0KCX0N
Cg0KCXB1YmxpYyB2b2lkIFRlc3RDYXBhY2l0eSgpIHsNCgkJZm9yIChpbnQgaSA9IDA7IGkgPCAx
MDA7IGkrKykgew0KCQkJU29ydGVkTGlzdCBzbDEgPSBuZXcgU29ydGVkTGlzdChpKTsNCgkJCUFz
c2VydEVxdWFscygiQmFkIGNhcGFjaXR5IG9mICIgKyBpLA0KCQkJCSAgICAgaSwgc2wxLkNhcGFj
aXR5KTsNCgkJfQ0KCX0NCg0KCXB1YmxpYyB2b2lkIFRlc3RDb3VudCgpIHsNCgkJew0KCQkJU29y
dGVkTGlzdCBzbDEgPSBuZXcgU29ydGVkTGlzdCgpOw0KCQkJQXNzZXJ0RXF1YWxzKCJCYWQgaW5p
dGlhbCBjb3VudCIsDQoJCQkJICAgICAwLCBzbDEuQ291bnQpOw0KCQkJZm9yIChpbnQgaSA9IDE7
IGkgPD0gMTAwOyBpKyspIHsNCgkJCQlzbDEuQWRkKCIiK2ksIiIraSk7DQoJCQkJQXNzZXJ0RXF1
YWxzKCJCYWQgY291bnQgIiArIGksDQoJCQkJCSAgICAgaSwgc2wxLkNvdW50KTsNCgkJCX0NCgkJ
fQ0KCX0NCg0KCXB1YmxpYyB2b2lkIFRlc3RJc0ZpeGVkKCkgew0KCQlTb3J0ZWRMaXN0IHNsMSA9
IG5ldyBTb3J0ZWRMaXN0KCk7DQoJCUFzc2VydCgic2hvdWxkIG5vdCBiZSBmaXhlZCBieSBkZWZh
dWx0IiwgIXNsMS5Jc0ZpeGVkU2l6ZSk7DQoJfQ0KDQoJcHVibGljIHZvaWQgVGVzdElzUmVhZE9u
bHkoKSB7DQoJCVNvcnRlZExpc3Qgc2wxID0gbmV3IFNvcnRlZExpc3QoKTsNCgkJQXNzZXJ0KCJz
aG91bGQgbm90IGJlIFJlYWRPbmx5IGJ5IGRlZmF1bHQiLCAhc2wxLklzUmVhZE9ubHkpOw0KCX0N
Cg0KDQoJcHVibGljIHZvaWQgVGVzdEl0ZW0oKSB7DQoJCVNvcnRlZExpc3Qgc2wxID0gbmV3IFNv
cnRlZExpc3QoKTsNCgkJc3RyaW5nIGtleSA9IG51bGw7DQoJCXsNCgkJCXRyeSB7DQoJCQkJb2Jq
ZWN0IG8gPSBzbDFbLTFdOw0KCQkJfSBjYXRjaCAoQXJndW1lbnROdWxsRXhjZXB0aW9uKSB7DQoJ
CQkJRmFpbCAoInNsLkl0ZW06IHRocm93cyBBcmd1bWVudE51bGxFeGNlcHRpb24gd2l0aCBuZWdh
dGl2ZSB2YWx1ZXMiKTsNCgkJCX0NCgkJCXRyeSB7DQoJCQkJb2JqZWN0IG8gPSBzbDFba2V5XTsN
CgkJCQlGYWlsICgic2wuSXRlbTogZG9lcyBub3QgdGhyb3cgQXJndW1lbnROdWxsRXhjZXB0aW9u
IHdpdGggbnVsbCBrZXkiKTsNCgkJCX0gY2F0Y2ggKEFyZ3VtZW50TnVsbEV4Y2VwdGlvbikge30N
CgkJfQ0KDQoJCWZvciAoaW50IGkgPSAwOyBpIDw9IDEwMDsgaSsrKSB7DQoJCQlzbDEuQWRkKCJr
YWxhICIraSxpKTsNCgkJfQ0KCQlmb3IgKGludCBpID0gMDsgaSA8PSAxMDA7IGkrKykgew0KCQkJ
QXNzZXJ0RXF1YWxzKCJzbC5JdGVtOiBpdGVtIG5vdCBmZXRjaGVkIGZvciAiICsgaSwNCgkJCQkg
ICAgIGksIHNsMVsia2FsYSAiK2ldKTsNCgkJfQ0KCX0NCg0KICBwdWJsaWMgdm9pZCBUZXN0U3lu
Y1Jvb3QoKQ0KICB7DQogIAlTb3J0ZWRMaXN0IHNsMSA9IG5ldyBTb3J0ZWRMaXN0KCk7DQoJCUFz
c2VydEVxdWFscygic2wuU3luY1Jvb3Q6IGRvZXMgbm90IGZ1bmN0aW9uIixmYWxzZSwgc2wxLlN5
bmNSb290ID09IG51bGwpOw0KCQkvKg0KCQlsb2NrKCBzbDEuU3luY1Jvb3QgKSB7DQoJCQlmb3Jl
YWNoICggT2JqZWN0IGl0ZW0gaW4gc2wxICkgew0KCQkJCWl0ZW09ImFzZGYiOw0KCQkJCUFzc2Vy
dCAoInNsLlN5bmNSb290OiBpdGVtIG5vdCByZWFkLW9ubHkiLGl0ZW0uSXNSZWFkT25seSk7DQog
CQkJfQ0KCQl9DQoJCSovDQogIH0NCg0KCXB1YmxpYyB2b2lkIFRlc3RWYWx1ZXMoKQ0KCXsNCiAg
CVNvcnRlZExpc3Qgc2wxID0gbmV3IFNvcnRlZExpc3QoKTsNCgkJSUNvbGxlY3Rpb24gaWMxID0g
c2wxLlZhbHVlczsNCgkJZm9yIChpbnQgaSA9IDA7IGkgPD0gMTAwOyBpKyspIHsNCgkJCXNsMS5B
ZGQoImthbGEgIitpLGkpOw0KCQkJQXNzZXJ0RXF1YWxzKCJzbC5WYWx1ZXM6IC5WYWx1ZXMgaGFz
IGRpZmZlcmVudCBjb3VudCIsc2wxLkNvdW50LGljMS5Db3VudCk7DQoJCX0NCgl9DQoJDQoJDQoJ
Ly8gVE9ETzogQWRkIHdpdGggSUNvbXBhcmVyDQoJcHVibGljIHZvaWQgVGVzdEFkZCgpIHsNCgkJ
Ly8gc2VlbXMgU29ydGVkTGlzdCBjYW5ub3QgYmUgc2V0IGZpeGVkc2l6ZSBvciByZWFkb25seQ0K
CQlTb3J0ZWRMaXN0IHNsMSA9IG5ldyBTb3J0ZWRMaXN0KCk7DQoJCXN0cmluZyBrZXkgPSBudWxs
Ow0KCQl7DQoJCQl0cnkgew0KCQkJCXNsMS5BZGQoa2V5LCJrYWxhIik7DQoJCQkJRmFpbCAoInNs
LkFkZDogZG9lcyBub3QgdGhyb3cgQXJndW1lbnROdWxsRXhjZXB0aW9uIHdpdGggbnVsbCBrZXki
KTsNCgkJCX0gY2F0Y2ggKEFyZ3VtZW50TnVsbEV4Y2VwdGlvbikge30NCgkJfQ0KDQoJCXsNCgkJ
CWZvciAoaW50IGkgPSAxOyBpIDw9IDEwMDsgaSsrKSB7DQoJCQkJc2wxLkFkZCgia2FsYSAiK2ks
aSk7DQoJCQkJQXNzZXJ0RXF1YWxzKCJzbC5BZGQ6IGluY29ycmVjdCBjb3VudCIsaSxzbDEuQ291
bnQpOw0KCQkJCUFzc2VydEVxdWFscygic2wuQWRkOiBpbmNvcnJlY3QgdmFsdWUiLGksc2wxWyJr
YWxhICIraV0pOw0KCQkJfQ0KCQl9DQoJCXsNCgkJCXRyeSB7DQoJCQkJc2wxLkFkZCgia2FsYSIs
MTApOw0KCQkJCXNsMS5BZGQoImthbGEiLDExKTsNCgkJCQlGYWlsICgic2wuQWRkOiBkb2VzIG5v
dCB0aHJvdyBBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIGFkZGluZyBleGlzdGluZyBrZXkiKTsNCgkJ
CX0gY2F0Y2ggKEFyZ3VtZW50RXhjZXB0aW9uKSB7fQ0KCQl9DQoJfQ0KCQ0KCQ0KCXB1YmxpYyB2
b2lkIFRlc3RDbGVhcigpIHsNCgkJew0KCQkJU29ydGVkTGlzdCBzbDEgPSBuZXcgU29ydGVkTGlz
dCgxMCk7DQoJCQlzbDEuQWRkKCJrYWxhIiwnYycpOw0KCQkJc2wxLkFkZCgia2FsYTIiLCdkJyk7
DQoJCQlBc3NlcnRFcXVhbHMoInNsLkNsZWFyOiBjYXBhY2l0eSBpcyBpbmNvcnJlY3QiLDEwLCBz
bDEuQ2FwYWNpdHkpOw0KCQkJQXNzZXJ0RXF1YWxzKCJzbC5DbGVhcjogc2hvdWxkIGhhdmUgb25l
IGVsZW1lbnQiLAkyLCBzbDEuQ291bnQpOw0KCQkJc2wxLkNsZWFyKCk7DQoJCQlBc3NlcnRFcXVh
bHMoInNsLkNsZWFyOiBpcyBub3QgY2xlYXJlZCIsMCwgc2wxLkNvdW50KTsNCgkJCUFzc2VydEVx
dWFscygic2wuQ2xlYXI6IGNhcGFjaXR5IGlzIGFsdGVyZWQiLDEwLCBzbDEuQ2FwYWNpdHkpOw0K
CQl9DQoJfQ0KDQoJcHVibGljIHZvaWQgVGVzdENsb25lKCkgew0KCQl7DQoJCQlTb3J0ZWRMaXN0
IHNsMSA9IG5ldyBTb3J0ZWRMaXN0KDEwKTsNCgkJCWZvciAoaW50IGkgPSAwOyBpIDw9IDUwOyBp
KyspIHtzbDEuQWRkKCJrYWxhICIraSxpKTt9DQoJCQlTb3J0ZWRMaXN0IHNsMiA9IChTb3J0ZWRM
aXN0KXNsMS5DbG9uZSgpOw0KCQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gNTA7IGkrKykgew0KCQkJ
CUFzc2VydEVxdWFscygic2wuQ2xvbmU6IGNvcHlpbmcgZmFpbGVkIEAiK2ksIHNsMVsia2FsYSAi
K2ldLCBzbDJbImthbGEgIitpXSk7DQoJCQl9DQoJCX0NCgkJew0KCQkJY2hhcltdIGQxMCA9IHsn
YScsICdiJ307DQoJCQljaGFyW10gZDExID0geydhJywgJ2MnfTsNCgkJCWNoYXJbXSBkMTIgPSB7
J2InLCAnYyd9Ow0KCQkJLy9jaGFyW11bXSBkMSA9IHtkMTAsIGQxMSwgZDEyfTsNCgkJCVNvcnRl
ZExpc3Qgc2wxID0gbmV3IFNvcnRlZExpc3QoKTsNCgkJCXNsMS5BZGQoImQxIixkMTApOw0KCQkJ
c2wxLkFkZCgiZDIiLGQxMSk7DQoJCQlzbDEuQWRkKCJkMyIsZDEyKTsNCgkJCVNvcnRlZExpc3Qg
c2wyID0gKFNvcnRlZExpc3Qpc2wxLkNsb25lKCk7DQoJCQlBc3NlcnRFcXVhbHMoInNsLkNsb25l
OiBBcnJheSBub3QgbWF0Y2hpbmciLCBzbDFbImQxIl0sIHNsMlsiZDEiXSk7DQoJCQlBc3NlcnRF
cXVhbHMoInNsLkNsb25lOiBBcnJheSBub3QgbWF0Y2hpbmciLCBzbDFbImQyIl0sIHNsMlsiZDIi
XSk7DQoJCQlBc3NlcnRFcXVhbHMoInNsLkNsb25lOiBBcnJheSBub3QgbWF0Y2hpbmciLCBzbDFb
ImQzIl0sIHNsMlsiZDMiXSk7DQoJCQkNCgkJCSgoY2hhcltdKXNsMVsiZDEiXSlbMF0gPSAneic7
DQoJCQlBc3NlcnRFcXVhbHMoInMxLkNsb25lOiBzaGFsbG93IGNvcHkiLCBzbDFbImQxIl0sIHNs
MlsiZDEiXSk7DQoJCX0NCgl9DQoNCglwdWJsaWMgdm9pZCBUZXN0Q29udGFpbnMoKSB7DQoJCVNv
cnRlZExpc3Qgc2wxID0gbmV3IFNvcnRlZExpc3QoNTUpOw0KCQlmb3IgKGludCBpID0gMDsgaSA8
PSA1MDsgaSsrKSB7c2wxLkFkZCgia2FsYSAiK2ksaSk7fQ0KDQoJCXRyeSB7DQoJCQlpZiAoc2wx
LkNvbnRhaW5zKG51bGwpKXt9DQoJCQlGYWlsICgic2wuQ29udGFpbnM6IGRvZXMgbm90IHRocm93
IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiB3aXRoIG51bGwga2V5Iik7DQoJCX0gY2F0Y2ggKEFyZ3Vt
ZW50TnVsbEV4Y2VwdGlvbikge30NCgkJDQoJCUFzc2VydCgic2wuQ29udGFpbnM6IGNhbid0IGZp
bmQgZXhpc3Rpbmcga2V5Iiwgc2wxLkNvbnRhaW5zKCJrYWxhIDE3IikpOw0KCQlBc3NlcnQoInNs
LkNvbnRhaW5zOiBmaW5kcyBub24tZXhpc3Rpbmcga2V5IiwgIXNsMS5Db250YWlucygib2hvbyIp
KTsNCgl9DQoNCglwdWJsaWMgdm9pZCBUZXN0Q29udGFpbnNLZXkoKSB7DQoJCVNvcnRlZExpc3Qg
c2wxID0gbmV3IFNvcnRlZExpc3QoNTUpOw0KCQlmb3IgKGludCBpID0gMDsgaSA8PSA1MDsgaSsr
KSB7c2wxLkFkZCgia2FsYSAiK2ksaSk7fQ0KDQoJCXRyeSB7DQoJCQlpZiAoc2wxLkNvbnRhaW5z
S2V5KG51bGwpKXt9DQoJCQlGYWlsICgic2wuQ29udGFpbnNLZXk6IGRvZXMgbm90IHRocm93IEFy
Z3VtZW50TnVsbEV4Y2VwdGlvbiB3aXRoIG51bGwga2V5Iik7DQoJCX0gY2F0Y2ggKEFyZ3VtZW50
TnVsbEV4Y2VwdGlvbikge30NCgkJDQoJCUFzc2VydCgic2wuQ29udGFpbnNLZXk6IGNhbid0IGZp
bmQgZXhpc3Rpbmcga2V5Iiwgc2wxLkNvbnRhaW5zS2V5KCJrYWxhIDE3IikpOw0KCQlBc3NlcnQo
InNsLkNvbnRhaW5zS2V5OiBmaW5kcyBub24tZXhpc3Rpbmcga2V5IiwgIXNsMS5Db250YWluc0tl
eSgib2hvbyIpKTsNCgl9DQoNCglwdWJsaWMgdm9pZCBUZXN0Q29udGFpbnNWYWx1ZSgpIHsNCgkJ
U29ydGVkTGlzdCBzbDEgPSBuZXcgU29ydGVkTGlzdCg1NSk7DQogICAgc2wxLkFkZCgwLCAiemVy
byIpOw0KICAgIHNsMS5BZGQoMSwgIm9uZSIpOw0KICAgIHNsMS5BZGQoMiwgInR3byIpOw0KICAg
IHNsMS5BZGQoMywgInRocmVlIik7DQogICAgc2wxLkFkZCg0LCAiZm91ciIpOw0KCQlBc3NlcnQo
InNsLkNvbnRhaW5zVmFsdWU6IGNhbid0IGZpbmQgZXhpc3RpbmcgdmFsdWUiLCBzbDEuQ29udGFp
bnNWYWx1ZSgiemVybyIpKTsNCgkJQXNzZXJ0KCJzbC5Db250YWluc1ZhbHVlOiBmaW5kcyBub24t
ZXhpc3RpbmcgdmFsdWUiLCAhc2wxLkNvbnRhaW5zVmFsdWUoIm9ob28iKSk7DQoJCUFzc2VydCgi
c2wuQ29udGFpbnNWYWx1ZTogZmluZHMgbm9uLWV4aXN0aW5nIHZhbHVlIiwgIXNsMS5Db250YWlu
c1ZhbHVlKG51bGwpKTsNCgl9DQoJDQoJcHVibGljIHZvaWQgVGVzdENvcHlUbygpIHsNCgkJU29y
dGVkTGlzdCBzbDEgPSBuZXcgU29ydGVkTGlzdCgpOw0KCQlmb3IgKGludCBpID0gMDsgaSA8PSAx
MDsgaSsrKSB7c2wxLkFkZCgia2FsYSAiK2ksaSk7fQ0KCQl7DQoJCQl0cnkgew0KCQkJCXNsMS5D
b3B5VG8obnVsbCwgMik7DQoJCQkJRmFpbCgic2wuQ29weVRvOiBkb2VzIG5vdCB0aHJvdyBBcmd1
bWVudE51bGxFeGNlcHRpb24gd2hlbiB0YXJnZXQgbnVsbCIpOw0KCQkJfSBjYXRjaCAoQXJndW1l
bnROdWxsRXhjZXB0aW9uKSB7fQ0KCQl9DQoJCXsNCgkJCXRyeSB7DQoJCQkJQ2hhclssXSBjMiA9
IG5ldyBDaGFyWzIsMl07DQoJCQkJc2wxLkNvcHlUbyhjMiwgMik7DQoJCQkJRmFpbCgic2wuQ29w
eVRvOiBkb2VzIG5vdCB0aHJvdyBBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIHRhcmdldCBpcyBtdWx0
aWFycmF5Iik7DQoJCQl9IGNhdGNoIChBcmd1bWVudEV4Y2VwdGlvbikge30NCgkJfQ0KCQl7DQoJ
CQl0cnkgew0KCQkJCUNoYXJbXSBjMSA9IG5ldyBDaGFyWzJdOw0KCQkJCXNsMS5Db3B5VG8oYzEs
IC0yKTsNCgkJCQlGYWlsKCJzbC5Db3B5VG86IGRvZXMgbm90IHRocm93IEFyZ3VtZW50T3V0T2ZS
YW5nZUV4Y2VwdGlvbiB3aGVuIGluZGV4IGlzIG5lZ2F0aXZlIik7DQoJCQl9IGNhdGNoIChBcmd1
bWVudE91dE9mUmFuZ2VFeGNlcHRpb24pIHt9DQoJCX0NCgkJew0KCQkJdHJ5IHsNCgkJCQlDaGFy
W10gYzEgPSBuZXcgQ2hhclsyXTsNCgkJCQlzbDEuQ29weVRvKGMxLCAzKTsNCgkJCQlGYWlsKCJz
bC5Db3B5VG86IGRvZXMgbm90IHRocm93IEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gaW5kZXggaXMg
dG9vIGxhcmdlIik7DQoJCQl9IGNhdGNoIChBcmd1bWVudEV4Y2VwdGlvbikge30NCgkJfQ0KCQl7
DQoJCQl0cnkgew0KCQkJCUNoYXJbXSBjMSA9IG5ldyBDaGFyWzJdOw0KCQkJCXNsMS5Db3B5VG8o
YzEsIDEpOw0KCQkJCUZhaWwoInNsLkNvcHlUbzogZG9lcyBub3QgdGhyb3cgQXJndW1lbnRFeGNl
cHRpb24gd2hlbiBTb3J0ZWRMaXN0IHRvbyBiaWcgZm9yIHRoZSBhcnJheSIpOw0KCQkJfSBjYXRj
aCAoQXJndW1lbnRFeGNlcHRpb24pIHt9DQoJCX0NCgkJew0KCQkJdHJ5IHsNCgkJCQlDaGFyW10g
YzIgPSBuZXcgQ2hhclsxNV07DQoJCQkJc2wxLkNvcHlUbyhjMiwgMCk7DQoJCQkJRmFpbCgic2wu
Q29weVRvOiBkb2VzIG5vdCB0aHJvdyBJbnZhbGlkQ2FzdEV4Y2VwdGlvbiB3aGVuIGluY29tcGF0
aWJsZSBkYXRhIHR5cGVzIik7DQoJCQl9IGNhdGNoIChJbnZhbGlkQ2FzdEV4Y2VwdGlvbikge30N
CgkJfQ0KDQoJCS8vIENvcHlUbyBmdW5jdGlvbiBkb2VzIG5vdCB3b3JrIHdlbGwgd2l0aCBTb3J0
ZWRMaXN0DQoJCS8vIGV2ZW4gZXhhbXBsZSBhdCBNU0ROIGdhdmUgSW52YWxpZENhc3RFeGNlcHRp
b24NCgkJLy8gdGh1cywgaXQgaXMgTk9UIHRlc3RldCBoZXJlDQoJCS8qDQoJCQkJc2wxLkNsZWFy
KCk7DQoJCQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gNTsgaSsrKSB7c2wxLkFkZChpLCIiK2kpO30N
CgkJICAgIENoYXJbXSBjb3B5ID0gbmV3IENoYXJbMTVdOw0KCQkgICAgQXJyYXkuQ2xlYXIoY29w
eSwwLGNvcHkuTGVuZ3RoKTsNCgkJICAgIGNvcHkuU2V0VmFsdWUoICJUaGUiLCAwICk7DQoJCSAg
ICBjb3B5LlNldFZhbHVlKCAicXVpY2siLCAxICk7DQoJCSAgICBjb3B5LlNldFZhbHVlKCAiYnJv
d24iLCAyICk7DQoJCSAgICBjb3B5LlNldFZhbHVlKCAiZm94IiwgMyApOw0KCQkgICAgY29weS5T
ZXRWYWx1ZSggImp1bXBlZCIsIDQgKTsNCgkJICAgIGNvcHkuU2V0VmFsdWUoICJvdmVyIiwgNSAp
Ow0KCQkgICAgY29weS5TZXRWYWx1ZSggInRoZSIsIDYgKTsNCgkJICAgIGNvcHkuU2V0VmFsdWUo
ICJsYXp5IiwgNyApOw0KCQkgICAgY29weS5TZXRWYWx1ZSggImRvZyIsIDggKTsNCgkJCQlzbDEu
Q29weVRvKGNvcHksMSk7DQoJCQkJQXNzZXJ0RXF1YWxzKCJzbC5Db3B5VG86IGluY29ycmVjdCBj
b3B5KDEpLiIsIlRoZSIsIGNvcHkuR2V0VmFsdWUoMCkpOw0KCQkJCUFzc2VydEVxdWFscygic2wu
Q29weVRvOiBpbmNvcnJlY3QgY29weSgxKS4iLCJxdWljayIsIGNvcHkuR2V0VmFsdWUoMSkpOw0K
CQkJCWZvciAoaW50IGk9MjsgaTw4OyBpKyspIEFzc2VydEVxdWFscygic2wuQ29weVRvOiBpbmNv
cnJlY3QgY29weSgyKS4iLHNsMVsia2FsYSAiKyhpLTIpXSwgY29weS5HZXRWYWx1ZShpKSk7DQoJ
CQkJQXNzZXJ0RXF1YWxzKCJzbC5Db3B5VG86IGluY29ycmVjdCBjb3B5KDMpLiIsImRvZyIsIGNv
cHkuR2V0VmFsdWUoOCkpOw0KCQkqLw0KCX0NCg0KCXB1YmxpYyBTb3J0ZWRMaXN0IERlZmF1bHRT
TCgpIHsNCgkJU29ydGVkTGlzdCBzbDEgPSBuZXcgU29ydGVkTGlzdCgpOw0KCQlzbDEuQWRkKCAx
LjAsICJUaGUiICk7DQoJCXNsMS5BZGQoIDEuMSwgInF1aWNrIiApOw0KCQlzbDEuQWRkKCAzNC4w
LCAiYnJvd24iICk7DQoJCXNsMS5BZGQoIC0xMDAuNzUsICJmb3giICk7DQoJCXNsMS5BZGQoIDEu
NCwgImp1bXBlZCIgKTsNCgkJc2wxLkFkZCggMS41LCAib3ZlciIgKTsNCgkJc2wxLkFkZCggMS42
LCAidGhlIiApOw0KCQlzbDEuQWRkKCAxLjcsICJsYXp5IiApOw0KCQlzbDEuQWRkKCAxLjgsICJk
b2ciICk7DQoJCXJldHVybiBzbDE7DQoJfQ0KCQ0KCXB1YmxpYyBJTGlzdCBEZWZhdWx0VmFsdWVz
KCkgew0KCQlJTGlzdCBpbCA9IG5ldyBBcnJheUxpc3QoKTsNCgkJaWwuQWRkKCAiZm94IiApOw0K
CQlpbC5BZGQoICJUaGUiICk7DQoJCWlsLkFkZCggInF1aWNrIiApOw0KCQlpbC5BZGQoICJqdW1w
ZWQiICk7DQoJCWlsLkFkZCggIm92ZXIiICk7DQoJCWlsLkFkZCggInRoZSIgKTsNCgkJaWwuQWRk
KCAibGF6eSIgKTsNCgkJaWwuQWRkKCAiZG9nIiApOw0KCQlpbC5BZGQoICJicm93biIgKTsNCgkJ
cmV0dXJuIGlsOw0KCX0NCgkNCglwdWJsaWMgdm9pZCBUZXN0R2V0QnlJbmRleCgpIHsNCgkJU29y
dGVkTGlzdCBzbDEgPSBEZWZhdWx0U0woKTsNCgkJQXNzZXJ0RXF1YWxzKCJjbC5HZXRCeUluZGV4
OiBmYWlsZWQoMSkiLCJvdmVyIixzbDEuR2V0QnlJbmRleCg0KSk7DQoJCUFzc2VydEVxdWFscygi
Y2wuR2V0QnlJbmRleDogZmFpbGVkKDIpIiwiYnJvd24iLHNsMS5HZXRCeUluZGV4KDgpKTsNCgkJ
dHJ5IHsNCgkJCXNsMS5HZXRCeUluZGV4KC0xKTsNCgkJCUZhaWwoInNsLkdldEJ5SW5kZXg6IGRv
ZXMgbm90IHRocm93IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiB3aXRoIG5lZ2F0aXZlIGlu
ZGV4Iik7DQoJCX0gY2F0Y2ggKEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbikge30NCgkJdHJ5
IHsNCgkJCXNsMS5HZXRCeUluZGV4KDEwMCk7DQoJCQlGYWlsKCJzbC5HZXRCeUluZGV4OiBkb2Vz
IG5vdCB0aHJvdyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24gd2l0aCB0b28gbGFyZ2UgaW5k
ZXgiKTsNCgkJfSBjYXRjaCAoQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKSB7fQ0KCX0NCg0K
CXB1YmxpYyB2b2lkIFRlc3RHZXRFbnVtZXJhdG9yKCkgew0KCQlTb3J0ZWRMaXN0IHNsMSA9IERl
ZmF1bHRTTCgpOw0KCQlJRGljdGlvbmFyeUVudW1lcmF0b3IgZSA9IHNsMS5HZXRFbnVtZXJhdG9y
KCk7DQoJCUFzc2VydE5vdE51bGwoInNsLkdldEVudW1lcmF0b3I6IGRvZXMgbm90IHJldHVybiBl
bnVtZXJhdG9yIiwgZSk7DQoJCUFzc2VydEVxdWFscygic2wuR2V0RW51bWVyYXRvcjogZW51bWVy
YXRvciBub3Qgd29ya2luZygxKSIsdHJ1ZSxlLk1vdmVOZXh0KCkpOw0KCQlBc3NlcnROb3ROdWxs
KCJzbC5HZXRFbnVtZXJhdG9yOiBlbnVtZXJhdG9yIG5vdCB3b3JraW5nKDIpIixlLkN1cnJlbnQp
Ow0KCX0NCg0KCXB1YmxpYyB2b2lkIFRlc3RHZXRLZXkoKSB7DQoJCVNvcnRlZExpc3Qgc2wxID0g
RGVmYXVsdFNMKCk7DQoJCUFzc2VydEVxdWFscygic2wuR2V0S2V5OiBmYWlsZWQoMSkiLDEuNSxz
bDEuR2V0S2V5KDQpKTsNCgkJQXNzZXJ0RXF1YWxzKCJzbC5HZXRLZXk6IGZhaWxlZCgyKSIsMzQu
MCxzbDEuR2V0S2V5KDgpKTsNCgkJdHJ5IHsNCgkJCXNsMS5HZXRLZXkoLTEpOw0KCQkJRmFpbCgi
c2wuR2V0S2V5OiBkb2VzIG5vdCB0aHJvdyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24gd2l0
aCBuZWdhdGl2ZSBpbmRleCIpOw0KCQl9IGNhdGNoIChBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRp
b24pIHt9DQoJCXRyeSB7DQoJCQlzbDEuR2V0S2V5KDEwMCk7DQoJCQlGYWlsKCJzbC5HZXRLZXk6
IGRvZXMgbm90IHRocm93IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiB3aXRoIHRvbyBsYXJn
ZSBpbmRleCIpOw0KCQl9IGNhdGNoIChBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24pIHt9DQoJ
fQ0KDQoJcHVibGljIHZvaWQgVGVzdEdldEtleUxpc3QoKSB7DQoJCVNvcnRlZExpc3Qgc2wxID0g
RGVmYXVsdFNMKCk7DQoJCUlMaXN0IGtleXMgPSBzbDEuR2V0S2V5TGlzdCgpOw0KCQlBc3NlcnRO
b3ROdWxsKCJzbC5HZXRLZXlMaXN0OiBkb2VzIG5vdCByZXR1cm4ga2V5bGlzdCIsIGtleXMpOw0K
CQlBc3NlcnQoInNsLkdldEtleUxpc3Q6IGtleWxpc3QgaXMgbm90IHJlYWRvbmx5Iiwga2V5cy5J
c1JlYWRPbmx5KTsNCgkJQXNzZXJ0RXF1YWxzKCJzbC5HZXRLZXlMaXN0OiBpbmNvcnJlY3Qga2V5
bGlzdCBzaXplIiw5LGtleXMuQ291bnQpOw0KCQlBc3NlcnRFcXVhbHMoInNsLkdldEtleUxpc3Q6
IGluY29ycmVjdCBrZXkoMSkiLDEuNCxrZXlzWzNdKTsNCgkJc2wxLkFkZCgzMy45LCJlaGhlIik7
DQoJCUFzc2VydEVxdWFscygic2wuR2V0S2V5TGlzdDogaW5jb3JyZWN0IGtleWxpc3Qgc2l6ZSIs
MTAsa2V5cy5Db3VudCk7DQoJCUFzc2VydEVxdWFscygic2wuR2V0S2V5TGlzdDogaW5jb3JyZWN0
IGtleSgyKSIsMzMuOSxrZXlzWzhdKTsNCgl9DQoNCglwdWJsaWMgdm9pZCBUZXN0R2V0VmFsdWVM
aXN0KCkgew0KCQlTb3J0ZWRMaXN0IHNsMSA9IERlZmF1bHRTTCgpOw0KCQlJTGlzdCBvcmlnaW5h
bHZhbHMgPSBEZWZhdWx0VmFsdWVzKCk7DQoJCUlMaXN0IHZhbHMgPSBzbDEuR2V0VmFsdWVMaXN0
KCk7DQoJCUFzc2VydE5vdE51bGwoInNsLkdldFZhbHVlTGlzdDogZG9lcyBub3QgcmV0dXJuIHZh
bHVlbGlzdCIsIHZhbHMpOw0KCQlBc3NlcnQoInNsLkdldFZhbHVlTGlzdDogdmFsdWVsaXN0IGlz
IG5vdCByZWFkb25seSIsIHZhbHMuSXNSZWFkT25seSk7DQoJCUFzc2VydEVxdWFscygic2wuR2V0
VmFsdWVMaXN0OiBpbmNvcnJlY3QgdmFsdWVsaXN0IHNpemUiLHNsMS5Db3VudCx2YWxzLkNvdW50
KTsNCgkJZm9yIChpbnQgaT0wOyBpPHNsMS5Db3VudDsgaSsrKSB7DQoJCQlBc3NlcnRFcXVhbHMo
InNsLkdldFZhbHVlTGlzdDogaW5jb3JyZWN0IGtleSgxKSIsb3JpZ2luYWx2YWxzW2ldLHZhbHNb
aV0pOw0KCQl9DQoNCgkJc2wxLkFkZCgwLjAxLCJlaGhlIik7DQoJCUFzc2VydEVxdWFscygic2wu
R2V0VmFsdWVMaXN0OiBpbmNvcnJlY3QgdmFsdWVsaXN0IHNpemUiLDEwLHZhbHMuQ291bnQpOw0K
CQlBc3NlcnRFcXVhbHMoInNsLkdldFZhbHVlTGlzdDogaW5jb3JyZWN0IHZhbHVlKDIpIiwiZG9n
Iix2YWxzWzhdKTsNCgl9DQoNCgkvLyBUT0RPOiBJRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yIFtF
eHBsaWNpdCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb25dDQoJLyoNCglwdWJsaWMgdm9pZCBUZXN0
SUVudW1lcmFibGVfR2V0RW51bWVyYXRvcigpIHsNCgkJU29ydGVkTGlzdCBzbDEgPSBEZWZhdWx0
U0woKTsNCgkJSUVudW1lcmF0b3IgZSA9IHNsMS5JRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCk7
DQoJCUFzc2VydE5vdE51bGwoInNsLkdldEVudW1lcmF0b3I6IGRvZXMgbm90IHJldHVybiBlbnVt
ZXJhdG9yIiwgZSk7DQoJCUFzc2VydEVxdWFscygic2wuR2V0RW51bWVyYXRvcjogZW51bWVyYXRv
ciBub3Qgd29ya2luZygxKSIsZS5Nb3ZlTmV4dCgpLHRydWUpOw0KCQlBc3NlcnROb3ROdWxsKCJz
bC5HZXRFbnVtZXJhdG9yOiBlbnVtZXJhdG9yIG5vdCB3b3JraW5nKDIpIixlLkN1cnJlbnQpOw0K
CX0NCgkqLw0KDQoJcHVibGljIHZvaWQgVGVzdEluZGV4T2ZLZXkoKSB7DQoJCVNvcnRlZExpc3Qg
c2wxID0gbmV3IFNvcnRlZExpc3QoMjQpOw0KCQlzdHJpbmcgcz1udWxsOw0KCQlpbnQgdDsNCgkJ
Zm9yIChpbnQgaSA9IDA7IGkgPD0gNTA7IGkrKykgew0KCQkJcz1zdHJpbmcuRm9ybWF0KCJ7MDpE
Mn0iLCBpKTsgDQoJCQlzbDEuQWRkKCJrYWxhICIrcyxpKTsNCgkJfQ0KCQlBc3NlcnRFcXVhbHMo
InNsLkluZGV4T2ZLZXk6IGRvZXMgbm90IHJldHVybiAtMSBmb3Igbm9uLWV4aXN0aW5nIGtleSIs
LTEsc2wxLkluZGV4T2ZLZXkoImthbGEgIikpOw0KCQlzPW51bGw7DQoJCXRyeSB7DQoJCQl0PXNs
MS5JbmRleE9mS2V5KHMpOw0KCQkJRmFpbCgic2wuSW5kZXhPZktleTogQXJndW1lbnROdWxsRXhj
ZXB0aW9uIG5vdCBjYXVnaHQsIHdoZW4ga2V5IGlzIG51bGwiKTsNCgkJfQ0KCQljYXRjaCAoQXJn
dW1lbnROdWxsRXhjZXB0aW9uKSB7fQ0KCQl0cnkgew0KCQkJdD1zbDEuSW5kZXhPZktleSgxMCk7
DQoJCQlGYWlsKCJzbC5JbmRleE9mS2V5OiBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCBj
YXVnaHQsIHdoZW4ga2V5IGludmFsaWQiKTsNCgkJfQ0KCQljYXRjaCAoSW52YWxpZE9wZXJhdGlv
bkV4Y2VwdGlvbikge30NCgkJZm9yIChpbnQgaT0wOyBpPD01MDsgaSsrKSB7DQoJCQlzPXN0cmlu
Zy5Gb3JtYXQoInswOkQyfSIsIGkpOyANCgkJCUFzc2VydEVxdWFscygic2wuSW5kZXhPZktleTog
aW5jb3JyZWN0IGluZGV4IGtleSIsaSxzbDEuSW5kZXhPZktleSgia2FsYSAiK3MpKTsNCgkJfQ0K
CX0NCg0KCXB1YmxpYyB2b2lkIFRlc3RJbmRleE9mVmFsdWUoKSB7DQoJCVNvcnRlZExpc3Qgc2wx
ID0gbmV3IFNvcnRlZExpc3QoMjQpOw0KCQlzdHJpbmcgcz1udWxsOw0KCQlmb3IgKGludCBpID0g
MDsgaSA8IDUwOyBpKyspIHsNCgkJCXM9c3RyaW5nLkZvcm1hdCgiezA6RDJ9IiwgaSk7IA0KCQkJ
c2wxLkFkZCgia2FsYSAiK3MsMTAwK2kqaSk7DQoJCX0NCgkJZm9yIChpbnQgaSA9IDA7IGkgPCA1
MDsgaSsrKSB7DQoJCQlzPXN0cmluZy5Gb3JtYXQoInswOkQyfSIsIGkrNTApOyANCgkJCXNsMS5B
ZGQoImthbGEgIitzLDEwMCtpKmkpOw0KCQl9DQoJCUFzc2VydEVxdWFscygic2wuSW5kZXhPZlZh
bHVlOiBkb2VzIG5vdCByZXR1cm4gLTEgZm9yIG5vbi1leGlzdGluZyB2YWx1ZSgxKSIsLTEsc2wx
LkluZGV4T2ZWYWx1ZSgxMDIpKTsNCgkJQXNzZXJ0RXF1YWxzKCJzbC5JbmRleE9mVmFsdWU6IGRv
ZXMgbm90IHJldHVybiAtMSBmb3Igbm9uLWV4aXN0aW5nIHZhbHVlKDIpIiwtMSxzbDEuSW5kZXhP
ZlZhbHVlKG51bGwpKTsNCgkJZm9yIChpbnQgaT0wOyBpPDUwOyBpKyspIHsNCgkJCUFzc2VydEVx
dWFscygic2wuSW5kZXhPZlZhbHVlOiBpbmNvcnJlY3QgaW5kZXgga2V5IixpLHNsMS5JbmRleE9m
VmFsdWUoMTAwK2kqaSkpOw0KCQl9DQoJfQ0KCQ0KDQoJcHVibGljIHZvaWQgVGVzdFJlbW92ZSgp
IHsNCgkJU29ydGVkTGlzdCBzbDEgPSBuZXcgU29ydGVkTGlzdCgyNCk7DQoJCXN0cmluZyBzPW51
bGw7DQoJCWludCBrOw0KCQlmb3IgKGludCBpID0gMDsgaSA8IDUwOyBpKyspIHNsMS5BZGQoImth
bGEgIitpLGkpOw0KCQkNCgkJdHJ5IHsNCgkJCXNsMS5SZW1vdmUocyk7DQoJCQlGYWlsKCJzbC5S
ZW1vdmU6IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiBub3QgY2F1Z2h0LCB3aGVuIGtleSBpcyBudWxs
Iik7DQoJCX0gY2F0Y2ggKEFyZ3VtZW50TnVsbEV4Y2VwdGlvbikge30NCgkJaz1zbDEuQ291bnQ7
DQoJCXNsMS5SZW1vdmUoImthbGEgIik7DQoJCUFzc2VydEVxdWFscygic2wuUmVtb3ZlOiByZW1v
dmVzIGFuIGl0ZW0sIHdoZW4gbm9uLWV4aXN0aW5nIGtleSBnaXZlbiIsayxzbDEuQ291bnQpOw0K
CQl0cnkgew0KCQkJc2wxLlJlbW92ZSgxNSk7DQoJCQlGYWlsKCJzbC5SZW1vdmU6IElDb21wYXJl
ciBleGNlcHRpb24gaXMgbm90IHRocm93biIpOw0KCQl9IGNhdGNoIChFeGNlcHRpb24pIHt9DQoN
CgkJZm9yIChpbnQgaT0xNTsgaTwyMDsgaSsrKSBzbDEuUmVtb3ZlKCJrYWxhICIraSk7DQoJCWZv
ciAoaW50IGk9NDU7IGk8NTU7IGkrKykgc2wxLlJlbW92ZSgia2FsYSAiK2kpOw0KCQkNCgkJQXNz
ZXJ0RXF1YWxzKCJzbC5SZW1vdmU6IHJlbW92aW5nIGZhaWxlZCIsNDAsc2wxLkNvdW50KTsNCgkJ
Zm9yIChpbnQgaT00NTsgaTw1NTsgaSsrKQ0KCQkJQXNzZXJ0RXF1YWxzKCJzbC5SZW1vdmU6IHJl
bW92aW5nIGZhaWxlZCgyKSIsbnVsbCxzbDFbImthbGEgIitpXSk7DQoJfQ0KDQoJcHVibGljIHZv
aWQgVGVzdFJlbW92ZUF0KCkgew0KCQlTb3J0ZWRMaXN0IHNsMSA9IG5ldyBTb3J0ZWRMaXN0KDI0
KTsNCgkJaW50IGs7DQoJCXN0cmluZyBzPW51bGw7DQoJCWZvciAoaW50IGkgPSAwOyBpIDwgNTA7
IGkrKykgew0KCQkJcz1zdHJpbmcuRm9ybWF0KCJ7MDpEMn0iLCBpKTsgDQoJCQlzbDEuQWRkKCJr
YWxhICIrcyxpKTsNCgkJfQ0KCQkNCgkJdHJ5IHsNCgkJCXNsMS5SZW1vdmVBdCgtMSk7DQoJCQlG
YWlsKCJzbC5SZW1vdmVBdDogQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uIG5vdCBjYXVnaHQs
IHdoZW4ga2V5IGlzIG91dCBvZiByYW5nZSIpOw0KCQl9IGNhdGNoIChBcmd1bWVudE91dE9mUmFu
Z2VFeGNlcHRpb24pIHt9DQoJCXRyeSB7DQoJCQlzbDEuUmVtb3ZlQXQoMTAwKTsNCgkJCUZhaWwo
InNsLlJlbW92ZUF0OiBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24gbm90IGNhdWdodCwgd2hl
biBrZXkgaXMgb3V0IG9mIHJhbmdlIik7DQoJCX0gY2F0Y2ggKEFyZ3VtZW50T3V0T2ZSYW5nZUV4
Y2VwdGlvbikge30NCgkJaz1zbDEuQ291bnQ7DQoNCgkJZm9yIChpbnQgaT0wOyBpPDIwOyBpKysp
IHNsMS5SZW1vdmVBdCg5KTsNCgkJDQoJCUFzc2VydEVxdWFscygic2wuUmVtb3ZlQXQ6IHJlbW92
aW5nIGZhaWxlZCIsMzAsc2wxLkNvdW50KTsNCgkJZm9yIChpbnQgaT0wOyBpPDk7IGkrKykNCgkJ
CUFzc2VydEVxdWFscygic2wuUmVtb3ZlQXQ6IHJlbW92aW5nIGZhaWxlZCgyKSIsaSxzbDFbImth
bGEgIitzdHJpbmcuRm9ybWF0KCJ7MDpEMn0iLCBpKV0pOw0KCQlmb3IgKGludCBpPTk7IGk8Mjk7
IGkrKykNCgkJCUFzc2VydEVxdWFscygic2wuUmVtb3ZlQXQ6IHJlbW92aW5nIGZhaWxlZCgzKSIs
bnVsbCxzbDFbImthbGEgIitzdHJpbmcuRm9ybWF0KCJ7MDpEMn0iLCBpKV0pOw0KCQlmb3IgKGlu
dCBpPTI5OyBpPDUwOyBpKyspDQoJCQlBc3NlcnRFcXVhbHMoInNsLlJlbW92ZUF0OiByZW1vdmlu
ZyBmYWlsZWQoNCkiLGksc2wxWyJrYWxhICIrc3RyaW5nLkZvcm1hdCgiezA6RDJ9IiwgaSldKTsN
Cgl9DQoNCglwdWJsaWMgdm9pZCBUZXN0U2V0QnlJbmRleCgpIHsNCgkJU29ydGVkTGlzdCBzbDEg
PSBuZXcgU29ydGVkTGlzdCgyNCk7DQoJCWZvciAoaW50IGkgPSA0OTsgaT49MDsgaS0tKSBzbDEu
QWRkKDEwMCtpLGkpOw0KCQkNCgkJdHJ5IHsNCgkJCXNsMS5TZXRCeUluZGV4KC0xLDc3KTsNCgkJ
CUZhaWwoInNsLlNldEJ5SW5kZXg6IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiBub3QgY2F1
Z2h0LCB3aGVuIGtleSBpcyBvdXQgb2YgcmFuZ2UiKTsNCgkJfSBjYXRjaCAoQXJndW1lbnRPdXRP
ZlJhbmdlRXhjZXB0aW9uKSB7fQ0KCQl0cnkgew0KCQkJc2wxLlNldEJ5SW5kZXgoMTAwLDg4KTsN
CgkJCUZhaWwoInNsLlNldEJ5SW5kZXg6IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiBub3Qg
Y2F1Z2h0LCB3aGVuIGtleSBpcyBvdXQgb2YgcmFuZ2UiKTsNCgkJfSBjYXRjaCAoQXJndW1lbnRP
dXRPZlJhbmdlRXhjZXB0aW9uKSB7fQ0KDQoJCWZvcihpbnQgaT01OyBpPDI1OyBpKyspIHNsMS5T
ZXRCeUluZGV4KGksLTEpOw0KCQlmb3IoaW50IGk9MDsgaTw1OyBpKyspDQoJCQlBc3NlcnRFcXVh
bHMoInNsLlNldEJ5SW5kZXg6IHNldCBmYWlsZWQoMSkiLGksc2wxWzEwMCtpXSk7DQoJCWZvcihp
bnQgaT01OyBpPDI1OyBpKyspDQoJCQlBc3NlcnRFcXVhbHMoInNsLlNldEJ5SW5kZXg6IHNldCBm
YWlsZWQoMikiLC0xLHNsMVsxMDAraV0pOw0KCQlmb3IoaW50IGk9MjU7IGk8NTA7IGkrKykNCgkJ
CUFzc2VydEVxdWFscygic2wuU2V0QnlJbmRleDogc2V0IGZhaWxlZCgzKSIsaSxzbDFbMTAwK2ld
KTsNCg0KCX0NCg0KCXB1YmxpYyB2b2lkIFRlc3RUcmltVG9TaXplKCkgew0KCQlTb3J0ZWRMaXN0
IHNsMSA9IG5ldyBTb3J0ZWRMaXN0KDI0KTsNCgkJDQoJCXNsMS5UcmltVG9TaXplKCk7DQoJCUFz
c2VydEVxdWFscygic2wuVHJpbVRvU2l6ZTogaW5jb3JyZWN0IGNhcGFjaXR5IGFmdGVyIHRyaW1t
aW5nIGVtcHR5IGxpc3QiLGljYXAsc2wxLkNhcGFjaXR5KTsNCgkJDQoJCWZvciAoaW50IGkgPSA3
MjsgaT49MDsgaS0tKSBzbDEuQWRkKDEwMCtpLGkpOw0KCQlzbDEuVHJpbVRvU2l6ZSgpOw0KCQlB
c3NlcnRFcXVhbHMoInNsLlRyaW1Ub1NpemU6IGluY29ycmVjdCBjYXBhY2l0eSBhZnRlciB0cmlt
bWluZyBhIGxpc3QiLDczLHNsMS5DYXBhY2l0eSk7DQoJfQ0KfQ0KDQp9

----------part3c9b63b7ba1f5
Content-Type: text/plain; name="API-notes"
Content-Transfer-Encoding: base64

UGxlYXNlIGFkZCB5b3VyIGNvbW1lbnRzIHRvIHRoaXMgZmlsZSBhYm91dCBtaXNtYXRjaGVzIGJl
dHdlZW4gdGhlIEFQSQ0KZG9jdW1lbnRhdGlvbiBhbmQgdGhlIGltcGxlbWVudGF0aW9uIGluIHRo
ZSBNaWNyb3NvZnQgb3IgRUNNQSBpbXBsZW1lbnRhdGlvbnMNCm9mIHRoZSBjbGFzcyBsaWJyYXJp
ZXMuDQoNCiogQXJyYXkuSUxpc3QuQ29udGFpbnMob2JqZWN0KTogDQoJVGhyb3dzIGFuIGV4Y2Vw
dGlvbiB3aGVuIGNhbGxlZCBvbiBhIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5LiBEb2NzDQoJZG8g
bm90IHNheSB0aGlzLiBTaW1pbGFyIHRvIEFycmF5LklMaXN0LkluZGV4T2Yob2JqZWN0KS4NCg0K
DQoqIFZlcnNpb24uQ29tcGFyZVRvKG51bGwpOg0KDQoJRG9lcyBub3QgdGhyb3cgYW4gZXhjZXB0
aW9uLiBBbnkgdmVyc2lvbiBjb21wYXJlZCB0byBudWxsIGlzDQoJY29uc2lkZXJlZCB0byBiZSBz
dWJzZXF1ZW50IHRvIG51bGwuDQoNCiogQml0Q29udmVydGVyLlRvKigpOg0KDQoJVGhlIGRvY3Mg
c2F5IGl0IHNob3VsZCBiZSBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24gaW4gdGhlDQoJY2Fz
ZSB3aGVyZSAic3RhcnRJbmRleCBpcyBsZXNzIHRoYW4gemVybyBvciBncmVhdGVyIHRoYW4gdGhl
DQoJbGVuZ3RoIG9mIHZhbHVlIG1pbnVzIDIuIiwgYnV0IHRoZSBtc2NvcmxpYiB0aHJvd3MgYW4N
CglBcmd1bWVudEV4Y2VwdGlvbi4NCg0KKiBHdWlkLkd1aWQoc3RyaW5nKSBjdG9yOg0KDQoJVGhl
IGRvY3VtZW50YXRpb24gc2F5cyB0aGlzIGN0b3IgYWNjZXB0cyAoYW1vbmdzdCBvdGhlcnMpIHRo
ZSBmb3JtYXQNCgkiezB4ZGRkZGRkZGQsMHhkZGRkLDB4ZGRkZCx7MHhkZH0sezB4ZGR9LHsweGRk
fSx7MHhkZH0sezB4ZGR9LHsweGRkfSwNCgl7MHhkZH0sezB4ZGR9fSIuIEFzIGltcGxlbWVudGVk
IGluIG1zY29ybGliLCBob3dldmVyLCBpdCBhY2NlcHRzOg0KCSJ7MHhkZGRkZGRkZCwweGRkZGQs
MHhkZGRkLHsweGRkLDB4ZGQsMHhkZCwweGRkLDB4ZGQsMHhkZCwweGRkLDB4ZGR9Lg0KDQoqIEd1
aWQuVG9TdHJpbmcoc3RyaW5nIGZvcm1hdCk6DQoNCglUaGUgZG9jdW1lbnRhdGlvbiBzcGVjaWZp
ZXMgdGhhdCBpZiB0aGUgZm9ybWF0IGlzIHRoZSBlbXB0eQ0KCXN0cmluZyBvciBudWxsLCB0aGlz
IGlzIGVxdWl2YWxhbnQgdG8gYSBmb3JtYXQgIk4iLiBJbg0KCW1zY29ybGliLCB0aGUgZm9ybWF0
ICJEIiBpcyB0YWtlbiBoZXJlLg0KDQoqIFN0cmluZy5Db21wYXJlIChTdHJpbmcsIEludDMyLCBT
dHJpbmcsIEludDMyLCBJbnQzMik6DQoNCglUaGUgZG9jdW1lbnRhdGlvbiBpcyBhIGJpdCBjb25m
dXNpbmcuDQoNCglJbiB0aGUgIlJlbWFya3MiIHNlY3Rpb24gaXQgc2F5cw0KDQoJPj4gVGhlIG51
bWJlciBvZiBjaGFyYWN0ZXJzIGNvbXBhcmVkIGlzIHRoZSBsZXNzZXIgb2YgdGhlIGxlbmd0aCBv
Zg0KCSAgIHN0ckEgbGVzcyBpbmRleEEsIHRoZSBsZW5ndGggb2Ygc3RyQiBsZXNzIGluZGV4Qiwg
YW5kIGxlbmd0aC4NCgkNCglJbiB0aGUgIkV4Y2VwdGlvbiIgc2VjdGlvbiBpdCBzYXlzIGEgY29u
ZGl0aW9uIGZvciB0aGUNCglBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24NCgkNCgk+PiBUaGUg
c3VtIG9mIGluZGV4QSBhbmQgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiBzdHJBLiBMZW5ndGguIA0K
CT4+IC1vci0NCgk+PiBUaGUgc3VtIG9mIGluZGV4QiBhbmQgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhh
biBzdHJCLiBMZW5ndGguDQoJPj4gLW9yLQ0KCT4+IGluZGV4QSwgaW5kZXhCLCBvciBsZW5ndGgg
aXMgbmVnYXRpdmUuDQoJDQoJVGhlIGxhdHRlciBpbXBsaWVzIHRoYXQgQ29tcGFyZSAoImFiIiwg
MCwgImFiY2RlZiIsIDAsIDMpIHdpbGwNCgl0aHJvdyBhbiBleGNlcHRpb24gLSBidXQgdGhlICJS
ZW1hcmtzIiBzZWN0aW9uIGltcGxpZXMgdGhhdCBpdCB3aWxsDQoJbm90LiBCb3RoIG1zY29ybGli
LmRsbCBhbmQgb3VyIGNsYXNzIGxpYnJhcmllcyBiZWhhdmUgYWNjb3JkaW5nIHRvDQoJdGhlICJS
ZW1hcmtzIiBzZWN0aW9uLg0KDQoqIFR5cGVCdWlsZGVyLkdldEludGVyZmFjZXMNCg0KCVRoaXMg
bWV0aG9kIGRvZXMgbm90IHJldHVybiBhbGwgdGhlIGludGVyZmFjZXMgYXMgZG9jdW1lbnRlZCwN
CglpdCBvbmx5IHJldHVybnMgdGhlIGludGVyZmFjZXMgdGhhdCBhcmUgaW1wbGVtZW50ZWQgYnkg
dGhpcw0KCWNsYXNzLCBidXQgbm90IHRoZSBpbnRlcmZhY2VzIHRoYXQgYXJlIGV4cG9zZWQgYnkg
dGhlIHBhcmVudA0KCWNsYXNzZXMNCg0KKiBBcnJheS5Db3B5VG8gKEFycmF5LCBpbnQpLg0KDQoJ
QWNjb3JkaW5nIHRvIHRoZSBkb2N1bWVudGF0aW9uLCBhbiBBcmd1bWVudEV4Y2VwdGlvbiBpcyB0
aHJvd24NCglpZiBlaXRoZXIgImluZGV4IGlzIGVxdWFsIHRvIG9yIGxhcmdlciB0aGFuIHRoZSBz
aXplIG9mIHRoZQ0KCWFycmF5IiBvciAidGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgc291
cmNlIGFycmF5IGlzDQoJZ3JlYXRlciB0aGFuIHRoZSBhdmFpbGFibGUgc3BhY2UgZnJvbSBpbmRl
eCB0byB0aGUgZW5kIG9mIHRoZQ0KCWRlc3RpbmF0aW9uIGFycmF5Ii4NCgkNCglUaGUgZmlyc3Qg
Y29uZGl0aW9uIGlzIHdyb25nLCBhbiBleGNlcHRpb24gaXMgbm90IHRocm93biBpZg0KCWluZGV4
IGlzIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgYXJyYXksIGJ1dCB0aGUgc291cmNlIGFycmF5DQoJ
Y29udGFpbnMgemVybyBlbGVtZW50czoNCgkNCgkgICBpbnRbXSBzcmMgPSBuZXcgaW50IFswXTsN
CgkgICBpbnRbXSBkZXN0ID0gbmV3IGludCBbMF07DQoJICAgc3JjLkNvcHlUbyAoZGVzdCwgMCkN
Cg0KKiBBc3NlbWJseS5Mb2FkIChzdHJpbmcpDQoNCglUaGUgZG9jdW1lbnRhdGlvbiBzdGF0ZXMg
dGhhdCB0aGUgYXJndW1lbnQgaXMgdGhlICdkaXNwbGF5IG5hbWUnDQoJb2YgYW4gYXNzZW1ibHkg
KGVnICdTeXN0ZW0uRGF0YScpIGJ1dCBzaW5jZSB2MSB0aGlzIG1ldGhvZCB3aWxsDQoJb25seSBz
dWNjZXNzZnVsbHkgbG9hZCBhbiBhc3NlbWJseSBpZiBhIGZ1bGwgcmVmZXJlbmNlIGlzIGdpdmVu
Lg0KCVRoZSBkb2NzIGV2ZW4gZ2l2ZSB0aGUgZm9sbG93aW5nIGV4YW1wbGU6DQoJCQ0KCQlBc3Nl
bWJseSBTYW1wbGVBc3NlbWJseTsNCgkJLy8gTG9hZCB0aGUgYXNzZW1ibHkgYnkgcHJvdmlkaW5n
IHRoZSB0eXBlIG5hbWUuDQoJCVNhbXBsZUFzc2VtYmx5ID0gQXNzZW1ibHkuTG9hZCgiU3lzdGVt
LkRhdGEiKTsNCg0KCXdoaWNoIGZhaWxzIHdpdGggYSBGaWxlTm90Rm91bmRFeGNlcHRpb24uIEFw
cGFyZW50bHkgdGhlIG1ldGhvZA0KCXRvIHVzZSBmb3IgbG9hZGluZyBhbiBhc3NlbWJseSBnaXZl
biBhIGRpc3BsYXkgbmFtZSBpcw0KCUFzc2VtYmx5LkxvYWRXaXRoUGFydGlhbE5hbWUgKHN0cmlu
ZykuDQoNCiogU29ydGVkTGlzdC5DbGVhciAoKQ0KCVRoZSBkb2N1bWVudGF0aW9uIHN0YXRlcyB0
aGF0IHRoZSBDbGVhcigpIHdpbGwgbGVhdmUgdGhlIENhcGFjaXR5DQoJb2YgdGhlIFNvcnRlZExp
c3QgdW5jaGFuZ2VkLCBidXQgaXQgYWN0dWFsbHkgcmVzZXRzIGl0IHRvIHRoZSBpbml0aWFsDQoJ
ZGVmYXVsdCB2YWx1ZSBvZiAxNi4NCg==