Q1ZTIGNvZGUgLQpHZW5lcmFsIC0gCgktIE5ldyBmaWxlIGJyb3dzZXIgY29kZS4gIE5ldyBmdW5jdGlvbnMgaW4gZmlsZXMuYzpkb19icm93c2VyKCksCgkgIGhlbHBlciBmdW5jdGlvbnMgYnJvd3Nlcl9pbml0KCksIHRhaWwoKSwgc3RyaXBvbmVkaXIoKSwKCSAgZmlsZXN0YXQoKS4gIE5ldyBzaG9ydGN1dCBsaXN0IGJyb3dzZXJfbGlzdC4gIFNvbWUgbmV3CgkgIHN0cmluZ3MgdG8gdHJhbnNsYXRlLiAgQ2hyaXMgbmVlZHMgdG8gYWRkIGNvbW1lbnRzIHRvIGhpcwoJICBjb2RlLgoJLSBXZSBvbmx5IGNhbGwga2V5cGFkKCkgb25jZSBub3cgZm9yIGVhY2ggd2luZG93LCBhdCB0aGUgYmVnaW5uaW5nLgoJICBGSU5BTExZISAgTm8gbW9yZSBrZXlwYWRfb24oKSwgbm8gbW9yZSBpbmRpdmlkdWFsIGNhbGxzIGluCgkgIG1haW4oKSwgZG9faGVscCgpLCBkb19icm93c2VyKCksIGV0YyBldGMgZXRjLiAgUmVtb3ZlZCBjYWxsIHRvCgkgIHRpbWVvdXQoMCkgaW4gbWFpbigpICh3aGljaCBjYXVzZWQgdGhlIHdob2xlIG1lc3MpLCBmaXhlcyBCVUcgIzQ5LgotIGZhcS5odG1sOgoJLSBGaXggdHlwb3MgYW5kIHNtYWxsIG1pc3Rha2VzIChKb3JkaSkuCi0gZmlsZXMuYzoKICB1c2VybmFtZV90YWJfY29tcGxldGlvbigpCgktIEFkZGVkIHRoZSAoY2hhciAqKSBzaXplb2Ygd2hlbiBhbGxvY2F0aW5nIG1lbW9yeSBmb3IgdGhlIGZpbGVuYW1lCgkgIGFycmF5IChSb2NjbykuCiAgY3dkX3RhYl9jb21wbGV0aW9uKCkKCS0gcmVtb3ZlZCBza2lwcGluZyAuIGFuZCAuLiB3aGVuIHRhYnVsYXRpbmcgbWF0Y2hlcy4KCS0gQWRkZWQgdGhlIChjaGFyICopIHNpemVvZiB3aGVuIGFsbG9jYXRpbmcgbWVtb3J5IGZvciB0aGUgZmlsZW5hbWUKCSAgYXJyYXkgKFJvY2NvKS4KLSBuYW5vLmM6CiAgbWFpbigpCgktIFJlb3JkZXIgdGhlIGdldG9wdCBvcHRpb25zIHRvIGJlIG1vcmUgb3IgbGVzcyBhbHBoYWJldGljYWwKCSAgKHN1Z2dlc3RlZCBieSBTdmVuIEd1Y2tlcykuCi0gd2luaW8uYzoKICBkb19jdXJzb3Jwb3MoKQoJLSBPcHRpbWl6YXRpb25zIGFuZCBjbGVhbnVwcyBieSBSb2NjbyBDb3JzaS4KICBkb19jcmVkaXRzKCkKCS0gU3BlbGwgRXJpayBBbmRlcnNlbidzIG5hbWUgcmlnaHQuCiAgdGl0bGViYXIoKQoJLSBOb3cgdGFrZXMgYW4gYXJnLCBuZWVkZWQgZm9yIGJyb3dzZXIgZnVuY3Rpb24uCgpuYW5vIDAuOS4yNCAtIDEyLzE4LzIwMDAKR2VuZXJhbAoJLSBBZGRlZCAtLWRpc2FibGUtaGVscCBvcHRpb24sIGFmZmVjdHMgYWNjb25maWcuaCwgY29uZmlndXJlKC5pbiksCgkgIHdpbmlvLmM6ZG9faGVscCwgbmFuby5jOmhlbHBfaW5pdCxoZWxwX3RleHRfaW5pdCx2ZXJzaW9uLgoJLSBDaGFuZ2VkIGZpbGVuYW1lIHRvIG5vIGxvbmdlciB1c2UgUEFUSF9NQVgsIHNvIGl0IGNhbiB3b3JrIG9uIHRoZQoJICBIVVJELiAgQ2hhbmdlcyBpbiBmaWxlcy5jOndyaXRlX2ZpbGUoKSwgbmV3IGZ1bmN0aW9uCgkgIG5hbm8uYzpjbGVhcl9maWxlbmFtZSgpLCBtYW55IGNoYW5nZWQgaW4gbWFpbigpLCBhIGZldyBvdGhlcgoJICBwbGFjZXMuICBQbGVhc2UgdGVzdCB0aGlzIQoJLSBBZGRlZCAtYiwgLWUsIGFuZCAtZiBmbGFncywgd2hpY2ggd2UgaWdub3JlIGFzIG5hbm8gcHJvdmlkZXMgCgkgIHRoZWlyIGZ1bmN0aW9uYWxpdHkgYWxyZWFkeS4KLSBjdXQuYzoKICBkb191bmN1dF90ZXh0KCkKCS0gRml4IHJlbnVtYmVyaW5nIGJ1ZyB3aGVuIHVuY3V0dGluZyBtYXJrZWQgdGV4dCBhdCBmaWxlYm90LgoJLSBGaXggc2NyZWVuIG5vdCBiZWluZyBkaXNwbGF5ZWQgd2hlbiB3ZSBhcmUgdW5jdXR0aW5nIG1hcmtlZAoJICB0ZXh0IGF0IGVkaXRib3QgKEJ1ZyBkaXNjb3ZlcmVkIGJ5IEtlbiBUeWxlcikuCgktIEZpeCBtYWdpYyBsaW5lIG5vdCBnZXR0aW5nIGNyZWF0ZWQgd2hlbiAoeW91IGd1ZXNzZWQgaXQpCgkgIHVuY3V0dGluZyBtYXJrZWQgdGV4dCBhdCBmaWxlYm90IChSeWFuIEtyZWJzKS4KLSBmaWxlcy5jOgogIHJlYWRfZmlsZSgpCgktIElmIHdlIGVuY291bnRlciBhbiBlcnJvciBhbmQgaW5zZXJ0IGlzIG5vdCBzZXQsIHJ1biBuZXdfZmlsZSgpLgoJICAoYnVnIGRpc2NvdmVyZWQgYnkgQmVuIFJvYmVydHMpLgogIHdyaXRlX2ZpbGUoKQoJLSBDaGFuZ2Ugb3BlbiBjYWxsIGZsYWdzLCBiYXNpY2FsbHkgY29weSBqb2UncyB3YXkgb2YgZG9pbmcgaXQgc28KCSAgYSBtb3JlIHJlY2VudCB2ZXJzaW9uIHdpbGwgYWN0dWFsbHkgYmUgaW5jbHVkZWQgaW4gKHVuKXN0YWJsZS4KCS0gUmVtb3ZlIHVzZWxlc3MgZnN0YXQgY2FsbC4KICBvcGVuX2ZpbGUoKQoJLSBBZGRlZCBjaGVjayBmb3IgU19JU0JMSyBhbmQgU19JU0NIUiwgZG9uJ3Qgb3BlbiBkZXZpY2UgZmlsZXMhCi0gbmFuby5jOgogIHJlbnVtYmVyKCkKCS0gRG9udCBzdHVwaWRseSBhc3NpZ24gdGhlIHZhbHVlIG9mIHByZXYtPmxpbmVubyBpZiBwcmV2ID09IE5VTEwhCiAgbWFpbigpCgktIEFkZGVkIGNvZGUgdG8gY2hlY2sgZm9yIEFsdC1BbHQgKDI3LTI3KSBrZXlzdHJva2VzIGFuZCBzZXQgdGhlCgkgIG5leHQga2V5c3Ryb2tlIGFzIGEgY29udHJvbCBzZXF1ZW5jZS4gIE5ldyB2YXJpYWJsZSAKCSAgbW9kaWZ5X2NvbnRyb2xfa2V5LiAgUmVtb3ZlZCAjaWZkZWYgX1BPU0lYX1ZESVNBQkxFIGNoZWNrCgkgIGFyb3VuZCBDb250cm9sLVMsUSxaIGhhbmRsZXJzIGJlY2F1c2Ugd2UgbmVlZCBpdCBub3cgZm9yCgkgIHRoZSBBbHQtQWx0LXggY29kZS4KCS0gQWRkZWQgLS12aWV3IG9wdGlvbiB0byBnZXRvcHRfbG9uZygpY2FsbCAuICBCdWcgZGlzY292ZXJlZCAKCSAgYnkgUm9jY28gQ29yc2kuCiAgaGVscF9pbml0KCkKCS0gRml4IG9mZiBieSBvbmUgZXJyb3IgdGhhdCB3YXMgbWFraW5nIF5HIGhlbHAgaW4gbm9ybWFsIG1vZGUgYW5kCgkgIF5fIGluIHBpY28gbW9kZSBub3QgYmUgZGlzcGxheWVkIGluIHRoZSBoZWxwIChidWcgZGlzY292ZXJlZCBieQoJICBSb2NjbyBDb3JzaSkuCiAgZG9fdG9nZ2xlKCkKCS0gQWRkZWQgZml4X2VkaXRib3QoKSBjYWxsIHRvIGZpeCBpbXByb3BlciByZWRpc3BsYXkgb2YgZWRpdAoJICB3aW5kb3cgd2hlbiB1c2luZyBub2hlbHAgdG9nZ2xlIChidWcgZGlzY292ZXJlZCBieSBSb2NjbyBDb3JzaSkuCi0gbmFuby4xLCBuYW5vLjEuaHRtbDoKCS0gVXBkYXRlZCBtYW4gcGFnZSBmb3IgLWIsIC1lLCAtZiBhbmQgZXhwYW5kZWQgZXhwbGFuYXRpb24gZm9yIC1wLgotIHdpbmlvLmMKICBkb19oZWxwKCkKCS0gRm9yY2Uga2V5cGFkIG9uIHNvIEYta2V5cyBhbmQgUGFnZVVwL0Rvd24gd2lsbCB3b3JrIHByb3Blcmx5LgoJICBBZGRlZCBjaGVjayBmb3IgTkFOT19FWElUX0ZLRVkgdG8gbG9vcC4KLSB1dGlscy5jOgogIG5ld19tYWdpY2xpbmUoKQoJLSBJbmNyZW1lbnQgdG90c2l6ZSEhICBXZSBkZWNyZW1lbnQgaXQgd2hlbiB3ZSd2ZSByZWFkIGEgZmlsZSwgCgkgIGV2ZXJ5d2hlcmUgZWxzZSBpdCBzaG91bGQgYXV0b21hdGljYWxseSBiZSBpbmNyZW1lbnRlZAoKbmFubyAwLjkuMjMgLSAxMi8wOC8yMDAwCkdlbmVyYWwKCS0gQ2hhbmdlZCAtLWRpc2FibGUtc3BlbGwgdG8gLS1kaXNhYmxlIHNwZWxsZXIuICBUaGUgdGVybSBpcwoJICAic3BlbGxlciIgZm9yIC1zLCBzbyBpdCBzaG91bGQgYmUgLS1kaXNhYmxlLXNwZWxsZXIuCi0gZmlsZXMuYzoKICB3cml0ZV9maWxlKCkKCS0gQWRkZWQgdG1wIGNoZWNrIHRvIFRNUF9PUFQgc2VjdGlvbiAoaG93IGFwcm9wcmlhdGUpLgoJLSBBZGRlZCBuZXcgY29uc2lzdGVuY3kgY2hlY2tpbmcgY29kZSBmcm9tIHNlY3VyaXR5Zm9jdXMgCgkgIGFydGljbGUgYnkgT2xpdmVyIEZyaWVkcmljaHMsIGFuZCB1c2UgT19FWENMIGlmIHRtcCA9PSAxLgoJLSBXZSBub3cgcnVuIGNoZWNrIG9uIHJlc3VsdCBvZiBsc3RhdCgpLCBub3Qgc3RhdCgpLCB0byBiZQoJICBzYWZlci4gIE5ldyB2YXJpYWJsZSBhbnlleGlzdHMsIHdlIHVzZSBzdGlsbCB1c2UgcmVhbGV4aXN0cwoJICBsYXRlciBpbiB0aGUgcHJvZ3JhbS4KCS0gT09QUywgbGluZSB1cCBsaW5rL3VubGluay9yZW5hbWUgY2hlY2sgaWYgY29uZGl0aW9uYWwgd2l0aCAKCSAgdG9wIGlmIGNvbmRpdGlvbmFsLiAgT3B0aW9uIC1sIGhhcyBiZWVuIGJyb2tlbiBmb3IgOSB2ZXJzaW9ucywKCSAgbm8gb25lIG5vdGljZWQ/IQoJLSBBZGRlZCBzYXZpbmcgcGVybXMgYXQgZW5kIG9mIGxpbmsgc28gd2UgY2FuIGFwcGx5IHRoZW0gdG8gdGhlCgkgIG5ldyBmaWxlIGlmIC0tbm9mb2xsb3cgaXMgdXNlZC4KLSB3aW5pby5jOgogIGVkaXRfYWRkKCkKCS0gT2ZmIGJ5IG9uZSBkaXNwbGF5IGVycm9yIChmaXggYnkgUm9jY28gQ29yc2kpLgogIGRvX3JlcGxhY2VfaGlnaGxpZ2h0KCkKCS0gTmV3IGNvZGUgdG8gaGFuZGxlIGJlaW5nIHBhc3QgQ09MUyAoUm9jbyBDb3JzaSkuCgktIE1vdmVkIGZyb20gc2VhcmNoLmMsIGFzIGl0J3MgZGVmaW5pdGVseSBhIHdpbmlvIGZ1bmN0aW9uIG5vdyA9KQogIHVwZGF0ZV9saW5lKCkKCS0gTW9yZSAnJCcgZGlzcGxheSBmaXhlcyAoUm9jY28gQ29yc2kpLgoKbmFubyAwLjkuMjIgLSAxMi8wMi8yMDAwCi0gR2VuZXJhbAoJLSBVc2VybmFtZSB0YWIgY29tcGxldGlvbiBjb2RlLCBhbmQgY2xlYW5lZCB1cCBleGlzdGluZyB0YWJjb21wCgkgIGNvZGUuIE5ldyBmdW5jdGlvbnMgcmVhbF9kaXJfZnJvbV90aWRlKCksIGFwcGVuZF9zbGFzaF9pZl9kaXIoKSwKCSAgdXNlcm5hbWVfdGFiX2NvbXBsZXRpb24gaXMgbW9yZSB0aGFuIGEgc3R1YiBub3cgPS0pLgoJLSBJZ25vcmUga2V5IHNlcXVlbmNlIDU0MyAmIDU0NSwgcmlnaHQgY29udHJvbCBhbmQgYWx0IGtleXMgaW4KCSAgd2luZG93cy4gQWZmZWN0cyBtYWluKCkgYW5kIHdpbmlvLmM6bmFub2dldHN0cigpLgoJLSBUb29rIG91dCBoZWxwIGZyb20gc3BlbGxfbGlzdCBhbmQgY2hhbmdlZCBTUEVMTF9MSVNUX0xFTiB0byAxLgoJICBJcyB1c2luZyBhIHNwZWxsIGNoZWNrZXIgVEhBVCBkaWZmaWN1bHQ/ID0tKQoJLSBOZXcgZnVuY3Rpb24gbmFub19kaXNhYmxlZF9tc2coKSwgdG8gYWxlcnQgdGhhdCBjZXJ0YWluCgkgIGZ1bmN0aW9ucyBoYXZlIGJlZW4gZGlzYWJsZWQsIHNpbWlsYWVyIHRvIG5hbm9fdGlueSBmZWF0dXJlLgotIE5ldyBjb25maWd1cmUgb3B0aW9uczoKCS0gQWRkZWQgY29uZmlndXJlIGFyZ3VtZW50IC0tZGlzYWJsZS10YWJjb21wLiAgQWZmZWN0cwoJICBib3R0b20gb2YgZmlsZXMuYyBhbmQgd3JpdGVfZmlsZSwgdXRpbHMuYzpjaGVja193aWxkY2FyZF9tYXRjaCgpCgkgIGFuZCB3aW5pby5jOm5hbm9nZXR0c3IoKS4KCS0gTmV3IG9wdGlvbnMgLS1lbmFibGUtZXh0cmEuICBOZXcgY29kZSBpbiBuYW5vLmM6dmVyc2lvbigpIHRvIAoJICBwcmludCBvdXQgdmFyaW91cyBvcHRpb25zIGZyb20gLi9jb25maWd1cmUsIGZ1bmN0aW9uIGRvX2NyZWRpdHMoKS4KCS0gQWRkZWQgLS1kaXNhYmxlLXNwZWxsIG9wdGlvbiBmb3IgdGhvc2Ugd2hvIHdhbnQgdG8ganVzdCBkaXNhYmxlCgkgIHRoZSBzcGVsbCBjaGVjayBmZWF0dXJlLiAgQWZmZWN0cyB0aGUgc3BlbGxpbmYgZnVjbnRpb25zCgkgIGRvX3NwZWxsLCBkb19pbnRfc3BlbGxlciBhbmQgZG9fYWx0X3NwZWxsZXIuCgktIEFkZGVkIC0tZGlzYWJsZS1qdXN0aWZ5IHRvIGdldCByaWQgb2YgdGhlIGp1c3RpZnkgZnVuY3Rpb24uCgkgIEFmZmVjdHMgZG9fanVzdGlmeSgpIChub3Qgc3VycHJpc2luZ2x5KS4KLSBmaWxlcy5jOgogIHdyaXRlX2ZpbGUoKQoJLSBVbnNldHRpbmcgbW9kaWZpZWQgb24gdGVtcCBmaWxlcyBidWcgZml4ZWQgKFJvY2NvIENvcnNpKS4KCS0gT2theSwgaWYgdG1wID09IDEgYW5kIHRoZSBmaWxlIGV4aXN0cywgd2UgYWJvcnQuCiAgZG9faW5zZXJ0ZmlsZSgpCgktIEFkZGVkIGNhbGwgdG8gcmVhbF9uYW1lX2Zyb20gdGlsZGUsIG9vcHMuICBBZGRlZCBjaGVjayBmb3IKCSAgRElTQUJMRV9UQUJDT01QLgogIHJlYWRfZmlsZSgpCgktIEFkZGVkIGNoZWNrIGZvciBmaWxlcHRyID09IE5VTEwuCi0gZ2xvYmFsLmM6CiAgc2hvcnRjdXRfaW5pdCgpCgktIE5vdyB0YWtlcyBhbiBhcmd1bWVudCBhcyB0byB3aGV0aGVyIHRvIGRpc3BsYXkgdGhlIHVuanVzdGlmeQoJICBzaG9ydGN1dCBvciB0aGUgbm9ybWFsIHVuY3V0IHRleHQgb25lLiAgTmVlZGVkIHRvIGFjY29tb2RhdGUKCSAgdGhlIGtsdWdleSB1bmp1c3RpZnkgY29kZS4KLSBuYW5vLjEsIG5hbm8uMS5odG1sOgoJLSBVcGRhdGVkIGRhdGUgb24gcGFnZXMgYmVjYXVzZSBvZiAtcCBjaGFuZ2VzLgoJLSBBZGRlZCAiTk9URVMiIHNlY3Rpb24sIHdoZXJlIEkgZXhwbGFpbiB3aGF0IG5hbm8uc2F2ZSAmIGZyaWVuZHMKCSAgYXJlLgoJLSBBZGRlZCBhIGNvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBtYW5wYWdlLCB1bmRlciB0aGUgR1BMLgoJLSBPdGhlciBtaW5vciBjaGFuZ2VzLgotIG5hbm8uYzoKICBkb19qdXN0aWZ5KCkKCS0gV3JvdGUgdW5qdXN0aWZ5IGNvZGUuICBCb3Jyb3dzIGN1dGJ1ZmZlciBhbmQgc3RvcmVzIHRoZSB1bmp1c3RpZmllZCAKCSAgdGV4dCB0aGVyZSwgdGhlbiBncmFicyB0aGUgbmV4dCBrZXlzdHJva2UgYW5kLCBpZiB0aGUgdW5qdXN0aWZ5CgkgIGtleSwgZ2V0cyByaWQgb2YgdGhlIGp1c3RpZmllZCB0ZXh0IGFuZCBjYWxscyBkb191bmN1dF90ZXh0LgoJICBBZGRlZCBtYWNybyBOQU5PX1VOSlVTVElGWV9LRVkuCiAgZG9faW50X3NwZWxsKgoJLSBWYXJpb3VzIGZpeGVzIChSb2NjbyBDb3JzaSkuCgktIENoYW5nZWQgYWJvcnQgb2YgcHJvZ3JhbSB0byBhYm9ydGluZyBiYXNlZCBvbiB2YWx1ZSBvZiAiZWRpdCBhCgkgIHJlcGxhY2VtZW50IiBxdWVzdGlvbiwgYW5kIG5vdCBjYXJpbmcgYWJvdXQgdGhlIHJlcGxhY2UgbG9vcAoJICByZXR1cm4gdmFsdWUuICBUaGF0IHdheSB0aGUgdXNlciBjYW4gZ2V0IG91dCBvZiB0aGUgcmVwbGFjZSBsb29wCgkgIGFuZCBjb250aW51ZSBzcGVsbCBjaGVja2luZyAodmVyeSBpbXBvcnRhbnQgdG8gbWUgYW55d2F5KS4KICB2ZXJzaW9uKCkKCS0gVG9vayBvdXQgaHVnZSBjaGVjayBmb3IgdGhlIHZhcmlvdXMgLS1kaXNhYmxlZCBtYWNyb3MsCgkgIGV2ZW50dWFsbHkgdGhlcmUgd2lsbCBiZSB0b28gbWFueSB0byByZWFzb25hYmx5IGNoZWNrIGZvci4gIAogIG5hbm9fc21hbGxfbXNnKCksIG5hbm9fZGlzYWJsZWRfbXNnKCkKCS0gQWRkZWQgY2hlY2tzIGZvciBkaXNhYmxlZCBmdW5jdGlvbnMgdG8gc2VlIHdoZXRoZXIgb3Igbm90IHRvCgkgIGRlY2xhcmUgdGhlbS4KICBkb19uZXh0X3dvcmQoKQoJLSBVcGRhdGUgdGhlIHByZXZpb3VzIGxpbmUgYXMgd2VsbCBhcyB0aGUgY3VycmVudCBvbmUgaW4gY2FzZSB3ZQoJICBoYXZlIG1vdmVkIGJleW9uZCBDT0xTIG9yIGJhY2sgZnJvbSBDT0xTLCBwYXRjaCBzdWJtaXR0ZWQKCSAgYnkgUnlhbiBLcmVicy4KICBkaWUoKQoJLSBOb3cgY3JlYXRlcyAuc2F2ZSBmaWxlIHVzaW5nIHZhcmlhYmxlLWxlbmd0aCBzdHJpbmdzLiAgQWxzbwoJICBjYWxscyB3cml0ZV9maWxlIHdpdGggdG1wID09IDEsIHdoaWNoIGhhcHBlbnMgdG8gZG8gZXhhY3RseSB3aGF0CgkgIHdlIHdhbnQgKGFib3J0IG9uIHNhdmUgZmlsZSBleGlzdHMgYW5kIHVzZSBtb2RlIDA2MDApLgogIGhhbmRsZV9zaWdodXAoKQoJLSBOb3cgY2FsbHMgZGllIGluc3RlYWQgb2Ygd3JpdGluZyBvbiBpdHMgb3duIGFuZCBleGl0aW5nIG5vcm1hbGx5LgotIHNlYXJjaC5jOgogIGRvX3JlcGxhY2VfaGlsaWdodCgpCgktIE5ldyBmdW5jdGlvbiwgZGlzcGxheXMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB3b3JkIGFzIGhpbGlnaHRlZAoJICBpbiB0aGUgc3BlbGwgY2hlY2suICBDYWxsZWQgZnJvbSBkb19yZXBsYWNlX2xvb3AgKFJvY2NvIENvcnNpKS4KCS0gQWRkZWQgY2FsbHMgdG8gY3Vyc19zZXQoMCkgYW5kICgxKSB0byBkaWFibGUgdGhlIGN1cnNvciB3aGVuCgkgIGhpbGlnaHRpbmcsIGxvb2tzIG11Y2ggYmV0dGVyLgotIGVzLnBvOiAKCS0gVHJhZGl0aW9uYWwgU3BhbmlzaCBzdHJpbmdzIHVwZGF0ZXMuCgpuYW5vIDAuOS4yMSAtIDExLzIzLzIwMDAKLSBBVVRIT1JTCgktIEFkZGVkIFJvY2NvIENvcnNpLgotIG5hbm8uYzoKICBtYWluKCkKCS0gQ2hhbmdlZCBjaGVjayBmb3IgYXJnYyA9PSAxIHRvIGFyZ3Zbb3B0aW5kXSA9PSBOVUxMIHRvIGRlY2lkZQoJICB3aGV0aGVyIG9yIG5vdCB0byBkaXNwbGF5ICJOZXcgRmlsZSIgaW4gdGhlIHN0YXR1c2Jhci4KLSBzZWFyY2guYzoKICBmaW5kbmV4dHN0cigpCgktIEZpeCBjdXJlbnRfeCBpbmNyZW1lbnQgYnVnIGJ5IHVzaW5nIGFub3RoZXIgdmFyaWFibGUgKFJvY2NvIENvcnNpKS4KICBzZWFyY2hfaW5pdCgpCgktIFNpbGx5IHR5cG8gaW4gb3VyICJvbmUgc2ltcGxlIGNhbGwiIG9mIHN0YXR1c3EuICBTdG9wcGVkCgkgIHByZXZpb3VzIHNlYXJjaCBzdHJpbmcgZnJvbSBiZWluZyBkaXNwbGF5ZWQuCiAgZG9fcmVwbGFjZSgpCgktIENvcHkgYmFjayB0aGUgcHJldmlvdXMgdmFsdWUgb2YgbGFzdF9yZXBsYWNlIGludG8gYW5zd2VyIGlmCgkgIHVzaW5nIFBJQ09fTU9ERSBhbmQgYW5zd2VyID09ICIiCi0gd2luaW8uYzoKICBkb191cCgpCgktIERlbGV0ZWQgZmlyc3QgdXBkYXRlX2xpbmUoKSBjYWxsLCBzY3Jld3MgdXAgZGlzcGxheSB3aGVuIG1hcmtlciBpcyBzZXQuCi0gbmFuby4xLCBuYW5vLjEuaHRtbAoJLSBVcGRhdGVkIG1hbiBwYWdlIGZvciBuZXcgLXAgZGVmaW5pdGlvbi4KCm5hbm8gMC45LjIwIC0gMTEvMTgvMjAwMAotIEdlbmVyYWwKCS0gUmFuIHNvdXJjZSB0aHJvdWdoIGluZGVudCAta3IgYWdhaW4uICBNYWtlIGV2ZXJ5dGhpbmcgcHJldHR5LgoJLSBDaGFuZ2VkIGJlaGF2aW9yIG9mICJzZWFyY2giIGFuZCAicmVwbGFjZSIgcHJvbXB0cyB0byBtYWtlIGFsbAogIAkgIHByZXZpb3VzIHZhbHVlcyBlZGl0YWJsZS4gIFRoaXMgY2hhbmdlIHdhcyBtYWRlIHNvIHRoYXQgeW91IGNhbiAKCSAgcmVwbGFjZSB3aXRoIHRoZSBudWxsIHN0cmluZyB3aXRob3V0IG5lZWRpbmcgYSBzcGVjaWFsIGtleSBmb3IgaXQuICAKCSAgY2hhbmdlZCBjb2RlIGluIHNlYXJjaF9pbml0KCksIGRvX3JlcGxhY2UoKSwgbmFub2dldHN0ciAoc2VlCgkgIGJlbG93KS4KCS0gQWRkZWQgc29tZSBtaXNzaW5nIGdldHRleHQgY2FsbHMgaGVyZSBhbmQgdGhlcmUgKEpvcmRpKS4KCS0gUmV2YW1wZWQgbmFub2dldHNyKCkgYW5kIGNhbGxzIHRvIGl0IHRvIHVzZSB2YXJpYWJsZSBsZW5ndGggc3RyaW5ncy4KCSAgTUFOWSBjaGFuZ2VzIGluIG5hbm9nZXRzdHIoKSwgbWFueSBjaGFuY2VzIGluIHNlYXJjaC5jLCBuZXcKCSAgZnVuY3Rpb24gbWFsbG9jc3RyY3B5IHdoaWNoIGlzIHN1cmUgdG8gYmUgYSBwcm9ncmFtbWF0aWMKCSAgbmlnaHRtYXJlLCBjaGFuZ2VkIGxhc3Rfc2VhcmNoLCBsYXN0X3JlcGxhY2UsIGFuc3dlciB0bwoJICBwb2ludGVycy4gIE5ldyBmdW5jdGlvbiBub3RfZm91bmRfbXNnIGluIHNlYXJjaC5jIGZvciBkaXNwbGF5aW5nCgkgIHRydW5jYXRlZCBzdHJpbmdzIGluIHNhdHVzYmFyIHdoZW4gdGhlIHN0cmluZyBpcyBub3QgZm91bmQKCSAgKC1wZWRhbnRpYyBmaXhlcyBieSBSb2NjbyBDb3JzaSkuIFdlIGRpc2FibGUgdGhpcyBmZWF0dXJlIHdoZW4KCSAgdXNpbmcgUElDT19NT0RFICgtcCkuCgktIE5ldyBzcGVsbGluZyBjb2RlIGJ5IFJvY2NvIENvcnNpLiAgTmV3IGZ1bmN0aW9ucwoJICBkb19pbnRfc3BlbGxlciwgZG9fYWx0X3NwZWxsZXIsIGNoYW5nZXMgdG8gZG9fc3BlbGwgaW4gbmFuby5jLAoJICBOZXcgZnVuY3Rpb25zIHNlYXJjaF9pbml0X2dsb2JhbHMgYW5kIGRvX3JlcGxhY2VfbG9vcCwgY2hhbmdlcwoJICB0byBzZWFyY2hfaW5pdCgpLCBkb19yZXBsYWNlLCBmaW5kbmV4dHN0ciwgbW92ZWQgbGFzdF9zZWFyY2ggYW5kCgkgIGxhc3RfcmVwbGFjZSBiYWNrIHRvIG5hbm8uYyAoKnNocnVnKikuCgktIE5ldyB0YWIgY29tcGxldGlvbiBjb2RlLiAgVXNlZCBjaGVja193aWxkY2FyZF9tYXRjaCwgaW5wdXRfdGFiLCAKCSAgY3dkX3RhYl9jb21wbGV0aW9uLCB1c2VybmFtZV90YWJfY29tcGxldGlvbiBmcm9tIGJ1c3lib3gsIAoJICBoYWNrZWQgdGhlbSBhIGxvdCwgY2hhbmdlcyB0byBuYW5vZ2V0c3RyKCkuICBuYW5vZ2V0c3RyKCkgYW5kCgkgIHN0YXR1c3EoKSBub3cgdGFrZSBhbiBhcmcgZm9yIHdoZXRoZXIgb3Igbm90IHRvIGFsbG93IHRhYgoJICBjb21wbGV0aW9uLgoJLSBGaXhlZCB2YWx1ZSBiZWluZyBpbnB1dCBpbiBzdGF0dXNiYXIgZHVyaW5nIGEgc2VhcmNoIG9yIHJlcGxhY2UKCSAgYW5kIENBU0VfU0VOU0lUSVZFIG9yIHRoZSBvdGhlciBzZWFyY2ggaXMgY2FsbGVkIGFuZCB0aGUKCSAgc3RyaW5nIGJlaW5nIHR5cGVkIGluIGlzIGJsb3duIGF3YXkuICBSZXBvcnRlZCBieSBLZW4gVHlsZXIuCgktIENoYW5nZWQgUElDT19NU0dTIGZsYWcgdG8gUElDT19NT0RFLCBjaGFuZ2VkIGhlbHAgc3RyaW5ncwoJICBhY2NvcmRpbmdseS4KLSBmaWxlcy5jOgogIGRvX3dyaXRlb3V0KCkKCS0gQ2hhbmdlIHN0cmNweSB0byBhbnN3ZXIgdG8gbWFsbG9jc3RyY3B5LgotIGdsb2JhbC5jCgktIE5ldyBnbG9iYWwgcmVwbGFjZV9saXN0XzIsIGZvciAybmQgaGFsZiBvZiB0aGUgcmVwbGFjZSBkaWFsb2cKCSAgKCJSZXBsYWNlIHdpdGg6IiksIGhhcyBmZXdlciBvcHRpb25zIHRoYW4gZmlyc3QgaGFsZiBiZWNhdXNlCgkgIHRoZXkgd2VyZSBpbmFwcm9wcmlhdGUuICAKICB0b2dnbGVfaW5pdCgpCgktIEFkZGVkICNpZmRlZiBhcm91bmQgdG9nZ2xlX3JlZ2V4X21zZyB0byBnZXQgcmlkIG9mIGNvbXBpbGVyIAoJICB3YXJuaW5nLgoKLSBuYW5vLmM6CiAga2V5cGFkX29uKCkKCS0gTmV3IGZ1bmN0aW9uLCB0b2dnbGVzIHR1cm5pbmcgdGhlIGtleXBhZCBvbiBhbmQgb2ZmIGluIGVkaXQgYW5kCgkgIGJvdHRvbXdpbigpLiAgQWRkZWQgY2FsbCB0byB0aGlzIGluIGZpbmlzaCgpLCBmaXhlcyBidWcgIzQ1LgotIHNlYXJjaC5jCiAgZmluZG5leHN0cigpCgktIE5ldyBhcmcgZm9yIGJlZ2luX3ggdmFyaWFibGUsIGJhc2ljYWxseSBhIHJld3JpdGUgdGhhdAoJICBtYWtlcyBhIGxpdHRsZSBtb3JlIHNlbnNlIGFuZCBpc24ndCBxdWl0ZSBhcyBtZXNzeSAoUm9jY28gQ29yc2kpLgoJLSBVcGRhdGUgdGhlIGxpbmUgd2UncmUgY2hlY2tpbmcgaWYgbm90IHRoZSB3aG9sZSBzY3JlZW4sIGJlY2F1c2UKCSAgaXQncyBxdWl0ZSBwb3NzaWJsZSB0aGUgc2VhcmNoIHRlYW0gY291bGQgZXhpc3Qgc29tZXdoZXJlIHdheQoJICB0byB0aGUgcmlnaHQgb24gdGhlIHNhbWUgbGluZSwgZm9yIGV4YW1wbGUuCiAgcmVwbGFjZV9hYm9ydCgpCgktIEFkZCByZXNldCBvZiBwbGFjZXdld2FudCwgc3RvcHMgY3Vyc29yIGZyb20ganVtcGluZyB3aGVuIG1vdmluZwoJICBjdXJzb3IgYWZ0ZXIgYSByZXBsYWNlLgogIGRvX3JlcGxhY2UoKQoJLSBBZGRlZCBjb2RlIGZvciBHb3RvbGluZSBrZXkgYWZ0ZXIgZW50ZXJpbmcgdGhlIHNlYXJjaCB0ZXJtLgoJICBGaXhlcyBidWcgIzQ2LgoJLSBSZW1vdmVkIHJlZHVuZGFudCBjb2RlIGludm9sdmluZyBwcm9jZXNzaW5nIHJlcGxhY2VtZW5ldCBzdHJpbmcuCgkgIENvbnZlcnRlZCBpZiBzdGF0ZW1lbnRzIHRvIHN3aXRjaCBzdGF0ZW1lbnRzLgoJLSBPcHRpbWl6YXRpb25zIGJ5IFJvY2NvIENvcnNpLgoJLSBSZW1vdmVkIGNvZGUgZm9yIGRlbGV0ZWQgc2hvcnRjdXRzIGZyb20gaW4gcmVwbGFjZV9saXN0XzIuCiAgZG9fc2VhcmNoKCkKCS0gQ29udmVydGVkIGlmIHN0YXRlbWVudHMgdG8gb25lIHN3aXRjaCBzdGF0ZW1lbnQuCi0gd2luaW8uYwogIG5hbm9nZXRzdHIoKQoJLSBBZGRlZCBjaGVjayBmb3IgMzQzIGluIHdoaWxlIGxvb3AgdG8gZ2V0IHJpZCBvZiBnZXR0aW5nICJsb2NrZWQiCgkgIGludG8gc3RhdHVzYmFyIiBidWcgaW4gb2RkICRURVJNcyBsaWtlIGlyaXMtYW5zaS4KCS0gQ2hhbmdlZCBjaGVjayB0byByZXR1cm4gLTIgb24gImVudGVyIiBmcm9tIGFuc3dlciA9PSAiIgoJICB0byBhbnN3ZXIgPT0gZGVmLgoJLSBGaXhlZCBmYWxsdGhyb3VnaCBjb2RlIGJlY2F1c2UgdGhlcmUgd2FzIG5vIGJyZWFrLiAgTWFrZSBtdWNoCgkgIG1vcmUgc2Vuc2Ugbm93LgoJLSBBZGRlZCBjaGVjayBmb3IgQVNDSUkgNTRbMTI0XSB3aGVuIHVzaW5nIFBEQ1VSU0VTLCBpZ25vcmUgdGhlbQoJICBpZiBub3RpY2VkLgogIG5hbm9nZXRfcmVwYWludCgpCgktIE5ldyBmdW5jdGlvbiwgcmVtb3ZlcyBhYm91dCAzMCBsaW5lcyBvZiBkdXBsaWNhdGUgY29kZSBpbiAKCSAgbmFub2dldHN0cigpLgoJLSBCbGFjayBtYWdpYyBjb2RlIHRvIG1ha2UgJCBhcHBlYXIgaW4gcHJvbXB0IGlmIHdlJ3JlIHBhc3QKCSAgQ09MUy4KICBibGFua19lZGl0KCkKCS0gUmVtb3ZlZCB3cmVmcmVzaCgpIGNhbGwsIG11Y2ggbGVzcyBjaG9wcHkgbm93LiAgSWYgdGhlcmUncyBhIG5lZWQKCSAgZm9yIGEgd3JlZnJlc2ggYWZ0ZXIgYSBzcGVjaWZpYyBjYWxsLCBsZXQgbWUga25vdy4KLSBlcy5wbzoKCS0gVXBkYXRlZCB0cmFuc2xhdGlvbiBmb3IgMC45LjIwIChKb3JkaSkuCiAgCm5hbm8gMC45LjE5IC0gMTAvMDIvMjAwMAotIEdlbmVyYWwKCS0gQWRkZWQgUERDdXJzZXMgc3VwcG9ydCB1bmRlciBjeWd3aW4sIHdoaWNoIGFsbG93cyBidWlsZGluZwoJICBhIG5pY2Ugc3RhbmQtYWxvbmUgbmFuby5leGUgZm9yIHRob3NlIHBvb3IgV2luZG93cyB1c2Vycy4KCSAgRXh0cmEgY2hlY2sgaW4gY29uZmlndXJlLmluIGZvciBpbml0c2NyKCkgaW4gLWxjdXJzZXMgKGFzCgkgIFBEY3Vyc2VzIGhhcyBubyB0Z2V0ZW50KSwgc29tZSAjaWZkZWYgUERDVVJTRVMgc3RhdGVtZW50cwoJICBpbiBtYWluKCkuCgktIENoYW5nZWQgd2ViIHNpdGUgYW5kIGVtYWlsIHRvIG5ldyBuYW5vLWVkaXRvci5vcmcgZG9tYWluLgotIG5hbm8uYwoJLSBBZGRlZCAoaW50KSBjYXN0cyB0byByZW1vdmUgY29tcGlsZSB3YXJuaW5ncyB3aXRoIC1XYWxsLgogIG1haW4oKQoJLSBBZGRlZCBjaGVjayBmb3IgX1BPU0lYX1ZESVNBQkxFIGFyb3VuZCB0ZXJtIHZhcmlhYmxlIGRlZmluaXRpb24uCi0gc2VhcmNoLmMKCS0gQWRkZWQgaW5pdGlhbGl6YXRpb25zIGZvciBsYXN0X3NlYXJjaCBhbmQgbGFzdF9yZXBsYWNlIChSb2NjbyBDb3JzaSkKCm5hbm8gMC45LjE4IC0gMDkvMTgvMjAwMAotIEdlbmVyYWwKCS0gQ2hhbmdlZCBfUE9TSVhfVkVSU0lPTiBjaGVja3MgaW4gcmVnZXggY29kZSB0byBIQVZFX1JFR0VYX0gsIAoJICBhZGRlZCBjaGVjayBmb3IgcmVnZXguaCBpbiBjb25maWd1cmUuaW4uCi0gY29uZmlndXJlLmluOgoJLSBBZGRlZCBkZWZhdWx0IGNhc2UgZm9yIGNyb3NzLWNvbXBpbGluZyB0byBnZXQgcmlkIG9mIGFubm95aW5nCgkgIEFDX1RSWV9SVU4gd2FybmluZy4KLSBjdXQuYzoKICBkb19jdXRfdGV4dCgpCgktIERvbid0IGltbWVkaWF0ZWx5IGFib3J0IGlmIHdlJ3JlIG9uIGZpbGVib3QgYW5kIHRoZSBtYXJrZXIgaXMKCSAgc2V0IChmaXhlcyBidWcgIzQyKS4KLSBmaWxlcy5jOgogIG9wZW5fZmlsZSgpCgktIEZpeCBmb3IgYnVnICM0NCAoUm9jY28gQ29yc2kpLgotIGdsb2JhbC5jOgogIHNob3J0Y3V0X2luaXQoKQoJLSBBZGRlZCBpbiBGS0VZcyB0aGF0IGZvciBzb21lIHJlYXNvbiB3ZXJlIGxlZnQgb3V0LiAgKmJvZ2dsZSoKLSBuYW5vLmM6CiAgbWFpbigpCgktIEFkZGVkIGNoZWNrIGZvciBfUE9TSVhfVkRJU0FCTEUgYW5kIHVzZSByYXcgbW9kZSBpZiBub3QKCSAgYXZhaWxhYmxlLCBhbGxvd3MgbmFubyB0byB3b3JrIHdpdGggY3lnd2luLgoJLSBBZGRlZCBnZXR0ZXh0IGNhbGxzIHRvIGVuYWJsZS9kaXNhYmxlIHN0cmluZ3MgKEpvcmRpKS4KCS0gUmV2YW1wZWQgYSBncmVhdCBkZWFsIG9mIHRoZSBGLWtleSBhbmQga2V5cGFkIGtleSBoYW5kbGluZywKCSAgYmVjYXVzZSB3ZSBub3QgbG9uZ2VyIHVzZSBrZXlwYWQoKSAoc2VlIGJlbG93KS4KCS0gUmVtb3ZlZCBrZXlwYWQoKSBjYWxsIGJlY2F1c2UgbmFubyB3YXMgbm90IHdvcmtpbmcgd2l0aCB0aGUKCSAga2V5cGFkIGluIG1hbnkgdGVybXMsIHdoaWNoIGlzIHZlcnkgYmFkLgoJLSBNYWRlIGluc2VydCBrZXkgY2FsbCBkb19pbnNlcnRmaWxlKCkuCiAgZG9fdG9nZ2xlKCkKCS0gUmV3cm90ZSBmdW5jdGlvbiB0byBhbGxvdyBOT0hFTFAgdG9nZ2xlIHRvIHdvdGsgb24gc3lzdGVtcwoJICB3aXRob3V0IGEgd29ya2luZyByZXNpemV3aW4oKS4gIE5ldyBmdW5jdGlvbiB3aW5kb3dfaW5pdCgpLgogIG1vdXNlX2luaXQoKQoJLSBBZGQga2V5cGFkIG9ubHkgaWYgbW91c2Ugc3VwcG9ydCBpcyBvbiwgb3RoZXJ3aXNlIG1vdXNlIGRvZXNuJ3QKCSAgd29yay4gIEkgZ3Vlc3MgeW91IGhhdmUgdG8gY2hvb3NlIGJldHdlZW4gaGF2aW5nIHRoZSBtb3VzZSBhbmQKCSAgaGF2aW5nIGEgd29ya2luZyBrZXlwYWQgZm9yIHRoZSB0aW1lIGJlaW5nICh0aGFuayBnb2QgZm9yIE1ldGEtbSkuCi0gd2luaW8uYzoKICB0b3RhbF9yZWZyZXNoKCkKCS0gQWRkZWQgdGl0bGViYXIoKSBjYWxsLgogIG9uZWtleSgpCgktIE9mZiBieSBvbmUgZXJyb3IgZml4IGZpeCA7LSkgKFJvY2NvIENvcnNpKS4KCi0gc2VhcmNoLmM6CiAgZmluZG5leHRzdHIoKQoJLSBSZXNldCBzdGFydGluZyBhdCBjdXJyZW50IGZvciBzZWFyY2ggaW5zdGVhZCBvZiBiZWdpbi4KLSBlcy5wbzoKCS0gVHJhbnNsYXRlZCBuZXcgc3RyaW5ncyBhbmQgbWlub3IgdXBkYXRlcyAoSm9yZGkpLgotIGRlLnBvIAoJLSBSZXZpc2VkIHRyYW5zbGF0aW9ucyBieSBmbG9raUBiaWdmb290LmNvbQoKbmFuby0wLjkuMTcgLSAwOS8wNC8yMDAwCi0gR2VuZXJhbAoJLSBOZXcgc2hvcnRjdXRzIHRvIHRvZ2dsZSBjZXJ0YWluIG9wdGlvbnMgdGhhdCBhcmUgbm9ybWFsbHkgb25seQoJICBmbGFncyB2aWEgQWx0L01ldGEuICBTZWUgQWx0LUMsRSxJLEssTSxQLFgsWi4gIE5ldyBzdHJ1Y3QgY2FsbGVkCgkgIHRvZ2dsZXMgaW4gbmFuby5oLCB0b2dnbGVfaW5pdCgpLCB0b2dnbGVfaW5pdF9vbmUoKSBpbiBnbG9iYWwuYwoJICBjYWxsZWQgZnJvbSBzaG9ydGN1dF9pbml0KCksIGFuZCBkb190b2dnbGUgaW4gbmFuby5jLiAgQWxzbyAKCSAgbW92ZWQgdGhlIHNpZ25hbCBjb2RlIGludG8gYSBzZXBhcmF0ZSBmdW5jdGlvbiBpbiBuYW5vLmMgY2FsbGVkCgkgIHNpZ25hbF9pbml0KCkuICBNb3ZlZCAic3RydWN0IHNpZ2FjdGlvbiBhY3QiaW50byBhIHN0YXRpYyBpbgoJICBuYW5vLmMuCgktIENoYW5nZWQgZnJvbSBBbHQta2V5IHN5bWJvbCAoQCkgd2hpY2ggaXMgY29tcGxldGVseSBub25zdGFuZGFyZAoJICB0byB0aGUgKm5peCAiTWV0YSIgc3ltYm9sIChNLSkuICBDaGFuZ2VkIGhlbHBfaW5pdCB0byBzaG93CgkgIHRoZSBNLWtleSB1c2FnZSBhbmQgdGhlIGhlbHAgdGV4dCB0byBleHBsYWluIGtleXMgd2hjaWggZ2VuZXJhdGUKCSAgTWV0YS4gIE1vdmVkIHRoZSB0b2dnbGUgTWV0YSBrZXlzdHJva2VzIHRvIHRoZSBmaXJzdCBjb2x1bW4KCSAgaW5zdGVhZCBvZiB0aGUgdGhpcmQgYXMgdGhleSBhcmUgdGhlIHByaW1hcnkga2V5c3Ryb2tlcyBmb3IgdGhlCgkgIGZ1bmN0aW9ucy4gIFRoYW5rcyBNaW5pIGVkaXRvciB0ZWFtIDotPgoJLSBDaGFuZ2VkIGxhc3Rfc2VhcmNoIGFuZCBsYXN0X3JlcGxhY2UgdmFycyB0byBzdGF0aWNhbGx5IAoJICBhbGxvY2F0ZWQgKGhlbmNlIG51bGxlZCkgYW5kIG1vdmVkIHRvIHNlYXJjaC5jIChNYXR0IEtyYWFpKS4KLSBnbG9iYWwuYzoKICB0b2dnbGVfaW5pdCgpCgktIENoYW5nZWQgIk5vIGF1dG8gd3JhcCIgYW5kICJObyBoZWxwIG1vZGUiIHRvICJBdXRvIHdyYXAiIGFuZCAKCSAgIkhlbHAgbW9kZSIuIFNlZSB0aGUgY2hhbmdlIHRvIGRvX3RvZ2dsZSgpIGJlbG93LgotIG5hbm8uYzoKICBkb19tb3VzZSgpCgktIFBhdGNoIGZvciBoYW5kbGluZyBsaW5lcyB3L3RhYnMgYW5kIG1vdXNlIGJldHRlciAoQmVuIFJvYmVydHMpLgogIGRvX3dyYXAoKQoJLSBNYWRlIHdyYXBwaW5nIGNvZGUgbGVzcyBhbWJpdGlvdXMuCiAgZG9fdG9nZ2xlKCkKCS0gQWRkZWQgY2hlY2tzIGZvciBubyBoZWxwIGFuZCBubyB3cmFwIG1vZGUsIGFuZCBwcmludCBvcHBvc2l0ZQoJICBlbmFibGUvZGlzYWJsZSBtZXNzYWdlLgogIGRvX3N1c3BlbmQoKSwgZG9fY29udCgpOgoJLSBOZXcgZnVuY3Rpb25zLCBoYW5kbGUgc3VzcGVuZCBzaWduYWwgaW4gYSBQaWNvLWxpa2UgbWFubmVyIGFuZAoJICB3b3JrIHdpdGggTWV0YS1aLgotIHdpbmlvLmM6CiAgdG90YWxfcmVmcmVzaCgpCgktIEFkZGVkIGVkaXRfcmVmcmVzaCgpIGNhbGwgdG8gYWN0dWFsbHkgdXBkYXRlIHRoZSBzY3JlZW4gaWYgbWVzc3kuCiAgZWRpdF9yZWZyZXNoX2NsZWFyb2soKQoJLSBOZXcgZnVuY3Rpb24sIGRvZXMgYSB0b3RhbCB1cGRhdGUgZm9yIGVkaXQgcmVmcmVzaCwgbmVlZGVkIHRvIGZpeAoJICBsYWNrIG9mIHJldmVyc2VkIHRleHQgb24gc2VhcmNoaW5nIHdpdGggTUFSS19JU1NFVC4KICBvbmVrZXkoKQoJLSBPZmYgYnkgb25lIGVycm9yIGZpeCAoUm9jY28gQ29yc2kpLgoKICB1cGRhdGVfbGluZSgpCgktIEFkZGVkIGNoZWNrIGZvciBiaW5hcnkgZGF0YSA+PSAxIGFuZCA8PSAyNiwgYW5kIHVzZSBeK2xldHRlcgoJICB0byBkaXNwbGF5IGl0LiAgIFNob3VsZCBmaXggZWRpdGluZyB0ZXh0IGZpbGVzIHdpdGggYmluYXJ5CgkgIGRhdGEgaW4gdGhlbS4gIFBsYWNpbmcgb2YgdGhlIGN1cnNvciBzZWVtcyB0byBiZSBhIGJpdCBzY3Jld2VkCgkgIHRob3VnaC4uLgotIHNlYXJjaC5jOgogIHNlYXJjaF9hYm9ydCgpCgktIE5vdyBjYWxscyBlZGl0X3JlZnJlc2hfY2xlYXJvayB3aGVuIE1BUktfSVNTRVQgdG8gaGFuZGxlIHNjcmVlbgoJICB1Z2xpbmVzcyBidWcgKHJlcG9ydGVkIGJ5IEtlbiBUeWxlcikuCiAgZmluZG5leHRzdHIoKToKCS0gQWRkZWQgcmVzZXQgZm9yIHBsYWNld2V3YW50IChCZW4gUm9iZXJ0cykuCgktIEZpeGVkIGNoZWNrIGZvciBzdHJpbmcgdGhhdCBvbmx5IG9jY3VycyBvbiB0aGUgc2FtZSBsaW5lIGZhaWxpbmcKCSAgKGRpc2NvdmVyZWQgYnkgS2VuIFR5bGVyKS4KCm5hbm8tMC45LjE2IC0gMDgvMDkvMjAwMAotIGN1dC5jOgogIGRvX2N1dF90ZXh0KCkKCS0gRml4ZWQgZ2V0dGluZyBsb2NrZWQgaW50byBjdXRidWZmZXIgb24gY3V0dGluZyBmaXJzdCBsaW5lIG9mIGZpbGUuCgktIEFkZGVkIGNoZWNrX3N0YXRibGFuaygpLgoJLSBDaGVjayBmb3IgZmlsZXB0ciA9PSBmaWxlYm90LCBpZiBzbyByZXR1cm4sIHdlIHNob3VsZG4ndCBib3RoZXIKCSAgY3V0dGluZyB0aGUgbWFnaWMgbGluZS4KICBkb191bmN1dF90ZXh0KCkKCS0gQWRkZWQgY2hlY2tfc3RhdGJsYW5rKCkuCi0gbmFuby5jOgogIG1haW4oKQoJLSBDaGFuZ2VkIHRhYnNpemUgbG9uZyBhcmcgdG8gYWN0dWFsbHkgYWNjZXB0IGFuIGFyZ3VtZW50ICpzaWdoKi4KLSBwby9NYWtlZmlsZS5pbi5pbjoKCS0gUGF0Y2ggdG8gaGFuZGxlICRERVNURElSIChvcmlnIGJ5IERhbiBIYXJuZXR0IGNvbnRyaWJ1dGVkIGJ5CgkgIENocmlzdGlhbiBXZWlzZ2VyYmVyKQotIGNvbmZpZ3VyZS5pbjoKCS0gTmV3IChhbmQgc2V2ZXJhbGx5IHJldmlzZWQgPSkgc2xhbmcgdGVzdCBjb2RlIChBbGJlcnQgQ2hpbi1BLVlvdW5nKQoKbmFuby0wLjkuMTUgLSAwOC8wMy8yMDAwCi0gQ2hhbmdlZCBlZGl0X3VwZGF0ZSBjYWxsIHRvIHRha2UgYXJndW1lbnRzIFRPUCwgQ0VOVEVSIG9yIEJPVFRPTS4KICBBZmZlY3RzIG1hbnkgbWFueSBmdW5jdGlvbnMuICBSZW1vdmVkIGZ1bmN0aW9ucyBlZGl0X3VwZGF0ZV90b3AgYW5kCiAgZWRpdF91cGRhdGVfYm90LgotIEFkZGVkIGdsb2JhbCB2YXJpYWJsZSB0YWJzaXplLCB3ZSBubyBsb25nZXIgc2NyZXcgd2l0aCB0aGUgY3Vyc2VzCiAgbGlicmFyeSBpbiBvcmRlciB0byBpbXBsZW1lbnQgLVQgKHN1Z2dlc3RlZCBieSBDaHJpc3RpYW4gV2Vpc2dlcmJlcikuCi0gY29uZmlndXJlLmluOgoJLSBGaW5hbGx5IGZpeGVkIGNoZWNrIGZvciBzbGFuZyB0byByZXBvcnQgIm5vIiBpZiBub3QgY2FsbGVkCgkgIHdpdGggLS13aXRoLXNsYW5nIG9yIC0td2l0aG91dC1zbGFuZwotIG5hbm8uYzoKICBzcGxpY2Vfbm9kZSgpCgktIE5ldyBmdW5jdGlvbiwgYWJzdHJhY3RzIGxpbmtpbmcgaW4gbm9kZXMuICAgRml4ZXMgYnVnICMzNi4KICBudWxsX2F0KCkKCS0gTmV3IGZ1bmN0aW9uLCBudWxscyBhIHN0cmluZyBhdCBhIGdpdmVuIGluZGV4IGFuZCByZWFsaWducyBpdC4KICBkZWxldGVfYnVmZmVyKCkKCS0gUmVtb3ZlZCwgc2FtZSBhcyBmcmVlX2ZpbGVzdHJ1Y3QoKS4KICBkb19iYWNrc3BhY2UoKQoJLSBOb3cgY2FsbHMgcGFnZV91cF9jZW50ZXIgaW5zdGVhZCBvZiBwYWdlX3VwIChhcyBpdCBzaG91bGQ/KQogIGRvX2VudGVyKCkKCS0gRml4ZWQgdHlwbyAoPykgaW4gY2hlY2sgZm9yIGlucHRyLT5uZXh0LiAgQ2F1c2VkIGxvdHMgb2YKCSAgZ3JpZWYgZm9yIGVkaXRpbmcgbGluZXMgYXQgZmlsZWJvdC4KICBtYWluKCkKCS0gUmVtb3ZlZCBub3cgdXNlbGVzcyB1c3J0YWJzaXplIHZhcmlhYmxlIChDaHJpc3RpYW4gV2Vpc2dlcmJlcikuCi0gc2VhcmNoLmM6CiAgcmVwbGFjZV9hYm9ydCgpCgktIHJlZHVuZGFudCwgbm93IGp1c3QgY2FsbHMgc2VhcmNoIGFib3J0IHVudGlsIGl0IGRvZXMgc29tZXRoaW5nCgkgIGRpZmZlcmVudC4gIAotIHdpbmlvLmM6CiAgZWRpdF9yZWZyZXNoKCkKCS0gQWRkZWQgY2hlY2sgZm9yIGN1cnJlbnQgbGluZSAicnVubmluZyIgb2ZmIHRoZSBzY3JlZW4uCgkgIEhvcGVmdWxseSB0aGlzIHdpbGwgbm90IGNhdXNlIGFueSByZWN1cnNpdmUgbG9ja3Vwcy4KCSAgKFdobyBhbSBJIGtpZGRpbmcsIG9mIGNvdXJzZSBpdCB3aWxsISkKCS0gQWRkZWQgY2hlY2sgdG8gc3RvcCBpbmZpbml0ZSBsb29wIGNhbGxpbmcgZWRpdF91cGRhdGUuCiAgZWRpdF91cGRhdGUoKQoJLSBSZXdyaXR0ZW4sIGhvcGVmdWxseSB0aGlzIHdpbGwgcmVtb3ZlIGEgbG90IG9mIHRoZQoJICBzY3JvbGxpbmcgdGhlIGN1cnNvciBiYWNrIGFuZCBmb3J0aCBuZWVkbGVzc2x5LgotIG1vdmUuYzoKICBwYWdlX2Rvd24oKQoJLSBkbyBhbiBlZGl0X3VwZGF0ZSgpIGF0IGxhc3QgY2FzZS4gIE1hZGUgZnVuY3Rpb24gbW9yZSBsaWtlCgkgIFBpY28ncyB2ZXJzaW9uLCBvbmx5IG1vdmUgZG93biB0byB0d28gbGluZXMgYmVmb3JlIGVkaXRib3QuCiAgcGFnZV91cCgpCgktIE1hZGUgZnVuY3Rpb24gbW9yZSBsaWtlIFBpY28ncyB2ZXJzaW9uLCBvbmx5IG1vdmUgZG93biB0byB0d28KCSAgbGluZXMgYWZ0ZXIgZWRpdHRvcC4KCm5hbm8tMC45LjE0IC0gMDcvMjcvMjAwMAotIG5hbm8uaDoKCS0gU2V0IENVVF9UT19FTkQgdG8gYSBkaWZmZXJlbnQgYml0IHRoYW4gVEVNUF9PUFQuICBGaXhlcyBidWcgIzMyLgotIGN1dC5jOgogIGRvX2N1dF90ZXh0KCkKCS0gQWRkZWQgY2hlY2sgZm9yIE1BUktfSVNTRVQgd2hlbiB1c2luZyBDVVRfVE9fRU5ELiAgRml4ZXMgYnVnICMzMS4KCS0gU2ltcGxpZmllZCBjaGVjayBmb3IgZnJlZWluZyBjdXRidWZmZXIuICBBZGRlZCBjaGVja3MgZm9yIGRvaW5nCgkgIG11bHRpcGxlIGN1dHMgd2l0aCAtaywgbm93IHNldHMgbWFya2VkX2N1dCB0byAyIGZvciBsYXRlcgoJICBwcm9jZXNzaW5nIGJ5IGRvX3VuY3V0X3RleHQoKS4KICBkb191bmN1dF90ZXh0KCkKCS0gQWRkZWQgaGFuZGxlciBmb3IgdW5jdXR0aW5nIHdpdGggLWsgY3V0cy4KLSBmaWxlcy5jOgogIHdyaXRlX2ZpbGUoKQoJLSBSZW1vdmVkIChyZWR1bmRhbnQpIGNoZWNrIGZvciB3cml0aW5nIG91dCBmaWxlcyB3aXRoIC10LgogIGRvX3dyaXRlb3V0KCkKCS0gQ2hhbmdlZCBjaGVjayBmb3IgZmlsZW5hbWUgdG8gZmlsZW5hbWVbMF0uICBBZGRlZCBzb21lIGNvZGUsIAoJICBvdmVyYWxsIGZpeGVzIGJ1ZyAjMzAgPS0pCi0gbmFuby5jOgogIGRvX2p1c3RpZnkoKSAmIGRvX3dyYXAoKToKCS0gdG90c2l6ZS1yZWxhdGVkIGZpeGVzIChSb2IpCi0gZGUucG8gCgktIFJldmlzZWQgdHJhbnNsYXRpb25zIGJ5IGZsb2tpQGJpZ2Zvb3QuY29tCgpuYW5vLTAuOS4xMyAtIDA3LzIzLzIwMDAKLSBJbXBsZW1lbnRlZCBQaWNvJ3MgLWsgbW9kZS4gIE5ldyBmbGFnIENVVF9UT19FTkQsIG9wdGlvbiAoLWssIC0tY3V0KSwgCiAgYWZmZWN0cyBkb19jdXRfdGV4dCBpbiBjdXQuYy4gIE5vdCBhdmFpbGFibGUgd2l0aCBTTUFMTF9OQU5PIGJlY2F1c2UgaXQKICBkZXBlbmRzIG9uIHRoZSBtYXJrZXIgY29kZSB3aGljaCBpcyBub3QgYXZhaWxhYmxlIHdpdGggdGhhdCBzZXR0aW5nLgotIENoYW5nZWQgc3RhdGljIHRlbXBfb3B0IHRvIGZsYWcgVEVNUF9PUFQuICBGaXhlZCBidWcgIzI5ICh1c2luZwogIC10IHdpdGggYW4gdW53cml0YWJsZSBmaWxlIGNhdXNlcyB1c2VycyB0byBnZXQgbG9ja2VkIGludG8gZWRpdG9yKS4KLSBtb3ZlLmMKICBwYWdlX2Rvd24oKQoJLSBEb24ndCBlZGl0X3JlZnJlc2goKSBpZiB0aGUgYm90dG9tIG9mIHRoZSBmaWxlIGlzIGluIHRoZSBlZGl0CgkgIGJ1ZmZlci4gKEFkYW0pCi0gbmFuby5jOgogIG1haW4oKToKCS0gVEFCU0laRSBub3cgc2V0IGJlZm9yZSBmaXJzdCBjYWxsIHRvIGVkaXRfcmVmcmVzaCAoQmlsbCBTb3VkYW4pCgktIERpZmZlcmVudCBeQyBraWxsIGNvZGUgKHBhdGNoIGJ5IENocmlzdGlhbiBXZWlzZ2VyYmVyKS4KICBkaWUoKToKCS0gTW9yZSBpbnRlbGxpZ2VudCBlbWVyZ2VuY3ktc2F2ZSBmaWxlbmFtZSBzZWxlY3Rpb24gKFJvYikKICBkb19zcGVsbCgpOgoJLSBDaGFuZ2VkIGV4aXQgc2VtYW50aW5jcyBhIGJpdCBzbyB0aGF0IGFzcGVsbCB3b3VsZG4ndCBnZXQKCSAgYWxsIHNjcmV3eSAoYnVnIGRpc292ZXJlZCBieSBKb3NodWEgSmVuc2VuLgotIGZpbGVzLmM6CiAgcmVhZF9maWxlKCk6CgktIEFkZGVkIGluaXQgb2YgYnVmIHZhcmlhYmxlLCBob3BlZnVsbHkgdGhpcyB3aWxsIHN0b3AgdGhlIAoJICAiYmxlZWRpbmciIG9mIHRleHQgc2VlbiB3aXRoIG11dHQgYW5kIHVzaW5nIGkxOG4uCiAgd3JpdGVfZmlsZSgpOgoJLSBBZGRlZCBjb2RlIHRvIGNoZWNrIHRvIHNlZSBpZiB1c2luZyAtbCBhbmQgdGhlIGZpbGUgaXMgbm90CgkgIGluIGZhY3QgYSBsaW5rLiAgVGhpcyBzaG91bGQgZml4IHRoZSBiZWhhdmlvciB3aGVyZSBhIGZpbGUKCSAgdGhhdCBkb2VzIG5vdCBoYXZlIHdyaXRlIHBlcm1pc3Npb24gYnV0IGNvdWxkIGJlIHJlbW92ZWQgYW5kCgkgIHJld3JpdHRlbiBpcyBzYXZlZCB3aXRob3V0IGVycm9yLiAgUGxlYXNlIHRlc3QgdGhpcyBmZWF0dXJlCgkgIGFuZCBnaXZlIGZlZWRiYWNrLgotIHNlYXJjaC5jOgogIHNlYXJjaF9pbml0KCk6CgktIEFkZGVkICIgKHRvIHJlcGxhY2UpIiBzdGF0ZW1lbnQgdG8gZW5kIG9mIHNlYXJjaCBzdHJpbmcgaWYgCgkgIHdlIGFyZSBkb2luZyBhIHJlcGxhY2UuICBNYW51YWxseSBjb252ZXJ0ZWQgYWxsIHRoZSB0cmFuc2xhdGlvbnMKCSAgZnJvbSAnJXMnIHRvICclcyVzJyB0byBlbnN1cmUgdGhleSBzdGlsbCB3b3JrIHdpdGggdGhlIG5ldyBjb2RlLgoJICBBbHNvIHB1dCBpbiB0aGUgdHJhbnNsYXRpb24gZm9yICIgKHJlcGxhY2UpIiBpbiB0aGUgLnBvJ3MuICBIb3BlCgkgIEkgZGlkbid0IHN0ZXAgb24geW91ciB0b2VzIGRvaW5nIHRoaXMgSm9yZGkuIChDaHJpcykKICBkb19zZWFyY2goKSwgZG9fcmVwbGFjZSgpOgoJLSBSZW1vdmVkIGNhbGwgdG8gc2VhcmNoX2Fib3J0KCkvcmVwbGFjZV9hYm9ydCgpIGJlZm9yZSBjYWxsIHRvCgkgIHRoZSBvcHBvc2l0ZSBmdW5jdGlvbi4KCS0gRml4ZWQgYnVnICMyOC4KICBmaW5kbmV4dHN0cigpCgktIGRvIG5vdCBjZW50ZXIgc3RyaW5nIGZvdW5kIGlmIGl0IGlzIGN1cnJlbnRseSB2aXNhYmxlLiAoQWRhbSkKLSBmci5wbzoKCS0gRnJlbmNoIHVwZGF0ZSBieSBDbGVtZW50IExhZm9yZXQgPGNsZW1fbGFmQHdhbmFkb28uZnI+LgotIGVzLnBvOgoJLSBVcGRhdGVkIHN0cmluZ3MgdG8gMC45LjEzIChKb3JkaSkuCgpuYW5vLTAuOS4xMiAtIDA3LzA3LzIwMDAKLSBhbGw6CgktIE5ldyByZWdleHAgc2VhcmNoIGZlYXR1cmUgYnkgQmlsbCBTb3VkYW4uICBOZXcgZmxhZ3MgVVNFX1JFR0VYUAoJICBhbmQgUkVHRVhQX0NPTVBJTEVELCBuZXcgZnVuY3Rpb25zIHJlZ2V4cF9pbml0LCByZWdleHBfY2xlYW51cAoJICByZXBsYWNlX2xpbmUsIHJlcGxhY2VfcmVnZXhwIGluIHNlYXJjaC5jLCBjaGFuZ2VzIHRvCgkgIHNlYXJjaF9pbml0KCkgYW5kIGRvX3JlcGxhY2UoKSBhbmQgc3Ryc3Ryd3JhcHBlcigpLiAKCS0gQWRkZWQgX1BPU0lYX1ZFUlNJT04gY2hlY2sgdG8gcmVnZXhwIGNvZGUuICBCZXR0ZXIgdGhhbiBub3RoaW5nCgkgIGZvciBub24tUE9TSVggc3lzdGVtcy4uLgoJLSBNYWRlIHNlYXJjaCBmdW5jdGlvbnMgJiBrZXlzIG1vcmUgbGlrZSBQaWNvLiAgQWRkZWQgZ290byBsaW5lIGZyb20gIAoJICBzZWFyY2ggYW5kIHJlcGxhY2UgZnVuY3Rpb24sIGNoYW5nZWQgd29yZGluZyB0byAiTm8gUmVwbGFjZSIgaW5zdGVhZAoJICBvZiAiVG8gU2VhcmNoIiwgIlRvIFJlcGxhY2UiIHRvIHNpbXBseSAiUmVwbGFjZSIsIGFuZCBjaGFuZ2VkIHRvCgkgIFBpY28ncyBrZXlzdHJva2UgYnkgZGVmYXVsdCwgXlIuIEFmZmVjdHMgc2VhcmNoX2luaXQoKSwKCSAgZG9fc2VhcmNoKCkgaW4gc2VhcmNoLmMsIGdsb2JhbHMgaW4gbmFuby5oIGFuZAoJICBzaG9ydGN1dF9pbml0KCkgaW4gZ2xvYmFsLmMuCgktIGNoYW5nZWQgJ3NwcmludGYnIGNhbGxzIHRvIHNhZmVyICdzbnByaW50ZicgKFJvYikKLSBjdXQuYwoJLSBmdXJ0aGVyIHRvdHNpemUgdXBkYXRlIGNvcnJlY3Rpb25zCi0gZmlsZXMuYzoKCS0gY2hhbmdlZCBkb19pbnNlcnRmaWxlIHRvIGNhbGwgZml4X2VkaXRib3QgKFJvYikKCS0gTWFnaWMgTGluZSBjb2RlIGluIHJlYWRfZmlsZSAoUm9iKQotIG5hbm8uYzoKCS0gUmVtb3ZlZCBkdWFsIGFsdF9zcGVsbGVyIHZhcmlhYmxlcywgb29wcyEgKFJvY2NvIENvcnNpKQoJLSBSZW1vdmVkIHVubmVjZXNzYXJ5IGRvX29sZHNwZWxsIGZ1bmN0aW9uIChSb2NjbyBDb3JzaSkuICBBZGRlZAoJICBTTUFMTF9OQU5PICNpZmRlZiBhcm91bmQgYWN0dWFsIHNwZWxsIGZ1bmN0aW9uLgoJLSBNb3ZlZCBwYWdlX3VwKCkgdG8gbW92ZS5jIHdoZXJlIGlzIGJlbG9uZ3MuCgktIENvcnJlY3RlZCBGSVhNRSBpbiBkb19lbnRlciB3aXRoIGV4cGxhbmF0aW9uLiAoUm9iKQoJLSBGaXhlZCBGSVhNRSBpbiBkb19qdXN0aWZ5LCByZXN1bHRlZCBpbiBjcmVhdGlvbiBvZgoJICBmaXhfZWRpdGJvdCBbYWxzbyBmaXhlZCBpbiBkb19lbnRlcl0gKHdpbmlvLmMpIChSb2IpCiAgaGVscF9pbml0KCk6CgktIE1vdmVkIG5ld2xpbmUgb3V0IG9mIGlmIHN0YXRlbWVudCAoUm9jY28gQ29yc2kpCiAgZG9fY2hhcigpOgoJLSBNYWdpYyBMaW5lIHJlbGF0ZWQgY29kZSBpbiBkb19jaGFyIChSb2IpCiAgZG9fYmFja3NwYWNlKCksIGRvX2RlbGV0ZSgpOgoJLSBBZGRlZCBtYWdpYyBsaW5lIGNvZGUgaGVyZSB0b28uCgotIGRlLnBvOgoJLSBSZXZpc2VkIHRyYW5zbGF0aW9ucyBieSBmbG9raUBiaWdmb290LmNvbS4KLSBmaS5wbzoKCS0gRmlubmlzaCB0cmFuc2xhdGlvbiBieSBwYXVsaS52aXJ0YW5lbkBzYXVuYWxhaHRpLmZpLgotIHV0aWxzLmM6CgktIEFkZGVkIG5ld19tYWdpY2xpbmUoKQotIHdpbmlvLmM6CgktIEFkZGVkIHN0ZGxpYi5oIHRvIGluY2x1ZGVzLCBmb3VuZCBieSBPcGVuQlNEIGdjYy4KCS0gbG90cyBvZiBuZXcgY29tbWVudGluZyBhcm91bmQgZGlzcGxheSBmdW5jdGlvbnMKICBkb195ZXNubygpLCBuYW5vZ2V0c3RyKCk6CgktIFJlbW92ZWQgbm93IHVubmVjZXNzYXJ5IHJhdy9jYnJlYWsgY29tYm9zLgoJLSBSZW1vdmVkIGdldHRleHQgY2FsbHMgZnJvbSAiWShlcykiLCAiTihvKSIsICJBKGxsKSIgYW5kICJeQyIsIHRpbGwKCSAgd2UgZGVjaWRlIGlmIHRob3NlIGtleWJpbmRpbmdzIHNob3VsZCBiZSB0cmFuc2xhdGVkLiAoSm9yZGkpCiAgY2xlYXJfYm90dG9td2luKCk6CgktIFJlbW92ZWQgd3JlZnJlc2goZWRpdCkgY2FsbC4KICBlZGl0X3VwZGF0ZV90b3AoKToKCS0gRml4ZWQgYSBidWcgdGhhdCBjYXVzZWQgbmFubyB0byBub3QgdXBkYXRlIHdoZW4KCSAgY3VycmVudC0+bmV4dCA9PSBOVUxMIChlLmcuIHBhZ2luZyBkb3duIHRvIHRoZSB2ZXJ5IGJvdHRvbSBvZiAKCSAgQUJPVVQgTkxTIHdvdWxkbid0IHdvcmspLgogIGZpeF9lZGl0Ym90OgoJLSBBZGRlZCAoc2hvdWxkIHJlYnVpbGQgZWRpdGJvdCBmcm9tIGEgdmFsaWQgZWRpdHRvcCkgKFJvYikKICBlZGl0X2FkZDoKCS0gcmVtb3ZhbCBvZiByZWR1bmRhbnQgY2FsbCB0byBtdndhZGRuc3RyCgpuYW5vLTAuOS4xMSAtIDA2LzIwLzIwMDAKLSBOZXcgZmxhZyAiLVQiIG9yICItLXRhYnNpemUiIHRvIHNwZWNpZnkgaG93IHRvIGRpc3BsYXkgdGFiIHdpZHRocy4KICBBZmZlY3RzIG1haW4oKSBpbiBuYW5vLmMsIHN0cmxlbnB0KCksIHhwdCgpIGFuZCBhY3R1YWxfeCgpIChldCBhbCkgaW4gCiAgd2luaW8uYywgYW5kIG5hbm8uaC4gIE1hbnkgaGFyY29kZWQgIjgicyBoYXZlIGJlZW4gY2hhbmdlZCB0byB0aGUgCiAgVEFCU0laRSBpbnQuICBBZGRlZCBjaGFuZ2VzIHRvIG5hbm8uMSBhbmQgbmFuby4xLmh0bWwuCi0gaWQucG86CgktIEluZG9uZXNpYW4gdHJhbnNsYXRpb24gYnkgVGVkaSBIZXJpeWFudG8uCi0gZXMucG86CgktIFVwZGF0ZWQgdHJhbnNsYXRpb24gKEpvcmRpIE1hbGxhY2gpLgotIHdpbmlvLmMKICAgICAgICAtIFJld3JpdGUgb2YgZGlzcGxheSBmdW5jdGlvbnMgdG8gY29ycmVjdCB0aGUgZGlzcGxheSBwcm9ibGVtcyAKCSAgd2UgaGFkIGJlZW4gc2VlaW5nLiBBZmZlY3RzOiBhZGRfbWFya2VkX3NhbWVsaW5lLCBlZGl0X2FkZCwKCSAgYW5kIG1hbnkgb3RoZXJzLiAoUm9iIFNpZW1ib3Jza2kpCgktIHRvdHNpemUgZml4ZXMgKFJvYiBTaWVtYm9yc2tpKQogIHRvdGFsX3JlZnJlc2goKToKCS0gQ3V0IGRpc3BhbHlfbWFpbl9saXN0IGNhbGwsIGFzIHRoaXMgZnVuY3Rpb24gaXMgb25seSBzdXBwb3NlZCB0byByZWZyZXNoCgkgIHdoYXQncyBhbHJlYWR5IG9uIHRoZSBzY3JlZW4sIG5vdCBnbyB0aHJvdWdoIHRoZSBwcm9jZXNzIG9mIGFkZGluZyB0aGUKCSAgdGV4dCBhZ2Fpbi4KLSBjdXQuYzoKCS0gdG90c2l6ZSBmaXhlcyAoUm9iIFNpZW1ib3Jza2kpCi0gbmFuby5jOgoJLSBleHBlcmltZW50YWwgZG9fd3JhcCBhbmQgY2hlY2tfd3JhcCAoQWRhbSBSb2dveXNraSkKCS0gUmVtb3ZlZCBlZGl0d2luZW9iLCBhcyBpdCB3YXMgcmVkdW5kYW50IGZvciAoZWRpdHdpbnJvd3MgLSAxKS4KCSAgQ2hhbmdlZCBhbGwgY2FsbHMgdG8gZWRpdHdpbnJvd3MgLSAxIGluIG5hbm8uYyBhbmQgbW92ZS5jLgoJLSBSZW1vdmVkIGFsbCBmdW5jdGlvbnMgdGhhdCB3ZXJlIHNwbGl0IGludG8gb3RoZXIgZmlsZXMuCgkgIEFmZmVjdHMgTE9UUyBvZiBmdW5jcy4KICBkb19lbnRlcigpOgogICAgICAgIC0gQWRkZWQgcmVzZXQgb2YgcGxhY2V3ZXdhbnQgdG8gZW5kLgogIGRvX2luc2VydGZpbGUoKToKCS0gRml4IGRpc3BsYXkgcHJvYmxlbSB3aGVuIHVzaW5nIGN0cmwtciB0byBsb2FkIGEgZmlsZQoJICBpbnRvIHRoZSBidWZmZXIgKFJvYiBTaWVtYm9yc2tpKQogIGhhbmRsZV9zaWd3aW5jaCgpOgoJLSBBZGRlZCB0aXRsZWJhcigpLCBlZGl0X3JlZnJlc2goKSBhbmQgZGlzcGxheV9tYWluX2xpc3QoKSBjYWxscyBiZWNhdXNlCgkgIGEgcmVzaXplIHdhc24ndCBwaWNraW5nIHVwIG9uIHBvc3NpYmxlIGRpZmZlcmVudCB3aWR0aCBjb3JyZWN0bHkuCi0gdXRpbHMuYzoKCS0gTW92ZWQgbm1hbGxvYygpIGFuZCBucmVhbGxvYygpIGhlcmUuCi0gbW92ZS5jOgoJLSBOZXcgZmlsZSwgY29udGFpbnMgbW92ZW1lbnQgZnVuY3Rpb25zIChsaWtlIGRvX2hvbWUoKSwgZG9fdXAoKSwKCSAgZG9fZG93bigpLCBwYWdlX3VwKCksIGV0Yy4uLikuCi0gZmlsZXMuYzoKCS0gQ29udGFpbnMgZnVuY3Rpb25zIGZvciBmaWxlcyAocmVhZF9maWxlLCBpbnNlcnRfZmlsZSwKCSAgZG9fd3JpdGVvdXQoKSwgZXRjKS4KLSBzZWFyY2guYzoKCS0gQ29udGFpbnMgYWxsIG91ciBzZWFyY2hpbmcgYW5kIHJlbGF0ZWQgZnVuY3Rpb25zLCAoZG9fc2VhcmNoKCksCgkgIGZpbmRuZXh0c3RyKCksIGRvX3JlcGxhY2UoKSwgZG9fZ290b2xpbmUoKSkuCgpuYW5vLTAuOS4xMCAtIDA2LzA0LzIwMDAKLSBlcy5wbzoKCS0gVHJhbnNsYXRpb24gdXBkYXRlcyAoSm9yZGkpLgotIEFVVEhPUlMsIG5hbm8uMS5odG1sLCBUT0RPLCBSRUFETUU6CgktIERvY3VtZW50YXRpb24gYW5kIGVtYWlsIGFkZHJlc3MgdXBkYXRlcyAoSm9yZGkpLgotIG5hbm8uYzoKICBtYWluKCk6CgktIE1vdmVkIEFkYW0ncyB0ZXJtaW8gY29kZSBkb3duIHRvIGFmdGVyIGdldG9wdCgpIGFuZCBiZWZvcmUgaW5pdHNjcigpCgkgIHRvIHN0b3AgcGVvcGxlIGxvc2luZyB0aGVpciBTSUdJTlQgY2hhcmFjdGVyIHdoZW4gdXNpbmcgYXJncyB0aGF0CgkgIGV4aXQgbmFubyBiZWZvcmUgaXQgcnVucyAoLS12ZXJzaW9uLCAtLWhlbHAsIGV0YykuCgpuYW5vLTAuOS45IC0gMDUvMzEvMjAwMAotIE1ha2VpbGUuYW06CgktIEFkZGVkIHByb3BlciBsaW5lcyBmb3IgZGVmaW5pbmcgTE9DQUxFRElSLgotIGNvbmZpZ3VyZS5pbjoKCS0gU3BlbGxpbmcgZml4ZXMgKEpvcmRpIE1hbGxhY2gpCgktIFJlbW92ZWQgQ0ZMQUdTIGNoYW5nZXMgZm9yIGdjYywgcmVkdWNlcyBwb3J0YWJpbGl0eSBhY2NvcmRpbmcgdG8KCSAgc29tZSwgYW5kIGl0IGNlcnRhaW5seSBkb2Vzbid0IHNlZW0gdG8gZGVjcmVhc2UgZXhlIHNpemUuCi0gZXMucG86CgktIFNwYW5pc2ggcmFuc2xhdGlvbiB1cGRhdGVzIChKb3JkaSBNYWxsYWNoKQotIFBPVEZJTEVTLmluOgoJLSBBZGRlZCBnbG9iYWwuYyBmaWxlLCB3YXMgc2NyZXdpbmcgdXAgdHJhbnNsYXRpb25zIChpLmUuIHRoZXkKCSAgd2VyZW4ndCBnZXR0aW5nIGRvbmUpLgotIGN1dC5jOgogIGFkZF90b19jdXRidWZmZXIoKToKCS0gQWRkZWQgdG90c2l6ZSBpbmNyZW1lbnQuCgktIEN1dCBmaXhlcyBhbmQgb3B0aW1pemF0aW9ucyAoUm9iIFNpZW1ib3Jza2kpLgogIGRvX3VuY3V0X3RleHQoKToKCS0gQWRkZWQgdG90c2l6ZSBpbmNyZW1lbnQgaW4gc2V2ZXJhbCBwbGFjZXMuCi0gbmFuby5jOgogIGhlYWRlcnM6CgktIFJlbW92ZWQgTE9DQUxFRElSIGRlZmluZS4KICBkb19qdXN0aWZ5KCk6CgktIEFkZGVkIGVkaXRfcmVmcmVzaCgpIGNhbGwgKGJ1ZyBkaXNjb3ZlcmVkIGJ5IEFkYW0pLgogIHBhZ2VfZG93bl9jZW50ZXIoKToKCS0gQWRkZWQgY2FsbCB0byBlZGl0X3VwZGF0ZShjdXJyZW50KSBmb3IgbGFzdCBjYXNlLiAgUmVtb3ZlZCAKCSAgaW5jcmVtZW50IG9mIGN1cnJlbnRfeSBzaW5jZSBpdCdzIG5vdyBqdXN0IHdhc3RlZnVsLgogIGRvX2VudGVyKCk6CgktIEFkZGVkIHRvdHNpemUgaW5jcmVtZW50LgogIHJlbnVtYmVyKCksIHJlbnVtYmVyX2FsbCgpOgoJLSBSZW1vdmVkIHRvdHNpemUtLSBhbmQgdG90c2l6ZSBpbml0IGluIHJlbnVtYmVyX2FsbC4KICBkb19tb3VzZSgpOgoJLSBBZGRlZCBlZGl0X3JlZnJlc2goKSBjYWxsIHRvIHNob3cgaGlsaWdodCB1cGRhdGVzLiAgUmVtb3ZlZAoJICB1bm5lY2Vzc2FyeSB3cmVmcmVzaChlZGl0KS4KICBtYWluKCk6CgktIE1vdmVkIHVwIGxvY2FsZSBjYWxscyBzbyB0aGF0IHRyYW5zbGF0ZWQgLS1oZWxwIG1lc3NhZ2VzIHdvdWxkCgkgIGFjdHVhbGx5IGdldCB0cmFuc2xhdGVkLgogIGRvX2JhY2tzcGFjZSgpLCBkb19kZWxldGUoKToKCS0gQWRkZWQgZGVjcmVtZW50IG9mIHRvdHNpemUuCiAgaW5pdF9oZWxwX21zZygpOgoJLSBOZXcgZnVuY3Rpb24sIGluaXRpYWxpemVzIGhlbHAgdGV4dCBpZiBOQU5PX1NNQUxMIGlzbid0IHNldCAoZml4ZXMKCSAgYnJva2VuIGkxOG4pLgogIHJlYWRfZmlsZSgpOgoJLSBtYWxsb2MgY2FsbCBjaGFuZ2VkIHRvIG5tYWxsb2MgKFJvYiBTaWVtYm9yc2tpKS4KLSB3aW5pby5jOgogIHRvdGFsX3JlZnJlc2goKToKCS0gQ29tcGxldGVseSByZXdyb3RlIGZ1bmN0aW9uLCBub3QgcXVpdGUgc28gYnJhaW5kYW1hZ2VkIG5vdy4KCm5hbm8tMC45LjggLSAwNS8xOC8yMDAwCi0gbmFuby5jOgogIG1haW4oKToKCS0gQWRkZWQgYXdlc29tZSBjb2RlIHRoYXQgZGlzYWJsZXMgdGhlIENJTlRSIGFuZCBDUVVJVCAKCSAgY2hhcmFjdGVyIChBZGFtIFJvZ295c2tpKS4gIFJlbW92ZWQgcmF3KCkvbm9yYXcoKSBjYWxscyBzbyB0aGF0CgkgIG5hbm8gZ2V0cyBpbnB1dCBpbiAnbm9ybWFsJyBtb2RlLCB3aGljaCBpcyB0aGUgUmlnaHQgV2F5KHRtKSB0bwoJICBkbyBpdC4gXlMsIF5aIGFuZCBeUSBub3cgd29yayBwcm9wZXJseSBhcyBhIHJlc3VsdCwgYXMgd2VsbCBhcwoJICBeQy4gIE5ldyB2YXJpYWJsZSB0ZXJtLCBnbG9iYWwgYmFyaWFibGUgb2xkdGVybSB0byBzYXZlIHByZXZpb3VzCgkgIHRlcm0gc2V0dGluZ3MsIGFuZCBjaGFuZ2VzIHRvIGZpbmlzaCgpIGFuZCBkaWUoKS4KCS0gQWRkZWQgZXh0cmEgI2lmZGVmcyBpbiBnZXRvcHQgY29kZSwgc28gdGhhdCBhYm92ZSBjb2RlIGFuZAoJICBmbGFnIGluaXQgaXMgcnVuIGV2ZW4gaWYgR0VUT1BUX0xPTkcgaXMgbm90ICNkZWZpbmVkLgoJLSBBZGRlZCBtZW1zZXQgbGluZSBiZWZvcmUgc2lnYWN0aW9ucy4gKEFkYW0gUm9nb3lza2kpCiAgZG9fc3VzcGVuZCgpOgoJICBSZW1vdmVkIGZ1bmN0aW9uLCBzZWUgYWJvdmUgZm9yIHdoeS4KLSB3aW5pby5jOgogIHVwZGF0ZV9saW5lKCksIGNlbnRlcl9jdXJzb3IoKToKCS0gUmVtb3ZlZCB3cmVmcmVzaChlZGl0KSBmcm9tIGJvdHRvbSBvZiBmdW5jdGlvbnMuICB3cmVmcmVzaAoJICBzaG91bGQgbm93IG9ubHkgYmUgY2FsbGVkIG9uY2UsIGF0IHRoZSBib3R0b20gb2YgdGhlIG1haW4oKQoJICBsb29wLgotIGdsb2JhbC5jOgogICBzaG9ydGN1dF9pbml0KCk6CgktIFJlbW92ZWQgc3VzcGVuZCBzY19pbml0IGNhbGwgYW5kIHN1c3BlbmQgbWVzc2FnZSBiZWNhdXNlIHN1c3BlbmQgaXMgbm8KCSAgbG9uZ2VyIG5lZWRlZCBpbiB0aGUgc2hvcnRjdXQgbGlzdCB0byB3b3JrIHByb3Blcmx5LgogICAgCm5hbm8tMC45LjcgLSAwNS8xNC8yMDAwCi0gbmFuby5jOgogIGRvX2hvbWUoKSwgZG9fZW5kKCk6IAoJLSBBZGRlZCBjYWxscyB0byB1cGRhdGVfbGluZSBmb3IgdGhlIGN1cnJlbnQgbGluZSwgZml4ZXMKCSAgbGFjayBvZiB1cGRhdGUgKGJ1ZyBkaXNjb3ZlcmVkIGJ5IEFsYmVydG8gR2FyY+1hKS4KICBtYWluKCk6CgktIEFkZGVkIFNFVChGT0xMT1dfU1lNTElOS1MpIGJlZm9yZSBnZXRvcHQgY2FsbCwgZml4ZXMgbm90IAoJICBmb2xsb3dpbmcgc3ltbGlua3MgZXZlbiB3aGVuIC1sIGlzbid0IHNldCwgYW5kICJubyBjaGFuZ2VzIgoJICBlcnJvciB3aGVuIG5hbm8gaXMgY2FsbGVkIGZyb20gY3JvbnRhYiAtZSAoQWRhbSBSb2dveXNraSkuCi0gY3V0LmM6CiAgZG9fY3V0X3RleHQoKToKCS0gQWRkZWQgZWRpdF91cGRhdGVfdG9wIHRvIGN1dCB3aGVuIG1hcmsgaXMgc2V0LCBmaXhlcyBsYWNrIG9mCgkgIGRpc3BsYXkgdXBkYXRlIChidWcgZGlzY292ZXJlZCBieSBLZW4gVHlsZXIpLgoKbmFuby0wLjkuNiAtIDA1LzA4LzIwMDAKLSBOZXcgSXRhbGlhbiB0cmFuc2xhdGlvbiAoaXQucG8pLCBieSBEYW5pZWxlIE1lZHJpLgotIG5hbm8uYzoKICBwYWdlX3VwKCksIHBhZ2VfZG93bigpOgoJLSBBZGRlZCByZXNldCBvZiBwbGFjZXdld2FudCB0byAwLCBhcyBpdCBzaG91bGQgYmUuCiAgZG9fdXAoKSwgZG9fZG93bigpOgoJLSBBZGRlZCBjYWxsIHRvIHVwZGF0ZV9saW5lKCkgZm9yIGxpbmUgd2UgbW92ZSBmcm9tIGFuZCBsaW5lIHdlCgkgIG1vdmUgdG8sIGluIG9yZGVyIHRvIGtlZXAgdGhlIGhpZ2hsaWdodGluZyBjb3JyZWN0LgogIGRvX3dyYXAoKToKCS0gQWRkZWQgdmFyIGNob3AsIG5ldyBjb2RlIHRvIHdyYXAgbGluZXMgbW9yZSBsaWtlIFBpY28sIG1vc3RseS4KCSAgVEhJUyBTVElMTCBERUZJTklURUxZIE5FRURTIFRPIEJFIFJFV1JJVFRFTiEKLSB3aW5pby5jOgogIGRvX2hlbHAoKToKCS0gQWRkZWQgZWRpdF9yZWZyZXNoKCkgYmVmb3JlIGV4aXQuCiAgdXBkYXRlX2N1cnNvcigpOgoJLSBSZW1vdmVkIGN1cnNvciB1cGRhdGluZyB3aGljaCByZWFsbHkgd2Fzbid0IG5lZWRlZCBhbnl3YXkuCiAgZWRpdF91cGRhdGUoKToKCS0gUmVtb3ZlZCB5dWNreSBjb2RlIHRoYXQgZGlkbid0IHdvcmssIHRoaXMgZnVuY3Rpb24gbm93IGp1c3QKCSAgY29tcHV0ZXMgZWRpdHRvcCBhbmQgZWRpdGJvdCBhbmQgY2FsbHMgZWRpdF9yZWZyZXNoKCkgdG8gZG8gdGhlCgkgIHJlc3QsIHdoaWNoIHJlbW92ZXMgYSBsb3Qgb2YgZHVwbGlpY2F0ZSBjb2RlLi4gIAogIApuYW5vLTAuOS41IC0gMDUvMDEvMjAwMAotIFJlbW92ZWQgYnl0ZXMgZnJvbSBmaWxlIHN0cnVjdCBiZWNhdXNlIGl0IHdhcyBjb21wdXRhdGlvbmFsbHkgd2FzdGVmdWwuCi0gY3V0LmM6CiAgZG9fdW5jdXRfdGV4dCgpOgoJLSBBZGRlZCBjYWxsIHRvIGVkaXRfcmVmcmVzaCgpLgotIG5hbm8uYzoKICBkb19iYWNrc3BhY2UoKToKCS0gQWRkZWQgcmVzZXQgb2YgZWRpdGJvdCB3aGVuIGRlbGV0aW5nIHRoZSBsYXN0IGxpbmUgb2YgdGhlIGZpbGUKCSAgKGJ1ZyBkaXNjb3ZlcmVkIGJ5IEFkYW0pLgogIGRvX2NoYXIoKToKCS0gUmVtb3ZlZCBjYWxsIHRvIHJlc2V0X2N1cnNvcigpLgogIGRvX2RlbGV0ZSgpOgoJLSBBZGRlZCBzaW1pbGFyIGNoZWNrIGFzIHRvIGRvX2JhY2tzcGFjZSgpLgogIGRvX2VudGVyKCk6CgktIEFkZGVkIGNhbGwgdG8gZWRpdF9yZWZyZXNoKCkuCiAgZG9fbGVmdCgpLCByaWdodCgpOgoJLSBBZGRlZCBjYWxsIHRvIHVwZGF0ZV9saW5lKCksIHN0aWxsIHJlZHVuZGFudCBidXQgYmV0dGVyLi4uCiAgZG9fdXAoKSwgZG9fZG93bigpOgoJLSBBZGRlZCByZWZyZXNoIGNhbGxzIGJvdGggZm9yIGN1cnJlbnQgbGluZSBhbmQgbGluZSB0byB3aGljaAoJICB3ZSBhcmUgbW92aW5nLgogIG1haW4oKToKCS0gUmVtb3ZlZCBpbmVmZmljaWVudCBjYWxsIHRvIGVkaXRfcmVmcmVzaCgpIGFmdGVyIGV2ZXJ5IGtleXN0cm9rZS4KCSAgSXQgaXMgbm93IHVwIGVhY2ggZnVuY3Rpb24gdG8gbGVhdmUgdGhlIHNjcmVlbiBpbiBhIGdvb2Qgc3RhdGUuCi0gd2luaW8uYzoKICBkb19jdXJzb3Jwb3MoKQoJLSBSZXdyaXR0ZW4gdG8gbm90IHVzZSBieXRlcyBmcm9tIGZpbGVzdHJ1Y3QgYnkgYW4gaW5jcmVtZW50YWwgc3VtLgogIHVwZGF0ZV9saW5lKCksIHJlc2V0X2N1cnNvcigpOgoJLSBPcHRpbWl6ZWQgY2FsbHMgdG8geHBsdXN0YWJzKCkgdGhyb3VnaCBhIHNpbmdsZSB2YXJpYWJsZS4KCS0gdXBkYXRlX2xpbmUoKSBub3cgdGFrZXMgYSBuZXcgYXJnLCBhbiBpbmRleCBpbnRvIHRoZSBzdHJpbmcKCSAgZm9yIHdoZXJlIHRvIHVwZGF0ZSB0aGUgbGluZSBmcm9tLiAgTmVlZGVkIGZvciBuZXcgdXBkYXRlCgkgIGNvZGUuCi0gY29uZmlndXJlLmluOgoJLSBCZXR0ZXIgY2hlY2tzIGZvciBzbGFuZywgYWxsb3dzIGFyZ3VtZW50IHRvIC0td2l0aC1zbGFuZy4KCSAgKEFsYmVydCBDaGluLUEtWW91bmcpCgktIFJlbW92ZWQgLUlpbnRsIGZyb20gQ0ZMQUdTIGluIGdjYyBjaGVjay4KLSBNYWtlZmlsZS5hbToKCS0gQWRkaXRpb24gb2YgLUlpbnRsIGZvciBnZXR0ZXh0IChBbGJlcnQgQ2hpbi1BLVlvdW5nKQoKbmFuby0wLjkuNCAtIDA0LzI1LzIwMDAKIC0gRml4ZWQgY2FsbHMgdG8gbm9faGVscCBhbmQgY2hhbmdlZCB0aGVtIHRvIHRoZSBtb3JlIGNvbnNpc3RlbnQKICAgSVNTRVQoTk9fSEVMUCkuICBGaXhlZCByZXR1cm4gdmFsIG9mIG5vX2hlbHAgdG8gYmUgd2hhdCBpdCBzaG91bGQgKDIsCiAgIG5vdCAxLiAgQ29kZSB0byB0ZW1wb3JhcmlseSBkaXNhYmxlIE5PX0hFTFAgd2hlbiBpbiB0aGUKICAgaGVscCBzeXN0ZW0uIChBZGFtIFJvZ295c2tpKQotIGN1dC5jOgogIGRvX21hcmtlZF9jdXQoKSwgZG9fY3V0KCksIGRvX3VuY3V0KCk6CgktIENvbW1lbnRlZCBvdXQgdW5uZWNlc3NhcnkgYml0cyB3aGVuIE5BTk9fU01BTEwgaXMgYmVpbmcgdXNlZC4KLSB3aW5pby5jOgogIHhwdCgpLCBzdHJsZW5wdCgpLCBhY3R1YWxfeCgpOgoJLSBBZGRlZCBjaGVjayBmb3IgdmFsdWUgb2YgZGF0YVtpXSAmIDB4ODAsIGlmIHNvIGRvIG5vdCBtYWtlCgkgIGNoYXJhY3RlciAyIGNoYXJzIHdpZGUgKG9yaWcuIGJ5IENocmlzLCAweDgwIGNoZWNrIGJ5IEFkYW0pLgogIGVkaXRfcmVmcmVzaCgpOgoJLSBOZXcgY2hlY2sgZm9yIHRlbXAgPT0gTlVMTCAoYmFkIHRoaW5nKSwgaWYgc28gZ28gYmFjayB0byB0aGUKCSAgcHJldmlvdXMgbGluZS4gIE5ldyBmaWxlc3RydWN0IHZhciBob2xkIHBvaW50cyB0byBwcmV2IGxpbmUuCgkgIEZpeGVzIHNlZ2ZhdWx0IHdoZW4gcGFnaW5nIGRvd24gdG8gdGhlIGVuZCBvZiBhIGZpbGUuCi0gbmFuby5jOgogIHdyaXRlX2ZpbGUoKToKCS0gQWRkZWQgY2hlY2sgZm9yIGlmIGZpbGUgZXhpc3RzIGFuZCBpcyBub3QgZXF1YWwgdG8gdGhlIGN1cnJlbnQKCSAgZmlsZW5hbWUsIHByb21wdCBmb3Igb3ZlcndyaXRlIChBZGFtIFJvZ295c2tpKS4KICBkb19kb3duKCk6CgktIFJlbW92ZWQgY2hlY2sgZm9yIGN1cnJlbnQtPm5leHQgPT0gTlVMTCwgbm93IGNoZWNrcyByZXR1cm4gdmFsdWUKCSAgb2YgZG9fZG93biBiZWZvcmUgc2V0dGluZyBjdXJyZW50X3ggPSAwIChkaXNjb3ZlcmVkIGJ5IEFkYW0pLgogIGRvX2p1c3RpZnkoKToKCS0gRml4ZWQgc2VnZmF1bHQgd2hlbiByZWFjaGluZyB0aGUgbGFzdCBsaW5lICh0cmllZCB0byBhc3NpZ24KCSAgY3VycnJlbnQtPm5leHQtPmRhdGEgd2hlbiBjdXJyZW50LT5uZXh0ID09IE5VTEwpIChkaXNjb3ZlcmVkCgkgIGJ5IEFkYW0pLgotIHV0aWxzLmM6CgktIFJlbW92ZWQgZXh0cmEgbWFjcm8gZGVmcyB0aGF0IGFyZSBub3cgaW4gbmFuby5oLgotIG5hbm8uaDoKCS0gQ2hhbmdlZCBtYWNybyBTRVQoKSB0byB1c2UgfD0gaW5zdGVhZCBvZiBePS4gIEZpeGVzIGJ1ZyBpbgoJICBjdXQgY29kZSB3aGVuIGN1dHRpbmcgbW9yZSB0aGFuIG9uZSBsaW5lLCBhbmQgY3V0YnVmZmVyIGdldHMKCSAgYmxvd24gYXdheSB3aGVuIGl0IHNob3VsZG50LiAgCgpuYW5vLTAuOS4zIC0gMDQvMjkvMjAwMAotIGN1dC5jOgogIGRvX21hcmtlZF9jdXQoKToKCS0gRml4ZWQgb2ZmIGJ5IG9uZSBlcnJvciBpbiBjdXQgY29kZSBmb3IgbWFya2VkIHRleHQuCiAgZG9fY3V0X3RleHQoKToKCS0gUmVtb3ZlZCBjaGVjayBmb3IgYmVpbmcgb24gdGhlIGxhc3QgbGluZSwgcGFydCBvZgoJICBtYWdpYyBsaW5lIGNvZGUuCiAgYWRkX3RvX2N1dGJ1ZmZlcigpOgoJLSBNb3ZlZCB0bXAtPnByZXYgPSBpbnB0ciBsaW5lIHRvIHBhcnQgd2hlcmUgY3V0YnVmZmVyICE9IE5VTEwuCgktIEFkZGVkIGlucHRyLT5wcmV2ID0gTlVMTCBmb3IgY2FzZSB3aGVyZSBjdXRidWZmZXIgPT0gTlVMTC4KLSBuYW5vLmM6CiAgZG9fYmFja3NwYWNlKCksIGRvX2NoYXIoKTogIAoJLSBSZW1vdmVkICJtYWdpYyBsaW5lIiBjb2RlLiAgSXQgd2FzIGJhc2ljYWxseSBjYXVzaW5nIG1vcmUgYnVncwoJICB0aGFuIGl0IHdhcyBoZWxwaW5nIGZvciB0aGUgc2FrZSBvZiBjb21wYXRpYmlsbGl0eS4gIFRoaXMgZml4ZXMKCSAgYXQgbGVhc3Qgb25lIGtub3duIHNlZ2ZhdWx0IGNvbmRpdGlvbi4KICBkb19lbnRlcigpOgoJLSBBZGRlZCBzZXR0aW5nIGVkaXRib3QgdG8gbmV3IG5vZGUgaWYgdGhlIG5ldyBub2RlIGlzIHRoZSBsYXN0CgkgIG5vZGUgaW4gdGhlIGZpbGUuCiAgd3JpdGVfZmlsZSgpOgoJLSBDaGFuZ2VkIHdyaXRpbmcgZmlsZSBiYWhhdmlvci4gIE5vdywgaWYgbGFzdCBsaW5lIG9mIHRoZSBmaWxlCgkgIGhhcyBhbnkgZGF0YSBvbiBpdCwgd2Ugd3JpdGUgYSBuZXdsaW5lIG9uIGl0LCBlbHNlIHdlIGRvbnQuCi0gd2luaW8uYzoKICBhZGRfbWFya2VkX3NhbWVsaW5lKCk6CgktIE5ldyBjb2RlIHRoYXQgY2hlY2tzIGZvciB3aGV0aGVyIHRoZSBiZWdpbiBhbmQgZW5kIG9mIHRoZSBtYXJrZXIKCSAgYXJlIG9uIGRpZmZlcmVudCBsaW5lcy4gIE1pc3NpbmcgcHJldmlvdXNseS4KICBlZGl0X2FkZCgpOgoJLSBhZGRlZCBzb21lIG1vcmUgY2hlY2tzIGZvciB0ZXh0IGxlbmd0aC4gIENsZWFuZWQgdXAgc29tZSBtdndhZGRuc3RycyB0aGF0CgkgIGNvdWxkIGJlIHdyaXR0ZW4gbW9yZSBzaW1wbHkgYXMgd2FkZG5zdHJzLgogIGVkaXRfcmVmcmVzaCgpOgoJLSBSZW1vdmVkIGNoZWNrIGZvciB0ZW1wID09IGZpbGVib3QsIGl0IGlzIG5vdyB0cmVhdGVkIGxpa2UgYW55IG90aGVyIGxpbmUuCgkgIEZpeGVzIGEgYnVnIHdoZXJlIHNlbGVjdGVkIHRleHQgb24gdGhlIGxhc3QgbGluZSBzaG93cyBub3JtYWxseS4KICB4cHQoKToKCS0gUmVtb3ZlZCBhbiBleHRyYSBjb21wdXRhdGlvbiBmb3IgdGFicyB2YXJpYWJsZSB0aGF0IHdhcyBpbmNvcnJlY3QuCiAgeHBsdXN0YWJzKCk6CgktIFNpbmNlIHhwdCBub3cgYWN0dWFseSB3b3JrcywgdGhpcyBmdW5jIGlzIG5vdyBqdXN0IGEgd3JhcHBlciBmb3IKCSAgeHB0KGN1cnJlbnQsIGN1cnJlbnRfeCkKLSBuYW5vLjEsIG5hbm8uMS5odG1sOgoJLSBBZGRlZCAtbCBvcHRpb24gdG8gbWFuIHBhZ2VzLgotIGNvbmZpZ3VyZS5pbjoKCS0gTmV3IG9wdGlvbiAtLWVuYWJsZS10aW55LCAjZGVmaW5lcyBOQU5PX1NNQUxMIGluIGNvbmZpZy5oLiAgCgkgIERpc2FibGVzIGNhbGwgdG8gZ2V0dGV4dCBpbiBmdW5jdGlvbnMgYW5kIG90aGVyIGkxOG4gc3R1ZmYgaW4gCgkgIG5hbm8uYywgdGhlIGRldGFpbGVkIGhlbHAgbW9kZSwgdGhlIHJlc2l6ZSBmdW5jdGlvbnMsIGFuZCB0aGUgCgkgIGp1c3RpZnkgY29kZSB3aGljaCBubyBvbmUgZXZlciB1c2VzLgoJLSBOZXcgb3B0aW9uIC0td2l0aC1zbGFuZy4gIEVuYWJsZXMgc2xhbmcgbGlicmFyaWVzIGluc3RlYWQgb2YKCSAgbmN1cnNlcywgcmVxdWlyZXMgc2xjdXJzZXMuaCBmb3Igd3JhcHBlciBmdW5jdGlvbnMuIChCYXNlZAoJICBvbiBwYXRjaGVzIGZvciAwLjguNyBieSBHbGVubiBNY0dyYXRoKS4KCm5hbm8tMC45LjIgLSAwNC8xNS8yMDAwCi0gVGhpcyByZWxlYXNlIGp1c3QgZml4ZXMgdGhlIHNlcmlvdXMgc2VnZmF1bHQgcHJvYmxlbSBpZiBuYW5vIGlzIAogIGludm9rZWQgYW55IHdheSBvdGhlciB0aGFuIHVzaW5nIHRoZSBhYnNvbHV0ZSBwYXRoLiAgVGhlIGJ1ZyB3YXMKICBpbiB0aGUgbmV3IGNvZGUgZm9yIGNoZWNraW5nIHdoZXRoZXIgbmFubyBpcyBpbnZva2VkIGFzIHBpY28uCgpuYW5vLTAuOS4xIC0gMDQvMTQvMjAwMAotIEFkZGVkIHBpY28gY29tcGF0aWJpbGl0eSBmb3IgXlQgd2hlbiBpbiBzZWFyY2ggb3Igc3dpdGNoIHRvIHN3aXRjaAogIHRvIHRoZSBvcHBvc2l0ZSBmdW5jdGlvbi4gIEFkZGVkIG9uZSB0byBSRVBMQUNFX0xJU1RfTEVOIGFuZCAKICBXSEVSRUlTX0xJU1RfTEVOIGluIG5hbm8uaCwgbmV3IGFyZ3MgdG8gc2NfaW5pdF9vbmUgaW4gZ2xvYmFsLmMgYW5kCiAgbmV3IHN0cmluZ3MgdGhhdCB3aWxsIGhhdmUgdG8gYmUgZ2V0dGV4KCllZC4gIE5ldyBhcmd1bWVudCAncmVwbGFjaW5nJwogIHRvIHNlYXJjaF9pbml0KCkuICBIYW5kbGVycyBpbiBkb19yZXBsYWNlIGFuZCBkb19zZWFyY2goKS4KLSBOZXcgd3JpdGUgY29kZSwgbm93IGZvbGxvd3Mgc3ltYm9saWMgbGlua3MgaW5zdGVhZCBvZiByZXBsYWNpbmcgdGhlbQogIHdpdGggdGhlIG5ldyBmaWxlLiAgTmV3IG9wdGlvbiAoLWwsIC0tbm9mb2xsb3cpIHRvIGVuYWJsZSB0aGUgb2xkCiAgKGluY29ycmVjdCwgYnV0IHNlY3VyZSkgYmVoYXZpb3IgKEFkYW0gUm9nb3lza2kpLgotIG5hbm8uYzoKICBkb193cmFwKCk6CQoJLSBGaXhlZCBhbm90aGVyIGJ1ZyByZWxhdGluZyB0byB3cmFwcGluZywgYW5kIHdoaWNoIHdvdWxkIGNhdXNlCgkgIGEgc2VnZmF1bHQgKnNpZ2gqLgogIGRvX3JlcGxhY2UoKTogCgktIEluY3JlbWVudGVkIGN1cnJlbnRfeCBieSB0aGUgbGVuZ3RoIG9mIHRoZSByZXBsYWNlbWVudAoJICB0ZXh0IGluc2lkZSB0aGUgbWFpbiByZXBhbGNlIGxvb3AuICBGaXhlcyBidWcgIzE1LgogIGFkZF9tYXJrZWRfc2FtZWxpbmUoKToKCS0gTmV3IGZ1bmN0aW9uLCBoYW5kbGVzIG1hcmtlZCB0ZXh0IHdoZW4gc3RhcnQgJiBlbmQgb2YgbWFya2VyIGlzCgkgIG9uIG9uZSBsaW5lLCBhbHNvIHN1cHBvcnRzIG1vc3QgbWFya2VkIHRleHQgd2hlbiBjdXJzb3IgPiBDT0xTLgogIG1haW4oKToKCS0gQ29kZSB0byBjaGVjayBpZiBuYW5vIGlzIGludm9rZWQgYXMgJ3BpY28nLCBhbmQgaWYgc28KCSAgYXV0b21hdGljYWxseSBzZXQgcGljb19tc2dzIChSb2JlcnQgSm9uZXMpLgoKbmFuby0wLjkuMCAtIDA0LzA3LzIwMDAKLSBuYW5vLjEsIG5hbm8uMS5odG1sOiAJVXBkYXRlZCBtYW4gcGFnZSB3aXRoIG15IGVtYWlsIGFkZHJlc3MgYW5kIGhvbWVwYWdlLgotIHdpbmlvLmM6CiAgcmVzZXRfY3Vyc29yKCksIHVwZGF0ZV9saW5lKCk6CQoJLSBDaGFuZ2VkIHVwZGF0ZSBhbGdvcml0aG0gZm9yIHggdmFsdWUgdG8gKENPTFMgLSA3KSBtdWx0aXBsZSB3aGVuIHgKCSAgdmFsdWUgPiAoQ09MUyAtIDIpLgotIGVkaXRfcmVmcmVzaCgpOgoJLSBSZW1vdmVkIGlubmVyIGxvb3AgY29kZSwgbm93IGNhbGxzIHVwZGF0ZV9saW5lKCkgZm9yIGVhY2ggbGluZQoJICBpbiBxdWVzdGlvbiwgTVVDSCBuaWNlci4KLSB4cGx1c3RhYnMoKSwgeHB0KCk6CgktIFJlbW92ZWQgcmVkdW5kYW50IGluY3JlbWVudCBvZiB0YWJzIHdoZW4gY29sbHVtbiBubyAlIDggPT0gMC4KCS0gQWRkZWQgY2hlY2sgZm9yIGRhdGFbaV0gPCAzMiwgbW9zdCBvZiBzdWNoIGJpdHMgYXJlIDIgY2hhcnMgd2lkZS4KLSB1cGRhdGVfbGluZSgpOgoJLSBGaXhlZCBhIHN0dXBpZCBjYWxsIHRvIHN0cmxlbnB0IHdpdGggY29sIHdoZW4gd2Ugc2hvdWxkIGhhdmUKCSAgYmVlbiB1c2luZyBhY3R1YWxfY29sLiAgVWdoLgoKbmFuby0wLjguOSAtIDAzLzIyLzIwMDAKLSBuYW5vLmM6CiAgZW1wdHlfbGluZSgpLCBub19zcGFjZXMoKSwganVzdGlmeV9mb3JtYXQoKSwgZG9fanVzdGlmeSgpOgoJCUFjdHVhbGx5IGFkZGVkIHRoZXNlIChzY3Jld3VwIGFwcGx5aW5nIHBhdGNoKS4KICBkb19qdXN0aWZ5KCk6CUFkZGVkIGNhbGwgdG8gc2V0X21vZGlmaWVkKCkuCgpuYW5vLTAuOC44IC0gMDMvMTIvMjAwMAotIFByZWxpbWluYXJ5IGludGVybmF0aW9uYWxpemF0aW9uIHN1cHBvcnQuICBNYW55IG1hbnkgZnVuY3Rpb25zIG1vZGlmaWVkCiAgdG8gdXNlIGdldHRleHQgKHZpYSBfKCkgbWFjcm8pLiAgZXMucG8gZmlsZSBpbmNsdWRlZC4gKEpvcmRpIE1hbGxhY2gpCiAgTmV3IGRpcnMgcG8vIGFuZCBpbnRsLywgY2hhbmdlcyB0byBjb25maWd1cmUuaW4gYW5kIEF1dG9tYWtlLmFtIHRvCiAgc3VwcG9ydCBpMThuLgotIG5hbm8uYzoKICBpbmNsdWRlczoJRGRkZWQgc3lzL3BhcmFtLmggYW5kIGxpbWl0cy5oLiAoQWRhbSBSb2dveXNraSkuCiAgc3RhdGljczogCUNoYW5nZWQgc29tZSB0aGluZ3MgdGhhdCB3ZXJlIG5vdCBuZWNlc3NhcmlseSBzdGF0aWMgCgkJKEFkYW0gUm9nb3lza2kpLgogIG5yZWFsbG9jKCk6CU5ldyBmdW5jdGlvbiwgc2ltaWxhciB0byBubWFsbG9jKCkuICBDaGFuZ2VkIGNhbGxzIGZyb20KCQlyZWFsbG9jKCkgdG8gbnJlYWxsb2MgKEFkYW0gUm9nb3lza2kpLgogIGVtcHR5X2xpbmUoKSwgbm9fc3BhY2VzKCksIGp1c3RpZnlfZm9ybWF0KCksIGRvX2p1c3RpZnkoKToKCQlOZXcgZnVuY3Rpb25zIGZvciBqdXN0aWZ5IGZ1bmN0aW9uIChBZGFtIFJvZ295c2tpKS4KLSB3aW5pby5jOgogIGJsYW5rX2VkaXQoKToJQWRkZWQgd3JlZnJlc2ggY2FsbCB0byBlZGl0IHNvIHRoYXQgc2NyZWVuIHVwZGF0ZXMgKGxpa2UKCQlvbiBeTCkgYWN0dWFsbHkgd29yay4KICB4cGx1c3RhYnMoKSwgeHB0KCksIHN0cmxlbnB0KCk6IEZpeGVkIG9mZi1ieS1vbmUgYnVnbGV0cyAoQWRhbSBSb2dveXNraSkuCgpuYW5vLTAuOC43IC0gMDMvMDEvMjAwMAotIG1haW4uYzoKICBkb193cmFwKCk6CUJldHRlciBmaXggZm9yIHNlZ2ZhdWx0cywgYW5kIGZpeCBmb3IgbGlzbmVzIGJlaW5nIHdyYXBwZWQgCgkJdG8gYSBzaW5nbGUgY2hhcmFjdGVyIG9uIG9uZSBsaW5lIHdoZW4gbm8gZ29vZCBwbGFjZSB0byAKCQlicmVhayB0aGUgbGluZSBleGlzdHMsIGFuZCBmb3Igd3JhcHBpbmcgbGluZXMgbG9uZ2VyIHRoYW4gQ09MUy4KLSBuYW5vLjEuaHRtbDoKCQlIdG1sIHZlcnNpb24gb2YgbWFuIHBhZ2UsIG5vdyBpbmNsdWRlZCBpbiBkaXN0LiAgRm9yCgkJdGhlIGJlbmVmaXQgb2YgbmFubyBwYWNrYWdlcyBpbiBMaW51eCBkaXN0cmlidXRpb25zLgoKbmFuby0wLjguNiAtIDAyLzI0LzIwMDAKLSBnb2JhbC5jOgogIHNob3J0Y3V0X2luaXQoKToKCQlBZGRlZCBzaG9ydGN1dHMgZm9yIGdvdG9fbGluZSBhbmQgZG9fcmVwbGFjZSB3aGVuIHVzaW5nCgkJcGljb19tc2dzLiAgT29wcy4KLSBuYW5vLmM6CiAgc3RhdGljczoJQ2hhbmdlZCBmaWxsIGJhY2sgdG8gMCBmcm9tIDcxIGJ5IGRlZmF1bHQgKEFkYW0gUm9nb3lza2kpLgogIGRvX3dyYXAoKToJQWRkZWQgY2hlY2sgZm9yIGJhY2tpbmcgdXAgcGFzdCB0YWJzLCB3aGljaCB3ZSBzaG91bGRudCBkby4KCQlSZW1vdmVkIGNoZWNrIGZvciBiYWNraW5nIHVwIHBhc3Qgc3BhY2VzIGZpcnN0LgogIG1haW4oKToJQWRkZWQgZm9yIGxvb3AgdG8gY2hlY2sgZm9yIGFsdCBrZXlzIGluc3RlYWQgb2YgaGFyZCBsaXN0LgogIGRvX2VudGVyKCk6CUZpeCBmb3IgYnVnICMxNCwgYWRkZWQgY2FsbCB0byByZXNldF9jdXJzb3IgYW5kIG1lc3NlZAoJCXVwIGRvX2NoYXIgcXVpdGUgYSBiaXQuCiAgdmVyc2lvbigpOglBZGRlZCB0aW1lIGFuZCBkYXRlIHN0YW1wIGZvciBjb21waWxlIG9uIHZlcnNpb24gbWVzc2FnZS4KCQlBZGRlZCBtYWlsIGFuZCB3ZWIgcGFnZSBpbmZvLgotIFJFQURNRToJVXBkYXRlZCBtYWlsaW5nIGxpc3QgaW5mby4KCm5hbm8tMC44LjUgLSAwMi8xOC8yMDAwCi0gbmFuby5jOgogIG1haW4oKToJRmluYWxseSBmaXhlZCB0aWxkZSBiZWluZyBpbnB1dCBvbiBwYWdlIHVwL2Rvd24ga2V5cyBpbgoJCWNlcnRhaW4gdGVybWluYWwgdHlwZXMuICBGaXggd2FzIGlucHV0IDI2LT45MS0+NVszNF0gY2hlY2sKCQlmb3IgMTI2LCBpZiBzbyBtYWtlIHRoZSBrYmlucHV0IFBBR0UgVVAvRE9XTiwgZWxzZSB1bmdldAoJCXRoZSBrZXlzdHJva2UgYW5kIGNvbnRpbnVlLiAgQWRkZWQgI2luY2x1ZGUgPGlvY3RsLmg+IGZvcgoJCWlvY3RsIGNhbGwuCiAgaGFuZGxlX2h1cCgpOgoJCUhhbmRsZXIgZm9yIGhhbmd1cCBzaWduYWwuICBCZWxhdGVkIGluY2x1ZGUgb2YgcGF0Y2ggZnJvbQoJCVRpbSBTaGVyd29vZC4KLSB3aW5pby5jOgogIGVkaXRfcmVmcmVzaCgpOgoJCVRlbXBvcmFyeSBmaXggZm9yIHNlbGVjdGluZyB0ZXh0IHdoZW4gdGVtcCA9PSBjdXJyZW50LgoJCWVkaXRfcmVmcmVzaCgpIGlzIG5vdyB1bm1hbmFnYWJseSBjb21wbGV4LCBhbmQgbXVzdCBiZQoJCXJldmFtcGVkLgogIGNoZWNrX3N0YXRibGFuaygpOgoJCUFkZGVkIGNoZWNrIGZvciBjb25zdHVwZGF0ZSwgbWFrZXMgdGhpbmdzIGxlc3MgY2hvcHB5CgkJKEFkYW0gUm9nb3lza2kpCgpuYW5vLTAuOC40IC0gMDIvMTEvMjAwMAotIE1vdmVkIGdsb2JhbCB2YXJpYWJsZXMgdGhhdCB3ZXJlIG9ubHkgKG9yIG1vc3RseSkgdXNlZCBpbiBvbmUgZmlsZSBpbnRvCiAgaXRzIHByb3BlciBmaWxlIGFzIGEgc3RhdGljLiAgQWZmZWN0cyBjdXQuYywgbmFuby5jLCBnbG9iYWwuYyAoQW5keSBLYWhuKS4KLSBnbG9iYWwuYzoJCiAgc2hvcnRjdXRfaW5pdCgpOgoJCVJlbW92ZWQgcmVkdW5kYW50IE5BTk9fQ09OVFJPTF9IIGZyb20gYmFja3NwYWNlIHNob3J0Y3V0LAoJCWFkZGVkIGNoYXIgMTI3IHdoaWNoIHNob3VsZCBoYXZlIGJlZW4gdGhlcmUuCi0gbmFuby5jOgogIG1haW4oKToJRml4IGZvciBsb29wcyBsb29waW5nIHVudGlsIE1BSU5fTEVOLCBhZGRlZCAtMSB0byBzdG9wCgkJc2VnZmF1bHRzIChBZGFtIFJvZ295c2tpKS4KLSBNYWtlZmlsZS5hbToJQWRkZWQgYWxsIHNvdXJjZSBmaWxlbmFtZXMgKEFkYW0gUm9nb3lza2kpLgotIG5hbm8uMToJRml4ZWQgbWFpbCBhZGRyZXNzZWQgYW5kIGFkZGVkIG1haWxpbmcgbGlzdCBhZGRyZXNzLgotIFJFQURNRToJVXBkYXRlZCBteSBlbWFpbCBhZGRyZXNzIGFuZCB0aGUgbmFubyB3ZWIgcGFnZS4KCm5hbm8tMC44LjMgLSAwMi8wOC8yMDAwCi0gTmV3IHBpY28gbW9kZSAoLXAsIC0tcGljbyksIHRvZ2dsZXMgKG1vcmUpIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUKICBQaWNvIG1lc3NhZ2VzIGRpc3BsYXllZCBpbiB0aGUgc2hvcnRjdXQgbGlzdC4gIE5vdGUgdGhhdCB0aGVyZSBhcmUgc3RpbGwKICBzbWFsbCBkaWZmZXJlbmNlcyBpbiB0aGlzIG1vZGUuCi0gbmFuby5oOglOZXcgc2hvcnRjdXQgc3RydWN0IGZvcm1hdCwgZm9yIHRoZSBiZW5lZml0IG9mIGkxOG4gYW5kCgkJb3VyIGhlbHAgbWVudS4gIFJlbW92ZWQgc2hvcnRjdXQgbWVzc2FnZSBtYWNyb3MsIHRoZXkgYXJlCgkJbm93IGFsbCBpbiBzaG9ydGN1dF9pbml0IGluIGdsb2JhbC5jLgotIG5hbm8uYzoKICBkb193cmFwKCk6CVJlbW92ZWQgcmVzZXR0aW5nIG9mIGN1cnJlbnRfeCB3aGVuIHdlIGFyZSBpbiBmYWN0CgkJd3JhcHBpbmcgdG8gdGhlIG5leHQgbGluZSwgZml4ZXMgYSBidWcgaW4gLWkgbW9kZS4KICBkb19lbnRlcigpOgoJCVJld3JvdGUgdGhlIGF1dG9pbmRlbnQgbW9kZSBjb2RlIHRvIGJlIGEgbG90IGxlc3MgcHJldHR5LAoJCWJ1dCBhIGxvdCBtb3JlIG1hZ2ljYWwuCiAgbWFpbigpOgoJCVJlbW92ZWQgY2FzZSBmb3IgaWdub3JpbmcgY2hhciAxMjYgKH4pLiAgVGhhdCdzIGtpbmQgb2YKCQlpbXBvcnRhbnQsIHdlJ2xsIGhhdmUgdG8gZml4IGhhbmRsaW5nIHRoYXQgc2VxdWVuY2Ugd2hlbgoJCXBhZ2VpbmcgdXAvZG93biBvbiBhIHRlcm1pbmFsIHNvbWUgb3RoZXIgd2F5Li4uIFJldmFtcGVkCgkJbWFpbiBzd2l0Y2ggbG9vcCBpbiBtdWNoIHNuYXp6aWVyIGZhc2hpb24gYmFzZWQgb24gdGhlCgkJc2hvcnRjdXQgbGlzdC4KLSB3aW5pby5jOgoJCU5ldyBmdW5jdGlvbiBkaXNwbGF5X21haW5fbGlzdC4gIEFmZmVjdHMgYWxsIGZ1bmN0aW9ucwoJCXRoYXQgdXNlZCB0byBjYWxsIGJvdHRvbWJhcnMoKSB3aXRoIG1haW5fbGlzdC4gIEFkZGVkCgkJYmVjYXVzZSB3ZSBub3cgb25seSBjYWxsIGJvdHRvbWJhcnMgd2l0aCB0aGUgbWFjcm8KCQlNQUlOX1ZJU0lCTEUgaW5zdGVhZCBvZiBNQUlOX0xJU1RfTEVOLCBiZWNhdXNlIG9mIHRoZQoJCWNoYW5nZXMgdG8gdGhlIG1haW5fbGlzdCBzaG9ydGN1dCBsaXN0IChzZWUgZ2xvYmFsLmMgYmVsb3cpLgoJCU5ldyBmdW5jdGlvbiBkb19oZWxwLCBvdXIgcHJlbGltaW5hcnkgZHluYW1pYyBoZWxwIHN5c3RlbS4KLSBNYW55IG1hbnkgZnVuY3M6CgkJQ2hhbmdlZCBmcm9tIGludCB0byB2b2lkIHRvIGFsbG93IG9uZSB1bmlmb3JtIHR5cGUgdG8gY2FsbAoJCWZyb20gdGhlIHNob3J0Y3V0IHN0cnVjdC4gIEFsc28gYSBmZXcgZnVuY3Rpb25zIHRoYXQgZG8KCQlub3Qgc2ltcGxlIGhhdmUgdm9pZCBhcmd1bWVudCBoYXZlIG5ldyBmdW5jdGlvbnMgY2FsbGVkCgkJZnVuY25hbWVfdm9pZCh2b2lkKSB0byBiZSBjYWxsZWQgZnJvbSB0aGUgc2hvcnRjdXQgbGlzdC4KCQlkb19jdXRfdGV4dCBhbmQgZG9fdW5jdXRfdGV4dCB3ZXJlIGNoYW5nZWQgdG8gdm9pZAoJCWFyZ3VtZW50cyBiZWNhdXNlIHRoZXkgd2VyZSBuZXZlciBjYWxsZWQgd2l0aCBhIGZpbGVzdHJ1Y3QKCQlvdGhlciB0aGFuICpjdXJyZW50IGFueXdheS4KLSBnbG9iYWwuYzoKCQlTaG9ydGN1dCBsaXN0IG1haW5fbGlzdCB3YXMgZXhwYW5kZWQgdG8gY292ZXIgYWxsCgkJc2hvcnRjdXRzIHRoYXQgY291bGQgYmUgY2F1Z2h0IGluIHRoZSBtYWluIGxvb3AuCgkJQ29uc2VxdWVudGx5IHRoZXJlIGlzIGEgbmV3IG1hY3JvIE1BSU5fVklTSUJMRSB3aGljaCB0ZWxscwoJCWhvdyBtYW55IGl0ZW1zIGluIHRoZSBtYWluIGxpc3QgdG8gYWN0dWFsbHkgc2hvdy4KCm5hbm8tMC44LjIgLSAwMi8wMi8yMDAwCi0gQWRkZWQgaW5pdGlhbCBtb3VzZSAoLW0sIC0tbW91c2UpIHN1cHBvcnQuICBOZXcgZ2xvYmFsIHZhcmlhYmxlCiAgdXNlX21vdXNlLiAoQWRhbSBSb2dveXNraSkKCi0gbmFuby5jOglTZXQgaW50aWFsIHZhbHVlIG9mIGZpbGwgdG8gQ09MUyAtIDggcmF0aGVyIHRoYW4ganVzdCA3MgoJCXJlZ2FyZGxlc3MuIChBZGFtIFJvZ295c2tpKS4KICBkb19kZWxldGUoKToJCgkJRGVsZXRlZCBjYWxsIHRvIGRvX2JhY2tzcGFjZSgpIHdoZW4gb24gdGhlIGVuZCBvZiBhIGxpbmUsCgkJYmVjYXVzZSBpdCB3b24ndCB1cGRhdGUgdGhlIGxpbmUgcHJvcGVybHkuCiAgZG9fYmFja3NwYWNlKCk6CgkJUmVtb3ZlZCB1bm5lY2Vzc2FyeSBwb2ludGVyIG1hbmlwdWxhdGlvbiB0aGF0IHdhcyBiZWluZwoJCWhhbmRsZWQgYnkgdW5saW5rX25vZGUoKS4KICBvcGVuX2ZpbGUoKToKCQlBZGRlZCBjaGVjayBmb3IgdHJ5aW5nIHRvIG9wZW4gYSBkaXJlY3RvcnkgKGN1cnJlbnRseSB3ZQoJCXNlZ2ZhdWx0IG9uIHRoaXMpLiAgQnVnIHBvaW50ZWQgb3V0IGJ5IENoYWQgWmljY2FyZGkuCgpuYW5vLTAuOC4xIC0gMDEvMjgvMjAwMAotIEltcGxlbWVudGVkIFBpY28ncyAtciAoZmlsbCkgbW9kZSwgY29tbWFuZCBsaW5lIGZsYWcgLXIgb3IgLS1maWxsLiAgTmV3CiAgZ2xvYmFsIHZhcmlhYmxlIGZpbGwsIGFmZmVjdHMgY2hlY2tfd3JhcCgpLCBkb193cmFwKCksIG1haW4oKSwgdXNhZ2UoKSwKICBnbG9iYWwuYyBhbmQgcHJvdG8uaC4KLSBuYW5vLmM6CndyaXRlX2ZpbGUoKToJCUFkZGVkIChpbmNyZWRpYmx5KSBuZWNlc3NhcnkgY2hlY2sgZm9yIEVQRVJNIHdoZW4KCQkJbGluaygpIGZhaWxzLiAgVGhpcyBhbGxvd3MgdXMgdG8gYWN0dWFsbHkgc2F2ZQoJCQlmaWxlcyB2aWEgcmVuYW1lKCkgb24gZmlsZXN5c3RlbXMgdGhhdCBkb250CgkJCXN1cHBvcnQgaGFyZCBsaW5rcyAoQUlFRUVFRUUpLgpkb19nb3RvKCk6CgkJCUZpeGVkIGEgc3R1cGlkIG1pc3Rha2Ugd2hlcmUgd2Ugd2VyZSBjYWxsaW5nCgkJCWJvdHRvbWJhcnMoKSB3aXRoIHJlcGxhY2VfbGlzdCBpbnN0ZWFkIG9mIGdvdG9fbGlzdC4KLSBuYW5vLmg6CgkJCU5ldyBjaGFyICpoZWxwIGluIHNob3J0Y3V0IHN0cnVjdHVyZSBmb3IgaGVscAoJCQlmZWF0dXJlLiBBZGRlZCBOQU5PXypfTVNHIGFuZCBOQU5PXypfSEVMUCAjZGVpZm5lcwoJCQlmb3IgaGVscCBmdW5jdGlvbiBhbmQgaTE4bi4KLSBnbG9iYWwuYzoKCQkJTmV3IGZ1bmN0aW9ucyBzaG9ydGN1dF9pbml0IChjYWxsZWQgaW4gbmFuby5jKSBhbmQKCQkJc2NfaW5pdF9vbmUoKSB0byBpbml0aWFsaXplIHRoZSBzaG9ydGN1dHMgd2l0aG91dAoJCQl1c2luZyB7fXMgKGZvciBpMThuKS4KCm5hbm8tMC44LjAgLSAwMS8yNS8yMDAwCi0gVmlldyBmbGFnICgtdiwgLS12aWV3KSBpbXBsZW1lbnRlZC4gIEdsb2JhbCB2YXJpYWJsZSB2aWV3X21vZGUsIGFmZmVjdHMKICBtYWluIGxvb3Agb2YgbmFuby5jIGFuZCBuZXdfZmlsZSgpLiAobWUpCi0gbmFuby5jOgoJCQlzcGxpdCBjaGVja3MgZm9yIFRFUk1JT1NfSCBhbmQgVEVSTUlPX0ggdXAgc28gd2UKCQkJY2FuICh0aGVvcmV0aWNhbGx5KSBpbmNsdWRlIHRoZW0gYm90aCwgd2hpY2ggaXMgZ29vZC4KaGFuZGxlX3NpZ3dpbmNoKCk6CgkJCUFkZGVkIGNoZWNrIGZvciBuY3Vyc2VzLmguICAoQW5keSBLYWhuKQpkb19zcGVsbCgpOgoJCQlXZSBub3cgb25seSB0cnkgaXNwZWxsIGJlY2F1c2Ugd2UgZG9uJ3QgYXMgb2YgeWV0CgkJCWhhbmRsZSB0aGUgJ3NwZWxsJyBwcm9ncmFtIHRoZSByaWdodCB3YXksIG5vdyB0aGF0CgkJCUkgZmluYWxseSBrbm93IHdoYXQgdGhlIHJpZ2h0IHdheSBpcyA9LSkuICBBZGRlZAoJCQljYWxsIHRvIGVkaXRfdXBkYXRlKGZpbGVhZ2UpIHRvIHN0b3Agc2VnZmF1bHRzLgpnbG9iYWxfaW5pdCgpOgoJCQlBZGRlZCBpbml0aWFsaXphdGlvbiBvZiBlZGl0KiBmaWxlc3RydWN0IHBvaW50ZXJzCgkJCXRvIHN0b3Agc2VnZmF1bHRzIG9uIHNwZWxsIGNoZWNrLgp1c2FnZSgpOgoJCQlDaGVjayBmb3IgZ2V0b3B0X2xvbmcsIGFuZCBpZiBubyBsZWF2ZSBvdXQgdGhlCgkJCUdOVSBvcHRpb25zIGV2ZXJ5b25lIHNlZW1zIHRvIGxvdmUgc28gbXVjaCAoQW5keSBLYWhuKQptYWluKCk6CgkJCUFkZGVkIGNoZWNrcyBmb3IgZ2V0b3B0X2xvbmcgKEFuZHkgS2FobikKCQkJV2UgaWdub3JlIGNoYXJhY3RlciAxMjYgYmVjYXVzZSBpdCBnZXRzIHB1dCBpbnRvCgkJCXRoZSBidWZmZXIgd2hlbiB3ZSBwYWdlIHVwL2Rvd24gb24gYSB2dCB0ZXJtaW5hbC4Kd3JpdGVfZmlsZSgpOgoJCQlGaXhlcyBmb3IgdW1hc2sgKEFkYW0gUm9nb3lza2kpLiAgUmVuYW1lZCB0bXBmaWxlCgkJCXZhcmlhYmxlIHRvIHRtcC4gIERvY3VtZW50ZWQgdGhlIHRtcCBvcHR0aW9uCgkJCWJldHRlciBpbiB0aGUgZnVuY3Rpb24gY29tbWVudHMuICBGaXhlZCBteSAKCQkJc3R1cGlkbHkgY29tbWVudGVkIG91dCBjaGVjayBmb3IgdG1wIG9uIHNldHRpbmcKCQkJdW1hc2sgd2hpY2ggSSByZWFsbHkgbGlrZSA9PgotIG5hbm8uaDoKCQkJTWFkZSBkZXNjIHZhcmlhYmxlIGluIHNob3J0Y3V0IHN0cnVjdCBhIHBvaW50ZXIKCQkJaW5zdGVhZCBvZiBhIGZpeGVkLWxlbmd0aCBzdHJpbmcuCi0gdXRpbHMuYzoKCQkJRml4ZWQgY2hlY2sgZm9yIGNvbmZpZy5oIGJlZm9yZSBuYW5vLmguCi0gY29uZmlndXJlLmluOgoJCQlOZXcgY2hlY2tzIGZvciBnZXRvcHRfbG9uZywgZ2V0b3B0LmgsIHJlbW92ZWQKCQkJQ0ZMQUdTIGFuZCBMREZMQUdTIGNoYW5nZXMuICBHb25uYSBoYXZlIHRvIHJ1bgoJCQlzdHJpcCBtYW51YWxseSBub3cgPS0pIChBbmR5IEthaG4pCgkJCUFkZGVkIGNoZWNrIGZvciBIQVZFX1dSRVNJWkUsIG5ldyBmaWxlIGFjY29uZmlnLmggKG1lKS4KCm5hbm8tMC43LjkgLSAwMS8yNC8yMDAwCi0gTmV3IGF1dG9pbmRlbnQgZmVhdHVyZS4gIENvbW1hbmQgZmxhZyAnaScgb3IgJy0tYXV0b2luZGVudCcuICBOZXcKICBmdW5jdGlvbiBkb19jaGFyKCkgdG8gY2xlYW4gdXAgY2hhcmFjdGVyIG91dHB1dCwgZ2xvYmFsCiAgdmFyaWFibGUgYXV0b2luZGVudCBpbiBnbG9iYWwuYy4gKEdyYWhhbSBNYWlud2FyaW5nKQotIE5ldyBmbGFnICd0JyBvciAnLS10ZW1wZmlsZScsIGxpa2UgUGljbydzIC10IG1vZGUsIGF1dG9tYXRpY2FsbHkgc2F2ZXMKICBmaWxlcyBvbiBleGl0IHdpdGhvdXQgcHJvbXB0aW5nLiAgQWZmZWN0cyBkb193cml0ZW91dCgpLiAgQWxzbwogIGRvX3dyaXRlb3V0KCkgbm93IHRha2VzIGEgcGFyYW1ldGVyIGZvciBpZiBleGl0aW5nLgogIEdsb2JhbCB2YXJpYWJsZSB0ZW1wX29wdCBpbiBnbG9iYWwuYyAoR3JhaGFtIE1haW53YXJpbmcpCi0gUHJlbGltaW5hcnkgc3BlbGwgcHJvZ3JhbSBzdXBwb3J0LiAgQWRkZWQgY29tbWFuZCBmbGFnICctcycgb3IKICAnLS1zcGVsbGVyJyBmb3IgYWx0ZXJuYXRpdmUgc3BlbGxlciBjb21tYW5kLiAgQWRkZWQgZnVuY3Rpb24gZG9fc3BlbGwoKQogIGFuZCBleGl0X3NwZWxsKCkgdG8gbmFuby5jLiAgTmV3IGdsb2JhbCB2YXJpYWJsZSBhbHRfc3BlbGxlci4KLSBuYW5vLmM6CiAgbWFpbigpOglXZSBub3cgaWdub3JlIGlucHV0IG9mIGRlY2ltYWwgNDEwIGJlY2F1c2UgdGhlc2UgZ2V0IGVudGVyZWQgCgkJd2hlbiB3ZSByZXNpemUgdGhlIHNjcmVlbi4gIFNvcnRlZCBvcHRpb25zIGluIGdldG9wdCgpCgkJc3dpdGNoIHN0YXRlbWVudC4KICB1c2FnZSgpOglTb3J0ZWQgb3B0aW9ucyBhbmQgY2hhbmdlZCB0YWJzIHRvIG1ha2Ugcm9vbSBmb3IgLXMgb3B0aW9uLgogIHdyaXRlX2ZpbGUoKToJTm93IHRha2VzIGEgc2Vjb25kIHBhcmFtZXRlciAndG1wZmlsZScsIHVzZXMgbWFzayAwNjAwIGFuZAoJCWRvZXNuJ3QgcHJpbnQgdGhlIG51bWJlciBvZiBsaW5lcyB3cml0dGVuIG9uIHRoZSBzdGF0dXNiYXIuCiAgZ2xvYmFsX2luaXQoKToKCQlBZGRlZCBtb3JlIGluaXRpYWxpemF0aW9ucyB0byBnbG9iYWxzIHRvIHN1cHBvcnQgZG9fc3BlbGwoKS4KCm5hbm8tMC43LjggLSAwMS8yMy8yMDAwCi0gU3R1YmJlZCBqdXN0aWZ5IGZ1bmN0aW9uLiAgQWZmZWN0cyBtYWluKCkgaW4gbmFuby5jIGFuZCBuYW5vLmggZGVmaW5lcy4KLSBBZGRlZCBGa2V5IGVxdWl2YWxlbnRzIGZvciBQaWNvIGNvbXBhdGliaWx0eS4gIEFmZmVjdHMgbmFuby5oIGRlZmluZXMKICBhbmQgbWFpbigpIGluIG5hbm8uYwotIFJlbW92ZWQgcmVkdW5kYW50IHJlc2V0X2N1cnNvcigpIGNhbGxzIGZyb20gdGhlIGJsYW5rKCkgcm91dGluZXMuCi0gbmFuby5jOgogIG1haW4oKToJRml4ZWQgdHlwbyBpbiBtYWluIHdoaWxlIGxvb3AgZm9yIE5BTk9fQUxUX1JFUExBQ0VfS0VZLgoJCVJlbW92ZWQgY2hlY2sgZm9yIGlzcHJpbnQoKSBjaGFyYWN0ZXJzIGluIG1haW4gd2hpbGUgbG9vcAoJCWZvciBwZW9wbGUgd2l0aCBvZGQgY2hhcmFjdGVyIHNldHMgKnNocnVnKi4gIEFkZGVkIHNvbWUgWAoJCXdpbmRvdyBGLWtleSBjb21ib3MuCiAgcmVhZF9saW5lKCk6CU5ldyBmdW5jdGlvbiwgY29uc29saWRhdGVzIG9mIG1vc3Qgb2YgdGhlIHNwZWNpYWwKCQlzZWN0aW9ucyBvZiB0aGUgZmlsZSByZWFkaW5nIGNvZGUuIChSb2IgU2llbWJvcnNraSkKICBkb19yZXBsYWNlKCk6IE1hbnkgc2NhdHRlcmVkIGZpeGVzLiAoUm9iIFNpZW1ib3Jza2kpCiAgd3JpdGVfZmlsZSgpOglBZGRlZCBjaGVjayBmb3IgZW1wdHkgZmlsZW5hbWUuCi0gd2luaW8uYzoKICBuYW5vZ2V0c3RyKCk6CUZpeGVzIGZvciBkZWxldGluZyBhdCBwbGFjZXMgb3RoZXIgdGhhbiB0aGUgZW5kIG9mIHRoZQoJCWJ1ZmZlciwgY3V0IHN1cHBvcnQuIChBZGFtIFJvZ295c2tpKQogIGJsYW5rX2VkaXQoKToJTmV3IGZ1bmN0aW9uLCBibGFua3MgZWRpdCBidWZmZXIuICBBZGRlZCBjYWxsIHRvIGl0IGluIAoJCXRvdGFsX3JlZnJlc2goKS4KLSBjb25maWd1cmU6CUNoZWNrcyBmb3IgZ2xpYiBpZiBzbnByaW50ZiBvZiB2c25wcmludGYgYXJlbid0IGF2YWlsYWJsZQoJCShBbmR5IEthaG4pLiBDaGFuZ2VkIHdhcm5pbmcgbWVzc2FnZSB3aGVuIG5vIHRlcm1jYXAgbGliCgkJaXMgZm91bmQuCgpuYW5vLTAuNy43IC0gMDEvMTkvMjAwMAotIE9wdGlvbiAnLXYnIGZvciB2ZXJzaW9uIG1vdmVkIHRvICctVicsIGJlY2F1c2UgLXYgaXMgUGljbydzICJyZWFkIG9ubHkiCiAgbW9kZSAoYWZmZWN0cyBnZXRvcHQoKSBpbiBtYWluKCkgYW5kIHVzYWdlKCkgZnVuY3Rpb24gaW4gbmFuby5jCi0gTmV3IGZsYWcgLWMsIGFsd2F5cyBzaG93IGN1cnNvciBwb3NpdGlvbi4gIEFmZmVjdHMgbWFpbigpIGluIG5hbm8uYyBhbmQKICBzdGF0dXNiYXIoKSBpbiB3aW5pby5jCi0gT3B0aW9uICcteCcgZG9lc24ndCBzaG93IGhlbHAgd2luZG93IGF0IHRoZSBib3R0b20gb2YgdGhlIGVkaXRvci4KICBOZXcgdmFyaWFibGUgbm9faGVscCBpbiBuYW5vLmggYW5kIHByb3RvLmgsIGFmZmVjdHMgbWFpbigpLCB1c2FnZSgpLAogIGFuZCBnbG9iYWxfaW5pdCgpIGluIG5hbm8uYywgYmxhbmtfYm90dG9tYmFycygpLCBjbGVhcl9ib3R0b213aW4oKSwKICBib3R0b21iYXJzKCksIGFuZCBkb195ZXNubygpICBpbiB3aW5pby5jICAoSSBoYWQgdG8gYXBwbHkgdGhpcyBwYXRjaCBieQogIGhhbmQgPVApIChBZGFtIFJvZ295c2tpKQotIG5hbm8uYzoKICBoYW5kbGVfc2lnd2luY2goKToJTmV3IGZ1bmN0aW9uIChBZGFtIFJvZ295c2tpKSwgaGFuZGxlcyByZXNpemluZy4KICBwYWdlX3VwKCksIHBhZ2VfZG93bigpOgkKCS0gTmV3IGZ1bmN0aW9ucy4gIFdlIG5vdyBzZXQgdGhlIGN1cnNvciBhdCB0aGUgdG9wIHJpZ2h0IGNvcm5lciwKCSAgbm90IGF0IHRoZSBjZW50ZXIgbGluZSwgYW5kIHBhZ2UgdXAgYW5kIGRvd24gYSBmdWxsIHNjcmVlbgoJICByYXRoZXIgdGhhbiBhIGhhbGYgc2NyZWVuLiBPcmlnaW5hbCBmdW5jdGlvbnMgcmVuYW1lZCB0bwoJICBwYWdlX3VwX2NlbnRlcigpIGFuZCBwYWdlX2Rvd25fY2VudGVyKCkuCiAgbWFpbigpOiAKCS0gQWRkZWQgY2hlY2sgZm9yIGtleXN0cm9rZSBrZXkgc2VxdWVuY2UgNDA3IG9yIE5BTk9fQ09OVFJPTF9aCgkgIGluIG1haW4gd2hpbGUgbG9vcCBiZWNhdXNlIHN1c3BlbmQgbW9kZSB3YXMgYnJva2VuLiAgVGhpcyBzaG91bGQKCSAgZml4IGl0LCBhdCBsZWFzdCBmb3Igbm93LgoJLSBBZGRlZCBsb25nIG9wdGlvbiBzdXBwb3J0IChCeSBwb3B1bGFyIGhhcmFzc21lbnQgOy0pIC0gQWRkZWQKCSAgI2luY2x1ZGUgZm9yIGdldG9wdC5oLCBjaGFuZ2VkIGdldG9wdCgpIHRvIGdldG9wdF9sb25nKCkuCgkgIE9wdGlvbnMgYWRkZWQgc28gZmFyOiAtLXZlcnNpb24gKC1WKSwgLS1ub3dyYXAgKC13KSwgLS1zdXNwZW5kCgkgICgteiksIC0taGVscCAoLWgpLCAtLW5vaGVscCAoLXgpLgoJLSBSZXdyb3RlIHNpZ25hbCBzdGF0ZW1lbnRzIChBZGFtIFJvZ295c2tpKQoKbmFubyAwLjcuNiAtIDAxLzE1LzIwMDAKLSBOZXcgQ2hhbmdlTG9nIGZvcm1hdAotIG5hbm8uYzogCiAgbWFpbigpOiAJQm91bmQgQ09OVFJPTF9IIHRvIGJhY2tzcGFjZSAob29wcykKCQlBZGRlZCBtb3JlIEFsdC1bLWtleSBjb21iaW5hdGlvbnMsIGZvciBwYWdlIHVwICYgZG93bi4KICByZWFkX2J5dGVzKCk6CU5ldyBmdW5jdGlvbiAoQWRhbSBSb2dveXNraSkKICByZWFkX2ZpbGUoKToJT3B0aW1pemF0aW9ucyAtIG1hbGxvYygpcyAqYnVmIGEgbGl0dGxlIGF0IGEgdGltZSByYXRoZXIKCQl0aGFuIG9uZSBodWdlIGJ1ZmZlciwgYW5kIHJlcGxhY2VkIHRoZSBzdHJjYXQgYXQgdGhlIGVuZAoJCXdpdGggYW4gaW5kZXggdmFyaWFibGUuICBBZGRlZCBjYWxsIHRvIHJlYWRfYnl0ZXMoKS4KICBkb19uZXh0X3dvcmQoKTogTmV3IGZ1bmN0aW9uLCBiaW5kaW5nIGlzIGNvbnRyb2wtc3BhY2UgKDApIChtZSkKCi0gd2luaW8uYzogCiAgYm90dG9tYmFycygpOglGaXhlZCBub24tZXhwYW5kaW5nIHNob3J0Y3V0IGtleXMgYXQgYm90dG9tIG9mIHNjcmVlbi4KCQkoZm9ybXVsYSBpcyBleHRyYSBzcGFjZSBuZWVkZWQgPSBDT0xTIC8gNiAtIDEzKS4KICBhY3R1YWxfeCgpICYgc3RybGVucHQoKToJCgkJQWRkZWQgYnVnIzkgZml4IC0gd2hlbiB0YWJzICUgOCA9PSAwLCB3ZSBzaG91bGQgb25seQoJCWluY3JlbWVudCB0YWJzIGJ5IDEuCiAgdGl0bGViYXIoKToJRml4ZWQgb3ZlcnJ1biBpbiB0aXRsZWJhciBvbiB2ZXJ5IGxvbmcgZmlsZW5hbWVzLgoKMC43LjUJUGljbyAnbGFzdCBsaW5lJyBmZWF0dXJlIGFkZGVkIChSb2IgU2llbWJvcnNraSAmIG1lKS4gIEVsaW1pbmF0ZWQKCXdyaXRpbmcgYSBuZXdsaW5lIGF0IEVPRi4gZG9fY3Vyc29ycG9zIGFuZCBkb19yZXBsYWNlIGFyZSBub3cgbm90CglkaXJlY3RseSBib3VuZCB0byBzaWduYWxzIGJ1dCBwaWNrZWQgdXAgYXMgdGhlaXIgY29udHJvbCBzZXF1ZW5jZXMKCWluIHJhdyBtb2RlLiBCdWcgZml4IGluIGRvX2JhY2tzcGFjZS4gRml4ZWQgYnVnICM5ICh3b29ob28hKQowLjcuNAlPcHRpbWl6ZWQgKG9iZnVzY2F0ZWQ/KSBlZGl0X3JlZnJlc2guIE1hbGxvYygpIGNhbGxzIGNoZWNrZWQgZm9yCglhdmFpbGFibGUgbWVtb3J5LCBhbGlnbiBidWcgZml4ZWQgKEJpZyBHYXV0ZSkuCgotLS0gQXMgb2YgdmVyc2lvbiAwLjcuNCBUSVAgaXMgcmVuYW1lZCB0byBuYW5vLgoKMC43LjMJRml4ZWQgYSBkb3VibGUgYmxhbmtfc3RhdHVzYmFyKCkgd2hlbiBqdW1waW5nIHRvIGZpcnN0IGFuZCBsYXN0CglsaW5lcy4gIFRvb2sgb3V0IHVubmVjZXNzYXJ5IHVwZGF0ZXMgaW4gbG9hZF9maWxlLiBCdWcgZml4IGluCglkb19sZWZ0LiBNaXNzaW5nIHVwZGF0ZXMgdG8gdG90bGluZXMsIGZpeGVkIGJ1ZyAjNyAobGFzdCBsaW5lIG5vdAoJaGF2aW5nIGEgbmV3bGluZSBhdCB0aGUgZW5kIGRvZXNudCBnZXQgcmVhZCwgYnVnZml4IGluIGRvX3JlcGxhY2UKCXdpdGggcmVwbGFjZSBhbGwsIG1vcmUvYmV0dGVyIGNvbW1lbnRzIChSb2JlcnQgU2llbWJvcnNraSkKMC43LjIJT3VyIGZpcnN0IHBhdGNoIGFjY2VwdGVkIGludG8gdGhlIHNvdXJjZSEgY29uZmlndXJlIGZpeGVzIAoJYW5kIG9wdGltaXphdGlvbnMgKEVyaWsgQW5kZXJzb24pLiAgQWRkZWQgbWlzc2luZyBzdGRhcmcuaCB0byB3aW5pby5jLiAKCUJ1ZyBmaXggaW4gdXBkYXRlX2xpbmUgZm9yIGVkaXRpbmcgbG9uZyBsaW5lcy4gRml4ZWQgYXJndW1lbnRzCgliZWluZyBwdXQgaW50byB0aGUgZmlsZW5hbWUgd2hlbiBub25lIGlzIHNwZWNpZmllZC4gUHJlbGltaW5hcnkKCStsaW5lIGNvbW1hbmQgYXJndW1lbnQgZnVuY3Rpb24uCjAuNy4xCWNvbmZpZ3VyZSB0d2VhayBmb3IgYmV0dGVyIEZyZWVCU0Qgc3VwcG9ydC4gUmVtb3ZlZCByZWZyZXNoKCkgZnJvbQoJZWRpdF9yZWZyZXNoIHRvIHN0b3AgY3Vyc29yICJqdW1waW5nIiBkdXJpbmcgc2NyZWVuIHVwZGF0ZXMuICBUaGlzCgl3aWxsIHByb2JhYmx5IGNhdXNlIGEgYnVnIG9yIHR3by4gUmVwbGFjZSBpcyBub3cgQWx0LVIgKEBSKSBhbmQgCglHb3RvIGxpbmUgaXMgQWx0LUcgKEBHKSwgYnV0IHRoZXkgaGF2ZSBjb250cm9sIGtleSBhbGlhc2VzIG9mIF5cIGFuZCAKCV5fIHJlc3BlY3RpdmVseS4gIE1hZGUgQ29udHJvbC1GLEIsTixQIHdvcmsgbGlrZSB0aGV5IGRvIGluIFBpY28uCglDb250cm9sLUcgd2lsbCBiZWNvbWUgdGhlIEhlbHAga2V5LCBidXQgZm9yIG5vdyBpcyBzdHViYmVkIG91dC4KMC43LjAJRml4ZWQgbWlzc2luZyBzdGRsaWIuaCBmcm9tIGN1dC5jLiBGaXhlZCBhIGZldyBtZXNzYWdlIGJ1Z3MgaW4KCWZpbmRuZXh0c3RyLiBCb3VuZCBDb250cm9sLUQgdG8gRGVsZXRlLiBSZWZpeGVkIHNlZ2ZhdWx0IG9uIHplcm8KCWxlbmd0aCBmaWxlLiBBZGRlZCBFc2MtWy1BLEIsQyxEIGN1cnNvciBrZXkgc2VxdWVuY2VzLgowLjYuOQlQcmVsaW1pbmFyeSBjdXJzb3IgcG9zaXRpb24gZnVuY3Rpb24uIFNwbGl0IHVwIHRpcC5jIG1vcmUsIG1hZGUKCW5ldyBmaWxlcyBjdXQuYyBhbmQgd2luaW8uYy4gRml4ZWQgYSBidWcgaW4gY3V0X21hcmtlZF9zZWdtZW50Cgl0aGF0IHdhcyBsZWF2aW5nIG91dCBhIGNoYXJhY3Rlci4KMC42LjgJQnkgcmVxdWVzdCwgb3B0Y2hyIGluIG1haW4oKSBpcyBub3cgYW4gaW50LiAgUmVtb3ZlZCB1bm5lZWRlZAoJZ2xvYmFscy4gQm91bmQgZnVuY3Rpb25zIGZvciBuZXh0L3ByZXYgcGFnZSwgYW5kIHdyb3RlIGZ1bmN0aW9ucwoJZG9faG9tZSBhbmQgZG9fZW5kLgowLjYuNwlCdWdmaXggaW4gZG9fdW5jdXRfdGV4dCBmb3IgdG90bGluZXMuIEJyb2tlIHVwIG9wZW5fZmlsZSBhbmQKCWNyZWF0ZWQgcmVhZF9maWxlLiAgSW1wbGVtZW50ZWQgSW5zZXJ0IEZpbGUuIEZpeGVzIGluIHRpcGdldHN0cgoJZm9yIGVycm9uZW91cyBrZXlzdHJva2VzLiBBZGRlZCBsZWF2ZV9jdXJzb3IgYXJnIHRvIGRvX3llc25vKCkuCjAuNi42CUZpeGVzIGluIGRvX3NlYXJjaCgpLCBkb19yZXBsYWNlKCksIGRvX3dyaXRlb3V0LCBhbmQgZG9fZXhpdCgpIGZvciAKCWFib3J0ZWQgc2VhcmNoZXMgYW5kIG1vcmUgUGljby1jb21wYXRpYmxlIG1lc3NhZ2VzLiBzdGF0dXNxKCkgbm93CglyZXR1cm5zIC0yIG9uIGEgYmxhbmsgZW50cnkgaW5zdGVhZCBvZiAtMS4gQnVnIGZpeCBpbiBhY3R1YWxfeCgpLgowLjYuNQlNb3JlIEJTRCBjb21wYXRpYmlsaXR5LiAgRml4ZWQgdHdvIGJ1Z3MgaW4gZG9fdW5jdXRfdGV4dAoJcmVnYXJkaW5nIGJ1ZmZlcnMgd2l0aCBmaWxlYm90IGluIHRoZW0uICBGaXhpbnMgaW4gZG9fYmFja3NwYWNlCglhbmQgZG9fZW50ZXIuIFJlbW92ZWQgdW51c2VkIHZhcmlhYmxlcy4gUmVtb3ZlZCBzdHJpcF9uZXdsaW5lLgowLjYuNAlUb29rIG91dCB0aGUgYXdmdWwgbmV3bGluZXMgZnJvbSBlYWNoIHN0cmluZyBidWZmZXJzLiAgVGhpcyB3aWxsCgljZXJ0YWlubHkgY2F1c2UgbW9yZSBidWdzLiBGaXhlcyBpbiBkb19leGl0KCkuIEJldHRlciBlbXB0eSBmaWxlCgloYW5kbGluZyAoSSBob3BlKS4KMC42LjMJSW1wbGVtZW50ZWQgXkUuICBSZW1vdmVkIG5vdyB1bm5lZWRlZCB3cmFwbGluZSBmcm9tIGZpbGVzdHJ1Y3QuCglkb19lbnRlcigpIHJld3JpdHRlbi4KMC42LjIJQmV0dGVyIGRlZmF1bHQgZmlsZSBwZXJtaXNzaW9ucy4gQ29tcGxldGUgcmV3cml0ZSBvZiBkb193cmFwKCkuCglCZXR0ZXIgaGFuZGxpbmcgb2YgZWRpdGluZyB3aXRoIGN1cnNvciBuZWFyIENPTFMgLSAxLgowLjYuMQlTdGFydGluZyB0byBpbXBsZW1lbnQgd3JhcHBpbmcgdG9nZ2xlLiBGaXggZm9yIHVuaGFuZGxlZCBjb250cm9sCgljb2RlcyBiZWluZyBlbnRlcmVkIGludG8gdGhlIGJ1ZmZlci4gQnVnIGZpeCBpbiBhY3R1YWxfeDsgbW9yZQoJPiBDT0xTIC0gMSBmdW5jdGlvbmFsaXR5LCBlc3BlY2lhbGx5IG9uIGxpbmVzIHdpdGggVEFCcy4gIEZpeGVkIGJlaW5nIAoJbG9ja2VkIGludG8gY3V0YnVmZmVyIHdoZW4gY3V0dGluZyBtb3JlIHRoYW4gb25lIG1hcmtlZCBzY3JlZW4gb2YgdGV4dC4KMC42LjAJV2UgaGF2ZSBUQUJzISEhICBUbyBkbyB0aGlzLCBwbGFjZXdld2FudCBpcyBub3cgc2V0IHRvIHRoZSBhY3R1YWwKCXdpZHRoIG9uIHRoZSBzY3JlZW4gd2Ugd2FudCB0byBiZSwgbm90IGFuIGluZGV4IG9mIGN1cnJlbnQtPmRhdGEuCglOZXcgZnVuY3Rpb25zIHhwbHVzdGFicyBhbmQgYWN0dWFsX3ggY29udmVydCB0aGUgYWN0dWFsIHBsYWNlCgl0aGUgY3Vyc29yIHNob3VsZCBiZSBvbiB0aGUgc2NyZWVuIHRvIGFuZCBmcm9tIHRoZSBwbGFjZSBpbiB0aGUKCXN0cmluZy4KMC41LjUJQ2hhbmdlZCBkb19yaWdodCB0byB0ZXN0IGRvX2Rvd24gYmVmb3JlIHNldHRpbmcgY3VycmVudF94IHRvIDAsCgllbGltaW5pYXRpbmcgdGhlICJsb29waW5nIiBvbiB0aGUgbGFzdCBsaW5lIHdoZW4gaG9sZGluZyB0aGUgcmlnaHQKCWFycm93LiAgUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgbG9uZ2VyIHRoYW4gQ09MUyAtIDEgbGluZXMuCglXcm90ZSBkb19kZWxldGUuCjAuNS40CUZpeGVkIGEgYmlnIGluIHRvdGFsX3VwZGF0ZSB0aGF0IHdhc24ndCByZXBhaW50aW5nIHRoZSBzY3JlZW4gcHJvcGVybHkuCgl0aXBnZXRzdHIgaXMgbXVjaCBtb3JlIG1lc3N5IGJ1dCB0ZXh0IGlzIG5vdyBtb3JlIGVkaXRhYmxlIDspCglGaXhlZCBjcmFzaCBvbiBlbnRlcmluZyBhIG5ldyBmaWxlLCBob3BlZnVsbHkuIEF3ZnVsIHN0dWIgZm9yIHRhYgoJaGFuZGxpbmcsIG9ubHkgaW4gZG9fcmlnaHQoKSB0byBzYXZlIG1lIHNvbWUgc2FuaXR5LgowLjUuMwlBZGRlZCBjaGVjayBmb3IgbWFsbG9jLmguICBJbXBsZW1lbnRpbmcgdW5jdXQgZnJvbSBtYXJrZXIgc2xvd2x5LgoJRml4ZWQgYSBmZXcgYnVncyBpbiBkb191bmN1dCB3aGVuIG5vdCB1bmN1dHRpbmcgZnJvbSBtYXJrZWQgdGV4dC4KICAgICAgICBJIHdvdWxkIG5vdCB0cnVzdCB5b3VyIGRhdGEgd2l0aCB0aGUgbWFyayBjb2RlIHJpZ2h0IG5vdywgYnV0IHRoZW4KICAgICAgICB3ZSdyZSBub3QgYXQgdmVyc2lvbiAxLjAgeWV0IHNvIGRvbnQgdHJ1c3QgYW55dGhpbmcgOykKMC41LjIJQWRkZWQgcmVzZXRfY3Vyc29yKCkgYmVmb3JlIGVuZCBvZiB1cGRhdGVfbGluZSBzbyBjdXJzb3IgZG9lc250CglqdW1wIGFmdGVyIGVhY2gga2V5c3Ryb2tlIGVudGVyZWQuIFNlbGVjdCB0ZXh0IHN0dWJiZWQuIEZpeGVkCglhIGJ1ZyBpbiB0b3RhbF9yZWZyZXNoKCkuICBTZXR0aW5nIGEgbWFyayB3aWxsIGhpbGlnaHQgcHJvcGVybHksCglidXQgZG9lcyBub3QgYWN0dWFsbHkgYWZmZWN0IHdoYXQgZ2V0cyBwdXQgaW4gdGhlIGN1dGJ1ZmZlciAoeWV0KS4KMC41LjEJV3JpdGluZyBhIGZpbGUgb3V0IGNhdXNlcyBtb2RpZmllZCB0byBiZSBzZXQgYmFjayB0byAwLiAgR29vZC4KCVNldF9tb2RpZmllZCBmdW5jdGlvbiB3cml0dGVuLiAgQ3V0IGFuZCB1bmN1dCB0ZXh0IG5vdyBzZXQKCW1vZGlmaWVkIHdoZW4gY2FsbGVkLgowLjUuMAlIYWxmIHdheSB0aGVyZSEgIEltcGxlbWVudGVkIHdyaXRlIG91dCwgc2F2ZSBmdW5jdGlvbiBzZWVtcwoJc3RhYmxlLiAgQ2hhbmdlZCBzdGF0dXNiYXIgYmxhbmsgcm91dGluZyB0byBub3QgcmVmcmVzaCwgYSBzZXBhcnRlCglwcm9ncmFtIGNhbGxzIGl0IGFuZCB0aGVuIHJlZnJlc2hlcy4gIE1hZGUgdGhlIHByb2dyYW0gbm90IGNsZWFyCgl0aGUgc3JjZWVuIG9uIGV4aXQsIGp1c3QgdGhlIGJvdHRvbSB0d28gbGluZXMgKGxpa2UgUGljbykuCjAuNC4yCUltcGxlbWVudGVkIHJlcGxhY2UgYWxsIGluIHJlcGxhY2UgZnVuY3Rpb24uICBDcnVkZSBleGl0IGZ1bmN0aW9uCgkoYXNrcyB5ZXMgb3Igbm8gaWYgbW9kaWZpZWQgYnV0IGRvZXMgbm90IHdyaXRlIHRvIGZpbGUpLgowLjQuMQlJbXBsZW1lbnRpbmcgc2VhcmNoICYgcmVwbGFjZS4gIEZpeGVkIGNyYXNoIG9uIGRlbGV0aW5nIGF0IHRvcCBvZgoJZWRpdCBidWZmZXIuICBJbXBsZW1lbnRlZCAidGltZW91dCIgb2Ygc3RhdHVzYmFyIG1lc3NhZ2VzLgoJSW1wbGVtZW50ZWQgXkEgYW5kIF5FIChiZWdpbm5pbmcgYW5kIGVuZCBvZiBsaW5lKS4KMC40LjAJU3BsaXQgY29kZSBpbnRvIGdsb2JhbC5jIGFuZCBwcm90by5oIHRvIGFsbG93IGZvciBiZXR0ZXIgbXVsdGlwbGUKCWZpbGUgaGFuZGxpbmcuICBBZGRlZCAjZGVmaW5lcyBmb3IgdGhlIG1ham9yaXR5IG9mIHRoZSBzaG9ydGN1dAoJa2V0cyBpbiB0aXAuaCBmb3IgZWFzeSBtb2RpZmljYXRpb24uIAowLjMuMQlXcml0ZSBlZGl0X3JlZnJlc2ggd2hpY2ggZG9lc24ndCBtb3ZlIHRoZSBzY3JlZW4gYXJvdW5kLCBqdXN0Cgl1cGRhdGVzIHdoYXQncyB0aGVyZSBhbHJlYWR5LiAgZG9fd3JhcCgpIGFuZCBkb19lbnRlcigpIGFkZGVkLgowLjMuMAlQcmVsaW1pbmFyeSBjdXRidWZmZXIgKGN1dCBhbmQgdW5jdXQpIHN1cHBvcnQuCjAuMi43ICAgQ2hlY2sgZm9yIE1vZGlmaWNhdGlvbiBhZGRlZC4gIGRvX3NlYXJjaCgpIHdvcmtzLgowLjIuNQlSZXdyaXRlIG9mIGZpbGUgZGF0YSBzdHJ1Y3QuCjAuMglSZWFkIGluIGRhdGEgdG8gYnVmZmVyLCBib3VuZCBrZXlzdHJva2VzIHRvIHN0dWIgZnVuY3Rpb25zLCAKCWluaXRpYWwgY3Vyc29yIG1vdmVtZW50IG9uIHNjcmVlbi4gIEluaXRpYWwgYXV0b2NvbmYgc3VwcG9ydC4KMC4xCUluaXRpYWwgcHJvZ3JhbSBzZXR1cCB3L25jdXJzZXMKCiRJZCQK