XGRvY3VtZW50Y2xhc3N7bWFudWFsfQpcdXNlcGFja2FnZVtUMV17Zm9udGVuY30KXHVzZXBhY2thZ2V7dGV4dGNvbXB9CgolIFRoaW5ncyB0byBkbzoKJSBTaG91bGQgcmVhbGx5IG1vdmUgdGhlIFB5dGhvbiBzdGFydHVwIGZpbGUgaW5mbyB0byBhbiBhcHBlbmRpeAoKXHRpdGxle1B5dGhvbiBUdXRvcmlhbH0KClxpbnB1dHtib2lsZXJwbGF0ZX0KClxtYWtlaW5kZXgKClxiZWdpbntkb2N1bWVudH0KClxtYWtldGl0bGUKClxpZmh0bWwKXGNoYXB0ZXIqe0Zyb250IE1hdHRlclxsYWJlbHtmcm9udH19ClxmaQoKXGlucHV0e2NvcHlyaWdodH0KClxiZWdpbnthYnN0cmFjdH0KClxub2luZGVudApQeXRob24gaXMgYW4gZWFzeSB0byBsZWFybiwgcG93ZXJmdWwgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuICBJdCBoYXMKZWZmaWNpZW50IGhpZ2gtbGV2ZWwgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBhIHNpbXBsZSBidXQgZWZmZWN0aXZlCmFwcHJvYWNoIHRvIG9iamVjdC1vcmllbnRlZCBwcm9ncmFtbWluZy4gIFB5dGhvbidzIGVsZWdhbnQgc3ludGF4IGFuZApkeW5hbWljIHR5cGluZywgdG9nZXRoZXIgd2l0aCBpdHMgaW50ZXJwcmV0ZWQgbmF0dXJlLCBtYWtlIGl0IGFuIGlkZWFsIApsYW5ndWFnZSBmb3Igc2NyaXB0aW5nIGFuZCByYXBpZCBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCBpbiBtYW55IGFyZWFzIApvbiBtb3N0IHBsYXRmb3Jtcy4KClRoZSBQeXRob24gaW50ZXJwcmV0ZXIgYW5kIHRoZSBleHRlbnNpdmUgc3RhbmRhcmQgbGlicmFyeSBhcmUgZnJlZWx5CmF2YWlsYWJsZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0gZm9yIGFsbCBtYWpvciBwbGF0Zm9ybXMgZnJvbSB0aGUKUHl0aG9uIFdlYiBzaXRlLCBcdXJse2h0dHA6Ly93d3cucHl0aG9uLm9yZy99LCBhbmQgY2FuIGJlIGZyZWVseQpkaXN0cmlidXRlZC4gIFRoZSBzYW1lIHNpdGUgYWxzbyBjb250YWlucyBkaXN0cmlidXRpb25zIG9mIGFuZApwb2ludGVycyB0byBtYW55IGZyZWUgdGhpcmQgcGFydHkgUHl0aG9uIG1vZHVsZXMsIHByb2dyYW1zIGFuZCB0b29scywKYW5kIGFkZGl0aW9uYWwgZG9jdW1lbnRhdGlvbi4KClRoZSBQeXRob24gaW50ZXJwcmV0ZXIgaXMgZWFzaWx5IGV4dGVuZGVkIHdpdGggbmV3IGZ1bmN0aW9ucyBhbmQgZGF0YQp0eXBlcyBpbXBsZW1lbnRlZCBpbiBDIG9yIFxDcHB7fSAob3Igb3RoZXIgbGFuZ3VhZ2VzIGNhbGxhYmxlIGZyb20gQykuClB5dGhvbiBpcyBhbHNvIHN1aXRhYmxlIGFzIGFuIGV4dGVuc2lvbiBsYW5ndWFnZSBmb3IgY3VzdG9taXphYmxlCmFwcGxpY2F0aW9ucy4KClRoaXMgdHV0b3JpYWwgaW50cm9kdWNlcyB0aGUgcmVhZGVyIGluZm9ybWFsbHkgdG8gdGhlIGJhc2ljIGNvbmNlcHRzCmFuZCBmZWF0dXJlcyBvZiB0aGUgUHl0aG9uIGxhbmd1YWdlIGFuZCBzeXN0ZW0uICBJdCBoZWxwcyB0byBoYXZlIGEKUHl0aG9uIGludGVycHJldGVyIGhhbmR5IGZvciBoYW5kcy1vbiBleHBlcmllbmNlLCBidXQgYWxsIGV4YW1wbGVzIGFyZQpzZWxmLWNvbnRhaW5lZCwgc28gdGhlIHR1dG9yaWFsIGNhbiBiZSByZWFkIG9mZi1saW5lIGFzIHdlbGwuCgpGb3IgYSBkZXNjcmlwdGlvbiBvZiBzdGFuZGFyZCBvYmplY3RzIGFuZCBtb2R1bGVzLCBzZWUgdGhlClxjaXRldGl0bGVbLi4vbGliL2xpYi5odG1sXXtQeXRob24gTGlicmFyeSBSZWZlcmVuY2V9IGRvY3VtZW50LiAgVGhlClxjaXRldGl0bGVbLi4vcmVmL3JlZi5odG1sXXtQeXRob24gUmVmZXJlbmNlIE1hbnVhbH0gZ2l2ZXMgYSBtb3JlCmZvcm1hbCBkZWZpbml0aW9uIG9mIHRoZSBsYW5ndWFnZS4gIFRvIHdyaXRlIGV4dGVuc2lvbnMgaW4gQyBvcgpcQ3BwLCByZWFkIFxjaXRldGl0bGVbLi4vZXh0L2V4dC5odG1sXXtFeHRlbmRpbmcgYW5kIEVtYmVkZGluZyB0aGUKUHl0aG9uIEludGVycHJldGVyfSBhbmQgXGNpdGV0aXRsZVsuLi9hcGkvYXBpLmh0bWxde1B5dGhvbi9DIEFQSQpSZWZlcmVuY2V9LiAgVGhlcmUgYXJlIGFsc28gc2V2ZXJhbCBib29rcyBjb3ZlcmluZyBQeXRob24gaW4gZGVwdGguCgpUaGlzIHR1dG9yaWFsIGRvZXMgbm90IGF0dGVtcHQgdG8gYmUgY29tcHJlaGVuc2l2ZSBhbmQgY292ZXIgZXZlcnkKc2luZ2xlIGZlYXR1cmUsIG9yIGV2ZW4gZXZlcnkgY29tbW9ubHkgdXNlZCBmZWF0dXJlLiAgSW5zdGVhZCwgaXQKaW50cm9kdWNlcyBtYW55IG9mIFB5dGhvbidzIG1vc3Qgbm90ZXdvcnRoeSBmZWF0dXJlcywgYW5kIHdpbGwgZ2l2ZQp5b3UgYSBnb29kIGlkZWEgb2YgdGhlIGxhbmd1YWdlJ3MgZmxhdm9yIGFuZCBzdHlsZS4gIEFmdGVyIHJlYWRpbmcgaXQsCnlvdSB3aWxsIGJlIGFibGUgdG8gcmVhZCBhbmQgd3JpdGUgUHl0aG9uIG1vZHVsZXMgYW5kIHByb2dyYW1zLCBhbmQKeW91IHdpbGwgYmUgcmVhZHkgdG8gbGVhcm4gbW9yZSBhYm91dCB0aGUgdmFyaW91cyBQeXRob24gbGlicmFyeQptb2R1bGVzIGRlc2NyaWJlZCBpbiB0aGUgXGNpdGV0aXRsZVsuLi9saWIvbGliLmh0bWxde1B5dGhvbiBMaWJyYXJ5ClJlZmVyZW5jZX0uCgpcZW5ke2Fic3RyYWN0fQoKXHRhYmxlb2Zjb250ZW50cwoKClxjaGFwdGVye1doZXR0aW5nIFlvdXIgQXBwZXRpdGUgXGxhYmVse2ludHJvfX0KCklmIHlvdSBldmVyIHdyb3RlIGEgbGFyZ2Ugc2hlbGwgc2NyaXB0LCB5b3UgcHJvYmFibHkga25vdyB0aGlzCmZlZWxpbmc6IHlvdSdkIGxvdmUgdG8gYWRkIHlldCBhbm90aGVyIGZlYXR1cmUsIGJ1dCBpdCdzIGFscmVhZHkgc28Kc2xvdywgYW5kIHNvIGJpZywgYW5kIHNvIGNvbXBsaWNhdGVkOyBvciB0aGUgZmVhdHVyZSBpbnZvbHZlcyBhIHN5c3RlbQpjYWxsIG9yIG90aGVyIGZ1bmN0aW9uIHRoYXQgaXMgb25seSBhY2Nlc3NpYmxlIGZyb20gQyBcbGRvdHMgVXN1YWxseQp0aGUgcHJvYmxlbSBhdCBoYW5kIGlzbid0IHNlcmlvdXMgZW5vdWdoIHRvIHdhcnJhbnQgcmV3cml0aW5nIHRoZQpzY3JpcHQgaW4gQzsgcGVyaGFwcyB0aGUgcHJvYmxlbSByZXF1aXJlcyB2YXJpYWJsZS1sZW5ndGggc3RyaW5ncyBvcgpvdGhlciBkYXRhIHR5cGVzIChsaWtlIHNvcnRlZCBsaXN0cyBvZiBmaWxlIG5hbWVzKSB0aGF0IGFyZSBlYXN5IGluCnRoZSBzaGVsbCBidXQgbG90cyBvZiB3b3JrIHRvIGltcGxlbWVudCBpbiBDLCBvciBwZXJoYXBzIHlvdSdyZSBub3QKc3VmZmljaWVudGx5IGZhbWlsaWFyIHdpdGggQy4KCkFub3RoZXIgc2l0dWF0aW9uOiBwZXJoYXBzIHlvdSBoYXZlIHRvIHdvcmsgd2l0aCBzZXZlcmFsIEMgbGlicmFyaWVzLAphbmQgdGhlIHVzdWFsIEMgd3JpdGUvY29tcGlsZS90ZXN0L3JlLWNvbXBpbGUgY3ljbGUgaXMgdG9vIHNsb3cuICBZb3UKbmVlZCB0byBkZXZlbG9wIHNvZnR3YXJlIG1vcmUgcXVpY2tseS4gIFBvc3NpYmx5IHBlcmhhcHMgeW91J3ZlCndyaXR0ZW4gYSBwcm9ncmFtIHRoYXQgY291bGQgdXNlIGFuIGV4dGVuc2lvbiBsYW5ndWFnZSwgYW5kIHlvdSBkb24ndAp3YW50IHRvIGRlc2lnbiBhIGxhbmd1YWdlLCB3cml0ZSBhbmQgZGVidWcgYW4gaW50ZXJwcmV0ZXIgZm9yIGl0LCB0aGVuCnRpZSBpdCBpbnRvIHlvdXIgYXBwbGljYXRpb24uCgpJbiBzdWNoIGNhc2VzLCBQeXRob24gbWF5IGJlIGp1c3QgdGhlIGxhbmd1YWdlIGZvciB5b3UuICBQeXRob24gaXMKc2ltcGxlIHRvIHVzZSwgYnV0IGl0IGlzIGEgcmVhbCBwcm9ncmFtbWluZyBsYW5ndWFnZSwgb2ZmZXJpbmcgbXVjaAptb3JlIHN0cnVjdHVyZSBhbmQgc3VwcG9ydCBmb3IgbGFyZ2UgcHJvZ3JhbXMgdGhhbiB0aGUgc2hlbGwgaGFzLiAgT24KdGhlIG90aGVyIGhhbmQsIGl0IGFsc28gb2ZmZXJzIG11Y2ggbW9yZSBlcnJvciBjaGVja2luZyB0aGFuIEMsIGFuZCwKYmVpbmcgYSBcZW1waHt2ZXJ5LWhpZ2gtbGV2ZWwgbGFuZ3VhZ2V9LCBpdCBoYXMgaGlnaC1sZXZlbCBkYXRhIHR5cGVzCmJ1aWx0IGluLCBzdWNoIGFzIGZsZXhpYmxlIGFycmF5cyBhbmQgZGljdGlvbmFyaWVzIHRoYXQgd291bGQgY29zdCB5b3UKZGF5cyB0byBpbXBsZW1lbnQgZWZmaWNpZW50bHkgaW4gQy4gIEJlY2F1c2Ugb2YgaXRzIG1vcmUgZ2VuZXJhbCBkYXRhCnR5cGVzIFB5dGhvbiBpcyBhcHBsaWNhYmxlIHRvIGEgbXVjaCBsYXJnZXIgcHJvYmxlbSBkb21haW4gdGhhbgpcZW1waHtBd2t9IG9yIGV2ZW4gXGVtcGh7UGVybH0sIHlldCBtYW55IHRoaW5ncyBhcmUgYXQgbGVhc3QgYXMgZWFzeQppbiBQeXRob24gYXMgaW4gdGhvc2UgbGFuZ3VhZ2VzLgoKUHl0aG9uIGFsbG93cyB5b3UgdG8gc3BsaXQgdXAgeW91ciBwcm9ncmFtIGluIG1vZHVsZXMgdGhhdCBjYW4gYmUKcmV1c2VkIGluIG90aGVyIFB5dGhvbiBwcm9ncmFtcy4gIEl0IGNvbWVzIHdpdGggYSBsYXJnZSBjb2xsZWN0aW9uIG9mCnN0YW5kYXJkIG1vZHVsZXMgdGhhdCB5b3UgY2FuIHVzZSBhcyB0aGUgYmFzaXMgb2YgeW91ciBwcm9ncmFtcyAtLS0gb3IKYXMgZXhhbXBsZXMgdG8gc3RhcnQgbGVhcm5pbmcgdG8gcHJvZ3JhbSBpbiBQeXRob24uICBUaGVyZSBhcmUgYWxzbwpidWlsdC1pbiBtb2R1bGVzIHRoYXQgcHJvdmlkZSB0aGluZ3MgbGlrZSBmaWxlIEkvTywgc3lzdGVtIGNhbGxzLApzb2NrZXRzLCBhbmQgZXZlbiBpbnRlcmZhY2VzIHRvIGdyYXBoaWNhbCB1c2VyIGludGVyZmFjZSB0b29sa2l0cyBsaWtlIFRrLiAgCgpQeXRob24gaXMgYW4gaW50ZXJwcmV0ZWQgbGFuZ3VhZ2UsIHdoaWNoIGNhbiBzYXZlIHlvdSBjb25zaWRlcmFibGUgdGltZQpkdXJpbmcgcHJvZ3JhbSBkZXZlbG9wbWVudCBiZWNhdXNlIG5vIGNvbXBpbGF0aW9uIGFuZCBsaW5raW5nIGlzCm5lY2Vzc2FyeS4gIFRoZSBpbnRlcnByZXRlciBjYW4gYmUgdXNlZCBpbnRlcmFjdGl2ZWx5LCB3aGljaCBtYWtlcyBpdAplYXN5IHRvIGV4cGVyaW1lbnQgd2l0aCBmZWF0dXJlcyBvZiB0aGUgbGFuZ3VhZ2UsIHRvIHdyaXRlIHRocm93LWF3YXkKcHJvZ3JhbXMsIG9yIHRvIHRlc3QgZnVuY3Rpb25zIGR1cmluZyBib3R0b20tdXAgcHJvZ3JhbSBkZXZlbG9wbWVudC4KSXQgaXMgYWxzbyBhIGhhbmR5IGRlc2sgY2FsY3VsYXRvci4KClB5dGhvbiBhbGxvd3Mgd3JpdGluZyB2ZXJ5IGNvbXBhY3QgYW5kIHJlYWRhYmxlIHByb2dyYW1zLiAgUHJvZ3JhbXMKd3JpdHRlbiBpbiBQeXRob24gYXJlIHR5cGljYWxseSBtdWNoIHNob3J0ZXIgdGhhbiBlcXVpdmFsZW50IEMgb3IKXENwcHt9IHByb2dyYW1zLCBmb3Igc2V2ZXJhbCByZWFzb25zOgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0KdGhlIGhpZ2gtbGV2ZWwgZGF0YSB0eXBlcyBhbGxvdyB5b3UgdG8gZXhwcmVzcyBjb21wbGV4IG9wZXJhdGlvbnMgaW4gYQpzaW5nbGUgc3RhdGVtZW50OwpcaXRlbQpzdGF0ZW1lbnQgZ3JvdXBpbmcgaXMgZG9uZSBieSBpbmRlbnRhdGlvbiBpbnN0ZWFkIG9mIGJlZ2lubmluZyBhbmQgZW5kaW5nCmJyYWNrZXRzOwpcaXRlbQpubyB2YXJpYWJsZSBvciBhcmd1bWVudCBkZWNsYXJhdGlvbnMgYXJlIG5lY2Vzc2FyeS4KXGVuZHtpdGVtaXplfQoKUHl0aG9uIGlzIFxlbXBoe2V4dGVuc2libGV9OiBpZiB5b3Uga25vdyBob3cgdG8gcHJvZ3JhbSBpbiBDIGl0IGlzIGVhc3kKdG8gYWRkIGEgbmV3IGJ1aWx0LWluIGZ1bmN0aW9uIG9yIG1vZHVsZSB0byB0aGUgaW50ZXJwcmV0ZXIsIGVpdGhlciB0bwpwZXJmb3JtIGNyaXRpY2FsIG9wZXJhdGlvbnMgYXQgbWF4aW11bSBzcGVlZCwgb3IgdG8gbGluayBQeXRob24KcHJvZ3JhbXMgdG8gbGlicmFyaWVzIHRoYXQgbWF5IG9ubHkgYmUgYXZhaWxhYmxlIGluIGJpbmFyeSBmb3JtIChzdWNoCmFzIGEgdmVuZG9yLXNwZWNpZmljIGdyYXBoaWNzIGxpYnJhcnkpLiAgT25jZSB5b3UgYXJlIHJlYWxseSBob29rZWQsCnlvdSBjYW4gbGluayB0aGUgUHl0aG9uIGludGVycHJldGVyIGludG8gYW4gYXBwbGljYXRpb24gd3JpdHRlbiBpbiBDCmFuZCB1c2UgaXQgYXMgYW4gZXh0ZW5zaW9uIG9yIGNvbW1hbmQgbGFuZ3VhZ2UgZm9yIHRoYXQgYXBwbGljYXRpb24uCgpCeSB0aGUgd2F5LCB0aGUgbGFuZ3VhZ2UgaXMgbmFtZWQgYWZ0ZXIgdGhlIEJCQyBzaG93IGBgTW9udHkgUHl0aG9uJ3MKRmx5aW5nIENpcmN1cycnIGFuZCBoYXMgbm90aGluZyB0byBkbyB3aXRoIG5hc3R5IHJlcHRpbGVzLiAgTWFraW5nCnJlZmVyZW5jZXMgdG8gTW9udHkgUHl0aG9uIHNraXRzIGluIGRvY3VtZW50YXRpb24gaXMgbm90IG9ubHkgYWxsb3dlZCwKaXQgaXMgZW5jb3VyYWdlZCEKCiVcc2VjdGlvbntXaGVyZSBGcm9tIEhlcmUgXGxhYmVse3doZXJlfX0KCk5vdyB0aGF0IHlvdSBhcmUgYWxsIGV4Y2l0ZWQgYWJvdXQgUHl0aG9uLCB5b3UnbGwgd2FudCB0byBleGFtaW5lIGl0CmluIHNvbWUgbW9yZSBkZXRhaWwuICBTaW5jZSB0aGUgYmVzdCB3YXkgdG8gbGVhcm4gYSBsYW5ndWFnZSBpcwp1c2luZyBpdCwgeW91IGFyZSBpbnZpdGVkIGhlcmUgdG8gZG8gc28uCgpJbiB0aGUgbmV4dCBjaGFwdGVyLCB0aGUgbWVjaGFuaWNzIG9mIHVzaW5nIHRoZSBpbnRlcnByZXRlciBhcmUKZXhwbGFpbmVkLiAgVGhpcyBpcyByYXRoZXIgbXVuZGFuZSBpbmZvcm1hdGlvbiwgYnV0IGVzc2VudGlhbCBmb3IKdHJ5aW5nIG91dCB0aGUgZXhhbXBsZXMgc2hvd24gbGF0ZXIuCgpUaGUgcmVzdCBvZiB0aGUgdHV0b3JpYWwgaW50cm9kdWNlcyB2YXJpb3VzIGZlYXR1cmVzIG9mIHRoZSBQeXRob24KbGFuZ3VhZ2UgYW5kIHN5c3RlbSB0aHJvdWdoIGV4YW1wbGVzLCBiZWdpbm5pbmcgd2l0aCBzaW1wbGUKZXhwcmVzc2lvbnMsIHN0YXRlbWVudHMgYW5kIGRhdGEgdHlwZXMsIHRocm91Z2ggZnVuY3Rpb25zIGFuZCBtb2R1bGVzLAphbmQgZmluYWxseSB0b3VjaGluZyB1cG9uIGFkdmFuY2VkIGNvbmNlcHRzIGxpa2UgZXhjZXB0aW9ucwphbmQgdXNlci1kZWZpbmVkIGNsYXNzZXMuCgpcY2hhcHRlcntVc2luZyB0aGUgUHl0aG9uIEludGVycHJldGVyIFxsYWJlbHt1c2luZ319Cgpcc2VjdGlvbntJbnZva2luZyB0aGUgSW50ZXJwcmV0ZXIgXGxhYmVse2ludm9raW5nfX0KClRoZSBQeXRob24gaW50ZXJwcmV0ZXIgaXMgdXN1YWxseSBpbnN0YWxsZWQgYXMKXGZpbGV7L3Vzci9sb2NhbC9iaW4vcHl0aG9ufSBvbiB0aG9zZSBtYWNoaW5lcyB3aGVyZSBpdCBpcyBhdmFpbGFibGU7CnB1dHRpbmcgXGZpbGV7L3Vzci9sb2NhbC9iaW59IGluIHlvdXIgXFVOSVh7fSBzaGVsbCdzIHNlYXJjaCBwYXRoCm1ha2VzIGl0IHBvc3NpYmxlIHRvIHN0YXJ0IGl0IGJ5IHR5cGluZyB0aGUgY29tbWFuZAoKXGJlZ2lue3ZlcmJhdGltfQpweXRob24KXGVuZHt2ZXJiYXRpbX0KCnRvIHRoZSBzaGVsbC4gIFNpbmNlIHRoZSBjaG9pY2Ugb2YgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgaW50ZXJwcmV0ZXIKbGl2ZXMgaXMgYW4gaW5zdGFsbGF0aW9uIG9wdGlvbiwgb3RoZXIgcGxhY2VzIGFyZSBwb3NzaWJsZTsgY2hlY2sgd2l0aAp5b3VyIGxvY2FsIFB5dGhvbiBndXJ1IG9yIHN5c3RlbSBhZG1pbmlzdHJhdG9yLiAgKEUuZy4sClxmaWxley91c3IvbG9jYWwvcHl0aG9ufSBpcyBhIHBvcHVsYXIgYWx0ZXJuYXRpdmUgbG9jYXRpb24uKQoKVHlwaW5nIGFuIGVuZC1vZi1maWxlIGNoYXJhY3RlciAoXGtiZHtDb250cm9sLUR9IG9uIFxVTklYLApca2Jke0NvbnRyb2wtWn0gb24gV2luZG93cykgYXQgdGhlIHByaW1hcnkgcHJvbXB0IGNhdXNlcyB0aGUKaW50ZXJwcmV0ZXIgdG8gZXhpdCB3aXRoIGEgemVybyBleGl0IHN0YXR1cy4gIElmIHRoYXQgZG9lc24ndCB3b3JrLAp5b3UgY2FuIGV4aXQgdGhlIGludGVycHJldGVyIGJ5IHR5cGluZyB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgpcc2FtcHtpbXBvcnQgc3lzOyBzeXMuZXhpdCgpfS4KClRoZSBpbnRlcnByZXRlcidzIGxpbmUtZWRpdGluZyBmZWF0dXJlcyB1c3VhbGx5IGFyZW4ndCB2ZXJ5CnNvcGhpc3RpY2F0ZWQuICBPbiBcVU5JWCwgd2hvZXZlciBpbnN0YWxsZWQgdGhlIGludGVycHJldGVyIG1heSBoYXZlCmVuYWJsZWQgc3VwcG9ydCBmb3IgdGhlIEdOVSByZWFkbGluZSBsaWJyYXJ5LCB3aGljaCBhZGRzIG1vcmUKZWxhYm9yYXRlIGludGVyYWN0aXZlIGVkaXRpbmcgYW5kIGhpc3RvcnkgZmVhdHVyZXMuIFBlcmhhcHMgdGhlCnF1aWNrZXN0IGNoZWNrIHRvIHNlZSB3aGV0aGVyIGNvbW1hbmQgbGluZSBlZGl0aW5nIGlzIHN1cHBvcnRlZCBpcwp0eXBpbmcgQ29udHJvbC1QIHRvIHRoZSBmaXJzdCBQeXRob24gcHJvbXB0IHlvdSBnZXQuICBJZiBpdCBiZWVwcywgeW91CmhhdmUgY29tbWFuZCBsaW5lIGVkaXRpbmc7IHNlZSBBcHBlbmRpeCBccmVme2ludGVyYWN0aW5nfSBmb3IgYW4KaW50cm9kdWN0aW9uIHRvIHRoZSBrZXlzLiAgSWYgbm90aGluZyBhcHBlYXJzIHRvIGhhcHBlbiwgb3IgaWYKXGNvZGV7XF5QfSBpcyBlY2hvZWQsIGNvbW1hbmQgbGluZSBlZGl0aW5nIGlzbid0IGF2YWlsYWJsZTsgeW91J2xsCm9ubHkgYmUgYWJsZSB0byB1c2UgYmFja3NwYWNlIHRvIHJlbW92ZSBjaGFyYWN0ZXJzIGZyb20gdGhlIGN1cnJlbnQKbGluZS4KClRoZSBpbnRlcnByZXRlciBvcGVyYXRlcyBzb21ld2hhdCBsaWtlIHRoZSBcVU5JWHt9IHNoZWxsOiB3aGVuIGNhbGxlZAp3aXRoIHN0YW5kYXJkIGlucHV0IGNvbm5lY3RlZCB0byBhIHR0eSBkZXZpY2UsIGl0IHJlYWRzIGFuZCBleGVjdXRlcwpjb21tYW5kcyBpbnRlcmFjdGl2ZWx5OyB3aGVuIGNhbGxlZCB3aXRoIGEgZmlsZSBuYW1lIGFyZ3VtZW50IG9yIHdpdGgKYSBmaWxlIGFzIHN0YW5kYXJkIGlucHV0LCBpdCByZWFkcyBhbmQgZXhlY3V0ZXMgYSBcZW1waHtzY3JpcHR9IGZyb20KdGhhdCBmaWxlLiAKCkEgc2Vjb25kIHdheSBvZiBzdGFydGluZyB0aGUgaW50ZXJwcmV0ZXIgaXMKXHNhbXB7XHByb2dyYW17cHl0aG9ufSBccHJvZ3JhbW9wdHstY30gXHZhcntjb21tYW5kfSBbYXJnXSAuLi59LCB3aGljaApleGVjdXRlcyB0aGUgc3RhdGVtZW50KHMpIGluIFx2YXJ7Y29tbWFuZH0sIGFuYWxvZ291cyB0byB0aGUgc2hlbGwncwpccHJvZ3JhbW9wdHstY30gb3B0aW9uLiAgU2luY2UgUHl0aG9uIHN0YXRlbWVudHMgb2Z0ZW4gY29udGFpbiBzcGFjZXMKb3Igb3RoZXIgY2hhcmFjdGVycyB0aGF0IGFyZSBzcGVjaWFsIHRvIHRoZSBzaGVsbCwgaXQgaXMgYmVzdCB0byBxdW90ZSAKXHZhcntjb21tYW5kfSBpbiBpdHMgZW50aXJldHkgd2l0aCBkb3VibGUgcXVvdGVzLgoKU29tZSBQeXRob24gbW9kdWxlcyBhcmUgYWxzbyB1c2VmdWwgYXMgc2NyaXB0cy4gIFRoZXNlIGNhbiBiZSBpbnZva2VkIHVzaW5nClxzYW1we1xwcm9ncmFte3B5dGhvbn0gXHByb2dyYW1vcHR7LW19IFx2YXJ7bW9kdWxlfSBbYXJnXSAuLi59LCB3aGljaApleGVjdXRlcyB0aGUgc291cmNlIGZpbGUgZm9yIFx2YXJ7bW9kdWxlfSBhcyBpZiB5b3UgaGFkIHNwZWxsZWQgb3V0IGl0cwpmdWxsIG5hbWUgb24gdGhlIGNvbW1hbmQgbGluZS4KCk5vdGUgdGhhdCB0aGVyZSBpcyBhIGRpZmZlcmVuY2UgYmV0d2VlbiBcc2FtcHtweXRob24gZmlsZX0gYW5kClxzYW1we3B5dGhvbiA8ZmlsZX0uICBJbiB0aGUgbGF0dGVyIGNhc2UsIGlucHV0IHJlcXVlc3RzIGZyb20gdGhlCnByb2dyYW0sIHN1Y2ggYXMgY2FsbHMgdG8gXGZ1bmN0aW9ue2lucHV0KCl9IGFuZCBcZnVuY3Rpb257cmF3X2lucHV0KCl9LCBhcmUKc2F0aXNmaWVkIGZyb20gXGVtcGh7ZmlsZX0uICBTaW5jZSB0aGlzIGZpbGUgaGFzIGFscmVhZHkgYmVlbiByZWFkCnVudGlsIHRoZSBlbmQgYnkgdGhlIHBhcnNlciBiZWZvcmUgdGhlIHByb2dyYW0gc3RhcnRzIGV4ZWN1dGluZywgdGhlCnByb2dyYW0gd2lsbCBlbmNvdW50ZXIgZW5kLW9mLWZpbGUgaW1tZWRpYXRlbHkuICBJbiB0aGUgZm9ybWVyIGNhc2UKKHdoaWNoIGlzIHVzdWFsbHkgd2hhdCB5b3Ugd2FudCkgdGhleSBhcmUgc2F0aXNmaWVkIGZyb20gd2hhdGV2ZXIgZmlsZQpvciBkZXZpY2UgaXMgY29ubmVjdGVkIHRvIHN0YW5kYXJkIGlucHV0IG9mIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIuCgpXaGVuIGEgc2NyaXB0IGZpbGUgaXMgdXNlZCwgaXQgaXMgc29tZXRpbWVzIHVzZWZ1bCB0byBiZSBhYmxlIHRvIHJ1bgp0aGUgc2NyaXB0IGFuZCBlbnRlciBpbnRlcmFjdGl2ZSBtb2RlIGFmdGVyd2FyZHMuICBUaGlzIGNhbiBiZSBkb25lIGJ5CnBhc3NpbmcgXHByb2dyYW1vcHR7LWl9IGJlZm9yZSB0aGUgc2NyaXB0LiAgKFRoaXMgZG9lcyBub3Qgd29yayBpZiB0aGUKc2NyaXB0IGlzIHJlYWQgZnJvbSBzdGFuZGFyZCBpbnB1dCwgZm9yIHRoZSBzYW1lIHJlYXNvbiBhcyBleHBsYWluZWQKaW4gdGhlIHByZXZpb3VzIHBhcmFncmFwaC4pCgpcc3Vic2VjdGlvbntBcmd1bWVudCBQYXNzaW5nIFxsYWJlbHthcmdQYXNzaW5nfX0KCldoZW4ga25vd24gdG8gdGhlIGludGVycHJldGVyLCB0aGUgc2NyaXB0IG5hbWUgYW5kIGFkZGl0aW9uYWwKYXJndW1lbnRzIHRoZXJlYWZ0ZXIgYXJlIHBhc3NlZCB0byB0aGUgc2NyaXB0IGluIHRoZSB2YXJpYWJsZQpcY29kZXtzeXMuYXJndn0sIHdoaWNoIGlzIGEgbGlzdCBvZiBzdHJpbmdzLiAgSXRzIGxlbmd0aCBpcyBhdCBsZWFzdApvbmU7IHdoZW4gbm8gc2NyaXB0IGFuZCBubyBhcmd1bWVudHMgYXJlIGdpdmVuLCBcY29kZXtzeXMuYXJndlswXX0gaXMKYW4gZW1wdHkgc3RyaW5nLiAgV2hlbiB0aGUgc2NyaXB0IG5hbWUgaXMgZ2l2ZW4gYXMgXGNvZGV7Jy0nfSAobWVhbmluZyAKc3RhbmRhcmQgaW5wdXQpLCBcY29kZXtzeXMuYXJndlswXX0gaXMgc2V0IHRvIFxjb2RleyctJ30uICBXaGVuClxwcm9ncmFtb3B0ey1jfSBcdmFye2NvbW1hbmR9IGlzIHVzZWQsIFxjb2Rle3N5cy5hcmd2WzBdfSBpcyBzZXQgdG8KXGNvZGV7Jy1jJ30uICBXaGVuIFxwcm9ncmFtb3B0ey1tfSBcdmFye21vZHVsZX0gaXMgdXNlZCwgXGNvZGV7c3lzLmFyZ3ZbMF19IAppcyBzZXQgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGUgbG9jYXRlZCBtb2R1bGUuICBPcHRpb25zIGZvdW5kIGFmdGVyIApccHJvZ3JhbW9wdHstY30gXHZhcntjb21tYW5kfSBvciBccHJvZ3JhbW9wdHstbX0gXHZhcnttb2R1bGV9IGFyZSBub3QgY29uc3VtZWQgCmJ5IHRoZSBQeXRob24gaW50ZXJwcmV0ZXIncyBvcHRpb24gcHJvY2Vzc2luZyBidXQgbGVmdCBpbiBcY29kZXtzeXMuYXJndn0gZm9yIAp0aGUgY29tbWFuZCBvciBtb2R1bGUgdG8gaGFuZGxlLgoKXHN1YnNlY3Rpb257SW50ZXJhY3RpdmUgTW9kZSBcbGFiZWx7aW50ZXJhY3RpdmV9fQoKV2hlbiBjb21tYW5kcyBhcmUgcmVhZCBmcm9tIGEgdHR5LCB0aGUgaW50ZXJwcmV0ZXIgaXMgc2FpZCB0byBiZSBpbgpcZW1waHtpbnRlcmFjdGl2ZSBtb2RlfS4gIEluIHRoaXMgbW9kZSBpdCBwcm9tcHRzIGZvciB0aGUgbmV4dCBjb21tYW5kCndpdGggdGhlIFxlbXBoe3ByaW1hcnkgcHJvbXB0fSwgdXN1YWxseSB0aHJlZSBncmVhdGVyLXRoYW4gc2lnbnMKKFxzYW1wez5cY29kZXs+fT5+fSk7IGZvciBjb250aW51YXRpb24gbGluZXMgaXQgcHJvbXB0cyB3aXRoIHRoZQpcZW1waHtzZWNvbmRhcnkgcHJvbXB0fSwgYnkgZGVmYXVsdCB0aHJlZSBkb3RzIChcc2FtcHsuLi5+fSkuClRoZSBpbnRlcnByZXRlciBwcmludHMgYSB3ZWxjb21lIG1lc3NhZ2Ugc3RhdGluZyBpdHMgdmVyc2lvbiBudW1iZXIKYW5kIGEgY29weXJpZ2h0IG5vdGljZSBiZWZvcmUgcHJpbnRpbmcgdGhlIGZpcnN0IHByb21wdDoKClxiZWdpbnt2ZXJiYXRpbX0KcHl0aG9uClB5dGhvbiAxLjUuMmIyICgjMSwgRmViIDI4IDE5OTksIDAwOjAyOjA2KSAgW0dDQyAyLjguMV0gb24gc3Vub3M1CkNvcHlyaWdodCAxOTkxLTE5OTUgU3RpY2h0aW5nIE1hdGhlbWF0aXNjaCBDZW50cnVtLCBBbXN0ZXJkYW0KPj4+ClxlbmR7dmVyYmF0aW19CgpDb250aW51YXRpb24gbGluZXMgYXJlIG5lZWRlZCB3aGVuIGVudGVyaW5nIGEgbXVsdGktbGluZSBjb25zdHJ1Y3QuCkFzIGFuIGV4YW1wbGUsIHRha2UgYSBsb29rIGF0IHRoaXMgXGtleXdvcmR7aWZ9IHN0YXRlbWVudDoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHRoZV93b3JsZF9pc19mbGF0ID0gMQo+Pj4gaWYgdGhlX3dvcmxkX2lzX2ZsYXQ6Ci4uLiAgICAgcHJpbnQgIkJlIGNhcmVmdWwgbm90IHRvIGZhbGwgb2ZmISIKLi4uIApCZSBjYXJlZnVsIG5vdCB0byBmYWxsIG9mZiEKXGVuZHt2ZXJiYXRpbX0KCgpcc2VjdGlvbntUaGUgSW50ZXJwcmV0ZXIgYW5kIEl0cyBFbnZpcm9ubWVudCBcbGFiZWx7aW50ZXJwfX0KClxzdWJzZWN0aW9ue0Vycm9yIEhhbmRsaW5nIFxsYWJlbHtlcnJvcn19CgpXaGVuIGFuIGVycm9yIG9jY3VycywgdGhlIGludGVycHJldGVyIHByaW50cyBhbiBlcnJvcgptZXNzYWdlIGFuZCBhIHN0YWNrIHRyYWNlLiAgSW4gaW50ZXJhY3RpdmUgbW9kZSwgaXQgdGhlbiByZXR1cm5zIHRvCnRoZSBwcmltYXJ5IHByb21wdDsgd2hlbiBpbnB1dCBjYW1lIGZyb20gYSBmaWxlLCBpdCBleGl0cyB3aXRoIGEKbm9uemVybyBleGl0IHN0YXR1cyBhZnRlciBwcmludGluZwp0aGUgc3RhY2sgdHJhY2UuICAoRXhjZXB0aW9ucyBoYW5kbGVkIGJ5IGFuIFxrZXl3b3Jke2V4Y2VwdH0gY2xhdXNlIGluIGEKXGtleXdvcmR7dHJ5fSBzdGF0ZW1lbnQgYXJlIG5vdCBlcnJvcnMgaW4gdGhpcyBjb250ZXh0LikgIFNvbWUgZXJyb3JzIGFyZQp1bmNvbmRpdGlvbmFsbHkgZmF0YWwgYW5kIGNhdXNlIGFuIGV4aXQgd2l0aCBhIG5vbnplcm8gZXhpdDsgdGhpcwphcHBsaWVzIHRvIGludGVybmFsIGluY29uc2lzdGVuY2llcyBhbmQgc29tZSBjYXNlcyBvZiBydW5uaW5nIG91dCBvZgptZW1vcnkuICBBbGwgZXJyb3IgbWVzc2FnZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIHN0YW5kYXJkIGVycm9yIHN0cmVhbTsKbm9ybWFsIG91dHB1dCBmcm9tIHRoZSBleGVjdXRlZCBjb21tYW5kcyBpcyB3cml0dGVuIHRvIHN0YW5kYXJkCm91dHB1dC4KClR5cGluZyB0aGUgaW50ZXJydXB0IGNoYXJhY3RlciAodXN1YWxseSBDb250cm9sLUMgb3IgREVMKSB0byB0aGUKcHJpbWFyeSBvciBzZWNvbmRhcnkgcHJvbXB0IGNhbmNlbHMgdGhlIGlucHV0IGFuZCByZXR1cm5zIHRvIHRoZQpwcmltYXJ5IHByb21wdC5cZm9vdG5vdGV7CiAgICAgICAgQSBwcm9ibGVtIHdpdGggdGhlIEdOVSBSZWFkbGluZSBwYWNrYWdlIG1heSBwcmV2ZW50IHRoaXMuCn0KVHlwaW5nIGFuIGludGVycnVwdCB3aGlsZSBhIGNvbW1hbmQgaXMgZXhlY3V0aW5nIHJhaXNlcyB0aGUKXGV4Y2VwdGlvbntLZXlib2FyZEludGVycnVwdH0gZXhjZXB0aW9uLCB3aGljaCBtYXkgYmUgaGFuZGxlZCBieSBhClxrZXl3b3Jke3RyeX0gc3RhdGVtZW50LgoKXHN1YnNlY3Rpb257RXhlY3V0YWJsZSBQeXRob24gU2NyaXB0cyBcbGFiZWx7c2NyaXB0c319CgpPbiBCU0QnaXNoIFxVTklYe30gc3lzdGVtcywgUHl0aG9uIHNjcmlwdHMgY2FuIGJlIG1hZGUgZGlyZWN0bHkKZXhlY3V0YWJsZSwgbGlrZSBzaGVsbCBzY3JpcHRzLCBieSBwdXR0aW5nIHRoZSBsaW5lCgpcYmVnaW57dmVyYmF0aW19CiMhIC91c3IvYmluL2VudiBweXRob24KXGVuZHt2ZXJiYXRpbX0KCihhc3N1bWluZyB0aGF0IHRoZSBpbnRlcnByZXRlciBpcyBvbiB0aGUgdXNlcidzIFxlbnZ2YXJ7UEFUSH0pIGF0IHRoZQpiZWdpbm5pbmcgb2YgdGhlIHNjcmlwdCBhbmQgZ2l2aW5nIHRoZSBmaWxlIGFuIGV4ZWN1dGFibGUgbW9kZS4gIFRoZQpcc2FtcHtcIyF9IG11c3QgYmUgdGhlIGZpcnN0IHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBmaWxlLiAgT24gc29tZQpwbGF0Zm9ybXMsIHRoaXMgZmlyc3QgbGluZSBtdXN0IGVuZCB3aXRoIGEgXFVOSVgtc3R5bGUgbGluZSBlbmRpbmcKKFxjaGFyYWN0ZXJ7XGUgbn0pLCBub3QgYSBNYWMgT1MgKFxjaGFyYWN0ZXJ7XGUgcn0pIG9yIFdpbmRvd3MKKFxjaGFyYWN0ZXJ7XGUgclxlIG59KSBsaW5lIGVuZGluZy4gIE5vdGUgdGhhdAp0aGUgaGFzaCwgb3IgcG91bmQsIGNoYXJhY3RlciwgXGNoYXJhY3RlcntcI30sIGlzIHVzZWQgdG8gc3RhcnQgYQpjb21tZW50IGluIFB5dGhvbi4KClRoZSBzY3JpcHQgY2FuIGJlIGdpdmVuIGEgZXhlY3V0YWJsZSBtb2RlLCBvciBwZXJtaXNzaW9uLCB1c2luZyB0aGUKXHByb2dyYW17Y2htb2R9IGNvbW1hbmQ6CgpcYmVnaW57dmVyYmF0aW19CiQgY2htb2QgK3ggbXlzY3JpcHQucHkKXGVuZHt2ZXJiYXRpbX0gJSAkIDwtLSBib3cgdG8gZm9udC1sb2NrCgoKXHN1YnNlY3Rpb257U291cmNlIENvZGUgRW5jb2Rpbmd9CgpJdCBpcyBwb3NzaWJsZSB0byB1c2UgZW5jb2RpbmdzIGRpZmZlcmVudCB0aGFuIFxBU0NJSXt9IGluIFB5dGhvbiBzb3VyY2UKZmlsZXMuIFRoZSBiZXN0IHdheSB0byBkbyBpdCBpcyB0byBwdXQgb25lIG1vcmUgc3BlY2lhbCBjb21tZW50IGxpbmUKcmlnaHQgYWZ0ZXIgdGhlIFxjb2Rle1wjIX0gbGluZSB0byBkZWZpbmUgdGhlIHNvdXJjZSBmaWxlIGVuY29kaW5nOgoKXGJlZ2lue2FsbHR0fQojIC0qLSBjb2Rpbmc6IFx2YXJ7ZW5jb2Rpbmd9IC0qLSAKXGVuZHthbGx0dH0KCldpdGggdGhhdCBkZWNsYXJhdGlvbiwgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHNvdXJjZSBmaWxlIHdpbGwgYmUgdHJlYXRlZCBhcwpoYXZpbmcgdGhlIGVuY29kaW5nIFx2YXJ7ZW5jb2Rpbmd9LCBhbmQgaXQgd2lsbCBiZQpwb3NzaWJsZSB0byBkaXJlY3RseSB3cml0ZSBVbmljb2RlIHN0cmluZyBsaXRlcmFscyBpbiB0aGUgc2VsZWN0ZWQKZW5jb2RpbmcuICBUaGUgbGlzdCBvZiBwb3NzaWJsZSBlbmNvZGluZ3MgY2FuIGJlIGZvdW5kIGluIHRoZQpcY2l0ZXRpdGxlWy4uL2xpYi9saWIuaHRtbF17UHl0aG9uIExpYnJhcnkgUmVmZXJlbmNlfSwgaW4gdGhlIHNlY3Rpb24Kb24gXHVsaW5re1xtb2R1bGV7Y29kZWNzfX17Li4vbGliL21vZHVsZS1jb2RlY3MuaHRtbH0uCgpGb3IgZXhhbXBsZSwgdG8gd3JpdGUgVW5pY29kZSBsaXRlcmFscyBpbmNsdWRpbmcgdGhlIEV1cm8gY3VycmVuY3kKc3ltYm9sLCB0aGUgSVNPLTg4NTktMTUgZW5jb2RpbmcgY2FuIGJlIHVzZWQsIHdpdGggdGhlIEV1cm8gc3ltYm9sCmhhdmluZyB0aGUgb3JkaW5hbCB2YWx1ZSAxNjQuICBUaGlzIHNjcmlwdCB3aWxsIHByaW50IHRoZSB2YWx1ZSA4MzY0Cih0aGUgVW5pY29kZSBjb2RlcG9pbnQgY29ycmVzcG9uZGluZyB0byB0aGUgRXVybyBzeW1ib2wpIGFuZCB0aGVuCmV4aXQ6CgpcYmVnaW57YWxsdHR9CiMgLSotIGNvZGluZzogaXNvLTg4NTktMTUgLSotCgpjdXJyZW5jeSA9IHUiXHRleHRldXJvIgpwcmludCBvcmQoY3VycmVuY3kpClxlbmR7YWxsdHR9CgpJZiB5b3VyIGVkaXRvciBzdXBwb3J0cyBzYXZpbmcgZmlsZXMgYXMgXGNvZGV7VVRGLTh9IHdpdGggYSBVVEYtOApcZW1waHtieXRlIG9yZGVyIG1hcmt9IChha2EgQk9NKSwgeW91IGNhbiB1c2UgdGhhdCBpbnN0ZWFkIG9mIGFuCmVuY29kaW5nIGRlY2xhcmF0aW9uLiBJRExFIHN1cHBvcnRzIHRoaXMgY2FwYWJpbGl0eSBpZgpcY29kZXtPcHRpb25zL0dlbmVyYWwvRGVmYXVsdCBTb3VyY2UgRW5jb2RpbmcvVVRGLTh9IGlzIHNldC4gTm90aWNlCnRoYXQgdGhpcyBzaWduYXR1cmUgaXMgbm90IHVuZGVyc3Rvb2QgaW4gb2xkZXIgUHl0aG9uIHJlbGVhc2VzICgyLjIKYW5kIGVhcmxpZXIpLCBhbmQgYWxzbyBub3QgdW5kZXJzdG9vZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbSBmb3IKc2NyaXB0IGZpbGVzIHdpdGggXGNvZGV7XCMhfSBsaW5lcyAob25seSB1c2VkIG9uIFxVTklYe30gc3lzdGVtcykuCgpCeSB1c2luZyBVVEYtOCAoZWl0aGVyIHRocm91Z2ggdGhlIHNpZ25hdHVyZSBvciBhbiBlbmNvZGluZwpkZWNsYXJhdGlvbiksIGNoYXJhY3RlcnMgb2YgbW9zdCBsYW5ndWFnZXMgaW4gdGhlIHdvcmxkIGNhbiBiZSB1c2VkCnNpbXVsdGFuZW91c2x5IGluIHN0cmluZyBsaXRlcmFscyBhbmQgY29tbWVudHMuICBVc2luZyBub24tXEFTQ0lJe30KY2hhcmFjdGVycyBpbiBpZGVudGlmaWVycyBpcyBub3Qgc3VwcG9ydGVkLiBUbyBkaXNwbGF5IGFsbCB0aGVzZQpjaGFyYWN0ZXJzIHByb3Blcmx5LCB5b3VyIGVkaXRvciBtdXN0IHJlY29nbml6ZSB0aGF0IHRoZSBmaWxlIGlzClVURi04LCBhbmQgaXQgbXVzdCB1c2UgYSBmb250IHRoYXQgc3VwcG9ydHMgYWxsIHRoZSBjaGFyYWN0ZXJzIGluIHRoZQpmaWxlLgoKXHN1YnNlY3Rpb257VGhlIEludGVyYWN0aXZlIFN0YXJ0dXAgRmlsZSBcbGFiZWx7c3RhcnR1cH19CgolIFhYWCBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBkdW1wZWQgaW4gYW4gYXBwZW5kaXgsIHNpbmNlIG1vc3QgcGVvcGxlCiUgZG9uJ3QgdXNlIFB5dGhvbiBpbnRlcmFjdGl2ZWx5IGluIG5vbi10cml2aWFsIHdheXMuCgpXaGVuIHlvdSB1c2UgUHl0aG9uIGludGVyYWN0aXZlbHksIGl0IGlzIGZyZXF1ZW50bHkgaGFuZHkgdG8gaGF2ZSBzb21lCnN0YW5kYXJkIGNvbW1hbmRzIGV4ZWN1dGVkIGV2ZXJ5IHRpbWUgdGhlIGludGVycHJldGVyIGlzIHN0YXJ0ZWQuICBZb3UKY2FuIGRvIHRoaXMgYnkgc2V0dGluZyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lZApcZW52dmFye1BZVEhPTlNUQVJUVVB9IHRvIHRoZSBuYW1lIG9mIGEgZmlsZSBjb250YWluaW5nIHlvdXIgc3RhcnQtdXAKY29tbWFuZHMuICBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIFxmaWxley5wcm9maWxlfSBmZWF0dXJlIG9mIHRoZQpcVU5JWHt9IHNoZWxscy4KClRoaXMgZmlsZSBpcyBvbmx5IHJlYWQgaW4gaW50ZXJhY3RpdmUgc2Vzc2lvbnMsIG5vdCB3aGVuIFB5dGhvbiByZWFkcwpjb21tYW5kcyBmcm9tIGEgc2NyaXB0LCBhbmQgbm90IHdoZW4gXGZpbGV7L2Rldi90dHl9IGlzIGdpdmVuIGFzIHRoZQpleHBsaWNpdCBzb3VyY2Ugb2YgY29tbWFuZHMgKHdoaWNoIG90aGVyd2lzZSBiZWhhdmVzIGxpa2UgYW4KaW50ZXJhY3RpdmUgc2Vzc2lvbikuICBJdCBpcyBleGVjdXRlZCBpbiB0aGUgc2FtZSBuYW1lc3BhY2Ugd2hlcmUKaW50ZXJhY3RpdmUgY29tbWFuZHMgYXJlIGV4ZWN1dGVkLCBzbyB0aGF0IG9iamVjdHMgdGhhdCBpdCBkZWZpbmVzIG9yCmltcG9ydHMgY2FuIGJlIHVzZWQgd2l0aG91dCBxdWFsaWZpY2F0aW9uIGluIHRoZSBpbnRlcmFjdGl2ZSBzZXNzaW9uLgpZb3UgY2FuIGFsc28gY2hhbmdlIHRoZSBwcm9tcHRzIFxjb2Rle3N5cy5wczF9IGFuZCBcY29kZXtzeXMucHMyfSBpbgp0aGlzIGZpbGUuCgpJZiB5b3Ugd2FudCB0byByZWFkIGFuIGFkZGl0aW9uYWwgc3RhcnQtdXAgZmlsZSBmcm9tIHRoZSBjdXJyZW50CmRpcmVjdG9yeSwgeW91IGNhbiBwcm9ncmFtIHRoaXMgaW4gdGhlIGdsb2JhbCBzdGFydC11cCBmaWxlIHVzaW5nIGNvZGUKbGlrZSBcc2FtcHtpZiBvcy5wYXRoLmlzZmlsZSgnLnB5dGhvbnJjLnB5Jyk6CmV4ZWNmaWxlKCcucHl0aG9ucmMucHknKX0uICBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIHN0YXJ0dXAgZmlsZSBpbiBhCnNjcmlwdCwgeW91IG11c3QgZG8gdGhpcyBleHBsaWNpdGx5IGluIHRoZSBzY3JpcHQ6CgpcYmVnaW57dmVyYmF0aW19CmltcG9ydCBvcwpmaWxlbmFtZSA9IG9zLmVudmlyb24uZ2V0KCdQWVRIT05TVEFSVFVQJykKaWYgZmlsZW5hbWUgYW5kIG9zLnBhdGguaXNmaWxlKGZpbGVuYW1lKToKICAgIGV4ZWNmaWxlKGZpbGVuYW1lKQpcZW5ke3ZlcmJhdGltfQoKClxjaGFwdGVye0FuIEluZm9ybWFsIEludHJvZHVjdGlvbiB0byBQeXRob24gXGxhYmVse2luZm9ybWFsfX0KCkluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMsIGlucHV0IGFuZCBvdXRwdXQgYXJlIGRpc3Rpbmd1aXNoZWQgYnkgdGhlCnByZXNlbmNlIG9yIGFic2VuY2Ugb2YgcHJvbXB0cyAoXHNhbXB7Plxjb2Rlez59Pn59IGFuZCBcc2FtcHsuLi5+fSk6IHRvIHJlcGVhdAp0aGUgZXhhbXBsZSwgeW91IG11c3QgdHlwZSBldmVyeXRoaW5nIGFmdGVyIHRoZSBwcm9tcHQsIHdoZW4gdGhlCnByb21wdCBhcHBlYXJzOyBsaW5lcyB0aGF0IGRvIG5vdCBiZWdpbiB3aXRoIGEgcHJvbXB0IGFyZSBvdXRwdXQgZnJvbQp0aGUgaW50ZXJwcmV0ZXIuICUKJVxmb290bm90ZXsKJSAgICAgICAgSSdkIHByZWZlciB0byB1c2UgZGlmZmVyZW50IGZvbnRzIHRvIGRpc3Rpbmd1aXNoIGlucHV0CiUgICAgICAgIGZyb20gb3V0cHV0LCBidXQgdGhlIGFtb3VudCBvZiBMYVRlWCBoYWNraW5nIHRoYXQgd291bGQgcmVxdWlyZQolICAgICAgICBpcyBjdXJyZW50bHkgYmV5b25kIG15IGFiaWxpdHkuCiV9Ck5vdGUgdGhhdCBhIHNlY29uZGFyeSBwcm9tcHQgb24gYSBsaW5lIGJ5IGl0c2VsZiBpbiBhbiBleGFtcGxlIG1lYW5zCnlvdSBtdXN0IHR5cGUgYSBibGFuayBsaW5lOyB0aGlzIGlzIHVzZWQgdG8gZW5kIGEgbXVsdGktbGluZSBjb21tYW5kLgoKTWFueSBvZiB0aGUgZXhhbXBsZXMgaW4gdGhpcyBtYW51YWwsIGV2ZW4gdGhvc2UgZW50ZXJlZCBhdCB0aGUKaW50ZXJhY3RpdmUgcHJvbXB0LCBpbmNsdWRlIGNvbW1lbnRzLiAgQ29tbWVudHMgaW4gUHl0aG9uIHN0YXJ0IHdpdGgKdGhlIGhhc2ggY2hhcmFjdGVyLCBcY2hhcmFjdGVye1wjfSwgYW5kIGV4dGVuZCB0byB0aGUgZW5kIG9mIHRoZQpwaHlzaWNhbCBsaW5lLiAgQSBjb21tZW50IG1heSBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZSBvcgpmb2xsb3dpbmcgd2hpdGVzcGFjZSBvciBjb2RlLCBidXQgbm90IHdpdGhpbiBhIHN0cmluZyBsaXRlcmFsLiAgQSBoYXNoIApjaGFyYWN0ZXIgd2l0aGluIGEgc3RyaW5nIGxpdGVyYWwgaXMganVzdCBhIGhhc2ggY2hhcmFjdGVyLgoKU29tZSBleGFtcGxlczoKClxiZWdpbnt2ZXJiYXRpbX0KIyB0aGlzIGlzIHRoZSBmaXJzdCBjb21tZW50ClNQQU0gPSAxICAgICAgICAgICAgICAgICAjIGFuZCB0aGlzIGlzIHRoZSBzZWNvbmQgY29tbWVudAogICAgICAgICAgICAgICAgICAgICAgICAgIyAuLi4gYW5kIG5vdyBhIHRoaXJkIQpTVFJJTkcgPSAiIyBUaGlzIGlzIG5vdCBhIGNvbW1lbnQuIgpcZW5ke3ZlcmJhdGltfQoKClxzZWN0aW9ue1VzaW5nIFB5dGhvbiBhcyBhIENhbGN1bGF0b3IgXGxhYmVse2NhbGN1bGF0b3J9fQoKTGV0J3MgdHJ5IHNvbWUgc2ltcGxlIFB5dGhvbiBjb21tYW5kcy4gIFN0YXJ0IHRoZSBpbnRlcnByZXRlciBhbmQgd2FpdApmb3IgdGhlIHByaW1hcnkgcHJvbXB0LCBcc2FtcHs+XGNvZGV7Pn0+fn0uICAoSXQgc2hvdWxkbid0IHRha2UgbG9uZy4pCgpcc3Vic2VjdGlvbntOdW1iZXJzIFxsYWJlbHtudW1iZXJzfX0KClRoZSBpbnRlcnByZXRlciBhY3RzIGFzIGEgc2ltcGxlIGNhbGN1bGF0b3I6IHlvdSBjYW4gdHlwZSBhbgpleHByZXNzaW9uIGF0IGl0IGFuZCBpdCB3aWxsIHdyaXRlIHRoZSB2YWx1ZS4gIEV4cHJlc3Npb24gc3ludGF4IGlzCnN0cmFpZ2h0Zm9yd2FyZDogdGhlIG9wZXJhdG9ycyBcY29kZXsrfSwgXGNvZGV7LX0sIFxjb2Rleyp9IGFuZApcY29kZXsvfSB3b3JrIGp1c3QgbGlrZSBpbiBtb3N0IG90aGVyIGxhbmd1YWdlcyAoZm9yIGV4YW1wbGUsIFBhc2NhbApvciBDKTsgcGFyZW50aGVzZXMgY2FuIGJlIHVzZWQgZm9yIGdyb3VwaW5nLiAgRm9yIGV4YW1wbGU6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiAyKzIKNAo+Pj4gIyBUaGlzIGlzIGEgY29tbWVudAouLi4gMisyCjQKPj4+IDIrMiAgIyBhbmQgYSBjb21tZW50IG9uIHRoZSBzYW1lIGxpbmUgYXMgY29kZQo0Cj4+PiAoNTAtNSo2KS80CjUKPj4+ICMgSW50ZWdlciBkaXZpc2lvbiByZXR1cm5zIHRoZSBmbG9vcjoKLi4uIDcvMwoyCj4+PiA3Ly0zCi0zClxlbmR7dmVyYmF0aW19CgpMaWtlIGluIEMsIHRoZSBlcXVhbCBzaWduIChcY2hhcmFjdGVyez19KSBpcyB1c2VkIHRvIGFzc2lnbiBhIHZhbHVlIHRvIGEKdmFyaWFibGUuICBUaGUgdmFsdWUgb2YgYW4gYXNzaWdubWVudCBpcyBub3Qgd3JpdHRlbjoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHdpZHRoID0gMjAKPj4+IGhlaWdodCA9IDUqOQo+Pj4gd2lkdGggKiBoZWlnaHQKOTAwClxlbmR7dmVyYmF0aW19CgpBIHZhbHVlIGNhbiBiZSBhc3NpZ25lZCB0byBzZXZlcmFsIHZhcmlhYmxlcyBzaW11bHRhbmVvdXNseToKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHggPSB5ID0geiA9IDAgICMgWmVybyB4LCB5IGFuZCB6Cj4+PiB4CjAKPj4+IHkKMAo+Pj4gegowClxlbmR7dmVyYmF0aW19CgpUaGVyZSBpcyBmdWxsIHN1cHBvcnQgZm9yIGZsb2F0aW5nIHBvaW50OyBvcGVyYXRvcnMgd2l0aCBtaXhlZCB0eXBlCm9wZXJhbmRzIGNvbnZlcnQgdGhlIGludGVnZXIgb3BlcmFuZCB0byBmbG9hdGluZyBwb2ludDoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IDMgKiAzLjc1IC8gMS41CjcuNQo+Pj4gNy4wIC8gMgozLjUKXGVuZHt2ZXJiYXRpbX0KCkNvbXBsZXggbnVtYmVycyBhcmUgYWxzbyBzdXBwb3J0ZWQ7IGltYWdpbmFyeSBudW1iZXJzIGFyZSB3cml0dGVuIHdpdGgKYSBzdWZmaXggb2YgXHNhbXB7an0gb3IgXHNhbXB7Sn0uICBDb21wbGV4IG51bWJlcnMgd2l0aCBhIG5vbnplcm8KcmVhbCBjb21wb25lbnQgYXJlIHdyaXR0ZW4gYXMgXHNhbXB7KFx2YXJ7cmVhbH0rXHZhcntpbWFnfWopfSwgb3IgY2FuCmJlIGNyZWF0ZWQgd2l0aCB0aGUgXHNhbXB7Y29tcGxleChcdmFye3JlYWx9LCBcdmFye2ltYWd9KX0gZnVuY3Rpb24uCgpcYmVnaW57dmVyYmF0aW19Cj4+PiAxaiAqIDFKCigtMSswaikKPj4+IDFqICogY29tcGxleCgwLDEpCigtMSswaikKPj4+IDMrMWoqMwooMyszaikKPj4+ICgzKzFqKSozCig5KzNqKQo+Pj4gKDErMmopLygxKzFqKQooMS41KzAuNWopClxlbmR7dmVyYmF0aW19CgpDb21wbGV4IG51bWJlcnMgYXJlIGFsd2F5cyByZXByZXNlbnRlZCBhcyB0d28gZmxvYXRpbmcgcG9pbnQgbnVtYmVycywKdGhlIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0LiAgVG8gZXh0cmFjdCB0aGVzZSBwYXJ0cyBmcm9tIGEgY29tcGxleApudW1iZXIgXHZhcnt6fSwgdXNlIFxjb2Rle1x2YXJ7en0ucmVhbH0gYW5kIFxjb2Rle1x2YXJ7en0uaW1hZ30uICAKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGE9MS41KzAuNWoKPj4+IGEucmVhbAoxLjUKPj4+IGEuaW1hZwowLjUKXGVuZHt2ZXJiYXRpbX0KClRoZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyB0byBmbG9hdGluZyBwb2ludCBhbmQgaW50ZWdlcgooXGZ1bmN0aW9ue2Zsb2F0KCl9LCBcZnVuY3Rpb257aW50KCl9IGFuZCBcZnVuY3Rpb257bG9uZygpfSkgZG9uJ3QKd29yayBmb3IgY29tcGxleCBudW1iZXJzIC0tLSB0aGVyZSBpcyBubyBvbmUgY29ycmVjdCB3YXkgdG8gY29udmVydCBhCmNvbXBsZXggbnVtYmVyIHRvIGEgcmVhbCBudW1iZXIuICBVc2UgXGNvZGV7YWJzKFx2YXJ7en0pfSB0byBnZXQgaXRzCm1hZ25pdHVkZSAoYXMgYSBmbG9hdCkgb3IgXGNvZGV7ei5yZWFsfSB0byBnZXQgaXRzIHJlYWwgcGFydC4KClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGE9My4wKzQuMGoKPj4+IGZsb2F0KGEpClRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/ClR5cGVFcnJvcjogY2FuJ3QgY29udmVydCBjb21wbGV4IHRvIGZsb2F0OyB1c2UgYWJzKHopCj4+PiBhLnJlYWwKMy4wCj4+PiBhLmltYWcKNC4wCj4+PiBhYnMoYSkgICMgc3FydChhLnJlYWwqKjIgKyBhLmltYWcqKjIpCjUuMAo+Pj4KXGVuZHt2ZXJiYXRpbX0KCkluIGludGVyYWN0aXZlIG1vZGUsIHRoZSBsYXN0IHByaW50ZWQgZXhwcmVzc2lvbiBpcyBhc3NpZ25lZCB0byB0aGUKdmFyaWFibGUgXGNvZGV7X30uICBUaGlzIG1lYW5zIHRoYXQgd2hlbiB5b3UgYXJlIHVzaW5nIFB5dGhvbiBhcyBhCmRlc2sgY2FsY3VsYXRvciwgaXQgaXMgc29tZXdoYXQgZWFzaWVyIHRvIGNvbnRpbnVlIGNhbGN1bGF0aW9ucywgZm9yCmV4YW1wbGU6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiB0YXggPSAxMi41IC8gMTAwCj4+PiBwcmljZSA9IDEwMC41MAo+Pj4gcHJpY2UgKiB0YXgKMTIuNTYyNQo+Pj4gcHJpY2UgKyBfCjExMy4wNjI1Cj4+PiByb3VuZChfLCAyKQoxMTMuMDYKPj4+ClxlbmR7dmVyYmF0aW19CgpUaGlzIHZhcmlhYmxlIHNob3VsZCBiZSB0cmVhdGVkIGFzIHJlYWQtb25seSBieSB0aGUgdXNlci4gIERvbid0CmV4cGxpY2l0bHkgYXNzaWduIGEgdmFsdWUgdG8gaXQgLS0tIHlvdSB3b3VsZCBjcmVhdGUgYW4gaW5kZXBlbmRlbnQKbG9jYWwgdmFyaWFibGUgd2l0aCB0aGUgc2FtZSBuYW1lIG1hc2tpbmcgdGhlIGJ1aWx0LWluIHZhcmlhYmxlIHdpdGgKaXRzIG1hZ2ljIGJlaGF2aW9yLgoKXHN1YnNlY3Rpb257U3RyaW5ncyBcbGFiZWx7c3RyaW5nc319CgpCZXNpZGVzIG51bWJlcnMsIFB5dGhvbiBjYW4gYWxzbyBtYW5pcHVsYXRlIHN0cmluZ3MsIHdoaWNoIGNhbiBiZQpleHByZXNzZWQgaW4gc2V2ZXJhbCB3YXlzLiAgVGhleSBjYW4gYmUgZW5jbG9zZWQgaW4gc2luZ2xlIHF1b3RlcyBvcgpkb3VibGUgcXVvdGVzOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gJ3NwYW0gZWdncycKJ3NwYW0gZWdncycKPj4+ICdkb2VzblwndCcKImRvZXNuJ3QiCj4+PiAiZG9lc24ndCIKImRvZXNuJ3QiCj4+PiAnIlllcywiIGhlIHNhaWQuJwonIlllcywiIGhlIHNhaWQuJwo+Pj4gIlwiWWVzLFwiIGhlIHNhaWQuIgonIlllcywiIGhlIHNhaWQuJwo+Pj4gJyJJc25cJ3QsIiBzaGUgc2FpZC4nCiciSXNuXCd0LCIgc2hlIHNhaWQuJwpcZW5ke3ZlcmJhdGltfQoKU3RyaW5nIGxpdGVyYWxzIGNhbiBzcGFuIG11bHRpcGxlIGxpbmVzIGluIHNldmVyYWwgd2F5cy4gIENvbnRpbnVhdGlvbgpsaW5lcyBjYW4gYmUgdXNlZCwgd2l0aCBhIGJhY2tzbGFzaCBhcyB0aGUgbGFzdCBjaGFyYWN0ZXIgb24gdGhlIGxpbmUKaW5kaWNhdGluZyB0aGF0IHRoZSBuZXh0IGxpbmUgaXMgYSBsb2dpY2FsIGNvbnRpbnVhdGlvbiBvZiB0aGUgbGluZToKClxiZWdpbnt2ZXJiYXRpbX0KaGVsbG8gPSAiVGhpcyBpcyBhIHJhdGhlciBsb25nIHN0cmluZyBjb250YWluaW5nXG5cCnNldmVyYWwgbGluZXMgb2YgdGV4dCBqdXN0IGFzIHlvdSB3b3VsZCBkbyBpbiBDLlxuXAogICAgTm90ZSB0aGF0IHdoaXRlc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSBpc1wKIHNpZ25pZmljYW50LiIKCnByaW50IGhlbGxvClxlbmR7dmVyYmF0aW19CgpOb3RlIHRoYXQgbmV3bGluZXMgd291bGQgc3RpbGwgbmVlZCB0byBiZSBlbWJlZGRlZCBpbiB0aGUgc3RyaW5nIHVzaW5nClxjb2Rle1xlIG59OyB0aGUgbmV3bGluZSBmb2xsb3dpbmcgdGhlIHRyYWlsaW5nIGJhY2tzbGFzaCBpcwpkaXNjYXJkZWQuICBUaGlzIGV4YW1wbGUgd291bGQgcHJpbnQgdGhlIGZvbGxvd2luZzoKClxiZWdpbnt2ZXJiYXRpbX0KVGhpcyBpcyBhIHJhdGhlciBsb25nIHN0cmluZyBjb250YWluaW5nCnNldmVyYWwgbGluZXMgb2YgdGV4dCBqdXN0IGFzIHlvdSB3b3VsZCBkbyBpbiBDLgogICAgTm90ZSB0aGF0IHdoaXRlc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSBpcyBzaWduaWZpY2FudC4KXGVuZHt2ZXJiYXRpbX0KCklmIHdlIG1ha2UgdGhlIHN0cmluZyBsaXRlcmFsIGEgYGByYXcnJyBzdHJpbmcsIGhvd2V2ZXIsIHRoZQpcY29kZXtcZSBufSBzZXF1ZW5jZXMgYXJlIG5vdCBjb252ZXJ0ZWQgdG8gbmV3bGluZXMsIGJ1dCB0aGUgYmFja3NsYXNoCmF0IHRoZSBlbmQgb2YgdGhlIGxpbmUsIGFuZCB0aGUgbmV3bGluZSBjaGFyYWN0ZXIgaW4gdGhlIHNvdXJjZSwgYXJlCmJvdGggaW5jbHVkZWQgaW4gdGhlIHN0cmluZyBhcyBkYXRhLiAgVGh1cywgdGhlIGV4YW1wbGU6CgpcYmVnaW57dmVyYmF0aW19CmhlbGxvID0gciJUaGlzIGlzIGEgcmF0aGVyIGxvbmcgc3RyaW5nIGNvbnRhaW5pbmdcblwKc2V2ZXJhbCBsaW5lcyBvZiB0ZXh0IG11Y2ggYXMgeW91IHdvdWxkIGRvIGluIEMuIgoKcHJpbnQgaGVsbG8KXGVuZHt2ZXJiYXRpbX0KCndvdWxkIHByaW50OgoKXGJlZ2lue3ZlcmJhdGltfQpUaGlzIGlzIGEgcmF0aGVyIGxvbmcgc3RyaW5nIGNvbnRhaW5pbmdcblwKc2V2ZXJhbCBsaW5lcyBvZiB0ZXh0IG11Y2ggYXMgeW91IHdvdWxkIGRvIGluIEMuClxlbmR7dmVyYmF0aW19CgpPciwgc3RyaW5ncyBjYW4gYmUgc3Vycm91bmRlZCBpbiBhIHBhaXIgb2YgbWF0Y2hpbmcgdHJpcGxlLXF1b3RlczoKXGNvZGV7IiIifSBvciBcY29kZXsnXGNvZGV7J30nfS4gIEVuZCBvZiBsaW5lcyBkbyBub3QgbmVlZCB0byBiZSBlc2NhcGVkCndoZW4gdXNpbmcgdHJpcGxlLXF1b3RlcywgYnV0IHRoZXkgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgc3RyaW5nLgoKXGJlZ2lue3ZlcmJhdGltfQpwcmludCAiIiIKVXNhZ2U6IHRoaW5neSBbT1BUSU9OU10gCiAgICAgLWggICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgdXNhZ2UgbWVzc2FnZQogICAgIC1IIGhvc3RuYW1lICAgICAgICAgICAgICAgSG9zdG5hbWUgdG8gY29ubmVjdCB0bwoiIiIKXGVuZHt2ZXJiYXRpbX0KCnByb2R1Y2VzIHRoZSBmb2xsb3dpbmcgb3V0cHV0OgoKXGJlZ2lue3ZlcmJhdGltfQpVc2FnZTogdGhpbmd5IFtPUFRJT05TXSAKICAgICAtaCAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgdGhpcyB1c2FnZSBtZXNzYWdlCiAgICAgLUggaG9zdG5hbWUgICAgICAgICAgICAgICBIb3N0bmFtZSB0byBjb25uZWN0IHRvClxlbmR7dmVyYmF0aW19CgpUaGUgaW50ZXJwcmV0ZXIgcHJpbnRzIHRoZSByZXN1bHQgb2Ygc3RyaW5nIG9wZXJhdGlvbnMgaW4gdGhlIHNhbWUgd2F5CmFzIHRoZXkgYXJlIHR5cGVkIGZvciBpbnB1dDogaW5zaWRlIHF1b3RlcywgYW5kIHdpdGggcXVvdGVzIGFuZCBvdGhlcgpmdW5ueSBjaGFyYWN0ZXJzIGVzY2FwZWQgYnkgYmFja3NsYXNoZXMsIHRvIHNob3cgdGhlIHByZWNpc2UKdmFsdWUuICBUaGUgc3RyaW5nIGlzIGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXMgaWYgdGhlIHN0cmluZyBjb250YWlucwphIHNpbmdsZSBxdW90ZSBhbmQgbm8gZG91YmxlIHF1b3RlcywgZWxzZSBpdCdzIGVuY2xvc2VkIGluIHNpbmdsZQpxdW90ZXMuICAoVGhlIFxrZXl3b3Jke3ByaW50fSBzdGF0ZW1lbnQsIGRlc2NyaWJlZCBsYXRlciwgY2FuIGJlIHVzZWQKdG8gd3JpdGUgc3RyaW5ncyB3aXRob3V0IHF1b3RlcyBvciBlc2NhcGVzLikKClN0cmluZ3MgY2FuIGJlIGNvbmNhdGVuYXRlZCAoZ2x1ZWQgdG9nZXRoZXIpIHdpdGggdGhlClxjb2Rleyt9IG9wZXJhdG9yLCBhbmQgcmVwZWF0ZWQgd2l0aCBcY29kZXsqfToKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHdvcmQgPSAnSGVscCcgKyAnQScKPj4+IHdvcmQKJ0hlbHBBJwo+Pj4gJzwnICsgd29yZCo1ICsgJz4nCic8SGVscEFIZWxwQUhlbHBBSGVscEFIZWxwQT4nClxlbmR7dmVyYmF0aW19CgpUd28gc3RyaW5nIGxpdGVyYWxzIG5leHQgdG8gZWFjaCBvdGhlciBhcmUgYXV0b21hdGljYWxseSBjb25jYXRlbmF0ZWQ7CnRoZSBmaXJzdCBsaW5lIGFib3ZlIGNvdWxkIGFsc28gaGF2ZSBiZWVuIHdyaXR0ZW4gXHNhbXB7d29yZCA9ICdIZWxwJwonQSd9OyB0aGlzIG9ubHkgd29ya3Mgd2l0aCB0d28gbGl0ZXJhbHMsIG5vdCB3aXRoIGFyYml0cmFyeSBzdHJpbmcKZXhwcmVzc2lvbnM6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiAnc3RyJyAnaW5nJyAgICAgICAgICAgICAgICAgICAjICA8LSAgVGhpcyBpcyBvawonc3RyaW5nJwo+Pj4gJ3N0cicuc3RyaXAoKSArICdpbmcnICAgIyAgPC0gIFRoaXMgaXMgb2sKJ3N0cmluZycKPj4+ICdzdHInLnN0cmlwKCkgJ2luZycgICAgICMgIDwtICBUaGlzIGlzIGludmFsaWQKICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/CiAgICAnc3RyJy5zdHJpcCgpICdpbmcnCiAgICAgICAgICAgICAgICAgICAgICBeClN5bnRheEVycm9yOiBpbnZhbGlkIHN5bnRheApcZW5ke3ZlcmJhdGltfQoKU3RyaW5ncyBjYW4gYmUgc3Vic2NyaXB0ZWQgKGluZGV4ZWQpOyBsaWtlIGluIEMsIHRoZSBmaXJzdCBjaGFyYWN0ZXIKb2YgYSBzdHJpbmcgaGFzIHN1YnNjcmlwdCAoaW5kZXgpIDAuICBUaGVyZSBpcyBubyBzZXBhcmF0ZSBjaGFyYWN0ZXIKdHlwZTsgYSBjaGFyYWN0ZXIgaXMgc2ltcGx5IGEgc3RyaW5nIG9mIHNpemUgb25lLiAgTGlrZSBpbiBJY29uLApzdWJzdHJpbmdzIGNhbiBiZSBzcGVjaWZpZWQgd2l0aCB0aGUgXGVtcGh7c2xpY2Ugbm90YXRpb259OiB0d28gaW5kaWNlcwpzZXBhcmF0ZWQgYnkgYSBjb2xvbi4KClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHdvcmRbNF0KJ0EnCj4+PiB3b3JkWzA6Ml0KJ0hlJwo+Pj4gd29yZFsyOjRdCidscCcKXGVuZHt2ZXJiYXRpbX0KClNsaWNlIGluZGljZXMgaGF2ZSB1c2VmdWwgZGVmYXVsdHM7IGFuIG9taXR0ZWQgZmlyc3QgaW5kZXggZGVmYXVsdHMgdG8KemVybywgYW4gb21pdHRlZCBzZWNvbmQgaW5kZXggZGVmYXVsdHMgdG8gdGhlIHNpemUgb2YgdGhlIHN0cmluZyBiZWluZwpzbGljZWQuCgpcYmVnaW57dmVyYmF0aW19Cj4+PiB3b3JkWzoyXSAgICAjIFRoZSBmaXJzdCB0d28gY2hhcmFjdGVycwonSGUnCj4+PiB3b3JkWzI6XSAgICAjIEV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBmaXJzdCB0d28gY2hhcmFjdGVycwonbHBBJwpcZW5ke3ZlcmJhdGltfQoKVW5saWtlIGEgQyBzdHJpbmcsIFB5dGhvbiBzdHJpbmdzIGNhbm5vdCBiZSBjaGFuZ2VkLiAgQXNzaWduaW5nIHRvIGFuIAppbmRleGVkIHBvc2l0aW9uIGluIHRoZSBzdHJpbmcgcmVzdWx0cyBpbiBhbiBlcnJvcjoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHdvcmRbMF0gPSAneCcKVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KVHlwZUVycm9yOiBvYmplY3QgZG9lc24ndCBzdXBwb3J0IGl0ZW0gYXNzaWdubWVudAo+Pj4gd29yZFs6MV0gPSAnU3BsYXQnClRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/ClR5cGVFcnJvcjogb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCBzbGljZSBhc3NpZ25tZW50ClxlbmR7dmVyYmF0aW19CgpIb3dldmVyLCBjcmVhdGluZyBhIG5ldyBzdHJpbmcgd2l0aCB0aGUgY29tYmluZWQgY29udGVudCBpcyBlYXN5IGFuZAplZmZpY2llbnQ6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiAneCcgKyB3b3JkWzE6XQoneGVscEEnCj4+PiAnU3BsYXQnICsgd29yZFs0XQonU3BsYXRBJwpcZW5ke3ZlcmJhdGltfQoKSGVyZSdzIGEgdXNlZnVsIGludmFyaWFudCBvZiBzbGljZSBvcGVyYXRpb25zOgpcY29kZXtzWzppXSArIHNbaTpdfSBlcXVhbHMgXGNvZGV7c30uCgpcYmVnaW57dmVyYmF0aW19Cj4+PiB3b3JkWzoyXSArIHdvcmRbMjpdCidIZWxwQScKPj4+IHdvcmRbOjNdICsgd29yZFszOl0KJ0hlbHBBJwpcZW5ke3ZlcmJhdGltfQoKRGVnZW5lcmF0ZSBzbGljZSBpbmRpY2VzIGFyZSBoYW5kbGVkIGdyYWNlZnVsbHk6IGFuIGluZGV4IHRoYXQgaXMgdG9vCmxhcmdlIGlzIHJlcGxhY2VkIGJ5IHRoZSBzdHJpbmcgc2l6ZSwgYW4gdXBwZXIgYm91bmQgc21hbGxlciB0aGFuIHRoZQpsb3dlciBib3VuZCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4KClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHdvcmRbMToxMDBdCidlbHBBJwo+Pj4gd29yZFsxMDpdCicnCj4+PiB3b3JkWzI6MV0KJycKXGVuZHt2ZXJiYXRpbX0KCkluZGljZXMgbWF5IGJlIG5lZ2F0aXZlIG51bWJlcnMsIHRvIHN0YXJ0IGNvdW50aW5nIGZyb20gdGhlIHJpZ2h0LgpGb3IgZXhhbXBsZToKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHdvcmRbLTFdICAgICAjIFRoZSBsYXN0IGNoYXJhY3RlcgonQScKPj4+IHdvcmRbLTJdICAgICAjIFRoZSBsYXN0LWJ1dC1vbmUgY2hhcmFjdGVyCidwJwo+Pj4gd29yZFstMjpdICAgICMgVGhlIGxhc3QgdHdvIGNoYXJhY3RlcnMKJ3BBJwo+Pj4gd29yZFs6LTJdICAgICMgRXZlcnl0aGluZyBleGNlcHQgdGhlIGxhc3QgdHdvIGNoYXJhY3RlcnMKJ0hlbCcKXGVuZHt2ZXJiYXRpbX0KCkJ1dCBub3RlIHRoYXQgLTAgaXMgcmVhbGx5IHRoZSBzYW1lIGFzIDAsIHNvIGl0IGRvZXMgbm90IGNvdW50IGZyb20KdGhlIHJpZ2h0IQoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gd29yZFstMF0gICAgICMgKHNpbmNlIC0wIGVxdWFscyAwKQonSCcKXGVuZHt2ZXJiYXRpbX0KCk91dC1vZi1yYW5nZSBuZWdhdGl2ZSBzbGljZSBpbmRpY2VzIGFyZSB0cnVuY2F0ZWQsIGJ1dCBkb24ndCB0cnkgdGhpcwpmb3Igc2luZ2xlLWVsZW1lbnQgKG5vbi1zbGljZSkgaW5kaWNlczoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHdvcmRbLTEwMDpdCidIZWxwQScKPj4+IHdvcmRbLTEwXSAgICAjIGVycm9yClRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/CkluZGV4RXJyb3I6IHN0cmluZyBpbmRleCBvdXQgb2YgcmFuZ2UKXGVuZHt2ZXJiYXRpbX0KClRoZSBiZXN0IHdheSB0byByZW1lbWJlciBob3cgc2xpY2VzIHdvcmsgaXMgdG8gdGhpbmsgb2YgdGhlIGluZGljZXMgYXMKcG9pbnRpbmcgXGVtcGh7YmV0d2Vlbn0gY2hhcmFjdGVycywgd2l0aCB0aGUgbGVmdCBlZGdlIG9mIHRoZSBmaXJzdApjaGFyYWN0ZXIgbnVtYmVyZWQgMC4gIFRoZW4gdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIGEKc3RyaW5nIG9mIFx2YXJ7bn0gY2hhcmFjdGVycyBoYXMgaW5kZXggXHZhcntufSwgZm9yIGV4YW1wbGU6CgpcYmVnaW57dmVyYmF0aW19CiArLS0tKy0tLSstLS0rLS0tKy0tLSsgCiB8IEggfCBlIHwgbCB8IHAgfCBBIHwKICstLS0rLS0tKy0tLSstLS0rLS0tKyAKIDAgICAxICAgMiAgIDMgICA0ICAgNSAKLTUgIC00ICAtMyAgLTIgIC0xClxlbmR7dmVyYmF0aW19CgpUaGUgZmlyc3Qgcm93IG9mIG51bWJlcnMgZ2l2ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBpbmRpY2VzIDAuLi41IGluCnRoZSBzdHJpbmc7IHRoZSBzZWNvbmQgcm93IGdpdmVzIHRoZSBjb3JyZXNwb25kaW5nIG5lZ2F0aXZlIGluZGljZXMuClRoZSBzbGljZSBmcm9tIFx2YXJ7aX0gdG8gXHZhcntqfSBjb25zaXN0cyBvZiBhbGwgY2hhcmFjdGVycyBiZXR3ZWVuCnRoZSBlZGdlcyBsYWJlbGVkIFx2YXJ7aX0gYW5kIFx2YXJ7an0sIHJlc3BlY3RpdmVseS4KCkZvciBub24tbmVnYXRpdmUgaW5kaWNlcywgdGhlIGxlbmd0aCBvZiBhIHNsaWNlIGlzIHRoZSBkaWZmZXJlbmNlIG9mCnRoZSBpbmRpY2VzLCBpZiBib3RoIGFyZSB3aXRoaW4gYm91bmRzLiAgRm9yIGV4YW1wbGUsIHRoZSBsZW5ndGggb2YKXGNvZGV7d29yZFsxOjNdfSBpcyAyLgoKVGhlIGJ1aWx0LWluIGZ1bmN0aW9uIFxmdW5jdGlvbntsZW4oKX0gcmV0dXJucyB0aGUgbGVuZ3RoIG9mIGEgc3RyaW5nOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gcyA9ICdzdXBlcmNhbGlmcmFnaWxpc3RpY2V4cGlhbGlkb2Npb3VzJwo+Pj4gbGVuKHMpCjM0ClxlbmR7dmVyYmF0aW19CgoKXGJlZ2lue3NlZWFsc299CiAgXHNlZXRpdGxlWy4uL2xpYi90eXBlc3NlcS5odG1sXXtTZXF1ZW5jZSBUeXBlc30lCiAgICAgICAgICAge1N0cmluZ3MsIGFuZCB0aGUgVW5pY29kZSBzdHJpbmdzIGRlc2NyaWJlZCBpbiB0aGUgbmV4dAogICAgICAgICAgICBzZWN0aW9uLCBhcmUgZXhhbXBsZXMgb2YgXGVtcGh7c2VxdWVuY2UgdHlwZXN9LCBhbmQKICAgICAgICAgICAgc3VwcG9ydCB0aGUgY29tbW9uIG9wZXJhdGlvbnMgc3VwcG9ydGVkIGJ5IHN1Y2ggdHlwZXMufQogIFxzZWV0aXRsZVsuLi9saWIvc3RyaW5nLW1ldGhvZHMuaHRtbF17U3RyaW5nIE1ldGhvZHN9JQogICAgICAgICAgIHtCb3RoIHN0cmluZ3MgYW5kIFVuaWNvZGUgc3RyaW5ncyBzdXBwb3J0IGEgbGFyZ2UgbnVtYmVyIG9mCiAgICAgICAgICAgIG1ldGhvZHMgZm9yIGJhc2ljIHRyYW5zZm9ybWF0aW9ucyBhbmQgc2VhcmNoaW5nLn0KICBcc2VldGl0bGVbLi4vbGliL3R5cGVzc2VxLXN0cmluZ3MuaHRtbF17U3RyaW5nIEZvcm1hdHRpbmcgT3BlcmF0aW9uc30lCiAgICAgICAgICAge1RoZSBmb3JtYXR0aW5nIG9wZXJhdGlvbnMgaW52b2tlZCB3aGVuIHN0cmluZ3MgYW5kIFVuaWNvZGUKICAgICAgICAgICAgc3RyaW5ncyBhcmUgdGhlIGxlZnQgb3BlcmFuZCBvZiB0aGUgXGNvZGV7XCV9IG9wZXJhdG9yIGFyZQogICAgICAgICAgICBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaGVyZS59ClxlbmR7c2VlYWxzb30KCgpcc3Vic2VjdGlvbntVbmljb2RlIFN0cmluZ3MgXGxhYmVse3VuaWNvZGVTdHJpbmdzfX0KXHNlY3Rpb25hdXRob3J7TWFyYy1BbmRyZSBMZW1idXJnfXttYWxAbGVtYnVyZy5jb219CgpTdGFydGluZyB3aXRoIFB5dGhvbiAyLjAgYSBuZXcgZGF0YSB0eXBlIGZvciBzdG9yaW5nIHRleHQgZGF0YSBpcwphdmFpbGFibGUgdG8gdGhlIHByb2dyYW1tZXI6IHRoZSBVbmljb2RlIG9iamVjdC4gSXQgY2FuIGJlIHVzZWQgdG8Kc3RvcmUgYW5kIG1hbmlwdWxhdGUgVW5pY29kZSBkYXRhIChzZWUgXHVybHtodHRwOi8vd3d3LnVuaWNvZGUub3JnL30pCmFuZCBpbnRlZ3JhdGVzIHdlbGwgd2l0aCB0aGUgZXhpc3Rpbmcgc3RyaW5nIG9iamVjdHMgcHJvdmlkaW5nCmF1dG8tY29udmVyc2lvbnMgd2hlcmUgbmVjZXNzYXJ5LgoKVW5pY29kZSBoYXMgdGhlIGFkdmFudGFnZSBvZiBwcm92aWRpbmcgb25lIG9yZGluYWwgZm9yIGV2ZXJ5IGNoYXJhY3RlcgppbiBldmVyeSBzY3JpcHQgdXNlZCBpbiBtb2Rlcm4gYW5kIGFuY2llbnQgdGV4dHMuIFByZXZpb3VzbHksIHRoZXJlCndlcmUgb25seSAyNTYgcG9zc2libGUgb3JkaW5hbHMgZm9yIHNjcmlwdCBjaGFyYWN0ZXJzIGFuZCB0ZXh0cyB3ZXJlCnR5cGljYWxseSBib3VuZCB0byBhIGNvZGUgcGFnZSB3aGljaCBtYXBwZWQgdGhlIG9yZGluYWxzIHRvIHNjcmlwdApjaGFyYWN0ZXJzLiBUaGlzIGxlYWQgdG8gdmVyeSBtdWNoIGNvbmZ1c2lvbiBlc3BlY2lhbGx5IHdpdGggcmVzcGVjdAp0byBpbnRlcm5hdGlvbmFsaXphdGlvbiAodXN1YWxseSB3cml0dGVuIGFzIFxzYW1we2kxOG59IC0tLQpcY2hhcmFjdGVye2l9ICsgMTggY2hhcmFjdGVycyArIFxjaGFyYWN0ZXJ7bn0pIG9mIHNvZnR3YXJlLiAgVW5pY29kZQpzb2x2ZXMgdGhlc2UgcHJvYmxlbXMgYnkgZGVmaW5pbmcgb25lIGNvZGUgcGFnZSBmb3IgYWxsIHNjcmlwdHMuCgpDcmVhdGluZyBVbmljb2RlIHN0cmluZ3MgaW4gUHl0aG9uIGlzIGp1c3QgYXMgc2ltcGxlIGFzIGNyZWF0aW5nCm5vcm1hbCBzdHJpbmdzOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gdSdIZWxsbyBXb3JsZCAhJwp1J0hlbGxvIFdvcmxkICEnClxlbmR7dmVyYmF0aW19CgpUaGUgc21hbGwgXGNoYXJhY3Rlcnt1fSBpbiBmcm9udCBvZiB0aGUgcXVvdGUgaW5kaWNhdGVzIHRoYXQgYW4KVW5pY29kZSBzdHJpbmcgaXMgc3VwcG9zZWQgdG8gYmUgY3JlYXRlZC4gSWYgeW91IHdhbnQgdG8gaW5jbHVkZQpzcGVjaWFsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZywgeW91IGNhbiBkbyBzbyBieSB1c2luZyB0aGUgUHl0aG9uClxlbXBoe1VuaWNvZGUtRXNjYXBlfSBlbmNvZGluZy4gVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdzoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHUnSGVsbG9cdTAwMjBXb3JsZCAhJwp1J0hlbGxvIFdvcmxkICEnClxlbmR7dmVyYmF0aW19CgpUaGUgZXNjYXBlIHNlcXVlbmNlIFxjb2Rle1xlIHUwMDIwfSBpbmRpY2F0ZXMgdG8gaW5zZXJ0IHRoZSBVbmljb2RlCmNoYXJhY3RlciB3aXRoIHRoZSBvcmRpbmFsIHZhbHVlIDB4MDAyMCAodGhlIHNwYWNlIGNoYXJhY3RlcikgYXQgdGhlCmdpdmVuIHBvc2l0aW9uLgoKT3RoZXIgY2hhcmFjdGVycyBhcmUgaW50ZXJwcmV0ZWQgYnkgdXNpbmcgdGhlaXIgcmVzcGVjdGl2ZSBvcmRpbmFsCnZhbHVlcyBkaXJlY3RseSBhcyBVbmljb2RlIG9yZGluYWxzLiAgSWYgeW91IGhhdmUgbGl0ZXJhbCBzdHJpbmdzCmluIHRoZSBzdGFuZGFyZCBMYXRpbi0xIGVuY29kaW5nIHRoYXQgaXMgdXNlZCBpbiBtYW55IFdlc3Rlcm4gY291bnRyaWVzLAp5b3Ugd2lsbCBmaW5kIGl0IGNvbnZlbmllbnQgdGhhdCB0aGUgbG93ZXIgMjU2IGNoYXJhY3RlcnMKb2YgVW5pY29kZSBhcmUgdGhlIHNhbWUgYXMgdGhlIDI1NiBjaGFyYWN0ZXJzIG9mIExhdGluLTEuCgpGb3IgZXhwZXJ0cywgdGhlcmUgaXMgYWxzbyBhIHJhdyBtb2RlIGp1c3QgbGlrZSB0aGUgb25lIGZvciBub3JtYWwKc3RyaW5ncy4gWW91IGhhdmUgdG8gcHJlZml4IHRoZSBvcGVuaW5nIHF1b3RlIHdpdGggJ3VyJyB0byBoYXZlClB5dGhvbiB1c2UgdGhlIFxlbXBoe1Jhdy1Vbmljb2RlLUVzY2FwZX0gZW5jb2RpbmcuIEl0IHdpbGwgb25seSBhcHBseQp0aGUgYWJvdmUgXGNvZGV7XGUgdVhYWFh9IGNvbnZlcnNpb24gaWYgdGhlcmUgaXMgYW4gdW5ldmVuIG51bWJlciBvZgpiYWNrc2xhc2hlcyBpbiBmcm9udCBvZiB0aGUgc21hbGwgJ3UnLgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gdXInSGVsbG9cdTAwMjBXb3JsZCAhJwp1J0hlbGxvIFdvcmxkICEnCj4+PiB1cidIZWxsb1xcdTAwMjBXb3JsZCAhJwp1J0hlbGxvXFxcXHUwMDIwV29ybGQgIScKXGVuZHt2ZXJiYXRpbX0KClRoZSByYXcgbW9kZSBpcyBtb3N0IHVzZWZ1bCB3aGVuIHlvdSBoYXZlIHRvIGVudGVyIGxvdHMgb2YKYmFja3NsYXNoZXMsIGFzIGNhbiBiZSBuZWNlc3NhcnkgaW4gcmVndWxhciBleHByZXNzaW9ucy4KCkFwYXJ0IGZyb20gdGhlc2Ugc3RhbmRhcmQgZW5jb2RpbmdzLCBQeXRob24gcHJvdmlkZXMgYSB3aG9sZSBzZXQgb2YKb3RoZXIgd2F5cyBvZiBjcmVhdGluZyBVbmljb2RlIHN0cmluZ3Mgb24gdGhlIGJhc2lzIG9mIGEga25vd24KZW5jb2RpbmcuIAoKVGhlIGJ1aWx0LWluIGZ1bmN0aW9uIFxmdW5jdGlvbnt1bmljb2RlKCl9XGJpZnVuY2luZGV4e3VuaWNvZGV9IHByb3ZpZGVzCmFjY2VzcyB0byBhbGwgcmVnaXN0ZXJlZCBVbmljb2RlIGNvZGVjcyAoQ09kZXJzIGFuZCBERUNvZGVycykuIFNvbWUgb2YKdGhlIG1vcmUgd2VsbCBrbm93biBlbmNvZGluZ3Mgd2hpY2ggdGhlc2UgY29kZWNzIGNhbiBjb252ZXJ0IGFyZQpcZW1waHtMYXRpbi0xfSwgXGVtcGh7QVNDSUl9LCBcZW1waHtVVEYtOH0sIGFuZCBcZW1waHtVVEYtMTZ9LgpUaGUgbGF0dGVyIHR3byBhcmUgdmFyaWFibGUtbGVuZ3RoIGVuY29kaW5ncyB0aGF0IHN0b3JlIGVhY2ggVW5pY29kZQpjaGFyYWN0ZXIgaW4gb25lIG9yIG1vcmUgYnl0ZXMuIFRoZSBkZWZhdWx0IGVuY29kaW5nIGlzCm5vcm1hbGx5IHNldCB0byBcQVNDSUksIHdoaWNoIHBhc3NlcyB0aHJvdWdoIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlCjAgdG8gMTI3IGFuZCByZWplY3RzIGFueSBvdGhlciBjaGFyYWN0ZXJzIHdpdGggYW4gZXJyb3IuCldoZW4gYSBVbmljb2RlIHN0cmluZyBpcyBwcmludGVkLCB3cml0dGVuIHRvIGEgZmlsZSwgb3IgY29udmVydGVkCndpdGggXGZ1bmN0aW9ue3N0cigpfSwgY29udmVyc2lvbiB0YWtlcyBwbGFjZSB1c2luZyB0aGlzIGRlZmF1bHQgZW5jb2RpbmcuCgpcYmVnaW57dmVyYmF0aW19Cj4+PiB1ImFiYyIKdSdhYmMnCj4+PiBzdHIodSJhYmMiKQonYWJjJwo+Pj4gdSLk9vwiCnUnXHhlNFx4ZjZceGZjJwo+Pj4gc3RyKHUi5Pb8IikKVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KVW5pY29kZUVuY29kZUVycm9yOiAnYXNjaWknIGNvZGVjIGNhbid0IGVuY29kZSBjaGFyYWN0ZXJzIGluIHBvc2l0aW9uIDAtMjogb3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KQpcZW5ke3ZlcmJhdGltfQoKVG8gY29udmVydCBhIFVuaWNvZGUgc3RyaW5nIGludG8gYW4gOC1iaXQgc3RyaW5nIHVzaW5nIGEgc3BlY2lmaWMKZW5jb2RpbmcsIFVuaWNvZGUgb2JqZWN0cyBwcm92aWRlIGFuIFxmdW5jdGlvbntlbmNvZGUoKX0gbWV0aG9kCnRoYXQgdGFrZXMgb25lIGFyZ3VtZW50LCB0aGUgbmFtZSBvZiB0aGUgZW5jb2RpbmcuICBMb3dlcmNhc2UgbmFtZXMKZm9yIGVuY29kaW5ncyBhcmUgcHJlZmVycmVkLgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gdSLk9vwiLmVuY29kZSgndXRmLTgnKQonXHhjM1x4YTRceGMzXHhiNlx4YzNceGJjJwpcZW5ke3ZlcmJhdGltfQoKSWYgeW91IGhhdmUgZGF0YSBpbiBhIHNwZWNpZmljIGVuY29kaW5nIGFuZCB3YW50IHRvIHByb2R1Y2UgYQpjb3JyZXNwb25kaW5nIFVuaWNvZGUgc3RyaW5nIGZyb20gaXQsIHlvdSBjYW4gdXNlIHRoZQpcZnVuY3Rpb257dW5pY29kZSgpfSBmdW5jdGlvbiB3aXRoIHRoZSBlbmNvZGluZyBuYW1lIGFzIHRoZSBzZWNvbmQKYXJndW1lbnQuCgpcYmVnaW57dmVyYmF0aW19Cj4+PiB1bmljb2RlKCdceGMzXHhhNFx4YzNceGI2XHhjM1x4YmMnLCAndXRmLTgnKQp1J1x4ZTRceGY2XHhmYycKXGVuZHt2ZXJiYXRpbX0KClxzdWJzZWN0aW9ue0xpc3RzIFxsYWJlbHtsaXN0c319CgpQeXRob24ga25vd3MgYSBudW1iZXIgb2YgXGVtcGh7Y29tcG91bmR9IGRhdGEgdHlwZXMsIHVzZWQgdG8gZ3JvdXAKdG9nZXRoZXIgb3RoZXIgdmFsdWVzLiAgVGhlIG1vc3QgdmVyc2F0aWxlIGlzIHRoZSBcZW1waHtsaXN0fSwgd2hpY2gKY2FuIGJlIHdyaXR0ZW4gYXMgYSBsaXN0IG9mIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZXMgKGl0ZW1zKSBiZXR3ZWVuCnNxdWFyZSBicmFja2V0cy4gIExpc3QgaXRlbXMgbmVlZCBub3QgYWxsIGhhdmUgdGhlIHNhbWUgdHlwZS4KClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGEgPSBbJ3NwYW0nLCAnZWdncycsIDEwMCwgMTIzNF0KPj4+IGEKWydzcGFtJywgJ2VnZ3MnLCAxMDAsIDEyMzRdClxlbmR7dmVyYmF0aW19CgpMaWtlIHN0cmluZyBpbmRpY2VzLCBsaXN0IGluZGljZXMgc3RhcnQgYXQgMCwgYW5kIGxpc3RzIGNhbiBiZSBzbGljZWQsCmNvbmNhdGVuYXRlZCBhbmQgc28gb246CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBhWzBdCidzcGFtJwo+Pj4gYVszXQoxMjM0Cj4+PiBhWy0yXQoxMDAKPj4+IGFbMTotMV0KWydlZ2dzJywgMTAwXQo+Pj4gYVs6Ml0gKyBbJ2JhY29uJywgMioyXQpbJ3NwYW0nLCAnZWdncycsICdiYWNvbicsIDRdCj4+PiAzKmFbOjNdICsgWydCb2UhJ10KWydzcGFtJywgJ2VnZ3MnLCAxMDAsICdzcGFtJywgJ2VnZ3MnLCAxMDAsICdzcGFtJywgJ2VnZ3MnLCAxMDAsICdCb2UhJ10KXGVuZHt2ZXJiYXRpbX0KClVubGlrZSBzdHJpbmdzLCB3aGljaCBhcmUgXGVtcGh7aW1tdXRhYmxlfSwgaXQgaXMgcG9zc2libGUgdG8gY2hhbmdlCmluZGl2aWR1YWwgZWxlbWVudHMgb2YgYSBsaXN0OgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gYQpbJ3NwYW0nLCAnZWdncycsIDEwMCwgMTIzNF0KPj4+IGFbMl0gPSBhWzJdICsgMjMKPj4+IGEKWydzcGFtJywgJ2VnZ3MnLCAxMjMsIDEyMzRdClxlbmR7dmVyYmF0aW19CgpBc3NpZ25tZW50IHRvIHNsaWNlcyBpcyBhbHNvIHBvc3NpYmxlLCBhbmQgdGhpcyBjYW4gZXZlbiBjaGFuZ2UgdGhlIHNpemUKb2YgdGhlIGxpc3Q6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiAjIFJlcGxhY2Ugc29tZSBpdGVtczoKLi4uIGFbMDoyXSA9IFsxLCAxMl0KPj4+IGEKWzEsIDEyLCAxMjMsIDEyMzRdCj4+PiAjIFJlbW92ZSBzb21lOgouLi4gYVswOjJdID0gW10KPj4+IGEKWzEyMywgMTIzNF0KPj4+ICMgSW5zZXJ0IHNvbWU6Ci4uLiBhWzE6MV0gPSBbJ2JsZXRjaCcsICd4eXp6eSddCj4+PiBhClsxMjMsICdibGV0Y2gnLCAneHl6enknLCAxMjM0XQo+Pj4gYVs6MF0gPSBhICAgICAjIEluc2VydCAoYSBjb3B5IG9mKSBpdHNlbGYgYXQgdGhlIGJlZ2lubmluZwo+Pj4gYQpbMTIzLCAnYmxldGNoJywgJ3h5enp5JywgMTIzNCwgMTIzLCAnYmxldGNoJywgJ3h5enp5JywgMTIzNF0KXGVuZHt2ZXJiYXRpbX0KClRoZSBidWlsdC1pbiBmdW5jdGlvbiBcZnVuY3Rpb257bGVuKCl9IGFsc28gYXBwbGllcyB0byBsaXN0czoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGxlbihhKQo4ClxlbmR7dmVyYmF0aW19CgpJdCBpcyBwb3NzaWJsZSB0byBuZXN0IGxpc3RzIChjcmVhdGUgbGlzdHMgY29udGFpbmluZyBvdGhlciBsaXN0cyksCmZvciBleGFtcGxlOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gcSA9IFsyLCAzXQo+Pj4gcCA9IFsxLCBxLCA0XQo+Pj4gbGVuKHApCjMKPj4+IHBbMV0KWzIsIDNdCj4+PiBwWzFdWzBdCjIKPj4+IHBbMV0uYXBwZW5kKCd4dHJhJykgICAgICMgU2VlIHNlY3Rpb24gNS4xCj4+PiBwClsxLCBbMiwgMywgJ3h0cmEnXSwgNF0KPj4+IHEKWzIsIDMsICd4dHJhJ10KXGVuZHt2ZXJiYXRpbX0KCk5vdGUgdGhhdCBpbiB0aGUgbGFzdCBleGFtcGxlLCBcY29kZXtwWzFdfSBhbmQgXGNvZGV7cX0gcmVhbGx5IHJlZmVyIHRvCnRoZSBzYW1lIG9iamVjdCEgIFdlJ2xsIGNvbWUgYmFjayB0byBcZW1waHtvYmplY3Qgc2VtYW50aWNzfSBsYXRlci4KClxzZWN0aW9ue0ZpcnN0IFN0ZXBzIFRvd2FyZHMgUHJvZ3JhbW1pbmcgXGxhYmVse2ZpcnN0U3RlcHN9fQoKT2YgY291cnNlLCB3ZSBjYW4gdXNlIFB5dGhvbiBmb3IgbW9yZSBjb21wbGljYXRlZCB0YXNrcyB0aGFuIGFkZGluZwp0d28gYW5kIHR3byB0b2dldGhlci4gIEZvciBpbnN0YW5jZSwgd2UgY2FuIHdyaXRlIGFuIGluaXRpYWwKc3ViLXNlcXVlbmNlIG9mIHRoZSBcZW1waHtGaWJvbmFjY2l9IHNlcmllcyBhcyBmb2xsb3dzOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gIyBGaWJvbmFjY2kgc2VyaWVzOgouLi4gIyB0aGUgc3VtIG9mIHR3byBlbGVtZW50cyBkZWZpbmVzIHRoZSBuZXh0Ci4uLiBhLCBiID0gMCwgMQo+Pj4gd2hpbGUgYiA8IDEwOgouLi4gICAgICAgcHJpbnQgYgouLi4gICAgICAgYSwgYiA9IGIsIGErYgouLi4gCjEKMQoyCjMKNQo4ClxlbmR7dmVyYmF0aW19CgpUaGlzIGV4YW1wbGUgaW50cm9kdWNlcyBzZXZlcmFsIG5ldyBmZWF0dXJlcy4KClxiZWdpbntpdGVtaXplfQoKXGl0ZW0KVGhlIGZpcnN0IGxpbmUgY29udGFpbnMgYSBcZW1waHttdWx0aXBsZSBhc3NpZ25tZW50fTogdGhlIHZhcmlhYmxlcwpcY29kZXthfSBhbmQgXGNvZGV7Yn0gc2ltdWx0YW5lb3VzbHkgZ2V0IHRoZSBuZXcgdmFsdWVzIDAgYW5kIDEuICBPbiB0aGUKbGFzdCBsaW5lIHRoaXMgaXMgdXNlZCBhZ2FpbiwgZGVtb25zdHJhdGluZyB0aGF0IHRoZSBleHByZXNzaW9ucyBvbgp0aGUgcmlnaHQtaGFuZCBzaWRlIGFyZSBhbGwgZXZhbHVhdGVkIGZpcnN0IGJlZm9yZSBhbnkgb2YgdGhlCmFzc2lnbm1lbnRzIHRha2UgcGxhY2UuICBUaGUgcmlnaHQtaGFuZCBzaWRlIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgCmZyb20gdGhlIGxlZnQgdG8gdGhlIHJpZ2h0LgoKXGl0ZW0KVGhlIFxrZXl3b3Jke3doaWxlfSBsb29wIGV4ZWN1dGVzIGFzIGxvbmcgYXMgdGhlIGNvbmRpdGlvbiAoaGVyZToKXGNvZGV7YiA8IDEwfSkgcmVtYWlucyB0cnVlLiAgSW4gUHl0aG9uLCBsaWtlIGluIEMsIGFueSBub24temVybwppbnRlZ2VyIHZhbHVlIGlzIHRydWU7IHplcm8gaXMgZmFsc2UuICBUaGUgY29uZGl0aW9uIG1heSBhbHNvIGJlIGEKc3RyaW5nIG9yIGxpc3QgdmFsdWUsIGluIGZhY3QgYW55IHNlcXVlbmNlOyBhbnl0aGluZyB3aXRoIGEgbm9uLXplcm8KbGVuZ3RoIGlzIHRydWUsIGVtcHR5IHNlcXVlbmNlcyBhcmUgZmFsc2UuICBUaGUgdGVzdCB1c2VkIGluIHRoZQpleGFtcGxlIGlzIGEgc2ltcGxlIGNvbXBhcmlzb24uICBUaGUgc3RhbmRhcmQgY29tcGFyaXNvbiBvcGVyYXRvcnMgYXJlCndyaXR0ZW4gdGhlIHNhbWUgYXMgaW4gQzogXGNvZGV7PH0gKGxlc3MgdGhhbiksIFxjb2Rlez59IChncmVhdGVyIHRoYW4pLApcY29kZXs9PX0gKGVxdWFsIHRvKSwgXGNvZGV7PD19IChsZXNzIHRoYW4gb3IgZXF1YWwgdG8pLApcY29kZXs+PX0gKGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bykgYW5kIFxjb2RleyE9fSAobm90IGVxdWFsIHRvKS4KClxpdGVtClRoZSBcZW1waHtib2R5fSBvZiB0aGUgbG9vcCBpcyBcZW1waHtpbmRlbnRlZH06IGluZGVudGF0aW9uIGlzIFB5dGhvbidzCndheSBvZiBncm91cGluZyBzdGF0ZW1lbnRzLiAgUHl0aG9uIGRvZXMgbm90ICh5ZXQhKSBwcm92aWRlIGFuCmludGVsbGlnZW50IGlucHV0IGxpbmUgZWRpdGluZyBmYWNpbGl0eSwgc28geW91IGhhdmUgdG8gdHlwZSBhIHRhYiBvcgpzcGFjZShzKSBmb3IgZWFjaCBpbmRlbnRlZCBsaW5lLiAgSW4gcHJhY3RpY2UgeW91IHdpbGwgcHJlcGFyZSBtb3JlCmNvbXBsaWNhdGVkIGlucHV0IGZvciBQeXRob24gd2l0aCBhIHRleHQgZWRpdG9yOyBtb3N0IHRleHQgZWRpdG9ycyBoYXZlCmFuIGF1dG8taW5kZW50IGZhY2lsaXR5LiAgV2hlbiBhIGNvbXBvdW5kIHN0YXRlbWVudCBpcyBlbnRlcmVkCmludGVyYWN0aXZlbHksIGl0IG11c3QgYmUgZm9sbG93ZWQgYnkgYSBibGFuayBsaW5lIHRvIGluZGljYXRlCmNvbXBsZXRpb24gKHNpbmNlIHRoZSBwYXJzZXIgY2Fubm90IGd1ZXNzIHdoZW4geW91IGhhdmUgdHlwZWQgdGhlIGxhc3QKbGluZSkuICBOb3RlIHRoYXQgZWFjaCBsaW5lIHdpdGhpbiBhIGJhc2ljIGJsb2NrIG11c3QgYmUgaW5kZW50ZWQgYnkKdGhlIHNhbWUgYW1vdW50LgoKXGl0ZW0KVGhlIFxrZXl3b3Jke3ByaW50fSBzdGF0ZW1lbnQgd3JpdGVzIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbihzKSBpdCBpcwpnaXZlbi4gIEl0IGRpZmZlcnMgZnJvbSBqdXN0IHdyaXRpbmcgdGhlIGV4cHJlc3Npb24geW91IHdhbnQgdG8gd3JpdGUKKGFzIHdlIGRpZCBlYXJsaWVyIGluIHRoZSBjYWxjdWxhdG9yIGV4YW1wbGVzKSBpbiB0aGUgd2F5IGl0IGhhbmRsZXMKbXVsdGlwbGUgZXhwcmVzc2lvbnMgYW5kIHN0cmluZ3MuICBTdHJpbmdzIGFyZSBwcmludGVkIHdpdGhvdXQgcXVvdGVzLAphbmQgYSBzcGFjZSBpcyBpbnNlcnRlZCBiZXR3ZWVuIGl0ZW1zLCBzbyB5b3UgY2FuIGZvcm1hdCB0aGluZ3MgbmljZWx5LApsaWtlIHRoaXM6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBpID0gMjU2KjI1Ngo+Pj4gcHJpbnQgJ1RoZSB2YWx1ZSBvZiBpIGlzJywgaQpUaGUgdmFsdWUgb2YgaSBpcyA2NTUzNgpcZW5ke3ZlcmJhdGltfQoKQSB0cmFpbGluZyBjb21tYSBhdm9pZHMgdGhlIG5ld2xpbmUgYWZ0ZXIgdGhlIG91dHB1dDoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGEsIGIgPSAwLCAxCj4+PiB3aGlsZSBiIDwgMTAwMDoKLi4uICAgICBwcmludCBiLAouLi4gICAgIGEsIGIgPSBiLCBhK2IKLi4uIAoxIDEgMiAzIDUgOCAxMyAyMSAzNCA1NSA4OSAxNDQgMjMzIDM3NyA2MTAgOTg3ClxlbmR7dmVyYmF0aW19CgpOb3RlIHRoYXQgdGhlIGludGVycHJldGVyIGluc2VydHMgYSBuZXdsaW5lIGJlZm9yZSBpdCBwcmludHMgdGhlIG5leHQKcHJvbXB0IGlmIHRoZSBsYXN0IGxpbmUgd2FzIG5vdCBjb21wbGV0ZWQuCgpcZW5ke2l0ZW1pemV9CgoKXGNoYXB0ZXJ7TW9yZSBDb250cm9sIEZsb3cgVG9vbHMgXGxhYmVse21vcmVDb250cm9sfX0KCkJlc2lkZXMgdGhlIFxrZXl3b3Jke3doaWxlfSBzdGF0ZW1lbnQganVzdCBpbnRyb2R1Y2VkLCBQeXRob24ga25vd3MKdGhlIHVzdWFsIGNvbnRyb2wgZmxvdyBzdGF0ZW1lbnRzIGtub3duIGZyb20gb3RoZXIgbGFuZ3VhZ2VzLCB3aXRoCnNvbWUgdHdpc3RzLgoKXHNlY3Rpb257XGtleXdvcmR7aWZ9IFN0YXRlbWVudHMgXGxhYmVse2lmfX0KClBlcmhhcHMgdGhlIG1vc3Qgd2VsbC1rbm93biBzdGF0ZW1lbnQgdHlwZSBpcyB0aGUKXGtleXdvcmR7aWZ9IHN0YXRlbWVudC4gIEZvciBleGFtcGxlOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4geCA9IGludChyYXdfaW5wdXQoIlBsZWFzZSBlbnRlciBhbiBpbnRlZ2VyOiAiKSkKPj4+IGlmIHggPCAwOgouLi4gICAgICB4ID0gMAouLi4gICAgICBwcmludCAnTmVnYXRpdmUgY2hhbmdlZCB0byB6ZXJvJwouLi4gZWxpZiB4ID09IDA6Ci4uLiAgICAgIHByaW50ICdaZXJvJwouLi4gZWxpZiB4ID09IDE6Ci4uLiAgICAgIHByaW50ICdTaW5nbGUnCi4uLiBlbHNlOgouLi4gICAgICBwcmludCAnTW9yZScKLi4uIApcZW5ke3ZlcmJhdGltfQoKVGhlcmUgY2FuIGJlIHplcm8gb3IgbW9yZSBca2V5d29yZHtlbGlmfSBwYXJ0cywgYW5kIHRoZQpca2V5d29yZHtlbHNlfSBwYXJ0IGlzIG9wdGlvbmFsLiAgVGhlIGtleXdvcmQgYFxrZXl3b3Jke2VsaWZ9JyBpcwpzaG9ydCBmb3IgYGVsc2UgaWYnLCBhbmQgaXMgdXNlZnVsIHRvIGF2b2lkIGV4Y2Vzc2l2ZSBpbmRlbnRhdGlvbi4gIEFuIApca2V5d29yZHtpZn0gXGxkb3RzXCBca2V5d29yZHtlbGlmfSBcbGRvdHNcIFxrZXl3b3Jke2VsaWZ9IFxsZG90c1wgc2VxdWVuY2UKJSAgICBXZWlyZCBzcGFjaW5ncyBoYXBwZW4gaGVyZSBpZiB0aGUgd3JhcHBpbmcgb2YgdGhlIHNvdXJjZSB0ZXh0CiUgICAgZ2V0cyBjaGFuZ2VkIGluIHRoZSB3cm9uZyB3YXkuCmlzIGEgc3Vic3RpdHV0ZSBmb3IgdGhlIFxrZXl3b3Jke3N3aXRjaH0gb3IKXGtleXdvcmR7Y2FzZX0gc3RhdGVtZW50cyBmb3VuZCBpbiBvdGhlciBsYW5ndWFnZXMuCgoKXHNlY3Rpb257XGtleXdvcmR7Zm9yfSBTdGF0ZW1lbnRzIFxsYWJlbHtmb3J9fQoKVGhlIFxrZXl3b3Jke2Zvcn1cc3RpbmRleHtmb3J9IHN0YXRlbWVudCBpbiBQeXRob24gZGlmZmVycyBhIGJpdCBmcm9tCndoYXQgeW91IG1heSBiZSB1c2VkIHRvIGluIEMgb3IgUGFzY2FsLiAgUmF0aGVyIHRoYW4gYWx3YXlzCml0ZXJhdGluZyBvdmVyIGFuIGFyaXRobWV0aWMgcHJvZ3Jlc3Npb24gb2YgbnVtYmVycyAobGlrZSBpbiBQYXNjYWwpLApvciBnaXZpbmcgdGhlIHVzZXIgdGhlIGFiaWxpdHkgdG8gZGVmaW5lIGJvdGggdGhlIGl0ZXJhdGlvbiBzdGVwIGFuZApoYWx0aW5nIGNvbmRpdGlvbiAoYXMgQyksIFB5dGhvbidzClxrZXl3b3Jke2Zvcn1cc3RpbmRleHtmb3J9IHN0YXRlbWVudCBpdGVyYXRlcyBvdmVyIHRoZSBpdGVtcyBvZiBhbnkKc2VxdWVuY2UgKGEgbGlzdCBvciBhIHN0cmluZyksIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgYXBwZWFyIGluCnRoZSBzZXF1ZW5jZS4gIEZvciBleGFtcGxlIChubyBwdW4gaW50ZW5kZWQpOgolIE9uZSBzdWdnZXN0aW9uIHdhcyB0byBnaXZlIGEgcmVhbCBDIGV4YW1wbGUgaGVyZSwgYnV0IHRoYXQgbWF5IG9ubHkKJSBzZXJ2ZSB0byBjb25mdXNlIG5vbi1DIHByb2dyYW1tZXJzLgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gIyBNZWFzdXJlIHNvbWUgc3RyaW5nczoKLi4uIGEgPSBbJ2NhdCcsICd3aW5kb3cnLCAnZGVmZW5lc3RyYXRlJ10KPj4+IGZvciB4IGluIGE6Ci4uLiAgICAgcHJpbnQgeCwgbGVuKHgpCi4uLiAKY2F0IDMKd2luZG93IDYKZGVmZW5lc3RyYXRlIDEyClxlbmR7dmVyYmF0aW19CgpJdCBpcyBub3Qgc2FmZSB0byBtb2RpZnkgdGhlIHNlcXVlbmNlIGJlaW5nIGl0ZXJhdGVkIG92ZXIgaW4gdGhlIGxvb3AKKHRoaXMgY2FuIG9ubHkgaGFwcGVuIGZvciBtdXRhYmxlIHNlcXVlbmNlIHR5cGVzLCBzdWNoIGFzIGxpc3RzKS4gIElmCnlvdSBuZWVkIHRvIG1vZGlmeSB0aGUgbGlzdCB5b3UgYXJlIGl0ZXJhdGluZyBvdmVyIChmb3IgZXhhbXBsZSwgdG8KZHVwbGljYXRlIHNlbGVjdGVkIGl0ZW1zKSB5b3UgbXVzdCBpdGVyYXRlIG92ZXIgYSBjb3B5LiAgVGhlIHNsaWNlCm5vdGF0aW9uIG1ha2VzIHRoaXMgcGFydGljdWxhcmx5IGNvbnZlbmllbnQ6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBmb3IgeCBpbiBhWzpdOiAjIG1ha2UgYSBzbGljZSBjb3B5IG9mIHRoZSBlbnRpcmUgbGlzdAouLi4gICAgaWYgbGVuKHgpID4gNjogYS5pbnNlcnQoMCwgeCkKLi4uIAo+Pj4gYQpbJ2RlZmVuZXN0cmF0ZScsICdjYXQnLCAnd2luZG93JywgJ2RlZmVuZXN0cmF0ZSddClxlbmR7dmVyYmF0aW19CgoKXHNlY3Rpb257VGhlIFxmdW5jdGlvbntyYW5nZSgpfSBGdW5jdGlvbiBcbGFiZWx7cmFuZ2V9fQoKSWYgeW91IGRvIG5lZWQgdG8gaXRlcmF0ZSBvdmVyIGEgc2VxdWVuY2Ugb2YgbnVtYmVycywgdGhlIGJ1aWx0LWluCmZ1bmN0aW9uIFxmdW5jdGlvbntyYW5nZSgpfSBjb21lcyBpbiBoYW5keS4gIEl0IGdlbmVyYXRlcyBsaXN0cwpjb250YWluaW5nIGFyaXRobWV0aWMgcHJvZ3Jlc3Npb25zOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gcmFuZ2UoMTApClswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XQpcZW5ke3ZlcmJhdGltfQoKVGhlIGdpdmVuIGVuZCBwb2ludCBpcyBuZXZlciBwYXJ0IG9mIHRoZSBnZW5lcmF0ZWQgbGlzdDsKXGNvZGV7cmFuZ2UoMTApfSBnZW5lcmF0ZXMgYSBsaXN0IG9mIDEwIHZhbHVlcywgZXhhY3RseSB0aGUgbGVnYWwKaW5kaWNlcyBmb3IgaXRlbXMgb2YgYSBzZXF1ZW5jZSBvZiBsZW5ndGggMTAuICBJdCBpcyBwb3NzaWJsZSB0byBsZXQKdGhlIHJhbmdlIHN0YXJ0IGF0IGFub3RoZXIgbnVtYmVyLCBvciB0byBzcGVjaWZ5IGEgZGlmZmVyZW50IGluY3JlbWVudAooZXZlbiBuZWdhdGl2ZTsgc29tZXRpbWVzIHRoaXMgaXMgY2FsbGVkIHRoZSBgc3RlcCcpOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gcmFuZ2UoNSwgMTApCls1LCA2LCA3LCA4LCA5XQo+Pj4gcmFuZ2UoMCwgMTAsIDMpClswLCAzLCA2LCA5XQo+Pj4gcmFuZ2UoLTEwLCAtMTAwLCAtMzApClstMTAsIC00MCwgLTcwXQpcZW5ke3ZlcmJhdGltfQoKVG8gaXRlcmF0ZSBvdmVyIHRoZSBpbmRpY2VzIG9mIGEgc2VxdWVuY2UsIGNvbWJpbmUKXGZ1bmN0aW9ue3JhbmdlKCl9IGFuZCBcZnVuY3Rpb257bGVuKCl9IGFzIGZvbGxvd3M6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBhID0gWydNYXJ5JywgJ2hhZCcsICdhJywgJ2xpdHRsZScsICdsYW1iJ10KPj4+IGZvciBpIGluIHJhbmdlKGxlbihhKSk6Ci4uLiAgICAgcHJpbnQgaSwgYVtpXQouLi4gCjAgTWFyeQoxIGhhZAoyIGEKMyBsaXR0bGUKNCBsYW1iClxlbmR7dmVyYmF0aW19CgoKXHNlY3Rpb257XGtleXdvcmR7YnJlYWt9IGFuZCBca2V5d29yZHtjb250aW51ZX0gU3RhdGVtZW50cywgYW5kCiAgICAgICAgIFxrZXl3b3Jke2Vsc2V9IENsYXVzZXMgb24gTG9vcHMKICAgICAgICAgXGxhYmVse2JyZWFrfX0KClRoZSBca2V5d29yZHticmVha30gc3RhdGVtZW50LCBsaWtlIGluIEMsIGJyZWFrcyBvdXQgb2YgdGhlIHNtYWxsZXN0CmVuY2xvc2luZyBca2V5d29yZHtmb3J9IG9yIFxrZXl3b3Jke3doaWxlfSBsb29wLgoKVGhlIFxrZXl3b3Jke2NvbnRpbnVlfSBzdGF0ZW1lbnQsIGFsc28gYm9ycm93ZWQgZnJvbSBDLCBjb250aW51ZXMKd2l0aCB0aGUgbmV4dCBpdGVyYXRpb24gb2YgdGhlIGxvb3AuCgpMb29wIHN0YXRlbWVudHMgbWF5IGhhdmUgYW4gXGNvZGV7ZWxzZX0gY2xhdXNlOyBpdCBpcyBleGVjdXRlZCB3aGVuCnRoZSBsb29wIHRlcm1pbmF0ZXMgdGhyb3VnaCBleGhhdXN0aW9uIG9mIHRoZSBsaXN0ICh3aXRoClxrZXl3b3Jke2Zvcn0pIG9yIHdoZW4gdGhlIGNvbmRpdGlvbiBiZWNvbWVzIGZhbHNlICh3aXRoClxrZXl3b3Jke3doaWxlfSksIGJ1dCBub3Qgd2hlbiB0aGUgbG9vcCBpcyB0ZXJtaW5hdGVkIGJ5IGEKXGtleXdvcmR7YnJlYWt9IHN0YXRlbWVudC4gIFRoaXMgaXMgZXhlbXBsaWZpZWQgYnkgdGhlIGZvbGxvd2luZyBsb29wLAp3aGljaCBzZWFyY2hlcyBmb3IgcHJpbWUgbnVtYmVyczoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGZvciBuIGluIHJhbmdlKDIsIDEwKToKLi4uICAgICBmb3IgeCBpbiByYW5nZSgyLCBuKToKLi4uICAgICAgICAgaWYgbiAlIHggPT0gMDoKLi4uICAgICAgICAgICAgIHByaW50IG4sICdlcXVhbHMnLCB4LCAnKicsIG4veAouLi4gICAgICAgICAgICAgYnJlYWsKLi4uICAgICBlbHNlOgouLi4gICAgICAgICAjIGxvb3AgZmVsbCB0aHJvdWdoIHdpdGhvdXQgZmluZGluZyBhIGZhY3RvcgouLi4gICAgICAgICBwcmludCBuLCAnaXMgYSBwcmltZSBudW1iZXInCi4uLiAKMiBpcyBhIHByaW1lIG51bWJlcgozIGlzIGEgcHJpbWUgbnVtYmVyCjQgZXF1YWxzIDIgKiAyCjUgaXMgYSBwcmltZSBudW1iZXIKNiBlcXVhbHMgMiAqIDMKNyBpcyBhIHByaW1lIG51bWJlcgo4IGVxdWFscyAyICogNAo5IGVxdWFscyAzICogMwpcZW5ke3ZlcmJhdGltfQoKClxzZWN0aW9ue1xrZXl3b3Jke3Bhc3N9IFN0YXRlbWVudHMgXGxhYmVse3Bhc3N9fQoKVGhlIFxrZXl3b3Jke3Bhc3N9IHN0YXRlbWVudCBkb2VzIG5vdGhpbmcuCkl0IGNhbiBiZSB1c2VkIHdoZW4gYSBzdGF0ZW1lbnQgaXMgcmVxdWlyZWQgc3ludGFjdGljYWxseSBidXQgdGhlCnByb2dyYW0gcmVxdWlyZXMgbm8gYWN0aW9uLgpGb3IgZXhhbXBsZToKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHdoaWxlIFRydWU6Ci4uLiAgICAgICBwYXNzICMgQnVzeS13YWl0IGZvciBrZXlib2FyZCBpbnRlcnJ1cHQKLi4uIApcZW5ke3ZlcmJhdGltfQoKClxzZWN0aW9ue0RlZmluaW5nIEZ1bmN0aW9ucyBcbGFiZWx7ZnVuY3Rpb25zfX0KCldlIGNhbiBjcmVhdGUgYSBmdW5jdGlvbiB0aGF0IHdyaXRlcyB0aGUgRmlib25hY2NpIHNlcmllcyB0byBhbgphcmJpdHJhcnkgYm91bmRhcnk6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBkZWYgZmliKG4pOiAgICAjIHdyaXRlIEZpYm9uYWNjaSBzZXJpZXMgdXAgdG8gbgouLi4gICAgICIiIlByaW50IGEgRmlib25hY2NpIHNlcmllcyB1cCB0byBuLiIiIgouLi4gICAgIGEsIGIgPSAwLCAxCi4uLiAgICAgd2hpbGUgYiA8IG46Ci4uLiAgICAgICAgIHByaW50IGIsCi4uLiAgICAgICAgIGEsIGIgPSBiLCBhK2IKLi4uIAo+Pj4gIyBOb3cgY2FsbCB0aGUgZnVuY3Rpb24gd2UganVzdCBkZWZpbmVkOgouLi4gZmliKDIwMDApCjEgMSAyIDMgNSA4IDEzIDIxIDM0IDU1IDg5IDE0NCAyMzMgMzc3IDYxMCA5ODcgMTU5NwpcZW5ke3ZlcmJhdGltfQoKVGhlIGtleXdvcmQgXGtleXdvcmR7ZGVmfSBpbnRyb2R1Y2VzIGEgZnVuY3Rpb24gXGVtcGh7ZGVmaW5pdGlvbn0uICBJdAptdXN0IGJlIGZvbGxvd2VkIGJ5IHRoZSBmdW5jdGlvbiBuYW1lIGFuZCB0aGUgcGFyZW50aGVzaXplZCBsaXN0IG9mCmZvcm1hbCBwYXJhbWV0ZXJzLiAgVGhlIHN0YXRlbWVudHMgdGhhdCBmb3JtIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbgpzdGFydCBhdCB0aGUgbmV4dCBsaW5lLCBhbmQgbXVzdCBiZSBpbmRlbnRlZC4gIFRoZSBmaXJzdCBzdGF0ZW1lbnQgb2YKdGhlIGZ1bmN0aW9uIGJvZHkgY2FuIG9wdGlvbmFsbHkgYmUgYSBzdHJpbmcgbGl0ZXJhbDsgdGhpcyBzdHJpbmcKbGl0ZXJhbCBpcyB0aGUgZnVuY3Rpb24ncyBcaW5kZXh7ZG9jdW1lbnRhdGlvbiBzdHJpbmdzfWRvY3VtZW50YXRpb24Kc3RyaW5nLCBvciBcZGZue2RvY3N0cmluZ30uXGluZGV4e2RvY3N0cmluZ3N9XGluZGV4e3N0cmluZ3MsIGRvY3VtZW50YXRpb259CgpUaGVyZSBhcmUgdG9vbHMgd2hpY2ggdXNlIGRvY3N0cmluZ3MgdG8gYXV0b21hdGljYWxseSBwcm9kdWNlIG9ubGluZQpvciBwcmludGVkIGRvY3VtZW50YXRpb24sIG9yIHRvIGxldCB0aGUgdXNlciBpbnRlcmFjdGl2ZWx5IGJyb3dzZQp0aHJvdWdoIGNvZGU7IGl0J3MgZ29vZCBwcmFjdGljZSB0byBpbmNsdWRlIGRvY3N0cmluZ3MgaW4gY29kZSB0aGF0CnlvdSB3cml0ZSwgc28gdHJ5IHRvIG1ha2UgYSBoYWJpdCBvZiBpdC4KClRoZSBcZW1waHtleGVjdXRpb259IG9mIGEgZnVuY3Rpb24gaW50cm9kdWNlcyBhIG5ldyBzeW1ib2wgdGFibGUgdXNlZApmb3IgdGhlIGxvY2FsIHZhcmlhYmxlcyBvZiB0aGUgZnVuY3Rpb24uICBNb3JlIHByZWNpc2VseSwgYWxsIHZhcmlhYmxlCmFzc2lnbm1lbnRzIGluIGEgZnVuY3Rpb24gc3RvcmUgdGhlIHZhbHVlIGluIHRoZSBsb2NhbCBzeW1ib2wgdGFibGU7CndoZXJlYXMgdmFyaWFibGUgcmVmZXJlbmNlcyBmaXJzdCBsb29rIGluIHRoZSBsb2NhbCBzeW1ib2wgdGFibGUsIHRoZW4KaW4gdGhlIGdsb2JhbCBzeW1ib2wgdGFibGUsIGFuZCB0aGVuIGluIHRoZSB0YWJsZSBvZiBidWlsdC1pbiBuYW1lcy4KVGh1cywgIGdsb2JhbCB2YXJpYWJsZXMgY2Fubm90IGJlIGRpcmVjdGx5IGFzc2lnbmVkIGEgdmFsdWUgd2l0aGluIGEKZnVuY3Rpb24gKHVubGVzcyBuYW1lZCBpbiBhIFxrZXl3b3Jke2dsb2JhbH0gc3RhdGVtZW50KSwgYWx0aG91Z2gKdGhleSBtYXkgYmUgcmVmZXJlbmNlZC4KClRoZSBhY3R1YWwgcGFyYW1ldGVycyAoYXJndW1lbnRzKSB0byBhIGZ1bmN0aW9uIGNhbGwgYXJlIGludHJvZHVjZWQgaW4KdGhlIGxvY2FsIHN5bWJvbCB0YWJsZSBvZiB0aGUgY2FsbGVkIGZ1bmN0aW9uIHdoZW4gaXQgaXMgY2FsbGVkOyB0aHVzLAphcmd1bWVudHMgYXJlIHBhc3NlZCB1c2luZyBcZW1waHtjYWxsIGJ5IHZhbHVlfSAod2hlcmUgdGhlClxlbXBoe3ZhbHVlfSBpcyBhbHdheXMgYW4gb2JqZWN0IFxlbXBoe3JlZmVyZW5jZX0sIG5vdCB0aGUgdmFsdWUgb2YKdGhlIG9iamVjdCkuXGZvb3Rub3RlewogICAgICAgICBBY3R1YWxseSwgXGVtcGh7Y2FsbCBieSBvYmplY3QgcmVmZXJlbmNlfSB3b3VsZCBiZSBhIGJldHRlcgogICAgICAgICBkZXNjcmlwdGlvbiwgc2luY2UgaWYgYSBtdXRhYmxlIG9iamVjdCBpcyBwYXNzZWQsIHRoZSBjYWxsZXIKICAgICAgICAgd2lsbCBzZWUgYW55IGNoYW5nZXMgdGhlIGNhbGxlZSBtYWtlcyB0byBpdCAoaXRlbXMKICAgICAgICAgaW5zZXJ0ZWQgaW50byBhIGxpc3QpLgp9IFdoZW4gYSBmdW5jdGlvbiBjYWxscyBhbm90aGVyIGZ1bmN0aW9uLCBhIG5ldyBsb2NhbCBzeW1ib2wgdGFibGUgaXMKY3JlYXRlZCBmb3IgdGhhdCBjYWxsLgoKQSBmdW5jdGlvbiBkZWZpbml0aW9uIGludHJvZHVjZXMgdGhlIGZ1bmN0aW9uIG5hbWUgaW4gdGhlIGN1cnJlbnQKc3ltYm9sIHRhYmxlLiAgVGhlIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiBuYW1lCmhhcyBhIHR5cGUgdGhhdCBpcyByZWNvZ25pemVkIGJ5IHRoZSBpbnRlcnByZXRlciBhcyBhIHVzZXItZGVmaW5lZApmdW5jdGlvbi4gIFRoaXMgdmFsdWUgY2FuIGJlIGFzc2lnbmVkIHRvIGFub3RoZXIgbmFtZSB3aGljaCBjYW4gdGhlbgphbHNvIGJlIHVzZWQgYXMgYSBmdW5jdGlvbi4gIFRoaXMgc2VydmVzIGFzIGEgZ2VuZXJhbCByZW5hbWluZwptZWNoYW5pc206CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBmaWIKPGZ1bmN0aW9uIGZpYiBhdCAxMDA0MmVkMD4KPj4+IGYgPSBmaWIKPj4+IGYoMTAwKQoxIDEgMiAzIDUgOCAxMyAyMSAzNCA1NSA4OQpcZW5ke3ZlcmJhdGltfQoKWW91IG1pZ2h0IG9iamVjdCB0aGF0IFxjb2Rle2ZpYn0gaXMgbm90IGEgZnVuY3Rpb24gYnV0IGEgcHJvY2VkdXJlLiAgSW4KUHl0aG9uLCBsaWtlIGluIEMsIHByb2NlZHVyZXMgYXJlIGp1c3QgZnVuY3Rpb25zIHRoYXQgZG9uJ3QgcmV0dXJuIGEKdmFsdWUuICBJbiBmYWN0LCB0ZWNobmljYWxseSBzcGVha2luZywgcHJvY2VkdXJlcyBkbyByZXR1cm4gYSB2YWx1ZSwKYWxiZWl0IGEgcmF0aGVyIGJvcmluZyBvbmUuICBUaGlzIHZhbHVlIGlzIGNhbGxlZCBcY29kZXtOb25lfSAoaXQncyBhCmJ1aWx0LWluIG5hbWUpLiAgV3JpdGluZyB0aGUgdmFsdWUgXGNvZGV7Tm9uZX0gaXMgbm9ybWFsbHkgc3VwcHJlc3NlZCBieQp0aGUgaW50ZXJwcmV0ZXIgaWYgaXQgd291bGQgYmUgdGhlIG9ubHkgdmFsdWUgd3JpdHRlbi4gIFlvdSBjYW4gc2VlIGl0CmlmIHlvdSByZWFsbHkgd2FudCB0bzoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHByaW50IGZpYigwKQpOb25lClxlbmR7dmVyYmF0aW19CgpJdCBpcyBzaW1wbGUgdG8gd3JpdGUgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBsaXN0IG9mIHRoZSBudW1iZXJzIG9mCnRoZSBGaWJvbmFjY2kgc2VyaWVzLCBpbnN0ZWFkIG9mIHByaW50aW5nIGl0OgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gZGVmIGZpYjIobik6ICMgcmV0dXJuIEZpYm9uYWNjaSBzZXJpZXMgdXAgdG8gbgouLi4gICAgICIiIlJldHVybiBhIGxpc3QgY29udGFpbmluZyB0aGUgRmlib25hY2NpIHNlcmllcyB1cCB0byBuLiIiIgouLi4gICAgIHJlc3VsdCA9IFtdCi4uLiAgICAgYSwgYiA9IDAsIDEKLi4uICAgICB3aGlsZSBiIDwgbjoKLi4uICAgICAgICAgcmVzdWx0LmFwcGVuZChiKSAgICAjIHNlZSBiZWxvdwouLi4gICAgICAgICBhLCBiID0gYiwgYStiCi4uLiAgICAgcmV0dXJuIHJlc3VsdAouLi4gCj4+PiBmMTAwID0gZmliMigxMDApICAgICMgY2FsbCBpdAo+Pj4gZjEwMCAgICAgICAgICAgICAgICAjIHdyaXRlIHRoZSByZXN1bHQKWzEsIDEsIDIsIDMsIDUsIDgsIDEzLCAyMSwgMzQsIDU1LCA4OV0KXGVuZHt2ZXJiYXRpbX0KClRoaXMgZXhhbXBsZSwgYXMgdXN1YWwsIGRlbW9uc3RyYXRlcyBzb21lIG5ldyBQeXRob24gZmVhdHVyZXM6CgpcYmVnaW57aXRlbWl6ZX0KClxpdGVtClRoZSBca2V5d29yZHtyZXR1cm59IHN0YXRlbWVudCByZXR1cm5zIHdpdGggYSB2YWx1ZSBmcm9tIGEgZnVuY3Rpb24uClxrZXl3b3Jke3JldHVybn0gd2l0aG91dCBhbiBleHByZXNzaW9uIGFyZ3VtZW50IHJldHVybnMgXGNvZGV7Tm9uZX0uCkZhbGxpbmcgb2ZmIHRoZSBlbmQgb2YgYSBwcm9jZWR1cmUgYWxzbyByZXR1cm5zIFxjb2Rle05vbmV9LgoKXGl0ZW0KVGhlIHN0YXRlbWVudCBcY29kZXtyZXN1bHQuYXBwZW5kKGIpfSBjYWxscyBhIFxlbXBoe21ldGhvZH0gb2YgdGhlIGxpc3QKb2JqZWN0IFxjb2Rle3Jlc3VsdH0uICBBIG1ldGhvZCBpcyBhIGZ1bmN0aW9uIHRoYXQgYGJlbG9uZ3MnIHRvIGFuCm9iamVjdCBhbmQgaXMgbmFtZWQgXGNvZGV7b2JqLm1ldGhvZG5hbWV9LCB3aGVyZSBcY29kZXtvYmp9IGlzIHNvbWUKb2JqZWN0ICh0aGlzIG1heSBiZSBhbiBleHByZXNzaW9uKSwgYW5kIFxjb2Rle21ldGhvZG5hbWV9IGlzIHRoZSBuYW1lCm9mIGEgbWV0aG9kIHRoYXQgaXMgZGVmaW5lZCBieSB0aGUgb2JqZWN0J3MgdHlwZS4gIERpZmZlcmVudCB0eXBlcwpkZWZpbmUgZGlmZmVyZW50IG1ldGhvZHMuICBNZXRob2RzIG9mIGRpZmZlcmVudCB0eXBlcyBtYXkgaGF2ZSB0aGUKc2FtZSBuYW1lIHdpdGhvdXQgY2F1c2luZyBhbWJpZ3VpdHkuICAoSXQgaXMgcG9zc2libGUgdG8gZGVmaW5lIHlvdXIKb3duIG9iamVjdCB0eXBlcyBhbmQgbWV0aG9kcywgdXNpbmcgXGVtcGh7Y2xhc3Nlc30sIGFzIGRpc2N1c3NlZCBsYXRlcgppbiB0aGlzIHR1dG9yaWFsLikKVGhlIG1ldGhvZCBcbWV0aG9ke2FwcGVuZCgpfSBzaG93biBpbiB0aGUgZXhhbXBsZSwgaXMgZGVmaW5lZCBmb3IKbGlzdCBvYmplY3RzOyBpdCBhZGRzIGEgbmV3IGVsZW1lbnQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdC4gIEluIHRoaXMKZXhhbXBsZSBpdCBpcyBlcXVpdmFsZW50IHRvIFxzYW1we3Jlc3VsdCA9IHJlc3VsdCArIFtiXX0sIGJ1dCBtb3JlCmVmZmljaWVudC4KClxlbmR7aXRlbWl6ZX0KClxzZWN0aW9ue01vcmUgb24gRGVmaW5pbmcgRnVuY3Rpb25zIFxsYWJlbHtkZWZpbmluZ319CgpJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGRlZmluZSBmdW5jdGlvbnMgd2l0aCBhIHZhcmlhYmxlIG51bWJlciBvZgphcmd1bWVudHMuICBUaGVyZSBhcmUgdGhyZWUgZm9ybXMsIHdoaWNoIGNhbiBiZSBjb21iaW5lZC4KClxzdWJzZWN0aW9ue0RlZmF1bHQgQXJndW1lbnQgVmFsdWVzIFxsYWJlbHtkZWZhdWx0QXJnc319CgpUaGUgbW9zdCB1c2VmdWwgZm9ybSBpcyB0byBzcGVjaWZ5IGEgZGVmYXVsdCB2YWx1ZSBmb3Igb25lIG9yIG1vcmUKYXJndW1lbnRzLiAgVGhpcyBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgY2FsbGVkIHdpdGggZmV3ZXIKYXJndW1lbnRzIHRoYW4gaXQgaXMgZGVmaW5lZCB0byBhbGxvdy4gIEZvciBleGFtcGxlOgoKXGJlZ2lue3ZlcmJhdGltfQpkZWYgYXNrX29rKHByb21wdCwgcmV0cmllcz00LCBjb21wbGFpbnQ9J1llcyBvciBubywgcGxlYXNlIScpOgogICAgd2hpbGUgVHJ1ZToKICAgICAgICBvayA9IHJhd19pbnB1dChwcm9tcHQpCiAgICAgICAgaWYgb2sgaW4gKCd5JywgJ3llJywgJ3llcycpOiByZXR1cm4gVHJ1ZQogICAgICAgIGlmIG9rIGluICgnbicsICdubycsICdub3AnLCAnbm9wZScpOiByZXR1cm4gRmFsc2UKICAgICAgICByZXRyaWVzID0gcmV0cmllcyAtIDEKICAgICAgICBpZiByZXRyaWVzIDwgMDogcmFpc2UgSU9FcnJvciwgJ3JlZnVzZW5payB1c2VyJwogICAgICAgIHByaW50IGNvbXBsYWludApcZW5ke3ZlcmJhdGltfQoKVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGVpdGhlciBsaWtlIHRoaXM6Clxjb2Rle2Fza19vaygnRG8geW91IHJlYWxseSB3YW50IHRvIHF1aXQ/Jyl9IG9yIGxpa2UgdGhpczoKXGNvZGV7YXNrX29rKCdPSyB0byBvdmVyd3JpdGUgdGhlIGZpbGU/JywgMil9LgoKVGhpcyBleGFtcGxlIGFsc28gaW50cm9kdWNlcyB0aGUgXGtleXdvcmR7aW59IGtleXdvcmQuIFRoaXMgdGVzdHMKd2hldGhlciBvciBub3QgYSBzZXF1ZW5jZSBjb250YWlucyBhIGNlcnRhaW4gdmFsdWUuCgpUaGUgZGVmYXVsdCB2YWx1ZXMgYXJlIGV2YWx1YXRlZCBhdCB0aGUgcG9pbnQgb2YgZnVuY3Rpb24gZGVmaW5pdGlvbgppbiB0aGUgXGVtcGh7ZGVmaW5pbmd9IHNjb3BlLCBzbyB0aGF0CgpcYmVnaW57dmVyYmF0aW19CmkgPSA1CgpkZWYgZihhcmc9aSk6CiAgICBwcmludCBhcmcKCmkgPSA2CmYoKQpcZW5ke3ZlcmJhdGltfQoKd2lsbCBwcmludCBcY29kZXs1fS4KClxzdHJvbmd7SW1wb3J0YW50IHdhcm5pbmc6fSAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgZXZhbHVhdGVkIG9ubHkgb25jZS4KVGhpcyBtYWtlcyBhIGRpZmZlcmVuY2Ugd2hlbiB0aGUgZGVmYXVsdCBpcyBhIG11dGFibGUgb2JqZWN0IHN1Y2ggYXMgYQpsaXN0LCBkaWN0aW9uYXJ5LCBvciBpbnN0YW5jZXMgb2YgbW9zdCBjbGFzc2VzLiAgRm9yIGV4YW1wbGUsIHRoZQpmb2xsb3dpbmcgZnVuY3Rpb24gYWNjdW11bGF0ZXMgdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gaXQgb24Kc3Vic2VxdWVudCBjYWxsczoKClxiZWdpbnt2ZXJiYXRpbX0KZGVmIGYoYSwgTD1bXSk6CiAgICBMLmFwcGVuZChhKQogICAgcmV0dXJuIEwKCnByaW50IGYoMSkKcHJpbnQgZigyKQpwcmludCBmKDMpClxlbmR7dmVyYmF0aW19CgpUaGlzIHdpbGwgcHJpbnQKClxiZWdpbnt2ZXJiYXRpbX0KWzFdClsxLCAyXQpbMSwgMiwgM10KXGVuZHt2ZXJiYXRpbX0KCklmIHlvdSBkb24ndCB3YW50IHRoZSBkZWZhdWx0IHRvIGJlIHNoYXJlZCBiZXR3ZWVuIHN1YnNlcXVlbnQgY2FsbHMsCnlvdSBjYW4gd3JpdGUgdGhlIGZ1bmN0aW9uIGxpa2UgdGhpcyBpbnN0ZWFkOgoKXGJlZ2lue3ZlcmJhdGltfQpkZWYgZihhLCBMPU5vbmUpOgogICAgaWYgTCBpcyBOb25lOgogICAgICAgIEwgPSBbXQogICAgTC5hcHBlbmQoYSkKICAgIHJldHVybiBMClxlbmR7dmVyYmF0aW19Cgpcc3Vic2VjdGlvbntLZXl3b3JkIEFyZ3VtZW50cyBcbGFiZWx7a2V5d29yZEFyZ3N9fQoKRnVuY3Rpb25zIGNhbiBhbHNvIGJlIGNhbGxlZCB1c2luZwprZXl3b3JkIGFyZ3VtZW50cyBvZiB0aGUgZm9ybSBcc2FtcHtcdmFye2tleXdvcmR9ID0gXHZhcnt2YWx1ZX19LiAgRm9yCmluc3RhbmNlLCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgoKXGJlZ2lue3ZlcmJhdGltfQpkZWYgcGFycm90KHZvbHRhZ2UsIHN0YXRlPSdhIHN0aWZmJywgYWN0aW9uPSd2b29tJywgdHlwZT0nTm9yd2VnaWFuIEJsdWUnKToKICAgIHByaW50ICItLSBUaGlzIHBhcnJvdCB3b3VsZG4ndCIsIGFjdGlvbiwKICAgIHByaW50ICJpZiB5b3UgcHV0Iiwgdm9sdGFnZSwgIlZvbHRzIHRocm91Z2ggaXQuIgogICAgcHJpbnQgIi0tIExvdmVseSBwbHVtYWdlLCB0aGUiLCB0eXBlCiAgICBwcmludCAiLS0gSXQncyIsIHN0YXRlLCAiISIKXGVuZHt2ZXJiYXRpbX0KCmNvdWxkIGJlIGNhbGxlZCBpbiBhbnkgb2YgdGhlIGZvbGxvd2luZyB3YXlzOgoKXGJlZ2lue3ZlcmJhdGltfQpwYXJyb3QoMTAwMCkKcGFycm90KGFjdGlvbiA9ICdWT09PT09NJywgdm9sdGFnZSA9IDEwMDAwMDApCnBhcnJvdCgnYSB0aG91c2FuZCcsIHN0YXRlID0gJ3B1c2hpbmcgdXAgdGhlIGRhaXNpZXMnKQpwYXJyb3QoJ2EgbWlsbGlvbicsICdiZXJlZnQgb2YgbGlmZScsICdqdW1wJykKXGVuZHt2ZXJiYXRpbX0KCmJ1dCB0aGUgZm9sbG93aW5nIGNhbGxzIHdvdWxkIGFsbCBiZSBpbnZhbGlkOgoKXGJlZ2lue3ZlcmJhdGltfQpwYXJyb3QoKSAgICAgICAgICAgICAgICAgICAgICMgcmVxdWlyZWQgYXJndW1lbnQgbWlzc2luZwpwYXJyb3Qodm9sdGFnZT01LjAsICdkZWFkJykgICMgbm9uLWtleXdvcmQgYXJndW1lbnQgZm9sbG93aW5nIGtleXdvcmQKcGFycm90KDExMCwgdm9sdGFnZT0yMjApICAgICAjIGR1cGxpY2F0ZSB2YWx1ZSBmb3IgYXJndW1lbnQKcGFycm90KGFjdG9yPSdKb2huIENsZWVzZScpICAjIHVua25vd24ga2V5d29yZApcZW5ke3ZlcmJhdGltfQoKSW4gZ2VuZXJhbCwgYW4gYXJndW1lbnQgbGlzdCBtdXN0IGhhdmUgYW55IHBvc2l0aW9uYWwgYXJndW1lbnRzCmZvbGxvd2VkIGJ5IGFueSBrZXl3b3JkIGFyZ3VtZW50cywgd2hlcmUgdGhlIGtleXdvcmRzIG11c3QgYmUgY2hvc2VuCmZyb20gdGhlIGZvcm1hbCBwYXJhbWV0ZXIgbmFtZXMuICBJdCdzIG5vdCBpbXBvcnRhbnQgd2hldGhlciBhIGZvcm1hbApwYXJhbWV0ZXIgaGFzIGEgZGVmYXVsdCB2YWx1ZSBvciBub3QuICBObyBhcmd1bWVudCBtYXkgcmVjZWl2ZSBhCnZhbHVlIG1vcmUgdGhhbiBvbmNlIC0tLSBmb3JtYWwgcGFyYW1ldGVyIG5hbWVzIGNvcnJlc3BvbmRpbmcgdG8KcG9zaXRpb25hbCBhcmd1bWVudHMgY2Fubm90IGJlIHVzZWQgYXMga2V5d29yZHMgaW4gdGhlIHNhbWUgY2FsbHMuCkhlcmUncyBhbiBleGFtcGxlIHRoYXQgZmFpbHMgZHVlIHRvIHRoaXMgcmVzdHJpY3Rpb246CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBkZWYgZnVuY3Rpb24oYSk6Ci4uLiAgICAgcGFzcwouLi4gCj4+PiBmdW5jdGlvbigwLCBhPTApClRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/ClR5cGVFcnJvcjogZnVuY3Rpb24oKSBnb3QgbXVsdGlwbGUgdmFsdWVzIGZvciBrZXl3b3JkIGFyZ3VtZW50ICdhJwpcZW5ke3ZlcmJhdGltfQoKV2hlbiBhIGZpbmFsIGZvcm1hbCBwYXJhbWV0ZXIgb2YgdGhlIGZvcm0gXGNvZGV7KipcdmFye25hbWV9fSBpcwpwcmVzZW50LCBpdCByZWNlaXZlcyBhIFx1bGlua3tkaWN0aW9uYXJ5fXsuLi9saWIvdHlwZXNtYXBwaW5nLmh0bWx9IGNvbnRhaW5pbmcgYWxsIGtleXdvcmQgYXJndW1lbnRzCndob3NlIGtleXdvcmQgZG9lc24ndCBjb3JyZXNwb25kIHRvIGEgZm9ybWFsIHBhcmFtZXRlci4gIFRoaXMgbWF5IGJlCmNvbWJpbmVkIHdpdGggYSBmb3JtYWwgcGFyYW1ldGVyIG9mIHRoZSBmb3JtClxjb2RleypcdmFye25hbWV9fSAoZGVzY3JpYmVkIGluIHRoZSBuZXh0IHN1YnNlY3Rpb24pIHdoaWNoIHJlY2VpdmVzIGEKdHVwbGUgY29udGFpbmluZyB0aGUgcG9zaXRpb25hbCBhcmd1bWVudHMgYmV5b25kIHRoZSBmb3JtYWwgcGFyYW1ldGVyCmxpc3QuICAoXGNvZGV7Klx2YXJ7bmFtZX19IG11c3Qgb2NjdXIgYmVmb3JlIFxjb2RleyoqXHZhcntuYW1lfX0uKQpGb3IgZXhhbXBsZSwgaWYgd2UgZGVmaW5lIGEgZnVuY3Rpb24gbGlrZSB0aGlzOgoKXGJlZ2lue3ZlcmJhdGltfQpkZWYgY2hlZXNlc2hvcChraW5kLCAqYXJndW1lbnRzLCAqKmtleXdvcmRzKToKICAgIHByaW50ICItLSBEbyB5b3UgaGF2ZSBhbnkiLCBraW5kLCAnPycKICAgIHByaW50ICItLSBJJ20gc29ycnksIHdlJ3JlIGFsbCBvdXQgb2YiLCBraW5kCiAgICBmb3IgYXJnIGluIGFyZ3VtZW50czogcHJpbnQgYXJnCiAgICBwcmludCAnLScqNDAKICAgIGtleXMgPSBrZXl3b3Jkcy5rZXlzKCkKICAgIGtleXMuc29ydCgpCiAgICBmb3Iga3cgaW4ga2V5czogcHJpbnQga3csICc6Jywga2V5d29yZHNba3ddClxlbmR7dmVyYmF0aW19CgpJdCBjb3VsZCBiZSBjYWxsZWQgbGlrZSB0aGlzOgoKXGJlZ2lue3ZlcmJhdGltfQpjaGVlc2VzaG9wKCdMaW1idXJnZXInLCAiSXQncyB2ZXJ5IHJ1bm55LCBzaXIuIiwKICAgICAgICAgICAiSXQncyByZWFsbHkgdmVyeSwgVkVSWSBydW5ueSwgc2lyLiIsCiAgICAgICAgICAgY2xpZW50PSdKb2huIENsZWVzZScsCiAgICAgICAgICAgc2hvcGtlZXBlcj0nTWljaGFlbCBQYWxpbicsCiAgICAgICAgICAgc2tldGNoPSdDaGVlc2UgU2hvcCBTa2V0Y2gnKQpcZW5ke3ZlcmJhdGltfQoKYW5kIG9mIGNvdXJzZSBpdCB3b3VsZCBwcmludDoKClxiZWdpbnt2ZXJiYXRpbX0KLS0gRG8geW91IGhhdmUgYW55IExpbWJ1cmdlciA/Ci0tIEknbSBzb3JyeSwgd2UncmUgYWxsIG91dCBvZiBMaW1idXJnZXIKSXQncyB2ZXJ5IHJ1bm55LCBzaXIuCkl0J3MgcmVhbGx5IHZlcnksIFZFUlkgcnVubnksIHNpci4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpjbGllbnQgOiBKb2huIENsZWVzZQpzaG9wa2VlcGVyIDogTWljaGFlbCBQYWxpbgpza2V0Y2ggOiBDaGVlc2UgU2hvcCBTa2V0Y2gKXGVuZHt2ZXJiYXRpbX0KCk5vdGUgdGhhdCB0aGUgXG1ldGhvZHtzb3J0KCl9IG1ldGhvZCBvZiB0aGUgbGlzdCBvZiBrZXl3b3JkIGFyZ3VtZW50Cm5hbWVzIGlzIGNhbGxlZCBiZWZvcmUgcHJpbnRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBcY29kZXtrZXl3b3Jkc30KZGljdGlvbmFyeTsgaWYgdGhpcyBpcyBub3QgZG9uZSwgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBhcmd1bWVudHMgYXJlCnByaW50ZWQgaXMgdW5kZWZpbmVkLgoKClxzdWJzZWN0aW9ue0FyYml0cmFyeSBBcmd1bWVudCBMaXN0cyBcbGFiZWx7YXJiaXRyYXJ5QXJnc319CgpGaW5hbGx5LCB0aGUgbGVhc3QgZnJlcXVlbnRseSB1c2VkIG9wdGlvbiBpcyB0byBzcGVjaWZ5IHRoYXQgYQpmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIHdpdGggYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBhcmd1bWVudHMuICBUaGVzZQphcmd1bWVudHMgd2lsbCBiZSB3cmFwcGVkIHVwIGluIGEgdHVwbGUuICBCZWZvcmUgdGhlIHZhcmlhYmxlIG51bWJlcgpvZiBhcmd1bWVudHMsIHplcm8gb3IgbW9yZSBub3JtYWwgYXJndW1lbnRzIG1heSBvY2N1ci4KClxiZWdpbnt2ZXJiYXRpbX0KZGVmIGZwcmludGYoZmlsZSwgZm9ybWF0LCAqYXJncyk6CiAgICBmaWxlLndyaXRlKGZvcm1hdCAlIGFyZ3MpClxlbmR7dmVyYmF0aW19CgoKXHN1YnNlY3Rpb257VW5wYWNraW5nIEFyZ3VtZW50IExpc3RzIFxsYWJlbHt1bnBhY2tpbmctYXJndW1lbnRzfX0KClRoZSByZXZlcnNlIHNpdHVhdGlvbiBvY2N1cnMgd2hlbiB0aGUgYXJndW1lbnRzIGFyZSBhbHJlYWR5IGluIGEgbGlzdApvciB0dXBsZSBidXQgbmVlZCB0byBiZSB1bnBhY2tlZCBmb3IgYSBmdW5jdGlvbiBjYWxsIHJlcXVpcmluZyBzZXBhcmF0ZQpwb3NpdGlvbmFsIGFyZ3VtZW50cy4gIEZvciBpbnN0YW5jZSwgdGhlIGJ1aWx0LWluIFxmdW5jdGlvbntyYW5nZSgpfQpmdW5jdGlvbiBleHBlY3RzIHNlcGFyYXRlIFx2YXJ7c3RhcnR9IGFuZCBcdmFye3N0b3B9IGFyZ3VtZW50cy4gIElmIHRoZXkKYXJlIG5vdCBhdmFpbGFibGUgc2VwYXJhdGVseSwgd3JpdGUgdGhlIGZ1bmN0aW9uIGNhbGwgd2l0aCB0aGUgClxjb2Rleyp9LW9wZXJhdG9yIHRvIHVucGFjayB0aGUgYXJndW1lbnRzIG91dCBvZiBhIGxpc3Qgb3IgdHVwbGU6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiByYW5nZSgzLCA2KSAgICAgICAgICAgICAjIG5vcm1hbCBjYWxsIHdpdGggc2VwYXJhdGUgYXJndW1lbnRzClszLCA0LCA1XQo+Pj4gYXJncyA9IFszLCA2XQo+Pj4gcmFuZ2UoKmFyZ3MpICAgICAgICAgICAgIyBjYWxsIHdpdGggYXJndW1lbnRzIHVucGFja2VkIGZyb20gYSBsaXN0ClszLCA0LCA1XQpcZW5ke3ZlcmJhdGltfQoKClxzdWJzZWN0aW9ue0xhbWJkYSBGb3JtcyBcbGFiZWx7bGFtYmRhfX0KCkJ5IHBvcHVsYXIgZGVtYW5kLCBhIGZldyBmZWF0dXJlcyBjb21tb25seSBmb3VuZCBpbiBmdW5jdGlvbmFsCnByb2dyYW1taW5nIGxhbmd1YWdlcyBhbmQgTGlzcCBoYXZlIGJlZW4gYWRkZWQgdG8gUHl0aG9uLiAgV2l0aCB0aGUKXGtleXdvcmR7bGFtYmRhfSBrZXl3b3JkLCBzbWFsbCBhbm9ueW1vdXMgZnVuY3Rpb25zIGNhbiBiZSBjcmVhdGVkLgpIZXJlJ3MgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHN1bSBvZiBpdHMgdHdvIGFyZ3VtZW50czoKXHNhbXB7bGFtYmRhIGEsIGI6IGErYn0uICBMYW1iZGEgZm9ybXMgY2FuIGJlIHVzZWQgd2hlcmV2ZXIgZnVuY3Rpb24Kb2JqZWN0cyBhcmUgcmVxdWlyZWQuICBUaGV5IGFyZSBzeW50YWN0aWNhbGx5IHJlc3RyaWN0ZWQgdG8gYSBzaW5nbGUKZXhwcmVzc2lvbi4gIFNlbWFudGljYWxseSwgdGhleSBhcmUganVzdCBzeW50YWN0aWMgc3VnYXIgZm9yIGEgbm9ybWFsCmZ1bmN0aW9uIGRlZmluaXRpb24uICBMaWtlIG5lc3RlZCBmdW5jdGlvbiBkZWZpbml0aW9ucywgbGFtYmRhIGZvcm1zCmNhbiByZWZlcmVuY2UgdmFyaWFibGVzIGZyb20gdGhlIGNvbnRhaW5pbmcgc2NvcGU6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBkZWYgbWFrZV9pbmNyZW1lbnRvcihuKToKLi4uICAgICByZXR1cm4gbGFtYmRhIHg6IHggKyBuCi4uLgo+Pj4gZiA9IG1ha2VfaW5jcmVtZW50b3IoNDIpCj4+PiBmKDApCjQyCj4+PiBmKDEpCjQzClxlbmR7dmVyYmF0aW19CgoKXHN1YnNlY3Rpb257RG9jdW1lbnRhdGlvbiBTdHJpbmdzIFxsYWJlbHtkb2NzdHJpbmdzfX0KClRoZXJlIGFyZSBlbWVyZ2luZyBjb252ZW50aW9ucyBhYm91dCB0aGUgY29udGVudCBhbmQgZm9ybWF0dGluZyBvZgpkb2N1bWVudGF0aW9uIHN0cmluZ3MuClxpbmRleHtkb2NzdHJpbmdzfVxpbmRleHtkb2N1bWVudGF0aW9uIHN0cmluZ3N9ClxpbmRleHtzdHJpbmdzLCBkb2N1bWVudGF0aW9ufQoKVGhlIGZpcnN0IGxpbmUgc2hvdWxkIGFsd2F5cyBiZSBhIHNob3J0LCBjb25jaXNlIHN1bW1hcnkgb2YgdGhlCm9iamVjdCdzIHB1cnBvc2UuICBGb3IgYnJldml0eSwgaXQgc2hvdWxkIG5vdCBleHBsaWNpdGx5IHN0YXRlIHRoZQpvYmplY3QncyBuYW1lIG9yIHR5cGUsIHNpbmNlIHRoZXNlIGFyZSBhdmFpbGFibGUgYnkgb3RoZXIgbWVhbnMKKGV4Y2VwdCBpZiB0aGUgbmFtZSBoYXBwZW5zIHRvIGJlIGEgdmVyYiBkZXNjcmliaW5nIGEgZnVuY3Rpb24ncwpvcGVyYXRpb24pLiAgVGhpcyBsaW5lIHNob3VsZCBiZWdpbiB3aXRoIGEgY2FwaXRhbCBsZXR0ZXIgYW5kIGVuZCB3aXRoCmEgcGVyaW9kLgoKSWYgdGhlcmUgYXJlIG1vcmUgbGluZXMgaW4gdGhlIGRvY3VtZW50YXRpb24gc3RyaW5nLCB0aGUgc2Vjb25kIGxpbmUKc2hvdWxkIGJlIGJsYW5rLCB2aXN1YWxseSBzZXBhcmF0aW5nIHRoZSBzdW1tYXJ5IGZyb20gdGhlIHJlc3Qgb2YgdGhlCmRlc2NyaXB0aW9uLiAgVGhlIGZvbGxvd2luZyBsaW5lcyBzaG91bGQgYmUgb25lIG9yIG1vcmUgcGFyYWdyYXBocwpkZXNjcmliaW5nIHRoZSBvYmplY3QncyBjYWxsaW5nIGNvbnZlbnRpb25zLCBpdHMgc2lkZSBlZmZlY3RzLCBldGMuCgpUaGUgUHl0aG9uIHBhcnNlciBkb2VzIG5vdCBzdHJpcCBpbmRlbnRhdGlvbiBmcm9tIG11bHRpLWxpbmUgc3RyaW5nCmxpdGVyYWxzIGluIFB5dGhvbiwgc28gdG9vbHMgdGhhdCBwcm9jZXNzIGRvY3VtZW50YXRpb24gaGF2ZSB0byBzdHJpcAppbmRlbnRhdGlvbiBpZiBkZXNpcmVkLiAgVGhpcyBpcyBkb25lIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29udmVudGlvbi4KVGhlIGZpcnN0IG5vbi1ibGFuayBsaW5lIFxlbXBoe2FmdGVyfSB0aGUgZmlyc3QgbGluZSBvZiB0aGUgc3RyaW5nCmRldGVybWluZXMgdGhlIGFtb3VudCBvZiBpbmRlbnRhdGlvbiBmb3IgdGhlIGVudGlyZSBkb2N1bWVudGF0aW9uCnN0cmluZy4gIChXZSBjYW4ndCB1c2UgdGhlIGZpcnN0IGxpbmUgc2luY2UgaXQgaXMgZ2VuZXJhbGx5IGFkamFjZW50CnRvIHRoZSBzdHJpbmcncyBvcGVuaW5nIHF1b3RlcyBzbyBpdHMgaW5kZW50YXRpb24gaXMgbm90IGFwcGFyZW50IGluCnRoZSBzdHJpbmcgbGl0ZXJhbC4pICBXaGl0ZXNwYWNlIGBgZXF1aXZhbGVudCcnIHRvIHRoaXMgaW5kZW50YXRpb24gaXMKdGhlbiBzdHJpcHBlZCBmcm9tIHRoZSBzdGFydCBvZiBhbGwgbGluZXMgb2YgdGhlIHN0cmluZy4gIExpbmVzIHRoYXQKYXJlIGluZGVudGVkIGxlc3Mgc2hvdWxkIG5vdCBvY2N1ciwgYnV0IGlmIHRoZXkgb2NjdXIgYWxsIHRoZWlyCmxlYWRpbmcgd2hpdGVzcGFjZSBzaG91bGQgYmUgc3RyaXBwZWQuICBFcXVpdmFsZW5jZSBvZiB3aGl0ZXNwYWNlCnNob3VsZCBiZSB0ZXN0ZWQgYWZ0ZXIgZXhwYW5zaW9uIG9mIHRhYnMgKHRvIDggc3BhY2VzLCBub3JtYWxseSkuCgpIZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBtdWx0aS1saW5lIGRvY3N0cmluZzoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGRlZiBteV9mdW5jdGlvbigpOgouLi4gICAgICIiIkRvIG5vdGhpbmcsIGJ1dCBkb2N1bWVudCBpdC4KLi4uIAouLi4gICAgIE5vLCByZWFsbHksIGl0IGRvZXNuJ3QgZG8gYW55dGhpbmcuCi4uLiAgICAgIiIiCi4uLiAgICAgcGFzcwouLi4gCj4+PiBwcmludCBteV9mdW5jdGlvbi5fX2RvY19fCkRvIG5vdGhpbmcsIGJ1dCBkb2N1bWVudCBpdC4KCiAgICBObywgcmVhbGx5LCBpdCBkb2Vzbid0IGRvIGFueXRoaW5nLgogICAgClxlbmR7dmVyYmF0aW19CgoKClxjaGFwdGVye0RhdGEgU3RydWN0dXJlcyBcbGFiZWx7c3RydWN0dXJlc319CgpUaGlzIGNoYXB0ZXIgZGVzY3JpYmVzIHNvbWUgdGhpbmdzIHlvdSd2ZSBsZWFybmVkIGFib3V0IGFscmVhZHkgaW4KbW9yZSBkZXRhaWwsIGFuZCBhZGRzIHNvbWUgbmV3IHRoaW5ncyBhcyB3ZWxsLgoKClxzZWN0aW9ue01vcmUgb24gTGlzdHMgXGxhYmVse21vcmVMaXN0c319CgpUaGUgbGlzdCBkYXRhIHR5cGUgaGFzIHNvbWUgbW9yZSBtZXRob2RzLiAgSGVyZSBhcmUgYWxsIG9mIHRoZSBtZXRob2RzCm9mIGxpc3Qgb2JqZWN0czoKClxiZWdpbnttZXRob2RkZXNjfVtsaXN0XXthcHBlbmR9e3h9CkFkZCBhbiBpdGVtIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Q7CmVxdWl2YWxlbnQgdG8gXGNvZGV7YVtsZW4oYSk6XSA9IFtcdmFye3h9XX0uClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtsaXN0XXtleHRlbmR9e0x9CkV4dGVuZCB0aGUgbGlzdCBieSBhcHBlbmRpbmcgYWxsIHRoZSBpdGVtcyBpbiB0aGUgZ2l2ZW4gbGlzdDsKZXF1aXZhbGVudCB0byBcY29kZXthW2xlbihhKTpdID0gXHZhcntMfX0uClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtsaXN0XXtpbnNlcnR9e2ksIHh9Ckluc2VydCBhbiBpdGVtIGF0IGEgZ2l2ZW4gcG9zaXRpb24uICBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIGluZGV4Cm9mIHRoZSBlbGVtZW50IGJlZm9yZSB3aGljaCB0byBpbnNlcnQsIHNvIFxjb2Rle2EuaW5zZXJ0KDAsIFx2YXJ7eH0pfQppbnNlcnRzIGF0IHRoZSBmcm9udCBvZiB0aGUgbGlzdCwgYW5kIFxjb2Rle2EuaW5zZXJ0KGxlbihhKSwgXHZhcnt4fSl9CmlzIGVxdWl2YWxlbnQgdG8gXGNvZGV7YS5hcHBlbmQoXHZhcnt4fSl9LgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bbGlzdF17cmVtb3ZlfXt4fQpSZW1vdmUgdGhlIGZpcnN0IGl0ZW0gZnJvbSB0aGUgbGlzdCB3aG9zZSB2YWx1ZSBpcyBcdmFye3h9LgpJdCBpcyBhbiBlcnJvciBpZiB0aGVyZSBpcyBubyBzdWNoIGl0ZW0uClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtsaXN0XXtwb3B9e1xvcHRpb25hbHtpfX0KUmVtb3ZlIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBpbiB0aGUgbGlzdCwgYW5kIHJldHVybiBpdC4gIElmCm5vIGluZGV4IGlzIHNwZWNpZmllZCwgXGNvZGV7YS5wb3AoKX0gcmV0dXJucyB0aGUgbGFzdCBpdGVtIGluIHRoZQpsaXN0LiAgVGhlIGl0ZW0gaXMgYWxzbyByZW1vdmVkIGZyb20gdGhlIGxpc3QuICAoVGhlIHNxdWFyZSBicmFja2V0cwphcm91bmQgdGhlIFx2YXJ7aX0gaW4gdGhlIG1ldGhvZCBzaWduYXR1cmUgZGVub3RlIHRoYXQgdGhlIHBhcmFtZXRlcgppcyBvcHRpb25hbCwgbm90IHRoYXQgeW91IHNob3VsZCB0eXBlIHNxdWFyZSBicmFja2V0cyBhdCB0aGF0CnBvc2l0aW9uLiAgWW91IHdpbGwgc2VlIHRoaXMgbm90YXRpb24gZnJlcXVlbnRseSBpbiB0aGUKXGNpdGV0aXRsZVsuLi9saWIvbGliLmh0bWxde1B5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZX0uKQpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bbGlzdF17aW5kZXh9e3h9ClJldHVybiB0aGUgaW5kZXggaW4gdGhlIGxpc3Qgb2YgdGhlIGZpcnN0IGl0ZW0gd2hvc2UgdmFsdWUgaXMgXHZhcnt4fS4KSXQgaXMgYW4gZXJyb3IgaWYgdGhlcmUgaXMgbm8gc3VjaCBpdGVtLgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bbGlzdF17Y291bnR9e3h9ClJldHVybiB0aGUgbnVtYmVyIG9mIHRpbWVzIFx2YXJ7eH0gYXBwZWFycyBpbiB0aGUgbGlzdC4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W2xpc3Rde3NvcnR9e30KU29ydCB0aGUgaXRlbXMgb2YgdGhlIGxpc3QsIGluIHBsYWNlLgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bbGlzdF17cmV2ZXJzZX17fQpSZXZlcnNlIHRoZSBlbGVtZW50cyBvZiB0aGUgbGlzdCwgaW4gcGxhY2UuClxlbmR7bWV0aG9kZGVzY30KCkFuIGV4YW1wbGUgdGhhdCB1c2VzIG1vc3Qgb2YgdGhlIGxpc3QgbWV0aG9kczoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGEgPSBbNjYuMjUsIDMzMywgMzMzLCAxLCAxMjM0LjVdCj4+PiBwcmludCBhLmNvdW50KDMzMyksIGEuY291bnQoNjYuMjUpLCBhLmNvdW50KCd4JykKMiAxIDAKPj4+IGEuaW5zZXJ0KDIsIC0xKQo+Pj4gYS5hcHBlbmQoMzMzKQo+Pj4gYQpbNjYuMjUsIDMzMywgLTEsIDMzMywgMSwgMTIzNC41LCAzMzNdCj4+PiBhLmluZGV4KDMzMykKMQo+Pj4gYS5yZW1vdmUoMzMzKQo+Pj4gYQpbNjYuMjUsIC0xLCAzMzMsIDEsIDEyMzQuNSwgMzMzXQo+Pj4gYS5yZXZlcnNlKCkKPj4+IGEKWzMzMywgMTIzNC41LCAxLCAzMzMsIC0xLCA2Ni4yNV0KPj4+IGEuc29ydCgpCj4+PiBhClstMSwgMSwgNjYuMjUsIDMzMywgMzMzLCAxMjM0LjVdClxlbmR7dmVyYmF0aW19CgoKXHN1YnNlY3Rpb257VXNpbmcgTGlzdHMgYXMgU3RhY2tzIFxsYWJlbHtsaXN0cy1hcy1zdGFja3N9fQpcc2VjdGlvbmF1dGhvcntLYS1QaW5nIFllZX17cGluZ0BsZncub3JnfQoKVGhlIGxpc3QgbWV0aG9kcyBtYWtlIGl0IHZlcnkgZWFzeSB0byB1c2UgYSBsaXN0IGFzIGEgc3RhY2ssIHdoZXJlIHRoZQpsYXN0IGVsZW1lbnQgYWRkZWQgaXMgdGhlIGZpcnN0IGVsZW1lbnQgcmV0cmlldmVkIChgYGxhc3QtaW4sCmZpcnN0LW91dCcnKS4gIFRvIGFkZCBhbiBpdGVtIHRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrLCB1c2UKXG1ldGhvZHthcHBlbmQoKX0uICBUbyByZXRyaWV2ZSBhbiBpdGVtIGZyb20gdGhlIHRvcCBvZiB0aGUgc3RhY2ssIHVzZQpcbWV0aG9ke3BvcCgpfSB3aXRob3V0IGFuIGV4cGxpY2l0IGluZGV4LiAgRm9yIGV4YW1wbGU6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBzdGFjayA9IFszLCA0LCA1XQo+Pj4gc3RhY2suYXBwZW5kKDYpCj4+PiBzdGFjay5hcHBlbmQoNykKPj4+IHN0YWNrClszLCA0LCA1LCA2LCA3XQo+Pj4gc3RhY2sucG9wKCkKNwo+Pj4gc3RhY2sKWzMsIDQsIDUsIDZdCj4+PiBzdGFjay5wb3AoKQo2Cj4+PiBzdGFjay5wb3AoKQo1Cj4+PiBzdGFjawpbMywgNF0KXGVuZHt2ZXJiYXRpbX0KCgpcc3Vic2VjdGlvbntVc2luZyBMaXN0cyBhcyBRdWV1ZXMgXGxhYmVse2xpc3RzLWFzLXF1ZXVlc319ClxzZWN0aW9uYXV0aG9ye0thLVBpbmcgWWVlfXtwaW5nQGxmdy5vcmd9CgpZb3UgY2FuIGFsc28gdXNlIGEgbGlzdCBjb252ZW5pZW50bHkgYXMgYSBxdWV1ZSwgd2hlcmUgdGhlIGZpcnN0CmVsZW1lbnQgYWRkZWQgaXMgdGhlIGZpcnN0IGVsZW1lbnQgcmV0cmlldmVkIChgYGZpcnN0LWluLApmaXJzdC1vdXQnJykuICBUbyBhZGQgYW4gaXRlbSB0byB0aGUgYmFjayBvZiB0aGUgcXVldWUsIHVzZQpcbWV0aG9ke2FwcGVuZCgpfS4gIFRvIHJldHJpZXZlIGFuIGl0ZW0gZnJvbSB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlLAp1c2UgXG1ldGhvZHtwb3AoKX0gd2l0aCBcY29kZXswfSBhcyB0aGUgaW5kZXguICBGb3IgZXhhbXBsZToKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHF1ZXVlID0gWyJFcmljIiwgIkpvaG4iLCAiTWljaGFlbCJdCj4+PiBxdWV1ZS5hcHBlbmQoIlRlcnJ5IikgICAgICAgICAgICMgVGVycnkgYXJyaXZlcwo+Pj4gcXVldWUuYXBwZW5kKCJHcmFoYW0iKSAgICAgICAgICAjIEdyYWhhbSBhcnJpdmVzCj4+PiBxdWV1ZS5wb3AoMCkKJ0VyaWMnCj4+PiBxdWV1ZS5wb3AoMCkKJ0pvaG4nCj4+PiBxdWV1ZQpbJ01pY2hhZWwnLCAnVGVycnknLCAnR3JhaGFtJ10KXGVuZHt2ZXJiYXRpbX0KCgpcc3Vic2VjdGlvbntGdW5jdGlvbmFsIFByb2dyYW1taW5nIFRvb2xzIFxsYWJlbHtmdW5jdGlvbmFsfX0KClRoZXJlIGFyZSB0aHJlZSBidWlsdC1pbiBmdW5jdGlvbnMgdGhhdCBhcmUgdmVyeSB1c2VmdWwgd2hlbiB1c2VkIHdpdGgKbGlzdHM6IFxmdW5jdGlvbntmaWx0ZXIoKX0sIFxmdW5jdGlvbnttYXAoKX0sIGFuZCBcZnVuY3Rpb257cmVkdWNlKCl9LgoKXHNhbXB7ZmlsdGVyKFx2YXJ7ZnVuY3Rpb259LCBcdmFye3NlcXVlbmNlfSl9IHJldHVybnMgYSBzZXF1ZW5jZSAob2YKdGhlIHNhbWUgdHlwZSwgaWYgcG9zc2libGUpIGNvbnNpc3Rpbmcgb2YgdGhvc2UgaXRlbXMgZnJvbSB0aGUKc2VxdWVuY2UgZm9yIHdoaWNoIFxjb2Rle1x2YXJ7ZnVuY3Rpb259KFx2YXJ7aXRlbX0pfSBpcyB0cnVlLiAgRm9yCmV4YW1wbGUsIHRvIGNvbXB1dGUgc29tZSBwcmltZXM6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBkZWYgZih4KTogcmV0dXJuIHggJSAyICE9IDAgYW5kIHggJSAzICE9IDAKLi4uCj4+PiBmaWx0ZXIoZiwgcmFuZ2UoMiwgMjUpKQpbNSwgNywgMTEsIDEzLCAxNywgMTksIDIzXQpcZW5ke3ZlcmJhdGltfQoKXHNhbXB7bWFwKFx2YXJ7ZnVuY3Rpb259LCBcdmFye3NlcXVlbmNlfSl9IGNhbGxzClxjb2Rle1x2YXJ7ZnVuY3Rpb259KFx2YXJ7aXRlbX0pfSBmb3IgZWFjaCBvZiB0aGUgc2VxdWVuY2UncyBpdGVtcyBhbmQKcmV0dXJucyBhIGxpc3Qgb2YgdGhlIHJldHVybiB2YWx1ZXMuICBGb3IgZXhhbXBsZSwgdG8gY29tcHV0ZSBzb21lCmN1YmVzOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gZGVmIGN1YmUoeCk6IHJldHVybiB4KngqeAouLi4KPj4+IG1hcChjdWJlLCByYW5nZSgxLCAxMSkpClsxLCA4LCAyNywgNjQsIDEyNSwgMjE2LCAzNDMsIDUxMiwgNzI5LCAxMDAwXQpcZW5ke3ZlcmJhdGltfQoKTW9yZSB0aGFuIG9uZSBzZXF1ZW5jZSBtYXkgYmUgcGFzc2VkOyB0aGUgZnVuY3Rpb24gbXVzdCB0aGVuIGhhdmUgYXMKbWFueSBhcmd1bWVudHMgYXMgdGhlcmUgYXJlIHNlcXVlbmNlcyBhbmQgaXMgY2FsbGVkIHdpdGggdGhlCmNvcnJlc3BvbmRpbmcgaXRlbSBmcm9tIGVhY2ggc2VxdWVuY2UgKG9yIFxjb2Rle05vbmV9IGlmIHNvbWUgc2VxdWVuY2UKaXMgc2hvcnRlciB0aGFuIGFub3RoZXIpLiAgRm9yIGV4YW1wbGU6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBzZXEgPSByYW5nZSg4KQo+Pj4gZGVmIGFkZCh4LCB5KTogcmV0dXJuIHgreQouLi4KPj4+IG1hcChhZGQsIHNlcSwgc2VxKQpbMCwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNF0KXGVuZHt2ZXJiYXRpbX0KClxzYW1we3JlZHVjZShcdmFye2Z1bmN9LCBcdmFye3NlcXVlbmNlfSl9IHJldHVybnMgYSBzaW5nbGUgdmFsdWUKY29uc3RydWN0ZWQgYnkgY2FsbGluZyB0aGUgYmluYXJ5IGZ1bmN0aW9uIFx2YXJ7ZnVuY30gb24gdGhlIGZpcnN0IHR3bwppdGVtcyBvZiB0aGUgc2VxdWVuY2UsIHRoZW4gb24gdGhlIHJlc3VsdCBhbmQgdGhlIG5leHQgaXRlbSwgYW5kIHNvCm9uLiAgRm9yIGV4YW1wbGUsIHRvIGNvbXB1dGUgdGhlIHN1bSBvZiB0aGUgbnVtYmVycyAxIHRocm91Z2ggMTA6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBkZWYgYWRkKHgseSk6IHJldHVybiB4K3kKLi4uCj4+PiByZWR1Y2UoYWRkLCByYW5nZSgxLCAxMSkpCjU1ClxlbmR7dmVyYmF0aW19CgpJZiB0aGVyZSdzIG9ubHkgb25lIGl0ZW0gaW4gdGhlIHNlcXVlbmNlLCBpdHMgdmFsdWUgaXMgcmV0dXJuZWQ7IGlmCnRoZSBzZXF1ZW5jZSBpcyBlbXB0eSwgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZC4KCkEgdGhpcmQgYXJndW1lbnQgY2FuIGJlIHBhc3NlZCB0byBpbmRpY2F0ZSB0aGUgc3RhcnRpbmcgdmFsdWUuICBJbiB0aGlzCmNhc2UgdGhlIHN0YXJ0aW5nIHZhbHVlIGlzIHJldHVybmVkIGZvciBhbiBlbXB0eSBzZXF1ZW5jZSwgYW5kIHRoZQpmdW5jdGlvbiBpcyBmaXJzdCBhcHBsaWVkIHRvIHRoZSBzdGFydGluZyB2YWx1ZSBhbmQgdGhlIGZpcnN0IHNlcXVlbmNlCml0ZW0sIHRoZW4gdG8gdGhlIHJlc3VsdCBhbmQgdGhlIG5leHQgaXRlbSwgYW5kIHNvIG9uLiAgRm9yIGV4YW1wbGUsCgpcYmVnaW57dmVyYmF0aW19Cj4+PiBkZWYgc3VtKHNlcSk6Ci4uLiAgICAgZGVmIGFkZCh4LHkpOiByZXR1cm4geCt5Ci4uLiAgICAgcmV0dXJuIHJlZHVjZShhZGQsIHNlcSwgMCkKLi4uIAo+Pj4gc3VtKHJhbmdlKDEsIDExKSkKNTUKPj4+IHN1bShbXSkKMApcZW5ke3ZlcmJhdGltfQoKRG9uJ3QgdXNlIHRoaXMgZXhhbXBsZSdzIGRlZmluaXRpb24gb2YgXGZ1bmN0aW9ue3N1bSgpfTogc2luY2Ugc3VtbWluZwpudW1iZXJzIGlzIHN1Y2ggYSBjb21tb24gbmVlZCwgYSBidWlsdC1pbiBmdW5jdGlvbgpcY29kZXtzdW0oXHZhcntzZXF1ZW5jZX0pfSBpcyBhbHJlYWR5IHByb3ZpZGVkLCBhbmQgd29ya3MgZXhhY3RseSBsaWtlCnRoaXMuClx2ZXJzaW9uYWRkZWR7Mi4zfQoKXHN1YnNlY3Rpb257TGlzdCBDb21wcmVoZW5zaW9uc30KCkxpc3QgY29tcHJlaGVuc2lvbnMgcHJvdmlkZSBhIGNvbmNpc2Ugd2F5IHRvIGNyZWF0ZSBsaXN0cyB3aXRob3V0IHJlc29ydGluZwp0byB1c2Ugb2YgXGZ1bmN0aW9ue21hcCgpfSwgXGZ1bmN0aW9ue2ZpbHRlcigpfSBhbmQvb3IgXGtleXdvcmR7bGFtYmRhfS4KVGhlIHJlc3VsdGluZyBsaXN0IGRlZmluaXRpb24gdGVuZHMgb2Z0ZW4gdG8gYmUgY2xlYXJlciB0aGFuIGxpc3RzIGJ1aWx0CnVzaW5nIHRob3NlIGNvbnN0cnVjdHMuICBFYWNoIGxpc3QgY29tcHJlaGVuc2lvbiBjb25zaXN0cyBvZiBhbiBleHByZXNzaW9uCmZvbGxvd2VkIGJ5IGEgXGtleXdvcmR7Zm9yfSBjbGF1c2UsIHRoZW4gemVybyBvciBtb3JlIFxrZXl3b3Jke2Zvcn0gb3IKXGtleXdvcmR7aWZ9IGNsYXVzZXMuICBUaGUgcmVzdWx0IHdpbGwgYmUgYSBsaXN0IHJlc3VsdGluZyBmcm9tIGV2YWx1YXRpbmcKdGhlIGV4cHJlc3Npb24gaW4gdGhlIGNvbnRleHQgb2YgdGhlIFxrZXl3b3Jke2Zvcn0gYW5kIFxrZXl3b3Jke2lmfSBjbGF1c2VzCndoaWNoIGZvbGxvdyBpdC4gIElmIHRoZSBleHByZXNzaW9uIHdvdWxkIGV2YWx1YXRlIHRvIGEgdHVwbGUsIGl0IG11c3QgYmUKcGFyZW50aGVzaXplZC4KClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGZyZXNoZnJ1aXQgPSBbJyAgYmFuYW5hJywgJyAgbG9nYW5iZXJyeSAnLCAncGFzc2lvbiBmcnVpdCAgJ10KPj4+IFt3ZWFwb24uc3RyaXAoKSBmb3Igd2VhcG9uIGluIGZyZXNoZnJ1aXRdClsnYmFuYW5hJywgJ2xvZ2FuYmVycnknLCAncGFzc2lvbiBmcnVpdCddCj4+PiB2ZWMgPSBbMiwgNCwgNl0KPj4+IFszKnggZm9yIHggaW4gdmVjXQpbNiwgMTIsIDE4XQo+Pj4gWzMqeCBmb3IgeCBpbiB2ZWMgaWYgeCA+IDNdClsxMiwgMThdCj4+PiBbMyp4IGZvciB4IGluIHZlYyBpZiB4IDwgMl0KW10KPj4+IFtbeCx4KioyXSBmb3IgeCBpbiB2ZWNdCltbMiwgNF0sIFs0LCAxNl0sIFs2LCAzNl1dCj4+PiBbeCwgeCoqMiBmb3IgeCBpbiB2ZWNdCSMgZXJyb3IgLSBwYXJlbnMgcmVxdWlyZWQgZm9yIHR1cGxlcwogIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KICAgIFt4LCB4KioyIGZvciB4IGluIHZlY10KICAgICAgICAgICAgICAgXgpTeW50YXhFcnJvcjogaW52YWxpZCBzeW50YXgKPj4+IFsoeCwgeCoqMikgZm9yIHggaW4gdmVjXQpbKDIsIDQpLCAoNCwgMTYpLCAoNiwgMzYpXQo+Pj4gdmVjMSA9IFsyLCA0LCA2XQo+Pj4gdmVjMiA9IFs0LCAzLCAtOV0KPj4+IFt4KnkgZm9yIHggaW4gdmVjMSBmb3IgeSBpbiB2ZWMyXQpbOCwgNiwgLTE4LCAxNiwgMTIsIC0zNiwgMjQsIDE4LCAtNTRdCj4+PiBbeCt5IGZvciB4IGluIHZlYzEgZm9yIHkgaW4gdmVjMl0KWzYsIDUsIC03LCA4LCA3LCAtNSwgMTAsIDksIC0zXQo+Pj4gW3ZlYzFbaV0qdmVjMltpXSBmb3IgaSBpbiByYW5nZShsZW4odmVjMSkpXQpbOCwgMTIsIC01NF0KXGVuZHt2ZXJiYXRpbX0KCkxpc3QgY29tcHJlaGVuc2lvbnMgYXJlIG11Y2ggbW9yZSBmbGV4aWJsZSB0aGFuIFxmdW5jdGlvbnttYXAoKX0gYW5kIGNhbiBiZQphcHBsaWVkIHRvIGZ1bmN0aW9ucyB3aXRoIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQgYW5kIHRvIG5lc3RlZCBmdW5jdGlvbnM6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBbc3RyKHJvdW5kKDM1NS8xMTMuMCwgaSkpIGZvciBpIGluIHJhbmdlKDEsNildClsnMy4xJywgJzMuMTQnLCAnMy4xNDInLCAnMy4xNDE2JywgJzMuMTQxNTknXQpcZW5ke3ZlcmJhdGltfQoKClxzZWN0aW9ue1RoZSBca2V5d29yZHtkZWx9IHN0YXRlbWVudCBcbGFiZWx7ZGVsfX0KClRoZXJlIGlzIGEgd2F5IHRvIHJlbW92ZSBhbiBpdGVtIGZyb20gYSBsaXN0IGdpdmVuIGl0cyBpbmRleCBpbnN0ZWFkCm9mIGl0cyB2YWx1ZTogdGhlIFxrZXl3b3Jke2RlbH0gc3RhdGVtZW50LiAgVGhpcyBjYW4gYWxzbyBiZSB1c2VkIHRvCnJlbW92ZSBzbGljZXMgZnJvbSBhIGxpc3QgKHdoaWNoIHdlIGRpZCBlYXJsaWVyIGJ5IGFzc2lnbm1lbnQgb2YgYW4KZW1wdHkgbGlzdCB0byB0aGUgc2xpY2UpLiAgRm9yIGV4YW1wbGU6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBhID0gWy0xLCAxLCA2Ni4yNSwgMzMzLCAzMzMsIDEyMzQuNV0KPj4+IGRlbCBhWzBdCj4+PiBhClsxLCA2Ni4yNSwgMzMzLCAzMzMsIDEyMzQuNV0KPj4+IGRlbCBhWzI6NF0KPj4+IGEKWzEsIDY2LjI1LCAxMjM0LjVdClxlbmR7dmVyYmF0aW19Cgpca2V5d29yZHtkZWx9IGNhbiBhbHNvIGJlIHVzZWQgdG8gZGVsZXRlIGVudGlyZSB2YXJpYWJsZXM6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBkZWwgYQpcZW5ke3ZlcmJhdGltfQoKUmVmZXJlbmNpbmcgdGhlIG5hbWUgXGNvZGV7YX0gaGVyZWFmdGVyIGlzIGFuIGVycm9yIChhdCBsZWFzdCB1bnRpbAphbm90aGVyIHZhbHVlIGlzIGFzc2lnbmVkIHRvIGl0KS4gIFdlJ2xsIGZpbmQgb3RoZXIgdXNlcyBmb3IKXGtleXdvcmR7ZGVsfSBsYXRlci4KCgpcc2VjdGlvbntUdXBsZXMgYW5kIFNlcXVlbmNlcyBcbGFiZWx7dHVwbGVzfX0KCldlIHNhdyB0aGF0IGxpc3RzIGFuZCBzdHJpbmdzIGhhdmUgbWFueSBjb21tb24gcHJvcGVydGllcywgc3VjaCBhcwppbmRleGluZyBhbmQgc2xpY2luZyBvcGVyYXRpb25zLiAgVGhleSBhcmUgdHdvIGV4YW1wbGVzIG9mClx1bGlua3tcZW1waHtzZXF1ZW5jZX0gZGF0YSB0eXBlc317Li4vbGliL3R5cGVzc2VxLmh0bWx9LiAgU2luY2UKUHl0aG9uIGlzIGFuIGV2b2x2aW5nIGxhbmd1YWdlLCBvdGhlciBzZXF1ZW5jZSBkYXRhIHR5cGVzIG1heSBiZQphZGRlZC4gIFRoZXJlIGlzIGFsc28gYW5vdGhlciBzdGFuZGFyZCBzZXF1ZW5jZSBkYXRhIHR5cGU6IHRoZQpcZW1waHt0dXBsZX0uCgpBIHR1cGxlIGNvbnNpc3RzIG9mIGEgbnVtYmVyIG9mIHZhbHVlcyBzZXBhcmF0ZWQgYnkgY29tbWFzLCBmb3IKaW5zdGFuY2U6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiB0ID0gMTIzNDUsIDU0MzIxLCAnaGVsbG8hJwo+Pj4gdFswXQoxMjM0NQo+Pj4gdAooMTIzNDUsIDU0MzIxLCAnaGVsbG8hJykKPj4+ICMgVHVwbGVzIG1heSBiZSBuZXN0ZWQ6Ci4uLiB1ID0gdCwgKDEsIDIsIDMsIDQsIDUpCj4+PiB1CigoMTIzNDUsIDU0MzIxLCAnaGVsbG8hJyksICgxLCAyLCAzLCA0LCA1KSkKXGVuZHt2ZXJiYXRpbX0KCkFzIHlvdSBzZWUsIG9uIG91dHB1dCB0dXBsZXMgYXJlIGFsd2F5IGVuY2xvc2VkIGluIHBhcmVudGhlc2VzLCBzbwp0aGF0IG5lc3RlZCB0dXBsZXMgYXJlIGludGVycHJldGVkIGNvcnJlY3RseTsgdGhleSBtYXkgYmUgaW5wdXQgd2l0aApvciB3aXRob3V0IHN1cnJvdW5kaW5nIHBhcmVudGhlc2VzLCBhbHRob3VnaCBvZnRlbiBwYXJlbnRoZXNlcyBhcmUKbmVjZXNzYXJ5IGFueXdheSAoaWYgdGhlIHR1cGxlIGlzIHBhcnQgb2YgYSBsYXJnZXIgZXhwcmVzc2lvbikuCgpUdXBsZXMgaGF2ZSBtYW55IHVzZXMuICBGb3IgZXhhbXBsZTogKHgsIHkpIGNvb3JkaW5hdGUgcGFpcnMsIGVtcGxveWVlCnJlY29yZHMgZnJvbSBhIGRhdGFiYXNlLCBldGMuICBUdXBsZXMsIGxpa2Ugc3RyaW5ncywgYXJlIGltbXV0YWJsZTogaXQKaXMgbm90IHBvc3NpYmxlIHRvIGFzc2lnbiB0byB0aGUgaW5kaXZpZHVhbCBpdGVtcyBvZiBhIHR1cGxlICh5b3UgY2FuCnNpbXVsYXRlIG11Y2ggb2YgdGhlIHNhbWUgZWZmZWN0IHdpdGggc2xpY2luZyBhbmQgY29uY2F0ZW5hdGlvbiwKdGhvdWdoKS4gIEl0IGlzIGFsc28gcG9zc2libGUgdG8gY3JlYXRlIHR1cGxlcyB3aGljaCBjb250YWluIG11dGFibGUKb2JqZWN0cywgc3VjaCBhcyBsaXN0cy4KCkEgc3BlY2lhbCBwcm9ibGVtIGlzIHRoZSBjb25zdHJ1Y3Rpb24gb2YgdHVwbGVzIGNvbnRhaW5pbmcgMCBvciAxCml0ZW1zOiB0aGUgc3ludGF4IGhhcyBzb21lIGV4dHJhIHF1aXJrcyB0byBhY2NvbW1vZGF0ZSB0aGVzZS4gIEVtcHR5CnR1cGxlcyBhcmUgY29uc3RydWN0ZWQgYnkgYW4gZW1wdHkgcGFpciBvZiBwYXJlbnRoZXNlczsgYSB0dXBsZSB3aXRoCm9uZSBpdGVtIGlzIGNvbnN0cnVjdGVkIGJ5IGZvbGxvd2luZyBhIHZhbHVlIHdpdGggYSBjb21tYQooaXQgaXMgbm90IHN1ZmZpY2llbnQgdG8gZW5jbG9zZSBhIHNpbmdsZSB2YWx1ZSBpbiBwYXJlbnRoZXNlcykuClVnbHksIGJ1dCBlZmZlY3RpdmUuICBGb3IgZXhhbXBsZToKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGVtcHR5ID0gKCkKPj4+IHNpbmdsZXRvbiA9ICdoZWxsbycsICAgICMgPC0tIG5vdGUgdHJhaWxpbmcgY29tbWEKPj4+IGxlbihlbXB0eSkKMAo+Pj4gbGVuKHNpbmdsZXRvbikKMQo+Pj4gc2luZ2xldG9uCignaGVsbG8nLCkKXGVuZHt2ZXJiYXRpbX0KClRoZSBzdGF0ZW1lbnQgXGNvZGV7dCA9IDEyMzQ1LCA1NDMyMSwgJ2hlbGxvISd9IGlzIGFuIGV4YW1wbGUgb2YKXGVtcGh7dHVwbGUgcGFja2luZ306IHRoZSB2YWx1ZXMgXGNvZGV7MTIzNDV9LCBcY29kZXs1NDMyMX0gYW5kClxjb2RleydoZWxsbyEnfSBhcmUgcGFja2VkIHRvZ2V0aGVyIGluIGEgdHVwbGUuICBUaGUgcmV2ZXJzZSBvcGVyYXRpb24KaXMgYWxzbyBwb3NzaWJsZToKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHgsIHksIHogPSB0ClxlbmR7dmVyYmF0aW19CgpUaGlzIGlzIGNhbGxlZCwgYXBwcm9wcmlhdGVseSBlbm91Z2gsIFxlbXBoe3NlcXVlbmNlIHVucGFja2luZ30uClNlcXVlbmNlIHVucGFja2luZyByZXF1aXJlcyB0aGF0IHRoZSBsaXN0IG9mIHZhcmlhYmxlcyBvbiB0aGUgbGVmdApoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBlbGVtZW50cyBhcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZS4gIE5vdGUKdGhhdCBtdWx0aXBsZSBhc3NpZ25tZW50IGlzIHJlYWxseSBqdXN0IGEgY29tYmluYXRpb24gb2YgdHVwbGUgcGFja2luZwphbmQgc2VxdWVuY2UgdW5wYWNraW5nIQoKVGhlcmUgaXMgYSBzbWFsbCBiaXQgb2YgYXN5bW1ldHJ5IGhlcmU6ICBwYWNraW5nIG11bHRpcGxlIHZhbHVlcwphbHdheXMgY3JlYXRlcyBhIHR1cGxlLCBhbmQgdW5wYWNraW5nIHdvcmtzIGZvciBhbnkgc2VxdWVuY2UuCgolIFhYWCBBZGQgYSBiaXQgb24gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0dXBsZXMgYW5kIGxpc3RzLgoKClxzZWN0aW9ue1NldHMgXGxhYmVse3NldHN9fQoKUHl0aG9uIGFsc28gaW5jbHVkZXMgYSBkYXRhIHR5cGUgZm9yIFxlbXBoe3NldHN9LiAgQSBzZXQgaXMgYW4gdW5vcmRlcmVkCmNvbGxlY3Rpb24gd2l0aCBubyBkdXBsaWNhdGUgZWxlbWVudHMuICBCYXNpYyB1c2VzIGluY2x1ZGUgbWVtYmVyc2hpcAp0ZXN0aW5nIGFuZCBlbGltaW5hdGluZyBkdXBsaWNhdGUgZW50cmllcy4gIFNldCBvYmplY3RzIGFsc28gc3VwcG9ydAptYXRoZW1hdGljYWwgb3BlcmF0aW9ucyBsaWtlIHVuaW9uLCBpbnRlcnNlY3Rpb24sIGRpZmZlcmVuY2UsIGFuZApzeW1tZXRyaWMgZGlmZmVyZW5jZS4KCkhlcmUgaXMgYSBicmllZiBkZW1vbnN0cmF0aW9uOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gYmFza2V0ID0gWydhcHBsZScsICdvcmFuZ2UnLCAnYXBwbGUnLCAncGVhcicsICdvcmFuZ2UnLCAnYmFuYW5hJ10KPj4+IGZydWl0cyA9IHNldChiYXNrZXQpICAgICAgICAgICAgICAgIyBjcmVhdGUgYSBzZXQgd2l0aG91dCBkdXBsaWNhdGVzCj4+PiBmcnVpdHMKc2V0KFsnb3JhbmdlJywgJ3BlYXInLCAnYXBwbGUnLCAnYmFuYW5hJ10pCj4+PiAnb3JhbmdlJyBpbiBmcnVpdHMgICAgICAgICAgICAgICAgICMgZmFzdCBtZW1iZXJzaGlwIHRlc3RpbmcKVHJ1ZQo+Pj4gJ2NyYWJncmFzcycgaW4gZnJ1aXRzCkZhbHNlCgo+Pj4gIyBEZW1vbnN0cmF0ZSBzZXQgb3BlcmF0aW9ucyBvbiB1bmlxdWUgbGV0dGVycyBmcm9tIHR3byB3b3JkcwouLi4KPj4+IGEgPSBzZXQoJ2FicmFjYWRhYnJhJykKPj4+IGIgPSBzZXQoJ2FsYWNhemFtJykKPj4+IGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB1bmlxdWUgbGV0dGVycyBpbiBhCnNldChbJ2EnLCAncicsICdiJywgJ2MnLCAnZCddKQo+Pj4gYSAtIGIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxldHRlcnMgaW4gYSBidXQgbm90IGluIGIKc2V0KFsncicsICdkJywgJ2InXSkKPj4+IGEgfCBiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsZXR0ZXJzIGluIGVpdGhlciBhIG9yIGIKc2V0KFsnYScsICdjJywgJ3InLCAnZCcsICdiJywgJ20nLCAneicsICdsJ10pCj4+PiBhICYgYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbGV0dGVycyBpbiBib3RoIGEgYW5kIGIKc2V0KFsnYScsICdjJ10pCj4+PiBhIF4gYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbGV0dGVycyBpbiBhIG9yIGIgYnV0IG5vdCBib3RoCnNldChbJ3InLCAnZCcsICdiJywgJ20nLCAneicsICdsJ10pClxlbmR7dmVyYmF0aW19CgoKXHNlY3Rpb257RGljdGlvbmFyaWVzIFxsYWJlbHtkaWN0aW9uYXJpZXN9fQoKQW5vdGhlciB1c2VmdWwgZGF0YSB0eXBlIGJ1aWx0IGludG8gUHl0aG9uIGlzIHRoZQpcdWxpbmt7XGVtcGh7ZGljdGlvbmFyeX19ey4uL2xpYi90eXBlc21hcHBpbmcuaHRtbH0uCkRpY3Rpb25hcmllcyBhcmUgc29tZXRpbWVzIGZvdW5kIGluIG90aGVyIGxhbmd1YWdlcyBhcyBgYGFzc29jaWF0aXZlCm1lbW9yaWVzJycgb3IgYGBhc3NvY2lhdGl2ZSBhcnJheXMnJy4gIFVubGlrZSBzZXF1ZW5jZXMsIHdoaWNoIGFyZQppbmRleGVkIGJ5IGEgcmFuZ2Ugb2YgbnVtYmVycywgZGljdGlvbmFyaWVzIGFyZSBpbmRleGVkIGJ5IFxlbXBoe2tleXN9LAp3aGljaCBjYW4gYmUgYW55IGltbXV0YWJsZSB0eXBlOyBzdHJpbmdzIGFuZCBudW1iZXJzIGNhbiBhbHdheXMgYmUKa2V5cy4gIFR1cGxlcyBjYW4gYmUgdXNlZCBhcyBrZXlzIGlmIHRoZXkgY29udGFpbiBvbmx5IHN0cmluZ3MsCm51bWJlcnMsIG9yIHR1cGxlczsgaWYgYSB0dXBsZSBjb250YWlucyBhbnkgbXV0YWJsZSBvYmplY3QgZWl0aGVyCmRpcmVjdGx5IG9yIGluZGlyZWN0bHksIGl0IGNhbm5vdCBiZSB1c2VkIGFzIGEga2V5LiAgWW91IGNhbid0IHVzZQpsaXN0cyBhcyBrZXlzLCBzaW5jZSBsaXN0cyBjYW4gYmUgbW9kaWZpZWQgaW4gcGxhY2UgdXNpbmcgdGhlaXIKXG1ldGhvZHthcHBlbmQoKX0gYW5kIFxtZXRob2R7ZXh0ZW5kKCl9IG1ldGhvZHMsIGFzIHdlbGwgYXMgc2xpY2UgYW5kCmluZGV4ZWQgYXNzaWdubWVudHMuCgpJdCBpcyBiZXN0IHRvIHRoaW5rIG9mIGEgZGljdGlvbmFyeSBhcyBhbiB1bm9yZGVyZWQgc2V0IG9mClxlbXBoe2tleTogdmFsdWV9IHBhaXJzLCB3aXRoIHRoZSByZXF1aXJlbWVudCB0aGF0IHRoZSBrZXlzIGFyZSB1bmlxdWUKKHdpdGhpbiBvbmUgZGljdGlvbmFyeSkuCkEgcGFpciBvZiBicmFjZXMgY3JlYXRlcyBhbiBlbXB0eSBkaWN0aW9uYXJ5OiBcY29kZXtce1x9fS4KUGxhY2luZyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGtleTp2YWx1ZSBwYWlycyB3aXRoaW4gdGhlCmJyYWNlcyBhZGRzIGluaXRpYWwga2V5OnZhbHVlIHBhaXJzIHRvIHRoZSBkaWN0aW9uYXJ5OyB0aGlzIGlzIGFsc28gdGhlCndheSBkaWN0aW9uYXJpZXMgYXJlIHdyaXR0ZW4gb24gb3V0cHV0LgoKVGhlIG1haW4gb3BlcmF0aW9ucyBvbiBhIGRpY3Rpb25hcnkgYXJlIHN0b3JpbmcgYSB2YWx1ZSB3aXRoIHNvbWUga2V5CmFuZCBleHRyYWN0aW5nIHRoZSB2YWx1ZSBnaXZlbiB0aGUga2V5LiAgSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBkZWxldGUKYSBrZXk6dmFsdWUgcGFpcgp3aXRoIFxjb2Rle2RlbH0uCklmIHlvdSBzdG9yZSB1c2luZyBhIGtleSB0aGF0IGlzIGFscmVhZHkgaW4gdXNlLCB0aGUgb2xkIHZhbHVlCmFzc29jaWF0ZWQgd2l0aCB0aGF0IGtleSBpcyBmb3Jnb3R0ZW4uICBJdCBpcyBhbiBlcnJvciB0byBleHRyYWN0IGEKdmFsdWUgdXNpbmcgYSBub24tZXhpc3RlbnQga2V5LgoKVGhlIFxtZXRob2R7a2V5cygpfSBtZXRob2Qgb2YgYSBkaWN0aW9uYXJ5IG9iamVjdCByZXR1cm5zIGEgbGlzdCBvZiBhbGwKdGhlIGtleXMgdXNlZCBpbiB0aGUgZGljdGlvbmFyeSwgaW4gYXJiaXRyYXJ5IG9yZGVyIChpZiB5b3Ugd2FudCBpdApzb3J0ZWQsIGp1c3QgYXBwbHkgdGhlIFxtZXRob2R7c29ydCgpfSBtZXRob2QgdG8gdGhlIGxpc3Qgb2Yga2V5cykuICBUbwpjaGVjayB3aGV0aGVyIGEgc2luZ2xlIGtleSBpcyBpbiB0aGUgZGljdGlvbmFyeSwgdXNlIHRoZQpcbWV0aG9ke2hhc19rZXkoKX0gbWV0aG9kIG9mIHRoZSBkaWN0aW9uYXJ5LgoKSGVyZSBpcyBhIHNtYWxsIGV4YW1wbGUgdXNpbmcgYSBkaWN0aW9uYXJ5OgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gdGVsID0geydqYWNrJzogNDA5OCwgJ3NhcGUnOiA0MTM5fQo+Pj4gdGVsWydndWlkbyddID0gNDEyNwo+Pj4gdGVsCnsnc2FwZSc6IDQxMzksICdndWlkbyc6IDQxMjcsICdqYWNrJzogNDA5OH0KPj4+IHRlbFsnamFjayddCjQwOTgKPj4+IGRlbCB0ZWxbJ3NhcGUnXQo+Pj4gdGVsWydpcnYnXSA9IDQxMjcKPj4+IHRlbAp7J2d1aWRvJzogNDEyNywgJ2lydic6IDQxMjcsICdqYWNrJzogNDA5OH0KPj4+IHRlbC5rZXlzKCkKWydndWlkbycsICdpcnYnLCAnamFjayddCj4+PiB0ZWwuaGFzX2tleSgnZ3VpZG8nKQpUcnVlClxlbmR7dmVyYmF0aW19CgpUaGUgXGZ1bmN0aW9ue2RpY3QoKX0gY29uc3RydWN0b3IgYnVpbGRzIGRpY3Rpb25hcmllcyBkaXJlY3RseSBmcm9tCmxpc3RzIG9mIGtleS12YWx1ZSBwYWlycyBzdG9yZWQgYXMgdHVwbGVzLiAgV2hlbiB0aGUgcGFpcnMgZm9ybSBhCnBhdHRlcm4sIGxpc3QgY29tcHJlaGVuc2lvbnMgY2FuIGNvbXBhY3RseSBzcGVjaWZ5IHRoZSBrZXktdmFsdWUgbGlzdC4KClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGRpY3QoWygnc2FwZScsIDQxMzkpLCAoJ2d1aWRvJywgNDEyNyksICgnamFjaycsIDQwOTgpXSkKeydzYXBlJzogNDEzOSwgJ2phY2snOiA0MDk4LCAnZ3VpZG8nOiA0MTI3fQo+Pj4gZGljdChbKHgsIHgqKjIpIGZvciB4IGluIHZlY10pICAgICAjIHVzZSBhIGxpc3QgY29tcHJlaGVuc2lvbgp7MjogNCwgNDogMTYsIDY6IDM2fQpcZW5ke3ZlcmJhdGltfQoKClxzZWN0aW9ue0xvb3BpbmcgVGVjaG5pcXVlcyBcbGFiZWx7bG9vcGlkaW9tc319CgpXaGVuIGxvb3BpbmcgdGhyb3VnaCBkaWN0aW9uYXJpZXMsIHRoZSBrZXkgYW5kIGNvcnJlc3BvbmRpbmcgdmFsdWUgY2FuCmJlIHJldHJpZXZlZCBhdCB0aGUgc2FtZSB0aW1lIHVzaW5nIHRoZSBcbWV0aG9ke2l0ZXJpdGVtcygpfSBtZXRob2QuCgpcYmVnaW57dmVyYmF0aW19Cj4+PiBrbmlnaHRzID0geydnYWxsYWhhZCc6ICd0aGUgcHVyZScsICdyb2Jpbic6ICd0aGUgYnJhdmUnfQo+Pj4gZm9yIGssIHYgaW4ga25pZ2h0cy5pdGVyaXRlbXMoKToKLi4uICAgICBwcmludCBrLCB2Ci4uLgpnYWxsYWhhZCB0aGUgcHVyZQpyb2JpbiB0aGUgYnJhdmUKXGVuZHt2ZXJiYXRpbX0KIApXaGVuIGxvb3BpbmcgdGhyb3VnaCBhIHNlcXVlbmNlLCB0aGUgcG9zaXRpb24gaW5kZXggYW5kIGNvcnJlc3BvbmRpbmcKdmFsdWUgY2FuIGJlIHJldHJpZXZlZCBhdCB0aGUgc2FtZSB0aW1lIHVzaW5nIHRoZQpcZnVuY3Rpb257ZW51bWVyYXRlKCl9IGZ1bmN0aW9uLgoKXGJlZ2lue3ZlcmJhdGltfSAKPj4+IGZvciBpLCB2IGluIGVudW1lcmF0ZShbJ3RpYycsICd0YWMnLCAndG9lJ10pOgouLi4gICAgIHByaW50IGksIHYKLi4uCjAgdGljCjEgdGFjCjIgdG9lClxlbmR7dmVyYmF0aW19CgpUbyBsb29wIG92ZXIgdHdvIG9yIG1vcmUgc2VxdWVuY2VzIGF0IHRoZSBzYW1lIHRpbWUsIHRoZSBlbnRyaWVzCmNhbiBiZSBwYWlyZWQgd2l0aCB0aGUgXGZ1bmN0aW9ue3ppcCgpfSBmdW5jdGlvbi4KClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHF1ZXN0aW9ucyA9IFsnbmFtZScsICdxdWVzdCcsICdmYXZvcml0ZSBjb2xvciddCj4+PiBhbnN3ZXJzID0gWydsYW5jZWxvdCcsICd0aGUgaG9seSBncmFpbCcsICdibHVlJ10KPj4+IGZvciBxLCBhIGluIHppcChxdWVzdGlvbnMsIGFuc3dlcnMpOgouLi4gICAgIHByaW50ICdXaGF0IGlzIHlvdXIgJXM/ICBJdCBpcyAlcy4nICUgKHEsIGEpCi4uLgkKV2hhdCBpcyB5b3VyIG5hbWU/ICBJdCBpcyBsYW5jZWxvdC4KV2hhdCBpcyB5b3VyIHF1ZXN0PyAgSXQgaXMgdGhlIGhvbHkgZ3JhaWwuCldoYXQgaXMgeW91ciBmYXZvcml0ZSBjb2xvcj8gIEl0IGlzIGJsdWUuClxlbmR7dmVyYmF0aW19CgpUbyBsb29wIG92ZXIgYSBzZXF1ZW5jZSBpbiByZXZlcnNlLCBmaXJzdCBzcGVjaWZ5IHRoZSBzZXF1ZW5jZQppbiBhIGZvcndhcmQgZGlyZWN0aW9uIGFuZCB0aGVuIGNhbGwgdGhlIFxmdW5jdGlvbntyZXZlcnNlZCgpfQpmdW5jdGlvbi4KClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGZvciBpIGluIHJldmVyc2VkKHhyYW5nZSgxLDEwLDIpKToKLi4uICAgICBwcmludCBpCi4uLgo5CjcKNQozCjEKXGVuZHt2ZXJiYXRpbX0KClRvIGxvb3Agb3ZlciBhIHNlcXVlbmNlIGluIHNvcnRlZCBvcmRlciwgdXNlIHRoZSBcZnVuY3Rpb257c29ydGVkKCl9CmZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYSBuZXcgc29ydGVkIGxpc3Qgd2hpbGUgbGVhdmluZyB0aGUgc291cmNlCnVuYWx0ZXJlZC4KClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGJhc2tldCA9IFsnYXBwbGUnLCAnb3JhbmdlJywgJ2FwcGxlJywgJ3BlYXInLCAnb3JhbmdlJywgJ2JhbmFuYSddCj4+PiBmb3IgZiBpbiBzb3J0ZWQoc2V0KGJhc2tldCkpOgouLi4gICAgIHByaW50IGYKLi4uIAkKYXBwbGUKYmFuYW5hCm9yYW5nZQpwZWFyClxlbmR7dmVyYmF0aW19Cgpcc2VjdGlvbntNb3JlIG9uIENvbmRpdGlvbnMgXGxhYmVse2NvbmRpdGlvbnN9fQoKVGhlIGNvbmRpdGlvbnMgdXNlZCBpbiBcY29kZXt3aGlsZX0gYW5kIFxjb2Rle2lmfSBzdGF0ZW1lbnRzIGNhbgpjb250YWluIGFueSBvcGVyYXRvcnMsIG5vdCBqdXN0IGNvbXBhcmlzb25zLgoKVGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzIFxjb2Rle2lufSBhbmQgXGNvZGV7bm90IGlufSBjaGVjayB3aGV0aGVyIGEgdmFsdWUKb2NjdXJzIChkb2VzIG5vdCBvY2N1cikgaW4gYSBzZXF1ZW5jZS4gIFRoZSBvcGVyYXRvcnMgXGNvZGV7aXN9IGFuZApcY29kZXtpcyBub3R9IGNvbXBhcmUgd2hldGhlciB0d28gb2JqZWN0cyBhcmUgcmVhbGx5IHRoZSBzYW1lIG9iamVjdDsgdGhpcwpvbmx5IG1hdHRlcnMgZm9yIG11dGFibGUgb2JqZWN0cyBsaWtlIGxpc3RzLiAgQWxsIGNvbXBhcmlzb24gb3BlcmF0b3JzCmhhdmUgdGhlIHNhbWUgcHJpb3JpdHksIHdoaWNoIGlzIGxvd2VyIHRoYW4gdGhhdCBvZiBhbGwgbnVtZXJpY2FsCm9wZXJhdG9ycy4KCkNvbXBhcmlzb25zIGNhbiBiZSBjaGFpbmVkLiAgRm9yIGV4YW1wbGUsIFxjb2Rle2EgPCBiID09IGN9IHRlc3RzCndoZXRoZXIgXGNvZGV7YX0gaXMgbGVzcyB0aGFuIFxjb2Rle2J9IGFuZCBtb3Jlb3ZlciBcY29kZXtifSBlcXVhbHMKXGNvZGV7Y30uCgpDb21wYXJpc29ucyBtYXkgYmUgY29tYmluZWQgYnkgdGhlIEJvb2xlYW4gb3BlcmF0b3JzIFxjb2Rle2FuZH0gYW5kClxjb2Rle29yfSwgYW5kIHRoZSBvdXRjb21lIG9mIGEgY29tcGFyaXNvbiAob3Igb2YgYW55IG90aGVyIEJvb2xlYW4KZXhwcmVzc2lvbikgbWF5IGJlIG5lZ2F0ZWQgd2l0aCBcY29kZXtub3R9LiAgVGhlc2UgaGF2ZSBsb3dlcgpwcmlvcml0aWVzIHRoYW4gY29tcGFyaXNvbiBvcGVyYXRvcnM7IGJldHdlZW4gdGhlbSwgXGNvZGV7bm90fSBoYXMKdGhlIGhpZ2hlc3QgcHJpb3JpdHkgYW5kIFxjb2Rle29yfSB0aGUgbG93ZXN0LCBzbyB0aGF0Clxjb2Rle0EgYW5kIG5vdCBCIG9yIEN9IGlzIGVxdWl2YWxlbnQgdG8gXGNvZGV7KEEgYW5kIChub3QgQikpIG9yIEN9LgpBcyBhbHdheXMsIHBhcmVudGhlc2VzIGNhbiBiZSB1c2VkIHRvIGV4cHJlc3MgdGhlIGRlc2lyZWQgY29tcG9zaXRpb24uCgpUaGUgQm9vbGVhbiBvcGVyYXRvcnMgXGNvZGV7YW5kfSBhbmQgXGNvZGV7b3J9IGFyZSBzby1jYWxsZWQKXGVtcGh7c2hvcnQtY2lyY3VpdH0gb3BlcmF0b3JzOiB0aGVpciBhcmd1bWVudHMgYXJlIGV2YWx1YXRlZCBmcm9tCmxlZnQgdG8gcmlnaHQsIGFuZCBldmFsdWF0aW9uIHN0b3BzIGFzIHNvb24gYXMgdGhlIG91dGNvbWUgaXMKZGV0ZXJtaW5lZC4gIEZvciBleGFtcGxlLCBpZiBcY29kZXtBfSBhbmQgXGNvZGV7Q30gYXJlIHRydWUgYnV0Clxjb2Rle0J9IGlzIGZhbHNlLCBcY29kZXtBIGFuZCBCIGFuZCBDfSBkb2VzIG5vdCBldmFsdWF0ZSB0aGUKZXhwcmVzc2lvbiBcY29kZXtDfS4gIEluIGdlbmVyYWwsIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBzaG9ydC1jaXJjdWl0Cm9wZXJhdG9yLCB3aGVuIHVzZWQgYXMgYSBnZW5lcmFsIHZhbHVlIGFuZCBub3QgYXMgYSBCb29sZWFuLCBpcyB0aGUKbGFzdCBldmFsdWF0ZWQgYXJndW1lbnQuCgpJdCBpcyBwb3NzaWJsZSB0byBhc3NpZ24gdGhlIHJlc3VsdCBvZiBhIGNvbXBhcmlzb24gb3Igb3RoZXIgQm9vbGVhbgpleHByZXNzaW9uIHRvIGEgdmFyaWFibGUuICBGb3IgZXhhbXBsZSwKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHN0cmluZzEsIHN0cmluZzIsIHN0cmluZzMgPSAnJywgJ1Ryb25kaGVpbScsICdIYW1tZXIgRGFuY2UnCj4+PiBub25fbnVsbCA9IHN0cmluZzEgb3Igc3RyaW5nMiBvciBzdHJpbmczCj4+PiBub25fbnVsbAonVHJvbmRoZWltJwpcZW5ke3ZlcmJhdGltfQoKTm90ZSB0aGF0IGluIFB5dGhvbiwgdW5saWtlIEMsIGFzc2lnbm1lbnQgY2Fubm90IG9jY3VyIGluc2lkZSBleHByZXNzaW9ucy4KQyBwcm9ncmFtbWVycyBtYXkgZ3J1bWJsZSBhYm91dCB0aGlzLCBidXQgaXQgYXZvaWRzIGEgY29tbW9uIGNsYXNzIG9mCnByb2JsZW1zIGVuY291bnRlcmVkIGluIEMgcHJvZ3JhbXM6IHR5cGluZyBcY29kZXs9fSBpbiBhbiBleHByZXNzaW9uIHdoZW4KXGNvZGV7PT19IHdhcyBpbnRlbmRlZC4KCgpcc2VjdGlvbntDb21wYXJpbmcgU2VxdWVuY2VzIGFuZCBPdGhlciBUeXBlcyBcbGFiZWx7Y29tcGFyaW5nfX0KClNlcXVlbmNlIG9iamVjdHMgbWF5IGJlIGNvbXBhcmVkIHRvIG90aGVyIG9iamVjdHMgd2l0aCB0aGUgc2FtZQpzZXF1ZW5jZSB0eXBlLiAgVGhlIGNvbXBhcmlzb24gdXNlcyBcZW1waHtsZXhpY29ncmFwaGljYWx9IG9yZGVyaW5nOgpmaXJzdCB0aGUgZmlyc3QgdHdvIGl0ZW1zIGFyZSBjb21wYXJlZCwgYW5kIGlmIHRoZXkgZGlmZmVyIHRoaXMKZGV0ZXJtaW5lcyB0aGUgb3V0Y29tZSBvZiB0aGUgY29tcGFyaXNvbjsgaWYgdGhleSBhcmUgZXF1YWwsIHRoZSBuZXh0CnR3byBpdGVtcyBhcmUgY29tcGFyZWQsIGFuZCBzbyBvbiwgdW50aWwgZWl0aGVyIHNlcXVlbmNlIGlzIGV4aGF1c3RlZC4KSWYgdHdvIGl0ZW1zIHRvIGJlIGNvbXBhcmVkIGFyZSB0aGVtc2VsdmVzIHNlcXVlbmNlcyBvZiB0aGUgc2FtZSB0eXBlLAp0aGUgbGV4aWNvZ3JhcGhpY2FsIGNvbXBhcmlzb24gaXMgY2FycmllZCBvdXQgcmVjdXJzaXZlbHkuICBJZiBhbGwKaXRlbXMgb2YgdHdvIHNlcXVlbmNlcyBjb21wYXJlIGVxdWFsLCB0aGUgc2VxdWVuY2VzIGFyZSBjb25zaWRlcmVkCmVxdWFsLiAgSWYgb25lIHNlcXVlbmNlIGlzIGFuIGluaXRpYWwgc3ViLXNlcXVlbmNlIG9mIHRoZSBvdGhlciwgdGhlCnNob3J0ZXIgc2VxdWVuY2UgaXMgdGhlIHNtYWxsZXIgKGxlc3Nlcikgb25lLiAgTGV4aWNvZ3JhcGhpY2FsCm9yZGVyaW5nIGZvciBzdHJpbmdzIHVzZXMgdGhlIFxBU0NJSXt9IG9yZGVyaW5nIGZvciBpbmRpdmlkdWFsCmNoYXJhY3RlcnMuICBTb21lIGV4YW1wbGVzIG9mIGNvbXBhcmlzb25zIGJldHdlZW4gc2VxdWVuY2VzIHdpdGggdGhlCnNhbWUgdHlwZXM6CgpcYmVnaW57dmVyYmF0aW19CigxLCAyLCAzKSAgICAgICAgICAgICAgPCAoMSwgMiwgNCkKWzEsIDIsIDNdICAgICAgICAgICAgICA8IFsxLCAyLCA0XQonQUJDJyA8ICdDJyA8ICdQYXNjYWwnIDwgJ1B5dGhvbicKKDEsIDIsIDMsIDQpICAgICAgICAgICA8ICgxLCAyLCA0KQooMSwgMikgICAgICAgICAgICAgICAgIDwgKDEsIDIsIC0xKQooMSwgMiwgMykgICAgICAgICAgICAgPT0gKDEuMCwgMi4wLCAzLjApCigxLCAyLCAoJ2FhJywgJ2FiJykpICAgPCAoMSwgMiwgKCdhYmMnLCAnYScpLCA0KQpcZW5ke3ZlcmJhdGltfQoKTm90ZSB0aGF0IGNvbXBhcmluZyBvYmplY3RzIG9mIGRpZmZlcmVudCB0eXBlcyBpcyBsZWdhbC4gIFRoZSBvdXRjb21lCmlzIGRldGVybWluaXN0aWMgYnV0IGFyYml0cmFyeTogdGhlIHR5cGVzIGFyZSBvcmRlcmVkIGJ5IHRoZWlyIG5hbWUuClRodXMsIGEgbGlzdCBpcyBhbHdheXMgc21hbGxlciB0aGFuIGEgc3RyaW5nLCBhIHN0cmluZyBpcyBhbHdheXMKc21hbGxlciB0aGFuIGEgdHVwbGUsIGV0Yy4gIFxmb290bm90ZXsKICAgICAgICBUaGUgcnVsZXMgZm9yIGNvbXBhcmluZyBvYmplY3RzIG9mIGRpZmZlcmVudCB0eXBlcyBzaG91bGQKICAgICAgICBub3QgYmUgcmVsaWVkIHVwb247IHRoZXkgbWF5IGNoYW5nZSBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mCiAgICAgICAgdGhlIGxhbmd1YWdlLgp9IE1peGVkIG51bWVyaWMgdHlwZXMgYXJlIGNvbXBhcmVkIGFjY29yZGluZyB0byB0aGVpciBudW1lcmljIHZhbHVlLCBzbwowIGVxdWFscyAwLjAsIGV0Yy4KCgpcY2hhcHRlcntNb2R1bGVzIFxsYWJlbHttb2R1bGVzfX0KCklmIHlvdSBxdWl0IGZyb20gdGhlIFB5dGhvbiBpbnRlcnByZXRlciBhbmQgZW50ZXIgaXQgYWdhaW4sIHRoZQpkZWZpbml0aW9ucyB5b3UgaGF2ZSBtYWRlIChmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcykgYXJlIGxvc3QuClRoZXJlZm9yZSwgaWYgeW91IHdhbnQgdG8gd3JpdGUgYSBzb21ld2hhdCBsb25nZXIgcHJvZ3JhbSwgeW91IGFyZQpiZXR0ZXIgb2ZmIHVzaW5nIGEgdGV4dCBlZGl0b3IgdG8gcHJlcGFyZSB0aGUgaW5wdXQgZm9yIHRoZSBpbnRlcnByZXRlcgphbmQgcnVubmluZyBpdCB3aXRoIHRoYXQgZmlsZSBhcyBpbnB1dCBpbnN0ZWFkLiAgVGhpcyBpcyBrbm93biBhcyBjcmVhdGluZyBhClxlbXBoe3NjcmlwdH0uICBBcyB5b3VyIHByb2dyYW0gZ2V0cyBsb25nZXIsIHlvdSBtYXkgd2FudCB0byBzcGxpdCBpdAppbnRvIHNldmVyYWwgZmlsZXMgZm9yIGVhc2llciBtYWludGVuYW5jZS4gIFlvdSBtYXkgYWxzbyB3YW50IHRvIHVzZSBhCmhhbmR5IGZ1bmN0aW9uIHRoYXQgeW91J3ZlIHdyaXR0ZW4gaW4gc2V2ZXJhbCBwcm9ncmFtcyB3aXRob3V0IGNvcHlpbmcKaXRzIGRlZmluaXRpb24gaW50byBlYWNoIHByb2dyYW0uCgpUbyBzdXBwb3J0IHRoaXMsIFB5dGhvbiBoYXMgYSB3YXkgdG8gcHV0IGRlZmluaXRpb25zIGluIGEgZmlsZSBhbmQgdXNlCnRoZW0gaW4gYSBzY3JpcHQgb3IgaW4gYW4gaW50ZXJhY3RpdmUgaW5zdGFuY2Ugb2YgdGhlIGludGVycHJldGVyLgpTdWNoIGEgZmlsZSBpcyBjYWxsZWQgYSBcZW1waHttb2R1bGV9OyBkZWZpbml0aW9ucyBmcm9tIGEgbW9kdWxlIGNhbiBiZQpcZW1waHtpbXBvcnRlZH0gaW50byBvdGhlciBtb2R1bGVzIG9yIGludG8gdGhlIFxlbXBoe21haW59IG1vZHVsZSAodGhlCmNvbGxlY3Rpb24gb2YgdmFyaWFibGVzIHRoYXQgeW91IGhhdmUgYWNjZXNzIHRvIGluIGEgc2NyaXB0CmV4ZWN1dGVkIGF0IHRoZSB0b3AgbGV2ZWwKYW5kIGluIGNhbGN1bGF0b3IgbW9kZSkuCgpBIG1vZHVsZSBpcyBhIGZpbGUgY29udGFpbmluZyBQeXRob24gZGVmaW5pdGlvbnMgYW5kIHN0YXRlbWVudHMuICBUaGUKZmlsZSBuYW1lIGlzIHRoZSBtb2R1bGUgbmFtZSB3aXRoIHRoZSBzdWZmaXggXGZpbGV7LnB5fSBhcHBlbmRlZC4gIFdpdGhpbgphIG1vZHVsZSwgdGhlIG1vZHVsZSdzIG5hbWUgKGFzIGEgc3RyaW5nKSBpcyBhdmFpbGFibGUgYXMgdGhlIHZhbHVlIG9mCnRoZSBnbG9iYWwgdmFyaWFibGUgXGNvZGV7X19uYW1lX199LiAgRm9yIGluc3RhbmNlLCB1c2UgeW91ciBmYXZvcml0ZSB0ZXh0CmVkaXRvciB0byBjcmVhdGUgYSBmaWxlIGNhbGxlZCBcZmlsZXtmaWJvLnB5fSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkKd2l0aCB0aGUgZm9sbG93aW5nIGNvbnRlbnRzOgoKXGJlZ2lue3ZlcmJhdGltfQojIEZpYm9uYWNjaSBudW1iZXJzIG1vZHVsZQoKZGVmIGZpYihuKTogICAgIyB3cml0ZSBGaWJvbmFjY2kgc2VyaWVzIHVwIHRvIG4KICAgIGEsIGIgPSAwLCAxCiAgICB3aGlsZSBiIDwgbjoKICAgICAgICBwcmludCBiLAogICAgICAgIGEsIGIgPSBiLCBhK2IKCmRlZiBmaWIyKG4pOiAjIHJldHVybiBGaWJvbmFjY2kgc2VyaWVzIHVwIHRvIG4KICAgIHJlc3VsdCA9IFtdCiAgICBhLCBiID0gMCwgMQogICAgd2hpbGUgYiA8IG46CiAgICAgICAgcmVzdWx0LmFwcGVuZChiKQogICAgICAgIGEsIGIgPSBiLCBhK2IKICAgIHJldHVybiByZXN1bHQKXGVuZHt2ZXJiYXRpbX0KCk5vdyBlbnRlciB0aGUgUHl0aG9uIGludGVycHJldGVyIGFuZCBpbXBvcnQgdGhpcyBtb2R1bGUgd2l0aCB0aGUKZm9sbG93aW5nIGNvbW1hbmQ6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBpbXBvcnQgZmlibwpcZW5ke3ZlcmJhdGltfQoKVGhpcyBkb2VzIG5vdCBlbnRlciB0aGUgbmFtZXMgb2YgdGhlIGZ1bmN0aW9ucyBkZWZpbmVkIGluIFxjb2Rle2ZpYm99IApkaXJlY3RseSBpbiB0aGUgY3VycmVudCBzeW1ib2wgdGFibGU7IGl0IG9ubHkgZW50ZXJzIHRoZSBtb2R1bGUgbmFtZQpcY29kZXtmaWJvfSB0aGVyZS4KVXNpbmcgdGhlIG1vZHVsZSBuYW1lIHlvdSBjYW4gYWNjZXNzIHRoZSBmdW5jdGlvbnM6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBmaWJvLmZpYigxMDAwKQoxIDEgMiAzIDUgOCAxMyAyMSAzNCA1NSA4OSAxNDQgMjMzIDM3NyA2MTAgOTg3Cj4+PiBmaWJvLmZpYjIoMTAwKQpbMSwgMSwgMiwgMywgNSwgOCwgMTMsIDIxLCAzNCwgNTUsIDg5XQo+Pj4gZmliby5fX25hbWVfXwonZmlibycKXGVuZHt2ZXJiYXRpbX0KCklmIHlvdSBpbnRlbmQgdG8gdXNlIGEgZnVuY3Rpb24gb2Z0ZW4geW91IGNhbiBhc3NpZ24gaXQgdG8gYSBsb2NhbCBuYW1lOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gZmliID0gZmliby5maWIKPj4+IGZpYig1MDApCjEgMSAyIDMgNSA4IDEzIDIxIDM0IDU1IDg5IDE0NCAyMzMgMzc3ClxlbmR7dmVyYmF0aW19CgoKXHNlY3Rpb257TW9yZSBvbiBNb2R1bGVzIFxsYWJlbHttb3JlTW9kdWxlc319CgpBIG1vZHVsZSBjYW4gY29udGFpbiBleGVjdXRhYmxlIHN0YXRlbWVudHMgYXMgd2VsbCBhcyBmdW5jdGlvbgpkZWZpbml0aW9ucy4KVGhlc2Ugc3RhdGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gaW5pdGlhbGl6ZSB0aGUgbW9kdWxlLgpUaGV5IGFyZSBleGVjdXRlZCBvbmx5IHRoZQpcZW1waHtmaXJzdH0gdGltZSB0aGUgbW9kdWxlIGlzIGltcG9ydGVkIHNvbWV3aGVyZS5cZm9vdG5vdGV7CiAgICAgICAgSW4gZmFjdCBmdW5jdGlvbiBkZWZpbml0aW9ucyBhcmUgYWxzbyBgc3RhdGVtZW50cycgdGhhdCBhcmUKICAgICAgICBgZXhlY3V0ZWQnOyB0aGUgZXhlY3V0aW9uIGVudGVycyB0aGUgZnVuY3Rpb24gbmFtZSBpbiB0aGUKICAgICAgICBtb2R1bGUncyBnbG9iYWwgc3ltYm9sIHRhYmxlLgp9CgpFYWNoIG1vZHVsZSBoYXMgaXRzIG93biBwcml2YXRlIHN5bWJvbCB0YWJsZSwgd2hpY2ggaXMgdXNlZCBhcyB0aGUKZ2xvYmFsIHN5bWJvbCB0YWJsZSBieSBhbGwgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1vZHVsZS4KVGh1cywgdGhlIGF1dGhvciBvZiBhIG1vZHVsZSBjYW4gdXNlIGdsb2JhbCB2YXJpYWJsZXMgaW4gdGhlIG1vZHVsZQp3aXRob3V0IHdvcnJ5aW5nIGFib3V0IGFjY2lkZW50YWwgY2xhc2hlcyB3aXRoIGEgdXNlcidzIGdsb2JhbAp2YXJpYWJsZXMuCk9uIHRoZSBvdGhlciBoYW5kLCBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcgeW91IGNhbiB0b3VjaCBhCm1vZHVsZSdzIGdsb2JhbCB2YXJpYWJsZXMgd2l0aCB0aGUgc2FtZSBub3RhdGlvbiB1c2VkIHRvIHJlZmVyIHRvIGl0cwpmdW5jdGlvbnMsClxjb2Rle21vZG5hbWUuaXRlbW5hbWV9LgoKTW9kdWxlcyBjYW4gaW1wb3J0IG90aGVyIG1vZHVsZXMuICBJdCBpcyBjdXN0b21hcnkgYnV0IG5vdCByZXF1aXJlZCB0bwpwbGFjZSBhbGwgXGtleXdvcmR7aW1wb3J0fSBzdGF0ZW1lbnRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBtb2R1bGUgKG9yCnNjcmlwdCwgZm9yIHRoYXQgbWF0dGVyKS4gIFRoZSBpbXBvcnRlZCBtb2R1bGUgbmFtZXMgYXJlIHBsYWNlZCBpbiB0aGUKaW1wb3J0aW5nIG1vZHVsZSdzIGdsb2JhbCBzeW1ib2wgdGFibGUuCgpUaGVyZSBpcyBhIHZhcmlhbnQgb2YgdGhlIFxrZXl3b3Jke2ltcG9ydH0gc3RhdGVtZW50IHRoYXQgaW1wb3J0cwpuYW1lcyBmcm9tIGEgbW9kdWxlIGRpcmVjdGx5IGludG8gdGhlIGltcG9ydGluZyBtb2R1bGUncyBzeW1ib2wKdGFibGUuICBGb3IgZXhhbXBsZToKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGZyb20gZmlibyBpbXBvcnQgZmliLCBmaWIyCj4+PiBmaWIoNTAwKQoxIDEgMiAzIDUgOCAxMyAyMSAzNCA1NSA4OSAxNDQgMjMzIDM3NwpcZW5ke3ZlcmJhdGltfQoKVGhpcyBkb2VzIG5vdCBpbnRyb2R1Y2UgdGhlIG1vZHVsZSBuYW1lIGZyb20gd2hpY2ggdGhlIGltcG9ydHMgYXJlIHRha2VuCmluIHRoZSBsb2NhbCBzeW1ib2wgdGFibGUgKHNvIGluIHRoZSBleGFtcGxlLCBcY29kZXtmaWJvfSBpcyBub3QKZGVmaW5lZCkuCgpUaGVyZSBpcyBldmVuIGEgdmFyaWFudCB0byBpbXBvcnQgYWxsIG5hbWVzIHRoYXQgYSBtb2R1bGUgZGVmaW5lczoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGZyb20gZmlibyBpbXBvcnQgKgo+Pj4gZmliKDUwMCkKMSAxIDIgMyA1IDggMTMgMjEgMzQgNTUgODkgMTQ0IDIzMyAzNzcKXGVuZHt2ZXJiYXRpbX0KClRoaXMgaW1wb3J0cyBhbGwgbmFtZXMgZXhjZXB0IHRob3NlIGJlZ2lubmluZyB3aXRoIGFuIHVuZGVyc2NvcmUKKFxjb2Rle199KS4KCgpcc3Vic2VjdGlvbntUaGUgTW9kdWxlIFNlYXJjaCBQYXRoIFxsYWJlbHtzZWFyY2hQYXRofX0KClxpbmRleGlpaXttb2R1bGV9e3NlYXJjaH17cGF0aH0KV2hlbiBhIG1vZHVsZSBuYW1lZCBcbW9kdWxle3NwYW19IGlzIGltcG9ydGVkLCB0aGUgaW50ZXJwcmV0ZXIgc2VhcmNoZXMKZm9yIGEgZmlsZSBuYW1lZCBcZmlsZXtzcGFtLnB5fSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksCmFuZCB0aGVuIGluIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieQp0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgXGVudnZhcntQWVRIT05QQVRIfS4gIFRoaXMgaGFzIHRoZSBzYW1lIHN5bnRheCBhcwp0aGUgc2hlbGwgdmFyaWFibGUgXGVudnZhcntQQVRIfSwgdGhhdCBpcywgYSBsaXN0IG9mCmRpcmVjdG9yeSBuYW1lcy4gIFdoZW4gXGVudnZhcntQWVRIT05QQVRIfSBpcyBub3Qgc2V0LCBvciB3aGVuIHRoZSBmaWxlCmlzIG5vdCBmb3VuZCB0aGVyZSwgdGhlIHNlYXJjaCBjb250aW51ZXMgaW4gYW4gaW5zdGFsbGF0aW9uLWRlcGVuZGVudApkZWZhdWx0IHBhdGg7IG9uIFxVTklYLCB0aGlzIGlzIHVzdWFsbHkgXGZpbGV7LjovdXNyL2xvY2FsL2xpYi9weXRob259LgoKQWN0dWFsbHksIG1vZHVsZXMgYXJlIHNlYXJjaGVkIGluIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIGdpdmVuIGJ5IHRoZSAKdmFyaWFibGUgXGNvZGV7c3lzLnBhdGh9IHdoaWNoIGlzIGluaXRpYWxpemVkIGZyb20gdGhlIGRpcmVjdG9yeSAKY29udGFpbmluZyB0aGUgaW5wdXQgc2NyaXB0IChvciB0aGUgY3VycmVudCBkaXJlY3RvcnkpLApcZW52dmFye1BZVEhPTlBBVEh9IGFuZCB0aGUgaW5zdGFsbGF0aW9uLWRlcGVuZGVudCBkZWZhdWx0LiAgVGhpcyBhbGxvd3MKUHl0aG9uIHByb2dyYW1zIHRoYXQga25vdyB3aGF0IHRoZXkncmUgZG9pbmcgdG8gbW9kaWZ5IG9yIHJlcGxhY2UgdGhlIAptb2R1bGUgc2VhcmNoIHBhdGguICBOb3RlIHRoYXQgYmVjYXVzZSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlCnNjcmlwdCBiZWluZyBydW4gaXMgb24gdGhlIHNlYXJjaCBwYXRoLCBpdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGUKc2NyaXB0IG5vdCBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgYSBzdGFuZGFyZCBtb2R1bGUsIG9yIFB5dGhvbiB3aWxsCmF0dGVtcHQgdG8gbG9hZCB0aGUgc2NyaXB0IGFzIGEgbW9kdWxlIHdoZW4gdGhhdCBtb2R1bGUgaXMgaW1wb3J0ZWQuClRoaXMgd2lsbCBnZW5lcmFsbHkgYmUgYW4gZXJyb3IuICBTZWUgc2VjdGlvbn5ccmVme3N0YW5kYXJkTW9kdWxlc30sCmBgU3RhbmRhcmQgTW9kdWxlcywnJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KCgpcc3Vic2VjdGlvbntgYENvbXBpbGVkJycgUHl0aG9uIGZpbGVzfQoKQXMgYW4gaW1wb3J0YW50IHNwZWVkLXVwIG9mIHRoZSBzdGFydC11cCB0aW1lIGZvciBzaG9ydCBwcm9ncmFtcyB0aGF0CnVzZSBhIGxvdCBvZiBzdGFuZGFyZCBtb2R1bGVzLCBpZiBhIGZpbGUgY2FsbGVkIFxmaWxle3NwYW0ucHljfSBleGlzdHMKaW4gdGhlIGRpcmVjdG9yeSB3aGVyZSBcZmlsZXtzcGFtLnB5fSBpcyBmb3VuZCwgdGhpcyBpcyBhc3N1bWVkIHRvCmNvbnRhaW4gYW4gYWxyZWFkeS1gYGJ5dGUtY29tcGlsZWQnJyB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUgXG1vZHVsZXtzcGFtfS4KVGhlIG1vZGlmaWNhdGlvbiB0aW1lIG9mIHRoZSB2ZXJzaW9uIG9mIFxmaWxle3NwYW0ucHl9IHVzZWQgdG8gY3JlYXRlClxmaWxle3NwYW0ucHljfSBpcyByZWNvcmRlZCBpbiBcZmlsZXtzcGFtLnB5Y30sIGFuZCB0aGUKXGZpbGV7LnB5Y30gZmlsZSBpcyBpZ25vcmVkIGlmIHRoZXNlIGRvbid0IG1hdGNoLgoKTm9ybWFsbHksIHlvdSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIHRvIGNyZWF0ZSB0aGUKXGZpbGV7c3BhbS5weWN9IGZpbGUuICBXaGVuZXZlciBcZmlsZXtzcGFtLnB5fSBpcyBzdWNjZXNzZnVsbHkKY29tcGlsZWQsIGFuIGF0dGVtcHQgaXMgbWFkZSB0byB3cml0ZSB0aGUgY29tcGlsZWQgdmVyc2lvbiB0bwpcZmlsZXtzcGFtLnB5Y30uICBJdCBpcyBub3QgYW4gZXJyb3IgaWYgdGhpcyBhdHRlbXB0IGZhaWxzOyBpZiBmb3IgYW55CnJlYXNvbiB0aGUgZmlsZSBpcyBub3Qgd3JpdHRlbiBjb21wbGV0ZWx5LCB0aGUgcmVzdWx0aW5nClxmaWxle3NwYW0ucHljfSBmaWxlIHdpbGwgYmUgcmVjb2duaXplZCBhcyBpbnZhbGlkIGFuZCB0aHVzIGlnbm9yZWQKbGF0ZXIuICBUaGUgY29udGVudHMgb2YgdGhlIFxmaWxle3NwYW0ucHljfSBmaWxlIGFyZSBwbGF0Zm9ybQppbmRlcGVuZGVudCwgc28gYSBQeXRob24gbW9kdWxlIGRpcmVjdG9yeSBjYW4gYmUgc2hhcmVkIGJ5IG1hY2hpbmVzIG9mCmRpZmZlcmVudCBhcmNoaXRlY3R1cmVzLgoKU29tZSB0aXBzIGZvciBleHBlcnRzOgoKXGJlZ2lue2l0ZW1pemV9CgpcaXRlbQpXaGVuIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgaXMgaW52b2tlZCB3aXRoIHRoZSBccHJvZ3JhbW9wdHstT30gZmxhZywKb3B0aW1pemVkIGNvZGUgaXMgZ2VuZXJhdGVkIGFuZCBzdG9yZWQgaW4gXGZpbGV7LnB5b30gZmlsZXMuICBUaGUKb3B0aW1pemVyIGN1cnJlbnRseSBkb2Vzbid0IGhlbHAgbXVjaDsgaXQgb25seSByZW1vdmVzClxrZXl3b3Jke2Fzc2VydH0gc3RhdGVtZW50cy4gIFdoZW4gXHByb2dyYW1vcHR7LU99IGlzIHVzZWQsIFxlbXBoe2FsbH0KYnl0ZWNvZGUgaXMgb3B0aW1pemVkOyBcY29kZXsucHljfSBmaWxlcyBhcmUgaWdub3JlZCBhbmQgXGNvZGV7LnB5fQpmaWxlcyBhcmUgY29tcGlsZWQgdG8gb3B0aW1pemVkIGJ5dGVjb2RlLgoKXGl0ZW0KUGFzc2luZyB0d28gXHByb2dyYW1vcHR7LU99IGZsYWdzIHRvIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIKKFxwcm9ncmFtb3B0ey1PT30pIHdpbGwgY2F1c2UgdGhlIGJ5dGVjb2RlIGNvbXBpbGVyIHRvIHBlcmZvcm0Kb3B0aW1pemF0aW9ucyB0aGF0IGNvdWxkIGluIHNvbWUgcmFyZSBjYXNlcyByZXN1bHQgaW4gbWFsZnVuY3Rpb25pbmcKcHJvZ3JhbXMuICBDdXJyZW50bHkgb25seSBcY29kZXtfX2RvY19ffSBzdHJpbmdzIGFyZSByZW1vdmVkIGZyb20gdGhlCmJ5dGVjb2RlLCByZXN1bHRpbmcgaW4gbW9yZSBjb21wYWN0IFxmaWxley5weW99IGZpbGVzLiAgU2luY2Ugc29tZQpwcm9ncmFtcyBtYXkgcmVseSBvbiBoYXZpbmcgdGhlc2UgYXZhaWxhYmxlLCB5b3Ugc2hvdWxkIG9ubHkgdXNlIHRoaXMKb3B0aW9uIGlmIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLgoKXGl0ZW0KQSBwcm9ncmFtIGRvZXNuJ3QgcnVuIGFueSBmYXN0ZXIgd2hlbiBpdCBpcyByZWFkIGZyb20gYSBcZmlsZXsucHljfSBvcgpcZmlsZXsucHlvfSBmaWxlIHRoYW4gd2hlbiBpdCBpcyByZWFkIGZyb20gYSBcZmlsZXsucHl9IGZpbGU7IHRoZSBvbmx5CnRoaW5nIHRoYXQncyBmYXN0ZXIgYWJvdXQgXGZpbGV7LnB5Y30gb3IgXGZpbGV7LnB5b30gZmlsZXMgaXMgdGhlCnNwZWVkIHdpdGggd2hpY2ggdGhleSBhcmUgbG9hZGVkLgoKXGl0ZW0KV2hlbiBhIHNjcmlwdCBpcyBydW4gYnkgZ2l2aW5nIGl0cyBuYW1lIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZQpieXRlY29kZSBmb3IgdGhlIHNjcmlwdCBpcyBuZXZlciB3cml0dGVuIHRvIGEgXGZpbGV7LnB5Y30gb3IKXGZpbGV7LnB5b30gZmlsZS4gIFRodXMsIHRoZSBzdGFydHVwIHRpbWUgb2YgYSBzY3JpcHQgbWF5IGJlIHJlZHVjZWQKYnkgbW92aW5nIG1vc3Qgb2YgaXRzIGNvZGUgdG8gYSBtb2R1bGUgYW5kIGhhdmluZyBhIHNtYWxsIGJvb3RzdHJhcApzY3JpcHQgdGhhdCBpbXBvcnRzIHRoYXQgbW9kdWxlLiAgSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBuYW1lIGEKXGZpbGV7LnB5Y30gb3IgXGZpbGV7LnB5b30gZmlsZSBkaXJlY3RseSBvbiB0aGUgY29tbWFuZCBsaW5lLgoKXGl0ZW0KSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBhIGZpbGUgY2FsbGVkIFxmaWxle3NwYW0ucHljfSAob3IKXGZpbGV7c3BhbS5weW99IHdoZW4gXHByb2dyYW1vcHR7LU99IGlzIHVzZWQpIHdpdGhvdXQgYSBmaWxlClxmaWxle3NwYW0ucHl9IGZvciB0aGUgc2FtZSBtb2R1bGUuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGRpc3RyaWJ1dGUgYQpsaWJyYXJ5IG9mIFB5dGhvbiBjb2RlIGluIGEgZm9ybSB0aGF0IGlzIG1vZGVyYXRlbHkgaGFyZCB0byByZXZlcnNlCmVuZ2luZWVyLgoKXGl0ZW0KVGhlIG1vZHVsZSBcdWxpbmt7XG1vZHVsZXtjb21waWxlYWxsfX17Li4vbGliL21vZHVsZS1jb21waWxlYWxsLmh0bWx9JQp7fSBccmVmc3Rtb2RpbmRleHtjb21waWxlYWxsfSBjYW4gY3JlYXRlIFxmaWxley5weWN9IGZpbGVzIChvcgpcZmlsZXsucHlvfSBmaWxlcyB3aGVuIFxwcm9ncmFtb3B0ey1PfSBpcyB1c2VkKSBmb3IgYWxsIG1vZHVsZXMgaW4gYQpkaXJlY3RvcnkuCgpcZW5ke2l0ZW1pemV9CgoKXHNlY3Rpb257U3RhbmRhcmQgTW9kdWxlcyBcbGFiZWx7c3RhbmRhcmRNb2R1bGVzfX0KClB5dGhvbiBjb21lcyB3aXRoIGEgbGlicmFyeSBvZiBzdGFuZGFyZCBtb2R1bGVzLCBkZXNjcmliZWQgaW4gYSBzZXBhcmF0ZQpkb2N1bWVudCwgdGhlIFxjaXRldGl0bGVbLi4vbGliL2xpYi5odG1sXXtQeXRob24gTGlicmFyeSBSZWZlcmVuY2V9CihgYExpYnJhcnkgUmVmZXJlbmNlJycgaGVyZWFmdGVyKS4gIFNvbWUgbW9kdWxlcyBhcmUgYnVpbHQgaW50byB0aGUKaW50ZXJwcmV0ZXI7IHRoZXNlIHByb3ZpZGUgYWNjZXNzIHRvIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm90IHBhcnQgb2YKdGhlIGNvcmUgb2YgdGhlIGxhbmd1YWdlIGJ1dCBhcmUgbmV2ZXJ0aGVsZXNzIGJ1aWx0IGluLCBlaXRoZXIgZm9yCmVmZmljaWVuY3kgb3IgdG8gcHJvdmlkZSBhY2Nlc3MgdG8gb3BlcmF0aW5nIHN5c3RlbSBwcmltaXRpdmVzIHN1Y2ggYXMKc3lzdGVtIGNhbGxzLiAgVGhlIHNldCBvZiBzdWNoIG1vZHVsZXMgaXMgYSBjb25maWd1cmF0aW9uIG9wdGlvbiB3aGljaAphbHNvIGRlcGVuZHMgb24gdGhlIHVuZGVybHlpbmcgcGxhdGZvcm0gIEZvciBleGFtcGxlLAp0aGUgXG1vZHVsZXthbW9lYmF9IG1vZHVsZSBpcyBvbmx5IHByb3ZpZGVkIG9uIHN5c3RlbXMgdGhhdCBzb21laG93CnN1cHBvcnQgQW1vZWJhIHByaW1pdGl2ZXMuICBPbmUgcGFydGljdWxhciBtb2R1bGUgZGVzZXJ2ZXMgc29tZQphdHRlbnRpb246IFx1bGlua3tcbW9kdWxle3N5c319ey4uL2xpYi9tb2R1bGUtc3lzLmh0bWx9JQpccmVmc3Rtb2RpbmRleHtzeXN9LCB3aGljaCBpcyBidWlsdCBpbnRvIGV2ZXJ5IApQeXRob24gaW50ZXJwcmV0ZXIuICBUaGUgdmFyaWFibGVzIFxjb2Rle3N5cy5wczF9IGFuZApcY29kZXtzeXMucHMyfSBkZWZpbmUgdGhlIHN0cmluZ3MgdXNlZCBhcyBwcmltYXJ5IGFuZCBzZWNvbmRhcnkKcHJvbXB0czoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGltcG9ydCBzeXMKPj4+IHN5cy5wczEKJz4+PiAnCj4+PiBzeXMucHMyCicuLi4gJwo+Pj4gc3lzLnBzMSA9ICdDPiAnCkM+IHByaW50ICdZdWNrIScKWXVjayEKQz4KClxlbmR7dmVyYmF0aW19CgpUaGVzZSB0d28gdmFyaWFibGVzIGFyZSBvbmx5IGRlZmluZWQgaWYgdGhlIGludGVycHJldGVyIGlzIGluCmludGVyYWN0aXZlIG1vZGUuCgpUaGUgdmFyaWFibGUgXGNvZGV7c3lzLnBhdGh9IGlzIGEgbGlzdCBvZiBzdHJpbmdzIHRoYXQgZGV0ZXJtaW5lIHRoZQppbnRlcnByZXRlcidzIHNlYXJjaCBwYXRoIGZvciBtb2R1bGVzLiBJdCBpcyBpbml0aWFsaXplZCB0byBhIGRlZmF1bHQKcGF0aCB0YWtlbiBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBcZW52dmFye1BZVEhPTlBBVEh9LCBvciBmcm9tCmEgYnVpbHQtaW4gZGVmYXVsdCBpZiBcZW52dmFye1BZVEhPTlBBVEh9IGlzIG5vdCBzZXQuICBZb3UgY2FuIG1vZGlmeQppdCB1c2luZyBzdGFuZGFyZCBsaXN0IG9wZXJhdGlvbnM6IAoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gaW1wb3J0IHN5cwo+Pj4gc3lzLnBhdGguYXBwZW5kKCcvdWZzL2d1aWRvL2xpYi9weXRob24nKQpcZW5ke3ZlcmJhdGltfQoKXHNlY3Rpb257VGhlIFxmdW5jdGlvbntkaXIoKX0gRnVuY3Rpb24gXGxhYmVse2Rpcn19CgpUaGUgYnVpbHQtaW4gZnVuY3Rpb24gXGZ1bmN0aW9ue2RpcigpfSBpcyB1c2VkIHRvIGZpbmQgb3V0IHdoaWNoIG5hbWVzCmEgbW9kdWxlIGRlZmluZXMuICBJdCByZXR1cm5zIGEgc29ydGVkIGxpc3Qgb2Ygc3RyaW5nczoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGltcG9ydCBmaWJvLCBzeXMKPj4+IGRpcihmaWJvKQpbJ19fbmFtZV9fJywgJ2ZpYicsICdmaWIyJ10KPj4+IGRpcihzeXMpClsnX19kaXNwbGF5aG9va19fJywgJ19fZG9jX18nLCAnX19leGNlcHRob29rX18nLCAnX19uYW1lX18nLCAnX19zdGRlcnJfXycsCiAnX19zdGRpbl9fJywgJ19fc3Rkb3V0X18nLCAnX2dldGZyYW1lJywgJ2FwaV92ZXJzaW9uJywgJ2FyZ3YnLCAKICdidWlsdGluX21vZHVsZV9uYW1lcycsICdieXRlb3JkZXInLCAnY2FsbHN0YXRzJywgJ2NvcHlyaWdodCcsCiAnZGlzcGxheWhvb2snLCAnZXhjX2NsZWFyJywgJ2V4Y19pbmZvJywgJ2V4Y190eXBlJywgJ2V4Y2VwdGhvb2snLAogJ2V4ZWNfcHJlZml4JywgJ2V4ZWN1dGFibGUnLCAnZXhpdCcsICdnZXRkZWZhdWx0ZW5jb2RpbmcnLCAnZ2V0ZGxvcGVuZmxhZ3MnLAogJ2dldHJlY3Vyc2lvbmxpbWl0JywgJ2dldHJlZmNvdW50JywgJ2hleHZlcnNpb24nLCAnbWF4aW50JywgJ21heHVuaWNvZGUnLAogJ21ldGFfcGF0aCcsICdtb2R1bGVzJywgJ3BhdGgnLCAncGF0aF9ob29rcycsICdwYXRoX2ltcG9ydGVyX2NhY2hlJywKICdwbGF0Zm9ybScsICdwcmVmaXgnLCAncHMxJywgJ3BzMicsICdzZXRjaGVja2ludGVydmFsJywgJ3NldGRsb3BlbmZsYWdzJywKICdzZXRwcm9maWxlJywgJ3NldHJlY3Vyc2lvbmxpbWl0JywgJ3NldHRyYWNlJywgJ3N0ZGVycicsICdzdGRpbicsICdzdGRvdXQnLAogJ3ZlcnNpb24nLCAndmVyc2lvbl9pbmZvJywgJ3dhcm5vcHRpb25zJ10KXGVuZHt2ZXJiYXRpbX0KCldpdGhvdXQgYXJndW1lbnRzLCBcZnVuY3Rpb257ZGlyKCl9IGxpc3RzIHRoZSBuYW1lcyB5b3UgaGF2ZSBkZWZpbmVkCmN1cnJlbnRseToKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGEgPSBbMSwgMiwgMywgNCwgNV0KPj4+IGltcG9ydCBmaWJvLCBzeXMKPj4+IGZpYiA9IGZpYm8uZmliCj4+PiBkaXIoKQpbJ19fbmFtZV9fJywgJ2EnLCAnZmliJywgJ2ZpYm8nLCAnc3lzJ10KXGVuZHt2ZXJiYXRpbX0KCk5vdGUgdGhhdCBpdCBsaXN0cyBhbGwgdHlwZXMgb2YgbmFtZXM6IHZhcmlhYmxlcywgbW9kdWxlcywgZnVuY3Rpb25zLCBldGMuCgpcZnVuY3Rpb257ZGlyKCl9IGRvZXMgbm90IGxpc3QgdGhlIG5hbWVzIG9mIGJ1aWx0LWluIGZ1bmN0aW9ucyBhbmQKdmFyaWFibGVzLiAgSWYgeW91IHdhbnQgYSBsaXN0IG9mIHRob3NlLCB0aGV5IGFyZSBkZWZpbmVkIGluIHRoZQpzdGFuZGFyZCBtb2R1bGUgXG1vZHVsZXtfX2J1aWx0aW5fX31ccmVmYmltb2RpbmRleHtfX2J1aWx0aW5fX306CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBpbXBvcnQgX19idWlsdGluX18KPj4+IGRpcihfX2J1aWx0aW5fXykKWydBcml0aG1ldGljRXJyb3InLCAnQXNzZXJ0aW9uRXJyb3InLCAnQXR0cmlidXRlRXJyb3InLAogJ0RlcHJlY2F0aW9uV2FybmluZycsICdFT0ZFcnJvcicsICdFbGxpcHNpcycsICdFbnZpcm9ubWVudEVycm9yJywKICdFeGNlcHRpb24nLCAnRmFsc2UnLCAnRmxvYXRpbmdQb2ludEVycm9yJywgJ0lPRXJyb3InLCAnSW1wb3J0RXJyb3InLAogJ0luZGVudGF0aW9uRXJyb3InLCAnSW5kZXhFcnJvcicsICdLZXlFcnJvcicsICdLZXlib2FyZEludGVycnVwdCcsCiAnTG9va3VwRXJyb3InLCAnTWVtb3J5RXJyb3InLCAnTmFtZUVycm9yJywgJ05vbmUnLCAnTm90SW1wbGVtZW50ZWQnLAogJ05vdEltcGxlbWVudGVkRXJyb3InLCAnT1NFcnJvcicsICdPdmVyZmxvd0Vycm9yJywgJ092ZXJmbG93V2FybmluZycsCiAnUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZycsICdSZWZlcmVuY2VFcnJvcicsCiAnUnVudGltZUVycm9yJywgJ1J1bnRpbWVXYXJuaW5nJywgJ1N0YW5kYXJkRXJyb3InLCAnU3RvcEl0ZXJhdGlvbicsCiAnU3ludGF4RXJyb3InLCAnU3ludGF4V2FybmluZycsICdTeXN0ZW1FcnJvcicsICdTeXN0ZW1FeGl0JywgJ1RhYkVycm9yJywKICdUcnVlJywgJ1R5cGVFcnJvcicsICdVbmJvdW5kTG9jYWxFcnJvcicsICdVbmljb2RlRXJyb3InLCAnVXNlcldhcm5pbmcnLAogJ1ZhbHVlRXJyb3InLCAnV2FybmluZycsICdaZXJvRGl2aXNpb25FcnJvcicsICdfX2RlYnVnX18nLCAnX19kb2NfXycsCiAnX19pbXBvcnRfXycsICdfX25hbWVfXycsICdhYnMnLCAnYXBwbHknLCAnYm9vbCcsICdidWZmZXInLAogJ2NhbGxhYmxlJywgJ2NocicsICdjbGFzc21ldGhvZCcsICdjbXAnLCAnY29lcmNlJywgJ2NvbXBpbGUnLCAnY29tcGxleCcsCiAnY29weXJpZ2h0JywgJ2NyZWRpdHMnLCAnZGVsYXR0cicsICdkaWN0JywgJ2RpcicsICdkaXZtb2QnLAogJ2VudW1lcmF0ZScsICdldmFsJywgJ2V4ZWNmaWxlJywgJ2V4aXQnLCAnZmlsZScsICdmaWx0ZXInLCAnZmxvYXQnLAogJ2dldGF0dHInLCAnZ2xvYmFscycsICdoYXNhdHRyJywgJ2hhc2gnLCAnaGVscCcsICdoZXgnLCAnaWQnLAogJ2lucHV0JywgJ2ludCcsICdpbnRlcm4nLCAnaXNpbnN0YW5jZScsICdpc3N1YmNsYXNzJywgJ2l0ZXInLAogJ2xlbicsICdsaWNlbnNlJywgJ2xpc3QnLCAnbG9jYWxzJywgJ2xvbmcnLCAnbWFwJywgJ21heCcsICdtaW4nLAogJ29iamVjdCcsICdvY3QnLCAnb3BlbicsICdvcmQnLCAncG93JywgJ3Byb3BlcnR5JywgJ3F1aXQnLAogJ3JhbmdlJywgJ3Jhd19pbnB1dCcsICdyZWR1Y2UnLCAncmVsb2FkJywgJ3JlcHInLCAncm91bmQnLAogJ3NldGF0dHInLCAnc2xpY2UnLCAnc3RhdGljbWV0aG9kJywgJ3N0cicsICdzdHJpbmcnLCAnc3VtJywgJ3N1cGVyJywKICd0dXBsZScsICd0eXBlJywgJ3VuaWNocicsICd1bmljb2RlJywgJ3ZhcnMnLCAneHJhbmdlJywgJ3ppcCddClxlbmR7dmVyYmF0aW19CgoKXHNlY3Rpb257UGFja2FnZXMgXGxhYmVse3BhY2thZ2VzfX0KClBhY2thZ2VzIGFyZSBhIHdheSBvZiBzdHJ1Y3R1cmluZyBQeXRob24ncyBtb2R1bGUgbmFtZXNwYWNlCmJ5IHVzaW5nIGBgZG90dGVkIG1vZHVsZSBuYW1lcycnLiAgRm9yIGV4YW1wbGUsIHRoZSBtb2R1bGUgbmFtZQpcbW9kdWxle0EuQn0gZGVzaWduYXRlcyBhIHN1Ym1vZHVsZSBuYW1lZCBcc2FtcHtCfSBpbiBhIHBhY2thZ2UgbmFtZWQKXHNhbXB7QX0uICBKdXN0IGxpa2UgdGhlIHVzZSBvZiBtb2R1bGVzIHNhdmVzIHRoZSBhdXRob3JzIG9mIGRpZmZlcmVudAptb2R1bGVzIGZyb20gaGF2aW5nIHRvIHdvcnJ5IGFib3V0IGVhY2ggb3RoZXIncyBnbG9iYWwgdmFyaWFibGUgbmFtZXMsCnRoZSB1c2Ugb2YgZG90dGVkIG1vZHVsZSBuYW1lcyBzYXZlcyB0aGUgYXV0aG9ycyBvZiBtdWx0aS1tb2R1bGUKcGFja2FnZXMgbGlrZSBOdW1QeSBvciB0aGUgUHl0aG9uIEltYWdpbmcgTGlicmFyeSBmcm9tIGhhdmluZyB0byB3b3JyeQphYm91dCBlYWNoIG90aGVyJ3MgbW9kdWxlIG5hbWVzLgoKU3VwcG9zZSB5b3Ugd2FudCB0byBkZXNpZ24gYSBjb2xsZWN0aW9uIG9mIG1vZHVsZXMgKGEgYGBwYWNrYWdlJycpIGZvcgp0aGUgdW5pZm9ybSBoYW5kbGluZyBvZiBzb3VuZCBmaWxlcyBhbmQgc291bmQgZGF0YS4gIFRoZXJlIGFyZSBtYW55CmRpZmZlcmVudCBzb3VuZCBmaWxlIGZvcm1hdHMgKHVzdWFsbHkgcmVjb2duaXplZCBieSB0aGVpciBleHRlbnNpb24sCmZvciBleGFtcGxlOiBcZmlsZXsud2F2fSwgXGZpbGV7LmFpZmZ9LCBcZmlsZXsuYXV9KSwgc28geW91IG1heSBuZWVkCnRvIGNyZWF0ZSBhbmQgbWFpbnRhaW4gYSBncm93aW5nIGNvbGxlY3Rpb24gb2YgbW9kdWxlcyBmb3IgdGhlCmNvbnZlcnNpb24gYmV0d2VlbiB0aGUgdmFyaW91cyBmaWxlIGZvcm1hdHMuICBUaGVyZSBhcmUgYWxzbyBtYW55CmRpZmZlcmVudCBvcGVyYXRpb25zIHlvdSBtaWdodCB3YW50IHRvIHBlcmZvcm0gb24gc291bmQgZGF0YSAoc3VjaCBhcwptaXhpbmcsIGFkZGluZyBlY2hvLCBhcHBseWluZyBhbiBlcXVhbGl6ZXIgZnVuY3Rpb24sIGNyZWF0aW5nIGFuCmFydGlmaWNpYWwgc3RlcmVvIGVmZmVjdCksIHNvIGluIGFkZGl0aW9uIHlvdSB3aWxsIGJlIHdyaXRpbmcgYQpuZXZlci1lbmRpbmcgc3RyZWFtIG9mIG1vZHVsZXMgdG8gcGVyZm9ybSB0aGVzZSBvcGVyYXRpb25zLiAgSGVyZSdzIGEKcG9zc2libGUgc3RydWN0dXJlIGZvciB5b3VyIHBhY2thZ2UgKGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBhCmhpZXJhcmNoaWNhbCBmaWxlc3lzdGVtKToKClxiZWdpbnt2ZXJiYXRpbX0KU291bmQvICAgICAgICAgICAgICAgICAgICAgICAgICBUb3AtbGV2ZWwgcGFja2FnZQogICAgICBfX2luaXRfXy5weSAgICAgICAgICAgICAgIEluaXRpYWxpemUgdGhlIHNvdW5kIHBhY2thZ2UKICAgICAgRm9ybWF0cy8gICAgICAgICAgICAgICAgICBTdWJwYWNrYWdlIGZvciBmaWxlIGZvcm1hdCBjb252ZXJzaW9ucwogICAgICAgICAgICAgIF9faW5pdF9fLnB5CiAgICAgICAgICAgICAgd2F2cmVhZC5weQogICAgICAgICAgICAgIHdhdndyaXRlLnB5CiAgICAgICAgICAgICAgYWlmZnJlYWQucHkKICAgICAgICAgICAgICBhaWZmd3JpdGUucHkKICAgICAgICAgICAgICBhdXJlYWQucHkKICAgICAgICAgICAgICBhdXdyaXRlLnB5CiAgICAgICAgICAgICAgLi4uCiAgICAgIEVmZmVjdHMvICAgICAgICAgICAgICAgICAgU3VicGFja2FnZSBmb3Igc291bmQgZWZmZWN0cwogICAgICAgICAgICAgIF9faW5pdF9fLnB5CiAgICAgICAgICAgICAgZWNoby5weQogICAgICAgICAgICAgIHN1cnJvdW5kLnB5CiAgICAgICAgICAgICAgcmV2ZXJzZS5weQogICAgICAgICAgICAgIC4uLgogICAgICBGaWx0ZXJzLyAgICAgICAgICAgICAgICAgIFN1YnBhY2thZ2UgZm9yIGZpbHRlcnMKICAgICAgICAgICAgICBfX2luaXRfXy5weQogICAgICAgICAgICAgIGVxdWFsaXplci5weQogICAgICAgICAgICAgIHZvY29kZXIucHkKICAgICAgICAgICAgICBrYXJhb2tlLnB5CiAgICAgICAgICAgICAgLi4uClxlbmR7dmVyYmF0aW19CgpXaGVuIGltcG9ydGluZyB0aGUgcGFja2FnZSwgUHl0aG9uIHNlYXJjaGVzIHRocm91Z2ggdGhlIGRpcmVjdG9yaWVzCm9uIFxjb2Rle3N5cy5wYXRofSBsb29raW5nIGZvciB0aGUgcGFja2FnZSBzdWJkaXJlY3RvcnkuCgpUaGUgXGZpbGV7X19pbml0X18ucHl9IGZpbGVzIGFyZSByZXF1aXJlZCB0byBtYWtlIFB5dGhvbiB0cmVhdCB0aGUKZGlyZWN0b3JpZXMgYXMgY29udGFpbmluZyBwYWNrYWdlczsgdGhpcyBpcyBkb25lIHRvIHByZXZlbnQKZGlyZWN0b3JpZXMgd2l0aCBhIGNvbW1vbiBuYW1lLCBzdWNoIGFzIFxzYW1we3N0cmluZ30sIGZyb20KdW5pbnRlbnRpb25hbGx5IGhpZGluZyB2YWxpZCBtb2R1bGVzIHRoYXQgb2NjdXIgbGF0ZXIgb24gdGhlIG1vZHVsZQpzZWFyY2ggcGF0aC4gSW4gdGhlIHNpbXBsZXN0IGNhc2UsIFxmaWxle19faW5pdF9fLnB5fSBjYW4ganVzdCBiZSBhbgplbXB0eSBmaWxlLCBidXQgaXQgY2FuIGFsc28gZXhlY3V0ZSBpbml0aWFsaXphdGlvbiBjb2RlIGZvciB0aGUKcGFja2FnZSBvciBzZXQgdGhlIFxjb2Rle19fYWxsX199IHZhcmlhYmxlLCBkZXNjcmliZWQgbGF0ZXIuCgpVc2VycyBvZiB0aGUgcGFja2FnZSBjYW4gaW1wb3J0IGluZGl2aWR1YWwgbW9kdWxlcyBmcm9tIHRoZQpwYWNrYWdlLCBmb3IgZXhhbXBsZToKClxiZWdpbnt2ZXJiYXRpbX0KaW1wb3J0IFNvdW5kLkVmZmVjdHMuZWNobwpcZW5ke3ZlcmJhdGltfQoKVGhpcyBsb2FkcyB0aGUgc3VibW9kdWxlIFxtb2R1bGV7U291bmQuRWZmZWN0cy5lY2hvfS4gIEl0IG11c3QgYmUgcmVmZXJlbmNlZAp3aXRoIGl0cyBmdWxsIG5hbWUuCgpcYmVnaW57dmVyYmF0aW19ClNvdW5kLkVmZmVjdHMuZWNoby5lY2hvZmlsdGVyKGlucHV0LCBvdXRwdXQsIGRlbGF5PTAuNywgYXR0ZW49NCkKXGVuZHt2ZXJiYXRpbX0KCkFuIGFsdGVybmF0aXZlIHdheSBvZiBpbXBvcnRpbmcgdGhlIHN1Ym1vZHVsZSBpczoKClxiZWdpbnt2ZXJiYXRpbX0KZnJvbSBTb3VuZC5FZmZlY3RzIGltcG9ydCBlY2hvClxlbmR7dmVyYmF0aW19CgpUaGlzIGFsc28gbG9hZHMgdGhlIHN1Ym1vZHVsZSBcbW9kdWxle2VjaG99LCBhbmQgbWFrZXMgaXQgYXZhaWxhYmxlIHdpdGhvdXQKaXRzIHBhY2thZ2UgcHJlZml4LCBzbyBpdCBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOgoKXGJlZ2lue3ZlcmJhdGltfQplY2hvLmVjaG9maWx0ZXIoaW5wdXQsIG91dHB1dCwgZGVsYXk9MC43LCBhdHRlbj00KQpcZW5ke3ZlcmJhdGltfQoKWWV0IGFub3RoZXIgdmFyaWF0aW9uIGlzIHRvIGltcG9ydCB0aGUgZGVzaXJlZCBmdW5jdGlvbiBvciB2YXJpYWJsZSBkaXJlY3RseToKClxiZWdpbnt2ZXJiYXRpbX0KZnJvbSBTb3VuZC5FZmZlY3RzLmVjaG8gaW1wb3J0IGVjaG9maWx0ZXIKXGVuZHt2ZXJiYXRpbX0KCkFnYWluLCB0aGlzIGxvYWRzIHRoZSBzdWJtb2R1bGUgXG1vZHVsZXtlY2hvfSwgYnV0IHRoaXMgbWFrZXMgaXRzIGZ1bmN0aW9uClxmdW5jdGlvbntlY2hvZmlsdGVyKCl9IGRpcmVjdGx5IGF2YWlsYWJsZToKClxiZWdpbnt2ZXJiYXRpbX0KZWNob2ZpbHRlcihpbnB1dCwgb3V0cHV0LCBkZWxheT0wLjcsIGF0dGVuPTQpClxlbmR7dmVyYmF0aW19CgpOb3RlIHRoYXQgd2hlbiB1c2luZyBcY29kZXtmcm9tIFx2YXJ7cGFja2FnZX0gaW1wb3J0IFx2YXJ7aXRlbX19LCB0aGUKaXRlbSBjYW4gYmUgZWl0aGVyIGEgc3VibW9kdWxlIChvciBzdWJwYWNrYWdlKSBvZiB0aGUgcGFja2FnZSwgb3Igc29tZSAKb3RoZXIgbmFtZSBkZWZpbmVkIGluIHRoZSBwYWNrYWdlLCBsaWtlIGEgZnVuY3Rpb24sIGNsYXNzIG9yCnZhcmlhYmxlLiAgVGhlIFxjb2Rle2ltcG9ydH0gc3RhdGVtZW50IGZpcnN0IHRlc3RzIHdoZXRoZXIgdGhlIGl0ZW0gaXMKZGVmaW5lZCBpbiB0aGUgcGFja2FnZTsgaWYgbm90LCBpdCBhc3N1bWVzIGl0IGlzIGEgbW9kdWxlIGFuZCBhdHRlbXB0cwp0byBsb2FkIGl0LiAgSWYgaXQgZmFpbHMgdG8gZmluZCBpdCwgYW4KXGV4Y2VwdGlvbntJbXBvcnRFcnJvcn0gZXhjZXB0aW9uIGlzIHJhaXNlZC4KCkNvbnRyYXJpbHksIHdoZW4gdXNpbmcgc3ludGF4IGxpa2UgXGNvZGV7aW1wb3J0Clx2YXJ7aXRlbS5zdWJpdGVtLnN1YnN1Yml0ZW19fSwgZWFjaCBpdGVtIGV4Y2VwdCBmb3IgdGhlIGxhc3QgbXVzdCBiZQphIHBhY2thZ2U7IHRoZSBsYXN0IGl0ZW0gY2FuIGJlIGEgbW9kdWxlIG9yIGEgcGFja2FnZSBidXQgY2FuJ3QgYmUgYQpjbGFzcyBvciBmdW5jdGlvbiBvciB2YXJpYWJsZSBkZWZpbmVkIGluIHRoZSBwcmV2aW91cyBpdGVtLgoKXHN1YnNlY3Rpb257SW1wb3J0aW5nICogRnJvbSBhIFBhY2thZ2UgXGxhYmVse3BrZy1pbXBvcnQtc3Rhcn19CiVUaGUgXGNvZGV7X19hbGxfX30gQXR0cmlidXRlCgpcdHRpbmRleHtfX2FsbF9ffQpOb3cgd2hhdCBoYXBwZW5zIHdoZW4gdGhlIHVzZXIgd3JpdGVzIFxjb2Rle2Zyb20gU291bmQuRWZmZWN0cyBpbXBvcnQKKn0/ICBJZGVhbGx5LCBvbmUgd291bGQgaG9wZSB0aGF0IHRoaXMgc29tZWhvdyBnb2VzIG91dCB0byB0aGUKZmlsZXN5c3RlbSwgZmluZHMgd2hpY2ggc3VibW9kdWxlcyBhcmUgcHJlc2VudCBpbiB0aGUgcGFja2FnZSwgYW5kCmltcG9ydHMgdGhlbSBhbGwuICBVbmZvcnR1bmF0ZWx5LCB0aGlzIG9wZXJhdGlvbiBkb2VzIG5vdCB3b3JrIHZlcnkKd2VsbCBvbiBNYWMgYW5kIFdpbmRvd3MgcGxhdGZvcm1zLCB3aGVyZSB0aGUgZmlsZXN5c3RlbSBkb2VzIG5vdAphbHdheXMgaGF2ZSBhY2N1cmF0ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2FzZSBvZiBhIGZpbGVuYW1lISAgT24KdGhlc2UgcGxhdGZvcm1zLCB0aGVyZSBpcyBubyBndWFyYW50ZWVkIHdheSB0byBrbm93IHdoZXRoZXIgYSBmaWxlClxmaWxle0VDSE8uUFl9IHNob3VsZCBiZSBpbXBvcnRlZCBhcyBhIG1vZHVsZSBcbW9kdWxle2VjaG99LApcbW9kdWxle0VjaG99IG9yIFxtb2R1bGV7RUNIT30uICAoRm9yIGV4YW1wbGUsIFdpbmRvd3MgOTUgaGFzIHRoZQphbm5veWluZyBwcmFjdGljZSBvZiBzaG93aW5nIGFsbCBmaWxlIG5hbWVzIHdpdGggYSBjYXBpdGFsaXplZCBmaXJzdApsZXR0ZXIuKSAgVGhlIERPUyA4KzMgZmlsZW5hbWUgcmVzdHJpY3Rpb24gYWRkcyBhbm90aGVyIGludGVyZXN0aW5nCnByb2JsZW0gZm9yIGxvbmcgbW9kdWxlIG5hbWVzLgoKVGhlIG9ubHkgc29sdXRpb24gaXMgZm9yIHRoZSBwYWNrYWdlIGF1dGhvciB0byBwcm92aWRlIGFuIGV4cGxpY2l0CmluZGV4IG9mIHRoZSBwYWNrYWdlLiAgVGhlIGltcG9ydCBzdGF0ZW1lbnQgdXNlcyB0aGUgZm9sbG93aW5nCmNvbnZlbnRpb246IGlmIGEgcGFja2FnZSdzIFxmaWxle19faW5pdF9fLnB5fSBjb2RlIGRlZmluZXMgYSBsaXN0Cm5hbWVkIFxjb2Rle19fYWxsX199LCBpdCBpcyB0YWtlbiB0byBiZSB0aGUgbGlzdCBvZiBtb2R1bGUgbmFtZXMgdGhhdApzaG91bGQgYmUgaW1wb3J0ZWQgd2hlbiBcY29kZXtmcm9tIFx2YXJ7cGFja2FnZX0gaW1wb3J0ICp9IGlzCmVuY291bnRlcmVkLiAgSXQgaXMgdXAgdG8gdGhlIHBhY2thZ2UgYXV0aG9yIHRvIGtlZXAgdGhpcyBsaXN0CnVwLXRvLWRhdGUgd2hlbiBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBwYWNrYWdlIGlzIHJlbGVhc2VkLiAgUGFja2FnZQphdXRob3JzIG1heSBhbHNvIGRlY2lkZSBub3QgdG8gc3VwcG9ydCBpdCwgaWYgdGhleSBkb24ndCBzZWUgYSB1c2UgZm9yCmltcG9ydGluZyAqIGZyb20gdGhlaXIgcGFja2FnZS4gIEZvciBleGFtcGxlLCB0aGUgZmlsZQpcZmlsZXtTb3VuZHMvRWZmZWN0cy9fX2luaXRfXy5weX0gY291bGQgY29udGFpbiB0aGUgZm9sbG93aW5nIGNvZGU6CgpcYmVnaW57dmVyYmF0aW19Cl9fYWxsX18gPSBbImVjaG8iLCAic3Vycm91bmQiLCAicmV2ZXJzZSJdClxlbmR7dmVyYmF0aW19CgpUaGlzIHdvdWxkIG1lYW4gdGhhdCBcY29kZXtmcm9tIFNvdW5kLkVmZmVjdHMgaW1wb3J0ICp9IHdvdWxkCmltcG9ydCB0aGUgdGhyZWUgbmFtZWQgc3VibW9kdWxlcyBvZiB0aGUgXG1vZHVsZXtTb3VuZH0gcGFja2FnZS4KCklmIFxjb2Rle19fYWxsX199IGlzIG5vdCBkZWZpbmVkLCB0aGUgc3RhdGVtZW50IFxjb2Rle2Zyb20gU291bmQuRWZmZWN0cwppbXBvcnQgKn0gZG9lcyBcZW1waHtub3R9IGltcG9ydCBhbGwgc3VibW9kdWxlcyBmcm9tIHRoZSBwYWNrYWdlClxtb2R1bGV7U291bmQuRWZmZWN0c30gaW50byB0aGUgY3VycmVudCBuYW1lc3BhY2U7IGl0IG9ubHkgZW5zdXJlcyB0aGF0IHRoZQpwYWNrYWdlIFxtb2R1bGV7U291bmQuRWZmZWN0c30gaGFzIGJlZW4gaW1wb3J0ZWQgKHBvc3NpYmx5IHJ1bm5pbmcgaXRzCmluaXRpYWxpemF0aW9uIGNvZGUsIFxmaWxle19faW5pdF9fLnB5fSkgYW5kIHRoZW4gaW1wb3J0cyB3aGF0ZXZlciBuYW1lcyBhcmUKZGVmaW5lZCBpbiB0aGUgcGFja2FnZS4gIFRoaXMgaW5jbHVkZXMgYW55IG5hbWVzIGRlZmluZWQgKGFuZApzdWJtb2R1bGVzIGV4cGxpY2l0bHkgbG9hZGVkKSBieSBcZmlsZXtfX2luaXRfXy5weX0uICBJdCBhbHNvIGluY2x1ZGVzIGFueQpzdWJtb2R1bGVzIG9mIHRoZSBwYWNrYWdlIHRoYXQgd2VyZSBleHBsaWNpdGx5IGxvYWRlZCBieSBwcmV2aW91cwppbXBvcnQgc3RhdGVtZW50cy4gIENvbnNpZGVyIHRoaXMgY29kZToKClxiZWdpbnt2ZXJiYXRpbX0KaW1wb3J0IFNvdW5kLkVmZmVjdHMuZWNobwppbXBvcnQgU291bmQuRWZmZWN0cy5zdXJyb3VuZApmcm9tIFNvdW5kLkVmZmVjdHMgaW1wb3J0ICoKXGVuZHt2ZXJiYXRpbX0KCkluIHRoaXMgZXhhbXBsZSwgdGhlIGVjaG8gYW5kIHN1cnJvdW5kIG1vZHVsZXMgYXJlIGltcG9ydGVkIGluIHRoZQpjdXJyZW50IG5hbWVzcGFjZSBiZWNhdXNlIHRoZXkgYXJlIGRlZmluZWQgaW4gdGhlClxtb2R1bGV7U291bmQuRWZmZWN0c30gcGFja2FnZSB3aGVuIHRoZSBcY29kZXtmcm9tLi4uaW1wb3J0fSBzdGF0ZW1lbnQKaXMgZXhlY3V0ZWQuICAoVGhpcyBhbHNvIHdvcmtzIHdoZW4gXGNvZGV7X19hbGxfX30gaXMgZGVmaW5lZC4pCgpOb3RlIHRoYXQgaW4gZ2VuZXJhbCB0aGUgcHJhY3RpY2Ugb2YgaW1wb3J0aW5nIFxjb2Rleyp9IGZyb20gYSBtb2R1bGUgb3IKcGFja2FnZSBpcyBmcm93bmVkIHVwb24sIHNpbmNlIGl0IG9mdGVuIGNhdXNlcyBwb29ybHkgcmVhZGFibGUgY29kZS4KSG93ZXZlciwgaXQgaXMgb2theSB0byB1c2UgaXQgdG8gc2F2ZSB0eXBpbmcgaW4gaW50ZXJhY3RpdmUgc2Vzc2lvbnMsCmFuZCBjZXJ0YWluIG1vZHVsZXMgYXJlIGRlc2lnbmVkIHRvIGV4cG9ydCBvbmx5IG5hbWVzIHRoYXQgZm9sbG93CmNlcnRhaW4gcGF0dGVybnMuCgpSZW1lbWJlciwgdGhlcmUgaXMgbm90aGluZyB3cm9uZyB3aXRoIHVzaW5nIFxjb2Rle2Zyb20gUGFja2FnZQppbXBvcnQgc3BlY2lmaWNfc3VibW9kdWxlfSEgIEluIGZhY3QsIHRoaXMgaXMgdGhlCnJlY29tbWVuZGVkIG5vdGF0aW9uIHVubGVzcyB0aGUgaW1wb3J0aW5nIG1vZHVsZSBuZWVkcyB0byB1c2UKc3VibW9kdWxlcyB3aXRoIHRoZSBzYW1lIG5hbWUgZnJvbSBkaWZmZXJlbnQgcGFja2FnZXMuCgoKXHN1YnNlY3Rpb257SW50cmEtcGFja2FnZSBSZWZlcmVuY2VzfQoKVGhlIHN1Ym1vZHVsZXMgb2Z0ZW4gbmVlZCB0byByZWZlciB0byBlYWNoIG90aGVyLiAgRm9yIGV4YW1wbGUsIHRoZQpcbW9kdWxle3N1cnJvdW5kfSBtb2R1bGUgbWlnaHQgdXNlIHRoZSBcbW9kdWxle2VjaG99IG1vZHVsZS4gIEluIGZhY3QsCnN1Y2ggcmVmZXJlbmNlcwphcmUgc28gY29tbW9uIHRoYXQgdGhlIFxrZXl3b3Jke2ltcG9ydH0gc3RhdGVtZW50IGZpcnN0IGxvb2tzIGluIHRoZQpjb250YWluaW5nIHBhY2thZ2UgYmVmb3JlIGxvb2tpbmcgaW4gdGhlIHN0YW5kYXJkIG1vZHVsZSBzZWFyY2ggcGF0aC4KVGh1cywgdGhlIHN1cnJvdW5kIG1vZHVsZSBjYW4gc2ltcGx5IHVzZSBcY29kZXtpbXBvcnQgZWNob30gb3IKXGNvZGV7ZnJvbSBlY2hvIGltcG9ydCBlY2hvZmlsdGVyfS4gIElmIHRoZSBpbXBvcnRlZCBtb2R1bGUgaXMgbm90CmZvdW5kIGluIHRoZSBjdXJyZW50IHBhY2thZ2UgKHRoZSBwYWNrYWdlIG9mIHdoaWNoIHRoZSBjdXJyZW50IG1vZHVsZQppcyBhIHN1Ym1vZHVsZSksIHRoZSBca2V5d29yZHtpbXBvcnR9IHN0YXRlbWVudCBsb29rcyBmb3IgYSB0b3AtbGV2ZWwKbW9kdWxlIHdpdGggdGhlIGdpdmVuIG5hbWUuCgpXaGVuIHBhY2thZ2VzIGFyZSBzdHJ1Y3R1cmVkIGludG8gc3VicGFja2FnZXMgKGFzIHdpdGggdGhlClxtb2R1bGV7U291bmR9IHBhY2thZ2UgaW4gdGhlIGV4YW1wbGUpLCB0aGVyZSdzIG5vIHNob3J0Y3V0IHRvIHJlZmVyCnRvIHN1Ym1vZHVsZXMgb2Ygc2libGluZyBwYWNrYWdlcyAtIHRoZSBmdWxsIG5hbWUgb2YgdGhlIHN1YnBhY2thZ2UKbXVzdCBiZSB1c2VkLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBtb2R1bGUKXG1vZHVsZXtTb3VuZC5GaWx0ZXJzLnZvY29kZXJ9IG5lZWRzIHRvIHVzZSB0aGUgXG1vZHVsZXtlY2hvfSBtb2R1bGUKaW4gdGhlIFxtb2R1bGV7U291bmQuRWZmZWN0c30gcGFja2FnZSwgaXQgY2FuIHVzZSBcY29kZXtmcm9tClNvdW5kLkVmZmVjdHMgaW1wb3J0IGVjaG99LgoKXHN1YnNlY3Rpb257UGFja2FnZXMgaW4gTXVsdGlwbGUgRGlyZWN0b3JpZXN9CgpQYWNrYWdlcyBzdXBwb3J0IG9uZSBtb3JlIHNwZWNpYWwgYXR0cmlidXRlLCBcbWVtYmVye19fcGF0aF9ffS4gIFRoaXMKaXMgaW5pdGlhbGl6ZWQgdG8gYmUgYSBsaXN0IGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeQpob2xkaW5nIHRoZSBwYWNrYWdlJ3MgXGZpbGV7X19pbml0X18ucHl9IGJlZm9yZSB0aGUgY29kZSBpbiB0aGF0IGZpbGUKaXMgZXhlY3V0ZWQuICBUaGlzIHZhcmlhYmxlIGNhbiBiZSBtb2RpZmllZDsgZG9pbmcgc28gYWZmZWN0cyBmdXR1cmUKc2VhcmNoZXMgZm9yIG1vZHVsZXMgYW5kIHN1YnBhY2thZ2VzIGNvbnRhaW5lZCBpbiB0aGUgcGFja2FnZS4KCldoaWxlIHRoaXMgZmVhdHVyZSBpcyBub3Qgb2Z0ZW4gbmVlZGVkLCBpdCBjYW4gYmUgdXNlZCB0byBleHRlbmQgdGhlCnNldCBvZiBtb2R1bGVzIGZvdW5kIGluIGEgcGFja2FnZS4KCgoKXGNoYXB0ZXJ7SW5wdXQgYW5kIE91dHB1dCBcbGFiZWx7aW99fQoKVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBwcmVzZW50IHRoZSBvdXRwdXQgb2YgYSBwcm9ncmFtOyBkYXRhIGNhbiBiZQpwcmludGVkIGluIGEgaHVtYW4tcmVhZGFibGUgZm9ybSwgb3Igd3JpdHRlbiB0byBhIGZpbGUgZm9yIGZ1dHVyZSB1c2UuClRoaXMgY2hhcHRlciB3aWxsIGRpc2N1c3Mgc29tZSBvZiB0aGUgcG9zc2liaWxpdGllcy4KCgpcc2VjdGlvbntGYW5jaWVyIE91dHB1dCBGb3JtYXR0aW5nIFxsYWJlbHtmb3JtYXR0aW5nfX0KClNvIGZhciB3ZSd2ZSBlbmNvdW50ZXJlZCB0d28gd2F5cyBvZiB3cml0aW5nIHZhbHVlczogXGVtcGh7ZXhwcmVzc2lvbgpzdGF0ZW1lbnRzfSBhbmQgdGhlIFxrZXl3b3Jke3ByaW50fSBzdGF0ZW1lbnQuICAoQSB0aGlyZCB3YXkgaXMgdXNpbmcKdGhlIFxtZXRob2R7d3JpdGUoKX0gbWV0aG9kIG9mIGZpbGUgb2JqZWN0czsgdGhlIHN0YW5kYXJkIG91dHB1dCBmaWxlCmNhbiBiZSByZWZlcmVuY2VkIGFzIFxjb2Rle3N5cy5zdGRvdXR9LiAgU2VlIHRoZSBMaWJyYXJ5IFJlZmVyZW5jZSBmb3IKbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzLikKCk9mdGVuIHlvdSdsbCB3YW50IG1vcmUgY29udHJvbCBvdmVyIHRoZSBmb3JtYXR0aW5nIG9mIHlvdXIgb3V0cHV0IHRoYW4Kc2ltcGx5IHByaW50aW5nIHNwYWNlLXNlcGFyYXRlZCB2YWx1ZXMuICBUaGVyZSBhcmUgdHdvIHdheXMgdG8gZm9ybWF0CnlvdXIgb3V0cHV0OyB0aGUgZmlyc3Qgd2F5IGlzIHRvIGRvIGFsbCB0aGUgc3RyaW5nIGhhbmRsaW5nIHlvdXJzZWxmOwp1c2luZyBzdHJpbmcgc2xpY2luZyBhbmQgY29uY2F0ZW5hdGlvbiBvcGVyYXRpb25zIHlvdSBjYW4gY3JlYXRlIGFueQpsYXktb3V0IHlvdSBjYW4gaW1hZ2luZS4gIFRoZSBzdGFuZGFyZCBtb2R1bGUKXG1vZHVsZXtzdHJpbmd9XHJlZnN0bW9kaW5kZXh7c3RyaW5nfSBjb250YWlucyBzb21lIHVzZWZ1bCBvcGVyYXRpb25zCmZvciBwYWRkaW5nIHN0cmluZ3MgdG8gYSBnaXZlbiBjb2x1bW4gd2lkdGg7IHRoZXNlIHdpbGwgYmUgZGlzY3Vzc2VkCnNob3J0bHkuICBUaGUgc2Vjb25kIHdheSBpcyB0byB1c2UgdGhlIFxjb2Rle1wlfSBvcGVyYXRvciB3aXRoIGEKc3RyaW5nIGFzIHRoZSBsZWZ0IGFyZ3VtZW50LiAgVGhlIFxjb2Rle1wlfSBvcGVyYXRvciBpbnRlcnByZXRzIHRoZQpsZWZ0IGFyZ3VtZW50IG11Y2ggbGlrZSBhIFxjZnVuY3Rpb257c3ByaW50ZigpfS1zdHlsZSBmb3JtYXQKc3RyaW5nIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHJpZ2h0IGFyZ3VtZW50LCBhbmQgcmV0dXJucyB0aGUgc3RyaW5nCnJlc3VsdGluZyBmcm9tIHRoaXMgZm9ybWF0dGluZyBvcGVyYXRpb24uCgpPbmUgcXVlc3Rpb24gcmVtYWlucywgb2YgY291cnNlOiBob3cgZG8geW91IGNvbnZlcnQgdmFsdWVzIHRvIHN0cmluZ3M/Ckx1Y2tpbHksIFB5dGhvbiBoYXMgd2F5cyB0byBjb252ZXJ0IGFueSB2YWx1ZSB0byBhIHN0cmluZzogcGFzcyBpdCB0bwp0aGUgXGZ1bmN0aW9ue3JlcHIoKX0gIG9yIFxmdW5jdGlvbntzdHIoKX0gZnVuY3Rpb25zLiAgUmV2ZXJzZSBxdW90ZXMKKFxjb2Rle2BgfSkgYXJlIGVxdWl2YWxlbnQgdG8gXGZ1bmN0aW9ue3JlcHIoKX0sIGJ1dCB0aGVpciB1c2UgaXMKZGlzY291cmFnZWQuCgpUaGUgXGZ1bmN0aW9ue3N0cigpfSBmdW5jdGlvbiBpcyBtZWFudCB0byByZXR1cm4gcmVwcmVzZW50YXRpb25zIG9mCnZhbHVlcyB3aGljaCBhcmUgZmFpcmx5IGh1bWFuLXJlYWRhYmxlLCB3aGlsZSBcZnVuY3Rpb257cmVwcigpfSBpcwptZWFudCB0byBnZW5lcmF0ZSByZXByZXNlbnRhdGlvbnMgd2hpY2ggY2FuIGJlIHJlYWQgYnkgdGhlIGludGVycHJldGVyCihvciB3aWxsIGZvcmNlIGEgXGV4Y2VwdGlvbntTeW50YXhFcnJvcn0gaWYgdGhlcmUgaXMgbm90IGVxdWl2YWxlbnQKc3ludGF4KS4gIEZvciBvYmplY3RzIHdoaWNoIGRvbid0IGhhdmUgYSBwYXJ0aWN1bGFyIHJlcHJlc2VudGF0aW9uIGZvcgpodW1hbiBjb25zdW1wdGlvbiwgXGZ1bmN0aW9ue3N0cigpfSB3aWxsIHJldHVybiB0aGUgc2FtZSB2YWx1ZSBhcwpcZnVuY3Rpb257cmVwcigpfS4gIE1hbnkgdmFsdWVzLCBzdWNoIGFzIG51bWJlcnMgb3Igc3RydWN0dXJlcyBsaWtlCmxpc3RzIGFuZCBkaWN0aW9uYXJpZXMsIGhhdmUgdGhlIHNhbWUgcmVwcmVzZW50YXRpb24gdXNpbmcgZWl0aGVyCmZ1bmN0aW9uLiAgU3RyaW5ncyBhbmQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgaW4gcGFydGljdWxhciwgaGF2ZSB0d28KZGlzdGluY3QgcmVwcmVzZW50YXRpb25zLgoKU29tZSBleGFtcGxlczoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHMgPSAnSGVsbG8sIHdvcmxkLicKPj4+IHN0cihzKQonSGVsbG8sIHdvcmxkLicKPj4+IHJlcHIocykKIidIZWxsbywgd29ybGQuJyIKPj4+IHN0cigwLjEpCicwLjEnCj4+PiByZXByKDAuMSkKJzAuMTAwMDAwMDAwMDAwMDAwMDEnCj4+PiB4ID0gMTAgKiAzLjI1Cj4+PiB5ID0gMjAwICogMjAwCj4+PiBzID0gJ1RoZSB2YWx1ZSBvZiB4IGlzICcgKyByZXByKHgpICsgJywgYW5kIHkgaXMgJyArIHJlcHIoeSkgKyAnLi4uJwo+Pj4gcHJpbnQgcwpUaGUgdmFsdWUgb2YgeCBpcyAzMi41LCBhbmQgeSBpcyA0MDAwMC4uLgo+Pj4gIyBUaGUgcmVwcigpIG9mIGEgc3RyaW5nIGFkZHMgc3RyaW5nIHF1b3RlcyBhbmQgYmFja3NsYXNoZXM6Ci4uLiBoZWxsbyA9ICdoZWxsbywgd29ybGRcbicKPj4+IGhlbGxvcyA9IHJlcHIoaGVsbG8pCj4+PiBwcmludCBoZWxsb3MKJ2hlbGxvLCB3b3JsZFxuJwo+Pj4gIyBUaGUgYXJndW1lbnQgdG8gcmVwcigpIG1heSBiZSBhbnkgUHl0aG9uIG9iamVjdDoKLi4uIHJlcHIoKHgsIHksICgnc3BhbScsICdlZ2dzJykpKQoiKDMyLjUsIDQwMDAwLCAoJ3NwYW0nLCAnZWdncycpKSIKPj4+ICMgcmV2ZXJzZSBxdW90ZXMgYXJlIGNvbnZlbmllbnQgaW4gaW50ZXJhY3RpdmUgc2Vzc2lvbnM6Ci4uLiBgeCwgeSwgKCdzcGFtJywgJ2VnZ3MnKWAKIigzMi41LCA0MDAwMCwgKCdzcGFtJywgJ2VnZ3MnKSkiClxlbmR7dmVyYmF0aW19CgpIZXJlIGFyZSB0d28gd2F5cyB0byB3cml0ZSBhIHRhYmxlIG9mIHNxdWFyZXMgYW5kIGN1YmVzOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gZm9yIHggaW4gcmFuZ2UoMSwgMTEpOgouLi4gICAgIHByaW50IHJlcHIoeCkucmp1c3QoMiksIHJlcHIoeCp4KS5yanVzdCgzKSwKLi4uICAgICAjIE5vdGUgdHJhaWxpbmcgY29tbWEgb24gcHJldmlvdXMgbGluZQouLi4gICAgIHByaW50IHJlcHIoeCp4KngpLnJqdXN0KDQpCi4uLgogMSAgIDEgICAgMQogMiAgIDQgICAgOAogMyAgIDkgICAyNwogNCAgMTYgICA2NAogNSAgMjUgIDEyNQogNiAgMzYgIDIxNgogNyAgNDkgIDM0MwogOCAgNjQgIDUxMgogOSAgODEgIDcyOQoxMCAxMDAgMTAwMAo+Pj4gZm9yIHggaW4gcmFuZ2UoMSwxMSk6Ci4uLiAgICAgcHJpbnQgJyUyZCAlM2QgJTRkJyAlICh4LCB4KngsIHgqeCp4KQouLi4gCiAxICAgMSAgICAxCiAyICAgNCAgICA4CiAzICAgOSAgIDI3CiA0ICAxNiAgIDY0CiA1ICAyNSAgMTI1CiA2ICAzNiAgMjE2CiA3ICA0OSAgMzQzCiA4ICA2NCAgNTEyCiA5ICA4MSAgNzI5CjEwIDEwMCAxMDAwClxlbmR7dmVyYmF0aW19CgooTm90ZSB0aGF0IG9uZSBzcGFjZSBiZXR3ZWVuIGVhY2ggY29sdW1uIHdhcyBhZGRlZCBieSB0aGUgd2F5ClxrZXl3b3Jke3ByaW50fSB3b3JrczogaXQgYWx3YXlzIGFkZHMgc3BhY2VzIGJldHdlZW4gaXRzIGFyZ3VtZW50cy4pCgpUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHRoZSBcbWV0aG9ke3JqdXN0KCl9IG1ldGhvZCBvZiBzdHJpbmcgb2JqZWN0cywKd2hpY2ggcmlnaHQtanVzdGlmaWVzIGEgc3RyaW5nIGluIGEgZmllbGQgb2YgYSBnaXZlbiB3aWR0aCBieSBwYWRkaW5nCml0IHdpdGggc3BhY2VzIG9uIHRoZSBsZWZ0LiAgVGhlcmUgYXJlIHNpbWlsYXIgbWV0aG9kcwpcbWV0aG9ke2xqdXN0KCl9IGFuZCBcbWV0aG9ke2NlbnRlcigpfS4gIFRoZXNlCm1ldGhvZHMgZG8gbm90IHdyaXRlIGFueXRoaW5nLCB0aGV5IGp1c3QgcmV0dXJuIGEgbmV3IHN0cmluZy4gIElmCnRoZSBpbnB1dCBzdHJpbmcgaXMgdG9vIGxvbmcsIHRoZXkgZG9uJ3QgdHJ1bmNhdGUgaXQsIGJ1dCByZXR1cm4gaXQKdW5jaGFuZ2VkOyB0aGlzIHdpbGwgbWVzcyB1cCB5b3VyIGNvbHVtbiBsYXktb3V0IGJ1dCB0aGF0J3MgdXN1YWxseQpiZXR0ZXIgdGhhbiB0aGUgYWx0ZXJuYXRpdmUsIHdoaWNoIHdvdWxkIGJlIGx5aW5nIGFib3V0IGEgdmFsdWUuICAoSWYKeW91IHJlYWxseSB3YW50IHRydW5jYXRpb24geW91IGNhbiBhbHdheXMgYWRkIGEgc2xpY2Ugb3BlcmF0aW9uLCBhcyBpbgpcc2FtcHt4LmxqdXN0KH5uKVs6bl19LikKClRoZXJlIGlzIGFub3RoZXIgbWV0aG9kLCBcbWV0aG9ke3pmaWxsKCl9LCB3aGljaCBwYWRzIGEKbnVtZXJpYyBzdHJpbmcgb24gdGhlIGxlZnQgd2l0aCB6ZXJvcy4gIEl0IHVuZGVyc3RhbmRzIGFib3V0IHBsdXMgYW5kCm1pbnVzIHNpZ25zOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gJzEyJy56ZmlsbCg1KQonMDAwMTInCj4+PiAnLTMuMTQnLnpmaWxsKDcpCictMDAzLjE0Jwo+Pj4gJzMuMTQxNTkyNjUzNTknLnpmaWxsKDUpCiczLjE0MTU5MjY1MzU5JwpcZW5ke3ZlcmJhdGltfQoKVXNpbmcgdGhlIFxjb2Rle1wlfSBvcGVyYXRvciBsb29rcyBsaWtlIHRoaXM6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBpbXBvcnQgbWF0aAo+Pj4gcHJpbnQgJ1RoZSB2YWx1ZSBvZiBQSSBpcyBhcHByb3hpbWF0ZWx5ICU1LjNmLicgJSBtYXRoLnBpClRoZSB2YWx1ZSBvZiBQSSBpcyBhcHByb3hpbWF0ZWx5IDMuMTQyLgpcZW5ke3ZlcmJhdGltfQoKSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBmb3JtYXQgaW4gdGhlIHN0cmluZywgeW91IG5lZWQgdG8gcGFzcyBhCnR1cGxlIGFzIHJpZ2h0IG9wZXJhbmQsIGFzIGluIHRoaXMgZXhhbXBsZToKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHRhYmxlID0geydTam9lcmQnOiA0MTI3LCAnSmFjayc6IDQwOTgsICdEY2FiJzogNzY3OH0KPj4+IGZvciBuYW1lLCBwaG9uZSBpbiB0YWJsZS5pdGVtcygpOgouLi4gICAgIHByaW50ICclLTEwcyA9PT4gJTEwZCcgJSAobmFtZSwgcGhvbmUpCi4uLiAKSmFjayAgICAgICA9PT4gICAgICAgNDA5OApEY2FiICAgICAgID09PiAgICAgICA3Njc4ClNqb2VyZCAgICAgPT0+ICAgICAgIDQxMjcKXGVuZHt2ZXJiYXRpbX0KCk1vc3QgZm9ybWF0cyB3b3JrIGV4YWN0bHkgYXMgaW4gQyBhbmQgcmVxdWlyZSB0aGF0IHlvdSBwYXNzIHRoZSBwcm9wZXIKdHlwZTsgaG93ZXZlciwgaWYgeW91IGRvbid0IHlvdSBnZXQgYW4gZXhjZXB0aW9uLCBub3QgYSBjb3JlIGR1bXAuClRoZSBcY29kZXtcJXN9IGZvcm1hdCBpcyBtb3JlIHJlbGF4ZWQ6IGlmIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50IGlzCm5vdCBhIHN0cmluZyBvYmplY3QsIGl0IGlzIGNvbnZlcnRlZCB0byBzdHJpbmcgdXNpbmcgdGhlClxmdW5jdGlvbntzdHIoKX0gYnVpbHQtaW4gZnVuY3Rpb24uICBVc2luZyBcY29kZXsqfSB0byBwYXNzIHRoZSB3aWR0aApvciBwcmVjaXNpb24gaW4gYXMgYSBzZXBhcmF0ZSAoaW50ZWdlcikgYXJndW1lbnQgaXMgc3VwcG9ydGVkLiAgVGhlCkMgZm9ybWF0cyBcY29kZXtcJW59IGFuZCBcY29kZXtcJXB9IGFyZSBub3Qgc3VwcG9ydGVkLgoKSWYgeW91IGhhdmUgYSByZWFsbHkgbG9uZyBmb3JtYXQgc3RyaW5nIHRoYXQgeW91IGRvbid0IHdhbnQgdG8gc3BsaXQKdXAsIGl0IHdvdWxkIGJlIG5pY2UgaWYgeW91IGNvdWxkIHJlZmVyZW5jZSB0aGUgdmFyaWFibGVzIHRvIGJlCmZvcm1hdHRlZCBieSBuYW1lIGluc3RlYWQgb2YgYnkgcG9zaXRpb24uICBUaGlzIGNhbiBiZSBkb25lIGJ5IHVzaW5nCmZvcm0gXGNvZGV7XCUobmFtZSlmb3JtYXR9LCBhcyBzaG93biBoZXJlOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gdGFibGUgPSB7J1Nqb2VyZCc6IDQxMjcsICdKYWNrJzogNDA5OCwgJ0RjYWInOiA4NjM3Njc4fQo+Pj4gcHJpbnQgJ0phY2s6ICUoSmFjaylkOyBTam9lcmQ6ICUoU2pvZXJkKWQ7IERjYWI6ICUoRGNhYilkJyAlIHRhYmxlCkphY2s6IDQwOTg7IFNqb2VyZDogNDEyNzsgRGNhYjogODYzNzY3OApcZW5ke3ZlcmJhdGltfQoKVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIG5ldyBidWlsdC1pbgpcZnVuY3Rpb257dmFycygpfSBmdW5jdGlvbiwgd2hpY2ggcmV0dXJucyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBhbGwKbG9jYWwgdmFyaWFibGVzLgoKXHNlY3Rpb257UmVhZGluZyBhbmQgV3JpdGluZyBGaWxlcyBcbGFiZWx7ZmlsZXN9fQoKJSBPcGVuaW5nIGZpbGVzIApcZnVuY3Rpb257b3BlbigpfVxiaWZ1bmNpbmRleHtvcGVufSByZXR1cm5zIGEgZmlsZQpvYmplY3Rcb2JpbmRleHtmaWxlfSwgYW5kIGlzIG1vc3QgY29tbW9ubHkgdXNlZCB3aXRoIHR3byBhcmd1bWVudHM6ClxzYW1we29wZW4oXHZhcntmaWxlbmFtZX0sIFx2YXJ7bW9kZX0pfS4KClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGY9b3BlbignL3RtcC93b3JrZmlsZScsICd3JykKPj4+IHByaW50IGYKPG9wZW4gZmlsZSAnL3RtcC93b3JrZmlsZScsIG1vZGUgJ3cnIGF0IDgwYTA5NjA+ClxlbmR7dmVyYmF0aW19CgpUaGUgZmlyc3QgYXJndW1lbnQgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgZmlsZW5hbWUuICBUaGUgc2Vjb25kCmFyZ3VtZW50IGlzIGFub3RoZXIgc3RyaW5nIGNvbnRhaW5pbmcgYSBmZXcgY2hhcmFjdGVycyBkZXNjcmliaW5nIHRoZQp3YXkgaW4gd2hpY2ggdGhlIGZpbGUgd2lsbCBiZSB1c2VkLiAgXHZhcnttb2RlfSBjYW4gYmUgXGNvZGV7J3InfSB3aGVuCnRoZSBmaWxlIHdpbGwgb25seSBiZSByZWFkLCBcY29kZXsndyd9IGZvciBvbmx5IHdyaXRpbmcgKGFuIGV4aXN0aW5nCmZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lIHdpbGwgYmUgZXJhc2VkKSwgYW5kIFxjb2RleydhJ30gb3BlbnMgdGhlIGZpbGUKZm9yIGFwcGVuZGluZzsgYW55IGRhdGEgd3JpdHRlbiB0byB0aGUgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvCnRoZSBlbmQuICBcY29kZXsncisnfSBvcGVucyB0aGUgZmlsZSBmb3IgYm90aCByZWFkaW5nIGFuZCB3cml0aW5nLgpUaGUgXHZhcnttb2RlfSBhcmd1bWVudCBpcyBvcHRpb25hbDsgXGNvZGV7J3InfSB3aWxsIGJlIGFzc3VtZWQgaWYKaXQncyBvbWl0dGVkLgoKT24gV2luZG93cyBhbmQgdGhlIE1hY2ludG9zaCwgXGNvZGV7J2InfSBhcHBlbmRlZCB0byB0aGUKbW9kZSBvcGVucyB0aGUgZmlsZSBpbiBiaW5hcnkgbW9kZSwgc28gdGhlcmUgYXJlIGFsc28gbW9kZXMgbGlrZQpcY29kZXsncmInfSwgXGNvZGV7J3diJ30sIGFuZCBcY29kZXsncitiJ30uICBXaW5kb3dzIG1ha2VzIGEKZGlzdGluY3Rpb24gYmV0d2VlbiB0ZXh0IGFuZCBiaW5hcnkgZmlsZXM7IHRoZSBlbmQtb2YtbGluZSBjaGFyYWN0ZXJzCmluIHRleHQgZmlsZXMgYXJlIGF1dG9tYXRpY2FsbHkgYWx0ZXJlZCBzbGlnaHRseSB3aGVuIGRhdGEgaXMgcmVhZCBvcgp3cml0dGVuLiAgVGhpcyBiZWhpbmQtdGhlLXNjZW5lcyBtb2RpZmljYXRpb24gdG8gZmlsZSBkYXRhIGlzIGZpbmUgZm9yClxBU0NJSXt9IHRleHQgZmlsZXMsIGJ1dCBpdCdsbCBjb3JydXB0IGJpbmFyeSBkYXRhIGxpa2UgdGhhdCBpbiBKUEVHcyBvcgpcZmlsZXsuRVhFfSBmaWxlcy4gIEJlIHZlcnkgY2FyZWZ1bCB0byB1c2UgYmluYXJ5IG1vZGUgd2hlbiByZWFkaW5nIGFuZAp3cml0aW5nIHN1Y2ggZmlsZXMuICAoTm90ZSB0aGF0IHRoZSBwcmVjaXNlIHNlbWFudGljcyBvZiB0ZXh0IG1vZGUgb24KdGhlIE1hY2ludG9zaCBkZXBlbmRzIG9uIHRoZSB1bmRlcmx5aW5nIEMgbGlicmFyeSBiZWluZyB1c2VkLikKClxzdWJzZWN0aW9ue01ldGhvZHMgb2YgRmlsZSBPYmplY3RzIFxsYWJlbHtmaWxlTWV0aG9kc319CgpUaGUgcmVzdCBvZiB0aGUgZXhhbXBsZXMgaW4gdGhpcyBzZWN0aW9uIHdpbGwgYXNzdW1lIHRoYXQgYSBmaWxlCm9iamVjdCBjYWxsZWQgXGNvZGV7Zn0gaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkLgoKVG8gcmVhZCBhIGZpbGUncyBjb250ZW50cywgY2FsbCBcY29kZXtmLnJlYWQoXHZhcntzaXplfSl9LCB3aGljaCByZWFkcwpzb21lIHF1YW50aXR5IG9mIGRhdGEgYW5kIHJldHVybnMgaXQgYXMgYSBzdHJpbmcuICBcdmFye3NpemV9IGlzIGFuCm9wdGlvbmFsIG51bWVyaWMgYXJndW1lbnQuICBXaGVuIFx2YXJ7c2l6ZX0gaXMgb21pdHRlZCBvciBuZWdhdGl2ZSwKdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgZmlsZSB3aWxsIGJlIHJlYWQgYW5kIHJldHVybmVkOyBpdCdzIHlvdXIKcHJvYmxlbSBpZiB0aGUgZmlsZSBpcyB0d2ljZSBhcyBsYXJnZSBhcyB5b3VyIG1hY2hpbmUncyBtZW1vcnkuCk90aGVyd2lzZSwgYXQgbW9zdCBcdmFye3NpemV9IGJ5dGVzIGFyZSByZWFkIGFuZCByZXR1cm5lZC4gIElmIHRoZSBlbmQKb2YgdGhlIGZpbGUgaGFzIGJlZW4gcmVhY2hlZCwgXGNvZGV7Zi5yZWFkKCl9IHdpbGwgcmV0dXJuIGFuIGVtcHR5CnN0cmluZyAoXGNvZGUgeyIifSkuClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGYucmVhZCgpCidUaGlzIGlzIHRoZSBlbnRpcmUgZmlsZS5cbicKPj4+IGYucmVhZCgpCicnClxlbmR7dmVyYmF0aW19CgpcY29kZXtmLnJlYWRsaW5lKCl9IHJlYWRzIGEgc2luZ2xlIGxpbmUgZnJvbSB0aGUgZmlsZTsgYSBuZXdsaW5lCmNoYXJhY3RlciAoXGNvZGV7XGUgbn0pIGlzIGxlZnQgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLCBhbmQgaXMgb25seQpvbWl0dGVkIG9uIHRoZSBsYXN0IGxpbmUgb2YgdGhlIGZpbGUgaWYgdGhlIGZpbGUgZG9lc24ndCBlbmQgaW4gYQpuZXdsaW5lLiAgVGhpcyBtYWtlcyB0aGUgcmV0dXJuIHZhbHVlIHVuYW1iaWd1b3VzOyBpZgpcY29kZXtmLnJlYWRsaW5lKCl9IHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLCB0aGUgZW5kIG9mIHRoZSBmaWxlIGhhcwpiZWVuIHJlYWNoZWQsIHdoaWxlIGEgYmxhbmsgbGluZSBpcyByZXByZXNlbnRlZCBieSBcY29kZXsnXGUgbid9LCBhCnN0cmluZyBjb250YWluaW5nIG9ubHkgYSBzaW5nbGUgbmV3bGluZS4gIAoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gZi5yZWFkbGluZSgpCidUaGlzIGlzIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBmaWxlLlxuJwo+Pj4gZi5yZWFkbGluZSgpCidTZWNvbmQgbGluZSBvZiB0aGUgZmlsZVxuJwo+Pj4gZi5yZWFkbGluZSgpCicnClxlbmR7dmVyYmF0aW19CgpcY29kZXtmLnJlYWRsaW5lcygpfSByZXR1cm5zIGEgbGlzdCBjb250YWluaW5nIGFsbCB0aGUgbGluZXMgb2YgZGF0YQppbiB0aGUgZmlsZS4gIElmIGdpdmVuIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBcdmFye3NpemVoaW50fSwgaXQgcmVhZHMKdGhhdCBtYW55IGJ5dGVzIGZyb20gdGhlIGZpbGUgYW5kIGVub3VnaCBtb3JlIHRvIGNvbXBsZXRlIGEgbGluZSwgYW5kCnJldHVybnMgdGhlIGxpbmVzIGZyb20gdGhhdC4gIFRoaXMgaXMgb2Z0ZW4gdXNlZCB0byBhbGxvdyBlZmZpY2llbnQKcmVhZGluZyBvZiBhIGxhcmdlIGZpbGUgYnkgbGluZXMsIGJ1dCB3aXRob3V0IGhhdmluZyB0byBsb2FkIHRoZQplbnRpcmUgZmlsZSBpbiBtZW1vcnkuICBPbmx5IGNvbXBsZXRlIGxpbmVzIHdpbGwgYmUgcmV0dXJuZWQuCgpcYmVnaW57dmVyYmF0aW19Cj4+PiBmLnJlYWRsaW5lcygpClsnVGhpcyBpcyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgZmlsZS5cbicsICdTZWNvbmQgbGluZSBvZiB0aGUgZmlsZVxuJ10KXGVuZHt2ZXJiYXRpbX0KClxjb2Rle2Yud3JpdGUoXHZhcntzdHJpbmd9KX0gd3JpdGVzIHRoZSBjb250ZW50cyBvZiBcdmFye3N0cmluZ30gdG8KdGhlIGZpbGUsIHJldHVybmluZyBcY29kZXtOb25lfS4gIAoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gZi53cml0ZSgnVGhpcyBpcyBhIHRlc3RcbicpClxlbmR7dmVyYmF0aW19CgpcY29kZXtmLnRlbGwoKX0gcmV0dXJucyBhbiBpbnRlZ2VyIGdpdmluZyB0aGUgZmlsZSBvYmplY3QncyBjdXJyZW50CnBvc2l0aW9uIGluIHRoZSBmaWxlLCBtZWFzdXJlZCBpbiBieXRlcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlCmZpbGUuICBUbyBjaGFuZ2UgdGhlIGZpbGUgb2JqZWN0J3MgcG9zaXRpb24sIHVzZQpcc2FtcHtmLnNlZWsoXHZhcntvZmZzZXR9LCBcdmFye2Zyb21fd2hhdH0pfS4gIFRoZSBwb3NpdGlvbiBpcwpjb21wdXRlZCBmcm9tIGFkZGluZyBcdmFye29mZnNldH0gdG8gYSByZWZlcmVuY2UgcG9pbnQ7IHRoZSByZWZlcmVuY2UKcG9pbnQgaXMgc2VsZWN0ZWQgYnkgdGhlIFx2YXJ7ZnJvbV93aGF0fSBhcmd1bWVudC4gIEEKXHZhcntmcm9tX3doYXR9IHZhbHVlIG9mIDAgbWVhc3VyZXMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLCAxCnVzZXMgdGhlIGN1cnJlbnQgZmlsZSBwb3NpdGlvbiwgYW5kIDIgdXNlcyB0aGUgZW5kIG9mIHRoZSBmaWxlIGFzIHRoZQpyZWZlcmVuY2UgcG9pbnQuICBcdmFye2Zyb21fd2hhdH0gY2FuIGJlIG9taXR0ZWQgYW5kIGRlZmF1bHRzIHRvIDAsCnVzaW5nIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgYXMgdGhlIHJlZmVyZW5jZSBwb2ludC4KClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGY9b3BlbignL3RtcC93b3JrZmlsZScsICdyKycpCj4+PiBmLndyaXRlKCcwMTIzNDU2Nzg5YWJjZGVmJykKPj4+IGYuc2Vlayg1KSAgICAgIyBHbyB0byB0aGUgNnRoIGJ5dGUgaW4gdGhlIGZpbGUKPj4+IGYucmVhZCgxKSAgICAgICAgCic1Jwo+Pj4gZi5zZWVrKC0zLCAyKSAjIEdvIHRvIHRoZSAzcmQgYnl0ZSBiZWZvcmUgdGhlIGVuZAo+Pj4gZi5yZWFkKDEpCidkJwpcZW5ke3ZlcmJhdGltfQoKV2hlbiB5b3UncmUgZG9uZSB3aXRoIGEgZmlsZSwgY2FsbCBcY29kZXtmLmNsb3NlKCl9IHRvIGNsb3NlIGl0IGFuZApmcmVlIHVwIGFueSBzeXN0ZW0gcmVzb3VyY2VzIHRha2VuIHVwIGJ5IHRoZSBvcGVuIGZpbGUuICBBZnRlciBjYWxsaW5nClxjb2Rle2YuY2xvc2UoKX0sIGF0dGVtcHRzIHRvIHVzZSB0aGUgZmlsZSBvYmplY3Qgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuCgpcYmVnaW57dmVyYmF0aW19Cj4+PiBmLmNsb3NlKCkKPj4+IGYucmVhZCgpClRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/ClZhbHVlRXJyb3I6IEkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUKXGVuZHt2ZXJiYXRpbX0KCkZpbGUgb2JqZWN0cyBoYXZlIHNvbWUgYWRkaXRpb25hbCBtZXRob2RzLCBzdWNoIGFzClxtZXRob2R7aXNhdHR5KCl9IGFuZCBcbWV0aG9ke3RydW5jYXRlKCl9IHdoaWNoIGFyZSBsZXNzIGZyZXF1ZW50bHkKdXNlZDsgY29uc3VsdCB0aGUgTGlicmFyeSBSZWZlcmVuY2UgZm9yIGEgY29tcGxldGUgZ3VpZGUgdG8gZmlsZQpvYmplY3RzLgoKXHN1YnNlY3Rpb257VGhlIFxtb2R1bGV7cGlja2xlfSBNb2R1bGUgXGxhYmVse3BpY2tsZX19ClxyZWZzdG1vZGluZGV4e3BpY2tsZX0KClN0cmluZ3MgY2FuIGVhc2lseSBiZSB3cml0dGVuIHRvIGFuZCByZWFkIGZyb20gYSBmaWxlLiBOdW1iZXJzIHRha2UgYQpiaXQgbW9yZSBlZmZvcnQsIHNpbmNlIHRoZSBcbWV0aG9ke3JlYWQoKX0gbWV0aG9kIG9ubHkgcmV0dXJucwpzdHJpbmdzLCB3aGljaCB3aWxsIGhhdmUgdG8gYmUgcGFzc2VkIHRvIGEgZnVuY3Rpb24gbGlrZQpcZnVuY3Rpb257aW50KCl9LCB3aGljaCB0YWtlcyBhIHN0cmluZyBsaWtlIFxjb2RleycxMjMnfSBhbmQKcmV0dXJucyBpdHMgbnVtZXJpYyB2YWx1ZSAxMjMuICBIb3dldmVyLCB3aGVuIHlvdSB3YW50IHRvIHNhdmUgbW9yZQpjb21wbGV4IGRhdGEgdHlwZXMgbGlrZSBsaXN0cywgZGljdGlvbmFyaWVzLCBvciBjbGFzcyBpbnN0YW5jZXMsCnRoaW5ncyBnZXQgYSBsb3QgbW9yZSBjb21wbGljYXRlZC4KClJhdGhlciB0aGFuIGhhdmUgdXNlcnMgYmUgY29uc3RhbnRseSB3cml0aW5nIGFuZCBkZWJ1Z2dpbmcgY29kZSB0bwpzYXZlIGNvbXBsaWNhdGVkIGRhdGEgdHlwZXMsIFB5dGhvbiBwcm92aWRlcyBhIHN0YW5kYXJkIG1vZHVsZSBjYWxsZWQKXHVsaW5re1xtb2R1bGV7cGlja2xlfX17Li4vbGliL21vZHVsZS1waWNrbGUuaHRtbH0uICBUaGlzIGlzIGFuCmFtYXppbmcgbW9kdWxlIHRoYXQgY2FuIHRha2UgYWxtb3N0CmFueSBQeXRob24gb2JqZWN0IChldmVuIHNvbWUgZm9ybXMgb2YgUHl0aG9uIGNvZGUhKSwgYW5kIGNvbnZlcnQgaXQgdG8KYSBzdHJpbmcgcmVwcmVzZW50YXRpb247IHRoaXMgcHJvY2VzcyBpcyBjYWxsZWQgXGRmbntwaWNrbGluZ30uICAKUmVjb25zdHJ1Y3RpbmcgdGhlIG9iamVjdCBmcm9tIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gaXMgY2FsbGVkClxkZm57dW5waWNrbGluZ30uICBCZXR3ZWVuIHBpY2tsaW5nIGFuZCB1bnBpY2tsaW5nLCB0aGUgc3RyaW5nCnJlcHJlc2VudGluZyB0aGUgb2JqZWN0IG1heSBoYXZlIGJlZW4gc3RvcmVkIGluIGEgZmlsZSBvciBkYXRhLCBvcgpzZW50IG92ZXIgYSBuZXR3b3JrIGNvbm5lY3Rpb24gdG8gc29tZSBkaXN0YW50IG1hY2hpbmUuCgpJZiB5b3UgaGF2ZSBhbiBvYmplY3QgXGNvZGV7eH0sIGFuZCBhIGZpbGUgb2JqZWN0IFxjb2Rle2Z9IHRoYXQncyBiZWVuCm9wZW5lZCBmb3Igd3JpdGluZywgdGhlIHNpbXBsZXN0IHdheSB0byBwaWNrbGUgdGhlIG9iamVjdCB0YWtlcyBvbmx5Cm9uZSBsaW5lIG9mIGNvZGU6CgpcYmVnaW57dmVyYmF0aW19CnBpY2tsZS5kdW1wKHgsIGYpClxlbmR7dmVyYmF0aW19CgpUbyB1bnBpY2tsZSB0aGUgb2JqZWN0IGFnYWluLCBpZiBcY29kZXtmfSBpcyBhIGZpbGUgb2JqZWN0IHdoaWNoIGhhcwpiZWVuIG9wZW5lZCBmb3IgcmVhZGluZzoKClxiZWdpbnt2ZXJiYXRpbX0KeCA9IHBpY2tsZS5sb2FkKGYpClxlbmR7dmVyYmF0aW19CgooVGhlcmUgYXJlIG90aGVyIHZhcmlhbnRzIG9mIHRoaXMsIHVzZWQgd2hlbiBwaWNrbGluZyBtYW55IG9iamVjdHMgb3IKd2hlbiB5b3UgZG9uJ3Qgd2FudCB0byB3cml0ZSB0aGUgcGlja2xlZCBkYXRhIHRvIGEgZmlsZTsgY29uc3VsdCB0aGUKY29tcGxldGUgZG9jdW1lbnRhdGlvbiBmb3IKXHVsaW5re1xtb2R1bGV7cGlja2xlfX17Li4vbGliL21vZHVsZS1waWNrbGUuaHRtbH0gaW4gdGhlClxjaXRldGl0bGVbLi4vbGliL117UHl0aG9uIExpYnJhcnkgUmVmZXJlbmNlfS4pCgpcdWxpbmt7XG1vZHVsZXtwaWNrbGV9fXsuLi9saWIvbW9kdWxlLXBpY2tsZS5odG1sfSBpcyB0aGUgc3RhbmRhcmQgd2F5CnRvIG1ha2UgUHl0aG9uIG9iamVjdHMgd2hpY2ggY2FuIGJlIHN0b3JlZCBhbmQgcmV1c2VkIGJ5IG90aGVyCnByb2dyYW1zIG9yIGJ5IGEgZnV0dXJlIGludm9jYXRpb24gb2YgdGhlIHNhbWUgcHJvZ3JhbTsgdGhlIHRlY2huaWNhbAp0ZXJtIGZvciB0aGlzIGlzIGEgXGRmbntwZXJzaXN0ZW50fSBvYmplY3QuICBCZWNhdXNlClx1bGlua3tcbW9kdWxle3BpY2tsZX19ey4uL2xpYi9tb2R1bGUtcGlja2xlLmh0bWx9IGlzIHNvIHdpZGVseSB1c2VkLAptYW55IGF1dGhvcnMgd2hvIHdyaXRlIFB5dGhvbiBleHRlbnNpb25zIHRha2UgY2FyZSB0byBlbnN1cmUgdGhhdCBuZXcKZGF0YSB0eXBlcyBzdWNoIGFzIG1hdHJpY2VzIGNhbiBiZSBwcm9wZXJseSBwaWNrbGVkIGFuZCB1bnBpY2tsZWQuCgoKClxjaGFwdGVye0Vycm9ycyBhbmQgRXhjZXB0aW9ucyBcbGFiZWx7ZXJyb3JzfX0KClVudGlsIG5vdyBlcnJvciBtZXNzYWdlcyBoYXZlbid0IGJlZW4gbW9yZSB0aGFuIG1lbnRpb25lZCwgYnV0IGlmIHlvdQpoYXZlIHRyaWVkIG91dCB0aGUgZXhhbXBsZXMgeW91IGhhdmUgcHJvYmFibHkgc2VlbiBzb21lLiAgVGhlcmUgYXJlCihhdCBsZWFzdCkgdHdvIGRpc3Rpbmd1aXNoYWJsZSBraW5kcyBvZiBlcnJvcnM6ClxlbXBoe3N5bnRheCBlcnJvcnN9IGFuZCBcZW1waHtleGNlcHRpb25zfS4KClxzZWN0aW9ue1N5bnRheCBFcnJvcnMgXGxhYmVse3N5bnRheEVycm9yc319CgpTeW50YXggZXJyb3JzLCBhbHNvIGtub3duIGFzIHBhcnNpbmcgZXJyb3JzLCBhcmUgcGVyaGFwcyB0aGUgbW9zdCBjb21tb24Ka2luZCBvZiBjb21wbGFpbnQgeW91IGdldCB3aGlsZSB5b3UgYXJlIHN0aWxsIGxlYXJuaW5nIFB5dGhvbjoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHdoaWxlIFRydWUgcHJpbnQgJ0hlbGxvIHdvcmxkJwogIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KICAgIHdoaWxlIFRydWUgcHJpbnQgJ0hlbGxvIHdvcmxkJwogICAgICAgICAgICAgICAgICAgXgpTeW50YXhFcnJvcjogaW52YWxpZCBzeW50YXgKXGVuZHt2ZXJiYXRpbX0KClRoZSBwYXJzZXIgcmVwZWF0cyB0aGUgb2ZmZW5kaW5nIGxpbmUgYW5kIGRpc3BsYXlzIGEgbGl0dGxlIGBhcnJvdycKcG9pbnRpbmcgYXQgdGhlIGVhcmxpZXN0IHBvaW50IGluIHRoZSBsaW5lIHdoZXJlIHRoZSBlcnJvciB3YXMKZGV0ZWN0ZWQuICBUaGUgZXJyb3IgaXMgY2F1c2VkIGJ5IChvciBhdCBsZWFzdCBkZXRlY3RlZCBhdCkgdGhlIHRva2VuClxlbXBoe3ByZWNlZGluZ30gdGhlIGFycm93OiBpbiB0aGUgZXhhbXBsZSwgdGhlIGVycm9yIGlzIGRldGVjdGVkIGF0CnRoZSBrZXl3b3JkIFxrZXl3b3Jke3ByaW50fSwgc2luY2UgYSBjb2xvbiAoXGNoYXJhY3Rlcns6fSkgaXMgbWlzc2luZwpiZWZvcmUgaXQuICBGaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIGFyZSBwcmludGVkIHNvIHlvdSBrbm93IHdoZXJlIHRvCmxvb2sgaW4gY2FzZSB0aGUgaW5wdXQgY2FtZSBmcm9tIGEgc2NyaXB0LgoKXHNlY3Rpb257RXhjZXB0aW9ucyBcbGFiZWx7ZXhjZXB0aW9uc319CgpFdmVuIGlmIGEgc3RhdGVtZW50IG9yIGV4cHJlc3Npb24gaXMgc3ludGFjdGljYWxseSBjb3JyZWN0LCBpdCBtYXkKY2F1c2UgYW4gZXJyb3Igd2hlbiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gZXhlY3V0ZSBpdC4KRXJyb3JzIGRldGVjdGVkIGR1cmluZyBleGVjdXRpb24gYXJlIGNhbGxlZCBcZW1waHtleGNlcHRpb25zfSBhbmQgYXJlCm5vdCB1bmNvbmRpdGlvbmFsbHkgZmF0YWw6IHlvdSB3aWxsIHNvb24gbGVhcm4gaG93IHRvIGhhbmRsZSB0aGVtIGluClB5dGhvbiBwcm9ncmFtcy4gIE1vc3QgZXhjZXB0aW9ucyBhcmUgbm90IGhhbmRsZWQgYnkgcHJvZ3JhbXMsCmhvd2V2ZXIsIGFuZCByZXN1bHQgaW4gZXJyb3IgbWVzc2FnZXMgYXMgc2hvd24gaGVyZToKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IDEwICogKDEvMCkKVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KWmVyb0RpdmlzaW9uRXJyb3I6IGludGVnZXIgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm8KPj4+IDQgKyBzcGFtKjMKVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KTmFtZUVycm9yOiBuYW1lICdzcGFtJyBpcyBub3QgZGVmaW5lZAo+Pj4gJzInICsgMgpUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwpUeXBlRXJyb3I6IGNhbm5vdCBjb25jYXRlbmF0ZSAnc3RyJyBhbmQgJ2ludCcgb2JqZWN0cwpcZW5ke3ZlcmJhdGltfQoKVGhlIGxhc3QgbGluZSBvZiB0aGUgZXJyb3IgbWVzc2FnZSBpbmRpY2F0ZXMgd2hhdCBoYXBwZW5lZC4KRXhjZXB0aW9ucyBjb21lIGluIGRpZmZlcmVudCB0eXBlcywgYW5kIHRoZSB0eXBlIGlzIHByaW50ZWQgYXMgcGFydCBvZgp0aGUgbWVzc2FnZTogdGhlIHR5cGVzIGluIHRoZSBleGFtcGxlIGFyZQpcZXhjZXB0aW9ue1plcm9EaXZpc2lvbkVycm9yfSwgXGV4Y2VwdGlvbntOYW1lRXJyb3J9IGFuZApcZXhjZXB0aW9ue1R5cGVFcnJvcn0uClRoZSBzdHJpbmcgcHJpbnRlZCBhcyB0aGUgZXhjZXB0aW9uIHR5cGUgaXMgdGhlIG5hbWUgb2YgdGhlIGJ1aWx0LWluCmV4Y2VwdGlvbiB0aGF0IG9jY3VycmVkLiAgVGhpcyBpcyB0cnVlIGZvciBhbGwgYnVpbHQtaW4KZXhjZXB0aW9ucywgYnV0IG5lZWQgbm90IGJlIHRydWUgZm9yIHVzZXItZGVmaW5lZCBleGNlcHRpb25zIChhbHRob3VnaAppdCBpcyBhIHVzZWZ1bCBjb252ZW50aW9uKS4KU3RhbmRhcmQgZXhjZXB0aW9uIG5hbWVzIGFyZSBidWlsdC1pbiBpZGVudGlmaWVycyAobm90IHJlc2VydmVkCmtleXdvcmRzKS4KClRoZSByZXN0IG9mIHRoZSBsaW5lIGlzIGEgZGV0YWlsIHdob3NlIGludGVycHJldGF0aW9uIGRlcGVuZHMgb24gdGhlCmV4Y2VwdGlvbiB0eXBlOyBpdHMgbWVhbmluZyBpcyBkZXBlbmRlbnQgb24gdGhlIGV4Y2VwdGlvbiB0eXBlLgoKVGhlIHByZWNlZGluZyBwYXJ0IG9mIHRoZSBlcnJvciBtZXNzYWdlIHNob3dzIHRoZSBjb250ZXh0IHdoZXJlIHRoZQpleGNlcHRpb24gaGFwcGVuZWQsIGluIHRoZSBmb3JtIG9mIGEgc3RhY2sgYmFja3RyYWNlLgpJbiBnZW5lcmFsIGl0IGNvbnRhaW5zIGEgc3RhY2sgYmFja3RyYWNlIGxpc3Rpbmcgc291cmNlIGxpbmVzOyBob3dldmVyLAppdCB3aWxsIG5vdCBkaXNwbGF5IGxpbmVzIHJlYWQgZnJvbSBzdGFuZGFyZCBpbnB1dC4KClRoZSBcY2l0ZXRpdGxlWy4uL2xpYi9tb2R1bGUtZXhjZXB0aW9ucy5odG1sXXtQeXRob24gTGlicmFyeQpSZWZlcmVuY2V9IGxpc3RzIHRoZSBidWlsdC1pbiBleGNlcHRpb25zIGFuZCB0aGVpciBtZWFuaW5ncy4KCgpcc2VjdGlvbntIYW5kbGluZyBFeGNlcHRpb25zIFxsYWJlbHtoYW5kbGluZ319CgpJdCBpcyBwb3NzaWJsZSB0byB3cml0ZSBwcm9ncmFtcyB0aGF0IGhhbmRsZSBzZWxlY3RlZCBleGNlcHRpb25zLgpMb29rIGF0IHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgd2hpY2ggYXNrcyB0aGUgdXNlciBmb3IgaW5wdXQgdW50aWwgYQp2YWxpZCBpbnRlZ2VyIGhhcyBiZWVuIGVudGVyZWQsIGJ1dCBhbGxvd3MgdGhlIHVzZXIgdG8gaW50ZXJydXB0IHRoZQpwcm9ncmFtICh1c2luZyBca2Jke0NvbnRyb2wtQ30gb3Igd2hhdGV2ZXIgdGhlIG9wZXJhdGluZyBzeXN0ZW0Kc3VwcG9ydHMpOyBub3RlIHRoYXQgYSB1c2VyLWdlbmVyYXRlZCBpbnRlcnJ1cHRpb24gaXMgc2lnbmFsbGVkIGJ5CnJhaXNpbmcgdGhlIFxleGNlcHRpb257S2V5Ym9hcmRJbnRlcnJ1cHR9IGV4Y2VwdGlvbi4KClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHdoaWxlIFRydWU6Ci4uLiAgICAgdHJ5OgouLi4gICAgICAgICB4ID0gaW50KHJhd19pbnB1dCgiUGxlYXNlIGVudGVyIGEgbnVtYmVyOiAiKSkKLi4uICAgICAgICAgYnJlYWsKLi4uICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLi4uICAgICAgICAgcHJpbnQgIk9vcHMhIFRoYXQgd2FzIG5vIHZhbGlkIG51bWJlci4gIFRyeSBhZ2Fpbi4uLiIKLi4uICAgICAKXGVuZHt2ZXJiYXRpbX0KClRoZSBca2V5d29yZHt0cnl9IHN0YXRlbWVudCB3b3JrcyBhcyBmb2xsb3dzLgoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtCkZpcnN0LCB0aGUgXGVtcGh7dHJ5IGNsYXVzZX0gKHRoZSBzdGF0ZW1lbnQocykgYmV0d2VlbiB0aGUKXGtleXdvcmR7dHJ5fSBhbmQgXGtleXdvcmR7ZXhjZXB0fSBrZXl3b3JkcykgaXMgZXhlY3V0ZWQuCgpcaXRlbQpJZiBubyBleGNlcHRpb24gb2NjdXJzLCB0aGUgXGVtcGh7ZXhjZXB0XCBjbGF1c2V9IGlzIHNraXBwZWQgYW5kCmV4ZWN1dGlvbiBvZiB0aGUgXGtleXdvcmR7dHJ5fSBzdGF0ZW1lbnQgaXMgZmluaXNoZWQuCgpcaXRlbQpJZiBhbiBleGNlcHRpb24gb2NjdXJzIGR1cmluZyBleGVjdXRpb24gb2YgdGhlIHRyeSBjbGF1c2UsIHRoZSByZXN0IG9mCnRoZSBjbGF1c2UgaXMgc2tpcHBlZC4gIFRoZW4gaWYgaXRzIHR5cGUgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uIG5hbWVkCmFmdGVyIHRoZSBca2V5d29yZHtleGNlcHR9IGtleXdvcmQsIHRoZSByZXN0IG9mIHRoZSB0cnkgY2xhdXNlIGlzCnNraXBwZWQsIHRoZSBleGNlcHQgY2xhdXNlIGlzIGV4ZWN1dGVkLCBhbmQgdGhlbiBleGVjdXRpb24gY29udGludWVzCmFmdGVyIHRoZSBca2V5d29yZHt0cnl9IHN0YXRlbWVudC4KClxpdGVtCklmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlIGV4Y2VwdGlvbiBuYW1lZCBpbiB0aGUKZXhjZXB0IGNsYXVzZSwgaXQgaXMgcGFzc2VkIG9uIHRvIG91dGVyIFxrZXl3b3Jke3RyeX0gc3RhdGVtZW50czsgaWYKbm8gaGFuZGxlciBpcyBmb3VuZCwgaXQgaXMgYW4gXGVtcGh7dW5oYW5kbGVkIGV4Y2VwdGlvbn0gYW5kIGV4ZWN1dGlvbgpzdG9wcyB3aXRoIGEgbWVzc2FnZSBhcyBzaG93biBhYm92ZS4KClxlbmR7aXRlbWl6ZX0KCkEgXGtleXdvcmR7dHJ5fSBzdGF0ZW1lbnQgbWF5IGhhdmUgbW9yZSB0aGFuIG9uZSBleGNlcHQgY2xhdXNlLCB0bwpzcGVjaWZ5IGhhbmRsZXJzIGZvciBkaWZmZXJlbnQgZXhjZXB0aW9ucy4gIEF0IG1vc3Qgb25lIGhhbmRsZXIgd2lsbApiZSBleGVjdXRlZC4gIEhhbmRsZXJzIG9ubHkgaGFuZGxlIGV4Y2VwdGlvbnMgdGhhdCBvY2N1ciBpbiB0aGUKY29ycmVzcG9uZGluZyB0cnkgY2xhdXNlLCBub3QgaW4gb3RoZXIgaGFuZGxlcnMgb2YgdGhlIHNhbWUKXGtleXdvcmR7dHJ5fSBzdGF0ZW1lbnQuICBBbiBleGNlcHQgY2xhdXNlIG1heSBuYW1lIG11bHRpcGxlIGV4Y2VwdGlvbnMKYXMgYSBwYXJlbnRoZXNpemVkIGxpc3QsIGZvciBleGFtcGxlOgoKXGJlZ2lue3ZlcmJhdGltfQouLi4gZXhjZXB0IChSdW50aW1lRXJyb3IsIFR5cGVFcnJvciwgTmFtZUVycm9yKToKLi4uICAgICBwYXNzClxlbmR7dmVyYmF0aW19CgpUaGUgbGFzdCBleGNlcHQgY2xhdXNlIG1heSBvbWl0IHRoZSBleGNlcHRpb24gbmFtZShzKSwgdG8gc2VydmUgYXMgYQp3aWxkY2FyZC4gIFVzZSB0aGlzIHdpdGggZXh0cmVtZSBjYXV0aW9uLCBzaW5jZSBpdCBpcyBlYXN5IHRvIG1hc2sgYQpyZWFsIHByb2dyYW1taW5nIGVycm9yIGluIHRoaXMgd2F5ISAgSXQgY2FuIGFsc28gYmUgdXNlZCB0byBwcmludCBhbgplcnJvciBtZXNzYWdlIGFuZCB0aGVuIHJlLXJhaXNlIHRoZSBleGNlcHRpb24gKGFsbG93aW5nIGEgY2FsbGVyIHRvCmhhbmRsZSB0aGUgZXhjZXB0aW9uIGFzIHdlbGwpOgoKXGJlZ2lue3ZlcmJhdGltfQppbXBvcnQgc3lzCgp0cnk6CiAgICBmID0gb3BlbignbXlmaWxlLnR4dCcpCiAgICBzID0gZi5yZWFkbGluZSgpCiAgICBpID0gaW50KHMuc3RyaXAoKSkKZXhjZXB0IElPRXJyb3IsIChlcnJubywgc3RyZXJyb3IpOgogICAgcHJpbnQgIkkvTyBlcnJvciglcyk6ICVzIiAlIChlcnJubywgc3RyZXJyb3IpCmV4Y2VwdCBWYWx1ZUVycm9yOgogICAgcHJpbnQgIkNvdWxkIG5vdCBjb252ZXJ0IGRhdGEgdG8gYW4gaW50ZWdlci4iCmV4Y2VwdDoKICAgIHByaW50ICJVbmV4cGVjdGVkIGVycm9yOiIsIHN5cy5leGNfaW5mbygpWzBdCiAgICByYWlzZQpcZW5ke3ZlcmJhdGltfQoKVGhlIFxrZXl3b3Jke3RyeX0gXGxkb3RzXCBca2V5d29yZHtleGNlcHR9IHN0YXRlbWVudCBoYXMgYW4gb3B0aW9uYWwKXGVtcGh7ZWxzZSBjbGF1c2V9LCB3aGljaCwgd2hlbiBwcmVzZW50LCBtdXN0IGZvbGxvdyBhbGwgZXhjZXB0CmNsYXVzZXMuICBJdCBpcyB1c2VmdWwgZm9yIGNvZGUgdGhhdCBtdXN0IGJlIGV4ZWN1dGVkIGlmIHRoZSB0cnkKY2xhdXNlIGRvZXMgbm90IHJhaXNlIGFuIGV4Y2VwdGlvbi4gIEZvciBleGFtcGxlOgoKXGJlZ2lue3ZlcmJhdGltfQpmb3IgYXJnIGluIHN5cy5hcmd2WzE6XToKICAgIHRyeToKICAgICAgICBmID0gb3BlbihhcmcsICdyJykKICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgIHByaW50ICdjYW5ub3Qgb3BlbicsIGFyZwogICAgZWxzZToKICAgICAgICBwcmludCBhcmcsICdoYXMnLCBsZW4oZi5yZWFkbGluZXMoKSksICdsaW5lcycKICAgICAgICBmLmNsb3NlKCkKXGVuZHt2ZXJiYXRpbX0KClRoZSB1c2Ugb2YgdGhlIFxrZXl3b3Jke2Vsc2V9IGNsYXVzZSBpcyBiZXR0ZXIgdGhhbiBhZGRpbmcgYWRkaXRpb25hbApjb2RlIHRvIHRoZSBca2V5d29yZHt0cnl9IGNsYXVzZSBiZWNhdXNlIGl0IGF2b2lkcyBhY2NpZGVudGFsbHkKY2F0Y2hpbmcgYW4gZXhjZXB0aW9uIHRoYXQgd2Fzbid0IHJhaXNlZCBieSB0aGUgY29kZSBiZWluZyBwcm90ZWN0ZWQKYnkgdGhlIFxrZXl3b3Jke3RyeX0gXGxkb3RzXCBca2V5d29yZHtleGNlcHR9IHN0YXRlbWVudC4KCgpXaGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMsIGl0IG1heSBoYXZlIGFuIGFzc29jaWF0ZWQgdmFsdWUsIGFsc28ga25vd24gYXMKdGhlIGV4Y2VwdGlvbidzIFxlbXBoe2FyZ3VtZW50fS4KVGhlIHByZXNlbmNlIGFuZCB0eXBlIG9mIHRoZSBhcmd1bWVudCBkZXBlbmQgb24gdGhlIGV4Y2VwdGlvbiB0eXBlLgoKVGhlIGV4Y2VwdCBjbGF1c2UgbWF5IHNwZWNpZnkgYSB2YXJpYWJsZSBhZnRlciB0aGUgZXhjZXB0aW9uIG5hbWUgKG9yIGxpc3QpLgpUaGUgdmFyaWFibGUgaXMgYm91bmQgdG8gYW4gZXhjZXB0aW9uIGluc3RhbmNlIHdpdGggdGhlIGFyZ3VtZW50cyBzdG9yZWQKaW4gXGNvZGV7aW5zdGFuY2UuYXJnc30uICBGb3IgY29udmVuaWVuY2UsIHRoZSBleGNlcHRpb24gaW5zdGFuY2UKZGVmaW5lcyBcbWV0aG9ke19fZ2V0aXRlbV9ffSBhbmQgXG1ldGhvZHtfX3N0cl9ffSBzbyB0aGUgYXJndW1lbnRzIGNhbgpiZSBhY2Nlc3NlZCBvciBwcmludGVkIGRpcmVjdGx5IHdpdGhvdXQgaGF2aW5nIHRvIHJlZmVyZW5jZSBcY29kZXsuYXJnc30uCgpcYmVnaW57dmVyYmF0aW19Cj4+PiB0cnk6Ci4uLiAgICByYWlzZSBFeGNlcHRpb24oJ3NwYW0nLCAnZWdncycpCi4uLiBleGNlcHQgRXhjZXB0aW9uLCBpbnN0OgouLi4gICAgcHJpbnQgdHlwZShpbnN0KSAgICAgIyB0aGUgZXhjZXB0aW9uIGluc3RhbmNlCi4uLiAgICBwcmludCBpbnN0LmFyZ3MgICAgICAjIGFyZ3VtZW50cyBzdG9yZWQgaW4gLmFyZ3MKLi4uICAgIHByaW50IGluc3QgICAgICAgICAgICMgX19zdHJfXyBhbGxvd3MgYXJncyB0byBwcmludGVkIGRpcmVjdGx5Ci4uLiAgICB4LCB5ID0gaW5zdCAgICAgICAgICAjIF9fZ2V0aXRlbV9fIGFsbG93cyBhcmdzIHRvIGJlIHVucGFja2VkIGRpcmVjdGx5Ci4uLiAgICBwcmludCAneCA9JywgeAouLi4gICAgcHJpbnQgJ3kgPScsIHkKLi4uCjx0eXBlICdpbnN0YW5jZSc+Cignc3BhbScsICdlZ2dzJykKKCdzcGFtJywgJ2VnZ3MnKQp4ID0gc3BhbQp5ID0gZWdncwpcZW5ke3ZlcmJhdGltfQoKSWYgYW4gZXhjZXB0aW9uIGhhcyBhbiBhcmd1bWVudCwgaXQgaXMgcHJpbnRlZCBhcyB0aGUgbGFzdCBwYXJ0CihgZGV0YWlsJykgb2YgdGhlIG1lc3NhZ2UgZm9yIHVuaGFuZGxlZCBleGNlcHRpb25zLgoKRXhjZXB0aW9uIGhhbmRsZXJzIGRvbid0IGp1c3QgaGFuZGxlIGV4Y2VwdGlvbnMgaWYgdGhleSBvY2N1cgppbW1lZGlhdGVseSBpbiB0aGUgdHJ5IGNsYXVzZSwgYnV0IGFsc28gaWYgdGhleSBvY2N1ciBpbnNpZGUgZnVuY3Rpb25zCnRoYXQgYXJlIGNhbGxlZCAoZXZlbiBpbmRpcmVjdGx5KSBpbiB0aGUgdHJ5IGNsYXVzZS4KRm9yIGV4YW1wbGU6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBkZWYgdGhpc19mYWlscygpOgouLi4gICAgIHggPSAxLzAKLi4uIAo+Pj4gdHJ5OgouLi4gICAgIHRoaXNfZmFpbHMoKQouLi4gZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yLCBkZXRhaWw6Ci4uLiAgICAgcHJpbnQgJ0hhbmRsaW5nIHJ1bi10aW1lIGVycm9yOicsIGRldGFpbAouLi4gCkhhbmRsaW5nIHJ1bi10aW1lIGVycm9yOiBpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbwpcZW5ke3ZlcmJhdGltfQoKClxzZWN0aW9ue1JhaXNpbmcgRXhjZXB0aW9ucyBcbGFiZWx7cmFpc2luZ319CgpUaGUgXGtleXdvcmR7cmFpc2V9IHN0YXRlbWVudCBhbGxvd3MgdGhlIHByb2dyYW1tZXIgdG8gZm9yY2UgYQpzcGVjaWZpZWQgZXhjZXB0aW9uIHRvIG9jY3VyLgpGb3IgZXhhbXBsZToKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHJhaXNlIE5hbWVFcnJvciwgJ0hpVGhlcmUnClRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/Ck5hbWVFcnJvcjogSGlUaGVyZQpcZW5ke3ZlcmJhdGltfQoKVGhlIGZpcnN0IGFyZ3VtZW50IHRvIFxrZXl3b3Jke3JhaXNlfSBuYW1lcyB0aGUgZXhjZXB0aW9uIHRvIGJlCnJhaXNlZC4gIFRoZSBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBleGNlcHRpb24ncwphcmd1bWVudC4KCklmIHlvdSBuZWVkIHRvIGRldGVybWluZSB3aGV0aGVyIGFuIGV4Y2VwdGlvbiB3YXMgcmFpc2VkIGJ1dCBkb24ndAppbnRlbmQgdG8gaGFuZGxlIGl0LCBhIHNpbXBsZXIgZm9ybSBvZiB0aGUgXGtleXdvcmR7cmFpc2V9IHN0YXRlbWVudAphbGxvd3MgeW91IHRvIHJlLXJhaXNlIHRoZSBleGNlcHRpb246CgpcYmVnaW57dmVyYmF0aW19Cj4+PiB0cnk6Ci4uLiAgICAgcmFpc2UgTmFtZUVycm9yLCAnSGlUaGVyZScKLi4uIGV4Y2VwdCBOYW1lRXJyb3I6Ci4uLiAgICAgcHJpbnQgJ0FuIGV4Y2VwdGlvbiBmbGV3IGJ5IScKLi4uICAgICByYWlzZQouLi4KQW4gZXhjZXB0aW9uIGZsZXcgYnkhClRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICBGaWxlICI8c3RkaW4+IiwgbGluZSAyLCBpbiA/Ck5hbWVFcnJvcjogSGlUaGVyZQpcZW5ke3ZlcmJhdGltfQoKClxzZWN0aW9ue1VzZXItZGVmaW5lZCBFeGNlcHRpb25zIFxsYWJlbHt1c2VyRXhjZXB0aW9uc319CgpQcm9ncmFtcyBtYXkgbmFtZSB0aGVpciBvd24gZXhjZXB0aW9ucyBieSBjcmVhdGluZyBhIG5ldyBleGNlcHRpb24KY2xhc3MuICBFeGNlcHRpb25zIHNob3VsZCB0eXBpY2FsbHkgYmUgZGVyaXZlZCBmcm9tIHRoZQpcZXhjZXB0aW9ue0V4Y2VwdGlvbn0gY2xhc3MsIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5LiAgRm9yCmV4YW1wbGU6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBjbGFzcyBNeUVycm9yKEV4Y2VwdGlvbik6Ci4uLiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKLi4uICAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCi4uLiAgICAgZGVmIF9fc3RyX18oc2VsZik6Ci4uLiAgICAgICAgIHJldHVybiByZXByKHNlbGYudmFsdWUpCi4uLiAKPj4+IHRyeToKLi4uICAgICByYWlzZSBNeUVycm9yKDIqMikKLi4uIGV4Y2VwdCBNeUVycm9yLCBlOgouLi4gICAgIHByaW50ICdNeSBleGNlcHRpb24gb2NjdXJyZWQsIHZhbHVlOicsIGUudmFsdWUKLi4uIApNeSBleGNlcHRpb24gb2NjdXJyZWQsIHZhbHVlOiA0Cj4+PiByYWlzZSBNeUVycm9yLCAnb29wcyEnClRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/Cl9fbWFpbl9fLk15RXJyb3I6ICdvb3BzIScKXGVuZHt2ZXJiYXRpbX0KCkV4Y2VwdGlvbiBjbGFzc2VzIGNhbiBiZSBkZWZpbmVkIHdoaWNoIGRvIGFueXRoaW5nIGFueSBvdGhlciBjbGFzcyBjYW4KZG8sIGJ1dCBhcmUgdXN1YWxseSBrZXB0IHNpbXBsZSwgb2Z0ZW4gb25seSBvZmZlcmluZyBhIG51bWJlciBvZgphdHRyaWJ1dGVzIHRoYXQgYWxsb3cgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yIHRvIGJlIGV4dHJhY3RlZCBieQpoYW5kbGVycyBmb3IgdGhlIGV4Y2VwdGlvbi4gIFdoZW4gY3JlYXRpbmcgYSBtb2R1bGUgd2hpY2ggY2FuIHJhaXNlCnNldmVyYWwgZGlzdGluY3QgZXJyb3JzLCBhIGNvbW1vbiBwcmFjdGljZSBpcyB0byBjcmVhdGUgYSBiYXNlIGNsYXNzCmZvciBleGNlcHRpb25zIGRlZmluZWQgYnkgdGhhdCBtb2R1bGUsIGFuZCBzdWJjbGFzcyB0aGF0IHRvIGNyZWF0ZQpzcGVjaWZpYyBleGNlcHRpb24gY2xhc3NlcyBmb3IgZGlmZmVyZW50IGVycm9yIGNvbmRpdGlvbnM6CgpcYmVnaW57dmVyYmF0aW19CmNsYXNzIEVycm9yKEV4Y2VwdGlvbik6CiAgICAiIiJCYXNlIGNsYXNzIGZvciBleGNlcHRpb25zIGluIHRoaXMgbW9kdWxlLiIiIgogICAgcGFzcwoKY2xhc3MgSW5wdXRFcnJvcihFcnJvcik6CiAgICAiIiJFeGNlcHRpb24gcmFpc2VkIGZvciBlcnJvcnMgaW4gdGhlIGlucHV0LgoKICAgIEF0dHJpYnV0ZXM6CiAgICAgICAgZXhwcmVzc2lvbiAtLSBpbnB1dCBleHByZXNzaW9uIGluIHdoaWNoIHRoZSBlcnJvciBvY2N1cnJlZAogICAgICAgIG1lc3NhZ2UgLS0gZXhwbGFuYXRpb24gb2YgdGhlIGVycm9yCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZXhwcmVzc2lvbiwgbWVzc2FnZSk6CiAgICAgICAgc2VsZi5leHByZXNzaW9uID0gZXhwcmVzc2lvbgogICAgICAgIHNlbGYubWVzc2FnZSA9IG1lc3NhZ2UKCmNsYXNzIFRyYW5zaXRpb25FcnJvcihFcnJvcik6CiAgICAiIiJSYWlzZWQgd2hlbiBhbiBvcGVyYXRpb24gYXR0ZW1wdHMgYSBzdGF0ZSB0cmFuc2l0aW9uIHRoYXQncyBub3QKICAgIGFsbG93ZWQuCgogICAgQXR0cmlidXRlczoKICAgICAgICBwcmV2aW91cyAtLSBzdGF0ZSBhdCBiZWdpbm5pbmcgb2YgdHJhbnNpdGlvbgogICAgICAgIG5leHQgLS0gYXR0ZW1wdGVkIG5ldyBzdGF0ZQogICAgICAgIG1lc3NhZ2UgLS0gZXhwbGFuYXRpb24gb2Ygd2h5IHRoZSBzcGVjaWZpYyB0cmFuc2l0aW9uIGlzIG5vdCBhbGxvd2VkCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcHJldmlvdXMsIG5leHQsIG1lc3NhZ2UpOgogICAgICAgIHNlbGYucHJldmlvdXMgPSBwcmV2aW91cwogICAgICAgIHNlbGYubmV4dCA9IG5leHQKICAgICAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlClxlbmR7dmVyYmF0aW19CgpNb3N0IGV4Y2VwdGlvbnMgYXJlIGRlZmluZWQgd2l0aCBuYW1lcyB0aGF0IGVuZCBpbiBgYEVycm9yLCcnIHNpbWlsYXIKdG8gdGhlIG5hbWluZyBvZiB0aGUgc3RhbmRhcmQgZXhjZXB0aW9ucy4KCk1hbnkgc3RhbmRhcmQgbW9kdWxlcyBkZWZpbmUgdGhlaXIgb3duIGV4Y2VwdGlvbnMgdG8gcmVwb3J0IGVycm9ycwp0aGF0IG1heSBvY2N1ciBpbiBmdW5jdGlvbnMgdGhleSBkZWZpbmUuICBNb3JlIGluZm9ybWF0aW9uIG9uIGNsYXNzZXMKaXMgcHJlc2VudGVkIGluIGNoYXB0ZXIgXHJlZntjbGFzc2VzfSwgYGBDbGFzc2VzLicnCgoKXHNlY3Rpb257RGVmaW5pbmcgQ2xlYW4tdXAgQWN0aW9ucyBcbGFiZWx7Y2xlYW51cH19CgpUaGUgXGtleXdvcmR7dHJ5fSBzdGF0ZW1lbnQgaGFzIGFub3RoZXIgb3B0aW9uYWwgY2xhdXNlIHdoaWNoIGlzCmludGVuZGVkIHRvIGRlZmluZSBjbGVhbi11cCBhY3Rpb25zIHRoYXQgbXVzdCBiZSBleGVjdXRlZCB1bmRlciBhbGwKY2lyY3Vtc3RhbmNlcy4gIEZvciBleGFtcGxlOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gdHJ5OgouLi4gICAgIHJhaXNlIEtleWJvYXJkSW50ZXJydXB0Ci4uLiBmaW5hbGx5OgouLi4gICAgIHByaW50ICdHb29kYnllLCB3b3JsZCEnCi4uLiAKR29vZGJ5ZSwgd29ybGQhClRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICBGaWxlICI8c3RkaW4+IiwgbGluZSAyLCBpbiA/CktleWJvYXJkSW50ZXJydXB0ClxlbmR7dmVyYmF0aW19CgpBIFxlbXBoe2ZpbmFsbHkgY2xhdXNlfSBpcyBleGVjdXRlZCB3aGV0aGVyIG9yIG5vdCBhbiBleGNlcHRpb24gaGFzCm9jY3VycmVkIGluIHRoZSB0cnkgY2xhdXNlLiAgV2hlbiBhbiBleGNlcHRpb24gaGFzIG9jY3VycmVkLCBpdCBpcwpyZS1yYWlzZWQgYWZ0ZXIgdGhlIGZpbmFsbHkgY2xhdXNlIGlzIGV4ZWN1dGVkLiAgVGhlIGZpbmFsbHkgY2xhdXNlIGlzCmFsc28gZXhlY3V0ZWQgYGBvbiB0aGUgd2F5IG91dCcnIHdoZW4gdGhlIFxrZXl3b3Jke3RyeX0gc3RhdGVtZW50IGlzCmxlZnQgdmlhIGEgXGtleXdvcmR7YnJlYWt9IG9yIFxrZXl3b3Jke3JldHVybn0gc3RhdGVtZW50LgoKVGhlIGNvZGUgaW4gdGhlIGZpbmFsbHkgY2xhdXNlIGlzIHVzZWZ1bCBmb3IgcmVsZWFzaW5nIGV4dGVybmFsCnJlc291cmNlcyAoc3VjaCBhcyBmaWxlcyBvciBuZXR3b3JrIGNvbm5lY3Rpb25zKSwgcmVnYXJkbGVzcyBvZgp3aGV0aGVyIG9yIG5vdCB0aGUgdXNlIG9mIHRoZSByZXNvdXJjZSB3YXMgc3VjY2Vzc2Z1bC4KCkEgXGtleXdvcmR7dHJ5fSBzdGF0ZW1lbnQgbXVzdCBlaXRoZXIgaGF2ZSBvbmUgb3IgbW9yZSBleGNlcHQgY2xhdXNlcwpvciBvbmUgZmluYWxseSBjbGF1c2UsIGJ1dCBub3QgYm90aC4KCgpcY2hhcHRlcntDbGFzc2VzIFxsYWJlbHtjbGFzc2VzfX0KClB5dGhvbidzIGNsYXNzIG1lY2hhbmlzbSBhZGRzIGNsYXNzZXMgdG8gdGhlIGxhbmd1YWdlIHdpdGggYSBtaW5pbXVtCm9mIG5ldyBzeW50YXggYW5kIHNlbWFudGljcy4gIEl0IGlzIGEgbWl4dHVyZSBvZiB0aGUgY2xhc3MgbWVjaGFuaXNtcwpmb3VuZCBpbiBcQ3Bwe30gYW5kIE1vZHVsYS0zLiAgQXMgaXMgdHJ1ZSBmb3IgbW9kdWxlcywgY2xhc3NlcyBpbiBQeXRob24KZG8gbm90IHB1dCBhbiBhYnNvbHV0ZSBiYXJyaWVyIGJldHdlZW4gZGVmaW5pdGlvbiBhbmQgdXNlciwgYnV0IHJhdGhlcgpyZWx5IG9uIHRoZSBwb2xpdGVuZXNzIG9mIHRoZSB1c2VyIG5vdCB0byBgYGJyZWFrIGludG8gdGhlCmRlZmluaXRpb24uJycgIFRoZSBtb3N0IGltcG9ydGFudCBmZWF0dXJlcyBvZiBjbGFzc2VzIGFyZSByZXRhaW5lZAp3aXRoIGZ1bGwgcG93ZXIsIGhvd2V2ZXI6IHRoZSBjbGFzcyBpbmhlcml0YW5jZSBtZWNoYW5pc20gYWxsb3dzCm11bHRpcGxlIGJhc2UgY2xhc3NlcywgYSBkZXJpdmVkIGNsYXNzIGNhbiBvdmVycmlkZSBhbnkgbWV0aG9kcyBvZiBpdHMKYmFzZSBjbGFzcyBvciBjbGFzc2VzLCBhIG1ldGhvZCBjYW4gY2FsbCB0aGUgbWV0aG9kIG9mIGEgYmFzZSBjbGFzcyB3aXRoIHRoZQpzYW1lIG5hbWUuICBPYmplY3RzIGNhbiBjb250YWluIGFuIGFyYml0cmFyeSBhbW91bnQgb2YgcHJpdmF0ZSBkYXRhLgoKSW4gXENwcHt9IHRlcm1pbm9sb2d5LCBhbGwgY2xhc3MgbWVtYmVycyAoaW5jbHVkaW5nIHRoZSBkYXRhIG1lbWJlcnMpIGFyZQpcZW1waHtwdWJsaWN9LCBhbmQgYWxsIG1lbWJlciBmdW5jdGlvbnMgYXJlIFxlbXBoe3ZpcnR1YWx9LiAgVGhlcmUgYXJlCm5vIHNwZWNpYWwgY29uc3RydWN0b3JzIG9yIGRlc3RydWN0b3JzLiAgQXMgaW4gTW9kdWxhLTMsIHRoZXJlIGFyZSBubwpzaG9ydGhhbmRzIGZvciByZWZlcmVuY2luZyB0aGUgb2JqZWN0J3MgbWVtYmVycyBmcm9tIGl0cyBtZXRob2RzOiB0aGUKbWV0aG9kIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIHdpdGggYW4gZXhwbGljaXQgZmlyc3QgYXJndW1lbnQKcmVwcmVzZW50aW5nIHRoZSBvYmplY3QsIHdoaWNoIGlzIHByb3ZpZGVkIGltcGxpY2l0bHkgYnkgdGhlIGNhbGwuICBBcwppbiBTbWFsbHRhbGssIGNsYXNzZXMgdGhlbXNlbHZlcyBhcmUgb2JqZWN0cywgYWxiZWl0IGluIHRoZSB3aWRlcgpzZW5zZSBvZiB0aGUgd29yZDogaW4gUHl0aG9uLCBhbGwgZGF0YSB0eXBlcyBhcmUgb2JqZWN0cy4gIFRoaXMKcHJvdmlkZXMgc2VtYW50aWNzIGZvciBpbXBvcnRpbmcgYW5kIHJlbmFtaW5nLiAgVW5saWtlIApcQ3Bwe30gYW5kIE1vZHVsYS0zLCBidWlsdC1pbiB0eXBlcyBjYW4gYmUgdXNlZCBhcyBiYXNlIGNsYXNzZXMgZm9yCmV4dGVuc2lvbiBieSB0aGUgdXNlci4gIEFsc28sIGxpa2UgaW4gXENwcHt9IGJ1dCB1bmxpa2UgaW4gTW9kdWxhLTMsIG1vc3QKYnVpbHQtaW4gb3BlcmF0b3JzIHdpdGggc3BlY2lhbCBzeW50YXggKGFyaXRobWV0aWMgb3BlcmF0b3JzLApzdWJzY3JpcHRpbmcgZXRjLikgY2FuIGJlIHJlZGVmaW5lZCBmb3IgY2xhc3MgaW5zdGFuY2VzLgoKXHNlY3Rpb257QSBXb3JkIEFib3V0IFRlcm1pbm9sb2d5IFxsYWJlbHt0ZXJtaW5vbG9neX19CgpMYWNraW5nIHVuaXZlcnNhbGx5IGFjY2VwdGVkIHRlcm1pbm9sb2d5IHRvIHRhbGsgYWJvdXQgY2xhc3NlcywgSSB3aWxsCm1ha2Ugb2NjYXNpb25hbCB1c2Ugb2YgU21hbGx0YWxrIGFuZCBcQ3Bwe30gdGVybXMuICAoSSB3b3VsZCB1c2UgTW9kdWxhLTMKdGVybXMsIHNpbmNlIGl0cyBvYmplY3Qtb3JpZW50ZWQgc2VtYW50aWNzIGFyZSBjbG9zZXIgdG8gdGhvc2Ugb2YKUHl0aG9uIHRoYW4gXENwcCwgYnV0IEkgZXhwZWN0IHRoYXQgZmV3IHJlYWRlcnMgaGF2ZSBoZWFyZCBvZiBpdC4pCgpJIGFsc28gaGF2ZSB0byB3YXJuIHlvdSB0aGF0IHRoZXJlJ3MgYSB0ZXJtaW5vbG9naWNhbCBwaXRmYWxsIGZvcgpvYmplY3Qtb3JpZW50ZWQgcmVhZGVyczogdGhlIHdvcmQgYGBvYmplY3QnJyBpbiBQeXRob24gZG9lcyBub3QKbmVjZXNzYXJpbHkgbWVhbiBhIGNsYXNzIGluc3RhbmNlLiAgTGlrZSBcQ3Bwe30gYW5kIE1vZHVsYS0zLCBhbmQKdW5saWtlIFNtYWxsdGFsaywgbm90IGFsbCB0eXBlcyBpbiBQeXRob24gYXJlIGNsYXNzZXM6IHRoZSBiYXNpYwpidWlsdC1pbiB0eXBlcyBsaWtlIGludGVnZXJzIGFuZCBsaXN0cyBhcmUgbm90LCBhbmQgZXZlbiBzb21ld2hhdCBtb3JlCmV4b3RpYyB0eXBlcyBsaWtlIGZpbGVzIGFyZW4ndC4gIEhvd2V2ZXIsIFxlbXBoe2FsbH0gUHl0aG9uIHR5cGVzCnNoYXJlIGEgbGl0dGxlIGJpdCBvZiBjb21tb24gc2VtYW50aWNzIHRoYXQgaXMgYmVzdCBkZXNjcmliZWQgYnkgdXNpbmcKdGhlIHdvcmQgb2JqZWN0LgoKT2JqZWN0cyBoYXZlIGluZGl2aWR1YWxpdHksIGFuZCBtdWx0aXBsZSBuYW1lcyAoaW4gbXVsdGlwbGUgc2NvcGVzKQpjYW4gYmUgYm91bmQgdG8gdGhlIHNhbWUgb2JqZWN0LiAgVGhpcyBpcyBrbm93biBhcyBhbGlhc2luZyBpbiBvdGhlcgpsYW5ndWFnZXMuICBUaGlzIGlzIHVzdWFsbHkgbm90IGFwcHJlY2lhdGVkIG9uIGEgZmlyc3QgZ2xhbmNlIGF0ClB5dGhvbiwgYW5kIGNhbiBiZSBzYWZlbHkgaWdub3JlZCB3aGVuIGRlYWxpbmcgd2l0aCBpbW11dGFibGUgYmFzaWMKdHlwZXMgKG51bWJlcnMsIHN0cmluZ3MsIHR1cGxlcykuICBIb3dldmVyLCBhbGlhc2luZyBoYXMgYW4KKGludGVuZGVkISkgZWZmZWN0IG9uIHRoZSBzZW1hbnRpY3Mgb2YgUHl0aG9uIGNvZGUgaW52b2x2aW5nIG11dGFibGUKb2JqZWN0cyBzdWNoIGFzIGxpc3RzLCBkaWN0aW9uYXJpZXMsIGFuZCBtb3N0IHR5cGVzIHJlcHJlc2VudGluZwplbnRpdGllcyBvdXRzaWRlIHRoZSBwcm9ncmFtIChmaWxlcywgd2luZG93cywgZXRjLikuICBUaGlzIGlzIHVzdWFsbHkKdXNlZCB0byB0aGUgYmVuZWZpdCBvZiB0aGUgcHJvZ3JhbSwgc2luY2UgYWxpYXNlcyBiZWhhdmUgbGlrZSBwb2ludGVycwppbiBzb21lIHJlc3BlY3RzLiAgRm9yIGV4YW1wbGUsIHBhc3NpbmcgYW4gb2JqZWN0IGlzIGNoZWFwIHNpbmNlIG9ubHkKYSBwb2ludGVyIGlzIHBhc3NlZCBieSB0aGUgaW1wbGVtZW50YXRpb247IGFuZCBpZiBhIGZ1bmN0aW9uIG1vZGlmaWVzCmFuIG9iamVjdCBwYXNzZWQgYXMgYW4gYXJndW1lbnQsIHRoZSBjYWxsZXIgd2lsbCBzZWUgdGhlIGNoYW5nZSAtLS0gdGhpcwplbGltaW5hdGVzIHRoZSBuZWVkIGZvciB0d28gZGlmZmVyZW50IGFyZ3VtZW50IHBhc3NpbmcgbWVjaGFuaXNtcyBhcyBpbgpQYXNjYWwuCgoKXHNlY3Rpb257UHl0aG9uIFNjb3BlcyBhbmQgTmFtZSBTcGFjZXMgXGxhYmVse3Njb3Blc319CgpCZWZvcmUgaW50cm9kdWNpbmcgY2xhc3NlcywgSSBmaXJzdCBoYXZlIHRvIHRlbGwgeW91IHNvbWV0aGluZyBhYm91dApQeXRob24ncyBzY29wZSBydWxlcy4gIENsYXNzIGRlZmluaXRpb25zIHBsYXkgc29tZSBuZWF0IHRyaWNrcyB3aXRoCm5hbWVzcGFjZXMsIGFuZCB5b3UgbmVlZCB0byBrbm93IGhvdyBzY29wZXMgYW5kIG5hbWVzcGFjZXMgd29yayB0bwpmdWxseSB1bmRlcnN0YW5kIHdoYXQncyBnb2luZyBvbi4gIEluY2lkZW50YWxseSwga25vd2xlZGdlIGFib3V0IHRoaXMKc3ViamVjdCBpcyB1c2VmdWwgZm9yIGFueSBhZHZhbmNlZCBQeXRob24gcHJvZ3JhbW1lci4KCkxldCdzIGJlZ2luIHdpdGggc29tZSBkZWZpbml0aW9ucy4KCkEgXGVtcGh7bmFtZXNwYWNlfSBpcyBhIG1hcHBpbmcgZnJvbSBuYW1lcyB0byBvYmplY3RzLiAgTW9zdApuYW1lc3BhY2VzIGFyZSBjdXJyZW50bHkgaW1wbGVtZW50ZWQgYXMgUHl0aG9uIGRpY3Rpb25hcmllcywgYnV0CnRoYXQncyBub3JtYWxseSBub3Qgbm90aWNlYWJsZSBpbiBhbnkgd2F5IChleGNlcHQgZm9yIHBlcmZvcm1hbmNlKSwKYW5kIGl0IG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4gIEV4YW1wbGVzIG9mIG5hbWVzcGFjZXMgYXJlOiB0aGUgc2V0Cm9mIGJ1aWx0LWluIG5hbWVzIChmdW5jdGlvbnMgc3VjaCBhcyBcZnVuY3Rpb257YWJzKCl9LCBhbmQgYnVpbHQtaW4KZXhjZXB0aW9uIG5hbWVzKTsgdGhlIGdsb2JhbCBuYW1lcyBpbiBhIG1vZHVsZTsgYW5kIHRoZSBsb2NhbCBuYW1lcyBpbgphIGZ1bmN0aW9uIGludm9jYXRpb24uICBJbiBhIHNlbnNlIHRoZSBzZXQgb2YgYXR0cmlidXRlcyBvZiBhbiBvYmplY3QKYWxzbyBmb3JtIGEgbmFtZXNwYWNlLiAgVGhlIGltcG9ydGFudCB0aGluZyB0byBrbm93IGFib3V0IG5hbWVzcGFjZXMKaXMgdGhhdCB0aGVyZSBpcyBhYnNvbHV0ZWx5IG5vIHJlbGF0aW9uIGJldHdlZW4gbmFtZXMgaW4gZGlmZmVyZW50Cm5hbWVzcGFjZXM7IGZvciBpbnN0YW5jZSwgdHdvIGRpZmZlcmVudCBtb2R1bGVzIG1heSBib3RoIGRlZmluZSBhCmZ1bmN0aW9uIGBgbWF4aW1pemUnJyB3aXRob3V0IGNvbmZ1c2lvbiAtLS0gdXNlcnMgb2YgdGhlIG1vZHVsZXMgbXVzdApwcmVmaXggaXQgd2l0aCB0aGUgbW9kdWxlIG5hbWUuCgpCeSB0aGUgd2F5LCBJIHVzZSB0aGUgd29yZCBcZW1waHthdHRyaWJ1dGV9IGZvciBhbnkgbmFtZSBmb2xsb3dpbmcgYQpkb3QgLS0tIGZvciBleGFtcGxlLCBpbiB0aGUgZXhwcmVzc2lvbiBcY29kZXt6LnJlYWx9LCBcY29kZXtyZWFsfSBpcwphbiBhdHRyaWJ1dGUgb2YgdGhlIG9iamVjdCBcY29kZXt6fS4gIFN0cmljdGx5IHNwZWFraW5nLCByZWZlcmVuY2VzIHRvCm5hbWVzIGluIG1vZHVsZXMgYXJlIGF0dHJpYnV0ZSByZWZlcmVuY2VzOiBpbiB0aGUgZXhwcmVzc2lvbgpcY29kZXttb2RuYW1lLmZ1bmNuYW1lfSwgXGNvZGV7bW9kbmFtZX0gaXMgYSBtb2R1bGUgb2JqZWN0IGFuZApcY29kZXtmdW5jbmFtZX0gaXMgYW4gYXR0cmlidXRlIG9mIGl0LiAgSW4gdGhpcyBjYXNlIHRoZXJlIGhhcHBlbnMgdG8KYmUgYSBzdHJhaWdodGZvcndhcmQgbWFwcGluZyBiZXR3ZWVuIHRoZSBtb2R1bGUncyBhdHRyaWJ1dGVzIGFuZCB0aGUKZ2xvYmFsIG5hbWVzIGRlZmluZWQgaW4gdGhlIG1vZHVsZTogdGhleSBzaGFyZSB0aGUgc2FtZSBuYW1lc3BhY2UhClxmb290bm90ZXsKICAgICAgICBFeGNlcHQgZm9yIG9uZSB0aGluZy4gIE1vZHVsZSBvYmplY3RzIGhhdmUgYSBzZWNyZXQgcmVhZC1vbmx5CiAgICAgICAgYXR0cmlidXRlIGNhbGxlZCBcbWVtYmVye19fZGljdF9ffSB3aGljaCByZXR1cm5zIHRoZSBkaWN0aW9uYXJ5CiAgICAgICAgdXNlZCB0byBpbXBsZW1lbnQgdGhlIG1vZHVsZSdzIG5hbWVzcGFjZTsgdGhlIG5hbWUKICAgICAgICBcbWVtYmVye19fZGljdF9ffSBpcyBhbiBhdHRyaWJ1dGUgYnV0IG5vdCBhIGdsb2JhbCBuYW1lLgogICAgICAgIE9idmlvdXNseSwgdXNpbmcgdGhpcyB2aW9sYXRlcyB0aGUgYWJzdHJhY3Rpb24gb2YgbmFtZXNwYWNlCiAgICAgICAgaW1wbGVtZW50YXRpb24sIGFuZCBzaG91bGQgYmUgcmVzdHJpY3RlZCB0byB0aGluZ3MgbGlrZQogICAgICAgIHBvc3QtbW9ydGVtIGRlYnVnZ2Vycy4KfQoKQXR0cmlidXRlcyBtYXkgYmUgcmVhZC1vbmx5IG9yIHdyaXRhYmxlLiAgSW4gdGhlIGxhdHRlciBjYXNlLAphc3NpZ25tZW50IHRvIGF0dHJpYnV0ZXMgaXMgcG9zc2libGUuICBNb2R1bGUgYXR0cmlidXRlcyBhcmUgd3JpdGFibGU6CnlvdSBjYW4gd3JpdGUgXHNhbXB7bW9kbmFtZS50aGVfYW5zd2VyID0gNDJ9LiAgV3JpdGFibGUgYXR0cmlidXRlcyBtYXkKYWxzbyBiZSBkZWxldGVkIHdpdGggdGhlIFxrZXl3b3Jke2RlbH0gc3RhdGVtZW50LiAgRm9yIGV4YW1wbGUsClxzYW1we2RlbCBtb2RuYW1lLnRoZV9hbnN3ZXJ9IHdpbGwgcmVtb3ZlIHRoZSBhdHRyaWJ1dGUKXG1lbWJlcnt0aGVfYW5zd2VyfSBmcm9tIHRoZSBvYmplY3QgbmFtZWQgYnkgXGNvZGV7bW9kbmFtZX0uCgpOYW1lIHNwYWNlcyBhcmUgY3JlYXRlZCBhdCBkaWZmZXJlbnQgbW9tZW50cyBhbmQgaGF2ZSBkaWZmZXJlbnQKbGlmZXRpbWVzLiAgVGhlIG5hbWVzcGFjZSBjb250YWluaW5nIHRoZSBidWlsdC1pbiBuYW1lcyBpcyBjcmVhdGVkCndoZW4gdGhlIFB5dGhvbiBpbnRlcnByZXRlciBzdGFydHMgdXAsIGFuZCBpcyBuZXZlciBkZWxldGVkLiAgVGhlCmdsb2JhbCBuYW1lc3BhY2UgZm9yIGEgbW9kdWxlIGlzIGNyZWF0ZWQgd2hlbiB0aGUgbW9kdWxlIGRlZmluaXRpb24KaXMgcmVhZCBpbjsgbm9ybWFsbHksIG1vZHVsZSBuYW1lc3BhY2VzIGFsc28gbGFzdCB1bnRpbCB0aGUKaW50ZXJwcmV0ZXIgcXVpdHMuICBUaGUgc3RhdGVtZW50cyBleGVjdXRlZCBieSB0aGUgdG9wLWxldmVsCmludm9jYXRpb24gb2YgdGhlIGludGVycHJldGVyLCBlaXRoZXIgcmVhZCBmcm9tIGEgc2NyaXB0IGZpbGUgb3IKaW50ZXJhY3RpdmVseSwgYXJlIGNvbnNpZGVyZWQgcGFydCBvZiBhIG1vZHVsZSBjYWxsZWQKXG1vZHVsZXtfX21haW5fX30sIHNvIHRoZXkgaGF2ZSB0aGVpciBvd24gZ2xvYmFsIG5hbWVzcGFjZS4gIChUaGUKYnVpbHQtaW4gbmFtZXMgYWN0dWFsbHkgYWxzbyBsaXZlIGluIGEgbW9kdWxlOyB0aGlzIGlzIGNhbGxlZApcbW9kdWxle19fYnVpbHRpbl9ffS4pCgpUaGUgbG9jYWwgbmFtZXNwYWNlIGZvciBhIGZ1bmN0aW9uIGlzIGNyZWF0ZWQgd2hlbiB0aGUgZnVuY3Rpb24gaXMKY2FsbGVkLCBhbmQgZGVsZXRlZCB3aGVuIHRoZSBmdW5jdGlvbiByZXR1cm5zIG9yIHJhaXNlcyBhbiBleGNlcHRpb24KdGhhdCBpcyBub3QgaGFuZGxlZCB3aXRoaW4gdGhlIGZ1bmN0aW9uLiAgKEFjdHVhbGx5LCBmb3JnZXR0aW5nIHdvdWxkCmJlIGEgYmV0dGVyIHdheSB0byBkZXNjcmliZSB3aGF0IGFjdHVhbGx5IGhhcHBlbnMuKSAgT2YgY291cnNlLApyZWN1cnNpdmUgaW52b2NhdGlvbnMgZWFjaCBoYXZlIHRoZWlyIG93biBsb2NhbCBuYW1lc3BhY2UuCgpBIFxlbXBoe3Njb3BlfSBpcyBhIHRleHR1YWwgcmVnaW9uIG9mIGEgUHl0aG9uIHByb2dyYW0gd2hlcmUgYQpuYW1lc3BhY2UgaXMgZGlyZWN0bHkgYWNjZXNzaWJsZS4gIGBgRGlyZWN0bHkgYWNjZXNzaWJsZScnIGhlcmUgbWVhbnMKdGhhdCBhbiB1bnF1YWxpZmllZCByZWZlcmVuY2UgdG8gYSBuYW1lIGF0dGVtcHRzIHRvIGZpbmQgdGhlIG5hbWUgaW4KdGhlIG5hbWVzcGFjZS4KCkFsdGhvdWdoIHNjb3BlcyBhcmUgZGV0ZXJtaW5lZCBzdGF0aWNhbGx5LCB0aGV5IGFyZSB1c2VkIGR5bmFtaWNhbGx5LgpBdCBhbnkgdGltZSBkdXJpbmcgZXhlY3V0aW9uLCB0aGVyZSBhcmUgYXQgbGVhc3QgdGhyZWUgbmVzdGVkIHNjb3BlcyB3aG9zZQpuYW1lc3BhY2VzIGFyZSBkaXJlY3RseSBhY2Nlc3NpYmxlOiB0aGUgaW5uZXJtb3N0IHNjb3BlLCB3aGljaCBpcyBzZWFyY2hlZApmaXJzdCwgY29udGFpbnMgdGhlIGxvY2FsIG5hbWVzOyB0aGUgbmFtZXNwYWNlcyBvZiBhbnkgZW5jbG9zaW5nCmZ1bmN0aW9ucywgd2hpY2ggYXJlIHNlYXJjaGVkIHN0YXJ0aW5nIHdpdGggdGhlIG5lYXJlc3QgZW5jbG9zaW5nIHNjb3BlOwp0aGUgbWlkZGxlIHNjb3BlLCBzZWFyY2hlZCBuZXh0LCBjb250YWlucyB0aGUgY3VycmVudCBtb2R1bGUncyBnbG9iYWwgbmFtZXM7CmFuZCB0aGUgb3V0ZXJtb3N0IHNjb3BlIChzZWFyY2hlZCBsYXN0KSBpcyB0aGUgbmFtZXNwYWNlIGNvbnRhaW5pbmcgYnVpbHQtaW4KbmFtZXMuCgpJZiBhIG5hbWUgaXMgZGVjbGFyZWQgZ2xvYmFsLCB0aGVuIGFsbCByZWZlcmVuY2VzIGFuZCBhc3NpZ25tZW50cyBnbwpkaXJlY3RseSB0byB0aGUgbWlkZGxlIHNjb3BlIGNvbnRhaW5pbmcgdGhlIG1vZHVsZSdzIGdsb2JhbCBuYW1lcy4KT3RoZXJ3aXNlLCBhbGwgdmFyaWFibGVzIGZvdW5kIG91dHNpZGUgb2YgdGhlIGlubmVybW9zdCBzY29wZSBhcmUgcmVhZC1vbmx5LgoKVXN1YWxseSwgdGhlIGxvY2FsIHNjb3BlIHJlZmVyZW5jZXMgdGhlIGxvY2FsIG5hbWVzIG9mIHRoZSAodGV4dHVhbGx5KQpjdXJyZW50IGZ1bmN0aW9uLiAgT3V0c2lkZSBvZiBmdW5jdGlvbnMsIHRoZSBsb2NhbCBzY29wZSByZWZlcmVuY2VzCnRoZSBzYW1lIG5hbWVzcGFjZSBhcyB0aGUgZ2xvYmFsIHNjb3BlOiB0aGUgbW9kdWxlJ3MgbmFtZXNwYWNlLgpDbGFzcyBkZWZpbml0aW9ucyBwbGFjZSB5ZXQgYW5vdGhlciBuYW1lc3BhY2UgaW4gdGhlIGxvY2FsIHNjb3BlLgoKSXQgaXMgaW1wb3J0YW50IHRvIHJlYWxpemUgdGhhdCBzY29wZXMgYXJlIGRldGVybWluZWQgdGV4dHVhbGx5OiB0aGUKZ2xvYmFsIHNjb3BlIG9mIGEgZnVuY3Rpb24gZGVmaW5lZCBpbiBhIG1vZHVsZSBpcyB0aGF0IG1vZHVsZSdzCm5hbWVzcGFjZSwgbm8gbWF0dGVyIGZyb20gd2hlcmUgb3IgYnkgd2hhdCBhbGlhcyB0aGUgZnVuY3Rpb24gaXMKY2FsbGVkLiAgT24gdGhlIG90aGVyIGhhbmQsIHRoZSBhY3R1YWwgc2VhcmNoIGZvciBuYW1lcyBpcyBkb25lCmR5bmFtaWNhbGx5LCBhdCBydW4gdGltZSAtLS0gaG93ZXZlciwgdGhlIGxhbmd1YWdlIGRlZmluaXRpb24gaXMKZXZvbHZpbmcgdG93YXJkcyBzdGF0aWMgbmFtZSByZXNvbHV0aW9uLCBhdCBgYGNvbXBpbGUnJyB0aW1lLCBzbyBkb24ndApyZWx5IG9uIGR5bmFtaWMgbmFtZSByZXNvbHV0aW9uISAgKEluIGZhY3QsIGxvY2FsIHZhcmlhYmxlcyBhcmUKYWxyZWFkeSBkZXRlcm1pbmVkIHN0YXRpY2FsbHkuKQoKQSBzcGVjaWFsIHF1aXJrIG9mIFB5dGhvbiBpcyB0aGF0IGFzc2lnbm1lbnRzIGFsd2F5cyBnbyBpbnRvIHRoZQppbm5lcm1vc3Qgc2NvcGUuICBBc3NpZ25tZW50cyBkbyBub3QgY29weSBkYXRhIC0tLSB0aGV5IGp1c3QKYmluZCBuYW1lcyB0byBvYmplY3RzLiAgVGhlIHNhbWUgaXMgdHJ1ZSBmb3IgZGVsZXRpb25zOiB0aGUgc3RhdGVtZW50ClxzYW1we2RlbCB4fSByZW1vdmVzIHRoZSBiaW5kaW5nIG9mIFxjb2Rle3h9IGZyb20gdGhlIG5hbWVzcGFjZQpyZWZlcmVuY2VkIGJ5IHRoZSBsb2NhbCBzY29wZS4gIEluIGZhY3QsIGFsbCBvcGVyYXRpb25zIHRoYXQgaW50cm9kdWNlCm5ldyBuYW1lcyB1c2UgdGhlIGxvY2FsIHNjb3BlOiBpbiBwYXJ0aWN1bGFyLCBpbXBvcnQgc3RhdGVtZW50cyBhbmQKZnVuY3Rpb24gZGVmaW5pdGlvbnMgYmluZCB0aGUgbW9kdWxlIG9yIGZ1bmN0aW9uIG5hbWUgaW4gdGhlIGxvY2FsCnNjb3BlLiAgKFRoZSBca2V5d29yZHtnbG9iYWx9IHN0YXRlbWVudCBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0CnBhcnRpY3VsYXIgdmFyaWFibGVzIGxpdmUgaW4gdGhlIGdsb2JhbCBzY29wZS4pCgoKXHNlY3Rpb257QSBGaXJzdCBMb29rIGF0IENsYXNzZXMgXGxhYmVse2ZpcnN0Q2xhc3Nlc319CgpDbGFzc2VzIGludHJvZHVjZSBhIGxpdHRsZSBiaXQgb2YgbmV3IHN5bnRheCwgdGhyZWUgbmV3IG9iamVjdCB0eXBlcywKYW5kIHNvbWUgbmV3IHNlbWFudGljcy4KCgpcc3Vic2VjdGlvbntDbGFzcyBEZWZpbml0aW9uIFN5bnRheCBcbGFiZWx7Y2xhc3NEZWZpbml0aW9ufX0KClRoZSBzaW1wbGVzdCBmb3JtIG9mIGNsYXNzIGRlZmluaXRpb24gbG9va3MgbGlrZSB0aGlzOgoKXGJlZ2lue3ZlcmJhdGltfQpjbGFzcyBDbGFzc05hbWU6CiAgICA8c3RhdGVtZW50LTE+CiAgICAuCiAgICAuCiAgICAuCiAgICA8c3RhdGVtZW50LU4+ClxlbmR7dmVyYmF0aW19CgpDbGFzcyBkZWZpbml0aW9ucywgbGlrZSBmdW5jdGlvbiBkZWZpbml0aW9ucwooXGtleXdvcmR7ZGVmfSBzdGF0ZW1lbnRzKSBtdXN0IGJlIGV4ZWN1dGVkIGJlZm9yZSB0aGV5IGhhdmUgYW55CmVmZmVjdC4gIChZb3UgY291bGQgY29uY2VpdmFibHkgcGxhY2UgYSBjbGFzcyBkZWZpbml0aW9uIGluIGEgYnJhbmNoCm9mIGFuIFxrZXl3b3Jke2lmfSBzdGF0ZW1lbnQsIG9yIGluc2lkZSBhIGZ1bmN0aW9uLikKCkluIHByYWN0aWNlLCB0aGUgc3RhdGVtZW50cyBpbnNpZGUgYSBjbGFzcyBkZWZpbml0aW9uIHdpbGwgdXN1YWxseSBiZQpmdW5jdGlvbiBkZWZpbml0aW9ucywgYnV0IG90aGVyIHN0YXRlbWVudHMgYXJlIGFsbG93ZWQsIGFuZCBzb21ldGltZXMKdXNlZnVsIC0tLSB3ZSdsbCBjb21lIGJhY2sgdG8gdGhpcyBsYXRlci4gIFRoZSBmdW5jdGlvbiBkZWZpbml0aW9ucwppbnNpZGUgYSBjbGFzcyBub3JtYWxseSBoYXZlIGEgcGVjdWxpYXIgZm9ybSBvZiBhcmd1bWVudCBsaXN0LApkaWN0YXRlZCBieSB0aGUgY2FsbGluZyBjb252ZW50aW9ucyBmb3IgbWV0aG9kcyAtLS0gYWdhaW4sIHRoaXMgaXMKZXhwbGFpbmVkIGxhdGVyLgoKV2hlbiBhIGNsYXNzIGRlZmluaXRpb24gaXMgZW50ZXJlZCwgYSBuZXcgbmFtZXNwYWNlIGlzIGNyZWF0ZWQsIGFuZAp1c2VkIGFzIHRoZSBsb2NhbCBzY29wZSAtLS0gdGh1cywgYWxsIGFzc2lnbm1lbnRzIHRvIGxvY2FsIHZhcmlhYmxlcwpnbyBpbnRvIHRoaXMgbmV3IG5hbWVzcGFjZS4gIEluIHBhcnRpY3VsYXIsIGZ1bmN0aW9uIGRlZmluaXRpb25zIGJpbmQKdGhlIG5hbWUgb2YgdGhlIG5ldyBmdW5jdGlvbiBoZXJlLgoKV2hlbiBhIGNsYXNzIGRlZmluaXRpb24gaXMgbGVmdCBub3JtYWxseSAodmlhIHRoZSBlbmQpLCBhIFxlbXBoe2NsYXNzCm9iamVjdH0gaXMgY3JlYXRlZC4gIFRoaXMgaXMgYmFzaWNhbGx5IGEgd3JhcHBlciBhcm91bmQgdGhlIGNvbnRlbnRzCm9mIHRoZSBuYW1lc3BhY2UgY3JlYXRlZCBieSB0aGUgY2xhc3MgZGVmaW5pdGlvbjsgd2UnbGwgbGVhcm4gbW9yZQphYm91dCBjbGFzcyBvYmplY3RzIGluIHRoZSBuZXh0IHNlY3Rpb24uICBUaGUgb3JpZ2luYWwgbG9jYWwgc2NvcGUKKHRoZSBvbmUgaW4gZWZmZWN0IGp1c3QgYmVmb3JlIHRoZSBjbGFzcyBkZWZpbml0aW9ucyB3YXMgZW50ZXJlZCkgaXMKcmVpbnN0YXRlZCwgYW5kIHRoZSBjbGFzcyBvYmplY3QgaXMgYm91bmQgaGVyZSB0byB0aGUgY2xhc3MgbmFtZSBnaXZlbgppbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBoZWFkZXIgKFxjbGFzc3tDbGFzc05hbWV9IGluIHRoZSBleGFtcGxlKS4KCgpcc3Vic2VjdGlvbntDbGFzcyBPYmplY3RzIFxsYWJlbHtjbGFzc09iamVjdHN9fQoKQ2xhc3Mgb2JqZWN0cyBzdXBwb3J0IHR3byBraW5kcyBvZiBvcGVyYXRpb25zOiBhdHRyaWJ1dGUgcmVmZXJlbmNlcwphbmQgaW5zdGFudGlhdGlvbi4KClxlbXBoe0F0dHJpYnV0ZSByZWZlcmVuY2VzfSB1c2UgdGhlIHN0YW5kYXJkIHN5bnRheCB1c2VkIGZvciBhbGwKYXR0cmlidXRlIHJlZmVyZW5jZXMgaW4gUHl0aG9uOiBcY29kZXtvYmoubmFtZX0uICBWYWxpZCBhdHRyaWJ1dGUKbmFtZXMgYXJlIGFsbCB0aGUgbmFtZXMgdGhhdCB3ZXJlIGluIHRoZSBjbGFzcydzIG5hbWVzcGFjZSB3aGVuIHRoZQpjbGFzcyBvYmplY3Qgd2FzIGNyZWF0ZWQuICBTbywgaWYgdGhlIGNsYXNzIGRlZmluaXRpb24gbG9va2VkIGxpa2UKdGhpczoKClxiZWdpbnt2ZXJiYXRpbX0KY2xhc3MgTXlDbGFzczoKICAgICJBIHNpbXBsZSBleGFtcGxlIGNsYXNzIgogICAgaSA9IDEyMzQ1CiAgICBkZWYgZihzZWxmKToKICAgICAgICByZXR1cm4gJ2hlbGxvIHdvcmxkJwpcZW5ke3ZlcmJhdGltfQoKdGhlbiBcY29kZXtNeUNsYXNzLml9IGFuZCBcY29kZXtNeUNsYXNzLmZ9IGFyZSB2YWxpZCBhdHRyaWJ1dGUKcmVmZXJlbmNlcywgcmV0dXJuaW5nIGFuIGludGVnZXIgYW5kIGEgbWV0aG9kIG9iamVjdCwgcmVzcGVjdGl2ZWx5LgpDbGFzcyBhdHRyaWJ1dGVzIGNhbiBhbHNvIGJlIGFzc2lnbmVkIHRvLCBzbyB5b3UgY2FuIGNoYW5nZSB0aGUgdmFsdWUKb2YgXGNvZGV7TXlDbGFzcy5pfSBieSBhc3NpZ25tZW50LiAgXG1lbWJlcntfX2RvY19ffSBpcyBhbHNvIGEgdmFsaWQKYXR0cmlidXRlLCByZXR1cm5pbmcgdGhlIGRvY3N0cmluZyBiZWxvbmdpbmcgdG8gdGhlIGNsYXNzOiBcY29kZXsiQQpzaW1wbGUgZXhhbXBsZSBjbGFzcyJ9LiAKCkNsYXNzIFxlbXBoe2luc3RhbnRpYXRpb259IHVzZXMgZnVuY3Rpb24gbm90YXRpb24uICBKdXN0IHByZXRlbmQgdGhhdAp0aGUgY2xhc3Mgb2JqZWN0IGlzIGEgcGFyYW1ldGVybGVzcyBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBuZXcKaW5zdGFuY2Ugb2YgdGhlIGNsYXNzLiAgRm9yIGV4YW1wbGUgKGFzc3VtaW5nIHRoZSBhYm92ZSBjbGFzcyk6CgpcYmVnaW57dmVyYmF0aW19CnggPSBNeUNsYXNzKCkKXGVuZHt2ZXJiYXRpbX0KCmNyZWF0ZXMgYSBuZXcgXGVtcGh7aW5zdGFuY2V9IG9mIHRoZSBjbGFzcyBhbmQgYXNzaWducyB0aGlzIG9iamVjdCB0bwp0aGUgbG9jYWwgdmFyaWFibGUgXGNvZGV7eH0uCgpUaGUgaW5zdGFudGlhdGlvbiBvcGVyYXRpb24gKGBgY2FsbGluZycnIGEgY2xhc3Mgb2JqZWN0KSBjcmVhdGVzIGFuCmVtcHR5IG9iamVjdC4gIE1hbnkgY2xhc3NlcyBsaWtlIHRvIGNyZWF0ZSBvYmplY3RzIGluIGEga25vd24gaW5pdGlhbApzdGF0ZS4gIFRoZXJlZm9yZSBhIGNsYXNzIG1heSBkZWZpbmUgYSBzcGVjaWFsIG1ldGhvZCBuYW1lZApcbWV0aG9ke19faW5pdF9fKCl9LCBsaWtlIHRoaXM6CgpcYmVnaW57dmVyYmF0aW19CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5kYXRhID0gW10KXGVuZHt2ZXJiYXRpbX0KCldoZW4gYSBjbGFzcyBkZWZpbmVzIGFuIFxtZXRob2R7X19pbml0X18oKX0gbWV0aG9kLCBjbGFzcwppbnN0YW50aWF0aW9uIGF1dG9tYXRpY2FsbHkgaW52b2tlcyBcbWV0aG9ke19faW5pdF9fKCl9IGZvciB0aGUKbmV3bHktY3JlYXRlZCBjbGFzcyBpbnN0YW5jZS4gIFNvIGluIHRoaXMgZXhhbXBsZSwgYSBuZXcsIGluaXRpYWxpemVkCmluc3RhbmNlIGNhbiBiZSBvYnRhaW5lZCBieToKClxiZWdpbnt2ZXJiYXRpbX0KeCA9IE15Q2xhc3MoKQpcZW5ke3ZlcmJhdGltfQoKT2YgY291cnNlLCB0aGUgXG1ldGhvZHtfX2luaXRfXygpfSBtZXRob2QgbWF5IGhhdmUgYXJndW1lbnRzIGZvcgpncmVhdGVyIGZsZXhpYmlsaXR5LiAgSW4gdGhhdCBjYXNlLCBhcmd1bWVudHMgZ2l2ZW4gdG8gdGhlIGNsYXNzCmluc3RhbnRpYXRpb24gb3BlcmF0b3IgYXJlIHBhc3NlZCBvbiB0byBcbWV0aG9ke19faW5pdF9fKCl9LiAgRm9yCmV4YW1wbGUsCgpcYmVnaW57dmVyYmF0aW19Cj4+PiBjbGFzcyBDb21wbGV4OgouLi4gICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZWFscGFydCwgaW1hZ3BhcnQpOgouLi4gICAgICAgICBzZWxmLnIgPSByZWFscGFydAouLi4gICAgICAgICBzZWxmLmkgPSBpbWFncGFydAouLi4gCj4+PiB4ID0gQ29tcGxleCgzLjAsIC00LjUpCj4+PiB4LnIsIHguaQooMy4wLCAtNC41KQpcZW5ke3ZlcmJhdGltfQoKClxzdWJzZWN0aW9ue0luc3RhbmNlIE9iamVjdHMgXGxhYmVse2luc3RhbmNlT2JqZWN0c319CgpOb3cgd2hhdCBjYW4gd2UgZG8gd2l0aCBpbnN0YW5jZSBvYmplY3RzPyAgVGhlIG9ubHkgb3BlcmF0aW9ucwp1bmRlcnN0b29kIGJ5IGluc3RhbmNlIG9iamVjdHMgYXJlIGF0dHJpYnV0ZSByZWZlcmVuY2VzLiAgVGhlcmUgYXJlCnR3byBraW5kcyBvZiB2YWxpZCBhdHRyaWJ1dGUgbmFtZXMuCgpUaGUgZmlyc3QgSSdsbCBjYWxsIFxlbXBoe2RhdGEgYXR0cmlidXRlc30uICBUaGVzZSBjb3JyZXNwb25kIHRvCmBgaW5zdGFuY2UgdmFyaWFibGVzJycgaW4gU21hbGx0YWxrLCBhbmQgdG8gYGBkYXRhIG1lbWJlcnMnJyBpbgpcQ3BwLiAgRGF0YSBhdHRyaWJ1dGVzIG5lZWQgbm90IGJlIGRlY2xhcmVkOyBsaWtlIGxvY2FsIHZhcmlhYmxlcywKdGhleSBzcHJpbmcgaW50byBleGlzdGVuY2Ugd2hlbiB0aGV5IGFyZSBmaXJzdCBhc3NpZ25lZCB0by4gIEZvcgpleGFtcGxlLCBpZiBcY29kZXt4fSBpcyB0aGUgaW5zdGFuY2Ugb2YgXGNsYXNze015Q2xhc3N9IGNyZWF0ZWQgYWJvdmUsCnRoZSBmb2xsb3dpbmcgcGllY2Ugb2YgY29kZSB3aWxsIHByaW50IHRoZSB2YWx1ZSBcY29kZXsxNn0sIHdpdGhvdXQKbGVhdmluZyBhIHRyYWNlOgoKXGJlZ2lue3ZlcmJhdGltfQp4LmNvdW50ZXIgPSAxCndoaWxlIHguY291bnRlciA8IDEwOgogICAgeC5jb3VudGVyID0geC5jb3VudGVyICogMgpwcmludCB4LmNvdW50ZXIKZGVsIHguY291bnRlcgpcZW5ke3ZlcmJhdGltfQoKVGhlIHNlY29uZCBraW5kIG9mIGF0dHJpYnV0ZSByZWZlcmVuY2VzIHVuZGVyc3Rvb2QgYnkgaW5zdGFuY2Ugb2JqZWN0cwphcmUgXGVtcGh7bWV0aG9kc30uICBBIG1ldGhvZCBpcyBhIGZ1bmN0aW9uIHRoYXQgYGBiZWxvbmdzIHRvJycgYW4Kb2JqZWN0LiAgKEluIFB5dGhvbiwgdGhlIHRlcm0gbWV0aG9kIGlzIG5vdCB1bmlxdWUgdG8gY2xhc3MgaW5zdGFuY2VzOgpvdGhlciBvYmplY3QgdHlwZXMgY2FuIGhhdmUgbWV0aG9kcyBhcyB3ZWxsLiAgRm9yIGV4YW1wbGUsIGxpc3Qgb2JqZWN0cyBoYXZlCm1ldGhvZHMgY2FsbGVkIGFwcGVuZCwgaW5zZXJ0LCByZW1vdmUsIHNvcnQsIGFuZCBzbyBvbi4gIEhvd2V2ZXIsCmJlbG93LCB3ZSdsbCB1c2UgdGhlIHRlcm0gbWV0aG9kIGV4Y2x1c2l2ZWx5IHRvIG1lYW4gbWV0aG9kcyBvZiBjbGFzcwppbnN0YW5jZSBvYmplY3RzLCB1bmxlc3MgZXhwbGljaXRseSBzdGF0ZWQgb3RoZXJ3aXNlLikKClZhbGlkIG1ldGhvZCBuYW1lcyBvZiBhbiBpbnN0YW5jZSBvYmplY3QgZGVwZW5kIG9uIGl0cyBjbGFzcy4gIEJ5CmRlZmluaXRpb24sIGFsbCBhdHRyaWJ1dGVzIG9mIGEgY2xhc3MgdGhhdCBhcmUgKHVzZXItZGVmaW5lZCkgZnVuY3Rpb24gCm9iamVjdHMgZGVmaW5lIGNvcnJlc3BvbmRpbmcgbWV0aG9kcyBvZiBpdHMgaW5zdGFuY2VzLiAgU28gaW4gb3VyCmV4YW1wbGUsIFxjb2Rle3guZn0gaXMgYSB2YWxpZCBtZXRob2QgcmVmZXJlbmNlLCBzaW5jZQpcY29kZXtNeUNsYXNzLmZ9IGlzIGEgZnVuY3Rpb24sIGJ1dCBcY29kZXt4Lml9IGlzIG5vdCwgc2luY2UKXGNvZGV7TXlDbGFzcy5pfSBpcyBub3QuICBCdXQgXGNvZGV7eC5mfSBpcyBub3QgdGhlIHNhbWUgdGhpbmcgYXMKXGNvZGV7TXlDbGFzcy5mfSAtLS0gaXQgaXMgYSBcb2JpbmRleHttZXRob2R9XGVtcGh7bWV0aG9kIG9iamVjdH0sIG5vdAphIGZ1bmN0aW9uIG9iamVjdC4KCgpcc3Vic2VjdGlvbntNZXRob2QgT2JqZWN0cyBcbGFiZWx7bWV0aG9kT2JqZWN0c319CgpVc3VhbGx5LCBhIG1ldGhvZCBpcyBjYWxsZWQgaW1tZWRpYXRlbHk6CgpcYmVnaW57dmVyYmF0aW19CnguZigpClxlbmR7dmVyYmF0aW19CgpJbiBvdXIgZXhhbXBsZSwgdGhpcyB3aWxsIHJldHVybiB0aGUgc3RyaW5nIFxjb2RleydoZWxsbyB3b3JsZCd9LgpIb3dldmVyLCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNhbGwgYSBtZXRob2QgcmlnaHQgYXdheToKXGNvZGV7eC5mfSBpcyBhIG1ldGhvZCBvYmplY3QsIGFuZCBjYW4gYmUgc3RvcmVkIGF3YXkgYW5kIGNhbGxlZCBhdCBhCmxhdGVyIHRpbWUuICBGb3IgZXhhbXBsZToKClxiZWdpbnt2ZXJiYXRpbX0KeGYgPSB4LmYKd2hpbGUgVHJ1ZToKICAgIHByaW50IHhmKCkKXGVuZHt2ZXJiYXRpbX0KCndpbGwgY29udGludWUgdG8gcHJpbnQgXHNhbXB7aGVsbG8gd29ybGR9IHVudGlsIHRoZSBlbmQgb2YgdGltZS4KCldoYXQgZXhhY3RseSBoYXBwZW5zIHdoZW4gYSBtZXRob2QgaXMgY2FsbGVkPyAgWW91IG1heSBoYXZlIG5vdGljZWQKdGhhdCBcY29kZXt4LmYoKX0gd2FzIGNhbGxlZCB3aXRob3V0IGFuIGFyZ3VtZW50IGFib3ZlLCBldmVuIHRob3VnaAp0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBmb3IgXG1ldGhvZHtmfSBzcGVjaWZpZWQgYW4gYXJndW1lbnQuICBXaGF0CmhhcHBlbmVkIHRvIHRoZSBhcmd1bWVudD8gIFN1cmVseSBQeXRob24gcmFpc2VzIGFuIGV4Y2VwdGlvbiB3aGVuIGEKZnVuY3Rpb24gdGhhdCByZXF1aXJlcyBhbiBhcmd1bWVudCBpcyBjYWxsZWQgd2l0aG91dCBhbnkgLS0tIGV2ZW4gaWYKdGhlIGFyZ3VtZW50IGlzbid0IGFjdHVhbGx5IHVzZWQuLi4KCkFjdHVhbGx5LCB5b3UgbWF5IGhhdmUgZ3Vlc3NlZCB0aGUgYW5zd2VyOiB0aGUgc3BlY2lhbCB0aGluZyBhYm91dAptZXRob2RzIGlzIHRoYXQgdGhlIG9iamVjdCBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZQpmdW5jdGlvbi4gIEluIG91ciBleGFtcGxlLCB0aGUgY2FsbCBcY29kZXt4LmYoKX0gaXMgZXhhY3RseSBlcXVpdmFsZW50CnRvIFxjb2Rle015Q2xhc3MuZih4KX0uICBJbiBnZW5lcmFsLCBjYWxsaW5nIGEgbWV0aG9kIHdpdGggYSBsaXN0IG9mClx2YXJ7bn0gYXJndW1lbnRzIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyB0aGUgY29ycmVzcG9uZGluZyBmdW5jdGlvbgp3aXRoIGFuIGFyZ3VtZW50IGxpc3QgdGhhdCBpcyBjcmVhdGVkIGJ5IGluc2VydGluZyB0aGUgbWV0aG9kJ3Mgb2JqZWN0CmJlZm9yZSB0aGUgZmlyc3QgYXJndW1lbnQuCgpJZiB5b3Ugc3RpbGwgZG9uJ3QgdW5kZXJzdGFuZCBob3cgbWV0aG9kcyB3b3JrLCBhIGxvb2sgYXQgdGhlCmltcGxlbWVudGF0aW9uIGNhbiBwZXJoYXBzIGNsYXJpZnkgbWF0dGVycy4gIFdoZW4gYW4gaW5zdGFuY2UKYXR0cmlidXRlIGlzIHJlZmVyZW5jZWQgdGhhdCBpc24ndCBhIGRhdGEgYXR0cmlidXRlLCBpdHMgY2xhc3MgaXMKc2VhcmNoZWQuICBJZiB0aGUgbmFtZSBkZW5vdGVzIGEgdmFsaWQgY2xhc3MgYXR0cmlidXRlIHRoYXQgaXMgYQpmdW5jdGlvbiBvYmplY3QsIGEgbWV0aG9kIG9iamVjdCBpcyBjcmVhdGVkIGJ5IHBhY2tpbmcgKHBvaW50ZXJzIHRvKQp0aGUgaW5zdGFuY2Ugb2JqZWN0IGFuZCB0aGUgZnVuY3Rpb24gb2JqZWN0IGp1c3QgZm91bmQgdG9nZXRoZXIgaW4gYW4KYWJzdHJhY3Qgb2JqZWN0OiB0aGlzIGlzIHRoZSBtZXRob2Qgb2JqZWN0LiAgV2hlbiB0aGUgbWV0aG9kIG9iamVjdCBpcwpjYWxsZWQgd2l0aCBhbiBhcmd1bWVudCBsaXN0LCBpdCBpcyB1bnBhY2tlZCBhZ2FpbiwgYSBuZXcgYXJndW1lbnQKbGlzdCBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBpbnN0YW5jZSBvYmplY3QgYW5kIHRoZSBvcmlnaW5hbCBhcmd1bWVudApsaXN0LCBhbmQgdGhlIGZ1bmN0aW9uIG9iamVjdCBpcyBjYWxsZWQgd2l0aCB0aGlzIG5ldyBhcmd1bWVudCBsaXN0LgoKClxzZWN0aW9ue1JhbmRvbSBSZW1hcmtzIFxsYWJlbHtyZW1hcmtzfX0KCiUgW1RoZXNlIHNob3VsZCBwZXJoYXBzIGJlIHBsYWNlZCBtb3JlIGNhcmVmdWxseS4uLl0KCgpEYXRhIGF0dHJpYnV0ZXMgb3ZlcnJpZGUgbWV0aG9kIGF0dHJpYnV0ZXMgd2l0aCB0aGUgc2FtZSBuYW1lOyB0bwphdm9pZCBhY2NpZGVudGFsIG5hbWUgY29uZmxpY3RzLCB3aGljaCBtYXkgY2F1c2UgaGFyZC10by1maW5kIGJ1Z3MgaW4KbGFyZ2UgcHJvZ3JhbXMsIGl0IGlzIHdpc2UgdG8gdXNlIHNvbWUga2luZCBvZiBjb252ZW50aW9uIHRoYXQKbWluaW1pemVzIHRoZSBjaGFuY2Ugb2YgY29uZmxpY3RzLiAgUG9zc2libGUgY29udmVudGlvbnMgaW5jbHVkZQpjYXBpdGFsaXppbmcgbWV0aG9kIG5hbWVzLCBwcmVmaXhpbmcgZGF0YSBhdHRyaWJ1dGUgbmFtZXMgd2l0aCBhIHNtYWxsCnVuaXF1ZSBzdHJpbmcgKHBlcmhhcHMganVzdCBhbiB1bmRlcnNjb3JlKSwgb3IgdXNpbmcgdmVyYnMgZm9yIG1ldGhvZHMKYW5kIG5vdW5zIGZvciBkYXRhIGF0dHJpYnV0ZXMuCgoKRGF0YSBhdHRyaWJ1dGVzIG1heSBiZSByZWZlcmVuY2VkIGJ5IG1ldGhvZHMgYXMgd2VsbCBhcyBieSBvcmRpbmFyeQp1c2VycyAoYGBjbGllbnRzJycpIG9mIGFuIG9iamVjdC4gIEluIG90aGVyIHdvcmRzLCBjbGFzc2VzIGFyZSBub3QKdXNhYmxlIHRvIGltcGxlbWVudCBwdXJlIGFic3RyYWN0IGRhdGEgdHlwZXMuICBJbiBmYWN0LCBub3RoaW5nIGluClB5dGhvbiBtYWtlcyBpdCBwb3NzaWJsZSB0byBlbmZvcmNlIGRhdGEgaGlkaW5nIC0tLSBpdCBpcyBhbGwgYmFzZWQKdXBvbiBjb252ZW50aW9uLiAgKE9uIHRoZSBvdGhlciBoYW5kLCB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uLAp3cml0dGVuIGluIEMsIGNhbiBjb21wbGV0ZWx5IGhpZGUgaW1wbGVtZW50YXRpb24gZGV0YWlscyBhbmQgY29udHJvbAphY2Nlc3MgdG8gYW4gb2JqZWN0IGlmIG5lY2Vzc2FyeTsgdGhpcyBjYW4gYmUgdXNlZCBieSBleHRlbnNpb25zIHRvClB5dGhvbiB3cml0dGVuIGluIEMuKQoKCkNsaWVudHMgc2hvdWxkIHVzZSBkYXRhIGF0dHJpYnV0ZXMgd2l0aCBjYXJlIC0tLSBjbGllbnRzIG1heSBtZXNzIHVwCmludmFyaWFudHMgbWFpbnRhaW5lZCBieSB0aGUgbWV0aG9kcyBieSBzdGFtcGluZyBvbiB0aGVpciBkYXRhCmF0dHJpYnV0ZXMuICBOb3RlIHRoYXQgY2xpZW50cyBtYXkgYWRkIGRhdGEgYXR0cmlidXRlcyBvZiB0aGVpciBvd24gdG8KYW4gaW5zdGFuY2Ugb2JqZWN0IHdpdGhvdXQgYWZmZWN0aW5nIHRoZSB2YWxpZGl0eSBvZiB0aGUgbWV0aG9kcywgYXMKbG9uZyBhcyBuYW1lIGNvbmZsaWN0cyBhcmUgYXZvaWRlZCAtLS0gYWdhaW4sIGEgbmFtaW5nIGNvbnZlbnRpb24gY2FuCnNhdmUgYSBsb3Qgb2YgaGVhZGFjaGVzIGhlcmUuCgoKVGhlcmUgaXMgbm8gc2hvcnRoYW5kIGZvciByZWZlcmVuY2luZyBkYXRhIGF0dHJpYnV0ZXMgKG9yIG90aGVyCm1ldGhvZHMhKSBmcm9tIHdpdGhpbiBtZXRob2RzLiAgSSBmaW5kIHRoYXQgdGhpcyBhY3R1YWxseSBpbmNyZWFzZXMKdGhlIHJlYWRhYmlsaXR5IG9mIG1ldGhvZHM6IHRoZXJlIGlzIG5vIGNoYW5jZSBvZiBjb25mdXNpbmcgbG9jYWwKdmFyaWFibGVzIGFuZCBpbnN0YW5jZSB2YXJpYWJsZXMgd2hlbiBnbGFuY2luZyB0aHJvdWdoIGEgbWV0aG9kLgoKCkNvbnZlbnRpb25hbGx5LCB0aGUgZmlyc3QgYXJndW1lbnQgb2YgbWV0aG9kcyBpcyBvZnRlbiBjYWxsZWQKXGNvZGV7c2VsZn0uICBUaGlzIGlzIG5vdGhpbmcgbW9yZSB0aGFuIGEgY29udmVudGlvbjogdGhlIG5hbWUKXGNvZGV7c2VsZn0gaGFzIGFic29sdXRlbHkgbm8gc3BlY2lhbCBtZWFuaW5nIHRvIFB5dGhvbi4gIChOb3RlLApob3dldmVyLCB0aGF0IGJ5IG5vdCBmb2xsb3dpbmcgdGhlIGNvbnZlbnRpb24geW91ciBjb2RlIG1heSBiZSBsZXNzCnJlYWRhYmxlIGJ5IG90aGVyIFB5dGhvbiBwcm9ncmFtbWVycywgYW5kIGl0IGlzIGFsc28gY29uY2VpdmFibGUgdGhhdAphIFxlbXBoe2NsYXNzIGJyb3dzZXJ9IHByb2dyYW0gYmUgd3JpdHRlbiB3aGljaCByZWxpZXMgdXBvbiBzdWNoIGEKY29udmVudGlvbi4pCgoKQW55IGZ1bmN0aW9uIG9iamVjdCB0aGF0IGlzIGEgY2xhc3MgYXR0cmlidXRlIGRlZmluZXMgYSBtZXRob2QgZm9yCmluc3RhbmNlcyBvZiB0aGF0IGNsYXNzLiAgSXQgaXMgbm90IG5lY2Vzc2FyeSB0aGF0IHRoZSBmdW5jdGlvbgpkZWZpbml0aW9uIGlzIHRleHR1YWxseSBlbmNsb3NlZCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbjogYXNzaWduaW5nIGEKZnVuY3Rpb24gb2JqZWN0IHRvIGEgbG9jYWwgdmFyaWFibGUgaW4gdGhlIGNsYXNzIGlzIGFsc28gb2suICBGb3IKZXhhbXBsZToKClxiZWdpbnt2ZXJiYXRpbX0KIyBGdW5jdGlvbiBkZWZpbmVkIG91dHNpZGUgdGhlIGNsYXNzCmRlZiBmMShzZWxmLCB4LCB5KToKICAgIHJldHVybiBtaW4oeCwgeCt5KQoKY2xhc3MgQzoKICAgIGYgPSBmMQogICAgZGVmIGcoc2VsZik6CiAgICAgICAgcmV0dXJuICdoZWxsbyB3b3JsZCcKICAgIGggPSBnClxlbmR7dmVyYmF0aW19CgpOb3cgXGNvZGV7Zn0sIFxjb2Rle2d9IGFuZCBcY29kZXtofSBhcmUgYWxsIGF0dHJpYnV0ZXMgb2YgY2xhc3MKXGNsYXNze0N9IHRoYXQgcmVmZXIgdG8gZnVuY3Rpb24gb2JqZWN0cywgYW5kIGNvbnNlcXVlbnRseSB0aGV5IGFyZSBhbGwKbWV0aG9kcyBvZiBpbnN0YW5jZXMgb2YgXGNsYXNze0N9IC0tLSBcY29kZXtofSBiZWluZyBleGFjdGx5IGVxdWl2YWxlbnQKdG8gXGNvZGV7Z30uICBOb3RlIHRoYXQgdGhpcyBwcmFjdGljZSB1c3VhbGx5IG9ubHkgc2VydmVzIHRvIGNvbmZ1c2UKdGhlIHJlYWRlciBvZiBhIHByb2dyYW0uCgoKTWV0aG9kcyBtYXkgY2FsbCBvdGhlciBtZXRob2RzIGJ5IHVzaW5nIG1ldGhvZCBhdHRyaWJ1dGVzIG9mIHRoZQpcY29kZXtzZWxmfSBhcmd1bWVudDoKClxiZWdpbnt2ZXJiYXRpbX0KY2xhc3MgQmFnOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuZGF0YSA9IFtdCiAgICBkZWYgYWRkKHNlbGYsIHgpOgogICAgICAgIHNlbGYuZGF0YS5hcHBlbmQoeCkKICAgIGRlZiBhZGR0d2ljZShzZWxmLCB4KToKICAgICAgICBzZWxmLmFkZCh4KQogICAgICAgIHNlbGYuYWRkKHgpClxlbmR7dmVyYmF0aW19CgpNZXRob2RzIG1heSByZWZlcmVuY2UgZ2xvYmFsIG5hbWVzIGluIHRoZSBzYW1lIHdheSBhcyBvcmRpbmFyeQpmdW5jdGlvbnMuICBUaGUgZ2xvYmFsIHNjb3BlIGFzc29jaWF0ZWQgd2l0aCBhIG1ldGhvZCBpcyB0aGUgbW9kdWxlCmNvbnRhaW5pbmcgdGhlIGNsYXNzIGRlZmluaXRpb24uICAoVGhlIGNsYXNzIGl0c2VsZiBpcyBuZXZlciB1c2VkIGFzIGEKZ2xvYmFsIHNjb3BlISkgIFdoaWxlIG9uZSByYXJlbHkgZW5jb3VudGVycyBhIGdvb2QgcmVhc29uIGZvciB1c2luZwpnbG9iYWwgZGF0YSBpbiBhIG1ldGhvZCwgdGhlcmUgYXJlIG1hbnkgbGVnaXRpbWF0ZSB1c2VzIG9mIHRoZSBnbG9iYWwKc2NvcGU6IGZvciBvbmUgdGhpbmcsIGZ1bmN0aW9ucyBhbmQgbW9kdWxlcyBpbXBvcnRlZCBpbnRvIHRoZSBnbG9iYWwKc2NvcGUgY2FuIGJlIHVzZWQgYnkgbWV0aG9kcywgYXMgd2VsbCBhcyBmdW5jdGlvbnMgYW5kIGNsYXNzZXMgZGVmaW5lZAppbiBpdC4gIFVzdWFsbHksIHRoZSBjbGFzcyBjb250YWluaW5nIHRoZSBtZXRob2QgaXMgaXRzZWxmIGRlZmluZWQgaW4KdGhpcyBnbG9iYWwgc2NvcGUsIGFuZCBpbiB0aGUgbmV4dCBzZWN0aW9uIHdlJ2xsIGZpbmQgc29tZSBnb29kCnJlYXNvbnMgd2h5IGEgbWV0aG9kIHdvdWxkIHdhbnQgdG8gcmVmZXJlbmNlIGl0cyBvd24gY2xhc3MhCgoKXHNlY3Rpb257SW5oZXJpdGFuY2UgXGxhYmVse2luaGVyaXRhbmNlfX0KCk9mIGNvdXJzZSwgYSBsYW5ndWFnZSBmZWF0dXJlIHdvdWxkIG5vdCBiZSB3b3J0aHkgb2YgdGhlIG5hbWUgYGBjbGFzcycnCndpdGhvdXQgc3VwcG9ydGluZyBpbmhlcml0YW5jZS4gIFRoZSBzeW50YXggZm9yIGEgZGVyaXZlZCBjbGFzcwpkZWZpbml0aW9uIGxvb2tzIGFzIGZvbGxvd3M6CgpcYmVnaW57dmVyYmF0aW19CmNsYXNzIERlcml2ZWRDbGFzc05hbWUoQmFzZUNsYXNzTmFtZSk6CiAgICA8c3RhdGVtZW50LTE+CiAgICAuCiAgICAuCiAgICAuCiAgICA8c3RhdGVtZW50LU4+ClxlbmR7dmVyYmF0aW19CgpUaGUgbmFtZSBcY2xhc3N7QmFzZUNsYXNzTmFtZX0gbXVzdCBiZSBkZWZpbmVkIGluIGEgc2NvcGUgY29udGFpbmluZwp0aGUgZGVyaXZlZCBjbGFzcyBkZWZpbml0aW9uLiAgSW5zdGVhZCBvZiBhIGJhc2UgY2xhc3MgbmFtZSwgYW4KZXhwcmVzc2lvbiBpcyBhbHNvIGFsbG93ZWQuICBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZSBiYXNlIGNsYXNzIGlzCmRlZmluZWQgaW4gYW5vdGhlciBtb2R1bGUsCgpcYmVnaW57dmVyYmF0aW19CmNsYXNzIERlcml2ZWRDbGFzc05hbWUobW9kbmFtZS5CYXNlQ2xhc3NOYW1lKToKXGVuZHt2ZXJiYXRpbX0KCkV4ZWN1dGlvbiBvZiBhIGRlcml2ZWQgY2xhc3MgZGVmaW5pdGlvbiBwcm9jZWVkcyB0aGUgc2FtZSBhcyBmb3IgYQpiYXNlIGNsYXNzLiAgV2hlbiB0aGUgY2xhc3Mgb2JqZWN0IGlzIGNvbnN0cnVjdGVkLCB0aGUgYmFzZSBjbGFzcyBpcwpyZW1lbWJlcmVkLiAgVGhpcyBpcyB1c2VkIGZvciByZXNvbHZpbmcgYXR0cmlidXRlIHJlZmVyZW5jZXM6IGlmIGEKcmVxdWVzdGVkIGF0dHJpYnV0ZSBpcyBub3QgZm91bmQgaW4gdGhlIGNsYXNzLCBpdCBpcyBzZWFyY2hlZCBpbiB0aGUKYmFzZSBjbGFzcy4gIFRoaXMgcnVsZSBpcyBhcHBsaWVkIHJlY3Vyc2l2ZWx5IGlmIHRoZSBiYXNlIGNsYXNzIGl0c2VsZgppcyBkZXJpdmVkIGZyb20gc29tZSBvdGhlciBjbGFzcy4KClRoZXJlJ3Mgbm90aGluZyBzcGVjaWFsIGFib3V0IGluc3RhbnRpYXRpb24gb2YgZGVyaXZlZCBjbGFzc2VzOgpcY29kZXtEZXJpdmVkQ2xhc3NOYW1lKCl9IGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzLiAgTWV0aG9kCnJlZmVyZW5jZXMgYXJlIHJlc29sdmVkIGFzIGZvbGxvd3M6IHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzIGF0dHJpYnV0ZQppcyBzZWFyY2hlZCwgZGVzY2VuZGluZyBkb3duIHRoZSBjaGFpbiBvZiBiYXNlIGNsYXNzZXMgaWYgbmVjZXNzYXJ5LAphbmQgdGhlIG1ldGhvZCByZWZlcmVuY2UgaXMgdmFsaWQgaWYgdGhpcyB5aWVsZHMgYSBmdW5jdGlvbiBvYmplY3QuCgpEZXJpdmVkIGNsYXNzZXMgbWF5IG92ZXJyaWRlIG1ldGhvZHMgb2YgdGhlaXIgYmFzZSBjbGFzc2VzLiAgQmVjYXVzZQptZXRob2RzIGhhdmUgbm8gc3BlY2lhbCBwcml2aWxlZ2VzIHdoZW4gY2FsbGluZyBvdGhlciBtZXRob2RzIG9mIHRoZQpzYW1lIG9iamVjdCwgYSBtZXRob2Qgb2YgYSBiYXNlIGNsYXNzIHRoYXQgY2FsbHMgYW5vdGhlciBtZXRob2QKZGVmaW5lZCBpbiB0aGUgc2FtZSBiYXNlIGNsYXNzLCBtYXkgaW4gZmFjdCBlbmQgdXAgY2FsbGluZyBhIG1ldGhvZCBvZgphIGRlcml2ZWQgY2xhc3MgdGhhdCBvdmVycmlkZXMgaXQuICAoRm9yIFxDcHB7fSBwcm9ncmFtbWVyczogYWxsIG1ldGhvZHMKaW4gUHl0aG9uIGFyZSBlZmZlY3RpdmVseSBca2V5d29yZHt2aXJ0dWFsfS4pCgpBbiBvdmVycmlkaW5nIG1ldGhvZCBpbiBhIGRlcml2ZWQgY2xhc3MgbWF5IGluIGZhY3Qgd2FudCB0byBleHRlbmQKcmF0aGVyIHRoYW4gc2ltcGx5IHJlcGxhY2UgdGhlIGJhc2UgY2xhc3MgbWV0aG9kIG9mIHRoZSBzYW1lIG5hbWUuClRoZXJlIGlzIGEgc2ltcGxlIHdheSB0byBjYWxsIHRoZSBiYXNlIGNsYXNzIG1ldGhvZCBkaXJlY3RseToganVzdApjYWxsIFxzYW1we0Jhc2VDbGFzc05hbWUubWV0aG9kbmFtZShzZWxmLCBhcmd1bWVudHMpfS4gIFRoaXMgaXMKb2NjYXNpb25hbGx5IHVzZWZ1bCB0byBjbGllbnRzIGFzIHdlbGwuICAoTm90ZSB0aGF0IHRoaXMgb25seSB3b3JrcyBpZgp0aGUgYmFzZSBjbGFzcyBpcyBkZWZpbmVkIG9yIGltcG9ydGVkIGRpcmVjdGx5IGluIHRoZSBnbG9iYWwgc2NvcGUuKQoKClxzdWJzZWN0aW9ue011bHRpcGxlIEluaGVyaXRhbmNlIFxsYWJlbHttdWx0aXBsZX19CgpQeXRob24gc3VwcG9ydHMgYSBsaW1pdGVkIGZvcm0gb2YgbXVsdGlwbGUgaW5oZXJpdGFuY2UgYXMgd2VsbC4gIEEKY2xhc3MgZGVmaW5pdGlvbiB3aXRoIG11bHRpcGxlIGJhc2UgY2xhc3NlcyBsb29rcyBhcyBmb2xsb3dzOgoKXGJlZ2lue3ZlcmJhdGltfQpjbGFzcyBEZXJpdmVkQ2xhc3NOYW1lKEJhc2UxLCBCYXNlMiwgQmFzZTMpOgogICAgPHN0YXRlbWVudC0xPgogICAgLgogICAgLgogICAgLgogICAgPHN0YXRlbWVudC1OPgpcZW5ke3ZlcmJhdGltfQoKVGhlIG9ubHkgcnVsZSBuZWNlc3NhcnkgdG8gZXhwbGFpbiB0aGUgc2VtYW50aWNzIGlzIHRoZSByZXNvbHV0aW9uCnJ1bGUgdXNlZCBmb3IgY2xhc3MgYXR0cmlidXRlIHJlZmVyZW5jZXMuICBUaGlzIGlzIGRlcHRoLWZpcnN0LApsZWZ0LXRvLXJpZ2h0LiAgVGh1cywgaWYgYW4gYXR0cmlidXRlIGlzIG5vdCBmb3VuZCBpbgpcY2xhc3N7RGVyaXZlZENsYXNzTmFtZX0sIGl0IGlzIHNlYXJjaGVkIGluIFxjbGFzc3tCYXNlMX0sIHRoZW4KKHJlY3Vyc2l2ZWx5KSBpbiB0aGUgYmFzZSBjbGFzc2VzIG9mIFxjbGFzc3tCYXNlMX0sIGFuZCBvbmx5IGlmIGl0IGlzCm5vdCBmb3VuZCB0aGVyZSwgaXQgaXMgc2VhcmNoZWQgaW4gXGNsYXNze0Jhc2UyfSwgYW5kIHNvIG9uLgoKKFRvIHNvbWUgcGVvcGxlIGJyZWFkdGggZmlyc3QgLS0tIHNlYXJjaGluZyBcY2xhc3N7QmFzZTJ9IGFuZApcY2xhc3N7QmFzZTN9IGJlZm9yZSB0aGUgYmFzZSBjbGFzc2VzIG9mIFxjbGFzc3tCYXNlMX0gLS0tIGxvb2tzIG1vcmUKbmF0dXJhbC4gIEhvd2V2ZXIsIHRoaXMgd291bGQgcmVxdWlyZSB5b3UgdG8ga25vdyB3aGV0aGVyIGEgcGFydGljdWxhcgphdHRyaWJ1dGUgb2YgXGNsYXNze0Jhc2UxfSBpcyBhY3R1YWxseSBkZWZpbmVkIGluIFxjbGFzc3tCYXNlMX0gb3IgaW4Kb25lIG9mIGl0cyBiYXNlIGNsYXNzZXMgYmVmb3JlIHlvdSBjYW4gZmlndXJlIG91dCB0aGUgY29uc2VxdWVuY2VzIG9mCmEgbmFtZSBjb25mbGljdCB3aXRoIGFuIGF0dHJpYnV0ZSBvZiBcY2xhc3N7QmFzZTJ9LiAgVGhlIGRlcHRoLWZpcnN0CnJ1bGUgbWFrZXMgbm8gZGlmZmVyZW5jZXMgYmV0d2VlbiBkaXJlY3QgYW5kIGluaGVyaXRlZCBhdHRyaWJ1dGVzIG9mClxjbGFzc3tCYXNlMX0uKQoKSXQgaXMgY2xlYXIgdGhhdCBpbmRpc2NyaW1pbmF0ZSB1c2Ugb2YgbXVsdGlwbGUgaW5oZXJpdGFuY2UgaXMgYQptYWludGVuYW5jZSBuaWdodG1hcmUsIGdpdmVuIHRoZSByZWxpYW5jZSBpbiBQeXRob24gb24gY29udmVudGlvbnMgdG8KYXZvaWQgYWNjaWRlbnRhbCBuYW1lIGNvbmZsaWN0cy4gIEEgd2VsbC1rbm93biBwcm9ibGVtIHdpdGggbXVsdGlwbGUKaW5oZXJpdGFuY2UgaXMgYSBjbGFzcyBkZXJpdmVkIGZyb20gdHdvIGNsYXNzZXMgdGhhdCBoYXBwZW4gdG8gaGF2ZSBhCmNvbW1vbiBiYXNlIGNsYXNzLiAgV2hpbGUgaXQgaXMgZWFzeSBlbm91Z2ggdG8gZmlndXJlIG91dCB3aGF0IGhhcHBlbnMKaW4gdGhpcyBjYXNlICh0aGUgaW5zdGFuY2Ugd2lsbCBoYXZlIGEgc2luZ2xlIGNvcHkgb2YgYGBpbnN0YW5jZQp2YXJpYWJsZXMnJyBvciBkYXRhIGF0dHJpYnV0ZXMgdXNlZCBieSB0aGUgY29tbW9uIGJhc2UgY2xhc3MpLCBpdCBpcwpub3QgY2xlYXIgdGhhdCB0aGVzZSBzZW1hbnRpY3MgYXJlIGluIGFueSB3YXkgdXNlZnVsLgoKClxzZWN0aW9ue1ByaXZhdGUgVmFyaWFibGVzIFxsYWJlbHtwcml2YXRlfX0KClRoZXJlIGlzIGxpbWl0ZWQgc3VwcG9ydCBmb3IgY2xhc3MtcHJpdmF0ZQppZGVudGlmaWVycy4gIEFueSBpZGVudGlmaWVyIG9mIHRoZSBmb3JtIFxjb2Rle19fc3BhbX0gKGF0IGxlYXN0IHR3bwpsZWFkaW5nIHVuZGVyc2NvcmVzLCBhdCBtb3N0IG9uZSB0cmFpbGluZyB1bmRlcnNjb3JlKSBpcyB0ZXh0dWFsbHkKcmVwbGFjZWQgd2l0aCBcY29kZXtfY2xhc3NuYW1lX19zcGFtfSwgd2hlcmUgXGNvZGV7Y2xhc3NuYW1lfSBpcyB0aGUKY3VycmVudCBjbGFzcyBuYW1lIHdpdGggbGVhZGluZyB1bmRlcnNjb3JlKHMpIHN0cmlwcGVkLiAgVGhpcyBtYW5nbGluZwppcyBkb25lIHdpdGhvdXQgcmVnYXJkIG9mIHRoZSBzeW50YWN0aWMgcG9zaXRpb24gb2YgdGhlIGlkZW50aWZpZXIsIHNvCml0IGNhbiBiZSB1c2VkIHRvIGRlZmluZSBjbGFzcy1wcml2YXRlIGluc3RhbmNlIGFuZCBjbGFzcyB2YXJpYWJsZXMsCm1ldGhvZHMsIGFzIHdlbGwgYXMgZ2xvYmFscywgYW5kIGV2ZW4gdG8gc3RvcmUgaW5zdGFuY2UgdmFyaWFibGVzCnByaXZhdGUgdG8gdGhpcyBjbGFzcyBvbiBpbnN0YW5jZXMgb2YgXGVtcGh7b3RoZXJ9IGNsYXNzZXMuICBUcnVuY2F0aW9uCm1heSBvY2N1ciB3aGVuIHRoZSBtYW5nbGVkIG5hbWUgd291bGQgYmUgbG9uZ2VyIHRoYW4gMjU1IGNoYXJhY3RlcnMuCk91dHNpZGUgY2xhc3Nlcywgb3Igd2hlbiB0aGUgY2xhc3MgbmFtZSBjb25zaXN0cyBvZiBvbmx5IHVuZGVyc2NvcmVzLApubyBtYW5nbGluZyBvY2N1cnMuCgpOYW1lIG1hbmdsaW5nIGlzIGludGVuZGVkIHRvIGdpdmUgY2xhc3NlcyBhbiBlYXN5IHdheSB0byBkZWZpbmUKYGBwcml2YXRlJycgaW5zdGFuY2UgdmFyaWFibGVzIGFuZCBtZXRob2RzLCB3aXRob3V0IGhhdmluZyB0byB3b3JyeQphYm91dCBpbnN0YW5jZSB2YXJpYWJsZXMgZGVmaW5lZCBieSBkZXJpdmVkIGNsYXNzZXMsIG9yIG11Y2tpbmcgd2l0aAppbnN0YW5jZSB2YXJpYWJsZXMgYnkgY29kZSBvdXRzaWRlIHRoZSBjbGFzcy4gIE5vdGUgdGhhdCB0aGUgbWFuZ2xpbmcKcnVsZXMgYXJlIGRlc2lnbmVkIG1vc3RseSB0byBhdm9pZCBhY2NpZGVudHM7IGl0IHN0aWxsIGlzIHBvc3NpYmxlIGZvcgphIGRldGVybWluZWQgc291bCB0byBhY2Nlc3Mgb3IgbW9kaWZ5IGEgdmFyaWFibGUgdGhhdCBpcyBjb25zaWRlcmVkCnByaXZhdGUuICBUaGlzIGNhbiBldmVuIGJlIHVzZWZ1bCBpbiBzcGVjaWFsIGNpcmN1bXN0YW5jZXMsIHN1Y2ggYXMgaW4KdGhlIGRlYnVnZ2VyLCBhbmQgdGhhdCdzIG9uZSByZWFzb24gd2h5IHRoaXMgbG9vcGhvbGUgaXMgbm90IGNsb3NlZC4KKEJ1Z2xldDogZGVyaXZhdGlvbiBvZiBhIGNsYXNzIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgYmFzZSBjbGFzcwptYWtlcyB1c2Ugb2YgcHJpdmF0ZSB2YXJpYWJsZXMgb2YgdGhlIGJhc2UgY2xhc3MgcG9zc2libGUuKQoKTm90aWNlIHRoYXQgY29kZSBwYXNzZWQgdG8gXGNvZGV7ZXhlY30sIFxjb2Rle2V2YWwoKX0gb3IKXGNvZGV7ZXZhbGZpbGUoKX0gZG9lcyBub3QgY29uc2lkZXIgdGhlIGNsYXNzbmFtZSBvZiB0aGUgaW52b2tpbmcgCmNsYXNzIHRvIGJlIHRoZSBjdXJyZW50IGNsYXNzOyB0aGlzIGlzIHNpbWlsYXIgdG8gdGhlIGVmZmVjdCBvZiB0aGUgClxjb2Rle2dsb2JhbH0gc3RhdGVtZW50LCB0aGUgZWZmZWN0IG9mIHdoaWNoIGlzIGxpa2V3aXNlIHJlc3RyaWN0ZWQgdG8gCmNvZGUgdGhhdCBpcyBieXRlLWNvbXBpbGVkIHRvZ2V0aGVyLiAgVGhlIHNhbWUgcmVzdHJpY3Rpb24gYXBwbGllcyB0bwpcY29kZXtnZXRhdHRyKCl9LCBcY29kZXtzZXRhdHRyKCl9IGFuZCBcY29kZXtkZWxhdHRyKCl9LCBhcyB3ZWxsIGFzCndoZW4gcmVmZXJlbmNpbmcgXGNvZGV7X19kaWN0X199IGRpcmVjdGx5LgoKClxzZWN0aW9ue09kZHMgYW5kIEVuZHMgXGxhYmVse29kZHN9fQoKU29tZXRpbWVzIGl0IGlzIHVzZWZ1bCB0byBoYXZlIGEgZGF0YSB0eXBlIHNpbWlsYXIgdG8gdGhlIFBhc2NhbApgYHJlY29yZCcnIG9yIEMgYGBzdHJ1Y3QnJywgYnVuZGxpbmcgdG9nZXRoZXIgYSBjb3VwbGUgb2YgbmFtZWQgZGF0YQppdGVtcy4gIEFuIGVtcHR5IGNsYXNzIGRlZmluaXRpb24gd2lsbCBkbyBuaWNlbHk6CgpcYmVnaW57dmVyYmF0aW19CmNsYXNzIEVtcGxveWVlOgogICAgcGFzcwoKam9obiA9IEVtcGxveWVlKCkgIyBDcmVhdGUgYW4gZW1wdHkgZW1wbG95ZWUgcmVjb3JkCgojIEZpbGwgdGhlIGZpZWxkcyBvZiB0aGUgcmVjb3JkCmpvaG4ubmFtZSA9ICdKb2huIERvZScKam9obi5kZXB0ID0gJ2NvbXB1dGVyIGxhYicKam9obi5zYWxhcnkgPSAxMDAwClxlbmR7dmVyYmF0aW19CgpBIHBpZWNlIG9mIFB5dGhvbiBjb2RlIHRoYXQgZXhwZWN0cyBhIHBhcnRpY3VsYXIgYWJzdHJhY3QgZGF0YSB0eXBlCmNhbiBvZnRlbiBiZSBwYXNzZWQgYSBjbGFzcyB0aGF0IGVtdWxhdGVzIHRoZSBtZXRob2RzIG9mIHRoYXQgZGF0YQp0eXBlIGluc3RlYWQuICBGb3IgaW5zdGFuY2UsIGlmIHlvdSBoYXZlIGEgZnVuY3Rpb24gdGhhdCBmb3JtYXRzIHNvbWUKZGF0YSBmcm9tIGEgZmlsZSBvYmplY3QsIHlvdSBjYW4gZGVmaW5lIGEgY2xhc3Mgd2l0aCBtZXRob2RzClxtZXRob2R7cmVhZCgpfSBhbmQgXG1ldGhvZHtyZWFkbGluZSgpfSB0aGF0IGdldHMgdGhlIGRhdGEgZnJvbSBhIHN0cmluZwpidWZmZXIgaW5zdGVhZCwgYW5kIHBhc3MgaXQgYXMgYW4gYXJndW1lbnQuJSAgKFVuZm9ydHVuYXRlbHksIHRoaXMKJXRlY2huaXF1ZSBoYXMgaXRzIGxpbWl0YXRpb25zOiBhIGNsYXNzIGNhbid0IGRlZmluZSBvcGVyYXRpb25zIHRoYXQKJWFyZSBhY2Nlc3NlZCBieSBzcGVjaWFsIHN5bnRheCBzdWNoIGFzIHNlcXVlbmNlIHN1YnNjcmlwdGluZyBvcgolYXJpdGhtZXRpYyBvcGVyYXRvcnMsIGFuZCBhc3NpZ25pbmcgc3VjaCBhIGBgcHNldWRvLWZpbGUnJyB0bwolXGNvZGV7c3lzLnN0ZGlufSB3aWxsIG5vdCBjYXVzZSB0aGUgaW50ZXJwcmV0ZXIgdG8gcmVhZCBmdXJ0aGVyIGlucHV0CiVmcm9tIGl0LikKCgpJbnN0YW5jZSBtZXRob2Qgb2JqZWN0cyBoYXZlIGF0dHJpYnV0ZXMsIHRvbzogXGNvZGV7bS5pbV9zZWxmfSBpcyB0aGUKb2JqZWN0IG9mIHdoaWNoIHRoZSBtZXRob2QgaXMgYW4gaW5zdGFuY2UsIGFuZCBcY29kZXttLmltX2Z1bmN9IGlzIHRoZQpmdW5jdGlvbiBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgbWV0aG9kLgoKClxzZWN0aW9ue0V4Y2VwdGlvbnMgQXJlIENsYXNzZXMgVG9vXGxhYmVse2V4Y2VwdGlvbkNsYXNzZXN9fQoKVXNlci1kZWZpbmVkIGV4Y2VwdGlvbnMgYXJlIGlkZW50aWZpZWQgYnkgY2xhc3NlcyBhcyB3ZWxsLiAgVXNpbmcgdGhpcwptZWNoYW5pc20gaXQgaXMgcG9zc2libGUgdG8gY3JlYXRlIGV4dGVuc2libGUgaGllcmFyY2hpZXMgb2YgZXhjZXB0aW9ucy4KClRoZXJlIGFyZSB0d28gbmV3IHZhbGlkIChzZW1hbnRpYykgZm9ybXMgZm9yIHRoZSByYWlzZSBzdGF0ZW1lbnQ6CgpcYmVnaW57dmVyYmF0aW19CnJhaXNlIENsYXNzLCBpbnN0YW5jZQoKcmFpc2UgaW5zdGFuY2UKXGVuZHt2ZXJiYXRpbX0KCkluIHRoZSBmaXJzdCBmb3JtLCBcY29kZXtpbnN0YW5jZX0gbXVzdCBiZSBhbiBpbnN0YW5jZSBvZgpcY2xhc3N7Q2xhc3N9IG9yIG9mIGEgY2xhc3MgZGVyaXZlZCBmcm9tIGl0LiAgVGhlIHNlY29uZCBmb3JtIGlzIGEKc2hvcnRoYW5kIGZvcjoKClxiZWdpbnt2ZXJiYXRpbX0KcmFpc2UgaW5zdGFuY2UuX19jbGFzc19fLCBpbnN0YW5jZQpcZW5ke3ZlcmJhdGltfQoKQSBjbGFzcyBpbiBhbiBleGNlcHQgY2xhdXNlIGlzIGNvbXBhdGlibGUgd2l0aCBhbiBleGNlcHRpb24gaWYgaXQgaXMgdGhlIHNhbWUKY2xhc3Mgb3IgYSBiYXNlIGNsYXNzIHRoZXJlb2YgKGJ1dCBub3QgdGhlIG90aGVyIHdheSBhcm91bmQgLS0tIGFuCmV4Y2VwdCBjbGF1c2UgbGlzdGluZyBhIGRlcml2ZWQgY2xhc3MgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBhIGJhc2UKY2xhc3MpLiAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIHByaW50IEIsIEMsIEQgaW4gdGhhdApvcmRlcjoKClxiZWdpbnt2ZXJiYXRpbX0KY2xhc3MgQjoKICAgIHBhc3MKY2xhc3MgQyhCKToKICAgIHBhc3MKY2xhc3MgRChDKToKICAgIHBhc3MKCmZvciBjIGluIFtCLCBDLCBEXToKICAgIHRyeToKICAgICAgICByYWlzZSBjKCkKICAgIGV4Y2VwdCBEOgogICAgICAgIHByaW50ICJEIgogICAgZXhjZXB0IEM6CiAgICAgICAgcHJpbnQgIkMiCiAgICBleGNlcHQgQjoKICAgICAgICBwcmludCAiQiIKXGVuZHt2ZXJiYXRpbX0KCk5vdGUgdGhhdCBpZiB0aGUgZXhjZXB0IGNsYXVzZXMgd2VyZSByZXZlcnNlZCAod2l0aApcc2FtcHtleGNlcHQgQn0gZmlyc3QpLCBpdCB3b3VsZCBoYXZlIHByaW50ZWQgQiwgQiwgQiAtLS0gdGhlIGZpcnN0Cm1hdGNoaW5nIGV4Y2VwdCBjbGF1c2UgaXMgdHJpZ2dlcmVkLgoKV2hlbiBhbiBlcnJvciBtZXNzYWdlIGlzIHByaW50ZWQgZm9yIGFuIHVuaGFuZGxlZCBleGNlcHRpb24gd2hpY2ggaXMgYQpjbGFzcywgdGhlIGNsYXNzIG5hbWUgaXMgcHJpbnRlZCwgdGhlbiBhIGNvbG9uIGFuZCBhIHNwYWNlLCBhbmQKZmluYWxseSB0aGUgaW5zdGFuY2UgY29udmVydGVkIHRvIGEgc3RyaW5nIHVzaW5nIHRoZSBidWlsdC1pbiBmdW5jdGlvbgpcZnVuY3Rpb257c3RyKCl9LgoKClxzZWN0aW9ue0l0ZXJhdG9yc1xsYWJlbHtpdGVyYXRvcnN9fQoKQnkgbm93LCB5b3UndmUgcHJvYmFibHkgbm90aWNlZCB0aGF0IG1vc3QgY29udGFpbmVyIG9iamVjdHMgY2FuIGJlIGxvb3BlZApvdmVyIHVzaW5nIGEgXGtleXdvcmR7Zm9yfSBzdGF0ZW1lbnQ6CgpcYmVnaW57dmVyYmF0aW19CmZvciBlbGVtZW50IGluIFsxLCAyLCAzXToKICAgIHByaW50IGVsZW1lbnQKZm9yIGVsZW1lbnQgaW4gKDEsIDIsIDMpOgogICAgcHJpbnQgZWxlbWVudApmb3Iga2V5IGluIHsnb25lJzoxLCAndHdvJzoyfToKICAgIHByaW50IGtleQpmb3IgY2hhciBpbiAiMTIzIjoKICAgIHByaW50IGNoYXIKZm9yIGxpbmUgaW4gb3BlbigibXlmaWxlLnR4dCIpOgogICAgcHJpbnQgbGluZQpcZW5ke3ZlcmJhdGltfQoKVGhpcyBzdHlsZSBvZiBhY2Nlc3MgaXMgY2xlYXIsIGNvbmNpc2UsIGFuZCBjb252ZW5pZW50LiAgVGhlIHVzZSBvZiBpdGVyYXRvcnMKcGVydmFkZXMgYW5kIHVuaWZpZXMgUHl0aG9uLiAgQmVoaW5kIHRoZSBzY2VuZXMsIHRoZSBca2V5d29yZHtmb3J9CnN0YXRlbWVudCBjYWxscyBcZnVuY3Rpb257aXRlcigpfSBvbiB0aGUgY29udGFpbmVyIG9iamVjdC4gIFRoZQpmdW5jdGlvbiByZXR1cm5zIGFuIGl0ZXJhdG9yIG9iamVjdCB0aGF0IGRlZmluZXMgdGhlIG1ldGhvZApcbWV0aG9ke25leHQoKX0gd2hpY2ggYWNjZXNzZXMgZWxlbWVudHMgaW4gdGhlIGNvbnRhaW5lciBvbmUgYXQgYQp0aW1lLiAgV2hlbiB0aGVyZSBhcmUgbm8gbW9yZSBlbGVtZW50cywgXG1ldGhvZHtuZXh0KCl9IHJhaXNlcyBhClxleGNlcHRpb257U3RvcEl0ZXJhdGlvbn0gZXhjZXB0aW9uIHdoaWNoIHRlbGxzIHRoZSBca2V5d29yZHtmb3J9IGxvb3AKdG8gdGVybWluYXRlLiAgVGhpcyBleGFtcGxlIHNob3dzIGhvdyBpdCBhbGwgd29ya3M6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBzID0gJ2FiYycKPj4+IGl0ID0gaXRlcihzKQo+Pj4gaXQKPGl0ZXJhdG9yIG9iamVjdCBhdCAweDAwQTFEQjUwPgo+Pj4gaXQubmV4dCgpCidhJwo+Pj4gaXQubmV4dCgpCidiJwo+Pj4gaXQubmV4dCgpCidjJwo+Pj4gaXQubmV4dCgpCgpUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgRmlsZSAiPHB5c2hlbGwjNj4iLCBsaW5lIDEsIGluIC10b3BsZXZlbC0KICAgIGl0Lm5leHQoKQpTdG9wSXRlcmF0aW9uClxlbmR7dmVyYmF0aW19CgpIYXZpbmcgc2VlbiB0aGUgbWVjaGFuaWNzIGJlaGluZCB0aGUgaXRlcmF0b3IgcHJvdG9jb2wsIGl0IGlzIGVhc3kgdG8gYWRkCml0ZXJhdG9yIGJlaGF2aW9yIHRvIHlvdXIgY2xhc3Nlcy4gIERlZmluZSBhIFxtZXRob2R7X19pdGVyX18oKX0gbWV0aG9kCndoaWNoIHJldHVybnMgYW4gb2JqZWN0IHdpdGggYSBcbWV0aG9ke25leHQoKX0gbWV0aG9kLiAgSWYgdGhlIGNsYXNzIGRlZmluZXMKXG1ldGhvZHtuZXh0KCl9LCB0aGVuIFxtZXRob2R7X19pdGVyX18oKX0gY2FuIGp1c3QgcmV0dXJuIFxjb2Rle3NlbGZ9OgoKXGJlZ2lue3ZlcmJhdGltfQpjbGFzcyBSZXZlcnNlOgogICAgIkl0ZXJhdG9yIGZvciBsb29waW5nIG92ZXIgYSBzZXF1ZW5jZSBiYWNrd2FyZHMiCiAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSk6CiAgICAgICAgc2VsZi5kYXRhID0gZGF0YQogICAgICAgIHNlbGYuaW5kZXggPSBsZW4oZGF0YSkKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZgogICAgZGVmIG5leHQoc2VsZik6CiAgICAgICAgaWYgc2VsZi5pbmRleCA9PSAwOgogICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCiAgICAgICAgc2VsZi5pbmRleCA9IHNlbGYuaW5kZXggLSAxCiAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVtzZWxmLmluZGV4XQoKPj4+IGZvciBjaGFyIGluIFJldmVyc2UoJ3NwYW0nKToKLi4uICAgICBwcmludCBjaGFyCi4uLgptCmEKcApzClxlbmR7dmVyYmF0aW19CgoKXHNlY3Rpb257R2VuZXJhdG9yc1xsYWJlbHtnZW5lcmF0b3JzfX0KCkdlbmVyYXRvcnMgYXJlIGEgc2ltcGxlIGFuZCBwb3dlcmZ1bCB0b29sIGZvciBjcmVhdGluZyBpdGVyYXRvcnMuICBUaGV5IGFyZQp3cml0dGVuIGxpa2UgcmVndWxhciBmdW5jdGlvbnMgYnV0IHVzZSB0aGUgXGtleXdvcmR7eWllbGR9IHN0YXRlbWVudCB3aGVuZXZlcgp0aGV5IHdhbnQgdG8gcmV0dXJuIGRhdGEuICBFYWNoIHRpbWUgXG1ldGhvZHtuZXh0KCl9IGlzIGNhbGxlZCwgdGhlCmdlbmVyYXRvciByZXN1bWVzIHdoZXJlIGl0IGxlZnQtb2ZmIChpdCByZW1lbWJlcnMgYWxsIHRoZSBkYXRhIHZhbHVlcyBhbmQKd2hpY2ggc3RhdGVtZW50IHdhcyBsYXN0IGV4ZWN1dGVkKS4gIEFuIGV4YW1wbGUgc2hvd3MgdGhhdCBnZW5lcmF0b3JzIGNhbgpiZSB0cml2aWFsbHkgZWFzeSB0byBjcmVhdGU6CgpcYmVnaW57dmVyYmF0aW19CmRlZiByZXZlcnNlKGRhdGEpOgogICAgZm9yIGluZGV4IGluIHJhbmdlKGxlbihkYXRhKS0xLCAtMSwgLTEpOgogICAgICAgIHlpZWxkIGRhdGFbaW5kZXhdCgkKPj4+IGZvciBjaGFyIGluIHJldmVyc2UoJ2dvbGYnKToKLi4uICAgICBwcmludCBjaGFyCi4uLgpmCmwKbwpnCQpcZW5ke3ZlcmJhdGltfQoKQW55dGhpbmcgdGhhdCBjYW4gYmUgZG9uZSB3aXRoIGdlbmVyYXRvcnMgY2FuIGFsc28gYmUgZG9uZSB3aXRoIGNsYXNzIGJhc2VkCml0ZXJhdG9ycyBhcyBkZXNjcmliZWQgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24uICBXaGF0IG1ha2VzIGdlbmVyYXRvcnMgc28KY29tcGFjdCBpcyB0aGF0IHRoZSBcbWV0aG9ke19faXRlcl9fKCl9IGFuZCBcbWV0aG9ke25leHQoKX0gbWV0aG9kcyBhcmUKY3JlYXRlZCBhdXRvbWF0aWNhbGx5LgoKQW5vdGhlciBrZXkgZmVhdHVyZSBpcyB0aGF0IHRoZSBsb2NhbCB2YXJpYWJsZXMgYW5kIGV4ZWN1dGlvbiBzdGF0ZQphcmUgYXV0b21hdGljYWxseSBzYXZlZCBiZXR3ZWVuIGNhbGxzLiAgVGhpcyBtYWRlIHRoZSBmdW5jdGlvbiBlYXNpZXIgdG8gd3JpdGUKYW5kIG11Y2ggbW9yZSBjbGVhciB0aGFuIGFuIGFwcHJvYWNoIHVzaW5nIGNsYXNzIHZhcmlhYmxlcyBsaWtlClxjb2Rle3NlbGYuaW5kZXh9IGFuZCBcY29kZXtzZWxmLmRhdGF9LgoKSW4gYWRkaXRpb24gdG8gYXV0b21hdGljIG1ldGhvZCBjcmVhdGlvbiBhbmQgc2F2aW5nIHByb2dyYW0gc3RhdGUsIHdoZW4KZ2VuZXJhdG9ycyB0ZXJtaW5hdGUsIHRoZXkgYXV0b21hdGljYWxseSByYWlzZSBcZXhjZXB0aW9ue1N0b3BJdGVyYXRpb259LgpJbiBjb21iaW5hdGlvbiwgdGhlc2UgZmVhdHVyZXMgbWFrZSBpdCBlYXN5IHRvIGNyZWF0ZSBpdGVyYXRvcnMgd2l0aCBubwptb3JlIGVmZm9ydCB0aGFuIHdyaXRpbmcgYSByZWd1bGFyIGZ1bmN0aW9uLgoKXHNlY3Rpb257R2VuZXJhdG9yIEV4cHJlc3Npb25zXGxhYmVse2dlbmV4cHN9fQoKU29tZSBzaW1wbGUgZ2VuZXJhdG9ycyBjYW4gYmUgY29kZWQgc3VjY2luY3RseSBhcyBleHByZXNzaW9ucyB1c2luZyBhIHN5bnRheApzaW1pbGFyIHRvIGxpc3QgY29tcHJlaGVuc2lvbnMgYnV0IHdpdGggcGFyZW50aGVzZXMgaW5zdGVhZCBvZiBicmFja2V0cy4gIFRoZXNlCmV4cHJlc3Npb25zIGFyZSBkZXNpZ25lZCBmb3Igc2l0dWF0aW9ucyB3aGVyZSB0aGUgZ2VuZXJhdG9yIGlzIHVzZWQgcmlnaHQKYXdheSBieSBhbiBlbmNsb3NpbmcgZnVuY3Rpb24uICBHZW5lcmF0b3IgZXhwcmVzc2lvbnMgYXJlIG1vcmUgY29tcGFjdCBidXQKbGVzcyB2ZXJzYXRpbGUgdGhhbiBmdWxsIGdlbmVyYXRvciBkZWZpbml0aW9ucyBhbmQgdGVuZCB0byBiZSBtb3JlIG1lbW9yeQpmcmllbmRseSB0aGFuIGVxdWl2YWxlbnQgbGlzdCBjb21wcmVoZW5zaW9ucy4KCkV4YW1wbGVzOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gc3VtKGkqaSBmb3IgaSBpbiByYW5nZSgxMCkpICAgICAgICAgICAgICAgICAjIHN1bSBvZiBzcXVhcmVzCjI4NQoKPj4+IHh2ZWMgPSBbMTAsIDIwLCAzMF0KPj4+IHl2ZWMgPSBbNywgNSwgM10KPj4+IHN1bSh4KnkgZm9yIHgseSBpbiB6aXAoeHZlYywgeXZlYykpICAgICAgICAgIyBkb3QgcHJvZHVjdAoyNjAKCj4+PiBmcm9tIG1hdGggaW1wb3J0IHBpLCBzaW4KPj4+IHNpbmVfdGFibGUgPSBkaWN0KCh4LCBzaW4oeCpwaS8xODApKSBmb3IgeCBpbiByYW5nZSgwLCA5MSkpCgo+Pj4gdW5pcXVlX3dvcmRzID0gc2V0KHdvcmQgIGZvciBsaW5lIGluIHBhZ2UgIGZvciB3b3JkIGluIGxpbmUuc3BsaXQoKSkKCj4+PiB2YWxlZGljdG9yaWFuID0gbWF4KChzdHVkZW50LmdwYSwgc3R1ZGVudC5uYW1lKSBmb3Igc3R1ZGVudCBpbiBncmFkdWF0ZXMpCgo+Pj4gZGF0YSA9ICdnb2xmJwo+Pj4gbGlzdChkYXRhW2ldIGZvciBpIGluIHJhbmdlKGxlbihkYXRhKS0xLC0xLC0xKSkKWydmJywgJ2wnLCAnbycsICdnJ10KClxlbmR7dmVyYmF0aW19CgoKClxjaGFwdGVye0JyaWVmIFRvdXIgb2YgdGhlIFN0YW5kYXJkIExpYnJhcnkgXGxhYmVse2JyaWVmVG91cn19CgoKXHNlY3Rpb257T3BlcmF0aW5nIFN5c3RlbSBJbnRlcmZhY2VcbGFiZWx7b3MtaW50ZXJmYWNlfX0KClRoZSBcdWxpbmt7XG1vZHVsZXtvc319ey4uL2xpYi9tb2R1bGUtb3MuaHRtbH0KbW9kdWxlIHByb3ZpZGVzIGRvemVucyBvZiBmdW5jdGlvbnMgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlCm9wZXJhdGluZyBzeXN0ZW06CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBpbXBvcnQgb3MKPj4+IG9zLnN5c3RlbSgndGltZSAwOjAyJykKMAo+Pj4gb3MuZ2V0Y3dkKCkgICAgICAjIFJldHVybiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeQonQzpcXFB5dGhvbjI0Jwo+Pj4gb3MuY2hkaXIoJy9zZXJ2ZXIvYWNjZXNzbG9ncycpClxlbmR7dmVyYmF0aW19CgpCZSBzdXJlIHRvIHVzZSB0aGUgXHNhbXB7aW1wb3J0IG9zfSBzdHlsZSBpbnN0ZWFkIG9mClxzYW1we2Zyb20gb3MgaW1wb3J0ICp9LiAgVGhpcyB3aWxsIGtlZXAgXGZ1bmN0aW9ue29zLm9wZW4oKX0gZnJvbQpzaGFkb3dpbmcgdGhlIGJ1aWx0aW4gXGZ1bmN0aW9ue29wZW4oKX0gZnVuY3Rpb24gd2hpY2ggb3BlcmF0ZXMgbXVjaApkaWZmZXJlbnRseS4KClxiaWZ1bmNpbmRleHtoZWxwfQpUaGUgYnVpbHRpbiBcZnVuY3Rpb257ZGlyKCl9IGFuZCBcZnVuY3Rpb257aGVscCgpfSBmdW5jdGlvbnMgYXJlIHVzZWZ1bAphcyBpbnRlcmFjdGl2ZSBhaWRzIGZvciB3b3JraW5nIHdpdGggbGFyZ2UgbW9kdWxlcyBsaWtlIFxtb2R1bGV7b3N9OgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gaW1wb3J0IG9zCj4+PiBkaXIob3MpCjxyZXR1cm5zIGEgbGlzdCBvZiBhbGwgbW9kdWxlIGZ1bmN0aW9ucz4KPj4+IGhlbHAob3MpCjxyZXR1cm5zIGFuIGV4dGVuc2l2ZSBtYW51YWwgcGFnZSBjcmVhdGVkIGZyb20gdGhlIG1vZHVsZSdzIGRvY3N0cmluZ3M+ClxlbmR7dmVyYmF0aW19CgpGb3IgZGFpbHkgZmlsZSBhbmQgZGlyZWN0b3J5IG1hbmFnZW1lbnQgdGFza3MsIHRoZSAKXHVsaW5re1xtb2R1bGV7c2h1dGlsfX17Li4vbGliL21vZHVsZS1zaHV0aWwuaHRtbH0KbW9kdWxlIHByb3ZpZGVzIGEgaGlnaGVyIGxldmVsIGludGVyZmFjZSB0aGF0IGlzIGVhc2llciB0byB1c2U6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBpbXBvcnQgc2h1dGlsCj4+PiBzaHV0aWwuY29weWZpbGUoJ2RhdGEuZGInLCAnYXJjaGl2ZS5kYicpCj4+PiBzaHV0aWwubW92ZSgnL2J1aWxkL2V4ZWN1dGFibGVzJywgJ2luc3RhbGxkaXInKQpcZW5ke3ZlcmJhdGltfQoKClxzZWN0aW9ue0ZpbGUgV2lsZGNhcmRzXGxhYmVse2ZpbGUtd2lsZGNhcmRzfX0KClRoZSBcdWxpbmt7XG1vZHVsZXtnbG9ifX17Li4vbGliL21vZHVsZS1nbG9iLmh0bWx9Cm1vZHVsZSBwcm92aWRlcyBhIGZ1bmN0aW9uIGZvciBtYWtpbmcgZmlsZSBsaXN0cyBmcm9tIGRpcmVjdG9yeQp3aWxkY2FyZCBzZWFyY2hlczoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGltcG9ydCBnbG9iCj4+PiBnbG9iLmdsb2IoJyoucHknKQpbJ3ByaW1lcy5weScsICdyYW5kb20ucHknLCAncXVvdGUucHknXQpcZW5ke3ZlcmJhdGltfQoKClxzZWN0aW9ue0NvbW1hbmQgTGluZSBBcmd1bWVudHNcbGFiZWx7Y29tbWFuZC1saW5lLWFyZ3VtZW50c319CgpDb21tb24gdXRpbGl0eSBzY3JpcHRzIG9mdGVuIGludm9rZSBwcm9jZXNzaW5nIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuClRoZXNlIGFyZ3VtZW50cyBhcmUgc3RvcmVkIGluIHRoZQpcdWxpbmt7XG1vZHVsZXtzeXN9fXsuLi9saWIvbW9kdWxlLXN5cy5odG1sfVwgbW9kdWxlJ3MgXHZhcnthcmd2fQphdHRyaWJ1dGUgYXMgYSBsaXN0LiAgRm9yIGluc3RhbmNlIHRoZSBmb2xsb3dpbmcgb3V0cHV0IHJlc3VsdHMgZnJvbQpydW5uaW5nIFxzYW1we3B5dGhvbiBkZW1vLnB5IG9uZSB0d28gdGhyZWV9IGF0IHRoZSBjb21tYW5kIGxpbmU6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBpbXBvcnQgc3lzCj4+PiBwcmludCBzeXMuYXJndgpbJ2RlbW8ucHknLCAnb25lJywgJ3R3bycsICd0aHJlZSddClxlbmR7dmVyYmF0aW19CgpUaGUgXHVsaW5re1xtb2R1bGV7Z2V0b3B0fX17Li4vbGliL21vZHVsZS1nZXRvcHQuaHRtbH0KbW9kdWxlIHByb2Nlc3NlcyBcdmFye3N5cy5hcmd2fSB1c2luZyB0aGUgY29udmVudGlvbnMgb2YgdGhlIFxVTklYe30KXGZ1bmN0aW9ue2dldG9wdCgpfSBmdW5jdGlvbi4gIE1vcmUgcG93ZXJmdWwgYW5kIGZsZXhpYmxlIGNvbW1hbmQgbGluZQpwcm9jZXNzaW5nIGlzIHByb3ZpZGVkIGJ5IHRoZQpcdWxpbmt7XG1vZHVsZXtvcHRwYXJzZX19ey4uL2xpYi9tb2R1bGUtb3B0cGFyc2UuaHRtbH0gbW9kdWxlLgoKClxzZWN0aW9ue0Vycm9yIE91dHB1dCBSZWRpcmVjdGlvbiBhbmQgUHJvZ3JhbSBUZXJtaW5hdGlvblxsYWJlbHtzdGRlcnJ9fQoKVGhlIFx1bGlua3tcbW9kdWxle3N5c319ey4uL2xpYi9tb2R1bGUtc3lzLmh0bWx9Cm1vZHVsZSBhbHNvIGhhcyBhdHRyaWJ1dGVzIGZvciBcdmFye3N0ZGlufSwgXHZhcntzdGRvdXR9LCBhbmQKXHZhcntzdGRlcnJ9LiAgVGhlIGxhdHRlciBpcyB1c2VmdWwgZm9yIGVtaXR0aW5nIHdhcm5pbmdzIGFuZCBlcnJvcgptZXNzYWdlcyB0byBtYWtlIHRoZW0gdmlzaWJsZSBldmVuIHdoZW4gXHZhcntzdGRvdXR9IGhhcyBiZWVuIHJlZGlyZWN0ZWQ6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBzeXMuc3RkZXJyLndyaXRlKCdXYXJuaW5nLCBsb2cgZmlsZSBub3QgZm91bmQgc3RhcnRpbmcgYSBuZXcgb25lJykKV2FybmluZywgbG9nIGZpbGUgbm90IGZvdW5kIHN0YXJ0aW5nIGEgbmV3IG9uZQpcZW5ke3ZlcmJhdGltfQoKVGhlIG1vc3QgZGlyZWN0IHdheSB0byB0ZXJtaW5hdGUgYSBzY3JpcHQgaXMgdG8gdXNlIFxzYW1we3N5cy5leGl0KCl9LgoKClxzZWN0aW9ue1N0cmluZyBQYXR0ZXJuIE1hdGNoaW5nXGxhYmVse3N0cmluZy1wYXR0ZXJuLW1hdGNoaW5nfX0KClRoZSBcdWxpbmt7XG1vZHVsZXtyZX19ey4uL2xpYi9tb2R1bGUtcmUuaHRtbH0KbW9kdWxlIHByb3ZpZGVzIHJlZ3VsYXIgZXhwcmVzc2lvbiB0b29scyBmb3IgYWR2YW5jZWQgc3RyaW5nIHByb2Nlc3NpbmcuCkZvciBjb21wbGV4IG1hdGNoaW5nIGFuZCBtYW5pcHVsYXRpb24sIHJlZ3VsYXIgZXhwcmVzc2lvbnMgb2ZmZXIgc3VjY2luY3QsCm9wdGltaXplZCBzb2x1dGlvbnM6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBpbXBvcnQgcmUKPj4+IHJlLmZpbmRhbGwocidcYmZbYS16XSonLCAnd2hpY2ggZm9vdCBvciBoYW5kIGZlbGwgZmFzdGVzdCcpClsnZm9vdCcsICdmZWxsJywgJ2Zhc3Rlc3QnXQo+Pj4gcmUuc3ViKHInKFxiW2Etel0rKSBcMScsIHInXDEnLCAnY2F0IGluIHRoZSB0aGUgaGF0JykKJ2NhdCBpbiB0aGUgaGF0JwpcZW5ke3ZlcmJhdGltfQoKV2hlbiBvbmx5IHNpbXBsZSBjYXBhYmlsaXRpZXMgYXJlIG5lZWRlZCwgc3RyaW5nIG1ldGhvZHMgYXJlIHByZWZlcnJlZApiZWNhdXNlIHRoZXkgYXJlIGVhc2llciB0byByZWFkIGFuZCBkZWJ1ZzoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+ICd0ZWEgZm9yIHRvbycucmVwbGFjZSgndG9vJywgJ3R3bycpCid0ZWEgZm9yIHR3bycKXGVuZHt2ZXJiYXRpbX0KClxzZWN0aW9ue01hdGhlbWF0aWNzXGxhYmVse21hdGhlbWF0aWNzfX0KClRoZSBcdWxpbmt7XG1vZHVsZXttYXRofX17Li4vbGliL21vZHVsZS1tYXRoLmh0bWx9IG1vZHVsZSBnaXZlcwphY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgQyBsaWJyYXJ5IGZ1bmN0aW9ucyBmb3IgZmxvYXRpbmcgcG9pbnQgbWF0aDoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGltcG9ydCBtYXRoCj4+PiBtYXRoLmNvcyhtYXRoLnBpIC8gNC4wKQowLjcwNzEwNjc4MTE4NjU0NzU3Cj4+PiBtYXRoLmxvZygxMDI0LCAyKQoxMC4wClxlbmR7dmVyYmF0aW19CgpUaGUgXHVsaW5re1xtb2R1bGV7cmFuZG9tfX17Li4vbGliL21vZHVsZS1yYW5kb20uaHRtbH0KbW9kdWxlIHByb3ZpZGVzIHRvb2xzIGZvciBtYWtpbmcgcmFuZG9tIHNlbGVjdGlvbnM6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBpbXBvcnQgcmFuZG9tCj4+PiByYW5kb20uY2hvaWNlKFsnYXBwbGUnLCAncGVhcicsICdiYW5hbmEnXSkKJ2FwcGxlJwo+Pj4gcmFuZG9tLnNhbXBsZSh4cmFuZ2UoMTAwKSwgMTApICAgIyBzYW1wbGluZyB3aXRob3V0IHJlcGxhY2VtZW50ClszMCwgODMsIDE2LCA0LCA4LCA4MSwgNDEsIDUwLCAxOCwgMzNdCj4+PiByYW5kb20ucmFuZG9tKCkgICAgIyByYW5kb20gZmxvYXQKMC4xNzk3MDk4NzY5MzcwNjE4Ngo+Pj4gcmFuZG9tLnJhbmRyYW5nZSg2KSAgICAjIHJhbmRvbSBpbnRlZ2VyIGNob3NlbiBmcm9tIHJhbmdlKDYpCjQgICAKXGVuZHt2ZXJiYXRpbX0KCgpcc2VjdGlvbntJbnRlcm5ldCBBY2Nlc3NcbGFiZWx7aW50ZXJuZXQtYWNjZXNzfX0KClRoZXJlIGFyZSBhIG51bWJlciBvZiBtb2R1bGVzIGZvciBhY2Nlc3NpbmcgdGhlIGludGVybmV0IGFuZCBwcm9jZXNzaW5nCmludGVybmV0IHByb3RvY29scy4gVHdvIG9mIHRoZSBzaW1wbGVzdCBhcmUKXHVsaW5re1xtb2R1bGV7dXJsbGliMn19ey4uL2xpYi9tb2R1bGUtdXJsbGliMi5odG1sfQpmb3IgcmV0cmlldmluZyBkYXRhIGZyb20gdXJscyBhbmQKXHVsaW5re1xtb2R1bGV7c210cGxpYn19ey4uL2xpYi9tb2R1bGUtc210cGxpYi5odG1sfSAKZm9yIHNlbmRpbmcgbWFpbDoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGltcG9ydCB1cmxsaWIyCj4+PiBmb3IgbGluZSBpbiB1cmxsaWIyLnVybG9wZW4oJ2h0dHA6Ly90eWNoby51c25vLm5hdnkubWlsL2NnaS1iaW4vdGltZXIucGwnKToKLi4uICAgICBpZiAnRVNUJyBpbiBsaW5lOiAgICAgICMgbG9vayBmb3IgRWFzdGVybiBTdGFuZGFyZCBUaW1lCi4uLiAgICAgICAgIHByaW50IGxpbmUKICAgIAo8QlI+Tm92LiAyNSwgMDk6NDM6MzIgUE0gRVNUCgo+Pj4gaW1wb3J0IHNtdHBsaWIKPj4+IHNlcnZlciA9IHNtdHBsaWIuU01UUCgnbG9jYWxob3N0JykKPj4+IHNlcnZlci5zZW5kbWFpbCgnc29vdGhzYXllckBleGFtcGxlLm9yZycsICdqY2Vhc2FyQGV4YW1wbGUub3JnJywKIiIiVG86IGpjZWFzYXJAZXhhbXBsZS5vcmcKRnJvbTogc29vdGhzYXllckBleGFtcGxlLm9yZwoKQmV3YXJlIHRoZSBJZGVzIG9mIE1hcmNoLgoiIiIpCj4+PiBzZXJ2ZXIucXVpdCgpClxlbmR7dmVyYmF0aW19CgoKXHNlY3Rpb257RGF0ZXMgYW5kIFRpbWVzXGxhYmVse2RhdGVzLWFuZC10aW1lc319CgpUaGUgXHVsaW5re1xtb2R1bGV7ZGF0ZXRpbWV9fXsuLi9saWIvbW9kdWxlLWRhdGV0aW1lLmh0bWx9IG1vZHVsZQpzdXBwbGllcyBjbGFzc2VzIGZvciBtYW5pcHVsYXRpbmcgZGF0ZXMgYW5kIHRpbWVzIGluIGJvdGggc2ltcGxlCmFuZCBjb21wbGV4IHdheXMuIFdoaWxlIGRhdGUgYW5kIHRpbWUgYXJpdGhtZXRpYyBpcyBzdXBwb3J0ZWQsIHRoZQpmb2N1cyBvZiB0aGUgaW1wbGVtZW50YXRpb24gaXMgb24gZWZmaWNpZW50IG1lbWJlciBleHRyYWN0aW9uIGZvcgpvdXRwdXQgZm9ybWF0dGluZyBhbmQgbWFuaXB1bGF0aW9uLiAgVGhlIG1vZHVsZSBhbHNvIHN1cHBvcnRzIG9iamVjdHMKdGhhdCBhcmUgdGltZSB6b25lIGF3YXJlLgoKXGJlZ2lue3ZlcmJhdGltfQojIGRhdGVzIGFyZSBlYXNpbHkgY29uc3RydWN0ZWQgYW5kIGZvcm1hdHRlZAo+Pj4gZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZQo+Pj4gbm93ID0gZGF0ZS50b2RheSgpCj4+PiBub3cKZGF0ZXRpbWUuZGF0ZSgyMDAzLCAxMiwgMikKPj4+IG5vdy5zdHJmdGltZSgiJW0tJWQtJXkgb3IgJWQlYiAlWSBpcyBhICVBIG9uIHRoZSAlZCBkYXkgb2YgJUIiKQonMTItMDItMDMgb3IgMDJEZWMgMjAwMyBpcyBhIFR1ZXNkYXkgb24gdGhlIDAyIGRheSBvZiBEZWNlbWJlcicKCiMgZGF0ZXMgc3VwcG9ydCBjYWxlbmRhciBhcml0aG1ldGljCj4+PiBiaXJ0aGRheSA9IGRhdGUoMTk2NCwgNywgMzEpCj4+PiBhZ2UgPSBub3cgLSBiaXJ0aGRheQo+Pj4gYWdlLmRheXMKMTQzNjgKXGVuZHt2ZXJiYXRpbX0KCgpcc2VjdGlvbntEYXRhIENvbXByZXNzaW9uXGxhYmVse2RhdGEtY29tcHJlc3Npb259fQoKQ29tbW9uIGRhdGEgYXJjaGl2aW5nIGFuZCBjb21wcmVzc2lvbiBmb3JtYXRzIGFyZSBkaXJlY3RseSBzdXBwb3J0ZWQKYnkgbW9kdWxlcyBpbmNsdWRpbmc6Clx1bGlua3tcbW9kdWxle3psaWJ9fXsuLi9saWIvbW9kdWxlLXpsaWIuaHRtbH0sClx1bGlua3tcbW9kdWxle2d6aXB9fXsuLi9saWIvbW9kdWxlLWd6aXAuaHRtbH0sClx1bGlua3tcbW9kdWxle2J6Mn19ey4uL2xpYi9tb2R1bGUtYnoyLmh0bWx9LApcdWxpbmt7XG1vZHVsZXt6aXBmaWxlfX17Li4vbGliL21vZHVsZS16aXBmaWxlLmh0bWx9LCBhbmQKXHVsaW5re1xtb2R1bGV7dGFyZmlsZX19ey4uL2xpYi9tb2R1bGUtdGFyZmlsZS5odG1sfS4KClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGltcG9ydCB6bGliCj4+PiBzID0gJ3dpdGNoIHdoaWNoIGhhcyB3aGljaCB3aXRjaGVzIHdyaXN0IHdhdGNoJwo+Pj4gbGVuKHMpCjQxCj4+PiB0ID0gemxpYi5jb21wcmVzcyhzKQo+Pj4gbGVuKHQpCjM3Cj4+PiB6bGliLmRlY29tcHJlc3ModCkKJ3dpdGNoIHdoaWNoIGhhcyB3aGljaCB3aXRjaGVzIHdyaXN0IHdhdGNoJwo+Pj4gemxpYi5jcmMzMih0KQotMTQzODA4NTAzMQpcZW5ke3ZlcmJhdGltfQoKClxzZWN0aW9ue1BlcmZvcm1hbmNlIE1lYXN1cmVtZW50XGxhYmVse3BlcmZvcm1hbmNlLW1lYXN1cmVtZW50fX0KClNvbWUgUHl0aG9uIHVzZXJzIGRldmVsb3AgYSBkZWVwIGludGVyZXN0IGluIGtub3dpbmcgdGhlIHJlbGF0aXZlCnBlcmZvcm1hbmNlIGJldHdlZW4gZGlmZmVyZW50IGFwcHJvYWNoZXMgdG8gdGhlIHNhbWUgcHJvYmxlbS4KUHl0aG9uIHByb3ZpZGVzIGEgbWVhc3VyZW1lbnQgdG9vbCB0aGF0IGFuc3dlcnMgdGhvc2UgcXVlc3Rpb25zCmltbWVkaWF0ZWx5LgoKRm9yIGV4YW1wbGUsIGl0IG1heSBiZSB0ZW1wdGluZyB0byB1c2UgdGhlIHR1cGxlIHBhY2tpbmcgYW5kIHVucGFja2luZwpmZWF0dXJlIGluc3RlYWQgb2YgdGhlIHRyYWRpdGlvbmFsIGFwcHJvYWNoIHRvIHN3YXBwaW5nIGFyZ3VtZW50cy4KVGhlIFx1bGlua3tcbW9kdWxle3RpbWVpdH19ey4uL2xpYi9tb2R1bGUtdGltZWl0Lmh0bWx9IG1vZHVsZQpxdWlja2x5IGRlbW9uc3RyYXRlcyBhIG1vZGVzdCBwZXJmb3JtYW5jZSBhZHZhbnRhZ2U6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBmcm9tIHRpbWVpdCBpbXBvcnQgVGltZXIKPj4+IFRpbWVyKCd0PWE7IGE9YjsgYj10JywgJ2E9MTsgYj0yJykudGltZWl0KCkKMC41NzUzNTgyODYyNjAyNDU3Nwo+Pj4gVGltZXIoJ2EsYiA9IGIsYScsICdhPTE7IGI9MicpLnRpbWVpdCgpCjAuNTQ5NjI1MzcwODU3NzA3OTEKXGVuZHt2ZXJiYXRpbX0KCkluIGNvbnRyYXN0IHRvIFxtb2R1bGV7dGltZWl0fSdzIGZpbmUgbGV2ZWwgb2YgZ3JhbnVsYXJpdHksIHRoZQpcdWxpbmt7XG1vZHVsZXtwcm9maWxlfX17Li4vbGliL21vZHVsZS1wcm9maWxlLmh0bWx9IGFuZCBcbW9kdWxle3BzdGF0c30KbW9kdWxlcyBwcm92aWRlIHRvb2xzIGZvciBpZGVudGlmeWluZyB0aW1lIGNyaXRpY2FsIHNlY3Rpb25zIGluIGxhcmdlciBibG9ja3MKb2YgY29kZS4KCgpcc2VjdGlvbntRdWFsaXR5IENvbnRyb2xcbGFiZWx7cXVhbGl0eS1jb250cm9sfX0KCk9uZSBhcHByb2FjaCBmb3IgZGV2ZWxvcGluZyBoaWdoIHF1YWxpdHkgc29mdHdhcmUgaXMgdG8gd3JpdGUgdGVzdHMgZm9yCmVhY2ggZnVuY3Rpb24gYXMgaXQgaXMgZGV2ZWxvcGVkIGFuZCB0byBydW4gdGhvc2UgdGVzdHMgZnJlcXVlbnRseSBkdXJpbmcKdGhlIGRldmVsb3BtZW50IHByb2Nlc3MuCgpUaGUgXHVsaW5re1xtb2R1bGV7ZG9jdGVzdH19ey4uL2xpYi9tb2R1bGUtZG9jdGVzdC5odG1sfSBtb2R1bGUgcHJvdmlkZXMKYSB0b29sIGZvciBzY2FubmluZyBhIG1vZHVsZSBhbmQgdmFsaWRhdGluZyB0ZXN0cyBlbWJlZGRlZCBpbiBhIHByb2dyYW0ncwpkb2NzdHJpbmdzLiAgVGVzdCBjb25zdHJ1Y3Rpb24gaXMgYXMgc2ltcGxlIGFzIGN1dHRpbmctYW5kLXBhc3RpbmcgYQp0eXBpY2FsIGNhbGwgYWxvbmcgd2l0aCBpdHMgcmVzdWx0cyBpbnRvIHRoZSBkb2NzdHJpbmcuICBUaGlzIGltcHJvdmVzCnRoZSBkb2N1bWVudGF0aW9uIGJ5IHByb3ZpZGluZyB0aGUgdXNlciB3aXRoIGFuIGV4YW1wbGUgYW5kIGl0IGFsbG93cyB0aGUKZG9jdGVzdCBtb2R1bGUgdG8gbWFrZSBzdXJlIHRoZSBjb2RlIHJlbWFpbnMgdHJ1ZSB0byB0aGUgZG9jdW1lbnRhdGlvbjoKClxiZWdpbnt2ZXJiYXRpbX0KZGVmIGF2ZXJhZ2UodmFsdWVzKToKICAgICIiIkNvbXB1dGVzIHRoZSBhcml0aG1ldGljIG1lYW4gb2YgYSBsaXN0IG9mIG51bWJlcnMuCgogICAgPj4+IHByaW50IGF2ZXJhZ2UoWzIwLCAzMCwgNzBdKQogICAgNDAuMAogICAgIiIiCiAgICByZXR1cm4gc3VtKHZhbHVlcywgMC4wKSAvIGxlbih2YWx1ZXMpCgppbXBvcnQgZG9jdGVzdApkb2N0ZXN0LnRlc3Rtb2QoKSAgICMgYXV0b21hdGljYWxseSB2YWxpZGF0ZSB0aGUgZW1iZWRkZWQgdGVzdHMKXGVuZHt2ZXJiYXRpbX0KClRoZSBcdWxpbmt7XG1vZHVsZXt1bml0dGVzdH19ey4uL2xpYi9tb2R1bGUtdW5pdHRlc3QuaHRtbH0gbW9kdWxlIGlzIG5vdAphcyBlZmZvcnRsZXNzIGFzIHRoZSBcbW9kdWxle2RvY3Rlc3R9IG1vZHVsZSwgYnV0IGl0IGFsbG93cyBhIG1vcmUKY29tcHJlaGVuc2l2ZSBzZXQgb2YgdGVzdHMgdG8gYmUgbWFpbnRhaW5lZCBpbiBhIHNlcGFyYXRlIGZpbGU6CgpcYmVnaW57dmVyYmF0aW19CmltcG9ydCB1bml0dGVzdAoKY2xhc3MgVGVzdFN0YXRpc3RpY2FsRnVuY3Rpb25zKHVuaXR0ZXN0LlRlc3RDYXNlKToKCiAgICBkZWYgdGVzdF9hdmVyYWdlKHNlbGYpOgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXZlcmFnZShbMjAsIDMwLCA3MF0pLCA0MC4wKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoYXZlcmFnZShbMSwgNSwgN10pLCAxKSwgNC4zKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBhdmVyYWdlLCBbXSkKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGF2ZXJhZ2UsIDIwLCAzMCwgNzApCgp1bml0dGVzdC5tYWluKCkgIyBDYWxsaW5nIGZyb20gdGhlIGNvbW1hbmQgbGluZSBpbnZva2VzIGFsbCB0ZXN0cwpcZW5ke3ZlcmJhdGltfQoKXHNlY3Rpb257QmF0dGVyaWVzIEluY2x1ZGVkXGxhYmVse2JhdHRlcmllcy1pbmNsdWRlZH19CgpQeXRob24gaGFzIGEgYGBiYXR0ZXJpZXMgaW5jbHVkZWQnJyBwaGlsb3NvcGh5LiAgVGhpcyBpcyBiZXN0IHNlZW4KdGhyb3VnaCB0aGUgc29waGlzdGljYXRlZCBhbmQgcm9idXN0IGNhcGFiaWxpdGllcyBvZiBpdHMgbGFyZ2VyCnBhY2thZ2VzLiBGb3IgZXhhbXBsZToKClxiZWdpbntpdGVtaXplfQpcaXRlbSBUaGUgXHVsaW5re1xtb2R1bGV7eG1scnBjbGlifX17Li4vbGliL21vZHVsZS14bWxycGNsaWIuaHRtbH0gYW5kCiAgXHVsaW5re1xtb2R1bGV7U2ltcGxlWE1MUlBDU2VydmVyfX17Li4vbGliL21vZHVsZS1TaW1wbGVYTUxSUENTZXJ2ZXIuaHRtbH0KICBtb2R1bGVzIG1ha2UgaW1wbGVtZW50aW5nIHJlbW90ZSBwcm9jZWR1cmUgY2FsbHMgaW50byBhbiBhbG1vc3QgdHJpdmlhbCB0YXNrLgogIERlc3BpdGUgdGhlIG5hbWVzLCBubyBkaXJlY3Qga25vd2xlZGdlIG9yIGhhbmRsaW5nIG9mIFhNTCBpcyBuZWVkZWQuClxpdGVtIFRoZSBcdWxpbmt7XG1vZHVsZXtlbWFpbH19ey4uL2xpYi9tb2R1bGUtZW1haWwuaHRtbH0gcGFja2FnZSBpcyBhIGxpYnJhcnkKICBmb3IgbWFuYWdpbmcgZW1haWwgbWVzc2FnZXMsIGluY2x1ZGluZyBNSU1FIGFuZCBvdGhlciBSRkMgMjgyMi1iYXNlZCBtZXNzYWdlCiAgZG9jdW1lbnRzLiBVbmxpa2UgXG1vZHVsZXtzbXB0bGlifSBhbmQgXG1vZHVsZXtwb3BsaWJ9IHdoaWNoIGFjdHVhbGx5IHNlbmQKICBhbmQgcmVjZWl2ZSBtZXNzYWdlcywgdGhlIGVtYWlsIHBhY2thZ2UgaGFzIGEgY29tcGxldGUgdG9vbHNldCBmb3IgYnVpbGRpbmcKICBvciBkZWNvZGluZyBjb21wbGV4IG1lc3NhZ2Ugc3RydWN0dXJlcyAoaW5jbHVkaW5nIGF0dGFjaG1lbnRzKSBhbmQgZm9yCiAgaW1wbGVtZW50aW5nIGludGVybmV0IGVuY29kaW5nIGFuZCBoZWFkZXIgcHJvdG9jb2xzLgpcaXRlbSBUaGUgXHVsaW5re1xtb2R1bGV7eG1sLmRvbX19ey4uL2xpYi9tb2R1bGUteG1sLmRvbS5odG1sfSBhbmQKICBcdWxpbmt7XG1vZHVsZXt4bWwuc2F4fX17Li4vbGliL21vZHVsZS14bWwuc2F4Lmh0bWx9IHBhY2thZ2VzIHByb3ZpZGUgcm9idXN0CiAgc3VwcG9ydCBmb3IgcGFyc2luZyB0aGlzIHBvcHVsYXIgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQuIExpa2V3aXNlLCB0aGUKICBcdWxpbmt7XG1vZHVsZXtjc3Z9fXsuLi9saWIvbW9kdWxlLWNzdi5odG1sfSBtb2R1bGUgc3VwcG9ydHMgZGlyZWN0IHJlYWRzIGFuZAogIHdyaXRlcyBpbiBhIGNvbW1vbiBkYXRhYmFzZSBmb3JtYXQuIFRvZ2V0aGVyLCB0aGVzZSBtb2R1bGVzIGFuZCBwYWNrYWdlcwogIGdyZWF0bHkgc2ltcGxpZnkgZGF0YSBpbnRlcmNoYW5nZSBiZXR3ZWVuIHB5dGhvbiBhcHBsaWNhdGlvbnMgYW5kIG90aGVyCiAgdG9vbHMuClxpdGVtIEludGVybmF0aW9uYWxpemF0aW9uIGlzIHN1cHBvcnRlZCBieSBhIG51bWJlciBvZiBtb2R1bGVzIGluY2x1ZGluZwogIFx1bGlua3tcbW9kdWxle2dldHRleHR9fXsuLi9saWIvbW9kdWxlLWdldHRleHQuaHRtbH0sCiAgXHVsaW5re1xtb2R1bGV7bG9jYWxlfX17Li4vbGliL21vZHVsZS1sb2NhbGUuaHRtbH0sIGFuZCB0aGUKICBcdWxpbmt7XG1vZHVsZXtjb2RlY3N9fXsuLi9saWIvbW9kdWxlLWNvZGVjcy5odG1sfSBwYWNrYWdlLgpcZW5ke2l0ZW1pemV9CgpcY2hhcHRlcntCcmllZiBUb3VyIG9mIHRoZSBTdGFuZGFyZCBMaWJyYXJ5IC0tIFBhcnQgSUlcbGFiZWx7YnJpZWZUb3VyVHdvfX0KClRoaXMgc2Vjb25kIHRvdXIgY292ZXJzIG1vcmUgYWR2YW5jZWQgbW9kdWxlcyB0aGF0IHN1cHBvcnQgcHJvZmVzc2lvbmFsCnByb2dyYW1taW5nIG5lZWRzLiAgVGhlc2UgbW9kdWxlcyByYXJlbHkgb2NjdXIgaW4gc21hbGwgc2NyaXB0cy4KCgpcc2VjdGlvbntPdXRwdXQgRm9ybWF0dGluZ1xsYWJlbHtvdXRwdXQtZm9ybWF0dGluZ319CgpUaGUgXHVsaW5re1xtb2R1bGV7cmVwcn19ey4uL2xpYi9tb2R1bGUtcmVwci5odG1sfSBtb2R1bGUgcHJvdmlkZXMgYW4KdmVyc2lvbiBvZiBcZnVuY3Rpb257cmVwcigpfSBmb3IgYWJicmV2aWF0ZWQgZGlzcGxheXMgb2YgbGFyZ2Ugb3IgZGVlcGx5Cm5lc3RlZCBjb250YWluZXJzOgoKXGJlZ2lue3ZlcmJhdGltfQogICAgPj4+IGltcG9ydCByZXByICAgCiAgICA+Pj4gcmVwci5yZXByKHNldCgnc3VwZXJjYWxpZnJhZ2lsaXN0aWNleHBpYWxpZG9jaW91cycpKQogICAgInNldChbJ2EnLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgLi4uXSkiClxlbmR7dmVyYmF0aW19CgpUaGUgXHVsaW5re1xtb2R1bGV7cHByaW50fX17Li4vbGliL21vZHVsZS1wcHJpbnQuaHRtbH0gbW9kdWxlIG9mZmVycwptb3JlIHNvcGhpc3RpY2F0ZWQgY29udHJvbCBvdmVyIHByaW50aW5nIGJvdGggYnVpbHQtaW4gYW5kIHVzZXIgZGVmaW5lZApvYmplY3RzIGluIGEgd2F5IHRoYXQgaXMgcmVhZGFibGUgYnkgdGhlIGludGVycHJldGVyLiAgV2hlbiB0aGUgcmVzdWx0CmlzIGxvbmdlciB0aGFuIG9uZSBsaW5lLCB0aGUgYGBwcmV0dHkgcHJpbnRlcicnIGFkZHMgbGluZSBicmVha3MgYW5kCmluZGVudGF0aW9uIHRvIG1vcmUgY2xlYXJseSByZXZlYWwgZGF0YSBzdHJ1Y3R1cmU6CgpcYmVnaW57dmVyYmF0aW19CiAgICA+Pj4gaW1wb3J0IHBwcmludAogICAgPj4+IHQgPSBbW1tbJ2JsYWNrJywgJ2N5YW4nXSwgJ3doaXRlJywgWydncmVlbicsICdyZWQnXV0sIFtbJ21hZ2VudGEnLAogICAgLi4uICAgICAneWVsbG93J10sICdibHVlJ11dXQogICAgLi4uCiAgICA+Pj4gcHByaW50LnBwcmludCh0LCB3aWR0aD0zMCkKICAgIFtbW1snYmxhY2snLCAnY3lhbiddLAogICAgICAgJ3doaXRlJywKICAgICAgIFsnZ3JlZW4nLCAncmVkJ11dLAogICAgICBbWydtYWdlbnRhJywgJ3llbGxvdyddLAogICAgICAgJ2JsdWUnXV1dClxlbmR7dmVyYmF0aW19CgpUaGUgXHVsaW5re1xtb2R1bGV7dGV4dHdyYXB9fXsuLi9saWIvbW9kdWxlLXRleHR3cmFwLmh0bWx9IG1vZHVsZQpmb3JtYXRzIHBhcmFncmFwaHMgb2YgdGV4dCB0byBmaXQgYSBnaXZlbiBzY3JlZW4gd2lkdGg6CgpcYmVnaW57dmVyYmF0aW19CiAgICA+Pj4gaW1wb3J0IHRleHR3cmFwCiAgICA+Pj4gZG9jID0gIiIiVGhlIHdyYXAoKSBtZXRob2QgaXMganVzdCBsaWtlIGZpbGwoKSBleGNlcHQgdGhhdCBpdCByZXR1cm5zCiAgICAuLi4gYSBsaXN0IG9mIHN0cmluZ3MgaW5zdGVhZCBvZiBvbmUgYmlnIHN0cmluZyB3aXRoIG5ld2xpbmVzIHRvIHNlcGFyYXRlCiAgICAuLi4gdGhlIHdyYXBwZWQgbGluZXMuIiIiCiAgICAuLi4KICAgID4+PiBwcmludCB0ZXh0d3JhcC5maWxsKGRvYywgd2lkdGg9NDApCiAgICBUaGUgd3JhcCgpIG1ldGhvZCBpcyBqdXN0IGxpa2UgZmlsbCgpCiAgICBleGNlcHQgdGhhdCBpdCByZXR1cm5zIGEgbGlzdCBvZiBzdHJpbmdzCiAgICBpbnN0ZWFkIG9mIG9uZSBiaWcgc3RyaW5nIHdpdGggbmV3bGluZXMKICAgIHRvIHNlcGFyYXRlIHRoZSB3cmFwcGVkIGxpbmVzLgpcZW5ke3ZlcmJhdGltfQoKVGhlIFx1bGlua3tcbW9kdWxle2xvY2FsZX19ey4uL2xpYi9tb2R1bGUtbG9jYWxlLmh0bWx9IG1vZHVsZSBhY2Nlc3NlcwphIGRhdGFiYXNlIG9mIGN1bHR1cmUgc3BlY2lmaWMgZGF0YSBmb3JtYXRzLiAgVGhlIGdyb3VwaW5nIGF0dHJpYnV0ZQpvZiBsb2NhbGUncyBmb3JtYXQgZnVuY3Rpb24gcHJvdmlkZXMgYSBkaXJlY3Qgd2F5IG9mIGZvcm1hdHRpbmcgbnVtYmVycwp3aXRoIGdyb3VwIHNlcGFyYXRvcnM6CgpcYmVnaW57dmVyYmF0aW19CiAgICA+Pj4gaW1wb3J0IGxvY2FsZQogICAgPj4+IGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX0FMTCwgJ0VuZ2xpc2hfVW5pdGVkIFN0YXRlcy4xMjUyJykKICAgICdFbmdsaXNoX1VuaXRlZCBTdGF0ZXMuMTI1MicKICAgID4+PiBjb252ID0gbG9jYWxlLmxvY2FsZWNvbnYoKSAgICAgICAgICAjIGdldCBhIG1hcHBpbmcgb2YgY29udmVudGlvbnMKICAgID4+PiB4ID0gMTIzNDU2Ny44CiAgICA+Pj4gbG9jYWxlLmZvcm1hdCgiJWQiLCB4LCBncm91cGluZz1UcnVlKQogICAgJzEsMjM0LDU2NycKICAgID4+PiBsb2NhbGUuZm9ybWF0KCIlcyUuKmYiLCAoY29udlsnY3VycmVuY3lfc3ltYm9sJ10sCiAgICAuLi4JICAgICAgY29udlsnaW50X2ZyYWNfZGlnaXRzJ10sIHgpLCBncm91cGluZz1UcnVlKQogICAgJyQxLDIzNCw1NjcuODAnClxlbmR7dmVyYmF0aW19CgoKXHNlY3Rpb257VGVtcGxhdGluZ1xsYWJlbHt0ZW1wbGF0aW5nfX0KClRoZSBcdWxpbmt7XG1vZHVsZXtzdHJpbmd9fXsuLi9saWIvbW9kdWxlLXN0cmluZy5odG1sfSBtb2R1bGUgaW5jbHVkZXMgYQp2ZXJzYXRpbGUgXGNsYXNze1RlbXBsYXRlfSBjbGFzcyB3aXRoIGEgc2ltcGxpZmllZCBzeW50YXggc3VpdGFibGUgZm9yCmVkaXRpbmcgYnkgZW5kLXVzZXJzLiAgVGhpcyBhbGxvd3MgdXNlcnMgdG8gY3VzdG9taXplIHRoZWlyIGFwcGxpY2F0aW9ucwp3aXRob3V0IGhhdmluZyB0byBhbHRlciB0aGUgYXBwbGljYXRpb24uCgpUaGUgZm9ybWF0IHVzZXMgcGxhY2Vob2xkZXIgbmFtZXMgZm9ybWVkIGJ5IFxzYW1we1wkfSB3aXRoIHZhbGlkIFB5dGhvbgppZGVudGlmaWVycyAoYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYW5kIHVuZGVyc2NvcmVzKS4gIFN1cnJvdW5kaW5nIHRoZQpwbGFjZWhvbGRlciB3aXRoIGJyYWNlcyBhbGxvd3MgaXQgdG8gYmUgZm9sbG93ZWQgYnkgbW9yZSBhbHBoYW51bWVyaWMgbGV0dGVycwp3aXRoIG5vIGludGVydmVuaW5nIHNwYWNlcy4gIFdyaXRpbmcgXHNhbXB7XCRcJH0gY3JlYXRlcyBhIHNpbmdsZSBlc2NhcGVkClxzYW1we1wkfToKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGZyb20gc3RyaW5nIGltcG9ydCBUZW1wbGF0ZQo+Pj4gdCA9IFRlbXBsYXRlKCcke3ZpbGxhZ2V9Zm9sayBzZW5kICQkMTAgdG8gJGNhdXNlLicpCj4+PiB0LnN1YnN0aXR1dGUodmlsbGFnZT0nTm90dGluZ2hhbScsIGNhdXNlPSd0aGUgZGl0Y2ggZnVuZCcpCidOb3R0aW5naGFtZm9sayBzZW5kICQxMCB0byB0aGUgZGl0Y2ggZnVuZC4nClxlbmR7dmVyYmF0aW19CgpUaGUgXG1ldGhvZHtzdWJzdGl0dXRlfSBtZXRob2QgcmFpc2VzIGEgXGV4Y2VwdGlvbntLZXlFcnJvcn0gd2hlbiBhCnBsYWNlaG9sZGVyIGlzIG5vdCBzdXBwbGllZCBpbiBhIGRpY3Rpb25hcnkgb3IgYSBrZXl3b3JkIGFyZ3VtZW50LiBGb3IKbWFpbC1tZXJnZSBzdHlsZSBhcHBsaWNhdGlvbnMsIHVzZXIgc3VwcGxpZWQgZGF0YSBtYXkgYmUgaW5jb21wbGV0ZSBhbmQgdGhlClxtZXRob2R7c2FmZV9zdWJzdGl0dXRlfSBtZXRob2QgbWF5IGJlIG1vcmUgYXBwcm9wcmlhdGUgLS0tIGl0IHdpbGwgbGVhdmUKcGxhY2Vob2xkZXJzIHVuY2hhbmdlZCBpZiBkYXRhIGlzIG1pc3Npbmc6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiB0ID0gVGVtcGxhdGUoJ1JldHVybiB0aGUgJGl0ZW0gdG8gJG93bmVyLicpCj4+PiBkID0gZGljdChpdGVtPSd1bmxhZGVuIHN3YWxsb3cnKQo+Pj4gdC5zdWJzdGl0dXRlKGQpClRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAuIC4gLgpLZXlFcnJvcjogJ293bmVyJwo+Pj4gdC5zYWZlX3N1YnN0aXR1dGUoZCkKJ1JldHVybiB0aGUgdW5sYWRlbiBzd2FsbG93IHRvICRvd25lci4nClxlbmR7dmVyYmF0aW19CgpUZW1wbGF0ZSBzdWJjbGFzc2VzIGNhbiBzcGVjaWZ5IGEgY3VzdG9tIGRlbGltaXRlci4gIEZvciBleGFtcGxlLCBhIGJhdGNoCnJlbmFtaW5nIHV0aWxpdHkgZm9yIGEgcGhvdG8gYnJvd3NlciBtYXkgZWxlY3QgdG8gdXNlIHBlcmNlbnQgc2lnbnMgZm9yCnBsYWNlaG9sZGVycyBzdWNoIGFzIHRoZSBjdXJyZW50IGRhdGUsIGltYWdlIHNlcXVlbmNlIG51bWJlciwgb3IgZmlsZSBmb3JtYXQ6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBpbXBvcnQgdGltZSwgb3MucGF0aAo+Pj4gcGhvdG9maWxlcyA9IFsnaW1nXzEwNzQuanBnJywgJ2ltZ18xMDc2LmpwZycsICdpbWdfMTA3Ny5qcGcnXQo+Pj4gY2xhc3MgQmF0Y2hSZW5hbWUoVGVtcGxhdGUpOgouLi4gICAgIGRlbGltaXRlciA9ICclJwo+Pj4gZm10ID0gcmF3X2lucHV0KCdFbnRlciByZW5hbWUgc3R5bGUgKCVkLWRhdGUgJW4tc2VxbnVtICVmLWZvcm1hdCk6ICAnKQpFbnRlciByZW5hbWUgc3R5bGUgKCVkLWRhdGUgJW4tc2VxbnVtICVmLWZvcm1hdCk6ICBBc2hsZXlfJW4lZgoKPj4+IHQgPSBCYXRjaFJlbmFtZShmbXQpCj4+PiBkYXRlID0gdGltZS5zdHJmdGltZSgnJWQlYiV5JykKPj4+IGZvciBpLCBmaWxlbmFtZSBpbiBlbnVtZXJhdGUocGhvdG9maWxlcyk6Ci4uLiAgICAgYmFzZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChmaWxlbmFtZSkKLi4uICAgICBuZXduYW1lID0gdC5zdWJzdGl0dXRlKGQ9ZGF0ZSwgbj1pLCBmPWV4dCkKLi4uICAgICBwcmludCAnJXMgLS0+ICVzJyAlIChmaWxlbmFtZSwgbmV3bmFtZSkKCmltZ18xMDc0LmpwZyAtLT4gQXNobGV5XzAuanBnCmltZ18xMDc2LmpwZyAtLT4gQXNobGV5XzEuanBnCmltZ18xMDc3LmpwZyAtLT4gQXNobGV5XzIuanBnClxlbmR7dmVyYmF0aW19CgpBbm90aGVyIGFwcGxpY2F0aW9uIGZvciB0ZW1wbGF0aW5nIGlzIHNlcGFyYXRpbmcgcHJvZ3JhbSBsb2dpYyBmcm9tIHRoZQpkZXRhaWxzIG9mIG11bHRpcGxlIG91dHB1dCBmb3JtYXRzLiAgVGhlIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHN1YnN0aXR1dGUKY3VzdG9tIHRlbXBsYXRlcyBmb3IgWE1MIGZpbGVzLCBwbGFpbiB0ZXh0IHJlcG9ydHMsIGFuZCBITVRMIHdlYiByZXBvcnRzLgoKClxzZWN0aW9ue1dvcmtpbmcgd2l0aCBCaW5hcnkgRGF0YSBSZWNvcmQgTGF5b3V0c1xsYWJlbHtiaW5hcnktZm9ybWF0c319CgpUaGUgXHVsaW5re1xtb2R1bGV7c3RydWN0fX17Li4vbGliL21vZHVsZS1zdHJ1Y3QuaHRtbH0gbW9kdWxlIHByb3ZpZGVzClxmdW5jdGlvbntwYWNrKCl9IGFuZCBcZnVuY3Rpb257dW5wYWNrKCl9IGZ1bmN0aW9ucyBmb3Igd29ya2luZyB3aXRoCnZhcmlhYmxlIGxlbmd0aCBiaW5hcnkgcmVjb3JkIGZvcm1hdHMuICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93CnRvIGxvb3AgdGhyb3VnaCBoZWFkZXIgaW5mb3JtYXRpb24gaW4gYSBaSVAgZmlsZSAod2l0aCBwYWNrIGNvZGVzClxjb2RleyJIIn0gYW5kIFxjb2RleyJMIn0gcmVwcmVzZW50aW5nIHR3byBhbmQgZm91ciBieXRlIHVuc2lnbmVkCm51bWJlcnMgcmVzcGVjdGl2ZWx5KToKClxiZWdpbnt2ZXJiYXRpbX0KICAgIGltcG9ydCBzdHJ1Y3QKCiAgICBkYXRhID0gb3BlbignbXlmaWxlLnppcCcsICdyYicpLnJlYWQoKQogICAgc3RhcnQgPSAwCiAgICBmb3IgaSBpbiByYW5nZSgzKTogICAgICAgICAgICAgICAgICAgICAgIyBzaG93IHRoZSBmaXJzdCAzIGZpbGUgaGVhZGVycwogICAgICAgIHN0YXJ0ICs9IDE0CiAgICAgICAgZmllbGRzID0gc3RydWN0LnVucGFjaygnTExMSEgnLCBkYXRhW3N0YXJ0OnN0YXJ0KzE2XSkKICAgICAgICBjcmMzMiwgY29tcF9zaXplLCB1bmNvbXBfc2l6ZSwgZmlsZW5hbWVzaXplLCBleHRyYV9zaXplID0gIGZpZWxkcwoKICAgICAgICBzdGFydCArPSAxNgogICAgICAgIGZpbGVuYW1lID0gZGF0YVtzdGFydDpzdGFydCtmaWxlbmFtZXNpemVdCiAgICAgICAgc3RhcnQgKz0gZmlsZW5hbWVzaXplCiAgICAgICAgZXh0cmEgPSBkYXRhW3N0YXJ0OnN0YXJ0K2V4dHJhX3NpemVdCiAgICAgICAgcHJpbnQgZmlsZW5hbWUsIGhleChjcmMzMiksIGNvbXBfc2l6ZSwgdW5jb21wX3NpemUKCiAgICAgICAgc3RhcnQgKz0gZXh0cmFfc2l6ZSArIGNvbXBfc2l6ZSAgICAgIyBza2lwIHRvIHRoZSBuZXh0IGhlYWRlcgpcZW5ke3ZlcmJhdGltfQoKClxzZWN0aW9ue011bHRpLXRocmVhZGluZ1xsYWJlbHttdWx0aS10aHJlYWRpbmd9fQoKVGhyZWFkaW5nIGlzIGEgdGVjaG5pcXVlIGZvciBkZWNvdXBsaW5nIHRhc2tzIHdoaWNoIGFyZSBub3Qgc2VxdWVudGlhbGx5CmRlcGVuZGVudC4gIFRocmVhZHMgY2FuIGJlIHVzZWQgdG8gaW1wcm92ZSB0aGUgcmVzcG9uc2l2ZW5lc3Mgb2YKYXBwbGljYXRpb25zIHRoYXQgYWNjZXB0IHVzZXIgaW5wdXQgd2hpbGUgb3RoZXIgdGFza3MgcnVuIGluIHRoZQpiYWNrZ3JvdW5kLiAgQSByZWxhdGVkIHVzZSBjYXNlIGlzIHJ1bm5pbmcgSS9PIGluIHBhcmFsbGVsIHdpdGgKY29tcHV0YXRpb25zIGluIGFub3RoZXIgdGhyZWFkLgoKVGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGhvdyB0aGUgaGlnaCBsZXZlbApcdWxpbmt7XG1vZHVsZXt0aHJlYWRpbmd9fXsuLi9saWIvbW9kdWxlLXRocmVhZGluZy5odG1sfSBtb2R1bGUgY2FuIHJ1bgp0YXNrcyBpbiBiYWNrZ3JvdW5kIHdoaWxlIHRoZSBtYWluIHByb2dyYW0gY29udGludWVzIHRvIHJ1bjoKClxiZWdpbnt2ZXJiYXRpbX0KICAgIGltcG9ydCB0aHJlYWRpbmcsIHppcGZpbGUKCiAgICBjbGFzcyBBc3luY1ppcCh0aHJlYWRpbmcuVGhyZWFkKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgaW5maWxlLCBvdXRmaWxlKToKICAgICAgICAgICAgdGhyZWFkaW5nLlRocmVhZC5fX2luaXRfXyhzZWxmKSAgICAgICAgCiAgICAgICAgICAgIHNlbGYuaW5maWxlID0gaW5maWxlCiAgICAgICAgICAgIHNlbGYub3V0ZmlsZSA9IG91dGZpbGUKICAgICAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICAgICBmID0gemlwZmlsZS5aaXBGaWxlKHNlbGYub3V0ZmlsZSwgJ3cnLCB6aXBmaWxlLlpJUF9ERUZMQVRFRCkKICAgICAgICAgICAgZi53cml0ZShzZWxmLmluZmlsZSkKICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgIHByaW50ICdGaW5pc2hlZCBiYWNrZ3JvdW5kIHppcCBvZjogJywgc2VsZi5pbmZpbGUKCiAgICBiYWNrZ3JvdW5kID0gQXN5bmNaaXAoJ215ZGF0YS50eHQnLCAnbXlhcmNoaXZlLnppcCcpCiAgICBiYWNrZ3JvdW5kLnN0YXJ0KCkKICAgIHByaW50ICdUaGUgbWFpbiBwcm9ncmFtIGNvbnRpbnVlcyB0byBydW4gaW4gZm9yZWdyb3VuZC4nCiAgICAKICAgIGJhY2tncm91bmQuam9pbigpICAgICMgV2FpdCBmb3IgdGhlIGJhY2tncm91bmQgdGFzayB0byBmaW5pc2gKICAgIHByaW50ICdNYWluIHByb2dyYW0gd2FpdGVkIHVudGlsIGJhY2tncm91bmQgd2FzIGRvbmUuJwpcZW5ke3ZlcmJhdGltfQoKVGhlIHByaW5jaXBhbCBjaGFsbGVuZ2Ugb2YgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb25zIGlzIGNvb3JkaW5hdGluZwp0aHJlYWRzIHRoYXQgc2hhcmUgZGF0YSBvciBvdGhlciByZXNvdXJjZXMuICBUbyB0aGF0IGVuZCwgdGhlIHRocmVhZGluZwptb2R1bGUgcHJvdmlkZXMgYSBudW1iZXIgb2Ygc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMgaW5jbHVkaW5nIGxvY2tzLApldmVudHMsIGNvbmRpdGlvbiB2YXJpYWJsZXMsIGFuZCBzZW1hcGhvcmVzLgoKV2hpbGUgdGhvc2UgdG9vbHMgYXJlIHBvd2VyZnVsLCBtaW5vciBkZXNpZ24gZXJyb3JzIGNhbiByZXN1bHQgaW4KcHJvYmxlbXMgdGhhdCBhcmUgZGlmZmljdWx0IHRvIHJlcHJvZHVjZS4gIFNvLCB0aGUgcHJlZmVycmVkIGFwcHJvYWNoCnRvIHRhc2sgY29vcmRpbmF0aW9uIGlzIHRvIGNvbmNlbnRyYXRlIGFsbCBhY2Nlc3MgdG8gYSByZXNvdXJjZQppbiBhIHNpbmdsZSB0aHJlYWQgYW5kIHRoZW4gdXNpbmcgdGhlClx1bGlua3tcbW9kdWxle1F1ZXVlfX17Li4vbGliL21vZHVsZS1RdWV1ZS5odG1sfSBtb2R1bGUgdG8gZmVlZCB0aGF0CnRocmVhZCB3aXRoIHJlcXVlc3RzIGZyb20gb3RoZXIgdGhyZWFkcy4gIEFwcGxpY2F0aW9ucyB1c2luZwpcY2xhc3N7UXVldWV9IG9iamVjdHMgZm9yIGludGVyLXRocmVhZCBjb21tdW5pY2F0aW9uIGFuZCBjb29yZGluYXRpb24KYXJlIGVhc2llciB0byBkZXNpZ24sIG1vcmUgcmVhZGFibGUsIGFuZCBtb3JlIHJlbGlhYmxlLgoKClxzZWN0aW9ue0xvZ2dpbmdcbGFiZWx7bG9nZ2luZ319CgpUaGUgXHVsaW5re1xtb2R1bGV7bG9nZ2luZ319ey4uL2xpYi9tb2R1bGUtbG9nZ2luZy5odG1sfSBtb2R1bGUgb2ZmZXJzCmEgZnVsbCBmZWF0dXJlZCBhbmQgZmxleGlibGUgbG9nZ2luZyBzeXN0ZW0uICBBdCBpdHMgc2ltcGxlc3QsIGxvZwptZXNzYWdlcyBhcmUgc2VudCB0byBhIGZpbGUgb3IgdG8gXGNvZGV7c3lzLnN0ZGVycn06CgpcYmVnaW57dmVyYmF0aW19CiAgICBpbXBvcnQgbG9nZ2luZwogICAgbG9nZ2luZy5kZWJ1ZygnRGVidWdnaW5nIGluZm9ybWF0aW9uJykKICAgIGxvZ2dpbmcuaW5mbygnSW5mb3JtYXRpb25hbCBtZXNzYWdlJykKICAgIGxvZ2dpbmcud2FybmluZygnV2FybmluZzpjb25maWcgZmlsZSAlcyBub3QgZm91bmQnLCAnc2VydmVyLmNvbmYnKQogICAgbG9nZ2luZy5lcnJvcignRXJyb3Igb2NjdXJyZWQnKQogICAgbG9nZ2luZy5jcml0aWNhbCgnQ3JpdGljYWwgZXJyb3IgLS0gc2h1dHRpbmcgZG93bicpClxlbmR7dmVyYmF0aW19CgpUaGlzIHByb2R1Y2VzIHRoZSBmb2xsb3dpbmcgb3V0cHV0OiAKClxiZWdpbnt2ZXJiYXRpbX0KICAgIFdBUk5JTkc6cm9vdDpXYXJuaW5nOmNvbmZpZyBmaWxlIHNlcnZlci5jb25mIG5vdCBmb3VuZAogICAgRVJST1I6cm9vdDpFcnJvciBvY2N1cnJlZAogICAgQ1JJVElDQUw6cm9vdDpDcml0aWNhbCBlcnJvciAtLSBzaHV0dGluZyBkb3duClxlbmR7dmVyYmF0aW19CgpCeSBkZWZhdWx0LCBpbmZvcm1hdGlvbmFsIGFuZCBkZWJ1Z2dpbmcgbWVzc2FnZXMgYXJlIHN1cHByZXNzZWQgYW5kIHRoZQpvdXRwdXQgaXMgc2VudCB0byBzdGFuZGFyZCBlcnJvci4gIE90aGVyIG91dHB1dCBvcHRpb25zIGluY2x1ZGUgcm91dGluZwptZXNzYWdlcyB0aHJvdWdoIGVtYWlsLCBkYXRhZ3JhbXMsIHNvY2tldHMsIG9yIHRvIGFuIEhUVFAgU2VydmVyLiAgTmV3CmZpbHRlcnMgY2FuIHNlbGVjdCBkaWZmZXJlbnQgcm91dGluZyBiYXNlZCBvbiBtZXNzYWdlIHByaW9yaXR5OgpcY29uc3RhbnR7REVCVUd9LCBcY29uc3RhbnR7SU5GT30sIFxjb25zdGFudHtXQVJOSU5HfSwgXGNvbnN0YW50e0VSUk9SfSwKYW5kIFxjb25zdGFudHtDUklUSUNBTH0uCgpUaGUgbG9nZ2luZyBzeXN0ZW0gY2FuIGJlIGNvbmZpZ3VyZWQgZGlyZWN0bHkgZnJvbSBQeXRob24gb3IgY2FuIGJlCmxvYWRlZCBmcm9tIGEgdXNlciBlZGl0YWJsZSBjb25maWd1cmF0aW9uIGZpbGUgZm9yIGN1c3RvbWl6ZWQgbG9nZ2luZwp3aXRob3V0IGFsdGVyaW5nIHRoZSBhcHBsaWNhdGlvbi4KCgpcc2VjdGlvbntXZWFrIFJlZmVyZW5jZXNcbGFiZWx7d2Vhay1yZWZlcmVuY2VzfX0KClB5dGhvbiBkb2VzIGF1dG9tYXRpYyBtZW1vcnkgbWFuYWdlbWVudCAocmVmZXJlbmNlIGNvdW50aW5nIGZvciBtb3N0Cm9iamVjdHMgYW5kIGdhcmJhZ2UgY29sbGVjdGlvbiB0byBlbGltaW5hdGUgY3ljbGVzKS4gIFRoZSBtZW1vcnkgaXMKZnJlZWQgc2hvcnRseSBhZnRlciB0aGUgbGFzdCByZWZlcmVuY2UgdG8gaXQgaGFzIGJlZW4gZWxpbWluYXRlZC4KClRoaXMgYXBwcm9hY2ggd29ya3MgZmluZSBmb3IgbW9zdCBhcHBsaWNhdGlvbnMgYnV0IG9jY2FzaW9uYWxseSB0aGVyZQppcyBhIG5lZWQgdG8gdHJhY2sgb2JqZWN0cyBvbmx5IGFzIGxvbmcgYXMgdGhleSBhcmUgYmVpbmcgdXNlZCBieQpzb21ldGhpbmcgZWxzZS4gIFVuZm9ydHVuYXRlbHksIGp1c3QgdHJhY2tpbmcgdGhlbSBjcmVhdGVzIGEgcmVmZXJlbmNlCnRoYXQgbWFrZXMgdGhlbSBwZXJtYW5lbnQuICBUaGUKXHVsaW5re1xtb2R1bGV7d2Vha3JlZn19ey4uL2xpYi9tb2R1bGUtd2Vha3JlZi5odG1sfSBtb2R1bGUgcHJvdmlkZXMKdG9vbHMgZm9yIHRyYWNraW5nIG9iamVjdHMgd2l0aG91dCBjcmVhdGluZyBhIHJlZmVyZW5jZS4gIFdoZW4gdGhlCm9iamVjdCBpcyBubyBsb25nZXIgbmVlZGVkLCBpdCBpcyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSBhIHdlYWtyZWYKdGFibGUgYW5kIGEgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIGZvciB3ZWFrcmVmIG9iamVjdHMuICBUeXBpY2FsCmFwcGxpY2F0aW9ucyBpbmNsdWRlIGNhY2hpbmcgb2JqZWN0cyB0aGF0IGFyZSBleHBlbnNpdmUgdG8gY3JlYXRlOgoKXGJlZ2lue3ZlcmJhdGltfQogICAgPj4+IGltcG9ydCB3ZWFrcmVmLCBnYwogICAgPj4+IGNsYXNzIEE6CiAgICAuLi4gICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6CiAgICAuLi4gICAgICAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCiAgICAuLi4gICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgIC4uLiAgICAgICAgICAgICByZXR1cm4gc3RyKHNlbGYudmFsdWUpCiAgICAuLi4KICAgID4+PiBhID0gQSgxMCkgICAgICAgICAgICAgICAgICAgIyBjcmVhdGUgYSByZWZlcmVuY2UKICAgID4+PiBkID0gd2Vha3JlZi5XZWFrVmFsdWVEaWN0aW9uYXJ5KCkKICAgID4+PiBkWydwcmltYXJ5J10gPSBhICAgICAgICAgICAgIyBkb2VzIG5vdCBjcmVhdGUgYSByZWZlcmVuY2UKICAgID4+PiBkWydwcmltYXJ5J10gICAgICAgICAgICAgICAgIyBmZXRjaCB0aGUgb2JqZWN0IGlmIGl0IGlzIHN0aWxsIGFsaXZlCiAgICAxMAogICAgPj4+IGRlbCBhICAgICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSB0aGUgb25lIHJlZmVyZW5jZQogICAgPj4+IGdjLmNvbGxlY3QoKSAgICAgICAgICAgICAgICAjIHJ1biBnYXJiYWdlIGNvbGxlY3Rpb24gcmlnaHQgYXdheQogICAgMAogICAgPj4+IGRbJ3ByaW1hcnknXSAgICAgICAgICAgICAgICAjIGVudHJ5IHdhcyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQKICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgRmlsZSAiPHB5c2hlbGwjMTA4PiIsIGxpbmUgMSwgaW4gLXRvcGxldmVsLQogICAgICAgIGRbJ3ByaW1hcnknXSAgICAgICAgICAgICAgICAjIGVudHJ5IHdhcyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQKICAgICAgRmlsZSAiQzovUFkyNC9saWIvd2Vha3JlZi5weSIsIGxpbmUgNDYsIGluIF9fZ2V0aXRlbV9fCiAgICAgICAgbyA9IHNlbGYuZGF0YVtrZXldKCkKICAgIEtleUVycm9yOiAncHJpbWFyeScKXGVuZHt2ZXJiYXRpbX0KClxzZWN0aW9ue1Rvb2xzIGZvciBXb3JraW5nIHdpdGggTGlzdHNcbGFiZWx7bGlzdC10b29sc319CgpNYW55IGRhdGEgc3RydWN0dXJlIG5lZWRzIGNhbiBiZSBtZXQgd2l0aCB0aGUgYnVpbHQtaW4gbGlzdCB0eXBlLgpIb3dldmVyLCBzb21ldGltZXMgdGhlcmUgaXMgYSBuZWVkIGZvciBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbnMKd2l0aCBkaWZmZXJlbnQgcGVyZm9ybWFuY2UgdHJhZGUtb2Zmcy4KClRoZSBcdWxpbmt7XG1vZHVsZXthcnJheX19ey4uL2xpYi9tb2R1bGUtYXJyYXkuaHRtbH0gbW9kdWxlIHByb3ZpZGVzIGFuClxjbGFzc3thcnJheSgpfSBvYmplY3QgdGhhdCBpcyBsaWtlIGEgbGlzdCB0aGF0IHN0b3JlcyBvbmx5IGhvbW9nZW5vdXMKZGF0YSBidXQgc3RvcmVzIGl0IG1vcmUgY29tcGFjdGx5LiAgVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGFuIGFycmF5Cm9mIG51bWJlcnMgc3RvcmVkIGFzIHR3byBieXRlIHVuc2lnbmVkIGJpbmFyeSBudW1iZXJzICh0eXBlY29kZQpcY29kZXsiSCJ9KSByYXRoZXIgdGhhbiB0aGUgdXN1YWwgMTYgYnl0ZXMgcGVyIGVudHJ5IGZvciByZWd1bGFyIGxpc3RzCm9mIHB5dGhvbiBpbnQgb2JqZWN0czoKClxiZWdpbnt2ZXJiYXRpbX0KICAgID4+PiBmcm9tIGFycmF5IGltcG9ydCBhcnJheQogICAgPj4+IGEgPSBhcnJheSgnSCcsIFs0MDAwLCAxMCwgNzAwLCAyMjIyMl0pCiAgICA+Pj4gc3VtKGEpCiAgICAyNjkzMgogICAgPj4+IGFbMTozXQogICAgYXJyYXkoJ0gnLCBbMTAsIDcwMF0pClxlbmR7dmVyYmF0aW19CgpUaGUgXHVsaW5re1xtb2R1bGV7Y29sbGVjdGlvbnN9fXsuLi9saWIvbW9kdWxlLWNvbGxlY3Rpb25zLmh0bWx9IG1vZHVsZQpwcm92aWRlcyBhIFxjbGFzc3tkZXF1ZSgpfSBvYmplY3QgdGhhdCBpcyBsaWtlIGEgbGlzdCB3aXRoIGZhc3RlcgphcHBlbmRzIGFuZCBwb3BzIGZyb20gdGhlIGxlZnQgc2lkZSBidXQgc2xvd2VyIGxvb2t1cHMgaW4gdGhlIG1pZGRsZS4KVGhlc2Ugb2JqZWN0cyBhcmUgd2VsbCBzdWl0ZWQgZm9yIGltcGxlbWVudGluZyBxdWV1ZXMgYW5kIGJyZWFkdGggZmlyc3QKdHJlZSBzZWFyY2hlczoKClxiZWdpbnt2ZXJiYXRpbX0KICAgID4+PiBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQogICAgPj4+IGQgPSBkZXF1ZShbInRhc2sxIiwgInRhc2syIiwgInRhc2szIl0pCiAgICA+Pj4gZC5hcHBlbmQoInRhc2s0IikKICAgID4+PiBwcmludCAiSGFuZGxpbmciLCBkLnBvcGxlZnQoKQogICAgSGFuZGxpbmcgdGFzazEKCiAgICB1bnNlYXJjaGVkID0gZGVxdWUoW3N0YXJ0aW5nX25vZGVdKQogICAgZGVmIGJyZWFkdGhfZmlyc3Rfc2VhcmNoKHVuc2VhcmNoZWQpOgogICAgICAgIG5vZGUgPSB1bnNlYXJjaGVkLnBvcGxlZnQoKQogICAgICAgIGZvciBtIGluIGdlbl9tb3Zlcyhub2RlKToKICAgICAgICAgICAgaWYgaXNfZ29hbChtKToKICAgICAgICAgICAgICAgIHJldHVybiBtCiAgICAgICAgICAgIHVuc2VhcmNoZWQuYXBwZW5kKG0pClxlbmR7dmVyYmF0aW19CgpJbiBhZGRpdGlvbiB0byBhbHRlcm5hdGl2ZSBsaXN0IGltcGxlbWVudGF0aW9ucywgdGhlIGxpYnJhcnkgYWxzbyBvZmZlcnMKb3RoZXIgdG9vbHMgc3VjaCBhcyB0aGUgXHVsaW5re1xtb2R1bGV7YmlzZWN0fX17Li4vbGliL21vZHVsZS1iaXNlY3QuaHRtbH0KbW9kdWxlIHdpdGggZnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgc29ydGVkIGxpc3RzOgoKXGJlZ2lue3ZlcmJhdGltfQogICAgPj4+IGltcG9ydCBiaXNlY3QKICAgID4+PiBzY29yZXMgPSBbKDEwMCwgJ3BlcmwnKSwgKDIwMCwgJ3RjbCcpLCAoNDAwLCAnbHVhJyksICg1MDAsICdweXRob24nKV0KICAgID4+PiBiaXNlY3QuaW5zb3J0KHNjb3JlcywgKDMwMCwgJ3J1YnknKSkKICAgID4+PiBzY29yZXMKICAgIFsoMTAwLCAncGVybCcpLCAoMjAwLCAndGNsJyksICgzMDAsICdydWJ5JyksICg0MDAsICdsdWEnKSwgKDUwMCwgJ3B5dGhvbicpXQpcZW5ke3ZlcmJhdGltfQoKVGhlIFx1bGlua3tcbW9kdWxle2hlYXBxfX17Li4vbGliL21vZHVsZS1oZWFwcS5odG1sfSBtb2R1bGUgcHJvdmlkZXMKZnVuY3Rpb25zIGZvciBpbXBsZW1lbnRpbmcgaGVhcHMgYmFzZWQgb24gcmVndWxhciBsaXN0cy4gIFRoZSBsb3dlc3QKdmFsdWVkIGVudHJ5IGlzIGFsd2F5cyBrZXB0IGF0IHBvc2l0aW9uIHplcm8uICBUaGlzIGlzIHVzZWZ1bCBmb3IKYXBwbGljYXRpb25zIHdoaWNoIHJlcGVhdGVkbHkgYWNjZXNzIHRoZSBzbWFsbGVzdCBlbGVtZW50IGJ1dCBkbyBub3QKd2FudCB0byBydW4gYSBmdWxsIGxpc3Qgc29ydDoKClxiZWdpbnt2ZXJiYXRpbX0KICAgID4+PiBmcm9tIGhlYXBxIGltcG9ydCBoZWFwaWZ5LCBoZWFwcG9wLCBoZWFwcHVzaAogICAgPj4+IGRhdGEgPSBbMSwgMywgNSwgNywgOSwgMiwgNCwgNiwgOCwgMF0KICAgID4+PiBoZWFwaWZ5KGRhdGEpICAgICAgICAgICAgICAgICAgICAgICMgcmVhcnJhbmdlIHRoZSBsaXN0IGludG8gaGVhcCBvcmRlcgogICAgPj4+IGhlYXBwdXNoKGRhdGEsIC01KSAgICAgICAgICAgICAgICAgIyBhZGQgYSBuZXcgZW50cnkKICAgID4+PiBbaGVhcHBvcChkYXRhKSBmb3IgaSBpbiByYW5nZSgzKV0gICMgZmV0Y2ggdGhlIHRocmVlIHNtYWxsZXN0IGVudHJpZXMKICAgIFstNSwgMCwgMV0KXGVuZHt2ZXJiYXRpbX0KCgpcc2VjdGlvbntEZWNpbWFsIEZsb2F0aW5nIFBvaW50IEFyaXRobWV0aWNcbGFiZWx7ZGVjaW1hbC1mcH19CgpUaGUgXHVsaW5re1xtb2R1bGV7ZGVjaW1hbH19ey4uL2xpYi9tb2R1bGUtZGVjaW1hbC5odG1sfSBtb2R1bGUgb2ZmZXJzIGEKXGNsYXNze0RlY2ltYWx9IGRhdGF0eXBlIGZvciBkZWNpbWFsIGZsb2F0aW5nIHBvaW50IGFyaXRobWV0aWMuICBDb21wYXJlZCB0bwp0aGUgYnVpbHQtaW4gXGNsYXNze2Zsb2F0fSBpbXBsZW1lbnRhdGlvbiBvZiBiaW5hcnkgZmxvYXRpbmcgcG9pbnQsIHRoZSBuZXcKY2xhc3MgaXMgZXNwZWNpYWxseSBoZWxwZnVsIGZvciBmaW5hbmNpYWwgYXBwbGljYXRpb25zIGFuZCBvdGhlciB1c2VzIHdoaWNoCnJlcXVpcmUgZXhhY3QgZGVjaW1hbCByZXByZXNlbnRhdGlvbiwgY29udHJvbCBvdmVyIHByZWNpc2lvbiwgY29udHJvbCBvdmVyCnJvdW5kaW5nIHRvIG1lZXQgbGVnYWwgb3IgcmVndWxhdG9yeSByZXF1aXJlbWVudHMsIHRyYWNraW5nIG9mIHNpZ25pZmljYW50CmRlY2ltYWwgcGxhY2VzLCBvciBmb3IgYXBwbGljYXRpb25zIHdoZXJlIHRoZSB1c2VyIGV4cGVjdHMgdGhlIHJlc3VsdHMgdG8KbWF0Y2ggY2FsY3VsYXRpb25zIGRvbmUgYnkgaGFuZC4KCkZvciBleGFtcGxlLCBjYWxjdWxhdGluZyBhIDVcJXt9IHRheCBvbiBhIDcwIGNlbnQgcGhvbmUgY2hhcmdlIGdpdmVzCmRpZmZlcmVudCByZXN1bHRzIGluIGRlY2ltYWwgZmxvYXRpbmcgcG9pbnQgYW5kIGJpbmFyeSBmbG9hdGluZyBwb2ludC4KVGhlIGRpZmZlcmVuY2UgYmVjb21lcyBzaWduaWZpY2FudCBpZiB0aGUgcmVzdWx0cyBhcmUgcm91bmRlZCB0byB0aGUKbmVhcmVzdCBjZW50OgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gZnJvbSBkZWNpbWFsIGltcG9ydCAqICAgICAgIAo+Pj4gRGVjaW1hbCgnMC43MCcpICogRGVjaW1hbCgnMS4wNScpCkRlY2ltYWwoIjAuNzM1MCIpCj4+PiAuNzAgKiAxLjA1CjAuNzM0OTk5OTk5OTk5OTk5OTkgICAgICAgClxlbmR7dmVyYmF0aW19CgpUaGUgXGNsYXNze0RlY2ltYWx9IHJlc3VsdCBrZWVwcyBhIHRyYWlsaW5nIHplcm8sIGF1dG9tYXRpY2FsbHkgaW5mZXJyaW5nIGZvdXIKcGxhY2Ugc2lnbmlmaWNhbmNlIGZyb20gdGhlIHR3byBkaWdpdCBtdWx0aXBsaWNhbmRzLiAgRGVjaW1hbCByZXByb2R1Y2VzCm1hdGhlbWF0aWNzIGFzIGRvbmUgYnkgaGFuZCBhbmQgYXZvaWRzIGlzc3VlcyB0aGF0IGNhbiBhcmlzZSB3aGVuIGJpbmFyeQpmbG9hdGluZyBwb2ludCBjYW5ub3QgZXhhY3RseSByZXByZXNlbnQgZGVjaW1hbCBxdWFudGl0aWVzLgoKRXhhY3QgcmVwcmVzZW50YXRpb24gZW5hYmxlcyB0aGUgXGNsYXNze0RlY2ltYWx9IGNsYXNzIHRvIHBlcmZvcm0KbW9kdWxvIGNhbGN1bGF0aW9ucyBhbmQgZXF1YWxpdHkgdGVzdHMgdGhhdCBhcmUgdW5zdWl0YWJsZSBmb3IgYmluYXJ5CmZsb2F0aW5nIHBvaW50OgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gRGVjaW1hbCgnMS4wMCcpICUgRGVjaW1hbCgnLjEwJykKRGVjaW1hbCgiMC4wMCIpCj4+PiAxLjAwICUgMC4xMAowLjA5OTk5OTk5OTk5OTk5OTk1CiAgICAgICAKPj4+IHN1bShbRGVjaW1hbCgnMC4xJyldKjEwKSA9PSBEZWNpbWFsKCcxLjAnKQpUcnVlCj4+PiBzdW0oWzAuMV0qMTApID09IDEuMApGYWxzZSAgICAgIApcZW5ke3ZlcmJhdGltfQoKVGhlIFxtb2R1bGV7ZGVjaW1hbH0gbW9kdWxlIHByb3ZpZGVzIGFyaXRobWV0aWMgd2l0aCBhcyBtdWNoIHByZWNpc2lvbiBhcwpuZWVkZWQ6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBnZXRjb250ZXh0KCkucHJlYyA9IDM2Cj4+PiBEZWNpbWFsKDEpIC8gRGVjaW1hbCg3KQpEZWNpbWFsKCIwLjE0Mjg1NzE0Mjg1NzE0Mjg1NzE0Mjg1NzE0Mjg1NzE0Mjg1NyIpClxlbmR7dmVyYmF0aW19CgoKClxjaGFwdGVye1doYXQgTm93PyBcbGFiZWx7d2hhdE5vd319CgpSZWFkaW5nIHRoaXMgdHV0b3JpYWwgaGFzIHByb2JhYmx5IHJlaW5mb3JjZWQgeW91ciBpbnRlcmVzdCBpbiB1c2luZwpQeXRob24gLS0tIHlvdSBzaG91bGQgYmUgZWFnZXIgdG8gYXBwbHkgUHl0aG9uIHRvIHNvbHZlIHlvdXIKcmVhbC13b3JsZCBwcm9ibGVtcy4gIE5vdyB3aGF0IHNob3VsZCB5b3UgZG8/CgpZb3Ugc2hvdWxkIHJlYWQsIG9yIGF0IGxlYXN0IHBhZ2UgdGhyb3VnaCwgdGhlClxjaXRldGl0bGVbLi4vbGliL2xpYi5odG1sXXtQeXRob24gTGlicmFyeSBSZWZlcmVuY2V9LAp3aGljaCBnaXZlcyBjb21wbGV0ZSAodGhvdWdoIHRlcnNlKSByZWZlcmVuY2UgbWF0ZXJpYWwgYWJvdXQgdHlwZXMsCmZ1bmN0aW9ucywgYW5kIG1vZHVsZXMgdGhhdCBjYW4gc2F2ZSB5b3UgYSBsb3Qgb2YgdGltZSB3aGVuIHdyaXRpbmcKUHl0aG9uIHByb2dyYW1zLiAgVGhlIHN0YW5kYXJkIFB5dGhvbiBkaXN0cmlidXRpb24gaW5jbHVkZXMgYQpcZW1waHtsb3R9IG9mIGNvZGUgaW4gYm90aCBDIGFuZCBQeXRob247IHRoZXJlIGFyZSBtb2R1bGVzIHRvIHJlYWQKXFVOSVh7fSBtYWlsYm94ZXMsIHJldHJpZXZlIGRvY3VtZW50cyB2aWEgSFRUUCwgZ2VuZXJhdGUgcmFuZG9tCm51bWJlcnMsIHBhcnNlIGNvbW1hbmQtbGluZSBvcHRpb25zLCB3cml0ZSBDR0kgcHJvZ3JhbXMsIGNvbXByZXNzCmRhdGEsIGFuZCBhIGxvdCBtb3JlOyBza2ltbWluZyB0aHJvdWdoIHRoZSBMaWJyYXJ5IFJlZmVyZW5jZSB3aWxsIGdpdmUKeW91IGFuIGlkZWEgb2Ygd2hhdCdzIGF2YWlsYWJsZS4KClRoZSBtYWpvciBQeXRob24gV2ViIHNpdGUgaXMgXHVybHtodHRwOi8vd3d3LnB5dGhvbi5vcmcvfTsgaXQgY29udGFpbnMKY29kZSwgZG9jdW1lbnRhdGlvbiwgYW5kIHBvaW50ZXJzIHRvIFB5dGhvbi1yZWxhdGVkIHBhZ2VzIGFyb3VuZCB0aGUKV2ViLiAgVGhpcyBXZWIgc2l0ZSBpcyBtaXJyb3JlZCBpbiB2YXJpb3VzIHBsYWNlcyBhcm91bmQgdGhlCndvcmxkLCBzdWNoIGFzIEV1cm9wZSwgSmFwYW4sIGFuZCBBdXN0cmFsaWE7IGEgbWlycm9yIG1heSBiZSBmYXN0ZXIKdGhhbiB0aGUgbWFpbiBzaXRlLCBkZXBlbmRpbmcgb24geW91ciBnZW9ncmFwaGljYWwgbG9jYXRpb24uICBBIG1vcmUKaW5mb3JtYWwgc2l0ZSBpcyBcdXJse2h0dHA6Ly9zdGFyc2hpcC5weXRob24ubmV0L30sIHdoaWNoIGNvbnRhaW5zIGEKYnVuY2ggb2YgUHl0aG9uLXJlbGF0ZWQgcGVyc29uYWwgaG9tZSBwYWdlczsgbWFueSBwZW9wbGUgaGF2ZQpkb3dubG9hZGFibGUgc29mdHdhcmUgdGhlcmUuIE1hbnkgbW9yZSB1c2VyLWNyZWF0ZWQgUHl0aG9uIG1vZHVsZXMKY2FuIGJlIGZvdW5kIGluIHRoZSBcdWxpbmt7UHl0aG9uIFBhY2thZ2UKSW5kZXh9e2h0dHA6Ly93d3cucHl0aG9uLm9yZy9weXBpfSAoUHlQSSkuCgpGb3IgUHl0aG9uLXJlbGF0ZWQgcXVlc3Rpb25zIGFuZCBwcm9ibGVtIHJlcG9ydHMsIHlvdSBjYW4gcG9zdCB0byB0aGUKbmV3c2dyb3VwIFxuZXdzZ3JvdXB7Y29tcC5sYW5nLnB5dGhvbn0sIG9yIHNlbmQgdGhlbSB0byB0aGUgbWFpbGluZwpsaXN0IGF0IFxlbWFpbHtweXRob24tbGlzdEBweXRob24ub3JnfS4gIFRoZSBuZXdzZ3JvdXAgYW5kIG1haWxpbmcgbGlzdAphcmUgZ2F0ZXdheWVkLCBzbyBtZXNzYWdlcyBwb3N0ZWQgdG8gb25lIHdpbGwgYXV0b21hdGljYWxseSBiZQpmb3J3YXJkZWQgdG8gdGhlIG90aGVyLiAgVGhlcmUgYXJlIGFyb3VuZCAxMjAgcG9zdGluZ3MgYSBkYXkgKHdpdGggcGVha3MKdXAgdG8gc2V2ZXJhbCBodW5kcmVkKSwKJSBQb3N0aW5ncyBmaWd1cmUgYmFzZWQgb24gYXZlcmFnZSBvZiBsYXN0IHNpeCBtb250aHMgYWN0aXZpdHkgYXMKJSByZXBvcnRlZCBieSB3d3cuZWdyb3Vwcy5jb207IEphbi4gMjAwMCAtIEp1bmUgMjAwMDogMjEyNzIgbXNncyAvIDE4MgolIGRheXMgPSAxMTYuOSBtc2dzIC8gZGF5IGFuZCBzdGVhZGlseSBpbmNyZWFzaW5nLgphc2tpbmcgKGFuZCBhbnN3ZXJpbmcpIHF1ZXN0aW9ucywgc3VnZ2VzdGluZyBuZXcgZmVhdHVyZXMsIGFuZAphbm5vdW5jaW5nIG5ldyBtb2R1bGVzLiAgQmVmb3JlIHBvc3RpbmcsIGJlIHN1cmUgdG8gY2hlY2sgdGhlIGxpc3Qgb2YKXHVsaW5re0ZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zfXtodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jL2ZhcS99IChhbHNvIGNhbGxlZCB0aGUgRkFRKSwgb3IgbG9vayBmb3IgaXQgaW4gdGhlClxmaWxle01pc2MvfSBkaXJlY3Rvcnkgb2YgdGhlIFB5dGhvbiBzb3VyY2UgZGlzdHJpYnV0aW9uLiAgTWFpbGluZwpsaXN0IGFyY2hpdmVzIGFyZSBhdmFpbGFibGUgYXQgXHVybHtodHRwOi8vd3d3LnB5dGhvbi5vcmcvcGlwZXJtYWlsL30uClRoZSBGQVEgYW5zd2VycyBtYW55IG9mIHRoZSBxdWVzdGlvbnMgdGhhdCBjb21lIHVwIGFnYWluIGFuZCBhZ2FpbiwKYW5kIG1heSBhbHJlYWR5IGNvbnRhaW4gdGhlIHNvbHV0aW9uIGZvciB5b3VyIHByb2JsZW0uCgoKXGFwcGVuZGl4CgpcY2hhcHRlcntJbnRlcmFjdGl2ZSBJbnB1dCBFZGl0aW5nIGFuZCBIaXN0b3J5IFN1YnN0aXR1dGlvblxsYWJlbHtpbnRlcmFjdGluZ319CgpTb21lIHZlcnNpb25zIG9mIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgc3VwcG9ydCBlZGl0aW5nIG9mIHRoZSBjdXJyZW50CmlucHV0IGxpbmUgYW5kIGhpc3Rvcnkgc3Vic3RpdHV0aW9uLCBzaW1pbGFyIHRvIGZhY2lsaXRpZXMgZm91bmQgaW4KdGhlIEtvcm4gc2hlbGwgYW5kIHRoZSBHTlUgQmFzaCBzaGVsbC4gIFRoaXMgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlClxlbXBoe0dOVSBSZWFkbGluZX0gbGlicmFyeSwgd2hpY2ggc3VwcG9ydHMgRW1hY3Mtc3R5bGUgYW5kIHZpLXN0eWxlCmVkaXRpbmcuICBUaGlzIGxpYnJhcnkgaGFzIGl0cyBvd24gZG9jdW1lbnRhdGlvbiB3aGljaCBJIHdvbid0CmR1cGxpY2F0ZSBoZXJlOyBob3dldmVyLCB0aGUgYmFzaWNzIGFyZSBlYXNpbHkgZXhwbGFpbmVkLiAgVGhlCmludGVyYWN0aXZlIGVkaXRpbmcgYW5kIGhpc3RvcnkgZGVzY3JpYmVkIGhlcmUgYXJlIG9wdGlvbmFsbHkKYXZhaWxhYmxlIGluIHRoZSBcVU5JWHt9IGFuZCBDeWdXaW4gdmVyc2lvbnMgb2YgdGhlIGludGVycHJldGVyLgoKVGhpcyBjaGFwdGVyIGRvZXMgXGVtcGh7bm90fSBkb2N1bWVudCB0aGUgZWRpdGluZyBmYWNpbGl0aWVzIG9mIE1hcmsKSGFtbW9uZCdzIFB5dGhvbldpbiBwYWNrYWdlIG9yIHRoZSBUay1iYXNlZCBlbnZpcm9ubWVudCwgSURMRSwKZGlzdHJpYnV0ZWQgd2l0aCBQeXRob24uICBUaGUgY29tbWFuZCBsaW5lIGhpc3RvcnkgcmVjYWxsIHdoaWNoCm9wZXJhdGVzIHdpdGhpbiBET1MgYm94ZXMgb24gTlQgYW5kIHNvbWUgb3RoZXIgRE9TIGFuZCBXaW5kb3dzIGZsYXZvcnMgCmlzIHlldCBhbm90aGVyIGJlYXN0LgoKXHNlY3Rpb257TGluZSBFZGl0aW5nIFxsYWJlbHtsaW5lRWRpdGluZ319CgpJZiBzdXBwb3J0ZWQsIGlucHV0IGxpbmUgZWRpdGluZyBpcyBhY3RpdmUgd2hlbmV2ZXIgdGhlIGludGVycHJldGVyCnByaW50cyBhIHByaW1hcnkgb3Igc2Vjb25kYXJ5IHByb21wdC4gIFRoZSBjdXJyZW50IGxpbmUgY2FuIGJlIGVkaXRlZAp1c2luZyB0aGUgY29udmVudGlvbmFsIEVtYWNzIGNvbnRyb2wgY2hhcmFjdGVycy4gIFRoZSBtb3N0IGltcG9ydGFudApvZiB0aGVzZSBhcmU6IFxrYmR7Qy1BfSAoQ29udHJvbC1BKSBtb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBiZWdpbm5pbmcKb2YgdGhlIGxpbmUsIFxrYmR7Qy1FfSB0byB0aGUgZW5kLCBca2Jke0MtQn0gbW92ZXMgaXQgb25lIHBvc2l0aW9uIHRvCnRoZSBsZWZ0LCBca2Jke0MtRn0gdG8gdGhlIHJpZ2h0LiAgQmFja3NwYWNlIGVyYXNlcyB0aGUgY2hhcmFjdGVyIHRvCnRoZSBsZWZ0IG9mIHRoZSBjdXJzb3IsIFxrYmR7Qy1EfSB0aGUgY2hhcmFjdGVyIHRvIGl0cyByaWdodC4KXGtiZHtDLUt9IGtpbGxzIChlcmFzZXMpIHRoZSByZXN0IG9mIHRoZSBsaW5lIHRvIHRoZSByaWdodCBvZiB0aGUKY3Vyc29yLCBca2Jke0MtWX0geWFua3MgYmFjayB0aGUgbGFzdCBraWxsZWQgc3RyaW5nLgpca2Jke0MtdW5kZXJzY29yZX0gdW5kb2VzIHRoZSBsYXN0IGNoYW5nZSB5b3UgbWFkZTsgaXQgY2FuIGJlIHJlcGVhdGVkCmZvciBjdW11bGF0aXZlIGVmZmVjdC4KClxzZWN0aW9ue0hpc3RvcnkgU3Vic3RpdHV0aW9uIFxsYWJlbHtoaXN0b3J5fX0KCkhpc3Rvcnkgc3Vic3RpdHV0aW9uIHdvcmtzIGFzIGZvbGxvd3MuICBBbGwgbm9uLWVtcHR5IGlucHV0IGxpbmVzCmlzc3VlZCBhcmUgc2F2ZWQgaW4gYSBoaXN0b3J5IGJ1ZmZlciwgYW5kIHdoZW4gYSBuZXcgcHJvbXB0IGlzIGdpdmVuCnlvdSBhcmUgcG9zaXRpb25lZCBvbiBhIG5ldyBsaW5lIGF0IHRoZSBib3R0b20gb2YgdGhpcyBidWZmZXIuClxrYmR7Qy1QfSBtb3ZlcyBvbmUgbGluZSB1cCAoYmFjaykgaW4gdGhlIGhpc3RvcnkgYnVmZmVyLApca2Jke0MtTn0gbW92ZXMgb25lIGRvd24uICBBbnkgbGluZSBpbiB0aGUgaGlzdG9yeSBidWZmZXIgY2FuIGJlCmVkaXRlZDsgYW4gYXN0ZXJpc2sgYXBwZWFycyBpbiBmcm9udCBvZiB0aGUgcHJvbXB0IHRvIG1hcmsgYSBsaW5lIGFzCm1vZGlmaWVkLiAgUHJlc3NpbmcgdGhlIFxrYmR7UmV0dXJufSBrZXkgcGFzc2VzIHRoZSBjdXJyZW50IGxpbmUgdG8KdGhlIGludGVycHJldGVyLiAgXGtiZHtDLVJ9IHN0YXJ0cyBhbiBpbmNyZW1lbnRhbCByZXZlcnNlIHNlYXJjaDsKXGtiZHtDLVN9IHN0YXJ0cyBhIGZvcndhcmQgc2VhcmNoLgoKXHNlY3Rpb257S2V5IEJpbmRpbmdzIFxsYWJlbHtrZXlCaW5kaW5nc319CgpUaGUga2V5IGJpbmRpbmdzIGFuZCBzb21lIG90aGVyIHBhcmFtZXRlcnMgb2YgdGhlIFJlYWRsaW5lIGxpYnJhcnkgY2FuCmJlIGN1c3RvbWl6ZWQgYnkgcGxhY2luZyBjb21tYW5kcyBpbiBhbiBpbml0aWFsaXphdGlvbiBmaWxlIGNhbGxlZApcZmlsZXtcfnt9Ly5pbnB1dHJjfS4gIEtleSBiaW5kaW5ncyBoYXZlIHRoZSBmb3JtCgpcYmVnaW57dmVyYmF0aW19CmtleS1uYW1lOiBmdW5jdGlvbi1uYW1lClxlbmR7dmVyYmF0aW19CgpvcgoKXGJlZ2lue3ZlcmJhdGltfQoic3RyaW5nIjogZnVuY3Rpb24tbmFtZQpcZW5ke3ZlcmJhdGltfQoKYW5kIG9wdGlvbnMgY2FuIGJlIHNldCB3aXRoCgpcYmVnaW57dmVyYmF0aW19CnNldCBvcHRpb24tbmFtZSB2YWx1ZQpcZW5ke3ZlcmJhdGltfQoKRm9yIGV4YW1wbGU6CgpcYmVnaW57dmVyYmF0aW19CiMgSSBwcmVmZXIgdmktc3R5bGUgZWRpdGluZzoKc2V0IGVkaXRpbmctbW9kZSB2aQoKIyBFZGl0IHVzaW5nIGEgc2luZ2xlIGxpbmU6CnNldCBob3Jpem9udGFsLXNjcm9sbC1tb2RlIE9uCgojIFJlYmluZCBzb21lIGtleXM6Ck1ldGEtaDogYmFja3dhcmQta2lsbC13b3JkCiJcQy11IjogdW5pdmVyc2FsLWFyZ3VtZW50CiJcQy14XEMtciI6IHJlLXJlYWQtaW5pdC1maWxlClxlbmR7dmVyYmF0aW19CgpOb3RlIHRoYXQgdGhlIGRlZmF1bHQgYmluZGluZyBmb3IgXGtiZHtUYWJ9IGluIFB5dGhvbiBpcyB0byBpbnNlcnQgYQpca2Jke1RhYn0gY2hhcmFjdGVyIGluc3RlYWQgb2YgUmVhZGxpbmUncyBkZWZhdWx0IGZpbGVuYW1lIGNvbXBsZXRpb24KZnVuY3Rpb24uICBJZiB5b3UgaW5zaXN0LCB5b3UgY2FuIG92ZXJyaWRlIHRoaXMgYnkgcHV0dGluZwoKXGJlZ2lue3ZlcmJhdGltfQpUYWI6IGNvbXBsZXRlClxlbmR7dmVyYmF0aW19CgppbiB5b3VyIFxmaWxle1x+e30vLmlucHV0cmN9LiAgKE9mIGNvdXJzZSwgdGhpcyBtYWtlcyBpdCBoYXJkZXIgdG8KdHlwZSBpbmRlbnRlZCBjb250aW51YXRpb24gbGluZXMgaWYgeW91J3JlIGFjY3VzdG9tZWQgdG8gdXNpbmcKXGtiZHtUYWJ9IGZvciB0aGF0IHB1cnBvc2UuKQoKQXV0b21hdGljIGNvbXBsZXRpb24gb2YgdmFyaWFibGUgYW5kIG1vZHVsZSBuYW1lcyBpcyBvcHRpb25hbGx5CmF2YWlsYWJsZS4gIFRvIGVuYWJsZSBpdCBpbiB0aGUgaW50ZXJwcmV0ZXIncyBpbnRlcmFjdGl2ZSBtb2RlLCBhZGQKdGhlIGZvbGxvd2luZyB0byB5b3VyIHN0YXJ0dXAgZmlsZTpcZm9vdG5vdGV7CiAgUHl0aG9uIHdpbGwgZXhlY3V0ZSB0aGUgY29udGVudHMgb2YgYSBmaWxlIGlkZW50aWZpZWQgYnkgdGhlCiAgXGVudnZhcntQWVRIT05TVEFSVFVQfSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGVuIHlvdSBzdGFydCBhbgogIGludGVyYWN0aXZlIGludGVycHJldGVyLn0KXHJlZnN0bW9kaW5kZXh7cmxjb21wbGV0ZXJ9XHJlZmJpbW9kaW5kZXh7cmVhZGxpbmV9CgpcYmVnaW57dmVyYmF0aW19CmltcG9ydCBybGNvbXBsZXRlciwgcmVhZGxpbmUKcmVhZGxpbmUucGFyc2VfYW5kX2JpbmQoJ3RhYjogY29tcGxldGUnKQpcZW5ke3ZlcmJhdGltfQoKVGhpcyBiaW5kcyB0aGUgXGtiZHtUYWJ9IGtleSB0byB0aGUgY29tcGxldGlvbiBmdW5jdGlvbiwgc28gaGl0dGluZwp0aGUgXGtiZHtUYWJ9IGtleSB0d2ljZSBzdWdnZXN0cyBjb21wbGV0aW9uczsgaXQgbG9va3MgYXQgUHl0aG9uCnN0YXRlbWVudCBuYW1lcywgdGhlIGN1cnJlbnQgbG9jYWwgdmFyaWFibGVzLCBhbmQgdGhlIGF2YWlsYWJsZSBtb2R1bGUKbmFtZXMuICBGb3IgZG90dGVkIGV4cHJlc3Npb25zIHN1Y2ggYXMgXGNvZGV7c3RyaW5nLmF9LCBpdCB3aWxsCmV2YWx1YXRlIHRoZSBleHByZXNzaW9uIHVwIHRvIHRoZSBmaW5hbCBcY2hhcmFjdGVyey59IGFuZCB0aGVuCnN1Z2dlc3QgY29tcGxldGlvbnMgZnJvbSB0aGUgYXR0cmlidXRlcyBvZiB0aGUgcmVzdWx0aW5nIG9iamVjdC4gIE5vdGUKdGhhdCB0aGlzIG1heSBleGVjdXRlIGFwcGxpY2F0aW9uLWRlZmluZWQgY29kZSBpZiBhbiBvYmplY3Qgd2l0aCBhClxtZXRob2R7X19nZXRhdHRyX18oKX0gbWV0aG9kIGlzIHBhcnQgb2YgdGhlIGV4cHJlc3Npb24uCgpBIG1vcmUgY2FwYWJsZSBzdGFydHVwIGZpbGUgbWlnaHQgbG9vayBsaWtlIHRoaXMgZXhhbXBsZS4gIE5vdGUgdGhhdAp0aGlzIGRlbGV0ZXMgdGhlIG5hbWVzIGl0IGNyZWF0ZXMgb25jZSB0aGV5IGFyZSBubyBsb25nZXIgbmVlZGVkOyB0aGlzCmlzIGRvbmUgc2luY2UgdGhlIHN0YXJ0dXAgZmlsZSBpcyBleGVjdXRlZCBpbiB0aGUgc2FtZSBuYW1lc3BhY2UgYXMKdGhlIGludGVyYWN0aXZlIGNvbW1hbmRzLCBhbmQgcmVtb3ZpbmcgdGhlIG5hbWVzIGF2b2lkcyBjcmVhdGluZyBzaWRlCmVmZmVjdHMgaW4gdGhlIGludGVyYWN0aXZlIGVudmlyb25tZW50cy4gIFlvdSBtYXkgZmluZCBpdCBjb252ZW5pZW50CnRvIGtlZXAgc29tZSBvZiB0aGUgaW1wb3J0ZWQgbW9kdWxlcywgc3VjaCBhcwpcdWxpbmt7XG1vZHVsZXtvc319ey4uL2xpYi9tb2R1bGUtb3MuaHRtbH0sIHdoaWNoIHR1cm4Kb3V0IHRvIGJlIG5lZWRlZCBpbiBtb3N0IHNlc3Npb25zIHdpdGggdGhlIGludGVycHJldGVyLgoKXGJlZ2lue3ZlcmJhdGltfQojIEFkZCBhdXRvLWNvbXBsZXRpb24gYW5kIGEgc3RvcmVkIGhpc3RvcnkgZmlsZSBvZiBjb21tYW5kcyB0byB5b3VyIFB5dGhvbgojIGludGVyYWN0aXZlIGludGVycHJldGVyLiBSZXF1aXJlcyBQeXRob24gMi4wKywgcmVhZGxpbmUuIEF1dG9jb21wbGV0ZSBpcwojIGJvdW5kIHRvIHRoZSBFc2Mga2V5IGJ5IGRlZmF1bHQgKHlvdSBjYW4gY2hhbmdlIGl0IC0gc2VlIHJlYWRsaW5lIGRvY3MpLgojCiMgU3RvcmUgdGhlIGZpbGUgaW4gfi8ucHlzdGFydHVwLCBhbmQgc2V0IGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHBvaW50CiMgdG8gaXQ6ICAiZXhwb3J0IFBZVEhPTlNUQVJUVVA9L21heC9ob21lL2l0YW1hci8ucHlzdGFydHVwIiBpbiBiYXNoLgojCiMgTm90ZSB0aGF0IFBZVEhPTlNUQVJUVVAgZG9lcyAqbm90KiBleHBhbmQgIn4iLCBzbyB5b3UgaGF2ZSB0byBwdXQgaW4gdGhlCiMgZnVsbCBwYXRoIHRvIHlvdXIgaG9tZSBkaXJlY3RvcnkuCgppbXBvcnQgYXRleGl0CmltcG9ydCBvcwppbXBvcnQgcmVhZGxpbmUKaW1wb3J0IHJsY29tcGxldGVyCgpoaXN0b3J5UGF0aCA9IG9zLnBhdGguZXhwYW5kdXNlcigifi8ucHloaXN0b3J5IikKCmRlZiBzYXZlX2hpc3RvcnkoaGlzdG9yeVBhdGg9aGlzdG9yeVBhdGgpOgogICAgaW1wb3J0IHJlYWRsaW5lCiAgICByZWFkbGluZS53cml0ZV9oaXN0b3J5X2ZpbGUoaGlzdG9yeVBhdGgpCgppZiBvcy5wYXRoLmV4aXN0cyhoaXN0b3J5UGF0aCk6CiAgICByZWFkbGluZS5yZWFkX2hpc3RvcnlfZmlsZShoaXN0b3J5UGF0aCkKCmF0ZXhpdC5yZWdpc3RlcihzYXZlX2hpc3RvcnkpCmRlbCBvcywgYXRleGl0LCByZWFkbGluZSwgcmxjb21wbGV0ZXIsIHNhdmVfaGlzdG9yeSwgaGlzdG9yeVBhdGgKXGVuZHt2ZXJiYXRpbX0KCgpcc2VjdGlvbntDb21tZW50YXJ5IFxsYWJlbHtjb21tZW50YXJ5fX0KClRoaXMgZmFjaWxpdHkgaXMgYW4gZW5vcm1vdXMgc3RlcCBmb3J3YXJkIGNvbXBhcmVkIHRvIGVhcmxpZXIgdmVyc2lvbnMKb2YgdGhlIGludGVycHJldGVyOyBob3dldmVyLCBzb21lIHdpc2hlcyBhcmUgbGVmdDogSXQgd291bGQgYmUgbmljZSBpZgp0aGUgcHJvcGVyIGluZGVudGF0aW9uIHdlcmUgc3VnZ2VzdGVkIG9uIGNvbnRpbnVhdGlvbiBsaW5lcyAodGhlCnBhcnNlciBrbm93cyBpZiBhbiBpbmRlbnQgdG9rZW4gaXMgcmVxdWlyZWQgbmV4dCkuICBUaGUgY29tcGxldGlvbgptZWNoYW5pc20gbWlnaHQgdXNlIHRoZSBpbnRlcnByZXRlcidzIHN5bWJvbCB0YWJsZS4gIEEgY29tbWFuZCB0bwpjaGVjayAob3IgZXZlbiBzdWdnZXN0KSBtYXRjaGluZyBwYXJlbnRoZXNlcywgcXVvdGVzLCBldGMuLCB3b3VsZCBhbHNvCmJlIHVzZWZ1bC4KCgpcY2hhcHRlcntGbG9hdGluZyBQb2ludCBBcml0aG1ldGljOiAgSXNzdWVzIGFuZCBMaW1pdGF0aW9uc1xsYWJlbHtmcC1pc3N1ZXN9fQpcc2VjdGlvbmF1dGhvcntUaW0gUGV0ZXJzfXt0aW1fb25lQHVzZXJzLnNvdXJjZWZvcmdlLm5ldH0KCkZsb2F0aW5nLXBvaW50IG51bWJlcnMgYXJlIHJlcHJlc2VudGVkIGluIGNvbXB1dGVyIGhhcmR3YXJlIGFzCmJhc2UgMiAoYmluYXJ5KSBmcmFjdGlvbnMuICBGb3IgZXhhbXBsZSwgdGhlIGRlY2ltYWwgZnJhY3Rpb24KClxiZWdpbnt2ZXJiYXRpbX0KMC4xMjUKXGVuZHt2ZXJiYXRpbX0KCmhhcyB2YWx1ZSAxLzEwICsgMi8xMDAgKyA1LzEwMDAsIGFuZCBpbiB0aGUgc2FtZSB3YXkgdGhlIGJpbmFyeSBmcmFjdGlvbgoKXGJlZ2lue3ZlcmJhdGltfQowLjAwMQpcZW5ke3ZlcmJhdGltfQoKaGFzIHZhbHVlIDAvMiArIDAvNCArIDEvOC4gIFRoZXNlIHR3byBmcmFjdGlvbnMgaGF2ZSBpZGVudGljYWwgdmFsdWVzLAp0aGUgb25seSByZWFsIGRpZmZlcmVuY2UgYmVpbmcgdGhhdCB0aGUgZmlyc3QgaXMgd3JpdHRlbiBpbiBiYXNlIDEwCmZyYWN0aW9uYWwgbm90YXRpb24sIGFuZCB0aGUgc2Vjb25kIGluIGJhc2UgMi4KClVuZm9ydHVuYXRlbHksIG1vc3QgZGVjaW1hbCBmcmFjdGlvbnMgY2Fubm90IGJlIHJlcHJlc2VudGVkIGV4YWN0bHkgYXMKYmluYXJ5IGZyYWN0aW9ucy4gIEEgY29uc2VxdWVuY2UgaXMgdGhhdCwgaW4gZ2VuZXJhbCwgdGhlIGRlY2ltYWwKZmxvYXRpbmctcG9pbnQgbnVtYmVycyB5b3UgZW50ZXIgYXJlIG9ubHkgYXBwcm94aW1hdGVkIGJ5IHRoZSBiaW5hcnkKZmxvYXRpbmctcG9pbnQgbnVtYmVycyBhY3R1YWxseSBzdG9yZWQgaW4gdGhlIG1hY2hpbmUuCgpUaGUgcHJvYmxlbSBpcyBlYXNpZXIgdG8gdW5kZXJzdGFuZCBhdCBmaXJzdCBpbiBiYXNlIDEwLiAgQ29uc2lkZXIgdGhlCmZyYWN0aW9uIDEvMy4gIFlvdSBjYW4gYXBwcm94aW1hdGUgdGhhdCBhcyBhIGJhc2UgMTAgZnJhY3Rpb246CgpcYmVnaW57dmVyYmF0aW19CjAuMwpcZW5ke3ZlcmJhdGltfQoKb3IsIGJldHRlciwKClxiZWdpbnt2ZXJiYXRpbX0KMC4zMwpcZW5ke3ZlcmJhdGltfQoKb3IsIGJldHRlciwKClxiZWdpbnt2ZXJiYXRpbX0KMC4zMzMKXGVuZHt2ZXJiYXRpbX0KCmFuZCBzbyBvbi4gIE5vIG1hdHRlciBob3cgbWFueSBkaWdpdHMgeW91J3JlIHdpbGxpbmcgdG8gd3JpdGUgZG93biwgdGhlCnJlc3VsdCB3aWxsIG5ldmVyIGJlIGV4YWN0bHkgMS8zLCBidXQgd2lsbCBiZSBhbiBpbmNyZWFzaW5nbHkgYmV0dGVyCmFwcHJveGltYXRpb24gdG8gMS8zLgoKSW4gdGhlIHNhbWUgd2F5LCBubyBtYXR0ZXIgaG93IG1hbnkgYmFzZSAyIGRpZ2l0cyB5b3UncmUgd2lsbGluZyB0bwp1c2UsIHRoZSBkZWNpbWFsIHZhbHVlIDAuMSBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgZXhhY3RseSBhcyBhIGJhc2UgMgpmcmFjdGlvbi4gIEluIGJhc2UgMiwgMS8xMCBpcyB0aGUgaW5maW5pdGVseSByZXBlYXRpbmcgZnJhY3Rpb24KClxiZWdpbnt2ZXJiYXRpbX0KMC4wMDAxMTAwMTEwMDExMDAxMTAwMTEwMDExMDAxMTAwMTEwMDExMDAxMTAwMTEwMDExLi4uClxlbmR7dmVyYmF0aW19CgpTdG9wIGF0IGFueSBmaW5pdGUgbnVtYmVyIG9mIGJpdHMsIGFuZCB5b3UgZ2V0IGFuIGFwcHJveGltYXRpb24uICBUaGlzCmlzIHdoeSB5b3Ugc2VlIHRoaW5ncyBsaWtlOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gMC4xCjAuMTAwMDAwMDAwMDAwMDAwMDEKXGVuZHt2ZXJiYXRpbX0KCk9uIG1vc3QgbWFjaGluZXMgdG9kYXksIHRoYXQgaXMgd2hhdCB5b3UnbGwgc2VlIGlmIHlvdSBlbnRlciAwLjEgYXQKYSBQeXRob24gcHJvbXB0LiAgWW91IG1heSBub3QsIHRob3VnaCwgYmVjYXVzZSB0aGUgbnVtYmVyIG9mIGJpdHMKdXNlZCBieSB0aGUgaGFyZHdhcmUgdG8gc3RvcmUgZmxvYXRpbmctcG9pbnQgdmFsdWVzIGNhbiB2YXJ5IGFjcm9zcwptYWNoaW5lcywgYW5kIFB5dGhvbiBvbmx5IHByaW50cyBhIGRlY2ltYWwgYXBwcm94aW1hdGlvbiB0byB0aGUgdHJ1ZQpkZWNpbWFsIHZhbHVlIG9mIHRoZSBiaW5hcnkgYXBwcm94aW1hdGlvbiBzdG9yZWQgYnkgdGhlIG1hY2hpbmUuICBPbgptb3N0IG1hY2hpbmVzLCBpZiBQeXRob24gd2VyZSB0byBwcmludCB0aGUgdHJ1ZSBkZWNpbWFsIHZhbHVlIG9mCnRoZSBiaW5hcnkgYXBwcm94aW1hdGlvbiBzdG9yZWQgZm9yIDAuMSwgaXQgd291bGQgaGF2ZSB0byBkaXNwbGF5CgpcYmVnaW57dmVyYmF0aW19Cj4+PiAwLjEKMC4xMDAwMDAwMDAwMDAwMDAwMDU1NTExMTUxMjMxMjU3ODI3MDIxMTgxNTgzNDA0NTQxMDE1NjI1ClxlbmR7dmVyYmF0aW19CgppbnN0ZWFkISAgVGhlIFB5dGhvbiBwcm9tcHQgKGltcGxpY2l0bHkpIHVzZXMgdGhlIGJ1aWx0aW4KXGZ1bmN0aW9ue3JlcHIoKX0gZnVuY3Rpb24gdG8gb2J0YWluIGEgc3RyaW5nIHZlcnNpb24gb2YgZXZlcnl0aGluZyBpdApkaXNwbGF5cy4gIEZvciBmbG9hdHMsIFxjb2Rle3JlcHIoXHZhcntmbG9hdH0pfSByb3VuZHMgdGhlIHRydWUKZGVjaW1hbCB2YWx1ZSB0byAxNyBzaWduaWZpY2FudCBkaWdpdHMsIGdpdmluZwoKXGJlZ2lue3ZlcmJhdGltfQowLjEwMDAwMDAwMDAwMDAwMDAxClxlbmR7dmVyYmF0aW19CgpcY29kZXtyZXByKFx2YXJ7ZmxvYXR9KX0gcHJvZHVjZXMgMTcgc2lnbmlmaWNhbnQgZGlnaXRzIGJlY2F1c2UgaXQKdHVybnMgb3V0IHRoYXQncyBlbm91Z2ggKG9uIG1vc3QgbWFjaGluZXMpIHNvIHRoYXQKXGNvZGV7ZXZhbChyZXByKFx2YXJ7eH0pKSA9PSBcdmFye3h9fSBleGFjdGx5IGZvciBhbGwgZmluaXRlIGZsb2F0cwpcdmFye3h9LCBidXQgcm91bmRpbmcgdG8gMTYgZGlnaXRzIGlzIG5vdCBlbm91Z2ggdG8gbWFrZSB0aGF0IHRydWUuCgpOb3RlIHRoYXQgdGhpcyBpcyBpbiB0aGUgdmVyeSBuYXR1cmUgb2YgYmluYXJ5IGZsb2F0aW5nLXBvaW50OiB0aGlzIGlzCm5vdCBhIGJ1ZyBpbiBQeXRob24sIGl0IGlzIG5vdCBhIGJ1ZyBpbiB5b3VyIGNvZGUgZWl0aGVyLCBhbmQgeW91J2xsCnNlZSB0aGUgc2FtZSBraW5kIG9mIHRoaW5nIGluIGFsbCBsYW5ndWFnZXMgdGhhdCBzdXBwb3J0IHlvdXIKaGFyZHdhcmUncyBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljIChhbHRob3VnaCBzb21lIGxhbmd1YWdlcyBtYXkKbm90IFxlbXBoe2Rpc3BsYXl9IHRoZSBkaWZmZXJlbmNlIGJ5IGRlZmF1bHQsIG9yIGluIGFsbCBvdXRwdXQgbW9kZXMpLgoKUHl0aG9uJ3MgYnVpbHRpbiBcZnVuY3Rpb257c3RyKCl9IGZ1bmN0aW9uIHByb2R1Y2VzIG9ubHkgMTIKc2lnbmlmaWNhbnQgZGlnaXRzLCBhbmQgeW91IG1heSB3aXNoIHRvIHVzZSB0aGF0IGluc3RlYWQuICBJdCdzCnVudXN1YWwgZm9yIFxjb2Rle2V2YWwoc3RyKFx2YXJ7eH0pKX0gdG8gcmVwcm9kdWNlIFx2YXJ7eH0sIGJ1dCB0aGUKb3V0cHV0IG1heSBiZSBtb3JlIHBsZWFzYW50IHRvIGxvb2sgYXQ6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBwcmludCBzdHIoMC4xKQowLjEKXGVuZHt2ZXJiYXRpbX0KCkl0J3MgaW1wb3J0YW50IHRvIHJlYWxpemUgdGhhdCB0aGlzIGlzLCBpbiBhIHJlYWwgc2Vuc2UsIGFuIGlsbHVzaW9uOgp0aGUgdmFsdWUgaW4gdGhlIG1hY2hpbmUgaXMgbm90IGV4YWN0bHkgMS8xMCwgeW91J3JlIHNpbXBseSByb3VuZGluZwp0aGUgXGVtcGh7ZGlzcGxheX0gb2YgdGhlIHRydWUgbWFjaGluZSB2YWx1ZS4KCk90aGVyIHN1cnByaXNlcyBmb2xsb3cgZnJvbSB0aGlzIG9uZS4gIEZvciBleGFtcGxlLCBhZnRlciBzZWVpbmcKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IDAuMQowLjEwMDAwMDAwMDAwMDAwMDAxClxlbmR7dmVyYmF0aW19Cgp5b3UgbWF5IGJlIHRlbXB0ZWQgdG8gdXNlIHRoZSBcZnVuY3Rpb257cm91bmQoKX0gZnVuY3Rpb24gdG8gY2hvcCBpdApiYWNrIHRvIHRoZSBzaW5nbGUgZGlnaXQgeW91IGV4cGVjdC4gIEJ1dCB0aGF0IG1ha2VzIG5vIGRpZmZlcmVuY2U6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiByb3VuZCgwLjEsIDEpCjAuMTAwMDAwMDAwMDAwMDAwMDEKXGVuZHt2ZXJiYXRpbX0KClRoZSBwcm9ibGVtIGlzIHRoYXQgdGhlIGJpbmFyeSBmbG9hdGluZy1wb2ludCB2YWx1ZSBzdG9yZWQgZm9yICIwLjEiCndhcyBhbHJlYWR5IHRoZSBiZXN0IHBvc3NpYmxlIGJpbmFyeSBhcHByb3hpbWF0aW9uIHRvIDEvMTAsIHNvIHRyeWluZwp0byByb3VuZCBpdCBhZ2FpbiBjYW4ndCBtYWtlIGl0IGJldHRlcjogIGl0IHdhcyBhbHJlYWR5IGFzIGdvb2QgYXMgaXQKZ2V0cy4KCkFub3RoZXIgY29uc2VxdWVuY2UgaXMgdGhhdCBzaW5jZSAwLjEgaXMgbm90IGV4YWN0bHkgMS8xMCwgYWRkaW5nIDAuMQp0byBpdHNlbGYgMTAgdGltZXMgbWF5IG5vdCB5aWVsZCBleGFjdGx5IDEuMCwgZWl0aGVyOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gc3VtID0gMC4wCj4+PiBmb3IgaSBpbiByYW5nZSgxMCk6Ci4uLiAgICAgc3VtICs9IDAuMQouLi4KPj4+IHN1bQowLjk5OTk5OTk5OTk5OTk5OTg5ClxlbmR7dmVyYmF0aW19CgpCaW5hcnkgZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYyBob2xkcyBtYW55IHN1cnByaXNlcyBsaWtlIHRoaXMuICBUaGUKcHJvYmxlbSB3aXRoICIwLjEiIGlzIGV4cGxhaW5lZCBpbiBwcmVjaXNlIGRldGFpbCBiZWxvdywgaW4gdGhlCiJSZXByZXNlbnRhdGlvbiBFcnJvciIgc2VjdGlvbi4gIFNlZQpcY2l0ZXRpdGxlW2h0dHA6Ly93d3cubGFoZXkuY29tL2Zsb2F0Lmh0bV17VGhlIFBlcmlscyBvZiBGbG9hdGluZwpQb2ludH0gZm9yIGEgbW9yZSBjb21wbGV0ZSBhY2NvdW50IG9mIG90aGVyIGNvbW1vbiBzdXJwcmlzZXMuCgpBcyB0aGF0IHNheXMgbmVhciB0aGUgZW5kLCBgYHRoZXJlIGFyZSBubyBlYXN5IGFuc3dlcnMuJycgIFN0aWxsLApkb24ndCBiZSB1bmR1bHkgd2FyeSBvZiBmbG9hdGluZy1wb2ludCEgIFRoZSBlcnJvcnMgaW4gUHl0aG9uIGZsb2F0Cm9wZXJhdGlvbnMgYXJlIGluaGVyaXRlZCBmcm9tIHRoZSBmbG9hdGluZy1wb2ludCBoYXJkd2FyZSwgYW5kIG9uIG1vc3QKbWFjaGluZXMgYXJlIG9uIHRoZSBvcmRlciBvZiBubyBtb3JlIHRoYW4gMSBwYXJ0IGluIDIqKjUzIHBlcgpvcGVyYXRpb24uICBUaGF0J3MgbW9yZSB0aGFuIGFkZXF1YXRlIGZvciBtb3N0IHRhc2tzLCBidXQgeW91IGRvIG5lZWQKdG8ga2VlcCBpbiBtaW5kIHRoYXQgaXQncyBub3QgZGVjaW1hbCBhcml0aG1ldGljLCBhbmQgdGhhdCBldmVyeSBmbG9hdApvcGVyYXRpb24gY2FuIHN1ZmZlciBhIG5ldyByb3VuZGluZyBlcnJvci4KCldoaWxlIHBhdGhvbG9naWNhbCBjYXNlcyBkbyBleGlzdCwgZm9yIG1vc3QgY2FzdWFsIHVzZSBvZgpmbG9hdGluZy1wb2ludCBhcml0aG1ldGljIHlvdSdsbCBzZWUgdGhlIHJlc3VsdCB5b3UgZXhwZWN0IGluIHRoZSBlbmQKaWYgeW91IHNpbXBseSByb3VuZCB0aGUgZGlzcGxheSBvZiB5b3VyIGZpbmFsIHJlc3VsdHMgdG8gdGhlIG51bWJlciBvZgpkZWNpbWFsIGRpZ2l0cyB5b3UgZXhwZWN0LiAgXGZ1bmN0aW9ue3N0cigpfSB1c3VhbGx5IHN1ZmZpY2VzLCBhbmQgZm9yCmZpbmVyIGNvbnRyb2wgc2VlIHRoZSBkaXNjdXNzaW9uIG9mIFB5dGhvbidzIFxjb2Rle1wlfSBmb3JtYXQKb3BlcmF0b3I6IHRoZSBcY29kZXtcJWd9LCBcY29kZXtcJWZ9IGFuZCBcY29kZXtcJWV9IGZvcm1hdCBjb2RlcwpzdXBwbHkgZmxleGlibGUgYW5kIGVhc3kgd2F5cyB0byByb3VuZCBmbG9hdCByZXN1bHRzIGZvciBkaXNwbGF5LgoKClxzZWN0aW9ue1JlcHJlc2VudGF0aW9uIEVycm9yCiAgICAgICAgIFxsYWJlbHtmcC1lcnJvcn19CgpUaGlzIHNlY3Rpb24gZXhwbGFpbnMgdGhlIGBgMC4xJycgZXhhbXBsZSBpbiBkZXRhaWwsIGFuZCBzaG93cyBob3cKeW91IGNhbiBwZXJmb3JtIGFuIGV4YWN0IGFuYWx5c2lzIG9mIGNhc2VzIGxpa2UgdGhpcyB5b3Vyc2VsZi4gIEJhc2ljCmZhbWlsaWFyaXR5IHdpdGggYmluYXJ5IGZsb2F0aW5nLXBvaW50IHJlcHJlc2VudGF0aW9uIGlzIGFzc3VtZWQuCgpcZGZue1JlcHJlc2VudGF0aW9uIGVycm9yfSByZWZlcnMgdG8gdGhhdCBzb21lIChtb3N0LCBhY3R1YWxseSkKZGVjaW1hbCBmcmFjdGlvbnMgY2Fubm90IGJlIHJlcHJlc2VudGVkIGV4YWN0bHkgYXMgYmluYXJ5IChiYXNlIDIpCmZyYWN0aW9ucy4gIFRoaXMgaXMgdGhlIGNoaWVmIHJlYXNvbiB3aHkgUHl0aG9uIChvciBQZXJsLCBDLCBcQ3BwLApKYXZhLCBGb3J0cmFuLCBhbmQgbWFueSBvdGhlcnMpIG9mdGVuIHdvbid0IGRpc3BsYXkgdGhlIGV4YWN0IGRlY2ltYWwKbnVtYmVyIHlvdSBleHBlY3Q6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiAwLjEKMC4xMDAwMDAwMDAwMDAwMDAwMQpcZW5ke3ZlcmJhdGltfQoKV2h5IGlzIHRoYXQ/ICAxLzEwIGlzIG5vdCBleGFjdGx5IHJlcHJlc2VudGFibGUgYXMgYSBiaW5hcnkgZnJhY3Rpb24uCkFsbW9zdCBhbGwgbWFjaGluZXMgdG9kYXkgKE5vdmVtYmVyIDIwMDApIHVzZSBJRUVFLTc1NCBmbG9hdGluZyBwb2ludAphcml0aG1ldGljLCBhbmQgYWxtb3N0IGFsbCBwbGF0Zm9ybXMgbWFwIFB5dGhvbiBmbG9hdHMgdG8gSUVFRS03NTQKImRvdWJsZSBwcmVjaXNpb24iLiAgNzU0IGRvdWJsZXMgY29udGFpbiA1MyBiaXRzIG9mIHByZWNpc2lvbiwgc28gb24KaW5wdXQgdGhlIGNvbXB1dGVyIHN0cml2ZXMgdG8gY29udmVydCAwLjEgdG8gdGhlIGNsb3Nlc3QgZnJhY3Rpb24gaXQgY2FuCm9mIHRoZSBmb3JtIFx2YXJ7Sn0vMioqXHZhcntOfSB3aGVyZSBcdmFye0p9IGlzIGFuIGludGVnZXIgY29udGFpbmluZwpleGFjdGx5IDUzIGJpdHMuICBSZXdyaXRpbmcKClxiZWdpbnt2ZXJiYXRpbX0KIDEgLyAxMCB+PSBKIC8gKDIqKk4pClxlbmR7dmVyYmF0aW19CgphcwoKXGJlZ2lue3ZlcmJhdGltfQpKIH49IDIqKk4gLyAxMApcZW5ke3ZlcmJhdGltfQoKYW5kIHJlY2FsbGluZyB0aGF0IFx2YXJ7Sn0gaGFzIGV4YWN0bHkgNTMgYml0cyAoaXMgXGNvZGV7Pj0gMioqNTJ9IGJ1dApcY29kZXs8IDIqKjUzfSksIHRoZSBiZXN0IHZhbHVlIGZvciBcdmFye059IGlzIDU2OgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gMkwqKjUyCjQ1MDM1OTk2MjczNzA0OTZMCj4+PiAyTCoqNTMKOTAwNzE5OTI1NDc0MDk5MkwKPj4+IDJMKio1Ni8xMAo3MjA1NzU5NDAzNzkyNzkzTApcZW5ke3ZlcmJhdGltfQoKVGhhdCBpcywgNTYgaXMgdGhlIG9ubHkgdmFsdWUgZm9yIFx2YXJ7Tn0gdGhhdCBsZWF2ZXMgXHZhcntKfSB3aXRoCmV4YWN0bHkgNTMgYml0cy4gIFRoZSBiZXN0IHBvc3NpYmxlIHZhbHVlIGZvciBcdmFye0p9IGlzIHRoZW4gdGhhdApxdW90aWVudCByb3VuZGVkOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gcSwgciA9IGRpdm1vZCgyTCoqNTYsIDEwKQo+Pj4gcgo2TApcZW5ke3ZlcmJhdGltfQoKU2luY2UgdGhlIHJlbWFpbmRlciBpcyBtb3JlIHRoYW4gaGFsZiBvZiAxMCwgdGhlIGJlc3QgYXBwcm94aW1hdGlvbiBpcwpvYnRhaW5lZCBieSByb3VuZGluZyB1cDoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHErMQo3MjA1NzU5NDAzNzkyNzk0TApcZW5ke3ZlcmJhdGltfQoKVGhlcmVmb3JlIHRoZSBiZXN0IHBvc3NpYmxlIGFwcHJveGltYXRpb24gdG8gMS8xMCBpbiA3NTQgZG91YmxlCnByZWNpc2lvbiBpcyB0aGF0IG92ZXIgMioqNTYsIG9yCgpcYmVnaW57dmVyYmF0aW19CjcyMDU3NTk0MDM3OTI3OTQgLyA3MjA1NzU5NDAzNzkyNzkzNgpcZW5ke3ZlcmJhdGltfQoKTm90ZSB0aGF0IHNpbmNlIHdlIHJvdW5kZWQgdXAsIHRoaXMgaXMgYWN0dWFsbHkgYSBsaXR0bGUgYml0IGxhcmdlciB0aGFuCjEvMTA7IGlmIHdlIGhhZCBub3Qgcm91bmRlZCB1cCwgdGhlIHF1b3RpZW50IHdvdWxkIGhhdmUgYmVlbiBhIGxpdHRsZQpiaXQgc21hbGxlciB0aGFuIDEvMTAuICBCdXQgaW4gbm8gY2FzZSBjYW4gaXQgYmUgXGVtcGh7ZXhhY3RseX0gMS8xMCEKClNvIHRoZSBjb21wdXRlciBuZXZlciBgYHNlZXMnJyAxLzEwOiAgd2hhdCBpdCBzZWVzIGlzIHRoZSBleGFjdApmcmFjdGlvbiBnaXZlbiBhYm92ZSwgdGhlIGJlc3QgNzU0IGRvdWJsZSBhcHByb3hpbWF0aW9uIGl0IGNhbiBnZXQ6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiAuMSAqIDJMKio1Ngo3MjA1NzU5NDAzNzkyNzk0LjAKXGVuZHt2ZXJiYXRpbX0KCklmIHdlIG11bHRpcGx5IHRoYXQgZnJhY3Rpb24gYnkgMTAqKjMwLCB3ZSBjYW4gc2VlIHRoZSAodHJ1bmNhdGVkKQp2YWx1ZSBvZiBpdHMgMzAgbW9zdCBzaWduaWZpY2FudCBkZWNpbWFsIGRpZ2l0czoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IDcyMDU3NTk0MDM3OTI3OTRMICogMTBMKiozMCAvIDJMKio1NgoxMDAwMDAwMDAwMDAwMDAwMDU1NTExMTUxMjMxMjVMClxlbmR7dmVyYmF0aW19CgptZWFuaW5nIHRoYXQgdGhlIGV4YWN0IG51bWJlciBzdG9yZWQgaW4gdGhlIGNvbXB1dGVyIGlzIGFwcHJveGltYXRlbHkKZXF1YWwgdG8gdGhlIGRlY2ltYWwgdmFsdWUgMC4xMDAwMDAwMDAwMDAwMDAwMDU1NTExMTUxMjMxMjUuICBSb3VuZGluZwp0aGF0IHRvIDE3IHNpZ25pZmljYW50IGRpZ2l0cyBnaXZlcyB0aGUgMC4xMDAwMDAwMDAwMDAwMDAwMSB0aGF0IFB5dGhvbgpkaXNwbGF5cyAod2VsbCwgd2lsbCBkaXNwbGF5IG9uIGFueSA3NTQtY29uZm9ybWluZyBwbGF0Zm9ybSB0aGF0IGRvZXMKYmVzdC1wb3NzaWJsZSBpbnB1dCBhbmQgb3V0cHV0IGNvbnZlcnNpb25zIGluIGl0cyBDIGxpYnJhcnkgLS0tIHlvdXJzIG1heQpub3QhKS4KClxjaGFwdGVye0hpc3RvcnkgYW5kIExpY2Vuc2V9ClxpbnB1dHtsaWNlbnNlfQoKXGlucHV0e2dsb3NzYXJ5fQoKXGlucHV0e3R1dC5pbmR9CgpcZW5ke2RvY3VtZW50fQo=