XGRvY3VtZW50Y2xhc3N7aG93dG99CgpcdGl0bGV7UHl0aG9uIE9wZW5TU0wgTWFudWFsfQoKXHJlbGVhc2V7MC4xMX0KClxhdXRob3J7SmVhbi1QYXVsIENhbGRlcm9uZX0KXGF1dGhvcmFkZHJlc3N7XGVtYWlse2V4YXJrdW5AdHdpc3RlZG1hdHJpeC5jb219fQoKXHVzZXBhY2thZ2VbZW5nbGlzaF17YmFiZWx9Clx1c2VwYWNrYWdlW1QxXXtmb250ZW5jfQoKXGJlZ2lue2RvY3VtZW50fQoKXG1ha2V0aXRsZQoKXGJlZ2lue2Fic3RyYWN0fQpcbm9pbmRlbnQKVGhpcyBtb2R1bGUgaXMgYSByYXRoZXIgdGhpbiB3cmFwcGVyIGFyb3VuZCAoYSBzdWJzZXQgb2YpIHRoZSBPcGVuU1NMIGxpYnJhcnkuCldpdGggdGhpbiB3cmFwcGVyIEkgbWVhbiB0aGF0IGEgbG90IG9mIHRoZSBvYmplY3QgbWV0aG9kcyBkbyBub3RoaW5nIG1vcmUgdGhhbgpjYWxsaW5nIGEgY29ycmVzcG9uZGluZyBmdW5jdGlvbiBpbiB0aGUgT3BlblNTTCBsaWJyYXJ5LgpcZW5ke2Fic3RyYWN0fQoKXHRhYmxlb2Zjb250ZW50cwoKClxzZWN0aW9ue0ludHJvZHVjdGlvbiBcbGFiZWx7aW50cm99fQoKVGhlIHJlYXNvbiBweU9wZW5TU0wgd2FzIGNyZWF0ZWQgaXMgdGhhdCB0aGUgU1NMIHN1cHBvcnQgaW4gdGhlIHNvY2tldCBtb2R1bGUKaW4gUHl0aG9uIDIuMSAodGhlIGNvbnRlbXBvcmFyeSB2ZXJzaW9uIG9mIFB5dGhvbiB3aGVuIHRoZSBweU9wZW5TU0wgcHJvamVjdAp3YXMgYmVndW4pIHdhcyBzZXZlcmVseSBsaW1pdGVkLiAgT3RoZXIgT3BlblNTTCB3cmFwcGVycyBmb3IgUHl0aG9uIGF0IHRoZSB0aW1lCndlcmUgYWxzbyBsaW1pdGVkLCB0aG91Z2ggaW4gZGlmZmVyZW50IHdheXMuICBVbmZvcnR1bmF0ZWx5LCBQeXRob24ncyBzdGFuZGFyZApsaWJyYXJ5IFNTTCBzdXBwb3J0IGhhcyByZW1haW5lZCB3ZWFrLCBhbHRob3VnaCBvdGhlciBwYWNrYWdlcyAoc3VjaCBhcwpNMkNyeXB0b1xmb290bm90ZXtTZWUgXHVybHtodHRwOi8vY2hhbmRsZXJwcm9qZWN0Lm9yZy9Qcm9qZWN0cy9NZVRvb0NyeXB0b319KQpoYXZlIG1hZGUgZ3JlYXQgYWR2YW5jZXMgYW5kIG5vdyBlcXVhbCBvciBleGNlZWQgcHlPcGVuU1NMJ3MgZnVuY3Rpb25hbGl0eS4KClRoZSByZWFzb24gcHlPcGVuU1NMIGNvbnRpbnVlcyB0byBiZSBtYWludGFpbmVkIGlzIHRoYXQgdGhlcmUgaXMgYSBzaWduaWZpY2FudAp1c2VyIGNvbW11bml0eSBhcm91bmQgaXQsIGFzIHdlbGwgYXMgYSBsYXJnZSBhbW91bnQgb2Ygc29mdHdhcmUgd2hpY2ggZGVwZW5kcwpvbiBpdC4gIEl0IGlzIGEgZ3JlYXQgYmVuZWZpdCB0byBtYW55IHBlb3BsZSBmb3IgcHlPcGVuU1NMIHRvIGNvbnRpbnVlIHRvIGV4aXN0CmFuZCBhZHZhbmNlLgoKXHNlY3Rpb257QnVpbGRpbmcgYW5kIEluc3RhbGxpbmcgXGxhYmVse2J1aWxkaW5nfX0KClRoZXNlIGluc3RydWN0aW9ucyBjYW4gYWxzbyBiZSBmb3VuZCBpbiB0aGUgZmlsZSBcdmVyYnxJTlNUQUxMfC4KCkkgaGF2ZSB0ZXN0ZWQgdGhpcyBvbiBEZWJpYW4gTGludXggc3lzdGVtcyAod29vZHkgYW5kIHNpZCksIFNvbGFyaXMgMi42IGFuZAoyLjcuIE90aGVycyBoYXZlIHN1Y2Nlc3NmdWxseSBjb21waWxlZCBpdCBvbiBXaW5kb3dzIGFuZCBOVC4KClxzdWJzZWN0aW9ue0J1aWxkaW5nIHRoZSBNb2R1bGUgb24gYSBVbml4IFN5c3RlbSBcbGFiZWx7YnVpbGRpbmctdW5peH19CgpweU9wZW5TU0wgdXNlcyBkaXN0dXRpbHMsIHNvIHRoZXJlIHJlYWxseSBzaG91bGRuJ3QgYmUgYW55IHByb2JsZW1zLiBUbyBidWlsZAp0aGUgbGlicmFyeToKXGJlZ2lue3ZlcmJhdGltfQpweXRob24gc2V0dXAucHkgYnVpbGQKXGVuZHt2ZXJiYXRpbX0KCklmIHlvdXIgT3BlblNTTCBoZWFkZXIgZmlsZXMgYXJlbid0IGluIFx2ZXJifC91c3IvaW5jbHVkZXwsIHlvdSBtYXkgbmVlZCB0bwpzdXBwbHkgdGhlIFx2ZXJifC1JfCBmbGFnIHRvIGxldCB0aGUgc2V0dXAgc2NyaXB0IGtub3cgd2hlcmUgdG8gbG9vay4gVGhlIHNhbWUKZ29lcyBmb3IgdGhlIGxpYnJhcmllcyBvZiBjb3Vyc2UsIHVzZSB0aGUgXHZlcmJ8LUx8IGZsYWcuIE5vdGUgdGhhdApcdmVyYnxidWlsZHwgd29uJ3QgYWNjZXB0IHRoZXNlIGZsYWdzLCBzbyB5b3UgaGF2ZSB0byBydW4gZmlyc3QKXHZlcmJ8YnVpbGRfZXh0fCBhbmQgdGhlbiBcdmVyYnxidWlsZHwhIEV4YW1wbGU6ClxiZWdpbnt2ZXJiYXRpbX0KcHl0aG9uIHNldHVwLnB5IGJ1aWxkX2V4dCAtSS91c3IvbG9jYWwvc3NsL2luY2x1ZGUgLUwvdXNyL2xvY2FsL3NzbC9saWIKcHl0aG9uIHNldHVwLnB5IGJ1aWxkClxlbmR7dmVyYmF0aW19CgpOb3cgeW91IHNob3VsZCBoYXZlIGEgZGlyZWN0b3J5IGNhbGxlZCBcdmVyYnxPcGVuU1NMfCB0aGF0IGNvbnRhaW5zIGUuZy4KXHZlcmJ8U1NMLnNvfCBhbmQgXHZlcmJ8X19pbml0X18ucHl8IHNvbWV3aGVyZSBpbiB0aGUgYnVpbGQgZGljcmVjdG9yeSwKc28ganVzdDoKXGJlZ2lue3ZlcmJhdGltfQpweXRob24gc2V0dXAucHkgaW5zdGFsbApcZW5ke3ZlcmJhdGltfQoKSWYgeW91LCBmb3Igc29tZSBhcmNhbmUgcmVhc29uLCBkb24ndCB3YW50IHRoZSBtb2R1bGUgdG8gYXBwZWFyIGluIHRoZQpcdmVyYnxzaXRlLXBhY2thZ2VzfCBkaXJlY3RvcnksIHVzZSB0aGUgXHZlcmJ8LS1wcmVmaXh8IG9wdGlvbi4KCllvdSBjYW4sIG9mIGNvdXJzZSwgZG8KXGJlZ2lue3ZlcmJhdGltfQpweXRob24gc2V0dXAucHkgLS1oZWxwClxlbmR7dmVyYmF0aW19Cgp0byBmaW5kIG91dCBtb3JlIGFib3V0IGhvdyB0byB1c2UgdGhlIHNjcmlwdC4KClxzdWJzZWN0aW9ue0J1aWxkaW5nIHRoZSBNb2R1bGUgb24gYSBXaW5kb3dzIFN5c3RlbSBcbGFiZWx7YnVpbGRpbmctd2luZG93c319CgpCaWcgdGhhbmtzIHRvIEl0YW1hciBTaHR1bGwtVHJhdXJpbmcgYW5kIE9sZWcgT3Jsb3YgZm9yIHRoZWlyIGhlbHAgd2l0aApXaW5kb3dzIGJ1aWxkIGluc3RydWN0aW9ucy4gIFNhbWUgYXMgZm9yIFVuaXggc3lzdGVtcywgd2UgaGF2ZSB0byBzZXBhcmF0ZQp0aGUgXHZlcmJ8YnVpbGRfZXh0fCBhbmQgdGhlIFx2ZXJifGJ1aWxkfC4KCkJ1aWxkaW5nIHRoZSBsaWJyYXJ5OgoKXGJlZ2lue3ZlcmJhdGltfQpzZXR1cC5weSBidWlsZF9leHQgLUkgLi4uXG9wZW5zc2xcaW5jMzIgLUwgLi4uXG9wZW5zc2xcb3V0MzJkbGwKc2V0dXAucHkgYnVpbGQKXGVuZHt2ZXJiYXRpbX0KCldoZXJlIFx2ZXJifC4uLlxvcGVuc3NsfCBpcyBvZiBjb3Vyc2UgdGhlIGxvY2F0aW9uIG9mIHlvdXIgT3BlblNTTCBpbnN0YWxsYXRpb24uCgpJbnN0YWxsYXRpb24gaXMgdGhlIHNhbWUgYXMgZm9yIFVuaXggc3lzdGVtczoKXGJlZ2lue3ZlcmJhdGltfQpzZXR1cC5weSBpbnN0YWxsClxlbmR7dmVyYmF0aW19CgpBbmQgc2ltaWxhcmlseSwgeW91IGNhbiBkbwpcYmVnaW57dmVyYmF0aW19CnNldHVwLnB5IC0taGVscApcZW5ke3ZlcmJhdGltfQoKdG8gZ2V0IG1vcmUgaW5mb3JtYXRpb24uCgoKXHNlY3Rpb257XG1vZHVsZXtPcGVuU1NMfSAtLS0gUHl0aG9uIGludGVyZmFjZSB0byBPcGVuU1NMIFxsYWJlbHtvcGVuc3NsfX0KClxkZWNsYXJlbW9kdWxle2V4dGVuc2lvbn17T3BlblNTTH0KXG1vZHVsZXN5bm9wc2lze1B5dGhvbiBpbnRlcmZhY2UgdG8gT3BlblNTTH0KClRoaXMgcGFja2FnZSBwcm92aWRlcyBhIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlIHRvIHRoZSBmdW5jdGlvbnMgaW4gdGhlCk9wZW5TU0wgbGlicmFyeS4gVGhlIGZvbGxvd2luZyBtb2R1bGVzIGFyZSBkZWZpbmVkOgoKXGJlZ2lue2RhdGFkZXNjfXtjcnlwdG99CkdlbmVyaWMgY3J5cHRvZ3JhcGhpYyBtb2R1bGUuIE5vdGUgdGhhdCBpZiBhbnl0aGluZyBpcyBpbmNvbXBsZXRlLCB0aGlzIG1vZHVsZSBpcyEKXGVuZHtkYXRhZGVzY30KClxiZWdpbntkYXRhZGVzY317cmFuZH0KQW4gaW50ZXJmYWNlIHRvIHRoZSBPcGVuU1NMIHBzZXVkbyByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KXGVuZHtkYXRhZGVzY30KClxiZWdpbntkYXRhZGVzY317U1NMfQpBbiBpbnRlcmZhY2UgdG8gdGhlIFNTTC1zcGVjaWZpYyBwYXJ0cyBvZiBPcGVuU1NMLgpcZW5ke2RhdGFkZXNjfQoKCiUgJSAlIGNyeXB0byBtb2R1bGVPcGVuU1NMCgpcc3Vic2VjdGlvbntcbW9kdWxle2NyeXB0b30gLS0tIEdlbmVyaWMgY3J5cHRvZ3JhcGhpYyBtb2R1bGUgXGxhYmVse29wZW5zc2wtY3J5cHRvfX0KClxkZWNsYXJlbW9kdWxle2V4dGVuc2lvbn17Y3J5cHRvfQpcbW9kdWxlc3lub3BzaXN7R2VuZXJpYyBjcnlwdG9ncmFwaGljIG1vZHVsZX0KClxiZWdpbntkYXRhZGVzY317WDUwOVR5cGV9ClNlZSBcY2xhc3N7WDUwOX0uClxlbmR7ZGF0YWRlc2N9CgpcYmVnaW57Y2xhc3NkZXNjfXtYNTA5fXt9CkEgY2xhc3MgcmVwcmVzZW50aW5nIFguNTA5IGNlcnRpZmljYXRlcy4KXGVuZHtjbGFzc2Rlc2N9CgpcYmVnaW57ZGF0YWRlc2N9e1g1MDlOYW1lVHlwZX0KU2VlIFxjbGFzc3tYNTA5TmFtZX0uClxlbmR7ZGF0YWRlc2N9CgpcYmVnaW57Y2xhc3NkZXNjfXtYNTA5TmFtZX17eDUwOW5hbWV9CkEgY2xhc3MgcmVwcmVzZW50aW5nIFguNTA5IERpc3Rpbmd1aXNoZWQgTmFtZXMuCgpUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBjb3B5IG9mIFx2YXJ7eDUwOW5hbWV9IHdoaWNoIHNob3VsZCBiZSBhbgppbnN0YW5jZSBvZiBcY2xhc3N7WDUwOU5hbWV9LgpcZW5ke2NsYXNzZGVzY30KClxiZWdpbntkYXRhZGVzY317WDUwOVJlcVR5cGV9ClNlZSBcY2xhc3N7WDUwOVJlcX0uClxlbmR7ZGF0YWRlc2N9CgpcYmVnaW57Y2xhc3NkZXNjfXtYNTA5UmVxfXt9CkEgY2xhc3MgcmVwcmVzZW50aW5nIFguNTA5IGNlcnRpZmljYXRlIHJlcXVlc3RzLgpcZW5ke2NsYXNzZGVzY30KClxiZWdpbntkYXRhZGVzY317WDUwOVN0b3JlVHlwZX0KQSBQeXRob24gdHlwZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBYNTA5U3RvcmUgb2JqZWN0IHR5cGUuClxlbmR7ZGF0YWRlc2N9CgpcYmVnaW57ZGF0YWRlc2N9e1BLZXlUeXBlfQpTZWUgXGNsYXNze1BLZXl9LgpcZW5ke2RhdGFkZXNjfQoKXGJlZ2lue2NsYXNzZGVzY317UEtleX17fQpBIGNsYXNzIHJlcHJlc2VudGluZyBEU0Egb3IgUlNBIGtleXMuClxlbmR7Y2xhc3NkZXNjfQoKXGJlZ2lue2RhdGFkZXNjfXtQS0NTN1R5cGV9CkEgUHl0aG9uIHR5cGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgUEtDUzcgb2JqZWN0IHR5cGUuClxlbmR7ZGF0YWRlc2N9CgpcYmVnaW57ZGF0YWRlc2N9e1BLQ1MxMlR5cGV9CkEgUHl0aG9uIHR5cGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgUEtDUzEyIG9iamVjdCB0eXBlLgpcZW5ke2RhdGFkZXNjfQoKXGJlZ2lue2RhdGFkZXNjfXtYNTA5RXh0ZW5zaW9uVHlwZX0KU2VlIFxjbGFzc3tYNTA5RXh0ZW5zaW9ufS4KXGVuZHtkYXRhZGVzY30KClxiZWdpbntjbGFzc2Rlc2N9e1g1MDlFeHRlbnNpb259e3R5cGVuYW1lLCBjcml0aWNhbCwgdmFsdWVcb3B0aW9uYWx7LCBzdWJqZWN0fVxvcHRpb25hbHssIGlzc3Vlcn19CkEgY2xhc3MgcmVwcmVzZW50aW5nIGFuIFguNTA5IHYzIGNlcnRpZmljYXRlIGV4dGVuc2lvbnMuClNlZSBcdXJse2h0dHA6Ly9vcGVuc3NsLm9yZy9kb2NzL2FwcHMveDUwOXYzX2NvbmZpZy5odG1sXCNTVEFOREFSRF9FWFRFTlNJT05TfQpmb3IgXHZhcnt0eXBlbmFtZX0gc3RyaW5ncyBhbmQgdGhlaXIgb3B0aW9ucy4KT3B0aW9uYWwgcGFyYW1ldGVycyBcdmFye3N1YmplY3R9IGFuZCBcdmFye2lzc3Vlcn0gbXVzdCBiZSBYNTA5IG9iamVjdHMuClxlbmR7Y2xhc3NkZXNjfQoKXGJlZ2lue2RhdGFkZXNjfXtOZXRzY2FwZVNQS0lUeXBlfQpTZWUgXGNsYXNze05ldHNjYXBlU1BLSX0uClxlbmR7ZGF0YWRlc2N9CgpcYmVnaW57Y2xhc3NkZXNjfXtOZXRzY2FwZVNQS0l9e1xvcHRpb25hbHtlbmN9fQpBIGNsYXNzIHJlcHJlc2VudGluZyBOZXRzY2FwZSBTUEtJIG9iamVjdHMuCgpJZiB0aGUgXHZhcntlbmN9IGFyZ3VtZW50IGlzIHByZXNlbnQsIGl0IHNob3VsZCBiZSBhIGJhc2U2NC1lbmNvZGVkIHN0cmluZwpyZXByZXNlbnRpbmcgYSBOZXRzY2FwZVNQS0kgb2JqZWN0LCBhcyByZXR1cm5lZCBieSB0aGUgXG1ldGhvZHtiNjRfZW5jb2RlfQptZXRob2QuClxlbmR7Y2xhc3NkZXNjfQoKXGJlZ2lue2NsYXNzZGVzY317Q1JMfXt9CkEgY2xhc3MgcmVwcmVzZW50aW5nIENlcnRpZmNhdGUgUmV2b2NhdGlvbiBMaXN0IG9iamVjdHMuClxlbmR7Y2xhc3NkZXNjfQoKXGJlZ2lue2NsYXNzZGVzY317UmV2b2tlZH17fQpBIGNsYXNzIHJlcHJlc2VudGluZyBSZXZvY2F0aW9uIG9iamVjdHMgb2YgQ1JMLgpcZW5ke2NsYXNzZGVzY30KClxiZWdpbntkYXRhZGVzY317RklMRVRZUEVfUEVNfQpcZGF0YWxpbmV7RklMRVRZUEVfQVNOMX0KRmlsZSB0eXBlIGNvbnN0YW50cy4KXGVuZHtkYXRhZGVzY30KClxiZWdpbntkYXRhZGVzY317VFlQRV9SU0F9ClxkYXRhbGluZXtUWVBFX0RTQX0KS2V5IHR5cGUgY29uc3RhbnRzLgpcZW5ke2RhdGFkZXNjfQoKXGJlZ2lue2V4Y2Rlc2N9e0Vycm9yfQpHZW5lcmljIGV4Y2VwdGlvbiB1c2VkIGluIHRoZSBcbW9kdWxle2NyeXB0b30gbW9kdWxlLgpcZW5ke2V4Y2Rlc2N9CgpcYmVnaW57ZnVuY2Rlc2N9e2R1bXBfY2VydGlmaWNhdGV9e3R5cGUsIGNlcnR9CkR1bXAgdGhlIGNlcnRpZmljYXRlIFx2YXJ7Y2VydH0gaW50byBhIGJ1ZmZlciBzdHJpbmcgZW5jb2RlZCB3aXRoIHRoZSB0eXBlClx2YXJ7dHlwZX0uClxlbmR7ZnVuY2Rlc2N9CgpcYmVnaW57ZnVuY2Rlc2N9e2R1bXBfY2VydGlmaWNhdGVfcmVxdWVzdH17dHlwZSwgcmVxfQpEdW1wIHRoZSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IFx2YXJ7cmVxfSBpbnRvIGEgYnVmZmVyIHN0cmluZyBlbmNvZGVkIHdpdGggdGhlCnR5cGUgXHZhcnt0eXBlfS4KXGVuZHtmdW5jZGVzY30KClxiZWdpbntmdW5jZGVzY317ZHVtcF9wcml2YXRla2V5fXt0eXBlLCBwa2V5XG9wdGlvbmFseywgY2lwaGVyLCBwYXNzcGhyYXNlfX0KRHVtcCB0aGUgcHJpdmF0ZSBrZXkgXHZhcntwa2V5fSBpbnRvIGEgYnVmZmVyIHN0cmluZyBlbmNvZGVkIHdpdGggdGhlIHR5cGUKXHZhcnt0eXBlfSwgb3B0aW9uYWxseSAoaWYgXHZhcnt0eXBlfSBpcyBcY29uc3RhbnR7RklMRVRZUEVfUEVNfSkgZW5jcnlwdGluZyBpdAp1c2luZyBcdmFye2NpcGhlcn0gYW5kIFx2YXJ7cGFzc3BocmFzZX0uCgpcdmFye3Bhc3NwaHJhc2V9IG11c3QgYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGEgY2FsbGJhY2sgZm9yIHByb3ZpZGluZyB0aGUKcGFzcyBwaHJhc2UuClxlbmR7ZnVuY2Rlc2N9CgpcYmVnaW57ZnVuY2Rlc2N9e2xvYWRfY2VydGlmaWNhdGV9e3R5cGUsIGJ1ZmZlcn0KTG9hZCBhIGNlcnRpZmljYXRlIChYNTA5KSBmcm9tIHRoZSBzdHJpbmcgXHZhcntidWZmZXJ9IGVuY29kZWQgd2l0aCB0aGUKdHlwZSBcdmFye3R5cGV9LgpcZW5ke2Z1bmNkZXNjfQoKXGJlZ2lue2Z1bmNkZXNjfXtsb2FkX2NlcnRpZmljYXRlX3JlcXVlc3R9e3R5cGUsIGJ1ZmZlcn0KTG9hZCBhIGNlcnRpZmljYXRlIHJlcXVlc3QgKFg1MDlSZXEpIGZyb20gdGhlIHN0cmluZyBcdmFye2J1ZmZlcn0gZW5jb2RlZCB3aXRoCnRoZSB0eXBlIFx2YXJ7dHlwZX0uClxlbmR7ZnVuY2Rlc2N9CgpcYmVnaW57ZnVuY2Rlc2N9e2xvYWRfcHJpdmF0ZWtleX17dHlwZSwgYnVmZmVyXG9wdGlvbmFseywgcGFzc3BocmFzZX19CkxvYWQgYSBwcml2YXRlIGtleSAoUEtleSkgZnJvbSB0aGUgc3RyaW5nIFx2YXJ7YnVmZmVyfSBlbmNvZGVkIHdpdGgKdGhlIHR5cGUgXHZhcnt0eXBlfSAobXVzdCBiZSBvbmUgb2YgXGNvbnN0YW50e0ZJTEVUWVBFX1BFTX0gYW5kClxjb25zdGFudHtGSUxFVFlQRV9BU04xfSkuCgpcdmFye3Bhc3NwaHJhc2V9IG11c3QgYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGEgY2FsbGJhY2sgZm9yIHByb3ZpZGluZyB0aGUKcGFzcyBwaHJhc2UuClxlbmR7ZnVuY2Rlc2N9CgpcYmVnaW57ZnVuY2Rlc2N9e2xvYWRfY3JsfXt0eXBlLCBidWZmZXJ9CkxvYWQgQ2VydGlmaWNhdGUgUmV2b2NhdGlvbiBMaXN0IChDUkwpIGRhdGEgZnJvbSBhIHN0cmluZyBcdmFye2J1ZmZlcn0uClx2YXJ7YnVmZmVyfSBlbmNvZGVkIHdpdGggdGhlIHR5cGUgXHZhcnt0eXBlfS4gIFRoZSB0eXBlIFx2YXJ7dHlwZX0gCm11c3QgZWl0aGVyIFxjb25zdGFudHtGSUxFVFlQRV9QRU19IG9yIFxjb25zdGFudHtGSUxFVFlQRV9BU04xfSkuClxlbmR7ZnVuY2Rlc2N9CgpcYmVnaW57ZnVuY2Rlc2N9e2xvYWRfcGtjczdfZGF0YX17dHlwZSwgYnVmZmVyfQpMb2FkIHBrY3M3IGRhdGEgZnJvbSB0aGUgc3RyaW5nIFx2YXJ7YnVmZmVyfSBlbmNvZGVkIHdpdGggdGhlIHR5cGUgXHZhcnt0eXBlfS4KXGVuZHtmdW5jZGVzY30KClxiZWdpbntmdW5jZGVzY317bG9hZF9wa2NzMTJ9e2J1ZmZlclxvcHRpb25hbHssIHBhc3NwaHJhc2V9fQpMb2FkIHBrY3MxMiBkYXRhIGZyb20gdGhlIHN0cmluZyBcdmFye2J1ZmZlcn0uIElmIHRoZSBwa2NzMTIgc3RydWN0dXJlIGlzCmVuY3J5cHRlZCwgYSBcdmFye3Bhc3NwaHJhc2V9IG11c3QgYmUgaW5jbHVkZWQuICBUaGUgTUFDIGlzIGFsd2F5cwpjaGVja2VkIGFuZCB0aHVzIHJlcXVpcmVkLgoKU2VlIGFsc28gdGhlIG1hbiBwYWdlIGZvciB0aGUgQyBmdW5jdGlvbiBcZnVuY3Rpb257UEtDUzEyX3BhcnNlfS4KXGVuZHtmdW5jZGVzY30KClxiZWdpbntmdW5jZGVzY317c2lnbn17a2V5LCBkYXRhLCBkaWdlc3R9ClNpZ24gYSBkYXRhIHN0cmluZyB1c2luZyB0aGUgZ2l2ZW4ga2V5IGFuZCBtZXNzYWdlIGRpZ2VzdC4KClx2YXJ7a2V5fSBpcyBhIFxjb2Rle1BLZXl9IGluc3RhbmNlLiAgXHZhcntkYXRhfSBpcyBhIFxjb2Rle3N0cn0gaW5zdGFuY2UuClx2YXJ7ZGlnZXN0fSBpcyBhIFxjb2Rle3N0cn0gbmFtaW5nIGEgc3VwcG9ydGVkIG1lc3NhZ2UgZGlnZXN0IHR5cGUsIGZvciBleGFtcGxlClxjb2Rle2Bgc2hhMScnfS4KXHZlcnNpb25hZGRlZHswLjExfQpcZW5ke2Z1bmNkZXNjfQoKXGJlZ2lue2Z1bmNkZXNjfXt2ZXJpZnl9e2NlcnRpZmljYXRlLCBzaWduYXR1cmUsIGRhdGEsIGRpZ2VzdH0KVmVyaWZ5IHRoZSBzaWduYXR1cmUgZm9yIGEgZGF0YSBzdHJpbmcuCgpcdmFye2NlcnRpZmljYXRlfSBpcyBhIFxjb2Rle1g1MDl9IGluc3RhbmNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByaXZhdGUga2V5CndoaWNoIGdlbmVyYXRlZCB0aGUgc2lnbmF0dXJlLiAgXHZhcntzaWduYXR1cmV9IGlzIGEgXHZhcntzdHJ9IGluc3RhbmNlIGdpdmluZwp0aGUgc2lnbmF0dXJlIGl0c2VsZi4gIFx2YXJ7ZGF0YX0gaXMgYSBcdmFye3N0cn0gaW5zdGFuY2UgZ2l2aW5nIHRoZSBkYXRhIHRvCndoaWNoIHRoZSBzaWduYXR1cmUgYXBwbGllcy4gIFx2YXJ7ZGlnZXN0fSBpcyBhIFx2YXJ7c3RyfSBpbnN0YW5jZSBuYW1pbmcgdGhlCm1lc3NhZ2UgZGlnZXN0IHR5cGUgb2YgdGhlIHNpZ25hdHVyZSwgZm9yIGV4YW1wbGUgXGNvZGV7YGBzaGExJyd9LgpcdmVyc2lvbmFkZGVkezAuMTF9ClxlbmR7ZnVuY2Rlc2N9Cgpcc3Vic3Vic2VjdGlvbntYNTA5IG9iamVjdHMgXGxhYmVse29wZW5zc2wteDUwOX19CgpYNTA5IG9iamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CgpcYmVnaW57bWV0aG9kZGVzY31bWDUwOV17Z2V0X2lzc3Vlcn17fQpSZXR1cm4gYW4gWDUwOU5hbWUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgaXNzdWVyIG9mIHRoZSBjZXJ0aWZpY2F0ZS4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlde2dldF9wdWJrZXl9e30KUmV0dXJuIGEgUEtleSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBwdWJsaWMga2V5IG9mIHRoZSBjZXJ0aWZpY2F0ZS4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlde2dldF9zZXJpYWxfbnVtYmVyfXt9ClJldHVybiB0aGUgY2VydGlmaWNhdGUgc2VyaWFsIG51bWJlci4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlde2dldF9zdWJqZWN0fXt9ClJldHVybiBhbiBYNTA5TmFtZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzdWJqZWN0IG9mIHRoZSBjZXJ0aWZpY2F0ZS4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlde2dldF92ZXJzaW9ufXt9ClJldHVybiB0aGUgY2VydGlmaWNhdGUgdmVyc2lvbi4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlde2dldF9ub3RCZWZvcmV9e30KUmV0dXJuIGEgc3RyaW5nIGdpdmluZyB0aGUgdGltZSBiZWZvcmUgd2hpY2ggdGhlIGNlcnRpZmljYXRlIGlzIG5vdCB2YWxpZC4gIFRoZQpzdHJpbmcgaXMgZm9ybWF0dGVkIGFzIGFuIEFTTjEgR0VORVJBTElaRURUSU1FOgpcYmVnaW57dmVyYmF0aW19CiAgICAgICAgICAgICAgICAgWVlZWU1NRERoaG1tc3NaCiAgICAgICAgICAgICAgICAgWVlZWU1NRERoaG1tc3MraGhtbQogICAgICAgICAgICAgICAgIFlZWVlNTUREaGhtbXNzLWhobW0KXGVuZHt2ZXJiYXRpbX0KSWYgbm8gdmFsdWUgZXhpc3RzIGZvciB0aGlzIGZpZWxkLCBcY29kZXtOb25lfSBpcyByZXR1cm5lZC4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlde2dldF9ub3RBZnRlcn17fQpSZXR1cm4gYSBzdHJpbmcgZ2l2aW5nIHRoZSB0aW1lIGFmdGVyIHdoaWNoIHRoZSBjZXJ0aWZpY2F0ZSBpcyBub3QgdmFsaWQuICBUaGUKc3RyaW5nIGlzIGZvcm1hdHRlZCBhcyBhbiBBU04xIEdFTkVSQUxJWkVEVElNRToKXGJlZ2lue3ZlcmJhdGltfQogICAgICAgICAgICAgICAgIFlZWVlNTUREaGhtbXNzWgogICAgICAgICAgICAgICAgIFlZWVlNTUREaGhtbXNzK2hobW0KICAgICAgICAgICAgICAgICBZWVlZTU1ERGhobW1zcy1oaG1tClxlbmR7dmVyYmF0aW19CklmIG5vIHZhbHVlIGV4aXN0cyBmb3IgdGhpcyBmaWVsZCwgXGNvZGV7Tm9uZX0gaXMgcmV0dXJuZWQuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtYNTA5XXtzZXRfbm90QmVmb3JlfXt3aGVufQpDaGFuZ2UgdGhlIHRpbWUgYmVmb3JlIHdoaWNoIHRoZSBjZXJ0aWZpY2F0ZSBpcyBub3QgdmFsaWQuICBcdmFye3doZW59IGlzIGEKc3RyaW5nIGZvcm1hdHRlZCBhcyBhbiBBU04xIEdFTkVSQUxJWkVEVElNRToKXGJlZ2lue3ZlcmJhdGltfQogICAgICAgICAgICAgICAgIFlZWVlNTUREaGhtbXNzWgogICAgICAgICAgICAgICAgIFlZWVlNTUREaGhtbXNzK2hobW0KICAgICAgICAgICAgICAgICBZWVlZTU1ERGhobW1zcy1oaG1tClxlbmR7dmVyYmF0aW19ClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtYNTA5XXtzZXRfbm90QWZ0ZXJ9e3doZW59CkNoYW5nZSB0aGUgdGltZSBhZnRlciB3aGljaCB0aGUgY2VydGlmaWNhdGUgaXMgbm90IHZhbGlkLiAgXHZhcnt3aGVufSBpcyBhCnN0cmluZyBmb3JtYXR0ZWQgYXMgYW4gQVNOMSBHRU5FUkFMSVpFRFRJTUU6ClxiZWdpbnt2ZXJiYXRpbX0KICAgICAgICAgICAgICAgICBZWVlZTU1ERGhobW1zc1oKICAgICAgICAgICAgICAgICBZWVlZTU1ERGhobW1zcytoaG1tCiAgICAgICAgICAgICAgICAgWVlZWU1NRERoaG1tc3MtaGhtbQpcZW5ke3ZlcmJhdGltfQpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bWDUwOV17Z210aW1lX2Fkal9ub3RCZWZvcmV9e3RpbWV9CkFkanVzdCB0aGUgdGltZXN0YW1wIChpbiBHTVQpIHdoZW4gdGhlIGNlcnRpZmljYXRlIHN0YXJ0cyBiZWluZyB2YWxpZC4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlde2dtdGltZV9hZGpfbm90QWZ0ZXJ9e3RpbWV9CkFkanVzdCB0aGUgdGltZXN0YW1wIChpbiBHTVQpIHdoZW4gdGhlIGNlcnRpZmljYXRlIHN0b3BzIGJlaW5nIHZhbGlkLgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bWDUwOV17aGFzX2V4cGlyZWR9e30KQ2hlY2tzIHRoZSBjZXJ0aWZpY2F0ZSdzIHRpbWUgc3RhbXAgYWdhaW5zdCBjdXJyZW50IHRpbWUuIFJldHVybnMgdHJ1ZSBpZiB0aGUKY2VydGlmaWNhdGUgaGFzIGV4cGlyZWQgYW5kIGZhbHNlIG90aGVyd2lzZS4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlde3NldF9pc3N1ZXJ9e2lzc3Vlcn0KU2V0IHRoZSBpc3N1ZXIgb2YgdGhlIGNlcnRpZmljYXRlIHRvIFx2YXJ7aXNzdWVyfS4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlde3NldF9wdWJrZXl9e3BrZXl9ClNldCB0aGUgcHVibGljIGtleSBvZiB0aGUgY2VydGlmaWNhdGUgdG8gXHZhcntwa2V5fS4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlde3NldF9zZXJpYWxfbnVtYmVyfXtzZXJpYWxub30KU2V0IHRoZSBzZXJpYWwgbnVtYmVyIG9mIHRoZSBjZXJ0aWZpY2F0ZSB0byBcdmFye3NlcmlhbG5vfS4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlde3NldF9zdWJqZWN0fXtzdWJqZWN0fQpTZXQgdGhlIHN1YmplY3Qgb2YgdGhlIGNlcnRpZmljYXRlIHRvIFx2YXJ7c3ViamVjdH0uClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtYNTA5XXtzZXRfdmVyc2lvbn17dmVyc2lvbn0KU2V0IHRoZSBjZXJ0aWZpY2F0ZSB2ZXJzaW9uIHRvIFx2YXJ7dmVyc2lvbn0uClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtYNTA5XXtzaWdufXtwa2V5LCBkaWdlc3R9ClNpZ24gdGhlIGNlcnRpZmljYXRlLCB1c2luZyB0aGUga2V5IFx2YXJ7cGtleX0gYW5kIHRoZSBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0KaWRlbnRpZmllZCBieSB0aGUgc3RyaW5nIFx2YXJ7ZGlnZXN0fS4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlde3N1YmplY3RfbmFtZV9oYXNofXt9ClJldHVybiB0aGUgaGFzaCBvZiB0aGUgY2VydGlmaWNhdGUgc3ViamVjdC4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlde2RpZ2VzdH17ZGlnZXN0X25hbWV9ClJldHVybiBhIGRpZ2VzdCBvZiB0aGUgY2VydGlmaWNhdGUsIHVzaW5nIHRoZSBcdmFye2RpZ2VzdF9uYW1lfSBtZXRob2QuClx2YXJ7ZGlnZXN0X25hbWV9IG11c3QgYmUgYSBzdHJpbmcgZGVzY3JpYmluZyBhIGRpZ2VzdCBhbGdvcml0aG0gc3VwcG9ydGVkCmJ5IE9wZW5TU0wgKGJ5IEVWUF9nZXRfZGlnZXN0YnluYW1lLCBzcGVjaWZpY2FsbHkpLiAgRm9yIGV4YW1wbGUsClxjb25zdGFudHsibWQ1In0gb3IgXGNvbnN0YW50eyJzaGExIn0uClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtYNTA5XXthZGRfZXh0ZW5zaW9uc317ZXh0ZW5zaW9uc30KQWRkIHRoZSBleHRlbnNpb25zIGluIHRoZSBzZXF1ZW5jZSBcdmFye2V4dGVuc2lvbnN9IHRvIHRoZSBjZXJ0aWZpY2F0ZS4KXGVuZHttZXRob2RkZXNjfQoKXHN1YnN1YnNlY3Rpb257WDUwOU5hbWUgb2JqZWN0cyBcbGFiZWx7b3BlbnNzbC14NTA5bmFtZX19CgpYNTA5TmFtZSBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgoKXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlOYW1lXXtoYXNofXt9ClJldHVybiBhbiBpbnRlZ2VyIGdpdmluZyB0aGUgZmlyc3QgZm91ciBieXRlcyBvZiB0aGUgTUQ1IGRpZ2VzdCBvZiB0aGUgREVSCnJlcHJlc2VudGF0aW9uIG9mIHRoZSBuYW1lLgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bWDUwOU5hbWVde2Rlcn17fQpSZXR1cm4gYSBzdHJpbmcgZ2l2aW5nIHRoZSBERVIgcmVwcmVzZW50YXRpb24gb2YgdGhlIG5hbWUuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtYNTA5TmFtZV17Z2V0X2NvbXBvbmVudHN9e30KUmV0dXJuIGEgbGlzdCBvZiB0d28tdHVwbGVzIG9mIHN0cmluZ3MgZ2l2aW5nIHRoZSBjb21wb25lbnRzIG9mIHRoZSBuYW1lLgpcZW5ke21ldGhvZGRlc2N9CgpYNTA5TmFtZSBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBtZW1iZXJzOgoKXGJlZ2lue21lbWJlcmRlc2N9W1g1MDlOYW1lXXtjb3VudHJ5TmFtZX0KVGhlIGNvdW50cnkgb2YgdGhlIGVudGl0eS4gXGNvZGV7Q30gbWF5IGJlIHVzZWQgYXMgYW4gYWxpYXMgZm9yClxjb2Rle2NvdW50cnlOYW1lfS4KXGVuZHttZW1iZXJkZXNjfQoKXGJlZ2lue21lbWJlcmRlc2N9W1g1MDlOYW1lXXtzdGF0ZU9yUHJvdmluY2VOYW1lfQpUaGUgc3RhdGUgb3IgcHJvdmluY2Ugb2YgdGhlIGVudGl0eS4gXGNvZGV7U1R9IG1heSBiZSB1c2VkIGFzIGFuIGFsaWFzIGZvcgpcY29kZXtzdGF0ZU9yUHJvdmluY2VOYW1lfbcKXGVuZHttZW1iZXJkZXNjfQoKXGJlZ2lue21lbWJlcmRlc2N9W1g1MDlOYW1lXXtsb2NhbGl0eU5hbWV9ClRoZSBsb2NhbGl0eSBvZiB0aGUgZW50aXR5LiBcY29kZXtMfSBtYXkgYmUgdXNlZCBhcyBhbiBhbGlhcyBmb3IKXGNvZGV7bG9jYWxpdHlOYW1lfS4KXGVuZHttZW1iZXJkZXNjfQoKXGJlZ2lue21lbWJlcmRlc2N9W1g1MDlOYW1lXXtvcmdhbml6YXRpb25OYW1lfQpUaGUgb3JnYW5pemF0aW9uIG5hbWUgb2YgdGhlIGVudGl0eS4gXGNvZGV7T30gbWF5IGJlIHVzZWQgYXMgYW4gYWxpYXMgZm9yClxjb2Rle29yZ2FuaXphdGlvbk5hbWV9LgpcZW5ke21lbWJlcmRlc2N9CgpcYmVnaW57bWVtYmVyZGVzY31bWDUwOU5hbWVde29yZ2FuaXphdGlvbmFsVW5pdE5hbWV9ClRoZSBvcmdhbml6YXRpb25hbCB1bml0IG9mIHRoZSBlbnRpdHkuIFxjb2Rle09VfSBtYXkgYmUgdXNlZCBhcyBhbiBhbGlhcyBmb3IKXGNvZGV7b3JnYW5pemF0aW9uYWxVbml0TmFtZX0uClxlbmR7bWVtYmVyZGVzY30KClxiZWdpbnttZW1iZXJkZXNjfVtYNTA5TmFtZV17Y29tbW9uTmFtZX0KVGhlIGNvbW1vbiBuYW1lIG9mIHRoZSBlbnRpdHkuIFxjb2Rle0NOfSBtYXkgYmUgdXNlZCBhcyBhbiBhbGlhcyBmb3IKXGNvZGV7Y29tbW9uTmFtZX0uClxlbmR7bWVtYmVyZGVzY30KClxiZWdpbnttZW1iZXJkZXNjfVtYNTA5TmFtZV17ZW1haWxBZGRyZXNzfQpUaGUgZS1tYWlsIGFkZHJlc3Mgb2YgdGhlIGVudGl0eS4KXGVuZHttZW1iZXJkZXNjfQoKXHN1YnN1YnNlY3Rpb257WDUwOVJlcSBvYmplY3RzIFxsYWJlbHtvcGVuc3NsLXg1MDlyZXF9fQoKWDUwOVJlcSBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgoKXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlSZXFde2dldF9wdWJrZXl9e30KUmV0dXJuIGEgUEtleSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBwdWJsaWMga2V5IG9mIHRoZSBjZXJ0aWZpY2F0ZSByZXF1ZXN0LgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bWDUwOVJlcV17Z2V0X3N1YmplY3R9e30KUmV0dXJuIGFuIFg1MDlOYW1lIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHN1YmplY3Qgb2YgdGhlIGNlcnRpZmljYXRlLgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bWDUwOVJlcV17c2V0X3B1YmtleX17cGtleX0KU2V0IHRoZSBwdWJsaWMga2V5IG9mIHRoZSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IHRvIFx2YXJ7cGtleX0uClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtYNTA5UmVxXXtzaWdufXtwa2V5LCBkaWdlc3R9ClNpZ24gdGhlIGNlcnRpZmljYXRlIHJlcXVlc3QsIHVzaW5nIHRoZSBrZXkgXHZhcntwa2V5fSBhbmQgdGhlIG1lc3NhZ2UgZGlnZXN0CmFsZ29yaXRobSBpZGVudGlmaWVkIGJ5IHRoZSBzdHJpbmcgXHZhcntkaWdlc3R9LgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bWDUwOVJlcV17dmVyaWZ5fXtwa2V5fQpWZXJpZnkgYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IHVzaW5nIHRoZSBwdWJsaWMga2V5IFx2YXJ7cGtleX0uClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtYNTA5UmVxXXtzZXRfdmVyc2lvbn17dmVyc2lvbn0KU2V0IHRoZSB2ZXJzaW9uIChSRkMgMjQ1OSwgNC4xLjIuMSkgb2YgdGhlIGNlcnRpZmljYXRlIHJlcXVlc3QgdG8KXHZhcnt2ZXJzaW9ufS4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlSZXFde2dldF92ZXJzaW9ufXt9CkdldCB0aGUgdmVyc2lvbiAoUkZDIDI0NTksIDQuMS4yLjEpIG9mIHRoZSBjZXJ0aWZpY2F0ZSByZXF1ZXN0LgpcZW5ke21ldGhvZGRlc2N9Cgpcc3Vic3Vic2VjdGlvbntYNTA5U3RvcmUgb2JqZWN0cyBcbGFiZWx7b3BlbnNzbC14NTA5c3RvcmV9fQoKVGhlIFg1MDlTdG9yZSBvYmplY3QgaGFzIGN1cnJlbnRseSBqdXN0IG9uZSBtZXRob2Q6CgpcYmVnaW57bWV0aG9kZGVzY31bWDUwOVN0b3JlXXthZGRfY2VydH17Y2VydH0KQWRkIHRoZSBjZXJ0aWZpY2F0ZSBcdmFye2NlcnR9IHRvIHRoZSBjZXJ0aWZpY2F0ZSBzdG9yZS4KXGVuZHttZXRob2RkZXNjfQoKXHN1YnN1YnNlY3Rpb257UEtleSBvYmplY3RzIFxsYWJlbHtvcGVuc3NsLXBrZXl9fQoKVGhlIFBLZXkgb2JqZWN0IGhhcyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CgpcYmVnaW57bWV0aG9kZGVzY31bUEtleV17Yml0c317fQpSZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzIG9mIHRoZSBrZXkuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtQS2V5XXtnZW5lcmF0ZV9rZXl9e3R5cGUsIGJpdHN9CkdlbmVyYXRlIGEgcHVibGljL3ByaXZhdGUga2V5IHBhaXIgb2YgdGhlIHR5cGUgXHZhcnt0eXBlfSAob25lIG9mClxjb25zdGFudHtUWVBFX1JTQX0gYW5kIFxjb25zdGFudHtUWVBFX0RTQX0pIHdpdGggdGhlIHNpemUgXHZhcntiaXRzfS4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W1BLZXlde3R5cGV9e30KUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBrZXkuClxlbmR7bWV0aG9kZGVzY30KClxzdWJzdWJzZWN0aW9ue1BLQ1M3IG9iamVjdHMgXGxhYmVse29wZW5zc2wtcGtjczd9fQoKUEtDUzcgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKClxiZWdpbnttZXRob2RkZXNjfVtQS0NTN117dHlwZV9pc19zaWduZWR9e30KRklYTUUKXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W1BLQ1M3XXt0eXBlX2lzX2VudmVsb3BlZH17fQpGSVhNRQpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bUEtDUzdde3R5cGVfaXNfc2lnbmVkQW5kRW52ZWxvcGVkfXt9CkZJWE1FClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtQS0NTN117dHlwZV9pc19kYXRhfXt9CkZJWE1FClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtQS0NTN117Z2V0X3R5cGVfbmFtZX17fQpHZXQgdGhlIHR5cGUgbmFtZSBvZiB0aGUgUEtDUzcuClxlbmR7bWV0aG9kZGVzY30KClxzdWJzdWJzZWN0aW9ue1BLQ1MxMiBvYmplY3RzIFxsYWJlbHtvcGVuc3NsLXBrY3MxMn19CgpQS0NTMTIgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKClxiZWdpbnttZXRob2RkZXNjfVtQS0NTMTJde2V4cG9ydH17XG9wdGlvbmFse3Bhc3NwaHJhc2U9Tm9uZX1cb3B0aW9uYWx7LCBpdGVyPTIwNDh9XG9wdGlvbmFseywgbWFjaXRlcj0xfX0KUmV0dXJucyBhIFBLQ1MxMiBvYmplY3QgYXMgYSBzdHJpbmcuCgpUaGUgb3B0aW9uYWwgXHZhcntwYXNzcGhyYXNlfSBtdXN0IGJlIGEgc3RyaW5nIG5vdCBhIGNhbGxiYWNrLgoKU2VlIGFsc28gdGhlIG1hbiBwYWdlIGZvciB0aGUgQyBmdW5jdGlvbiBcZnVuY3Rpb257UEtDUzEyX2NyZWF0ZX0uClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtQS0NTMTJde2dldF9jYV9jZXJ0aWZpY2F0ZXN9e30KUmV0dXJuIENBIGNlcnRpZmljYXRlcyB3aXRoaW4gdGhlIFBLQ1MxMiBvYmplY3QgYXMgYSB0dXBsZS4gUmV0dXJucwpcY29uc3RhbnR7Tm9uZX0gaWYgbm8gQ0EgY2VydGlmaWNhdGVzIGFyZSBwcmVzZW50LgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bUEtDUzEyXXtnZXRfY2VydGlmaWNhdGV9e30KUmV0dXJuIGNlcnRpZmljYXRlIHBvcnRpb24gb2YgdGhlIFBLQ1MxMiBzdHJ1Y3R1cmUuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtQS0NTMTJde2dldF9mcmllbmRseW5hbWV9e30KUmV0dXJuIGZyaWVuZGx5TmFtZSBwb3J0aW9uIG9mIHRoZSBQS0NTMTIgc3RydWN0dXJlLgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bUEtDUzEyXXtnZXRfcHJpdmF0ZWtleX17fQpSZXR1cm4gcHJpdmF0ZSBrZXkgcG9ydGlvbiBvZiB0aGUgUEtDUzEyIHN0cnVjdHVyZQpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bUEtDUzEyXXtzZXRfY2FfY2VydGlmaWNhdGVzfXtjYWNlcnRzfQpSZXBsYWNlIG9yIHNldCB0aGUgQ0EgY2VydGlmaWNhdGVzIHdpdGhpbiB0aGUgUEtDUzEyIG9iamVjdCB3aXRoIHRoZSBzZXF1ZW5jZSBcdmFye2NhY2VydHN9LgoKU2V0IFx2YXJ7Y2FjZXJ0c30gdG8gXGNvbnN0YW50e05vbmV9IHRvIHJlbW92ZSBhbGwgQ0EgY2VydGlmaWNhdGVzLgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bUEtDUzEyXXtzZXRfY2VydGlmaWNhdGV9e2NlcnR9ClJlcGxhY2Ugb3Igc2V0IHRoZSBjZXJ0aWZpY2F0ZSBwb3J0aW9uIG9mIHRoZSBQS0NTMTIgc3RydWN0dXJlLgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bUEtDUzEyXXtzZXRfZnJpZW5kbHluYW1lfXtuYW1lfQpSZXBsYWNlIG9yIHNldCB0aGUgZnJpZW5kbHlOYW1lIHBvcnRpb24gb2YgdGhlIFBLQ1MxMiBzdHJ1Y3R1cmUuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtQS0NTMTJde3NldF9wcml2YXRla2V5fXtwa2V5fQpSZXBsYWNlIG9yIHNldCBwcml2YXRlIGtleSBwb3J0aW9uIG9mIHRoZSBQS0NTMTIgc3RydWN0dXJlClxlbmR7bWV0aG9kZGVzY30KClxzdWJzdWJzZWN0aW9ue1g1MDlFeHRlbnNpb24gb2JqZWN0cyBcbGFiZWx7b3BlbnNzbC01MDlleHR9fQoKWDUwOUV4dGVuc2lvbiBvYmplY3RzIGhhdmUgc2V2ZXJhbCBtZXRob2RzOgoKXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlFeHRlbnNpb25de2dldF9jcml0aWNhbH17fQpSZXR1cm4gdGhlIGNyaXRpY2FsIGZpZWxkIG9mIHRoZSBleHRlbnNpb24gb2JqZWN0LgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bWDUwOUV4dGVuc2lvbl17Z2V0X3Nob3J0X25hbWV9e30KUmV0dXJuIHRoZSBzaG9ydCB0eXBlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBvYmplY3QuClxlbmR7bWV0aG9kZGVzY30KClxzdWJzdWJzZWN0aW9ue05ldHNjYXBlU1BLSSBvYmplY3RzIFxsYWJlbHtvcGVuc3NsLW5ldHNjYXBlLXNwa2l9fQoKTmV0c2NhcGVTUEtJIG9iamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CgpcYmVnaW57bWV0aG9kZGVzY31bTmV0c2NhcGVTUEtJXXtiNjRfZW5jb2RlfXt9ClJldHVybiBhIGJhc2U2NC1lbmNvZGVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bTmV0c2NhcGVTUEtJXXtnZXRfcHVia2V5fXt9ClJldHVybiB0aGUgcHVibGljIGtleSBvZiBvYmplY3QuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtOZXRzY2FwZVNQS0lde3NldF9wdWJrZXl9e2tleX0KU2V0IHRoZSBwdWJsaWMga2V5IG9mIHRoZSBvYmplY3QgdG8gXHZhcntrZXl9LgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bTmV0c2NhcGVTUEtJXXtzaWdufXtrZXksIGRpZ2VzdF9uYW1lfQpTaWduIHRoZSBOZXRzY2FwZVNQS0kgb2JqZWN0IHVzaW5nIHRoZSBnaXZlbiBcdmFye2tleX0gYW5kClx2YXJ7ZGlnZXN0X25hbWV9LiAgXHZhcntkaWdlc3RfbmFtZX0gbXVzdCBiZSBhIHN0cmluZyBkZXNjcmliaW5nIGEgZGlnZXN0CmFsZ29yaXRobSBzdXBwb3J0ZWQgYnkgT3BlblNTTCAoYnkgRVZQX2dldF9kaWdlc3RieW5hbWUsIHNwZWNpZmljYWxseSkuICBGb3IKZXhhbXBsZSwgXGNvbnN0YW50eyJtZDUifSBvciBcY29uc3RhbnR7InNoYTEifS4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W05ldHNjYXBlU1BLSV17dmVyaWZ5fXtrZXl9ClZlcmlmeSB0aGUgTmV0c2NhcGVTUEtJIG9iamVjdCB1c2luZyB0aGUgZ2l2ZW4gXHZhcntrZXl9LgpcZW5ke21ldGhvZGRlc2N9Cgpcc3Vic3Vic2VjdGlvbntDUkwgb2JqZWN0cyBcbGFiZWx7Y3JsfX0KCkNSTCBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgoKXGJlZ2lue21ldGhvZGRlc2N9W0NSTF17YWRkX3Jldm9rZWR9e3Jldm9rZWR9CkFkZCBhIFJldm9rZWQgb2JqZWN0IHRvIHRoZSBDUkwsIGJ5IHZhbHVlIG5vdCByZWZlcmVuY2UuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDUkxde2V4cG9ydH17Y2VydCwga2V5XG9wdGlvbmFseywgdHlwZT1GSUxFVFlQRV9QRU19XG9wdGlvbmFseywgZGF5cz0xMDB9fQpVc2UgXHZhcntjZXJ0fSBhbmQgXHZhcntrZXl9IHRvIHNpZ24gdGhlIENSTCBhbmQgcmV0dXJuIHRoZSBDUkwgYXMgYSBzdHJpbmcuClx2YXJ7ZGF5c30gaXMgdGhlIG51bWJlciBvZiBkYXlzIGJlZm9yZSB0aGUgbmV4dCBDUkwgaXMgZHVlLgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bQ1JMXXtnZXRfcmV2b2tlZH17fQpSZXR1cm4gYSB0dXBsZSBvZiBSZXZva2VkIG9iamVjdHMsIGJ5IHZhbHVlIG5vdCByZWZlcmVuY2UuClxlbmR7bWV0aG9kZGVzY30KClxzdWJzdWJzZWN0aW9ue1Jldm9rZWQgb2JqZWN0cyBcbGFiZWx7cmV2b2tlZH19CgpSZXZva2VkIG9iamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CgpcYmVnaW57bWV0aG9kZGVzY31bUmV2b2tlZF17YWxsX3JlYXNvbnN9e30KUmV0dXJuIGEgbGlzdCBvZiBhbGwgc3VwcG9ydGVkIHJlYXNvbnMuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtSZXZva2VkXXtnZXRfcmVhc29ufXt9ClJldHVybiB0aGUgcmV2b2NhdGlvbiByZWFzb24gYXMgYSBzdHIuICBDYW4gYmUKTm9uZSwgd2hpY2ggZGlmZmVycyBmcm9tICJVbnNwZWNpZmllZCIuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtSZXZva2VkXXtnZXRfcmV2X2RhdGV9e30KUmV0dXJuIHRoZSByZXZvY2F0aW9uIGRhdGUgYXMgYSBzdHIuClRoZSBzdHJpbmcgaXMgZm9ybWF0dGVkIGFzIGFuIEFTTjEgR0VORVJBTElaRURUSU1FLgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bUmV2b2tlZF17Z2V0X3NlcmlhbH17fQpSZXR1cm4gYSBzdHIgY29udGFpbmluZyBhIGhleCBudW1iZXIgb2YgdGhlIHNlcmlhbCBvZiB0aGUgcmV2b2tlZCBjZXJ0aWZpY2F0ZS4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W1Jldm9rZWRde3NldF9yZWFzb259e3JlYXNvbn0KU2V0IHRoZSByZXZvY2F0aW9uIHJlYXNvbi4gIFx2YXJ7cmVhc29ufSBtdXN0CmJlIE5vbmUgb3IgYSBzdHJpbmcsIGJ1dCB0aGUgdmFsdWVzIGFyZSBsaW1pdGVkLiAgClNwYWNlcyBhbmQgY2FzZSBhcmUgaWdub3JlZC4gIFNlZSBcbWV0aG9ke2FsbF9yZWFzb25zfS4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W1Jldm9rZWRde3NldF9yZXZfZGF0ZX17ZGF0ZX0KU2V0IHRoZSByZXZvY2F0aW9uIGRhdGUuClRoZSBzdHJpbmcgaXMgZm9ybWF0dGVkIGFzIGFuIEFTTjEgR0VORVJBTElaRURUSU1FLgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bUmV2b2tlZF17c2V0X3NlcmlhbH17c2VyaWFsfQpcdmFye3NlcmlhbH0gaXMgYSBzdHJpbmcgY29udGFpbmluZyBhIGhleCBudW1iZXIgb2YgdGhlIHNlcmlhbCBvZiB0aGUgcmV2b2tlZCBjZXJ0aWZpY2F0ZS4KXGVuZHttZXRob2RkZXNjfQoKCiUgJSAlIHJhbmQgbW9kdWxlCgpcc3Vic2VjdGlvbntcbW9kdWxle3JhbmR9IC0tLSBBbiBpbnRlcmZhY2UgdG8gdGhlIE9wZW5TU0wgcHNldWRvIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIFxsYWJlbHtvcGVuc3NsLXJhbmR9fQoKXGRlY2xhcmVtb2R1bGV7ZXh0ZW5zaW9ufXtyYW5kfQpcbW9kdWxlc3lub3BzaXN7QW4gaW50ZXJmYWNlIHRvIHRoZSBPcGVuU1NMIHBzZXVkbyByYW5kb20gbnVtYmVyIGdlbmVyYXRvcn0KClRoaXMgbW9kdWxlIGhhbmRsZXMgdGhlIE9wZW5TU0wgcHNldWRvIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIChQUk5HKSBhbmQKZGVjbGFyZXMgdGhlIGZvbGxvd2luZzoKClxiZWdpbntmdW5jZGVzY317YWRkfXtzdHJpbmcsIGVudHJvcHl9Ck1peCBieXRlcyBmcm9tIFx2YXJ7c3RyaW5nfSBpbnRvIHRoZSBQUk5HIHN0YXRlLiBUaGUgXHZhcntlbnRyb3B5fSBhcmd1bWVudCBpcwoodGhlIGxvd2VyIGJvdW5kIG9mKSBhbiBlc3RpbWF0ZSBvZiBob3cgbXVjaCByYW5kb21uZXNzIGlzIGNvbnRhaW5lZCBpbgpcdmFye3N0cmluZ30sIG1lYXN1cmVkIGluIGJ5dGVzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGUuZy4gXHJmY3sxNzUwfS4KXGVuZHtmdW5jZGVzY30KClxiZWdpbntmdW5jZGVzY317Ynl0ZXN9e251bV9ieXRlc30KR2V0IHNvbWUgcmFuZG9tIGJ5dGVzIGZyb20gdGhlIFBSTkcgYXMgYSBzdHJpbmcuCgpUaGlzIGlzIGEgd3JhcHBlciBmb3IgdGhlIEMgZnVuY3Rpb24gXGZ1bmN0aW9ue1JBTkRfYnl0ZXN9LgpcZW5ke2Z1bmNkZXNjfQoKXGJlZ2lue2Z1bmNkZXNjfXtjbGVhbnVwfXt9CkVyYXNlIHRoZSBtZW1vcnkgdXNlZCBieSB0aGUgUFJORy4KClRoaXMgaXMgYSB3cmFwcGVyIGZvciB0aGUgQyBmdW5jdGlvbiBcZnVuY3Rpb257UkFORF9jbGVhbnVwfS4KXGVuZHtmdW5jZGVzY30KClxiZWdpbntmdW5jZGVzY317ZWdkfXtwYXRoXG9wdGlvbmFseywgYnl0ZXN9fQpRdWVyeSB0aGUgRW50cm9weSBHYXRoZXJpbmcgRGFlbW9uXGZvb3Rub3Rle1NlZQpcdXJse2h0dHA6Ly93d3cubG90aGFyLmNvbS90ZWNoL2NyeXB0by99fSBvbiBzb2NrZXQgXHZhcntwYXRofSBmb3IgXHZhcntieXRlc30KYnl0ZXMgb2YgcmFuZG9tIGRhdGEgYW5kIGFuZCB1c2VzIFxmdW5jdGlvbnthZGR9IHRvIHNlZWQgdGhlIFBSTkcuIFRoZSBkZWZhdWx0CnZhbHVlIG9mIFx2YXJ7Ynl0ZXN9IGlzIDI1NS4KXGVuZHtmdW5jZGVzY30KClxiZWdpbntmdW5jZGVzY317bG9hZF9maWxlfXtwYXRoXG9wdGlvbmFseywgYnl0ZXN9fQpSZWFkIFx2YXJ7Ynl0ZXN9IGJ5dGVzIChvciBhbGwgb2YgaXQsIGlmIFx2YXJ7Ynl0ZXN9IGlzIG5lZ2F0aXZlKSBvZiBkYXRhIGZyb20KdGhlIGZpbGUgXHZhcntwYXRofSB0byBzZWVkIHRoZSBQUk5HLiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBcdmFye2J5dGVzfSBpcyAtMS4KXGVuZHtmdW5jZGVzY30KClxiZWdpbntmdW5jZGVzY317c2NyZWVufXt9CkFkZCB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgc2NyZWVuIHRvIHRoZSBQUk5HIHN0YXRlLgpBdmFpbGFiaWxpdHk6IFdpbmRvd3MuClxlbmR7ZnVuY2Rlc2N9CgpcYmVnaW57ZnVuY2Rlc2N9e3NlZWR9e3N0cmluZ30KVGhpcyBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgXGZ1bmN0aW9ue2FkZH0gd2l0aCBcdmFye2VudHJvcHl9IGFzIHRoZSBsZW5ndGgKb2YgdGhlIHN0cmluZy4KXGVuZHtmdW5jZGVzY30KClxiZWdpbntmdW5jZGVzY317c3RhdHVzfXt9ClJldHVybnMgdHJ1ZSBpZiB0aGUgUFJORyBoYXMgYmVlbiBzZWVkZWQgd2l0aCBlbm91Z2ggZGF0YSwgYW5kIGZhbHNlIG90aGVyd2lzZS4KXGVuZHtmdW5jZGVzY30KClxiZWdpbntmdW5jZGVzY317d3JpdGVfZmlsZX17cGF0aH0KV3JpdGUgYSBudW1iZXIgb2YgcmFuZG9tIGJ5dGVzIChjdXJyZW50bHkgMTAyNCkgdG8gdGhlIGZpbGUgXHZhcntwYXRofS4gVGhpcwpmaWxlIGNhbiB0aGVuIGJlIHVzZWQgd2l0aCBcZnVuY3Rpb257bG9hZF9maWxlfSB0byBzZWVkIHRoZSBQUk5HIGFnYWluLgpcZW5ke2Z1bmNkZXNjfQoKXGJlZ2lue2V4Y2Rlc2N9e0Vycm9yfQpJZiB0aGUgY3VycmVudCBSQU5EIG1ldGhvZCBzdXBwb3J0cyBhbnkgZXJyb3JzLCB0aGlzIGlzIHJhaXNlZCB3aGVuIG5lZWRlZC4KVGhlIGRlZmF1bHQgbWV0aG9kIGRvZXMgbm90IHJhaXNlIHRoaXMgd2hlbiB0aGUgZW50cm9weSBwb29sIGlzIGRlcGxldGVkLgoKV2hlbmV2ZXIgdGhpcyBleGNlcHRpb24gaXMgcmFpc2VkIGRpcmVjdGx5LCBpdCBoYXMgYSBsaXN0IG9mIGVycm9yIG1lc3NhZ2VzCmZyb20gdGhlIE9wZW5TU0wgZXJyb3IgcXVldWUsIHdoZXJlIGVhY2ggaXRlbSBpcyBhIHR1cGxlIFxjb2RleyhcdmFye2xpYn0sClx2YXJ7ZnVuY3Rpb259LCBcdmFye3JlYXNvbn0pfS4gSGVyZSBcdmFye2xpYn0sIFx2YXJ7ZnVuY3Rpb259IGFuZCBcdmFye3JlYXNvbn0KYXJlIGFsbCBzdHJpbmdzLCBkZXNjcmliaW5nIHdoZXJlIGFuZCB3aGF0IHRoZSBwcm9ibGVtIGlzLiBTZWUgXG1hbnBhZ2V7ZXJyfXszfQpmb3IgbW9yZSBpbmZvcm1hdGlvbi4KXGVuZHtleGNkZXNjfQoKCiUgJSAlIFNTTCBtb2R1bGUKClxzdWJzZWN0aW9ue1xtb2R1bGV7U1NMfSAtLS0gQW4gaW50ZXJmYWNlIHRvIHRoZSBTU0wtc3BlY2lmaWMgcGFydHMgb2YgT3BlblNTTCBcbGFiZWx7b3BlbnNzbC1zc2x9fQoKXGRlY2xhcmVtb2R1bGV7ZXh0ZW5zaW9ufXtTU0x9Clxtb2R1bGVzeW5vcHNpc3tBbiBpbnRlcmZhY2UgdG8gdGhlIFNTTC1zcGVjaWZpYyBwYXJ0cyBvZiBPcGVuU1NMfQoKVGhpcyBtb2R1bGUgaGFuZGxlcyB0aGluZ3Mgc3BlY2lmaWMgdG8gU1NMLiBUaGVyZSBhcmUgdHdvIG9iamVjdHMgZGVmaW5lZDoKQ29udGV4dCwgQ29ubmVjdGlvbi4KClxiZWdpbntkYXRhZGVzY317U1NMdjJfTUVUSE9EfQpcZGF0YWxpbmV7U1NMdjNfTUVUSE9EfQpcZGF0YWxpbmV7U1NMdjIzX01FVEhPRH0KXGRhdGFsaW5le1RMU3YxX01FVEhPRH0KVGhlc2UgY29uc3RhbnRzIHJlcHJlc2VudCB0aGUgZGlmZmVyZW50IFNTTCBtZXRob2RzIHRvIHVzZSB3aGVuIGNyZWF0aW5nIGEKY29udGV4dCBvYmplY3QuClxlbmR7ZGF0YWRlc2N9CgpcYmVnaW57ZGF0YWRlc2N9e1ZFUklGWV9OT05FfQpcZGF0YWxpbmV7VkVSSUZZX1BFRVJ9ClxkYXRhbGluZXtWRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlR9ClRoZXNlIGNvbnN0YW50cyByZXByZXNlbnQgdGhlIHZlcmlmaWNhdGlvbiBtb2RlIHVzZWQgYnkgdGhlIENvbnRleHQKb2JqZWN0J3MgXG1ldGhvZHtzZXRfdmVyaWZ5fSBtZXRob2QuClxlbmR7ZGF0YWRlc2N9CgpcYmVnaW57ZGF0YWRlc2N9e0ZJTEVUWVBFX1BFTX0KXGRhdGFsaW5le0ZJTEVUWVBFX0FTTjF9CkZpbGUgdHlwZSBjb25zdGFudHMgdXNlZCB3aXRoIHRoZSBcbWV0aG9ke3VzZV9jZXJ0aWZpY2F0ZV9maWxlfSBhbmQKXG1ldGhvZHt1c2VfcHJpdmF0ZWtleV9maWxlfSBtZXRob2RzIG9mIENvbnRleHQgb2JqZWN0cy4KXGVuZHtkYXRhZGVzY30KClxiZWdpbntkYXRhZGVzY317T1BfU0lOR0xFX0RIX1VTRX0KXGRhdGFsaW5le09QX0VQSEVNRVJBTF9SU0F9ClxkYXRhbGluZXtPUF9OT19TU0x2Mn0KXGRhdGFsaW5le09QX05PX1NTTHYzfQpcZGF0YWxpbmV7T1BfTk9fVExTdjF9CkNvbnN0YW50cyB1c2VkIHdpdGggXG1ldGhvZHtzZXRfb3B0aW9uc30gb2YgQ29udGV4dCBvYmplY3RzLgpcY29uc3RhbnR7T1BfU0lOR0xFX0RIX1VTRX0gbWVhbnMgdG8gYWx3YXlzIGNyZWF0ZSBhIG5ldyBrZXkgd2hlbiB1c2luZyBlcGhlbWVyYWwKRGlmZmllLUhlbGxtYW4uIFxjb25zdGFudHtPUF9FUEhFTUVSQUxfUlNBfSBtZWFucyB0byBhbHdheXMgdXNlIGVwaGVtZXJhbCBSU0Ega2V5cwp3aGVuIGRvaW5nIFJTQSBvcGVyYXRpb25zLiBcY29uc3RhbnR7T1BfTk9fU1NMdjJ9LCBcY29uc3RhbnR7T1BfTk9fU1NMdjN9IGFuZApcY29uc3RhbnR7T1BfTk9fVExTdjF9IG1lYW5zIHRvIGRpc2FibGUgdGhvc2Ugc3BlY2lmaWMgcHJvdG9jb2xzLiBUaGlzIGlzCmludGVyZXN0aW5nIGlmIHlvdSdyZSB1c2luZyBlLmcuIFxjb25zdGFudHtTU0x2MjNfTUVUSE9EfSB0byBnZXQgYW4gU1NMdjItY29tcGF0aWJsZQpoYW5kc2hha2UsIGJ1dCBkb24ndCB3YW50IHRvIHVzZSBTU0x2Mi4KXGVuZHtkYXRhZGVzY30KClxiZWdpbntkYXRhZGVzY317Q29udGV4dFR5cGV9ClNlZSBcY2xhc3N7Q29udGV4dH0uClxlbmR7ZGF0YWRlc2N9CgpcYmVnaW57Y2xhc3NkZXNjfXtDb250ZXh0fXttZXRob2R9CkEgY2xhc3MgcmVwcmVzZW50aW5nIFNTTCBjb250ZXh0cy4gIENvbnRleHRzIGRlZmluZSB0aGUgcGFyYW1ldGVycyBvZiBvbmUgb3IKbW9yZSBTU0wgY29ubmVjdGlvbnMuCgpcdmFye21ldGhvZH0gc2hvdWxkIGJlIFxjb25zdGFudHtTU0x2Ml9NRVRIT0R9LCBcY29uc3RhbnR7U1NMdjNfTUVUSE9EfSwKXGNvbnN0YW50e1NTTHYyM19NRVRIT0R9IG9yIFxjb25zdGFudHtUTFN2MV9NRVRIT0R9LgpcZW5ke2NsYXNzZGVzY30KClxiZWdpbntkYXRhZGVzY317Q29ubmVjdGlvblR5cGV9ClNlZSBcY2xhc3N7Q29ubmVjdGlvbn0uClxlbmR7ZGF0YWRlc2N9CgpcYmVnaW57Y2xhc3NkZXNjfXtDb25uZWN0aW9ufXtjb250ZXh0LCBzb2NrZXR9CkEgY2xhc3MgcmVwcmVzZW50aW5nIFNTTCBjb25uZWN0aW9ucy4KClx2YXJ7Y29udGV4dH0gc2hvdWxkIGJlIGFuIGluc3RhbmNlIG9mIFxjbGFzc3tDb250ZXh0fSBhbmQgXHZhcntzb2NrZXR9CnNob3VsZCBiZSBhIHNvY2tldCBcZm9vdG5vdGV7QWN0dWFsbHksIGFsbCB0aGF0IGlzIHJlcXVpcmVkIGlzIGFuIG9iamVjdAp0aGF0IFxlbXBoe2JlaGF2ZXN9IGxpa2UgYSBzb2NrZXQsIHlvdSBjb3VsZCBldmVuIHVzZSBmaWxlcywgZXZlbiB0aG91Z2gKaXQnZCBiZSB0cmlja3kgdG8gZ2V0IHRoZSBoYW5kc2hha2VzIHJpZ2h0IX0gb2JqZWN0LiAgXHZhcntzb2NrZXR9IG1heSBiZQpcdmFye05vbmV9OyBpbiB0aGlzIGNhc2UsIHRoZSBDb25uZWN0aW9uIGlzIGNyZWF0ZWQgd2l0aCBhIG1lbW9yeSBCSU86IHNlZQp0aGUgXG1ldGhvZHtiaW9fcmVhZH0sIFxtZXRob2R7YmlvX3dyaXRlfSwgYW5kIFxtZXRob2R7YmlvX3NodXRkb3dufQptZXRob2RzLgpcZW5ke2NsYXNzZGVzY30KClxiZWdpbntleGNkZXNjfXtFcnJvcn0KVGhpcyBleGNlcHRpb24gaXMgdXNlZCBhcyBhIGJhc2UgY2xhc3MgZm9yIHRoZSBvdGhlciBTU0wtcmVsYXRlZApleGNlcHRpb25zLCBidXQgbWF5IGFsc28gYmUgcmFpc2VkIGRpcmVjdGx5LgoKV2hlbmV2ZXIgdGhpcyBleGNlcHRpb24gaXMgcmFpc2VkIGRpcmVjdGx5LCBpdCBoYXMgYSBsaXN0IG9mIGVycm9yIG1lc3NhZ2VzCmZyb20gdGhlIE9wZW5TU0wgZXJyb3IgcXVldWUsIHdoZXJlIGVhY2ggaXRlbSBpcyBhIHR1cGxlIFxjb2RleyhcdmFye2xpYn0sClx2YXJ7ZnVuY3Rpb259LCBcdmFye3JlYXNvbn0pfS4gSGVyZSBcdmFye2xpYn0sIFx2YXJ7ZnVuY3Rpb259IGFuZCBcdmFye3JlYXNvbn0KYXJlIGFsbCBzdHJpbmdzLCBkZXNjcmliaW5nIHdoZXJlIGFuZCB3aGF0IHRoZSBwcm9ibGVtIGlzLiBTZWUgXG1hbnBhZ2V7ZXJyfXszfQpmb3IgbW9yZSBpbmZvcm1hdGlvbi4KXGVuZHtleGNkZXNjfQoKXGJlZ2lue2V4Y2Rlc2N9e1plcm9SZXR1cm5FcnJvcn0KVGhpcyBleGNlcHRpb24gbWF0Y2hlcyB0aGUgZXJyb3IgcmV0dXJuIGNvZGUgXGNvZGV7U1NMX0VSUk9SX1pFUk9fUkVUVVJOfSwgYW5kCmlzIHJhaXNlZCB3aGVuIHRoZSBTU0wgQ29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQuIEluIFNTTCAzLjAgYW5kIFRMUyAxLjAsIHRoaXMKb25seSBvY2N1cnMgaWYgYSBjbG9zdXJlIGFsZXJ0IGhhcyBvY2N1cnJlZCBpbiB0aGUgcHJvdG9jb2wsIGkuZS4gdGhlCmNvbm5lY3Rpb24gaGFzIGJlZW4gY2xvc2VkIGNsZWFubHkuIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IG5lY2Vzc2FyaWx5Cm1lYW4gdGhhdCB0aGUgdHJhbnNwb3J0IGxheWVyIChlLmcuIGEgc29ja2V0KSBoYXMgYmVlbiBjbG9zZWQuCgpJdCBtYXkgc2VlbSBhIGxpdHRsZSBzdHJhbmdlIHRoYXQgdGhpcyBpcyBhbiBleGNlcHRpb24sIGJ1dCBpdCBkb2VzIG1hdGNoIGFuClxjb2Rle1NTTF9FUlJPUn0gY29kZSwgYW5kIGlzIHZlcnkgY29udmVuaWVudC4KXGVuZHtleGNkZXNjfQoKXGJlZ2lue2V4Y2Rlc2N9e1dhbnRSZWFkRXJyb3J9ClRoZSBvcGVyYXRpb24gZGlkIG5vdCBjb21wbGV0ZTsgdGhlIHNhbWUgSS9PIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGFnYWluCmxhdGVyLCB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50cy4gQW55IEkvTyBtZXRob2QgY2FuIGxlYWQgdG8gdGhpcyBzaW5jZSBuZXcKaGFuZHNoYWtlcyBjYW4gb2NjdXIgYXQgYW55IHRpbWUuCgpUaGUgd2FudGVkIHJlYWQgaXMgZm9yIFxlbXBoe2RpcnR5fSBkYXRhIHNlbnQgb3ZlciB0aGUgbmV0d29yaywgbm90IHRoZQpcZW1waHtjbGVhbn0gZGF0YSBpbnNpZGUgdGhlIHR1bm5lbC4gIEZvciBhIHNvY2tldCBiYXNlZCBTU0wgY29ubmVjdGlvbiwKXGVtcGh7cmVhZH0gbWVhbnMgZGF0YSBjb21pbmcgYXQgdXMgb3ZlciB0aGUgbmV0d29yay4gIFVudGlsIHRoYXQgcmVhZApzdWNjZWVkcywgdGhlIGF0dGVtcHRlZCBcbWV0aG9ke09wZW5TU0wuU1NMLkNvbm5lY3Rpb24ucmVjdn0sClxtZXRob2R7T3BlblNTTC5TU0wuQ29ubmVjdGlvbi5zZW5kfSwgb3IKXG1ldGhvZHtPcGVuU1NMLlNTTC5Db25uZWN0aW9uLmRvX2hhbmRzaGFrZX0gaXMgcHJldmVudGVkIG9yIGluY29tcGxldGUuIFlvdQpwcm9iYWJseSB3YW50IHRvIFxtZXRob2R7c2VsZWN0KCl9IG9uIHRoZSBzb2NrZXQgYmVmb3JlIHRyeWluZyBhZ2Fpbi4KXGVuZHtleGNkZXNjfQoKXGJlZ2lue2V4Y2Rlc2N9e1dhbnRXcml0ZUVycm9yfQpTZWUgXGV4Y2VwdGlvbntXYW50UmVhZEVycm9yfS4gIFRoZSBzb2NrZXQgc2VuZCBidWZmZXIgbWF5IGJlIHRvbyBmdWxsIHRvCndyaXRlIG1vcmUgZGF0YS4KXGVuZHtleGNkZXNjfQoKXGJlZ2lue2V4Y2Rlc2N9e1dhbnRYNTA5TG9va3VwRXJyb3J9ClRoZSBvcGVyYXRpb24gZGlkIG5vdCBjb21wbGV0ZSBiZWNhdXNlIGFuIGFwcGxpY2F0aW9uIGNhbGxiYWNrIGhhcyBhc2tlZCB0byBiZQpjYWxsZWQgYWdhaW4uIFRoZSBJL08gbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWdhaW4gbGF0ZXIsIHdpdGggdGhlIHNhbWUKYXJndW1lbnRzLiBOb3RlOiBUaGlzIHdvbid0IG9jY3VyIGluIHRoaXMgdmVyc2lvbiwgYXMgdGhlcmUgYXJlIG5vIHN1Y2gKY2FsbGJhY2tzIGluIHRoaXMgdmVyc2lvbi4KXGVuZHtleGNkZXNjfQoKXGJlZ2lue2V4Y2Rlc2N9e1N5c0NhbGxFcnJvcn0KVGhlIFxleGNlcHRpb257U3lzQ2FsbEVycm9yfSBvY2N1cnMgd2hlbiB0aGVyZSdzIGFuIEkvTyBlcnJvciBhbmQgT3BlblNTTCdzCmVycm9yIHF1ZXVlIGRvZXMgbm90IGNvbnRhaW4gYW55IGluZm9ybWF0aW9uLiBUaGlzIGNhbiBtZWFuIHR3byB0aGluZ3M6IEFuCmVycm9yIGluIHRoZSB0cmFuc3BvcnQgcHJvdG9jb2wsIG9yIGFuIGVuZCBvZiBmaWxlIHRoYXQgdmlvbGF0ZXMgdGhlIHByb3RvY29sLgpUaGUgcGFyYW1ldGVyIHRvIHRoZSBleGNlcHRpb24gaXMgYWx3YXlzIGEgcGFpciBcY29kZXsoXHZhcntlcnJudW19LApcdmFye2VycnN0cn0pfS4KXGVuZHtleGNkZXNjfQoKClxzdWJzdWJzZWN0aW9ue0NvbnRleHQgb2JqZWN0cyBcbGFiZWx7b3BlbnNzbC1jb250ZXh0fX0KCkNvbnRleHQgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKClxiZWdpbnttZXRob2RkZXNjfVtDb250ZXh0XXtjaGVja19wcml2YXRla2V5fXt9CkNoZWNrIGlmIHRoZSBwcml2YXRlIGtleSAobG9hZGVkIHdpdGggXG1ldGhvZHt1c2VfcHJpdmF0ZWtleVxvcHRpb25hbHtfZmlsZX19KQptYXRjaGVzIHRoZSBjZXJ0aWZpY2F0ZSAobG9hZGVkIHdpdGggXG1ldGhvZHt1c2VfY2VydGlmaWNhdGVcb3B0aW9uYWx7X2ZpbGV9fSkuClJldHVybnMgXGNvZGV7Tm9uZX0gaWYgdGhleSBtYXRjaCwgcmFpc2VzIFxleGNlcHRpb257RXJyb3J9IG90aGVyd2lzZS4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRleHRde2dldF9hcHBfZGF0YX17fQpSZXRyaWV2ZSBhcHBsaWNhdGlvbiBkYXRhIGFzIHNldCBieSBcbWV0aG9ke3NldF9hcHBfZGF0YX0uClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb250ZXh0XXtnZXRfY2VydF9zdG9yZX17fQpSZXRyaWV2ZSB0aGUgY2VydGlmaWNhdGUgc3RvcmUgKGEgWDUwOVN0b3JlIG9iamVjdCkgdGhhdCB0aGUgY29udGV4dCB1c2VzLgpUaGlzIGNhbiBiZSB1c2VkIHRvIGFkZCAidHJ1c3RlZCIgY2VydGlmaWNhdGVzIHdpdGhvdXQgdXNpbmcgdGhlLgpcbWV0aG9ke2xvYWRfdmVyaWZ5X2xvY2F0aW9ucygpfSBtZXRob2QuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb250ZXh0XXtnZXRfdGltZW91dH17fQpSZXRyaWV2ZSBzZXNzaW9uIHRpbWVvdXQsIGFzIHNldCBieSBcbWV0aG9ke3NldF90aW1lb3V0fS4gVGhlIGRlZmF1bHQgaXMgMzAwCnNlY29uZHMuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb250ZXh0XXtnZXRfdmVyaWZ5X2RlcHRofXt9ClJldHJpZXZlIHRoZSBDb250ZXh0IG9iamVjdCdzIHZlcmlmeSBkZXB0aCwgYXMgc2V0IGJ5ClxtZXRob2R7c2V0X3ZlcmlmeV9kZXB0aH0uClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb250ZXh0XXtnZXRfdmVyaWZ5X21vZGV9e30KUmV0cmlldmUgdGhlIENvbnRleHQgb2JqZWN0J3MgdmVyaWZ5IG1vZGUsIGFzIHNldCBieSBcbWV0aG9ke3NldF92ZXJpZnl9LgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bQ29udGV4dF17bG9hZF9jbGllbnRfY2F9e3BlbWZpbGV9ClJlYWQgYSBmaWxlIHdpdGggUEVNLWZvcm1hdHRlZCBjZXJ0aWZpY2F0ZXMgdGhhdCB3aWxsIGJlIHNlbnQgdG8gdGhlIGNsaWVudAp3aGVuIHJlcXVlc3RpbmcgYSBjbGllbnQgY2VydGlmaWNhdGUuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb250ZXh0XXtzZXRfY2xpZW50X2NhX2xpc3R9e2NlcnRpZmljYXRlX2F1dGhvcml0aWVzfQpSZXBsYWNlIHRoZSBjdXJyZW50IGxpc3Qgb2YgcHJlZmVycmVkIGNlcnRpZmljYXRlIHNpZ25lcnMgdGhhdCB3b3VsZCBiZQpzZW50IHRvIHRoZSBjbGllbnQgd2hlbiByZXF1ZXN0aW5nIGEgY2xpZW50IGNlcnRpZmljYXRlIHdpdGggdGhlClx2YXJ7Y2VydGlmaWNhdGVfYXV0aG9yaXRpZXN9IHNlcXVlbmNlIG9mIFxjbGFzc3tPcGVuU1NMLmNyeXB0by5YNTA5TmFtZX1zLgoKXHZlcnNpb25hZGRlZHswLjEwfQpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bQ29udGV4dF17YWRkX2NsaWVudF9jYX17Y2VydGlmaWNhdGVfYXV0aG9yaXR5fQpFeHRyYWN0IGEgXGNsYXNze09wZW5TU0wuY3J5cHRvLlg1MDlOYW1lfSBmcm9tIHRoZSBcdmFye2NlcnRpZmljYXRlX2F1dGhvcml0eX0KXGNsYXNze09wZW5TU0wuY3J5cHRvLlg1MDl9IGNlcnRpZmljYXRlIGFuZCBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgcHJlZmVycmVkCmNlcnRpZmljYXRlIHNpZ25lcnMgc2VudCB0byB0aGUgY2xpZW50IHdoZW4gcmVxdWVzdGluZyBhIGNsaWVudCBjZXJ0aWZpY2F0ZS4KClx2ZXJzaW9uYWRkZWR7MC4xMH0KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRleHRde2xvYWRfdmVyaWZ5X2xvY2F0aW9uc317cGVtZmlsZSwgY2FwYXRofQpTcGVjaWZ5IHdoZXJlIENBIGNlcnRpZmljYXRlcyBmb3IgdmVyaWZpY2F0aW9uIHB1cnBvc2VzIGFyZSBsb2NhdGVkLiBUaGVzZQphcmUgdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMuIE5vdGUgdGhhdCB0aGUgY2VydGlmaWNhdGVzIGhhdmUgdG8gYmUgaW4gUEVNCmZvcm1hdC4gIElmIGNhcGF0aCBpcyBwYXNzZWQsIGl0IG11c3QgYmUgYSBkaXJlY3RvcnkgcHJlcGFyZWQgdXNpbmcgdGhlClxjb2Rle2NfcmVoYXNofSB0b29sIGluY2x1ZGVkIHdpdGggT3BlblNTTC4gIEVpdGhlciwgYnV0IG5vdCBib3RoLCBvZgpcdmFye3BlbWZpbGV9IG9yIFx2YXJ7Y2FwYXRofSBtYXkgYmUgXGNvZGV7Tm9uZX0uClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb250ZXh0XXtzZXRfZGVmYXVsdF92ZXJpZnlfcGF0aHN9e30KU3BlY2lmeSB0aGF0IHRoZSBwbGF0Zm9ybSBwcm92aWRlZCBDQSBjZXJ0aWZpY2F0ZXMgYXJlIHRvIGJlIHVzZWQgZm9yCnZlcmlmaWNhdGlvbiBwdXJwb3Nlcy4gIFRoaXMgbWV0aG9kIG1heSBub3Qgd29yayBwcm9wZXJseSBvbiBPUyBYLgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bQ29udGV4dF17bG9hZF90bXBfZGh9e2RoZmlsZX0KTG9hZCBwYXJhbWV0ZXJzIGZvciBFcGhlbWVyYWwgRGlmZmllLUhlbGxtYW4gZnJvbSBcdmFye2RoZmlsZX0uClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb250ZXh0XXtzZXRfYXBwX2RhdGF9e2RhdGF9CkFzc29jaWF0ZSBcdmFye2RhdGF9IHdpdGggdGhpcyBDb250ZXh0IG9iamVjdC4gXHZhcntkYXRhfSBjYW4gYmUgcmV0cmlldmVkCmxhdGVyIHVzaW5nIHRoZSBcbWV0aG9ke2dldF9hcHBfZGF0YX0gbWV0aG9kLgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bQ29udGV4dF17c2V0X2NpcGhlcl9saXN0fXtjaXBoZXJzfQpTZXQgdGhlIGxpc3Qgb2YgY2lwaGVycyB0byBiZSB1c2VkIGluIHRoaXMgY29udGV4dC4gU2VlIHRoZSBPcGVuU1NMIG1hbnVhbCBmb3IKbW9yZSBpbmZvcm1hdGlvbiAoZS5nLiBjaXBoZXJzKDEpKQpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bQ29udGV4dF17c2V0X2luZm9fY2FsbGJhY2t9e2NhbGxiYWNrfQpTZXQgdGhlIGluZm9ybWF0aW9uIGNhbGxiYWNrIHRvIFx2YXJ7Y2FsbGJhY2t9LiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCmZyb20gdGltZSB0byB0aW1lIGR1cmluZyBTU0wgaGFuZHNoYWtlcy4KXHZhcntjYWxsYmFja30gc2hvdWxkIHRha2UgdGhyZWUgYXJndW1lbnRzOiBhIENvbm5lY3Rpb24gb2JqZWN0IGFuZCB0d28KaW50ZWdlcnMuIFRoZSBmaXJzdCBpbnRlZ2VyIHNwZWNpZmllcyB3aGVyZSBpbiB0aGUgU1NMIGhhbmRzaGFrZSB0aGUgZnVuY3Rpb24Kd2FzIGNhbGxlZCwgYW5kIHRoZSBvdGhlciB0aGUgcmV0dXJuIGNvZGUgZnJvbSBhIChwb3NzaWJseSBmYWlsZWQpIGludGVybmFsCmZ1bmN0aW9uIGNhbGwuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb250ZXh0XXtzZXRfb3B0aW9uc317b3B0aW9uc30KQWRkIFNTTCBvcHRpb25zLiBPcHRpb25zIHlvdSBoYXZlIHNldCBiZWZvcmUgYXJlIG5vdCBjbGVhcmVkIQpUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCB3aXRoIHRoZSBcY29uc3RhbnR7T1BfKn0gY29uc3RhbnRzLgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bQ29udGV4dF17c2V0X3Bhc3N3ZF9jYn17Y2FsbGJhY2tcb3B0aW9uYWx7LCB1c2VyZGF0YX19ClNldCB0aGUgcGFzc3BocmFzZSBjYWxsYmFjayB0byBcdmFye2NhbGxiYWNrfS4gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZAp3aGVuIGEgcHJpdmF0ZSBrZXkgd2l0aCBhIHBhc3NwaHJhc2UgaXMgbG9hZGVkLiBcdmFye2NhbGxiYWNrfSBtdXN0IGFjY2VwdAp0aHJlZSBwb3NpdGlvbmFsIGFyZ3VtZW50cy4gIEZpcnN0LCBhbiBpbnRlZ2VyIGdpdmluZyB0aGUgbWF4aW11bSBsZW5ndGggb2YKdGhlIHBhc3NwaHJhc2UgaXQgbWF5IHJldHVybi4gIElmIHRoZSByZXR1cm5lZCBwYXNzcGhyYXNlIGlzIGxvbmdlciB0aGFuCnRoaXMsIGl0IHdpbGwgYmUgdHJ1bmNhdGVkLiAgU2Vjb25kLCBhIGJvb2xlYW4gdmFsdWUgd2hpY2ggd2lsbCBiZSB0cnVlIGlmCnRoZSB1c2VyIHNob3VsZCBiZSBwcm9tcHRlZCBmb3IgdGhlIHBhc3NwaHJhc2UgdHdpY2UgYW5kIHRoZSBjYWxsYmFjayBzaG91bGQKdmVyaWZ5IHRoYXQgdGhlIHR3byB2YWx1ZXMgc3VwcGxpZWQgYXJlIGVxdWFsLiBUaGlyZCwgdGhlIHZhbHVlIGdpdmVuIGFzIHRoZQpcdmFye3VzZXJkYXRhfSBwYXJhbWV0ZXIgdG8gXG1ldGhvZHtzZXRfcGFzc3dkX2NifS4gIElmIGFuIGVycm9yIG9jY3VycywKXHZhcntjYWxsYmFja30gc2hvdWxkIHJldHVybiBhIGZhbHNlIHZhbHVlIChlLmcuIGFuIGVtcHR5IHN0cmluZykuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb250ZXh0XXtzZXRfc2Vzc2lvbl9pZH17bmFtZX0KU2V0IHRoZSBjb250ZXh0IFx2YXJ7bmFtZX0gd2l0aGluIHdoaWNoIGEgc2Vzc2lvbiBjYW4gYmUgcmV1c2VkIGZvciB0aGlzCkNvbnRleHQgb2JqZWN0LiBUaGlzIGlzIG5lZWRlZCB3aGVuIGRvaW5nIHNlc3Npb24gcmVzdW1wdGlvbiwgYmVjYXVzZSB0aGVyZSBpcwpubyB3YXkgZm9yIGEgc3RvcmVkIHNlc3Npb24gdG8ga25vdyB3aGljaCBDb250ZXh0IG9iamVjdCBpdCBpcyBhc3NvY2lhdGVkIHdpdGguClx2YXJ7bmFtZX0gbWF5IGJlIGFueSBiaW5hcnkgZGF0YS4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRleHRde3NldF90aW1lb3V0fXt0aW1lb3V0fQpTZXQgdGhlIHRpbWVvdXQgZm9yIG5ld2x5IGNyZWF0ZWQgc2Vzc2lvbnMgZm9yIHRoaXMgQ29udGV4dCBvYmplY3QgdG8KXHZhcnt0aW1lb3V0fS4gXHZhcnt0aW1lb3V0fSBtdXN0IGJlIGdpdmVuIGluICh3aG9sZSkgc2Vjb25kcy4gVGhlIGRlZmF1bHQKdmFsdWUgaXMgMzAwIHNlY29uZHMuIFNlZSB0aGUgT3BlblNTTCBtYW51YWwgZm9yIG1vcmUgaW5mb3JtYXRpb24gKGUuZy4KU1NMX0NUWF9zZXRfdGltZW91dCgzKSkuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb250ZXh0XXtzZXRfdmVyaWZ5fXttb2RlLCBjYWxsYmFja30KU2V0IHRoZSB2ZXJpZmljYXRpb24gZmxhZ3MgZm9yIHRoaXMgQ29udGV4dCBvYmplY3QgdG8gXHZhcnttb2RlfSBhbmQgc3BlY2lmeQp0aGF0IFx2YXJ7Y2FsbGJhY2t9IHNob3VsZCBiZSB1c2VkIGZvciB2ZXJpZmljYXRpb24gY2FsbGJhY2tzLiBcdmFye21vZGV9CnNob3VsZCBiZSBvbmUgb2YgXGNvbnN0YW50e1ZFUklGWV9OT05FfSBhbmQgXGNvbnN0YW50e1ZFUklGWV9QRUVSfS4gSWYKXGNvbnN0YW50e1ZFUklGWV9QRUVSfSBpcyB1c2VkLCBcdmFye21vZGV9IGNhbiBiZSBPUjplZCB3aXRoClxjb25zdGFudHtWRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlR9IGFuZCBcY29uc3RhbnR7VkVSSUZZX0NMSUVOVF9PTkNFfSB0bwpmdXJ0aGVyIGNvbnRyb2wgdGhlIGJlaGF2aW91ci4KXHZhcntjYWxsYmFja30gc2hvdWxkIHRha2UgZml2ZSBhcmd1bWVudHM6IEEgQ29ubmVjdGlvbiBvYmplY3QsIGFuIFg1MDkgb2JqZWN0LAphbmQgdGhyZWUgaW50ZWdlciB2YXJpYWJsZXMsIHdoaWNoIGFyZSBpbiB0dXJuIHBvdGVudGlhbCBlcnJvciBudW1iZXIsIGVycm9yCmRlcHRoIGFuZCByZXR1cm4gY29kZS4gXHZhcntjYWxsYmFja30gc2hvdWxkIHJldHVybiB0cnVlIGlmIHZlcmlmaWNhdGlvbiBwYXNzZXMKYW5kIGZhbHNlIG90aGVyd2lzZS4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRleHRde3NldF92ZXJpZnlfZGVwdGh9e2RlcHRofQpTZXQgdGhlIG1heGltdW0gZGVwdGggZm9yIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbiB2ZXJpZmljYXRpb24gdGhhdCBzaGFsbCBiZQphbGxvd2VkIGZvciB0aGlzIENvbnRleHQgb2JqZWN0LgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bQ29udGV4dF17dXNlX2NlcnRpZmljYXRlfXtjZXJ0fQpVc2UgdGhlIGNlcnRpZmljYXRlIFx2YXJ7Y2VydH0gd2hpY2ggaGFzIHRvIGJlIGEgWDUwOSBvYmplY3QuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb250ZXh0XXthZGRfZXh0cmFfY2hhaW5fY2VydH17Y2VydH0KQWRkcyB0aGUgY2VydGlmaWNhdGUgXHZhcntjZXJ0fSwgd2hpY2ggaGFzIHRvIGJlIGEgWDUwOSBvYmplY3QsIHRvIHRoZQpjZXJ0aWZpY2F0ZSBjaGFpbiBwcmVzZW50ZWQgdG9nZXRoZXIgd2l0aCB0aGUgY2VydGlmaWNhdGUuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb250ZXh0XXt1c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZX17ZmlsZX0KTG9hZCBhIGNlcnRpZmljYXRlIGNoYWluIGZyb20gXHZhcntmaWxlfSB3aGljaCBtdXN0IGJlIFBFTSBlbmNvZGVkLgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bQ29udGV4dF17dXNlX3ByaXZhdGVrZXl9e3BrZXl9ClVzZSB0aGUgcHJpdmF0ZSBrZXkgXHZhcntwa2V5fSB3aGljaCBoYXMgdG8gYmUgYSBQS2V5IG9iamVjdC4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRleHRde3VzZV9jZXJ0aWZpY2F0ZV9maWxlfXtmaWxlXG9wdGlvbmFseywgZm9ybWF0fX0KTG9hZCB0aGUgZmlyc3QgY2VydGlmaWNhdGUgZm91bmQgaW4gXHZhcntmaWxlfS4gVGhlIGNlcnRpZmljYXRlIG11c3QgYmUgaW4gdGhlCmZvcm1hdCBzcGVjaWZpZWQgYnkgXHZhcntmb3JtYXR9LCB3aGljaCBpcyBlaXRoZXIgXGNvbnN0YW50e0ZJTEVUWVBFX1BFTX0gb3IKXGNvbnN0YW50e0ZJTEVUWVBFX0FTTjF9LiBUaGUgZGVmYXVsdCBpcyBcY29uc3RhbnR7RklMRVRZUEVfUEVNfS4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRleHRde3VzZV9wcml2YXRla2V5X2ZpbGV9e2ZpbGVcb3B0aW9uYWx7LCBmb3JtYXR9fQpMb2FkIHRoZSBmaXJzdCBwcml2YXRlIGtleSBmb3VuZCBpbiBcdmFye2ZpbGV9LiBUaGUgcHJpdmF0ZSBrZXkgbXVzdCBiZSBpbiB0aGUKZm9ybWF0IHNwZWNpZmllZCBieSBcdmFye2Zvcm1hdH0sIHdoaWNoIGlzIGVpdGhlciBcY29uc3RhbnR7RklMRVRZUEVfUEVNfSBvcgpcY29uc3RhbnR7RklMRVRZUEVfQVNOMX0uIFRoZSBkZWZhdWx0IGlzIFxjb25zdGFudHtGSUxFVFlQRV9QRU19LgpcZW5ke21ldGhvZGRlc2N9CgoKXHN1YnN1YnNlY3Rpb257Q29ubmVjdGlvbiBvYmplY3RzIFxsYWJlbHtvcGVuc3NsLWNvbm5lY3Rpb259fQoKQ29ubmVjdGlvbiBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgoKXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de2FjY2VwdH17fQpDYWxsIHRoZSBcbWV0aG9ke2FjY2VwdH0gbWV0aG9kIG9mIHRoZSB1bmRlcmx5aW5nIHNvY2tldCBhbmQgc2V0IHVwIFNTTCBvbiB0aGUKcmV0dXJuZWQgc29ja2V0LCB1c2luZyB0aGUgQ29udGV4dCBvYmplY3Qgc3VwcGxpZWQgdG8gdGhpcyBDb25uZWN0aW9uIG9iamVjdCBhdApjcmVhdGlvbi4gUmV0dXJucyBhIHBhaXIgXGNvZGV7KFx2YXJ7Y29ubn0sIFx2YXJ7YWRkcmVzc30pfS4gd2hlcmUgXHZhcntjb25ufQppcyB0aGUgbmV3IENvbm5lY3Rpb24gb2JqZWN0IGNyZWF0ZWQsIGFuZCBcdmFye2FkZHJlc3N9IGlzIGFzIHJldHVybmVkIGJ5IHRoZQpzb2NrZXQncyBcbWV0aG9ke2FjY2VwdH0uClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtiaW5kfXthZGRyZXNzfQpDYWxsIHRoZSBcbWV0aG9ke2JpbmR9IG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtjbG9zZX17fQpDYWxsIHRoZSBcbWV0aG9ke2Nsb3NlfSBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0LiBOb3RlOiBJZiB5b3Ugd2FudApjb3JyZWN0IFNTTCBjbG9zdXJlLCB5b3UgbmVlZCB0byBjYWxsIHRoZSBcbWV0aG9ke3NodXRkb3dufSBtZXRob2QgZmlyc3QuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtjb25uZWN0fXthZGRyZXNzfQpDYWxsIHRoZSBcbWV0aG9ke2Nvbm5lY3R9IG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQgYW5kIHNldCB1cCBTU0wgb24gdGhlCnNvY2tldCwgdXNpbmcgdGhlIENvbnRleHQgb2JqZWN0IHN1cHBsaWVkIHRvIHRoaXMgQ29ubmVjdGlvbiBvYmplY3QgYXQKY3JlYXRpb24uClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtjb25uZWN0X2V4fXthZGRyZXNzfQpDYWxsIHRoZSBcbWV0aG9ke2Nvbm5lY3RfZXh9IG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQgYW5kIHNldCB1cCBTU0wgb24KdGhlIHNvY2tldCwgdXNpbmcgdGhlIENvbnRleHQgb2JqZWN0IHN1cHBsaWVkIHRvIHRoaXMgQ29ubmVjdGlvbiBvYmplY3QgYXQKY3JlYXRpb24uIE5vdGUgdGhhdCBpZiB0aGUgXG1ldGhvZHtjb25uZWN0X2V4fSBtZXRob2Qgb2YgdGhlIHNvY2tldCBkb2Vzbid0CnJldHVybiAwLCBTU0wgd29uJ3QgYmUgaW5pdGlhbGl6ZWQuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtkb19oYW5kc2hha2V9e30KUGVyZm9ybSBhbiBTU0wgaGFuZHNoYWtlICh1c3VhbGx5IGNhbGxlZCBhZnRlciBcbWV0aG9ke3JlbmVnb3RpYXRlfSBvciBvbmUgb2YKXG1ldGhvZHtzZXRfYWNjZXB0X3N0YXRlfSBvciBcbWV0aG9ke3NldF9hY2NlcHRfc3RhdGV9KS4gVGhpcyBjYW4gcmFpc2UgdGhlCnNhbWUgZXhjZXB0aW9ucyBhcyBcbWV0aG9ke3NlbmR9IGFuZCBcbWV0aG9ke3JlY3Z9LgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17ZmlsZW5vfXt9ClJldHJpZXZlIHRoZSBmaWxlIGRlc2NyaXB0b3IgbnVtYmVyIGZvciB0aGUgdW5kZXJseWluZyBzb2NrZXQuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtsaXN0ZW59e2JhY2tsb2d9CkNhbGwgdGhlIFxtZXRob2R7bGlzdGVufSBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0LgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17Z2V0X2FwcF9kYXRhfXt9ClJldHJpZXZlIGFwcGxpY2F0aW9uIGRhdGEgYXMgc2V0IGJ5IFxtZXRob2R7c2V0X2FwcF9kYXRhfS4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de2dldF9jaXBoZXJfbGlzdH17fQpSZXRyaWV2ZSB0aGUgbGlzdCBvZiBjaXBoZXJzIHVzZWQgYnkgdGhlIENvbm5lY3Rpb24gb2JqZWN0LiBXQVJOSU5HOiBUaGlzIEFQSQpoYXMgY2hhbmdlZC4gSXQgdXNlZCB0byB0YWtlIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBhbmQganVzdCByZXR1cm4gYSBzdHJpbmcsCmJ1dCBub3QgaXQgcmV0dXJucyB0aGUgZW50aXJlIGxpc3QgaW4gb25lIGdvLgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17Z2V0X2NsaWVudF9jYV9saXN0fXt9ClJldHJpZXZlIHRoZSBsaXN0IG9mIHByZWZlcnJlZCBjbGllbnQgY2VydGlmaWNhdGUgaXNzdWVycyBzZW50IGJ5IHRoZSBzZXJ2ZXIKYXMgXGNsYXNze09wZW5TU0wuY3J5cHRvLlg1MDlOYW1lfSBvYmplY3RzLgoKSWYgdGhpcyBpcyBhIGNsaWVudCBcY2xhc3N7Q29ubmVjdGlvbn0sIHRoZSBsaXN0IHdpbGwgYmUgZW1wdHkgdW50aWwgdGhlCmNvbm5lY3Rpb24gd2l0aCB0aGUgc2VydmVyIGlzIGVzdGFibGlzaGVkLgoKSWYgdGhpcyBpcyBhIHNlcnZlciBcY2xhc3N7Q29ubmVjdGlvbn0sIHJldHVybiB0aGUgbGlzdCBvZiBjZXJ0aWZpY2F0ZQphdXRob3JpdGllcyB0aGF0IHdpbGwgYmUgc2VudCBvciBoYXMgYmVlbiBzZW50IHRvIHRoZSBjbGllbnQsIGFzIGNvbnRyb2xsZWQKYnkgdGhpcyBcY2xhc3N7Q29ubmVjdGlvbn0ncyBcY2xhc3N7Q29udGV4dH0uCgpcdmVyc2lvbmFkZGVkezAuMTB9ClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtnZXRfY29udGV4dH17fQpSZXRyaWV2ZSB0aGUgQ29udGV4dCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29ubmVjdGlvbi4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de2dldF9wZWVyX2NlcnRpZmljYXRlfXt9ClJldHJpZXZlIHRoZSBvdGhlciBzaWRlJ3MgY2VydGlmaWNhdGUgKGlmIGFueSkKXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de2dldHBlZXJuYW1lfXt9CkNhbGwgdGhlIFxtZXRob2R7Z2V0cGVlcm5hbWV9IG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtnZXRzb2NrbmFtZX17fQpDYWxsIHRoZSBcbWV0aG9ke2dldHNvY2tuYW1lfSBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0LgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17Z2V0c29ja29wdH17bGV2ZWwsIG9wdG5hbWVcb3B0aW9uYWx7LCBidWZsZW59fQpDYWxsIHRoZSBcbWV0aG9ke2dldHNvY2tvcHR9IG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtwZW5kaW5nfXt9ClJldHJpZXZlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgc2FmZWx5IHJlYWQgZnJvbSB0aGUgU1NMIGJ1ZmZlcgooXGVtcGh7bm90fSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgYnVmZmVyKS4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de3JlY3Z9e2J1ZnNpemV9ClJlY2VpdmUgZGF0YSBmcm9tIHRoZSBDb25uZWN0aW9uLiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUKZGF0YSByZWNlaXZlZC4gVGhlIG1heGltdW0gYW1vdW50IG9mIGRhdGEgdG8gYmUgcmVjZWl2ZWQgYXQgb25jZSwgaXMgc3BlY2lmaWVkCmJ5IFx2YXJ7YnVmc2l6ZX0uClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtiaW9fd3JpdGV9e2J5dGVzfQpJZiB0aGUgQ29ubmVjdGlvbiB3YXMgY3JlYXRlZCB3aXRoIGEgbWVtb3J5IEJJTywgdGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gYWRkCmJ5dGVzIHRvIHRoZSByZWFkIGVuZCBvZiB0aGF0IG1lbW9yeSBCSU8uICBUaGUgQ29ubmVjdGlvbiBjYW4gdGhlbiByZWFkIHRoZQpieXRlcyAoZm9yIGV4YW1wbGUsIGluIHJlc3BvbnNlIHRvIGEgY2FsbCB0byBcbWV0aG9ke3JlY3Z9KS4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de3JlbmVnb3RpYXRlfXt9ClJlbmVnb3RpYXRlIHRoZSBTU0wgc2Vzc2lvbi4gQ2FsbCB0aGlzIGlmIHlvdSB3aXNoIHRvIGNoYW5nZSBjaXBoZXIgc3VpdGVzIG9yCmFueXRoaW5nIGxpa2UgdGhhdC4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de3NlbmR9e3N0cmluZ30KU2VuZCB0aGUgXHZhcntzdHJpbmd9IGRhdGEgdG8gdGhlIENvbm5lY3Rpb24uClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtiaW9fcmVhZH17YnVmc2l6ZX0KSWYgdGhlIENvbm5lY3Rpb24gd2FzIGNyZWF0ZWQgd2l0aCBhIG1lbW9yeSBCSU8sIHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvCnJlYWQgYnl0ZXMgZnJvbSB0aGUgd3JpdGUgZW5kIG9mIHRoYXQgbWVtb3J5IEJJTy4gIE1hbnkgQ29ubmVjdGlvbiBtZXRob2RzIHdpbGwKYWRkIGJ5dGVzIHdoaWNoIG11c3QgYmUgcmVhZCBpbiB0aGlzIG1hbm5lciBvciB0aGUgYnVmZmVyIHdpbGwgZXZlbnR1YWxseSBmaWxsCnVwIGFuZCB0aGUgQ29ubmVjdGlvbiB3aWxsIGJlIGFibGUgdG8gdGFrZSBubyBmdXJ0aGVyIGFjdGlvbnMuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtzZW5kYWxsfXtzdHJpbmd9ClNlbmQgYWxsIG9mIHRoZSBcdmFye3N0cmluZ30gZGF0YSB0byB0aGUgQ29ubmVjdGlvbi4gVGhpcyBjYWxscyBcbWV0aG9ke3NlbmR9CnJlcGVhdGVkbHkgdW50aWwgYWxsIGRhdGEgaXMgc2VudC4gSWYgYW4gZXJyb3Igb2NjdXJzLCBpdCdzIGltcG9zc2libGUgdG8gdGVsbApob3cgbXVjaCBkYXRhIGhhcyBiZWVuIHNlbnQuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtzZXRfYWNjZXB0X3N0YXRlfXt9ClNldCB0aGUgY29ubmVjdGlvbiB0byB3b3JrIGluIHNlcnZlciBtb2RlLiBUaGUgaGFuZHNoYWtlIHdpbGwgYmUgaGFuZGxlZAphdXRvbWF0aWNhbGx5IGJ5IHJlYWQvd3JpdGUuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtzZXRfYXBwX2RhdGF9e2RhdGF9CkFzc29jaWF0ZSBcdmFye2RhdGF9IHdpdGggdGhpcyBDb25uZWN0aW9uIG9iamVjdC4gXHZhcntkYXRhfSBjYW4gYmUgcmV0cmlldmVkCmxhdGVyIHVzaW5nIHRoZSBcbWV0aG9ke2dldF9hcHBfZGF0YX0gbWV0aG9kLgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17c2V0X2Nvbm5lY3Rfc3RhdGV9e30KU2V0IHRoZSBjb25uZWN0aW9uIHRvIHdvcmsgaW4gY2xpZW50IG1vZGUuIFRoZSBoYW5kc2hha2Ugd2lsbCBiZSBoYW5kbGVkCmF1dG9tYXRpY2FsbHkgYnkgcmVhZC93cml0ZS4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de3NldGJsb2NraW5nfXtmbGFnfQpDYWxsIHRoZSBcbWV0aG9ke3NldGJsb2NraW5nfSBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0LgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17c2V0c29ja29wdH17bGV2ZWwsIG9wdG5hbWUsIHZhbHVlfQpDYWxsIHRoZSBcbWV0aG9ke3NldHNvY2tvcHR9IG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtzaHV0ZG93bn17fQpTZW5kIHRoZSBzaHV0ZG93biBtZXNzYWdlIHRvIHRoZSBDb25uZWN0aW9uLiBSZXR1cm5zIHRydWUgaWYgdGhlIHNodXRkb3duCm1lc3NhZ2UgZXhjaGFuZ2UgaXMgY29tcGxldGVkIGFuZCBmYWxzZSBvdGhlcndpc2UgKGluIHdoaWNoIGNhc2UgeW91IGNhbGwKXG1ldGhvZHtyZWN2KCl9IG9yIFxtZXRob2R7c2VuZCgpfSB3aGVuIHRoZSBjb25uZWN0aW9uIGJlY29tZXMKcmVhZGFibGUvd3JpdGVhYmxlLgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17Z2V0X3NodXRkb3dufXt9CkdldCB0aGUgc2h1dGRvd24gc3RhdGUgb2YgdGhlIENvbm5lY3Rpb24uICBSZXR1cm5zIGEgYml0dmVjdG9yIG9mIGVpdGhlciBvcgpib3RoIG9mIFx2YXJ7U0VOVF9TSFVURE9XTn0gYW5kIFx2YXJ7UkVDRUlWRURfU0hVVERPV059LgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17c2V0X3NodXRkb3dufXtzdGF0ZX0KU2V0IHRoZSBzaHV0ZG93biBzdGF0ZSBvZiB0aGUgQ29ubmVjdGlvbi4gIFx2YXJ7c3RhdGV9IGlzIGEgYml0dmVjdG9yIG9mCmVpdGhlciBvciBib3RoIG9mIFx2YXJ7U0VOVF9TSFVURE9XTn0gYW5kIFx2YXJ7UkVDRUlWRURfU0hVVERPV059LgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17c29ja19zaHV0ZG93bn17aG93fQpDYWxsIHRoZSBcbWV0aG9ke3NodXRkb3dufSBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0LgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17YmlvX3NodXRkb3dufXt9CklmIHRoZSBDb25uZWN0aW9uIHdhcyBjcmVhdGVkIHdpdGggYSBtZW1vcnkgQklPLCB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0bwppbmRpY2F0ZSB0aGF0IGBgZW5kIG9mIGZpbGUnJyBoYXMgYmVlbiByZWFjaGVkIG9uIHRoZSByZWFkIGVuZCBvZiB0aGF0IG1lbW9yeQpCSU8uClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtzdGF0ZV9zdHJpbmd9e30KUmV0cmlldmUgYSB2ZXJib3NlIHN0cmluZyBkZXRhaWxpbmcgdGhlIHN0YXRlIG9mIHRoZSBDb25uZWN0aW9uLgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17Y2xpZW50X3JhbmRvbX17fQpSZXRyaWV2ZSB0aGUgcmFuZG9tIHZhbHVlIHVzZWQgd2l0aCB0aGUgY2xpZW50IGhlbGxvIG1lc3NhZ2UuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtzZXJ2ZXJfcmFuZG9tfXt9ClJldHJpZXZlIHRoZSByYW5kb20gdmFsdWUgdXNlZCB3aXRoIHRoZSBzZXJ2ZXIgaGVsbG8gbWVzc2FnZS4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de21hc3Rlcl9rZXl9e30KUmV0cmlldmUgdGhlIHZhbHVlIG9mIHRoZSBtYXN0ZXIga2V5IGZvciB0aGlzIHNlc3Npb24uClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXt3YW50X3JlYWR9e30KQ2hlY2tzIGlmIG1vcmUgZGF0YSBoYXMgdG8gYmUgcmVhZCBmcm9tIHRoZSB0cmFuc3BvcnQgbGF5ZXIgdG8gY29tcGxldGUgYW4Kb3BlcmF0aW9uLgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17d2FudF93cml0ZX17fQpDaGVja3MgaWYgdGhlcmUgaXMgZGF0YSB0byB3cml0ZSB0byB0aGUgdHJhbnNwb3J0IGxheWVyIHRvIGNvbXBsZXRlIGFuCm9wZXJhdGlvbi4KXGVuZHttZXRob2RkZXNjfQoKCgpcc2VjdGlvbntJbnRlcm5hbHMgXGxhYmVse2ludGVybmFsc319CgpXZSByYW4gaW50byB0aHJlZSBtYWluIHByb2JsZW1zIGRldmVsb3BpbmcgdGhpczogRXhjZXB0aW9ucywgY2FsbGJhY2tzIGFuZAphY2Nlc3Npbmcgc29ja2V0IG1ldGhvZHMuIFRoaXMgaXMgd2hhdCB0aGlzIGNoYXB0ZXIgaXMgYWJvdXQuCgpcc3Vic2VjdGlvbntFeGNlcHRpb25zIFxsYWJlbHtleGNlcHRpb25zfX0KCldlIHJlYWxpemVkIGVhcmx5IHRoYXQgbW9zdCBvZiB0aGUgZXhjZXB0aW9ucyB3b3VsZCBiZSByYWlzZWQgYnkgdGhlIEkvTwpmdW5jdGlvbnMgb2YgT3BlblNTTCwgc28gaXQgZmVsdCBuYXR1cmFsIHRvIG1pbWljIE9wZW5TU0wncyBlcnJvciBjb2RlIHN5c3RlbSwKdHJhbnNsYXRpbmcgdGhlbSBpbnRvIFB5dGhvbiBleGNlcHRpb25zLiBUaGlzIG5hdHVyYWxseSBnaXZlcyB1cyB0aGUgZXhjZXB0aW9ucwpcZXhjZXB0aW9ue1NTTC5aZXJvUmV0dXJuRXJyb3J9LCBcZXhjZXB0aW9ue1NTTC5XYW50UmVhZEVycm9yfSwKXGV4Y2VwdGlvbntTU0wuV2FudFdyaXRlRXJyb3J9LCBcZXhjZXB0aW9ue1NTTC5XYW50WDUwOUxvb2t1cEVycm9yfSBhbmQKXGV4Y2VwdGlvbntTU0wuU3lzQ2FsbEVycm9yfS4KCkZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMsIHNlZSBzZWN0aW9uIFxyZWZ7b3BlbnNzbC1zc2x9LgoKClxzdWJzZWN0aW9ue0NhbGxiYWNrcyBcbGFiZWx7Y2FsbGJhY2tzfX0KClRoZXJlIGFyZSBhIG51bWJlciBvZiBwcm9ibGVtcyB3aXRoIGNhbGxiYWNrcy4gRmlyc3Qgb2YgYWxsLCBPcGVuU1NMIGlzIHdyaXR0ZW4KYXMgYSBDIGxpYnJhcnksIGl0J3Mgbm90IG1lYW50IHRvIGhhdmUgUHl0aG9uIGNhbGxiYWNrcywgc28gYSB3YXkgYXJvdW5kIHRoYXQKaXMgbmVlZGVkLiBBbm90aGVyIHByb2JsZW0gaXMgdGhyZWFkIHN1cHBvcnQuIEEgbG90IG9mIHRoZSBPcGVuU1NMIEkvTwpmdW5jdGlvbnMgY2FuIGJsb2NrIGlmIHRoZSBzb2NrZXQgaXMgaW4gYmxvY2tpbmcgbW9kZSwgYW5kIHRoZW4geW91IHdhbnQgb3RoZXIKUHl0aG9uIHRocmVhZHMgdG8gYmUgYWJsZSB0byBkbyBvdGhlciB0aGluZ3MuIFRoZSByZWFsIHRyb3VibGUgaXMgaWYgeW91J3ZlCnJlbGVhc2VkIHRoZSBnbG9iYWwgQ1B5dGhvbiBpbnRlcnByZXRlciBsb2NrIHRvIGRvIGEgcG90ZW50aWFsbHkgYmxvY2tpbmcKb3BlcmF0aW9uLCBhbmQgdGhlIG9wZXJhdGlvbiBjYWxscyBhIGNhbGxiYWNrLiBUaGVuIHdlIG11c3QgdGFrZSB0aGUgR0lMIGJhY2ssCnNpbmNlIGNhbGxpbmcgUHl0aG9uIEFQSXMgd2l0aG91dCBob2xkaW5nIGl0IGlzIG5vdCBhbGxvd2VkLgoKVGhlcmUgYXJlIHR3byBzb2x1dGlvbnMgdG8gdGhlIGZpcnN0IHByb2JsZW0sIGJvdGggb2Ygd2hpY2ggYXJlIG5lY2Vzc2FyeS4gVGhlCmZpcnN0IHNvbHV0aW9uIHRvIHVzZSBpcyBpZiB0aGUgQyBjYWxsYmFjayBhbGxvd3MgJyd1c2VyZGF0YScnIHRvIGJlIHBhc3NlZCB0bwppdCAoYW4gYXJiaXRyYXJ5IHBvaW50ZXIgbm9ybWFsbHkpLiBUaGlzIGlzIGdyZWF0ISBXZSBjYW4gc2V0IG91ciBQeXRob24KZnVuY3Rpb24gb2JqZWN0IGFzIHRoZSByZWFsIHVzZXJkYXRhIGFuZCBlbXVsYXRlIHVzZXJkYXRhIGZvciB0aGUgUHl0aG9uCmZ1bmN0aW9uIGluIGFub3RoZXIgd2F5LiBUaGUgb3RoZXIgc29sdXRpb24gY2FuIGJlIHVzZWQgaWYgYW4gb2JqZWN0IHdpdGggYW4KJydhcHBfZGF0YScnIHN5c3RlbSBhbHdheXMgaXMgcGFzc2VkIHRvIHRoZSBjYWxsYmFjay4gRm9yIGV4YW1wbGUsIHRoZSBTU0wKb2JqZWN0IGluIE9wZW5TU0wgaGFzIGFwcF9kYXRhIGZ1bmN0aW9ucyBhbmQgaW4gZS5nLiB0aGUgdmVyaWZpY2F0aW9uCmNhbGxiYWNrcywgeW91IGNhbiByZXRyaWV2ZSB0aGUgcmVsYXRlZCBTU0wgb2JqZWN0LiBXaGF0IHdlIGRvIGlzIHRvIHNldCBvdXIKd3JhcHBlciBcY2xhc3N7Q29ubmVjdGlvbn0gb2JqZWN0IGFzIGFwcF9kYXRhIGZvciB0aGUgU1NMIG9iamVjdCwgYW5kIHdlIGNhbgplYXNpbHkgZmluZCB0aGUgUHl0aG9uIGNhbGxiYWNrLgoKVGhlIG90aGVyIHByb2JsZW0gaXMgc29sdmVkIHVzaW5nIHRocmVhZCBsb2NhbCB2YXJpYWJsZXMuICBXaGVuZXZlciB0aGUgR0lMIGlzCnJlbGVhc2VkIGJlZm9yZSBjYWxsaW5nIGludG8gYW4gT3BlblNTTCBBUEksIHRoZSBQeVRocmVhZFN0YXRlIHBvaW50ZXIgcmV0dXJuZWQKYnkgXGNmdW5jdGlvbntQeUV2YWxfU2F2ZVN0YXRlfSBpcyBzdG9yZWQgaW4gYSBnbG9iYWwgdGhyZWFkIGxvY2FsIHZhcmlhYmxlCih1c2luZyBQeXRob24ncyBvd24gVExTIEFQSSwgXGNmdW5jdGlvbntQeVRocmVhZF9zZXRfa2V5X3ZhbHVlfSkuICBXaGVuIGl0IGlzCm5lY2Vzc2FyeSB0byByZS1hY3F1aXJlIHRoZSBHSUwsIGVpdGhlciBhZnRlciB0aGUgT3BlblNTTCBBUEkgcmV0dXJucyBvciBpbiBhIEMKY2FsbGJhY2sgaW52b2tlZCBieSB0aGF0IE9wZW5TU0wgQVBJLCB0aGUgdmFsdWUgb2YgdGhlIHRocmVhZCBsb2NhbCB2YXJpYWJsZSBpcwpyZXRyaWV2ZWQgKFxjZnVuY3Rpb257UHlUaHJlYWRfZ2V0X2tleV92YWx1ZX0pIGFuZCB1c2VkIHRvIHJlLWFjcXVpcmUgdGhlIEdJTC4KVGhpcyBhbGxvd3MgUHl0aG9uIHRocmVhZHMgdG8gZXhlY3V0ZSB3aGlsZSBPcGVuU1NMIEFQSXMgYXJlIHJ1bm5pbmcgYW5kIGFsbG93cwp1c2Ugb2YgYW55IHBhcnRpY3VsYXIgcHlPcGVuU1NMIG9iamVjdCBmcm9tIGFueSBQeXRob24gdGhyZWFkLCBzaW5jZSB0aGVyZSBpcwpubyBwZXItdGhyZWFkIHN0YXRlIGFzc29jaWF0ZWQgd2l0aCBhbnkgb2YgdGhlc2Ugb2JqZWN0cyBhbmQgc2luY2UgT3BlblNTTCBpcwp0aHJlYWRzYWZlIChhcyBsb25nIGFzIHByb3Blcmx5IGluaXRpYWxpemVkLCBhcyBweU9wZW5TU0wgaW5pdGlhbGl6ZXMgaXQpLgoKClxzdWJzZWN0aW9ue0FjZXNzaW5nIFNvY2tldCBNZXRob2RzIFxsYWJlbHtzb2NrZXQtbWV0aG9kc319CgpXZSBxdWlja2x5IHNhdyB0aGUgYmVuZWZpdCBvZiB3cmFwcGluZyBzb2NrZXQgbWV0aG9kcyBpbiB0aGUKXGNsYXNze1NTTC5Db25uZWN0aW9ufSBjbGFzcywgZm9yIGFuIGVhc3kgdHJhbnNpdGlvbiBpbnRvIHVzaW5nIFNTTC4gVGhlCnByb2JsZW0gaGVyZSBpcyB0aGF0IHRoZSBcbW9kdWxle3NvY2tldH0gbW9kdWxlIGxhY2tzIGEgQyBBUEksIGFuZCBhbGwgdGhlCm1ldGhvZHMgYXJlIGRlY2xhcmVkIHN0YXRpYy4gT25lIGFwcHJvYWNoIHdvdWxkIGJlIHRvIGhhdmUgXG1vZHVsZXtPcGVuU1NMfSBhcwphIHN1Ym1vZHVsZSB0byB0aGUgXG1vZHVsZXtzb2NrZXR9IG1vZHVsZSwgcGxhY2luZyBhbGwgdGhlIGNvZGUgaW4KXGZpbGV7c29ja2V0bW9kdWxlLmN9LCBidXQgdGhpcyBpcyBvYnZpb3VzbHkgbm90IGEgZ29vZCBzb2x1dGlvbiwgc2luY2UgeW91Cm1pZ2h0IG5vdCB3YW50IHRvIGltcG9ydCB0b25uZXMgb2YgZXh0cmEgc3R1ZmYgeW91J3JlIG5vdCBnb2luZyB0byB1c2Ugd2hlbgppbXBvcnRpbmcgdGhlIFxtb2R1bGV7c29ja2V0fSBtb2R1bGUuIFRoZSBvdGhlciBhcHByb2FjaCBpcyB0byBzb21laG93IGdldCBhCnBvaW50ZXIgdG8gdGhlIG1ldGhvZCB0byBiZSBjYWxsZWQsIGVpdGhlciB0aGUgQyBmdW5jdGlvbiwgb3IgYSBjYWxsYWJsZSBQeXRob24Kb2JqZWN0LiBUaGlzIGlzIG5vdCByZWFsbHkgYSBnb29kIHNvbHV0aW9uIGVpdGhlciwgc2luY2UgdGhlcmUncyBhIGxvdCBvZgpsb29rdXBzIGludm9sdmVkLgoKVGhlIHdheSBpdCB3b3JrcyBpcyB0aGF0IHlvdSBoYXZlIHRvIHN1cHBseSBhIGBgXGNsYXNze3NvY2tldH0tbGlrZScnIHRyYW5zcG9ydApvYmplY3QgdG8gdGhlIFxjbGFzc3tTU0wuQ29ubmVjdGlvbn0uIFRoZSBvbmx5IHJlcXVpcmVtZW50IG9mIHRoaXMgb2JqZWN0IGlzCnRoYXQgaXQgaGFzIGEgXG1ldGhvZHtmaWxlbm8oKX0gbWV0aG9kIHRoYXQgcmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciB0aGF0J3MKdmFsaWQgYXQgdGhlIEMgbGV2ZWwgKGkuZS4geW91IGNhbiB1c2UgdGhlIHN5c3RlbSBjYWxscyByZWFkIGFuZCB3cml0ZSkuIElmIHlvdQp3YW50IHRvIHVzZSB0aGUgXG1ldGhvZHtjb25uZWN0KCl9IG9yIFxtZXRob2R7YWNjZXB0KCl9IG1ldGhvZHMgb2YgdGhlClxjbGFzc3tTU0wuQ29ubmVjdGlvbn0gb2JqZWN0LCB0aGUgdHJhbnNwb3J0IG9iamVjdCBoYXMgdG8gc3VwcGx5IHN1Y2gKbWV0aG9kcyB0b28uIEFwYXJ0IGZyb20gdGhlbSwgYW55IG1ldGhvZCBsb29rdXBzIGluIHRoZSBcY2xhc3N7U1NMLkNvbm5lY3Rpb259Cm9iamVjdCB0aGF0IGZhaWwgYXJlIHBhc3NlZCBvbiB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgb2JqZWN0LgoKRnV0dXJlIGNoYW5nZXMgbWlnaHQgYmUgdG8gYWxsb3cgUHl0aG9uLWxldmVsIHRyYW5zcG9ydCBvYmplY3RzLCB0aGF0IGluc3RlYWQKb2YgaGF2aW5nIFxtZXRob2R7ZmlsZW5vKCl9IG1ldGhvZHMsIGhhdmUgXG1ldGhvZHtyZWFkKCl9IGFuZCBcbWV0aG9ke3dyaXRlKCl9Cm1ldGhvZHMsIHNvIG1vcmUgYWR2YW5jZWQgZmVhdHVyZXMgb2YgUHl0aG9uIGNhbiBiZSB1c2VkLiBUaGlzIHdvdWxkIHByb2JhYmx5CmVudGFpbCBzb21lIHNvcnQgb2YgT3BlblNTTCBgYEJJT3MnJywgYnV0IGNvbnZlcnRpbmcgUHl0aG9uIHN0cmluZ3MgYmFjayBhbmQKZm9ydGggaXMgZXhwZW5zaXZlLCBzbyB0aGlzIHNob3VsZG4ndCBiZSB1c2VkIHVubGVzcyBuZWNlc3NhcnkuIE90aGVyIG5pY2UKdGhpbmdzIHdvdWxkIGJlIHRvIGJlIGFibGUgdG8gcGFzcyBpbiBkaWZmZXJlbnQgdHJhbnNwb3J0IG9iamVjdHMgZm9yIHJlYWRpbmcKYW5kIHdyaXRpbmcsIGJ1dCB0aGVuIHRoZSBcbWV0aG9ke2ZpbGVubygpfSBtZXRob2Qgb2YgXGNsYXNze1NTTC5Db25uZWN0aW9ufQpiZWNvbWVzIHZpcnR1YWxseSB1c2VsZXNzLiBBbHNvLCBzaG91bGQgdGhlIG1ldGhvZCByZXNvbHV0aW9uIGJlIHVzZWQgb24gdGhlCnJlYWQtdHJhbnNwb3J0IG9yIHRoZSB3cml0ZS10cmFuc3BvcnQ/CgoKXGVuZHtkb2N1bWVudH0K