From mboxrd@z Thu Jan 1 00:00:00 1970 From: andrey mirtchovski To: 9fans@cse.psu.edu Message-ID: <20020816014527.O44825-200000@fbsd.acl.lanl.gov> MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="0-174873200-1029484758=:44825" Subject: [9fans] draw() question Date: Fri, 16 Aug 2002 01:59:18 -0600 Topicbox-Message-UUID: ddfa6c2e-eaca-11e9-9e20-41e7f4b1d025 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info. --0-174873200-1029484758=:44825 Content-Type: TEXT/PLAIN; charset=US-ASCII hi, i'm stuck trying to do the following with the already existing plan9 functions from draw.h: in short, i want to do a draw() to an image using only a specific rectangle in the source image, i.e. a call to draw which puts at dst(x, y) the rectangle Rect(x1, y1, x2, y2) from src.. so far i can clumsily simulate that by setting src's clipr to the wanted rectangle and then aligning the source so that src->clipr.min is at (x, y) in the draw() operation. somehow, though, i don't think this is the easiest way :) i'm sure the answer is very simple, andrey ps: i'm attaching maze.c for your enjoyment, it'll probably appear on the xscreensaver ports site in a few days... --0-174873200-1029484758=:44825 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="maze.c" Content-Transfer-Encoding: BASE64 Content-ID: <20020816015918.T44825@fbsd.acl.lanl.gov> Content-Description: Content-Disposition: attachment; filename="maze.c" LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogWyBtYXpl IF0gLi4uDQogKg0KICogbW9kaWZpZWQ6ICBbIDEtMDQtMDAgXSAgSm9oYW5u ZXMgS2V1a2VsYWFyIDxqb2hhbm5lc0BuYWRhLmt0aC5zZT4NCiAqICAgICAg ICAgICAgICBBZGRlZCAtaWdub3JhbnQgb3B0aW9uIChub3QgdGhlIGRlZmF1 bHQpIHRvIHJlbW92ZSBrbm93bGVnZQ0KICogICAgICAgICAgICAgIG9mIHRo ZSBkaXJlY3Rpb24gaW4gd2hpY2ggdGhlIGV4aXQgbGllcy4NCiAqDQogKiBt b2RpZmllZDogIFsgNi0yOC05OCBdICBaYWNrIFdlaW5iZXJnIDx6YWNrQHJh YmkucGh5cy5jb2x1bWJpYS5lZHU+DQogKg0KICogICAgICAgICAgICAgIE1h ZGUgdGhlIG1hemUtc29sdmVyIHNvbWV3aGF0IG1vcmUgaW50ZWxsaWdlbnQu ICBUaGVyZSBhcmUNCiAqICAgICAgICAgICAgICB0aHJlZSBvcHRpbWl6YXRp b25zOg0KICoNCiAqICAgICAgICAgICAgICAtIFN0cmFpZ2h0LWxpbmUgbG9v a2FoZWFkOiB0aGUgc29sdmVyIGRvZXMgbm90IGVudGVyIGRlYWQtZW5kDQog KiAgICAgICAgICAgICAgICBjb3JyaWRvcnMuICBUaGlzIGlzIGEgd2luIHdp dGggYWxsIG1hemUgZ2VuZXJhdG9ycy4NCiAqDQogKiAgICAgICAgICAgICAg LSBGaXJzdCBvcmRlciBkaXJlY3Rpb24gY2hvaWNlOiB0aGUgc29sdmVyIGtu b3dzIHdoZXJlIHRoZQ0KICogICAgICAgICAgICAgICAgZXhpdCBpcyBpbiBy ZWxhdGlvbiB0byBpdHNlbGYsIGFuZCB3aWxsIHRyeSBwYXRocyBsZWFkaW5n IGluDQogKiAgICAgICAgICAgICAgICB0aGF0IGRpcmVjdGlvbiBmaXJzdC4g VGhpcyBpcyBhIG1ham9yIHdpbiBvbiBtYXplIGdlbmVyYXRvciAxDQogKiAg ICAgICAgICAgICAgICB3aGljaCB0ZW5kcyB0byBvZmZlciBkaXJlY3Qgcm91 dGVzIHRvIHRoZSBleGl0Lg0KICoNCiAqICAgICAgICAgICAgICAtIERlYWQg cmVnaW9uIGVsaW1pbmF0aW9uOiB0aGUgc29sdmVyIGFscmVhZHkgaGFzIGEg bWFwIG9mDQogKiAgICAgICAgICAgICAgICBhbGwgc3F1YXJlcyB2aXNpdGVk LiAgV2hlbmV2ZXIgaXQgc3RhcnRzIHRvIGJhY2t0cmFjaywgaXQNCiAqICAg ICAgICAgICAgICAgIGNvbnN1bHRzIHRoaXMgbWFwIGFuZCBtYXJrcyBvZmYg YWxsIHNxdWFyZXMgdGhhdCBjYW5ub3QgYmUNCiAqICAgICAgICAgICAgICAg IHJlYWNoZWQgZnJvbSB0aGUgZXhpdCB3aXRob3V0IGNyb3NzaW5nIGEgc3F1 YXJlIGFscmVhZHkNCiAqICAgICAgICAgICAgICAgIHZpc2l0ZWQuICBUaG9z ZSBzcXVhcmVzIGNhbiBuZXZlciBjb250cmlidXRlIHRvIHRoZSBwYXRoIHRv DQogKiAgICAgICAgICAgICAgICB0aGUgZXhpdCwgc28gaXQgZG9lc24ndCBi b3RoZXIgY2hlY2tpbmcgdGhlbS4gIFRoaXMgaGVscHMgYQ0KICogICAgICAg ICAgICAgICAgbG90IHdpdGggbWF6ZSBnZW5lcmF0b3IgMiBhbmQgc29tZXdo YXQgbGVzcyB3aXRoIGdlbmVyYXRvciAxLg0KICoNCiAqICAgICAgICAgICAg ICBGdXJ0aGVyIGltcHJvdmVtZW50cyB3b3VsZCByZXF1aXJlIGtub3dsZWRn ZSBvZiB0aGUgd2FsbCBtYXANCiAqICAgICAgICAgICAgICBhcyB3ZWxsIGFz IHRoZSBwb3NpdGlvbiBvZiB0aGUgZXhpdCBhbmQgdGhlIHNxdWFyZXMgdmlz aXRlZC4NCiAqICAgICAgICAgICAgICBJIHdvdWxkIGNvbnNpZGVyIHRoYXQg dG8gYmUgY2hlYXRpbmcuICBHZW5lcmF0b3IgMCBtYWtlcw0KICogICAgICAg ICAgICAgIG1hemVzIHdoaWNoIGFyZSByZW1hcmthYmx5IGRpZmZpY3VsdCB0 byBzb2x2ZSBtZWNoYW5pY2FsbHkgLS0NCiAqICAgICAgICAgICAgICBldmVu IHdpdGggdGhlc2Ugb3B0aW1pemF0aW9ucyB0aGUgc29sdmVyIGdlbmVyYWxs eSBtdXN0IHZpc2l0DQogKiAgICAgICAgICAgICAgYXQgbGVhc3QgdHdvLXRo aXJkcyBvZiB0aGUgc3F1YXJlcy4gIFRoaXMgaXMgcGFydGlhbGx5DQogKiAg ICAgICAgICAgICAgYmVjYXVzZSBnZW5lcmF0b3IgMCdzIG1hemVzIGhhdmUg bG9uZ2VyIHBhdGhzIHRvIHRoZSBleGl0Lg0KICoNCiAqIG1vZGlmaWVkOiAg WyA0LTEwLTk3IF0gIEpvaGFubmVzIEtldWtlbGFhciA8am9oYW5uZXNAbmFk YS5rdGguc2U+DQogKiAgICAgICAgICAgICAgQWRkZWQgbXVsdGlwbGUgbWF6 ZSBjcmVhdG9ycy4gUm9idXN0aWZpZWQgc29sdmVyLg0KICogICAgICAgICAg ICAgIEFkZGVkIGJyaWRnZSBvcHRpb24uDQogKiBtb2RpZmllZDogIFsgOC0x MS05NSBdIEVkIEphbWVzIDxqYW1lc0BtbWwubW1jLmNvbT4NCiAqICAgICAg ICAgICAgICBhZGRlZCBmaWxsIG9mIGRlYWQtZW5kIGJveCB0byBzb2x2ZV9t YXplIHdoaWxlIGxvb3AuDQogKiBtb2RpZmllZDogIFsgMy03LTkzIF0gIEph bWllIFphd2luc2tpIDxqd3pAand6Lm9yZz4NCiAqCQlhZGRlZCB0aGUgWFJv Z2VyIGxvZ28sIGNsZWFuZWQgdXAgcmVzb3VyY2VzLCBtYWRlDQogKgkJZ3Jp ZCBzaXplIGEgcGFyYW1ldGVyLg0KICogbW9kaWZpZWQ6ICBbIDMtMy05MyBd ICBKaW0gUmFuZGVsbCA8am1yQG1kZGptci5mYy5ocC5jb20+DQogKgkJQWRk ZWQgdGhlIGNvbG91ciBzdHVmZiBhbmQgaW50ZWdyYXRlZCBpdCB3aXRoIGp3 eidzDQogKgkJc2NyZWVuaGFjayBzdHVmZi4gIFRoZXJlJ3Mgc3RpbGwgc29t ZSB3b3JrIHRoYXQgY291bGQNCiAqCQliZSBkb25lIG9uIHRoaXMsIHBhcnRp Y3VsYXJseSBhbGxvd2luZyBhIHJlc291cmNlIHRvDQogKgkJc3BlY2lmeSBo b3cgYmlnIHRoZSBzcXVhcmVzIGFyZS4NCiAqIG1vZGlmaWVkOiAgWyAxMC00 LTg4IF0gIFJpY2hhcmQgSGVzcyAgICAuLi4hdXVuZXQhY2ltc2hvcCFyaGVz cyAgDQogKiAgICAgICAgICAgICAgWyBSZXZpc2VkIHByaW1hcnkgZXhlY3V0 aW9uIGxvb3Agd2l0aGluIG1haW4oKS4uLg0KICogICAgICAgICAgICAgIFsg RXh0ZW5kZWQgWCBldmVudCBoYW5kbGVyLCBjaGVja19ldmVudHMoKS4uLg0K ICogbW9kaWZpZWQ6ICBbIDEtMjktODggXSAgRGF2ZSBMZW1rZSAgICAgIGxl bWtlQHN1bi5jb20gIA0KICogICAgICAgICAgICAgIFsgSGFja2VkIGZvciBY MTEuLi4NCiAqICAgICAgICAgICAgICBbICBOb3RlIHRoZSB3b3JkICJoYWNr ZWQiIC0tIHRoaXMgaXMgZXh0cmVtZWx5IHVnbHksIGJ1dCBhdCANCiAqICAg ICAgICAgICAgICBbICAgbGVhc3QgaXQgZG9lcyB0aGUgam9iLiAgTk9UIGEg Z29vZCBwcm9ncmFtbWluZyBleGFtcGxlIA0KICogICAgICAgICAgICAgIFsg ICBmb3IgWC4NCiAqIG9yaWdpbmFsOiAgWyA2LzIxLzg1IF0gIE1hcnRpbiBX ZWlzcyAgICBTdW4gTWljcm9zeXN0ZW1zICBbIFN1blZpZXcgXQ0KICoNCiAq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiBDb3B5cmlnaHQg MTk4OCBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIE1vdW50YWluIFZpZXcs IENBLg0KICANCiBBbGwgUmlnaHRzIFJlc2VydmVkDQogIA0KIFBlcm1pc3Np b24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMg c29mdHdhcmUgYW5kIGl0cw0KIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJw b3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgDQogcHJv dmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIg aW4gYWxsIGNvcGllcyBhbmQgdGhhdA0KIGJvdGggdGhhdCBjb3B5cmlnaHQg bm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiAN CiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1l cyBvZiBTdW4gb3IgTUlUIG5vdCBiZQ0KIHVzZWQgaW4gYWR2ZXJ0aXNpbmcg b3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRo ZQ0KIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBw ZXJtaXNzaW9uLiBTdW4gYW5kIE0uSS5ULiANCiBtYWtlIG5vIHJlcHJlc2Vu dGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2Fy ZSBmb3IgDQogYW55IHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIg d2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5Lg0KIA0K IFNVTiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8g VEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HDQogQUxMIElNUExJRUQgV0FSUkFO VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS VElDVUxBUg0KIFBVUlBPU0UuIElOIE5PIEVWRU5UIFNIQUxMIFNVTiBCRSBM SUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVA0KIE9SIENPTlNFUVVF TlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VM VElORyBGUk9NIExPU1MNCiBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hF VEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgDQog T1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJ TiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRQ0KIE9SIFBFUkZPUk1BTkNFIE9G IFRISVMgU09GVFdBUkUuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKiovDQoNCg0KLyogDQogICogcG9ydGVkIHRvIFBsYW4gOSBieSBhbmRy ZXlAbGFubC5nb3YsIDA4LzAyDQogICovDQoNCi8qIHBsYW45LXJlbGF0ZWQg c3R1ZmYgKi8NCiNpbmNsdWRlIDx1Lmg+DQojaW5jbHVkZSA8bGliYy5oPg0K I2luY2x1ZGUgPGRyYXcuaD4NCiNpbmNsdWRlIDxldmVudC5oPg0KDQojZGVm aW5lIE5VTEwgbmlsDQojZGVmaW5lIFhQb2ludCBQb2ludA0KI2RlZmluZSBO UkFORCBucmFuZA0KI2RlZmluZSBMUkFORCBscmFuZA0KI2RlZmluZSByYW5k b20gcmFuZA0KI2RlZmluZSBNQVhSQU5EICgoMjw8MzEpLTEpDQojZGVmaW5l IE1BWChhLCBiKSAoKChhKSA+IChiKSk/KGEpOihiKSkNCiNkZWZpbmUgTUlO KGEsIGIpICgoKGEpIDwgKGIpKT8oYSk6KGIpKQ0KI2RlZmluZSBSQU5EX01B WCBNQVhSQU5EDQojZGVmaW5lIEFCUyBhYnMNCkltYWdlICpjb2xvcnNbMjU2 XTsNCiNkZWZpbmUgTV9QSQlQSQ0KI2RlZmluZSBCb29sIGludA0KI2RlZmlu ZSBUcnVlIDENCiNkZWZpbmUgRmFsc2UgMA0KDQpJbWFnZSAqbGl2ZUNvbG9y LCAqZGVhZENvbG9yLCAqc2tpcENvbG9yLCAqc3Vycm91bmRDb2xvcjsNCg0K SW1hZ2UgKmdsZW5kYTsNCg0KY2hhciAqYnV0dG9uc1tdID0gDQp7DQoJImV4 aXQiLA0KCTANCn07DQoNCk1lbnUgbWVudSA9IA0Kew0KCWJ1dHRvbnMNCn07 DQpNb3VzZSBtOw0KLyogZW5kIG9mIHBsYW45LXJlbGF0ZWQgZGVmaW5lcyAq Lw0KDQoNCiNkZWZpbmUgWFNDUkVFTlNBVkVSX0xPR08NCg0Kc3RhdGljIGlu dCBzb2x2ZV9kZWxheSwgcHJlX3NvbHZlX2RlbGF5LCBwb3N0X3NvbHZlX2Rl bGF5Ow0KDQojZGVmaW5lIE1BWF9NQVpFX1NJWkVfWAk1MDANCiNkZWZpbmUg TUFYX01BWkVfU0laRV9ZCTUwMA0KDQojZGVmaW5lIE1PVkVfTElTVF9TSVpF ICAoTUFYX01BWkVfU0laRV9YICogTUFYX01BWkVfU0laRV9ZKQ0KDQojZGVm aW5lIE5PVF9ERUFECTB4ODAwMA0KI2RlZmluZSBTT0xWRVJfVklTSVQgICAg MHg0MDAwDQojZGVmaW5lIFNUQVJUX1NRVUFSRQkweDIwMDANCiNkZWZpbmUg RU5EX1NRVUFSRQkweDEwMDANCg0KI2RlZmluZSBXQUxMX1RPUAkweDgNCiNk ZWZpbmUgV0FMTF9SSUdIVAkweDQNCiNkZWZpbmUgV0FMTF9CT1RUT00JMHgy DQojZGVmaW5lIFdBTExfTEVGVAkweDENCiNkZWZpbmUgV0FMTF9BTlkJMHhG DQoNCiNkZWZpbmUgRE9PUl9JTl9UT1AJMHg4MDANCiNkZWZpbmUgRE9PUl9J Tl9SSUdIVAkweDQwMA0KI2RlZmluZSBET09SX0lOX0JPVFRPTQkweDIwMA0K I2RlZmluZSBET09SX0lOX0xFRlQJMHgxMDANCiNkZWZpbmUgRE9PUl9JTl9B TlkJMHhGMDANCg0KI2RlZmluZSBET09SX09VVF9UT1AJMHg4MA0KI2RlZmlu ZSBET09SX09VVF9SSUdIVAkweDQwDQojZGVmaW5lIERPT1JfT1VUX0JPVFRP TQkweDIwDQojZGVmaW5lIERPT1JfT1VUX0xFRlQJMHgxMA0KDQoNCiNkZWZp bmUJYm9yZGVyX3ggICAgICAgICgwKQ0KI2RlZmluZQlib3JkZXJfeSAgICAg ICAgKDApDQoNCiNkZWZpbmUJZ2V0X3JhbmRvbSh4KQkocmFuZG9tKCkgJSAo eCkpDQoNCg0Kc3RhdGljIGludCBsb2dvX3gsIGxvZ29feTsNCg0KIyBkZWZp bmUgbG9nb193aWR0aCAgNDgNCiMgZGVmaW5lIGxvZ29faGVpZ2h0IDQ4DQoN CnN0YXRpYyB1bnNpZ25lZCBzaG9ydCBtYXplW01BWF9NQVpFX1NJWkVfWF1b TUFYX01BWkVfU0laRV9ZXTsNCg0Kc3RhdGljIHN0cnVjdCB7DQogIHVuc2ln bmVkIGNoYXIgeDsNCiAgdW5zaWduZWQgY2hhciB5Ow0KICB1bnNpZ25lZCBj aGFyIGRpciwgd2F5czsNCn0gbW92ZV9saXN0W01PVkVfTElTVF9TSVpFXSwg c2F2ZV9wYXRoW01PVkVfTElTVF9TSVpFXSwgcGF0aFtNT1ZFX0xJU1RfU0la RV07DQoNCnN0YXRpYyBpbnQgbWF6ZV9zaXplX3gsIG1hemVfc2l6ZV95Ow0K c3RhdGljIGludCBzcW51bSwgY3VyX3NxX3gsIGN1cl9zcV95LCBwYXRoX2xl bmd0aDsNCnN0YXRpYyBpbnQgc3RhcnRfeCwgc3RhcnRfeSwgc3RhcnRfZGly LCBlbmRfeCwgZW5kX3ksIGVuZF9kaXI7DQpzdGF0aWMgaW50IGdyaWRfd2lk dGgsIGdyaWRfaGVpZ2h0Ow0Kc3RhdGljIGludCBidzsNCg0Kc3RhdGljIGlu dAl4ID0gMCwgeSA9IDAsIHJlc3RhcnQgPSAwLCBzdG9wID0gMCwgc3RhdGUg PSAxLCBtYXhfbGVuZ3RoOw0Kc3RhdGljIGludCAgICAgIHN5bmNfcCwgYnJp ZGdlX3AsIGlnbm9yYW50X3A7DQoNCg0Kc3RhdGljIHZvaWQNCnNldF9tYXpl X3NpemVzIChpbnQgd2lkdGgsIGludCBoZWlnaHQpDQp7DQogIG1hemVfc2l6 ZV94ID0gd2lkdGggLyBncmlkX3dpZHRoOw0KICBtYXplX3NpemVfeSA9IGhl aWdodCAvIGdyaWRfaGVpZ2h0Ow0KfQ0KDQoNCnN0YXRpYyB2b2lkDQppbml0 aWFsaXplX21hemUgKHZvaWQpIC8qIGRyYXcgdGhlIHN1cnJvdW5kaW5nIHdh bGwgYW5kIHN0YXJ0L2VuZCBzcXVhcmVzICovDQp7DQogIHJlZ2lzdGVyIGlu dCBpLCBqLCB3YWxsOw0KICBpbnQgbG9nb3cgPSAxICsgbG9nb193aWR0aCAv IGdyaWRfd2lkdGg7DQogIGludCBsb2dvaCA9IDEgKyBsb2dvX2hlaWdodCAv IGdyaWRfaGVpZ2h0Ow0KICANCiAgLyogaW5pdGlhbGl6ZSBhbGwgc3F1YXJl cyAqLw0KICBmb3IgKCBpPTA7IGk8bWF6ZV9zaXplX3g7IGkrKykgew0KICAg IGZvciAoIGo9MDsgajxtYXplX3NpemVfeTsgaisrKSB7DQogICAgICBtYXpl W2ldW2pdID0gMDsNCiAgICB9DQogIH0NCiAgDQogIC8qIHRvcCB3YWxsICov DQogIGZvciAoIGk9MDsgaTxtYXplX3NpemVfeDsgaSsrICkgew0KICAgIG1h emVbaV1bMF0gfD0gV0FMTF9UT1A7DQogIH0NCiAgDQogIC8qIHJpZ2h0IHdh bGwgKi8NCiAgZm9yICggaj0wOyBqPG1hemVfc2l6ZV95OyBqKysgKSB7DQog ICAgbWF6ZVttYXplX3NpemVfeC0xXVtqXSB8PSBXQUxMX1JJR0hUOw0KICB9 DQogIA0KICAvKiBib3R0b20gd2FsbCAqLw0KICBmb3IgKCBpPTA7IGk8bWF6 ZV9zaXplX3g7IGkrKyApIHsNCiAgICBtYXplW2ldW21hemVfc2l6ZV95LTFd IHw9IFdBTExfQk9UVE9NOw0KICB9DQogIA0KICAvKiBsZWZ0IHdhbGwgKi8N CiAgZm9yICggaj0wOyBqPG1hemVfc2l6ZV95OyBqKysgKSB7DQogICAgbWF6 ZVswXVtqXSB8PSBXQUxMX0xFRlQ7DQogIH0NCiAgDQogIC8qIHNldCBzdGFy dCBzcXVhcmUgKi8NCiAgd2FsbCA9IGdldF9yYW5kb20oNCk7DQogIHN3aXRj aCAod2FsbCkgew0KICBjYXNlIDA6CQ0KICAgIGkgPSBnZXRfcmFuZG9tKG1h emVfc2l6ZV94KTsNCiAgICBqID0gMDsNCiAgICBicmVhazsNCiAgY2FzZSAx OgkNCiAgICBpID0gbWF6ZV9zaXplX3ggLSAxOw0KICAgIGogPSBnZXRfcmFu ZG9tKG1hemVfc2l6ZV95KTsNCiAgICBicmVhazsNCiAgY2FzZSAyOgkNCiAg ICBpID0gZ2V0X3JhbmRvbShtYXplX3NpemVfeCk7DQogICAgaiA9IG1hemVf c2l6ZV95IC0gMTsNCiAgICBicmVhazsNCiAgY2FzZSAzOgkNCiAgICBpID0g MDsNCiAgICBqID0gZ2V0X3JhbmRvbShtYXplX3NpemVfeSk7DQogICAgYnJl YWs7DQogIH0NCiAgbWF6ZVtpXVtqXSB8PSBTVEFSVF9TUVVBUkU7DQogIG1h emVbaV1bal0gfD0gKCBET09SX0lOX1RPUCA+PiB3YWxsICk7DQogIG1hemVb aV1bal0gJj0gfiggV0FMTF9UT1AgPj4gd2FsbCApOw0KICBjdXJfc3FfeCA9 IGk7DQogIGN1cl9zcV95ID0gajsNCiAgc3RhcnRfeCA9IGk7DQogIHN0YXJ0 X3kgPSBqOw0KICBzdGFydF9kaXIgPSB3YWxsOw0KICBzcW51bSA9IDA7DQog IA0KICAvKiBzZXQgZW5kIHNxdWFyZSAqLw0KICB3YWxsID0gKHdhbGwgKyAy KSU0Ow0KICBzd2l0Y2ggKHdhbGwpIHsNCiAgY2FzZSAwOg0KICAgIGkgPSBn ZXRfcmFuZG9tKG1hemVfc2l6ZV94KTsNCiAgICBqID0gMDsNCiAgICBicmVh azsNCiAgY2FzZSAxOg0KICAgIGkgPSBtYXplX3NpemVfeCAtIDE7DQogICAg aiA9IGdldF9yYW5kb20obWF6ZV9zaXplX3kpOw0KICAgIGJyZWFrOw0KICBj YXNlIDI6DQogICAgaSA9IGdldF9yYW5kb20obWF6ZV9zaXplX3gpOw0KICAg IGogPSBtYXplX3NpemVfeSAtIDE7DQogICAgYnJlYWs7DQogIGNhc2UgMzoN CiAgICBpID0gMDsNCiAgICBqID0gZ2V0X3JhbmRvbShtYXplX3NpemVfeSk7 DQogICAgYnJlYWs7DQogIH0NCiAgbWF6ZVtpXVtqXSB8PSBFTkRfU1FVQVJF Ow0KICBtYXplW2ldW2pdIHw9ICggRE9PUl9PVVRfVE9QID4+IHdhbGwgKTsN CiAgbWF6ZVtpXVtqXSAmPSB+KCBXQUxMX1RPUCA+PiB3YWxsICk7DQogIGVu ZF94ID0gaTsNCiAgZW5kX3kgPSBqOw0KICBlbmRfZGlyID0gd2FsbDsNCiAg DQogIC8qIHNldCBsb2dvICovDQogIGlmICgobWF6ZV9zaXplX3gtbG9nb3cg Pj0gNikgJiYgKG1hemVfc2l6ZV95LWxvZ29oID49IDYpKQ0KICAgIHsNCiAg ICAgIC8qIG5vdCBjbG9zZXIgdGhhbiAzIGdyaWQgdW5pdHMgZnJvbSBhIHdh bGwgKi8NCiAgICAgIGxvZ29feCA9IGdldF9yYW5kb20gKG1hemVfc2l6ZV94 IC0gbG9nb3cgLSA1KSArIDM7DQogICAgICBsb2dvX3kgPSBnZXRfcmFuZG9t IChtYXplX3NpemVfeSAtIGxvZ29oIC0gNSkgKyAzOw0KICAgICAgZm9yIChp PTA7IGk8bG9nb3c7IGkrKykNCglmb3IgKGo9MDsgajxsb2dvaDsgaisrKQ0K CSAgbWF6ZVtsb2dvX3ggKyBpXVtsb2dvX3kgKyBqXSB8PSBET09SX0lOX1RP UDsNCiAgICB9DQogIGVsc2UNCiAgICBsb2dvX3kgPSBsb2dvX3ggPSAtMTsN Cn0NCg0Kc3RhdGljIGludCBjaG9vc2VfZG9vciAodm9pZCk7DQpzdGF0aWMg aW50IGJhY2t1cCAodm9pZCk7DQpzdGF0aWMgdm9pZCBkcmF3X3dhbGwgKGlu dCwgaW50LCBpbnQpOw0Kc3RhdGljIHZvaWQgZHJhd19zb2xpZF9zcXVhcmUg KGludCwgaW50LCBpbnQsIEltYWdlKik7DQovKnN0YXRpYyB2b2lkIGVudGVy X3NxdWFyZSAoaW50KTsqLw0Kc3RhdGljIHZvaWQgYnVpbGRfd2FsbCAoaW50 LCBpbnQsIGludCk7DQovKnN0YXRpYyB2b2lkIGJyZWFrX3dhbGwgKGludCwg aW50LCBpbnQpOyovDQoNCnN0YXRpYyB2b2lkIGpvaW5fc2V0cyhpbnQsIGlu dCk7DQoNCi8qIEZvciBzZXRfY3JlYXRlX21hemUuICovDQovKiBUaGUgc2V0 cyB0aGF0IG91ciBzcXVhcmVzIGFyZSBpbi4gKi8NCnN0YXRpYyBpbnQgKnNl dHMgPSAwOw0KLyogVGhlIGBsaXN0JyBvZiBoZWRnZXMuICovDQpzdGF0aWMg aW50ICpoZWRnZXMgPSAwOw0KDQoNCi8qIEluaXRpYWxpc2UgdGhlIHNldHMu ICovDQpzdGF0aWMgdm9pZCANCmluaXRfc2V0cyh2b2lkKQ0Kew0KICBpbnQg aSwgdCwgciwgeCwgeTsNCg0KICBpZihzZXRzKQ0KICAgIGZyZWUoc2V0cyk7 DQogIHNldHMgPSAoaW50ICopbWFsbG9jKG1hemVfc2l6ZV94Km1hemVfc2l6 ZV95KnNpemVvZihpbnQpKTsNCiAgaWYoIXNldHMpDQogICAgYWJvcnQoKTsN CiAgZm9yKGkgPSAwOyBpIDwgbWF6ZV9zaXplX3gqbWF6ZV9zaXplX3k7IGkr KykNCiAgICB7DQogICAgICBzZXRzW2ldID0gaTsNCiAgICB9DQogIA0KICBp ZihoZWRnZXMpDQogICAgZnJlZShoZWRnZXMpOw0KICBoZWRnZXMgPSAoaW50 ICopbWFsbG9jKG1hemVfc2l6ZV94Km1hemVfc2l6ZV95KjIqc2l6ZW9mKGlu dCkpOw0KICBpZighaGVkZ2VzKQ0KICAgIGFib3J0KCk7DQogIGZvcihpID0g MDsgaSA8IG1hemVfc2l6ZV94Km1hemVfc2l6ZV95KjI7IGkrKykNCiAgICB7 DQogICAgICBoZWRnZXNbaV0gPSBpOw0KICAgIH0NCiAgLyogTWFzayBvdXQg b3V0c2lkZSB3YWxscy4gKi8NCiAgZm9yKGkgPSAwOyBpIDwgbWF6ZV9zaXpl X3k7IGkrKykNCiAgICB7DQogICAgICBoZWRnZXNbMiooKG1hemVfc2l6ZV94 KSppK21hemVfc2l6ZV94LTEpKzFdID0gLTE7DQogICAgfQ0KICBmb3IoaSA9 IDA7IGkgPCBtYXplX3NpemVfeDsgaSsrKQ0KICAgIHsNCiAgICAgIGhlZGdl c1syKigobWF6ZV9zaXplX3ktMSkqbWF6ZV9zaXplX3graSldID0gLTE7DQog ICAgfQ0KICAvKiBNYXNrIG91dCBhIHBvc3NpYmxlIGxvZ28uICovDQogIGlm KGxvZ29feCE9LTEpDQogICAgew0KICAgICAgaW50IGxvZ293ID0gMSArIGxv Z29fd2lkdGggLyBncmlkX3dpZHRoOw0KICAgICAgaW50IGxvZ29oID0gMSAr IGxvZ29faGVpZ2h0IC8gZ3JpZF9oZWlnaHQ7DQogICAgICBpbnQgYnJpZGdl X2RpciwgYnJpZGdlX2M7DQoNCiAgICAgIGlmKGJyaWRnZV9wICYmIGxvZ29o Pj0zICYmIGxvZ293Pj0zKQ0KCXsNCgkgIGJyaWRnZV9kaXIgPSAxK3JhbmRv bSgpJTI7DQoJICBpZihicmlkZ2VfZGlyPT0xKQ0KCSAgICB7DQoJICAgICAg YnJpZGdlX2MgPSBsb2dvX3krcmFuZG9tKCklKGxvZ29oLTIpKzE7DQoJICAg IH0NCgkgIGVsc2UNCgkgICAgew0KCSAgICAgIGJyaWRnZV9jID0gbG9nb194 K3JhbmRvbSgpJShsb2dvdy0yKSsxOw0KCSAgICB9DQoJfQ0KICAgICAgZWxz ZQ0KCXsNCgkgIGJyaWRnZV9kaXIgPSAwOw0KCSAgYnJpZGdlX2MgPSAtMTsN Cgl9DQoNCiAgICAgIGZvcih4ID0gbG9nb194OyB4IDwgbG9nb194K2xvZ293 OyB4KyspDQoJZm9yKHkgPSBsb2dvX3k7IHkgPCBsb2dvX3krbG9nb2g7IHkr KykNCgkgIHsNCgkgICAgLyogSSBzaG91bGQgY2hlY2sgZm9yIHRoZSBicmlk Z2UgaGVyZSwgZXhjZXB0IHRoYXQgSSBqb2luIHRoZQ0KICAgICAgICAgICAg ICogYnJpZGdlIHRvZ2V0aGVyIGJlbG93Lg0KICAgICAgICAgICAgICovDQoJ ICAgIGhlZGdlc1syKih4K21hemVfc2l6ZV94KnkpKzFdID0gLTE7DQoJICAg IGhlZGdlc1syKih4K21hemVfc2l6ZV94KnkpXSA9IC0xOw0KCSAgfQ0KICAg ICAgZm9yKHggPSBsb2dvX3g7IHggPCBsb2dvX3grbG9nb3c7IHgrKykNCgl7 DQoJICBpZighKGJyaWRnZV9kaXI9PTIgJiYgeD09YnJpZGdlX2MpKQ0KCSAg ICB7DQoJICAgICAgYnVpbGRfd2FsbCh4LCBsb2dvX3ksIDApOw0KCSAgICAg IGJ1aWxkX3dhbGwoeCwgbG9nb195K2xvZ29oLCAwKTsNCgkgICAgfQ0KCSAg aGVkZ2VzWzIqKHgrbWF6ZV9zaXplX3gqKGxvZ29feS0xKSldID0gLTE7DQoJ ICBpZihicmlkZ2VfZGlyPT0xKQ0KCSAgICB7DQoJICAgICAgYnVpbGRfd2Fs bCh4LCBicmlkZ2VfYywgMCk7DQoJICAgICAgYnVpbGRfd2FsbCh4LCBicmlk Z2VfYywgMik7DQoJICAgIH0NCgl9DQogICAgICBmb3IoeSA9IGxvZ29feTsg eSA8IGxvZ29feStsb2dvaDsgeSsrKQ0KCXsNCgkgIGlmKCEoYnJpZGdlX2Rp cj09MSAmJiB5PT1icmlkZ2VfYykpDQoJICAgIHsNCgkgICAgICBidWlsZF93 YWxsKGxvZ29feCwgeSwgMyk7DQoJICAgICAgYnVpbGRfd2FsbChsb2dvX3gr bG9nb3csIHksIDMpOw0KCSAgICB9DQoJICBoZWRnZXNbMioobG9nb194LTEr bWF6ZV9zaXplX3gqeSkrMV0gPSAtMTsNCgkgIGlmKGJyaWRnZV9kaXI9PTIp DQoJICAgIHsNCgkgICAgICBidWlsZF93YWxsKGJyaWRnZV9jLCB5LCAxKTsN CgkgICAgICBidWlsZF93YWxsKGJyaWRnZV9jLCB5LCAzKTsNCgkgICAgfQ0K CX0NCiAgICAgIC8qIEpvaW4gdGhlIHdob2xlIGJyaWRnZSB0b2dldGhlci4g Ki8NCiAgICAgIGlmKGJyaWRnZV9wKQ0KCXsNCgkgIGlmKGJyaWRnZV9kaXI9 PTEpDQoJICAgIHsNCgkgICAgICB4ID0gbG9nb194LTE7DQoJICAgICAgeSA9 IGJyaWRnZV9jOw0KCSAgICAgIGZvcihpID0gbG9nb194OyBpIDwgbG9nb194 K2xvZ293KzE7IGkrKykNCgkJam9pbl9zZXRzKHgreSptYXplX3NpemVfeCwg aSt5Km1hemVfc2l6ZV94KTsNCgkgICAgfQ0KCSAgZWxzZQ0KCSAgICB7DQoJ ICAgICAgeSA9IGxvZ29feS0xOw0KCSAgICAgIHggPSBicmlkZ2VfYzsNCgkg ICAgICBmb3IoaSA9IGxvZ29feTsgaSA8IGxvZ29feStsb2dvaCsxOyBpKysp DQoJCWpvaW5fc2V0cyh4K3kqbWF6ZV9zaXplX3gsIHgraSptYXplX3NpemVf eCk7DQoJICAgIH0NCgl9DQogICAgfQ0KDQogIGZvcihpID0gMDsgaSA8IG1h emVfc2l6ZV94Km1hemVfc2l6ZV95KjI7IGkrKykNCiAgICB7DQogICAgICB0 ID0gaGVkZ2VzW2ldOw0KICAgICAgciA9IHJhbmRvbSgpJShtYXplX3NpemVf eCptYXplX3NpemVfeSoyKTsNCiAgICAgIGhlZGdlc1tpXSA9IGhlZGdlc1ty XTsNCiAgICAgIGhlZGdlc1tyXSA9IHQ7DQogICAgfQ0KfQ0KDQovKiBHZXQg dGhlIHJlcHJlc2VudGF0aXZlIG9mIGEgc2V0LiAqLw0Kc3RhdGljIGludA0K Z2V0X3NldChpbnQgbnVtKQ0Kew0KICBpbnQgczsNCg0KICBpZihzZXRzW251 bV09PW51bSkNCiAgICByZXR1cm4gbnVtOw0KICBlbHNlDQogICAgew0KICAg ICAgcyA9IGdldF9zZXQoc2V0c1tudW1dKTsNCiAgICAgIHNldHNbbnVtXSA9 IHM7DQogICAgICByZXR1cm4gczsNCiAgICB9DQp9DQoNCi8qIEpvaW4gdHdv IHNldHMgdG9nZXRoZXIuICovDQpzdGF0aWMgdm9pZA0Kam9pbl9zZXRzKG51 bTEsIG51bTIpDQogICAgIGludCBudW0xLCBudW0yOw0Kew0KICBpbnQgczEs IHMyOw0KDQogIHMxID0gZ2V0X3NldChudW0xKTsNCiAgczIgPSBnZXRfc2V0 KG51bTIpOw0KICANCiAgaWYoczE8czIpDQogICAgc2V0c1tzMl0gPSBzMTsN CiAgZWxzZQ0KICAgIHNldHNbczFdID0gczI7DQp9DQoNCi8qIEV4aXRpYWxp c2UgdGhlIHNldHMuICovDQpzdGF0aWMgdm9pZA0KZXhpdF9zZXRzKHZvaWQp DQp7DQogIGlmKGhlZGdlcykNCiAgICBmcmVlKGhlZGdlcyk7DQogIGhlZGdl cyA9IDA7DQogIGlmKHNldHMpDQogICAgZnJlZShzZXRzKTsNCiAgc2V0cyA9 IDA7DQp9DQoNCg0KLyogU2Vjb25kIGFsdGVybmF0aXZlIG1hemUgY3JlYXRv cjogUHV0IGVhY2ggc3F1YXJlIGluIHRoZSBtYXplIGluIGEgDQogKiBzZXBh cmF0ZSBzZXQuIEFsc28sIG1ha2UgYSBsaXN0IG9mIGFsbCB0aGUgaGVkZ2Vz LiBSYW5kb21pemUgdGhhdCBsaXN0Lg0KICogV2FsayB0aHJvdWdoIHRoZSBs aXN0LiBJZiwgZm9yIGEgY2VydGFpbiBoZWRnZSwgdGhlIHR3byBzcXVhcmVz IG9uIGJvdGgNCiAqIHNpZGVzIG9mIGl0IGFyZSBpbiBkaWZmZXJlbnQgc2V0 cywgdW5pb24gdGhlIHNldHMgYW5kIHJlbW92ZSB0aGUgaGVkZ2UuDQogKiBD b250aW51ZSB1bnRpbCBhbGwgaGVkZ2VzIGhhdmUgYmVlbiBwcm9jZXNzZWQg b3Igb25seSBvbmUgc2V0IHJlbWFpbnMuDQogKi8NCnN0YXRpYyB2b2lkDQpz ZXRfY3JlYXRlX21hemUodm9pZCkNCnsNCiAgaW50IGksIGgsIHgsIHksIGRp ciwgdiwgdzsNCg0KICAvKiBEbyBhbG1vc3QgYWxsIHRoZSBzZXR1cC4gKi8N CiAgaW5pdF9zZXRzKCk7DQoNCiAgLyogU3RhcnQgcnVubmluZyB0aHJvdWdo IHRoZSBoZWRnZXMuICovDQogIGZvcihpID0gMDsgaSA8IDIqbWF6ZV9zaXpl X3gqbWF6ZV9zaXplX3k7IGkrKykNCiAgICB7IA0KICAgICAgaCA9IGhlZGdl c1tpXTsNCg0KICAgICAgLyogVGhpcyBvbmUgaXMgaW4gdGhlIGxvZ28gb3Ig b3V0c2lkZSBib3JkZXIuICovDQogICAgICBpZihoPT0tMSkNCgljb250aW51 ZTsNCg0KICAgICAgZGlyID0gaCUyPzE6MjsNCiAgICAgIHggPSAoaD4+MSkl bWF6ZV9zaXplX3g7DQogICAgICB5ID0gKGg+PjEpL21hemVfc2l6ZV94Ow0K DQogICAgICB2ID0geDsNCiAgICAgIHcgPSB5Ow0KICAgICAgc3dpdGNoKGRp cikNCgl7DQoJY2FzZSAxOg0KCSAgdisrOw0KCSAgYnJlYWs7DQoJY2FzZSAy Og0KCSAgdysrOw0KCSAgYnJlYWs7DQoJfQ0KDQoNCiAgICAgIGlmKGdldF9z ZXQoeCt5Km1hemVfc2l6ZV94KSE9Z2V0X3NldCh2K3cqbWF6ZV9zaXplX3gp KQ0KCXsNCg0KCSAgam9pbl9zZXRzKHgreSptYXplX3NpemVfeCwgdit3Km1h emVfc2l6ZV94KTsNCgkgIC8qIERvbid0IGRyYXcgdGhlIHdhbGwuICovDQoJ fQ0KICAgICAgZWxzZQ0KCXsNCg0KCSAgLyogRG9uJ3Qgam9pbiB0aGUgc2V0 cy4gKi8NCgkgIGJ1aWxkX3dhbGwoeCwgeSwgZGlyKTsgDQoJfQ0KICAgIH0N Cg0KICAvKiBGcmVlIHNvbWUgbWVtb3J5LiAqLw0KICBleGl0X3NldHMoKTsN Cn0NCg0KLyogRmlyc3QgYWx0ZXJuYXRpdmUgbWF6ZSBjcmVhdG9yOiBQaWNr IGEgcmFuZG9tLCBlbXB0eSBjb3JuZXIgaW4gdGhlIG1hemUuDQogKiBQaWNr IGEgcmFuZG9tIGRpcmVjdGlvbi4gRHJhdyBhIHdhbGwgaW4gdGhhdCBkaXJl Y3Rpb24sIGZyb20gdGhhdCBjb3JuZXINCiAqIHVudGlsIHdlIGhpdCBhIHdh bGwuIE9wdGlvbjogT25seSBkcmF3IHRoZSB3YWxsIGlmIGl0J3MgZ29pbmcg dG8gYmUgDQogKiBzaG9ydGVyIHRoYW4gYSBjZXJ0YWluIGxlbmd0aC4gT3Ro ZXJ3aXNlIHdlIGdldCBsb3RzIG9mIGxvbmcgd2FsbHMuDQogKi8NCnN0YXRp YyB2b2lkDQphbHRfY3JlYXRlX21hemUodm9pZCkNCnsNCiAgY2hhciAqY29y bmVyczsNCiAgaW50ICpjX2lkeDsNCiAgaW50IGksIGosIGhlaWdodCwgd2lk dGgsIG9wZW5fY29ybmVycywgaywgZGlyLCB4LCB5Ow0KDQogIGhlaWdodCA9 IG1hemVfc2l6ZV95KzE7DQogIHdpZHRoID0gbWF6ZV9zaXplX3grMTsNCg0K ICAvKiBBbGxvY2F0ZSBhbmQgY2xlYXIgc29tZSBtZW0uICovDQogIGNvcm5l cnMgPSAoY2hhciAqKWNhbGxvYyhoZWlnaHQqd2lkdGgsIDEpOw0KICBpZigh Y29ybmVycykNCiAgICByZXR1cm47DQoNCiAgLyogU2V0IHVwIHRoZSBpbmRl eGluZyBhcnJheS4gKi8NCiAgY19pZHggPSAoaW50ICopbWFsbG9jKHNpemVv ZihpbnQpKmhlaWdodCp3aWR0aCk7DQogIGlmKCFjX2lkeCkNCiAgICB7DQog ICAgICBmcmVlKGNvcm5lcnMpOw0KICAgICAgcmV0dXJuOw0KICAgIH0NCiAg Zm9yKGkgPSAwOyBpIDwgaGVpZ2h0KndpZHRoOyBpKyspDQogICAgY19pZHhb aV0gPSBpOw0KICBmb3IoaSA9IDA7IGkgPCBoZWlnaHQqd2lkdGg7IGkrKykN CiAgICB7DQogICAgICBqID0gY19pZHhbaV07DQogICAgICBrID0gcmFuZG9t KCklKGhlaWdodCp3aWR0aCk7DQogICAgICBjX2lkeFtpXSA9IGNfaWR4W2td Ow0KICAgICAgY19pZHhba10gPSBqOw0KICAgIH0NCg0KICAvKiBTZXQgdXAg c29tZSBpbml0aWFsIHdhbGxzLiAqLw0KICAvKiBPdXRzaWRlIHdhbGxzLiAq Lw0KICBmb3IoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKQ0KICAgIHsNCiAgICAg IGNvcm5lcnNbaV0gPSAxOw0KICAgICAgY29ybmVyc1tpK3dpZHRoKihoZWln aHQtMSldID0gMTsNCiAgICB9DQogIGZvcihpID0gMDsgaSA8IGhlaWdodDsg aSsrKQ0KICAgIHsNCiAgICAgIGNvcm5lcnNbaSp3aWR0aF0gPSAxOw0KICAg ICAgY29ybmVyc1tpKndpZHRoK3dpZHRoLTFdID0gMTsNCiAgICB9DQogIC8q IFdhbGxzIGFyb3VuZCBsb2dvLiBJbiBmYWN0LCBpbnNpZGUgdGhlIGxvZ28s IHRvby4gKi8NCiAgLyogQWxzbyBkcmF3IHRoZSB3YWxscy4gKi8NCiAgaWYo bG9nb194IT0tMSkNCiAgICB7DQogICAgICBpbnQgbG9nb3cgPSAxICsgbG9n b193aWR0aCAvIGdyaWRfd2lkdGg7DQogICAgICBpbnQgbG9nb2ggPSAxICsg bG9nb19oZWlnaHQgLyBncmlkX2hlaWdodDsNCiAgICAgIGludCBicmlkZ2Vf ZGlyLCBicmlkZ2VfYzsNCg0KICAgICAgaWYoYnJpZGdlX3AgJiYgbG9nb2g+ PTMgJiYgbG9nb3c+PTMpDQoJew0KCSAgYnJpZGdlX2RpciA9IDErcmFuZG9t KCklMjsNCgkgIGlmKGJyaWRnZV9kaXI9PTEpDQoJICAgIHsNCgkgICAgICBi cmlkZ2VfYyA9IGxvZ29feStyYW5kb20oKSUobG9nb2gtMikrMTsNCgkgICAg fQ0KCSAgZWxzZQ0KCSAgICB7DQoJICAgICAgYnJpZGdlX2MgPSBsb2dvX3gr cmFuZG9tKCklKGxvZ293LTIpKzE7DQoJICAgIH0NCgl9DQogICAgICBlbHNl DQoJew0KCSAgYnJpZGdlX2RpciA9IDA7DQoJICBicmlkZ2VfYyA9IC0xOw0K CX0NCiAgICAgIGZvcihpID0gbG9nb194OyBpIDw9IGxvZ29feCArIGxvZ293 OyBpKyspDQoJew0KCSAgZm9yKGogPSBsb2dvX3k7IGogPD0gbG9nb195ICsg bG9nb2g7IGorKykNCgkgICAgew0KCSAgICAgIGNvcm5lcnNbaSt3aWR0aCpq XSA9IDE7DQoJICAgIH0NCgl9DQogICAgICBmb3IoeCA9IGxvZ29feDsgeCA8 IGxvZ29feCtsb2dvdzsgeCsrKQ0KCXsNCgkgIGlmKCEoYnJpZGdlX2Rpcj09 MiAmJiB4PT1icmlkZ2VfYykpDQoJICAgIHsNCgkgICAgICBidWlsZF93YWxs KHgsIGxvZ29feSwgMCk7DQoJICAgICAgYnVpbGRfd2FsbCh4LCBsb2dvX3kr bG9nb2gsIDApOw0KCSAgICB9DQoJICBpZihicmlkZ2VfZGlyPT0xKQ0KCSAg ICB7DQoJICAgICAgYnVpbGRfd2FsbCh4LCBicmlkZ2VfYywgMCk7DQoJICAg ICAgYnVpbGRfd2FsbCh4LCBicmlkZ2VfYywgMik7DQoJICAgIH0NCgl9DQog ICAgICBmb3IoeSA9IGxvZ29feTsgeSA8IGxvZ29feStsb2dvaDsgeSsrKQ0K CXsNCgkgIGlmKCEoYnJpZGdlX2Rpcj09MSAmJiB5PT1icmlkZ2VfYykpDQoJ ICAgIHsNCgkgICAgICBidWlsZF93YWxsKGxvZ29feCwgeSwgMyk7DQoJICAg ICAgYnVpbGRfd2FsbChsb2dvX3grbG9nb3csIHksIDMpOw0KCSAgICB9DQoJ ICBpZihicmlkZ2VfZGlyPT0yKQ0KCSAgICB7DQoJICAgICAgYnVpbGRfd2Fs bChicmlkZ2VfYywgeSwgMSk7DQoJICAgICAgYnVpbGRfd2FsbChicmlkZ2Vf YywgeSwgMyk7DQoJICAgIH0NCgl9DQogICAgICAvKiBDb25uZWN0IG9uZSB3 YWxsIG9mIHRoZSBsb2dvIHdpdGggYW4gb3V0c2lkZSB3YWxsLiAqLw0KICAg ICAgaWYoYnJpZGdlX3ApDQoJZGlyID0gKGJyaWRnZV9kaXIrMSklNDsNCiAg ICAgIGVsc2UNCglkaXIgPSByYW5kb20oKSU0Ow0KICAgICAgc3dpdGNoKGRp cikNCgl7DQoJY2FzZSAwOg0KCSAgeCA9IGxvZ29feCsocmFuZG9tKCklKGxv Z293KzEpKTsNCgkgIHkgPSBsb2dvX3k7DQoJICBicmVhazsNCgljYXNlIDE6 DQoJICB4ID0gbG9nb194K2xvZ293Ow0KCSAgeSA9IGxvZ29feSsocmFuZG9t KCklKGxvZ29oKzEpKTsNCgkgIGJyZWFrOw0KCWNhc2UgMjoNCgkgIHggPSBs b2dvX3grKHJhbmRvbSgpJShsb2dvdysxKSk7DQoJICB5ID0gbG9nb195K2xv Z29oOw0KCSAgYnJlYWs7DQoJY2FzZSAzOg0KCSAgeCA9IGxvZ29feDsNCgkg IHkgPSBsb2dvX3krKHJhbmRvbSgpJShsb2dvaCsxKSk7DQoJICBicmVhazsN Cgl9DQogICAgICBkbw0KCXsNCgkgIGNvcm5lcnNbeCt3aWR0aCp5XSA9IDE7 DQoJICBzd2l0Y2goZGlyKQ0KCSAgICB7DQoJICAgIGNhc2UgMDoNCgkgICAg ICBidWlsZF93YWxsKHgtMSwgeS0xLCAxKTsNCgkgICAgICB5LS07DQoJICAg ICAgYnJlYWs7DQoJICAgIGNhc2UgMToNCgkgICAgICBidWlsZF93YWxsKHgs IHksIDApOw0KCSAgICAgIHgrKzsNCgkgICAgICBicmVhazsNCgkgICAgY2Fz ZSAyOg0KCSAgICAgIGJ1aWxkX3dhbGwoeCwgeSwgMyk7DQoJICAgICAgeSsr Ow0KCSAgICAgIGJyZWFrOw0KCSAgICBjYXNlIDM6DQoJICAgICAgYnVpbGRf d2FsbCh4LTEsIHktMSwgMik7DQoJICAgICAgeC0tOw0KCSAgICAgIGJyZWFr OwkgIA0KCSAgICB9DQoJfQ0KICAgICAgd2hpbGUoIWNvcm5lcnNbeCt3aWR0 aCp5XSk7DQogICAgICBpZihicmlkZ2VfcCkNCgl7DQoJICBkaXIgPSAoZGly KzIpJTQ7DQoJICBzd2l0Y2goZGlyKQ0KCSAgICB7DQoJICAgIGNhc2UgMDoN CgkgICAgICB4ID0gbG9nb194KyhyYW5kb20oKSUobG9nb3crMSkpOw0KCSAg ICAgIHkgPSBsb2dvX3k7DQoJICAgICAgYnJlYWs7DQoJICAgIGNhc2UgMToN CgkgICAgICB4ID0gbG9nb194K2xvZ293Ow0KCSAgICAgIHkgPSBsb2dvX3kr KHJhbmRvbSgpJShsb2dvaCsxKSk7DQoJICAgICAgYnJlYWs7DQoJICAgIGNh c2UgMjoNCgkgICAgICB4ID0gbG9nb194KyhyYW5kb20oKSUobG9nb3crMSkp Ow0KCSAgICAgIHkgPSBsb2dvX3krbG9nb2g7DQoJICAgICAgYnJlYWs7DQoJ ICAgIGNhc2UgMzoNCgkgICAgICB4ID0gbG9nb194Ow0KCSAgICAgIHkgPSBs b2dvX3krKHJhbmRvbSgpJShsb2dvaCsxKSk7DQoJICAgICAgYnJlYWs7DQoJ ICAgIH0NCgkgIGRvDQoJICAgIHsNCgkgICAgICBjb3JuZXJzW3grd2lkdGgq eV0gPSAxOw0KCSAgICAgIHN3aXRjaChkaXIpDQoJCXsNCgkJY2FzZSAwOg0K CQkgIGJ1aWxkX3dhbGwoeC0xLCB5LTEsIDEpOw0KCQkgIHktLTsNCgkJICBi cmVhazsNCgkJY2FzZSAxOg0KCQkgIGJ1aWxkX3dhbGwoeCwgeSwgMCk7DQoJ CSAgeCsrOw0KCQkgIGJyZWFrOw0KCQljYXNlIDI6DQoJCSAgYnVpbGRfd2Fs bCh4LCB5LCAzKTsNCgkJICB5Kys7DQoJCSAgYnJlYWs7DQoJCWNhc2UgMzoN CgkJICBidWlsZF93YWxsKHgtMSwgeS0xLCAyKTsNCgkJICB4LS07DQoJCSAg YnJlYWs7CSAgDQoJCX0NCgkgICAgfQ0KCSAgd2hpbGUoIWNvcm5lcnNbeCt3 aWR0aCp5XSk7DQoJfQ0KICAgIH0NCg0KICAvKiBDb3VudCBvcGVuIGdyaWRw b2ludHMuICovDQogIG9wZW5fY29ybmVycyA9IDA7DQogIGZvcihpID0gMDsg aSA8IHdpZHRoOyBpKyspDQogICAgZm9yKGogPSAwOyBqIDwgaGVpZ2h0OyBq KyspDQogICAgICBpZighY29ybmVyc1tpK3dpZHRoKmpdKQ0KCW9wZW5fY29y bmVycysrOw0KDQogIC8qIE5vdyBkbyBhY3R1YWwgbWF6ZSBnZW5lcmF0aW9u LiAqLw0KICB3aGlsZShvcGVuX2Nvcm5lcnM+MCkNCiAgICB7DQogICAgICBm b3IoaSA9IDA7IGkgPCB3aWR0aCpoZWlnaHQ7IGkrKykNCgl7DQoJICBpZigh Y29ybmVyc1tjX2lkeFtpXV0pDQoJICAgIHsNCgkgICAgICB4ID0gY19pZHhb aV0ld2lkdGg7DQoJICAgICAgeSA9IGNfaWR4W2ldL3dpZHRoOw0KCSAgICAg IC8qIENob29zZSBhIHJhbmRvbSBkaXJlY3Rpb24uICovDQoJICAgICAgZGly ID0gcmFuZG9tKCklNDsNCgkgICAgICANCgkgICAgICBrID0gMDsNCgkgICAg ICAvKiBNZWFzdXJlIHRoZSBsZW5ndGggb2YgdGhlIHdhbGwgd2UnZCBkcmF3 LiAqLw0KCSAgICAgIHdoaWxlKCFjb3JuZXJzW3grd2lkdGgqeV0pDQoJCXsN CgkJICBrKys7DQoJCSAgc3dpdGNoKGRpcikNCgkJICAgIHsNCgkJICAgIGNh c2UgMDoNCgkJICAgICAgeS0tOw0KCQkgICAgICBicmVhazsNCgkJICAgIGNh c2UgMToNCgkJICAgICAgeCsrOw0KCQkgICAgICBicmVhazsNCgkJICAgIGNh c2UgMjoNCgkJICAgICAgeSsrOw0KCQkgICAgICBicmVhazsNCgkJICAgIGNh c2UgMzoNCgkJICAgICAgeC0tOw0KCQkgICAgICBicmVhazsNCgkJICAgIH0N CgkJfQ0KCSAgICAgIA0KCSAgICAgIGlmKGs8PW1heF9sZW5ndGgpDQoJCXsN CgkJICB4ID0gY19pZHhbaV0ld2lkdGg7DQoJCSAgeSA9IGNfaWR4W2ldL3dp ZHRoOw0KCQkgIA0KCQkgIC8qIERyYXcgYSB3YWxsIHVudGlsIHdlIGhpdCBz b21ldGhpbmcuICovDQoJCSAgd2hpbGUoIWNvcm5lcnNbeCt3aWR0aCp5XSkN CgkJICAgIHsNCgkJICAgICAgb3Blbl9jb3JuZXJzLS07DQoJCSAgICAgIGNv cm5lcnNbeCt3aWR0aCp5XSA9IDE7DQoJCSAgICAgIHN3aXRjaChkaXIpDQoJ CQl7DQoJCQljYXNlIDA6DQoJCQkgIGJ1aWxkX3dhbGwoeC0xLCB5LTEsIDEp Ow0KCQkJICB5LS07DQoJCQkgIGJyZWFrOw0KCQkJY2FzZSAxOg0KCQkJICBi dWlsZF93YWxsKHgsIHksIDApOw0KCQkJICB4Kys7DQoJCQkgIGJyZWFrOw0K CQkJY2FzZSAyOg0KCQkJICBidWlsZF93YWxsKHgsIHksIDMpOw0KCQkJICB5 Kys7DQoJCQkgIGJyZWFrOw0KCQkJY2FzZSAzOg0KCQkJICBidWlsZF93YWxs KHgtMSwgeS0xLCAyKTsNCgkJCSAgeC0tOw0KCQkJICBicmVhazsNCgkJCX0N CgkJICAgIH0NCgkJfQ0KCSAgICB9DQoJfQ0KICAgIH0NCg0KICAvKiBGcmVl IHNvbWUgbWVtb3J5IHdlIHVzZWQuICovDQogIGZyZWUoY29ybmVycyk7DQog IGZyZWUoY19pZHgpOw0KfQ0KDQovKiBUaGUgb3JpZ2luYWwgbWF6ZSBjcmVh dG9yLiBTdGFydCBzb21ld2hlcmUuIFRha2UgYSBzdGVwIGluIGEgcmFuZG9t IA0KICogZGlyZWN0aW9uLiBLZWVwIGRvaW5nIHRoaXMgdW50aWwgd2UgaGl0 IGEgd2FsbC4gVGhlbiwgYmFja3RyYWNrIHVudGlsDQogKiB3ZSBmaW5kIGEg cG9pbnQgd2hlcmUgd2UgY2FuIGdvIGluIGFub3RoZXIgZGlyZWN0aW9uLg0K ICovDQpzdGF0aWMgdm9pZA0KY3JlYXRlX21hemUgKHZvaWQpICAgIC8qIGNy ZWF0ZSBhIG1hemUgbGF5b3V0IGdpdmVuIHRoZSBpbml0aWFsaXplZCBtYXpl ICovDQp7DQogIHJlZ2lzdGVyIGludCBpLCBuZXdkb29yID0gMDsNCiAgaW50 IGxvZ293ID0gMSArIGxvZ29fd2lkdGggLyBncmlkX3dpZHRoOw0KICBpbnQg bG9nb2ggPSAxICsgbG9nb19oZWlnaHQgLyBncmlkX2hlaWdodDsNCiAgDQog IC8qIE1heWJlIHdlIHNob3VsZCBtYWtlIGEgYnJpZGdlPyAqLw0KICBpZihi cmlkZ2VfcCAmJiBsb2dvX3g+PTAgJiYgbG9nb3c+PTMgJiYgbG9nb2g+PTMp DQogICAgew0KICAgICAgaW50IGJyaWRnZV9kaXIsIGJyaWRnZV9jOw0KDQog ICAgICBicmlkZ2VfZGlyID0gMStyYW5kb20oKSUyOw0KICAgICAgaWYoYnJp ZGdlX2Rpcj09MSkNCgl7DQoJICBpZihsb2dvaD49MykNCgkgICAgYnJpZGdl X2MgPSBsb2dvX3krcmFuZG9tKCklKGxvZ29oLTIpKzE7DQoJICBlbHNlDQoJ ICAgIGJyaWRnZV9jID0gbG9nb195K3JhbmRvbSgpJWxvZ29oOw0KCX0NCiAg ICAgIGVsc2UNCgl7DQoJICBpZihsb2dvdz49MykNCgkgICAgYnJpZGdlX2Mg PSBsb2dvX3grcmFuZG9tKCklKGxvZ293LTIpKzE7DQoJICBlbHNlDQoJICAg IGJyaWRnZV9jID0gbG9nb194K3JhbmRvbSgpJWxvZ293Ow0KCX0NCg0KICAg ICAgaWYoYnJpZGdlX2Rpcj09MSkNCgl7DQoJICBmb3IoaSA9IGxvZ29feDsg aSA8IGxvZ29feCtsb2dvdzsgaSsrKQ0KCSAgICB7DQoJICAgICAgbWF6ZVtp XVticmlkZ2VfY10gJj0gfkRPT1JfSU5fVE9QOw0KCSAgICB9DQoJfQ0KICAg ICAgZWxzZQ0KCXsNCgkgIGZvcihpID0gbG9nb195OyBpIDwgbG9nb195K2xv Z29oOyBpKyspDQoJICAgIHsNCgkgICAgICBtYXplW2JyaWRnZV9jXVtpXSAm PSB+RE9PUl9JTl9UT1A7DQoJICAgIH0NCgl9DQogICAgfQ0KDQogIGRvIHsN CiAgICBtb3ZlX2xpc3Rbc3FudW1dLnggPSBjdXJfc3FfeDsNCiAgICBtb3Zl X2xpc3Rbc3FudW1dLnkgPSBjdXJfc3FfeTsNCiAgICBtb3ZlX2xpc3Rbc3Fu dW1dLmRpciA9IG5ld2Rvb3I7DQogICAgd2hpbGUgKCAoIG5ld2Rvb3IgPSBj aG9vc2VfZG9vcigpICkgPT0gLTEgKSB7IC8qIHBpY2sgYSBkb29yICovDQog ICAgICBpZiAoIGJhY2t1cCgpID09IC0xICkgeyAvKiBubyBtb3JlIGRvb3Jz IC4uLiBiYWNrdXAgKi8NCglyZXR1cm47IC8qIGRvbmUgLi4uIHJldHVybiAq Lw0KICAgICAgfQ0KICAgIH0NCiAgICANCiAgICAvKiBtYXJrIHRoZSBvdXQg ZG9vciAqLw0KICAgIG1hemVbY3VyX3NxX3hdW2N1cl9zcV95XSB8PSAoIERP T1JfT1VUX1RPUCA+PiBuZXdkb29yICk7DQogICAgDQogICAgc3dpdGNoIChu ZXdkb29yKSB7DQogICAgY2FzZSAwOiBjdXJfc3FfeS0tOw0KICAgICAgYnJl YWs7DQogICAgY2FzZSAxOiBjdXJfc3FfeCsrOw0KICAgICAgYnJlYWs7DQog ICAgY2FzZSAyOiBjdXJfc3FfeSsrOw0KICAgICAgYnJlYWs7DQogICAgY2Fz ZSAzOiBjdXJfc3FfeC0tOw0KICAgICAgYnJlYWs7DQogICAgfQ0KICAgIHNx bnVtKys7DQogICAgDQogICAgLyogbWFyayB0aGUgaW4gZG9vciAqLw0KICAg IG1hemVbY3VyX3NxX3hdW2N1cl9zcV95XSB8PSAoIERPT1JfSU5fVE9QID4+ ICgobmV3ZG9vcisyKSU0KSApOw0KICAgIA0KICAgIC8qIGlmIGVuZCBzcXVh cmUgc2V0IHBhdGggbGVuZ3RoIGFuZCBzYXZlIHBhdGggKi8NCiAgICBpZiAo IG1hemVbY3VyX3NxX3hdW2N1cl9zcV95XSAmIEVORF9TUVVBUkUgKSB7DQog ICAgICBwYXRoX2xlbmd0aCA9IHNxbnVtOw0KICAgICAgZm9yICggaT0wOyBp PHBhdGhfbGVuZ3RoOyBpKyspIHsNCglzYXZlX3BhdGhbaV0ueCA9IG1vdmVf bGlzdFtpXS54Ow0KCXNhdmVfcGF0aFtpXS55ID0gbW92ZV9saXN0W2ldLnk7 DQoJc2F2ZV9wYXRoW2ldLmRpciA9IG1vdmVfbGlzdFtpXS5kaXI7DQogICAg ICB9DQogICAgfQ0KICAgIA0KICB9IHdoaWxlICgxKTsNCiAgDQp9DQoNCg0K c3RhdGljIGludA0KY2hvb3NlX2Rvb3IgKHZvaWQpICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAvKiBwaWNrIGEgbmV3IHBhdGggKi8NCnsN CiAgaW50IGNhbmRpZGF0ZXNbM107DQogIHJlZ2lzdGVyIGludCBudW1fY2Fu ZGlkYXRlczsNCiAgDQogIG51bV9jYW5kaWRhdGVzID0gMDsNCiAgDQogIC8q IHRvcCB3YWxsICovDQogIGlmICggbWF6ZVtjdXJfc3FfeF1bY3VyX3NxX3ld ICYgRE9PUl9JTl9UT1AgKQ0KICAgIGdvdG8gcmlnaHR3YWxsOw0KICBpZiAo IG1hemVbY3VyX3NxX3hdW2N1cl9zcV95XSAmIERPT1JfT1VUX1RPUCApDQog ICAgZ290byByaWdodHdhbGw7DQogIGlmICggbWF6ZVtjdXJfc3FfeF1bY3Vy X3NxX3ldICYgV0FMTF9UT1AgKQ0KICAgIGdvdG8gcmlnaHR3YWxsOw0KICBp ZiAoIG1hemVbY3VyX3NxX3hdW2N1cl9zcV95IC0gMV0gJiBET09SX0lOX0FO WSApIHsNCiAgICBtYXplW2N1cl9zcV94XVtjdXJfc3FfeV0gfD0gV0FMTF9U T1A7DQogICAgbWF6ZVtjdXJfc3FfeF1bY3VyX3NxX3kgLSAxXSB8PSBXQUxM X0JPVFRPTTsNCiAgICBkcmF3X3dhbGwoY3VyX3NxX3gsIGN1cl9zcV95LCAw KTsNCiAgICBnb3RvIHJpZ2h0d2FsbDsNCiAgfQ0KICBjYW5kaWRhdGVzW251 bV9jYW5kaWRhdGVzKytdID0gMDsNCiAgDQogcmlnaHR3YWxsOg0KICAvKiBy aWdodCB3YWxsICovDQogIGlmICggbWF6ZVtjdXJfc3FfeF1bY3VyX3NxX3ld ICYgRE9PUl9JTl9SSUdIVCApDQogICAgZ290byBib3R0b213YWxsOw0KICBp ZiAoIG1hemVbY3VyX3NxX3hdW2N1cl9zcV95XSAmIERPT1JfT1VUX1JJR0hU ICkNCiAgICBnb3RvIGJvdHRvbXdhbGw7DQogIGlmICggbWF6ZVtjdXJfc3Ff eF1bY3VyX3NxX3ldICYgV0FMTF9SSUdIVCApDQogICAgZ290byBib3R0b213 YWxsOw0KICBpZiAoIG1hemVbY3VyX3NxX3ggKyAxXVtjdXJfc3FfeV0gJiBE T09SX0lOX0FOWSApIHsNCiAgICBtYXplW2N1cl9zcV94XVtjdXJfc3FfeV0g fD0gV0FMTF9SSUdIVDsNCiAgICBtYXplW2N1cl9zcV94ICsgMV1bY3VyX3Nx X3ldIHw9IFdBTExfTEVGVDsNCiAgICBkcmF3X3dhbGwoY3VyX3NxX3gsIGN1 cl9zcV95LCAxKTsNCiAgICBnb3RvIGJvdHRvbXdhbGw7DQogIH0NCiAgY2Fu ZGlkYXRlc1tudW1fY2FuZGlkYXRlcysrXSA9IDE7DQogIA0KIGJvdHRvbXdh bGw6DQogIC8qIGJvdHRvbSB3YWxsICovDQogIGlmICggbWF6ZVtjdXJfc3Ff eF1bY3VyX3NxX3ldICYgRE9PUl9JTl9CT1RUT00gKQ0KICAgIGdvdG8gbGVm dHdhbGw7DQogIGlmICggbWF6ZVtjdXJfc3FfeF1bY3VyX3NxX3ldICYgRE9P Ul9PVVRfQk9UVE9NICkNCiAgICBnb3RvIGxlZnR3YWxsOw0KICBpZiAoIG1h emVbY3VyX3NxX3hdW2N1cl9zcV95XSAmIFdBTExfQk9UVE9NICkNCiAgICBn b3RvIGxlZnR3YWxsOw0KICBpZiAoIG1hemVbY3VyX3NxX3hdW2N1cl9zcV95 ICsgMV0gJiBET09SX0lOX0FOWSApIHsNCiAgICBtYXplW2N1cl9zcV94XVtj dXJfc3FfeV0gfD0gV0FMTF9CT1RUT007DQogICAgbWF6ZVtjdXJfc3FfeF1b Y3VyX3NxX3kgKyAxXSB8PSBXQUxMX1RPUDsNCiAgICBkcmF3X3dhbGwoY3Vy X3NxX3gsIGN1cl9zcV95LCAyKTsNCiAgICBnb3RvIGxlZnR3YWxsOw0KICB9 DQogIGNhbmRpZGF0ZXNbbnVtX2NhbmRpZGF0ZXMrK10gPSAyOw0KICANCiBs ZWZ0d2FsbDoNCiAgLyogbGVmdCB3YWxsICovDQogIGlmICggbWF6ZVtjdXJf c3FfeF1bY3VyX3NxX3ldICYgRE9PUl9JTl9MRUZUICkNCiAgICBnb3RvIGRv bmV3YWxsOw0KICBpZiAoIG1hemVbY3VyX3NxX3hdW2N1cl9zcV95XSAmIERP T1JfT1VUX0xFRlQgKQ0KICAgIGdvdG8gZG9uZXdhbGw7DQogIGlmICggbWF6 ZVtjdXJfc3FfeF1bY3VyX3NxX3ldICYgV0FMTF9MRUZUICkNCiAgICBnb3Rv IGRvbmV3YWxsOw0KICBpZiAoIG1hemVbY3VyX3NxX3ggLSAxXVtjdXJfc3Ff eV0gJiBET09SX0lOX0FOWSApIHsNCiAgICBtYXplW2N1cl9zcV94XVtjdXJf c3FfeV0gfD0gV0FMTF9MRUZUOw0KICAgIG1hemVbY3VyX3NxX3ggLSAxXVtj dXJfc3FfeV0gfD0gV0FMTF9SSUdIVDsNCiAgICBkcmF3X3dhbGwoY3VyX3Nx X3gsIGN1cl9zcV95LCAzKTsNCiAgICBnb3RvIGRvbmV3YWxsOw0KICB9DQog IGNhbmRpZGF0ZXNbbnVtX2NhbmRpZGF0ZXMrK10gPSAzOw0KICANCiBkb25l d2FsbDoNCiAgaWYgKG51bV9jYW5kaWRhdGVzID09IDApDQogICAgcmV0dXJu ICggLTEgKTsNCiAgaWYgKG51bV9jYW5kaWRhdGVzID09IDEpDQogICAgcmV0 dXJuICggY2FuZGlkYXRlc1swXSApOw0KICByZXR1cm4gKCBjYW5kaWRhdGVz WyBnZXRfcmFuZG9tKG51bV9jYW5kaWRhdGVzKSBdICk7DQogIA0KfQ0KDQoN CnN0YXRpYyBpbnQNCmJhY2t1cCAodm9pZCkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAvKiBiYWNrIHVwIGEgbW92ZSAqLw0K ew0KICBzcW51bS0tOw0KICBjdXJfc3FfeCA9IG1vdmVfbGlzdFtzcW51bV0u eDsNCiAgY3VyX3NxX3kgPSBtb3ZlX2xpc3Rbc3FudW1dLnk7DQogIHJldHVy biAoIHNxbnVtICk7DQp9DQoNCg0Kc3RhdGljIHZvaWQNCmRyYXdfbWF6ZV9i b3JkZXIgKHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRyYXcg dGhlIG1hemUgb3V0bGluZSAqLw0Kew0KICByZWdpc3RlciBpbnQgaSwgajsN CiANCiAgDQogIGZvciAoIGk9MDsgaTxtYXplX3NpemVfeDsgaSsrKSB7DQog ICAgaWYgKCBtYXplW2ldWzBdICYgV0FMTF9UT1AgKSB7DQovLyAgICAgIFhE cmF3TGluZShkcHksIHdpbiwgZ2MsDQovLwkJYm9yZGVyX3ggKyBncmlkX3dp ZHRoICogaSwNCi8vCQlib3JkZXJfeSwNCi8vCQlib3JkZXJfeCArIGdyaWRf d2lkdGggKiAoaSsxKSAtIDEsDQovLwkJYm9yZGVyX3kpOw0KDQoJbGluZShz Y3JlZW4sIGFkZHB0KHNjcmVlbi0+ci5taW4sIFB0KGJvcmRlcl94ICsgZ3Jp ZF93aWR0aCAqIGksIGJvcmRlcl95KSksDQoJCQlhZGRwdChzY3JlZW4tPnIu bWluLCBQdChib3JkZXJfeCArIGdyaWRfd2lkdGggKiAoaSsxKSAtIDEsIGJv cmRlcl95KSksDQoJCQlFbmRzcXVhcmUsIEVuZHNxdWFyZSwgMCwgZGlzcGxh eS0+d2hpdGUsIFpQKTsNCiAgICB9DQogICAgaWYgKChtYXplW2ldW21hemVf c2l6ZV95IC0gMV0gJiBXQUxMX0JPVFRPTSkpIHsNCi8vICAgICAgWERyYXdM aW5lKGRweSwgd2luLCBnYywNCi8vCQlib3JkZXJfeCArIGdyaWRfd2lkdGgg KiBpLA0KLy8JCWJvcmRlcl95ICsgZ3JpZF9oZWlnaHQgKiAobWF6ZV9zaXpl X3kpIC0gMSwNCi8vCQlib3JkZXJfeCArIGdyaWRfd2lkdGggKiAoaSsxKSAt IDEsDQovLwkJYm9yZGVyX3kgKyBncmlkX2hlaWdodCAqIChtYXplX3NpemVf eSkgLSAxKTsNCglsaW5lKHNjcmVlbiwgYWRkcHQoc2NyZWVuLT5yLm1pbiwg DQoJCQkJUHQoYm9yZGVyX3ggKyBncmlkX3dpZHRoICogaSwgYm9yZGVyX3kr IGdyaWRfaGVpZ2h0ICogKG1hemVfc2l6ZV95KSAtIDEpKSwNCgkJCWFkZHB0 KHNjcmVlbi0+ci5taW4sIA0KCQkJCVB0KGJvcmRlcl94ICsgZ3JpZF93aWR0 aCAqIChpKzEpIC0gMSwgYm9yZGVyX3kgKyBncmlkX2hlaWdodCAqIChtYXpl X3NpemVfeSkgLSAxKSksDQoJCQlFbmRzcXVhcmUsIEVuZHNxdWFyZSwgMCwg ZGlzcGxheS0+d2hpdGUsIFpQKTsNCiAgICB9DQogIH0NCiAgZm9yICggaj0w OyBqPG1hemVfc2l6ZV95OyBqKyspIHsNCiAgICBpZiAoIG1hemVbbWF6ZV9z aXplX3ggLSAxXVtqXSAmIFdBTExfUklHSFQgKSB7DQovLyAgICAgIFhEcmF3 TGluZShkcHksIHdpbiwgZ2MsDQovLwkJYm9yZGVyX3ggKyBncmlkX3dpZHRo ICogbWF6ZV9zaXplX3ggLSAxLA0KLy8JCWJvcmRlcl95ICsgZ3JpZF9oZWln aHQgKiBqLA0KLy8JCWJvcmRlcl94ICsgZ3JpZF93aWR0aCAqIG1hemVfc2l6 ZV94IC0gMSwNCi8vCQlib3JkZXJfeSArIGdyaWRfaGVpZ2h0ICogKGorMSkg LSAxKTsNCglsaW5lKHNjcmVlbiwgYWRkcHQoc2NyZWVuLT5yLm1pbiwgDQoJ CQkJUHQoYm9yZGVyX3ggKyBncmlkX3dpZHRoICogbWF6ZV9zaXplX3ggLSAx LCBib3JkZXJfeSArIGdyaWRfaGVpZ2h0ICogaikpLA0KCQkJYWRkcHQoc2Ny ZWVuLT5yLm1pbiwgDQoJCQkJUHQoYm9yZGVyX3ggKyBncmlkX3dpZHRoICog bWF6ZV9zaXplX3ggLSAxLCBib3JkZXJfeSArIGdyaWRfaGVpZ2h0ICogKGor MSkgLSAxKSksDQoJCQlFbmRzcXVhcmUsIEVuZHNxdWFyZSwgMCwgZGlzcGxh eS0+d2hpdGUsIFpQKTsNCiAgICB9DQogICAgaWYgKCBtYXplWzBdW2pdICYg V0FMTF9MRUZUICkgew0KLy8gICAgICBYRHJhd0xpbmUoZHB5LCB3aW4sIGdj LA0KLy8JCWJvcmRlcl94LA0KLy8JCWJvcmRlcl95ICsgZ3JpZF9oZWlnaHQg KiBqLA0KLy8JCWJvcmRlcl94LA0KLy8JCWJvcmRlcl95ICsgZ3JpZF9oZWln aHQgKiAoaisxKSAtIDEpOw0KCWxpbmUoc2NyZWVuLCBhZGRwdChzY3JlZW4t PnIubWluLCANCgkJCQlQdChib3JkZXJfeCwgYm9yZGVyX3kgKyBncmlkX2hl aWdodCAqIGopKSwNCgkJCWFkZHB0KHNjcmVlbi0+ci5taW4sIA0KCQkJCVB0 KGJvcmRlcl94LCBib3JkZXJfeSArIGdyaWRfaGVpZ2h0ICogKGorMSkgLSAx KSksDQoJCQlFbmRzcXVhcmUsIEVuZHNxdWFyZSwgMCwgZGlzcGxheS0+d2hp dGUsIFpQKTsNCiAgICB9DQogIH0NCiAgDQogIGlmIChsb2dvX3ggIT0gLTEp DQogICAgew0KICAgICAgdW5zaWduZWQgaW50IHc9IDQ4LCBoID0gNDg7DQoJ UG9pbnQgcDsNCg0KICAgICAgLyogcm91bmQgdXAgdG8gZ3JpZCBzaXplICov DQogICAgICBpbnQgd3cgPSAoKGxvZ29fd2lkdGggIC8gZ3JpZF93aWR0aCkg KyAxKSAgKiBncmlkX3dpZHRoOw0KICAgICAgaW50IGhoID0gKChsb2dvX2hl aWdodCAvIGdyaWRfaGVpZ2h0KSArIDEpICogZ3JpZF9oZWlnaHQ7DQoNCglw ID0gYWRkcHQoc2NyZWVuLT5yLm1pbiwgUHQoYm9yZGVyX3ggKyAxICsgZ3Jp ZF93aWR0aCAgKiBsb2dvX3ggKyAoKHd3IC0gdykgLyAyKSwgYm9yZGVyX3kg KyAxICsgZ3JpZF9oZWlnaHQgKiBsb2dvX3kgKyAoKGhoIC0gaCkgLyAyKSkp Ow0KCQ0KDQoJZHJhdyhzY3JlZW4sIFJwdChwLCBhZGRwdChwLCBQdCg0OCwg NDgpKSksIGdsZW5kYSwgbmlsLCBaUCk7DQoJLy9kcmF3KHNjcmVlbiwgc2Ny ZWVuLT5yLCBnbGVuZGEsIG5pbCwgWlApOw0KDQoNCiAgICB9DQogIGRyYXdf c29saWRfc3F1YXJlIChzdGFydF94LCBzdGFydF95LCBXQUxMX1RPUCA+PiBz dGFydF9kaXIsIGxpdmVDb2xvcik7DQogIGRyYXdfc29saWRfc3F1YXJlIChl bmRfeCwgZW5kX3ksIFdBTExfVE9QID4+IGVuZF9kaXIsIGxpdmVDb2xvcik7 DQp9DQoNCg0Kc3RhdGljIHZvaWQNCmRyYXdfd2FsbChpbnQgaSwgaW50IGos IGludCBkaXIpICAgICAgICAgICAgICAgIC8qIGRyYXcgYSBzaW5nbGUgd2Fs bCAqLw0Kew0KICBzd2l0Y2ggKGRpcikgew0KICBjYXNlIDA6DQovLyAgWERy YXdMaW5lKGRweSwgd2luLCBnYywNCi8vCSAgICAgIGJvcmRlcl94ICsgZ3Jp ZF93aWR0aCAqIGksIA0KLy8JICAgICAgYm9yZGVyX3kgKyBncmlkX2hlaWdo dCAqIGosDQovLwkgICAgICBib3JkZXJfeCArIGdyaWRfd2lkdGggKiAoaSsx KSwgDQovLwkgICAgICBib3JkZXJfeSArIGdyaWRfaGVpZ2h0ICogaik7DQoJ bGluZShzY3JlZW4sIGFkZHB0KHNjcmVlbi0+ci5taW4sIA0KCQkJCVB0KGJv cmRlcl94ICsgZ3JpZF93aWR0aCAqIGksIGJvcmRlcl95ICsgZ3JpZF9oZWln aHQgKiBqKSksDQoJCQlhZGRwdChzY3JlZW4tPnIubWluLCANCgkJCQlQdChi b3JkZXJfeCArIGdyaWRfd2lkdGggKiAoaSsxKSwgYm9yZGVyX3kgKyBncmlk X2hlaWdodCAqIGopKSwNCgkJCUVuZHNxdWFyZSwgRW5kc3F1YXJlLCAwLCBk aXNwbGF5LT53aGl0ZSwgWlApOw0KICAgIGJyZWFrOw0KICBjYXNlIDE6DQov LyAgICBYRHJhd0xpbmUoZHB5LCB3aW4sIGdjLA0KLy8JICAgICAgYm9yZGVy X3ggKyBncmlkX3dpZHRoICogKGkrMSksIA0KLy8JICAgICAgYm9yZGVyX3kg KyBncmlkX2hlaWdodCAqIGosDQovLwkgICAgICBib3JkZXJfeCArIGdyaWRf d2lkdGggKiAoaSsxKSwgDQovLwkgICAgICBib3JkZXJfeSArIGdyaWRfaGVp Z2h0ICogKGorMSkpOw0KCWxpbmUoc2NyZWVuLCBhZGRwdChzY3JlZW4tPnIu bWluLCANCgkJCQlQdChib3JkZXJfeCArIGdyaWRfd2lkdGggKiAoaSsxKSwg Ym9yZGVyX3kgKyBncmlkX2hlaWdodCAqIGopKSwNCgkJCWFkZHB0KHNjcmVl bi0+ci5taW4sIA0KCQkJCVB0KGJvcmRlcl94ICsgZ3JpZF93aWR0aCAqIChp KzEpLCBib3JkZXJfeSArIGdyaWRfaGVpZ2h0ICogKGorMSkpKSwNCgkJCUVu ZHNxdWFyZSwgRW5kc3F1YXJlLCAwLCBkaXNwbGF5LT53aGl0ZSwgWlApOw0K ICAgIGJyZWFrOw0KICBjYXNlIDI6DQovLyAgICBYRHJhd0xpbmUoZHB5LCB3 aW4sIGdjLA0KLy8JICAgICAgYm9yZGVyX3ggKyBncmlkX3dpZHRoICogaSwg DQovLwkgICAgICBib3JkZXJfeSArIGdyaWRfaGVpZ2h0ICogKGorMSksDQov LwkgICAgICBib3JkZXJfeCArIGdyaWRfd2lkdGggKiAoaSsxKSwgDQovLwkg ICAgICBib3JkZXJfeSArIGdyaWRfaGVpZ2h0ICogKGorMSkpOw0KCWxpbmUo c2NyZWVuLCBhZGRwdChzY3JlZW4tPnIubWluLCANCgkJCQlQdChib3JkZXJf eCArIGdyaWRfd2lkdGggKmksIGJvcmRlcl95ICsgZ3JpZF9oZWlnaHQgKiAo aisxKSkpLA0KCQkJYWRkcHQoc2NyZWVuLT5yLm1pbiwgDQoJCQkJUHQoYm9y ZGVyX3ggKyBncmlkX3dpZHRoICogKGkrMSksIGJvcmRlcl95ICsgZ3JpZF9o ZWlnaHQgKiAoaisxKSkpLA0KCQkJRW5kc3F1YXJlLCBFbmRzcXVhcmUsIDAs IGRpc3BsYXktPndoaXRlLCBaUCk7DQogICAgIGJyZWFrOw0KICBjYXNlIDM6 DQovLyAgICBYRHJhd0xpbmUoZHB5LCB3aW4sIGdjLA0KLy8JICAgICAgYm9y ZGVyX3ggKyBncmlkX3dpZHRoICogaSwgDQovLwkgICAgICBib3JkZXJfeSAr IGdyaWRfaGVpZ2h0ICogaiwNCi8vCSAgICAgIGJvcmRlcl94ICsgZ3JpZF93 aWR0aCAqIGksIA0KLy8JICAgICAgYm9yZGVyX3kgKyBncmlkX2hlaWdodCAq IChqKzEpKTsNCglsaW5lKHNjcmVlbiwgYWRkcHQoc2NyZWVuLT5yLm1pbiwg DQoJCQkJUHQoYm9yZGVyX3ggKyBncmlkX3dpZHRoICogaSwgYm9yZGVyX3kg KyBncmlkX2hlaWdodCAqIGopKSwNCgkJCWFkZHB0KHNjcmVlbi0+ci5taW4s IA0KCQkJCVB0KGJvcmRlcl94ICsgZ3JpZF93aWR0aCAqIGksIGJvcmRlcl95 ICsgZ3JpZF9oZWlnaHQgKiAoaisxKSkpLA0KCQkJRW5kc3F1YXJlLCBFbmRz cXVhcmUsIDAsIGRpc3BsYXktPndoaXRlLCBaUCk7DQogICAgIGJyZWFrOw0K ICB9DQogIGlmKHN5bmNfcCkNCiAgICBmbHVzaGltYWdlKGRpc3BsYXksIDEp Ow0KfQ0KDQovKiBBY3R1YWxseSBidWlsZCBhIHdhbGwuICovDQpzdGF0aWMg dm9pZA0KYnVpbGRfd2FsbChpLCBqLCBkaXIpDQogICAgIGludCBpLCBqLCBk aXI7DQp7DQogIC8qIERyYXcgaXQgb24gdGhlIHNjcmVlbi4gKi8NCiAgZHJh d193YWxsKGksIGosIGRpcik7DQogIC8qIFB1dCBpdCBpbiB0aGUgbWF6ZS4g Ki8NCiAgc3dpdGNoKGRpcikNCiAgICB7DQogICAgY2FzZSAwOg0KICAgICAg bWF6ZVtpXVtqXSB8PSBXQUxMX1RPUDsNCiAgICAgIGlmKGo+MCkNCgltYXpl W2ldW2otMV0gfD0gV0FMTF9CT1RUT007DQogICAgICBicmVhazsNCiAgICBj YXNlIDE6DQogICAgICBtYXplW2ldW2pdIHw9IFdBTExfUklHSFQ7DQogICAg ICBpZihpPG1hemVfc2l6ZV94LTEpDQoJbWF6ZVtpKzFdW2pdIHw9IFdBTExf TEVGVDsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgMjoNCiAgICAgIG1hemVb aV1bal0gfD0gV0FMTF9CT1RUT007DQogICAgICBpZihqPG1hemVfc2l6ZV95 LTEpDQoJbWF6ZVtpXVtqKzFdIHw9IFdBTExfVE9QOw0KICAgICAgYnJlYWs7 DQogICAgY2FzZSAzOg0KICAgICAgbWF6ZVtpXVtqXSB8PSBXQUxMX0xFRlQ7 DQogICAgICBpZihpPjApDQoJbWF6ZVtpLTFdW2pdIHw9IFdBTExfUklHSFQ7 DQogICAgICBicmVhazsNCiAgICB9DQp9DQoNCg0KDQpzdGF0aWMgdm9pZA0K ZHJhd19zb2xpZF9zcXVhcmUoaW50IGksIGludCBqLCAgICAgICAgICAvKiBk cmF3IGEgc29saWQgc3F1YXJlIGluIGEgc3F1YXJlICovDQoJCSAgaW50IGRp ciwgSW1hZ2UgKmMpDQp7DQoJUmVjdGFuZ2xlIHI7DQoJUG9pbnQgcDsNCg0K ICBzd2l0Y2ggKGRpcikgew0KICBjYXNlIFdBTExfVE9QOg0KLy8gICAgICBY RmlsbFJlY3RhbmdsZShkcHksIHdpbiwgZ2MsDQovLwkJICAgICBib3JkZXJf eCArIGJ3ICsgZ3JpZF93aWR0aCAqIGksIA0KLy8JCSAgICAgYm9yZGVyX3kg LSBidyArIGdyaWRfaGVpZ2h0ICogaiwgDQovLwkJICAgICBncmlkX3dpZHRo IC0gKGJ3K2J3KSwgZ3JpZF9oZWlnaHQpOw0KDQoJcCA9IGFkZHB0KHNjcmVl bi0+ci5taW4sIA0KCQlQdChib3JkZXJfeCArIGJ3ICsgZ3JpZF93aWR0aCAq IGksIGJvcmRlcl95IC0gYncgKyBncmlkX2hlaWdodCAqIGopKTsNCglyID0g UnB0KHAsIGFkZHB0KHAsIFB0KGdyaWRfd2lkdGggLSAoYncrYncpLCBncmlk X2hlaWdodCkpKTsNCglkcmF3KHNjcmVlbiwgciwgYywgbmlsLCBaUCk7DQoN CiAgICAgIGJyZWFrOw0KICBjYXNlIFdBTExfUklHSFQ6DQovLyAgICAgIFhG aWxsUmVjdGFuZ2xlKGRweSwgd2luLCBnYywNCi8vCQkgICAgIGJvcmRlcl94 ICsgYncgKyBncmlkX3dpZHRoICogaSwgDQovLwkJICAgICBib3JkZXJfeSAr IGJ3ICsgZ3JpZF9oZWlnaHQgKiBqLCANCi8vCQkgICAgIGdyaWRfd2lkdGgs IGdyaWRfaGVpZ2h0IC0gKGJ3K2J3KSk7DQoJcCA9IGFkZHB0KHNjcmVlbi0+ ci5taW4sIA0KCQlQdChib3JkZXJfeCArIGJ3ICsgZ3JpZF93aWR0aCAqIGks ICBib3JkZXJfeSArIGJ3ICsgZ3JpZF9oZWlnaHQgKiBqKSk7DQoJciA9IFJw dChwLCBhZGRwdChwLCBQdChncmlkX3dpZHRoLCBncmlkX2hlaWdodCAtIChi dytidykpKSk7DQoJZHJhdyhzY3JlZW4sIHIsIGMsIG5pbCwgWlApOw0KICAg ICAgYnJlYWs7DQogIGNhc2UgV0FMTF9CT1RUT006DQovLyAgICAgIFhGaWxs UmVjdGFuZ2xlKGRweSwgd2luLCBnYywNCi8vCQkgICAgIGJvcmRlcl94ICsg YncgKyBncmlkX3dpZHRoICogaSwgDQovLwkJICAgICBib3JkZXJfeSArIGJ3 ICsgZ3JpZF9oZWlnaHQgKiBqLCANCi8vCQkgICAgIGdyaWRfd2lkdGggLSAo YncrYncpLCBncmlkX2hlaWdodCk7DQoJcCA9IGFkZHB0KHNjcmVlbi0+ci5t aW4sIA0KCQlQdChib3JkZXJfeCArIGJ3ICsgZ3JpZF93aWR0aCAqIGksIGJv cmRlcl95ICsgYncgKyBncmlkX2hlaWdodCAqIGopKTsNCglyID0gUnB0KHAs IGFkZHB0KHAsIFB0KGdyaWRfd2lkdGggLSAoYncrYncpLCBncmlkX2hlaWdo dCkpKTsNCglkcmF3KHNjcmVlbiwgciwgYywgbmlsLCBaUCk7DQogICAgICBi cmVhazsNCiAgY2FzZSBXQUxMX0xFRlQ6DQovLyAgICAgIFhGaWxsUmVjdGFu Z2xlKGRweSwgd2luLCBnYywNCi8vCQkgICAgIGJvcmRlcl94IC0gYncgKyBn cmlkX3dpZHRoICogaSwgDQovLwkJICAgICBib3JkZXJfeSArIGJ3ICsgZ3Jp ZF9oZWlnaHQgKiBqLCANCi8vCQkgICAgIGdyaWRfd2lkdGgsIGdyaWRfaGVp Z2h0IC0gKGJ3K2J3KSk7DQoJcCA9IGFkZHB0KHNjcmVlbi0+ci5taW4sIA0K CQlQdChib3JkZXJfeCAtIGJ3ICsgZ3JpZF93aWR0aCAqIGksIGJvcmRlcl95 ICsgYncgKyBncmlkX2hlaWdodCAqIGopKTsNCglyID0gUnB0KHAsIGFkZHB0 KHAsIFB0KGdyaWRfd2lkdGggLCBncmlkX2hlaWdodC0gKGJ3K2J3KSkpKTsN CglkcmF3KHNjcmVlbiwgciwgYywgbmlsLCBaUCk7DQogICAgICBicmVhazsN CiAgfQ0KICBmbHVzaGltYWdlKGRpc3BsYXksIDEpOw0KfQ0KDQppbnQNCmxv bmdkZWFkZW5kX3AoaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyLCBp bnQgZW5kd2FsbCkNCnsNCiAgICBpbnQgZHggPSB4MiAtIHgxLCBkeSA9IHky IC0geTE7DQogICAgaW50IHNpZGV3YWxsczsNCg0KICAgIHNpZGV3YWxscyA9 IGVuZHdhbGwgfCAoZW5kd2FsbCA+PiAyIHwgZW5kd2FsbCA8PCAyKTsNCiAg ICBzaWRld2FsbHMgPSB+c2lkZXdhbGxzICYgV0FMTF9BTlk7DQoNCiAgICB3 aGlsZSgobWF6ZVt4Ml1beTJdICYgV0FMTF9BTlkpID09IHNpZGV3YWxscykN CiAgICB7DQoJeDIgKz0gZHg7DQoJeTIgKz0gZHk7DQogICAgfQ0KDQogICAg aWYoKG1hemVbeDJdW3kyXSAmIFdBTExfQU5ZKSA9PSAoc2lkZXdhbGxzIHwg ZW5kd2FsbCkpDQogICAgew0KCWVuZHdhbGwgPSAoZW5kd2FsbCA+PiAyIHwg ZW5kd2FsbCA8PCAyKSAmIFdBTExfQU5ZOw0KCXdoaWxlKHgxICE9IHgyIHx8 IHkxICE9IHkyKQ0KCXsNCgkgICAgeDEgKz0gZHg7DQoJICAgIHkxICs9IGR5 Ow0KCSAgICBkcmF3X3NvbGlkX3NxdWFyZSh4MSwgeTEsIGVuZHdhbGwsIHNr aXBDb2xvcik7DQoJICAgIG1hemVbeDFdW3kxXSB8PSBTT0xWRVJfVklTSVQ7 DQoJfQ0KCXJldHVybiAxOw0KICAgIH0NCiAgICBlbHNlDQoJcmV0dXJuIDA7 DQp9DQoNCi8qIEZpbmQgYWxsIGRlYWQgcmVnaW9ucyAtLSBhcmVhcyBmcm9t IHdoaWNoIHRoZSBnb2FsIGNhbm5vdCBiZSByZWFjaGVkIC0tDQogICBhbmQg bWFyayB0aGVtIHZpc2l0ZWQuICovDQp2b2lkDQpmaW5kX2RlYWRfcmVnaW9u cyh2b2lkKQ0Kew0KICAgIGludCB4LCB5LCBmbGlwcGVkOw0KDQogICAgLyog RmluZCBhbGwgbm90IFNPTFZFUl9WSVNJVCBzcXVhcmVzIGJvcmRlcmluZyBO T1RfREVBRCBzcXVhcmVzDQogICAgICAgYW5kIG1hcmsgdGhlbSBOT1RfREVB RCBhbHNvLiAgUmVwZWF0IHVudGlsIG5vIG1vcmUgc3VjaCBzcXVhcmVzLiAq Lw0KICAgIG1hemVbc3RhcnRfeF1bc3RhcnRfeV0gfD0gTk9UX0RFQUQ7DQog ICAgDQogICAgZG8NCiAgICB7DQoJZmxpcHBlZCA9IDA7DQoJZm9yKHggPSAw OyB4IDwgbWF6ZV9zaXplX3g7IHgrKykNCgkgICAgZm9yKHkgPSAwOyB5IDwg bWF6ZV9zaXplX3k7IHkrKykNCgkJaWYoIShtYXplW3hdW3ldICYgKFNPTFZF Ul9WSVNJVCB8IE5PVF9ERUFEKSkNCgkJICAgJiYgKCAgICh4ICYmIChtYXpl W3gtMV1beV0gJiBOT1RfREVBRCkpDQoJCSAgICAgICB8fCAoeSAmJiAobWF6 ZVt4XVt5LTFdICYgTk9UX0RFQUQpKSkpDQoJCXsNCgkJICAgIGZsaXBwZWQg PSAxOw0KCQkgICAgbWF6ZVt4XVt5XSB8PSBOT1RfREVBRDsNCgkJfQ0KCWZv cih4ID0gbWF6ZV9zaXplX3gtMTsgeCA+PSAwOyB4LS0pDQoJICAgIGZvcih5 ID0gbWF6ZV9zaXplX3ktMTsgeSA+PSAwOyB5LS0pDQoJCWlmKCEobWF6ZVt4 XVt5XSAmIChTT0xWRVJfVklTSVQgfCBOT1RfREVBRCkpDQoJCSAgICYmICgg ICAoeCAhPSBtYXplX3NpemVfeC0xICYmIChtYXplW3grMV1beV0gJiBOT1Rf REVBRCkpDQoJCSAgICAgICB8fCAoeSAhPSBtYXplX3NpemVfeS0xICYmICht YXplW3hdW3krMV0gJiBOT1RfREVBRCkpKSkNCgkJew0KCQkgICAgZmxpcHBl ZCA9IDE7DQoJCSAgICBtYXplW3hdW3ldIHw9IE5PVF9ERUFEOw0KCQl9DQog ICAgfQ0KICAgIHdoaWxlKGZsaXBwZWQpOw0KDQogICAgZm9yICh5ID0gMDsg eSA8IG1hemVfc2l6ZV95OyB5KyspDQogICAgICBmb3IgKHggPSAwOyB4IDwg bWF6ZV9zaXplX3g7IHgrKykNCiAgICAgIHsNCglpZiAobWF6ZVt4XVt5XSAm IE5PVF9ERUFEKQ0KCSAgbWF6ZVt4XVt5XSAmPSB+Tk9UX0RFQUQ7DQoJZWxz ZSBpZiAoIShtYXplW3hdW3ldICYgU09MVkVSX1ZJU0lUKSkNCgl7DQoJICBt YXplW3hdW3ldIHw9IFNPTFZFUl9WSVNJVDsNCgkgIGlmKCh4IDwgbG9nb194 IHx8IHggPiBsb2dvX3ggKyBsb2dvX3dpZHRoIC8gZ3JpZF93aWR0aCkgfHwN CgkgICAgICh5IDwgbG9nb195IHx8IHkgPiBsb2dvX3kgKyBsb2dvX2hlaWdo dCAvIGdyaWRfaGVpZ2h0KSkNCgkgIHsNCgkgICAgaWYgKCFtYXplW3hdW3ld ICYgV0FMTF9BTlkpIHsNCgkJUG9pbnQgcDsgUmVjdGFuZ2xlIHI7DQovLwkg ICAgICBYRmlsbFJlY3RhbmdsZShkcHksIHdpbiwgdWdjLA0KLy8JCQkgICAg IGJvcmRlcl94ICsgYncgKyBncmlkX3dpZHRoICogeCwNCi8vCQkJICAgICBi b3JkZXJfeSArIGJ3ICsgZ3JpZF9oZWlnaHQgKiB5LA0KLy8JCQkgICAgIGdy aWRfd2lkdGggLSAoYncrYncpLCBncmlkX2hlaWdodCAtIChidytidykpOw0K CQlwID0gYWRkcHQoc2NyZWVuLT5yLm1pbiwgDQoJCQlQdChib3JkZXJfeCAr IGJ3ICsgZ3JpZF93aWR0aCAqIHgsIGJvcmRlcl95ICsgYncgKyBncmlkX2hl aWdodCAqIHkpKTsNCgkJciA9IFJwdChwLCBhZGRwdChwLCBQdChncmlkX3dp ZHRoIC0gKGJ3K2J3KSwgZ3JpZF9oZWlnaHQtIChidytidykpKSk7DQoJCWRy YXcoc2NyZWVuLCByLCBzdXJyb3VuZENvbG9yLCBuaWwsIFpQKTsNCg0KCSAg ICB9IGVsc2UNCgkgICAgew0KCSAgICAgIGlmICghIChtYXplW3hdW3ldICYg V0FMTF9MRUZUKSkNCgkJZHJhd19zb2xpZF9zcXVhcmUoeCwgeSwgV0FMTF9M RUZULCBzdXJyb3VuZENvbG9yKTsNCgkgICAgICBpZiAoISAobWF6ZVt4XVt5 XSAmIFdBTExfUklHSFQpKQ0KCQlkcmF3X3NvbGlkX3NxdWFyZSh4LCB5LCBX QUxMX1JJR0hULCBzdXJyb3VuZENvbG9yKTsNCgkgICAgICBpZiAoISAobWF6 ZVt4XVt5XSAmIFdBTExfVE9QKSkNCgkJZHJhd19zb2xpZF9zcXVhcmUoeCwg eSwgV0FMTF9UT1AsIHN1cnJvdW5kQ29sb3IpOw0KCSAgICAgIGlmICghICht YXplW3hdW3ldICYgV0FMTF9CT1RUT00pKQ0KCQlkcmF3X3NvbGlkX3NxdWFy ZSh4LCB5LCBXQUxMX0JPVFRPTSwgc3Vycm91bmRDb2xvcik7DQoJICAgIH0N CgkgIH0NCgl9DQogICAgICB9DQogICAgZmx1c2hpbWFnZShkaXNwbGF5LCAx KTsNCn0NCg0Kc3RhdGljIHZvaWQNCnNvbHZlX21hemUgKHZvaWQpICAgICAg ICAgICAgICAgICAgICAgLyogc29sdmUgaXQgd2l0aCBncmFwaGljYWwgZmVl ZGJhY2sgKi8NCnsNCiAgICBpbnQgaSwgZGlyLCBmcm9tLCB4LCB5LCB3YXlz LCBidCA9IDA7DQoNCiAgICAvKiBwbHVnIHVwIHRoZSBzdXJyb3VuZGluZyB3 YWxsICovDQogICAgbWF6ZVtlbmRfeF1bZW5kX3ldIHw9IChXQUxMX1RPUCA+ PiBlbmRfZGlyKTsNCiAgICANCiAgICAvKiBpbml0aWFsaXplIHNlYXJjaCBw YXRoICovDQogICAgaSA9IDA7DQogICAgcGF0aFtpXS54ID0gZW5kX3g7DQog ICAgcGF0aFtpXS55ID0gZW5kX3k7DQogICAgcGF0aFtpXS5kaXIgPSAwOw0K ICAgIG1hemVbZW5kX3hdW2VuZF95XSB8PSBTT0xWRVJfVklTSVQ7DQogICAg DQogICAgLyogZG8gaXQgKi8NCiAgICB3aGlsZSAoMSkNCiAgICB7DQoJaWYg KCBtYXplW3BhdGhbaV0ueF1bcGF0aFtpXS55XSAmIFNUQVJUX1NRVUFSRSAp DQoJICAgIHJldHVybjsNCg0KCWlmKHJlc3RhcnQpDQoJCXJldHVybjsNCg0K CWlmKGVjYW5tb3VzZSgpKSB7DQoJCW0gPSBlbW91c2UoKTsNCgkJaWYobS5i dXR0b25zJjQpIHsNCgkJCWlmKGVtZW51aGl0KDMsICZtLCAmbWVudSkgPT0g MCkgDQoJCQkJZXhpdHMoMCk7DQoJCX0NCgl9DQoJDQoNCgkNCglpZiAoc29s dmVfZGVsYXkpIHNsZWVwIChzb2x2ZV9kZWxheSk7DQoJDQoJaWYoIXBhdGhb aV0uZGlyKQ0KCXsNCgkgICAgd2F5cyA9IDA7DQoJICAgIC8qIEZpcnN0IHZp c2l0IHRoaXMgc3F1YXJlLiAgV2hpY2ggYWRqYWNlbnQgc3F1YXJlcyBhcmUg b3Blbj8gKi8NCgkgICAgZm9yKGRpciA9IFdBTExfVE9QOyBkaXIgJiBXQUxM X0FOWTsgZGlyID4+PSAxKQ0KCSAgICB7DQoJCWlmKG1hemVbcGF0aFtpXS54 XVtwYXRoW2ldLnldICYgZGlyKQ0KCQkgICAgY29udGludWU7DQoJCQ0KCQl5 ID0gcGF0aFtpXS55IC0gISEoZGlyICYgV0FMTF9UT1ApICsgISEoZGlyICYg V0FMTF9CT1RUT00pOw0KCQl4ID0gcGF0aFtpXS54ICsgISEoZGlyICYgV0FM TF9SSUdIVCkgLSAhIShkaXIgJiBXQUxMX0xFRlQpOw0KCQkNCgkJaWYobWF6 ZVt4XVt5XSAmIFNPTFZFUl9WSVNJVCkNCgkJICAgIGNvbnRpbnVlOw0KCQkN CgkJZnJvbSA9IChkaXIgPDwgMiAmIFdBTExfQU5ZKSB8IChkaXIgPj4gMiAm IFdBTExfQU5ZKTsNCgkJLyogZG9uJ3QgZW50ZXIgb2J2aW91cyBkZWFkIGVu ZHMgKi8NCgkJaWYoKChtYXplW3hdW3ldICYgV0FMTF9BTlkpIHwgZnJvbSkg IT0gV0FMTF9BTlkpDQoJCXsNCgkJICAgIGlmKCFsb25nZGVhZGVuZF9wKHBh dGhbaV0ueCwgcGF0aFtpXS55LCB4LCB5LCBkaXIpKQ0KCQkJd2F5cyB8PSBk aXI7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCSAgICBkcmF3X3NvbGlkX3NxdWFy ZSh4LCB5LCBmcm9tLCBza2lwQ29sb3IpOw0KCQkgICAgbWF6ZVt4XVt5XSB8 PSBTT0xWRVJfVklTSVQ7DQoJCX0NCgkgICAgfQ0KCX0NCgllbHNlDQoJICAg IHdheXMgPSBwYXRoW2ldLndheXM7DQoJLyogd2F5cyBub3cgaGFzIGEgYml0 bWFzayBvZiBvcGVuIHBhdGhzLiAqLw0KCQ0KCWlmKCF3YXlzKQ0KCSAgICBn b3RvIGJhY2t0cmFjazsNCg0KCWlmICghaWdub3JhbnRfcCkNCgkgIHsNCgkg ICAgeCA9IHBhdGhbaV0ueCAtIHN0YXJ0X3g7DQoJICAgIHkgPSBwYXRoW2ld LnkgLSBzdGFydF95Ow0KCSAgICAvKiBjaG9pY2Ugb25lICovDQoJICAgIGlm KGFicyh5KSA8PSBhYnMoeCkpDQoJICAgICAgZGlyID0gKHggPiAwKSA/IFdB TExfTEVGVCA6IFdBTExfUklHSFQ7DQoJICAgIGVsc2UNCgkgICAgICBkaXIg PSAoeSA+IDApID8gV0FMTF9UT1AgOiBXQUxMX0JPVFRPTTsNCgkgICAgDQoJ ICAgIGlmKGRpciAmIHdheXMpDQoJICAgICAgZ290byBmb3VuZDsNCgkgICAg DQoJICAgIC8qIGNob2ljZSB0d28gKi8NCgkgICAgc3dpdGNoKGRpcikNCgkg ICAgICB7DQoJICAgICAgY2FzZSBXQUxMX0xFRlQ6DQoJICAgICAgY2FzZSBX QUxMX1JJR0hUOg0KCQlkaXIgPSAoeSA+IDApID8gV0FMTF9UT1AgOiBXQUxM X0JPVFRPTTsgYnJlYWs7DQoJICAgICAgY2FzZSBXQUxMX1RPUDoNCgkgICAg ICBjYXNlIFdBTExfQk9UVE9NOg0KCQlkaXIgPSAoeCA+IDApID8gV0FMTF9M RUZUIDogV0FMTF9SSUdIVDsNCgkgICAgICB9DQoJICAgIA0KCSAgICBpZihk aXIgJiB3YXlzKQ0KCSAgICAgIGdvdG8gZm91bmQ7DQoJICAgIA0KCSAgICAv KiBjaG9pY2UgdGhyZWUgKi8NCgkgICAgDQoJICAgIGRpciA9IChkaXIgPDwg MiAmIFdBTExfQU5ZKSB8IChkaXIgPj4gMiAmIFdBTExfQU5ZKTsNCgkgICAg aWYoZGlyICYgd2F5cykNCgkgICAgICBnb3RvIGZvdW5kOw0KCSAgICANCgkg ICAgLyogY2hvaWNlIGZvdXIgKi8NCgkgICAgZGlyID0gd2F5czsNCgkgICAg aWYoIWRpcikNCgkgICAgICBnb3RvIGJhY2t0cmFjazsNCgkgICAgDQoJICBm b3VuZDogOw0KCSAgfQ0KCWVsc2UNCgkgIHsNCgkgICAgaWYod2F5cyZXQUxM X1RPUCkNCgkgICAgICBkaXIgPSBXQUxMX1RPUDsNCgkgICAgZWxzZSBpZih3 YXlzJldBTExfTEVGVCkNCgkgICAgICBkaXIgPSBXQUxMX0xFRlQ7DQoJICAg IGVsc2UgaWYod2F5cyZXQUxMX0JPVFRPTSkNCgkgICAgICBkaXIgPSBXQUxM X0JPVFRPTTsNCgkgICAgZWxzZSBpZih3YXlzJldBTExfUklHSFQpDQoJICAg ICAgZGlyID0gV0FMTF9SSUdIVDsNCgkgICAgZWxzZQ0KCSAgICAgIGdvdG8g YmFja3RyYWNrOw0KCSAgfQ0KCWJ0ID0gMDsNCgl3YXlzICY9IH5kaXI7ICAv KiB0cmllZCB0aGlzIG9uZSAqLw0KCQ0KCXkgPSBwYXRoW2ldLnkgLSAhIShk aXIgJiBXQUxMX1RPUCkgKyAhIShkaXIgJiBXQUxMX0JPVFRPTSk7DQoJeCA9 IHBhdGhbaV0ueCArICEhKGRpciAmIFdBTExfUklHSFQpIC0gISEoZGlyICYg V0FMTF9MRUZUKTsNCgkNCgkvKiBhZHZhbmNlIGluIGRpcmVjdGlvbiBkaXIg Ki8NCglwYXRoW2ldLmRpciA9IGRpcjsNCglwYXRoW2ldLndheXMgPSB3YXlz Ow0KCWRyYXdfc29saWRfc3F1YXJlKHBhdGhbaV0ueCwgcGF0aFtpXS55LCBk aXIsIGxpdmVDb2xvcik7DQoJDQoJaSsrOw0KCXBhdGhbaV0uZGlyID0gMDsN CglwYXRoW2ldLndheXMgPSAwOw0KCXBhdGhbaV0ueCA9IHg7DQoJcGF0aFtp XS55ID0geTsNCgltYXplW3hdW3ldIHw9IFNPTFZFUl9WSVNJVDsNCgljb250 aW51ZTsNCg0KICAgIGJhY2t0cmFjazoNCglpZihpID09IDApDQoJew0KCSAg ICBwcmludCgiVW5zb2x2YWJsZSBtYXplLlxuIik7DQoJICAgIHJldHVybjsN Cgl9DQoNCglpZighYnQgJiYgIWlnbm9yYW50X3ApDQoJICAgIGZpbmRfZGVh ZF9yZWdpb25zKCk7DQoJYnQgPSAxOw0KCWZyb20gPSBwYXRoW2ktMV0uZGly Ow0KCWZyb20gPSAoZnJvbSA8PCAyICYgV0FMTF9BTlkpIHwgKGZyb20gPj4g MiAmIFdBTExfQU5ZKTsNCgkNCglkcmF3X3NvbGlkX3NxdWFyZShwYXRoW2ld LngsIHBhdGhbaV0ueSwgZnJvbSwgZGVhZENvbG9yKTsNCglpLS07DQogICAg fQ0KfSANCg0KDQoNCi8qDQogKiAgam1yIGFkZGl0aW9ucyBmb3IgSmFtaWUg WmF3aW5za2kncyA8and6QGp3ei5vcmc+IHNjcmVlbnNhdmVyIHN0dWZmLA0K ICogIG5vdGUgdGhhdCB0aGUgY29kZSBhYm92ZSB0aGlzIGhhcyBwcm9iYWJs eSBiZWVuIGhhY2tlZCBhYm91dCBpbiBzb21lDQogKiAgYXJiaXRyYXJ5IHdh eS4NCiAqLw0KDQoNCg0Kdm9pZA0Kc2NyZWVuaGFjayh2b2lkKQ0Kew0KICBp bnQgc2l6ZSwgcm9vdCwgZ2VuZXJhdG9yLCB0aGlzX2dlbjsNCg0KICByb290 ID0gMDsNCiAgc29sdmVfZGVsYXkgPSA1Ow0KICBwcmVfc29sdmVfZGVsYXkg PSAyMDAwOw0KICBwb3N0X3NvbHZlX2RlbGF5ID0gNDAwMDsNCiAgZ2VuZXJh dG9yID0gLTE7DQogIG1heF9sZW5ndGggPSA1Ow0KICBicmlkZ2VfcCA9IDA7 DQogIGlnbm9yYW50X3AgPSAwOw0KDQogIHNpemUgPSA1ICsgKHJhbmRvbSAo KSAlIDIwKTsNCiAgZ3JpZF93aWR0aCA9IGdyaWRfaGVpZ2h0ID0gc2l6ZTsN CiAgYncgPSAoc2l6ZSA+IDYgPyAzIDogKHNpemUtMSkvMik7DQoNCg0KICB4 ID0gMDsNCiAgeSA9IDA7DQoNCiAgc2V0X21hemVfc2l6ZXMgKER4KHNjcmVl bi0+ciksIER5KHNjcmVlbi0+cikpOw0KDQogIHJlc3RhcnQgPSByb290Ow0K DQogIHN5bmNfcCA9ICEocmFuZG9tKCkgJSAxMCk7DQoNCiAgd2hpbGUgKDEp IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJpbWFyeSBleGVj dXRpb24gbG9vcCBbIHJoZXNzIF0gKi8NCglpZihlY2FubW91c2UoKSkgew0K CQltID0gZW1vdXNlKCk7DQoJCWlmKG0uYnV0dG9ucyY0KSB7DQoJCQlpZihl bWVudWhpdCgzLCAmbSwgJm1lbnUpID09IDApIA0KCQkJCWV4aXRzKDApOw0K CQl9DQoJfQ0KICAgIGlmIChyZXN0YXJ0IHx8IHN0b3ApIGdvdG8gcG9wOw0K ICAgIHN3aXRjaCAoc3RhdGUpIHsNCiAgICBjYXNlIDE6DQogICAgICBpbml0 aWFsaXplX21hemUoKTsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgMjoNCiAg ICAgIGRyYXcoc2NyZWVuLCBzY3JlZW4tPnIsIGRpc3BsYXktPmJsYWNrLCBu aWwsIFpQKTsNCiAgICAgIGRyYXdfbWF6ZV9ib3JkZXIoKTsNCglmbHVzaGlt YWdlKGRpc3BsYXksIDEpOw0KICAgICAgYnJlYWs7DQogICAgY2FzZSAzOg0K ICAgICAgdGhpc19nZW4gPSBnZW5lcmF0b3I7DQogICAgICBpZih0aGlzX2dl bjwwIHx8IHRoaXNfZ2VuPjIpDQoJdGhpc19nZW4gPSByYW5kb20oKSUzOw0K DQogICAgICBzd2l0Y2godGhpc19nZW4pDQoJew0KCWNhc2UgMDoNCgkgIGNy ZWF0ZV9tYXplKCk7DQoJICBicmVhazsNCgljYXNlIDE6DQoJICBhbHRfY3Jl YXRlX21hemUoKTsNCgkgIGJyZWFrOw0KCWNhc2UgMjoNCgkgIHNldF9jcmVh dGVfbWF6ZSgpOw0KCSAgYnJlYWs7DQoJfQ0KCWZsdXNoaW1hZ2UoZGlzcGxh eSwgMSk7DQogICAgICBicmVhazsNCiAgICBjYXNlIDQ6DQogICAgICBzbGVl cCAocHJlX3NvbHZlX2RlbGF5KTsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2Ug NToNCiAgICAgIHNvbHZlX21hemUoKTsNCiAgICAgIGJyZWFrOw0KICAgIGNh c2UgNjoNCiAgICAgIHNsZWVwIChwb3N0X3NvbHZlX2RlbGF5KTsNCiAgICAg IHN0YXRlID0gMCA7DQogICAgICBkcmF3KHNjcmVlbiwgc2NyZWVuLT5yLCBk aXNwbGF5LT5ibGFjaywgbmlsLCBaUCk7DQogICAgICBicmVhazsNCiAgICBk ZWZhdWx0Og0KICAgICAgYWJvcnQgKCk7DQogICAgfQ0KICAgICsrc3RhdGU7 DQogIHBvcDoNCiAgICBpZiAocmVzdGFydCkNCiAgICAgIHsNCglyZXN0YXJ0 ID0gMDsNCglzdG9wID0gMDsNCglzdGF0ZSA9IDE7DQoJc2V0X21hemVfc2l6 ZXMgKER4KHNjcmVlbi0+ciksIER5KHNjcmVlbi0+cikpOw0KDQoJZHJhdyhz Y3JlZW4sIHNjcmVlbi0+ciwgZGlzcGxheS0+YmxhY2ssIG5pbCwgWlApOw0K CWZsdXNoaW1hZ2UoZGlzcGxheSwgMSk7DQoJc3luY19wID0gIShyYW5kb20o KSAlIDEwKTsNCiAgICAgIH0NCiAgfQ0KfQ0KDQoNCnZvaWQNCmVyZXNpemVk KGludCBuZXcpDQp7DQoJDQoJaWYobmV3ICYmIGdldHdpbmRvdyhkaXNwbGF5 LCBSZWZub25lKSA8IDApIHsNCgkJc3lzZmF0YWwoImNhbid0IHJlYXR0YWNo IHRvIHdpbmRvdyIpOw0KCX0JDQoJLy9mcHJpbnQoMiwgInNvcnJ5LCBjYW5u b3QgcmVzaXplXG4iKTsNCgkvL2V4aXRzKDApOw0KCXJlc3RhcnQgPSAxOw0K fQ0KDQoNCnZvaWQgDQptYWluKGludCBhcmdjLCBjaGFyICoqYXJndikNCnsN CglpbnQgZmQ7DQoNCglVU0VEKGFyZ2MsIGFyZ3YpOw0KCXNyYW5kKHRpbWUo MCkpOw0KDQoNCglpZihpbml0ZHJhdyhuaWwsIG5pbCwgIm1hemUiKSA8IDAp DQoJCXN5c2ZhdGFsKCJpbml0ZHJhdyBmYWlsZWQ6ICVyIik7DQoNCglsaXZl Q29sb3IgPSBhbGxvY2ltYWdlKGRpc3BsYXksIFJlY3QoMCwgMCwgMSwgMSks IHNjcmVlbi0+Y2hhbiwgMSwgREdyZWVuKTsNCglkZWFkQ29sb3IgPSBhbGxv Y2ltYWdlKGRpc3BsYXksIFJlY3QoMCwgMCwgMSwgMSksIHNjcmVlbi0+Y2hh biwgMSwgRFJlZCk7DQoJc2tpcENvbG9yPSBhbGxvY2ltYWdlKGRpc3BsYXks IFJlY3QoMCwgMCwgMSwgMSksIHNjcmVlbi0+Y2hhbiwgMSwgRE1hZ2VudGEp Ow0KCXN1cnJvdW5kQ29sb3I9IGFsbG9jaW1hZ2UoZGlzcGxheSwgUmVjdCgw LCAwLCAxLCAxKSwgc2NyZWVuLT5jaGFuLCAxLCBEUGFsZWJsdWUpOw0KDQoJ ZmQgPSBvcGVuKCIvbGliL2ZhY2UvNDh4NDh4NC9nL2dsZW5kYS4xIiwgT1JF QUQpOw0KCWlmKGZkIDwgMCkNCgkJc3lzZmF0YWwoImNhbm5vdCBvcGVuIC9s aWIvZmFjZS80OHg0OHg0L2cvZ2xlbmRhLjE6ICVyIik7DQoNCglnbGVuZGEg PSByZWFkaW1hZ2UoZGlzcGxheSwgZmQsIDApOw0KCWlmKGdsZW5kYSA9PSBu aWwpDQoJCXN5c2ZhdGFsKCJjYW5ub3QgbG9hZCBnbGVuZGEncyBpbWFnZTog JXIiKTsNCg0KCWRyYXcoc2NyZWVuLCBzY3JlZW4tPnIsIGRpc3BsYXktPmJs YWNrLCBuaWwsIFpQKTsNCglmbHVzaGltYWdlKGRpc3BsYXksIDEpOw0KDQoJ ZWluaXQoRW1vdXNlKTsNCgllcmVzaXplZCgwKTsNCglzY3JlZW5oYWNrKCk7 DQp9DQo= --0-174873200-1029484758=:44825--