LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIFRyYWNlYWx5emVyIHYyLjUuMCBSZWNvcmRlciBMaWJyYXJ5DQogKiBQZXJjZXBpbyBBQiwgd3d3LnBlcmNlcGlvLmNvbQ0KICoNCiAqIHRyY1VzZXIuYw0KICoNCiAqIFRoZSBwdWJsaWMgQVBJIG9mIHRoZSB0cmFjZSByZWNvcmRlciBsaWJyYXJ5Lg0KICoNCiAqIFRlcm1zIG9mIFVzZQ0KICogVGhpcyBzb2Z0d2FyZSBpcyBjb3B5cmlnaHQgUGVyY2VwaW8gQUIuIFRoZSByZWNvcmRlciBsaWJyYXJ5IGlzIGZyZWUgZm9yDQogKiB1c2UgdG9nZXRoZXIgd2l0aCBQZXJjZXBpbyBwcm9kdWN0cy4gWW91IG1heSBkaXN0cmlidXRlIHRoZSByZWNvcmRlciBsaWJyYXJ5DQogKiBpbiBpdHMgb3JpZ2luYWwgZm9ybSwgaW5jbHVkaW5nIG1vZGlmaWNhdGlvbnMgaW4gdHJjSGFyZHdhcmVQb3J0LmMvLmgNCiAqIGdpdmVuIHRoYXQgdGhlc2UgbW9kaWZpY2F0aW9uIGFyZSBjbGVhcmx5IG1hcmtlZCBhcyB5b3VyIG93biBtb2RpZmljYXRpb25zDQogKiBhbmQgZG9jdW1lbnRlZCBpbiB0aGUgaW5pdGlhbCBjb21tZW50IHNlY3Rpb24gb2YgdGhlc2Ugc291cmNlIGZpbGVzLg0KICogVGhpcyBzb2Z0d2FyZSBpcyB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIFBlcmNlcGlvIEFCIGFuZCBtYXkgbm90IGJlDQogKiBzb2xkIG9yIGluIG90aGVyIHdheXMgY29tbWVyY2lhbGx5IHJlZGlzdHJpYnV0ZWQgd2l0aG91dCBleHBsaWNpdCB3cml0dGVuDQogKiBwZXJtaXNzaW9uIGJ5IFBlcmNlcGlvIEFCLg0KICoNCiAqIERpc2NsYWltZXINCiAqIFRoZSB0cmFjZSB0b29sIGFuZCByZWNvcmRlciBsaWJyYXJ5IGlzIGJlaW5nIGRlbGl2ZXJlZCB0byB5b3UgQVMgSVMgYW5kDQogKiBQZXJjZXBpbyBBQiBtYWtlcyBubyB3YXJyYW50eSBhcyB0byBpdHMgdXNlIG9yIHBlcmZvcm1hbmNlLiBQZXJjZXBpbyBBQiBkb2VzDQogKiBub3QgYW5kIGNhbm5vdCB3YXJyYW50IHRoZSBwZXJmb3JtYW5jZSBvciByZXN1bHRzIHlvdSBtYXkgb2J0YWluIGJ5IHVzaW5nIHRoZQ0KICogc29mdHdhcmUgb3IgZG9jdW1lbnRhdGlvbi4gUGVyY2VwaW8gQUIgbWFrZSBubyB3YXJyYW50aWVzLCBleHByZXNzIG9yDQogKiBpbXBsaWVkLCBhcyB0byBub25pbmZyaW5nZW1lbnQgb2YgdGhpcmQgcGFydHkgcmlnaHRzLCBtZXJjaGFudGFiaWxpdHksIG9yDQogKiBmaXRuZXNzIGZvciBhbnkgcGFydGljdWxhciBwdXJwb3NlLiBJbiBubyBldmVudCB3aWxsIFBlcmNlcGlvIEFCLCBpdHMNCiAqIHRlY2hub2xvZ3kgcGFydG5lcnMsIG9yIGRpc3RyaWJ1dG9ycyBiZSBsaWFibGUgdG8geW91IGZvciBhbnkgY29uc2VxdWVudGlhbCwNCiAqIGluY2lkZW50YWwgb3Igc3BlY2lhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGxvc3QgcHJvZml0cyBvciBsb3N0IHNhdmluZ3MsDQogKiBldmVuIGlmIGEgcmVwcmVzZW50YXRpdmUgb2YgUGVyY2VwaW8gQUIgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkNCiAqIG9mIHN1Y2ggZGFtYWdlcywgb3IgZm9yIGFueSBjbGFpbSBieSBhbnkgdGhpcmQgcGFydHkuIFNvbWUganVyaXNkaWN0aW9ucyBkbw0KICogbm90IGFsbG93IHRoZSBleGNsdXNpb24gb3IgbGltaXRhdGlvbiBvZiBpbmNpZGVudGFsLCBjb25zZXF1ZW50aWFsIG9yIHNwZWNpYWwNCiAqIGRhbWFnZXMsIG9yIHRoZSBleGNsdXNpb24gb2YgaW1wbGllZCB3YXJyYW50aWVzIG9yIGxpbWl0YXRpb25zIG9uIGhvdyBsb25nIGFuDQogKiBpbXBsaWVkIHdhcnJhbnR5IG1heSBsYXN0LCBzbyB0aGUgYWJvdmUgbGltaXRhdGlvbnMgbWF5IG5vdCBhcHBseSB0byB5b3UuDQogKg0KICogQ29weXJpZ2h0IFBlcmNlcGlvIEFCLCAyMDEzLg0KICogd3d3LnBlcmNlcGlvLmNvbQ0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KI2luY2x1ZGUgInRyY1VzZXIuaCINCg0KI2lmIChVU0VfVFJBQ0VBTFlaRVJfUkVDT1JERVIgPT0gMSkNCg0KI2luY2x1ZGUgPHN0cmluZy5oPg0KI2luY2x1ZGUgPHN0ZGFyZy5oPg0KI2luY2x1ZGUgPHN0ZGludC5oPg0KDQpUUkFDRV9TVE9QX0hPT0sgdlRyYWNlU3RvcEhvb2tQdHIgPSAoVFJBQ0VfU1RPUF9IT09LKTA7DQoNCmV4dGVybiB1aW50OF90IGluRXhjbHVkZWRUYXNrOw0KZXh0ZXJuIHVpbnQ4X3QgbklTUmFjdGl2ZTsNCmV4dGVybiB1aW50OF90IGhhbmRsZV9vZl9sYXN0X2xvZ2dlZF90YXNrOw0KZXh0ZXJuIHVpbnQzMl90IGR0c19taW47DQpleHRlcm4gdWludDMyX3QgaHd0Y19jb3VudF9tYXhfYWZ0ZXJfdGljazsNCmV4dGVybiB1aW50MzJfdCBod3RjX2NvdW50X3N1bV9hZnRlcl90aWNrOw0KZXh0ZXJuIHVpbnQzMl90IGh3dGNfY291bnRfc3VtX2FmdGVyX3RpY2tfY291bnRlcjsNCmV4dGVybiBjaGFyKiB0cmFjZUVycm9yTWVzc2FnZTsNCg0KLyoqKiBwcml2YXRlIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VQcmludEZfSGVscGVyKHRyYWNlTGFiZWwgZXZlbnRMYWJlbCwgY29uc3QgY2hhciogZm9ybWF0U3RyLCB2YV9saXN0IHZsKTsNCg0KI2lmIChVU0VfU0VQQVJBVEVfVVNFUl9FVkVOVF9CVUZGRVIgPT0gMSkNCnZvaWQgdlRyYWNlQ2hhbm5lbFByaW50Rl9IZWxwZXIoVXNlckV2ZW50Q2hhbm5lbCBjaGFubmVsUGFpciwgdmFfbGlzdCB2bCk7DQpzdGF0aWMgdm9pZCBwcnZUcmFjZVVzZXJFdmVudEhlbHBlcjEoVXNlckV2ZW50Q2hhbm5lbCBjaGFubmVsLCB0cmFjZUxhYmVsIGV2ZW50TGFiZWwsIHRyYWNlTGFiZWwgZm9ybWF0TGFiZWwsIHZhX2xpc3QgdmwpOw0Kc3RhdGljIHZvaWQgcHJ2VHJhY2VVc2VyRXZlbnRIZWxwZXIyKFVzZXJFdmVudENoYW5uZWwgY2hhbm5lbCwgdWludDMyX3QqIGRhdGEsIHVpbnQzMl90IG5vT2ZTbG90cyk7DQojZW5kaWYNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VJbml0VHJhY2VEYXRhDQogKg0KICogQWxsb2NhdGVzLCBpZiBuZWNlc3NhcnksIGFuZCBpbml0aWFsaXplcyB0aGUgcmVjb3JkZXIgZGF0YSBzdHJ1Y3R1cmUsIGJhc2VkDQogKiBvbiB0aGUgY29uc3RhbnRzIGluIHRyY0NvbmZpZy5oLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlSW5pdFRyYWNlRGF0YSh2b2lkKQ0Kew0KCXBydlRyYWNlSW5pdFRyYWNlRGF0YSgpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdlRyYWNlU2V0UmVjb3JkZXJEYXRhDQogKg0KICogSWYgY3VzdG9tIGFsbG9jYXRpb24gaXMgdXNlZCwgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBzbyB0aGUgcmVjb3JkZXINCiAqIGxpYnJhcnkga25vd3Mgd2hlcmUgdG8gc2F2ZSB0aGUgdHJhY2UgZGF0YS4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQojaWYgVFJBQ0VfREFUQV9BTExPQ0FUSU9OID09IFRSQUNFX0RBVEFfQUxMT0NBVElPTl9DVVNUT00NCnZvaWQgdlRyYWNlU2V0UmVjb3JkZXJEYXRhKHZvaWQqIHBSZWNvcmRlckRhdGEpDQp7DQoJVFJBQ0VfQVNTRVJUKHBSZWNvcmRlckRhdGEgIT0gTlVMTCwgInZUcmFjZVNldFRyYWNlRGF0YSwgcFJlY29yZGVyRGF0YSA9PSBOVUxMIiwgKTsNCglSZWNvcmRlckRhdGFQdHIgPSBwUmVjb3JkZXJEYXRhOw0KfQ0KI2VuZGlmDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VDbGVhcg0KICoNCiAqIFJlc2V0cyB0aGUgcmVjb3JkZXIuIE9ubHkgbmVjZXNzYXJ5IGlmIGEgcmVzdGFydCBpcyBkZXNpcmVkIC0gdGhpcyBpcyBub3QNCiAqIG5lZWRlZCBpbiB0aGUgc3RhcnR1cCBpbml0aWFsaXphdGlvbi4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZUNsZWFyKHZvaWQpDQp7DQogICAgdHJjQ1JJVElDQUxfU0VDVElPTl9CRUdJTigpOw0KDQogICAgUmVjb3JkZXJEYXRhUHRyLT5hYnNUaW1lTGFzdEV2ZW50ID0gMDsNCiAgICBSZWNvcmRlckRhdGFQdHItPm5leHRGcmVlSW5kZXggPSAwOw0KICAgIFJlY29yZGVyRGF0YVB0ci0+bnVtRXZlbnRzID0gMDsNCiAgICBSZWNvcmRlckRhdGFQdHItPmJ1ZmZlcklzRnVsbCA9IDA7DQoNCiAgICB0cmNDUklUSUNBTF9TRUNUSU9OX0VORCgpOw0KDQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB1aVRyYWNlU3RhcnQNCiAqDQogKiBTdGFydHMgdGhlIHJlY29yZGVyLiBUaGUgcmVjb3JkZXIgd2lsbCBub3QgYmUgc3RhcnRlZCBpZiBhbiBlcnJvciBoYXMgYmVlbg0KICogaW5kaWNhdGVkIHVzaW5nIHZUcmFjZUVycm9yLCBlLmcuIGlmIGFueSBvZiB0aGUgTnggY29uc3RhbnRzIGluIHRyY0NvbmZpZy5oDQogKiBoYXMgYSB0b28gc21hbGwgdmFsdWUgKE5UQVNLLCBOUVVFVUUsIGV0YykuDQogKg0KICogUmV0dXJucyAxIGlmIHRoZSByZWNvcmRlciB3YXMgc3RhcnRlZCBzdWNjZXNzZnVsbHkuDQogKiBSZXR1cm5zIDAgaWYgdGhlIHJlY29yZGVyIHN0YXJ0IHdhcyBwcmV2ZW50ZWQgZHVlIHRvIGEgcHJldmlvdXMgaW50ZXJuYWwNCiAqIGVycm9yLiBJbiB0aGF0IGNhc2UsIGNoZWNrIHZUcmFjZUdldExhc3RFcnJvciB0byBnZXQgdGhlIGVycm9yIG1lc3NhZ2UuDQogKiBBbnkgZXJyb3IgbWVzc2FnZSBpcyBhbHNvIHByZXNlbnRlZCB3aGVuIG9wZW5pbmcgYSB0cmFjZSBmaWxlLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KdWludDMyX3QgdWlUcmFjZVN0YXJ0KHZvaWQpDQp7DQoJb2JqZWN0SGFuZGxlVHlwZSBoYW5kbGUgPSAwOw0KDQoJaWYgKFJlY29yZGVyRGF0YVB0ciA9PSBOVUxMKQ0KCXsNCgkJdlRyYWNlRXJyb3IoIlJlY29yZGVyRGF0YVB0ciBpcyBOVUxMLiBDYWxsIHZUcmFjZUluaXRUcmFjZURhdGEoKSBiZWZvcmUgc3RhcnRpbmcgdHJhY2UuIik7DQoJCXJldHVybiAwOw0KCX0NCiAgICBpZiAodHJhY2VFcnJvck1lc3NhZ2UgPT0gTlVMTCkNCiAgICB7DQogICAgICAgIHRyY0NSSVRJQ0FMX1NFQ1RJT05fQkVHSU4oKTsNCiAgICAgICAgUmVjb3JkZXJEYXRhUHRyLT5yZWNvcmRlckFjdGl2ZSA9IDE7DQoNCgkJaGFuZGxlID0gVFJBQ0VfR0VUX1RBU0tfTlVNQkVSKFRSQUNFX0dFVF9DVVJSRU5UX1RBU0soKSk7DQoJCWlmIChoYW5kbGUgPT0gMCkNCgkJew0KCQkJLyogVGhpcyBvY2N1cnMgaWYgdGhlIHNjaGVkdWxlciBpcyBub3QgeWV0IHN0YXJ0ZWQuDQoJCQlUaGlzIGNyZWF0ZXMgYSBkdW1teSAiKHN0YXJ0dXApIiB0YXNrIGVudHJ5IGludGVybmFsbHkgaW4gdGhlDQoJCQlyZWNvcmRlciAqLw0KCQkJaGFuZGxlID0geFRyYWNlR2V0T2JqZWN0SGFuZGxlKFRSQUNFX0NMQVNTX1RBU0spOw0KCQkJdlRyYWNlU2V0T2JqZWN0TmFtZShUUkFDRV9DTEFTU19UQVNLLCBoYW5kbGUsICIoc3RhcnR1cCkiKTsNCg0KCQkJdlRyYWNlU2V0UHJpb3JpdHlQcm9wZXJ0eShUUkFDRV9DTEFTU19UQVNLLCBoYW5kbGUsIDApOw0KCQl9DQoNCiAgICAgICAgdlRyYWNlU3RvcmVUYXNrc3dpdGNoKGhhbmRsZSk7IC8qIFJlZ2lzdGVyIHRoZSBjdXJyZW50bHkgcnVubmluZyB0YXNrICovDQogICAgICAgIHRyY0NSSVRJQ0FMX1NFQ1RJT05fRU5EKCk7DQogICAgfQ0KDQogICAgcmV0dXJuIFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmU7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VTdGFydA0KICoNCiAqIFN0YXJ0cyB0aGUgcmVjb3JkZXIuIFRoZSByZWNvcmRlciB3aWxsIG5vdCBiZSBzdGFydGVkIGlmIGFuIGVycm9yIGhhcyBiZWVuDQogKiBpbmRpY2F0ZWQgdXNpbmcgdlRyYWNlRXJyb3IsIGUuZy4gaWYgYW55IG9mIHRoZSBOeCBjb25zdGFudHMgaW4gdHJjQ29uZmlnLmgNCiAqIGhhcyBhIHRvbyBzbWFsbCB2YWx1ZSAoTlRBU0ssIE5RVUVVRSwgZXRjKS4NCiAqDQogKiBUaGlzIGZ1bmN0aW9uIGlzIG9ic29sZXRlLCBidXQgaGFzIGJlZW4gc2F2ZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Lg0KICogV2UgcmVjb21tZW5kIHVzaW5nIHVpVHJhY2VTdGFydCBpbnN0ZWFkLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlU3RhcnQodm9pZCkNCnsNCiAgICAodm9pZCl1aVRyYWNlU3RhcnQoKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVN0b3ANCiAqDQogKiBTdG9wcyB0aGUgcmVjb3JkZXIuIFRoZSByZWNvcmRpbmcgY2FuIGJlIHJlc3VtZWQgYnkgY2FsbGluZyB2VHJhY2VTdGFydC4NCiAqIFRoaXMgZG9lcyBub3QgcmVzZXQgdGhlIHJlY29yZGVyLiBVc2UgdlRyYWNlQ2xlYXIgaWYgdGhhdCBpcyBkZXNpcmVkLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlU3RvcCh2b2lkKQ0Kew0KICAgIFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmUgPSAwOw0KCQ0KCWlmICh2VHJhY2VTdG9wSG9va1B0ciAhPSAoVFJBQ0VfU1RPUF9IT09LKTApDQoJew0KCQkoKnZUcmFjZVN0b3BIb29rUHRyKSgpOyAgICAgICAgICAgICAgICAgICAgICAvKiBDYWxsIGFuIGFwcGxpY2F0aW9uIGxldmVsIGNhbGwgYmFjayBmdW5jdGlvbi4gKi8NCgl9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB4VHJhY2VHZXRMYXN0RXJyb3INCiAqDQogKiBHaXZlcyB0aGUgbGFzdCBlcnJvciBtZXNzYWdlLCBpZiBhbnkuIE5VTEwgaWYgbm8gZXJyb3IgbWVzc2FnZSBpcyBzdG9yZWQuDQogKiBBbnkgZXJyb3IgbWVzc2FnZSBpcyBhbHNvIHByZXNlbnRlZCB3aGVuIG9wZW5pbmcgYSB0cmFjZSBmaWxlLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCmNoYXIqIHhUcmFjZUdldExhc3RFcnJvcih2b2lkKQ0Kew0KCXJldHVybiB0cmFjZUVycm9yTWVzc2FnZTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogdlRyYWNlQ2xlYXJFcnJvcg0KKg0KKiBSZW1vdmVzIGFueSBwcmV2aW91cyBlcnJvciBtZXNzYWdlIGdlbmVyYXRlZCBieSByZWNvcmRlciBjYWxsaW5nIHZUcmFjZUVycm9yLiANCiogQnkgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCBpdCBtYXkgYmUgcG9zc2libGUgdG8gc3RhcnQvcmVzdGFydCB0aGUgdHJhY2UgDQoqIGRlc3BpdGUgZXJyb3JzIGluIHRoZSByZWNvcmRlciwgYnV0IHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSB0cmFjZSANCiogcmVjb3JkZXIgd2lsbCB3b3JrIGNvcnJlY3RseSBpbiB0aGF0IGNhc2UsIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBlcnJvci4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlQ2xlYXJFcnJvcihpbnQgcmVzZXRFcnJvck1lc3NhZ2UpDQp7DQoJKCB2b2lkICkgcmVzZXRFcnJvck1lc3NhZ2U7DQoJdHJhY2VFcnJvck1lc3NhZ2UgPSBOVUxMOwkNCglSZWNvcmRlckRhdGFQdHItPmludGVybmFsRXJyb3JPY2N1cmVkID0gMDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZUdldFRyYWNlQnVmZmVyDQogKg0KICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHJlY29yZGVyIGRhdGEgc3RydWN0dXJlLiBVc2UgdGhpcyB0b2dldGhlciB3aXRoDQogKiB1aVRyYWNlR2V0VHJhY2VCdWZmZXJTaXplIGlmIHlvdSB3aXNoIHRvIGltcGxlbWVudCBhbiBvd24gc3RvcmUvdXBsb2FkDQogKiBzb2x1dGlvbiwgZS5nLiwgaW4gY2FzZSBhIGRlYnVnZ2VyIGNvbm5lY3Rpb24gaXMgbm90IGF2YWlsYWJsZSBmb3IgdXBsb2FkaW5nDQogKiB0aGUgZGF0YS4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkKiB2VHJhY2VHZXRUcmFjZUJ1ZmZlcih2b2lkKQ0Kew0KICAgIHJldHVybiBSZWNvcmRlckRhdGFQdHI7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB1aVRyYWNlR2V0VHJhY2VCdWZmZXJTaXplDQogKg0KICogR2V0cyB0aGUgc2l6ZSBvZiB0aGUgcmVjb3JkZXIgZGF0YSBzdHJ1Y3R1cmUuIEZvciB1c2UgdG9nZXRoZXIgd2l0aA0KICogdlRyYWNlR2V0VHJhY2VCdWZmZXIgaWYgeW91IHdpc2ggdG8gaW1wbGVtZW50IGFuIG93biBzdG9yZS91cGxvYWQgc29sdXRpb24sDQogKiBlLmcuLCBpbiBjYXNlIGEgZGVidWdnZXIgY29ubmVjdGlvbiBpcyBub3QgYXZhaWxhYmxlIGZvciB1cGxvYWRpbmcgdGhlIGRhdGEuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdWludDMyX3QgdWlUcmFjZUdldFRyYWNlQnVmZmVyU2l6ZSh2b2lkKQ0Kew0KICAgIHJldHVybiBzaXplb2YoUmVjb3JkZXJEYXRhVHlwZSk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVRhc2tJbnN0YW5jZUlzRmluaXNoZWQNCiAqDQogKiBUaGlzIGRlZmluZXMgYW4gZXhwbGljaXQgSW5zdGFuY2UgRmluaXNoIEV2ZW50IGZvciB0aGUgY3VycmVudCB0YXNrLiBJdCB0ZWxscw0KICogdGhlIHJlY29yZGVyIHRoYXQgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhpcyB0YXNrIGlzIGZpbmlzaGVkIGF0IHRoZSANCiAqIGNvbnRleHQtc3dpdGNoLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgcmlnaHQgYmVmb3JlIHRoZSBBUEkgZnVuY3Rpb24gDQogKiBjYWxsIGNvbnNpZGVyZWQgdG8gYmUgdGhlIEluc3RhbmNlIEZpbmlzaCBFdmVudC4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlVGFza0luc3RhbmNlSXNGaW5pc2hlZCgpDQp7DQogICAgaWYgKGhhbmRsZV9vZl9sYXN0X2xvZ2dlZF90YXNrKQ0KICAgIHsNCgkJVFJBQ0VfUFJPUEVSVFlfT0JKRUNUX1NUQVRFKFRSQUNFX0NMQVNTX1RBU0ssIGhhbmRsZV9vZl9sYXN0X2xvZ2dlZF90YXNrKSA9IDA7DQogICAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogSW50ZXJydXB0IHJlY29yZGluZyBmdW5jdGlvbnMNCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCiNpZiAoSU5DTFVERV9JU1JfVFJBQ0lORyA9PSAxKQ0KDQojZGVmaW5lIE1BWF9JU1JfTkVTVElORyAxNg0Kc3RhdGljIHVpbnQ4X3QgaXNyc3RhY2tbTUFYX0lTUl9ORVNUSU5HXTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVNldElTUlByb3BlcnRpZXMNCiAqDQogKiBSZWdpc3RlcnMgYW4gSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZSBpbiB0aGUgcmVjb3JkZXIgbGlicmFyeSwgVGhpcyBtdXN0IGJlDQogKiBjYWxsZWQgYmVmb3JlIHVzaW5nIHZUcmFjZVN0b3JlSVNSQmVnaW4gdG8gc3RvcmUgSVNSIGV2ZW50cy4gVGhpcyBpcw0KICogdHlwaWNhbGx5IGNhbGxlZCBpbiB0aGUgc3RhcnR1cCBvZiB0aGUgc3lzdGVtLCBiZWZvcmUgdGhlIHNjaGVkdWxlciBpcw0KICogc3RhcnRlZC4NCiAqDQogKiBFeGFtcGxlOg0KICogICAgICNkZWZpbmUgSURfSVNSX1RJTUVSMSAxICAgICAgIC8vIGxvd2VzdCB2YWxpZCBJRCBpcyAxDQogKiAgICAgI2RlZmluZSBQUklPX09GX0lTUl9USU1FUjEgMyAgLy8gdGhlIGhhcmR3YXJlIHByaW9yaXR5IG9mIHRoZSBpbnRlcnJ1cHQNCiAqICAgICAuLi4NCiAqICAgICB2VHJhY2VTZXRJU1JQcm9wZXJ0aWVzKElEX0lTUl9USU1FUjEsICJJU1JUaW1lcjEiLCBQUklPX09GX0lTUl9USU1FUjEpOw0KICogICAgIC4uLg0KICogICAgIHZvaWQgSVNSX2hhbmRsZXIoKQ0KICogICAgIHsNCiAqICAgICAgICAgdlRyYWNlU3RvcmVJU1JCZWdpbihJRF9PRl9JU1JfVElNRVIxKTsNCiAqICAgICAgICAgLi4uDQogKiAgICAgICAgIHZUcmFjZVN0b3JlSVNSRW5kKCk7DQogKiAgICAgfQ0KICoNCiAqIE5PVEU6IFRvIHNhZmVseSByZWNvcmQgSVNScywgeW91IG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIHRyYWNlZA0KICogaW50ZXJydXB0cyBhY3R1YWxseSBhcmUgZGlzYWJsZWQgYnkgdHJjQ1JJVElDQUxfU0VDVElPTl9CRUdJTigpLiBIb3dldmVyLA0KICogaW4gc29tZSBwb3J0cyB0aGlzIGRvZXMgbm90IGRpc2FibGUgaGlnaCBwcmlvcml0eSBpbnRlcnJ1cHRzIQ0KICogSWYgYW4gSVNSIGNhbGxzIHZUcmFjZVN0b3JlSVNSQmVnaW4gd2hpbGUgdGhlIHJlY29yZGVyIGlzIGJ1c3ksIGl0IHdpbGwNCiAqIHN0b3AgdGhlIHJlY29yZGluZyBhbmQgZ2l2ZSBhbiBlcnJvciBtZXNzYWdlLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlU2V0SVNSUHJvcGVydGllcyhvYmplY3RIYW5kbGVUeXBlIGhhbmRsZSwgY29uc3QgY2hhciogbmFtZSwgY2hhciBwcmlvcml0eSkNCnsNCglUUkFDRV9BU1NFUlQoaGFuZGxlIDw9IFJlY29yZGVyRGF0YVB0ci0+T2JqZWN0UHJvcGVydHlUYWJsZS5OdW1iZXJPZk9iamVjdHNQZXJDbGFzc1tUUkFDRV9DTEFTU19JU1JdLCAidlRyYWNlU2V0SVNSUHJvcGVydGllczogSW52YWxpZCB2YWx1ZSBmb3IgaGFuZGxlIiwgKTsNCglUUkFDRV9BU1NFUlQobmFtZSAhPSBOVUxMLCAidlRyYWNlU2V0SVNSUHJvcGVydGllczogbmFtZSA9PSBOVUxMIiwgKTsNCglUUkFDRV9BU1NFUlQocHJpb3JpdHkgPj0gMCwgInZUcmFjZVNldElTUlByb3BlcnRpZXM6IEludmFsaWQgdmFsdWUgZm9yIHByaW9yaXR5IiwgKTsNCg0KICAgIHZUcmFjZVNldE9iamVjdE5hbWUoVFJBQ0VfQ0xBU1NfSVNSLCBoYW5kbGUsIG5hbWUpOw0KICAgIHZUcmFjZVNldFByaW9yaXR5UHJvcGVydHkoVFJBQ0VfQ0xBU1NfSVNSLCBoYW5kbGUsIHByaW9yaXR5KTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVN0b3JlSVNSQmVnaW4NCiAqDQogKiBSZWdpc3RlcnMgdGhlIGJlZ2lubmluZyBvZiBhbiBJbnRlcnJ1cHQgU2VydmljZSBSb3V0aW5lLg0KICoNCiAqIEV4YW1wbGU6DQogKiAgICAgI2RlZmluZSBJRF9JU1JfVElNRVIxIDEgICAgICAgLy8gbG93ZXN0IHZhbGlkIElEIGlzIDENCiAqICAgICAjZGVmaW5lIFBSSU9fT0ZfSVNSX1RJTUVSMSAzICAvLyB0aGUgaGFyZHdhcmUgcHJpb3JpdHkgb2YgdGhlIGludGVycnVwdA0KICogICAgIC4uLg0KICogICAgIHZUcmFjZVNldElTUlByb3BlcnRpZXMoSURfSVNSX1RJTUVSMSwgIklTUlRpbWVyMSIsIFBSSU9fT0ZfSVNSX1RJTUVSMSk7DQogKiAgICAgLi4uDQogKiAgICAgdm9pZCBJU1JfaGFuZGxlcigpDQogKiAgICAgew0KICogICAgICAgICB2VHJhY2VTdG9yZUlTUkJlZ2luKElEX09GX0lTUl9USU1FUjEpOw0KICogICAgICAgICAuLi4NCiAqICAgICAgICAgdlRyYWNlU3RvcmVJU1JFbmQoKTsNCiAqICAgICB9DQogKg0KICogTk9URTogWW91IG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYW55IHRyYWNlZCBpbnRlcnJ1cHRzIGFjdHVhbGx5IGFyZQ0KICogZGlzYWJsZWQgYnkgdHJjQ1JJVElDQUxfU0VDVElPTl9CRUdJTigpLg0KICogSWYgYW4gaW52YWxpZCBjYWxsIHRvIHZUcmFjZVN0b3JlSVNSQmVnaW4gaXMgZGV0ZWN0ZWQgKGkuZS4sIHRoYXQgcHJlZW1wdGVkDQogKiBhIGNyaXRpY2FsIHNlY3Rpb24gb2YgdGhlIHJlY29yZGVyKSB0aGlzIHdpbGwgZ2VuZXJhdGUgYSByZWNvcmRlciBlcnJvcg0KICogdXNpbmcgdlRyYWNlRXJyb3IuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VTdG9yZUlTUkJlZ2luKG9iamVjdEhhbmRsZVR5cGUgaGFuZGxlKQ0Kew0KICAgIHVpbnQxNl90IGR0czQ7DQogICAgVFNFdmVudCogdHMgPSBOVUxMOw0KDQogICAgVFJBQ0VfQVNTRVJUKGhhbmRsZSA8PSBSZWNvcmRlckRhdGFQdHItPk9iamVjdFByb3BlcnR5VGFibGUuTnVtYmVyT2ZPYmplY3RzUGVyQ2xhc3NbVFJBQ0VfQ0xBU1NfSVNSXSwgInZUcmFjZVN0b3JlSVNSQmVnaW46IEludmFsaWQgdmFsdWUgZm9yIGhhbmRsZSIsICk7DQoNCiAgICBpZiAocmVjb3JkZXJfYnVzeSkNCiAgICB7DQogICAgICB2VHJhY2VFcnJvcigiSWxsZWdhbCBjYWxsIHRvIHZUcmFjZVN0b3JlSVNSQmVnaW4sIHJlY29yZGVyIGJ1c3khIik7DQogICAgICByZXR1cm47DQogICAgfQ0KICAgIGlmIChSZWNvcmRlckRhdGFQdHItPnJlY29yZGVyQWN0aXZlICYmIGhhbmRsZV9vZl9sYXN0X2xvZ2dlZF90YXNrKQ0KICAgIHsNCiAgICAgICAgdHJjQ1JJVElDQUxfU0VDVElPTl9CRUdJTigpOw0KICAgICAgICBkdHM0ID0gKHVpbnQxNl90KXBydlRyYWNlR2V0RFRTKDB4RkZGRik7DQoNCiAgICAgICAgaWYgKFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmUpIC8qIE5lZWQgdG8gcmVwZWF0IHRoaXMgY2hlY2shICovDQogICAgICAgIHsNCg0KICAgICAgICAgICAgaWYgKG5JU1JhY3RpdmUgPCBNQVhfSVNSX05FU1RJTkcpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaXNyc3RhY2tbbklTUmFjdGl2ZV0gPSBoYW5kbGU7DQogICAgICAgICAgICAgICAgbklTUmFjdGl2ZSsrOw0KICAgICAgICAgICAgICAgIHRzID0gKFRTRXZlbnQqKXhUcmFjZU5leHRGcmVlRXZlbnRCdWZmZXJTbG90KCk7DQogICAgICAgICAgICAgICAgaWYgKHRzICE9IE5VTEwpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB0cy0+dHlwZSA9IFRTX0lTUl9CRUdJTjsNCiAgICAgICAgICAgICAgICAgICAgdHMtPmR0cyA9IGR0czQ7DQogICAgICAgICAgICAgICAgICAgIHRzLT5vYmpIYW5kbGUgPSBoYW5kbGU7DQogICAgICAgICAgICAgICAgICAgIHBydlRyYWNlVXBkYXRlQ291bnRlcnMoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgLyogVGhpcyBzaG91bGQgbm90IG9jY3VyIHVubGVzcyBzb21ldGhpbmcgaXMgdmVyeSB3cm9uZyAqLw0KICAgICAgICAgICAgICAgIHZUcmFjZUVycm9yKCJUb28gbWFueSBuZXN0ZWQgaW50ZXJydXB0cyEiKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB0cmNDUklUSUNBTF9TRUNUSU9OX0VORCgpOw0KICAgIH0NCn0NCg0KDQojaWYgKFNFTEVDVEVEX1BPUlQgPT0gUE9SVF9BUk1fQ29ydGV4TSkNCg0Kc3RhdGljIGludCB0YWlsY2hhaW5faXJxX3BlbmRpbmcodm9pZCk7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB0YWlsY2hhaW5faXJxX3BlbmRpbmcNCiAqDQogKiBGb3IgQ29ydGV4LU0gY2hpcHMgb25seS4gUmV0dXJucyAxIGlmIGFuIGludGVycnVwdCBpcyBwZW5kaW5nLCBieSBjaGVja2luZw0KICogdGhlIDggTlZJQyBJUlEgcGVuZCByZWdpc3RlcnMgYXQgMHhFMDAwRTIwMCB0byAweEUwMDBFMjFDLiBSZXR1cm5zIDAgaWYgbm8NCiAqIGludGVycnVwdCBpcyBwZW5kaW5nLiBUaGlzIGlzIHVzZWQgdG8gcHJlZGljdCB0YWlsY2hhaW5pbmcgb2YgSVNScy4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpzdGF0aWMgaW50IHRhaWxjaGFpbl9pcnFfcGVuZGluZyh2b2lkKQ0Kew0KICB1aW50MzJfdCogcGVuZF9yZWcgPSAoKHVpbnQzMl90KikweEUwMDBFMjAwKTsNCiAgaW50IGk7DQoNCiAgZm9yIChpPTA7IGk8ODsgaSsrKQ0KICB7DQogICAgaWYgKHBlbmRfcmVnW2ldICE9IDApDQogICAgew0KICAgICAgcmV0dXJuIDE7DQogICAgfQ0KICB9DQogIHJldHVybiAwOw0KfQ0KDQojZW5kaWYNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVN0b3JlSVNSRW5kDQogKg0KICogUmVnaXN0ZXJzIHRoZSBlbmQgb2YgYW4gSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZS4NCiAqDQogKiBFeGFtcGxlOg0KICogICAgICNkZWZpbmUgSURfSVNSX1RJTUVSMSAxICAgICAgIC8vIGxvd2VzdCB2YWxpZCBJRCBpcyAxDQogKiAgICAgI2RlZmluZSBQUklPX09GX0lTUl9USU1FUjEgMyAgLy8gdGhlIGhhcmR3YXJlIHByaW9yaXR5IG9mIHRoZSBpbnRlcnJ1cHQNCiAqICAgICAuLi4NCiAqICAgICB2VHJhY2VTZXRJU1JQcm9wZXJ0aWVzKElEX0lTUl9USU1FUjEsICJJU1JUaW1lcjEiLCBQUklPX09GX0lTUl9USU1FUjEpOw0KICogICAgIC4uLg0KICogICAgIHZvaWQgSVNSX2hhbmRsZXIoKQ0KICogICAgIHsNCiAqICAgICAgICAgdlRyYWNlU3RvcmVJU1JCZWdpbihJRF9PRl9JU1JfVElNRVIxKTsNCiAqICAgICAgICAgLi4uDQogKiAgICAgICAgIHZUcmFjZVN0b3JlSVNSRW5kKCk7DQogKiAgICAgfQ0KICoNCiAqIE5PVEU6IFlvdSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGFueSB0cmFjZWQgaW50ZXJydXB0cyBhY3R1YWxseSBhcmUNCiAqIGRpc2FibGVkIGJ5IHRyY0NSSVRJQ0FMX1NFQ1RJT05fQkVHSU4oKS4NCiAqIElmIGFuIGludmFsaWQgY2FsbCB0byB2VHJhY2VTdG9yZUlTUkVuZCBpcyBkZXRlY3RlZCAoaS5lLiwgdGhhdCBwcmVlbXB0ZWQNCiAqIGEgY3JpdGljYWwgc2VjdGlvbiBvZiB0aGUgcmVjb3JkZXIpIHRoaXMgd2lsbCBnZW5lcmF0ZSBhIHJlY29yZGVyIGVycm9yDQogKiB1c2luZyB2VHJhY2VFcnJvci4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZVN0b3JlSVNSRW5kKHZvaWQpDQp7DQogICAgVFNFdmVudCogdHM7DQogICAgdWludDE2X3QgZHRzNTsNCg0KICAgIGlmIChyZWNvcmRlcl9idXN5KQ0KICAgIHsNCiAgICAgIHZUcmFjZUVycm9yKCJJbGxlZ2FsIGNhbGwgdG8gdlRyYWNlU3RvcmVJU1JFbmQsIHJlY29yZGVyIGJ1c3khIik7DQogICAgICByZXR1cm47DQogICAgfQ0KDQogICAgaWYgKFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmUgJiYgaGFuZGxlX29mX2xhc3RfbG9nZ2VkX3Rhc2spDQogICAgew0KICAgICAgICAjaWYgKFNFTEVDVEVEX1BPUlQgPT0gUE9SVF9BUk1fQ29ydGV4TSkNCiAgICAgICAgaWYgKHRhaWxjaGFpbl9pcnFfcGVuZGluZygpID4gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgbklTUmFjdGl2ZS0tOyAvKiBJZiBhbiBJUlEgc3RyaWtlcyBleGFjdGx5IGhlcmUsIHRoZSByZXN1bHRpbmcNCiAgICAgICAgICAgIElTUiB0YWlsY2hhaW5pbmcgaXMgbm90IGRldGVjdGVkLiBUaGUgdHJhY2UgaW5zdGVhZCBzaG93cyBhIHZlcnkNCiAgICAgICAgICAgIHNob3J0IGZyYWdtZW50IG9mIHRoZSBlYXJsaWVyIHByZWVtcHRlZCB0YXNrL0lTUiwgYW5kIHRoZW4gdGhlIG5ldw0KICAgICAgICAgICAgSVNSIGJlZ2lucy4gKi8NCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICAjZW5kaWYNCg0KICAgICAgICB0cmNDUklUSUNBTF9TRUNUSU9OX0JFR0lOKCk7DQogICAgICAgIGR0czUgPSAodWludDE2X3QpcHJ2VHJhY2VHZXREVFMoMHhGRkZGKTsNCg0KICAgICAgICBpZiAoUmVjb3JkZXJEYXRhUHRyLT5yZWNvcmRlckFjdGl2ZSkgLyogTmVlZCB0byByZXBlYXQgdGhpcyBjaGVjayEgKi8NCiAgICAgICAgew0KICAgICAgICAgICAgdHMgPSAoVFNFdmVudCopeFRyYWNlTmV4dEZyZWVFdmVudEJ1ZmZlclNsb3QoKTsNCiAgICAgICAgICAgIGlmICh0cyAhPSBOVUxMKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmIChuSVNSYWN0aXZlID4gMSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiB0byBhbm90aGVyIGlzciAqLw0KICAgICAgICAgICAgICAgICAgICB0cy0+dHlwZSA9IFRTX0lTUl9SRVNVTUU7DQogICAgICAgICAgICAgICAgICAgIHRzLT5vYmpIYW5kbGUgPSBpc3JzdGFja1tuSVNSYWN0aXZlXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIHRvIHRhc2sgKi8NCiAgICAgICAgICAgICAgICAgICAgdHMtPnR5cGUgPSBUU19UQVNLX1JFU1VNRTsNCiAgICAgICAgICAgICAgICAgICAgdHMtPm9iakhhbmRsZSA9IGhhbmRsZV9vZl9sYXN0X2xvZ2dlZF90YXNrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB0cy0+ZHRzID0gZHRzNTsNCiAgICAgICAgICAgICAgICBuSVNSYWN0aXZlLS07DQogICAgICAgICAgICAgICAgcHJ2VHJhY2VVcGRhdGVDb3VudGVycygpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHRyY0NSSVRJQ0FMX1NFQ1RJT05fRU5EKCk7DQogICAgfQ0KfQ0KDQojZWxzZQ0KDQovKiBJU1IgdHJhY2luZyBpcyB0dXJuZWQgb2ZmICovDQp2b2lkIHZUcmFjZUluY3JlYXNlSVNSQWN0aXZlKHZvaWQpDQp7DQogICAgaWYgKFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmUgJiYgaGFuZGxlX29mX2xhc3RfbG9nZ2VkX3Rhc2spDQogICAgICAgIG5JU1JhY3RpdmUrKzsNCn0NCg0Kdm9pZCB2VHJhY2VEZWNyZWFzZUlTUkFjdGl2ZSh2b2lkKQ0Kew0KICAgIGlmIChSZWNvcmRlckRhdGFQdHItPnJlY29yZGVyQWN0aXZlICYmIGhhbmRsZV9vZl9sYXN0X2xvZ2dlZF90YXNrKQ0KICAgICAgICBuSVNSYWN0aXZlLS07DQp9DQojZW5kaWYNCg0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogVXNlciBFdmVudCBmdW5jdGlvbnMNCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCiNpZiAoSU5DTFVERV9VU0VSX0VWRU5UUyA9PSAxKQ0KDQojZGVmaW5lIE1BWF9BUkdfU0laRSAoNCszMikNCi8qKiogTG9jYWxseSB1c2VkIGluIHZUcmFjZVByaW50RiAqKiovDQpzdGF0aWMgdWludDhfdCB3cml0ZUludDgodm9pZCAqIGJ1ZmZlciwgdWludDhfdCBpLCB1aW50OF90IHZhbHVlKQ0Kew0KCVRSQUNFX0FTU0VSVChidWZmZXIgIT0gTlVMTCwgIndyaXRlSW50ODogYnVmZmVyID09IE5VTEwiLCAwKTsNCg0KICAgIGlmIChpID49IE1BWF9BUkdfU0laRSkNCiAgICB7DQogICAgICAgIHJldHVybiAyNTU7DQogICAgfQ0KDQogICAgKCh1aW50OF90KilidWZmZXIpW2ldID0gdmFsdWU7DQoNCglpZiAoaSArIDEgPiBNQVhfQVJHX1NJWkUpDQoJew0KCQlyZXR1cm4gMjU1Ow0KCX0NCg0KICAgIHJldHVybiBpICsgMTsNCn0NCg0KLyoqKiBMb2NhbGx5IHVzZWQgaW4gdlRyYWNlUHJpbnRGICoqKi8NCnN0YXRpYyB1aW50OF90IHdyaXRlSW50MTYodm9pZCAqIGJ1ZmZlciwgdWludDhfdCBpLCB1aW50MTZfdCB2YWx1ZSkNCnsNCglUUkFDRV9BU1NFUlQoYnVmZmVyICE9IE5VTEwsICJ3cml0ZUludDE2OiBidWZmZXIgPT0gTlVMTCIsIDApOw0KDQogICAgLyogQWxpZ24gdG8gbXVsdGlwbGUgb2YgMiAqLw0KICAgIHdoaWxlICgoaSAlIDIpICE9IDApDQogICAgew0KCQlpZiAoaSA+PSBNQVhfQVJHX1NJWkUpDQoJCXsNCgkJCXJldHVybiAyNTU7DQoJCX0NCg0KICAgICAgICAoKHVpbnQ4X3QqKWJ1ZmZlcilbaV0gPSAwOw0KICAgICAgICBpKys7DQogICAgfQ0KDQogICAgaWYgKGkgKyAyID4gTUFYX0FSR19TSVpFKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIDI1NTsNCiAgICB9DQoNCiAgICAoKHVpbnQxNl90KilidWZmZXIpW2kvMl0gPSB2YWx1ZTsNCg0KICAgIHJldHVybiBpICsgMjsNCn0NCg0KLyoqKiBMb2NhbGx5IHVzZWQgaW4gdlRyYWNlUHJpbnRGICoqKi8NCnN0YXRpYyB1aW50OF90IHdyaXRlSW50MzIodm9pZCAqIGJ1ZmZlciwgdWludDhfdCBpLCB1aW50MzJfdCB2YWx1ZSkNCnsNCglUUkFDRV9BU1NFUlQoYnVmZmVyICE9IE5VTEwsICJ3cml0ZUludDMyOiBidWZmZXIgPT0gTlVMTCIsIDApOw0KDQogICAgLyogQSAzMiBiaXQgdmFsdWUgc2hvdWxkIGJlZ2luIGF0IGFuIGV2ZW4gNC1ieXRlIGFkZHJlc3MgKi8NCiAgICB3aGlsZSAoKGkgJSA0KSAhPSAwKQ0KICAgIHsNCgkJaWYgKGkgPj0gTUFYX0FSR19TSVpFKQ0KCQl7DQoJCQlyZXR1cm4gMjU1Ow0KCQl9DQoNCiAgICAgICAgKCh1aW50OF90KilidWZmZXIpW2ldID0gMDsNCiAgICAgICAgaSsrOw0KICAgIH0NCg0KICAgIGlmIChpICsgNCA+IE1BWF9BUkdfU0laRSkNCiAgICB7DQogICAgICAgIHJldHVybiAyNTU7DQogICAgfQ0KDQogICAgKCh1aW50MzJfdCopYnVmZmVyKVtpLzRdID0gdmFsdWU7DQoNCiAgICByZXR1cm4gaSArIDQ7DQp9DQoNCiNpZiAoSU5DTFVERV9GTE9BVF9TVVBQT1JUKQ0KDQovKioqIExvY2FsbHkgdXNlZCBpbiB2VHJhY2VQcmludEYgKioqLw0Kc3RhdGljIHVpbnQ4X3Qgd3JpdGVGbG9hdCh2b2lkICogYnVmZmVyLCB1aW50OF90IGksIGZsb2F0IHZhbHVlKQ0Kew0KCVRSQUNFX0FTU0VSVChidWZmZXIgIT0gTlVMTCwgIndyaXRlRmxvYXQ6IGJ1ZmZlciA9PSBOVUxMIiwgMCk7DQoNCiAgICAvKiBBIDMyIGJpdCB2YWx1ZSBzaG91bGQgYmVnaW4gYXQgYW4gZXZlbiA0LWJ5dGUgYWRkcmVzcyAqLw0KICAgIHdoaWxlICgoaSAlIDQpICE9IDApDQogICAgew0KCQlpZiAoaSA+PSBNQVhfQVJHX1NJWkUpDQoJCXsNCgkJCXJldHVybiAyNTU7DQoJCX0NCg0KICAgICAgICAoKHVpbnQ4X3QqKWJ1ZmZlcilbaV0gPSAwOw0KICAgICAgICBpKys7DQogICAgfQ0KDQogICAgaWYgKGkgKyA0ID4gTUFYX0FSR19TSVpFKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIDI1NTsNCiAgICB9DQoNCiAgICAoKGZsb2F0KilidWZmZXIpW2kvNF0gPSB2YWx1ZTsNCg0KICAgIHJldHVybiBpICsgNDsNCn0NCg0KLyoqKiBMb2NhbGx5IHVzZWQgaW4gdlRyYWNlUHJpbnRGICoqKi8NCnN0YXRpYyB1aW50OF90IHdyaXRlRG91YmxlKHZvaWQgKiBidWZmZXIsIHVpbnQ4X3QgaSwgZG91YmxlIHZhbHVlKQ0Kew0KCVRSQUNFX0FTU0VSVChidWZmZXIgIT0gTlVMTCwgIndyaXRlRG91YmxlOiBidWZmZXIgPT0gTlVMTCIsIDApOw0KDQogICAgdWludDMyX3QgKiBkZXN0ID0gYnVmZmVyOw0KICAgIHVpbnQzMl90ICogc3JjID0gKHZvaWQqKSZ2YWx1ZTsNCiAgICAvKiBUaGUgZG91YmxlIGlzIHdyaXR0ZW4gYXMgdHdvIDMyIGJpdCB2YWx1ZXMsIGFuZCBzaG91bGQgYmVnaW4gYXQgYW4gZXZlbg0KICAgIDQtYnl0ZSBhZGRyZXNzICh0byBhdm9pZCBoYXZpbmcgdG8gYWxpZ24gd2l0aCA4IGJ5dGUpICovDQogICAgd2hpbGUgKGkgJSA0ICE9IDApDQogICAgew0KCQlpZiAoaSA+PSBNQVhfQVJHX1NJWkUpDQoJCXsNCgkJCXJldHVybiAyNTU7DQoJCX0NCg0KICAgICAgICAoKHVpbnQ4X3QqKWJ1ZmZlcilbaV0gPSAwOw0KICAgICAgICBpKys7DQogICAgfQ0KDQogICAgaWYgKGkgKyA4ID4gTUFYX0FSR19TSVpFKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIDI1NTsNCiAgICB9DQoNCiAgICBkZXN0W2kvNCswXSA9IHNyY1swXTsNCiAgICBkZXN0W2kvNCsxXSA9IHNyY1sxXTsNCg0KICAgIHJldHVybiBpICsgODsNCn0NCg0KI2VuZGlmDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiBwcnZUcmFjZVVzZXJFdmVudEZvcm1hdA0KICoNCiAqIFBhcnNlcyB0aGUgZm9ybWF0IHN0cmluZyBhbmQgc3RvcmVzIHRoZSBhcmd1bWVudHMgaW4gdGhlIGJ1ZmZlci4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpzdGF0aWMgdWludDhfdCBwcnZUcmFjZVVzZXJFdmVudEZvcm1hdChjb25zdCBjaGFyKiBmb3JtYXRTdHIsIHZhX2xpc3QgdmwsIHVpbnQ4X3QqIGJ1ZmZlciwgdWludDhfdCBieXRlT2Zmc2V0KQ0Kew0KCXVpbnQxNl90IGZvcm1hdFN0ckluZGV4ID0gMDsNCgl1aW50OF90IGFyZ0NvdW50ZXIgPSAwOw0KCXVpbnQ4X3QgaSA9IGJ5dGVPZmZzZXQ7DQoNCgl3aGlsZSAoZm9ybWF0U3RyW2Zvcm1hdFN0ckluZGV4XSAhPSAnXDAnKQ0KICAgIHsNCiAgICAgICAgaWYgKGZvcm1hdFN0cltmb3JtYXRTdHJJbmRleF0gPT0gJyUnKQ0KICAgICAgICB7DQogICAgICAgICAgICBhcmdDb3VudGVyKys7DQoNCiAgICAgICAgICAgIGlmIChhcmdDb3VudGVyID4gMTUpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdlRyYWNlRXJyb3IoInZUcmFjZVByaW50RiAtIFRvbyBtYW55IGFyZ3VtZW50cywgbWF4IDE1IGFsbG93ZWQhIik7DQogICAgICAgICAgICAgICAgcmV0dXJuIDA7DQogICAgICAgICAgICB9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIFRoZXNlIGJlbG93IGNvZGUgd3JpdGVzIHJhdyBkYXRhIChwcmltaXRpdmUgZGF0YXR5cGVzKSBpbiB0aGUgZXZlbnQgYnVmZmVyLA0KKiBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgZXZlbnQgc3RydWN0cyAod2hlcmUgYnl0ZSAwIGlzIGV2ZW50IHR5cGUpLg0KKiBUaGVzZSBkYXRhIGVudHJpZXMgbXVzdCBuZXZlciBiZSBpbnRlcnByZXRlZCBhcyByZWFsIGV2ZW50IGRhdGEsIGFzIHRoZSB0eXBlDQoqIGZpZWxkIHdvdWxkIGJlIG1pc2xlYWRpbmcgc2luY2UgdXNlZCBmb3IgcGF5bG9hZCBkYXRhLg0KKg0KKiBUaGUgY29ycmVjdG5lc3Mgb2YgdGhpcyBlbmNvZGluZyBkZXBlbmRzIG9uIHR3byBtZWNoYW5pc21zOg0KKg0KKiAxLiBBbiBpbml0aWFsIFVTRVJfRVZFTlQsIHdoaWNoIHR5cGUgY29kZSB0ZWxscyB0aGUgbnVtYmVyIG9mIDMyLWJpdCBkYXRhDQoqIGVudGlyZXMgdGhhdCBmb2xsb3dzLiAoY29kZSAtIFVTRVJfRVZFTlQgPSBudW1iZXIgb2YgZGF0YSBlbnRyaWVzKS4NCiogTm90ZSB0aGF0IGEgZGF0YSBlbnRyeSBjb3JyZXNwb25kcyB0byB0aGUgc2xvdHMgdGhhdCBub3JtYWxseSBjb3JyZXNwb25kcyB0bw0KKiBvbmUgKDEpIGV2ZW50LCBpLmUuLCAzMiBiaXRzLiB2VHJhY2VQcmludEYgbWF5IGVuY29kZSBzZXZlcmFsIHBpZWNlcyBvZiBkYXRhDQoqIGluIG9uZSBkYXRhIGVudHJ5LCBlLmcuLCB0d28gMTYtYml0IHZhbHVlcyBvciBmb3VyIDgtYml0IHZhbHVlcywgb25lIDE2LWJpdA0KKiB2YWx1ZSBmb2xsb3dlZCBieSB0d28gOC1iaXQgdmFsdWVzLCBldGMuDQoqDQoqIDIuIEEgdHdvLXBoYXNlIGNvbW1pdCBwcm9jZWR1cmUsIHdoZXJlIHRoZSBVU0VSX0VWRU5UIGFuZCBkYXRhIGVudHJpZXMgYXJlDQoqIHdyaXR0ZW4gdG8gYSBsb2NhbCBidWZmZXIgYXQgZmlyc3QsIGFuZCB3aGVuIGFsbCBjaGVja3MgYXJlIE9LIHRoZW4gY29waWVkIHRvDQoqIHRoZSBtYWluIGV2ZW50IGJ1ZmZlciB1c2luZyBhIGZhc3QgbWVtY3B5LiBUaGUgZXZlbnQgY29kZSBpcyBmaW5hbGl6ZWQgYXMgdGhlDQoqIHZlcnkgbGFzdCBzdGVwLiBCZWZvcmUgdGhhdCBzdGVwLCB0aGUgZXZlbnQgY29kZSBpbmRpY2F0ZXMgYW4gdW5maW5pc2hlZA0KKiBldmVudCwgd2hpY2ggY2F1c2VzIGl0IHRvIGJlIGlnbm9yZWQgYW5kIHN0b3AgdGhlIGxvYWRpbmcgb2YgdGhlIGZpbGUgKHNpbmNlDQoqIGFuIHVuZmluaXNoZWQgZXZlbnQgaXMgdGhlIGxhc3QgZXZlbnQgaW4gdGhlIHRyYWNlKS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQogICAgICAgICAgICBmb3JtYXRTdHJJbmRleCsrOw0KDQoJCQl3aGlsZSAoKGZvcm1hdFN0cltmb3JtYXRTdHJJbmRleF0gPj0gJzAnICYmIGZvcm1hdFN0cltmb3JtYXRTdHJJbmRleF0gPD0gJzknKSB8fCBmb3JtYXRTdHJbZm9ybWF0U3RySW5kZXhdID09ICcjJyB8fCBmb3JtYXRTdHJbZm9ybWF0U3RySW5kZXhdID09ICcuJykNCgkJCQlmb3JtYXRTdHJJbmRleCsrOw0KDQoJCQlpZiAoZm9ybWF0U3RyW2Zvcm1hdFN0ckluZGV4XSAhPSAnXDAnKQ0KCQkJew0KCQkJCXN3aXRjaCAoZm9ybWF0U3RyW2Zvcm1hdFN0ckluZGV4XSkNCgkJCQl7DQoJCQkJY2FzZSAnZCc6ICAgIGkgPSB3cml0ZUludDMyKGJ1ZmZlciwNCgkJCQkJCQkJCQkJCWksDQoJCQkJCQkJCQkJCQkodWludDMyX3QpdmFfYXJnKHZsLCB1aW50MzJfdCkpOw0KCQkJCQkJCQlicmVhazsNCgkJCQljYXNlICd4JzoNCgkJCQljYXNlICdYJzoNCgkJCQljYXNlICd1JzogICAgaSA9IHdyaXRlSW50MzIoYnVmZmVyLA0KCQkJCQkJCQkJCQkJaSwNCgkJCQkJCQkJCQkJCSh1aW50MzJfdCl2YV9hcmcodmwsIHVpbnQzMl90KSk7DQoJCQkJCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ3MnOiAgICBpID0gd3JpdGVJbnQxNihidWZmZXIsDQoJCQkJCQkJCQkJCQlpLA0KCQkJCQkJCQkJCQkJKHVpbnQxNl90KXhUcmFjZU9wZW5MYWJlbCgoY2hhciopdmFfYXJnKHZsLCBjaGFyKikpKTsNCgkJCQkJCQkJYnJlYWs7DQoNCiNpZiAoSU5DTFVERV9GTE9BVF9TVVBQT1JUKQ0KCQkJCQkJCQkvKiBZZXMsICJkb3VibGUiIGFzIHR5cGUgYWxzbyBpbiB0aGUgZmxvYXQNCgkJCQkJCQkJY2FzZS4gVGhpcyBzaW5jZSAiZmxvYXQiIGlzIHByb21vdGVkIGludG8gImRvdWJsZSINCgkJCQkJCQkJYnkgdGhlIHZhX2FyZyBzdHVmZi4gKi8NCgkJCQljYXNlICdmJzogICAgaSA9IHdyaXRlRmxvYXQoYnVmZmVyLA0KCQkJCQkJCQkJCQkJaSwNCgkJCQkJCQkJCQkJCShmbG9hdCl2YV9hcmcodmwsIGRvdWJsZSkpOw0KCQkJCQkJCQlicmVhazsNCiNlbHNlDQoJLyogTm8gc3VwcG9ydCBmb3IgZmxvYXRzLCBidXQgYXR0ZW1wdCB0byBzdG9yZSBhIGZsb2F0IHVzZXIgZXZlbnQNCglhdm9pZCBhIHBvc3NpYmxlIGNyYXNoIGR1ZSB0byBmbG9hdCByZWZlcmVuY2UuIEluc3RlYWQgc3RvcmUgdGhlDQoJZGF0YSBvbiB1aW50XzMyIGZvcm1hdCAod2lsbCBub3QgYmUgZGlzcGxheWVkIGFueXdheSkuIFRoaXMgaXMganVzdA0KCXRvIGtlZXAgdmFfYXJnIGFuZCBpIGNvbnNpc3RlbnQuICovDQoNCgkJCQljYXNlICdmJzogICAgaSA9IHdyaXRlSW50MzIoYnVmZmVyLA0KCQkJCQkJCQkJCQkJaSwNCgkJCQkJCQkJCQkJCSh1aW50MzJfdCl2YV9hcmcodmwsIGRvdWJsZSkpOw0KCQkJCQkJCQlicmVhazsNCiNlbmRpZg0KCQkJCWNhc2UgJ2wnOg0KCQkJCQlmb3JtYXRTdHJJbmRleCsrOw0KCQkJCQlzd2l0Y2ggKGZvcm1hdFN0cltmb3JtYXRTdHJJbmRleF0pDQoJCQkJCXsNCiNpZiAoSU5DTFVERV9GTE9BVF9TVVBQT1JUKQ0KCQkJCQljYXNlICdmJzogICAgIGkgPSB3cml0ZURvdWJsZShidWZmZXIsDQoJCQkJCQkJCQkJCQkJCWksDQoJCQkJCQkJCQkJCQkJCShkb3VibGUpdmFfYXJnKHZsLCBkb3VibGUpKTsNCgkJCQkJCQkJYnJlYWs7DQojZWxzZQ0KCS8qIE5vIHN1cHBvcnQgZm9yIGZsb2F0cywgYnV0IGF0dGVtcHQgdG8gc3RvcmUgYSBmbG9hdCB1c2VyIGV2ZW50DQoJYXZvaWQgYSBwb3NzaWJsZSBjcmFzaCBkdWUgdG8gZmxvYXQgcmVmZXJlbmNlLiBJbnN0ZWFkIHN0b3JlIHRoZQ0KCWRhdGEgb24gdWludF8zMiBmb3JtYXQgKHdpbGwgbm90IGJlIGRpc3BsYXllZCBhbnl3YXkpLiBUaGlzIGlzIGp1c3QNCgl0byBrZWVwIHZhX2FyZyBhbmQgaSBjb25zaXN0ZW50LiAqLw0KCQkJCQljYXNlICdmJzogICAgaSA9IHdyaXRlSW50MzIoYnVmZmVyLCAvKiBJbiB0aGlzIGNhc2UsIHRoZSB2YWx1ZSB3aWxsIG5vdCBiZSBzaG93biBhbnl3YXkgKi8NCgkJCQkJCQkJCQkJCQlpLA0KCQkJCQkJCQkJCQkJCSh1aW50MzJfdCl2YV9hcmcodmwsIGRvdWJsZSkpOw0KCQkJCQkJCQkJaSA9IHdyaXRlSW50MzIoYnVmZmVyLCAvKiBEbyBpdCB0d2ljZSwgdG8gd3JpdGUgaW4gdG90YWwgOCBieXRlcyAqLw0KCQkJCQkJCQkJCQkJCWksDQoJCQkJCQkJCQkJCQkJKHVpbnQzMl90KXZhX2FyZyh2bCwgZG91YmxlKSk7DQoJCQkJCQkJCWJyZWFrOw0KI2VuZGlmDQoNCgkJCQkJfQ0KCQkJCQlicmVhazsNCgkJCQljYXNlICdoJzoNCgkJCQkJZm9ybWF0U3RySW5kZXgrKzsNCgkJCQkJc3dpdGNoIChmb3JtYXRTdHJbZm9ybWF0U3RySW5kZXhdKQ0KCQkJCQl7DQoJCQkJCWNhc2UgJ2QnOiAgICBpID0gd3JpdGVJbnQxNihidWZmZXIsDQoJCQkJCQkJCQkJCQkJaSwNCgkJCQkJCQkJCQkJCQkodWludDE2X3QpdmFfYXJnKHZsLCB1aW50MzJfdCkpOw0KCQkJCQkJCQkJYnJlYWs7DQoJCQkJCWNhc2UgJ3UnOiAgICBpID0gd3JpdGVJbnQxNihidWZmZXIsDQoJCQkJCQkJCQkJCQkJaSwNCgkJCQkJCQkJCQkJCQkodWludDE2X3QpdmFfYXJnKHZsLCB1aW50MzJfdCkpOw0KCQkJCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAnYic6DQoJCQkJCWZvcm1hdFN0ckluZGV4Kys7DQoJCQkJCXN3aXRjaCAoZm9ybWF0U3RyW2Zvcm1hdFN0ckluZGV4XSkNCgkJCQkJew0KCQkJCQljYXNlICdkJzogICAgaSA9IHdyaXRlSW50OChidWZmZXIsDQoJCQkJCQkJCQkJCQkJaSwNCgkJCQkJCQkJCQkJCQkodWludDhfdCl2YV9hcmcodmwsIHVpbnQzMl90KSk7DQoJCQkJCQkJCQlicmVhazsNCgkJCQkJY2FzZSAndSc6ICAgIGkgPSB3cml0ZUludDgoYnVmZmVyLA0KCQkJCQkJCQkJCQkJCWksDQoJCQkJCQkJCQkJCQkJKHVpbnQ4X3QpdmFfYXJnKHZsLCB1aW50MzJfdCkpOw0KCQkJCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQkJYnJlYWs7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZQ0KCQkJCWJyZWFrOw0KICAgICAgICB9DQogICAgICAgIGZvcm1hdFN0ckluZGV4Kys7DQogICAgICAgIGlmIChpID09IDI1NSkNCiAgICAgICAgew0KICAgICAgICAgICAgdlRyYWNlRXJyb3IoInZUcmFjZVByaW50RiAtIFRvbyBsYXJnZSBhcmd1bWVudHMsIG1heCAzMiBieXRlIGFsbG93ZWQhIik7DQogICAgICAgICAgICByZXR1cm4gMDsNCiAgICAgICAgfQ0KICAgIH0NCglyZXR1cm4gKGkrMykvNDsNCn0NCg0KI2lmIChVU0VfU0VQQVJBVEVfVVNFUl9FVkVOVF9CVUZGRVIgPT0gMSkNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHBydlRyYWNlQ2xlYXJDaGFubmVsQnVmZmVyDQogKg0KICogQ2xlYXJzIGEgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBjaGFubmVsIGJ1ZmZlciwgc3RhcnRpbmcgZnJvbSBuZXh0U2xvdFRvV3JpdGUuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kc3RhdGljIHZvaWQgcHJ2VHJhY2VDbGVhckNoYW5uZWxCdWZmZXIodWludDMyX3QgY291bnQpDQp7DQoJdWludDMyX3Qgc2xvdHM7DQoNCglUUkFDRV9BU1NFUlQoVVNFUl9FVkVOVF9CVUZGRVJfU0laRSA+PSBjb3VudCwgInBydlRyYWNlQ2xlYXJDaGFubmVsQnVmZmVyOiBVU0VSX0VWRU5UX0JVRkZFUl9TSVpFIGlzIHRvbyBzbWFsbCB0byBoYW5kbGUgdGhpcyBldmVudC4iLCApOw0KDQoJLyogQ2hlY2sgaWYgd2UncmUgY2xvc2UgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyICovDQoJaWYgKFJlY29yZGVyRGF0YVB0ci0+dXNlckV2ZW50QnVmZmVyLm5leHRTbG90VG9Xcml0ZSArIGNvdW50ID4gVVNFUl9FVkVOVF9CVUZGRVJfU0laRSkNCgl7DQoJCXNsb3RzID0gVVNFUl9FVkVOVF9CVUZGRVJfU0laRSAtIFJlY29yZGVyRGF0YVB0ci0+dXNlckV2ZW50QnVmZmVyLm5leHRTbG90VG9Xcml0ZTsgLyogTnVtYmVyIG9mIHNsb3RzIGJlZm9yZSBlbmQgb2YgYnVmZmVyICovDQoJCSh2b2lkKW1lbXNldCgmUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIuY2hhbm5lbEJ1ZmZlcltSZWNvcmRlckRhdGFQdHItPnVzZXJFdmVudEJ1ZmZlci5uZXh0U2xvdFRvV3JpdGVdLCAwLCBzbG90cyk7DQoJCSh2b2lkKW1lbXNldCgmUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIuY2hhbm5lbEJ1ZmZlclswXSwgMCwgKGNvdW50IC0gc2xvdHMpKTsNCgl9DQoJZWxzZQ0KCQkodm9pZCltZW1zZXQoJlJlY29yZGVyRGF0YVB0ci0+dXNlckV2ZW50QnVmZmVyLmNoYW5uZWxCdWZmZXJbUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIubmV4dFNsb3RUb1dyaXRlXSwgMCwgY291bnQpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogcHJ2VHJhY2VDb3B5VG9EYXRhQnVmZmVyDQogKg0KICogQ29waWVzIGEgbnVtYmVyIG9mIGl0ZW1zIHRvIHRoZSBkYXRhIGJ1ZmZlciwgc3RhcnRpbmcgZnJvbSBuZXh0U2xvdFRvV3JpdGUuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kc3RhdGljIHZvaWQgcHJ2VHJhY2VDb3B5VG9EYXRhQnVmZmVyKHVpbnQzMl90KiBkYXRhLCB1aW50MzJfdCBjb3VudCkNCnsNCglUUkFDRV9BU1NFUlQoZGF0YSAhPSBOVUxMLCAicHJ2VHJhY2VDb3B5VG9EYXRhQnVmZmVyOiBkYXRhID09IE5VTEwuIiwgKTsNCglUUkFDRV9BU1NFUlQoY291bnQgPD0gVVNFUl9FVkVOVF9CVUZGRVJfU0laRSwgInBydlRyYWNlQ29weVRvRGF0YUJ1ZmZlcjogVVNFUl9FVkVOVF9CVUZGRVJfU0laRSBpcyB0b28gc21hbGwgdG8gaGFuZGxlIHRoaXMgZXZlbnQuIiwgKTsNCg0KCXVpbnQzMl90IHNsb3RzOw0KCS8qIENoZWNrIGlmIHdlJ3JlIGNsb3NlIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqLw0KCWlmIChSZWNvcmRlckRhdGFQdHItPnVzZXJFdmVudEJ1ZmZlci5uZXh0U2xvdFRvV3JpdGUgKyBjb3VudCA+IFVTRVJfRVZFTlRfQlVGRkVSX1NJWkUpDQoJew0KCQlzbG90cyA9IFVTRVJfRVZFTlRfQlVGRkVSX1NJWkUgLSBSZWNvcmRlckRhdGFQdHItPnVzZXJFdmVudEJ1ZmZlci5uZXh0U2xvdFRvV3JpdGU7IC8qIE51bWJlciBvZiBzbG90cyBiZWZvcmUgZW5kIG9mIGJ1ZmZlciAqLw0KCQkodm9pZCltZW1jcHkoJlJlY29yZGVyRGF0YVB0ci0+dXNlckV2ZW50QnVmZmVyLmRhdGFCdWZmZXJbUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIubmV4dFNsb3RUb1dyaXRlICogNF0sIGRhdGEsIHNsb3RzICogNCk7DQoJCSh2b2lkKW1lbWNweSgmUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIuZGF0YUJ1ZmZlclswXSwgZGF0YSArIHNsb3RzLCAoY291bnQgLSBzbG90cykgKiA0KTsNCgl9DQoJZWxzZQ0KCXsNCgkJKHZvaWQpbWVtY3B5KCZSZWNvcmRlckRhdGFQdHItPnVzZXJFdmVudEJ1ZmZlci5kYXRhQnVmZmVyW1JlY29yZGVyRGF0YVB0ci0+dXNlckV2ZW50QnVmZmVyLm5leHRTbG90VG9Xcml0ZSAqIDRdLCBkYXRhLCBjb3VudCAqIDQpOw0KCX0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHBydlRyYWNlVXNlckV2ZW50SGVscGVyMQ0KICoNCiAqIENhbGxzIG9uIHBydlRyYWNlVXNlckV2ZW50Rm9ybWF0KCkgdG8gZG8gdGhlIGFjdHVhbCBmb3JtYXR0aW5nLCB0aGVuIGdvZXMgb24gdG8gdGhlIG5leHQgaGVscGVyIGZ1bmN0aW9uLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnN0YXRpYyB2b2lkIHBydlRyYWNlVXNlckV2ZW50SGVscGVyMShVc2VyRXZlbnRDaGFubmVsIGNoYW5uZWwsIHRyYWNlTGFiZWwgZXZlbnRMYWJlbCwgdHJhY2VMYWJlbCBmb3JtYXRMYWJlbCwgdmFfbGlzdCB2bCkNCnsNCgl1aW50MzJfdCBkYXRhWygzICsgTUFYX0FSR19TSVpFKSAvIDRdOw0KCXVpbnQ4X3QgYnl0ZU9mZnNldCA9IDQ7IC8qIE5lZWQgcm9vbSBmb3IgdGltZXN0YW1wICovDQoJdWludDhfdCBub09mU2xvdHM7DQoNCglpZiAoY2hhbm5lbCA9PSAwKQ0KCXsNCgkJLyogV2UgYXJlIGRlYWxpbmcgd2l0aCBhbiB1bmtub3duIGNoYW5uZWwgZm9ybWF0IHBhaXIgKi8NCgkJYnl0ZU9mZnNldCArPSA0OyAvKiBBbHNvIG5lZWQgcm9vbSBmb3IgY2hhbm5lbCBhbmQgZm9ybWF0ICovDQoJCSgodWludDE2X3QqKWRhdGEpWzJdID0gZXZlbnRMYWJlbDsNCgkJKCh1aW50MTZfdCopZGF0YSlbM10gPSBmb3JtYXRMYWJlbDsNCgl9DQoNCglub09mU2xvdHMgPSBwcnZUcmFjZVVzZXJFdmVudEZvcm1hdCgoY2hhciopJihSZWNvcmRlckRhdGFQdHItPlN5bWJvbFRhYmxlLnN5bWJ5dGVzW2Zvcm1hdExhYmVsKzRdKSwgdmwsICh1aW50OF90KilkYXRhLCBieXRlT2Zmc2V0KTsNCg0KCXBydlRyYWNlVXNlckV2ZW50SGVscGVyMihjaGFubmVsLCBkYXRhLCBub09mU2xvdHMpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogcHJ2VHJhY2VVc2VyRXZlbnRIZWxwZXIyDQogKg0KICogVGhpcyBmdW5jdGlvbiBzaW1wbHkgY29waWVzIHRoZSBkYXRhIGJ1ZmZlciB0byB0aGUgYWN0dWFsIHVzZXIgZXZlbnQgYnVmZmVyLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnN0YXRpYyB2b2lkIHBydlRyYWNlVXNlckV2ZW50SGVscGVyMihVc2VyRXZlbnRDaGFubmVsIGNoYW5uZWwsIHVpbnQzMl90KiBkYXRhLCB1aW50MzJfdCBub09mU2xvdHMpDQp7DQoJc3RhdGljIHVpbnQzMl90IG9sZF90aW1lc3RhbXAgPSAwOw0KCXVpbnQzMl90IG9sZF9uZXh0U2xvdFRvV3JpdGUgPSAwOw0KDQoJVFJBQ0VfQVNTRVJUKFVTRVJfRVZFTlRfQlVGRkVSX1NJWkUgPj0gbm9PZlNsb3RzLCAidlRyYWNlUHJpbnRGOiBVU0VSX0VWRU5UX0JVRkZFUl9TSVpFIGlzIHRvbyBzbWFsbCB0byBoYW5kbGUgdGhpcyBldmVudC4iLCApOw0KDQoJdHJjQ1JJVElDQUxfU0VDVElPTl9CRUdJTigpOw0KCS8qIFN0b3JlIHRoZSB0aW1lc3RhbXAgKi8NCgl2VHJhY2VQb3J0R2V0VGltZVN0YW1wKGRhdGEpOw0KDQoJaWYgKCpkYXRhIDwgb2xkX3RpbWVzdGFtcCkNCgkJUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIud3JhcGFyb3VuZENvdW50ZXIrKzsNCglvbGRfdGltZXN0YW1wID0gKmRhdGE7DQoNCgkvKiBTdGFydCBieSBlcmFzaW5nIGFueSBpbmZvcm1hdGlvbiBpbiB0aGUgY2hhbm5lbCBidWZmZXIgKi8NCglwcnZUcmFjZUNsZWFyQ2hhbm5lbEJ1ZmZlcihub09mU2xvdHMpOw0KDQoJcHJ2VHJhY2VDb3B5VG9EYXRhQnVmZmVyKGRhdGEsIG5vT2ZTbG90cyk7IC8qIFdpbGwgd3JhcCBhcm91bmQgdGhlIGRhdGEgaWYgbmVjZXNzYXJ5ICovDQoNCglvbGRfbmV4dFNsb3RUb1dyaXRlID0gUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIubmV4dFNsb3RUb1dyaXRlOyAvKiBTYXZlIHRoZSBpbmRleCB0aGF0IHdlIHdhbnQgdG8gd3JpdGUgdGhlIGNoYW5uZWwgZGF0YSBhdCB3aGVuIHdlJ3JlIGRvbmUgKi8NCglSZWNvcmRlckRhdGFQdHItPnVzZXJFdmVudEJ1ZmZlci5uZXh0U2xvdFRvV3JpdGUgPSAoUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIubmV4dFNsb3RUb1dyaXRlICsgbm9PZlNsb3RzKSAlIFVTRVJfRVZFTlRfQlVGRkVSX1NJWkU7IC8qIE1ha2Ugc3VyZSB3ZSBuZXZlciBlbmQgdXAgb3V0c2lkZSB0aGUgYnVmZmVyICovDQoNCgkvKiBXcml0ZSB0byB0aGUgY2hhbm5lbCBidWZmZXIgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIHVzZXIgZXZlbnQgaXMgcmVhZHkgdG8gYmUgdXNlZCAqLw0KCWlmIChjaGFubmVsICE9IDApDQoJCVJlY29yZGVyRGF0YVB0ci0+dXNlckV2ZW50QnVmZmVyLmNoYW5uZWxCdWZmZXJbb2xkX25leHRTbG90VG9Xcml0ZV0gPSBjaGFubmVsOw0KCWVsc2UNCgkJUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIuY2hhbm5lbEJ1ZmZlcltvbGRfbmV4dFNsb3RUb1dyaXRlXSA9IChVc2VyRXZlbnRDaGFubmVsKTB4RkY7CS8qIDB4RkYgaW5kaWNhdGVzIHRoYXQgdGhpcyBpcyBub3QgYSBub3JtYWwgY2hhbm5lbCBpZCAqLw0KCXRyY0NSSVRJQ0FMX1NFQ1RJT05fRU5EKCk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB4VHJhY2VSZWdpc3RlckNoYW5uZWxGb3JtYXQNCiAqDQogKiBBdHRlbXB0cyB0byBjcmVhdGUgYSBwYWlyIG9mIHRoZSBjaGFubmVsIGFuZCBmb3JtYXQgc3RyaW5nLg0KICoNCiAqIE5vdGU6IFRoaXMgaXMgb25seSBhdmFpbGFibGUgaWYgVVNFX1NFUEFSQVRFX1VTRVJfRVZFTlRfQlVGRkVSIGlzIGVuYWJsZWQgaW4gDQogKiB0cmNDb25maWcuaA0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NClVzZXJFdmVudENoYW5uZWwgeFRyYWNlUmVnaXN0ZXJDaGFubmVsRm9ybWF0KHRyYWNlTGFiZWwgY2hhbm5lbCwgdHJhY2VMYWJlbCBmb3JtYXRTdHIpDQp7DQoJdWludDhfdCBpOw0KCVVzZXJFdmVudENoYW5uZWwgcmV0VmFsID0gMDsNCg0KCVRSQUNFX0FTU0VSVChmb3JtYXRTdHIgIT0gMCwgInZUcmFjZVJlZ2lzdGVyQ2hhbm5lbEZvcm1hdDogZm9ybWF0U3RyID09IDAiLCAoVXNlckV2ZW50Q2hhbm5lbCkwKTsNCg0KCXRyY0NSSVRJQ0FMX1NFQ1RJT05fQkVHSU4oKTsNCglmb3IgKGkgPSAxOyBpIDw9IENIQU5ORUxfRk9STUFUX1BBSVJTOyBpKyspIC8qIFNpemUgb2YgdGhlIGNoYW5uZWxzIGJ1ZmZlciBpcyBDSEFOTkVMX0ZPUk1BVF9QQUlSUyArIDEuIEluZGV4IDAgaXMgdW51c2VkLiAqLw0KCXsNCgkJaWYoUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIuY2hhbm5lbHNbaV0ubmFtZSA9PSAwICYmIFJlY29yZGVyRGF0YVB0ci0+dXNlckV2ZW50QnVmZmVyLmNoYW5uZWxzW2ldLmRlZmF1bHRGb3JtYXQgPT0gMCkNCgkJew0KCQkJLyogRm91bmQgZW1wdHkgc2xvdCAqLw0KCQkJUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIuY2hhbm5lbHNbaV0ubmFtZSA9IGNoYW5uZWw7DQoJCQlSZWNvcmRlckRhdGFQdHItPnVzZXJFdmVudEJ1ZmZlci5jaGFubmVsc1tpXS5kZWZhdWx0Rm9ybWF0ID0gZm9ybWF0U3RyOw0KCQkJcmV0VmFsID0gKFVzZXJFdmVudENoYW5uZWwpaTsNCgkJCWJyZWFrOw0KCQl9DQoNCgkJaWYgKFJlY29yZGVyRGF0YVB0ci0+dXNlckV2ZW50QnVmZmVyLmNoYW5uZWxzW2ldLm5hbWUgPT0gY2hhbm5lbCAmJiBSZWNvcmRlckRhdGFQdHItPnVzZXJFdmVudEJ1ZmZlci5jaGFubmVsc1tpXS5kZWZhdWx0Rm9ybWF0ID09IGZvcm1hdFN0cikNCgkJew0KCQkJLyogRm91bmQgYSBtYXRjaCAqLw0KCQkJcmV0VmFsID0gKFVzZXJFdmVudENoYW5uZWwpaTsNCgkJCWJyZWFrOw0KCQl9DQoJfQ0KCXRyY0NSSVRJQ0FMX1NFQ1RJT05fRU5EKCk7DQoJcmV0dXJuIHJldFZhbDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdlRyYWNlQ2hhbm5lbFByaW50Rg0KICoNCiAqIFNsaWdodGx5IGZhc3RlciB2ZXJzaW9uIG9mIHZUcmFjZVByaW50RigpIGR1ZSB0byBubyBsb29rdXBzLg0KICoNCiAqIE5vdGU6IFRoaXMgaXMgb25seSBhdmFpbGFibGUgaWYgVVNFX1NFUEFSQVRFX1VTRVJfRVZFTlRfQlVGRkVSIGlzIGVuYWJsZWQgaW4NCiAqIHRyY0NvbmZpZy5oDQogKg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlQ2hhbm5lbFByaW50RihVc2VyRXZlbnRDaGFubmVsIGNoYW5uZWxQYWlyLCAuLi4pDQp7DQoJdmFfbGlzdCB2bDsNCg0KCXZhX3N0YXJ0KHZsLCBjaGFubmVsUGFpcik7DQoJdlRyYWNlQ2hhbm5lbFByaW50Rl9IZWxwZXIoY2hhbm5lbFBhaXIsIHZsKTsNCgl2YV9lbmQodmwpOw0KfQ0KDQp2b2lkIHZUcmFjZUNoYW5uZWxQcmludEZfSGVscGVyKFVzZXJFdmVudENoYW5uZWwgY2hhbm5lbFBhaXIsIHZhX2xpc3QgdmwpDQp7DQoJdHJhY2VMYWJlbCBjaGFubmVsOw0KCXRyYWNlTGFiZWwgZm9ybWF0U3RyOw0KDQoJVFJBQ0VfQVNTRVJUKGNoYW5uZWxQYWlyICE9IDAsICJ2VHJhY2VDaGFubmVsUHJpbnRGOiBjaGFubmVsUGFpciA9PSAwIiwgKTsNCglUUkFDRV9BU1NFUlQoY2hhbm5lbFBhaXIgPD0gQ0hBTk5FTF9GT1JNQVRfUEFJUlMsICJ2VHJhY2VDaGFubmVsUHJpbnRGOiAiLCApOw0KDQoJY2hhbm5lbCA9IFJlY29yZGVyRGF0YVB0ci0+dXNlckV2ZW50QnVmZmVyLmNoYW5uZWxzW2NoYW5uZWxQYWlyXS5uYW1lOw0KCWZvcm1hdFN0ciA9IFJlY29yZGVyRGF0YVB0ci0+dXNlckV2ZW50QnVmZmVyLmNoYW5uZWxzW2NoYW5uZWxQYWlyXS5kZWZhdWx0Rm9ybWF0Ow0KDQoJcHJ2VHJhY2VVc2VyRXZlbnRIZWxwZXIxKGNoYW5uZWxQYWlyLCBjaGFubmVsLCBmb3JtYXRTdHIsIHZsKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdlRyYWNlQ2hhbm5lbFVzZXJFdmVudA0KICoNCiAqIFNsaWdodGx5IGZhc3RlciB2ZXJzaW9uIG9mIHZUcmFjZVVzZXJFdmVudCgpIGR1ZSB0byBubyBsb29rdXBzLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlQ2hhbm5lbFVzZXJFdmVudChVc2VyRXZlbnRDaGFubmVsIGNoYW5uZWxQYWlyKQ0Kew0KCXVpbnQzMl90IGRhdGFbKDMgKyBNQVhfQVJHX1NJWkUpIC8gNF07DQoNCglUUkFDRV9BU1NFUlQoY2hhbm5lbFBhaXIgIT0gMCwgInZUcmFjZUNoYW5uZWxQcmludEY6IGNoYW5uZWxQYWlyID09IDAiLCApOw0KCVRSQUNFX0FTU0VSVChjaGFubmVsUGFpciA8PSBDSEFOTkVMX0ZPUk1BVF9QQUlSUywgInZUcmFjZUNoYW5uZWxQcmludEY6ICIsICk7DQoNCglwcnZUcmFjZVVzZXJFdmVudEhlbHBlcjIoY2hhbm5lbFBhaXIsIGRhdGEsIDEpOyAvKiBPbmx5IG5lZWQgb25lIHNsb3QgZm9yIHRpbWVzdGFtcCAqLw0KfQ0KI2VuZGlmIC8qIFVTRV9TRVBBUkFURV9VU0VSX0VWRU5UX0JVRkZFUiA9PSAxICovDQoNCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VQcmludEYNCiAqDQogKiBBZHZhbmNlZCB1c2VyIGV2ZW50cyAoUHJvZmVzc2lvbmFsIEVkaXRpb24gb25seSkNCiAqDQogKiBHZW5lcmF0ZXMgVXNlciBFdmVudCB3aXRoIGZvcm1hdHRlZCB0ZXh0IGFuZCBkYXRhLCBzaW1pbGFyIHRvIGEgInByaW50ZiIuDQogKiBJdCBpcyB2ZXJ5IGZhc3QgY29tcGFyZWQgdG8gYSBub3JtYWwgInByaW50ZiIgc2luY2UgdGhpcyBmdW5jdGlvbiBvbmx5DQogKiBzdG9yZXMgdGhlIGFyZ3VtZW50cy4gVGhlIGFjdHVhbCBmb3JtYXR0aW5nIGlzIGRvbmUNCiAqIG9uIHRoZSBob3N0IFBDIHdoZW4gdGhlIHRyYWNlIGlzIGRpc3BsYXllZCBpbiB0aGUgdmlld2VyIHRvb2wuDQogKg0KICogVXNlciBFdmVudCBsYWJlbHMgYXJlIGNyZWF0ZWQgdXNpbmcgeFRyYWNlT3BlbkxhYmVsLg0KICogRXhhbXBsZToNCiAqDQogKiAgICAgdHJhY2VMYWJlbCBhZGNfdWVjaGFubmVsID0geFRyYWNlT3BlbkxhYmVsKCJBREMgVXNlciBFdmVudHMiKTsNCiAqICAgICAuLi4NCiAqICAgICB2VHJhY2VQcmludChhZGNfdWVjaGFubmVsLA0KICogICAgICAgICAgICAgICAgICJBREMgY2hhbm5lbCAlZDogJWxmIHZvbHRzIiwNCiAqICAgICAgICAgICAgICAgICBjaCwgKGRvdWJsZSlhZGNfcmVhZGluZy8oZG91YmxlKXNjYWxlKTsNCiAqDQogKiBUaGlzIGNhbiBiZSBjb21iaW5lZCBpbnRvIG9uZSBsaW5lLCBpZiBkZXNpcmVkLCBidXQgdGhpcyBpcyBzbG93ZXI6DQogKg0KICogICAgIHZUcmFjZVByaW50KHhUcmFjZU9wZW5MYWJlbCgiQURDIFVzZXIgRXZlbnRzIiksDQogKiAgICAgICAgICAgICAgICAgIkFEQyBjaGFubmVsICVkOiAlbGYgdm9sdHMiLA0KICogICAgICAgICAgICAgICAgIGNoLCAoZG91YmxlKWFkY19yZWFkaW5nLyhkb3VibGUpc2NhbGUpOw0KICoNCiAqIENhbGxpbmcgeFRyYWNlT3BlbkxhYmVsIG11bHRpcGxlIHRpbWVzIHdpbGwgbm90IGNyZWF0ZSBkdXBsaWNhdGUgZW50cmllcywgYnV0DQogKiBpdCBpcyBvZiBjb3Vyc2UgZmFzdGVyIHRvIGp1c3QgZG8gaXQgb25jZSwgYW5kIHRoZW4ga2VlcCB0aGUgaGFuZGxlIGZvciBsYXRlcg0KICogdXNlLiBJZiB5b3UgZG9utHQgaGF2ZSBhbnkgZGF0YSBhcmd1bWVudHMsIG9ubHkgYSB0ZXh0IGxhYmVsL3N0cmluZywgaXQgaXMNCiAqIGJldHRlciB0byB1c2UgdlRyYWNlVXNlckV2ZW50IC0gaXQgaXMgZmFzdGVyLg0KICoNCiAqIEZvcm1hdCBzcGVjaWZpZXJzIHN1cHBvcnRlZDoNCiAqICAlZCAtIDMyIGJpdCBzaWduZWQgaW50ZWdlcg0KICogICV1IC0gMzIgYml0IHVuc2lnbmVkIGludGVnZXINCiAqICAlZiAtIDMyIGJpdCBmbG9hdA0KICogICVzIC0gc3RyaW5nIChpcyBjb3BpZWQgdG8gdGhlIHJlY29yZGVyIHN5bWJvbCB0YWJsZSkNCiAqICAlaGQgLSAxNiBiaXQgc2lnbmVkIGludGVnZXINCiAqICAlaHUgLSAxNiBiaXQgdW5zaWduZWQgaW50ZWdlcg0KICogICViZCAtIDggYml0IHNpZ25lZCBpbnRlZ2VyDQogKiAgJWJ1IC0gOCBiaXQgdW5zaWduZWQgaW50ZWdlcg0KICogICVsZiAtIGRvdWJsZS1wcmVjaXNpb24gZmxvYXQNCiAqDQogKiBVcCB0byAxNSBkYXRhIGFyZ3VtZW50cyBhcmUgYWxsb3dlZCwgd2l0aCBhIHRvdGFsIHNpemUgb2YgbWF4aW11bSAzMiBieXRlLg0KICogSW4gY2FzZSB0aGlzIGlzIGV4Y2VlZGVkLCB0aGUgdXNlciBldmVudCBpcyBjaGFuZ2VkIGludG8gYW4gZXJyb3IgbWVzc2FnZS4NCiAqDQogKiBUaGUgZGF0YSBpcyBzdG9yZWQgaW4gdHJhY2UgYnVmZmVyLCBhbmQgaXMgcGFja2VkIHRvIGFsbG93IHN0b3JpbmcgbXVsdGlwbGUNCiAqIHNtYWxsZXIgZGF0YSBlbnRyaWVzIGluIHRoZSBzYW1lIDQtYnl0ZSByZWNvcmQsIGUuZy4sIGZvdXIgOC1iaXQgdmFsdWVzLg0KICogQSBzdHJpbmcgcmVxdWlyZXMgdHdvIGJ5dGVzLCBhcyB0aGUgc3ltYm9sIHRhYmxlIGlzIGxpbWl0ZWQgdG8gNjRLLiBTdG9yaW5nIGENCiAqIGRvdWJsZSAoJWxmKSB1c2VzIHR3byByZWNvcmRzLCBzbyB0aGlzIGlzIHF1aXRlIGNvc3RseS4gVXNlIGZsb2F0ICglZikgdW5sZXNzDQogKiB0aGUgaGlnaGVyIHByZWNpc2lvbiBpcyByZWFsbHkgbmVjZXNzYXJ5Lg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0Kdm9pZCB2VHJhY2VQcmludEYodHJhY2VMYWJlbCBldmVudExhYmVsLCBjb25zdCBjaGFyKiBmb3JtYXRTdHIsIC4uLikNCnsNCgl2YV9saXN0IHZsOw0KDQoJdmFfc3RhcnQodmwsIGZvcm1hdFN0cik7DQoJdlRyYWNlUHJpbnRGX0hlbHBlcihldmVudExhYmVsLCBmb3JtYXRTdHIsIHZsKTsNCgl2YV9lbmQodmwpOw0KfQ0KDQp2b2lkIHZUcmFjZVByaW50Rl9IZWxwZXIodHJhY2VMYWJlbCBldmVudExhYmVsLCBjb25zdCBjaGFyKiBmb3JtYXRTdHIsIHZhX2xpc3QgdmwpDQp7DQojaWYgKFVTRV9TRVBBUkFURV9VU0VSX0VWRU5UX0JVRkZFUiA9PSAwKQ0KCXVpbnQzMl90IG5vT2ZTbG90czsNCiAgICBVc2VyRXZlbnQqIHVlMTsNCiAgICB1aW50MzJfdCB0ZW1wRGF0YUJ1ZmZlclsoMyArIE1BWF9BUkdfU0laRSkgLyA0XTsNCg0KICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgICogVGhlIGFycmF5IHRlbXBEYXRhQnVmZmVyIGlzIGEgbG9jYWwgYnVmZmVyIHVzZWQgaW4gYSB0d28tcGhhc2UgY29tbWl0IG9mDQogICAgKiB0aGUgZXZlbnQgZGF0YSwgc2luY2UgYSB2VHJhY2VQcmludEYgbWF5IHNwYW4gb3ZlciBtdWx0aXBsZSBzbG90cyBpbiB0aGUNCiAgICAqIGJ1ZmZlci4NCiAgICAqIFRoaXMgYnVmZmVyIGNhbiBiZSBtYWRlIGxhcmdlciwgb2YgY291cnNlLCBidXQgcmVtZW1iZXIgdGhlIHJpc2sgZm9yDQogICAgKiBzdGFjayBvdmVyZmxvdy4gTm90ZTogVGhpcyBzaG91bGQgYmUgYSBMT0NBTCBidWZmZXIsIG11c3Qgbm90IGJlIG1hZGUNCiAgICAqIGdsb2JhbC4gVGhhdCB3b3VsZCBjYXVzZSBkYXRhIGNvcnJ1cHRpb24gd2hlbiB0d28gY2FsbHMgdG8gdlRyYWNlUHJpbnRGDQogICAgKiBmcm9tIGRpZmZlcmVudCB0YXNrcyBvdmVybGFwcyAoaW50ZXJydXB0cyBhcmUgb25seSBkaXNhYmxlZCBpbiBhIHNtYWxsDQogICAgKiBwYXJ0IG9mIHRoaXMgZnVuY3Rpb24sIG90aGVyd2lzZSBlbmFibGVkKQ0KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KCVRSQUNFX0FTU0VSVChmb3JtYXRTdHIgIT0gTlVMTCwgInZUcmFjZVByaW50RjogZm9ybWF0U3RyID09IE5VTEwiLCApOw0KDQogICAgaWYgKFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmUgJiYgKCEgaW5FeGNsdWRlZFRhc2sgfHwgbklTUmFjdGl2ZSkgJiYgaGFuZGxlX29mX2xhc3RfbG9nZ2VkX3Rhc2spDQogICAgew0KICAgICAgICAvKiBGaXJzdCwgd3JpdGUgdGhlICJwcmltYXJ5IiB1c2VyIGV2ZW50IGVudHJ5IGluIHRoZSBsb2NhbCBidWZmZXIsIGJ1dA0KICAgICAgICBsZXQgdGhlIGV2ZW50IHR5cGUgYmUgIkVWRU5UX0JFSU5HX1dSSVRURU4iIGZvciBub3cuLi4qLw0KDQogICAgICAgIHVlMSA9IChVc2VyRXZlbnQqKSgmdGVtcERhdGFCdWZmZXJbMF0pOw0KICAgICAgICB1ZTEtPnR5cGUgPSBFVkVOVF9CRUlOR19XUklUVEVOOyAgICAgIC8qIFVwZGF0ZSB0aGlzIGFzIHRoZSBsYXN0IHN0ZXAgKi8NCg0KICAgICAgICBub09mU2xvdHMgPSBwcnZUcmFjZVVzZXJFdmVudEZvcm1hdChmb3JtYXRTdHIsIHZsLCAodWludDhfdCopdGVtcERhdGFCdWZmZXIsIDQpOw0KDQogICAgICAgIC8qIFN0b3JlIHRoZSBmb3JtYXQgc3RyaW5nLCB3aXRoIGEgcmVmZXJlbmNlIHRvIHRoZSBjaGFubmVsIHN5bWJvbCAqLw0KICAgICAgICB1ZTEtPnBheWxvYWQgPSBwcnZUcmFjZU9wZW5TeW1ib2woZm9ybWF0U3RyLCBldmVudExhYmVsKTsNCg0KICAgICAgICB0cmNDUklUSUNBTF9TRUNUSU9OX0JFR0lOKCk7DQoNCiAgICAgICAgdWUxLT5kdHMgPSAodWludDhfdClwcnZUcmFjZUdldERUUygweEZGKTsNCiAgICAgICAgaWYgKCEgUmVjb3JkZXJEYXRhUHRyLT5yZWNvcmRlckFjdGl2ZSkNCiAgICAgICAgew0KDQogICAgICAgICAgICAvKiBBYm9ydCwgc2luY2UgYW4gWFRTIGV2ZW50IChjcmVhdGVkIGJ5IHBydlRyYWNlR2V0RFRTKSBmaWxsZWQgdGhlDQogICAgICAgICAgICBidWZmZXIsIGFuZCB0aGUgcmVjb3JkZXIgc3RvcHBlZCBzaW5jZSBub3QgY2lyY3VsYXIgYnVmZmVyLiAqLw0KICAgICAgICAgICAgdHJjQ1JJVElDQUxfU0VDVElPTl9FTkQoKTsNCg0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgLyogSWYgdGhlIGRhdGEgZG9lcyBub3QgZml0IGluIHRoZSByZW1haW5pbmcgbWFpbiBidWZmZXIsIHdyYXAgYXJvdW5kIHRvDQogICAgICAgIDAgaWYgYWxsb3dlZCwgb3RoZXJ3aXNlIHN0b3AgdGhlIHJlY29yZGVyIGFuZCBxdWl0KS4gKi8NCiAgICAgICAgaWYgKFJlY29yZGVyRGF0YVB0ci0+bmV4dEZyZWVJbmRleCArIG5vT2ZTbG90cyA+IFJlY29yZGVyRGF0YVB0ci0+bWF4RXZlbnRzKQ0KICAgICAgICB7DQojaWYgKFRSQUNFX1JFQ09SREVSX1NUT1JFX01PREUgPT0gVFJBQ0VfU1RPUkVfTU9ERV9SSU5HX0JVRkZFUikNCiAgICAgICAgICAgICh2b2lkKW1lbXNldCgmIFJlY29yZGVyRGF0YVB0ci0+ZXZlbnREYXRhW1JlY29yZGVyRGF0YVB0ci0+bmV4dEZyZWVJbmRleCAqIDRdLA0KICAgICAgICAgICAgICAgICAgIDAsDQogICAgICAgICAgICAgICAgICAgKFJlY29yZGVyRGF0YVB0ci0+bWF4RXZlbnRzIC0gUmVjb3JkZXJEYXRhUHRyLT5uZXh0RnJlZUluZGV4KSo0KTsNCiAgICAgICAgICAgIFJlY29yZGVyRGF0YVB0ci0+bmV4dEZyZWVJbmRleCA9IDA7DQogICAgICAgICAgICBSZWNvcmRlckRhdGFQdHItPmJ1ZmZlcklzRnVsbCA9IDE7DQojZWxzZQ0KICAgICAgICAgICAgLyogQWJvcnQgYW5kIHN0b3AgcmVjb3JkZXIsIHNpbmNlIHRoZSBldmVudCBkYXRhIHdpbGwgbm90IGZpdCBpbiB0aGUNCiAgICAgICAgICAgIGJ1ZmZlciBhbmQgbm90IGNpcmN1bGFyIGJ1ZmZlciBpbiB0aGlzIGNhc2UuLi4gKi8NCiAgICAgICAgICAgIHRyY0NSSVRJQ0FMX1NFQ1RJT05fRU5EKCk7DQogICAgICAgICAgICB2VHJhY2VTdG9wKCk7DQoNCg0KICAgICAgICAgICAgcmV0dXJuOw0KI2VuZGlmDQogICAgICAgIH0NCg0KI2lmIChUUkFDRV9SRUNPUkRFUl9TVE9SRV9NT0RFID09IFRSQUNFX1NUT1JFX01PREVfUklOR19CVUZGRVIpDQogICAgICAgIC8qIENoZWNrIHRoYXQgdGhlIGJ1ZmZlciB0byBiZSBvdmVyd3JpdHRlbiBkb2VzIG5vdCBjb250YWluIGFueSB1c2VyDQogICAgICAgIGV2ZW50cyB0aGF0IHdvdWxkIGJlIHBhcnRpYWxseSBvdmVyd3JpdHRlbi4gSWYgc28sIHRoZXkgbXVzdCBiZSAia2lsbGVkIg0KICAgICAgICBieSByZXBsYWNpbmcgdGhlIHVzZXIgZXZlbnQgYW5kIGZvbGxvd2luZyBkYXRhIHdpdGggTlVMTCBldmVudHMgKGkuZS4sDQogICAgICAgIHVzaW5nIGEgbWVtc2V0IHRvIHplcm8pLiovDQogICAgICAgIHBydkNoZWNrRGF0YVRvQmVPdmVyd3JpdHRlbkZvck11bHRpRW50cnlFdmVudHMoKHVpbnQ4X3Qpbm9PZlNsb3RzKTsNCiNlbmRpZg0KICAgICAgICAvKiBDb3B5IHRoZSBsb2NhbCBidWZmZXIgdG8gdGhlIG1haW4gYnVmZmVyICovDQogICAgICAgICh2b2lkKW1lbWNweSgmIFJlY29yZGVyRGF0YVB0ci0+ZXZlbnREYXRhW1JlY29yZGVyRGF0YVB0ci0+bmV4dEZyZWVJbmRleCAqIDRdLA0KICAgICAgICAgICAgICAgdGVtcERhdGFCdWZmZXIsDQogICAgICAgICAgICAgICBub09mU2xvdHMgKiA0KTsNCg0KICAgICAgICAvKiBVcGRhdGUgdGhlIGV2ZW50IHR5cGUsIGkuZS4sIG51bWJlciBvZiBkYXRhIGVudHJpZXMgZm9sbG93aW5nIHRoZQ0KICAgICAgICBtYWluIFVTRVJfRVZFTlQgZW50cnkgKE5vdGU6IGltcG9ydGFudCB0aGF0IHRoaXMgaXMgYWZ0ZXIgdGhlIG1lbWNweSwNCiAgICAgICAgYnV0IHdpdGhpbiB0aGUgY3JpdGljYWwgc2VjdGlvbiEpKi8NCiAgICAgICAgUmVjb3JkZXJEYXRhUHRyLT5ldmVudERhdGFbUmVjb3JkZXJEYXRhUHRyLT5uZXh0RnJlZUluZGV4ICogNF0gPQ0KICAgICAgICAgICh1aW50OF90KSAoIFVTRVJfRVZFTlQgKyBub09mU2xvdHMgLSAxICk7DQoNCiAgICAgICAgLyogVXBkYXRlIHRoZSBtYWluIGJ1ZmZlciBldmVudCBpbmRleCAoYWxyZWFkeSBjaGVja2VkIHRoYXQgaXQgZml0cyBpbg0KICAgICAgICB0aGUgYnVmZmVyLCBzbyBubyBuZWVkIHRvIGNoZWNrIGZvciB3cmFwcGluZykqLw0KDQogICAgICAgIFJlY29yZGVyRGF0YVB0ci0+bmV4dEZyZWVJbmRleCArPSBub09mU2xvdHM7DQogICAgICAgIFJlY29yZGVyRGF0YVB0ci0+bnVtRXZlbnRzICs9IG5vT2ZTbG90czsNCg0KDQoNCgkJaWYgKFJlY29yZGVyRGF0YVB0ci0+bmV4dEZyZWVJbmRleCA+PSBFVkVOVF9CVUZGRVJfU0laRSkNCgkJew0KI2lmIChUUkFDRV9SRUNPUkRFUl9TVE9SRV9NT0RFID09IFRSQUNFX1NUT1JFX01PREVfUklOR19CVUZGRVIpDQoJCQkvKiBXZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCwgYnV0IHRoaXMgaXMgYSByaW5nIGJ1ZmZlci4gU3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nIGFnYWluLiAqLw0KCQkJUmVjb3JkZXJEYXRhUHRyLT5idWZmZXJJc0Z1bGwgPSAxOw0KCQkJUmVjb3JkZXJEYXRhUHRyLT5uZXh0RnJlZUluZGV4ID0gMDsNCiNlbHNlDQoJCQkvKiBXZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBzbyB3ZSBzdG9wLiAqLw0KCQkJdlRyYWNlU3RvcCgpOw0KI2VuZGlmDQoJCX0NCg0KI2lmIChUUkFDRV9SRUNPUkRFUl9TVE9SRV9NT0RFID09IFRSQUNFX1NUT1JFX01PREVfUklOR19CVUZGRVIpDQoJCS8qIE1ha2Ugc3VyZSB0aGUgbmV4dCBlbnRyeSBpcyBjbGVhcmVkIGNvcnJlY3RseSAqLw0KCQlwcnZDaGVja0RhdGFUb0JlT3ZlcndyaXR0ZW5Gb3JNdWx0aUVudHJ5RXZlbnRzKDEpOw0KI2VuZGlmDQoNCiNpZmRlZiBTVE9QX0FGVEVSX05fRVZFTlRTDQojaWYgKFNUT1BfQUZURVJfTl9FVkVOVFMgPiAtMSkNCgkJLyogQ2hlY2sgaWYgd2UgaGF2ZSByZWFjaGVkIHRoZSBkZXNpcmVkIG51bWJlciBvZiBldmVudHMgKi8NCgkJaWYgKFJlY29yZGVyRGF0YVB0ci0+bnVtRXZlbnRzID49IFNUT1BfQUZURVJfTl9FVkVOVFMpDQoJCXsNCgkJCXZUcmFjZVN0b3AoKTsNCgkJfQ0KI2VuZGlmDQojZW5kaWYNCg0KICAgICAgICB0cmNDUklUSUNBTF9TRUNUSU9OX0VORCgpOw0KICAgIH0NCg0KI2VsaWYgKFVTRV9TRVBBUkFURV9VU0VSX0VWRU5UX0JVRkZFUiA9PSAxKQ0KCS8qIFVzZSB0aGUgc2VwYXJhdGUgdXNlciBldmVudCBidWZmZXIgKi8NCgl0cmFjZUxhYmVsIGZvcm1hdExhYmVsOw0KCVVzZXJFdmVudENoYW5uZWwgY2hhbm5lbDsNCg0KCWlmIChSZWNvcmRlckRhdGFQdHItPnJlY29yZGVyQWN0aXZlICYmICghIGluRXhjbHVkZWRUYXNrIHx8IG5JU1JhY3RpdmUpICYmIGhhbmRsZV9vZl9sYXN0X2xvZ2dlZF90YXNrKQ0KICAgIHsNCgkgICAgZm9ybWF0TGFiZWwgPSB4VHJhY2VPcGVuTGFiZWwoZm9ybWF0U3RyKTsNCg0KCSAgICBjaGFubmVsID0geFRyYWNlUmVnaXN0ZXJDaGFubmVsRm9ybWF0KGV2ZW50TGFiZWwsIGZvcm1hdExhYmVsKTsNCg0KCQlwcnZUcmFjZVVzZXJFdmVudEhlbHBlcjEoY2hhbm5lbCwgZXZlbnRMYWJlbCwgZm9ybWF0TGFiZWwsIHZsKTsNCgl9DQojZW5kaWYNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdlRyYWNlVXNlckV2ZW50DQogKg0KICogQmFzaWMgdXNlciBldmVudCAoU3RhbmRhcmQgYW5kIFByb2Zlc3Npb25hbCBFZGl0aW9uIG9ubHkpDQogKg0KICogR2VuZXJhdGVzIGEgVXNlciBFdmVudCB3aXRoIGEgdGV4dCBsYWJlbC4gVGhlIGxhYmVsIGlzIGNyZWF0ZWQvbG9va2VkIHVwDQogKiBpbiB0aGUgc3ltYm9sIHRhYmxlIHVzaW5nIHhUcmFjZU9wZW5MYWJlbC4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZVVzZXJFdmVudCh0cmFjZUxhYmVsIGV2ZW50TGFiZWwpDQp7DQojaWYgKFVTRV9TRVBBUkFURV9VU0VSX0VWRU5UX0JVRkZFUiA9PSAwKQ0KICAgIFVzZXJFdmVudCogdWU7DQogICAgdWludDhfdCBkdHMxOw0KDQoJVFJBQ0VfQVNTRVJUKGV2ZW50TGFiZWwgPiAwLCAidlRyYWNlVXNlckV2ZW50OiBJbnZhbGlkIHZhbHVlIGZvciBldmVudExhYmVsIiwgKTsNCg0KICAgIGlmIChSZWNvcmRlckRhdGFQdHItPnJlY29yZGVyQWN0aXZlICYmICghIGluRXhjbHVkZWRUYXNrIHx8IG5JU1JhY3RpdmUpICYmIGhhbmRsZV9vZl9sYXN0X2xvZ2dlZF90YXNrKQ0KICAgIHsNCiAgICAgICAgdHJjQ1JJVElDQUxfU0VDVElPTl9CRUdJTigpOw0KDQogICAgICAgIGR0czEgPSAodWludDhfdClwcnZUcmFjZUdldERUUygweEZGKTsNCg0KICAgICAgICBpZiAoUmVjb3JkZXJEYXRhUHRyLT5yZWNvcmRlckFjdGl2ZSkgLyogTmVlZCB0byByZXBlYXQgdGhpcyBjaGVjayEgKi8NCiAgICAgICAgew0KICAgICAgICAgICAgdWUgPSAoVXNlckV2ZW50KikgeFRyYWNlTmV4dEZyZWVFdmVudEJ1ZmZlclNsb3QoKTsNCiAgICAgICAgICAgIGlmICh1ZSAhPSBOVUxMKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHVlLT5kdHMgPSBkdHMxOw0KICAgICAgICAgICAgICAgIHVlLT50eXBlID0gVVNFUl9FVkVOVDsNCiAgICAgICAgICAgICAgICB1ZS0+cGF5bG9hZCA9IGV2ZW50TGFiZWw7DQogICAgICAgICAgICAgICAgcHJ2VHJhY2VVcGRhdGVDb3VudGVycygpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHRyY0NSSVRJQ0FMX1NFQ1RJT05fRU5EKCk7DQogICAgfQ0KI2VsaWYgKFVTRV9TRVBBUkFURV9VU0VSX0VWRU5UX0JVRkZFUiA9PSAxKQ0KCVVzZXJFdmVudENoYW5uZWwgY2hhbm5lbDsNCgl1aW50MzJfdCBub09mU2xvdHMgPSAxOw0KCXVpbnQzMl90IHRlbXBEYXRhQnVmZmVyWygzICsgTUFYX0FSR19TSVpFKSAvIDRdOw0KDQoJaWYgKFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmUgJiYgKCEgaW5FeGNsdWRlZFRhc2sgfHwgbklTUmFjdGl2ZSkgJiYgaGFuZGxlX29mX2xhc3RfbG9nZ2VkX3Rhc2spDQoJew0KCQljaGFubmVsID0geFRyYWNlUmVnaXN0ZXJDaGFubmVsRm9ybWF0KDAsIGV2ZW50TGFiZWwpOw0KDQoJCWlmIChjaGFubmVsID09IDApDQoJCXsNCgkJCS8qIFdlIGFyZSBkZWFsaW5nIHdpdGggYW4gdW5rbm93biBjaGFubmVsIGZvcm1hdCBwYWlyICovDQoJCQlub09mU2xvdHMrKzsgLyogQWxzbyBuZWVkIHJvb20gZm9yIGNoYW5uZWwgYW5kIGZvcm1hdCAqLw0KCQkJKCh1aW50MTZfdCopdGVtcERhdGFCdWZmZXIpWzJdID0gMDsNCgkJCSgodWludDE2X3QqKXRlbXBEYXRhQnVmZmVyKVszXSA9IGV2ZW50TGFiZWw7DQoJCX0NCg0KCQlwcnZUcmFjZVVzZXJFdmVudEhlbHBlcjIoY2hhbm5lbCwgdGVtcERhdGFCdWZmZXIsIG5vT2ZTbG90cyk7DQoJfQ0KI2VuZGlmDQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB4VHJhY2VPcGVuTGFiZWwNCiAqDQogKiBDcmVhdGVzIHVzZXIgZXZlbnQgbGFiZWxzIGZvciB1c2VyIGV2ZW50IGNoYW5uZWxzIG9yIGZvciBpbmRpdmlkdWFsIGV2ZW50cy4NCiAqIFVzZXIgZXZlbnRzIGNhbiBiZSB1c2VkIHRvIGxvZyBhcHBsaWNhdGlvbiBldmVudHMgYW5kIGRhdGEgZm9yIGRpc3BsYXkgaW4NCiAqIHRoZSB2aXN1YWxpemF0aW9uIHRvb2wuIEEgdXNlciBldmVudCBpcyBpZGVudGlmaWVkIGJ5IGEgbGFiZWwsIGkuZS4sIGEgc3RyaW5nLA0KICogd2hpY2ggaXMgc3RvcmVkIGluIHRoZSByZWNvcmRlcidzIHN5bWJvbCB0YWJsZS4NCiAqIFdoZW4gbG9nZ2luZyBhIHVzZXIgZXZlbnQsIGEgbnVtZXJpYyBoYW5kbGUgKHJlZmVyZW5jZSkgdG8gdGhpcyBzdHJpbmcgaXMNCiAqIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGV2ZW50LiBUaGlzIGlzIG9idGFpbmVkIGJ5IGNhbGxpbmcNCiAqDQogKiAgICAgeFRyYWNlT3BlbkxhYmVsKCkNCiAqDQogKiB3aGljaCBhZGRzIHRoZSBzdHJpbmcgdG8gdGhlIHN5bWJvbCB0YWJsZSAoaWYgbm90IGFscmVhZHkgcHJlc2VudCkNCiAqIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGhhbmRsZS4NCiAqDQogKiBUaGlzIGNhbiBiZSB1c2VkIGluIHR3byB3YXlzOg0KICoNCiAqIDEuIFRoZSBoYW5kbGUgaXMgbG9va2VkIHVwIGV2ZXJ5IHRpbWUsIHdoZW4gc3RvcmluZyB0aGUgdXNlciBldmVudC4NCiAqDQogKiBFeGFtcGxlOg0KICogICAgIHZUcmFjZVVzZXJFdmVudCh4VHJhY2VPcGVuTGFiZWwoIk15VXNlckV2ZW50IikpOw0KICoNCiAqIDIuIFRoZSBsYWJlbCBpcyByZWdpc3RlcmVkIGp1c3Qgb25jZSwgd2l0aCB0aGUgaGFuZGxlIHN0b3JlZCBpbiBhbg0KICogIGFwcGxpY2F0aW9uIHZhcmlhYmxlIC0gbXVjaCBsaWtlIHVzaW5nIGEgZmlsZSBoYW5kbGUuDQogKg0KICogRXhhbXBsZToNCiAqICAgICBteUV2ZW50SGFuZGxlID0geFRyYWNlT3BlbkxhYmVsKCJNeVVzZXJFdmVudCIpOw0KICogICAgIC4uLg0KICogICAgIHZUcmFjZVVzZXJFdmVudChteUV2ZW50SGFuZGxlKTsNCiAqDQogKiBUaGUgc2Vjb25kIG9wdGlvbiBpcyBmYXN0ZXIgc2luY2Ugbm8gbG9va3VwIGlzIHJlcXVpcmVkIG9uIGVhY2ggZXZlbnQsIGFuZA0KICogdGhlcmVmb3JlIHJlY29tbWVuZGVkIGZvciB1c2VyIGV2ZW50cyB0aGF0IGFyZSBmcmVxdWVudGx5DQogKiBleGVjdXRlZCBhbmQvb3IgbG9jYXRlZCBpbiB0aW1lLWNyaXRpY2FsIGNvZGUuIFRoZSBsb29rdXAgb3BlcmF0aW9uIGlzDQogKiBob3dldmVyIGZhaXJseSBmYXN0IGR1ZSB0byB0aGUgZGVzaWduIG9mIHRoZSBzeW1ib2wgdGFibGUuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdHJhY2VMYWJlbCB4VHJhY2VPcGVuTGFiZWwoY29uc3QgY2hhciogbGFiZWwpDQp7DQoJVFJBQ0VfQVNTRVJUKGxhYmVsICE9IE5VTEwsICJ4VHJhY2VPcGVuTGFiZWw6IGxhYmVsID09IE5VTEwiLCAodHJhY2VMYWJlbCkwKTsNCg0KICAgIHJldHVybiBwcnZUcmFjZU9wZW5TeW1ib2wobGFiZWwsIDApOw0KfQ0KDQojZW5kaWYNCg0KI2VuZGlm