[ODE] stress testing and box stacking instability

David McClurg dmcclurg at pandemicstudios.com.au
Thu Nov 21 23:53:02 2002


This is a multi-part message in MIME format.

------_=_NextPart_001_01C291F3.A8E1CEDE
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

I'm trying to use stacked boxes in my game and I ran into the box =
stacking instability mentioned previously on this list.  That got me to =
reading the Gamasutra article "Product Review of Physics Engines, Part =
One: The Stress Tests" and I thought it might be useful to put together =
the stress test suite for ODE.

It was easy to get tests 1-6 coded and the only one that did badly was =
Test 2: "A slightly larger cube is dropped on a smaller cube.  This was =
a variation on the first test in that the difference between the cubes' =
sizes was much smaller.  This test was meant to be a "gimme" and should =
just work."  Expected result: cubes should drop straight on top of each =
other and come to immediate rest.

I attached a modified test_boxstack.cpp which shows what happens.  The =
top box dances around for a long time and eventually falls off the top =
box.  In Havok, i think they might be freezing/sleeping boxes in this =
situation.  Does the solution lie in proper detection of this situation =
or in better contact generation?
 <<test_boxstack.cpp>>=20

------_=_NextPart_001_01C291F3.A8E1CEDE
Content-Type: application/octet-stream;
	name="test_boxstack.cpp"
Content-Transfer-Encoding: base64
Content-Description: test_boxstack.cpp
Content-Disposition: attachment;
	filename="test_boxstack.cpp"

LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogT3BlbiBEeW5hbWljcyBFbmdp
bmUsIENvcHlyaWdodCAoQykgMjAwMSwyMDAyIFJ1c3NlbGwgTC4gU21pdGguICAgICAgICoNCiog
QWxsIHJpZ2h0cyByZXNlcnZlZC4gIEVtYWlsOiBydXNzQHExMi5vcmcgICBXZWI6IHd3dy5xMTIu
b3JnICAgICAgICAgICoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogVGhpcyBsaWJyYXJ5IGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAgICAgICAgICoNCiogbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBFSVRIRVI6ICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICoNCiogICAoMSkgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgICoNCiogICAgICAgU29mdHdhcmUgRm91bmRhdGlv
bjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgICoNCiogICAgICAg
eW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBUaGUgdGV4dCBvZiB0aGUgR05VIExlc3Nl
ciAgICAgICoNCiogICAgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCB3aXRo
IHRoaXMgbGlicmFyeSBpbiB0aGUgICAgICoNCiogICAgICAgZmlsZSBMSUNFTlNFLlRYVC4gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogICAoMikgVGhl
IEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIGxpYnJhcnkgaW4g
ICAgICoNCiogICAgICAgdGhlIGZpbGUgTElDRU5TRS1CU0QuVFhULiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogVGhpcyBsaWJyYXJ5
IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAg
ICoNCiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg
d2FycmFudHkgb2YgICAgICAgICoNCiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIGZpbGVzICAgICoNCiogTElDRU5TRS5UWFQgYW5k
IExJQ0VOU0UtQlNELlRYVCBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICoN
CiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICoNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCiNpbmNsdWRlIDxvZGUvb2Rl
Lmg+DQojaW5jbHVkZSA8ZHJhd3N0dWZmL2RyYXdzdHVmZi5oPg0KDQojaWZkZWYgTVNWQw0KI3By
YWdtYSB3YXJuaW5nKGRpc2FibGU6NDI0NCA0MzA1KSAgLy8gZm9yIFZDKyssIG5vIHByZWNpc2lv
biBsb3NzIGNvbXBsYWludHMNCiNlbmRpZg0KDQovLyBzZWxlY3QgY29ycmVjdCBkcmF3aW5nIGZ1
bmN0aW9ucw0KDQojaWZkZWYgZERPVUJMRQ0KI2RlZmluZSBkc0RyYXdCb3ggZHNEcmF3Qm94RA0K
I2RlZmluZSBkc0RyYXdTcGhlcmUgZHNEcmF3U3BoZXJlRA0KI2RlZmluZSBkc0RyYXdDeWxpbmRl
ciBkc0RyYXdDeWxpbmRlckQNCiNkZWZpbmUgZHNEcmF3Q2FwcGVkQ3lsaW5kZXIgZHNEcmF3Q2Fw
cGVkQ3lsaW5kZXJEDQojZW5kaWYNCg0KDQovLyBzb21lIGNvbnN0YW50cw0KDQojZGVmaW5lIE5V
TSAyMAkJCS8vIG1heCBudW1iZXIgb2Ygb2JqZWN0cw0KI2RlZmluZSBERU5TSVRZICg1LjApCQkv
LyBkZW5zaXR5IG9mIGFsbCBvYmplY3RzDQojZGVmaW5lIEdQQiAzCQkJLy8gbWF4aW11bSBudW1i
ZXIgb2YgZ2VvbWV0cmllcyBwZXIgYm9keQ0KDQoNCi8vIGR5bmFtaWNzIGFuZCBjb2xsaXNpb24g
b2JqZWN0cw0KDQpzdHJ1Y3QgTXlPYmplY3Qgew0KICBkQm9keUlEIGJvZHk7CQkJLy8gdGhlIGJv
ZHkNCiAgZEdlb21JRCBnZW9tW0dQQl07CQkvLyBnZW9tZXRyaWVzIHJlcHJlc2VudGluZyB0aGlz
IGJvZHkNCn07DQoNCnN0YXRpYyBkV29ybGRJRCB3b3JsZDsNCnN0YXRpYyBkU3BhY2VJRCBzcGFj
ZTsNCnN0YXRpYyBkSm9pbnRHcm91cElEIGNvbnRhY3Rncm91cDsNCg0Kc3RhdGljIE15T2JqZWN0
IG9ialtOVU1dOw0Kc3RhdGljIGludCBudW09MDsJCS8vIG51bWJlciBvZiBvYmplY3RzIGluIHNp
bXVsYXRpb24NCnN0YXRpYyBpbnQgbmV4dG9iaj0wOwkJLy8gbmV4dCBvYmplY3QgdG8gcmVjeWNs
ZSBpZiBudW09PU5VTQ0Kc3RhdGljIGludCBzZWxlY3RlZCA9IC0xOwkvLyBzZWxlY3RlZCBvYmpl
Y3QNCnN0YXRpYyBpbnQgc2hvd19hYWJiID0gMDsJLy8gc2hvdyBnZW9tIEFBQkJzPw0KDQoNCg0K
Ly8gdGhpcyBpcyBjYWxsZWQgYnkgZFNwYWNlQ29sbGlkZSB3aGVuIHR3byBvYmplY3RzIGluIHNw
YWNlIGFyZQ0KLy8gcG90ZW50aWFsbHkgY29sbGlkaW5nLg0KDQpzdGF0aWMgdm9pZCBuZWFyQ2Fs
bGJhY2sgKHZvaWQgKmRhdGEsIGRHZW9tSUQgbzEsIGRHZW9tSUQgbzIpDQp7DQogIGludCBpOw0K
ICAvLyBpZiAobzEtPmJvZHkgJiYgbzItPmJvZHkpIHJldHVybjsNCg0KICAvLyBleGl0IHdpdGhv
dXQgZG9pbmcgYW55dGhpbmcgaWYgdGhlIHR3byBib2RpZXMgYXJlIGNvbm5lY3RlZCBieSBhIGpv
aW50DQogIGRCb2R5SUQgYjEgPSBkR2VvbUdldEJvZHkobzEpOw0KICBkQm9keUlEIGIyID0gZEdl
b21HZXRCb2R5KG8yKTsNCiAgaWYgKGIxICYmIGIyICYmIGRBcmVDb25uZWN0ZWQgKGIxLGIyKSkg
cmV0dXJuOw0KDQogIGRDb250YWN0IGNvbnRhY3RbM107CQkJLy8gdXAgdG8gMyBjb250YWN0cyBw
ZXIgYm94DQogIGZvciAoaT0wOyBpPDM7IGkrKykgew0KICAgIGNvbnRhY3RbaV0uc3VyZmFjZS5t
b2RlID0gZENvbnRhY3RCb3VuY2U7IC8vZENvbnRhY3RNdTI7DQogICAgY29udGFjdFtpXS5zdXJm
YWNlLm11ID0gZEluZmluaXR5Ow0KICAgIGNvbnRhY3RbaV0uc3VyZmFjZS5tdTIgPSAwOw0KICAg
IGNvbnRhY3RbaV0uc3VyZmFjZS5ib3VuY2UgPSAwLmY7DQogICAgY29udGFjdFtpXS5zdXJmYWNl
LmJvdW5jZV92ZWwgPSAwLjE7DQogIH0NCiAgaWYgKGludCBudW1jID0gZENvbGxpZGUgKG8xLG8y
LDMsJmNvbnRhY3RbMF0uZ2VvbSxzaXplb2YoZENvbnRhY3QpKSkgew0KICAgIC8vIGRNYXRyaXgz
IFJJOw0KICAgIC8vIGRSU2V0SWRlbnRpdHkgKFJJKTsNCiAgICAvLyBjb25zdCBkUmVhbCBzc1sz
XSA9IHswLjAyLDAuMDIsMC4wMn07DQogICAgZm9yIChpPTA7IGk8bnVtYzsgaSsrKSB7DQogICAg
ICBkSm9pbnRJRCBjID0gZEpvaW50Q3JlYXRlQ29udGFjdCAod29ybGQsY29udGFjdGdyb3VwLGNv
bnRhY3QraSk7DQogICAgICBkSm9pbnRBdHRhY2ggKGMsYjEsYjIpOw0KICAgICAgLy8gZHNEcmF3
Qm94IChjb250YWN0W2ldLmdlb20ucG9zLFJJLHNzKTsNCiAgICB9DQogIH0NCn0NCg0KDQovLyBz
dGFydCBzaW11bGF0aW9uIC0gc2V0IHZpZXdwb2ludA0KDQpzdGF0aWMgdm9pZCBzdGFydCgpDQp7
DQogIHN0YXRpYyBmbG9hdCB4eXpbM10gPSB7MC5mLC0xNC5mLDkuZn07DQogIHN0YXRpYyBmbG9h
dCBocHJbM10gPSB7OTAuZiwtMjUuZiwwLmZ9Ow0KICBkc1NldFZpZXdwb2ludCAoeHl6LGhwcik7
DQoNCiAgcHJpbnRmICgiVG8gcmVzZXQgdGhlIHRlc3QsIHByZXNzIHIuXG4iKTsNCiAgcHJpbnRm
ICgiVG8gc2VsZWN0IGFuIG9iamVjdCwgcHJlc3Mgc3BhY2UuXG4iKTsNCiAgcHJpbnRmICgiVG8g
ZGlzYWJsZSB0aGUgc2VsZWN0ZWQgb2JqZWN0LCBwcmVzcyBkLlxuIik7DQogIHByaW50ZiAoIlRv
IGVuYWJsZSB0aGUgc2VsZWN0ZWQgb2JqZWN0LCBwcmVzcyBlLlxuIik7DQogIHByaW50ZiAoIlRv
IHRvZ2dsZSBzaG93aW5nIHRoZSBnZW9tIEFBQkJzLCBwcmVzcyBhLlxuIik7DQp9DQoNCg0KY2hh
ciBsb2Nhc2UgKGNoYXIgYykNCnsNCiAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSByZXR1cm4g
YyAtICgnYSctJ0EnKTsNCiAgZWxzZSByZXR1cm4gYzsNCn0NCg0Kc3RhdGljIHZvaWQgZGVzdHJv
eUFsbE9iamVjdHMgKCkNCnsNCiAgZm9yIChpbnQgaT0wOyBpPG51bTsgaSsrKQ0KICB7DQogICAg
Ly8gZGVzdHJveSB0aGUgYm9keSBhbmQgZ2VvbXMgZm9yIHNsb3QgaQ0KICAgIGlmIChvYmpbaV0u
Ym9keSkgZEJvZHlEZXN0cm95IChvYmpbaV0uYm9keSk7DQogICAgZm9yIChpbnQgaz0wOyBrIDwg
R1BCOyBrKyspDQogICAgew0KICAgICAgaWYgKG9ialtpXS5nZW9tW2tdKSBkR2VvbURlc3Ryb3kg
KG9ialtpXS5nZW9tW2tdKTsNCiAgICB9DQogICAgbWVtc2V0ICgmb2JqW2ldLDAsc2l6ZW9mKG9i
altpXSkpOw0KICB9DQogIG51bSA9IDA7DQogIG5leHRvYmogPSAwOw0KICBzZWxlY3RlZCA9IC0x
Ow0KfQ0KDQovLyBjYWxsZWQgd2hlbiBhIGtleSBwcmVzc2VkDQoNCnN0YXRpYyB2b2lkIGNvbW1h
bmQgKGludCBjbWQpDQp7DQogIGludCBpLGosazsNCiAgZFJlYWwgc2lkZXNbM107DQogIGRNYXNz
IG07DQoNCiAgY21kID0gbG9jYXNlIChjbWQpOw0KDQogIGlmIChjbWQgPT0gJ3InKQ0KICB7DQog
ICAgLy8gVGVzdCAyOiBkcm9wIHNsaWdodGVyIGxhcmdlciBib3ggb24gYSBzbWFsbGVyIGJveA0K
ICAgIC8vIEV4cGVjdGVkIHJlc3VsdHM6IG5vIGJvdW5jZSBhbmQgY29tZSB0byBpbW1lZGlhdGUg
cmVzdA0KICAgIGRlc3Ryb3lBbGxPYmplY3RzKCk7DQoNCiAgICBpPW51bSsrOw0KICAgIG9ialtp
XS5ib2R5ID0gZEJvZHlDcmVhdGUgKHdvcmxkKTsNCiAgICBkQm9keVNldFBvc2l0aW9uIChvYmpb
aV0uYm9keSwgMCwgMCwgOSk7DQogICAgZEJvZHlTZXREYXRhIChvYmpbaV0uYm9keSwodm9pZCop
IGkpOw0KICAgIG9ialtpXS5nZW9tWzBdID0gZENyZWF0ZUJveCAoc3BhY2UsIDUsIDUsIDUpOw0K
ICAgIGRHZW9tU2V0Qm9keSAob2JqW2ldLmdlb21bMF0sb2JqW2ldLmJvZHkpOw0KICAgIGRNYXNz
U2V0Qm94ICgmbSwgNSwgNSwgNSwgNSk7ICAvLyA2MjVrZw0KICAgIGRCb2R5U2V0TWFzcyAob2Jq
W2ldLmJvZHksJm0pOw0KDQogICAgaT1udW0rKzsNCiAgICBvYmpbaV0uYm9keSA9IGRCb2R5Q3Jl
YXRlICh3b3JsZCk7DQogICAgZEJvZHlTZXRQb3NpdGlvbiAob2JqW2ldLmJvZHksIDAsIDAsIDMp
Ow0KICAgIGRCb2R5U2V0RGF0YSAob2JqW2ldLmJvZHksKHZvaWQqKSBpKTsNCiAgICBvYmpbaV0u
Z2VvbVswXSA9IGRDcmVhdGVCb3ggKHNwYWNlLCA0LCA0LCA0KTsNCiAgICBkR2VvbVNldEJvZHkg
KG9ialtpXS5nZW9tWzBdLG9ialtpXS5ib2R5KTsNCiAgICBkTWFzc1NldEJveCAoJm0sIDUsIDQs
IDQsIDQpOyAgLy8gMzIwa2cNCiAgICBkQm9keVNldE1hc3MgKG9ialtpXS5ib2R5LCZtKTsNCiAg
fQ0KDQogIGlmIChjbWQgPT0gJyAnKSB7DQogICAgc2VsZWN0ZWQrKzsNCiAgICBpZiAoc2VsZWN0
ZWQgPj0gbnVtKSBzZWxlY3RlZCA9IDA7DQogICAgaWYgKHNlbGVjdGVkIDwgMCkgc2VsZWN0ZWQg
PSAwOw0KICB9DQogIGVsc2UgaWYgKGNtZCA9PSAnZCcgJiYgc2VsZWN0ZWQgPj0gMCAmJiBzZWxl
Y3RlZCA8IG51bSkgew0KICAgIGRCb2R5RGlzYWJsZSAob2JqW3NlbGVjdGVkXS5ib2R5KTsNCiAg
fQ0KICBlbHNlIGlmIChjbWQgPT0gJ2UnICYmIHNlbGVjdGVkID49IDAgJiYgc2VsZWN0ZWQgPCBu
dW0pIHsNCiAgICBkQm9keUVuYWJsZSAob2JqW3NlbGVjdGVkXS5ib2R5KTsNCiAgfQ0KICBlbHNl
IGlmIChjbWQgPT0gJ2EnKSB7DQogICAgc2hvd19hYWJiIF49IDE7DQogIH0NCn0NCg0KDQovLyBk
cmF3IGEgZ2VvbQ0KDQp2b2lkIGRyYXdHZW9tIChkR2VvbUlEIGcsIGNvbnN0IGRSZWFsICpwb3Ms
IGNvbnN0IGRSZWFsICpSLCBpbnQgc2hvd19hYWJiKQ0Kew0KICBpZiAoIWcpIHJldHVybjsNCiAg
aWYgKCFwb3MpIHBvcyA9IGRHZW9tR2V0UG9zaXRpb24gKGcpOw0KICBpZiAoIVIpIFIgPSBkR2Vv
bUdldFJvdGF0aW9uIChnKTsNCg0KICBpbnQgdHlwZSA9IGRHZW9tR2V0Q2xhc3MgKGcpOw0KICBp
ZiAodHlwZSA9PSBkQm94Q2xhc3MpIHsNCiAgICBkVmVjdG9yMyBzaWRlczsNCiAgICBkR2VvbUJv
eEdldExlbmd0aHMgKGcsc2lkZXMpOw0KICAgIGRzRHJhd0JveCAocG9zLFIsc2lkZXMpOw0KICB9
DQoNCiAgaWYgKHNob3dfYWFiYikgew0KICAgIC8vIGRyYXcgdGhlIGJvdW5kaW5nIGJveCBmb3Ig
dGhpcyBnZW9tDQogICAgZFJlYWwgYWFiYls2XTsNCiAgICBkR2VvbUdldEFBQkIgKGcsYWFiYik7
DQogICAgZFZlY3RvcjMgYmJwb3M7DQogICAgaW50IGk7DQogICAgZm9yIChpPTA7IGk8MzsgaSsr
KSBiYnBvc1tpXSA9IDAuNSooYWFiYltpKjJdICsgYWFiYltpKjIrMV0pOw0KICAgIGRWZWN0b3Iz
IGJic2lkZXM7DQogICAgZm9yIChpPTA7IGk8MzsgaSsrKSBiYnNpZGVzW2ldID0gYWFiYltpKjIr
MV0gLSBhYWJiW2kqMl07DQogICAgZE1hdHJpeDMgUkk7DQogICAgZFJTZXRJZGVudGl0eSAoUkkp
Ow0KICAgIGRzU2V0Q29sb3JBbHBoYSAoMSwwLDAsMC41KTsNCiAgICBkc0RyYXdCb3ggKGJicG9z
LFJJLGJic2lkZXMpOw0KICB9DQp9DQoNCg0KLy8gc2ltdWxhdGlvbiBsb29wDQoNCnN0YXRpYyB2
b2lkIHNpbUxvb3AgKGludCBwYXVzZSkNCnsNCiAgZHNTZXRDb2xvciAoMCwwLDIpOw0KICBkU3Bh
Y2VDb2xsaWRlIChzcGFjZSwwLCZuZWFyQ2FsbGJhY2spOw0KICBpZiAoIXBhdXNlKSBkV29ybGRT
dGVwICh3b3JsZCwwLjA1KTsNCg0KICAvLyByZW1vdmUgYWxsIGNvbnRhY3Qgam9pbnRzDQogIGRK
b2ludEdyb3VwRW1wdHkgKGNvbnRhY3Rncm91cCk7DQoNCiAgZHNTZXRDb2xvciAoMSwxLDApOw0K
ICBkc1NldFRleHR1cmUgKERTX1dPT0QpOw0KICBmb3IgKGludCBpPTA7IGk8bnVtOyBpKyspIHsN
CiAgICBmb3IgKGludCBqPTA7IGogPCBHUEI7IGorKykgew0KICAgICAgaWYgKGk9PXNlbGVjdGVk
KSB7DQogICAgICAgIGRzU2V0Q29sb3IgKDAsMC43LDEpOw0KICAgICAgfQ0KICAgICAgZWxzZSBp
ZiAoISBkQm9keUlzRW5hYmxlZCAob2JqW2ldLmJvZHkpKSB7DQogICAgICAgIGRzU2V0Q29sb3Ig
KDEsMCwwKTsNCiAgICAgIH0NCiAgICAgIGVsc2Ugew0KICAgICAgICBkc1NldENvbG9yICgxLDEs
MCk7DQogICAgICB9DQogICAgICBkcmF3R2VvbSAob2JqW2ldLmdlb21bal0sMCwwLHNob3dfYWFi
Yik7DQogICAgfQ0KICB9DQp9DQoNCg0KaW50IG1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikN
CnsNCiAgLy8gc2V0dXAgcG9pbnRlcnMgdG8gZHJhd3N0dWZmIGNhbGxiYWNrIGZ1bmN0aW9ucw0K
ICBkc0Z1bmN0aW9ucyBmbjsNCiAgZm4udmVyc2lvbiA9IERTX1ZFUlNJT047DQogIGZuLnN0YXJ0
ID0gJnN0YXJ0Ow0KICBmbi5zdGVwID0gJnNpbUxvb3A7DQogIGZuLmNvbW1hbmQgPSAmY29tbWFu
ZDsNCiAgZm4uc3RvcCA9IDA7DQogIGZuLnBhdGhfdG9fdGV4dHVyZXMgPSAiLi4vLi4vZHJhd3N0
dWZmL3RleHR1cmVzIjsNCg0KICAvLyBjcmVhdGUgd29ybGQNCg0KICB3b3JsZCA9IGRXb3JsZENy
ZWF0ZSgpOw0KICBzcGFjZSA9IGRIYXNoU3BhY2VDcmVhdGUgKDApOw0KICBjb250YWN0Z3JvdXAg
PSBkSm9pbnRHcm91cENyZWF0ZSAoMCk7DQogIGRXb3JsZFNldEdyYXZpdHkgKHdvcmxkLDAsMCwt
OS44Zik7DQogIGRXb3JsZFNldENGTSAod29ybGQsMWUtNSk7DQogIGRDcmVhdGVQbGFuZSAoc3Bh
Y2UsMCwwLDEsMCk7DQogIG1lbXNldCAob2JqLDAsc2l6ZW9mKG9iaikpOw0KDQogIGNvbW1hbmQg
KCdyJyk7DQoNCiAgLy8gcnVuIHNpbXVsYXRpb24NCiAgZHNTaW11bGF0aW9uTG9vcCAoYXJnYyxh
cmd2LDM1MiwyODgsJmZuKTsNCg0KICBkSm9pbnRHcm91cERlc3Ryb3kgKGNvbnRhY3Rncm91cCk7
DQogIGRTcGFjZURlc3Ryb3kgKHNwYWNlKTsNCiAgZFdvcmxkRGVzdHJveSAod29ybGQpOw0KDQog
IHJldHVybiAwOw0KfQ0K

------_=_NextPart_001_01C291F3.A8E1CEDE--