CVRoaXMgaXMgdGhlIGNvcmUgb2YgdGhlIFdpbmUgZGVidWdnZXIuICBUaGUgcmV2ZXJzZSBhc3NlbWJlcgp3YXMgc3RvbGVuIGZyb20gTWFjaCBtb3JlIG9yIGxlc3MgaW50YWN0LiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlcmUgYXJlCnR3byB2YXJpYWJsZXMgdGhhdCBhcmUgc2V0IGRpZmZlcmVudGx5IGlmIHlvdSBhcmUgcmV2ZXJzZSBhc3NlbWJsaW5nCjE2IGJpdCBjb2RlLCBhbmQgb24gdGhlIHdob2xlIGl0IHNlZW1zIHRvIHdvcmsuCgpORVdTOgoKCVRoZSBpbnRlcm5hbCBkZWJ1Z2dlciBoYXMgKnRvbnMqIG1vcmUgY2FwYWJpbGl0eSB0aGFuIGl0IGRpZCBiZWZvcmUuCkkgaGF2ZSBlbmNsb3NlZCBzb21lIGV4YW1wbGVzIHRoYXQgc2hvdyB1c2FnZSBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZS4KTmV3IGZlYXR1cmVzIGluY2x1ZGU6CgoJMSkgQWJpbGl0eSBvZiBkZWJ1Z2dlciB0byByZWFkIGRlYnVnIGluZm9ybWF0aW9uIGZyb20gd2luZSBleGVjdXRhYmxlCiphbmQqIGZyb20gV2luMzIgZXhlY3V0YWJsZXMuICBMb2NhbCB2YXJpYWJsZSBhbmQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gaXMKYWxzbyByZWFkIGFuZCBwcm9jZXNzZWQuCgoJMikgVGhlIGludGVybmFsIGRlYnVnZ2VyIGlzIGNhcGFibGUgb2YgJ3N0ZXBwaW5nJyB0byB0aGUgbmV4dApsaW5lIG51bWJlciwganVzdCBsaWtlIGdkYi4gIEV4YW1wbGVzIG9mIHRoZSBjb21tYW5kcyBhcmU6CgoJc3RlcAoJc3RlcGkKCXNpCglzdGVwIDMKCXNpIDUKCW5leHQKCW5leHRpCgljb250IDQKCWZpbmlzaAoKQWxsIG9mIHRoZXNlIHNob3VsZCBiZSBleGFjdGx5IGxpa2UgaG93IGdkYiBkb2VzIHRoaW5ncy4KCgkzKSBUaGUgaW50ZXJuYWwgZGVidWdnZXIgbm93IGhhcyBhIHNlbnNlIG9mIHdoYXQgc291cmNlIGZpbGUgYW5kIGxpbmUKbnVtYmVyIGEgZ2l2ZW4gUEMgaXMgYXQuICBOZXcgY29tbWFuZHMgdG8gc3VwcG9ydCB0aGlzIGFyZSBqdXN0IGxpa2UgZ2RiLAphbmQgaW5jbHVkZToKCglsaXN0CglkaXIKCXNob3cgZGlyCgp0aGVyZSBhcmUgYSB2YXJpZXR5IG9mIGZvcm1hdHMgb2YgYXJndW1lbnRzIGZvciB0aGUgbGlzdCBjb21tYW5kLiAgQWxsCnBlcm11dGF0aW9ucyBzdXBwb3J0ZWQgYnkgZ2RiIHNob3VsZCBhbHNvIGJlIHN1cHBvcnRlZC4KCgk0KSBUaGUgaW50ZXJuYWwgZGVidWdnZXIga25vd3MgYWJvdXQgZGF0YXR5cGVzIG9mIHZhcmlvdXMgb2JqZWN0cywKZm9yIGJvdGggV2luMzIgKmFuZCogdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbiB0aGUgd2luZSBleGVjdXRhYmxlIGl0c2VsZi4KSSBoYXZlIGVuY2xvc2VkIGFuIGV4YW1wbGUgb2YgaG93IHRoaXMgd29ya3MgYXQgdGhlIGVuZC4KCgk1KSBUaGVyZSBhcmUgbW9yZSB3YXlzIHRoZSAnYicgY29tbWFuZCBjYW4gYmUgdXNlZCB0byBzZXQgYnJlYWtwb2ludHMuCkV4YW1wbGVzIGFyZToKCgliICoweDgxOTAwMDAKCWIgMTEwMAoJYiBVc2FnZQoJYgoKSSBkb24ndCB0aGluayB0aGlzIGNvdmVycyBhbGwgb2YgdGhlIHBlcm11dGF0aW9ucyB0aGF0IGdkYiBhY2NlcHRzICh0aGlzIHNob3VsZApiZSBjbGVhbmVkIHVwIHNvbWVkYXkgc28gdGhhdCBhbGwgcG9zc2liaWxpdGllcyBhcmUgYWNjZXB0YWJsZSkuCgoJNikgIFRoZSAncHJpbnQnIGFuZCAneCcgY29tbWFuZHMgc2hvdWxkIGJlaGF2ZSBtb3JlIG9yIGxlc3MgZXhhY3RseQphcyB0aGV5IGRvIHVuZGVyIGdkYi4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlIHdheSB0aGUgZGF0YSBpcyBwcmVzZW50ZWQKd2lsbCBiZSBzbGlnaHRseSBkaWZmZXJlbnQsIGJ1dCB0aGUgY29udGVudCBzaG91bGQgYmUgZnVuZGFtZW50YWxseSB0aGUgc2FtZS4KCgk3KSBUaGUgaW50ZXJuYWwgZGVidWdnZXIgbm93IHN1cHBvcnRzIGNvbmRpdGlvbmFsIGJyZWFrcG9pbnRzLCBhbmQKYXV0b21hdGljIGRpc3BsYXkgZXhwcmVzc2lvbnMuICBBbiBleGFtcGxlIGlzIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLiAgVGhlCnN5bnRheCBhbmQgdXNhZ2Ugc2hvdWxkIGJlIGlkZW50aWNhbCB0byB0aGF0IG9mIGdkYi4KCgk4KSBUeXBlIGNhc3RzIGNhbiBiZSBtYWRlIGZyb20gd2l0aGluIHRoZSBkZWJ1Z2dlciwgYnV0IHRoZXkgY3VycmVudGx5CmRvbid0IHdvcmsgd2l0aCB0eXBlZGVmJ2VkIHR5cGVzLiAgVGhleSBvbmx5IHdvcmsgd2l0aCBidWlsdGluIHR5cGVzIGFuZApuYW1lZCBzdHJ1Y3R1cmVzIHVuaW9ucywgZXRjLiAgVGhlIHByb2JsZW0gaXMgdGhhdCBpbnRlcm5hbGx5IHdlIGRvbid0IGFsd2F5cwpyZWNvcmQgdGhlIHR5cGVkZWZlZCBuYW1lcyBvZiBzdHJ1Y3R1cmVzLCBzbyB3ZSBoYXZlIG5vIGd1YXJhbnRlZSB0aGF0IHdlCndvdWxkIGtub3cgd2hhdCBlYWNoIHR5cGUgaXMuICBUaGlzIGNhbiBiZSBmaXhlZCwgb2YgY291cnNlIC0gIGl0IGp1c3QgdGFrZXMKbW9yZSBtZW1vcnkuICBOb3RlIHRoYXQgaW4gc29tZSBjYXNlcywgdHlwZWRlZmVkIHN0cnVjdHVyZXMgY291bGQgYmUgY2FzdAp1c2luZyAnKHN0cnVjdCB0eXBlZGZuYW1lKScgaW5zdGVhZCBvZiAnKHR5cGVkZm5hbWUpJy4gICBUZWNobmljYWxseSB0aGlzCmlzbid0IHF1aXRlIGNvcnJlY3QsIGJ1dCBpZiBhbmQgd2hlbiB0aGUgcmVzdCBvZiB0aGlzIHN0dWZmIGdldHMgZml4ZWQsCnRoaXMgd291bGQgbmVlZCB0byBnZXQgY29ycmVjdGVkIHRvby4KCk5PVEVTOgoKCUlmIGl0IHdlcmVuJ3QgZm9yIHRoZSBmYWN0IHRoYXQgZ2RiIGRvZXNuJ3QgZ3JvayB0aGUgV2luMzIgZGVidWcKaW5mb3JtYXRpb24sIHlvdSBjb3VsZCBqdXN0IHVzZSBnZGIuICBUaGUgaW50ZXJuYWwgZGVidWdnZXIgc2hvdWxkIGJlIGFibGUKdG8gcmVhZCBhbmQgdXNlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgYm90aCBXaW4zMiBhbmQgYWxzbyBmb3IgdGhlCldpbmUgZXhlY3V0YWJsZSwgbWFraW5nIGl0IHBvc3NpYmxlIHRvIGRlYnVnIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvCnRvZ2V0aGVyIGFzIGlmIGl0IHdlcmUgb25lIGxhcmdlICh2ZXJ5IGxhcmdlKSBlbnRpdHkuCgpMSU1JVEFUSU9OUyBBTkQgRElGRkVSRU5DRVMgRlJPTSBHREI6CgoJWW91IGNhbm5vdCBzZXQgYSBicmVha3BvaW50IGJ5IGZpbGUgYW5kIGxpbmUgbnVtYmVyIGFzIHlvdSBjYW4Kd2l0aCBnZGIuICBBZGRpbmcgc3VwcG9ydCBmb3IgdGhpcyB3b3VsZG4ndCBiZSBhbGwgdGhhdCB0b3VnaCwgSSBndWVzcywgYnV0Cml0IHdvdWxkIGJlIGEgbnVpc2FuY2UuICAgWW91IGNhbiBzZXQgYSBicmVha3BvaW50IGdpdmVuIGEgZnVuY3Rpb24gYW5kCmxpbmUgbnVtYmVyLCBob3dldmVyLiAgQW4gZXhhbXBsZSB3b3VsZCBiZSAnYiBtYWluOjI5OTMnLiAgSXQgdHVybnMgb3V0CnRoYXQgdGhlIHdheSB0aGUgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhcnJhbmdlZCBpdCBpcyBhIHdob2xlIGxvdAplYXNpZXIgdG8gZG8gdGhpbmdzIGluIHRoaXMgd2F5IHRoYW4gaXQgd291bGQgYmUgdG8gdHJ5IGFuZCBnZXQgdGhlCnNvdXJjZTpsaW5lIHR5cGUgb2YgYnJlYWtwb2ludCB3b3JraW5nLCBidXQgaXQgd291bGQgcHJvYmFibHkgYmUgd29ydGggaXQKdG8gdHJ5LgoKCUdldHRpbmcgc3RhY2sgdHJhY2VzIHRocm91Z2ggV2luZSBpdHNlbGYgY2FuIGJlIGEgYml0IHRyaWNreS4KVGhpcyBpcyBiZWNhdXNlIGJ5IGRlZmF1bHQgdGhlIHRoaW5nIGlzIGJ1aWx0IHdpdGggb3B0aW1pemF0aW9uCmVuYWJsZWQsIGFuZCBhcyBhIHJlc3VsdCBzb21ldGltZXMgZnVuY3Rpb25zIGRvbid0IGdldCBmcmFtZXMsIGFuZApsb3RzIG9mIHZhcmlhYmxlcyBhcmUgb3B0aW1pemVkIGludG8gcmVnaXN0ZXJzLiAgWW91IGNhbiB0dXJuIG9mZgpvcHRpbWl6YXRpb24gZm9yIGEgZmV3IGtleSBzb3VyY2UgZmlsZXMgaWYgaXQgd2lsbCBoZWxwIHlvdS4KCglNZW1vcnkgY29uc3VtcHRpb24gaXMgZ2V0dGluZyB0byBiZSBhIHJlYWwgcHJvYmxlbS4gIEkgdGhpbmsgMzJNYiBpcwpubyBsb25nZXIgc3VmZmljaWVudCB0byBkZWJ1ZyB3aW5lIC0gNDggb3IgNjQgaXMgcHJvYmFibHkgYSB3aG9sZSBsb3QgYmV0dGVyLgpVbmZvcnR1bmF0ZWx5IEkgY2Fubm90IHNodXQgZG93biBYIHRvIHNhdmUgbWVtb3J5IDotKS4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKRVhBTVBMRVM6CgoJSGVyZSBpcyBhbiBleGFtcGxlIG9mIGhvdyBJIHRyYWNrZWQgZG93biBhIGJ1ZyBpbiBXaW5lLiAgVGhlIHByb2dyYW0KaXMgc29tZXRoaW5nIHRoYXQganVzdCBtYXBzIGFuZCBkdW1wcyB0aGUgY29udGVudHMgb2YgYSBXaW4zMiBleGVjdXRhYmxlLgpJdCB3YXMgZHlpbmcgZm9yIHNvbWUgcmVhc29uLgpOb3RlIHRoYXQgdGhpcyBleGFtcGxlIGlzIHJhdGhlciBvbGQgYW5kIGRvZXMgbm90IG5lY2Vzc2FyaWx5IHVzZSBjdXJyZW50CnN5bnRheCAhCgpTdGFydCB0aGUgZmlyc3QgdGltZSB0aHJvdWdoLgoKYmFzaCQgbHMgLWwgZHVtcGV4ZS5leGUgCi1ydy1ydy1yLS0gICAxIGVyaWMgICAgIGRldmVsICAgICAgMTY4NDQ4IEphbiAgNCAxMzo1MSBkdW1wZXhlLmV4ZQpiYXNoJCAuL3dpbmUgLWRlYnVnICcuL2R1bXBleGUuZXhlIC1zeW1ib2wgLi9kdW1wZXhlLmV4ZScKV2FybmluZzogaW52YWxpZCBkaXIgJ2U6XHRlc3QnIGluIHBhdGgsIGRlbGV0aW5nIGl0LgpXaW4zMiB0YXNrICdXMzJTWFhYWCc6IEJyZWFrcG9pbnQgMSBhdCAweDA4MWEzNDUwCkxvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC4vd2luZS4uLgpMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAvdXNyL1gxMVI2L2xpYi9saWJYcG0uc28uNC42Li4uCkxvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC91c3IvWDExUjYvbGliL2xpYlNNLnNvLjYuMC4uLgpMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAvdXNyL1gxMVI2L2xpYi9saWJJQ0Uuc28uNi4wLi4uCkxvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC91c3IvWDExUjYvbGliL2xpYlhleHQuc28uNi4wLi4uCkxvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC91c3IvWDExUjYvbGliL2xpYlgxMS5zby42LjAuLi4KTG9hZGluZyBzeW1ib2xzIGZyb20gRUxGIGZpbGUgL2xpYi9saWJtLnNvLjUuMC41Li4uCkxvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC9saWIvbGliYy5zby41LjIuMTguLi4KTG9hZGluZyBzeW1ib2xzIGZyb20gRUxGIGZpbGUgL2xpYi9sZC1saW51eC5zby4xLi4uCkxvYWRpbmcgc3ltYm9scyBmcm9tIFdpbjMyIGZpbGUgLi9kdW1wZXhlLmV4ZS4uLgpTdG9wcGVkIG9uIGJyZWFrcG9pbnQgMSBhdCAweDA4MWEzNDUwIChfbWFpbkNSVFN0YXJ0dXApCkluIDMyIGJpdCBtb2RlLgoqKiogSW52YWxpZCBhZGRyZXNzIDB4NDE0YzVmZjggKH9LRVJORUwzMl9OVUxMX1RIVU5LX0RBVEErMHgzOTMwZWU2YykKMHgwODFhMzQ1MCAoX21haW5DUlRTdGFydHVwKTogIG1vdmwJJWZzOjAsJWVheApXaW5lLWRiZz5iIER1bXBGaWxlCkJyZWFrcG9pbnQgMiBhdCAweDA4MWEwMDc4IChEdW1wRmlsZSsweDkgW2R1bXBleGUuYzoyNzIzXSkKV2luZS1kYmc+YwpEdW1wIEZpbGU6IC4vZHVtcGV4ZS5leGUKU3RvcHBlZCBvbiBicmVha3BvaW50IDIgYXQgMHgwODFhMDA3OCAoRHVtcEZpbGUrMHg5IFtkdW1wZXhlLmM6MjcyM10pCkVudGVyIHBhdGggdG8gZmlsZSBkdW1wZXhlLmM6IC4uL2RlCjI3MjMJCUhBTkRMRQkJCSAgaEZpbGUgPSBOVUxMOwoweDA4MWEwMDc4IChEdW1wRmlsZSsweDkgW2R1bXBleGUuYzoyNzIzXSk6ICBtb3ZsCSQweDAsMHhmZmZmZmZmNCglZWJwKQpXaW5lLWRiZz5saXN0CjI3MjMJCUhBTkRMRQkJCSAgaEZpbGUgPSBOVUxMOwoyNzI0CQlIQU5ETEUJCQkgIGhNYXAgID0gTlVMTDsKMjcyNQkJUFNUUgkJCSAgbHBNYXAgPSBOVUxMOwoyNzI2CQlEV09SRAkJCSAgZHdGaWxlU2l6ZSAgICAgPSAwOwoyNzI3CQlEV09SRAkJCSAgZHdGaWxlU2l6ZUhpZ2ggPSAwOwoyNzI4CQoyNzI5CQlQSU1BR0VfRE9TX0hFQURFUgkgIGxwSW1hZ2VET1MgID0gTlVMTDsKMjczMAkJUElNQUdFX0ZJTEVfSEVBREVSCSAgbHBJbWFnZUZpbGUgPSBOVUxMOwoyNzMxCQlQSU1BR0VfTlRfSEVBREVSUwkgIGxwSW1hZ2VOVCAgID0gTlVMTDsKMjczMgkKMjczMwkJLyoKV2luZS1kYmc+biAxMAoyNzQ3CQlkd0ZpbGVTaXplID0gR2V0RmlsZVNpemUoaEZpbGUsICZkd0ZpbGVTaXplSGlnaCk7CjB4MDgxYTAwZWEgKER1bXBGaWxlKzB4N2IgW2R1bXBleGUuYzoyNzQ3XSk6ICBsZWFsCTB4ZmZmZmZmZjAoJWVicCksJWVheApXaW5lLWRiZz5uCjI3NDkJCSAgICAmJiAoR2V0TGFzdEVycm9yKCkgIT0gTk9fRVJST1IpICkNCjB4MDgxYTAwZmIgKER1bXBGaWxlKzB4OGMgW2R1bXBleGUuYzoyNzQ5XSk6ICBjbXBsCSQtMSwweGZmZmZmZmU4KCVlYnApCldpbmUtZGJnPngvZCBkd0ZpbGVTaXplCngvZCBkd0ZpbGVTaXplDQogMTY4NDQ4CldpbmUtZGJnPm4KMjc1OAkJCQkJIFBBR0VfUkVBRE9OTFksIDAsIDAsIChMUFNUUikgTlVMTCk7CjB4MDgxYTAxMjQgKER1bXBGaWxlKzB4YjUgW2R1bXBleGUuYzoyNzU4XSk6ICBwdXNobAkkMHgwCldpbmUtZGJnPmxpc3QgMjc1MApsaXN0IDI3NTANCjI3NTAJCXsKMjc1MQkJCUZhdGFsKCJDYW5ub3QgZ2V0IHNpemUgb2YgZmlsZSAlcyIsIGxwRmlsZU5hbWUpOwoyNzUyCQl9CjI3NTMJCQoyNzU0CQkvKgoyNzU1CQkgKiBtYXAgdGhlIGZpbGUKMjc1NgkJICovCjI3NTcJCWhNYXAgPSBDcmVhdGVGaWxlTWFwcGluZyhoRmlsZSwgKExQU0VDVVJJVFlfQVRUUklCVVRFUykgTlVMTCwKMjc1OAkJCQkJIFBBR0VfUkVBRE9OTFksIDAsIDAsIChMUFNUUikgTlVMTCk7CjI3NTkJCWlmKCBoTWFwID09IE5VTEwgKQoyNzYwCQl7CldpbmUtZGJnPm4KMjc1OQkJaWYoIGhNYXAgPT0gTlVMTCApCjB4MDgxYTAxM2IgKER1bXBGaWxlKzB4Y2MgW2R1bXBleGUuYzoyNzU5XSk6ICBjbXBsCSQwLDB4ZmZmZmZmZmMoJWVicCkKV2luZS1kYmc+eCBoTWFwCiAwOGU0OGMzMApXaW5lLWRiZz5uCjI3NjcJCWxwTWFwID0gKExQU1RSKSBNYXBWaWV3T2ZGaWxlKGhNYXAsIEZJTEVfTUFQX1JFQUQsIDAsIDAsIDApOwoweDA4MWEwMTU2IChEdW1wRmlsZSsweGU3IFtkdW1wZXhlLmM6Mjc2N10pOiAgcHVzaGwJJDB4MApXaW5lLWRiZz5uCjI3NjgJCWlmKCBscE1hcCA9PSBOVUxMICkKMHgwODFhMDE2YiAoRHVtcEZpbGUrMHhmYyBbZHVtcGV4ZS5jOjI3NjhdKTogIGNtcGwJJDAsMHhmZmZmZmZlMCglZWJwKQpXaW5lLWRiZz5wcmludCBscE1hcAoweDQxNGM1ZjQwCldpbmUtZGJnPnggbHBNYXAKIDQwMDA3MDAwCldpbmUtZGJnPiB4LzEweCAweDQwMDA3MDAwCiB4LzEweCAweDQwMDA3MDAwDQoweDQwMDA3MDAwICh/S0VSTkVMMzJfTlVMTF9USFVOS19EQVRBKzB4MzdlNGZlNzQpOiAqKiogSW52YWxpZCBhZGRyZXNzIDB4NDAwMDcwMDAgKH9LRVJORUwzMl9OVUxMX1RIVU5LX0RBVEErMHgzN2U0ZmU3NCkKV2luZS1kYmc+cXVpdAokCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqClRoZSBmaXJzdCB0aW1lIHRocm91Z2gsIHdlIGZpbmQgdGhhdCBNYXBWaWV3T2ZGaWxlIGlzbid0IG1hcHBpbmcgdGhlIGZpbGUKY29ycmVjdGx5IGludG8gdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZS4gIFRyeSBydW5uaW5nIGFnYWluLCBhbmQgc3RlcCBpbnRvCk1hcFZpZXdPZkZpbGUgdG8gZmlndXJlIG91dCB3aGF0IHdlbnQgd3JvbmcuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCgpiYXNoJCAuL3dpbmUgLWRlYnVnICcuL2R1bXBleGUuZXhlIC1zeW1ib2wgLi9kdW1wZXhlLmV4ZScKV2FybmluZzogaW52YWxpZCBkaXIgJ2U6XHRlc3QnIGluIHBhdGgsIGRlbGV0aW5nIGl0LgpXaW4zMiB0YXNrICdXMzJTWFhYWCc6IEJyZWFrcG9pbnQgMSBhdCAweDA4MWEzNDUwCkxvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC4vd2luZS4uLgpMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAvdXNyL1gxMVI2L2xpYi9saWJYcG0uc28uNC42Li4uCkxvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC91c3IvWDExUjYvbGliL2xpYlNNLnNvLjYuMC4uLgpMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAvdXNyL1gxMVI2L2xpYi9saWJJQ0Uuc28uNi4wLi4uCkxvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC91c3IvWDExUjYvbGliL2xpYlhleHQuc28uNi4wLi4uCkxvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC91c3IvWDExUjYvbGliL2xpYlgxMS5zby42LjAuLi4KTG9hZGluZyBzeW1ib2xzIGZyb20gRUxGIGZpbGUgL2xpYi9saWJtLnNvLjUuMC41Li4uCkxvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC9saWIvbGliYy5zby41LjIuMTguLi4KTG9hZGluZyBzeW1ib2xzIGZyb20gRUxGIGZpbGUgL2xpYi9sZC1saW51eC5zby4xLi4uCkxvYWRpbmcgc3ltYm9scyBmcm9tIFdpbjMyIGZpbGUgLi9kdW1wZXhlLmV4ZS4uLgpTdG9wcGVkIG9uIGJyZWFrcG9pbnQgMSBhdCAweDA4MWEzNDUwIChfbWFpbkNSVFN0YXJ0dXApCkluIDMyIGJpdCBtb2RlLgoqKiogSW52YWxpZCBhZGRyZXNzIDB4NDE0YzVmZjggKH9LRVJORUwzMl9OVUxMX1RIVU5LX0RBVEErMHgzOTMwZWU2YykKMHgwODFhMzQ1MCAoX21haW5DUlRTdGFydHVwKTogIG1vdmwJJWZzOjAsJWVheApXaW5lLWRiZz5iIER1bXBGaWxlOjI3NjcKQnJlYWtwb2ludCAyIGF0IDB4MDgxYTAxNTYgKER1bXBGaWxlKzB4ZTcgW2R1bXBleGUuYzoyNzY3XSkKV2luZS1kYmc+YwpEdW1wIEZpbGU6IC4vZHVtcGV4ZS5leGUNClN0b3BwZWQgb24gYnJlYWtwb2ludCAyIGF0IDB4MDgxYTAxNTYgKER1bXBGaWxlKzB4ZTcgW2R1bXBleGUuYzoyNzY3XSkKRW50ZXIgcGF0aCB0byBmaWxlIGR1bXBleGUuYzogLi4vZGUKMjc2NwkJbHBNYXAgPSAoTFBTVFIpIE1hcFZpZXdPZkZpbGUoaE1hcCwgRklMRV9NQVBfUkVBRCwgMCwgMCwgMCk7CjB4MDgxYTAxNTYgKER1bXBGaWxlKzB4ZTcgW2R1bXBleGUuYzoyNzY3XSk6ICBwdXNobAkkMHgwCldpbmUtZGJnPnN0ZXAKMzkwCTAzODUgc3RkY2FsbCBNYXBWaWV3T2ZGaWxlKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgTWFwVmlld09mRmlsZQoweDA4MGQ3OTNjIChLRVJORUwzMl8zODUgW2tlcm5lbDMyLnNwZWM6MzkwXSk6ICBwdXNobAklZWJwCldpbmUtZGJnPnN0ZXAKMjIzCSAgICBpZiAoIWRlYnVnZ2luZ19yZWxheSkgcmV0dXJuOwoweDA4MGM4M2RjIChSRUxBWV9EZWJ1Z0NhbGxGcm9tMzIrMHhjIFtyZWxheS5jOjIyM10pOiAgY21wdwkkMCwweDY0NGEKV2luZS1kYmc+CjI0NAl9CjB4MDgwYzg0OGUgKFJFTEFZX0RlYnVnQ2FsbEZyb20zMisweGJlIFtyZWxheS5jOjI0NF0pOiAgbGVhbAkweGZmZmZmZmY0KCVlYnApLCVlc3AKV2luZS1kYmc+CjEwMwkgICAgcmV0dXJuIE1hcFZpZXdPZkZpbGVFeChoYW5kbGUsYWNjZXNzLG9mZmhpLG9mZmxvLHNpemUsMCk7CjB4MDgwOTExYTQgKE1hcFZpZXdPZkZpbGUrMHgxNCBbZmlsZS5jOjEwM10pOiAgcHVzaGwJJDB4MApXaW5lLWRiZz4KMTEzCSAgICBGSUxFTUFQX09CSkVDVCAqZm1hcCA9IChGSUxFTUFQX09CSkVDVCopaGFuZGxlOwoweDA4MDkxMWNmIChNYXBWaWV3T2ZGaWxlRXgrMHhmIFtmaWxlLmM6MTEzXSk6ICBtb3ZsCTB4OCglZWJwKSwlZXNpCldpbmUtZGJnPm4KMTE1CSAgICBpZiAoIXNpemUpIHNpemUgPSBmbWFwLT5zaXplOwoweDA4MDkxMWQyIChNYXBWaWV3T2ZGaWxlRXgrMHgxMiBbZmlsZS5jOjExNV0pOiAgdGVzdGwJJWVieCwlZWJ4CldpbmUtZGJnPmxpc3QKbGlzdA0KMTE1CSAgICBpZiAoIXNpemUpIHNpemUgPSBmbWFwLT5zaXplOwoxMTYJICAgIGlmICghc2l6ZSkgc2l6ZSA9IDE7CjExNwkgICAgcmV0dXJuIG1tYXAgKChjYWRkcl90KXN0LCBzaXplLCBmbWFwLT5wcm90LCAKMTE4CSAgICAgICAgICAgICAgICAgTUFQX0FOT058TUFQX1BSSVZBVEUsIAoxMTkJCQkgRklMRV9HZXRVbml4SGFuZGxlKGZtYXAtPmhmaWxlKSwKMTIwCQkJIG9mZmxvKTsKMTIxCX0KMTIyCQoxMjMJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCjEyNAkgKiAgICAgICAgICAgVW5tYXBWaWV3T2ZGaWxlICAgICAgICAgICAgICAgICAgKEtFUk5FTDMyLjM4NSkKMTI1CSAqLwpXaW5lLWRiZz54IHNpemUKIDAwMDAwMDAwCldpbmUtZGJnPm4KMTE2CSAgICBpZiAoIXNpemUpIHNpemUgPSAxOwoweDA4MDkxMWQ5IChNYXBWaWV3T2ZGaWxlRXgrMHgxOSBbZmlsZS5jOjExNl0pOiAgdGVzdGwJJWVieCwlZWJ4CldpbmUtZGJnPnggc2l6ZQogMDAwMDAwMDAKV2luZS1kYmc+bgoxMTcJICAgIHJldHVybiBtbWFwICgoY2FkZHJfdClzdCwgc2l6ZSwgZm1hcC0+cHJvdCwgCjB4MDgwOTExZTIgKE1hcFZpZXdPZkZpbGVFeCsweDIyIFtmaWxlLmM6MTE3XSk6ICBwdXNobAklZWF4CldpbmUtZGJnPnggc2l6ZQogMDAwMDAwMDAKV2luZS1kYmc+aW5mbyBsb2NhbApNYXBWaWV3T2ZGaWxlRXg6aGFuZGxlID09IDB4MDhlNDhjOTAKTWFwVmlld09mRmlsZUV4OmFjY2VzcyA9PSAweDAwMDAwMDA0Ck1hcFZpZXdPZkZpbGVFeDpvZmZoaSA9PSAweDAwMDAwMDAwCk1hcFZpZXdPZkZpbGVFeDpvZmZsbyA9PSAweDAwMDAwMDAwCk1hcFZpZXdPZkZpbGVFeDpzaXplID09IDB4MDAwMDAwMDAKTWFwVmlld09mRmlsZUV4OnN0ID09IDB4MDAwMDAwMDAKTWFwVmlld09mRmlsZUV4Om9mZmxvIG9wdGltaXplZCBpbnRvIHJlZ2lzdGVyICRlYXggCk1hcFZpZXdPZkZpbGVFeDpzaXplIG9wdGltaXplZCBpbnRvIHJlZ2lzdGVyICRlYnggCk1hcFZpZXdPZkZpbGVFeDpzdCBvcHRpbWl6ZWQgaW50byByZWdpc3RlciAkZWRpIApNYXBWaWV3T2ZGaWxlRXg6Zm1hcCBvcHRpbWl6ZWQgaW50byByZWdpc3RlciAkZXNpIApXaW5lLWRiZz5wcmludCAkZWJ4CjB4MDAwMQpXaW5lLWRiZz5idApidA0KQmFja3RyYWNlOgo9PjAgMHgwODA5MTFlMiAoTWFwVmlld09mRmlsZUV4KzB4MjIgW2ZpbGUuYzoxMTddKQogIDEgMHgwODA5MTFiMCAoTWFwVmlld09mRmlsZSsweDIwKGhhbmRsZT0weDhlNDhjOTAsIGFjY2Vzcz0weDQsIG9mZmhpPTB4MCwgb2ZmbG89MHgwLCBzaXplPTB4MCkgW2ZpbGUuYzoxMDRdKQogIDIgMHgwODEwNGFiNSAoQ2FsbEZyb20zMl9zdGRjYWxsXzUrMHgyNSBbY2FsbGZyb20zMi5zXSkKICAzIDB4MDgxYTAxNjggKER1bXBGaWxlKzB4ZjkobHBGaWxlTmFtZT0weDQxNGM2MWVkKSBbZHVtcGV4ZS5jOjI3NjddKQogIDQgMHgwODFhMGMzNSAobWFpbisweDQxMChhcmdjPTB4MywgYXJndj0weDQxNGM2MWNjKSBbZHVtcGV4ZS5jOjMwNzhdKQogIDUgMHgwODFhMzUxNCAoX21haW5DUlRTdGFydHVwKzB4YzQpCiAgNiAweDA4MTA1NDlmIChDb2RlX1N0YXJ0KzB4MTMgW2NhbGx0bzMyLnNdKQogIDcgMHgwODAyZmRhYyAoVEFTS19DYWxsVG9TdGFydCsweDhjIFt0YXNrLmM6MzczXSkKCldpbmUtZGJnPgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpOb3RpY2UgdGhhdCB5b3UgY2FuIHN0ZXAgdGhyb3VnaCB0aGUgdGh1bmtzIGludG8gb3VyIG93biB0cmFuc2Zlcgpyb3V0aW5lcy4gICBZb3Ugd2lsbCBub3RpY2UgdGhhdCB0aGUgc291cmNlIGxpbmUgZGlzcGxheXMgYXMgc29tZXRoaW5nCmxpa2U6CgozOTAJMDM4NSBzdGRjYWxsIE1hcFZpZXdPZkZpbGUobG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBNYXBWaWV3T2ZGaWxlCgpUaGlzIGlzIGp1c3QgdGhlIHNvdXJjZSBsaW5lIGZyb20gdGhlIHNwZWMgZmlsZSB0aGF0IGNhdXNlZCB0aGUgdHJhbnNmZXIKcm91dGluZSB0byBiZSBnZW5lcmF0ZWQuICBGcm9tIHRoaXMgeW91IGNhbiBzdGVwIGFnYWluLCBhbmQgeW91IHN0ZXAKaW50byB0aGUgcmVsYXkgbG9nZ2luZyBjb2RlIC0ga2VlcCBzdGVwcGluZyBhbmQgeW91IGV2ZW50dWFsbHkgc3RlcCBpbnRvCnRoZSBhY3R1YWwgZnVuY3Rpb24gdGhhdCBkb2VzIHRoZSBkaXJ0eSB3b3JrLgoKCUF0IHRoaXMgcG9pbnQgYW4gZXhhbWluYXRpb24gb2YgdGhlIHNvdXJjZSB0byB0aGUgV2luMzIgcHJvZ3JhbQphbmQgYW4gZXhhbWluYXRpb24gb2YgdGhlIHNvdXJjZSB0byB3aW4zMi9maWxlLnMgc2hvd2VkIHdoZXJlIHRoZSBwcm9ibGVtCndhcy4gIFdoZW4geW91IHNwZWNpZnkgMCBmb3IgdGhlIHNpemUgb2YgdGhlIG9iamVjdCBpbiBDcmVhdGVGaWxlTWFwcGluZywKaXQgaXMgc3VwcG9zZWQgdG8gdXNlIHRoZSBlbnRpcmUgc2l6ZSBvZiB0aGUgZmlsZSBhcyB0aGUgc2l6ZSBvZiB0aGUKb2JqZWN0LiAgSW5zdGVhZCB3ZSB3ZXJlIGp1c3QgYmxpbmRseSBjb3B5aW5nIHRoZSBudW1iZXIgb3Zlci4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCldpbmUtZGJnPmIgbWFpbgpCcmVha3BvaW50IDEgYXQgMHgwODAxMDhjMCAobWFpbiBbZGJnbWFpbi5jOjIxM10pCldpbmUtZGJnPnByaW50IGJyZWFrcG9pbnRzWzFdCnthZGRyPXt0eXBlPTB4MDgwNDMwMDAsIHNlZz0wLCBvZmY9MTM0Mjg1NTA0fSwgYWRkcmxlbj0nICcsIG9wY29kZT0nVScsIGVuYWJsZWQ9MSwgc2tpcGNvdW50PTAsIGluX3VzZT0xfQoKV2luZS1kYmc+IHByaW50IGJyZWFrcG9pbnRzWzFdLmVuYWJsZWQKMQpXaW5lLWRiZz5zZXQgYnJlYWtwb2ludHNbMF0uZW5hYmxlZCA9IDAKV2luZS1kYmc+cHJpbnQgYnJlYWtwb2ludHNbMF0uZW5hYmxlZAowCgpXaW5lLWRiZz5wcmludCB0eXBlX2hhc2hfdGFibGVbMV0tPnR5cGUKU1RSVUNUCgpXaW5lLWRiZz5wcmludCB0eXBlX2hhc2hfdGFibGVbMV0KMHgwODA3MjAyMApXaW5lLWRiZz5wcmludCAqdHlwZV9oYXNoX3RhYmxlWzFdCnByaW50ICp0eXBlX2hhc2hfdGFibGVbMV0NCnt0eXBlPVNUUlVDVCwgbmV4dD0weDAwMDAwMDAwLCBuYW1lPSJMT0dQQUxFVFRFIiwgdW49e2Jhc2ljPXtiYXNpY190eXBlPTgsIG91dHB1dF9mb3JtYXQ9IqBWHQigTR0IIiwgYmFzaWNfc2l6ZT0tMTI4LCBiX3NpZ25lZD0wfSwgYml0ZmllbGQ9e2JpdG9mZj04LCBuYml0cz0wLCBiYXNldHlwZT0weDA4MWQ1NmMwfSwgcG9pbnRlcj17cG9pbnRzdG89MHgwMDAwMDAwOH0sIGZ1bmN0PXtyZXR0eXBlPTB4MDAwMDAwMDh9LCBhcnJheT17c3RhcnQ9OCwgZW5kPTEzNjE0MDQ4MCwgYmFzaWN0eXBlPTB4MDgwNDNlODB9LCBzdHJ1Y3R1cmU9e3NpemU9OCwgbWVtYmVycz0weDA4MWQ1NmMwfSwgZW51bWVyYXRpb249e21lbWJlcnM9MHgwMDAwMDAwOH19fQpXaW5lLWRiZz4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCglUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHlvdSBjYW4gcHJpbnQgb3V0IHZhcmlvdXMgZGF0YSBzdHJ1Y3R1cmVzLgpOb3RlIHRoYXQgZW51bWVyYXRlZCB0eXBlcyBhcmUgZGlzcGxheWVkIGluIHRoZSBzeW1ib2xpYyBmb3JtLCBhbmQgc3RyaW5ncwphcmUgZGlzcGxheWVkIGluIHRoZSBleHBlY3RlZCBtYW5uZXIuCgoJWW91IGNhbiB1c2UgdGhlIHNldCBjb21tYW5kIHRvIHNldCBtb3JlIG9yIGxlc3MgYW55dGhpbmcuICBOb3RlCmhvd2V2ZXIgdGhhdCB5b3UgY2Fubm90IHVzZSBlbnVtZXJhdGVkIHR5cGVzIG9uIHRoZSBSSFMgb2YgdGhlIGV4cHJlc3Npb24uCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgoKV2luZS1kYmc+bGlzdAoyOTg2ICAgICAgICAgICAgaWYoIGFyZ2MgPD0gMSApCjI5ODcgICAgICAgICAgICB7CjI5ODggICAgICAgICAgICAgICAgICAgIFVzYWdlKGFyZ3ZbMF0pOwoyOTg5ICAgICAgICAgICAgfQoyOTkwCjI5OTEgICAgICAgICAgICBmb3IoIGkgPSAxOyBpIDwgYXJnYzsgaSsrICkKMjk5MiAgICAgICAgICAgIHsKMjk5MyAgICAgICAgICAgICAgICAgICAgaWYoIHN0cm5jbXAoYXJndltpXSwgIi1kb3MiLCBzaXplb2YoIi1kb3MiKSAtIDEpID09IDAgKQoyOTk0ICAgICAgICAgICAgICAgICAgICB7CjI5OTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG1wQ3RybC5iRHVtcERPU0hlYWRlciA9IFRSVUU7CjI5OTYgICAgICAgICAgICAgICAgICAgIH0KV2luZS1kYmc+YiAyOTkzCkJyZWFrcG9pbnQgMyBhdCAweDA4MWE4ODYxIChtYWluKzB4M2MgW2R1bXBleGUuYzoyOTkzXSkKV2luZS1kYmc+Y29uZGl0aW9uIDMgaSA9PSAyCldpbmUtZGJnPmMKU3RvcHBlZCBvbiBicmVha3BvaW50IDMgYXQgMHgwODFhODg2MSAobWFpbisweDNjIFtkdW1wZXhlLmM6Mjk5M10pCjI5OTMgICAgICAgICAgICAgICAgICAgIGlmKCBzdHJuY21wKGFyZ3ZbaV0sICItZG9zIiwgc2l6ZW9mKCItZG9zIikgLSAxKSA9PSAwICkKMHgwODFhODg2MSAobWFpbisweDNjIFtkdW1wZXhlLmM6Mjk5M10pOiAgcHVzaGwgJDB4NApXaW5lLWRiZz5wcmludCBpCjIKV2luZS1kYmc+cHJpbnQgYXJndltpXQoiLi9kdW1wZXhlLmV4ZSIKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCglUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBjb25kaXRpb25hbCBicmVha3BvaW50cy4KCUhlcmUgaXMgYW5vdGhlciBvbmUgdGhhdCBkZW1vbnN0cmF0ZXMgYW5vdGhlciBjb29sIGZlYXR1cmUKCWNvbmRpdGlvbmFsIGJyZWFrcG9pbnRzIHRoYXQgaW52b2x2ZSBhIGZ1bmN0aW9uIGNhbGw6CgoJCWNvbmRpdGlvbiAzIHN0cmNtcChhcmd2W2ldLCAiLi9kdW1wZXhlLmV4ZSIpID09IDAKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCgpXaW5lLWRiZz5saXN0CjI5ODYgICAgICAgICAgICBpZiggYXJnYyA8PSAxICkKMjk4NyAgICAgICAgICAgIHsKMjk4OCAgICAgICAgICAgICAgICAgICAgVXNhZ2UoYXJndlswXSk7CjI5ODkgICAgICAgICAgICB9CjI5OTAKMjk5MSAgICAgICAgICAgIGZvciggaSA9IDE7IGkgPCBhcmdjOyBpKysgKQoyOTkyICAgICAgICAgICAgewoyOTkzICAgICAgICAgICAgICAgICAgICBpZiggc3RybmNtcChhcmd2W2ldLCAiLWRvcyIsIHNpemVvZigiLWRvcyIpIC0gMSkgPT0gMCApCjI5OTQgICAgICAgICAgICAgICAgICAgIHsKMjk5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEbXBDdHJsLmJEdW1wRE9TSGVhZGVyID0gVFJVRTsKMjk5NiAgICAgICAgICAgICAgICAgICAgfQpXaW5lLWRiZz5iIDI5OTMKQnJlYWtwb2ludCAzIGF0IDB4MDgxYTg4NjEgKG1haW4rMHgzYyBbZHVtcGV4ZS5jOjI5OTNdKQpXaW5lLWRiZz5jb25kaXRpb24gMyBzdHJjbXAoYXJndltpXSwgIi4vZHVtcGV4ZS5leGUiKSA9PSAwCldpbmUtZGJnPmluZm8gYnJlYWsKQnJlYWtwb2ludHM6CjE6IHkgMHgwODFhYjQ1MCAoX21haW5DUlRTdGFydHVwKQoyOiB5IDB4MDgxYTg4MmUgKG1haW4rMHg5IFtkdW1wZXhlLmM6Mjk4Nl0pCjM6IHkgMHgwODFhODg2MSAobWFpbisweDNjIFtkdW1wZXhlLmM6Mjk5M10pCiAgICAgICAgICAgICAgICBzdG9wIHdoZW4gICggc3RyY21wKCggYXJndltpXSApLCAiLi9kdW1wZXhlLmV4ZSIpID09IDAgKQpXaW5lLWRiZz5jClN0b3BwZWQgb24gYnJlYWtwb2ludCAzIGF0IDB4MDgxYTg4NjEgKG1haW4rMHgzYyBbZHVtcGV4ZS5jOjI5OTNdKQoyOTkzICAgICAgICAgICAgICAgICAgICBpZiggc3RybmNtcChhcmd2W2ldLCAiLWRvcyIsIHNpemVvZigiLWRvcyIpIC0gMSkgPT0gMCApCjB4MDgxYTg4NjEgKG1haW4rMHgzYyBbZHVtcGV4ZS5jOjI5OTNdKTogIHB1c2hsICQweDQKV2luZS1kYmc+cHJpbnQgaQoyCldpbmUtZGJnPnByaW50IGFyZ3ZbaV0gIAoiLi9kdW1wZXhlLmV4ZSIKV2luZS1kYmc+Cg==