IyMjIyMjIyMjIyMjIyMjIyMKIyBtb2RfcGVybCBidWdzICMKIyMjIyMjIyMjIyMjIyMjIyMKCiogbG9jYWwgJUVOViBkb2Vzbid0IHdvcmssIHNlZSB0L21vZHBlcmwvbG9jYWxfZW50LgoKKiBQZXJsT3B0aW9ucyBOb25lIG5lZWRzIHRvIGJlIGltcGxlbWVudGVkLCBzZWUgdC9tb2RwZXJsL3Blcmxfb3B0aW9uczIudAoKKiBQZXJsSU9BcGFjaGVfZmx1c2goKSAKICBTZXR0aW5nIGxvY2FsICR8ID0gMCBkb2Vzbid0IHdvcmsgd2l0aCByZWd1bGFyIHByaW50IHN0YXRlbWVudHMgdW5kZXIgTW9kUGVybDo6KgogIAogIGh0dHA6Ly9wNm03ZzgubmV0L01QMi84NDYyNQogIGh0dHA6Ly93d3cuZ29zc2FtZXItdGhyZWFkcy5jb20vbGlzdHMvbW9kcGVybC9kZXYvODUzNjUKICBbcGdvbGx1Y2NpIHZvbHVudGVlcnNdCgoqICRyLT5yZmx1c2ggZG9lc24ndCB3b3JrLiBzZWU6CiAgaHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD1hcGFjaGUtbW9kcGVybCZtPTEwMzg0Nzk5MDgxMzI4NSZ3PTIKICBJIGFsc28gc2VlIGEgd2VpcmQgYmVoYXZpb3Igd2hlcmUgaXQgZG9lcyBzZW5kcyBGTFVTSCBidWNrZXRzIGJ1dAogIHRoZXkgYWxsIHNlZW0gdG8gZmFsbCB0aHJvdWdoIHRoZSBkYXRhLCB0aHVzIG5vdCByZWFsbHkgZmx1c2hpbmcKICBhbnl0aGluZy4gdGhpcyBjYW4gYmUgZWFzaWx5IHJlcHJvZHVjZWQgd2l0aCBNeUFwYWNoZTo6RmlsdGVyU25vb3AuCgogIFNlZSBhbHNvCiAgaHR0cDovL3d3dy5nb3NzYW1lci10aHJlYWRzLmNvbS9saXN0cy9tb2RwZXJsL2Rldi84NDc0ND9zZWFyY2hfc3RyaW5nPSUyMyU3QyUyQyUyMGZsdXNoaW5nJTJDJTIwZXRjOyM4NDc0MwogIGZvciBhIHJlbGF0ZWQgJHwgYnV0IG5vdCB0aGUgc2FtZSBpc3N1ZS4KICBbcGdvbGx1Y2NpIHZvbHVudGVlcnNdCgoqIGVhcmx5IHBvb2wgZGVzdHJ1Y3Rpb24gaXNzdWVzCiAgaHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD1hcGFjaGUtbW9kcGVybC1kZXYmbT0xMDg4NzI5NDQ4MTUzODImdz0yCgoqIFBhc3NFbnYvU2V0RW52IHByb3BvZ2F0aW9uIGluIDxQZXJsPiBzZWN0aW9uIAogIGh0dHA6Ly93d3cuZ29zc2FtZXItdGhyZWFkcy5jb20vYXJjaGl2ZS9tb2RfcGVybF9DMS9kZXZfRjQvJTVCTVAyX0JVRyU1RF9QZXJsUGFzc0Vudl9pc3N1ZXNfUDcwNTAwLwoKKiB0aGVyZSB3YXMgYSByZXBvcnQgYWJvdXQgUGVybFJ1biBsZWFraW5nIG1lbW9yeS4gdGhlIHJlcG9ydGVyIGRpZG4ndAogIGdpdmUgYW55IG1vcmUgZGV0YWlscywgYnV0IEkgc3VzcGVjdCB0aGF0IGl0J3MgZHVlIHRvCiAgTW9kUGVybDo6VXRpbDo6dW5sb2FkX3BhY2thZ2UoKSB3aGljaCBwZXJmZWN0bHkgZml0cyB0aGUgdGltaW5nIHdoZW4KICB0aGUgbGVhayB3YXMgaW50cm9kdWNlZCAod2hlbiBQZXJsUnVuIHN0YXJ0ZWQgdG8gdXNlIHVubG9hZF9wYWNrYWdlKS4KICAKICBSZXBvcnQ6IGh0dHA6Ly9nb3NzYW1lci10aHJlYWRzLmNvbS9saXN0cy9tb2RwZXJsL21vZHBlcmwvNzcxNjIKCiogbW9zdCBvZiB0aGUgeHMgd3JhcHBlcnMgcHJpbnQgbm8gIlVzYWdlOiAiIHdoZW4gd3JvbmcgYXJncy93cm9uZwogIG51bWJlciBvZiBhcmdzIGFyZSBwYXNzZWQsIHdvdWxkIGJlIG5pY2UgdG8gYWRkIHRoZSB1c2FnZSBtZXNzYWdlCiAgd2hlbmV2ZXIgaW5jb3JyZWN0IGFyZ3VtZW50cyBlcnJvciBpcyBsb2dnZWQuIGUuZy4sIHdoZW4KICBBUFI6OlVSSS0+cGFyc2UoKSBnZXRzIHRoZSB3cm9uZyBmaXJzdCBhcmcgKG5vbi1wb29sKSBpdCBwcmludHM6CgogICAgcCBpcyBub3Qgb2YgdHlwZSBBUFI6OlBvb2wgYXQgLi4uCgogIHdoZXJlYXMgaXQncyBub3Qgc28gb2J2aW91cyB0aGF0IHRoZSBmdW5jdGlvbiBleHBlY3RlZCB0aGUgcG9vbAogIG9iamVjdCwgbmVpdGhlciBpdCBzcGVjaWZpZXMgd2hpY2ggKCJhcmcgbnVtYmVyIikgb2YgdGhlIGFyZ3VtZW50cwogIGlzIHdyb25nLgoKICBwb3NzaWJsZSBzb2x1dGlvbjogYWRkIGEgbmV3IGZpZWxkIHRvIHRoZSBtYXAgZmlsZXMsIHdoaWNoIHdpbGwgYmUKICB1c2VkIGFzIGEgdXNhZ2UgbWVzc2FnZSB3aGVuZXZlciBhbiBhcmd1bWVudCBlcnJvciBvY2N1cnMuCgoqICdTZXRIYW5kbGVyIG1vZHBlcmwnIGRvZXNuJ3QgcmVzZXQgJHwsIHNvIGlmIGFueXRoaW5nIHR1cm5zIGl0IG9uCiAgYW55d2hlcmUsIGl0J3MgZ29pbmcgdG8gc3RheSB0aGF0IHdheS4gTWVhbmluZyBleGNlc3NpdmUgZmx1c2hpbmcKICBwcm9iYWJseSBjYXVzaW5nIGEgcGVyZm9ybWFuY2UgaGl0LiBJJ3ZlIHRyaWVkIHRvIGFkZCB0aGUgY29kZSB0bwogIHJlc2V0IGl0LCBidXQgdGhpcyByZXF1aXJlcyBnZXR0aW5nIGEgcGVybCBpbnRlcnByZXRlciBhdCB0aGUgZWFybHkKICBzdGFnZSBhbmQgaXQgYnJlYWtzIHNldmVyYWwgZmlsdGVyIHRlc3RzLCB3aGljaCBoYXMgcmVsaWVkIGJlZm9yZSBvbgogIHRoZSBjb2luY2lkZW5jZSB0aGF0IGJvdGggdGhlIHJlc3BvbnNlIGhhbmRsZXIgYW5kIHRoZSBmaWx0ZXIgd2VyZQogIHJ1biBieSB0aGUgc2FtZSBpbnRlcnByZXRlciAoaW4gcGFydGljdWxhciB0aGlzIGJyZWFrcyB0aGUgY29kZQogIHdoZXJlIHB1c2hfaGFuZGxlcnMoKSB1c2VzIGEgc3RyaW5nIGFzIGEgaGFuZGxlciwgcmF0aGVyIGEgQ09ERQogIHJlZmVyZW5jZSwgc2VlIHQvZmlsdGVyL1Rlc3RGaWx0ZXIvYm90aF9zdHJfcmVjX2FkZC5wbSwgdG8KICByZXByb2R1Y2UgdGhlIHByb2JsZW0sIHNpbXBseSBzL21vZHBlcmwvcGVybC1zY3JpcHQvKQoKCiogQXBhY2hlOjpQZXJsU2VjdGlvbi0+ZHVtcCgpIHdpbGwgbm90IHByZXNlcnZlIHRpZWQnZWRuZXNzLiBUaGlzIGlzCiAgaGFuZGxlZCBwcm9wcmVseSBpbiBTdG9yYWJsZSwgc28gZWl0aGVyIHN3aXRjaCBkdW1wL3Jlc3RvcmUgdG8KICBub24taHVtYW4gcmVhZGFibGUgKC0wLjUpIG9yIGJvcnJvdyB0aGUgc2FtZSBsb2dpYyB0byBkdW1wL3Jlc3RvcmUKICB0aWVkIG9iamVjdHMuCgoKCiogQXBhY2hlOjpMb2cgY29tcGF0IGlzc3VlczoKCiAgQXBhY2hlLT53YXJuLCBBcGFjaGU6Ondhcm4sIEFwYWNoZTo6U2VydmVyLT53YXJuIGFuZAogIEFwYWNoZS0+QXBhY2hlOjpTZXJ2ZXItPmxvZ19lcnJvciBhcmUgYWxsIGRvaW5nOgogICAgIHMgPSBtb2RwZXJsX2dsb2JhbF9nZXRfc2VydmVyX3JlYygpOwogIGFuZCB0aGlzIGZ1bmN0aW9uIGlzIHRocmVhZCBzYWZlIG9ubHkgZHVyaW5nIHRoZSBzdGFydHVwLgoKICBwb3NzaWJsZSBzb2x1dGlvbnM6CgogIDEpIGVuZm9yY2UgdGhhdCB0aGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgb25seSBhdCB0aGUgc2VydmVyIHN0YXJ0dXAKCiAgMikgcmVxdWlyZSArR2xvYmFsUmVxdWVzdCwgd2hpY2ggZ2l2ZXMgdXMgci0+c2VydmVyLCBub3cgdGhyZWFkCiAgICAgc2FmZSAodGhvdWdoIHNsb3cpLgoKICAzKSBkcm9wIHRoZW0gYWxsIGZyb20gdGhlIEFQSSBhbmQgbW92ZSB0byBjb21wYXQuIAogICAgIFtyZW1lbWJlciB0aGF0IEFwYWNoZTo6d2FybiBpcyBuZWVkZWQgZm9yIHJlZ2lzdHJ5IHNjcmlwdHMgdG8KICAgICBvdmVycmlkZSB3YXJuKCldCgogIEZvciBBcGFjaGU6Ondhcm4gYW5kIHJlZ2lzdHJ5LCB0aGUgc29sdXRpb24gaXMgdG8gc3VwcGx5CiAgR0xPQkFMOjpDT1JFOjp3YXJuIGZvciB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBnZXQgJHIgaW5zaWRlIG9mIGl0CiAgYW5kXQoKICBSZXBvcnQ6IE1lc3NhZ2UtSUQ6IDxQaW5lLkxOWC40LjMzLjAyMDYyMDEwMTEwNzAuMjU5MC0xMDAwMDBAbWFrby5jb3ZhbGVudC5uZXQ+CiAgU3RhdHVzOiA8aW1nIGFsdD0iRG91ZywgY29udGVtcGxhdGluZyI+CgoqIHNlZSBpZiB3ZSBjYW4gYXZvaWQgdG91Y2hpbmcgZW52aXJvbltdIHVudGlsIGEgZm9yaygpIGZyb20gUGVybAogIGhhcHBlbnMKCiogQXBhY2hlOjpTdGF0dXMgcHJpbnRzIGEgYm9ndXMgZmlsZW5hbWUgdmlhIEI6OkNWIChlLmcuIGZyb20gdGhlIHRlc3QKICBzdWl0ZSkKCiAgICBodHRwOi8vbG9jYWxob3N0Ojg1Mjkvc3RhdHVzL3BlcmwvQVBSOjpCcmlnYWRlOjpib290c3RyYXAvRlVOQ1RJT04/Y3ZfZHVtcAogICAgU3Vicm91dGluZSBpbmZvIGZvciBBUFI6OkJyaWdhZGU6OmJvb3RzdHJhcAogICAgRmlsZTogeFm1CiAgICBQYWNrYWdlOiBBUFI6OkJyaWdhZGUKICAgIC4uLgoKICBub3RpY2UgdGhlIGJvZ3VzIGZpbGVuYW1lLiBGb3Igc29tZSByZWFzb24gdGhpcyBwcm9ibGVtIGRvZXNuJ3QKICBleGlzdCB3aXRoIEFQUjo6QnVja2V0OgoKICAgIGh0dHA6Ly9sb2NhbGhvc3Q6ODUyOS9zdGF0dXMvcGVybC9BUFI6OkJ1Y2tldDo6Ym9vdHN0cmFwL0ZVTkNUSU9OP2N2X2R1bXAKCiAgSSBoYXZlIHRlc3RlZCB0aGF0IHRoZSBib2d1cyBmaWxlbmFtZSBjb21lcyBmcm9tICRvYmotPkZJTEUgaW4KICBBcGFjaGU6OlN0YXRzOjpjdl9maWxlLCB3aGVyZSAkb2JqIGlzIGJsZXNzZWQgaW50byBCOjpDVi4KCiAgVGhlIHByb2JsZW0gaGFzIGJlZW4gbm90aWNlZCB3aXRoIHRocmVhZGVkIDUuOC4xIHBlcmwsIGRpZG4ndCB0ZXN0CiAgYW55IG90aGVyIGJ1aWxkcy4KCiAgQXBwYXJlbnRseSBpdCdzIGEga25vd24gdG8gcDVwIHByb2JsZW06CiAgaHR0cDovL3d3dy54cmF5Lm1wZS5tcGcuZGUvbWFpbGluZy1saXN0cy9wZXJsNS1wb3J0ZXJzLzIwMDMtMDgvbXNnMDA1MTQuaHRtbAogIGh0dHA6Ly93d3cueHJheS5tcGUubXBnLmRlL21haWxpbmctbGlzdHMvcGVybDUtcG9ydGVycy8yMDAzLTExL21zZzAxMTI2Lmh0bWwKCiAgUmVwb3J0OiAgIAogIGh0dHA6Ly9tYXJjLnRoZWFpbXNncm91cC5jb20vP2w9YXBhY2hlLW1vZHBlcmwtZGV2Jm09MTA2ODkzMjUxOTExOTMwJnc9MgogIFByaW9yaXR5OiBMb3cgCgoqIG1weHNfQXBhY2hlMl9fUmVxdWVzdFJlY19HRVRDIGluIEFwYWNoZV9SZXF1ZXN0SU8uaCBpcyBvdXQgdG8gYmUKICByZWltcGxlbWVudGVkIHNpbWlsYXIgdG8gcmVhZCgpIHcvbyB1c2luZyB0aGUgZGVwcmVjYXRlZAogIGNsaWVudF9ibG9jayBpbnRlcmZhY2UKCiogU2VnZmF1bHRzIHVuZGVyIEFwYWNoZTo6UmVsb2FkIChjb3VsZCBiZSB1bmNvdmVyaW5nIGEgYnVnIGluIG1wKToKICBodHRwOi8vbWFyYy50aGVhaW1zZ3JvdXAuY29tLz90PTExMTE0NTE2OTkwMDAwMiZyPTEmdz0yCiAgb3duZXI6IGdvemVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAK