|
From: Roland L. <rol...@go...> - 2008-01-02 10:24:27
|
LyogLSotIG1vZGU6IGMrKzsgdGFiLXdpZHRoOiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IGMt YmFzaWMtb2Zmc2V0OiA0IC0qLSAqLwoKLyoKIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAw NyBTdGF0UHJvIEl0YWxpYSBzcmwKCiBUaGlzIGZpbGUgaXMgcGFydCBvZiBRdWFudExpYiwgYSBm cmVlLXNvZnR3YXJlL29wZW4tc291cmNlIGxpYnJhcnkKIGZvciBmaW5hbmNpYWwgcXVhbnRpdGF0 aXZlIGFuYWx5c3RzIGFuZCBkZXZlbG9wZXJzIC0gaHR0cDovL3F1YW50bGliLm9yZy8KCiBRdWFu dExpYiBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9k aWZ5IGl0CiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIFF1YW50TGliIGxpY2Vuc2UuICBZb3Ugc2hv dWxkIGhhdmUgcmVjZWl2ZWQgYQogY29weSBvZiB0aGUgbGljZW5zZSBhbG9uZyB3aXRoIHRoaXMg cHJvZ3JhbTsgaWYgbm90LCBwbGVhc2UgZW1haWwKIDxxdWFudGxpYi1kZXZAbGlzdHMuc2YubmV0 Pi4gVGhlIGxpY2Vuc2UgaXMgYWxzbyBhdmFpbGFibGUgb25saW5lIGF0CiA8aHR0cDovL3F1YW50 bGliLm9yZy9saWNlbnNlLnNodG1sPi4KCiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4g dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIEFOWSBXQVJSQU5U WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBv ciBGSVRORVNTCiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIGxpY2Vuc2UgZm9y IG1vcmUgZGV0YWlscy4KKi8KCi8vIFJMIAojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxx bC91dGlsaXRpZXMvZGF0YXBhcnNlcnMuaHBwPgojaW5jbHVkZSA8cWwvdGltZS9jYWxlbmRhcnMv am9pbnRjYWxlbmRhci5ocHA+Ci8vLyBSTAoKI2luY2x1ZGUgInBpZWNld2lzZXlpZWxkY3VydmUu aHBwIgojaW5jbHVkZSAidXRpbGl0aWVzLmhwcCIKI2luY2x1ZGUgPHFsL3Rlcm1zdHJ1Y3R1cmVz L3lpZWxkL3BpZWNld2lzZXlpZWxkY3VydmUuaHBwPgojaW5jbHVkZSA8cWwvdGVybXN0cnVjdHVy ZXMveWllbGQvcmF0ZWhlbHBlcnMuaHBwPgojaW5jbHVkZSA8cWwvdGVybXN0cnVjdHVyZXMveWll bGQvYm9uZGhlbHBlcnMuaHBwPgojaW5jbHVkZSA8cWwvdGVybXN0cnVjdHVyZXMveWllbGQvZmxh dGZvcndhcmQuaHBwPgojaW5jbHVkZSA8cWwvdGltZS9jYWxlbmRhcnMvdGFyZ2V0LmhwcD4KI2lu Y2x1ZGUgPHFsL3RpbWUvZGF5Y291bnRlcnMvYWN0dWFsMzYwLmhwcD4KI2luY2x1ZGUgPHFsL3Rp bWUvZGF5Y291bnRlcnMvYWN0dWFsYWN0dWFsLmhwcD4KI2luY2x1ZGUgPHFsL3RpbWUvZGF5Y291 bnRlcnMvdGhpcnR5MzYwLmhwcD4KI2luY2x1ZGUgPHFsL2luZGV4ZXMvaWJvci9ldXJpYm9yLmhw cD4KI2luY2x1ZGUgPHFsL2luZGV4ZXMvaWJvci91c2RsaWJvci5ocHA+CiNpbmNsdWRlIDxxbC9p bmRleGVzL2JtYWluZGV4LmhwcD4KI2luY2x1ZGUgPHFsL2luZGV4ZXMvaW5kZXhtYW5hZ2VyLmhw cD4KI2luY2x1ZGUgPHFsL2luc3RydW1lbnRzL2ZvcndhcmRyYXRlYWdyZWVtZW50LmhwcD4KI2lu Y2x1ZGUgPHFsL2luc3RydW1lbnRzL21ha2V2YW5pbGxhc3dhcC5ocHA+CiNpbmNsdWRlIDxxbC9t YXRoL2ludGVycG9sYXRpb25zL2xpbmVhcmludGVycG9sYXRpb24uaHBwPgojaW5jbHVkZSA8cWwv bWF0aC9pbnRlcnBvbGF0aW9ucy9sb2dpbnRlcnBvbGF0aW9uLmhwcD4KI2luY2x1ZGUgPHFsL21h dGgvaW50ZXJwb2xhdGlvbnMvYmFja3dhcmRmbGF0aW50ZXJwb2xhdGlvbi5ocHA+CiNpbmNsdWRl IDxxbC9tYXRoL2ludGVycG9sYXRpb25zL2N1Ymljc3BsaW5lLmhwcD4KI2luY2x1ZGUgPHFsL3F1 b3Rlcy9zaW1wbGVxdW90ZS5ocHA+CiNpbmNsdWRlIDxxbC91dGlsaXRpZXMvZGF0YWZvcm1hdHRl cnMuaHBwPgojaW5jbHVkZSA8cWwvcHJpY2luZ2VuZ2luZXMvYm9uZC9kaXNjb3VudGluZ2JvbmRl bmdpbmUuaHBwPgojaW5jbHVkZSA8cWwvcHJpY2luZ2VuZ2luZXMvc3dhcC9kaXNjb3VudGluZ3N3 YXBlbmdpbmUuaHBwPgoKdXNpbmcgbmFtZXNwYWNlIFF1YW50TGliOwp1c2luZyBuYW1lc3BhY2Ug Ym9vc3Q6OnVuaXRfdGVzdF9mcmFtZXdvcms7CgpRTF9CRUdJTl9URVNUX0xPQ0FMUyhQaWVjZXdp c2VZaWVsZEN1cnZlVGVzdCkKCnN0cnVjdCBEYXR1bSB7CiAgICBJbnRlZ2VyIG47CiAgICBUaW1l VW5pdCB1bml0czsKICAgIFJhdGUgcmF0ZTsKfTsKCnN0cnVjdCBCb25kRGF0dW0gewogICAgSW50 ZWdlciBuOwogICAgVGltZVVuaXQgdW5pdHM7CiAgICBJbnRlZ2VyIGxlbmd0aDsKICAgIEZyZXF1 ZW5jeSBmcmVxdWVuY3k7CiAgICBSYXRlIGNvdXBvbjsKICAgIFJlYWwgcHJpY2U7Cn07CgpEYXR1 bSBkZXBvc2l0RGF0YVtdID0gewogICAgeyAxLCBXZWVrcywgIDQuNTU5IH0sCiAgICB7IDEsIE1v bnRocywgNC41ODEgfSwKICAgIHsgMiwgTW9udGhzLCA0LjU3MyB9LAogICAgeyAzLCBNb250aHMs IDQuNTU3IH0sCiAgICB7IDYsIE1vbnRocywgNC40OTYgfSwKICAgIHsgOSwgTW9udGhzLCA0LjQ5 MCB9Cn07CgpEYXR1bSBmcmFEYXRhW10gPSB7CiAgICB7IDEsIE1vbnRocywgNC41ODEgfSwKICAg IHsgMiwgTW9udGhzLCA0LjU3MyB9LAogICAgeyAzLCBNb250aHMsIDQuNTU3IH0sCiAgICB7IDYs IE1vbnRocywgNC40OTYgfSwKICAgIHsgOSwgTW9udGhzLCA0LjQ5MCB9Cn07CgpEYXR1bSBzd2Fw RGF0YVtdID0gewogICAgeyAgMSwgWWVhcnMsIDQuNTQgfSwKICAgIHsgIDIsIFllYXJzLCA0LjYz IH0sCiAgICB7ICAzLCBZZWFycywgNC43NSB9LAogICAgeyAgNCwgWWVhcnMsIDQuODYgfSwKICAg IHsgIDUsIFllYXJzLCA0Ljk5IH0sCiAgICB7ICA2LCBZZWFycywgNS4xMSB9LAogICAgeyAgNywg WWVhcnMsIDUuMjMgfSwKICAgIHsgIDgsIFllYXJzLCA1LjMzIH0sCiAgICB7ICA5LCBZZWFycywg NS40MSB9LAogICAgeyAxMCwgWWVhcnMsIDUuNDcgfSwKICAgIHsgMTIsIFllYXJzLCA1LjYwIH0s CiAgICB7IDE1LCBZZWFycywgNS43NSB9LAogICAgeyAyMCwgWWVhcnMsIDUuODkgfSwKICAgIHsg MjUsIFllYXJzLCA1Ljk1IH0sCiAgICB7IDMwLCBZZWFycywgNS45NiB9Cn07CgpCb25kRGF0dW0g Ym9uZERhdGFbXSA9IHsKICAgIHsgIDYsIE1vbnRocywgNSwgU2VtaWFubnVhbCwgNC43NSwgMTAx LjMyMCB9LAogICAgeyAgMSwgWWVhcnMsICAzLCBTZW1pYW5udWFsLCAyLjc1LCAxMDAuNTkwIH0s CiAgICB7ICAyLCBZZWFycywgIDUsIFNlbWlhbm51YWwsIDUuMDAsIDEwNS42NTAgfSwKICAgIHsg IDUsIFllYXJzLCAxMSwgU2VtaWFubnVhbCwgNS41MCwgMTEzLjYxMCB9LAogICAgeyAxMCwgWWVh cnMsIDExLCBTZW1pYW5udWFsLCAzLjc1LCAxMDQuMDcwIH0KfTsKCkRhdHVtIGJtYURhdGFbXSA9 IHsKICAgIHsgIDEsIFllYXJzLCA2Ny41NiB9LAogICAgeyAgMiwgWWVhcnMsIDY4LjAwIH0sCiAg ICB7ICAzLCBZZWFycywgNjguMjUgfSwKICAgIHsgIDQsIFllYXJzLCA2OC41MCB9LAogICAgeyAg NSwgWWVhcnMsIDY4LjgxIH0sCiAgICB7ICA3LCBZZWFycywgNjkuNTAgfSwKICAgIHsgMTAsIFll YXJzLCA3MC40NCB9LAogICAgeyAxNSwgWWVhcnMsIDcxLjY5IH0sCiAgICB7IDIwLCBZZWFycywg NzIuNjkgfSwKICAgIHsgMzAsIFllYXJzLCA3My44MSB9Cn07CgoKLy8gdGVzdC1nbG9iYWwgdmFy aWFibGVzCgpDYWxlbmRhciBjYWxlbmRhcjsKTmF0dXJhbCBzZXR0bGVtZW50RGF5czsKRGF0ZSB0 b2RheSwgc2V0dGxlbWVudDsKQnVzaW5lc3NEYXlDb252ZW50aW9uIGZpeGVkTGVnQ29udmVudGlv bjsKRnJlcXVlbmN5IGZpeGVkTGVnRnJlcXVlbmN5OwpEYXlDb3VudGVyIGZpeGVkTGVnRGF5Q291 bnRlcjsKTmF0dXJhbCBib25kU2V0dGxlbWVudERheXM7CkRheUNvdW50ZXIgYm9uZERheUNvdW50 ZXI7CkJ1c2luZXNzRGF5Q29udmVudGlvbiBib25kQ29udmVudGlvbjsKUmVhbCBib25kUmVkZW1w dGlvbjsKRnJlcXVlbmN5IGJtYUZyZXF1ZW5jeTsKQnVzaW5lc3NEYXlDb252ZW50aW9uIGJtYUNv bnZlbnRpb247CkRheUNvdW50ZXIgYm1hRGF5Q291bnRlcjsKClNpemUgZGVwb3NpdHMsIGZyYXMs IHN3YXBzLCBib25kcywgYm1hczsKc3RkOjp2ZWN0b3I8Ym9vc3Q6OnNoYXJlZF9wdHI8U2ltcGxl UXVvdGU+ID4gcmF0ZXMsIGZyYVJhdGVzLCBwcmljZXMsIGZyYWN0aW9uczsKc3RkOjp2ZWN0b3I8 Ym9vc3Q6OnNoYXJlZF9wdHI8UmF0ZUhlbHBlcj4gPiBpbnN0cnVtZW50cywgZnJhSGVscGVycywK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib25kSGVscGVycywg Ym1hSGVscGVyczsKc3RkOjp2ZWN0b3I8U2NoZWR1bGU+IHNjaGVkdWxlczsKYm9vc3Q6OnNoYXJl ZF9wdHI8WWllbGRUZXJtU3RydWN0dXJlPiB0ZXJtU3RydWN0dXJlOwoKdm9pZCBzZXR1cCgpIHsK CiAgICAvLyBkYXRhCiAgICBjYWxlbmRhciA9IFRBUkdFVCgpOwogICAgc2V0dGxlbWVudERheXMg PSAyOwoKICAgIC8vIFJMCiAgICAvL3RvZGF5ID0gY2FsZW5kYXIuYWRqdXN0KERhdGU6OnRvZGF5 c0RhdGUoKSk7CiAgICBpZiAoZ2V0ZW52KCJUT0RBWSIpKQogICAgICAgIHRvZGF5ID0gY2FsZW5k YXIuYWRqdXN0KERhdGVQYXJzZXI6OnBhcnNlSVNPKGdldGVudigiVE9EQVkiKSkpOwogICAgZWxz ZQogICAgICAgIHRvZGF5ID0gY2FsZW5kYXIuYWRqdXN0KERhdGU6OnRvZGF5c0RhdGUoKSk7CiAg ICAvLy8gUkwKCiAgICBTZXR0aW5nczo6aW5zdGFuY2UoKS5ldmFsdWF0aW9uRGF0ZSgpID0gdG9k YXk7CiAgICBzZXR0bGVtZW50ID0gY2FsZW5kYXIuYWR2YW5jZSh0b2RheSxzZXR0bGVtZW50RGF5 cyxEYXlzKTsKICAgIGZpeGVkTGVnQ29udmVudGlvbiA9IFVuYWRqdXN0ZWQ7CiAgICBmaXhlZExl Z0ZyZXF1ZW5jeSA9IEFubnVhbDsKICAgIGZpeGVkTGVnRGF5Q291bnRlciA9IFRoaXJ0eTM2MCgp OwogICAgYm9uZFNldHRsZW1lbnREYXlzID0gMzsKICAgIGJvbmREYXlDb3VudGVyID0gQWN0dWFs QWN0dWFsKCk7CiAgICBib25kQ29udmVudGlvbiA9IEZvbGxvd2luZzsKICAgIGJvbmRSZWRlbXB0 aW9uID0gMTAwLjA7CiAgICBibWFGcmVxdWVuY3kgPSBRdWFydGVybHk7CiAgICBibWFDb252ZW50 aW9uID0gRm9sbG93aW5nOwogICAgYm1hRGF5Q291bnRlciA9IEFjdHVhbEFjdHVhbCgpOwoKICAg IGRlcG9zaXRzID0gTEVOR1RIKGRlcG9zaXREYXRhKTsKICAgIGZyYXMgPSBMRU5HVEgoZnJhRGF0 YSk7CiAgICBzd2FwcyA9IExFTkdUSChzd2FwRGF0YSk7CiAgICBib25kcyA9IExFTkdUSChib25k RGF0YSk7CiAgICBibWFzID0gTEVOR1RIKGJtYURhdGEpOwoKICAgIC8vIG1hcmtldCBlbGVtZW50 cwogICAgcmF0ZXMgPSBzdGQ6OnZlY3Rvcjxib29zdDo6c2hhcmVkX3B0cjxTaW1wbGVRdW90ZT4g PihkZXBvc2l0cytzd2Fwcyk7CiAgICBmcmFSYXRlcyA9IHN0ZDo6dmVjdG9yPGJvb3N0OjpzaGFy ZWRfcHRyPFNpbXBsZVF1b3RlPiA+KGZyYXMpOwogICAgcHJpY2VzID0gc3RkOjp2ZWN0b3I8Ym9v c3Q6OnNoYXJlZF9wdHI8U2ltcGxlUXVvdGU+ID4oYm9uZHMpOwogICAgZnJhY3Rpb25zID0gc3Rk Ojp2ZWN0b3I8Ym9vc3Q6OnNoYXJlZF9wdHI8U2ltcGxlUXVvdGU+ID4oYm1hcyk7CiAgICBmb3Ig KFNpemUgaT0wOyBpPGRlcG9zaXRzOyBpKyspIHsKICAgICAgICByYXRlc1tpXSA9IGJvb3N0Ojpz aGFyZWRfcHRyPFNpbXBsZVF1b3RlPigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgbmV3IFNpbXBsZVF1b3RlKGRlcG9zaXREYXRhW2ldLnJhdGUvMTAwKSk7CiAgICB9CiAgICBm b3IgKFNpemUgaT0wOyBpPHN3YXBzOyBpKyspIHsKICAgICAgICByYXRlc1tpK2RlcG9zaXRzXSA9 IGJvb3N0OjpzaGFyZWRfcHRyPFNpbXBsZVF1b3RlPigKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgbmV3IFNpbXBsZVF1b3RlKHN3YXBEYXRhW2ldLnJhdGUvMTAwKSk7CiAg ICB9CiAgICBmb3IgKFNpemUgaT0wOyBpPGZyYXM7IGkrKykgewogICAgICAgIGZyYVJhdGVzW2ld ID0gYm9vc3Q6OnNoYXJlZF9wdHI8U2ltcGxlUXVvdGU+KAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZVF1b3RlKGZyYURhdGFbaV0ucmF0ZS8xMDApKTsK ICAgIH0KICAgIGZvciAoU2l6ZSBpPTA7IGk8Ym9uZHM7IGkrKykgewogICAgICAgIHByaWNlc1tp XSA9IGJvb3N0OjpzaGFyZWRfcHRyPFNpbXBsZVF1b3RlPigKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZVF1b3RlKGJvbmREYXRhW2ldLnByaWNlKSk7 CiAgICB9CiAgICBmb3IgKFNpemUgaT0wOyBpPGJtYXM7IGkrKykgewogICAgICAgIGZyYWN0aW9u c1tpXSA9IGJvb3N0OjpzaGFyZWRfcHRyPFNpbXBsZVF1b3RlPigKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVRdW90ZShibWFEYXRhW2ldLnJhdGUvMTAw KSk7CiAgICB9CgogICAgLy8gcmF0ZSBoZWxwZXJzCiAgICBpbnN0cnVtZW50cyA9IHN0ZDo6dmVj dG9yPGJvb3N0OjpzaGFyZWRfcHRyPFJhdGVIZWxwZXI+ID4oZGVwb3NpdHMrc3dhcHMpOwogICAg ZnJhSGVscGVycyA9IHN0ZDo6dmVjdG9yPGJvb3N0OjpzaGFyZWRfcHRyPFJhdGVIZWxwZXI+ID4o ZnJhcyk7CiAgICBib25kSGVscGVycyA9IHN0ZDo6dmVjdG9yPGJvb3N0OjpzaGFyZWRfcHRyPFJh dGVIZWxwZXI+ID4oYm9uZHMpOwogICAgc2NoZWR1bGVzID0gc3RkOjp2ZWN0b3I8U2NoZWR1bGU+ KGJvbmRzKTsKICAgIGJtYUhlbHBlcnMgPSBzdGQ6OnZlY3Rvcjxib29zdDo6c2hhcmVkX3B0cjxS YXRlSGVscGVyPiA+KGJtYXMpOwoKICAgIGJvb3N0OjpzaGFyZWRfcHRyPElib3JJbmRleD4gZXVy aWJvcjZtKG5ldyBFdXJpYm9yNk0pOwogICAgZm9yIChTaXplIGk9MDsgaTxkZXBvc2l0czsgaSsr KSB7CiAgICAgICAgSGFuZGxlPFF1b3RlPiByKHJhdGVzW2ldKTsKICAgICAgICBpbnN0cnVtZW50 c1tpXSA9IGJvb3N0OjpzaGFyZWRfcHRyPFJhdGVIZWxwZXI+KAogICAgICAgICAgICAgIG5ldyBE ZXBvc2l0UmF0ZUhlbHBlcihyLCBkZXBvc2l0RGF0YVtpXS5uKmRlcG9zaXREYXRhW2ldLnVuaXRz LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0bGVtZW50RGF5cywgY2Fs ZW5kYXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV1cmlib3I2bS0+YnVz aW5lc3NEYXlDb252ZW50aW9uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGV1cmlib3I2bS0+ZW5kT2ZNb250aCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBldXJpYm9yNm0tPmZpeGluZ0RheXMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgZXVyaWJvcjZtLT5kYXlDb3VudGVyKCkpKTsKICAgIH0KICAgIGZvciAoU2l6ZSBp PTA7IGk8c3dhcHM7IGkrKykgewogICAgICAgIEhhbmRsZTxRdW90ZT4gcihyYXRlc1tpK2RlcG9z aXRzXSk7CiAgICAgICAgaW5zdHJ1bWVudHNbaStkZXBvc2l0c10gPSBib29zdDo6c2hhcmVkX3B0 cjxSYXRlSGVscGVyPihuZXcKICAgICAgICAgICAgU3dhcFJhdGVIZWxwZXIociwgc3dhcERhdGFb aV0ubipzd2FwRGF0YVtpXS51bml0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5k YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkTGVnRnJlcXVlbmN5LCBmaXhlZExl Z0NvbnZlbnRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkTGVnRGF5Q291bnRl ciwgZXVyaWJvcjZtKSk7CiAgICB9CgogICAgRXVyaWJvcjNNIGV1cmlib3IzbTsKICAgIGZvciAo U2l6ZSBpPTA7IGk8ZnJhczsgaSsrKSB7CiAgICAgICAgSGFuZGxlPFF1b3RlPiByKGZyYVJhdGVz W2ldKTsKICAgICAgICBmcmFIZWxwZXJzW2ldID0gYm9vc3Q6OnNoYXJlZF9wdHI8UmF0ZUhlbHBl cj4obmV3CiAgICAgICAgICAgIEZyYVJhdGVIZWxwZXIociwgZnJhRGF0YVtpXS5uLCBmcmFEYXRh W2ldLm4gKyAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV1cmlib3IzbS5maXhp bmdEYXlzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXVyaWJvcjNtLmZpeGlu Z0NhbGVuZGFyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXVyaWJvcjNtLmJ1 c2luZXNzRGF5Q29udmVudGlvbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV1 cmlib3IzbS5lbmRPZk1vbnRoKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXVy aWJvcjNtLmZpeGluZ0RheXMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldXJp Ym9yM20uZGF5Q291bnRlcigpKSk7CiAgICB9CgogICAgZm9yIChTaXplIGk9MDsgaTxib25kczsg aSsrKSB7CiAgICAgICAgSGFuZGxlPFF1b3RlPiBwKHByaWNlc1tpXSk7CiAgICAgICAgRGF0ZSBt YXR1cml0eSA9CiAgICAgICAgICAgIGNhbGVuZGFyLmFkdmFuY2UodG9kYXksIGJvbmREYXRhW2ld Lm4sIGJvbmREYXRhW2ldLnVuaXRzKTsKICAgICAgICBEYXRlIGlzc3VlID0gY2FsZW5kYXIuYWR2 YW5jZShtYXR1cml0eSwgLWJvbmREYXRhW2ldLmxlbmd0aCwgWWVhcnMpOwogICAgICAgIHN0ZDo6 dmVjdG9yPFJhdGU+IGNvdXBvbnMoMSwgYm9uZERhdGFbaV0uY291cG9uLzEwMC4wKTsKICAgICAg ICBzY2hlZHVsZXNbaV0gPSBTY2hlZHVsZShpc3N1ZSwgbWF0dXJpdHksCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgUGVyaW9kKGJvbmREYXRhW2ldLmZyZXF1ZW5jeSksCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXIsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgYm9uZENvbnZlbnRpb24sIGJvbmRDb252ZW50aW9uLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIERhdGVHZW5lcmF0aW9uOjpCYWNrd2FyZCwgZmFsc2UpOwogICAgICAg IGJvbmRIZWxwZXJzW2ldID0gYm9vc3Q6OnNoYXJlZF9wdHI8UmF0ZUhlbHBlcj4obmV3CiAgICAg ICAgICAgIEZpeGVkUmF0ZUJvbmRIZWxwZXIocCwKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGJvbmRTZXR0bGVtZW50RGF5cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHNjaGVkdWxlc1tpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdXBv bnMsIGJvbmREYXlDb3VudGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9u ZENvbnZlbnRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib25kUmVkZW1w dGlvbiwgaXNzdWUpKTsKICAgIH0KfQoKdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEk+CnZvaWQg dGVzdEN1cnZlQ29uc2lzdGVuY3koY29uc3QgVCYsIGNvbnN0IEkmIGludGVycG9sYXRvcikgewoK ICAgIHRlcm1TdHJ1Y3R1cmUgPSBib29zdDo6c2hhcmVkX3B0cjxZaWVsZFRlcm1TdHJ1Y3R1cmU+ KAogICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQaWVjZXdpc2VZaWVsZEN1cnZlPFQsST4o c2V0dGxlbWVudCxpbnN0cnVtZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIEFjdHVhbDM2MCgpLCAxLjBlLTEyLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdG9yKSk7 CgogICAgUmVsaW5rYWJsZUhhbmRsZTxZaWVsZFRlcm1TdHJ1Y3R1cmU+IGN1cnZlSGFuZGxlOwog ICAgY3VydmVIYW5kbGUubGlua1RvKHRlcm1TdHJ1Y3R1cmUpOwoKICAgIC8vIGNoZWNrIGRlcG9z aXRzCiAgICBmb3IgKFNpemUgaT0wOyBpPGRlcG9zaXRzOyBpKyspIHsKICAgICAgICBFdXJpYm9y IGluZGV4KGRlcG9zaXREYXRhW2ldLm4qZGVwb3NpdERhdGFbaV0udW5pdHMsY3VydmVIYW5kbGUp OwogICAgICAgIFJhdGUgZXhwZWN0ZWRSYXRlICA9IGRlcG9zaXREYXRhW2ldLnJhdGUvMTAwLAog ICAgICAgICAgICAgZXN0aW1hdGVkUmF0ZSA9IGluZGV4LmZpeGluZyh0b2RheSk7CiAgICAgICAg aWYgKHN0ZDo6ZmFicyhleHBlY3RlZFJhdGUtZXN0aW1hdGVkUmF0ZSkgPiAxLjBlLTkpIHsKICAg ICAgICAgICAgQk9PU1RfRVJST1IoCiAgICAgICAgICAgICAgICAgICAgZGVwb3NpdERhdGFbaV0u biA8PCAiICIKICAgICAgICAgICAgICAgICAgICA8PCAoZGVwb3NpdERhdGFbaV0udW5pdHMgPT0g V2Vla3MgPyAid2VlayhzKSIgOiAibW9udGgocykiKQogICAgICAgICAgICAgICAgICAgIDw8ICIg ZGVwb3NpdDoiCiAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpzZXRwcmVjaXNpb24oOCkKICAg ICAgICAgICAgICAgICAgICA8PCAiXG4gICAgZXN0aW1hdGVkIHJhdGU6ICIgPDwgaW86OnJhdGUo ZXN0aW1hdGVkUmF0ZSkKICAgICAgICAgICAgICAgICAgICA8PCAiXG4gICAgZXhwZWN0ZWQgcmF0 ZTogICIgPDwgaW86OnJhdGUoZXhwZWN0ZWRSYXRlKSk7CiAgICAgICAgfQogICAgfQoKICAgIC8v IGNoZWNrIHN3YXBzCiAgICBib29zdDo6c2hhcmVkX3B0cjxJYm9ySW5kZXg+IGV1cmlib3I2bShu ZXcgRXVyaWJvcjZNKGN1cnZlSGFuZGxlKSk7CiAgICBmb3IgKFNpemUgaT0wOyBpPHN3YXBzOyBp KyspIHsKICAgICAgICBQZXJpb2QgdGVub3IgPSBzd2FwRGF0YVtpXS5uKnN3YXBEYXRhW2ldLnVu aXRzOwoKICAgICAgICBWYW5pbGxhU3dhcCBzd2FwID0gTWFrZVZhbmlsbGFTd2FwKHRlbm9yLCBl dXJpYm9yNm0sIDAuMCkKICAgICAgICAgICAgLndpdGhFZmZlY3RpdmVEYXRlKHNldHRsZW1lbnQp CiAgICAgICAgICAgIC53aXRoRml4ZWRMZWdEYXlDb3VudChmaXhlZExlZ0RheUNvdW50ZXIpCiAg ICAgICAgICAgIC53aXRoRml4ZWRMZWdUZW5vcihQZXJpb2QoZml4ZWRMZWdGcmVxdWVuY3kpKQog ICAgICAgICAgICAud2l0aEZpeGVkTGVnQ29udmVudGlvbihmaXhlZExlZ0NvbnZlbnRpb24pCiAg ICAgICAgICAgIC53aXRoRml4ZWRMZWdUZXJtaW5hdGlvbkRhdGVDb252ZW50aW9uKGZpeGVkTGVn Q29udmVudGlvbik7CgogICAgICAgIFJhdGUgZXhwZWN0ZWRSYXRlID0gc3dhcERhdGFbaV0ucmF0 ZS8xMDAsCiAgICAgICAgICAgICBlc3RpbWF0ZWRSYXRlID0gc3dhcC5mYWlyUmF0ZSgpOwogICAg ICAgIFJlYWwgdG9sZXJhbmNlID0gMS4wZS05OwogICAgICAgIFNwcmVhZCBlcnJvciA9IHN0ZDo6 ZmFicyhleHBlY3RlZFJhdGUtZXN0aW1hdGVkUmF0ZSk7CiAgICAgICAgaWYgKGVycm9yID4gdG9s ZXJhbmNlKSB7CiAgICAgICAgICAgIEJPT1NUX0VSUk9SKHN3YXBEYXRhW2ldLm4gPDwgIiB5ZWFy KHMpIHN3YXA6XG4iCiAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpzZXRwcmVjaXNpb24oOCkK ICAgICAgICAgICAgICAgICAgICA8PCAiXG4gZXN0aW1hdGVkIHJhdGU6ICIgPDwgaW86OnJhdGUo ZXN0aW1hdGVkUmF0ZSkKICAgICAgICAgICAgICAgICAgICA8PCAiXG4gZXhwZWN0ZWQgcmF0ZTog ICIgPDwgaW86OnJhdGUoZXhwZWN0ZWRSYXRlKQogICAgICAgICAgICAgICAgICAgIDw8ICJcbiBl cnJvcjogICAgICAgICAgIiA8PCBpbzo6cmF0ZShlcnJvcikKICAgICAgICAgICAgICAgICAgICA8 PCAiXG4gdG9sZXJhbmNlOiAgICAgICIgPDwgaW86OnJhdGUodG9sZXJhbmNlKSk7CiAgICAgICAg fQogICAgfQoKICAgIC8vIGNoZWNrIGJvbmRzCiAgICB0ZXJtU3RydWN0dXJlID0gYm9vc3Q6OnNo YXJlZF9wdHI8WWllbGRUZXJtU3RydWN0dXJlPigKICAgICAgICAgICAgICAgICAgICAgICAgICBu ZXcgUGllY2V3aXNlWWllbGRDdXJ2ZTxULEk+KHNldHRsZW1lbnQsYm9uZEhlbHBlcnMsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3R1YWwz NjAoKSwgMS4wZS0xMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGludGVycG9sYXRvcikpOwogICAgY3VydmVIYW5kbGUubGlua1RvKHRlcm1T dHJ1Y3R1cmUpOwoKICAgIGZvciAoU2l6ZSBpPTA7IGk8Ym9uZHM7IGkrKykgewogICAgICAgIERh dGUgbWF0dXJpdHkgPQogICAgICAgICAgICBjYWxlbmRhci5hZHZhbmNlKHRvZGF5LCBib25kRGF0 YVtpXS5uLCBib25kRGF0YVtpXS51bml0cyk7CiAgICAgICAgRGF0ZSBpc3N1ZSA9IGNhbGVuZGFy LmFkdmFuY2UobWF0dXJpdHksIC1ib25kRGF0YVtpXS5sZW5ndGgsIFllYXJzKTsKICAgICAgICBz dGQ6OnZlY3RvcjxSYXRlPiBjb3Vwb25zKDEsIGJvbmREYXRhW2ldLmNvdXBvbi8xMDAuMCk7Cgog ICAgICAgIEZpeGVkUmF0ZUJvbmQgYm9uZChib25kU2V0dGxlbWVudERheXMsIDEwMC4wLCBzY2hl ZHVsZXNbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdXBvbnMsIGJvbmREYXlDb3Vu dGVyLCBib25kQ29udmVudGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9uZFJlZGVt cHRpb24sIGlzc3VlKTsKCiAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8UHJpY2luZ0VuZ2luZT4g Ym9uZEVuZ2luZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlz Y291bnRpbmdCb25kRW5naW5lKGN1cnZlSGFuZGxlKSk7CiAgICAgICAgYm9uZC5zZXRQcmljaW5n RW5naW5lKGJvbmRFbmdpbmUpOwoKICAgICAgICBSZWFsIGV4cGVjdGVkUHJpY2UgPSBib25kRGF0 YVtpXS5wcmljZSwKICAgICAgICAgICAgIGVzdGltYXRlZFByaWNlID0gYm9uZC5jbGVhblByaWNl KCk7CiAgICAgICAgUmVhbCB0b2xlcmFuY2UgPSAxLjBlLTk7CiAgICAgICAgaWYgKHN0ZDo6ZmFi cyhleHBlY3RlZFByaWNlLWVzdGltYXRlZFByaWNlKSA+IHRvbGVyYW5jZSkgewogICAgICAgICAg ICBCT09TVF9FUlJPUihpbzo6b3JkaW5hbChpKSA8PCAiIGJvbmQ6XG4iCiAgICAgICAgICAgICAg ICAgICAgICAgPDwgc3RkOjpzZXRwcmVjaXNpb24oOCkKICAgICAgICAgICAgICAgICAgICAgICA8 PCAiICAgIGVzdGltYXRlZCBwcmljZTogIgogICAgICAgICAgICAgICAgICAgICAgIDw8IGVzdGlt YXRlZFByaWNlIDw8ICJcbiIKICAgICAgICAgICAgICAgICAgICAgICA8PCAiICAgIGV4cGVjdGVk IHByaWNlOiAgIgogICAgICAgICAgICAgICAgICAgICAgIDw8IGV4cGVjdGVkUHJpY2UpOwogICAg ICAgIH0KICAgIH0KCiAgICAvLyBjaGVjayBGUkEKICAgIHRlcm1TdHJ1Y3R1cmUgPSBib29zdDo6 c2hhcmVkX3B0cjxZaWVsZFRlcm1TdHJ1Y3R1cmU+KAogICAgICAgICAgICAgICAgICAgICAgICAg IG5ldyBQaWVjZXdpc2VZaWVsZEN1cnZlPFQsST4oc2V0dGxlbWVudCxmcmFIZWxwZXJzLAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0dWFs MzYwKCksIDEuMGUtMTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBpbnRlcnBvbGF0b3IpKTsKICAgIGN1cnZlSGFuZGxlLmxpbmtUbyh0ZXJt U3RydWN0dXJlKTsKCiAgICBib29zdDo6c2hhcmVkX3B0cjxJYm9ySW5kZXg+IGV1cmlib3IzbShu ZXcgRXVyaWJvcjNNKGN1cnZlSGFuZGxlKSk7CiAgICBmb3IgKFNpemUgaT0wOyBpPGZyYXM7IGkr KykgewogICAgICAgIERhdGUgc3RhcnQgPSBjYWxlbmRhci5hZHZhbmNlKHNldHRsZW1lbnQsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhRGF0YVtpXS5uLCBmcmFEYXRh W2ldLnVuaXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV1cmlib3Iz bS0+YnVzaW5lc3NEYXlDb252ZW50aW9uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgZXVyaWJvcjNtLT5lbmRPZk1vbnRoKCkpOwogICAgICAgIERhdGUgZW5kID0gY2Fs ZW5kYXIuYWR2YW5jZShzdGFydCwgMywgTW9udGhzLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBldXJpYm9yM20tPmJ1c2luZXNzRGF5Q29udmVudGlvbigpLAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBldXJpYm9yM20tPmVuZE9mTW9udGgoKSk7CgogICAg ICAgIEZvcndhcmRSYXRlQWdyZWVtZW50IGZyYShzdGFydCwgZW5kLCBQb3NpdGlvbjo6TG9uZywK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhRGF0YVtpXS5yYXRlLzEwMCwgMTAw LjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV1cmlib3IzbSwgY3VydmVIYW5k bGUpOwogICAgICAgIFJhdGUgZXhwZWN0ZWRSYXRlID0gZnJhRGF0YVtpXS5yYXRlLzEwMCwKICAg ICAgICAgICAgIGVzdGltYXRlZFJhdGUgPSBmcmEuZm9yd2FyZFJhdGUoKTsKICAgICAgICBSZWFs IHRvbGVyYW5jZSA9IDEuMGUtOTsKICAgICAgICBpZiAoc3RkOjpmYWJzKGV4cGVjdGVkUmF0ZS1l c3RpbWF0ZWRSYXRlKSA+IHRvbGVyYW5jZSkgewogICAgICAgICAgICBCT09TVF9FUlJPUihpbzo6 b3JkaW5hbChpKSA8PCAiIEZSQTpcbiIKICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OnNl dHByZWNpc2lvbig4KQogICAgICAgICAgICAgICAgICAgICAgIDw8ICIgICAgZXN0aW1hdGVkIHJh dGU6ICIKICAgICAgICAgICAgICAgICAgICAgICA8PCBpbzo6cmF0ZShlc3RpbWF0ZWRSYXRlKSA8 PCAiXG4iCiAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAgICBleHBlY3RlZCByYXRlOiAgIgog ICAgICAgICAgICAgICAgICAgICAgIDw8IGlvOjpyYXRlKGV4cGVjdGVkUmF0ZSkpOwogICAgICAg IH0KICAgIH0KfQoKCnRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBJPgp2b2lkIHRlc3RCTUFDdXJ2 ZUNvbnNpc3RlbmN5KGNvbnN0IFQmLCBjb25zdCBJJiBpbnRlcnBvbGF0b3IpIHsKCiAgICBEYXRl IHRvZGF5QmFja3VwID0gU2V0dGluZ3M6Omluc3RhbmNlKCkuZXZhbHVhdGlvbkRhdGUoKTsKCiAg ICAvKgogICAgICBDYWxlbmRhciBmb3Igc2V0dGxlbWVudCBkYXRlIGNhbGN1bGF0aW9uOgogICAg ICBJZiB0b2RheSA9IDI0LzEyLzA3IGFuZCBzZXR0bGVtZW50IGlzIGNvbXB1dGVkIHVzaW5nIHRo ZSBibWEgaW5kZXggCiAgICAgIGZpeGluZyBjYWxlbmRhciwgc2V0dGxlbWVudCBpcyAyNy8xMi8w NyAoaG9saWRheSAyNS8xMiBvbmx5KS4KICAgICAgVVNEIExpYm9yIHRoZW4gcmVxdWlyZXMgYSBm aXhpbmcgb24gMjEvMTIsIHR3byBidXNpbmVzcyBkYXlzIGJlZm9yZSAKICAgICAgc2V0dGxlbWVu dCBhY2NvcmRpbmcgdG8gVEFSR0VUL0xvbmRvbiBjYWxlbmRhciAoaG9saWRheXMgMjUvMTIgYW5k IDI2LzEyKS4KICAgICAgVG8gYXZvaWQgcGFzdCBmaXhpbmdzLCBJIGFtIHVzaW5nIHRoZSBqb2lu dCBjYWxlbmRhciBoZXJlLiBVc2luZyB0aGUKICAgICAgc2V0dGxlbWVudCBkYXRlIChiYXNlZCBv biBUQVJHRVQpIGFzIGdpdmVuIGluIHNldHVwKCkgaGFzIHRoZSBzYW1lIGVmZmVjdC4KICAgICAg CiAgICAgIEhvd2V2ZXIsIHRoaXMgY2F1c2VzIHRoZSBmdW5ueSBwcm9ibGVtIGJlbG93IChjYXNl IDQpLgogICAgKi8KICAgIENhbGVuZGFyIGNhbCA9IEpvaW50Q2FsZW5kYXIoQk1BSW5kZXgoKS5m aXhpbmdDYWxlbmRhcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0RMaWJv cigzKk1vbnRocykuZml4aW5nQ2FsZW5kYXIoKSk7CgogICAgLyoKICAgICAgR2V0IHRvZGF5J3Mg ZGF0ZSBmcm9tIGVudmlyb25tZW50IHRvIHRlc3QgdmFyaW91cyBkYXRlcwogICAgICovCiAgICBp ZiAoZ2V0ZW52KCJUT0RBWSIpKQogICAgICAgIHRvZGF5ID0gY2FsLmFkanVzdChEYXRlUGFyc2Vy OjpwYXJzZUlTTyhnZXRlbnYoIlRPREFZIikpKTsKICAgIGVsc2UKICAgICAgICB0b2RheSA9IGNh bC5hZGp1c3QoRGF0ZTo6dG9kYXlzRGF0ZSgpKTsKCiAgICBTZXR0aW5nczo6aW5zdGFuY2UoKS5l dmFsdWF0aW9uRGF0ZSgpID0gdG9kYXk7CgogICAgLy8gQk1BIFN3YXAgc2V0dGxlbWVudCBkYXRl CiAgICBEYXRlIGJtYVNldHRsZW1lbnQgPSBjYWwuYWR2YW5jZSh0b2RheSxzZXR0bGVtZW50RGF5 cyxEYXlzKTsKICAgIAogICAgc3RkOjpjb3V0IDw8ICJ0b2RheTogICIgPDwgaW86Omlzb19kYXRl KHRvZGF5KSAKICAgICAgICAgICAgICA8PCAiICgiIDw8IHRvZGF5LndlZWtkYXkoKSA8PCAiKSIg PDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8ICJzZXR0bGU6ICIgPDwgaW86Omlzb19kYXRl KGJtYVNldHRsZW1lbnQpIAogICAgICAgICAgICAgIDw8ICIgKCIgPDwgYm1hU2V0dGxlbWVudC53 ZWVrZGF5KCkgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKCiAgICBIYW5kbGU8WWllbGRUZXJtU3RydWN0 dXJlPiByaXNrRnJlZUN1cnZlKAogICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFlpZWxkVGVybVN0 cnVjdHVyZT4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGbGF0Rm9yd2FyZChibWFT ZXR0bGVtZW50LCAwLjA0LCBBY3R1YWwzNjAoKSkpKTsKCiAgICBib29zdDo6c2hhcmVkX3B0cjxC TUFJbmRleD4gYm1hSW5kZXgobmV3IEJNQUluZGV4KTsKICAgIGJvb3N0OjpzaGFyZWRfcHRyPEli b3JJbmRleD4gbGlib3JJbmRleCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIG5ldyBVU0RMaWJvcigzKk1vbnRocyxyaXNrRnJlZUN1cnZlKSk7CgogICAgZm9yIChTaXpl IGk9MDsgaTxibWFzOyArK2kpIHsKICAgICAgICBIYW5kbGU8UXVvdGU+IGYoZnJhY3Rpb25zW2ld KTsKICAgICAgICBibWFIZWxwZXJzW2ldID0gYm9vc3Q6OnNoYXJlZF9wdHI8UmF0ZUhlbHBlcj4o CiAgICAgICAgICAgIG5ldyBCTUFTd2FwUmF0ZUhlbHBlcihmLCBibWFEYXRhW2ldLm4qYm1hRGF0 YVtpXS51bml0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRsZW1lbnRE YXlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsLCAvLyBzZXR0bGVtZW50 IGRhdGUgY2FsY3VsYXRpb24gb25seQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg UGVyaW9kKGJtYUZyZXF1ZW5jeSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBi bWFDb252ZW50aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1hRGF5Q291 bnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtYUluZGV4LAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlib3JJbmRleCkpOwogICAgfQoKICAgIFdlZWtk YXkgdyA9IHRvZGF5LndlZWtkYXkoKTsKICAgIERhdGUgbGFzdFdlZG5lc2RheSA9ICh3ID49IDQp ID8gdG9kYXkgLSAodyAtIDQpIDogdG9kYXkgKyAoNCAtIHcgLSA3KTsKICAgIERhdGUgbGFzdEZp eGluZyA9IGJtYUluZGV4LT5maXhpbmdDYWxlbmRhcigpLmFkanVzdChsYXN0V2VkbmVzZGF5KTsK ICAgIGJtYUluZGV4LT5hZGRGaXhpbmcobGFzdEZpeGluZywgMC4wMyk7CgogICAgLyoKICAgICAg VXNpbmcgc2V0dGxlbWVudCBhcyB0ZXJtc3RydWN0dXJlIHJlZmVyZW5jZSBkYXRlIGZhaWxzIG9u IDI0LzEyLzA3IAogICAgICAoZXJyb3I6IG5lZ2F0aXZlIHRpbWUgZ2l2ZW4sIGVxdWl2YWxlbnQg dG8gb25lIGRheSkKICAgIAogICAgICBQcm9ibGVtOiBTZWUgY2FzZSA0KSBiZWxvdy4KICAgIAog ICAgICBTb2x1dGlvbjogCiAgICAgIFJlZmVyZW5jZSBkYXRlIGNhbm5vdCBhbHdheXMgYmUgc2V0 IHRvIHRoZSBzZXR0bGVtZW50IGRhdGUgKGJ1dCBtb3N0IG9mCiAgICAgIHRoZSB0aW1lIGFzIGNh c2UgNCBpcyBhIHJhcmUgZXhjZXB0aW9uKS4KICAgICAgVGhlIGZvbGxvd2luZyBzaG91bGQgd29y ayBnZW5lcmFsbHk6CiAgICAgICAgIGEpIHJlZmVyZW5jZSBkYXRlID0gbWF4ICh0b2RheSwgZml4 aW5nIHZhbHVlIGRhdGUpLCBvcgogICAgICAgICBiKSByZWZlcmVuY2UgZGF0ZSA9IHRvZGF5CiAg ICAgIE15IHByZWZlcmVuY2UgaXMgYikgdG8ga2VlcCBpdCBzaW1wbGUuCgogICAgICBDYXNlczog ICAKICAgICAgMSkgZml4aW5nIGRhdGUgPCBmaXhpbmcgdmFsdWUgZGF0ZSA8PSB0b2RheSA8IHNl dHRsZW1lbnQgZGF0ZQogICAgICAgICBsb2FkIGxhc3QgcmVsZXZhbnQgZml4aW5nCiAgICAgICAg IHJlZmVyZW5jZSBtYXkgYmUgc2V0dGxlbWVudCBkYXRlIG9yIHRvZGF5CgogICAgICAyKSBmaXhp bmcgZGF0ZSA8IHRvZGF5IDwgZml4aW5nIHZhbHVlIGRhdGUgPD0gc2V0dGxlbWVudCBkYXRlCiAg ICAgICAgIGxvYWQgbGFzdCByZWxldmFudCBmaXhpbmcKICAgICAgICAgcmVmZXJlbmNlIG1heSBi ZSBzZXR0bGVtZW50IGRhdGUgb3IgZml4aW5nIHZhbHVlIGRhdGUgb3IgdG9kYXkKICAgICAgCiAg ICAgIDMpIGZpeGluZyBkYXRlID0gdG9kYXkgPCBmaXhpbmcgdmFsdWUgZGF0ZSA8IHNldHRsZW1l bnQgZGF0ZQogICAgICAgICBhKSBsb2FkIHRvZGF5J3MgZml4aW5nIAogICAgICAgICAgICByZWZl cmVuY2UgPSBzZXR0bGVtZW50IGRhdGUgb3IgZml4aW5nIHZhbHVlIGRhdGUgb3IgdG9kYXkgCiAg ICAgICAgIGIpIGRvIG5vdCBsb2FkIGZpeGluZ3MKICAgICAgICAgICAgcmVmZXJlbmNlID0gZml4 aW5nIHZhbHVlIGRhdGUgb3IgdG9kYXkKCiAgICAgIDQpIHRvZGF5IDwgZml4aW5nIGRhdGUgPCBm aXhpbmcgdmFsdWUgZGF0ZSA8IHNldHRsZW1lbnQgZGF0ZQogICAgICAgICBubyBmaXhpbmcgZGF0 YSBuZWVkZWQKICAgICAgICAgcmVmZXJlbmNlID0gZml4aW5nIHZhbHVlIGRhdGUgb3IgdG9kYXkK CiAgICAgICAgIEV4YW1wbGUsIGNhc2UgNDoKICAgICAgICAgMjQgKE1vbikgdG9kYXkKICAgICAg ICAgMjUgKFR1ZSkgaG9saWRheSAoVVMgY2FsZW5kYXIpCiAgICAgICAgIDI2IChXZWQpIGZpcnN0 IHJlbGV2YW50IEJNQSBmaXhpbmcgZGF0ZQogICAgICAgICAyNyAoVGh1KSBCTUEgZml4aW5nIHZh bHVlIGRhdGUKICAgICAgICAgMjggKEZyaSkgc2V0dGxlbWVudCBkYXRlIChjb21wdXRlZCB1c2lu ZyBqb2ludCBjYWxlbmRhciwgMiBkYXlzKQoKICAgICAqLyAKLy8gICAgIHRlcm1TdHJ1Y3R1cmUg PSBib29zdDo6c2hhcmVkX3B0cjxZaWVsZFRlcm1TdHJ1Y3R1cmU+KAovLyAgICAgICAgICAgICAg ICAgICAgICAgICAgIG5ldyBQaWVjZXdpc2VZaWVsZEN1cnZlPFQsST4oYm1hU2V0dGxlbWVudCwK Ly8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGJtYUhlbHBlcnMsCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBBY3R1YWwzNjAoKSwgMS4wZS0xMiwKLy8gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRvcikpOwogICAg dGVybVN0cnVjdHVyZSA9IGJvb3N0OjpzaGFyZWRfcHRyPFlpZWxkVGVybVN0cnVjdHVyZT4oCiAg ICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBpZWNld2lzZVlpZWxkQ3VydmU8VCxJPih0b2Rh eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGJtYUhlbHBlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBBY3R1YWwzNjAoKSwgMS4wZS0xMiwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRvcikpOwoKICAgIFJlbGlu a2FibGVIYW5kbGU8WWllbGRUZXJtU3RydWN0dXJlPiBjdXJ2ZUhhbmRsZTsKICAgIGN1cnZlSGFu ZGxlLmxpbmtUbyh0ZXJtU3RydWN0dXJlKTsKCi8vICAgICBzdGQ6OmNvdXQgPDwgImxpYm9yIGNh bDogIiA8PCBsaWJvckluZGV4LT5maXhpbmdDYWxlbmRhcigpIDw8IHN0ZDo6ZW5kbDsKLy8gICAg IHN0ZDo6Y291dCA8PCAiYm1hIGNhbDogIiA8PCBibWFJbmRleC0+Zml4aW5nQ2FsZW5kYXIoKSA8 PCBzdGQ6OmVuZGw7CiAgICAKICAgIC8vIGNoZWNrIEJNQSBzd2FwcwogICAgRGF0ZSBtaW5TdGFy dExpYm9yID0gRGF0ZTo6bWF4RGF0ZSgpOwogICAgRGF0ZSBtaW5TdGFydEJtYSA9IERhdGU6Om1h eERhdGUoKTsKICAgIGJvb3N0OjpzaGFyZWRfcHRyPEJNQUluZGV4PiBibWEobmV3IEJNQUluZGV4 KGN1cnZlSGFuZGxlKSk7CiAgICBib29zdDo6c2hhcmVkX3B0cjxJYm9ySW5kZXg+IGxpYm9yM20o bmV3IFVTRExpYm9yKDMqTW9udGhzLHJpc2tGcmVlQ3VydmUpKTsKICAgIGZvciAoU2l6ZSBpPTA7 IGk8Ym1hczsgaSsrKSB7CiAgICAgICAgUGVyaW9kIHRlbm9yID0gYm1hRGF0YVtpXS5uKmJtYURh dGFbaV0udW5pdHM7CgogICAgICAgIFNjaGVkdWxlIGJtYVNjaGVkdWxlID0gTWFrZVNjaGVkdWxl KGJtYVNldHRsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgYm1hU2V0dGxlbWVudCt0ZW5vciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBQZXJpb2QoYm1hRnJlcXVlbmN5KSwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBibWEtPmZpeGluZ0NhbGVuZGFyKCksCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1hQ29udmVudGlvbikuYmFja3dhcmRzKCk7 CgogICAgICAgIFNjaGVkdWxlIGxpYm9yU2NoZWR1bGUgPSBNYWtlU2NoZWR1bGUoYm1hU2V0dGxl bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtYVNl dHRsZW1lbnQrdGVub3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBsaWJvcjNtLT50ZW5vcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgbGlib3IzbS0+Zml4aW5nQ2FsZW5kYXIoKSwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYm9yM20tPmJ1c2luZXNzRGF5Q29udmVudGlv bigpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZW5kT2ZNb250aChsaWJvcjNt LT5lbmRPZk1vbnRoKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5iYWNrd2Fy ZHMoKTsKCiAgICAgICAgbWluU3RhcnRMaWJvciA9IHN0ZDo6bWluKG1pblN0YXJ0TGlib3IsIGxp Ym9yU2NoZWR1bGUuZGF0ZXMoKS5mcm9udCgpKTsKICAgICAgICBtaW5TdGFydEJtYSA9IHN0ZDo6 bWluKG1pblN0YXJ0Qm1hLCBibWFTY2hlZHVsZS5kYXRlcygpLmZyb250KCkpOwoKICAgICAgICBC TUFTd2FwIHN3YXAoQk1BU3dhcDo6UGF5ZXIsIDEwMC4wLAogICAgICAgICAgICAgICAgICAgICBs aWJvclNjaGVkdWxlLCAwLjc1LCAwLjAsIGxpYm9yM20sIGxpYm9yM20tPmRheUNvdW50ZXIoKSwK ICAgICAgICAgICAgICAgICAgICAgYm1hU2NoZWR1bGUsIGJtYSwgYm1hRGF5Q291bnRlcik7CiAg ICAgICAgc3dhcC5zZXRQcmljaW5nRW5naW5lKGJvb3N0OjpzaGFyZWRfcHRyPFByaWNpbmdFbmdp bmU+KAogICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlzY291bnRpbmdTd2FwRW5naW5lKGxp Ym9yM20tPnRlcm1TdHJ1Y3R1cmUoKSkpKTsKCiAgICAgICAgUmVhbCBleHBlY3RlZEZyYWN0aW9u ID0gYm1hRGF0YVtpXS5yYXRlLzEwMCwKICAgICAgICAgICAgIGVzdGltYXRlZEZyYWN0aW9uID0g c3dhcC5mYWlyTGlib3JGcmFjdGlvbigpOwogICAgICAgIFJlYWwgdG9sZXJhbmNlID0gMS4wZS05 OwogICAgICAgIFJlYWwgZXJyb3IgPSBzdGQ6OmZhYnMoZXhwZWN0ZWRGcmFjdGlvbi1lc3RpbWF0 ZWRGcmFjdGlvbik7CiAgICAgICAgaWYgKGVycm9yID4gdG9sZXJhbmNlKSB7CiAgICAgICAgICAg IEJPT1NUX0VSUk9SKGJtYURhdGFbaV0ubiA8PCAiIHllYXIocykgQk1BIHN3YXA6XG4iCiAgICAg ICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKDgpCiAgICAgICAgICAgICAg ICAgICAgICAgIDw8ICJcbiBlc3RpbWF0ZWQgbGlib3IgZnJhY3Rpb246ICIgPDwgZXN0aW1hdGVk RnJhY3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIGV4cGVjdGVkIGxpYm9yIGZy YWN0aW9uOiAgIiA8PCBleHBlY3RlZEZyYWN0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgIDw8 ICJcbiBlcnJvcjogICAgICAgICAgIiA8PCBlcnJvcgogICAgICAgICAgICAgICAgICAgICAgICA8 PCAiXG4gdG9sZXJhbmNlOiAgICAgICIgPDwgdG9sZXJhbmNlKTsKICAgICAgICB9CiAgICB9Cgov LyAgICAgc3RkOjpjb3V0IDw8ICJzdGFydEw6ICIgPDwgaW86Omlzb19kYXRlIChtaW5TdGFydExp Ym9yKSA8PCBzdGQ6OmVuZGw7Ci8vICAgICBzdGQ6OmNvdXQgPDwgInN0YXJ0QjogIiA8PCBpbzo6 aXNvX2RhdGUgKG1pblN0YXJ0Qm1hKSA8PCBzdGQ6OmVuZGw7CgogICAgdG9kYXkgPSB0b2RheUJh Y2t1cDsKICAgIFNldHRpbmdzOjppbnN0YW5jZSgpLmV2YWx1YXRpb25EYXRlKCkgPSB0b2RheTsK fQoKUUxfRU5EX1RFU1RfTE9DQUxTKFBpZWNld2lzZVlpZWxkQ3VydmVUZXN0KQoKCnZvaWQgUGll Y2V3aXNlWWllbGRDdXJ2ZVRlc3Q6OnRlc3RMb2dMaW5lYXJEaXNjb3VudENvbnNpc3RlbmN5KCkg ewoKICAgIEJPT1NUX01FU1NBR0UoCiAgICAgICAgIlRlc3RpbmcgY29uc2lzdGVuY3kgb2YgcGll Y2V3aXNlLWxvZy1saW5lYXIgZGlzY291bnQgY3VydmUuLi4iKTsKCiAgICBTYXZlZFNldHRpbmdz IGJhY2t1cDsKICAgIEluZGV4SGlzdG9yeUNsZWFuZXIgY2xlYW5lcjsKCiAgICBzZXR1cCgpOwoK ICAgIHRlc3RDdXJ2ZUNvbnNpc3RlbmN5KERpc2NvdW50KCksIExvZ0xpbmVhcigpKTsKICAgIHRl c3RCTUFDdXJ2ZUNvbnNpc3RlbmN5KERpc2NvdW50KCksIExvZ0xpbmVhcigpKTsKfQoKdm9pZCBQ aWVjZXdpc2VZaWVsZEN1cnZlVGVzdDo6dGVzdExpbmVhckRpc2NvdW50Q29uc2lzdGVuY3koKSB7 CgogICAgQk9PU1RfTUVTU0FHRSgKICAgICAgICAiVGVzdGluZyBjb25zaXN0ZW5jeSBvZiBwaWVj ZXdpc2UtbGluZWFyIGRpc2NvdW50IGN1cnZlLi4uIik7CgogICAgU2F2ZWRTZXR0aW5ncyBiYWNr dXA7CiAgICBJbmRleEhpc3RvcnlDbGVhbmVyIGNsZWFuZXI7CgogICAgc2V0dXAoKTsKCiAgICB0 ZXN0Q3VydmVDb25zaXN0ZW5jeShEaXNjb3VudCgpLCBMaW5lYXIoKSk7CiAgICB0ZXN0Qk1BQ3Vy dmVDb25zaXN0ZW5jeShEaXNjb3VudCgpLCBMaW5lYXIoKSk7Cn0KCnZvaWQgUGllY2V3aXNlWWll bGRDdXJ2ZVRlc3Q6OnRlc3RMb2dMaW5lYXJaZXJvQ29uc2lzdGVuY3koKSB7CgogICAgQk9PU1Rf TUVTU0FHRSgKICAgICAgICAiVGVzdGluZyBjb25zaXN0ZW5jeSBvZiBwaWVjZXdpc2UtbG9nLWxp bmVhciB6ZXJvLXlpZWxkIGN1cnZlLi4uIik7CgogICAgU2F2ZWRTZXR0aW5ncyBiYWNrdXA7CiAg ICBJbmRleEhpc3RvcnlDbGVhbmVyIGNsZWFuZXI7CgogICAgc2V0dXAoKTsKCiAgICB0ZXN0Q3Vy dmVDb25zaXN0ZW5jeShaZXJvWWllbGQoKSwgTG9nTGluZWFyKCkpOwogICAgdGVzdEJNQUN1cnZl Q29uc2lzdGVuY3koWmVyb1lpZWxkKCksIExvZ0xpbmVhcigpKTsKfQoKdm9pZCBQaWVjZXdpc2VZ aWVsZEN1cnZlVGVzdDo6dGVzdExpbmVhclplcm9Db25zaXN0ZW5jeSgpIHsKCiAgICBCT09TVF9N RVNTQUdFKAogICAgICAgICJUZXN0aW5nIGNvbnNpc3RlbmN5IG9mIHBpZWNld2lzZS1saW5lYXIg emVyby15aWVsZCBjdXJ2ZS4uLiIpOwoKICAgIFNhdmVkU2V0dGluZ3MgYmFja3VwOwogICAgSW5k ZXhIaXN0b3J5Q2xlYW5lciBjbGVhbmVyOwoKICAgIHNldHVwKCk7CgogICAgdGVzdEN1cnZlQ29u c2lzdGVuY3koWmVyb1lpZWxkKCksIExpbmVhcigpKTsKICAgIHRlc3RCTUFDdXJ2ZUNvbnNpc3Rl bmN5KFplcm9ZaWVsZCgpLCBMaW5lYXIoKSk7Cn0KCnZvaWQgUGllY2V3aXNlWWllbGRDdXJ2ZVRl c3Q6OnRlc3RTcGxpbmVaZXJvQ29uc2lzdGVuY3koKSB7CgogICAgQk9PU1RfTUVTU0FHRSgKICAg ICAgICAiVGVzdGluZyBjb25zaXN0ZW5jeSBvZiBwaWVjZXdpc2Utc3BsaW5lIHplcm8teWllbGQg Y3VydmUuLi4iKTsKCiAgICBTYXZlZFNldHRpbmdzIGJhY2t1cDsKICAgIEluZGV4SGlzdG9yeUNs ZWFuZXIgY2xlYW5lcjsKCiAgICBzZXR1cCgpOwoKICAgIHRlc3RDdXJ2ZUNvbnNpc3RlbmN5KAog ICAgICAgICAgICAgICAgICAgWmVyb1lpZWxkKCksCiAgICAgICAgICAgICAgICAgICBDdWJpY1Nw bGluZShDdWJpY1NwbGluZUludGVycG9sYXRpb246OlNlY29uZERlcml2YXRpdmUsMC4wLAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ViaWNTcGxpbmVJbnRlcnBvbGF0aW9uOjpTZWNv bmREZXJpdmF0aXZlLDAuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpKTsK ICAgIHRlc3RCTUFDdXJ2ZUNvbnNpc3RlbmN5KAogICAgICAgICAgICAgICAgICAgWmVyb1lpZWxk KCksCiAgICAgICAgICAgICAgICAgICBDdWJpY1NwbGluZShDdWJpY1NwbGluZUludGVycG9sYXRp b246OlNlY29uZERlcml2YXRpdmUsMC4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Q3ViaWNTcGxpbmVJbnRlcnBvbGF0aW9uOjpTZWNvbmREZXJpdmF0aXZlLDAuMCwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHRydWUpKTsKfQoKdm9pZCBQaWVjZXdpc2VZaWVsZEN1cnZl VGVzdDo6dGVzdExpbmVhckZvcndhcmRDb25zaXN0ZW5jeSgpIHsKCiAgICBCT09TVF9NRVNTQUdF KAogICAgICAgICJUZXN0aW5nIGNvbnNpc3RlbmN5IG9mIHBpZWNld2lzZS1saW5lYXIgZm9yd2Fy ZC1yYXRlIGN1cnZlLi4uIik7CgogICAgU2F2ZWRTZXR0aW5ncyBiYWNrdXA7CiAgICBJbmRleEhp c3RvcnlDbGVhbmVyIGNsZWFuZXI7CgogICAgc2V0dXAoKTsKCiAgICB0ZXN0Q3VydmVDb25zaXN0 ZW5jeShGb3J3YXJkUmF0ZSgpLCBMaW5lYXIoKSk7CiAgICB0ZXN0Qk1BQ3VydmVDb25zaXN0ZW5j eShGb3J3YXJkUmF0ZSgpLCBMaW5lYXIoKSk7Cn0KCnZvaWQgUGllY2V3aXNlWWllbGRDdXJ2ZVRl c3Q6OnRlc3RGbGF0Rm9yd2FyZENvbnNpc3RlbmN5KCkgewoKICAgIEJPT1NUX01FU1NBR0UoCiAg ICAgICAgIlRlc3RpbmcgY29uc2lzdGVuY3kgb2YgcGllY2V3aXNlLWZsYXQgZm9yd2FyZC1yYXRl IGN1cnZlLi4uIik7CgogICAgU2F2ZWRTZXR0aW5ncyBiYWNrdXA7CiAgICBJbmRleEhpc3RvcnlD bGVhbmVyIGNsZWFuZXI7CgogICAgc2V0dXAoKTsKCiAgICB0ZXN0Q3VydmVDb25zaXN0ZW5jeShG b3J3YXJkUmF0ZSgpLCBCYWNrd2FyZEZsYXQoKSk7CiAgICB0ZXN0Qk1BQ3VydmVDb25zaXN0ZW5j eShGb3J3YXJkUmF0ZSgpLCBCYWNrd2FyZEZsYXQoKSk7Cn0KCnZvaWQgUGllY2V3aXNlWWllbGRD dXJ2ZVRlc3Q6OnRlc3RTcGxpbmVGb3J3YXJkQ29uc2lzdGVuY3koKSB7CgogICAgQk9PU1RfTUVT U0FHRSgKICAgICAgICAiVGVzdGluZyBjb25zaXN0ZW5jeSBvZiBwaWVjZXdpc2Utc3BsaW5lIGZv cndhcmQtcmF0ZSBjdXJ2ZS4uLiIpOwoKICAgIFNhdmVkU2V0dGluZ3MgYmFja3VwOwogICAgSW5k ZXhIaXN0b3J5Q2xlYW5lciBjbGVhbmVyOwoKICAgIHNldHVwKCk7CgogICAgdGVzdEN1cnZlQ29u c2lzdGVuY3koCiAgICAgICAgICAgICAgICAgICBGb3J3YXJkUmF0ZSgpLAogICAgICAgICAgICAg ICAgICAgQ3ViaWNTcGxpbmUoQ3ViaWNTcGxpbmVJbnRlcnBvbGF0aW9uOjpTZWNvbmREZXJpdmF0 aXZlLDAuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1YmljU3BsaW5lSW50ZXJw b2xhdGlvbjo6U2Vjb25kRGVyaXZhdGl2ZSwwLjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB0cnVlKSk7CiAgICB0ZXN0Qk1BQ3VydmVDb25zaXN0ZW5jeSgKICAgICAgICAgICAgICAg ICAgIEZvcndhcmRSYXRlKCksCiAgICAgICAgICAgICAgICAgICBDdWJpY1NwbGluZShDdWJpY1Nw bGluZUludGVycG9sYXRpb246OlNlY29uZERlcml2YXRpdmUsMC4wLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgQ3ViaWNTcGxpbmVJbnRlcnBvbGF0aW9uOjpTZWNvbmREZXJpdmF0aXZl LDAuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpKTsKfQoKdm9pZCBQaWVj ZXdpc2VZaWVsZEN1cnZlVGVzdDo6dGVzdE9ic2VydmFiaWxpdHkoKSB7CgogICAgQk9PU1RfTUVT U0FHRSgiVGVzdGluZyBvYnNlcnZhYmlsaXR5IG9mIHBpZWNld2lzZSB5aWVsZCBjdXJ2ZS4uLiIp OwoKICAgIFNhdmVkU2V0dGluZ3MgYmFja3VwOwogICAgSW5kZXhIaXN0b3J5Q2xlYW5lciBjbGVh bmVyOwoKICAgIHNldHVwKCk7CgogICAgdGVybVN0cnVjdHVyZSA9IGJvb3N0OjpzaGFyZWRfcHRy PFlpZWxkVGVybVN0cnVjdHVyZT4oCiAgICAgICBuZXcgUGllY2V3aXNlWWllbGRDdXJ2ZTxEaXNj b3VudCxMb2dMaW5lYXI+KHNldHRsZW1lbnREYXlzLCBjYWxlbmRhciwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1bWVudHMsIEFjdHVhbDM2 MCgpKSk7CiAgICBGbGFnIGY7CiAgICBmLnJlZ2lzdGVyV2l0aCh0ZXJtU3RydWN0dXJlKTsKCiAg ICBmb3IgKFNpemUgaT0wOyBpPGRlcG9zaXRzK3N3YXBzOyBpKyspIHsKICAgICAgICBUaW1lIHRl c3RUaW1lID0gQWN0dWFsMzYwKCkueWVhckZyYWN0aW9uKHNldHRsZW1lbnQsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVtZW50c1tpXS0+bGF0 ZXN0RGF0ZSgpKTsKICAgICAgICBEaXNjb3VudEZhY3RvciBkaXNjb3VudCA9IHRlcm1TdHJ1Y3R1 cmUtPmRpc2NvdW50KHRlc3RUaW1lKTsKICAgICAgICBmLmxvd2VyKCk7CiAgICAgICAgcmF0ZXNb aV0tPnNldFZhbHVlKHJhdGVzW2ldLT52YWx1ZSgpKjEuMDEpOwogICAgICAgIGlmICghZi5pc1Vw KCkpCiAgICAgICAgICAgIEJPT1NUX0ZBSUwoIk9ic2VydmVyIHdhcyBub3Qgbm90aWZpZWQgb2Yg dW5kZXJseWluZyByYXRlIGNoYW5nZSIpOwogICAgICAgIGlmICh0ZXJtU3RydWN0dXJlLT5kaXNj b3VudCh0ZXN0VGltZSx0cnVlKSA9PSBkaXNjb3VudCkKICAgICAgICAgICAgQk9PU1RfRkFJTCgi cmF0ZSBjaGFuZ2UgZGlkIG5vdCB0cmlnZ2VyIHJlY2FsY3VsYXRpb24iKTsKICAgICAgICByYXRl c1tpXS0+c2V0VmFsdWUocmF0ZXNbaV0tPnZhbHVlKCkvMS4wMSk7CiAgICB9CgogICAgZi5sb3dl cigpOwogICAgU2V0dGluZ3M6Omluc3RhbmNlKCkuZXZhbHVhdGlvbkRhdGUoKSA9IGNhbGVuZGFy LmFkdmFuY2UodG9kYXksMTUsRGF5cyk7CiAgICBpZiAoIWYuaXNVcCgpKQogICAgICAgIEJPT1NU X0ZBSUwoIk9ic2VydmVyIHdhcyBub3Qgbm90aWZpZWQgb2YgZGF0ZSBjaGFuZ2UiKTsKfQoKCnZv aWQgUGllY2V3aXNlWWllbGRDdXJ2ZVRlc3Q6OnRlc3RMaWJvckZpeGluZygpIHsKCiAgICBCT09T VF9NRVNTQUdFKAogICAgICAgICJUZXN0aW5nIHVzZSBvZiB0b2RheSdzIExJQk9SIGZpeGluZ3Mg aW4gc3dhcCBjdXJ2ZS4uLiIpOwoKICAgIFNhdmVkU2V0dGluZ3MgYmFja3VwOwogICAgSW5kZXhI aXN0b3J5Q2xlYW5lciBjbGVhbmVyOwoKICAgIHNldHVwKCk7CgogICAgc3RkOjp2ZWN0b3I8Ym9v c3Q6OnNoYXJlZF9wdHI8UmF0ZUhlbHBlcj4gPiBzd2FwSGVscGVycyhzd2Fwcyk7CiAgICBib29z dDo6c2hhcmVkX3B0cjxJYm9ySW5kZXg+IGV1cmlib3I2bShuZXcgRXVyaWJvcjZNKTsKCiAgICBm b3IgKFNpemUgaT0wOyBpPHN3YXBzOyBpKyspIHsKICAgICAgICBIYW5kbGU8UXVvdGU+IHIocmF0 ZXNbaStkZXBvc2l0c10pOwogICAgICAgIHN3YXBIZWxwZXJzW2ldID0gYm9vc3Q6OnNoYXJlZF9w dHI8UmF0ZUhlbHBlcj4obmV3CiAgICAgICAgICAgIFN3YXBSYXRlSGVscGVyKHIsIFBlcmlvZChz d2FwRGF0YVtpXS5uLCBzd2FwRGF0YVtpXS51bml0cyksCiAgICAgICAgICAgICAgICAgICAgICAg ICAgIGNhbGVuZGFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZExlZ0ZyZXF1ZW5j eSwgZml4ZWRMZWdDb252ZW50aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZExl Z0RheUNvdW50ZXIsIGV1cmlib3I2bSkpOwogICAgfQoKICAgIHRlcm1TdHJ1Y3R1cmUgPSBib29z dDo6c2hhcmVkX3B0cjxZaWVsZFRlcm1TdHJ1Y3R1cmU+KAogICAgICAgICAgIG5ldyBQaWVjZXdp c2VZaWVsZEN1cnZlPERpc2NvdW50LExvZ0xpbmVhcj4oc2V0dGxlbWVudCxzd2FwSGVscGVycywK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFj dHVhbDM2MCgpLCAxLjBlLTEyKSk7CgogICAgSGFuZGxlPFlpZWxkVGVybVN0cnVjdHVyZT4gY3Vy dmVIYW5kbGUgPQogICAgICAgIEhhbmRsZTxZaWVsZFRlcm1TdHJ1Y3R1cmU+KHRlcm1TdHJ1Y3R1 cmUpOwoKICAgIGJvb3N0OjpzaGFyZWRfcHRyPElib3JJbmRleD4gaW5kZXgobmV3IEV1cmlib3I2 TShjdXJ2ZUhhbmRsZSkpOwogICAgZm9yIChTaXplIGk9MDsgaTxzd2FwczsgaSsrKSB7CiAgICAg ICAgUGVyaW9kIHRlbm9yID0gc3dhcERhdGFbaV0ubipzd2FwRGF0YVtpXS51bml0czsKCiAgICAg ICAgVmFuaWxsYVN3YXAgc3dhcCA9IE1ha2VWYW5pbGxhU3dhcCh0ZW5vciwgaW5kZXgsIDAuMCkK ICAgICAgICAgICAgLndpdGhFZmZlY3RpdmVEYXRlKHNldHRsZW1lbnQpCiAgICAgICAgICAgIC53 aXRoRml4ZWRMZWdEYXlDb3VudChmaXhlZExlZ0RheUNvdW50ZXIpCiAgICAgICAgICAgIC53aXRo Rml4ZWRMZWdUZW5vcihQZXJpb2QoZml4ZWRMZWdGcmVxdWVuY3kpKQogICAgICAgICAgICAud2l0 aEZpeGVkTGVnQ29udmVudGlvbihmaXhlZExlZ0NvbnZlbnRpb24pCiAgICAgICAgICAgIC53aXRo Rml4ZWRMZWdUZXJtaW5hdGlvbkRhdGVDb252ZW50aW9uKGZpeGVkTGVnQ29udmVudGlvbik7Cgog ICAgICAgIFJhdGUgZXhwZWN0ZWRSYXRlID0gc3dhcERhdGFbaV0ucmF0ZS8xMDAsCiAgICAgICAg ICAgICBlc3RpbWF0ZWRSYXRlID0gc3dhcC5mYWlyUmF0ZSgpOwogICAgICAgIFJlYWwgdG9sZXJh bmNlID0gMS4wZS05OwogICAgICAgIGlmIChzdGQ6OmZhYnMoZXhwZWN0ZWRSYXRlLWVzdGltYXRl ZFJhdGUpID4gdG9sZXJhbmNlKSB7CiAgICAgICAgICAgIEJPT1NUX0VSUk9SKCJiZWZvcmUgTElC T1IgZml4aW5nOlxuIgogICAgICAgICAgICAgICAgICAgICAgICA8PCBzd2FwRGF0YVtpXS5uIDw8 ICIgeWVhcihzKSBzd2FwOlxuIgogICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OnNldHBy ZWNpc2lvbig4KQogICAgICAgICAgICAgICAgICAgICAgICA8PCAiICAgIGVzdGltYXRlZCByYXRl OiAiCiAgICAgICAgICAgICAgICAgICAgICAgIDw8IGlvOjpyYXRlKGVzdGltYXRlZFJhdGUpIDw8 ICJcbiIKICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAgICBleHBlY3RlZCByYXRlOiAgIgog ICAgICAgICAgICAgICAgICAgICAgICA8PCBpbzo6cmF0ZShleHBlY3RlZFJhdGUpKTsKICAgICAg ICB9CiAgICB9CgogICAgRmxhZyBmOwogICAgZi5yZWdpc3RlcldpdGgodGVybVN0cnVjdHVyZSk7 CiAgICBmLmxvd2VyKCk7CgogICAgaW5kZXgtPmFkZEZpeGluZyh0b2RheSwgMC4wNDI1KTsKCiAg ICBpZiAoIWYuaXNVcCgpKQogICAgICAgIEJPT1NUX0VSUk9SKCJPYnNlcnZlciB3YXMgbm90IG5v dGlmaWVkIG9mIHJhdGUgZml4aW5nIik7CgogICAgZm9yIChTaXplIGk9MDsgaTxzd2FwczsgaSsr KSB7CiAgICAgICAgUGVyaW9kIHRlbm9yID0gc3dhcERhdGFbaV0ubipzd2FwRGF0YVtpXS51bml0 czsKCiAgICAgICAgVmFuaWxsYVN3YXAgc3dhcCA9IE1ha2VWYW5pbGxhU3dhcCh0ZW5vciwgaW5k ZXgsIDAuMCkKICAgICAgICAgICAgLndpdGhFZmZlY3RpdmVEYXRlKHNldHRsZW1lbnQpCiAgICAg ICAgICAgIC53aXRoRml4ZWRMZWdEYXlDb3VudChmaXhlZExlZ0RheUNvdW50ZXIpCiAgICAgICAg ICAgIC53aXRoRml4ZWRMZWdUZW5vcihQZXJpb2QoZml4ZWRMZWdGcmVxdWVuY3kpKQogICAgICAg ICAgICAud2l0aEZpeGVkTGVnQ29udmVudGlvbihmaXhlZExlZ0NvbnZlbnRpb24pCiAgICAgICAg ICAgIC53aXRoRml4ZWRMZWdUZXJtaW5hdGlvbkRhdGVDb252ZW50aW9uKGZpeGVkTGVnQ29udmVu dGlvbik7CgogICAgICAgIFJhdGUgZXhwZWN0ZWRSYXRlID0gc3dhcERhdGFbaV0ucmF0ZS8xMDAs CiAgICAgICAgICAgICBlc3RpbWF0ZWRSYXRlID0gc3dhcC5mYWlyUmF0ZSgpOwogICAgICAgIFJl YWwgdG9sZXJhbmNlID0gMS4wZS05OwogICAgICAgIGlmIChzdGQ6OmZhYnMoZXhwZWN0ZWRSYXRl LWVzdGltYXRlZFJhdGUpID4gdG9sZXJhbmNlKSB7CiAgICAgICAgICAgIEJPT1NUX0VSUk9SKCJh ZnRlciBMSUJPUiBmaXhpbmc6XG4iCiAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN3YXBEYXRh W2ldLm4gPDwgIiB5ZWFyKHMpIHN3YXA6XG4iCiAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0 ZDo6c2V0cHJlY2lzaW9uKDgpCiAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgICAgZXN0aW1h dGVkIHJhdGU6ICIKICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW86OnJhdGUoZXN0aW1hdGVk UmF0ZSkgPDwgIlxuIgogICAgICAgICAgICAgICAgICAgICAgICA8PCAiICAgIGV4cGVjdGVkIHJh dGU6ICAiCiAgICAgICAgICAgICAgICAgICAgICAgIDw8IGlvOjpyYXRlKGV4cGVjdGVkUmF0ZSkp OwogICAgICAgIH0KICAgIH0KfQoKCnRlc3Rfc3VpdGUqIFBpZWNld2lzZVlpZWxkQ3VydmVUZXN0 OjpzdWl0ZSgpIHsKCiAgICB0ZXN0X3N1aXRlKiBzdWl0ZSA9IEJPT1NUX1RFU1RfU1VJVEUoIlBp ZWNld2lzZSB5aWVsZCBjdXJ2ZSB0ZXN0cyIpOwogICAgc3VpdGUtPmFkZChCT09TVF9URVNUX0NB U0UoCiAgICAgICAgICAgICAgICAgJlBpZWNld2lzZVlpZWxkQ3VydmVUZXN0Ojp0ZXN0TG9nTGlu ZWFyRGlzY291bnRDb25zaXN0ZW5jeSkpOwogICAgc3VpdGUtPmFkZChCT09TVF9URVNUX0NBU0Uo CiAgICAgICAgICAgICAgICAgJlBpZWNld2lzZVlpZWxkQ3VydmVUZXN0Ojp0ZXN0TGluZWFyRGlz Y291bnRDb25zaXN0ZW5jeSkpOwogICAgI2lmICFkZWZpbmVkKFFMX1VTRV9JTkRFWEVEX0NPVVBP TikKICAgIHN1aXRlLT5hZGQoQk9PU1RfVEVTVF9DQVNFKAogICAgICAgICAgICAgICAgICZQaWVj ZXdpc2VZaWVsZEN1cnZlVGVzdDo6dGVzdExvZ0xpbmVhclplcm9Db25zaXN0ZW5jeSkpOwogICAg I2VuZGlmCiAgICBzdWl0ZS0+YWRkKEJPT1NUX1RFU1RfQ0FTRSgKICAgICAgICAgICAgICAgICAm UGllY2V3aXNlWWllbGRDdXJ2ZVRlc3Q6OnRlc3RMaW5lYXJaZXJvQ29uc2lzdGVuY3kpKTsKICAg IHN1aXRlLT5hZGQoQk9PU1RfVEVTVF9DQVNFKAogICAgICAgICAgICAgICAgICZQaWVjZXdpc2VZ aWVsZEN1cnZlVGVzdDo6dGVzdFNwbGluZVplcm9Db25zaXN0ZW5jeSkpOwogICAgc3VpdGUtPmFk ZChCT09TVF9URVNUX0NBU0UoCiAgICAgICAgICAgICAgICAgJlBpZWNld2lzZVlpZWxkQ3VydmVU ZXN0Ojp0ZXN0TGluZWFyRm9yd2FyZENvbnNpc3RlbmN5KSk7CiAgICBzdWl0ZS0+YWRkKEJPT1NU X1RFU1RfQ0FTRSgKICAgICAgICAgICAgICAgICAmUGllY2V3aXNlWWllbGRDdXJ2ZVRlc3Q6OnRl c3RGbGF0Rm9yd2FyZENvbnNpc3RlbmN5KSk7CiAgICAvL3N1aXRlLT5hZGQoQk9PU1RfVEVTVF9D QVNFKAogICAgLy8gICAgICAgICAgICAgJlBpZWNld2lzZVlpZWxkQ3VydmVUZXN0Ojp0ZXN0U3Bs aW5lRm9yd2FyZENvbnNpc3RlbmN5KSk7CiAgICBzdWl0ZS0+YWRkKEJPT1NUX1RFU1RfQ0FTRSgm UGllY2V3aXNlWWllbGRDdXJ2ZVRlc3Q6OnRlc3RPYnNlcnZhYmlsaXR5KSk7CiAgICBzdWl0ZS0+ YWRkKEJPT1NUX1RFU1RfQ0FTRSgmUGllY2V3aXNlWWllbGRDdXJ2ZVRlc3Q6OnRlc3RMaWJvckZp eGluZykpOwogICAgcmV0dXJuIHN1aXRlOwp9Cg== |