ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWxvZwoKVmVyc2lvbiA3LjIwLjEgKDE0IEFwcmlsIDIwMTApCgpEYW5pZWwgU3RlbmJlcmcgKDkgQXByIDIwMTApCi0gUHJlZml4aW5nIHRoZSBGVFAgcXVvdGUgY29tbWFuZHMgd2l0aCBhbiBhc3RlcmlzayByZWFsbHkgb25seSB3b3JrZWQgZm9yIHRoZQogIHBvc3RxdW90ZSBhY3Rpb25zLiBUaGlzIGlzIG5vdyBmaXhlZCBhbmQgdGVzdCBjYXNlIDIyNyBoYXMgYmVlbiBleHRlbmRlZCB0bwogIHZlcmlmeS4KCkthbWlsIER1ZGthICg0IEFwciAyMDEwKQotIEVsaW1pbmF0ZWQgYSByYWNlIGNvbmRpdGlvbiBpbiBDdXJsX3Jlc29sdl90aW1lb3V0KCkuCgotIFJlZmFjdG9yaXplZCBpbnRlcmZhY2Ugb2YgQ3VybF9zc2xfcmVjdigpL0N1cmxfc3NsX3NlbmQoKS4KCi0gbGliY3VybC1OU1Mgbm93IHByb3ZpZGVzIG1vcmUgYWNjdXJhdGUgbWVzc2FnZXMgYW5kIGVycm9yIGNvZGVzIGluIGNhc2Ugb2YKICBjbGllbnQgY2VydGlmaWNhdGUgcHJvYmxlbS4gIEVpdGhlciBkdXJpbmcgY29ubmVjdGlvbiwgb3IgdHJhbnNmZXIgcGhhc2UuCgpEYW5pZWwgU3RlbmJlcmcgKDEgQXByIDIwMTApCi0gTWF0dCBXaXhzb24gZm91bmQgYW5kIGZpeGVkIGEgYnVnIGluIHRoZSBTQ1AvU0ZUUCBhcmVhIHdoZXJlIHRoZSBjb2RlCiAgdHJlYXRlZCBhIDAgcmV0dXJuIGNvZGUgZnJvbSBsaWJzc2gyIHRvIGJlIHRoZSBzYW1lIGFzIEVBR0FJTiB3aGlsZSBpbgogIHJlYWxpdHkgaXQgaXNuJ3QuIFRoZSBwcm9ibGVtIGNhdXNlZCBhIGhhbmcgaW4gU0ZUUCB0cmFuc2ZlcnMgZnJvbSBhCiAgTWVzc2FnZVdheSBzZXJ2ZXIuCgpEYW5pZWwgU3RlbmJlcmcgKDI4IE1hciAyMDEwKQotIEJlbiBHcmVlYXI6IElmIHlvdSBwYXNzIGEgVVJMIHRvIHBvcDMgdGhhdCBkb2VzIG5vdCBjb250YWluIGEgbWVzc2FnZSBJRCBhcwogIHBhcnQgb2YgdGhlIFVSTCwgaXQgd291bGQgcHJldmlvdXNseSBhc2sgZm9yICdJTkJPWCcgd2hpY2gganVzdCBjYXVzZXMgdGhlCiAgcG9wMyBzZXJ2ZXIgdG8gcmV0dXJuIGFuIGVycm9yLgogICAgCiAgTm93IGxpYmN1cmwgdHJlYXRzIGVuIGVtcHR5IG1lc3NhZ2UgSUQgYXMgYSByZXF1ZXN0IGZvciBMSVNUIChsaXN0IG9mIHBvcDMKICBtZXNzYWdlIElEcykuICBVc2VyJ3MgY29kZSBjb3VsZCB0aGVuIHBhcnNlIHRoaXMgYW5kIGRvd25sb2FkIGluZGl2aWR1YWwKICBtZXNzYWdlcyBhcyBkZXNpcmVkLgoKRGFuaWVsIFN0ZW5iZXJnICgyNyBNYXIgMjAxMCkKLSBCZW4gR3JlZWFyIGJyb3VnaHQgYSBwYXRjaCB0aGF0IGZyb20gbm93IG9uIGFsbG93cyBhbGwgcHJvdG9jb2xzIHRvIHNwZWNpZnkKICBuYW1lIGFuZCB1c2VyIHdpdGhpbiB0aGUgVVJMLCBpbiB0aGUgc2FtZSBtYW5uZXIgSFRUUCBhbmQgRlRQIGhhdmUgYmVlbgogIGFsbG93ZWQgdG8gaW4gdGhlIHBhc3QgLSBhbHRob3VnaCBmYXIgZnJvbSBhbGwgb2YgdGhlIGxpYmN1cmwgc3VwcG9ydGVkCiAgcHJvdG9jbHMgYWN0dWFsbHkgaGF2ZSB0aGF0IGZlYXR1cmUgaW4gdGhlaXIgVVJMIGRlZmluaXRpb24gc3BlYy4KCkRhbmllbCBTdGVuYmVyZyAoMjYgTWFyIDIwMTApCi0gQmVuIEdyZWVhciBicm91Z2h0IGNvZGUgdGhhdCBtYWtlcyB0aGUgcmF0ZSBsaW1pdGluZyBjb2RlIGZvciB0aGUgZWFzeQogIGludGVyZmFjZSBhIGJpdCBzbW9vdGhlciBhcyBpdCBpbnRyb2R1Y2VzIHN1Yi1zZWNvbmQgc2xlZXBzIGR1cmluZyBpdCBhbmQgaXQKICBhbHNvIHRha2VzIHRoZSBidWZmZXIgc2l6ZXMgaW50byBhY2NvdW50LgoKRGFuaWVsIFN0ZW5iZXJnICgyNCBNYXIgMjAxMCkKLSBCb2IgUmljaG1vbmQ6IFRoZXJlJ3MgYW4gYW5ub3lpbmcgc2l0dWF0aW9uIHdoZXJlIGxpYmN1cmwgd2lsbCByZWFkIG5ldyBIVFRQCiAgcmVzcG9uc2UgZGF0YSBmcm9tIGEgc29ja2V0LCB0aGVuIGNoZWNrIGlmIGl0J3MgYSB0aW1lb3V0IGlmIG9uZSBpcyBzZXQuIElmCiAgdGhlIGxhc3QgcGFja2V0IHJlY2VpdmVkIGNvbnN0aXR1dGVzIHRoZSBlbmQgb2YgdGhlIHJlc3BvbnNlIGJvZHksIGxpYmN1cmwKICBzdGlsbCB0cmVhdHMgaXQgYXMgYSB0aW1lb3V0IGNvbmRpdGlvbiBhbmQgcmVwb3J0cyBhIG1lc3NhZ2UgbGlrZToKCiAgIk9wZXJhdGlvbiB0aW1lZCBvdXQgYWZ0ZXIgMzAwMCBtaWxsaXNlY29uZHMgd2l0aCA4NzYgb3V0IG9mIDg3NiBieXRlcyAKICByZWNlaXZlZCIKCiAgSXQgc2hvdWxkIG9ubHkgYSB0aW1lb3V0IGlmIHRoZSB0aW1lciBsYXBzZWQgYW5kIHdlIERJRE4nVCByZWNlaXZlIHRoZSBlbmQKICBvZiB0aGUgcmVzcG9uc2UgYm9keSB5ZXQuCgotIENocmlzdG9waGVyIENvbnJveSBmaXhlZCBhIHByb2JsZW0gd2l0aCBSVFNQIGFuZCBHRVRfUEFSQU1FVEVSIHJlcG9ydGVkCiAgdG8gdXMgYnkgTWFzc2ltbyBDYWxsZWdhcmkuIFRoZXJlJ3MgYSBuZXcgdGVzdCBjYXNlIDU3MiB0aGF0IHZlcmlmaWVzIHRoaXMKICBub3cuCgotIFRoZSAnYXJlcycgc3VidHJlZSBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHNvdXJjZSByZXBvc2l0b3J5LiBJdCB3YXMKICBhbHdheXMgYSBzZXBhcmF0ZSBwcm9qZWN0IHRoYXQgc29ydCBvZiBwaWdneWJhY2tlZCBvbiB0aGUgY3VybCBwcm9qZWN0IHNpbmNlCiAgdGhlIGRhd24gb2YgdGltZXMgYW5kIG5vdyB0aGUgdGltZSBoYXMgY29tZSBmb3IgaXQgdG8gZ28gc3RhbmQgb24gaXRzIG93bgogIGxlZ3MgYW5kIGNvbnRpbnVlIGxpdmluZyBpdHMgb3duIGxpZmUuIEFsbCBkZXRhaWxzIG9uIGMtYXJlcyBhbmQgaXRzIG5ldwogIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnkgaXMgZm91bmQgYXQgaHR0cDovL2MtYXJlcy5oYXh4LnNlLwoKRGFuaWVsIFN0ZW5iZXJnICgyMyBNYXIgMjAxMCkKLSBLZW5ueSBUbyBmaWxlZCB0aGUgYnVnIHJlcG9ydCAjMjk2MzY3OSB3aXRoIHBhdGNoIHRvIGZpeCBhIHByb2JsZW0gaGUKICBleHBlcmllbmNlZCB3aXRoIGRvaW5nIG11bHRpIGludGVyZmFjZSBIVFRQIFBPU1Qgb3ZlciBhIHByb3h5IHVzaW5nCiAgUFJPWFlUVU5ORUwuIEhlIGZvdW5kIGEgY2FzZSB3aGVyZSBpdCB3b3VsZCBjb25uZWN0IGZpbmUgYnV0IGJpdHMudGNwY29ubmVjdAogIHdhcyBub3Qgc2V0IGNvcnJlY3Qgc28gbGliY3VybCBkaWRuJ3Qgd29yayBwcm9wZXJseS4KCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI5NjM2NzkpCgotIEFrb3MgUGFzenRvcnkgZmlsZWQgZGViaWFuIGJ1ZyByZXBvcnQgIzU3MjI3NgogIGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz01NzIyNzYgbWVudGlvbmluZyBhIHByb2JsZW0KICB3aXRoIGEgcmVzb3VyY2UgdGhhdCByZXR1cm5zIGNodW5rZWQtZW5jb2RlZCBfYW5kXyB3aXRoIGEgQ29udGVudC1MZW5ndGgKICBhbmQgbGliY3VybCBmYWlsZWQgdG8gcHJvcGVybHkgaWdub3JlIHRoZSBsYXR0ZXIgaW5mb3JtYXRpb24uCgotIEhhdWtlIER1ZGVuIHByb3ZpZGVkIGFuIGV4YW1wbGUgcHJvZ3JhbSB0aGF0IG1hZGUgdGhlIG11bHRpIGludGVyZmFjZSBjcmFzaC4KICBIaXMgZXhhbXBsZSBzaW1wbHkgdXNlZCB0aGUgbXVsdGkgaW50ZXJmYWNlIGFuZCBkaWQgZmlyc3Qgb25lIEZUUCB0cmFuc2ZlcgogIGFuZCBhZnRlciBjb21wbGV0aW9uIGl0IHVzZWQgYSBzZWNvbmQgZWFzeSBoYW5kbGUgYW5kIGRpZCBhbm90aGVyIEZUUAogIHRyYW5zZmVyIG9uIHRoZSBzYW1lIEZUUCBzZXJ2ZXIuCgogIFRoaXMgdHJpZ2dlcmVkIGEgYnVnIGluIHRoZSAiZGVsYXllZCBlYXN5IGhhbmRsZSBraWxsIiBzeXN0ZW0gdGhhdCBjdXJsCiAgdXNlczogd2hlbiBhbiBGVFAgY29ubmVjdGlvbiBpcyBsZWZ0IGFsaXZlIGl0IG11c3Qga2VlcCBhbiBlYXN5IGhhbmRsZQogIGFyb3VuZCBpbnRlcm5hbGx5IC0gb25seSBmb3IgdGhlIHB1cnBvc2Ugb2YgaGF2aW5nIGFuIGVhc3kgaGFuZGxlIHdoZW4gaXQKICBsYXRlciBkaXNjb25uZWN0cyBpdC4gVGhlIGNvZGUgYXNzdW1lZCB0aGF0IHdoZW4gdGhlIGVhc3kgaGFuZGxlIHdhcyByZW1vdmVkCiAgYW5kIGFuIGludGVybmFsIHJlZmVyZW5jZSB3YXMgbWFkZSwgdGhhdCB2ZXJzaW9uIGNvdWxkIGJlIGtpbGxlZCBsYXRlciBvbgogIHdoZW4gYSBuZXcgZWFzeSBoYW5kbGUgY2FtZSB1c2luZyB0aGUgc2FtZSBjb25uZWN0aW9uLiBUaGlzIHdhcyB3cm9uZyBhcwogIEhhdWtlJ3MgZXhhbXBsZSBzaG93ZWQgdGhhdCB0aGUgcmVtb3ZlZCBoYW5kbGUgd2Fzbid0IGtpbGxlZCBmb3IgcmVhbCB1bnRpbAogIGxhdGVyLiBUaGlzIGNhdXNlZCBhIGRvdWJsZSBjbG9zZSBhdHRlbXB0ID0+IHNlZ2ZhdWx0LgoKRGFuaWVsIFN0ZW5iZXJnICgyMiBNYXIgMjAxMCkKLSBUaG9tYXMgTG9wYXRpYyBmaXhlZCB0aGUgYWxhcm0oKS1iYXNlZCBETlMgdGltZW91dDoKCiAgTG9va2luZyBhdCB0aGUgY29kZSBvZiBDdXJsX3Jlc29sdl90aW1lb3V0KCkgaW4gaG9zdGlwLmMsIEkgdGhpbmsgdGhhdCBpbgogIGNhc2Ugb2YgYSB0aW1lb3V0LCB0aGUgc2lnbmFsIGhhbmRsZXIgZm9yIFNJR0FMUk0gbmV2ZXIgZ2V0cyByZW1vdmVkLiBJCiAgdGhpbmsgdGhhdCBpbiBteSBjYXNlIGl0IGdldHMgZXhlY3V0ZWQgYXQgc29tZSBwb2ludCBsYXRlciBvbiB3aGVuIGV4ZWN1dGlvbgogIGhhcyBsb25nIGxlZnQgQ3VybF9yZXNvbHZfdGltZW91dCgpIG9yIGV2ZW4gdGhlIGNVUkwgbGlicmFyeS4KICAKICBUaGUgY29kZSB0aGF0IGlzIGp1bXBlZCB0byB3aXRoIHNpZ2xvbmdqbXAoKSBzaW1wbHkgc2V0cyB0aGUgZXJyb3IgbWVzc2FnZQogIHRvICJuYW1lIGxvb2t1cCB0aW1lZCBvdXQiIGFuZCB0aGVuIHJldHVybnMgd2l0aCBDVVJMUkVTT0xWX0VSUk9SLiBJIGd1ZXNzCiAgdGhhdCBpbnN0ZWFkIG9mIHNpbXBseSByZXR1cm5pbmcgd2l0aG91dCBjbGVhbmluZyB1cCwgdGhlIGNvZGUgc2hvdWxkIGhhdmUgYQogIGdvdG8gdGhhdCBqdW1wcyB0byB0aGUgc3BvdCByaWdodCBhZnRlciB0aGUgY2FsbCB0byBDdXJsX3Jlc29sdigpLgoKS2FtaWwgRHVka2EgKDIyIE1hciAyMDEwKQotIERvdWdsYXMgU3RlaW53YW5kIGNvbnRyaWJ1dGVkIGEgcGF0Y2ggZml4aW5nIGluc3VmZmljaWVudCBpbml0aWFsaXphdGlvbiBpbgogIEN1cmxfY2xvbmVfc3NsX2NvbmZpZygpCgpEYW5pZWwgU3RlbmJlcmcgKDIxIE1hciAyMDEwKQotIEJlbiBHcmVlYXIgaW1wcm92ZWQgVEZUUDogdGhlIGVycm9yIGNvZGUgcmV0dXJuaW5nIGFuZCB0aGUgdHJlYXRtZW50CiAgb2YgVFNJWkUgPT0gMCB3aGVuIHVwbG9hZGluZy4KCi0gV2UndmUgc3dpdGNoZWQgZnJvbSBDVlMgdG8gZ2l0LiBTZWUgaHR0cDovL2N1cmwuaGF4eC5zZS9zb3VyY2UuaHRtbAoKS2FtaWwgRHVka2EgKDE5IE1hciAyMDEwKQotIEltcHJvdmVkIEN1cmxfcmVhZCgpIHRvIG5vdCBpZ25vcmUgdGhlIGVycm9yIHJldHVybmVkIGZyb20gQ3VybF9zc2xfcmVjdigpLgoKRGFuaWVsIFN0ZW5iZXJnICgxNSBNYXIgMjAxMCkKLSBDb25zdGFudGluZSBTYXB1bnR6YWtpcyBicm91Z2h0IGEgcGF0Y2g6CgogIFRoZSBwcm9ibGVtIG1lbnRpb25lZCBvbiBEZWMgMTAgMjAwOQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yOTA1MjIwKSB3YXMgb25seSBwYXJ0aWFsbHkgZml4ZWQuCiAgUGFydGlhbGx5IGJlY2F1c2UgYW4gZWFzeSBoYW5kbGUgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBtYW55IGNvbm5lY3Rpb25zIGluCiAgdGhlIGNhY2hlIChlLmcuIGlmIHRoZXJlIGlzIGEgcmVkaXJlY3QgZHVyaW5nIHRoZSBsaWZldGltZSBvZiB0aGUgZWFzeQogIGhhbmRsZSkuICBUaGUgcHJldmlvdXMgcGF0Y2ggb25seSBjbGVhbmVkIHVwIHRoZSBmaXJzdCBvbmUuIFRoZSBuZXcgZml4IG5vdwogIHJlbW92ZXMgdGhlIGVhc3kgaGFuZGxlIGZyb20gYWxsIGNvbm5lY3Rpb25zLCBub3QganVzdCB0aGUgZmlyc3Qgb25lLgoKRGFuaWVsIFN0ZW5iZXJnICg2IE1hciAyMDEwKQotIEJlbiBHcmVlYXIgYnJvdWdodCBhIHBhdGNoIHRoYXQgZml4ZWQgdGhlIHJhdGUgbGltaXRpbmcgbG9naWMgZm9yIFRGVFAgd2hlbgogIHRoZSBlYXN5IGludGVyZmFjZSB3YXMgdXNlZC4KCkRhbmllbCBTdGVuYmVyZyAoNSBNYXIgMjAxMCkKLSBEYW5pZWwgSm9obnNvbiBwcm92aWRlZCBmaXhlcyBmb3IgYnVpbGRpbmcgY3VybCB3aXRoIHRoZSBjbGFuZyBjb21waWxlci4KCllhbmcgVHNlICg1IE1hciAyMDEwKQotIENvbnN0YW50aW5lIFNhcHVudHpha2lzIGRldGVjdGVkIGFuZCBmaXhlZCBhIGRvdWJsZSBmcmVlIGluIGJ1aWxkcyBkb25lCiAgd2l0aCB0aHJlYWRlZCByZXNvbHZlciBlbmFibGVkIChXaW5kb3dzIGRlZmF1bHQgY29uZmlndXJhdGlvbikgdGhhdCB3b3VsZAogIGdldCB0cmlnZ2VyZWQgd2hlbiBhIGN1cmwgaGFuZGxlIGlzIGNsb3NlZCB3aGlsZSBkb2luZyBETlMgcmVzb2x1dGlvbi4KCkRhbmllbCBTdGVuYmVyZyAoMiBNYXIgMjAxMCkKLSBbRGFuaWVsIEpvaG5zb25dIEkndmUgYmVlbiB0cnlpbmcgdG8gYnVpbGQgbGliY3VybCB3aXRoIGNsYW5nIG9uIERhcndpbiBhbmQKICByYW4gaW50byBzb21lIGlzc3VlcyB3aXRoIHRoZSBHU1NBUEkgdGVzdHMgaW4gY29uZmlndXJlLmFjLiBUaGUgdGVzdHMgZmlyc3QKICB0cnkgdG8gZGV0ZXJtaW5lIHRoZSBpbmNsdWRlIGRpcnMgYW5kIGxpYnMgYW5kIHNldCBDUFBGTEFHUyBhbmQgTElCUwogIGFjY29yZGluZ2x5LiBJdCB0aGVuIGNoZWNrcyBmb3IgdGhlIGhlYWRlcnMgYW5kIGZpbmFsbHkgc2V0cyBMSUJTIGEgc2Vjb25kCiAgdGltZSwgY2F1c2luZyB0aGUgbGlicyB0byBiZSBpbmNsdWRlZCB0d2ljZS4gVGhlIGZpcnN0IHNldHRpbmcgb2YgTElCUyBzZWVtcwogIHJlZHVuZGFudCBhbmQgc2hvdWxkIGJlIGxlZnQgb3V0LCBzaW5jZSB0aGUgZmlyc3QgcGFydCBpcyBvdGhlcndpc2UganVzdAogIGFib3V0IGZpbmRpbmcgaGVhZGVycy4KCiAgTXkgc2Vjb25kIGlzc3VlIGlzIHRoYXQgJ2tyYjUtY29uZmlnIC0tbGlicyBnc3NhcGknIG9uIERhcndpbiBpcyBsZXNzIHRoYW4KICB1c2VsZXNzIGFuZCByZXR1cm5zIGp1bmsgdGhhdCwgd2hpbGUgaXQgaGFwcGVucyB0byB3b3JrIHdpdGggZ2NjLCBjYXVzZXMKICBjbGFuZyB0byBjaG9rZS4gRm9yIGV4YW1wbGUsIC0tbGlicyByZXR1cm5zICRDRkxBR1MgYWxvbmcgd2l0aCB0aGUgbGlicywKICB3aGljaCBpcyByZWFsbHkgcmV0YXJkZWQuIFNpbXBseSBzZXR0aW5nICdMSUJTPSIkTElCUyAtbGdzc2FwaV9rcmI1CiAgLWxyZXNvbHYiJyBvbiBEYXJ3aW4gaXMgc3VmZmljaWVudC4KCi0gQmFzZWQgb24gcGF0Y2ggcHJvdmlkZWQgYnkgSmFjb2IgTW9zaGVua28sIHRoZSB0cmFuc2ZlciBsb2dpYyBub3cgcHJvcGVybHkKICBtYWtlcyBzdXJlIHRoYXQgd2hlbiB1c2luZyBzdWItc2Vjb25kIHRpbWVvdXRzLCB0aGVyZSdzIG5vIGZpbmFsIGJhZCAxMDAwbXMKICB3YWl0LiBQcmV2aW91c2x5LCBhIHN1Yi1zZWNvbmQgdGltZW91dCB3b3VsZCBvZnRlbiBtYWtlIHRoZSBlbGFwc2VkIHRpbWUgZW5kCiAgdXAgdGhlIHRpbWUgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdCBzZWNvbmQgKGUuZy4gMXMgZm9yIDIwMG1zIHRpbWVvdXQpCgotIEFuZHJlaSBCZW5lYSBmaWxlZCBidWcgcmVwb3J0ICMyOTU2Njk4IGFuZCBwb2ludGVkIG91dCB0aGF0IHRoZQogIENVUkxPUFRfQ0VSVElORk8gZmVhdHVyZSBsZWFrZWQgbWVtb3J5IGR1ZSB0byBhIG1pc3NpbmcgT3BlblNTTCBmdW5jdGlvbgogIGNhbGwuIEhlIHByb3ZpZGVkIHRoZSBwYXRjaCB0byBmaXggaXQgdG9vLgoKICBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yOTU2Njk4CgotIE1hcmt1cyBEdWZ0IHBvaW50ZWQgb3V0IGluIGJ1ZyAjMjk2MTc5NiB0aGF0IGV2ZW4gdGhvdWdoIEludGVyaXggaGFzIGEKICBwb2xsKCkgZnVuY3Rpb24gaXQgZG9lc24ndCBxdWl0ZSB3b3JrIHRoZSB3YXkgd2Ugd2FudCBpdCBzbyB3ZSBtdXN0IGRpc2FibGUKICBpdCwgYW5kIGhlIGFsc28gcHJvdmlkZWQgYSBwYXRjaCBmb3IgaXQuCgogIGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI5NjE3OTYKCi0gTWFkZSB0aGUgcGluZ3BvbmcgdGltZW91dCBjb2RlIHByb3Blcmx5IGRlYWwgd2l0aCB0aGUgcmVzcG9uc2UgdGltZW91dCBBTkQKICB0aGUgZ2xvYmFsIHRpbWVvdXQgaWYgc2V0LiBBbHNvLCBhcyB3YXMgcmVwb3J0ZWQgaW4gdGhlIGJ1ZyByZXBvcnQgIzI5NTY0MzcKICBieSBSeWFuIENoYW4sIHRoZSB0aW1lIHN0YW1wIHRvIHVzZSBhcyBiYXNpcyBmb3IgdGhlIHBlciBjb21tYW5kIHRpbWVvdXQgd2FzCiAgbm90IHNldCBwcm9wZXJseSBpbiB0aGUgRE9ORSBwaGFzZSBmb3IgRlRQIChhbmQgbm90IGZvciBTTVRQKSBzbyBJIGZpeGVkCiAgdGhhdCBqdXN0IG5vdy4gVGhpcyB3YXMgYSByZWdyZXNzaW9uIGNvbXBhcmVkIHRvIDcuMTkuNyBkdWUgdG8gdGhlCiAgY29udmVyc2lvbiBvZiBGVFAgY29kZSBvdmVyIHRvIHRoZSBnZW5lcmljIHBpbmdwb25nIGNvbmNlcHRzLgoKICBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yOTU2NDM3CgpEYW5pZWwgU3RlbmJlcmcgKDEgTWFyIDIwMTApCi0gQmVuIEdyZWVhciBwcm92aWRlZCBhbiB1cGRhdGUgZm9yIFRGVFAgdGhhdCBmaXhlcyB1cGxvYWQuCgotIFdlc2xleSBNaWF3IHJlcG9ydGVkIGJ1ZyAjMjk1ODE3OSB3aGljaCBpZGVudGlmaWVkIGEgY2FzZSBvZiBsb29waW5nIGR1cmluZwogIE9wZW5TU0wgYmFzZWQgU1NMIGhhbmRzaGFraW5nIGV2ZW4gdGhvdWdoIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2FzIHVzZWQgYW5kCiAgdGhlcmUgd2FzIG5vIGdvb2QgcmVhc29uIGZvciBpdC4KCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9Mjk1ODE3OQoKRGFuaWVsIFN0ZW5iZXJnICgyNiBGZWIgMjAxMCkKLSBQYXQgUmF5IGluIGJ1ZyAjMjk1ODQ3NCBwb2ludGVkIG91dCBhbiBvZmYtYnktb25lIGNhc2Ugd2hlbiByZWNlaXZpbmcgYQogIGNodW5rZWQtZW5jb2RpbmcgdHJhaWxlci4KCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9Mjk1ODQ3NAoKRGFuaWVsIEZhbmRyaWNoICgyNSBGZWIgMjAxMCkKLSBGaXhlZCBhIGNvdXBsZSBvZiBvdXQgb2YgbWVtb3J5IGxlYWtzIGFuZCBhIHNlZ2ZhdWx0IGluIHRoZSBTTVRQICYgSU1BUCBjb2RlLgoKWWFuZyBUc2UgKDI1IEZlYiAyMDEwKQotIEkgZml4ZWQgYnVnIHJlcG9ydCAjMjk1ODA3NCBpbmRpY2F0aW5nCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI5NTgwNzQpIHRoYXQgY3VybCBvbiBXaW5kb3dzIHdpdGgKICBvcHRpb24gLS10cmFjZS10aW1lIGRpZCBub3QgdXNlIGxvY2FsIHRpbWUgd2hlbiB0aW1lc3RhbXBpbmcgdHJhY2UgbGluZXMuCiAgVGhpcyBjb3VsZCBhbHNvIGhhcHBlbiBvbiBvdGhlciBzeXN0ZW1zIGRlcGVuZGluZyBvbiB0aW1lIHNvdXVyY2UuCgpQYXRyaWNrIE1vbm5lcmF0ICgyMiBGZWIgMjAxMCkKLSBQcm9wZXIgaGFuZGxpbmcgb2YgU1RBUlRUTFMgb24gU01UUCwgdGFraW5nIENVUkxVU0VTU0xfVFJZIGludG8gYWNjb3VudC4KLSBTTVRQIGZhbGxzIGJhY2sgdG8gUkZDODIxIEhFTE8gd2hlbiBFSExPIGZhaWxzIChhbmQgU1NMIGlzIG5vdCByZXF1aXJlZCkuCi0gVXNlIG9mIHRydWUgbG9jYWwgaG9zdCBuYW1lIChpLmUuOiB2aWEgZ2V0aG9zdG5hbWUoKSkgd2hlbiBhdmFpbGFibGUsIGFzCiAgZGVmYXVsdCBhcmd1bWVudCB0byBTTVRQIEhFTE8vRUhMTy4KLSBUZXN0IGNhc2UgODA0IGZvciBIRUxPIGZhbGxiYWNrLgoKRGFuaWVsIFN0ZW5iZXJnICgyMCBGZWIgMjAxMCkKLSBGaXhlZCB0aGUgU01UUCBjb21wbGlhbmNlIGJ5IG1ha2luZyBzdXJlIFJDUFQgVE8gYWRkcmVzc2VzIGFyZSBzcGVjaWZpZWQKICBwcm9wZXJseSBpbiBhbmdsZSBicmFja2V0cy4gUmVjaXBpZW50cyBwcm92aWRlZCB3aXRoIENVUkxPUFRfTUFJTF9SQ1BUIG5vdwogIGdldCBhbmdsZSBicmFja2V0IHdyYXBwaW5nIGF1dG9tYXRpY2FsbHkgYnkgbGliY3VybCB1bmxlc3MgdGhlIHJlY2lwaWVudAogIHN0YXJ0cyB3aXRoIGFuIGFuZ2xlIGJyYWNrZXQgYXMgdGhlbiB0aGUgYXBwIGlzIGFzc3VtZWQgdG8gZGVhbCB3aXRoIHRoYXQKICBwcm9wZXJseSBvbiBpdHMgb3duLgoKLSBJIG1hZGUgdGhlIFNNVFAgY29kZSBleHBlY3QgYSAyNTAgcmVzcG9uc2UgYmFjayBmcm9tIHRoZSBzZXJ2ZXIgYWZ0ZXIgdGhlCiAgZnVsbCBEQVRBIGhhcyBiZWVuIHNlbnQsIGFuZCBJIG1vZGlmaWVkIHRoZSB0ZXN0IFNNVFAgc2VydmVyIHRvIGFsc28gc2VuZAogIHRoYXQgcmVzcG9uc2UuIEFzIHVzdWFsLCB0aGUgRE9ORSBvcGVyYXRpb24gdGhhdCBpcyBtYWRlIGFmdGVyIGEgY29tcGxldGVkCiAgdHJhbnNmZXIgaXMgc3RpbGwgbm90IGRvYWJsZSBpbiBhIG5vbi1ibG9ja2luZyB3YXkgc28gdGhpcyB3YWl0aW5nIGZvciAyNTAKICBpcyB1bmZvcnR1bmF0ZWx5IG1hZGUgYmxvY2tpbmdseS4KCllhbmcgVHNlICgxNCBGZWIgMjAxMCkKLSBPdmVyaGF1bGVkIHRlc3Qgc3VpdGUgZ2V0cGFydCgpIGZ1bmN0aW9uLiBGaXhpbmcgcG90ZW50aWFsIG91dCBvZiBib3VuZHMKICBzdGFjayBhbmQgbWVtb3J5IG92ZXJ3cml0ZXMgdHJpZ2dlcmVkIHdpdGggaHVnZSB0ZXN0IGNhc2UgZGVmaW5pdGlvbnMuCgpEYW5pZWwgU3RlbmJlcmcgKDEzIEZlYiAyMDEwKQotIE1hcnRpbiBIYWdlciByZXBvcnRlZCBhbmQgZml4ZWQgYSBwcm9ibGVtIHdpdGggYSBtaXNzaW5nIHF1b3RlIGluIGxpYmN1cmwubTQKCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI5NTEzMTkpCgotIFRvbSBEb25vdmFuIGZpeGVkIHRoZSBDVVJMX0ZPUk1BVF8qIGRlZmluZXMgd2hlbiBidWlsZGluZyB3aXRoIGNtYWtlLgoKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9Mjk1MTI2OSkKCkRhbmllbCBTdGVuYmVyZyAoMTIgRmViIDIwMTApCi0gSmFjayBaaGFuZyByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCBTTVRQOiB3ZSB3cm9uZ2x5IHVzZWQgbXVsdGlwbGUgYWRkcmVzc2VzCiAgaW4gdGhlIHNhbWUgUkNQVCBUTyBsaW5lLCB3aGVuIHRoZXkgc2hvdWxkIGJlIHNlbnQgaW4gc2VwYXJhdGUgc2luZ2xlCiAgY29tbWFuZHMuIEkgdXBkYXRlZCB0ZXN0IGNhc2UgODAyIHRvIHZlcmlmeSB0aGlzLgoKLSBJIGFsc28gZml4ZWQgYSBiYWQgdXNlIG9mIG15X3NldG9wdF9zdHIoKSBvZiBDVVJMT1BUX01BSUxfUkNQVCBpbiB0aGUgY3VybAogIHRvb2wgd2hpY2ggbWFkZSBpdCB0cnkgdG8gb3V0cHV0IGl0IGFzIHN0cmluZyBmb3IgdGhlIC0tbGliY3VybCBmZWF0dXJlCiAgd2hpY2ggY291bGQgbGVhZCB0byBjcmFzaGVzLgoKWWFuZyBUc2UgKDExIEZlYiAyMDEwKQotIFN0ZXZlbiBNLiBTY2h3ZWRhIGZpeGVkIFZNUyBidWlsZGVyIGJhZCBiZWhhdmlvciB3aGVuIHVzZWQgaW4gYSBiYXRjaCBqb2IsCiAgcmVtb3ZlZCBvYnNvbGV0ZSBiYXRjaF9jb21waWxlLmNvbSBhbmQgZGVmaW5lcy5jb20gYW5kIHVwZGF0ZWQgVk1TIHJlYWRtZS4KClZlcnNpb24gNy4yMC4wICg5IEZlYnJ1YXJ5IDIwMTApCgpEYW5pZWwgU3RlbmJlcmcgKDkgRmViIDIwMTApCi0gV2hlbiBkb3dubG9hZGluZyBjb21wcmVzc2VkIGNvbnRlbnQgb3ZlciBIVFRQIGFuZCB0aGUgYXBwIGFza2VkIGxpYmN1cmwgdG8KICBhdXRvbWF0aWNhbGx5IHVuY29tcHJlc3MgaXQgd2l0aCB0aGUgQ1VSTE9QVF9FTkNPRElORyBvcHRpb24sIGxpYmN1cmwgY291bGQKICB3cm9uZ2x5IHByb3ZpZGUgdGhlIGNhbGxiYWNrIHdpdGggbW9yZSBkYXRhIHRoYW4gdGhlIG1heGltdW0gZG9jdW1lbnRlZAogIGFtb3VudC4gQW4gYXBwbGljYXRpb24gY291bGQgdGh1cyBnZXQgdHJpY2tlZCBpbnRvIGJhZG5lc3MgaWYgdGhlIG1heGltdW0KICBsaW1pdCB3YXMgdHJ1c3RlZCB0byBiZSBlbmZvcmNlZCBieSBsaWJjdXJsIGl0c2VsZiAoYXMgaXQgaXMgZG9jdW1lbnRlZCkuCgogIFRoaXMgaXMgZnVydGhlciBkZXRhaWxlZCBhbmQgZXhwbGFpbmVkIGluIHRoZSBsaWJjdXJsIHNlY3VyaXR5IGFkdmlzb3J5CiAgMjAxMDAyMDkgYXQKCiAgICBodHRwOi8vY3VybC5oYXh4LnNlL2RvY3MvYWR2XzIwMTAwMjA5Lmh0bWwKCkRhbmllbCBGYW5kcmljaCAoMyBGZWIgMjAxMCkKLSBDaGFuZ2VkIHRoZSBXYXRjb20gbWFrZWZpbGVzIHRvIG1ha2UgdGhlbSBlYXNpZXIgdG8ga2VlcCBpbiBzeW5jIHdpdGgKICBNYWtlZmlsZS5pbmMgc2luY2UgdGhhdCBjYW4ndCBiZSBpbmNsdWRlZCBkaXJlY3RseS4KCllhbmcgVHNlICgyIEZlYiAyMDEwKQotIFN5bWJvbCBDVVJMX0ZPUk1BVF9PRkZfVCBub3cgb2Jzb2xldGVkLCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZSwKICBzeW1ib2wgd2lsbCBub3QgYmUgYXZhaWxhYmxlIHdoZW4gYnVpbGRpbmcgd2l0aCBDVVJMX05PX09MRElFUyBkZWZpbmVkLiBVc2UKICBvZiBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UIGlzIHByZWZlcnJlZCBzaW5jZSA3LjE5LjAKCkRhbmllbCBTdGVuYmVyZyAoMSBGZWIgMjAxMCkKLSBVc2luZyB0aGUgbXVsdGlfc29ja2V0IEFQSSwgaXQgdHVybnMgb3V0IGF0IHRpbWVzIGl0IHNlZW1lZCB0byAiZm9yZ2V0IgogIGNvbm5lY3Rpb25zICh3aGljaCBjYXVzZWQgYSBoYW5nKS4gSXQgdHVybmVkIG91dCB0byBiZSBhbiBleGlzdGluZyAoNy4xOS43KQogIGJ1ZyBpbiBsaWJjdXJsICh0aGF0J3MgYmVlbiBhcm91bmQgZm9yIGEgbG9uZyB0aW1lKSBhbmQgaXQgaGFwcGVuZWQgbGlrZQogIHRoaXM6CgogIFRoZSBhcHAgY2FsbHMgY3VybF9tdWx0aV9hZGRfaGFuZGxlKCkgdG8gYWRkIGEgbmV3IGVhc3kgaGFuZGxlLCBsaWJjdXJsIHdpbGwKICB0aGVuIHNldCBpdCB0byB0aW1lb3V0IGluIDEgbWlsbGlzZWNvbmQgc28gbGliY3VybCB3aWxsIHRlbGwgdGhlIGFwcCBhYm91dAogIGl0LgoKICBUaGUgYXBwJ3MgdGltZW91dCBmaXJlcyBvZmYgdGhhdCB0aGVyZSdzIGEgdGltZW91dCwgdGhlIGFwcCBjYWxscyBsaWJjdXJsIGFzCiAgd2Ugc28gb2Z0ZW4gZG9jdW1lbnQgaXQ6CgogIGRvIHsKICAgcmVzID0gY3VybF9tdWx0aV9zb2NrZXRfYWN0aW9uKC4uLiBUSU1FT1VUIC4uLik7CiAgfSB3aGlsZShDVVJMTV9DQUxMX01VTFRJX1BFUkZPUk0gPT0gcmVzKTsKCiAgQW5kIHRoaXMgaXMgdGhlIHByb2JsZW0gbnVtYmVyIG9uZToKCiAgV2hlbiBjdXJsX211bHRpX3NvY2tldF9hY3Rpb24oKSBpcyBjYWxsZWQgd2l0aCBubyBzcGVjaWZpYyBoYW5kbGUsIGJ1dCBvbmx5CiAgYSB0aW1lb3V0LWFjdGlvbiwgaXQgd2lsbCAqb25seSogcGVyZm9ybSBhY3Rpb25zIHdpdGhpbiBsaWJjdXJsIHRoYXQgYXJlCiAgbWFya2VkIHRvIHJ1biBhdCB0aGlzIHRpbWUuIEluIHRoaXMgY2FzZSwgdGhlIHJlcXVlc3Qgd291bGQgZ28gZnJvbSBJTklUIHRvCiAgQ09OTkVDVCBhbmQgcmV0dXJuIENVUkxNX0NBTExfTVVMVElfUEVSRk9STS4gV2hlbiB0aGUgYXBwIHRoZW4gY2FsbHMgbGliY3VybAogIGFnYWluLCB0aGVyZSdzIG5vIHRpbWVyIHNldCBmb3IgdGhpcyBoYW5kbGUgc28gaXQgcmVtYWlucyBpbiB0aGUgQ09OTkVDVAogIHN0YXRlLiBUaGUgQ09OTkVDVCBzdGF0ZSBpcyBhIHRyYW5zaXRpb25hbCBzdGF0ZSBpbiBsaWJjdXJsIHNvIGl0IHJlcG9ydHMgbm8KICBzb2NrZXRzIHRoZXJlLCBhbmQgdGh1cyBsaWJjdXJsIG5ldmVyIHRlbGxzIHRoZSBhcHAgYW55dGhpbmcgbW9yZSBhYm91dCB0aGF0CiAgZWFzeSBoYW5kbGUvY29ubmVjdGlvbi4KCiAgbGliY3VybCBfZG9lc18gc2V0IGEgMW1zIHRpbWVvdXQgZm9yIHRoZSBoYW5kbGUgYXQgdGhlIGVuZCBvZgogIG11bHRpX3J1bnNpbmdsZSgpIGlmIGl0IHJldHVybnMgQ1VSTE1fQ0FMTF9NVUxUSV9QRVJGT1JNLCBidXQgc2luY2UgdGhlIGxvb3AKICBpcyBpbnN0YW50IHRoZSBuZXcgam9iIGlzIG5vdCByZWFkeSB0byBydW4gYXQgdGhhdCBwb2ludCAoYW5kIHRoZXJlJ3Mgbm8KICBjb2RlIHRoYXQgbWFrZXMgbGliY3VybCBjYWxsIHRoZSBhcHAgdG8gdXBkYXRlIHRoZSB0aW1vdXQgZm9yIHRoaXMgbmV3CiAgdGltZW91dCkuIEl0IHdpbGwgc2ltcGx5IHJlbHkgb24gdGhhdCBzb21lIG90aGVyIHRpbWVvdXQgd2lsbCB0cmlnZ2VyIGxhdGVyCiAgb24gb3IgdGhhdCBzb21ldGhpbmcgZWxzZSB3aWxsIHVwZGF0ZSB0aGUgdGltZW91dCBjYWxsYmFjay4gVGhpcyBtYWtlcyB0aGUKICBidWcgZmFpcmx5IGhhcmQgdG8gcmVwZWF0LgoKICBUaGUgZml4IG1hZGUgdG8gYWRyZXNzIHRoaXMgaXNzdWU6CgogIFdlIGludHJvZHVjZSBhIGxvb3AgaW4gbGliL211bHRpLmMgYXJvdW5kIGFsbCBjYWxscyB0byBtdWx0aV9ydW5zaW5nbGUoKSBhbmQKICBzaW1wbHkgY2hlY2sgZm9yIENVUkxNX0NBTExfTVVMVElfUEVSRk9STSBpbnRlcm5hbGx5LiBUaGlzIGhhcyB0aGUgYWRkZWQKICBiZW5lZml0IHRoYXQgdGhpcyBnb2VzIGluIGxpbmUgd2l0aCBteSBsb25nLXRlcm0gd2lzaGVzIHRvIGdldCByaWQgb2YgdGhlCiAgQ1VSTE1fQ0FMTF9NVUxUSV9QRVJGT1JNIGFsbCB0b2dldGhlciBmcm9tIHRoZSBwdWJsaWMgQVBJLgoKICBUaGUgZG93bnNpZGUgb2YgdGhpcyBmaXgsIGlzIHRoYXQgdGhlIGNvdW50ZXIgd2UgcmV0dXJuIGluICdydW5uaW5nX2hhbmRsZXMnCiAgaW4gc2V2ZXJhbCBvZiBvdXIgcHVibGljIGZ1bmN0aW9ucyB0aGVuIGdldHMgYSBzbGlnaHRseSBuZXcgYW5kIHBvc3NpYmx5CiAgY29uZnVzaW5nIGJlaGF2aW9yIGR1cmluZyB0aW1lczoKCiAgSWYgYW4gYXBwIGFkZHMgYSBoYW5kbGUgdGhhdCBmYWlscyB0byBjb25uZWN0ICh2ZXJ5IHF1aWNrbHkpIGl0IG1heSBqdXN0CiAgYXMgd2VsbCBuZXZlciBhcHBlYXIgYXMgYSAncnVubmluZ19oYW5kbGUnIHdpdGggdGhpcyBmaXguIFByZXZpb3VzbHkgaXQKICB3b3VsZCBmaXJzdCBidW1wIHRoZSBjb3VudGVyIG9ubHkgdG8gZ2V0IGl0IGRlY3JlYXNlZCBhZ2FpbiBhdCBuZXh0IGNhbGwuCiAgRXZlbiBJIGhhdmUgdXNlZCB0aGF0IGNoYW5nZSBpbiBoYW5kbGUgY291bnRlciB0byBzaWduYWwgImVuZCBvZiBhCiAgdHJhbnNmZXIiLiBUaGUgb25seSAqZ29vZCogd2F5IHRvIGZpbmQgdGhlIGVuZCBvZiBhIGluZGl2aWR1YWwgdHJhbnNmZXIKICBpcyBjYWxsaW5nIGN1cmxfbXVsdGlfaW5mb19yZWFkKCkgdG8gc2VlIGlmIGl0IHJldHVybnMgb25lLgoKICBPZiBjb3Vyc2UsIGlmIHRoZSBhcHAgcHJldmlvdXNseSBkaWQgdGhlIGxvb3BpbmcgYmVmb3JlIGl0IGNoZWNrZWQgdGhlCiAgY291bnRlciwgaXQgcmVhbGx5IHNob3VsZG4ndCBiZSBhbnkgbmV3IGVmZmVjdC4KCllhbmcgVHNlICgyNiBKYW4gMjAxMCkKLSBDb25zdGFudGluZSBTYXB1bnR6YWtpcycgYW5kIEpvc2h1YSBLd2FuJ3Mgd29yayBkb25lIGluIHRoZSBsYXN0IGZvdXIgbW9udGhzCiAgcmVsYXRpdmUgdG8gdGhlIGFzeW5jaHJvbm91cyBETlMgbG9va3VwcywgYWxvbmcgd2l0aCB3aXRoIHNvbWUgaW50ZWdyYXRpb24KICBhZGp1c3RtZW50cyBJIGhhdmUgZG9uZSBhcmUgZmluYWxseSBjb21taXR0ZWQgdG8gQ1ZTLgoKICBDdXJyZW50bHkgdGhlc2UgZW5oYW5jZW1lbnRzIHdpbGwgYmVuZWZpdCBidWlsZHMgZG9uZSB1c2luZyBjLWFyZXMgb24gYW55CiAgcGxhdGZvcm0gYXMgd2VsbCBhcyBXaW5kb3dzIGJ1aWxkcyB1c2luZyB0aGUgZGVmYXVsdCB0aHJlYWRlZCByZXNvbHZlci4KCiAgVGhpcyByZWxlYXNlIGRvZXMgbm90IG1ha2UgZ2VuZXJhbGx5IGF2YWlsYWJsZSBQT1NJWCB0aHJlYWRlZCBETlMgbG9va3VwcwogIHlldC4gVGhlcmUgaXMgbm8gY29uZmlndXJlIG9wdGlvbiB0byBlbmFibGUgdGhpcyBmZWF0dXJlIHlldC4gSXQgaXMgcG9zc2libGUKICB0byBleHBlcmltYW50YWxseSB0cnkgdGhpcyBmZWF0dXJlIHJ1bm5pbmcgY29uZmlndXJlIHdpdGggY29tcGlsZXIgZmxhZ3MgdGhhdAogIG1ha2Ugc2ltdWx0YW5lb3VzIGRlZmluaXRpb24gb2YgcHJlcHJvY2Vzc29yIHN5bWJvbHMgVVNFX1RIUkVBRFNfUE9TSVggYW5kCiAgSEFWRV9QVEhSRUFEX0gsIGFzIHdlbGwgYXMgd2hhdGV2ZXIgcmVlbnRyYW5jeSBjb21waWxlciBmbGFncyBhbmQgbGlua2VyIG9uZXMKICBhcmUgcmVxdWlyZWQgdG8gbGluayBhbmQgcHJvcGVybHkgdXNlIHB0aHJlYWRfKiBmdW5jdGlvbnMgb24gZWFjaCBwbGF0Zm9ybS4KCkRhbmllbCBTdGVuYmVyZyAoMjYgSmFuIDIwMTApCi0gTWlrZSBDcm93ZSBtYWRlIGxpYmN1cmwgcmV0dXJuIENVUkxFX0NPVUxETlRfUkVTT0xWRV9QUk9YWSB3aGVuIGl0IGlzIHRoZQogIHByb3h5IHRoYXQgY2Fubm90IGJlIHJlc29sdmVkIHdoZW4gdXNpbmcgYy1hcmVzLiBUaGlzIG1hdGNoZXMgdGhlIGJlaGF2aW91cgogIHdoZW4gbm90IHVzaW5nIGMtYXJlcy4KCkJq9nJuIFN0ZW5iZXJnICgyMyBKYW4gMjAxMCkKLSBBZGRlZCBhIG5ldyBmbGFnOiAtSi8tLXJlbW90ZS1oZWFkZXItbmFtZS4gVGhpcyBvcHRpb24gdGVsbHMgdGhlCiAgLU8vLS1yZW1vdGUtbmFtZSBvcHRpb24gdG8gdXNlIHRoZSBzZXJ2ZXItc3BlY2lmaWVkIENvbnRlbnQtRGlzcG9zaXRpb24KICBmaWxlbmFtZSBpbnN0ZWFkIG9mIGV4dHJhY3RpbmcgYSBmaWxlbmFtZSBmcm9tIHRoZSBVUkwuCgpEYW5pZWwgU3RlbmJlcmcgKDIxIEphbiAyMDEwKQotIENocmlzIENvbnJveSBicm91Z2h0IHN1cHBvcnQgZm9yIFJUU1AgdHJhbnNmZXJzLCBhbmQgd2l0aCBpdCBjb21lcyA4KCEpIG5ldwogIGxpYmN1cmwgb3B0aW9ucyBmb3IgY29udHJvbGxpbmcgd2hhdCB0byBnZXQgYW5kIGhvdyB0byByZWNlaXZlIHBvc3NzaWJseQogIGludGVybGVhdmVkIFJUUCBkYXRhLgoKRGFuaWVsIFN0ZW5iZXJnICgyMCBKYW4gMjAxMCkKLSBBcyB3YXMgcG9pbnRlZCBvdXQgb24gdGhlIGh0dHAtc3RhdGUgbWFpbGluZyBsaXN0LCB0aGUgb3JkZXIgb2YgY29va2llcyBpbiBhCiAgSFRUUCBDb29raWU6IGhlYWRlciBfbmVlZHNfIHRvIGJlIHNvcnRlZCBvbiB0aGUgcGF0aCBsZW5ndGggaW4gdGhlIGNhc2VzCiAgd2hlcmUgdHdvIGNvb2tpZXMgdXNpbmcgdGhlIHNhbWUgbmFtZSBhcmUgc2V0IG1vcmUgdGhhbiBvbmNlIHVzaW5nCiAgKG92ZXJsYXBwaW5nKSBwYXRocy4gUmVhbGl6aW5nIHRoaXMsIGlkZW50aWNhbGx5IG5hbWVkIGNvb2tpZXMgbXVzdCBiZQogIHNvcnRlZCBjb3JyZWN0bHkuIEJ1dCBkZXRlY3Rpbmcgb25seSBpZGVudGljYWxseSBuYW1lZCBjb29raWVzIGFuZCB0YWtlIGNhcmUKICBvZiB0aGVtIGluZGl2aWR1YWxseSBpcyBoYXJkZXIgdGhhbiBqdXN0IHRvIGJsaW5kbHkgYW5kIHVuY29uZGl0aW9uYWxseSBzb3J0CiAgYWxsIGNvb2tpZXMgYmFzZWQgb24gdGhlaXIgcGF0aCBsZW5ndGhzLiBBbGwgbWFqb3IgYnJvd3NlcnMgYWxzbyBhbHJlYWR5IGRvCiAgdGhpcywgc28gdGhpcyBtYWtlcyBvdXIgYmVoYXZpb3Igb25lIHN0ZXAgY2xvc2VyIHRvIHRoZW0gaW4gdGhlIGNvb2tpZSBhcmVhLgoKICBUZXN0IGNhc2UgOCB3YXMgdGhlIG9ubHkgb25lIHRoYXQgYnJva2UgZHVlIHRvIHRoaXMgY2hhbmdlIGFuZCBJIHVwZGF0ZWQgaXQKICBhY2NvcmRpbmdseS4KCkRhbmllbCBTdGVuYmVyZyAoMTkgSmFuIDIwMTApCi0gRGF2aWQgTWNDcmVlZHkgYnJvdWdodCBhIGZpeCBhbmQgYSBuZXcgdGVzdCBjYXNlICgxMjkpIHRvIG1ha2UgbGliY3VybCB3b3JrCiAgYWdhaW4gd2hlbiBkb3dubG9hZGluZyBmaWxlcyBvdmVyIEZUUCB1c2luZyBBU0NJSSBhbmQgaXQgdHVybnMgb3V0IHRoYXQgdGhlCiAgZmluYWwgc2l6ZSBvZiB0aGUgZmlsZSBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIGluaXRpYWwgc2l6ZSB0aGUgc2VydmVyCiAgcmVwb3J0ZWQuIFRoaXMgaXMgdmVyeSBjb21tb24gc2luY2Ugc2VydmVycyBkb24ndCB0YWtlIHRoZSBuZXdsaW5lCiAgY29udmVyc2lvbnMgaW50byBhY2NvdW50LgoKS2FtaWwgRHVka2EgKDE0IEphbiAyMDEwKQotIFN1cHByZXNzZWQgc2lkZSBlZmZlY3Qgb2YgT3BlblNTTCBjb25maWd1cmUgY2hlY2tzLCB3aGljaCBwcmV2ZW50ZWQgTlNTIGZyb20KICBiZWluZyBwcm9wZXJseSBkZXRlY3RlZCB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMuIEl0IGhhZCBiZWVuIGNhdXNlZCBieQogIHN0cmFuZ2UgYmVoYXZpb3Igb2YgcGtnLWNvbmZpZyB3aGVuIGhhbmRsaW5nIFBLR19DT05GSUdfTElCRElSLiBwa2ctY29uZmlnCiAgZGlzdGluZ3Vpc2hlcyBhbW9uZyBlbXB0eSBhbmQgbm9uLWV4aXN0ZW50IGVudmlyb25tZW50IHZhcmlhYmxlIGluIHRoYXQgY2FzZS4KCkRhbmllbCBTdGVuYmVyZyAoMTIgSmFuIDIwMTApCi0gR2lsIFdlYmVyIHJlcG9ydGVkIGEgcGVjdWxpYXIgZmxhdyB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2hlbiBkb2luZyBTRlRQCiAgdHJhbnNmZXJzOiBjdXJsX211bHRpX2Zkc2V0KCkgd291bGQgcmV0dXJuIC0xIGFuZCBub3Qgc2V0IGFuZCBmaWxlCiAgZGVzY3JpcHRvcnMgc2V2ZXJhbCB0aW1lcyBkdXJpbmcgYSB0cmFuc2ZlciBvZiBhIHNpbmdsZSBmaWxlLiBJdCB0dXJuZWQgb3V0CiAgdG8gYmUgZHVlIHRvIHR3byBkaWZmZXJlbnQgZmxhd3Mgbm93IGZpeGVkLiBHaWwncyBleGNlbGxlbnQgcmVjaXBlIGhlbHBlZCBtZQogIG5haWwgdGhpcy4KCkRhbmllbCBTdGVuYmVyZyAoMTEgSmFuIDIwMTApCi0gTWFkZSBzdXJlIHRoYXQgdGhlIHByb2dyZXNzIGNhbGxiYWNrIGlzIHJlcGVhdGVkbHkgY2FsbGVkIGF0IGEgcmVndWxhcgogIGludGVydmFsIGV2ZW4gZHVyaW5nIHZlcnkgc2xvdyBjb25uZWN0cy4KCi0gVGhlIHRlc3RzL3J1bnRlc3RzLnBsIHNjcmlwdCBub3cgY2hlY2tzIHRvIHNlZSBpZiB0aGUgdGVzdCBjYXNlIHRoYXQgcnVucyBpcwogIHByZXNlbnQgaW4gdGhlIHRlc3RzL2RhdGEvTWFrZWZpbGUuYW0gYW5kIG91dHB1dHMgYSBub3RpY2UgbWVzc2FnZSBvbiB0aGUKICBzY3JlZW4gaWYgbm90LiBFYWNoIHRlc3QgZmlsZSBoYXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhhdCBNYWtlZmlsZS5hbSB0byBnZXQKICBpbmNsdWRlZCBpbiByZWxlYXNlIGFyY2hpdmVzIGFuZCBmb3JnZXR0aW5nIHRvIGFkZCBmaWxlcyB0aGVyZSBpcyBhIGNvbW1vbgogIG1pc3Rha2UuIFRoaXMgaXMgYW4gYXR0ZW1wdCB0byBtYWtlIGl0IGhhcmRlciB0byBmb3JnZXQuCgpEYW5pZWwgU3RlbmJlcmcgKDkgSmFuIDIwMTApCi0gSm9oYW4gdmFuIFNlbHN0IGZvdW5kIGFuZCBmaXhlZCBhIE9wZW5TU0wgc2Vzc2lvbiByZWYgY291bnQgbGVhazoKCiAgb3NzbF9jb25uZWN0X3N0ZXAzKCkgaW5jcmVtZW50cyBhbiBTU0wgc2Vzc2lvbiBoYW5kbGUgcmVmZXJlbmNlIGNvdW50ZXIgb24KICBlYWNoIGNhbGwuIFdoZW4gc2Vzc2lvbnMgYXJlIHJlLXVzZWQgdGhpcyByZWZlcmVuY2UgY291bnRlciBtYXkgYmUKICBpbmNyZW1lbnRlZCBtYW55IHRpbWVzLCBidXQgaXQgd2lsbCBiZSBkZWNyZW1lbnRlZCBvbmx5IG9uY2Ugd2hlbiBkb25lIChieQogIEN1cmxfb3NzbF9zZXNzaW9uX2ZyZWUoKSk7IGFuZCB0aGUgaW50ZXJuYWwgT3BlblNTTCBkYXRhIHdpbGwgbm90IGJlIGZyZWVkCiAgaWYgdGhpcyByZWZlcmVuY2UgY291bnQgcmVtYWlucyBwb3NpdGl2ZS4gV2hlbiBhIHNlc3Npb24gaXMgcmUtdXNlZCB0aGUKICByZWZlcmVuY2UgY291bnRlciBzaG91bGQgYmUgY29ycmVjdGVkIGJ5IGV4cGxpY2l0bHkgY2FsbGluZwogIFNTTF9TRVNTSU9OX2ZyZWUoKSBhZnRlciBlYWNoIGNvbnNlY3V0aXZlIFNTTF9nZXQxX3Nlc3Npb24oKSB0byBhdm9pZAogIGludHJvZHVjaW5nIGEgbWVtb3J5IGxlYWsuCgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yOTI2Mjg0KQoKRGFuaWVsIFN0ZW5iZXJnICg3IEphbiAyMDEwKQotIE1ha2Ugc3VyZSB0aGUgcHJvZ3Jlc3MgY2FsbGJhY2sgaXMgY2FsbGVkIHJlcGVhdGVkbHkgZXZlbiBkdXJpbmcgdmVyeSBzbG93CiAgbmFtZSByZXNvbHZlcyB3aGVuIGMtYXJlcyBpcyB1c2VkIGZvciByZXNvbHZpbmcuCgpDbGFlcyBKYWtvYnNzb24gKDYgSmFuIDIwMTApCi0gSnVsaWVuIENoYWZmcmFpeCBmaXhlZCBzbyB0aGF0IHRoZSBmcmFnbWVudCBwYXJ0IGluIGFuIFVSTCBpcyBub3Qgc2VudAogIHRvIHRoZSBzZXJ2ZXIgYW55bW9yZS4KCkthbWlsIER1ZGthICgzIEphbiAyMDEwKQotIEp1bGllbiBDaGFmZnJhaXggZWxpbWluYXRlZCBhIGR1cGxpY2F0ZWQgaW5pdGlhbGl6YXRpb24gaW4gc2luZ2xlc29ja2V0KCkuCgpEYW5pZWwgU3RlbmJlcmcgKDIgSmFuIDIwMTApCi0gTWFrZSBjdXJsIHN1cHBvcnQgLS1zc2wgYW5kIC0tc3NsLXJlcWQgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgRlRQLXNwZWNpZmljCiAgdmVyc2lvbnMgLS1mdHAtc3NsIGFuZCAtLWZ0cC1zc2wtcmVxZCBhcyB0aGVzZSBvcHRpb25zIGFyZSBub3cgdXNlZCB0bwogIGNvbnRyb2wgU1NML1RMUyBmb3IgSU1BUCwgUE9QMyBhbmQgU01UUCBhcyB3ZWxsIGluIGFkZGl0aW9uIHRvIEZUUC4gVGhlIG9sZAogIG9wdGlvbiBuYW1lcyBhcmUgc3RpbGwgd29ya2luZyBidXQgdGhlIG5ldyBvbmVzIGFyZSB0aGUgb25lcyBsaXN0ZWQgYW5kCiAgZG9jdW1lbnRlZC4KCkRhbmllbCBTdGVuYmVyZyAoMSBKYW4gMjAxMCkKLSBJbmdtYXIgUnVuZ2UgZW5oYW5jZWQgbGliY3VybCdzIEZUUCBlbmdpbmUgdG8gc3VwcG9ydCB0aGUgUFJFVCBjb21tYW5kLiBUaGlzCiAgY29tbWFuZCBpcyBhIHNwZWNpYWwgImhhY2siIHVzZWQgYnkgdGhlIGRyZnRwZCBzZXJ2ZXIsIGJ1dCBldmVuIHRob3VnaCBpdCBpcwogIGEgY3VzdG9tIGV4dGVuc2lvbiBJJ3ZlIGRlZW1lZCBpdCBmaW5lIHRvIGFkZCB0byBsaWJjdXJsIHNpbmNlIHRoaXMgc2VydmVyCiAgc2VlbXMgdG8gc3Vydml2ZSBhbmQgcGVvcGxlIGtlZXAgdXNpbmcgaXQgYW5kIHdhbnQgbGliY3VybCB0byBzdXBwb3J0CiAgaXQuIFRoZSBuZXcgbGliY3VybCBvcHRpb24gaXMgbmFtZWQgQ1VSTE9QVF9GVFBfVVNFX1BSRVQsIGFuZCBpdCBpcyBhbHNvCiAgdXNhYmxlIGZyb20gdGhlIGN1cmwgdG9vbCB3aXRoIC0tZnRwLXByZXQuIFVzaW5nIHRoaXMgb3B0aW9uIG9uIGEgc2VydmVyCiAgdGhhdCBkb2Vzbid0IHN1cHBvcnQgdGhpcyBjb21tYW5kIHdpbGwgbWFrZSBsaWJjdXJsIGZhaWwuCgogIEkgYWRkZWQgdGVzdCBjYXNlcyAxMTA3IGFuZCAxMTA4IHRvIHZlcmlmeSB0aGUgZnVuY3Rpb25hbGl0eS4KCiAgVGhlIFBSRVQgY29tbWFuZCBpcyBkb2N1bWVudGVkIGF0CiAgaHR0cDovL3d3dy5kcmZ0cGQub3JnL2luZGV4LnBocC9EaXN0cmlidXRlZF9QQVNWCgpZYW5nIFRzZSAoMzAgRGVjIDIwMDkpCi0gU3RldmVuIE0uIFNjaHdlZGEgaW1wcm92ZWQgVk1TIGJ1aWxkIHN5c3RlbSwgYW5kIENyYWlnIEEuIEJlcnJ5IGhlbHBlZAogIHdpdGggdGhlIHBhdGNoIGFuZCB0ZXN0aW5nLgoKRGFuaWVsIFN0ZW5iZXJnICgyNiBEZWMgMjAwOSkKLSBSZW5hdG8gQm90ZWxobyBhbmQgUGV0ZXIgUGVudGNoZXYgYnJvdWdodCBhIHBhdGNoIHRoYXQgbWFrZXMgdGhlIGxpYmN1cmwKICBoZWFkZXJzIHdvcmsgY29ycmVjdGx5IGV2ZW4gb24gRnJlZUJTRCBzeXN0ZW1zIGJlZm9yZSB2OC4KCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI5MTY5MTUpCgpEYW5pZWwgU3RlbmJlcmcgKDE3IERlYyAyMDA5KQotIERhdmlkIEJ5cm9uIGZpeGVkIEN1cmxfb3NzbF9jbGVhbnVwIHRvIGFjdHVhbGx5IGNhbGwgRU5HSU5FX2NsZWFudXAgd2hlbgogIGF2YWlsYWJsZS4KCi0gRm9sbG93LXVwIGZpeCBmb3IgdGhlIHByb3h5IGZpeCBJIGRpZCBmb3IgSm9uIE5lbHNvbidzIGJ1Zy4gSXQgdHVybmVkIG91dCBJCiAgd2FzIGEgYml0IHRvbyBxdWljayBhbmQgYnJva2UgdGVzdCBjYXNlIDExMDEgd2l0aCB0aGF0IGNoYW5nZS4gVGhlIG9yZGVyIG9mCiAgc29tZSBvZiB0aGUgc2V0dXBzIGlzIHNlbnNpdGl2ZS4gSSBub3cgY2hhbmdlZCBpdCBzbGlnaHRseSBhZ2FpbiB0byBtYWtlCiAgc3VyZSB3ZSBkbyB0aGVtIGluIHRoaXMgb3JkZXI6CgogIDEgLSBwYXJzZSBVUkwgYW5kIGZpZ3VyZSBvdXQgd2hhdCBwcm90b2NvbCBpcyB1c2VkIGluIHRoZSBVUkwKICAyIC0gcHJlcGVuZCBwcm90b2NvbDovLyB0byBVUkwgaWYgbWlzc2luZwogIDMgLSBwYXJzZSBuYW1lK3Bhc3N3b3JkIG9mZiBVUkwsIHdoaWNoIG5lZWRzIHRvIGtub3cgd2hhdCBwcm90b2NvbCBpcyB1c2VkCiAgICAgIChzaW5jZSBvbmx5IHNvbWUgYWxsb3dzIGZvciBuYW1lK3Bhc3N3b3JkIGluIHRoZSBVUkwpCiAgNCAtIGZpZ3VyZSBvdXQgaWYgYSBwcm94eSBzaG91bGQgYmUgdXNlZCBzZXQgYnkgYW4gb3B0aW9uCiAgNSAtIGlmIG5vIHByb3h5IG9wdGlvbiwgY2hlY2sgcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGVzCiAgNiAtIHJ1biB0aGUgcHJvdG9jb2wtc3BlY2lmaWMgc2V0dXAgZnVuY3Rpb24sIHdoaWNoIG5lZWRzIHRvIGhhdmUgdGhlIHByb3h5CiAgICAgIGFscmVhZHkgc2V0CgpEYW5pZWwgU3RlbmJlcmcgKDE1IERlYyAyMDA5KQotIEpvbiBOZWxzb24gZm91bmQgYSByZWdyZXNzaW9uIHRoYXQgdHVybmVkIG91dCB0byBiZSBhIGZsYXcgaW4gaG93IGxpYmN1cmwKICBkZXRlY3RzIGFuZCB1c2VzIHByb3hpZXMgYmFzZWQgb24gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4gSWYgdGhlIHByb3h5CiAgd2FzIGdpdmVuIGFzIGFuIGV4cGxpY2l0IG9wdGlvbiBpdCB3b3JrZWQsIGJ1dCBkdWUgdG8gdGhlIHNldHVwIG9yZGVyCiAgbWlzdGFrZSBwcm94aWVzIHdvdWxkIG5vdCBiZSB1c2VkIGZpbmUgZm9yIGEgZmV3IHByb3RvY29scyB3aGVuIHBpY2tlZCB1cAogIGZyb20gJ1twcm90b2NvbF1fcHJveHknLiBPYnZpb3VzbHkgdGhpcyBicm9rZSBhZnRlciA3LjE5LjQuIEkgbm93IGFsc28gYWRkZWQKICB0ZXN0IGNhc2UgMTEwNiB0aGF0IHZlcmlmaWVzIHRoaXMgZnVuY3Rpb25hbGl0eS4KCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI5MTM4ODYpCgpEYW5pZWwgU3RlbmJlcmcgKDEyIERlYyAyMDA5KQotIElNQVAsIFBPUDMgYW5kIFNNVFAgc3VwcG9ydCBhbmQgdGhlaXIgVExTIHZlcnNpb25zIChpbmNsdWRpbmcgSU1BUFMsIFBPUDNTCiAgYW5kIFNNVFBTKSBhcmUgbm93IHN1cHBvcnRlZC4gVGhlIGN1cnJlbnQgc3RhdGUgbWF5IG5vdCB5ZXQgYmUgc29saWQsIGJ1dAogIHRoZSBmb3VuZGF0aW9uIGlzIGluIHBsYWNlIGFuZCB0aGUgdGVzdCBzdWl0ZSBoYXMgc29tZSBpbml0aWFsIHN1cHBvcnQgZm9yCiAgdGhlc2UgcHJvdG9jb2xzLiBXb3JrIHdpbGwgbm93IHBlcnN1ZSB0byBtYWtlIHRoZW0gbmljZSBsaWJjdXJsIGNpdGl6ZW5zCiAgdW50aWwgcmVsZWFzZS4KCiAgVGhlIHdvcmsgd2l0aCBzdXBwb3J0aW5nIHRoZXNlIG5ldyBwcm90b2NvbHMgd2FzIHNwb25zb3JlZCBieQogIG5ldHdvcmtpbmc0YWxsLmNvbSAtIHRoYW5rcyEKCkRhbmllbCBTdGVuYmVyZyAoMTAgRGVjIDIwMDkpCi0gU2llZ2ZyaWVkIEd5dXJpY3NrbyBmb3VuZCBvdXQgdGhhdCB0aGUgY3VybCBtYW51YWwgc2FpZCAtLXJldHJ5IHdvdWxkIHJldHJ5CiAgb24gRlRQIGVycm9ycyBpbiB0aGUgdHJhbnNpZW50IDV4eCByYW5nZS4gVHJhbnNpZW50IEZUUCBlcnJvcnMgYXJlIGluIHRoZQogIDR4eCByYW5nZS4gVGhlIGNvZGUgaXRzZWxmIG9ubHkgdHJpZWQgb24gNXh4IGVycm9ycyB0aGF0IG9jY3VyZWQgX2F0IGxvZ2luXy4KICBOb3cgdGhlIHJldHJ5IGNvZGUgcmV0cmllcyBvbiBhbGwgRlRQIHRyYW5zZmVyIGZhaWx1cmVzIHRoYXQgZW5kZWQgd2l0aCBhCiAgNHh4IHJlc3BvbnNlLgoKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjkxMTI3OSkKCi0gQ29uc3RhbnRpbmUgU2FwdW50emFraXMgZmlndXJlZCBvdXQgYSBjYXNlIHdoaWNoIHdvdWxkIGxlYWQgdG8gbGliY3VybAogIGFjY2Vzc2luZyBhbHJlZHkgZnJlZWQgbWVtb3J5IGFuZCB0aHVzIGNyYXNoIHdoZW4gdXNpbmcgSFRUUFMgKHdpdGgKICBPcGVuU1NMKSwgbXVsdGkgaW50ZXJmYWNlIGFuZCB0aGUgQ1VSTE9QVF9ERUJVR0ZVTkNUSU9OIGFuZCBhIGNlcnRhaW4gb3JkZXIKICBvZiBjbGVhbmluZyB0aGluZ3MgdXAuIEkgZml4ZWQgaXQuCgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yOTA1MjIwKQoKRGFuaWVsIFN0ZW5iZXJnICg3IERlYyAyMDA5KQotIE1hcnRpbiBTdG9yc2pvIG1hZGUgbGliY3VybCB1c2UgdGhlIEV4cGVjdDogMTAwLWNvbnRpbnVlIGhlYWRlciBmb3IgcG9zdHMKICB3aXRoIHVua25vd24gc2l6ZS4gUHJldmlvdXNseSBpdCB3YXMgb25seSB1c2VkIGZvciBwb3N0cyB3aXRoIGEga25vd24gc2l6ZQogIGxhcmdlciB0aGFuIDEwMjQgYnl0ZXMuCgpEYW5pZWwgU3RlbmJlcmcgKDEgRGVjIDIwMDkpCi0gSWYgdGhlIEV4cGVjdDogMTAwLWNvbnRpbnVlIGhlYWRlciBoYXMgYmVlbiBzZXQgYnkgdGhlIGFwcGxpY2F0aW9uIHRocm91Z2gKICBjdXJsX2Vhc3lfc2V0b3B0IHdpdGggQ1VSTE9QVF9IVFRQSEVBREVSLCB0aGUgbGlicmFyeSBzaG91bGQgc2V0CiAgZGF0YS0+c3RhdGUuZXhwZWN0MTAwaGVhZGVyIGFjY29yZGluZ2x5IC0gdGhlIGN1cnJlbnQgY29kZSAoaW4gNy4xOS43IGF0CiAgbGVhc3QpIGRvZXNuJ3QgaGFuZGxlIHRoaXMgcHJvcGVybHkuIE1hcnRpbiBTdG9yc2pvIHByb3ZpZGVkIHRoZSBmaXghCgpZYW5nIFRzZSAoMjggTm92IDIwMDkpCi0gQWRkZWQgRGlmZmllLUhlbGxtYW4gcGFyYW1ldGVycyB0byBzZXZlcmFsIHRlc3QgaGFybmVzcyBjZXJ0aWZpY2F0ZSBmaWxlcyBpbgogIFBFTSBmb3JtYXQuIFJlcXVpcmVkIGJ5IHNldmVyYWwgc3R1bm5lbCB2ZXJzaW9ucyB1c2VkIGJ5IG91ciB0ZXN0IGhhcm5lc3MuCgpEYW5pZWwgU3RlbmJlcmcgKDI4IE5vdiAyMDA5KQotIE1hcmt1cyBLb2V0dGVyIHByb3ZpZGVkIGEgcG9saXNoZWQgYW5kIHVwZGF0ZWQgdmVyc2lvbiBvZiBDaGFkIE1vbnJvZSdzIFRGVFAKICByZXdvcmsgcGF0Y2ggdGhhdCBub3cgaW50ZWdyYXRlcyBURlRQIHByb3Blcmx5IGludG8gbGliY3VybCBzbyB0aGF0IGl0IGNhbgogIGJlIHVzZWQgbm9uLWJsb2NraW5nIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSBhbmQgbW9yZS4gQkxLU0laRSBhbHNvIHdvcmtzLgoKICBUaGUgLS10ZnRwLWJsa3NpemUgb3B0aW9uIHdhcyBhZGRlZCB0byBhbGxvdyBzZXR0aW5nIHRoZSBURlRQIEJMS1NJWkUgZnJvbQogIHRoZSBjb21tYW5kIGxpbmUuCgpEYW5pZWwgU3RlbmJlcmcgKDI2IE5vdiAyMDA5KQotIEV4dGVuZGVkIGFuZCBmaXhlZCB0aGUgY2hhbmdlIEkgZGlkIG9uIERlYyAxMSBmb3IgdGhlIHRoZSBwcm9ncmVzcwogIG1ldGVyL2NhbGxiYWNrIGR1cmluZyBGVFAgY29tbWFuZC9yZXNwb25zZSBzZXF1ZW5jZXMuIEl0IHR1cm5lZCBvdXQgaXQgd2FzCiAgcmVhbGx5IGxhbWUgYmVmb3JlIGFuZCBub3cgdGhlIHByb2dyZXNzIG1ldGVyIFNIT1VMRCBnZXQgY2FsbGVkIGF0IGxlYXN0CiAgb25jZSBwZXIgc2Vjb25kLgoKRGFuaWVsIFN0ZW5iZXJnICgyMyBOb3YgMjAwOSkKLSBCam9ybiBBdWd1c3Rzc29uIHJlcG9ydGVkIGEgYnVnIHdoaWNoIG1hZGUgY3VybCBub3QgcmVwb3J0IGFueSBwcm9ibGVtcyBldmVuCiAgdGhvdWdoIGl0IGZhaWxlZCB0byB3cml0ZSBhIHZlcnkgc21hbGwgZG93bmxvYWQgdG8gZGlzayAoZG9uZSBpbiBhIHNpbmdsZQogIGZ3cml0ZSBjYWxsKS4gSXQgdHVybmVkIG91dCB0byBiZSBiZWNhdXNlIGZ3cml0ZSgpIHJldHVybmVkIHN1Y2Nlc3MsIGJ1dAogIHRoZXJlIHdhcyBpbnN1ZmZpY2llbnQgZXJyb3ItY2hlY2tpbmcgZm9yIHRoZSBmY2xvc2UoKSBjYWxsIHdoaWNoIHRyaWNrZWQKICBjdXJsIHRvIGJlbGlldmUgdGhpbmdzIHdlcmUgZmluZS4KCllhbmcgVHNlICgyMyBOb3YgMjAwOSkKLSBEYXZpZCBCeXJvbiBtb2RpZmllZCBNYWtlZmlsZS5kaXN0IHZjOCBhbmQgdmM5IHRhcmdldHMgaW4gb3JkZXIgdG8gYWxsb3cKICBmaW5lciBncmFudWxhcml0eSBjb250cm9sIHdoZW4gZ2VuZXJhdGluZyBzcmMgYW5kIGxpYiBtYWtlZmlsZXMuCgpZYW5nIFRzZSAoMjIgTm92IDIwMDkpCi0gSSBtb2RpZmllZCBjb25maWd1cmUgdG8gZm9yY2UgcmVtb3ZhbCBvZiB0aGUgY3VybGJ1aWxkLmggZmlsZSBpbmNsdWRlZCBpbgogIGRpc3RyaWJ1dGlvbiB0YXJiYWxscyBmb3IgdXNlIGJ5IG5vbi1jb25maWd1cmUgc3lzdGVtcy4gQXMgaW50ZW5kZWQsIHRoaXMKICB3b3VsZCBnZXQgb3ZlcndyaXRlbiB3aGVuIGRvaW5nIGluLXRyZWUgYnVpbGRzLiBCdXQgVlBBVEggYnVpbGRzIHdvdWxkIGVuZAogIGhhdmluZyB0d28gY3VybGJ1aWxkLmggZmlsZXMsIG9uZSBpbiB0aGUgc291cmNlIHRyZWUgYW5kIGFub3RoZXIgaW4gdGhlCiAgYnVpbGQgdHJlZS4gV2l0aCB0aGUgbW9kaWZpY2F0aW9uIEkgaW50cm9kdWNlZCA1IE5vdiAyMDA5IHRoaXMgY291bGQgYmVjb21lCiAgYW4gaXNzdWUgd2hlbiBydW5uaW5nIGxpYmN1cmwncyB0ZXN0IHN1aXRlLgoKRGFuaWVsIFN0ZW5iZXJnICgyMCBOb3YgMjAwOSkKLSBDb25zdGFudGluZSBTYXB1bnR6YWtpcyBpZGVudGlmaWVkIGEgd3JpdGUgYWZ0ZXIgY2xvc2UsIGFzIHRoZSBzb2NrZXRzIHdlcmUKICBjbG9zZWQgYnkgbGliY3VybCBiZWZvcmUgdGhlIFNTTCBsaWIgd2VyZSBzaHV0ZG93biBhbmQgdGhleSBtYXkgd3JpdGUgdG8gaXRzCiAgc29ja2V0LiBEZXRlY3RlZCB0byBhdCBsZWFzdCBoYXBwZW4gd2l0aCBPcGVuU1NMIGJ1aWxkcy4KCi0gSmFkIENoYW1jaGFtIHBvaW50ZWQgb3V0IGEgYnVnIHdpdGggY29ubmVjdGlvbiByZS11c2UuIElmIGEgY29ubmVjdGlvbiBoYWQKICBDVVJMT1BUX0hUVFBQUk9YWVRVTk5FTCBlbmFibGVkIG92ZXIgYSBwcm94eSwgYSBzdWJzZXF1ZW50IHJlcXVlc3QgdXNpbmcgdGhlCiAgc2FtZSBwcm94eSB3aXRoIHRoZSB0dW5uZWwgb3B0aW9uIGRpc2FibGVkIHdvdWxkIHN0aWxsIHdyb25nbHkgcmUtdXNlIHRoYXQKICBwcmV2aW91cyBjb25uZWN0aW9uIGFuZCB0aGUgb3V0Y29tZSB3b3VsZCBvbmx5IGJlIGJhZG5lc3MuCgpZYW5nIFRzZSAoMTggTm92IDIwMDkpCi0gSSBtb2RpZmllZCB0aGUgbWVtb3J5IHRyYWNraW5nIHN5c3RlbSB0byBtYWtlIGl0IGludG9sZXJhbnQgd2l0aCB6ZXJvIHNpemVkCiAgbWFsbG9jKCksIGNhbGxvYygpIGFuZCByZWFsbG9jKCkgZnVuY3Rpb24gY2FsbHMuCgpEYW5pZWwgU3RlbmJlcmcgKDE3IE5vdiAyMDA5KQotIENvbnN0YW50aW5lIFNhcHVudHpha2lzIHByb3ZpZGVkIGFub3RoZXIgZml4IGZvciB0aGUgRE5TIGNhY2hlIHRoYXQgY291bGQKICBlbmQgdXAgd2l0aCBlbnRyaWVzIHRoYXQgd291bGRuJ3QgdGltZS1vdXQ6CgogIDEuIFNldCB1cCBhIGZpcnN0IHdlYiBzZXJ2ZXIgdGhhdCByZWRpcmVjdHMgKDMwNykgdG8gYSBodHRwOi8vc2VydmVyOnBvcnQKICAgICB0aGF0J3MgZG93bgogIDIuIEhhdmUgY3VybCBjb25uZWN0IHRvIHRoZSBmaXJzdCB3ZWIgc2VydmVyIHVzaW5nIGN1cmwgbXVsdGkKCiAgQWZ0ZXIgdGhlIGN1cmxfZWFzeV9jbGVhbnVwIGNhbGwsIHRoZXJlIHdpbGwgYmUgY3VybCBkbnMgZW50cmllcyBoYW5naW5nCiAgYXJvdW5kIHdpdGggaW5fdXNlICE9IDAuCgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODkxNTkxKQoKLSBNYXJjIEtsZWluZS1CdWRkZSBmaXhlZDogY3VybCBzYXZlZCB0aGUgTERGTEFHUyBzZXQgZHVyaW5nIGNvbmZpZ3VyZSBpbnRvCiAgaXRzIHBrZy1jb25maWcgZmlsZS4gIFNvIC1XbCBzdHVmZiBlbmRlZCB1cCBpbiB0aGUgLnBjIGZpbGUsIHdoaWNoIGlzIHJlYWxseQogIGJhZCwgYW5kIGJyZWFrcyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgLVdsIGluIG91ciBMREZMQUdTICh3aGljaCBhcmUgaW4KICBQVFhkaXN0KS4gYnVnICMyODkzNTkyIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODkzNTkyKQoKS2FtaWwgRHVka2EgKDE1IE5vdiAyMDA5KQotIERhdmlkIEJ5cm9uIGltcHJvdmVkIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIHVzZSBwa2ctY29uZmlnIHRvIGZpbmQgT3BlblNTTAogIChhbmQgaW4gcGFydGljdWxhciB0aGUgbGlzdCBvZiByZXF1aXJlZCBsaWJyYXJpZXMpIGV2ZW4gaWYgYSBwYXRoIGlzIGdpdmVuCiAgYXMgYXJndW1lbnQgdG8gLS13aXRoLXNzbAoKWWFuZyBUc2UgKDE1IE5vdiAyMDA5KQotIEkgcmVtb3ZlZCBlbmFibGUtdGhyZWFkIC8gZGlzYWJsZS10aHJlYWQgY29uZmlndXJlIG9wdGlvbi4gVGhlc2Ugd2VyZSBvbmx5CiAgcGxhY2VibyBvcHRpb25zLiBUaGUgbGlicmFyeSBpcyBhbHdheXMgYnVpbHQgYXMgdGhyZWFkIHNhZmUgYXMgcG9zc2libGUgb24KICBldmVyeSBzeXN0ZW0uCgpDbGFlcyBKYWtvYnNzb24gKDE0IE5vdiAyMDA5KQotIGN1cmwtY29uZmlnIG5vdyBhY2NlcHRzICctLWNvbmZpZ3VyZScgdG8gc2VlIHdoYXQgYXJndW1lbnRzIHdhcwogIHBhc3NlZCB0byB0aGUgY29uZmlndXJlIHNjcmlwdCB3aGVuIGJ1aWxkaW5nIGN1cmwuCgpEYW5pZWwgU3RlbmJlcmcgKDE0IE5vdiAyMDA5KQotIENsYWVzIEpha29ic3NvbiByZXN0b3JlZCB0aGUgY29uZmlndXJlIGZ1bmN0aW9uYWxpdHkgdG8gZGV0ZWN0IE5TUyB3aGVuCiAgLS13aXRoLW5zcyBpcyBzZXQgYnV0IG5vdCAieWVzIi4KCiAgSSB0aGluayB3ZSBjYW4gc3RpbGwgaW1wcm92ZSB0aGF0IHRvIGNoZWNrIGZvciBwa2ctY29uZmlnIGluIHRoYXQgcGF0aCBldGMsCiAgYnV0IGF0IGxlYXN0IHRoaXMgcGF0Y2ggYnJpbmdzIGJhY2sgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSB3ZSBoYWQgYmVmb3JlLgoKLSBDYW1pbGxlIE1vbmNlbGllciBhZGRlZCBzdXBwb3J0IGZvciB0aGUgZmlsZSB0eXBlIFNTTF9GSUxFVFlQRV9FTkdJTkUgZm9yCiAgdGhlIGNsaWVudCBjZXJ0aWZpY2F0ZS4gSXQgYWxzbyBkaXNhYmxlIHRoZSBrZXkgbmFtZSB0ZXN0IGFzIHNvbWUgZW5naW5lcwogIGNhbiBzZWxlY3QgYSBwcml2YXRlIGtleS9jZXJ0IGF1dG9tYXRpY2FsbHkgKFdoZW4gdGhlcmUgaXMgb25seSBvbmUga2V5CiAgYW5kL29yIGNlcnRpZmljYXRlIG9uIHRoZSBoYXJkd2FyZSBkZXZpY2UgdXNlZCBieSB0aGUgZW5naW5lKQoKWWFuZyBUc2UgKDE0IE5vdiAyMDA5KQotIENvbnN0YW50aW5lIFNhcHVudHpha2lzIHByb3ZpZGVkIHRoZSBmaXggdGhhdCBlbnN1cmVzIHRoYXQgYW4gU1NMIGNvbm5lY3Rpb24KICB3b24ndCBiZSByZXVzZWQgdW5sZXNzIHByb3RlY3Rpb24gbGV2ZWwgZm9yIHBlZXIgYW5kIGhvc3QgdmVyaWZpY2F0aW9uIG1hdGNoLgoKICBJIHJlZmFjdG9yZWQgaG93IHByZXByb2Nlc3NvciBzeW1ib2wgX1RIUkVBRF9TQUZFIGRlZmluaXRpb24gaXMgZG9uZS4KCkthbWlsIER1ZGthICgxMiBOb3YgMjAwOSkKLSBLZXZpbiBCYXVnaG1hbiBwcm92aWRlZCBhIGZpeCBwcmV2ZW50aW5nIGxpYmN1cmwtTlNTIGZyb20gY3Jhc2ggb24gZG91Ymx5CiAgY2xvc2VkIE5TUFIgZGVzY3JpcHRvci4gVGhlIGlzc3VlIHdhcyBoYXJkIHRvIGZpbmQsIHJlcG9ydGVkIHNldmVyYWwgdGltZXMKICBiZWZvcmUgYW5kIGFsd2F5cyBjbG9zZWQgdW5yZXNvbHZlZC4gTW9yZSBpbmZvIGF0IHRoZSBSSCBidWc6CiAgaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tLzUzNDE3NgoKLSBsaWJjdXJsLU5TUyBub3cgdHJpZXMgdG8gcmVjb25uZWN0IHdpdGggVExTIGRpc2FibGVkIGluIGNhc2UgaXQgZGV0ZWN0cwogIGEgYnJva2VuIFRMUyBzZXJ2ZXIuIEhvd2V2ZXIgaXQgZG9lcyBub3QgaGFwcGVuIGlmIFNTTCB2ZXJzaW9uIGlzIHNlbGVjdGVkCiAgbWFudWFsbHkuIFRoZSBhcHByb2FjaCB3YXMgb3JpZ2luYWxseSB0YWtlbiBmcm9tIFBTTS4gS2FzcGFyIEJyYW5kIGhlbHBlZCBtZQogIHRvIGNvbXBsZXRlIHRoZSBwYXRjaC4gT3JpZ2luYWwgYnVnIHJlcG9ydHM6CiAgaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tLzUyNTQ5NgogIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS81Mjc3NzEKCllhbmcgVHNlICgxMiBOb3YgMjAwOSkKLSBJIG1vZGlmaWVkIGNvbmZpZ3VyZSBzY3JpcHQgdG8gbWFrZSB0aGUgZ2V0YWRkcmluZm8gZnVuY3Rpb24gY2hlY2sgYWxzbwogIHZlcmlmeSBpZiB0aGUgZnVuY3Rpb24gaXMgdGhyZWFkIHNhZmUuCgpZYW5nIFRzZSAoMTEgTm92IDIwMDkpCi0gTWFyY28gTWFnZ2kgcmVwb3J0ZWQgdGhhdCBjb21waWxhdGlvbiBmYWlsZWQgd2hlbiBjb25maWd1cmVkIC0td2l0aC1nc3NhcGkKICBhbmQgR05VIEdTUyBpbnN0YWxsZWQgZHVlIHRvIGEgbWlzc2luZyBtdXR1YWwgZXhjbHVzaW9uIG9mIGhlYWRlciBmaWxlcyBpbgogIHRoZSBLZXJiZXJvcyA1IGNvZGUgcGF0aC4gSGUgYWxzbyB2ZXJpZmllZCB0aGF0IG15IHBhdGNoIHdvcmtlZCBmb3IgaGltLgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBOb3YgMjAwOSkKLSBDb25zdGFudGluZSBTYXB1bnR6YWtpcyBwb3N0ZWQgYnVnICMyODkxNTk1CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI4OTE1OTUpIHdoaWNoIGlkZW50aWZpZWQgaG93IGFuIGVudHJ5CiAgaW4gdGhlIEROUyBjYWNoZSB3b3VsZCBsaW5nZXIgdG9vIGxvbmcgaWYgdGhlIHJlcXVlc3QgdGhhdCBhZGRlZCBpdCB3YXMgaW4KICB1c2UgdGhhdCBsb25nLiBIZSBhbHNvIHByb3ZpZGVkIHRoZSBwYXRjaCB0aGF0IG5vdyBtYWtlcyBsaWJjdXJsIGNhcGFibGUgb2YKICBzdGlsbCBkb2luZyBhIHJlcXVlc3Qgd2hpbGUgdGhlIEROUyBoYXNoIGVudHJ5IG1heSBnZXQgdGltZWQgb3V0LgoKLSBDaHJpc3RpYW4gU2NobWl0eiBub3RpY2VkIHRoYXQgdGhlIHByb2dyZXNzIG1ldGVyL2NhbGxiYWNrIHdhcyBub3QgcHJvcGVybHkKICB1c2VkIGR1cmluZyB0aGUgRlRQIGNvbm5lY3Rpb24gcGhhc2UgKGFmdGVyIHRoZSBhY3R1YWwgVENQIGNvbm5lY3QpLCB3aGlsZQogIGl0IG9mIGNvdXJzZSBzaG91bGQgYmUuIEkgYWxzbyBtYWRlIHRoZSBzcGVlZCBjaGVjayBnZXQgY2FsbGVkIGNvcnJlY3RseSBzbwogIHRoYXQgcmVhbGx5IHNsb3cgc2VydmVycyB3aWxsIHRyaWdnZXIgdGhhdCBwcm9wZXJseSB0b28uCgpLYW1pbCBEdWRrYSAoNSBOb3YgMjAwOSkKLSBEcm9wcGVkIG1pc2xlYWRpbmcgdGltZW91dHMgaW4gbGliY3VybC1OU1MgYW5kIG1hZGUgc3VyZSB0aGUgU1NMIHNvY2tldCB3b3JrcwogIGluIG5vbi1ibG9ja2luZyBtb2RlLgoKWWFuZyBUc2UgKDUgTm92IDIwMDkpCi0gSSByZW1vdmVkIGxlYWRpbmcgJ2N1cmwnIHBhdGggb24gdGhlICdjdXJsYnVpbGQuaCcgaW5jbHVkZSBzdGF0ZW1lbnQgaW4KICBjdXJsLmgsIGFkanVzdGluZyBhdXRvLW1ha2VmaWxlcyBpbmNsdWRlIHBhdGgsIHRvIGVuaGFuY2UgcG9ydGFiaWxpdHkgdG8KICBPUydzIHdpdGhvdXQgYW4gb3J0aG9nb25hbCBkaXJlY3RvcnkgdHJlZSBzdHJ1Y3R1cmUgc3VjaCBhcyBPUy80MDAuCgpEYW5pZWwgU3RlbmJlcmcgKDQgTm92IDIwMDkpCi0gSSBmaXhlZCBzZXZlcmFsIHByb2JsZW1zIHdpdGggdGhlIHRyYW5zZmVyIHByb2dyZXNzIG1ldGVyLiBJdCBzaG93ZWQgdGhlCiAgd3JvbmcgcGVyY2VudGFnZSBmb3Igc21hbGwgZmlsZXMsIG1vc3Qgbm90YWJsZSBmb3IgPDEwMDAgYnl0ZXMgYW5kIGNvdWxkCiAgZWFzaWx5IGVuZCB1cCBzaG93aW5nIG1vcmUgdGhhbiAxMDAlIGF0IHRoZSBlbmQuIEl0IGFsc28gZGlkbid0IHNob3cgYW55CiAgcGVyY2VudGFnZSwgdHJhbnNmZXIgc2l6ZSBvciBlc3RpbWF0ZWQgdHJhbnNmZXIgdGltZXMgd2hlbiB0cmFuc2ZlcnJpbmcKICBsZXNzIHRoYW4gMTAwIGJ5dGVzLgoKVmVyc2lvbiA3LjE5LjcgKDQgTm92ZW1iZXIgMjAwOSkKCkRhbmllbCBTdGVuYmVyZyAoMiBOb3YgMjAwOSkKLSBBcyByZXBvcnRlZCBpbmRlcGVuZGVudCBieSBib3RoIFN0YW4gdmFuIGRlIEJ1cmd0IGFuZCBEaWRpZXIgQnJpc2Vib3VyZywKICBDVVJMSU5GT19TSVpFX0RPV05MT0FEICh0aGUgLXcgdmFyaWFibGUgc2l6ZV9kb3dubG9hZCkgZGlkbid0IHdvcmsgd2hlbgogIGdldHRpbmcgZGF0YSBmcm9tIGxkYXAhCgpEYW5pZWwgU3RlbmJlcmcgKDMxIE9jdCAyMDA5KQotIEdhYnJpZWwgS3VyaSByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9ET1dOTE9BRCBpZiB0aGUKICBkb3dubG9hZCB3YXMgMCBieXRlcywgYXMgbGliY3VybCB3b3VsZCB0aGVuIHJldHVybiB0aGUgc2l6ZSBhcyB1bmtub3duICgtMSkKICBhbmQgbm90IDAuIEkgd3JvdGUgYSBmaXggYW5kIHRlc3QgY2FzZSA1NjYgdG8gdmVyaWZ5IGl0LgoKRGFuaWVsIFN0ZW5iZXJnICgzMCBPY3QgMjAwOSkKLSBMaXphIEFsZW5jaGVyeSBtZW50aW9uZWQgYSBwcm9ibGVtIHdpdGggcmUtdXNlZCBTQ1AgY29ubmVjdGlvbiB3aGVuIGEgYmFkCiAgYXV0aCBpcyB1c2VkLCBhcyBpdCBjYXVzZWQgYSBjcmFzaC4gSSBmYWlsZWQgdG8gcmVwZWF0IHRoZSBpc3N1ZSwgYnV0IHN0aWxsCiAgbWFkZSBhIGNoYW5nZSB0aGF0IG5vdyBmb3JjZXMgdGhlIFRDUCBjb25uZWN0aW9uIHVzZWQgZm9yIGEgZnJlZWQgU0NQCiAgc2Vzc2lvbiB0byBnZXQgY2xvc2VkIGFuZCBub3QgYmUgcmUtdXNlZC4KCi0gIlRvbSIgcG9zdGVkIGEgYnVnIHJlcG9ydCB0aGF0IG1lbnRpb25lZCBob3cgbGliY3VybCBkaWQgd3Jvbmcgd2hlbiBkb2luZyBhCiAgUE9TVCB1c2luZyBhIHJlYWQgY2FsbGJhY2ssIHdpdGggRGlnZXN0IGF1dGhlbnRpY2F0aW9uIGFuZAogICJUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZCIgZW5mb3JjZWQuICBJIHdvdWxkIHRoZW4gY2F1c2UgdGhlIGZpcnN0IHJlcXVlc3QKICB0byBiZSB3cm9uZ2x5IHNlbnQgYW5kIHRoZW4gYmFzaWNhbGx5IGhhbmcgdW50aWwgdGhlIHNlcnZlciBjbG9zZWQgdGhlCiAgY29ubmVjdGlvbi4gSSBmaXhlZCB0aGUgcHJvYmxlbSBhbmQgYWRkZWQgdGVzdCBjYXNlIDU2NSB0byB2ZXJpZnkgaXQuCgpEYW5pZWwgU3RlbmJlcmcgKDI1IE9jdCAyMDA5KQotIERpbWEgQmFyc2t5IG1hZGUgdGhlIGN1cmwgY29va2llIHBhcnNlciBhY2NlcHQgY29va2llcyBldmVuIHdpdGggYmxhbmsgb3IKICB1bnBhcnNhYmxlIGV4cGlyeSBkYXRlcyBhbmQgdGhlbiB0cmVhdCB0aGVtIGFzIHNlc3Npb24gY29va2llcyAtIHByZXZpb3VzbHkKICBsaWJjdXJsIHdvdWxkIHJlamVjdCBjb29raWVzIHdpdGggYSBkYXRlIGZvcm1hdCBpdCBjb3VsZG4ndCBwYXJzZS4gUmVzZWFyY2gKICBzaG93cyB0aGF0IHRoZSBtYWpvciBicm93c2VyIHRyZWF0IHN1Y2ggY29va2llcyBhcyBzZXNzaW9uIGNvb2tpZXMuIEkKICBtb2RpZmllZCB0ZXN0IDggYW5kIDMxIHRvIHZlcmlmeSB0aGlzLgoKRGFuaWVsIFN0ZW5iZXJnICgyMSBPY3QgMjAwOSkKLSBBdHRlbXB0IHRvIHVzZSBwa2ctY29uZmlnIGZvciBmaW5kaW5nIG91dCBsaWJzc2gyIGluc3RhbGxhdGlvbiBkZXRhaWxzCiAgZHVyaW5nIGNvbmZpZ3VyZS4KCi0gQSBwYXRjaCBpbiBidWcgcmVwb3J0ICMyODgzMTc3IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODgzMTc3KQogIGJ5IEpvaGFuIHZhbiBTZWxzdCBpbnRyb2R1Y2VkIHRoZSAtLWNybGZpbGUgb3B0aW9uIHRvIGN1cmwsIHdoaWNoIG1ha2VzIGN1cmwKICB0ZWxsIGxpYmN1cmwgYWJvdXQgYSBmaWxlIHdpdGggQ1JMIChjZXJ0aWZpY2F0ZSByZXZvY2F0aW9uIGxpc3QpIGRhdGEgdG8KICByZWFkLgoKRGFuaWVsIFN0ZW5iZXJnICgxOCBPY3QgMjAwOSkKLSBSYXkgRGFzc2VuIHByb3ZpZGVkIGEgcGF0Y2ggaW4gRGViaWFuJ3MgYnVnIHRyYWNrZXIgKGJ1ZyBudW1iZXIgIzU1MTQ2MSkKICB0aGF0IG5vdyBtYWtlcyBjdXJsX2dldGRhdGUoMykgYWN0dWFsbHkgaGFuZGxlcyBSRkMgODIyIGZvcm1hdHRlZCBkYXRlcyB0aGF0CiAgdXNlIHRoZSAic2luZ2xlIGxldHRlciBtaWxpdGFyeSB0aW1lem9uZXMiLgogIGh0dHA6Ly93d3cucmZjLXJlZi5vcmcvUkZDLVRFWFRTLzgyMi9jaGFwdGVyNS5odG1sIGhhcyB0aGUgZGV0YWlscy4KCi0gRml4ZWQgbWVtb3J5IGxlYWsgaW4gdGhlIFNDUC9TRlRQIGNvZGUgYXMgaXQgbmV2ZXIgZnJlZWQgdGhlIGtub3duaG9zdHMKICBkYXRhIQoKLSBKb2huIERlbm5pcyBmaWxlZCBidWcgcmVwb3J0ICMyODczNjY2CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI4NzM2NjYpIHdoaWNoIGlkZW50aWZpZWQgYSBwcm9ibGVtCiAgd2hpY2ggbWFkZSBsaWJjdXJsIGxvb3AgaW5maW5pdGVseSB3aGVuIGdpdmVuIGluY29ycmVjdCBjcmVkZW50aWFscyB3aGVuCiAgdXNpbmcgSFRUUCBHU1MgbmVnb3RpYXRlIGF1dGhlbnRpY2F0aW9uLiBIZSBhbHNvIHByb3ZpZGVkIGEgc21hbGwgYW5kIHNpbXBsZQogIHBhdGNoIGZvciBpdC4KCi0gS2V2aW4gQmF1Z2htYW4gZm91bmQgYSBkb3VibGUgY2xvc2UoKSBwcm9ibGVtIHdpdGggbGliY3VybC1OU1MsIGFzIHdoZW4KICBsaWJjdXJsIGNhbGxlZCBOU1MgdG8gY2xvc2UgdGhlIFNTTCAic2Vzc2lvbiIgaXQgYWxzbyBjbG9zZWQgdGhlIGFjdHVhbAogIHNvY2tldC4KCllhbmcgVHNlICgxNyBPY3QgMjAwOSkKLSBCdWcgcmVwb3J0ICMyODY2NzI0IGluZGljYXRlZAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODY2NzI0KSB0aGF0IGN1cmwgb24gV2luZG93cyBmYWlsZWQKICB3aGVuIHdyaXRpbmcgZmlsZXMgd2hvc2UgZmlsZSBuYW1lcyBvcmlnaW5hbGx5IGNvbnRhaW5lZCBjaGFyYWN0ZXJzIHdoaWNoCiAgYXJlIG5vdCB2YWxpZCBmb3IgZmlsZSBuYW1lcyBvbiBXaW5kb3dzLiBEYW4gRmFuZHJpY2ggcHJvdmlkZWQgYW4gaW5pdGlhbAogIHBhdGNoIGFuZCBhbm90aGVyIHJldmlzZWQgb25lIHRvIGZpeCB0aGlzIGlzc3VlLgoKRGFuaWVsIFN0ZW5iZXJnICgxIE9jdCAyMDA5KQotIFRvbSBNdWVsbGVyIGNvcnJlY3RseSByZXBvcnRlZCBpbiBidWcgcmVwb3J0ICMyODcwMjIxCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI4NzAyMjEpIHRoYXQgbGliY3VybCByZXR1cm5lZCBhbgogIGluY29ycmVjdCByZXR1cm4gY29kZSBmcm9tIHRoZSBpbnRlcm5hbCB0cnluZXh0aXAoKSBmdW5jdGlvbiB3aGljaCBjYXVzZWQKICBoaW0gZ3JpZWYuIFRoaXMgaXMgYSByZWdyZXNzaW9uIHRoYXQgd2FzIGludHJvZHVjZWQgaW4gNy4xOS4xIGFuZCBJIGZpbmQgaXQKICBzdHJhbmdlIGl0IGhhc24ndCBoaXQgdXMgaGFyZGVyLCBidXQgSSB3b24ndCBwZXJzdWUgaW50byBmaWd1cmluZyBvdXQKICBleGFjdGx5IHdoeS4KCi0gQ29uc3RhbnRpbmUgU2FwdW50emFraXM6IFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHdpbGwgYWx3YXlzIHNldAogIFNPX1NOREJVRiB0byBDVVJMX1dSSVRFX1NJWkUgZXZlbiBpZiB0aGUgU09fU05EQlVGIHN0YXJ0cyBvdXQgbGFyZ2VyLiAgVGhlCiAgcGF0Y2ggZG9lc24ndCBkbyBhIHNldHNvY2tvcHQgaWYgU09fU05EQlVGIGlzIGFscmVhZHkgZ3JlYXRlciB0aGFuCiAgQ1VSTF9XUklURV9TSVpFLiBUaGlzIHNob3VsZCBoZWxwIGZvbGtzIHdobyBoYXZlIHNldCB1cCB0aGVpciBjb21wdXRlciB3aXRoCiAgbGFyZ2Ugc2VuZCBidWZmZXJzLgoKRGFuaWVsIFN0ZW5iZXJnICgyNyBTZXAgMjAwOSkKLSBJIGludHJvZHVjZWQgYSBtYXhpbXVtIGxpbWl0IGZvciByZWNlaXZlZCBIVFRQIGhlYWRlcnMuIEl0IGlzIGNvbnRyb2xsZWQgYnkKICB0aGUgZGVmaW5lIENVUkxfTUFYX0hUVFBfSEVBREVSIHdoaWNoIGlzIGV2ZW4gZXhwb3NlZCBpbiB0aGUgcHVibGljIGhlYWRlcgogIGZpbGUgdG8gYWxsb3cgZm9yIHVzZXJzIHRvIGZhaXJseSBlYXN5IHJlYnVpbGQgbGliY3VybCB3aXRoIGEgbW9kaWZpZWQKICBsaW1pdC4gVGhlIHJhdGlvbmFsZSBmb3IgYSBmaXhlZCBsaW1pdCBpcyB0aGF0IGxpYmN1cmwgaXMgcmVhbGxvYygpaW5nIGEKICBidWZmZXIgdG8gYmUgYWJsZSB0byBwdXQgYSBmdWxsIGhlYWRlciBpbnRvIGl0LCBzbyB0aGF0IGl0IGNhbiBjYWxsIHRoZQogIGhlYWRlciBjYWxsYmFjayB3aXRoIHRoZSBlbnRpcmUgaGVhZGVyLCBidXQgdGhhdCBhbHNvIHJpc2sgZ2V0dGluZyBpdCBpbnRvCiAgdHJvdWJsZSBpZiBhIHNlcnZlciBieSBtaXN0YWtlIG9yIHdpbGxpbmdseSBzZW5kcyBhIGhlYWRlciB0aGF0IGlzIG1vcmUgb3IKICBsZXNzIHdpdGhvdXQgYW4gZW5kLiBUaGUgbGltaXQgaXMgc2V0IHRvIDEwMEsuCgpEYW5pZWwgU3RlbmJlcmcgKDI2IFNlcCAyMDA5KQotIEpvaG4gUC4gTWNDYXNrZXkgcG9zdGVkIGEgYnVnIHJlcG9ydCB0aGF0IHNob3dlZCBob3cgbGliY3VybCBkaWQgd3Jvbmcgd2hlbgogIHNhdmluZyByZWNlaXZlZCBjb29raWVzIHdpdGggbm8gZ2l2ZW4gcGF0aCwgaWYgdGhlIHBhdGggaW4gdGhlIHJlcXVlc3QgaGFkIGEKICBxdWVyeSBwYXJ0LiBUaGF0IGlzIG1lYW5zIGEgcXVlc3Rpb24gbWFyayAoPykgYW5kIGNoYXJhY3RlcnMgb24gdGhlIHJpZ2h0CiAgc2lkZSBvZiB0aGF0LiBJIHdyb3RlIHRlc3QgY2FzZSAxMTA1IGFuZCBmaXhlZCB0aGlzIHByb2JsZW0uCgpLYW1pbCBEdWRrYSAoMjYgU2VwIDIwMDkpCi0gSW1wbGVtZW50ZWQgYSBwcm90b2NvbCBpbmRlcGVuZGVudCB3YXkgdG8gc3BlY2lmeSBibG9ja2luZyBkaXJlY3Rpb24sIHVzZWQgYnkKICB0cmFuc2Zlci5jIGZvciBibG9ja2luZy4gSXQgaXMgY3VycmVudGx5IHVzZWQgb25seSBieSBTQ1AgYW5kIFNGVFAgcHJvdG9jb2xzLgogIFRoaXMgZW5oYW5jZW1lbnQgcmVzb2x2ZXMgYW4gaXNzdWUgd2l0aCAxMDAlIENQVSB1c2FnZSBkdXJpbmcgU0ZUUCB1cGxvYWQsCiAgcmVwb3J0ZWQgYnkgVm91cmhleS4KCkRhbmllbCBTdGVuYmVyZyAoMjUgU2VwIDIwMDkpCi0gQ2hyaXMgTXVtZm9yZCBmaWxlZCBidWcgcmVwb3J0ICMyODYxNTg3CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI4NjE1ODcpIGlkZW50aWZ5aW5nIHRoYXQgbGliY3VybCB1c2VkCiAgdGhlIE9wZW5TU0wgZnVuY3Rpb24gWDUwOV9sb2FkX2NybF9maWxlKCkgd3JvbmdseSBhbmQgZmFpbGVkIGlmIGl0IHdvdWxkCiAgbG9hZCBhIENSTCBmaWxlIHdpdGggbW9yZSB0aGFuIG9uZSBjZXJ0aWZpY2F0ZSB3aXRoaW4uIFRoaXMgaXMgbm93IGZpeGVkLgoKRGFuaWVsIFN0ZW5iZXJnICgxNiBTZXAgMjAwOSkKLSBTdmVuIEFuZGVycyByZXBvcnRlZCB0aGF0IHdlIGludHJvZHVjZWQgYSBjZXJ0IHZlcmZpY2F0aW9uIGZsYXcgZm9yIE9wZW5TU0wtCiAgcG93ZXJlZCBsaWJjdXJsIGluIDcuMTkuNi4gSWYgdGhlcmUgd2FzIGEgWDUwOXYzIFN1YmplY3QgQWx0ZXJuYXRpdmUgTmFtZQogIGZpZWxkIGluIHRoZSBjZXJ0ZmljYXRlIGl0IGhhZCB0byBtYXRjaCBhbmQgc28gZXZlbiBpZiBub24tRE5TIGFuZCBub24tSVAKICBlbnRyeSB3YXMgcHJlc2VudCBpdCBjYXVzZWQgdGhlIHZlcmlmaWNhdGlvbiB0byBmYWlsLgoKRGFuaWVsIEZhbmRyaWNoICgxNSBTZXAgMjAwOSkKLSBNb3ZlZCB0aGUgbGlic3NoMiBjaGVja3MgYWZ0ZXIgdGhlIFNTTCBsaWJyYXJ5IGNoZWNrcy4gVGhpcyBoZWxwcyB3aGVuCiAgc3RhdGljYWxseSBsaW5raW5nIHNpbmNlIGxpYnNzaDIgbmVlZHMgdGhlIFNTTCBsaWJyYXJ5IGxpbmsgZmxhZ3MgdG8gYmUKICBzZXQgdXAgYWxyZWFkeSB0byBzYXRpc2Z5IGl0cyBkZXBlbmRlbmNpZXMuIFRoaXMgd291bGRuJ3QgYmUgbmVjZXNzYXJ5IGlmCiAgdGhlIGxpYnNzaDIgY29uZmlndXJlIGNoZWNrIHdhcyBjaGFuZ2VkIHRvIHVzZSBwa2ctY29uZmlnIHNpbmNlIHRoZQogIC0tc3RhdGljIGZsYWcgd291bGQgYWRkIHRoZSBkZXBlbmRlbmNpZXMgYXV0b21hdGljYWxseS4KCllhbmcgVHNlICgxNCBTZXAgMjAwOSkKLSBSZXZlcnQgSm9zaHVhIEt3YW4ncyBwYXRjaCBjb21taXR0ZWQgMTEgU2VwIDIwMDkuCgogIFNvbWUgc3lzdGVtcyBwb2xsIGZ1bmN0aW9uIHNldHMgUE9MTEhVUCBpbiByZXZlbnRzIHdpdGhvdXQgc2V0dGluZwogIFBPTExJTiwgYW5kIHNldHMgUE9MTEVSUiB3aXRob3V0IHNldHRpbmcgUE9MTElOIGFuZCBQT0xMT1VULiBJbiBzb21lCiAgbGliY3VybCBjb2RlIGV4ZWN1dGlvbiBwYXRocyB0aGlzIGNvdWxkIHRyaWdnZXIgYnVzeSB3YWl0IGxvb3BzIHdpdGgKICBoaWdoIENQVSB1c2FnZSB1bnRpbCBhIHRpbWVvdXQgY29uZGl0aW9uIGFib3J0ZWQgdGhlIGxvb3AuCgogIFRoZSByZXZlcnRlZCBwYXRjaCBhZGRyZXNzZWQgdGhlIGFib3ZlIGlzc3VlIGZvciBhIHZlcnkgc3BlY2lmaWMgY2FzZSwKICB3aGVuIGF3YWl0aW5nIGMtYXJlcyB0byByZXNvbHZlLiBBIGxpYmN1cmwtd2lkZSBmaXggZm9yIEN1cmxfcG9sbCBub3cKICBzdXBlcmNlZWRzIHRoaXMgb25lLgoKR3VlbnRlciBLbmF1ZiAoMTEgU2VwIDIwMDkpCi0gSm9zaHVhIEt3YW4gcHJvdmlkZWQgYSBwYXRjaCB0byBwYXNzIFBPTExFUlIgLyBQT0xMSFVQIGJhY2sgdG8gYy1hcmVzLgogIFRoaXMgZml4ZXMgYSBsb29wIHByb2JsZW0gd2l0aCBoaWdoIENQVSB1c2FnZS4KCkRhbmllbCBTdGVuYmVyZyAoMTAgU2VwIDIwMDkpCi0gQ2xhZXMgSmFrb2Jzc29uIGZpeGVkIGEgcHJvYmxlbSB3aXRoIGNvb2tpZSBleHBpcnkgZGF0ZXMgYXQgZXhjdGx5IHRoZSBlcG9jaAogIHN0YXJ0IHNlY29uZCAiVGh1IEphbiAxIDAwOjAwOjAwIEdNVCAxOTcwIiBhcyB0aGUgZGF0ZSBwYXJzZXIgdGhlbiByZXR1cm5zIDAKICB3aGljaCBpbnRlcm5hbGx5IHRoZW4gaXMgdHJlYXRlZCBhcyBhIHNlc3Npb24gY29va2llLiBUaGF0IHBhcnRpY3VsYXIgZGF0ZQogIGlzIG5vdyBtYWRlIHRvIGdldCB0aGUgdmFsdWUgb2YgMS4KCkRhbmllbCBTdGVuYmVyZyAoMiBTZXAgMjAwOSkKLSBEYW5pZWwgSm9obnNvbiBmb3VuZCBhIGZsYXcgaW4gdGhlIGNvZGUgY29udmVydGluZyBzZnRwLWVycm9ycyB0byBsaWJjdXJsCiAgZXJyb3JzLgoKRGFuaWVsIFN0ZW5iZXJnICgxIFNlcCAyMDA5KQotIFBldGVyIFN5bHZlc3RlciBtYWRlIGEgZGVidWcgZmVhdHVyZSBmb3IgQ3VybF9yZXNvbHYoKSB0aGF0IG5vdyB3aWxsIGZvcmNlCiAgbGliY3VybCB0byByZXNvbHZlICdsb2NhbGhvc3QnIHdoYXRldmVyIG5hbWUgeW91IHVzZSBpbiB0aGUgVVJMICppZiogeW91IHNldAogIHRoZSAtLWludGVyZmFjZSBvcHRpb24gdG8gKGV4YWN0bHkpICJMb2NhbEhvc3QiLiBUaGlzIHdpbGwgZW5hYmxlIHVzIHRvCiAgd3JpdGUgdGVzdHMgZm9yIGN1c3RvbSBob3N0cyBuYW1lcyBidXQgc3RpbGwgdXNlIGEgbG9jYWwgaG9zdCBzZXJ2ZXIuCgotIGNvbmZpZ3VyZSBub3cgdHJpZXMgdG8gdXNlIHBrZy1jb25maWcgZm9yIGEgbnVtYmVyIG9mIHN1Yi1kZXBlbmRlbmNpZXMgZXZlbgogIHdoZW4gY3Jvc3MtY29tcGlsaW5nLiBUaGUga2V5IHRvIHN1Y2Nlc3MgaXMgdGhlbiB5b3UgcHJvcGVybHkgc2V0dXAKICBQS0dfQ09ORklHX1BBVEggYmVmb3JlIGludm9raW5nIGNvbmZpZ3VyZS4KCiAgSSBhbHNvIGltcHJvdmVkIGhvdyBOU1MgaXMgZGV0ZWN0ZWQgYnkgdHJ5aW5nIG5zcy1jb25maWcgaWYgcGtnLWNvbmZpZyBpc24ndAogIHByZXNlbnQsIGFuZCBhcyBhIGxhc3QgcmVzb3J0IGp1c3QgdXNlIHRoZSBsaWIgbmFtZSBhbmQgZm9yY2UgdGhlIHVzZXIgdG8KICBzZXR1cCB0aGUgTElCUy9MREZMQUdTL0NGTEFHUyBldGMgcHJvcGVybHkuIFRoZSBwcmV2aW91cyBsYXN0IHJlc29ydCB3b3VsZAogIGFkZCBhIHJhbmdlIG9mIHZhcmlvdXMgbGlicyB0aGF0IHdvdWxkIGFsbW9zdCBuZXZlciBiZSBxdWl0ZSBjb3JyZWN0LgoKRGFuaWVsIFN0ZW5iZXJnICgzMSBBdWcgMjAwOSkKLSBXaGVuIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2l0aCBGVFAgYW5kIHlvdSBhc2tlZCBmb3IgTk9CT0RZLCB5b3UgZGlkIG5vCiAgUVVPVEUgY29tbWFuZHMgYW5kIHRoZSByZXF1ZXN0IHVzZWQgdGhlIHNhbWUgcGF0aCBhcyB0aGUgY29ubmVjdGlvbiBoYWQKICBhbHJlYWR5IGNoYW5nZWQgdG8sIGl0IHdvdWxkIGRlY2lkZSB0aGF0IG5vIGNvbW1hbmRzIHdvdWxkIGJlIG5lY2Vzc2FyeSBmb3IKICB0aGUgIkRPIiBhY3Rpb24gYW5kIHRoYXQgd2FzIG5vdCBoYW5kbGVkIHByb3Blcmx5IGJ1dCBsaWJjdXJsIHdvdWxkIGluc3RlYWQKICBoYW5nLgoKS2FtaWwgRHVka2EgKDI4IEF1ZyAyMDA5KQotIEltcHJvdmVkIGVycm9yIG1lc3NhZ2UgZm9yIG5vdCBtYXRjaGluZyBjZXJ0aWZpY2F0ZSBzdWJqZWN0IG5hbWUgaW4KICBsaWJjdXJsLU5TUy4gT3JpZ2luYWxseSByZXBvcnRlZCBhdDoKICBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTUxNjA1NiNjOQoKUGF0cmljayBNb25uZXJhdCAoMjQgQXVnIDIwMDkpCi0gSW50cm9kdWNlZCBhIFNZU1QtYmFzZWQgdGVzdCB0byBwcm9wZXJseSBzZXQtdXAgbmFtZSBmb3JtYXQgd2hlbiBkZWFsaW5nCiAgd2l0aCB0aGUgT1MvNDAwIEZUUCBzZXJ2ZXIuCgotIEZpeGVkIGFuIGZ0cF9yZWFkcmVzcCgpIGJ1ZyBwcmV2ZW50aW5nIGRldGVjdGlvbiBvZiBmYWlsaW5nIGNvbnRyb2wgc29ja2V0CiAgYW5kIGNhdXNpbmcgRlRQIGNsaWVudCB0byBsb29wIGZvcmV2ZXIuCgpEYW5pZWwgU3RlbmJlcmcgKDI0IEF1ZyAyMDA5KQotIE1hcmMgZGUgQnJ1aW4gcG9pbnRlZCBvdXQgdGhhdCBjb25maWd1cmUgLS13aXRoLWdudXRscz1QQVRIIGRpZG4ndCB3b3JrCiAgcHJvcGVybHkgYW5kIHByb3ZpZGVkIGEgZml4LiBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODQzMDA4CgotIEVyaWMgV29uZyBpbnRyb2R1Y2VkIHN1cHBvcnQgZm9yIHRoZSBuZXcgb3B0aW9uIC1ULiAoZG90KSB0aGF0IG1ha2VzIGN1cmwKICByZWFkIHN0ZGluIGluIGEgbm9uLWJsb2NraW5nIGZhc2hpb24uIFRoaXMgYWxzbyBicmluZ3MgYmFjayAtVC0gKG1pbnVzKSB0bwogIHRoZSBwcmV2aW91cyBibG9ja2luZyBiZWhhdmlvciBzaW5jZSBpdCBjb3VsZCBicmVhayBzdHVmZiBmb3IgcGVvcGxlIGF0CiAgdGltZXMuCgpNaWNoYWwgTWFyZWsgKDIxIEF1ZyAyMDA5KQotIFdpdGggQ1VSTE9QVF9QUk9YWV9UUkFOU0ZFUl9NT0RFLCBhdm9pZCBzZW5kaW5nIGludmFsaWQgVVJMcyBsaWtlCiAgZnRwOi8vZXhhbXBsZS5jb207dHlwZT1pIGlmIHRoZSB1c2VyIHNwZWNpZmllZCBmdHA6Ly9leGFtcGxlLmNvbSB3aXRob3V0IHRoZQogIHNsYXNoLgoKRGFuaWVsIFN0ZW5iZXJnICgyMSBBdWcgMjAwOSkKLSBBbmRyZSBHdWliZXJ0IGRlIEJydWV0IHBvaW50ZWQgb3V0IGEgbWlzc2luZyByZXR1cm4gY29kZSBjaGVjayBmb3IgYQogIHN0cmR1cCgpIHRoYXQgY291bGQgbGVhZCB0byBzZWdmYXVsdCBpZiBpdCByZXR1cm5lZCBOVUxMLiBJIGV4dGVuZGVkIGhpcwogIHN1Z2dlc3QgcGF0Y2ggdG8gbm93IGhhdmUgQ3VybF9yZXRyeV9yZXF1ZXN0KCkgcmV0dXJuIGEgcmVndWxhciByZXR1cm4gY29kZQogIGFuZCBiZXR0ZXIgY2hlY2sgdGhhdC4KCi0gTG90cyBvZiBnb29kIHdvcmsgYnkgS3Jpc3RlciBKb2hhbnNlbiwgbW9zdGx5IHJlbGF0ZWQgdG8gcGlwZWxpbmluZzoKCiAgRml4IFNJR1NFR1Ygb24gZnJlZSdkIGVhc3lfY29ubiB3aGVuIHBpcGUgdW5leHBlY3RlZGx5IGJyZWFrcwogIEZpeCBkYXRhIGNvcnJ1cHRpb24gaXNzdWUgd2l0aCByZS1jb25uZWN0ZWQgdHJhbnNmZXJzCiAgRml4IHVzZSBhZnRlciBmcmVlIGlmIHdlJ3JlIGNvbXBsZXRlZCBidXQgZWFzeV9jb25uIG5vdCBOVUxMCgpLYW1pbCBEdWRrYSAoMTMgQXVnIDIwMDkpCi0gQ2hhbmdlZCBOU1MgY29kZSB0byBub3QgaWdub3JlIHRoZSB2YWx1ZSBvZiBzc2wudmVyaWZ5aG9zdCBhbmQgcHJvZHVjZSBtb3JlCiAgdmVyYm9zZSBlcnJvciBtZXNzYWdlcy4gT3JpZ2luYWxseSByZXBvcnRlZCBhdDoKICBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTUxNjA1NgoKRGFuaWVsIFN0ZW5iZXJnICgxMiBBdWcgMjAwOSkKLSBLYXJsIE1vZXJkZXIgZml4ZWQgdGhlIE1ha2VmaWxlLnZjKiBtYWtlZmlsZXMgdG8gaW5jbHVkZSB0aGUgbmV3IGZpbGUKICBub25ibG9jay5jIHNvIHRoYXQgdGhleSB3b3JrIGZpbmUgYWdhaW4KCi0gSSBleHBhbmRlZCB0ZXN0IDUxNyB3aXRoIGEgYnVuY2ggb2YgbW9yZSBkYXRlcyB0aGF0IG9yaWdpbmF0ZSBmcm9tIHRoZQogIENocm9tZSBicm93c2VyIHRlc3Qgc3VpdGUuIEl0IHR1cm5zIG91dCBtb3N0IG9mIHRoZW0gZ2V0IHBhcnNlZCB0aGUgc2FtZQogIHdheS4KClZlcnNpb24gNy4xOS42ICgxMiBBdWd1c3QgMjAwOSkKCkRhbmllbCBTdGVuYmVyZyAoMTIgQXVnIDIwMDkpCi0gQ2Fyc3RlbiBMYW5nZSByZXBvcnRlZCBhIGJ1ZyBhbmQgcHJvdmlkZWQgYSBwYXRjaCBmb3IgVEZUUCB1cGxvYWQgYW5kIHRoZQogIHNlbmRpbmcgb2YgdGhlIFRTSVpFIG9wdGlvbi4gSSBkb24ndCBsaWtlIGZpeGluZyBidWdzIGp1c3QgaG91cnMgYmVmb3JlCiAgYSByZWxlYXNlLCBidXQgc2luY2UgaXQgd2FzIGJyb2tlbiBhbmQgdGhlIHBhdGNoIGZpeGVzIHRoaXMgZm9yIGhpbSBJIGRlY2lkZWQKICB0byBnZXQgaXQgaW4gYW55d2F5LgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBBdWcgMjAwOSkKLSBQZXRlciBTeWx2ZXN0ZXIgbWFkZSB0aGUgSFRUUFMgdGVzdCBzZXJ2ZXIgdXNlIHNwZWNpZmljIGNlcnRpZmljYXRlcyBmb3IKICBlYWNoIHRlc3QsIHNvIHRoYXQgdGhlIHRlc3Qgc3VpdGUgY2FuIG5vdyBiZSB1c2VkIHRvIGFjdHVhbGx5IHRlc3QgdGhlCiAgdmVyaWZpY2F0aW9uIG9mIGNlcnQgbmFtZXMgZXRjLiBUaGlzIG1hZGUgYW4gZXJyb3Igc2hvdyB1cCBpbiB0aGUgT3BlblNTTC0KICBzcGVjaWZpYyBjb2RlIHdoZXJlIGl0IHdvdWxkIGF0dGVtcHQgdG8gbWF0Y2ggdGhlIENOIGZpZWxkIGV2ZW4gaWYgYQogIHN1YmplY3RBbHROYW1lIGV4aXN0cyB0aGF0IGRvZXNuJ3QgbWF0Y2guIFRoaXMgaXMgbm93IGZpeGVkIGFuZCB2ZXJpZmllZAogIGluIHRlc3QgMzExLgoKLSBCZW5idWNrIE5hc29uIHBvc3RlZCB0aGUgYnVnIHJlcG9ydCAjMjgzNTE5NgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODM1MTk2KSwgZml4aW5nIGEgZmV3IGNvbXBpbGVyCiAgd2FybmluZ3Mgd2hlbiBtaXhpbmcgaW50cyBhbmQgYm9vbHMuCgpEYW5pZWwgRmFuZHJpY2ggKDEwIEF1ZyAyMDA5KQotIEZpeGVkIGEgbWVtb3J5IGxlYWsgaW4gdGhlIEZUUCBjb2RlIGFuZCBhbiBvZmYtYnktb25lIGhlYXAgYnVmZmVyIG92ZXJmbG93LgoKRGFuaWVsIEZhbmRyaWNoICg5IEF1ZyAyMDA5KQotIEZpeGVkIHNvbWUgbWVtb3J5IGxlYWtzIGluIHRoZSBjb21tYW5kLWxpbmUgdG9vbCB0aGF0IGNhdXNlZCBtb3N0IG9mIHRoZQogIHRvcnR1cmUgdGVzdHMgdG8gZmFpbC4KCkRhbmllbCBTdGVuYmVyZyAoMiBBdWcgMjAwOSkKLSBDdXJ0IEJvZ21pbmUgcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggU05JIGVuYWJsZWQgb24gYSBwYXJ0aWN1bGFyIHNlcnZlci4gV2UKICBzaG91bGQgaW50cm9kdWNlIGFuIG9wdGlvbiB0byBkaXNhYmxlIFNOSSwgYnV0IGFzIHdlJ3JlIGluIGZlYXR1cmUgZnJlZXplCiAgbm93IEkndmUgYWRkcmVzc2VkIHRoZSBvYnZpb3VzIGJ1ZyBoZXJlIChwb2ludGVkIG91dCBieSBQZXRlciBTeWx2ZXN0ZXIpOiB3ZQogIHNob3VsZG4ndCB0cnkgdG8gZW5hYmxlIFNOSSB3aGVuIFNTTHYyIG9yIFNTTHYzIGlzIGV4cGxpY2l0bHkgc2VsZWN0ZWQuCiAgQ29kZSBmb3IgT3BlblNTTCBhbmQgR251VExTIHdhcyBmaXhlZC4gTlNTIGRvZXNuJ3Qgc2VlbSB0byBoYXZlIGEgcGFydGljdWxhcgogIG9wdGlvbiBmb3IgU05JLCBvciBhcmUgd2Ugc2ltcGx5IG5vdCB1c2luZyBpdD8KCkRhbmllbCBTdGVuYmVyZyAoMSBBdWcgMjAwOSkKLSBTY290dCBDYW50b3IgcG9zdGVkIHRoZSBidWcgcmVwb3J0ICMyODI5OTU1CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI4Mjk5NTUpIG1lbnRpb25pbmcgdGhlIHJlY2VudCBTU0wgY2VydAogIHZlcmlmaWNhdGlvbiBmbGF3IGZvdW5kIGFuZCBleHBsb2l0ZWQgYnkgTW94aWUgTWFybGluc3Bpa2UuIFRoZSBwcmVzZW50YXRpb24KICBoZSBkaWQgYXQgQmxhY2sgSGF0IGlzIGF2YWlsYWJsZSBoZXJlOgogIGh0dHBzOi8vd3d3LmJsYWNraGF0LmNvbS9odG1sL2JoLXVzYS0wOS9iaC11c2EtMDktYXJjaGl2ZXMuaHRtbCNNYXJsaW5zcGlrZQoKICBBcHBhcmVudGx5IGF0IGxlYXN0IG9uZSBDQSBhbGxvd2VkIGEgc3ViamVjdEFsdE5hbWUgb3IgQ04gdGhhdCBjb250YWluIGEKICB6ZXJvIGJ5dGUsIGFuZCB0aHVzIGNsaWVudHMgdGhhdCBhc3N1bWVkIHRoZXkgd291bGQgbmV2ZXIgaGF2ZSB6ZXJvIGJ5dGVzCiAgd2VyZSBleHBsb2l0ZWQgdG8gT0sgYSBjZXJ0aWZpY2F0ZSB0aGF0IGRpZG4ndCBhY3R1YWxseSBtYXRjaCB0aGUgc2l0ZS4gTGlrZQogIGlmIHRoZSBuYW1lIGluIHRoZSBjZXJ0IHdhcyAiZXhhbXBsZS5jb21cMHRoZWF0dWFsc2l0ZS5jb20iLCBsaWJjdXJsIHdvdWxkCiAgaGFwcGlseSB2ZXJpZnkgdGhhdCBjZXJ0IGZvciBleGFtcGxlLmNvbS4KCiAgbGliY3VybCBub3cgYmV0dGVyIHVzZXMgdGhlIGxlbmd0aCBvZiB0aGUgZXh0cmFjdGVkIG5hbWUsIG5vdCB1c2luZyB0aGUgemVybwogIHRlcm1pbmF0aW9uIGZvciBnZXR0aW5nIHRoZSBzdHJpbmcgbGVuZ3RoLgoKICBUaGlzIGZpeGluZyBvbmx5IG1hZGUgYW5kIG5lZWRlZCBpbiBPcGVuU1NMIGludGVyZmFjaW5nIGNvZGUuCgotIFRhbmd1eSBGYXV0cmUgcG9pbnRlZCBvdXQgdGhhdCBPcGVuU1NMJ3MgZnVuY3Rpb24gUkFORF9zY3JlZW4oKSAocHJlc2VudAogIG9ubHkgaW4gc29tZSBPcGVuU1NMIGluc3RhbGxzIC0gbGlrZSBvbiBXaW5kb3dzKSBpc24ndCB0aHJlYWQtc2FmZSBhbmQgd2UKICBhZ3JlZWQgdGhhdCBtb3ZpbmcgaXQgdG8gdGhlIGdsb2JhbF9pbml0KCkgZnVuY3Rpb24gaXMgYSBkZWNlbnQgd2F5IHRvIGRlYWwKICB3aXRoIHRoaXMgc2l0dWF0aW9uLgoKLSBBbGV4YW5kZXIgQmVlZGllIHByb3ZpZGVkIHRoZSBwYXRjaCBmb3IgYSBub3Byb3h5IHByb2JsZW06IElmIEkgaGF2ZSBzZXQKICBDVVJMT1BUX05PUFJPWFkgdG8gIioiLCBvciB0byBhIGhvc3QgdGhhdCBzaG91bGQgbm90IHVzZSBhIHByb3h5LCBJIGFjdHVhbGx5CiAgY291bGQgc3RpbGwgZW5kIHVwIHVzaW5nIGEgcHJveHkgaWYgYSBwcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3YXMgc2V0LgoKRGFuaWVsIFN0ZW5iZXJnICgyNyBKdWwgMjAwOSkKLSBBbGwgdGhlIHF1b3RlIG9wdGlvbnMgKENVUkxPUFRfUVVPVEUsIENVUkxPUFRfUE9TVFFVT1RFIGFuZAogIENVUkxPUFRfUFJFUVVPVEUpIG5vdyBhY2NlcHQgYSBwcmVjZWVkaW5nIGFzdGVyaXNrIGJlZm9yZSB0aGUgY29tbWFuZCB0bwogIHNlbmQgd2hlbiB1c2luZyBGVFAsIGFzIGEgc2lnbiB0aGF0IGxpYmN1cmwgc2hhbGwgc2ltcGx5IGlnbm9yZSB0aGUgcmVzcG9uc2UKICBmcm9tIHRoZSBzZXJ2ZXIgaW5zdGVhZCBvZiB0cmVhdGluZyBpdCBhcyBhbiBlcnJvci4gTm90IHRyZWF0aW5nIGEgNDAwKyBGVFAKICByZXNwb25zZSBjb2RlIGFzIGFuIGVycm9yIG1lYW5zIHRoYXQgZmFpbGVkIGNvbW1hbmRzIHdpbGwgbm90IGFib3J0IHRoZQogIGNoYWluIG9mIGNvbW1hbmRzLCBub3Igd2lsbCB0aGV5IGNhdXNlIHRoZSBjb25uZWN0aW9uIHRvIGdldCBkaXNjb25uZWN0ZWQuCgpEYW5pZWwgU3RlbmJlcmcgKDI2IEp1bCAyMDA5KQotIEpvaGFuIHZhbiBTZWxzdCBwb3N0ZWQgYnVnIHJlcG9ydCAjMjgyNTk4OQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODI1OTg5KSBwb2ludGluZyBvdXQgdGhhdAogIE9wZW5TU0wtcG93ZXJlZCBsaWJjdXJsIGRpZG4ndCBzdXBwb3J0IHRoZSBTSEEtMiBkaWdlc3QgYWxnb3JpdGhtLCBhbmQKICBwcm92aWRlZCB0aGUgc29sdXRpb24gdG9vOiB0byB1c2UgT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMoKSBpbiBhZGRpdGlvbgogIHRvIHRoZSBvbGRlciBTU0xlYXlfKiBhbHRlcm5hdGl2ZS4gT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMgd2FzIGFkZGVkIGluCiAgT3BlblNTTCAwLjkuNQoKRGFuaWVsIFN0ZW5iZXJnICgyMyBKdWwgMjAwOSkKLSBBZGRlZCBDVVJMT1BUX1NTSF9LTk9XTkhPU1RTLCBDVVJMT1BUX1NTSF9LRVlGVU5DVElPTiwgQ1VSTE9QVF9TU0hfS0VZREFUQS4KICBUaGV5IGludHJvZHVjZSBrbm93bl9ob3N0IHN1cHBvcnQgZm9yIFNTSCBrZXlzIHRvIGxpYmN1cmwuIFNlZSBkb2NzIGZvcgogIGRldGFpbHMuIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgZGVwZW5kcyBvbiBhIG5ldyBlbm91Z2ggbGlic3NoMiB2ZXJzaW9uLCB0bwogIGJlIHN1cHBvcnRlZCBpbiBsaWJzc2gyIDEuMiBhbmQgbGF0ZXIgKG9yIGN1cnJlbnQgZ2l0IHJlcG8gYXQgdGhpcyB0aW1lKS4KCk1pY2hhbCBNYXJlayAoMjIgSnVsIDIwMDkpCi0gRGF2aWQgQmluZGVybWFuIGZvdW5kIGEgbWVtb3J5IGFuZCBmZCBsZWFrIGluIGxpYi9ndGxzLmM6bG9hZF9maWxlKCkKICAoaHR0cHM6Ly9idWd6aWxsYS5ub3ZlbGwuY29tLzUyMzkxOSkuIFdoZW4gbG9va2luZyBhdCB0aGUgY29kZSwgSSBmb3VuZCB0aGF0CiAgYWxzbyB0aGUgcHRyIHBvaW50ZXIgY2FuIGxlYWsuCgpLYW1pbCBEdWRrYSAoMjAgSnVsIDIwMDkpCi0gQ2xhZXMgSmFrb2Jzc29uIGltcHJvdmVkIHRoZSBzdXBwb3J0IGZvciBjbGllbnQgY2VydGlmaWNhdGVzIGhhbmRsaW5nIGluCiAgTlNTLXBvd2VyZWQgbGliY3VybC4gTm93IHRoZSBjbGllbnQgY2VydGlmaWNhdGVzIGNhbiBiZSBzZWxlY3RlZAogIGF1dG9tYXRpY2FsbHkgYnkgYSBOU1MgYnVpbHQtaW4gaG9vay4gQWRkaXRpb25hbGx5IHByZS1sb2dpbiB0byBhbGwgUEtDUzExCiAgc2xvdHMgaXMgbm8gbW9yZSBwZXJmb3JtZWQuIEl0IHVzZWQgdG8gY2F1c2UgcHJvYmxlbXMgd2l0aCBIVyB0b2tlbnMuCgotIEZpeGVkIHJlZmVyZW5jZSBjb3VudGluZyBmb3IgTlNTIGNsaWVudCBjZXJ0aWZpY2F0ZXMuIE5vdyB0aGUgUEVNIHJlYWRlcgogIG1vZHVsZSBzaG91bGQgYmUgYWx3YXlzIHByb3Blcmx5IHVubG9hZGVkIG9uIEN1cmxfbnNzX2NsZWFudXAoKS4gSWYgdGhlCiAgdW5sb2FkIGZhaWxzIHRob3VnaCwgbGliY3VybCB3aWxsIHRyeSB0byByZXVzZSB0aGUgYWxyZWFkeSBsb2FkZWQgaW5zdGFuY2UuCgpEYW5pZWwgRmFuZHJpY2ggKDE1IEp1bCAyMDA5KQotIEFkZGVkIG5vbmJsb2NrLmMgdG8gdGhlIG5vbi1hdXRvbWFrZSBtYWtlZmlsZXMgKG5vdGUgdGhhdCB0aGUgZGVwZW5kZW5jaWVzCiAgaW4gdGhlIFdhdGNvbSBtYWtlZmlsZXMgYXJlbid0IHF1aXRlIGNvcnJlY3QpLgoKTWljaGFsIE1hcmVrICgxNSBKdWwgMjAwOSkKLSBDaGFuZ2VkIHRoZSBkZXNjcmlwdGlvbiBvZiBDVVJMSU5GT19PU19FUlJOTyB0byBtYWtlIGl0IGNsZWFyIHRoYXQgdGhlCiAgZXJybm8gaXMgbm90IHJlc2V0IG9uIHN1Y2Nlc3MuCgpHdWVudGVyIEtuYXVmICgxNCBKdWwgMjAwOSkKLSByZW5hbWVkIGdlbmVyYXRlZCBjb25maWcuaCB0byBjdXJsX2NvbmZpZy5oIHRvIGF2b2lkIGFueSBmdXR1cmUgY2xhc2hlcwogIHdpdGggY29uZmlnLmggZnJvbSBvdGhlciBwcm9qZWN0cy4KCkRhbmllbCBTdGVuYmVyZyAoOSBKdWwgMjAwOSkKLSBFcmljIFdvbmcgaW50cm9kdWNlZCBjdXJseF9ub25ibG9jaygpIHRoYXQgdGhlIGN1cmwgdG9vbCBub3cgKHJlLSl1c2VzIGZvcgogIHNldHRpbmcgYSBmaWxlIGRlc2NyaXB0b3Igbm9uLWJsb2NraW5nLiBVc2VkIGJ5IHRoZSBmdW5jdGlvbmFsaXR5IEVyaWMKICBoaW1zZWxmIGJyb3VnaCBvbiBKdW5lIDE1dGguCgpEYW5pZWwgU3RlbmJlcmcgKDggSnVsIDIwMDkpCi0gQ29uc3RhbnRpbmUgU2FwdW50emFraXMgcG9zdGVkIGJ1ZyByZXBvcnQgIzI4MTMxMjMKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjgxMzEyMykgYW5kIGFuIGEgcGF0Y2ggdGhhdCBmaXhlcyB0aGUKICBwcm9ibGVtOgoKICBVcmwgQSBpcyBhY2Nlc3NlZCB1c2luZyBhdXRoLiBVcmwgQSByZWRpcmVjdHMgdG8gVXJsIEIgKG9uIGEgZGlmZmVyZW50CiAgc2VydmVyMC4gVXJsIEIgcmV1c2VzIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uLiBVcmwgQiBoYXMgYXV0aCwgZXZlbiB0aG91Z2gKICBpdCdzIG9uIGEgZGlmZmVyZW50IHNlcnZlci4KCiAgTm90ZTogaWYgVXJsIEIgZG9lcyBub3QgcmV1c2UgYSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24sIGF1dGggaXMgbm90IHNlbnQuCgogIHJlYXNvbjoKCiAgZGF0YS0+c3RhdGUuZmlyc3RfaG9zdCBpcyBub3QgaW5pdGlhbGl6ZWQgYmVjdWFzZSBDdXJsX2h0dHBfY29ubmVjdCBpcyBub3QKICBjYWxsZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgcmV1c2VkLgoKICBTb2x1dGlvbjoKCiAgbW92ZSBpbml0aWFsaXphdGlvbiBvZiBkYXRhLT5zdGF0ZS5maXJzdF9ob3N0IHRvIEN1cmxfaHR0cC4gTm8gY29kZSBiZWZvcmUKICBDdXJsX2h0dHAgdXNlcyBkYXRhLT5zdGF0ZS5maXJzdF9ob3N0IGFueXdheS4KCkd1ZW50ZXIgS25hdWYgKDQgSnVsIDIwMDkpCi0gTWFya3VzIEtvZXR0ZXIgcHJvdmlkZWQgYSBwYXRjaCB0byBhdm9pZCBnZXRuYW1laW5mbygpIHVzYWdlIHdoaWNoIGJyb2tlIGEKICBjb3VwbGUgb2YgYm90aCBJUHY0IGFuZCBJUHY2IGF1dG9idWlsZHMuCgpEYW5pZWwgU3RlbmJlcmcgKDI5IEp1biAyMDA5KQotIE1hcmt1cyBLb2V0dGVyIG1hZGUgQ1VSTE9QVF9GVFBQT1JUIChhbmQgY3VybCdzIC1QLy0tZnRwcG9ydCkgc3VwcG9ydCBhIHBvcnQKICByYW5nZSBpZiBnaXZlbiBjb2xvbi1zZXBhcmF0ZWQgYWZ0ZXIgdGhlIGhvc3QgbmFtZS9hZGRyZXNzIHBhcnQuIExpa2UKICAiMTkyLjE2OC4wLjE6MjAwMC0xMDAwMCIKCi0gTW9kaWZpZWQgdGhlIHNlcGFyYXRvcnMgdXNlZCBmb3IgQ1VSTE9QVF9DRVJUSU5GTyBpbiBtdWx0aS1wYXJ0IG91dHB1dHMuIEkKICBkb24ndCBrbm93IGhvdyB0aGV5IGdvdCB3cm9uZyBpbiB0aGUgZmlyc3QgcGxhY2UsIGJ1dCB1c2luZyB0aGlzIG91dHB1dAogIGZvcm1hdCBtYWtlcyBpdCBwb3NzaWJsZSB0byBxdWl0ZSBlYXNpbHkgc2VwYXJhdGUgdGhlIHN0cmluZyBpbnRvIGFuIGFycmF5CiAgb2YgbXVsdGlwbGUgaXRlbXMuCgpEYW5pZWwgRmFuZHJpY2ggKDE2IEp1bmUgMjAwOSkKLSBBZGRlZCBhIGZldyBtb3JlIGNvbXBpbGVyIHdhcm5pbmcgb3B0aW9ucyBmb3IgZ2NjLgoKRGFuaWVsIFN0ZW5iZXJnICgxNiBKdW4gMjAwOSkKLSBSZXV2ZW4gV2FjaHRmb2dlbCBtYWRlIGN1cmwgLW8gLSBwcm9wZXJseSBwcm9kdWNlIGEgYmluYXJ5IG91dHB1dCBvbiB3aW5kb3dzCiAgKG5vIG5ld2xpbmUgdHJhbnNsYXRpb25zKS4gVXNlIC1CLy0tdXNlLWFzY2lpIGlmIHlvdSByYXRoZXIgZ2V0IHRoZSBhc2NpaQogIGFwcHJvYWNoLgoKTWljaGFsIE1hcmVrICgxNiBKdW4gMjAwOSkKLSBXaGVuIGRvaW5nIG5vbi1hbm9ueW1vdXMgZnRwIHZpYSBodHRwIHByb3hpZXMgYW5kIHRoZSBwYXNzd29yZCBpcyBub3QKICBwcm92aWRlZCBpbiB0aGUgdXJsLCBhZGQgaXQgdGhlcmUgKHNxdWlkIG5lZWRzIHRoaXMpLgoKRGFuaWVsIFN0ZW5iZXJnICgxNSBKdW4gMjAwOSkKLSBFcmljIFdvbmcncyBwYXRjaDoKCiAgVGhpcyBhbGxvd3MgY3VybCgxKSB0byBiZSB1c2VkIGFzIGEgY2xpZW50LXNpZGUgdHVubmVsIGZvciBhcmJpdHJhcnkgc3RyZWFtCiAgcHJvdG9jb2xzIGJ5IGFidXNpbmcgY2h1bmtlZCB0cmFuc2ZlciBlbmNvZGluZyBpbiBib3RoIHRoZSBIVFRQIHJlcXVlc3QgYW5kCiAgSFRUUCByZXNwb25zZS4gIFRoaXMgcmVxdWlyZXMgc2VydmVyIHN1cHBvcnQgZm9yIHNlbmRpbmcgYSByZXNwb25zZSB3aGlsZSBhCiAgcmVxdWVzdCBpcyBzdGlsbCBiZWluZyByZWFkLCBvZiBjb3Vyc2UuCgogIElmIGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIHN0ZGluIHJldHVybnMgRUFHQUlOLCB0aGVuIHdlIHBhdXNlIG91ciBzZW5kZXIuCiAgVGhpcyBsZWF2ZXMgY3VybCB0byBhdHRlbXB0IHRvIHJlYWQgZnJvbSB0aGUgc29ja2V0IHdoaWxlIHJlYWRpbmcgZnJvbSBzdGRpbgogIChhbmQgdGh1cyBzZW5kaW5nKSBpcyBwYXVzZWQuCgogIFRoaXMgY2hhbmdlIHdhcyBuZWVkZWQgdG8gYWxsb3cgc3VjY2Vzc2Z1bGx5IHR1bm5lbGluZyB0aGUgZ2l0IHByb3RvY29sIG92ZXIKICBIVFRQICgtLW5vLWJ1ZmZlciBpcyBuZWVkZWQsIGFzIHdlbGwpLgoKUGF0cmljayBNb25uZXJhdCAoMTUgSnVuIDIwMDkpCi0gUmVwbGFjZWQgdXNlIG9mIHN0YW5kYXJkIEMgbGlicmFyeSByYW5kKCkvc3JhbmQoKSBieSBvdXIgb3duIHBzZXVkby1yYW5kb20KICBudW1iZXIgZ2VuZXJhdG9yLgoKWWFuZyBUc2UgKDExIEp1biAyMDA5KQotIEkgYWRhcHRlZCB0ZXN0Y3VybCBzY3JpcHQgdG8gYWxsb3cgYnVpbGRpbmcgdGVzdCBoYXJuZXNzIHByb2dyYW1zIHdoZW4KICBjcm9zcy1jb21waWxpbmcgZm9yIGEgKi0qLW1pbmd3KiBob3N0LgoKRGFuaWVsIFN0ZW5iZXJnICgxMCBKdW4gMjAwOSkKLSBGYWJpYW4gS2VpbCByYW4gY2xhbmcgb24gdGhlIChsaWIpY3VybCBjb2RlLCBmb3VuZCBhIGJ1bmNoIG9mIHdhcm5pbmdzIGFuZAogIGNvbnRyaWJ1dGVkIGEgcmFuZ2Ugb2YgcGF0Y2hlcyB0byBmaXggdGhlbS4KCllhbmcgVHNlICgxMCBKdW4gMjAwOSkKLSBJIGludHJvZHVjZWQgY29uZmlndXJlIHNjcmlwdCBvcHRpb24gLS1lbmFibGUtY3VybGRlYnVnIHdoaWNoIG5vdyBhbGxvd3MKICB0aGUgZGVjb3VwbGVkIGVuYWJsaW5nIG9yIGRpc2FibGluZyBvZiB0aGUgY3VybCBkZWJ1ZyBtZW1vcnkgdHJhY2tpbmcKICBmZWF0dXJlIGZyb20gdGhlIC0tZW5hYmxlLWRlYnVnIG9wdGlvbiB3aGljaCBubyBsb25nZXIgY29udHJvbHMgdGhpcy4KCiAgY3VybCAtLXZlcnNpb24gd2lsbCBsaXN0ICdEZWJ1ZycgZmVhdHVyZSBmb3IgZGVidWcgZW5hYmxlZCBidWlsZHMsIGFuZAogIHdpbGwgbGlzdCAnVHJhY2tNZW1vcnknIGZlYXR1cmUgZm9yIGN1cmwgZGVidWcgbWVtb3J5IHRyYWNraW5nIGNhcGFibGUKICBidWlsZHMuIFRoZXNlIGZlYXR1cmVzIGFyZSBpbmRlcGVuZGVudCBhbmQgY2FuIGJlIGNvbnRyb2xsZWQgd2hlbiBydW5uaW5nCiAgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuIFdoZW4gLS1lbmFibGUtZGVidWcgaXMgZ2l2ZW4gYm90aCBmZWF0dXJlcyB3aWxsIGJlCiAgZW5hYmxlZCwgdW5sZXNzIHNvbWUgcmVzdHJpY3Rpb24gcHJldmVudHMgbWVtb3J5IHRyYWNraW5nIGZyb20gYmVpbmcgdXNlZC4KCiAgSW50ZXJuYWxseSwgZGVmaW5pdGlvbiBvZiBwcmVwcm9jZXNzb3Igc3ltYm9sIERFQlVHQlVJTEQgcmVzdHJpY3RzIGNvZGUKICB3aGljaCBpcyBvbmx5IGNvbXBpbGVkIGZvciBkZWJ1ZyBlbmFibGVkIGJ1aWxkcy4gQW5kIHN5bWJvbCBDVVJMREVCVUcgaXMKICB1c2VkIHRvIGRpZmZlcmVudGlhdGUgY29kZSB3aGljaCBpcyBfb25seV8gdXNlZCBmb3IgbWVtb3J5IHRyYWNraW5nLgoKWWFuZyBUc2UgKDkgSnVuIDIwMDkpCi0gRGFuaWVsIFN0ZWluYmVyZyBwb2ludGVkIG91dCB0aGF0IEN1cmxfRm9ybUluaXQoKSBpbiBmb3JtZGF0YS5jIHdhcyBub3QKICBpbml0aWFsaXppbmcgdGhlIGZyZWFkIGNhbGxiYWNrIHBvaW50ZXIgYW5kIHRoaXMgdHJpZ2dlcmVkIGEgY29tcGlsZXIKICB3YXJuaW5nLCBhbHNvIHByb3ZpZGVkIGEgZnJpZW5kbHkgc3VnZ2VzdGlvbiBvbiBob3cgdG8gZml4IGl0LgoKRGFuaWVsIFN0ZW5iZXJnICg4IEp1biAyMDA5KQotIENsYWVzIEpha29ic3NvbiBwcm92aWRlZCBhIHBhdGNoIGZvciBsaWJjdXJsLU5TUyB0aGF0IGZpeGVkIGEgYmFkIHJlZmNvdW50CiAgaXNzdWUgd2l0aCBjbGllbnQgY2VydHMgdGhhdCBjYXVzZWQgaXNzdWVzIGxpa2Ugc2VnZmF1bHRzLgogIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwOS0wNS8wMzE2Lmh0bWwKCi0gVHJpZ2dlcmVkIGJ5IGJ1ZyByZXBvcnQgIzI3OTg4NTIgYW5kIHRoZSBwYXRjaCBpbiB0aGVyZSwgSSBmaXhlZCBjb25maWd1cmUKICB0byBkZXRlY3QgZ251dGxzIGJ1aWxkIG9wdGlvbnMgd2l0aCBwa2ctY29uZmlnIG9ubHkgYW5kIG5vdCBsaWJnbnV0bHMtY29uZmlnCiAgYW55bW9yZSBzaW5jZSBHbnVUTFMgaGFzIHN0b3BwZWQgZGlzdHJpYnV0aW5nIHRoYXQgdG9vbC4gSWYgYW4gZXhwbGljaXQgcGF0aAogIGlzIGdpdmVuIHRvIGNvbmZpZ3VyZSwgd2Ugd2lsbCBpbnN0ZWFkIGd1ZXNzIG9uIGhvdyB0byBsaW5rIGFuZCB1c2UgdGhhdAogIGxpYi4gSSBkaWQgbm90IHVzZSB0aGUgcGF0Y2ggZnJvbSB0aGUgYnVnIHJlcG9ydC4KCllhbmcgVHNlICg4IEp1biAyMDA5KQotIElnb3IgTm92b3NlbHRzZXYgYWRqdXN0ZWQgTWFrZWZpbGUudnh3b3JrcyB0byBnZXQgc291cmNlcyBhbmQgaGVhZGVycwogIGluY2x1ZGVkIGZyb20gTWFrZWZpbGUuaW5jLCBhbmQgcHJvdmlkZWQgZG9jc1xJTlNUQUxMIFZ4V29ya3Mgc2VjdGlvbi4KCi0gSSByZW1vdmVkIGJ1aWxkY29uZi5iYXQgZnJvbSByZWxlYXNlIGFuZCBkYWlseSBzbmFwc2hvdCBhcmNoaXZlcy4gVGhpcwogIGZpbGUgaXMgb25seSBmb3IgQ1ZTIHRyZWUgY2hlY2tvdXQgYnVpbGRzLgoKRGFuaWVsIFN0ZW5iZXJnICg4IEp1biAyMDA5KQotIEVyaWMgV29uZyBmaXhlZCAtLW5vLWJ1ZmZlciB0byBhY3R1YWxseSBzd2l0Y2ggb2ZmIG91dHB1dCBidWZmZXJpbmcuIEJlZW4KICBicm9rZW4gc2luY2UgNy4xOS4wCgpCaWxsIEhvZmZtYW4gKDYgSnVuIDIwMDkpCi0gQWRkZWQgc29tZSBjbWFrZSBkb2NzIGFuZCBmaXhlZCBzb2NrbGVuX3QgaW4gdGhlIGJ1aWxkLgoKWWFuZyBUc2UgKDUgSnVuIDIwMDkpCi0gSm9obiBFLiBNYWxtYmVyZyBwcm92aWRlZCBWTVMgc3BlY2lmaWMgcGF0Y2g6ICJUaGlzIGZpeGVzIGFuIGV4aXN0aW5nIGJ1ZwogIGluIHVybGdsb2IuYyB3aGVyZSBpdCB3YXMgbm90IGNvbnZlcnRpbmcgdGhlIEN1cmwgVW5peCBleGl0IGNvZGUgdG8gYSBWTVMKICBEQ0wgY29tcGF0aWJsZSBleGl0IGNvZGUuICBUaGlzIGZpeCByZXF1aXJlZCB0aGUgZW5oYW5jZW1lbnQgZGVzY3JpYmVkIG5leHQuCiAgVGhpcyBhbHNvIGFkZHMgYW4gZW5oYW5jZW1lbnQgdG8gbWFpbi5jIHNvIHRoYXQgd2hlbiBjdXJsIGlzIHJ1biB1bmRlciBhCiAgVW5peCBzaGVsbCBsaWtlIEJhc2ggb24gVk1TLCBpdCB3aWxsIHJldHVybiB0aGUgc3RhbmRhcmQgVW5peCBleGl0IGNvZGVzCiAgYW5kIG1lc3NhZ2VzLiIgQW5kIGFub3RoZXIgcGF0Y2ggZm9yIGRvY3MvZXhhbXBsZXMuCgogIEkgaW50cm9kdWNlZCBvcy1zcGVjaWZpYy5jIGFuZCBvcy1zcGVjaWZpYy5oIGZvciB1c2UgaW4gY3VybCB0b29sIGNvZGUKICBhbmQgYWRqdXN0ZWQgSm9obiBFLiBNYWxtYmVyZydzIHBhdGNoIHBsYWNlbWVudCB0byB1c2UgdGhlc2UgbmV3IGZpbGVzCiAgYXMgYW4gZWZmb3J0IHRvIHByZXZlbnQgbWFpbi5jIGZyb20gZ3Jvd2luZyBhZCBpbmZpbml0dW0uIENvZGUgYWxyZWFkeQogIGV4aXN0aW5nIGluIG1haW4uYyB3aGljaCBpcyBPUyBzcGVjaWZpYyBzaG91bGQgYmUgbW92ZWQgaW50byB0aGVzZSBmaWxlcy4KCkRhbmllbCBTdGVuYmVyZyAoNCBKdW5lIDIwMDkpCi0gU2V0dGluZyB0aGUgQ29udGVudC1MZW5ndGg6IGhlYWRlciBmcm9tIHlvdXIgYXBwIHdoZW4geW91IGRvIGEgUE9TVCBvciBQVVQKICBpcyBhbG1vc3QgYWx3YXlzIGEgVkVSWSBCQUQgSURFQS4gWWV0IHRoZXJlIGFyZSBzdGlsbCBhcHBzIG91dCB0aGVyZSBkb2luZwogIHRoaXMsIGFuZCBub3cgcmVjZW50bHkgaXQgdHJpZ2dlcmVkIGEgYnVnL3NpZGUtZWZmZWN0IGluIGxpYmN1cmwgYXMgd2hlbgogIGxpYmN1cmwgc2VuZHMgYSBQT1NUIG9yIFBVVCB3aXRoIE5UTE0sIGl0IHNlbmRzIGFuIGVtcHR5IHBvc3QgZmlyc3Qgd2hlbiBpdAogIGtub3dzIGl0IHdpbGwganVzdCBnZXQgYSA0MDEvNDA3IGJhY2suIElmIHRoZSBhcHAgdGhlbiByZXBsYWNlZCB0aGUKICBDb250ZW50LUxlbmd0aCBoZWFkZXIsIGl0IGNhdXNlZCB0aGUgc2VydmVyIHRvIHdhaXQgZm9yIGlucHV0IHRoYXQgbGliY3VybAogIHdvdWxkbid0IHNlbmQuIEFhcm9uIE9uZWFsIHJlcG9ydGVkIHRoaXMgcHJvYmxlbSBpbiBidWcgcmVwb3J0ICMyNzk5MDA4CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI3OTkwMDgpIGFuZCBoZWxwZWQgdXMgdmVyaWZ5IHRoZSBmaXguCgpZYW5nIFRzZSAoNCBKdW4gMjAwOSkKLSBJZ29yIE5vdm9zZWx0c2V2IHByb3ZpZGVkIHBhdGNoZXMgYW5kIGluZm9ybWF0aW9uLCB0aGF0IGFmdGVyIHNvbWUKICBhZGp1c3RtZW50cyB0byBiZXR0ZXIgZml0IGN1cmwncyB3YXkgb2YgZG9pbmcgdGhpbmdzLCBoYXZlIHJlc3VsdGVkCiAgaW4gdGhlIHBvc2liaWxpdHkgb2YgYnVpbGRpbmcgbGliY3VybCBmb3IgVnhXb3Jrcy4KCkRhbmllbCBGYW5kcmljaCAoMiBKdW5lIDIwMDkpCi0gQ2hlY2tlZCBpbiBhIEdvb2dsZSBBbmRyb2lkIG1ha2UgZmlsZS4gVG8gdXNlIGl0LCB5b3UgbXVzdCBmaXJzdAogIGNyZWF0ZSBhIGNvbmZpZy5oIGZpbGUgYnkgcnVubmluZyBjb25maWd1cmUgaW4gdGhlIEFuZHJvaWQgZW52aXJvbm1lbnQsCiAgd2hpY2ggZG9lc24ndCBzZWVtIHRvIGJlIGVhc3kgdG8gZG8uIElmIG5vIGVhc3kgd2F5IGNhbiBiZSBmb3VuZCwgYQogIHN0YXRpYyBjb25maWctYW5kcm9pZC5oIG1heSBuZWVkIHRvIGJlIGNyZWF0ZWQgYW5kIGNoZWNrZWQgaW4gdG8gdGhlCiAgbGliY3VybCBzb3VyY2UgdHJlZS4KCkRhbmllbCBTdGVuYmVyZyAoMSBKdW5lIDIwMDkpCi0gQ2xhZXMgSmFrb2Jzc29uIGZpeGVkIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIGJldHRlciBmaW5kIGFuZCB1c2UgTlNTCiAgd2l0aG91dCBwa2ctY29uZmlnLgoKWWFuZyBUc2UgKDEgSnVuIDIwMDkpCi0gSm9obiBFLiBNYWxtYmVyZyBwcm92aWRlZCBhIFZNUyBzcGVjaWZpYyBjbGVhbi11cCBmb3IgY3VybC5oLCBhbmQgcG9pbnRlZAogIG91dCB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0IHdhcyBmYWlsaW5nIHRvIGRldGVjdCB0aGUgdGltZXZhbCBzdHJ1Y3Qgb24KICBWTVMgd2hlbiBidWlsZGluZyB3aXRoIF9YT1BFTl9TT1VSQ0VfRVhURU5ERUQgdW5kZWZpbmVkIGR1ZSB0byBkZWZpbml0aW9uCiAgdGFraW5nIHBsYWNlIGluIHNvY2tldC5oIGluc3RlYWQgb2YgdGltZS5oLiAgSSBoYXZlIGFkanVzdGVkIGNvbmZpZ3VyZQogIHNjcmlwdCB0byBhbHNvIGluY2x1ZGUgdGhpcyBoZWFkZXIgd2hlbiBjaGVja2luZyBzdHJ1Y3QgdGltZXZhbC4KCkRhbmllbCBTdGVuYmVyZyAoMjcgTWF5IDIwMDkpCi0gRnJhbmsgTWNHZW91Z2ggcHJvdmlkZWQgYSBzbWFsbCBPcGVuU1NMICNpbmNsdWRlIGZpeCB0byBtYWtlIGxpYmN1cmwgY29tcGlsZQogIGZpbmUgd2l0aCBOb2tpYSA1dGggZWRpdGlvbiAxLjAgU0RLIGZvciBTeW1iaWFuLgoKLSBBbmRyZSBHdWliZXJ0IGRlIEJydWV0IGZvdW5kIGEgY2FsbCB0byBhIE9wZW5TU0wgZnVuY3Rpb24gdGhhdCBkaWRuJ3QgY2hlY2sKICBmb3IgYSBmYWlsdXJlIHByb3Blcmx5LgoKLSBNaWtlIENyb3dlIHBvaW50ZWQgb3V0IHRoYXQgc2V0dGluZyBDVVJMT1BUX1VTRVJQV0QgdG8gTlVMTCB1c2VkIHRvIGNsZWFyCiAgdGhlIGF1dGggY3JlZGVudGlhbHMgYmFjayBpbiA3LjE5LjAgYW5kIGVhcmxpZXIgd2hpbGUgbm93IHlvdSBoYXZlIHRvIHNldCAiIgogIHRvIGdldCB0aGUgc2FtZSBlZmZlY3QuIEhpcyBwYXRjaCBicmluZ3MgYmFjayB0aGUgYWJpbGl0eSB0byB1c2UgTlVMTC4KCi0gQ2xhZXMgSmFrb2Jzc29uIGZpeGVkIGxpYmN1cmwtTlNTIHRvIGJ1aWxkIGZpbmUgZXZlbiB3aXRob3V0IHRoZQogIFBLMTFfQ3JlYXRlR2VuZXJpY09iamVjdCgpIGZ1bmN0aW9uLgoKRGFuaWVsIFN0ZW5iZXJnICgyNSBNYXkgMjAwOSkKLSBidWcgcmVwb3J0ICMyNzk2MzU4IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNzk2MzU4KSBwb2ludGVkCiAgb3V0IHRoYXQgdGhlIGNvb2tpZSBwYXJzZXIgd291bGQgbGVhayBtZW1vcnkgd2hlbiBpdCBwYXJzZXMgY29va2llcyB0aGF0IGFyZQogIHJlY2VpdmVkIHdpdGggZG9tYWluLCBwYXRoIGV0YyBzZXQgbXVsdGlwbGUgdGltZXMgaW4gdGhlIHNhbWUgaGVhZGVyLiBXaGlsZQogIHN1Y2ggYSBjb29raWUgaXMgcXVlc3Rpb25hYmxlLCB0aGV5IG9jY3VyIGluIHRoZSB3aWxkIGFuZCBsaWJjdXJsIG5vIGxvbmdlcgogIGxlYWtzIG1lbW9yeSBmb3IgdGhlbS4gSSBhZGRlZCBzdWNoIGEgaGVhZGVyIHRvIHRlc3QgY2FzZSA4LgoKRGFuaWVsIEZhbmRyaWNoICgyMiBNYXkgMjAwOSkKLSBSZW1vdmVkIHNvbWUgb2Jzb2xldGUgZGlnZXN0IGNvZGUgdGhhdCBjYXVzZWQgYSB2YWxncmluZCBlcnJvciBpbiB0ZXN0IDU1MS4KCkRhbmllbCBGYW5kcmljaCAoMjAgTWF5IDIwMDkpCi0gQWRkZWQgIm5vbi1leGlzdGluZyBob3N0IiB0ZXN0IGtleXdvcmRzIHRvIG1ha2UgaXQgZWFzeSB0byBza2lwIHRob3NlCiAgdGVzdHMgb24gbWFjaGluZXMgdGhhdCBoYXZlIGJyb2tlbiBETlMgY29uZmlndXJhdGlvbnMgKHN1Y2ggYXMKICB0aG9zZSBjb25maWd1cmVkIHRvIHVzZSBPcGVuRE5TKS4KCkRhbmllbCBTdGVuYmVyZyAoMTkgTWF5IDIwMDkpCi0gS2FtaWwgRHVka2EgYnJvdWdodCB0aGUgcGF0Y2ggZnJvbSB0aGUgUmVkaGF0IGJ1ZyBlbnRyeQogIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9NDI3OTY2IHdoaWNoIHdhcyBsaWJjdXJsIGNsb3NpbmcKICBhIGJhZCBmaWxlIGRlc2NyaXB0b3Igd2hlbiBjbG9zaW5nIGRvd24gdGhlIEZUUCBkYXRhIGNvbm5lY3Rpb24uICBDYW9sYW4KICBNY05hbWFyYSBzZWVtcyB0byBiZSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9mIGl0LgoKVmVyc2lvbiA3LjE5LjUgKDE4IE1heSAyMDA5KQoKRGFuaWVsIFN0ZW5iZXJnICgxNyBNYXkgMjAwOSkKLSBKYW1lcyBCdXJzYSBwb3N0ZWQgYSBwYXRjaCB0byB0aGUgbWFpbGluZyBsaXN0IHRoYXQgZml4ZWQgYSBwcm9ibGVtIHdpdGgKICBub19wcm94eSB3aGljaCBtYWRlIGl0IG5vdCBza2lwIHRoZSBwcm94eSBpZiB0aGUgVVJMIGVudGVyZWQgY29udGFpbmVkIGEKICB1c2VyIG5hbWUuIEkgYWRkZWQgdGVzdCBjYXNlIDExMDEgdG8gdmVyaWZ5LgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBNYXkgMjAwOSkKLSBCYWxpbnQgU3ppbGFrc3ppIHJlcG9ydGVkIGEgbWVtb3J5IGxlYWsgd2hlbiBsaWJjdXJsIGRpZCBnemlwIGRlY29tcHJlc3Npb24KICBvZiBzdHJlYW1zIHRoYXQgaGFkIHNvbWUgcGFydHMgKGxlZ2l0aW1hdGVseSkgbWlzc2luZy4gV2Ugbm93IHByb3ZpZGUgYW5kIHVzZQogIGEgcHJvcGVyIGNsZWFudXAgZnVuY3Rpb24gZm9yIHRoZSBjb250ZW50IGVuY29kaW5nIHN1Ym1vZHVsZS4KICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDktMDUvMDA5Mi5odG1sCgotIEthbWlsIER1ZGthIHByb3ZpZGVkIGEgZml4IGZvciBsaWJjdXJsLU5TUyByZXBvcnRlZCBieSBNaWNoYWVsIENyb25lbndvcnRoCiAgYXQgaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL3Nob3dfYnVnLmNnaT9pZD00NTM2MTIjYzEyCgogIElmIGFuIGluY29ycmVjdCBwYXNzd29yZCBpcyBnaXZlbiB3aGlsZSBsb2FkaW5nIGEgcHJpdmF0ZSBrZXksIGxpYmN1cmwgZW5kcwogIHVwIGluIGFuIGluZmluaXRlIGxvb3AgY29uc3VtaW5nIG1lbW9yeS4gVGhlIGJ1ZyBpcyBjcml0aWNhbC4KCi0gSSBmaXhlZCB0aGUgcHJvYmxlbSB3aXRoIGRvaW5nIE5UTE0sIFBPU1QgYW5kIHRoZW4gZm9sbG93aW5nIGEgMzAyIHJlZGlyZWN0LAogIGFzIHJlcG9ydGVkIGJ5IEViZW5lemVyIElrb25uZSAob24gY3VybC11c2VycykgYW5kIExhdXJlbnQgUmFicmV0IChvbgogIGN1cmwtbGlicmFyeSkuIFRoZSB0cmFuc2ZlciB3YXMgbWlzdGFrZW5seSBtYXJrZWQgdG8gZ2V0IG1vcmUgZGF0YSB0byBzZW5kCiAgYnV0IHNpbmNlIGl0IGRpZG4ndCBhY3R1YWxseSBoYXZlIHRoYXQsIGl0IGp1c3QgaHVuZyB0aGVyZS4uLgoKRGFuaWVsIFN0ZW5iZXJnICgxMCBNYXkgMjAwOSkKLSBBbmRyZSBHdWliZXJ0IGRlIEJydWV0IGNvcnJlY3RseSBwb2ludGVkIG91dCBhbiBvdmVyLWFsbG9jIHdpdGggb25lIHdhc3RlZAogIGJ5dGUgaW4gdGhlIGRpZ2VzdCBjb2RlLgoKWWFuZyBUc2UgKDkgTWF5IDIwMDkpCi0gUmVtb3ZlZCBET1MgYW5kIFRQRiBwYWNrYWdlJ3Mgc3ViZGlyZWN0b3J5IE1ha2VmaWxlLmFtLCBpdCB3YXMgb25seSB1c2VkCiAgdG8gaW5jbHVkZSBzb21lIGZpbGVzIGluIHRoZSBkaXN0cmlidXRpb24gdGFyYmFsbCBzZXJ2aW5nIG5vIG90aGVyIHB1cnBvc2UuCiAgRmlsZXMgZnJvbSB0aGUgRE9TIGFuZCBUUEYgc3ViZGlyZWN0b3JpZXMgYXJlIG5vdyBpbmNsdWRlZCBpbiB0aGUgRVhUUkFfRElTVAogIG9mIHRoZSBNYWtlZmlsZSBpbiB0aGUgcGFyZW50IHN1YmRpcmVjdG9yeS4KCllhbmcgVHNlICg4IE1heSAyMDA5KQotIENoYW5nZWQgaG9zdCBuYW1lIGxpdGVyYWwgaW4gc2V2ZXJhbCB0ZXN0cyB0byBvbmUgdW5kZXIgdGhlIGhheHguc2UgZG9tYWluLgoKLSBSZW5hbWVkIHZjNiB3b3Jrc3BhY2UgYW5kIHByb2plY3QgZmlsZXMgdG8gYXZvaWQgZmlsZW5hbWUgY2xhc2ggd2hlbiB1c2VkCiAgZm9yIGNvbnZlcnNpb24gdG8gbGF0ZXIgVlMgdmVyc2lvbnMuCgpEYW5pZWwgU3RlbmJlcmcgKDggTWF5IDIwMDkpCi0gQ29uc3RhbnRpbmUgU2FwdW50emFraXMgZml4ZWQgYnVnIHJlcG9ydCAjMjc4NDA1NQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNzg0MDU1KSBpZGVudGlmeWluZyBhIHByb2JsZW0gdG8KICBjb25uZWN0IHRvIFNPQ0tTIHByb3hpZXMgd2hlbiB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlLiBJdCB0dXJuZWQgb3V0IHRvCiAgYWxtb3N0IG5vdCB3b3JrIGF0IGFsbCBwcmV2aW91c2x5LiBXZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBUQ1AgY29ubmVjdCB0bwogIGJlIHByb3Blcmx5IHZlcmlmaWVkIGJlZm9yZSBkb2luZyB0aGUgU09DS1MgbWFnaWMuCgogIFRoZXJlJ3Mgc3RpbGwgYSBmbGF3IGluIHRoZSBGVFAgY29kZSBmb3IgdGhpcy4KCkRhbmllbCBTdGVuYmVyZyAoNyBNYXkgMjAwOSkKLSBNYWRlIHRoZSBTT19TTkRCVUYgc2V0dGluZyBmb3IgdGhlIGRhdGEgY29ubmVjdGlvbiBzb2NrZXQgZm9yIGZ0cCB1cGxvYWRzIGFzCiAgd2VsbC4gU2VlIGNoYW5nZSAyOCBBcHIgMjAwOS4KCllhbmcgVHNlICg3IE1heSAyMDA5KQotIEZpeGVkIGFuIGlzc3VlIGFmZmVjdGluZyBGVFAgdHJhbnNmZXJzLCBpbnRyb2R1Y2VkIHdpdGggdGhlIHRyYW5zZmVyLmMKICBwYXRjaCBjb21taXR0ZWQgTWF5IDQuCgpEYW5pZWwgU3RlbmJlcmcgKDcgTWF5IDIwMDkpCi0gTWFuIHBhZ2UgKnJvZmYgcHJvYmxlbXMgZml4ZWQgdGhhbmtzIHRvIGlucHV0IGZyb20gQ29saW4gV2F0c29uLiBQcm9ibGVtcwogIHJlcG9ydGVkIGluIHRoZSBEZWJpYW4gcGFja2FnZS4KCi0gVmlqYXkgRyBmaWxlZCBidWcgcmVwb3J0ICMyNzIzMjM2CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI3MjMyMzYpIGlkZW50aWZ5aW5nIGEgcHJvYmxlbSB3aXRoCiAgbGliY3VybCdzIFRGVFAgY29kZSBhbmQgaXRzIGxhY2sgb2YgZGVhbGluZyB3aXRoIHRoZSBPQUNLIHBhY2tldC4KCllhbmcgVHNlICg1IE1heSAyMDA5KQotIEZpeGVkIHRoZSAtLWZ0cC1wb3J0IGFkZHJlc3Mgb2YgdGVzdCAjMjUxIHRvIHRoZSBDTElFTlRJUCBhZGRyZXNzLCBhbmQKICByZXZlcnRlZCB0aGUgY2hhbmdlIGFmZmVjdGluZyB0ZXN0IHN1aXRlIGhhcm5lc3MgY29tbWl0dGVkIDQgTWF5LgoKRGFuaWVsIFN0ZW5iZXJnICg1IE1heSAyMDA5KQotIEluc3BpcmVkIGJ5IE1pY2hhZWwgU21pdGgncyBzZXNzaW9uIGlkIGZpeCBmb3IgT3BlblNTTCwgSSBkaWQgdGhlCiAgY29ycmVzcG9uZGluZyBmaXggaW4gdGhlIEdudVRMUyBjb2RlOiBtYWtlIHN1cmUgdG8gc3RvcmUgdGhlIG5ldyBzZXNzaW9uIGlkCiAgaW4gY2FzZSB0aGUgcHJldmlvdXMgcmUtdXNlZCBvbmUgaXMgcmVqZWN0ZWQuCgpEYW5pZWwgU3RlbmJlcmcgKDQgTWF5IDIwMDkpCi0gTWljaGFlbCBTbWl0aCBwb3N0ZWQgYnVnIHJlcG9ydCAjMjc4NjI1NQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNzg2MjU1KSB3aXRoIGEgcGF0Y2gsIGlkZW50aWZ5aW5nIGhvdwogIGxpYmN1cmwgZGlkIG5vdCBkZWFsIHdpdGggU1NMIHNlc3Npb24gaWRzIHByb3Blcmx5IGlmIHRoZSBzZXJ2ZXIgcmVqZWN0ZWQgYQogIHJlLXVzZSBvZiBvbmUuIFN0YXJ0aW5nIG5vdywgaXQgd2lsbCBmb3JnZXQgdGhlIHJlamVjdGVkIG9uZSBhbmQgcmVtZW1iZXIKICB0aGUgbmV3LiBUaGlzIGNoYW5nZSB3YXMgZm9yIE9wZW5TU0wgb25seSwgaXQgaXMgbGlrZWx5IHRoYXQgb3RoZXIgU1NMIGxpYgogIGNvZGUgbmVlZHMgc2ltaWxhciBmaXhlcy4KCllhbmcgVHNlICg0IE1heSAyMDA5KQotIEFwcGxpZWQgRGF2aWQgTWNDcmVlZHkncyAidHJhbnNmZXIuYyBmaXhlcyBmb3IgQ1VSTF9ET19MSU5FRU5EX0NPTlYgYW5kCiAgbm9uLUFTQ0lJIHBsYXRmb3JtIEhUVFAgcmVxdWVzdHMiIHBhdGNoIGFkZHJlc3NpbmcgdHdvIEhUVFAgUFVUIHByb2JsZW1zOgogIDEpIE9uIG5vbi1BU0NJSSBwbGF0Zm9ybXMgbm90IGFsbCBvZiB0aGUgcHJvdG9jb2wgcG9ydGlvbnMgb2YgdGhlIFBVVCBhcmUKICBiZWluZyB0cmFuc2xhdGVkIHRvIEFTQ0lJLiAgMikgT24gYWxsIHBsYXRmb3JtcyB0aGUgbGluZSBlbmRpbmdzIG9mIHBhcnQgb2YKICB0aGUgcHJvdG9jb2wgcG9ydGlvbnMgYXJlIG1hbmdsZWQgZnJvbSBDUkxGIHRvIENSQ1JMRiBpZiBkYXRhLT5zZXQuY3JsZiBvcgogIGRhdGEtPnNldC5wcmVmZXJfYXNjaWkgYXJlIHNldCAoZGVwZW5kaW5nIG9uIENVUkxfRE9fTElORUVORF9DT05WKS4KCi0gQXBwbGllZCBEYXZpZCBNY0NyZWVkeSdzIHBhdGNoIHRvIGZpeCB0ZXN0IHN1aXRlIGhhcm5lc3MgdG8gYWxsb3cgdGVzdCBGVFAKICBzZXJ2ZXIgYW5kIGNsaWVudCBvbiBkaWZmZXJlbnQgbWFjaGluZXMsIHByb3ZpZGluZyBGVFAgY2xpZW50IGFkZHJlc3Mgd2hlbgogIHJ1bm5pbmcgdGhlIEZUUCB0ZXN0IHNlcnZlci4KCkRhbmllbCBGYW5kcmljaCAoMyBNYXkgMjAwOSkKLSBBZGRlZCBhbmQgZGlzYWJsZWQgdGVzdCBjYXNlIDU2MyB3aGljaCBzaG93cyBLTk9XTl9CVUdTICM1OS4gIFRoZSBidWcKICByZXBvcnQgZmFpbGVkIHRvIG1lbnRpb24gdGhhdCBhIHByb3h5IG11c3QgYmUgdXNlZCB0byByZXByb2R1Y2UgaXQuCgpZYW5nIFRzZSAoMiBNYXkgMjAwOSkKLSBVc2UgYSBidWlsZC10aW1lIGNvbmZpZ3VyZWQgY3VybF9zb2NrbGVuX3QgZGF0YSB0eXBlIGluc3RlYWQgb2Ygc29ja2xlbl90LgoKWWFuZyBUc2UgKDEgTWF5IDIwMDkpCi0gQXBwbGllZCBEYXZpZCBNY0NyZWVkeSdzIHBhdGNoZXMgIlRQRi1wbGF0Zm9ybSBzcGVjaWZpYyBjaGFuZ2VzIHRvIHZhcmlvdXMKICBmaWxlcyIgYW5kICJodHRwLmMgZml4IHRvIEN1cmxfcHJveHlDT05ORUNUIGZvciBub24tQVNDSUkgcGxhdGZvcm1zIiwgdGhlCiAgZm9ybWVyIHdpdGggbWlub3IgZWRpdHMuCgpEYW5pZWwgU3RlbmJlcmcgKDMwIEFwciAyMDA5KQotIEkgd2FzIGdvaW5nIHRvIGZpeCBpc3N1ZSAjNTkgaW4gS05PV05fQlVHUwoKICBJZiB0aGUgQ1VSTE9QVF9QT1JUIG9wdGlvbiBpcyB1c2VkIG9uIGFuIEZUUCBVUkwgbGlrZQogICJmdHA6Ly9leGFtcGxlLmNvbS9maWxlO3R5cGU9QSIgdGhlICI7dHlwZT1BIiBpcyBzdHJpcHBlZCBvZmYuCgogIEkgYWRkZWQgdGVzdCBjYXNlIDU2MiB0byB2ZXJpZnksIG9ubHkgdG8gZmluZCBvdXQgdGhhdCBJIGNvdWxkbid0IHJlcGVhdAogIHRoaXMgYnVnIHNvIEkgaGVyZWJ5IGNvbnNpZGVyIGl0IG5vdCBhIGJ1ZyBhbnltb3JlIQoKRGFuaWVsIFN0ZW5iZXJnICgyOSBBcHIgMjAwOSkKLSBCYXNlZCBvbiBidWcgcmVwb3J0ICMyNzIzMjE5IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNzIzMjE5KQogIEkndmUgbm93IG1hZGUgVEZUUCAiY29ubmVjdGlvbnMiIG5vdCBiZWluZyBrZXB0IGZvciByZS11c2Ugd2l0aGluIGxpYmN1cmwuCiAgVEZUUCBpcyBVRFAtYmFzZWQgc28gdGhlIGJlbmVmaXQgd2FzIHJlYWxseSBsb3cgKGlmIGV2ZW4gZXhpc3RpbmcpIHRvIGJlZ2luCiAgd2l0aCBzbyBpbnN0ZWFkIG9mIHRyYWNraW5nIGRvd24gdG8gZml4IHRoaXMgcHJvYmxlbSB3ZSBpbnN0ZWFkIHJlbW92ZWQgdGhlCiAgcmUtdXNlLiBJIGFsc28gZW5hYmxlZCB0ZXN0IGNhc2UgMTA5OSB0aGF0IEkgd3JvdGUgYSBmZXcgZGF5cyBhZ28gdG8gdmVyaWZ5CiAgdGhhdCB0aGlzIGNoYW5nZSBmaXhlcyB0aGUgcmVwb3J0ZWQgcHJvYmxlbS4KCkRhbmllbCBTdGVuYmVyZyAoMjggQXByIDIwMDkpCi0gQ29uc3RhbnRpbmUgU2FwdW50emFraXMgZmlsZWQgYnVnIHJlcG9ydCAjMjc4MzA5MAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNzgzMDkwKSBwb2ludGluZyBvdXQgdGhhdCBvbiB3aW5kb3dzCiAgd2UgbmVlZCB0byBncm93IHRoZSBTT19TTkRCVUYgYnVmZmVyIHNvbWV3aGF0IHRvIGdldCByZWFsbHkgZ29vZCB1cGxvYWQKICBzcGVlZHMuIGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20va2IvODIzNzY0IGhhcyB0aGUgZGV0YWlscy4gRnJpZW5kcwogIGNvbmZpcm1lZCB0aGF0IHNpbXBseSBhZGRpbmcgMzIgdG8gQ1VSTF9NQVhfV1JJVEVfU0laRSBpcyBlbm91Z2guCgotIEJ1ZyByZXBvcnQgIzI3MDkwMDQgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI3MDkwMDQpIGJ5IFRpbQogIENoZW4gcG9pbnRlZCBvdXQgaG93IGN1cmwgY291bGRuJ3QgdXBsb2FkIHdpdGggcmVzdW1lIHdoZW4gcmVhZGluZyBmcm9tIGEKICBwaXBlLgoKICBUaGlzIGVuZGVkIHVwIHdpdGggdGhlIGludHJvZHVjdGlvbiBvZiBhIG5ldyByZXR1cm4gY29kZSBmb3IgdGhlCiAgQ1VSTE9QVF9TRUVLRlVOQ1RJT04gY2FsbGJhY2sgdGhhdCBiYXNpY2FsbHkgc2F5cyB0aGF0IHRoZSBzZWVrIGZhaWxlZCBidXQKICB0aGF0IGxpYmN1cmwgbWF5IHRyeSB0byByZXNvbHZlIHRoZSBzaXR1YXRpb24gYW55d2F5LiBJbiBvdXIgY2FzZSB0aGlzIG1lYW5zCiAgbGliY3VybCB3aWxsIGF0dGVtcHQgdG8gaW5zdGVhZCByZWFkIHRoYXQgbXVjaCBkYXRhIGZyb20gdGhlIHN0cmVhbSBpbnN0ZWFkCiAgb2Ygc2Vla2luZyBhbmQgdGhhdCB3YXkgY3VybCBjYW4gbm93IHVwbG9hZCB3aXRoIHJlc3VtZSB3aGVuIGRhdGEgaXMgcmVhZAogIGZyb20gYSBzdHJlYW0hCgpEYW5pZWwgU3RlbmJlcmcgKDI2IEFwciAyMDA5KQotIEJ1ZyByZXBvcnQgIzI3Nzk3MzMgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI3Nzk3MzMpIGJ5IFN2ZW4KICBXZWdlbmVyIHBvaW50ZWQgb3V0IHRoYXQgQ1VSTElORk9fQVBQQ09OTkVDVF9USU1FIGRpZG4ndCB3b3JrIHdpdGggdGhlIG11bHRpCiAgaW50ZXJmYWNlIGFuZCBwcm92aWRlZCBhIHBhdGNoIHRoYXQgZml4ZWQgdGhlIHByb2JsZW0hCgpEYW5pZWwgU3RlbmJlcmcgKDI0IEFwciAyMDA5KQotIEthbWlsIER1ZGthIGZpeGVkIGFub3RoZXIgTlNTLXJlbGF0ZWQgbGVhayB3aGVuIGNsaWVudCBjZXJ0cyB3ZXJlIHVzZWQuCgotIEJ1ZyByZXBvcnQgIzI3NzkyNDUgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI3NzkyNDUpIGJ5IFJhaW5lcgogIEtvZW5pZyBwb2ludGVkIG91dCB0aGF0IHRoZSBtYW4gcGFnZSBkaWRuJ3QgdGVsbCB0aGF0IHRoZSAqX3Byb3h5CiAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGNhbiBiZSBzcGVjaWZpZWQgbG93ZXIgY2FzZSBvciBVUFBFUiBDQVNFIGFuZCB0aGUKICBsb3dlciBjYXNlIHRha2VzIHByZWNlZGVuY2UsCgpEYW5pZWwgRmFuZHJpY2ggKDIxIEFwciAyMDA5KQotIEFkZGVkIG5ldyBsaWJjdXJsIHNvdXJjZSBmaWxlcyB0byBBbWlnYSwgUmlzY09TIGFuZCBWQzYgYnVpbGQgZmlsZXMuCgpZYW5nIFRzZSAoMjEgQXByIDIwMDkpCi0gTW92ZWQgcG90ZW50aWFsIGluY2x1c2lvbiBvZiBzeXN0ZW0ncyBtYWxsb2MuaCBhbmQgbWVtb3J5LmggaGVhZGVyIGZpbGVzIHRvCiAgc2V0dXBfb25jZS5oLiAgSW5jbHVzaW9uIG9mIGVhY2ggaGVhZGVyIGZpbGUgaXMgYmFzZWQgb24gdGhlIGRlZmluaXRpb24gb2YKICBORUVEX01BTExPQ19IIGFuZCBORUVEX01FTU9SWV9IIHJlc3BlY3RpdmVseS4KCiAgUmVuYW1lZCBsaWJjdXJsJ3MgbWVtb3J5LmggdG8gY3VybF9tZW1vcnkuaAoKRGFuaWVsIFN0ZW5iZXJnICgyMCBBcHIgMjAwOSkKLSBMZWFuaWMgTGVmZXZlciByZXBvcnRlZCBhIGNyYXNoIGFuZCBkaWQgc29tZSBkZXRhaWxlZCByZXNlYXJjaCBvbiB3aHkgYW5kCiAgaG93IGl0IG9jY3VycyAoaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA5LTA0LzAyODkuaHRtbCkuIFRoZQogIGNvbmNsdXNpb24gd2FzIHRoYXQgaWYgYW4gZXJyb3IgaXMgZGV0ZWN0ZWQgYW5kIEN1cmxfZG9uZSgpIGlzIGNhbGxlZCBmb3IKICB0aGUgY29ubmVjdGlvbiwgZnRwX2RvbmUoKSBjb3VsZCBhdCB0aW1lcyByZXR1cm4gYW5vdGhlciBlcnJvciBjb2RlIHRoYXQKICB0aGVuIHdvdWxkIHRha2UgcHJlY2VkZW5jZSBhbmQgdGhhdCBuZXcgY29kZSBjb25mdXNlZCBleGlzdGluZyBsb2dpYyB0aGF0CiAgd29ya3MgZm9yIHRoZSBmaXJzdCBlcnJvciBjb2RlIChDVVJMRV9TRU5EX0VSUk9SKSBvbmx5LgoKLSBHaXNsZSBWYW5lbSBub3RpY2VkIHRoYXQgLS1saWJ0b29sIHdvdWxkIHByb2R1Y2UgYm9ndXMgc3RyaW5ncyBhdCB0aW1lcyBmb3IKICBPQkpFQ1RQT0lOVCBvcHRpb25zLiBOb3cgd2UndmUgaW50cm9kdWNlZCBhIG5ldyBmdW5jdGlvbiAtIG15X3NldG9wdF9zdHIgLQogIHdpdGhpbiB0aGUgYXBwIGZvciBzZXR0aW5nIHBsYWluIHN0cmluZyBvcHRpb25zIHRvIGF2b2lkIHRoZSByaXNrIG9mIHRoaXMKICBtaXN0YWtlIGhhcHBlbmluZy4KCkRhbmllbCBTdGVuYmVyZyAoMTcgQXByIDIwMDkpCi0gUHJhbW9kIFNoYXJtYSByZXBvcnRlZCBhbmQgdHJhY2tlZCBkb3duIGEgYnVnIHdoZW4gZG9pbmcgRlRQIG92ZXIgYSBIVFRQCiAgcHJveHkuIGxpYmN1cmwgd291bGQgdGhlbiB3cm9uZ2x5IGNsb3NlIHRoZSBjb25uZWN0aW9uIGFmdGVyIGVhY2gKICByZXF1ZXN0LiBJbiBoaXMgY2FzZSBpdCBoYWQgdGhlIHdlaXJkIHNpZGUtZWZmZWN0IHRoYXQgaXQga2lsbGVkIE5UTE0gYXV0aAogIGZvciB0aGUgcHJveHkgY2F1c2luZyBhbiBpbmlmaW5pdGUgbG9vcCEKCiAgSSBhZGRlZCB0ZXN0IGNhc2UgMTA5OCB0byB2ZXJpZnkgdGhpcyBmaXguIFRoZSB0ZXN0IGNhc2UgZG9lcyBob3dldmVyIG5vdAogIHByb3Blcmx5IHZlcmlmeSB0aGF0IHRoZSB0cmFuc2ZlcnMgYXJlIGRvbmUgcGVyc2lzdGVudGx5IC0gYXMgSSBjb3VsZG4ndAogIHRoaW5rIG9mIGEgY2xldmVyIHdheSB0byBhY2hpZXZlIGl0IHJpZ2h0IG5vdyAtIGJ1dCB5b3UgbmVlZCB0byByZWFkIHRoZQogIHN0ZGVyciBvdXRwdXQgYWZ0ZXIgYSB0ZXN0IHJ1biB0byBzZWUgdGhhdCBpdCB0cnVseSBkaWQgdGhlIHJpZ2h0IHRoaW5nLgoKRGFuaWVsIFN0ZW5iZXJnICgxMyBBcHIgMjAwOSkKLSBidWcgcmVwb3J0ICMyNzI3OTgxIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNzI3OTgxKSBieSBNYXJ0aW4KICBTdG9yc2r2IHBvaW50ZWQgb3V0IGhvdyBzZXR0aW5nIENVUkxPUFRfTk9CT0RZIHRvIDAgY291bGQgYmUgZG93bnJpZ2h0CiAgY29uZnVzaW5nIGFzIGl0IHNldCB0aGUgbWV0aG9kIHRvIGVpdGhlciBHRVQgb3IgSEVBRC4gVGhlIGV4YW1wbGUgaGUgc2hvd2VkCiAgbG9va2VkIGxpa2U6CgogICBjdXJsX2Vhc3lfc2V0b3B0KGN1cmwsIENVUkxPUFRfUFVULCAxKTsKICAgY3VybF9lYXN5X3NldG9wdChjdXJsLCBDVVJMT1BUX05PQk9EWSwgMCk7CgogIFRoZSBuZXcgd2F5IGRvZXNuJ3QgYWx0ZXIgdGhlIG1ldGhvZCB1bnRpbCB0aGUgcmVxdWVzdCBpcyBhYm91dCB0byBzdGFydC4gSWYKICBDVVJMT1BUX05PQk9EWSBpcyB0aGVuIDEgdGhlIEhUVFAgcmVxdWVzdCB3aWxsIGJlIEhFQUQuIElmIENVUkxPUFRfTk9CT0RZIGlzCiAgMCBhbmQgdGhlIHJlcXVlc3QgaGFwcGVucyB0byBoYXZlIGJlZW4gc2V0IHRvIEhFQUQsIGl0IHdpbGwgdGhlbiBpbnN0ZWFkIGJlCiAgc2V0IHRvIEdFVC4gSSBiZWxpZXZlIHRoaXMgd2lsbCBiZSBsZXNzIHN1cnByaXNpbmcgdG8gdXNlcnMsIGFuZCBob3BlZnVsbHkKICBub3QgaGl0IGFueSBleGlzdGluZyB1c2VycyBiYWRseS4KCi0gVG9zaGlvIEt1cmF0b21pIHJlcG9ydGVkIGEgbWVtb3J5IGxlYWsgcHJvYmxlbSB3aXRoIGxpYmN1cmwrTlNTIHRoYXQgdHVybmVkCiAgb3V0IHRvIGJlIGxlYWtpbmcgY2FjZXJ0cy4gS2FtaWwgRHVka2EgaGVscGVkIG1lIGNvbXBsZXRlIHRoZSBmaXguIFRoZSBpc3N1ZQogIGlzIGZvdW5kIGluIFJlZGhhdCdzIGJ1ZyB0cmFja2VyOgogIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9NDUzNjEyCgogIFRoZXJlIGFyZSBzdGlsbCBtZW1vcnkgbGVha3MgcHJlc2VudCwgYnV0IHRoZXkgc2VlbSB0byBoYXZlIG90aGVyIHJlYXNvbnMuCgpEYW5pZWwgRmFuZHJpY2ggKDExIEFwciAyMDA5KQotIEFkZGVkIG5ldyBsaWJjdXJsIHNvdXJjZSBmaWxlcyB0byBTeW1iaWFuIE9TIGJ1aWxkIGZpbGVzLgotIEltcHJvdmVkIFN5bWJpYW4gc3VwcG9ydCBmb3IgU1NMLgoKWWFuZyBUc2UgKDEwIEFwciAyMDA5KQotIERhbmllbCBKb2huc29uIGltcHJvdmVkIHRoZSBNYWNPU1gtRnJhbWV3b3JrIHNoZWxsIHNjcmlwdCB0byBub3cgcGVyZm9ybSBhbGwKICB0aGUgc3RlcHMgcmVxdWlyZWQgdG8gYnVpbGQgYSBNYWMgT1MgWCBmb3VyIHdheSBmYXQgcHBjL2kzODYvcHBjNjQveDg2XzY0CiAgbGliY3VybC5mcmFtZXdvcmsuICBGb3VyIHdheSBmYXQgZnJhbWV3b3JrIHJlcXVpcmVzIE9TIFggMTAuNSBTREsgb3IgbGF0ZXIuCgpZYW5nIFRzZSAoOCBBcHIgMjAwOSkKLSBSZW1vdmVkIFN1biBjb21waWxlcnMgcHJlcHJvY2Vzc29yIGJsb2NrIGZyb20gY3VybGJ1aWxkLmguZGlzdCwgdGhpcyBhbHNvCiAgcmVtb3ZlcyBpdCBmcm9tIHRoZSBjdXJsYnVpbGQuaCBmaWxlIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgdGhlIGNVUkwKICBwcm9qZWN0IGFzIHRoaXMgZmlsZSBpcyBpbnRlbmRlZCBmb3Igc3lzdGVtcyBub3QgY2FwYWJsZSBvZiBydW5uaW5nIHRoZQogIGNvbmZpZ3VyZSBzY3JpcHQuICBGb3IgdGhvc2Ugd2hvIGhhdmUgYmVlbiBidWlsZGluZyBjdXJsIG91dCBvZiB0aGUgc291cmNlCiAgY29kZSBjdXJsIGRpc3RyaWJ1dGlvbiB0YXJiYWxsIHByb3ZpZGVkIGJ5IGN1cmwuaGF4eC5zZSB0aGUgY2hhbmdlIGltcGxpZXMKICBub3RoaW5nLiAgUHJldmlvdXMgY2hhbmdlIGluIHRoaXMgYXJlYSBjb21taXR0ZWQgMiBBcHIgYmVjb21lcyBpcnJlbGV2YW50LgoKRGFuaWVsIFN0ZW5iZXJnICg2IEFwciAyMDA5KQotIEkgY2xhcmlmaWVkIGluIHRoZSBkb2NzIHRoYXQgQ1VSTE9QVF9TRUVLRlVOQ1RJT04gc2hvdWxkIHJldHVybiAwIG9uIHN1Y2Nlc3MKICBhbmQgMSBvbiBmYXRhbCBlcnJvcnMuIFByZXZpb3VzbHkgaXQgb25seSBtZW50aW9uZWQgbm9uLXplcm8gb24gZmF0YWwKICBlcnJvcnMuIFRoaXMgaXMgYSBzbGlnaHQgY2hhbmdlIGluIG1lYW5pbmcsIGJ1dCBpdCBmb2xsb3dzIHdoYXQgd2UndmUgZG9uZQogIGVsc2V3aGVyZSBiZWZvcmUgYW5kIGl0IG9wZW5zIHVwIGZvciBMT1RTIG9mIG1vcmUgdXNlZnVsIHJldHVybiBjb2RlcwogIHdoZW5ldmVyIHdlIGNhbiB0aGluayBvZiB0aGVtLi4uCgpZYW5nIFRzZSAoMiBBcHIgMjAwOSkKLSBGaXggY3VybF9vZmZfdCBkZWZpbml0aW9uIGZvciBidWlsZHMgZG9uZSB1c2luZyBTdW4gY29tcGlsZXJzIGFuZCBhCiAgbm9uLWNvbmZpZ3VyZWQgbGliY3VybC4gSW4gdGhpcyBjYXNlIGN1cmxfb2ZmX3QgZGF0YSB0eXBlIHdhcyBnYXRlZAogIHRvIHRoZSBvZmZfdCBkYXRhIHR5cGUgd2hpY2ggZGVwZW5kcyBvbiB0aGUgX0ZJTEVfT0ZGU0VUX0JJVFMuIFRoaXMKICBjb25maWd1cmF0aW9uIGlzIGV4YWN0bHkgdGhlIHVud2FudGVkIGNvbmZpZ3VyYXRpb24gZm9yIG91ciBjdXJsX29mZl90CiAgZGF0YSB0eXBlIHdoaWNoIG11c3Qgbm90IGRlcGVuZCBvbiBzdWNoIHNldHRpbmcuIFRoaXMgYnJlYWtzIEFCSSBmb3IKICBsaWJjdXJsIGxpYnJhcmllcyBidWlsdCB3aXRoIFN1biBjb21waWxlcnMgd2hpY2ggd2VyZSBidWlsdCB3aXRob3V0CiAgaGF2aW5nIHJ1biB0aGUgY29uZmlndXJlIHNjcmlwdCB3aXRoIF9GSUxFX09GRlNFVF9CSVRTIGRpZmZlcmVudCB0aGFuCiAgNjQgYW5kIHVzaW5nIHRoZSBJTFAzMiBkYXRhIG1vZGVsLgoKRGFuaWVsIFN0ZW5iZXJnICgxIEFwciAyMDA5KQotIEFuZHJlIEd1aWJlcnQgZGUgQnJ1ZXQgZml4ZWQgYSBOVUxMIHBvaW50ZXIgdXNlIGluIGFuIGluZm9mKCkgY2FsbCBpZiBhCiAgc3RyZHVwKCkgY2FsbCBmYWlsZWQuCgpEYW5pZWwgRmFuZHJpY2ggKDMxIE1hciAyMDA5KQotIFByb3Blcmx5IHJldHVybiBhbiBlcnJvciBjb2RlIGluIGN1cmxfZWFzeV9yZWN2IChyZXBvcnRlZCBieSBKaW0gRnJlZW1hbikuCgpEYW5pZWwgU3RlbmJlcmcgKDE4IE1hciAyMDA5KQotIEthbWlsIER1ZGthIGJyb3VnaHQgYSBwYXRjaCB0aGF0IGVuYWJsZXMgNiBhZGRpdGlvbmFsIGNyeXB0byBhbGdvcml0aG1zIHdoZW4KICBOU1MgaXMgdXNlZC4gVGhlc2UgY2lwaGVycyB3ZXJlIGFkZGVkIGluIE5TUyAzLjQgYW5kIHJlcXVpcmUgdG8gYmUgZW5hYmxlZAogIGV4cGxpY2l0bHkuCgpEYW5pZWwgU3RlbmJlcmcgKDEzIE1hciAyMDA5KQotIFVzZSBsaWJzc2gyX3ZlcnNpb24oKSB0byBwcmVzZW50IHRoZSBsaWJzc2gyIHZlcnNpb24gaW4gY2FzZSB0aGUgbGlic3NoMgogIGxpYnJhcnkgaXMgZm91bmQgdG8gc3VwcG9ydCBpdC4KCllhbmcgVHNlICgxMiBNYXIgMjAwOSkKLSBBZGRlZCBtaXNzaW5nIEN1cmxfcmVhZCgpIHJldHVybiBjb2RlIGNoZWNraW5nIGluIFRFTE5FVCB0cmFuc2ZlcnMuCgotIFBpZXJyZSBCcmljbyBmb3VuZCBhbmQgZml4ZWQgVEVMTkVUIHRyYW5zZmVycyBub3QgYmVpbmcgYWJvcnRlZCB1cG9uCiAgYSB3cml0ZSBjYWxsYmFjayBmYWlsdXJlLgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBNYXIgMjAwOSkKLSBLYW1pbCBEdWRrYSBtYWRlIHRoZSBjdXJsIHRvb2wgcHJvcGVybHkgY2FsbCBjdXJsX2dsb2JhbF9pbml0KCkgYmVmb3JlIGFueQogIG90aGVyIGxpYmN1cmwgZnVuY3Rpb24uCgpZYW5nIFRzZSAoMTEgTWFyIDIwMDkpCi0gQWRkZWQgbWlzc2luZyBURUxORVQgdGltZW91dCBzdXBwb3J0IGZvciBXaW5kb3dzIGJ1aWxkcy4gVGhpcyBpc3N1ZSB3YXMKICByZXBvcnRlZCBieSBQaWVycmUgQnJpY28uCgpEYW5pZWwgU3RlbmJlcmcgKDkgTWFyIDIwMDkpCi0gRnJhbmsgSGVtcGVsIGZvdW5kIG91dCBhIGJ1ZyBhbmQgcHJvdmlkZWQgdGhlIGZpeDoKCiAgY3VybF9lYXN5X2R1cGhhbmRsZSBkaWQgbm90IG5lY2Vzc2FyaWx5IGR1cGxpY2F0ZSB0aGUgQ1VSTE9QVF9DT09LSUVGSUxFCiAgb3B0aW9uLiBJdCBvbmx5IGVuYWJsZWQgdGhlIGNvb2tpZSBlbmdpbmUgaW4gdGhlIGRlc3RpbmF0aW9uIGhhbmRsZSBpZgogIGRhdGEtPmNvb2tpZXMgaXMgbm90IE5VTEwgKHdoZXJlIGRhdGEgaXMgdGhlIHNvdXJjZSBoYW5kbGUpLiBJbiBjYXNlIG9mIGEKICBuZXdseSBpbml0aWFsaXplZCBoYW5kbGUgd2hpY2gganVzdCBoYWQgdGhlIGNvb2tpZSBzdXBwb3J0IGVuYWJsZWQgYnkgYQogIGN1cmxfZWFzeV9zZXRvcHQoaGFuZGxlLCBDVVJMX0NPT0tJRUZJTEUsICIiKS1jYWxsLCBoYW5kbGUtPmNvb2tpZXMgd2FzCiAgc3RpbGwgTlVMTCBiZWNhdXNlIHRoZSBzZXRvcHQtY2FsbCBvbmx5IGFwcGVuZHMgdGhlIHZhbHVlIHRvCiAgZGF0YS0+Y2hhbmdlLmNvb2tpZWxpc3QsIGhlbmNlIGR1cGxpY2F0aW5nIHRoaXMgaGFuZGxlIHdvdWxkIG5vdCBoYXZlIHRoZQogIGNvb2tpZSBlbmdpbmUgc3dpdGNoZWQgb24uCgogIFdlIGFsc28gY29uY2x1ZGVkIHRoYXQgdGhlIHNsaXN0LWZ1bmN0aW9uYWxpdHkgd291bGQgYmUgc3VpdGFibGUgZm9yIGJlaW5nCiAgcHV0IGluIGl0cyBvd24gbW9kdWxlIHJhdGhlciB0aGFuIHNpbXBseSBoYW5naW5nIG91dCBpbiBsaWIvc2VuZGYuYyBzbyBJCiAgY3JlYXRlZCBsaWIvc2xpc3QuW2NoXSBmb3IgdGhlbS4KCi0gQW5kcmVhcyBGYXJiZXIgbWFkZSB0aGUgJ2J1aWxkY29uZicgc2NyaXB0IGNoZWNrIGZvciB0aGUgcHJlc2VuY2Ugb2YgbTQKICBzY3JpcHRzIHRvIG1ha2UgaXQgZGV0ZWN0IGEgYmFkIGNoZWNrb3V0IGVhcmxpZXIuIFBlb3BsZSB3aXRoIG9sZGVyCiAgY2hlY2tvdXRzIHdobyBkb24ndCBkbyBjdnMgdXBkYXRlIHdpdGggdGhlIC1kIG9wdGlvbiB3b24ndCBnZXQgdGhlIG5ldyBkaXJzCiAgYW5kIHRoZW4gd2lsbCBnZXQgZnVubnkgb3V0cHV0cyB0aGF0IGNhbiBiZSBhIGJpdCBoYXJkIHRvIHVuZGVyc3RhbmQgYW5kCiAgZml4LgoKRGFuaWVsIFN0ZW5iZXJnICg4IE1hciAyMDA5KQotIEFuZHJlIEd1aWJlcnQgZGUgQnJ1ZXQgZm91bmQgYW5kIGZpeGVkIGEgY29kZSBzZWdtZW50IGluIHNzbHVzZS5jIHdoZXJlIHRoZQogIGFsbG9jYXRpb24gb2YgdGhlIG1lbW9yeSBCSU8gd2FzIG5vdCBiZWluZyBwcm9wZXJseSBjaGVja2VkLgoKLSBBbmRyZSBHdWliZXJ0IGRlIEJydWV0IGZpeGVkIHRoZSBnbnV0bHMtdXNpbmcgY29kZTogVGhlcmUgYXJlIGEgZmV3IHBsYWNlcwogIGluIHRoZSBnbnV0bHMgY29kZSB3aGVyZSB3ZSB3ZXJlIGNoZWNraW5nIGZvciBuZWdhdGl2ZSB2YWx1ZXMgZm9yIGVycm9ycywKICB3aGVuIHRoZSBtYW4gcGFnZXMgc3RhdGUgdGhhdCBHTlVUTFNfRV9TVUNDRVNTIGlzIHJldHVybmVkIG9uIHN1Y2Nlc3MgYW5kCiAgb3RoZXIgdmFsdWVzIGluZGljYXRlIGVycm9yIGNvbmRpdGlvbnMuCgotIEJpbGwgRWdlcnQgcG9pbnRlZCBvdXQgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI2NzE2MDIpIHRoYXQKICBjdXJsIGRpZG4ndCB1c2Ugc3ByaW50ZigpIGluIGEgd2F5IHRoYXQgaXMgZG9jdW1lbnRlZCB0byB3b3JrIGluIFBPU0lYIGJ1dAogIHNpbmNlIHdlIHVzZSBvdXIgb3duIHByaW50ZigpIGNvZGUgKGZyb20gbGliY3VybCkgdGhhdCBzaG91bGRuJ3QgYmUgYQogIHByb2JsZW0uIE5vbmV0aGVsZXNzIEkgbW9kaWZpZWQgdGhlIGNvZGUgdG8gbm90IHJlbHkgb24gc3VjaCBwYXJ0aWN1bGFyCiAgZmVhdHVyZXMgYW5kIHRvIG5vdCBjYXVzZSBmdXJ0aGVyIHJhaXNlZCBleWVicm93c2Ugd2l0aCBubyBnb29kIHJlYXNvbi4KCkRhbmllbCBGYW5kcmljaCAoNSBNYXIgMjAwOSkKLSBFeHBhbmRlZCB0aGUgc2VjdXJpdHkgc2VjdGlvbiBvZiB0aGUgbGliY3VybC10dXRvcmlhbCBtYW4gcGFnZSB0byBjb3ZlcgogIG1vcmUgaXNzdWVzIGZvciBhdXRob3JzIHRvIGNvbnNpZGVyIHdoZW4gd3JpdGluZyByb2J1c3QgbGliY3VybC11c2luZwogIGFwcGxpY2F0aW9ucy4KCllhbmcgVHNlICg1IE1hciAyMDA5KQotIEZpeGVkIE5UTE0gYXV0aGVudGljYXRpb24gbWVtb3J5IGxlYWsgb24gU1NQSSBlbmFibGVkIFdpbmRvd3MgYnVpbGRzLiBUaGlzCiAgaXNzdWUgd2FzIG5vdGljZWQgYnkgQ2hyaXMgRGVpZHVuLgoKRGFuaWVsIEZhbmRyaWNoICg0IE1hciAyMDA5KQotIEZpeGVkIGEgcHJvYmxlbSB3aXRoIG00IHF1b3RpbmcgaW4gdGhlIE9wZW5TU0wgY29uZmlndXJlIGNoZWNrIHJlcG9ydGVkCiAgYnkgRGFuaWVsIEpvaG5zb24uCgpEYW5pZWwgU3RlbmJlcmcgKDMgTWFyIDIwMDkpCi0gRGF2aWQgSmFtZXMgYnJvdWdodCBhIHBhdGNoIHRoYXQgbWFrZSBsaWJjdXJsIGNsb3NlIChhbGwpIGRlYWQgY29ubmVjdGlvbnMKICB3aGVuZXZlciB5b3UgYXR0ZW1wdCB0byBvcGVuIGEgbmV3IGNvbm5lY3Rpb24uCgogIDEuIEFmdGVyIGNsZWFuaW5nIHVwIGEgZGVhZCBjb25uZWN0aW9uLCAiY29udGludWUiIGluc3RlYWQgb2YKICAgICByZXR1cm5pbmcgRkFMU0UuIFRoaXMgZW5zdXJlcyB0aGF0IHdlIGNsZWFuIHVwIGFsbCBkZWFkIGNvbm5lY3Rpb25zLAogICAgIHJhdGhlciB0aGFuIGp1c3QgY2xlYW5pbmcgdXAgdGhlIGZpcnN0IGRlYWQgY29ubmVjdGlvbi4KICAyLiBNb3ZlIHVwIHRoZSBjbGVhbnVwIGZvciBkZWFkIGNvbm5lY3Rpb25zIHNvIHRoYXQgaXQgb2NjdXJzIGZvcgogICAgIGFsbCBjb25uZWN0aW9ucywgcmF0aGVyIHRoYW4ganVzdCB0aGUgY29ubmVjdGlvbnMgd2hpY2ggaGF2ZSB0aGUgc2FtZQogICAgIHByZWZlcmVuY2VzIGFzIG91ciBjdXJyZW50IG5ldyBjb25uZWN0aW9uLgoKVmVyc2lvbiA3LjE5LjQgKDMgTWFyY2ggMjAwOSkKCkRhbmllbCBTdGVuYmVyZyAoMyBNYXIgMjAwOSkKLSBEYXZpZCBLaWVyem5vd3NraSBub3RpZmllZCB1cyBhYm91dCBhIHNlY3VyaXR5IGZsYXcKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9kb2NzL2Fkdl8yMDA5MDMwMy5odG1sIGFsc28ga25vd24gYXMgQ1ZFLTIwMDktMDAzNykgaW4KICB3aGljaCBwcmV2aW91cyBsaWJjdXJsIHZlcnNpb25zIChieSBkZXNpZ24pIGNhbiBiZSB0cmlja2VkIHRvIGFjY2VzcyBhbgogIGFyYml0cmFyeSBsb2NhbC9kaWZmZXJlbnQgZmlsZSBpbnN0ZWFkIG9mIGEgcmVtb3RlIG9uZSB3aGVuCiAgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiBpcyBlbmFibGVkLiBUaGlzIGZsYXcgaXMgbm93IGZpeGVkIGluIHRoaXMgcmVsZWFzZQogIHRvZ2V0aGVyIHRoaXMgdGhlIGFkZGl0aW9uIG9mIHR3byBuZXcgc2V0b3B0IG9wdGlvbnMgZm9yIGNvbnRyb2xsaW5nIHRoaXMKICBuZXcgYmVoYXZpb3I6CgogIG8gQ1VSTE9QVF9SRURJUl9QUk9UT0NPTFMgY29udHJvbHMgd2hhdCBwcm90b2NvbHMgbGliY3VybCBpcyBhbGxvd2VkIHRvCiAgZm9sbG93IHRvIHdoZW4gQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiBpcyBlbmFibGVkLiBCeSBkZWZhdWx0LCB0aGlzIG9wdGlvbgogIGV4Y2x1ZGVzIHRoZSBGSUxFIGFuZCBTQ1AgcHJvdG9jb2xzIGFuZCB0aHVzIHlvdSBuZWUgdG8gZXhwbGljaXRseSBhbGxvdwogIHRoZW0gaW4geW91ciBhcHAgaWYgeW91IHJlYWxseSB3YW50IHRoYXQgYmVoYXZpb3IuCgogIG8gQ1VSTE9QVF9QUk9UT0NPTFMgY29udHJvbHMgd2hhdCBwcm90b2NvbChzKSBsaWJjdXJsIGlzIGFsbG93ZWQgdG8gZmV0Y2gKICB1c2luZyB0aGUgcHJpbWFyeSBVUkwgb3B0aW9uLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBhbGxvdyBhIHVzZXIgb3IKICBvdGhlciBvdXRzaWRlcnMgY29udHJvbCB3aGF0IFVSTCB0byBwYXNzIHRvIGxpYmN1cmwgYW5kIHlldCBub3QgYWxsb3cgYWxsCiAgcHJvdG9jb2xzIGxpYmN1cmwgbWF5IGhhdmUgYmVlbiBidWlsdCB0byBzdXBwb3J0LgoKRGFuaWVsIFN0ZW5iZXJnICgyNyBGZWIgMjAwOSkKLSBTZW50aGlsIFJhamEgVmVsdSByZXBvcnRlZCBhIHByb2JsZW0gd2hlbiBDVVJMT1BUX0lOVEVSRkFDRSBhbmQKICBDVVJMT1BUX0xPQ0FMUE9SVCB3ZXJlIHVzZWQgdG9nZXRoZXIgKHRoZSBsb2NhbCBwb3J0IGJpbmQgZmFpbGVkKSwgYW5kCiAgTWFya3VzIEtvZXR0ZXIgcHJvdmlkZWQgdGhlIGZpeCEKCkRhbmllbCBTdGVuYmVyZyAoMjUgRmViIDIwMDkpCi0gQXMgRGFuaWVsIEZhbmRyaWNoIGZpZ3VyZWQgb3V0LCB3ZSBtdXN0IGRvIHRoZSBHbnVUTFMgaW5pdGluZyBpbiB0aGUKICBjdXJsX2dsb2JhbF9pbml0KCkgZnVuY3Rpb24gdG8gcHJvcGVybHkgbWFpbnRhaW4gdGhlIHBlcmZvcm1pbmcgZnVuY3Rpb25zCiAgdGhyZWFkLXNhZmUuIFdlJ3ZlIHByZXZpb3VzbHkgKDI4IEFwcmlsIDIwMDcpIG1vdmVkIHRoZSBpbml0IHRvIGEgbGF0ZXIgdGltZQogIGp1c3QgdG8gYXZvaWQgaXQgdG8gZmFpbCB2ZXJ5IGVhcmx5IHdoZW4gbGliZ2NyeXB0IGRpc2xpa2VzIHRoZSBzaXR1YXRpb24sCiAgYnV0IHRoYXQgbW92ZSB3YXMgYmFkIGFuZCB0aGUgZml4IHNob3VsZCByYXRoZXIgYmUgaW4gbGliZ2NyeXB0IG9yCiAgZWxzZXdoZXJlLgoKRGFuaWVsIFN0ZW5iZXJnICgyNCBGZWIgMjAwOSkKLSBCcmlhbiBKLiBNdXJyZWxsIGZvdW5kIG91dCB0aGF0IE5lZ290aWF0ZSBwcm94eSBhdXRoZW50aWNhdGlvbiBkaWRuJ3Qgd29yay4KICBJdCBoYXBwZW5lZCBiZWNhdXNlIHRoZSBjb2RlIHVzZWQgdGhlIHN0cnVjdCBmb3Igc2VydmVyLWJhc2VkIGF1dGggYWxsIHRoZQogIHRpbWUgZm9yIGJvdGggcHJveHkgYW5kIHNlcnZlciBhdXRoIHdoaWNoIG9mIGNvdXJzZSB3YXMgd3JvbmcuCgpEYW5pZWwgU3RlbmJlcmcgKDIzIEZlYiAyMDA5KQotIEFmdGVyIGEgYnVnIHJlcG9ydGVkIGJ5IEphbWVzIENoZW5nIEkndmUgbWFkZSBjdXJsX2Vhc3lfZ2V0aW5mbygpIGZvcgogIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX0RPV05MT0FEIGFuZCBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9VUExPQUQgcmV0dXJuCiAgLTEgaWYgdGhlIHNpemVzIGFyZW4ndCBrbm93LiBQcmV2aW91c2x5IHRoZXNlIHJldHVybmVkIDAsIG1ha2UgaXQgaW1wb3NzaWJsZQogIHRvIGRldGVjdCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGFjdHVhbGx5IHplcm8gYW5kIHVua25vd24uCgpZYW5nIFRzZSAoMjMgRmViIDIwMDkpCi0gRGFuaWVsIEpvaG5zb24gcHJvdmlkZWQgYSBzaGVsbCBzY3JpcHQgdGhhdCB3aWxsIHBlcmZvcm0gYWxsIHRoZSBzdGVwcyBuZWVkZWQKICB0byBidWlsZCBhIE1hYyBPUyBYIGZhdCBwcGMvaTM4NiBvciBwcGM2NC94ODZfNjQgbGliY3VybC5mcmFtZXdvcmsKCkRhbmllbCBTdGVuYmVyZyAoMjMgRmViIDIwMDkpCi0gSSByZW5hbWVkIGV2ZXJ5dGhpbmcgaW4gdGhlIHdpbmRvd3MgYnVpbGRzIGZpbGVzIHRoYXQgdXNlZCB0aGUgbmFtZSAnY3VybGxpYicKICB0byB0aGUgcHJvcGVyICdsaWJjdXJsJyBhcyBjbGVhcmx5IHRoaXMgY2F1c2VkIGNvbmZ1c2lvbi4KCllhbmcgVHNlICgyMCBGZWIgMjAwOSkKLSBEbyBub3QgaGFsdCBjb21waWxhdGlvbiB3aGVuIHVzaW5nIFZTMjAwOCB0byBidWlsZCBhIFdpbmRvd3MgMjAwMCB0YXJnZXQuCgpEYW5pZWwgU3RlbmJlcmcgKDIwIEZlYiAyMDA5KQotIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgcmVwb3J0ZWQgYW5kIGhlbHBlZCBtZSByZXBlYXQgYW5kIGZpeCBhIHByb2JsZW0gd2l0aAogIEZUUCB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2U6IHdoZW4gYSB0cmFuc2ZlciBmYWlscywgbGlrZSB3aGVuIGFib3J0ZWQgYnkgYQogIHdyaXRlIGNhbGxiYWNrLCB0aGUgY29udHJvbCBjb25uZWN0aW9uIHdhcyB3cm9uZ2x5IGNsb3NlZCBhbmQgdGh1cyBub3QKICByZS11c2VkIHByb3Blcmx5LgoKICBUaGlzIGNoYW5nZSBpcyBhbHNvIGFuIGF0dGVtcHQgdG8gY2xlYW51cCB0aGUgY29kZSBzb21ld2hhdCBpbiB0aGlzIGFyZWEsIGFzCiAgbm93IHRoZSBGVFAgY29kZSBhdHRlbXB0cyB0byBrZWVwIChiZXR0ZXIpIHRyYWNrIG9uIHBlbmRpbmcgcmVzcG9uc2VzCiAgbmVjZXNzYXJ5IHRvIGdldCByZWFkIGluIGZ0cF9kb25lKCkuCgpEYW5pZWwgU3RlbmJlcmcgKDE5IEZlYiAyMDA5KQotIFBhdHJpayBUaHVuc3Ryb20gcmVwb3J0ZWQgYSBwcm9ibGVtIGFuZCBoZWxwZWQgbWUgcmVwZWF0IGl0LiBJdCB0dXJuZWQgb3V0CiAgbGliY3VybCBkaWQgYSBzdXBlcmZsdW91cyAxMDAwbXMgd2FpdCB3aGVuIGRvaW5nIFNGVFAgZG93bmxvYWRzIQoKICBXZSByZWFkIGRhdGEgd2l0aCBsaWJzc2gyIHdoaWxlIGRvaW5nIHRoZSAiRE8iIG9wZXJhdGlvbiBmb3IgU0ZUUCBhbmQgdGhlbgogIHdoZW4gd2Ugd2VyZSBhYm91dCB0byBzdGFydCBnZXR0aW5nIGRhdGEgZm9yIHRoZSBhY3R1YWwgZmlsZSBwYXJ0LCB0aGUKICAiVFJBTlNGRVIiIHBhcnQsIHdlIHdhaXRlZCBmb3Igc29ja2V0IGFjdGlvbiAoaW4gMTAwMG1zKSBiZWZvcmUgZG9pbmcgYQogIGxpYnNzaDItcmVhZC4gQnV0IGluIHRoaXMgY2FzZSBsaWJzc2gyIGhhZCBhbHJlYWR5IHJlYWQgYW5kIGJ1ZmZlcmVkIHRoZQogIGRhdGEgc28gd2UgZW5kZWQgdXAgYWx3YXlzIGp1c3Qgd2FpdGluZyAxMDAwbXMgYmVmb3JlIHdlIGdldCB3b3JraW5nIG9uIHRoZQogIGRhdGEhCgpQYXRyaWNrIE1vbm5lcmF0ICgxOCBGZWIgMjAwOSkKLSBGVFAgZG93bmxvYWRzIChpLmUuOiBSRVRSKSBlbmRpbmcgd2l0aCBjb2RlIDU1MCBub3cgcmV0dXJuIGVycm9yCiAgQ1VSTEVfUkVNT1RFX0ZJTEVfTk9UX0ZPVU5EIGluc3RlYWQgb2YgQ1VSTEVfRlRQX0NPVUxETlRfUkVUUl9GSUxFLgoKRGFuaWVsIFN0ZW5iZXJnICgxNyBGZWIgMjAwOSkKLSBLYW1pbCBEdWRrYSBtYWRlIE5TUy1wb3dlcmVkIGJ1aWxkcyBjb21waWxlIGFuZCBydW4gYWdhaW4hCgotIEEgc2Vjb25kIGZvbGxvdy11cCBjaGFuZ2UgYnkgQW5kcmUgR3VpYmVydCBkZSBCcnVldCB0byBmaXggYSByZWxhdGVkIG1lbW9yeQogIGxlYWsgbGlrZSB0aGF0IGZpeGVkIG9uIHRoZSAxNHRoLiBXaGVuIHpsaWIgcmV0dXJucyBmYWlsdXJlLCB3ZSBuZWVkIHRvCiAgY2xlYW51cCBwcm9wZXJseSBiZWZvcmUgcmV0dXJuaW5nIGVycm9yLgoKLSBDVVJMT1BUX0ZUUF9DUkVBVEVfTUlTU0lOR19ESVJTIGNhbiBub3cgYmUgc2V0IHRvIDIgaW4gYWRkaXRpb24gdG8gMSBmb3IKICBwbGFpbiBGVFAgY29ubmVjdGlvbnMsIGFuZCBpdCB3aWxsIHRoZW4gYWxsb3cgTUtEIHRvIGZhaWwgb25jZSBhbmQgcmV0cnkgdGhlCiAgQ1dEIGFmdGVyd2FyZHMuIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgaWYgeW91J3JlIGRvaW5nIG1hbnkgc2ltdWx0YW5vZXMKICBjb25uZWN0aW9ucyBhZ2FpbnN0IHRoZSBzYW1lIHNlcnZlciBhbmQgdGhleSBhbGwgaGF2ZSB0aGlzIG9wdGlvbiBlbmFibGVkLAogIGFzIHRoZW4gQ1dEIG1heSBmaXJzdCBmYWlsIGJ1dCB0aGVuIGFub3RoZXIgY29ubmVjdGlvbiBkb2VzIE1LRCBiZWZvcmUgdGhpcwogIGNvbm5lY3Rpb24gYW5kIHRodXMgTUtEIGZhaWxzIGJ1dCB0cnlpbmcgQ1dEIHdvcmtzISBUaGUgbnVtYmVycyBjYW4KICAoc2hvdWxkPykgbm93IGJlIHNldCB3aXRoIHRoZSBjb252ZW5pZW5jZSBlbnVtcyBub3cgY2FsbGVkCiAgQ1VSTEZUUF9DUkVBVEVfRElSIGFuZCBDVVJMRlRQX0NSRUFURV9ESVJfUkVUUlkuCgogIFRlc3RzIGhhcyBwcm92ZW4gdGhhdCBpZiB5b3UncmUgbWFraW5nIGFuIGFwcGxpY2F0aW9uIHRoYXQgdXBsb2FkcyBhIHNldCBvZgogIGZpbGVzIHRvIGFuIGZ0cCBzZXJ2ZXIsIHlvdSB3aWxsIGdldCBhIG5vdGljYWJsZSBnYWluIGluIHNwZWVkIGlmIHlvdSdyZQogIHVzaW5nIG11bHRpcGxlIGNvbm5lY3Rpb25zIGFuZCB0aGlzIG9wdGlvbiB3aWxsIGJlIHRoZW4gYmUgdmVyeSB1c2VmdWwuCgpEYW5pZWwgU3RlbmJlcmcgKDE0IEZlYiAyMDA5KQotIEFuZHJlIEd1aWJlcnQgZGUgQnJ1ZXQgZm91bmQgYW5kIGZpeGVkIGEgbWVtb3J5IGxlYWsgaW4gdGhlIGNvbnRlbnQgZW5jb2RpbmcKICBjb2RlLCB3aGljaCBjb3VsZCBoYXBwZW4gb24gbGlieiBlcnJvcnMuCgpEYW5pZWwgRmFuZHJpY2ggKDEyIEZlYiAyMDA5KQotIEFkZGVkIHN1cHBvcnQgZm9yIERpZ2VzdCBhbmQgTlRMTSBhdXRoZW50aWNhdGlvbiB1c2luZyBHbnVUTFMuCgpEYW5pZWwgU3RlbmJlcmcgKDExIEZlYiAyMDA5KQotIENVUkxJTkZPX0NPTkRJVElPTl9VTk1FVCB3YXMgYWRkZWQgdG8gYWxsb3cgYW4gYXBwbGljYXRpb24gdG8gZ2V0IHRvIGtub3cgaWYKICB0aGUgY29uZGl0aW9uIGluIHRoZSBwcmV2aW91cyByZXF1ZXN0IHdhcyB1bm1ldC4gVGhpcyBpcyB0eXBpY2FsbHkgYSB0aW1lCiAgY29uZGl0aW9uIHNldCB3aXRoIENVUkxPUFRfVElNRUNPTkRJVElPTiBhbmQgd2FzIHByZXZpb3VzbHkgbm90IHBvc3NpYmxlIHRvCiAgcmVsaWFibHkgZmlndXJlIG91dC4gRnJvbSBidWcgcmVwb3J0ICMyNTY1MTI4CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI1NjUxMjgpIGZpbGVkIGJ5IEpvY2VseW4gSmF1YmVydC4KCkRhbmllbCBGYW5kcmljaCAoNCBGZWIgMjAwOSkKLSBEb24ndCBhZGQgdGhlIHN0YW5kYXJkIC91c3IvbGliIG9yIC91c3IvaW5jbHVkZSBwYXRocyB0byBMREZMQUdTIGFuZCBDUFBGTEFHUwogIChyZXNwZWN0aXZlbHkpIHdoZW4gLS13aXRoLXNzbD0vdXNyIGlzIHVzZWQgKHBhdGNoIGJhc2VkIG9uIEZyZWVCU0QpLgoKLSBBZGRlZCBhbiBleHBsaWNpdCBidWZmZXIgbGltaXQgY2hlY2sgaW4gbXNkb3NpZnkoKSAocGF0Y2ggYmFzZWQgb24gRnJlZUJTRCkuCiAgVGhpcyBjb3VsZG4ndCBldmVyIG92ZXJmbG93IGluIGN1cmwsIGJ1dCBtaWdodCBpZiB0aGUgY29kZSB3ZXJlIHVzZWQKICBlbHNld2hlcmUgb3IgdW5kZXIgZGlmZmVyZW50IGNvbmRpdGlvbnMuCgpEYW5pZWwgU3RlbmJlcmcgKDMgRmViIDIwMDkpCi0gSGlkZW1vdG8gTmFrYWRhIHByb3ZpZGVkIGEgc21hbGwgZml4IHRoYXQgbWFrZXMgaXQgcG9zc2libGUgdG8gZ2V0IHRoZQogIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX0RPV05MT0FEIHNpemUgZnJvbSBmaWxlOi8vICJ0cmFuc2ZlcnMiIHdpdGgKICBDVVJMT1BUX05PQk9EWSBzZXQgdHJ1ZS4KCkRhbmllbCBTdGVuYmVyZyAoMiBGZWIgMjAwOSkKLSBQYXRyaWNrIFNjb3R0IGZvdW5kIGEgcmF0aGVyIGxhcmdlIG1lbW9yeSBsZWFrIHdoZW4gdXNpbmcgdGhlIG11bHRpCiAgaW50ZXJmYWNlIGFuZCBzZXR0aW5nIENVUkxNT1BUX01BWENPTk5FQ1RTIHRvIHNvbWV0aGluZyBsZXNzIHRoYW4gdGhlIG51bWJlcgogIG9mIGhhbmRsZXMgeW91IGFkZCB0byB0aGUgbXVsdGkgaGFuZGxlLiBBbGwgdGhlIGNvbm5lY3Rpb25zIHRoYXQgZGlkbid0IGZpdAogIGluIHRoZSBjYWNoZSB3b3VsZCBub3QgYmUgcHJvcGVybHkgZGlzY29ubmVjdGVkIG5vciBmcmVlZCEKCi0gQ3JhaWcgQSBXZXN0IGJyb3VnaHQgdXM6IGxpYmN1cmwgbm93IGRlZmF1bHRzIHRvIGRvIENPTk5FQ1Qgd2l0aCBIVFRQCiAgdmVyc2lvbiAxLjEgaW5zdGVhZCBvZiAxLjAgbGlrZSBiZWZvcmUuIFRoaXMgY2hhbmdlIGFsc28gaW50cm9kdWNlcyB0aGUgbmV3CiAgcHJveHkgdHlwZSBmb3IgbGliY3VybCBjYWxsZWQgJ0NVUkxQUk9YWV9IVFRQXzFfMCcgdGhhdCB0aGVuIGFsbG93cyBhcHBzIHRvCiAgc3dpdGNoIChiYWNrKSB0byBDT05ORUNUIDEuMCByZXF1ZXN0cy4gVGhlIGN1cmwgdG9vbCBhbHNvIGdvdCBhIC0tcHJveHkxLjAKICBvcHRpb24gdGhhdCB3b3JrcyBleGFjdGx5IGxpa2UgLS1wcm94eSBidXQgc2V0cyBDVVJMUFJPWFlfSFRUUF8xXzAuCgogIEkgdXBkYXRlZCBhbGwgdGVzdCBjYXNlcyBjYXNlcyB0aGF0IHVzZSBDT05ORUNUIGFuZCBJIHRyaWVkIHRvIGRvIHNvbWUgdXNpbmcKICAtLXByb3h5MS4wIGFuZCBzb21lIHVwZGF0ZWQgdG8gZG8gQ09OTkVDVCAxLjEgdG8gZ2V0IGJvdGggdmVyc2lvbnMgcnVuLgoKRGFuaWVsIFN0ZW5iZXJnICgzMSBKYW4gMjAwOSkKLSBXaGVuIGJ1aWxkaW5nIHdpdGggYy1hcmVzIDEuNi4xIChub3QgeWV0IHJlbGVhc2VkKSBvciBsYXRlciBhbmQgSVB2NiBzdXBwb3J0CiAgZW5hYmxlZCwgd2UgY2FuIG5vdyB0YWtlIGFkdmFudGFnZSBvZiBpdHMgYnJhbmQgbmV3IEFGX1VOU1BFQyBzdXBwb3J0IGluCiAgYXJlc19nZXRob3N0YnluYW1lKCkuIFRoaXMgbWFrZXMgdGVzdCBjYXNlIDI0MSBmaW5hbGx5IHJ1biBmaW5lIGZvciBtZSB3aXRoCiAgdGhpcyBzZXR1cCBzaW5jZSBpdCBub3cgcGFyc2VzIHRoZSAiOjoxIGlwNi1sb2NhbGhvc3QiIGxpbmUgZmluZSBpbiBteQogIC9ldGMvaG9zdHMgZmlsZSEKCkRhbmllbCBTdGVuYmVyZyAoMzAgSmFuIDIwMDkpCi0gU2NvdHQgQ2FudG9yIGZpbGVkIGJ1ZyByZXBvcnQgIzI1NTAwNjEKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjU1MDA2MSkgbWVudGlvbmluZyB0aGF0IEkgZmFpbGVkIHRvCiAgcHJvcGVybHkgbWFrZSBzdXJlIHRoYXQgdGhlIFZDOSBtYWtlZmlsZXMgZ290IGluY2x1ZGVkIGluIHRoZSBsYXRlc3QKICByZWxlYXNlLiBJJ3ZlIG5vdyBmaXhlZCB0aGUgcmVsZWFzZSBzY3JpcHQgYW5kIHZlcmlmaWVkIGl0IHNvIG5leHQgcmVsZWFzZQogIHdpbGwgaG9wZWZ1bGx5IGluY2x1ZGUgdGhlbSBwcm9wZXJseSEKCkRhbmllbCBGYW5kcmljaCAoMzAgSmFuIDIwMDkpCi0gRml4ZWQgLS1kaXNhYmxlLXByb3h5IGZvciBGVFAgYW5kIFNPQ0tTLiBUaGFua3MgdG8gRGFuaWVsIEVnZ2VyIGZvcgogIHJlcG9ydGluZy4KCllhbmcgVHNlICgyOSBKYW4gMjAwOSkKLSBJbnRyb2R1Y2VkIGN1cmxfc3NwaS5jIGFuZCBjdXJsX3NzcGkuaCBmb3IgdGhlIGltcGxlbWVudGF0aW9uIG9mIGZ1bmN0aW9ucwogIEN1cmxfc3NwaV9nbG9iYWxfaW5pdCgpIGFuZCBDdXJsX3NzcGlfZ2xvYmFsX2NsZWFudXAoKSB3aGljaCBwcmV2aW91c2x5IHdlcmUKICBuYW1lZCBDdXJsX250bG1fZ2xvYmFsX2luaXQoKSBhbmQgQ3VybF9udGxtX2dsb2JhbF9jbGVhbnVwKCkgaW4gaHR0cF9udGxtLmMKICBBbHNvIGFkanVzdGVkIHNvY2tzX3NzcGkuYyB0byByZW1vdmUgdGhlIGxpbmstdGltZSBkZXBlbmRlbmN5IG9uIHRoZSBXaW5kb3dzCiAgU1NQSSBsaWJyYXJ5IHVzaW5nIGl0IG5vdyBpbiB0aGUgc2FtZSB3YXkgYXMgaXQgd2FzIGRvbmUgaW4gaHR0cF9udGxtLmMuCgpEYW5pZWwgU3RlbmJlcmcgKDI4IEphbiAyMDA5KQotIE1hcmt1cyBNb2VsbGVyIGludHJvZHVjZWQgdHdvIG5ldyBvcHRpb25zIHRvIGxpYmN1cmw6CiAgQ1VSTE9QVF9TT0NLUzVfR1NTQVBJX1NFUlZJQ0UgYW5kIENVUkxPUFRfU09DS1M1X0dTU0FQSV9ORUMgdG8gYWxsb3cgbGliY3VybAogIHRvIGRvIEdTUy1zdHlsZSBhdXRoZW50aWNhdGlvbiB3aXRoIFNPQ0tTNSBwcm94aWVzLiBUaGUgY3VybCB0b29sIGdvdCB0aGUKICBvcHRpb25zIGNhbGxlZCAtLXNvY2tzNS1nc3NhcGktc2VydmljZSBhbmQgLS1zb2NrczUtZ3NzYXBpLW5lYyB0byBlbmFibGUKICB0aGVzZS4KCkRhbmllbCBTdGVuYmVyZyAoMjYgSmFuIDIwMDkpCi0gQ2hhZCBNb25yb2UgcHJvdmlkZWQgdGhlIG5ldyBDVVJMT1BUX1RGVFBfQkxLU0laRSBvcHRpb24gdGhhdCBhbGxvd3MgYW4gYXBwCiAgdG8gc2V0IGRlc2lyZWQgYmxvY2sgc2l6ZSB0byB1c2UgZm9yIFRGVFAgdHJhbnNmZXJzIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQKICA1MTIgYnl0ZXMuCgotIFRoZSAiLW5vX3RpY2tldCIgb3B0aW9uIHdhcyBpbnRyb2R1Y2VkIGluIE9wZW5zc2wwLjkuOGouIEl0J3MgYSBmbGFnIHRvCiAgZGlzYWJsZSAicmZjNDUwN2JpcyBzZXNzaW9uIHRpY2tldCBzdXBwb3J0Ii4gIHJmYzQ1MDdiaXMgd2FzIGxhdGVyIHR1cm5lZAogIGludG8gdGhlIHByb3BlciBSRkM1MDc3IGl0IHNlZW1zOiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MDc3CgogIFRoZSBlbmFibGVkIGV4dGVuc2lvbiBjb25jZXJucyB0aGUgc2Vzc2lvbiBtYW5hZ2VtZW50LiBJIHdvbmRlciBob3cgb2Z0ZW4KICBsaWJjdXJsIHN0b3BzIGEgY29ubmVjdGlvbiBhbmQgdGhlbiByZXN1bWVzIGEgVExTIHNlc3Npb24uIGFsc28sIHNlbmRpbmcgdGhlCiAgc2Vzc2lvbiBkYXRhIGlzIHNvbWUgb3ZlcmhlYWQuIC5JIHN1Z2dlc3QgdGhhdCB5b3UganVzdCB1c2UgeW91ciBwcm9wb3NlZAogIHBhdGNoICh3aGljaCBleHBsaWNpdGx5IGRpc2FibGVzIFRJQ0tFVCkuCgogIElmIHNvbWVvbmUgd3JpdGVzIGFuIGFwcGxpY2F0aW9uIHdpdGggbGliY3VybCBhbmQgb3BlbnNzbCB3aG8gd2FudHMgdG8KICBlbmFibGUgdGhlIGZlYXR1cmUsIG9uZSBjYW4gZG8gdGhpcyBpbiB0aGUgU1NMIGNhbGxiYWNrLgoKICBTaGFyYWQgR3VwdGEgYnJvdWdodCB0aGlzIHRvIG15IGF0dGVudGlvbi4gUGV0ZXIgU3lsdmVzdGVyIGhlbHBlZCBtZSBkZWNpZGUKICBvbiB0aGUgcHJvcGVyIGFjdGlvbi4KCi0gQWxleGV5IEJvcnpvdiBmaWxlZCBidWcgcmVwb3J0ICMyNTM1NTA0CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI1MzU1MDQpIHBvaW50aW5nIG91dCB0aGF0IHJlYWxtcyB3aXRoCiAgcXVvdGVkIHF1b3RhdGlvbiBtYXJrcyBpbiBIVFRQIERpZ2VzdCBoZWFkZXJzIGRpZG4ndCB3b3JrLiBJJ3ZlIG5vdyBhZGRlZAogIHRlc3QgY2FzZSAxMDk1IHRoYXQgdmVyaWZpZXMgbXkgZml4LgoKLSBDcmFpZyBBIFdlc3QgYnJvdWdodCBDVVJMT1BUX05PUFJPWFkgYW5kIHRoZSBjb3JyZXNwb25kaW5nIC0tbm9wcm94eSBvcHRpb24uCiAgVGhleSBiYXNpY2FsbHkgb2ZmZXIgdGhlIHNhbWUgdGhpbmcgdGhlIE5PX1BST1hZIGVudmlyb25tZW50IHZhcmlhYmxlIG9ubHkKICBvZmZlcmVkIHByZXZpb3VzbHk6IGxpc3QgYSBzZXQgb2YgaG9zdCBuYW1lcyB0aGF0IHNoYWxsIG5vdCB1c2UgdGhlIHByb3h5CiAgZXZlbiBpZiBvbmUgaXMgc3BlY2lmaWVkLgoKRGFuaWVsIEZhbmRyaWNoICgyMCBKYW4gMjAwOSkKLSBDYWxsIHNldGxvY2FsZSgpIGZvciBsaWJ0ZXN0IHRlc3RzIHRvIHRlc3QgdGhlIGVmZmVjdHMgb2YgbG9jYWxlLWluZHVjZWQKICBsaWJjIGNoYW5nZXMgb24gbGliY3VybC4KCi0gRml4ZWQgYSBjb3VwbGUgbW9yZSBsb2NhbGUtZGVwZW5kZW50IHRvdXBwZXIgY29udmVyc2lvbnMsIG1haW5seSBmb3IKICBjbGFyaXR5LiAgVGhpcyBkb2VzIGZpeCBvbmUgcHJvYmxlbSB0aGF0IGNhdXNlcyA7dHlwZT1pIEZUUCBVUkxzCiAgdG8gZmFpbCBpbiB0aGUgVHVya2lzaCBsb2NhbGUgd2hlbiBDVVJMT1BUX1BST1hZX1RSQU5TRkVSX01PREUgaXMKICB1c2VkICh0ZXN0IGNhc2UgNTYxKQoKLSBBZGRlZCB0ZXN0cyA1NjEgYW5kIDEwOTEgdGhyb3VnaCAxMDk0IHRvIHRlc3QgdmFyaW91cyBjb21iaW5hdGlvbnMKICBvZiA7dHlwZT0gYW5kIDttb2RlPSBVUkxzIHRoYXQgY291bGQgcG90ZW50aWFsbHkgZmFpbCBpbiB0aGUgVHVya2lzaAogIGxvY2FsZS4KCkRhbmllbCBTdGVuYmVyZyAoMjAgSmFuIDIwMDkpCi0gTGlzYSBYdSBwb2ludGVkIG91dCB0aGF0IHRoZSBzc2gub2JqIGZpbGUgd2FzIG1pc3NpbmcgZnJvbSB0aGUKICBsaWIvTWFrZWZpbGUudmM2IGZpbGUgKGFuZCB0aHVzIGZyb20gdGhlIHZjOCBhbmQgdmM5IG9uZXMgdG9vKS4KClZlcnNpb24gNy4xOS4zICgxOSBKYW51YXJ5IDIwMDkpCgpEYW5pZWwgU3RlbmJlcmcgKDE2IEphbiAyMDA5KQotIEFuZHJldyBkZSBsb3MgUmV5ZXMgZml4ZWQgY3VybGJ1aWxkLmggZm9yICJnZW5lcmljIiBnY2MgYnVpbGRzIG9uIFBQQywgYm90aAogIDMyIGJpdCBhbmQgNjQgYml0LgoKRGFuaWVsIFN0ZW5iZXJnICgxNSBKYW4gMjAwOSkKLSBUaW0gQW5zZWxsIGZpeGVkIGEgY29tcGlsZXIgd2FybmluZyBpbiBsaWIvY29va2llLmMKCkRhbmllbCBTdGVuYmVyZyAoMTQgSmFuIDIwMDkpCi0gR3JhbnQgRXJpY2tzb24gZml4ZWQgdGltZW91dHMgZm9yIFRGVFAgc3VjaCB0aGF0IHNwZWNpZnlpbmcgYQogIGNvbm5lY3QtdGltZW91dCwgYSBtYXgtdGltZSBvciBib3RoIG9wdGlvbnMgd29yayBjb3JyZWN0bHkgYW5kIGFzIGV4cGVjdGVkCiAgYnkgcGFzc2luZyB0aGUgY29ycmVjdCBib29sZWFuIHZhbHVlIHRvIEN1cmxfdGltZWxlZnQgdmlhIHRoZQogICdkdXJpbmdjb25uZWN0JyBwYXJhbWV0ZXIuCgogIFdpdGggdGhpcyBzbWFsbCBjaGFuZ2UsIGN1cmwgVEZUUCBub3cgYmVoYXZlcyBhcyBleHBlY3RlZCAoYW5kIGxpa2VseSBhcwogIG9yaWdpbmFsbHktZGVzaWduZWQpOgoKICAxKSBGb3Igbm9uLWV4aXN0ZW50IG9yIHVucmVhY2hhYmxlIGRvdHRlZCBJUCBhZGRyZXNzZXM6CgogICBhKSBXaXRoIG5vIG9wdGlvbnMsIGZvbGxvd3MgdGhlIGRlZmF1bHQgY3VybCAzMDBzIHRpbWVvdXQuLi4KICAgYikgV2l0aCAtLWNvbm5lY3QtdGltZW91dCBvbmx5LCBmb2xsb3dzIHRoYXQgdmFsdWUuLi4KICAgYykgV2l0aCAtLW1heC10aW1lIG9ubHksIGZvbGxvd3MgdGhhdCB2YWx1ZS4uLgogICBkKSBXaXRoIGJvdGggLS1jb25uZWN0LXRpbWVvdXQgYW5kIC0tbWF4LXRpbWUsIGZvbGxvd3MgdGhlIHNtYWxsZXIgdmFsdWUuLi4KCiAgIGFuZCB0aW1lcyBvdXQgd2l0aCBhICJjdXJsOiAoNykgQ291bGRuJ3QgY29ubmVjdCB0byBzZXJ2ZXIiIGVycm9yLgoKICAyKSBGb3IgdHJhbnNmZXJzIHRvL2Zyb20gYSB2YWxpZCBob3N0OgoKICAgYSkgV2l0aCBubyBvcHRpb25zLCBmb2xsb3dzIGRlZmF1bHQgY3VybCAzMDBzIHRpbWVvdXQgZm9yIHRoZQogICAgICBmaXJzdCBYUlEvREFUQS9BQ0sgdHJhbnNhY3Rpb24gYW5kIHRoZSBkZWZhdWx0IFRGVFAgMzYwMHMKICAgICAgdGltZW91dCBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgdHJhbnNmZXIuLi4KCiAgIGIpIFdpdGggLS1jb25uZWN0LXRpbWUgb25seSwgZm9sbG93cyB0aGF0IHZhbHVlIGZvciB0aGUKICAgICAgZmlyc3QgWFJRL0RBVEEvQUNLIHRyYW5zYWN0aW9uIGFuZCB0aGUgZGVmYXVsdCBURlRQIDM2MDBzCiAgICAgIHRpbWVvdXQgZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIHRyYW5zZmVyLi4uCgogICBjKSBXaXRoIC0tbWF4LXRpbWUgb25seSwgZm9sbG93cyB0aGF0IHZhbHVlIGZvciB0aGUgZmlyc3QKICAgICAgWFJRL0RBVEEvQUNLIHRyYW5zYWN0aW9uIGFuZCBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUKICAgICAgdHJhbnNmZXIuLi4KCiAgIGQpIFdpdGggYm90aCAtLWNvbm5lY3QtdGltZW91dCBhbmQgLS1tYXgtdGltZSwgZm9sbG93cyB0aGUgZm9ybWVyCiAgICAgIGZvciB0aGUgZmlyc3QgWFJRL0RBVEEvQUNLIHRyYW5zYWN0aW9uIGFuZCB0aGUgbGF0dGVyIGZvciB0aGUKICAgICAgcmVtYWluZGVyIG9mIHRoZSB0cmFuc2Zlci4uLgoKICAgYW5kIHRpbWVzIG91dCB3aXRoIGEgImN1cmw6ICgyOCkgVGltZW91dCB3YXMgcmVhY2hlZCIgZXJyb3IgYXMKICAgYXBwcm9wcmlhdGUuCgpEYW5pZWwgU3RlbmJlcmcgKDEzIEphbiAyMDA5KQotIE1pY2hhZWwgV2FsbG5lciBmaXhlZCBhIE5VTEwgcG9pbnRlciBkZXJlZiB3aGVuIGNhbGxpbmcKICBjdXJsX2Vhc3lfc2V0dXAoY3VybCwgQ1VSTE9QVF9DT09LSUVMSVNULCAiU0VTUyIpIG9uIGEgQ1VSTCBoYW5kbGUgd2l0aCBubwogIGNvb2tpZXMgZGF0YS4KCi0gU3RlZmFuIFRlbGVtYW4gYnJvdWdodCBhIHBhdGNoIHRvIGZpeCB0aGUgZGVmYXVsdCBjdXJsYnVpbGQuaCBmaWxlIGZvciB0aGUKICBTdW5Qcm8gY29tcGlsZXJzLgoKRGFuaWVsIFN0ZW5iZXJnICgxMiBKYW4gMjAwOSkKLSBCYXNlZCBvbiBidWcgcmVwb3J0ICMyNDk4NjY1IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNDk4NjY1KQogIGJ5IERhbmllbCBCbGFjaywgSSd2ZSBub3cgYWRkZWQgbWFnaWMgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdGhhdCBtYWtlcyBpdAogIHVzZSBwa2ctY29uZmlnIHRvIGRldGVjdCBnbnV0bHMgZGV0YWlscyBhcyB3ZWxsIGlmIHRoZSBleGlzdGluZyBtZXRob2QKICAodXNpbmcgbGliZ251dGxzLWNvbmZpZykgZmFpbHMuIFdoaWxlIGRvaW5nIHRoaXMsIEkgY2xlYW5lZCB1cCBhbmQgdW5pZmllZAogIHRoZSBwa2ctY29uZmlnIHVzYWdlIHdoZW4gZGV0ZWN0aW5nIG9wZW5zc2wgYW5kIG5zcyBhcyB3ZWxsLgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBKYW4gMjAwOSkKLSBLYXJsIE1vZXJkZXIgYnJvdWdodCB0aGUgcGF0Y2ggdGhhdCBjcmVhdGVzIHZjOSBNYWtlZmlsZXMsIGFuZCBJIG1hZGUKICAnbWFrZXRneicgbm93IHVzZSB0aGUgYWN0dWFsIG1ha2VmaWxlIHRhcmdldHMgdG8gZG8gdGhlIFZDOCBhbmQgVkM5CiAgbWFrZWZpbGVzLgoKRGFuaWVsIFN0ZW5iZXJnICgxMCBKYW4gMjAwOSkKLSBFbWlsIFJvbWFudXMgZml4ZWQ6CgogIFdoZW4gdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZSBvdmVyIEhUVFAgYW5kIHRoZSBzZXJ2ZXIgcmV0dXJucyBhIExvY2F0aW9uCiAgaGVhZGVyLCB0aGUgcnVubmluZyBlYXN5IGhhbmRsZSB3aWxsIGdldCBzdHVjayBpbiB0aGUgQ1VSTE1fU1RBVEVfUEVSRk9STQogIHN0YXRlLCBsZWF2aW5nIHRoZSBleHRlcm5hbCBldmVudCBsb29wIHN0dWNrIHdhaXRpbmcgZm9yIGRhdGEgZnJvbSB0aGUKICBpbmdvaW5nIHNvY2tldCAod2hlbiB1c2luZyB0aGUgY3VybF9tdWx0aV9zb2NrZXRfYWN0aW9uIHN0dWZmKS4gV2hpbGUgdGhpcwogIGJ1ZyB3YXMgcHJldHR5IGhhcmQgdG8gZmluZCwgaXQgc2VlbXMgdG8gcmVxdWlyZSBvbmx5IGEgb25lLWxpbmUgZml4LiBUaGUKICBicmVhayBzdGF0ZW1lbnQgb24gbGluZSAxMzc0IGluIG11bHRpLmMgY2F1c2VkIHRoZSBmdW5jdGlvbiB0byBza2lwIHRoZSBjYWxsCiAgdG8gbXVsdGlzdGF0ZSgpLgoKICBIb3cgdG8gcmVwcm9kdWNlIHRoaXMgYnVnPyBXZWxsLCB0aGF0J3MgYW5vdGhlciBxdWVzdGlvbi4gIGV2aGlwZXJmaWZvLmMgaW4KICB0aGUgZXhhbXBsZXMgZGlyZWN0b3J5IGNob2tlcyBvbiB0aGlzIGJ1ZyBvbmx5IF9zb21ldGltZXNfLCBwcm9iYWJseQogIGRlcGVuZGluZyBvbiBob3cgZmFzdCB0aGUgVVJMcyBhcmUgYWRkZWQuIE9uZSB3YXkgb2YgdGVzdGluZyB0aGUgYnVnIG91dCBpcwogIHdyaXRpbmcgdG8gaGlwZXIuZmlmbyBmcm9tIG1vcmUgdGhhbiBvbmUgc291cmNlIGF0IHRoZSBzYW1lIHRpbWUuCgpEYW5pZWwgRmFuZHJpY2ggKDcgSmFuIDIwMDkpCi0gVW5pZmllZCBtdWNoIG9mIHRoZSBTZXNzaW9uSGFuZGxlIGluaXRpYWxpemF0aW9uIGRvbmUgaW4gQ3VybF9vcGVuKCkgYW5kCiAgY3VybF9lYXN5X3Jlc2V0KCkgYnkgY3JlYXRpbmcgQ3VybF9pbml0X3VzZXJkZWZpbmVkKCkuIFRoaXMgaGFkIHRoZSBzaWRlCiAgZWZmZWN0IG9mIGZpeGluZyBjdXJsX2Vhc3lfcmVzZXQoKSBzbyBpdCBub3cgYWxzbyByZXNldHMKICBDVVJMT1BUX0ZUUF9GSUxFTUVUSE9EIGFuZCBDVVJMT1BUX1NTTF9TRVNTSU9OSURfQ0FDSEUKCkRhbmllbCBTdGVuYmVyZyAoNyBKYW4gMjAwOSkKLSBSb2IgQ3JpdHRlbmRlbiBkaWQgb25jZSBhZ2FpbiBwcm92aWRlIGFuIE5TUyB1cGRhdGU6CgogIEkgaGF2ZSB0byBqdW1wIHRocm91Z2ggYSBmZXcgaG9vcHMgbm93IHdpdGggdGhlIE5TUyBsaWJyYXJ5IGluaXRpYWxpemF0aW9uCiAgc2luY2UgYW5vdGhlciBwYXJ0IG9mIGFuIGFwcGxpY2F0aW9uIG1heSBoYXZlIGFscmVhZHkgaW5pdGlhbGl6ZWQgTlNTIGJ5IHRoZQogIHRpbWUgQ3VybCBnZXRzIGludm9rZWQuIFRoaXMgcGF0Y2ggaXMgbW9yZSBjYXJlZnVsIHRvIG9ubHkgc2h1dGRvd24gdGhlIE5TUwogIGxpYnJhcnkgaWYgQ3VybCBkaWQgdGhlIGluaXRpYWxpemF0aW9uLgoKICBJdCBhbHNvIGFkZHMgaW4gYSBiaXQgb2YgY29kZSB0byBzZXQgdGhlIGRlZmF1bHQgY2lwaGVycyBpZiB0aGUgYXBwIHRoYXQKICBjYWxsIE5TU19Jbml0KiBkaWQgbm90IGNhbGwgTlNTX1NldERvbWVzdGljUG9saWN5KCkgb3Igc2V0IHNwZWNpZmljCiAgY2lwaGVycy4gT25lIG1pZ2h0IGFyZ3VlIHRoYXQgdGhpcyBsZXRzIG90aGVyIGFwcGxpY2F0aW9uIGRldmVsb3BlcnMgZ2V0CiAgbGF6eSBhbmQvb3IgdGhleSBhcmVuJ3QgdXNpbmcgdGhlIE5TUyBBUEkgY29ycmVjdGx5LCBhbmQgeW91J2QgYmUgcmlnaHQuCiAgQnV0IHN0aWxsLCB0aGlzIHdpbGwgYXZvaWQgdGVycmlibHkgZGlmZmljdWx0LXRvLXRyYWNlIGNyYXNoZXMgYW5kIGlzCiAgZ2VuZXJhbGx5IGhlbHBmdWwuCgpEYW5pZWwgU3RlbmJlcmcgKDEgSmFuIDIwMDkpCi0gJ3JlY29uZicgaXMgcmVtb3ZlZCBzaW5jZSB3ZSByYXRoZXIgaGF2ZSB1c2VycyB1c2UgJ2J1aWxkY29uZicKCkRhbmllbCBTdGVuYmVyZyAoMzEgRGVjIDIwMDgpCi0gQmFzIE1ldmlzc2VuIHJlcG9ydGVkIGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI0NzkwMzAgcG9pbnRpbmcKICBvdXQgdGhhdCAncmVjb25mJyBkaWRuJ3QgcHJvcGVybHkgcG9pbnQgb3V0IHRoZSBtNCBzdWJkaXJlY3Rvcnkgd2hlbiBydW5uaW5nCiAgYWNsb2NhbC4KCkRhbmllbCBTdGVuYmVyZyAoMjkgRGVjIDIwMDgpCiAtIFBoaWwgTGlzaWVja2kgZmlsZWQgYnVnIHJlcG9ydCAjMjQxMzA2NwogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNDEzMDY3KSB0aGF0IGlkZW50aWZpZWQgYSBwcm9ibGVtIHRoYXQKICB3b3VsZCBjYXVzZSBsaWJjdXJsIHRvIG1hcmsgYSBETlMgY2FjaGUgZW50cnkgImluIHVzZSIgZXRlcm5hbGx5IGlmIHRoZQogIHN1YnNlcXVlbmNlIFRDUCBjb25uZWN0IGZhaWxlZC4gSXQgd291bGQgdGh1cyBuZXZlciBnZXQgcHJ1bmVkIGFuZCByZWZyZXNoZWQKICBhcyBpdCBzaG91bGQndmUgYmVlbi4KCiAgUGhpbCBwcm92aWRlZCBoaXMgb3duIHBhdGNoIHRvIHRoaXMgcHJvYmxlbSB0aGF0IHdoaWxlIGl0IHNlZW1lZCB0byB3b3JrCiAgd2Fzbid0IGNvbXBsZXRlIGFuZCB0aHVzIEkgd3JvdGUgbXkgb3duIGZpeCB0byB0aGUgcHJvYmxlbS4KCkRhbmllbCBTdGVuYmVyZyAoMjggRGVjIDIwMDgpCi0gUGV0ZXIgS29yc2dhYXJkIGZpeGVkIGJ1aWxkaW5nIGxpYmN1cmwgd2l0aCAiY29uZmlndXJlIC0td2l0aC1zc2wKICAtLWRpc2FibGUtdmVyYm9zZSIuCgotIEFudGhvbnkgQnJ5YW4gZml4ZWQgbW9yZSBsYW5ndWFnZSBhbmQgc3BlbGxpbmcgZmxhd3MgaW4gbWFuIHBhZ2VzLgoKRGFuaWVsIFN0ZW5iZXJnICgyMiBEZWMgMjAwOCkKLSBHaXZlbiBhIHJlY2VudCBlbm91Z2ggbGlic3NoMiwgbGliY3VybCBjYW4gbm93IHNlZWsvcmVzdW1lIHdpdGggU0ZUUCBldmVuCiAgb24gZmlsZSBpbmRleGVzIGJleW9uZCAyIG9yIDRHQi4KCi0gQW50aG9ueSBCcnlhbiBwcm92aWRlZCBhIHNldCBvZiBwYXRjaGVzIHRoYXQgY2xlYW5lZCB1cCBtYW51YWwgbGFuZ3VhZ2UsCiAgY29ycmVjdGVkIHNwZWxsaW5ncyBhbmQgbW9yZS4KCkRhbmllbCBTdGVuYmVyZyAoMjAgRGVjIDIwMDgpCi0gSWdvciBOb3Zvc2VsdHNldiBmaXhlZCBhIGJhZCBzaXR1YXRpb24gZm9yIHRoZSBtdWx0aV9zb2NrZXQoKSBBUEkgd2hlbiBkb2luZwogIHBpcGVsaW5pbmcsIGFzIGxpYmN1cmwgY291bGQgdGhlbiBlYXNpbHkgZ2V0IGNvbmZ1c2VkIGFuZCBBKSB3b3JrIG9uIHRoZQogIGhhbmRsZSB0aGF0IHdhcyBub3QgImZpcnN0IGluIHF1ZXVlIiBvbiBhIHBpcGVsaW5lLCBvciBldmVuIEIpIHRlbGwgdGhlIGFwcAogIHRvIFJFTU9WRSBhIHNvY2tldCB3aGlsZSBpdCB3YXMgaW4gdXNlIGJ5IGEgc2Vjb25kIGhhbmRsZSBpbiBhIHBpcGVsaW5lLiBCb3RoCiAgZXJyb3JzIGNhdXNlZCBoYW5naW5nIG9yIHN0YWxsaW5nIGFwcGxpY2F0aW9ucy4KCkRhbmllbCBTdGVuYmVyZyAoMTkgRGVjIDIwMDgpCi0gY3VybF9tdWx0aV90aW1lb3V0KCkgY291bGQgcmV0dXJuIGEgdGltZW91dCB2YWx1ZSBvZiAwIGV2ZW4gdGhvdWdoIG5vdGhpbmcKICB3YXMgYWN0dWFsbHkgcmVhZHkgdG8gZ2V0IGRvbmUsIGFzIHRoZSBpbnRlcm5hbCB0aW1lIHJlc29sdXRpb24gaXMgaGlnaGVyCiAgdGhhbiB0aGUgcmV0dXJuZWQgbWlsbGlzZWNvbmQgdGltZXIuIFRoZXJlZm9yZSBpdCBjb3VsZCBjYXVzZSBhcHBsaWNhdGlvbnMKICBydW5uaW5nIG9uIGZhc3QgcHJvY2Vzc29ycyB0byBkbyBzaG9ydCBidXJzdHMgb2YgYnVzeS1sb29wcy4KICBjdXJsX211bHRpX3RpbWVvdXQoKSB3aWxsIG5vdyBvbmx5IHJldHVybiAwIGlmIHRoZSB0aW1lb3V0IGlzIGFjdHVhbGx5CiAgYWxyZWF5IHRyaWdnZXJlZC4KCi0gVXNpbmcgdGhlIGxpYnNzaDIgMC4xOSBmdW5jdGlvbiBsaWJzc2gyX3Nlc3Npb25fYmxvY2tfZGlyZWN0aW9ucygpLCBsaWJjdXJsCiAgbm93IGhhcyBhbiBpbXByb3ZlZCBhYmlsaXR5IHRvIGRvIHJpZ2h0IHdoZW4gdGhlIG11bHRpIGludGVyZmFjZSAoYm90aAogICJyZWd1bGFyIiBhbmQgbXVsdGlfc29ja2V0KSBpcyB1c2VkIGZvciBTQ1AgYW5kIFNGVFAgdHJhbnNmZXJzLiBUaGlzIHNob3VsZAogIHJlc3VsdCBpbiAobXVjaCkgbGVzcyBidXN5LWxvb3Agc2l0dWF0aW9ucyBhbmQgdGh1cyBsZXNzIENQVSB1c2FnZSB3aXRoIG5vCiAgc3BlZWQgbG9zcy4KCkRhbmllbCBTdGVuYmVyZyAoMTcgRGVjIDIwMDgpCi0gU0NQIGFuZCBTRlRQIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSBoYWQgdGhlIHNhbWUgZmxhdzogdGhlICdET05FJwogIG9wZXJhdGlvbiBkaWRuJ3QgY29tcGxldGUgcHJvcGVybHkgaWYgdGhlIEVBR0FJTiBlcXVpdmFsZW50IHdhcyByZXR1cm5lZCBidXQKICBsaWJjdXJsIHdvdWxkIHNpbXBseSBjb250aW51ZSB3aXRoIGEgaGFsZi1jb21wbGV0ZWQgY2xvc2Ugb3BlcmF0aW9uCiAgcGVyZm9ybWVkLiBUaGlzIHJ1aW5lZCBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gcmUtdXNlIGFuZCBjYXVzZSBzb21lCiAgU1NILXByb3RvY29sIGVycm9ycyBpbiBnZW5lcmFsLiBUaGUgY29ycmVjdGlvbiBpcyB1bmZvcnR1bmF0ZWx5IGFkZGluZyBhCiAgYmxvY2tpbmcgZnVuY3Rpb24gLSBkb2luZyBpdCBlbnRpcmVseSBub24tYmxvY2tpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZm9yCiAgYSBiZXR0ZXIgZml4LgoKR2lzbGUgVmFuZW0gKDE2IERlYyAyMDA4KQotIEFkZGVkIHRoZSBwb3NzaWJpbGl0eSB0byB1c2UgdGhlIFdhdHQtMzIgdGNwL2lwIHN0YWNrIHVuZGVyIFdpbmRvd3MuCiAgVGhlIGNoYW5nZSBzaW1wbHkgaW52b2x2ZWQgYWRkaW5nIGEgVVNFX1dBVFQzMiBzZWN0aW9uIGluIHRoZQogIGNvbmZpZy13aW4zMi5oIGZpbGVzICh1bmRlciAuL2xpYiBhbmQgLi9zcmMpLiBUaGlzIHNlY3Rpb24gZGlzYWJsZXMKICB0aGUgdXNlIG9mIGFueSBXaW5zb2NrIGhlYWRlcnMuCgpEYW5pZWwgU3RlbmJlcmcgKDE2IERlYyAyMDA4KQotIGxpYnNzaDJfc2Z0cF9sYXN0X2Vycm9yKCkgd2FzIHdyb25nbHkgdXNlZCBhdCBzb21lIHBsYWNlcyBpbiBsaWJjdXJsIHdoaWNoCiAgbWFkZSBsaWJjdXJsIHNvbWV0aW1lcyBub3QgcHJvcGVybHkgYWJvcnQgcHJvYmxlbWF0aWMgU0ZUUCB0cmFuc2ZlcnMuCgpEYW5pZWwgU3RlbmJlcmcgKDEyIERlYyAyMDA4KQotIE1vcmUgd29yayB3aXRoIElnb3IgTm92b3NlbHRzZXYgdG8gZmlyc3QgZml4IHRoZSByZW1haW5pbmcgc3R1ZmYgZm9yCiAgcmVtb3ZpbmcgZWFzeSBoYW5kbGVzIGZyb20gbXVsdGkgaGFuZGxlcyB3aGVuIHRoZSBlYXN5IGhhbmRsZSBpcy93YXMgd2l0aGluCiAgYSBIVFRQIHBpcGVsaW5lLiBIaXMgYnVnIHJlcG9ydCAjMjM1MTY1MwogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMzUxNjUzKSB3YXMgYWxzbyByZWxhdGVkIGFuZCB3YXMKICBldmVudHVhbGx5IGZpeGVkIGJ5IGEgcGF0Y2ggYnkgSWdvciBoaW1zZWxmLgoKWWFuZyBUc2UgKDEyIERlYyAyMDA4KQotIFBhdHJpY2sgTW9ubmVyYXQgZml4ZWQgYSBidWlsZCByZWdyZXNzaW9uLCBpbnRyb2R1Y2VkIGluIDcuMTkuMiwgYWZmZWN0aW5nCiAgT1MvNDAwIGNvbXBpbGF0aW9ucyB3aXRoIElQdjYgZW5hYmxlZC4KCkRhbmllbCBTdGVuYmVyZyAoMTIgRGVjIDIwMDgpCi0gTWFyayBLYXJwZWxlcyBmaWxlZCBidWcgcmVwb3J0ICMyNDE2MTgyIHRpdGxlZCAiY3Jhc2ggaW4gQ29ubmVjdGlvbkV4aXN0cwogIHdoZW4gdXNpbmcgZHVwaGFuZGxlK2N1cmxfbXV0bGkiCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI0MTYxODIpIHdoaWNoIHNob3dlZCB0aGF0CiAgY3VybF9lYXN5X2R1cGhhbmRsZSgpIHdyb25nbHkgYWxzbyBjb3BpZWQgdGhlIHBvaW50ZXIgdG8gdGhlIGNvbm5lY3Rpb24KICBjYWNoZSwgd2hpY2ggd2FzIHBsYWluIHdyb25nIGFuZCBjYXVzZWQgYSBzZWdmYXVsdCBpZiB0aGUgaGFuZGxlIHdvdWxkIGJlCiAgdXNlZCBpbiBhIGRpZmZlcmVudCBtdWx0aSBoYW5kbGUgdGhhbiB0aGUgaGFuZGxlIGl0IHdhcyBkdXBsaWNhdGVkIGZyb20uCgpEYW5pZWwgU3RlbmJlcmcgKDExIERlYyAyMDA4KQotIEtlc2hhdiBLcml0eSBmb3VuZCBvdXQgdGhhdCBsaWJjdXJsIGZhaWxlZCB0byBkZWFsIHdpdGggZG90dGVkIElQdjYKICBhZGRyZXNzZXMgaWYgdGhleSB3ZXJlIHZlcnkgbG9uZyAoPjM5IGxldHRlcnMpIGR1ZSB0byBhIHRvbyBzdHJpY3QgYWRkcmVzcwogIHZhbGlkaXR5IHBhcnNlci4gSXQgbm93IGFjY2VwdHMgYWRkcmVzc2VzIHVwIHRvIDQ1IGJ5dGVzIGxvbmcuCgpEYW5pZWwgU3RlbmJlcmcgKDExIERlYyAyMDA4KQotIEludGVybmV0IEV4cGxvcmVyIGhhZCBhIGJyb2tlbiBIVFRQIGRpZ2VzdCBhdXRoZW50aWNhdGlvbiBiZWZvcmUgdjcgYW5kCiAgdGhlcmUgYXJlIHNlcnZlcnMgIm91dCB0aGVyZSIgdGhhdCByZWxpZXMgb24gdGhlIGNsaWVudCBkb2luZyB0aGlzIGJyb2tlbgogIERpZ2VzdCBhdXRoZW50aWNhdGlvbi4gQXBhY2hlIGV2ZW4gY29tZXMgd2l0aCBhbiBvcHRpb24gdG8gd29yayB3aXRoIHN1Y2gKICBicm9rZW4gY2xpZW50cy4KCiAgVGhlIGRpZmZlcmVuY2UgaXMgb25seSBmb3IgVVJMcyB0aGF0IGNvbnRhaW4gYSBxdWVyeS1wYXJ0IChhICc/Jy1sZXR0ZXIgYW5kCiAgdGV4dCB0byB0aGUgcmlnaHQgb2YgaXQpLgoKICBsaWJjdXJsIG5vdyBzdXBwb3J0cyB0aGlzIHF1aXJrLCBhbmQgeW91IGVuYWJsZSBpdCBieSBzZXR0aW5nIHRoZQogIENVUkxBVVRIX0RJR0VTVF9JRSBiaXQgaW4gdGhlIGJpdG1hc2sgeW91IHBhc3MgdG8gdGhlIENVUkxPUFRfSFRUUEFVVEggb3IKICBDVVJMT1BUX1BST1hZQVVUSCBvcHRpb25zLiBUaGV5IGFyZSB0aHVzIGluZGl2aWR1YWxseSBjb250cm9sbGVkIHRvIHNlcnZlcgogIGFuZCBwcm94eS4KCiAgKG5vdGUgdGhhdCB0aGVyZSdzIG5vIHdheSB0byBhY3RpdmF0ZSB0aGlzIHdpdGggdGhlIGN1cmwgdG9vbCB5ZXQpCgpEYW5pZWwgRmFuZHJpY2ggKDkgRGVjIDIwMDgpCi0gQWRkZWQgdGVzdCBjYXNlcyAxMDg5IGFuZCAxMDkwIHRvIHRlc3QgLS13cml0ZS1vdXQgYWZ0ZXIgYSByZWRpcmVjdCB0bwogIHRlc3QgYSByZXBvcnQgdGhhdCB0aGUgc2l6ZSBkaWRuJ3Qgd29yaywgYnV0IHRoZXNlIHRlc3QgY2FzZXMgcGFzcy4KCi0gRG9jdW1lbnRlZCBDVVJMT1BUX0NPTk5FQ1RfT05MWSBhcyBiZWluZyB1c2VmdWwgb25seSBvbiBIVFRQIFVSTHMuCgpEYW5pZWwgU3RlbmJlcmcgKDkgRGVjIDIwMDgpCi0gS2VuIEhpcnNjaCBzaW1wbGlmaWVkIGhvdyBsaWJjdXJsIGRvZXMgRlRQUzogbm93IGl0IGRvZXNuJ3QgYXNzdW1lIGFueQogIHBhcnRpY3VsYXIgc3RhdGUgZm9yIHRoZSBjb250cm9sIGNvbm5lY3Rpb24gbGlrZSBpdCBkaWQgYmVmb3JlIGZvciBpbXBsaWNpdAogIEZUUFMgKGxpYmN1cmwgYXNzdW1lZCBzdWNoIGNvbnRyb2wgY29ubmVjdGlvbnMgdG8gYmUgZW5jcnlwdGVkIHdoaWxlIHNvbWUKICBGVFBTIHNlcnZlcnMgc3VjaCBhcyBGaWxlWmlsbGEgYXNzdW1lcyBzdWNoIGNvbm5lY3Rpb25zIHRvIGJlIGNsZWFyCiAgbW9kZSkuIFVzZSB0aGUgQ1VSTE9QVF9VU0VfU1NMIG9wdGlvbiB0byBzZXQgeW91ciBkZXNpcmVkIGxldmVsLgoKRGFuaWVsIFN0ZW5iZXJnICg4IERlYyAyMDA4KQotIEZyZWQgTWFjaGFkbyBwb3N0ZWQgYWJvdXQgYSB3ZWlyZCBGVFAgcHJvYmxlbSBvbiB0aGUgY3VybC11c2VycyBsaXN0IGFuZCB3aGVuCiAgcmVzZWFyY2hpbmcgaXQsIGl0IHR1cm5lZCBvdXQgaGUgZ290IGEgNTUwIHJlc3BvbnNlIGJhY2sgZnJvbSBhIFNJWkUgY29tbWFuZAogIGFuZCB0aGVuIEkgZmVsbCBvdmVyIHRoZSB0ZXh0IGluIFJGQzM2NTkgdGhhdCBzYXlzOgoKICAgVGhlIHByZXNlbmNlIG9mIHRoZSA1NTAgZXJyb3IgcmVzcG9uc2UgdG8gYSBTSVpFIGNvbW1hbmQgTVVTVCBOT1QgYmUgdGFrZW4KICAgYnkgdGhlIGNsaWVudCBhcyBhbiBpbmRpY2F0aW9uIHRoYXQgdGhlIGZpbGUgY2Fubm90IGJlIHRyYW5zZmVycmVkIGluIHRoZQogICBjdXJyZW50IE1PREUgYW5kIFRZUEUuCgogIEluIG90aGVyIHdvcmRzOiB0aGUgY2hhbmdlIEkgZGlkIG9uIFNlcHRlbWJlciAzMHRoIDIwMDggYW5kIHRoYXQgaGFzIGJlZW4KICBpbmNsdWRlZCBpbiB0aGUgbGFzdCB0d28gcmVsZWFzZXMgd2VyZSBhIHJlZ3Jlc3Npb24gYW5kIGEgYmFkIGlkZWEuIFdlIE1VU1QKICBOT1QgdGFrZSBhIDU1MCByZXNwb25zZSBmcm9tIFNJWkUgYXMgYSBoaW50IHRoYXQgdGhlIGZpbGUgZG9lc24ndCBleGlzdC4KCi0gQ2hyaXN0aWFuIEtyYXVzZSBmaWxlZCBidWcgIzIyMjEyMzcKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjIyMTIzNykgdGhhdCBpZGVudGlmaWVkIGFuIGluZmluaXRlCiAgbG9vcCBkdXJpbmcgR1NTIGF1dGhlbnRpY2F0aW9uIGdpdmVuIHNvbWUgc3BlY2lmaWMgY29uZGl0aW9ucy4gV2l0aCBoaXMKICBwYXRpZW5jZSBhbmQgZ3JlYXQgZmVlZGJhY2sgSSBtYW5hZ2VkIHRvIG5hcnJvdyBkb3duIHRoZSBwcm9ibGVtIGFuZAogIGV2ZW50dWFsbHkgZml4IGl0IGFsdGhvdWdoIEkgY2FuJ3QgdGVzdCBhbnkgb2YgdGhpcyBteXNlbGYhCgpEYW5pZWwgRmFuZHJpY2ggKDMgRGVjIDIwMDgpCi0gRml4ZWQgdGhlIGdldGlmYWRkcnMgdmVyc2lvbiBvZiBDdXJsX2lmMmlwIHRvIHdvcmsgb24gc3lzdGVtcyB3aXRob3V0IElQdjYKICBzdXBwb3J0IChlLmcuIE1pbml4KQoKRGFuaWVsIFN0ZW5iZXJnICgzIERlYyAyMDA4KQotIElnb3IgTm92b3NlbHRzZXYgZmlsZWQgYnVnICMyMzUxNjQ1CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIzNTE2NDUpIHRoYXQgaWRlbnRpZmllZCBhIHByb2JsZW0gd2l0aAogIHRoZSBtdWx0aSBpbnRlcmZhY2UgdGhhdCBvY2N1cmVkIGlmIHlvdSByZW1vdmVkIGFuIGVhc3kgaGFuZGxlIHdoaWxlIGluCiAgcHJvZ3Jlc3MgYW5kIHRoZSBoYW5kbGUgd2FzIHVzZWQgaW4gYSBIVFRQIHBpcGVsaW5lLgoKLSBQYXdlbCBLaWVyc2tpIHBvaW50ZWQgb3V0IGEgbWlzdGFrZSBpbiB0aGUgY29va2llIGNvZGUgdGhhdCBjb3VsZCBsZWFkIHRvIGEKICBiYWQgZmNsb3NlKCkgYWZ0ZXIgYSBmYXRhbCBlcnJvciBoYWQgb2NjdXJlZC4KICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjM4MjIxOSkKCkRhbmllbCBGYW5kcmljaCAoMjUgTm92IDIwMDgpCi0gSWYgYSBIVFRQIHJlcXVlc3QgaXMgQmFzaWMgYW5kIG51bSBpcyBhbHJlYWR5ID49MTAwMCwgdGhlIEhUVFAgdGVzdAogIHNlcnZlciBhZGRzIDEgdG8gbnVtIHRvIGdldCB0aGUgZGF0YSBzZWN0aW9uIHRvIHJldHVybi4gVGhpcyBhbGxvd3MKICB0ZXN0aW5nIGF1dGhlbnRpY2F0aW9uIG5lZ290aWF0aW9ucyB1c2luZyB0aGUgQmFzaWMgYXV0aGVudGljYXRpb24KICBtZXRob2QuCgotIEFkZGVkIHRlc3RzIDEwODcgYW5kIDEwODggdG8gdGVzdCBCYXNpYyBhdXRoZW50aWNhdGlvbiBvbiBhIHJlZGlyZWN0CiAgd2l0aCBhbmQgd2l0aG91dCAtLWxvY2F0aW9uLXRydXN0ZWQKCkRhbmllbCBTdGVuYmVyZyAoMjQgTm92IDIwMDgpCi0gQmFzZWQgb24gYSBwYXRjaCBieSBWbGFkIEdyYWNob3YsIGxpYmN1cmwgbm93IHVzZXMgYSBuZXcgbGlic3NoMiAwLjE5CiAgZnVuY3Rpb24gd2hlbiBidWlsdCB0byBzdXBwb3J0IFNDUCBhbmQgU0ZUUCB0aGF0IGhlbHBzIHRoZSBsaWJyYXJ5IHRvIGtub3cKICBpbiB3aGljaCBkaXJlY3Rpb24gYSBwYXJ0aWN1bGFyIGxpYnNzaDIgb3BlcmF0aW9uIHdvdWxkIHJldHVybiBFQUdBSU4gc28KICB0aGF0IGxpYmN1cmwga25vd3Mgd2hhdCBzb2NrZXQgY29uZGl0aW9ucyB0byB3YWl0IGZvciBiZWZvcmUgdHJ5aW5nIHRoZQogIGZ1bmN0aW9uIGNhbGwgYWdhaW4uIFByZXZpb3VzbHkgKGFuZCBzdGlsbCB3aGVuIHVzaW5nIGxpYnNzaDIgMC4xOCBvcgogIGVhcmxpZXIpLCBsaWJjdXJsIHdpbGwgYnVzeS1sb29wIGluIHRoaXMgc2l0dWF0aW9uIHdoZW4gdGhlIGVhc3kgaW50ZXJmYWNlCiAgaXMgdXNlZCEKCkRhbmllbCBGYW5kcmljaCAoMjAgTm92IDIwMDgpCi0gQXV0b21hdGljYWxseSBkZXRlY3QgT3BlbkJTRCdzIENBIGNlcnQgYnVuZGxlLgoKRGFuaWVsIFN0ZW5iZXJnICgxOSBOb3YgMjAwOCkKLSBJIHJlbW92ZWQgdGhlIGRlZmF1bHQgdXNlIG9mICJQcmFnbWE6IG5vLWNhY2hlIiBmcm9tIGxpYmN1cmwgd2hlbiBhIHByb3h5IGlzCiAgdXNlZC4gSXQgaGFzIGJlZW4gdXNlZCBzaW5jZSBmb3JldmVyIGJ1dCBpdCB3YXMgbmV2ZXIgYSBnb29kIGlkZWEgdG8gdXNlCiAgdW5sZXNzIGV4cGxpY2l0bHkgYXNrZWQgZm9yLgoKLSBKb3NlZiBXb2xmJ3MgZXh0ZW5zaW9uIHRoYXQgYWxsb3dzIGEgJFRFU1RESVIvZ2RiaW5pdCR0ZXN0bnVtIGZpbGUgdGhhdCB3aGVuCiAgeW91IHVzZSBydW50ZXN0cy5wbCAtZywgd2lsbCBiZSBzb3VyY2VkIGJ5IGdkYiB0byBhbGxvdyBhZGRpdGlvbmFsIGZhbmN5IG9yCiAgd2hhdGV2ZXIgeW91IHNlZSBmaXQKCi0gQ2hyaXN0aWFuIEtyYXVzZSByZXBvcnRlZCBhbmQgZml4ZWQgYSBtZW1vcnkgbGVhayB0aGF0IHdvdWxkIG9jY3VyIHdpdGggSFRUUAogIEdTUy9rZXJiZXJvcyBhdXRoZW50aWNhdGlvbiAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjI4NDM4NikKCi0gQW5kcmVhcyBXdXJmIGFuZCBNYXJrdXMgS29ldHRlciBoZWxwZWQgbWUgYW5hbHl6ZSBhIHByb2JsZW0gdGhhdCBBbmRyZWFzIGdvdAogIHdoZW4gdXBsb2FkaW5nIGZpbGVzIHRvIGEgc2luZ2xlIEZUUCBzZXJ2ZXIgdXNpbmcgbXVsdGlwbGUgZWFzeSBoYW5kbGUKICBoYW5kbGVzIHdpdGggdGhlIG11bHRpIGludGVyZmFjZS4gT2NjYXNpb25hbGx5IGEgaGFuZGxlIHdvdWxkIHN0YWxsIGluCiAgbXlzdGVyaW91cyB3YXlzLgoKICBUaGUgcHJvYmxlbSB0dXJuZWQgb3V0IHRvIGJlIGEgc2lkZS1lZmZlY3Qgb2YgdGhlIENvbm5lY3Rpb25FeGlzdHMoKQogIGZ1bmN0aW9uJ3MgZWFnZXJuZXNzIHRvIHJlLXVzZSBhIGhhbmRsZSBmb3IgSFRUUCBwaXBlbGluaW5nIHNvIGl0IHdvdWxkCiAgc2VsZWN0IGl0IGV2ZW4gaWYgYWxyZWFkeSBiZWluZyBpbiB1c2UsIGR1ZSB0byBhbiBpbmFkZXF1YXRlIGNoZWNrIGZvciBpdHMKICBjaGFuY2VzIG9mIGJlaW5nIHVzZWQgZm9yIHBpcGVsbmluaW5nLgoKRGFuaWVsIEZhbmRyaWNoICgxNyBOb3YgMjAwOCkKLSBBZGRlZCBtb3JlIGNvbXBpbGVyIHdhcm5pbmcgb3B0aW9ucyBmb3IgZ2NjIDQuMwoKWWFuZyBUc2UgKDE3IE5vdiAyMDA4KQotIEZpeCBhIHJlbWFpbmluZyBwcm9ibGVtIGluIHRoZSBpbmV0X3B0b24oKSBydW50aW1lIGNvbmZpZ3VyZSBjaGVjay4gQW5kCiAgZml4IGludGVybmFsIEN1cmxfaW5ldF9wdG9uKCkgZmFpbHVyZXMgdG8gcmVqZWN0IGNlcnRhaW4gbWFsZm9ybWVkIGxpdGVyYWxzLgoKLSBNYWtlIGNvbmZpZ3VyZSBzY3JpcHQgY2hlY2sgaWYgaW9jdGwgd2l0aCB0aGUgU0lPQ0dJRkFERFIgY29tbWFuZCBjYW4gYmUKICB1c2VkLCBhbmQgZGVmaW5lIEhBVkVfSU9DVExfU0lPQ0dJRkFERFIgaWYgYXBwcm9wcmlhdGUuCgpEYW5pZWwgU3RlbmJlcmcgKDE2IE5vdiAyMDA4KQotIENocmlzdGlhbiBLcmF1c2UgZml4ZWQgYSBidWlsZCBmYWlsdXJlIHdoZW4gYnVpbGRpbmcgd2l0aCBnc3Mgc3VwcG9ydAogIGVuYWJsZWQgYW5kIEZUUCBkaXNhYmxlZC4KCi0gQWRkZWQgY2hlY2sgZm9yIE5VTEwgcmV0dXJucyBmcm9tIHN0cmR1cCgpIGluIHNyYy9tYWluLmMgYW5kIGxpYi9mb3JtZGF0YS5jCiAgLSByZXBvcnRlZCBieSBKaW0gTWV5ZXJpbmcgYWxzbyBwcmV2ZW50IGJ1ZmZlciBvdmVyZmxvdyBvbiBNU0RPUyB3aGVuIHlvdSBkbwogIGZvciBleGFtcGxlIC1PIG9uIGEgdXJsIHdpdGggYSBmaWxlIG5hbWUgcGFydCBsb25nZXIgdGhhbiBQQVRIX01BWCBsZXR0ZXJzCgotIGxpYi9uc3MuYyBmaXhlcyBiYXNlZCBvbiB0aGUgcmVwb3J0IGJ5IEppbSBNZXllcmluZzogSSB3ZW50IG92ZXIgYW5kIGFkZGVkCiAgY2hlY2tzIGZvciByZXR1cm4gY29kZXMgZm9yIGFsbCBjYWxscyB0byBtYWxsb2MgYW5kIHN0cmR1cCB0aGF0IHdlcmUKICBtaXNzaW5nLiBJIGFsc28gY2hhbmdlZCBhIGZldyBtYWxsb2MoMTMpIHRvIHVzZSBhcnJheXMgb24gdGhlIHN0YWNrIGFuZCBhCiAgZmV3IG1hbGxvYyhQQVRIX01BWCkgdG8gaW5zdGVhZCB1c2UgYXByaW50ZigpIHRvIGxvd2VyIG1lbW9yeSB1c2UuCgotIEkgZml4ZWQgYSBtZW1vcnkgbGVhayBpbiBDdXJsX25zc19jb25uZWN0KCkgd2hlbiBDVVJMT1BUX0lTU1VFUkNFUlQgaXMKICBpbiB1c2UuCgpEYW5pZWwgRmFuZHJpY2ggKDE0IE5vdiAyMDA4KQotIEFkZGVkIC54bWwgYXMgb25lIG9mIHRoZSBmZXcgY29tbW9uIGZpbGUgZXh0ZW5zaW9ucyBrbm93biBieSB0aGUgbXVsdGlwYXJ0CiAgZm9ybSBnZW5lcmF0b3IuCgotIEFkZGVkIHNvbWUgI2lmZGVmcyBhcm91bmQgaGVhZGVyIGZpbGVzIGFuZCBjaGFuZ2UgdGhlIEVBR0FJTiB0ZXN0IHRvCiAgZml4IGNvbXBpbGF0aW9uIG9uIENlbGwgKHJlcG9ydGVkIGJ5IEplZmYgQ3VybGV5KS4KCllhbmcgVHNlICgxNCBOb3YgMjAwOCkKLSBGaXhlZCBzZXZlcmFsIGNvbmZpZ3VyZSBzY3JpcHQgaXNzdWVzIGFmZmVjdGluZyBjaGVja3MgZm9yIGluZXRfbnRvYV9yKCksCiAgaW5ldF9udG9wKCksIGluZXRfcHRvbigpLCBnZXRpZmFkZHJzKCksIGZjbnRsKCkgYW5kIGdldGFkZHJpbmZvKCkuCgpZYW5nIFRzZSAoMTMgTm92IDIwMDgpCi0gUmVmYWN0b3JlZCBjb25maWd1cmUgc2NyaXB0IGRldGVjdGlvbiBvZiBmdW5jdGlvbnMgdXNlZCB0byBzZXQgc29ja2V0cyBpbnRvCiAgbm9uLWJsb2NraW5nIG1vZGUsIGFuZCBkZWNvdXBsZSBmdW5jdGlvbiBkZXRlY3Rpb24gZnJvbSBmdW5jdGlvbiBjYXBhYmlsaXR5LgoK