VGhpcyBpcyB0aGUgVk1TIHBvcnQgb2YgR05VIE1ha2UgZG9uZSBieSBIYXJ0bXV0LkJlY2tlckBjb21wYXEuY29tLgoKSXQgaXMgYmFzZWQgb24gdGhlIHNwZWNpZmljIHZlcnNpb24gMy43N2sgYW5kIG9uIDMuNzguMS4gMy43N2sgd2FzIGRvbmUKYnkgS2xhdXMgS+RtcGYgPGtrYWVtcGZAcm1pLmRlPiwgdGhlIGNvZGUgd2FzIGJhc2VkIG9uIHRoZSBWTVMgcG9ydCBvZgpHTlUgTWFrZSAzLjYwIGJ5IE1pa2UgTW9yZXR0aS4KCkl0IHdhcyBwb3J0ZWQgb24gT3BlblZNUy9BbHBoYSBWNy4xLCBERUNDIFY1LjctMDA2LiBJdCB3YXMgcmUtYnVpbGQgYW5kCnRlc3RlZCBvbiBPcGVuVk1TL0FscGhhIFY3LjIsIE9wZW5WTVMvVkFYIDcuMSBhbmQgNS41LTIuIERpZmZlcmVudAp2ZXJzaW9ucyBvZiBERUNDIHdlcmUgdXNlZC4gVkFYQyB3YXMgdHJpZWQ6IGl0IGZhaWxzOyBidXQgaXQgZG9lc24ndApzZWVtIHdvcnRoIHRvIGdldCBpdCB3b3JraW5nLiBUaGVyZSBhcmUgc3RpbGwgc29tZSBQVFJNSVNNQVRDSCB3YXJuaW5ncwpkdXJpbmcgdGhlIGNvbXBpbGUuIEFsdGhvdWdoIHBlcmwgaXMgd29ya2luZyBvbiBWTVMgdGhlIHRlc3Qgc2NyaXB0cwpkb24ndCB3b3JrLiBUaGUgZnVuY3Rpb24gJHNoZWxsIGlzIHN0aWxsIG1pc3NpbmcuCgpUaGVyZSBpcyBhIGtub3duIGJ1ZyBpbiBzb21lIG9mIHRoZSBWTVMgQ1JUTHMuIEl0IGlzIGluIHRoZSBzaGlwcGVkCnZlcnNpb25zIG9mIFZNUyBWNy4yIGFuZCBWNy4yLTEgYW5kIGluIHRoZSBjdXJyZW50bHkgKE9jdG9iZXIgMTk5OSkKYXZhaWxhYmxlIEVDT3MgZm9yIFZNUyBWNy4xIGFuZCBuZXdlciB2ZXJzaW9ucy4gSXQgaXMgZml4ZWQgaW4gdmVyc2lvbnMKc2hpcHBlZCB3aXRoIG5ld2VyIFZNUyB2ZXJzaW9ucyBhbmQgYWxsIEVDTyBraXRzIGFmdGVyIE9jdG9iZXIgMTk5OS4gSXQKb25seSBzaG93cyB1cCBkdXJpbmcgdGhlIGRheWxpZ2h0IHNhdmluZyB0aW1lIHBlcmlvZCAoRFNUKTogc3RhdCgpCnJldHVybnMgYSBtb2RpZmljYXRpb24gdGltZSAxIGhvdXIgYWhlYWQuIFRoaXMgcmVzdWx0cyBpbiBHTlUgbWFrZQp3YXJuaW5nIG1lc3NhZ2VzLiBGb3IgYSBqdXN0IGNyZWF0ZWQgc291cmNlIHlvdSB3aWxsIHNlZToKCiAkIGdtYWtlIHguZXhlCiBnbWFrZS5leGU7MTogKioqIFdhcm5pbmc6IEZpbGUgYHguYycgaGFzIG1vZGlmaWNhdGlvbiB0aW1lIGluIHRoZSBmdXR1cmUgKDk0MDU4Mjg2MyA+IDk0MDU3OTI2OSkKIGNjICAgIC9vYmo9eC5vYmogeC5jCiBsaW5rICB4Lm9iaiAgICAvZXhlPXguZXhlCiBnbWFrZS5leGU7MTogKioqIFdhcm5pbmc6ICBDbG9jayBza2V3IGRldGVjdGVkLiAgWW91ciBidWlsZCBtYXkgYmUgaW5jb21wbGV0ZS4KCgpOZXcgaW4gMy43OC4xOgoKRml4IGEgcHJvYmxlbSB3aXRoIGF1dG9tYXRpY2FsbHkgcmVtYWtpbmcgbWFrZWZpbGVzLiBHTlUgbWFrZSB1c2VzIGFuCmV4ZWN2ZSB0byByZXN0YXJ0IGl0c2VsZiBhZnRlciBhIHN1Y2Nlc3NmdWwgcmVtYWtlIG9mIHRoZSBtYWtlZmlsZS4gT24KVU5JWCBzeXN0ZW1zIGV4ZWN2ZSByZXBsYWNlcyB0aGUgcnVubmluZyBwcm9ncmFtIHdpdGggYSBuZXcgb25lIGFuZApyZXNldHMgYWxsIHNpZ25hbCBoYW5kbGluZyB0byB0aGUgZGVmYXVsdC4gT24gVk1TIGV4ZWN2ZSBjcmVhdGVzIGEgY2hpbGQKcHJvY2Vzcywgc2lnbmFsIGFuZCBleGl0IGhhbmRsZXJzIG9mIHRoZSBwYXJlbnQgYXJlIHN0aWxsIGFjdGl2ZSwgYW5kLAp1bmZvcnR1bmF0ZWx5LCBjb3JydXB0IHRoZSBleGl0IGNvZGUgZnJvbSB0aGUgY2hpbGQuIEZpeCBpbiBqb2IuYzoKaWdub3JlIFNJR0NITEQuCgpBZGRlZCBzb21lIHN3aXRjaGVzIHRvIHJlZmxlY3QgbGF0ZXN0IGZlYXR1cmVzIG9mIERFQ0MuIE1vZGlmaWNhdGlvbnMgaW4KbWFrZWZpbGUudm1zLgoKU2V0IHNvbWUgZGVmaW5pdGlvbnMgdG8gcmVmbGVjdCBsYXRlc3QgZmVhdHVyZXMgb2YgREVDQy4gTW9kaWZpY2F0aW9ucyBpbgpjb25maWcuaC12bXMgKHdoaWNoIGlzIGNvcGllZCB0byBjb25maWcuaCkuCgpBZGRlZCBleHRlcm4gc3RyY21waSBkZWNsYXJhdGlvbiB0byBhdm9pZCAnaW1wbGljaXRseSBkZWNsYXJlZCcgbWVzc2FnZXMuCk1vZGlmaWNhdGlvbiBpbiBtYWtlLmguCgpEZWZhdWx0IHJ1bGUgZm9yIEMrKywgY29uZGl0aW9uYWxzIGZvciBnY2MgKEdDQ19JU19OQVRJVkUpIG9yIERFQy9EaWdpdGFsLwpDb21wYXEgYy9jKysgY29tcGlsZXJzLiBNb2RpZmljYXRpb25zIGluIGRlZmF1bHQuYy4KClVzYWdlIG9mIG9wZW5kaXIoKSBhbmQgZnJpZW5kcywgc3VwcHJlc3MgZmlsZSB2ZXJzaW9uLiBNb2RpZmljYXRpb25zIGluIGRpci5jLgoKQWRkZWQgVk1TIHNwZWNpZmljIGNvZGUgdG8gaGFuZGxlIGN0cmwrYyBhbmQgY3RybCt5IHRvIGFib3J0IG1ha2UuCk1vZGlmaWNhdGlvbnMgaW4gam9iLmMuCgpBZGRlZCBzdXBwb3J0IHRvIGhhdmUgY2FzZSBzZW5zaXRpdmUgdGFyZ2V0cyBhbmQgZGVwZW5kZW5jaWVzIGJ1dCB0bwpzdGlsbCB1c2UgY2FzZSBibGluZCBmaWxlIG5hbWVzLiBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGZvciBKYXZhCm1ha2VmaWxlcyBvbiBWTVM6CgoJLlNVRkZJWEVTIDoKCS5TVUZGSVhFUyA6CS5jbGFzcyAuamF2YQoJLmphdmEuY2xhc3MgOgoJCWphdmFjICIkPAoJSGVsbG9Xb3JsZC5jbGFzcyA6ICAgICAgSGVsbG9Xb3JsZC5qYXZhCgpBIG5ldyBtYWNybyBXQU5UX0NBU0VfU0VOU0lUSVZFX1RBUkdFVFMgaW4gY29uZmlnLmgtdm1zIHdhcyBpbnRyb2R1Y2VkLgpJdCBuZWVkcyB0byBiZSBlbmFibGVkIHRvIGdldCB0aGlzIGZlYXR1cmU7IGRlZmF1bHQgaXMgZGlzYWJsZWQuICBUaGUKbWFjcm8gSEFWRV9DQVNFX0lOU0VOU0lUSVZFX0ZTIG11c3Qgbm90IGJlIHRvdWNoZWQ6IGl0IGlzIHN0aWxsIGVuYWJsZWQuCk1vZGlmaWNhdGlvbnMgaW4gZmlsZS5jIGFuZCBjb25maWcuaC12bXMuCgpCb290c3RyYXAgbWFrZSB0byBzdGFydCBidWlsZGluZyBtYWtlIGlzIHN0aWxsIG1ha2VmaWxlLmNvbSwgYnV0IG1ha2UKbmVlZHMgdG8gYmUgcmUtbWFkZSB3aXRoIGEgbWFrZSB0byBtYWtlIGEgY29ycmVjdCB2ZXJzaW9uOiBpZ25vcmUgYWxsCnBvc3NpYmxlIHdhcm5pbmdzLCBkZWxldGUgYWxsIG9iamVjdHMsIHJlbmFtZSBtYWtlLmV4ZSB0byBhIGRpZmZlcmVudApuYW1lIGFuZCBydW4gaXQuCgpNYWRlIHNvbWUgbWlub3IgbW9kaWZpY2F0aW9ucyB0byB0aGUgYm9vdHN0cmFwIGJ1aWxkIG1ha2VmaWxlLmNvbS4KDApUaGlzIGlzIHRoZSBWTVMgcG9ydCBvZiBHTlUgTWFrZS4KCkl0IGlzIGJhc2VkIG9uIHRoZSBWTVMgcG9ydCBvZiBHTlUgTWFrZSAzLjYwIGJ5IE1pa2UgTW9yZXR0aS4KClRoaXMgcG9ydCB3YXMgZG9uZSBieSBLbGF1cyBL5G1wZiA8a2thZW1wZkBybWkuZGU+CgpUaGVyZSBpcyBmaXJzdC1sZXZlbCBzdXBwb3J0IGF2YWlsYWJsZSBmcm9tIHByb0dJUyBTb2Z0d2FyZSwgR2VybWFueS4KVmlzaXQgdGhlaXIgd2ViLXNpdGUgYXQgaHR0cDovL3d3dy5wcm9naXMuZGUgdG8gZ2V0IGluZm9ybWF0aW9uCmFib3V0IG90aGVyIHZtcyBzb2Z0d2FyZSBhbmQgZm9ydGhjb21pbmcgdXBkYXRlcyB0byBnbnUgbWFrZS4KCk5ldyBmb3IgMy43NzoKCi9iaW4vc2ggc3R5bGUgSS9PIHJlZGlyZWN0aW9uIGlzIHN1cHBvcnRlZC4gWW91IGNhbiBub3cgd3JpdGUgbGluZXMgbGlrZQoJbWNyIHN5cyRkaXNrOltdcHJvZ3JhbS5leGUgPCBpbnB1dC50eHQgPiBvdXRwdXQudHh0ICY+IGVycm9yLnR4dAoKTWFrZWZpbGUgdmFyaWFibGVzIGFyZSBsb29rZWQgdXAgaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuIFlvdSBjYW4gc2V0CnN5bWJvbHMgb3IgbG9naWNhbHMgaW4gRENMIGFuZCBldmFsdWF0ZSB0aGVtIGluIHRoZSBNYWtlZmlsZSB2aWEKJCg8bmFtZS1vZi1zeW1ib2wtb3ItbG9naWNhbD4pLiAgVmFyaWFibGVzIGRlZmluZWQgaW4gdGhlIE1ha2VmaWxlCm92ZXJyaWRlIFZNUyBzeW1ib2xzL2xvZ2ljYWxzICEKCkZ1bmN0aW9ucyBmb3IgZmlsZSBuYW1lcyBhcmUgd29ya2luZyBub3cuIFNlZSB0aGUgR05VIE1ha2UgbWFudWFsIGZvcgokKGRpciAuLi4pICBhbmQgJCh3aWxkY2FyZCAuLi4pLiAgVW5peC1zdHlsZSBhbmQgVk1TLXN0eWxlIG5hbWVzIGFyZQpzdXBwb3J0ZWQgYXMgYXJndW1lbnRzLgoKVGhlIGRlZmF1bHQgcnVsZXMgYXJlIHNldCB1cCBmb3IgR05VIEMuIEJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZnJvbSBhCnNpbmdsZSBzb3VyY2UgZmlsZSBpcyBhcyBlYXN5IGFzICdtYWtlIGZpbGUuZXhlJy4KClRoZSB2YXJpYWJsZSAkKEFSQ0gpIGlzIHByZWRlZmluZWQgYXMgQUxQSEEgb3IgVkFYIHJlc3AuIE1ha2VmaWxlcyBmb3IKZGlmZmVyZW50IFZNUyBzeXN0ZW1zIGNhbiBub3cgYmUgd3JpdHRlbiBieSBjaGVja2luZyAkKEFSQ0gpIGFzIGluCiAgaWZlcSAoJChBUkNIKSxBTFBIQSkKICAgICQoRUNITykgIk9uIHRoZSBBbHBoYSIKICBlbHNlCiAgICAkKEVDSE8pICJPbiB0aGUgVkFYIgogIGVuZGlmCgpDb21tYW5kIGxpbmVzIG9mIGV4Y2Vzc2l2ZSBsZW5ndGggYXJlIGNvcnJlY3RseSBicm9rZW4gYW5kIHdyaXR0ZW4gdG8gYQpiYXRjaCBmaWxlIGluIHN5cyRzY3JhdGNoIGZvciBsYXRlciBleGVjdXRpb24uIFRoZXJlJ3Mgbm8gbGltaXQgdG8gdGhlCmxlbmd0aHMgb2YgY29tbWFuZHMgKGFuZCBubyBuZWVkIGZvciAub3B0IGZpbGVzIDotKSBhbnkgbW9yZS4KCkVtcHR5IGNvbW1hbmRzIGFyZSBoYW5kbGVkIGNvcnJlY3RseSBhbmQgZG9uJ3QgZW5kIGluIGEgbmV3IERDTCBwcm9jZXNzLgoKCk5ldyBmb3IgMy43NjoKCkpvaG4gVy4gRWF0b24gaGFzIHVwZGF0ZWQgdGhlIFZNUyBwb3J0IHRvIHN1cHBvcnQgbGlicmFyaWVzIGFuZCBWUEFUSC4KCgpUbyBidWlsZCBNYWtlLCBzaW1wbHkgdHlwZSBAbWFrZWZpbGUuICBUaGlzIHNob3VsZCBjb21waWxlIGFsbCB0aGUKbmVjZXNzYXJ5IGZpbGVzIGFuZCBsaW5rIE1ha2UuICBUaGVyZSBpcyBhbHNvIGEgZmlsZSBjYWxsZWQKbWFrZWZpbGUudm1zLiAgSWYgeW91IGFscmVhZHkgaGF2ZSBHTlUgTWFrZSBidWlsdCB5b3UgY2FuIGp1c3QgdXNlCk1ha2Ugd2l0aCB0aGlzIG1ha2VmaWxlIHRvIHJlYnVpbGQuCgpIZXJlIGFyZSBzb21lIG5vdGVzIGFib3V0IEdOVSBNYWtlIGZvciBWTVM6CgpUaGUgY2QgY29tbWFuZCBpcyBzdXBwb3J0ZWQgaWYgaXQncyBjYWxsZWQgYXMgJChDRCkuIFRoaXMgaW52b2tlcwp0aGUgJ2J1aWx0aW5fY2QnIGNvbW1hbmQgd2hpY2ggY2hhbmdlcyB0aGUgZGlyZWN0b3J5LgpDYWxsaW5nICdzZXQgZGVmJyBkb2Vzbid0IGRvIHRoZSB0cmljaywgc2luY2UgYSBzdWItc2hlbGwgaXMKc3Bhd25lZCBmb3IgdGhpcyBjb21tYW5kLCB0aGUgZGlyZWN0b3J5IGlzIGNoYW5nZWQgKmluIHRoaXMgc3ViLXNoZWxsKgphbmQgdGhlIHN1Yi1zaGVsbCBlbmRzLgoKTGlicmFyaWVzIGFyZSBub3Qgc3VwcG9ydGVkLiBUaGV5IHdlcmUgaW4gR05VIE1ha2UgMy42MCBidXQgc29tZWhvdyBJCmRpZG4ndCBjYXJlIHBvcnRpbmcgdGhlIGNvZGUuIElmIHRoZXJlIGlzIGVub3VnaCBpbnRlcmVzdCwgSSdsbCBkbyBpdCBhdApzb21lIGxhdGVyIHRpbWUuCgpUaGUgdmFyaWFibGUgJF4gc2VwYXJhdGVzIGZpbGVzIHdpdGggY29tbWFzIGluc3RlYWQgb2Ygc3BhY2VzIChJdCdzIHRoZQpuYXR1cmFsIHRoaW5nIHRvIGRvIGZvciBWTVMpLgoKU2VlIGRlZmF1bHRzLmMgZm9yIFZNUyBkZWZhdWx0IHN1ZmZpeGVzIGFuZCBteSBkZWZpbml0aW9ucyBmb3IgZGVmYXVsdApydWxlcyBhbmQgdmFyaWFibGVzLgoKVGhlIHNoZWxsIGZ1bmN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuCgpMb2FkIGF2ZXJhZ2Ugcm91dGluZXMgaGF2ZW4ndCBiZWVuIGltcGxlbWVudGVkIGZvciBWTVMgeWV0LgoKVGhlIGRlZmF1bHQgaW5jbHVkZSBkaXJlY3RvcnkgZm9yIGluY2x1ZGluZyBvdGhlciBtYWtlZmlsZXMgaXMKU1lTJFNZU1JPT1Q6W1NZU0xJQl0gKEkgZG9uJ3QgcmVtZW1iZXIgd2h5IEkgZGlkbid0IGp1c3QgdXNlClNZUyRMSUJSQVJZOiBpbnN0ZWFkOyBtYXliZSBpdCB3b3VsZG4ndCB3b3JrIHRoYXQgd2F5KS4KClRoZSBkZWZhdWx0IG1ha2VmaWxlcyBtYWtlIGxvb2tzIGZvciBhcmU6IG1ha2VmaWxlLnZtcywgZ251bWFrZWZpbGUsCm1ha2VmaWxlLiwgYW5kIGdudW1ha2VmaWxlLiAuCgpUaGUgc3RhdCgpIGZ1bmN0aW9uIGFuZCBoYW5kbGluZyBvZiB0aW1lIHN0YW1wcyBpbiBWTVMgaXMgYnJva2VuLCBzbyBJCnJlcGxhY2VkIGl0IHdpdGggYSBoYWNrIGluIHZtc2Z1bmN0aW9ucy5jLiBJIHdpbGwgcHJvdmlkZSBhIGZ1bGwgcmV3cml0ZQpzb21ld2hlcmUgaW4gdGhlIGZ1dHVyZS4gQmUgd2FybmVkLCB0aGUgdGltZSByZXNvbHV0aW9uIGluc2lkZSBtYWtlIGlzCmxlc3MgdGhhbiB3aGF0IHZtcyBwcm92aWRlcy4gVGhpcyBtaWdodCBiZSBhIHByb2JsZW0gb24gdGhlIGZhc3RlciBBbHBoYXMuCgpZb3UgY2FuIHVzZSBhIDogaW4gYSBmaWxlbmFtZSBvbmx5IGlmIHlvdSBwcmVjZWVkIGl0IHdpdGggYSBiYWNrc2xhc2ggKCdcJykuCkUuZy4tIGhvYmJlc1w6W2JvZ2FzLmZpbGVzXQoKTWFrZSBpZ25vcmVzIHN1Y2Nlc3MsIGluZm9ybWF0aW9uYWwsIG9yIHdhcm5pbmcgZXJyb3JzICgtUy0sIC1JLSwgb3IKLVctKS4gIEJ1dCBpdCB3aWxsIHN0b3Agb24gLUUtIGFuZCAtRi0gZXJyb3JzLiAodW5sZXNzIHlvdSBkbyBzb21ldGhpbmcKdG8gb3ZlcnJpZGUgdGhpcyBpbiB5b3VyIG1ha2VmaWxlLCBvciB3aGF0ZXZlcikuCgpSZW1vdGUgc3R1ZmYgaXNuJ3QgaW1wbGVtZW50ZWQgeWV0LgoKTXVsdGlwbGUgbGluZSBEQ0wgY29tbWFuZHMsIHN1Y2ggYXMgImlmIiBzdGF0ZW1lbnRzLCBtdXN0IGJlIHB1dCBpbnNpZGUKY29tbWFuZCBmaWxlcy4gIFlvdSBjYW4gcnVuIGEgY29tbWFuZCBmaWxlIGJ5IHVzaW5nIFxALgoKClZNUyBjaGFuZ2VzIG1hZGUgZm9yIDMuNzQuMwoKTG90cyBvZiBkZWZhdWx0IHNldHRpbmdzIGFyZSBhZGFwdGVkIGZvciBWTVMuIFNlZSBkZWZhdWx0LmMuCgpMb25nIGNvbW1hbmQgbGluZXMgYXJlIG5vdyBjb252ZXJ0ZWQgdG8gY29tbWFuZCBmaWxlcy4KCkNvbW1hICgnLCcpIGFzIGEgc2VwYXJhdG9yIGlzIG5vdyBhbGxvd2VkLiBTZWUgbWFrZWZpbGUudm1zIGZvciBhbiBleGFtcGxlLgo=