[ODE] Bjarne Stroustrup sings Snoop Dogg

Martin C. Martin martin at metahuman.org
Tue Apr 30 14:30:02 2002


This is a multi-part message in MIME format.
--------------BF5B97BC2C62B1B2038366B8
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Here are the new C++ rappers for the ODE.  These ones use inheritance,
so that e.g. dBallAndSocketJoint is derived from dJoint.

This breaks test_chain2, so I've included a fixed version.

odecpp.h won't quite compile out of the box: you need to get rid of
dUniversalJoint::getAnchor2().  I've also included wrappers for the
Transform/Rotate functions I posted earlier, as well as equivalent ones
for dGeoms.  In other words, anyone should be able to use odecpp.h, just
delete wrappers for functions/classes you don't have.

Cheers,
Martin
--------------BF5B97BC2C62B1B2038366B8
Content-Type: application/x-unknown-content-type-hfile;
 name="odecpp.h"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
 filename="odecpp.h"

LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioNCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogKiBPcGVuIER5
bmFtaWNzIEVuZ2luZSwgQ29weXJpZ2h0IChDKSAyMDAxIFJ1c3NlbGwgTC4gU21pdGguICAg
ICAgICAgICAgKg0KICogICBFbWFpbDogcnVzc0BxMTIub3JnICAgV2ViOiB3d3cucTEyLm9y
ZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAqICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAq
DQogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1
dGUgaXQgYW5kL29yICAgICAgICAgKg0KICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyAgICAgICAgICAgICoNCiAqIExpY2Vu
c2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl
ciAgICAgICAgICAqDQogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlv
dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgKg0KICogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICoNCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0
IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqDQogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7
IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKg0KICogTUVS
Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUg
dGhlIEdOVSAgICAgICoNCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt
b3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAqDQogKiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKg0KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExl
c3NlciBHZW5lcmFsIFB1YmxpYyAgICAgICoNCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnkgKHNlZSB0aGUgZmlsZSBMSUNFTlNFLlRYVCk7IGlmIG5vdCwgICAqDQogKiB3
cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUg
UGxhY2UsICAgICAgICAgKg0KICogU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcg
VVNBLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAqICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAqDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KI2lmbmRlZiBfT0RFX09ERUNQUF9I
Xw0KI2RlZmluZSBfT0RFX09ERUNQUF9IXw0KI2lmZGVmIF9fY3BsdXNwbHVzDQoNCiNpbmNs
dWRlIDxvZGUvZXJyb3IuaD4NCg0KLyogQysrIGludGVyZmFjZSBmb3IgZXZlcnl0aGluZyAq
Lw0KDQoNCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICBkV29ybGQgIC8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vDQpjbGFzcyBkV29ybGQgew0KICBkV29ybGRJRCBfaWQ7DQoNCiAgLy8gSW50
ZW50aW9uYWxseSB1bmRlZmluZWQuICBEb24ndCB1c2UgdGhlc2UuDQogIGRXb3JsZCAoY29u
c3QgZFdvcmxkICYpOw0KICB2b2lkIG9wZXJhdG9yPSAoY29uc3QgZFdvcmxkICYpOw0KDQpw
dWJsaWM6DQogIGRXb3JsZCgpDQogICAgeyBfaWQgPSBkV29ybGRDcmVhdGUoKTsgfQ0KICB+
ZFdvcmxkKCkNCiAgICB7IGRXb3JsZERlc3Ryb3kgKF9pZCk7IH0NCg0KICBkV29ybGRJRCBp
ZCgpIGNvbnN0DQogICAgeyByZXR1cm4gX2lkOyB9DQogIG9wZXJhdG9yIGRXb3JsZElEKCkN
CiAgICB7IHJldHVybiBfaWQ7IH0NCg0KICB2b2lkIHNldEdyYXZpdHkgKGRSZWFsIHgsIGRS
ZWFsIHksIGRSZWFsIHopDQogICAgeyBkV29ybGRTZXRHcmF2aXR5IChfaWQseCx5LHopOyB9
DQogIHZvaWQgZ2V0R3Jhdml0eSAoZFZlY3RvcjMgZykgY29uc3QNCiAgICB7IGRXb3JsZEdl
dEdyYXZpdHkgKF9pZCxnKTsgfQ0KDQogIHZvaWQgc2V0Q0ZNKGRSZWFsIGNmbSkNCiAgICB7
IGRXb3JsZFNldENGTShfaWQsIGNmbSk7IH0NCiAgZFJlYWwgZ2V0Q0ZNKCkgY29uc3QNCiAg
ICB7IHJldHVybiBkV29ybGRHZXRDRk0oX2lkKTsgfQ0KDQogIHZvaWQgc2V0RVJQKGRSZWFs
IGVycCkNCiAgICB7IGRXb3JsZFNldEVSUChfaWQsIGVycCk7IH0NCiAgZFJlYWwgZ2V0RVJQ
KCkgY29uc3QNCiAgICB7IHJldHVybiBkV29ybGRHZXRFUlAoX2lkKTsgfQ0KDQogIHZvaWQg
c3RlcCAoZFJlYWwgc3RlcHNpemUpDQogICAgeyBkV29ybGRTdGVwIChfaWQsc3RlcHNpemUp
OyB9DQp9Ow0KDQoNCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICBkQm9keSAgLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8NCmNsYXNzIGRCb2R5IHsNCiAgZEJvZHlJRCBfaWQ7DQoNCiAgLy8g
SW50ZW50aW9uYWxseSB1bmRlZmluZWQuICBEb24ndCB1c2UgdGhlc2UuDQogIGRCb2R5IChj
b25zdCBkQm9keSAmKTsNCiAgdm9pZCBvcGVyYXRvcj0gKGNvbnN0IGRCb2R5ICYpOw0KDQpw
dWJsaWM6DQogIGRCb2R5KCkNCiAgICB7IF9pZCA9IDA7IH0NCiAgZEJvZHkgKGRXb3JsZElE
IHdvcmxkKQ0KICAgIHsgX2lkID0gZEJvZHlDcmVhdGUgKHdvcmxkKTsgfQ0KICB+ZEJvZHko
KQ0KICAgIHsgaWYgKF9pZCkgZEJvZHlEZXN0cm95IChfaWQpOyB9DQoNCiAgdm9pZCBjcmVh
dGUgKGRXb3JsZElEIHdvcmxkKSB7DQogICAgaWYgKF9pZCkgZEJvZHlEZXN0cm95IChfaWQp
Ow0KICAgIF9pZCA9IGRCb2R5Q3JlYXRlICh3b3JsZCk7DQogIH0NCg0KICBkQm9keUlEIGlk
KCkgY29uc3QNCiAgICB7IHJldHVybiBfaWQ7IH0NCiAgb3BlcmF0b3IgZEJvZHlJRCgpDQog
ICAgeyByZXR1cm4gX2lkOyB9DQoNCiAgdm9pZCBzZXREYXRhICh2b2lkICpkYXRhKQ0KICAg
IHsgZEJvZHlTZXREYXRhIChfaWQsZGF0YSk7IH0NCiAgdm9pZCAqZ2V0RGF0YSgpIGNvbnN0
DQogICAgeyByZXR1cm4gZEJvZHlHZXREYXRhIChfaWQpOyB9DQoNCiAgdm9pZCBzZXRQb3Np
dGlvbiAoZFJlYWwgeCwgZFJlYWwgeSwgZFJlYWwgeikNCiAgICB7IGRCb2R5U2V0UG9zaXRp
b24gKF9pZCx4LHkseik7IH0NCiAgdm9pZCBzZXRSb3RhdGlvbiAoY29uc3QgZE1hdHJpeDMg
UikNCiAgICB7IGRCb2R5U2V0Um90YXRpb24gKF9pZCxSKTsgfQ0KICB2b2lkIHNldFF1YXRl
cm5pb24gKGNvbnN0IGRRdWF0ZXJuaW9uIHEpDQogICAgeyBkQm9keVNldFF1YXRlcm5pb24g
KF9pZCxxKTsgfQ0KICB2b2lkIHNldExpbmVhclZlbCAgKGRSZWFsIHgsIGRSZWFsIHksIGRS
ZWFsIHopDQogICAgeyBkQm9keVNldExpbmVhclZlbCAoX2lkLHgseSx6KTsgfQ0KICB2b2lk
IHNldEFuZ3VsYXJWZWwgKGRSZWFsIHgsIGRSZWFsIHksIGRSZWFsIHopDQogICAgeyBkQm9k
eVNldEFuZ3VsYXJWZWwgKF9pZCx4LHkseik7IH0NCg0KICBjb25zdCBkUmVhbCAqIGdldFBv
c2l0aW9uKCkgY29uc3QNCiAgICB7IHJldHVybiBkQm9keUdldFBvc2l0aW9uIChfaWQpOyB9
DQogIGNvbnN0IGRSZWFsICogZ2V0Um90YXRpb24oKSBjb25zdA0KICAgIHsgcmV0dXJuIGRC
b2R5R2V0Um90YXRpb24gKF9pZCk7IH0NCiAgY29uc3QgZFJlYWwgKiBnZXRRdWF0ZXJuaW9u
KCkgY29uc3QNCiAgICB7IHJldHVybiBkQm9keUdldFF1YXRlcm5pb24gKF9pZCk7IH0NCiAg
Y29uc3QgZFJlYWwgKiBnZXRMaW5lYXJWZWwoKSBjb25zdA0KICAgIHsgcmV0dXJuIGRCb2R5
R2V0TGluZWFyVmVsIChfaWQpOyB9DQogIGNvbnN0IGRSZWFsICogZ2V0QW5ndWxhclZlbCgp
IGNvbnN0DQogICAgeyByZXR1cm4gZEJvZHlHZXRBbmd1bGFyVmVsIChfaWQpOyB9DQoNCiAg
Ly8gQm9keSB0byB3b3JsZA0KICB2b2lkIHRyYW5zZm9ybShkUmVhbCB4X2JvZHksIGRSZWFs
IHlfYm9keSwgZFJlYWwgel9ib2R5LA0KICAgICAgZFZlY3RvcjMgd29ybGRfcmVsYXRpdmUp
IGNvbnN0DQogIHsgZEJvZHlUcmFuc2Zvcm1WZWN0b3IoX2lkLCB4X2JvZHksIHlfYm9keSwg
el9ib2R5LCB3b3JsZF9yZWxhdGl2ZSk7IH0NCiAgdm9pZCB0cmFuc2Zvcm0oY29uc3QgZFZl
Y3RvcjMgYm9keV9yZWxhdGl2ZSwgZFZlY3RvcjMgd29ybGRfcmVsYXRpdmUpIGNvbnN0DQog
IHsgZEJvZHlUcmFuc2Zvcm1WZWN0b3IoX2lkLCBib2R5X3JlbGF0aXZlWzBdLCBib2R5X3Jl
bGF0aXZlWzFdLCBib2R5X3JlbGF0aXZlWzJdLCANCiAgICAgIHdvcmxkX3JlbGF0aXZlKTsg
fQ0KDQogIHZvaWQgcm90YXRlKGRSZWFsIHhfYm9keSwgZFJlYWwgeV9ib2R5LCBkUmVhbCB6
X2JvZHksDQogICAgICBkVmVjdG9yMyB3b3JsZF9yZWxhdGl2ZSkgY29uc3QNCiAgeyBkQm9k
eVJvdGF0ZVZlY3RvcihfaWQsIHhfYm9keSwgeV9ib2R5LCB6X2JvZHksIHdvcmxkX3JlbGF0
aXZlKTsgfQ0KICB2b2lkIHJvdGF0ZShjb25zdCBkVmVjdG9yMyBib2R5X3JlbGF0aXZlLA0K
ICAgICAgZFZlY3RvcjMgd29ybGRfcmVsYXRpdmUpIGNvbnN0DQogIHsgZEJvZHlSb3RhdGVW
ZWN0b3IoX2lkLCBib2R5X3JlbGF0aXZlWzBdLCBib2R5X3JlbGF0aXZlWzFdLCBib2R5X3Jl
bGF0aXZlWzJdLA0KICAgICAgd29ybGRfcmVsYXRpdmUpOyB9DQoNCiAgLy8gV29ybGQgdG8g
Ym9keQ0KICB2b2lkIGludmVyc2VUcmFuc2Zvcm0oZFJlYWwgeF93b3JsZCwgZFJlYWwgeV93
b3JsZCwgZFJlYWwgel93b3JsZCwNCiAgICAgIGRWZWN0b3IzIGJvZHlfcmVsYXRpdmUpIGNv
bnN0DQogIHsgZEJvZHlJbnZlcnNlVHJhbnNmb3JtVmVjdG9yKF9pZCwgeF93b3JsZCwgeV93
b3JsZCwgel93b3JsZCwgYm9keV9yZWxhdGl2ZSk7IH0NCiAgdm9pZCBpbnZlcnNlVHJhbnNm
b3JtKGNvbnN0IGRWZWN0b3IzIHdvcmxkX3JlbGF0aXZlLA0KICAgICAgZFZlY3RvcjMgYm9k
eV9yZWxhdGl2ZSkgY29uc3QNCiAgeyBkQm9keUludmVyc2VUcmFuc2Zvcm1WZWN0b3IoX2lk
LCB3b3JsZF9yZWxhdGl2ZVswXSwgd29ybGRfcmVsYXRpdmVbMV0sIA0KICAgICAgd29ybGRf
cmVsYXRpdmVbMl0sIGJvZHlfcmVsYXRpdmUpOyB9DQoNCiAgdm9pZCBpbnZlcnNlUm90YXRl
KGRSZWFsIHhfd29ybGQsIGRSZWFsIHlfd29ybGQsIGRSZWFsIHpfd29ybGQsDQogICAgICBk
VmVjdG9yMyBib2R5X3JlbGF0aXZlKSBjb25zdA0KICB7IGRCb2R5SW52ZXJzZVJvdGF0ZVZl
Y3RvcihfaWQsIHhfd29ybGQsIHlfd29ybGQsIHpfd29ybGQsIGJvZHlfcmVsYXRpdmUpOyB9
DQogIHZvaWQgaW52ZXJzZVJvdGF0ZShjb25zdCBkVmVjdG9yMyB3b3JsZF9yZWxhdGl2ZSwg
ZFZlY3RvcjMgYm9keV9yZWxhdGl2ZSkgY29uc3QNCiAgeyBkQm9keUludmVyc2VSb3RhdGVW
ZWN0b3IoX2lkLCB3b3JsZF9yZWxhdGl2ZVswXSwgd29ybGRfcmVsYXRpdmVbMV0sIA0KICAg
ICAgd29ybGRfcmVsYXRpdmVbMl0sIGJvZHlfcmVsYXRpdmUpOyB9DQoNCg0KICB2b2lkIHNl
dE1hc3MgKGNvbnN0IGRNYXNzICptYXNzKQ0KICAgIHsgZEJvZHlTZXRNYXNzIChfaWQsbWFz
cyk7IH0NCiAgdm9pZCBnZXRNYXNzIChkTWFzcyAqbWFzcykgY29uc3QNCiAgICB7IGRCb2R5
R2V0TWFzcyAoX2lkLG1hc3MpOyB9DQoNCiAgdm9pZCBhZGRGb3JjZSAoZFJlYWwgZngsIGRS
ZWFsIGZ5LCBkUmVhbCBmeikNCiAgICB7IGRCb2R5QWRkRm9yY2UgKF9pZCwgZngsIGZ5LCBm
eik7IH0NCiAgdm9pZCBhZGRUb3JxdWUgKGRSZWFsIGZ4LCBkUmVhbCBmeSwgZFJlYWwgZnop
DQogICAgeyBkQm9keUFkZFRvcnF1ZSAoX2lkLCBmeCwgZnksIGZ6KTsgfQ0KICB2b2lkIGFk
ZFJlbEZvcmNlIChkUmVhbCBmeCwgZFJlYWwgZnksIGRSZWFsIGZ6KQ0KICAgIHsgZEJvZHlB
ZGRSZWxGb3JjZSAoX2lkLCBmeCwgZnksIGZ6KTsgfQ0KICB2b2lkIGFkZFJlbFRvcnF1ZSAo
ZFJlYWwgZngsIGRSZWFsIGZ5LCBkUmVhbCBmeikNCiAgICB7IGRCb2R5QWRkUmVsVG9ycXVl
IChfaWQsIGZ4LCBmeSwgZnopOyB9DQogIHZvaWQgYWRkRm9yY2VBdFBvcyAoZFJlYWwgZngs
IGRSZWFsIGZ5LCBkUmVhbCBmeiwNCgkJICAgICAgZFJlYWwgcHgsIGRSZWFsIHB5LCBkUmVh
bCBweikNCiAgICB7IGRCb2R5QWRkRm9yY2VBdFBvcyAoX2lkLCBmeCwgZnksIGZ6LCBweCwg
cHksIHB6KTsgfQ0KICB2b2lkIGFkZEZvcmNlQXRSZWxQb3MgKGRSZWFsIGZ4LCBkUmVhbCBm
eSwgZFJlYWwgZnosDQoJCSAgICAgIGRSZWFsIHB4LCBkUmVhbCBweSwgZFJlYWwgcHopDQog
ICAgeyBkQm9keUFkZEZvcmNlQXRSZWxQb3MgKF9pZCwgZngsIGZ5LCBmeiwgcHgsIHB5LCBw
eik7IH0NCiAgdm9pZCBhZGRSZWxGb3JjZUF0UG9zIChkUmVhbCBmeCwgZFJlYWwgZnksIGRS
ZWFsIGZ6LA0KCQkJIGRSZWFsIHB4LCBkUmVhbCBweSwgZFJlYWwgcHopDQogICAgeyBkQm9k
eUFkZFJlbEZvcmNlQXRQb3MgKF9pZCwgZngsIGZ5LCBmeiwgcHgsIHB5LCBweik7IH0NCiAg
dm9pZCBhZGRSZWxGb3JjZUF0UmVsUG9zIChkUmVhbCBmeCwgZFJlYWwgZnksIGRSZWFsIGZ6
LA0KCQkJICAgIGRSZWFsIHB4LCBkUmVhbCBweSwgZFJlYWwgcHopDQogICAgeyBkQm9keUFk
ZFJlbEZvcmNlQXRSZWxQb3MgKF9pZCwgZngsIGZ5LCBmeiwgcHgsIHB5LCBweik7IH0NCg0K
ICBjb25zdCBkUmVhbCAqIGdldEZvcmNlKCkgY29uc3QNCiAgICB7IHJldHVybiBkQm9keUdl
dEZvcmNlKF9pZCk7IH0NCiAgY29uc3QgZFJlYWwgKiBnZXRUb3JxdWUoKSBjb25zdA0KICAg
IHsgcmV0dXJuIGRCb2R5R2V0VG9ycXVlKF9pZCk7IH0NCg0KICB2b2lkIGdldFJlbFBvaW50
UG9zIChkUmVhbCBweCwgZFJlYWwgcHksIGRSZWFsIHB6LCBkVmVjdG9yMyByZXN1bHQpIGNv
bnN0DQogICAgeyBkQm9keUdldFJlbFBvaW50UG9zIChfaWQsIHB4LCBweSwgcHosIHJlc3Vs
dCk7IH0NCiAgdm9pZCBnZXRSZWxQb2ludFZlbCAoZFJlYWwgcHgsIGRSZWFsIHB5LCBkUmVh
bCBweiwgZFZlY3RvcjMgcmVzdWx0KSBjb25zdA0KICAgIHsgZEJvZHlHZXRSZWxQb2ludFZl
bCAoX2lkLCBweCwgcHksIHB6LCByZXN1bHQpOyB9DQoNCiAgdm9pZCBzZXRGaW5pdGVSb3Rh
dGlvbk1vZGUoaW50IG1vZGUpDQogICAgeyBkQm9keVNldEZpbml0ZVJvdGF0aW9uTW9kZShf
aWQsIG1vZGUpOyB9DQogIHZvaWQgc2V0RmluaXRlUm90YXRpb25BeGlzKGRSZWFsIHgsIGRS
ZWFsIHksIGRSZWFsIHopDQogICAgeyBkQm9keVNldEZpbml0ZVJvdGF0aW9uQXhpcyhfaWQs
IHgsIHksIHopOyB9DQoNCiAgaW50IGdldEZpbml0ZVJvdGF0aW9uTW9kZSgpIGNvbnN0DQog
ICAgeyByZXR1cm4gZEJvZHlHZXRGaW5pdGVSb3RhdGlvbk1vZGUoX2lkKTsgfQ0KICB2b2lk
IGdldEZpbml0ZVJvdGF0aW9uQXhpcyhkVmVjdG9yMyByZXN1bHQpIGNvbnN0DQogICAgeyBk
Qm9keUdldEZpbml0ZVJvdGF0aW9uQXhpcyhfaWQsIHJlc3VsdCk7IH0NCg0KICBpbnQgZ2V0
TnVtSm9pbnRzKCkgY29uc3QNCiAgICB7IHJldHVybiBkQm9keUdldE51bUpvaW50cyhfaWQp
OyB9DQogIGRKb2ludElEIGdldEpvaW50IChpbnQgaW5kZXgpIGNvbnN0DQogICAgeyByZXR1
cm4gZEJvZHlHZXRKb2ludChfaWQsIGluZGV4KTsgfQ0KDQogIHZvaWQgZW5hYmxlKCkNCiAg
ICB7IGRCb2R5RW5hYmxlKF9pZCk7IH0NCiAgdm9pZCBkaXNhYmxlKCkNCiAgICB7IGRCb2R5
RGlzYWJsZShfaWQpOyB9DQogIGludCBpc0VuZGFibGVkKCkgY29uc3QNCiAgICB7IHJldHVy
biBkQm9keUlzRW5hYmxlZChfaWQpOyB9DQoNCiAgaW50IGlzQ29ubmVjdGVkVG8gKGRCb2R5
SUQgYm9keSkgY29uc3QNCiAgICB7IHJldHVybiBkQXJlQ29ubmVjdGVkIChfaWQsIGJvZHkp
OyB9DQp9Ow0KDQoNCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICBkSm9pbnRHcm91cCAgLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8NCg0KY2xhc3MgZEpvaW50R3JvdXAgew0KICBkSm9pbnRH
cm91cElEIF9pZDsNCg0KICAvLyBJbnRlbnRpb25hbGx5IHVuZGVmaW5lZC4gIERvbid0IHVz
ZSB0aGVzZS4NCiAgZEpvaW50R3JvdXAgKGNvbnN0IGRKb2ludEdyb3VwICYpOw0KICB2b2lk
IG9wZXJhdG9yPSAoY29uc3QgZEpvaW50R3JvdXAgJik7DQoNCnB1YmxpYzoNCiAgZEpvaW50
R3JvdXAoKQ0KICAgIHsgX2lkID0gZEpvaW50R3JvdXBDcmVhdGUgKDApOyB9DQogIH5kSm9p
bnRHcm91cCgpDQogICAgeyBkSm9pbnRHcm91cERlc3Ryb3kgKF9pZCk7IH0NCg0KICBkSm9p
bnRHcm91cElEIGlkKCkgY29uc3QNCiAgICB7IHJldHVybiBfaWQ7IH0NCiAgb3BlcmF0b3Ig
ZEpvaW50R3JvdXBJRCgpDQogICAgeyByZXR1cm4gX2lkOyB9DQoNCiAgdm9pZCBlbXB0eSgp
DQogICAgeyBkSm9pbnRHcm91cEVtcHR5IChfaWQpOyB9DQp9Ow0KDQoNCi8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vICBkSm9pbnQgYW5kIHN1YmNsYXNzZXMgIC8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vDQoNCmNsYXNzIGRKb2ludCB7DQpwcml2YXRlOg0KICAvLyBJbnRlbnRpb25hbGx5
IHVuZGVmaW5lZC4gIERvbid0IHVzZSB0aGVzZS4NCiAgZEpvaW50IChjb25zdCBkSm9pbnQg
JikgOw0KICB2b2lkIG9wZXJhdG9yPSAoY29uc3QgZEpvaW50ICYpOw0KDQpwdWJsaWM6DQog
IGRKb2ludCgpDQogICAgeyBfaWQgPSAwOyB9DQogIH5kSm9pbnQoKQ0KICAgIHsgaWYgKF9p
ZCkgZEpvaW50RGVzdHJveSAoX2lkKTsgfQ0KDQogIGRKb2ludElEIGlkKCkgY29uc3QNCiAg
ICB7IHJldHVybiBfaWQ7IH0NCiAgb3BlcmF0b3IgZEpvaW50SUQoKQ0KICAgIHsgcmV0dXJu
IF9pZDsgfQ0KDQogIHZvaWQgYXR0YWNoIChkQm9keUlEIGJvZHkxLCBkQm9keUlEIGJvZHky
KQ0KICAgIHsgZEpvaW50QXR0YWNoKF9pZCwgYm9keTEsIGJvZHkyKTsgfQ0KDQogIHZvaWQg
c2V0RGF0YSh2b2lkICpkYXRhKQ0KICAgIHsgZEpvaW50U2V0RGF0YShfaWQsIGRhdGEpOyB9
DQogIHZvaWQgKmdldERhdGEodm9pZCAqZGF0YSkgY29uc3QNCiAgICB7IHJldHVybiBkSm9p
bnRHZXREYXRhKF9pZCk7IH0NCg0KICBpbnQgZ2V0VHlwZSgpIGNvbnN0DQogICAgeyByZXR1
cm4gZEpvaW50R2V0VHlwZShfaWQpOyB9DQoNCiAgZEJvZHlJRCBnZXRCb2R5KGludCBpbmRl
eCkgY29uc3QNCiAgICB7IHJldHVybiBkSm9pbnRHZXRCb2R5KF9pZCwgaW5kZXgpOyB9DQoN
CnByb3RlY3RlZDoNCiAgZEpvaW50SUQgX2lkOw0KfTsNCg0KDQpjbGFzcyBkQmFsbEFuZFNv
Y2tldEpvaW50IDogcHVibGljIGRKb2ludCB7DQpwcml2YXRlOg0KICAvLyBJbnRlbnRpb25h
bGx5IHVuZGVmaW5lZC4gIERvbid0IHVzZSB0aGVzZS4NCiAgZEJhbGxBbmRTb2NrZXRKb2lu
dCAoY29uc3QgZEJhbGxBbmRTb2NrZXRKb2ludCAmKTsgDQogIHZvaWQgb3BlcmF0b3I9IChj
b25zdCBkQmFsbEFuZFNvY2tldEpvaW50ICYpOw0KDQpwdWJsaWM6DQogIGRCYWxsQW5kU29j
a2V0Sm9pbnQoKSB7IH0NCiAgZEJhbGxBbmRTb2NrZXRKb2ludChkV29ybGRJRCB3b3JsZCwg
ZEpvaW50R3JvdXBJRCBncm91cD0wKQ0KICAgIHsgX2lkID0gZEpvaW50Q3JlYXRlQmFsbCAo
d29ybGQsIGdyb3VwKTsgfQ0KDQogIHZvaWQgY3JlYXRlKGRXb3JsZElEIHdvcmxkLCBkSm9p
bnRHcm91cElEIGdyb3VwPTApIHsNCiAgICBpZiAoX2lkKSBkSm9pbnREZXN0cm95IChfaWQp
Ow0KICAgIF9pZCA9IGRKb2ludENyZWF0ZUJhbGwgKHdvcmxkLCBncm91cCk7DQogIH0NCg0K
ICB2b2lkIHNldEFuY2hvciAoZFJlYWwgeCwgZFJlYWwgeSwgZFJlYWwgeikNCiAgICB7IGRK
b2ludFNldEJhbGxBbmNob3IgKF9pZCwgeCwgeSwgeik7IH0NCiAgdm9pZCBnZXRBbmNob3Ig
KGRWZWN0b3IzIHJlc3VsdCkgY29uc3QNCiAgICB7IGRKb2ludEdldEJhbGxBbmNob3IgKF9p
ZCwgcmVzdWx0KTsgfQ0KfSA7DQoNCg0KY2xhc3MgZEhpbmdlSm9pbnQgOiBwdWJsaWMgZEpv
aW50IHsNCiAgLy8gSW50ZW50aW9uYWxseSB1bmRlZmluZWQuICBEb24ndCB1c2UgdGhlc2Uu
DQogIGRIaW5nZUpvaW50IChjb25zdCBkSGluZ2VKb2ludCAmKTsNCiAgdm9pZCBvcGVyYXRv
ciA9IChjb25zdCBkSGluZ2VKb2ludCAmKTsNCg0KcHVibGljOg0KICBkSGluZ2VKb2ludCgp
IHsgfQ0KICBkSGluZ2VKb2ludChkV29ybGRJRCB3b3JsZCwgZEpvaW50R3JvdXBJRCBncm91
cD0wKQ0KICAgIHsgX2lkID0gZEpvaW50Q3JlYXRlSGluZ2UgKHdvcmxkLCBncm91cCk7IH0N
Cg0KICB2b2lkIGNyZWF0ZShkV29ybGRJRCB3b3JsZCwgZEpvaW50R3JvdXBJRCBncm91cD0w
KSB7DQogICAgaWYgKF9pZCkgZEpvaW50RGVzdHJveSAoX2lkKTsNCiAgICBfaWQgPSBkSm9p
bnRDcmVhdGVIaW5nZSAod29ybGQsIGdyb3VwKTsNCiAgfQ0KDQogIHZvaWQgc2V0QW5jaG9y
IChkUmVhbCB4LCBkUmVhbCB5LCBkUmVhbCB6KQ0KICAgIHsgZEpvaW50U2V0SGluZ2VBbmNo
b3IgKF9pZCwgeCwgeSwgeik7IH0NCiAgdm9pZCBnZXRBbmNob3IgKGRWZWN0b3IzIHJlc3Vs
dCkgY29uc3QNCiAgICB7IGRKb2ludEdldEhpbmdlQW5jaG9yIChfaWQsIHJlc3VsdCk7IH0N
Cg0KICB2b2lkIHNldEF4aXMgKGRSZWFsIHgsIGRSZWFsIHksIGRSZWFsIHopDQogICAgeyBk
Sm9pbnRTZXRIaW5nZUF4aXMgKF9pZCwgeCwgeSwgeik7IH0NCiAgdm9pZCBnZXRBeGlzIChk
VmVjdG9yMyByZXN1bHQpIGNvbnN0DQogICAgeyBkSm9pbnRHZXRIaW5nZUF4aXMgKF9pZCwg
cmVzdWx0KTsgfQ0KDQogIHZvaWQgc2V0UGFyYW0oaW50IHBhcmFtZXRlciwgZFJlYWwgdmFs
dWUpDQogICAgeyBkSm9pbnRTZXRIaW5nZVBhcmFtKF9pZCwgcGFyYW1ldGVyLCB2YWx1ZSk7
IH0NCiAgZFJlYWwgZ2V0UGFyYW0oaW50IHBhcmFtZXRlcikgY29uc3QNCiAgICB7IHJldHVy
biBkSm9pbnRHZXRIaW5nZVBhcmFtKF9pZCwgcGFyYW1ldGVyKTsgfQ0KfTsNCg0KDQpjbGFz
cyBkU2xpZGVySm9pbnQgOiBwdWJsaWMgZEpvaW50IHsNCiAgLy8gSW50ZW50aW9uYWxseSB1
bmRlZmluZWQuICBEb24ndCB1c2UgdGhlc2UuDQogIGRTbGlkZXJKb2ludCAoY29uc3QgZFNs
aWRlckpvaW50ICYpOw0KICB2b2lkIG9wZXJhdG9yID0gKGNvbnN0IGRTbGlkZXJKb2ludCAm
KTsNCg0KcHVibGljOg0KICBkU2xpZGVySm9pbnQoKSB7IH0NCiAgZFNsaWRlckpvaW50KGRX
b3JsZElEIHdvcmxkLCBkSm9pbnRHcm91cElEIGdyb3VwPTApDQogICAgeyBfaWQgPSBkSm9p
bnRDcmVhdGVTbGlkZXIgKHdvcmxkLCBncm91cCk7IH0NCg0KICB2b2lkIGNyZWF0ZShkV29y
bGRJRCB3b3JsZCwgZEpvaW50R3JvdXBJRCBncm91cD0wKSB7DQogICAgaWYgKF9pZCkgZEpv
aW50RGVzdHJveSAoX2lkKTsNCiAgICBfaWQgPSBkSm9pbnRDcmVhdGVTbGlkZXIgKHdvcmxk
LCBncm91cCk7DQogIH0NCg0KICB2b2lkIHNldEF4aXMgKGRSZWFsIHgsIGRSZWFsIHksIGRS
ZWFsIHopDQogICAgeyBkSm9pbnRTZXRTbGlkZXJBeGlzIChfaWQsIHgsIHksIHopOyB9DQog
IHZvaWQgZ2V0QXhpcyAoZFZlY3RvcjMgcmVzdWx0KSBjb25zdA0KICAgIHsgZEpvaW50R2V0
U2xpZGVyQXhpcyAoX2lkLCByZXN1bHQpOyB9DQoNCiAgdm9pZCBzZXRQYXJhbShpbnQgcGFy
YW1ldGVyLCBkUmVhbCB2YWx1ZSkNCiAgICB7IGRKb2ludFNldFNsaWRlclBhcmFtKF9pZCwg
cGFyYW1ldGVyLCB2YWx1ZSk7IH0NCiAgZFJlYWwgZ2V0UGFyYW0oaW50IHBhcmFtZXRlcikg
Y29uc3QNCiAgICB7IHJldHVybiBkSm9pbnRHZXRTbGlkZXJQYXJhbShfaWQsIHBhcmFtZXRl
cik7IH0NCg0KICBkUmVhbCBnZXRQb3NpdGlvbigpIGNvbnN0DQogICAgeyByZXR1cm4gZEpv
aW50R2V0U2xpZGVyUG9zaXRpb24oX2lkKTsgfQ0KICBkUmVhbCBnZXRQb3NpdGlvblJhdGUo
KSBjb25zdA0KICAgIHsgcmV0dXJuIGRKb2ludEdldFNsaWRlclBvc2l0aW9uUmF0ZShfaWQp
OyB9DQp9Ow0KDQoNCmNsYXNzIGRDb250YWN0Sm9pbnQgOiBwdWJsaWMgZEpvaW50IHsNCiAg
Ly8gSW50ZW50aW9uYWxseSB1bmRlZmluZWQuICBEb24ndCB1c2UgdGhlc2UuDQogIGRDb250
YWN0Sm9pbnQgKGNvbnN0IGRDb250YWN0Sm9pbnQgJik7DQogIHZvaWQgb3BlcmF0b3IgPSAo
Y29uc3QgZENvbnRhY3RKb2ludCAmKTsNCg0KcHVibGljOg0KICBkQ29udGFjdEpvaW50KCkg
eyB9DQogIGRDb250YWN0Sm9pbnQoZFdvcmxkSUQgd29ybGQsIGRKb2ludEdyb3VwSUQgZ3Jv
dXAsIGRDb250YWN0ICpjb250YWN0KQ0KICAgIHsgX2lkID0gZEpvaW50Q3JlYXRlQ29udGFj
dCAod29ybGQsIGdyb3VwLCBjb250YWN0KTsgfQ0KDQogIHZvaWQgY3JlYXRlKGRXb3JsZElE
IHdvcmxkLCBkSm9pbnRHcm91cElEIGdyb3VwLCBkQ29udGFjdCAqY29udGFjdCkgew0KICAg
IGlmIChfaWQpIGRKb2ludERlc3Ryb3kgKF9pZCk7DQogICAgX2lkID0gZEpvaW50Q3JlYXRl
Q29udGFjdCAod29ybGQsIGdyb3VwLCBjb250YWN0KTsNCiAgfQ0KfTsNCg0KDQpjbGFzcyBk
SGluZ2UySm9pbnQgOiBwdWJsaWMgZEpvaW50IHsNCiAgLy8gSW50ZW50aW9uYWxseSB1bmRl
ZmluZWQuICBEb24ndCB1c2UgdGhlc2UuDQogIGRIaW5nZTJKb2ludCAoY29uc3QgZEhpbmdl
MkpvaW50ICYpOw0KICB2b2lkIG9wZXJhdG9yID0gKGNvbnN0IGRIaW5nZTJKb2ludCAmKTsN
Cg0KcHVibGljOg0KICBkSGluZ2UySm9pbnQoKSB7IH0NCiAgZEhpbmdlMkpvaW50KGRXb3Js
ZElEIHdvcmxkLCBkSm9pbnRHcm91cElEIGdyb3VwPTApDQogICAgeyBfaWQgPSBkSm9pbnRD
cmVhdGVIaW5nZTIgKHdvcmxkLCBncm91cCk7IH0NCg0KICB2b2lkIGNyZWF0ZShkV29ybGRJ
RCB3b3JsZCwgZEpvaW50R3JvdXBJRCBncm91cD0wKSB7DQogICAgaWYgKF9pZCkgZEpvaW50
RGVzdHJveSAoX2lkKTsNCiAgICBfaWQgPSBkSm9pbnRDcmVhdGVIaW5nZTIgKHdvcmxkLCBn
cm91cCk7DQogIH0NCg0KICB2b2lkIHNldEFuY2hvciAoZFJlYWwgeCwgZFJlYWwgeSwgZFJl
YWwgeikNCiAgICB7IGRKb2ludFNldEhpbmdlMkFuY2hvciAoX2lkLCB4LCB5LCB6KTsgfQ0K
ICB2b2lkIGdldEFuY2hvciAoZFZlY3RvcjMgcmVzdWx0KSBjb25zdA0KICAgIHsgZEpvaW50
R2V0SGluZ2UyQW5jaG9yIChfaWQsIHJlc3VsdCk7IH0NCg0KICB2b2lkIHNldEF4aXMxIChk
UmVhbCB4LCBkUmVhbCB5LCBkUmVhbCB6KQ0KICAgIHsgZEpvaW50U2V0SGluZ2UyQXhpczEg
KF9pZCwgeCwgeSwgeik7IH0NCiAgdm9pZCBzZXRBeGlzMiAoZFJlYWwgeCwgZFJlYWwgeSwg
ZFJlYWwgeikNCiAgICB7IGRKb2ludFNldEhpbmdlMkF4aXMyIChfaWQsIHgsIHksIHopOyB9
DQoNCiAgdm9pZCBnZXRBeGlzMSAoZFZlY3RvcjMgcmVzdWx0KSBjb25zdA0KICAgIHsgZEpv
aW50R2V0SGluZ2UyQXhpczEgKF9pZCwgcmVzdWx0KTsgfQ0KICB2b2lkIGdldEF4aXMyIChk
VmVjdG9yMyByZXN1bHQpIGNvbnN0DQogICAgeyBkSm9pbnRHZXRIaW5nZTJBeGlzMiAoX2lk
LCByZXN1bHQpOyB9DQoNCiAgdm9pZCBzZXRQYXJhbShpbnQgcGFyYW1ldGVyLCBkUmVhbCB2
YWx1ZSkNCiAgICB7IGRKb2ludFNldEhpbmdlMlBhcmFtKF9pZCwgcGFyYW1ldGVyLCB2YWx1
ZSk7IH0NCiAgZFJlYWwgZ2V0UGFyYW0oaW50IHBhcmFtZXRlcikgY29uc3QNCiAgICB7IHJl
dHVybiBkSm9pbnRHZXRIaW5nZTJQYXJhbShfaWQsIHBhcmFtZXRlcik7IH0NCg0KICBkUmVh
bCBnZXRBbmdsZTEoKSBjb25zdA0KICAgIHsgcmV0dXJuIGRKb2ludEdldEhpbmdlMkFuZ2xl
MShfaWQpOyB9DQogIGRSZWFsIGdldEFuZ2xlMVJhdGUoKSBjb25zdA0KICAgIHsgcmV0dXJu
IGRKb2ludEdldEhpbmdlMkFuZ2xlMVJhdGUoX2lkKTsgfQ0KICBkUmVhbCBnZXRBbmdsZTJS
YXRlKCkgY29uc3QNCiAgICB7IHJldHVybiBkSm9pbnRHZXRIaW5nZTJBbmdsZTJSYXRlKF9p
ZCk7IH0NCn07DQoNCg0KY2xhc3MgZFVuaXZlcnNhbEpvaW50IDogcHVibGljIGRKb2ludCB7
DQogIC8vIEludGVudGlvbmFsbHkgdW5kZWZpbmVkLiAgRG9uJ3QgdXNlIHRoZXNlLg0KICBk
VW5pdmVyc2FsSm9pbnQgKGNvbnN0IGRVbml2ZXJzYWxKb2ludCAmKTsNCiAgdm9pZCBvcGVy
YXRvciA9IChjb25zdCBkVW5pdmVyc2FsSm9pbnQgJik7DQoNCnB1YmxpYzoNCiAgZFVuaXZl
cnNhbEpvaW50KCkgeyB9DQogIGRVbml2ZXJzYWxKb2ludChkV29ybGRJRCB3b3JsZCwgZEpv
aW50R3JvdXBJRCBncm91cD0wKQ0KICAgIHsgX2lkID0gZEpvaW50Q3JlYXRlVW5pdmVyc2Fs
ICh3b3JsZCwgZ3JvdXApOyB9DQoNCiAgdm9pZCBjcmVhdGUoZFdvcmxkSUQgd29ybGQsIGRK
b2ludEdyb3VwSUQgZ3JvdXA9MCkgew0KICAgIGlmIChfaWQpIGRKb2ludERlc3Ryb3kgKF9p
ZCk7DQogICAgX2lkID0gZEpvaW50Q3JlYXRlVW5pdmVyc2FsICh3b3JsZCwgZ3JvdXApOw0K
ICB9DQoNCiAgdm9pZCBzZXRBbmNob3IgKGRSZWFsIHgsIGRSZWFsIHksIGRSZWFsIHopDQog
ICAgeyBkSm9pbnRTZXRVbml2ZXJzYWxBbmNob3IgKF9pZCwgeCwgeSwgeik7IH0NCiAgdm9p
ZCBnZXRBbmNob3IgKGRWZWN0b3IzIHJlc3VsdCkgY29uc3QNCiAgICB7IGRKb2ludEdldFVu
aXZlcnNhbEFuY2hvciAoX2lkLCByZXN1bHQpOyB9DQogIHZvaWQgZ2V0QW5jaG9yMiAoZFZl
Y3RvcjMgcmVzdWx0KSBjb25zdA0KCXsgZEpvaW50R2V0VW5pdmVyc2FsQW5jaG9yMiAoX2lk
LCByZXN1bHQpOyB9DQoNCiAgdm9pZCBzZXRBeGlzMSAoZFJlYWwgeCwgZFJlYWwgeSwgZFJl
YWwgeikNCiAgICB7IGRKb2ludFNldFVuaXZlcnNhbEF4aXMxIChfaWQsIHgsIHksIHopOyB9
DQogIHZvaWQgc2V0QXhpczIgKGRSZWFsIHgsIGRSZWFsIHksIGRSZWFsIHopDQogICAgeyBk
Sm9pbnRTZXRVbml2ZXJzYWxBeGlzMiAoX2lkLCB4LCB5LCB6KTsgfQ0KDQogIHZvaWQgZ2V0
QXhpczEgKGRWZWN0b3IzIHJlc3VsdCkgY29uc3QNCiAgICB7IGRKb2ludEdldFVuaXZlcnNh
bEF4aXMxIChfaWQsIHJlc3VsdCk7IH0NCiAgdm9pZCBnZXRBeGlzMiAoZFZlY3RvcjMgcmVz
dWx0KSBjb25zdA0KICAgIHsgZEpvaW50R2V0VW5pdmVyc2FsQXhpczIgKF9pZCwgcmVzdWx0
KTsgfQ0KfTsNCg0KDQpjbGFzcyBkRml4ZWRKb2ludCA6IHB1YmxpYyBkSm9pbnQgew0KICAv
LyBJbnRlbnRpb25hbGx5IHVuZGVmaW5lZC4gIERvbid0IHVzZSB0aGVzZS4NCiAgZEZpeGVk
Sm9pbnQgKGNvbnN0IGRGaXhlZEpvaW50ICYpOw0KICB2b2lkIG9wZXJhdG9yID0gKGNvbnN0
IGRGaXhlZEpvaW50ICYpOw0KDQpwdWJsaWM6DQogIGRGaXhlZEpvaW50KCkgeyB9DQogIGRG
aXhlZEpvaW50KGRXb3JsZElEIHdvcmxkLCBkSm9pbnRHcm91cElEIGdyb3VwPTApDQogICAg
eyBfaWQgPSBkSm9pbnRDcmVhdGVGaXhlZCAod29ybGQsIGdyb3VwKTsgfQ0KDQogIHZvaWQg
Y3JlYXRlKGRXb3JsZElEIHdvcmxkLCBkSm9pbnRHcm91cElEIGdyb3VwPTApIHsNCiAgICBp
ZiAoX2lkKSBkSm9pbnREZXN0cm95IChfaWQpOw0KICAgIF9pZCA9IGRKb2ludENyZWF0ZUZp
eGVkICh3b3JsZCwgZ3JvdXApOw0KICB9DQoNCiAgdm9pZCBzZXQgKCkNCiAgICB7IGRKb2lu
dFNldEZpeGVkIChfaWQpOyB9DQp9Ow0KDQoNCmNsYXNzIGROdWxsSm9pbnQgOiBwdWJsaWMg
ZEpvaW50IHsNCiAgLy8gSW50ZW50aW9uYWxseSB1bmRlZmluZWQuICBEb24ndCB1c2UgdGhl
c2UuDQogIGROdWxsSm9pbnQgKGNvbnN0IGROdWxsSm9pbnQgJik7DQogIHZvaWQgb3BlcmF0
b3IgPSAoY29uc3QgZE51bGxKb2ludCAmKTsNCg0KcHVibGljOg0KICBkTnVsbEpvaW50KCkg
eyB9DQogIGROdWxsSm9pbnQoZFdvcmxkSUQgd29ybGQsIGRKb2ludEdyb3VwSUQgZ3JvdXA9
MCkNCiAgICB7IF9pZCA9IGRKb2ludENyZWF0ZU51bGwgKHdvcmxkLCBncm91cCk7IH0NCg0K
ICB2b2lkIGNyZWF0ZShkV29ybGRJRCB3b3JsZCwgZEpvaW50R3JvdXBJRCBncm91cD0wKSB7
DQogICAgaWYgKF9pZCkgZEpvaW50RGVzdHJveSAoX2lkKTsNCiAgICBfaWQgPSBkSm9pbnRD
cmVhdGVOdWxsICh3b3JsZCwgZ3JvdXApOw0KICB9DQp9Ow0KDQoNCmNsYXNzIGRBTW90b3JK
b2ludCA6IHB1YmxpYyBkSm9pbnQgew0KICAvLyBJbnRlbnRpb25hbGx5IHVuZGVmaW5lZC4g
IERvbid0IHVzZSB0aGVzZS4NCiAgZEFNb3RvckpvaW50IChjb25zdCBkQU1vdG9ySm9pbnQg
Jik7DQogIHZvaWQgb3BlcmF0b3IgPSAoY29uc3QgZEFNb3RvckpvaW50ICYpOw0KDQpwdWJs
aWM6DQogIGRBTW90b3JKb2ludCgpIHsgfQ0KICBkQU1vdG9ySm9pbnQoZFdvcmxkSUQgd29y
bGQsIGRKb2ludEdyb3VwSUQgZ3JvdXA9MCkNCiAgICB7IF9pZCA9IGRKb2ludENyZWF0ZUFN
b3RvciAod29ybGQsIGdyb3VwKTsgfQ0KDQogIHZvaWQgY3JlYXRlKGRXb3JsZElEIHdvcmxk
LCBkSm9pbnRHcm91cElEIGdyb3VwPTApIHsNCiAgICBpZiAoX2lkKSBkSm9pbnREZXN0cm95
IChfaWQpOw0KICAgIF9pZCA9IGRKb2ludENyZWF0ZUFNb3RvciAod29ybGQsIGdyb3VwKTsN
CiAgfQ0KDQogIHZvaWQgc2V0TnVtQXhlcyhpbnQgbnVtKQ0KICAgIHsgZEpvaW50U2V0QU1v
dG9yTnVtQXhlcyhfaWQsIG51bSk7IH0NCiAgaW50IGdldE51bUF4ZXMoKSBjb25zdA0KICAg
IHsgcmV0dXJuIGRKb2ludEdldEFNb3Rvck51bUF4ZXMoX2lkKTsgfQ0KDQogIHZvaWQgc2V0
QXhpcyhpbnQgYW51bSwgaW50IHJlbCwgZFJlYWwgeCwgZFJlYWwgeSwgZFJlYWwgeikNCiAg
ICB7IGRKb2ludFNldEFNb3RvckF4aXMoX2lkLCBhbnVtLCByZWwsIHgsIHksIHopOyB9DQog
IHZvaWQgZ2V0QXhpcyhpbnQgYW51bSwgZFZlY3RvcjMgcmVzdWx0KSBjb25zdA0KICAgIHsg
ZEpvaW50R2V0QU1vdG9yQXhpcyhfaWQsIGFudW0sIHJlc3VsdCk7IH0NCiAgaW50IGdldEF4
aXNSZWwoaW50IGFudW0pIGNvbnN0DQogICAgeyByZXR1cm4gZEpvaW50R2V0QU1vdG9yQXhp
c1JlbChfaWQsIGFudW0pOyB9DQoNCiAgdm9pZCBzZXRBbmdsZShpbnQgYW51bSwgZFJlYWwg
YW5nbGUpDQogICAgeyBkSm9pbnRTZXRBTW90b3JBbmdsZShfaWQsIGFudW0sIGFuZ2xlKTsg
fQ0KICBkUmVhbCBnZXRBbmdsZShpbnQgYW51bSkgY29uc3QNCiAgICB7IHJldHVybiBkSm9p
bnRHZXRBTW90b3JBbmdsZShfaWQsIGFudW0pOyB9DQoNCiAgdm9pZCBzZXRQYXJhbShpbnQg
cGFyYW1ldGVyLCBkUmVhbCB2YWx1ZSkNCiAgICB7IGRKb2ludFNldEFNb3RvclBhcmFtKF9p
ZCwgcGFyYW1ldGVyLCB2YWx1ZSk7IH0NCiAgZFJlYWwgZ2V0UGFyYW0oaW50IHBhcmFtZXRl
cikgY29uc3QNCiAgICB7IHJldHVybiBkSm9pbnRHZXRBTW90b3JQYXJhbShfaWQsIHBhcmFt
ZXRlcik7IH0NCg0KICB2b2lkIHNldE1vZGUoaW50IG1vZGUpDQogICAgeyBkSm9pbnRTZXRB
TW90b3JNb2RlKF9pZCwgbW9kZSk7IH0NCiAgaW50IGdldE1vZGUoKSBjb25zdA0KICAgIHsg
cmV0dXJuIGRKb2ludEdldEFNb3Rvck1vZGUoX2lkKTsgfQ0KfTsNCg0KDQovLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLyAgZEdlb20gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQoNCmNsYXNz
IGRHZW9tIHsNCiAgLy8gSW50ZW50aW9uYWxseSB1bmRlZmluZWQuICBEb24ndCB1c2UgdGhl
c2UuDQogIGRHZW9tIChkR2VvbSAmKTsNCiAgdm9pZCBvcGVyYXRvcj0gKGRHZW9tICYpOw0K
DQpwdWJsaWM6DQogIGRHZW9tKCkNCiAgICB7IF9pZCA9IDA7IH0NCiAgfmRHZW9tKCkNCiAg
ICB7IGlmIChfaWQpIGRHZW9tRGVzdHJveSAoX2lkKTsgfQ0KDQogIGRHZW9tSUQgaWQoKSBj
b25zdA0KICAgIHsgcmV0dXJuIF9pZDsgfQ0KICBvcGVyYXRvciBkR2VvbUlEKCkgY29uc3QN
CiAgICB7IHJldHVybiBfaWQ7IH0NCg0KICB2b2lkIGRlc3Ryb3koKSB7DQogICAgaWYgKF9p
ZCkgZEdlb21EZXN0cm95IChfaWQpOw0KICAgIF9pZCA9IDA7DQogIH0NCg0KICBpbnQgZ2V0
Q2xhc3MoKSBjb25zdA0KICAgIHsgcmV0dXJuIGRHZW9tR2V0Q2xhc3MgKF9pZCk7IH0NCg0K
ICB2b2lkIHNldERhdGEgKHZvaWQgKmRhdGEpDQogICAgeyBkR2VvbVNldERhdGEgKF9pZCxk
YXRhKTsgfQ0KICB2b2lkICpnZXREYXRhKCkgY29uc3QNCiAgICB7IHJldHVybiBkR2VvbUdl
dERhdGEgKF9pZCk7IH0NCg0KICB2b2lkIHNldEJvZHkgKGRCb2R5SUQgYikNCiAgICB7IGRH
ZW9tU2V0Qm9keSAoX2lkLGIpOyB9DQogIGRCb2R5SUQgZ2V0Qm9keSgpIGNvbnN0DQogICAg
eyByZXR1cm4gZEdlb21HZXRCb2R5IChfaWQpOyB9DQoNCiAgdm9pZCBzZXRQb3NpdGlvbiAo
ZFJlYWwgeCwgZFJlYWwgeSwgZFJlYWwgeikNCiAgICB7IGRHZW9tU2V0UG9zaXRpb24gKF9p
ZCx4LHkseik7IH0NCiAgY29uc3QgZFJlYWwgKiBnZXRQb3NpdGlvbigpIGNvbnN0DQogICAg
eyByZXR1cm4gZEdlb21HZXRQb3NpdGlvbiAoX2lkKTsgfQ0KDQogIHZvaWQgc2V0Um90YXRp
b24gKGNvbnN0IGRNYXRyaXgzIFIpDQogICAgeyBkR2VvbVNldFJvdGF0aW9uIChfaWQsUik7
IH0NCiAgY29uc3QgZFJlYWwgKiBnZXRSb3RhdGlvbigpIGNvbnN0DQogICAgeyByZXR1cm4g
ZEdlb21HZXRSb3RhdGlvbiAoX2lkKTsgfQ0KDQogIHZvaWQgZ2V0QUFCQihkUmVhbCBhYWJi
WzZdKSBjb25zdA0KICAgIHsgZEdlb21HZXRBQUJCKF9pZCwgYWFiYik7IH0NCiAgZFJlYWwg
KmdldFNwYWNlQUFCQigpIGNvbnN0DQogICAgeyByZXR1cm4gZEdlb21HZXRTcGFjZUFBQkIo
X2lkKTsgfQ0KDQogIC8vIEJvZHkgdG8gd29ybGQNCiAgdm9pZCBUcmFuc2Zvcm0oZFJlYWwg
eF9ib2R5LCBkUmVhbCB5X2JvZHksIGRSZWFsIHpfYm9keSwNCgkgIGRWZWN0b3IzIHdvcmxk
X3JlbGF0aXZlKSBjb25zdA0KICB7IGRHZW9tVHJhbnNmb3JtVmVjdG9yKF9pZCwgeF9ib2R5
LCB5X2JvZHksIHpfYm9keSwgd29ybGRfcmVsYXRpdmUpOyB9DQogIHZvaWQgUm90YXRlKGRS
ZWFsIHhfYm9keSwgZFJlYWwgeV9ib2R5LCBkUmVhbCB6X2JvZHksDQoJICBkVmVjdG9yMyB3
b3JsZF9yZWxhdGl2ZSkgY29uc3QNCiAgeyBkR2VvbVJvdGF0ZVZlY3RvcihfaWQsIHhfYm9k
eSwgeV9ib2R5LCB6X2JvZHksIHdvcmxkX3JlbGF0aXZlKTsgfQ0KDQogIC8vIFdvcmxkIHRv
IGJvZHkNCiAgdm9pZCBJbnZlcnNlVHJhbnNmb3JtKGRSZWFsIHhfd29ybGQsIGRSZWFsIHlf
d29ybGQsIGRSZWFsIHpfd29ybGQsDQoJICBkVmVjdG9yMyBib2R5X3JlbGF0aXZlKSBjb25z
dA0KICB7IGRHZW9tSW52ZXJzZVRyYW5zZm9ybVZlY3RvcihfaWQsIHhfd29ybGQsIHlfd29y
bGQsIHpfd29ybGQsIGJvZHlfcmVsYXRpdmUpOyB9DQogIHZvaWQgSW52ZXJzZVJvdGF0ZShk
UmVhbCB4X3dvcmxkLCBkUmVhbCB5X3dvcmxkLCBkUmVhbCB6X3dvcmxkLA0KCSAgZFZlY3Rv
cjMgYm9keV9yZWxhdGl2ZSkgY29uc3QNCiAgeyBkR2VvbUludmVyc2VSb3RhdGVWZWN0b3Io
X2lkLCB4X3dvcmxkLCB5X3dvcmxkLCB6X3dvcmxkLCBib2R5X3JlbGF0aXZlKTsgfQ0KDQoN
CnByb3RlY3RlZDoNCiAgZEdlb21JRCBfaWQ7DQp9Ow0KDQoNCi8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vICBkU3BhY2UgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQoNCmNsYXNzIGRHZW9t
Ow0KDQpjbGFzcyBkU3BhY2Ugew0KICBkU3BhY2VJRCBfaWQ7DQoNCiAgLy8gSW50ZW50aW9u
YWxseSB1bmRlZmluZWQuICBEb24ndCB1c2UgdGhlc2UuDQogIGRTcGFjZSAoZFNwYWNlICYp
Ow0KICB2b2lkIG9wZXJhdG9yPSAoZFNwYWNlICYpOw0KDQpwdWJsaWM6DQogIGRTcGFjZSAo
KQ0KICAgIHsgX2lkID0gZEhhc2hTcGFjZUNyZWF0ZSgpOyB9DQogIH5kU3BhY2UoKQ0KICAg
IHsgZFNwYWNlRGVzdHJveSAoX2lkKTsgfQ0KDQogIGRTcGFjZUlEIGlkKCkgY29uc3QNCiAg
ICB7IHJldHVybiBfaWQ7IH0NCiAgb3BlcmF0b3IgZFNwYWNlSUQoKQ0KICAgIHsgcmV0dXJu
IF9pZDsgfQ0KDQogIHZvaWQgYWRkIChkR2VvbUlEIHgpDQogIHsgZFNwYWNlQWRkKF9pZCwg
eCk7IH0NCg0KICB2b2lkIHJlbW92ZSAoZEdlb21JRCB4KQ0KICB7IGRTcGFjZVJlbW92ZSAo
X2lkLCB4KTsgfQ0KDQogIHZvaWQgY29sbGlkZSAodm9pZCAqZGF0YSwgZE5lYXJDYWxsYmFj
ayAqY2FsbGJhY2spDQogICAgeyBkU3BhY2VDb2xsaWRlIChfaWQsZGF0YSxjYWxsYmFjayk7
IH0NCn07DQoNCg0KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gIGRHZW9tIHN1YmNsYXNzZXMg
IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQoNCmNsYXNzIGRTcGhlcmUgOiBwdWJsaWMgZEdl
b217DQogIC8vIEludGVudGlvbmFsbHkgdW5kZWZpbmVkLiAgRG9uJ3QgdXNlIHRoZXNlLg0K
ICBkU3BoZXJlIChkU3BoZXJlICYpOw0KICB2b2lkIG9wZXJhdG9yPSAoZFNwaGVyZSAmKTsN
Cg0KcHVibGljOg0KICBkU3BoZXJlICgpIHsgfQ0KICBkU3BoZXJlIChkU3BhY2VJRCBzcGFj
ZSwgZFJlYWwgcmFkaXVzKSANCiAgICB7IF9pZCA9IGRDcmVhdGVTcGhlcmUgKHNwYWNlLCBy
YWRpdXMpOyB9DQoNCiAgdm9pZCBjcmVhdGUoZFNwYWNlSUQgc3BhY2UsIGRSZWFsIHJhZGl1
cykgew0KICAgIGlmIChfaWQpIGRHZW9tRGVzdHJveSAoX2lkKTsNCiAgICBfaWQgPSBkQ3Jl
YXRlU3BoZXJlIChzcGFjZSwgcmFkaXVzKTsNCiAgfQ0KDQogIHZvaWQgc2V0UmFkaXVzKGRS
ZWFsIHJhZGl1cykNCiAgICB7IGRHZW9tU3BoZXJlU2V0UmFkaXVzKF9pZCwgcmFkaXVzKTsg
fQ0KICBkUmVhbCBnZXRSYWRpdXMoKSBjb25zdA0KICAgIHsgcmV0dXJuIGRHZW9tU3BoZXJl
R2V0UmFkaXVzIChfaWQpOyB9DQp9Ow0KDQoNCmNsYXNzIGRCb3ggOiBwdWJsaWMgZEdlb20g
ew0KICAvLyBJbnRlbnRpb25hbGx5IHVuZGVmaW5lZC4gIERvbid0IHVzZSB0aGVzZS4NCiAg
ZEJveCAoZEJveCAmKTsNCiAgdm9pZCBvcGVyYXRvcj0gKGRCb3ggJik7DQoNCnB1YmxpYzoN
CiAgZEJveCAoKSB7IH0NCiAgZEJveCAoZFNwYWNlSUQgc3BhY2UsIGRSZWFsIGx4LCBkUmVh
bCBseSwgZFJlYWwgbHopDQogICAgeyBfaWQgPSBkQ3JlYXRlQm94IChzcGFjZSxseCxseSxs
eik7IH0NCg0KICB2b2lkIGNyZWF0ZShkU3BhY2VJRCBzcGFjZSwgZFJlYWwgbHgsIGRSZWFs
IGx5LCBkUmVhbCBseikgeyANCiAgICBpZiAoX2lkKSBkR2VvbURlc3Ryb3kgKF9pZCk7DQog
ICAgX2lkID0gZENyZWF0ZUJveCAoc3BhY2UsbHgsbHksbHopOw0KICB9DQoNCiAgdm9pZCBz
ZXRMZW5ndGhzKGRSZWFsIGx4LCBkUmVhbCBseSwgZFJlYWwgbHopDQogICAgeyBkR2VvbUJv
eFNldExlbmd0aHMoX2lkLCBseCwgbHksIGx6KTsgfQ0KICB2b2lkIGdldExlbmd0aHMgKGRW
ZWN0b3IzIHJlc3VsdCkgY29uc3QNCiAgICB7IGRHZW9tQm94R2V0TGVuZ3RocyAoX2lkLHJl
c3VsdCk7IH0NCn07DQoNCg0KY2xhc3MgZFBsYW5lIDogcHVibGljIGRHZW9tIHsNCiAgLy8g
SW50ZW50aW9uYWxseSB1bmRlZmluZWQuICBEb24ndCB1c2UgdGhlc2UuDQogIGRQbGFuZSAo
ZFBsYW5lICYpOw0KICB2b2lkIG9wZXJhdG9yPSAoZFBsYW5lICYpOw0KDQpwdWJsaWM6DQog
IGRQbGFuZSgpIHsgfQ0KICBkUGxhbmUgKGRTcGFjZUlEIHNwYWNlLCBkUmVhbCBhLCBkUmVh
bCBiLCBkUmVhbCBjLCBkUmVhbCBkKQ0KICAgIHsgX2lkID0gZENyZWF0ZVBsYW5lIChzcGFj
ZSxhLGIsYyxkKTsgfQ0KDQogIHZvaWQgY3JlYXRlIChkU3BhY2VJRCBzcGFjZSwgZFJlYWwg
YSwgZFJlYWwgYiwgZFJlYWwgYywgZFJlYWwgZCkgew0KICAgIGlmIChfaWQpIGRHZW9tRGVz
dHJveSAoX2lkKTsNCiAgICBfaWQgPSBkQ3JlYXRlUGxhbmUgKHNwYWNlLGEsYixjLGQpOw0K
ICB9DQoNCiAgdm9pZCBzZXRQYXJhbXMgKGRSZWFsIGEsIGRSZWFsIGIsIGRSZWFsIGMsIGRS
ZWFsIGQpDQogICAgeyBkR2VvbVBsYW5lU2V0UGFyYW1zKF9pZCwgYSwgYiwgYywgZCk7IH0N
CiAgdm9pZCBnZXRQYXJhbXMgKGRWZWN0b3I0IHJlc3VsdCkgY29uc3QNCiAgICB7IGRHZW9t
UGxhbmVHZXRQYXJhbXMgKF9pZCxyZXN1bHQpOyB9DQp9Ow0KDQoNCmNsYXNzIGRDQ3lsaW5k
ZXIgOiBwdWJsaWMgZEdlb20gew0KICAvLyBJbnRlbnRpb25hbGx5IHVuZGVmaW5lZC4gIERv
bid0IHVzZSB0aGVzZS4NCiAgZENDeWxpbmRlciAoZENDeWxpbmRlciAmKTsNCiAgdm9pZCBv
cGVyYXRvcj0gKGRDQ3lsaW5kZXIgJik7DQoNCnB1YmxpYzoNCiAgZENDeWxpbmRlcigpIHsg
fQ0KICBkQ0N5bGluZGVyIChkU3BhY2VJRCBzcGFjZSwgZFJlYWwgcmFkaXVzLCBkUmVhbCBs
ZW5ndGgpDQogICAgeyBfaWQgPSBkQ3JlYXRlQ0N5bGluZGVyIChzcGFjZSxyYWRpdXMsbGVu
Z3RoKTsgfQ0KDQogIHZvaWQgY3JlYXRlIChkU3BhY2VJRCBzcGFjZSwgZFJlYWwgcmFkaXVz
LCBkUmVhbCBsZW5ndGgpIHsNCiAgICBpZiAoX2lkKSBkR2VvbURlc3Ryb3kgKF9pZCk7DQog
ICAgX2lkID0gZENyZWF0ZUNDeWxpbmRlciAoc3BhY2UscmFkaXVzLGxlbmd0aCk7DQogIH0N
Cg0KICB2b2lkIHNldFBhcmFtcyAoZFJlYWwgcmFkaXVzLCBkUmVhbCBsZW5ndGgpDQogICAg
eyBkR2VvbUNDeWxpbmRlclNldFBhcmFtcyhfaWQsIHJhZGl1cywgbGVuZ3RoKTsgfQ0KICB2
b2lkIGdldFBhcmFtcyAoZFJlYWwgKnJhZGl1cywgZFJlYWwgKmxlbmd0aCkgY29uc3QNCiAg
ICB7IGRHZW9tQ0N5bGluZGVyR2V0UGFyYW1zIChfaWQscmFkaXVzLGxlbmd0aCk7IH0NCn07
DQoNCg0KY2xhc3MgZEdlb21Hcm91cCA6IHB1YmxpYyBkR2VvbSB7DQogIC8vIEludGVudGlv
bmFsbHkgdW5kZWZpbmVkLiAgRG9uJ3QgdXNlIHRoZXNlLg0KICBkR2VvbUdyb3VwIChkR2Vv
bUdyb3VwICYpOw0KICB2b2lkIG9wZXJhdG9yPSAoZEdlb21Hcm91cCAmKTsNCg0KcHVibGlj
Og0KICBkR2VvbUdyb3VwKCkgeyB9DQogIGRHZW9tR3JvdXAoZFNwYWNlSUQgc3BhY2UpDQog
IHsgX2lkID0gZENyZWF0ZUdlb21Hcm91cChzcGFjZSk7IH0NCg0KICB2b2lkIGNyZWF0ZShk
U3BhY2VJRCBzcGFjZT0wKSB7DQogICAgaWYgKF9pZCkgZEdlb21EZXN0cm95IChfaWQpOw0K
ICAgIF9pZCA9IGRDcmVhdGVHZW9tR3JvdXAoc3BhY2UpOw0KICB9DQoNCiAgdm9pZCBhZGQo
ZEdlb21JRCB4KQ0KICB7IGRHZW9tR3JvdXBBZGQoX2lkLCB4KTsgfQ0KDQogIHZvaWQgcmVt
b3ZlKGRHZW9tSUQgeCkNCiAgeyBkR2VvbUdyb3VwUmVtb3ZlKF9pZCwgeCk7IH0NCg0KICBp
bnQgZ2V0TnVtR2VvbXMoKSBjb25zdA0KICB7IHJldHVybiBkR2VvbUdyb3VwR2V0TnVtR2Vv
bXMoX2lkKTsgfQ0KICBkR2VvbUlEIGdldEdlb20oaW50IGkpIGNvbnN0DQogIHsgcmV0dXJu
IGRHZW9tR3JvdXBHZXRHZW9tKF9pZCwgaSk7IH0NCn07DQoNCmNsYXNzIGRHZW9tVHJhbnNm
b3JtIDogcHVibGljIGRHZW9tIHsNCiAgLy8gSW50ZW50aW9uYWxseSB1bmRlZmluZWQuICBE
b24ndCB1c2UgdGhlc2UuDQogIGRHZW9tVHJhbnNmb3JtIChkR2VvbVRyYW5zZm9ybSAmKTsN
CiAgdm9pZCBvcGVyYXRvcj0gKGRHZW9tVHJhbnNmb3JtICYpOw0KDQpwdWJsaWM6DQogIGRH
ZW9tVHJhbnNmb3JtKCkgeyB9DQogIGRHZW9tVHJhbnNmb3JtKGRTcGFjZUlEIHNwYWNlKQ0K
ICAgIHsgX2lkID0gZENyZWF0ZUdlb21UcmFuc2Zvcm0oc3BhY2UpOyB9DQoNCiAgdm9pZCBj
cmVhdGUoZFNwYWNlSUQgc3BhY2U9MCkgew0KICAgIGlmIChfaWQpIGRHZW9tRGVzdHJveSAo
X2lkKTsNCiAgICBfaWQgPSBkQ3JlYXRlR2VvbVRyYW5zZm9ybShzcGFjZSk7DQogIH0NCg0K
ICB2b2lkIHNldEdlb20gKGRHZW9tSUQgZ2VvbSkNCiAgICB7IGRHZW9tVHJhbnNmb3JtU2V0
R2VvbShfaWQsIGdlb20pOyB9DQogIGRHZW9tSUQgZ2V0R2VvbSgpIGNvbnN0DQogICAgeyBy
ZXR1cm4gZEdlb21UcmFuc2Zvcm1HZXRHZW9tKF9pZCk7IH0NCn07DQoNCg0KI2VuZGlmDQoj
ZW5kaWYNCg==
--------------BF5B97BC2C62B1B2038366B8
Content-Type: application/x-unknown-content-type-cppfile;
 name="test_chain2.cpp"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
 filename="test_chain2.cpp"

LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioNCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogKiBPcGVuIER5
bmFtaWNzIEVuZ2luZSwgQ29weXJpZ2h0IChDKSAyMDAxIFJ1c3NlbGwgTC4gU21pdGguICAg
ICAgICAgICAgKg0KICogICBFbWFpbDogcnVzc0BxMTIub3JnICAgV2ViOiB3d3cucTEyLm9y
ZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAqICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAq
DQogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1
dGUgaXQgYW5kL29yICAgICAgICAgKg0KICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyAgICAgICAgICAgICoNCiAqIExpY2Vu
c2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl
ciAgICAgICAgICAqDQogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlv
dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgKg0KICogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICoNCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0
IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqDQogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7
IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKg0KICogTUVS
Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUg
dGhlIEdOVSAgICAgICoNCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt
b3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAqDQogKiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKg0KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExl
c3NlciBHZW5lcmFsIFB1YmxpYyAgICAgICoNCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnkgKHNlZSB0aGUgZmlsZSBMSUNFTlNFLlRYVCk7IGlmIG5vdCwgICAqDQogKiB3
cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUg
UGxhY2UsICAgICAgICAgKg0KICogU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcg
VVNBLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAqICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAqDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KLyogZXhlcmNpc2UgdGhlIEMrKyBp
bnRlcmZhY2UgKi8NCg0KI2luY2x1ZGUgPG9kZS9vZGUuaD4NCiNpbmNsdWRlIDxkcmF3c3R1
ZmYvZHJhd3N0dWZmLmg+DQoNCiNpZmRlZiBNU1ZDDQojcHJhZ21hIHdhcm5pbmcoZGlzYWJs
ZTo0MjQ0IDQzMDUpICAvLyBmb3IgVkMrKywgbm8gcHJlY2lzaW9uIGxvc3MgY29tcGxhaW50
cw0KI2VuZGlmDQoNCi8vIHNlbGVjdCBjb3JyZWN0IGRyYXdpbmcgZnVuY3Rpb25zDQoNCiNp
ZmRlZiBkRE9VQkxFDQojZGVmaW5lIGRzRHJhd0JveCBkc0RyYXdCb3hEDQojZGVmaW5lIGRz
RHJhd1NwaGVyZSBkc0RyYXdTcGhlcmVEDQojZGVmaW5lIGRzRHJhd0N5bGluZGVyIGRzRHJh
d0N5bGluZGVyRA0KI2RlZmluZSBkc0RyYXdDYXBwZWRDeWxpbmRlciBkc0RyYXdDYXBwZWRD
eWxpbmRlckQNCiNlbmRpZg0KDQoNCi8vIHNvbWUgY29uc3RhbnRzDQoNCiNkZWZpbmUgTlVN
IDEwCQkJLy8gbnVtYmVyIG9mIGJveGVzDQojZGVmaW5lIFNJREUgKDAuMikJCS8vIHNpZGUg
bGVuZ3RoIG9mIGEgYm94DQojZGVmaW5lIE1BU1MgKDEuMCkJCS8vIG1hc3Mgb2YgYSBib3gN
CiNkZWZpbmUgUkFESVVTICgwLjE3MzJmKQkvLyBzcGhlcmUgcmFkaXVzDQoNCg0KLy8gZHlu
YW1pY3MgYW5kIGNvbGxpc2lvbiBvYmplY3RzDQoNCnN0YXRpYyBkV29ybGQgd29ybGQ7DQpz
dGF0aWMgZFNwYWNlIHNwYWNlOw0Kc3RhdGljIGRCb2R5IGJvZHlbTlVNXTsNCnN0YXRpYyBk
QmFsbEFuZFNvY2tldEpvaW50IGpvaW50W05VTS0xXTsNCnN0YXRpYyBkSm9pbnRHcm91cCBj
b250YWN0Z3JvdXA7DQpzdGF0aWMgZEJveCBib3hbTlVNXTsNCg0KDQovLyB0aGlzIGlzIGNh
bGxlZCBieSBzcGFjZS5jb2xsaWRlIHdoZW4gdHdvIG9iamVjdHMgaW4gc3BhY2UgYXJlDQov
LyBwb3RlbnRpYWxseSBjb2xsaWRpbmcuDQoNCnN0YXRpYyB2b2lkIG5lYXJDYWxsYmFjayAo
dm9pZCAqZGF0YSwgZEdlb21JRCBvMSwgZEdlb21JRCBvMikNCnsNCiAgLy8gZXhpdCB3aXRo
b3V0IGRvaW5nIGFueXRoaW5nIGlmIHRoZSB0d28gYm9kaWVzIGFyZSBjb25uZWN0ZWQgYnkg
YSBqb2ludA0KICBkQm9keUlEIGIxID0gZEdlb21HZXRCb2R5KG8xKTsNCiAgZEJvZHlJRCBi
MiA9IGRHZW9tR2V0Qm9keShvMik7DQogIGlmIChiMSAmJiBiMiAmJiBkQXJlQ29ubmVjdGVk
IChiMSxiMikpIHJldHVybjsNCg0KICAvLyBAQEAgaXQncyBzdGlsbCBtb3JlIGNvbnZlbmll
bnQgdG8gdXNlIHRoZSBDIGludGVyZmFjZSBoZXJlLg0KDQogIGRDb250YWN0IGNvbnRhY3Q7
DQogIGNvbnRhY3Quc3VyZmFjZS5tb2RlID0gMDsNCiAgY29udGFjdC5zdXJmYWNlLm11ID0g
ZEluZmluaXR5Ow0KICBpZiAoZENvbGxpZGUgKG8xLG8yLDAsJmNvbnRhY3QuZ2VvbSxzaXpl
b2YoZENvbnRhY3RHZW9tKSkpIHsNCiAgICBkSm9pbnRJRCBjID0gZEpvaW50Q3JlYXRlQ29u
dGFjdCAod29ybGQuaWQoKSxjb250YWN0Z3JvdXAuaWQoKSwmY29udGFjdCk7DQogICAgZEpv
aW50QXR0YWNoIChjLGIxLGIyKTsNCiAgfQ0KfQ0KDQoNCi8vIHN0YXJ0IHNpbXVsYXRpb24g
LSBzZXQgdmlld3BvaW50DQoNCnN0YXRpYyB2b2lkIHN0YXJ0KCkNCnsNCiAgc3RhdGljIGZs
b2F0IHh5elszXSA9IHsyLjE2NDBmLC0xLjMwNzlmLDEuNzYwMGZ9Ow0KICBzdGF0aWMgZmxv
YXQgaHByWzNdID0gezEyNS41MDAwZiwtMTcuMDAwMGYsMC4wMDAwZn07DQogIGRzU2V0Vmll
d3BvaW50ICh4eXosaHByKTsNCn0NCg0KDQovLyBzaW11bGF0aW9uIGxvb3ANCg0Kc3RhdGlj
IHZvaWQgc2ltTG9vcCAoaW50IHBhdXNlKQ0Kew0KICBpZiAoIXBhdXNlKSB7DQogICAgc3Rh
dGljIGRvdWJsZSBhbmdsZSA9IDA7DQogICAgYW5nbGUgKz0gMC4wNTsNCiAgICBib2R5W05V
TS0xXS5hZGRGb3JjZSAoMCwwLDEuNSooc2luKGFuZ2xlKSsxLjApKTsNCg0KICAgIHNwYWNl
LmNvbGxpZGUgKDAsJm5lYXJDYWxsYmFjayk7DQogICAgd29ybGQuc3RlcCAoMC4wNSk7DQoN
CiAgICAvLyByZW1vdmUgYWxsIGNvbnRhY3Qgam9pbnRzDQogICAgY29udGFjdGdyb3VwLmVt
cHR5KCk7DQogIH0NCg0KICBkUmVhbCBzaWRlc1szXSA9IHtTSURFLFNJREUsU0lERX07DQog
IGRzU2V0Q29sb3IgKDEsMSwwKTsNCiAgZHNTZXRUZXh0dXJlIChEU19XT09EKTsNCiAgZm9y
IChpbnQgaT0wOyBpPE5VTTsgaSsrKQ0KICAgIGRzRHJhd0JveCAoYm9keVtpXS5nZXRQb3Np
dGlvbigpLGJvZHlbaV0uZ2V0Um90YXRpb24oKSxzaWRlcyk7DQp9DQoNCg0KaW50IG1haW4g
KGludCBhcmdjLCBjaGFyICoqYXJndikNCnsNCiAgLy8gc2V0dXAgcG9pbnRlcnMgdG8gZHJh
d3N0dWZmIGNhbGxiYWNrIGZ1bmN0aW9ucw0KICBkc0Z1bmN0aW9ucyBmbjsNCiAgZm4udmVy
c2lvbiA9IERTX1ZFUlNJT047DQogIGZuLnN0YXJ0ID0gJnN0YXJ0Ow0KICBmbi5zdGVwID0g
JnNpbUxvb3A7DQogIGZuLmNvbW1hbmQgPSAwOw0KICBmbi5zdG9wID0gMDsNCiAgZm4ucGF0
aF90b190ZXh0dXJlcyA9ICIuLi8uLi9kcmF3c3R1ZmYvdGV4dHVyZXMiOw0KDQogIC8vIGNy
ZWF0ZSB3b3JsZA0KDQogIGludCBpOw0KICB3b3JsZC5zZXRHcmF2aXR5ICgwLDAsLTAuNSk7
DQogIGRXb3JsZFNldENGTSAod29ybGQuaWQoKSwxZS01KTsNCiAgZFBsYW5lIHBsYW5lOw0K
ICBwbGFuZS5jcmVhdGUgKHNwYWNlLDAsMCwxLDApOw0KDQogIGZvciAoaT0wOyBpPE5VTTsg
aSsrKSB7DQogICAgYm9keVtpXS5jcmVhdGUgKHdvcmxkKTsNCiAgICBkUmVhbCBrID0gaSpT
SURFOw0KICAgIGJvZHlbaV0uc2V0UG9zaXRpb24gKGssayxrKzAuNCk7DQogICAgZE1hc3Mg
bTsNCiAgICBtLnNldEJveCAoMSxTSURFLFNJREUsU0lERSk7DQogICAgbS5hZGp1c3QgKE1B
U1MpOw0KICAgIGJvZHlbaV0uc2V0TWFzcyAoJm0pOw0KICAgIGJvZHlbaV0uc2V0RGF0YSAo
KHZvaWQqKSBpKTsNCg0KICAgIGJveFtpXS5jcmVhdGUgKHNwYWNlLFNJREUsU0lERSxTSURF
KTsNCiAgICBib3hbaV0uc2V0Qm9keSAoYm9keVtpXSk7DQogIH0NCiAgZm9yIChpPTA7IGk8
KE5VTS0xKTsgaSsrKSB7DQogICAgam9pbnRbaV0uY3JlYXRlICh3b3JsZCk7DQogICAgam9p
bnRbaV0uYXR0YWNoIChib2R5W2ldLGJvZHlbaSsxXSk7DQogICAgZFJlYWwgayA9IChpKzAu
NSkqU0lERTsNCiAgICBqb2ludFtpXS5zZXRBbmNob3IgKGssayxrKzAuNCk7DQogIH0NCg0K
ICAvLyBydW4gc2ltdWxhdGlvbg0KICBkc1NpbXVsYXRpb25Mb29wIChhcmdjLGFyZ3YsMzUy
LDI4OCwmZm4pOw0KDQogIHJldHVybiAwOw0KfQ0K
--------------BF5B97BC2C62B1B2038366B8--