SnVuZSAyN3RoLCAyMDA1CnYxLjA1CiAgICAgIC0tIEFkZGVkIFRlY2hub3RlICM2IHdoaWNoIGNvdmVycyB0aGUgY3VycmVudCBQSyBjb21wbGlhbmNlLiAgCiAgICAgIC0tIEZpeGVkIGJ1ZmZlciBvdmVyZmxvdyBpbiBPQUVQIGRlY29kZXIKICAgICAgLS0gQWRkZWQgQ0hPSUNFIHRvIHRoZSBsaXN0IG9mIEFTTi4xIHR5cGVzCiAgICAgIC0tIEFkZGVkIFVUQ1RJTUUgdG8gdGhlIGxpc3Qgb2YgQVNOLjEgdHlwZXMKICAgICAgLS0gQWRkZWQgTVVURVggbG9ja3MgYXJvdW5kIGRlc2NyaXB0b3IgdGFibGUgZnVuY3Rpb25zIFtidXQgbm90IG9uIHRoZSBmdW5jdGlvbnMgdGhhdCBhcmUgZGVwZW5kZW50IG9uIHRoZW1dCiAgICAgICAgIEFsbCBmdW5jdGlvbnMgY2FsbCAqX2lzX3ZhbGlkKCkgYmVmb3JlIHVzaW5nIGEgZGVzY3JpcHRvciBpbmRleCB3aGljaCBtZWFucyB0aGUgcmVzcGVjdGl2ZSB0YWJsZSBtdXN0IGJlIHVubG9ja2VkIGJlZm9yZSAKICAgICAgICAgaXQgY2FuIGJlIGFjY2Vzc2VkLiAgSG93ZXZlciwgZHVyaW5nIHRoZSBvcGVyYXRpb24gW2UuZy4gQ0NNXSBpZiB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBhbHRlcmVkIHRoZSByZXN1bHRzIHdpbGwgYmUgCiAgICAgICAgIHVuZGVmaW5lZC4gIAogICAgICAtLSBNaW5vciB1cGRhdGVzIHRvIHRoZSBtYW51YWwgdG8gcmVmbGVjdCByZWNlbnQgY2hhbmdlcwogICAgICAtLSBBZGRlZCBhIGNhdGNoIHRvIGZvciBhbiBlcnJvciB0aGF0IHNob3VsZCBuZXZlciBjb21lIHVwIGluIHJzYV9leHB0bW9kKCkuICBKdXN0IGJlaW5nIHRob3JvdWdoLgoKSnVuZSAxNXRoLCAyMDA1CnYxLjA0CiAgICAgIC0tIEZpeGVkIG9mZiBieSBvbmUgW2JpdF0gZXJyb3IgaW4gZHNhX21ha2Vfa2V5KCkgaXQgd2FzIHRvbyBoaWdoIGJ5IG9uZSBiaXQgW25vdCBhIHNlY3VyaXR5IHByb2JsZW0ganVzdCBpbmNvbnNpc3RlbnRdCiAgICAgIC0tIEVDQy0yMjQgY3VydmUgd2FzIHdyb25nIFtpdCB3YXMgYW4gb2sgY3VydmUganVzdCBub3QgTklTVCwgc28gbm8gc2VjdXJpdHkgZmxhdyBqdXN0IGludGVyb3BlcmFiaWxpdHldLgogICAgICAtLSBSZW1vdmVkIHBvaW50IGNvbXByZXNzaW9uIHNpbmNlIGl0IHNsb3dzIGRvd24gRUNDIG9wcyB0byBzYXZlIGEgbWVhc2x5IGNvdXBsZSBieXRlcy4KICAgICAgICAgVGhpcyBtYWtlcyB0aGUgZWNjIGV4cG9ydCBmb3JtYXQgaW5jb21wYXRpYmxlIHdpdGggMS4wMyBbaXQgc2hvdWxkbid0IGNoYW5nZSBpbiB0aGUgZnV0dXJlXQogICAgICAtLSBSZW1vdmVkIEVDQy0xNjAgZnJvbSB0aW1pbmcgYW5kIGFkZGVkIHRoZSBvdGhlciBjdXJ2ZXMKCkp1bmUgOXRoLCAyMDA1CnYxLjAzCiAgICAgIC0tIFVzZXJzIG1heSB3YW50IHRvIG5vdGUgdGhhdCBvbiBhIFA0L0dDQzMuNCBwbGF0Zm9ybSAiLWZuby1yZWdtb3ZlIiBncmVhdGx5IGFjY2VsZXJhdGVzIHRoZSBjaXBoZXJzL2hhc2hlcy4KICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgLS0gTWFkZSBpdCBpbnN0YWxsIHRoZSB0ZXN0aW5nIGxpYnJhcnkgaW4gdGhlIGljYy9zdGF0aWMgbWFrZWZpbGVzCiAgICAgIC0tIEZvdW5kIGJ1ZyBpbiBjY21fbWVtb3J5LmMgd2hpY2ggd291bGQgZmFpbCB0byBjb21waWxlIHdoZW4gTFRDX0NMRUFOX1NUQUNLIHdhcyBlbmFibGVkCiAgICAgIC0tIFNpbW9uIEpvaG5zb24gcHJvcG9zZWQgSSBkbyBhIGZ1bGx5IGF1dG9tYXRlZCB0ZXN0IHN1aXRlLiAgSGVuY2UgInRlc3RtZS5zaCIgd2FzIGJvcm4KICAgICAgLS0gQWRkZWQgTFRDX05PX1RFU1Qgd2hpY2ggZm9yY2VzIHRlc3QgdmVjdG9ycyBvZmYgKHJlZ2FyZGxlc3Mgb2Ygd2hhdCB0b21jcnlwdF9jdXN0b20uaCBoYXMpCiAgICAgIC0tIEFkZGVkIExUQ19OT19UQUJMRVMgd2hpY2ggZGlzYWJsZXMgbGFyZ2UgdGFibGVzICh3aGVyZSBwb3NzaWJsZSwgcmVnYXJkbGVzcyBvZiB3aGF0IHRvbWNyeXB0X2N1c3RvbS5oIGhhcykKICAgICAgLS0gTmV3IHRlc3Qgc2NyaXB0IGZvdW5kIGEgYnVnIGluIHR3b2Zpc2guYyB3aGVuIFRBQkxFUyB3YXMgZGlzYWJsZWQuICBZZWFoIHRlc3RpbmchCiAgICAgIC0tIEFkZGVkIGEgTFRDX0ZBU1Qgc3BlY2lmaWMgdGVzdCB0byB0aGUgdGVzdGluZyBzb2Z0d2FyZS4KICAgICAgLS0gVXBkYXRlZCB0ZXN0IGRyaXZlciB0byBhY3R1YWxseSBoYWx0IG9uIGVycm9ycyBhbmQganVzdCBwcmludCB0aGVtIG91dCAodXNlZnVsIGZvciBzYXkuLi4gYXV0b21hdGVkIHRlc3RpbmcuLi4pCiAgICAgIC0tIEFkZGVkIGJvdW5kcyBjaGVja2luZyB0byBQZWxpY2FuIE1BQwogICAgICAtLSBBZGRlZCBCSVQgYW5kIE9DVEVUIFNUUklORyB0byB0aGUgQVNOLjEgc2lkZSBvZiB0aGluZ3MuICAKICAgICAgLS0gUGVra2EgUmlpa29uZW4gcG9pbnRlZCBvdXQgdGhhdCBteSBjdHJfc3RhcnQoKSBmdW5jdGlvbiBzaG91bGQgYWNjZXB0IHRoZSBjb3VudGVyIG1vZGUuIAogICAgICAtLSBDbGVhbmVkIHVwIHdhcm5pbmdzIGluIHRlc3Rwcm9mCiAgICAgIC0tIFJlbW92ZWQgcmVkdW5kYW50IG11IGFuZCBwb2ludCBtYXBwaW5nIGluIGVjY192ZXJpZnlfaGFzaCgpIHNvIGl0IHNob3VsZCBiZSBhIGJpdCBmYXN0ZXIgbm93CiAgICAgIC0tIFBla2thIHBvaW50ZWQgb3V0IHRoYXQgdGhlIEFFUyBrZXkgc3RydWN0dXJlIHdhcyB1c2luZyAzMiBieXRlcyBtb3JlIHRoYW4gaXQgb3VnaHQgdG8uCiAgICAgIC0tIEFkZGVkIHF1aWNrIGRlZmluZXMgdG8gcmVtb3ZlIGVudGlyZSBjbGFzc2VzIG9mIGFsZ29yaXRobXMuICBUaGlzIG1ha2VzIGl0IGVhc2llciBpZiB5b3Ugd2FudCB0byBidWlsZCB3aXRoIGp1c3QgCiAgICAgICAgIG9uZSBhbGdvcml0aG0gKHNheSBBRVMgb3IgU0hBLTI1NikuICBEZWZpbmVzIGFyZSBMVENfTk9fQ0lQSEVSUywgTFRDX05PX01PREVTLCBMVENfTk9fSEFTSEVTLCBMVENfTk9fTUFDUywKICAgICAgICAgTFRDX05PX1BSTkdTLCBMVENfTk9fUEssIExUQ19OT19QS0NTCiAgICAgIC0tIEFzIHBhcnQgb2YgdGhlIG1vdmUgZm9yIEVDQyB0byBYOS42MiBJJ3ZlIGNoYW5nZWQgdGhlIHNpZ25hdHVyZSBhbGdvcml0aG0gdG8gRUMgRFNBLiAgTm8gQVBJIGNoYW5nZXMuCiAgICAgIC0tIFBla2thIGhlbHBlZCBtZSBjbGVhbiB1cCB0aGUgUEtDUyAjMSB2Mi4xIFtPQUVQL1BTU10gY29kZQogICAgICAtLSBXcm90ZSBuZXcgREVSIFNFUVVFTkNFIGNvZGVyL2RlY29kZXIKICAgICAgLS0gUlNBLCBEU0EgYW5kIEVDRFNBIG5vdyB1c2UgdGhlIERFUiBTRVFVRU5DRSBjb2RlIChzYXZlcyBhIGxvdCBvZiBjb2RlISkKICAgICAgLS0gRFNBIG91dHB1dCBpcyBub3cgYSBERVIgU0VRVUVOQ0UgKHNvIG5vdCBjb21wYXRpYmxlIHdpdGggcHJldmlvdXMgcmVsZWFzZXMpLiAgCiAgICAgIC0tIEFkZGVkIFRlY2hub3RlICM1IHdoaWNoIHNob3dzIGhvdyB0byBidWlsZCBMVEMgb24gYW4gQU1ENjQgdG8gaGF2ZSBhIHZhcmlldHkgb2YgYWxnb3JpdGhtcyBpbiBvbmx5IH44MEtCIG9mIGNvZGUuCiAgICAgIC0tIENoYW5nZWQgdGVtcCB2YXJpYWJsZSBpbiBMT0FEL1NUT1JFIG1hY3JvcyB0byAidWxvbmczMiIgZm9yIDMyLWJpdCBvcHMuICBNYWtlcyBpdCBzYWZlciBvbiBCaWcgZW5kaWFuIHBsYXRmb3JtcwogICAgICAtLSBBZGRlZCBJTlNUQUxMX0dST1VQIGFuZCBJTlNUQUxMX1VTRVIgd2hpY2ggeW91IGNhbiBzcGVjaWZ5IG9uIHRoZSBidWlsZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBVU0VSL0dST1VQIHRoZSBsaWJyYXJ5IAogICAgICAgICBpcyB0byBiZSBpbnN0YWxsZWQgYXMKICAgICAgLS0gUmVtb3ZlZCAidGVzdHByb2YiIGZyb20gdGhlIGRlZmF1bHQgYnVpbGQuICAKICAgICAgLS0gQWRkZWQgSUE1LCBOVUxMIGFuZCBPYmplY3QgSWRlbnRpZmllciB0byB0aGUgbGlzdCBvZiBBU04uMSBERVIgc3VwcG9ydGVkIHR5cGVzCiAgICAgIC0tIFRoZSAibm9fb29wcyIgdGFyZ2V0IChwYXJ0IG9mIHppcHVwKSBub3cgc2NhbnMgZm9yIG5vbi1jdnMgZmlsZXMuICBUaGlzIGhlbHBzIHByZXZlbnQgdGVtcC9zY3JhdGNoIGZpbGVzIGZyb20gYXBwZWFyaW5nIGluIHJlbGVhc2VzIDstKQogICAgICAtLSBBZGRlZCBERVJzIGZvciBtaXNzaW5nIGhhc2hlcywgYnV0IGp1c3QgdGhlIE9JRCBub3QgdGhlIFBLQ1MgIzEgdjEuNSBhZGRpdGlvbnMuIAogICAgICAtLSBSZW1vdmVkIFBLQ1MgIzEgdjEuNSBmcm9tIHRoZSB0cmVlIHNpbmNlIGl0J3MgdGFraW5nIHVwIHNwYWNlIGFuZCB5b3Ugb3VnaHQgdG8gdXNlIHYyLjEgYW55d2F5cwogICAgICAtLSBLZXZpbiBLZW5ueSBwb2ludGVkIG91dCBhIGZldyBzdHJheSAvLyBjb21tZW50cwogICAgICAtLSBJTlRFR0VSIGNvZGUgcHJvcGVybHkgc3VwcG9ydHMgbmVnYXRpdmVzIGFuZCB6ZXJvIHBhZGRpbmcgW1Bla2thIV0KICAgICAgLS0gU29ydGVkIGFzbjEvZGVyLyBkaXJlY3RvcnkgLi4uIGxlc3Mgb2YgYSBtZXNzIG5vdyA7LSkKICAgICAgLS0gQWRkZWQgUFJJTlRBQkxFIFNUUklORyB0eXBlCiAgICAgIC0tIFJlbW92ZWQgRUNDLTE2MCBhcyBpdCB3YXNuJ3QgYSBzdGFuZGFyZCBjdXJ2ZQogICAgICAtLSBNYWRlIGVjY19zaGFyZWRfc2VjcmV0KCkgQU5TSSBYOS42MyBjb21wbGlhbnQKICAgICAgLS0gQ2hhbmdlZCAicHJpbnRmIiB0byAiZnByaW50ZihzdGRlcnIsICIgaW4gdGhlIHRlc3RiZW5jaC4uLiA7LSkKICAgICAgLS0gT3B0aW1pemVkIHRoZSBHQ00gdGFibGUgY3JlYXRpb24uICBPbiAxS0IgcGFja2V0cyBbd2l0aCBrZXkgc3dpdGNoaW5nXSB0aGUgbmV3IEdDTSBpcyAxMi43eCBmYXN0ZXIgdGhhbiBiZWZvcmUuCiAgICAgIC0tIENoYW5nZWQgT0lEIHJlcHJlc2VudGF0aW9uIGZvciBoYXNoZXMgdG8gYmUganVzdCBhIGxpc3Qgb2YgdW5zaWduZWQgbG9uZ3MgKHNvIHlvdSBjYW4gY29tcGFyZSBhZ2FpbnN0IHRoZW0gbmljZWx5IGFmdGVyIGRlY29kaW5nIGEgc2VxdWVuY2UpCiAgICAgIC0tIEVDQyBjb2RlIG5vdyB1c2VzIE1vbnRnb21lcnkgcmVkdWN0aW9uIC4uLiBpdCdzIGV2ZW4gZmFzdGVyIFtFQ0MtMjU2IG1ha2Uga2V5IGRvd24gZnJvbSAzNy40TSB0byA0LjZNIGN5Y2xlcyBvbiBhbiBBdGhsb242NF0KICAgICAgLS0gQWRkZWQgU0hPUlRfSU5URUdFUiBzbyB1c2VycyBjYW4gZWFzaWx5IHN0b3JlIERFUiBlbmNvZGVkIElOVEVHRVIgdHlwZXMgd2l0aG91dCB1c2luZyB0aGUgYmlnbnVtIG1hdGggbGlicmFyeQogICAgICAtLSBGaXhlZCBPTUFDIGNvZGUgc28gdGhhdCB3aXRoIExUQ19GQVNUIGl0IGRvZXNuJ3QgcmVxdWlyZSB0aGF0IExUQ19GQVNUX1RZUEUgZGl2aWRlcyAxNiBbaXQgaGFzIHRvIGRpdmlkZSB0aGUgYmxvY2sgc2l6ZSBpbnN0ZWFkXQogICAgICAtLSBFQ0Mga2V5IGV4cG9ydCBpcyBub3cgYSBzaW1wbGUgW2FuZCBkb2N1bWVudGVkXSBTRVFVRU5DRSwgdGhlICJlbmNyeXB0X2tleSIgYWxzbyB1c2VzIGEgbmV3IFNFUVVFTkNFIGZvcm1hdC4KICAgICAgLS0gVGhhbmtzIGdvZXMgdG8gdGhlIGZvbGxvd2luZyB0ZXN0ZXJzCiAgICAgICAgICAgIE1pY2hhZWwgQnJvd24gICAgICAgICAgICAgLSBTb2xhcmlzIDEwL3VTUEFSQ0lJCiAgICAgICAgICAgIFJpY2hhcmQgT3V0ZXJicmlkZ2UgICAgICAgLSBNYWNPUwogICAgICAgICAgICBNYXJ0aW4gQ2FycGVudGVyICAgICAgICAgIC0gU29sYXJpcyA4L3VTUEFSQ0lJIFtUaGFua3MgZm9yIGNsZWFuaW5nIHVwIHRoZSBzY3JpcHRzXQogICAgICAgICAgICBHcmVnIFJvc2UgICAgICAgICAgICAgICAgIC0gIC4uLiBTdW5PUyA1LjgvU1BBUkMgWy4uLiB3aGF0J3Mgd2l0aCB0aGUgU1BBUkNTP10KICAgICAgICAgICAgTWF0dCBKb2huc3RvbiAgICAgICAgICAgICAtIE1hY09TIFggIFtUaGFua3MgZm9yIHBvaW50aW5nIG91dCBHQ0MgNCBwcm9ibGVtcyB3aXRoIC1Pc10KCkFwcmlsIDE5dGgsIDIwMDUKdjEuMDIKICAgICAgLS0gQWRkZWQgTFRDX1RFU1Qgc3VwcG9ydCB0byBnY21fdGVzdCgpCiAgICAgIC0tICJwdC9jdCIgY2FuIG5vdyBiZSBOVUxMIGluIGdjbV9wcm9jZXNzKCkgaWYgeW91IGFyZSBwcm9jZXNzaW5nIHplcm8gYnl0ZXMKICAgICAgLS0gT3B0aW1pemVkIEdDTSBieSByZW1vdmluZyB0aGUgImRvdWJsZSBjb3B5IiBoYW5kbGluZyBvZiB0aGUgcGxhaW50ZXh0L2FhZAogICAgICAtLSBSaWNoYXJkIE91dGVyYnJpZGdlIHBvaW50ZWQgb3V0IHRoYXQgeDg2X3Byb2Ygd29uJ3QgYnVpbGQgb24gTUFDT1MgYW5kIHRoYXQgdGhlIG1hbnVhbCAKICAgICAgICAgZXJyb25lb3VzbHkgcmVmZXJzIHRvICJteWNyeXB0IiBhbGwgb3ZlciB0aGUgcGxhY2UuICBGaXhlZC4KCkFwcmlsIDE3dGgsIDIwMDUKdjEuMDEKICAgICAgICoqIFNlY3VyZSBTY2llbmNlIENvcnBvcmF0aW9uIGhhcyBzdXBwb3J0ZWQgdGhpcyByZWxlYXNlIGN5Y2xlIGJ5IHNwb25zb3JpbmcgdGhlIGRldmVsb3BtZW50IHRpbWUgdGFrZW4uICBUaGVpciAKICAgICAgICAgIGNvbnRpbnVpbmcgc3VwcG9ydCBvZiB0aGlzIHByb2plY3QgaGFzIGhlbHBlZCBtZSBtYWludGFpbiBhIHN0ZWFkeSBwYWNlIGluIG9yZGVyIHRvIGtlZXAgTGliVG9tQ3J5cHQgdXAgdG8gZGF0ZSwKICAgICAgICAgIHN0YWJsZSBhbmQgbW9yZSBlZmZpY2llbnQuCiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgLS0gVXBkYXRlZCBiYXNlNjRfZGVjb2RlLmMgc28gaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiAzICc9JyBzaWducyBpdCB3b3VsZCBzdG9wIHBhcnNpbmcKICAgICAgIC0tIE1lcmdlZCBpbiBsYXRlc3QgbXBpIHRoYXQgZml4ZWQgYSBmZXcgYnVncyBoZXJlIGFuZCB0aGVyZQogICAgICAgLS0gVXBkYXRlZCBPQUVQIGVuY29kZXIvZGVjb2RlciB0byBjYXRjaCB3aGVuIHRoZSBoYXNoIG91dHB1dCBpcyB0b28gbGFyZ2UKICAgICAgICAgIENsZWFuZWQgdXAgUFNTIGNvZGUgdG9vCiAgICAgICAtLSBBbmR5IEJvbnRvZnQgZml4ZWQgYSBidWcgaW4gbXkgZGVtb3MvdGVzdHMvbWFrZWZpbGUubXN2YyAuLi4gc2VlbXMgImRzYV90ZXN0LmMiIGlzbid0IGFuIG9iamVjdAogICAgICAgICAgYWZ0ZXJhbGwuICBUaGFua3MuCiAgICAgICAtLSBNYWRlIGludmFsaWQgRUNDIGtleSBzaXplcyAoY29uZmlndXJhdGlvbikgbm90IGhhcmQgZmF1bHQgdGhlIHByb2dyYW0gKGl0IHJldHVybnMgYW4gZXJyb3IgY29kZSBub3cpCiAgICAgICAtLSBTQUZFUiBoYXMgYmVlbiByZS1lbmFibGVkIGFmdGVyIEkgd2FzIHBvaW50ZWQgdG8gaHR0cDovL3d3dy5jaXBoZXJzYnlyaXR0ZXIuY29tL05FV1MyLzk1MDMyMzAxLkhUTQogICAgICAgICAgW01hcmsgS290aWFob10KICAgICAgIC0tIEFkZGVkIENDTSBtb2RlIHRvIHRoZSBlbmNhdXRoIGxpc3QgKG5vdyBoYXMgRUFYLCBPQ0IgYW5kIENDTSwgYydlc3QgdW4gdHJlbyBtYWduaWZpcXVlISkKICAgICAgIC0tIEFkZGVkIG1pc3NpbmcgQVNOLjEgaGVhZGVyIHRvIHRoZSBSU0Ega2V5cyAuLi4gb29wcy4uLiBub3cgdGhlIHJzYV9leHBvcnQvaW1wb3J0IGFyZSBGVUxMWSBjb21wYXRpYmxlCiAgICAgICAgICB3aXRoIG90aGVyIGxpYnMgbGlrZSBPcGVuU1NMIChjb21tZW50OiAgVGVzdCB2ZWN0b3JzIHdvdWxkIGdvIGEgbG9uZyB3YXkgUlNBLi4uKQogICAgICAgLS0gTWFudWFsbHkgbWVyZ2VkIGluIGZpeCB0byB0aGUgcHJpbWVfcmFuZG9tX2V4KCkgTFRNIGZ1bmN0aW9uIHRoYXQgZW5zdXJlcyB0aGUgMm5kIE1TQiBpcyBzZXQgcHJvcGVybHkuICBOb3cKICAgICAgICAgIFdoZW4geW91IHNheSAiSSB3YW50IGEgMTAyNC84IGJ5dGUgUlNBIGtleSIgdGhlIE1TQiBiaXQgb2YgdGhlIG1vZHVsdXMgaXMgc2V0IGFzIGV4cGVjdGVkLiAgTm90ZSBJIGdlbmVyYWxseSAKICAgICAgICAgIGRvbid0IHZpZXcgdGhpcyBhcyBhICJodWdlIGlzc3VlIiBidXQgaXQncyBqdXN0IG9uZSBsZXNzIG5pdCB0byB3b3JyeSBhYm91dC4gW0JyeWFuIEtsaXNjaF0KICAgICAgIC0tIEEgbmV3IENWUyBoYXMgYmVlbiBzZXR1cCBvbiBteSBBdGhsb242NCBib3guLi4gaWYgeW91IHdhbnQgZGV2ZWxvcGVyIGFjY2VzcyBzZW5kIG1lIGFuIGVtYWlsIChhbmQgYXQgdGhpcyBwb2ludCB0aGUgZW1haWwgd291bGQgaGF2ZSB0byBiZSBhd2Vzb21lKS4KICAgICAgIC0tIFVwZGF0ZWQgQVBJIGZvciBFQ0IgYW5kIENCQyBzaGVsbCBjb2RlLiAgTm93IGNhbiBwcm9jZXNzIE4gd2hvbGUgYmxvY2tzIGluIG9uZSBjYWxsIChsaWtlICRERUlUWSBpbnRlbmRlZCkKICAgICAgIC0tIEludHJvZHVjZWQgYSBuZXcgImhhcmR3YXJlIGFjY2VsIiBmcmFtZXdvcmsgdGhhdCBjYW4gYmUgdXNlZCB0byBzcGVlZCB1cCBjaXBoZXIgRUNCLCBDQkMgYW5kIENUUiBtb2RlCiAgICAgICAgICBjYWxscy4gIExhdGVyIG9uIGRlcGVuZGVudCBjb2RlIChlLmcuIE9NQUMsIENDTSkgd2lsbCBiZSByZS13cml0dGVuIHRvIHVzZSB0aGUgZ2VuZXJpYyBjYmMvY3RyIGZ1bmN0aW9ucy4gIEJ1dCBub3cKICAgICAgICAgIGlmIHlvdSBbc2F5XSBjYWxsIGN0cl9lbmNyeXB0KCkgd2l0aCBhIGNpcGhlciBkZXNjcmlwdG9yIHRoYXQgaGFzIGhhcmR3YXJlIENUUiBpdCB3aWxsIGF1dG9tYXRpY2FsbHkKICAgICAgICAgIGJlIHVzZWQgKGUuZy4gbm8gY29kZSByZXdyaXRlcykKICAgICAgIC0tIE5vdyBzaGlwcyB3aXRoIDIwJSBtb3JlIGxvdmUuCiAgICAgICAtLSB4ODZfcHJvZiBub3cgdXNlcyBFQ0Igc2hlbGwgY29kZSAoaGludDogYWNjZWxlcmF0b3JzKSBhbmQgb3V0cHV0cyBjeWNsZXMgcGVyIEJMT0NLIG5vdCBieXRlLiAgVGhpcyB3aWxsIG1ha2UgaXQgYSBiaXQgCiAgICAgICAgICBlYXNpZXIgdG8gY29tcGFyZSBoYXJkd2FyZSB2cy4gc29mdHdhcmUgY2lwaGVyIGltcGxlbWVudGF0aW9ucy4gIEl0IGFsc28gZW1pdHMgdGltaW5ncyBmb3IgQ0JDIGFuZCBDVFIgbW9kZXMKICAgICAgIC0tIFtQZXRlciBMYURvd10gZml4ZWQgYSB0eXBvIHcuci50LiBYUkVBTExPQyBtYWNybyAoc3BlbGxpbmcgY291bnRzIGtpZHMhKQogICAgICAgLS0gRml4ZWQgYnVnIHdpdGggX194ODZfNjRfXyB3aGVyZSBST0w2NC9ST1I2NCB3aXRoIExUQ19OT19ST0xDIHdvdWxkIGJlIHRoZSAzMi1iaXQgdmVyc2lvbnMgaW5zdGVhZC4uLgogICAgICAgLS0gU2hpcHBpbmcgd2l0aCBwcmVsaW1pbmFyeSBHQ00gY29kZSAoZGlzYWJsZWQpLiAgSXQncyBidWdneSAoc3RhY2sgb3ZlcmZsb3cgaGlkZGVuIHNvbWV3aGVyZSkuICBJZiBhbnlvbmUgY2FuIHNwb3QgaXQgbGV0IG1lIGtub3cuCiAgICAgICAtLSBBZGRlZCBQZWxpY2FuIE1BQyBbaXQncyBhbiBBRVMgYmFzZWQgZmFzdCBNQUNdIHRvIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBNQUNzCiAgICAgICAtLSBBZGRlZCBMVENfRkFTVCBbYW5kIHlvdSBjYW4gZGlzYWJsZSBieSBkZWZpbmluZyBMVENfTk9fRkFTVF0gc28gdGhhdCBDQkMgYW5kIENUUiBtb2RlIFhPUiB3aG9sZSB3b3JkcyBbZS5nLiAzMiBvciA2NCBiaXRzXSBhdCBhIHRpbWUKICAgICAgICAgIGluc3RlYWQgb2Ygb25lIGJ5dGUuICBPbiBteSBBTUQ2NCB0aGlzIHJlZHVjZWQgdGhlIG92ZXJoZWFkIGZvciBBRVMtMTI4LUNCQyBmcm9tIDQuNTYgY3ljbGVzL2J5dGUgdG8gYXJvdW5kIDEgY3ljbGUvYnl0ZS4gIFRoaXMgcmVxdWlyZXMKICAgICAgICAgIHRoYXQgeW91IGVpdGhlciBhbGxvdyB1bmFsaWduZWQgcmVhZC93cml0ZXMgW2UuZy4geDg2XzMyL3g4Nl82NF0gb3IgYWxpZ24gYWxsIHlvdXIgZGF0YS4gIEl0IHdvbid0IGdvIG91dCBvZiBpdCdzIHdheSB0byBlbnN1cmUgCiAgICAgICAgICBhbGlnbmVkIGFjY2Vzcy4gIE9ubHkgZW5hYmxlZCBmb3IgeDg2XyogcGxhdGZvcm1zIGJ5IGRlZmF1bHQgc2luY2UgdGhleSBhbGxvdyB1bmFsaWduZWQgcmVhZC93cml0ZXMuCiAgICAgICAtLSBBZGRlZCBMVENfRkFTVCBzdXBwb3J0IHRvIFBNQUMgKGRyb3BzIHRoZSBjeWNsZS9ieXRlIGJ5IGFib3V0IDkgY3ljbGVzIG9uIG15IEFNRDY0KSBbbm90ZTogSSBsYXRlciByZXdyb3RlIHRoaXMgcHJpb3IgdG8gcmVsZWFzZV0KICAgICAgIC0tIFVwZGF0ZWQgInByb2ZpbGVkIiB0YXJnZXQgdG8gd29yayB3aXRoIHRoZSBuZXcgZGlyZWN0b3J5IGxheW91dAogICAgICAgLS0gQWRkZWQgW2RlbW8gb25seV0gb3B0aW1pemVkIFJDNS1DVFIgY29kZSB0byB4ODZfcHJvZiBkZW1vIHRvIHNob3cgb2ZmIGhvdyB0byBtYWtlIGFuIGFjY2VsZXJhdG9yCiAgICAgICAgICBbVGhpcyBoYXMgYmVlbiByZW1vdmVkIHByaW9yIHRvIHJlbGVhc2UuLi4gSXQgbWF5IHJlLWFwcGVhciBsYXRlcl0KICAgICAgIC0tIEFkZGVkIENDTSBhY2VsZXJhdG9yIGNhbGxiYWNrcyB0byB0aGUgbGlzdCBbbm93IHN1cHBvcnRzIEVDQiwgQ1RSLCBDQkMgYW5kIG5vdyBDQ01dLgogICAgICAgLS0gQWRkZWQgY2hhcHRlciB0byBtYW51YWwgYWJvdXQgYWNjZWxlcmF0b3JzICh5b3Uga25vdyB5b3Ugd2FudCBpdCkKICAgICAgIC0tIEFkZGVkICJic3dhcCIgb3B0aW1pemF0aW9ucyB0byB4ODYgTE9BRC9TVE9SRSB3aXRoIGJpZyBlbmRpYW4uICBDYW4gYmUgZGlzYWJsZWQgYnkgZGVmaW5pbmcgTFRDX05PX0JTV0FQCiAgICAgICAtLSBMVENfTk9fQVNNIGlzIG5vdyB0aGUgb2ZmaWNpYWwgImRpc2FibGUgYWxsIG5vbi1wb3J0YWJsZSBzdHVmZiIgbWFjcm8uICBXaGVuIGRlZmluZWQgaXQgd2lsbCBtYWtlIHRoZSBjb2RlIGVuZGlhbi1uZXV0cmFsLAogICAgICAgICAgZGlzYWJsZSBhbnkgZm9ybSBvZiBBU00gYW5kIGRpc2FibGUgTFRDX0ZBU1QgbG9hZC9zdG9yZXMuICBFc3NlbnRpYWxseSBidWlsZCB0aGUgbGlicmFyeSB3aXRoIHRoaXMgZGVmaW5lZCBpZiB5b3UncmUgaGF2aW5nCiAgICAgICAgICB0cm91YmxlIGJ1aWxkaW5nIHRoZSBsaWJyYXJ5IChvbGQgR0NDcyBmb3IgaW5zdGFuY2UgZGlzbGlrZSB0aGUgUk9MYyBtYWNybykKICAgICAgIC0tIEFkZGVkIHRvbWNyeXB0X21hYy5oIGFuZCBtb3ZlZCBNQUMvZW5jTUFDIGZ1bmN0aW9ucyBmcm9tIHRvbWNyeXB0X2hhc2guaCBpbnRvIGl0CiAgICAgICAtLSBBZGRlZCAiZG9uZSIgZnVuY3Rpb24gdG8gY2lwaGVycyBhbmQgdGhlIGZpdmUgY2hhaW5pbmcgbW9kZXMgW2FuZCB0aGluZ3MgbGlrZSBvbWFjL3BtYWMvZXRjXQogICAgICAgLS0gQ2hhbmdlZCBpbnN0YWxsIGdyb3VwIHRvICJ3aGVlbCIgZnJvbSAicm9vdCIuCiAgICAgICAtLSBSZXBsYWNlZCAvLyBjb21tZW50cyB3aXRoIC8qKi8gc28gaXQgd2lsbCBidWlsZCBvbiBvbGRlciBVTklYLWxpa2UgcGxhdGZvcm1zCiAgICAgICAtLSB4ODZfcHJvZiBidWlsZHMgYW5kIHJ1bnMgd2l0aCBJbnRlbENDIGZpbmUgbm93IAogICAgICAgLS0gQWRkZWQgInN0ZXN0IiBidWlsZCB0byBpbnRlbCBDQyB0byB0ZXN0IHN0YXRpYyBsaW5rZWQgZnJvbSB3aXRoaW4gdGhlIGRpciAoc28geW91IGRvbid0IGhhdmUgdG8gaW5zdGFsbCB0byB0ZXN0KQogICAgICAgLS0gTW92ZWQgdGVzdGluZy9iZW5jaG1hcmsgaW50byB0ZXN0cHJvZiBkaXJlY3RvcnkgYW5kIGJ1aWxkIGl0IGFzIHBhcnQgb2YgdGhlIGJ1aWxkLiAgTm93IHlvdSBjYW4gbGluayBhZ2FpbnN0IGxpYnRvbWNyeXB0X3Byb2YuYSB0byBnZXQgCiAgICAgICAgICB0ZXN0aW5nIGluZm8gKGhpbnQ6IGhhcmR3YXJlIGRldmVsb3BlcnMgOy0pICkKICAgICAgIC0tIEFkZGVkIENDTSB0byB0dl9nZW4gCiAgICAgICAtLSBBZGRlZCBkZW1vcyB0byBNU1ZDIG1ha2VmaWxlCiAgICAgICAtLSBSZW1vdmVkIC1mdW5yb2xsLWFsbC1sb29wcyBmcm9tIEdDQyBtYWtlZmlsZSBhbmQgcmVwbGFjZWQgd2l0aCAtZnVucm9sbC1sb29wcyB3aGljaCBpcyBhIGJpdCBtb3JlIHNhbmUgKFA0IGFpbid0IGdvdCBtdWNoIGNhY2hlIGZvciB0aGUgSURBVEEpCiAgICAgICAtLSBGaXhlZCBHQ00gcHJpb3IgdG8gcmVsZWFzZSBhbmQgcmUtZW5hYmxlZCBpdC4gIEl0IGhhcyBub3QgYmVlbiBvcHRpbWl6ZWQgYnV0IGl0IGRvZXMgY29uZm9ybSB3aGVuIGNvbXBpbGVkIHdpdGggb3B0aW1pemF0aW9ucy4KICAgICAgIC0tIEkndmUgc2luY2Ugb3B0aW1pemVkIEdDTSBhbmQgQ0NNLiAgVGhleSdyZSBjbG9zZSBpbiBzcGVlZCBidXQgR0NNIGlzIG1vcmUgZmxleGlibGUgaW1obyAodGhvdWdoIEVBWCBpcyBtb3JlIGZsZXhpYmxlIHRoYW4gYm90aCkKICAgICAgIC0tIEZvciBraWNrcyBJIG9wdGltaXplZCB0aGUgRUNDIGNvZGUgdG8gdXNlIHByb2plY3RpdmUgcG9pbnRzLiAgR2V0cyBiZXR3ZWVuIDMuMjF4IChQcmVzY290dCBQNCkgdG8gNC41M3ggKEFNRDY0KSB0aW1lcyBmYXN0ZXIgdGhhbiBiZWZvcmUgYXQgMTYwLWJpdCBrZXlzIGFuZCB0aGUKICAgICAgICAgIHNwZWVkdXAgZ3Jvd3MgYXMgdGhlIGtleXNpemUgZ3Jvd3MuICBCYXNpY2FsbHkgcmVtb3ZpbmcgbW9zdCBwcmFjdGljYWwgcmVhc29ucyB0byAibm90IHVzZSB0aGUgRUNDIGNvZGUiLiAgRW5qb3kuCiAgICAgICAtLSBBZGRlZCBMVENfRkFTVCBzdXBwb3J0IHRvIE9NQUMvUE1BQyBhbmQgZG91YmxlZCBpdCdzIHNwZWVkIG9uIG15IGFtZDY0IFtmYXN0ZXIgb24gdGhlIFA0IHRvbyBJIGd1ZXNzXQogICAgICAgLS0gQWRkZWQgR0NNIHRvIHR2X2dlbgogICAgICAgLS0gUmVtb3ZlZCAibWFrZWZpbGUuY3lnd2luX2RsbCIgYXMgaXQncyBub3QgcmVhbGx5IHVzZWQgYnkgYW55b25lIGFuZCBub3Qgd29ydGggdGhlIGVmZm9ydCAoaGVsbCBJIGhhcmRseSBtYWludGFpbiB0aGUgTVNWQyBtYWtlZmlsZXMgLi4uKQogICAgICAgLS0gVXBkYXRlZCBhIGZldyBmaWxlcyBpbiB0aGUgIm1pc2MiIGRpcmVjdG9yeSB0byBoYXZlIGNvcnJlY3QgQGZpbGUgY29tbWVudHMgZm9yIGRveHlnZW4KICAgICAgIC0tIFJlbW92ZWQgInByb2ZpbGUiIHRhcmdldCBzaW5jZSBpdCB3YXMgc2xvd2VyIGFueXdheXMgKGdvIGZpZ3VyZS4uLikKCkRlY2VtYmVyIDMxc3QsIDIwMDQKdjEuMDAgIAogICAgICAgLS0gQWRkZWQgInIscyA9PSAwIiBjaGVjayB0byBkc2FfdmVyaWZ5X2hhc2goKQogICAgICAgLS0gQWRkZWQgIm11bHRpIGJsb2NrIiBoZWxwZXJzIGZvciBoYXNoLCBobWFjLCBwbWFjIGFuZCBvbWFjIHJvdXRpbmVzIHNvIHlvdSBjYW4gcHJvY2VzcyBtdWx0aXBsZSBub24tYWRqYWNlbnQKICAgICAgICAgIGJsb2NrcyBvZiBkYXRhIHdpdGggb25lIGNhbGwgKGFkZGVkIGRlbW9zL211bHRpLmMgdG8gbWFrZSBzdXJlIHRoZXkgd29yaykKICAgICAgICAgIC0tIE5vdGUgdGhlc2UgYXJlIG5vdCBkb2N1bWVudGVkIGJ1dCB0aGV5IGRvIGhhdmUgZG94eWdlbiBjb21tZW50cyBpbnNpZGUgdGhlbQogICAgICAgICAgLS0gQWxzbyBJIGRvbid0IHVzZSB0aGVtIGluIG90aGVyIGZ1bmN0aW9ucyAobGlrZSBwa2NzXzVfMigpKSBiZWNhdXNlIEkgZGlkbid0IGhhdmUgdGhlIHRpbWUuICBKb2IgZm9yIHRoZSBuZXcgTFRDIG1haW50YWluZXIgOy0pCiAgICAgICAtLSBBZGRlZCB0d2Vha2VkIEFudWJpcyB0ZXN0IHZlY3RvcnMgYW5kIG1hZGUgaXQgZGVmYXVsdCAodW5kZWZpbmVkIEFOVUJJU19UV0VBSyB0byBnZXQgb3JpZ2luYWwgQW51YmlzKQogICAgICAgLS0gTWVyZ2VkIGluIGZpeCBmb3IgbXBfcHJpbWVfcmFuZG9tX2V4KCkgdG8gZGVhbCB3aXRoIE1TQiBhbmQgTFNCICJidWdzIgogICAgICAgLS0gUmVtb3ZlZCB0aW1fZXhwdG1vZCgpIGNvbXBsZXRlbHksIHVwZGF0ZWQgc2V2ZXJhbCBSU0EgZnVuY3Rpb25zIChub3RhYmx5IHYxNSBhbmQgdGhlIGRlY3J5cHQvdmVyaWZ5KSBzbyB0aGV5IAogICAgICAgICAgZG9uJ3QgcmVxdWlyZSBhIHBybmcgbm93CiAgICAgICAtLSBUaGlzIHJlbGVhc2UgYnJvdWdodCB0byB5b3UgYnkgdGhlIGZpbmUgdHVuZXMgb2YgTWFjeSBHcmF5LiAgV2UgbWlzcyB5b3UuCgpEZWNlbWJlciAyM3JkLCAyMDA0CnYxLjAwcmMxCiAgICAgICAtLSBSZW5hbWVkICJteWNyeXB0XyoiIHRvICJ0b21jcnlwdF8qIiB0byBiZSBtb3JlIHNwZWNpZmljIGFuZCBwcm9mZXNzaW9uYWwKICAgICAgICAgIE5vdyBqdXN0IGluY2x1ZGUgInRvbWNyeXB0LmgiIGluc3RlYWQgb2YgIm15Y3J5cHQuaCIgdG8gZ2V0IExUQyA7LSkKICAgICAgIC0tIENsZWFuZWQgdXAgbWFrZWZpbGVzIHRvIGVuc3VyZSBhbGwgaGVhZGVycyBhcmUgY29ycmVjdGx5IGluc3RhbGxlZAogICAgICAgLS0gQWRkZWQgInJvdGF0ZSBieSBjb25zdGFudCIgbWFjcm9zIGZvciBwb3J0YWJsZSwgeDg2LTMyIGFuZCB4ODYtNjQKICAgICAgICAgIFlvdSBjYW4gZGlzYWJsZSB0aGlzIG5ldyBjb2RlIHdpdGggTFRDX05PX1JPTEMgd2hpY2ggaXMgdXNlZnVsIGZvciBvbGRlciBHQ0NzCiAgICAgICAtLSBDbGVhbmVkIHVwIGRldGVjdGlvbiBvZiB4ODYtNjQgc28gaXQgd29ya3MgZm9yIFJPTC9ST1IgbWFjcm9zCiAgICAgICAtLSBGaXhlZCByc2FfaW1wb3J0KCkgc28gdGhhdCBpdCB3b3VsZCBkZXRlY3QgbXVsdGktcHJpbWUgUlNBIGtleXMgYW5kIGVycm9yIGFwcHJvcHJpYXRlbHkKICAgICAgIC0tIFNvcnRlZCB0aGUgc291cmNlIGZpbGVzIGJ5IGNhdGVnb3J5IGFuZCB1cGRhdGVkIHRoZSBtYWtlZmlsZXMgYXBwcm9wcmlhdGVseQogICAgICAgLS0gQWRkZWQgTFRDX0RFUiBkZWZpbmUgc28geW91IGNhbiB0cmltIG91dCBERVIgY29kZSBpZiBub3QgcmVxdWlyZWQKICAgICAgIC0tIEZpeGVkIHVwIFJTQSdzIGRlY3J5cHQgZnVuY3Rpb25zIGNoYW5naW5nICJyZXMiIHRvICJzdGF0IiB0byBiZSBtb3JlIGluIHN5bmMKICAgICAgICAgIHdpdGggdGhlIHNpZ25hdHVyZSB2YXJpYWJsZXMgbm9tZW5jbGF0dXJlLiAobm8gY29kZSBjaGFuZ2UganVzdCByZW5hbWVkIHRoZSBhcmd1bWVudHMpCiAgICAgICAtLSBSZW1vdmVkIGFsbCBsYWJlbHMgc3RhcnRpbmcgd2l0aCBfXyBhbmQgcmVwbGFjZWQgd2l0aCBMQkxfIHRvIGF2b2lkIG5hbWVzcGFjZSBjb25mbGljdHMgKFJhbmR5IEhvd2FyZCkKICAgICAgIC0tIE1lcmdlZCBpbiBMVE0gZml4IHRvIG1wX3ByaW1lX3JhbmRvbV9leCgpIHdoaWNoIHphcCdlZCB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlIGlmIHRoZSBiaXQgc2l6ZQogICAgICAgICAgcmVxdWVzdGVkIHdhcyBhIG11bHRpcGxlIG9mIGVpZ2h0LgogICAgICAgLS0gTWFkZSBSU0FfVElNSU5HIG9mZiBieSBkZWZhdWx0IGFzIGl0J3Mgbm90IHRlcnJpYmx5IHVzZWZ1bCBbYW5kIGxpa2VseSB0byBiZSBkZXByZWNhdGVkXQogICAgICAgLS0gUmVuYW1lZCBTTUFMTF9DT0RFLCBDTEVBTl9TVEFDSyBhbmQgTk9fRklMRSB0byBoYXZlIGEgTFRDXyBwcmVmaXggdG8gYXZvaWQgbmFtZXNwYWNlIGNvbGxpc2lvbnMKICAgICAgICAgIHdpdGggb3RoZXIgcHJvZ3JhbXMuICBlLmcuIFNNQUxMX0NPREUgPT4gTFRDX1NNQUxMX0NPREUKICAgICAgIC0tIFplZCBTaGF3IHBvaW50ZWQgb3V0IHRoYXQgb24gY2VydGFpbiBzeXN0ZW1zIGluc3RhbGxpbmcgbGlicyBhcyAicm9vdCIgaXNuJ3QgcG9zc2libGUgYXMgdGhlIHN1cGVyLXVzZXIKICAgICAgICAgIGlzIG5vdCByb290LiAgTm93IHRoZSBtYWtlZmlsZXMgYWxsb3cgdGhpcyB0byBiZSBjaGFuZ2VkIGVhc2lseS4KICAgICAgIC0tIFJlbmFtZWQgInN0cnVjdCBfKl9kZXNjcmlwdG9yIiB0byAic3RydWN0IGx0Y18qX2Rlc2NyaXB0b3IiIHRvIGF2b2lkIHVzaW5nIGEgbGVhZGluZyBfCiAgICAgICAgICBBbHNvIHJlbmFtZWQgX0FSR0NISyB0byBMVENfQVJHQ0hLCiAgICAgICAtLSBaZWQgU2hhdyBwb2ludGVkIG91dCB0aGF0IEkgc3RpbGwgZGVmaW5lZCB0aGUgcHJuZyBzdHJ1Y3RzIGluIHRvbWNyeXB0X3BybmcuaCBldmVuIGlmIHRoZXkgCiAgICAgICAgICB3ZXJlbid0IGRlZmluZWQuICBUaGlzIG1hZGUgdW5kZWYnaW5nIEZPUlRVTkEgYnJlYWsgdGhlIGJ1aWxkLgogICAgICAgLS0gQWRkZWQgTFRDX05PX0FTTSB0byBkaXNhYmxlIGlubGluZSBhc20gbWFjcm9zIFtST0wvUk9SL2V0Y10KICAgICAgIC0tIENoYW5nZWQgUlNBIGRlY3J5cHQgZnVuY3Rpb25zIHRvIGNoYW5nZSB0aGUgb3V0cHV0IGxlbmd0aCB2YXJpYWJsZSBuYW1lIGZyb20gImtleWxlbiIgdG8gIm91dGxlbiIgdG8gbWFrZSAKICAgICAgICAgIGl0IG1vcmUgY29uc2lzdGVudC4KICAgICAgIC0tIEFkZGVkIHRoZSA2NC1iaXQgS2hhemFkIGJsb2NrIGNpcGhlciBbTkVTU0lFXQogICAgICAgLS0gQWRkZWQgdGhlIDEyOC1iaXQgQW51YmlzIGJsb2NrIGNpcGhlciBbd2l0aCBrZXkgc3VwcG9ydCBmb3IgMTI4Li4uMzIwIGJpdCBrZXlzXSBbTkVTU0lFXQogICAgICAgLS0gQ2hhbmdlcyB0byBzZXZlcmFsIE1BQyBmdW5jdGlvbnMgdG8gcmVuYW1lIGlucHV0IGFyZ3VtZW50cyB0byBtb3JlIHNlbnNpYmxlIG5hbWVzCiAgICAgICAtLSBSZW1vdmVkIEZBU1RfUEsgc3VwcG9ydCBmcm9tIGRoX3N5cy5jCiAgICAgICAtLSBEZWNsYXJlZCBkZXNrZXkoKSBmcm9tIGRlcy5jIGFzIHN0YXRpYyBpbnN0ZWFkIG9mIGEgZ2xvYmFsCiAgICAgICAtLSBBZGRlZCBwcmV0dHkgbXVjaCBhbGwgcHJhY3RpY2FsIEdDQyB3YXJuaW5nIHRlc3RzIHRvIHRoZSBHQ0MgW3JlbGF0ZWRdIG1ha2VmaWxlcy4gIFRoZXNlIGFkZGl0aW9uYWwKICAgICAgICAgIHdhcm5pbmdzIGNhbiBlYXNpbHkgYmUgZGlzYWJsZWQgZm9yIHRob3NlIHdpdGggb2xkZXIgY29waWVzIG9mIEdDQyBbb3IgZXZlbiBub24gR05VIGNjJ3NdCiAgICAgICAtLSBBZGRlZCBkb3h5Z2VuIEAgdGFncyB0byB0aGUgY29kZS4uLiAgcGhldyB0aGF0IHdhcyBhIGhlbGwgb2YgYSBsb3Qgb2YgW3JlcGV0aXRpdmVdIHdvcmsKICAgICAgIC0tIEFsc28gYWRkZWQgcHJlLWNvbmZpZ3VyZWQgRG94eWdlbiBzY3JpcHQuCiAgICAgICAtLSBDbGVhbmVkIHVwIHF1aXRlIGEgZmV3IGZ1bmN0aW9ucyBbY2lwaGVycywgcGssIGV0Y10gdG8gbWFrZSB0aGUgcGFyYW1ldGVycyBuYW1pbmcgc3R5bGUgY29uc2lzdGVudAogICAgICAgICAgRS5nLiBjaXBoZXJzIGtleXMgYXJlIGNhbGxlZCAic2tleSIgY29uc2lzdGVudGx5IG5vdy4gIFRoZSBpbnB1dCB0byBQSyBlbmNyeXB0aW9uIGlzIGNhbGxlZCAiaW4iLCBldGMuCiAgICAgICAgICBUaGVzZSBjaGFuZ2VzIHJlcXVpcmUgbm8gY29kZSBjaGFuZ2VzIG9uIHRoZSBiZWhhbGYgb2YgZGV2ZWxvcGVycyBmb3J0dW5hdGVseQogICAgICAgLS0gU3RhcnRlZCBhIFNBRkVSKyBvcHRpbWl6ZXIgW2RvZXMgZW5jcnlwdCBvbmx5XSB3aGljaCBzaGF2ZXMgYSBnb29kIDMwIG9yIHNvIGN5Y2xlcy9ieXRlIG9uIG15IEFNRDY0CiAgICAgICAgICBhdCBhbiBleHBlbnNlIG9mIGh1Z2UgY29kZS4gIEl0J3MgaW4gbm90ZXMvZXRjL3NhZmVycF9vcHRpbWl6ZXIuYwogICAgICAgLS0gRFNBIHNpZ24vdmVyaWZ5IG5vdyB1c2VzIERFUiBlbmNvZGVkIG91dHB1dC9pbnB1dHMgYW5kIG5vIExUQyBzdHlsZSBoZWFkZXJzLiAgCiAgICAgICAtLSBNYXR0IEpvaG5zdG9uIGZvdW5kIGEgbWlzc2luZyBzZW1pLWNvbG9uIGluIG1wX2V4cHRtb2QoKS4gIEZpeCBoYXMgYmVlbiBtZXJnZWQgaW4uICAKCk9jdG9iZXIgMjl0aCwgMjAwNAp2MC45OSAgLS0gTWVyZ2VkIGluIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBMVE0gd2hpY2ggaW5jbHVkZXMgYWxsIG9mIHRoZSByZWNlbnQgYnVnIGZpeGVzCiAgICAgICAtLSBEZXByZWNhdGVkIExUTVNTRSBhbmQgcmVtb3ZlZCBpdCAodG8gYmUgcmVwbGFjZWQgd2l0aCBURk0gbGF0ZXIgb24pCiAgICAgICAtLSBTdGVmYW4gQXJlbnR6IHBvaW50ZWQgb3V0IHRoYXQgbXBfc19ybWFwIHNob3VsZCBiZSBleHRlcm4KICAgICAgIC0tIEtyaXN0aWFuIEdq+HN0ZWVuIHBvaW50ZWQgb3V0IHRoYXQgdGhlcmUgYXJlIHR5cG9zIGluIHRoZSAKICAgICAgICAgICJ0ZXN0IiBtYWtlZmlsZSBhbmQgbWlub3IgaXNzdWVzIGluIFlhcnJvdyBhbmQgU29iZXIgW2p1c3QgY29zbWV0aWNzIHJlYWxseV0KICAgICAgIC0tIE1hdHRoZXcgUC4gQ2FzaGRvbGxhciBwb2ludGVkIG91dCB0aGF0ICJleHBvcnQiIGlzIGEgQysrIGtleXdvcmQgCiAgICAgICAgICBzbyBjaGFuZ2VkIHRoZSBQUk5HIGFwaSB0byB1c2UgInBleHBvcnQiIGFuZCAicGltcG9ydCIKICAgICAgIC0tIFVwZGF0ZWQgImhhc2hzdW0iIGRlbW8gc28gaXQgYnVpbGRzIDstKQogICAgICAgLS0gQWRkZWQgYXV0b21hdGljIHN1cHBvcnQgZm9yIHg4Ni02NCAod2lsbCBjb25maWd1cmUgZm9yIDY0LWJpdCBsaXR0bGUgZW5kaWFuIGF1dG9tYWdpY2FsbHkpCiAgICAgICAtLSBaaGkgQ2hlbiBwb2ludGVkIG91dCBhIGJ1ZyBpbiByc2FfZXhwdG1vZCB3aGljaCB3b3VsZCBsZWFrIG1lbW9yeSBvbiBlcnJvci4gCiAgICAgICAtLSBNYWRlIGhhc2ggZnVuY3Rpb25zICJpbml0IiByZXR1cm4gYW4gaW50LiAgc2xpZ2h0IGNoYW5nZSB0byBBUEkgOy0oCiAgICAgICAtLSBBZGRlZCAiQ0hDIiBtb2RlIHdoaWNoIHR1cm5zIGFueSBjaXBoZXIgaW50byBhIGhhc2ggdGhlIG90aGVyIExUQyBmdW5jdGlvbnMgY2FuIHVzZQogICAgICAgLS0gQWRkZWQgQ0hDIG1vZGUgc3R1ZmYgdG8gZGVtb3Mgc3VjaCBhcyB0dl9nZW4gYW5kIGhhc2hzdW0KICAgICAgIC0tIEFkZGVkICJtYWtlZmlsZS5zaGFyZWQiIHdoaWNoIGJ1aWxkcyBhbmQgaW5zdGFsbHMgc2hhcmVkL3N0YXRpYyBvYmplY3QgY29waWVzCiAgICAgICAgICBvZiB0aGUgbGlicmFyeS4KICAgICAgIC0tIEFkZGVkIERFUiBmb3IgYmlnbnVtIHN1cHBvcnQgCiAgICAgICAtLSBSU0EgaXMgbm93IGZ1bGx5IGpveS4gIHJzYV9leHBvcnQvcnNhX2ltcG9ydCB1c2UgUEtDUyAjMSBlbmNvZGluZ3MgYW5kIHNob3VsZCBiZSAKICAgICAgICAgIGNvbXBhdGlibGUgd2l0aCBvdGhlciBjcnlwdG8gbGlicyB0aGF0IHVzZSB0aGUgZm9ybWF0LgogICAgICAgLS0gQWRkZWQgc3VwcG9ydCBmb3IgeDg2LTY0IGZvciB0aGUgUk9ML1JPUiBtYWNyb3MgCiAgICAgICAtLSBDaGFuZ2VkIHRoZSBETEwgYW5kIFNPIG1ha2VmaWxlcyB0byBvcHRpbWl6ZSBmb3Igc3BlZWQsIGNvbW1lbnRlZCBTTUFMTF9DT0RFIGluCiAgICAgICAgICBteWNyeXB0X2N1c3RvbS5oIGFuZCBhZGRlZCAtRFNNQUxMX0NPREUgdG8gdGhlIGRlZmF1bHQgbWFrZWZpbGUKICAgICAgIC0tIFVwZGF0ZWQgcHJpbWFsaXR5IHRlc3RpbmcgY29kZSBzbyBpdCBkb2VzIGEgbWluaW11bSBvZiA1IHRlc3RzIFtvZiBNaWxsZXItUmFiaW5dCiAgICAgICAgICAoQUZBSUsgbm90IGEgc2VjdXJpdHkgZml4LCBqdXN0IHdhcm0gZnV6emllcykKICAgICAgIC0tIE1pbm9yIHVwZGF0ZXMgdG8gdGhlIE9NQUMgY29kZSAoYWRkaXRpb25hbCBfX0FSR0NISyBhbmQgcmVtb3ZlZCBwcmludGYgZnJvbSBvbWFjX3Rlc3QuLi4gb29wcyEpCiAgICAgICAtLSBVcGRhdGUgYnVpbGQgYW5kIGNvbmZpZ3VyYXRpb24gaW5mbyB3aGljaCB3YXMgcmVhbGx5IHJlYWxseSByZWFsbHkgb3V0IG9mIGRhdGUuICAoQ2hhcHRlciAxNCkKICAgICAgICsrIE1pbm9yIHVwZGF0ZSwgc3dpdGNoIFJTQSB0byB1c2UgdGhlIFBLQ1Mgc3R5bGUgQ1JUCgpBdWd1c3QgNnRoLCAyMDA0CnYwLjk4ICAtLSBVcGRhdGUgdG8gaG1hY19pbml0IHRvIGZyZWUgYWxsIGFsbG9jYXRlZCBtZW1vcnkgb24gZXJyb3IKICAgICAgIC0tIFVwZGF0ZSB0byBQUk5HIEFQSSB0byBmaXggaW1wb3J0L2V4cG9ydCBmdW5jdGlvbnMgb2YgRm9ydHVuYSBhbmQgWWFycm93CiAgICAgICAtLSBBZGRlZCB0ZXN0IGZ1bmN0aW9ucyB0byBQUk5HIGFwaSwgUkM0IG5vdyBjb25mb3JtcyA7LSkgW3dhcyBhIG1pbm9yIGlzc3VlXQogICAgICAgLS0gQWRkZWQgdGhlIFNPQkVSLTEyOCBQUk5HIGJhc2VkIG9mZiBvZiBjb2RlIGRvbmF0ZWQgYnkgR3JlZyBSb3NlLgogICAgICAgLS0gQWRkZWQgVGVjaCBOb3RlICM0IFtub3Rlcy90ZWNoMDAwNC50eHRdIAogICAgICAgLS0gQ2hhbmdlZCBSQzQgYmFjayBbZHVlIHRvIHJlcXVlc3RdLiAgSXQgd2lsbCBub3cgWE9SIHRoZSBvdXRwdXQgc28geW91IGNhbiB1c2UgaXQgbGlrZSAKICAgICAgICAgIGEgc3RyZWFtIGNpcGhlciBlYXNpbHkuCiAgICAgICAtLSBVcGRhdGUgRm9ydHVuYSdzIGV4cG9ydCgpIHRvIGVtaXQgYSBoYXNoIG9mIGVhY2ggcG9vbC4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgYWNjdW11bGF0ZWQgCiAgICAgICAgICBlbnRyb3B5IHRoYXQgd2FzIHNwcmVhZCBvdmVyIGFsbCB0aGUgcG9vbHMgaXNuJ3QgZW50aXJlbHkgbG9zdCB3aGVuIHlvdSBleHBvcnQvaW1wb3J0LgogICAgICAgLS0gWmhpIENoZW4gc3VnZ2VzdGVkIGEgY29tbWVudCBmb3IgcnNhX2VuY3J5cHRfa2V5KCkgdG8gbGV0IHVzZXJzIGtub3cgW2Vhc2lseV0gdGhhdCBpdCB3YXMKICAgICAgICAgIFBLQ1MgIzEgdjIuMCBwYWRkaW5nLiAgKHVwZGF0ZWQgb3RoZXIgcnNhXyogZnVuY3Rpb25zKQogICAgICAgLS0gQ2xlYW5lZCB1cCBOb2VrZW9uIHRvIHJlbW92ZSB1bnJvbGxpbmcgW3dhc24ndCByZXF1aXJlZCwgd2FzIG1lc3N5IGFuZCBhY3R1YWxseSBzbG93ZXIgd2l0aCBHQ0MvSUNDXQogICAgICAgLS0gVXBkYXRlZCBSQzQgc28gdGhhdCB3aGVuIHlvdSBmZWVkIGl0ID4yNTYgYnl0ZXMgb2YgZW50cm9weSBpdCBxdWlldGx5IGlnbm9yZXMgYWRkaXRpb25hbAogICAgICAgICAgYnl0ZXMuICBBbHNvIHJlbW92ZWQgdGhlICUgZnJvbSB0aGUga2V5IHNldHVwIHRvIHNwZWVkIGl0IHVwIGEgYml0LgogICAgICAgLS0gQWRkZWQgY2lwaGVyL2hhc2gvcHJuZyB0ZXN0cyB0byB4ODZfcHJvZiB0byBoZWxwIGNhdGNoIGJ1Z3Mgd2hpbGUgdGVzdGluZwogICAgICAgLS0gTWFkZSB0aGUgUFJORyAiZG9uZSIgcmV0dXJuIGludCwgZml4ZWQgc3BybmdfZG9uZSB0byBub3QgcmVxdWlyZSBwcm5nKiB0byBiZSBub24tbnVsbAogICAgICAgLS0gU3BydWNlZCB1cCBteWNyeXB0X2N1c3RvbS5oIHRvIHRyYXAgbW9yZSBlcnJvcnMgYW5kIGFsc28gaGVscCBwcmV2ZW50IExUTVNTRSBmcm9tIGJlaW5nIGRlZmluZWQKICAgICAgICAgIG9uIG5vbi1pMzg2IHBsYXRmb3JtcyBieSBhY2NpZGVudC4KICAgICAgIC0tIEFkZGVkIFJTQS9FQ0MvREggc3BlZWQgdGVzdHMgdG8geDg2X3Byb2YgYW5kIGNsZWFuZWQgaXQgdXAgdG8gYnVpbGQgd2l0aCB6ZXJvIHdhcm5pbmdzCiAgICAgICAtLSBDaGFuZ2VkIEZvcnR1bmEgdG8gY291bnQgb25seSBlbnRyb3B5IFtub3QgdGhlIDIgYnl0ZSBoZWFkZXJdIGFkZGVkIHRvIHBvb2xbMF0gaW50byB0aGUgCiAgICAgICAgICByZXNlZWQgbWVjaGFuaXNtLiAgCiAgICAgICAtLSBBZGRlZCAiZXhwb3J0X3NpemUiIG1lbWJlciB0byBwcm5nX2Rlc2NyaXB0b3IgdGFibGVzIHNvIHlvdSBjYW4ga25vdyBpbiBhZHZhbmNlIHRoZSBzaXplIG9mIAogICAgICAgICAgdGhlIGV4cG9ydGVkIHN0YXRlIGZvciBhbnkgZ2l2ZW4gUFJORy4gIAogICAgICAgLS0gUG9ydGVkIG92ZXIgcGF0Y2ggb24gTFRNIDAuMzAgW25vdCByZWFkeSB0byByZWxlYXNlIExUTSAwLjMxXSB0aGF0IGZpeGVzIGJ1ZyBpbiBtcF9tdWwoKS9tcF9kaXYoKQogICAgICAgICAgdGhhdCB1c2VkIHRvIHJlc3VsdCBpbiBuZWdhdGl2ZSB6ZXJvZXMgd2hlbiB5b3UgbXVsdGlwbGllZCB6ZXJvIGJ5IGEgbmVnYXRpdmUgaW50ZWdlci4gIAogICAgICAgICAgKHBhdGNoIGR1ZSB0byAiV29sZmdhbmcgRWhyaGFyZHQiIDxXb2xmZ2FuZy5FaHJoYXJkdEBtdW5pY2gubmV0c3VyZi5kZT4pCiAgICAgICAtLSBGaXhlZCByc2FfKmRlY3J5cHRfa2V5KCkgYW5kIHJzYV8qdmVyaWZ5X2hhc2goKSB0byBkZWZhdWx0IHRvIGludmFsaWQgInN0YXQiIG9yICJyZXMiLiAgVGhpcyB3YXkKICAgICAgICAgIGlmIGFueSBvZiB0aGUgaGlnaGVyIGxldmVsIGZ1bmN0aW9ucyBmYWlsIFtiZWZvcmUgeW91IGdldCB0byB0aGUgcGFkZGluZ10gdGhlIHJlc3VsdCB3aWxsIGJlIGluCiAgICAgICAgICBhIGtub3duIHN0YXRlXS4gIEFwcGxpZWQgdG8gYm90aCB2MiBhbmQgdjEuNSBwYWRkaW5nIGhlbHBlcnMuCiAgICAgICAtLSBBZGRlZCBNQUNzIHRvIHg4Nl9wcm9mCiAgICAgICAtLSBGaXhlZCB1cCAid2FybmluZ3MiIGluIHg4Nl9wcm9mIGFuZCB0dl9nZW4KICAgICAgIC0tIEFkZGVkIGEgInByb2ZpbGVkIiB0YXJnZXQgYmFjayBbZm9yIEdDQyAzLjQgYW5kIElDQyB2OF0uICBEb2Vzbid0IHNlZW0gdG8gaGVscCBidXQgbWlnaHQgYmUgd29ydGgKICAgICAgICAgIHRpbmtlcmluZyB3aXRoLgogICAgICAgLS0gQmVlZmVkIHVwIGxvYWQvc3RvcmUgdGVzdCBpbiBkZW1vcy90ZXN0CgogICAgICAgKysgTmV3IG5vdGUsIGluIG9yZGVyIHRvIHVzZSB0aGUgb3B0aW1pemVkIExPQUQvU1RPUkUgbWFjcm9zIHlvdXIgcGxhdGZvcm0KICAgICAgICAgIG11c3Qgc3VwcG9ydCB1bmFsaWduZWQgMzIvNjQgYml0IGxvYWQvc3RvcmVzLiAgVGhlIHg4NnMgc3VwcG9ydCB0aGlzCiAgICAgICAgICBidXQgc29tZSBbQVJNIGZvciBpbnN0YW5jZV0gZG8gbm90LiAgSWYgeW91ciBwbGF0Zm9ybSBjYW5ub3QgcGVyZm9ybQogICAgICAgICAgdW5hbGlnbmVkIG9wZXJhdGlvbnMgeW91IG11c3QgdXNlIHRoZSBlbmRpYW4gbmV1dHJhbCBjb2RlIHdoaWNoIGlzIHNhZmUgZm9yIAogICAgICAgICAgYW55IHNvcnQgb2YgcGxhdGZvcm0uCgpKdWx5IDIzcmQsIDIwMDQKdjAuOTdiIC0tIEFkZGVkIFBLQ1MgIzEgdjEuNSBSU0EgZW5jcnlwdC9zaWduIGhlbHBlcnMgKGxpa2UgcnNhX3NpZ25faGFzaCwgZXRjLi4uKQogICAgICAgLS0gQWRkZWQgbWlzc2luZyBwcm5nIGNoZWNrIHRvIHJzYV9kZWNyeXB0X2tleSgpIFtub3QgY3JpdGljYWwgYXMgSSBkb24ndCB1c2UgCiAgICAgICAgICBkZXNjcmlwdG9ycyBkaXJlY3RseSBpbiB0aGF0IGZ1bmN0aW9uXQogICAgICAgLS0gTWVyZ2VkIGluIExUTS1TU0UsIGRlZmluZSBMVE1TU0UgYmVmb3JlIHlvdSBidWlsZCBhbmQgeW91IHdpbGwgZ2V0IFNTRTIgb3B0aW1pemVkIG1hdGggOy0pCiAgICAgICAgICAocm91Z2hseSAzeCBmYXN0ZXIgb24gYSBQNCBOb3J0aHdvb2QpLiAgQnkgZGVmYXVsdCBpdCB3aWxsIGNvbXBpbGUgYXMgSVNPIEMgcG9ydGFibGUKICAgICAgICAgIGNvZGUgKHdoZW4gTFRNU1NFIGlzIHVuZGVmaW5lZCkuCiAgICAgICAtLSBGaXhlZCBidWcgaW4gbHRjX3RvbW1hdGguaCB3aGVyZSBJIGhhZCB0aGUga2FyYS90b29tIGN1dG9mZnMgbm90IG1hcmtlZCBhcyBgYGV4dGVybicnCiAgICAgICAgICBUaGFua3MgdG8gIlN0ZWZhbiBBcmVudHoiIDxzdGVmYW4gYXQgb3JnYW5pY25ldHdvcmsubmV0PgogICAgICAgLS0gU3RldmVuIERha2UgPHNjZEBicm9rZWQub3JnPiBhbmQgUmljaGFyZCBBbWFja2VyIDxyYW1hY2tlckB5YWhvby5jb20+IHN1Ym1pdHRlZCBwYXRjaGVzIHRvIAogICAgICAgICAgZml4IHBrY3NfNV8yKCkuICBJdCBub3cgbWF0Y2hlcyB0aGUgb3V0cHV0IG9mIGFub3RoZXIgY3J5cHRvIGxpYnJhcnkuICBXaG9vcHMuLi4gaGVoZWhlCiAgICAgICAtLSBVcGRhdGVkIFBSTkcgYXBpLiAgQWRkZWQgRm9ydHVuYSBQUk5HIHRvIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBQUk5HcwogICAgICAgLS0gRml4ZWQgdXAgdGhlIGRlc2NyaXB0b3IgdGFibGVzIHNpbmNlIGdsb2JhbHMgYXJlIGF1dG9tYXRpY2FsbHkgemVybydlZCBvbiBzdGFydHVwLgogICAgICAgLS0gQ2hhbmdlZCBSQzQgdG8gc3RvcmUgaXQncyBvdXRwdXQuICBJZiB5b3Ugd2FudCB0byBlbmNyeXB0IHdpdGggUkM0CiAgICAgICAgICB5b3UnbGwgaGF2ZSB0byBkbyB0aGUgWE9SIHlvdXJzZWxmLgogICAgICAgLS0gRml4ZWQgYnVmZmVyIG92ZXJmbG93cy9vdmVycnVucyBpbiB0aGUgSE1BQyBjb2RlLiAgCgogICAgICAgKysgQVBJIGNoYW5nZSBmb3IgdGhlIFBSTkdzIHRoZXJlIG5vdyBpcyBhIGRvbmUoKSBmdW5jdGlvbiBwZXIgUFJORy4gIFlvdQogICAgICAgICAgc2hvdWxkIGNhbGwgaXQgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCBhIHBybmcgc3RhdGUuICBTbyBmYXIgaXQncwogICAgICAgICAgbm90IGFic29sdXRlbHkgcmVxdWlyZWQgKHdvbid0IGNhdXNlIHByb2JsZW1zKSBidXQgaXMgYSBnb29kIGlkZWEgdG8KICAgICAgICAgIHN0YXJ0LiAgCgoKSnVuZSAyM3JkLCAyMDA0CnYwLjk3YSArKyBGaXhlZCBzZXZlcmFsIHBvdGVudGlhbGx5IGNyaXBwbGluZyBidWdzLi4uIFtyZWFkIG9uXQogICAgICAgLS0gRml4ZWQgYnVnIGluIE9BRVAgZGVjb2RlciB0aGF0IHdvdWxkIGluY29ycmVjdGx5IHJlcG9ydCAKICAgICAgICAgIGJ1ZmZlciBvdmVyZmxvd3MuIFtaaGkgQ2hlbl0KICAgICAgIC0tIEZpeGVkIGhlYWRlcnMgd2hpY2ggaGFkIHZhcmlvdXMgQysrIG1pc3NpbmcgW2V4dGVybiAiQyJdJ3MKICAgICAgIC0tIEFkZGVkICJleHRlcm4iIHRvIHNoYTM4NF9kZXNjIGRlc2NyaXB0b3Igd2hpY2ggSSByZW1vdmVkIGJ5IG1pc3Rha2UKICAgICAgIC0tIEZpeGVkIGJ1Z3MgaW4gRU5ESUFOX0JJRyBtYWNyb3MgdXNpbmcgdGhlIHdyb25nIGJ5dGUgb3JkZXIgW01hdHQgSm9obnN0b25dCiAgICAgICAtLSBVcGRhdGVkIHRpZ2VyLmMgYW5kIGRlcy5jIHRvIG5vdCBzaGFkb3cgInJvdW5kIiB3aGljaCBpcyBpbnRyaW5zaWMgb24KICAgICAgICAgIHNvbWUgQyBjb21waWxlcnMuCiAgICAgICAtLSBVcGRhdGVkIGRlbW9zL3Rlc3QvcnNhX3Rlc3QuYyB0byB0ZXN0IHRoZSBSU0EgZnVuY3Rpb25hbGl0eSBiZXR0ZXIKICAgICAgICsrIFRoaXMgdXBkYXRlIGhhcyBiZWVuIHRlc3RlZCB3aXRoIEdDQyBbdjMuMy4zXSwgSUNDIFt2OF0gYW5kIE1TVkMgW3Y2K1NQNl0gCiAgICAgICAgICBhbGwgb24gYSB4ODYgUDQgIFtHQ0MvSUNDIHRlc3RlZCBpbiBHZW50b28gTGludXgsIE1TVkMgaW4gV2luWFBdCiAgICAgICArKyBPdXRjb21lOiBUaGUgYnVnIFpoaSBDaGVuIHBvaW50ZWQgb3V0IGhhcyBiZWVuIGZpeGVkLiAgU28gaGF2ZSB0aGUgYnVncwogICAgICAgICAgdGhhdCBNYXR0IEpvaG5zdG9uIGZvdW5kLiAgCgpKdW5lIDE5dGgsIDIwMDQKdjAuOTcgIC0tIFJlbW92ZWQgc3B1cmlvdXMgdW51c2VkIGZpbGVzIFthcnJnIV0KICAgICAgIC0tIFBhdGNoZWQgYnVmZmVyIG92ZXJmbG93IGluIHRpbV9leHB0bW9kKCkKICAgICAgIC0tIEZpeGVkIGJ1ZmZlciBvdmVycnVuIGJ1ZyBpbiBwa2NzXzFfdjE1X2VzX2RlY29kZSgpCiAgICAgICAtLSBSZWR1Y2VkIHN0YWNrIHVzYWdlIGluIFBLQ1MgIzEgdjIuMCBwYWRkaW5nIGZ1bmN0aW9ucyAoYnkgc2V2ZXJhbCBLQnMpCiAgICAgICAtLSBSZW1vdmVkIHVzZWxlc3MgZXh0ZXJuJ3MgdGhhdCB3ZXJlIGFuIGFydGlmYWN0IGZyb20gdGhlIHByb2plY3Qgc3RhcnQuLi4gOy0pCiAgICAgICAtLSBSZXBsYWNlZCBtZW1jcHkvbWVtc2V0IHdpdGggWE1FTUNQWSBhbmQgWE1FTVNFVCBmb3IgZ3JlYXRlciBmbGV4aWJpbGl0eQogICAgICAgLS0gZml4ZWQgYnVncyBpbiBobWFjX2RvbmUoKS9obWFjX2luaXQoKS9bdmFyaW91cyBvdGhlcnMoKV0gd2hlcmUgSSBkaWRuJ3QgdHJhcCBlcnJvcnMgCiAgICAgICAtLSBSZWR1Y2VkIHN0YWNrIHVzYWdlIGluIE9NQUMvUE1BQy9ITUFDL0VBWC9PQ0IvUEtDUyM1IGJ5IG1hbGxvY2luZyBhbnkgc2lnbmlmaWNhbnQgc2l6ZWQKICAgICAgICAgIGFycmF5cyAoZS5nLiA+IDEwMCBieXRlcyBvciBzbykuICBPbmx5IGluIG5vbi1jcml0aWNhbCBmdW5jdGlvbnMgKGUuZy4gZWF4X2luaXQoKSkKICAgICAgIC0tICJaaGkgQ2hlbiIgPHpoaUBtYXNzaXZlaW5jb3Jwb3JhdGVkLmNvbT4gcG9pbnRlZCBvdXQgdGhhdCByc2FfZGVjcnlwdF9rZXkoKSByZXF1aXJlcwogICAgICAgICAgYW4gaW5jb3JyZWN0IG91dHB1dCBzaXplICh0b28gbGFyZ2UpLiAgRml4ZWQuCiAgICAgICAtLSBBZGRlZCBhICJwcmV0dHkiIHRhcmdldCB0byB0aGUgR0NDIG1ha2VmaWxlLiAgUmVxdWlyZXMgUEVSTC4gIEl0IGlzIE5FQVQhCiAgICAgICAtLSBNaW5vciB1cGRhdGVzIHRvIGNoMSBvZiB0aGUgbWFudWFsLgogICAgICAgLS0gQ2xlYW5lZCB1cCB0aGUgaW5kZW50YXRpb24gYW5kIGFkZGVkIGNvbW1lbnRzIHRvIHJzYV9tYWtlX2tleSgpLCByc2FfZXhwdG1vZCgpIGFuZCAKICAgICAgICAgIHJzYV92ZXJpZnlfaGFzaCgpCiAgICAgICAtLSBVcGRhdGVkIG1ha2VmaWxlLmljYyBzbyB0aGUgImluc3RhbGwiIHRhcmdldCB3b3VsZCB3b3JrIDstKQogICAgICAgLS0gUmVtb3ZlZCBkZW1vcy90ZXN0LmMgW2RlcHJlY2F0ZWQgZnJvbSBkZW1vcy90ZXN0L3Rlc3QuY10KICAgICAgIC0tIENoYW5nZWQgTUFYQkxPQ0tTSVpFIGZyb20gMTI4IHRvIDY0IHRvIHJlZmxlY3QgdGhlIHRydWUgc2l6ZS4uLgoKTWF5IDMwdGgsIDIwMDQKdjAuOTYgIC0tIFJlbW92ZWQgR0YgYW5kIEtleXJpbmcgY29kZQogICAgICAgLS0gRXh0ZW5kZWQgT0FFUCBkZWNvZGVyIHRvIGRpc3Rpbmd1aXNoIGJldHRlciBbYW5kIHVzZSBhIG1vcmUgdW5pZm9ybSBBUEldCiAgICAgICAtLSBDaGFuZ2VkIFBTUy9PQUVQIEFQSSBzbGlnaHRseSB0byBiZSBtb3JlIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBQSyBmdW5jdGlvbnMgKG9yZGVyIG9mIGFyZ3VtZW50cykKICAgICAgIC0tIHJzYV9leHB0bW9kKCkgbm93IHBhZHMgd2l0aCBsZWFkaW5nIHplcm9lcyBhcyBwZXIgSTJPU1AuCiAgICAgICAtLSBhZGRlZCBlcnJvciBjaGVja2luZyB0byB5YXJyb3cgY29kZQogICAgICAgLS0gIHBvaW50ZWQgb3V0IHRoYXQgdG9tbWF0aC5oIGZyb20gdGhpcyBkaXN0cm8gd2lsbCBvdmVyd3JpdGUgdG9tbWF0aC5oCiAgICAgICAgICBmcm9tIGxpYnRvbW1hdGguICBJIGNoYW5nZWQgdGhpcyB0byBsdGNfdG9tbWF0aC5oIHRvIGF2b2lkIGFueSBzdWNoIHByb2JsZW1zLgogICAgICAgLS0gRml4ZWQgYnVnIGluIFBTUyBlbmNvZGVyL2RlY29kZXIgdGhhdCBkaWRuJ3QgaGFuZGxlIHRoZSBNU0IgcHJvcGVybHkKICAgICAgIC0tIHJlZmFjdG9yZWQgQUVTLCBub3cgc3BvcnRzIGFuICJlbmNyeXB0IG9ubHkiIGRlc2NyaXB0b3Igd2hpY2ggdXNlcyBoYWxmIGFzIG11Y2ggY29kZSBzcGFjZS4KICAgICAgIC0tIG1vZGRlZCBZYXJyb3cgdG8gdHJ5IGFuZCB1c2UgcmVmYWN0b3JlZCBBRVMgY29kZSBhbmQgYWRkZWQgV0hJUkxQT09MIHN1cHBvcnQgKGQnb2gpIDstKQogICAgICAgLS0gdXBkYXRlZCBFQ0IsIE9DQiBhbmQgQ0JDIGRlY3J5cHQgZnVuY3Rpb25zIHRvIGRldGVjdCB3aGVuICJlbmNyeXB0IG9ubHkiIGRlc2NyaXB0b3IgaXMgdXNlZC4KICAgICAgIC0tIHJlcGxhY2VkIG9sZCBSU0EgY29kZSB3aXRoIG5ldyBjb2RlIHRoYXQgdXNlcyBQS0NTICMxIHYyLjAgcGFkZGluZwogICAgICAgLS0gcmVwbGFjZWQgb2xkIHRlc3QgaGFybmVzcyB3aXRoIG5ldyBvdmVyLWVuZ2luZWVyJ2VkIG9uZSBpbiAvZGVtb3MvdGVzdC8KICAgICAgIC0tIHVwZGF0ZWQgY2JjL2NmYi9vZmIvY3RyIGNvZGUgd2l0aCBzZXRpdi9nZXRpdiBmdW5jdGlvbnMgdG8gY2hhbmdlL3JlYWQgdGhlIElWIHdpdGhvdXQgcmUta2V5aW5nLgogICAgICAgLS0gQWRkZWQgUEtDUyAjMSB2MS41IFJTQSBlbmNyeXB0aW9uIGFuZCBzaWduYXR1cmUgcGFkZGluZyByb3V0aW5lcwogICAgICAgLS0gQWRkZWQgREVSIE9JRCdzIHRvIG1vc3QgaGFzaCBkZXNjcmlwdG9ycyAoYXMgbWFueSBhcyBJIGNvdWxkIGZpbmQpIAogICAgICAgLS0gbW9kZGVkIHJzYV9leHB0bW9kKCkgdG8gdXNlIHRpbWluZy1yZXNpbGllbnQgdGltX2V4cHRtb2QoKSB3aGVuIGRvaW5nIHByaXZhdGUga2V5IG9wZXJhdGlvbnMgCiAgICAgICAgICBhZGRlZCAjZGVmaW5lIFJTQV9USU1JTkcgd2hpY2ggY2FuIHR1cm4gb24vb2ZmIHRoaXMgZmVhdHVyZS4KICAgICAgIC0tIE5vIG1vcmUgY29uZmlnLnBsIHNvIHBsZWFzZSBqdXN0IHJlYWQgbXljcnlwdF9jdXN0b20uaCBmb3IgYnVpbGQtdGltZSB0d2Vha3MKICAgICAgIC0tIFNtYWxsIHVwZGF0ZSB0byByYW5kX3ByaW1lKCkKICAgICAgIC0tIFVwZGF0ZWQgc2hhMSwgbWQ1IGFuZCBzaGEyNTYgc28gdGhleSBhcmUgc21hbGxlciB3aGVuIFNNQUxMX0NPREUgaXMgZGVmaW5lZC4gIElmIHlvdSB3YW50IHNwZWVkIHRob3VnaCwKICAgICAgICAgIHlvdSdyZSBnb2luZyB0byBoYXZlIHRvIHVuZGVmaW5lIFNNQUxMX0NPREUgOy0pCiAgICAgICAtLSBXb3JrZWQgb3ZlciBBRVMgc28gdGhhdCBpdCdzIGV2ZW4gc21hbGxlciBub3cgW2luIGJvdGggbW9kZXNdLgogICAgICAgCk1heSAxMnRoLCAyMDA0CnYwLjk1ICAtLSBPcHRpbWl6ZWQgQUVTIGFuZCBXSElSTFBPT0wgZm9yIFNNQUxMX0NPREUgYnkgdGFraW5nIGFkdmFudGFnZSBvZiB0aGUgZmFjdAogICAgICAgICAgdGhlIHRyYW5zZm9ybXMgYXJlIGNpcmN1bGFudC4gIEFFUyBkcm9wcGVkIDVLQiBhbmQgV0hJUkxQT09MIGRyb3BwZWQgMTNLQgogICAgICAgICAgdXNpbmcgdGhlIGRlZmF1bHQgYnVpbGQgb3B0aW9ucyBvbiB0aGUgeDg2LgogICAgICAgLS0gVXBkYXRlZCBlYXggc28gdGhlIGVheF9kb25lKCkgd291bGQgY2xlYXIgdGhlIHN0YXRlIFtsaWtlIGhtYWMscG1hYyxvY2JdIHdoZW4KICAgICAgICAgIENMRUFOX1NUQUNLIGhhcyBiZWVuIGRlZmluZWQuCiAgICAgICAtLSBhZGRlZCBMVENfVEVTVCBzdXBwb3J0IHRvIHJtZDE2MAogICAgICAgLS0gdXBkYXRlcyB0byBteWNyeXB0X3BrLmgKICAgICAgIC0tIHVwZGF0ZWQgcmFuZF9wcmltZSgpIHRvIGZhY2lsaWF0ZSBtYWtpbmcgUlNBIGNvbXBvc2l0ZXMgCiAgICAgICAtLSBEU0EvUlNBIG5vdyBtYWtlcyBjb21wb3NpdGVzIG9mIHRoZSBleGFjdCBzaXplIGRlc2lyZWQuCiAgICAgICAtLSBSZWZhY3RvcmVkIHF1aXRlIGEgYml0IG9mIHRoZSBjb2RlLCBmZXdlciBmdW5jdGlvbnMgcGVyIEMgZmlsZQogICAgICAgLS0gY2xlYW5lZCB1cCB0aGUgbWFrZWZpbGVzIHRvIG9yZ2FuaXplIHRoZSBvYmplY3RzIGxvZ2ljYWxseQogICAgICAgLS0gYWRkZWQgSUNDIG1ha2VmaWxlIGFsb25nIHdpdGggInByb2ZpbGVkIiB0YXJnZXRzIGZvciBib3RoIEdOVSBhbmQgSUNDIGNvbXBpbGVycwogICAgICAgLS0gTWFya2VkIGZ1bmN0aW9ucyBmb3IgcmVtb3ZhbCBiZWZvcmUgdjEuMDAgc2VlIFBMQU4gZm9yIG1vcmUgaW5mb3JtYXRpb24KICAgICAgIC0tIEdDQyAzLjQuMCB0ZXN0ZWQgYW5kIHNlZW1zIHRvIHdvcmsKICAgICAgIC0tIEFkZGVkIFBLQ1MgIzUgc3VwcG9ydAogICAgICAgLS0gRml4ZWQgdHlwbyBpbiBjb21tZW50IGhlYWRlciBvZiAuQyBmaWxlcyAgOy0pCiAgICAgICAtLSBBZGRlZCBQS0NTICMxIE9BRVAgYW5kIFBTUyBzdXBwb3J0LiAgCiAgICAgICAKRmViIDIwdGgsIDIwMDQKdjAuOTQgIC0tIHJlbW92ZWQgdW51c2VkIHZhcmlhYmxlcyBmcm9tIG9jYi5jIGFuZCBmaXhlZCBpdCB0byBtYXRjaCBrbm93biB0ZXN0IHZlY3RvcnMuCiAgICAgICAtLSBBZGRlZCBQTUFDIHN1cHBvcnQsIG1pbm9yIGNoYW5nZXMgdG8gT01BQy9FQVggY29kZSBbSSB0aGluay4uLi5dCiAgICAgICAtLSBUZWFtZWQgdXAgd2l0aCBCcmlhbiBHbGFkbWFuLiAgSGlzIGNvZGUgdmVyaWZpZXMgYWdhaW5zdCBteSB2ZWN0b3JzIGFuZCBteSBjb2RlCiAgICAgICAgICB2ZXJpZmllcyBhZ2FpbnN0IGhpcyB0ZXN0IHZlY3RvcnMuICBIYXphYSBmb3IgY28tb3BlcmF0aW9uIQogICAgICAgLS0gVmFyaW91cyBzbWFsbCBjaGFuZ2VzIChhZGRlZCBtaXNzaW5nIEFSR0NIS3MgYW5kIGNsZWFuZWQgdXAgaW5kZW50YXRpb24pCiAgICAgICAtLSBPcHRpbWl6YXRpb24gdG8gYmFzZTY0LCByZW1vdmVkIHVudXNlZCB2YXJpYWJsZSAiYyIKICAgICAgIC0tIEFkZGVkIGJhc2U2NCBnZW4gdG8gZGVtb3MvdHZfZ2VuLmMKICAgICAgIC0tIEZpeCB0byBkZW1vcy94ODZfcHJvZi5jIHRvIGNvcnJlY3RseSBpZGVudGlmeSB0aGUgaTM4NiBhcmNoaXRlY3R1cmUuLi4gd2VpcmQuLi4KICAgICAgIC0tIEZpeGVkIHVwIGFsbCBvZiB0aGUgUEsgY29kZSBieSBhZGRpbmcgbWlzc2luZyBlcnJvciBjaGVja2luZywgcmVtb3ZlZCAicmVzIiB2YXJpYWJsZXMsCiAgICAgICAgICBzaHJ1bmsgc29tZSBzdGFjayB2YXJpYWJsZXMsIHJlbW92ZWQgbm9uLXJlcXVpcmVkIHN0YWNrIHZhcmlhYmxlcyBhbmQgYWRkZWQgcHJvcGVyCiAgICAgICAgICBlcnJvciBjb252ZXJzaW9uIGZyb20gTVBJIHRvIExUQyBjb2Rlcy4gIEkgYWxzbyBzcG90dGVkIGEgZmV3ICJvZmYgYnkgb25lIiBlcnJvcgogICAgICAgICAgY2hlY2tpbmcgd2hpY2ggY291bGQgaGF2ZSBiZWVuIHVzZWQgdG8gZm9yY2UgdGhlIGNvZGUgdG8gcmVhZCBwYXN0IHRoZSBlbmQgb2YKICAgICAgICAgIHRoZSBidWZmZXIgKGluIHRoZW9yeSwgaGF2ZW4ndCBjaGVja2VkIGlmIGl0IHdvdWxkIHdvcmspIGJ5IGEgZmV3IGJ5dGVzLgogICAgICAgLS0gQWRkZWQgY2hlY2tzIHRvIE9VVFBVVF9CSUdOVU0gc28gdGhlICpfZXhwb3J0KCkgZnVuY3Rpb25zIGNhbm5vdCBvdmVyZmxvdyB0aGUgb3V0cHV0IGFuZCBJIAogICAgICAgICAgYWxzbyBtb2RkZWQgaXQgc28gaXQgc3RvcmVzIGluIHRoZSBvdXRwdXQgcHJvdmlkZWQgdG8gdGhlIGZ1bmN0aW9uICh0aGF0IGlzIG5vdCBvbgogICAgICAgICAgdGhlIGxvY2FsIHN0YWNrKSB3aGljaCBzYXZlcyBtZW1vcnkgYW5kIHRpbWUuCiAgICAgICAtLSBNYWRlIFNBRkVSIGRlZmF1bHQgdG8gZGlzYWJsZWQgZm9yIG5vdyAocGxhbnMgYXJlIHRvIGNsZWFuaG91c2Ugd3JpdGUgYW4gaW1wbGVtZW50YXRpb24gbGF0ZXIpCiAgICAgICAtLSBBZGRlZCB0aGUgNTEyLWJpdCBvbmUtd2F5IGhhc2ggV0hJUkxQT09MIHdoaWNoIGNsb2NrcyBpbiBhdCAxMzggY3ljbGVzIHBlciBieXRlIG9uIG15CiAgICAgICAgICBBdGhsb24gWFAgW2ZvciBjb21wYXJpc29uLCBTSEEtNTEyIGNsb2NrcyBpbiBhdCA3NyBjeWNsZXMgcGVyIGJ5dGVdLiAgVGhpcyBjb2RlIHVzZXMgdGhlIAogICAgICAgICAgdGVhbXMgbmV3IHNib3ggZGVzaWduIChub3QgdGhlIG9yaWdpbmFsIE5FU1NJRSBvbmUpLgogICAgICAKCkphbiAyNXRoLCAyMDA0CnYwLjkzICAtLSBbbm90ZTogZGVsZXRlZCB2MC45MyBjaGFuZ2VzIGJ5IGFjY2lkZW50Li4uIHJlY3JlYXRpbmcgZnJvbSBtZW1vcnkuLi5dCiAgICAgICAtLSBGaXggdG8gUkMyIHRvIG5vdCBkZWZlcmVuY2UgcG9pbnRlciBiZWZvcmUgQVJHQ0hLCiAgICAgICAtLSBGaXggdG8gTk9FS0VPTiB0byBtYXRjaCBwdWJsaXNoZWQgdGVzdCB2ZWN0b3JzIGFzIHdlbGwgYXMgY2xlYW5lZCB1cCB0aGUgY29kZSBhIGJpdAogICAgICAgLS0gT3B0aW1pemVkIFR3b2Zpc2ggW2Rvd24gdG8gMjggY3ljbGVzL2J5dGUgb24gbXkgYm94XSBhbmQgQmxvd2Zpc2gKICAgICAgIC0tIEZpeCB0byBPTUFDIHRvIHRlc3QgY2lwaGVyIGJsb2NrIHNpemUgZmlyc3QgW3ByZXZlbnRzIHdhc3RpbmcgYW55IHRpbWVdCiAgICAgICAtLSBBZGRlZCBtb3JlIE9NQUMgdGVzdCB2ZWN0b3JzCiAgICAgICAtLSBBZGRlZCBFQVggRW5jcnlwdCtBdXRoZW50aWNhdGUgc3VwcG9ydAogICAgICAgLS0gRml4IHRvIERTQSB0byBjaGVjayByZXR1cm4gb2YgYSBmZXcgTFRNIGZ1bmN0aW9ucyBJIGZvcmdvdCBbbXBfdG9fdW5zaWduZWRfYmluXQogICAgICAgLS0gQWRkZWQgY29tbW9uIGhlYWRlcnMgdG8gYWxsIEMgZmlsZXMKICAgICAgIC0tIENUUiBtb2RlIHN1cHBvcnRzIGJpZyBhbmQgbGl0dGxlIFtkZWZhdWx0XSBlbmRpYW4gY291bnRlcnMgbm93LiAgCiAgICAgICAtLSBmaXggdG8gZmluZF9jaXBoZXJfYW55KCkgc28gdGhhdCBpdCBjYW4gaGFuZGxlIGEgZnJhZ21lbnRlZCBjaXBoZXJfZGVzY3JpcHRvciB0YWJsZS4KICAgICAgIC0tIGFkZGVkIGZpbmRfaGFzaF9hbnkoKSBha2luIHRvIGZpbmRfY2lwaGVyX2FueSgpLgogICAgICAgLS0gQWRkZWQgRUFYIGNvZGUgdG8gZGVtb3MvdHZfZ2VuLmMgIEhhemFhISAKICAgICAgIC0tIFJlbW92ZWQgU09OWSBkZWZpbmVzIGFuZCBmaWxlcyBmcm9tIGNvZGViYXNlLgogICAgICAgLS0gQWRkZWQgT0NCIHN1cHBvcnQgW3BhdGVudHMgYmUgZGFtbmVkXSBhbmQgdG8gZGVtb3MvdHZfZ2VuLmMKICAgICAgIC0tIE1lcmdlIGFsbCBvZiB0aGUgSU5QVVQvT1VUUFVUIEJJR05VTSBtYWNyb3MgKGxlc3MgdG9jKSBpbnRvIG15Y3J5cHRfcGsuaAogICAgICAgLS0gTWFkZSBhcHByb3ByaWF0ZSBjaGFuZ2VzIHRvIHRoZSBkZWJ1ZyBzdHJpbmcgaW4gY3J5cHQuYwoKRGVjIDI0dGgsIDIwMDMKdjAuOTIgIC0tIFVwZGF0ZWQgdGhlIGNvbmZpZy5wbCBzY3JpcHQgc28gdGhlIG9wdGlvbnMgaGF2ZSBtb3JlIGRldGFpbHMuCiAgICAgICAtLSBVcGRhdGVkIGRlbW9zL3R2X2dlbiB0byBpbmNsdWRlIFJJUEVNRCBoYXNoZXMKICAgICAgIC0tIFVwZGF0ZWQgVHdvZmlzaCBzbyB3aGVuIFRXT0ZJU0hfQUxMX1RBQkxFUyBpcyBkZWZpbmVkIGEgcHJlLWNvbXB1dGVkIFJTIHRhYmxlCiAgICAgICAgICBpcyBpbmNsdWRlZCBbc3BlZWR1cDogc2xpZ2h0LCBhYm91dCA0ayBjeWNsZXMgb24gbXkgQXRobG9uXS4KICAgICAgIC0tIFJlLXdyb3RlIHRoZSB0d29maXNoIGxhcmdlIGtleSBnZW5lcmF0aW9uIFt0aGUgZm91ciA4eDMyIGtleSBkZXBlbmRlbnQgdGFibGVzXS4gIE5vdyBhYm91dCB0d2ljZSBhcyBmYXN0LgogICAgICAgICAgV2l0aCBib3RoIG9wdGltaXphdGlvbnMgW2UuZy4gVFdPRklTSF9BTExfVEFCTEVTIGRlZmluZWRdIGEgMTI4LWJpdCBUd29maXNoIGtleSBjYW4gbm93IGJlIHNjaGVkdWxlZAogICAgICAgICAgaW4gMjYsMDAwIGN5Y2xlcyBvbiBteSBBdGhsb24gWFAgW2FzIG9wcG9zZWQgdG8gNDksMDAwIGJlZm9yZV0gd2hlbiBvcHRpbWl6ZWQgZm9yIHNpemUuCiAgICAgICAtLSBjb25maWcucGwgaGFzIGJlZW4gdXBkYXRlZCBzbyBybWQxMjgubyBhbmQgcm1kMTYwLm8gYXJlIG9iamVjdHMgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkIFtvb3BzXQogICAgICAgLS0gQW5kcmV3IE1hbm4gZm91bmQgYSBidWcgaW4gcnNhX2V4cHRtb2QoKSB3aGljaCB3b3VsZG4ndCBpbmRpY2F0ZSBpZiB0aGUgd3JvbmcgdHlwZSBvZiBrZXkgd2FzIHNwZWNpZmllZAogICAgICAgICAgKGUuZy4gbm90IFBLX1BSSVZBVEUgb3IgUEtfUFVCTElDKQogICAgICAgLS0gRml4ZWQgdXAgZGVtb3MveDg2X3Byb2Ygc28gaXQgc29ydHMgdGhlIG91dHB1dCBub3cgOi0pICAKICAgICAgIC0tIFRoZSBwcm9qZWN0IGlzIG5vdyBwb3dlcmVkIGJ5IHJhZGlvYWN0aXZlIHJ1YmJlciBwYW50cy4KICAgICAgIC0tIEZpeGVkIGRoX2VuY3J5cHRfa2V5KCkgc28gaWYgeW91IHBhc3MgaXQgYSBoYXNoIHdpdGggYSBzbWFsbGVyIG91dHB1dCB0aGFuIHRoZSBpbnB1dCBrZXkgaXQgCiAgICAgICAgICB3aWxsIHJldHVybiBDUllQVF9JTlZBTElEX0hBU0ggW3RvIG1hdGNoIHdoYXQgZWNjX2VuY3J5cHRfa2V5KCkgd2lsbCBkb10KICAgICAgIC0tIE1lcmdlIHRoZSBzdG9yZS9lbmNyeXB0IGtleSBwYXJ0IG9mIGVjY19lbmNyeXB0X2tleSgpIGFzIHBlciBkaF9lbmNyeXB0X2tleSgpIFtjYW4geW91IGd1ZXNzIHdoYXQgSSdtIHVwdG8/XQogICAgICAgLS0gTWFzc2l2ZSB1cGRhdGVzIHRvIHRoZSBwcmltZSBnZW5lcmF0aW9uIGNvZGUuICBJIHVzZSB0aGUgTFRNIHJhbmRvbSBwcmltZSBmdW5jdGlvbnMgW2FuZCBwcm92aWRlIGEgbmljZSAKICAgICAgICAgIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBMVEMgUFJORydzIGFuZCB0aGUgTFRNIGdlbmVyaWMgcHJuZyBwcm90b3R5cGVdLiAgSSBhbHNvIHVzZSBhIHZhcmlhYmxlIG51bWJlciBvZiB0ZXN0cwogICAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSBpbnB1dCBzaXplLiAgVGhpcyBuaWNlbHkgc3BlZWRzIHVwIG1vc3QgcHJpbWUgZ2VuZXJhdGlvbi90ZXN0aW5nIHdpdGhpbiB0aGUgbGlicmFyeS4KICAgICAgIC0tIEFkZGVkIFNIQS0yMjQgdG8gdGhlIGxpc3Qgb2YgaGFzaGVzLgogICAgICAgLS0gTWFkZSBITUFDIHRlc3QgdmVjdG9ycyBjb25zdGFudCBhbmQgc3RhdGljIFt0YWtlcyBST00gc3BhY2UgaW5zdGVhZCBvZiBSQU1dCiAgICAgICAtLSBUaGlzIHJlbGVhc2Ugd2FzIGJyb3VnaHQgdG8geW91IGJ5IHRoZSBsZXR0ZXIgUCB3aGljaCBzdGFuZHMgZm9yIFBhdGVudCBJbmZyaW5nZW1lbnQuCiAgICAgICAtLSBBZGRlZCBnZW5lcmljIEhBU0hfUFJPQ0VTUyBtYWNybyB0byBteWNyeXB0X2hhc2guaCB3aGljaCBzaW1wbGlmaWVzIHRoZSBoYXNoICJwcm9jZXNzIiBmdW5jdGlvbnMKICAgICAgICAgIEkgYWxzbyBvcHRpbWl6ZWQgdGhlIGNvbXByZXNzaW9uIGZ1bmN0aW9ucyBvZiBhbGwgYnV0IE1EMiB0byBub3QgcGVyZm9ybSBpbnB1dCBjb3BpZXMgd2hlbiBhdm9pZGFibGUuCiAgICAgICAtLSBSZW1vdmVkIHRoZSBkaXZpc2lvbiBmcm9tIHRoZSBCbG93ZmlzaCBzZXR1cCBmdW5jdGlvbiBbZHJvcHBlZCAzayBjeWNsZXMgb24gbXkgQXRobG9uXQogICAgICAgLS0gQWRkZWQgc3RhY2sgY2xlYW5pbmcgdG8gcmlqbmRhZWwsIGNhc3Q1IHNvIG5vdyBhbGwgY2lwaGVycyBoYXZlIENMRUFOX1NUQUNLIGNvZGUuICAKICAgICAgIC0tIEFkZGVkIFNraXBqYWNrIHRvIHRoZSBsaXN0IG9mIGNpcGhlcnMgW21hZGUgYXBwcm9wcmlhdGUgY2hhbmdlcyB0byBkZW1vcy90ZXN0LmMsIGRlbW9zL3R2X2dlbi5jIGFuZCAKICAgICAgICAgIGRlbW9zL3g4Nl9wcm9mLmNdCiAgICAgICAtLSBBZGRlZCBtZWNoYW5pY2FsIHRlc3RpbmcgdG8gY2lwaGVyIHRlc3QgdmVjdG9yIHJvdXRpbmVzLiAgTm93IGl0IGVuY3J5cHRzIDEwMDAgdGltZXMsIHRoZW4gZGVjcnlwdHMgYW5kCiAgICAgICAgICBjb21wYXJlcy4gIEFueSBmYXVsdCAoZS5nLiBidWcgaW4gY29kZSwgY29tcGlsZXIpIGluIHRoZSByb3V0aW5lcyBpcyBsaWtlbHkgdG8gc2hvdyB0aHJvdWdoLiAgRG9lc24ndAogICAgICAgICAgc3RyZXNzIHRlc3QgdGhlIGtleSBnZW4gdGhvdWdoLi4uCiAgICAgICAtLSBNYXR0IEpvaG5zb24gZm91bmQgYSBidWcgaW4gdGhlIGJsb3dmaXNoLmMgIGFwcGFyZW50bHkgSSB3YXMgb3V0IG9mIG15IG1pbmQgYW5kIHB1dCB0d29maXNoIGRlZmluZXMgaW4gdGhlcmUgCiAgICAgICAgICBUaGUgY29kZSBub3cgYnVpbGRzIHdpdGggYW55IGNvbmZpZy4gIFRoYW5rcy4KICAgICAgIC0tIEFkZGVkIE9NQUMxIE1lc3NhZ2UgQXV0aGVudGljYXRpb24gQ29kZSBzdXBwb3J0IHRvIHRoZSBsaWJyYXJ5LgogICAgICAgLS0gUmUtcHJvdG90eXBlZCB0aGUgaGFzaCAicHJvY2VzcyIgYW5kICJkb25lIiB0byBwcmV2ZW50IGJ1ZmZlciBvdmVyZmxvd3MgW3doaWNoIGRvbid0IHNlZW0gZWFzeSB0byBleHBsb2l0XS4gIAogICAgICAgICAgVXBkYXRlZCBITUFDIGNvZGUgdG8gdXNlIHRoZW0gdG9vLiAgSGF6YWEhCiAgICAgICAtLSBGaXhlZCBidWcgaW4gRUNDIGNvZGUgd2hpY2ggd291bGRuJ3QgZG8gYW4gX0FSR0NISyBvbiBzdGF0IGluIGVjY192ZXJpZnlfaGFzaCgpLgogICAgICAgLS0gRml4ZWQgW3RlbXAgZml4XSBidWcgaW4gYWxsIFBLIHdoZXJlIHRoZSBPVVRQVVRfQklHTlVNIG1hY3JvcyB3b3VsZCBub3QgdHJhcCBlcnJvcnMgb24gdGhlIHRvX3Vuc2lnbmVkX2JpbiAKICAgICAgICAgIGNvbnZlcnNpb24gW25vdyByZXR1cm5zIENSWVBUX01FTSwgd2lsbCBmaXggaXQgdXAgYmV0dGVyIGxhdGVyXQogICAgICAgLS0gQWRkZWQgRFNBIHRvIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBQSyBhbGdvcml0aG1zLiAgCiAgICAgICAtLSBGaXhlZCB1cCB2YXJpb3VzIGNpcGhlcnMgdG8gJjI1NSB0aGUgaW5wdXQga2V5IGJ5dGVzIHdoZXJlIHJlcXVpcmVkIFtlLmcuIHdoZXJlIHVzZWQgdG8gaW5kZXggYSB0YWJsZV0gdG8gcHJldmVudAogICAgICAgICAgcHJvYmxlbXMgb24gcGxhdGZvcm1zIHdoZXJlIENIQVJfQklUICE9IDggCiAgICAgICAtLSBNZXJnZWQgaW4gTGliVG9tTWF0aCB2MC4yOAogICAgICAgLS0gVXBkYXRlZCBkZW1vcy94ODZfcHJvZi5jIHRvIHVzZSBZYXJyb3cgZHVyaW5nIHRoZSBrZXkgc2NoZWQgdGVzdGluZyBbd2FzIGhvcnJpYmx5IHNsb3cgb24gcGxhdGZvcm1zIHdpdGggYmxvY2thYmxlCiAgICAgICAgICAvZGV2L3JhbmRvbV0uIAogICAgICAgLS0gQWRkZWQgT01BQy9ITUFDIHRlc3RzIHRvIGRlbW9zL3R2X2dlbiBhbmQgSSBub3cgc3RvcmUgdGhlIG91dHB1dCBvZiB0aGlzIGluIG5vdGVzLyAKICAgICAgIC0tIEZpeGVkIGEgYnVnIGluIGNvbmZpZy5wbCB0aGF0IHdvdWxkbid0IGhhdmUgVFdPRklTSF9UQUJMRVMgZGVmaW5lZCBieSBkZWZhdWx0ICh0b28gbWFueSBjb21tYXMgb24gdGhlIGxpbmUpCiAgICAgICAtLSBGaXhlZCBidWcgaW4gaG1hY19kb25lKCkuICBBcHBhcmVudGx5IEZJUFMtMTk4IFtITUFDXSBzcGVjaWZpZXMgdGhhdCB0aGUgb3V0cHV0IGNhbiBiZSB0cnVuY2F0ZWQuICBNeSBjb2RlCiAgICAgICAgICB3b3VsZCBub3Qgc3VwcG9ydCB0aGF0IChkb2VzIG5vdyBqdXN0IGxpa2UgdGhlIG5ldyBPTUFDIGNvZGUpLgogICAgICAgLS0gUmVtb3ZlZCAiaGFzaHNpemUiIGZyb20gaG1hY19zdGF0ZSBhcyBpdCB3YXNuJ3QgYmVpbmcgdXNlZC4KICAgICAgIC0tIE1hZGUgZGVtb3MvdGVzdC5jIHN0b3AgaWYgT01BQyBvciBITUFDIHRlc3RzIGZhaWwgKGluc3RlYWQgb2YganVzdCBwcmludGluZyBhIGZhaWxlZCBtZXNzYWdlIGFuZCBrZWVwIGdvaW5nKS4KICAgICAgIC0tIFVwZGF0ZWQgbm90ZXMvdGVjaDAwMDMudHh0IHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBleGlzdGVuY2Ugb2YgU2tpcGphY2sgW2Fsc28gSSBmaXhlZCBhIGZldyB0eXBvc10uCiAgICAgICAtLSBTbGlnaHQgY2hhbmdlcyB0byBOb2VrZW9uLCB3aXRoIFNNQUxMX0NPREUgdW5kZWZpbmVkIGl0IHVzZXMgYSBmdWxseSB1bnJvbGxlZCB2ZXJzaW9uLiAgRHJvcHBlZCArMTAgY3ljbGVzL2J5dGUKICAgICAgICAgIG9uIG15IEF0aGxvbiAoMzUgY3ljbGVzIHBlciBieXRlIG9yIDQxMC40TWJpdC9zZWMgYXQgMTc5NU1oeikKICAgICAgIC0tIEFkZGVkIF9BUkdDSEsoKSBjYWxscyB0byBpc19wcmltZSgpIGZvciB0aGUgdHdvIGlucHV0IHBvaW50ZXJzLgoKU2VwdCAyNXRoLCAyMDAzCnYwLjkxICAtLSBITUFDIGZpeCBvZiAwLjkwIHdhcyBpbmNvcnJlY3QgZm9yIGtleXMgbGFyZ2VyIHRoYW4gdGhlIGJsb2NrIHNpemUgb2YgdGhlIGhhc2guCiAgICAgICAtLSBBZGRlZCBlcnJvciBDUllQVF9GSUxFX05PVEZPVU5EIGZvciB0aGUgZmlsZSBbaG1hYy9oYXNoXSByb3V0aW5lcy4KICAgICAgIC0tIEFkZGVkIFJJUEVNRCBoYXNoZXMgdG8gdGhlIGhhc2hzdW0gZGVtby4KICAgICAgIC0tIEFkZGVkIGhhc2hzdW0gZGVtbyB0byBNU1ZDIG1ha2VmaWxlLgogICAgICAgLS0gQWRkZWQgUk1EMTYwIHRvIHRoZSB4ODZfcHJvZiBkZW1vIFtvb3BzXQogICAgICAgLS0gTWVyZ2VkIGluIExpYlRvbU1hdGgtMC4yNyB3aXRoIGEgcGF0Y2ggdG8gbXBfc2hyaW5rKCkgdGhhdCB3aWxsIGJlIGluIExpYlRvbU1hdGgtMC4yOAogICAgICAgICAgRml4ZXMgYW5vdGhlciBwb3RlbnRpYWwgbWVtb3J5IGxlYWsuCgpTZXB0IDd0aCwgMjAwMwp2MC45MCAgLS0gbmV3IFJPTC9ST1IgZm9yIHg4NiBHQ0MKICAgICAgIC0tIEpvY2hlbiBLYXR6IHN1Ym1pdHRlZCBhIHBhdGNoIHRvIHRoZSBtYWtlZmlsZSB0byBwcmV2ZW50ICJtYWtlIiBmcm9tIG1ha2luZyB0aGUgLmEgbGlicmFyeQogICAgICAgICAgd2hlbiBub3QgcmVxdWlyZWQuCiAgICAgICA9PSBCeSBkZWZhdWx0IHRoZSBLUiBjb2RlIGlzIG5vdCBlbmFibGVkIFtpdCdzIG9ubHkgYSBkZW1vIGFueXdheXMhXQogICAgICAgLS0gY2hhbmdlZCB0aGUgImJ1ZiIgaW4gZWNjX21ha2Vfa2V5IGZyb20gNEtCIHRvIDEyOCBieXRlcyBbc2luY2UgdGhlIGxhcmdlc3Qga2V5IGlzIDY1IGJ5dGVzXQogICAgICAgLS0gaG1hY19kb25lKCkgbm93IHJlcXVpcmVzIHlvdSBwYXNzIGl0IHRoZSBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgdG8gcHJldmVudAogICAgICAgICAgYnVmZmVyIG92ZXJmbG93cy4gIChBUEkgQ0hBTkdFKQogICAgICAgLS0gaG1hYy9oYXNoIGZpbGViYXNlZCByb3V0aW5lcyBub3cgcmV0dXJuIENSWVBUX05PUCBpZiBOT19GSUxFIGlzIGRlZmluZWQuCiAgICAgICAtLSBJJ3ZlIHJlbW92ZWQgdGhlIHByaW1lcyBmcm9tIGRoLmMgYW5kIHJlcGxhY2VkIHRoZW0gd2l0aCBEUiBzYWZlIHByaW1lcyBzdWl0YWJsZSBmb3IgdGhlIGRlZmF1bHQKICAgICAgICAgIGNvbmZpZ3VyYXRpb24gb2YgTGliVG9tTWF0aC4gIENoZWNrIG91dCB0aGVzZSBjb21wYXJpc29ucyBvbiBhIDEuM0doeiBBdGhsb24gWFAsIG9wdGltaXplZCBmb3Igc2l6ZSwKCjc2OC1iaXQsICAgICA0IHZzLiAgMTAKMTAyNC1iaXQsICAgIDggdnMuICAxOAoxMjgwLWJpdCwgICAxMiB2cy4gIDM0CjE1MzYtYml0LCAgIDIwIHZzLiAgNTYKMTc5Mi1iaXQgICAgMjggdnMuICA4OAoyMDQ4LWJpdCwgICA0MCB2cy4gMTI0CjI1NjAtYml0LCAgIDcxIHZzLiAyMzQKMzA3Mi1iaXQsICAxMTMgdnMuIDM4Ngo0MDk2LWJpdCwgIDI4MyB2cy4gOTE2CgogICAgICAgICAgVGltZXMgYXJlIGFsbCBpbiBtaWxsaXNlY29uZHMgZm9yIGtleSBnZW5lcmF0aW9uLiAgTmV3IHByaW1lcyB0aW1lcyBvbiB0aGUgbGVmdC4gIFRoaXMgbWFrZXMgdGhlIGNvZGUgYmluYXJ5CiAgICAgICAgICBpbmNvbXBhdGlibGUgd2l0aCBwcmV2aW91cyByZWxlYXNlcy4gIEhvd2V2ZXIsIHRoaXMgYWRkaXRpb24gaXMgbG9uZyBvdmVyZHVlIGFzIExpYlRvbU1hdGggaGFzIHN1cHBvcnRlZCBEUgogICAgICAgICAgcmVkdWN0aW9ucyBmb3IgcXVpdGUgc29tZSB0aW1lLgogICAgICAgLS0gQWRkZWQgUklQRS1NRCAxMjggYW5kIDE2MCB0byB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgaGFzaGVzIFsxMCBpbiB0b3RhbF0uCiAgICAgICAtLSBUaGUgcHJvamVjdCBoYXMgYmVlbiByZWxlYXNlZCBhcyBwdWJsaWMgZG9tYWluLiAgVERDQUwgbm8gbG9uZ2VyIGFwcGxpZXMuCgpKdWx5IDE1dGgsIDIwMDMKdjAuODkgIC0tIEZpeCBhIGJ1ZyBpbiBiaXRzLmMgd2hpY2ggd291bGQgcHJldmVudCBpdCBmcm9tIGJ1aWxkaW5nIHdpdGggbXN2YwogICAgICAgLS0gTWVyZ2VkIGluIExpYlRvbU1hdGggdjAuMjQgW2FuZCBJIHVzZWQgdGhlIGFsbG9jL2ZyZWUgbWFjcm9zIHRoaXMgdGltZSFdCiAgICAgICAtLSBSZW1vdmVkIHRoZSBMVEMgdmVyc2lvbiBvZiBuZXh0X3ByaW1lKCkgYW5kIHJlcGxhY2VkIGl0IHdpdGggYSBjYWxsIHRvIHRoZQogICAgICAgICAgbXBfcHJpbWVfbmV4dF9wcmltZSgpIGZyb20gTGliVG9tTWF0aAogICAgICAgLS0gcmV2ZXJ0ZWQgYml0cy5jIHRvIHRoZSAwLjg2IGNvcHkgc2luY2UgdGhlIG5ldyBvbmUgZG9lc24ndCBidWlsZCBpbiBNU1ZDCiAgICAgICAgICBvciBjeWd3aW4uCgpKdWwgMTB0aCwgMjAwMwp2MC44OCAgLS0gU3BlZCB1cCBDQVNUNSBrZXkgc2NoZWR1bGUgZm9yIE1TVkMKICAgICAgIC0tIGFkZGVkICJ1bG9uZzMyIiB3aGljaCBhbGxvd3MgcGVvcGxlIG9uIDY0LWJpdCBwbGF0Zm9ybXMgdG8gZm9yY2UgdGhlIDMyLWJpdCB0YWJsZXMgaW4KICAgICAgICAgIGNpcGhlcnMgbGlrZSBibG93ZmlzaCBhbmQgQUVTIHRvIGJlIDMyLWJpdHMuICBFLmcuIHdoZW4gdW5zaWduZWQgbG9uZyBpcyA2NC1iaXRzLgogICAgICAgLS0gT3B0aW1pemVkIHRoZSBTQUZFUi1TSzY0LCBTQUZFUi1TSzEyOCwgU0FGRVIrLCBSQzUgYW5kIFJDNiBrZXkgc2NoZWR1bGUgW2JpZyB0aW1lIV0KICAgICAgIC0tIE9wdGltaXplZCBTSEEtMSBhbmQgU0hBLTI1NiBxdWl0ZSBhIGJpdCB0b28uCiAgICAgICAtLSBGaXhlZCB1cCB0aGUgbWFrZWZpbGUgdG8gdXNlIC1mb21pdC1mcmFtZS1wb2ludGVyIG1vcmUgbGliZXJhbGx5CiAgICAgICAtLSBBZGRlZCB0dl9nZW4gcHJvZ3JhbSB3aGljaCBtYWtlcyB0ZXN0IHZlY3RvcnMgZm9yIGNpcGhlcnMvaGFzaGVzCiAgICAgICAtLSBNZXJnZWQgaW4gTGliVG9tTWF0aCB2MC4yMgogICAgICAgCkp1biAxOXRoLCAyMDAzCnYwLjg3ICAtLSBNYW55IE1TVkMgb3B0aW1pemF0aW9ucyB0byB0aGUgY29kZSBiYXNlCiAgICAgICAtLSBJbXByb3ZlZCB0aGUgQUVTIGFuZCBUd29maXNoIGtleSBzY2hlZHVsZSBbZmFzdGVyLCBtb3JlIGNvbnN0YW50IHRpbWVdCiAgICAgICAtLSBUb25zIG9mIG9wdGltaXphdGlvbnMgaGVyZSBhbmQgdGhlcmUuICAKICAgICAgIApKdW4gMTV0aCwgMjAwMwp2MC44NiAgLS0gRml4ZWQgdXAgQUVTIHRvIHdvcmthcm91bmQgTVNWQyBvcHRpbWl6ZXIgYnVnCiAgICAgICAtLSBNZXJnZWQgaW4gZnJlc2ggTFRNIGJhc2UgW2Jhc2VkIG9uIHYwLjIwXSBzbyB0aGVyZSBhcmUgbm8gd2FybmluZ3Mgd2l0aCBNU1ZDCiAgICAgICAtLSBXcm90ZSB4ODZfcHJvZiB3aGljaCB3aWxsIHRpbWUgdGhlIGhhc2hlcyBhbmQgY2lwaGVycyBkb3dudG8gY3ljbGVzIHBlciBieXRlLgogICAgICAgLS0gRml4ZWQgdXAgZGVtb3MvZW5jcnlwdCB0byByZW1vdmUgc2VycGVudF9kZXNjIGZyb20gdGhlIGxpc3QKICAgICAgIC0tIFJlLWVuYWJsZWQgTVNWQyBvcHRpbWl6YXRpb25zIHcwMHQgdzAwdAogICAgICAgLS0gUmVwbGFjZWQgImVycm5vIiB3aXRoICJlcnIiIGluIGFsbCBmdW5jdGlvbnMgdGhhdCBoYWQgaXQgc28gaXQgd291bGRuJ3QgY2xhc2gKICAgICAgICAgIHdpdGggdGhlIGdsb2JhbCAiZXJybm8iCiAgICAgICAtLSBSZW1vdmVkIGEgc2V0IG9mIHVudXNlZCB2YXJpYWJsZXMgZnJvbSBjZXJ0YWluIGZ1bmN0aW9ucwogICAgICAgLS0gUmVtb3ZlZCB7I2xpbmUgMCAiLi4uIn0gc3R1ZmYgZnJvbSBtcGkuYyB0byBjb21wbHkgd2l0aCBJU08gQyAgOi0pCiAgICAgICAKSnVuIDExdGgsIDIwMDMKdjAuODUgIC0tIFN3YXBwZWQgaW4gYSBuZXcgQUVTIHJvdXRpbmUKICAgICAgIC0tIFJlbW92ZWQgU2VycGVudAogICAgICAgLS0gQWRkZWQgVERDQUwgcG9saWN5IGRvY3VtZW50CiAgICAgICAKSnVuIDFzdCwgMjAwMwp2MC44NCAgLS0gUmVtb3ZlZCBhIDRLQiBidWZmZXIgZnJvbSByc2FfZGVjcnlwdF9rZXkgdGhhdCB3YXNuJ3QgYmVpbmcgdXNlZCBubyBtb3JlCiAgICAgICAtLSBGaXhlZCBhbm90aGVyIHBvdGVudGlhbCBidWZmZXIgcHJvYmxlbS4gIE5vdCBhbiBvdmVyZmxvdyBidXQgY291bGQgY2F1c2UgdGhlIAogICAgICAgICAgUEsgaW1wb3J0IHJvdXRpbmVzIHRvIHJlYWQgcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCiAgICAgICAtLSBPcHRpbWl6ZWQgdGhlIEVDQyBtdWxtb2QgbW9yZSBieSByZW1vdmluZyBhIGlmIGNvbmRpdGlvbiB0aGF0IHdpbGwgYWx3YXlzIGJlIGZhbHNlCiAgICAgICAtLSBPcHRpbWl6ZWQgcHJpbWUuYyB0byBub3QgaW5jbHVkZSBhIDJuZCBwcmltZSB0YWJsZSwgcmVtb3ZlZCBjb2RlIGZyb20gaXNfcHJpbWUgY2FsbHMgcHJpbWUKICAgICAgICAgIHRlc3QgZnJvbSBMaWJUb21NYXRoIG5vdwogICAgICAgLS0gQWRkZWQgTFRDX1RFU1QgZGVmaW5lIHdoaWNoIHdoZW4gZGVmaW5lZCB3aWxsIGVuYWJsZSB0aGUgdGVzdCB2ZWN0b3Igcm91dGluZXMgW3NlZSBteWNyeXB0X2N1c3RvbS5oXQogICAgICAgLS0gUmVtb3ZlZCBhbXBpLm8gZnJvbSB0aGUgZGVwZW5kcyBjdXogaXQgYWluJ3Qgbm8gbm90IHdvcmtpbmcgaW4gKm5peCB3aXRoIGl0IFtyb3V0aW5lcyBhcmUgaW4gbXBpLmMgbm93XS4KICAgICAgICAKCk1hciAyOXRoLCAyMDAzCnYwLjgzICAtLSBPcHRpbWl6ZWQgdGhlIGVjY19tdWxtb2QsIGl0J3MgZmFzdGVyIGFuZCB0YWtlcyBsZXNzIGhlYXAvc3RhY2sgc3BhY2UKICAgICAgIC0tIEZpeGVkIGEgZnJlZSBtZW1vcnkgZXJyb3IgaW4gZWNjX211bG1vZCBhbmQgZGVsX3BvaW50IHdoaWNoIHdvdWxkIHRyeSB0byBmcmVlIE5VTEwKICAgICAgIC0tIEZpeGVkIHR3byBzZXJpb3VzIGJ1Z3MgaW4gcnNhX2RlY3J5cHRfa2V5IGFuZCByc2FfdmVyaWZ5X2hhc2ggdGhhdCB3b3VsZCBhbGxvdyBhIHRyaXZpYWx5CiAgICAgICAgICBidWZmZXIgb3ZlcmZsb3cuCiAgICAgICAtLSBGaXhlZCBhIGJ1ZyBpbiB0aGUgaG1hYyB0ZXN0aW5nIGNvZGUgaWYgeW91IGRvbid0IHJlZ2lzdGVyIGFsbCB0aGUgaGFzaGVzIGl0IHdvbid0IHJldHVybgogICAgICAgICAgZXJyb3JzIG5vdy4KICAgICAgIApNYXIgMTV0aCwgMjAwMwp2MC44MiAgLS0gTWFudWFsIHVwZGF0ZWQKICAgICAgIC0tIEFkZGVkIE1TVkMgbWFrZWZpbGUgW2JhY2ssIGFjdHVhbGx5IGl0cyB3cml0dGVuIGZyb20gc2NyYXRjaCB0byB3b3JrIHdpdGggTk1BS0VdCiAgICAgICAtLSBDaGFuZ2UgdG8gSE1BQyBoZWxwZXIgZnVuY3Rpb25zIEFQSSB0byBhdm9pZCBidWZmZXIgb3ZlcmZsb3cgW3NvdXJjZSBjaGFuZ2VzXQogICAgICAgLS0gdGhlIHJzYV9lbmNyeXB0X2tleSB3YXMgc3VwcG9zZWQgdG8gcmVqZWN0IGtleSBzaXplcyBvdXQgb2YgYm91bmRzIC4uLiAKICAgICAgICAgIHNhbWUgZml4IHRvIHRoZSByc2Ffc2lnbl9oYXNoIAogICAgICAgLS0gQWRkZWQgY29kZSB0byBlbnN1cmUgdGhhdCB0aGF0IGNoYWluaW5nIG1vZGUgY29kZSAoY2ZiL29mYi9jdHIvY2JjKSBoYXZlIHZhbGlkCiAgICAgICAgICBzdHJ1Y3R1cmVzIHdoZW4gYmVpbmcgY2FsbGVkLiAgRS5nLiB0aGUgaW5kZXhlcyB0byB0aGUgcGFkL2l2cyBhcmUgbm90IG91dCBvZiBib3VuZHMKICAgICAgIC0tIENsZWFuZWQgdXAgdGhlIERFUyBjb2RlIGFuZCBzaW1wbGlmaWVkIHRoZSBjb3JlIGRlc2Z1bmMgcm91dGluZS4KICAgICAgIC0tIFNpbXBsaWZpZWQgb25lIG9mIHRoZSBib29sZWFuIGZ1bmN0aW9ucyBpbiBNRDQKICAgICAgIApKYW4gMTZ0aCwgMjAwMwp2MC44MSAgLS0gTWVyZ2VkIGluIG5ldyBtYWtlZmlsZSBmcm9tIENsYXkgQ3VsdmVyIGFuZCBNaWtlIEZyeXNpbmdlcgogICAgICAgLS0gU3BlZCB1cCB0aGUgRUNDIG11bG1vZCgpIHJvdXRpbmUgYnkgbWFraW5nIHRoZSB3b3JkIHNpemUgYWRhcHQgdG8gdGhlIGlucHV0LiAgU2F2ZXMgYSB3aG9wcGluZyA5IHBvaW50CiAgICAgICAgICBvcGVyYXRpb25zIG9uIDUyMS1iaXQga2V5cyBub3cgKHRyYW5zbGF0ZXMgdG8gYWJvdXQgOG1zIG9uIG15IEF0aGxvbiBYUCkuICBJIGFsc28gbm93IHVzZSBiYXJyZXR0IHJlZHVjdGlvbgogICAgICAgICAgYXMgbXVjaCBhcyBwb3NzaWJsZS4gIFRoaXMgc3BlZCB0aGUgcm91dGluZSB1cCBxdWl0ZSBhIGJpdC4KICAgICAgIC0tIEZpeGVkIGEgaHVnZSBmbGF3IGluIGVjY192ZXJpZnlfaGFzaCgpIHdoZXJlIGl0IHdvdWxkIHJldHVybiBDUllQVF9PSyBvbiBlcnJvci4uLiBOb3cgZml4ZWQuCiAgICAgICAtLSBGaXhlZCB1cCBjb25maWcucGwgYnkgZml4aW5nIGFuIGludmFsaWQgcXVlcnkgYW5kIHRoZSBmaWxlIGlzIHNhdmVkIGluIG5vbi13aW5kb3dzIFtlLmcuIG5vdCBDUi9MRl0gZm9ybWF0CiAgICAgICAgICAoZml4IGR1ZSB0byBNaWthIEJvc3Ry9m0pCiAgICAgICAtLSBNZXJnZWQgaW4gTGliVG9tTWF0aCBmb3Iga2lja3MKICAgICAgIC0tIENoYW5nZWQgdGhlIGJ1aWxkIHByb2Nlc3Mgc28gdGhhdCBieSBkZWZhdWx0ICJteWNyeXB0X2N1c3RvbS5oIiBpcyBpbmNsdWRlZCBhbmQgcHJvdmlkZWQKICAgICAgICAgIFRoZSBtYWtlZmlsZSBkb2Vzbid0IGluY2x1ZGUgYW55IGJ1aWxkIG9wdGlvbnMgYW55bW9yZQogICAgICAgLS0gUmVtb3ZlZCB0aGUgUFMyIGFuZCBWQyBtYWtlZmlsZXMuCiAgICAgICAKRGVjIDE2dGgsIDIwMDIKdjAuODAgIC0tIEZvdW5kIGEgY2hhbmdlIEkgbWFkZSB0byB0aGUgTVBJIHRoYXQgaXMgcXVlc3Rpb25hYmxlLiAgTm90IHF1aXRlIGEgYnVnIGJ1dCBkZWZpbmF0ZWx5IG5vdCBkZXNpcmVkLiAgSGFkIHRvZG8KICAgICAgICAgIHdpdGggdGhlIGRpZ2l0IHNoaWZ0aW5nLiAgSW4gdjAuNzkgSSBzaW1wbHkgdHJ1bmNhdGVkIHdpdGhvdXQgemVyb2luZy4gIEl0IGRpZG4ndCBjYXVzZSBwcm9ibGVtcyBkdXJpbmcgbXkKICAgICAgICAgIHRlc3RpbmcgYnV0IEkgZml4ZWQgaXQgdXAgbm9uZSB0aGUgbGVzcy4KICAgICAgIC0tIE9wdGltaXplZCBzX21wX211bF9kaWcoKSBmcm9tIE1QSSB0byBkbyBhIG1pbmltYWwgbnVtYmVyIG9mIHBhc3Nlcy4KICAgICAgIC0tIEZpeGVkIGluIHJzYV9leHB0bW9kKCkgd2hlcmUgSSB3YXMgZ2V0dGluZyB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0LiAgQmFzaWNhbGx5IGl0IGFjY29tcGxpc2hlcyB0aGUgc2FtZSB0aGluZwogICAgICAgICAgYnV0IHRoZSBmaXhlZCBjb2RlIGlzIG1vcmUgcmVhZGFibGUuCiAgICAgICAtLSBGaXhlZCBzbGlnaHQgYnVnIGluIGRoX3NpZ25faGFzaCgpIHdoZXJlIHRoZSByYW5kb20gImsiIHZhbHVlIHdhcyAxIGJ5dGUgc2hvcnRlciB0aGFuIGl0IHNob3VsZCBoYXZlIGJlZW4uICBJJ3ZlCiAgICAgICAgICBhbHNvIG1hZGUgdGhlICNkZWZpbmUgRkFTVF9QSyBzcGVlZCB1cCBzaWduYXR1cmVzIGFzIHdlbGwuICBFc3NlbnRpYWxseSBGQVNUX1BLIHRlbGxzIHRoZSBESCBzdWItc3lzdGVtIHRvIAogICAgICAgICAgbGltaXQgYW55IHByaXZhdGUgZXhwb25lbnQgdG8gMjU2LWJpdHMuICAgTm90ZSB0aGF0IHdoZW4gRkFTVF9QSyBpcyBkZWZpbmVkIGRvZXMgbm90IG1ha2UgdGhlIGxpYnJhcnkKICAgICAgICAgIGJpbmFyeSBvciBzb3VyY2UgaW5jb21wYXRpYmxlIHdpdGggYSBjb3B5IG9mIHRoZSBsaWJyYXJ5IHdpdGggaXQgdW5kZWZpbmVkLgogICAgICAgLS0gUmVtb3ZlZCB0aGUgRFNBIGNvZGUuICBJZiB5b3Ugd2FudCBmYXN0IGRpZmZpZS1oZWxsbWFuIGp1c3QgZGVmaW5lIEZBU1RfUEsgOi0pCiAgICAgICAtLSBVcGRhdGVkIGRoX3NpZ25faGFzaCgpL2RoX3ZlcmlmeV9oYXNoKCkgdG8gZXhwb3J0ICJ1bnNpZ25lZCIgYmlnbnVtcy4gIFNhdmVzIHR3byBieXRlcyBidXQgaXMgbm90IGJpbmFyeQogICAgICAgICAgY29tcGF0aWJsZSB3aXRoIHRoZSBwcmV2aW91cyByZWxlYXNlLi4uIHNvcnJ5ISAgSSd2ZSBwZXJmb3JtZWQgdGhlIHNhbWUgZml4IHRvIHRoZSBlY2MgY29kZSBhcyB3ZWxsLgogICAgICAgLS0gRml4ZWQgdXAgdGhlIFBLIGNvZGUgdG8gcmVtb3ZlIGFsbCB1c2Ugb2YgbXBfdG9yYXcoKSBhbmQgbXBfcmVhZF9yYXcoKSBbZ2V0IGFsbCB0aGUgY2hhbmdlcyBvdXQgb2YgdGhlIHdheSBub3ddCiAgICAgICAtLSBGaXhlZCBhIGJ1ZyBpbiB0aGUgREggY29kZSB3aGVyZSBpdCBtaXNzZWQgdHJhcHBpbmcgYSBmZXcgZXJyb3JzIGlmIHRoZXkgb2NjdXJyZWQuCiAgICAgICAtLSBGaXhlZCBhIHNsaWdodCAiaXRzLW5vdC1hLWJ1Zy1idXQtY291bGQtYmUtZG9uZS1iZXR0ZXIiIGJ1ZyBpbiB0aGUgbmV4dF9wcmltZSgpIGZ1bmN0aW9uLiAgRXNzZW50aWFsbHkgaXQgd2FzCiAgICAgICAgICB0ZXN0aW5nIHRvIGVuc3VyZSB0aGF0IGluIHRoZSBsb29wIHRoYXQgc2VhcmNoZXMgZm9yIHRoZSBuZXh0IGNhbmRpZGF0ZSB0aGF0IHRoZSBzdGVwIG5ldmVyIGdyb3dzIGJleW9uZAogICAgICAgICAgNjUwMDAuICBTaG91bGQgaGF2ZSBiZWVuIHRlc3RpbmcgZm9yIE1QX0RJR0lUX01BWAogICAgICAgLS0gU3BydWNlZCB1cCB0aGUgY29uZmlnLnBsIHNjcmlwdC4gIEl0IG5vdyBtYWtlcyBhIGhlYWRlciBmaWxlICJteWNyeXB0X2N1c3RvbS5oIiB3aGljaCBjYW4gYmUgaW5jbHVkZWQgKmJlZm9yZSoKICAgICAgICAgIHlvdSBpbmNsdWRlIG15Y3J5cHQuaC4gIFRoaXMgYWxsb3dzIHlvdSB0byBhZGQgbGlidG9tY3J5cHQgdG8gYSBwcm9qZWN0IHdpdGhvdXQgY29tcGxldGVseSBjaGFuZ2luZyB5b3VyIG1ha2UKICAgICAgICAgIHN5c3RlbSBhcm91bmQuICBOb3RlIHRoYXQgeW91IHNob3VsZCB1c2UgdGhlIG1ha2VmaWxlIGl0IHdyaXRlcyB0byBhdCBsZWFzdCBidWlsZCB0aGUgbGlicmFyeSBpbml0aWFsbHkuCiAgICAgICAtLSBVc2VkIHNwbGludCB0byBjaGVjayBhbG90IG9mIHRoZSBjb2RlIG91dC4gIFRvbnMgb2YgbWlub3IgZml4ZXMgYW5kIGV4cGxpY2l0IGNhc3RzIGFkZGVkLgogICAgICAgLS0gQWxzbyBtYWRlIGFsbCB0aGUgaW50ZXJuYWwgZnVuY3Rpb25zIG9mIE1QSSBhcmUgbm93IHN0YXRpYyB0byBhdm9pZCBwb2x1dGluZyB0aGUgbmFtZXNwYWNlCiAgICAgICAtLSAqKk5vdGljZSoqOiAgVGhlcmUgYXJlIG5vIHBsYW5uZWQgZnV0dXJlIHJlbGVhc2VzIGZvciBhdCBsZWFzdCBhIG1vbnRoIGZyb20gdGhlIHRoaXMgcmVsZWFzZSBkYXRlLgogICAgICAgCkRlYyAxNHRoLCAyMDAyCnYwLjc5ICAtLSBDaGFuZ2UgdG8gUEsgY29kZSBbYmluYXJ5IGFuZCBzb3VyY2VdLiAgSSBtYWRlIGl0IHNvIHlvdSBoYXZlIHRvIHBhc3MgdGhlIGJ1ZmZlciBzaXplIHRvIHRoZSAqX2RlY3J5cHRfa2V5IGFuZAogICAgICAgICAgKl92ZXJpZnlfaGFzaCBmdW5jdGlvbnMuICBUaGlzIHByZXZlbnRzIG1hbGZvcm1lZCBwYWNrZXRzIGZyb20gcGVyZm9ybWluZyBidWZmZXIgb3ZlcmZsb3dzLiAgSSd2ZSBhbHNvIHRyaW1tZWQKICAgICAgICAgIHRoZSBwYWNrZXQgaGVhZGVyIHNpemUgW2J5IDQgYnl0ZXNdLgogICAgICAgLS0gTWFkZSB0aGUgdGVzdCBwcm9ncmFtIGhhbHQgb24gdGhlIGZpcnN0IGVycm9yIGl0IG9jY3Vycy4gIEFsc28gbWFkZSBpdCB0cmFwIG1vcmUgZXJyb3JzIHRoYW4gYmVmb3JlLgogICAgICAgLS0gV3JvdGUgdGhlIGZpcnN0IGNoYXB0ZXIgb2YgbXkgbmV3IGJvb2sgW0RSQUZUIV0sIG5vdCBpbiB0aGlzIHBhY2thZ2UgYnV0IGNoZWNrIG15IHdlYnNpdGUhCiAgICAgICAtLSBJbmNsdWRlZCBhIHBlcmwgc2NyaXB0ICJjb25maWcucGwiIHRoYXQgd2lsbCBtYWtlICJtYWtlZmlsZS5vdXQiIGFjY29yZGluZyB0byB0aGUgdXNlcnMgbmVlZHMuICAKICAgICAgIC0tIEFkZGVkIHNoZWxsIHNjcmlwdCB0byBsb29rIGZvciBsYXRlc3QgcmVsZWFzZQogICAgICAgLS0gTWVyZ2UgREggYW5kIEVDQyBrZXkgZGVmaW5lcyBmcm9tIG15Y3J5cHRfY2ZnLmggaW50byB0aGUgbWFrZWZpbGVzCiAgICAgICAtLSB1cGRhdGVkIHRoZSBtYWtlZmlsZSB0byB1c2UgQlNEIGZyaWVuZGx5IGFyY2hpdmluZyBpbnZva2F0aW9ucwogICAgICAgLS0gQ2hhbmdlZCB0aGUgREggYW5kIEVDQyBjb2RlIHRvIHVzZSBiYXNlNjQgc3RhdGljIGtleSBzZXR0aW5ncyBbZS5nLiB0aGUgcHJpbWVzXS4gIERyb3BwZWQgdGhlIGNvZGUgc2l6ZSBieSAzS0IKICAgICAgICAgIGFuZCBpcyBldmVyLXNvLXNsaWdodGx5IGZhc3RlciB0aGFuIGJlZm9yZS4KICAgICAgIC0tIGFkZGVkICJtcF9zaHJpbmsiIGZ1bmN0aW9uIHRvIHNocmluayB0aGUgc2l6ZSBvZiBiaWdudW1zLiAgU3BlY2lhbGx5IHVzZWZ1bCBmb3IgUEsgY29kZSA6LSkKICAgICAgIC0tIEFkZGVkIG5ldyBleHB0bW9kIGZ1bmN0aW9uIHRoYXQgY2FsY3VsYXRlcyBhXmIgbW9kIGMgd2l0aCBmZXdlciBtdWx0aXBsaWVzIHRoZW4gYmVmb3JlIFt+MjAlIGZvciBjcnlwdG8KICAgICAgICAgIHNpemVkIG51bWJlcnNdLiAgQWxzbyBhZGRlZCBhICJsb3cgbWVtIiB2YXJpYW50IHRoYXQgZG9lc24ndCB1c2UgbW9yZSB0aGFuIDIwS0IgW3VwdG8gNDA5NiBiaXQgbnVtc10gb2YKICAgICAgICAgIGhlYXAgdG9kbyB0aGUgY2FsY3VsYXRpb24uICBCb3RoIGFyZSAjZGVmaW5lJ2FibGUgY29udHJvbGxlZAogICAgICAgLS0gQWRkZWQgWFJFQUxMT0MgbWFjcm8gdG8gcHJvdmlkZSByZWFsbG9jKCkgZnVuY3Rpb25hbGl0eS4KICAgICAgIC0tIEFkZGVkIGZpeCB3aGVyZSBpbiByc2FfaW1wb3J0KCkgaWYgeW91IGltcG9ydGVkIGEgcHVibGljIGtleSBvciBhIG5vbi1vcHRpbWl6ZWQga2V5IGl0IHdvdWxkIGZyZWUgdGhlIG1wX2ludCdzCiAgICAgICAgICBub3QgYmVpbmcgdXNlZC4KICAgICAgIC0tIEZpeGVkIHBvdGVudGlhbCBidWcgaW4gdGhlIEVDQyBjb2RlLiAgT25seSB3b3VsZCBvY2N1ciBvbiBwbGF0Zm9ybXMgd2hlcmUgY2hhciBpcyBub3QgZWlnaHQgYml0cyBbd2hpY2ggaXNuJ3QKICAgICAgICAgIG9mdGVuIV0KICAgICAgIC0tIEZpeGVkIHVwIHRoZSBFQ0MgcG9pbnQgbXVsdGlwbGljYXRpb24sIGl0cyBhYm91dCAxNSUgZmFzdGVyIG5vdwogICAgICAgLS0gV2hpbGUgSSB3YXMgYXQgaXQgW3NpbmNlIHRoZSBsaWIgaXNuJ3QgYmluYXJ5IGJhY2t3YXJkcyBjb21wYXRpYmxlIGFueXdheXNdIEkndmUgZml4ZWQgdGhlIFBLIGV4cG9ydCByb3V0aW5lcwogICAgICAgICAgc28gdGhleSBleHBvcnQgYXMgInVuc2lnbmVkIiB0eXBlcyBzYXZpbmcgMSBieXRlIHBlciBiaWdudW0gb3V0cHV0dGVkLiAgTm90IGEgbG90IGJ1dCBoZWNrIHdoeSBub3QuCiAgICAgICAgICAKTm92IDI4dGgsIDIwMDIKdjAuNzggIC0tIE1hZGUgdGhlIGRlZmF1bHQgQVJHQ0hLIG1hY3JvIGEgZnVuY3Rpb24gY2FsbCBpbnN0ZWFkIHdoaWNoIHJlZHVjZWQgdGhlIGNvZGUgc2l6ZSBmcm9tIDI2NEtCIHRvIDIzOUtCLgogICAgICAgLS0gRml4ZWQgYSBidWcgaW4gdGhlIFhURUEga2V5c2l6ZSBmdW5jdGlvbiB3aGljaCBjYWxsZWQgQVJHQ0hLIGluY29ycmVjdGx5LgogICAgICAgLS0gQWRkZWQgTm9la2VvbiBibG9jayBjaXBoZXIgYXQgMiw4MDAgYnl0ZXMgb2Ygb2JqZWN0IGNvZGUgYW5kIDM0NU1iaXQvc2VjIGl0IGlzIGEgd2VsY29tZSBhZGRpdGlvbi4KICAgICAgIC0tIE1hZGUgdGhlIEtSIGNvZGUgY2hlY2sgaWYgdGhlIG90aGVyIFBLIHN5c3RlbXMgYXJlIGluY2x1ZGVkIFtwcm92aWRlcyBlcnJvciB3aGVuIGJ1aWxkaW5nIG90aGVyd2lzZV0uCiAgICAgICAtLSBNYWRlICJhZXMiIGFuIGFsaWFzIGZvciBSaWpuZGFlbCB2aWEgYSBwcmUtcHJvY2Vzc29yIG1hY3JvLiAgTm93IHlvdSBjYW4gdXNlICJhZXNfZWNiX2VuY3J5cHQiLCBldGMuLi4gOi0pCiAgICAgICAgICBUaGFua3MgdG8gSmVhbi1MdWMgQ29va2UgZm9yIHRoZSAiYnV6endvcmQgY29uZm9ybWFuY2UiIHN1Z2dlc3Rpb24uCiAgICAgICAtLSBSZW1vdmVkIHRoZSBvbGQgUEsgY29kZSBlbnRpcmVseSAoZS5nLiByc2Ffc2lnbiwgZGhfZW5jcnlwdCkuICBUaGUgKl9zaWduX2hhc2ggYW5kICpfZW5jcnlwdF9rZXkgZnVuY3Rpb25zCiAgICAgICAgICBhcmUgYWxsIHRoYXQgaXMgdG8gcmVtYWluLgogICAgICAgLS0gKipOT1RFKiogQ2hhbmdlZCB0aGUgUEsgKl9pbXBvcnQgKGluY2x1ZGluZyB0aGUga2V5cmluZykgcm91dGluZSB0byBhY2NlcHQgYSAiaW5sZW4iIHBhcmFtZXRlci4gIFRoaXMgZml4ZXMgYQogICAgICAgICAgYnVnIHdoZXJlIGltcHJvcGVybHkgbWFkZSBrZXkgcGFja2V0cyBjb3VsZCByZXN1bHQgaW4gcmVhZGluZyBwYXNzZWQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiAgVGhpcyBtZWFucwogICAgICAgICAgdGhlIGNvZGUgaXMgbm8gbG9uZ2VyIHNvdXJjZSBjb21wYXRpYmxlIGJ1dCBzdGlsbCBiaW5hcnkgY29tcGF0aWJsZS4KICAgICAgIC0tIEZpeGVkIGEgZmV3IG90aGVyIG1pbm9yIGJ1Z3MgaW4gdGhlIFBLIGltcG9ydCBjb2RlIHdoaWxlIEkgd2FzIGF0IGl0LgogICAgICAgCk5vdiAyNnRoLCAyMDAyCnYwLjc3ICAtLSBVcGRhdGVkIHRoZSBYVEVBIGNvZGUgdG8gdXNlIHByZS1jb21wdXRlZCBrZXlzLiAgV2l0aCBvcHRpbWl6YXRpb25zIGZvciBzcGVlZCBpdCBhY2hpZXZlcyAyMjJNYml0L3NlYwogICAgICAgICAgY29tcGFyZWQgdG8gdGhlIDEyMU1iaXQvc2VjIGJlZm9yZS4gIEl0IGlzIDI4OCBieXRlcyBiaWdnZXIgdGhhbiBiZWZvcmUuCiAgICAgICAtLSBDbGVhbmVkIHVwIHNvbWUgb2YgdGhlIGNpcGhlcnMgYW5kIGhhc2hlcyAoY29kaW5nIHN0eWxlLCBjb3NtZXRpYyBjaGFuZ2VzKQogICAgICAgLS0gT3B0aW1pemVkIEFFUyBzbGlnaHRseSBmb3IgMjU2LWJpdCBrZXlzIFtvbmx5IG9uZSBpZiBzdGF0ZW1lbnQgbm93LCBzdGlsbCB0d28gZm9yIDE5Mi1iaXQga2V5c10KICAgICAgIC0tIFJlbW92ZWQgbW9zdCB0ZXN0IGNhc2VzIGZyb20gQmxvd2Zpc2gsIGxlZnQgdGhyZWUgb2YgdGhlbSB0aGVyZS4gIE1ha2VzIGl0IHNtYWxsZXIgYW5kIGZhc3RlciB0byB0ZXN0LgogICAgICAgLS0gQ2hhbmdlZCB0aGUgcHJpbWFsaXR5IHJvdXRpbmVzIGFyb3VuZC4gIEkgbm93IHVzZSA4IHJvdW5kcyBvZiBSYWJpbi1NaWxsZXIsIEkgdXNlIDI1NiBwcmltZXMgaW4gdGhlIHNpZXZlCiAgICAgICAgICBzdGVwIGFuZCB0aGUgInJhbmRfcHJpbWUiIGZ1bmN0aW9uIHVzZXMgYSBtb2RpZmllZCBzaWV2ZSB0aGF0IGF2b2lkcyBhbG90IG9mIHVuLW5lZWRlZCBiaWdudW0gd29yay4KICAgICAgIC0tIEZpeGVkIGEgYnVnIGluIHRoZSBFQ0MvREggc2lnbmF0dXJlcyB3aGVyZSB0aGUga2V5cyAic2V0dGluZyIgdmFsdWUgd2FzIG5vdCBjaGVja2VkIGZvciB2YWxpZGl0eS4gIFRoaXMgbWVhbnMKICAgICAgICAgIHRoYXQgYSBpbnZhbGlkIHZhbHVlIGNvdWxkIGhhdmUgY2F1c2VkIHNlZ2ZhdWx0cywgZXRjLi4uCiAgICAgICAtLSAqKk5PVEUqKiBDaGFuZ2VkIHRoZSB3YXkgdGhlIEVDQy9ESCBleHBvcnQvaW1wb3J0IGZ1bmN0aW9ucyB3b3JrLiAgVGhleSBhcmUgc291cmNlIGJ1dCBub3QgYmluYXJ5IGNvbXBhdGlibGUKICAgICAgICAgIHdpdGggdjAuNzYuICBFc3NlbnRpYWxseSBpbnN0ZWFkaW5nIG9mIGV4cG9ydGluZyB0aGUgc2V0dGluZyBpbmRleCBsaWtlIGJlZm9yZSBJIGV4cG9ydCB0aGUga2V5IHNpemUuICBOb3cKICAgICAgICAgIGlmIHlvdSBldmVyIHJlLWNvbmZpZ3VyZSB3aGljaCBrZXkgc2V0dGluZ3MgYXJlIHN1cHBvcnRlZCB0aGUgbGliIHdpbGwgc3RpbGwgYmUgYWJsZSB0byBtYWtlIHVzZSBvZiB5b3VyIAogICAgICAgICAga2V5cy4KICAgICAgIC0tIE9wdGltaXplZCBCbG93ZmlzaCBieSBpbmxpbmluZyB0aGUgcm91bmQgZnVuY3Rpb24sIHVucm9sbGluZyBpdCBmb3IgZm91ciByb3VuZHMgdGhlbiB1c2luZyBhIGZvciBsb29wIGZvciB0aGUgCiAgICAgICAgICByZXN0LiAgSXQgYWNoaWV2ZXMgYSByYXRlIG9mIDQyNU1iaXQvc2VjIHdpdGggdGhlIG5ldyBjb2RlIGNvbXBhcmVkIHRvIDMxNE1iaXQvc2VjIGJlZm9yZS4gIFRoZSBuZXcgYmxvd2Zpc2ggCiAgICAgICAgICBvYmplY3QgZmlsZSBpcyA3LDgxMyBieXRlcyBjb21wYXJlZCB0byA4LDY2MyBiZWZvcmUgYW5kIGlzIDg1MCBieXRlcyBzbWFsbGVyLiAgU28gdGhlIGNvZGUgaXMgYm90aCBzbWFsbGVyIGFuZCAKICAgICAgICAgIGZhc3RlciEKICAgICAgIC0tIE9wdGltaXplZCBUd29maXNoIGFzIHdlbGwgYnkgaW5saW5pbmcgdGhlIHJvdW5kIGZ1bmN0aW9uLiAgR2V0cyB+NDAwTWJpdC9zZWMgY29tcGFyZWQgdG8gMjgwTWJpdC9zZWMgYmVmb3JlCiAgICAgICAgICBhbmQgdGhlIGNvZGUgaXMgb25seSA3OCBieXRlcyBsYXJnZXIgdGhhbiB0aGUgcHJldmlvdXMgY29weS4KICAgICAgIC0tIFJlbW92ZWQgU01BTExfUFJJTUVfVEFCIGJ1aWxkIG9wdGlvbi4gIEkgdXNlIHRoZSBzbWFsbGVyIHRhYmxlIGFsd2F5cy4KICAgICAgIC0tIEZpeGVkIHNvbWUgbWlzdGFrZXMgY29uY2VybmluZyBwcmltZSBnZW5lcmF0aW9uIGluIHRoZSBtYW51YWwuCiAgICAgICAtLSBbTm90ZTogc2l6ZXMvc3BlZWRzIGFyZSBmb3IgR0NDIDMuMiBvbiBhbiB4ODYgQXRobG9uIFhQIEAgMS41M0doel0KCk5vdiAyNXRoLCAyMDAyCnYwLjc2ICAtLSBVcGRhdGVkIG1ha2VmaWxlcyBhIGJpdCBtb3JlLCB1c2UgIi1PcyIgaW5zdGVhZCBvZiAiLU8yIiB0byBvcHRpbWl6ZSBmb3Igc2l6ZS4gIEdvdCB0aGUgbGliCiAgICAgICAgICBkb3dudG8gMjY1S0IgdXNpbmcgR0NDIDMuMiBvbiBteSB4ODYgYm94LgogICAgICAgLS0gVXBkYXRlZCB0aGUgU0FGRVIrLCBUd29maXNoIGFuZCBSaWpuZGFlbCB0ZXN0IHZlY3RvciByb3V0aW5lIHRvIHVzZSB0aGUgdGFibGUgZHJpdmVuIGRlc2lnbi4KICAgICAgIC0tIFVwZGF0ZWQgYWxsIG90aGVyIHRlc3QgdmVjdG9yIHJvdXRpbmVzIHRvIHJldHVybiBhcyBzb29uIGFzIGFuIGVycm9yIGlzIGZvdW5kCiAgICAgICAtLSBmaXhlZCBhIGJ1ZyBpbiB0aGUgdGVzdCBwcm9ncmFtIHdoZXJlIGVycm9ycyBpbiB0aGUgaGFzaCB0ZXN0IHJvdXRpbmVzIHdvdWxkIG5vdCBiZSByZXBvcnRlZAogICAgICAgICAgY29ycmVjdGx5LiAgSSBmb3VuZCB0aGlzIGJ5IHRlbXBvcmFyaWx5IGNoYW5naW5nIG9uZSBvZiB0aGUgYnl0ZXMgb2YgdGhlIHRlc3QgdmVjdG9ycy4gIEFsbCB0aGUKICAgICAgICAgIGhhc2hlcyBjaGVjayBvdXQgW3RoZSBkZW1vcy90ZXN0LmMgd291bGQgc3RpbGwgaGF2ZSByZXBvcnRlZCBhbiBlcnJvciwganVzdCB0aGUgd3Jvbmcgb25lXS4KICAgICAgICAgIAoKTm92IDI0dGgsIDIwMDIKdjAuNzUgIC0tIEZpeGVkIGEgZmxhdyBpbiBoYXNoX2ZpbGVoYW5kbGUsIGl0IHNob3VsZCBBUkdDSEsgdGhhdCB0aGUgZmlsZWhhbmRsZSBpcyBub3QgTlVMTAogICAgICAgLS0gRml4ZWQgYSBidWcgd2hlcmUgaW4gaGFzaF9maWxlIGlmIHRoZSBjYWxsIHRvIGhhc2hfZmlsZWhhbmRsZSBmYWlsZWQgdGhlIG9wZW4gZmlsZSB3b3VsZCAKICAgICAgICAgIG5vdCBiZSBjbG9zZWQuCiAgICAgICAtLSBBZGRlZCBtb3JlIHN0cmljdCBydWxlcyB0byBidWlsZCBwcm9jZXNzLCBzdGFydGluZyB0byB3ZWVkIG91dCAib2ggdGhpcyB3b3JrcyBpbiBHQ0MiIHN0eWxlIGNvZGUKICAgICAgICAgIEluIHRoZSBuZXh0IHJlbGVhc2UgIi1XY29udmVyc2lvbiIgd2lsbCBiZSBlbmFibGVkIHdoaWNoIHdpbGwgZGVhbCB3aXRoIGFsbCBpbXBsaWNpdCBjYXN0cy4KCk5vdiAyMm5kLCAyMDAyIFtsYXRlciBpbiB0aGUgZGF5XQp2MC43NCAgLS0gV3JvdGUgYSBzbWFsbCB2YXJpYW50IG9mIFNBRkVSKyB3aGljaCBzaGF2ZWQgNTBLQiBvZmYgdGhlIHNpemUgb2YgdGhlIGxpYnJhcnkgb24geDg2IHBsYXRmb3JtcwogICAgICAgLS0gV3JvdGUgYSBidWlsZCBvcHRpb24gdG8gcmVtb3ZlIHRoZSBQSyBwYWNrZXQgZnVuY3Rpb25zIFtrZWVwcyB0aGUgZW5jcnlwdF9rZXkvc2lnbl9oYXNoIGZ1bmN0aW9uc10KICAgICAgIC0tIFdyb3RlIGEgc21hbGwgdmFyaWFudCBvZiBSaWpuZGFlbCAodHJpbW1lZCAxM0tCKQogICAgICAgLS0gVHJpbW1lZCB0aGUgVElHRVIvMTkyIGhhc2ggZnVuY3Rpb24gYSBiaXQKICAgICAgIC0tIE92ZXJhbGwgdGhlIGVudGlyZSBsaWIgY29tcGlsZWQgaXMgMjk1S0IgW2Rvd24gZnJvbSA0MDBLQiBiZWZvcmVdCiAgICAgICAtLSBGaXhlZCBhIGZldyBtaW5vciBvdmVyc2lnaHRzIGluIHRoZSBNU1ZDIG1ha2VmaWxlCgpOb3YgMjJuZCwgMjAwMgp2MC43MyAgLS0gRml4ZWQgYnVnIGluIFJDNCBjb2RlIHdoZXJlIGl0IGNvdWxkIG9ubHkgdXNlIDI1NSBieXRlIGtleXMuCiAgICAgICAtLSBGaXhlZCBidWcgaW4geWFycm93IGNvZGUgd2hlcmUgaXQgd291bGQgYWxsb3cgY2FzdDUgb3IgbWQyIHRvIGJlIHVzZWQgd2l0aCBpdC4uLgogICAgICAgLS0gUmVtb3ZlZCB0aGUgZWNjIGNvbXByZXNzL2V4cGFuZCBwb2ludHMgZnJvbSB0aGUgZ2xvYmFsIHNjb3BlLiAgUmVkdWNlcyBuYW1lc3BhY2UgcG9sdXRpb24KICAgICAgIC0tIEZpeGVkIGJ1ZyB3aGVyZSBpZiB5b3UgdXNlZCB0aGUgU1BSTkcgeW91IGNvdWxkbid0IHBhc3MgTlVMTCBhcyB5b3VyIHBybmdfc3RhdGUgd2hpY2ggeW91IHNob3VsZCBiZQogICAgICAgICAgYWJsZSB0b2RvIHNpbmNlIHRoZSBTUFJORyBoYXMgbm8gc3RhdGUuLi4KICAgICAgIC0tIENvcnJlY3RlZCBzb21lIG92ZXJzaWdodHMgaW4gdGhlIG1hbnVhbCBhbmQgdGhlIGV4YW1wbGVzLi4uCiAgICAgICAtLSBCeSBkZWZhdWx0IHRoZSBHRigyXlcpIG1hdGggbGlicmFyeSBpcyBleGNsdWRlZCBmcm9tIHRoZSBidWlsZC4gIFRoZSBzb3VyY2UgaXMgbWFpbnRhaW5lZCBiZWNhdXNlIEkgd3JvdGUgaXQKICAgICAgICAgIGFuZCBsaWtlIGl0IDotKS4gIFRoaXMgd2F5IHRoZSBidWlsdCBsaWJyYXJ5IGlzIGEgdGFkIHNtYWxsZXIKICAgICAgIC0tIHRoZSBNU1ZDIG1ha2VmaWxlIHdpbGwgbm93IGJ1aWxkIGZvciBhIFNQQUNFIG9wdGltaXplZCBsaWJyYXJ5IHJhdGhlciB0aGFuIFRJTUUgb3B0aW1pemVkLgoKTm92IDIxdGgsIDIwMDIKdjAuNzIgIC0tIEZpeGVkIGJ1ZyBpbiB0aGUgcHJpbWUgdGVzdGluZy4gIEluIHRoZSBNaWxsZXItUmFiaW4gdGVzdCBJIHdhcyByYWlzaW5nIHRoZSBiYXNlIHRvICJOLTEiIG5vdCAiciIuCiAgICAgICAgICBUaGUgbWF0aCBzdGlsbCB3b3JrZWQgb3V0IGZpbmUgYmVjYXVzZSBpbiBlZmZlY3QgaXQgd2FzIHBlcmZvcm1pbmcgYSBGZXJtYXQgdGVzdC4gIFRlc3RlZCB0aGUgbmV3IGNvZGUgYW5kIGl0IAogICAgICAgICAgd29ya3MgcHJvcGVybHkKICAgICAgIC0tIEZpeGVkIHNvbWUgb2YgdGhlIGNvZGUgd2hlcmUgaXQgd2FzIHN0aWxsIHVzaW5nIHRoZSBvbGQgZXJyb3Igc3ludGF4CiAgICAgICAtLSBTcGVkIHVwIHRoZSBSU0EgZGVjcnlwdC9zaWduIHJvdXRpbmVzCiAgICAgICAtLSBPcHRpbWl6ZWQgdGhlIGVjY19zaGFyZWRfc2VjcmV0IHJvdXRpbmUgdG8gbm90IHVzZSBzbyBtdWNoIHN0YWNrCiAgICAgICAtLSBGaXhlZCB1cCB0aGUgbWFrZWZpbGUgdG8gbWFrZSByZWxlYXNlcyB3aGVyZSB0aGUgdmVyc2lvbiAjIGlzIGluIHRoZSBmaWxlIG5hbWUgYW5kIGRpcmVjdG9yeSBpdCB3aWxsIHVuemlwCiAgICAgICAgICB0bwoKTm92IDE5dGgsIDIwMDIKdjAuNzEgIC0tIEhFTFAgVE9NLiAgSSBuZWVkIHR1aXRpb24gZm9yIHRoZSBKYW51YXJ5IHNlbWVzdGVyLiAgTm93IEkgZG9uJ3Qgd2FudCB0byBmb3JjZSBkb25hdGlvbnMgW25vciB3aWxsIEkgZXZlcl0KICAgICAgICAgIGJ1dCBJIHJlYWxseSBuZWVkIHRoZSBoZWxwISAgU2VlIG15IHdlYnNpdGUgaHR0cDovL3RvbS5pYWh1LmNhL2hlbHBfdG9tLmh0bWwgZm9yIG1vcmUgZGV0YWlscy4gIFBsZWFzZSBoZWxwCiAgICAgICAgICBpZiB5b3UgY2FuISAKICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAtLSBPZmZpY2lhbGx5IHRoZSBsaWJyYXJ5IGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgaW4gR0NDIDMuMiBpbiB3aW5kb3dzIFtjeWd3aW5dLgogICAgICAgICAgSW4gd2luZG93cyB5b3UgY2FuIGVpdGhlciB1c2UgR0NDIDIuOTUuMyBvciB0cnkgeW91ciBsdWNrIHdpdGggMy4yICBJdCBzZWVtcyB0aGF0CiAgICAgICAgICAiLWZvbWl0LWZyYW1lLXBvaW50ZXIiIGlzIGJyb2tlbiBpbiB0aGUgd2luZG93cyBidWlsZCBbYnV0IG5vdCB0aGUgbGludXggeDg2IGJ1aWxkPz8/XQogICAgICAgICAgSWYgeW91IHNpbXBseSBtdXN0IHVzZSAzLjIgdGhlbiBJIHN1Z2dlc3QgeW91IGxpbWl0IHRoZSBvcHRpbWl6YXRpb25zIHRvIHNpbXBseSAiLU8yIgogICAgICAgLS0gU3RhcnRlZCBuZXcgZXJyb3IgaGFuZGxpbmcgQVBJLiAgU2ltaWxhciB0byB0aGUgcHJldmlvdXMgZXhjZXB0IHRoZXJlIGFyZSBtb3JlIGVycm9yIGNvZGVzIHRoYW4ganVzdAogICAgICAgICAgQ1JZUFRfRVJST1IKICAgICAgIC0tIEFkZGVkIG15IGltcGxlbWVudGF0aW9uIG9mIHRoZSBNRDIgaGFzaCBmdW5jdGlvbiBbZGVzcGl0ZSB0aGUgZXJyb3JzIGluIHRoZSBSRkMgSSBtYW5hZ2VkIHRvIGdldCBpdCByaWdodCFdCiAgICAgICAtLSBNZXJnZWQgaW4gbW9yZSBjaGFuZ2VzIGZyb20gU2t5IFNjaHVsei4gIEkgaGF2ZSB0byBtYWtlIG1lbnRpb24gaGVyZSB0aGF0IGhlIGhhcyBiZWVuIGEgdHJlbWVuZG91cyBoZWxwIGluIAogICAgICAgICAgZ2V0dGluZyBtZSBtb3RpdmF0ZWQgdG8gbWFrZSBzb21lIG11Y2ggbmVlZGVkIHVwZGF0ZXMgdG8gdGhlIGxpYnJhcnkhCiAgICAgICAtLSBGaXhlZCBvbmUgb2YgdGhlIG1hbnkgbWlzdGFrZXMgaW4gdGhlIG1hbnVhbCBhcyBwb2ludGVkIG91dCBieSBEYW5pZWwgUmljaGFyZHMKICAgICAgIC0tIEZpeGVkIGEgYnVnIGluIHRoZSBSQzQgY29kZSBbd2Fzbid0IHNldHRpbmcgdXAgdGhlIGtleSBjb3JyZWN0bHldCiAgICAgICAtLSBBZGRlZCBteSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ0FTVDUgW2FrYSBDQVNULTEyOF0gYmxvY2sgY2lwaGVyIChjb25mb3Jtcy4uLikKICAgICAgIC0tIEZpeGVkIG51bWVyb3VzIGJ1Z3MgaW4gdGhlIFBLIGNvZGUuICBFc3NlbnRpYWxseSBJIHdhcyAiZnJlZWluZyIga2V5cyB3aGVuIHRoZSBpbXBvcnQgZmFpbGVkLiAgVGhpcyBpcyBuZWl0aGVyCiAgICAgICAgICByZXF1aXJlZCBub3IgYSBnb29kIGEgaWRlYSBbZG91YmxlIGZyZWVdLiAgCiAgICAgICAtLSBUb20gbmVlZHMgYSBqb2IuCiAgICAgICAtLSBGaXhlZCB1cCB0aGUgdGVzdCBoYXJuZXNzIGFzIHJlcXVlc3RlZCBieSBTa3kgU2NodWx6LiAgQWxzbyBtb2RpZmVkIHRoZSB0aW1pbmcgcm91dGluZXMgdG8gcnVuIGZvciBYIHNlY29uZHMKICAgICAgICAgIGFuZCBjb3VudCAjIG9mIG9wcyBwZXJmb3JtZWQuICBUaGlzIGlzIG1vcmUgc3VpdGFibGUgdGhhbiBzYXkgZW5jcnlwdGluZyAxMCBtaWxsaW9uIGJsb2NrcyBvbiBhIHNsb3cgcHJvY2Vzc29yCiAgICAgICAgICB3aGVyZSBpdCBjb3VsZCB0YWtlIG1pbnV0ZXMhCiAgICAgICAtLSBNb2RpZmllZCB0ZXN0IHByb2dyYW1zIGhhc2hzdW0vZW5jcnlwdCB0byB1c2UgdGhlIG5ldyBhbGdvcml0aG1zIGFuZCBlcnJvciBoYW5kbGluZyBzeW50YXgKICAgICAgIC0tIFJlbW92ZWQgdGhlIFBLQ1MgY29kZSBzaW5jZSBpdCB3YXMgaW5jb21wbGV0ZS4gIEluIHRoZSBmdXR1cmUgSSBwbGFuIG9uIHdyaXRpbmcgYSAiYWRkLW9uIiBsaWJyYXJ5IHRoYXQKICAgICAgICAgIHByb3ZpZGVzIFBLQ1Mgc3VwcG9ydC4uLiAKICAgICAgIC0tIHVwZGF0ZWQgdGhlIGNvbmZpZyBzeXN0ZW0gc28gdGhlICNkZWZpbmVzIGFyZSBpbiB0aGUgbWFrZWZpbGVzIGluc3RlYWQgb2YgbXljcnlwdF9jZmcuaCAgCiAgICAgICAtLSBXaWxsaW5nIHRvIHdvcmsgb24gYW4gaG91cmx5IGJhc2lzIGZvciAxNSQgQ0ROIHBlciBob3VyLgogICAgICAgLS0gdXBkYXRlZCB0aGUgdGVzdCBwcm9ncmFtIHRvIG5vdCB0ZXN0IGNpcGhlcnMgbm90IGluY2x1ZGVkCiAgICAgICAtLSB1cGRhdGVkIHRoZSBtYWtlZmlsZSB0byBtYWtlICJyc2Ffc3lzLmMiIGEgZGVwZW5kZW5jeSBvZiByc2EubyBbaGVscHMgZGV2ZWxvcCB0aGUgY29kZS4uLl0KICAgICAgIC0tIGZpeGVkIG51bWVyb3VzIGZhaWx1cmVzIHRvIGRldGVjdCBidWZmZXIgb3ZlcmZsb3dzIFttaW5vcl0gaW4gdGhlIFBLIGNvZGUuCiAgICAgICAtLSBmaXhlZCB0aGUgc2FmZXIgWzY0LWJpdCBibG9jayB2ZXJzaW9uXSB0ZXN0IHJvdXRpbmVzIHdoaWNoIGRpZG4ndCBjaGVjayB0aGUgcmV0dXJucyBvZiB0aGUgc2V0dXAKICAgICAgICAgIGZ1bmN0aW9uCiAgICAgICAtLSBjaGVjayBvdXQgbXkgQ1YgYXQgaHR0cDovL3RvbS5pYWh1LmNhL2N2Lmh0bWwKICAgICAgIC0tIHJlbW92ZWQgdGhlIEdCQSBtYWtlZmlsZSBhbmQgY29kZSBmcm9tIGRlbW9zL3Rlc3QuYyBbbm90IGEgcGFydGljdWxhcmx5IHVzZWZ1bCBkZW1vLi4uXQogICAgICAgLS0gbWVyZ2VkIGluIHJ1ZGltZW50YXJ5IFtmb3IgdGVzdGluZ10gUFMyIFJORyBmcm9tIFNreSBTY2h1bHoKICAgICAgIC0tIG1lcmdlZCBpbiBQUzIgdGltZXIgY29kZSBbb25seSBzaGVsbCBpbmNsdWRlZCBkdWUgdG8gTkRBIHJlYXNvbnMuLi5dCiAgICAgICAtLSB1cGRhdGVkIEhNQUMgY29kZSB0byByZXR1cm4gZXJyb3JzIHdoZXJlIHBvc3NpYmxlCiAgICAgICAtLSBUaGFua3MgZ28gdG8gU2t5IFNjaHVseiB3aG8gYm91Z2h0IG1lIGEgUmVnQ29kZSBmb3IgVGV4dFBhZCBbdGhlIG9mZmljaWFsIGVkaXRvciBvZiBsaWJ0b21jcnlwdF0KCk5vdiAxMnRoLCAyMDAyCnYwLjcwICAtLSBVcGRhdGVkIHNvIHlvdSBjYW4gc3dhcCBvdXQgdGhlIGRlZmF1bHQgbWFsbG9jL2NhbGxvYy9mcmVlIHJvdXRpbmVzIGF0IGJ1aWxkIHRpbWUgd2l0aCBvdGhlcnMuIChTa3kgU2NodWx6KQogICAgICAgLS0gU2t5IFNjaHVseiBjb250cmlidXRlZCBzb21lIGNvZGUgdG93YXJkcyBhdXRvZGV0ZWN0aW5nIHRoZSBQUzIgaW4gbXljcnlwdF9jZmcuaAogICAgICAgLS0gQWRkZWQgUFMyIG1ha2VmaWxlIGNvbnRyaWJ1dGVkIGJ5IFNreSBTY2h1bHogW3NlZSBhIHBhdHRlcm4gZm9ybWluZz9dCiAgICAgICAtLSBBZGRlZCBhYmlsaXR5IHRvIGhhdmUgbm8gRklMRSBJL08gZnVuY3Rpb25zIGF0IGFsbCAoc2VlIG1ha2VmaWxlKSwgU2t5IFNjaHVsei4uLi4KICAgICAgIC0tIEFkZGVkIHN1cHBvcnQgZm9yIHN1YnN0aXR1dGluZyBvdXQgdGhlIGNsb2NrKCkgZnVuY3Rpb24gKFNreSBTY2h1bHopCiAgICAgICAtLSBGaXhlZCB1cCBtYWtlZmlsZSB0byBpbmNsdWRlIG5ldyBoZWFkZXJzIGluIHRoZSBIRUFERVJTIHZhcmlhYmxlCiAgICAgICAtLSBSZW1vdmVkICJjb2luLmMiIGFzIGl0cyBub3QgcmVhbGx5IHVzZWZ1bCBhbnl3YXlzCiAgICAgICAtLSBSZW1vdmVkIG1hbnkgImRlYnVnIiBwcmludGZzIHRoYXQgd291bGQgc2hvdyB1cCBvbiBmYWlsdXJlcy4gIEJhc2ljYWxseSBJIHdhbnRlZCB0byBlbnN1cmUgdGhlIG9ubHkgb3V0cHV0CiAgICAgICAgICB3b3VsZCBiZSBmcm9tIHRoZSBkZXZlbG9wZXIgdGhlbXNlbHZlcy4KICAgICAgIC0tIEFkZGVkICJyYzQuYyIgYSBSQzQgaW1wbGVtZW50YXRpb24gd2l0aCBhIFBSTkcgaW50ZXJmYWNlLiAgU2luY2UgUkM0IGlzbid0IGEgYmxvY2sgY2lwaGVyIGl0IHdvdWxkbid0IHdvcmsKICAgICAgICAgIHRvbyB3ZWxsIGFzIGEgYmxvY2sgY2lwaGVyLgogICAgICAgLS0gRml4ZWQgQVJHQ0hLIG1hY3JvIHVzYWdlIHdoZW4gQVJHVFlQRT0xIHRocm91Z2hvdXQgdGhlIGNvZGUKICAgICAgIC0tIHVwZGF0ZWQgbWFrZWZpbGUgdG8gbWFrZSBzdWJkaXJlY3RvcnkgcHJvcGVybHkgKFNrdSBTY2h1bHopCiAgICAgICAtLSBTdGFydGVkIHRvd2FyZHMgbmV3IEFQSSBzZXR1cC4gIEluc3RlYWQgb2YgY2hlY2tpbmcgZm9yICI9PSBDUllQVF9FUlJPUiIgeW91IHNob3VsZCBjaGVjayAiIT0gQ1JZUFRfT0siCiAgICAgICAgICBJbiBmdXR1cmUgcmVsZWFzZXMgZnVuY3Rpb25zIHdpbGwgcmV0dXJuIHRoaW5ncyBvdGhlciB0aGFuIENSWVBUX0VSUk9SIG9uIGVycm9yIHRvIGdpdmUgbW9yZSB1c2VmdWwKICAgICAgICAgIHRocmVhZCBzYWZlIGVycm9yIHJlcG9ydGluZy4gIFRoZSBtYW51YWwgd2lsbCBiZSB1cGRhdGVkIHRvIHJlZmxlY3QgdGhpcy4gIEZvciB0aGlzIHJlbGVhc2UgYWxsCiAgICAgICAgICBlcnJvcnMgYXJlIHJldHVybmVkIGFzIENSWVBUX0VSUk9SIChleGNlcHQgYXMgbm90ZWQpIGJ1dCBpbiBmdXR1cmUgcmVsZWFzZXMgdGhpcyB3aWxsIGNoYW5nZS4gICAgICAgICAKICAgICAgIC0tIFJlbW92ZWQgdGhlIHpsaWIgYnJhbmNoIHNpbmNlIGl0cyBub3QgcmVhbGx5IHJlcXVpcmVkIGFueXdheXMuICBNYWtlcyB0aGUgcGFja2FnZSBzbWFsbGVyCgpOb3YgMTF0aCwgMjAwMgp2MC42OSAgLS0gQWRkZWQgQVJHQ0hLIChzZWUgbXljcnlwdF9hcmdjaGsuaCkgImFyZ3VlbWVudCBjaGVja2luZyIgdG8gYWxsIGZ1bmN0aW9ucyB0aGF0IGFjY2VwdCBwb2ludGVycwogICAgICAgLS0gTm90ZSBJIGZvcmdvdCB0byBjaGFuZ2UgdGhlIENSWVBUIHZlcnNpb24gdGFnIGluIHYwLjY4Li4uIGZpeGVkIG5vdy4KCk5vdiA4dGgsIDIwMDIKdjAuNjggIC0tIEZpeGVkIGZsYXcgaW4ga3JfaW1wb3J0L2tyX2V4cG9ydCB0aGF0IHdhc3RlZCA0IGJ5dGVzLiAgU291cmNlIGJ1dCBub3QgYmluYXJ5IGNvbXBhdGlibGUgd2l0aCB2MC42NwogICAgICAgLS0gRml4ZWQgYnVnIGluIGtyX2ZpbmRfbmFtZSB0aGF0IHVzZWQgbWVtY21wIHRvIG1hdGNoIHN0cmluZ3MuICBVc2VzIHN0cm5jbXAgbm93LgogICAgICAgLS0ga3JfY2xlYXIgbm93IHNldHMgdGhlIHBvaW50ZXIgdG8gTlVMTCB0byBmYWNpbGF0ZSBkZWJ1Z2dpbmcgW2UuZy4gdXNpbmcgdGhlIGtleXJpbmcgYWZ0ZXIgY2xlYXJpbmddCiAgICAgICAtLSBzdGF0aWMgZnVuY3Rpb25zIGluIF93cml0ZS9fcmVhZCBpbiBrZXlyaW5nLmMgbm93IGNoZWNrIHRoZSByZXR1cm4gb2YgY3RyX2VuY3J5cHQvY3RyX2RlY3J5cHQuCiAgICAgICAtLSBVcGRhdGVkIGJsb3dmaXNoL3JjMi9yYzUvcmM2IGtleXNpemUoKSBmdW5jdGlvbiB0byBub3QgcmVqZWN0IGtleXMgbGFyZ2VyIHRoYW4gdGhlIGJpZ2dlc3Qga2V5IHRoZQogICAgICAgICAgcmVzcGVjdGl2ZSBjaXBoZXJzIGNhbiB1c2UuICAKICAgICAgIC0tIEZpeGVkIGEgYnVnIGluIGhhc2hzdW0gZGVtbyB0aGF0IHdvdWxkIHJlcG9ydCB0aGUgaGFzaCBmb3IgZmlsZXMgdGhhdCBkb24ndCBleGlzdCEKCk9jdCAxNnRoLCAyMDAyCnYwLjY3ICAtLSBNb3ZlZCB0aGUgZnVuY3Rpb24gcHJvdG90eXBlcyBpbnRvIGZpbGVzIG15Y3J5cHRfKi5oLiAgVG8gImluc3RhbGwiIHRoZSBsaWIganVzdCBjb3B5IGFsbCB0aGUgCiAgICAgICAgICBoZWFkZXIgZmlsZXMgIiouaCIgZnJvbSB0aGUgYmFzZSBvZiB0aGlzIHByb2plY3QgaW50byB5b3VyIGdsb2JhbCBpbmNsdWRlIHBhdGguCiAgICAgICAtLSBNYWRlIHRoZSBPRkIvQ0ZCL0NUUiBmdW5jdGlvbnMgdXNlICJ1bnNpZ25lZCBsb25nIiBmb3IgdGhlIGxlbmd0aCBpbnN0ZWFkIG9mICJpbnQiCiAgICAgICAtLSBBZGRlZCBrZXlyaW5nIHN1cHBvcnQgZm9yIHRoZSBQSyBmdW5jdGlvbnMKICAgICAgIC0tICoqKkFQSSBDSEFOR0UqKiogY2hhbmdlZCB0aGUgZWNjX21ha2Vfa2V5IGFuZCBkaF9tYWtlX2tleSB0byBhY3QgbW9yZSBsaWtlIHJzYV9tYWtlX2tleS4gIEJhc2ljYWxseQogICAgICAgICAgbW92ZSB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIG5leHQgdG8gbGFzdC4KICAgICAgIC0tIEZpeGVkIGJ1ZyBpbiBkaF90ZXN0KCkgdGhhdCB3b3VsZG4ndCB0ZXN0IHRoZSBwcmltYWxpdHkgb2YgdGhlIG9yZGVyIG9mIHRoZSBzdWItZ3JvdXAKICAgICAgIC0tIHJlcGxhY2VkIHRoZSBwcmltZXMgaW4gdGhlIERIIGNvZGUgd2l0aCBuZXcgb25lcyB0aGF0IGFyZSBsYXJnZXIgdGhhbiB0aGUgc2l6ZSB0aGV5IGFyZSAKICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aC4gIFRoYXQgaXMgYSAxMDI0LWJpdCBESCBrZXkgd2lsbCBoYXZlIGEgMTAyNS1iaXQgcHJpbWUgYXMgdGhlIG1vZHVsdXMKICAgICAgIC0tIGNsZWFuZWQgdXAgYWxsIHRoZSBQSyBjb2RlLCBjaGFuZ2VkIGEgYml0IG9mIHRoZSBBUEkgYXJvdW5kIFtub3Qgc291cmNlIGNvbXBhdGlibGUgd2l0aCB2MC42Nl0KICAgICAgIC0tIG1ham9yIGVkaXRpbmcgb2YgdGhlIG1hbnVhbCwgc3RhcnRlZCBEb2NlciBwcm9ncmFtCiAgICAgICAtLSBhZGRlZCAxNjAgYW5kIDIyNCBiaXQga2V5IHNldHRpbmdzIGZvciBFQ0MuICBUaGlzIG1ha2VzIHRoZSBESCBhbmQgRUNDIGJpbmFyeSB3aXNlIGluY29tcGF0aWJsZSB3aXRoIHYwLjY2CiAgICAgICAtLSBBZGRlZCBhbiBhZGRpdGlvbmFsIGNoZWNrIGZvciBtZW1vcnkgZXJyb3JzIGluIGlzX3ByaW1lKCkgYW5kIGNsZWFuZWQgdXAgcHJpbWUuYyBhIGJpdAogICAgICAgLS0gUmVtb3ZlZCBJRF9UQUcgZnJvbSBhbGwgZmlsZXMgW21laCwgbm90IGEgYmlnIGZhbi4uLl0KICAgICAgIC0tIFJlbW92ZWQgdW51c2VkIHZhcmlhYmxlIGZyb20geWFycm93IHN0YXRlIGFuZCBtYWRlIEFFUy9TSEEyNTYgdGhlIGRlZmF1bHQgY2lwaGVyL2hhc2ggY29tYm8KICAgICAgIC0tIEZpeGVkIGEgYnVnIGluIHRoZSBZYXJyb3cgY29kZSB0aGF0IGNhbGxlZCBwcm5nX2lzX3ZhbGlkIGluc3RlYWQgb2YgY2lwaGVyX2lzX3ZhbGlkIGZyb20geWFycm93X3N0YXJ0KCkKICAgICAgIC0tIFRoZSBFQ0IvQ0JDL09GQi9DRkIvQ1RSIHdyYXBwZXJzIG5vdyBjaGVjayB0aGF0IHRoZSBjaXBoZXIgaXMgdmFsaWQgaW4gdGhlIGVuY3J5cHQvZGVjcnlwdCBjYWxscwogICAgICAgICAgUmV0dXJucyBpbnQgbm93IGluc3RlYWQgb2Ygdm9pZC4KClNlcHQgMjR0aCwgMjAwMgp2MC42NiAgLS0gVXBkYXRlZCB0aGUgL2RlbW9zL3Rlc3QuYyBwcm9ncmFtIHRvIHRpbWUgdGhlIGhhc2hlcyBjb3JyZWN0bHkuICBBbHNvIGl0IHVzZXMgdGhlIHlhcnJvdyBQUk5HIGZvciBhbGwgb2YgdGhlIAogICAgICAgICAgdGVzdHMgbWVhbmluZyBpdHMgcG9zc2libGUgdG8gcnVuIG9uIFJORyBsZXNzIHBsYXRmb3JtcyAKICAgICAgIC0tIFVwZGF0ZWQgdGhlIC9kZW1vcy9oYXNoc3VtLmMgcHJvZ3JhbSB0byBoYXNoIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0CiAgICAgICAtLSBVcGRhdGVkIHRoZSBSU0EgY29kZSB0byBtYWtlIGtleXMgYSBiaXQgcXVpY2tlciBbdXBkYXRlIGJ5IFdheW5lIFNjb3R0XSBieSBub3QgbWFraW5nIGJvdGggcHJpbWVzIGF0IHRoZSBzYW1lCiAgICAgICAgICB0aW1lLgogICAgICAgLS0gRGFuIEthbWluc2t5IHN1Z2dlc3RlZCBzb21lIGNsZWFudXBzIGZvciB0aGUgY29kZSBhbmQgdGhlIE1QSSBjb25maWcKICAgICAgICAgIENvZGUgc2hpcHMgaW4gdW5peCBMRiBmb3JtYXQgYnkgZGVmYXVsdCBub3cgdG9vLi4uIHdpbGwgc3RpbGwgYnVpbGQgaW4gTVNWQyBhbmQgYWxsLi4uIGJ1dCBpZiB5b3Ugd2FudAogICAgICAgICAgdG8gcmVhZCB0aGUgc3R1ZmYgeW91J2xsIGhhdmUgdG8gY29udmVydCBpdCAKICAgICAgIC0tIENoYW5nZXMgdG8gdGhlIG1hbnVhbCB0byByZWZsZWN0IG5ldyBBUEkgW2UuZy4gaGFzaF9tZW1vcnkvZmlsZSBoYXZlIHYwLjY1IHByb3RvdHlwZXNdYW5kIHNvbWUgdHlwb3MgZml4ZWQKClNlcHQgMjB0aCwgMjAwMgp2MC42NSAgLS0gV2F5bmUgU2NvdHQgKHdzY290dEBiaXRtb3Zlci5jb20pIG1hZGUgYSBmZXcgb2Ygc3VnZ2VzdGlvbnMgdG8gaW1wcm92ZSB0aGUgbGlicmFyeS4gIE1vc3QgCiAgICAgICAgICBpbXBvcnRhbnRseSBoZSBwb2ludGVkIG91dCB0aGUgbWF0aCBsaWIgaXMgbm90IHJlYWxseSByZXF1aXJlZC4gIEhlJ3MgYWxzbyB0ZXN0ZWQgdGhlIGxpYiBvbiAxOCAKICAgICAgICAgIGRpZmZlcmVudCBwbGF0Zm9ybXMuICBBY2NvcmRpbmcgdG8gaGltIHdpdGggb25seSBhIGZldyB0cm91YmxlcyBbbGFjayBvZiAvZGV2L3JhbmRvbSwgZXRjXSB0aGUgCiAgICAgICAgICBsaWJyYXJ5IHdvcmtlZCBhcyBpdCB3YXMgc3VwcG9zZWQgdG8uICBZb3UgY2FuIGZpbmQgdGhlIGxpc3QgYXQgCiAgICAgICAgICBodHRwOi8vd3d3LmJpdGtlZXBlci5jb20vUHJvZHVjdHMuQml0S2VlcGVyLlBsYXRmb3Jtcy5odG1sCiAgICAgICAtLSBVcGRhdGVkIHRoZSBoYXNoX2ZpbGUgYW5kIGhhc2hfbWVtb3J5IGZ1bmN0aW9ucyB0byBrZWVwIHRyYWNrIG9mIHRoZSBzaXplIG9mIHRoZSBvdXRwdXQKICAgICAgIC0tIFdheW5lIFNjb3R0IHVwZGF0ZWQgdGhlIGRlbW9zL3Rlc3QuYyBmaWxlIHRvIHVzZSB0aGUgU1BSTkcgbGVzcyBhbmQgWWFycm93IG1vcmUKICAgICAgIC0tIE1vZGlmaWVkIHRoZSBteWNyeXB0X2NmZy5oIHRvIGF1dG9kZXRlY3QgeDg2LTMyIG1hY2hpbmVzCgpTZXB0IDE5dGgsIDIwMDIKdjAuNjQgIC0tIHdyb3RlIG1ha2VmaWxlIGZvciB0aGUgR0JBIGRldmljZSBbYW5kIGhhY2tlZCB0aGUgZGVtb3MvdGVzdC5jIGZpbGUgdG8gc3VwcG9ydCBpdCBjb25kaXRpb25hbGx5XQogICAgICAgLS0gRml4ZWQgZXJyb3IgaW4gUEsgKGUuZy4gRUNDLCBSU0EsIERIKSBpbXBvcnQgZnVuY3Rpb25zIHdoZXJlIEkgd2FzIGNsb2JiZXJpbmcgdGhlIHBhY2tldCBlcnJvciBtZXNzYWdlcwogICAgICAgLS0gZml4ZWQgbW9yZSB0eXBvcyBpbiB0aGUgbWFudWFsCiAgICAgICAtLSByZW1vdmVkIGFsbCB1bnVzZWQgdmFyaWFibGVzIGZyb20gdGhlIGNvcmUgbGlicmFyeSAoaWdub3JlIHRoZSBJRF9UQUcgc3R1ZmYpCiAgICAgICAtLSBhZGRlZCAiY29uc3QgY2hhciAqY3J5cHRfYnVpbGRfc2V0dGluZ3MiIHN0cmluZyB3aGljaCBpcyBhIGJ1aWxkIHRpbWUgY29uc3RhbnQgdGhhdCBnaXZlcyBhIGxpc3RpbmcKICAgICAgICAgIG9mIGFsbCB0aGUgYnVpbGQgdGltZSBvcHRpb25zLiAgVXNlZnVsIGZvciBkZWJ1Z2dpbmcgc2luY2UgeW91IGNhbiBzZW5kIHRoYXQgdG8gbWUgYW5kIEkgd2lsbCBrbm93IHdoYXQgCiAgICAgICAgICBleGFjdGx5IHlvdSBoYWQgc2V0IGZvciB0aGUgbXljcnlwdF9jZmcuaCBmaWxlLgogICAgICAgLS0gQWRkZWQgY29udHJvbCBvdmVyIGVuZGlhbmVzcy4gIE91dCBvZiB0aGUgYm94IGl0IGRlZmF1bHRzIHRvIGVuZGlhbmVzcyBuZXV0cmFsIGJ1dCB5b3UgY2FuIHRyaXZpYWxseSAKICAgICAgICAgIGNvbmZpZ3VyZSB0aGUgbGlicmFyeSBmb3IgeW91ciBwbGF0Zm9ybS4gIFVzaW5nIHRoaXMgSSBib29zdGVkIFJDNSBmcm9tIDY2ME1iaXQvc2VjIHRvIDc4NU1iaXQvc2VjIG9uIG15IAogICAgICAgICAgQXRobG9uIGJveC4gIFNlZSAibXljcnlwdF9jZmcuaCIgZm9yIG1vcmUgaW5mb3JtYXRpb24uCgpTZXB0IDExdGgsIDIwMDIKdjAuNjMgIC0tIE1hZGUgaGFzaHN1bSBkZW1vIG91dHB1dCBsaWtlIHRoZSBvcmlnaW5hbCBtZDVzdW0gcHJvZ3JhbSAKICAgICAgIC0tIE1hZGUgYWRkaXRpb25zIHRvIHRoZSBleGFtcGxlcyBpbiB0aGUgbWFudWFsIChmaXhlZCB0aGVtIHVwIGEgYnVuY2gpCiAgICAgICAtLSBNZXJnZWQgaW4gdGhlIGJhc2U2NCBjb2RlIGZyb20gV2F5bmUgU2NvdHQgKHdzY290dEBiaXRtb3Zlci5jb20pCgpBdWcgMjl0aCwgMjAwMgp2MC42MiAgLS0gQWRkZWQgdGhlIENMRUFOX1NUQUNLIGZ1bmN0aW9uYWxpdHkgdG8gc2V2ZXJhbCBvZiB0aGUgaGFzaGVzIEkgZm9yZ290IHRvIHVwZGF0ZS4KCkF1ZyA5dGgsIDIwMDIKdjAuNjEgIC0tIEZpeGVkIGEgYnVnIGluIHRoZSBERVMgY29kZSBbb29wcyBJIHJlYWQgc29tZXRoaW5nIHdyb25nXS4KCkF1ZyA4dGgsIDIwMDIKdjAuNjAgIC0tIE1lcmdlZCBpbiBERVMgY29kZSBbYW5kIHdyb3RlIDNERVMtRURFIGNvZGUgYmFzZWQgb24gaXRdIGZyb20gRG9iZXMgVi4KCkF1ZyA3dGgsIDIwMDIKdjAuNTkgIC0tIEZpeGVkIGEgInVuc2lnbmVkIGxvbmcgbG9uZyIgYnVnIHRoYXQgY2F1c2VkIHYwLjU4IG5vdCB0byBidWlsZCBpbiBNU1ZDLgogICAgICAgLS0gQ2xlYW5lZCB1cCBhIGxpdHRsZSBpbiB0aGUgbWFrZWZpbGUKICAgICAgIC0tIGFkZGVkIGNvZGUgdGhhdCB0aW1lcyB0aGUgaGFzaCBmdW5jdGlvbnMgdG9vIGluIHRoZSB0ZXN0IHByb2dyYW0KCkF1ZyAzcmQsIDIwMDIKdjAuNTggIC0tIEFkZGVkIG1vcmUgc3RhY2sgY2xlYW5pbmcgY29uZGl0aW9uYWxzIHRocm91Z2hvdXQgdGhlIGNvZGUuICAKICAgICAgIC0tIGNvcnJlY3RlZCBzb21lIENMRUFSX1NUQUNLIGNvbmRpdGlvbmFscy4uLiBzaG91bGQgaGF2ZSBiZWVuIENMRUFOX1NUQUNLCiAgICAgICAtLSBTaW1wbGlmaWVkIHRoZSBSU0EsIERIIGFuZCBFQ0MgZW5jcnlwdCgpIHJvdXRpbmVzIHdoZXJlIHRoZXkgdXNlIENUUiB0byBlbmNvZGUgdGhlIG1lc3NhZ2UKICAgICAgICAgIG5vdyB0aGV5IG9ubHkgbWFrZSBvbmUgY2FsbCB0byBjdHJfZW5jcnlwdCgpL2N0cl9kZWNyeXB0KCkuCgpBdWcgMm5kLCAyMDAyCnYwLjU3ICAtLSBGaXhlZCBhIGZldyBlcnJvcnMgbWVzc2FnZXMgaW4gdGhlIFNBRkVSIGNvZGUgdG8gYWN0dWFsbHkgcmVwb3J0IHRoZSBjb3JyZWN0IGNpcGhlciBuYW1lLgogICAgICAgLS0gcnNhX2VuY3J5cHQoKSB1c2VzIHRoZSAia2V5c2l6ZSgpIiBtZXRob2Qgb2YgdGhlIGNpcGhlciBiZWluZyB1c2VkIHRvIG1vcmUgYWNjdXJhdGVseSBwaWNrIGEKICAgICAgICAgIGtleSBzaXplLiAgQnkgZGVmYXVsdCByc2FfZW5jcnlwdCgpIHdpbGwgY2hvb3NlIHRvIHVzZSBhIDI1Ni1iaXQga2V5IGJ1dCB0aGUgY2lwaGVyIGNhbiB0dXJuIHRoYXQgCiAgICAgICAgICBkb3duIGlmIHJlcXVpcmVkLgogICAgICAgLS0gVGhlIHJzYV9leHB0bW9kKCkgZnVuY3Rpb24gd2lsbCBub3cgbW9yZSByZWxpYWJseSBkZXRlY3QgaW52YWxpZCBpbnB1dHMgKGUuZy4gZ3JlYXRlciB0aGFuIHRoZSBtb2R1bHVzKS4KICAgICAgIC0tIFRoZSBwYWRkaW5nIG1ldGhvZCBmb3IgUlNBIGlzIG1vcmUgY2xlYXJseSBkb2N1bWVudGVkLiAgTmFtZWx5IGlmIHlvdSB3YW50IHRvIGVuY3J5cHQvc2lnbiBzb21ldGhpbmcgb2YgbGVuZ3RoCiAgICAgICAgICBOIHRoZW4geW91ciBtb2R1bHVzIG11c3QgYmUgb2YgbGVuZ3RoIDErM04uICBTbyB0byBzaWduIGEgbWVzc2FnZSB3aXRoIHNheSBTSEEtMzg0IFs0OCBieXRlc10geW91IG5lZWQgYSAKICAgICAgICAgIDE0NSBieXRlICgxMTYwIGJpdHMpIG1vZHVsdXMuICBUaGlzIGlzIGFsbCBpbiB0aGUgbWFudWFsIG5vdy4KICAgICAgIC0tIEFkZGVkIGJ1aWxkIG9wdGlvbiBDTEVBTl9TVEFDSyB3aGljaCB3aWxsIGFsbG93IHlvdSB0byBjaG9vc2Ugd2hldGhlciB5b3Ugd2FudCB0byBjbGVhbiB0aGUgc3RhY2sgb3Igbm90IGFmdGVyIGV2ZXJ5CiAgICAgICAgICBjaXBoZXIvaGFzaCBjYWxsCiAgICAgICAtLSBTcGVkIHVwIHRoZSBoYXNoICJwcm9jZXNzKCkiIGZ1bmN0aW9ucyBieSBub3QgY29weWluZyBvbmUgYnl0ZSBhdCBhIHRpbWUuCiAgICAgICArKyAoYWRkZWQganVzdCBhZnRlciBJIHVwbG9hZGVkLi4uKQogICAgICAgICAgTUQ0IHByb2Nlc3MoKSBub3cgaGFuZGxlcyBpbnB1dCBidWZmZXJzID4gNjQgYnl0ZXMKCkF1ZyAxc3QsIDIwMDIKdjAuNTYgIC0tIENsZWFuZWQgdXAgdGhlIGNvbW1lbnRzIGluIHRoZSBCbG93ZmlzaCBjb2RlLgogICAgICAgLS0gT2ggeWVhaCwgaW4gdjAuNTUgSSBtYWRlIGFsbCBvZiB0aGUgZGVzY3JpcHRvciBlbGVtZW50cyBjb25zdGFudC4gIEkganVzdCBmb3Jnb3QgdG8gbWVudGlvbiBpdC4KICAgICAgIC0tIGZpeGVkIGEgY291cGxlIG9mIHBsYWNlcyB3aGVyZSBkZXNjcmlwdG9yIGluZGV4ZXMgd2VyZSB0ZXN0ZWQgd3JvbmcuICBOb3QgYSBodWdlIGJ1ZyBidXQgbm93IGl0cyBoYXJkZXIKICAgICAgICAgIHRvIG1lc3MgdXAuCiAgICAgICAtLSBBZGRlZCB0aGUgU0FGRVIgWzY0LWJpdCBibG9ja10gY2lwaGVycyBLNjQsIFNLNjQsIEsxMjggYW5kIFNLMTI4IHRvIHRoZSBsaWJyYXJ5LgogICAgICAgLS0gQWRkZWQgdGhlIFJDMiBibG9jayBjaXBoZXIgdG8gdGhlIGxpYnJhcnkuCiAgICAgICAtLSBDaGFuZ2VkIHRoZSBTQUZFUiBkZWZpbmUgZm9yIHRoZSBTQUZFUisgY2lwaGVyIHRvIFNBRkVSUCBzbyB0aGF0IHRoZSBuZXcgU0FGRVIgWzY0LWJpdF0gY2lwaGVycwogICAgICAgICAgY2FuIHVzZSB0aGVtIHdpdGggbGVzcyBjb25mdXNpb24uCgpKdWx5IDI5dGgsIDIwMDIKdjAuNTUgIC0tIE15IGdvZCBzdHVwaWQgQmxvd2Zpc2ggaGFzIHlldCBhZ2FpbiBiZWVuIGZpeGVkLiAgSSBzd2VhciBJIGhhdGUgdGhhdCBjaXBoZXIuICBOZXh0IGJ1ZyBpbiBpdCBhbmQgYm9vbSBpdHMgb3V0IG9mIHRoZQogICAgICAgICAgbGlicmFyeS4gIFVzZSBBRVMgb3Igc29tZXRoaW5nIGVsc2UgY3V6IEkgcmVhbGx5IGhhdGUgQmxvd2Zpc2ggYXQgdGhpcyBzdGFnZS4uLi4KICAgICAgIC0tIFBhcnRpYWwgUEtDUyBzdXBwb3J0IFtoaW50IERPTlQgVVNFIElUIFlFVCBDVVogSVRTIFVOVEVTVEVEIV0KCkp1bHkgMTl0aCwgMjAwMgp2MC41NCAgLS0gQmxvd2Zpc2ggbm93IGNvbmZvcm1zIHRvIGtub3duIHRlc3QgdmVjdG9ycy4gIFNpbGx5IGJhZCBjb2RpbmcgdG9tIQogICAgICAgLS0gUkM1L1JDNi9TZXJwZW50IGFsbCBoYXZlIG1vcmUgdGVzdCB2ZWN0b3JzIG5vdyBbYW5kIHRoZXkgc2VlbWVkIHRvIGhhdmUgYmVlbiB3b3JraW5nIGJlZm9yZV0KCkp1bHkgMTh0aCwgMjAwMgp2MC41MyAgLS0gQWRkZWQgbW9yZSB0ZXN0IHZlY3RvcnMgdG8gdGhlIGJsb3dmaXNoIGNvZGUganVzdCBmb3Iga2lja3MgW2FuZCB0aGV5IGFyZSBjb25zdCBub3cgdG9vIDotKV0KICAgICAgIC0tIGFkZGVkIHBybmcvaGFzaC9jaXBoZXIgaXNfdmFsaWQgZnVuY3Rpb25zIGFuZCB1c2VkIHRoZW0gaW4gYWxsIG9mIHRoZSBQSyBjb2RlIHNvIHlvdSBjYW4ndCBlbnRlciB0aGUgY29kZQogICAgICAgICAgd2l0aCBhbiBpbnZhbGlkIGluZGV4IGV2ZXIgbm93LgogICAgICAgLS0gU2ltcGxpZmllZCB0aGUgWWFycm93IGNvZGUgb25jZSBhZ2FpbiA6LSkKCkp1bHkgMTJ0aCwgMjAwMgp2MC41MiAgLS0gRml4ZWQgYSBidWcgaW4gTUQ0IHdoZXJlIHRoZSBoYXNoIGRlc2NyaXB0b3IgSUQgd2FzIHRoZSBzYW1lIGFzIFNIQS01MTIuICBOb3cgTUQ0IHdpbGwgd29yayB3aXRoCiAgICAgICAgICBhbGwgdGhlIHJvdXRpbmVzLi4uCiAgICAgICAtLSBGaXhlZCB0aGUgY29tbWVudHMgaW4gU0hBLTUxMiB0byBiZSBhIGJpdCBtb3JlIG1lYW5pbmdmdWwKICAgICAgIC0tIEluIG1kNCBJIG1hZGUgdGhlIFBBRERJTkcgYXJyYXkgY29uc3QgW2FnYWluIHRvIHN0b3JlIGl0IGluIFJPTV0KICAgICAgIC0tIGluIGhhc2hfZmlsZSBJIHN3aXRjaGVkIHRoZSBjb25zdGFudCAiNTEyIiB0byAic2l6ZW9mKGJ1ZikiIHRvIGJlIGEgYml0IHNhZmVyCiAgICAgICAtLSBpbiBTSEEtMSdzIHRlc3Qgcm91dGluZSBJIGZpeGVkIHRoZSBzdHJpbmcgbGl0ZXJhbCB0byBzYXkgU0hBLTEgbm90IHNoYTEKICAgICAgIC0tIEZpeGVkIGEgbG9naWNhbCBlcnJvciBpbiB0aGUgQ1RSIGNvZGUgd2hpY2ggd291bGQgbWFrZSBpdCBza2lwIHRoZSBmaXJzdCBJViB2YWx1ZS4gIFRoaXMgbWVhbnMKICAgICAgICAgIHRoZSBDVFIgY29kZSBmcm9tIHYwLjUyIHdpbGwgYmUgaW5jb21wYXRpYmxlIFtiaW5hcnkgd2lzZV0gd2l0aCBwcmV2aW91cyByZWxlYXNlcyBidXQgaXQgbWFrZXMgbW9yZQogICAgICAgICAgc2Vuc2UgdGhpcyB3YXkuCiAgICAgICAtLSBBZGRlZCB7fSBicmFjZXMgZm9yIGFzIG1hbnkgaWYvZm9yL2Jsb2NrcyBvZiBjb2RlIEkgY291bGQgZmluZC4gIE15IHJ1bGUgaXMgdGhhdCBldmVyeSBmb3IvaWYvd2hpbGUvZG8gYmxvY2sKICAgICAgICAgIG11c3QgaGF2ZSB7fSBicmFjZXMgYXJvdW5kIGl0LgogICAgICAgLS0gbWFkZSB0aGUgcm91bmRzIHRhYmxlIGluIHNhZmVycF9zZXR1cCBjb25zdCBbYWdhaW4gZm9yIHRoZSBST00gdGhpbmsgYWJvdXQgdGhlIFJPTSFdCiAgICAgICAtLSBmaXhlZCBSQzUgc2luY2UgaXQgbm8gbG9uZ2VyIHJlcXVpcmVzIHJjNSB0byBiZSByZWdpc3RlcmVkIGluIHRoZSBsaWIuICBJdCB1c2VkIHRvIHNpbmNlIHRoZSBkZXNjcmlwdG9ycyB1c2VkIHRvIAogICAgICAgICAgYmUgcGFydCBvZiB0aGUgdGFibGUuLi4KICAgICAgIC0tIHRoZSBwYWNrZXQuYyBjb2RlIG5vdyBtYWtlcyBjcnlwdF9lcnJvciBsaXRlcmFsIHN0cmluZyBlcnJvcnMgd2hlbiBhbiBlcnJvciBvY2N1cnMKICAgICAgIC0tIGNsZWFuZWQgdXAgdGhlIFNBRkVSKyBrZXkgc2NoZWR1bGUgdG8gYmUgYSBiaXQgZWFzaWVyIHRvIHJlYWQuCiAgICAgICAtLSBmaXhlZCBhIGh1Z2UgYnVnIGluIFR3b2Zpc2ggd2l0aCB0aGUgVFdPRklTSF9TTUFMTCBkZWZpbmUuICBCZWNhdXNlIEkgY2xlYW4gdGhlIHN0YWNrIG5vdyBJIGhhZAogICAgICAgICAgY2hhbmdlZCB0aGUgImdfZnVuYygpIiB0byBiZSBjYWxsZWQgaW5kaXJlY3RseS4gIEkgZm9yZ290IHRvIGFjdHVhbGx5IHJldHVybiB0aGUgcmV0dXJuIG9mIHRoZSBUd29maXNoCiAgICAgICAgICBnX2Z1bmMoKSBmdW5jdGlvbiB3aGljaCBjYXVzZWQgaXQgbm90IHRvIHdvcmsuLi4gW2RvZXMgbm93IDotKV0KCkp1bHkgMTF0aCwgMjAwMgp2MC41MSAgLS0gRml4ZWQgYSBidWcgaW4gU0hBNTEyLzM4NCBjb2RlIGZvciBtdWx0aS1ibG9jayBtZXNzYWdlcy4KICAgICAgIC0tIEFkZGVkIG1vcmUgdGVzdCB2ZWN0b3JzIHRvIHRoZSBTSEEzODQvNTEyIGFuZCBUSUdFUiBoYXNoIGZ1bmN0aW9ucwogICAgICAgLS0gY2xlYW5lZCB1cCB0aGUgaGFzaCBkb25lIHJvdXRpbmVzIHRvIG1ha2UgbW9yZSBzZW5zZQogCkp1bHkgMTB0aCwgMjAwMgp2MC41MCAgLS0gRml4ZWQgeWFycm93LmMgc28gdGhhdCB0aGUgY2lwaGVyL2hhc2ggdXNlZCB3b3VsZCBiZSByZWdpc3RlcmVkLiAgQWxzbyBmaXhlZAogICAgICAgICAgYSBidWcgd2hlcmUgdGhlIFNBRkVSKyBuYW1lIHdhcyAic2FmZXIiIGJ1dCBzaG91bGQgaGF2ZSBiZWVuICJzYWZlcisiLgogICAgICAgLS0gQWRkZWQgYW4gZWxlbWVudCB0byB0aGUgaGFzaCBkZXNjcmlwdG9ycyB0aGF0IGdpdmVzIHRoZSBzaXplIG9mIGEgYmxvY2sgW3NlbnQgaW50byB0aGUgY29tcHJlc3Nvcl0KICAgICAgIC0tIENsZWFuZWQgdXAgdGhlIHN1cHBvcnQgZm9yIEhNQUMncwogICAgICAgLS0gQ2xlYW5lZCB1cCB0aGUgdGVzdCB2ZWN0b3Igcm91dGluZXMgdG8gbWFrZSB0aGUgdGVzdCB2ZWN0b3IgZGF0YSBjb25zdC4gIFRoaXMgbWVhbnMgb24gc29tZSBwbGF0Zm9ybXMgaXQgd2lsbCBiZQogICAgICAgICAgcGxhY2VkIGluIFJPTSBub3QgUkFNIG5vdy4KICAgICAgIC0tIEFkZGVkIE1ENCBjb2RlIHN1Ym1pdGVkIGJ5IERvYmVzIFZhbmRlcm1lZXIgKGRvYmVzQHNtYXJ0dC5jb20pCiAgICAgICAtLSBBZGRlZCAiYnVybl9zdGFjayIgZnVuY3Rpb24gW2lkZWEgdGFrZW4gZnJvbSBhbm90aGVyIHNvdXJjZSBvZiBjcnlwdG8gY29kZV0uICBUaGUgaWRlYSBpcyBpZiBhIGZ1bmN0aW9uIGhhcwogICAgICAgICAgYWxvdCBvZiB2YXJpYWJsZXMgaXQgd2lsbCBjbGVhbiB1cCBiZXR0ZXIuICBGdW5jdGlvbnMgbGlrZSB0aGUgZWNiIHNlcnBlbnQgYW5kIHR3b2Zpc2ggY29kZSB3aWxsIG5vdyBoYXZlIHRoZWlyCiAgICAgICAgICBzdGFja3MgY2xlYW5lZCBhbmQgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgaXMgZ2V0dGluZyBtdWNoIG1vcmUgc3RyYWlnaHRmb3J3YXJkLgogICAgICAgLS0gQWRkZWQgYSBoYXNoaW5nIGRlbW8gYnkgRGFuaWVsIFJpY2hhcmRzIChreWh3YW5hQHdvcmxkLW5ldC5jby5ueikKICAgICAgIC0tIEkgKFRvbSkgbW9kaWZpZWQgc29tZSBvZiB0aGUgdGVzdCB2ZWN0b3Igcm91dGluZXMgdG8gdXNlIG1vcmUgdmVjdG9ycyBhbGEgRG9iZXMgc3R5bGUuCiAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhlIE1ENS9TSEExIGNvZGUgbm93IHVzZXMgYWxsIG9mIHRoZSB0ZXN0IHZlY3RvcnMgZnJvbSB0aGUgUkZDL0ZJUFMgc3BlYy4KICAgICAgIC0tIEZpeGVkIHRoZSByZWdpc3Rlci91bnJlZ2lzdGVyIGZ1bmN0aW9ucyB0byBwcm9wZXJseSByZXBvcnQgZXJyb3JzIGluIGNyeXB0X2Vycm9yCiAgICAgICAtLSBDb3JyZWN0bHkgdXBkYXRlZCB5YXJyb3cgY29kZSB0byByZW1vdmUgYSBmZXcgdW51c2VkIHZhcmlhYmxlcy4KICAgICAgIC0tIFVwZGF0ZWQgbWFudWFsIHRvIGZpeCBhIGZldyBlcnJvbmVvdXMgZXhhbXBsZXMuCiAgICAgICAtLSBBZGRlZCBzZWN0aW9uIG9uIEhhc2ggYmFzZWQgTWVzc2FnZSBBdXRoZW50aWNhdGlvbiBDb2RlcyAoSE1BQykgdG8gdGhlIG1hbnVhbAoKSnVuZSAxOXRoLCAyMDAyCnYwLjQ2ICAtLSBBZGRlZCBpbiBITUFDIGNvZGUgZnJvbSBEb2JlcyBWYW5kZXJtZWVyIChkb2Jlc0BzbWFydHQuY29tKQoKSnVuZSA4dGgsIDIwMDIKdjAuNDUgIC0tIEZpeGVkIGJ1ZyBpbiByYzUuYyB3aGVyZSBpZiB5b3UgY2FsbGVkIHJjNV9zZXR1cCgpIGJlZm9yZSByZWdpc3RlcmluZyBSQzUgaXQgd291bGQgY2F1c2UKICAgICAgICAgIHVuZGVmaW5lZCBiZWhhdmlvdXIuCiAgICAgICAtLSBGaXhlZCBteWNyeXB0X2NmZy5oIHRvIGVsaW1pbmF0ZSB0aGUgMjI0IGJpdCBFQ0Mga2V5LgogICAgICAgLS0gbWFkZSB0aGUgImRlZmF1bHQiIG1ha2VmaWxlIHRhcmdldCBoYXZlIGRlcGVuZHMgb24gbXljcnlwdC5oIGFuZCBteWNyeXB0X2NmZy5oCgpBcHIgNHRoLCAyMDAyCnYwLjQ0ICAtLSBGaXhlZCBidWcgaW4gZWNjLmM6Om5ld19wb2ludCgpIHdoZXJlIGlmIHRoZSBpbml0aWFsIG1hbGxvYyBmYWlscyBpdCB3b3VsZCBub3QgY2F0Y2ggaXQuCgpNYXIgMjJuZCwgMjAwMgp2MC40MyAgLS0gQ2hhbmdlZCB0aGUgWkxJQiBjb2RlIG92ZXIgdG8gdGhlIDEuMS40IGNvZGUgYmFzZSB0byBhdm9pZCB0aGUgImRvdWJsZSBmcmVlIiBidWcuICAKICAgICAgIC0tIFVwZGF0ZWQgdGhlIEdDQyBtYWtlZmlsZSBub3QgdG8gdXNlIC1PMyBvciAtZnVucm9sbC1sb29wcwogICAgICAgLS0gVmVyc2lvbiB0YWcgaW4gbXljcnlwdC5oIGhhcyBiZWVuIHVwZGF0ZWQgOi0pCgpNYXIgMTB0aCwgMjAwMgp2MC40MiAgLS0gVGhlIFJORyBjb2RlIGNhbiBub3cgdXNlIC9kZXYvdXJhbmRvbSBiZWZvcmUgdHJ5aW5nIC9kZXYvcmFuZG9tIChKLiBLbGFwc3RlKQoKTWFyIDNyZCwgMjAwMgp2MC40MSAgLS0gQWRkZWQgc3VwcG9ydCB0byBsaW5rIGFuZCB1c2UgY2lwaGVycyBhdCBjb21waWxlIHRpbWUuICBUaGlzIGNhbiBncmVhdGx5IHJlZHVjZSB0aGUgY29kZSBzaXplIQogICAgICAgLS0gQWRkZWQgYSBkZW1vIHRvIHNob3cgb2ZmIGhvdyBzbWFsbCBhbiBhcHBsaWNhdGlvbiBjYW4gZ2V0Li4uIDQ2a2IhCiAgICAgICAtLSBEaXNhc3RyeSBwb2ludGVkIG91dCB0aGF0IEJsb3dmaXNoIGlzIHN1cHBvc2VkIHRvIGJlIGhpZ2ggZW5kaWFuLgogICAgICAgLS0gTWFkZSByZWdpc3RyeSBjb2RlIGZvciB0aGUgUFJOR3MgYXMgd2VsbCBbbm93IHRoZSBzbWFsbGVzdCB1c2VhYmxlIGxpbmsgaXMgNDNrYl0KCkZlYiAxMXRoLCAyMDAyCnYwLjQwICAtLSBSU0Egc2lnbmF0dXJlcyB1c2UgW2FuZCBjaGVjayBmb3JdIGZpeGVkIHBhZGRpbmcgc2NoZW1lLgogICAgICAgLS0gSSdtIGRldmVsb3BpbmcgaW4gTGludXggbm93IDotKQogICAgICAgLS0gTm8gbW9yZSB3YXJuaW5ncyBmcm9tIEdDQyAyLjk2CgpGZWIgNXRoLCAyMDAyCnYwLjM5ICAtLSBVcGRhdGVkIHRoZSBYVEVBIGNvZGUgdG8gd29yayBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFhURUEgZGVzaWduCgpKYW51YXJ5IDI0dGgsIDIwMDIKdjAuMzggIC0tIENGQiBhbmQgT0ZCIG1vZGVzIGNhbiBub3cgaGFuZGxlIGJsb2NrcyBvZiB2YXJpYWJsZSBzaXplIGxpa2UgdGhlIENUUiBjb2RlCiAgICAgICAtLSBXcm90ZSBhIHdyYXBwZXIgYXJvdW5kIHRoZSBtZW1vcnkgY29tcHJlc3MgZnVuY3Rpb25zIGluIFpsaWIgdGhhdCBhY3QgbGlrZSB0aGUgZnVuY3Rpb25zCiAgICAgICAgICBpbiB0aGUgcmVzdCBvZiBteSBjcnlwdG8gbGliCgpKYW51YXJ5IDIzcmQsIDIwMDIKdjAuMzcgIC0tIEFkZGVkIHN1cHBvcnQgY29kZSBzbyB0aGF0IGlmIGEgaGFzaCBzaXplIGFuZCBrZXkgc2l6ZSBmb3IgYSBjaXBoZXIgZG9uJ3QgbWF0Y2ggdXAgdGhleSB3aWxsCiAgICAgICAgICB1c2UgdGhlIG5leHQgbG93ZXIga2V5IHN1cHBvcnRlZC4gIChtYWlubHkgZm9yIHRoZSBQSyBjb2RlKS4gIFNvIHlvdSBjYW4gbm93IHVzZSBTSEEtMSB3aXRoCiAgICAgICAgICBUd29maXNoLCBldGMuLi4KICAgICAgIC0tIEFkZGVkIG1vcmUgb3B0aW9ucyBmb3IgVHdvZmlzaC4gIFlvdSBjYW4gbm93IHRlbGwgaXQgdG8gdXNlIHByZWNvbXB1dGVkIHNib3hlcyBhbmQgTURTIG11bHRpcGxpY2F0aW9ucwogICAgICAgICAgVGhpcyB3aWxsIHNwZWVkIHVwIHRoZSBUV09GSVNIX1NNQUxMIGltcGxlbWVudGF0aW9uIGJ5IGluY3JlYXNpbmcgdGhlIGNvZGUgc2l6ZSBieSAxMDI0IGJ5dGVzLgogICAgICAgLS0gRml4ZWQgYSBidWcgaW4gcHJpbWUuYyB0aGF0IHdvdWxkIG5vdCB1c2UgdGhlIGNvcnJlY3QgdGFibGUgaWYgeW91IHVuZGVmaW5lZCBTTUFMTF9QUklNRV9UQUIKICAgICAgIC0tIEZpeGVkIGFsbCBvZiB0aGUgUEsgcGFja2V0IGNvZGUgdG8gdXNlIHRoZSBzYW1lIGhlYWRlciBmb3JtYXQgW3NlZSBwYWNrZXQuY10uICBUaGlzIG1ha2VzIHRoZSBQSyBjb2RlCiAgICAgICAgICBiaW5hcnkgd2lzZSBpbmNvbXBhdGlibGUgd2l0aCBwcmV2aW91cyByZWxlYXNlcyB3aGlsZSB0aGUgQVBJIGhhcyBub3QgY2hhbmdlZCBhdCBhbGwuCgpKYW51YXJ5IDIybmQsIDIwMDIKdjAuMzYgIC0tIENvcnJlY3Rpb25zIHRvIHRoZSBtYW51YWwKICAgICAgIC0tIE1hZGUgYSBtb2RpZmljYXRpb24gdG8gVHdvZmlzaCB3aGljaCBsZXRzIHlvdSBidWlsZCBhICJzbWFsbCByYW0iIHZhcmlhbnQuICBJdCByZXF1aXJlcwogICAgICAgICAgYWJvdXQgMTkwIGJ5dGVzIG9mIHJhbSBmb3IgdGhlIGtleSBzdG9yYWdlIGNvbXBhcmVkIHRvIHRoZSA0LDIwMCBieXRlcyB0aGUgbm9ybWFsIAogICAgICAgICAgdmFyaWFudCByZXF1aXJlcy4KICAgICAgIC0tIFJlZHVjZWQgdGhlIHN0YWNrIHNwYWNlIHVzZWQgaW4gYWxsIG9mIHRoZSBQSyByb3V0aW5lcy4KCkphbnVhcnkgMTl0aCwgMjAwMgp2MC4zNSAgLS0gSWYgeW91IHJlbW92ZWQgdGhlIGZpcnN0IGhhc2ggb3IgY2lwaGVyIGZyb20gdGhlIGxpYnJhcnkgaXQgd291bGRuJ3QgcmV0dXJuIGFuIGVycm9yIGlmIAogICAgICAgICAgeW91IHVzZWQgYW4gSUQ9MCBbaS5lIGJsb3dmaXNoIG9yIHNoYTI1Nl0gaW4gYW55IHJvdXRpbmUuICBOb3cgaXQgY2hlY2tzIGZvciB0aGF0IGFuZCB3aWxsCiAgICAgICAgICByZXR1cm4gYW4gZXJyb3IgbGlrZSBpdCBzaG91bGQKICAgICAgIC0tIE1lcmdlZCBpbiBuZXcgcm91dGluZXMgZnJvbSBDbGF5IEN1bHZlci4gIFRoZXNlIHJvdXRpbmVzIGFyZSBmb3IgdGhlIFBLIGNvZGUgc28geW91IGNhbiBlYXNpbHkgCiAgICAgICAgICBlbmNvZGUgYSBzeW1tZXRyaWMga2V5IGZvciBtdWx0aXBsZSByZWNpcGllbnRzLgogICAgICAgLS0gTWFkZSB0aGUgZWNjIGFuZCBESCBtYWtlX2tleSgpIHJvdXRpbmVzIG1ha2Ugc2VjcmV0IGtleXMgb2YgdGhlIHNhbWUgc2l6ZSBhcyB0aGUga2V5c2l6ZSBsaXN0ZWQuCiAgICAgICAgICBPcmlnaW5hbGx5IEkgd2FudGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBrZXlzIHdlcmUgc21hbGxlciB0aGFuIHRoZSBvcmRlciBvZiB0aGUgZmllbGQgdXNlZAogICAgICAgICAgSG93ZXZlciwgdGhlIGJpYXMgaXMgc28gaW5zaWduaWZjYW50IHVzaW5nIGZ1bGwgc2l6ZXMuICBGb3IgZXhhbXBsZSwgd2l0aCBhIEVDQy0xOTIga2V5IHRoZSBvcmRlcgogICAgICAgICAgaXMgYWJvdXQgMl4xOTEuOTksIHNvIGluc3RlYWQgSSByb3VuZGVkIGRvd24gYW5kIHVzZWQgYSAxODQtYml0IHNlY3JldCBrZXkuICBOb3cgSSBzaW1wbHkgdXNlIGEgZnVsbCAxOTItYml0CiAgICAgICAgICBrZXkgdGhlIGNvZGUgd2lsbCB3b3JrIGp1c3QgdGhlIHNhbWUgZXhjZXB0IHRoYXQgc29tZSAxOTItYml0IGtleXMgd2lsbCBiZSBkdXBsaWNhdGVzIHdoaWNoIGlzIG5vdCBhIGJpZwogICAgICAgICAgZGVhbCBzaW5jZSAxLzJeMTkyIGlzIGEgdmVyeSBzbWFsbCBiaWFzIQogICAgICAgLS0gTWFkZSB0aGUgY29uZmlndXJhdGlvbiBhIGJpdCBzaW1wbGVyIGFuZCBtb3JlIGV4YWN0aW5nLiAgWW91IGNhbiBmb3IgZXhhbXBsZSBub3cgc2VsZWN0IHdoaWNoIERIIG9yIEVDQwogICAgICAgICAga2V5IHNldHRpbmdzIHlvdSB3aXNoIHRvIHN1cHBvcnQgd2l0aG91dCBpbmNsdWRpbmcgdGhlIGRhdGEgZm9yIGFsbCBvdGhlciBrZXkgc2V0dGluZ3MuICBJIHB1dCB0aGUgI2RlZmluZXMKICAgICAgICAgIGluIGEgbmV3IGZpbGUgY2FsbGVkICJteWNyeXB0X2NmZy5oIgogICAgICAgLS0gQ29uZmlndXJlZCAibXBpLWNvbmZpZy5oIiBzbyBpdHMgYSBiaXQgbW9yZSBjb25zZXJ2YXRpdmUgd2l0aCB0aGUgbWVtb3J5IHJlcXVpcmVkIGFuZCBjb2RlIHNwYWNlIHVzZWQKICAgICAgIC0tIEphc29uIEtsYXBzdGUgc3VibWl0dGVkIGJ1ZyBmaXhlcyB0byB0aGUgeWFycm93LCBoYXNoIGFuZCB2YXJpb3VzIG90aGVyIGlzc3Vlcy4gIFRoZSB5YXJyb3cgY29kZSB3aWxsIG5vdwogICAgICAgICAgdXNlIHdoYXQgZXZlciByZW1haW5pbmcgaGFzaC9jaXBoZXIgY29tYm8gaXMgbGVmdCBbYWZ0ZXIgeW91ICN1bmRlZiB0aGVtXSBhdCBidWlsZCB0aW1lLiAgIEhlIGFsc28gc3VnZ2VzdGVkCiAgICAgICAgICBhIGZpeCB0byByZW1vdmUgdW51c2VkIHN0cnVjdHVyZXMgZnJvbSB0aGUgc3ltbWV0cmljX2tleSBhbmQgaGFzaF9zdGF0ZSB1bmlvbnMuCiAgICAgICAtLSBNYWRlIHRoZSBDVFIgY29kZSBoYW5kbGUgdmFyaWFibGUgbGVuZ3RoIGJsb2NrcyBiZXR0ZXIuIEl0IHdpbGwgYnVmZmVyIHRoZSBlbmNyeXB0aW9uIHBhZCBzbyB5b3UgY2FuCiAgICAgICAgICBlbmNyeXB0IG1lc3NhZ2VzIGFueSBzaXplIGJsb2NrIGF0IGEgdGltZS4KICAgICAgIC0tIFNpbXBsaWZpZWQgdGhlIHlhcnJvdyBjb2RlIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBuZXcgQ1RSIGNvZGUuCiAgICAgICAtLSBBZGRlZCBhIDQwOTYtYml0IERIIGtleSBzZXR0aW5nLiAgVGhhdCB0b29rIG1lIGFib3V0IDM2IGhvdXJzIHRvIGZpbmQhCiAgICAgICAtLSBDaGFuZ2VkIHRoZSBiYXNlNjQgcm91dGluZXMgdG8gdXNlIGEgcmVhbCBiYXNlNjQgZW5jb2Rpbmcgc2NoZW1lLgogICAgICAgLS0gQWRkZWQgaW4gREggYW5kIEVDQyAiZW5jcnlwdF9rZXkoKSIgZnVuY3Rpb25zLiAgVGhleSBhcmUgc3RpbGwgcmF0aGVyICJiZXRhImlzaC4KICAgICAgIC0tIEFkZGVkICoqVHdvZmlzaCoqIHRvIHRoZSBsaXN0IG9mIGNpcGhlcnMhCgpKYW51YXJ5IDE4dGgsIDIwMDIKdjAuMzQgIC0tIEFkZGVkICJzaGE1MTIiIHRvIHRoZSBsaXN0IG9mIGhhc2hlcy4gIFByb2R1Y2VzIGEgNTEyLWJpdCBtZXNzYWdlIGRpZ2VzdC4gIE5vdGUgdGhhdCB3aXRoIHRoZSBjdXJyZW50CiAgICAgICAgICBwYWRkaW5nIHdpdGggdGhlIHJzYV9zaWduKCkgZnVuY3Rpb24geW91IGNhbm5vdCB1c2Ugc2hhNTEyIHdpdGggYSBrZXkgbGVzcyB0aGFuIDE1MzYgYml0cyBmb3Igc2lnbmF0dXJlcy4KICAgICAgIC0tIENsZWFuZWQgdXAgdGhlIG90aGVyIGhhc2ggZnVuY3Rpb25zIHRvIHVzZSB0aGUgTE9BRCBhbmQgU1RPUkUgbWFjcm9zLi4uCgpKYW51YXJ5IDE3dGgsIDIwMDIKdjAuMzMgIC0tIE1hZGUgdGhlIGxvd2VyIGxpbWl0IG9uIGtleXNpemVzIGZvciBSU0EgMTAyNCBiaXRzIGFnYWluIGJlY2F1c2UgSSByZWFsaXplZCB0aGF0IDc2OCBiaXQga2V5cyB3b3VsZG4ndAogICAgICAgICAgd29yayB3aXRoIHRoZSBwYWRkaW5nIHNjaGVtZSBhbmQgbGFyZ2Ugc3ltbWV0cmljIGtleXMuCiAgICAgICAtLSBBZGRlZCBpbmZvcm1hdGlvbiBjb25jZXJuaW5nIHRoZSBabGliIGxpY2Vuc2UgdG8gdGhlIG1hbnVhbAogICAgICAgLS0gQWRkZWQgYSAzMDcyLWJpdCBrZXkgc2V0dGluZyBmb3IgdGhlIERIIGNvZGUuCiAgICAgICAtLSBNYWRlIHRoZSAiZmluZF94eXooKSIgcm91dGluZXMgdGFrZSAiY29uc3QgY2hhciAqIiBhcyBwZXIgQ2xheSBDdWx2ZXIncyBzdWdnZXN0aW9uLgogICAgICAgLS0gRml4ZWQgYW4gZW1iYXJhc3NpbmcgdHlwbyBpbiB0aGUgbWFudWFsIGNvbmNlcm5pbmcgdGhlIGhhc2hlcy4gIFRoYW5rJ3MgQ2xheSBmb3IgZmluZGluZyBpdCEKICAgICAgIC0tIEZpeGVkIHJhbmRfcHJpbWUoKSBzbyB0aGF0IGl0IG1ha2VzIHByaW1lcyBiaWdnZXIgdGhhbiB0aGUgc2V0dGluZyB5b3UgZ2l2ZS4gIEZvciBleGFtcGxlLAogICAgICAgICAgaWYgeW91IHdhbnQgYSAxMDI0LWJpdCBwcmltZSBpdCB3b3VsZCBtYWtlIGEgMTAyMy1iaXQgb25lLiAgTm93IGl0IGVuc3VyZXMgdGhhdCB0aGUgcHJpbWUKICAgICAgICAgIGl0IG1ha2VzIGlzIGFsd2F5cyBncmVhdGVyIHRoYW4gMl4oOG4pIChuID09IGJ5dGVzIGluIHByaW1lKS4gIFRoaXMgZG9lc24ndCBoYXZlIGEgaHVnZQogICAgICAgICAgaW1wYWN0IG9uIHNlY3VyaXR5IGJ1dCBJIGNvcnJlY3RlZCBpdCBqdXN0IHRoZSBzYW1lLgogICAgICAgLS0gRml4ZWQgdGhlIENUUiByb3V0aW5lIHRvIHdvcmsgb24gcGxhdGZvcm1zIHdoZXJlIGNoYXIgIT0gOC1iaXRzIAogICAgICAgLS0gRml4ZWQgc2hhMS9zaGEyNTYvbWQ1L2Jsb3dmaXNoIHRvIG5vdCBhc3N1bWUgInVuc2lnbmVkIGxvbmcgPT0gMzItYml0cyIsIEJhc2ljYWxseSBhbnkgb3BlcmF0aW9uIHdpdGggY2FycmllcwogICAgICAgICAgSSAiQU5EIiB3aXRoIDB4RkZGRkZGRkYuICBUaGF0IGZvcmNlcyBvbmx5IHRoZSBsb3dlciAzMi1iaXRzIHRvIGhhdmUgaW5mb3JtYXRpb24gaW4gaXQuICBPbiB4ODYgcGxhdGZvcm1zCiAgICAgICAgICBtb3N0IGNvbXBpbGVycyBvcHRpbWl6ZSBvdXQgdGhlIEFORCBvcGVyYXRpb24gc2luY2UgaXRzIGEgbm9wLgoKSmFudWFyeSAxNnRoLCAyMDAyCnYwLjMyICAtLSBNYWRlIFJpam5kYWVsJ3Mgc2V0dXAgZnVuY3Rpb24gZnVsbHkgc3RhdGljIHNvIGl0IGlzIHRocmVhZCBzYWZlCiAgICAgICAtLSBTdmFudGUgU2VsZWJvcmcgc3VnZ2VzdGVkIGEgY29zbWV0aWMgc3R5bGUgZml4dXAgZm9yIGFlcy5jLCAKICAgICAgICAgIGJhc2ljYWxseSB0byByZW1vdmUgc29tZSBvZiB0aGUgI2RlZmluZXMgdG8gY2xlYW4gaXQgdXAKICAgICAgIC0tIE1hZGUgdGhlIFBLIHJvdXRpbmVzIG5vdCBleHBvcnQgdGhlIEFTQ0lJIHZlcnNpb24gb2YgdGhlIG5hbWVzIG9mIGNpcGhlcnMvaGFzaGVzIHdoaWNoIG1ha2VzCiAgICAgICAgICB0aGUgUEsgbWVzc2FnZSBmb3JtYXRzICppbmNvbXBhdGlibGUqIHdpdGggcHJldmlvdXMgcmVsZWFzZXMuCiAgICAgICAtLSBNZXJnZSBpbiBabGliIDotKQogCiAgCkphbnVhcnkgMTV0aCwgMjAwMgp2MC4zMSAgLS0gVGhlIFJTQSByb3V0aW5lcyBjYW4gbm93IHVzZSBDUlQgdG8gc3BlZWQgdXAgZGVjcnlwdGlvbi9zaWduYXR1cmVzLiAgVGhlIHJvdXRpbmVzIGFyZSBiYWNrd2FyZHMgCiAgICAgICAgICBjb21wYXRpYmxlIHdpdGggcHJldmlvdXMgcmVsZWFzZXMuCiAgICAgICAtLSBGaXhlZCBhbm90aGVyIGJ1ZyB0aGF0IFN2YW50ZSBTZWxlYm9yZyBmb3VuZC4gIEJhc2ljYWxseSB5b3UgY291bGQgYnVmZmVyLW92ZXJydW4gdGhlIAogICAgICAgICAgcnNhX2V4cHRtb2QoKSBmdW5jdGlvbiBpdHNlbGYgaWYgeW91J3JlIG5vdCBjYXJlZnVsLiAgVGhhdCdzIGZpeGVkIG5vdy4gIEZpeGVkIGFub3RoZXIgYnVnIGluCiAgICAgICAgICByc2FfZXhwdG1vZCgpIHdoZXJlIGlmIGl0IGtub3dzIHRoZSBidWZmZXIgeW91IHBhc3NlZCBpcyB0b28gc21hbGwgaXQgd291bGRuJ3QgZnJlZSBhbGwgdXNlZCAKICAgICAgICAgIG1lbW9yeS4gICAgICAgCiAgICAgICAtLSBpbXByb3ZlZCB0aGUgcmVhZGFiaWxpdHkgb2YgdGhlIFBLIGltcG9ydC9leHBvcnQgZnVuY3Rpb25zCiAgICAgICAtLSBBZGRlZCBhIGZpeCB0byBSU0EuQyBieSBDbGF5IEN1bHZlcgogICAgICAgLS0gQ2hhbmdlZCB0aGUgQ09OU1Q2NCBtYWNybyBmb3IgTVNWQyB0byB1c2UgdGhlICJ1bnNpZ25lZCBfX2ludDY0IiB0eXBlLCBlLmcuICJ1aTY0IiBpbnN0ZWFkIG9mICJpNjQiLgoKSmFudWFyeSAxNHRoLCAyMDAyCnYwLjMwICAtLSBNYWpvciBjaGFuZ2UgdG8gdGhlIFlhcnJvdyBQUk5HIGNvZGUsIGZpeGVkIGEgYnVnIHRoYXQgRXVnZW5lIFN0YXJva29sdHNldiBmb3VuZC4KICAgICAgICAgIEJhc2ljYWxseSBpZiB5b3UgYWRkZWQgZW50cm9weSB0byB0aGUgcG9vbCBpbiBzbWFsbCBpbmNyZW1lbnRzIGl0IGNvdWxkIGluIGZhY3QKICAgICAgICAgIGNhbmNlbCBvdXQuICBOb3cgSSBoYXNoIHRoZSBwb29sIHdpdGggdGhlIG5ldyBkYXRhIHdoaWNoIGlzIHdheSBzbWFydGVyLgoKSmFudWFyeSAxMnRoLCAyMDAyCnYwLjI5ICAtLSBBZGRlZCBNUEkgY29kZSB3cml0dGVuIGJ5IFN2YW50ZSBTZWxlYm9yZyB0byB0aGUgbGlicmFyeS4gIFRoaXMgd2lsbCBtYWtlIHRoZSBQSyBjb2RlIG11Y2gKICAgICAgICAgIGVhc2llciB0byBmb2xsb3cgYW5kIGRlYnVnLiAgQWN0dWFsbHkgSSd2ZSBhbHJlYWR5IGZpeGVkIGEgbWVtb3J5IGxlYWsgaW4gZGhfc2hhcmVkX3NlY3JldCgpLgogICAgICAgLS0gTWVtb3J5IGxlYWtzIGZvdW5kIGFuZCBjb3JyZWN0IGluIGFsbCB0aHJlZSBQSyByb3V0aW5lcy4gIFRoZSBsZWFrcyB3b3VsZCBvY2N1ciB3aGVuIGEgYmlnbnVtCiAgICAgICAgICBvcGVyYXRpb24gZmFpbHMgc28gaXQgd291bGRuJ3Qgbm9ybWFsbHkgdHVybiB1cCBpbiB0aGUgY291cnNlIG9mIGEgcHJvZ3JhbQogICAgICAgLS0gRml4ZWQgYnVncyBpbiBkaF9rZXlfc2l6ZSBhbmQgZWNjX2tleV9zaXplIHdoaWNoIHdvdWxkIHJldHVybiBnYXJiYWdlIGZvciBpbnZhbGlkIGtleSBpZHgnZXMKCkphbnVhcnkgMTF0aCwgMjAwMgp2MC4yOCAgLS0gQ2xlYW5lZCB1cCBzb21lIGNvZGUgc28gdGhhdCBpdCBkb2Vzbid0IGFzc3VtZSAiY2hhciA9PSA4Yml0cyIuICBNYWlubHkgU0FGRVIrIGhhcyBiZWVuIAogICAgICAgICAgY2hhbmdlZC4KICAgICAgIC0tICoqKkhVR0UqKiogY2hhbmdlcyBpbiB0aGUgUEsgY29kZS4gIEkgY2hlY2sgYWxsIHJldHVybiB2YWx1ZXMgaW4gdGhlIGJpZ251bSBjb2RlIHNvIGlmIHRoZXJlCiAgICAgICAgICBhcmUgZXJyb3JzIFtpbnN1ZmZpY2llbnQgbWVtb3J5LCBldGMuLl0gaXQgd2lsbCBiZSByZXBvcnRlZC4gIFRoaXMgbWFrZXMgdGhlIGNvZGUgZmFpcmx5IG1vcmUKICAgICAgICAgIHJvYnVzdCBhbmQgbGlrZWx5IHRvIGNhdGNoIGFueSBlcnJvcnMuCiAgICAgICAtLSBVcGRhdGVkIHRoZSBpc19wcmltZSgpIGZ1bmN0aW9uIHRvIHVzZSBhIG5ldyBwcm90b3R5cGUgW2l0IGNhbiByZXR1cm4gZXJyb3JzIG5vd10gYW5kIGl0IGFsc28KICAgICAgICAgIGRvZXMgdHJpYWwgZGl2aXNpb25zIGFnYWluc3QgbW9yZSBwcmltZXMgYmVmb3JlIHRoZSBSYWJpbiBNaWxsZXIgc3RlcHMKICAgICAgIC0tIEFkZGVkIE9GQiwgQ0ZCIGFuZCBFQ0IgZ2VuZXJpYyB3cmFwcGVycyBmb3IgdGhlIHN5bW1ldHJpYyBjaXBoZXJzIHRvIHJvdW5kIG91dCB0aGUgaW1wbGVtZW50YXRpb25zLgogICAgICAgLS0gQWRkZWQgWHRlYSB0byB0aGUgbGlzdCBvZiBjaXBoZXJzLCB0byB0aGUgYmVzdCBvZiBteSBhYmlsaXR5IEkgaGF2ZSB2ZXJpZmllZCB0aGlzIGltcGxlbWVudGF0aW9uLgogICAgICAgICAgSSBzaG91bGQgbm90ZSB0aGF0IHRoZXJlIGlzIG5vdCBhbG90IG9mIGNvbmNyZXRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjaXBoZXIuICAiQW5zaSBDIiB2ZXJzaW9ucwogICAgICAgICAgSSBmb3VuZCBkaWQgbm90IGFkZHJlc3MgZW5kaWFuZXNzIGFuZCB3ZXJlIG5vdCBldmVuIHBvcnRhYmxlIS4gIFRoaXMgY29kZSBpcyBwb3J0YWJsZSBhbmQgdG8gdGhlCiAgICAgICAgICBiZXN0IG9mIG15IGtub3dsZWRnZSBpbXBsZW1lbnRzIHRoZSBYdGVhIGFsZ29yaXRobSBhcyBwZXIgdGhlIFtzaG9ydF0gWC1UZWEgcGFwZXIuCiAgICAgICAtLSBSZWZvcm1hdGVkIHRoZSBtYW51YWwgdG8gaW5jbHVkZSB0aGUgKipGVUxMKiogc291cmNlIGNvZGUgb3B0aW1pemVkIHRvIGJlIHByaXRhYmxlLgoKSmFudWFyeSA5dGgsIDIwMDIKdjAuMjcgIC0tIENoYW5nZWQgdGhlIGNoYXIgY29uc3RhbnRzIHRvIG51bWVyaWNhbCB2YWx1ZXMuICBJdCBpcyBiYWNrd2FyZHMgY29tcGF0aWJsZSBhbmQgc2hvdWxkIHdvcmsgb24KICAgICAgICAgIHBsYXRmb3JtcyB3aGVyZSAnZCcgIT0gMTAwIFtmb3IgZXhhbXBsZV0uCiAgICAgICAtLSBNYWRlIGEgY2hhbmdlIHRvIHJhbmRfcHJpbWUoKSB3aGljaCB0YWtlcyB0aGUgaW5wdXQgbGVuZ3RoIGFzIGEgc2lnbmVkIHR5cGUgc28geW91IGNhbiBwYXNzCiAgICAgICAgICBhIG5lZ2F0aXZlIGxlbiB0byBnZXQgYSAiMyBtb2QgNCIgc3R5bGUgcHJpbWUuLi4gb29wcwogICAgICAgLS0gY2hhbmdlZCB0aGUgTVNWQyBtYWtlZmlsZSB0byBidWlsZCB3aXRoIGEgd2FybmluZyBsZXZlbCBvZiB0aHJlZSwgbm8gd2FybmluZ3MhCgpKYW51YXJ5IDh0aCwgMjAwMgp2MC4yNiAgLS0gdXBkYXRlZCBTSEEtMjU2IHRvIHVzZSBST1IoKSBmb3IgYSByb3RhdGUgc28gNjQtYml0IG1hY2hpbmVzIHdvbid0IGNvcnJ1cHQKICAgICAgICAgIHRoZSBvdXRwdXQKICAgICAgIC0tIENoYW5nZWQgI2luY2x1ZGUgPD4gdG8gI2luY2x1ZGUgIiIgZm9yIGxvY2FsIC5oIGZpbGVzIGFzIHBlciBSaWNoYXJkIEhlYXRoZmllbGRzJyBzdWdnZXN0aW9ucy4KICAgICAgIC0tIEZpeGVkIGJ1ZyBpbiBNUEkgW3dlbGwgYnVnIGluIE1TVkNdIHRoYXQgY29tcGlsZWQgY29kZSBpbmNvcnJlY3RseSBpbiBtcF9zZXRfaW50KCkKICAgICAgICAgIEkgYWRkZWQgYSB3b3JrIGFyb3VuZCB0aGF0IGNhdGNoZXMgdGhlIGVycm9yIGFuZCBjb250aW51ZXMgbm9ybWFsbHkuCgpKYW51YXJ5IDh0aCwgMjAwMgp2MC4yNSAgLS0gQWRkZWQgYSBzdHVwaWQgZGVmaW5lIHNvIE1TVkMgNi4wMCBjYW4gYnVpbGQgdGhlIGxpYnJhcnkuCiAgICAgICAtLSBCaWcgdGhhbmtzIHRvIHNjaS5jcnlwdCBhbmQgIkFqYXkgSy4gQWdyYXdhbCIgZm9yIGhlbHBpbmcgbWUgcG9ydCB0aGlzIHRvIE1TVkMKCkphbnVhcnkgN3RoLCAyMDAyCnYwLjI0ICAtLSBTcGVkIHVwIEJsb3dmaXNoIGJ5IHVucm9sbGluZyBhbmQgcmVtb3ZpbmcgdGhlIHN3YXBzLgogICAgICAgLS0gTWFkZSB0aGUgY29kZSBjb21wbHkgd2l0aCBtb3JlIHRyYWRpdGlvbmFsIEFOU0kgQyBzdGFuZGFyZHMKICAgICAgICAgIFNob3VsZCBjb21waWxlIHdpdGggTVNWQyB3aXRoIGxlc3MgZXJyb3JzCiAgICAgICAtLSBtb3ZlZCB0aGUgZGVtb3MgYW5kIGRvY3VtZW50YXRpb24gaW50byB0aGVpciBvd24gZGlyZWN0b3JpZXMKICAgICAgICAgIHNvIHlvdSBjYW4gZWFzaWx5IGJ1aWxkIHRoZSBsaWJyYXJ5IHdpdGggb3RoZXIgdG9vbCBjaGFpbnMKICAgICAgICAgIGJ5IGNvbXBpbGluZyB0aGUgZmlsZXMgaW4gdGhlIHJvb3QKICAgICAgIC0tIGNvbnZlcnRlZCBmdW5jdGlvbnMgd2l0aCBsZW5ndGggb2Ygb3V0cHV0cyB0byB1c2UgCiAgICAgICAgICAidW5zaWduZWQgbG9uZyIgc28gMTYtYml0IHBsYXRmb3JtcyB3aWxsIGxpa2UgdGhpcyBsaWJyYXJ5IG1vcmUuCgpKYW51YXJ5IDV0aCwgMjAwMgp2MC4yMyAgLS0gRml4ZWQgYSBzbWFsbCBlcnJvciBpbiB0aGUgTVBJIGNvbmZpZyBpdCBzaG91bGQgYnVpbGQgZmluZSBhbnl3aGVyZS4KCkphbnVhcnkgNHRoLCAyMDAyCnYwLjIyICAtLSBmYXN0ZXIgZ2ZfbXVsKCkgY29kZQogICAgICAgLS0gZ2Zfc2hsKCkgYW5kIGdmX3NocigpIGFyZSBzYWZlIG9uIDY0LWJpdCBwbGF0Zm9ybXMgbm93CiAgICAgICAtLSBGaXhlZCBhbiBlcnJvciBpbiB0aGUgaGFzaGVzIHRoYXQgQnJpYW4gR2xhZG1hbiBmb3VuZC4gIAogICAgICAgICAgQmFzaWNhbGx5IGlmIHRoZSBtZXNzYWdlIGhhcyBleGFjdGx5IDU2IGJ5dGVzIGxlZnQgdG8gYmUgCiAgICAgICAgICBjb21wcmVzc2VkIEkgaGFuZGxlZCB0aGVtIGluY29ycmVjdGx5LgoKSmFudWFyeSA0dGgsIDIwMDIKdjAuMjEgIC0tIHNwZWQgdXAgdGhlIEVDQyBjb2RlIGJ5IHJlbW92aW5nIHJlZHVuZGFudCBkaXZpc2lvbnMgaW4gdGhlIAogICAgICAgICAgcG9pbnQgYWRkIGFuZCBkb3VibGUgcm91dGluZXMuICBJIGFsc28gZXh0cmFjdCB0aGUgYml0cyBtb3JlCiAgICAgICAgICBlZmZpY2llbnRseSBpbiAiZWNjX211bG1vZCgpIiBub3cuCiAgICAgICAtLSBzcGVkIHVwIFthbmQgZG9jdW1lbnRlZF0gdGhlIHJhbmRfcHJpbWUoKSBmdW5jdGlvbi4gIE5vdyBpdCBqdXN0CiAgICAgICAgICBtYWtlcyBhIHJhbmRvbSBpbnRlZ2VyIGFuZCBpbmNyZW1lbnRzIGJ5IHR3byB1bnRpbCBhIHByaW1lIGlzIGZvdW5kCiAgICAgICAgICBUaGlzIGlzIGZhc3RlciBzaW5jZSBpdCBkb2Vzbid0IHJlcXVpcmUgYWxvdCBvZiBjYWxscyB0byB0aGUgUFJORyBhbmQKICAgICAgICAgIGl0IGRvZXNuJ3QgcmVxdWlyZSBsb2FkaW5nIGh1Z2UgaW50ZWdlcnMgb3ZlciBhbmQgb3Zlci4gIHJhbmRfcHJpbWUoKQogICAgICAgICAgY2FuIGFsc28gbWFrZSBwcmltZXMgY29uZ3J1ZW50IHRvIDMgbW9kIDQgW2kuZSBmb3IgYSBibHVtIGludGVnZXJdCiAgICAgICAtLSBhZGRlZCBhIGdmX3NxcnQoKSBmdW5jdGlvbiB0aGF0IGZpbmRzIHNxdWFyZSByb290cyBpbiBhIEdGKDJedykgZmllbGQKICAgICAgIC0tIGZpeGVkIGEgYnVnIGluIGdmX2RpdigpIHRoYXQgd291bGQgcmV0dXJuIHRoZSB3cm9uZyByZXN1bHRzIGlmIHRoZSBkaXZpc29yIGhhZCBhIGdyZWF0b3IKICAgICAgICAgIGRpdmlzb3IgdGhhbiB0aGUgZGl2aWRlbmQuCgpKYW51YXJ5IDR0aCwgMjAwMgp2MC4yMCAgLS0gQWRkZWQgdGhlIGZpeGVkIE1QSSBiYWNrIGluIHNvIFJTQSBhbmQgREggYXJlIG11Y2ggZmFzdGVyIGFnYWluCgp2MC4xOSAgLS0gVXBkYXRlZCB0aGUgbWFudWFsIHRvIHJlZmxlY3QgdGhlIGZhY3QgdGhhdCBCcmlhbiBHbGFkbWFuIHdyb3RlIHRoZSBBRVMgYW5kIFNlcnBlbnQgY29kZS4KICAgICAgIC0tIERILCBFQ0MgYW5kIFJTQSBzaWduYXR1cmUvZGVjcnlwdGlvbiBmdW5jdGlvbnMgY2hlY2sgaWYgdGhlIGtleSBpcyBwcml2YXRlCiAgICAgICAtLSBuZXcgREggc2lnbmF0dXJlL3ZlcmlmaWNhdGlvbiBjb2RlIHdvcmtzIGp1c3QgbGlrZSB0aGUgUlNBL0VDQyB2ZXJzaW9ucwoKSmFudWFyeSAzcmQsIDIwMDIKdjAuMTggIC0tIEFkZGVkIHdheSBtb3JlIGNvbW1lbnRzIHRvIGVhY2ggLkMgZmlsZSAKICAgICAgIC0tIGZpeGVkIGEgYnVnIGluIGNiY19kZWNyeXB0KHB0LCBjdCwga2V5KSB3aGVyZSBwdCA9PSBjdCBbaS5lIHNhbWUgYnVmZmVyXQogICAgICAgLS0gZml4ZWQgUkM1IHNvIGl0IHJlYWRzIHRoZSBkZWZhdWx0IHJvdW5kcyBvdXQgb2YgdGhlIGNpcGhlcl9kZXNjcmlwdG9yIHRhYmxlCiAgICAgICAtLSBjbGVhbmVkIHVwIGVjY19leHBvcnQoKQogICAgICAgLS0gQ2xlYW5lZCB1cCBkaF9pbXBvcnQoKSBhbmQgZWNjX2ltcG9ydCgpIHdoaWNoIGFsc28gcGVyZm9ybSBtb3JlIAogICAgICAgICAgZXJyb3IgY2hlY2tpbmcgbm93CiAgICAgICAtLSBGaXhlZCBhIHNlcmlvdXMgZmxhdyBpbiByc2FfaW1wb3J0KCkgd2l0aCBwcml2YXRlIGtleXMuCgpKYW51YXJ5IDJuZCwgMjAwMgp2MC4xNyAgLS0gRml4ZWQgYSBidWcgaW4gdGhlIHJhbmRvbSBwcmltZSBnZW5lcmF0b3IgdGhhdCBmaXhlcyB0aGUgd3JvbmcgYml0cyB0byBvbmUKICAgICAgIC0tIEVDQyBhbmQgREggY29kZSB2ZXJpZnkgdGhhdCB0aGUgbW9kdWxpIGFuZCBvcmRlcnMgYXJlIGluIGZhY3QgcHJpbWUuICBUaGF0IAogICAgICAgICAgc2xvd3MgZG93biB0aGUgdGVzdCByb3V0aW5lcyBhbG90IGJ1dCB3aGF0IGFyZSB5b3UgZ29ubmEgZG8/IAogICAgICAgLS0gRml4ZWQgYSBodWdlIGJ1ZyBpbiB0aGUgbXBfZXhwdG1vZCgpIGZ1bmN0aW9uIHdoaWNoIGluY29ycmVjdGx5IGNhbGN1bGF0ZXMgZ154IG1vZCBwIGZvciBzb21lCiAgICAgICAgICB2YWx1ZXMgb2YgcC4gIEkgcmVwbGFjZWQgaXQgd2l0aCBhIHNsb3cgZnVuY3Rpb24uICBPbmNlIHRoZSBhdXRob3Igb2YgTVBJIGZpeGVzIGhpcyBmYXN0ZXIgcm91dGluZQogICAgICAgICAgSSB3aWxsIHN3aXRjaCBiYWNrLgogIApKYW51YXJ5IDFzdCwgMjAwMiBbd2hvYSBuZXcgeWVhciFdCnYwLjE2ICAtLSBJbXByb3ZlZCBHRiBkaXZpc2lvbiBjb2RlIHRoYXQgaXMgZmFzdGVyLgogICAgICAgLS0gZG9jdW1lbnRlZCB0aGUgR0YgY29kZQoKRGVjZW1iZXIgMzFzdCwgMjAwMQp2MC4xNSAgLS0gQSAxNzkyLWJpdCBhbmQgMjA0OC1iaXQgREggc2V0dGluZyB3YXMgYWRkZWQuICBUb29rIG1lIGFsbCBuaWdodCB0byAKICAgICAgICAgIGZpbmQgYSAxNzkyIGFuZCAyMDQ4LWJpdCBzdHJvbmcgcHJpbWUgYnV0IHdoYXQgdGhlIGhlY2sKICAgICAgIC0tIExpYnJhcnkgbm93IGhhcyBwb2x5bm9taWFsLWJhc2lzIEdGKDJedykgcm91dGluZXMgSSB3cm90ZSBteXNlbGYuICBDYW4gYmUgdXNlZCB0byBwZXJmb3JtCiAgICAgICAgICBFQ0Mgb3ZlciBHRigyXncpIGxhdGVyIG9uLi4uLgogICAgICAgLS0gRml4ZWQgYSBidWcgd2l0aCB0aGUgZGVmaW5lcyB0aGF0IGFsbG93cyBpdCB0byBidWlsZCBpbiB3aW5kb3dzCiAgICAgICAKRGVjZW1iZXIgMzB0aCwgMjAwMQp2MC4xNCAgLS0gRml4ZWQgdGhlIHh4eF9lbmNyeXB0KCkgcGFja2V0IHJvdXRpbmVzIHRvIG1ha2UgYW4gSVYgb2YgYXBwcm9wcmlhdGUgc2l6ZSAKICAgICAgICAgIGZvciB0aGUgY2lwaGVyIHVzZWQuICBJdCB3YXMgZGVmYXVsdGluZyB0byBtYWtpbmcgYSAyNTYtYml0IElWLi4uCiAgICAgICAtLSBiYXNlNjRfZW5jb2RlKCkgbm93IGFwcGVuZHMgYSBOVUxMIGJ5dGUsIHVtICJkdWgiIHN0dXBpZCBtaXN0YWtlIG5vdyBmaXhlZC4uLgogICAgICAgLS0gc3BlbGwgY2hlY2tlZCB0aGUgbWFudWFsIGFnYWluLi4uIDotKQoKRGVjZW1iZXIgMzB0aCwgMjAwMQp2MC4xMyAgLS0gU3dpdGNoaW5nIGJhY2sgdG8gb2xkZXIgY29weSBvZiBNUEkgc2luY2UgaXQgd29ya3MhIGFycmcuLgogICAgICAgLS0gQWRkZWQgc2lnbi92ZXJpZnkgZnVuY3Rpb25zIGZvciBFQ0MKICAgICAgIC0tIGFsbCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIHJvdXRpbmVzIGRlZmF1bHQgdG8gaW52YWxpZCBzaWduYXR1cmVzLgogICAgICAgLS0gQ2hhbmdlZCBhbGwgY2FsbHMgdG8gbWVtc2V0IHRvIHplcm9tZW0uICBGaXhlZCB1cCBzb21lIGJ1ZmZlciBwcm9ibGVtcyAKICAgICAgICAgIGluIG90aGVyIHJvdXRpbmVzLiAgQWxsIGNhbGxzIHRvIHplcm9tZW0gbGV0IHRoZSBjb21waWxlciBkZXRlcm1pbmUgdGhlIHNpemUKICAgICAgICAgIG9mIHRoZSBkYXRhIHRvIHdpcGUuCgpEZWNlbWJlciAyOXRoLCAyMDAxCnYwLjEyICAtLSBJbXBvcnRlZCBhIG5ldyB2ZXJzaW9uIG9mIE1QSSBbdGhlIGJpZ251bSBsaWJyYXJ5XSB0aGF0IHNob3VsZAogICAgICAgICAgYmUgYSBiaXQgbW9yZSBzdGFibGUgW2lmIHlvdSB3YW50IHRvIHdyaXRlIHlvdXIgb3duIGJpZ251bQogICAgICAgICAgcm91dGluZXMgd2l0aCB0aGUgbGlicmFyeSB0aGF0IGlzLi4uXQogICAgICAgLS0gTWFudWFsIGhhcyB3YXkgbW9yZSBpbmZvCiAgICAgICAtLSBoYXNoX2ZpbGUoKSBjbGVhcnMgc3RhY2sgbm93IFtsaWtlIGl0IHNob3VsZF0KICAgICAgIC0tIFRoZSBhcnRpZmljaWFsIGNhcCBvbiB0aGUgaGFzaCBpbnB1dCBzaXplIG9mIDJeMzIgYml0cyBoYXMgYmVlbgogICAgICAgICAgcmVtb3ZlZC4gIEJhc2ljYWxseSBJIHdhcyB0b28gbGF6eSB0b2RvIDY0LWJpdCBtYXRoIGJlZm9yZQogICAgICAgICAgW2Rvbid0IGFzayB3aHkuLi4gSSBjYW4ndCByZW1lbWJlcl0uICBBbnl3YXlzIHRoZSBoYXNoZXMKICAgICAgICAgIHN1cHBvcnQgdGhlIHNpemUgb2YgMl42NCBiaXRzIFtpZiB5b3UgZXZlciB1c2UgdGhhdCBtYW55IGJpdHMgaW4gYSBtZXNzYWdlCiAgICAgICAgICB0aGF0J3MganVzdCB3aWVyZC4uLl0KICAgICAgIC0tIFRoZSBoYXNoZXMgbm93IHdpcGUgdGhlICJoYXNoX3N0YXRlIiBhZnRlciB0aGUgZGlnZXN0IGlzIGNvbXB1dGVkLiAgVGhpcyBoZWxwcwogICAgICAgICAgcHJldmVudCB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGhhc2ggYmVpbmcgbGVha2VkIGFjY2lkZW50bHkgW2kuZSBzdGFjayBwcm9ibGVtc10KCkRlY2VtYmVyIDI5dGgsIDIwMDEKdjAuMTEgIC0tIE1hZGUgI2RlZmluZSdzIHNvIHlvdSBjYW4gdHJpbSB0aGUgbGlicmFyeSBkb3duIGJ5IHJlbW92aW5nCiAgICAgICAgICBjaXBoZXJzLCBoYXNocywgbW9kZXMgb2Ygb3BlcmF0aW9uLCBwcm5ncywgYW5kIGV2ZW4gUEsgYWxnb3JpdGhtcwogICAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSBsaWJyYXJ5IHdpdGggcmlqbmRhZWwrY3RyK3NoYTErRUNDIGlzIDkxS0IgY29tcGFyZWQKICAgICAgICAgIHRvIHRoZSAyNDZrYiB0aGUgZnVsbCBsaWJyYXJ5IHRha2VzLgogICAgICAgLS0gQWRkZWQgRUNDIHBhY2tldCByb3V0aW5lcyBmb3IgZW5jcnlwdC9kZWNyeXB0L3NpZ24vdmVyaWZ5IG11Y2ggYWtpbiB0bwogICAgICAgICAgdGhlIFJTQSBwYWNrZXQgcm91dGluZXMuCiAgICAgICAtLSBFQ0Mgbm93IGNvbXByZXNzZXMgdGhlIHB1YmxpYyBrZXksIGEgRUNDLTE5MiBwdWJsaWMga2V5IHRha2VzIDMzIGJ5dGVzIAogICAgICAgICAgZm9yIGV4YW1wbGUuLi4uCgpEZWNlbWJlciAyOHRoLCAyMDAxCnYwLjEwICAtLSBnb2luZyB0byByZXN0YXJ0IHRoZSBtYW51YWwgZnJvbSBzY3JhdGNoIHRvIG1ha2UgaXQgbW9yZSAKICAgICAgICAgIGNsZWFyIGFuZCBwcm9mZXNzaW9uYWwKICAgICAgIC0tIEFkZGVkIEVDQyBvdmVyIFovcFouICBCYXNpY2FsbHkgcHJvdmlkZXMgYXMgbXVjaCBhcyBESAogICAgICAgICAgZXhjZXB0IGl0cyBmYXN0ZXIgc2luY2UgdGhlIG51bWJlcnMgYXJlIHNtYWxsZXIuICBGb3IgZXhhbXBsZSwKICAgICAgICAgIEEgY29tcGFyYWJsZSAyNTYtYml0IEVDQyBrZXkgcHJvdmlkZXMgYXMgbXVjaCBzZWN1cml0eSBhcyBleHBlY3RlZAogICAgICAgICAgZnJvbSBhIERIIGtleSBvdmVyIDEwMjQtYml0cy4KICAgICAgIC0tIENsZWFuZWQgdXAgdGhlIERIIGNvZGUgdG8gbm90IGV4cG9ydCB0aGUgc3ltYm9sICJzZXRzW10iCiAgICAgICAtLSBGaXhlZCBhIGJ1ZyBpbiB0aGUgREggY29kZSB0aGF0IHdvdWxkIG5vdCBtYWtlIHRoZSBjb3JyZWN0IHNpemUgCiAgICAgICAgICByYW5kb20gc3RyaW5nIGlmIHlvdSBtYWRlIHRoZSBrZXkgc2hvcnQuICBGb3IgaW5zdGFuY2UgaWYgeW91IHdhbnRlZCAKICAgICAgICAgIGEgNTEyLWJpdCBESCBrZXkgaXQgd291bGQgbWFrZSBhIDc2OC1iaXQgb25lIGJ1dCBvbmx5IG1ha2UgdXAgNTEyLWJpdHMgCiAgICAgICAgICBmb3IgdGhlIGV4cG9uZW50Li4uIG5vdyBpdCBtYWtlcyB0aGUgZnVsbCA3NjggYml0cyBbb3Igd2hhdGV2ZXIgdGhlIGNhc2UgCiAgICAgICAgICBpc10KICAgICAgIC0tIEZpeGVkIGFub3RoZXIgKioqU0VSSU9VUyoqKiBidWcgaW4gdGhlIERIIGNvZGUgdGhhdCB3b3VsZCBkZWZhdWx0IHRvIDc2OC1iaXQKICAgICAgICAgIGtleXMgYnkgbWlzdGFrZS4KCkRlY2VtYmVyIDI1dGgsIDIwMDEKdjAuMDkgIC0tIEluY2x1ZGVzIGEgZGVtbyBwcm9ncmFtIGNhbGxlZCBmaWxlX2NyeXB0IHdoaWNoIHNob3dzIG9mZgogICAgICAgICAgaG93IHRvIHVzZSB0aGUgbGlicmFyeSB0byBtYWtlIGEgY29tbWFuZCBsaW5lIHRvb2wgd2hpY2gKICAgICAgICAgIGFsbG93cyB0aGUgdXNlciB0byBlbmNvZGUvZGVjb2RlIGEgZmlsZSB3aXRoIGFueQogICAgICAgICAgaGFzaCAob24gdGhlIHBhc3NwaHJhc2UpIGFuZCBjaXBoZXIgaW4gQ1RSIG1vZGUuCiAgICAgICAtLSBTd2l0Y2hlZCBldmVyeXRoaW5nIHRvIHVzZSB0eXBlZGVmJ3Mgbm93IHRvIGNsZWFyIHVwIHRoZSBjb2RlLgogICAgICAgLS0gQWRkZWQgQUVTICgxMjgvMTkyIGFuZCAyNTYgYml0IGtleSBtb2RlcykKCkRlY2VtYmVyIDI0dGgsIDIwMDEKdjAuMDggIC0tIGZpeGVkIGEgdHlwbyBpbiB0aGUgbWFudWFsLiBNUEkgc3RvcmVzIGl0cyBiaWdudW1zIGluCiAgICAgICAgICBCSUcgZW5kaWFuIG5vdCBsaXR0bGUuCiAgICAgICAtLSBTdGFydGVkIGFkZGluZyBhIFJORyB0byB0aGUgbGlicmFyeS4gIFJpZ2h0IG5vdyBpdCB0cmllcwogICAgICAgICAgdG8gb3BlbiAvZGV2L3JhbmRvbSBhbmQgaWYgdGhhdCBmYWlscyBpdCB1c2VzIGVpdGhlciB0aGUgCiAgICAgICAgICBNUyBDU1Agb3IgdGhlIGNsb2NrIGRyaWZ0IFJORy4gIEl0IGFsc28gYWxsb3dzIGNhbGxiYWNrcyAKICAgICAgICAgIHNpbmNlIHRoZSBkcmlmdCBSTkcgaXMgc2xvdyAoYWJvdXQgMy41IGJ5dGVzL3NlYykKICAgICAgIC0tIHRoZSBSTkcgY2FuIGFsc28gYXV0b21hdGljYWxseSBzZXR1cCBhIFBSTkcgYXMgd2VsbCBub3cKCnYwLjA3ICAtLSBBZGRlZCBiYXNpYyBESCByb3V0aW5lcyBzdWZmaWNpZW50IHRvIAogICAgICAgICAgbmVnb3RpYXRlIHNoYXJlZCBzZWNyZXRzIAogICAgICAgICAgW3NlZSB0aGUgbWFudWFsIGZvciBhIGNvbXBsZXRlIGV4YW1wbGUhXQogICAgICAgLS0gRml4ZWQgcnNhX2ltcG9ydCB0byBkZXRlY3Qgd2hlbiB0aGUgaW5wdXQKICAgICAgICAgIGNvdWxkIGJlIGNvcnJ1cHQuICAKICAgICAgIC0tIGFkZGVkIG1vcmUgdG8gdGhlIG1hbnVhbC4KCkRlY2VtYmVyIDIybmQsIDIwMDEKdjAuMDYgIC0tIEZpeGVkIHNvbWUgZm9ybWF0dGluZyBlcnJvcnMgaW4gCiAgICAgICAgICB0aGUgaGFzaCBmdW5jdGlvbnMgW2p1c3Qgc291cmNlIGNvZGUgY2xlYW5pbmddCiAgICAgICAtLSBGaXhlZCBhIHR5cG8gaW4gdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHNoYTI1NiA6LSkKICAgICAgIC0tIEZpeGVkIGFuIGVycm9yIGluIGJhc2U2NF9lbmNvZGUoKSB0aGF0IAogICAgICAgICAgd291bGQgZmFpbCB0byBjYXRjaCBhbGwgYnVmZmVyIG92ZXJydW5zCiAgICAgICAtLSBUZXN0IHByb2dyYW0gdGltZXMgdGhlIFJTQSBhbmQgc3ltbWV0cmljIGNpcGhlciAKICAgICAgICAgIHJvdXRpbmVzIGZvciBraWNrcy4uLgogICAgICAgLS0gQWRkZWQgdGhlICJjb25zdCIgbW9kaWZpZXIgdG8gYWxvdCBvZiByb3V0aW5lcyB0byAKICAgICAgICAgIGNsZWFyIHVwIHRoZSBwdXJwb3NlIG9mIGVhY2ggZnVuY3Rpb24uCiAgICAgICAtLSBDaGFuZ2VkIHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IHRvICJUb21DcnlwdCIgCiAgICAgICAgICBmb2xsb3dpbmcgYSBzdWdnZXN0aW9uIGZyb20gYSBzY2kuY3J5cHQgcmVhZGVyLi4uLgoKdjAuMDUgIC0tIEZpeGVkIHRoZSBST0wvUk9SIG1hY3JvIHRvIGJlIHNhZmUgb24gcGxhdGZvcm1zIAogICAgICAgICAgd2hlcmUgdW5zaWduZWQgbG9uZyBpcyBub3QgMzItYml0cwogICAgICAgLS0gSSBoYXZlIGFkZGVkIGEgYml0IG1vcmUgdG8gdGhlIGRvY3VtZW50YXRpb24gCiAgICAgICAgICBtYW51YWwgImNyeXB0LnBkZiIgcHJvdmlkZWQuCiAgICAgICAtLSBJIGhhdmUgYWRkZWQgYSBtYWtlZmlsZSBmb3IgTENDLVdpbjMyLiAgSXQgc2hvdWxkIGJlIAogICAgICAgICAgZWFzeSB0byBwb3J0IHRvIG90aGVyIExDQyBwbGF0Zm9ybXMgYnkgY2hhbmdpbmcgYSBmZXcgbGluZXMuCiAgICAgICAtLSBSYW4gYSBzcGVsbCBjaGVja2VyIG92ZXIgdGhlIG1hbnVhbC4KICAgICAgIC0tIENoYW5nZWQgdGhlIGhlYWRlciBhbmQgbGlicmFyeSBmcm9tICJjcnlwdCIgdG8gIm15Y3J5cHQiIHRvIG5vdAogICAgICAgICAgY2xhc2ggd2l0aCB0aGUgKm5peCBwYWNrYWdlICJjcnlwdCIuCgp2MC4wNCAgLS0gRml4ZWQgYSBidWcgaW4gdGhlIFJDNSxSQzYsQmxvd2Zpc2gga2V5IHNjaGVkdWxlcwogICAgICAgICAgd2hlcmUgaWYgdGhlIGtleSB3YXMgbm90IGEgbXVsdGlwbGUgb2YgNCBieXRlcyBpdCB3b3VsZAogICAgICAgICAgbm90IGdldCBsb2FkZWQgY29ycmVjdGx5LgoKRGVjZW1iZXIgMjFzdCwgMjAwMQoKdjAuMDMgIC0tIEFkZGVkIFNlcnBlbnQgdG8gdGhlIGxpc3Qgb2YgY2lwaGVycy4KCnYwLjAyICAtLSBDaGFuZ2VkIFJDNSB0byBvbmx5IGFsbG93IDEyIHRvIDI0IHJvdW5kcwogICAgICAgLS0gQWRkZWQgbW9yZSB0byB0aGUgbWFudWFsLgoKdjAuMDEgIC0tIFdlIHdpbGwgY2FsbCB0aGlzIHRoZSBmaXJzdCB2ZXJzaW9uLgoKLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvY2hhbmdlcyx2ICQgKi8KLyogJFJldmlzaW9uOiAxLjEwNiAkICovCi8qICREYXRlOiAyMDA1LzA2LzI3IDEyOjM3OjA2ICQgKi8KCg==