XGNoYXB0ZXJ7R3JhcGhpY2FsIFVzZXIgSW50ZXJmYWNlcyB3aXRoIFRrIFxsYWJlbHt0a2ludGVyfX0KClxpbmRleHtHVUl9ClxpbmRleHtHcmFwaGljYWwgVXNlciBJbnRlcmZhY2V9ClxpbmRleHtUa2ludGVyfQpcaW5kZXh7VGt9CgpUay9UY2wgaGFzIGxvbmcgYmVlbiBhbiBpbnRlZ3JhbCBwYXJ0IG9mIFB5dGhvbi4gIEl0IHByb3ZpZGVzIGEgcm9idXN0CmFuZCBwbGF0Zm9ybSBpbmRlcGVuZGVudCB3aW5kb3dpbmcgdG9vbGtpdCwgdGhhdCBpcyBhdmFpbGFibGUgdG8KUHl0aG9uIHByb2dyYW1tZXJzIHVzaW5nIHRoZSBccmVmbW9kdWxle1RraW50ZXJ9IG1vZHVsZSwgYW5kIGl0cwpleHRlbnNpb24sIHRoZSBccmVmbW9kdWxle1RpeH0gbW9kdWxlLgoKVGhlIFxyZWZtb2R1bGV7VGtpbnRlcn0gbW9kdWxlIGlzIGEgdGhpbiBvYmplY3Qtb3JpZW50ZWQgbGF5ZXIgb24gdG9wIG9mClRjbC9Uay4gVG8gdXNlIFxyZWZtb2R1bGV7VGtpbnRlcn0sIHlvdSBkb24ndCBuZWVkIHRvIHdyaXRlIFRjbCBjb2RlLApidXQgeW91IHdpbGwgbmVlZCB0byBjb25zdWx0IHRoZSBUayBkb2N1bWVudGF0aW9uLCBhbmQgb2NjYXNpb25hbGx5CnRoZSBUY2wgZG9jdW1lbnRhdGlvbi4gIFxyZWZtb2R1bGV7VGtpbnRlcn0gaXMgYSBzZXQgb2Ygd3JhcHBlcnMgdGhhdAppbXBsZW1lbnQgdGhlIFRrIHdpZGdldHMgYXMgUHl0aG9uIGNsYXNzZXMuICBJbiBhZGRpdGlvbiwgdGhlIGludGVybmFsCm1vZHVsZSBcbW9kdWxle1xfdGtpbnRlcn0gcHJvdmlkZXMgYSB0aHJlYWRzYWZlIG1lY2hhbmlzbSB3aGljaCBhbGxvd3MKUHl0aG9uIGFuZCBUY2wgdG8gaW50ZXJhY3QuCgpUayBpcyBub3QgdGhlIG9ubHkgR1VJIGZvciBQeXRob247IHNlZQpzZWN0aW9uflxyZWZ7b3RoZXItZ3VpLXBhY2thZ2VzfSwgYGBPdGhlciBVc2VyIEludGVyZmFjZSBNb2R1bGVzIGFuZApQYWNrYWdlcywnJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBvdGhlciBHVUkgdG9vbGtpdHMgZm9yIFB5dGhvbi4KCiUgT3RoZXIgc2VjdGlvbnMgSSBoYXZlIGluIG1pbmQgYXJlCiUgVGtpbnRlciBpbnRlcm5hbHMKJSBGcmVlemluZyBUa2ludGVyIGFwcGxpY2F0aW9ucwoKXGxvY2FsbW9kdWxldGFibGUKCgpcc2VjdGlvbntcbW9kdWxle1RraW50ZXJ9IC0tLQogICAgICAgICBQeXRob24gaW50ZXJmYWNlIHRvIFRjbC9Ua30KClxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtUa2ludGVyfQpcbW9kdWxlc3lub3BzaXN7SW50ZXJmYWNlIHRvIFRjbC9UayBmb3IgZ3JhcGhpY2FsIHVzZXIgaW50ZXJmYWNlc30KXG1vZHVsZWF1dGhvcntHdWlkbyB2YW4gUm9zc3VtfXtndWlkb0BQeXRob24ub3JnfQoKVGhlIFxtb2R1bGV7VGtpbnRlcn0gbW9kdWxlIChgYFRrIGludGVyZmFjZScnKSBpcyB0aGUgc3RhbmRhcmQgUHl0aG9uCmludGVyZmFjZSB0byB0aGUgVGsgR1VJIHRvb2xraXQuICBCb3RoIFRrIGFuZCBcbW9kdWxle1RraW50ZXJ9IGFyZQphdmFpbGFibGUgb24gbW9zdCBcVU5JWHt9IHBsYXRmb3JtcywgYXMgd2VsbCBhcyBvbiBXaW5kb3dzIGFuZApNYWNpbnRvc2ggc3lzdGVtcy4gIChUayBpdHNlbGYgaXMgbm90IHBhcnQgb2YgUHl0aG9uOyBpdCBpcyBtYWludGFpbmVkCmF0IEFjdGl2ZVN0YXRlLikKClxiZWdpbntzZWVhbHNvfQpcc2VldGl0bGVbaHR0cDovL3d3dy5weXRob24ub3JnL3RvcGljcy90a2ludGVyL10KICAgICAgICAge1B5dGhvbiBUa2ludGVyIFJlc291cmNlc30KICAgICAgICAge1RoZSBQeXRob24gVGtpbnRlciBUb3BpYyBHdWlkZSBwcm92aWRlcyBhIGdyZWF0CiAgICAgICAgICAgIGRlYWwgb2YgaW5mb3JtYXRpb24gb24gdXNpbmcgVGsgZnJvbSBQeXRob24gYW5kIGxpbmtzIHRvCiAgICAgICAgICAgIG90aGVyIHNvdXJjZXMgb2YgaW5mb3JtYXRpb24gb24gVGsufQoKXHNlZXRpdGxlW2h0dHA6Ly93d3cucHl0aG9ud2FyZS5jb20vbGlicmFyeS9hbi1pbnRyb2R1Y3Rpb24tdG8tdGtpbnRlci5odG1dCiAgICAgICAgIHtBbiBJbnRyb2R1Y3Rpb24gdG8gVGtpbnRlcn0KICAgICAgICAge0ZyZWRyaWsgTHVuZGgncyBvbi1saW5lIHJlZmVyZW5jZSBtYXRlcmlhbC59Cgpcc2VldGl0bGVbaHR0cDovL3d3dy5ubXQuZWR1L3RjYy9oZWxwL3B1YnMvbGFuZy5odG1sXQogICAgICAgICB7VGtpbnRlciByZWZlcmVuY2U6IGEgR1VJIGZvciBQeXRob259CiAgICAgICAgIHtPbi1saW5lIHJlZmVyZW5jZSBtYXRlcmlhbC59CiAgICAgICAgClxzZWV0aXRsZVtodHRwOi8vanRraW50ZXIuc291cmNlZm9yZ2UubmV0XQogICAgICAgICB7VGtpbnRlciBmb3IgSlB5dGhvbn0KICAgICAgICAge1RoZSBKeXRob24gaW50ZXJmYWNlIHRvIFRraW50ZXIufQoKXHNlZXRpdGxlW2h0dHA6Ly93d3cuYW1hem9uLmNvbS9leGVjL29iaWRvcy9BU0lOLzE4ODQ3Nzc4MTNdCiAgICAgICAgIHtQeXRob24gYW5kIFRraW50ZXIgUHJvZ3JhbW1pbmd9CiAgICAgICAgIHtUaGUgYm9vayBieSBKb2huIEdyYXlzb24gKElTQk4gMS04ODQ3NzctODEtMykufQpcZW5ke3NlZWFsc299CgoKXHN1YnNlY3Rpb257VGtpbnRlciBNb2R1bGVzfQoKTW9zdCBvZiB0aGUgdGltZSwgdGhlIFxyZWZtb2R1bGV7VGtpbnRlcn0gbW9kdWxlIGlzIGFsbCB5b3UgcmVhbGx5Cm5lZWQsIGJ1dCBhIG51bWJlciBvZiBhZGRpdGlvbmFsIG1vZHVsZXMgYXJlIGF2YWlsYWJsZSBhcyB3ZWxsLiAgVGhlClRrIGludGVyZmFjZSBpcyBsb2NhdGVkIGluIGEgYmluYXJ5IG1vZHVsZSBuYW1lZCBcbW9kdWxle190a2ludGVyfS4KVGhpcyBtb2R1bGUgY29udGFpbnMgdGhlIGxvdy1sZXZlbCBpbnRlcmZhY2UgdG8gVGssIGFuZCBzaG91bGQgbmV2ZXIKYmUgdXNlZCBkaXJlY3RseSBieSBhcHBsaWNhdGlvbiBwcm9ncmFtbWVycy4gSXQgaXMgdXN1YWxseSBhIHNoYXJlZApsaWJyYXJ5IChvciBETEwpLCBidXQgbWlnaHQgaW4gc29tZSBjYXNlcyBiZSBzdGF0aWNhbGx5IGxpbmtlZCB3aXRoCnRoZSBQeXRob24gaW50ZXJwcmV0ZXIuCgpJbiBhZGRpdGlvbiB0byB0aGUgVGsgaW50ZXJmYWNlIG1vZHVsZSwgXHJlZm1vZHVsZXtUa2ludGVyfSBpbmNsdWRlcyBhCm51bWJlciBvZiBQeXRob24gbW9kdWxlcy4gVGhlIHR3byBtb3N0IGltcG9ydGFudCBtb2R1bGVzIGFyZSB0aGUKXHJlZm1vZHVsZXtUa2ludGVyfSBtb2R1bGUgaXRzZWxmLCBhbmQgYSBtb2R1bGUgY2FsbGVkClxtb2R1bGV7VGtjb25zdGFudHN9LiBUaGUgZm9ybWVyIGF1dG9tYXRpY2FsbHkgaW1wb3J0cyB0aGUgbGF0dGVyLCBzbwp0byB1c2UgVGtpbnRlciwgYWxsIHlvdSBuZWVkIHRvIGRvIGlzIHRvIGltcG9ydCBvbmUgbW9kdWxlOgoKXGJlZ2lue3ZlcmJhdGltfQppbXBvcnQgVGtpbnRlcgpcZW5ke3ZlcmJhdGltfQoKT3IsIG1vcmUgb2Z0ZW46CgpcYmVnaW57dmVyYmF0aW19CmZyb20gVGtpbnRlciBpbXBvcnQgKgpcZW5ke3ZlcmJhdGltfQoKXGJlZ2lue2NsYXNzZGVzY317VGt9e3NjcmVlbk5hbWU9Tm9uZSwgYmFzZU5hbWU9Tm9uZSwgY2xhc3NOYW1lPSdUaycsIHVzZVRrPTF9ClRoZSBcY2xhc3N7VGt9IGNsYXNzIGlzIGluc3RhbnRpYXRlZCB3aXRob3V0IGFyZ3VtZW50cy4KVGhpcyBjcmVhdGVzIGEgdG9wbGV2ZWwgd2lkZ2V0IG9mIFRrIHdoaWNoIHVzdWFsbHkgaXMgdGhlIG1haW4gd2luZG93Cm9mIGFuIGFwcGxpY2F0aW9uLiBFYWNoIGluc3RhbmNlIGhhcyBpdHMgb3duIGFzc29jaWF0ZWQgVGNsIGludGVycHJldGVyLgolIEZJWE1FOiBUaGUgZm9sbG93aW5nIGtleXdvcmQgYXJndW1lbnRzIGFyZSBjdXJyZW50bHkgcmVjb2duaXplZDoKXHZlcnNpb25jaGFuZ2VkW1RoZSBcdmFye3VzZVRrfSBwYXJhbWV0ZXIgd2FzIGFkZGVkXXsyLjR9ClxlbmR7Y2xhc3NkZXNjfQoKXGJlZ2lue2Z1bmNkZXNjfXtUY2x9e3NjcmVlbk5hbWU9Tm9uZSwgYmFzZU5hbWU9Tm9uZSwgY2xhc3NOYW1lPSdUaycsIHVzZVRrPTB9ClRoZSBcZnVuY3Rpb257VGNsfSBmdW5jdGlvbiBpcyBhIGZhY3RvcnkgZnVuY3Rpb24gd2hpY2ggY3JlYXRlcyBhbgpvYmplY3QgbXVjaCBsaWtlIHRoYXQgY3JlYXRlZCBieSB0aGUgXGNsYXNze1RrfSBjbGFzcywgZXhjZXB0IHRoYXQgaXQKZG9lcyBub3QgaW5pdGlhbGl6ZSB0aGUgVGsgc3Vic3lzdGVtLiAgVGhpcyBpcyBtb3N0IG9mdGVuIHVzZWZ1bCB3aGVuCmRyaXZpbmcgdGhlIFRjbCBpbnRlcnByZXRlciBpbiBhbiBlbnZpcm9ubWVudCB3aGVyZSBvbmUgZG9lc24ndCB3YW50CnRvIGNyZWF0ZSBleHRyYW5lb3VzIHRvcGxldmVsIHdpbmRvd3MsIG9yIHdoZXJlIG9uZSBjYW5ub3QgKHN1Y2ggYXMKXFVOSVgvTGludXggc3lzdGVtcyB3aXRob3V0IGFuIFggc2VydmVyKS4gIEFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZQpcZnVuY3Rpb257VGNsfSBvYmplY3QgY2FuIGhhdmUgYSBUb3BsZXZlbCB3aW5kb3cgY3JlYXRlZCAoYW5kIHRoZSBUawpzdWJzeXN0ZW0gaW5pdGlhbGl6ZWQpIGJ5IGNhbGxpbmcgaXRzIFxtZXRob2R7bG9hZHRrfSBtZXRob2QuClx2ZXJzaW9uYWRkZWR7Mi40fQpcZW5ke2Z1bmNkZXNjfQoKT3RoZXIgbW9kdWxlcyB0aGF0IHByb3ZpZGUgVGsgc3VwcG9ydCBpbmNsdWRlOgoKXGJlZ2lue2Rlc2NyaXB0aW9ufQolIFxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtUa2NvbnN0YW50c30KJSBcbW9kdWxlc3lub3BzaXN7Q29uc3RhbnRzIHVzZWQgYnkgVGtpbnRlcn0KJSBGSVhNRSAKClxpdGVtW1xyZWZtb2R1bGV7U2Nyb2xsZWRUZXh0fV0KVGV4dCB3aWRnZXQgd2l0aCBhIHZlcnRpY2FsIHNjcm9sbCBiYXIgYnVpbHQgaW4uCgpcaXRlbVtcbW9kdWxle3RrQ29sb3JDaG9vc2VyfV0KRGlhbG9nIHRvIGxldCB0aGUgdXNlciBjaG9vc2UgYSBjb2xvci4KClxpdGVtW1xtb2R1bGV7dGtDb21tb25EaWFsb2d9XQpCYXNlIGNsYXNzIGZvciB0aGUgZGlhbG9ncyBkZWZpbmVkIGluIHRoZSBvdGhlciBtb2R1bGVzIGxpc3RlZCBoZXJlLgoKXGl0ZW1bXG1vZHVsZXt0a0ZpbGVEaWFsb2d9XQpDb21tb24gZGlhbG9ncyB0byBhbGxvdyB0aGUgdXNlciB0byBzcGVjaWZ5IGEgZmlsZSB0byBvcGVuIG9yIHNhdmUuCgpcaXRlbVtcbW9kdWxle3RrRm9udH1dClV0aWxpdGllcyB0byBoZWxwIHdvcmsgd2l0aCBmb250cy4KClxpdGVtW1xtb2R1bGV7dGtNZXNzYWdlQm94fV0KQWNjZXNzIHRvIHN0YW5kYXJkIFRrIGRpYWxvZyBib3hlcy4KClxpdGVtW1xtb2R1bGV7dGtTaW1wbGVEaWFsb2d9XQpCYXNpYyBkaWFsb2dzIGFuZCBjb252ZW5pZW5jZSBmdW5jdGlvbnMuCgpcaXRlbVtcbW9kdWxle1RrZG5kfV0KRHJhZy1hbmQtZHJvcCBzdXBwb3J0IGZvciBccmVmbW9kdWxle1RraW50ZXJ9LgpUaGlzIGlzIGV4cGVyaW1lbnRhbCBhbmQgc2hvdWxkIGJlY29tZSBkZXByZWNhdGVkIHdoZW4gaXQgaXMgcmVwbGFjZWQgCndpdGggdGhlIFRrIERORC4KClxpdGVtW1xyZWZtb2R1bGV7dHVydGxlfV0KVHVydGxlIGdyYXBoaWNzIGluIGEgVGsgd2luZG93LgoKXGVuZHtkZXNjcmlwdGlvbn0KClxzdWJzZWN0aW9ue1RraW50ZXIgTGlmZSBQcmVzZXJ2ZXJ9ClxzZWN0aW9uYXV0aG9ye01hdHQgQ29ud2F5fXt9CiUgQ29udmVydGVkIHRvIExhVGVYIGJ5IE1pa2UgQ2xhcmtzb24uCgpUaGlzIHNlY3Rpb24gaXMgbm90IGRlc2lnbmVkIHRvIGJlIGFuIGV4aGF1c3RpdmUgdHV0b3JpYWwgb24gZWl0aGVyClRrIG9yIFRraW50ZXIuICBSYXRoZXIsIGl0IGlzIGludGVuZGVkIGFzIGEgc3RvcCBnYXAsIHByb3ZpZGluZyBzb21lCmludHJvZHVjdG9yeSBvcmllbnRhdGlvbiBvbiB0aGUgc3lzdGVtLgoKQ3JlZGl0czoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtICAgVGtpbnRlciB3YXMgd3JpdHRlbiBieSBTdGVlbiBMdW1ob2x0IGFuZCBHdWlkbyB2YW4gUm9zc3VtLgpcaXRlbSAgIFRrIHdhcyB3cml0dGVuIGJ5IEpvaG4gT3VzdGVyaG91dCB3aGlsZSBhdCBCZXJrZWxleS4KXGl0ZW0gICBUaGlzIExpZmUgUHJlc2VydmVyIHdhcyB3cml0dGVuIGJ5IE1hdHQgQ29ud2F5IGF0CnRoZSBVbml2ZXJzaXR5IG9mIFZpcmdpbmlhLgpcaXRlbSAgIFRoZSBodG1sIHJlbmRlcmluZywgYW5kIHNvbWUgbGliZXJhbCBlZGl0aW5nLCB3YXMKcHJvZHVjZWQgZnJvbSBhIEZyYW1lTWFrZXIgdmVyc2lvbiBieSBLZW4gTWFuaGVpbWVyLgpcaXRlbSAgIEZyZWRyaWsgTHVuZGggZWxhYm9yYXRlZCBhbmQgcmV2aXNlZCB0aGUgY2xhc3MgaW50ZXJmYWNlIGRlc2NyaXB0aW9ucywKdG8gZ2V0IHRoZW0gY3VycmVudCB3aXRoIFRrIDQuMi4KXGl0ZW0gIE1pa2UgQ2xhcmtzb24gY29udmVydGVkIHRoZSBkb2N1bWVudGF0aW9uIHRvIFxMYVRlWCwgYW5kIGNvbXBpbGVkIHRoZSAKVXNlciBJbnRlcmZhY2UgY2hhcHRlciBvZiB0aGUgcmVmZXJlbmNlIG1hbnVhbC4KXGVuZHtpdGVtaXplfQoKClxzdWJzdWJzZWN0aW9ue0hvdyBUbyBVc2UgVGhpcyBTZWN0aW9ufQoKVGhpcyBzZWN0aW9uIGlzIGRlc2lnbmVkIGluIHR3byBwYXJ0czogdGhlIGZpcnN0IGhhbGYgKHJvdWdobHkpIGNvdmVycwpiYWNrZ3JvdW5kIG1hdGVyaWFsLCB3aGlsZSB0aGUgc2Vjb25kIGhhbGYgY2FuIGJlIHRha2VuIHRvIHRoZQprZXlib2FyZCBhcyBhIGhhbmR5IHJlZmVyZW5jZS4KCldoZW4gdHJ5aW5nIHRvIGFuc3dlciBxdWVzdGlvbnMgb2YgdGhlIGZvcm0gYGBob3cgZG8gSSBkbyBibGFoJycsIGl0CmlzIG9mdGVuIGJlc3QgdG8gZmluZCBvdXQgaG93IHRvIGRvYGBibGFoJycgaW4gc3RyYWlnaHQgVGssIGFuZCB0aGVuCmNvbnZlcnQgdGhpcyBiYWNrIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgXHJlZm1vZHVsZXtUa2ludGVyfSBjYWxsLgpQeXRob24gcHJvZ3JhbW1lcnMgY2FuIG9mdGVuIGd1ZXNzIGF0IHRoZSBjb3JyZWN0IFB5dGhvbiBjb21tYW5kIGJ5Cmxvb2tpbmcgYXQgdGhlIFRrIGRvY3VtZW50YXRpb24uIFRoaXMgbWVhbnMgdGhhdCBpbiBvcmRlciB0byB1c2UKVGtpbnRlciwgeW91IHdpbGwgaGF2ZSB0byBrbm93IGEgbGl0dGxlIGJpdCBhYm91dCBUay4gVGhpcyBkb2N1bWVudApjYW4ndCBmdWxmaWxsIHRoYXQgcm9sZSwgc28gdGhlIGJlc3Qgd2UgY2FuIGRvIGlzIHBvaW50IHlvdSB0byB0aGUKYmVzdCBkb2N1bWVudGF0aW9uIHRoYXQgZXhpc3RzLiBIZXJlIGFyZSBzb21lIGhpbnRzOgoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtICAgVGhlIGF1dGhvcnMgc3Ryb25nbHkgc3VnZ2VzdCBnZXR0aW5nIGEgY29weSBvZiB0aGUgVGsgbWFuCnBhZ2VzLiBTcGVjaWZpY2FsbHksIHRoZSBtYW4gcGFnZXMgaW4gdGhlIFxjb2Rle21hbm59IGRpcmVjdG9yeSBhcmUgbW9zdAp1c2VmdWwuIFRoZSBcY29kZXttYW4zfSBtYW4gcGFnZXMgZGVzY3JpYmUgdGhlIEMgaW50ZXJmYWNlIHRvIHRoZSBUawpsaWJyYXJ5IGFuZCB0aHVzIGFyZSBub3QgZXNwZWNpYWxseSBoZWxwZnVsIGZvciBzY3JpcHQgd3JpdGVycy4gIAoKXGl0ZW0gICBBZGRpc29uLVdlc2xleSBwdWJsaXNoZXMgYSBib29rIGNhbGxlZCBcY2l0ZXRpdGxle1RjbCBhbmQgdGhlClRrIFRvb2xraXR9IGJ5IEpvaG4gT3VzdGVyaG91dCAoSVNCTiAwLTIwMS02MzMzNy1YKSB3aGljaCBpcyBhIGdvb2QKaW50cm9kdWN0aW9uIHRvIFRjbCBhbmQgVGsgZm9yIHRoZSBub3ZpY2UuICBUaGUgYm9vayBpcyBub3QKZXhoYXVzdGl2ZSwgYW5kIGZvciBtYW55IGRldGFpbHMgaXQgZGVmZXJzIHRvIHRoZSBtYW4gcGFnZXMuIAoKXGl0ZW0gICBcZmlsZXtUa2ludGVyLnB5fSBpcyBhIGxhc3QgcmVzb3J0IGZvciBtb3N0LCBidXQgY2FuIGJlIGEgZ29vZApwbGFjZSB0byBnbyB3aGVuIG5vdGhpbmcgZWxzZSBtYWtlcyBzZW5zZS4gIApcZW5ke2l0ZW1pemV9CgpcYmVnaW57c2VlYWxzb30KXHNlZXRpdGxlW2h0dHA6Ly90Y2wuYWN0aXZlc3RhdGUuY29tL10KICAgICAgICB7QWN0aXZlU3RhdGUgVGNsIEhvbWUgUGFnZX0KICAgICAgICB7VGhlIFRrL1RjbCBkZXZlbG9wbWVudCBpcyBsYXJnZWx5IHRha2luZyBwbGFjZSBhdAogICAgICAgICBBY3RpdmVTdGF0ZS59ClxzZWV0aXRsZVtodHRwOi8vd3d3LmFtYXpvbi5jb20vZXhlYy9vYmlkb3MvQVNJTi8wMjAxNjMzMzdYXQogICAgICAgIHtUY2wgYW5kIHRoZSBUayBUb29sa2l0fQogICAgICAgIHtUaGUgYm9vayBieSBKb2huIE91c3RlcmhvdXQsIHRoZSBpbnZlbnRvciBvZiBUY2wgLn0KXHNlZXRpdGxlW2h0dHA6Ly93d3cuYW1hem9uLmNvbS9leGVjL29iaWRvcy9BU0lOLzAxMzAyMjAyODBdCiAgICAgICAge1ByYWN0aWNhbCBQcm9ncmFtbWluZyBpbiBUY2wgYW5kIFRrfQogICAgICAgIHtCcmVudCBXZWxjaCdzIGVuY3ljbG9wZWRpYyBib29rLn0KXGVuZHtzZWVhbHNvfQoKClxzdWJzdWJzZWN0aW9ue0EgU2ltcGxlIEhlbGxvIFdvcmxkIFByb2dyYW19ICUgSGVsbG9Xb3JsZC5odG1sCgolYmVnaW57bGF0ZXhvbmx5fQolXGJlZ2lue2ZpZ3VyZX1baGJ0cF0KJVxjZW50ZXJsaW5le1xlcHNmaWd7ZmlsZT1IZWxsb1dvcmxkLmdpZix3aWR0aD0uOVx0ZXh0d2lkdGh9fQolXHZzcGFjZXsuNWNtfQolXGNhcHRpb257SGVsbG9Xb3JsZCBnYWRnZXQgaW1hZ2V9CiVcZW5ke2ZpZ3VyZX0KJVNlZSBhbHNvIHRoZSBoZWxsby13b3JsZCBcdWxpbmt7bm90ZXN9e2NsYXNzZXMvSGVsbG9Xb3JsZC1ub3Rlcy5odG1sfSBhbmQKJVx1bGlua3tzdW1tYXJ5fXtjbGFzc2VzL0hlbGxvV29ybGQtc3VtbWFyeS5odG1sfS4KJWVuZHtsYXRleG9ubHl9CgoKXGJlZ2lue3ZlcmJhdGltfQpmcm9tIFRraW50ZXIgaW1wb3J0ICoKCmNsYXNzIEFwcGxpY2F0aW9uKEZyYW1lKToKICAgIGRlZiBzYXlfaGkoc2VsZik6CiAgICAgICAgcHJpbnQgImhpIHRoZXJlLCBldmVyeW9uZSEiCgogICAgZGVmIGNyZWF0ZVdpZGdldHMoc2VsZik6CiAgICAgICAgc2VsZi5RVUlUID0gQnV0dG9uKHNlbGYpCiAgICAgICAgc2VsZi5RVUlUWyJ0ZXh0Il0gPSAiUVVJVCIKICAgICAgICBzZWxmLlFVSVRbImZnIl0gICA9ICJyZWQiCiAgICAgICAgc2VsZi5RVUlUWyJjb21tYW5kIl0gPSAgc2VsZi5xdWl0CgogICAgICAgIHNlbGYuUVVJVC5wYWNrKHsic2lkZSI6ICJsZWZ0In0pCgogICAgICAgIHNlbGYuaGlfdGhlcmUgPSBCdXR0b24oc2VsZikKICAgICAgICBzZWxmLmhpX3RoZXJlWyJ0ZXh0Il0gPSAiSGVsbG8iLAogICAgICAgIHNlbGYuaGlfdGhlcmVbImNvbW1hbmQiXSA9IHNlbGYuc2F5X2hpCgogICAgICAgIHNlbGYuaGlfdGhlcmUucGFjayh7InNpZGUiOiAibGVmdCJ9KQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSk6CiAgICAgICAgRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyKQogICAgICAgIHNlbGYucGFjaygpCiAgICAgICAgc2VsZi5jcmVhdGVXaWRnZXRzKCkKCnJvb3QgPSBUaygpCmFwcCA9IEFwcGxpY2F0aW9uKG1hc3Rlcj1yb290KQphcHAubWFpbmxvb3AoKQpyb290LmRlc3Ryb3koKQpcZW5ke3ZlcmJhdGltfQoKClxzdWJzZWN0aW9ue0EgKFZlcnkpIFF1aWNrIExvb2sgYXQgVGNsL1RrfSAlIEJyaWVmVGNsVGsuaHRtbAoKVGhlIGNsYXNzIGhpZXJhcmNoeSBsb29rcyBjb21wbGljYXRlZCwgYnV0IGluIGFjdHVhbCBwcmFjdGljZSwKYXBwbGljYXRpb24gcHJvZ3JhbW1lcnMgYWxtb3N0IGFsd2F5cyByZWZlciB0byB0aGUgY2xhc3NlcyBhdCB0aGUgdmVyeQpib3R0b20gb2YgdGhlIGhpZXJhcmNoeS4gCgpOb3RlczoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtICAgVGhlc2UgY2xhc3NlcyBhcmUgcHJvdmlkZWQgZm9yIHRoZSBwdXJwb3NlcyBvZgpvcmdhbml6aW5nIGNlcnRhaW4gZnVuY3Rpb25zIHVuZGVyIG9uZSBuYW1lc3BhY2UuIFRoZXkgYXJlbid0IG1lYW50IHRvCmJlIGluc3RhbnRpYXRlZCBpbmRlcGVuZGVudGx5LgoKXGl0ZW0gICAgVGhlIFxjbGFzc3tUa30gY2xhc3MgaXMgbWVhbnQgdG8gYmUgaW5zdGFudGlhdGVkIG9ubHkgb25jZSBpbgphbiBhcHBsaWNhdGlvbi4gQXBwbGljYXRpb24gcHJvZ3JhbW1lcnMgbmVlZCBub3QgaW5zdGFudGlhdGUgb25lCmV4cGxpY2l0bHksIHRoZSBzeXN0ZW0gY3JlYXRlcyBvbmUgd2hlbmV2ZXIgYW55IG9mIHRoZSBvdGhlciBjbGFzc2VzCmFyZSBpbnN0YW50aWF0ZWQuCgpcaXRlbSAgICBUaGUgXGNsYXNze1dpZGdldH0gY2xhc3MgaXMgbm90IG1lYW50IHRvIGJlIGluc3RhbnRpYXRlZCwgaXQKaXMgbWVhbnQgb25seSBmb3Igc3ViY2xhc3NpbmcgdG8gbWFrZSBgYHJlYWwnJyB3aWRnZXRzIChpbiBcQ3BwLCB0aGlzCmlzIGNhbGxlZCBhbiBgYWJzdHJhY3QgY2xhc3MnKS4KXGVuZHtpdGVtaXplfQoKVG8gbWFrZSB1c2Ugb2YgdGhpcyByZWZlcmVuY2UgbWF0ZXJpYWwsIHRoZXJlIHdpbGwgYmUgdGltZXMgd2hlbiB5b3UKd2lsbCBuZWVkIHRvIGtub3cgaG93IHRvIHJlYWQgc2hvcnQgcGFzc2FnZXMgb2YgVGsgYW5kIGhvdyB0byBpZGVudGlmeQp0aGUgdmFyaW91cyBwYXJ0cyBvZiBhIFRrIGNvbW1hbmQuICAKKFNlZSBzZWN0aW9uflxyZWZ7dGtpbnRlci1iYXNpYy1tYXBwaW5nfSBmb3IgdGhlClxyZWZtb2R1bGV7VGtpbnRlcn0gZXF1aXZhbGVudHMgb2Ygd2hhdCdzIGJlbG93LikKClRrIHNjcmlwdHMgYXJlIFRjbCBwcm9ncmFtcy4gIExpa2UgYWxsIFRjbCBwcm9ncmFtcywgVGsgc2NyaXB0cyBhcmUKanVzdCBsaXN0cyBvZiB0b2tlbnMgc2VwYXJhdGVkIGJ5IHNwYWNlcy4gIEEgVGsgd2lkZ2V0IGlzIGp1c3QgaXRzClxlbXBoe2NsYXNzfSwgdGhlIFxlbXBoe29wdGlvbnN9IHRoYXQgaGVscCBjb25maWd1cmUgaXQsIGFuZCB0aGUKXGVtcGh7YWN0aW9uc30gdGhhdCBtYWtlIGl0IGRvIHVzZWZ1bCB0aGluZ3MuIAoKVG8gbWFrZSBhIHdpZGdldCBpbiBUaywgdGhlIGNvbW1hbmQgaXMgYWx3YXlzIG9mIHRoZSBmb3JtOiAKClxiZWdpbnt2ZXJiYXRpbX0KICAgICAgICAgICAgICAgIGNsYXNzQ29tbWFuZCBuZXdQYXRobmFtZSBvcHRpb25zClxlbmR7dmVyYmF0aW19CgpcYmVnaW57ZGVzY3JpcHRpb259ClxpdGVtW1x2YXJ7Y2xhc3NDb21tYW5kfV0KZGVub3RlcyB3aGljaCBraW5kIG9mIHdpZGdldCB0byBtYWtlIChhIGJ1dHRvbiwgYSBsYWJlbCwgYSBtZW51Li4uKQoKXGl0ZW1bXHZhcntuZXdQYXRobmFtZX1dCmlzIHRoZSBuZXcgbmFtZSBmb3IgdGhpcyB3aWRnZXQuICBBbGwgbmFtZXMgaW4gVGsgbXVzdCBiZSB1bmlxdWUuICBUbwpoZWxwIGVuZm9yY2UgdGhpcywgd2lkZ2V0cyBpbiBUayBhcmUgbmFtZWQgd2l0aCBcZW1waHtwYXRobmFtZXN9LCBqdXN0Cmxpa2UgZmlsZXMgaW4gYSBmaWxlIHN5c3RlbS4gIFRoZSB0b3AgbGV2ZWwgd2lkZ2V0LCB0aGUgXGVtcGh7cm9vdH0sCmlzIGNhbGxlZCBcY29kZXsufSAocGVyaW9kKSBhbmQgY2hpbGRyZW4gYXJlIGRlbGltaXRlZCBieSBtb3JlCnBlcmlvZHMuICBGb3IgZXhhbXBsZSwgXGNvZGV7Lm15QXBwLmNvbnRyb2xQYW5lbC5va0J1dHRvbn0gbWlnaHQgYmUKdGhlIG5hbWUgb2YgYSB3aWRnZXQuCgpcaXRlbVtcdmFye29wdGlvbnN9XQpjb25maWd1cmUgdGhlIHdpZGdldCdzIGFwcGVhcmFuY2UgYW5kIGluIHNvbWUgY2FzZXMsIGl0cwpiZWhhdmlvci4gIFRoZSBvcHRpb25zIGNvbWUgaW4gdGhlIGZvcm0gb2YgYSBsaXN0IG9mIGZsYWdzIGFuZCB2YWx1ZXMuCkZsYWdzIGFyZSBwcm9jZWVkZWQgYnkgYSBgLScsIGxpa2UgXFVOSVh7fSBzaGVsbCBjb21tYW5kIGZsYWdzLCBhbmQKdmFsdWVzIGFyZSBwdXQgaW4gcXVvdGVzIGlmIHRoZXkgYXJlIG1vcmUgdGhhbiBvbmUgd29yZC4KXGVuZHtkZXNjcmlwdGlvbn0KCkZvciBleGFtcGxlOiAKClxiZWdpbnt2ZXJiYXRpbX0KICAgIGJ1dHRvbiAgIC5mcmVkICAgLWZnIHJlZCAtdGV4dCAiaGkgdGhlcmUiCiAgICAgICBeICAgICAgIF4gICAgIFxfX19fX19fX19fX19fX19fX19fX18vCiAgICAgICB8ICAgICAgIHwgICAgICAgICAgICAgICAgfAogICAgIGNsYXNzICAgIG5ldyAgICAgICAgICAgIG9wdGlvbnMKICAgIGNvbW1hbmQgIHdpZGdldCAgKC1vcHQgdmFsIC1vcHQgdmFsIC4uLikKXGVuZHt2ZXJiYXRpbX0gCgpPbmNlIGNyZWF0ZWQsIHRoZSBwYXRobmFtZSB0byB0aGUgd2lkZ2V0IGJlY29tZXMgYSBuZXcgY29tbWFuZC4gIFRoaXMKbmV3IFx2YXJ7d2lkZ2V0IGNvbW1hbmR9IGlzIHRoZSBwcm9ncmFtbWVyJ3MgaGFuZGxlIGZvciBnZXR0aW5nIHRoZSBuZXcKd2lkZ2V0IHRvIHBlcmZvcm0gc29tZSBcdmFye2FjdGlvbn0uICBJbiBDLCB5b3UnZCBleHByZXNzIHRoaXMgYXMKc29tZUFjdGlvbihmcmVkLCBzb21lT3B0aW9ucyksIGluIFxDcHAsIHlvdSB3b3VsZCBleHByZXNzIHRoaXMgYXMKZnJlZC5zb21lQWN0aW9uKHNvbWVPcHRpb25zKSwgYW5kIGluIFRrLCB5b3Ugc2F5OiAKClxiZWdpbnt2ZXJiYXRpbX0KICAgIC5mcmVkIHNvbWVBY3Rpb24gc29tZU9wdGlvbnMgClxlbmR7dmVyYmF0aW19IAoKTm90ZSB0aGF0IHRoZSBvYmplY3QgbmFtZSwgXGNvZGV7LmZyZWR9LCBzdGFydHMgd2l0aCBhIGRvdC4KCkFzIHlvdSdkIGV4cGVjdCwgdGhlIGxlZ2FsIHZhbHVlcyBmb3IgXHZhcntzb21lQWN0aW9ufSB3aWxsIGRlcGVuZCBvbgp0aGUgd2lkZ2V0J3MgY2xhc3M6IFxjb2Rley5mcmVkIGRpc2FibGV9IHdvcmtzIGlmIGZyZWQgaXMgYQpidXR0b24gKGZyZWQgZ2V0cyBncmV5ZWQgb3V0KSwgYnV0IGRvZXMgbm90IHdvcmsgaWYgZnJlZCBpcyBhIGxhYmVsCihkaXNhYmxpbmcgb2YgbGFiZWxzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gVGspLiAKClRoZSBsZWdhbCB2YWx1ZXMgb2YgXHZhcntzb21lT3B0aW9uc30gaXMgYWN0aW9uIGRlcGVuZGVudC4gIFNvbWUKYWN0aW9ucywgbGlrZSBcY29kZXtkaXNhYmxlfSwgcmVxdWlyZSBubyBhcmd1bWVudHMsIG90aGVycywgbGlrZQphIHRleHQtZW50cnkgYm94J3MgXGNvZGV7ZGVsZXRlfSBjb21tYW5kLCB3b3VsZCBuZWVkIGFyZ3VtZW50cwp0byBzcGVjaWZ5IHdoYXQgcmFuZ2Ugb2YgdGV4dCB0byBkZWxldGUuICAKCgpcc3Vic2VjdGlvbntNYXBwaW5nIEJhc2ljIFRrIGludG8gVGtpbnRlcgogICAgICAgICAgICBcbGFiZWx7dGtpbnRlci1iYXNpYy1tYXBwaW5nfX0KCkNsYXNzIGNvbW1hbmRzIGluIFRrIGNvcnJlc3BvbmQgdG8gY2xhc3MgY29uc3RydWN0b3JzIGluIFRraW50ZXIuCgpcYmVnaW57dmVyYmF0aW19CiAgICBidXR0b24gLmZyZWQgICAgICAgICAgICAgICAgPT09PT0+ICBmcmVkID0gQnV0dG9uKCkKXGVuZHt2ZXJiYXRpbX0KClRoZSBtYXN0ZXIgb2YgYW4gb2JqZWN0IGlzIGltcGxpY2l0IGluIHRoZSBuZXcgbmFtZSBnaXZlbiB0byBpdCBhdApjcmVhdGlvbiB0aW1lLiAgSW4gVGtpbnRlciwgbWFzdGVycyBhcmUgc3BlY2lmaWVkIGV4cGxpY2l0bHkuCgpcYmVnaW57dmVyYmF0aW19CiAgICBidXR0b24gLnBhbmVsLmZyZWQgICAgICAgICAgPT09PT0+ICBmcmVkID0gQnV0dG9uKHBhbmVsKQpcZW5ke3ZlcmJhdGltfQoKVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbiBUayBhcmUgZ2l2ZW4gaW4gbGlzdHMgb2YgaHlwaGVuZWQgdGFncwpmb2xsb3dlZCBieSB2YWx1ZXMuICBJbiBUa2ludGVyLCBvcHRpb25zIGFyZSBzcGVjaWZpZWQgYXMKa2V5d29yZC1hcmd1bWVudHMgaW4gdGhlIGluc3RhbmNlIGNvbnN0cnVjdG9yLCBhbmQga2V5d29yZC1hcmdzIGZvcgpjb25maWd1cmUgY2FsbHMgb3IgYXMgaW5zdGFuY2UgaW5kaWNlcywgaW4gZGljdGlvbmFyeSBzdHlsZSwgZm9yCmVzdGFibGlzaGVkIGluc3RhbmNlcy4gIFNlZSBzZWN0aW9uflxyZWZ7dGtpbnRlci1zZXR0aW5nLW9wdGlvbnN9IG9uCnNldHRpbmcgb3B0aW9ucy4KClxiZWdpbnt2ZXJiYXRpbX0KICAgIGJ1dHRvbiAuZnJlZCAtZmcgcmVkICAgICAgICA9PT09PT4gIGZyZWQgPSBCdXR0b24ocGFuZWwsIGZnID0gInJlZCIpCiAgICAuZnJlZCBjb25maWd1cmUgLWZnIHJlZCAgICAgPT09PT0+ICBmcmVkWyJmZyJdID0gcmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1IgPT0+ICBmcmVkLmNvbmZpZyhmZyA9ICJyZWQiKQpcZW5ke3ZlcmJhdGltfQoKSW4gVGssIHRvIHBlcmZvcm0gYW4gYWN0aW9uIG9uIGEgd2lkZ2V0LCB1c2UgdGhlIHdpZGdldCBuYW1lIGFzIGEKY29tbWFuZCwgYW5kIGZvbGxvdyBpdCB3aXRoIGFuIGFjdGlvbiBuYW1lLCBwb3NzaWJseSB3aXRoIGFyZ3VtZW50cwoob3B0aW9ucykuICBJbiBUa2ludGVyLCB5b3UgY2FsbCBtZXRob2RzIG9uIHRoZSBjbGFzcyBpbnN0YW5jZSB0bwppbnZva2UgYWN0aW9ucyBvbiB0aGUgd2lkZ2V0LiAgVGhlIGFjdGlvbnMgKG1ldGhvZHMpIHRoYXQgYSBnaXZlbgp3aWRnZXQgY2FuIHBlcmZvcm0gYXJlIGxpc3RlZCBpbiB0aGUgVGtpbnRlci5weSBtb2R1bGUuCgpcYmVnaW57dmVyYmF0aW19CiAgICAuZnJlZCBpbnZva2UgICAgICAgICAgICAgICAgPT09PT0+ICBmcmVkLmludm9rZSgpClxlbmR7dmVyYmF0aW19CgpUbyBnaXZlIGEgd2lkZ2V0IHRvIHRoZSBwYWNrZXIgKGdlb21ldHJ5IG1hbmFnZXIpLCB5b3UgY2FsbCBwYWNrIHdpdGgKb3B0aW9uYWwgYXJndW1lbnRzLiAgSW4gVGtpbnRlciwgdGhlIFBhY2sgY2xhc3MgaG9sZHMgYWxsIHRoaXMKZnVuY3Rpb25hbGl0eSwgYW5kIHRoZSB2YXJpb3VzIGZvcm1zIG9mIHRoZSBwYWNrIGNvbW1hbmQgYXJlCmltcGxlbWVudGVkIGFzIG1ldGhvZHMuICBBbGwgd2lkZ2V0cyBpbiBccmVmbW9kdWxle1RraW50ZXJ9IGFyZQpzdWJjbGFzc2VkIGZyb20gdGhlIFBhY2tlciwgYW5kIHNvIGluaGVyaXQgYWxsIHRoZSBwYWNraW5nCm1ldGhvZHMuIFNlZSB0aGUgXHJlZm1vZHVsZXtUaXh9IG1vZHVsZSBkb2N1bWVudGF0aW9uIGZvciBhZGRpdGlvbmFsCmluZm9ybWF0aW9uIG9uIHRoZSBGb3JtIGdlb21ldHJ5IG1hbmFnZXIuCgpcYmVnaW57dmVyYmF0aW19CiAgICBwYWNrIC5mcmVkIC1zaWRlIGxlZnQgICAgICAgPT09PT0+ICBmcmVkLnBhY2soc2lkZSA9ICJsZWZ0IikKXGVuZHt2ZXJiYXRpbX0KCgpcc3Vic2VjdGlvbntIb3cgVGsgYW5kIFRraW50ZXIgYXJlIFJlbGF0ZWR9ICUgUmVsYXRpb25zaGlwLmh0bWwKClxub3Rle1RoaXMgd2FzIGRlcml2ZWQgZnJvbSBhIGdyYXBoaWNhbCBpbWFnZTsgdGhlIGltYWdlIHdpbGwgYmUgdXNlZAogICAgICBtb3JlIGRpcmVjdGx5IGluIGEgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQufQoKRnJvbSB0aGUgdG9wIGRvd246ClxiZWdpbntkZXNjcmlwdGlvbn0KXGl0ZW1bXGJ7WW91ciBBcHAgSGVyZSAoUHl0aG9uKX1dCkEgUHl0aG9uIGFwcGxpY2F0aW9uIG1ha2VzIGEgXHJlZm1vZHVsZXtUa2ludGVyfSBjYWxsLgoKXGl0ZW1bXGJ7VGtpbnRlciAoUHl0aG9uIE1vZHVsZSl9XQpUaGlzIGNhbGwgKHNheSwgZm9yIGV4YW1wbGUsIGNyZWF0aW5nIGEgYnV0dG9uIHdpZGdldCksIGlzCmltcGxlbWVudGVkIGluIHRoZSBcZW1waHtUa2ludGVyfSBtb2R1bGUsIHdoaWNoIGlzIHdyaXR0ZW4gaW4KUHl0aG9uLiAgVGhpcyBQeXRob24gZnVuY3Rpb24gd2lsbCBwYXJzZSB0aGUgY29tbWFuZHMgYW5kIHRoZQphcmd1bWVudHMgYW5kIGNvbnZlcnQgdGhlbSBpbnRvIGEgZm9ybSB0aGF0IG1ha2VzIHRoZW0gbG9vayBhcyBpZiB0aGV5CmhhZCBjb21lIGZyb20gYSBUayBzY3JpcHQgaW5zdGVhZCBvZiBhIFB5dGhvbiBzY3JpcHQuCgpcaXRlbVtcYnt0a2ludGVyIChDKX1dClRoZXNlIGNvbW1hbmRzIGFuZCB0aGVpciBhcmd1bWVudHMgd2lsbCBiZSBwYXNzZWQgdG8gYSBDIGZ1bmN0aW9uCmluIHRoZSBcZW1waHt0a2ludGVyfSAtIG5vdGUgdGhlIGxvd2VyY2FzZSAtIGV4dGVuc2lvbiBtb2R1bGUuCgpcaXRlbVtcYntUayBXaWRnZXRzfSAoQyBhbmQgVGNsKV0KVGhpcyBDIGZ1bmN0aW9uIGlzIGFibGUgdG8gbWFrZSBjYWxscyBpbnRvIG90aGVyIEMgbW9kdWxlcywKaW5jbHVkaW5nIHRoZSBDIGZ1bmN0aW9ucyB0aGF0IG1ha2UgdXAgdGhlIFRrIGxpYnJhcnkuICBUayBpcwppbXBsZW1lbnRlZCBpbiBDIGFuZCBzb21lIFRjbC4gIFRoZSBUY2wgcGFydCBvZiB0aGUgVGsgd2lkZ2V0cyBpcyB1c2VkCnRvIGJpbmQgY2VydGFpbiBkZWZhdWx0IGJlaGF2aW9ycyB0byB3aWRnZXRzLCBhbmQgaXMgZXhlY3V0ZWQgb25jZSBhdAp0aGUgcG9pbnQgd2hlcmUgdGhlIFB5dGhvbiBccmVmbW9kdWxle1RraW50ZXJ9IG1vZHVsZSBpcwppbXBvcnRlZC4gKFRoZSB1c2VyIG5ldmVyIHNlZXMgdGhpcyBzdGFnZSkuCgpcaXRlbVtcYntUayAoQyl9XQpUaGUgVGsgcGFydCBvZiB0aGUgVGsgV2lkZ2V0cyBpbXBsZW1lbnQgdGhlIGZpbmFsIG1hcHBpbmcgdG8gLi4uCgpcaXRlbVtcYntYbGliIChDKX1dCnRoZSBYbGliIGxpYnJhcnkgdG8gZHJhdyBncmFwaGljcyBvbiB0aGUgc2NyZWVuLgpcZW5ke2Rlc2NyaXB0aW9ufQoKClxzdWJzZWN0aW9ue0hhbmR5IFJlZmVyZW5jZX0KClxzdWJzdWJzZWN0aW9ue1NldHRpbmcgT3B0aW9ucwogICAgICAgICAgICAgICBcbGFiZWx7dGtpbnRlci1zZXR0aW5nLW9wdGlvbnN9fQoKT3B0aW9ucyBjb250cm9sIHRoaW5ncyBsaWtlIHRoZSBjb2xvciBhbmQgYm9yZGVyIHdpZHRoIG9mIGEgd2lkZ2V0LgpPcHRpb25zIGNhbiBiZSBzZXQgaW4gdGhyZWUgd2F5czoKClxiZWdpbntkZXNjcmlwdGlvbn0KXGl0ZW1bQXQgb2JqZWN0IGNyZWF0aW9uIHRpbWUsIHVzaW5nIGtleXdvcmQgYXJndW1lbnRzXToKXGJlZ2lue3ZlcmJhdGltfQpmcmVkID0gQnV0dG9uKHNlbGYsIGZnID0gInJlZCIsIGJnID0gImJsdWUiKQpcZW5ke3ZlcmJhdGltfQpcaXRlbVtBZnRlciBvYmplY3QgY3JlYXRpb24sIHRyZWF0aW5nIHRoZSBvcHRpb24gbmFtZSBsaWtlIGEgZGljdGlvbmFyeSBpbmRleF06ClxiZWdpbnt2ZXJiYXRpbX0KZnJlZFsiZmciXSA9ICJyZWQiCmZyZWRbImJnIl0gPSAiYmx1ZSIKXGVuZHt2ZXJiYXRpbX0KXGl0ZW1bVXNlIHRoZSBjb25maWcoKSBtZXRob2QgdG8gdXBkYXRlIG11bHRpcGxlIGF0dHJzIHN1YnNlcXVlbnQgdG8Kb2JqZWN0IGNyZWF0aW9uXToKXGJlZ2lue3ZlcmJhdGltfQpmcmVkLmNvbmZpZyhmZyA9ICJyZWQiLCBiZyA9ICJibHVlIikKXGVuZHt2ZXJiYXRpbX0KXGVuZHtkZXNjcmlwdGlvbn0KCkZvciBhIGNvbXBsZXRlIGV4cGxhbmF0aW9uIG9mIGEgZ2l2ZW4gb3B0aW9uIGFuZCBpdHMgYmVoYXZpb3IsIHNlZSB0aGUKVGsgbWFuIHBhZ2VzIGZvciB0aGUgd2lkZ2V0IGluIHF1ZXN0aW9uLgoKTm90ZSB0aGF0IHRoZSBtYW4gcGFnZXMgbGlzdCAiU1RBTkRBUkQgT1BUSU9OUyIgYW5kICJXSURHRVQgU1BFQ0lGSUMKT1BUSU9OUyIgZm9yIGVhY2ggd2lkZ2V0LiAgVGhlIGZvcm1lciBpcyBhIGxpc3Qgb2Ygb3B0aW9ucyB0aGF0IGFyZQpjb21tb24gdG8gbWFueSB3aWRnZXRzLCB0aGUgbGF0dGVyIGFyZSB0aGUgb3B0aW9ucyB0aGF0IGFyZQppZGlvc3luY3JhdGljIHRvIHRoYXQgcGFydGljdWxhciB3aWRnZXQuICBUaGUgU3RhbmRhcmQgT3B0aW9ucyBhcmUKZG9jdW1lbnRlZCBvbiB0aGUgXG1hbnBhZ2V7b3B0aW9uc317M30gbWFuIHBhZ2UuCgpObyBkaXN0aW5jdGlvbiBiZXR3ZWVuIHN0YW5kYXJkIGFuZCB3aWRnZXQtc3BlY2lmaWMgb3B0aW9ucyBpcyBtYWRlIGluCnRoaXMgZG9jdW1lbnQuICBTb21lIG9wdGlvbnMgZG9uJ3QgYXBwbHkgdG8gc29tZSBraW5kcyBvZiB3aWRnZXRzLgpXaGV0aGVyIGEgZ2l2ZW4gd2lkZ2V0IHJlc3BvbmRzIHRvIGEgcGFydGljdWxhciBvcHRpb24gZGVwZW5kcyBvbiB0aGUKY2xhc3Mgb2YgdGhlIHdpZGdldDsgYnV0dG9ucyBoYXZlIGEgXGNvZGV7Y29tbWFuZH0gb3B0aW9uLCBsYWJlbHMgZG8gbm90LiAKClRoZSBvcHRpb25zIHN1cHBvcnRlZCBieSBhIGdpdmVuIHdpZGdldCBhcmUgbGlzdGVkIGluIHRoYXQgd2lkZ2V0J3MKbWFuIHBhZ2UsIG9yIGNhbiBiZSBxdWVyaWVkIGF0IHJ1bnRpbWUgYnkgY2FsbGluZyB0aGUKXG1ldGhvZHtjb25maWcoKX0gbWV0aG9kIHdpdGhvdXQgYXJndW1lbnRzLCBvciBieSBjYWxsaW5nIHRoZQpcbWV0aG9ke2tleXMoKX0gbWV0aG9kIG9uIHRoYXQgd2lkZ2V0LiAgVGhlIHJldHVybiB2YWx1ZSBvZiB0aGVzZQpjYWxscyBpcyBhIGRpY3Rpb25hcnkgd2hvc2Uga2V5IGlzIHRoZSBuYW1lIG9mIHRoZSBvcHRpb24gYXMgYSBzdHJpbmcKKGZvciBleGFtcGxlLCBcY29kZXsncmVsaWVmJ30pIGFuZCB3aG9zZSB2YWx1ZXMgYXJlIDUtdHVwbGVzLgoKU29tZSBvcHRpb25zLCBsaWtlIFxjb2Rle2JnfSBhcmUgc3lub255bXMgZm9yIGNvbW1vbiBvcHRpb25zIHdpdGggbG9uZwpuYW1lcyAoXGNvZGV7Ymd9IGlzIHNob3J0aGFuZCBmb3IgImJhY2tncm91bmQiKS4gUGFzc2luZyB0aGUKXGNvZGV7Y29uZmlnKCl9IG1ldGhvZCB0aGUgbmFtZSBvZiBhIHNob3J0aGFuZCBvcHRpb24gd2lsbCByZXR1cm4gYQoyLXR1cGxlLCBub3QgNS10dXBsZS4gVGhlIDItdHVwbGUgcGFzc2VkIGJhY2sgd2lsbCBjb250YWluIHRoZSBuYW1lIG9mCnRoZSBzeW5vbnltIGFuZCB0aGUgYGByZWFsJycgb3B0aW9uIChzdWNoIGFzIFxjb2RleygnYmcnLAonYmFja2dyb3VuZCcpfSkuCgpcYmVnaW57dGFibGVpaWl9e2N8bHxsfXt0ZXh0cm19e0luZGV4fXtNZWFuaW5nfXtFeGFtcGxlfQogIFxsaW5laWlpezB9e29wdGlvbiBuYW1lfSAgICAgICAgICAgICAgICAgICAgICAge1xjb2RleydyZWxpZWYnfX0KICBcbGluZWlpaXsxfXtvcHRpb24gbmFtZSBmb3IgZGF0YWJhc2UgbG9va3VwfSAgIHtcY29kZXsncmVsaWVmJ319CiAgXGxpbmVpaWl7Mn17b3B0aW9uIGNsYXNzIGZvciBkYXRhYmFzZSBsb29rdXB9ICB7XGNvZGV7J1JlbGllZid9fQogIFxsaW5laWlpezN9e2RlZmF1bHQgdmFsdWV9ICAgICAgICAgICAgICAgICAgICAge1xjb2RleydyYWlzZWQnfX0KICBcbGluZWlpaXs0fXtjdXJyZW50IHZhbHVlfSAgICAgICAgICAgICAgICAgICAgIHtcY29kZXsnZ3Jvb3ZlJ319ClxlbmR7dGFibGVpaWl9CgoKRXhhbXBsZToKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHByaW50IGZyZWQuY29uZmlnKCkKeydyZWxpZWYnIDogKCdyZWxpZWYnLCAncmVsaWVmJywgJ1JlbGllZicsICdyYWlzZWQnLCAnZ3Jvb3ZlJyl9ClxlbmR7dmVyYmF0aW19CgpPZiBjb3Vyc2UsIHRoZSBkaWN0aW9uYXJ5IHByaW50ZWQgd2lsbCBpbmNsdWRlIGFsbCB0aGUgb3B0aW9ucwphdmFpbGFibGUgYW5kIHRoZWlyIHZhbHVlcy4gIFRoaXMgaXMgbWVhbnQgb25seSBhcyBhbiBleGFtcGxlLgoKClxzdWJzdWJzZWN0aW9ue1RoZSBQYWNrZXJ9ICUgUGFja2VyLmh0bWwKXGluZGV4e3BhY2tpbmcgKHdpZGdldHMpfQoKVGhlIHBhY2tlciBpcyBvbmUgb2YgVGsncyBnZW9tZXRyeS1tYW5hZ2VtZW50IG1lY2hhbmlzbXMuICAKJSBTZWUgYWxzbyBcY2l0ZXRpdGxlW2NsYXNzZXMvQ2xhc3NQYWNrZXIuaHRtbF17dGhlIFBhY2tlciBjbGFzcyBpbnRlcmZhY2V9LgoKR2VvbWV0cnkgbWFuYWdlcnMgYXJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgcmVsYXRpdmUgcG9zaXRpb25pbmcgb2YgdGhlCnBvc2l0aW9uaW5nIG9mIHdpZGdldHMgd2l0aGluIHRoZWlyIGNvbnRhaW5lciAtIHRoZWlyIG11dHVhbApcZW1waHttYXN0ZXJ9LiAgSW4gY29udHJhc3QgdG8gdGhlIG1vcmUgY3VtYmVyc29tZSBcZW1waHtwbGFjZXJ9Cih3aGljaCBpcyB1c2VkIGxlc3MgY29tbW9ubHksIGFuZCB3ZSBkbyBub3QgY292ZXIgaGVyZSksIHRoZSBwYWNrZXIKdGFrZXMgcXVhbGl0YXRpdmUgcmVsYXRpb25zaGlwIHNwZWNpZmljYXRpb24gLSBcZW1waHthYm92ZX0sIFxlbXBoe3RvCnRoZSBsZWZ0IG9mfSwgXGVtcGh7ZmlsbGluZ30sIGV0YyAtIGFuZCB3b3JrcyBldmVyeXRoaW5nIG91dCB0bwpkZXRlcm1pbmUgdGhlIGV4YWN0IHBsYWNlbWVudCBjb29yZGluYXRlcyBmb3IgeW91LiAKClRoZSBzaXplIG9mIGFueSBcZW1waHttYXN0ZXJ9IHdpZGdldCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBzaXplIG9mCnRoZSAic2xhdmUgd2lkZ2V0cyIgaW5zaWRlLiAgVGhlIHBhY2tlciBpcyB1c2VkIHRvIGNvbnRyb2wgd2hlcmUgc2xhdmUKd2lkZ2V0cyBhcHBlYXIgaW5zaWRlIHRoZSBtYXN0ZXIgaW50byB3aGljaCB0aGV5IGFyZSBwYWNrZWQuICBZb3UgY2FuCnBhY2sgd2lkZ2V0cyBpbnRvIGZyYW1lcywgYW5kIGZyYW1lcyBpbnRvIG90aGVyIGZyYW1lcywgaW4gb3JkZXIgdG8KYWNoaWV2ZSB0aGUga2luZCBvZiBsYXlvdXQgeW91IGRlc2lyZS4gIEFkZGl0aW9uYWxseSwgdGhlIGFycmFuZ2VtZW50CmlzIGR5bmFtaWNhbGx5IGFkanVzdGVkIHRvIGFjY29tbW9kYXRlIGluY3JlbWVudGFsIGNoYW5nZXMgdG8gdGhlCmNvbmZpZ3VyYXRpb24sIG9uY2UgaXQgaXMgcGFja2VkLgoKTm90ZSB0aGF0IHdpZGdldHMgZG8gbm90IGFwcGVhciB1bnRpbCB0aGV5IGhhdmUgaGFkIHRoZWlyIGdlb21ldHJ5CnNwZWNpZmllZCB3aXRoIGEgZ2VvbWV0cnkgbWFuYWdlci4gIEl0J3MgYSBjb21tb24gZWFybHkgbWlzdGFrZSB0bwpsZWF2ZSBvdXQgdGhlIGdlb21ldHJ5IHNwZWNpZmljYXRpb24sIGFuZCB0aGVuIGJlIHN1cnByaXNlZCB3aGVuIHRoZQp3aWRnZXQgaXMgY3JlYXRlZCBidXQgbm90aGluZyBhcHBlYXJzLiAgQSB3aWRnZXQgd2lsbCBhcHBlYXIgb25seQphZnRlciBpdCBoYXMgaGFkLCBmb3IgZXhhbXBsZSwgdGhlIHBhY2tlcidzIFxtZXRob2R7cGFjaygpfSBtZXRob2QKYXBwbGllZCB0byBpdC4KClRoZSBwYWNrKCkgbWV0aG9kIGNhbiBiZSBjYWxsZWQgd2l0aCBrZXl3b3JkLW9wdGlvbi92YWx1ZSBwYWlycyB0aGF0CmNvbnRyb2wgd2hlcmUgdGhlIHdpZGdldCBpcyB0byBhcHBlYXIgd2l0aGluIGl0cyBjb250YWluZXIsIGFuZCBob3cgaXQKaXMgdG8gYmVoYXZlIHdoZW4gdGhlIG1haW4gYXBwbGljYXRpb24gd2luZG93IGlzIHJlc2l6ZWQuICBIZXJlIGFyZQpzb21lIGV4YW1wbGVzOgoKXGJlZ2lue3ZlcmJhdGltfQogICAgZnJlZC5wYWNrKCkgICAgICAgICAgICAgICAgICAgICAjIGRlZmF1bHRzIHRvIHNpZGUgPSAidG9wIgogICAgZnJlZC5wYWNrKHNpZGUgPSAibGVmdCIpCiAgICBmcmVkLnBhY2soZXhwYW5kID0gMSkKXGVuZHt2ZXJiYXRpbX0KCgpcc3Vic3Vic2VjdGlvbntQYWNrZXIgT3B0aW9uc30KCkZvciBtb3JlIGV4dGVuc2l2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgcGFja2VyIGFuZCB0aGUgb3B0aW9ucyB0aGF0IGl0CmNhbiB0YWtlLCBzZWUgdGhlIG1hbiBwYWdlcyBhbmQgcGFnZSAxODMgb2YgSm9obiBPdXN0ZXJob3V0J3MgYm9vay4KClxiZWdpbntkZXNjcmlwdGlvbn0KXGl0ZW1bXGJ7YW5jaG9yIH1dCkFuY2hvciB0eXBlLiAgRGVub3RlcyB3aGVyZSB0aGUgcGFja2VyIGlzIHRvIHBsYWNlIGVhY2ggc2xhdmUgaW4gaXRzCnBhcmNlbC4KClxpdGVtW1xie2V4cGFuZH1dCkJvb2xlYW4sIFxjb2RlezB9IG9yIFxjb2RlezF9LgoKXGl0ZW1bXGJ7ZmlsbH1dCkxlZ2FsIHZhbHVlczogXGNvZGV7J3gnfSwgXGNvZGV7J3knfSwgXGNvZGV7J2JvdGgnfSwgXGNvZGV7J25vbmUnfS4KClxpdGVtW1xie2lwYWR4fSBhbmQgXGJ7aXBhZHl9XQpBIGRpc3RhbmNlIC0gZGVzaWduYXRpbmcgaW50ZXJuYWwgcGFkZGluZyBvbiBlYWNoIHNpZGUgb2YgdGhlIHNsYXZlCndpZGdldC4KClxpdGVtW1xie3BhZHh9IGFuZCBcYntwYWR5fV0KQSBkaXN0YW5jZSAtIGRlc2lnbmF0aW5nIGV4dGVybmFsIHBhZGRpbmcgb24gZWFjaCBzaWRlIG9mIHRoZSBzbGF2ZQp3aWRnZXQuCgpcaXRlbVtcYntzaWRlfV0KTGVnYWwgdmFsdWVzIGFyZTogXGNvZGV7J2xlZnQnfSwgXGNvZGV7J3JpZ2h0J30sIFxjb2Rleyd0b3AnfSwKXGNvZGV7J2JvdHRvbSd9LgpcZW5ke2Rlc2NyaXB0aW9ufQoKClxzdWJzdWJzZWN0aW9ue0NvdXBsaW5nIFdpZGdldCBWYXJpYWJsZXN9ICUgVmFyQ291cGxpbmdzLmh0bWwKClRoZSBjdXJyZW50LXZhbHVlIHNldHRpbmcgb2Ygc29tZSB3aWRnZXRzIChsaWtlIHRleHQgZW50cnkgd2lkZ2V0cykKY2FuIGJlIGNvbm5lY3RlZCBkaXJlY3RseSB0byBhcHBsaWNhdGlvbiB2YXJpYWJsZXMgYnkgdXNpbmcgc3BlY2lhbApvcHRpb25zLiAgVGhlc2Ugb3B0aW9ucyBhcmUgXGNvZGV7dmFyaWFibGV9LCBcY29kZXt0ZXh0dmFyaWFibGV9LApcY29kZXtvbnZhbHVlfSwgXGNvZGV7b2ZmdmFsdWV9LCBhbmQgXGNvZGV7dmFsdWV9LiAgVGhpcwpjb25uZWN0aW9uIHdvcmtzIGJvdGggd2F5czogaWYgdGhlIHZhcmlhYmxlIGNoYW5nZXMgZm9yIGFueSByZWFzb24sCnRoZSB3aWRnZXQgaXQncyBjb25uZWN0ZWQgdG8gd2lsbCBiZSB1cGRhdGVkIHRvIHJlZmxlY3QgdGhlIG5ldyB2YWx1ZS4gCgpVbmZvcnR1bmF0ZWx5LCBpbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBccmVmbW9kdWxle1RraW50ZXJ9IGl0IGlzCm5vdCBwb3NzaWJsZSB0byBoYW5kIG92ZXIgYW4gYXJiaXRyYXJ5IFB5dGhvbiB2YXJpYWJsZSB0byBhIHdpZGdldAp0aHJvdWdoIGEgXGNvZGV7dmFyaWFibGV9IG9yIFxjb2Rle3RleHR2YXJpYWJsZX0gb3B0aW9uLiAgVGhlIG9ubHkKa2luZHMgb2YgdmFyaWFibGVzIGZvciB3aGljaCB0aGlzIHdvcmtzIGFyZSB2YXJpYWJsZXMgdGhhdCBhcmUKc3ViY2xhc3NlZCBmcm9tIGEgY2xhc3MgY2FsbGVkIFZhcmlhYmxlLCBkZWZpbmVkIGluIHRoZQpccmVmbW9kdWxle1RraW50ZXJ9IG1vZHVsZS4KClRoZXJlIGFyZSBtYW55IHVzZWZ1bCBzdWJjbGFzc2VzIG9mIFZhcmlhYmxlIGFscmVhZHkgZGVmaW5lZDoKXGNsYXNze1N0cmluZ1Zhcn0sIFxjbGFzc3tJbnRWYXJ9LCBcY2xhc3N7RG91YmxlVmFyfSwgYW5kClxjbGFzc3tCb29sZWFuVmFyfS4gIFRvIHJlYWQgdGhlIGN1cnJlbnQgdmFsdWUgb2Ygc3VjaCBhIHZhcmlhYmxlLApjYWxsIHRoZSBcbWV0aG9ke2dldCgpfSBtZXRob2Qgb24KaXQsIGFuZCB0byBjaGFuZ2UgaXRzIHZhbHVlIHlvdSBjYWxsIHRoZSBcbWV0aG9ke3NldCgpfSBtZXRob2QuICBJZgp5b3UgZm9sbG93IHRoaXMgcHJvdG9jb2wsIHRoZSB3aWRnZXQgd2lsbCBhbHdheXMgdHJhY2sgdGhlIHZhbHVlIG9mCnRoZSB2YXJpYWJsZSwgd2l0aCBubyBmdXJ0aGVyIGludGVydmVudGlvbiBvbiB5b3VyIHBhcnQuCgpGb3IgZXhhbXBsZTogClxiZWdpbnt2ZXJiYXRpbX0KY2xhc3MgQXBwKEZyYW1lKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSk6CiAgICAgICAgRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyKQogICAgICAgIHNlbGYucGFjaygpCiAgICAgICAgCiAgICAgICAgc2VsZi5lbnRyeXRoaW5neSA9IEVudHJ5KCkKICAgICAgICBzZWxmLmVudHJ5dGhpbmd5LnBhY2soKQogICAgICAgIAogICAgICAgICMgaGVyZSBpcyB0aGUgYXBwbGljYXRpb24gdmFyaWFibGUKICAgICAgICBzZWxmLmNvbnRlbnRzID0gU3RyaW5nVmFyKCkKICAgICAgICAjIHNldCBpdCB0byBzb21lIHZhbHVlCiAgICAgICAgc2VsZi5jb250ZW50cy5zZXQoInRoaXMgaXMgYSB2YXJpYWJsZSIpCiAgICAgICAgIyB0ZWxsIHRoZSBlbnRyeSB3aWRnZXQgdG8gd2F0Y2ggdGhpcyB2YXJpYWJsZQogICAgICAgIHNlbGYuZW50cnl0aGluZ3lbInRleHR2YXJpYWJsZSJdID0gc2VsZi5jb250ZW50cwogICAgICAgIAogICAgICAgICMgYW5kIGhlcmUgd2UgZ2V0IGEgY2FsbGJhY2sgd2hlbiB0aGUgdXNlciBoaXRzIHJldHVybi4KICAgICAgICAjIHdlIHdpbGwgaGF2ZSB0aGUgcHJvZ3JhbSBwcmludCBvdXQgdGhlIHZhbHVlIG9mIHRoZQogICAgICAgICMgYXBwbGljYXRpb24gdmFyaWFibGUgd2hlbiB0aGUgdXNlciBoaXRzIHJldHVybgogICAgICAgIHNlbGYuZW50cnl0aGluZ3kuYmluZCgnPEtleS1SZXR1cm4+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmludF9jb250ZW50cykKCiAgICBkZWYgcHJpbnRfY29udGVudHMoc2VsZiwgZXZlbnQpOgogICAgICAgIHByaW50ICJoaS4gY29udGVudHMgb2YgZW50cnkgaXMgbm93IC0tLS0+IiwgXAogICAgICAgICAgICAgIHNlbGYuY29udGVudHMuZ2V0KCkKXGVuZHt2ZXJiYXRpbX0KCgpcc3Vic3Vic2VjdGlvbntUaGUgV2luZG93IE1hbmFnZXJ9ICUgV2luZG93TWdyLmh0bWwKXGluZGV4e3dpbmRvdyBtYW5hZ2VyICh3aWRnZXRzKX0KCkluIFRrLCB0aGVyZSBpcyBhIHV0aWxpdHkgY29tbWFuZCwgXGNvZGV7d219LCBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUKd2luZG93IG1hbmFnZXIuICBPcHRpb25zIHRvIHRoZSBcY29kZXt3bX0gY29tbWFuZCBhbGxvdyB5b3UgdG8gY29udHJvbAp0aGluZ3MgbGlrZSB0aXRsZXMsIHBsYWNlbWVudCwgaWNvbiBiaXRtYXBzLCBhbmQgdGhlIGxpa2UuICBJbgpccmVmbW9kdWxle1RraW50ZXJ9LCB0aGVzZSBjb21tYW5kcyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgYXMgbWV0aG9kcwpvbiB0aGUgXGNsYXNze1dtfSBjbGFzcy4gIFRvcGxldmVsIHdpZGdldHMgYXJlIHN1YmNsYXNzZWQgZnJvbSB0aGUKXGNsYXNze1dtfSBjbGFzcywgYW5kIHNvIGNhbiBjYWxsIHRoZSBcY2xhc3N7V219IG1ldGhvZHMgZGlyZWN0bHkuCgolU2VlIGFsc28gXGNpdGV0aXRsZVtjbGFzc2VzL0NsYXNzV20uaHRtbF17dGhlIFdtIGNsYXNzIGludGVyZmFjZX0uCgpUbyBnZXQgYXQgdGhlIHRvcGxldmVsIHdpbmRvdyB0aGF0IGNvbnRhaW5zIGEgZ2l2ZW4gd2lkZ2V0LCB5b3UgY2FuCm9mdGVuIGp1c3QgcmVmZXIgdG8gdGhlIHdpZGdldCdzIG1hc3Rlci4gIE9mIGNvdXJzZSBpZiB0aGUgd2lkZ2V0IGhhcwpiZWVuIHBhY2tlZCBpbnNpZGUgb2YgYSBmcmFtZSwgdGhlIG1hc3RlciB3b24ndCByZXByZXNlbnQgYSB0b3BsZXZlbAp3aW5kb3cuICBUbyBnZXQgYXQgdGhlIHRvcGxldmVsIHdpbmRvdyB0aGF0IGNvbnRhaW5zIGFuIGFyYml0cmFyeQp3aWRnZXQsIHlvdSBjYW4gY2FsbCB0aGUgXG1ldGhvZHtfcm9vdCgpfSBtZXRob2QuICBUaGlzCm1ldGhvZCBiZWdpbnMgd2l0aCBhbiB1bmRlcnNjb3JlIHRvIGRlbm90ZSB0aGUgZmFjdCB0aGF0IHRoaXMgZnVuY3Rpb24KaXMgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIGFuZCBub3QgYW4gaW50ZXJmYWNlIHRvIFRrIGZ1bmN0aW9uYWxpdHkuCgpIZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIHR5cGljYWwgdXNhZ2U6CgpcYmVnaW57dmVyYmF0aW19CmZyb20gVGtpbnRlciBpbXBvcnQgKgpjbGFzcyBBcHAoRnJhbWUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lKToKICAgICAgICBGcmFtZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIpCiAgICAgICAgc2VsZi5wYWNrKCkKCgojIGNyZWF0ZSB0aGUgYXBwbGljYXRpb24KbXlhcHAgPSBBcHAoKQoKIwojIGhlcmUgYXJlIG1ldGhvZCBjYWxscyB0byB0aGUgd2luZG93IG1hbmFnZXIgY2xhc3MKIwpteWFwcC5tYXN0ZXIudGl0bGUoIk15IERvLU5vdGhpbmcgQXBwbGljYXRpb24iKQpteWFwcC5tYXN0ZXIubWF4c2l6ZSgxMDAwLCA0MDApCgojIHN0YXJ0IHRoZSBwcm9ncmFtCm15YXBwLm1haW5sb29wKCkKXGVuZHt2ZXJiYXRpbX0KCgpcc3Vic3Vic2VjdGlvbntUayBPcHRpb24gRGF0YSBUeXBlc30gJSBPcHRpb25UeXBlcy5odG1sCgpcaW5kZXh7VGsgT3B0aW9uIERhdGEgVHlwZXN9CgpcYmVnaW57ZGVzY3JpcHRpb259ClxpdGVtW2FuY2hvcl0KTGVnYWwgdmFsdWVzIGFyZSBwb2ludHMgb2YgdGhlIGNvbXBhc3M6IFxjb2RleyJuIn0sClxjb2RleyJuZSJ9LCBcY29kZXsiZSJ9LCBcY29kZXsic2UifSwgXGNvZGV7InMifSwKXGNvZGV7InN3In0sIFxjb2RleyJ3In0sIFxjb2RleyJudyJ9LCBhbmQgYWxzbwpcY29kZXsiY2VudGVyIn0uCgpcaXRlbVtiaXRtYXBdClRoZXJlIGFyZSBlaWdodCBidWlsdC1pbiwgbmFtZWQgYml0bWFwczogXGNvZGV7J2Vycm9yJ30sIFxjb2RleydncmF5MjUnfSwKXGNvZGV7J2dyYXk1MCd9LCBcY29kZXsnaG91cmdsYXNzJ30sIFxjb2RleydpbmZvJ30sIFxjb2RleydxdWVzdGhlYWQnfSwKXGNvZGV7J3F1ZXN0aW9uJ30sIFxjb2Rleyd3YXJuaW5nJ30uICBUbyBzcGVjaWZ5IGFuIFggYml0bWFwCmZpbGVuYW1lLCBnaXZlIHRoZSBmdWxsIHBhdGggdG8gdGhlIGZpbGUsIHByZWNlZGVkIHdpdGggYW4gXGNvZGV7QH0sCmFzIGluIFxjb2RleyJAL3Vzci9jb250cmliL2JpdG1hcC9ndW1ieS5iaXQifS4KClxpdGVtW2Jvb2xlYW5dCllvdSBjYW4gcGFzcyBpbnRlZ2VycyAwIG9yIDEgb3IgdGhlIHN0cmluZ3MgXGNvZGV7InllcyJ9IG9yIFxjb2RleyJubyJ9IC4KClxpdGVtW2NhbGxiYWNrXQpUaGlzIGlzIGFueSBQeXRob24gZnVuY3Rpb24gdGhhdCB0YWtlcyBubyBhcmd1bWVudHMuICBGb3IgZXhhbXBsZTogClxiZWdpbnt2ZXJiYXRpbX0KICAgIGRlZiBwcmludF9pdCgpOgogICAgICAgICAgICBwcmludCAiaGkgdGhlcmUiCiAgICBmcmVkWyJjb21tYW5kIl0gPSBwcmludF9pdApcZW5ke3ZlcmJhdGltfQoKXGl0ZW1bY29sb3JdCkNvbG9ycyBjYW4gYmUgZ2l2ZW4gYXMgdGhlIG5hbWVzIG9mIFggY29sb3JzIGluIHRoZSByZ2IudHh0IGZpbGUsCm9yIGFzIHN0cmluZ3MgcmVwcmVzZW50aW5nIFJHQiB2YWx1ZXMgaW4gNCBiaXQ6IFxjb2RleyJcI1JHQiJ9LCA4CmJpdDogXGNvZGV7IlwjUlJHR0JCIn0sIDEyIGJpdCIgXGNvZGV7IlwjUlJSR0dHQkJCIn0sIG9yIDE2IGJpdApcY29kZXsiXCNSUlJSR0dHR0JCQkIifSByYW5nZXMsIHdoZXJlIFIsRyxCIGhlcmUgcmVwcmVzZW50IGFueQpsZWdhbCBoZXggZGlnaXQuICBTZWUgcGFnZSAxNjAgb2YgT3VzdGVyaG91dCdzIGJvb2sgZm9yIGRldGFpbHMuICAKClxpdGVtW2N1cnNvcl0KVGhlIHN0YW5kYXJkIFggY3Vyc29yIG5hbWVzIGZyb20gXGZpbGV7Y3Vyc29yZm9udC5ofSBjYW4gYmUgdXNlZCwKd2l0aG91dCB0aGUgXGNvZGV7WENffSBwcmVmaXguICBGb3IgZXhhbXBsZSB0byBnZXQgYSBoYW5kIGN1cnNvcgooXGNvbnN0YW50e1hDX2hhbmQyfSksIHVzZSB0aGUgc3RyaW5nIFxjb2RleyJoYW5kMiJ9LiAgWW91IGNhbiBhbHNvCnNwZWNpZnkgYSBiaXRtYXAgYW5kIG1hc2sgZmlsZSBvZiB5b3VyIG93bi4gIFNlZSBwYWdlIDE3OSBvZgpPdXN0ZXJob3V0J3MgYm9vay4KClxpdGVtW2Rpc3RhbmNlXQpTY3JlZW4gZGlzdGFuY2VzIGNhbiBiZSBzcGVjaWZpZWQgaW4gZWl0aGVyIHBpeGVscyBvciBhYnNvbHV0ZQpkaXN0YW5jZXMuICBQaXhlbHMgYXJlIGdpdmVuIGFzIG51bWJlcnMgYW5kIGFic29sdXRlIGRpc3RhbmNlcyBhcwpzdHJpbmdzLCB3aXRoIHRoZSB0cmFpbGluZyBjaGFyYWN0ZXIgZGVub3RpbmcgdW5pdHM6IFxjb2Rle2N9CmZvciBjZW50aW1ldHJlcywgXGNvZGV7aX0gZm9yIGluY2hlcywgXGNvZGV7bX0gZm9yIG1pbGxpbWV0cmVzLApcY29kZXtwfSBmb3IgcHJpbnRlcidzIHBvaW50cy4gIEZvciBleGFtcGxlLCAzLjUgaW5jaGVzIGlzIGV4cHJlc3NlZAphcyBcY29kZXsiMy41aSJ9LgoKXGl0ZW1bZm9udF0KVGsgdXNlcyBhIGxpc3QgZm9udCBuYW1lIGZvcm1hdCwgc3VjaCBhcyBcY29kZXtce2NvdXJpZXIgMTAgYm9sZFx9fS4KRm9udCBzaXplcyB3aXRoIHBvc2l0aXZlIG51bWJlcnMgYXJlIG1lYXN1cmVkIGluIHBvaW50czsKc2l6ZXMgd2l0aCBuZWdhdGl2ZSBudW1iZXJzIGFyZSBtZWFzdXJlZCBpbiBwaXhlbHMuCgpcaXRlbVtnZW9tZXRyeV0KVGhpcyBpcyBhIHN0cmluZyBvZiB0aGUgZm9ybSBcc2FtcHtcdmFye3dpZHRofXhcdmFye2hlaWdodH19LCB3aGVyZQp3aWR0aCBhbmQgaGVpZ2h0IGFyZSBtZWFzdXJlZCBpbiBwaXhlbHMgZm9yIG1vc3Qgd2lkZ2V0cyAoaW4KY2hhcmFjdGVycyBmb3Igd2lkZ2V0cyBkaXNwbGF5aW5nIHRleHQpLiAgRm9yIGV4YW1wbGU6Clxjb2Rle2ZyZWRbImdlb21ldHJ5Il0gPSAiMjAweDEwMCJ9LgoKXGl0ZW1banVzdGlmeV0KTGVnYWwgdmFsdWVzIGFyZSB0aGUgc3RyaW5nczogXGNvZGV7ImxlZnQifSwKXGNvZGV7ImNlbnRlciJ9LCBcY29kZXsicmlnaHQifSwgYW5kIFxjb2RleyJmaWxsIn0uCgpcaXRlbVtyZWdpb25dClRoaXMgaXMgYSBzdHJpbmcgd2l0aCBmb3VyIHNwYWNlLWRlbGltaXRlZCBlbGVtZW50cywgZWFjaCBvZgp3aGljaCBpcyBhIGxlZ2FsIGRpc3RhbmNlIChzZWUgYWJvdmUpLiAgRm9yIGV4YW1wbGU6IFxjb2RleyIyIDMgNAo1In0gYW5kIFxjb2RleyIzaSAyaSA0LjVpIDJpIn0gYW5kIFxjb2RleyIzYyAyYyA0YyAxMC40M2MifSAKYXJlIGFsbCBsZWdhbCByZWdpb25zLgoKXGl0ZW1bcmVsaWVmXQpEZXRlcm1pbmVzIHdoYXQgdGhlIGJvcmRlciBzdHlsZSBvZiBhIHdpZGdldCB3aWxsIGJlLiAgTGVnYWwKdmFsdWVzIGFyZTogXGNvZGV7InJhaXNlZCJ9LCBcY29kZXsic3Vua2VuIn0sClxjb2RleyJmbGF0In0sIFxjb2RleyJncm9vdmUifSwgYW5kIFxjb2RleyJyaWRnZSJ9LgoKXGl0ZW1bc2Nyb2xsY29tbWFuZF0KVGhpcyBpcyBhbG1vc3QgYWx3YXlzIHRoZSBcbWV0aG9ke3NldCgpfSBtZXRob2Qgb2Ygc29tZSBzY3JvbGxiYXIKd2lkZ2V0LCBidXQgY2FuIGJlIGFueSB3aWRnZXQgbWV0aG9kIHRoYXQgdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQuICAKUmVmZXIgdG8gdGhlIGZpbGUgXGZpbGV7RGVtby90a2ludGVyL21hdHQvY2FudmFzLXdpdGgtc2Nyb2xsYmFycy5weX0KaW4gdGhlIFB5dGhvbiBzb3VyY2UgZGlzdHJpYnV0aW9uIGZvciBhbiBleGFtcGxlLgoKXGl0ZW1bd3JhcDpdCk11c3QgYmUgb25lIG9mOiBcY29kZXsibm9uZSJ9LCBcY29kZXsiY2hhciJ9LCBvciBcY29kZXsid29yZCJ9LgpcZW5ke2Rlc2NyaXB0aW9ufQoKClxzdWJzdWJzZWN0aW9ue0JpbmRpbmdzIGFuZCBFdmVudHN9ICUgQmluZGluZ3MuaHRtbAoKXGluZGV4e2JpbmQgKHdpZGdldHMpfQpcaW5kZXh7ZXZlbnRzICh3aWRnZXRzKX0KClRoZSBiaW5kIG1ldGhvZCBmcm9tIHRoZSB3aWRnZXQgY29tbWFuZCBhbGxvd3MgeW91IHRvIHdhdGNoIGZvcgpjZXJ0YWluIGV2ZW50cyBhbmQgdG8gaGF2ZSBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRyaWdnZXIgd2hlbiB0aGF0IGV2ZW50CnR5cGUgb2NjdXJzLiAgVGhlIGZvcm0gb2YgdGhlIGJpbmQgbWV0aG9kIGlzOgoKXGJlZ2lue3ZlcmJhdGltfQogICAgZGVmIGJpbmQoc2VsZiwgc2VxdWVuY2UsIGZ1bmMsIGFkZD0nJyk6ClxlbmR7dmVyYmF0aW19CndoZXJlOgoKXGJlZ2lue2Rlc2NyaXB0aW9ufQpcaXRlbVtzZXF1ZW5jZV0KaXMgYSBzdHJpbmcgdGhhdCBkZW5vdGVzIHRoZSB0YXJnZXQga2luZCBvZiBldmVudC4gIChTZWUgdGhlIGJpbmQKbWFuIHBhZ2UgYW5kIHBhZ2UgMjAxIG9mIEpvaG4gT3VzdGVyaG91dCdzIGJvb2sgZm9yIGRldGFpbHMpLgoKXGl0ZW1bZnVuY10KaXMgYSBQeXRob24gZnVuY3Rpb24sIHRha2luZyBvbmUgYXJndW1lbnQsIHRvIGJlIGludm9rZWQgd2hlbiB0aGUKZXZlbnQgb2NjdXJzLiAgQW4gRXZlbnQgaW5zdGFuY2Ugd2lsbCBiZSBwYXNzZWQgYXMgdGhlIGFyZ3VtZW50LgooRnVuY3Rpb25zIGRlcGxveWVkIHRoaXMgd2F5IGFyZSBjb21tb25seSBrbm93biBhcyBcdmFye2NhbGxiYWNrc30uKQoKXGl0ZW1bYWRkXQppcyBvcHRpb25hbCwgZWl0aGVyIFxzYW1we30gb3IgXHNhbXB7K30uICBQYXNzaW5nIGFuIGVtcHR5IHN0cmluZwpkZW5vdGVzIHRoYXQgdGhpcyBiaW5kaW5nIGlzIHRvIHJlcGxhY2UgYW55IG90aGVyIGJpbmRpbmdzIHRoYXQgdGhpcwpldmVudCBpcyBhc3NvY2lhdGVkIHdpdGguICBQcmVjZWVkaW5nIHdpdGggYSBcc2FtcHsrfSBtZWFucyB0aGF0IHRoaXMKZnVuY3Rpb24gaXMgdG8gYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgZnVuY3Rpb25zIGJvdW5kIHRvIHRoaXMgZXZlbnQgdHlwZS4KXGVuZHtkZXNjcmlwdGlvbn0KCkZvciBleGFtcGxlOgpcYmVnaW57dmVyYmF0aW19CiAgICBkZWYgdHVyblJlZChzZWxmLCBldmVudCk6CiAgICAgICAgZXZlbnQud2lkZ2V0WyJhY3RpdmVmb3JlZ3JvdW5kIl0gPSAicmVkIgoKICAgIHNlbGYuYnV0dG9uLmJpbmQoIjxFbnRlcj4iLCBzZWxmLnR1cm5SZWQpClxlbmR7dmVyYmF0aW19CgpOb3RpY2UgaG93IHRoZSB3aWRnZXQgZmllbGQgb2YgdGhlIGV2ZW50IGlzIGJlaW5nIGFjY2Vzc2VkIGluIHRoZQpcbWV0aG9ke3R1cm5SZWQoKX0gY2FsbGJhY2suICBUaGlzIGZpZWxkIGNvbnRhaW5zIHRoZSB3aWRnZXQgdGhhdApjYXVnaHQgdGhlIFggZXZlbnQuICBUaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHRoZSBvdGhlciBldmVudCBmaWVsZHMKeW91IGNhbiBhY2Nlc3MsIGFuZCBob3cgdGhleSBhcmUgZGVub3RlZCBpbiBUaywgd2hpY2ggY2FuIGJlIHVzZWZ1bAp3aGVuIHJlZmVycmluZyB0byB0aGUgVGsgbWFuIHBhZ2VzLgoKXGJlZ2lue3ZlcmJhdGltfQpUayAgICAgIFRraW50ZXIgRXZlbnQgRmllbGQgICAgICAgICAgICAgVGsgICAgICBUa2ludGVyIEV2ZW50IEZpZWxkIAotLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tCiVmICAgICAgZm9jdXMgICAgICAgICAgICAgICAgICAgICAgICAgICAlQSAgICAgIGNoYXIKJWggICAgICBoZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICAgICVFICAgICAgc2VuZF9ldmVudAolayAgICAgIGtleWNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgJUsgICAgICBrZXlzeW0KJXMgICAgICBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICVOICAgICAga2V5c3ltX251bQoldCAgICAgIHRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVQgICAgICB0eXBlCiV3ICAgICAgd2lkdGggICAgICAgICAgICAgICAgICAgICAgICAgICAlVyAgICAgIHdpZGdldAoleCAgICAgIHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVggICAgICB4X3Jvb3QKJXkgICAgICB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVZICAgICAgeV9yb290ClxlbmR7dmVyYmF0aW19CgoKXHN1YnN1YnNlY3Rpb257VGhlIGluZGV4IFBhcmFtZXRlcn0gJSBJbmRleC5odG1sCgpBIG51bWJlciBvZiB3aWRnZXRzIHJlcXVpcmVgYGluZGV4JycgcGFyYW1ldGVycyB0byBiZSBwYXNzZWQuICBUaGVzZQphcmUgdXNlZCB0byBwb2ludCBhdCBhIHNwZWNpZmljIHBsYWNlIGluIGEgVGV4dCB3aWRnZXQsIG9yIHRvCnBhcnRpY3VsYXIgY2hhcmFjdGVycyBpbiBhbiBFbnRyeSB3aWRnZXQsIG9yIHRvIHBhcnRpY3VsYXIgbWVudSBpdGVtcwppbiBhIE1lbnUgd2lkZ2V0LgoKXGJlZ2lue2Rlc2NyaXB0aW9ufQpcaXRlbVtcYntFbnRyeSB3aWRnZXQgaW5kZXhlcyAoaW5kZXgsIHZpZXcgaW5kZXgsIGV0Yy4pfV0KRW50cnkgd2lkZ2V0cyBoYXZlIG9wdGlvbnMgdGhhdCByZWZlciB0byBjaGFyYWN0ZXIgcG9zaXRpb25zIGluIHRoZQp0ZXh0IGJlaW5nIGRpc3BsYXllZC4gIFlvdSBjYW4gdXNlIHRoZXNlIFxyZWZtb2R1bGV7VGtpbnRlcn0gZnVuY3Rpb25zCnRvIGFjY2VzcyB0aGVzZSBzcGVjaWFsIHBvaW50cyBpbiB0ZXh0IHdpZGdldHM6CgpcYmVnaW57ZGVzY3JpcHRpb259ClxpdGVtW0F0RW5kKCldCnJlZmVycyB0byB0aGUgbGFzdCBwb3NpdGlvbiBpbiB0aGUgdGV4dAoKXGl0ZW1bQXRJbnNlcnQoKV0KcmVmZXJzIHRvIHRoZSBwb2ludCB3aGVyZSB0aGUgdGV4dCBjdXJzb3IgaXMKClxpdGVtW0F0U2VsRmlyc3QoKV0KaW5kaWNhdGVzIHRoZSBiZWdpbm5pbmcgcG9pbnQgb2YgdGhlIHNlbGVjdGVkIHRleHQKClxpdGVtW0F0U2VsTGFzdCgpXQpkZW5vdGVzIHRoZSBsYXN0IHBvaW50IG9mIHRoZSBzZWxlY3RlZCB0ZXh0IGFuZCBmaW5hbGx5CgpcaXRlbVtBdCh4XG9wdGlvbmFseywgeX0pXQpyZWZlcnMgdG8gdGhlIGNoYXJhY3RlciBhdCBwaXhlbCBsb2NhdGlvbiBcdmFye3h9LCBcdmFye3l9ICh3aXRoClx2YXJ7eX0gbm90IHVzZWQgaW4gdGhlIGNhc2Ugb2YgYSB0ZXh0IGVudHJ5IHdpZGdldCwgd2hpY2ggY29udGFpbnMgYQpzaW5nbGUgbGluZSBvZiB0ZXh0KS4KXGVuZHtkZXNjcmlwdGlvbn0KClxpdGVtW1xie1RleHQgd2lkZ2V0IGluZGV4ZXN9XQpUaGUgaW5kZXggbm90YXRpb24gZm9yIFRleHQgd2lkZ2V0cyBpcyB2ZXJ5IHJpY2ggYW5kIGlzIGJlc3QgZGVzY3JpYmVkCmluIHRoZSBUayBtYW4gcGFnZXMuCgpcaXRlbVtcYntNZW51IGluZGV4ZXMgKG1lbnUuaW52b2tlKCksIG1lbnUuZW50cnljb25maWcoKSwgZXRjLil9XQoKU29tZSBvcHRpb25zIGFuZCBtZXRob2RzIGZvciBtZW51cyBtYW5pcHVsYXRlIHNwZWNpZmljIG1lbnUgZW50cmllcy4KQW55dGltZSBhIG1lbnUgaW5kZXggaXMgbmVlZGVkIGZvciBhbiBvcHRpb24gb3IgYSBwYXJhbWV0ZXIsIHlvdSBtYXkKcGFzcyBpbjogClxiZWdpbntpdGVtaXplfQpcaXRlbSAgIGFuIGludGVnZXIgd2hpY2ggcmVmZXJzIHRvIHRoZSBudW1lcmljIHBvc2l0aW9uIG9mIHRoZSBlbnRyeSBpbgp0aGUgd2lkZ2V0LCBjb3VudGVkIGZyb20gdGhlIHRvcCwgc3RhcnRpbmcgd2l0aCAwOyAKXGl0ZW0gICB0aGUgc3RyaW5nIFxjb2RleydhY3RpdmUnfSwgd2hpY2ggcmVmZXJzIHRvIHRoZSBtZW51IHBvc2l0aW9uIHRoYXQgaXMKY3VycmVudGx5IHVuZGVyIHRoZSBjdXJzb3I7ClxpdGVtICAgdGhlIHN0cmluZyBcY29kZXsibGFzdCJ9IHdoaWNoIHJlZmVycyB0byB0aGUgbGFzdCBtZW51Cml0ZW07ICAKXGl0ZW0gICBBbiBpbnRlZ2VyIHByZWNlZGVkIGJ5IFxjb2Rle0B9LCBhcyBpbiBcY29kZXtANn0sIHdoZXJlIHRoZSBpbnRlZ2VyIGlzCmludGVycHJldGVkIGFzIGEgeSBwaXhlbCBjb29yZGluYXRlIGluIHRoZSBtZW51J3MgY29vcmRpbmF0ZSBzeXN0ZW07ClxpdGVtICAgdGhlIHN0cmluZyBcY29kZXsibm9uZSJ9LCB3aGljaCBpbmRpY2F0ZXMgbm8gbWVudSBlbnRyeSBhdCBhbGwsIG1vc3QKb2Z0ZW4gdXNlZCB3aXRoIG1lbnUuYWN0aXZhdGUoKSB0byBkZWFjdGl2YXRlIGFsbCBlbnRyaWVzLCBhbmQKZmluYWxseSwKXGl0ZW0gICBhIHRleHQgc3RyaW5nIHRoYXQgaXMgcGF0dGVybiBtYXRjaGVkIGFnYWluc3QgdGhlIGxhYmVsIG9mIHRoZQptZW51IGVudHJ5LCBhcyBzY2FubmVkIGZyb20gdGhlIHRvcCBvZiB0aGUgbWVudSB0byB0aGUgYm90dG9tLiAgTm90ZQp0aGF0IHRoaXMgaW5kZXggdHlwZSBpcyBjb25zaWRlcmVkIGFmdGVyIGFsbCB0aGUgb3RoZXJzLCB3aGljaCBtZWFucwp0aGF0IG1hdGNoZXMgZm9yIG1lbnUgaXRlbXMgbGFiZWxsZWQgXGNvZGV7bGFzdH0sIFxjb2Rle2FjdGl2ZX0sIG9yClxjb2Rle25vbmV9IG1heSBiZSBpbnRlcnByZXRlZCBhcyB0aGUgYWJvdmUgbGl0ZXJhbHMsIGluc3RlYWQuClxlbmR7aXRlbWl6ZX0KXGVuZHtkZXNjcmlwdGlvbn0KClxzdWJzdWJzZWN0aW9ue0ltYWdlc30KCkJpdG1hcC9QaXhlbG1hcCBpbWFnZXMgY2FuIGJlIGNyZWF0ZWQgdGhyb3VnaCB0aGUgc3ViY2xhc3NlcyBvZgpcY2xhc3N7VGtpbnRlci5JbWFnZX06CgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gIFxjbGFzc3tCaXRtYXBJbWFnZX0gY2FuIGJlIHVzZWQgZm9yIFgxMSBiaXRtYXAgZGF0YS4KXGl0ZW0gIFxjbGFzc3tQaG90b0ltYWdlfSBjYW4gYmUgdXNlZCBmb3IgR0lGIGFuZCBQUE0vUEdNIGNvbG9yIGJpdG1hcHMuClxlbmR7aXRlbWl6ZX0KCkVpdGhlciB0eXBlIG9mIGltYWdlIGlzIGNyZWF0ZWQgdGhyb3VnaCBlaXRoZXIgdGhlIFxjb2Rle2ZpbGV9IG9yIHRoZQpcY29kZXtkYXRhfSBvcHRpb24gKG90aGVyIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSBhcyB3ZWxsKS4KClRoZSBpbWFnZSBvYmplY3QgY2FuIHRoZW4gYmUgdXNlZCB3aGVyZXZlciBhbiBcY29kZXtpbWFnZX0gb3B0aW9uIGlzCnN1cHBvcnRlZCBieSBzb21lIHdpZGdldCAoZS5nLiBsYWJlbHMsIGJ1dHRvbnMsIG1lbnVzKS4gSW4gdGhlc2UKY2FzZXMsIFRrIHdpbGwgbm90IGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIGltYWdlLiBXaGVuIHRoZSBsYXN0IFB5dGhvbgpyZWZlcmVuY2UgdG8gdGhlIGltYWdlIG9iamVjdCBpcyBkZWxldGVkLCB0aGUgaW1hZ2UgZGF0YSBpcyBkZWxldGVkIGFzCndlbGwsIGFuZCBUayB3aWxsIGRpc3BsYXkgYW4gZW1wdHkgYm94IHdoZXJldmVyIHRoZSBpbWFnZSB3YXMgdXNlZC4KClxzZWN0aW9ue1xtb2R1bGV7VGl4fSAtLS0KICAgICAgICAgRXh0ZW5zaW9uIHdpZGdldHMgZm9yIFRrfQoKXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e1RpeH0KXG1vZHVsZXN5bm9wc2lze1RrIEV4dGVuc2lvbiBXaWRnZXRzIGZvciBUa2ludGVyfQpcc2VjdGlvbmF1dGhvcntNaWtlIENsYXJrc29ufXttaWtlY2xhcmtzb25AdXNlcnMuc291cmNlZm9yZ2UubmV0fQoKXGluZGV4e1RpeH0KClRoZSBcbW9kdWxle1RpeH0gKFRrIEludGVyZmFjZSBFeHRlbnNpb24pIG1vZHVsZSBwcm92aWRlcyBhbgphZGRpdGlvbmFsIHJpY2ggc2V0IG9mIHdpZGdldHMuIEFsdGhvdWdoIHRoZSBzdGFuZGFyZCBUayBsaWJyYXJ5IGhhcwptYW55IHVzZWZ1bCB3aWRnZXRzLCB0aGV5IGFyZSBmYXIgZnJvbSBjb21wbGV0ZS4gVGhlIFxtb2R1bGV7VGl4fQpsaWJyYXJ5IHByb3ZpZGVzIG1vc3Qgb2YgdGhlIGNvbW1vbmx5IG5lZWRlZCB3aWRnZXRzIHRoYXQgYXJlIG1pc3NpbmcKZnJvbSBzdGFuZGFyZCBUazogXGNsYXNze0hMaXN0fSwgXGNsYXNze0NvbWJvQm94fSwgXGNsYXNze0NvbnRyb2x9CihhLmsuYS4gU3BpbkJveCkgYW5kIGFuIGFzc29ydG1lbnQgb2Ygc2Nyb2xsYWJsZSB3aWRnZXRzLiBcbW9kdWxle1RpeH0KYWxzbyBpbmNsdWRlcyBtYW55IG1vcmUgd2lkZ2V0cyB0aGF0IGFyZSBnZW5lcmFsbHkgdXNlZnVsIGluIGEgd2lkZQpyYW5nZSBvZiBhcHBsaWNhdGlvbnM6IFxjbGFzc3tOb3RlQm9va30sIFxjbGFzc3tGaWxlRW50cnl9LApcY2xhc3N7UGFuZWRXaW5kb3d9LCBldGM7IHRoZXJlIGFyZSBtb3JlIHRoYW4gNDAgb2YgdGhlbS4KCldpdGggYWxsIHRoZXNlIG5ldyB3aWRnZXRzLCB5b3UgY2FuIGludHJvZHVjZSBuZXcgaW50ZXJhY3Rpb24KdGVjaG5pcXVlcyBpbnRvIGFwcGxpY2F0aW9ucywgY3JlYXRpbmcgbW9yZSB1c2VmdWwgYW5kIG1vcmUgaW50dWl0aXZlCnVzZXIgaW50ZXJmYWNlcy4gWW91IGNhbiBkZXNpZ24geW91ciBhcHBsaWNhdGlvbiBieSBjaG9vc2luZyB0aGUgbW9zdAphcHByb3ByaWF0ZSB3aWRnZXRzIHRvIG1hdGNoIHRoZSBzcGVjaWFsIG5lZWRzIG9mIHlvdXIgYXBwbGljYXRpb24gYW5kCnVzZXJzLiAKClxiZWdpbntzZWVhbHNvfQpcc2VldGl0bGVbaHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvXQogICAgICAgIHtUaXggSG9tZXBhZ2V9CiAgICAgICAge1RoZSBob21lIHBhZ2UgZm9yIFxtb2R1bGV7VGl4fS4gIFRoaXMgaW5jbHVkZXMgbGlua3MgdG8KICAgICAgICAgYWRkaXRpb25hbCBkb2N1bWVudGF0aW9uIGFuZCBkb3dubG9hZHMufQpcc2VldGl0bGVbaHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L21hbi9dCiAgICAgICAge1RpeCBNYW4gUGFnZXN9CiAgICAgICAge09uLWxpbmUgdmVyc2lvbiBvZiB0aGUgbWFuIHBhZ2VzIGFuZCByZWZlcmVuY2UgbWF0ZXJpYWwufQpcc2VldGl0bGVbaHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L2RvY3MvdGl4LWJvb2svdGl4LmJvb2suaHRtbF0KICAgICAgICB7VGl4IFByb2dyYW1taW5nIEd1aWRlfQogICAgICAgIHtPbi1saW5lIHZlcnNpb24gb2YgdGhlIHByb2dyYW1tZXIncyByZWZlcmVuY2UgbWF0ZXJpYWwufQpcc2VldGl0bGVbaHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvVGlkZS9dCiAgICAgICAge1RpeCBEZXZlbG9wbWVudCBBcHBsaWNhdGlvbnN9CiAgICAgICAge1RpeCBhcHBsaWNhdGlvbnMgZm9yIGRldmVsb3BtZW50IG9mIFRpeCBhbmQgVGtpbnRlciBwcm9ncmFtcy4KICAgICAgICAgVGlkZSBhcHBsaWNhdGlvbnMgd29yayB1bmRlciBUayBvciBUa2ludGVyLCBhbmQgaW5jbHVkZQogICAgICAgICBccHJvZ3JhbXtUaXhJbnNwZWN0fSwgYW4gaW5zcGVjdG9yIHRvIHJlbW90ZWx5IG1vZGlmeSBhbmQKICAgICAgICAgZGVidWcgVGl4L1RrL1RraW50ZXIgYXBwbGljYXRpb25zLn0KXGVuZHtzZWVhbHNvfQoKClxzdWJzZWN0aW9ue1VzaW5nIFRpeH0KClxiZWdpbntjbGFzc2Rlc2N9e1RpeH17c2NyZWVuTmFtZVxvcHRpb25hbHssIGJhc2VOYW1lXG9wdGlvbmFseywgY2xhc3NOYW1lfX19CiAgICBUb3BsZXZlbCB3aWRnZXQgb2YgVGl4IHdoaWNoIHJlcHJlc2VudHMgbW9zdGx5IHRoZSBtYWluIHdpbmRvdwogICAgb2YgYW4gYXBwbGljYXRpb24uIEl0IGhhcyBhbiBhc3NvY2lhdGVkIFRjbCBpbnRlcnByZXRlci4KCkNsYXNzZXMgaW4gdGhlIFxyZWZtb2R1bGV7VGl4fSBtb2R1bGUgc3ViY2xhc3NlcyB0aGUgY2xhc3NlcyBpbiB0aGUKXHJlZm1vZHVsZXtUa2ludGVyfSBtb2R1bGUuIFRoZSBmb3JtZXIgaW1wb3J0cyB0aGUgbGF0dGVyLCBzbyB0byB1c2UKXHJlZm1vZHVsZXtUaXh9IHdpdGggVGtpbnRlciwgYWxsIHlvdSBuZWVkIHRvIGRvIGlzIHRvIGltcG9ydCBvbmUKbW9kdWxlLiBJbiBnZW5lcmFsLCB5b3UgY2FuIGp1c3QgaW1wb3J0IFxyZWZtb2R1bGV7VGl4fSwgYW5kIHJlcGxhY2UKdGhlIHRvcGxldmVsIGNhbGwgdG8gXGNsYXNze1RraW50ZXIuVGt9IHdpdGggXGNsYXNze1RpeC5Ua306ClxiZWdpbnt2ZXJiYXRpbX0KaW1wb3J0IFRpeApmcm9tIFRrY29uc3RhbnRzIGltcG9ydCAqCnJvb3QgPSBUaXguVGsoKQpcZW5ke3ZlcmJhdGltfQpcZW5ke2NsYXNzZGVzY30KClRvIHVzZSBccmVmbW9kdWxle1RpeH0sIHlvdSBtdXN0IGhhdmUgdGhlIFxyZWZtb2R1bGV7VGl4fSB3aWRnZXRzIGluc3RhbGxlZCwKdXN1YWxseSBhbG9uZ3NpZGUgeW91ciBpbnN0YWxsYXRpb24gb2YgdGhlIFRrIHdpZGdldHMuClRvIHRlc3QgeW91ciBpbnN0YWxsYXRpb24sIHRyeSB0aGUgZm9sbG93aW5nOgpcYmVnaW57dmVyYmF0aW19CmltcG9ydCBUaXgKcm9vdCA9IFRpeC5UaygpCnJvb3QudGsuZXZhbCgncGFja2FnZSByZXF1aXJlIFRpeCcpClxlbmR7dmVyYmF0aW19CgpJZiB0aGlzIGZhaWxzLCB5b3UgaGF2ZSBhIFRrIGluc3RhbGxhdGlvbiBwcm9ibGVtIHdoaWNoIG11c3QgYmUKcmVzb2x2ZWQgYmVmb3JlIHByb2NlZWRpbmcuIFVzZSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgXGVudnZhcntUSVhfTElCUkFSWX0KdG8gcG9pbnQgdG8gdGhlIGluc3RhbGxlZCBccmVmbW9kdWxle1RpeH0gbGlicmFyeSBkaXJlY3RvcnksIGFuZAptYWtlIHN1cmUgeW91IGhhdmUgdGhlIGR5bmFtaWMgb2JqZWN0IGxpYnJhcnkgKFxmaWxle3RpeDgxODMuZGxsfSBvcgpcZmlsZXtsaWJ0aXg4MTgzLnNvfSkgaW4gIHRoZSBzYW1lIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHlvdXIgVGsKZHluYW1pYyBvYmplY3QgbGlicmFyeSAoXGZpbGV7dGs4MTgzLmRsbH0gb3IgXGZpbGV7bGlidGs4MTgzLnNvfSkuIFRoZQpkaXJlY3Rvcnkgd2l0aCB0aGUgZHluYW1pYyBvYmplY3QgbGlicmFyeSBzaG91bGQgYWxzbyBoYXZlIGEgZmlsZQpjYWxsZWQgXGZpbGV7cGtnSW5kZXgudGNsfSAoY2FzZSBzZW5zaXRpdmUpLCB3aGljaCBjb250YWlucyB0aGUgbGluZToKClxiZWdpbnt2ZXJiYXRpbX0KcGFja2FnZSBpZm5lZWRlZCBUaXggOC4xIFtsaXN0IGxvYWQgIltmaWxlIGpvaW4gJGRpciB0aXg4MTgzLmRsbF0iIFRpeF0KXGVuZHt2ZXJiYXRpbX0gJSAkIDwtLSBib3cgdG8gZm9udC1sb2NrCgoKXHN1YnNlY3Rpb257VGl4IFdpZGdldHN9CgpcdWxpbmt7VGl4fQp7aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L21hbi9odG1sL1RpeENtZC9UaXhJbnRyby5odG19CmludHJvZHVjZXMgb3ZlciA0MCB3aWRnZXQgY2xhc3NlcyB0byB0aGUgXHJlZm1vZHVsZXtUa2ludGVyfSAKcmVwZXJ0b2lyZS4gIFRoZXJlIGlzIGEgZGVtbyBvZiBhbGwgdGhlIFxyZWZtb2R1bGV7VGl4fSB3aWRnZXRzIGluIHRoZQpcZmlsZXtEZW1vL3RpeH0gZGlyZWN0b3J5IG9mIHRoZSBzdGFuZGFyZCBkaXN0cmlidXRpb24uCgoKJSBUaGUgUHl0aG9uIHNhbXBsZSBjb2RlIGlzIHN0aWxsIGJlaW5nIGFkZGVkIHRvIFB5dGhvbiwgaGVuY2UgY29tbWVudGVkIG91dAoKClxzdWJzdWJzZWN0aW9ue0Jhc2ljIFdpZGdldHN9CgpcYmVnaW57Y2xhc3NkZXNjfXtCYWxsb29ufXt9CkEgXHVsaW5re0JhbGxvb259CntodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvbWFuL2h0bWwvVGl4Q21kL3RpeEJhbGxvb24uaHRtfQp0aGF0IHBvcHMgdXAgb3ZlciBhIHdpZGdldCB0byBwcm92aWRlIGhlbHAuICBXaGVuIHRoZSB1c2VyIG1vdmVzIHRoZQpjdXJzb3IgaW5zaWRlIGEgd2lkZ2V0IHRvIHdoaWNoIGEgQmFsbG9vbiB3aWRnZXQgaGFzIGJlZW4gYm91bmQsIGEKc21hbGwgcG9wLXVwIHdpbmRvdyB3aXRoIGEgZGVzY3JpcHRpdmUgbWVzc2FnZSB3aWxsIGJlIHNob3duIG9uIHRoZQpzY3JlZW4uClxlbmR7Y2xhc3NkZXNjfQoKJSBQeXRob24gRGVtbyBvZjoKJSBcdWxpbmt7QmFsbG9vbn17aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L2RlbW9zL3NhbXBsZXMvQmFsbG9vbi50Y2x9CgpcYmVnaW57Y2xhc3NkZXNjfXtCdXR0b25Cb3h9e30KVGhlIFx1bGlua3tCdXR0b25Cb3h9CntodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvbWFuL2h0bWwvVGl4Q21kL3RpeEJ1dHRvbkJveC5odG19CndpZGdldCBjcmVhdGVzIGEgYm94IG9mIGJ1dHRvbnMsIHN1Y2ggYXMgaXMgY29tbW9ubHkgdXNlZCBmb3IgXGNvZGV7T2sKQ2FuY2VsfS4KXGVuZHtjbGFzc2Rlc2N9CgolIFB5dGhvbiBEZW1vIG9mOgolIFx1bGlua3tCdXR0b25Cb3h9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL0J0bkJveC50Y2x9CgpcYmVnaW57Y2xhc3NkZXNjfXtDb21ib0JveH17fQpUaGUgXHVsaW5re0NvbWJvQm94fQp7aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L21hbi9odG1sL1RpeENtZC90aXhDb21ib0JveC5odG19CndpZGdldCBpcyBzaW1pbGFyIHRvIHRoZSBjb21ibyBib3ggY29udHJvbCBpbiBNUyBXaW5kb3dzLiBUaGUgdXNlciBjYW4Kc2VsZWN0IGEgY2hvaWNlIGJ5IGVpdGhlciB0eXBpbmcgaW4gdGhlIGVudHJ5IHN1YndkZ2V0IG9yIHNlbGVjdGluZwpmcm9tIHRoZSBsaXN0Ym94IHN1YndpZGdldC4KXGVuZHtjbGFzc2Rlc2N9CgolIFB5dGhvbiBEZW1vIG9mOgolIFx1bGlua3tDb21ib0JveH17aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L2RlbW9zL3NhbXBsZXMvQ29tYm9Cb3gudGNsfQoKXGJlZ2lue2NsYXNzZGVzY317Q29udHJvbH17fQpUaGUgXHVsaW5re0NvbnRyb2x9CntodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvbWFuL2h0bWwvVGl4Q21kL3RpeENvbnRyb2wuaHRtfQp3aWRnZXQgaXMgYWxzbyBrbm93biBhcyB0aGUgXGNsYXNze1NwaW5Cb3h9IHdpZGdldC4gVGhlIHVzZXIgY2FuCmFkanVzdCB0aGUgdmFsdWUgYnkgcHJlc3NpbmcgdGhlIHR3byBhcnJvdyBidXR0b25zIG9yIGJ5IGVudGVyaW5nIHRoZQp2YWx1ZSBkaXJlY3RseSBpbnRvIHRoZSBlbnRyeS4gVGhlIG5ldyB2YWx1ZSB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdAp0aGUgdXNlci1kZWZpbmVkIHVwcGVyIGFuZCBsb3dlciBsaW1pdHMuClxlbmR7Y2xhc3NkZXNjfQoKJSBQeXRob24gRGVtbyBvZjoKJSBcdWxpbmt7Q29udHJvbH17aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L2RlbW9zL3NhbXBsZXMvQ29udHJvbC50Y2x9CgpcYmVnaW57Y2xhc3NkZXNjfXtMYWJlbEVudHJ5fXt9ClRoZSBcdWxpbmt7TGFiZWxFbnRyeX0Ke2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9tYW4vaHRtbC9UaXhDbWQvdGl4TGFiZWxFbnRyeS5odG19CndpZGdldCBwYWNrYWdlcyBhbiBlbnRyeSB3aWRnZXQgYW5kIGEgbGFiZWwgaW50byBvbmUgbWVnYSB3aWRnZXQuIEl0CmNhbiBiZSB1c2VkIGJlIHVzZWQgdG8gc2ltcGxpZnkgdGhlIGNyZWF0aW9uIG9mIGBgZW50cnktZm9ybScnIHR5cGUgb2YKaW50ZXJmYWNlLgpcZW5ke2NsYXNzZGVzY30KCiUgUHl0aG9uIERlbW8gb2Y6CiUgXHVsaW5re0xhYmVsRW50cnl9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL0xhYkVudHJ5LnRjbH0KClxiZWdpbntjbGFzc2Rlc2N9e0xhYmVsRnJhbWV9e30KVGhlIFx1bGlua3tMYWJlbEZyYW1lfQp7aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L21hbi9odG1sL1RpeENtZC90aXhMYWJlbEZyYW1lLmh0bX0Kd2lkZ2V0IHBhY2thZ2VzIGEgZnJhbWUgd2lkZ2V0IGFuZCBhIGxhYmVsIGludG8gb25lIG1lZ2Egd2lkZ2V0LiAgVG8KY3JlYXRlIHdpZGdldHMgaW5zaWRlIGEgTGFiZWxGcmFtZSB3aWRnZXQsIG9uZSBjcmVhdGVzIHRoZSBuZXcgd2lkZ2V0cwpyZWxhdGl2ZSB0byB0aGUgXG1lbWJlcntmcmFtZX0gc3Vid2lkZ2V0IGFuZCBtYW5hZ2UgdGhlbSBpbnNpZGUgdGhlClxtZW1iZXJ7ZnJhbWV9IHN1YndpZGdldC4KXGVuZHtjbGFzc2Rlc2N9CgolIFB5dGhvbiBEZW1vIG9mOgolIFx1bGlua3tMYWJlbEZyYW1lfXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvZGVtb3Mvc2FtcGxlcy9MYWJGcmFtZS50Y2x9CgpcYmVnaW57Y2xhc3NkZXNjfXtNZXRlcn17fQpUaGUgXHVsaW5re01ldGVyfQp7aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L21hbi9odG1sL1RpeENtZC90aXhNZXRlci5odG19CndpZGdldCBjYW4gYmUgdXNlZCB0byBzaG93IHRoZSBwcm9ncmVzcyBvZiBhIGJhY2tncm91bmQgam9iIHdoaWNoIG1heQp0YWtlIGEgbG9uZyB0aW1lIHRvIGV4ZWN1dGUuClxlbmR7Y2xhc3NkZXNjfQoKJSBQeXRob24gRGVtbyBvZjoKJSBcdWxpbmt7TWV0ZXJ9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL01ldGVyLnRjbH0KClxiZWdpbntjbGFzc2Rlc2N9e09wdGlvbk1lbnV9e30KVGhlIFx1bGlua3tPcHRpb25NZW51fQp7aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L21hbi9odG1sL1RpeENtZC90aXhPcHRpb25NZW51Lmh0bX0KY3JlYXRlcyBhIG1lbnUgYnV0dG9uIG9mIG9wdGlvbnMuClxlbmR7Y2xhc3NkZXNjfQoKJSBQeXRob24gRGVtbyBvZjoKJSBcdWxpbmt7T3B0aW9uTWVudX17aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L2RlbW9zL3NhbXBsZXMvT3B0TWVudS50Y2x9CgpcYmVnaW57Y2xhc3NkZXNjfXtQb3B1cE1lbnV9e30KVGhlIFx1bGlua3tQb3B1cE1lbnV9CntodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvbWFuL2h0bWwvVGl4Q21kL3RpeFBvcHVwTWVudS5odG19CndpZGdldCBjYW4gYmUgdXNlZCBhcyBhIHJlcGxhY2VtZW50IG9mIHRoZSBcY29kZXt0a19wb3B1cH0KY29tbWFuZC4gVGhlIGFkdmFudGFnZSBvZiB0aGUgXHJlZm1vZHVsZXtUaXh9IFxjbGFzc3tQb3B1cE1lbnV9IHdpZGdldAppcyBpdCByZXF1aXJlcyBsZXNzIGFwcGxpY2F0aW9uIGNvZGUgdG8gbWFuaXB1bGF0ZS4KXGVuZHtjbGFzc2Rlc2N9CgolIFB5dGhvbiBEZW1vIG9mOgolIFx1bGlua3tQb3B1cE1lbnV9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL1BvcE1lbnUudGNsfQoKXGJlZ2lue2NsYXNzZGVzY317U2VsZWN0fXt9ClRoZSBcdWxpbmt7U2VsZWN0fQp7aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L21hbi9odG1sL1RpeENtZC90aXhTZWxlY3QuaHRtfQp3aWRnZXQgaXMgYSBjb250YWluZXIgb2YgYnV0dG9uIHN1YndpZGdldHMuIEl0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUKcmFkaW8tYm94IG9yIGNoZWNrLWJveCBzdHlsZSBvZiBzZWxlY3Rpb24gb3B0aW9ucyBmb3IgdGhlIHVzZXIuClxlbmR7Y2xhc3NkZXNjfQoKJSBQeXRob24gRGVtbyBvZjoKJSBcdWxpbmt7U2VsZWN0fXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvZGVtb3Mvc2FtcGxlcy9TZWxlY3QudGNsfQoKXGJlZ2lue2NsYXNzZGVzY317U3RkQnV0dG9uQm94fXt9ClRoZSBcdWxpbmt7U3RkQnV0dG9uQm94fQp7aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L21hbi9odG1sL1RpeENtZC90aXhTdGRCdXR0b25Cb3guaHRtfQp3aWRnZXQgaXMgYSBncm91cCBvZiBzdGFuZGFyZCBidXR0b25zIGZvciBNb3RpZi1saWtlIGRpYWxvZyBib3hlcy4KXGVuZHtjbGFzc2Rlc2N9CgolIFB5dGhvbiBEZW1vIG9mOgolIFx1bGlua3tTdGRCdXR0b25Cb3h9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL1N0ZEJCb3gudGNsfQoKClxzdWJzdWJzZWN0aW9ue0ZpbGUgU2VsZWN0b3JzfQoKXGJlZ2lue2NsYXNzZGVzY317RGlyTGlzdH17fQpUaGUgXHVsaW5re0Rpckxpc3R9CntodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvbWFuL2h0bWwvVGl4Q21kL3RpeERpckxpc3QuaHRtfSB3aWRnZXQKZGlzcGxheXMgYSBsaXN0IHZpZXcgb2YgYSBkaXJlY3RvcnksIGl0cyBwcmV2aW91cyBkaXJlY3RvcmllcyBhbmQgaXRzCnN1Yi1kaXJlY3Rvcmllcy4gVGhlIHVzZXIgY2FuIGNob29zZSBvbmUgb2YgdGhlIGRpcmVjdG9yaWVzIGRpc3BsYXllZAppbiB0aGUgbGlzdCBvciBjaGFuZ2UgdG8gYW5vdGhlciBkaXJlY3RvcnkuClxlbmR7Y2xhc3NkZXNjfQoKJSBQeXRob24gRGVtbyBvZjoKJSBcdWxpbmt7RGlyTGlzdH17aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L2RlbW9zL3NhbXBsZXMvRGlyTGlzdC50Y2x9CgpcYmVnaW57Y2xhc3NkZXNjfXtEaXJUcmVlfXt9ClRoZSBcdWxpbmt7RGlyVHJlZX0Ke2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9tYW4vaHRtbC9UaXhDbWQvdGl4RGlyVHJlZS5odG19CndpZGdldCBkaXNwbGF5cyBhIHRyZWUgdmlldyBvZiBhIGRpcmVjdG9yeSwgaXRzIHByZXZpb3VzIGRpcmVjdG9yaWVzCmFuZCBpdHMgc3ViLWRpcmVjdG9yaWVzLiBUaGUgdXNlciBjYW4gY2hvb3NlIG9uZSBvZiB0aGUgZGlyZWN0b3JpZXMKZGlzcGxheWVkIGluIHRoZSBsaXN0IG9yIGNoYW5nZSB0byBhbm90aGVyIGRpcmVjdG9yeS4KXGVuZHtjbGFzc2Rlc2N9CgolIFB5dGhvbiBEZW1vIG9mOgolIFx1bGlua3tEaXJUcmVlfXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvZGVtb3Mvc2FtcGxlcy9EaXJUcmVlLnRjbH0KClxiZWdpbntjbGFzc2Rlc2N9e0RpclNlbGVjdERpYWxvZ317fQpUaGUgXHVsaW5re0RpclNlbGVjdERpYWxvZ30Ke2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9tYW4vaHRtbC9UaXhDbWQvdGl4RGlyU2VsZWN0RGlhbG9nLmh0bX0Kd2lkZ2V0IHByZXNlbnRzIHRoZSBkaXJlY3RvcmllcyBpbiB0aGUgZmlsZSBzeXN0ZW0gaW4gYSBkaWFsb2cKd2luZG93LiAgVGhlIHVzZXIgY2FuIHVzZSB0aGlzIGRpYWxvZyB3aW5kb3cgdG8gbmF2aWdhdGUgdGhyb3VnaCB0aGUKZmlsZSBzeXN0ZW0gdG8gc2VsZWN0IHRoZSBkZXNpcmVkIGRpcmVjdG9yeS4KXGVuZHtjbGFzc2Rlc2N9CgolIFB5dGhvbiBEZW1vIG9mOgolIFx1bGlua3tEaXJTZWxlY3REaWFsb2d9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL0RpckRsZy50Y2x9CgpcYmVnaW57Y2xhc3NkZXNjfXtEaXJTZWxlY3RCb3h9e30KVGhlIFxjbGFzc3tEaXJTZWxlY3RCb3h9IGlzIHNpbWlsYXIKdG8gdGhlIHN0YW5kYXJkIE1vdGlmKFRNKSBkaXJlY3Rvcnktc2VsZWN0aW9uIGJveC4gSXQgaXMgZ2VuZXJhbGx5IHVzZWQgZm9yCnRoZSB1c2VyIHRvIGNob29zZSBhIGRpcmVjdG9yeS4gRGlyU2VsZWN0Qm94IHN0b3JlcyB0aGUgZGlyZWN0b3JpZXMgbW9zdGx5CnJlY2VudGx5IHNlbGVjdGVkIGludG8gYSBDb21ib0JveCB3aWRnZXQgc28gdGhhdCB0aGV5IGNhbiBiZSBxdWlja2x5CnNlbGVjdGVkIGFnYWluLgpcZW5ke2NsYXNzZGVzY30KClxiZWdpbntjbGFzc2Rlc2N9e0V4RmlsZVNlbGVjdEJveH17fQpUaGUgXHVsaW5re0V4RmlsZVNlbGVjdEJveH0Ke2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9tYW4vaHRtbC9UaXhDbWQvdGl4RXhGaWxlU2VsZWN0Qm94Lmh0bX0Kd2lkZ2V0IGlzIHVzdWFsbHkgZW1iZWRkZWQgaW4gYSB0aXhFeEZpbGVTZWxlY3REaWFsb2cgd2lkZ2V0LiBJdApwcm92aWRlcyBhbiBjb252ZW5pZW50IG1ldGhvZCBmb3IgdGhlIHVzZXIgdG8gc2VsZWN0IGZpbGVzLiBUaGUgc3R5bGUKb2YgdGhlIFxjbGFzc3tFeEZpbGVTZWxlY3RCb3h9IHdpZGdldCBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhlIHN0YW5kYXJkCmZpbGUgZGlhbG9nIG9uIE1TIFdpbmRvd3MgMy4xLgpcZW5ke2NsYXNzZGVzY30KCiUgUHl0aG9uIERlbW8gb2Y6CiVcdWxpbmt7RXhGaWxlU2VsZWN0RGlhbG9nfXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvZGVtb3Mvc2FtcGxlcy9FRmlsZURsZy50Y2x9CgpcYmVnaW57Y2xhc3NkZXNjfXtGaWxlU2VsZWN0Qm94fXt9ClRoZSBcdWxpbmt7RmlsZVNlbGVjdEJveH0Ke2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9tYW4vaHRtbC9UaXhDbWQvdGl4RmlsZVNlbGVjdEJveC5odG19CmlzIHNpbWlsYXIgdG8gdGhlIHN0YW5kYXJkIE1vdGlmKFRNKSBmaWxlLXNlbGVjdGlvbiBib3guIEl0IGlzCmdlbmVyYWxseSB1c2VkIGZvciB0aGUgdXNlciB0byBjaG9vc2UgYSBmaWxlLiBGaWxlU2VsZWN0Qm94IHN0b3JlcyB0aGUKZmlsZXMgbW9zdGx5IHJlY2VudGx5IHNlbGVjdGVkIGludG8gYSBcY2xhc3N7Q29tYm9Cb3h9IHdpZGdldCBzbyB0aGF0CnRoZXkgY2FuIGJlIHF1aWNrbHkgc2VsZWN0ZWQgYWdhaW4uClxlbmR7Y2xhc3NkZXNjfQoKJSBQeXRob24gRGVtbyBvZjoKJSBcdWxpbmt7RmlsZVNlbGVjdERpYWxvZ317aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L2RlbW9zL3NhbXBsZXMvRmlsZURsZy50Y2x9CgpcYmVnaW57Y2xhc3NkZXNjfXtGaWxlRW50cnl9e30KVGhlIFx1bGlua3tGaWxlRW50cnl9CntodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvbWFuL2h0bWwvVGl4Q21kL3RpeEZpbGVFbnRyeS5odG19CndpZGdldCBjYW4gYmUgdXNlZCB0byBpbnB1dCBhIGZpbGVuYW1lLiBUaGUgdXNlciBjYW4gdHlwZSBpbiB0aGUKZmlsZW5hbWUgbWFudWFsbHkuIEFsdGVybmF0aXZlbHksIHRoZSB1c2VyIGNhbiBwcmVzcyB0aGUgYnV0dG9uIHdpZGdldAp0aGF0IHNpdHMgbmV4dCB0byB0aGUgZW50cnksIHdoaWNoIHdpbGwgYnJpbmcgdXAgYSBmaWxlIHNlbGVjdGlvbgpkaWFsb2cuClxlbmR7Y2xhc3NkZXNjfQoKJSBQeXRob24gRGVtbyBvZjoKJSBcdWxpbmt7RmlsZUVudHJ5fXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvZGVtb3Mvc2FtcGxlcy9GaWxlRW50LnRjbH0KCgpcc3Vic3Vic2VjdGlvbntIaWVyYWNoaWNhbCBMaXN0Qm94fQoKXGJlZ2lue2NsYXNzZGVzY317SExpc3R9e30KVGhlIFx1bGlua3tITGlzdH0Ke2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9tYW4vaHRtbC9UaXhDbWQvdGl4SExpc3QuaHRtfQp3aWRnZXQgY2FuIGJlIHVzZWQgdG8gZGlzcGxheSBhbnkgZGF0YSB0aGF0IGhhdmUgYSBoaWVyYXJjaGljYWwKc3RydWN0dXJlLCBmb3IgZXhhbXBsZSwgZmlsZSBzeXN0ZW0gZGlyZWN0b3J5IHRyZWVzLiBUaGUgbGlzdCBlbnRyaWVzCmFyZSBpbmRlbnRlZCBhbmQgY29ubmVjdGVkIGJ5IGJyYW5jaCBsaW5lcyBhY2NvcmRpbmcgdG8gdGhlaXIgcGxhY2VzCmluIHRoZSBoaWVyYXJjaHkuClxlbmR7Y2xhc3NkZXNjfQoKJSBQeXRob24gRGVtbyBvZjoKJSBcdWxpbmt7SExpc3R9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL0hMaXN0MS50Y2x9CgpcYmVnaW57Y2xhc3NkZXNjfXtDaGVja0xpc3R9e30KVGhlIFx1bGlua3tDaGVja0xpc3R9CntodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvbWFuL2h0bWwvVGl4Q21kL3RpeENoZWNrTGlzdC5odG19CndpZGdldCBkaXNwbGF5cyBhIGxpc3Qgb2YgaXRlbXMgdG8gYmUgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIENoZWNrTGlzdAphY3RzIHNpbWlsYXJseSB0byB0aGUgVGsgY2hlY2tidXR0b24gb3IgcmFkaW9idXR0b24gd2lkZ2V0cywgZXhjZXB0IGl0CmlzIGNhcGFibGUgb2YgaGFuZGxpbmcgbWFueSBtb3JlIGl0ZW1zIHRoYW4gY2hlY2tidXR0b25zIG9yCnJhZGlvYnV0dG9ucy4KXGVuZHtjbGFzc2Rlc2N9CgolIFB5dGhvbiBEZW1vIG9mOgolIFx1bGlua3sgQ2hlY2tMaXN0fXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvZGVtb3Mvc2FtcGxlcy9DaGtMaXN0LnRjbH0KJSBQeXRob24gRGVtbyBvZjoKJSBcdWxpbmt7U2Nyb2xsZWRITGlzdCAoMSl9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL1NITGlzdC50Y2x9CiUgUHl0aG9uIERlbW8gb2Y6CiUgXHVsaW5re1Njcm9sbGVkSExpc3QgKDIpfXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvZGVtb3Mvc2FtcGxlcy9TSExpc3QyLnRjbH0KClxiZWdpbntjbGFzc2Rlc2N9e1RyZWV9e30KVGhlIFx1bGlua3tUcmVlfQp7aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L21hbi9odG1sL1RpeENtZC90aXhUcmVlLmh0bX0Kd2lkZ2V0IGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgaGllcmFyY2hpY2FsIGRhdGEgaW4gYSB0cmVlIGZvcm0uIFRoZQp1c2VyIGNhbiBhZGp1c3QgdGhlIHZpZXcgb2YgdGhlIHRyZWUgYnkgb3BlbmluZyBvciBjbG9zaW5nIHBhcnRzIG9mCnRoZSB0cmVlLgpcZW5ke2NsYXNzZGVzY30KCiUgUHl0aG9uIERlbW8gb2Y6CiUgXHVsaW5re1RyZWV9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL1RyZWUudGNsfQoKJSBQeXRob24gRGVtbyBvZjoKJSBcdWxpbmt7VHJlZSAoRHluYW1pYyl9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL0R5blRyZWUudGNsfQoKClxzdWJzdWJzZWN0aW9ue1RhYnVsYXIgTGlzdEJveH0KClxiZWdpbntjbGFzc2Rlc2N9e1RMaXN0fXt9ClRoZSBcdWxpbmt7VExpc3R9CntodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvbWFuL2h0bWwvVGl4Q21kL3RpeFRMaXN0Lmh0bX0Kd2lkZ2V0IGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgZGF0YSBpbiBhIHRhYnVsYXIgZm9ybWF0LiBUaGUgbGlzdAplbnRyaWVzIG9mIGEgXGNsYXNze1RMaXN0fSB3aWRnZXQgYXJlIHNpbWlsYXIgdG8gdGhlIGVudHJpZXMgaW4gdGhlIFRrCmxpc3Rib3ggd2lkZ2V0LiAgVGhlIG1haW4gZGlmZmVyZW5jZXMgYXJlICgxKSB0aGUgXGNsYXNze1RMaXN0fSB3aWRnZXQKY2FuIGRpc3BsYXkgdGhlIGxpc3QgZW50cmllcyBpbiBhIHR3byBkaW1lbnNpb25hbCBmb3JtYXQgYW5kICgyKSB5b3UKY2FuIHVzZSBncmFwaGljYWwgaW1hZ2VzIGFzIHdlbGwgYXMgbXVsdGlwbGUgY29sb3JzIGFuZCBmb250cyBmb3IgdGhlCmxpc3QgZW50cmllcy4KXGVuZHtjbGFzc2Rlc2N9CgolIFB5dGhvbiBEZW1vIG9mOgolIFx1bGlua3tTY3JvbGxlZFRMaXN0ICgxKX17aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L2RlbW9zL3NhbXBsZXMvU1RMaXN0MS50Y2x9CiUgUHl0aG9uIERlbW8gb2Y6CiUgXHVsaW5re1Njcm9sbGVkVExpc3QgKDIpfXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvZGVtb3Mvc2FtcGxlcy9TVExpc3QyLnRjbH0KCiUgR3JpZCBoYXMgeWV0IHRvIGJlIGFkZGVkIHRvIFB5dGhvbgolIFxzdWJzdWJzZWN0aW9ue0dyaWQgV2lkZ2V0fQolIFB5dGhvbiBEZW1vIG9mOgolIFx1bGlua3tTaW1wbGUgR3JpZH17aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L2RlbW9zL3NhbXBsZXMvU0dyaWQwLnRjbH0KJSBQeXRob24gRGVtbyBvZjoKJSBcdWxpbmt7U2Nyb2xsZWRHcmlkfXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvZGVtb3Mvc2FtcGxlcy9TR3JpZDEudGNsfQolIFB5dGhvbiBEZW1vIG9mOgolIFx1bGlua3tFZGl0YWJsZSBHcmlkfXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvZGVtb3Mvc2FtcGxlcy9FZGl0R3JpZC50Y2x9CgoKXHN1YnN1YnNlY3Rpb257TWFuYWdlciBXaWRnZXRzfQoKXGJlZ2lue2NsYXNzZGVzY317UGFuZWRXaW5kb3d9e30KVGhlIFx1bGlua3tQYW5lZFdpbmRvd30Ke2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9tYW4vaHRtbC9UaXhDbWQvdGl4UGFuZWRXaW5kb3cuaHRtfQp3aWRnZXQgYWxsb3dzIHRoZSB1c2VyIHRvIGludGVyYWN0aXZlbHkgbWFuaXB1bGF0ZSB0aGUgc2l6ZXMgb2YKc2V2ZXJhbCBwYW5lcy4gIFRoZSBwYW5lcyBjYW4gYmUgYXJyYW5nZWQgZWl0aGVyIHZlcnRpY2FsbHkgb3IKaG9yaXpvbnRhbGx5LiAgVGhlIHVzZXIgY2hhbmdlcyB0aGUgc2l6ZXMgb2YgdGhlIHBhbmVzIGJ5IGRyYWdnaW5nIHRoZQpyZXNpemUgaGFuZGxlIGJldHdlZW4gdHdvIHBhbmVzLgpcZW5ke2NsYXNzZGVzY30KCiUgUHl0aG9uIERlbW8gb2Y6CiUgXHVsaW5re1BhbmVkV2luZG93fXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvZGVtb3Mvc2FtcGxlcy9QYW5lZFdpbi50Y2x9CgpcYmVnaW57Y2xhc3NkZXNjfXtMaXN0Tm90ZUJvb2t9e30KVGhlIFx1bGlua3tMaXN0Tm90ZUJvb2t9CntodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvbWFuL2h0bWwvVGl4Q21kL3RpeExpc3ROb3RlQm9vay5odG19CndpZGdldCBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhlIFxjbGFzc3tUaXhOb3RlQm9va30gd2lkZ2V0OiBpdCBjYW4gYmUKdXNlZCB0byBkaXNwbGF5IG1hbnkgd2luZG93cyBpbiBhIGxpbWl0ZWQgc3BhY2UgdXNpbmcgYSBub3RlYm9vawptZXRhcGhvci4gVGhlIG5vdGVib29rIGlzIGRpdmlkZWQgaW50byBhIHN0YWNrIG9mIHBhZ2VzICh3aW5kb3dzKS4gQXQKb25lIHRpbWUgb25seSBvbmUgb2YgdGhlc2UgcGFnZXMgY2FuIGJlIHNob3duLiBUaGUgdXNlciBjYW4gbmF2aWdhdGUKdGhyb3VnaCB0aGVzZSBwYWdlcyBieSBjaG9vc2luZyB0aGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBwYWdlIGluIHRoZQpcbWVtYmVye2hsaXN0fSBzdWJ3aWRnZXQuClxlbmR7Y2xhc3NkZXNjfQoKJSBQeXRob24gRGVtbyBvZjoKJSBcdWxpbmt7TGlzdE5vdGVCb29rfXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvZGVtb3Mvc2FtcGxlcy9MaXN0TkJLLnRjbH0KClxiZWdpbntjbGFzc2Rlc2N9e05vdGVCb29rfXt9ClRoZSBcdWxpbmt7Tm90ZUJvb2t9CntodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvbWFuL2h0bWwvVGl4Q21kL3RpeE5vdGVCb29rLmh0bX0Kd2lkZ2V0IGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgbWFueSB3aW5kb3dzIGluIGEgbGltaXRlZCBzcGFjZSB1c2luZyBhCm5vdGVib29rIG1ldGFwaG9yLiBUaGUgbm90ZWJvb2sgaXMgZGl2aWRlZCBpbnRvIGEgc3RhY2sgb2YgcGFnZXMuIEF0Cm9uZSB0aW1lIG9ubHkgb25lIG9mIHRoZXNlIHBhZ2VzIGNhbiBiZSBzaG93bi4gVGhlIHVzZXIgY2FuIG5hdmlnYXRlCnRocm91Z2ggdGhlc2UgcGFnZXMgYnkgY2hvb3NpbmcgdGhlIHZpc3VhbCBgYHRhYnMnJyBhdCB0aGUgdG9wIG9mIHRoZQpOb3RlQm9vayB3aWRnZXQuClxlbmR7Y2xhc3NkZXNjfQoKJSBQeXRob24gRGVtbyBvZjoKJSBcdWxpbmt7Tm90ZUJvb2t9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL05vdGVCb29rLnRjbH0KCgolIFxzdWJzdWJzZWN0aW9ue1Njcm9sbGVkIFdpZGdldHN9CiUgUHl0aG9uIERlbW8gb2Y6CiUgXHVsaW5re1Njcm9sbGVkTGlzdEJveH17aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L2RlbW9zL3NhbXBsZXMvU0xpc3RCb3gudGNsfQolIFB5dGhvbiBEZW1vIG9mOgolIFx1bGlua3tTY3JvbGxlZFRleHR9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL1NUZXh0LnRjbH0KJSBQeXRob24gRGVtbyBvZjoKJSBcdWxpbmt7U2Nyb2xsZWRXaW5kb3d9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL1NXaW5kb3cudGNsfQolIFB5dGhvbiBEZW1vIG9mOgolIFx1bGlua3tDYW52YXMgT2JqZWN0IFZpZXd9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL0NPYmpWaWV3LnRjbH0KCgpcc3Vic3Vic2VjdGlvbntJbWFnZSBUeXBlc30KClRoZSBccmVmbW9kdWxle1RpeH0gbW9kdWxlIGFkZHM6ClxiZWdpbntpdGVtaXplfQpcaXRlbSAKXHVsaW5re3BpeG1hcH0Ke2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9tYW4vaHRtbC9UaXhDbWQvcGl4bWFwLmh0bX0KY2FwYWJpbGl0aWVzIHRvIGFsbCBccmVmbW9kdWxle1RpeH0gYW5kIFxyZWZtb2R1bGV7VGtpbnRlcn0gd2lkZ2V0cyB0bwpjcmVhdGUgY29sb3IgaW1hZ2VzIGZyb20gWFBNIGZpbGVzLgoKJSBQeXRob24gRGVtbyBvZjoKJSBcdWxpbmt7WFBNIEltYWdlIEluIEJ1dHRvbn17aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L2RlbW9zL3NhbXBsZXMvWHBtLnRjbH0KCiUgUHl0aG9uIERlbW8gb2Y6CiUgXHVsaW5re1hQTSBJbWFnZSBJbiBNZW51fXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvZGVtb3Mvc2FtcGxlcy9YcG0xLnRjbH0KClxpdGVtClx1bGlua3tDb21wb3VuZH0Ke2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9tYW4vaHRtbC9UaXhDbWQvY29tcG91bmQuaHRtfQppbWFnZSB0eXBlcyBjYW4gYmUgdXNlZCB0byBjcmVhdGUgaW1hZ2VzIHRoYXQgY29uc2lzdHMgb2YgbXVsdGlwbGUKaG9yaXpvbnRhbCBsaW5lczsgZWFjaCBsaW5lIGlzIGNvbXBvc2VkIG9mIGEgc2VyaWVzIG9mIGl0ZW1zICh0ZXh0cywKYml0bWFwcywgaW1hZ2VzIG9yIHNwYWNlcykgYXJyYW5nZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LiBGb3IgZXhhbXBsZSwgYQpjb21wb3VuZCBpbWFnZSBjYW4gYmUgdXNlZCB0byBkaXNwbGF5IGEgYml0bWFwIGFuZCBhIHRleHQgc3RyaW5nCnNpbXVsdGFuZW91c2x5IGluIGEgVGsgXGNsYXNze0J1dHRvbn0gd2lkZ2V0LgoKJSBQeXRob24gRGVtbyBvZjoKJSBcdWxpbmt7Q29tcG91bmQgSW1hZ2UgSW4gQnV0dG9uc317aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L2RlbW9zL3NhbXBsZXMvQ21wSW1nLnRjbH0KCiUgUHl0aG9uIERlbW8gb2Y6CiUgXHVsaW5re0NvbXBvdW5kIEltYWdlIEluIE5vdGVCb29rfXtodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvZGVtb3Mvc2FtcGxlcy9DbXBJbWcyLnRjbH0KCiUgUHl0aG9uIERlbW8gb2Y6CiUgXHVsaW5re0NvbXBvdW5kIEltYWdlIE5vdGVib29rIENvbG9yIFRhYnN9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL0NtcEltZzQudGNsfQoKJSBQeXRob24gRGVtbyBvZjoKJSBcdWxpbmt7Q29tcG91bmQgSW1hZ2UgSWNvbnN9e2h0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0L2Rpc3QvY3VycmVudC9kZW1vcy9zYW1wbGVzL0NtcEltZzMudGNsfQpcZW5ke2l0ZW1pemV9CgoKXHN1YnN1YnNlY3Rpb257TWlzY2VsbGFuZW91cyBXaWRnZXRzfQoKXGJlZ2lue2NsYXNzZGVzY317SW5wdXRPbmx5fXt9ClRoZSBcdWxpbmt7SW5wdXRPbmx5fQp7aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L21hbi9odG1sL1RpeENtZC90aXhJbnB1dE9ubHkuaHRtfQp3aWRnZXRzIGFyZSB0byBhY2NlcHQgaW5wdXRzIGZyb20gdGhlIHVzZXIsIHdoaWNoIGNhbiBiZSBkb25lIHdpdGggdGhlClxjb2Rle2JpbmR9IGNvbW1hbmQgKFxVTklYe30gb25seSkuClxlbmR7Y2xhc3NkZXNjfQoKXHN1YnN1YnNlY3Rpb257Rm9ybSBHZW9tZXRyeSBNYW5hZ2VyfQoKSW4gYWRkaXRpb24sIFxyZWZtb2R1bGV7VGl4fSBhdWdtZW50cyBccmVmbW9kdWxle1RraW50ZXJ9IGJ5IHByb3ZpZGluZzoKClxiZWdpbntjbGFzc2Rlc2N9e0Zvcm19e30KVGhlIFx1bGlua3tGb3JtfQp7aHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQvZGlzdC9jdXJyZW50L21hbi9odG1sL1RpeENtZC90aXhGb3JtLmh0bX0KZ2VvbWV0cnkgbWFuYWdlciBiYXNlZCBvbiBhdHRhY2htZW50IHJ1bGVzIGZvciBhbGwgVGsgd2lkZ2V0cy4KXGVuZHtjbGFzc2Rlc2N9CgoKJWJlZ2lue2xhdGV4b25seX0KJVxzdWJzZWN0aW9ue1RpeCBDbGFzcyBTdHJ1Y3R1cmV9CiUKJVxiZWdpbntmaWd1cmV9W2hidHBdCiVcY2VudGVybGluZXtcZXBzZmlne2ZpbGU9aGllcmFyY2h5LnBuZyx3aWR0aD0uOVx0ZXh0d2lkdGh9fQolXHZzcGFjZXsuNWNtfQolXGNhcHRpb257VGhlIENsYXNzIEhpZXJhcmNoeSBvZiBUaXggV2lkZ2V0c30KJVxlbmR7ZmlndXJlfQolZW5ke2xhdGV4b25seX0KClxzdWJzZWN0aW9ue1RpeCBDb21tYW5kc30KClxiZWdpbntjbGFzc2Rlc2N9e3RpeENvbW1hbmR9e30KVGhlIFx1bGlua3t0aXggY29tbWFuZHN9CntodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldC9kaXN0L2N1cnJlbnQvbWFuL2h0bWwvVGl4Q21kL3RpeC5odG19CnByb3ZpZGUgYWNjZXNzIHRvIG1pc2NlbGxhbmVvdXMgZWxlbWVudHMgb2YgXHJlZm1vZHVsZXtUaXh9J3MgaW50ZXJuYWwKc3RhdGUgYW5kIHRoZSAgXHJlZm1vZHVsZXtUaXh9IGFwcGxpY2F0aW9uIGNvbnRleHQuICBNb3N0IG9mIHRoZSBpbmZvcm1hdGlvbgptYW5pcHVsYXRlZCBieSB0aGVzZSBtZXRob2RzIHBlcnRhaW5zIHRvIHRoZSBhcHBsaWNhdGlvbiBhcyBhIHdob2xlLApvciB0byBhIHNjcmVlbiBvciBkaXNwbGF5LCByYXRoZXIgdGhhbiB0byBhIHBhcnRpY3VsYXIgd2luZG93LgoKVG8gdmlldyB0aGUgY3VycmVudCBzZXR0aW5ncywgdGhlIGNvbW1vbiB1c2FnZSBpczoKXGJlZ2lue3ZlcmJhdGltfQppbXBvcnQgVGl4CnJvb3QgPSBUaXguVGsoKQpwcmludCByb290LnRpeF9jb25maWd1cmUoKQpcZW5ke3ZlcmJhdGltfQpcZW5ke2NsYXNzZGVzY30KClxiZWdpbnttZXRob2RkZXNjfXt0aXhfY29uZmlndXJlfXtcb3B0aW9uYWx7Y25mLH0gKiprd30KUXVlcnkgb3IgbW9kaWZ5IHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgb2YgdGhlIFRpeCBhcHBsaWNhdGlvbgpjb250ZXh0LiBJZiBubyBvcHRpb24gaXMgc3BlY2lmaWVkLCByZXR1cm5zIGEgZGljdGlvbmFyeSBhbGwgb2YgdGhlCmF2YWlsYWJsZSBvcHRpb25zLiAgSWYgb3B0aW9uIGlzIHNwZWNpZmllZCB3aXRoIG5vIHZhbHVlLCB0aGVuIHRoZQptZXRob2QgcmV0dXJucyBhIGxpc3QgZGVzY3JpYmluZyB0aGUgb25lIG5hbWVkIG9wdGlvbiAodGhpcyBsaXN0IHdpbGwKYmUgaWRlbnRpY2FsIHRvIHRoZSBjb3JyZXNwb25kaW5nIHN1Ymxpc3Qgb2YgdGhlIHZhbHVlIHJldHVybmVkIGlmIG5vCm9wdGlvbiBpcyBzcGVjaWZpZWQpLiAgSWYgb25lIG9yIG1vcmUgb3B0aW9uLXZhbHVlIHBhaXJzIGFyZQpzcGVjaWZpZWQsIHRoZW4gdGhlIG1ldGhvZCBtb2RpZmllcyB0aGUgZ2l2ZW4gb3B0aW9uKHMpIHRvIGhhdmUgdGhlCmdpdmVuIHZhbHVlKHMpOyBpbiB0aGlzIGNhc2UgdGhlIG1ldGhvZCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4KT3B0aW9uIG1heSBiZSBhbnkgb2YgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9e3RpeF9jZ2V0fXtvcHRpb259ClJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGdpdmVuIGJ5Clx2YXJ7b3B0aW9ufS4gT3B0aW9uIG1heSBiZSBhbnkgb2YgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9e3RpeF9nZXRiaXRtYXB9e25hbWV9CkxvY2F0ZXMgYSBiaXRtYXAgZmlsZSBvZiB0aGUgbmFtZSBcY29kZXtuYW1lLnhwbX0gb3IgXGNvZGV7bmFtZX0gaW4Kb25lIG9mIHRoZSBiaXRtYXAgZGlyZWN0b3JpZXMgKHNlZSB0aGUgXG1ldGhvZHt0aXhfYWRkYml0bWFwZGlyKCl9Cm1ldGhvZCkuICBCeSB1c2luZyBcbWV0aG9ke3RpeF9nZXRiaXRtYXAoKX0sIHlvdSBjYW4gYXZvaWQgaGFyZApjb2RpbmcgdGhlIHBhdGhuYW1lcyBvZiB0aGUgYml0bWFwIGZpbGVzIGluIHlvdXIgYXBwbGljYXRpb24uIFdoZW4Kc3VjY2Vzc2Z1bCwgaXQgcmV0dXJucyB0aGUgY29tcGxldGUgcGF0aG5hbWUgb2YgdGhlIGJpdG1hcCBmaWxlLApwcmVmaXhlZCB3aXRoIHRoZSBjaGFyYWN0ZXIgXHNhbXB7QH0uICBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlIHVzZWQgdG8KY29uZmlndXJlIHRoZSBcY29kZXtiaXRtYXB9IG9wdGlvbiBvZiB0aGUgVGsgYW5kIFRpeCB3aWRnZXRzLgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY317dGl4X2FkZGJpdG1hcGRpcn17ZGlyZWN0b3J5fQpUaXggbWFpbnRhaW5zIGEgbGlzdCBvZiBkaXJlY3RvcmllcyB1bmRlciB3aGljaCB0aGUKXG1ldGhvZHt0aXhfZ2V0aW1hZ2UoKX0gYW5kIFxtZXRob2R7dGl4X2dldGJpdG1hcCgpfSBtZXRob2RzIHdpbGwKc2VhcmNoIGZvciBpbWFnZSBmaWxlcy4gIFRoZSBzdGFuZGFyZCBiaXRtYXAgZGlyZWN0b3J5IGlzClxmaWxle1wkVElYX0xJQlJBUlkvYml0bWFwc30uIFRoZSBcbWV0aG9ke3RpeF9hZGRiaXRtYXBkaXIoKX0gbWV0aG9kCmFkZHMgXHZhcntkaXJlY3Rvcnl9IGludG8gdGhpcyBsaXN0LiBCeSB1c2luZyB0aGlzIG1ldGhvZCwgdGhlIGltYWdlCmZpbGVzIG9mIGFuIGFwcGxpY2F0aW9ucyBjYW4gYWxzbyBiZSBsb2NhdGVkIHVzaW5nIHRoZQpcbWV0aG9ke3RpeF9nZXRpbWFnZSgpfSBvciBcbWV0aG9ke3RpeF9nZXRiaXRtYXAoKX0gbWV0aG9kLgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY317dGl4X2ZpbGVkaWFsb2d9e1xvcHRpb25hbHtkbGdjbGFzc319ClJldHVybnMgdGhlIGZpbGUgc2VsZWN0aW9uIGRpYWxvZyB0aGF0IG1heSBiZSBzaGFyZWQgYW1vbmcgZGlmZmVyZW50CmNhbGxzIGZyb20gdGhpcyBhcHBsaWNhdGlvbi4gIFRoaXMgbWV0aG9kIHdpbGwgY3JlYXRlIGEgZmlsZSBzZWxlY3Rpb24KZGlhbG9nIHdpZGdldCB3aGVuIGl0IGlzIGNhbGxlZCB0aGUgZmlyc3QgdGltZS4gVGhpcyBkaWFsb2cgd2lsbCBiZQpyZXR1cm5lZCBieSBhbGwgc3Vic2VxdWVudCBjYWxscyB0byBcbWV0aG9ke3RpeF9maWxlZGlhbG9nKCl9LiAgQW4Kb3B0aW9uYWwgZGxnY2xhc3MgcGFyYW1ldGVyIGNhbiBiZSBwYXNzZWQgYXMgYSBzdHJpbmcgdG8gc3BlY2lmaWVkCndoYXQgdHlwZSBvZiBmaWxlIHNlbGVjdGlvbiBkaWFsb2cgd2lkZ2V0IGlzIGRlc2lyZWQuICBQb3NzaWJsZQpvcHRpb25zIGFyZSBcY29kZXt0aXh9LCBcY29kZXtGaWxlU2VsZWN0RGlhbG9nfSBvcgpcY29kZXt0aXhFeEZpbGVTZWxlY3REaWFsb2d9LgpcZW5ke21ldGhvZGRlc2N9CgoKXGJlZ2lue21ldGhvZGRlc2N9e3RpeF9nZXRpbWFnZX17c2VsZiwgbmFtZX0KTG9jYXRlcyBhbiBpbWFnZSBmaWxlIG9mIHRoZSBuYW1lIFxmaWxle25hbWUueHBtfSwgXGZpbGV7bmFtZS54Ym19IG9yClxmaWxle25hbWUucHBtfSBpbiBvbmUgb2YgdGhlIGJpdG1hcCBkaXJlY3RvcmllcyAoc2VlIHRoZQpcbWV0aG9ke3RpeF9hZGRiaXRtYXBkaXIoKX0gbWV0aG9kIGFib3ZlKS4gSWYgbW9yZSB0aGFuIG9uZSBmaWxlIHdpdGgKdGhlIHNhbWUgbmFtZSAoYnV0IGRpZmZlcmVudCBleHRlbnNpb25zKSBleGlzdCwgdGhlbiB0aGUgaW1hZ2UgdHlwZSBpcwpjaG9zZW4gYWNjb3JkaW5nIHRvIHRoZSBkZXB0aCBvZiB0aGUgWCBkaXNwbGF5OiB4Ym0gaW1hZ2VzIGFyZSBjaG9zZW4Kb24gbW9ub2Nocm9tZSBkaXNwbGF5cyBhbmQgY29sb3IgaW1hZ2VzIGFyZSBjaG9zZW4gb24gY29sb3IKZGlzcGxheXMuIEJ5IHVzaW5nIFxtZXRob2R7dGl4X2dldGltYWdlKCl9LCB5b3UgY2FuIGF2b2lkIGhhcmQgY29kaW5nCnRoZSBwYXRobmFtZXMgb2YgdGhlIGltYWdlIGZpbGVzIGluIHlvdXIgYXBwbGljYXRpb24uIFdoZW4gc3VjY2Vzc2Z1bCwKdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbmV3bHkgY3JlYXRlZCBpbWFnZSwgd2hpY2ggY2FuIGJlCnVzZWQgdG8gY29uZmlndXJlIHRoZSBcY29kZXtpbWFnZX0gb3B0aW9uIG9mIHRoZSBUayBhbmQgVGl4IHdpZGdldHMuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfXt0aXhfb3B0aW9uX2dldH17bmFtZX0KR2V0cyB0aGUgb3B0aW9ucyBtYWludGFpbmVkIGJ5IHRoZSBUaXggc2NoZW1lIG1lY2hhbmlzbS4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9e3RpeF9yZXNldG9wdGlvbnN9e25ld1NjaGVtZSwgbmV3Rm9udFNldFxvcHRpb25hbHssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTY21QcmlvfX0KUmVzZXRzIHRoZSBzY2hlbWUgYW5kIGZvbnRzZXQgb2YgdGhlIFRpeCBhcHBsaWNhdGlvbiB0bwpcdmFye25ld1NjaGVtZX0gYW5kIFx2YXJ7bmV3Rm9udFNldH0sIHJlc3BlY3RpdmVseS4gIFRoaXMgYWZmZWN0cyBvbmx5CnRob3NlIHdpZGdldHMgY3JlYXRlZCBhZnRlciB0aGlzIGNhbGwuICBUaGVyZWZvcmUsIGl0IGlzIGJlc3QgdG8gY2FsbAp0aGUgcmVzZXRvcHRpb25zIG1ldGhvZCBiZWZvcmUgdGhlIGNyZWF0aW9uIG9mIGFueSB3aWRnZXRzIGluIGEgVGl4CmFwcGxpY2F0aW9uLgoKVGhlIG9wdGlvbmFsIHBhcmFtZXRlciBcdmFye25ld1NjbVByaW99IGNhbiBiZSBnaXZlbiB0byByZXNldCB0aGUKcHJpb3JpdHkgbGV2ZWwgb2YgdGhlIFRrIG9wdGlvbnMgc2V0IGJ5IHRoZSBUaXggc2NoZW1lcy4KCkJlY2F1c2Ugb2YgdGhlIHdheSBUayBoYW5kbGVzIHRoZSBYIG9wdGlvbiBkYXRhYmFzZSwgYWZ0ZXIgVGl4IGhhcwpiZWVuIGhhcyBpbXBvcnRlZCBhbmQgaW5pdGVkLCBpdCBpcyBub3QgcG9zc2libGUgdG8gcmVzZXQgdGhlIGNvbG9yCnNjaGVtZXMgYW5kIGZvbnQgc2V0cyB1c2luZyB0aGUgXG1ldGhvZHt0aXhfY29uZmlnKCl9IG1ldGhvZC4KSW5zdGVhZCwgdGhlIFxtZXRob2R7dGl4X3Jlc2V0b3B0aW9ucygpfSBtZXRob2QgbXVzdCBiZSB1c2VkLgpcZW5ke21ldGhvZGRlc2N9CgoKClxzZWN0aW9ue1xtb2R1bGV7U2Nyb2xsZWRUZXh0fSAtLS0KICAgICAgICAgU2Nyb2xsZWQgVGV4dCBXaWRnZXR9CgpcZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17U2Nyb2xsZWRUZXh0fQogICBccGxhdGZvcm17VGt9Clxtb2R1bGVzeW5vcHNpc3tUZXh0IHdpZGdldCB3aXRoIGEgdmVydGljYWwgc2Nyb2xsIGJhci59ClxzZWN0aW9uYXV0aG9ye0ZyZWQgTC4gRHJha2UsIEpyLn17ZmRyYWtlQGFjbS5vcmd9CgpUaGUgXG1vZHVsZXtTY3JvbGxlZFRleHR9IG1vZHVsZSBwcm92aWRlcyBhIGNsYXNzIG9mIHRoZSBzYW1lIG5hbWUKd2hpY2ggaW1wbGVtZW50cyBhIGJhc2ljIHRleHQgd2lkZ2V0IHdoaWNoIGhhcyBhIHZlcnRpY2FsIHNjcm9sbCBiYXIKY29uZmlndXJlZCB0byBkbyB0aGUgYGByaWdodCB0aGluZy4nJyAgVXNpbmcgdGhlIFxjbGFzc3tTY3JvbGxlZFRleHR9CmNsYXNzIGlzIGEgbG90IGVhc2llciB0aGFuIHNldHRpbmcgdXAgYSB0ZXh0IHdpZGdldCBhbmQgc2Nyb2xsIGJhcgpkaXJlY3RseS4gIFRoZSBjb25zdHJ1Y3RvciBpcyB0aGUgc2FtZSBhcyB0aGF0IG9mIHRoZQpcY2xhc3N7VGtpbnRlci5UZXh0fSBjbGFzcy4KClRoZSB0ZXh0IHdpZGdldCBhbmQgc2Nyb2xsYmFyIGFyZSBwYWNrZWQgdG9nZXRoZXIgaW4gYSBcY2xhc3N7RnJhbWV9LAphbmQgdGhlIG1ldGhvZHMgb2YgdGhlIFxjbGFzc3tHcmlkfSBhbmQgXGNsYXNze1BhY2t9IGdlb21ldHJ5IG1hbmFnZXJzCmFyZSBhY3F1aXJlZCBmcm9tIHRoZSBcY2xhc3N7RnJhbWV9IG9iamVjdC4gIFRoaXMgYWxsb3dzIHRoZQpcY2xhc3N7U2Nyb2xsZWRUZXh0fSB3aWRnZXQgdG8gYmUgdXNlZCBkaXJlY3RseSB0byBhY2hpZXZlIG1vc3Qgbm9ybWFsCmdlb21ldHJ5IG1hbmFnZW1lbnQgYmVoYXZpb3IuCgpTaG91bGQgbW9yZSBzcGVjaWZpYyBjb250cm9sIGJlIG5lY2Vzc2FyeSwgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzCmFyZSBhdmFpbGFibGU6CgpcYmVnaW57bWVtYmVyZGVzY31bU2Nyb2xsZWRUZXh0XXtmcmFtZX0KICBUaGUgZnJhbWUgd2hpY2ggc3Vycm91bmRzIHRoZSB0ZXh0IGFuZCBzY3JvbGwgYmFyIHdpZGdldHMuClxlbmR7bWVtYmVyZGVzY30KClxiZWdpbnttZW1iZXJkZXNjfVtTY3JvbGxlZFRleHRde3ZiYXJ9CiAgVGhlIHNjcm9sbCBiYXIgd2lkZ2V0LgpcZW5ke21lbWJlcmRlc2N9CgoKXGlucHV0e2xpYnR1cnRsZX0KCgpcc2VjdGlvbntJZGxlIFxsYWJlbHtpZGxlfX0KCiVcZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17aWRsZX0KJVxtb2R1bGVzeW5vcHNpc3tBIFB5dGhvbiBJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50fQpcbW9kdWxlYXV0aG9ye0d1aWRvIHZhbiBSb3NzdW19e2d1aWRvQFB5dGhvbi5vcmd9CgpJZGxlIGlzIHRoZSBQeXRob24gSURFIGJ1aWx0IHdpdGggdGhlIFxyZWZtb2R1bGV7VGtpbnRlcn0gR1VJIHRvb2xraXQuICAKXGluZGV4e0lkbGV9ClxpbmRleHtQeXRob24gRWRpdG9yfQpcaW5kZXh7SW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudH0KCgpJRExFIGhhcyB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOgoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtICAgY29kZWQgaW4gMTAwXCUgcHVyZSBQeXRob24sIHVzaW5nIHRoZSBccmVmbW9kdWxle1RraW50ZXJ9IEdVSSB0b29sa2l0CgpcaXRlbSAgIGNyb3NzLXBsYXRmb3JtOiB3b3JrcyBvbiBXaW5kb3dzIGFuZCBcVU5JWHt9IChvbiBNYWMgT1MsIHRoZXJlIGFyZQpjdXJyZW50bHkgcHJvYmxlbXMgd2l0aCBUY2wvVGspCgpcaXRlbSAgIG11bHRpLXdpbmRvdyB0ZXh0IGVkaXRvciB3aXRoIG11bHRpcGxlIHVuZG8sIFB5dGhvbiBjb2xvcml6aW5nCmFuZCBtYW55IG90aGVyIGZlYXR1cmVzLCBlLmcuIHNtYXJ0IGluZGVudCBhbmQgY2FsbCB0aXBzCgpcaXRlbSAgIFB5dGhvbiBzaGVsbCB3aW5kb3cgKGEuay5hLiBpbnRlcmFjdGl2ZSBpbnRlcnByZXRlcikKClxpdGVtICAgZGVidWdnZXIgKG5vdCBjb21wbGV0ZSwgYnV0IHlvdSBjYW4gc2V0IGJyZWFrcG9pbnRzLCB2aWV3ICBhbmQgc3RlcCkKXGVuZHtpdGVtaXplfQoKClxzdWJzZWN0aW9ue01lbnVzfQoKXHN1YnN1YnNlY3Rpb257RmlsZSBtZW51fQoKXGJlZ2lue2Rlc2NyaXB0aW9ufQpcaXRlbVtOZXcgd2luZG93XSAgICAgY3JlYXRlIGEgbmV3IGVkaXRpbmcgd2luZG93ClxpdGVtW09wZW4uLi5dICAgICAgICBvcGVuIGFuIGV4aXN0aW5nIGZpbGUKXGl0ZW1bT3BlbiBtb2R1bGUuLi5dIG9wZW4gYW4gZXhpc3RpbmcgbW9kdWxlIChzZWFyY2hlcyBzeXMucGF0aCkKXGl0ZW1bQ2xhc3MgYnJvd3Nlcl0gIHNob3cgY2xhc3NlcyBhbmQgbWV0aG9kcyBpbiBjdXJyZW50IGZpbGUKXGl0ZW1bUGF0aCBicm93c2VyXSAgIHNob3cgc3lzLnBhdGggZGlyZWN0b3JpZXMsIG1vZHVsZXMsIGNsYXNzZXMgYW5kIG1ldGhvZHMKXGVuZHtkZXNjcmlwdGlvbn0KXGluZGV4e0NsYXNzIGJyb3dzZXJ9ClxpbmRleHtQYXRoIGJyb3dzZXJ9CgpcYmVnaW57ZGVzY3JpcHRpb259ClxpdGVtW1NhdmVdICAgc2F2ZSBjdXJyZW50IHdpbmRvdyB0byB0aGUgYXNzb2NpYXRlZCBmaWxlICh1bnNhdmVkCndpbmRvd3MgaGF2ZSBhICogYmVmb3JlIGFuZCBhZnRlciB0aGUgd2luZG93IHRpdGxlKQoKXGl0ZW1bU2F2ZSBBcy4uLl0gICAgIHNhdmUgY3VycmVudCB3aW5kb3cgdG8gbmV3IGZpbGUsIHdoaWNoIGJlY29tZXMKdGhlIGFzc29jaWF0ZWQgZmlsZQpcaXRlbVtTYXZlIENvcHkgQXMuLi5dICAgICAgICBzYXZlIGN1cnJlbnQgd2luZG93IHRvIGRpZmZlcmVudCBmaWxlCndpdGhvdXQgY2hhbmdpbmcgdGhlIGFzc29jaWF0ZWQgZmlsZQpcZW5ke2Rlc2NyaXB0aW9ufQoKXGJlZ2lue2Rlc2NyaXB0aW9ufQpcaXRlbVtDbG9zZV0gIGNsb3NlIGN1cnJlbnQgd2luZG93IChhc2tzIHRvIHNhdmUgaWYgdW5zYXZlZCkKXGl0ZW1bRXhpdF0gICBjbG9zZSBhbGwgd2luZG93cyBhbmQgcXVpdCBJRExFIChhc2tzIHRvIHNhdmUgaWYgdW5zYXZlZCkKXGVuZHtkZXNjcmlwdGlvbn0KCgpcc3Vic3Vic2VjdGlvbntFZGl0IG1lbnV9CgpcYmVnaW57ZGVzY3JpcHRpb259ClxpdGVtW1VuZG9dICAgVW5kbyBsYXN0IGNoYW5nZSB0byBjdXJyZW50IHdpbmRvdyAobWF4IDEwMDAgY2hhbmdlcykKXGl0ZW1bUmVkb10gICBSZWRvIGxhc3QgdW5kb25lIGNoYW5nZSB0byBjdXJyZW50IHdpbmRvdwpcZW5ke2Rlc2NyaXB0aW9ufQoKXGJlZ2lue2Rlc2NyaXB0aW9ufQpcaXRlbVtDdXRdICAgIENvcHkgc2VsZWN0aW9uIGludG8gc3lzdGVtLXdpZGUgY2xpcGJvYXJkOyB0aGVuIGRlbGV0ZSBzZWxlY3Rpb24KXGl0ZW1bQ29weV0gICBDb3B5IHNlbGVjdGlvbiBpbnRvIHN5c3RlbS13aWRlIGNsaXBib2FyZApcaXRlbVtQYXN0ZV0gIEluc2VydCBzeXN0ZW0td2lkZSBjbGlwYm9hcmQgaW50byB3aW5kb3cKXGl0ZW1bU2VsZWN0IEFsbF0gICAgIFNlbGVjdCB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBlZGl0IGJ1ZmZlcgpcZW5ke2Rlc2NyaXB0aW9ufQoKXGJlZ2lue2Rlc2NyaXB0aW9ufQpcaXRlbVtGaW5kLi4uXSAgICAgICAgT3BlbiBhIHNlYXJjaCBkaWFsb2cgYm94IHdpdGggbWFueSBvcHRpb25zClxpdGVtW0ZpbmQgYWdhaW5dICAgICBSZXBlYXQgbGFzdCBzZWFyY2gKXGl0ZW1bRmluZCBzZWxlY3Rpb25dIFNlYXJjaCBmb3IgdGhlIHN0cmluZyBpbiB0aGUgc2VsZWN0aW9uClxpdGVtW0ZpbmQgaW4gRmlsZXMuLi5dICAgICAgIE9wZW4gYSBzZWFyY2ggZGlhbG9nIGJveCBmb3Igc2VhcmNoaW5nIGZpbGVzClxpdGVtW1JlcGxhY2UuLi5dICAgICBPcGVuIGEgc2VhcmNoLWFuZC1yZXBsYWNlIGRpYWxvZyBib3gKXGl0ZW1bR28gdG8gbGluZV0gICAgIEFzayBmb3IgYSBsaW5lIG51bWJlciBhbmQgc2hvdyB0aGF0IGxpbmUKXGVuZHtkZXNjcmlwdGlvbn0KClxiZWdpbntkZXNjcmlwdGlvbn0KXGl0ZW1bSW5kZW50IHJlZ2lvbl0gIFNoaWZ0IHNlbGVjdGVkIGxpbmVzIHJpZ2h0IDQgc3BhY2VzClxpdGVtW0RlZGVudCByZWdpb25dICBTaGlmdCBzZWxlY3RlZCBsaW5lcyBsZWZ0IDQgc3BhY2VzClxpdGVtW0NvbW1lbnQgb3V0IHJlZ2lvbl0gICAgIEluc2VydCBcI1wjIGluIGZyb250IG9mIHNlbGVjdGVkIGxpbmVzClxpdGVtW1VuY29tbWVudCByZWdpb25dICAgICAgIFJlbW92ZSBsZWFkaW5nIFwjIG9yIFwjXCMgZnJvbSBzZWxlY3RlZCBsaW5lcwpcaXRlbVtUYWJpZnkgcmVnaW9uXSAgVHVybnMgXGVtcGh7bGVhZGluZ30gc3RyZXRjaGVzIG9mIHNwYWNlcyBpbnRvIHRhYnMKXGl0ZW1bVW50YWJpZnkgcmVnaW9uXSAgICAgICAgVHVybiBcZW1waHthbGx9IHRhYnMgaW50byB0aGUgcmlnaHQgbnVtYmVyIG9mIHNwYWNlcwpcaXRlbVtFeHBhbmQgd29yZF0gICAgRXhwYW5kIHRoZSB3b3JkIHlvdSBoYXZlIHR5cGVkIHRvIG1hdGNoIGFub3RoZXIKICAgICAgICAgICAgICAgIHdvcmQgaW4gdGhlIHNhbWUgYnVmZmVyOyByZXBlYXQgdG8gZ2V0IGEgZGlmZmVyZW50IGV4cGFuc2lvbgpcaXRlbVtGb3JtYXQgUGFyYWdyYXBoXSAgICAgICBSZWZvcm1hdCB0aGUgY3VycmVudCBibGFuay1saW5lLXNlcGFyYXRlZCBwYXJhZ3JhcGgKXGVuZHtkZXNjcmlwdGlvbn0KClxiZWdpbntkZXNjcmlwdGlvbn0KXGl0ZW1bSW1wb3J0IG1vZHVsZV0gIEltcG9ydCBvciByZWxvYWQgdGhlIGN1cnJlbnQgbW9kdWxlClxpdGVtW1J1biBzY3JpcHRdICAgICBFeGVjdXRlIHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIF9fbWFpbl9fIG5hbWVzcGFjZQpcZW5ke2Rlc2NyaXB0aW9ufQoKXGluZGV4e0ltcG9ydCBtb2R1bGV9ClxpbmRleHtSdW4gc2NyaXB0fQoKClxzdWJzdWJzZWN0aW9ue1dpbmRvd3MgbWVudX0KClxiZWdpbntkZXNjcmlwdGlvbn0KXGl0ZW1bWm9vbSBIZWlnaHRdICAgIHRvZ2dsZXMgdGhlIHdpbmRvdyBiZXR3ZWVuIG5vcm1hbCBzaXplICgyNHg4MCkKICAgICAgICBhbmQgbWF4aW11bSBoZWlnaHQuClxlbmR7ZGVzY3JpcHRpb259CgpUaGUgcmVzdCBvZiB0aGlzIG1lbnUgbGlzdHMgdGhlIG5hbWVzIG9mIGFsbCBvcGVuIHdpbmRvd3M7IHNlbGVjdCBvbmUKdG8gYnJpbmcgaXQgdG8gdGhlIGZvcmVncm91bmQgKGRlaWNvbmlmeWluZyBpdCBpZiBuZWNlc3NhcnkpLgoKClxzdWJzdWJzZWN0aW9ue0RlYnVnIG1lbnUgKGluIHRoZSBQeXRob24gU2hlbGwgd2luZG93IG9ubHkpfQoKXGJlZ2lue2Rlc2NyaXB0aW9ufQpcaXRlbVtHbyB0byBmaWxlL2xpbmVdICAgICAgICBsb29rIGFyb3VuZCB0aGUgaW5zZXJ0IHBvaW50IGZvciBhIGZpbGVuYW1lCiAgICAgICAgICAgICAgICBhbmQgbGluZW51bWJlciwgb3BlbiB0aGUgZmlsZSwgYW5kIHNob3cgdGhlIGxpbmUuClxpdGVtW09wZW4gc3RhY2sgdmlld2VyXSAgICAgIHNob3cgdGhlIHN0YWNrIHRyYWNlYmFjayBvZiB0aGUgbGFzdCBleGNlcHRpb24KXGl0ZW1bRGVidWdnZXIgdG9nZ2xlXSAgICAgICAgUnVuIGNvbW1hbmRzIGluIHRoZSBzaGVsbCB1bmRlciB0aGUgZGVidWdnZXIKXGl0ZW1bSklUIFN0YWNrIHZpZXdlciB0b2dnbGVdICAgICAgICBPcGVuIHN0YWNrIHZpZXdlciBvbiB0cmFjZWJhY2sKXGVuZHtkZXNjcmlwdGlvbn0KClxpbmRleHtzdGFjayB2aWV3ZXJ9ClxpbmRleHtkZWJ1Z2dlcn0KCgpcc3Vic2VjdGlvbntCYXNpYyBlZGl0aW5nIGFuZCBuYXZpZ2F0aW9ufQoKXGJlZ2lue2l0ZW1pemV9ClxpdGVtICAgXGtiZHtCYWNrc3BhY2V9IGRlbGV0ZXMgdG8gdGhlIGxlZnQ7IFxrYmR7RGVsfSBkZWxldGVzIHRvIHRoZSByaWdodApcaXRlbSAgIEFycm93IGtleXMgYW5kIFxrYmR7UGFnZSBVcH0vXGtiZHtQYWdlIERvd259IHRvIG1vdmUgYXJvdW5kClxpdGVtICAgXGtiZHtIb21lfS9ca2Jke0VuZH0gZ28gdG8gYmVnaW4vZW5kIG9mIGxpbmUKXGl0ZW0gICBca2Jke0MtSG9tZX0vXGtiZHtDLUVuZH0gZ28gdG8gYmVnaW4vZW5kIG9mIGZpbGUKXGl0ZW0gICBTb21lIFxwcm9ncmFte0VtYWNzfSBiaW5kaW5ncyBtYXkgYWxzbyB3b3JrLCBpbmNsdWRpbmcgXGtiZHtDLUJ9LAogICAgICAgIFxrYmR7Qy1QfSwgXGtiZHtDLUF9LCBca2Jke0MtRX0sIFxrYmR7Qy1EfSwgXGtiZHtDLUx9ClxlbmR7aXRlbWl6ZX0KCgpcc3Vic3Vic2VjdGlvbntBdXRvbWF0aWMgaW5kZW50YXRpb259CgpBZnRlciBhIGJsb2NrLW9wZW5pbmcgc3RhdGVtZW50LCB0aGUgbmV4dCBsaW5lIGlzIGluZGVudGVkIGJ5IDQgc3BhY2VzCihpbiB0aGUgUHl0aG9uIFNoZWxsIHdpbmRvdyBieSBvbmUgdGFiKS4gIEFmdGVyIGNlcnRhaW4ga2V5d29yZHMKKGJyZWFrLCByZXR1cm4gZXRjLikgdGhlIG5leHQgbGluZSBpcyBkZWRlbnRlZC4gIEluIGxlYWRpbmcKaW5kZW50YXRpb24sIFxrYmR7QmFja3NwYWNlfSBkZWxldGVzIHVwIHRvIDQgc3BhY2VzIGlmIHRoZXkgYXJlIHRoZXJlLgpca2Jke1RhYn0gaW5zZXJ0cyAxLTQgc3BhY2VzIChpbiB0aGUgUHl0aG9uIFNoZWxsIHdpbmRvdyBvbmUgdGFiKS4KU2VlIGFsc28gdGhlIGluZGVudC9kZWRlbnQgcmVnaW9uIGNvbW1hbmRzIGluIHRoZSBlZGl0IG1lbnUuCgoKXHN1YnN1YnNlY3Rpb257UHl0aG9uIFNoZWxsIHdpbmRvd30KClxiZWdpbntpdGVtaXplfQpcaXRlbSAgIFxrYmR7Qy1DfSBpbnRlcnJ1cHRzIGV4ZWN1dGluZyBjb21tYW5kClxpdGVtICAgXGtiZHtDLUR9IHNlbmRzIGVuZC1vZi1maWxlOyBjbG9zZXMgd2luZG93IGlmIHR5cGVkIGF0CmEgXHNhbXB7Pj4+fn0gcHJvbXB0ClxlbmR7aXRlbWl6ZX0KClxiZWdpbntpdGVtaXplfQpcaXRlbSAgIFxrYmR7QWx0LXB9IHJldHJpZXZlcyBwcmV2aW91cyBjb21tYW5kIG1hdGNoaW5nIHdoYXQgeW91IGhhdmUgdHlwZWQKXGl0ZW0gICBca2Jke0FsdC1ufSByZXRyaWV2ZXMgbmV4dApcaXRlbSAgIFxrYmR7UmV0dXJufSB3aGlsZSBvbiBhbnkgcHJldmlvdXMgY29tbWFuZCByZXRyaWV2ZXMgdGhhdCBjb21tYW5kClxpdGVtICAgXGtiZHtBbHQtL30gKEV4cGFuZCB3b3JkKSBpcyBhbHNvIHVzZWZ1bCBoZXJlClxlbmR7aXRlbWl6ZX0KClxpbmRleHtpbmRlbnRhdGlvbn0KCgpcc3Vic2VjdGlvbntTeW50YXggY29sb3JzfQoKVGhlIGNvbG9yaW5nIGlzIGFwcGxpZWQgaW4gYSBiYWNrZ3JvdW5kIGBgdGhyZWFkLCcnIHNvIHlvdSBtYXkKb2NjYXNpb25hbGx5IHNlZSB1bmNvbG9yaXplZCB0ZXh0LiAgVG8gY2hhbmdlIHRoZSBjb2xvcgpzY2hlbWUsIGVkaXQgdGhlIFxjb2Rle1tDb2xvcnNdfSBzZWN0aW9uIGluIFxmaWxle2NvbmZpZy50eHR9LgoKXGJlZ2lue2Rlc2NyaXB0aW9ufQpcaXRlbVtQeXRob24gc3ludGF4IGNvbG9yczpdCgpcYmVnaW57ZGVzY3JpcHRpb259ClxpdGVtW0tleXdvcmRzXSAgICAgICBvcmFuZ2UKXGl0ZW1bU3RyaW5ncyBdICAgICAgIGdyZWVuClxpdGVtW0NvbW1lbnRzXSAgICAgICByZWQKXGl0ZW1bRGVmaW5pdGlvbnNdICAgIGJsdWUKXGVuZHtkZXNjcmlwdGlvbn0KClxpdGVtW1NoZWxsIGNvbG9yczpdClxiZWdpbntkZXNjcmlwdGlvbn0KXGl0ZW1bQ29uc29sZSBvdXRwdXRdIGJyb3duClxpdGVtW3N0ZG91dF0gICAgICAgICBibHVlClxpdGVtW3N0ZGVycl0gICAgICAgZGFyayBncmVlbgpcaXRlbVtzdGRpbl0gICAgICAgYmxhY2sKXGVuZHtkZXNjcmlwdGlvbn0KXGVuZHtkZXNjcmlwdGlvbn0KCgpcc3Vic3Vic2VjdGlvbntDb21tYW5kIGxpbmUgdXNhZ2V9CgpcYmVnaW57dmVyYmF0aW19CmlkbGUucHkgWy1jIGNvbW1hbmRdIFstZF0gWy1lXSBbLXNdIFstdCB0aXRsZV0gW2FyZ10gLi4uCgotYyBjb21tYW5kICBydW4gdGhpcyBjb21tYW5kCi1kICAgICAgICAgIGVuYWJsZSBkZWJ1Z2dlcgotZSAgICAgICAgICBlZGl0IG1vZGU7IGFyZ3VtZW50cyBhcmUgZmlsZXMgdG8gYmUgZWRpdGVkCi1zICAgICAgICAgIHJ1biAkSURMRVNUQVJUVVAgb3IgJFBZVEhPTlNUQVJUVVAgZmlyc3QKLXQgdGl0bGUgICAgc2V0IHRpdGxlIG9mIHNoZWxsIHdpbmRvdwpcZW5ke3ZlcmJhdGltfQoKSWYgdGhlcmUgYXJlIGFyZ3VtZW50czoKClxiZWdpbntlbnVtZXJhdGV9ClxpdGVtICAgSWYgXHByb2dyYW1vcHR7LWV9IGlzIHVzZWQsIGFyZ3VtZW50cyBhcmUgZmlsZXMgb3BlbmVkIGZvcgogICAgICAgIGVkaXRpbmcgYW5kIFxjb2Rle3N5cy5hcmd2fSByZWZsZWN0cyB0aGUgYXJndW1lbnRzIHBhc3NlZCB0bwogICAgICAgIElETEUgaXRzZWxmLgoKXGl0ZW0gICBPdGhlcndpc2UsIGlmIFxwcm9ncmFtb3B0ey1jfSBpcyB1c2VkLCBhbGwgYXJndW1lbnRzIGFyZQogICAgICAgIHBsYWNlZCBpbiBcY29kZXtzeXMuYXJndlsxOi4uLl19LCB3aXRoIFxjb2Rle3N5cy5hcmd2WzBdfSBzZXQKICAgICAgICB0byBcY29kZXsnLWMnfS4KClxpdGVtICAgT3RoZXJ3aXNlLCBpZiBuZWl0aGVyIFxwcm9ncmFtb3B0ey1lfSBub3IgXHByb2dyYW1vcHR7LWN9IGlzCiAgICAgICAgdXNlZCwgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEgc2NyaXB0IHdoaWNoIGlzIGV4ZWN1dGVkIHdpdGgKICAgICAgICB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyBpbiBcY29kZXtzeXMuYXJndlsxOi4uLl19ICBhbmQKICAgICAgICBcY29kZXtzeXMuYXJndlswXX0gc2V0IHRvIHRoZSBzY3JpcHQgbmFtZS4gIElmIHRoZSBzY3JpcHQgbmFtZQogICAgICAgIGlzICctJywgbm8gc2NyaXB0IGlzIGV4ZWN1dGVkIGJ1dCBhbiBpbnRlcmFjdGl2ZSBQeXRob24KICAgICAgICBzZXNzaW9uIGlzIHN0YXJ0ZWQ7IHRoZSBhcmd1bWVudHMgYXJlIHN0aWxsIGF2YWlsYWJsZSBpbgogICAgICAgIFxjb2Rle3N5cy5hcmd2fS4KXGVuZHtlbnVtZXJhdGV9CgoKXHNlY3Rpb257T3RoZXIgR3JhcGhpY2FsIFVzZXIgSW50ZXJmYWNlIFBhY2thZ2VzCiAgICAgICAgIFxsYWJlbHtvdGhlci1ndWktcGFja2FnZXN9fQoKClRoZXJlIGFyZSBhbiBudW1iZXIgb2YgZXh0ZW5zaW9uIHdpZGdldCBzZXRzIHRvIFxyZWZtb2R1bGV7VGtpbnRlcn0uCgpcYmVnaW57c2VlYWxzbyp9ClxzZWV0aXRsZVtodHRwOi8vcG13LnNvdXJjZWZvcmdlLm5ldC9de1B5dGhvbiBtZWdhd2lkZ2V0c317aXMgYQp0b29sa2l0IGZvciBidWlsZGluZyBoaWdoLWxldmVsIGNvbXBvdW5kIHdpZGdldHMgaW4gUHl0aG9uIHVzaW5nIHRoZQpccmVmbW9kdWxle1RraW50ZXJ9IG1vZHVsZS4gIEl0IGNvbnNpc3RzIG9mIGEgc2V0IG9mIGJhc2UgY2xhc3NlcyBhbmQKYSBsaWJyYXJ5IG9mIGZsZXhpYmxlIGFuZCBleHRlbnNpYmxlIG1lZ2F3aWRnZXRzIGJ1aWx0IG9uIHRoaXMKZm91bmRhdGlvbi4gVGhlc2UgbWVnYXdpZGdldHMgaW5jbHVkZSBub3RlYm9va3MsIGNvbWJvYm94ZXMsIHNlbGVjdGlvbgp3aWRnZXRzLCBwYW5lZCB3aWRnZXRzLCBzY3JvbGxlZCB3aWRnZXRzLCBkaWFsb2cgd2luZG93cywgZXRjLiAgQWxzbywKd2l0aCB0aGUgUG13LkJsdCBpbnRlcmZhY2UgdG8gQkxULCB0aGUgYnVzeSwgZ3JhcGgsIHN0cmlwY2hhcnQsIHRhYnNldAphbmQgdmVjdG9yIGNvbW1hbmRzIGFyZSBiZSBhdmFpbGFibGUuCgpUaGUgaW5pdGlhbCBpZGVhcyBmb3IgUG13IHdlcmUgdGFrZW4gZnJvbSB0aGUgVGsgXGNvZGV7aXRjbH0KZXh0ZW5zaW9ucyBcY29kZXtbaW5jciBUa119IGJ5IE1pY2hhZWwgTWNMZW5uYW4gYW5kIFxjb2Rle1tpbmNyCldpZGdldHNdfSBieSBNYXJrIFVsZmVydHMuIFNldmVyYWwgb2YgdGhlIG1lZ2F3aWRnZXRzIGFyZSBkaXJlY3QKdHJhbnNsYXRpb25zIGZyb20gdGhlIGl0Y2wgdG8gUHl0aG9uLiBJdCBvZmZlcnMgbW9zdCBvZiB0aGUgcmFuZ2Ugb2YKd2lkZ2V0cyB0aGF0IFxjb2Rle1tpbmNyIFdpZGdldHNdfSBkb2VzLCBhbmQgaXMgYWxtb3N0IGFzIGNvbXBsZXRlIGFzClRpeCwgbGFja2luZyBob3dldmVyIFRpeCdzIGZhc3QgXGNsYXNze0hMaXN0fSB3aWRnZXQgZm9yIGRyYXdpbmcgdHJlZXMuCn0KClxzZWV0aXRsZVtodHRwOi8vdGtpbnRlci5lZmZib3Qub3JnL117VGtpbnRlcjMwMDAgV2lkZ2V0IENvbnN0cnVjdGlvbgogICAgICAgICAgS2l0IChXQ0spfXslCmlzIGEgbGlicmFyeSB0aGF0IGFsbG93cyB5b3UgdG8gd3JpdGUgbmV3IFRraW50ZXIgd2lkZ2V0cyBpbiBwdXJlClB5dGhvbi4gIFRoZSBXQ0sgZnJhbWV3b3JrIGdpdmVzIHlvdSBmdWxsIGNvbnRyb2wgb3ZlciB3aWRnZXQKY3JlYXRpb24sIGNvbmZpZ3VyYXRpb24sIHNjcmVlbiBhcHBlYXJhbmNlLCBhbmQgZXZlbnQgaGFuZGxpbmcuICBXQ0sKd2lkZ2V0cyBjYW4gYmUgdmVyeSBmYXN0IGFuZCBsaWdodC13ZWlnaHQsIHNpbmNlIHRoZXkgY2FuIG9wZXJhdGUKZGlyZWN0bHkgb24gUHl0aG9uIGRhdGEgc3RydWN0dXJlcywgd2l0aG91dCBoYXZpbmcgdG8gdHJhbnNmZXIgZGF0YQp0aHJvdWdoIHRoZSBUay9UY2wgbGF5ZXIufQpcZW5ke3NlZWFsc28qfQoKT3RoZXIgR1VJIHBhY2thZ2VzIGFyZSBhbHNvIGF2YWlsYWJsZSBmb3IgUHl0aG9uOgoKXGJlZ2lue3NlZWFsc28qfQpcc2VldGl0bGVbaHR0cDovL3d3dy53eHB5dGhvbi5vcmdde3d4UHl0aG9ufXsKd3hQeXRob24gaXMgYSBjcm9zcy1wbGF0Zm9ybSBHVUkgdG9vbGtpdCBmb3IgUHl0aG9uIHRoYXQgaXMgYnVpbHQKYXJvdW5kIHRoZSBwb3B1bGFyIFx1bGlua3t3eFdpZGdldHN9e2h0dHA6Ly93d3cud3h3aWRnZXRzLm9yZy99IFxDcHB7fQp0b29sa2l0LiCgSXQgcHJvdmlkZXMgYSBuYXRpdmUgbG9vayBhbmQgZmVlbCBmb3IgYXBwbGljYXRpb25zIG9uCldpbmRvd3MsIE1hYyBPUyBYLCBhbmQgXFVOSVh7fSBzeXN0ZW1zIGJ5IHVzaW5nIGVhY2ggcGxhdGZvcm0ncyBuYXRpdmUKd2lkZ2V0cyB3aGVyZSBldmVyIHBvc3NpYmxlLCAoR1RLKyBvbiBcVU5JWC1saWtlIHN5c3RlbXMpLiCgSW4KYWRkaXRpb24gdG8gYW4gZXh0ZW5zaXZlIHNldCBvZiB3aWRnZXRzLCB3eFB5dGhvbiBwcm92aWRlcyBjbGFzc2VzIGZvcgpvbmxpbmUgZG9jdW1lbnRhdGlvbiBhbmQgY29udGV4dCBzZW5zaXRpdmUgaGVscCwgcHJpbnRpbmcsIEhUTUwKdmlld2luZywgbG93LWxldmVsIGRldmljZSBjb250ZXh0IGRyYXdpbmcsIGRyYWcgYW5kIGRyb3AsIHN5c3RlbQpjbGlwYm9hcmQgYWNjZXNzLCBhbiBYTUwtYmFzZWQgcmVzb3VyY2UgZm9ybWF0IGFuZCBtb3JlLCBpbmNsdWRpbmcgYW4KZXZlciBncm93aW5nIGxpYnJhcnkgb2YgdXNlci1jb250cmlidXRlZCBtb2R1bGVzLiCgQm90aCB0aGUgd3hXaWRnZXRzCmFuZCB3eFB5dGhvbiBwcm9qZWN0cyBhcmUgdW5kZXIgYWN0aXZlIGRldmVsb3BtZW50IGFuZCBjb250aW51b3VzCmltcHJvdmVtZW50LCBhbmQgaGF2ZSBhY3RpdmUgYW5kIGhlbHBmdWwgdXNlciBhbmQgZGV2ZWxvcGVyCmNvbW11bml0aWVzLgp9ClxzZWV0aXRsZVtodHRwOi8vd3d3LmFtYXpvbi5jb20vZXhlYy9vYmlkb3MvQVNJTi8xOTMyMzk0NjIxXQp7d3hQeXRob24gaW4gQWN0aW9ufXsKVGhlIHd4UHl0aG9uIGJvb2ssIGJ5IE5vZWwgUmFwcGluIGFuZCBSb2JpbiBEdW5uLgp9ClxzZWV0aXRsZXtQeVF0fXsKUHlRdCBpcyBhIFxwcm9ncmFte3NpcH0td3JhcHBlZCBiaW5kaW5nIHRvIHRoZSBRdCB0b29sa2l0LiAgUXQgaXMgYW4KZXh0ZW5zaXZlIFxDcHB7fSBHVUkgdG9vbGtpdCB0aGF0IGlzIGF2YWlsYWJsZSBmb3IgXFVOSVgsIFdpbmRvd3MgYW5kCk1hYyBPUyBYLiAgXHByb2dyYW17c2lwfSBpcyBhIHRvb2wgZm9yIGdlbmVyYXRpbmcgYmluZGluZ3MgZm9yIFxDcHB7fQpsaWJyYXJpZXMgYXMgUHl0aG9uIGNsYXNzZXMsIGFuZCBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgZm9yIFB5dGhvbi4KQW4gb25saW5lIG1hbnVhbCBpcyBhdmFpbGFibGUgYXQKXHVybHtodHRwOi8vd3d3Lm9wZW5kb2NzcHVibGlzaGluZy5jb20vcHlxdC99IChlcnJhdGEgYXJlIGxvY2F0ZWQgYXQKXHVybHtodHRwOi8vd3d3LnZhbGR5YXMub3JnL3B5dGhvbi9ib29rLmh0bWx9KS4gCn0KXHNlZXRpdGxlW2h0dHA6Ly93d3cucml2ZXJiYW5rY29tcHV0aW5nLmNvLnVrL3B5a2RlL2luZGV4LnBocF17UHlLREV9ewpQeUtERSBpcyBhIFxwcm9ncmFte3NpcH0td3JhcHBlZCBpbnRlcmZhY2UgdG8gdGhlIEtERSBkZXNrdG9wCmxpYnJhcmllcy4gIEtERSBpcyBhIGRlc2t0b3AgZW52aXJvbm1lbnQgZm9yIFxVTklYe30gY29tcHV0ZXJzOyB0aGUKZ3JhcGhpY2FsIGNvbXBvbmVudHMgYXJlIGJhc2VkIG9uIFF0Lgp9ClxzZWV0aXRsZVtodHRwOi8vZnhweS5zb3VyY2Vmb3JnZS5uZXQvXXtGWFB5fXsKaXMgYSBQeXRob24gZXh0ZW5zaW9uIG1vZHVsZSB3aGljaCBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gdGhlIApcY2l0ZXRpdGxlW2h0dHA6Ly93d3cuY2ZkcmMuY29tL0ZPWC9mb3guaHRtbF17Rk9YfSBHVUkuCkZPWCBpcyBhIFxDcHB7fSBiYXNlZCBUb29sa2l0IGZvciBkZXZlbG9waW5nIEdyYXBoaWNhbCBVc2VyIEludGVyZmFjZXMKZWFzaWx5IGFuZCBlZmZlY3RpdmVseS4gSXQgb2ZmZXJzIGEgd2lkZSwgYW5kIGdyb3dpbmcsIGNvbGxlY3Rpb24gb2YKQ29udHJvbHMsIGFuZCBwcm92aWRlcyBzdGF0ZSBvZiB0aGUgYXJ0IGZhY2lsaXRpZXMgc3VjaCBhcyBkcmFnIGFuZApkcm9wLCBzZWxlY3Rpb24sIGFzIHdlbGwgYXMgT3BlbkdMIHdpZGdldHMgZm9yIDNEIGdyYXBoaWNhbAptYW5pcHVsYXRpb24uICBGT1ggYWxzbyBpbXBsZW1lbnRzIGljb25zLCBpbWFnZXMsIGFuZCB1c2VyLWNvbnZlbmllbmNlCmZlYXR1cmVzIHN1Y2ggYXMgc3RhdHVzIGxpbmUgaGVscCwgYW5kIHRvb2x0aXBzLiAgCgpFdmVuIHRob3VnaCBGT1ggb2ZmZXJzIGEgbGFyZ2UgY29sbGVjdGlvbiBvZiBjb250cm9scyBhbHJlYWR5LCBGT1gKbGV2ZXJhZ2VzIFxDcHB7fSB0byBhbGxvdyBwcm9ncmFtbWVycyB0byBlYXNpbHkgYnVpbGQgYWRkaXRpb25hbCBDb250cm9scwphbmQgR1VJIGVsZW1lbnRzLCBzaW1wbHkgYnkgdGFraW5nIGV4aXN0aW5nIGNvbnRyb2xzLCBhbmQgY3JlYXRpbmcgYQpkZXJpdmVkIGNsYXNzIHdoaWNoIHNpbXBseSBhZGRzIG9yIHJlZGVmaW5lcyB0aGUgZGVzaXJlZCBiZWhhdmlvci4KfQpcc2VldGl0bGVbaHR0cDovL3d3dy5kYWEuY29tLmF1L1x0ZXh0YXNjaWl0aWxkZSBqYW1lcy9zb2Z0d2FyZS9weWd0ay9de1B5R1RLfXsKaXMgYSBzZXQgb2YgYmluZGluZ3MgZm9yIHRoZSBcdWxpbmt7R1RLfXtodHRwOi8vd3d3Lmd0ay5vcmcvfSB3aWRnZXQgc2V0LgpJdCBwcm92aWRlcyBhbiBvYmplY3Qgb3JpZW50ZWQgaW50ZXJmYWNlIHRoYXQgaXMgc2xpZ2h0bHkgaGlnaGVyCmxldmVsIHRoYW4gdGhlIEMgb25lLiBJdCBhdXRvbWF0aWNhbGx5IGRvZXMgYWxsIHRoZSB0eXBlIGNhc3RpbmcgYW5kCnJlZmVyZW5jZSBjb3VudGluZyB0aGF0IHlvdSB3b3VsZCBoYXZlIHRvIGRvIG5vcm1hbGx5IHdpdGggdGhlIEMKQVBJLiBUaGVyZSBhcmUgYWxzbwpcdWxpbmt7YmluZGluZ3N9e2h0dHA6Ly93d3cuZGFhLmNvbS5hdS9cdGV4dGFzY2lpdGlsZGUgamFtZXMvZ25vbWUvfQp0byAgXHVsaW5re0dOT01FfXtodHRwOi8vd3d3Lmdub21lLm9yZ30sIGFuZCBhIApcdWxpbmt7dHV0b3JpYWx9CntodHRwOi8vbGFndW5hLmZtZWRpYy51bmFtLm14L1x0ZXh0YXNjaWl0aWxkZSBkYW5pZWwvcHlndHV0b3JpYWwvcHlndHV0b3JpYWwvaW5kZXguaHRtbH0KaXMgYXZhaWxhYmxlLgp9ClxlbmR7c2VlYWxzbyp9CgolIFhYWCBSZWZlcmVuY2UgVVJMcyB0aGF0IGNvbXBhcmUgdGhlIGRpZmZlcmVudCBVSSBwYWNrYWdlcwo=