V2hhdCdzIE5ldyBpbiBQeXRob24gMi4yYTQ/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQ29yZQoKLSBUaGUgYnVpbHRpbiBmaWxlIHR5cGUgY2FuIGJlIHN1YmNsYXNzZWQgbm93LiAgSW4gdGhlIHVzdWFsIHBhdHRlcm4sCiAgImZpbGUiIGlzIHRoZSBuYW1lIG9mIHRoZSBidWlsdGluIHR5cGUsIGFuZCBmaWxlKCkgaXMgYSBuZXcgYnVpbHRpbgogIGNvbnN0cnVjdG9yLCB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyB0aGUgYnVpbHRpbiBvcGVuKCkgZnVuY3Rpb24uCiAgZmlsZSgpIGlzIG5vdyB0aGUgcHJlZmVycmVkIHdheSB0byBvcGVuIGEgZmlsZS4KCi0gSW4gMi4yYTMsIF9fbmV3X18gd291bGQgb25seSBzZWUgc2VxdWVudGlhbCBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZQogIHR5cGUgaW4gYSBjb25zdHJ1Y3RvciBjYWxsOyBfX2luaXRfXyB3b3VsZCBzZWUgYm90aCBzZXF1ZW50aWFsIGFuZAogIHBvc2l0aW9uYWwgYXJndW1lbnRzLiAgVGhpcyBtYWRlIG5vIHNlbnNlIHdoYXRzb2V2ZXIgYW55IG1vcmUsIHNvCiAgbm93IGJvdGggX19uZXdfXyBhbmQgX19pbml0X18gc2VlIGFsbCBhcmd1bWVudHMuCgotIEluIDIuMmEzLCBoYXNoKCkgYXBwbGllZCB0byBhbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIG9mIHN0ciBvciB1bmljb2RlCiAgYWx3YXlzIHJldHVybmVkIDAuICBUaGlzIGhhcyBiZWVuIHJlcGFpcmVkLgoKLSBJbiAyLjJhMywgYW4gb3BlcmF0aW9uIG9uIGFuIGluc3RhbmNlIG9mIGEgc3ViY2xhc3Mgb2YgYW4gaW1tdXRhYmxlIHR5cGUKICAoaW50LCBsb25nLCBmbG9hdCwgY29tcGxleCwgdHVwbGUsIHN0ciwgdW5pY29kZSksIHdoZXJlIHRoZSBzdWJ0eXBlCiAgZGlkbid0IG92ZXJyaWRlIHRoZSBvcGVyYXRpb24gKGFuZCBzbyB0aGUgb3BlcmF0aW9uIHdhcyBoYW5kbGVkIGJ5IHRoZQogIGJ1aWx0aW4gdHlwZSksIGNvdWxkIHJldHVybiB0aGF0IGluc3RhbmNlIGluc3RlYWQgYSB2YWx1ZSBvZiB0aGUgYmFzZQogIHR5cGUuICBGb3IgZXhhbXBsZSwgaWYgcyB3YXMgb2YgYSBzdHIgc3VibGFzcyB0eXBlLCBzWzpdIHJldHVybmVkIHMKICBhcy1pcy4gIE5vdyBpdCByZXR1cm5zIGEgc3RyIHdpdGggdGhlIHNhbWUgdmFsdWUgYXMgcy4KCi0gQXBwbGljYXRpb25zIHVzaW5nIEppbSBGdWx0b24ncyBFeHRlbnNpb25DbGFzcyBtb2R1bGUgY2FuIG5vdyBzYWZlbHkKICBiZSB1c2VkIHdpdGggUHl0aG9uIDIuMi4gIEluIHBhcnRpY3VsYXIsIFpvcGUgMi40LjEgbm93IHdvcmtzIHdpdGgKICBQeXRob24gMi4yIChhcyB3ZWxsIGFzIHdpdGggUHl0aG9uIDIuMS4xKS4gIFRoZSBEZW1vL21ldGFjbGFzcwogIGV4YW1wbGVzIGFsc28gd29yayBhZ2Fpbi4KCi0gVGhyZWFkIHNjaGVkdWxpbmcgb24gU29sYXJpcyBzaG91bGQgYmUgaW1wcm92ZWQ7IGl0IGlzIG5vIGxvbmdlcgogIG5lY2Vzc2FyeSB0byBpbnNlcnQgYSBzbWFsbCBzbGVlcCBhdCB0aGUgc3RhcnQgb2YgYSB0aHJlYWQgaW4gb3JkZXIKICB0byBsZXQgb3RoZXIgcnVubmFibGUgdGhyZWFkcyBiZSBzY2hlZHVsZWQuCgpMaWJyYXJ5CgotIFNpbXBsZVhNTFJQQ1NlcnZlcjogYSBuZXcgbW9kdWxlIChiYXNlZCB1cG9uIFNpbXBsZUhUTUxTZXJ2ZXIpCiAgc2ltcGxpZmllcyB3cml0aW5nIFhNTCBSUEMgc2VydmVycy4KCi0gb3MucGF0aC5yZWFscGF0aCgpOiBhIG5ldyBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGFic291dGUgcGF0aG5hbWUKICBhZnRlciBpbnRlcnByZXRhdGlvbiBvZiBzeW1ib2xpYyBsaW5rcy4gIE9uIG5vbi1Vbml4IHN5c3RlbXMsIHRoaXMKICBpcyBhbiBhbGlhcyBmb3Igb3MucGF0aC5hYnNwYXRoKCkuCgotIG9wZXJhdG9yLmluZGV4T2YoKSAoUHlTZXF1ZW5jZV9JbmRleCgpIGluIHRoZSBDIEFQSSkgbm93IHdvcmtzIHdpdGggYW55CiAgaXRlcmFibGUgb2JqZWN0LgoKLSBzbXRwbGliIG5vdyBzdXBwb3J0cyB2YXJpb3VzIGF1dGhlbnRpY2F0aW9uIGFuZCBzZWN1cml0eSBmZWF0dXJlcyBvZgogIHRoZSBTTVRQIHByb3RvY29sIHRocm91Z2ggdGhlIG5ldyBsb2dpbigpIGFuZCBzdGFydHRscygpIG1ldGhvZHMuCgotIGhtYWM6IGEgbmV3IG1vZHVsZSBpbXBsZW1lbnRpbmcga2V5ZWQgaGFzaGluZyBmb3IgbWVzc2FnZQogIGF1dGhlbnRpY2F0aW9uLgoKLSBtaW1ldHlwZXMgbm93IHJlY29nbml6ZXMgbW9yZSBleHRlbnNpb25zIGFuZCBmaWxlIHR5cGVzLiAgQXQgdGhlCiAgc2FtZSB0aW1lLCBzb21lIG1hcHBpbmdzIG5vdCBzYW5jdGlvbmVkIGJ5IElBTkEgd2VyZSByZW1vdmVkLgoKVG9vbHMKCi0gVGhlICJjb21waWxlciIgcGFja2FnZSBoYXMgYmVlbiBicm91Z2h0IHVwIHRvIGRhdGUgdG8gdGhlIHN0YXRlIG9mCiAgUHl0aG9uIDIuMiBieXRlY29kZSBnZW5lcmF0aW9uLgoKQnVpbGQKCi0gTGFyZ2UgZmlsZSBzdXBwb3J0IChMRlMpIGlzIG5vdyBhdXRvbWF0aWMgd2hlbiB0aGUgcGxhdGZvcm0gc3VwcG9ydHMKICBpdDsgbm8gbW9yZSBtYW51YWwgY29uZmlndXJhdGlvbiB0d2Vha3MgYXJlIG5lZWRlZC4gIE9uIExpbnV4LCBhdAogIGxlYXN0LCBpdCdzIHBvc3NpYmxlIHRvIGhhdmUgYSBzeXN0ZW0gd2hvc2UgQyBsaWJyYXJ5IHN1cHBvcnRzIGxhcmdlCiAgZmlsZXMgYnV0IHdob3NlIGtlcm5lbCBkb2Vzbid0OyBpbiB0aGlzIGNhc2UsIGxhcmdlIGZpbGUgc3VwcG9ydCBpcwogIHN0aWxsIGVuYWJsZWQgYnV0IGRvZXNuJ3QgZG8geW91IGFueSBnb29kIHVubGVzcyB5b3UgdXBncmFkZSB5b3VyCiAga2VybmVsIG9yIHNoYXJlIHlvdXIgUHl0aG9uIGV4ZWN1dGFibGUgd2l0aCBhbm90aGVyIHN5c3RlbSB3aG9zZQogIGtlcm5lbCBoYXMgbGFyZ2UgZmlsZSBzdXBwb3J0LgoKLSBUaGUgY29uZmlndXJlIHNjcmlwdCBub3cgc3VwcGxpZXMgcGxhdXNpYmxlIGRlZmF1bHRzIGluIGEKICBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudC4gIFRoaXMgZG9lc24ndCBtZWFuIHRoYXQgdGhlIHN1cHBsaWVkCiAgdmFsdWVzIGFyZSBhbHdheXMgY29ycmVjdCwgb3IgdGhhdCBjcm9zcy1jb21waWxhdGlvbiBub3cgd29ya3MKICBmbGF3bGVzc2x5IC0tIGJ1dCBpdCdzIGEgZmlyc3Qgc3RlcCAoYW5kIGl0IHNodXRzIHVwIG1vc3Qgb2YKICBhdXRvY29uZidzIHdhcm5pbmdzIGFib3V0IEFDX1RSWV9SVU4pLgoKLSBUaGUgVW5peCBidWlsZCBpcyBub3cgYSBiaXQgbGVzcyBjaGF0dHksIGNvdXJ0ZXN5IG9mIHRoZSBwYXJzZXIKICBnZW5lcmF0b3IuICBUaGUgYnVpbGQgaXMgY29tcGxldGVseSBzaWxlbnQgKGV4Y2VwdCBmb3IgZXJyb3JzKSB3aGVuCiAgdXNpbmcgIm1ha2UgLXMiLCB0aGFua3MgdG8gYSAtcSBvcHRpb24gdG8gc2V0dXAucHkuCgpDIEFQSQoKLSBUaGUgInN0cnVjdG1lbWJlciIgQVBJIG5vdyBzdXBwb3J0cyBzb21lIG5ldyBmbGFnIGJpdHMgdG8gZGVueSByZWFkCiAgYW5kL29yIHdyaXRlIGFjY2VzcyB0byBhdHRyaWJ1dGVzIGluIHJlc3RyaWN0ZWQgZXhlY3V0aW9uIG1vZGUuCgpOZXcgcGxhdGZvcm1zCgotIENvbXBhcSdzIGlQQVEgaGFuZGhlbGQsIHJ1bm5pbmcgdGhlICJmYW1pbGlhciIgTGludXggZGlzdHJpYnV0aW9uCiAgKGh0dHA6Ly9mYW1pbGlhci5oYW5kaGVsZHMub3JnKS4KClRlc3RzCgpXaW5kb3dzCgotIExhcmdlIGZpbGUgc3VwcG9ydCBub3cgYWxzbyB3b3JrcyBmb3IgZmlsZXMgPiA0R0IsIG9uIGZpbGVzeXN0ZW1zCiAgdGhhdCBzdXBwb3J0IGl0IChOVEZTIHVuZGVyIFdpbmRvd3MgMjAwMCkuCgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4yYTM/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQ29yZQoKLSBDb252ZXJzaW9uIG9mIGxvbmcgdG8gZmxvYXQgbm93IHJhaXNlcyBPdmVyZmxvd0Vycm9yIGlmIHRoZSBsb25nIGlzIHRvbwogIGJpZyB0byByZXByZXNlbnQgYXMgYSBDIGRvdWJsZS4KCi0gVGhlIDMtYXJndW1lbnQgYnVpbHRpbiBwb3coKSBubyBsb25nZXIgYWxsb3dzIGEgdGhpcmQgbm9uLU5vbmUgYXJndW1lbnQKICBpZiBlaXRoZXIgb2YgdGhlIGZpcnN0IHR3byBhcmd1bWVudHMgaXMgYSBmbG9hdCwgb3IgaWYgYm90aCBhcmUgb2YKICBpbnRlZ2VyIHR5cGVzIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIG5lZ2F0aXZlIChpbiB3aGljaCBsYXR0ZXIgY2FzZQogIHRoZSBhcmd1bWVudHMgYXJlIGNvbnZlcnRlZCB0byBmbG9hdCwgc28gdGhpcyBpcyByZWFsbHkgdGhlIHNhbWUKICByZXN0cmljdGlvbikuCgotIFRoZSBidWlsdGluIGRpcigpIG5vdyByZXR1cm5zIG1vcmUgaW5mb3JtYXRpb24sIGFuZCBzb21ldGltZXMgbXVjaAogIG1vcmUsIGdlbmVyYWxseSBuYW1pbmcgYWxsIGF0dHJpYnV0ZXMgb2YgYW4gb2JqZWN0LCBhbmQgYWxsIGF0dHJpYnV0ZXMKICByZWFjaGFibGUgZnJvbSB0aGUgb2JqZWN0IHZpYSBpdHMgY2xhc3MsIGFuZCBmcm9tIGl0cyBjbGFzcydzIGJhc2UKICBjbGFzc2VzLCBhbmQgc28gb24gZnJvbSB0aGVtIHRvby4gIEV4YW1wbGU6ICBpbiAyLjJhMiwgZGlyKFtdKSByZXR1cm5lZAogIGFuIGVtcHR5IGxpc3QuICBJbiAyLjJhMywKCiAgPj4+IGRpcihbXSkKICBbJ19fYWRkX18nLCAnX19jbGFzc19fJywgJ19fY29udGFpbnNfXycsICdfX2RlbGF0dHJfXycsICdfX2RlbGl0ZW1fXycsCiAgICdfX2VxX18nLCAnX19nZV9fJywgJ19fZ2V0YXR0cl9fJywgJ19fZ2V0aXRlbV9fJywgJ19fZ2V0c2xpY2VfXycsCiAgICdfX2d0X18nLCAnX19oYXNoX18nLCAnX19pYWRkX18nLCAnX19pbXVsX18nLCAnX19pbml0X18nLCAnX19sZV9fJywKICAgJ19fbGVuX18nLCAnX19sdF9fJywgJ19fbXVsX18nLCAnX19uZV9fJywgJ19fbmV3X18nLCAnX19yZXByX18nLAogICAnX19ybXVsX18nLCAnX19zZXRhdHRyX18nLCAnX19zZXRpdGVtX18nLCAnX19zZXRzbGljZV9fJywgJ19fc3RyX18nLAogICAnYXBwZW5kJywgJ2NvdW50JywgJ2V4dGVuZCcsICdpbmRleCcsICdpbnNlcnQnLCAncG9wJywgJ3JlbW92ZScsCiAgICdyZXZlcnNlJywgJ3NvcnQnXQoKICBkaXIobW9kdWxlKSBjb250aW51ZXMgdG8gcmV0dXJuIG9ubHkgdGhlIG1vZHVsZSdzIGF0dHJpYnV0ZXMsIHRob3VnaC4KCi0gT3ZlcmZsb3dpbmcgb3BlcmF0aW9ucyBvbiBwbGFpbiBpbnRzIG5vdyByZXR1cm4gYSBsb25nIGludCByYXRoZXIKICB0aGFuIHJhaXNpbmcgT3ZlcmZsb3dFcnJvci4gIFRoaXMgaXMgYSBwYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIFBFUAogIDIzNy4gIFlvdSBjYW4gdXNlIC1XZGVmYXVsdDo6T3ZlcmZsb3dXYXJuaW5nIHRvIGVuYWJsZSBhIHdhcm5pbmcgZm9yCiAgdGhpcyBzaXR1YXRpb24sIGFuZCAtV2Vycm9yOjpPdmVyZmxvd1dhcm5pbmcgdG8gcmV2ZXJ0IHRvIHRoZSBvbGQKICBPdmVyZmxvd0Vycm9yIGV4Y2VwdGlvbi4KCi0gQSBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbiwgLVE8YXJnPiwgaXMgYWRkZWQgdG8gY29udHJvbCBydW4tdGltZQogIHdhcm5pbmdzIGZvciB0aGUgdXNlIG9mIGNsYXNzaWMgZGl2aXNpb24uICAoU2VlIFBFUCAyMzguKSAgUG9zc2libGUKICB2YWx1ZXMgYXJlIC1Rb2xkLCAtUXdhcm4sIC1Rd2FybmFsbCwgYW5kIC1RbmV3LiAgVGhlIGRlZmF1bHQgaXMKICAtUW9sZCwgbWVhbmluZyB0aGUgLyBvcGVyYXRvciBoYXMgaXRzIGNsYXNzaWMgbWVhbmluZyBhbmQgbm8KICB3YXJuaW5ncyBhcmUgaXNzdWVkLiAgVXNpbmcgLVF3YXJuIGlzc3VlcyBhIHJ1bi10aW1lIHdhcm5pbmcgYWJvdXQKICBhbGwgdXNlcyBvZiBjbGFzc2ljIGRpdmlzaW9uIGZvciBpbnQgYW5kIGxvbmcgYXJndW1lbnRzOyAtUXdhcm5hbGwKICBhbHNvIHdhcm5zIGFib3V0IGNsYXNzaWMgZGl2aXNpb24gZm9yIGZsb2F0IGFuZCBjb21wbGV4IGFyZ3VtZW50cwogIChmb3IgdXNlIHdpdGggZml4ZGl2LnB5KS4gIFVzaW5nIC1RbmV3IGlzIHF1ZXN0aW9uYWJsZTsgaXQgdHVybnMgb24KICBuZXcgZGl2aXNpb24gYnkgZGVmYXVsdCwgYnV0IG9ubHkgaW4gdGhlIF9fbWFpbl9fIG1vZHVsZS4gIFlvdSBjYW4KICB1c2VmdWxseSBjb21iaW5lIC1Rd2FybiBvciAtUXdhcm5hbGwgYW5kIC1RbmV3OiB0aGlzIGdpdmVzIHRoZQogIF9fbWFpbl9fIG1vZHVsZSBuZXcgZGl2aXNpb24sIGFuZCB3YXJucyBhYm91dCBjbGFzc2ljIGRpdmlzaW9uCiAgZXZlcnl3aGVyZSBlbHNlLgoKLSBNYW55IGJ1aWx0LWluIHR5cGVzIGNhbiBub3cgYmUgc3ViY2xhc3NlZC4gIFRoaXMgYXBwbGllcyB0byBpbnQsCiAgbG9uZywgZmxvYXQsIHN0ciwgdW5pY29kZSwgYW5kIHR1cGxlLiAgKFRoZSB0eXBlcyBjb21wbGV4LCBsaXN0IGFuZAogIGRpY3Rpb25hcnkgY2FuIGFsc28gYmUgc3ViY2xhc3NlZDsgdGhpcyB3YXMgaW50cm9kdWNlZCBlYXJsaWVyLikKICBOb3RlIHRoYXQgcmVzdHJpY3Rpb25zIGFwcGx5IHdoZW4gc3ViY2xhc3NpbmcgaW1tdXRhYmxlIGJ1aWx0LWluCiAgdHlwZXM6IHlvdSBjYW4gb25seSBhZmZlY3QgdGhlIHZhbHVlIG9mIHRoZSBpbnN0YW5jZSBieSBvdmVybG9hZGluZwogIF9fbmV3X18uICBZb3UgY2FuIGFkZCBtdXRhYmxlIGF0dHJpYnV0ZXMsIGFuZCB0aGUgc3ViY2xhc3MgaW5zdGFuY2VzCiAgd2lsbCBoYXZlIGEgX19kaWN0X18gYXR0cmlidXRlLCBidXQgeW91IGNhbm5vdCBjaGFuZ2UgdGhlICJ2YWx1ZSIKICAoYXMgaW1wbGVtZW50ZWQgYnkgdGhlIGJhc2UgY2xhc3MpIG9mIGFuIGltbXV0YWJsZSBzdWJjbGFzcyBpbnN0YW5jZQogIG9uY2UgaXQgaXMgY3JlYXRlZC4KCi0gVGhlIGRpY3Rpb25hcnkgY29uc3RydWN0b3Igbm93IHRha2VzIGFuIG9wdGlvbmFsIGFyZ3VtZW50LCBhCiAgbWFwcGluZy1saWtlIG9iamVjdCwgYW5kIGluaXRpYWxpemVzIHRoZSBkaWN0aW9uYXJ5IGZyb20gaXRzCiAgKGtleSwgdmFsdWUpIHBhaXJzLgoKLSBBIG5ldyBidWlsdC1pbiB0eXBlLCBzdXBlciwgaGFzIGJlZW4gYWRkZWQuICBUaGlzIGZhY2lsaXRhdGVzIG1ha2luZwogICJjb29wZXJhdGl2ZSBzdXBlciBjYWxscyIgaW4gYSBtdWx0aXBsZSBpbmhlcml0YW5jZSBzZXR0aW5nLiAgRm9yIGFuCiAgZXhwbGFuYXRpb24sIHNlZSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvMi4yL2Rlc2NyaW50cm8uaHRtbCNjb29wZXJhdGlvbgoKLSBBIG5ldyBidWlsdC1pbiB0eXBlLCBwcm9wZXJ0eSwgaGFzIGJlZW4gYWRkZWQuICBUaGlzIGVuYWJsZXMgdGhlCiAgY3JlYXRpb24gb2YgInByb3BlcnRpZXMiLiAgVGhlc2UgYXJlIGF0dHJpYnV0ZXMgaW1wbGVtZW50ZWQgYnkKICBnZXR0ZXIgYW5kIHNldHRlciBmdW5jdGlvbnMgKG9yIG9ubHkgb25lIG9mIHRoZXNlIGZvciByZWFkLW9ubHkgb3IKICB3cml0ZS1vbmx5IGF0dHJpYnV0ZXMpLCB3aXRob3V0IHRoZSBuZWVkIHRvIG92ZXJyaWRlIF9fZ2V0YXR0cl9fLgogIFNlZSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvMi4yL2Rlc2NyaW50cm8uaHRtbCNwcm9wZXJ0eQoKLSBUaGUgc3ludGF4IG9mIGZsb2F0aW5nLXBvaW50IGFuZCBpbWFnaW5hcnkgbGl0ZXJhbHMgaGFzIGJlZW4KICBsaWJlcmFsaXplZCwgdG8gYWxsb3cgbGVhZGluZyB6ZXJvZXMuICBFeGFtcGxlcyBvZiBsaXRlcmFscyBub3cKICBsZWdhbCB0aGF0IHdlcmUgU3ludGF4RXJyb3JzIGJlZm9yZToKCiAgICAgIDAwLjAgICAgMGUzICAgMDEwMGogICAwNy41ICAgMDAwMDAwMDAwMDAwMDAwMDAwMDguCgotIEFuIG9sZCB0b2tlbml6ZXIgYnVnIGFsbG93ZWQgZmxvYXRpbmcgcG9pbnQgbGl0ZXJhbHMgd2l0aCBhbiBpbmNvbXBsZXRlCiAgZXhwb25lbnQsIHN1Y2ggYXMgMWUgYW5kIDMuMWUtLiAgU3VjaCBsaXRlcmFscyBub3cgcmFpc2UgU3ludGF4RXJyb3IuCgpMaWJyYXJ5CgotIHRlbG5ldGxpYiBpbmNsdWRlcyBzeW1ib2xpYyBuYW1lcyBmb3IgdGhlIG9wdGlvbnMsIGFuZCBzdXBwb3J0IGZvcgogIHNldHRpbmcgYW4gb3B0aW9uIG5lZ290aWF0aW9uIGNhbGxiYWNrLgoKLSBUaGUgbmV3IEMgc3RhbmRhcmQgbm8gbG9uZ2VyIHJlcXVpcmVzIHRoYXQgbWF0aCBsaWJyYXJpZXMgc2V0IGVycm5vIHRvCiAgRVJBTkdFIG9uIG92ZXJmbG93LiAgRm9yIHBsYXRmb3JtIGxpYnJhcmllcyB0aGF0IGV4cGxvaXQgdGhpcyBuZXcKICBmcmVlZG9tLCBQeXRob24ncyBvdmVyZmxvdy1jaGVja2luZyB3YXMgd2hvbGx5IGJyb2tlbi4gIEEgbmV3IG92ZXJmbG93LQogIGNoZWNraW5nIHNjaGVtZSBhdHRlbXB0cyB0byByZXBhaXIgdGhhdCwgYnV0IG1heSBub3QgYmUgcmVsaWFibGUgb24gYWxsCiAgcGxhdGZvcm1zIChDIGRvZXNuJ3Qgc2VlbSB0byBwcm92aWRlIGFueXRoaW5nIGJvdGggdXNlZnVsIGFuZCBwb3J0YWJsZQogIGluIHRoaXMgYXJlYSBhbnltb3JlKS4KCi0gQXN5bmNocm9ub3VzIHRpbWVvdXQgYWN0aW9ucyBhcmUgYXZhaWxhYmxlIHRocm91Z2ggdGhlIG5ldyBjbGFzcwogIHRocmVhZGluZy5UaW1lci4KCi0gbWF0aC5sb2cgYW5kIG1hdGgubG9nMTAgbm93IHJldHVybiBzZW5zaWJsZSByZXN1bHRzIGZvciBldmVuIGh1Z2UKICBsb25nIGFyZ3VtZW50cy4gIEZvciBleGFtcGxlLCBtYXRoLmxvZzEwKDEwICoqIDEwMDAwKSB+PSAxMDAwMC4wLgoKLSBBIG5ldyBmdW5jdGlvbiwgaW1wLmxvY2tfaGVsZCgpLCByZXR1cm5zIDEgd2hlbiB0aGUgaW1wb3J0IGxvY2sgaXMKICBjdXJyZW50bHkgaGVsZC4gIFNlZSB0aGUgZG9jcyBmb3IgdGhlIGltcCBtb2R1bGUuCgotIHBpY2tsZSwgY1BpY2tsZSBhbmQgbWFyc2hhbCBvbiAzMi1iaXQgcGxhdGZvcm1zIGNhbiBub3cgY29ycmVjdGx5IHJlYWQKICBkdW1wcyBjb250YWluaW5nIGludHMgd3JpdHRlbiBvbiBwbGF0Zm9ybXMgd2hlcmUgUHl0aG9uIGludHMgYXJlIDggYnl0ZXMuCiAgV2hlbiByZWFkIG9uIGEgYm94IHdoZXJlIFB5dGhvbiBpbnRzIGFyZSA0IGJ5dGVzLCBzdWNoIHZhbHVlcyBhcmUKICBjb252ZXJ0ZWQgdG8gUHl0aG9uIGxvbmdzLgoKLSBJbiByZXN0cmljdGVkIGV4ZWN1dGlvbiBtb2RlICh1c2luZyB0aGUgcmV4ZWMgbW9kdWxlKSwgdW5tYXJzaGFsbGluZwogIGNvZGUgb2JqZWN0cyBpcyBubyBsb25nZXIgYWxsb3dlZC4gIFRoaXMgcGx1Z3MgYSBzZWN1cml0eSBob2xlLgoKLSB1bml0dGVzdC5UZXN0UmVzdWx0IGluc3RhbmNlcyBubyBsb25nZXIgc3RvcmUgcmVmZXJlbmNlcyB0byB0cmFjZWJhY2tzCiAgZ2VuZXJhdGVkIGJ5IHRlc3QgZmFpbHVyZXMuIFRoaXMgcHJldmVudHMgdW5leHBlY3RlZCBkYW5nbGluZyByZWZlcmVuY2VzCiAgdG8gb2JqZWN0cyB0aGF0IHNob3VsZCBiZSBnYXJiYWdlIGNvbGxlY3RlZCBiZXR3ZWVuIHRlc3RzLgoKVG9vbHMKCi0gVG9vbHMvc2NyaXB0cy9maXhkaXYucHkgaGFzIGJlZW4gYWRkZWQgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZml4CiAgZGl2aXNpb24gb3BlcmF0b3JzIGFzIHBlciBQRVAgMjM4LgoKQnVpbGQKCi0gSWYgeW91IGFyZSBhbiBhZHZlbnR1cm91cyBwZXJzb24gdXNpbmcgTWFjIE9TIFggeW91IG1heSB3YW50IHRvIGxvb2sgYXQKICBNYWMvT1NYLiBUaGVyZSBpcyBhIE1ha2VmaWxlIHRoZXJlIHRoYXQgd2lsbCBidWlsZCBQeXRob24gYXMgYSByZWFsIE1hYwogIGFwcGxpY2F0aW9uLCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgZXhwZXJpbWVudGluZyB3aXRoIENhcmJvbiBvciBDb2NvYS4KICBEaXNjdXNzaW9uIG9mIHRoaXMgb24gcHl0aG9ubWFjLXNpZywgcGxlYXNlLgoKQyBBUEkKCi0gTmV3IGZ1bmN0aW9uIFB5T2JqZWN0X0RpcihvYmopLCBsaWtlIFB5dGhvbiBfX2J1aWx0aW5fXy5kaXIob2JqKS4KCi0gTm90ZSB0aGF0IFB5TG9uZ19Bc0RvdWJsZSBjYW4gZmFpbCEgIFRoaXMgaGFzIGFsd2F5cyBiZWVuIHRydWUsIGJ1dCBubwogIGNhbGxlcnMgY2hlY2tlZCBmb3IgaXQuICBJdCdzIG1vcmUgbGlrZWx5IHRvIGZhaWwgbm93LCBiZWNhdXNlIG92ZXJmbG93CiAgZXJyb3JzIGFyZSBwcm9wZXJseSBkZXRlY3RlZCBub3cuICBUaGUgcHJvcGVyIHdheSB0byBjaGVjazoKCiAgZG91YmxlIHggPSBQeUxvbmdfQXNEb3VibGUoc29tZV9sb25nX29iamVjdCk7CiAgaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgICAvKiBUaGUgY29udmVyc2lvbiBmYWlsZWQuICovCiAgfQoKLSBUaGUgR0MgQVBJIGhhcyBiZWVuIGNoYW5nZWQuICBFeHRlbnNpb25zIHRoYXQgdXNlIHRoZSBvbGQgQVBJIHdpbGwgc3RpbGwKICBjb21waWxlIGJ1dCB3aWxsIG5vdCBwYXJ0aWNpcGF0ZSBpbiBHQy4gIFRvIHVwZ3JhZGUgYW4gZXh0ZW5zaW9uCiAgbW9kdWxlOgoKICAgIC0gcmVuYW1lIFB5X1RQRkxBR1NfR0MgdG8gUHlUUEZMQUdTX0hBVkVfR0MKCiAgICAtIHVzZSBQeU9iamVjdF9HQ19OZXcgb3IgUHlPYmplY3RfR0NfTmV3VmFyIHRvIGFsbG9jYXRlIG9iamVjdHMgYW5kCiAgICAgIFB5T2JqZWN0X0dDX0RlbCB0byBkZWFsbG9jYXRlIHRoZW0KCiAgICAtIHJlbmFtZSBQeU9iamVjdF9HQ19Jbml0IHRvIFB5T2JqZWN0X0dDX1RyYWNrIGFuZCBQeU9iamVjdF9HQ19GaW5pCiAgICAgIHRvIFB5T2JqZWN0X0dDX1VuVHJhY2sKCiAgICAtIHJlbW92ZSBQeUdDX0hFQURfU0laRSBmcm9tIG9iamVjdCBzaXplIGNhbGN1bGF0aW9ucwoKICAgIC0gcmVtb3ZlIGNhbGxzIHRvIFB5T2JqZWN0X0FTX0dDIGFuZCBQeU9iamVjdF9GUk9NX0dDCgotIFR3byBuZXcgZnVuY3Rpb25zOiBQeVN0cmluZ19Gcm9tRm9ybWF0KCkgYW5kIFB5U3RyaW5nX0Zyb21Gb3JtYXRWKCkuCiAgVGhlc2UgY2FuIGJlIHVzZWQgc2FmZWx5IHRvIGNvbnN0cnVjdCBzdHJpbmcgb2JqZWN0cyBmcm9tIGEKICBzcHJpbnRmLXN0eWxlIGZvcm1hdCBzdHJpbmcgKHNpbWlsYXIgdG8gdGhlIGZvcm1hdCBzdHJpbmcgc3VwcG9ydGVkCiAgYnkgUHlFcnJfRm9ybWF0KCkpLgoKTmV3IHBsYXRmb3JtcwoKLSBTdGVwaGVuIEhhbnNlbiBjb250cmlidXRlZCBwYXRjaGVzIHN1ZmZpY2llbnQgdG8gZ2V0IGEgY2xlYW4gY29tcGlsZQogIHVuZGVyIEJvcmxhbmQgQyAoV2luZG93cyksIGJ1dCBoZSByZXBvcnRzIHByb2JsZW1zIHJ1bm5pbmcgaXQgYW5kIHJhbgogIG91dCBvZiB0aW1lIHRvIGNvbXBsZXRlIHRoZSBwb3J0LiAgVm9sdW50ZWVycz8gIEV4cGVjdCBhIE1lbW9yeUVycm9yCiAgd2hlbiBpbXBvcnRpbmcgdGhlIHR5cGVzIG1vZHVsZTsgdGhpcyBpcyBwcm9iYWJseSBzaGFsbG93LCBhbmQKICBjYXVzaW5nIGxhdGVyIGZhaWx1cmVzIHRvby4KClRlc3RzCgpXaW5kb3dzCgotIExhcmdlIGZpbGUgc3VwcG9ydCBpcyBub3cgZW5hYmxlZCBvbiBXaW4zMiBwbGF0Zm9ybXMgYXMgd2VsbCBhcyBvbgogIFdpbjY0LiAgVGhpcyBtZWFucyB0aGF0LCBmb3IgZXhhbXBsZSwgeW91IGNhbiB1c2UgZi50ZWxsKCkgYW5kIGYuc2VlaygpCiAgdG8gbWFuaXB1bGF0ZSBmaWxlcyBsYXJnZXIgdGhhbiAyIGdpZ2FieXRlcyAocHJvdmlkZWQgeW91IGhhdmUgZW5vdWdoCiAgZGlzayBzcGFjZSwgYW5kIGFyZSB1c2luZyBhIFdpbmRvd3MgZmlsZXN5c3RlbSB0aGF0IHN1cHBvcnRzIGxhcmdlCiAgcGFydGl0aW9ucykuICBXaW5kb3dzIGZpbGVzeXN0ZW0gbGltaXRzOiAgRkFUIGhhcyBhIDJHQiAoZ2lnYWJ5dGUpCiAgZmlsZXNpemUgbGltaXQsIGFuZCBsYXJnZSBmaWxlIHN1cHBvcnQgbWFrZXMgbm8gZGlmZmVyZW5jZSB0aGVyZS4KICBGQVQzMidzIGxpbWl0IGlzIDRHQiwgYW5kIGZpbGVzID49IDJHQiBhcmUgZWFzaWVyIHRvIHVzZSBmcm9tIFB5dGhvbiBub3cuCiAgTlRGUyBoYXMgbm8gcHJhY3RpY2FsIGxpbWl0IG9uIGZpbGUgc2l6ZSwgYW5kIGZpbGVzIG9mIGFueSBzaXplIGNhbiBiZQogIHVzZWQgZnJvbSBQeXRob24gbm93LgoKLSBUaGUgdzl4cG9wZW4gaGFjayBpcyBub3cgdXNlZCBvbiBXaW5kb3dzIE5UIGFuZCAyMDAwIHRvbyB3aGVuIENPTVBTUEVDCiAgcG9pbnRzIHRvIGNvbW1hbmQuY29tIChwYXRjaCBmcm9tIEJyaWFuIFF1aW5sYW4pLgoKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMmEyPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkJ1aWxkCgotIFRpbSBQZXRlcnMgZGV2ZWxvcGVkIGEgYnJhbmQgbmV3IFdpbmRvd3MgaW5zdGFsbGVyIHVzaW5nIFdpc2UgOC4xLAogIGdlbmVyb3VzbHkgZG9uYXRlZCB0byB1cyBieSBXaXNlIFNvbHV0aW9ucy4KCi0gY29uZmlndXJlIHN1cHBvcnRzIGEgbmV3IG9wdGlvbiAtLWVuYWJsZS11bmljb2RlLCB3aXRoIHRoZSB2YWx1ZXMKICB1Y3MyIGFuZCB1Y3M0IChuZXcgaW4gMi4yYTEpLiBXaXRoIC0tZGlzYWJsZS11bmljb2RlLCB0aGUgVW5pY29kZQogIHR5cGUgYW5kIHN1cHBvcnRpbmcgY29kZSBpcyBjb21wbGV0ZWx5IHJlbW92ZWQgZnJvbSB0aGUgaW50ZXJwcmV0ZXIuCgotIEEgbmV3IGNvbmZpZ3VyZSBvcHRpb24gLS1lbmFibGUtZnJhbWV3b3JrIGJ1aWxkcyBhIE1hYyBPUyBYIGZyYW1ld29yaywKICB3aGljaCAibWFrZSBmcmFtZXdvcmtpbnN0YWxsIiB3aWxsIGluc3RhbGwuIFRoaXMgcHJvdmlkZXMgYSBzdGFydGluZwogIHBvaW50IGZvciBtb3JlIG1hYy1saWtlIGZ1bmN0aW9uYWxpdHksIGpvaW4gcHl0aG9ubWFjLXNpZ0BweXRob24ub3JnCiAgaWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIGhlbHBpbmcuCgotIFRoZSBOZVhUIHBsYXRmb3JtIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuCgotIFRoZSBgbmV3JyBtb2R1bGUgaXMgbm93IHN0YXRpY2FsbHkgbGlua2VkLgoKVG9vbHMKCi0gVGhlIG5ldyBUb29scy9zY3JpcHRzL2NsZWFuZnV0dXJlLnB5IGNhbiBiZSB1c2VkIHRvIGF1dG9tYXRpY2FsbHkKICBlZGl0IG91dCBvYnNvbGV0ZSBmdXR1cmUgc3RhdGVtZW50cyBmcm9tIFB5dGhvbiBzb3VyY2UgY29kZS4gIFNlZQogIHRoZSBtb2R1bGUgZG9jc3RyaW5nIGZvciBkZXRhaWxzLgoKVGVzdHMKCi0gcmVncnRlc3QucHkgbm93IGtub3dzIHdoaWNoIHRlc3RzIGFyZSBleHBlY3RlZCB0byBiZSBza2lwcGVkIG9uIHNvbWUKICBwbGF0Zm9ybXMsIGFsbG93aW5nIHRvIGdpdmUgY2xlYXJlciB0ZXN0IHJlc3VsdCBvdXRwdXQuICByZWdydGVzdAogIGFsc28gaGFzIG9wdGlvbmFsIC0tdXNlLy11IHN3aXRjaCB0byBydW4gbm9ybWFsbHkgZGlzYWJsZWQgdGVzdHMKICB3aGljaCByZXF1aXJlIG5ldHdvcmsgYWNjZXNzIG9yIGNvbnN1bWUgc2lnbmlmaWNhbnQgZGlzayByZXNvdXJjZXMuCgotIFNldmVyYWwgbmV3IHRlc3RzIGluIHRoZSBzdGFuZGFyZCB0ZXN0IHN1aXRlLCB3aXRoIHNwZWNpYWwgdGhhbmtzIHRvCiAgTmljayBNYXRoZXdzb24uCgpDb3JlCgotIFRoZSBmbG9vciBkaXZpc2lvbiBvcGVyYXRvciAvLyBoYXMgYmVlbiBhZGRlZCBhcyBvdXRsaW5lZCBpbiBQRVAKICAyMzguICBUaGUgLyBvcGVyYXRvciBzdGlsbCBwcm92aWRlcyBjbGFzc2ljIGRpdmlzaW9uIChhbmQgd2lsbCB1bnRpbAogIFB5dGhvbiAzLjApIHVubGVzcyAiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbiIgaXMgaW5jbHVkZWQsIGluCiAgd2hpY2ggY2FzZSB0aGUgLyBvcGVyYXRvciB3aWxsIHByb3ZpZGUgdHJ1ZSBkaXZpc2lvbi4gIFRoZSBvcGVyYXRvcgogIG1vZHVsZSBwcm92aWRlcyB0cnVlZGl2KCkgYW5kIGZsb29yZGl2KCkgZnVuY3Rpb25zLiAgQXVnbWVudGVkCiAgYXNzaWdubWVudCB2YXJpYW50cyBhcmUgaW5jbHVkZWQsIGFzIGFyZSB0aGUgZXF1aXZhbGVudCBvdmVybG9hZGFibGUKICBtZXRob2RzIGFuZCBDIEFQSSBtZXRob2RzLiAgU2VlIHRoZSBQRVAgZm9yIGEgZnVsbCBkaXNjdXNzaW9uOgogIDxodHRwOi8vcHl0aG9uLnNmLm5ldC9wZXBzL3BlcC0wMjM4Lmh0bWw+CgotIEZ1dHVyZSBzdGF0ZW1lbnRzIGFyZSBub3cgZWZmZWN0aXZlIGluIHNpbXVsYXRlZCBpbnRlcmFjdGl2ZSBzaGVsbHMKICAobGlrZSBJRExFKS4gIFRoaXMgc2hvdWxkICJqdXN0IHdvcmsiIGJ5IG1hZ2ljLCBidXQgcmVhZCBNaWNoYWVsCiAgSHVkc29uJ3MgIkZ1dHVyZSBzdGF0ZW1lbnRzIGluIHNpbXVsYXRlZCBzaGVsbHMiIFBFUCAyNjQgZm9yIGZ1bGwKICBkZXRhaWxzOiAgPGh0dHA6Ly9weXRob24uc2YubmV0L3BlcHMvcGVwLTAyNjQuaHRtbD4uCgotIFRoZSB0eXBlL2NsYXNzIHVuaWZpY2F0aW9uIChQRVAgMjUyLTI1Mykgd2FzIGludGVncmF0ZWQgaW50byB0aGUKICB0cnVuayBhbmQgaXMgbm90IHNvIHRlbnRhdGl2ZSBhbnkgbW9yZSAodGhlIGV4YWN0IHNwZWNpZmljYXRpb24gb2YKICBzb21lIGZlYXR1cmVzIGlzIHN0aWxsIHRlbnRhdGl2ZSkuICBBIGxvdCBvZiB3b3JrIGhhcyBkb25lIG9uIGZpeGluZwogIGJ1Z3MgYW5kIGFkZGluZyByb2J1c3RuZXNzIGFuZCBmZWF0dXJlcyAocGVyZm9ybWFuY2Ugc3RpbGwgaGFzIHRvCiAgY29tZSBhIGxvbmcgd2F5KS4KCi0gV2FybmluZ3MgYWJvdXQgYSBtaXNtYXRjaCBpbiB0aGUgUHl0aG9uIEFQSSBkdXJpbmcgZXh0ZW5zaW9uIGltcG9ydAogIG5vdyB1c2UgdGhlIFB5dGhvbiB3YXJuaW5nIGZyYW1ld29yayAod2hpY2ggbWFrZXMgaXQgcG9zc2libGUgdG8KICB3cml0ZSBmaWx0ZXJzIGZvciB0aGVzZSB3YXJuaW5ncykuCgotIEEgZnVuY3Rpb24ncyBfX2RpY3RfXyAoYWthIGZ1bmNfZGljdCkgd2lsbCBub3cgYWx3YXlzIGJlIGEKICBkaWN0aW9uYXJ5LiAgSXQgdXNlZCB0byBiZSBwb3NzaWJsZSB0byBkZWxldGUgaXQgb3Igc2V0IGl0IHRvIE5vbmUsCiAgYnV0IG5vdyBib3RoIGFjdGlvbnMgcmFpc2UgVHlwZUVycm9ycy4gIEl0IGlzIHN0aWxsIGxlZ2FsIHRvIHNldCBpdAogIHRvIGEgZGljdGlvbmFyeSBvYmplY3QuICBHZXR0aW5nIGZ1bmMuX19kaWN0X18gYmVmb3JlIGFueSBhdHRyaWJ1dGVzCiAgaGF2ZSBiZWVuIGFzc2lnbmVkIG5vdyByZXR1cm5zIGFuIGVtcHR5IGRpY3Rpb25hcnkgaW5zdGVhZCBvZiBOb25lLgoKLSBBIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uLCAtRSwgd2FzIGFkZGVkIHdoaWNoIGRpc2FibGVzIHRoZSB1c2Ugb2YKICBhbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBvciBhdCBsZWFzdCB0aG9zZSB0aGF0IGFyZSBzcGVjaWZpY2FsbHkKICBzaWduaWZpY2FudCB0byBQeXRob24uICBVc3VhbGx5IHRob3NlIGhhdmUgYSBuYW1lIHN0YXJ0aW5nIHdpdGgKICAiUFlUSE9OIi4gIFRoaXMgd2FzIHVzZWQgdG8gZml4IGEgcHJvYmxlbSB3aGVyZSB0aGUgdGVzdHMgZmFpbCBpZgogIHRoZSB1c2VyIGhhcHBlbnMgdG8gaGF2ZSBQWVRIT05IT01FIG9yIFBZVEhPTlBBVEggcG9pbnRpbmcgdG8gYW4KICBvbGRlciBkaXN0cmlidXRpb24uCgpMaWJyYXJ5CgotIE5ldyBjbGFzcyBEaWZmZXIgYW5kIG5ldyBmdW5jdGlvbnMgbmRpZmYoKSBhbmQgcmVzdG9yZSgpIGluIGRpZmZsaWIucHkuCiAgVGhlc2UgcGFja2FnZSB0aGUgYWxnb3JpdGhtcyB1c2VkIGJ5IHRoZSBwb3B1bGFyIFRvb2xzL3NjcmlwdHMvbmRpZmYucHksCiAgZm9yIHByb2dyYW1tYXRpYyByZXVzZS4KCi0gTmV3IGZ1bmN0aW9uIHhtbC5zYXguc2F4dXRpbHMucXVvdGVhdHRyKCk6ICBRdW90ZSBhbiBYTUwgYXR0cmlidXRlCiAgdmFsdWUgdXNpbmcgdGhlIG1pbmltYWwgcXVvdGluZyByZXF1aXJlZCBmb3IgdGhlIHZhbHVlOyBtb3JlCiAgcmVsaWFibGUgdGhhbiB1c2luZyB4bWwuc2F4LnNheHV0aWxzLmVzY2FwZSgpIGZvciBhdHRyaWJ1dGUgdmFsdWVzLgoKLSBSZWFkbGluZSBjb21wbGV0aW9uIHN1cHBvcnQgZm9yIGNtZC5DbWQgd2FzIGFkZGVkLgoKLSBDYWxsaW5nIG9zLnRlbXBuYW0oKSBvciBvcy50bXBuYW0oKSBnZW5lcmF0ZSBSdW50aW1lV2FybmluZ3MuCgotIEFkZGVkIGZ1bmN0aW9uIHRocmVhZGluZy5Cb3VuZGVkU2VtYXBob3JlKCkKCi0gQWRkZWQgS2EtUGluZyBZZWUncyBjZ2l0Yi5weSBtb2R1bGUuCgotIFRoZSBgbmV3JyBtb2R1bGUgbm93IGV4cG9zZXMgdGhlIENPX3h4eCBmbGFncy4KCk5ldyBwbGF0Zm9ybXMKCkMgQVBJCgotIFR3byBuZXcgQVBJcyBQeU9TX3NucHJpbnRmKCkgYW5kIFB5T1NfdnNucHJpbnRmKCkgd2VyZSBhZGRlZAogIHdoaWNoIHByb3ZpZGUgYSBjcm9zcy1wbGF0Zm9ybSBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZQogIHJlbGF0aXZlbHkgbmV3IHNucHJpbnRmKCkvdnNucHJpbnRmKCkgQyBsaWIgQVBJcy4gSW4gY29udHJhc3QgdG8KICB0aGUgc3RhbmRhcmQgc3ByaW50ZigpIGFuZCB2c3ByaW50ZigpIEMgbGliIEFQSXMsIHRoZXNlIHZlcnNpb25zCiAgYXBwbHkgYm91bmRzIGNoZWNraW5nIG9uIHRoZSB1c2VkIGJ1ZmZlciB3aGljaCBlbmhhbmNlcyBwcm90ZWN0aW9uCiAgYWdhaW5zdCBidWZmZXIgb3ZlcnJ1bnMuCgotIFVuaWNvZGUgQVBJcyBub3cgdXNlIG5hbWUgbWFuZ2xpbmcgdG8gYXNzdXJlIHRoYXQgbWl4aW5nIGludGVycHJldGVycwogIGFuZCBleHRlbnNpb25zIHVzaW5nIGRpZmZlcmVudCBVbmljb2RlIHdpZHRocyBpcyByZW5kZXJlZCBuZXh0IHRvCiAgaW1wb3NzaWJsZS4gVHJ5aW5nIHRvIGltcG9ydCBhbiBpbmNvbXBhdGlibGUgVW5pY29kZS1hd2FyZSBleHRlbnNpb24KICB3aWxsIHJlc3VsdCBpbiBhbiBJbXBvcnRFcnJvci4gIFVuaWNvZGUgZXh0ZW5zaW9ucyB3cml0ZXJzIG11c3QgbWFrZQogIHN1cmUgdG8gY2hlY2sgdGhlIFVuaWNvZGUgd2lkdGggY29tcGF0aWJpbGl0eSBpbiB0aGVpciBleHRlbnNpb25zIGJ5CiAgdXNpbmcgYXQgbGVhc3Qgb25lIG9mIHRoZSBtYW5nbGVkIFVuaWNvZGUgQVBJcyBpbiB0aGUgZXh0ZW5zaW9uLgoKLSBUd28gbmV3IGZsYWdzIE1FVEhfTk9BUkdTIGFuZCBNRVRIX08gYXJlIGF2YWlsYWJsZSBpbiBtZXRob2QgZGVmaW5pdGlvbgogIHRhYmxlcyB0byBzaW1wbGlmeSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIHdpdGggbm8gYXJndW1lbnRzIGFuZCBhCiAgc2luZ2xlIHVudHlwZWQgYXJndW1lbnQuIENhbGxpbmcgc3VjaCBtZXRob2RzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4KICBjYWxsaW5nIGNvcnJlc3BvbmRpbmcgTUVUSF9WQVJBUkdTIG1ldGhvZHMuIE1FVEhfT0xEQVJHUyBpcyBub3cKICBkZXByZWNhdGVkLgoKV2luZG93cwoKLSAiaW1wb3J0IG1vZHVsZSIgbm93IGNvbXBpbGVzIG1vZHVsZS5weXcgaWYgaXQgZXhpc3RzIGFuZCBub3RoaW5nIGVsc2UKICByZWxldmFudCBpcyBmb3VuZC4KCgpXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjJhMT8KPT09PT09PT09PT09PT09PT09PT09PT09PT09CgpDb3JlCgotIFRFTlRBVElWRUxZLCBhIGxhcmdlIGFtb3VudCBvZiBjb2RlIGltcGxlbWVudGluZyBtdWNoIG9mIHdoYXQncwogIGRlc2NyaWJlZCBpbiBQRVAgMjUyIChNYWtpbmcgVHlwZXMgTG9vayBNb3JlIExpa2UgQ2xhc3NlcykgYW5kIFBFUAogIDI1MyAoU3VidHlwaW5nIEJ1aWx0LWluIFR5cGVzKSB3YXMgYWRkZWQuICBUaGlzIHdpbGwgYmUgcmVsZWFzZWQKICB3aXRoIFB5dGhvbiAyLjJhMS4gIERvY3VtZW50YXRpb24gd2lsbCBiZSBwcm92aWRlZCBzZXBhcmF0ZWx5CiAgdGhyb3VnaCBodHRwOi8vd3d3LnB5dGhvbi5vcmcvMi4yLy4gIFRoZSBwdXJwb3NlIG9mIHJlbGVhc2luZyB0aGlzCiAgd2l0aCBQeXRob24gMi4yYTEgaXMgdG8gdGVzdCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gIEl0IGlzCiAgcG9zc2libGUsIHRob3VnaCBub3QgbGlrZWx5LCB0aGF0IGEgZGVjaXNpb24gaXMgbWFkZSBub3QgdG8gcmVsZWFzZQogIHRoaXMgY29kZSBhcyBwYXJ0IG9mIDIuMiBmaW5hbCwgaWYgYW55IHNlcmlvdXMgYmFja3dhcmRzCiAgaW5jb21wYXBhdGliaWxpdGllcyBhcmUgZm91bmQgZHVyaW5nIGFscGhhIHRlc3RpbmcgdGhhdCBjYW5ub3QgYmUKICByZXBhaXJlZC4KCi0gR2VuZXJhdG9ycyB3ZXJlIGFkZGVkOyB0aGlzIGlzIGEgbmV3IHdheSB0byBjcmVhdGUgYW4gaXRlcmF0b3IgKHNlZQogIGJlbG93KSB1c2luZyB3aGF0IGxvb2tzIGxpa2UgYSBzaW1wbGUgZnVuY3Rpb24gY29udGFpbmluZyBvbmUgb3IKICBtb3JlICd5aWVsZCcgc3RhdGVtZW50cy4gIFNlZSBQRVAgMjU1LiAgU2luY2UgdGhpcyBhZGRzIGEgbmV3CiAga2V5d29yZCB0byB0aGUgbGFuZ3VhZ2UsIHRoaXMgZmVhdHVyZSBtdXN0IGJlIGVuYWJsZWQgYnkgaW5jbHVkaW5nIGEKICBmdXR1cmUgc3RhdGVtZW50OiAiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBnZW5lcmF0b3JzIiAoc2VlIFBFUCAyMzYpLgogIEdlbmVyYXRvcnMgd2lsbCBiZWNvbWUgYSBzdGFuZGFyZCBmZWF0dXJlIGluIGEgZnV0dXJlIHJlbGVhc2UKICAocHJvYmFibHkgMi4zKS4gIFdpdGhvdXQgdGhpcyBmdXR1cmUgc3RhdGVtZW50LCAneWllbGQnIHJlbWFpbnMgYW4KICBvcmRpbmFyeSBpZGVudGlmaWVyLCBidXQgYSB3YXJuaW5nIGlzIGlzc3VlZCBlYWNoIHRpbWUgaXQgaXMgdXNlZC4KICAoVGhlc2Ugd2FybmluZ3MgY3VycmVudGx5IGRvbid0IGNvbmZvcm0gdG8gdGhlIHdhcm5pbmdzIGZyYW1ld29yayBvZgogIFBFUCAyMzA7IHdlIGludGVuZCB0byBmaXggdGhpcyBpbiAyLjJhMi4pCgotIFRoZSBVVEYtMTYgY29kZWMgd2FzIG1vZGlmaWVkIHRvIGJlIG1vcmUgUkZDIGNvbXBsaWFudC4gSXQgd2lsbCBub3cKICBvbmx5IHJlbW92ZSBCT00gY2hhcmFjdGVycyBhdCB0aGUgc3RhcnQgb2YgdGhlIHN0cmluZyBhbmQgdGhlbgogIG9ubHkgaWYgcnVubmluZyBpbiBuYXRpdmUgbW9kZSAoVVRGLTE2LUxFIGFuZCAtQkUgd29uJ3QgcmVtb3ZlIGEKICBsZWFkaW5nIEJNTyBjaGFyYWN0ZXIpLgoKLSBTdHJpbmdzIG5vdyBoYXZlIGEgbmV3IG1ldGhvZCAuZGVjb2RlKCkgdG8gY29tcGxlbWVudCB0aGUgYWxyZWFkeQogIGV4aXN0aW5nIC5lbmNvZGUoKSBtZXRob2QuIFRoZXNlIHR3byBtZXRob2RzIHByb3ZpZGUgZGlyZWN0IGFjY2VzcwogIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRlY29kZXJzIGFuZCBlbmNvZGVycyBvZiB0aGUgcmVnaXN0ZXJlZCBjb2RlY3MuCgogIFRvIGVuaGFuY2UgdGhlIHVzYWJpbGl0eSBvZiB0aGUgLmVuY29kZSgpIG1ldGhvZCwgdGhlIHNwZWNpYWwKICBjYXNpbmcgb2YgVW5pY29kZSBvYmplY3QgcmV0dXJuIHZhbHVlcyB3YXMgZHJvcHBlZCAoVW5pY29kZSBvYmplY3RzCiAgd2VyZSBhdXRvLW1hZ2ljYWxseSBjb252ZXJ0ZWQgdG8gc3RyaW5nIHVzaW5nIHRoZSBkZWZhdWx0IGVuY29kaW5nKS4KCiAgQm90aCBtZXRob2RzIHdpbGwgbm93IHJldHVybiB3aGF0ZXZlciB0aGUgY29kZWMgaW4gY2hhcmdlIG9mIHRoZQogIHJlcXVlc3RlZCBlbmNvZGluZyByZXR1cm5zIGFzIG9iamVjdCwgZS5nLiBVbmljb2RlIGNvZGVjcyB3aWxsCiAgcmV0dXJuIFVuaWNvZGUgb2JqZWN0cyB3aGVuIGRlY29kaW5nIGlzIHJlcXVlc3RlZCAoIuT2/CIuZGVjb2RlKCJsYXRpbi0xIikKICB3aWxsIHJldHVybiB1IuT2/CIpLiBUaGlzIGVuYWJsZXMgY29kZWMgd3JpdGVyIHRvIGNyZWF0ZSBjb2RlY3MKICBmb3IgdmFyaW91cyBzaW1wbGUgdG8gdXNlIGNvbnZlcnNpb25zLgoKICBOZXcgY29kZWNzIHdlcmUgYWRkZWQgdG8gZGVtb25zdHJhdGUgdGhlc2UgbmV3IGZlYXR1cmVzICh0aGUgLmVuY29kZSgpCiAgYW5kIC5kZWNvZGUoKSBjb2x1bW5zIGluZGljYXRlIHRoZSB0eXBlIG9mIHRoZSByZXR1cm5lZCBvYmplY3RzKToKCiAgTmFtZSAgICAgfCAuZW5jb2RlKCkgfCAuZGVjb2RlKCkgfCBEZXNjcmlwdGlvbgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICB1dSAgICAgICB8IHN0cmluZyAgICB8IHN0cmluZyAgICB8IFVVIGNvZGVjIChlLmcuIGZvciBlbWFpbCkKICBiYXNlNjQgICB8IHN0cmluZyAgICB8IHN0cmluZyAgICB8IGJhc2U2NCBjb2RlYwogIHF1b3ByaSAgIHwgc3RyaW5nICAgIHwgc3RyaW5nICAgIHwgcXVvdGVkLXByaW50YWJsZSBjb2RlYwogIHpsaWIgICAgIHwgc3RyaW5nICAgIHwgc3RyaW5nICAgIHwgemxpYiBjb21wcmVzc2lvbgogIGhleCAgICAgIHwgc3RyaW5nICAgIHwgc3RyaW5nICAgIHwgMi1ieXRlIGhleCBjb2RlYwogIHJvdC0xMyAgIHwgc3RyaW5nICAgIHwgVW5pY29kZSAgIHwgUk9ULTEzIFVuaWNvZGUgY2hhcm1hcCBjb2RlYwoKLSBTb21lIG9wZXJhdGluZyBzeXN0ZW1zIG5vdyBzdXBwb3J0IHRoZSBjb25jZXB0IG9mIGEgZGVmYXVsdCBVbmljb2RlCiAgZW5jb2RpbmcgZm9yIGZpbGUgc3lzdGVtIG9wZXJhdGlvbnMuICBOb3RhYmx5LCBXaW5kb3dzIHN1cHBvcnRzICdtYmNzJwogIGFzIHRoZSBkZWZhdWx0LiAgVGhlIE1hY2ludG9zaCB3aWxsIGFsc28gYWRvcHQgdGhpcyBjb25jZXB0IGluIHRoZSBtZWRpdW0KICB0ZXJtLCBhbHRob3VnaCB0aGUgZGVmYXVsdCBlbmNvZGluZyBmb3IgdGhhdCBwbGF0Zm9ybSB3aWxsIGJlIG90aGVyIHRoYW4KICAnbWJjcycuCgogIE9uIG9wZXJhdGluZyBzeXN0ZW0gdGhhdCBzdXBwb3J0IG5vbi1BU0NJSSBmaWxlbmFtZXMsIGl0IGlzIGNvbW1vbiBmb3IKICBmdW5jdGlvbnMgdGhhdCByZXR1cm4gZmlsZW5hbWVzIChzdWNoIGFzIG9zLmxpc3RkaXIoKSkgdG8gcmV0dXJuIFB5dGhvbgogIHN0cmluZyBvYmplY3RzIHByZS1lbmNvZGVkIHVzaW5nIHRoZSBkZWZhdWx0IGZpbGUgc3lzdGVtIGVuY29kaW5nIGZvcgogIHRoZSBwbGF0Zm9ybS4gIEFzIHRoaXMgZW5jb2RpbmcgaXMgbGlrZWx5IHRvIGJlIGRpZmZlcmVudCBmcm9tIFB5dGhvbidzCiAgZGVmYXVsdCBlbmNvZGluZywgY29udmVydGluZyB0aGlzIG5hbWUgdG8gYSBVbmljb2RlIG9iamVjdCBiZWZvcmUgcGFzc2luZwogIGl0IGJhY2sgdG8gdGhlIE9wZXJhdGluZyBTeXN0ZW0gd291bGQgcmVzdWx0IGluIGEgVW5pY29kZSBlcnJvciwgYXMgUHl0aG9uCiAgd291bGQgYXR0ZW1wdCB0byB1c2UgaXRzIGRlZmF1bHQgZW5jb2RpbmcgKGdlbmVyYWxseSBBU0NJSSkgcmF0aGVyIHRoYW4KICB0aGUgZGVmYXVsdCBlbmNvZGluZyBmb3IgdGhlIGZpbGUgc3lzdGVtLgoKICBJbiBnZW5lcmFsLCB0aGlzIGNoYW5nZSBzaW1wbHkgcmVtb3ZlcyBzdXJwcmlzZXMgd2hlbiB3b3JraW5nIHdpdGgKICBVbmljb2RlIGFuZCB0aGUgZmlsZSBzeXN0ZW0sIG1ha2luZyB0aGVzZSBvcGVyYXRpb25zIHdvcmsgYXMgeW91IGV4cGVjdCwKICBpbmNyZWFzaW5nIHRoZSB0cmFuc3BhcmVuY3kgb2YgVW5pY29kZSBvYmplY3RzIGluIHRoaXMgY29udGV4dC4KICBTZWUgWz8/Pz9dIGZvciBtb3JlIGRldGFpbHMsIGluY2x1ZGluZyBleGFtcGxlcy4KCi0gRmxvYXQgKGFuZCBjb21wbGV4KSBsaXRlcmFscyBpbiBzb3VyY2UgY29kZSB3ZXJlIGV2YWx1YXRlZCB0byBmdWxsCiAgcHJlY2lzaW9uIG9ubHkgd2hlbiBydW5uaW5nIGZyb20gYSAucHkgZmlsZTsgdGhlIHNhbWUgY29kZSBsb2FkZWQgZnJvbSBhCiAgLnB5YyAob3IgLnB5bykgZmlsZSBjb3VsZCBzdWZmZXIgbnVtZXJpYyBkaWZmZXJlbmNlcyBzdGFydGluZyBhdCBhYm91dCB0aGUKICAxMnRoIHNpZ25pZmljYW50IGRlY2ltYWwgZGlnaXQuICBGb3IgZXhhbXBsZSwgb24gYSBtYWNoaW5lIHdpdGggSUVFRS03NTQKICBmbG9hdGluZyBhcml0aG1ldGljLAoKICAgICAgeCA9IDkwMDcxOTkyNTQ3NDA5OTIuMAogICAgICBwcmludCBsb25nKHgpCgogIHByaW50ZWQgOTAwNzE5OTI1NDc0MDk5MiBpZiBydW4gZGlyZWN0bHkgZnJvbSAucHksIGJ1dCA5MDA3MTk5MjU0NzQwMDAwCiAgaWYgZnJvbSBhIGNvbXBpbGVkICgucHljIG9yIC5weW8pIGZpbGUuICBUaGlzIHdhcyBkdWUgdG8gbWFyc2hhbCB1c2luZwogIHN0cihmbG9hdCkgaW5zdGVhZCBvZiByZXByKGZsb2F0KSB3aGVuIGJ1aWxkaW5nIGNvZGUgb2JqZWN0cy4gIG1hcnNoYWwKICBub3cgdXNlcyByZXByKGZsb2F0KSBpbnN0ZWFkLCB3aGljaCBzaG91bGQgcmVwcm9kdWNlIGZsb2F0cyB0byBmdWxsCiAgbWFjaGluZSBwcmVjaXNpb24gKGFzc3VtaW5nIHRoZSBwbGF0Zm9ybSBDIGZsb2F0PC0+c3RyaW5nIEkvTyBjb252ZXJzaW9uCiAgZnVuY3Rpb25zIGFyZSBvZiBnb29kIHF1YWxpdHkpLgoKICBUaGlzIG1heSBjYXVzZSBmbG9hdGluZy1wb2ludCByZXN1bHRzIHRvIGNoYW5nZSBpbiBzb21lIGNhc2VzLCBhbmQKICB1c3VhbGx5IGZvciB0aGUgYmV0dGVyLCBidXQgbWF5IGFsc28gY2F1c2UgbnVtZXJpY2FsbHkgdW5zdGFibGUKICBhbGdvcml0aG1zIHRvIGJyZWFrLgoKLSBUaGUgaW1wbGVtZW50YXRpb24gb2YgZGljdHMgc3VmZmVycyBmZXdlciBjb2xsaXNpb25zLCB3aGljaCBoYXMgc3BlZWQKICBiZW5lZml0cy4gIEhvd2V2ZXIsIHRoZSBvcmRlciBpbiB3aGljaCBkaWN0IGVudHJpZXMgYXBwZWFyIGluIGRpY3Qua2V5cygpLAogIGRpY3QudmFsdWVzKCkgYW5kIGRpY3QuaXRlbXMoKSBtYXkgZGlmZmVyIGZyb20gcHJldmlvdXMgcmVsZWFzZXMgZm9yIGEKICBnaXZlbiBkaWN0LiAgTm90aGluZyBpcyBkZWZpbmVkIGFib3V0IHRoaXMgb3JkZXIsIHNvIG5vIHByb2dyYW0gc2hvdWxkCiAgcmVseSBvbiBpdC4gIE5ldmVydGhlbGVzcywgaXQncyBlYXN5IHRvIHdyaXRlIHRlc3QgY2FzZXMgdGhhdCByZWx5IG9uIHRoZQogIG9yZGVyIGJ5IGFjY2lkZW50LCB0eXBpY2FsbHkgYmVjYXVzZSBvZiBwcmludGluZyB0aGUgc3RyKCkgb3IgcmVwcigpIG9mIGEKICBkaWN0IHRvIGFuICJleHBlY3RlZCByZXN1bHRzIiBmaWxlLiAgU2VlIExpYi90ZXN0L3Rlc3Rfc3VwcG9ydC5weSdzIG5ldwogIHNvcnRkaWN0KGRpY3QpIGZ1bmN0aW9uIGZvciBhIHNpbXBsZSB3YXkgdG8gZGlzcGxheSBhIGRpY3QgaW4gc29ydGVkCiAgb3JkZXIuCgotIE1hbnkgb3RoZXIgc21hbGwgY2hhbmdlcyB0byBkaWN0cyB3ZXJlIG1hZGUsIHJlc3VsdGluZyBpbiBmYXN0ZXIKICBvcGVyYXRpb24gYWxvbmcgdGhlIG1vc3QgY29tbW9uIGNvZGUgcGF0aHMuCgotIERpY3Rpb25hcnkgb2JqZWN0cyBub3cgc3VwcG9ydCB0aGUgImluIiBvcGVyYXRvcjogInggaW4gZGljdCIgbWVhbnMKICB0aGUgc2FtZSBhcyBkaWN0Lmhhc19rZXkoeCkuCgotIFRoZSB1cGRhdGUoKSBtZXRob2Qgb2YgZGljdGlvbmFyaWVzIG5vdyBhY2NlcHRzIGdlbmVyaWMgbWFwcGluZwogIG9iamVjdHMuICBTcGVjaWZpY2FsbHkgdGhlIGFyZ3VtZW50IG9iamVjdCBtdXN0IHN1cHBvcnQgdGhlIC5rZXlzKCkKICBhbmQgX19nZXRpdGVtX18oKSBtZXRob2RzLiAgVGhpcyBhbGxvd3MgeW91IHRvIHNheSwgZm9yIGV4YW1wbGUsCiAge30udXBkYXRlKFVzZXJEaWN0KCkpCgotIEl0ZXJhdG9ycyB3ZXJlIGFkZGVkOyB0aGlzIGlzIGEgZ2VuZXJhbGl6ZWQgd2F5IG9mIHByb3ZpZGluZyB2YWx1ZXMKICB0byBhIGZvciBsb29wLiAgU2VlIFBFUCAyMzQuICBUaGVyZSdzIGEgbmV3IGJ1aWx0LWluIGZ1bmN0aW9uIGl0ZXIoKQogIHRvIHJldHVybiBhbiBpdGVyYXRvci4gIFRoZXJlJ3MgYSBuZXcgcHJvdG9jb2wgdG8gZ2V0IHRoZSBuZXh0IHZhbHVlCiAgZnJvbSBhbiBpdGVyYXRvciB1c2luZyB0aGUgbmV4dCgpIG1ldGhvZCAoaW4gUHl0aG9uKSBvciB0aGUKICB0cF9pdGVybmV4dCBzbG90IChpbiBDKS4gIFRoZXJlJ3MgYSBuZXcgcHJvdG9jb2wgdG8gZ2V0IGl0ZXJhdG9ycwogIHVzaW5nIHRoZSBfX2l0ZXJfXygpIG1ldGhvZCAoaW4gUHl0aG9uKSBvciB0aGUgdHBfaXRlciBzbG90IChpbiBDKS4KICBJdGVyYXRpbmcgKGkuZS4gYSBmb3IgbG9vcCkgb3ZlciBhIGRpY3Rpb25hcnkgZ2VuZXJhdGVzIGl0cyBrZXlzLgogIEl0ZXJhdGluZyBvdmVyIGEgZmlsZSBnZW5lcmF0ZXMgaXRzIGxpbmVzLgoKLSBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB3ZXJlIGdlbmVyYWxpemVkIHRvIHdvcmsgbmljZWx5IHdpdGggaXRlcmF0b3IKICBhcmd1bWVudHM6CiAgICBtYXAoKSwgZmlsdGVyKCksIHJlZHVjZSgpLCB6aXAoKQogICAgbGlzdCgpLCB0dXBsZSgpIChQeVNlcXVlbmNlX1R1cGxlKCkgYW5kIFB5U2VxdWVuY2VfRmFzdCgpIGluIEMgQVBJKQogICAgbWF4KCksIG1pbigpCiAgICBqb2luKCkgbWV0aG9kIG9mIHN0cmluZ3MKICAgIGV4dGVuZCgpIG1ldGhvZCBvZiBsaXN0cwogICAgJ3ggaW4geScgYW5kICd4IG5vdCBpbiB5JyAoUHlTZXF1ZW5jZV9Db250YWlucygpIGluIEMgQVBJKQogICAgb3BlcmF0b3IuY291bnRPZigpIChQeVNlcXVlbmNlX0NvdW50KCkgaW4gQyBBUEkpCiAgICByaWdodC1oYW5kIHNpZGUgb2YgYXNzaWdubWVudCBzdGF0ZW1lbnRzIHdpdGggbXVsdGlwbGUgdGFyZ2V0cywgc3VjaCBhcwogICAgICAgIHgsIHksIHogPSBzb21lX2l0ZXJhYmxlX29iamVjdF9yZXR1cm5pbmdfZXhhY3RseV8zX3ZhbHVlcwoKLSBBY2Nlc3NpbmcgbW9kdWxlIGF0dHJpYnV0ZXMgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgKGZvciBleGFtcGxlLAogIHJhbmRvbS5yYW5kb20gb3Igb3MucGF0aCBvciB5b3VyUHl0aG9uTW9kdWxlLnlvdXJBdHRyaWJ1dGUpLgoKLSBDb21wYXJpbmcgZGljdGlvbmFyeSBvYmplY3RzIHZpYSA9PSBhbmQgIT0gaXMgZmFzdGVyLCBhbmQgbm93IHdvcmtzIGV2ZW4KICBpZiB0aGUga2V5cyBhbmQgdmFsdWVzIGRvbid0IHN1cHBvcnQgY29tcGFyaXNvbnMgb3RoZXIgdGhhbiA9PS4KCi0gQ29tcGFyaW5nIGRpY3Rpb25hcmllcyBpbiB3YXlzIG90aGVyIHRoYW4gPT0gYW5kICE9IGlzIHNsb3dlcjogIHRoZXJlIHdlcmUKICBpbnNlY3VyaXRpZXMgaW4gdGhlIGRpY3QgY29tcGFyaXNvbiBpbXBsZW1lbnRhdGlvbiB0aGF0IGNvdWxkIGNhdXNlIFB5dGhvbgogIHRvIGNyYXNoIGlmIHRoZSBlbGVtZW50IGNvbXBhcmlzb24gcm91dGluZXMgZm9yIHRoZSBkaWN0IGtleXMgYW5kL29yCiAgdmFsdWVzIG11dGF0ZWQgdGhlIGRpY3RzLiAgTWFraW5nIHRoZSBjb2RlIGJ1bGxldHByb29mIHNsb3dlZCBpdCBkb3duLgoKLSBDb2xsaXNpb25zIGluIGRpY3RzIGFyZSByZXNvbHZlZCB2aWEgYSBuZXcgYXBwcm9hY2gsIHdoaWNoIGNhbiBoZWxwCiAgZHJhbWF0aWNhbGx5IGluIGJhZCBjYXNlcy4gIEZvciBleGFtcGxlLCBsb29raW5nIHVwIGV2ZXJ5IGtleSBpbiBhIGRpY3QKICBkIHdpdGggZC5rZXlzKCkgPT0gW2kgPDwgMTYgZm9yIGkgaW4gcmFuZ2UoMjAwMDApXSBpcyBhcHByb3hpbWF0ZWx5IDUwMHgKICBmYXN0ZXIgbm93LiAgVGhhbmtzIHRvIENocmlzdGlhbiBUaXNtZXIgZm9yIHBvaW50aW5nIG91dCB0aGUgY2F1c2UgYW5kCiAgdGhlIG5hdHVyZSBvZiBhbiBlZmZlY3RpdmUgY3VyZSAobGFzdCBEZWNlbWJlciEgYmV0dGVyIGxhdGUgdGhhbiBuZXZlcikuCgotIHJlcHIoKSBpcyBtdWNoIGZhc3RlciBmb3IgbGFyZ2UgY29udGFpbmVycyAoZGljdCwgbGlzdCwgdHVwbGUpLgoKCkxpYnJhcnkKCi0gVGhlIGNvbnN0YW50cyBhc2NpaV9sZXR0ZXJzLCBhc2NpaV9sb3dlcmNhc2UuIGFuZCBhc2NpaV91cHBlcmNhc2UKICB3ZXJlIGFkZGVkIHRvIHRoZSBzdHJpbmcgbW9kdWxlLiAgVGhlc2UgYSBsb2NhbGUtaW5kZW5wZW5kZW50CiAgY29uc3RhbnRzLCB1bmxpa2UgbGV0dGVycywgbG93ZXJjYXNlLCBhbmQgdXBwZXJjYXNlLiAgVGhlc2UgYXJlIG5vdwogIHVzZSBpbiBhcHByb3ByaWF0ZSBsb2NhdGlvbnMgaW4gdGhlIHN0YW5kYXJkIGxpYnJhcnkuCgotIFRoZSBmbGFncyB1c2VkIGluIGRsb3BlbiBjYWxscyBjYW4gbm93IGJlIGNvbmZpZ3VyZWQgdXNpbmcKICBzeXMuc2V0ZGxvcGVuZmxhZ3MgYW5kIHF1ZXJpZWQgdXNpbmcgc3lzLmdldGRsb3BlbmZsYWdzLgoKLSBGcmVkcmlrIEx1bmRoJ3MgeG1scnBjbGliIGlzIG5vdyBhIHN0YW5kYXJkIGxpYnJhcnkgbW9kdWxlLiAgVGhpcwogIHByb3ZpZGVzIGZ1bGwgY2xpZW50LXNpZGUgWE1MLVJQQyBzdXBwb3J0LiAgSW4gYWRkaXRpb24sCiAgRGVtby94bWxycGMvIGNvbnRhaW5zIHR3byBzZXJ2ZXIgZnJhbWV3b3JrcyAob25lIFNvY2tldFNlcnZlci1iYXNlZCwKICBvbmUgYXN5bmNvcmUtYmFzZWQpLiAgVGhhbmtzIHRvIEVyaWMgUmF5bW9uZCBmb3IgdGhlIGRvY3VtZW50YXRpb24uCgotIFRoZSB4cmFuZ2UoKSBvYmplY3QgaXMgc2ltcGxpZmllZDogaXQgbm8gbG9uZ2VyIHN1cHBvcnRzIHNsaWNpbmcsCiAgcmVwZXRpdGlvbiwgY29tcGFyaXNvbnMsIGVmZmljaWVudCAnaW4nIGNoZWNraW5nLCB0aGUgdG9saXN0KCkKICBtZXRob2QsIG9yIHRoZSBzdGFydCwgc3RvcCBhbmQgc3RlcCBhdHRyaWJ1dGVzLiAgU2VlIFBFUCAyNjAuCgotIEEgbmV3IGZ1bmN0aW9uIGZubWF0Y2guZmlsdGVyIHRvIGZpbHRlciBsaXN0cyBvZiBmaWxlIG5hbWVzIHdhcyBhZGRlZC4KCi0gY2FsZW5kYXIucHkgdXNlcyBtb250aCBhbmQgZGF5IG5hbWVzIGJhc2VkIG9uIHRoZSBjdXJyZW50IGxvY2FsZS4KCi0gc3Ryb3AgaXMgbm93ICpyZWFsbHkqIG9ic29sZXRlICh0aGlzIHdhcyBhbm5vdW5jZWQgYmVmb3JlIHdpdGggMS42KSwKICBhbmQgaXNzdWVzIERlcHJlY2F0aW9uV2FybmluZyB3aGVuIHVzZWQgKGV4Y2VwdCBmb3IgdGhlIGZvdXIgaXRlbXMKICB0aGF0IGFyZSBzdGlsbCBpbXBvcnRlZCBpbnRvIHN0cmluZy5weSkuCgotIENvb2tpZS5weSBub3cgc29ydHMga2V5K3ZhbHVlIHBhaXJzIGJ5IGtleSBpbiBvdXRwdXQgc3RyaW5ncy4KCi0gcHByaW50LmlzcmVjdXJzaXZlKG9iamVjdCkgZGlkbid0IGNvcnJlY3RseSBpZGVudGlmeSByZWN1cnNpdmUgb2JqZWN0cy4KICBOb3cgaXQgZG9lcy4KCi0gcHByaW50IGZ1bmN0aW9ucyBub3cgbXVjaCBmYXN0ZXIgZm9yIGxhcmdlIGNvbnRhaW5lcnMgKHR1cGxlLCBsaXN0LCBkaWN0KS4KCi0gTmV3ICdxJyBhbmQgJ1EnIGZvcm1hdCBjb2RlcyBpbiB0aGUgc3RydWN0IG1vZHVsZSwgY29ycmVzcG9uZGluZyB0byBDCiAgdHlwZXMgImxvbmcgbG9uZyIgYW5kICJ1bnNpZ25lZCBsb25nIGxvbmciIChvbiBXaW5kb3dzLCBfX2ludDY0KS4gIEluCiAgbmF0aXZlIG1vZGUsIHRoZXNlIGNhbiBiZSB1c2VkIG9ubHkgd2hlbiB0aGUgcGxhdGZvcm0gQyBjb21waWxlciBzdXBwb3J0cwogIHRoZXNlIHR5cGVzICh3aGVuIEhBVkVfTE9OR19MT05HIGlzICNkZWZpbmUnZCBieSB0aGUgUHl0aG9uIGNvbmZpZwogIHByb2Nlc3MpLCBhbmQgdGhlbiB0aGV5IGluaGVyaXQgdGhlIHNpemVzIGFuZCBhbGlnbm1lbnRzIG9mIHRoZSBDIHR5cGVzLgogIEluIHN0YW5kYXJkIG1vZGUsICdxJyBhbmQgJ1EnIGFyZSBzdXBwb3J0ZWQgb24gYWxsIHBsYXRmb3JtcywgYW5kIGFyZQogIDgtYnl0ZSBpbnRlZ3JhbCB0eXBlcy4KCi0gVGhlIHNpdGUgbW9kdWxlIGluc3RhbGxzIGEgbmV3IGJ1aWx0LWluIGZ1bmN0aW9uICdoZWxwJyB0aGF0IGludm9rZXMKICBweWRvYy5oZWxwLiAgSXQgbXVzdCBiZSBpbnZva2VkIGFzICdoZWxwKCknOyB3aGVuIGludm9rZWQgYXMgJ2hlbHAnLAogIGl0IGRpc3BsYXlzIGEgbWVzc2FnZSByZW1pbmRpbmcgdGhlIHVzZXIgdG8gdXNlICdoZWxwKCknIG9yCiAgJ2hlbHAob2JqZWN0KScuCgpUZXN0cwoKLSBOZXcgdGVzdF9tdXRhbnRzLnB5IHJ1bnMgZGljdCBjb21wYXJpc29ucyB3aGVyZSB0aGUga2V5IGFuZCB2YWx1ZQogIGNvbXBhcmlzb24gb3BlcmF0b3JzIG11dHV0ZSB0aGUgZGljdHMgcmFuZG9tbHkgZHVyaW5nIGNvbXBhcmlzb24uICBUaGlzCiAgcmFwaWRseSBjYXVzZXMgUHl0aG9uIHRvIGNyYXNoIHVuZGVyIGVhcmxpZXIgcmVsZWFzZXMgKG5vdCBmb3IgdGhlIGZhaW50CiAgb2YgaGVhcnQ6ICBpdCBjYW4gYWxzbyBjYXVzZSBXaW45eCB0byBmcmVlemUgb3IgcmVib290ISkuCgotIE5ldyB0ZXN0X3BwcmludC5weSB2ZXJmaWVzIHRoYXQgcHByaW50LmlzcmVjdXJzaXZlKCkgYW5kCiAgcHByaW50LmlzcmVhZGFibGUoKSByZXR1cm4gc2Vuc2libGUgcmVzdWx0cy4gIEFsc28gdmVyaWZpZXMgdGhhdCBzaW1wbGUKICBjYXNlcyBwcm9kdWNlIGNvcnJlY3Qgb3V0cHV0LgoKQyBBUEkKCi0gUmVtb3ZlZCB0aGUgdW51c2VkIGxhc3RfaXNfc3RpY2t5IGFyZ3VtZW50IGZyb20gdGhlIGludGVybmFsCiAgX1B5VHVwbGVfUmVzaXplKCkuICBJZiB0aGlzIGFmZmVjdHMgeW91LCB5b3Ugd2VyZSBjaGVhdGluZy4KCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4xIChmaW5hbCk/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKV2Ugb25seSBjaGFuZ2VkIGEgZmV3IHRoaW5ncyBzaW5jZSB0aGUgbGFzdCByZWxlYXNlIGNhbmRpZGF0ZSwgYWxsIGluClB5dGhvbiBsaWJyYXJ5IGNvZGU6CgotIEEgYnVnIGluIHRoZSBsb2NhbGUgbW9kdWxlIHdhcyBmaXhlZCB0aGF0IGFmZmVjdGVkIGxvY2FsZXMgd2hpY2gKICBkZWZpbmUgbm8gZ3JvdXBpbmcgZm9yIG51bWVyaWMgZm9ybWF0dGluZy4KCi0gQSBmZXcgYnVncyBpbiB0aGUgd2Vha3JlZiBtb2R1bGUncyBpbXBsZW1lbnRhdGlvbnMgb2Ygd2VhawogIGRpY3Rpb25hcmllcyAoV2Vha1ZhbHVlRGljdGlvbmFyeSBhbmQgV2Vha0tleURpY3Rpb25hcnkpIHdlcmUgZml4ZWQsCiAgYW5kIHRoZSB0ZXN0IHN1aXRlIHdhcyB1cGRhdGVkIHRvIGNoZWNrIGZvciB0aGVzZSBidWdzLgoKLSBBbiBvbGQgYnVnIGluIHRoZSBvcy5wYXRoLndhbGsoKSBmdW5jdGlvbiAoaW50cm9kdWNlZCBpbiBQeXRob24KICAyLjAhKSB3YXMgZml4ZWQ6IGEgbm9uLWV4aXN0ZW50IGZpbGUgd291bGQgY2F1c2UgYW4gZXhjZXB0aW9uCiAgaW5zdGVhZCBvZiBiZWluZyBpZ25vcmVkLgoKLSBGaXhlZCBhIGZldyBidWdzIGluIHRoZSBuZXcgc3ltdGFibGUgbW9kdWxlIGZvdW5kIGJ5IE5laWwgTm9yd2l0eidzCiAgUHlDaGVja2VyLgoKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMWMyPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkEgZmx1cnJ5IG9mIHNtYWxsIGNoYW5nZXMsIGFuZCBvbmUgc2hvd3N0b3BwZXIgZml4ZWQgaW4gdGhlIG5pY2sgb2YKdGltZSBtYWRlIGl0IG5lY2Vzc2FyeSB0byByZWxlYXNlIGFub3RoZXIgcmVsZWFzZSBjYW5kaWRhdGUuICBUaGUgbGlzdApoZXJlIGlzIHRoZSAqY29tcGxldGUqIGxpc3Qgb2YgcGF0Y2hlcyAoZXhjZXB0IHZlcnNpb24gdXBkYXRlcyk6CgpDb3JlCgotIFRpbSBkaXNjb3ZlcmVkIGEgbmFzdHkgYnVnIGluIHRoZSBkaWN0aW9uYXJ5IGNvZGUsIGNhdXNlZCBieQogIFB5RGljdF9OZXh0KCkgY2FsbGluZyBkaWN0X3Jlc2l6ZSgpLCBhbmQgdGhlIEdDIGNvZGUncyB1c2Ugb2YKICBQeURpY3RfTmV4dCgpIHZpb2xhdGluZyBhbiBhc3N1bXB0aW9uIGluIGRpY3RfaXRlbXMoKS4gIFRoaXMgd2FzCiAgZml4ZWQgd2l0aCBjb25zaWRlcmFibGUgYW1vdW50cyBvZiBiYW5kLWFpZCwgYnV0IHRoZSBuZXQgZWZmZWN0IGlzIGEKICBzYW5lciBhbmQgbW9yZSByb2J1c3QgaW1wbGVtZW50YXRpb24uCgotIE1hZGUgYSBidW5jaCBvZiBzeW1ib2xzIHN0YXRpYyB0aGF0IHdlcmUgYWNjaWRlbnRhbGx5IGdsb2JhbC4KCkJ1aWxkIGFuZCBQb3J0cwoKLSBUaGUgc2V0dXAucHkgc2NyaXB0IGRpZG4ndCBjaGVjayBmb3IgYSBuZXcgZW5vdWdoIHZlcnNpb24gb2YgemxpYgogICgxLjEuMyBpcyBuZWVkZWQpLiAgTm93IGl0IGRvZXMuCgotIENoYW5nZWQgIm1ha2UgY2xlYW4iIHRhcmdldCB0byBhbHNvIHJlbW92ZSBzaGFyZWQgbGlicmFyaWVzLgoKLSBBZGRlZCBhIG1vcmUgZ2VuZXJhbCB3YXJuaW5nIGFib3V0IHRoZSBTR0kgSXJpeCBvcHRpbWl6ZXIgdG8gUkVBRE1FLgoKTGlicmFyeQoKLSBGaXggYSBidWcgaW4gdXJsbGliLmJhc2Vqb2luKCJodHRwOi8vaG9zdCIsICIuLi9maWxlLmh0bWwiKSB3aGljaAogIG9taXR0ZWQgdGhlIHNsYXNoIGJldHdlZW4gaG9zdCBhbmQgZmlsZS5odG1sLgoKLSBUaGUgbWFpbGJveCBtb2R1bGUncyBfTWFpbGJveCBjbGFzcyBjb250YWluZWQgYSBjb21wbGV0ZWx5IGJyb2tlbgogIGFuZCB1bmRvY3VtZW50ZWQgc2VlaygpIG1ldGhvZC4gIFJpcHBlZCBpdCBvdXQuCgotIEZpeGVkIGEgYnVuY2ggb2YgdHlwb3MgaW4gdmFyaW91cyBsaWJyYXJ5IG1vZHVsZXMgKHVybGxpYjIsIHNtdHBkLAogIHNnbWxsaWIsIG5ldHJjLCBjaHVuaykgZm91bmQgYnkgTmVpbCBOb3J3aXR6J3MgUHlDaGVja2VyLgoKLSBGaXhlZCBhIGZldyBsYXN0LW1pbnV0ZSBidWdzIGluIHVuaXR0ZXN0LgoKRXh0ZW5zaW9ucwoKLSBSZXZlcnRlZCB0aGUgcGF0Y2ggdG8gdGhlIE9wZW5TU0wgY29kZSBpbiBzb2NrZXRtb2R1bGUuYyB0byBzdXBwb3J0CiAgUkFORF9zdGF0dXMoKSBhbmQgdGhlIEVHRCwgYW5kIHRoZSBzdWJzZXF1ZW50IHBhdGNoIHRoYXQgdHJpZWQgdG8KICBmaXggaXQgZm9yIHByZS0wLjkuNSB2ZXJzaW9uczsgdGhlIHByb2JsZW0gd2l0aCB0aGUgcGF0Y2ggaXMgdGhhdCBvbgogIHNvbWUgc3lzdGVtcyBpdCBpc3N1ZXMgYSB3YXJuaW5nIHdoZW5ldmVyIHNvY2tldCBpcyBpbXBvcnRlZCwgYW5kCiAgdGhhdCdzIHVuYWNjZXB0YWJsZS4KClRlc3RzCgotIEZpeGVkIHRoZSBwaWNrbGUgdGVzdHMgdG8gd29yayB3aXRoICJpbXBvcnQgdGVzdC50ZXN0X3BpY2tsZSIuCgotIFR3ZWFrZWQgdGVzdF9sb2NhbGUucHkgdG8gYWN0dWFsbHkgcnVuIHRoZSB0ZXN0IFdpbmRvd3MuCgotIEluIGRpc3R1dGlscy9hcmNoaXZlX3V0aWwucHksIGNhbGwgemlwZmlsZS5aaXBGaWxlKCkgd2l0aCBtb2RlICJ3IiwKICBub3QgIndiIiAod2hpY2ggaXMgbm90IGEgdmFsaWQgbW9kZSBhdCBhbGwpLgoKLSBGaXggcHN0YXRzIGJyb3dzZXIgY3Jhc2hlcy4gIEltcG9ydCByZWFkbGluZSBpZiBpdCBleGlzdHMgdG8gbWFrZQogIHRoZSB1c2VyIGludGVyZmFjZSBuaWNlci4KCi0gQWRkICJpbXBvcnQgdGhyZWFkIiB0byB0aGUgdG9wIG9mIHRlc3QgbW9kdWxlcyB0aGF0IGltcG9ydCB0aGUKICB0aHJlYWRpbmcgbW9kdWxlICh0ZXN0X2FzeW5jaGF0IGFuZCB0ZXN0X3RocmVhZGVkdGVtcGZpbGUpLiAgVGhpcwogIHByZXZlbnRzIHRlc3QgZmFpbHVyZXMgY2F1c2VkIGJ5IGEgYnJva2VuIHRocmVhZGluZyBtb2R1bGUgcmVzdWx0aW5nCiAgZnJvbSBhIHByZXZpb3VzbHkgY2F1Z2h0IGZhaWxlZCBpbXBvcnQuCgotIENoYW5nZWQgdGVzdF9hc3luY2hhdC5weSB0byBzZXQgdGhlIFNPX1JFVVNFQUREUiBvcHRpb247IHRoaXMgd2FzCiAgbmVlZGVkIG9uIHNvbWUgcGxhdGZvcm1zIChlLmcuIFNvbGFyaXMgOCkgd2hlbiB0aGUgdGVzdHMgYXJlIHJ1bgogIHR3aWNlIGluIHN1Y2Nlc3Npb24uCgotIFNraXAgcmF0aGVyIHRoYW4gZmFpbCB0ZXN0X3N1bmF1ZGlvZGV2IGlmIG5vIGF1ZGlvIGRldmljZSBpcyBmb3VuZC4KCgpXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjFjMT8KPT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGlzIGxpc3Qgd2FzIHNpZ25pZmljYW50bHkgdXBkYXRlZCB3aGVuIDIuMWMyIHdhcyByZWxlYXNlZDsgdGhlIDIuMWMxCnJlbGVhc2UgZGlkbid0IG1lbnRpb24gbW9zdCBjaGFuZ2VzIHRoYXQgd2VyZSBhY3R1YWxseSBwYXJ0IG9mIDIuMWMxOgoKTGVnYWwKCi0gQ29weXJpZ2h0IHdhcyBhc3NpZ25lZCB0byB0aGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24gKFBTRikgYW5kIGEKICBQU0YgbGljZW5zZSAodmVyeSBzaW1pbGFyIHRvIHRoZSBDTlJJIGxpY2Vuc2UpIHdhcyBhZGRlZC4KCi0gVGhlIENOUkkgY29weXJpZ2h0IG5vdGljZSB3YXMgdXBkYXRlZCB0byBpbmNsdWRlIDIwMDEuCgpDb3JlCgotIEFmdGVyIGEgcHVibGljIG91dGNyeSwgYXNzaWdubWVudCB0byBfX2RlYnVnX18gaXMgbm8gbG9uZ2VyIGlsbGVnYWw7CiAgaW5zdGVhZCwgYSB3YXJuaW5nIGlzIGlzc3VlZC4gIEl0IHdpbGwgYmVjb21lIGlsbGVnYWwgaW4gMi4yLgoKLSBGaXhlZCBhIGNvcmUgZHVtcCB3aXRoICIlI3giICUgMCwgYW5kIGNoYW5nZWQgdGhlIHNlbWFudGljcyBzbyB0aGF0CiAgIiUjeCIgbm93IGFsd2F5cyBwcmVwZW5kcyAiMHgiLCBldmVuIGlmIHRoZSB2YWx1ZSBpcyB6ZXJvLgoKLSBGaXhlZCBzb21lIG5pdHMgaW4gdGhlIGJ5dGVjb2RlIGNvbXBpbGVyLgoKLSBGaXhlZCBjb3JlIGR1bXBzIHdoZW4gY2FsbGluZyBjZXJ0YWluIGtpbmRzIG9mIG5vbi1mdW5jdGlvbnMuCgotIEZpeGVkIHZhcmlvdXMgY29yZSBkdW1wcyBjYXVzZWQgYnkgcmVmZXJlbmNlIGNvdW50IGJ1Z3MuCgpCdWlsZCBhbmQgUG9ydHMKCi0gVXNlIElOU1RBTExfU0NSSVBUIHRvIGluc3RhbGwgc2NyaXB0IGZpbGVzLgoKLSBOZXcgcG9ydDogU0NPIFVuaXh3YXJlIDcsIGJ5IEJpbGx5IEcuIEFsbGllLgoKLSBVcGRhdGVkIFJJU0NPUyBwb3J0LgoKLSBVcGRhdGVkIEJlT1MgcG9ydCBhbmQgbm90ZXMuCgotIFZhcmlvdXMgb3RoZXIgcG9ydGluZyBwcm9ibGVtcyByZXNvbHZlZC4KCkxpYnJhcnkKCi0gVGhlIFRFUk1JT1MgYW5kIFNPQ0tFVCBtb2R1bGVzIGFyZSBub3cgdHJ1bHkgb2Jzb2xldGUgYW5kCiAgdW5uZWNlc3NhcnkuICBUaGVpciBzeW1ib2xzIGFyZSBpbmNvcnBvcmF0ZWQgaW4gdGhlIHRlcm1pb3MgYW5kCiAgc29ja2V0IG1vZHVsZXMuCgotIEZpeGVkIHNvbWUgNjQtYml0IGJ1Z3MgaW4gcGlja2xlLCBjUGlja2xlLCBhbmQgc3RydWN0LCBhbmQgYWRkZWQKICBiZXR0ZXIgdGVzdHMgZm9yIHBpY2tsaW5nLgoKLSB0aHJlYWRpbmc6IG1ha2UgQ29uZGl0aW9uLndhaXQoKSByb2J1c3QgYWdhaW5zdCBLZXlib2FyZEludGVycnVwdC4KCi0gemlwZmlsZTogYWRkIHN1cHBvcnQgdG8gemlwZmlsZSB0byBzdXBwb3J0IG9wZW5pbmcgYW4gYXJjaGl2ZQogIHJlcHJlc2VudGVkIGJ5IGFuIG9wZW4gZmlsZSByYXRoZXIgdGhhbiBhIGZpbGUgbmFtZS4gIEZpeCBidWcgd2hlcmUKICB0aGUgYXJjaGl2ZSB3YXMgbm90IHByb3Blcmx5IGNsb3NlZC4gIEZpeGVkIGEgYnVnIGluIHRoaXMgYnVnZml4CiAgd2hlcmUgZmx1c2goKSB3YXMgY2FsbGVkIGZvciBhIHJlYWQtb25seSBmaWxlLgoKLSBpbXB1dGlsOiBhZGRlZCBhbiB1bmluc3RhbGwoKSBtZXRob2QgdG8gdGhlIEltcG9ydE1hbmFnZXIuCgotIENhbnZhczogZml4ZWQgYnVncyBpbiBsb3dlcigpIGFuZCB0a3JhaXNlKCkgbWV0aG9kcy4KCi0gU29ja2V0U2VydmVyOiBBUEkgY2hhbmdlIChhZGRlZCBvdmVycmlkYWJsZSBjbG9zZV9yZXF1ZXN0KCkgbWV0aG9kKQogIHNvIHRoYXQgdGhlIFRDUCBzZXJ2ZXIgY2FuIGV4cGxpY2l0bHkgY2xvc2UgdGhlIHJlcXVlc3QuCgotIHBzdGF0czogRXJpYyBSYXltb25kIGFkZGVkIGEgc2ltcGxlIGludGVyYWN0aXZlIHN0YXRpc3RpY3MgYnJvd3NlciwKICBpbnZva2VkIHdoZW4gdGhlIG1vZHVsZSBpcyBydW4gYXMgYSBzY3JpcHQuCgotIGxvY2FsZTogZml4ZWQgYSBwcm9ibGVtIGluIGZvcm1hdCgpLgoKLSB3ZWJicm93c2VyOiBtYWRlIGl0IHdvcmsgd2hlbiB0aGUgQlJPV1NFUiBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYQogIHZhbHVlIGxpa2UgIi91c3IvYmluL25ldHNjYXBlIi4gIE1hZGUgaXQgYXV0by1kZXRlY3QgS29ucXVlcm9yIGZvcgogIEtERSAyLiAgRml4ZWQgc29tZSBvdGhlciBuaXRzLgoKLSB1bml0dGVzdDogY2hhbmdlcyB0byBhbGxvdyB1c2luZyBhIGRpZmZlcmVudCBleGNlcHRpb24gdGhhbgogIEFzc2VydGlvbkVycm9yLCBhbmQgYWRkZWQgYSBmZXcgbW9yZSBmdW5jdGlvbiBhbGlhc2VzLiAgU29tZSBvdGhlcgogIHNtYWxsIGNoYW5nZXMuCgotIHVybGxpYiwgdXJsbGliMjogZml4ZWQgcmVkaXJlY3QgcHJvYmxlbXMgYW5kIGEgY291cGxlb2Ygb3RoZXIgbml0cy4KCi0gYXN5bmNoYXQ6IGZpeGVkIGEgY3JpdGljYWwgYnVnIGluIGFzeW5jaGF0IHRoYXQgc2xpcHBlZCB0aHJvdWdoIHRoZQogIDIuMWIyIHJlbGVhc2UuICBGaXhlZCBhbm90aGVyIHJhcmUgYnVnLgoKLSBGaXggc29tZSB1bnF1YWxpZmllZCBleGNlcHQ6IGNsYXVzZXMgKGFsd2F5cyBhIGJhZCBjb2RlIGV4YW1wbGUpLgoKWE1MCgotIHB5ZXhwYXQ6IG5ldyBBUEkgZ2V0X3ZlcnNpb25fc3RyaW5nKCkuCgotIEZpeGVkIHNvbWUgbWluaWRvbSBidWdzLgoKRXh0ZW5zaW9ucwoKLSBGaXhlZCBhIGNvcmUgZHVtcCBpbiBfd2Vha3JlZi4gIFJlbW92ZWQgdGhlIHdlYWtyZWYubWFwcGluZygpCiAgZnVuY3Rpb24gKGl0IGFkZHMgbm90aGluZyB0byB0aGUgQVBJKS4KCi0gUmF0aW9uYWxpemVkIHRoZSB1c2Ugb2YgaGVhZGVyIGZpbGVzIGluIHRoZSByZWFkbGluZSBtb2R1bGUsIHRvIG1ha2UKICBpdCBjb21waWxlIChhbGJlaXQgd2l0aCBzb21lIHdhcm5pbmdzKSB3aXRoIHRoZSB2ZXJ5IHJlY2VudCByZWFkbGluZQogIDQuMiwgd2l0aG91dCBicmVha2luZyBmb3IgZWFybGllciB2ZXJzaW9ucy4KCi0gSG9wZWZ1bGx5IGZpeGVkIGEgYnVmZmVyaW5nIHByb2JsZW0gaW4gbGludXhhdWRpb2Rldi4KCi0gQXR0ZW1wdGVkIGEgZml4IHRvIG1ha2UgdGhlIE9wZW5TU0wgc3VwcG9ydCBpbiB0aGUgc29ja2V0IG1vZHVsZQogIHdvcmsgYWdhaW4gd2l0aCBwcmUtMC45LjUgdmVyc2lvbnMgb2YgT3BlblNTTC4KClRlc3RzCgotIEFkZGVkIGEgdGVzdCBjYXNlIGZvciBhc3luY2hhdCBhbmQgYXN5bmNvcmUuCgotIFJlbW92ZWQgY291cGxpbmcgYmV0d2VlbiB0ZXN0cyB3aGVyZSBvbmUgdGVzdCBmYWlsaW5nIGNvdWxkIGJyZWFrCiAgYW5vdGhlci4KClRvb2xzCgotIFBpbmcgYWRkZWQgYW4gaW50ZXJhY3RpdmUgaGVscCBicm93c2VyIHRvIHB5ZG9jLCBmaXhlZCBzb21lIG5pdHMKICBpbiB0aGUgcmVzdCBvZiB0aGUgcHlkb2MgY29kZSwgYW5kIGFkZGVkIHNvbWUgZmVhdHVyZXMgdG8gaGlzCiAgaW5zcGVjdCBtb2R1bGUuCgotIEFuIHVwZGF0ZWQgcHl0aG9uLW1vZGUuZWwgdmVyc2lvbiA0LjEgd2hpY2ggaW50ZWdyYXRlcyBLZW4KICBNYW5oZWltZXIncyBwZGJ0cmFjay5lbC4gIFRoaXMgbWFrZXMgZGVidWdnaW5nIFB5dGhvbiBjb2RlIHZpYSBwZGIKICBtdWNoIG5pY2VyIGluIFhFbWFjcyBhbmQgRW1hY3MuICBXaGVuIHN0ZXBwaW5nIHRocm91Z2ggeW91ciBwcm9ncmFtCiAgd2l0aCBwZGIsIGluIGVpdGhlciB0aGUgc2hlbGwgd2luZG93IG9yIHRoZSAqUHl0aG9uKiB3aW5kb3csIHRoZQogIHNvdXJjZSBmaWxlIGFuZCBsaW5lIHdpbGwgYmUgdHJhY2tlZCBieSBhbiBhcnJvdy4gIFZlcnkgY29vbCEKCi0gSURMRTogc3ludGF4IHdhcm5pbmdzIGluIGludGVyYWN0aXZlIG1vZGUgYXJlIGNoYW5nZWQgaW50byBlcnJvcnMuCgotIFNvbWUgaW1wcm92ZW1lbnRzIHRvIFRvb2xzL3dlYmNoZWNrZXIgKGlnbm9yZSBzb21lIG1vcmUgVVJMIHR5cGVzLAogIGZvbGxvdyBzb21lIG1vcmUgbGlua3MpLgoKLSBCcm91Z2h0IHRoZSBUb29scy9jb21waWxlciBwYWNrYWdlIHVwIHRvIGRhdGUuCgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4xIGJldGEgMj8KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCihVbmxpc3RlZCBhcmUgbWFueSBmaXhlZCBidWdzLCBtb3JlIGRvY3VtZW50YXRpb24sIGV0Yy4pCgpDb3JlIGxhbmd1YWdlLCBidWlsdGlucywgYW5kIGludGVycHJldGVyCgotIFRoZSBuZXN0ZWQgc2NvcGVzIHdvcmsgKGVuYWJsZWQgYnkgImZyb20gX19mdXR1cmVfXyBpbXBvcnQKICBuZXN0ZWRfc2NvcGVzIikgaXMgY29tcGxldGVkOyBpbiBwYXJ0aWN1bGFyLCB0aGUgZnV0dXJlIG5vdyBleHRlbmRzCiAgaW50byBjb2RlIGV4ZWN1dGVkIHRocm91Z2ggZXhlYywgZXZhbCgpIGFuZCBleGVjZmlsZSgpLCBhbmQgaW50byB0aGUKICBpbnRlcmFjdGl2ZSBpbnRlcnByZXRlci4KCi0gV2hlbiBjYWxsaW5nIGEgYmFzZSBjbGFzcyBtZXRob2QgKGUuZy4gQmFzZUNsYXNzLl9faW5pdF9fKHNlbGYpKSwKICB0aGlzIGlzIG5vdyBhbGxvd2VkIGV2ZW4gaWYgc2VsZiBpcyBub3Qgc3RyaWN0bHkgc3Bva2VuIGEgY2xhc3MKICBpbnN0YW5jZSAoZS5nLiB3aGVuIHVzaW5nIG1ldGFjbGFzc2VzIG9yIHRoZSBEb24gQmVhdWRyeSBob29rKS4KCi0gU2xpY2Ugb2JqZWN0cyBhcmUgbm93IGNvbXBhcmFibGUgYnV0IG5vdCBoYXNoYWJsZTsgdGhpcyBwcmV2ZW50cwogIGRpY3RbOl0gZnJvbSBiZWluZyBhY2NlcHRlZCBidXQgbWVhbmluZ2xlc3MuCgotIENvbXBsZXggZGl2aXNpb24gaXMgbm93IGNhbGN1bGF0ZWQgdXNpbmcgbGVzcyBicmFpbmRlYWQgYWxnb3JpdGhtcy4KICBUaGlzIGRvZXNuJ3QgY2hhbmdlIHNlbWFudGljcyBleGNlcHQgaXQncyBtb3JlIGxpa2VseSB0byBnaXZlIHVzZWZ1bAogIHJlc3VsdHMgaW4gZXh0cmVtZSBjYXNlcy4gIENvbXBsZXggcmVwcigpIG5vdyB1c2VzIGZ1bGwgcHJlY2lzaW9uCiAgbGlrZSBmbG9hdCByZXByKCkuCgotIHNnbWxsaWIucHkgbm93IGNhbGxzIGhhbmRsZV9kZWNsKCkgZm9yIHNpbXBsZSA8IS4uLj4gZGVjbGFyYXRpb25zLgoKLSBJdCBpcyBpbGxlZ2FsIHRvIGFzc2lnbiB0byB0aGUgbmFtZSBfX2RlYnVnX18sIHdoaWNoIGlzIHNldCB3aGVuIHRoZQogIGludGVycHJldGVyIHN0YXJ0cy4gIEl0IGlzIGVmZmVjdGl2ZWx5IGEgY29tcGlsZS10aW1lIGNvbnN0YW50LgoKLSBBIHdhcm5pbmcgd2lsbCBiZSBpc3N1ZWQgaWYgYSBnbG9iYWwgc3RhdGVtZW50IGZvciBhIHZhcmlhYmxlCiAgZm9sbG93cyBhIHVzZSBvciBhc3NpZ25tZW50IG9mIHRoYXQgdmFyaWFibGUuCgpTdGFuZGFyZCBsaWJyYXJ5CgotIHVuaXR0ZXN0LnB5LCBhIHVuaXQgdGVzdGluZyBmcmFtZXdvcmsgYnkgU3RldmUgUHVyY2VsbCAoUHlVTklULAogIGluc3BpcmVkIGJ5IEpVbml0KSwgaXMgbm93IHBhcnQgb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkuICBZb3Ugbm93CiAgaGF2ZSBhIGNob2ljZSBvZiB0d28gdGVzdGluZyBmcmFtZXdvcmtzOiB1bml0dGVzdCByZXF1aXJlcyB5b3UgdG8KICB3cml0ZSB0ZXN0Y2FzZXMgYXMgc2VwYXJhdGUgY29kZSwgZG9jdGVzdCBnYXRoZXJzIHRoZW0gZnJvbQogIGRvY3N0cmluZ3MuICBCb3RoIGFwcHJvYWNoZXMgaGF2ZSB0aGVpciBhZHZhbnRhZ2VzIGFuZAogIGRpc2FkdmFudGFnZXMuCgotIEEgbmV3IG1vZHVsZSBUaXggd2FzIGFkZGVkLCB3aGljaCB3cmFwcyB0aGUgVGl4IGV4dGVuc2lvbiBsaWJyYXJ5CiAgZm9yIFRrLiAgV2l0aCB0aGF0IG1vZHVsZSwgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBzdGF0aWNhbGx5IGxpbmsKICBUaXggd2l0aCBfdGtpbnRlciwgc2luY2UgVGl4IHdpbGwgYmUgbG9hZGVkIHdpdGggVGNsJ3MgInBhY2thZ2UKICByZXF1aXJlIiBjb21tYW5kLiAgU2VlIERlbW8vdGl4Ly4KCi0gdHpwYXJzZS5weSBpcyBub3cgb2Jzb2xldGUuCgotIEluIGd6aXAucHksIHRoZSBzZWVrKCkgYW5kIHRlbGwoKSBtZXRob2RzIGFyZSByZW1vdmVkIC0tIHRoZXkgd2VyZQogIG5vbi1mdW5jdGlvbmFsIGFueXdheSwgYW5kIGl0J3MgYmV0dGVyIGlmIGNhbGxlcnMgY2FuIHRlc3QgZm9yIHRoZWlyCiAgZXhpc3RlbmNlIHdpdGggaGFzYXR0cigpLgoKUHl0aG9uL0MgQVBJCgotIFB5RGljdF9OZXh0KCk6IGl0IGlzIG5vdyBzYWZlIHRvIGNhbGwgUHlEaWN0X1NldEl0ZW0oKSB3aXRoIGEga2V5CiAgdGhhdCdzIGFscmVhZHkgaW4gdGhlIGRpY3Rpb25hcnkgZHVyaW5nIGEgUHlEaWN0X05leHQoKSBpdGVyYXRpb24uCiAgVGhpcyB1c2VkIHRvIGZhaWwgb2NjYXNpb25hbGx5IHdoZW4gYSBkaWN0aW9uYXJ5IHJlc2l6ZSBvcGVyYXRpb24KICBjb3VsZCBiZSB0cmlnZ2VyZWQgdGhhdCB3b3VsZCByZWhhc2ggYWxsIHRoZSBrZXlzLiAgQWxsIG90aGVyCiAgbW9kaWZpY2F0aW9ucyB0byB0aGUgZGljdGlvbmFyeSBhcmUgc3RpbGwgb2ZmLWxpbWl0cyBkdXJpbmcgYQogIFB5RGljdF9OZXh0KCkgaXRlcmF0aW9uIQoKLSBOZXcgZXh0ZW5kZWQgQVBJcyByZWxhdGVkIHRvIHBhc3NpbmcgY29tcGlsZXIgdmFyaWFibGVzIGFyb3VuZC4KCi0gTmV3IGFic3RyYWN0IEFQSXMgUHlPYmplY3RfSXNJbnN0YW5jZSgpLCBQeU9iamVjdF9Jc1N1YmNsYXNzKCkKICBpbXBsZW1lbnQgaXNpbnN0YW5jZSgpIGFuZCBpc3N1YmNsYXNzKCkuCgotIFB5X0J1aWxkVmFsdWUoKSBub3cgaGFzIGEgIkQiIGNvbnZlcnNpb24gdG8gY3JlYXRlIGEgUHl0aG9uIGNvbXBsZXgKICBudW1iZXIgZnJvbSBhIFB5X2NvbXBsZXggQyB2YWx1ZS4KCi0gRXh0ZW5zaW9ucyB0eXBlcyB3aGljaCBzdXBwb3J0IHdlYWsgcmVmZXJlbmNlcyBtdXN0IG5vdyBzZXQgdGhlCiAgZmllbGQgYWxsb2NhdGVkIGZvciB0aGUgd2VhayByZWZlcmVuY2UgbWFjaGluZXJ5IHRvIE5VTEwgdGhlbXNlbHZlczsKICB0aGlzIGlzIGRvbmUgdG8gYXZvaWQgdGhlIGNvc3Qgb2YgY2hlY2tpbmcgZWFjaCBvYmplY3QgZm9yIGhhdmluZyBhCiAgd2Vha2x5IHJlZmVyZW5jYWJsZSB0eXBlIGluIFB5T2JqZWN0X0lOSVQoKSwgc2luY2UgbW9zdCB0eXBlcyBhcmUKICBub3Qgd2Vha2x5IHJlZmVyZW5jYWJsZS4KCi0gUHlGcmFtZV9GYXN0VG9Mb2NhbHMoKSBhbmQgUHlGcmFtZV9Mb2NhbHNUb0Zhc3QoKSBjb3B5IGJpbmRpbmdzIGZvcgogIGZyZWUgdmFyaWFibGVzIGFuZCBjZWxsIHZhcmlhYmxlcyB0byBhbmQgZnJvbSB0aGUgZnJhbWUncyBmX2xvY2Fscy4KCi0gVmFyaWFudHMgb2Ygc2V2ZXJhbCBmdW5jdGlvbnMgZGVmaW5lZCBpbiBweXRob25ydW4uaCBoYXZlIGJlZW4gYWRkZWQKICB0byBzdXBwb3J0IHRoZSBuZXN0ZWRfc2NvcGVzIGZ1dHVyZSBzdGF0ZW1lbnQuICBUaGUgdmFyaWFudHMgYWxsIGVuZAogIGluIEZsYWdzIGFuZCB0YWtlIGFuIGV4dHJhIGFyZ3VtZW50LCBhIFB5Q29tcGlsZXJGbGFncyAqOyBleGFtcGxlczoKICBQeVJ1bl9BbnlGaWxlRXhGbGFncygpLCBQeVJ1bl9JbnRlcmFjdGl2ZUxvb3BGbGFncygpLiAgVGhlc2UKICB2YXJpYW50cyBtYXkgYmUgcmVtb3ZlZCBpbiBQeXRob24gMi4yLCB3aGVuIG5lc3RlZCBzY29wZXMgYXJlCiAgbWFuZGF0b3J5LgoKRGlzdHV0aWxzCgotIHRoZSBzZGlzdCBjb21tYW5kIG5vdyB3cml0ZXMgYSBQS0ctSU5GTyBmaWxlLCBhcyBkZXNjcmliZWQgaW4gUEVQIDI0MSwKICBpbnRvIHRoZSByZWxlYXNlIHRyZWUuCgotIHNldmVyYWwgZW5oYW5jZW1lbnRzIHRvIHRoZSBiZGlzdF93aW5pbnN0IGNvbW1hbmQgZnJvbSBUaG9tYXMgSGVsbGVyCiAgKGFuIHVuaW5zdGFsbGVyLCBtb3JlIGN1c3RvbWl6YXRpb24gb2YgdGhlIGluc3RhbGxlcidzIGRpc3BsYXkpCgotIGZyb20gSmFjayBKYW5zZW46IGFkZGVkIE1hYy1zcGVjaWZpYyBjb2RlIHRvIGdlbmVyYXRlIGEgZGlhbG9nIGZvcgogIHVzZXJzIHRvIHNwZWNpZnkgdGhlIGNvbW1hbmQtbGluZSAoYmVjYXVzZSBwcm92aWRpbmcgYSBjb21tYW5kLWxpbmUgd2l0aAogIE1hY1B5dGhvbiBpcyBhd2t3YXJkKS4gIEphY2sgYWxzbyBtYWRlIHZhcmlvdXMgZml4ZXMgZm9yIHRoZSBNYWMKICBhbmQgdGhlIE1ldHJvd2Vya3MgY29tcGlsZXIuCgotIGFkZGVkICdwbGF0Zm9ybXMnIGFuZCAna2V5d29yZHMnIHRvIHRoZSBzZXQgb2YgbWV0YWRhdGEgdGhhdCBjYW4gYmUKICBzcGVjaWZpZWQgZm9yIGEgZGlzdHJpYnV0aW9uLgoKLSBhcHBsaWVkIHBhdGNoZXMgZnJvbSBKYXNvbiBUaXNobGVyIHRvIG1ha2UgdGhlIGNvbXBpbGVyIGNsYXNzIHdvcmsgd2l0aAogIEN5Z3dpbi4KCgpXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjEgYmV0YSAxPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQ29yZSBsYW5ndWFnZSwgYnVpbHRpbnMsIGFuZCBpbnRlcnByZXRlcgoKLSBGb2xsb3dpbmcgYW4gb3V0Y3J5IGZyb20gdGhlIGNvbW11bml0eSBhYm91dCB0aGUgYW1vdW50IG9mIGNvZGUKICBicm9rZW4gYnkgdGhlIG5lc3RlZCBzY29wZXMgZmVhdHVyZSBpbnRyb2R1Y2VkIGluIDIuMWEyLCB3ZSBkZWNpZGVkCiAgdG8gbWFrZSB0aGlzIGZlYXR1cmUgb3B0aW9uYWwsIGFuZCB0byB3YWl0IHVudGlsIFB5dGhvbiAyLjIgKG9yIGF0CiAgbGVhc3QgNiBtb250aHMpIHRvIG1ha2UgaXQgc3RhbmRhcmQuICBUaGUgb3B0aW9uIGNhbiBiZSBlbmFibGVkIG9uIGEKICBwZXItbW9kdWxlIGJhc2lzIGJ5IGFkZGluZyAiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBuZXN0ZWRfc2NvcGVzIiBhdAogIHRoZSBiZWdpbm5pbmcgb2YgYSBtb2R1bGUgKGJlZm9yZSBhbnkgb3RoZXIgc3RhdGVtZW50cywgYnV0IGFmdGVyCiAgY29tbWVudHMgYW5kIGFuIG9wdGlvbmFsIGRvY3N0cmluZykuICBTZWUgUEVQIDIzNiAoQmFjayB0byB0aGUKICBfX2Z1dHVyZV9fKSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgX19mdXR1cmVfXyBzdGF0ZW1lbnQuICBQRVAgMjI3CiAgKFN0YXRpY2FsbHkgTmVzdGVkIFNjb3BlcykgaGFzIGJlZW4gdXBkYXRlZCB0byByZWZsZWN0IHRoaXMgY2hhbmdlLAogIGFuZCB0byBjbGFyaWZ5IHRoZSBzZW1hbnRpY3MgaW4gYSBudW1iZXIgb2YgZW5kY2FzZXMuCgotIFRoZSBuZXN0ZWQgc2NvcGVzIGNvZGUsIHdoZW4gZW5hYmxlZCwgaGFzIGJlZW4gaGFyZGVuZWQsIGFuZCBtb3N0CiAgYnVncyBhbmQgbWVtb3J5IGxlYWtzIGluIGl0IGhhdmUgYmVlbiBmaXhlZC4KCi0gQ29tcGlsZS10aW1lIHdhcm5pbmdzIGFyZSBub3cgZ2VuZXJhdGVkIGZvciBhIG51bWJlciBvZiBjb25kaXRpb25zCiAgdGhhdCB3aWxsIGJyZWFrIG9yIGNoYW5nZSBpbiBtZWFuaW5nIHdoZW4gbmVzdGVkIHNjb3BlcyBhcmUgZW5hYmxlZDoKCiAgLSBVc2luZyAiZnJvbS4uLmltcG9ydCAqIiBvciAiZXhlYyIgd2l0aG91dCBpbi1jbGF1c2UgaW4gYSBmdW5jdGlvbgogICAgc2NvcGUgdGhhdCBhbHNvIGRlZmluZXMgYSBsYW1iZGEgb3IgbmVzdGVkIGZ1bmN0aW9uIHdpdGggb25lIG9yCiAgICBtb3JlIGZyZWUgKG5vbi1sb2NhbCkgdmFyaWFibGVzLiAgVGhlIHByZXNlbmNlIG9mIHRoZSBpbXBvcnQqIG9yCiAgICBiYXJlIGV4ZWMgbWFrZXMgaXQgaW1wb3NzaWJsZSBmb3IgdGhlIGNvbXBpbGVyIHRvIGRldGVybWluZSB0aGUKICAgIGV4YWN0IHNldCBvZiBsb2NhbCB2YXJpYWJsZXMgaW4gdGhlIG91dGVyIHNjb3BlLCB3aGljaCBtYWtlcyBpdAogICAgaW1wb3NzaWJsZSB0byBkZXRlcm1pbmUgdGhlIGJpbmRpbmdzIGZvciBmcmVlIHZhcmlhYmxlcyBpbiB0aGUKICAgIGlubmVyIHNjb3BlLiAgVG8gYXZvaWQgdGhlIHdhcm5pbmcgYWJvdXQgaW1wb3J0ICosIGNoYW5nZSBpdCBpbnRvCiAgICBhbiBpbXBvcnQgb2YgZXhwbGljaXRseSBuYW1lIG9iamVjdCwgb3IgbW92ZSB0aGUgaW1wb3J0KiBzdGF0ZW1lbnQKICAgIHRvIHRoZSBnbG9iYWwgc2NvcGU7IHRvIGF2b2lkIHRoZSB3YXJuaW5nIGFib3V0IGJhcmUgZXhlYywgdXNlCiAgICBleGVjLi4uaW4uLi4gKGEgZ29vZCBpZGVhIGFueXdheSAtLSB0aGVyZSdzIGEgcG9zc2liaWxpdHkgdGhhdAogICAgYmFyZSBleGVjIHdpbGwgYmUgZGVwcmVjYXRlZCBpbiB0aGUgZnV0dXJlKS4KCiAgLSBVc2Ugb2YgYSBnbG9iYWwgdmFyaWFibGUgaW4gYSBuZXN0ZWQgc2NvcGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGEKICAgIGxvY2FsIHZhcmlhYmxlIGluIGEgc3Vycm91bmRpbmcgc2NvcGUuICBUaGlzIHdpbGwgY2hhbmdlIGluCiAgICBtZWFuaW5nIHdpdGggbmVzdGVkIHNjb3BlczogdGhlIG5hbWUgaW4gdGhlIGlubmVyIHNjb3BlIHdpbGwKICAgIHJlZmVyZW5jZSB0aGUgdmFyaWFibGUgaW4gdGhlIG91dGVyIHNjb3BlIHJhdGhlciB0aGFuIHRoZSBnbG9iYWwKICAgIG9mIHRoZSBzYW1lIG5hbWUuICBUbyBhdm9pZCB0aGUgd2FybmluZywgZWl0aGVyIHJlbmFtZSB0aGUgb3V0ZXIKICAgIHZhcmlhYmxlLCBvciB1c2UgYSBnbG9iYWwgc3RhdGVtZW50IGluIHRoZSBpbm5lciBmdW5jdGlvbi4KCi0gQW4gb3B0aW9uYWwgb2JqZWN0IGFsbG9jYXRvciBoYXMgYmVlbiBpbmNsdWRlZC4gIFRoaXMgYWxsb2NhdG9yIGlzCiAgb3B0aW1pemVkIGZvciBQeXRob24gb2JqZWN0cyBhbmQgc2hvdWxkIGJlIGZhc3RlciBhbmQgdXNlIGxlc3MgbWVtb3J5CiAgdGhhbiB0aGUgc3RhbmRhcmQgc3lzdGVtIGFsbG9jYXRvci4gIEl0IGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQKICBiZWNhdXNlIG9mIHBvc3NpYmxlIHRocmVhZCBzYWZldHkgcHJvYmxlbXMuICBUaGUgYWxsb2NhdG9yIGlzIG9ubHkKICBwcm90ZWN0ZWQgYnkgdGhlIFB5dGhvbiBpbnRlcnByZXRlciBsb2NrIGFuZCBpdCBpcyBwb3NzaWJsZSB0aGF0IHNvbWUKICBleHRlbnNpb24gbW9kdWxlcyByZXF1aXJlIGEgdGhyZWFkIHNhZmUgYWxsb2NhdG9yLiAgVGhlIG9iamVjdAogIGFsbG9jYXRvciBjYW4gYmUgZW5hYmxlZCBieSBwcm92aWRpbmcgdGhlICItLXdpdGgtcHltYWxsb2MiIG9wdGlvbiB0bwogIGNvbmZpZ3VyZS4KClN0YW5kYXJkIGxpYnJhcnkKCi0gcHlleHBhdCBub3cgZGV0ZWN0cyB0aGUgZXhwYXQgdmVyc2lvbiBpZiBleHBhdC5oIGRlZmluZXMgaXQuIEEKICBudW1iZXIgb2YgYWRkaXRpb25hbCBoYW5kbGVycyBhcmUgcHJvdmlkZWQsIHdoaWNoIGFyZSBvbmx5IGF2YWlsYWJsZQogIHNpbmNlIGV4cGF0IDEuOTUuIEluIGFkZGl0aW9uLCB0aGUgbWV0aG9kcyBTZXRQYXJhbUVudGl0eVBhcnNpbmcgYW5kCiAgR2V0SW5wdXRDb250ZXh0IG9mIFBhcnNlciBvYmplY3RzIGFyZSBhdmFpbGFibGUgd2l0aCAxLjk1LngKICBvbmx5LiBQYXJzZXIgb2JqZWN0cyBub3cgcHJvdmlkZSB0aGUgb3JkZXJlZF9hdHRyaWJ1dGVzIGFuZAogIHNwZWNpZmllZF9hdHRyaWJ1dGVzIGF0dHJpYnV0ZXMuIEEgbmV3IG1vZHVsZSBleHBhdC5tb2RlbCB3YXMgYWRkZWQsCiAgd2hpY2ggb2ZmZXJzIGEgbnVtYmVyIG9mIGFkZGl0aW9uYWwgY29uc3RhbnRzIGlmIDEuOTUueCBpcyB1c2VkLgoKLSB4bWwuZG9tIG9mZmVycyB0aGUgbmV3IGZ1bmN0aW9ucyByZWdpc3RlckRPTUltcGxlbWVudGF0aW9uIGFuZAogIGdldERPTUltcGxlbWVudGF0aW9uLgoKLSB4bWwuZG9tLm1pbmlkb20gb2ZmZXJzIGEgdG9wcmV0dHl4bWwgbWV0aG9kLiBBIG51bWJlciBvZiBET00KICBjb25mb3JtYW5jZSBpc3N1ZXMgaGF2ZSBiZWVuIHJlc29sdmVkLiBJbiBwYXJ0aWN1bGFyLCBFbGVtZW50IG5vdwogIGhhcyBhbiBoYXNBdHRyaWJ1dGVzIG1ldGhvZCwgYW5kIHRoZSBoYW5kbGluZyBvZiBuYW1lc3BhY2VzIHdhcwogIGltcHJvdmVkLgoKLSBLYS1QaW5nIFllZSBjb250cmlidXRlZCB0d28gbmV3IG1vZHVsZXM6IGluc3BlY3QucHksIGEgbW9kdWxlIGZvcgogIGdldHRpbmcgaW5mb3JtYXRpb24gYWJvdXQgbGl2ZSBQeXRob24gY29kZSwgYW5kIHB5ZG9jLnB5LCBhIG1vZHVsZQogIGZvciBpbnRlcmFjdGl2ZWx5IGNvbnZlcnRpbmcgZG9jc3RyaW5ncyB0byBIVE1MIG9yIHRleHQuCiAgVG9vbHMvc2NyaXB0cy9weWRvYywgd2hpY2ggaXMgbm93IGF1dG9tYXRpY2FsbHkgaW5zdGFsbGVkIGludG8KICA8cHJlZml4Pi9iaW4sIHVzZXMgcHlkb2MucHkgdG8gZGlzcGxheSBkb2N1bWVudGF0aW9uOyB0cnkgcnVubmluZwogICJweWRvYyAtaCIgZm9yIGluc3RydWN0aW9ucy4gICJweWRvYyAtZyIgcG9wcyB1cCBhIHNtYWxsIEdVSSB0aGF0CiAgbGV0cyB5b3UgYnJvd3NlIHRoZSBtb2R1bGUgZG9jc3RyaW5ncyB1c2luZyBhIHdlYiBicm93c2VyLgoKLSBOZXcgbGlicmFyeSBtb2R1bGUgZGlmZmxpYi5weSwgcHJpbWFyaWx5IHBhY2thZ2luZyB0aGUgU2VxdWVuY2VNYXRjaGVyCiAgY2xhc3MgYXQgdGhlIGhlYXJ0IG9mIHRoZSBwb3B1bGFyIG5kaWZmLnB5IGZpbGUtY29tcGFyaXNvbiB0b29sLgoKLSBkb2N0ZXN0LnB5IChhIGZyYW1ld29yayBmb3IgdmVyaWZ5aW5nIFB5dGhvbiBjb2RlIGV4YW1wbGVzIGluIGRvY3N0cmluZ3MpCiAgaXMgbm93IHBhcnQgb2YgdGhlIHN0ZCBsaWJyYXJ5LgoKV2luZG93cyBjaGFuZ2VzCgotIEEgbmV3IGVudHJ5IGluIHRoZSBTdGFydCBtZW51LCAiTW9kdWxlIERvY3MiLCBydW5zICJweWRvYyAtZyIgLS0gYQogIHNtYWxsIEdVSSB0aGF0IGxldHMgeW91IGJyb3dzZSB0aGUgbW9kdWxlIGRvY3N0cmluZ3MgdXNpbmcgeW91cgogIGRlZmF1bHQgd2ViIGJyb3dzZXIuCgotIEltcG9ydCBpcyBub3cgY2FzZS1zZW5zaXRpdmUuICBQRVAgMjM1IChJbXBvcnQgb24gQ2FzZS1JbnNlbnNpdGl2ZQogIFBsYXRmb3JtcykgaXMgaW1wbGVtZW50ZWQuICBTZWUKCiAgICAgIGh0dHA6Ly9weXRob24uc291cmNlZm9yZ2UubmV0L3BlcHMvcGVwLTAyMzUuaHRtbAoKICBmb3IgZnVsbCBkZXRhaWxzLCBlc3BlY2lhbGx5IHRoZSAiQ3VycmVudCBMb3dlci1MZWZ0IFNlbWFudGljcyIgc2VjdGlvbi4KICBUaGUgbmV3IFdpbmRvd3MgaW1wb3J0IHJ1bGVzIGFyZSBzaW1wbGVyIHRoYW4gYmVmb3JlOgoKICBBLiBJZiB0aGUgUFlUSE9OQ0FTRU9LIGVudmlyb25tZW50IHZhcmlhYmxlIGV4aXN0cywgc2FtZSBhcwogICAgIGJlZm9yZTogIHNpbGVudGx5IGFjY2VwdCB0aGUgZmlyc3QgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCBvZiBhbnkKICAgICBraW5kOyByYWlzZSBJbXBvcnRFcnJvciBpZiBub25lIGZvdW5kLgoKICBCLiBFbHNlIHNlYXJjaCBzeXMucGF0aCBmb3IgdGhlIGZpcnN0IGNhc2Utc2Vuc2l0aXZlIG1hdGNoOyByYWlzZQogICAgIEltcG9ydEVycm9yIGlmIG5vbmUgZm91bmQuCgogIFRoZSBzYW1lIHJ1bGVzIGhhdmUgYmVlbiBpbXBsZW50ZWQgb24gb3RoZXIgcGxhdGZvcm1zIHdpdGggY2FzZS0KICBpbnNlbnNpdGl2ZSBidXQgY2FzZS1wcmVzZXJ2aW5nIGZpbGVzeXN0ZW1zIHRvbyAoaW5jbHVkaW5nIEN5Z3dpbiwgYW5kCiAgc2V2ZXJhbCBmbGF2b3JzIG9mIE1hY2ludG9zaCBvcGVyYXRpbmcgc3lzdGVtcykuCgotIHdpbnNvdW5kIG1vZHVsZTogIFVuZGVyIFdpbjl4LCB3aW5zb3VuZC5CZWVwKCkgbm93IGF0dGVtcHRzIHRvIHNpbXVsYXRlCiAgd2hhdCBpdCdzIHN1cHBvc2VkIHRvIGRvIChhbmQgZG9lcyBkbyB1bmRlciBOVCBhbmQgMjAwMCkgdmlhIGRpcmVjdAogIHBvcnQgbWFuaXB1bGF0aW9uLiAgSXQncyB1bmtub3duIHdoZXRoZXIgdGhpcyB3aWxsIHdvcmsgb24gYWxsIHN5c3RlbXMsCiAgYnV0IGl0IGRvZXMgd29yayBvbiBteSBXaW45OFNFIHN5c3RlbXMgbm93IGFuZCB3YXMga25vd24gdG8gYmUgdXNlbGVzcyBvbgogIGFsbCBXaW45eCBzeXN0ZW1zIGJlZm9yZS4KCi0gQnVpbGQ6ICBTdWJwcm9qZWN0IF90ZXN0IChlZmZlY3RpdmVseSkgcmVuYW1lZCB0byBfdGVzdGNhcGkuCgpOZXcgcGxhdGZvcm1zCgotIDIuMSBzaG91bGQgY29tcGlsZSBhbmQgcnVuIG91dCBvZiB0aGUgYm94IHVuZGVyIE1hY09TIFgsIGV2ZW4gdXNpbmcgSEZTKy4KICBUaGFua3MgdG8gU3RldmVuIE1hamV3c2tpIQoKLSAyLjEgc2hvdWxkIGNvbXBpbGUgYW5kIHJ1biBvdXQgb2YgdGhlIGJveCBvbiBDeWd3aW4uICBUaGFua3MgdG8gSmFzb24KICBUaXNobGVyIQoKLSAyLjEgY29udGFpbnMgbmV3IGZpbGVzIGFuZCBwYXRjaGVzIGZvciBSSVNDT1MsIHRoYW5rcyB0byBEaWV0bWFyCiAgU2Nod2VydGJlcmdlciEgIFNlZSBSSVNDT1MvUkVBRE1FIGZvciBtb3JlIGluZm9ybWF0aW9uIC0tIGl0IHNlZW1zCiAgdGhhdCBiZWNhdXNlIG9mIHRoZSBiaXphcnJlIGZpbGVuYW1lIGNvbnZlbnRpb25zIG9uIFJJU0NPUywgbm8gcG9ydAogIHRvIHRoYXQgcGxhdGZvcm0gaXMgZWFzeS4gIE5vdGUgdGhhdCB0aGUgbmV3IHZhcmlhYmxlIG9zLmVuZHNlcCBpcwogIHNpbGVudGx5IHN1cHBvcnRlZCBpbiBvcmRlciB0byBtYWtlIGxpZmUgZWFzaWVyIG9uIHRoaXMgcGxhdGZvcm0sCiAgYnV0IHdlIGRvbid0IGFkdmVydGlzZSBpdCBiZWNhdXNlIGl0J3Mgbm90IHdvcnRoIGZvciBtb3N0IGZvbGtzIHRvCiAgY2FyZSBhYm91dCBSSVNDT1MgcG9ydGFiaWxpdHkuCgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4xIGFscGhhIDI/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQ29yZSBsYW5ndWFnZSwgYnVpbHRpbnMsIGFuZCBpbnRlcnByZXRlcgoKLSBTY29wZXMgbmVzdC4gIElmIGEgbmFtZSBpcyB1c2VkIGluIGEgZnVuY3Rpb24gb3IgY2xhc3MsIGJ1dCBpcyBub3QKICBsb2NhbCwgdGhlIGRlZmluaXRpb24gaW4gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGZ1bmN0aW9uIHNjb3BlIHdpbGwKICBiZSB1c2VkLiAgT25lIGNvbnNlcXVlbmNlIG9mIHRoaXMgY2hhbmdlIGlzIHRoYXQgbGFtYmRhIHN0YXRlbWVudHMKICBjb3VsZCByZWZlcmVuY2UgdmFyaWFibGVzIGluIHRoZSBuYW1lc3BhY2VzIHdoZXJlIHRoZSBsYW1iZGEgaXMKICBkZWZpbmVkLiAgSW4gc29tZSB1bnVzdWFsIGNhc2VzLCB0aGlzIGNoYW5nZSB3aWxsIGJyZWFrIGNvZGUuCgogIEluIGFsbCBwcmV2aW91cyB2ZXJzaW9uIG9mIFB5dGhvbiwgbmFtZXMgd2VyZSByZXNvbHZlZCBpbiBleGFjdGx5CiAgdGhyZWUgbmFtZXNwYWNlcyAtLSB0aGUgbG9jYWwgbmFtZXNwYWNlLCB0aGUgZ2xvYmFsIG5hbWVzcGFjZSwgYW5kCiAgdGhlIGJ1aWx0aW4gbmFtZXNwYWNlLiAgQWNjb3JkaW5nIHRvIHRoaXMgb2xkIGRlZmluaXRpb24sIGlmIGEKICBmdW5jdGlvbiBBIGlzIGRlZmluZWQgd2l0aGluIGEgZnVuY3Rpb24gQiwgdGhlIG5hbWVzIGJvdW5kIGluIEIgYXJlCiAgbm90IHZpc2libGUgaW4gQS4gIFRoZSBuZXcgcnVsZXMgbWFrZSBuYW1lcyBib3VuZCBpbiBCIHZpc2libGUgaW4gQSwKICB1bmxlc3MgQSBjb250YWlucyBhIG5hbWUgYmluZGluZyB0aGF0IGhpZGVzIHRoZSBiaW5kaW5nIGluIEIuCgogIFNlY3Rpb24gNC4xIG9mIHRoZSByZWZlcmVuY2UgbWFudWFsIGRlc2NyaWJlcyB0aGUgbmV3IHNjb3BpbmcgcnVsZXMKICBpbiBkZXRhaWwuICBUaGUgdGVzdCBzY3JpcHQgaW4gTGliL3Rlc3QvdGVzdF9zY29wZS5weSBkZW1vbnN0cmF0ZXMKICBzb21lIG9mIHRoZSBlZmZlY3RzIG9mIHRoZSBjaGFuZ2UuCgogIFRoZSBuZXcgcnVsZXMgd2lsbCBjYXVzZSBleGlzdGluZyBjb2RlIHRvIGJyZWFrIGlmIGl0IGRlZmluZXMgbmVzdGVkCiAgZnVuY3Rpb25zIHdoZXJlIGFuIG91dGVyIGZ1bmN0aW9uIGhhcyBsb2NhbCB2YXJpYWJsZXMgd2l0aCB0aGUgc2FtZQogIG5hbWUgYXMgZ2xvYmFscyBvciBidWlsdGlucyB1c2VkIGJ5IHRoZSBpbm5lciBmdW5jdGlvbi4gIEV4YW1wbGU6CgogICAgZGVmIG11bmdlKHN0cik6CiAgICAgICAgZGVmIGhlbHBlcih4KToKICAgICAgICAgICAgcmV0dXJuIHN0cih4KQogICAgICAgIGlmIHR5cGUoc3RyKSAhPSB0eXBlKCcnKToKICAgICAgICAgICAgc3RyID0gaGVscGVyKHN0cikKICAgICAgICByZXR1cm4gc3RyLnN0cmlwKCkKCiAgVW5kZXIgdGhlIG9sZCBydWxlcywgdGhlIG5hbWUgc3RyIGluIGhlbHBlcigpIGlzIGJvdW5kIHRvIHRoZQogIGJ1aWx0aW4gZnVuY3Rpb24gc3RyKCkuICBVbmRlciB0aGUgbmV3IHJ1bGVzLCBpdCB3aWxsIGJlIGJvdW5kIHRvCiAgdGhlIGFyZ3VtZW50IG5hbWVkIHN0ciBhbmQgYW4gZXJyb3Igd2lsbCBvY2N1ciB3aGVuIGhlbHBlcigpIGlzCiAgY2FsbGVkLgoKLSBUaGUgY29tcGlsZXIgd2lsbCByZXBvcnQgYSBTeW50YXhFcnJvciBpZiAiZnJvbSAuLi4gaW1wb3J0ICoiIG9jY3VycwogIGluIGEgZnVuY3Rpb24gb3IgY2xhc3Mgc2NvcGUuICBUaGUgbGFuZ3VhZ2UgcmVmZXJlbmNlIGhhcyBkb2N1bWVudGVkCiAgdGhhdCB0aGlzIGNhc2UgaXMgaWxsZWdhbCwgYnV0IHRoZSBjb21waWxlciBuZXZlciBjaGVja2VkIGZvciBpdC4KICBUaGUgcmVjZW50IGludHJvZHVjdGlvbiBvZiBuZXN0ZWQgc2NvcGUgbWFrZXMgdGhlIG1lYW5pbmcgb2YgdGhpcwogIGZvcm0gb2YgbmFtZSBiaW5kaW5nIGFtYmlndW91cy4gIEluIGEgZnV0dXJlIHJlbGVhc2UsIHRoZSBjb21waWxlcgogIG1heSBhbGxvdyB0aGlzIGZvcm0gd2hlbiB0aGVyZSBpcyBubyBwb3NzaWJpbGl0eSBvZiBhbWJpZ3VpdHkuCgotIHJlcHIoc3RyaW5nKSBpcyBlYXNpZXIgdG8gcmVhZCwgbm93IHVzaW5nIGhleCBlc2NhcGVzIGluc3RlYWQgb2Ygb2N0YWwsCiAgYW5kIHVzaW5nIFx0LCBcbiBhbmQgXHIgaW5zdGVhZCBvZiBcMDExLCBcMDEyIGFuZCBcMDE1IChyZXNwZWN0aXZlbHkpOgoKICA+Pj4gIlx0ZXhhbXBsZSBcclxuIiArIGNocigwKSArIGNocigyNTUpCiAgJ1x0ZXhhbXBsZSBcclxuXHgwMFx4ZmYnICAgICAgICAgIyBpbiAyLjEKICAnXDAxMWV4YW1wbGUgXDAxNVwwMTJcMDAwXDM3NycgICAjIGluIDIuMAoKLSBGdW5jdGlvbnMgYXJlIG5vdyBjb21wYXJlZCBhbmQgaGFzaGVkIGJ5IGlkZW50aXR5LCBub3QgYnkgdmFsdWUsIHNpbmNlCiAgdGhlIGZ1bmNfY29kZSBhdHRyaWJ1dGUgaXMgd3JpdGFibGUuCgotIFdlYWsgcmVmZXJlbmNlcyAoUEVQIDIwNSkgaGF2ZSBiZWVuIGFkZGVkLiAgVGhpcyBpbnZvbHZlcyBhIGZldwogIGNoYW5nZXMgaW4gdGhlIGNvcmUsIGFuIGV4dGVuc2lvbiBtb2R1bGUgKF93ZWFrcmVmKSwgYW5kIGEgUHl0aG9uCiAgbW9kdWxlICh3ZWFrcmVmKS4gIFRoZSB3ZWFrcmVmIG1vZHVsZSBpcyB0aGUgcHVibGljIGludGVyZmFjZS4gIEl0CiAgaW5jbHVkZXMgc3VwcG9ydCBmb3IgImV4cGxpY2l0IiB3ZWFrIHJlZmVyZW5jZXMsIHByb3h5IG9iamVjdHMsIGFuZAogIG1hcHBpbmdzIHdpdGggd2Vha2x5IGhlbGQgdmFsdWVzLgoKLSBBICdjb250aW51ZScgc3RhdGVtZW50IGNhbiBub3cgYXBwZWFyIGluIGEgdHJ5IGJsb2NrIHdpdGhpbiB0aGUgYm9keQogIG9mIGEgbG9vcC4gIEl0IGlzIHN0aWxsIG5vdCBwb3NzaWJsZSB0byB1c2UgY29udGludWUgaW4gYSBmaW5hbGx5CiAgY2xhdXNlLgoKU3RhbmRhcmQgbGlicmFyeQoKLSBtYWlsYm94LnB5IG5vdyBoYXMgYSBuZXcgY2xhc3MsIFBvcnRhYmxlVW5peE1haWxib3ggd2hpY2ggaXMKICBpZGVudGljYWwgdG8gVW5peE1haWxib3ggYnV0IHVzZXMgYSBtb3JlIHBvcnRhYmxlIHNjaGVtZSBmb3IKICBkZXRlcm1pbmluZyBGcm9tXyBzZXBhcmF0b3JzLiAgQWxzbywgdGhlIGNvbnN0cnVjdG9ycyBmb3IgYWxsIHRoZQogIGNsYXNzZXMgaW4gdGhpcyBtb2R1bGUgaGF2ZSBhIG5ldyBvcHRpb25hbCBgZmFjdG9yeScgYXJndW1lbnQsIHdoaWNoCiAgaXMgYSBjYWxsYWJsZSB1c2VkIHdoZW4gbmV3IG1lc3NhZ2UgY2xhc3NlcyBtdXN0IGJlIGluc3RhbnRpYXRlZCBieQogIHRoZSBuZXh0KCkgbWV0aG9kLgoKLSByYW5kb20ucHkgaXMgbm93IHNlbGYtY29udGFpbmVkLCBhbmQgb2ZmZXJzIGFsbCB0aGUgZnVuY3Rpb25hbGl0eSBvZgogIHRoZSBub3ctZGVwcmVjYXRlZCB3aHJhbmRvbS5weS4gIFNlZSB0aGUgZG9jcyBmb3IgZGV0YWlscy4gIHJhbmRvbS5weQogIGFsc28gc3VwcG9ydHMgbmV3IGZ1bmN0aW9ucyBnZXRzdGF0ZSgpIGFuZCBzZXRzdGF0ZSgpLCBmb3Igc2F2aW5nCiAgYW5kIHJlc3RvcmluZyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGdlbmVyYXRvcjsgYW5kIGp1bXBhaGVhZChuKSwKICBmb3IgcXVpY2tseSBmb3JjaW5nIHRoZSBpbnRlcm5hbCBzdGF0ZSB0byBiZSB0aGUgc2FtZSBhcyBpZiBuIGNhbGxzIHRvCiAgcmFuZG9tKCkgaGFkIGJlZW4gbWFkZS4gIFRoZSBsYXR0ZXIgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgbXVsdGktCiAgdGhyZWFkZWQgcHJvZ3JhbXMsIGNyZWF0aW5nIG9uZSBpbnN0YW5jZSBvZiB0aGUgcmFuZG9tLlJhbmRvbSgpIGNsYXNzIGZvcgogIGVhY2ggdGhyZWFkLCB0aGVuIHVzaW5nIC5qdW1wYWhlYWQoKSB0byBmb3JjZSBlYWNoIGluc3RhbmNlIHRvIHVzZSBhCiAgbm9uLW92ZXJsYXBwaW5nIHNlZ21lbnQgb2YgdGhlIGZ1bGwgcGVyaW9kLgoKLSByYW5kb20ucHkncyBzZWVkKCkgZnVuY3Rpb24gaXMgbmV3LiAgRm9yIGJpdC1mb3ItYml0IGNvbXBhdGliaWxpdHkgd2l0aAogIHByaW9yIHJlbGVhc2VzLCB1c2UgdGhlIHdoc2VlZCBmdW5jdGlvbiBpbnN0ZWFkLiAgVGhlIG5ldyBzZWVkIGZ1bmN0aW9uCiAgYWRkcmVzc2VzIHR3byBwcm9ibGVtczogICgxKSBUaGUgb2xkIGZ1bmN0aW9uIGNvdWxkbid0IHByb2R1Y2UgbW9yZSB0aGFuCiAgYWJvdXQgMioqMjQgZGlzdGluY3QgaW50ZXJuYWwgc3RhdGVzOyB0aGUgbmV3IG9uZSBhYm91dCAyKio0NSAodGhlIGJlc3QKICB0aGF0IGNhbiBiZSBkb25lIGluIHRoZSBXaWNobWFubi1IaWxsIGdlbmVyYXRvcikuICAoMikgVGhlIG9sZCBmdW5jdGlvbgogIHNvbWV0aW1lcyBwcm9kdWNlZCBpZGVudGljYWwgaW50ZXJuYWwgc3RhdGVzIHdoZW4gcGFzc2VkIGRpc3RpbmN0CiAgaW50ZWdlcnMsIGFuZCB0aGVyZSB3YXMgbm8gc2ltcGxlIHdheSB0byBwcmVkaWN0IHdoZW4gdGhhdCB3b3VsZCBoYXBwZW47CiAgdGhlIG5ldyBvbmUgZ3VhcmFudGVlcyB0byBwcm9kdWNlIGRpc3RpbmN0IGludGVybmFsIHN0YXRlcyBmb3IgYWxsCiAgYXJndW1lbnRzIGluIFswLCAyNzgxNDQzMTQ4NjU3NkwpLgoKLSBUaGUgc29ja2V0IG1vZHVsZSBub3cgc3VwcG9ydHMgcmF3IHBhY2tldHMgb24gTGludXguICBUaGUgc29ja2V0CiAgZmFtaWx5IGlzIEFGX1BBQ0tFVC4KCi0gdGVzdF9jYXBpLnB5IGlzIGEgc3RhcnQgYXQgcnVubmluZyB0ZXN0cyBvZiB0aGUgUHl0aG9uIEMgQVBJLiAgVGhlIHRlc3RzCiAgYXJlIGltcGxlbWVudGVkIGJ5IHRoZSBuZXcgTW9kdWxlcy9fdGVzdG1vZHVsZS5jLgoKLSBBIG5ldyBleHRlbnNpb24gbW9kdWxlLCBfc3ltdGFibGUsIHByb3ZpZGVzIHByb3Zpc2lvbmFsIGFjY2VzcyB0byB0aGUKICBpbnRlcm5hbCBzeW1ib2wgdGFibGUgdXNlZCBieSB0aGUgUHl0aG9uIGNvbXBpbGVyLiAgQSBoaWdoZXItbGV2ZWwKICBpbnRlcmZhY2Ugd2lsbCBiZSBhZGRlZCBvbiB0b3Agb2YgX3N5bXRhYmxlIGluIGEgZnV0dXJlIHJlbGVhc2UuCgotIFJlbW92ZWQgdGhlIG9ic29sZXRlIHNvdW5kZXggbW9kdWxlLgoKLSB4bWwuZG9tLm1pbmlkb20gbm93IHVzZXMgdGhlIHN0YW5kYXJkIERPTSBleGNlcHRpb25zLiBOb2RlIHN1cHBvcnRzCiAgdGhlIGlzU2FtZU5vZGUgbWV0aG9kOyBOYW1lZE5vZGVNYXAgdGhlIGdldCBtZXRob2QuCgotIHhtbC5zYXguZXhwYXRyZWFkZXIgc3VwcG9ydHMgdGhlIGxleGljYWwgaGFuZGxlciBwcm9wZXJ0eTsgaXQKICBnZW5lcmF0ZXMgY29tbWVudCwgc3RhcnRDREFUQSwgYW5kIGVuZENEQVRBIGV2ZW50cy4KCldpbmRvd3MgY2hhbmdlcwoKLSBCdWlsZCBwcm9jZWR1cmU6ICB0aGUgemxpYiBwcm9qZWN0IGlzIGJ1aWx0IGluIGEgZGlmZmVyZW50IHdheSB0aGF0CiAgZW5zdXJlcyB0aGUgemxpYiBoZWFkZXIgZmlsZXMgdXNlZCBjYW4gbm8gbG9uZ2VyIGdldCBvdXQgb2Ygc3luY2ggd2l0aAogIHRoZSB6bGliIGJpbmFyeSB1c2VkLiAgU2VlIFBDYnVpbGRccmVhZG1lLnR4dCBmb3IgZGV0YWlscy4gIFlvdXIgb2xkCiAgemxpYi1yZWxhdGVkIGRpcmVjdG9yaWVzIGNhbiBiZSBkZWxldGVkOyB5b3UnbGwgbmVlZCB0byBkb3dubG9hZCBmcmVzaAogIHNvdXJjZSBmb3IgemxpYiBhbmQgdW5wYWNrIGl0IGludG8gYSBuZXcgZGlyZWN0b3J5LgoKLSBCdWlsZDogIE5ldyBzdWJwcm9qZWN0IF90ZXN0IGZvciB0aGUgYmVuZWZpdCBvZiB0ZXN0X2NhcGkucHkgKHNlZSBhYm92ZSkuCgotIEJ1aWxkOiAgTmV3IHN1YnByb2plY3QgX3N5bXRhYmxlLCBmb3IgbmV3IERMTCBfc3ltdGFibGUucHlkIChhIG5hc2NlbnQKICBpbnRlcmZhY2UgdG8gc29tZSBQeXRob24gY29tcGlsZXIgaW50ZXJuYWxzKS4KCi0gQnVpbGQ6ICBTdWJwcm9qZWN0IHVjbmhhc2ggaXMgZ29uZSwgc2luY2UgdGhlIGNvZGUgd2FzIGZvbGRlZCBpbnRvIHRoZQogIHVuaWNvZGVkYXRhIHN1YnByb2plY3QuCgpXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjEgYWxwaGEgMT8KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpDb3JlIGxhbmd1YWdlLCBidWlsdGlucywgYW5kIGludGVycHJldGVyCgotIFRoZXJlIGlzIGEgbmV3IFVuaWNvZGUgY29tcGFuaW9uIHRvIHRoZSBQeU9iamVjdF9TdHIoKSBBUEkKICBjYWxsZWQgUHlPYmplY3RfVW5pY29kZSgpLiBJdCBiZWhhdmVzIGluIHRoZSBzYW1lIHdheSBhcyB0aGUKICBmb3JtZXIsIGJ1dCBhc3N1cmVzIHRoYXQgdGhlIHJldHVybmVkIHZhbHVlIGlzIGFuIFVuaWNvZGUgb2JqZWN0CiAgKGFwcGx5aW5nIHRoZSB1c3VhbCBjb2VyY2lvbiBpZiBuZWNlc3NhcnkpLgoKLSBUaGUgY29tcGFyaXNvbiBvcGVyYXRvcnMgc3VwcG9ydCAicmljaCBjb21wYXJpc29uIG92ZXJsb2FkaW5nIiAoUEVQCiAgMjA3KS4gIEMgZXh0ZW5zaW9uIHR5cGVzIGNhbiBwcm92aWRlIGEgcmljaCBjb21wYXJpc29uIGZ1bmN0aW9uIGluCiAgdGhlIG5ldyB0cF9yaWNoY29tcGFyZSBzbG90IGluIHRoZSB0eXBlIG9iamVjdC4gIFRoZSBjbXAoKSBmdW5jdGlvbgogIGFuZCB0aGUgQyBmdW5jdGlvbiBQeU9iamVjdF9Db21wYXJlKCkgZmlyc3QgdHJ5IHRoZSBuZXcgcmljaAogIGNvbXBhcmlzb24gb3BlcmF0b3JzIGJlZm9yZSB0cnlpbmcgdGhlIG9sZCAzLXdheSBjb21wYXJpc29uLiAgVGhlcmUKICBpcyBhbHNvIGEgbmV3IEMgQVBJIFB5T2JqZWN0X1JpY2hDb21wYXJlKCkgKHdoaWNoIGFsc28gZmFsbHMgYmFjayBvbgogIHRoZSBvbGQgMy13YXkgY29tcGFyaXNvbiwgYnV0IGRvZXMgbm90IGNvbnN0cmFpbiB0aGUgb3V0Y29tZSBvZiB0aGUKICByaWNoIGNvbXBhcmlzb24gdG8gYSBCb29sZWFuIHJlc3VsdCkuCgogIFRoZSByaWNoIGNvbXBhcmlzb24gZnVuY3Rpb24gdGFrZXMgdHdvIG9iamVjdHMgKGF0IGxlYXN0IG9uZSBvZgogIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSB0aGUgdHlwZSB0aGF0IHByb3ZpZGVkIHRoZSBmdW5jdGlvbikgYW5kCiAgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBvcGNvZGUsIHdoaWNoIGNhbiBiZSBQeV9MVCwgUHlfTEUsIFB5X0VRLAogIFB5X05FLCBQeV9HVCwgUHlfR0UgKGZvciA8LCA8PSwgPT0sICE9LCA+LCA+PSksIGFuZCByZXR1cm5zIGEgUHl0aG9uCiAgb2JqZWN0LCB3aGljaCBtYXkgYmUgTm90SW1wbGVtZW50ZWQgKGluIHdoaWNoIGNhc2UgdGhlIHRwX2NvbXBhcmUKICBzbG90IGZ1bmN0aW9uIGlzIHVzZWQgYXMgYSBmYWxsYmFjaywgaWYgZGVmaW5lZCkuCgogIENsYXNzZXMgY2FuIG92ZXJsb2FkIGluZGl2aWR1YWwgY29tcGFyaXNvbiBvcGVyYXRvcnMgYnkgZGVmaW5pbmcgb25lCiAgb3IgbW9yZSBvZiB0aGUgbWV0aG9kc19fbHRfXywgX19sZV9fLCBfX2VxX18sIF9fbmVfXywgX19ndF9fLAogIF9fZ2VfXy4gIFRoZXJlIGFyZSBubyBleHBsaWNpdCAicmVmbGVjdGVkIGFyZ3VtZW50IiB2ZXJzaW9ucyBvZgogIHRoZXNlOyBpbnN0ZWFkLCBfX2x0X18gYW5kIF9fZ3RfXyBhcmUgZWFjaCBvdGhlcidzIHJlZmxlY3Rpb24sCiAgbGlrZXdpc2UgZm9yX19sZV9fIGFuZCBfX2dlX187IF9fZXFfXyBhbmQgX19uZV9fIGFyZSB0aGVpciBvd24KICByZWZsZWN0aW9uIChzaW1pbGFyIGF0IHRoZSBDIGxldmVsKS4gIE5vIG90aGVyIGltcGxpY2F0aW9ucyBhcmUKICBtYWRlOyBpbiBwYXJ0aWN1bGFyLCBQeXRob24gZG9lcyBub3QgYXNzdW1lIHRoYXQgPT0gaXMgdGhlIEJvb2xlYW4KICBpbnZlcnNlIG9mICE9LCBvciB0aGF0IDwgaXMgdGhlIEJvb2xlYW4gaW52ZXJzZSBvZiA+PS4gIFRoaXMgbWFrZXMKICBpdCBwb3NzaWJsZSB0byBkZWZpbmUgdHlwZXMgd2l0aCBwYXJ0aWFsIG9yZGVyaW5ncy4KCiAgQ2xhc3NlcyBvciB0eXBlcyB0aGF0IHdhbnQgdG8gaW1wbGVtZW50IChpbillcXVhbGl0eSB0ZXN0cyBidXQgbm90CiAgdGhlIG9yZGVyaW5nIG9wZXJhdG9ycyAoaS5lLiB1bm9yZGVyZWQgdHlwZXMpIHNob3VsZCBpbXBsZW1lbnQgPT0KICBhbmQgIT0sIGFuZCByYWlzZSBhbiBlcnJvciBmb3IgdGhlIG9yZGVyaW5nIG9wZXJhdG9ycy4KCiAgSXQgaXMgcG9zc2libGUgdG8gZGVmaW5lIHR5cGVzIHdob3NlIHJpY2ggY29tcGFyaXNvbiByZXN1bHRzIGFyZSBub3QKICBCb29sZWFuOyBlLmcuIGEgbWF0cml4IHR5cGUgbWlnaHQgd2FudCB0byByZXR1cm4gYSBtYXRyaXggb2YgYml0cwogIGZvciBBIDwgQiwgZ2l2aW5nIGVsZW1lbnR3aXNlIGNvbXBhcmlzb25zLiAgU3VjaCB0eXBlcyBzaG91bGQgZW5zdXJlCiAgdGhhdCBhbnkgaW50ZXJwcmV0YXRpb24gb2YgdGhlaXIgdmFsdWUgaW4gYSBCb29sZWFuIGNvbnRleHQgcmFpc2VzCiAgYW4gZXhjZXB0aW9uLCBlLmcuIGJ5IGRlZmluaW5nIF9fbm9uemVyb19fIChvciB0aGUgdHBfbm9uemVybyBzbG90CiAgYXQgdGhlIEMgbGV2ZWwpIHRvIGFsd2F5cyByYWlzZSBhbiBleGNlcHRpb24uCgotIENvbXBsZXggbnVtYmVycyB1c2UgcmljaCBjb21wYXJpc29ucyB0byBkZWZpbmUgPT0gYW5kICE9IGJ1dCByYWlzZQogIGFuIGV4Y2VwdGlvbiBmb3IgPCwgPD0sID4gYW5kID49LiAgVW5mb3J0dW5hdGVseSwgdGhpcyBhbHNvIG1lYW5zCiAgdGhhdCBjbXAoKSBvZiB0d28gY29tcGxleCBudW1iZXJzIHJhaXNlcyBhbiBleGNlcHRpb24gd2hlbiB0aGUgdHdvCiAgbnVtYmVycyBkaWZmZXIuICBTaW5jZSBpdCBpcyBub3QgbWF0aGVtYXRpY2FsbHkgbWVhbmluZ2Z1bCB0byBjb21wYXJlCiAgY29tcGxleCBudW1iZXJzIGV4Y2VwdCBmb3IgZXF1YWxpdHksIEkgaG9wZSB0aGF0IHRoaXMgZG9lc24ndCBicmVhawogIHRvbyBtdWNoIGNvZGUuCgotIFRoZSBvdXRjb21lIG9mIGNvbXBhcmluZyBub24tbnVtZXJpYyBvYmplY3RzIG9mIGRpZmZlcmVudCB0eXBlcyBpcwogIG5vdCBkZWZpbmVkIGJ5IHRoZSBsYW5ndWFnZSwgb3RoZXIgdGhhbiB0aGF0IGl0J3MgYXJiaXRyYXJ5IGJ1dAogIGNvbnNpc3RlbnQgKHNlZSB0aGUgUmVmZXJlbmNlIE1hbnVhbCkuICBBbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgY2hhbmdlZAogIGluIDIuMWExIHN1Y2ggdGhhdCBOb25lIG5vdyBjb21wYXJlcyBsZXNzIHRoYW4gYW55IG90aGVyIG9iamVjdC4gIENvZGUKICByZWx5aW5nIG9uIHRoaXMgbmV3IGJlaGF2aW9yIChsaWtlIGNvZGUgdGhhdCByZWxpZWQgb24gdGhlIHByZXZpb3VzCiAgYmVoYXZpb3IpIGRvZXMgc28gYXQgaXRzIG93biByaXNrLgoKLSBGdW5jdGlvbnMgYW5kIG1ldGhvZHMgbm93IHN1cHBvcnQgZ2V0dGluZyBhbmQgc2V0dGluZyBhcmJpdHJhcmlseQogIG5hbWVkIGF0dHJpYnV0ZXMgKFBFUCAyMzIpLiAgRnVuY3Rpb25zIGhhdmUgYSBuZXcgX19kaWN0X18KICAoYS5rLmEuIGZ1bmNfZGljdCkgd2hpY2ggaG9sZCB0aGUgZnVuY3Rpb24gYXR0cmlidXRlcy4gIE1ldGhvZHMgZ2V0CiAgYW5kIHNldCBhdHRyaWJ1dGVzIG9uIHRoZWlyIHVuZGVybHlpbmcgaW1fZnVuYy4gIEl0IGlzIGEgVHlwZUVycm9yCiAgdG8gc2V0IGFuIGF0dHJpYnV0ZSBvbiBhIGJvdW5kIG1ldGhvZC4KCi0gVGhlIHhyYW5nZSgpIG9iamVjdCBpbXBsZW1lbnRhdGlvbiBoYXMgYmVlbiBpbXByb3ZlZCBzbyB0aGF0CiAgeHJhbmdlKHN5cy5tYXhpbnQpIGNhbiBiZSB1c2VkIG9uIDY0LWJpdCBwbGF0Zm9ybXMuICBUaGVyZSdzIHN0aWxsIGEKICBsaW1pdGF0aW9uIHRoYXQgaW4gdGhpcyBjYXNlIGxlbih4cmFuZ2Uoc3lzLm1heGludCkpIGNhbid0IGJlCiAgY2FsY3VsYXRlZCwgYnV0IHRoZSBjb21tb24gaWRpb20gImZvciBpIGluIHhyYW5nZShzeXMubWF4aW50KSIgd2lsbAogIHdvcmsgZmluZSBhcyBsb25nIGFzIHRoZSBpbmRleCBpIGRvZXNuJ3QgYWN0dWFsbHkgcmVhY2ggMioqMzEuCiAgKFB5dGhvbiB1c2VzIHJlZ3VsYXIgaW50cyBmb3Igc2VxdWVuY2UgYW5kIHN0cmluZyBpbmRpY2VzOyBmaXhpbmcKICB0aGF0IGlzIG11Y2ggbW9yZSB3b3JrLikKCi0gVHdvIGNoYW5nZXMgdG8gZnJvbS4uLmltcG9ydDoKCiAgMSkgImZyb20gTSBpbXBvcnQgWCIgbm93IHdvcmtzIGV2ZW4gaWYgKGFmdGVyIGxvYWRpbmcgbW9kdWxlIE0pCiAgICAgc3lzLm1vZHVsZXNbJ00nXSBpcyBub3QgYSByZWFsIG1vZHVsZTsgaXQncyBiYXNpY2FsbHkgYSBnZXRhdHRyKCkKICAgICBvcGVyYXRpb24gd2l0aCBBdHRyaWJ1dGVFcnJvciBleGNlcHRpb25zIGNoYW5nZWQgaW50byBJbXBvcnRFcnJvci4KCiAgMikgImZyb20gTSBpbXBvcnQgKiIgbm93IGxvb2tzIGZvciBNLl9fYWxsX18gdG8gZGVjaWRlIHdoaWNoIG5hbWVzIHRvCiAgICAgaW1wb3J0OyBpZiBNLl9fYWxsX18gZG9lc24ndCBleGlzdCwgaXQgdXNlcyBNLl9fZGljdF9fLmtleXMoKSBidXQKICAgICBmaWx0ZXJzIG91dCBuYW1lcyBzdGFydGluZyB3aXRoICdfJyBhcyBiZWZvcmUuICBXaGV0aGVyIG9yIG5vdAogICAgIF9fYWxsX18gZXhpc3RzLCB0aGVyZSdzIG5vIHJlc3RyaWN0aW9uIG9uIHRoZSB0eXBlIG9mIE0uCgotIEZpbGUgb2JqZWN0cyBoYXZlIGEgbmV3IG1ldGhvZCwgeHJlYWRsaW5lcygpLiAgVGhpcyBpcyB0aGUgZmFzdGVzdAogIHdheSB0byBpdGVyYXRlIG92ZXIgYWxsIGxpbmVzIGluIGEgZmlsZToKCiAgZm9yIGxpbmUgaW4gZmlsZS54cmVhZGxpbmVzKCk6CiAgICAgIC4uLmRvIHNvbWV0aGluZyB0byBsaW5lLi4uCgogIFNlZSB0aGUgeHJlYWRsaW5lcyBtb2R1bGUgKG1lbnRpb25lZCBiZWxvdykgZm9yIGhvdyB0byBkbyB0aGlzIGZvcgogIG90aGVyIGZpbGUtbGlrZSBvYmplY3RzLgoKLSBFdmVuIGlmIHlvdSBkb24ndCB1c2UgZmlsZS54cmVhZGxpbmVzKCksIHlvdSBtYXkgZXhwZWN0IGEgc3BlZWR1cCBvbgogIGxpbmUtYnktbGluZSBpbnB1dC4gIFRoZSBmaWxlLnJlYWRsaW5lKCkgbWV0aG9kIGhhcyBiZWVuIG9wdGltaXplZAogIHF1aXRlIGEgYml0IGluIHBsYXRmb3JtLXNwZWNpZmljIHdheXM6ICBvbiBzeXN0ZW1zIChsaWtlIExpbnV4KSB0aGF0CiAgc3VwcG9ydCBmbG9ja2ZpbGUoKSwgZ2V0Y191bmxvY2tlZCgpLCBhbmQgZnVubG9ja2ZpbGUoKSwgdGhvc2UgYXJlCiAgdXNlZCBieSBkZWZhdWx0LiAgT24gc3lzdGVtcyAobGlrZSBXaW5kb3dzKSB3aXRob3V0IGdldGNfdW5sb2NrZWQoKSwKICBhIGNvbXBsaWNhdGVkIChidXQgc3RpbGwgdGhyZWFkLXNhZmUpIG1ldGhvZCB1c2luZyBmZ2V0cygpIGlzIHVzZWQgYnkKICBkZWZhdWx0LgoKICBZb3UgY2FuIGZvcmNlIHVzZSBvZiB0aGUgZmdldHMoKSBtZXRob2QgYnkgI2RlZmluZSdpbmcKICBVU0VfRkdFVFNfSU5fR0VUTElORSBhdCBidWlsZCB0aW1lIChpdCBtYXkgYmUgZmFzdGVyIHRoYW4KICBnZXRjX3VubG9ja2VkKCkpLgoKICBZb3UgY2FuIGZvcmNlIGZnZXRzKCkgbm90IHRvIGJlIHVzZWQgYnkgI2RlZmluZSdpbmcKICBET05UX1VTRV9GR0VUU19JTl9HRVRMSU5FICh0aGlzIGlzIHRoZSBmaXJzdCB0aGluZyB0byB0cnkgaWYgc3RkIHRlc3QKICB0ZXN0X2J1ZmlvLnB5IGZhaWxzIC0tIGFuZCBsZXQgdXMga25vdyBpZiBpdCBkb2VzISkuCgotIEluIGFkZGl0aW9uLCB0aGUgZmlsZWlucHV0IG1vZHVsZSwgd2hpbGUgc3RpbGwgc2xvd2VyIHRoYW4gdGhlIG90aGVyCiAgbWV0aG9kcyBvbiBtb3N0IHBsYXRmb3JtcywgaGFzIGJlZW4gc3BlZCB1cCB0b28sIGJ5IHVzaW5nCiAgZmlsZS5yZWFkbGluZXMoc2l6ZWhpbnQpLgoKLSBTdXBwb3J0IGZvciBydW4tdGltZSB3YXJuaW5ncyBoYXMgYmVlbiBhZGRlZCwgaW5jbHVkaW5nIGEgbmV3CiAgY29tbWFuZCBsaW5lIG9wdGlvbiAoLVcpIHRvIHNwZWNpZnkgdGhlIGRpc3Bvc2l0aW9uIG9mIHdhcm5pbmdzLgogIFNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHdhcm5pbmdzIG1vZHVsZSBiZWxvdy4KCi0gRXh0ZW5zaXZlIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdG8gdGhlIGNvZXJjaW9uIGNvZGUuICBUaGlzIG1vc3RseQogIGFmZmVjdHMgZXh0ZW5zaW9uIG1vZHVsZXMgKHdoaWNoIGNhbiBub3cgaW1wbGVtZW50IG1peGVkLXR5cGUKICBudW1lcmljYWwgb3BlcmF0b3JzIHdpdGhvdXQgaGF2aW5nIHRvIHVzZSBjb2VyY2lvbiksIGJ1dAogIG9jY2FzaW9uYWxseSwgaW4gYm91bmRhcnkgY2FzZXMgdGhlIGNvZXJjaW9uIHNlbWFudGljcyBoYXZlIGNoYW5nZWQKICBzdWJ0bHkuICBTaW5jZSB0aGlzIHdhcyBhIHRlcnJpYmxlIGdyYXkgYXJlYSBvZiB0aGUgbGFuZ3VhZ2UsIHRoaXMKICBpcyBjb25zaWRlcmVkIGFuIGltcHJvdmVtZW50LiAgQWxzbyBub3RlIHRoYXQgX19yY21wX18gaXMgbm8gbG9uZ2VyCiAgc3VwcG9ydGVkIC0tIGluc3RlYWQgb2YgY2FsbGluZyBfX3JjbXBfXywgX19jbXBfXyBpcyBjYWxsZWQgd2l0aAogIHJlZmxlY3RlZCBhcmd1bWVudHMuCgotIEluIGNvbm5lY3Rpb24gd2l0aCB0aGUgY29lcmNpb24gY2hhbmdlcywgYSBuZXcgYnVpbHQtaW4gc2luZ2xldG9uCiAgb2JqZWN0LCBOb3RJbXBsZW1lbnRlZCBpcyBkZWZpbmVkLiAgVGhpcyBjYW4gYmUgcmV0dXJuZWQgZm9yCiAgb3BlcmF0aW9ucyB0aGF0IHdpc2ggdG8gaW5kaWNhdGUgdGhleSBhcmUgbm90IGltcGxlbWVudGVkIGZvciBhCiAgcGFydGljdWxhciBjb21iaW5hdGlvbiBvZiBhcmd1bWVudHMuICBGcm9tIEMsIHRoaXMgaXMKICBQeV9Ob3RJbXBsZW1lbnRlZC4KCi0gVGhlIGludGVycHJldGVyIGFjY2VwdHMgbm93IGJ5dGVjb2RlIGZpbGVzIG9uIHRoZSBjb21tYW5kIGxpbmUgZXZlbgogIGlmIHRoZXkgZG8gbm90IGhhdmUgYSAucHljIG9yIC5weW8gZXh0ZW5zaW9uLiBPbiBMaW51eCwgYWZ0ZXIgZXhlY3V0aW5nCgppbXBvcnQgaW1wLHN5cyxzdHJpbmcKbWFnaWMgPSBzdHJpbmcuam9pbihbIlxceCUuMngiICUgb3JkKGMpIGZvciBjIGluIGltcC5nZXRfbWFnaWMoKV0sIiIpCnJlZyA9ICc6cHljOk06OiVzOjolczonICUgKG1hZ2ljLCBzeXMuZXhlY3V0YWJsZSkKb3BlbigiL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjL3JlZ2lzdGVyIiwid2IiKS53cml0ZShyZWcpCgogIGFueSBieXRlIGNvZGUgZmlsZSBjYW4gYmUgdXNlZCBhcyBhbiBleGVjdXRhYmxlIChpLmUuIGFzIGFuIGFyZ3VtZW50CiAgdG8gZXhlY3ZlKDIpKS4KCi0gJVt4WG9dIGZvcm1hdHMgb2YgbmVnYXRpdmUgUHl0aG9uIGxvbmdzIG5vdyBwcm9kdWNlIGEgc2lnbgogIGNoYXJhY3Rlci4gIEluIDEuNiBhbmQgZWFybGllciwgdGhleSBuZXZlciBwcm9kdWNlZCBhIHNpZ24sCiAgYW5kIHJhaXNlZCBhbiBlcnJvciBpZiB0aGUgdmFsdWUgb2YgdGhlIGxvbmcgd2FzIHRvbyBsYXJnZQogIHRvIGZpdCBpbiBhIFB5dGhvbiBpbnQuICBJbiAyLjAsIHRoZXkgcHJvZHVjZWQgYSBzaWduIGlmIGFuZAogIG9ubHkgaWYgdG9vIGxhcmdlIHRvIGZpdCBpbiBhbiBpbnQuICBUaGlzIHdhcyBpbmNvbnNpc3RlbnQKICBhY3Jvc3MgcGxhdGZvcm1zIChiZWNhdXNlIHRoZSBzaXplIG9mIGFuIGludCB2YXJpZXMgYWNyb3NzCiAgcGxhdGZvcm1zKSwgYW5kIGluY29uc2lzdGVudCB3aXRoIGhleCgpIGFuZCBvY3QoKS4gIEV4YW1wbGU6CgogID4+PiAiJXgiICUgLTB4NDJMCiAgJy00MicgICAgICAjIGluIDIuMQogICdmZmZmZmZiZScgIyBpbiAyLjAgYW5kIGJlZm9yZSwgb24gMzItYml0IG1hY2hpbmVzCiAgPj4+IGhleCgtMHg0MkwpCiAgJy0weDQyTCcgICAjIGluIGFsbCB2ZXJzaW9ucyBvZiBQeXRob24KCiAgVGhlIGJlaGF2aW9yIG9mICVkIGZvcm1hdHMgZm9yIG5lZ2F0aXZlIFB5dGhvbiBsb25ncyByZW1haW5zCiAgdGhlIHNhbWUgYXMgaW4gMi4wIChhbHRob3VnaCBpbiAxLjYgYW5kIGJlZm9yZSwgdGhleSByYWlzZWQKICBhbiBlcnJvciBpZiB0aGUgbG9uZyBkaWRuJ3QgZml0IGluIGEgUHl0aG9uIGludCkuCgogICV1IGZvcm1hdHMgZG9uJ3QgbWFrZSBzZW5zZSBmb3IgUHl0aG9uIGxvbmdzLCBidXQgYXJlIGFsbG93ZWQKICBhbmQgdHJlYXRlZCB0aGUgc2FtZSBhcyAlZCBpbiAyLjEuICBJbiAyLjAsIGEgbmVnYXRpdmUgbG9uZwogIGZvcm1hdHRlZCB2aWEgJXUgcHJvZHVjZWQgYSBzaWduIGlmIGFuZCBvbmx5IGlmIHRvbyBsYXJnZSB0bwogIGZpdCBpbiBhbiBpbnQuICBJbiAxLjYgYW5kIGVhcmxpZXIsIGEgbmVnYXRpdmUgbG9uZyBmb3JtYXR0ZWQKICB2aWEgJXUgcmFpc2VkIGFuIGVycm9yIGlmIGl0IHdhcyB0b28gYmlnIHRvIGZpdCBpbiBhbiBpbnQuCgotIERpY3Rpb25hcnkgb2JqZWN0cyBoYXZlIGFuIG9kZCBuZXcgbWV0aG9kLCBwb3BpdGVtKCkuICBUaGlzIHJlbW92ZXMKICBhbiBhcmJpdHJhcnkgaXRlbSBmcm9tIHRoZSBkaWN0aW9uYXJ5IGFuZCByZXR1cm5zIGl0IChpbiB0aGUgZm9ybSBvZgogIGEgKGtleSwgdmFsdWUpIHBhaXIpLiAgVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBhbGdvcml0aG1zIHRoYXQgdXNlIGEKICBkaWN0aW9uYXJ5IGFzIGEgYmFnIG9mICJ0byBkbyIgaXRlbXMgYW5kIHJlcGVhdGVkbHkgbmVlZCB0byBwaWNrIG9uZQogIGl0ZW0uICBTdWNoIGFsZ29yaXRobXMgbm9ybWFsbHkgZW5kIHVwIHJ1bm5pbmcgaW4gcXVhZHJhdGljIHRpbWU7CiAgdXNpbmcgcG9waXRlbSgpIHRoZXkgY2FuIHVzdWFsbHkgYmUgbWFkZSB0byBydW4gaW4gbGluZWFyIHRpbWUuCgpTdGFuZGFyZCBsaWJyYXJ5CgotIEluIHRoZSB0aW1lIG1vZHVsZSwgdGhlIHRpbWUgYXJndW1lbnQgdG8gdGhlIGZ1bmN0aW9ucyBzdHJmdGltZSwKICBsb2NhbHRpbWUsIGdtdGltZSwgYXNjdGltZSBhbmQgY3RpbWUgaXMgbm93IG9wdGlvbmFsLCBkZWZhdWx0aW5nIHRvCiAgdGhlIGN1cnJlbnQgdGltZSAoaW4gdGhlIGxvY2FsIHRpbWV6b25lKS4KCi0gVGhlIGZ0cGxpYiBtb2R1bGUgbm93IGRlZmF1bHRzIHRvIHBhc3NpdmUgbW9kZSwgd2hpY2ggaXMgZGVlbWVkIGEKICBtb3JlIHVzZWZ1bCBkZWZhdWx0IGdpdmVuIHRoYXQgY2xpZW50cyBhcmUgb2Z0ZW4gaW5zaWRlIGZpcmV3YWxscwogIHRoZXNlIGRheXMuICBOb3RlIHRoYXQgdGhpcyBjb3VsZCBicmVhayBpZiBmdHBsaWIgaXMgdXNlZCB0byBjb25uZWN0CiAgdG8gYSAqc2VydmVyKiB0aGF0IGlzIGluc2lkZSBhIGZpcmV3YWxsLCBmcm9tIG91dHNpZGU7IHRoaXMgaXMKICBleHBlY3RlZCB0byBiZSBhIHZlcnkgcmFyZSBzaXR1YXRpb24uICBUbyBmaXggdGhhdCwgeW91IGNhbiBjYWxsCiAgZnRwLnNldF9wYXN2KDApLgoKLSBUaGUgbW9kdWxlIHNpdGUgbm93IHRyZWF0cyAucHRoIGZpbGVzIG5vdCBvbmx5IGZvciBwYXRoIGNvbmZpZ3VyYXRpb24sCiAgYnV0IGFsc28gc3VwcG9ydHMgZXh0ZW5zaW9ucyB0byB0aGUgaW5pdGlhbGl6YXRpb24gY29kZTogTGluZXMgc3RhcnRpbmcKICB3aXRoIGltcG9ydCBhcmUgZXhlY3V0ZWQuCgotIFRoZXJlJ3MgYSBuZXcgbW9kdWxlLCB3YXJuaW5ncywgd2hpY2ggaW1wbGVtZW50cyBhIG1lY2hhbmlzbSBmb3IKICBpc3N1aW5nIGFuZCBmaWx0ZXJpbmcgd2FybmluZ3MuICBUaGVyZSBhcmUgc29tZSBuZXcgYnVpbHQtaW4KICBleGNlcHRpb25zIHRoYXQgc2VydmUgYXMgd2FybmluZyBjYXRlZ29yaWVzLCBhbmQgYSBuZXcgY29tbWFuZCBsaW5lCiAgb3B0aW9uLCAtVywgdG8gY29udHJvbCB3YXJuaW5ncyAoZS5nLiAtV2kgaWdub3JlcyBhbGwgd2FybmluZ3MsIC1XZQogIHR1cm5zIHdhcm5pbmdzIGludG8gZXJyb3JzKS4gIHdhcm5pbmdzLndhcm4obWVzc2FnZVssIGNhdGVnb3J5XSkKICBpc3N1ZXMgYSB3YXJuaW5nIG1lc3NhZ2U7IHRoaXMgY2FuIGFsc28gYmUgY2FsbGVkIGZyb20gQyBhcwogIFB5RXJyX1dhcm4oY2F0ZWdvcnksIG1lc3NhZ2UpLgoKLSBBIG5ldyBtb2R1bGUgeHJlYWRsaW5lcyB3YXMgYWRkZWQuICBUaGlzIGV4cG9ydHMgYSBzaW5nbGUgZmFjdG9yeQogIGZ1bmN0aW9uLCB4cmVhZGxpbmVzKCkuICBUaGUgaW50ZW50aW9uIGlzIHRoYXQgdGhpcyBjb2RlIGlzIHRoZQogIGFic29sdXRlbHkgZmFzdGVzdCB3YXkgdG8gaXRlcmF0ZSBvdmVyIGFsbCBsaW5lcyBpbiBhbiBvcGVuCiAgZmlsZSgtbGlrZSkgb2JqZWN0OgoKICBpbXBvcnQgeHJlYWRsaW5lcwogIGZvciBsaW5lIGluIHhyZWFkbGluZXMueHJlYWRsaW5lcyhmaWxlKToKICAgICAgLi4uZG8gc29tZXRoaW5nIHRvIGxpbmUuLi4KCiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBwcmV2aW91cyB0aGUgc3BlZWQgcmVjb3JkIGhvbGRlciB1c2luZwogIGZpbGUucmVhZGxpbmVzKHNpemVoaW50KS4gIE5vdGUgdGhhdCBpZiBmaWxlIGlzIGEgcmVhbCBmaWxlIG9iamVjdAogIChhcyBvcHBvc2VkIHRvIGEgZmlsZS1saWtlIG9iamVjdCksIHRoaXMgaXMgZXF1aXZhbGVudDoKCiAgZm9yIGxpbmUgaW4gZmlsZS54cmVhZGxpbmVzKCk6CiAgICAgIC4uLmRvIHNvbWV0aGluZyB0byBsaW5lLi4uCgotIFRoZSBiaXNlY3QgbW9kdWxlIGhhcyBuZXcgZnVuY3Rpb25zIGJpc2VjdF9sZWZ0LCBpbnNvcnRfbGVmdCwKICBiaXNlY3RfcmlnaHQgYW5kIGluc29ydF9yaWdodC4gIFRoZSBvbGQgbmFtZXMgYmlzZWN0IGFuZCBpbnNvcnQKICBhcmUgbm93IGFsaWFzZXMgZm9yIGJpc2VjdF9yaWdodCBhbmQgaW5zb3J0X3JpZ2h0LiAgWFhYX3JpZ2h0CiAgYW5kIFhYWF9sZWZ0IG1ldGhvZHMgZGlmZmVyIGluIHdoYXQgaGFwcGVucyB3aGVuIHRoZSBuZXcgZWxlbWVudAogIGNvbXBhcmVzIGVxdWFsIHRvIG9uZSBvciBtb3JlIGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIGxpc3Q6ICB0aGUKICBYWFhfbGVmdCBtZXRob2RzIGluc2VydCB0byB0aGUgbGVmdCwgdGhlIFhYWF9yaWdodCBtZXRob2RzIHRvIHRoZQogIHJpZ2h0LiAgQ29kZSB0aGF0IGRvZXNuJ3QgY2FyZSB3aGVyZSBlcXVhbCBlbGVtZW50cyBlbmQgdXAgc2hvdWxkCiAgY29udGludWUgdG8gdXNlIHRoZSBvbGQsIHNob3J0IG5hbWVzICgiYmlzZWN0IiBhbmQgImluc29ydCIpLgoKLSBUaGUgbmV3IGN1cnNlcy5wYW5lbCBtb2R1bGUgd3JhcHMgdGhlIHBhbmVsIGxpYnJhcnkgdGhhdCBmb3JtcyBwYXJ0CiAgb2YgU1lTViBjdXJzZXMgYW5kIG5jdXJzZXMuICBDb250cmlidXRlZCBieSBUaG9tYXMgR2VsbGVrdW0uCgotIFRoZSBTb2NrZXRTZXJ2ZXIgbW9kdWxlIG5vdyBzZXRzIHRoZSBhbGxvd19yZXVzZV9hZGRyZXNzIGZsYWcgYnkKICBkZWZhdWx0IGluIHRoZSBUQ1BTZXJ2ZXIgY2xhc3MuCgotIEEgbmV3IGZ1bmN0aW9uLCBzeXMuX2dldGZyYW1lKCksIHJldHVybnMgdGhlIHN0YWNrIGZyYW1lIHBvaW50ZXIgb2YKICB0aGUgY2FsbGVyLiAgVGhpcyBpcyBpbnRlbmRlZCBvbmx5IGFzIGEgYnVpbGRpbmcgYmxvY2sgZm9yCiAgaGlnaGVyLWxldmVsIG1lY2hhbmlzbXMgc3VjaCBhcyBzdHJpbmcgaW50ZXJwb2xhdGlvbi4KCi0gVGhlIHB5ZXhwYXQgbW9kdWxlIHN1cHBvcnRzIGEgbnVtYmVyIG9mIG5ldyBoYW5kbGVycywgd2hpY2ggYXJlCiAgYXZhaWxhYmxlIG9ubHkgaW4gZXhwYXQgMS4yLiBJZiBpbnZvY2F0aW9uIG9mIGEgY2FsbGJhY2sgZmFpbHMsIGl0CiAgd2lsbCByZXBvcnQgYW4gYWRkaXRpb25hbCBmcmFtZSBpbiB0aGUgdHJhY2ViYWNrLiBQYXJzZXIgb2JqZWN0cwogIHBhcnRpY2lwYXRlIG5vdyBpbiBnYXJiYWdlIGNvbGxlY3Rpb24uIElmIGV4cGF0IHJlcG9ydHMgYW4gdW5rbm93bgogIGVuY29kaW5nLCBweWV4cGF0IHdpbGwgdHJ5IHRvIHVzZSBhIFB5dGhvbiBjb2RlYzsgdGhhdCB3b3JrcyBvbmx5CiAgZm9yIHNpbmdsZS1ieXRlIGNoYXJzZXRzLiBUaGUgcGFyc2VyIHR5cGUgb2JqZWN0cyBpcyBleHBvc2VkIGFzCiAgWE1MUGFyc2VyT2JqZWN0LgoKLSB4bWwuZG9tIG5vdyBvZmZlcnMgc3RhbmRhcmQgZGVmaW5pdGlvbnMgZm9yIHN5bWJvbGljIG5vZGUgdHlwZSBhbmQKICBleGNlcHRpb24gY29kZSBjb25zdGFudHMsIGFuZCBhIGhpZXJhcmNoeSBvZiBET00gZXhjZXB0aW9ucy4gbWluaWRvbQogIHdhcyBhZGp1c3RlZCB0byB1c2UgdGhlbS4KCi0gVGhlIGNvbmZvcm1hbmNlIG9mIHhtbC5kb20ubWluaWRvbSB0byB0aGUgRE9NIHNwZWNpZmljYXRpb24gd2FzCiAgaW1wcm92ZWQuIEl0IGRldGVjdHMgYSBudW1iZXIgb2YgYWRkaXRpb25hbCBlcnJvciBjYXNlczsgdGhlCiAgcHJldmlvdXMvbmV4dCByZWxhdGlvbnNoaXAgd29ya3MgZXZlbiB3aGVuIHRoZSB0cmVlIGlzIG1vZGlmaWVkOwogIE5vZGUgc3VwcG9ydHMgdGhlIG5vcm1hbGl6ZSgpIG1ldGhvZDsgTmFtZWROb2RlTWFwLCBEb2N1bWVudFR5cGUgYW5kCiAgRE9NSW1wbGVtZW50YXRpb24gY2xhc3NlcyB3ZXJlIGFkZGVkOyBFbGVtZW50IHN1cHBvcnRzIHRoZQogIGhhc0F0dHJpYnV0ZSBhbmQgaGFzQXR0cmlidXRlTlMgbWV0aG9kczsgYW5kIFRleHQgc3VwcG9ydHMgdGhlIHNwbGl0VGV4dAogIG1ldGhvZC4KCkJ1aWxkIGlzc3VlcwoKLSBGb3IgVW5peCAoYW5kIFVuaXgtY29tcGF0aWJsZSkgYnVpbGRzLCBjb25maWd1cmF0aW9uIGFuZCBidWlsZGluZyBvZgogIGV4dGVuc2lvbiBtb2R1bGVzIGlzIG5vdyBncmVhdGx5IGF1dG9tYXRlZC4gIFJhdGhlciB0aGFuIGhhdmluZyB0bwogIGVkaXQgdGhlIE1vZHVsZXMvU2V0dXAgZmlsZSB0byBpbmRpY2F0ZSB3aGljaCBtb2R1bGVzIHNob3VsZCBiZQogIGJ1aWx0IGFuZCB3aGVyZSB0aGVpciBpbmNsdWRlIGZpbGVzIGFuZCBsaWJyYXJpZXMgYXJlLCBhCiAgZGlzdHV0aWxzLWJhc2VkIHNldHVwLnB5IHNjcmlwdCBub3cgdGFrZXMgY2FyZSBvZiBidWlsZGluZyBtb3N0CiAgZXh0ZW5zaW9uIG1vZHVsZXMuICBBbGwgZXh0ZW5zaW9uIG1vZHVsZXMgYnVpbHQgdGhpcyB3YXkgYXJlIGJ1aWx0CiAgYXMgc2hhcmVkIGxpYnJhcmllcy4gIE9ubHkgYSBmZXcgbW9kdWxlcyB0aGF0IG11c3QgYmUgbGlua2VkCiAgc3RhdGljYWxseSBhcmUgc3RpbGwgbGlzdGVkIGluIHRoZSBTZXR1cCBmaWxlOyB5b3Ugd29uJ3QgbmVlZCB0bwogIGVkaXQgdGhlaXIgY29uZmlndXJhdGlvbi4KCi0gUHl0aG9uIHNob3VsZCBub3cgYnVpbGQgb3V0IG9mIHRoZSBib3ggb24gQ3lnd2luLiAgSWYgaXQgZG9lc24ndCwKICBtYWlsIHRvIEphc29uIFRpc2hsZXIgKGpsdDYzIGF0IHVzZXJzLnNvdXJjZWZvcmdlLm5ldCkuCgotIFB5dGhvbiBub3cgYWx3YXlzIHVzZXMgaXRzIG93biAocmVuYW1lZCkgaW1wbGVtZW50YXRpb24gb2YgZ2V0b3B0KCkKICAtLSB0aGVyZSdzIHRvbyBtdWNoIHZhcmlhdGlvbiBhbW9uZyBDIGxpYnJhcnkgZ2V0b3B0KCkKICBpbXBsZW1lbnRhdGlvbnMuCgotIEMrKyBjb21waWxlcnMgYXJlIGJldHRlciBzdXBwb3J0ZWQ7IHRoZSBDWFggbWFjcm8gaXMgYWx3YXlzIHNldCB0byBhCiAgQysrIGNvbXBpbGVyIGlmIG9uZSBpcyBmb3VuZC4KCldpbmRvd3MgY2hhbmdlcwoKLSBzZWxlY3QgbW9kdWxlOiAgQnkgZGVmYXVsdCB1bmRlciBXaW5kb3dzLCBhIHNlbGVjdCgpIGNhbGwKICBjYW4gc3BlY2lmeSBubyBtb3JlIHRoYW4gNjQgc29ja2V0cy4gIFB5dGhvbiBub3cgYm9vc3RzCiAgdGhpcyBNaWNyb3NvZnQgZGVmYXVsdCB0byA1MTIuICBJZiB5b3UgbmVlZCBldmVuIG1vcmUgdGhhbgogIHRoYXQsIHNlZSB0aGUgTVMgZG9jcyAoeW91J2xsIG5lZWQgdG8gI2RlZmluZSBGRF9TRVRTSVpFCiAgYW5kIHJlY29tcGlsZSBQeXRob24gZnJvbSBzb3VyY2UpLgoKLSBTdXBwb3J0IGZvciBXaW5kb3dzIDMuMSwgRE9TIGFuZCBPUy8yIGlzIGdvbmUuICBUaGUgTGliL2Rvcy04eDMKICBzdWJkaXJlY3RvcnkgaXMgbm8gbW9yZSEKCgpXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjA/Cj09PT09PT09PT09PT09PT09PT09PT09PT0KCkJlbG93IGlzIGEgbGlzdCBvZiBhbGwgcmVsZXZhbnQgY2hhbmdlcyBzaW5jZSByZWxlYXNlIDEuNi4gIE9sZGVyCmNoYW5nZXMgYXJlIGluIHRoZSBmaWxlIEhJU1RPUlkuICBJZiB5b3UgYXJlIG1ha2luZyB0aGUganVtcCBkaXJlY3RseQpmcm9tIFB5dGhvbiAxLjUuMiB0byAyLjAsIG1ha2Ugc3VyZSB0byByZWFkIHRoZSBzZWN0aW9uIGZvciAxLjYgaW4gdGhlCkhJU1RPUlkgZmlsZSEgIE1hbnkgaW1wb3J0YW50IGNoYW5nZXMgbGlzdGVkIHRoZXJlLgoKQWx0ZXJuYXRpdmVseSwgYSBnb29kIG92ZXJ2aWV3IG9mIHRoZSBjaGFuZ2VzIGJldHdlZW4gMS41LjIgYW5kIDIuMCBpcwp0aGUgZG9jdW1lbnQgIldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMCIgYnkgS3VjaGxpbmcgYW5kIE1vc2hlIFphZGthOgpodHRwOi8vc3RhcnNoaXAucHl0aG9uLm5ldC9jcmV3L2Ftay9weXRob24vd3JpdGluZy9uZXctcHl0aG9uLy4KCi0tR3VpZG8gdmFuIFJvc3N1bSAoaG9tZSBwYWdlOiBodHRwOi8vd3d3LnB5dGhvbmxhYnMuY29tL35ndWlkby8pCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpXaGF0J3MgbmV3IGluIDIuMCAoc2luY2UgcmVsZWFzZSBjYW5kaWRhdGUgMSk/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClN0YW5kYXJkIGxpYnJhcnkKCi0gVGhlIGNvcHlfcmVnIG1vZHVsZSB3YXMgbW9kaWZpZWQgdG8gY2xhcmlmeSBpdHMgaW50ZW5kZWQgdXNlOiB0bwogIHJlZ2lzdGVyIHBpY2tsZSBzdXBwb3J0IGZvciBleHRlbnNpb24gdHlwZXMsIG5vdCBmb3IgY2xhc3Nlcy4KICBwaWNrbGUoKSB3aWxsIHJhaXNlIGEgVHlwZUVycm9yIGlmIGl0IGlzIHBhc3NlZCBhIGNsYXNzLgoKLSBGaXhlZCBhIGJ1ZyBpbiBnZXR0ZXh0J3MgIm5vcm1hbGl6ZSBhbmQgZXhwYW5kIiBjb2RlIHRoYXQgcHJldmVudGVkCiAgaXQgZnJvbSBmaW5kaW5nIGFuIGV4aXN0aW5nIC5tbyBmaWxlLgoKLSBSZXN0b3JlZCBzdXBwb3J0IGZvciBIVFRQLzAuOSBzZXJ2ZXJzIGluIGh0dHBsaWIuCgotIFRoZSBtYXRoIG1vZHVsZSB3YXMgY2hhbmdlZCB0byBzdG9wIHJhaXNpbmcgT3ZlcmZsb3dFcnJvciBpbiBjYXNlIG9mCiAgdW5kZXJmbG93LCBhbmQgcmV0dXJuIDAgaW5zdGVhZCBpbiB1bmRlcmZsb3cgY2FzZXMuICBXaGV0aGVyIFB5dGhvbgogIHVzZWQgdG8gcmFpc2UgT3ZlcmZsb3dFcnJvciBpbiBjYXNlIG9mIHVuZGVyZmxvdyB3YXMgcGxhdGZvcm0tCiAgZGVwZW5kZW50IChpdCBkaWQgd2hlbiB0aGUgcGxhdGZvcm0gbWF0aCBsaWJyYXJ5IHNldCBlcnJubyB0byBFUkFOR0UKICBvbiB1bmRlcmZsb3cpLgoKLSBGaXhlZCBhIGJ1ZyBpbiBTdHJpbmdJTyB0aGF0IG9jY3VycmVkIHdoZW4gdGhlIGZpbGUgcG9zaXRpb24gd2FzIG5vdAogIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIHdyaXRlKCkgd2FzIGNhbGxlZCB3aXRoIGVub3VnaCBkYXRhIHRvCiAgZXh0ZW5kIHBhc3QgdGhlIGVuZCBvZiB0aGUgZmlsZS4KCi0gRml4ZWQgYSBidWcgdGhhdCBjYXVzZWQgVGtpbnRlciBlcnJvciBtZXNzYWdlcyB0byBnZXQgbG9zdCBvbgogIFdpbmRvd3MuICBUaGUgYnVnIHdhcyBmaXhlZCBieSByZXBsYWNpbmcgZGlyZWN0IHVzZSBvZgogIGludGVycC0+cmVzdWx0IHdpdGggVGNsX0dldFN0cmluZ1Jlc3VsdChpbnRlcnApLgoKLSBGaXhlZCBidWcgaW4gdXJsbGliMiB0aGF0IGNhdXNlZCBpdCB0byBmYWlsIHdoZW4gaXQgcmVjZWl2ZWQgYW4gSFRUUAogIHJlZGlyZWN0IHJlc3BvbnNlLgoKLSBTZXZlcmFsIGNoYW5nZXMgd2VyZSBtYWRlIHRvIGRpc3R1dGlsczogU29tZSBkZWJ1Z2dpbmcgY29kZSB3YXMKICByZW1vdmVkIGZyb20gdXRpbC4gIEZpeGVkIHRoZSBpbnN0YWxsZXIgdXNlZCB3aGVuIGFuIGV4dGVybmFsIHppcAogIHByb2dyYW0gKGxpa2UgV2luWmlwKSBpcyBub3QgZm91bmQ7IHRoZSBzb3VyY2UgY29kZSBmb3IgdGhpcwogIGluc3RhbGxlciBpcyBpbiBNaXNjL2Rpc3R1dGlscy4gIGNoZWNrX2xpYigpIHdhcyBtb2RpZmllZCB0byBiZWhhdmUKICBtb3JlIGxpa2UgQUNfQ0hFQ0tfTElCIGJ5IGFkZCBvdGhlcl9saWJyYXJpZXMoKSBhcyBhIHBhcmFtZXRlci4gIFRoZQogIHRlc3QgZm9yIHdoZXRoZXIgaW5zdGFsbGVkIG1vZHVsZXMgYXJlIG9uIHN5cy5wYXRoIHdhcyBjaGFuZ2VkIHRvCiAgdXNlIGJvdGggbm9ybWNhc2UoKSBhbmQgbm9ybXBhdGgoKS4KCi0gU2V2ZXJhbCBtaW5vciBidWdzIHdlcmUgZml4ZWQgaW4gdGhlIHhtbCBwYWNrYWdlICh0aGUgbWluaWRvbSwKICBwdWxsZG9tLCBleHBhdHJlYWRlciwgYW5kIHNheHV0aWxzIG1vZHVsZXMpLgoKLSBUaGUgcmVncmVzc2lvbiB0ZXN0IGRyaXZlciAocmVncnRlc3QucHkpIGJlaGF2aW9yIHdoZW4gaW52b2tlZCB3aXRoCiAgLWwgY2hhbmdlZDogSXQgbm93IHJlcG9ydHMgYSBjb3VudCBvZiBvYmplY3RzIHRoYXQgYXJlIHJlY29nbml6ZWQgYXMKICBnYXJiYWdlIGJ1dCBub3QgZnJlZWQgYnkgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLgoKLSBUaGUgcmVncmVzc2lvbiB0ZXN0IGZvciB0aGUgbWF0aCBtb2R1bGUgd2FzIGNoYW5nZWQgdG8gdGVzdAogIGV4Y2VwdGlvbmFsIGJlaGF2aW9yIHdoZW4gdGhlIHRlc3QgaXMgcnVuIGluIHZlcmJvc2UgbW9kZS4gIFB5dGhvbgogIGNhbm5vdCB5ZXQgZ3VhcmFudGVlIGNvbnNpc3RlbnQgZXhjZXB0aW9uIGJlaGF2aW9yIGFjcm9zcyBwbGF0Zm9ybXMsCiAgc28gdGhlIGV4Y2VwdGlvbiBwYXJ0IG9mIHRlc3RfbWF0aCBpcyBydW4gb25seSBpbiB2ZXJib3NlIG1vZGUsIGFuZAogIG1heSBmYWlsIG9uIHlvdXIgcGxhdGZvcm0uCgpJbnRlcm5hbHMKCi0gUHlPU19DaGVja1N0YWNrKCkgaGFzIGJlZW4gZGlzYWJsZWQgb24gV2luNjQsIHdoZXJlIGl0IGNhdXNlZAogIHRlc3Rfc3JlIHRvIGZhaWwuCgpCdWlsZCBpc3N1ZXMKCi0gQ2hhbmdlZCBjb21waWxlciBmbGFncywgc28gdGhhdCBnY2MgaXMgYWx3YXlzIGludm9rZWQgd2l0aCAtV2FsbCBhbmQKICAtV3N0cmljdC1wcm90b3R5cGVzLiAgVXNlcnMgY29tcGlsaW5nIFB5dGhvbiB3aXRoIEdDQyBzaG91bGQgc2VlCiAgZXhhY3RseSBvbmUgd2FybmluZywgZXhjZXB0IGlmIHRoZXkgaGF2ZSBwYXNzZWQgY29uZmlndXJlIHRoZQogIC0td2l0aC1weWRlYnVnIGZsYWcuICBUaGUgZXhwZWN0ZWQgd2FybmluZyBpcyBmb3IgZ2V0b3B0KCkgaW4KICBNb2R1bGVzL21haW4uYy4gIFRoaXMgd2FybmluZyB3aWxsIGJlIGZpeGVkIGZvciBQeXRob24gMi4xLgoKLSBGaXhlZCBjb25maWd1cmUgdG8gYWRkIC10aHJlYWRzIGFyZ3VtZW50IGR1cmluZyBsaW5raW5nIG9uIE9TRjEuCgpUb29scyBhbmQgb3RoZXIgbWlzY2VsbGFueQoKLSBUaGUgY29tcGlsZXIgaW4gVG9vbHMvY29tcGlsZXIgd2FzIHVwZGF0ZWQgdG8gc3VwcG9ydCB0aGUgbmV3CiAgbGFuZ3VhZ2UgZmVhdHVyZXMgaW50cm9kdWNlZCBpbiAyLjA6IGV4dGVuZGVkIHByaW50IHN0YXRlbWVudCwgbGlzdAogIGNvbXByZWhlbnNpb25zLCBhbmQgYXVnbWVudGVkIGFzc2lnbm1lbnRzLiAgVGhlIG5ldyBjb21waWxlciBzaG91bGQKICBhbHNvIGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDEuNS4yOyB0aGUgY29tcGlsZXIgd2lsbAogIGFsd2F5cyBnZW5lcmF0ZSBjb2RlIGZvciB0aGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJwcmV0ZXIgaXQgcnVucwogIHVuZGVyLgoKV2hhdCdzIG5ldyBpbiAyLjAgcmVsZWFzZSBjYW5kaWRhdGUgMSAoc2luY2UgYmV0YSAyKT8KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCldoYXQgaXMgcmVsZWFzZSBjYW5kaWRhdGUgMT8KCldlIGJlbGlldmUgdGhhdCByZWxlYXNlIGNhbmRpZGF0ZSAxIHdpbGwgZml4IGFsbCBrbm93biBidWdzIHRoYXQgd2UKaW50ZW5kIHRvIGZpeCBmb3IgdGhlIDIuMCBmaW5hbCByZWxlYXNlLiAgVGhpcyByZWxlYXNlIHNob3VsZCBiZSBhIGJpdAptb3JlIHN0YWJsZSB0aGFuIHRoZSBwcmV2aW91cyBiZXRhcy4gIFdlIHdvdWxkIGxpa2UgdG8gc2VlIGV2ZW4gbW9yZQp3aWRlc3ByZWFkIHRlc3RpbmcgYmVmb3JlIHRoZSBmaW5hbCByZWxlYXNlLCBzbyB3ZSBhcmUgcHJvZHVjaW5nIHRoaXMKcmVsZWFzZSBjYW5kaWRhdGUuICBUaGUgZmluYWwgcmVsZWFzZSB3aWxsIGJlIGV4YWN0bHkgdGhlIHNhbWUgdW5sZXNzCmFueSBzaG93LXN0b3BwaW5nIChvciBicm93biBiYWcpIGJ1Z3MgYXJlIGZvdW5kIGJ5IHRlc3RlcnMgb2YgdGhlCnJlbGVhc2UgY2FuZGlkYXRlLgoKQWxsIHRoZSBjaGFuZ2VzIHNpbmNlIHRoZSBsYXN0IGJldGEgcmVsZWFzZSBhcmUgYnVnIGZpeGVzIG9yIGNoYW5nZXMKdG8gc3VwcG9ydCBidWlsZGluZyBQeXRob24gZm9yIHNwZWNpZmljIHBsYXRmb3Jtcy4KCkNvcmUgbGFuZ3VhZ2UsIGJ1aWx0aW5zLCBhbmQgaW50ZXJwcmV0ZXIKCi0gQSBidWcgdGhhdCBjYXVzZWQgY3Jhc2hlcyB3aGVuIF9fY29lcmNlX18gd2FzIHVzZWQgd2l0aCBhdWdtZW50ZWQKICBhc3NpZ25tZW50LCBlLmcuICs9LCB3YXMgZml4ZWQuCgotIFJhaXNlIFplcm9EaXZpc2lvbkVycm9yIHdoZW4gcmFpc2luZyB6ZXJvIHRvIGEgbmVnYXRpdmUgbnVtYmVyLAogIGUuZy4gMC4wICoqIC0yLjAuICBOb3RlIHRoYXQgbWF0aC5wb3cgaXMgdW5yZWxhdGVkIHRvIHRoZSBidWlsdGluCiAgcG93ZXIgb3BlcmF0b3IgYW5kIHRoZSByZXN1bHQgb2YgbWF0aC5wb3coMC4wLCAtMi4wKSB3aWxsIHZhcnkgYnkKICBwbGF0Zm9ybS4gIE9uIExpbnV4LCBpdCByYWlzZXMgYSBWYWx1ZUVycm9yLgoKLSBBIGJ1ZyBpbiBVbmljb2RlIHN0cmluZyBpbnRlcnBvbGF0aW9uIHdhcyBmaXhlZCB0aGF0IG9jY2FzaW9uYWxseQogIGNhdXNlZCBlcnJvcnMgd2l0aCBmb3JtYXRzIGluY2x1ZGluZyAiJSUiLiAgRm9yIGV4YW1wbGUsIHRoZQogIGZvbGxvd2luZyBleHByZXNzaW9uICIlJSAlcyIgJSB1ImFiYyIgbm8gbG9uZ2VyIHJhaXNlcyBhIFR5cGVFcnJvci4KCi0gQ29tcGlsYXRpb24gb2YgZGVlcGx5IG5lc3RlZCBleHByZXNzaW9ucyByYWlzZXMgTWVtb3J5RXJyb3IgaW5zdGVhZAogIG9mIFN5bnRheEVycm9yLCBlLmcuIGV2YWwoIlsiICogNTAgKyAiXSIgKiA1MCkuCgotIEluIDIuMGIyIG9uIFdpbmRvd3MsIHRoZSBpbnRlcnByZXRlciB3cm90ZSAucHljIGZpbGVzIGluIHRleHQgbW9kZSwKICByZW5kZXJpbmcgdGhlbSB1c2VsZXNzLiAgVGhleSBhcmUgbm93IHdyaXR0ZW4gaW4gYmluYXJ5IG1vZGUgYWdhaW4uCgpTdGFuZGFyZCBsaWJyYXJ5CgotIEtleXdvcmQgYXJndW1lbnRzIGFyZSBub3cgYWNjZXB0ZWQgZm9yIG1vc3QgcGF0dGVybiBhbmQgbWF0Y2ggb2JqZWN0CiAgbWV0aG9kcyBpbiBTUkUsIHRoZSBzdGFuZGFyZCByZWd1bGFyIGV4cHJlc3Npb24gZW5naW5lLgoKLSBJbiBTUkUsIGZpeGVkIGVycm9yIHdpdGggbmVnYXRpdmUgbG9va2FoZWFkIGFuZCBsb29rYmVoaW5kIHRoYXQKICBtYW5pZmVzdGVkIGl0c2VsZiBhcyBhIHJ1bnRpbWUgZXJyb3IgaW4gcGF0dGVybnMgbGlrZSAiKD88IWFiYykoZGVmKSIuCgotIFNldmVyYWwgYnVncyBpbiB0aGUgVW5pY29kZSBoYW5kbGluZyBhbmQgZXJyb3IgaGFuZGxpbmcgaW4gX3RraW50ZXIKICB3ZXJlIGZpeGVkLgoKLSBGaXggbWVtb3J5IG1hbmFnZW1lbnQgZXJyb3JzIGluIE1lcmdlKCkgYW5kIFRrYXBwX0NhbGwoKSByb3V0aW5lcy4KCi0gU2V2ZXJhbCBjaGFuZ2VzIHdlcmUgbWFkZSB0byBjU3RyaW5nSU8gdG8gbWFrZSBpdCBjb21wYXRpYmxlIHdpdGgKICB0aGUgZmlsZS1saWtlIG9iamVjdCBpbnRlcmZhY2UgYW5kIHdpdGggU3RyaW5nSU8uICBJZiBvcGVyYXRpb25zIGFyZQogIHBlcmZvcm1lZCBvbiBhIGNsb3NlZCBvYmplY3QsIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQuICBUaGUgdHJ1bmNhdGUKICBtZXRob2Qgbm93IGFjY2VwdHMgYSBwb3NpdGlvbiBhcmd1bWVudCBhbmQgcmVhZGxpbmUgYWNjZXB0cyBhIHNpemUKICBhcmd1bWVudC4KCi0gVGhlcmUgd2VyZSBtYW55IGNoYW5nZXMgbWFkZSB0byB0aGUgbGludXhhdWRpb2RldiBtb2R1bGUgYW5kIGl0cwogIHRlc3Qgc3VpdGU7IGFzIGEgcmVzdWx0LCBhIHNob3J0LCB1bmV4cGVjdGVkIGF1ZGlvIHNhbXBsZSBzaG91bGQgbm93CiAgcGxheSB3aGVuIHRoZSByZWdyZXNzaW9uIHRlc3QgaXMgcnVuLgoKICBOb3RlIHRoYXQgdGhpcyBtb2R1bGUgaXMgbmFtZWQgcG9vcmx5LCBiZWNhdXNlIGl0IHNob3VsZCB3b3JrCiAgY29ycmVjdGx5IG9uIGFueSBwbGF0Zm9ybSB0aGF0IHN1cHBvcnRzIHRoZSBPcGVuIFNvdW5kIFN5c3RlbQogIChPU1MpLgoKICBUaGUgbW9kdWxlIG5vdyByYWlzZXMgZXhjZXB0aW9ucyB3aGVuIGVycm9ycyBvY2N1ciBpbnN0ZWFkIG9mCiAgY3Jhc2hpbmcuICBJdCBhbHNvIGRlZmluZXMgdGhlIEFGTVRfQV9MQVcgZm9ybWF0IChsb2dhcml0aG1pYyBBLWxhdwogIGF1ZGlvKSBhbmQgZGVmaW5lcyBhIGdldHB0cigpIG1ldGhvZCB0aGF0IGNhbGxzIHRoZQogIFNORENUTF9EU1BfR0VUeFBUUiBpb2N0bCBkZWZpbmVkIGluIHRoZSBPU1MgUHJvZ3JhbW1lcidzIEd1aWRlLgoKLSBUaGUgbGlicmFyeV92ZXJzaW9uIGF0dHJpYnV0ZSwgaW50cm9kdWNlZCBpbiBhbiBlYXJsaWVyIGJldGEsIHdhcwogIHJlbW92ZWQgYmVjYXVzZSBpdCBjYW4gbm90IGJlIHN1cHBvcnRlZCB3aXRoIGVhcmx5IHZlcnNpb25zIG9mIHRoZSBDCiAgcmVhZGxpbmUgbGlicmFyeSwgd2hpY2ggcHJvdmlkZXMgbm8gd2F5IHRvIGRldGVybWluZSB0aGUgdmVyc2lvbiBhdAogIGNvbXBpbGUtdGltZS4KCi0gVGhlIGJpbmFzY2lpIG1vZHVsZSBpcyBub3cgZW5hYmxlZCBvbiBXaW42NC4KCi0gdG9rZW5pemUucHkgbm8gbG9uZ2VyIHN1ZmZlcnMgInJlY3Vyc2lvbiBkZXB0aCIgZXJyb3JzIHdoZW4gcGFyc2luZwogIHByb2dyYW1zIHdpdGggdmVyeSBsb25nIHN0cmluZyBsaXRlcmFscy4KCkludGVybmFscwoKLSBGaXhlZCBzZXZlcmFsIGJ1ZmZlciBvdmVyZmxvdyB2dWxuZXJhYmlsaXRpZXMgaW4gY2FsY3VsYXRlX3BhdGgoKSwKICB3aGljaCBpcyBjYWxsZWQgd2hlbiB0aGUgaW50ZXJwcmV0ZXIgc3RhcnRzIHVwIHRvIGRldGVybWluZSB3aGVyZQogIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGlzIGluc3RhbGxlZC4gIFRoZXNlIHZ1bG5lcmFiaWxpdGllcyBhZmZlY3QgYWxsCiAgcHJldmlvdXMgdmVyc2lvbnMgb2YgUHl0aG9uIGFuZCBjYW4gYmUgZXhwbG9pdGVkIGJ5IHNldHRpbmcgdmVyeQogIGxvbmcgdmFsdWVzIGZvciBQWVRIT05IT01FIG9yIGFyZ3ZbMF0uICBUaGUgcmlzayBpcyBncmVhdGVzdCBmb3IgYQogIHNldHVpZCBQeXRob24gc2NyaXB0LCBhbHRob3VnaCB1c2Ugb2YgdGhlIHdyYXBwZXIgaW4KICBNaXNjL3NldHVpZC1wcm9nLmMgd2lsbCBlbGltaW5hdGUgdGhlIHZ1bG5lcmFiaWxpdHkuCgotIEZpeGVkIGdhcmJhZ2UgY29sbGVjdGlvbiBidWdzIGluIGluc3RhbmNlIGNyZWF0aW9uIHRoYXQgd2VyZQogIHRyaWdnZXJlZCB3aGVuIGVycm9ycyBvY2N1cnJlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uICBUaGUgc29sdXRpb24sCiAgYXBwbGllZCBpbiBjUGlja2xlIGFuZCBpbiBQeUluc3RhbmNlX05ldygpLCBpcyB0byBjYWxsCiAgUHlPYmplY3RfR0NfSW5pdCgpIGFmdGVyIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgb2JqZWN0J3MKICBjb250YWluZXIgYXR0cmlidXRlcyBpcyBjb21wbGV0ZS4KCi0gcHlleHBhdCBhZGRzIGRlZmluaXRpb25zIG9mIFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50IGFuZAogIFB5TW9kdWxlX0FkZE9iamVjdCBpZiB0aGUgUHl0aG9uIHZlcnNpb24gaXMgbGVzcyB0aGFuIDIuMCwgd2hpY2gKICBwcm92aWRlcyBjb21wYXRpYmlsaXR5IHdpdGggUHlYTUwgb24gUHl0aG9uIDEuNS4yLgoKLSBJZiB0aGUgcGxhdGZvcm0gaGFzIGEgYm9ndXMgZGVmaW5pdGlvbiBmb3IgTE9OR19CSVQgKHRoZSBudW1iZXIgb2YKICBiaXRzIGluIGEgbG9uZyksIGFuIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgYXQgY29tcGlsZSB0aW1lLgoKLSBGaXggYnVncyBpbiBfUHlUdXBsZV9SZXNpemUoKSB3aGljaCBjYXVzZWQgaGFyZC10by1pbnRlcnByZXQgZ2FyYmFnZQogIGNvbGxlY3Rpb24gY3Jhc2hlcyBhbmQgcG9zc2libHkgb3RoZXIsIHVucmVwb3J0ZWQgY3Jhc2hlcy4KCi0gRml4ZWQgYSBtZW1vcnkgbGVhayBpbiBfUHlVbmljb2RlX0ZpbmkoKS4KCkJ1aWxkIGlzc3VlcwoKLSBjb25maWd1cmUgbm93IGFjY2VwdHMgYSAtLXdpdGgtc3VmZml4IG9wdGlvbiB0aGF0IHNwZWNpZmllcyB0aGUKICBleGVjdXRhYmxlIHN1ZmZpeC4gIFRoaXMgaXMgdXNlZnVsIGZvciBidWlsZHMgb24gQ3lnd2luIGFuZCBNYWMgT1MKICBYLCBmb3IgZXhhbXBsZS4KCi0gVGhlIG1tYXAuUEFHRVNJWkUgY29uc3RhbnQgaXMgbm93IGluaXRpYWxpemVkIHVzaW5nIHN5c2NvbmYgd2hlbgogIHBvc3NpYmxlLCB3aGljaCBlbGltaW5hdGVzIGEgZGVwZW5kZW5jeSBvbiAtbHVjYiBmb3IgUmVsaWFudCBVTklYLgoKLSBUaGUgbWQ1IGZpbGUgc2hvdWxkIG5vdyBjb21waWxlIG9uIGFsbCBwbGF0Zm9ybXMuCgotIFRoZSBzZWxlY3QgbW9kdWxlIG5vdyBjb21waWxlcyBvbiBwbGF0Zm9ybXMgdGhhdCBkbyBub3QgZGVmaW5lCiAgUE9MTFJETk9STSBhbmQgcmVsYXRlZCBjb25zdGFudHMuCgotIERhcndpbiAoTWFjIE9TIFgpOiAgSW5pdGlhbCBzdXBwb3J0IGZvciBzdGF0aWMgYnVpbGRzIG9uIHRoaXMKICBwbGF0Zm9ybS4KCi0gQmVPUzogQSBudW1iZXIgb2YgY2hhbmdlcyB3ZXJlIG1hZGUgdG8gdGhlIGJ1aWxkIGFuZCBpbnN0YWxsYXRpb24KICBwcm9jZXNzLiAgYXItZmFrZSBub3cgb3BlcmF0ZXMgb24gYSBkaXJlY3Rvcnkgb2Ygb2JqZWN0IGZpbGVzLgogIGRsX2V4cG9ydC5oIGlzIGdvbmUsIGFuZCBpdHMgbWFjcm9zIG5vdyBhcHBlYXIgb24gdGhlIG13Y2MgY29tbWFuZAogIGxpbmUgZHVyaW5nIGJ1aWxkIG9uIFBQQyBCZU9TLgoKLSBQbGF0Zm9ybSBkaXJlY3RvcnkgaW4gbGliL3B5dGhvbjIuMCBpcyAicGxhdC1iZW9zNSIgKG9yCiAgInBsYXQtYmVvczQiLCBpZiBidWlsZGluZyBvbiBCZU9TIDQuNSksIHJhdGhlciB0aGFuICJwbGF0LWJlb3MiLgoKLSBDeWd3aW46IFN1cHBvcnQgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIFRraW50ZXIsIGFuZCBzb2NrZXRzLgoKLSBTdW5PUyA0LjEuNF9KTDogRml4IHRlc3QgZm9yIGRpcmVjdG9yeSBleGlzdGVuY2UgaW4gY29uZmlndXJlLgoKVG9vbHMgYW5kIG90aGVyIG1pc2NlbGxhbnkKCi0gUmVtb3ZlZCBkZWJ1Z2dpbmcgcHJpbnRzIGZyb20gbWFpbiB1c2VkIHdpdGggZnJlZXplLgoKLSBJRExFIGF1dG8taW5kZW50IG5vIGxvbmdlciBjcmFzaGVzIHdoZW4gaXQgZW5jb3VudGVycyBVbmljb2RlCiAgY2hhcmFjdGVycy4KCldoYXQncyBuZXcgaW4gMi4wIGJldGEgMiAoc2luY2UgYmV0YSAxKT8KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQ29yZSBsYW5ndWFnZSwgYnVpbHRpbnMsIGFuZCBpbnRlcnByZXRlcgoKLSBBZGQgc3VwcG9ydCBmb3IgdW5ib3VuZGVkIGludHMgaW4gJWQsaSx1LHgsWCxvIGZvcm1hdHM7IGZvciBleGFtcGxlCiAgIiVkIiAlIDJMKio2NCA9PSAiMTg0NDY3NDQwNzM3MDk1NTE2MTYiLgoKLSBBZGQgLWggYW5kIC1WIGNvbW1hbmQgbGluZSBvcHRpb25zIHRvIHByaW50IHRoZSB1c2FnZSBtZXNzYWdlIGFuZAogIFB5dGhvbiB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdCBpbW1lZGlhdGVseS4KCi0gZXZhbCgpIGFuZCBleGVjIGFjY2VwdCBVbmljb2RlIG9iamVjdHMgYXMgY29kZSBwYXJhbWV0ZXJzLgoKLSBnZXRhdHRyKCkgYW5kIHNldGF0dHIoKSBub3cgYWxzbyBhY2NlcHQgVW5pY29kZSBvYmplY3RzIGZvciB0aGUKICBhdHRyaWJ1dGUgbmFtZSwgd2hpY2ggYXJlIGNvbnZlcnRlZCB0byBzdHJpbmdzIHVzaW5nIHRoZSBkZWZhdWx0CiAgZW5jb2RpbmcgYmVmb3JlIGxvb2t1cC4KCi0gTXVsdGlwbGljYXRpb24gb24gc3RyaW5nIGFuZCBVbmljb2RlIG5vdyBkb2VzIHByb3BlciBib3VuZHMKICBjaGVja2luZzsgZS5nLiAnYScgKiA2NTUzNiAqIDY1NTM2IHdpbGwgcmFpc2UgVmFsdWVFcnJvciwgInJlcGVhdGVkCiAgc3RyaW5nIGlzIHRvbyBsb25nLiIKCi0gQmV0dGVyIGVycm9yIG1lc3NhZ2Ugd2hlbiBjb250aW51ZSBpcyBmb3VuZCBpbiB0cnkgc3RhdGVtZW50IGluIGEKICBsb29wLgoKClN0YW5kYXJkIGxpYnJhcnkgYW5kIGV4dGVuc2lvbnMKCi0gc29ja2V0IG1vZHVsZTogdGhlIE9wZW5TU0wgY29kZSBub3cgYWRkcyBzdXBwb3J0IGZvciBSQU5EX3N0YXR1cygpCiAgYW5kIEVHRCAoRW50cm9weSBHYXRoZXJpbmcgRGV2aWNlKS4KCi0gYXJyYXk6IHJldmVyc2UoKSBtZXRob2Qgb2YgYXJyYXkgbm93IHdvcmtzLiAgYnVmZmVyX2luZm8oKSBub3cgZG9lcwogIGFyZ3VtZW50IGNoZWNraW5nOyBpdCBzdGlsbCB0YWtlcyBubyBhcmd1bWVudHMuCgotIGFzeW5jb3JlL2FzeW5jaGF0OiBJbmNsdWRlZCBtb3N0IHJlY2VudCB2ZXJzaW9uIGZyb20gU2FtIFJ1c2hpbmcuCgotIGNnaTogQWNjZXB0ICcmJyBvciAnOycgYXMgc2VwYXJhdG9yIGNoYXJhY3RlcnMgd2hlbiBwYXJzaW5nIGZvcm0gZGF0YS4KCi0gQ0dJSFRUUFNlcnZlcjogTm93IHdvcmtzIG9uIFdpbmRvd3MgKGFuZCBwZXJoYXBzIGV2ZW4gTWFjKS4KCi0gQ29uZmlnUGFyc2VyOiBXaGVuIHJlYWRpbmcgdGhlIGZpbGUsIG9wdGlvbnMgc3BlbGxlZCBpbiB1cHBlciBjYXNlCiAgbGV0dGVycyBhcmUgbm93IGNvcnJlY3RseSBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLgoKLSBjb3B5OiBDb3B5IFVuaWNvZGUgb2JqZWN0cyBhdG9taWNhbGx5LgoKLSBjUGlja2xlOiBGYWlsIGdyYWNlZnVsbHkgd2hlbiBjb3B5X3JlZyBjYW4ndCBiZSBpbXBvcnRlZC4KCi0gY1N0cmluZ0lPOiBJbXBsZW1lbnRlZCByZWFkbGluZXMoKSBtZXRob2QuCgotIGRibTogQWRkIGdldCgpIGFuZCBzZXRkZWZhdWx0KCkgbWV0aG9kcyB0byBkYm0gb2JqZWN0LiAgQWRkIGNvbnN0YW50CiAgYGxpYnJhcnknIHRvIG1vZHVsZSB0aGF0IG5hbWVzIHRoZSBsaWJyYXJ5IHVzZWQuICBBZGRlZCBkb2Mgc3RyaW5ncwogIGFuZCBtZXRob2QgbmFtZXMgdG8gZXJyb3IgbWVzc2FnZXMuICBVc2VzIGNvbmZpZ3VyZSB0byBkZXRlcm1pbmUKICB3aGljaCBuZGJtLmggZmlsZSB0byBpbmNsdWRlOyBCZXJrZWxleSBEQidzIG5iZG0gYW5kIEdEQk0ncyBuZGJtIGlzCiAgbm93IGF2YWlsYWJsZSBvcHRpb25zLgoKLSBkaXN0dXRpbHM6IFVwZGF0ZSB0byB2ZXJzaW9uIDAuOS4zLgoKLSBkbDogQWRkIHNldmVyYWwgZGwuUlRMRF8gY29uc3RhbnRzLgoKLSBmcGVjdGw6IE5vdyBzdXBwb3J0ZWQgb24gRnJlZUJTRC4KCi0gZ2M6IEFkZCBERUJVR19TQVZFQUxMIG9wdGlvbi4gIFdoZW4gZW5hYmxlZCBhbGwgZ2FyYmFnZSBvYmplY3RzCiAgZm91bmQgYnkgdGhlIGNvbGxlY3RvciB3aWxsIGJlIHNhdmVkIGluIGdjLmdhcmJhZ2UuICBUaGlzIGlzIHVzZWZ1bAogIGZvciBkZWJ1Z2dpbmcgYSBwcm9ncmFtIHRoYXQgY3JlYXRlcyByZWZlcmVuY2UgY3ljbGVzLgoKLSBodHRwbGliOiBUaHJlZSBjaGFuZ2VzOiBSZXN0b3JlIHN1cHBvcnQgZm9yIHNldF9kZWJ1Z2xldmVsIGZlYXR1cmUKICBvZiBIVFRQIGNsYXNzLiAgRG8gbm90IGNsb3NlIHNvY2tldCBvbiB6ZXJvLWxlbmd0aCByZXNwb25zZS4gIERvIG5vdAogIGNyYXNoIHdoZW4gc2VydmVyIHNlbmRzIGludmFsaWQgY29udGVudC1sZW5ndGggaGVhZGVyLgoKLSBtYWlsYm94OiBNYWlsYm94IGNsYXNzIGNvbmZvcm1zIGJldHRlciB0byBxbWFpbCBzcGVjaWZpY2F0aW9ucy4KCi0gbWFyc2hhbDogV2hlbiByZWFkaW5nIGEgc2hvcnQsIHNpZ24tZXh0ZW5kIG9uIHBsYXRmb3JtcyB3aGVyZSBzaG9ydHMKICBhcmUgYmlnZ2VyIHRoYW4gMTYgYml0cy4gIFdoZW4gcmVhZGluZyBhIGxvbmcsIHJlcGFpciB0aGUgdW5wb3J0YWJsZQogIHNpZ24gZXh0ZW5zaW9uIHRoYXQgd2FzIGJlaW5nIGRvbmUgZm9yIDY0LWJpdCBtYWNoaW5lcy4gIChJdCBhc3N1bWVkCiAgdGhhdCBzaWduZWQgcmlnaHQgc2hpZnQgc2lnbi1leHRlbmRzLikKCi0gb3BlcmF0b3I6IEFkZCBjb250YWlucygpLCBpbnZlcnQoKSwgX19pbnZlcnRfXygpIGFzIGFsaWFzZXMgZm9yCiAgX19jb250YWluc19fKCksIGludigpLCBhbmQgX19pbnZfXygpIHJlc3BlY3RpdmVseS4KCi0gb3M6IEFkZCBzdXBwb3J0IGZvciBwb3BlbjIoKSBhbmQgcG9wZW4zKCkgb24gYWxsIHBsYXRmb3JtcyB3aGVyZQogIGZvcmsoKSBleGlzdHMuICAocG9wZW40KCkgaXMgc3RpbGwgaW4gdGhlIHdvcmtzLikKCi0gb3M6IChXaW5kb3dzIG9ubHk6KSBBZGQgc3RhcnRmaWxlKCkgZnVuY3Rpb24gdGhhdCBhY3RzIGxpa2UgZG91YmxlLQogIGNsaWNraW5nIG9uIGEgZmlsZSBpbiBFeHBsb3JlciAob3IgcGFzc2luZyB0aGUgZmlsZSBuYW1lIHRvIHRoZQogIERPUyAic3RhcnQiIGNvbW1hbmQpLgoKLSBvcy5wYXRoOiAoV2luZG93cywgRE9TOikgVHJlYXQgdHJhaWxpbmcgY29sb24gY29ycmVjdGx5IGluCiAgb3MucGF0aC5qb2luLiAgb3MucGF0aC5qb2luKCJhOiIsICJiIikgeWllbGRzICJhOmIiLgoKLSBwaWNrbGU6IE5vdyByYWlzZXMgVmFsdWVFcnJvciB3aGVuIGFuIGludmFsaWQgcGlja2xlIHRoYXQgY29udGFpbnMKICBhIG5vbi1zdHJpbmcgcmVwciB3aGVyZSBhIHN0cmluZyByZXByIHdhcyBleHBlY3RlZC4gIFRoaXMgYmVoYXZpb3IKICBtYXRjaGVzIGNQaWNrbGUuCgotIHBvc2l4ZmlsZTogUmVtb3ZlIGJyb2tlbiBfX2RlbF9fKCkgbWV0aG9kLgoKLSBweV9jb21waWxlOiBzdXBwb3J0IENSK0xGIGxpbmUgdGVybWluYXRvcnMgaW4gc291cmNlIGZpbGUuCgotIHJlYWRsaW5lOiBEb2VzIG5vdCBpbW1lZGlhdGVseSBleGl0IHdoZW4gXkMgaXMgaGl0IHdoZW4gcmVhZGxpbmUgYW5kCiAgdGhyZWFkcyBhcmUgY29uZmlndXJlZC4gIEFkZHMgZGVmaW5pdGlvbiBvZiBybF9saWJyYXJ5X3ZlcnNpb24uICAoVGhlCiAgbGF0dGVyIGFkZGl0aW9uIHJlcXVpcmVzIEdOVSByZWFkbGluZSAyLjIgb3IgbGF0ZXIuKQoKLSByZmM4MjI6IERvbWFpbiBsaXRlcmFscyByZXR1cm5lZCBieSBBZGRybGlzdENsYXNzIG1ldGhvZAogIGdldGRvbWFpbmxpdGVyYWwoKSBhcmUgbm93IHByb3Blcmx5IHdyYXBwZWQgaW4gYnJhY2tldHMuCgotIHNpdGU6IHN5cy5zZXRkZWZhdWx0ZW5jb2RpbmcoKSBzaG91bGQgb25seSBiZSBjYWxsZWQgaW4gY2FzZSB0aGUKICBzdGFuZGFyZCBkZWZhdWx0IGVuY29kaW5nICgiYXNjaWkiKSBpcyBjaGFuZ2VkLiBUaGlzIHNhdmVzIHF1aXRlIGEKICBmZXcgY3ljbGVzIGR1cmluZyBzdGFydHVwIHNpbmNlIHRoZSBmaXJzdCBjYWxsIHRvCiAgc2V0ZGVmYXVsdGVuY29kaW5nKCkgd2lsbCBpbml0aWFsaXplIHRoZSBjb2RlYyByZWdpc3RyeSBhbmQgdGhlCiAgZW5jb2RpbmdzIHBhY2thZ2UuCgotIHNvY2tldDogU3VwcG9ydCBmb3Igc2l6ZSBoaW50IGluIHJlYWRsaW5lcygpIG1ldGhvZCBvZiBvYmplY3QgcmV0dXJuZWQKICBieSBtYWtlZmlsZSgpLgoKLSBzcmU6IEFkZGVkIGV4cGVyaW1lbnRhbCBleHBhbmQoKSBtZXRob2QgdG8gbWF0Y2ggb2JqZWN0cy4gIERvZXMgbm90CiAgdXNlIGJ1ZmZlciBpbnRlcmZhY2Ugb24gVW5pY29kZSBzdHJpbmdzLiAgRG9lcyBub3QgaGFuZyBpZiBncm91cCBpZAogIGlzIGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2UuCgotIFN0cmluZ0lPOiBTaXplIGhpbnQgaW4gcmVhZGxpbmVzKCkgaXMgbm93IHN1cHBvcnRlZCBhcyBkb2N1bWVudGVkLgoKLSBzdHJ1Y3Q6IENoZWNrIHJhbmdlcyBmb3IgYnl0ZXMgYW5kIHNob3J0cy4KCi0gdXJsbGliOiBJbXByb3ZlZCBoYW5kbGluZyBvZiB3aW4zMiBwcm94eSBzZXR0aW5ncy4gRml4ZWQgcXVvdGUgYW5kCiAgcXVvdGVfcGx1cyBmdW5jdGlvbnMgc28gdGhhdCB0aGUgYWx3YXlzIGVuY29kZSBhIGNvbW1hLgoKLSBUa2ludGVyOiBJbWFnZSBvYmplY3RzIGFyZSBub3cgZ3VhcmFudGVlZCB0byBoYXZlIHVuaXF1ZSBpZHMuICBTZXQKICBldmVudC5kZWx0YSB0byB6ZXJvIGlmIFRrIHZlcnNpb24gZG9lc24ndCBzdXBwb3J0IG1vdXNld2hlZWwuCiAgUmVtb3ZlZCBzb21lIGRlYnVnZ2luZyBwcmludHMuCgotIFVzZXJMaXN0OiBub3cgaW1wbGVtZW50cyBfX2NvbnRhaW5zX18oKS4KCi0gd2ViYnJvd3NlcjogT24gV2luZG93cywgdXNlIG9zLnN0YXJ0ZmlsZSgpIGluc3RlYWQgb2Ygb3MucG9wZW4oKSwKICB3aGljaCB3b3JrcyBhcm91bmQgYSBidWcgaW4gTm9ydG9uIEFudGlWaXJ1cyAyMDAwIHRoYXQgbGVhZHMgZGlyZWN0bHkKICB0byBhIEJsdWUgU2NyZWVuIGZyZWV6ZS4KCi0geG1sOiBOZXcgdmVyc2lvbiBkZXRlY3Rpb24gY29kZSBhbGxvd3MgUHlYTUwgdG8gb3ZlcnJpZGUgc3RhbmRhcmQKICBYTUwgcGFja2FnZSBpZiBQeVhNTCB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiAwLjYuMS4KCi0geG1sLmRvbTogRE9NIGxldmVsIDEgc3VwcG9ydCBmb3IgYmFzaWMgWE1MLiAgSW5jbHVkZXMgeG1sLmRvbS5taW5pZG9tCiAgKGNvbnZlbnRpb25hbCBET00pLCBhbmQgeG1sLmRvbS5wdWxsZG9tLCB3aGljaCBhbGxvd3MgYnVpbGRpbmcgdGhlIERPTQogIHRyZWUgb25seSBmb3Igbm9kZXMgd2hpY2ggYXJlIHN1ZmZpY2llbnRseSBpbnRlcmVzdGluZyB0byBhIHNwZWNpZmljCiAgYXBwbGljYXRpb24uICBEb2VzIG5vdCBwcm92aWRlIHRoZSBIVE1MLXNwZWNpZmljIGV4dGVuc2lvbnMuICBTdGlsbAogIHVuZG9jdW1lbnRlZC4KCi0geG1sLnNheDogU0FYIDIgc3VwcG9ydCBmb3IgUHl0aG9uLCBpbmNsdWRpbmcgYWxsIHRoZSBoYW5kbGVyCiAgaW50ZXJmYWNlcyBuZWVkZWQgdG8gcHJvY2VzcyBYTUwgMS4wIGNvbXBsaWFudCBYTUwuICBTb21lCiAgZG9jdW1lbnRhdGlvbiBpcyBhbHJlYWR5IGF2YWlsYWJsZS4KCi0gcHlleHBhdDogUmVuYW1lZCB0byB4bWwucGFyc2Vycy5leHBhdCBzaW5jZSB0aGlzIGlzIHBhcnQgb2YgdGhlIG5ldywKICBwYWNrYWdpemVkIFhNTCBzdXBwb3J0LgoKCkMgQVBJCgotIEFkZCB0aHJlZSBuZXcgY29udmVuaWVuY2UgZnVuY3Rpb25zIGZvciBtb2R1bGUgaW5pdGlhbGl6YXRpb24gLS0KICBQeU1vZHVsZV9BZGRPYmplY3QoKSwgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQoKSwgYW5kCiAgUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQoKS4KCi0gQ2xlYW5lZCB1cCBkZWZpbml0aW9uIG9mIE5VTEwgaW4gQyBzb3VyY2UgY29kZTsgYWxsIGRlZmluaXRpb25zIHdlcmUKICByZW1vdmVkIGFuZCBhZGQgI2Vycm9yIHRvIFB5dGhvbi5oIGlmIE5VTEwgaXNuJ3QgZGVmaW5lZCBhZnRlcgogICNpbmNsdWRlIG9mIHN0ZGlvLmguCgotIFB5X1BST1RPKCkgbWFjcm9zIHRoYXQgd2VyZSByZW1vdmVkIGluIDIuMGIxIGhhdmUgYmVlbiByZXN0b3JlZCBmb3IKICBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAoYXQgdGhlIHNvdXJjZSBsZXZlbCkgd2l0aCBvbGQgZXh0ZW5zaW9ucy4KCi0gQSB3cmFwcGVyIEFQSSB3YXMgYWRkZWQgZm9yIHNpZ25hbCgpIGFuZCBzaWdhY3Rpb24oKS4gIEluc3RlYWQgb2YKICBlaXRoZXIgZnVuY3Rpb24sIGFsd2F5cyB1c2UgUHlPU19nZXRzaWcoKSB0byBnZXQgYSBzaWduYWwgaGFuZGxlcgogIGFuZCBQeU9TX3NldHNpZygpIHRvIHNldCBvbmUuICBBIG5ldyBjb252ZW5pZW5jZSB0eXBlZGVmCiAgUHlPU19zaWdoYW5kbGVyX3QgaXMgZGVmaW5lZCBmb3IgdGhlIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzLgoKLSBBZGQgUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKCkgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlCiAgaW50ZXJuYWwgZGF0YSBidWZmZXIgYW5kIHNpemUgb2YgYSBzdHJpbmcgb2JqZWN0IC0tIG9yIHRoZSBkZWZhdWx0CiAgZW5jb2RlZCB2ZXJzaW9uIG9mIGEgVW5pY29kZSBvYmplY3QuCgotIFB5U3RyaW5nX1NpemUoKSBhbmQgUHlTdHJpbmdfQXNTdHJpbmcoKSBhY2NlcHQgVW5pY29kZSBvYmplY3RzLgoKLSBUaGUgc3RhbmRhcmQgaGVhZGVyIDxsaW1pdHMuaD4gaXMgbm93IGluY2x1ZGVkIGJ5IFB5dGhvbi5oIChpZiBpdAogIGV4aXN0cykuICBJTlRfTUFYIGFuZCBMT05HX01BWCB3aWxsIGFsd2F5cyBiZSBkZWZpbmVkLCBldmVuIGlmCiAgPGxpbWl0cy5oPiBpcyBub3QgYXZhaWxhYmxlLgoKLSBQeUZsb2F0X0Zyb21TdHJpbmcgdGFrZXMgYSBzZWNvbmQgYXJndW1lbnQsIHBlbmQsIHRoYXQgd2FzCiAgZWZmZWN0aXZlbHkgdXNlbGVzcy4gIEl0IGlzIG5vdyBvZmZpY2lhbGx5IHVzZWxlc3MgYnV0IHByZXNlcnZlZCBmb3IKICBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gIElmIHRoZSBwZW5kIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCAqcGVuZCBpcwogIHNldCB0byBOVUxMLgoKLSBQeU9iamVjdF9HZXRBdHRyKCkgYW5kIFB5T2JqZWN0X1NldEF0dHIoKSBub3cgYWNjZXB0IFVuaWNvZGUgb2JqZWN0cwogIGZvciB0aGUgYXR0cmlidXRlIG5hbWUuICBTZWUgbm90ZSBvbiBnZXRhdHRyKCkgYWJvdmUuCgotIEEgZmV3IGJ1ZyBmaXhlcyB0byBhcmd1bWVudCBwcm9jZXNzaW5nIGZvciBVbmljb2RlLgogIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcygpIG5vdyBhY2NlcHRzICJlcyMiIGFuZCAiZXMiLgogIFB5QXJnX1BhcnNlKCkgc3BlY2lhbCBjYXNlcyAicyMiIGZvciBVbmljb2RlIG9iamVjdHM7IGl0IHJldHVybnMgYQogIHBvaW50ZXIgdG8gdGhlIGRlZmF1bHQgZW5jb2RlZCBzdHJpbmcgZGF0YSBpbnN0ZWFkIG9mIHRvIHRoZSByYXcKICBVVEYtMTYuCgotIFB5X0J1aWxkVmFsdWUgYWNjZXB0cyBCIGZvcm1hdCAoZm9yIGJnZW4tZ2VuZXJhdGVkIGNvZGUpLgoKCkludGVybmFscwoKLSBPbiBVbml4LCBmaXggY29kZSBmb3IgZmluZGluZyBQeXRob24gaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBzbyB0aGF0CiAgaXQgd29ya3Mgd2hlbiBhcmd2WzBdIGlzIGEgcmVsYXRpdmUgcGF0aC4KCi0gQWRkZWQgYSB0cnVlIHVuaWNvZGVfaW50ZXJuYWxfZW5jb2RlKCkgZnVuY3Rpb24gYW5kIGZpeGVkIHRoZQogIHVuaWNvZGVfaW50ZXJuYWxfZGVjb2RlIGZ1bmN0aW9uKCkgdG8gc3VwcG9ydCBVbmljb2RlIG9iamVjdHMgZGlyZWN0bHkKICByYXRoZXIgdGhhbiBieSBnZW5lcmF0aW5nIGEgY29weSBvZiB0aGUgb2JqZWN0LgoKLSBTZXZlcmFsIG9mIHRoZSBpbnRlcm5hbCBVbmljb2RlIHRhYmxlcyBhcmUgbXVjaCBzbWFsbGVyIG5vdywgYW5kCiAgdGhlIHNvdXJjZSBjb2RlIHNob3VsZCBiZSBtdWNoIGZyaWVuZGxpZXIgdG8gd2Vha2VyIGNvbXBpbGVycy4KCi0gSW4gdGhlIGdhcmJhZ2UgY29sbGVjdG9yOiBGaXhlZCBidWcgaW4gY29sbGVjdGlvbiBvZiB0dXBsZXMuICBGaXhlZAogIGJ1ZyB0aGF0IGNhdXNlZCBzb21lIGluc3RhbmNlcyB0byBiZSByZW1vdmVkIGZyb20gdGhlIGNvbnRhaW5lciBzZXQKICB3aGlsZSB0aGV5IHdlcmUgc3RpbGwgbGl2ZS4gIEZpeGVkIHBhcnNpbmcgaW4gZ2Muc2V0X2RlYnVnKCkgZm9yCiAgcGxhdGZvcm1zIHdoZXJlIHNpemVvZihsb25nKSA+IHNpemVvZihpbnQpLgoKLSBGaXhlZCByZWZjb3VudCBwcm9ibGVtIGluIGluc3RhbmNlIGRlYWxsb2NhdGlvbiB0aGF0IG9ubHkgb2NjdXJyZWQKICB3aGVuIFB5X1JFRl9ERUJVRyB3YXMgZGVmaW5lZCBhbmQgUHlfVFJBQ0VfUkVGUyB3YXMgbm90LgoKLSBPbiBXaW5kb3dzLCBnZXRweXRob25yZWdwYXRoIGlzIG5vdyBwcm90ZWN0ZWQgYWdhaW5zdCBudWxsIGRhdGEgaW4KICByZWdpc3RyeSBrZXkuCgotIE9uIFVuaXgsIGNyZWF0ZSAucHljLy5weW8gZmlsZXMgd2l0aCBPX0VYQ0wgZmxhZyB0byBhdm9pZCBhIHJhY2UKICBjb25kaXRpb24uCgoKQnVpbGQgYW5kIHBsYXRmb3JtLXNwZWNpZmljIGlzc3VlcwoKLSBCZXR0ZXIgc3VwcG9ydCBvZiBHTlUgUHRoIHZpYSAtLXdpdGgtcHRoIGNvbmZpZ3VyZSBvcHRpb24uCgotIFB5dGhvbi9DIEFQSSBub3cgcHJvcGVybHkgZXhwb3NlZCB0byBkeW5hbWljYWxseS1sb2FkZWQgZXh0ZW5zaW9uCiAgbW9kdWxlcyBvbiBSZWxpYW50IFVOSVguCgotIENoYW5nZXMgZm9yIHRoZSBiZW5lZml0IG9mIFN1bk9TIDQuMS40IChyZWFsbHkhKS4gIG1tYXBtb2R1bGUuYzoKICBEb24ndCBkZWZpbmUgTVNfU1lOQyB0byBiZSB6ZXJvIHdoZW4gaXQgaXMgdW5kZWZpbmVkLiAgQWRkZWQgbWlzc2luZwogIHByb3RvdHlwZXMgaW4gcG9zaXhtb2R1bGUuYy4KCi0gSW1wcm92ZWQgc3VwcG9ydCBmb3IgSFAtVVggYnVpbGQuICBUaHJlYWRzIHNob3VsZCBub3cgYmUgY29ycmVjdGx5CiAgY29uZmlndXJlZCAob24gSFAtVVggMTAuMjAgYW5kIDExLjAwKS4KCi0gRml4IGxhcmdlZmlsZSBzdXBwb3J0IG9uIG9sZGVyIE5ldEJTRCBzeXN0ZW1zIGFuZCBPcGVuQlNEIGJ5IGFkZGluZwogIGRlZmluZSBmb3IgVEVMTDY0LgoKClRvb2xzIGFuZCBvdGhlciBtaXNjZWxsYW55CgotIGZ0cG1pcnJvcjogQ2FsbCB0byBtYWluKCkgaXMgd3JhcHBlZCBpbiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iLgoKLSBmcmVlemU6IFRoZSBtb2R1bGVmaW5kZXIgbm93IHdvcmtzIHdpdGggMi4wIG9wY29kZXMuCgotIElETEU6CiAgTW92ZSBoYWNrZXJ5IG9mIHN5cy5hcmd2IHVudGlsIGFmdGVyIHRoZSBUayBpbnN0YW5jZSBoYXMgYmVlbgogIGNyZWF0ZWQsIHdoaWNoIGFsbG93cyB0aGUgYXBwbGljYXRpb24tc3BlY2lmaWMgVGtpbnRlcgogIGluaXRpYWxpemF0aW9uIHRvIGJlIGV4ZWN1dGVkIGlmIHByZXNlbnQ7IGFsc28gcGFzcyBhbiBleHBsaWNpdAogIGNsYXNzTmFtZSBwYXJhbWV0ZXIgdG8gdGhlIFRrKCkgY29uc3RydWN0b3IuCgoKV2hhdCdzIG5ldyBpbiAyLjAgYmV0YSAxPwo9PT09PT09PT09PT09PT09PT09PT09PT09CgpTb3VyY2UgSW5jb21wYXRpYmlsaXRpZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpOb25lLiAgTm90ZSB0aGF0IDEuNiBpbnRyb2R1Y2VkIHNldmVyYWwgaW5jb21wYXRpYmlsaXRpZXMgd2l0aCAxLjUuMiwKc3VjaCBhcyBzaW5nbGUtYXJndW1lbnQgYXBwZW5kKCksIGNvbm5lY3QoKSBhbmQgYmluZCgpLCBhbmQgY2hhbmdlcyB0bwpzdHIobG9uZykgYW5kIHJlcHIoZmxvYXQpLgoKCkJpbmFyeSBJbmNvbXBhdGliaWxpdGllcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi0gVGhpcmQgcGFydHkgZXh0ZW5zaW9ucyBidWlsdCBmb3IgUHl0aG9uIDEuNS54IG9yIDEuNiBjYW5ub3QgYmUgdXNlZAp3aXRoIFB5dGhvbiAyLjA7IHRoZXNlIGV4dGVuc2lvbnMgd2lsbCBoYXZlIHRvIGJlIHJlYnVpbHQgZm9yIFB5dGhvbgoyLjAuCgotIE9uIFdpbmRvd3MsIGF0dGVtcHRpbmcgdG8gaW1wb3J0IGEgdGhpcmQgcGFydHkgZXh0ZW5zaW9uIGJ1aWx0IGZvcgpQeXRob24gMS41Lnggb3IgMS42IHJlc3VsdHMgaW4gYW4gaW1tZWRpYXRlIGNyYXNoOyB0aGVyZSdzIG5vdCBtdWNoIHdlCmNhbiBkbyBhYm91dCB0aGlzLiAgQ2hlY2sgeW91ciBQWVRIT05QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIQoKLSBQeXRob24gYnl0ZWNvZGUgZmlsZXMgKCoucHljIGFuZCAqLnB5bykgYXJlIG5vdCBjb21wYXRpYmxlIGJldHdlZW4KcmVsZWFzZXMuCgoKT3ZlcnZpZXcgb2YgQ2hhbmdlcyBTaW5jZSAxLjYKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClRoZXJlIGFyZSBtYW55IG5ldyBtb2R1bGVzIChpbmNsdWRpbmcgYnJhbmQgbmV3IFhNTCBzdXBwb3J0IHRocm91Z2gKdGhlIHhtbCBwYWNrYWdlLCBhbmQgaTE4biBzdXBwb3J0IHRocm91Z2ggdGhlIGdldHRleHQgbW9kdWxlKTsgYSBsaXN0Cm9mIGFsbCBuZXcgbW9kdWxlcyBpcyBpbmNsdWRlZCBiZWxvdy4gIExvdHMgb2YgYnVncyBoYXZlIGJlZW4gZml4ZWQuCgpUaGUgcHJvY2VzcyBmb3IgbWFraW5nIG1ham9yIG5ldyBjaGFuZ2VzIHRvIHRoZSBsYW5ndWFnZSBoYXMgY2hhbmdlZApzaW5jZSBQeXRob24gMS42LiAgRW5oYW5jZW1lbnRzIG11c3Qgbm93IGJlIGRvY3VtZW50ZWQgYnkgYSBQeXRob24KRW5oYW5jZW1lbnQgUHJvcG9zYWwgKFBFUCkgYmVmb3JlIHRoZXkgY2FuIGJlIGFjY2VwdGVkLgoKVGhlcmUgYXJlIHNldmVyYWwgaW1wb3J0YW50IHN5bnRheCBlbmhhbmNlbWVudHMsIGRlc2NyaWJlZCBpbiBtb3JlCmRldGFpbCBiZWxvdzoKCiAgLSBBdWdtZW50ZWQgYXNzaWdubWVudCwgZS5nLiB4ICs9IDEKCiAgLSBMaXN0IGNvbXByZWhlbnNpb25zLCBlLmcuIFt4KioyIGZvciB4IGluIHJhbmdlKDEwKV0KCiAgLSBFeHRlbmRlZCBpbXBvcnQgc3RhdGVtZW50LCBlLmcuIGltcG9ydCBNb2R1bGUgYXMgTmFtZQoKICAtIEV4dGVuZGVkIHByaW50IHN0YXRlbWVudCwgZS5nLiBwcmludCA+PiBmaWxlLCAiSGVsbG8iCgpPdGhlciBpbXBvcnRhbnQgY2hhbmdlczoKCiAgLSBPcHRpb25hbCBjb2xsZWN0aW9uIG9mIGN5Y2xpY2FsIGdhcmJhZ2UKClB5dGhvbiBFbmhhbmNlbWVudCBQcm9wb3NhbCAoUEVQKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClBFUCBzdGFuZHMgZm9yIFB5dGhvbiBFbmhhbmNlbWVudCBQcm9wb3NhbC4gIEEgUEVQIGlzIGEgZGVzaWduCmRvY3VtZW50IHByb3ZpZGluZyBpbmZvcm1hdGlvbiB0byB0aGUgUHl0aG9uIGNvbW11bml0eSwgb3IgZGVzY3JpYmluZwphIG5ldyBmZWF0dXJlIGZvciBQeXRob24uICBUaGUgUEVQIHNob3VsZCBwcm92aWRlIGEgY29uY2lzZSB0ZWNobmljYWwKc3BlY2lmaWNhdGlvbiBvZiB0aGUgZmVhdHVyZSBhbmQgYSByYXRpb25hbGUgZm9yIHRoZSBmZWF0dXJlLgoKV2UgaW50ZW5kIFBFUHMgdG8gYmUgdGhlIHByaW1hcnkgbWVjaGFuaXNtcyBmb3IgcHJvcG9zaW5nIG5ldwpmZWF0dXJlcywgZm9yIGNvbGxlY3RpbmcgY29tbXVuaXR5IGlucHV0IG9uIGFuIGlzc3VlLCBhbmQgZm9yCmRvY3VtZW50aW5nIHRoZSBkZXNpZ24gZGVjaXNpb25zIHRoYXQgaGF2ZSBnb25lIGludG8gUHl0aG9uLiAgVGhlIFBFUAphdXRob3IgaXMgcmVzcG9uc2libGUgZm9yIGJ1aWxkaW5nIGNvbnNlbnN1cyB3aXRoaW4gdGhlIGNvbW11bml0eSBhbmQKZG9jdW1lbnRpbmcgZGlzc2VudGluZyBvcGluaW9ucy4KClRoZSBQRVBzIGFyZSBhdmFpbGFibGUgYXQgaHR0cDovL3B5dGhvbi5zb3VyY2Vmb3JnZS5uZXQvcGVwcy8uCgpBdWdtZW50ZWQgQXNzaWdubWVudAotLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhpcyBtdXN0IGhhdmUgYmVlbiB0aGUgbW9zdC1yZXF1ZXN0ZWQgZmVhdHVyZSBvZiB0aGUgcGFzdCB5ZWFycyEKRWxldmVuIG5ldyBhc3NpZ25tZW50IG9wZXJhdG9ycyB3ZXJlIGFkZGVkOgoKICAgICs9IC09ICo9IC89ICU9ICoqPSA8PD0gPj49ICY9IF49IHw9CgpGb3IgZXhhbXBsZSwKCiAgICBBICs9IEIKCmlzIHNpbWlsYXIgdG8KCiAgICBBID0gQSArIEIKCmV4Y2VwdCB0aGF0IEEgaXMgZXZhbHVhdGVkIG9ubHkgb25jZSAocmVsZXZhbnQgd2hlbiBBIGlzIHNvbWV0aGluZwpsaWtlIGRpY3RbaW5kZXhdLmF0dHIpLgoKSG93ZXZlciwgaWYgQSBpcyBhIG11dGFibGUgb2JqZWN0LCBBIG1heSBiZSBtb2RpZmllZCBpbiBwbGFjZS4gIFRodXMsCmlmIEEgaXMgYSBudW1iZXIgb3IgYSBzdHJpbmcsIEEgKz0gQiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIEEgPSBBK0IKKGV4Y2VwdCBBIGlzIG9ubHkgZXZhbHVhdGVkIG9uY2UpOyBidXQgaWYgYSBpcyBhIGxpc3QsIEEgKz0gQiBoYXMgdGhlCnNhbWUgZWZmZWN0IGFzIEEuZXh0ZW5kKEIpIQoKQ2xhc3NlcyBhbmQgYnVpbHQtaW4gb2JqZWN0IHR5cGVzIGNhbiBvdmVycmlkZSB0aGUgbmV3IG9wZXJhdG9ycyBpbgpvcmRlciB0byBpbXBsZW1lbnQgdGhlIGluLXBsYWNlIGJlaGF2aW9yOyB0aGUgbm90LWluLXBsYWNlIGJlaGF2aW9yIGlzCnVzZWQgYXV0b21hdGljYWxseSBhcyBhIGZhbGxiYWNrIHdoZW4gYW4gb2JqZWN0IGRvZXNuJ3QgaW1wbGVtZW50IHRoZQppbi1wbGFjZSBiZWhhdmlvci4gIEZvciBjbGFzc2VzLCB0aGUgbWV0aG9kIG5hbWUgaXMgZGVyaXZlZCBmcm9tIHRoZQptZXRob2QgbmFtZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgbm90LWluLXBsYWNlIG9wZXJhdG9yIGJ5IGluc2VydGluZwphbiAnaScgaW4gZnJvbnQgb2YgdGhlIG5hbWUsIGUuZy4gX19pYWRkX18gaW1wbGVtZW50cyBpbi1wbGFjZQpfX2FkZF9fLgoKQXVnbWVudGVkIGFzc2lnbm1lbnQgd2FzIGltcGxlbWVudGVkIGJ5IFRob21hcyBXb3V0ZXJzLgoKCkxpc3QgQ29tcHJlaGVuc2lvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhpcyBpcyBhIGZsZXhpYmxlIG5ldyBub3RhdGlvbiBmb3IgbGlzdHMgd2hvc2UgZWxlbWVudHMgYXJlIGNvbXB1dGVkCmZyb20gYW5vdGhlciBsaXN0IChvciBsaXN0cykuICBUaGUgc2ltcGxlc3QgZm9ybSBpczoKCiAgICBbPGV4cHJlc3Npb24+IGZvciA8dmFyaWFibGU+IGluIDxzZXF1ZW5jZT5dCgpGb3IgZXhhbXBsZSwgW2kqKjIgZm9yIGkgaW4gcmFuZ2UoNCldIHlpZWxkcyB0aGUgbGlzdCBbMCwgMSwgNCwgOV0uClRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBhIGZvciBsb29wIHdpdGggYSBsaXN0LmFwcGVuZCgpIGNhbGwuCgpZb3UgY2FuIGFsc28gYWRkIGEgY29uZGl0aW9uOgoKICAgIFs8ZXhwcmVzc2lvbj4gZm9yIDx2YXJpYWJsZT4gaW4gPHNlcXVlbmNlPiBpZiA8Y29uZGl0aW9uPl0KCkZvciBleGFtcGxlLCBbdyBmb3IgdyBpbiB3b3JkcyBpZiB3ID09IHcubG93ZXIoKV0gd291bGQgeWllbGQgdGhlIGxpc3QKb2Ygd29yZHMgdGhhdCBjb250YWluIG5vIHVwcGVyY2FzZSBjaGFyYWN0ZXJzLiAgVGhpcyBpcyBtb3JlIGVmZmljaWVudAp0aGFuIGEgZm9yIGxvb3Agd2l0aCBhbiBpZiBzdGF0ZW1lbnQgYW5kIGEgbGlzdC5hcHBlbmQoKSBjYWxsLgoKWW91IGNhbiBhbHNvIGhhdmUgbmVzdGVkIGZvciBsb29wcyBhbmQgbW9yZSB0aGFuIG9uZSAnaWYnIGNsYXVzZS4gIEZvcgpleGFtcGxlLCBoZXJlJ3MgYSBmdW5jdGlvbiB0aGF0IGZsYXR0ZW5zIGEgc2VxdWVuY2Ugb2Ygc2VxdWVuY2VzOjoKCiAgICBkZWYgZmxhdHRlbihzZXEpOgogICAgICAgIHJldHVybiBbeCBmb3Igc3Vic2VxIGluIHNlcSBmb3IgeCBpbiBzdWJzZXFdCgogICAgZmxhdHRlbihbWzBdLCBbMSwyLDNdLCBbNCw1XSwgWzYsNyw4LDldLCBbXV0pCgpUaGlzIHByaW50cwoKICAgIFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XQoKTGlzdCBjb21wcmVoZW5zaW9ucyBvcmlnaW5hdGVkIGFzIGEgcGF0Y2ggc2V0IGZyb20gR3JlZyBFd2luZzsgU2tpcApNb250YW5hcm8gYW5kIFRob21hcyBXb3V0ZXJzIGFsc28gY29udHJpYnV0ZWQuICBEZXNjcmliZWQgYnkgUEVQIDIwMi4KCgpFeHRlbmRlZCBJbXBvcnQgU3RhdGVtZW50Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCk1hbnkgcGVvcGxlIGhhdmUgYXNrZWQgZm9yIGEgd2F5IHRvIGltcG9ydCBhIG1vZHVsZSB1bmRlciBhIGRpZmZlcmVudApuYW1lLiAgVGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkIGxpa2UgdGhpczoKCiAgICBpbXBvcnQgZm9vCiAgICBiYXIgPSBmb28KICAgIGRlbCBmb28KCmJ1dCB0aGlzIGNvbW1vbiBpZGlvbSBnZXRzIG9sZCBxdWlja2x5LiAgQSBzaW1wbGUgZXh0ZW5zaW9uIG9mIHRoZQppbXBvcnQgc3RhdGVtZW50IG5vdyBhbGxvd3MgdGhpcyB0byBiZSB3cml0dGVuIGFzIGZvbGxvd3M6CgogICAgaW1wb3J0IGZvbyBhcyBiYXIKClRoZXJlJ3MgYWxzbyBhIHZhcmlhbnQgZm9yICdmcm9tIC4uLiBpbXBvcnQnOgoKICAgIGZyb20gZm9vIGltcG9ydCBiYXIgYXMgc3BhbQoKVGhpcyBhbHNvIHdvcmtzIHdpdGggcGFja2FnZXM7IGUuZy4geW91IGNhbiB3cml0ZSB0aGlzOgoKICAgIGltcG9ydCB0ZXN0LnJlZ3J0ZXN0IGFzIHJlZ3J0ZXN0CgpOb3RlIHRoYXQgJ2FzJyBpcyBub3QgYSBuZXcga2V5d29yZCAtLSBpdCBpcyByZWNvZ25pemVkIG9ubHkgaW4gdGhpcwpjb250ZXh0ICh0aGlzIGlzIG9ubHkgcG9zc2libGUgYmVjYXVzZSB0aGUgc3ludGF4IGZvciB0aGUgaW1wb3J0CnN0YXRlbWVudCBkb2Vzbid0IGludm9sdmUgZXhwcmVzc2lvbnMpLgoKSW1wbGVtZW50ZWQgYnkgVGhvbWFzIFdvdXRlcnMuICBEZXNjcmliZWQgYnkgUEVQIDIyMS4KCgpFeHRlbmRlZCBQcmludCBTdGF0ZW1lbnQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpFYXNpbHkgdGhlIG1vc3QgY29udHJvdmVyc2lhbCBuZXcgZmVhdHVyZSwgdGhpcyBleHRlbnNpb24gdG8gdGhlIHByaW50CnN0YXRlbWVudCBhZGRzIGFuIG9wdGlvbiB0byBtYWtlIHRoZSBvdXRwdXQgZ28gdG8gYSBkaWZmZXJlbnQgZmlsZQp0aGFuIHRoZSBkZWZhdWx0IHN5cy5zdGRvdXQuCgpGb3IgZXhhbXBsZSwgdG8gd3JpdGUgYW4gZXJyb3IgbWVzc2FnZSB0byBzeXMuc3RkZXJyLCB5b3UgY2FuIG5vdwp3cml0ZToKCiAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiRXJyb3I6IGJhZCBkb2chIgoKQXMgYSBzcGVjaWFsIGZlYXR1cmUsIGlmIHRoZSBleHByZXNzaW9uIHVzZWQgdG8gaW5kaWNhdGUgdGhlIGZpbGUKZXZhbHVhdGVzIHRvIE5vbmUsIHRoZSBjdXJyZW50IHZhbHVlIG9mIHN5cy5zdGRvdXQgaXMgdXNlZC4gIFRodXM6CgogICAgcHJpbnQgPj4gTm9uZSwgIkhlbGxvIHdvcmxkIgoKaXMgZXF1aXZhbGVudCB0bwoKICAgIHByaW50ICJIZWxsbyB3b3JsZCIKCkRlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkgQmFycnkgV2Fyc2F3LiAgRGVzY3JpYmVkIGJ5IFBFUCAyMTQuCgoKT3B0aW9uYWwgQ29sbGVjdGlvbiBvZiBDeWNsaWNhbCBHYXJiYWdlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKUHl0aG9uIGlzIG5vdyBlcXVpcHBlZCB3aXRoIGEgZ2FyYmFnZSBjb2xsZWN0b3IgdGhhdCBjYW4gaHVudCBkb3duCmN5Y2xpY2FsIHJlZmVyZW5jZXMgYmV0d2VlbiBQeXRob24gb2JqZWN0cy4gIEl0J3Mgbm8gcmVwbGFjZW1lbnQgZm9yCnJlZmVyZW5jZSBjb3VudGluZzsgaW4gZmFjdCwgaXQgZGVwZW5kcyBvbiB0aGUgcmVmZXJlbmNlIGNvdW50cyBiZWluZwpjb3JyZWN0LCBhbmQgZGVjaWRlcyB0aGF0IGEgc2V0IG9mIG9iamVjdHMgYmVsb25nIHRvIGEgY3ljbGUgaWYgYWxsCnRoZWlyIHJlZmVyZW5jZSBjb3VudHMgY2FuIGJlIGFjY291bnRlZCBmb3IgZnJvbSB0aGVpciByZWZlcmVuY2VzIHRvCmVhY2ggb3RoZXIuICBUaGlzIGRldmlvdXMgc2NoZW1lIHdhcyBmaXJzdCBwcm9wb3NlZCBieSBFcmljIFRpZWRlbWFubiwKYW5kIGJyb3VnaHQgdG8gaW1wbGVtZW50YXRpb24gYnkgTmVpbCBTY2hlbWVuYXVlci4KClRoZXJlJ3MgYSBtb2R1bGUgImdjIiB0aGF0IGxldHMgeW91IGNvbnRyb2wgc29tZSBwYXJhbWV0ZXJzIG9mIHRoZQpnYXJiYWdlIGNvbGxlY3Rpb24uICBUaGVyZSdzIGFsc28gYW4gb3B0aW9uIHRvIHRoZSBjb25maWd1cmUgc2NyaXB0CnRoYXQgbGV0cyB5b3UgZW5hYmxlIG9yIGRpc2FibGUgdGhlIGdhcmJhZ2UgY29sbGVjdGlvbi4gIEluIDIuMGIxLAppdCdzIG9uIGJ5IGRlZmF1bHQsIHNvIHRoYXQgd2UgKGhvcGVmdWxseSkgY2FuIGNvbGxlY3QgZGVjZW50IHVzZXIKZXhwZXJpZW5jZSB3aXRoIHRoaXMgbmV3IGZlYXR1cmUuICBUaGVyZSBhcmUgc29tZSBxdWVzdGlvbnMgYWJvdXQgaXRzCnBlcmZvcm1hbmNlLiAgSWYgaXQgcHJvdmVzIHRvIGJlIHRvbyBtdWNoIG9mIGEgcHJvYmxlbSwgd2UnbGwgdHVybiBpdApvZmYgYnkgZGVmYXVsdCBpbiB0aGUgZmluYWwgMi4wIHJlbGVhc2UuCgoKU21hbGxlciBDaGFuZ2VzCi0tLS0tLS0tLS0tLS0tLQoKQSBuZXcgZnVuY3Rpb24gemlwKCkgd2FzIGFkZGVkLiAgemlwKHNlcTEsIHNlcTIsIC4uLikgaXMgZXF1aXZhbGVudCB0bwptYXAoTm9uZSwgc2VxMSwgc2VxMiwgLi4uKSB3aGVuIHRoZSBzZXF1ZW5jZXMgaGF2ZSB0aGUgc2FtZSBsZW5ndGg7CmkuZS4gemlwKFsxLDIsM10sIFsxMCwyMCwzMF0pIHJldHVybnMgWygxLDEwKSwgKDIsMjApLCAoMywzMCldLiAgV2hlbgp0aGUgbGlzdHMgYXJlIG5vdCBhbGwgdGhlIHNhbWUgbGVuZ3RoLCB0aGUgc2hvcnRlc3QgbGlzdCB3aW5zOgp6aXAoWzEsMiwzXSwgWzEwLDIwXSkgcmV0dXJucyBbKDEsMTApLCAoMiwyMCldLiAgU2VlIFBFUCAyMDEuCgpzeXMudmVyc2lvbl9pbmZvIGlzIGEgdHVwbGUgKG1ham9yLCBtaW5vciwgbWljcm8sIGxldmVsLCBzZXJpYWwpLgoKRGljdGlvbmFyaWVzIGhhdmUgYW4gb2RkIG5ldyBtZXRob2QsIHNldGRlZmF1bHQoa2V5LCBkZWZhdWx0KS4KZGljdC5zZXRkZWZhdWx0KGtleSwgZGVmYXVsdCkgcmV0dXJucyBkaWN0W2tleV0gaWYgaXQgZXhpc3RzOyBpZiBub3QsCml0IHNldHMgZGljdFtrZXldIHRvIGRlZmF1bHQgYW5kIHJldHVybnMgdGhhdCB2YWx1ZS4gIFRodXM6CgogICAgZGljdC5zZXRkZWZhdWx0KGtleSwgW10pLmFwcGVuZChpdGVtKQoKZG9lcyB0aGUgc2FtZSB3b3JrIGFzIHRoaXMgY29tbW9uIGlkaW9tOgoKICAgIGlmIG5vdCBkaWN0Lmhhc19rZXkoa2V5KToKICAgICAgICBkaWN0W2tleV0gPSBbXQogICAgZGljdFtrZXldLmFwcGVuZChpdGVtKQoKVGhlcmUgYXJlIHR3byBuZXcgdmFyaWFudHMgb2YgU3ludGF4RXJyb3IgdGhhdCBhcmUgcmFpc2VkIGZvcgppbmRlbnRhdGlvbi1yZWxhdGVkIGVycm9yczogSW5kZW50YXRpb25FcnJvciBhbmQgVGFiRXJyb3IuCgpDaGFuZ2VkIFx4IHRvIGNvbnN1bWUgZXhhY3RseSB0d28gaGV4IGRpZ2l0czsgc2VlIFBFUCAyMjMuICBBZGRlZCBcVQplc2NhcGUgdGhhdCBjb25zdW1lcyBleGFjdGx5IGVpZ2h0IGhleCBkaWdpdHMuCgpUaGUgbGltaXRzIG9uIHRoZSBzaXplIG9mIGV4cHJlc3Npb25zIGFuZCBmaWxlIGluIFB5dGhvbiBzb3VyY2UgY29kZQpoYXZlIGJlZW4gcmFpc2VkIGZyb20gMioqMTYgdG8gMioqMzIuICBQcmV2aW91cyB2ZXJzaW9ucyBvZiBQeXRob24Kd2VyZSBsaW1pdGVkIGJlY2F1c2UgdGhlIG1heGltdW0gYXJndW1lbnQgc2l6ZSB0aGUgUHl0aG9uIFZNIGFjY2VwdGVkCndhcyAyKioxNi4gIFRoaXMgbGltaXRlZCB0aGUgc2l6ZSBvZiBvYmplY3QgY29uc3RydWN0b3IgZXhwcmVzc2lvbnMsCmUuZy4gWzEsMiwzXSBvciB7J2EnOjEsICdiJzoyfSwgYW5kIHRoZSBzaXplIG9mIHNvdXJjZSBmaWxlcy4gIFRoaXMKbGltaXQgd2FzIHJhaXNlZCB0aGFua3MgdG8gYSBwYXRjaCBieSBDaGFybGVzIFdhbGRtYW4gdGhhdCBlZmZlY3RpdmVseQpmaXhlcyB0aGUgcHJvYmxlbS4gIEl0IGlzIG5vdyBtdWNoIG1vcmUgbGlrZWx5IHRoYXQgeW91IHdpbGwgYmUKbGltaXRlZCBieSBhdmFpbGFibGUgbWVtb3J5IHRoYW4gYnkgYW4gYXJiaXRyYXJ5IGxpbWl0IGluIFB5dGhvbi4KClRoZSBpbnRlcnByZXRlcidzIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoIGNhbiBiZSBtb2RpZmllZCBieSBQeXRob24KcHJvZ3JhbXMgdXNpbmcgc3lzLmdldHJlY3Vyc2lvbmxpbWl0IGFuZCBzeXMuc2V0cmVjdXJzaW9ubGltaXQuICBUaGlzCmxpbWl0IGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZWN1cnNpdmUgY2FsbHMgdGhhdCBjYW4gYmUgbWFkZSBieQpQeXRob24gY29kZS4gIFRoZSBsaW1pdCBleGlzdHMgdG8gcHJldmVudCBpbmZpbml0ZSByZWN1cnNpb24gZnJvbQpvdmVyZmxvd2luZyB0aGUgQyBzdGFjayBhbmQgY2F1c2luZyBhIGNvcmUgZHVtcC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzCjEwMDAuICBUaGUgbWF4aW11bSBzYWZlIHZhbHVlIGZvciBhIHBhcnRpY3VsYXIgcGxhdGZvcm0gY2FuIGJlIGZvdW5kCmJ5IHJ1bm5pbmcgTWlzYy9maW5kX3JlY3Vyc2lvbmxpbWl0LnB5LgoKTmV3IE1vZHVsZXMgYW5kIFBhY2thZ2VzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYXRleGl0IC0gZm9yIHJlZ2lzdGVyaW5nIGZ1bmN0aW9ucyB0byBiZSBjYWxsZWQgd2hlbiBQeXRob24gZXhpdHMuCgppbXB1dGlsIC0gR3JlZyBTdGVpbidzIGFsdGVybmF0aXZlIEFQSSBmb3Igd3JpdGluZyBjdXN0b20gaW1wb3J0Cmhvb2tzLgoKcHlleHBhdCAtIGFuIGludGVyZmFjZSB0byB0aGUgRXhwYXQgWE1MIHBhcnNlciwgY29udHJpYnV0ZWQgYnkgUGF1bApQcmVzY29kLgoKeG1sIC0gYSBuZXcgcGFja2FnZSB3aXRoIFhNTCBzdXBwb3J0IGNvZGUgb3JnYW5pemVkIChzbyBmYXIpIGluIHRocmVlCnN1YnBhY2thZ2VzOiB4bWwuZG9tLCB4bWwuc2F4LCBhbmQgeG1sLnBhcnNlcnMuICBEZXNjcmliaW5nIHRoZXNlCndvdWxkIGZpbGwgYSB2b2x1bWUuICBUaGVyZSdzIGEgc3BlY2lhbCBmZWF0dXJlIHdoZXJlYnkgYQp1c2VyLWluc3RhbGxlZCBwYWNrYWdlIG5hbWVkIF94bWxwbHVzIG92ZXJyaWRlcyB0aGUgc3RhbmRhcmQKeG1scGFja2FnZTsgdGhpcyBpcyBpbnRlbmRlZCB0byBnaXZlIHRoZSBYTUwgU0lHIGEgaG9vayB0byBkaXN0cmlidXRlCmJhY2t3YXJkcy1jb21wYXRpYmxlIHVwZGF0ZXMgdG8gdGhlIHN0YW5kYXJkIHhtbCBwYWNrYWdlLgoKd2ViYnJvd3NlciAtIGEgcGxhdGZvcm0taW5kZXBlbmRlbnQgQVBJIHRvIGxhdW5jaCBhIHdlYiBicm93c2VyLgoKCkNoYW5nZWQgTW9kdWxlcwotLS0tLS0tLS0tLS0tLS0KCmFycmF5IC0tIG5ldyBtZXRob2RzIGZvciBhcnJheSBvYmplY3RzOiBjb3VudCwgZXh0ZW5kLCBpbmRleCwgcG9wLCBhbmQKcmVtb3ZlCgpiaW5hc2NpaSAtLSBuZXcgZnVuY3Rpb25zIGIyYV9oZXggYW5kIGEyYl9oZXggdGhhdCBjb252ZXJ0IGJldHdlZW4KYmluYXJ5IGRhdGEgYW5kIGl0cyBoZXggcmVwcmVzZW50YXRpb24KCmNhbGVuZGFyIC0tIE1hbnkgbmV3IGZ1bmN0aW9ucyB0aGF0IHN1cHBvcnQgZmVhdHVyZXMgaW5jbHVkaW5nIGNvbnRyb2wKb3ZlciB3aGljaCBkYXkgb2YgdGhlIHdlZWsgaXMgdGhlIGZpcnN0IGRheSwgcmV0dXJuaW5nIHN0cmluZ3MgaW5zdGVhZApvZiBwcmludGluZyB0aGVtLiAgQWxzbyBuZXcgc3ltYm9saWMgY29uc3RhbnRzIGZvciBkYXlzIG9mIHdlZWssCmUuZy4gTU9OREFZLCAuLi4sIFNVTkRBWS4KCmNnaSAtLSBGaWVsZFN0b3JhZ2Ugb2JqZWN0cyBoYXZlIGEgZ2V0dmFsdWUgbWV0aG9kIHRoYXQgd29ya3MgbGlrZSBhCmRpY3Rpb25hcnkncyBnZXQgbWV0aG9kIGFuZCByZXR1cm5zIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgb2YgdGhlIG9iamVjdC4KCkNvbmZpZ1BhcnNlciAtLSBUaGUgcGFyc2VyIG9iamVjdCBoYXMgbmV3IG1ldGhvZHMgaGFzX29wdGlvbiwKcmVtb3ZlX3NlY3Rpb24sIHJlbW92ZV9vcHRpb24sIHNldCwgYW5kIHdyaXRlLiAgVGhleSBhbGxvdyB0aGUgbW9kdWxlCnRvIGJlIHVzZWQgZm9yIHdyaXRpbmcgY29uZmlnIGZpbGVzIGFzIHdlbGwgYXMgcmVhZGluZyB0aGVtLgoKZnRwbGliIC0tIG50cmFuc2ZlcmNtZCgpLCB0cmFuc2ZlcmNtZCgpLCBhbmQgcmV0cmJpbmFyeSgpIGFsbCBub3cKb3B0aW9uYWxseSBzdXBwb3J0IHRoZSBSRkMgOTU5IFJFU1QgY29tbWFuZC4KCmd6aXAgLS0gcmVhZGxpbmUgYW5kIHJlYWRsaW5lcyBub3cgYWNjZXB0IG9wdGlvbmFsIHNpemUgYXJndW1lbnRzCgpodHRwbGliIC0tIE5ldyBpbnRlcmZhY2VzIGFuZCBzdXBwb3J0IGZvciBIVFRQLzEuMSBieSBHcmVnIFN0ZWluLiAgU2VlCnRoZSBtb2R1bGUgZG9jIHN0cmluZ3MgZm9yIGRldGFpbHMuCgpsb2NhbGUgLS0gaW1wbGVtZW50IGdldGRlZmF1bHRsb2NhbGUgZm9yIFdpbjMyIGFuZCBNYWNpbnRvc2gKCm1hcnNoYWwgLS0gbm8gbG9uZ2VyIGR1bXBzIGNvcmUgd2hlbiBtYXJzaGFsaW5nIGRlZXBseSBuZXN0ZWQgb3IKcmVjdXJzaXZlIGRhdGEgc3RydWN0dXJlcwoKb3MgLS0gbmV3IGZ1bmN0aW9ucyBpc2F0dHksIHNldGV1aWQsIHNldGVnaWQsIHNldHJldWlkLCBzZXRyZWdpZAoKb3MvcG9wZW4yIC0tIHBvcGVuMi9wb3BlbjMvcG9wZW40IHN1cHBvcnQgdW5kZXIgV2luZG93cy4gIHBvcGVuMi9wb3BlbjMKc3VwcG9ydCB1bmRlciBVbml4LgoKb3MvcHR5IC0tIHN1cHBvcnQgZm9yIG9wZW5wdHkgYW5kIGZvcmtwdHkKCm9zLnBhdGggLS0gZml4IHNlbWFudGljcyBvZiBvcy5wYXRoLmNvbW1vbnByZWZpeAoKc210cGxpYiAtLSBzdXBwb3J0IGZvciBzZW5kaW5nIHZlcnkgbG9uZyBtZXNzYWdlcwoKc29ja2V0IC0tIG5ldyBmdW5jdGlvbiBnZXRmcWRuKCkKCnJlYWRsaW5lIC0tIG5ldyBmdW5jdGlvbnMgdG8gcmVhZCwgd3JpdGUgYW5kIHRydW5jYXRlIGhpc3RvcnkgZmlsZXMuClRoZSByZWFkbGluZSBzZWN0aW9uIG9mIHRoZSBsaWJyYXJ5IHJlZmVyZW5jZSBtYW51YWwgY29udGFpbnMgYW4KZXhhbXBsZS4KCnNlbGVjdCAtLSBhZGQgaW50ZXJmYWNlIHRvIHBvbGwgc3lzdGVtIGNhbGwKCnNodXRpbCAtLSBuZXcgY29weWZpbGVvYmogZnVuY3Rpb24KClNpbXBsZUhUVFBTZXJ2ZXIsIENHSUhUVFBTZXJ2ZXIgLS0gRml4IHByb2JsZW1zIHdpdGggYnVmZmVyaW5nIGluIHRoZQpIVFRQIHNlcnZlci4KClRraW50ZXIgLS0gb3B0aW1pemF0aW9uIG9mIGZ1bmN0aW9uIGZsYXR0ZW4KCnVybGxpYiAtLSBzY2FucyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHByb3h5IGNvbmZpZ3VyYXRpb24sCmUuZy4gaHR0cF9wcm94eS4KCndoaWNoZGIgLS0gcmVjb2duaXplcyBkdW1iZGJtIGZvcm1hdAoKCk9ic29sZXRlIE1vZHVsZXMKLS0tLS0tLS0tLS0tLS0tLQoKTm9uZS4gIEhvd2V2ZXIgbm90ZSB0aGF0IDEuNiBtYWRlIGEgd2hvbGUgc2xldyBvZiBtb2R1bGVzIG9ic29sZXRlOgpzdGR3aW4sIHNvdW5kZXgsIGNtbCwgY21wY2FjaGUsIGRpcmNhY2hlLCBkdW1wLCBmaW5kLCBncmVwLCBwYWNrbWFpbCwKcG9seSwgem1vZCwgc3Ryb3AsIHV0aWwsIHdoYXRzb3VuZC4KCgpDaGFuZ2VkLCBOZXcsIE9ic29sZXRlIFRvb2xzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCk5vbmUuCgoKQy1sZXZlbCBDaGFuZ2VzCi0tLS0tLS0tLS0tLS0tLQoKU2V2ZXJhbCBjbGVhbnVwIGpvYnMgd2VyZSBjYXJyaWVkIG91dCB0aHJvdWdob3V0IHRoZSBzb3VyY2UgY29kZS4KCkFsbCBDIGNvZGUgd2FzIGNvbnZlcnRlZCB0byBBTlNJIEM7IHdlIGdvdCByaWQgb2YgYWxsIHVzZXMgb2YgdGhlClB5X1BST1RPKCkgbWFjcm8sIHdoaWNoIG1ha2VzIHRoZSBoZWFkZXIgZmlsZXMgYSBsb3QgbW9yZSByZWFkYWJsZS4KCk1vc3Qgb2YgdGhlIHBvcnRhYmlsaXR5IGhhY2tzIHdlcmUgbW92ZWQgdG8gYSBuZXcgaGVhZGVyIGZpbGUsCnB5cG9ydC5oOyBzZXZlcmFsIG90aGVyIG5ldyBoZWFkZXIgZmlsZXMgd2VyZSBhZGRlZCBhbmQgc29tZSBvbGQKaGVhZGVyIGZpbGVzIHdlcmUgcmVtb3ZlZCwgaW4gYW4gYXR0ZW1wdCB0byBjcmVhdGUgYSBtb3JlIHJhdGlvbmFsIHNldApvZiBoZWFkZXIgZmlsZXMuICAoRmV3IG9mIHRoZXNlIGV2ZXIgbmVlZCB0byBiZSBpbmNsdWRlZCBleHBsaWNpdGx5Owp0aGV5IGFyZSBhbGwgaW5jbHVkZWQgYnkgUHl0aG9uLmguKQoKVHJlbnQgTWljayBlbnN1cmVkIHBvcnRhYmlsaXR5IHRvIDY0LWJpdCBwbGF0Zm9ybXMsIHVuZGVyIGJvdGggTGludXgKYW5kIFdpbjY0LCBlc3BlY2lhbGx5IGZvciB0aGUgbmV3IEludGVsIEl0YW5pdW0gcHJvY2Vzc29yLiAgTWljayBhbHNvCmFkZGVkIGxhcmdlIGZpbGUgc3VwcG9ydCBmb3IgTGludXg2NCBhbmQgV2luNjQuCgpUaGUgQyBBUElzIHRvIHJldHVybiBhbiBvYmplY3QncyBzaXplIGhhdmUgYmVlbiB1cGRhdGUgdG8gY29uc2lzdGVudGx5CnVzZSB0aGUgZm9ybSBQeVhYWF9TaXplLCBlLmcuIFB5U2VxdWVuY2VfU2l6ZSBhbmQgUHlEaWN0X1NpemUuICBJbgpwcmV2aW91cyB2ZXJzaW9ucywgdGhlIGFic3RyYWN0IGludGVyZmFjZXMgdXNlZCBQeVhYWF9MZW5ndGggYW5kIHRoZQpjb25jcmV0ZSBpbnRlcmZhY2VzIHVzZWQgUHlYWFhfU2l6ZS4gIFRoZSBvbGQgbmFtZXMsCmUuZy4gUHlPYmplY3RfTGVuZ3RoLCBhcmUgc3RpbGwgYXZhaWxhYmxlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQphdCB0aGUgQVBJIGxldmVsLCBidXQgYXJlIGRlcHJlY2F0ZWQuCgpUaGUgUHlPU19DaGVja1N0YWNrIGZ1bmN0aW9uIGhhcyBiZWVuIGltcGxlbWVudGVkIG9uIFdpbmRvd3MgYnkKRnJlZHJpayBMdW5kaC4gIEl0IHByZXZlbnRzIFB5dGhvbiBmcm9tIGZhaWxpbmcgd2l0aCBhIHN0YWNrIG92ZXJmbG93Cm9uIFdpbmRvd3MuCgpUaGUgR0MgY2hhbmdlcyByZXN1bHRlZCBpbiBjcmVhdGlvbiBvZiB0d28gbmV3IHNsb3RzIG9uIG9iamVjdCwKdHBfdHJhdmVyc2UgYW5kIHRwX2NsZWFyLiAgVGhlIGF1Z21lbnRlZCBhc3NpZ25tZW50IGNoYW5nZXMgcmVzdWx0IGluCnRoZSBjcmVhdGlvbiBvZiBhIG5ldyBzbG90IGZvciBlYWNoIGluLXBsYWNlIG9wZXJhdG9yLgoKVGhlIEdDIEFQSSBjcmVhdGVzIG5ldyByZXF1aXJlbWVudHMgZm9yIGNvbnRhaW5lciB0eXBlcyBpbXBsZW1lbnRlZCBpbgpDIGV4dGVuc2lvbiBtb2R1bGVzLiAgU2VlIEluY2x1ZGUvb2JqaW1wbC5oIGZvciBkZXRhaWxzLgoKUHlFcnJfRm9ybWF0IGhhcyBiZWVuIHVwZGF0ZWQgdG8gYXV0b21hdGljYWxseSBjYWxjdWxhdGUgdGhlIHNpemUgb2YKdGhlIGJ1ZmZlciBuZWVkZWQgdG8gaG9sZCB0aGUgZm9ybWF0dGVkIHJlc3VsdCBzdHJpbmcuICBUaGlzIGNoYW5nZQpwcmV2ZW50cyBjcmFzaGVzIGNhdXNlZCBieSBwcm9ncmFtbWVyIGVycm9yLgoKTmV3IEMgQVBJIGNhbGxzOiBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yLCBQeUVycl9Xcml0ZVVucmFpc2FibGUuCgpQeVJ1bl9BbnlGaWxlRXgsIFB5UnVuX1NpbXBsZUZpbGVFeCwgUHlSdW5fRmlsZUV4IC0tIE5ldyBmdW5jdGlvbnMKdGhhdCBhcmUgdGhlIHNhbWUgYXMgdGhlaXIgbm9uLUV4IGNvdW50ZXJwYXJ0cyBleGNlcHQgdGhleSB0YWtlIGFuCmV4dHJhIGZsYWcgYXJndW1lbnQgdGhhdCB0ZWxscyB0aGVtIHRvIGNsb3NlIHRoZSBmaWxlIHdoZW4gZG9uZS4KClhYWCBUaGVyZSB3ZXJlIG90aGVyIEFQSSBjaGFuZ2VzIHRoYXQgc2hvdWxkIGJlIGZsZXNoZWQgb3V0IGhlcmUuCgoKV2luZG93cyBDaGFuZ2VzCi0tLS0tLS0tLS0tLS0tLQoKTmV3IHBvcGVuMi9wb3BlbjMvcGVvcGVuNCBpbiBvcyBtb2R1bGUgKHNlZSBDaGFuZ2VkIE1vZHVsZXMgYWJvdmUpLgoKb3MucG9wZW4gaXMgbXVjaCBtb3JlIHVzYWJsZSBvbiBXaW5kb3dzIDk1IGFuZCA5OC4gIFNlZSBNaWNyb3NvZnQKS25vd2xlZGdlIEJhc2UgYXJ0aWNsZSBRMTUwOTU2LiAgVGhlIFdpbjl4IHdvcmthcm91bmQgZGVzY3JpYmVkIHRoZXJlCmlzIGltcGxlbWVudGVkIGJ5IHRoZSBuZXcgdzl4cG9wZW4uZXhlIGhlbHBlciBpbiB0aGUgcm9vdCBvZiB5b3VyClB5dGhvbiBpbnN0YWxsYXRpb24uICBOb3RlIHRoYXQgUHl0aG9uIHVzZXMgdGhpcyBpbnRlcm5hbGx5OyBpdCBpcyBub3QKYSBzdGFuZGFsb25lIHByb2dyYW0uCgpBZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMgYXJlIG5vIGxvbmdlciByZXF1aXJlZCB0byBpbnN0YWxsIFB5dGhvbgpvbiBXaW5kb3dzIE5UIG9yIFdpbmRvd3MgMjAwMC4gIElmIHlvdSBoYXZlIGFkbWluaXN0cmF0b3IgcHJpdmlsZWdlcywKUHl0aG9uJ3MgcmVnaXN0cnkgaW5mbyB3aWxsIGJlIHdyaXR0ZW4gdW5kZXIgSEtFWV9MT0NBTF9NQUNISU5FLgpPdGhlcndpc2UgdGhlIGluc3RhbGxlciBiYWNrcyBvZmYgdG8gd3JpdGluZyBQeXRob24ncyByZWdpc3RyeSBpbmZvCnVuZGVyIEhLRVlfQ1VSUkVOVF9VU0VSLiAgVGhlIGxhdHRlciBpcyBzdWZmaWNpZW50IGZvciBhbGwgIm5vcm1hbCIKdXNlcyBvZiBQeXRob24sIGJ1dCB3aWxsIHByZXZlbnQgc29tZSBhZHZhbmNlZCB1c2VzIGZyb20gd29ya2luZwooZm9yIGV4YW1wbGUsIHJ1bm5pbmcgYSBQeXRob24gc2NyaXB0IGFzIGFuIE5UIHNlcnZpY2UsIG9yIHBvc3NpYmx5CmZyb20gQ0dJKS4KCltUaGlzIHdhcyBuZXcgaW4gMS42XSBUaGUgaW5zdGFsbGVyIG5vIGxvbmdlciBydW5zIGEgc2VwYXJhdGUgVGNsL1RrCmluc3RhbGxlcjsgaW5zdGVhZCwgaXQgaW5zdGFsbHMgdGhlIG5lZWRlZCBUY2wvVGsgZmlsZXMgZGlyZWN0bHkgaW4gdGhlClB5dGhvbiBkaXJlY3RvcnkuICBJZiB5b3UgYWxyZWFkeSBoYXZlIGEgVGNsL1RrIGluc3RhbGxhdGlvbiwgdGhpcwp3YXN0ZXMgc29tZSBkaXNrIHNwYWNlIChhYm91dCA0IE1lZ3MpIGJ1dCBhdm9pZHMgcHJvYmxlbXMgd2l0aApjb25mbGljdGluZyBUY2wvVGsgaW5zdGFsbGF0aW9ucywgYW5kIG1ha2VzIGl0IG11Y2ggZWFzaWVyIGZvciBQeXRob24KdG8gZW5zdXJlIHRoYXQgVGNsL1RrIGNhbiBmaW5kIGFsbCBpdHMgZmlsZXMuCgpbVGhpcyB3YXMgbmV3IGluIDEuNl0gVGhlIFdpbmRvd3MgaW5zdGFsbGVyIG5vdyBpbnN0YWxscyBieSBkZWZhdWx0IGluClxQeXRob24yMFwgb24gdGhlIGRlZmF1bHQgdm9sdW1lLCBpbnN0ZWFkIG9mIFxQcm9ncmFtIEZpbGVzXFB5dGhvbi0yLjBcLgoKClVwZGF0ZXMgdG8gdGhlIGNoYW5nZXMgYmV0d2VlbiAxLjUuMiBhbmQgMS42Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGUgMS42IE5FV1MgZmlsZSBjYW4ndCBiZSBjaGFuZ2VkIGFmdGVyIHRoZSByZWxlYXNlIGlzIGRvbmUsIHNvIGhlcmUKaXMgc29tZSBsYXRlLWJyZWFraW5nIG5ld3M6CgpOZXcgQVBJcyBpbiBsb2NhbGUucHk6IG5vcm1hbGl6ZSgpLCBnZXRkZWZhdWx0bG9jYWxlKCksIHJlc2V0bG9jYWxlKCksCmFuZCBjaGFuZ2VzIHRvIGdldGxvY2FsZSgpIGFuZCBzZXRsb2NhbGUoKS4KClRoZSBuZXcgbW9kdWxlIGlzIG5vdyBlbmFibGVkIHBlciBkZWZhdWx0LgoKSXQgaXMgbm90IHRydWUgdGhhdCB0aGUgZW5jb2RpbmdzIGNvZGVjcyBjYW5ub3QgYmUgdXNlZCBmb3Igbm9ybWFsCnN0cmluZ3M6IHRoZSBzdHJpbmcuZW5jb2RlKCkgKHdoaWNoIGlzIGFsc28gcHJlc2VudCBvbiA4LWJpdCBzdHJpbmdzCiEpIGFsbG93cyB1c2luZyB0aGVtIGZvciA4LWJpdCBzdHJpbmdzIHRvbywgZS5nLiB0byBjb252ZXJ0IGZpbGVzIGZyb20KY3AxMjUyIChXaW5kb3dzKSB0byBsYXRpbi0xIG9yIHZpY2UtdmVyc2EuCgpKYXBhbmVzZSBjb2RlY3MgYXJlIGF2YWlsYWJsZSBmcm9tIFRhbWl0byBLQUpJWUFNQToKaHR0cDovL3BzZXVkby5ncmFkLnNjY3MuY2h1a3lvLXUuYWMuanAvfmthaml5YW1hL3B5dGhvbi8KCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cg==