Make Minecraft in Python

"Cabal Owen" <[email protected]> Fri, 02 Dec 2022 05:04:26 -0000
Newsgroups gmane.comp.python.education
Message-ID <[email protected]>
QmVmb3JlIGxlYXJuaW5nLCBob3cgdG8gTWFrZSBNaW5lY3JhZnQgaW4gUHl0aG9uLCBsZXTigJlz
IHNlZSB3aGF0IGlzIE1pbmVjcmFmdCBHYW1lLg0KDQpNaW5lY3JhZnQgaXMgYSBwb3B1bGFyIHZp
ZGVvIGdhbWUgdGhhdCBpcyBlbmpveWVkIGJ5IG1hbnkgZW50aHVzaWFzdHMuIEl0IGlzIGEgM0Qg
YmxvY2sgZ2FtZSBpbiB3aGljaCBwbGF5ZXJzIG1heSBpbnRlcmFjdCB3aXRoIGFuZCBtYW5pcHVs
YXRlIHRoZSBlbnZpcm9ubWVudC4gSXQgYWxzbyBoYXMgYSBzdG9yeSBtb2RlIGFuZCBpcyBhbiBh
ZHZlbnR1cmUgZ2FtZS4NCg0KTWluZWNyYWZ0IGlzIGEgdm94ZWwtYmFzZWQgZ2FtZS4gQW5kIHdo
YXQgdGhpcyB0cnVseSBpbXBsaWVzIGlzIHRoYXQgZXZlcnkgc2luZ2xlIGJsb2NrIGluIE1pbmVj
cmFmdCBpcyBhIHZveGVsLiBTbyB0aGVzZSBhcmUgdGhlIHRoaW5ncyB3ZSBtdXN0IG1ha2Ugb3Vy
c2VsdmVzLiBTbyBsZXTigJlzIGdldCByaWdodCB0byB3b3JrIG9uIG91ciBjb2RpbmcuDQoNClN0
ZXAgMS4gTW9kdWxlcyBhbmQgbGlicmFyaWVzIGZvciBNYWtlIE1pbmVjcmFmdCBpbiBQeXRob24N
ClRvIG1ha2UgdGhpcyBNaW5lY3JhZnQgZ2FtZSBpbiBQeXRob24sIHdlIHdpbGwgdXRpbGl6ZSB0
aGUgdXJzaW5hIFB5dGhvbiBtb2R1bGUuIEl0IGlzIGEgUHl0aG9uIGNyb3NzLXBsYXRmb3JtIGdh
bWUgY3JlYXRpb24gcGFja2FnZSBzaW1pbGFyIHRvIFB5R2FtZS4NCg0KVG8gaW5zdGFsbCB0aGlz
IGxpYnJhcnksIHN0YXJ0IGEgdGVybWluYWwgb3IgY29tbWFuZCBwcm9tcHQgaW4gdGhlIHByb2pl
Y3QgZm9sZGVyIGFuZCBwYXN0ZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQuDQoNCnBpcCBpbnN0YWxs
IHVyc2luYQ0KU3RlcCAyLiBpbXBvcnRpbmcgbGlicmFyeQ0KSW1wb3J0IHRoZSBVcnNpbmEgRW5n
aW5lIGFuZCBhbGwgdGhlIFRleHR1cmVzIHRoYXQgd2Ugd2lsbCByZXF1aXJlIGluIHRoZSBmdXR1
cmUuDQoNCmZyb20gdXJzaW5hIGltcG9ydCAqDQpmcm9tIHVyc2luYS5wcmVmYWJzLmZpcnN0X3Bl
cnNvbl9jb250cm9sbGVyIGltcG9ydCBGaXJzdFBlcnNvbkNvbnRyb2xsZXINCmFwcCA9IFVyc2lu
YSgpDQpncmFzc190ZXh0dXJlID0gbG9hZF90ZXh0dXJlKCdhc3NldHMvZ3Jhc3NfYmxvY2sucG5n
JykNCnN0b25lX3RleHR1cmUgPSBsb2FkX3RleHR1cmUoJ2Fzc2V0cy9zdG9uZV9ibG9jay5wbmcn
KQ0KYnJpY2tfdGV4dHVyZSA9IGxvYWRfdGV4dHVyZSgnYXNzZXRzL2JyaWNrX2Jsb2NrLnBuZycp
DQpkaXJ0X3RleHR1cmUgID0gbG9hZF90ZXh0dXJlKCdhc3NldHMvZGlydF9ibG9jay5wbmcnKQ0K
c2t5X3RleHR1cmUgICA9IGxvYWRfdGV4dHVyZSgnYXNzZXRzL3NreWJveC5wbmcnKQ0KYXJtX3Rl
eHR1cmUgICA9IGxvYWRfdGV4dHVyZSgnYXNzZXRzL2FybV90ZXh0dXJlLnBuZycpDQpwdW5jaF9z
b3VuZCAgID0gQXVkaW8oJ2Fzc2V0cy9wdW5jaF9zb3VuZCcsbG9vcCA9IEZhbHNlLCBhdXRvcGxh
eSA9IEZhbHNlKQ0KYmxvY2tfcGljayA9IDENClRvIGxvYWQgdGhlIHRleHR1cmVzIGFuZCBibG9j
ayB5b3UgbmVlZCB0byBkb3dubG9hZCB0aGUgQXNzZXRzIGZvbGRlciBhbmQgcGFzdGUgaXQgd2hl
cmUgeW91ciBNaW5lY3JhZnQgY29kZSBQeXRob24gZmlsZSBpcyBzdG9yZWQuDQoNCk5vdyB0aGVy
ZSBhcmUgYSBmZXcgdGhpbmdzIHdlIG5lZWQgdG8gZG8gdG8gbWFrZSB0aGlzIGFsbCB3b3JrLCBh
bmQgbGV04oCZcyBzdGFydCBieSBtYWtpbmcgYWN0dWFsIGN1YmVzIHRoYXQgd2UgY2FuIHV0aWxp
emUuIFRoaXMgd2lsbCBiZSB0aGUgbW9zdCBzaWduaWZpY2FudCBtb2RpZmljYXRpb24gdGhhdCB3
ZSBjYW4gZG8uIEl0IHdvdWxkIGFwcGVhciBhcHByb3ByaWF0ZSBpZiB3ZSBhcHBsaWVkIGEgbW9y
ZSBhcHByb3ByaWF0ZSB0ZXh0dXJlIHRvIGl0LiBUbyBkbyB0aGF0IHdlIGNyZWF0ZWQgYSBjb3Vw
bGUgb2YgdGV4dHVyZXMuDQoNClN0ZXAgMy4gTWFraW5nIFZveGVsKEN1YmVzKSBmb3IgTWluZWNy
YWZ0IGluIFB5dGhvbg0KY2xhc3MgVm94ZWwoQnV0dG9uKToNCglkZWYgX19pbml0X18oc2VsZiwg
cG9zaXRpb24gPSAoMCwwLDApLCB0ZXh0dXJlID0gZ3Jhc3NfdGV4dHVyZSk6DQoJCXN1cGVyKCku
X19pbml0X18oDQoJCQlwYXJlbnQgPSBzY2VuZSwNCgkJCXBvc2l0aW9uID0gcG9zaXRpb24sDQoJ
CQltb2RlbCA9ICdhc3NldHMvYmxvY2snLA0KCQkJb3JpZ2luX3kgPSAwLjUsDQoJCQl0ZXh0dXJl
ID0gdGV4dHVyZSwNCgkJCWNvbG9yID0gY29sb3IuY29sb3IoMCwwLHJhbmRvbS51bmlmb3JtKDAu
OSwxKSksDQoJCQlzY2FsZSA9IDAuNSkNClRoZSB0aGlyZCBzdGVwIGlzIHRvIGJ1aWxkIGEgbmV3
IGNsYXNzIGZvciBlYWNoIHZveGVsIHRoYXQgd2Ugd2FudCB0byBjb25zdHJ1Y3QsIHRoZXJlZm9y
ZSB0aGUgY2xhc3MgbmFtZSB3aWxsIGJlIHZveGVsLiBBbmQgaXQgZGVyaXZlcyBmcm9tIHRoZSBi
dXR0b24gY2xhc3MuIFRoZSBiYXNpYyBleHBsYW5hdGlvbiBpcyB0aGF0IGFueXRpbWUgSSBjbGlj
ayBvbiBhIHZveGVsLCBJIHdhbnQgdG8gbWFrZSBhbm90aGVyIHZveGVsIGp1c3QgYWRqYWNlbnQg
dG8gaXQuIFNvIEkgbmVlZCB0byBrbm93IHdoZXJlIGVhY2ggdm94ZWwgaXMgaW4gcmVsYXRpb24g
dG8gd2hpY2ggYnV0dG9uLiBBbmQgaW4gaGVyZSwgd2UgbmVlZCBvdXIgaW5pdCBtZXRob2QgYWdh
aW4gYW5kIG5vdGhpbmcgZWxzZSBmb3IgdGhlIHRpbWUgYmVpbmcsIGFuZCB3ZSBhbHNvIG5lZWQg
dGhlIHN1cGVyIG1ldGhvZCB3aXRoIGFuIHVuZGVyc2NvcmUgdG8gaW5pdC4gQW5kIG5vdyB3ZSBt
dXN0IHN1cHBseSBhIGZldyBwYXJhbWV0ZXJzLCB0aGUgZmlyc3Qgb2Ygd2hpY2ggaXMgcGFyZW50
LCBhcyBzaG93biBhYm92ZS4NCg0KVGhlIG5leHQgc3RhZ2Ugd291bGQgYmUgdG8gZmluZCBhIHBv
c2l0aW9uLCBhbmQgdGhlIGN1cnJlbnQgc3RhdHVzIGlzICgwLDApLiBOZXh0LCBJ4oCZZCB3YW50
IHRvIG1ha2UgYSBtb2RlbCBvZiB3aGF0IHRoZSBvYmplY3Qgd291bGQgbG9vayBsaWtlLiBBbmQg
Zm9yIHRoZSB0aW1lIGJlaW5nLCB0aGlzIG9uZSB3aWxsIGJlIGEgY3ViZSAocGFyYW1ldGVycyks
IGJ1dCB3ZSBtYXkgdXNlIGRpZmZlcmVudCBmb3Jtcy4gVGhlIG5leHQgc3RlcCBpcyB0byBwYXNz
IG9yaWdpbl95IHNvIHRoYXQgdGhlIGhlaWdodCBhbmQgM0Qgc3BhY2Ugb2YgdGhpcyBjdWJlIGFy
ZSBlZmZlY3RpdmVseSAoMC41KSwgYW5kIHRoZSBmaW5hbCBhbmQgbW9zdCBjcnVjaWFsIGl0ZW0g
aXMgdGV4dHVyZSBhbmQgY29sb3IuIEFuZCBib3RoIG9mIHRoZXNlIHRoaW5ncyBtdWx0aXBsaWVk
Lg0KDQpTdGVwIDQuIE1ha2luZyBNaW5lY3JhZnQgQXJlbmENCmZvciB6IGluIHJhbmdlKDIwKToN
Cglmb3IgeCBpbiByYW5nZSgyMCk6DQoJCXZveGVsID0gVm94ZWwocG9zaXRpb24gPSAoeCwwLHop
KQ0KTm93IHRoYXQgd2UgaGF2ZSBldmVyeXRoaW5nLCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIGJ1dHRv
biBmb3IgaXQuIFRoZSBjdWJl4oCZcyBjdXJyZW50IHBvc2l0aW9ucyBhcmUgeCwgeSwgYW5kIHou
ICgwLDAsMCkuIFRvIGNyZWF0ZSBpbmRpdmlkdWFsIHZveGVscywgd2UgbXVzdCBmaXJzdCBjcmVh
dGUgYSBmb3IgbG9vcCBpbiB3aGljaCB0aGUgdm94ZWwgaXMgc2V0LiBBbmQgaWYgeW91IG5lZWQg
dG8gbWFrZSBpdCBiaWdnZXIsIGluY3JlYXNlIDM1IGJ5IDM1LiBPbmUgb2YgdGhlIGN1cnJlbnQg
aXNzdWVzIHdpdGggdGhpcyBnYW1lIGlzIHRoYXQgaWYgeW91IGFkZCB0b28gbWFueSBvZiB0aGVz
ZSBmaWVsZHMsIHRoZSBnYW1lIG1heSBzbG93IGRvd24uIEFzIGEgcmVzdWx0LCB0aGVyZSB3b3Vs
ZCBiZSBhIHNpZ25pZmljYW50IGFtb3VudCBvZiBvcHRpbWl6YXRpb24gd29yayB0byBiZSBkb25l
Lg0KU3RlcCA1LiBDcmVhdGluZyBGaXJzdCBwZXJzb24gQ29udHJvbGxlcihGUEMpDQpmcm9tIHVy
c2luYS5wcmVmYWJzLmZpcnN0X3BlcnNvbl9jb250cm9sbGVyIGltcG9ydCBGaXJzdFBlcnNvbkNv
bnRyb2xsZXINCnBsYXllciA9IEZpcnN0UGVyc29uQ29udHJvbGxlcigpDQpUaGUgcXVlc3Rpb24g
aXMgaG93IHdlIGNhbiBkZXZlbG9wIGEgZmlyc3QtcGVyc29uIGNoYXJhY3RlciBpbiBhbGwgb2Yg
dGhpcy4gYW5kIHVyc2luYSBtYWtlcyB0aGlzIHN1cGVyIHNpbXBsZS4gQmVjYXVzZSBpdCBjb21l
cyB3aXRoIGEgbnVtYmVyIG9mIHByZXNldCBjbGFzc2VzIHRoYXQgd2UgbWF5IHV0aWxpemUgdG8g
Y29uc3RydWN0IGEgZmlyc3QtcGVyc29uIGNoYXJhY3Rlci4gV2UgZG9u4oCZdCByZWFsbHkgaGF2
ZSB0byBkbyBhbnl0aGluZyBhYm91dCBpdC4gQW5kIHJlYWxseSwgYWxsIHdlIGhhdmUgdG8gZG8g
aXMgaW1wb3J0IHNvbWV0aGluZyBlbHNlIGZpcnN0LCB3aGljaCBpcyBmcm9tIHVyc2luYS4gcHJl
ZmFicy5maXJzdF9wZXJzb25fIGNvbnRyb2xsZXIuIFRoaXMgaXMgbm90IGJ5IGRlZmF1bHQgaW1w
b3J0ZWQgaW50byBPY2VhbmEsIHNvIHdlIGhhdmUgdG8gZG8gaXQgb3Vyc2VsdmVzLCBidXQgb25j
ZSB3ZSBkbyBpdCwgYWxsIHdlIGhhdmUgdG8gZG8gdG8gY3JlYXRlIEZQQyAoRmlyc3QgUGVyc29u
IENoYXJhY3RlcikgaXMgdG8gY3JlYXRlIGEgbmV3IHZhcmlhYmxlIHdoZXJlIHdlIHN0b3JlIGFu
ZCB0aGVuIGNhbGwgRlBDLg0KDQpTdGVwIDYuIE1ha2luZyBJbnRlcmFjdGl2ZSBVSSBmb3IgTWlu
ZWNyYWZ0IFB5dGhvbiBFZGl0aW9uDQpkZWYgaW5wdXQoc2VsZixrZXkpOg0KCWlmIHNlbGYuaG92
ZXJlZDoNCgkJaWYga2V5ID09ICdsZWZ0IG1vdXNlIGRvd24nOg0KCQkJcHVuY2hfc291bmQucGxh
eSgpDQoJCQlpZiBibG9ja19waWNrID09IDE6IHZveGVsID0gVm94ZWwocG9zaXRpb24gPSBzZWxm
LnBvc2l0aW9uICsgbW91c2Uubm9ybWFsLCB0ZXh0dXJlID0gZ3Jhc3NfdGV4dHVyZSkNCgkJCWlm
IGJsb2NrX3BpY2sgPT0gMjogdm94ZWwgPSBWb3hlbChwb3NpdGlvbiA9IHNlbGYucG9zaXRpb24g
KyBtb3VzZS5ub3JtYWwsIHRleHR1cmUgPSBzdG9uZV90ZXh0dXJlKQ0KCQkJaWYgYmxvY2tfcGlj
ayA9PSAzOiB2b3hlbCA9IFZveGVsKHBvc2l0aW9uID0gc2VsZi5wb3NpdGlvbiArIG1vdXNlLm5v
cm1hbCwgdGV4dHVyZSA9IGJyaWNrX3RleHR1cmUpDQoJCQlpZiBibG9ja19waWNrID09IDQ6IHZv
eGVsID0gVm94ZWwocG9zaXRpb24gPSBzZWxmLnBvc2l0aW9uICsgbW91c2Uubm9ybWFsLCB0ZXh0
dXJlID0gZGlydF90ZXh0dXJlKQ0KCQkJaWYga2V5ID09ICdyaWdodCBtb3VzZSBkb3duJzoNCgkJ
CQlwdW5jaF9zb3VuZC5wbGF5KCkNCgkJCQlkZXN0cm95KHNlbGYpDQpXaGF0IHdlIG5lZWQgdG8g
ZmluZCBvdXQgbm93IGlzIGhvdyB0byBtYWtlIHRoaXMgYWxsIG1vcmUgaW50ZXJhY3RpdmUuIFdl
IG11c3QgYWxzbyBjcmVhdGUgYW5kIGRlc3Ryb3kgYmxvY2tzLCB3aGljaCB3aWxsIGJlIHJlYWxs
eSBzaW1wbGUuIEJhc2ljYWxseSBJIGhhdmUgd3JpdHRlbiBzb21lIG9mIHRoZXNlIGNvZGUgb24g
bXkgcHJvamVjdCBodHRwczovL2VudGVycHJpc2UuYWZmbGUuY29tL21vYmlsZS1hcHAtZGV2ZWxv
cG1lbnQgYWxzby4gQmVjYXVzZSB3aGF0IHdlIHdhbnQgdG8gYWNjb21wbGlzaCBpcywgd2hlbiB5
b3UgcHVzaCB0aGUgdm94ZWwgYnV0dG9uLCB3ZSB3YW50IHRvIGNvbnN0cnVjdCBhIG5ldyBibG9j
ayBhdCB0aGF0IGxvY2F0aW9uLiBXZSBkZXZlbG9wIGFuIGlucHV0IGZ1bmN0aW9uIHRvIGRvIHRo
aXMuIE1ha2Ugc29tZSB0cmFuc21pc3Npb25zIGFzIHdlbGwuIEFuZCB0aGVuIG1ha2UgYSB0byBj
aGFuZ2Ugdm94ZWwgZm9yIHZveGVsIHRleHR1cmUNCg0KU3RlcCA3LiBDaGFuZ2luZyBEaWZmZXJl
bnQgVGV4dHVyZXMgZm9yIENvZGluZyBNaW5lY3JhZnQgaW4gUHl0aG9uDQpkZWYgdXBkYXRlKCk6
DQoJZ2xvYmFsIGJsb2NrX3BpY2sNCg0KCWlmIGhlbGRfa2V5c1snbGVmdCBtb3VzZSddIG9yIGhl
bGRfa2V5c1sncmlnaHQgbW91c2UnXToNCgkJaGFuZC5hY3RpdmUoKQ0KCWVsc2U6DQoJCWhhbmQu
cGFzc2l2ZSgpDQoNCglpZiBoZWxkX2tleXNbJzEnXTogYmxvY2tfcGljayA9IDENCglpZiBoZWxk
X2tleXNbJzInXTogYmxvY2tfcGljayA9IDINCglpZiBoZWxkX2tleXNbJzMnXTogYmxvY2tfcGlj
ayA9IDMNCglpZiBoZWxkX2tleXNbJzQnXTogYmxvY2tfcGljayA9IDQNClRvIG1ha2UgTWluZWNy
YWZ0IHdpdGggcHl0aG9uLCB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgY3ViZSB0ZXh0dXJlLCBhbmQg
Zm9yIGNoYW5naW5nIHRoZSBjdWJlIHRleHR1cmUgaGVyZSB3ZSBjcmVhdGVkIGEgbG9vcCBieSBj
bGlja2luZyBvbmUgdG8gZm91ciBrZXlzIHRvIGFsdGVyIHRoZSB2b3hlbCB0ZXh0dXJlIGJ5IExl
ZnQgY2xpY2sgYW5kIGRlc3Ryb3lpbmcgaXQgd2l0aCB0aGUgcmlnaHQga2V5LiBJbiBzaW1wbGUg
d29yZHMuIElmIHdlIHByZXNzIGFueSBvZiB0aGVzZSBidXR0b25zIHRoaXMgYmxvY2sgcGljayBn
ZXRzIGEgZGlmZmVyZW50IG51bWJlci4NCg0KU3RlcCA4LiBDcmVhdGluZyB0aGUgU2t5DQpjbGFz
cyBTa3koRW50aXR5KToNCglkZWYgX19pbml0X18oc2VsZik6DQoJCXN1cGVyKCkuX19pbml0X18o
DQoJCQlwYXJlbnQgPSBzY2VuZSwNCgkJCW1vZGVsID0gJ3NwaGVyZScsDQoJCQl0ZXh0dXJlID0g
c2t5X3RleHR1cmUsDQoJCQlzY2FsZSA9IDE1MCwNCgkJCWRvdWJsZV9zaWRlZCA9IFRydWUpDQpU
aGVyZSBhcmUgdGhyZWUgb3RoZXIgY29tcG9uZW50cyB0aGF0IGNhbiBzaWduaWZpY2FudGx5IGhl
bHAgdG8gY29udmV5IHRoZSBnYW1lLiBUaGUgZmlyc3QgaXMgYSBTa3kgQm94LCB0aGUgc2Vjb25k
IGlzIGEgSGFuZCwgYW5kIHRoZSB0aGlyZCBpcyBub2lzZXMuIEFuZCBsZXQgdXMgdGFrZSB0aGVt
IG9uZSBzdGVwIGF0IGEgdGltZSBpbiBNaW5lY3JhZnQgY29kaW5nIFB5dGhvbi4gVGhlIGZpcnN0
IGlzIGEgc2t5Ym94LCB3aGljaCB3ZSBlbXVsYXRlZCBpbiBvdXIgZ2FtZSBieSBjcmVhdGluZyBh
IGh1Z2Ugc3BoZXJlIHdpdGggYSBza3kgdGV4dHVyZS4gVG8gZG8gdGhpcywgd2Ugd2lsbCBjb25z
dHJ1Y3QgYSBuZXcgY2xhc3MgbmFtZWQgU2t5Lg0KDQpTdGVwIDkuIE1ha2UgYW4gRlBDIEhhbmQN
CmNsYXNzIEhhbmQoRW50aXR5KToNCglkZWYgX19pbml0X18oc2VsZik6DQoJCXN1cGVyKCkuX19p
bml0X18oDQoJCQlwYXJlbnQgPSBjYW1lcmEudWksICMgVGhpcyAzRCBzcGFjZSBmb3IgT3VyIFVJ
IGFuZCAyRCBzcGFjZSBmb3Igb3VyIGNhbWVyYQ0KCQkJbW9kZWwgPSAnYXNzZXRzL2FybScsDQoJ
CQl0ZXh0dXJlID0gYXJtX3RleHR1cmUsDQoJCQlzY2FsZSA9IDAuMiwNCgkJCXJvdGF0aW9uID0g
VmVjMygxNTAsLTEwLDApLCAjdmVjMyBpcyByZXByZXNlbnQgM0Qgc3BhY2UgYW5kIHRoZSBwYXJh
bWV0ZXJzIGFyZSBmb3IgcG9zaXRpb24oeCx5LHopDQoJCQlwb3NpdGlvbiA9IFZlYzIoMC40LC0w
LjYpKSAjdmVjMiBpcyByZXByZXNlbnQgMkQgc3BhY2UgYW5kIHRoZSBwYXJhbWV0ZXJzIGFyZSBm
b3IgcG9zaXRpb24oeCx5LHopDQoNCglkZWYgYWN0aXZlKHNlbGYpOg0KCQlzZWxmLnBvc2l0aW9u
ID0gVmVjMigwLjMsLTAuNSkNCg0KCWRlZiBwYXNzaXZlKHNlbGYpOg0KCQlzZWxmLnBvc2l0aW9u
ID0gVmVjMigwLjQsLTAuNikNCk5vdyB0aGUgbmV4dCB0aGluZyB3ZSB3aWxsIGdvaW5nIHRvIG5l
ZWQgaXMgYSBoYW5kIGFuZCB0aGlzIG9uZSBpcyBwdXJlbHkgZGVjb3JhdGl2ZS4gSXQgZG9lcyBu
b3QgZG8gYW55dGhpbmcgYmVzaWRlcyBzaW11bGF0aW5nIGhhdmluZyBhIGhhbmQgaXTigJlzIGEg
c3RyYWlnaHRmb3J3YXJkIHRoaW5nIGJ5IGNyZWF0aW5nIGEgY2xhc3MgY2FsbGVkIGhhbmQsIHRo
aXMgb25lIGlzIGFsc28gZ29pbmcgdG8gYmUgYW4gZW50aXR5Lg0KDQpDb21wbGV0ZSBjb2RlIHRv
IE1ha2UgTWluZWNyYWZ0IEdhbWUgaW4gUHl0aG9uDQrigKjigKgNCmZyb20gdXJzaW5hIGltcG9y
dCAqDQpmcm9tIHVyc2luYS5wcmVmYWJzLmZpcnN0X3BlcnNvbl9jb250cm9sbGVyIGltcG9ydCBG
aXJzdFBlcnNvbkNvbnRyb2xsZXINCg0KYXBwID0gVXJzaW5hKCkNCmdyYXNzX3RleHR1cmUgPSBs
b2FkX3RleHR1cmUoJ2Fzc2V0cy9ncmFzc19ibG9jay5wbmcnKQ0Kc3RvbmVfdGV4dHVyZSA9IGxv
YWRfdGV4dHVyZSgnYXNzZXRzL3N0b25lX2Jsb2NrLnBuZycpDQpicmlja190ZXh0dXJlID0gbG9h
ZF90ZXh0dXJlKCdhc3NldHMvYnJpY2tfYmxvY2sucG5nJykNCmRpcnRfdGV4dHVyZSAgPSBsb2Fk
X3RleHR1cmUoJ2Fzc2V0cy9kaXJ0X2Jsb2NrLnBuZycpDQpza3lfdGV4dHVyZSAgID0gbG9hZF90
ZXh0dXJlKCdhc3NldHMvc2t5Ym94LnBuZycpDQphcm1fdGV4dHVyZSAgID0gbG9hZF90ZXh0dXJl
KCdhc3NldHMvYXJtX3RleHR1cmUucG5nJykNCnB1bmNoX3NvdW5kICAgPSBBdWRpbygnYXNzZXRz
L3B1bmNoX3NvdW5kJyxsb29wID0gRmFsc2UsIGF1dG9wbGF5ID0gRmFsc2UpDQpibG9ja19waWNr
ID0gMQ0KDQp3aW5kb3cuZnBzX2NvdW50ZXIuZW5hYmxlZCA9IEZhbHNlICNUbyBEaXNhYmxlIHRo
ZSBGUFMgQ291bnRlciANCndpbmRvdy5leGl0X2J1dHRvbi52aXNpYmxlID0gRmFsc2UgI1RvIFJl
bW92ZSB0aGUgZXhpdChjbG9zZSkgQnV0dG9uDQoNCmRlZiB1cGRhdGUoKToNCglnbG9iYWwgYmxv
Y2tfcGljaw0KDQoJaWYgaGVsZF9rZXlzWydsZWZ0IG1vdXNlJ10gb3IgaGVsZF9rZXlzWydyaWdo
dCBtb3VzZSddOg0KCQloYW5kLmFjdGl2ZSgpDQoJZWxzZToNCgkJaGFuZC5wYXNzaXZlKCkNCg0K
CWlmIGhlbGRfa2V5c1snMSddOiBibG9ja19waWNrID0gMQ0KCWlmIGhlbGRfa2V5c1snMiddOiBi
bG9ja19waWNrID0gMg0KCWlmIGhlbGRfa2V5c1snMyddOiBibG9ja19waWNrID0gMw0KCWlmIGhl
bGRfa2V5c1snNCddOiBibG9ja19waWNrID0gNA0KDQpjbGFzcyBWb3hlbChCdXR0b24pOg0KCWRl
ZiBfX2luaXRfXyhzZWxmLCBwb3NpdGlvbiA9ICgwLDAsMCksIHRleHR1cmUgPSBncmFzc190ZXh0
dXJlKToNCgkJc3VwZXIoKS5fX2luaXRfXygNCgkJCXBhcmVudCA9IHNjZW5lLA0KCQkJcG9zaXRp
b24gPSBwb3NpdGlvbiwNCgkJCW1vZGVsID0gJ2Fzc2V0cy9ibG9jaycsDQoJCQlvcmlnaW5feSA9
IDAuNSwNCgkJCXRleHR1cmUgPSB0ZXh0dXJlLA0KCQkJY29sb3IgPSBjb2xvci5jb2xvcigwLDAs
cmFuZG9tLnVuaWZvcm0oMC45LDEpKSwNCgkJCXNjYWxlID0gMC41KQ0KDQoJZGVmIGlucHV0KHNl
bGYsa2V5KToNCgkJaWYgc2VsZi5ob3ZlcmVkOg0KCQkJaWYga2V5ID09ICdsZWZ0IG1vdXNlIGRv
d24nOg0KCQkJCXB1bmNoX3NvdW5kLnBsYXkoKQ0KCQkJCWlmIGJsb2NrX3BpY2sgPT0gMTogdm94
ZWwgPSBWb3hlbChwb3NpdGlvbiA9IHNlbGYucG9zaXRpb24gKyBtb3VzZS5ub3JtYWwsIHRleHR1
cmUgPSBncmFzc190ZXh0dXJlKQ0KCQkJCWlmIGJsb2NrX3BpY2sgPT0gMjogdm94ZWwgPSBWb3hl
bChwb3NpdGlvbiA9IHNlbGYucG9zaXRpb24gKyBtb3VzZS5ub3JtYWwsIHRleHR1cmUgPSBzdG9u
ZV90ZXh0dXJlKQ0KCQkJCWlmIGJsb2NrX3BpY2sgPT0gMzogdm94ZWwgPSBWb3hlbChwb3NpdGlv
biA9IHNlbGYucG9zaXRpb24gKyBtb3VzZS5ub3JtYWwsIHRleHR1cmUgPSBicmlja190ZXh0dXJl
KQ0KCQkJCWlmIGJsb2NrX3BpY2sgPT0gNDogdm94ZWwgPSBWb3hlbChwb3NpdGlvbiA9IHNlbGYu
cG9zaXRpb24gKyBtb3VzZS5ub3JtYWwsIHRleHR1cmUgPSBkaXJ0X3RleHR1cmUpDQoNCgkJCWlm
IGtleSA9PSAncmlnaHQgbW91c2UgZG93bic6DQoJCQkJcHVuY2hfc291bmQucGxheSgpDQoJCQkJ
ZGVzdHJveShzZWxmKQ0KDQpjbGFzcyBTa3koRW50aXR5KToNCglkZWYgX19pbml0X18oc2VsZik6
DQoJCXN1cGVyKCkuX19pbml0X18oDQoJCQlwYXJlbnQgPSBzY2VuZSwNCgkJCW1vZGVsID0gJ3Nw
aGVyZScsDQoJCQl0ZXh0dXJlID0gc2t5X3RleHR1cmUsDQoJCQlzY2FsZSA9IDE1MCwNCgkJCWRv
dWJsZV9zaWRlZCA9IFRydWUpDQoNCmNsYXNzIEhhbmQoRW50aXR5KToNCglkZWYgX19pbml0X18o
c2VsZik6DQoJCXN1cGVyKCkuX19pbml0X18oDQoJCQlwYXJlbnQgPSBjYW1lcmEudWksDQoJCQlt
b2RlbCA9ICdhc3NldHMvYXJtJywNCgkJCXRleHR1cmUgPSBhcm1fdGV4dHVyZSwNCgkJCXNjYWxl
ID0gMC4yLA0KCQkJcm90YXRpb24gPSBWZWMzKDE1MCwtMTAsMCksDQoJCQlwb3NpdGlvbiA9IFZl
YzIoMC40LC0wLjYpKQ0KDQoJZGVmIGFjdGl2ZShzZWxmKToNCgkJc2VsZi5wb3NpdGlvbiA9IFZl
YzIoMC4zLC0wLjUpDQoNCglkZWYgcGFzc2l2ZShzZWxmKToNCgkJc2VsZi5wb3NpdGlvbiA9IFZl
YzIoMC40LC0wLjYpDQoNCmZvciB6IGluIHJhbmdlKDIwKToNCglmb3IgeCBpbiByYW5nZSgyMCk6
IA0KCQl2b3hlbCA9IFZveGVsKHBvc2l0aW9uID0gKHgsMCx6KSkNCg0KcGxheWVyID0gRmlyc3RQ
ZXJzb25Db250cm9sbGVyKCkNCnNreSA9IFNreSgpDQpoYW5kID0gSGFuZCgpDQoNCmFwcC5ydW4o
KQ0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KRWR1LXNp
ZyBtYWlsaW5nIGxpc3QgLS0gZWR1LXNpZ0BweXRob24ub3JnClRvIHVuc3Vic2NyaWJlIHNlbmQg
YW4gZW1haWwgdG8gZWR1LXNpZy1sZWF2ZUBweXRob24ub3JnCmh0dHBzOi8vbWFpbC5weXRob24u
b3JnL21haWxtYW4zL2xpc3RzL2VkdS1zaWcucHl0aG9uLm9yZy8KTWVtYmVyIGFkZHJlc3M6IHB5
dGhvbi1lZHUtc2lnQG0uZ21hbmUtbXgub3JnCg==