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==