ZGlmZiAtLWdpdCBhL1JFQURNRS5nb29nbGUgYi9SRUFETUUuZ29vZ2xlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMTk2ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUuZ29vZ2xlCkBAIC0wLDAgKzEsMTAgQEAKK1VSTDogaHR0cHM6Ly9naXRodWIuY29tL2RhYmVhei9wbHkKK0xpY2Vuc2U6IEJTRAorTGljZW5zZSBGaWxlOiBSRUFETUUubWQKK093bmVyczogZWdyYW5hdGEKKworRGVzY3JpcHRpb246CitBIHRvb2wgdG8gZ2VuZXJhdGUgcGFyc2VycyBhbmQgbGV4ZXJzIGluIFB5dGhvbiAoc2ltaWxhciB0byBsZXgveWFjYyBmb3IgQykKKworTG9jYWwgTW9kaWZpY2F0aW9uczoKK0FkZGVkIHRoaXMgUkVBRE1FLmdvb2dsZSBmaWxlCmRpZmYgLS1naXQgYS9wbHkvLmdpdGlnbm9yZSBiL3BseS8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNDZkNmUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDkgQEAKKyoucHljCisqLnB5bworX19weWNhY2hlX18KKyoub3V0CisqLmRpZgorKn4KKy9kaXN0CisvYnVpbGQKKy8qLmVnZy1pbmZvCmRpZmYgLS1naXQgYS9wbHkvLnRyYXZpcy55bWwgYi9wbHkvLnRyYXZpcy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZkY2M2YgotLS0gL2Rldi9udWxsCisrKyBiL3BseS8udHJhdmlzLnltbApAQCAtMCwwICsxLDExIEBACitsYW5ndWFnZTogcHl0aG9uCitweXRob246CisgIC0gIjIuNiIKKyAgLSAiMi43IgorICAtICIzLjMiCisgIC0gIjMuNCIKKyAgLSAiMy41IgorICAtICIzLjYiCitpbnN0YWxsOgorICAtICJwaXAgaW5zdGFsbCAuICIKK3NjcmlwdDogImNkIHRlc3QgJiYgcHl0aG9uIHRlc3RsZXgucHkgJiYgcHl0aG9uIHRlc3R5YWNjLnB5IgpkaWZmIC0tZ2l0IGEvcGx5L0FOTk9VTkNFIGIvcGx5L0FOTk9VTkNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MzAwNTEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvQU5OT1VOQ0UKQEAgLTAsMCArMSw0MCBAQAorSmFudWFyeSAzMSwgMjAxNworCisgICAgICAgICAgICAgICAgICBBbm5vdW5jaW5nIDogIFBMWS0zLjEwIChQeXRob24gTGV4LVlhY2MpCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuZGFiZWF6LmNvbS9wbHkKKworSSdtIHBsZWFzZWQgdG8gYW5ub3VuY2UgUExZLTMuMTAtLWEgcHVyZSBQeXRob24gaW1wbGVtZW50YXRpb24gb2YgdGhlCitjb21tb24gcGFyc2luZyB0b29scyBsZXggYW5kIHlhY2MuICBQTFktMy4xMCBpcyBhIG1pbm9yIGJ1ZyBmaXgKK3JlbGVhc2UuICBJdCBzdXBwb3J0cyBib3RoIFB5dGhvbiAyIGFuZCBQeXRob24gMy4KKworSWYgeW91IGFyZSBuZXcgdG8gUExZLCBoZXJlIGFyZSBhIGZldyBoaWdobGlnaHRzOgorCistICBQTFkgaXMgY2xvc2VseSBtb2RlbGVkIGFmdGVyIHRyYWRpdGlvbmFsIGxleC95YWNjLiAgSWYgeW91IGtub3cgaG93IAorICAgdG8gdXNlIHRoZXNlIG9yIHNpbWlsYXIgdG9vbHMgaW4gb3RoZXIgbGFuZ3VhZ2VzLCB5b3Ugd2lsbCBmaW5kCisgICBQTFkgdG8gYmUgY29tcGFyYWJsZS4KKworLSAgUExZIHByb3ZpZGVzIHZlcnkgZXh0ZW5zaXZlIGVycm9yIHJlcG9ydGluZyBhbmQgZGlhZ25vc3RpYworICAgaW5mb3JtYXRpb24gdG8gYXNzaXN0IGluIHBhcnNlciBjb25zdHJ1Y3Rpb24uICBUaGUgb3JpZ2luYWwKKyAgIGltcGxlbWVudGF0aW9uIHdhcyBkZXZlbG9wZWQgZm9yIGluc3RydWN0aW9uYWwgcHVycG9zZXMuICBBcworICAgYSByZXN1bHQsIHRoZSBzeXN0ZW0gdHJpZXMgdG8gaWRlbnRpZnkgdGhlIG1vc3QgY29tbW9uIHR5cGVzCisgICBvZiBlcnJvcnMgbWFkZSBieSBub3ZpY2UgdXNlcnMuCisKKy0gIFBMWSBwcm92aWRlcyBmdWxsIHN1cHBvcnQgZm9yIGVtcHR5IHByb2R1Y3Rpb25zLCBlcnJvciByZWNvdmVyeSwKKyAgIHByZWNlZGVuY2UgcnVsZXMsIGFuZCBhbWJpZ3VvdXMgZ3JhbW1hcnMuCisKKy0gIFBhcnNpbmcgaXMgYmFzZWQgb24gTFItcGFyc2luZyB3aGljaCBpcyBmYXN0LCBtZW1vcnkgZWZmaWNpZW50LAorICAgYmV0dGVyIHN1aXRlZCB0byBsYXJnZSBncmFtbWFycywgYW5kIHdoaWNoIGhhcyBhIG51bWJlciBvZiBuaWNlCisgICBwcm9wZXJ0aWVzIHdoZW4gZGVhbGluZyB3aXRoIHN5bnRheCBlcnJvcnMgYW5kIG90aGVyIHBhcnNpbmcgCisgICBwcm9ibGVtcy4gQ3VycmVudGx5LCBQTFkgY2FuIGJ1aWxkIGl0cyBwYXJzaW5nIHRhYmxlcyB1c2luZyAKKyAgIGVpdGhlciBTTFIgb3IgTEFMUigxKSBhbGdvcml0aG1zLiAKKworTW9yZSBpbmZvcm1hdGlvbiBhYm91dCBQTFkgY2FuIGJlIG9idGFpbmVkIG9uIHRoZSBQTFkgd2VicGFnZSBhdDoKKworICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuZGFiZWF6LmNvbS9wbHkKKworUExZIGlzIGZyZWVseSBhdmFpbGFibGUuCisKK0NoZWVycywKKworRGF2aWQgQmVhemxleSAoaHR0cDovL3d3dy5kYWJlYXouY29tKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BseS9DSEFOR0VTIGIvcGx5L0NIQU5HRVMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE1YzIzMQotLS0gL2Rldi9udWxsCisrKyBiL3BseS9DSEFOR0VTCkBAIC0wLDAgKzEsMTM5NCBAQAorVmVyc2lvbiAzLjEwCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzAxLzMxLzE3OiBiZWF6bGV5CisgICAgICAgICAgQ2hhbmdlZCBncmFtbWFyIHNpZ25hdHVyZSBjb21wdXRhdGlvbiB0byBub3QgaW52b2x2ZSBoYXNoaW5nCisgICAgICAgICAgZnVuY3Rpb25zLiBQYXJ0cyBhcmUganVzdCBjb21iaW5lZCBpbnRvIGEgYmlnIHN0cmluZy4KKworMTAvMDcvMTY6IGJlYXpsZXkKKyAgICAgICAgICBGaXhlZCBJc3N1ZSAjMTAxOiBJbmNvcnJlY3Qgc2hpZnQtcmVkdWNlIGNvbmZsaWN0IHJlc29sdXRpb24gd2l0aAorICAgICAgICAgIHByZWNlZGVuY2Ugc3BlY2lmaWVyLgorCisgICAgICAgICAgUExZIHdhcyBpbmNvcnJlY3RseSByZXNvbHZpbmcgc2hpZnQtcmVkdWNlIGNvbmZsaWN0cyBpbiBjZXJ0YWluCisgICAgICAgICAgY2FzZXMuICBGb3IgZXhhbXBsZSwgaW4gdGhlIGV4YW1wbGUvY2FsYy9jYWxjLnB5IGV4YW1wbGUsIHlvdSAKKyAgICAgICAgICBjb3VsZCB0cmlnZ2VyIGl0IGRvaW5nIHRoaXM6CisKKyAgICAgICAgICBjYWxjID4gLTMgLSA0ICAgICAgICAgICAgCisgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAoY29ycmVjdCBhbnN3ZXIgc2hvdWxkIGJlIC03KQorICAgICAgICAgIGNhbGMgPgorCisgICAgICAgICAgSXNzdWUgYW5kIHN1Z2dlc3RlZCBwYXRjaCBjb250cmlidXRlZCBieSBodHRwczovL2dpdGh1Yi5jb20vUm9tYVZpcworICAgICAgICAgICAKK1ZlcnNpb24gMy45CistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzA4LzMwLzE2OiBiZWF6bGV5CisgICAgICAgICAgRXhwb3NlZCB0aGUgcGFyc2VyIHN0YXRlIG51bWJlciBhcyB0aGUgcGFyc2VyLnN0YXRlIGF0dHJpYnV0ZQorICAgICAgICAgIGluIHByb2R1Y3Rpb25zIGFuZCBlcnJvciBmdW5jdGlvbnMuIEZvciBleGFtcGxlOgorCisgICAgICAgICAgZGVmIHBfc29tZXJ1bGUocCk6CisgICAgICAgICAgICAgICcnJworICAgICAgICAgICAgICBydWxlIDogQSBCIEMKKyAgICAgICAgICAgICAgJycnCisgICAgICAgICAgICAgIHByaW50KCdTdGF0ZTonLCBwLnBhcnNlci5zdGF0ZSkKKworICAgICAgICAgIE1heSBhZGRyZXNzIGlzc3VlICM2NSAocHVibGlzaCBjdXJyZW50IHN0YXRlIGluIGVycm9yIGNhbGxiYWNrKS4KKworMDgvMzAvMTY6IGJlYXpsZXkgCisgICAgICAgICAgRml4ZWQgSXNzdWUgIzg4LiBQeXRob24zIGNvbXBhdGliaWxpdHkgd2l0aCBwbHkvY3BwLgorCiswOC8zMC8xNjogYmVhemxleQorICAgICAgICAgIEZpeGVkIElzc3VlICM5My4gUGx5IGNhbiBjcmFzaCBpZiBTeW50YXhFcnJvciBpcyByYWlzZWQgaW5zaWRlCisgICAgICAgICAgYSBwcm9kdWN0aW9uLiAgIE5vdCBhY3R1YWxseSBzdXJlIGlmIHRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgIHdvcmtlZCBhcyBkb2N1bWVudGVkIGF0IGFsbC4gIFlhY2MgaGFzIGJlZW4gbW9kaWZpZWQgdG8gZm9sbG93CisgICAgICAgICAgdGhlIHNwZWMgYXMgb3V0bGluZWQgaW4gdGhlIENIQU5HRVMgbm90ZWQgZm9yIDExLzI3LzA3IGJlbG93LgorCiswOC8zMC8xNjogYmVhemxleQorICAgICAgICAgIEZpeGVkIElzc3VlICM5Ny4gRmFpbHVyZSB3aXRoIGNvZGUgdmFsaWRhdGlvbiB3aGVuIHRoZSBvcmlnaW5hbAorICAgICAgICAgIHNvdXJjZSBmaWxlcyBhcmVuJ3QgcHJlc2VudC4gICBWYWxpZGF0aW9uIHN0ZXAgbm93IGlnbm9yZXMKKyAgICAgICAgICB0aGUgbWlzc2luZyBmaWxlLgorCiswOC8zMC8xNjogYmVhemxleQorICAgICAgICAgIE1pbm9yIGZpeGVzIHRvIHZlcnNpb24gbnVtYmVycy4KKworVmVyc2lvbiAzLjgKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMTAvMDIvMTU6IGJlYXpsZXkKKyAgICAgICAgICBGaXhlZCBpc3N1ZXMgcmVsYXRlZCB0byBQeXRob24gMy41LiBQYXRjaCBjb250cmlidXRlZCBieSBCYXJyeSBXYXJzYXcuCisKK1ZlcnNpb24gMy43CistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzA4LzI1LzE1OiBiZWF6bGV5CisgICAgICAgICAgRml4ZWQgcHJvYmxlbXMgd2hlbiByZWFkaW5nIHRhYmxlIGZpbGVzIGZyb20gcGlja2xlZCBkYXRhLgorCiswNS8wNy8xNTogYmVhemxleQorICAgICAgICAgIEZpeGVkIHJlZ3Jlc3Npb24gaW4gaGFuZGxpbmcgb2YgdGFibGUgbW9kdWxlcyBpZiBzcGVjaWZpZWQgYXMgbW9kdWxlCisgICAgICAgICAgb2JqZWN0cy4gICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2RhYmVhei9wbHkvaXNzdWVzLzYzCisKK1ZlcnNpb24gMy42CistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzA0LzI1LzE1OiBiZWF6bGV5CisgICAgICAgICAgSWYgUExZIGlzIHVuYWJsZSB0byBjcmVhdGUgdGhlICdwYXJzZXIub3V0JyBvciAncGFyc2V0YWIucHknIGZpbGVzIGR1ZQorICAgICAgICAgIHRvIHBlcm1pc3Npb24gaXNzdWVzLCBpdCBub3cganVzdCBpc3N1ZXMgYSB3YXJuaW5nIG1lc3NhZ2UgYW5kCisgICAgICAgICAgY29udGludWVzIHRvIG9wZXJhdGUuIFRoaXMgY291bGQgaGFwcGVuIGlmIGEgbW9kdWxlIHVzaW5nIFBMWQorCSAgaXMgaW5zdGFsbGVkIGluIGEgZnVubnkgd2F5IHdoZXJlIHRhYmxlcyBoYXZlIHRvIGJlIHJlZ2VuZXJhdGVkLCBidXQKKyAgICAgICAgICBmb3Igd2hhdGV2ZXIgcmVhc29uLCB0aGUgdXNlciBkb2Vzbid0IGhhdmUgd3JpdGUgcGVybWlzc2lvbiBvbgorICAgICAgICAgIHRoZSBkaXJlY3Rvcnkgd2hlcmUgUExZIHdhbnRzIHRvIHB1dCB0aGVtLiAgCisKKzA0LzI0LzE1OiBiZWF6bGV5CisgICAgICAgICAgRml4ZWQgc29tZSBpc3N1ZXMgcmVsYXRlZCB0byB1c2Ugb2YgcGFja2FnZXMgYW5kIHRhYmxlIGZpbGUKKyAgICAgICAgICBtb2R1bGVzLiAgSnVzdCB0byBlbXBoYXNpemUsIFBMWSBub3cgZ2VuZXJhdGVzIGl0cyBzcGVjaWFsCisgICAgICAgICAgZmlsZXMgc3VjaCBhcyAncGFyc2V0YWIucHknIGFuZCAnbGV4dGFiLnB5JyBpbiB0aGUgKlNBTUUqCisgICAgICAgICAgZGlyZWN0b3J5IGFzIHRoZSBzb3VyY2UgZmlsZSB0aGF0IHVzZXMgbGV4KCkgYW5kIHlhY2MoKS4KKworCSAgSWYgZm9yIHNvbWUgcmVhc29uLCB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIHRhYmxlCisgICAgICAgICAgbW9kdWxlLCB1c2UgdGhlIHRhYm1vZHVsZSBhbmQgbGV4dGFiIG9wdGlvbnM6CisKKyAgICAgICAgICAgICBsZXhlciA9IGxleC5sZXgobGV4dGFiPSdzcGFtbGV4dGFiJykKKyAgICAgICAgICAgICBwYXJzZXIgPSB5YWNjLnlhY2ModGFibW9kdWxlPSdzcGFtcGFyc2V0YWInKQorCisgICAgICAgICAgSWYgeW91IHNwZWNpZnkgYSBzaW1wbGUgbmFtZSBhcyBzaG93biwgdGhlIG1vZHVsZSB3aWxsIHN0aWxsIGJlCisgICAgICAgICAgY3JlYXRlZCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGZpbGUgaW52b2tpbmcgbGV4KCkgb3IgeWFjYygpLgorICAgICAgICAgIElmIHlvdSB3YW50IHRoZSB0YWJsZSBmaWxlcyB0byBiZSBwbGFjZWQgaW50byBhIGRpZmZlcmVudCBwYWNrYWdlLAorICAgICAgICAgIHRoZW4gZ2l2ZSBhIGZ1bGx5IHF1YWxpZmllZCBwYWNrYWdlIG5hbWUuICBGb3IgZXhhbXBsZToKKworICAgICAgICAgICAgIGxleGVyID0gbGV4LmxleChsZXh0YWI9J3BrZ25hbWUuZmlsZXMubGV4dGFiJykKKyAgICAgICAgICAgICBwYXJzZXIgPSB5YWNjLnlhY2ModGFibW9kdWxlPSdwa2duYW1lLmZpbGVzLnBhcnNldGFiJykKKworICAgICAgICAgIEZvciB0aGlzIHRvIHdvcmssICdwa2duYW1lLmZpbGVzJyBtdXN0IGFscmVhZHkgZXhpc3QgYXMgYSB2YWxpZCAKKyAgICAgICAgICBQeXRob24gcGFja2FnZSAoaS5lLiwgdGhlIGRpcmVjdG9yaWVzIG11c3QgYWxyZWFkeSBleGlzdCBhbmQgYmUKKyAgICAgICAgICBzZXQgdXAgd2l0aCB0aGUgcHJvcGVyIF9faW5pdF9fLnB5IGZpbGVzLCBldGMuKS4KKworVmVyc2lvbiAzLjUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMDQvMjEvMTU6IGJlYXpsZXkKKyAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBkZWZhdWx0ZWRfc3RhdGVzIGluIHRoZSBwYXJzZXIuICBBCisgICAgICAgICAgZGVmYXVsdGVkX3N0YXRlIGlzIGEgc3RhdGUgd2hlcmUgdGhlIG9ubHkgbGVnYWwgYWN0aW9uIGlzIGEKKyAgICAgICAgICByZWR1Y3Rpb24gb2YgYSBzaW5nbGUgZ3JhbW1hciBydWxlIGFjcm9zcyBhbGwgdmFsaWQgaW5wdXQKKyAgICAgICAgICB0b2tlbnMuICBGb3Igc3VjaCBzdGF0ZXMsIHRoZSBydWxlIGlzIHJlZHVjZWQgYW5kIHRoZQorICAgICAgICAgIHJlYWRpbmcgb2YgdGhlIG5leHQgbG9va2FoZWFkIHRva2VuIGlzIGRlbGF5ZWQgdW50aWwgaXQgaXMKKyAgICAgICAgICBhY3R1YWxseSBuZWVkZWQgYXQgYSBsYXRlciBwb2ludCBpbiB0aW1lLgorCisJICBUaGlzIGRlbGF5IGluIGNvbnN1bWluZyB0aGUgbmV4dCBsb29rYWhlYWQgdG9rZW4gaXMgYQorCSAgcG90ZW50aWFsbHkgaW1wb3J0YW50IGZlYXR1cmUgaW4gYWR2YW5jZWQgcGFyc2luZworCSAgYXBwbGljYXRpb25zIHRoYXQgcmVxdWlyZSB0aWdodCBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZQorCSAgbGV4ZXIgYW5kIHRoZSBwYXJzZXIuICBGb3IgZXhhbXBsZSwgYSBncmFtbWFyIHJ1bGUgY2hhbmdlCisJICBtb2RpZnkgdGhlIGxleGVyIHN0YXRlIHVwb24gcmVkdWN0aW9uIGFuZCBoYXZlIHN1Y2ggY2hhbmdlcworCSAgdGFrZSBlZmZlY3QgYmVmb3JlIHRoZSBuZXh0IGlucHV0IHRva2VuIGlzIHJlYWQuCisKKwkgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgorCSAgT25lIHBvdGVudGlhbCBkYW5nZXIgb2YgZGVmYXVsdGVkX3N0YXRlcyBpcyB0aGF0IHN5bnRheAorCSAgZXJyb3JzIG1pZ2h0IGJlIGRlZmVycmVkIHRvIGEgYSBsYXRlciBwb2ludCBvZiBwcm9jZXNzaW5nCisJICB0aGFuIHdoZXJlIHRoZXkgd2VyZSBkZXRlY3RlZCBpbiBwYXN0IHZlcnNpb25zIG9mIFBMWS4KKwkgIFRodXMsIGl0J3MgcG9zc2libGUgdGhhdCB5b3VyIGVycm9yIGhhbmRsaW5nIGNvdWxkIGNoYW5nZQorCSAgc2xpZ2h0bHkgb24gdGhlIHNhbWUgaW5wdXRzLiAgZGVmYXVsdGVkX3N0YXRlcyBkbyBub3QgY2hhbmdlCisJICB0aGUgb3ZlcmFsbCBwYXJzaW5nIG9mIHRoZSBpbnB1dCAoaS5lLiwgdGhlIHNhbWUgZ3JhbW1hciBpcworCSAgYWNjZXB0ZWQpLgorCisJICBJZiBmb3Igc29tZSByZWFzb24sIHlvdSBuZWVkIHRvIGRpc2FibGUgZGVmYXVsdGVkIHN0YXRlcywKKwkgIHlvdSBjYW4gZG8gdGhpczoKKworICAgICAgICAgICAgICBwYXJzZXIgPSB5YWNjLnlhY2MoKQorICAgICAgICAgICAgICBwYXJzZXIuZGVmYXVsdGVkX3N0YXRlcyA9IHt9CisKKzA0LzIxLzE1OiBiZWF6bGV5CisgICAgICAgICAgRml4ZWQgZGVidWcgbG9nZ2luZyBpbiB0aGUgcGFyc2VyLiAgSXQgd2Fzbid0IHByb3Blcmx5IHJlcG9ydGluZyBnb3RvIHN0YXRlcworICAgICAgICAgIG9uIGdyYW1tYXIgcnVsZSByZWR1Y3Rpb25zLgorCiswNC8yMC8xNTogYmVhemxleQorICAgICAgICAgIEFkZGVkIGFjdGlvbnMgdG8gYmUgZGVmaW5lZCB0byBjaGFyYWN0ZXIgbGl0ZXJhbHMgKElzc3VlICMzMikuICBGb3IgZXhhbXBsZToKKworICAgICAgICAgICAgICBsaXRlcmFscyA9IFsgJ3snLCAnfScgXQorCisgICAgICAgICAgICAgIGRlZiB0X2xicmFjZSh0KToKKyAgICAgICAgICAgICAgICAgIHInXHsnCisgICAgICAgICAgICAgICAgICAjIFNvbWUgYWN0aW9uCisgICAgICAgICAgICAgICAgICB0LnR5cGUgPSAneycKKyAgICAgICAgICAgICAgICAgIHJldHVybiB0CisKKyAgICAgICAgICAgICAgZGVmIHRfcmJyYWNlKHQpOgorICAgICAgICAgICAgICAgICAgcidcfScKKyAgICAgICAgICAgICAgICAgICMgU29tZSBhY3Rpb24KKyAgICAgICAgICAgICAgICAgIHQudHlwZSA9ICd9JworICAgICAgICAgICAgICAgICAgcmV0dXJuIHQKKworMDQvMTkvMTU6IGJlYXpsZXkKKyAgICAgICAgICBJbXBvcnQgb2YgdGhlICdwYXJzZXRhYi5weScgZmlsZSBpcyBub3cgY29uc3RyYWluZWQgdG8gb25seSBjb25zaWRlciB0aGUKKyAgICAgICAgICBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5IHRoZSBvdXRwdXRkaXIgYXJndW1lbnQgdG8geWFjYygpLiAgSWYgbm90IHN1cHBsaWVkLAorICAgICAgICAgIHRoZSBpbXBvcnQgd2lsbCBvbmx5IGNvbnNpZGVyIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGdyYW1tYXIgaXMgZGVmaW5lZC4KKyAgICAgICAgICBUaGlzIHNob3VsZCBncmVhdGx5IHJlZHVjZSBwcm9ibGVtcyB3aXRoIHRoZSB3cm9uZyBwYXJzZXRhYi5weSBmaWxlIGJlaW5nCisgICAgICAgICAgaW1wb3J0ZWQgYnkgbWlzdGFrZS4gRm9yIGV4YW1wbGUsIGlmIGl0J3MgZm91bmQgc29tZXdoZXJlIGVsc2Ugb24gdGhlIHBhdGgKKyAgICAgICAgICBieSBhY2NpZGVudC4KKworCSAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqICBJdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyBtaWdodCBicmVhayBzb21lCisgICAgICAgICAgcGFja2FnaW5nL2RlcGxveW1lbnQgc2V0dXAgaWYgUExZIHdhcyBpbnN0cnVjdGVkIHRvIHBsYWNlIGl0cyBwYXJzZXRhYi5weQorICAgICAgICAgIGluIGEgZGlmZmVyZW50IGxvY2F0aW9uLiAgWW91J2xsIGhhdmUgdG8gc3BlY2lmeSBhIHByb3BlciBvdXRwdXRkaXI9IGFyZ3VtZW50CisgICAgICAgICAgdG8geWFjYygpIHRvIGZpeCB0aGlzIGlmIG5lZWRlZC4KKworMDQvMTkvMTU6IGJlYXpsZXkKKyAgICAgICAgICBDaGFuZ2VkIGRlZmF1bHQgb3V0cHV0IGRpcmVjdG9yeSB0byBiZSB0aGUgc2FtZSBhcyB0aGF0IGluIHdoaWNoIHRoZQorICAgICAgICAgIHlhY2MgZ3JhbW1hciBpcyBkZWZpbmVkLiAgSWYgeW91ciBncmFtbWFyIGlzIGluIGEgZmlsZSAnY2FsYy5weScsCisgICAgICAgICAgdGhlbiB0aGUgcGFyc2V0YWIucHkgYW5kIHBhcnNlci5vdXQgZmlsZXMgc2hvdWxkIGJlIGdlbmVyYXRlZCBpbiB0aGUKKyAgICAgICAgICBzYW1lIGRpcmVjdG9yeSBhcyB0aGF0IGZpbGUuICBUaGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGNhbiBiZSBjaGFuZ2VkCisgICAgICAgICAgdXNpbmcgdGhlIG91dHB1dGRpcj0gYXJndW1lbnQgdG8geWFjYygpLgorCiswNC8xOS8xNTogYmVhemxleQorICAgICAgICAgIENoYW5nZWQgdGhlIHBhcnNldGFiLnB5IGZpbGUgc2lnbmF0dXJlIHNsaWdodGx5IHNvIHRoYXQgdGhlIHBhcnNldGFiIHdvbid0CisgICAgICAgICAgcmVnZW5lcmF0ZSBpZiBjcmVhdGVkIG9uIGEgZGlmZmVyZW50IG1ham9yIHZlcnNpb24gb2YgUHl0aG9uIChpZS4sIGEgCisgICAgICAgICAgcGFyc2V0YWIgY3JlYXRlZCBvbiBQeXRob24gMiB3aWxsIHdvcmsgd2l0aCBQeXRob24gMykuCisKKzA0LzE2LzE1OiBiZWF6bGV5CisgICAgICAgICAgRml4ZWQgSXNzdWUgIzQ0IGNhbGxfZXJyb3JmdW5jKCkgc2hvdWxkIHJldHVybiB0aGUgcmVzdWx0IG9mIGVycm9yZnVuYygpCisKKzA0LzE2LzE1OiBiZWF6bGV5CisgICAgICAgICAgU3VwcG9ydCBmb3IgdmVyc2lvbnMgb2YgUHl0aG9uIDwyLjcgaXMgb2ZmaWNpYWxseSBkcm9wcGVkLiAgUExZIG1heSB3b3JrLCBidXQKKyAgICAgICAgICB0aGUgdW5pdCB0ZXN0cyByZXF1aXJlcyBQeXRob24gMi43IG9yIG5ld2VyLgorCiswNC8xNi8xNTogYmVhemxleQorICAgICAgICAgIEZpeGVkIGJ1ZyByZWxhdGVkIHRvIGNhbGxpbmcgeWFjYyhzdGFydD0uLi4pLiAgIFBMWSB3YXNuJ3QgcmVnZW5lcmF0aW5nIHRoZQorICAgICAgICAgIHRhYmxlIGZpbGUgY29ycmVjdGx5IGZvciB0aGlzIGNhc2UuCisKKzA0LzE2LzE1OiBiZWF6bGV5CisgICAgICAgICAgQWRkZWQgc2tpcHBlZCB0ZXN0cyBmb3IgUHlQeSBhbmQgSmF2YS4gIFJlbGF0ZWQgdG8gdXNlIG9mIFB5dGhvbidzIC1PIG9wdGlvbi4KKworMDUvMjkvMTM6IGJlYXpsZXkKKyAgICAgICAgICBBZGRlZCBmaWx0ZXIgdG8gbWFrZSB1bml0IHRlc3RzIHBhc3MgdW5kZXIgJ3B5dGhvbiAtMycuCisgICAgICAgICAgUmVwb3J0ZWQgYnkgTmVpbCBNdWxsZXIuCisgICAgICAgCiswNS8yOS8xMzogYmVhemxleQorICAgICAgICAgIEZpeGVkIENQUF9JTlRFR0VSIHJlZ2V4IGluIHBseS9jcHAucHkgKElzc3VlIDIxKS4KKwkgIFJlcG9ydGVkIGJ5IEB2YnJhdW4uCisgCiswNS8yOS8xMzogYmVhemxleQorICAgICAgICAgIEZpeGVkIHlhY2MgdmFsaWRhdGlvbiBidWdzIHdoZW4gZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB1bmljb2RlX2xpdGVyYWxzCisgICAgICAgICAgaXMgYmVpbmcgdXNlZC4gIFJlcG9ydGVkIGJ5IEtlbm4gS25vd2xlcy4KKworMDUvMjkvMTM6IGJlYXpsZXkKKyAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBUcmF2aXMtQ0kuICBDb250cmlidXRlZCBieSBLZW5uIEtub3dsZXMuCisKKzA1LzI5LzEzOiBiZWF6bGV5CisgICAgICAgICAgQWRkZWQgYSAuZ2l0aWdub3JlIGZpbGUuICBTdWdnZXN0ZWQgYnkgS2VubiBLbm93bGVzLgorCiswNS8yOS8xMzogYmVhemxleQorCSAgRml4ZWQgdmFsaWRhdGlvbiBwcm9ibGVtcyBmb3Igc291cmNlIGZpbGVzIHRoYXQgaW5jbHVkZSBhIAorICAgICAgICAgIGRpZmZlcmVudCBzb3VyY2UgY29kZSBlbmNvZGluZyBzcGVjaWZpZXIuICBGaXggcmVsaWVzIG9uCisgICAgICAgICAgdGhlIGluc3BlY3QgbW9kdWxlLiAgU2hvdWxkIHdvcmsgb24gUHl0aG9uIDIuNiBhbmQgbmV3ZXIuCisgICAgICAgICAgTm90IHN1cmUgYWJvdXQgb2xkZXIgdmVyc2lvbnMgb2YgUHl0aG9uLgorICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IE1pY2hhZWwgRHJvZXR0Ym9vbQorCiswNS8yMS8xMzogYmVhemxleQorICAgICAgICAgIEZpeGVkIHVuaXQgdGVzdHMgZm9yIHlhY2MgdG8gZWxpbWluYXRlIHJhbmRvbSBmYWlsdXJlcyBkdWUgdG8gZGljdCBoYXNoIHZhbHVlCisJICByYW5kb21pemF0aW9uIGluIFB5dGhvbiAzLjMKKwkgIFJlcG9ydGVkIGJ5IEFyZnJldmVyCisKKzEwLzE1LzEyOiBiZWF6bGV5CisgICAgICAgICAgRml4ZWQgY29tbWVudCB3aGl0ZXNwYWNlIHByb2Nlc3NpbmcgYnVncyBpbiBwbHkvY3BwLnB5LgorICAgICAgICAgIFJlcG9ydGVkIGJ5IEFsZXhlaSBQb3Nvc2luLgorCisxMC8xNS8xMjogYmVhemxleQorICAgICAgICAgIEZpeGVkIHRva2VuIG5hbWVzIGluIHBseS9jdG9rZW5zLnB5IHRvIG1hdGNoIHJ1bGUgbmFtZXMuCisgICAgICAgICAgUmVwb3J0ZWQgYnkgQWxleGVpIFBvc29zaW4uCisKKzA0LzI2LzEyOiBiZWF6bGV5CisgICAgICAgICAgQ2hhbmdlcyB0byBmdW5jdGlvbnMgYXZhaWxhYmxlIGluIHBhbmljIG1vZGUgZXJyb3IgcmVjb3Zlci4gIEluIHByZXZpb3VzIHZlcnNpb25zCisgICAgICAgICAgb2YgUExZLCB0aGUgZm9sbG93aW5nIGdsb2JhbCBmdW5jdGlvbnMgd2VyZSBhdmFpbGFibGUgZm9yIHVzZSBpbiB0aGUgcF9lcnJvcigpIHJ1bGU6CisKKyAgICAgICAgICAgICAgICAgeWFjYy5lcnJvaygpICAgICAgICMgUmVzZXQgZXJyb3Igc3RhdGUKKyAgICAgICAgICAgICAgICAgeWFjYy50b2tlbigpICAgICAgICMgR2V0IHRoZSBuZXh0IHRva2VuCisgICAgICAgICAgICAgICAgIHlhY2MucmVzdGFydCgpICAgICAjIFJlc2V0IHRoZSBwYXJzaW5nIHN0YWNrCisKKyAgICAgICAgICBUaGUgdXNlIG9mIGdsb2JhbCB2YXJpYWJsZXMgd2FzIHByb2JsZW1hdGljIGZvciBjb2RlIGludm9sdmluZyBtdWx0aXBsZSBwYXJzZXJzCisgICAgICAgICAgYW5kIGZyYW5rbHkgd2FzIGEgcG9vciBkZXNpZ24gb3ZlcmFsbC4gICBUaGVzZSBmdW5jdGlvbnMgaGF2ZSBiZWVuIG1vdmVkIHRvIG1ldGhvZHMKKyAgICAgICAgICBvZiB0aGUgcGFyc2VyIGluc3RhbmNlIGNyZWF0ZWQgYnkgdGhlIHlhY2MoKSBmdW5jdGlvbi4gICBZb3Ugc2hvdWxkIHdyaXRlIGNvZGUgbGlrZQorICAgICAgICAgIHRoaXM6CisKKyAgICAgICAgICAgICAgICBkZWYgcF9lcnJvcihwKToKKyAgICAgICAgICAgICAgICAgICAgLi4uCisgICAgICAgICAgICAgICAgICAgIHBhcnNlci5lcnJvaygpCisKKyAgICAgICAgICAgICAgICBwYXJzZXIgPSB5YWNjLnlhY2MoKQorCisgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqICBUaGUgb3JpZ2luYWwgZ2xvYmFsIGZ1bmN0aW9ucyBub3cgaXNzdWUgYQorICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZy4KKyAgICAgICAgIAorMDQvMTkvMTI6IGJlYXpsZXkKKyAgICAgICAgICBGaXhlZCBzb21lIHByb2JsZW1zIHdpdGggbGluZSBhbmQgcG9zaXRpb24gdHJhY2tpbmcgYW5kIHRoZSB1c2Ugb2YgZXJyb3IKKyAgICAgICAgICBzeW1ib2xzLiAgIElmIHlvdSBoYXZlIGEgZ3JhbW1hciBydWxlIGludm9sdmluZyBhbiBlcnJvciBydWxlIGxpa2UgdGhpczoKKworICAgICAgICAgICAgICAgZGVmIHBfYXNzaWdubWVudF9iYWQocCk6CisgICAgICAgICAgICAgICAgICAgJycnYXNzaWdubWVudCA6IGxvY2F0aW9uIEVRVUFMUyBlcnJvciBTRU1JJycnCisgICAgICAgICAgICAgICAgICAgLi4uCisKKyAgICAgICAgICBZb3UgY2FuIG5vdyBkbyBsaW5lIGFuZCBwb3NpdGlvbiB0cmFja2luZyBvbiB0aGUgZXJyb3IgdG9rZW4uICBGb3IgZXhhbXBsZToKKworICAgICAgICAgICAgICAgZGVmIHBfYXNzaWdubWVudF9iYWQocCk6CisgICAgICAgICAgICAgICAgICAgJycnYXNzaWdubWVudCA6IGxvY2F0aW9uIEVRVUFMUyBlcnJvciBTRU1JJycnCisgICAgICAgICAgICAgICAgICAgc3RhcnRfbGluZSA9IHAubGluZW5vKDMpCisgICAgICAgICAgICAgICAgICAgc3RhcnRfcG9zICA9IHAubGV4cG9zKDMpCisKKyAgICAgICAgICBJZiB0aGUgdHJhY2tuZz1UcnVlIG9wdGlvbiBpcyBzdXBwbGllZCB0byBwYXJzZSgpLCB5b3UgY2FuIGFkZGl0aW9uYWxseSBnZXQKKyAgICAgICAgICBzcGFuczoKKworICAgICAgICAgICAgICAgZGVmIHBfYXNzaWdubWVudF9iYWQocCk6CisgICAgICAgICAgICAgICAgICAgJycnYXNzaWdubWVudCA6IGxvY2F0aW9uIEVRVUFMUyBlcnJvciBTRU1JJycnCisgICAgICAgICAgICAgICAgICAgc3RhcnRfbGluZSwgZW5kX2xpbmUgPSBwLmxpbmVzcGFuKDMpCisgICAgICAgICAgICAgICAgICAgc3RhcnRfcG9zLCBlbmRfcG9zID0gcC5sZXhzcGFuKDMpCisKKyAgICAgICAgICBOb3RlIHRoYXQgZXJyb3IgaGFuZGxpbmcgaXMgc3RpbGwgYSBoYWlyeSB0aGluZyBpbiBQTFkuIFRoaXMgd29uJ3Qgd29yaworICAgICAgICAgIHVubGVzcyB5b3VyIGxleGVyIGlzIHByb3ZpZGluZyBhY2N1cmF0ZSBpbmZvcm1hdGlvbi4gICBQbGVhc2UgcmVwb3J0IGJ1Z3MuCisgICAgICAgICAgU3VnZ2VzdGVkIGJ5IGEgYnVnIHJlcG9ydGVkIGJ5IERhdmlzIEhlcnJpbmcuCisgICAgICAgICAgICAgIAorMDQvMTgvMTI6IGJlYXpsZXkKKyAgICAgICAgICBDaGFuZ2UgdG8gZG9jIHN0cmluZyBoYW5kbGluZyBpbiBsZXggbW9kdWxlLiAgUmVnZXggcGF0dGVybnMgYXJlIG5vdyBmaXJzdAorICAgICAgICAgIHB1bGxlZCBmcm9tIGEgZnVuY3Rpb24ncyAucmVnZXggYXR0cmlidXRlLiAgSWYgdGhhdCBkb2Vzbid0IGV4aXN0LCB0aGVuCisJICAuZG9jIGlzIGNoZWNrZWQgYXMgYSBmYWxsYmFjay4gICBUaGUgQFRPS0VOIGRlY29yYXRvciBub3cgc2V0cyB0aGUgLnJlZ2V4CisJICBhdHRyaWJ1dGUgb2YgYSBmdW5jdGlvbiBpbnN0ZWFkIG9mIGl0cyBkb2Mgc3RyaW5nLgorCSAgQ2hhbmdlZCBzdWdnZXN0ZWQgYnkgS3Jpc3RvZmZlciBFbGxlcnNnYWFyZCBLb2NoLgorCiswNC8xOC8xMjogYmVhemxleQorICAgICAgICAgIEZpeGVkIGlzc3VlICMxOiBGaXhlZCBfdGFidmVyc2lvbi4gSXQgc2hvdWxkIHVzZSBfX3RhYnZlcnNpb25fXyBpbnN0ZWFkIG9mIF9fdmVyc2lvbl9fCisgICAgICAgICAgUmVwb3J0ZWQgYnkgRGFuaWVsZSBUcmljb2xpCisKKzA0LzE4LzEyOiBiZWF6bGV5CisgICAgICAgICAgRml4ZWQgaXNzdWUgIzg6IExpdGVyYWxzIGVtcHR5IGxpc3QgY2F1c2VzIEluZGV4RXJyb3IKKyAgICAgICAgICBSZXBvcnRlZCBieSBXYWx0ZXIgTmlzc2VuLgorCiswNC8xOC8xMjogYmVhemxleQorICAgICAgICAgIEZpeGVkIGlzc3VlICMxMjogVHlwbyBpbiBjb2RlIHNuaXBwZXQgaW4gZG9jdW1lbnRhdGlvbgorICAgICAgICAgIFJlcG9ydGVkIGJ5IGZsb3JpYW5zY2hhbmRhLgorCiswNC8xOC8xMjogYmVhemxleQorICAgICAgICAgIEZpeGVkIGlzc3VlICMxMDogQ29ycmVjdGx5IGVzY2FwZSB0X1hPUkVRVUFMIHBhdHRlcm4uCisgICAgICAgICAgUmVwb3J0ZWQgYnkgQW5keSBLaXR0bmVyLgorCitWZXJzaW9uIDMuNAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiswMi8xNy8xMTogYmVhemxleQorICAgICAgICAgIE1pbm9yIHBhdGNoIHRvIG1ha2UgY3BwLnB5IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMy4gIE5vdGU6IFRoaXMKKyAgICAgICAgICBpcyBhbiBleHBlcmltZW50YWwgZmlsZSBub3QgY3VycmVudGx5IHVzZWQgYnkgdGhlIHJlc3Qgb2YgUExZLgorCiswMi8xNy8xMTogYmVhemxleQorICAgICAgICAgIEZpeGVkIHNldHVwLnB5IHRyb3ZlIGNsYXNzaWZpZXJzIHRvIHByb3Blcmx5IGxpc3QgUExZIGFzCisgICAgICAgICAgUHl0aG9uIDMgY29tcGF0aWJsZS4KKworMDEvMDIvMTE6IGJlYXpsZXkKKyAgICAgICAgICBNaWdyYXRpb24gb2YgcmVwb3NpdG9yeSB0byBnaXRodWIuCisKK1ZlcnNpb24gMy4zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMDgvMjUvMDk6IGJlYXpsZXkKKyAgICAgICAgICBGaXhlZCBpc3N1ZSAxNSByZWxhdGVkIHRvIHRoZSBzZXRfbGluZW5vKCkgbWV0aG9kIGluIHlhY2MuICBSZXBvcnRlZCBieQorCSAgbWRzaGVycnkuCisKKzA4LzI1LzA5OiBiZWF6bGV5CisgICAgICAgICAgRml4ZWQgYSBidWcgcmVsYXRlZCB0byByZWd1bGFyIGV4cHJlc3Npb24gY29tcGlsYXRpb24gZmxhZ3Mgbm90IGJlaW5nCisgICAgICAgICAgcHJvcGVybHkgc3RvcmVkIGluIGxleHRhYi5weSBmaWxlcyBjcmVhdGVkIGJ5IHRoZSBsZXhlciB3aGVuIHJ1bm5pbmcKKyAgICAgICAgICBpbiBvcHRpbWl6ZSBtb2RlLiAgUmVwb3J0ZWQgYnkgQnJ1Y2UgRnJlZGVyaWtzZW4uCisKKworVmVyc2lvbiAzLjIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiswMy8yNC8wOTogYmVhemxleQorICAgICAgICAgIEFkZGVkIGFuIGV4dHJhIGNoZWNrIHRvIG5vdCBwcmludCBkdXBsaWNhdGVkIHdhcm5pbmcgbWVzc2FnZXMKKyAgICAgICAgICBhYm91dCByZWR1Y2UvcmVkdWNlIGNvbmZsaWN0cy4KKworMDMvMjQvMDk6IGJlYXpsZXkKKyAgICAgICAgICBTd2l0Y2hlZCBQTFkgb3ZlciB0byBhIEJTRC1saWNlbnNlLgorCiswMy8yMy8wOTogYmVhemxleQorICAgICAgICAgIFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbi4gIERpc2NvdmVyZWQgYSBmZXcgcGxhY2VzIHRvIG1ha2UKKyAgICAgICAgICBzcGVlZHVwcyBpbiBMUiB0YWJsZSBnZW5lcmF0aW9uLgorCiswMy8yMy8wOTogYmVhemxleQorICAgICAgICAgIE5ldyB3YXJuaW5nIG1lc3NhZ2UuICBQTFkgbm93IHdhcm5zIGFib3V0IHJ1bGVzIG5ldmVyIAorICAgICAgICAgIHJlZHVjZWQgZHVlIHRvIHJlZHVjZS9yZWR1Y2UgY29uZmxpY3RzLiAgU3VnZ2VzdGVkIGJ5CisgICAgICAgICAgQnJ1Y2UgRnJlZGVyaWtzZW4uCisKKzAzLzIzLzA5OiBiZWF6bGV5CisgICAgICAgICAgU29tZSBjbGVhbi11cCBvZiB3YXJuaW5nIG1lc3NhZ2VzIHJlbGF0ZWQgdG8gcmVkdWNlL3JlZHVjZSBlcnJvcnMuCisKKzAzLzIzLzA5OiBiZWF6bGV5CisgICAgICAgICAgQWRkZWQgYSBuZXcgcGlja2xlZmlsZSBvcHRpb24gdG8geWFjYygpIHRvIHdyaXRlIHRoZSBwYXJzaW5nCisgICAgICAgICAgdGFibGVzIHRvIGEgZmlsZW5hbWUgdXNpbmcgdGhlIHBpY2tsZSBtb2R1bGUuICAgSGVyZSBpcyBob3cKKyAgICAgICAgICBpdCB3b3JrczoKKworICAgICAgICAgICAgICB5YWNjKHBpY2tsZWZpbGU9InBhcnNldGFiLnAiKQorCisgICAgICAgICAgVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgaWYgdGhlIG5vcm1hbCBwYXJzZXRhYi5weSBmaWxlIGlzCisgICAgICAgICAgZXh0cmVtZWx5IGxhcmdlLiAgRm9yIGV4YW1wbGUsIG9uIGp5dGhvbiwgaXQgaXMgaW1wb3NzaWJsZQorICAgICAgICAgIHRvIHJlYWQgcGFyc2luZyB0YWJsZXMgaWYgdGhlIHBhcnNldGFiLnB5IGV4Y2VlZHMgYSBjZXJ0YWluCisgICAgICAgICAgdGhyZXNob2xkLgorCisgICAgICAgICAgVGhlIGZpbGVuYW1lIHN1cHBsaWVkIHRvIHRoZSBwaWNrbGVmaWxlIG9wdGlvbiBpcyBvcGVuZWQKKyAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBvZiB0aGUgUHl0aG9uIAorICAgICAgICAgIGludGVycHJldGVyLiAgSWYgeW91IG5lZWQgdG8gcmVmZXIgdG8gdGhlIGZpbGUgZWxzZXdoZXJlLAorICAgICAgICAgIHlvdSB3aWxsIG5lZWQgdG8gc3VwcGx5IGFuIGFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGguCisKKyAgICAgICAgICBGb3IgbWF4aW11bSBwb3J0YWJpbGl0eSwgdGhlIHBpY2tsZSBmaWxlIGlzIHdyaXR0ZW4KKyAgICAgICAgICB1c2luZyBwcm90b2NvbCAwLiAKKyAKKzAzLzEzLzA5OiBiZWF6bGV5CisgICAgICAgICAgRml4ZWQgYSBidWcgaW4gcGFyc2VyLm91dCBnZW5lcmF0aW9uIHdoZXJlIHRoZSBydWxlIG51bWJlcnMKKyAgICAgICAgICB3aGVyZSBvZmYgYnkgb25lLgorCiswMy8xMy8wOTogYmVhemxleQorICAgICAgICAgIEZpeGVkIGEgc3RyaW5nIGZvcm1hdHRpbmcgYnVnIHdpdGggb25lIG9mIHRoZSBlcnJvciBtZXNzYWdlcy4KKyAgICAgICAgICBSZXBvcnRlZCBieSBSaWNoYXJkIFJlaXRtZXllcgorCitWZXJzaW9uIDMuMQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzAyLzI4LzA5OiBiZWF6bGV5CisgICAgICAgICAgRml4ZWQgYnJva2VuIHN0YXJ0IGFyZ3VtZW50IHRvIHlhY2MoKS4gIFBMWS0zLjAgYnJva2UgdGhpcworICAgICAgICAgIGZlYXR1cmUgYnkgYWNjaWRlbnQuCisKKzAyLzI4LzA5OiBiZWF6bGV5CisgICAgICAgICAgRml4ZWQgZGVidWdnaW5nIG91dHB1dC4geWFjYygpIG5vIGxvbmdlciByZXBvcnRzIHNoaWZ0L3JlZHVjZQorICAgICAgICAgIG9yIHJlZHVjZS9yZWR1Y2UgY29uZmxpY3RzIGlmIGRlYnVnZ2luZyBpcyB0dXJuZWQgb2ZmLiAgVGhpcworICAgICAgICAgIHJlc3RvcmVzIHNpbWlsYXIgYmVoYXZpb3IgaW4gUExZLTIuNS4gICBSZXBvcnRlZCBieSBBbmRyZXcgV2F0ZXJzLgorCitWZXJzaW9uIDMuMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzAyLzAzLzA5OiBiZWF6bGV5CisgICAgICAgICAgRml4ZWQgbWlzc2luZyBsZXhlciBhdHRyaWJ1dGUgb24gY2VydGFpbiB0b2tlbnMgd2hlbgorICAgICAgICAgIGludm9raW5nIHRoZSBwYXJzZXIgcF9lcnJvcigpIGZ1bmN0aW9uLiAgUmVwb3J0ZWQgYnkgCisgICAgICAgICAgQmFydCBXaGl0ZWxleS4KKworMDIvMDIvMDk6IGJlYXpsZXkKKyAgICAgICAgICBUaGUgbGV4KCkgY29tbWFuZCBub3cgZG9lcyBhbGwgZXJyb3ItcmVwb3J0aW5nIGFuZCBkaWFnb25pc3RpY3MKKyAgICAgICAgICB1c2luZyB0aGUgbG9nZ2luZyBtb2R1bGUgaW50ZXJmYWNlLiAgIFBhc3MgaW4gYSBMb2dnZXIgb2JqZWN0CisgICAgICAgICAgdXNpbmcgdGhlIGVycm9ybG9nIHBhcmFtZXRlciB0byBzcGVjaWZ5IGEgZGlmZmVyZW50IGxvZ2dlci4KKworMDIvMDIvMDk6IGJlYXpsZXkKKyAgICAgICAgICBSZWZhY3RvcmVkIHBseS5sZXggdG8gdXNlIGEgbW9yZSBvYmplY3Qtb3JpZW50ZWQgYW5kIG9yZ2FuaXplZAorICAgICAgICAgIGFwcHJvYWNoIHRvIGNvbGxlY3RpbmcgbGV4ZXIgaW5mb3JtYXRpb24uCisKKzAyLzAxLzA5OiBiZWF6bGV5CisgICAgICAgICAgUmVtb3ZlZCB0aGUgbm93YXJuIG9wdGlvbiBmcm9tIGxleCgpLiAgQWxsIG91dHB1dCBpcyBjb250cm9sbGVkCisgICAgICAgICAgYnkgcGFzc2luZyBpbiBhIGxvZ2dlciBvYmplY3QuICAgSnVzdCBwYXNzIGluIGEgbG9nZ2VyIHdpdGggYSBoaWdoCisgICAgICAgICAgbGV2ZWwgc2V0dGluZyB0byBzdXBwcmVzcyBvdXRwdXQuICAgVGhpcyBhcmd1bWVudCB3YXMgbmV2ZXIgCisgICAgICAgICAgZG9jdW1lbnRlZCB0byBiZWdpbiB3aXRoIHNvIGhvcGVmdWxseSBubyBvbmUgd2FzIHJlbHlpbmcgdXBvbiBpdC4KKworMDIvMDEvMDk6IGJlYXpsZXkKKyAgICAgICAgICBEaXNjb3ZlcmVkIGFuZCByZW1vdmVkIGEgZGVhZCBpZi1zdGF0ZW1lbnQgaW4gdGhlIGxleGVyLiAgVGhpcworICAgICAgICAgIHJlc3VsdGVkIGluIGEgNi03JSBzcGVlZHVwIGluIGxleGluZyB3aGVuIEkgdGVzdGVkIGl0LgorCiswMS8xMy8wOTogYmVhemxleQorICAgICAgICAgIE1pbm9yIGNoYW5nZSB0byB0aGUgcHJvY2VkdXJlIGZvciBzaWduYWxsaW5nIGEgc3ludGF4IGVycm9yIGluIGEKKyAgICAgICAgICBwcm9kdWN0aW9uIHJ1bGUuICBBIG5vcm1hbCBTeW50YXhFcnJvciBleGNlcHRpb24gc2hvdWxkIGJlIHJhaXNlZAorICAgICAgICAgIGluc3RlYWQgb2YgeWFjYy5TeW50YXhFcnJvci4KKworMDEvMTMvMDk6IGJlYXpsZXkKKyAgICAgICAgICBBZGRlZCBhIG5ldyBtZXRob2QgcC5zZXRfbGluZW5vKG4sbGluZW5vKSB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldCB0aGUKKyAgICAgICAgICBsaW5lIG51bWJlciBvZiBzeW1ib2wgbiBpbiBncmFtbWFyIHJ1bGVzLiAgIFRoaXMgc2ltcGxpZmllcyBtYW51YWwKKyAgICAgICAgICB0cmFja2luZyBvZiBsaW5lIG51bWJlcnMuCisKKzAxLzExLzA5OiBiZWF6bGV5CisgICAgICAgICAgVmFzdGx5IGltcHJvdmVkIGRlYnVnZ2luZyBzdXBwb3J0IGZvciB5YWNjLnBhcnNlKCkuICAgSW5zdGVhZCBvZiBwYXNzaW5nCisgICAgICAgICAgZGVidWcgYXMgYW4gaW50ZWdlciwgeW91IGNhbiBzdXBwbHkgYSBMb2dnaW5nIG9iamVjdCAoc2VlIHRoZSBsb2dnaW5nCisgICAgICAgICAgbW9kdWxlKS4gTWVzc2FnZXMgd2lsbCBiZSBnZW5lcmF0ZWQgYXQgdGhlIEVSUk9SLCBJTkZPLCBhbmQgREVCVUcKKwkgIGxvZ2dpbmcgbGV2ZWxzLCBlYWNoIGxldmVsIHByb3ZpZGluZyBwcm9ncmVzc2l2ZWx5IG1vcmUgaW5mb3JtYXRpb24uCisgICAgICAgICAgVGhlIGRlYnVnZ2luZyB0cmFjZSBhbHNvIHNob3dzIHN0YXRlcywgZ3JhbW1hciBydWxlLCB2YWx1ZXMgcGFzc2VkCisgICAgICAgICAgaW50byBncmFtbWFyIHJ1bGVzLCBhbmQgdGhlIHJlc3VsdCBvZiBlYWNoIHJlZHVjdGlvbi4KKworMDEvMDkvMDk6IGJlYXpsZXkKKyAgICAgICAgICBUaGUgeWFjYygpIGNvbW1hbmQgbm93IGRvZXMgYWxsIGVycm9yLXJlcG9ydGluZyBhbmQgZGlhZ25vc3RpY3MgdXNpbmcKKyAgICAgICAgICB0aGUgaW50ZXJmYWNlIG9mIHRoZSBsb2dnaW5nIG1vZHVsZS4gIFVzZSB0aGUgZXJyb3Jsb2cgcGFyYW1ldGVyIHRvCisgICAgICAgICAgc3BlY2lmeSBhIGxvZ2dpbmcgb2JqZWN0IGZvciBlcnJvciBtZXNzYWdlcy4gIFVzZSB0aGUgZGVidWdsb2cgcGFyYW1ldGVyCisgICAgICAgICAgdG8gc3BlY2lmeSBhIGxvZ2dpbmcgb2JqZWN0IGZvciB0aGUgJ3BhcnNlci5vdXQnIG91dHB1dC4KKworMDEvMDkvMDk6IGJlYXpsZXkKKyAgICAgICAgICAqSFVHRSogcmVmYWN0b3Jpbmcgb2YgdGhlIHRoZSBwbHkueWFjYygpIGltcGxlbWVudGF0aW9uLiAgIFRoZSBoaWdoLWxldmVsCisJICB1c2VyIGludGVyZmFjZSBpcyBiYWNrd2FyZHMgY29tcGF0aWJsZSwgYnV0IHRoZSBpbnRlcm5hbHMgYXJlIGNvbXBsZXRlbHkKKyAgICAgICAgICByZW9yZ2FuaXplZCBpbnRvIGNsYXNzZXMuICBObyBtb3JlIGdsb2JhbCB2YXJpYWJsZXMuICAgIFRoZSBpbnRlcm5hbHMKKyAgICAgICAgICBhcmUgYWxzbyBtb3JlIGV4dGVuc2libGUuICBGb3IgZXhhbXBsZSwgeW91IGNhbiB1c2UgdGhlIGNsYXNzZXMgdG8gCisgICAgICAgICAgY29uc3RydWN0IGEgTEFMUigxKSBwYXJzZXIgaW4gYW4gZW50aXJlbHkgZGlmZmVyZW50IG1hbm5lciB0aGFuIAorICAgICAgICAgIHdoYXQgaXMgY3VycmVudGx5IHRoZSBjYXNlLiAgRG9jdW1lbnRhdGlvbiBpcyBmb3J0aGNvbWluZy4KKworMDEvMDcvMDk6IGJlYXpsZXkKKyAgICAgICAgICBWYXJpb3VzIGNsZWFudXAgYW5kIHJlZmFjdG9yaW5nIG9mIHlhY2MgaW50ZXJuYWxzLiAgCisKKzAxLzA2LzA5OiBiZWF6bGV5CisgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBwcmVjZWRlbmNlIGFzc2lnbm1lbnQuICB5YWNjIHdhcyBhc3NpZ25pbmcgdGhlIHByZWNlZGVuY2UKKyAgICAgICAgICBlYWNoIHJ1bGUgYmFzZWQgb24gdGhlIGxlZnQtbW9zdCB0b2tlbiwgd2hlbiBpbiBmYWN0LCBpdCBzaG91bGQgaGF2ZSBiZWVuCisgICAgICAgICAgdXNpbmcgdGhlIHJpZ2h0LW1vc3QgdG9rZW4uICBSZXBvcnRlZCBieSBCcnVjZSBGcmVkZXJpa3Nlbi4KKworMTEvMjcvMDg6IGJlYXpsZXkKKyAgICAgICAgICBOdW1lcm91cyBjaGFuZ2VzIHRvIHN1cHBvcnQgUHl0aG9uIDMuMCBpbmNsdWRpbmcgcmVtb3ZhbCBvZiBkZXByZWNhdGVkIAorICAgICAgICAgIHN0YXRlbWVudHMgKGUuZy4sIGhhc19rZXkpIGFuZCB0aGUgYWRkaXRpb25hbCBvZiBjb21wYXRpYmlsaXR5IGNvZGUKKyAgICAgICAgICB0byBlbXVsYXRlIGZlYXR1cmVzIGZyb20gUHl0aG9uIDIgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZCwgYnV0IHdoaWNoCisgICAgICAgICAgYXJlIG5lZWRlZC4gICBGaXhlZCB0aGUgdW5pdCB0ZXN0aW5nIHN1aXRlIHRvIHdvcmsgd2l0aCBQeXRob24gMy4wLgorICAgICAgICAgIFRoZSBjb2RlIHNob3VsZCBiZSBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLgorCisxMS8yNi8wODogYmVhemxleQorICAgICAgICAgIExvb3NlbmVkIHRoZSBydWxlcyBvbiB3aGF0IGtpbmQgb2Ygb2JqZWN0cyBjYW4gYmUgcGFzc2VkIGluIGFzIHRoZQorICAgICAgICAgICJtb2R1bGUiIHBhcmFtZXRlciB0byBsZXgoKSBhbmQgeWFjYygpLiAgUHJldmlvdXNseSwgeW91IGNvdWxkIG9ubHkgdXNlCisgICAgICAgICAgYSBtb2R1bGUgb3IgYW4gaW5zdGFuY2UuICBOb3csIFBMWSBqdXN0IHVzZXMgZGlyKCkgdG8gZ2V0IGEgbGlzdCBvZgorICAgICAgICAgIHN5bWJvbHMgb24gd2hhdGV2ZXIgdGhlIG9iamVjdCBpcyB3aXRob3V0IHJlZ2FyZCBmb3IgaXRzIHR5cGUuCisKKzExLzI2LzA4OiBiZWF6bGV5CisgICAgICAgICAgQ2hhbmdlZCBhbGwgZXhjZXB0OiBzdGF0ZW1lbnRzIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBQeXRob24yLngvMy54IHN5bnRheC4KKworMTEvMjYvMDg6IGJlYXpsZXkKKyAgICAgICAgICBDaGFuZ2VkIGFsbCByYWlzZSBFeGNlcHRpb24sIHZhbHVlIHN0YXRlbWVudHMgdG8gcmFpc2UgRXhjZXB0aW9uKHZhbHVlKSBmb3IKKyAgICAgICAgICBmb3J3YXJkIGNvbXBhdGliaWxpdHkuCisKKzExLzI2LzA4OiBiZWF6bGV5CisgICAgICAgICAgUmVtb3ZlZCBhbGwgcHJpbnQgc3RhdGVtZW50cyBmcm9tIGxleCBhbmQgeWFjYywgdXNpbmcgc3lzLnN0ZG91dCBhbmQgc3lzLnN0ZGVycgorICAgICAgICAgIGRpcmVjdGx5LiAgUHJlcGFyYXRpb24gZm9yIFB5dGhvbiAzLjAgc3VwcG9ydC4KKworMTEvMDQvMDg6IGJlYXpsZXkKKyAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIHJlZmVycmluZyB0byBzeW1ib2xzIG9uIHRoZSB0aGUgcGFyc2luZyBzdGFjayB1c2luZyBuZWdhdGl2ZQorICAgICAgICAgIGluZGljZXMuCisKKzA1LzI5LzA4OiBiZWF6bGV5CisgICAgICAgICAgQ29tcGxldGVseSByZXZhbXBlZCB0aGUgdGVzdGluZyBzeXN0ZW0gdG8gdXNlIHRoZSB1bml0dGVzdCBtb2R1bGUgZm9yIGV2ZXJ5dGhpbmcuCisgICAgICAgICAgQWRkZWQgYWRkaXRpb25hbCB0ZXN0cyB0byBjb3ZlciBuZXcgZXJyb3JzL3dhcm5pbmdzLgorCitWZXJzaW9uIDIuNQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzA1LzI4LzA4OiBiZWF6bGV5CisgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCB3cml0aW5nIGxleC10YWJsZXMgaW4gb3B0aW1pemVkIG1vZGUgYW5kIHN0YXJ0IHN0YXRlcy4KKyAgICAgICAgICBSZXBvcnRlZCBieSBLZXZpbiBIZW5yeS4KKworVmVyc2lvbiAyLjQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiswNS8wNC8wODogYmVhemxleQorICAgICAgICAgIEEgdmVyc2lvbiBudW1iZXIgaXMgbm93IGVtYmVkZGVkIGluIHRoZSB0YWJsZSBmaWxlIHNpZ25hdHVyZSBzbyB0aGF0IAorICAgICAgICAgIHlhY2MgY2FuIG1vcmUgZ3JhY2VmdWxseSBhY2NvbW9kYXRlIGNoYW5nZXMgdG8gdGhlIG91dHB1dCBmb3JtYXQKKyAgICAgICAgICBpbiB0aGUgZnV0dXJlLgorCiswNS8wNC8wODogYmVhemxleQorICAgICAgICAgIFJlbW92ZWQgdW5kb2N1bWVudGVkIC5wdXNoYmFjaygpIG1ldGhvZCBvbiBncmFtbWFyIHByb2R1Y3Rpb25zLiAgSSdtCisgICAgICAgICAgbm90IHN1cmUgdGhpcyBldmVyIHdvcmtlZCBhbmQgY2FuJ3QgcmVjYWxsIGV2ZXIgdXNpbmcgaXQuICBNaWdodCBoYXZlCisgICAgICAgICAgYmVlbiBhbiBhYmFuZG9uZWQgaWRlYSB0aGF0IG5ldmVyIHJlYWxseSBnb3QgZmxlc2hlZCBvdXQuICBUaGlzCisgICAgICAgICAgZmVhdHVyZSB3YXMgbmV2ZXIgZGVzY3JpYmVkIG9yIHRlc3RlZCBzbyByZW1vdmluZyBpdCBpcyBob3BlZnVsbHkKKyAgICAgICAgICBoYXJtbGVzcy4KKworMDUvMDQvMDg6IGJlYXpsZXkKKyAgICAgICAgICBBZGRlZCBleHRyYSBlcnJvciBjaGVja2luZyB0byB5YWNjKCkgdG8gZGV0ZWN0IHByZWNlZGVuY2UgcnVsZXMgZGVmaW5lZAorICAgICAgICAgIGZvciB1bmRlZmluZWQgdGVybWluYWwgc3ltYm9scy4gICBUaGlzIGFsbG93cyB5YWNjKCkgdG8gZGV0ZWN0IGEgcG90ZW50aWFsCisgICAgICAgICAgcHJvYmxlbSB0aGF0IGNhbiBiZSByZWFsbHkgdHJpY2t5IHRvIGRlYnVnIGlmIG5vIHdhcm5pbmcgbWVzc2FnZSBvciBlcnJvcgorICAgICAgICAgIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkIGFib3V0IGl0LgorCiswNS8wNC8wODogYmVhemxleQorICAgICAgICAgIGxleCgpIG5vdyBoYXMgYW4gb3V0cHV0ZGlyIHRoYXQgY2FuIHNwZWNpZnkgdGhlIG91dHB1dCBkaXJlY3RvcnkgZm9yCisgICAgICAgICAgdGFibGVzIHdoZW4gcnVubmluZyBpbiBvcHRpbWl6ZSBtb2RlLiAgRm9yIGV4YW1wbGU6CisKKyAgICAgICAgICAgICBsZXhlciA9IGxleC5sZXgob3B0aW1pemU9VHJ1ZSwgbGV4dGFiPSJsdGFiIiwgb3V0cHV0ZGlyPSJmb28vYmFyIikKKyAKKyAgICAgICAgICBUaGUgYmVoYXZpb3Igb2Ygc3BlY2lmeWluZyBhIHRhYmxlIG1vZHVsZSBhbmQgb3V0cHV0IGRpcmVjdG9yeSBhcmUKKyAgICAgICAgICBtb3JlIGFsaWduZWQgd2l0aCB0aGUgYmVoYXZpb3Igb2YgeWFjYygpLgorICAgICAgICAgIAorMDUvMDQvMDg6IGJlYXpsZXkKKyAgICAgICAgICBbSXNzdWUgOV0KKyAgICAgICAgICBGaXhlZCBmaWxlbmFtZSBidWcgaW4gd2hlbiBzcGVjaWZ5aW5nIHRoZSBtb2R1bGVuYW1lIGluIGxleCgpIGFuZCB5YWNjKCkuIAorICAgICAgICAgIElmIHlvdSBzcGVjaWZpZWQgb3B0aW9ucyBzdWNoIGFzIHRoZSBmb2xsb3dpbmc6CisKKyAgICAgICAgICAgICBwYXJzZXIgPSB5YWNjLnlhY2ModGFibW9kdWxlPSJmb28uYmFyLnBhcnNldGFiIixvdXRwdXRkaXI9ImZvby9iYXIiKQorCisgICAgICAgICAgeWFjYyB3b3VsZCBjcmVhdGUgYSBmaWxlICJmb28uYmFyLnBhcnNldGFiLnB5IiBpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgorICAgICAgICAgIE5vdywgaXQgc2ltcGx5IGdlbmVyYXRlcyBhIGZpbGUgInBhcnNldGFiLnB5IiBpbiB0aGF0IGRpcmVjdG9yeS4gCisgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IGNwdGJpbmhvLgorCiswNS8wNC8wODogYmVhemxleQorICAgICAgICAgIFNsaWdodCBtb2RpZmljYXRpb24gdG8gbGV4KCkgYW5kIHlhY2MoKSB0byBhbGxvdyB0aGVpciB0YWJsZSBmaWxlcworCSAgdG8gYmUgbG9hZGVkIGZyb20gYSBwcmV2aW91c2x5IGxvYWRlZCBtb2R1bGUuICAgVGhpcyBtaWdodCBtYWtlCisJICBpdCBlYXNpZXIgdG8gbG9hZCB0aGUgcGFyc2luZyB0YWJsZXMgZnJvbSBhIGNvbXBsaWNhdGVkIHBhY2thZ2UKKyAgICAgICAgICBzdHJ1Y3R1cmUuICBGb3IgZXhhbXBsZToKKworCSAgICAgICBpbXBvcnQgZm9vLmJhci5zcGFtLnBhcnNldGFiIGFzIHBhcnNldGFiCisgICAgICAgICAgICAgICBwYXJzZXIgPSB5YWNjLnlhY2ModGFibW9kdWxlPXBhcnNldGFiKQorCisgICAgICAgICAgTm90ZTogIGxleCBhbmQgeWFjYyB3aWxsIG5ldmVyIHJlZ2VuZXJhdGUgdGhlIHRhYmxlIGZpbGUgaWYgdXNlZAorICAgICAgICAgIGluIHRoZSBmb3JtLS0teW91IHdpbGwgZ2V0IGEgd2FybmluZyBtZXNzYWdlIGluc3RlYWQuIAorICAgICAgICAgIFRoaXMgaWRlYSBzdWdnZXN0ZWQgYnkgQnJpYW4gQ2xhcHBlci4KKworCiswNC8yOC8wODogYmVhemxleQorICAgICAgICAgIEZpeGVkIGEgYmlnIHdpdGggcF9lcnJvcigpIGZ1bmN0aW9ucyBiZWluZyBwaWNrZWQgdXAgY29ycmVjdGx5CisgICAgICAgICAgd2hlbiBydW5uaW5nIGluIHlhY2Mob3B0aW1pemU9MSkgbW9kZS4gIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5CisgICAgICAgICAgQmFydCBXaGl0ZWxleS4KKworMDIvMjgvMDg6IGJlYXpsZXkKKyAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoICdub25hc3NvYycgcHJlY2VkZW5jZSBydWxlcy4gICBCYXNpY2FsbHkgdGhlCisgICAgICAgICAgbm9uLXByZWNlZGVuY2Ugd2FzIGJlaW5nIGlnbm9yZWQgYW5kIG5vdCBwcm9kdWNpbmcgdGhlIGNvcnJlY3QKKyAgICAgICAgICBydW4tdGltZSBiZWhhdmlvciBpbiB0aGUgcGFyc2VyLgorCiswMi8xNi8wODogYmVhemxleQorICAgICAgICAgIFNsaWdodCByZWxheGF0aW9uIG9mIHdoYXQgdGhlIGlucHV0KCkgbWV0aG9kIHRvIGEgbGV4ZXIgd2lsbAorICAgICAgICAgIGFjY2VwdCBhcyBhIHN0cmluZy4gICBJbnN0ZWFkIG9mIHRlc3RpbmcgdGhlIGlucHV0IHRvIHNlZQorICAgICAgICAgIGlmIHRoZSBpbnB1dCBpcyBhIHN0cmluZyBvciB1bmljb2RlIHN0cmluZywgaXQgY2hlY2tzIHRvIHNlZQorICAgICAgICAgIGlmIHRoZSBpbnB1dCBvYmplY3QgbG9va3MgbGlrZSBpdCBjb250YWlucyBzdHJpbmcgZGF0YS4KKyAgICAgICAgICBUaGlzIGNoYW5nZSBtYWtlcyBpdCBwb3NzaWJsZSB0byBwYXNzIHN0cmluZy1saWtlIG9iamVjdHMKKyAgICAgICAgICBpbiBhcyBpbnB1dC4gIEZvciBleGFtcGxlLCB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IG1tYXAuCisKKyAgICAgICAgICAgICAgaW1wb3J0IG1tYXAsIG9zCisgICAgICAgICAgICAgIGRhdGEgPSBtbWFwLm1tYXAob3Mub3BlbihmaWxlbmFtZSxvcy5PX1JET05MWSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5nZXRzaXplKGZpbGVuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3M9bW1hcC5BQ0NFU1NfUkVBRCkKKyAgICAgICAgICAgICAgbGV4ZXIuaW5wdXQoZGF0YSkKKyAgICAgICAgICAgCisKKzExLzI5LzA3OiBiZWF6bGV5CisgICAgICAgICAgTW9kaWZpY2F0aW9uIG9mIHBseS5sZXggdG8gYWxsb3cgdG9rZW4gZnVuY3Rpb25zIHRvIGFsaWFzZWQuCisgICAgICAgICAgVGhpcyBpcyBzdWJ0bGUsIGJ1dCBpdCBtYWtlcyBpdCBlYXNpZXIgdG8gY3JlYXRlIGxpYnJhcmllcyBhbmQKKyAgICAgICAgICB0byByZXVzZSB0b2tlbiBzcGVjaWZpY2F0aW9ucy4gIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSBkZWZpbmVkCisgICAgICAgICAgYSBmdW5jdGlvbiBsaWtlIHRoaXM6CisKKyAgICAgICAgICAgICAgIGRlZiBudW1iZXIodCk6CisgICAgICAgICAgICAgICAgICAgIHInXGQrJworICAgICAgICAgICAgICAgICAgICB0LnZhbHVlID0gaW50KHQudmFsdWUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0CisKKyAgICAgICAgICBUaGlzIGNoYW5nZSB3b3VsZCBhbGxvdyB5b3UgdG8gZGVmaW5lIGEgdG9rZW4gcnVsZSBhcyBmb2xsb3dzOgorCisgICAgICAgICAgICAgIHRfTlVNQkVSID0gbnVtYmVyCisKKyAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB0b2tlbiB0eXBlIHdpbGwgYmUgc2V0IHRvICdOVU1CRVInIGFuZCB1c2UKKyAgICAgICAgICB0aGUgYXNzb2NpYXRlZCBudW1iZXIoKSBmdW5jdGlvbiB0byBwcm9jZXNzIHRva2Vucy4gICAKKyAgICAgICAgICAgCisxMS8yOC8wNzogYmVhemxleQorICAgICAgICAgIFNsaWdodCBtb2RpZmljYXRpb24gdG8gbGV4IGFuZCB5YWNjIHRvIGdyYWIgc3ltYm9scyBmcm9tIGJvdGgKKyAgICAgICAgICB0aGUgbG9jYWwgYW5kIGdsb2JhbCBkaWN0aW9uYXJpZXMgb2YgdGhlIGNhbGxlci4gICBUaGlzCisgICAgICAgICAgbW9kaWZpY2F0aW9uIGFsbG93cyBsZXhlcnMgYW5kIHBhcnNlcnMgdG8gYmUgZGVmaW5lZCB1c2luZworICAgICAgICAgIGlubmVyIGZ1bmN0aW9ucyBhbmQgY2xvc3VyZXMuCisKKzExLzI4LzA3OiBiZWF6bGV5CisgICAgICAgICAgUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uOiAgVGhlIGxleGVyLmxleG1hdGNoIGFuZCB0LmxleGVyCisgICAgICAgICAgYXR0cmlidXRlcyBhcmUgbm8gbG9uZ2VyIHNldCBmb3IgbGV4ZXIgdG9rZW5zIHRoYXQgYXJlIG5vdAorICAgICAgICAgIGRlZmluZWQgYnkgZnVuY3Rpb25zLiAgIFRoZSBvbmx5IG5vcm1hbCB1c2Ugb2YgdGhlc2UgYXR0cmlidXRlcworICAgICAgICAgIHdvdWxkIGJlIGluIGxleGVyIHJ1bGVzIHRoYXQgbmVlZCB0byBwZXJmb3JtIHNvbWUga2luZCBvZiAKKyAgICAgICAgICBzcGVjaWFsIHByb2Nlc3NpbmcuICBUaHVzLCBpdCBkb2Vzbid0IG1ha2UgYW55IHNlbnNlIHRvIHNldAorICAgICAgICAgIHRoZW0gb24gZXZlcnkgdG9rZW4uCisKKyAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogIFRoaXMgbWlnaHQgYnJlYWsgY29kZQorICAgICAgICAgIHRoYXQgaXMgbXVja2luZyBhcm91bmQgd2l0aCBpbnRlcm5hbCBsZXhlciBzdGF0ZSBpbiBzb21lCisgICAgICAgICAgc29ydCBvZiBtYWdpY2FsIHdheS4KKworMTEvMjcvMDc6IGJlYXpsZXkKKyAgICAgICAgICBBZGRlZCB0aGUgYWJpbGl0eSB0byBwdXQgdGhlIHBhcnNlciBpbnRvIGVycm9yLWhhbmRsaW5nIG1vZGUKKyAgICAgICAgICBmcm9tIHdpdGhpbiBhIG5vcm1hbCBwcm9kdWN0aW9uLiAgIFRvIGRvIHRoaXMsIHNpbXBseSByYWlzZQorICAgICAgICAgIGEgeWFjYy5TeW50YXhFcnJvciBleGNlcHRpb24gbGlrZSB0aGlzOgorCisgICAgICAgICAgZGVmIHBfc29tZV9wcm9kdWN0aW9uKHApOgorICAgICAgICAgICAgICAnc29tZV9wcm9kdWN0aW9uIDogcHJvZDEgcHJvZDInCisgICAgICAgICAgICAgIC4uLgorICAgICAgICAgICAgICByYWlzZSB5YWNjLlN5bnRheEVycm9yICAgICAgIyBTaWduYWwgYW4gZXJyb3IKKworICAgICAgICAgIEEgbnVtYmVyIG9mIHRoaW5ncyBoYXBwZW4gYWZ0ZXIgdGhpcyBvY2N1cnM6CisKKyAgICAgICAgICAtIFRoZSBsYXN0IHN5bWJvbCBzaGlmdGVkIG9udG8gdGhlIHN5bWJvbCBzdGFjayBpcyBkaXNjYXJkZWQKKyAgICAgICAgICAgIGFuZCBwYXJzZXIgc3RhdGUgYmFja2VkIHVwIHRvIHdoYXQgaXQgd2FzIGJlZm9yZSB0aGUKKyAgICAgICAgICAgIHRoZSBydWxlIHJlZHVjdGlvbi4KKworICAgICAgICAgIC0gVGhlIGN1cnJlbnQgbG9va2FoZWFkIHN5bWJvbCBpcyBzYXZlZCBhbmQgcmVwbGFjZWQgYnkKKyAgICAgICAgICAgIHRoZSAnZXJyb3InIHN5bWJvbC4KKworICAgICAgICAgIC0gVGhlIHBhcnNlciBlbnRlcnMgZXJyb3IgcmVjb3ZlcnkgbW9kZSB3aGVyZSBpdCB0cmllcworICAgICAgICAgICAgdG8gZWl0aGVyIHJlZHVjZSB0aGUgJ2Vycm9yJyBydWxlIG9yIGl0IHN0YXJ0cyAKKyAgICAgICAgICAgIGRpc2NhcmRpbmcgaXRlbXMgb2ZmIG9mIHRoZSBzdGFjayB1bnRpbCB0aGUgcGFyc2VyCisgICAgICAgICAgICByZXNldHMuCisKKyAgICAgICAgICBXaGVuIGFuIGVycm9yIGlzIG1hbnVhbGx5IHNldCwgdGhlIHBhcnNlciBkb2VzICpub3QqIGNhbGwgCisgICAgICAgICAgdGhlIHBfZXJyb3IoKSBmdW5jdGlvbiAoaWYgYW55IGlzIGRlZmluZWQpLgorICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKiogU3VnZ2VzdGVkIG9uIHRoZSBtYWlsaW5nIGxpc3QKKworMTEvMjcvMDc6IGJlYXpsZXkKKyAgICAgICAgICBGaXhlZCBzdHJ1Y3R1cmUgYnVnIGluIGV4YW1wbGVzL2Fuc2ljLiAgUmVwb3J0ZWQgYnkgRGlvbiBCbGF6YWtpcy4KKworMTEvMjcvMDc6IGJlYXpsZXkKKyAgICAgICAgICBGaXhlZCBhIGJ1ZyBpbiB0aGUgbGV4ZXIgcmVsYXRlZCB0byBzdGFydCBjb25kaXRpb25zIGFuZCBpZ25vcmVkCisgICAgICAgICAgdG9rZW4gcnVsZXMuICBJZiBhIHJ1bGUgd2FzIGRlZmluZWQgdGhhdCBjaGFuZ2VkIHN0YXRlLCBidXQKKyAgICAgICAgICByZXR1cm5lZCBubyB0b2tlbiwgdGhlIGxleGVyIGNvdWxkIGJlIGxlZnQgaW4gYW4gaW5jb25zaXN0ZW50CisgICAgICAgICAgc3RhdGUuICBSZXBvcnRlZCBieSAKKyAgICAgICAgICAKKzExLzI3LzA3OiBiZWF6bGV5CisgICAgICAgICAgTW9kaWZpZWQgc2V0dXAucHkgdG8gc3VwcG9ydCBQeXRob24gRWdncy4gICBQYXRjaCBjb250cmlidXRlZCBieQorICAgICAgICAgIFNpbW9uIENyb3NzLgorCisxMS8wOS8wNzogYmVhemVseQorICAgICAgICAgIEZpeGVkIGEgYnVnIGluIGVycm9yIGhhbmRsaW5nIGluIHlhY2MuICBJZiBhIHN5bnRheCBlcnJvciBvY2N1cnJlZCBhbmQgdGhlCisgICAgICAgICAgcGFyc2VyIHJvbGxlZCB0aGUgZW50aXJlIHBhcnNlIHN0YWNrIGJhY2ssIHRoZSBwYXJzZXIgd291bGQgYmUgbGVmdCBpbiBpbgorICAgICAgICAgIGluY29uc2lzdGVudCBzdGF0ZSB0aGF0IHdvdWxkIGNhdXNlIGl0IHRvIHRyaWdnZXIgaW5jb3JyZWN0IGFjdGlvbnMgb24KKyAgICAgICAgICBzdWJzZXF1ZW50IGlucHV0LiAgUmVwb3J0ZWQgYnkgVG9uIEJpZWdzdHJhYXRlbiwgSnVzdGluIEtpbmcsIGFuZCBvdGhlcnMuCisKKzExLzA5LzA3OiBiZWF6bGV5CisgICAgICAgICAgRml4ZWQgYSBidWcgd2hlbiBwYXNzaW5nIGVtcHR5IGlucHV0IHN0cmluZ3MgdG8geWFjYy5wYXJzZSgpLiAgIFRoaXMgCisgICAgICAgICAgd291bGQgcmVzdWx0IGluIGFuIGVycm9yIG1lc3NhZ2UgYWJvdXQgIk5vIGlucHV0IGdpdmVuIi4gIFJlcG9ydGVkCisgICAgICAgICAgYnkgQW5kcmV3IERhbGtlLgorCitWZXJzaW9uIDIuMworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzAyLzIwLzA3OiBiZWF6bGV5CisgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBjaGFyYWN0ZXIgbGl0ZXJhbHMgaWYgdGhlIGxpdGVyYWwgJy4nIGFwcGVhcmVkIGFzIHRoZQorICAgICAgICAgIGxhc3Qgc3ltYm9sIG9mIGEgZ3JhbW1hciBydWxlLiAgUmVwb3J0ZWQgYnkgQWxlcyBTbXJja2EuCisKKzAyLzE5LzA3OiBiZWF6bGV5CisgICAgICAgICAgV2FybmluZyBtZXNzYWdlcyBhcmUgbm93IHJlZGlyZWN0ZWQgdG8gc3RkZXJyIGluc3RlYWQgb2YgYmVpbmcgcHJpbnRlZAorICAgICAgICAgIHRvIHN0YW5kYXJkIG91dHB1dC4KKworMDIvMTkvMDc6IGJlYXpsZXkKKyAgICAgICAgICBBZGRlZCBhIHdhcm5pbmcgbWVzc2FnZSB0byBsZXgucHkgaWYgaXQgZGV0ZWN0cyBhIGxpdGVyYWwgYmFja3NsYXNoCisgICAgICAgICAgY2hhcmFjdGVyIGluc2lkZSB0aGUgdF9pZ25vcmUgZGVjbGFyYXRpb24uICBUaGlzIGlzIHRvIGhlbHAKKyAgICAgICAgICBwcm9ibGVtcyB0aGF0IG1pZ2h0IG9jY3VyIGlmIHNvbWVvbmUgYWNjaWRlbnRhbGx5IGRlZmluZXMgdF9pZ25vcmUKKyAgICAgICAgICBhcyBhIFB5dGhvbiByYXcgc3RyaW5nLiAgRm9yIGV4YW1wbGU6CisKKyAgICAgICAgICAgICAgdF9pZ25vcmUgPSByJyBcdCcKKworICAgICAgICAgIFRoZSBpZGVhIGZvciB0aGlzIGlzIGZyb20gYW4gZW1haWwgSSByZWNlaXZlZCBmcm9tIERhdmlkIENpbWltaSB3aG8KKyAgICAgICAgICByZXBvcnRlZCBiaXphcnJlIGJlaGF2aW9yIGluIGxleGluZyBhcyBhIHJlc3VsdCBvZiBkZWZpbmluZyB0X2lnbm9yZQorICAgICAgICAgIGFzIGEgcmF3IHN0cmluZyBieSBhY2NpZGVudC4KKworMDIvMTgvMDc6IGJlYXpsZXkKKyAgICAgICAgICBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMuICBNYWRlIHNvbWUgY2hhbmdlcyB0byB0aGUgaW50ZXJuYWwKKyAgICAgICAgICB0YWJsZSBvcmdhbml6YXRpb24gYW5kIExSIHBhcnNlciB0byBpbXByb3ZlIHBhcnNpbmcgcGVyZm9ybWFuY2UuCisKKzAyLzE4LzA3OiBiZWF6bGV5CisgICAgICAgICAgQXV0b21hdGljIHRyYWNraW5nIG9mIGxpbmUgbnVtYmVyIGFuZCBwb3NpdGlvbiBpbmZvcm1hdGlvbiBtdXN0IG5vdyBiZSAKKyAgICAgICAgICBlbmFibGVkIGJ5IGEgc3BlY2lhbCBmbGFnIHRvIHBhcnNlKCkuICBGb3IgZXhhbXBsZToKKworICAgICAgICAgICAgICB5YWNjLnBhcnNlKGRhdGEsdHJhY2tpbmc9VHJ1ZSkKKworICAgICAgICAgIEluIG1hbnkgYXBwbGljYXRpb25zLCBpdCdzIGp1c3Qgbm90IHRoYXQgaW1wb3J0YW50IHRvIGhhdmUgdGhlCisgICAgICAgICAgcGFyc2VyIGF1dG9tYXRpY2FsbHkgdHJhY2sgYWxsIGxpbmUgbnVtYmVycy4gIEJ5IG1ha2luZyB0aGlzIGFuIAorICAgICAgICAgIG9wdGlvbmFsIGZlYXR1cmUsIGl0IGFsbG93cyB0aGUgcGFyc2VyIHRvIHJ1biBzaWduaWZpY2FudGx5IGZhc3RlcgorICAgICAgICAgIChtb3JlIHRoYW4gYSAyMCUgc3BlZWQgaW5jcmVhc2UgaW4gbWFueSBjYXNlcykuICAgIE5vdGU6IHBvc2l0aW9uYWwKKyAgICAgICAgICBpbmZvcm1hdGlvbiBpcyBhbHdheXMgYXZhaWxhYmxlIGZvciByYXcgdG9rZW5zLS0tdGhpcyBjaGFuZ2Ugb25seQorICAgICAgICAgIGFwcGxpZXMgdG8gcG9zaXRpb25hbCBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggbm9udGVybWluYWwKKyAgICAgICAgICBncmFtbWFyIHN5bWJvbHMuCisgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCisJICAKKzAyLzE4LzA3OiBiZWF6bGV5CisgICAgICAgICAgWWFjYyBubyBsb25nZXIgc3VwcG9ydHMgZXh0ZW5kZWQgc2xpY2VzIG9mIGdyYW1tYXIgcHJvZHVjdGlvbnMuCisgICAgICAgICAgSG93ZXZlciwgaXQgZG9lcyBzdXBwb3J0IHJlZ3VsYXIgc2xpY2VzLiAgRm9yIGV4YW1wbGU6CisKKyAgICAgICAgICBkZWYgcF9mb28ocCk6CisgICAgICAgICAgICAgICcnJ2ZvbzogYSBiIGMgZCBlJycnCisgICAgICAgICAgICAgIHBbMF0gPSBwWzE6M10KKworICAgICAgICAgIFRoaXMgY2hhbmdlIGlzIGEgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgdG8gdGhlIHBhcnNlci0taXQgc3RyZWFtbGluZXMKKyAgICAgICAgICBub3JtYWwgYWNjZXNzIHRvIHRoZSBncmFtbWFyIHZhbHVlcyBzaW5jZSBzbGljZXMgYXJlIG5vdyBoYW5kbGVkIGluCisgICAgICAgICAgYSBfX2dldHNsaWNlX18oKSBtZXRob2QgYXMgb3Bwb3NlZCB0byBfX2dldGl0ZW1fXygpLgorCiswMi8xMi8wNzogYmVhemxleQorICAgICAgICAgIEZpeGVkIGEgYnVnIGluIHRoZSBoYW5kbGluZyBvZiB0b2tlbiBuYW1lcyB3aGVuIGNvbWJpbmVkIHdpdGgKKyAgICAgICAgICBzdGFydCBjb25kaXRpb25zLiAgIEJ1ZyByZXBvcnRlZCBieSBUb2RkIE8nQnJ5YW4uCisKK1ZlcnNpb24gMi4yCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzExLzAxLzA2OiBiZWF6bGV5CisgICAgICAgICAgQWRkZWQgbGV4cG9zKCkgYW5kIGxleHNwYW4oKSBtZXRob2RzIHRvIGdyYW1tYXIgc3ltYm9scy4gIFRoZXNlCisgICAgICAgICAgbWlycm9yIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgb2YgbGluZW5vKCkgYW5kIGxpbmVzcGFuKCkuICBGb3IKKyAgICAgICAgICBleGFtcGxlOgorCisgICAgICAgICAgZGVmIHBfZXhwcihwKToKKyAgICAgICAgICAgICAgJ2V4cHIgOiBleHByIFBMVVMgZXhwcicKKyAgICAgICAgICAgICAgIHAubGV4cG9zKDEpICAgICAjIExleGluZyBwb3NpdGlvbiBvZiBsZWZ0LWhhbmQtZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgcC5sZXhwb3MoMSkgICAgICMgTGV4aW5nIHBvc2l0aW9uIG9mIFBMVVMKKyAgICAgICAgICAgICAgIHN0YXJ0LGVuZCA9IHAubGV4c3BhbigzKSAgIyBMZXhpbmcgcmFuZ2Ugb2YgcmlnaHQgaGFuZCBleHByZXNzaW9uCisKKzExLzAxLzA2OiBiZWF6bGV5CisgICAgICAgICAgTWlub3IgY2hhbmdlIHRvIGVycm9yIGhhbmRsaW5nLiAgVGhlIHJlY29tbWVuZGVkIHdheSB0byBza2lwIGNoYXJhY3RlcnMKKyAgICAgICAgICBpbiB0aGUgaW5wdXQgaXMgdG8gdXNlIHQubGV4ZXIuc2tpcCgpIGFzIHNob3duIGhlcmU6CisKKyAgICAgICAgICAgICBkZWYgdF9lcnJvcih0KToKKyAgICAgICAgICAgICAgICAgcHJpbnQgIklsbGVnYWwgY2hhcmFjdGVyICclcyciICUgdC52YWx1ZVswXQorICAgICAgICAgICAgICAgICB0LmxleGVyLnNraXAoMSkKKyAgICAgICAgICAKKyAgICAgICAgICBUaGUgb2xkIGFwcHJvYWNoIG9mIGp1c3QgdXNpbmcgdC5za2lwKDEpIHdpbGwgc3RpbGwgd29yaywgYnV0IHdvbid0CisgICAgICAgICAgYmUgZG9jdW1lbnRlZC4KKworMTAvMzEvMDY6IGJlYXpsZXkKKyAgICAgICAgICBEaXNjYXJkZWQgdG9rZW5zIGNhbiBub3cgYmUgc3BlY2lmaWVkIGFzIHNpbXBsZSBzdHJpbmdzIGluc3RlYWQgb2YKKyAgICAgICAgICBmdW5jdGlvbnMuICBUbyBkbyB0aGlzLCBzaW1wbHkgaW5jbHVkZSB0aGUgdGV4dCAiaWdub3JlXyIgaW4gdGhlCisgICAgICAgICAgdG9rZW4gZGVjbGFyYXRpb24uICBGb3IgZXhhbXBsZToKKworICAgICAgICAgICAgICB0X2lnbm9yZV9jcHBjb21tZW50ID0gcicvLy4qJworICAgICAgICAgIAorICAgICAgICAgIFByZXZpb3VzbHksIHRoaXMgaGFkIHRvIGJlIGRvbmUgd2l0aCBhIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGU6CisKKyAgICAgICAgICAgICAgZGVmIHRfaWdub3JlX2NwcGNvbW1lbnQodCk6CisgICAgICAgICAgICAgICAgICByJy8vLionCisgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICBJZiBzdGFydCBjb25kaXRpb25zL3N0YXRlcyBhcmUgYmVpbmcgdXNlZCwgc3RhdGUgbmFtZXMgc2hvdWxkIGFwcGVhcgorICAgICAgICAgIGJlZm9yZSB0aGUgImlnbm9yZV8iIHRleHQuCisKKzEwLzE5LzA2OiBiZWF6bGV5CisgICAgICAgICAgVGhlIExleCBtb2R1bGUgbm93IHByb3ZpZGVzIHN1cHBvcnQgZm9yIGZsZXgtc3R5bGUgc3RhcnQgY29uZGl0aW9ucworICAgICAgICAgIGFzIGRlc2NyaWJlZCBhdCBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZmxleC9tYW51YWwvaHRtbF9jaGFwdGVyL2ZsZXhfMTEuaHRtbC4KKyAgICAgICAgICBQbGVhc2UgcmVmZXIgdG8gdGhpcyBkb2N1bWVudCB0byB1bmRlcnN0YW5kIHRoaXMgY2hhbmdlIG5vdGUuICBSZWZlciB0bworICAgICAgICAgIHRoZSBQTFkgZG9jdW1lbnRhdGlvbiBmb3IgUExZLXNwZWNpZmljIGV4cGxhbmF0aW9uIG9mIGhvdyB0aGlzIHdvcmtzLgorCisgICAgICAgICAgVG8gdXNlIHN0YXJ0IGNvbmRpdGlvbnMsIHlvdSBmaXJzdCBuZWVkIHRvIGRlY2xhcmUgYSBzZXQgb2Ygc3RhdGVzIGluCisgICAgICAgICAgeW91ciBsZXhlciBmaWxlOgorCisgICAgICAgICAgc3RhdGVzID0gKAorICAgICAgICAgICAgICAgICAgICAoJ2ZvbycsJ2V4Y2x1c2l2ZScpLAorICAgICAgICAgICAgICAgICAgICAoJ2JhcicsJ2luY2x1c2l2ZScpCisgICAgICAgICAgKQorCisgICAgICAgICAgVGhpcyBzZXJ2ZXMgdGhlIHNhbWUgcm9sZSBhcyB0aGUgJXMgYW5kICV4IHNwZWNpZmllcnMgaW4gZmxleC4KKworICAgICAgICAgIE9uZSBhIHN0YXRlIGhhcyBiZWVuIGRlY2xhcmVkLCB0b2tlbnMgZm9yIHRoYXQgc3RhdGUgY2FuIGJlIAorICAgICAgICAgIGRlY2xhcmVkIGJ5IGRlZmluaW5nIHJ1bGVzIG9mIHRoZSBmb3JtIHRfc3RhdGVfVE9LLiAgRm9yIGV4YW1wbGU6CisKKyAgICAgICAgICAgIHRfUExVUyA9ICdcKycgICAgICAgICAgIyBSdWxlIGRlZmluZWQgaW4gSU5JVElBTCBzdGF0ZQorICAgICAgICAgICAgdF9mb29fTlVNID0gJ1xkKycgICAgICAjIFJ1bGUgZGVmaW5lZCBpbiBmb28gc3RhdGUKKyAgICAgICAgICAgIHRfYmFyX05VTSA9ICdcZCsnICAgICAgIyBSdWxlIGRlZmluZWQgaW4gYmFyIHN0YXRlCisKKyAgICAgICAgICAgIHRfZm9vX2Jhcl9OVU0gPSAnXGQrJyAgIyBSdWxlIGRlZmluZWQgaW4gYm90aCBmb28gYW5kIGJhcgorICAgICAgICAgICAgdF9BTllfTlVNID0gJ1xkKycgICAgICAjIFJ1bGUgZGVmaW5lZCBpbiBhbGwgc3RhdGVzCisKKyAgICAgICAgICBJbiBhZGRpdGlvbiB0byBkZWZpbmluZyB0b2tlbnMgZm9yIGVhY2ggc3RhdGUsIHRoZSB0X2lnbm9yZSBhbmQgdF9lcnJvcgorICAgICAgICAgIHNwZWNpZmljYXRpb25zIGNhbiBiZSBjdXN0b21pemVkIGZvciBzcGVjaWZpYyBzdGF0ZXMuICBGb3IgZXhhbXBsZToKKworICAgICAgICAgICAgdF9mb29faWdub3JlID0gIiAiICAgICAjIElnbm9yZWQgY2hhcmFjdGVycyBmb3IgZm9vIHN0YXRlCisgICAgICAgICAgICBkZWYgdF9iYXJfZXJyb3IodCk6ICAgCisgICAgICAgICAgICAgICAgIyBIYW5kbGUgZXJyb3JzIGluIGJhciBzdGF0ZQorCisgICAgICAgICAgV2l0aCB0b2tlbiBydWxlcywgdGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSBzdGF0ZXMKKyAgICAgICAgICAKKyAgICAgICAgICAgIGRlZiB0X1RPS05BTUUodCk6CisgICAgICAgICAgICAgICAgdC5sZXhlci5iZWdpbignZm9vJykgICAgICAgICMgQmVnaW4gc3RhdGUgJ2ZvbycKKyAgICAgICAgICAgICAgICB0LmxleGVyLnB1c2hfc3RhdGUoJ2ZvbycpICAgIyBCZWdpbiBzdGF0ZSAnZm9vJywgcHVzaCBvbGQgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvbnRvIGEgc3RhY2sKKyAgICAgICAgICAgICAgICB0LmxleGVyLnBvcF9zdGF0ZSgpICAgICAgICAgIyBSZXN0b3JlIHByZXZpb3VzIHN0YXRlCisgICAgICAgICAgICAgICAgdC5sZXhlci5jdXJyZW50X3N0YXRlKCkgICAgICMgUmV0dXJucyBuYW1lIG9mIGN1cnJlbnQgc3RhdGUKKworICAgICAgICAgIFRoZXNlIG1ldGhvZHMgbWlycm9yIHRoZSBCRUdJTigpLCB5eV9wdXNoX3N0YXRlKCksIHl5X3BvcF9zdGF0ZSgpLCBhbmQKKyAgICAgICAgICB5eV90b3Bfc3RhdGUoKSBmdW5jdGlvbnMgaW4gZmxleC4KKworICAgICAgICAgIFRoZSB1c2Ugb2Ygc3RhcnQgc3RhdGVzIGNhbiBiZSB1c2VkIGFzIG9uZSB3YXkgdG8gd3JpdGUgc3ViLWxleGVycy4KKyAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhlIGxleGVyIG9yIHBhcnNlciBtaWdodCBpbnN0cnVjdCB0aGUgbGV4ZXIgdG8gc3RhcnQKKyAgICAgICAgICBnZW5lcmF0aW5nIGEgZGlmZmVyZW50IHNldCBvZiB0b2tlbnMgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0LgorICAgICAgICAgIAorICAgICAgICAgIGV4YW1wbGUveXBseS95bGV4LnB5IHNob3dzIHRoZSB1c2Ugb2Ygc3RhcnQgc3RhdGVzIHRvIGdyYWIgQy9DKysgCisgICAgICAgICAgY29kZSBmcmFnbWVudHMgb3V0IG9mIHRyYWRpdGlvbmFsIHlhY2Mgc3BlY2lmaWNhdGlvbiBmaWxlcy4KKworICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKiogU3VnZ2VzdGVkIGJ5IERhbmllbCBMYXJyYXogd2l0aCB3aG9tIEkgYWxzbworICAgICAgICAgIGRpc2N1c3NlZCB2YXJpb3VzIGFzcGVjdHMgb2YgdGhlIGRlc2lnbi4KKworMTAvMTkvMDY6IGJlYXpsZXkKKyAgICAgICAgICBNaW5vciBjaGFuZ2UgdG8gdGhlIHdheSBpbiB3aGljaCB5YWNjLnB5IHdhcyByZXBvcnRpbmcgc2hpZnQvcmVkdWNlCisgICAgICAgICAgY29uZmxpY3RzLiAgQWx0aG91Z2ggdGhlIHVuZGVybHlpbmcgTEFMUigxKSBhbGdvcml0aG0gd2FzIGNvcnJlY3QsCisgICAgICAgICAgUExZIHdhcyB1bmRlci1yZXBvcnRpbmcgdGhlIG51bWJlciBvZiBjb25mbGljdHMgY29tcGFyZWQgdG8geWFjYy9iaXNvbgorICAgICAgICAgIHdoZW4gcHJlY2VkZW5jZSBydWxlcyB3ZXJlIGluIGVmZmVjdC4gIFRoaXMgY2hhbmdlIHNob3VsZCBtYWtlIFBMWQorICAgICAgICAgIHJlcG9ydCB0aGUgc2FtZSBudW1iZXIgb2YgY29uZmxpY3RzIGFzIHlhY2MuCisKKzEwLzE5LzA2OiBiZWF6bGV5CisgICAgICAgICAgTW9kaWZpZWQgeWFjYyBzbyB0aGF0IGdyYW1tYXIgcnVsZXMgY291bGQgYWxzbyBpbmNsdWRlIHRoZSAnLScgCisgICAgICAgICAgY2hhcmFjdGVyLiAgRm9yIGV4YW1wbGU6CisKKyAgICAgICAgICAgIGRlZiBwX2V4cHJfbGlzdChwKToKKyAgICAgICAgICAgICAgICAnZXhwcmVzc2lvbi1saXN0IDogZXhwcmVzc2lvbi1saXN0IGV4cHJlc3Npb24nCisKKyAgICAgICAgICBTdWdnZXN0ZWQgYnkgT2xkcmljaCBKZWRsaWNrYS4KKworMTAvMTgvMDY6IGJlYXpsZXkKKyAgICAgICAgICBBdHRyaWJ1dGUgbGV4ZXIubGV4bWF0Y2ggYWRkZWQgc28gdGhhdCB0b2tlbiBydWxlcyBjYW4gYWNjZXNzIHRoZSByZSAKKyAgICAgICAgICBtYXRjaCBvYmplY3QgdGhhdCB3YXMgZ2VuZXJhdGVkLiAgRm9yIGV4YW1wbGU6CisKKyAgICAgICAgICBkZWYgdF9GT08odCk6CisgICAgICAgICAgICAgIHInc29tZSByZWdleCcKKyAgICAgICAgICAgICAgbSA9IHQubGV4ZXIubGV4bWF0Y2gKKyAgICAgICAgICAgICAgIyBEbyBzb21ldGhpbmcgd2l0aCBtCisKKworICAgICAgICAgIFRoaXMgbWF5IGJlIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBhY2Nlc3MgbmFtZWQgZ3JvdXBzIHNwZWNpZmllZCB3aXRoaW4KKyAgICAgICAgICB0aGUgcmVnZXggZm9yIGEgc3BlY2lmaWMgdG9rZW4uIFN1Z2dlc3RlZCBieSBPbGRyaWNoIEplZGxpY2thLgorICAgICAgICAgIAorMTAvMTYvMDY6IGJlYXpsZXkKKyAgICAgICAgICBDaGFuZ2VkIHRoZSBlcnJvciBtZXNzYWdlIHRoYXQgcmVzdWx0cyBpZiBhbiBpbGxlZ2FsIGNoYXJhY3RlcgorICAgICAgICAgIGlzIGVuY291bnRlcmVkIGFuZCBubyBkZWZhdWx0IGVycm9yIGZ1bmN0aW9uIGlzIGRlZmluZWQgaW4gbGV4LgorICAgICAgICAgIFRoZSBleGNlcHRpb24gaXMgbm93IG1vcmUgaW5mb3JtYXRpdmUgYWJvdXQgdGhlIGFjdHVhbCBjYXVzZSBvZgorICAgICAgICAgIHRoZSBlcnJvci4KKyAgICAgIAorVmVyc2lvbiAyLjEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMTAvMDIvMDY6IGJlYXpsZXkKKyAgICAgICAgICBUaGUgbGFzdCBMZXhlciBvYmplY3QgYnVpbHQgYnkgbGV4KCkgY2FuIGJlIGZvdW5kIGluIGxleC5sZXhlci4KKyAgICAgICAgICBUaGUgbGFzdCBQYXJzZXIgb2JqZWN0IGJ1aWx0ICBieSB5YWNjKCkgY2FuIGJlIGZvdW5kIGluIHlhY2MucGFyc2VyLgorCisxMC8wMi8wNjogYmVhemxleQorICAgICAgICAgIE5ldyBleGFtcGxlIGFkZGVkOiAgZXhhbXBsZXMveXBseQorCisgICAgICAgICAgVGhpcyBleGFtcGxlIHVzZXMgUExZIHRvIGNvbnZlcnQgVW5peC15YWNjIHNwZWNpZmljYXRpb24gZmlsZXMgdG8KKyAgICAgICAgICBQTFkgcHJvZ3JhbXMgd2l0aCB0aGUgc2FtZSBncmFtbWFyLiAgIFRoaXMgbWF5IGJlIHVzZWZ1bCBpZiB5b3UKKyAgICAgICAgICB3YW50IHRvIGNvbnZlcnQgYSBncmFtbWFyIGZyb20gYmlzb24veWFjYyB0byB1c2Ugd2l0aCBQTFkuCisgICAgCisxMC8wMi8wNjogYmVhemxleQorICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGEgc3RhcnQgc3ltYm9sIHRvIGJlIHNwZWNpZmllZCBpbiB0aGUgeWFjYworICAgICAgICAgIGlucHV0IGZpbGUgaXRzZWxmLiAgSnVzdCBkbyB0aGlzOgorCisgICAgICAgICAgICAgICBzdGFydCA9ICduYW1lJworCisgICAgICAgICAgd2hlcmUgJ25hbWUnIG1hdGNoZXMgc29tZSBncmFtbWFyIHJ1bGUuICBGb3IgZXhhbXBsZToKKworICAgICAgICAgICAgICAgZGVmIHBfbmFtZShwKToKKyAgICAgICAgICAgICAgICAgICAnbmFtZSA6IEEgQiBDJworICAgICAgICAgICAgICAgICAgIC4uLgorCisgICAgICAgICAgVGhpcyBtaXJyb3JzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSB5YWNjICVzdGFydCBzcGVjaWZpZXIuCisKKzA5LzMwLzA2OiBiZWF6bGV5CisgICAgICAgICAgU29tZSBuZXcgZXhhbXBsZXMgYWRkZWQuOgorCisgICAgICAgICAgZXhhbXBsZXMvR2FyZGVuU25ha2UgOiBBIHNpbXBsZSBpbmRlbnRhdGlvbiBiYXNlZCBsYW5ndWFnZSBzaW1pbGFyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBQeXRob24uICBTaG93cyBob3cgeW91IG1pZ2h0IGhhbmRsZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaXRlc3BhY2UuICBDb250cmlidXRlZCBieSBBbmRyZXcgRGFsa2UuCisKKyAgICAgICAgICBleGFtcGxlcy9CQVNJQyAgICAgICA6IEFuIGltcGxlbWVudGF0aW9uIG9mIDE5NjQgRGFydG1vdXRoIEJBU0lDLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgRGF2ZSBhZ2FpbnN0IGhpcyBiZXR0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1ZGdlbWVudC4KKworMDkvMjgvMDY6IGJlYXpsZXkKKyAgICAgICAgICBNaW5vciBwYXRjaCB0byBhbGxvdyBuYW1lZCBncm91cHMgdG8gYmUgdXNlZCBpbiBsZXggcmVndWxhcgorICAgICAgICAgIGV4cHJlc3Npb24gcnVsZXMuICBGb3IgZXhhbXBsZToKKworICAgICAgICAgICAgICB0X1FTVFJJTkcgPSByJycnKD9QPHF1b3RlPlsnIl0pLio/KD9QPXF1b3RlKScnJworCisgICAgICAgICAgUGF0Y2ggc3VibWl0dGVkIGJ5IEFkYW0gUmluZy4KKyAKKzA5LzI4LzA2OiBiZWF6bGV5CisgICAgICAgICAgTEFMUigxKSBpcyBub3cgdGhlIGRlZmF1bHQgcGFyc2luZyBtZXRob2QuICAgVG8gdXNlIFNMUiwgdXNlCisgICAgICAgICAgeWFjYy55YWNjKG1ldGhvZD0iU0xSIikuICBOb3RlOiB0aGVyZSBpcyBubyBwZXJmb3JtYW5jZSBpbXBhY3QKKyAgICAgICAgICBvbiBwYXJzaW5nIHdoZW4gdXNpbmcgTEFMUigxKSBpbnN0ZWFkIG9mIFNMUi4gSG93ZXZlciwgY29uc3RydWN0aW5nCisgICAgICAgICAgdGhlIHBhcnNpbmcgdGFibGVzIHdpbGwgdGFrZSBhIGxpdHRsZSBsb25nZXIuCisKKzA5LzI2LzA2OiBiZWF6bGV5CisgICAgICAgICAgQ2hhbmdlIHRvIGxpbmUgbnVtYmVyIHRyYWNraW5nLiAgVG8gbW9kaWZ5IGxpbmUgbnVtYmVycywgbW9kaWZ5CisgICAgICAgICAgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBsZXhlciBpdHNlbGYuICBGb3IgZXhhbXBsZToKKworICAgICAgICAgIGRlZiB0X05FV0xJTkUodCk6CisgICAgICAgICAgICAgIHInXG4nCisgICAgICAgICAgICAgIHQubGV4ZXIubGluZW5vICs9IDEKKworICAgICAgICAgIFRoaXMgbW9kaWZpY2F0aW9uIGlzIGJvdGggY2xlYW51cCBhbmQgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uCisgICAgICAgICAgSW4gcGFzdCB2ZXJzaW9ucywgbGV4IHdhcyBtb25pdG9yaW5nIGV2ZXJ5IHRva2VuIGZvciBjaGFuZ2VzIGluCisgICAgICAgICAgdGhlIGxpbmUgbnVtYmVyLiAgVGhpcyBleHRyYSBwcm9jZXNzaW5nIGlzIHVubmVjZXNzYXJ5IGZvciBhIHZhc3QKKyAgICAgICAgICBtYWpvcml0eSBvZiB0b2tlbnMuIFRodXMsIHRoaXMgbmV3IGFwcHJvYWNoIGNsZWFucyBpdCB1cCBhIGJpdC4KKworICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgorICAgICAgICAgIFlvdSB3aWxsIG5lZWQgdG8gY2hhbmdlIGNvZGUgaW4geW91ciBsZXhlciB0aGF0IHVwZGF0ZXMgdGhlIGxpbmUKKyAgICAgICAgICBudW1iZXIuIEZvciBleGFtcGxlLCAidC5saW5lbm8gKz0gMSIgYmVjb21lcyAidC5sZXhlci5saW5lbm8gKz0gMSIKKyAgICAgICAgIAorMDkvMjYvMDY6IGJlYXpsZXkKKyAgICAgICAgICBBZGRlZCB0aGUgbGV4aW5nIHBvc2l0aW9uIHRvIHRva2VucyBhcyBhbiBhdHRyaWJ1dGUgbGV4cG9zLiBUaGlzCisgICAgICAgICAgaXMgdGhlIHJhdyBpbmRleCBpbnRvIHRoZSBpbnB1dCB0ZXh0IGF0IHdoaWNoIGEgdG9rZW4gYXBwZWFycy4KKyAgICAgICAgICBUaGlzIGluZm9ybWF0aW9uIGNhbiBiZSB1c2VkIHRvIGNvbXB1dGUgY29sdW1uIG51bWJlcnMgYW5kIG90aGVyCisgICAgICAgICAgZGV0YWlscyAoZS5nLiwgc2NhbiBiYWNrd2FyZHMgZnJvbSBsZXhwb3MgdG8gdGhlIGZpcnN0IG5ld2xpbmUKKyAgICAgICAgICB0byBnZXQgYSBjb2x1bW4gcG9zaXRpb24pLgorCiswOS8yNS8wNjogYmVhemxleQorICAgICAgICAgIENoYW5nZWQgdGhlIG5hbWUgb2YgdGhlIF9fY29weV9fKCkgbWV0aG9kIG9uIHRoZSBMZXhlciBjbGFzcworICAgICAgICAgIHRvIGNsb25lKCkuICBUaGlzIGlzIHVzZWQgdG8gY2xvbmUgYSBMZXhlciBvYmplY3QgKGUuZy4sIGlmCisgICAgICAgICAgeW91J3JlIHJ1bm5pbmcgZGlmZmVyZW50IGxleGVycyBhdCB0aGUgc2FtZSB0aW1lKS4KKworMDkvMjEvMDY6IGJlYXpsZXkKKyAgICAgICAgICBMaW1pdGF0aW9ucyByZWxhdGVkIHRvIHRoZSB1c2Ugb2YgdGhlIHJlIG1vZHVsZSBoYXZlIGJlZW4gZWxpbWluYXRlZC4KKyAgICAgICAgICBTZXZlcmFsIHVzZXJzIHJlcG9ydGVkIHByb2JsZW1zIHdpdGggcmVndWxhciBleHByZXNzaW9ucyBleGNlZWRpbmcKKyAgICAgICAgICBtb3JlIHRoYW4gMTAwIG5hbWVkIGdyb3Vwcy4gVG8gc29sdmUgdGhpcywgbGV4LnB5IGlzIG5vdyBjYXBhYmxlCisgICAgICAgICAgb2YgYXV0b21hdGljYWxseSBzcGxpdHRpbmcgaXRzIG1hc3RlciByZWd1bGFyIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbnRvCisgICAgICAgICAgc21hbGxlciBleHByZXNzaW9ucyBhcyBuZWVkZWQuICAgVGhpcyBzaG91bGQsIGluIHRoZW9yeSwgbWFrZSBpdAorICAgICAgICAgIHBvc3NpYmxlIHRvIHNwZWNpZnkgYW4gYXJiaXRyYXJpbHkgbGFyZ2UgbnVtYmVyIG9mIHRva2Vucy4KKworMDkvMjEvMDY6IGJlYXpsZXkKKyAgICAgICAgICBJbXByb3ZlZCBlcnJvciBjaGVja2luZyBpbiBsZXgucHkuICBSdWxlcyB0aGF0IG1hdGNoIHRoZSBlbXB0eSBzdHJpbmcKKyAgICAgICAgICBhcmUgbm93IHJlamVjdGVkIChvdGhlcndpc2UgdGhleSBjYXVzZSB0aGUgbGV4ZXIgdG8gZW50ZXIgYW4gaW5maW5pdGUKKyAgICAgICAgICBsb29wKS4gIEFuIGV4dHJhIGNoZWNrIGZvciBydWxlcyBjb250YWluaW5nICcjJyBoYXMgYWxzbyBiZWVuIGFkZGVkLgorICAgICAgICAgIFNpbmNlIGxleCBjb21waWxlcyByZWd1bGFyIGV4cHJlc3Npb25zIGluIHZlcmJvc2UgbW9kZSwgJyMnIGlzIGludGVycHJldGVkCisgICAgICAgICAgYXMgYSByZWdleCBjb21tZW50LCBpdCBpcyBjcml0aWNhbCB0byB1c2UgJ1wjJyBpbnN0ZWFkLiAgCisKKzA5LzE4LzA2OiBiZWF6bGV5CisgICAgICAgICAgQWRkZWQgYSBAVE9LRU4gZGVjb3JhdG9yIGZ1bmN0aW9uIHRvIGxleC5weSB0aGF0IGNhbiBiZSB1c2VkIHRvIAorICAgICAgICAgIGRlZmluZSB0b2tlbiBydWxlcyB3aGVyZSB0aGUgZG9jdW1lbnRhdGlvbiBzdHJpbmcgbWlnaHQgYmUgY29tcHV0ZWQKKyAgICAgICAgICBpbiBzb21lIHdheS4KKyAgICAgICAgICAKKyAgICAgICAgICBkaWdpdCAgICAgICAgICAgID0gcicoWzAtOV0pJworICAgICAgICAgIG5vbmRpZ2l0ICAgICAgICAgPSByJyhbX0EtWmEtel0pJworICAgICAgICAgIGlkZW50aWZpZXIgICAgICAgPSByJygnICsgbm9uZGlnaXQgKyByJygnICsgZGlnaXQgKyByJ3wnICsgbm9uZGlnaXQgKyByJykqKScgICAgICAgIAorCisgICAgICAgICAgZnJvbSBwbHkubGV4IGltcG9ydCBUT0tFTgorCisgICAgICAgICAgQFRPS0VOKGlkZW50aWZpZXIpCisgICAgICAgICAgZGVmIHRfSUQodCk6CisgICAgICAgICAgICAgICAjIERvIHdoYXRldmVyCisKKyAgICAgICAgICBUaGUgQFRPS0VOIGRlY29yYXRvciBtZXJlbHkgc2V0cyB0aGUgZG9jdW1lbnRhdGlvbiBzdHJpbmcgb2YgdGhlCisgICAgICAgICAgYXNzb2NpYXRlZCB0b2tlbiBmdW5jdGlvbiBhcyBuZWVkZWQgZm9yIGxleCB0byB3b3JrLiAgCisKKyAgICAgICAgICBOb3RlOiBBbiBhbHRlcm5hdGl2ZSBzb2x1dGlvbiBpcyB0aGUgZm9sbG93aW5nOgorCisgICAgICAgICAgZGVmIHRfSUQodCk6CisgICAgICAgICAgICAgICMgRG8gd2hhdGV2ZXIKKyAgIAorICAgICAgICAgIHRfSUQuX19kb2NfXyA9IGlkZW50aWZpZXIKKworICAgICAgICAgIE5vdGU6IERlY29yYXRvcnMgcmVxdWlyZSB0aGUgdXNlIG9mIFB5dGhvbiAyLjQgb3IgbGF0ZXIuICBJZiBjb21wYXRpYmlsaXR5CisgICAgICAgICAgd2l0aCBvbGQgdmVyc2lvbnMgaXMgbmVlZGVkLCB1c2UgdGhlIGxhdHRlciBzb2x1dGlvbi4KKworICAgICAgICAgIFRoZSBuZWVkIGZvciB0aGlzIGZlYXR1cmUgd2FzIHN1Z2dlc3RlZCBieSBDZW0gS2FyYW4uCisKKzA5LzE0LzA2OiBiZWF6bGV5CisgICAgICAgICAgU3VwcG9ydCBmb3Igc2luZ2xlLWNoYXJhY3RlciBsaXRlcmFsIHRva2VucyBoYXMgYmVlbiBhZGRlZCB0byB5YWNjLgorICAgICAgICAgIFRoZXNlIGxpdGVyYWxzIG11c3QgYmUgZW5jbG9zZWQgaW4gcXVvdGVzLiAgRm9yIGV4YW1wbGU6CisKKyAgICAgICAgICBkZWYgcF9leHByKHApOgorICAgICAgICAgICAgICAgImV4cHIgOiBleHByICcrJyBleHByIgorICAgICAgICAgICAgICAgLi4uCisKKyAgICAgICAgICBkZWYgcF9leHByKHApOgorICAgICAgICAgICAgICAgJ2V4cHIgOiBleHByICItIiBleHByJworICAgICAgICAgICAgICAgLi4uCisKKyAgICAgICAgICBJbiBhZGRpdGlvbiB0byB0aGlzLCBpdCBpcyBuZWNlc3NhcnkgdG8gdGVsbCB0aGUgbGV4ZXIgbW9kdWxlIGFib3V0CisgICAgICAgICAgbGl0ZXJhbCBjaGFyYWN0ZXJzLiAgIFRoaXMgaXMgZG9uZSBieSBkZWZpbmluZyB0aGUgdmFyaWFibGUgJ2xpdGVyYWxzJworICAgICAgICAgIGFzIGEgbGlzdCBvZiBjaGFyYWN0ZXJzLiAgVGhpcyBzaG91bGQgIGJlIGRlZmluZWQgaW4gdGhlIG1vZHVsZSB0aGF0CisgICAgICAgICAgaW52b2tlcyB0aGUgbGV4LmxleCgpIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGU6CisKKyAgICAgICAgICAgICBsaXRlcmFscyA9IFsnKycsJy0nLCcqJywnLycsJygnLCcpJywnPSddCisgCisgICAgICAgICAgb3Igc2ltcGx5CisKKyAgICAgICAgICAgICBsaXRlcmFscyA9ICcrPSovKCk9JworCisgICAgICAgICAgSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBsaXRlcmFscyBjYW4gb25seSBiZSBhIHNpbmdsZSBjaGFyYWN0ZXIuCisgICAgICAgICAgV2hlbiB0aGUgbGV4ZXIgZmFpbHMgdG8gbWF0Y2ggYSB0b2tlbiB1c2luZyBpdHMgbm9ybWFsIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgICAgICAgIHJ1bGVzLCBpdCB3aWxsIGNoZWNrIHRoZSBjdXJyZW50IGNoYXJhY3RlciBhZ2FpbnN0IHRoZSBsaXRlcmFsIGxpc3QuCisgICAgICAgICAgSWYgZm91bmQsIGl0IHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHRva2VuIHR5cGUgc2V0IHRvIG1hdGNoIHRoZSBsaXRlcmFsCisgICAgICAgICAgY2hhcmFjdGVyLiAgT3RoZXJ3aXNlLCBhbiBpbGxlZ2FsIGNoYXJhY3RlciB3aWxsIGJlIHNpZ25hbGxlZC4KKworCiswOS8xNC8wNjogYmVhemxleQorICAgICAgICAgIE1vZGlmaWVkIFBMWSB0byBpbnN0YWxsIGl0c2VsZiBhcyBhIHByb3BlciBQeXRob24gcGFja2FnZSBjYWxsZWQgJ3BseScuCisgICAgICAgICAgVGhpcyB3aWxsIG1ha2UgaXQgYSBsaXR0bGUgbW9yZSBmcmllbmRseSB0byBvdGhlciBtb2R1bGVzLiAgVGhpcworICAgICAgICAgIGNoYW5nZXMgdGhlIHVzYWdlIG9mIFBMWSBvbmx5IHNsaWdodGx5LiAgSnVzdCBkbyB0aGlzIHRvIGltcG9ydCB0aGUKKyAgICAgICAgICBtb2R1bGVzCisKKyAgICAgICAgICAgICAgICBpbXBvcnQgcGx5LmxleCBhcyBsZXgKKyAgICAgICAgICAgICAgICBpbXBvcnQgcGx5LnlhY2MgYXMgeWFjYworCisgICAgICAgICAgQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBkbyB0aGlzOgorCisgICAgICAgICAgICAgICAgZnJvbSBwbHkgaW1wb3J0ICoKKworICAgICAgICAgIFdoaWNoIGltcG9ydHMgYm90aCB0aGUgbGV4IGFuZCB5YWNjIG1vZHVsZXMuCisgICAgICAgICAgQ2hhbmdlIHN1Z2dlc3RlZCBieSBMZWUgSnVuZS4KKworMDkvMTMvMDY6IGJlYXpsZXkKKyAgICAgICAgICBDaGFuZ2VkIHRoZSBoYW5kbGluZyBvZiBuZWdhdGl2ZSBpbmRpY2VzIHdoZW4gdXNlZCBpbiBwcm9kdWN0aW9uIHJ1bGVzLgorICAgICAgICAgIEEgbmVnYXRpdmUgcHJvZHVjdGlvbiBpbmRleCBub3cgYWNjZXNzZXMgYWxyZWFkeSBwYXJzZWQgc3ltYm9scyBvbiB0aGUKKyAgICAgICAgICBwYXJzaW5nIHN0YWNrLiAgRm9yIGV4YW1wbGUsIAorCisgICAgICAgICAgICAgIGRlZiBwX2ZvbyhwKToKKyAgICAgICAgICAgICAgICAgICAiZm9vOiBBIEIgQyBEIgorICAgICAgICAgICAgICAgICAgIHByaW50IHBbMV0gICAgICAgIyBWYWx1ZSBvZiAnQScgc3ltYm9sCisgICAgICAgICAgICAgICAgICAgcHJpbnQgcFsyXSAgICAgICAjIFZhbHVlIG9mICdCJyBzeW1ib2wKKyAgICAgICAgICAgICAgICAgICBwcmludCBwWy0xXSAgICAgICMgVmFsdWUgb2Ygd2hhdGV2ZXIgc3ltYm9sIGFwcGVhcnMgYmVmb3JlIEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb24gdGhlIHBhcnNpbmcgc3RhY2suCisKKyAgICAgICAgICAgICAgICAgICBwWzBdID0gc29tZV92YWwgICMgU2V0cyB0aGUgdmFsdWUgb2YgdGhlICdmb28nIGdyYW1tZXIgc3ltYm9sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICBUaGlzIGJlaGF2aW9yIG1ha2VzIGl0IGVhc2llciB0byB3b3JrIHdpdGggZW1iZWRkZWQgYWN0aW9ucyB3aXRoaW4gdGhlCisgICAgICAgICAgcGFyc2luZyBydWxlcy4gRm9yIGV4YW1wbGUsIGluIEMteWFjYywgaXQgaXMgcG9zc2libGUgdG8gd3JpdGUgY29kZSBsaWtlCisgICAgICAgICAgdGhpczoKKworICAgICAgICAgICAgICAgYmFyOiAgIEEgeyBwcmludGYoInNlZW4gYW4gQSA9ICVkXG4iLCAkMSk7IH0gQiB7IGRvX3N0dWZmOyB9CisKKyAgICAgICAgICBJbiB0aGlzIGV4YW1wbGUsIHRoZSBwcmludGYoKSBjb2RlIGV4ZWN1dGVzIGltbWVkaWF0ZWx5IGFmdGVyIEEgaGFzIGJlZW4KKyAgICAgICAgICBwYXJzZWQuICBXaXRoaW4gdGhlIGVtYmVkZGVkIGFjdGlvbiBjb2RlLCAkMSByZWZlcnMgdG8gdGhlIEEgc3ltYm9sIG9uCisgICAgICAgICAgdGhlIHN0YWNrLgorCisgICAgICAgICAgVG8gcGVyZm9ybSB0aGlzIGVxdWl2YWxlbnQgYWN0aW9uIGluIFBMWSwgeW91IG5lZWQgdG8gd3JpdGUgYSBwYWlyCisgICAgICAgICAgb2YgcnVsZXMgbGlrZSB0aGlzOgorCisgICAgICAgICAgICAgICBkZWYgcF9iYXIocCk6CisgICAgICAgICAgICAgICAgICAgICAiYmFyIDogQSBzZWVuX0EgQiIKKyAgICAgICAgICAgICAgICAgICAgIGRvX3N0dWZmCisKKyAgICAgICAgICAgICAgIGRlZiBwX3NlZW5fQShwKToKKyAgICAgICAgICAgICAgICAgICAgICJzZWVuX0EgOiIKKyAgICAgICAgICAgICAgICAgICAgIHByaW50ICJzZWVuIGFuIEEgPSIsIHBbLTFdCisKKyAgICAgICAgICBUaGUgc2Vjb25kIHJ1bGUgInNlZW5fQSIgaXMgbWVyZWx5IGEgZW1wdHkgcHJvZHVjdGlvbiB3aGljaCBzaG91bGQgYmUKKyAgICAgICAgICByZWR1Y2VkIGFzIHNvb24gYXMgQSBpcyBwYXJzZWQgaW4gdGhlICJiYXIiIHJ1bGUgYWJvdmUuICBUaGUgdXNlIAorICAgICAgICAgIG9mIHRoZSBuZWdhdGl2ZSBpbmRleCBwWy0xXSBpcyB1c2VkIHRvIGFjY2VzcyB3aGF0ZXZlciBzeW1ib2wgYXBwZWFyZWQKKyAgICAgICAgICBiZWZvcmUgdGhlIHNlZW5fQSBzeW1ib2wuCisKKyAgICAgICAgICBUaGlzIGZlYXR1cmUgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byBzdXBwb3J0IGluaGVyaXRlZCBhdHRyaWJ1dGVzLgorICAgICAgICAgIEZvciBleGFtcGxlOgorCisgICAgICAgICAgICAgICBkZWYgcF9kZWNsKHApOgorICAgICAgICAgICAgICAgICAgICAgImRlY2wgOiBzY29wZSBuYW1lIgorCisgICAgICAgICAgICAgICBkZWYgcF9zY29wZShwKToKKyAgICAgICAgICAgICAgICAgICAgICIiInNjb3BlIDogR0xPQkFMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExPQ0FMIiIiCisgICAgICAgICAgICAgICAgICAgcFswXSA9IHBbMV0KKworICAgICAgICAgICAgICAgZGVmIHBfbmFtZShwKToKKyAgICAgICAgICAgICAgICAgICAgICJuYW1lIDogSUQiCisgICAgICAgICAgICAgICAgICAgICBpZiBwWy0xXSA9PSAiR0xPQkFMIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyAuLi4KKyAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgcFstMV0gPT0gIkxPQ0FMIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIy4uLgorCisgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgbmFtZSBydWxlIGlzIGluaGVyaXRpbmcgYW4gYXR0cmlidXRlIGZyb20gdGhlCisgICAgICAgICAgc2NvcGUgZGVjbGFyYXRpb24gdGhhdCBwcmVjZWRlcyBpdC4KKyAgICAgICAKKyAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKKyAgICAgICAgICBJZiB5b3UgYXJlIGN1cnJlbnRseSB1c2luZyBuZWdhdGl2ZSBpbmRpY2VzIHdpdGhpbiBleGlzdGluZyBncmFtbWFyIHJ1bGVzLAorICAgICAgICAgIHlvdXIgY29kZSB3aWxsIGJyZWFrLiAgVGhpcyBzaG91bGQgYmUgZXh0cmVtZWx5IHJhcmUgaWYgbm9uLWV4aXN0ZW50IGluCisgICAgICAgICAgbW9zdCBjYXNlcy4gIFRoZSBhcmd1bWVudCB0byB2YXJpb3VzIGdyYW1tYXIgcnVsZXMgaXMgbm90IHVzdWFsbHkgbm90CisgICAgICAgICAgcHJvY2Vzc2VkIGluIHRoZSBzYW1lIHdheSBhcyBhIGxpc3Qgb2YgaXRlbXMuCisgICAgICAgICAgCitWZXJzaW9uIDIuMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiswOS8wNy8wNjogYmVhemxleQorICAgICAgICAgIE1ham9yIGNsZWFudXAgYW5kIHJlZmFjdG9yaW5nIG9mIHRoZSBMUiB0YWJsZSBnZW5lcmF0aW9uIGNvZGUuICBCb3RoIFNMUgorICAgICAgICAgIGFuZCBMQUxSKDEpIHRhYmxlIGdlbmVyYXRpb24gaXMgbm93IHBlcmZvcm1lZCBieSB0aGUgc2FtZSBjb2RlIGJhc2Ugd2l0aAorICAgICAgICAgIG9ubHkgbWlub3IgZXh0ZW5zaW9ucyBmb3IgZXh0cmEgTEFMUigxKSBwcm9jZXNzaW5nLgorCiswOS8wNy8wNjogYmVhemxleQorICAgICAgICAgIENvbXBsZXRlbHkgcmVpbXBsZW1lbnRlZCB0aGUgZW50aXJlIExBTFIoMSkgcGFyc2luZyBlbmdpbmUgdG8gdXNlIHRoZQorICAgICAgICAgIERlUmVtZXIgYW5kIFBlbm5lbGxvIGFsZ29yaXRobSBmb3IgY2FsY3VsYXRpbmcgbG9va2FoZWFkIHNldHMuICBUaGlzCisgICAgICAgICAgc2lnbmlmaWNhbnRseSBpbXByb3ZlcyB0aGUgcGVyZm9ybWFuY2Ugb2YgZ2VuZXJhdGluZyBMQUxSKDEpIHRhYmxlcworICAgICAgICAgIGFuZCBoYXMgdGhlIGFkZGVkIGZlYXR1cmUgb2YgYWN0dWFsbHkgd29ya2luZyBjb3JyZWN0bHkhICBJZiB5b3UKKyAgICAgICAgICBleHBlcmllbmNlZCB3ZWlyZCBiZWhhdmlvciB3aXRoIExBTFIoMSkgaW4gcHJpb3IgcmVsZWFzZXMsIHRoaXMgc2hvdWxkCisgICAgICAgICAgaG9wZWZ1bGx5IHJlc29sdmUgYWxsIG9mIHRob3NlIHByb2JsZW1zLiAgTWFueSB0aGFua3MgdG8gCisgICAgICAgICAgQW5kcmV3IFdhdGVycyBhbmQgTWFya3VzIFNjaG9lcGZsaW4gZm9yIHN1Ym1pdHRpbmcgYnVnIHJlcG9ydHMKKyAgICAgICAgICBhbmQgaGVscGluZyBtZSB0ZXN0IG91dCB0aGUgcmV2aXNlZCBMQUxSKDEpIHN1cHBvcnQuCisKK1ZlcnNpb24gMS44CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzA4LzAyLzA2OiBiZWF6bGV5CisgICAgICAgICAgRml4ZWQgYSBwcm9ibGVtIHJlbGF0ZWQgdG8gdGhlIGhhbmRsaW5nIG9mIGRlZmF1bHQgYWN0aW9ucyBpbiBMQUxSKDEpCisgICAgICAgICAgcGFyc2luZy4gIElmIHlvdSBleHBlcmllbmNlZCBzdWJ0bGUgYW5kL29yIGJpemFycmUgYmVoYXZpb3Igd2hlbiB0cnlpbmcKKyAgICAgICAgICB0byB1c2UgdGhlIExBTFIoMSkgZW5naW5lLCB0aGlzIG1heSBjb3JyZWN0IHRob3NlIHByb2JsZW1zLiAgUGF0Y2gKKyAgICAgICAgICBjb250cmlidXRlZCBieSBSdXNzIENveC4gIE5vdGU6IFRoaXMgcGF0Y2ggaGFzIGJlZW4gc3VwZXJjZWRlZCBieSAKKyAgICAgICAgICByZXZpc2lvbnMgZm9yIExBTFIoMSkgcGFyc2luZyBpbiBQbHktMi4wLgorCiswOC8wMi8wNjogYmVhemxleQorICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHNsaWNpbmcgb2YgcHJvZHVjdGlvbnMgaW4geWFjYy4gIAorICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFBhdHJpY2sgTWV6YXJkLgorCitWZXJzaW9uIDEuNworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiswMy8wMi8wNjogYmVhemxleQorICAgICAgICAgIEZpeGVkIGluZmluaXRlIHJlY3Vyc2lvbiBwcm9ibGVtIFJlZHVjZVRvVGVybWluYWxzKCkgZnVuY3Rpb24gdGhhdAorICAgICAgICAgIHdvdWxkIHNvbWV0aW1lcyBjb21lIHVwIGluIExBTFIoMSkgdGFibGUgZ2VuZXJhdGlvbi4gIFJlcG9ydGVkIGJ5IAorICAgICAgICAgIE1hcmt1cyBTY2hvZXBmbGluLgorCiswMy8wMS8wNjogYmVhemxleQorICAgICAgICAgIEFkZGVkICJyZWZsYWdzIiBhcmd1bWVudCB0byBsZXgoKS4gIEZvciBleGFtcGxlOgorCisgICAgICAgICAgICAgICBsZXgubGV4KHJlZmxhZ3M9cmUuVU5JQ09ERSkKKworICAgICAgICAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvcHRpb25hbCBmbGFncyB0byB0aGUgcmUuY29tcGlsZSgpIGZ1bmN0aW9uCisgICAgICAgICAgdXNlZCBpbnNpZGUgdGhlIGxleGVyLiAgIFRoaXMgbWF5IGJlIG5lY2Vzc2FyeSBmb3Igc3BlY2lhbCBzaXR1YXRpb25zIHN1Y2gKKyAgICAgICAgICBhcyBwcm9jZXNzaW5nIFVuaWNvZGUgKGUuZy4sIGlmIHlvdSB3YW50IGVzY2FwZXMgbGlrZSBcdyBhbmQgXGIgdG8gY29uc3VsdAorICAgICAgICAgIHRoZSBVbmljb2RlIGNoYXJhY3RlciBwcm9wZXJ0eSBkYXRhYmFzZSkuICAgVGhlIG5lZWQgZm9yIHRoaXMgc3VnZ2VzdGVkIGJ5CisgICAgICAgICAgQW5kcmVhcyBKdW5nLgorCiswMy8wMS8wNjogYmVhemxleQorICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggYW4gdW5pbml0aWFsaXplZCB2YXJpYWJsZSBvbiByZXBlYXRlZCBpbnN0YW50aWF0aW9ucyBvZiBwYXJzZXIKKyAgICAgICAgICBvYmplY3RzIHdoZW4gdGhlIHdyaXRlX3RhYmxlcz0wIGFyZ3VtZW50IHdhcyB1c2VkLiAgIFJlcG9ydGVkIGJ5IE1pY2hhZWwgQnJvd24uCisKKzAzLzAxLzA2OiBiZWF6bGV5CisgICAgICAgICAgTW9kaWZpZWQgbGV4LnB5IHRvIGFjY2VwdCBVbmljb2RlIHN0cmluZ3MgYm90aCBhcyB0aGUgcmVndWxhciBleHByZXNzaW9ucyBmb3IKKyAgICAgICAgICB0b2tlbnMgYW5kIGFzIGlucHV0LiBIb3BlZnVsbHkgdGhpcyBpcyB0aGUgb25seSBjaGFuZ2UgbmVlZGVkIGZvciBVbmljb2RlIHN1cHBvcnQuCisgICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgSm9oYW4gRGFobC4KKworMDMvMDEvMDY6IGJlYXpsZXkKKyAgICAgICAgICBNb2RpZmllZCB0aGUgY2xhc3MtYmFzZWQgaW50ZXJmYWNlIHRvIHdvcmsgd2l0aCBuZXctc3R5bGUgb3Igb2xkLXN0eWxlIGNsYXNzZXMuCisgICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgTWljaGFlbCBCcm93biAoYWx0aG91Z2ggSSB0d2Vha2VkIGl0IHNsaWdodGx5IHNvIGl0IHdvdWxkIHdvcmsKKyAgICAgICAgICB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIFB5dGhvbikuCisKK1ZlcnNpb24gMS42CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzA1LzI3LzA1OiBiZWF6bGV5CisgICAgICAgICAgSW5jb3Jwb3JhdGVkIHBhdGNoIGNvbnRyaWJ1dGVkIGJ5IENocmlzdG9waGVyIFN0YXdhcnogdG8gZml4IGFuIGV4dHJlbWVseQorICAgICAgICAgIGRldmlvdXMgYnVnIGluIExBTFIoMSkgcGFyc2VyIGdlbmVyYXRpb24uICAgVGhpcyBwYXRjaCBzaG91bGQgZml4IHByb2JsZW1zCisgICAgICAgICAgbnVtZXJvdXMgcGVvcGxlIHJlcG9ydGVkIHdpdGggTEFMUiBwYXJzaW5nLgorCiswNS8yNy8wNTogYmVhemxleQorICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBsZXgucHkgY29weSBjb25zdHJ1Y3Rvci4gIFJlcG9ydGVkIGJ5IERhdmUgQWl0ZWwsIEFhcm9uIExhdiwKKyAgICAgICAgICBhbmQgVGhhZCBBdXN0aW4uIAorCiswNS8yNy8wNTogYmVhemxleQorICAgICAgICAgIEFkZGVkIG91dHB1dGRpciBvcHRpb24gdG8geWFjYygpICB0byBjb250cm9sIG91dHB1dCBkaXJlY3RvcnkuIENvbnRyaWJ1dGVkCisgICAgICAgICAgYnkgQ2hyaXN0b3BoZXIgU3Rhd2Fyei4KKworMDUvMjcvMDU6IGJlYXpsZXkKKyAgICAgICAgICBBZGRlZCBydW51bml0LnB5IHRlc3Qgc2NyaXB0IHRvIHJ1biB0ZXN0cyB1c2luZyB0aGUgUHl0aG9uIHVuaXR0ZXN0IG1vZHVsZS4KKyAgICAgICAgICBDb250cmlidXRlZCBieSBNaWtpIFRlYmVrYS4KKworVmVyc2lvbiAxLjUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMDUvMjYvMDQ6IGJlYXpsZXkKKyAgICAgICAgICBNYWpvciBlbmhhbmNlbWVudC4gTEFMUigxKSBwYXJzaW5nIHN1cHBvcnQgaXMgbm93IHdvcmtpbmcuCisgICAgICAgICAgVGhpcyBmZWF0dXJlIHdhcyBpbXBsZW1lbnRlZCBieSBFbGlhcyBJb3VwIChlemlvdXBAYWx1bW5pLnVjaGljYWdvLmVkdSkKKyAgICAgICAgICBhbmQgb3B0aW1pemVkIGJ5IERhdmlkIEJlYXpsZXkuIFRvIHVzZSBMQUxSKDEpIHBhcnNpbmcgZG8KKyAgICAgICAgICB0aGUgZm9sbG93aW5nOgorCisgICAgICAgICAgICAgICB5YWNjLnlhY2MobWV0aG9kPSJMQUxSIikKKworICAgICAgICAgIENvbXB1dGluZyBMQUxSKDEpIHBhcnNpbmcgdGFibGVzIHRha2VzIGFib3V0IHR3aWNlIGFzIGxvbmcgYXMKKyAgICAgICAgICB0aGUgZGVmYXVsdCBTTFIgbWV0aG9kLiAgSG93ZXZlciwgTEFMUigxKSBhbGxvd3MgeW91IHRvIGhhbmRsZQorICAgICAgICAgIG1vcmUgY29tcGxleCBncmFtbWFycy4gIEZvciBleGFtcGxlLCB0aGUgQU5TSSBDIGdyYW1tYXIKKyAgICAgICAgICAoaW4gZXhhbXBsZS9hbnNpYykgaGFzIDEzIHNoaWZ0LXJlZHVjZSBjb25mbGljdHMgd2l0aCBTTFIsIGJ1dAorICAgICAgICAgIG9ubHkgaGFzIDEgc2hpZnQtcmVkdWNlIGNvbmZsaWN0IHdpdGggTEFMUigxKS4KKworMDUvMjAvMDQ6IGJlYXpsZXkKKyAgICAgICAgICBBZGRlZCBhIF9fbGVuX18gbWV0aG9kIHRvIHBhcnNlciBwcm9kdWN0aW9uIGxpc3RzLiAgQ2FuCisgICAgICAgICAgYmUgdXNlZCBpbiBwYXJzZXIgcnVsZXMgbGlrZSB0aGlzOgorCisgICAgICAgICAgICAgZGVmIHBfc29tZXJ1bGUocCk6CisgICAgICAgICAgICAgICAgICIiImEgOiBCIEMgRAorICAgICAgICAgICAgICAgICAgICAgIHwgRSBGIgorICAgICAgICAgICAgICAgICBpZiAobGVuKHApID09IDMpOgorICAgICAgICAgICAgICAgICAgICAgIyBNdXN0IGhhdmUgYmVlbiBmaXJzdCBydWxlCisgICAgICAgICAgICAgICAgIGVsaWYgKGxlbihwKSA9PSAyKToKKyAgICAgICAgICAgICAgICAgICAgICMgTXVzdCBiZSBzZWNvbmQgcnVsZQorCisgICAgICAgICAgU3VnZ2VzdGVkIGJ5IEpvc2h1YSBHZXJ0aCBhbmQgb3RoZXJzLgorCitWZXJzaW9uIDEuNAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiswNC8yMy8wNDogYmVhemxleQorICAgICAgICAgIEluY29ycG9yYXRlZCBhIHZhcmlldHkgb2YgcGF0Y2hlcyBjb250cmlidXRlZCBieSBFcmljIFJheW1vbmQuCisgICAgICAgICAgVGhlc2UgaW5jbHVkZToKKworICAgICAgICAgICAwLiBDbGVhbnMgdXAgc29tZSBjb21tZW50cyBzbyB0aGV5IGRvbid0IHdyYXAgb24gYW4gODAtY29sdW1uIGRpc3BsYXkuCisgICAgICAgICAgIDEuIERpcmVjdHMgY29tcGlsZXIgZXJyb3JzIHRvIHN0ZGVyciB3aGVyZSB0aGV5IGJlbG9uZy4KKyAgICAgICAgICAgMi4gSW1wbGVtZW50cyBhbmQgZG9jdW1lbnRzIGF1dG9tYXRpYyBsaW5lIGNvdW50aW5nIHdoZW4gXG4gaXMgaWdub3JlZC4KKyAgICAgICAgICAgMy4gQ2hhbmdlcyB0aGUgd2F5IHByb2dyZXNzIG1lc3NhZ2VzIGFyZSBkdW1wZWQgd2hlbiBkZWJ1Z2dpbmcgaXMgb24uIAorICAgICAgICAgICAgICBUaGUgbmV3IGZvcm1hdCBpcyBib3RoIGxlc3MgdmVyYm9zZSBhbmQgY29udmV5cyBtb3JlIGluZm9ybWF0aW9uIHRoYW4KKyAgICAgICAgICAgICAgdGhlIG9sZCwgaW5jbHVkaW5nIHNoaWZ0IGFuZCByZWR1Y2UgYWN0aW9ucy4KKworMDQvMjMvMDQ6IGJlYXpsZXkKKyAgICAgICAgICBBZGRlZCBhIFB5dGhvbiBzZXR1cC5weSBmaWxlIHRvIHNpbXBseSBpbnN0YWxsYXRpb24uICBDb250cmlidXRlZAorICAgICAgICAgIGJ5IEFkYW0gS2Vycmlzb24uCisKKzA0LzIzLzA0OiBiZWF6bGV5CisgICAgICAgICAgQWRkZWQgcGF0Y2hlcyBjb250cmlidXRlZCBieSBBZGFtIEtlcnJpc29uLgorIAorICAgICAgICAgIC0gICBTb21lIG91dHB1dCBpcyBub3cgb25seSBzaG93biB3aGVuIGRlYnVnZ2luZyBpcyBlbmFibGVkLiAgVGhpcworICAgICAgICAgICAgICBtZWFucyB0aGF0IFBMWSB3aWxsIGJlIGNvbXBsZXRlbHkgc2lsZW50IHdoZW4gbm90IGluIGRlYnVnZ2luZyBtb2RlLgorICAgICAgICAgIAorICAgICAgICAgIC0gICBBbiBvcHRpb25hbCBwYXJhbWV0ZXIgIndyaXRlX3RhYmxlcyIgY2FuIGJlIHBhc3NlZCB0byB5YWNjKCkgdG8KKyAgICAgICAgICAgICAgY29udHJvbCB3aGV0aGVyIG9yIG5vdCBwYXJzaW5nIHRhYmxlcyBhcmUgd3JpdHRlbi4gICBCeSBkZWZhdWx0LAorICAgICAgICAgICAgICBpdCBpcyB0cnVlLCBidXQgaXQgY2FuIGJlIHR1cm5lZCBvZmYgaWYgeW91IGRvbid0IHdhbnQgdGhlIHlhY2MKKyAgICAgICAgICAgICAgdGFibGUgZmlsZS4gTm90ZTogZGlzYWJsaW5nIHRoaXMgd2lsbCBjYXVzZSB5YWNjKCkgdG8gcmVnZW5lcmF0ZQorICAgICAgICAgICAgICB0aGUgcGFyc2luZyB0YWJsZSBlYWNoIHRpbWUuCisKKzA0LzIzLzA0OiBiZWF6bGV5CisgICAgICAgICAgQWRkZWQgcGF0Y2hlcyBjb250cmlidXRlZCBieSBEYXZpZCBNY05hYi4gIFRoaXMgcGF0Y2ggYWRkZXMgdHdvCisgICAgICAgICAgZmVhdHVyZXM6CisKKyAgICAgICAgICAtICAgVGhlIHBhcnNlciBjYW4gYmUgc3VwcGxpZWQgYXMgYSBjbGFzcyBpbnN0ZWFkIG9mIGEgbW9kdWxlLgorICAgICAgICAgICAgICBGb3IgYW4gZXhhbXBsZSBvZiB0aGlzLCBzZWUgdGhlIGV4YW1wbGUvY2xhc3NjYWxjIGRpcmVjdG9yeS4KKworICAgICAgICAgIC0gICBEZWJ1Z2dpbmcgb3V0cHV0IGNhbiBiZSBkaXJlY3RlZCB0byBhIGZpbGVuYW1lIG9mIHRoZSB1c2VyJ3MKKyAgICAgICAgICAgICAgY2hvaWNlLiAgVXNlCisKKyAgICAgICAgICAgICAgICAgeWFjYyhkZWJ1Z2ZpbGU9InNvbWVmaWxlLm91dCIpCisKKyAgICAgICAgICAKK1ZlcnNpb24gMS4zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzEyLzEwLzAyOiBqbWR5Y2sKKyAgICAgICAgICBWYXJpb3VzIG1pbm9yIGFkanVzdG1lbnRzIHRvIHRoZSBjb2RlIHRoYXQgRGF2ZSBjaGVja2VkIGluIHRvZGF5LgorICAgICAgICAgIFVwZGF0ZWQgdGVzdC95YWNjX3tpbmYsdW51c2VkfS5leHAgdG8gcmVmbGVjdCB0b2RheSdzIGNoYW5nZXMuCisKKzEyLzEwLzAyOiBiZWF6bGV5CisgICAgICAgICAgSW5jb3Jwb3JhdGVkIGEgdmFyaWV0eSBvZiBtaW5vciBidWcgZml4ZXMgdG8gZW1wdHkgcHJvZHVjdGlvbgorICAgICAgICAgIGhhbmRsaW5nIGFuZCBpbmZpbml0ZSByZWN1cnNpb24gY2hlY2tpbmcuICBDb250cmlidXRlZCBieQorICAgICAgICAgIE1pY2hhZWwgRHljay4KKworMTIvMTAvMDI6IGJlYXpsZXkKKyAgICAgICAgICBSZW1vdmVkIGJvZ3VzIHJlY292ZXIoKSBtZXRob2QgY2FsbCBpbiB5YWNjLnJlc3RhcnQoKQorCitWZXJzaW9uIDEuMgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisxMS8yNy8wMjogYmVhemxleQorICAgICAgICAgIExleGVyIGFuZCBwYXJzZXIgb2JqZWN0cyBhcmUgbm93IGF2YWlsYWJsZSBhcyBhbiBhdHRyaWJ1dGUKKyAgICAgICAgICBvZiB0b2tlbnMgYW5kIHNsaWNlcyByZXNwZWN0aXZlbHkuIEZvciBleGFtcGxlOgorIAorICAgICAgICAgICAgIGRlZiB0X05VTUJFUih0KToKKyAgICAgICAgICAgICAgICAgcidcZCsnCisgICAgICAgICAgICAgICAgIHByaW50IHQubGV4ZXIKKworICAgICAgICAgICAgIGRlZiBwX2V4cHJfcGx1cyh0KToKKyAgICAgICAgICAgICAgICAgJ2V4cHI6IGV4cHIgUExVUyBleHByJworICAgICAgICAgICAgICAgICBwcmludCB0LmxleGVyCisgICAgICAgICAgICAgICAgIHByaW50IHQucGFyc2VyCisKKyAgICAgICAgICBUaGlzIGNhbiBiZSB1c2VkIGZvciBzdGF0ZSBtYW5hZ2VtZW50IChpZiBuZWVkZWQpLgorIAorMTAvMzEvMDI6IGJlYXpsZXkKKyAgICAgICAgICBNb2RpZmllZCB5YWNjLnB5IHRvIHdvcmsgd2l0aCBQeXRob24gb3B0aW1pemUgbW9kZS4gIFRvIG1ha2UKKyAgICAgICAgICB0aGlzIHdvcmssIHlvdSBuZWVkIHRvIHVzZQorCisgICAgICAgICAgICAgIHlhY2MueWFjYyhvcHRpbWl6ZT0xKQorCisgICAgICAgICAgRnVydGhlcm1vcmUsIHlvdSBuZWVkIHRvIGZpcnN0IHJ1biBQeXRob24gaW4gbm9ybWFsIG1vZGUKKyAgICAgICAgICB0byBnZW5lcmF0ZSB0aGUgbmVjZXNzYXJ5IHBhcnNldGFiLnB5IGZpbGVzLiAgQWZ0ZXIgdGhhdCwKKyAgICAgICAgICB5b3UgY2FuIHVzZSBweXRob24gLU8gb3IgcHl0aG9uIC1PTy4gIAorCisgICAgICAgICAgTm90ZTogb3B0aW1pemVkIG1vZGUgdHVybnMgb2ZmIGEgbG90IG9mIGVycm9yIGNoZWNraW5nLgorICAgICAgICAgIE9ubHkgdXNlIHdoZW4geW91IGFyZSBzdXJlIHRoYXQgeW91ciBncmFtbWFyIGlzIHdvcmtpbmcuCisgICAgICAgICAgTWFrZSBzdXJlIHBhcnNldGFiLnB5IGlzIHVwIHRvIGRhdGUhCisKKzEwLzMwLzAyOiBiZWF6bGV5CisgICAgICAgICAgQWRkZWQgY2xvbmluZyBvZiBMZXhlciBvYmplY3RzLiAgIEZvciBleGFtcGxlOgorCisgICAgICAgICAgICAgIGltcG9ydCBjb3B5CisgICAgICAgICAgICAgIGwgPSBsZXgubGV4KCkKKyAgICAgICAgICAgICAgbGMgPSBjb3B5LmNvcHkobCkKKworICAgICAgICAgICAgICBsLmlucHV0KCJTb21lIHRleHQiKQorICAgICAgICAgICAgICBsYy5pbnB1dCgiU29tZSBvdGhlciB0ZXh0IikKKyAgICAgICAgICAgICAgLi4uCisKKyAgICAgICAgICBUaGlzIG1pZ2h0IGJlIHVzZWZ1bCBpZiB0aGUgc2FtZSAibGV4ZXIiIGlzIG1lYW50IHRvCisgICAgICAgICAgYmUgdXNlZCBpbiBkaWZmZXJlbnQgY29udGV4dHMtLS1vciBpZiBtdWx0aXBsZSBsZXhlcnMKKyAgICAgICAgICBhcmUgcnVubmluZyBjb25jdXJyZW50bHkuCisgICAgICAgICAgICAgICAgCisxMC8zMC8wMjogYmVhemxleQorICAgICAgICAgIEZpeGVkIHN1YnRsZSBidWcgd2l0aCBmaXJzdCBzZXQgY29tcHV0YXRpb24gYW5kIGVtcHR5IHByb2R1Y3Rpb25zLgorICAgICAgICAgIFBhdGNoIHN1Ym1pdHRlZCBieSBNaWNoYWVsIER5Y2suCisKKzEwLzMwLzAyOiBiZWF6bGV5CisgICAgICAgICAgRml4ZWQgZXJyb3IgbWVzc2FnZXMgdG8gdXNlICJmaWxlbmFtZTpsaW5lOiBtZXNzYWdlIiBpbnN0ZWFkCisgICAgICAgICAgb2YgImZpbGVuYW1lOmxpbmUuIG1lc3NhZ2UiLiAgVGhpcyBtYWtlcyBlcnJvciByZXBvcnRpbmcgbW9yZQorICAgICAgICAgIGZyaWVuZGx5IHRvIGVtYWNzLiBQYXRjaCBzdWJtaXR0ZWQgYnkgRnJhbudvaXMgUGluYXJkLgorCisxMC8zMC8wMjogYmVhemxleQorICAgICAgICAgIEltcHJvdmVtZW50cyB0byBwYXJzZXIub3V0IGZpbGUuICBUZXJtaW5hbHMgYW5kIG5vbnRlcm1pbmFscworICAgICAgICAgIGFyZSBzb3J0ZWQgaW5zdGVhZCBvZiBiZWluZyBwcmludGVkIGluIHJhbmRvbSBvcmRlci4KKyAgICAgICAgICBQYXRjaCBzdWJtaXR0ZWQgYnkgRnJhbudvaXMgUGluYXJkLgorCisxMC8zMC8wMjogYmVhemxleQorICAgICAgICAgIEltcHJvdmVtZW50cyB0byBwYXJzZXIub3V0IGZpbGUgb3V0cHV0LiAgUnVsZXMgYXJlIG5vdyBwcmludGVkCisgICAgICAgICAgaW4gYSB3YXkgdGhhdCdzIGVhc2llciB0byB1bmRlcnN0YW5kLiAgQ29udHJpYnV0ZWQgYnkgUnVzcyBDb3guCisKKzEwLzMwLzAyOiBiZWF6bGV5CisgICAgICAgICAgQWRkZWQgJ25vbmFzc29jJyBhc3NvY2lhdGl2aXR5IHN1cHBvcnQuICAgIFRoaXMgY2FuIGJlIHVzZWQKKyAgICAgICAgICB0byBkaXNhYmxlIHRoZSBjaGFpbmluZyBvZiBvcGVyYXRvcnMgbGlrZSBhIDwgYiA8IGMuCisgICAgICAgICAgVG8gdXNlLCBzaW1wbHkgc3BlY2lmeSAnbm9uYXNzb2MnIGluIHRoZSBwcmVjZWRlbmNlIHRhYmxlCisKKyAgICAgICAgICBwcmVjZWRlbmNlID0gKAorICAgICAgICAgICAgKCdub25hc3NvYycsICdMRVNTVEhBTicsICdHUkVBVEVSVEhBTicpLCAgIyBOb25hc3NvY2lhdGl2ZSBvcGVyYXRvcnMKKyAgICAgICAgICAgICgnbGVmdCcsICdQTFVTJywgJ01JTlVTJyksCisgICAgICAgICAgICAoJ2xlZnQnLCAnVElNRVMnLCAnRElWSURFJyksCisgICAgICAgICAgICAoJ3JpZ2h0JywgJ1VNSU5VUycpLCAgICAgICAgICAgICMgVW5hcnkgbWludXMgb3BlcmF0b3IKKyAgICAgICAgICApCisKKyAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBSdXNzIENveC4KKworMTAvMzAvMDI6IGJlYXpsZXkKKyAgICAgICAgICBNb2RpZmllZCB0aGUgbGV4ZXIgdG8gcHJvdmlkZSBvcHRpb25hbCBzdXBwb3J0IGZvciBQeXRob24gLU8gYW5kIC1PTworICAgICAgICAgIG1vZGVzLiAgVG8gbWFrZSB0aGlzIHdvcmssIFB5dGhvbiAqZmlyc3QqIG5lZWRzIHRvIGJlIHJ1biBpbgorICAgICAgICAgIHVub3B0aW1pemVkIG1vZGUuICBUaGlzIHJlYWRzIHRoZSBsZXhpbmcgaW5mb3JtYXRpb24gYW5kIGNyZWF0ZXMgYQorICAgICAgICAgIGZpbGUgImxleHRhYi5weSIuICBUaGVuLCBydW4gbGV4IGxpa2UgdGhpczoKKworICAgICAgICAgICAgICAgICAgICMgbW9kdWxlIGZvby5weQorICAgICAgICAgICAgICAgICAgIC4uLgorICAgICAgICAgICAgICAgICAgIC4uLgorICAgICAgICAgICAgICAgICAgIGxleC5sZXgob3B0aW1pemU9MSkKKworICAgICAgICAgIE9uY2UgdGhlIGxleHRhYiBmaWxlIGhhcyBiZWVuIGNyZWF0ZWQsIHN1YnNlcXVlbnQgY2FsbHMgdG8KKyAgICAgICAgICBsZXgubGV4KCkgd2lsbCByZWFkIGRhdGEgZnJvbSB0aGUgbGV4dGFiIGZpbGUgaW5zdGVhZCBvZiB1c2luZyAKKyAgICAgICAgICBpbnRyb3NwZWN0aW9uLiAgIEluIG9wdGltaXplZCBtb2RlICgtTywgLU9PKSBldmVyeXRoaW5nIHNob3VsZAorICAgICAgICAgIHdvcmsgbm9ybWFsbHkgZGVzcGl0ZSB0aGUgbG9zcyBvZiBkb2Mgc3RyaW5ncy4KKworICAgICAgICAgIFRvIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSAnbGV4dGFiLnB5JyB1c2UgdGhlIGZvbGxvd2luZzoKKworICAgICAgICAgICAgICAgICAgbGV4LmxleChsZXh0YWI9ImZvb3RhYiIpCisKKyAgICAgICAgICAodGhpcyBjcmVhdGVzIGEgZmlsZSBmb290YWIucHkpCisgICAgICAgICAKKworVmVyc2lvbiAxLjEgICBPY3RvYmVyIDI1LCAyMDAxCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworMTAvMjUvMDE6IGJlYXpsZXkKKyAgICAgICAgICBNb2RpZmllZCB0aGUgdGFibGUgZ2VuZXJhdG9yIHRvIHByb2R1Y2UgbXVjaCBtb3JlIGNvbXBhY3QgZGF0YS4KKyAgICAgICAgICBUaGlzIHNob3VsZCBncmVhdGx5IHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgcGFyc2V0YWIucHlbY10gZmlsZS4KKyAgICAgICAgICBDYXZlYXQ6IHRoZSB0YWJsZXMgc3RpbGwgbmVlZCB0byBiZSBjb25zdHJ1Y3RlZCBzbyBhIGxpdHRsZSBtb3JlCisgICAgICAgICAgd29yayBpcyBkb25lIGluIHBhcnNldGFiIG9uIGltcG9ydC4gCisKKzEwLzI1LzAxOiBiZWF6bGV5CisgICAgICAgICAgVGhlcmUgbWF5IGJlIGEgcG9zc2libGUgYnVnIGluIHRoZSBjeWNsZSBkZXRlY3RvciB0aGF0IHJlcG9ydHMgZXJyb3JzCisgICAgICAgICAgYWJvdXQgaW5maW5pdGUgcmVjdXJzaW9uLiAgIEknbSBoYXZpbmcgYSBsaXR0bGUgdHJvdWJsZSB0cmFja2luZyBpdAorICAgICAgICAgIGRvd24sIGJ1dCBpZiB5b3UgZ2V0IHRoaXMgcHJvYmxlbSwgeW91IGNhbiBkaXNhYmxlIHRoZSBjeWNsZQorICAgICAgICAgIGRldGVjdG9yIGFzIGZvbGxvd3M6CisKKyAgICAgICAgICAgICAgICAgeWFjYy55YWNjKGNoZWNrX3JlY3Vyc2lvbiA9IDApCisKKzEwLzI1LzAxOiBiZWF6bGV5CisgICAgICAgICAgRml4ZWQgYSBidWcgaW4gbGV4LnB5IHRoYXQgc29tZXRpbWVzIGNhdXNlZCBpbGxlZ2FsIGNoYXJhY3RlcnMgdG8gYmUKKyAgICAgICAgICByZXBvcnRlZCBpbmNvcnJlY3RseS4gIFJlcG9ydGVkIGJ5IFN2ZXJyZSBK+HJnZW5zZW4uCisKKzcvOC8wMSAgOiBiZWF6bGV5CisgICAgICAgICAgQWRkZWQgYSByZWZlcmVuY2UgdG8gdGhlIHVuZGVybHlpbmcgbGV4ZXIgb2JqZWN0IHdoZW4gdG9rZW5zIGFyZSBoYW5kbGVkIGJ5CisgICAgICAgICAgZnVuY3Rpb25zLiAgIFRoZSBsZXhlciBpcyBhdmFpbGFibGUgYXMgdGhlICdsZXhlcicgYXR0cmlidXRlLiAgIFRoaXMKKyAgICAgICAgICB3YXMgYWRkZWQgdG8gcHJvdmlkZSBiZXR0ZXIgbGV4aW5nIHN1cHBvcnQgZm9yIGxhbmd1YWdlcyBzdWNoIGFzIEZvcnRyYW4KKyAgICAgICAgICB3aGVyZSBjZXJ0YWluIHR5cGVzIG9mIHRva2VucyBjYW4ndCBiZSBjb252ZW5pZW50bHkgZXhwcmVzc2VkIGFzIHJlZ3VsYXIgCisgICAgICAgICAgZXhwcmVzc2lvbnMgKGFuZCB3aGVyZSB0aGUgdG9rZW5pemluZyBmdW5jdGlvbiBtYXkgd2FudCB0byBwZXJmb3JtIGEgCisgICAgICAgICAgbGl0dGxlIGJhY2t0cmFja2luZykuICBTdWdnZXN0ZWQgYnkgUGVhcnUgUGV0ZXJzb24uCisKKzYvMjAvMDEgOiBiZWF6bGV5CisgICAgICAgICAgTW9kaWZpZWQgeWFjYygpIGZ1bmN0aW9uIHNvIHRoYXQgYW4gb3B0aW9uYWwgc3RhcnRpbmcgc3ltYm9sIGNhbiBiZSBzcGVjaWZpZWQuCisgICAgICAgICAgRm9yIGV4YW1wbGU6CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgeWFjYy55YWNjKHN0YXJ0PSJzdGF0ZW1lbnQiKQorCisgICAgICAgICAgTm9ybWFsbHkgeWFjYyBhbHdheXMgdHJlYXRzIHRoZSBmaXJzdCBwcm9kdWN0aW9uIHJ1bGUgYXMgdGhlIHN0YXJ0aW5nIHN5bWJvbC4KKyAgICAgICAgICBIb3dldmVyLCBpZiB5b3UgYXJlIGRlYnVnZ2luZyB5b3VyIGdyYW1tYXIgaXQgbWF5IGJlIHVzZWZ1bCB0byBzcGVjaWZ5CisgICAgICAgICAgYW4gYWx0ZXJuYXRpdmUgc3RhcnRpbmcgc3ltYm9sLiAgSWRlYSBzdWdnZXN0ZWQgYnkgUmljaCBTYWx6LgorICAgICAgICAgICAgICAgICAgICAgIAorVmVyc2lvbiAxLjAgIEp1bmUgMTgsIDIwMDEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJbml0aWFsIHB1YmxpYyBvZmZlcmluZworCmRpZmYgLS1naXQgYS9wbHkvTUFOSUZFU1QuaW4gYi9wbHkvTUFOSUZFU1QuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQzNzQzMQotLS0gL2Rldi9udWxsCisrKyBiL3BseS9NQU5JRkVTVC5pbgpAQCAtMCwwICsxLDggQEAKK3JlY3Vyc2l2ZS1pbmNsdWRlIGV4YW1wbGUgKgorcmVjdXJzaXZlLWluY2x1ZGUgZG9jICoKK3JlY3Vyc2l2ZS1pbmNsdWRlIHRlc3QgKgoraW5jbHVkZSBBTk5PVU5DRQoraW5jbHVkZSBSRUFETUUubWQKK2luY2x1ZGUgQ0hBTkdFUworaW5jbHVkZSBUT0RPCitnbG9iYWwtZXhjbHVkZSAqLnB5YwpkaWZmIC0tZ2l0IGEvcGx5L1JFQURNRS5tZCBiL3BseS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQyOGYxYgotLS0gL2Rldi9udWxsCisrKyBiL3BseS9SRUFETUUubWQKQEAgLTAsMCArMSwyNzMgQEAKK1BMWSAoUHl0aG9uIExleC1ZYWNjKSAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDMuMTAKKworQ29weXJpZ2h0IChDKSAyMDAxLTIwMTcKK0RhdmlkIE0uIEJlYXpsZXkgKERhYmVheiBMTEMpCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKK21ldDoKKworKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuICAKKyogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCAKKyAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gIAorKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBEYXZpZCBCZWF6bGV5IG9yIERhYmVheiBMTEMgbWF5IGJlIHVzZWQgdG8KKyAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKK09XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworSW50cm9kdWN0aW9uCis9PT09PT09PT09PT0KKworUExZIGlzIGEgMTAwJSBQeXRob24gaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbW1vbiBwYXJzaW5nIHRvb2xzIGxleAorYW5kIHlhY2MuIEhlcmUgYXJlIGEgZmV3IGhpZ2hsaWdodHM6CisKKyAtICBQTFkgaXMgdmVyeSBjbG9zZWx5IG1vZGVsZWQgYWZ0ZXIgdHJhZGl0aW9uYWwgbGV4L3lhY2MuCisgICAgSWYgeW91IGtub3cgaG93IHRvIHVzZSB0aGVzZSB0b29scyBpbiBDLCB5b3Ugd2lsbCBmaW5kIFBMWQorICAgIHRvIGJlIHNpbWlsYXIuCisKKyAtICBQTFkgcHJvdmlkZXMgKnZlcnkqIGV4dGVuc2l2ZSBlcnJvciByZXBvcnRpbmcgYW5kIGRpYWdub3N0aWMgCisgICAgaW5mb3JtYXRpb24gdG8gYXNzaXN0IGluIHBhcnNlciBjb25zdHJ1Y3Rpb24uICBUaGUgb3JpZ2luYWwKKyAgICBpbXBsZW1lbnRhdGlvbiB3YXMgZGV2ZWxvcGVkIGZvciBpbnN0cnVjdGlvbmFsIHB1cnBvc2VzLiAgQXMKKyAgICBhIHJlc3VsdCwgdGhlIHN5c3RlbSB0cmllcyB0byBpZGVudGlmeSB0aGUgbW9zdCBjb21tb24gdHlwZXMKKyAgICBvZiBlcnJvcnMgbWFkZSBieSBub3ZpY2UgdXNlcnMuICAKKworIC0gIFBMWSBwcm92aWRlcyBmdWxsIHN1cHBvcnQgZm9yIGVtcHR5IHByb2R1Y3Rpb25zLCBlcnJvciByZWNvdmVyeSwKKyAgICBwcmVjZWRlbmNlIHNwZWNpZmllcnMsIGFuZCBtb2RlcmF0ZWx5IGFtYmlndW91cyBncmFtbWFycy4KKworIC0gIFBhcnNpbmcgaXMgYmFzZWQgb24gTFItcGFyc2luZyB3aGljaCBpcyBmYXN0LCBtZW1vcnkgZWZmaWNpZW50LCAKKyAgICBiZXR0ZXIgc3VpdGVkIHRvIGxhcmdlIGdyYW1tYXJzLCBhbmQgd2hpY2ggaGFzIGEgbnVtYmVyIG9mIG5pY2UKKyAgICBwcm9wZXJ0aWVzIHdoZW4gZGVhbGluZyB3aXRoIHN5bnRheCBlcnJvcnMgYW5kIG90aGVyIHBhcnNpbmcgcHJvYmxlbXMuCisgICAgQ3VycmVudGx5LCBQTFkgYnVpbGRzIGl0cyBwYXJzaW5nIHRhYmxlcyB1c2luZyB0aGUgTEFMUigxKQorICAgIGFsZ29yaXRobSB1c2VkIGluIHlhY2MuCisKKyAtICBQTFkgdXNlcyBQeXRob24gaW50cm9zcGVjdGlvbiBmZWF0dXJlcyB0byBidWlsZCBsZXhlcnMgYW5kIHBhcnNlcnMuICAKKyAgICBUaGlzIGdyZWF0bHkgc2ltcGxpZmllcyB0aGUgdGFzayBvZiBwYXJzZXIgY29uc3RydWN0aW9uIHNpbmNlIGl0IHJlZHVjZXMgCisgICAgdGhlIG51bWJlciBvZiBmaWxlcyBhbmQgZWxpbWluYXRlcyB0aGUgbmVlZCB0byBydW4gYSBzZXBhcmF0ZSBsZXgveWFjYyAKKyAgICB0b29sIGJlZm9yZSBydW5uaW5nIHlvdXIgcHJvZ3JhbS4KKworIC0gIFBMWSBjYW4gYmUgdXNlZCB0byBidWlsZCBwYXJzZXJzIGZvciAicmVhbCIgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLgorICAgIEFsdGhvdWdoIGl0IGlzIG5vdCB1bHRyYS1mYXN0IGR1ZSB0byBpdHMgUHl0aG9uIGltcGxlbWVudGF0aW9uLAorICAgIFBMWSBjYW4gYmUgdXNlZCB0byBwYXJzZSBncmFtbWFycyBjb25zaXN0aW5nIG9mIHNldmVyYWwgaHVuZHJlZAorICAgIHJ1bGVzIChhcyBtaWdodCBiZSBmb3VuZCBmb3IgYSBsYW5ndWFnZSBsaWtlIEMpLiAgVGhlIGxleGVyIGFuZCBMUiAKKyAgICBwYXJzZXIgYXJlIGFsc28gcmVhc29uYWJseSBlZmZpY2llbnQgd2hlbiBwYXJzaW5nIHR5cGljYWxseQorICAgIHNpemVkIHByb2dyYW1zLiAgUGVvcGxlIGhhdmUgdXNlZCBQTFkgdG8gYnVpbGQgcGFyc2VycyBmb3IKKyAgICBDLCBDKyssIEFEQSwgYW5kIG90aGVyIHJlYWwgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLgorCitIb3cgdG8gVXNlCis9PT09PT09PT09CisKK1BMWSBjb25zaXN0cyBvZiB0d28gZmlsZXMgOiBsZXgucHkgYW5kIHlhY2MucHkuICBUaGVzZSBhcmUgY29udGFpbmVkCit3aXRoaW4gdGhlICdwbHknIGRpcmVjdG9yeSB3aGljaCBtYXkgYWxzbyBiZSB1c2VkIGFzIGEgUHl0aG9uIHBhY2thZ2UuCitUbyB1c2UgUExZLCBzaW1wbHkgY29weSB0aGUgJ3BseScgZGlyZWN0b3J5IHRvIHlvdXIgcHJvamVjdCBhbmQgaW1wb3J0CitsZXggYW5kIHlhY2MgZnJvbSB0aGUgYXNzb2NpYXRlZCAncGx5JyBwYWNrYWdlLiAgRm9yIGV4YW1wbGU6CisKKyAgICAgaW1wb3J0IHBseS5sZXggYXMgbGV4CisgICAgIGltcG9ydCBwbHkueWFjYyBhcyB5YWNjCisKK0FsdGVybmF0aXZlbHksIHlvdSBjYW4gY29weSBqdXN0IHRoZSBmaWxlcyBsZXgucHkgYW5kIHlhY2MucHkKK2luZGl2aWR1YWxseSBhbmQgdXNlIHRoZW0gYXMgbW9kdWxlcy4gIEZvciBleGFtcGxlOgorCisgICAgIGltcG9ydCBsZXgKKyAgICAgaW1wb3J0IHlhY2MKKworVGhlIGZpbGUgc2V0dXAucHkgY2FuIGJlIHVzZWQgdG8gaW5zdGFsbCBwbHkgdXNpbmcgZGlzdHV0aWxzLgorCitUaGUgZmlsZSBkb2MvcGx5Lmh0bWwgY29udGFpbnMgY29tcGxldGUgZG9jdW1lbnRhdGlvbiBvbiBob3cgdG8gdXNlCit0aGUgc3lzdGVtLgorCitUaGUgZXhhbXBsZSBkaXJlY3RvcnkgY29udGFpbnMgc2V2ZXJhbCBkaWZmZXJlbnQgZXhhbXBsZXMgaW5jbHVkaW5nIGEKK1BMWSBzcGVjaWZpY2F0aW9uIGZvciBBTlNJIEMgYXMgZ2l2ZW4gaW4gSyZSIDJuZCBFZC4gICAKKworQSBzaW1wbGUgZXhhbXBsZSBpcyBmb3VuZCBhdCB0aGUgZW5kIG9mIHRoaXMgZG9jdW1lbnQKKworUmVxdWlyZW1lbnRzCis9PT09PT09PT09PT0KK1BMWSByZXF1aXJlcyB0aGUgdXNlIG9mIFB5dGhvbiAyLjYgb3IgZ3JlYXRlci4gIEhvd2V2ZXIsIHlvdSBzaG91bGQKK3VzZSB0aGUgbGF0ZXN0IFB5dGhvbiByZWxlYXNlIGlmIHBvc3NpYmxlLiAgSXQgc2hvdWxkIHdvcmsgb24ganVzdAorYWJvdXQgYW55IHBsYXRmb3JtLiAgUExZIGhhcyBiZWVuIHRlc3RlZCB3aXRoIGJvdGggQ1B5dGhvbiBhbmQgSnl0aG9uLgorSXQgYWxzbyBzZWVtcyB0byB3b3JrIHdpdGggSXJvblB5dGhvbi4KKworUmVzb3VyY2VzCis9PT09PT09PT0KK01vcmUgaW5mb3JtYXRpb24gYWJvdXQgUExZIGNhbiBiZSBvYnRhaW5lZCBvbiB0aGUgUExZIHdlYnBhZ2UgYXQ6CisKKyAgICAgaHR0cDovL3d3dy5kYWJlYXouY29tL3BseQorCitGb3IgYSBkZXRhaWxlZCBvdmVydmlldyBvZiBwYXJzaW5nIHRoZW9yeSwgY29uc3VsdCB0aGUgZXhjZWxsZW50Citib29rICJDb21waWxlcnMgOiBQcmluY2lwbGVzLCBUZWNobmlxdWVzLCBhbmQgVG9vbHMiIGJ5IEFobywgU2V0aGksIGFuZAorVWxsbWFuLiAgVGhlIHRvcGljcyBmb3VuZCBpbiAiTGV4ICYgWWFjYyIgYnkgTGV2aW5lLCBNYXNvbiwgYW5kIEJyb3duCittYXkgYWxzbyBiZSB1c2VmdWwuCisKK1RoZSBHaXRIdWIgcGFnZSBmb3IgUExZIGNhbiBiZSBmb3VuZCBhdDoKKworICAgICBodHRwczovL2dpdGh1Yi5jb20vZGFiZWF6L3BseQorCitBbiBvbGQgYW5kIHJlbGF0aXZlbHkgaW5hY3RpdmUgZGlzY3Vzc2lvbiBncm91cCBmb3IgUExZIGlzIGZvdW5kIGF0OgorCisgICAgIGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9wbHktaGFjaworCitBY2tub3dsZWRnbWVudHMKKz09PT09PT09PT09PT09PQorQSBzcGVjaWFsIHRoYW5rcyBpcyBpbiBvcmRlciBmb3IgYWxsIG9mIHRoZSBzdHVkZW50cyBpbiBDUzMyNiB3aG8KK3N1ZmZlcmVkIHRocm91Z2ggYWJvdXQgMjUgZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZXNlIHRvb2xzIDotKS4KKworVGhlIENIQU5HRVMgZmlsZSBhY2tub3dsZWRnZXMgdGhvc2Ugd2hvIGhhdmUgY29udHJpYnV0ZWQgcGF0Y2hlcy4KKworRWxpYXMgSW91cCBkaWQgdGhlIGZpcnN0IGltcGxlbWVudGF0aW9uIG9mIExBTFIoMSkgcGFyc2luZyBpbiBQTFktMS54LiAKK0FuZHJldyBXYXRlcnMgYW5kIE1hcmt1cyBTY2hvZXBmbGluIHdlcmUgaW5zdHJ1bWVudGFsIGluIHJlcG9ydGluZyBidWdzCithbmQgdGVzdGluZyBhIHJldmlzZWQgTEFMUigxKSBpbXBsZW1lbnRhdGlvbiBmb3IgUExZLTIuMC4KKworU3BlY2lhbCBOb3RlIGZvciBQTFktMy4wCis9PT09PT09PT09PT09PT09PT09PT09PT0KK1BMWS0zLjAgdGhlIGZpcnN0IFBMWSByZWxlYXNlIHRvIHN1cHBvcnQgUHl0aG9uIDMuIEhvd2V2ZXIsIGJhY2t3YXJkcworY29tcGF0aWJpbGl0eSB3aXRoIFB5dGhvbiAyLjYgaXMgc3RpbGwgcHJlc2VydmVkLiBQTFkgcHJvdmlkZXMgZHVhbAorUHl0aG9uIDIvMyBjb21wYXRpYmlsaXR5IGJ5IHJlc3RyaWN0aW5nIGl0cyBpbXBsZW1lbnRhdGlvbiB0byBhIGNvbW1vbgorc3Vic2V0IG9mIGJhc2ljIGxhbmd1YWdlIGZlYXR1cmVzLiBZb3Ugc2hvdWxkIG5vdCBjb252ZXJ0IFBMWSB1c2luZworMnRvMy0taXQgaXMgbm90IG5lY2Vzc2FyeSBhbmQgbWF5IGluIGZhY3QgYnJlYWsgdGhlIGltcGxlbWVudGF0aW9uLgorCitFeGFtcGxlCis9PT09PT09CisKK0hlcmUgaXMgYSBzaW1wbGUgZXhhbXBsZSBzaG93aW5nIGEgUExZIGltcGxlbWVudGF0aW9uIG9mIGEgY2FsY3VsYXRvcgord2l0aCB2YXJpYWJsZXMuCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBjYWxjLnB5CisgICAgIworICAgICMgQSBzaW1wbGUgY2FsY3VsYXRvciB3aXRoIHZhcmlhYmxlcy4KKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICB0b2tlbnMgPSAoCisgICAgICAgICdOQU1FJywnTlVNQkVSJywKKyAgICAgICAgJ1BMVVMnLCdNSU5VUycsJ1RJTUVTJywnRElWSURFJywnRVFVQUxTJywKKyAgICAgICAgJ0xQQVJFTicsJ1JQQVJFTicsCisgICAgICAgICkKKworICAgICMgVG9rZW5zCisKKyAgICB0X1BMVVMgICAgPSByJ1wrJworICAgIHRfTUlOVVMgICA9IHInLScKKyAgICB0X1RJTUVTICAgPSByJ1wqJworICAgIHRfRElWSURFICA9IHInLycKKyAgICB0X0VRVUFMUyAgPSByJz0nCisgICAgdF9MUEFSRU4gID0gcidcKCcKKyAgICB0X1JQQVJFTiAgPSByJ1wpJworICAgIHRfTkFNRSAgICA9IHInW2EtekEtWl9dW2EtekEtWjAtOV9dKicKKworICAgIGRlZiB0X05VTUJFUih0KToKKyAgICAgICAgcidcZCsnCisgICAgICAgIHQudmFsdWUgPSBpbnQodC52YWx1ZSkKKyAgICAgICAgcmV0dXJuIHQKKworICAgICMgSWdub3JlZCBjaGFyYWN0ZXJzCisgICAgdF9pZ25vcmUgPSAiIFx0IgorCisgICAgZGVmIHRfbmV3bGluZSh0KToKKyAgICAgICAgcidcbisnCisgICAgICAgIHQubGV4ZXIubGluZW5vICs9IHQudmFsdWUuY291bnQoIlxuIikKKworICAgIGRlZiB0X2Vycm9yKHQpOgorICAgICAgICBwcmludCgiSWxsZWdhbCBjaGFyYWN0ZXIgJyVzJyIgJSB0LnZhbHVlWzBdKQorICAgICAgICB0LmxleGVyLnNraXAoMSkKKworICAgICMgQnVpbGQgdGhlIGxleGVyCisgICAgaW1wb3J0IHBseS5sZXggYXMgbGV4CisgICAgbGV4LmxleCgpCisKKyAgICAjIFByZWNlZGVuY2UgcnVsZXMgZm9yIHRoZSBhcml0aG1ldGljIG9wZXJhdG9ycworICAgIHByZWNlZGVuY2UgPSAoCisgICAgICAgICgnbGVmdCcsJ1BMVVMnLCdNSU5VUycpLAorICAgICAgICAoJ2xlZnQnLCdUSU1FUycsJ0RJVklERScpLAorICAgICAgICAoJ3JpZ2h0JywnVU1JTlVTJyksCisgICAgICAgICkKKworICAgICMgZGljdGlvbmFyeSBvZiBuYW1lcyAoZm9yIHN0b3JpbmcgdmFyaWFibGVzKQorICAgIG5hbWVzID0geyB9CisKKyAgICBkZWYgcF9zdGF0ZW1lbnRfYXNzaWduKHApOgorICAgICAgICAnc3RhdGVtZW50IDogTkFNRSBFUVVBTFMgZXhwcmVzc2lvbicKKyAgICAgICAgbmFtZXNbcFsxXV0gPSBwWzNdCisKKyAgICBkZWYgcF9zdGF0ZW1lbnRfZXhwcihwKToKKyAgICAgICAgJ3N0YXRlbWVudCA6IGV4cHJlc3Npb24nCisgICAgICAgIHByaW50KHBbMV0pCisKKyAgICBkZWYgcF9leHByZXNzaW9uX2Jpbm9wKHApOgorICAgICAgICAnJydleHByZXNzaW9uIDogZXhwcmVzc2lvbiBQTFVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gTUlOVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBUSU1FUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIERJVklERSBleHByZXNzaW9uJycnCisgICAgICAgIGlmIHBbMl0gPT0gJysnICA6IHBbMF0gPSBwWzFdICsgcFszXQorICAgICAgICBlbGlmIHBbMl0gPT0gJy0nOiBwWzBdID0gcFsxXSAtIHBbM10KKyAgICAgICAgZWxpZiBwWzJdID09ICcqJzogcFswXSA9IHBbMV0gKiBwWzNdCisgICAgICAgIGVsaWYgcFsyXSA9PSAnLyc6IHBbMF0gPSBwWzFdIC8gcFszXQorCisgICAgZGVmIHBfZXhwcmVzc2lvbl91bWludXMocCk6CisgICAgICAgICdleHByZXNzaW9uIDogTUlOVVMgZXhwcmVzc2lvbiAlcHJlYyBVTUlOVVMnCisgICAgICAgIHBbMF0gPSAtcFsyXQorCisgICAgZGVmIHBfZXhwcmVzc2lvbl9ncm91cChwKToKKyAgICAgICAgJ2V4cHJlc3Npb24gOiBMUEFSRU4gZXhwcmVzc2lvbiBSUEFSRU4nCisgICAgICAgIHBbMF0gPSBwWzJdCisKKyAgICBkZWYgcF9leHByZXNzaW9uX251bWJlcihwKToKKyAgICAgICAgJ2V4cHJlc3Npb24gOiBOVU1CRVInCisgICAgICAgIHBbMF0gPSBwWzFdCisKKyAgICBkZWYgcF9leHByZXNzaW9uX25hbWUocCk6CisgICAgICAgICdleHByZXNzaW9uIDogTkFNRScKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcFswXSA9IG5hbWVzW3BbMV1dCisgICAgICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICAgICAgICAgIHByaW50KCJVbmRlZmluZWQgbmFtZSAnJXMnIiAlIHBbMV0pCisgICAgICAgICAgICBwWzBdID0gMAorCisgICAgZGVmIHBfZXJyb3IocCk6CisgICAgICAgIHByaW50KCJTeW50YXggZXJyb3IgYXQgJyVzJyIgJSBwLnZhbHVlKQorCisgICAgaW1wb3J0IHBseS55YWNjIGFzIHlhY2MKKyAgICB5YWNjLnlhY2MoKQorCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcyA9IHJhd19pbnB1dCgnY2FsYyA+ICcpICAgIyB1c2UgaW5wdXQoKSBvbiBQeXRob24gMworICAgICAgICBleGNlcHQgRU9GRXJyb3I6CisgICAgICAgICAgICBicmVhaworICAgICAgICB5YWNjLnBhcnNlKHMpCisKKworQnVnIFJlcG9ydHMgYW5kIFBhdGNoZXMKKz09PT09PT09PT09PT09PT09PT09PT09CitNeSBnb2FsIHdpdGggUExZIGlzIHRvIHNpbXBseSBoYXZlIGEgZGVjZW50IGxleC95YWNjIGltcGxlbWVudGF0aW9uCitmb3IgUHl0aG9uLiAgQXMgYSBnZW5lcmFsIHJ1bGUsIEkgZG9uJ3Qgc3BlbmQgaHVnZSBhbW91bnRzIG9mIHRpbWUKK3dvcmtpbmcgb24gaXQgdW5sZXNzIEkgcmVjZWl2ZSB2ZXJ5IHNwZWNpZmljIGJ1ZyByZXBvcnRzIGFuZC9vcgorcGF0Y2hlcyB0byBmaXggcHJvYmxlbXMuIEkgYWxzbyB0cnkgdG8gaW5jb3Jwb3JhdGUgc3VibWl0dGVkIGZlYXR1cmUKK3JlcXVlc3RzIGFuZCBlbmhhbmNlbWVudHMgaW50byBlYWNoIG5ldyB2ZXJzaW9uLiAgUGxlYXNlIHZpc2l0IHRoZSBQTFkKK2dpdGh1YiBwYWdlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9kYWJlYXovcGx5IHRvIHN1Ym1pdCBpc3N1ZXMgYW5kIHB1bGwKK3JlcXVlc3RzLiAgVG8gY29udGFjdCBtZSBhYm91dCBidWdzIGFuZC9vciBuZXcgZmVhdHVyZXMsIHBsZWFzZSBzZW5kCitlbWFpbCB0byBkYXZlQGRhYmVhei5jb20uCisgCistLSBEYXZlCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9wbHkvVE9ETyBiL3BseS9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ODAwYWEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvVE9ETwpAQCAtMCwwICsxLDE2IEBACitUaGUgUExZIHRvLWRvIGxpc3Q6CisKKzEuIEZpbmlzaCB3cml0aW5nIHRoZSBDIFByZXByb2Nlc3NvciBtb2R1bGUuICBTdGFydGVkIGluIHRoZQorICAgZmlsZSBwbHkvY3BwLnB5CisKKzIuIENyZWF0ZSBhbmQgZG9jdW1lbnQgbGlicmFyaWVzIG9mIHVzZWZ1bCB0b2tlbnMuCisKKzMuIEV4cGFuZCB0aGUgZXhhbXBsZXMveXBseSB0b29sIHRoYXQgcGFyc2VzIGJpc29uL3lhY2MKKyAgIGZpbGVzLgorCis0LiBUaGluayBvZiB2YXJpb3VzIGRpYWJvbGljYWwgdGhpbmdzIHRvIGRvIHdpdGggdGhlCisgICBuZXcgeWFjYyBpbnRlcm5hbHMuICBGb3IgZXhhbXBsZSwgaXQgaXMgbm93IHBvc3NpYmxlCisgICB0byBzcGVjaWZ5IGdyYW1tcnMgdXNpbmcgY29tcGxldGVseSBkaWZmZXJlbnQgc2NoZW1lcworICAgdGhhbiB0aGUgcmVmbGVjdGlvbiBhcHByb2FjaCB1c2VkIGJ5IFBMWS4KKworCmRpZmYgLS1naXQgYS9wbHkvZG9jL2ludGVybmFsLmh0bWwgYi9wbHkvZG9jL2ludGVybmFsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczYmM0MwotLS0gL2Rldi9udWxsCisrKyBiL3BseS9kb2MvaW50ZXJuYWwuaHRtbApAQCAtMCwwICsxLDg3NCBAQAorPGh0bWw+Cis8aGVhZD4KKzx0aXRsZT5QTFkgSW50ZXJuYWxzPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5IGJnY29sb3I9IiNmZmZmZmYiPgorCis8aDE+UExZIEludGVybmFsczwvaDE+CisgCis8Yj4KK0RhdmlkIE0uIEJlYXpsZXkgPGJyPgorZGF2ZUBkYWJlYXouY29tPGJyPgorPC9iPgorCis8cD4KKzxiPlBMWSBWZXJzaW9uOiAzLjEwPC9iPgorPHA+CisKKzwhLS0gSU5ERVggLS0+Cis8ZGl2IGNsYXNzPSJzZWN0aW9udG9jIj4KKzx1bD4KKzxsaT48YSBocmVmPSIjaW50ZXJuYWxfbm4xIj5JbnRyb2R1Y3Rpb248L2E+Cis8bGk+PGEgaHJlZj0iI2ludGVybmFsX25uMiI+R3JhbW1hciBDbGFzczwvYT4KKzxsaT48YSBocmVmPSIjaW50ZXJuYWxfbm4zIj5Qcm9kdWN0aW9uczwvYT4KKzxsaT48YSBocmVmPSIjaW50ZXJuYWxfbm40Ij5MUkl0ZW1zPC9hPgorPGxpPjxhIGhyZWY9IiNpbnRlcm5hbF9ubjUiPkxSVGFibGU8L2E+Cis8bGk+PGEgaHJlZj0iI2ludGVybmFsX25uNiI+TFJHZW5lcmF0ZWRUYWJsZTwvYT4KKzxsaT48YSBocmVmPSIjaW50ZXJuYWxfbm43Ij5MUlBhcnNlcjwvYT4KKzxsaT48YSBocmVmPSIjaW50ZXJuYWxfbm44Ij5QYXJzZXJSZWZsZWN0PC9hPgorPGxpPjxhIGhyZWY9IiNpbnRlcm5hbF9ubjkiPkhpZ2gtbGV2ZWwgb3BlcmF0aW9uPC9hPgorPC91bD4KKzwvZGl2PgorPCEtLSBJTkRFWCAtLT4KKworCis8SDI+PGEgbmFtZT0iaW50ZXJuYWxfbm4xIj48L2E+MS4gSW50cm9kdWN0aW9uPC9IMj4KKworCitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBjbGFzc2VzIGFuZCBmdW5jdGlvbnMgdGhhdCBtYWtlIHVwIHRoZSBpbnRlcm5hbAorb3BlcmF0aW9uIG9mIFBMWS4gIFVzaW5nIHRoaXMgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlLCBpdCBpcyBwb3NzaWJsZSB0bworbWFudWFsbHkgYnVpbGQgYW4gcGFyc2VyIHVzaW5nIGEgZGlmZmVyZW50IGludGVyZmFjZSBzcGVjaWZpY2F0aW9uCit0aGFuIHdoYXQgUExZIG5vcm1hbGx5IHVzZXMuICBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIGJ1aWxkIGEgZ3JhbWFyCitmcm9tIGluZm9ybWF0aW9uIHBhcnNlZCBpbiBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IGlucHV0IGZvcm1hdC4gIFNvbWUgb2YKK3RoZXNlIG9iamVjdHMgbWF5IGJlIHVzZWZ1bCBmb3IgYnVpbGRpbmcgbW9yZSBhZHZhbmNlZCBwYXJzaW5nIGVuZ2luZXMKK3N1Y2ggYXMgR0xSLgorCis8cD4KK0l0IHNob3VsZCBiZSBzdHJlc3NlZCB0aGF0IHVzaW5nIFBMWSBhdCB0aGlzIGxldmVsIGlzIG5vdCBmb3IgdGhlCitmYWludCBvZiBoZWFydC4gIEdlbmVyYWxseSwgaXQncyBhc3N1bWVkIHRoYXQgeW91IGtub3cgYSBiaXQgb2YKK3RoZSB1bmRlcmx5aW5nIGNvbXBpbGVyIHRoZW9yeSBhbmQgaG93IGFuIExSIHBhcnNlciBpcyBwdXQgdG9nZXRoZXIuCisKKzxIMj48YSBuYW1lPSJpbnRlcm5hbF9ubjIiPjwvYT4yLiBHcmFtbWFyIENsYXNzPC9IMj4KKworCitUaGUgZmlsZSA8dHQ+cGx5LnlhY2M8L3R0PiBkZWZpbmVzIGEgY2xhc3MgPHR0PkdyYW1tYXI8L3R0PiB0aGF0IAoraXMgdXNlZCB0byBob2xkIGFuZCBtYW5pcHVsYXRlIGluZm9ybWF0aW9uIGFib3V0IGEgZ3JhbW1hcgorc3BlY2lmaWNhdGlvbi4gICBJdCBlbmNhcHN1bGF0ZXMgdGhlIHNhbWUgYmFzaWMgaW5mb3JtYXRpb24KK2Fib3V0IGEgZ3JhbW1hciB0aGF0IGlzIHB1dCBpbnRvIGEgWUFDQyBmaWxlIGluY2x1ZGluZyAKK3RoZSBsaXN0IG9mIHRva2VucywgcHJlY2VkZW5jZSBydWxlcywgYW5kIGdyYW1tYXIgcnVsZXMuIAorVmFyaW91cyBvcGVyYXRpb25zIGFyZSBwcm92aWRlZCB0byBwZXJmb3JtIGRpZmZlcmVudCB2YWxpZGF0aW9ucworb24gdGhlIGdyYW1tYXIuICBJbiBhZGRpdGlvbiwgdGhlcmUgYXJlIG9wZXJhdGlvbnMgdG8gY29tcHV0ZQordGhlIGZpcnN0IGFuZCBmb2xsb3cgc2V0cyB0aGF0IGFyZSBuZWVkZWQgYnkgdGhlIHZhcmlvdXMgdGFibGUKK2dlbmVyYXRpb24gYWxnb3JpdGhtcy4KKworPHA+Cis8dHQ+PGI+R3JhbW1hcih0ZXJtaW5hbHMpPC9iPjwvdHQ+CisKKzxibG9ja3F1b3RlPgorQ3JlYXRlcyBhIG5ldyBncmFtbWFyIG9iamVjdC4gIDx0dD50ZXJtaW5hbHM8L3R0PiBpcyBhIGxpc3Qgb2Ygc3RyaW5ncworc3BlY2lmeWluZyB0aGUgdGVybWluYWxzIGZvciB0aGUgZ3JhbW1hci4gIEFuIGluc3RhbmNlIDx0dD5nPC90dD4gb2YKKzx0dD5HcmFtbWFyPC90dD4gaGFzIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKzwvYmxvY2txdW90ZT4KKworPHA+Cis8Yj48dHQ+Zy5zZXRfcHJlY2VkZW5jZSh0ZXJtLGFzc29jLGxldmVsKTwvdHQ+PC9iPgorPGJsb2NrcXVvdGU+CitTZXRzIHRoZSBwcmVjZWRlbmNlIGxldmVsIGFuZCBhc3NvY2lhdGl2aXR5IGZvciBhIGdpdmVuIHRlcm1pbmFsIDx0dD50ZXJtPC90dD4uICAKKzx0dD5hc3NvYzwvdHQ+IGlzIG9uZSBvZiA8dHQ+J3JpZ2h0JzwvdHQ+LAorPHR0PidsZWZ0JzwvdHQ+LCBvciA8dHQ+J25vbmFzc29jJzwvdHQ+IGFuZCA8dHQ+bGV2ZWw8L3R0PiBpcyBhIHBvc2l0aXZlIGludGVnZXIuICBUaGUgaGlnaGVyCit0aGUgdmFsdWUgb2YgPHR0PmxldmVsPC90dD4sIHRoZSBoaWdoZXIgdGhlIHByZWNlZGVuY2UuICBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgdHlwaWNhbAorcHJlY2VkZW5jZSBzZXR0aW5nczoKKworPHByZT4KK2cuc2V0X3ByZWNlZGVuY2UoJ1BMVVMnLCAgJ2xlZnQnLDEpCitnLnNldF9wcmVjZWRlbmNlKCdNSU5VUycsICdsZWZ0JywxKQorZy5zZXRfcHJlY2VkZW5jZSgnVElNRVMnLCAnbGVmdCcsMikKK2cuc2V0X3ByZWNlZGVuY2UoJ0RJVklERScsJ2xlZnQnLDIpCitnLnNldF9wcmVjZWRlbmNlKCdVTUlOVVMnLCdsZWZ0JywzKQorPC9wcmU+CisKK1RoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIHByaW9yIHRvIGFkZGluZyBhbnkgcHJvZHVjdGlvbnMgdG8gdGhlCitncmFtbWFyIHdpdGggPHR0PmcuYWRkX3Byb2R1Y3Rpb24oKTwvdHQ+LiAgVGhlIHByZWNlZGVuY2Ugb2YgaW5kaXZpZHVhbCBncmFtbWFyCitydWxlcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBwcmVjZWRlbmNlIG9mIHRoZSByaWdodC1tb3N0IHRlcm1pbmFsLgorCis8L2Jsb2NrcXVvdGU+Cis8cD4KKzxiPjx0dD5nLmFkZF9wcm9kdWN0aW9uKG5hbWUsc3ltcyxmdW5jPU5vbmUsZmlsZT0nJyxsaW5lPTApPC90dD48L2I+Cis8YmxvY2txdW90ZT4KK0FkZHMgYSBuZXcgZ3JhbW1hciBydWxlLiAgPHR0Pm5hbWU8L3R0PiBpcyB0aGUgbmFtZSBvZiB0aGUgcnVsZSwKKzx0dD5zeW1zPC90dD4gaXMgYSBsaXN0IG9mIHN5bWJvbHMgbWFraW5nIHVwIHRoZSByaWdodCBoYW5kCitzaWRlIG9mIHRoZSBydWxlLCA8dHQ+ZnVuYzwvdHQ+IGlzIHRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4KK3JlZHVjaW5nIHRoZSBydWxlLiAgIDx0dD5maWxlPC90dD4gYW5kIDx0dD5saW5lPC90dD4gc3BlY2lmeQordGhlIGZpbGVuYW1lIGFuZCBsaW5lIG51bWJlciBvZiB0aGUgcnVsZSBhbmQgYXJlIHVzZWQgZm9yCitnZW5lcmF0aW5nIGVycm9yIG1lc3NhZ2VzLiAgICAKKworPHA+CitUaGUgbGlzdCBvZiBzeW1ib2xzIGluIDx0dD5zeW1zPC90dD4gbWF5IGluY2x1ZGUgY2hhcmFjdGVyCitsaXRlcmFscyBhbmQgPHR0PiVwcmVjPC90dD4gc3BlY2lmaWVycy4gIEhlcmUgYXJlIHNvbWUKK2V4YW1wbGVzOgorCis8cHJlPgorZy5hZGRfcHJvZHVjdGlvbignZXhwcicsWydleHByJywnUExVUycsJ3Rlcm0nXSxmdW5jLGZpbGUsbGluZSkKK2cuYWRkX3Byb2R1Y3Rpb24oJ2V4cHInLFsnZXhwcicsJyIrIicsJ3Rlcm0nXSxmdW5jLGZpbGUsbGluZSkKK2cuYWRkX3Byb2R1Y3Rpb24oJ2V4cHInLFsnTUlOVVMnLCdleHByJywnJXByZWMnLCdVTUlOVVMnXSxmdW5jLGZpbGUsbGluZSkKKzwvcHJlPgorCis8cD4KK0lmIGFueSBraW5kIG9mIGVycm9yIGlzIGRldGVjdGVkLCBhIDx0dD5HcmFtbWFyRXJyb3I8L3R0PiBleGNlcHRpb24KK2lzIHJhaXNlZCB3aXRoIGEgbWVzc2FnZSBpbmRpY2F0aW5nIHRoZSByZWFzb24gZm9yIHRoZSBmYWlsdXJlLgorPC9ibG9ja3F1b3RlPgorCis8cD4KKzxiPjx0dD5nLnNldF9zdGFydChzdGFydD1Ob25lKTwvdHQ+PC9iPgorPGJsb2NrcXVvdGU+CitTZXRzIHRoZSBzdGFydGluZyBydWxlIGZvciB0aGUgZ3JhbW1hci4gIDx0dD5zdGFydDwvdHQ+IGlzIGEgc3RyaW5nCitzcGVjaWZ5aW5nIHRoZSBuYW1lIG9mIHRoZSBzdGFydCBydWxlLiAgIElmIDx0dD5zdGFydDwvdHQ+IGlzIG9taXR0ZWQsCit0aGUgZmlyc3QgZ3JhbW1hciBydWxlIGFkZGVkIHdpdGggPHR0PmFkZF9wcm9kdWN0aW9uKCk8L3R0PiBpcyB0YWtlbiB0byBiZQordGhlIHN0YXJ0aW5nIHJ1bGUuICBUaGlzIG1ldGhvZCBtdXN0IGFsd2F5cyBiZSBjYWxsZWQgYWZ0ZXIgYWxsCitwcm9kdWN0aW9ucyBoYXZlIGJlZW4gYWRkZWQuCis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGI+PHR0PmcuZmluZF91bnJlYWNoYWJsZSgpPC90dD48L2I+Cis8YmxvY2txdW90ZT4KK0RpYWdub3N0aWMgZnVuY3Rpb24uICBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdW5yZWFjaGFibGUgbm9uLXRlcm1pbmFscworZGVmaW5lZCBpbiB0aGUgZ3JhbW1hci4gIFRoaXMgaXMgdXNlZCB0byBpZGVudGlmeSBpbmFjdGl2ZSBwYXJ0cyBvZgordGhlIGdyYW1tYXIgc3BlY2lmaWNhdGlvbi4KKzwvYmxvY2txdW90ZT4KKworPHA+Cis8Yj48dHQ+Zy5pbmZpbml0ZV9jeWNsZSgpPC90dD48L2I+Cis8YmxvY2txdW90ZT4KK0RpYWdub3N0aWMgZnVuY3Rpb24uICBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgbm9uLXRlcm1pbmFscyBpbiB0aGUKK2dyYW1tYXIgdGhhdCByZXN1bHQgaW4gYW4gaW5maW5pdGUgY3ljbGUuICBUaGlzIGNvbmRpdGlvbiBvY2N1cnMgaWYKK3RoZXJlIGlzIG5vIHdheSBmb3IgYSBncmFtbWFyIHJ1bGUgdG8gZXhwYW5kIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcKK29ubHkgdGVybWluYWwgc3ltYm9scy4KKzwvYmxvY2txdW90ZT4KKworPHA+Cis8Yj48dHQ+Zy51bmRlZmluZWRfc3ltYm9scygpPC90dD48L2I+Cis8YmxvY2txdW90ZT4KK0RpYWdub3N0aWMgZnVuY3Rpb24uICBSZXR1cm5zIGEgbGlzdCBvZiB0dXBsZXMgPHR0PihuYW1lLCBwcm9kKTwvdHQ+Citjb3JyZXNwb25kaW5nIHRvIHVuZGVmaW5lZCBzeW1ib2xzIGluIHRoZSBncmFtbWFyLiA8dHQ+bmFtZTwvdHQ+IGlzIHRoZQorbmFtZSBvZiB0aGUgdW5kZWZpbmVkIHN5bWJvbCBhbmQgPHR0PnByb2Q8L3R0PiBpcyBhbiBpbnN0YW5jZSBvZiAKKzx0dD5Qcm9kdWN0aW9uPC90dD4gd2hpY2ggaGFzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9kdWN0aW9uIHJ1bGUKK3doZXJlIHRoZSB1bmRlZmluZWQgc3ltYm9sIHdhcyB1c2VkLgorPC9ibG9ja3F1b3RlPgorCis8cD4KKzxiPjx0dD5nLnVudXNlZF90ZXJtaW5hbHMoKTwvdHQ+PC9iPgorPGJsb2NrcXVvdGU+CitEaWFnbm9zdGljIGZ1bmN0aW9uLiAgUmV0dXJucyBhIGxpc3Qgb2YgdGVybWluYWxzIHRoYXQgd2VyZSBkZWZpbmVkLAorYnV0IG5ldmVyIHVzZWQgaW4gdGhlIGdyYW1tYXIuCis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGI+PHR0PmcudW51c2VkX3J1bGVzKCk8L3R0PjwvYj4KKzxibG9ja3F1b3RlPgorRGlhZ25vc3RpYyBmdW5jdGlvbi4gIFJldHVybnMgYSBsaXN0IG9mIDx0dD5Qcm9kdWN0aW9uPC90dD4gaW5zdGFuY2VzCitjb3JyZXNwb25kaW5nIHRvIHByb2R1Y3Rpb24gcnVsZXMgdGhhdCB3ZXJlIGRlZmluZWQgaW4gdGhlIGdyYW1tYXIsCitidXQgbmV2ZXIgdXNlZCBhbnl3aGVyZS4gIFRoaXMgaXMgc2xpZ2h0bHkgZGlmZmVyZW50Cit0aGFuIDx0dD5maW5kX3VucmVhY2hhYmxlKCk8L3R0Pi4KKzwvYmxvY2txdW90ZT4KKworPHA+Cis8Yj48dHQ+Zy51bnVzZWRfcHJlY2VkZW5jZSgpPC90dD48L2I+Cis8YmxvY2txdW90ZT4KK0RpYWdub3N0aWMgZnVuY3Rpb24uICBSZXR1cm5zIGEgbGlzdCBvZiB0dXBsZXMgPHR0Pih0ZXJtLCBhc3NvYyk8L3R0PiAKK2NvcnJlc3BvbmRpbmcgdG8gcHJlY2VkZW5jZSBydWxlcyB0aGF0IHdlcmUgc2V0LCBidXQgbmV2ZXIgdXNlZCB0aGUKK2dyYW1tYXIuICA8dHQ+dGVybTwvdHQ+IGlzIHRoZSB0ZXJtaW5hbCBuYW1lIGFuZCA8dHQ+YXNzb2M8L3R0PiBpcyB0aGUKK3ByZWNlZGVuY2UgYXNzb2NpYXRpdml0eSAoZS5nLiwgPHR0PidsZWZ0JzwvdHQ+LCA8dHQ+J3JpZ2h0JzwvdHQ+LCAKK29yIDx0dD4nbm9uYXNzb2MnPC90dD4uCis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGI+PHR0PmcuY29tcHV0ZV9maXJzdCgpPC90dD48L2I+Cis8YmxvY2txdW90ZT4KK0NvbXB1dGUgYWxsIG9mIHRoZSBmaXJzdCBzZXRzIGZvciBhbGwgc3ltYm9scyBpbiB0aGUgZ3JhbW1hci4gIFJldHVybnMgYSBkaWN0aW9uYXJ5CittYXBwaW5nIHN5bWJvbCBuYW1lcyB0byBhIGxpc3Qgb2YgYWxsIGZpcnN0IHN5bWJvbHMuCis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGI+PHR0PmcuY29tcHV0ZV9mb2xsb3coKTwvdHQ+PC9iPgorPGJsb2NrcXVvdGU+CitDb21wdXRlIGFsbCBvZiB0aGUgZm9sbG93IHNldHMgZm9yIGFsbCBub24tdGVybWluYWxzIGluIHRoZSBncmFtbWFyLgorVGhlIGZvbGxvdyBzZXQgaXMgdGhlIHNldCBvZiBhbGwgcG9zc2libGUgc3ltYm9scyB0aGF0IG1pZ2h0IGZvbGxvdyBhCitnaXZlbiBub24tdGVybWluYWwuICBSZXR1cm5zIGEgZGljdGlvbmFyeSBtYXBwaW5nIG5vbi10ZXJtaW5hbCBuYW1lcwordG8gYSBsaXN0IG9mIHN5bWJvbHMuCis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGI+PHR0PmcuYnVpbGRfbHJpdGVtcygpPC90dD48L2I+Cis8YmxvY2txdW90ZT4KK0NhbGN1bGF0ZXMgYWxsIG9mIHRoZSBMUiBpdGVtcyBmb3IgYWxsIHByb2R1Y3Rpb25zIGluIHRoZSBncmFtbWFyLiAgVGhpcworc3RlcCBpcyByZXF1aXJlZCBiZWZvcmUgdXNpbmcgdGhlIGdyYW1tYXIgZm9yIGFueSBraW5kIG9mIHRhYmxlIGdlbmVyYXRpb24uCitTZWUgdGhlIHNlY3Rpb24gb24gTFIgaXRlbXMgYmVsb3cuCis8L2Jsb2NrcXVvdGU+CisKKzxwPgorVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBzZXQgYnkgdGhlIGFib3ZlIG1ldGhvZHMgYW5kIG1heSBiZSB1c2VmdWwKK2luIGNvZGUgdGhhdCB3b3JrcyB3aXRoIHRoZSBncmFtbWFyLiAgQWxsIG9mIHRoZXNlIGF0dHJpYnV0ZXMgc2hvdWxkIGJlCithc3N1bWVkIHRvIGJlIHJlYWQtb25seS4gIENoYW5naW5nIHRoZWlyIHZhbHVlcyBkaXJlY3RseSB3aWxsIGxpa2VseSAKK2JyZWFrIHRoZSBncmFtbWFyLgorCis8cD4KKzxiPjx0dD5nLlByb2R1Y3Rpb25zPC90dD48L2I+Cis8YmxvY2txdW90ZT4KK0EgbGlzdCBvZiBhbGwgcHJvZHVjdGlvbnMgYWRkZWQuICBUaGUgZmlyc3QgZW50cnkgaXMgcmVzZXJ2ZWQgZm9yCithIHByb2R1Y3Rpb24gcmVwcmVzZW50aW5nIHRoZSBzdGFydGluZyBydWxlLiAgVGhlIG9iamVjdHMgaW4gdGhpcyBsaXN0CithcmUgaW5zdGFuY2VzIG9mIHRoZSA8dHQ+UHJvZHVjdGlvbjwvdHQ+IGNsYXNzLCBkZXNjcmliZWQgc2hvcnRseS4KKzwvYmxvY2txdW90ZT4KKworPHA+Cis8Yj48dHQ+Zy5Qcm9kbmFtZXM8L3R0PjwvYj4KKzxibG9ja3F1b3RlPgorQSBkaWN0aW9uYXJ5IG1hcHBpbmcgdGhlIG5hbWVzIG9mIG5vbnRlcm1pbmFscyB0byBhIGxpc3Qgb2YgYWxsCitwcm9kdWN0aW9ucyBvZiB0aGF0IG5vbnRlcm1pbmFsLgorPC9ibG9ja3F1b3RlPgorCis8cD4KKzxiPjx0dD5nLlRlcm1pbmFsczwvdHQ+PC9iPgorPGJsb2NrcXVvdGU+CitBIGRpY3Rpb25hcnkgbWFwcGluZyB0aGUgbmFtZXMgb2YgdGVybWluYWxzIHRvIGEgbGlzdCBvZiB0aGUKK3Byb2R1Y3Rpb24gbnVtYmVycyB3aGVyZSB0aGV5IGFyZSB1c2VkLgorPC9ibG9ja3F1b3RlPgorCis8cD4KKzxiPjx0dD5nLk5vbnRlcm1pbmFsczwvdHQ+PC9iPgorPGJsb2NrcXVvdGU+CitBIGRpY3Rpb25hcnkgbWFwcGluZyB0aGUgbmFtZXMgb2Ygbm9udGVybWluYWxzIHRvIGEgbGlzdCBvZiB0aGUKK3Byb2R1Y3Rpb24gbnVtYmVycyB3aGVyZSB0aGV5IGFyZSB1c2VkLgorPC9ibG9ja3F1b3RlPgorCis8cD4KKzxiPjx0dD5nLkZpcnN0PC90dD48L2I+Cis8YmxvY2txdW90ZT4KK0EgZGljdGlvbmFyeSByZXByZXNlbnRpbmcgdGhlIGZpcnN0IHNldHMgZm9yIGFsbCBncmFtbWFyIHN5bWJvbHMuICBUaGlzIGlzCitjb21wdXRlZCBhbmQgcmV0dXJuZWQgYnkgdGhlIDx0dD5jb21wdXRlX2ZpcnN0KCk8L3R0PiBtZXRob2QuCis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGI+PHR0PmcuRm9sbG93PC90dD48L2I+Cis8YmxvY2txdW90ZT4KK0EgZGljdGlvbmFyeSByZXByZXNlbnRpbmcgdGhlIGZvbGxvdyBzZXRzIGZvciBhbGwgZ3JhbW1hciBydWxlcy4gIFRoaXMgaXMKK2NvbXB1dGVkIGFuZCByZXR1cm5lZCBieSB0aGUgPHR0PmNvbXB1dGVfZm9sbG93KCk8L3R0PiBtZXRob2QuCis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGI+PHR0PmcuU3RhcnQ8L3R0PjwvYj4KKzxibG9ja3F1b3RlPgorU3RhcnRpbmcgc3ltYm9sIGZvciB0aGUgZ3JhbW1hci4gIFNldCBieSB0aGUgPHR0PnNldF9zdGFydCgpPC90dD4gbWV0aG9kLgorPC9ibG9ja3F1b3RlPgorCitGb3IgdGhlIHB1cnBvc2VzIG9mIGRlYnVnZ2luZywgYSA8dHQ+R3JhbW1hcjwvdHQ+IG9iamVjdCBzdXBwb3J0cyB0aGUgPHR0Pl9fbGVuX18oKTwvdHQ+IGFuZAorPHR0Pl9fZ2V0aXRlbV9fKCk8L3R0PiBzcGVjaWFsIG1ldGhvZHMuICBBY2Nlc3NpbmcgPHR0Pmdbbl08L3R0PiByZXR1cm5zIHRoZSBudGggcHJvZHVjdGlvbgorZnJvbSB0aGUgZ3JhbW1hci4KKworCis8SDI+PGEgbmFtZT0iaW50ZXJuYWxfbm4zIj48L2E+My4gUHJvZHVjdGlvbnM8L0gyPgorCisKKzx0dD5HcmFtbWFyPC90dD4gb2JqZWN0cyBzdG9yZSBncmFtbWFyIHJ1bGVzIGFzIGluc3RhbmNlcyBvZiBhIDx0dD5Qcm9kdWN0aW9uPC90dD4gY2xhc3MuICBUaGlzCitjbGFzcyBoYXMgbm8gcHVibGljIGNvbnN0cnVjdG9yLS15b3Ugc2hvdWxkIG9ubHkgY3JlYXRlIHByb2R1Y3Rpb25zIGJ5IGNhbGxpbmcgPHR0PkdyYW1tYXIuYWRkX3Byb2R1Y3Rpb24oKTwvdHQ+LgorVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBhdmFpbGFibGUgb24gYSA8dHQ+UHJvZHVjdGlvbjwvdHQ+IGluc3RhbmNlIDx0dD5wPC90dD4uCisKKzxwPgorPGI+PHR0PnAubmFtZTwvdHQ+PC9iPgorPGJsb2NrcXVvdGU+CitUaGUgbmFtZSBvZiB0aGUgcHJvZHVjdGlvbi4gRm9yIGEgZ3JhbW1hciBydWxlIHN1Y2ggYXMgPHR0PkEgOiBCIEMgRDwvdHQ+LCB0aGlzIGlzIDx0dD4nQSc8L3R0Pi4KKzwvYmxvY2txdW90ZT4KKworPHA+Cis8Yj48dHQ+cC5wcm9kPC90dD48L2I+Cis8YmxvY2txdW90ZT4KK0EgdHVwbGUgb2Ygc3ltYm9scyBtYWtpbmcgdXAgdGhlIHJpZ2h0LWhhbmQgc2lkZSBvZiB0aGUgcHJvZHVjdGlvbi4gIEZvciBhIGdyYW1tYXIgcnVsZSBzdWNoIGFzIDx0dD5BIDogQiBDIEQ8L3R0PiwgdGhpcyBpcyA8dHQ+KCdCJywnQycsJ0QnKTwvdHQ+LgorPC9ibG9ja3F1b3RlPgorCis8cD4KKzxiPjx0dD5wLm51bWJlcjwvdHQ+PC9iPgorPGJsb2NrcXVvdGU+CitQcm9kdWN0aW9uIG51bWJlci4gIEFuIGludGVnZXIgY29udGFpbmluZyB0aGUgaW5kZXggb2YgdGhlIHByb2R1Y3Rpb24gaW4gdGhlIGdyYW1tYXIncyA8dHQ+UHJvZHVjdGlvbnM8L3R0PiBsaXN0LgorPC9ibG9ja3F1b3RlPgorCis8cD4KKzxiPjx0dD5wLmZ1bmM8L3R0PjwvYj4KKzxibG9ja3F1b3RlPgorVGhlIG5hbWUgb2YgdGhlIHJlZHVjdGlvbiBmdW5jdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2R1Y3Rpb24uCitUaGlzIGlzIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgZXhlY3V0ZSB3aGVuIHJlZHVjaW5nIHRoZSBlbnRpcmUKK2dyYW1tYXIgcnVsZSBkdXJpbmcgcGFyc2luZy4KKzwvYmxvY2txdW90ZT4KKworPHA+Cis8Yj48dHQ+cC5jYWxsYWJsZTwvdHQ+PC9iPgorPGJsb2NrcXVvdGU+CitUaGUgY2FsbGFibGUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZSBpbiA8dHQ+cC5mdW5jPC90dD4uICBUaGlzIGlzIDx0dD5Ob25lPC90dD4KK3VubGVzcyB0aGUgcHJvZHVjdGlvbiBoYXMgYmVlbiBib3VuZCB1c2luZyA8dHQ+YmluZCgpPC90dD4uCis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGI+PHR0PnAuZmlsZTwvdHQ+PC9iPgorPGJsb2NrcXVvdGU+CitGaWxlbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2R1Y3Rpb24uICBUeXBpY2FsbHkgdGhpcyBpcyB0aGUgZmlsZSB3aGVyZSB0aGUgcHJvZHVjdGlvbiB3YXMgZGVmaW5lZC4gIFVzZWQgZm9yIGVycm9yIG1lc3NhZ2VzLgorPC9ibG9ja3F1b3RlPgorCis8cD4KKzxiPjx0dD5wLmxpbmVubzwvdHQ+PC9iPgorPGJsb2NrcXVvdGU+CitMaW5lIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2R1Y3Rpb24uICBUeXBpY2FsbHkgdGhpcyBpcyB0aGUgbGluZSBudW1iZXIgaW4gPHR0PnAuZmlsZTwvdHQ+IHdoZXJlIHRoZSBwcm9kdWN0aW9uIHdhcyBkZWZpbmVkLiAgVXNlZCBmb3IgZXJyb3IgbWVzc2FnZXMuCis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGI+PHR0PnAucHJlYzwvdHQ+PC9iPgorPGJsb2NrcXVvdGU+CitQcmVjZWRlbmNlIGFuZCBhc3NvY2lhdGl2aXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvZHVjdGlvbi4gIFRoaXMgaXMgYSB0dXBsZSA8dHQ+KGFzc29jLGxldmVsKTwvdHQ+IHdoZXJlCis8dHQ+YXNzb2M8L3R0PiBpcyBvbmUgb2YgPHR0PidsZWZ0JzwvdHQ+LDx0dD4ncmlnaHQnPC90dD4sIG9yIDx0dD4nbm9uYXNzb2MnPC90dD4gYW5kIDx0dD5sZXZlbDwvdHQ+IGlzCithbiBpbnRlZ2VyLiAgIFRoaXMgdmFsdWUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgcHJlY2VkZW5jZSBvZiB0aGUgcmlnaHQtbW9zdCB0ZXJtaW5hbCBzeW1ib2wgaW4gdGhlIHByb2R1Y3Rpb24KK29yIGJ5IHVzZSBvZiB0aGUgPHR0PiVwcmVjPC90dD4gc3BlY2lmaWVyIHdoZW4gYWRkaW5nIHRoZSBwcm9kdWN0aW9uLgorPC9ibG9ja3F1b3RlPgorCis8cD4KKzxiPjx0dD5wLnVzeW1zPC90dD48L2I+Cis8YmxvY2txdW90ZT4KK0EgbGlzdCBvZiBhbGwgdW5pcXVlIHN5bWJvbHMgZm91bmQgaW4gdGhlIHByb2R1Y3Rpb24uCis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGI+PHR0PnAubHJfaXRlbXM8L3R0PjwvYj4KKzxibG9ja3F1b3RlPgorQSBsaXN0IG9mIGFsbCBMUiBpdGVtcyBmb3IgdGhpcyBwcm9kdWN0aW9uLiAgVGhpcyBhdHRyaWJ1dGUgb25seSBoYXMgYSBtZWFuaW5nZnVsIHZhbHVlIGlmIHRoZQorPHR0PkdyYW1tYXIuYnVpbGRfbHJpdGVtcygpPC90dD4gbWV0aG9kIGhhcyBiZWVuIGNhbGxlZC4gIFRoZSBpdGVtcyBpbiB0aGlzIGxpc3QgYXJlIAoraW5zdGFuY2VzIG9mIDx0dD5MUkl0ZW08L3R0PiBkZXNjcmliZWQgYmVsb3cuCis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGI+PHR0PnAubHJfbmV4dDwvdHQ+PC9iPgorPGJsb2NrcXVvdGU+CitUaGUgaGVhZCBvZiBhIGxpbmtlZC1saXN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBMUiBpdGVtcyBpbiA8dHQ+cC5scl9pdGVtczwvdHQ+LiAgCitUaGlzIGF0dHJpYnV0ZSBvbmx5IGhhcyBhIG1lYW5pbmdmdWwgdmFsdWUgaWYgdGhlIDx0dD5HcmFtbWFyLmJ1aWxkX2xyaXRlbXMoKTwvdHQ+IAorbWV0aG9kIGhhcyBiZWVuIGNhbGxlZC4gIEVhY2ggPHR0PkxSSXRlbTwvdHQ+IGluc3RhbmNlIGhhcyBhIDx0dD5scl9uZXh0PC90dD4gYXR0cmlidXRlCit0byBtb3ZlIHRvIHRoZSBuZXh0IGl0ZW0uICBUaGUgbGlzdCBpcyB0ZXJtaW5hdGVkIGJ5IDx0dD5Ob25lPC90dD4uCis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGI+PHR0PnAuYmluZChkaWN0KTwvdHQ+PC9iPgorPGJsb2NrcXVvdGU+CitCaW5kcyB0aGUgcHJvZHVjdGlvbiBmdW5jdGlvbiBuYW1lIGluIDx0dD5wLmZ1bmM8L3R0PiB0byBhIGNhbGxhYmxlIG9iamVjdCBpbiAKKzx0dD5kaWN0PC90dD4uICAgVGhpcyBvcGVyYXRpb24gaXMgdHlwaWNhbGx5IGNhcnJpZWQgb3V0IGluIHRoZSBsYXN0IHN0ZXAKK3ByaW9yIHRvIHJ1bm5pbmcgdGhlIHBhcnNpbmcgZW5naW5lIGFuZCBpcyBuZWVkZWQgc2luY2UgcGFyc2luZyB0YWJsZXMgYXJlIHR5cGljYWxseQorcmVhZCBmcm9tIGZpbGVzIHdoaWNoIG9ubHkgaW5jbHVkZSB0aGUgZnVuY3Rpb24gbmFtZXMsIG5vdCB0aGUgZnVuY3Rpb25zIHRoZW1zZWx2ZXMuCis8L2Jsb2NrcXVvdGU+CisKKzxQPgorPHR0PlByb2R1Y3Rpb248L3R0PiBvYmplY3RzIHN1cHBvcnQKK3RoZSA8dHQ+X19sZW5fXygpPC90dD4sIDx0dD5fX2dldGl0ZW1fXygpPC90dD4sIGFuZCA8dHQ+X19zdHJfXygpPC90dD4KK3NwZWNpYWwgbWV0aG9kcy4KKzx0dD5sZW4ocCk8L3R0PiByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBpbiA8dHQ+cC5wcm9kPC90dD4KK2FuZCA8dHQ+cFtuXTwvdHQ+IGlzIHRoZSBzYW1lIGFzIDx0dD5wLnByb2Rbbl08L3R0Pi4gCisKKzxIMj48YSBuYW1lPSJpbnRlcm5hbF9ubjQiPjwvYT40LiBMUkl0ZW1zPC9IMj4KKworCitUaGUgY29uc3RydWN0aW9uIG9mIHBhcnNpbmcgdGFibGVzIGluIGFuIExSLWJhc2VkIHBhcnNlciBnZW5lcmF0b3IgaXMgcHJpbWFyaWx5Citkb25lIG92ZXIgYSBzZXQgb2YgIkxSIEl0ZW1zIi4gICBBbiBMUiBpdGVtIHJlcHJlc2VudHMgYSBzdGFnZSBvZiBwYXJzaW5nIG9uZQorb2YgdGhlIGdyYW1tYXIgcnVsZXMuICAgVG8gY29tcHV0ZSB0aGUgTFIgaXRlbXMsIGl0IGlzIGZpcnN0IG5lY2Vzc2FyeSB0bworY2FsbCA8dHQ+R3JhbW1hci5idWlsZF9scml0ZW1zKCk8L3R0Pi4gIE9uY2UgdGhpcyBzdGVwLCBhbGwgb2YgdGhlIHByb2R1Y3Rpb25zCitpbiB0aGUgZ3JhbW1hciB3aWxsIGhhdmUgdGhlaXIgTFIgaXRlbXMgYXR0YWNoZWQgdG8gdGhlbS4KKworPHA+CitIZXJlIGlzIGFuIGludGVyYWN0aXZlIGV4YW1wbGUgdGhhdCBzaG93cyB3aGF0IExSIGl0ZW1zIGxvb2sgbGlrZSBpZiB5b3UKK2ludGVyYWN0aXZlbHkgZXhwZXJpbWVudC4gIEluIHRoaXMgZXhhbXBsZSwgPHR0Pmc8L3R0PiBpcyBhIDx0dD5HcmFtbWFyPC90dD4gCitvYmplY3QuCisKKzxibG9ja3F1b3RlPgorPHByZT4KKz4+PiA8Yj5nLmJ1aWxkX2xyaXRlbXMoKTwvYj4KKz4+PiA8Yj5wID0gZ1sxXTwvYj4KKz4+PiA8Yj5wPC9iPgorUHJvZHVjdGlvbihzdGF0ZW1lbnQgLT4gSUQgPSBleHByKQorPj4+Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworSW4gdGhlIGFib3ZlIGNvZGUsIDx0dD5wPC90dD4gcmVwcmVzZW50cyB0aGUgZmlyc3QgZ3JhbW1hciBydWxlLiBJbgordGhpcyBjYXNlLCBhIHJ1bGUgPHR0PidzdGF0ZW1lbnQgLT4gSUQgPSBleHByJzwvdHQ+LgorCis8cD4KK05vdywgbGV0J3MgbG9vayBhdCB0aGUgTFIgaXRlbXMgZm9yIDx0dD5wPC90dD4uCisKKzxibG9ja3F1b3RlPgorPHByZT4KKz4+PiA8Yj5wLmxyX2l0ZW1zPC9iPgorW0xSSXRlbShzdGF0ZW1lbnQgLT4gLiBJRCA9IGV4cHIpLCAKKyBMUkl0ZW0oc3RhdGVtZW50IC0+IElEIC4gPSBleHByKSwgCisgTFJJdGVtKHN0YXRlbWVudCAtPiBJRCA9IC4gZXhwciksIAorIExSSXRlbShzdGF0ZW1lbnQgLT4gSUQgPSBleHByIC4pXQorPj4+Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworSW4gZWFjaCBMUiBpdGVtLCB0aGUgZG90ICguKSByZXByZXNlbnRzIGEgc3BlY2lmaWMgc3RhZ2Ugb2YgcGFyc2luZy4gIEluIGVhY2ggTFIgaXRlbSwgdGhlIGRvdAoraXMgYWR2YW5jZWQgYnkgb25lIHN5bWJvbC4gIEl0IGlzIG9ubHkgd2hlbiB0aGUgZG90IHJlYWNoZXMgdGhlIHZlcnkgZW5kIHRoYXQgYSBwcm9kdWN0aW9uCitpcyBzdWNjZXNzZnVsbHkgcGFyc2VkLgorCis8cD4KK0FuIGluc3RhbmNlIDx0dD5scjwvdHQ+IG9mIDx0dD5MUkl0ZW08L3R0PiBoYXMgdGhlIGZvbGxvd2luZworYXR0cmlidXRlcyB0aGF0IGhvbGQgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGF0IHNwZWNpZmljIHN0YWdlIG9mCitwYXJzaW5nLgorCis8cD4KKzxiPjx0dD5sci5uYW1lPC90dD48L2I+Cis8YmxvY2txdW90ZT4KK1RoZSBuYW1lIG9mIHRoZSBncmFtbWFyIHJ1bGUuIEZvciBleGFtcGxlLCA8dHQ+J3N0YXRlbWVudCc8L3R0PiBpbiB0aGUgYWJvdmUgZXhhbXBsZS4KKzwvYmxvY2txdW90ZT4KKworPHA+Cis8Yj48dHQ+bHIucHJvZDwvdHQ+PC9iPgorPGJsb2NrcXVvdGU+CitBIHR1cGxlIG9mIHN5bWJvbHMgcmVwcmVzZW50aW5nIHRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIHByb2R1Y3Rpb24sIGluY2x1ZGluZyB0aGUKK3NwZWNpYWwgPHR0PicuJzwvdHQ+IGNoYXJhY3Rlci4gIEZvciBleGFtcGxlLCA8dHQ+KCdJRCcsJy4nLCc9JywnZXhwcicpPC90dD4uCis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGI+PHR0PmxyLm51bWJlcjwvdHQ+PC9iPgorPGJsb2NrcXVvdGU+CitBbiBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgcHJvZHVjdGlvbiBudW1iZXIgaW4gdGhlIGdyYW1tYXIuCis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGI+PHR0PmxyLnVzeW1zPC90dD48L2I+Cis8YmxvY2txdW90ZT4KK0Egc2V0IG9mIHVuaXF1ZSBzeW1ib2xzIGluIHRoZSBwcm9kdWN0aW9uLiAgSW5oZXJpdGVkIGZyb20gdGhlIG9yaWdpbmFsIDx0dD5Qcm9kdWN0aW9uPC90dD4gaW5zdGFuY2UuCis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGI+PHR0PmxyLmxyX2luZGV4PC90dD48L2I+Cis8YmxvY2txdW90ZT4KK0FuIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBwb3NpdGlvbiBvZiB0aGUgZG90ICguKS4gIFlvdSBzaG91bGQgbmV2ZXIgdXNlIDx0dD5sci5wcm9kLmluZGV4KCk8L3R0PgordG8gc2VhcmNoIGZvciBpdC0tdGhlIHJlc3VsdCB3aWxsIGJlIHdyb25nIGlmIHRoZSBncmFtbWFyIGhhcHBlbnMgdG8gYWxzbyB1c2UgKC4pIGFzIGEgY2hhcmFjdGVyCitsaXRlcmFsLgorPC9ibG9ja3F1b3RlPgorCis8cD4KKzxiPjx0dD5sci5scl9hZnRlcjwvdHQ+PC9iPgorPGJsb2NrcXVvdGU+CitBIGxpc3Qgb2YgYWxsIHByb2R1Y3Rpb25zIHRoYXQgY2FuIGxlZ2FsbHkgYXBwZWFyIGltbWVkaWF0ZWx5IHRvIHRoZSByaWdodCBvZiB0aGUKK2RvdCAoLikuICBUaGlzIGxpc3QgY29udGFpbnMgPHR0PlByb2R1Y3Rpb248L3R0PiBpbnN0YW5jZXMuICAgVGhpcyBhdHRyaWJ1dGUKK3JlcHJlc2VudHMgYWxsIG9mIHRoZSBwb3NzaWJsZSBicmFuY2hlcyBhIHBhcnNlIGNhbiB0YWtlIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24uCitGb3IgZXhhbXBsZSwgc3VwcG9zZSB0aGF0IDx0dD5scjwvdHQ+IHJlcHJlc2VudHMgYSBzdGFnZSBpbW1lZGlhdGVseSBiZWZvcmUKK2FuIGV4cHJlc3Npb24gbGlrZSB0aGlzOgorCis8cHJlPgorPj4+IDxiPmxyPC9iPgorTFJJdGVtKHN0YXRlbWVudCAtPiBJRCA9IC4gZXhwcikKKz4+PgorPC9wcmU+CisKK1RoZW4sIHRoZSB2YWx1ZSBvZiA8dHQ+bHIubHJfYWZ0ZXI8L3R0PiBtaWdodCBsb29rIGxpa2UgdGhpcywgc2hvd2luZyBhbGwgcHJvZHVjdGlvbnMgdGhhdAorY2FuIGxlZ2FsbHkgYXBwZWFyIG5leHQ6CisKKzxwcmU+Cis+Pj4gPGI+bHIubHJfYWZ0ZXI8L2I+CitbUHJvZHVjdGlvbihleHByIC0+IGV4cHIgUExVUyBleHByKSwgCisgUHJvZHVjdGlvbihleHByIC0+IGV4cHIgTUlOVVMgZXhwciksIAorIFByb2R1Y3Rpb24oZXhwciAtPiBleHByIFRJTUVTIGV4cHIpLCAKKyBQcm9kdWN0aW9uKGV4cHIgLT4gZXhwciBESVZJREUgZXhwciksIAorIFByb2R1Y3Rpb24oZXhwciAtPiBNSU5VUyBleHByKSwgCisgUHJvZHVjdGlvbihleHByIC0+IExQQVJFTiBleHByIFJQQVJFTiksIAorIFByb2R1Y3Rpb24oZXhwciAtPiBOVU1CRVIpLCAKKyBQcm9kdWN0aW9uKGV4cHIgLT4gSUQpXQorPj4+Cis8L3ByZT4KKworPC9ibG9ja3F1b3RlPgorCis8cD4KKzxiPjx0dD5sci5scl9iZWZvcmU8L3R0PjwvYj4KKzxibG9ja3F1b3RlPgorVGhlIGdyYW1tYXIgc3ltYm9sIHRoYXQgYXBwZWFycyBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGRvdCAoLikgb3IgPHR0Pk5vbmU8L3R0PiBpZgorYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFyc2UuICAKKzwvYmxvY2txdW90ZT4KKworPHA+Cis8Yj48dHQ+bHIubHJfbmV4dDwvdHQ+PC9iPgorPGJsb2NrcXVvdGU+CitBIGxpbmsgdG8gdGhlIG5leHQgTFIgaXRlbSwgcmVwcmVzZW50aW5nIHRoZSBuZXh0IHN0YWdlIG9mIHRoZSBwYXJzZS4gIDx0dD5Ob25lPC90dD4gaWYgPHR0PmxyPC90dD4KK2lzIHRoZSBsYXN0IExSIGl0ZW0uCis8L2Jsb2NrcXVvdGU+CisKKzx0dD5MUkl0ZW08L3R0PiBpbnN0YW5jZXMgYWxzbyBzdXBwb3J0IHRoZSA8dHQ+X19sZW5fXygpPC90dD4gYW5kIDx0dD5fX2dldGl0ZW1fXygpPC90dD4gc3BlY2lhbCBtZXRob2RzLgorPHR0Pmxlbihscik8L3R0PiByZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gPHR0PmxyLnByb2Q8L3R0PiBpbmNsdWRpbmcgdGhlIGRvdCAoLikuIDx0dD5scltuXTwvdHQ+CityZXR1cm5zIDx0dD5sci5wcm9kW25dPC90dD4uCisKKzxwPgorSXQgZ29lcyB3aXRob3V0IHNheWluZyB0aGF0IGFsbCBvZiB0aGUgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggTFIKK2l0ZW1zIHNob3VsZCBiZSBhc3N1bWVkIHRvIGJlIHJlYWQtb25seS4gIE1vZGlmaWNhdGlvbnMgd2lsbCB2ZXJ5CitsaWtlbHkgY3JlYXRlIGEgc21hbGwgYmxhY2staG9sZSB0aGF0IHdpbGwgY29uc3VtZSB5b3UgYW5kIHlvdXIgY29kZS4KKworPEgyPjxhIG5hbWU9ImludGVybmFsX25uNSI+PC9hPjUuIExSVGFibGU8L0gyPgorCisKK1RoZSA8dHQ+TFJUYWJsZTwvdHQ+IGNsYXNzIGlzIHVzZWQgdG8gcmVwcmVzZW50IExSIHBhcnNpbmcgdGFibGUgZGF0YS4gVGhpcworbWluaW1hbGx5IGluY2x1ZGVzIHRoZSBwcm9kdWN0aW9uIGxpc3QsIGFjdGlvbiB0YWJsZSwgYW5kIGdvdG8gdGFibGUuIAorCis8cD4KKzxiPjx0dD5MUlRhYmxlKCk8L3R0PjwvYj4KKzxibG9ja3F1b3RlPgorQ3JlYXRlIGFuIGVtcHR5IExSVGFibGUgb2JqZWN0LiAgVGhpcyBvYmplY3QgY29udGFpbnMgb25seSB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvCitydW4gYW4gTFIgcGFyc2VyLiAgCis8L2Jsb2NrcXVvdGU+CisKK0FuIGluc3RhbmNlIDx0dD5scnRhYjwvdHQ+IG9mIDx0dD5MUlRhYmxlPC90dD4gaGFzIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKworPHA+Cis8Yj48dHQ+bHJ0YWIucmVhZF90YWJsZShtb2R1bGUpPC90dD48L2I+Cis8YmxvY2txdW90ZT4KK1BvcHVsYXRlcyB0aGUgTFIgdGFibGUgd2l0aCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBtb2R1bGUgc3BlY2lmaWVkIGluIDx0dD5tb2R1bGU8L3R0Pi4KKzx0dD5tb2R1bGU8L3R0PiBpcyBlaXRoZXIgYSBtb2R1bGUgb2JqZWN0IGFscmVhZHkgbG9hZGVkIHdpdGggPHR0PmltcG9ydDwvdHQ+IG9yCit0aGUgbmFtZSBvZiBhIFB5dGhvbiBtb2R1bGUuICAgSWYgaXQncyBhIHN0cmluZyBjb250YWluaW5nIGEgbW9kdWxlIG5hbWUsIGl0IGlzCitsb2FkZWQgYW5kIHBhcnNpbmcgZGF0YSBpcyBleHRyYWN0ZWQuICAgUmV0dXJucyB0aGUgc2lnbmF0dXJlICB2YWx1ZSB0aGF0IHdhcyB1c2VkCit3aGVuIGluaXRpYWxseSB3cml0aW5nIHRoZSB0YWJsZXMuICBSYWlzZXMgYSA8dHQ+VmVyc2lvbkVycm9yPC90dD4gZXhjZXB0aW9uIGlmCit0aGUgbW9kdWxlIHdhcyBjcmVhdGVkIHVzaW5nIGFuIGluY29tcGF0aWJsZSB2ZXJzaW9uIG9mIFBMWS4KKzwvYmxvY2txdW90ZT4KKworPHA+Cis8Yj48dHQ+bHJ0YWIuYmluZF9jYWxsYWJsZXMoZGljdCk8L3R0PjwvYj4KKzxibG9ja3F1b3RlPgorVGhpcyBiaW5kcyBhbGwgb2YgdGhlIGZ1bmN0aW9uIG5hbWVzIHVzZWQgaW4gcHJvZHVjdGlvbnMgdG8gY2FsbGFibGUgb2JqZWN0cworZm91bmQgaW4gdGhlIGRpY3Rpb25hcnkgPHR0PmRpY3Q8L3R0Pi4gIER1cmluZyB0YWJsZSBnZW5lcmF0aW9uIGFuZCB3aGVuIHJlYWRpbmcKK0xSIHRhYmxlcyBmcm9tIGZpbGVzLCBQTFkgb25seSB1c2VzIHRoZSBuYW1lcyBvZiBhY3Rpb24gZnVuY3Rpb25zIHN1Y2ggYXMgPHR0PidwX2V4cHInPC90dD4sCis8dHQ+J3Bfc3RhdGVtZW50JzwvdHQ+LCBldGMuICBJbiBvcmRlciB0byBhY3R1YWxseSBydW4gdGhlIHBhcnNlciwgdGhlc2UgbmFtZXMKK2hhdmUgdG8gYmUgYm91bmQgdG8gY2FsbGFibGUgb2JqZWN0cy4gICBUaGlzIG1ldGhvZCBpcyBhbHdheXMgY2FsbGVkIHByaW9yIHRvCitydW5uaW5nIGEgcGFyc2VyLgorPC9ibG9ja3F1b3RlPgorCitBZnRlciA8dHQ+bHJ0YWI8L3R0PiBoYXMgYmVlbiBwb3B1bGF0ZWQsIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgZGVmaW5lZC4KKworPHA+Cis8Yj48dHQ+bHJ0YWIubHJfbWV0aG9kPC90dD48L2I+Cis8YmxvY2txdW90ZT4KK1RoZSBMUiBwYXJzaW5nIG1ldGhvZCB1c2VkIChlLmcuLCA8dHQ+J0xBTFInPC90dD4pCis8L2Jsb2NrcXVvdGU+CisKKworPHA+Cis8Yj48dHQ+bHJ0YWIubHJfcHJvZHVjdGlvbnM8L3R0PjwvYj4KKzxibG9ja3F1b3RlPgorVGhlIHByb2R1Y3Rpb24gbGlzdC4gIElmIHRoZSBwYXJzaW5nIHRhYmxlcyBoYXZlIGJlZW4gbmV3bHkKK2NvbnN0cnVjdGVkLCB0aGlzIHdpbGwgYmUgYSBsaXN0IG9mIDx0dD5Qcm9kdWN0aW9uPC90dD4gaW5zdGFuY2VzLiAgSWYKK3RoZSBwYXJzaW5nIHRhYmxlcyBoYXZlIGJlZW4gcmVhZCBmcm9tIGEgZmlsZSwgaXQncyBhIGxpc3QKK29mIDx0dD5NaW5pUHJvZHVjdGlvbjwvdHQ+IGluc3RhbmNlcy4gIFRoaXMsIHRvZ2V0aGVyCit3aXRoIDx0dD5scl9hY3Rpb248L3R0PiBhbmQgPHR0PmxyX2dvdG88L3R0PiBjb250YWluIGFsbCBvZiB0aGUKK2luZm9ybWF0aW9uIG5lZWRlZCBieSB0aGUgTFIgcGFyc2luZyBlbmdpbmUuCis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGI+PHR0PmxydGFiLmxyX2FjdGlvbjwvdHQ+PC9iPgorPGJsb2NrcXVvdGU+CitUaGUgTFIgYWN0aW9uIGRpY3Rpb25hcnkgdGhhdCBpbXBsZW1lbnRzIHRoZSB1bmRlcmx5aW5nIHN0YXRlIG1hY2hpbmUuCitUaGUga2V5cyBvZiB0aGlzIGRpY3Rpb25hcnkgYXJlIHRoZSBMUiBzdGF0ZXMuCis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGI+PHR0PmxydGFiLmxyX2dvdG88L3R0PjwvYj4KKzxibG9ja3F1b3RlPgorVGhlIExSIGdvdG8gdGFibGUgdGhhdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBncmFtbWFyIHJ1bGUgcmVkdWN0aW9ucy4KKzwvYmxvY2txdW90ZT4KKworCis8SDI+PGEgbmFtZT0iaW50ZXJuYWxfbm42Ij48L2E+Ni4gTFJHZW5lcmF0ZWRUYWJsZTwvSDI+CisKKworVGhlIDx0dD5MUkdlbmVyYXRlZFRhYmxlPC90dD4gY2xhc3MgcmVwcmVzZW50cyBjb25zdHJ1Y3RlZCBMUiBwYXJzaW5nIHRhYmxlcyBvbiBhCitncmFtbWFyLiAgSXQgaXMgYSBzdWJjbGFzcyBvZiA8dHQ+TFJUYWJsZTwvdHQ+LgorCis8cD4KKzxiPjx0dD5MUkdlbmVyYXRlZFRhYmxlKGdyYW1tYXIsIG1ldGhvZD0nTEFMUicsbG9nPU5vbmUpPC90dD48L2I+Cis8YmxvY2txdW90ZT4KK0NyZWF0ZSB0aGUgTFIgcGFyc2luZyB0YWJsZXMgb24gYSBncmFtbWFyLiAgPHR0PmdyYW1tYXI8L3R0PiBpcyBhbiBpbnN0YW5jZSBvZiA8dHQ+R3JhbW1hcjwvdHQ+LAorPHR0Pm1ldGhvZDwvdHQ+IGlzIGEgc3RyaW5nIHdpdGggdGhlIHBhcnNpbmcgbWV0aG9kICg8dHQ+J1NMUic8L3R0PiBvciA8dHQ+J0xBTFInPC90dD4pLCBhbmQKKzx0dD5sb2c8L3R0PiBpcyBhIGxvZ2dlciBvYmplY3QgdXNlZCB0byB3cml0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGUgZGVidWdnaW5nIGluZm9ybWF0aW9uCit3cml0dGVuIHRvIDx0dD5sb2c8L3R0PiBpcyB0aGUgc2FtZSBhcyB3aGF0IGFwcGVhcnMgaW4gdGhlIDx0dD5wYXJzZXIub3V0PC90dD4gZmlsZSBjcmVhdGVkCitieSB5YWNjLiAgQnkgc3VwcGx5aW5nIGEgY3VzdG9tIGxvZ2dlciB3aXRoIGEgZGlmZmVyZW50IG1lc3NhZ2UgZm9ybWF0LCBpdCBpcyBwb3NzaWJsZSB0byBnZXQKK21vcmUgaW5mb3JtYXRpb24gKGUuZy4sIHRoZSBsaW5lIG51bWJlciBpbiA8dHQ+eWFjYy5weTwvdHQ+IHVzZWQgZm9yIGlzc3VpbmcgZWFjaCBsaW5lIG9mCitvdXRwdXQgaW4gdGhlIGxvZykuICAgVGhlIHJlc3VsdCBpcyBhbiBpbnN0YW5jZSBvZiA8dHQ+TFJHZW5lcmF0ZWRUYWJsZTwvdHQ+LgorPC9ibG9ja3F1b3RlPgorCis8cD4KK0FuIGluc3RhbmNlIDx0dD5scjwvdHQ+IG9mIDx0dD5MUkdlbmVyYXRlZFRhYmxlPC90dD4gaGFzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcy4KKworPHA+Cis8Yj48dHQ+bHIuZ3JhbW1hcjwvdHQ+PC9iPgorPGJsb2NrcXVvdGU+CitBIGxpbmsgdG8gdGhlIEdyYW1tYXIgb2JqZWN0IHVzZWQgdG8gY29uc3RydWN0IHRoZSBwYXJzaW5nIHRhYmxlcy4KKzwvYmxvY2txdW90ZT4KKworPHA+Cis8Yj48dHQ+bHIubHJfbWV0aG9kPC90dD48L2I+Cis8YmxvY2txdW90ZT4KK1RoZSBMUiBwYXJzaW5nIG1ldGhvZCB1c2VkIChlLmcuLCA8dHQ+J0xBTFInPC90dD4pCis8L2Jsb2NrcXVvdGU+CisKKworPHA+Cis8Yj48dHQ+bHIubHJfcHJvZHVjdGlvbnM8L3R0PjwvYj4KKzxibG9ja3F1b3RlPgorQSByZWZlcmVuY2UgdG8gPHR0PmdyYW1tYXIuUHJvZHVjdGlvbnM8L3R0Pi4gIFRoaXMsIHRvZ2V0aGVyIHdpdGggPHR0PmxyX2FjdGlvbjwvdHQ+IGFuZCA8dHQ+bHJfZ290bzwvdHQ+Citjb250YWluIGFsbCBvZiB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIGJ5IHRoZSBMUiBwYXJzaW5nIGVuZ2luZS4KKzwvYmxvY2txdW90ZT4KKworPHA+Cis8Yj48dHQ+bHIubHJfYWN0aW9uPC90dD48L2I+Cis8YmxvY2txdW90ZT4KK1RoZSBMUiBhY3Rpb24gZGljdGlvbmFyeSB0aGF0IGltcGxlbWVudHMgdGhlIHVuZGVybHlpbmcgc3RhdGUgbWFjaGluZS4gIFRoZSBrZXlzIG9mIHRoaXMgZGljdGlvbmFyeSBhcmUKK3RoZSBMUiBzdGF0ZXMuCis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGI+PHR0PmxyLmxyX2dvdG88L3R0PjwvYj4KKzxibG9ja3F1b3RlPgorVGhlIExSIGdvdG8gdGFibGUgdGhhdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBncmFtbWFyIHJ1bGUgcmVkdWN0aW9ucy4KKzwvYmxvY2txdW90ZT4KKworPHA+Cis8Yj48dHQ+bHIuc3JfY29uZmxpY3RzPC90dD48L2I+Cis8YmxvY2txdW90ZT4KK0EgbGlzdCBvZiB0dXBsZXMgPHR0PihzdGF0ZSx0b2tlbixyZXNvbHV0aW9uKTwvdHQ+IGlkZW50aWZ5aW5nIGFsbCBzaGlmdC9yZWR1Y2UgY29uZmxpY3RzLiA8dHQ+c3RhdGU8L3R0PiBpcyB0aGUgTFIgc3RhdGUKK251bWJlciB3aGVyZSB0aGUgY29uZmxpY3Qgb2NjdXJyZWQsIDx0dD50b2tlbjwvdHQ+IGlzIHRoZSB0b2tlbiBjYXVzaW5nIHRoZSBjb25mbGljdCwgYW5kIDx0dD5yZXNvbHV0aW9uPC90dD4gaXMKK2Egc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHJlc29sdXRpb24gdGFrZW4uICA8dHQ+cmVzb2x1dGlvbjwvdHQ+IGlzIGVpdGhlciA8dHQ+J3NoaWZ0JzwvdHQ+IG9yIDx0dD4ncmVkdWNlJzwvdHQ+LgorPC9ibG9ja3F1b3RlPgorCis8cD4KKzxiPjx0dD5sci5ycl9jb25mbGljdHM8L3R0PjwvYj4KKzxibG9ja3F1b3RlPgorQSBsaXN0IG9mIHR1cGxlcyA8dHQ+KHN0YXRlLHJ1bGUscmVqZWN0ZWQpPC90dD4gaWRlbnRpZnlpbmcgYWxsIHJlZHVjZS9yZWR1Y2UgY29uZmxpY3RzLiAgPHR0PnN0YXRlPC90dD4gaXMgdGhlCitMUiBzdGF0ZSBudW1iZXIgd2hlcmUgdGhlIGNvbmZsaWN0IG9jY3VycmVkLCA8dHQ+cnVsZTwvdHQ+IGlzIHRoZSBwcm9kdWN0aW9uIHJ1bGUgdGhhdCB3YXMgc2VsZWN0ZWQKK2FuZCA8dHQ+cmVqZWN0ZWQ8L3R0PiBpcyB0aGUgcHJvZHVjdGlvbiBydWxlIHRoYXQgd2FzIHJlamVjdGVkLiAgIEJvdGggPHR0PnJ1bGU8L3R0PiBhbmQgPC90dD5yZWplY3RlZDwvdHQ+IGFyZQoraW5zdGFuY2VzIG9mIDx0dD5Qcm9kdWN0aW9uPC90dD4uICBUaGV5IGNhbiBiZSBpbnNwZWN0ZWQgdG8gcHJvdmlkZSB0aGUgdXNlciB3aXRoIG1vcmUgaW5mb3JtYXRpb24uCis8L2Jsb2NrcXVvdGU+CisKKzxwPgorVGhlcmUgYXJlIHR3byBwdWJsaWMgbWV0aG9kcyBvZiA8dHQ+TFJHZW5lcmF0ZWRUYWJsZTwvdHQ+LgorCis8cD4KKzxiPjx0dD5sci53cml0ZV90YWJsZShtb2R1bGVuYW1lLG91dHB1dGRpcj0iIixzaWduYXR1cmU9IiIpPC90dD48L2I+Cis8YmxvY2txdW90ZT4KK1dyaXRlcyB0aGUgTFIgcGFyc2luZyB0YWJsZSBpbmZvcm1hdGlvbiB0byBhIFB5dGhvbiBtb2R1bGUuICA8dHQ+bW9kdWxlbmFtZTwvdHQ+IGlzIGEgc3RyaW5nIAorc3BlY2lmeWluZyB0aGUgbmFtZSBvZiBhIG1vZHVsZSBzdWNoIGFzIDx0dD4icGFyc2V0YWIiPC90dD4uICA8dHQ+b3V0cHV0ZGlyPC90dD4gaXMgdGhlIG5hbWUgb2YgYSAKK2RpcmVjdG9yeSB3aGVyZSB0aGUgbW9kdWxlIHNob3VsZCBiZSBjcmVhdGVkLiAgPHR0PnNpZ25hdHVyZTwvdHQ+IGlzIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhCitncmFtbWFyIHNpZ25hdHVyZSB0aGF0J3Mgd3JpdHRlbiBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gVGhpcyBjYW4gYmUgdXNlZCB0byBkZXRlY3Qgd2hlbgordGhlIGRhdGEgc3RvcmVkIGluIGEgbW9kdWxlIGZpbGUgaXMgb3V0LW9mLXN5bmMgd2l0aCB0aGUgdGhlIGdyYW1tYXIgc3BlY2lmaWNhdGlvbiAoYW5kIHRoYXQKK3RoZSB0YWJsZXMgbmVlZCB0byBiZSByZWdlbmVyYXRlZCkuICBJZiA8dHQ+bW9kdWxlbmFtZTwvdHQ+IGlzIGEgc3RyaW5nIDx0dD4icGFyc2V0YWIiPC90dD4sCit0aGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBmaWxlIGNhbGxlZCA8dHQ+cGFyc2V0YWIucHk8L3R0Pi4gIElmIHRoZSBtb2R1bGUgbmFtZSByZXByZXNlbnRzIGEKK3BhY2thZ2Ugc3VjaCBhcyA8dHQ+ImZvby5iYXIucGFyc2V0YWIiPC90dD4sIHRoZW4gb25seSB0aGUgbGFzdCBjb21wb25lbnQsIDx0dD4icGFyc2V0YWIiPC90dD4gaXMKK3VzZWQuCis8L2Jsb2NrcXVvdGU+CisKKworPEgyPjxhIG5hbWU9ImludGVybmFsX25uNyI+PC9hPjcuIExSUGFyc2VyPC9IMj4KKworCitUaGUgPHR0PkxSUGFyc2VyPC90dD4gY2xhc3MgaW1wbGVtZW50cyB0aGUgbG93LWxldmVsIExSIHBhcnNpbmcgZW5naW5lLgorCisKKzxwPgorPGI+PHR0PkxSUGFyc2VyKGxydGFiLCBlcnJvcl9mdW5jKTwvdHQ+PC9iPgorPGJsb2NrcXVvdGU+CitDcmVhdGUgYW4gTFJQYXJzZXIuICA8dHQ+bHJ0YWI8L3R0PiBpcyBhbiBpbnN0YW5jZSBvZiA8dHQ+TFJUYWJsZTwvdHQ+Citjb250YWluaW5nIHRoZSBMUiBwcm9kdWN0aW9uIGFuZCBzdGF0ZSB0YWJsZXMuICA8dHQ+ZXJyb3JfZnVuYzwvdHQ+IGlzIHRoZQorZXJyb3IgZnVuY3Rpb24gdG8gaW52b2tlIGluIHRoZSBldmVudCBvZiBhIHBhcnNpbmcgZXJyb3IuCis8L2Jsb2NrcXVvdGU+CisKK0FuIGluc3RhbmNlIDx0dD5wPC90dD4gb2YgPHR0PkxSUGFyc2VyPC90dD4gaGFzIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKworPHA+Cis8Yj48dHQ+cC5wYXJzZShpbnB1dD1Ob25lLGxleGVyPU5vbmUsZGVidWc9MCx0cmFja2luZz0wLHRva2VuZnVuYz1Ob25lKTwvdHQ+PC9iPgorPGJsb2NrcXVvdGU+CitSdW4gdGhlIHBhcnNlci4gIDx0dD5pbnB1dDwvdHQ+IGlzIGEgc3RyaW5nLCB3aGljaCBpZiBzdXBwbGllZCBpcyBmZWQgaW50byB0aGUKK2xleGVyIHVzaW5nIGl0cyA8dHQ+aW5wdXQoKTwvdHQ+IG1ldGhvZC4gIDx0dD5sZXhlcjwvdHQ+IGlzIGFuIGluc3RhbmNlIG9mIHRoZQorPHR0PkxleGVyPC90dD4gY2xhc3MgdG8gdXNlIGZvciB0b2tlbml6aW5nLiAgSWYgbm90IHN1cHBsaWVkLCB0aGUgbGFzdCBsZXhlcgorY3JlYXRlZCB3aXRoIHRoZSA8dHQ+bGV4PC90dD4gbW9kdWxlIGlzIHVzZWQuICAgPHR0PmRlYnVnPC90dD4gaXMgYSBib29sZWFuIGZsYWcKK3RoYXQgZW5hYmxlcyBkZWJ1Z2dpbmcuICAgPHR0PnRyYWNraW5nPC90dD4gaXMgYSBib29sZWFuIGZsYWcgdGhhdCB0ZWxscyB0aGUKK3BhcnNlciB0byBwZXJmb3JtIGFkZGl0aW9uYWwgbGluZSBudW1iZXIgdHJhY2tpbmcuICA8dHQ+dG9rZW5mdW5jPC90dD4gaXMgYSBjYWxsYWJsZQorZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBuZXh0IHRva2VuLiAgSWYgc3VwcGxpZWQsIHRoZSBwYXJzZXIgd2lsbCB1c2UgaXQgdG8gZ2V0CithbGwgdG9rZW5zLgorPC9ibG9ja3F1b3RlPgorCis8cD4KKzxiPjx0dD5wLnJlc3RhcnQoKTwvdHQ+PC9iPgorPGJsb2NrcXVvdGU+CitSZXNldHMgdGhlIHBhcnNlciBzdGF0ZSBmb3IgYSBwYXJzZSBhbHJlYWR5IGluIHByb2dyZXNzLgorPC9ibG9ja3F1b3RlPgorCis8SDI+PGEgbmFtZT0iaW50ZXJuYWxfbm44Ij48L2E+OC4gUGFyc2VyUmVmbGVjdDwvSDI+CisKKworPHA+CitUaGUgPHR0PlBhcnNlclJlZmxlY3Q8L3R0PiBjbGFzcyBpcyB1c2VkIHRvIGNvbGxlY3QgcGFyc2VyIHNwZWNpZmljYXRpb24gZGF0YQorZnJvbSBhIFB5dGhvbiBtb2R1bGUgb3Igb2JqZWN0LiAgIFRoaXMgY2xhc3MgaXMgd2hhdCBjb2xsZWN0cyBhbGwgb2YgdGhlCis8dHQ+cF9ydWxlKCk8L3R0PiBmdW5jdGlvbnMgaW4gYSBQTFkgZmlsZSwgcGVyZm9ybXMgYmFzaWMgZXJyb3IgY2hlY2tpbmcsCithbmQgY29sbGVjdHMgYWxsIG9mIHRoZSBuZWVkZWQgaW5mb3JtYXRpb24gdG8gYnVpbGQgYSBncmFtbWFyLiAgICBNb3N0IG9mIHRoZQoraGlnaC1sZXZlbCBQTFkgaW50ZXJmYWNlIGFzIHVzZWQgYnkgdGhlIDx0dD55YWNjKCk8L3R0PiBmdW5jdGlvbiBpcyBhY3R1YWxseQoraW1wbGVtZW50ZWQgYnkgdGhpcyBjbGFzcy4KKworPHA+Cis8Yj48dHQ+UGFyc2VyUmVmbGVjdChwZGljdCwgbG9nPU5vbmUpPC90dD48L2I+Cis8YmxvY2txdW90ZT4KK0NyZWF0ZXMgYSA8dHQ+UGFyc2VyUmVmbGVjdDwvdHQ+IGluc3RhbmNlLiA8dHQ+cGRpY3Q8L3R0PiBpcyBhIGRpY3Rpb25hcnkKK2NvbnRhaW5pbmcgcGFyc2VyIHNwZWNpZmljYXRpb24gZGF0YS4gIFRoaXMgZGljdGlvbmFyeSB0eXBpY2FsbHkgY29ycmVzcG9uZHMKK3RvIHRoZSBtb2R1bGUgb3IgY2xhc3MgZGljdGlvbmFyeSBvZiBjb2RlIHRoYXQgaW1wbGVtZW50cyBhIFBMWSBwYXJzZXIuCis8dHQ+bG9nPC90dD4gaXMgYSBsb2dnZXIgaW5zdGFuY2UgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcmVwb3J0IGVycm9yCittZXNzYWdlcy4KKzwvYmxvY2txdW90ZT4KKworQW4gaW5zdGFuY2UgPHR0PnA8L3R0PiBvZiA8dHQ+UGFyc2VyUmVmbGVjdDwvdHQ+IGhhcyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisKKzxwPgorPGI+PHR0PnAuZ2V0X2FsbCgpPC90dD48L2I+Cis8YmxvY2txdW90ZT4KK0NvbGxlY3QgYW5kIHN0b3JlIGFsbCByZXF1aXJlZCBwYXJzaW5nIGluZm9ybWF0aW9uLgorPC9ibG9ja3F1b3RlPgorCis8cD4KKzxiPjx0dD5wLnZhbGlkYXRlX2FsbCgpPC90dD48L2I+Cis8YmxvY2txdW90ZT4KK1ZhbGlkYXRlIGFsbCBvZiB0aGUgY29sbGVjdGVkIHBhcnNpbmcgaW5mb3JtYXRpb24uICBUaGlzIGlzIGEgc2VwcmF0ZSBzdGVwCitmcm9tIDx0dD5wLmdldF9hbGwoKTwvdHQ+IGFzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLiAgSW4gb3JkZXIgdG8KK2luY3JlYXNlIHBhcnNlciBzdGFydC11cCB0aW1lLCBhIHBhcnNlciBjYW4gZWxlY3QgdG8gb25seSB2YWxpZGF0ZSB0aGUKK3BhcnNpbmcgZGF0YSB3aGVuIHJlZ2VuZXJhdGluZyB0aGUgcGFyc2luZyB0YWJsZXMuICAgVGhlIHZhbGlkYXRpb24KK3N0ZXAgdHJpZXMgdG8gY29sbGVjdCBhcyBtdWNoIGluZm9ybWF0aW9uIGFzIHBvc3NpYmxlIHJhdGhlciB0aGFuCityYWlzaW5nIGFuIGV4Y2VwdGlvbiBhdCB0aGUgZmlyc3Qgc2lnbiBvZiB0cm91YmxlLiAgVGhlIGF0dHJpYnV0ZQorPHR0PnAuZXJyb3I8L3R0PiBpcyBzZXQgaWYgdGhlcmUgYXJlIGFueSB2YWxpZGF0aW9uIGVycm9ycy4gIFRoZQordmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUgaXMgYWxzbyByZXR1cm5lZC4KKzwvYmxvY2txdW90ZT4KKworPHA+Cis8Yj48dHQ+cC5zaWduYXR1cmUoKTwvdHQ+PC9iPgorPGJsb2NrcXVvdGU+CitDb21wdXRlIGEgc2lnbmF0dXJlIHJlcHJlc2VudGluZyB0aGUgY29udGVudHMgb2YgdGhlIGNvbGxlY3RlZCBwYXJzaW5nCitkYXRhLiAgVGhlIHNpZ25hdHVyZSB2YWx1ZSBzaG91bGQgY2hhbmdlIGlmIGFueXRoaW5nIGluIHRoZSBwYXJzZXIKK3NwZWNpZmljYXRpb24gaGFzIGNoYW5nZWQgaW4gYSB3YXkgdGhhdCB3b3VsZCBqdXN0aWZ5IHBhcnNlciB0YWJsZQorcmVnZW5lcmF0aW9uLiAgIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgYWZ0ZXIgPHR0PnAuZ2V0X2FsbCgpPC90dD4sCitidXQgYmVmb3JlIDx0dD5wLnZhbGlkYXRlX2FsbCgpPC90dD4uCis8L2Jsb2NrcXVvdGU+CisKK1RoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgc2V0IGluIHRoZSBwcm9jZXNzIG9mIGNvbGxlY3RpbmcgZGF0YToKKworPHA+Cis8Yj48dHQ+cC5zdGFydDwvdHQ+PC9iPgorPGJsb2NrcXVvdGU+CitUaGUgZ3JhbW1hciBzdGFydCBzeW1ib2wsIGlmIGFueS4gVGFrZW4gZnJvbSA8dHQ+cGRpY3RbJ3N0YXJ0J108L3R0Pi4KKzwvYmxvY2txdW90ZT4KKworPHA+Cis8Yj48dHQ+cC5lcnJvcl9mdW5jPC90dD48L2I+Cis8YmxvY2txdW90ZT4KK1RoZSBlcnJvciBoYW5kbGluZyBmdW5jdGlvbiBvciA8dHQ+Tm9uZTwvdHQ+LiBUYWtlbiBmcm9tIDx0dD5wZGljdFsncF9lcnJvciddPC90dD4uCis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGI+PHR0PnAudG9rZW5zPC90dD48L2I+Cis8YmxvY2txdW90ZT4KK1RoZSB0b2tlbiBsaXN0LiBUYWtlbiBmcm9tIDx0dD5wZGljdFsndG9rZW5zJ108L3R0Pi4KKzwvYmxvY2txdW90ZT4KKworPHA+Cis8Yj48dHQ+cC5wcmVjPC90dD48L2I+Cis8YmxvY2txdW90ZT4KK1RoZSBwcmVjZWRlbmNlIHNwZWNpZmllci4gIFRha2VuIGZyb20gPHR0PnBkaWN0WydwcmVjZWRlbmNlJ108L3R0Pi4KKzwvYmxvY2txdW90ZT4KKworPHA+Cis8Yj48dHQ+cC5wcmVjbGlzdDwvdHQ+PC9iPgorPGJsb2NrcXVvdGU+CitBIHBhcnNlZCB2ZXJzaW9uIG9mIHRoZSBwcmVjZWRlbmNlIHNwZWNpZmllZC4gIEEgbGlzdCBvZiB0dXBsZXMgb2YgdGhlIGZvcm0KKzx0dD4odG9rZW4sYXNzb2MsbGV2ZWwpPC90dD4gd2hlcmUgPHR0PnRva2VuPC90dD4gaXMgdGhlIHRlcm1pbmFsIHN5bWJvbCwKKzx0dD5hc3NvYzwvdHQ+IGlzIHRoZSBhc3NvY2lhdGl2aXR5IChlLmcuLCA8dHQ+J2xlZnQnPC90dD4pIGFuZCA8dHQ+bGV2ZWw8L3R0PgoraXMgYSBudW1lcmljIHByZWNlZGVuY2UgbGV2ZWwuCis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGI+PHR0PnAuZ3JhbW1hcjwvdHQ+PC9iPgorPGJsb2NrcXVvdGU+CitBIGxpc3Qgb2YgdHVwbGVzIDx0dD4obmFtZSwgcnVsZXMpPC90dD4gcmVwcmVzZW50aW5nIHRoZSBncmFtbWFyIHJ1bGVzLiA8dHQ+bmFtZTwvdHQ+IGlzIHRoZQorbmFtZSBvZiBhIFB5dGhvbiBmdW5jdGlvbiBvciBtZXRob2QgaW4gPHR0PnBkaWN0PC90dD4gdGhhdCBzdGFydHMgd2l0aCA8dHQ+InBfIjwvdHQ+LgorPHR0PnJ1bGVzPC90dD4gaXMgYSBsaXN0IG9mIHR1cGxlcyA8dHQ+KGZpbGVuYW1lLGxpbmUscHJvZG5hbWUsc3ltcyk8L3R0PiByZXByZXNlbnRpbmcKK3RoZSBncmFtbWFyIHJ1bGVzIGZvdW5kIGluIHRoZSBkb2N1bWVudGF0aW9uIHN0cmluZyBvZiB0aGF0IGZ1bmN0aW9uLiA8dHQ+ZmlsZW5hbWU8L3R0PiBhbmQgPHR0PmxpbmU8L3R0PiBjb250YWluIGxvY2F0aW9uCitpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcuIDx0dD5wcm9kbmFtZTwvdHQ+IGlzIHRoZSBuYW1lIG9mIHRoZSAKK3Byb2R1Y3Rpb24uIDx0dD5zeW1zPC90dD4gaXMgdGhlIHJpZ2h0LWhhbmQgc2lkZSBvZiB0aGUgcHJvZHVjdGlvbi4gIElmIHlvdSBoYXZlIGEKK2Z1bmN0aW9uIGxpa2UgdGhpcworCis8cHJlPgorZGVmIHBfZXhwcihwKToKKyAgICAnJydleHByIDogZXhwciBQTFVTIGV4cHIKKyAgICAgICAgICAgIHwgZXhwciBNSU5VUyBleHByCisgICAgICAgICAgICB8IGV4cHIgVElNRVMgZXhwcgorICAgICAgICAgICAgfCBleHByIERJVklERSBleHByJycnCis8L3ByZT4KKwordGhlbiB0aGUgY29ycmVzcG9uZGluZyBlbnRyeSBpbiA8dHQ+cC5ncmFtbWFyPC90dD4gbWlnaHQgbG9vayBsaWtlIHRoaXM6CisKKzxwcmU+CisoJ3BfZXhwcicsIFsgKCdjYWxjLnB5JywxMCwnZXhwcicsIFsnZXhwcicsJ1BMVVMnLCdleHByJ10pLAorICAgICAgICAgICAgICgnY2FsYy5weScsMTEsJ2V4cHInLCBbJ2V4cHInLCdNSU5VUycsJ2V4cHInXSksCisgICAgICAgICAgICAgKCdjYWxjLnB5JywxMiwnZXhwcicsIFsnZXhwcicsJ1RJTUVTJywnZXhwciddKSwKKyAgICAgICAgICAgICAoJ2NhbGMucHknLDEzLCdleHByJywgWydleHByJywnRElWSURFJywnZXhwciddKQorICAgICAgICAgICBdKQorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGI+PHR0PnAucGZ1bmNzPC90dD48L2I+Cis8YmxvY2txdW90ZT4KK0Egc29ydGVkIGxpc3Qgb2YgdHVwbGVzIDx0dD4obGluZSwgZmlsZSwgbmFtZSwgZG9jKTwvdHQ+IHJlcHJlc2VudGluZyBhbGwgb2YKK3RoZSA8dHQ+cF88L3R0PiBmdW5jdGlvbnMgZm91bmQuIDx0dD5saW5lPC90dD4gYW5kIDx0dD5maWxlPC90dD4gZ2l2ZSBsb2NhdGlvbgoraW5mb3JtYXRpb24uICA8dHQ+bmFtZTwvdHQ+IGlzIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi4gPHR0PmRvYzwvdHQ+IGlzIHRoZQorZG9jdW1lbnRhdGlvbiBzdHJpbmcuICAgVGhpcyBsaXN0IGlzIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIgYnkgbGluZSBudW1iZXIuCis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGI+PHR0PnAuZmlsZXM8L3R0PjwvYj4KKzxibG9ja3F1b3RlPgorQSBkaWN0aW9uYXJ5IGhvbGRpbmcgYWxsIG9mIHRoZSBzb3VyY2UgZmlsZW5hbWVzIHRoYXQgd2VyZSBlbmNvdW50ZXJlZAord2hpbGUgY29sbGVjdGluZyBwYXJzZXIgaW5mb3JtYXRpb24uICBPbmx5IHRoZSBrZXlzIG9mIHRoaXMgZGljdGlvbmFyeSBoYXZlCithbnkgbWVhbmluZy4KKzwvYmxvY2txdW90ZT4KKworPHA+Cis8Yj48dHQ+cC5lcnJvcjwvdHQ+PC9iPgorPGJsb2NrcXVvdGU+CitBbiBhdHRyaWJ1dGUgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgYW55IGNyaXRpY2FsIGVycm9ycyAKK29jY3VycmVkIGluIHZhbGlkYXRpb24uICBJZiB0aGlzIGlzIHNldCwgaXQgbWVhbnMgdGhhdCB0aGF0IHNvbWUga2luZAorb2YgcHJvYmxlbSB3YXMgZGV0ZWN0ZWQgYW5kIHRoYXQgbm8gZnVydGhlciBwcm9jZXNzaW5nIHNob3VsZCBiZQorcGVyZm9ybWVkLgorPC9ibG9ja3F1b3RlPgorCisKKzxIMj48YSBuYW1lPSJpbnRlcm5hbF9ubjkiPjwvYT45LiBIaWdoLWxldmVsIG9wZXJhdGlvbjwvSDI+CisKKworVXNpbmcgYWxsIG9mIHRoZSBhYm92ZSBjbGFzc2VzIHJlcXVpcmVzIHNvbWUgYXR0ZW50aW9uIHRvIGRldGFpbC4gIFRoZSA8dHQ+eWFjYygpPC90dD4KK2Z1bmN0aW9uIGNhcnJpZXMgb3V0IGEgdmVyeSBzcGVjaWZpYyBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIHRvIGNyZWF0ZSBhIGdyYW1tYXIuCitUaGlzIHNhbWUgc2VxdWVuY2Ugc2hvdWxkIGJlIGVtdWxhdGVkIGlmIHlvdSBidWlsZCBhbiBhbHRlcm5hdGl2ZSBQTFkgaW50ZXJmYWNlLgorCis8b2w+Cis8bGk+QSA8dHQ+UGFyc2VyUmVmbGVjdDwvdHQ+IG9iamVjdCBpcyBjcmVhdGVkIGFuZCByYXcgZ3JhbW1hciBzcGVjaWZpY2F0aW9uIGRhdGEgaXMKK2NvbGxlY3RlZC4KKzxsaT5BIDx0dD5HcmFtbWFyPC90dD4gb2JqZWN0IGlzIGNyZWF0ZWQgYW5kIHBvcHVsYXRlZCB3aXRoIGluZm9ybWF0aW9uCitmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGRhdGEuCis8bGk+QSA8dHQ+TFJHZW5lcmF0b3I8L3R0PiBvYmplY3QgaXMgY3JlYXRlZCB0byBydW4gdGhlIExBTFIgYWxnb3JpdGhtIG92ZXIKK3RoZSA8dHQ+R3JhbW1hcjwvdHQ+IG9iamVjdC4KKzxsaT5Qcm9kdWN0aW9ucyBpbiB0aGUgTFJHZW5lcmF0b3IgYW5kIGJvdW5kIHRvIGNhbGxhYmxlcyB1c2luZyB0aGUgPHR0PmJpbmRfY2FsbGFibGVzKCk8L3R0PgorbWV0aG9kLgorPGxpPkEgPHR0PkxSUGFyc2VyPC90dD4gb2JqZWN0IGlzIGNyZWF0ZWQgZnJvbSBmcm9tIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUKKzx0dD5MUkdlbmVyYXRvcjwvdHQ+IG9iamVjdC4KKzwvb2w+CisKKzwvYm9keT4KKzwvaHRtbD4KKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvcGx5L2RvYy9tYWtlZG9jLnB5IGIvcGx5L2RvYy9tYWtlZG9jLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNWE1M2EKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvZG9jL21ha2Vkb2MucHkKQEAgLTAsMCArMSwxOTQgQEAKKyMhL3Vzci9sb2NhbC9iaW4vcHl0aG9uCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGFrZXMgYSBjaGFwdGVyIGFzIGlucHV0IGFuZCBhZGRzIGludGVybmFsIGxpbmtzIGFuZCBudW1iZXJpbmcgdG8gYWxsCisjIG9mIHRoZSBIMSwgSDIsIEgzLCBINCBhbmQgSDUgc2VjdGlvbnMuCisjCisjIEV2ZXJ5IGhlYWRpbmcgSFRNTCB0YWcgKEgxLCBIMiBldGMpIGlzIGdpdmVuIGFuIGF1dG9nZW5lcmF0ZWQgbmFtZSB0byBsaW5rCisjIHRvLiBIb3dldmVyLCBpZiB0aGUgbmFtZSBpcyBub3QgYW4gYXV0b2dlbmVyYXRlZCBuYW1lIGZyb20gYSBwcmV2aW91cyBydW4sCisjIGl0IHdpbGwgYmUga2VwdC4gSWYgaXQgaXMgYXV0b2dlbmVyYXRlZCwgaXQgbWlnaHQgY2hhbmdlIG9uIHN1YnNlcXVlbnQgcnVucworIyBvZiB0aGlzIHByb2dyYW0uIFRodXMgaWYgeW91IHdhbnQgdG8gY3JlYXRlIGxpbmtzIHRvIG9uZSBvZiB0aGUgaGVhZGluZ3MsCisjIHRoZW4gY2hhbmdlIHRoZSBoZWFkaW5nIGxpbmsgbmFtZSB0byBzb21ldGhpbmcgdGhhdCBkb2VzIG5vdCBsb29rIGxpa2UgYW4KKyMgYXV0b2dlbmVyYXRlZCBsaW5rIG5hbWUuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2ltcG9ydCBzeXMKK2ltcG9ydCByZQoraW1wb3J0IHN0cmluZworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEZ1bmN0aW9ucworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFJlZ2V4cyBmb3IgPGEgbmFtZT0iLi4uIj48L2E+CithbGluayA9IHJlLmNvbXBpbGUociI8YSAqbmFtZSAqPSAqXCIoLiopXCI+PC9hPiIsIHJlLklHTk9SRUNBU0UpCitoZWFkaW5nID0gcmUuY29tcGlsZShyIihfbm5cZCkiLCByZS5JR05PUkVDQVNFKQorCitkZWYgZ2V0aGVhZGluZ25hbWUobSk6CisgICAgYXV0b2dlbmVyYXRlZGhlYWRpbmcgPSBUcnVlOworICAgIGlmIG0uZ3JvdXAoMSkgIT0gTm9uZToKKyAgICAgICAgYW1hdGNoID0gYWxpbmsubWF0Y2gobS5ncm91cCgxKSkKKyAgICAgICAgaWYgYW1hdGNoOgorICAgICAgICAgICAgIyBBIG5vbi1hdXRvZ2VuZXJhdGVkIGhlYWRpbmcgLSBrZWVwIGl0CisgICAgICAgICAgICBoZWFkaW5nbmFtZSA9IGFtYXRjaC5ncm91cCgxKQorICAgICAgICAgICAgYXV0b2dlbmVyYXRlZGhlYWRpbmcgPSBoZWFkaW5nLm1hdGNoKGhlYWRpbmduYW1lKQorICAgIGlmIGF1dG9nZW5lcmF0ZWRoZWFkaW5nOgorICAgICAgICAjIFRoZSBoZWFkaW5nIG5hbWUgd2FzIGVpdGhlciBub24tZXhpc3RlbnQgb3IgYXV0b2dlbmVyYXRlZCwKKyAgICAgICAgIyBXZSBjYW4gY3JlYXRlIGEgbmV3IGhlYWRpbmcgLyBjaGFuZ2UgdGhlIGV4aXN0aW5nIGhlYWRpbmcKKyAgICAgICAgaGVhZGluZ25hbWUgPSAiJXNfbm4lZCIgJSAoZmlsZW5hbWViYXNlLCBuYW1laW5kZXgpCisgICAgcmV0dXJuIGhlYWRpbmduYW1lCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTWFpbiBwcm9ncmFtCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2lmIGxlbihzeXMuYXJndikgIT0gMjoKKyAgICBwcmludCAidXNhZ2U6IG1ha2Vkb2MucHkgZmlsZW5hbWUiCisgICAgc3lzLmV4aXQoMSkKKworZmlsZW5hbWUgPSBzeXMuYXJndlsxXQorZmlsZW5hbWViYXNlID0gc3RyaW5nLnNwbGl0KGZpbGVuYW1lLCIuIilbMF0KKworc2VjdGlvbiA9IDAKK3N1YnNlY3Rpb24gPSAwCitzdWJzdWJzZWN0aW9uID0gMAorc3Vic3Vic3Vic2VjdGlvbiA9IDAKK25hbWVpbmRleCA9IDAKKworbmFtZSA9ICIiCisKKyMgUmVnZXhzIGZvciA8aDE+LC4uLiA8aDU+IHNlY3Rpb25zCisKK2gxID0gcmUuY29tcGlsZShyIi4qPzxIMT4oPGEuKmE+KSpbXGRcLlxzXSooLio/KTwvSDE+IiwgcmUuSUdOT1JFQ0FTRSkKK2gyID0gcmUuY29tcGlsZShyIi4qPzxIMj4oPGEuKmE+KSpbXGRcLlxzXSooLio/KTwvSDI+IiwgcmUuSUdOT1JFQ0FTRSkKK2gzID0gcmUuY29tcGlsZShyIi4qPzxIMz4oPGEuKmE+KSpbXGRcLlxzXSooLio/KTwvSDM+IiwgcmUuSUdOT1JFQ0FTRSkKK2g0ID0gcmUuY29tcGlsZShyIi4qPzxIND4oPGEuKmE+KSpbXGRcLlxzXSooLio/KTwvSDQ+IiwgcmUuSUdOT1JFQ0FTRSkKK2g1ID0gcmUuY29tcGlsZShyIi4qPzxINT4oPGEuKmE+KSpbXGRcLlxzXSooLio/KTwvSDU+IiwgcmUuSUdOT1JFQ0FTRSkKKworZGF0YSA9IG9wZW4oZmlsZW5hbWUpLnJlYWQoKSAgICAgICAgICAgICMgUmVhZCBkYXRhCitvcGVuKGZpbGVuYW1lKyIuYmFrIiwidyIpLndyaXRlKGRhdGEpICAgIyBNYWtlIGJhY2t1cAorCitsaW5lcyA9IGRhdGEuc3BsaXRsaW5lcygpCityZXN1bHQgPSBbIF0gIyBUaGlzIGlzIHRoZSByZXN1bHQgb2YgcG9zdHByb2Nlc3NpbmcgdGhlIGZpbGUKK2luZGV4ID0gIjwhLS0gSU5ERVggLS0+XG48ZGl2IGNsYXNzPVwic2VjdGlvbnRvY1wiPlxuIiAjIGluZGV4IGNvbnRhaW5zIHRoZSBpbmRleCBmb3IgYWRkaW5nIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUuIEFsc28gcHJpbnRlZCB0byBzdGRvdXQuCisKK3NraXAgPSAwCitza2lwc3BhY2UgPSAwCisKK2ZvciBzIGluIGxpbmVzOgorICAgIGlmIHMgPT0gIjwhLS0gSU5ERVggLS0+IjoKKyAgICAgICAgaWYgbm90IHNraXA6CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJASU5ERVhAIikKKyAgICAgICAgICAgIHNraXAgPSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBza2lwID0gMAorICAgICAgICBjb250aW51ZTsKKyAgICBpZiBza2lwOgorICAgICAgICBjb250aW51ZQorCisgICAgaWYgbm90IHMgYW5kIHNraXBzcGFjZToKKyAgICAgICAgY29udGludWUKKworICAgIGlmIHNraXBzcGFjZToKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiIikKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiIikKKyAgICAgICAgc2tpcHNwYWNlID0gMAorICAgIAorICAgIG0gPSBoMi5tYXRjaChzKQorICAgIGlmIG06CisgICAgICAgIHByZXZoZWFkaW5ndGV4dCA9IG0uZ3JvdXAoMikKKyAgICAgICAgbmFtZWluZGV4ICs9IDEKKyAgICAgICAgc2VjdGlvbiArPSAxCisgICAgICAgIGhlYWRpbmduYW1lID0gZ2V0aGVhZGluZ25hbWUobSkKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiIiI8SDI+PGEgbmFtZT0iJXMiPjwvYT4lZC4gJXM8L0gyPiIiIiAlIChoZWFkaW5nbmFtZSxzZWN0aW9uLCBwcmV2aGVhZGluZ3RleHQpKQorCisgICAgICAgIGlmIHN1YnN1YnN1YnNlY3Rpb246CisgICAgICAgICAgICBpbmRleCArPSAiPC91bD5cbiIKKyAgICAgICAgaWYgc3Vic3Vic2VjdGlvbjoKKyAgICAgICAgICAgIGluZGV4ICs9ICI8L3VsPlxuIgorICAgICAgICBpZiBzdWJzZWN0aW9uOgorICAgICAgICAgICAgaW5kZXggKz0gIjwvdWw+XG4iCisgICAgICAgIGlmIHNlY3Rpb24gPT0gMToKKyAgICAgICAgICAgIGluZGV4ICs9ICI8dWw+XG4iCisKKyAgICAgICAgaW5kZXggKz0gIiIiPGxpPjxhIGhyZWY9IiMlcyI+JXM8L2E+XG4iIiIgJSAoaGVhZGluZ25hbWUscHJldmhlYWRpbmd0ZXh0KQorICAgICAgICBzdWJzZWN0aW9uID0gMAorICAgICAgICBzdWJzdWJzZWN0aW9uID0gMAorICAgICAgICBzdWJzdWJzdWJzZWN0aW9uID0gMAorICAgICAgICBza2lwc3BhY2UgPSAxICAgICAgICAKKyAgICAgICAgY29udGludWUKKyAgICBtID0gaDMubWF0Y2gocykKKyAgICBpZiBtOgorICAgICAgICBwcmV2aGVhZGluZ3RleHQgPSBtLmdyb3VwKDIpCisgICAgICAgIG5hbWVpbmRleCArPSAxCisgICAgICAgIHN1YnNlY3Rpb24gKz0gMQorICAgICAgICBoZWFkaW5nbmFtZSA9IGdldGhlYWRpbmduYW1lKG0pCisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiIiPEgzPjxhIG5hbWU9IiVzIj48L2E+JWQuJWQgJXM8L0gzPiIiIiAlIChoZWFkaW5nbmFtZSxzZWN0aW9uLCBzdWJzZWN0aW9uLCBwcmV2aGVhZGluZ3RleHQpKQorCisgICAgICAgIGlmIHN1YnN1YnN1YnNlY3Rpb246CisgICAgICAgICAgICBpbmRleCArPSAiPC91bD5cbiIKKyAgICAgICAgaWYgc3Vic3Vic2VjdGlvbjoKKyAgICAgICAgICAgIGluZGV4ICs9ICI8L3VsPlxuIgorICAgICAgICBpZiBzdWJzZWN0aW9uID09IDE6CisgICAgICAgICAgICBpbmRleCArPSAiPHVsPlxuIgorCisgICAgICAgIGluZGV4ICs9ICIiIjxsaT48YSBocmVmPSIjJXMiPiVzPC9hPlxuIiIiICUgKGhlYWRpbmduYW1lLHByZXZoZWFkaW5ndGV4dCkKKyAgICAgICAgc3Vic3Vic2VjdGlvbiA9IDAKKyAgICAgICAgc2tpcHNwYWNlID0gMSAgICAgICAgCisgICAgICAgIGNvbnRpbnVlCisgICAgbSA9IGg0Lm1hdGNoKHMpCisgICAgaWYgbToKKyAgICAgICAgcHJldmhlYWRpbmd0ZXh0ID0gbS5ncm91cCgyKQorICAgICAgICBuYW1laW5kZXggKz0gMQorICAgICAgICBzdWJzdWJzZWN0aW9uICs9IDEKKyAgICAgICAgc3Vic3Vic3Vic2VjdGlvbiA9IDAKKyAgICAgICAgaGVhZGluZ25hbWUgPSBnZXRoZWFkaW5nbmFtZShtKQorICAgICAgICByZXN1bHQuYXBwZW5kKCIiIjxIND48YSBuYW1lPSIlcyI+PC9hPiVkLiVkLiVkICVzPC9IND4iIiIgJSAoaGVhZGluZ25hbWUsc2VjdGlvbiwgc3Vic2VjdGlvbiwgc3Vic3Vic2VjdGlvbiwgcHJldmhlYWRpbmd0ZXh0KSkKKworICAgICAgICBpZiBzdWJzdWJzdWJzZWN0aW9uOgorICAgICAgICAgICAgaW5kZXggKz0gIjwvdWw+XG4iCisgICAgICAgIGlmIHN1YnN1YnNlY3Rpb24gPT0gMToKKyAgICAgICAgICAgIGluZGV4ICs9ICI8dWw+XG4iCisKKyAgICAgICAgaW5kZXggKz0gIiIiPGxpPjxhIGhyZWY9IiMlcyI+JXM8L2E+XG4iIiIgJSAoaGVhZGluZ25hbWUscHJldmhlYWRpbmd0ZXh0KQorICAgICAgICBza2lwc3BhY2UgPSAxICAgICAgICAKKyAgICAgICAgY29udGludWUKKyAgICBtID0gaDUubWF0Y2gocykKKyAgICBpZiBtOgorICAgICAgICBwcmV2aGVhZGluZ3RleHQgPSBtLmdyb3VwKDIpCisgICAgICAgIG5hbWVpbmRleCArPSAxCisgICAgICAgIHN1YnN1YnN1YnNlY3Rpb24gKz0gMQorICAgICAgICBoZWFkaW5nbmFtZSA9IGdldGhlYWRpbmduYW1lKG0pCisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiIiPEg1PjxhIG5hbWU9IiVzIj48L2E+JWQuJWQuJWQuJWQgJXM8L0g1PiIiIiAlIChoZWFkaW5nbmFtZSxzZWN0aW9uLCBzdWJzZWN0aW9uLCBzdWJzdWJzZWN0aW9uLCBzdWJzdWJzdWJzZWN0aW9uLCBwcmV2aGVhZGluZ3RleHQpKQorCisgICAgICAgIGlmIHN1YnN1YnN1YnNlY3Rpb24gPT0gMToKKyAgICAgICAgICAgIGluZGV4ICs9ICI8dWw+XG4iCisKKyAgICAgICAgaW5kZXggKz0gIiIiPGxpPjxhIGhyZWY9IiMlcyI+JXM8L2E+XG4iIiIgJSAoaGVhZGluZ25hbWUscHJldmhlYWRpbmd0ZXh0KQorICAgICAgICBza2lwc3BhY2UgPSAxCisgICAgICAgIGNvbnRpbnVlCisgICAgCisgICAgcmVzdWx0LmFwcGVuZChzKQorCitpZiBzdWJzdWJzdWJzZWN0aW9uOgorICAgIGluZGV4ICs9ICI8L3VsPlxuIgorCitpZiBzdWJzdWJzZWN0aW9uOgorICAgIGluZGV4ICs9ICI8L3VsPlxuIgorCitpZiBzdWJzZWN0aW9uOgorICAgIGluZGV4ICs9ICI8L3VsPlxuIgorCitpZiBzZWN0aW9uOgorICAgIGluZGV4ICs9ICI8L3VsPlxuIgorCitpbmRleCArPSAiPC9kaXY+XG48IS0tIElOREVYIC0tPlxuIgorCitkYXRhID0gIlxuIi5qb2luKHJlc3VsdCkKKworZGF0YSA9IGRhdGEucmVwbGFjZSgiQElOREVYQCIsaW5kZXgpICsgIlxuIjsKKworIyBXcml0ZSB0aGUgZmlsZSBiYWNrIG91dAorb3BlbihmaWxlbmFtZSwidyIpLndyaXRlKGRhdGEpCisKKwpkaWZmIC0tZ2l0IGEvcGx5L2RvYy9wbHkuaHRtbCBiL3BseS9kb2MvcGx5Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhjY2RjYgotLS0gL2Rldi9udWxsCisrKyBiL3BseS9kb2MvcGx5Lmh0bWwKQEAgLTAsMCArMSwzNDk2IEBACis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPlBMWSAoUHl0aG9uIExleC1ZYWNjKTwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keSBiZ2NvbG9yPSIjZmZmZmZmIj4KKworPGgxPlBMWSAoUHl0aG9uIExleC1ZYWNjKTwvaDE+CisgCis8Yj4KK0RhdmlkIE0uIEJlYXpsZXkgPGJyPgorZGF2ZUBkYWJlYXouY29tPGJyPgorPC9iPgorCis8cD4KKzxiPlBMWSBWZXJzaW9uOiAzLjEwPC9iPgorPHA+CisKKzwhLS0gSU5ERVggLS0+Cis8ZGl2IGNsYXNzPSJzZWN0aW9udG9jIj4KKzx1bD4KKzxsaT48YSBocmVmPSIjcGx5X25uMSI+UHJlZmFjZSBhbmQgUmVxdWlyZW1lbnRzPC9hPgorPGxpPjxhIGhyZWY9IiNwbHlfbm4xIj5JbnRyb2R1Y3Rpb248L2E+Cis8bGk+PGEgaHJlZj0iI3BseV9ubjIiPlBMWSBPdmVydmlldzwvYT4KKzxsaT48YSBocmVmPSIjcGx5X25uMyI+TGV4PC9hPgorPHVsPgorPGxpPjxhIGhyZWY9IiNwbHlfbm40Ij5MZXggRXhhbXBsZTwvYT4KKzxsaT48YSBocmVmPSIjcGx5X25uNSI+VGhlIHRva2VucyBsaXN0PC9hPgorPGxpPjxhIGhyZWY9IiNwbHlfbm42Ij5TcGVjaWZpY2F0aW9uIG9mIHRva2VuczwvYT4KKzxsaT48YSBocmVmPSIjcGx5X25uNyI+VG9rZW4gdmFsdWVzPC9hPgorPGxpPjxhIGhyZWY9IiNwbHlfbm44Ij5EaXNjYXJkZWQgdG9rZW5zPC9hPgorPGxpPjxhIGhyZWY9IiNwbHlfbm45Ij5MaW5lIG51bWJlcnMgYW5kIHBvc2l0aW9uYWwgaW5mb3JtYXRpb248L2E+Cis8bGk+PGEgaHJlZj0iI3BseV9ubjEwIj5JZ25vcmVkIGNoYXJhY3RlcnM8L2E+Cis8bGk+PGEgaHJlZj0iI3BseV9ubjExIj5MaXRlcmFsIGNoYXJhY3RlcnM8L2E+Cis8bGk+PGEgaHJlZj0iI3BseV9ubjEyIj5FcnJvciBoYW5kbGluZzwvYT4KKzxsaT48YSBocmVmPSIjcGx5X25uMTQiPkVPRiBIYW5kbGluZzwvYT4KKzxsaT48YSBocmVmPSIjcGx5X25uMTMiPkJ1aWxkaW5nIGFuZCB1c2luZyB0aGUgbGV4ZXI8L2E+Cis8bGk+PGEgaHJlZj0iI3BseV9ubjE0Ij5UaGUgQFRPS0VOIGRlY29yYXRvcjwvYT4KKzxsaT48YSBocmVmPSIjcGx5X25uMTUiPk9wdGltaXplZCBtb2RlPC9hPgorPGxpPjxhIGhyZWY9IiNwbHlfbm4xNiI+RGVidWdnaW5nPC9hPgorPGxpPjxhIGhyZWY9IiNwbHlfbm4xNyI+QWx0ZXJuYXRpdmUgc3BlY2lmaWNhdGlvbiBvZiBsZXhlcnM8L2E+Cis8bGk+PGEgaHJlZj0iI3BseV9ubjE4Ij5NYWludGFpbmluZyBzdGF0ZTwvYT4KKzxsaT48YSBocmVmPSIjcGx5X25uMTkiPkxleGVyIGNsb25pbmc8L2E+Cis8bGk+PGEgaHJlZj0iI3BseV9ubjIwIj5JbnRlcm5hbCBsZXhlciBzdGF0ZTwvYT4KKzxsaT48YSBocmVmPSIjcGx5X25uMjEiPkNvbmRpdGlvbmFsIGxleGluZyBhbmQgc3RhcnQgY29uZGl0aW9uczwvYT4KKzxsaT48YSBocmVmPSIjcGx5X25uMjEiPk1pc2NlbGxhbmVvdXMgSXNzdWVzPC9hPgorPC91bD4KKzxsaT48YSBocmVmPSIjcGx5X25uMjIiPlBhcnNpbmcgYmFzaWNzPC9hPgorPGxpPjxhIGhyZWY9IiNwbHlfbm4yMyI+WWFjYzwvYT4KKzx1bD4KKzxsaT48YSBocmVmPSIjcGx5X25uMjQiPkFuIGV4YW1wbGU8L2E+Cis8bGk+PGEgaHJlZj0iI3BseV9ubjI1Ij5Db21iaW5pbmcgR3JhbW1hciBSdWxlIEZ1bmN0aW9uczwvYT4KKzxsaT48YSBocmVmPSIjcGx5X25uMjYiPkNoYXJhY3RlciBMaXRlcmFsczwvYT4KKzxsaT48YSBocmVmPSIjcGx5X25uMjYiPkVtcHR5IFByb2R1Y3Rpb25zPC9hPgorPGxpPjxhIGhyZWY9IiNwbHlfbm4yOCI+Q2hhbmdpbmcgdGhlIHN0YXJ0aW5nIHN5bWJvbDwvYT4KKzxsaT48YSBocmVmPSIjcGx5X25uMjciPkRlYWxpbmcgV2l0aCBBbWJpZ3VvdXMgR3JhbW1hcnM8L2E+Cis8bGk+PGEgaHJlZj0iI3BseV9ubjI4Ij5UaGUgcGFyc2VyLm91dCBmaWxlPC9hPgorPGxpPjxhIGhyZWY9IiNwbHlfbm4yOSI+U3ludGF4IEVycm9yIEhhbmRsaW5nPC9hPgorPHVsPgorPGxpPjxhIGhyZWY9IiNwbHlfbm4zMCI+UmVjb3ZlcnkgYW5kIHJlc3luY2hyb25pemF0aW9uIHdpdGggZXJyb3IgcnVsZXM8L2E+Cis8bGk+PGEgaHJlZj0iI3BseV9ubjMxIj5QYW5pYyBtb2RlIHJlY292ZXJ5PC9hPgorPGxpPjxhIGhyZWY9IiNwbHlfbm4zNSI+U2lnbmFsbGluZyBhbiBlcnJvciBmcm9tIGEgcHJvZHVjdGlvbjwvYT4KKzxsaT48YSBocmVmPSIjcGx5X25uMzgiPldoZW4gRG8gU3ludGF4IEVycm9ycyBHZXQgUmVwb3J0ZWQ8L2E+Cis8bGk+PGEgaHJlZj0iI3BseV9ubjMyIj5HZW5lcmFsIGNvbW1lbnRzIG9uIGVycm9yIGhhbmRsaW5nPC9hPgorPC91bD4KKzxsaT48YSBocmVmPSIjcGx5X25uMzMiPkxpbmUgTnVtYmVyIGFuZCBQb3NpdGlvbiBUcmFja2luZzwvYT4KKzxsaT48YSBocmVmPSIjcGx5X25uMzQiPkFTVCBDb25zdHJ1Y3Rpb248L2E+Cis8bGk+PGEgaHJlZj0iI3BseV9ubjM1Ij5FbWJlZGRlZCBBY3Rpb25zPC9hPgorPGxpPjxhIGhyZWY9IiNwbHlfbm4zNiI+TWlzY2VsbGFuZW91cyBZYWNjIE5vdGVzPC9hPgorPC91bD4KKzxsaT48YSBocmVmPSIjcGx5X25uMzciPk11bHRpcGxlIFBhcnNlcnMgYW5kIExleGVyczwvYT4KKzxsaT48YSBocmVmPSIjcGx5X25uMzgiPlVzaW5nIFB5dGhvbidzIE9wdGltaXplZCBNb2RlPC9hPgorPGxpPjxhIGhyZWY9IiNwbHlfbm40NCI+QWR2YW5jZWQgRGVidWdnaW5nPC9hPgorPHVsPgorPGxpPjxhIGhyZWY9IiNwbHlfbm40NSI+RGVidWdnaW5nIHRoZSBsZXgoKSBhbmQgeWFjYygpIGNvbW1hbmRzPC9hPgorPGxpPjxhIGhyZWY9IiNwbHlfbm40NiI+UnVuLXRpbWUgRGVidWdnaW5nPC9hPgorPC91bD4KKzxsaT48YSBocmVmPSIjcGx5X25uNDkiPlBhY2thZ2luZyBBZHZpY2U8L2E+Cis8bGk+PGEgaHJlZj0iI3BseV9ubjM5Ij5XaGVyZSB0byBnbyBmcm9tIGhlcmU/PC9hPgorPC91bD4KKzwvZGl2PgorPCEtLSBJTkRFWCAtLT4KKworCisKKworCisKKzxIMj48YSBuYW1lPSJwbHlfbm4xIj48L2E+MS4gUHJlZmFjZSBhbmQgUmVxdWlyZW1lbnRzPC9IMj4KKworCis8cD4KK1RoaXMgZG9jdW1lbnQgcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgbGV4aW5nIGFuZCBwYXJzaW5nIHdpdGggUExZLgorR2l2ZW4gdGhlIGludHJpbnNpYyBjb21wbGV4aXR5IG9mIHBhcnNpbmcsIEkgd291bGQgc3Ryb25nbHkgYWR2aXNlIAordGhhdCB5b3UgcmVhZCAob3IgYXQgbGVhc3Qgc2tpbSkgdGhpcyBlbnRpcmUgZG9jdW1lbnQgYmVmb3JlIGp1bXBpbmcKK2ludG8gYSBiaWcgZGV2ZWxvcG1lbnQgcHJvamVjdCB3aXRoIFBMWS4gIAorPC9wPgorCis8cD4KK1BMWS0zLjUgaXMgY29tcGF0aWJsZSB3aXRoIGJvdGggUHl0aG9uIDIgYW5kIFB5dGhvbiAzLiAgSWYgeW91IGFyZSB1c2luZworUHl0aG9uIDIsIHlvdSBoYXZlIHRvIHVzZSBQeXRob24gMi42IG9yIG5ld2VyLgorPC9wPgorCis8SDI+PGEgbmFtZT0icGx5X25uMSI+PC9hPjIuIEludHJvZHVjdGlvbjwvSDI+CisKKworUExZIGlzIGEgcHVyZS1QeXRob24gaW1wbGVtZW50YXRpb24gb2YgdGhlIHBvcHVsYXIgY29tcGlsZXIKK2NvbnN0cnVjdGlvbiB0b29scyBsZXggYW5kIHlhY2MuIFRoZSBtYWluIGdvYWwgb2YgUExZIGlzIHRvIHN0YXkKK2ZhaXJseSBmYWl0aGZ1bCB0byB0aGUgd2F5IGluIHdoaWNoIHRyYWRpdGlvbmFsIGxleC95YWNjIHRvb2xzIHdvcmsuCitUaGlzIGluY2x1ZGVzIHN1cHBvcnRpbmcgTEFMUigxKSBwYXJzaW5nIGFzIHdlbGwgYXMgcHJvdmlkaW5nCitleHRlbnNpdmUgaW5wdXQgdmFsaWRhdGlvbiwgZXJyb3IgcmVwb3J0aW5nLCBhbmQgZGlhZ25vc3RpY3MuICBUaHVzLAoraWYgeW91J3ZlIHVzZWQgeWFjYyBpbiBhbm90aGVyIHByb2dyYW1taW5nIGxhbmd1YWdlLCBpdCBzaG91bGQgYmUKK3JlbGF0aXZlbHkgc3RyYWlnaHRmb3J3YXJkIHRvIHVzZSBQTFkuICAKKworPHA+CitFYXJseSB2ZXJzaW9ucyBvZiBQTFkgd2VyZSBkZXZlbG9wZWQgdG8gc3VwcG9ydCBhbiBJbnRyb2R1Y3Rpb24gdG8KK0NvbXBpbGVycyBDb3Vyc2UgSSB0YXVnaHQgaW4gMjAwMSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBDaGljYWdvLiAKK1NpbmNlIFBMWSB3YXMgcHJpbWFyaWx5IGRldmVsb3BlZCBhcyBhbiBpbnN0cnVjdGlvbmFsIHRvb2wsIHlvdSB3aWxsCitmaW5kIGl0IHRvIGJlIGZhaXJseSBwaWNreSBhYm91dCB0b2tlbiBhbmQgZ3JhbW1hciBydWxlCitzcGVjaWZpY2F0aW9uLiBJbiBwYXJ0LCB0aGlzCithZGRlZCBmb3JtYWxpdHkgaXMgbWVhbnQgdG8gY2F0Y2ggY29tbW9uIHByb2dyYW1taW5nIG1pc3Rha2VzIG1hZGUgYnkKK25vdmljZSB1c2Vycy4gIEhvd2V2ZXIsIGFkdmFuY2VkIHVzZXJzIHdpbGwgYWxzbyBmaW5kIHN1Y2ggZmVhdHVyZXMgdG8KK2JlIHVzZWZ1bCB3aGVuIGJ1aWxkaW5nIGNvbXBsaWNhdGVkIGdyYW1tYXJzIGZvciByZWFsIHByb2dyYW1taW5nCitsYW5ndWFnZXMuICBJdCBzaG91bGQgYWxzbyBiZSBub3RlZCB0aGF0IFBMWSBkb2VzIG5vdCBwcm92aWRlIG11Y2ggaW4KK3RoZSB3YXkgb2YgYmVsbHMgYW5kIHdoaXN0bGVzIChlLmcuLCBhdXRvbWF0aWMgY29uc3RydWN0aW9uIG9mCithYnN0cmFjdCBzeW50YXggdHJlZXMsIHRyZWUgdHJhdmVyc2FsLCBldGMuKS4gTm9yIHdvdWxkIEkgY29uc2lkZXIgaXQKK3RvIGJlIGEgcGFyc2luZyBmcmFtZXdvcmsuICBJbnN0ZWFkLCB5b3Ugd2lsbCBmaW5kIGEgYmFyZS1ib25lcywgeWV0CitmdWxseSBjYXBhYmxlIGxleC95YWNjIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4gZW50aXJlbHkgaW4gUHl0aG9uLgorCis8cD4KK1RoZSByZXN0IG9mIHRoaXMgZG9jdW1lbnQgYXNzdW1lcyB0aGF0IHlvdSBhcmUgc29tZXdoYXQgZmFtaWxpYXIgd2l0aAorcGFyc2luZyB0aGVvcnksIHN5bnRheCBkaXJlY3RlZCB0cmFuc2xhdGlvbiwgYW5kIHRoZSB1c2Ugb2YgY29tcGlsZXIKK2NvbnN0cnVjdGlvbiB0b29scyBzdWNoIGFzIGxleCBhbmQgeWFjYyBpbiBvdGhlciBwcm9ncmFtbWluZworbGFuZ3VhZ2VzLiBJZiB5b3UgYXJlIHVuZmFtaWxpYXIgd2l0aCB0aGVzZSB0b3BpY3MsIHlvdSB3aWxsIHByb2JhYmx5Cit3YW50IHRvIGNvbnN1bHQgYW4gaW50cm9kdWN0b3J5IHRleHQgc3VjaCBhcyAiQ29tcGlsZXJzOiBQcmluY2lwbGVzLAorVGVjaG5pcXVlcywgYW5kIFRvb2xzIiwgYnkgQWhvLCBTZXRoaSwgYW5kIFVsbG1hbi4gIE8nUmVpbGx5J3MgIkxleAorYW5kIFlhY2MiIGJ5IEpvaG4gTGV2aW5lIG1heSBhbHNvIGJlIGhhbmR5LiAgSW4gZmFjdCwgdGhlIE8nUmVpbGx5IGJvb2sgY2FuIGJlCit1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBQTFkgYXMgdGhlIGNvbmNlcHRzIGFyZSB2aXJ0dWFsbHkgaWRlbnRpY2FsLgorCis8SDI+PGEgbmFtZT0icGx5X25uMiI+PC9hPjMuIFBMWSBPdmVydmlldzwvSDI+CisKKworPHA+CitQTFkgY29uc2lzdHMgb2YgdHdvIHNlcGFyYXRlIG1vZHVsZXM7IDx0dD5sZXgucHk8L3R0PiBhbmQKKzx0dD55YWNjLnB5PC90dD4sIGJvdGggb2Ygd2hpY2ggYXJlIGZvdW5kIGluIGEgUHl0aG9uIHBhY2thZ2UKK2NhbGxlZCA8dHQ+cGx5PC90dD4uIFRoZSA8dHQ+bGV4LnB5PC90dD4gbW9kdWxlIGlzIHVzZWQgdG8gYnJlYWsgaW5wdXQgdGV4dCBpbnRvIGEKK2NvbGxlY3Rpb24gb2YgdG9rZW5zIHNwZWNpZmllZCBieSBhIGNvbGxlY3Rpb24gb2YgcmVndWxhciBleHByZXNzaW9uCitydWxlcy4gIDx0dD55YWNjLnB5PC90dD4gaXMgdXNlZCB0byByZWNvZ25pemUgbGFuZ3VhZ2Ugc3ludGF4IHRoYXQgaGFzCitiZWVuIHNwZWNpZmllZCBpbiB0aGUgZm9ybSBvZiBhIGNvbnRleHQgZnJlZSBncmFtbWFyLgorPC9wPgorCis8cD4KK1RoZSB0d28gdG9vbHMgYXJlIG1lYW50IHRvIHdvcmsgdG9nZXRoZXIuICBTcGVjaWZpY2FsbHksCis8dHQ+bGV4LnB5PC90dD4gcHJvdmlkZXMgYW4gZXh0ZXJuYWwgaW50ZXJmYWNlIGluIHRoZSBmb3JtIG9mIGEKKzx0dD50b2tlbigpPC90dD4gZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBuZXh0IHZhbGlkIHRva2VuIG9uIHRoZQoraW5wdXQgc3RyZWFtLiAgPHR0PnlhY2MucHk8L3R0PiBjYWxscyB0aGlzIHJlcGVhdGVkbHkgdG8gcmV0cmlldmUKK3Rva2VucyBhbmQgaW52b2tlIGdyYW1tYXIgcnVsZXMuICBUaGUgb3V0cHV0IG9mIDx0dD55YWNjLnB5PC90dD4gaXMKK29mdGVuIGFuIEFic3RyYWN0IFN5bnRheCBUcmVlIChBU1QpLiAgSG93ZXZlciwgdGhpcyBpcyBlbnRpcmVseSB1cCB0bwordGhlIHVzZXIuICBJZiBkZXNpcmVkLCA8dHQ+eWFjYy5weTwvdHQ+IGNhbiBhbHNvIGJlIHVzZWQgdG8gaW1wbGVtZW50CitzaW1wbGUgb25lLXBhc3MgY29tcGlsZXJzLiAgCisKKzxwPgorTGlrZSBpdHMgVW5peCBjb3VudGVycGFydCwgPHR0PnlhY2MucHk8L3R0PiBwcm92aWRlcyBtb3N0IG9mIHRoZQorZmVhdHVyZXMgeW91IGV4cGVjdCBpbmNsdWRpbmcgZXh0ZW5zaXZlIGVycm9yIGNoZWNraW5nLCBncmFtbWFyCit2YWxpZGF0aW9uLCBzdXBwb3J0IGZvciBlbXB0eSBwcm9kdWN0aW9ucywgZXJyb3IgdG9rZW5zLCBhbmQgYW1iaWd1aXR5CityZXNvbHV0aW9uIHZpYSBwcmVjZWRlbmNlIHJ1bGVzLiAgSW4gZmFjdCwgYWxtb3N0IGV2ZXJ5dGhpbmcgdGhhdCBpcyBwb3NzaWJsZSBpbiB0cmFkaXRpb25hbCB5YWNjIAorc2hvdWxkIGJlIHN1cHBvcnRlZCBpbiBQTFkuCisKKzxwPgorVGhlIHByaW1hcnkgZGlmZmVyZW5jZSBiZXR3ZWVuCis8dHQ+eWFjYy5weTwvdHQ+IGFuZCBVbml4IDx0dD55YWNjPC90dD4gaXMgdGhhdCA8dHQ+eWFjYy5weTwvdHQ+IAorZG9lc24ndCBpbnZvbHZlIGEgc2VwYXJhdGUgY29kZS1nZW5lcmF0aW9uIHByb2Nlc3MuIAorSW5zdGVhZCwgUExZIHJlbGllcyBvbiByZWZsZWN0aW9uIChpbnRyb3NwZWN0aW9uKQordG8gYnVpbGQgaXRzIGxleGVycyBhbmQgcGFyc2Vycy4gIFVubGlrZSB0cmFkaXRpb25hbCBsZXgveWFjYyB3aGljaAorcmVxdWlyZSBhIHNwZWNpYWwgaW5wdXQgZmlsZSB0aGF0IGlzIGNvbnZlcnRlZCBpbnRvIGEgc2VwYXJhdGUgc291cmNlCitmaWxlLCB0aGUgc3BlY2lmaWNhdGlvbnMgZ2l2ZW4gdG8gUExZIDxlbT5hcmU8L2VtPiB2YWxpZCBQeXRob24KK3Byb2dyYW1zLiAgVGhpcyBtZWFucyB0aGF0IHRoZXJlIGFyZSBubyBleHRyYSBzb3VyY2UgZmlsZXMgbm9yIGlzCit0aGVyZSBhIHNwZWNpYWwgY29tcGlsZXIgY29uc3RydWN0aW9uIHN0ZXAgKGUuZy4sIHJ1bm5pbmcgeWFjYyB0bworZ2VuZXJhdGUgUHl0aG9uIGNvZGUgZm9yIHRoZSBjb21waWxlcikuICBTaW5jZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUKK3BhcnNpbmcgdGFibGVzIGlzIHJlbGF0aXZlbHkgZXhwZW5zaXZlLCBQTFkgY2FjaGVzIHRoZSByZXN1bHRzIGFuZAorc2F2ZXMgdGhlbSB0byBhIGZpbGUuICBJZiBubyBjaGFuZ2VzIGFyZSBkZXRlY3RlZCBpbiB0aGUgaW5wdXQgc291cmNlLAordGhlIHRhYmxlcyBhcmUgcmVhZCBmcm9tIHRoZSBjYWNoZS4gT3RoZXJ3aXNlLCB0aGV5IGFyZSByZWdlbmVyYXRlZC4KKworPEgyPjxhIG5hbWU9InBseV9ubjMiPjwvYT40LiBMZXg8L0gyPgorCisKKzx0dD5sZXgucHk8L3R0PiBpcyB1c2VkIHRvIHRva2VuaXplIGFuIGlucHV0IHN0cmluZy4gIEZvciBleGFtcGxlLCBzdXBwb3NlCit5b3UncmUgd3JpdGluZyBhIHByb2dyYW1taW5nIGxhbmd1YWdlIGFuZCBhIHVzZXIgc3VwcGxpZWQgdGhlIGZvbGxvd2luZyBpbnB1dCBzdHJpbmc6CisKKzxibG9ja3F1b3RlPgorPHByZT4KK3ggPSAzICsgNDIgKiAocyAtIHQpCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworQSB0b2tlbml6ZXIgc3BsaXRzIHRoZSBzdHJpbmcgaW50byBpbmRpdmlkdWFsIHRva2VucworCis8YmxvY2txdW90ZT4KKzxwcmU+CisneCcsJz0nLCAnMycsICcrJywgJzQyJywgJyonLCAnKCcsICdzJywgJy0nLCAndCcsICcpJworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK1Rva2VucyBhcmUgdXN1YWxseSBnaXZlbiBuYW1lcyB0byBpbmRpY2F0ZSB3aGF0IHRoZXkgYXJlLiBGb3IgZXhhbXBsZToKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorJ0lEJywnRVFVQUxTJywnTlVNQkVSJywnUExVUycsJ05VTUJFUicsJ1RJTUVTJywKKydMUEFSRU4nLCdJRCcsJ01JTlVTJywnSUQnLCdSUEFSRU4nCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworTW9yZSBzcGVjaWZpY2FsbHksIHRoZSBpbnB1dCBpcyBicm9rZW4gaW50byBwYWlycyBvZiB0b2tlbiB0eXBlcyBhbmQgdmFsdWVzLiAgRm9yIGV4YW1wbGU6CisKKzxibG9ja3F1b3RlPgorPHByZT4KKygnSUQnLCd4JyksICgnRVFVQUxTJywnPScpLCAoJ05VTUJFUicsJzMnKSwgCisoJ1BMVVMnLCcrJyksICgnTlVNQkVSJywnNDIpLCAoJ1RJTUVTJywnKicpLAorKCdMUEFSRU4nLCcoJyksICgnSUQnLCdzJyksICgnTUlOVVMnLCctJyksCisoJ0lEJywndCcpLCAoJ1JQQVJFTicsJyknCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworVGhlIGlkZW50aWZpY2F0aW9uIG9mIHRva2VucyBpcyB0eXBpY2FsbHkgZG9uZSBieSB3cml0aW5nIGEgc2VyaWVzIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbgorcnVsZXMuICBUaGUgbmV4dCBzZWN0aW9uIHNob3dzIGhvdyB0aGlzIGlzIGRvbmUgdXNpbmcgPHR0PmxleC5weTwvdHQ+LgorCis8SDM+PGEgbmFtZT0icGx5X25uNCI+PC9hPjQuMSBMZXggRXhhbXBsZTwvSDM+CisKKworVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyA8dHQ+bGV4LnB5PC90dD4gaXMgdXNlZCB0byB3cml0ZSBhIHNpbXBsZSB0b2tlbml6ZXIuCisKKzxibG9ja3F1b3RlPgorPHByZT4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNhbGNsZXgucHkKKyMKKyMgdG9rZW5pemVyIGZvciBhIHNpbXBsZSBleHByZXNzaW9uIGV2YWx1YXRvciBmb3IKKyMgbnVtYmVycyBhbmQgKywtLCosLworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ltcG9ydCBwbHkubGV4IGFzIGxleAorCisjIExpc3Qgb2YgdG9rZW4gbmFtZXMuICAgVGhpcyBpcyBhbHdheXMgcmVxdWlyZWQKK3Rva2VucyA9ICgKKyAgICdOVU1CRVInLAorICAgJ1BMVVMnLAorICAgJ01JTlVTJywKKyAgICdUSU1FUycsCisgICAnRElWSURFJywKKyAgICdMUEFSRU4nLAorICAgJ1JQQVJFTicsCispCisKKyMgUmVndWxhciBleHByZXNzaW9uIHJ1bGVzIGZvciBzaW1wbGUgdG9rZW5zCit0X1BMVVMgICAgPSByJ1wrJwordF9NSU5VUyAgID0gcictJwordF9USU1FUyAgID0gcidcKicKK3RfRElWSURFICA9IHInLycKK3RfTFBBUkVOICA9IHInXCgnCit0X1JQQVJFTiAgPSByJ1wpJworCisjIEEgcmVndWxhciBleHByZXNzaW9uIHJ1bGUgd2l0aCBzb21lIGFjdGlvbiBjb2RlCitkZWYgdF9OVU1CRVIodCk6CisgICAgcidcZCsnCisgICAgdC52YWx1ZSA9IGludCh0LnZhbHVlKSAgICAKKyAgICByZXR1cm4gdAorCisjIERlZmluZSBhIHJ1bGUgc28gd2UgY2FuIHRyYWNrIGxpbmUgbnVtYmVycworZGVmIHRfbmV3bGluZSh0KToKKyAgICByJ1xuKycKKyAgICB0LmxleGVyLmxpbmVubyArPSBsZW4odC52YWx1ZSkKKworIyBBIHN0cmluZyBjb250YWluaW5nIGlnbm9yZWQgY2hhcmFjdGVycyAoc3BhY2VzIGFuZCB0YWJzKQordF9pZ25vcmUgID0gJyBcdCcKKworIyBFcnJvciBoYW5kbGluZyBydWxlCitkZWYgdF9lcnJvcih0KToKKyAgICBwcmludCgiSWxsZWdhbCBjaGFyYWN0ZXIgJyVzJyIgJSB0LnZhbHVlWzBdKQorICAgIHQubGV4ZXIuc2tpcCgxKQorCisjIEJ1aWxkIHRoZSBsZXhlcgorbGV4ZXIgPSBsZXgubGV4KCkKKworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CitUbyB1c2UgdGhlIGxleGVyLCB5b3UgZmlyc3QgbmVlZCB0byBmZWVkIGl0IHNvbWUgaW5wdXQgdGV4dCB1c2luZworaXRzIDx0dD5pbnB1dCgpPC90dD4gbWV0aG9kLiAgQWZ0ZXIgdGhhdCwgcmVwZWF0ZWQgY2FsbHMKK3RvIDx0dD50b2tlbigpPC90dD4gcHJvZHVjZSB0b2tlbnMuICBUaGUgZm9sbG93aW5nIGNvZGUgc2hvd3MgaG93IHRoaXMKK3dvcmtzOgorCis8YmxvY2txdW90ZT4KKzxwcmU+CisKKyMgVGVzdCBpdCBvdXQKK2RhdGEgPSAnJycKKzMgKyA0ICogMTAKKyAgKyAtMjAgKjIKKycnJworCisjIEdpdmUgdGhlIGxleGVyIHNvbWUgaW5wdXQKK2xleGVyLmlucHV0KGRhdGEpCisKKyMgVG9rZW5pemUKK3doaWxlIFRydWU6CisgICAgdG9rID0gbGV4ZXIudG9rZW4oKQorICAgIGlmIG5vdCB0b2s6IAorICAgICAgICBicmVhayAgICAgICMgTm8gbW9yZSBpbnB1dAorICAgIHByaW50KHRvaykKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitXaGVuIGV4ZWN1dGVkLCB0aGUgZXhhbXBsZSB3aWxsIHByb2R1Y2UgdGhlIGZvbGxvd2luZyBvdXRwdXQ6CisKKzxibG9ja3F1b3RlPgorPHByZT4KKyQgcHl0aG9uIGV4YW1wbGUucHkKK0xleFRva2VuKE5VTUJFUiwzLDIsMSkKK0xleFRva2VuKFBMVVMsJysnLDIsMykKK0xleFRva2VuKE5VTUJFUiw0LDIsNSkKK0xleFRva2VuKFRJTUVTLCcqJywyLDcpCitMZXhUb2tlbihOVU1CRVIsMTAsMiwxMCkKK0xleFRva2VuKFBMVVMsJysnLDMsMTQpCitMZXhUb2tlbihNSU5VUywnLScsMywxNikKK0xleFRva2VuKE5VTUJFUiwyMCwzLDE4KQorTGV4VG9rZW4oVElNRVMsJyonLDMsMjApCitMZXhUb2tlbihOVU1CRVIsMiwzLDIxKQorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK0xleGVycyBhbHNvIHN1cHBvcnQgdGhlIGl0ZXJhdGlvbiBwcm90b2NvbC4gICAgU28sIHlvdSBjYW4gd3JpdGUgdGhlIGFib3ZlIGxvb3AgYXMgZm9sbG93czoKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorZm9yIHRvayBpbiBsZXhlcjoKKyAgICBwcmludCh0b2spCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworVGhlIHRva2VucyByZXR1cm5lZCBieSA8dHQ+bGV4ZXIudG9rZW4oKTwvdHQ+IGFyZSBpbnN0YW5jZXMKK29mIDx0dD5MZXhUb2tlbjwvdHQ+LiAgVGhpcyBvYmplY3QgaGFzCithdHRyaWJ1dGVzIDx0dD50b2sudHlwZTwvdHQ+LCA8dHQ+dG9rLnZhbHVlPC90dD4sCis8dHQ+dG9rLmxpbmVubzwvdHQ+LCBhbmQgPHR0PnRvay5sZXhwb3M8L3R0Pi4gIFRoZSBmb2xsb3dpbmcgY29kZSBzaG93cyBhbiBleGFtcGxlIG9mCithY2Nlc3NpbmcgdGhlc2UgYXR0cmlidXRlczoKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorIyBUb2tlbml6ZQord2hpbGUgVHJ1ZToKKyAgICB0b2sgPSBsZXhlci50b2tlbigpCisgICAgaWYgbm90IHRvazogCisgICAgICAgIGJyZWFrICAgICAgIyBObyBtb3JlIGlucHV0CisgICAgcHJpbnQodG9rLnR5cGUsIHRvay52YWx1ZSwgdG9rLmxpbmVubywgdG9rLmxleHBvcykKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitUaGUgPHR0PnRvay50eXBlPC90dD4gYW5kIDx0dD50b2sudmFsdWU8L3R0PiBhdHRyaWJ1dGVzIGNvbnRhaW4gdGhlCit0eXBlIGFuZCB2YWx1ZSBvZiB0aGUgdG9rZW4gaXRzZWxmLiAKKzx0dD50b2subGluZTwvdHQ+IGFuZCA8dHQ+dG9rLmxleHBvczwvdHQ+IGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQKK3RoZSBsb2NhdGlvbiBvZiB0aGUgdG9rZW4uICA8dHQ+dG9rLmxleHBvczwvdHQ+IGlzIHRoZSBpbmRleCBvZiB0aGUKK3Rva2VuIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgdGV4dC4KKworPEgzPjxhIG5hbWU9InBseV9ubjUiPjwvYT40LjIgVGhlIHRva2VucyBsaXN0PC9IMz4KKworCis8cD4KK0FsbCBsZXhlcnMgbXVzdCBwcm92aWRlIGEgbGlzdCA8dHQ+dG9rZW5zPC90dD4gdGhhdCBkZWZpbmVzIGFsbCBvZiB0aGUgcG9zc2libGUgdG9rZW4KK25hbWVzIHRoYXQgY2FuIGJlIHByb2R1Y2VkIGJ5IHRoZSBsZXhlci4gIFRoaXMgbGlzdCBpcyBhbHdheXMgcmVxdWlyZWQKK2FuZCBpcyB1c2VkIHRvIHBlcmZvcm0gYSB2YXJpZXR5IG9mIHZhbGlkYXRpb24gY2hlY2tzLiAgVGhlIHRva2VucyBsaXN0IGlzIGFsc28gdXNlZCBieSB0aGUKKzx0dD55YWNjLnB5PC90dD4gbW9kdWxlIHRvIGlkZW50aWZ5IHRlcm1pbmFscy4KKzwvcD4KKworPHA+CitJbiB0aGUgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlIHNwZWNpZmllZCB0aGUgdG9rZW4gbmFtZXM6CisKKzxibG9ja3F1b3RlPgorPHByZT4KK3Rva2VucyA9ICgKKyAgICdOVU1CRVInLAorICAgJ1BMVVMnLAorICAgJ01JTlVTJywKKyAgICdUSU1FUycsCisgICAnRElWSURFJywKKyAgICdMUEFSRU4nLAorICAgJ1JQQVJFTicsCispCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworPEgzPjxhIG5hbWU9InBseV9ubjYiPjwvYT40LjMgU3BlY2lmaWNhdGlvbiBvZiB0b2tlbnM8L0gzPgorCisKK0VhY2ggdG9rZW4gaXMgc3BlY2lmaWVkIGJ5IHdyaXRpbmcgYSByZWd1bGFyIGV4cHJlc3Npb24gcnVsZSBjb21wYXRpYmxlIHdpdGggUHl0aG9uJ3MgPHR0PnJlPC90dD4gbW9kdWxlLiAgRWFjaCBvZiB0aGVzZSBydWxlcworYXJlIGRlZmluZWQgYnkgIG1ha2luZyBkZWNsYXJhdGlvbnMgd2l0aCBhIHNwZWNpYWwgcHJlZml4IDx0dD50XzwvdHQ+IHRvIGluZGljYXRlIHRoYXQgaXQKK2RlZmluZXMgYSB0b2tlbi4gIEZvciBzaW1wbGUgdG9rZW5zLCB0aGUgcmVndWxhciBleHByZXNzaW9uIGNhbgorYmUgc3BlY2lmaWVkIGFzIHN0cmluZ3Mgc3VjaCBhcyB0aGlzIChub3RlOiBQeXRob24gcmF3IHN0cmluZ3MgYXJlIHVzZWQgc2luY2UgdGhleSBhcmUgdGhlCittb3N0IGNvbnZlbmllbnQgd2F5IHRvIHdyaXRlIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdHJpbmdzKToKKworPGJsb2NrcXVvdGU+Cis8cHJlPgordF9QTFVTID0gcidcKycKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitJbiB0aGlzIGNhc2UsIHRoZSBuYW1lIGZvbGxvd2luZyB0aGUgPHR0PnRfPC90dD4gbXVzdCBleGFjdGx5IG1hdGNoIG9uZSBvZiB0aGUKK25hbWVzIHN1cHBsaWVkIGluIDx0dD50b2tlbnM8L3R0Pi4gICBJZiBzb21lIGtpbmQgb2YgYWN0aW9uIG5lZWRzIHRvIGJlIHBlcmZvcm1lZCwKK2EgdG9rZW4gcnVsZSBjYW4gYmUgc3BlY2lmaWVkIGFzIGEgZnVuY3Rpb24uICBGb3IgZXhhbXBsZSwgdGhpcyBydWxlIG1hdGNoZXMgbnVtYmVycyBhbmQKK2NvbnZlcnRzIHRoZSBzdHJpbmcgaW50byBhIFB5dGhvbiBpbnRlZ2VyLgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitkZWYgdF9OVU1CRVIodCk6CisgICAgcidcZCsnCisgICAgdC52YWx1ZSA9IGludCh0LnZhbHVlKQorICAgIHJldHVybiB0Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworV2hlbiBhIGZ1bmN0aW9uIGlzIHVzZWQsIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gcnVsZSBpcyBzcGVjaWZpZWQgaW4gdGhlIGZ1bmN0aW9uIGRvY3VtZW50YXRpb24gc3RyaW5nLiAKK1RoZSBmdW5jdGlvbiBhbHdheXMgdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQgd2hpY2ggaXMgYW4gaW5zdGFuY2Ugb2YgCis8dHQ+TGV4VG9rZW48L3R0Pi4gICBUaGlzIG9iamVjdCBoYXMgYXR0cmlidXRlcyBvZiA8dHQ+dC50eXBlPC90dD4gd2hpY2ggaXMgdGhlIHRva2VuIHR5cGUgKGFzIGEgc3RyaW5nKSwKKzx0dD50LnZhbHVlPC90dD4gd2hpY2ggaXMgdGhlIGxleGVtZSAodGhlIGFjdHVhbCB0ZXh0IG1hdGNoZWQpLCA8dHQ+dC5saW5lbm88L3R0PiB3aGljaCBpcyB0aGUgY3VycmVudCBsaW5lIG51bWJlciwgYW5kIDx0dD50LmxleHBvczwvdHQ+IHdoaWNoCitpcyB0aGUgcG9zaXRpb24gb2YgdGhlIHRva2VuIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0IHRleHQuCitCeSBkZWZhdWx0LCA8dHQ+dC50eXBlPC90dD4gaXMgc2V0IHRvIHRoZSBuYW1lIGZvbGxvd2luZyB0aGUgPHR0PnRfPC90dD4gcHJlZml4LiAgVGhlIGFjdGlvbgorZnVuY3Rpb24gY2FuIG1vZGlmeSB0aGUgY29udGVudHMgb2YgdGhlIDx0dD5MZXhUb2tlbjwvdHQ+IG9iamVjdCBhcyBhcHByb3ByaWF0ZS4gIEhvd2V2ZXIsIAord2hlbiBpdCBpcyBkb25lLCB0aGUgcmVzdWx0aW5nIHRva2VuIHNob3VsZCBiZSByZXR1cm5lZC4gIElmIG5vIHZhbHVlIGlzIHJldHVybmVkIGJ5IHRoZSBhY3Rpb24KK2Z1bmN0aW9uLCB0aGUgdG9rZW4gaXMgc2ltcGx5IGRpc2NhcmRlZCBhbmQgdGhlIG5leHQgdG9rZW4gcmVhZC4KKworPHA+CitJbnRlcm5hbGx5LCA8dHQ+bGV4LnB5PC90dD4gdXNlcyB0aGUgPHR0PnJlPC90dD4gbW9kdWxlIHRvIGRvIGl0cyBwYXR0ZXJuIG1hdGNoaW5nLiAgUGF0dGVybnMgYXJlIGNvbXBpbGVkCit1c2luZyB0aGUgPHR0PnJlLlZFUkJPU0U8L3R0PiBmbGFnIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGhlbHAgcmVhZGFiaWxpdHkuICBIb3dldmVyLCBiZSBhd2FyZSB0aGF0IHVuZXNjYXBlZAord2hpdGVzcGFjZSBpcyBpZ25vcmVkIGFuZCBjb21tZW50cyBhcmUgYWxsb3dlZCBpbiB0aGlzIG1vZGUuICBJZiB5b3VyIHBhdHRlcm4gaW52b2x2ZXMgd2hpdGVzcGFjZSwgbWFrZSBzdXJlIHlvdQordXNlIDx0dD5cczwvdHQ+LiAgSWYgeW91IG5lZWQgdG8gbWF0Y2ggdGhlIDx0dD4jPC90dD4gY2hhcmFjdGVyLCB1c2UgPHR0PlsjXTwvdHQ+LgorPC9wPgorCis8cD4KK1doZW4gYnVpbGRpbmcgdGhlIG1hc3RlciByZWd1bGFyIGV4cHJlc3Npb24sCitydWxlcyBhcmUgYWRkZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKKzwvcD4KKworPHA+Cis8b2w+Cis8bGk+QWxsIHRva2VucyBkZWZpbmVkIGJ5IGZ1bmN0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhleSBhcHBlYXIgaW4gdGhlIGxleGVyIGZpbGUuCis8bGk+VG9rZW5zIGRlZmluZWQgYnkgc3RyaW5ncyBhcmUgYWRkZWQgbmV4dCBieSBzb3J0aW5nIHRoZW0gaW4gb3JkZXIgb2YgZGVjcmVhc2luZyByZWd1bGFyIGV4cHJlc3Npb24gbGVuZ3RoIChsb25nZXIgZXhwcmVzc2lvbnMKK2FyZSBhZGRlZCBmaXJzdCkuCis8L29sPgorPHA+CitXaXRob3V0IHRoaXMgb3JkZXJpbmcsIGl0IGNhbiBiZSBkaWZmaWN1bHQgdG8gY29ycmVjdGx5IG1hdGNoIGNlcnRhaW4gdHlwZXMgb2YgdG9rZW5zLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSAKK3dhbnRlZCB0byBoYXZlIHNlcGFyYXRlIHRva2VucyBmb3IgIj0iIGFuZCAiPT0iLCB5b3UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCAiPT0iIGlzIGNoZWNrZWQgZmlyc3QuICBCeSBzb3J0aW5nIHJlZ3VsYXIKK2V4cHJlc3Npb25zIGluIG9yZGVyIG9mIGRlY3JlYXNpbmcgbGVuZ3RoLCB0aGlzIHByb2JsZW0gaXMgc29sdmVkIGZvciBydWxlcyBkZWZpbmVkIGFzIHN0cmluZ3MuICBGb3IgZnVuY3Rpb25zLAordGhlIG9yZGVyIGNhbiBiZSBleHBsaWNpdGx5IGNvbnRyb2xsZWQgc2luY2UgcnVsZXMgYXBwZWFyaW5nIGZpcnN0IGFyZSBjaGVja2VkIGZpcnN0LgorCis8cD4KK1RvIGhhbmRsZSByZXNlcnZlZCB3b3JkcywgeW91IHNob3VsZCB3cml0ZSBhIHNpbmdsZSBydWxlIHRvIG1hdGNoIGFuCitpZGVudGlmaWVyIGFuZCBkbyBhIHNwZWNpYWwgbmFtZSBsb29rdXAgaW4gYSBmdW5jdGlvbiBsaWtlIHRoaXM6CisKKzxibG9ja3F1b3RlPgorPHByZT4KK3Jlc2VydmVkID0geworICAgJ2lmJyA6ICdJRicsCisgICAndGhlbicgOiAnVEhFTicsCisgICAnZWxzZScgOiAnRUxTRScsCisgICAnd2hpbGUnIDogJ1dISUxFJywKKyAgIC4uLgorfQorCit0b2tlbnMgPSBbJ0xQQVJFTicsJ1JQQVJFTicsLi4uLCdJRCddICsgbGlzdChyZXNlcnZlZC52YWx1ZXMoKSkKKworZGVmIHRfSUQodCk6CisgICAgcidbYS16QS1aX11bYS16QS1aXzAtOV0qJworICAgIHQudHlwZSA9IHJlc2VydmVkLmdldCh0LnZhbHVlLCdJRCcpICAgICMgQ2hlY2sgZm9yIHJlc2VydmVkIHdvcmRzCisgICAgcmV0dXJuIHQKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitUaGlzIGFwcHJvYWNoIGdyZWF0bHkgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbiBydWxlcyBhbmQgaXMgbGlrZWx5IHRvIG1ha2UgdGhpbmdzIGEgbGl0dGxlIGZhc3Rlci4KKworPHA+Cis8Yj5Ob3RlOjwvYj4gWW91IHNob3VsZCBhdm9pZCB3cml0aW5nIGluZGl2aWR1YWwgcnVsZXMgZm9yIHJlc2VydmVkIHdvcmRzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3cml0ZSBydWxlcyBsaWtlIHRoaXMsCisKKzxibG9ja3F1b3RlPgorPHByZT4KK3RfRk9SICAgPSByJ2ZvcicKK3RfUFJJTlQgPSByJ3ByaW50JworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK3Rob3NlIHJ1bGVzIHdpbGwgYmUgdHJpZ2dlcmVkIGZvciBpZGVudGlmaWVycyB0aGF0IGluY2x1ZGUgdGhvc2Ugd29yZHMgYXMgYSBwcmVmaXggc3VjaCBhcyAiZm9yZ2V0IiBvciAicHJpbnRlZCIuICBUaGlzIGlzIHByb2JhYmx5IG5vdAord2hhdCB5b3Ugd2FudC4KKworPEgzPjxhIG5hbWU9InBseV9ubjciPjwvYT40LjQgVG9rZW4gdmFsdWVzPC9IMz4KKworCitXaGVuIHRva2VucyBhcmUgcmV0dXJuZWQgYnkgbGV4LCB0aGV5IGhhdmUgYSB2YWx1ZSB0aGF0IGlzIHN0b3JlZCBpbiB0aGUgPHR0PnZhbHVlPC90dD4gYXR0cmlidXRlLiAgICBOb3JtYWxseSwgdGhlIHZhbHVlIGlzIHRoZSB0ZXh0Cit0aGF0IHdhcyBtYXRjaGVkLiAgIEhvd2V2ZXIsIHRoZSB2YWx1ZSBjYW4gYmUgYXNzaWduZWQgdG8gYW55IFB5dGhvbiBvYmplY3QuICAgRm9yIGluc3RhbmNlLCB3aGVuIGxleGluZyBpZGVudGlmaWVycywgeW91IG1heQord2FudCB0byByZXR1cm4gYm90aCB0aGUgaWRlbnRpZmllciBuYW1lIGFuZCBpbmZvcm1hdGlvbiBmcm9tIHNvbWUgc29ydCBvZiBzeW1ib2wgdGFibGUuICBUbyBkbyB0aGlzLCB5b3UgbWlnaHQgd3JpdGUgYSBydWxlIGxpa2UgdGhpczoKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorZGVmIHRfSUQodCk6CisgICAgLi4uCisgICAgIyBMb29rIHVwIHN5bWJvbCB0YWJsZSBpbmZvcm1hdGlvbiBhbmQgcmV0dXJuIGEgdHVwbGUKKyAgICB0LnZhbHVlID0gKHQudmFsdWUsIHN5bWJvbF9sb29rdXAodC52YWx1ZSkpCisgICAgLi4uCisgICAgcmV0dXJuIHQKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHN0b3JpbmcgZGF0YSBpbiBvdGhlciBhdHRyaWJ1dGUgbmFtZXMgaXMgPGVtPm5vdDwvZW0+IHJlY29tbWVuZGVkLiAgVGhlIDx0dD55YWNjLnB5PC90dD4gbW9kdWxlIG9ubHkgZXhwb3NlcyB0aGUKK2NvbnRlbnRzIG9mIHRoZSA8dHQ+dmFsdWU8L3R0PiBhdHRyaWJ1dGUuICBUaHVzLCBhY2Nlc3Npbmcgb3RoZXIgYXR0cmlidXRlcyBtYXkgIGJlIHVubmVjZXNzYXJpbHkgYXdrd2FyZC4gICBJZiB5b3UKK25lZWQgdG8gc3RvcmUgbXVsdGlwbGUgdmFsdWVzIG9uIGEgdG9rZW4sIGFzc2lnbiBhIHR1cGxlLCBkaWN0aW9uYXJ5LCBvciBpbnN0YW5jZSB0byA8dHQ+dmFsdWU8L3R0Pi4KKworPEgzPjxhIG5hbWU9InBseV9ubjgiPjwvYT40LjUgRGlzY2FyZGVkIHRva2VuczwvSDM+CisKKworVG8gZGlzY2FyZCBhIHRva2VuLCBzdWNoIGFzIGEgY29tbWVudCwgc2ltcGx5IGRlZmluZSBhIHRva2VuIHJ1bGUgdGhhdCByZXR1cm5zIG5vIHZhbHVlLiAgRm9yIGV4YW1wbGU6CisKKzxibG9ja3F1b3RlPgorPHByZT4KK2RlZiB0X0NPTU1FTlQodCk6CisgICAgcidcIy4qJworICAgIHBhc3MKKyAgICAjIE5vIHJldHVybiB2YWx1ZS4gVG9rZW4gZGlzY2FyZGVkCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBpbmNsdWRlIHRoZSBwcmVmaXggImlnbm9yZV8iIGluIHRoZSB0b2tlbiBkZWNsYXJhdGlvbiB0byBmb3JjZSBhIHRva2VuIHRvIGJlIGlnbm9yZWQuICBGb3IgZXhhbXBsZToKKworPGJsb2NrcXVvdGU+Cis8cHJlPgordF9pZ25vcmVfQ09NTUVOVCA9IHInXCMuKicKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitCZSBhZHZpc2VkIHRoYXQgaWYgeW91IGFyZSBpZ25vcmluZyBtYW55IGRpZmZlcmVudCBraW5kcyBvZiB0ZXh0LCB5b3UgbWF5IHN0aWxsIHdhbnQgdG8gdXNlIGZ1bmN0aW9ucyBzaW5jZSB0aGVzZSBwcm92aWRlIG1vcmUgcHJlY2lzZQorY29udHJvbCBvdmVyIHRoZSBvcmRlciBpbiB3aGljaCByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBtYXRjaGVkIChpLmUuLCBmdW5jdGlvbnMgYXJlIG1hdGNoZWQgaW4gb3JkZXIgb2Ygc3BlY2lmaWNhdGlvbiB3aGVyZWFzIHN0cmluZ3MgYXJlCitzb3J0ZWQgYnkgcmVndWxhciBleHByZXNzaW9uIGxlbmd0aCkuCisKKzxIMz48YSBuYW1lPSJwbHlfbm45Ij48L2E+NC42IExpbmUgbnVtYmVycyBhbmQgcG9zaXRpb25hbCBpbmZvcm1hdGlvbjwvSDM+CisKKworPHA+QnkgZGVmYXVsdCwgPHR0PmxleC5weTwvdHQ+IGtub3dzIG5vdGhpbmcgYWJvdXQgbGluZSBudW1iZXJzLiAgVGhpcyBpcyBiZWNhdXNlIDx0dD5sZXgucHk8L3R0PiBkb2Vzbid0IGtub3cgYW55dGhpbmcKK2Fib3V0IHdoYXQgY29uc3RpdHV0ZXMgYSAibGluZSIgb2YgaW5wdXQgKGUuZy4sIHRoZSBuZXdsaW5lIGNoYXJhY3RlciBvciBldmVuIGlmIHRoZSBpbnB1dCBpcyB0ZXh0dWFsIGRhdGEpLgorVG8gdXBkYXRlIHRoaXMgaW5mb3JtYXRpb24sIHlvdSBuZWVkIHRvIHdyaXRlIGEgc3BlY2lhbCBydWxlLiAgSW4gdGhlIGV4YW1wbGUsIHRoZSA8dHQ+dF9uZXdsaW5lKCk8L3R0PiBydWxlIHNob3dzIGhvdyB0byBkbyB0aGlzLgorCis8YmxvY2txdW90ZT4KKzxwcmU+CisjIERlZmluZSBhIHJ1bGUgc28gd2UgY2FuIHRyYWNrIGxpbmUgbnVtYmVycworZGVmIHRfbmV3bGluZSh0KToKKyAgICByJ1xuKycKKyAgICB0LmxleGVyLmxpbmVubyArPSBsZW4odC52YWx1ZSkKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorV2l0aGluIHRoZSBydWxlLCB0aGUgPHR0PmxpbmVubzwvdHQ+IGF0dHJpYnV0ZSBvZiB0aGUgdW5kZXJseWluZyBsZXhlciA8dHQ+dC5sZXhlcjwvdHQ+IGlzIHVwZGF0ZWQuCitBZnRlciB0aGUgbGluZSBudW1iZXIgaXMgdXBkYXRlZCwgdGhlIHRva2VuIGlzIHNpbXBseSBkaXNjYXJkZWQgc2luY2Ugbm90aGluZyBpcyByZXR1cm5lZC4KKworPHA+Cis8dHQ+bGV4LnB5PC90dD4gZG9lcyBub3QgcGVyZm9ybSBhbnkga2luZCBvZiBhdXRvbWF0aWMgY29sdW1uIHRyYWNraW5nLiAgSG93ZXZlciwgaXQgZG9lcyByZWNvcmQgcG9zaXRpb25hbAoraW5mb3JtYXRpb24gcmVsYXRlZCB0byBlYWNoIHRva2VuIGluIHRoZSA8dHQ+bGV4cG9zPC90dD4gYXR0cmlidXRlLiAgIFVzaW5nIHRoaXMsIGl0IGlzIHVzdWFsbHkgcG9zc2libGUgdG8gY29tcHV0ZSAKK2NvbHVtbiBpbmZvcm1hdGlvbiBhcyBhIHNlcGFyYXRlIHN0ZXAuICAgRm9yIGluc3RhbmNlLCBqdXN0IGNvdW50IGJhY2t3YXJkcyB1bnRpbCB5b3UgcmVhY2ggYSBuZXdsaW5lLgorCis8YmxvY2txdW90ZT4KKzxwcmU+CisjIENvbXB1dGUgY29sdW1uLiAKKyMgICAgIGlucHV0IGlzIHRoZSBpbnB1dCB0ZXh0IHN0cmluZworIyAgICAgdG9rZW4gaXMgYSB0b2tlbiBpbnN0YW5jZQorZGVmIGZpbmRfY29sdW1uKGlucHV0LCB0b2tlbik6CisgICAgbGFzdF9jciA9IGlucHV0LnJmaW5kKCdcbicsIDAsIHRva2VuLmxleHBvcykKKyAgICBpZiBsYXN0X2NyIDwgMDoKKwlsYXN0X2NyID0gMAorICAgIGNvbHVtbiA9ICh0b2tlbi5sZXhwb3MgLSBsYXN0X2NyKSArIDEKKyAgICByZXR1cm4gY29sdW1uCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworU2luY2UgY29sdW1uIGluZm9ybWF0aW9uIGlzIG9mdGVuIG9ubHkgdXNlZnVsIGluIHRoZSBjb250ZXh0IG9mIGVycm9yIGhhbmRsaW5nLCBjYWxjdWxhdGluZyB0aGUgY29sdW1uCitwb3NpdGlvbiBjYW4gYmUgcGVyZm9ybWVkIHdoZW4gbmVlZGVkIGFzIG9wcG9zZWQgdG8gZG9pbmcgaXQgZm9yIGVhY2ggdG9rZW4uCisKKzxIMz48YSBuYW1lPSJwbHlfbm4xMCI+PC9hPjQuNyBJZ25vcmVkIGNoYXJhY3RlcnM8L0gzPgorCisKKzxwPgorVGhlIHNwZWNpYWwgPHR0PnRfaWdub3JlPC90dD4gcnVsZSBpcyByZXNlcnZlZCBieSA8dHQ+bGV4LnB5PC90dD4gZm9yIGNoYXJhY3RlcnMKK3RoYXQgc2hvdWxkIGJlIGNvbXBsZXRlbHkgaWdub3JlZCBpbiB0aGUgaW5wdXQgc3RyZWFtLiAKK1VzdWFsbHkgdGhpcyBpcyB1c2VkIHRvIHNraXAgb3ZlciB3aGl0ZXNwYWNlIGFuZCBvdGhlciBub24tZXNzZW50aWFsIGNoYXJhY3RlcnMuIAorQWx0aG91Z2ggaXQgaXMgcG9zc2libGUgdG8gZGVmaW5lIGEgcmVndWxhciBleHByZXNzaW9uIHJ1bGUgZm9yIHdoaXRlc3BhY2UgaW4gYSBtYW5uZXIKK3NpbWlsYXIgdG8gPHR0PnRfbmV3bGluZSgpPC90dD4sIHRoZSB1c2Ugb2YgPHR0PnRfaWdub3JlPC90dD4gcHJvdmlkZXMgc3Vic3RhbnRpYWxseSBiZXR0ZXIKK2xleGluZyBwZXJmb3JtYW5jZSBiZWNhdXNlIGl0IGlzIGhhbmRsZWQgYXMgYSBzcGVjaWFsIGNhc2UgYW5kIGlzIGNoZWNrZWQgaW4gYSBtdWNoCittb3JlIGVmZmljaWVudCBtYW5uZXIgdGhhbiB0aGUgbm9ybWFsIHJlZ3VsYXIgZXhwcmVzc2lvbiBydWxlcy4KKzwvcD4KKworPHA+CitUaGUgY2hhcmFjdGVycyBnaXZlbiBpbiA8dHQ+dF9pZ25vcmU8L3R0PiBhcmUgbm90IGlnbm9yZWQgd2hlbiBzdWNoIGNoYXJhY3RlcnMgYXJlIHBhcnQgb2YKK290aGVyIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJucy4gIEZvciBleGFtcGxlLCBpZiB5b3UgaGFkIGEgcnVsZSB0byBjYXB0dXJlIHF1b3RlZCB0ZXh0LAordGhhdCBwYXR0ZXJuIGNhbiBpbmNsdWRlIHRoZSBpZ25vcmVkIGNoYXJhY3RlcnMgKHdoaWNoIHdpbGwgYmUgY2FwdHVyZWQgaW4gdGhlIG5vcm1hbCB3YXkpLiAgVGhlCittYWluIHB1cnBvc2Ugb2YgPHR0PnRfaWdub3JlPC90dD4gaXMgdG8gaWdub3JlIHdoaXRlc3BhY2UgYW5kIG90aGVyIHBhZGRpbmcgYmV0d2VlbiB0aGUKK3Rva2VucyB0aGF0IHlvdSBhY3R1YWxseSB3YW50IHRvIHBhcnNlLgorPC9wPgorCis8SDM+PGEgbmFtZT0icGx5X25uMTEiPjwvYT40LjggTGl0ZXJhbCBjaGFyYWN0ZXJzPC9IMz4KKworCis8cD4KK0xpdGVyYWwgY2hhcmFjdGVycyBjYW4gYmUgc3BlY2lmaWVkIGJ5IGRlZmluaW5nIGEgdmFyaWFibGUgPHR0PmxpdGVyYWxzPC90dD4gaW4geW91ciBsZXhpbmcgbW9kdWxlLiAgRm9yIGV4YW1wbGU6CisKKzxibG9ja3F1b3RlPgorPHByZT4KK2xpdGVyYWxzID0gWyAnKycsJy0nLCcqJywnLycgXQorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK29yIGFsdGVybmF0aXZlbHkKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorbGl0ZXJhbHMgPSAiKy0qLyIKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitBIGxpdGVyYWwgY2hhcmFjdGVyIGlzIHNpbXBseSBhIHNpbmdsZSBjaGFyYWN0ZXIgdGhhdCBpcyByZXR1cm5lZCAiYXMgaXMiIHdoZW4gZW5jb3VudGVyZWQgYnkgdGhlIGxleGVyLiAgTGl0ZXJhbHMgYXJlIGNoZWNrZWQKK2FmdGVyIGFsbCBvZiB0aGUgZGVmaW5lZCByZWd1bGFyIGV4cHJlc3Npb24gcnVsZXMuICBUaHVzLCBpZiBhIHJ1bGUgc3RhcnRzIHdpdGggb25lIG9mIHRoZSBsaXRlcmFsIGNoYXJhY3RlcnMsIGl0IHdpbGwgYWx3YXlzIAordGFrZSBwcmVjZWRlbmNlLgorCis8cD4KK1doZW4gYSBsaXRlcmFsIHRva2VuIGlzIHJldHVybmVkLCBib3RoIGl0cyA8dHQ+dHlwZTwvdHQ+IGFuZCA8dHQ+dmFsdWU8L3R0PiBhdHRyaWJ1dGVzIGFyZSBzZXQgdG8gdGhlIGNoYXJhY3RlciBpdHNlbGYuIEZvciBleGFtcGxlLCA8dHQ+JysnPC90dD4uCis8L3A+CisKKzxwPgorSXQncyBwb3NzaWJsZSB0byB3cml0ZSB0b2tlbiBmdW5jdGlvbnMgdGhhdCBwZXJmb3JtIGFkZGl0aW9uYWwgYWN0aW9ucword2hlbiBsaXRlcmFscyBhcmUgbWF0Y2hlZC4gIEhvd2V2ZXIsIHlvdSdsbCBuZWVkIHRvIHNldCB0aGUgdG9rZW4gdHlwZQorYXBwcm9wcmlhdGVseS4gRm9yIGV4YW1wbGU6Cis8L3A+CisKKzxibG9ja3F1b3RlPgorPHByZT4KK2xpdGVyYWxzID0gWyAneycsICd9JyBdCisKK2RlZiB0X2xicmFjZSh0KToKKyAgICByJ1x7JworICAgIHQudHlwZSA9ICd7JyAgICAgICMgU2V0IHRva2VuIHR5cGUgdG8gdGhlIGV4cGVjdGVkIGxpdGVyYWwKKyAgICByZXR1cm4gdAorCitkZWYgdF9yYnJhY2UodCk6CisgICAgcidcfScKKyAgICB0LnR5cGUgPSAnfScgICAgICAjIFNldCB0b2tlbiB0eXBlIHRvIHRoZSBleHBlY3RlZCBsaXRlcmFsCisgICAgcmV0dXJuIHQKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCis8SDM+PGEgbmFtZT0icGx5X25uMTIiPjwvYT40LjkgRXJyb3IgaGFuZGxpbmc8L0gzPgorCisKKzxwPgorVGhlIDx0dD50X2Vycm9yKCk8L3R0PgorZnVuY3Rpb24gaXMgdXNlZCB0byBoYW5kbGUgbGV4aW5nIGVycm9ycyB0aGF0IG9jY3VyIHdoZW4gaWxsZWdhbAorY2hhcmFjdGVycyBhcmUgZGV0ZWN0ZWQuICBJbiB0aGlzIGNhc2UsIHRoZSA8dHQ+dC52YWx1ZTwvdHQ+IGF0dHJpYnV0ZSBjb250YWlucyB0aGUKK3Jlc3Qgb2YgdGhlIGlucHV0IHN0cmluZyB0aGF0IGhhcyBub3QgYmVlbiB0b2tlbml6ZWQuICBJbiB0aGUgZXhhbXBsZSwgdGhlIGVycm9yIGZ1bmN0aW9uCit3YXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCis8YmxvY2txdW90ZT4KKzxwcmU+CisjIEVycm9yIGhhbmRsaW5nIHJ1bGUKK2RlZiB0X2Vycm9yKHQpOgorICAgIHByaW50KCJJbGxlZ2FsIGNoYXJhY3RlciAnJXMnIiAlIHQudmFsdWVbMF0pCisgICAgdC5sZXhlci5za2lwKDEpCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworSW4gdGhpcyBjYXNlLCB3ZSBzaW1wbHkgcHJpbnQgdGhlIG9mZmVuZGluZyBjaGFyYWN0ZXIgYW5kIHNraXAgYWhlYWQgb25lIGNoYXJhY3RlciBieSBjYWxsaW5nIDx0dD50LmxleGVyLnNraXAoMSk8L3R0Pi4KKworPEgzPjxhIG5hbWU9InBseV9ubjE0Ij48L2E+NC4xMCBFT0YgSGFuZGxpbmc8L0gzPgorCisKKzxwPgorVGhlIDx0dD50X2VvZigpPC90dD4gZnVuY3Rpb24gaXMgdXNlZCB0byBoYW5kbGUgYW4gZW5kLW9mLWZpbGUgKEVPRikgY29uZGl0aW9uIGluIHRoZSBpbnB1dC4gICBBcyBpbnB1dCwgaXQKK3JlY2VpdmVzIGEgdG9rZW4gdHlwZSA8dHQ+J2VvZic8L3R0PiB3aXRoIHRoZSA8dHQ+bGluZW5vPC90dD4gYW5kIDx0dD5sZXhwb3M8L3R0PiBhdHRyaWJ1dGVzIHNldCBhcHByb3ByaWF0ZWx5LgorVGhlIG1haW4gdXNlIG9mIHRoaXMgZnVuY3Rpb24gaXMgcHJvdmlkZSBtb3JlIGlucHV0IHRvIHRoZSBsZXhlciBzbyB0aGF0IGl0IGNhbiBjb250aW51ZSB0byBwYXJzZS4gIEhlcmUgaXMgYW4KK2V4YW1wbGUgb2YgaG93IHRoaXMgd29ya3M6Cis8L3A+CisKKzxibG9ja3F1b3RlPgorPHByZT4KKyMgRU9GIGhhbmRsaW5nIHJ1bGUKK2RlZiB0X2VvZih0KToKKyAgICAjIEdldCBtb3JlIGlucHV0IChFeGFtcGxlKQorICAgIG1vcmUgPSByYXdfaW5wdXQoJy4uLiAnKQorICAgIGlmIG1vcmU6CisgICAgICAgIHNlbGYubGV4ZXIuaW5wdXQobW9yZSkKKyAgICAgICAgcmV0dXJuIHNlbGYubGV4ZXIudG9rZW4oKQorICAgIHJldHVybiBOb25lCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworPHA+CitUaGUgRU9GIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIG5leHQgYXZhaWxhYmxlIHRva2VuIChieSBjYWxsaW5nIDx0dD5zZWxmLmxleGVyLnRva2VuKCkpPC90dD4gb3IgPHR0Pk5vbmU8L3R0PiB0bworaW5kaWNhdGUgbm8gbW9yZSBkYXRhLiAgIEJlIGF3YXJlIHRoYXQgc2V0dGluZyBtb3JlIGlucHV0IHdpdGggdGhlIDx0dD5zZWxmLmxleGVyLmlucHV0KCk8L3R0PiBtZXRob2QgZG9lcworTk9UIHJlc2V0IHRoZSBsZXhlciBzdGF0ZSBvciB0aGUgPHR0PmxpbmVubzwvdHQ+IGF0dHJpYnV0ZSB1c2VkIGZvciBwb3NpdGlvbiB0cmFja2luZy4gICBUaGUgPHR0PmxleHBvczwvdHQ+IAorYXR0cmlidXRlIGlzIHJlc2V0IHNvIGJlIGF3YXJlIG9mIHRoYXQgaWYgeW91J3JlIHVzaW5nIGl0IGluIGVycm9yIHJlcG9ydGluZy4KKzwvcD4KKworPEgzPjxhIG5hbWU9InBseV9ubjEzIj48L2E+NC4xMSBCdWlsZGluZyBhbmQgdXNpbmcgdGhlIGxleGVyPC9IMz4KKworCis8cD4KK1RvIGJ1aWxkIHRoZSBsZXhlciwgdGhlIGZ1bmN0aW9uIDx0dD5sZXgubGV4KCk8L3R0PiBpcyB1c2VkLiAgRm9yIGV4YW1wbGU6PC9wPgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitsZXhlciA9IGxleC5sZXgoKQorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKKzxwPlRoaXMgZnVuY3Rpb24KK3VzZXMgUHl0aG9uIHJlZmxlY3Rpb24gKG9yIGludHJvc3BlY3Rpb24pIHRvIHJlYWQgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBydWxlcworb3V0IG9mIHRoZSBjYWxsaW5nIGNvbnRleHQgYW5kIGJ1aWxkIHRoZSBsZXhlci4gT25jZSB0aGUgbGV4ZXIgaGFzIGJlZW4gYnVpbHQsIHR3byBtZXRob2RzIGNhbgorYmUgdXNlZCB0byBjb250cm9sIHRoZSBsZXhlci4KKzwvcD4KKzx1bD4KKzxsaT48dHQ+bGV4ZXIuaW5wdXQoZGF0YSk8L3R0Pi4gICBSZXNldCB0aGUgbGV4ZXIgYW5kIHN0b3JlIGEgbmV3IGlucHV0IHN0cmluZy4KKzxsaT48dHQ+bGV4ZXIudG9rZW4oKTwvdHQ+LiAgUmV0dXJuIHRoZSBuZXh0IHRva2VuLiAgUmV0dXJucyBhIHNwZWNpYWwgPHR0PkxleFRva2VuPC90dD4gaW5zdGFuY2Ugb24gc3VjY2VzcyBvcgorTm9uZSBpZiB0aGUgZW5kIG9mIHRoZSBpbnB1dCB0ZXh0IGhhcyBiZWVuIHJlYWNoZWQuCis8L3VsPgorCis8SDM+PGEgbmFtZT0icGx5X25uMTQiPjwvYT40LjEyIFRoZSBAVE9LRU4gZGVjb3JhdG9yPC9IMz4KKworCitJbiBzb21lIGFwcGxpY2F0aW9ucywgeW91IG1heSB3YW50IHRvIGRlZmluZSBidWlsZCB0b2tlbnMgZnJvbSBhcyBhIHNlcmllcyBvZgorbW9yZSBjb21wbGV4IHJlZ3VsYXIgZXhwcmVzc2lvbiBydWxlcy4gIEZvciBleGFtcGxlOgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitkaWdpdCAgICAgICAgICAgID0gcicoWzAtOV0pJworbm9uZGlnaXQgICAgICAgICA9IHInKFtfQS1aYS16XSknCitpZGVudGlmaWVyICAgICAgID0gcicoJyArIG5vbmRpZ2l0ICsgcicoJyArIGRpZ2l0ICsgcid8JyArIG5vbmRpZ2l0ICsgcicpKiknICAgICAgICAKKworZGVmIHRfSUQodCk6CisgICAgIyB3YW50IGRvY3N0cmluZyB0byBiZSBpZGVudGlmaWVyIGFib3ZlLiA/Pz8/PworICAgIC4uLgorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK0luIHRoaXMgY2FzZSwgd2Ugd2FudCB0aGUgcmVndWxhciBleHByZXNzaW9uIHJ1bGUgZm9yIDx0dD5JRDwvdHQ+IHRvIGJlIG9uZSBvZiB0aGUgdmFyaWFibGVzIGFib3ZlLiBIb3dldmVyLCB0aGVyZSBpcyBubword2F5IHRvIGRpcmVjdGx5IHNwZWNpZnkgdGhpcyB1c2luZyBhIG5vcm1hbCBkb2N1bWVudGF0aW9uIHN0cmluZy4gICBUbyBzb2x2ZSB0aGlzIHByb2JsZW0sIHlvdSBjYW4gdXNlIHRoZSA8dHQ+QFRPS0VOPC90dD4KK2RlY29yYXRvci4gIEZvciBleGFtcGxlOgorCis8YmxvY2txdW90ZT4KKzxwcmU+Citmcm9tIHBseS5sZXggaW1wb3J0IFRPS0VOCisKK0BUT0tFTihpZGVudGlmaWVyKQorZGVmIHRfSUQodCk6CisgICAgLi4uCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworPHA+CitUaGlzIHdpbGwgYXR0YWNoIDx0dD5pZGVudGlmaWVyPC90dD4gdG8gdGhlIGRvY3N0cmluZyBmb3IgPHR0PnRfSUQoKTwvdHQ+IGFsbG93aW5nIDx0dD5sZXgucHk8L3R0PiB0byB3b3JrIG5vcm1hbGx5LiAKKzwvcD4KKworPEgzPjxhIG5hbWU9InBseV9ubjE1Ij48L2E+NC4xMyBPcHRpbWl6ZWQgbW9kZTwvSDM+CisKKworRm9yIGltcHJvdmVkIHBlcmZvcm1hbmNlLCBpdCBtYXkgYmUgZGVzaXJhYmxlIHRvIHVzZSBQeXRob24ncworb3B0aW1pemVkIG1vZGUgKGUuZy4sIHJ1bm5pbmcgUHl0aG9uIHdpdGggdGhlIDx0dD4tTzwvdHQ+CitvcHRpb24pLiBIb3dldmVyLCBkb2luZyBzbyBjYXVzZXMgUHl0aG9uIHRvIGlnbm9yZSBkb2N1bWVudGF0aW9uCitzdHJpbmdzLiAgVGhpcyBwcmVzZW50cyBzcGVjaWFsIHByb2JsZW1zIGZvciA8dHQ+bGV4LnB5PC90dD4uICBUbworaGFuZGxlIHRoaXMgY2FzZSwgeW91IGNhbiBjcmVhdGUgeW91ciBsZXhlciB1c2luZwordGhlIDx0dD5vcHRpbWl6ZTwvdHQ+IG9wdGlvbiBhcyBmb2xsb3dzOgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitsZXhlciA9IGxleC5sZXgob3B0aW1pemU9MSkKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitOZXh0LCBydW4gUHl0aG9uIGluIGl0cyBub3JtYWwgb3BlcmF0aW5nIG1vZGUuICBXaGVuIHlvdSBkbwordGhpcywgPHR0PmxleC5weTwvdHQ+IHdpbGwgd3JpdGUgYSBmaWxlIGNhbGxlZCA8dHQ+bGV4dGFiLnB5PC90dD4gaW4KK3RoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgbW9kdWxlIGNvbnRhaW5pbmcgdGhlIGxleGVyIHNwZWNpZmljYXRpb24uCitUaGlzIGZpbGUgY29udGFpbnMgYWxsIG9mIHRoZSByZWd1bGFyCitleHByZXNzaW9uIHJ1bGVzIGFuZCB0YWJsZXMgdXNlZCBkdXJpbmcgbGV4aW5nLiAgT24gc3Vic2VxdWVudAorZXhlY3V0aW9ucywKKzx0dD5sZXh0YWIucHk8L3R0PiB3aWxsIHNpbXBseSBiZSBpbXBvcnRlZCB0byBidWlsZCB0aGUgbGV4ZXIuICBUaGlzCithcHByb2FjaCBzdWJzdGFudGlhbGx5IGltcHJvdmVzIHRoZSBzdGFydHVwIHRpbWUgb2YgdGhlIGxleGVyIGFuZCBpdAord29ya3MgaW4gUHl0aG9uJ3Mgb3B0aW1pemVkIG1vZGUuCisKKzxwPgorVG8gY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBsZXhlci1nZW5lcmF0ZWQgbW9kdWxlLCB1c2UgdGhlIDx0dD5sZXh0YWI8L3R0PiBrZXl3b3JkIGFyZ3VtZW50LiAgRm9yIGV4YW1wbGU6Cis8L3A+CisKKzxibG9ja3F1b3RlPgorPHByZT4KK2xleGVyID0gbGV4LmxleChvcHRpbWl6ZT0xLGxleHRhYj0iZm9vdGFiIikKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitXaGVuIHJ1bm5pbmcgaW4gb3B0aW1pemVkIG1vZGUsIGl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgbGV4IGRpc2FibGVzIG1vc3QgZXJyb3IgY2hlY2tpbmcuICBUaHVzLCB0aGlzIGlzIHJlYWxseSBvbmx5IHJlY29tbWVuZGVkCitpZiB5b3UncmUgc3VyZSBldmVyeXRoaW5nIGlzIHdvcmtpbmcgY29ycmVjdGx5IGFuZCB5b3UncmUgcmVhZHkgdG8gc3RhcnQgcmVsZWFzaW5nIHByb2R1Y3Rpb24gY29kZS4KKworPEgzPjxhIG5hbWU9InBseV9ubjE2Ij48L2E+NC4xNCBEZWJ1Z2dpbmc8L0gzPgorCisKK0ZvciB0aGUgcHVycG9zZSBvZiBkZWJ1Z2dpbmcsIHlvdSBjYW4gcnVuIDx0dD5sZXgoKTwvdHQ+IGluIGEgZGVidWdnaW5nIG1vZGUgYXMgZm9sbG93czoKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorbGV4ZXIgPSBsZXgubGV4KGRlYnVnPTEpCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworPHA+CitUaGlzIHdpbGwgcHJvZHVjZSB2YXJpb3VzIHNvcnRzIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbmNsdWRpbmcgYWxsIG9mIHRoZSBhZGRlZCBydWxlcywKK3RoZSBtYXN0ZXIgcmVndWxhciBleHByZXNzaW9ucyB1c2VkIGJ5IHRoZSBsZXhlciwgYW5kIHRva2VucyBnZW5lcmF0aW5nIGR1cmluZyBsZXhpbmcuCis8L3A+CisKKzxwPgorSW4gYWRkaXRpb24sIDx0dD5sZXgucHk8L3R0PiBjb21lcyB3aXRoIGEgc2ltcGxlIG1haW4gZnVuY3Rpb24gd2hpY2gKK3dpbGwgZWl0aGVyIHRva2VuaXplIGlucHV0IHJlYWQgZnJvbSBzdGFuZGFyZCBpbnB1dCBvciBmcm9tIGEgZmlsZSBzcGVjaWZpZWQKK29uIHRoZSBjb21tYW5kIGxpbmUuIFRvIHVzZSBpdCwgc2ltcGx5IHB1dCB0aGlzIGluIHlvdXIgbGV4ZXI6Cis8L3A+CisKKzxibG9ja3F1b3RlPgorPHByZT4KK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgIGxleC5ydW5tYWluKCkKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitQbGVhc2UgcmVmZXIgdG8gdGhlICJEZWJ1Z2dpbmciIHNlY3Rpb24gbmVhciB0aGUgZW5kIGZvciBzb21lIG1vcmUgYWR2YW5jZWQgZGV0YWlscyAKK29mIGRlYnVnZ2luZy4KKworPEgzPjxhIG5hbWU9InBseV9ubjE3Ij48L2E+NC4xNSBBbHRlcm5hdGl2ZSBzcGVjaWZpY2F0aW9uIG9mIGxleGVyczwvSDM+CisKKworQXMgc2hvd24gaW4gdGhlIGV4YW1wbGUsIGxleGVycyBhcmUgc3BlY2lmaWVkIGFsbCB3aXRoaW4gb25lIFB5dGhvbiBtb2R1bGUuICAgSWYgeW91IHdhbnQgdG8KK3B1dCB0b2tlbiBydWxlcyBpbiBhIGRpZmZlcmVudCBtb2R1bGUgZnJvbSB0aGUgb25lIGluIHdoaWNoIHlvdSBpbnZva2UgPHR0PmxleCgpPC90dD4sIHVzZSB0aGUKKzx0dD5tb2R1bGU8L3R0PiBrZXl3b3JkIGFyZ3VtZW50LgorCis8cD4KK0ZvciBleGFtcGxlLCB5b3UgbWlnaHQgaGF2ZSBhIGRlZGljYXRlZCBtb2R1bGUgdGhhdCBqdXN0IGNvbnRhaW5zCit0aGUgdG9rZW4gcnVsZXM6CisKKzxibG9ja3F1b3RlPgorPHByZT4KKyMgbW9kdWxlOiB0b2tydWxlcy5weQorIyBUaGlzIG1vZHVsZSBqdXN0IGNvbnRhaW5zIHRoZSBsZXhpbmcgcnVsZXMKKworIyBMaXN0IG9mIHRva2VuIG5hbWVzLiAgIFRoaXMgaXMgYWx3YXlzIHJlcXVpcmVkCit0b2tlbnMgPSAoCisgICAnTlVNQkVSJywKKyAgICdQTFVTJywKKyAgICdNSU5VUycsCisgICAnVElNRVMnLAorICAgJ0RJVklERScsCisgICAnTFBBUkVOJywKKyAgICdSUEFSRU4nLAorKQorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiBydWxlcyBmb3Igc2ltcGxlIHRva2VucwordF9QTFVTICAgID0gcidcKycKK3RfTUlOVVMgICA9IHInLScKK3RfVElNRVMgICA9IHInXConCit0X0RJVklERSAgPSByJy8nCit0X0xQQVJFTiAgPSByJ1woJwordF9SUEFSRU4gID0gcidcKScKKworIyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBydWxlIHdpdGggc29tZSBhY3Rpb24gY29kZQorZGVmIHRfTlVNQkVSKHQpOgorICAgIHInXGQrJworICAgIHQudmFsdWUgPSBpbnQodC52YWx1ZSkgICAgCisgICAgcmV0dXJuIHQKKworIyBEZWZpbmUgYSBydWxlIHNvIHdlIGNhbiB0cmFjayBsaW5lIG51bWJlcnMKK2RlZiB0X25ld2xpbmUodCk6CisgICAgcidcbisnCisgICAgdC5sZXhlci5saW5lbm8gKz0gbGVuKHQudmFsdWUpCisKKyMgQSBzdHJpbmcgY29udGFpbmluZyBpZ25vcmVkIGNoYXJhY3RlcnMgKHNwYWNlcyBhbmQgdGFicykKK3RfaWdub3JlICA9ICcgXHQnCisKKyMgRXJyb3IgaGFuZGxpbmcgcnVsZQorZGVmIHRfZXJyb3IodCk6CisgICAgcHJpbnQoIklsbGVnYWwgY2hhcmFjdGVyICclcyciICUgdC52YWx1ZVswXSkKKyAgICB0LmxleGVyLnNraXAoMSkKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitOb3csIGlmIHlvdSB3YW50ZWQgdG8gYnVpbGQgYSB0b2tlbml6ZXIgZnJvbSB0aGVzZSBydWxlcyBmcm9tIHdpdGhpbiBhIGRpZmZlcmVudCBtb2R1bGUsIHlvdSB3b3VsZCBkbyB0aGUgZm9sbG93aW5nIChzaG93biBmb3IgUHl0aG9uIGludGVyYWN0aXZlIG1vZGUpOgorCis8YmxvY2txdW90ZT4KKzxwcmU+Cis+Pj4gaW1wb3J0IHRva3J1bGVzCis+Pj4gPGI+bGV4ZXIgPSBsZXgubGV4KG1vZHVsZT10b2tydWxlcyk8L2I+Cis+Pj4gbGV4ZXIuaW5wdXQoIjMgKyA0IikKKz4+PiBsZXhlci50b2tlbigpCitMZXhUb2tlbihOVU1CRVIsMywxLDEsMCkKKz4+PiBsZXhlci50b2tlbigpCitMZXhUb2tlbihQTFVTLCcrJywxLDIpCis+Pj4gbGV4ZXIudG9rZW4oKQorTGV4VG9rZW4oTlVNQkVSLDQsMSw0KQorPj4+IGxleGVyLnRva2VuKCkKK05vbmUKKz4+PgorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK1RoZSA8dHQ+bW9kdWxlPC90dD4gb3B0aW9uIGNhbiBhbHNvIGJlIHVzZWQgdG8gZGVmaW5lIGxleGVycyBmcm9tIGluc3RhbmNlcyBvZiBhIGNsYXNzLiAgRm9yIGV4YW1wbGU6CisKKzxibG9ja3F1b3RlPgorPHByZT4KK2ltcG9ydCBwbHkubGV4IGFzIGxleAorCitjbGFzcyBNeUxleGVyKG9iamVjdCk6CisgICAgIyBMaXN0IG9mIHRva2VuIG5hbWVzLiAgIFRoaXMgaXMgYWx3YXlzIHJlcXVpcmVkCisgICAgdG9rZW5zID0gKAorICAgICAgICdOVU1CRVInLAorICAgICAgICdQTFVTJywKKyAgICAgICAnTUlOVVMnLAorICAgICAgICdUSU1FUycsCisgICAgICAgJ0RJVklERScsCisgICAgICAgJ0xQQVJFTicsCisgICAgICAgJ1JQQVJFTicsCisgICAgKQorCisgICAgIyBSZWd1bGFyIGV4cHJlc3Npb24gcnVsZXMgZm9yIHNpbXBsZSB0b2tlbnMKKyAgICB0X1BMVVMgICAgPSByJ1wrJworICAgIHRfTUlOVVMgICA9IHInLScKKyAgICB0X1RJTUVTICAgPSByJ1wqJworICAgIHRfRElWSURFICA9IHInLycKKyAgICB0X0xQQVJFTiAgPSByJ1woJworICAgIHRfUlBBUkVOICA9IHInXCknCisKKyAgICAjIEEgcmVndWxhciBleHByZXNzaW9uIHJ1bGUgd2l0aCBzb21lIGFjdGlvbiBjb2RlCisgICAgIyBOb3RlIGFkZGl0aW9uIG9mIHNlbGYgcGFyYW1ldGVyIHNpbmNlIHdlJ3JlIGluIGEgY2xhc3MKKyAgICBkZWYgdF9OVU1CRVIoc2VsZix0KToKKyAgICAgICAgcidcZCsnCisgICAgICAgIHQudmFsdWUgPSBpbnQodC52YWx1ZSkgICAgCisgICAgICAgIHJldHVybiB0CisKKyAgICAjIERlZmluZSBhIHJ1bGUgc28gd2UgY2FuIHRyYWNrIGxpbmUgbnVtYmVycworICAgIGRlZiB0X25ld2xpbmUoc2VsZix0KToKKyAgICAgICAgcidcbisnCisgICAgICAgIHQubGV4ZXIubGluZW5vICs9IGxlbih0LnZhbHVlKQorCisgICAgIyBBIHN0cmluZyBjb250YWluaW5nIGlnbm9yZWQgY2hhcmFjdGVycyAoc3BhY2VzIGFuZCB0YWJzKQorICAgIHRfaWdub3JlICA9ICcgXHQnCisKKyAgICAjIEVycm9yIGhhbmRsaW5nIHJ1bGUKKyAgICBkZWYgdF9lcnJvcihzZWxmLHQpOgorICAgICAgICBwcmludCgiSWxsZWdhbCBjaGFyYWN0ZXIgJyVzJyIgJSB0LnZhbHVlWzBdKQorICAgICAgICB0LmxleGVyLnNraXAoMSkKKworICAgIDxiPiMgQnVpbGQgdGhlIGxleGVyCisgICAgZGVmIGJ1aWxkKHNlbGYsKiprd2FyZ3MpOgorICAgICAgICBzZWxmLmxleGVyID0gbGV4LmxleChtb2R1bGU9c2VsZiwgKiprd2FyZ3MpPC9iPgorICAgIAorICAgICMgVGVzdCBpdCBvdXRwdXQKKyAgICBkZWYgdGVzdChzZWxmLGRhdGEpOgorICAgICAgICBzZWxmLmxleGVyLmlucHV0KGRhdGEpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgdG9rID0gc2VsZi5sZXhlci50b2tlbigpCisgICAgICAgICAgICAgaWYgbm90IHRvazogCisgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgcHJpbnQodG9rKQorCisjIEJ1aWxkIHRoZSBsZXhlciBhbmQgdHJ5IGl0IG91dAorbSA9IE15TGV4ZXIoKQorbS5idWlsZCgpICAgICAgICAgICAjIEJ1aWxkIHRoZSBsZXhlcgorbS50ZXN0KCIzICsgNCIpICAgICAjIFRlc3QgaXQKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCisKK1doZW4gYnVpbGRpbmcgYSBsZXhlciBmcm9tIGNsYXNzLCA8ZW0+eW91IHNob3VsZCBjb25zdHJ1Y3QgdGhlIGxleGVyIGZyb20KK2FuIGluc3RhbmNlIG9mIHRoZSBjbGFzczwvZW0+LCBub3QgdGhlIGNsYXNzIG9iamVjdCBpdHNlbGYuICBUaGlzIGlzIGJlY2F1c2UKK1BMWSBvbmx5IHdvcmtzIHByb3Blcmx5IGlmIHRoZSBsZXhlciBhY3Rpb25zIGFyZSBkZWZpbmVkIGJ5IGJvdW5kLW1ldGhvZHMuCisKKzxwPgorV2hlbiB1c2luZyB0aGUgPHR0Pm1vZHVsZTwvdHQ+IG9wdGlvbiB0byA8dHQ+bGV4KCk8L3R0PiwgUExZIGNvbGxlY3RzIHN5bWJvbHMKK2Zyb20gdGhlIHVuZGVybHlpbmcgb2JqZWN0IHVzaW5nIHRoZSA8dHQ+ZGlyKCk8L3R0PiBmdW5jdGlvbi4gVGhlcmUgaXMgbm8KK2RpcmVjdCBhY2Nlc3MgdG8gdGhlIDx0dD5fX2RpY3RfXzwvdHQ+IGF0dHJpYnV0ZSBvZiB0aGUgb2JqZWN0IHN1cHBsaWVkIGFzIGEgCittb2R1bGUgdmFsdWUuIDwvcD4KKworPFA+CitGaW5hbGx5LCBpZiB5b3Ugd2FudCB0byBrZWVwIHRoaW5ncyBuaWNlbHkgZW5jYXBzdWxhdGVkLCBidXQgZG9uJ3Qgd2FudCB0byB1c2UgYSAKK2Z1bGwtZmxlZGdlZCBjbGFzcyBkZWZpbml0aW9uLCBsZXhlcnMgY2FuIGJlIGRlZmluZWQgdXNpbmcgY2xvc3VyZXMuICBGb3IgZXhhbXBsZToKKworPGJsb2NrcXVvdGU+Cis8cHJlPgoraW1wb3J0IHBseS5sZXggYXMgbGV4CisKKyMgTGlzdCBvZiB0b2tlbiBuYW1lcy4gICBUaGlzIGlzIGFsd2F5cyByZXF1aXJlZAordG9rZW5zID0gKAorICAnTlVNQkVSJywKKyAgJ1BMVVMnLAorICAnTUlOVVMnLAorICAnVElNRVMnLAorICAnRElWSURFJywKKyAgJ0xQQVJFTicsCisgICdSUEFSRU4nLAorKQorCitkZWYgTXlMZXhlcigpOgorICAgICMgUmVndWxhciBleHByZXNzaW9uIHJ1bGVzIGZvciBzaW1wbGUgdG9rZW5zCisgICAgdF9QTFVTICAgID0gcidcKycKKyAgICB0X01JTlVTICAgPSByJy0nCisgICAgdF9USU1FUyAgID0gcidcKicKKyAgICB0X0RJVklERSAgPSByJy8nCisgICAgdF9MUEFSRU4gID0gcidcKCcKKyAgICB0X1JQQVJFTiAgPSByJ1wpJworCisgICAgIyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBydWxlIHdpdGggc29tZSBhY3Rpb24gY29kZQorICAgIGRlZiB0X05VTUJFUih0KToKKyAgICAgICAgcidcZCsnCisgICAgICAgIHQudmFsdWUgPSBpbnQodC52YWx1ZSkgICAgCisgICAgICAgIHJldHVybiB0CisKKyAgICAjIERlZmluZSBhIHJ1bGUgc28gd2UgY2FuIHRyYWNrIGxpbmUgbnVtYmVycworICAgIGRlZiB0X25ld2xpbmUodCk6CisgICAgICAgIHInXG4rJworICAgICAgICB0LmxleGVyLmxpbmVubyArPSBsZW4odC52YWx1ZSkKKworICAgICMgQSBzdHJpbmcgY29udGFpbmluZyBpZ25vcmVkIGNoYXJhY3RlcnMgKHNwYWNlcyBhbmQgdGFicykKKyAgICB0X2lnbm9yZSAgPSAnIFx0JworCisgICAgIyBFcnJvciBoYW5kbGluZyBydWxlCisgICAgZGVmIHRfZXJyb3IodCk6CisgICAgICAgIHByaW50KCJJbGxlZ2FsIGNoYXJhY3RlciAnJXMnIiAlIHQudmFsdWVbMF0pCisgICAgICAgIHQubGV4ZXIuc2tpcCgxKQorCisgICAgIyBCdWlsZCB0aGUgbGV4ZXIgZnJvbSBteSBlbnZpcm9ubWVudCBhbmQgcmV0dXJuIGl0ICAgIAorICAgIHJldHVybiBsZXgubGV4KCkKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCis8cD4KKzxiPkltcG9ydGFudCBub3RlOjwvYj4gSWYgeW91IGFyZSBkZWZpbmluZyBhIGxleGVyIHVzaW5nIGEgY2xhc3Mgb3IgY2xvc3VyZSwgYmUgYXdhcmUgdGhhdCBQTFkgc3RpbGwgcmVxdWlyZXMgeW91IHRvIG9ubHkKK2RlZmluZSBhIHNpbmdsZSBsZXhlciBwZXIgbW9kdWxlIChzb3VyY2UgZmlsZSkuICAgVGhlcmUgYXJlIGV4dGVuc2l2ZSB2YWxpZGF0aW9uL2Vycm9yIGNoZWNraW5nIHBhcnRzIG9mIHRoZSBQTFkgdGhhdCAKK21heSBmYWxzZWx5IHJlcG9ydCBlcnJvciBtZXNzYWdlcyBpZiB5b3UgZG9uJ3QgZm9sbG93IHRoaXMgcnVsZS4KKzwvcD4KKworPEgzPjxhIG5hbWU9InBseV9ubjE4Ij48L2E+NC4xNiBNYWludGFpbmluZyBzdGF0ZTwvSDM+CisKKworSW4geW91ciBsZXhlciwgeW91IG1heSB3YW50IHRvIG1haW50YWluIGEgdmFyaWV0eSBvZiBzdGF0ZQoraW5mb3JtYXRpb24uICBUaGlzIG1pZ2h0IGluY2x1ZGUgbW9kZSBzZXR0aW5ncywgc3ltYm9sIHRhYmxlcywgYW5kCitvdGhlciBkZXRhaWxzLiAgQXMgYW4gZXhhbXBsZSwgc3VwcG9zZSB0aGF0IHlvdSB3YW50ZWQgdG8ga2VlcAordHJhY2sgb2YgaG93IG1hbnkgTlVNQkVSIHRva2VucyBoYWQgYmVlbiBlbmNvdW50ZXJlZC4gIAorCis8cD4KK09uZSB3YXkgdG8gZG8gdGhpcyBpcyB0byBrZWVwIGEgc2V0IG9mIGdsb2JhbCB2YXJpYWJsZXMgaW4gdGhlIG1vZHVsZQord2hlcmUgeW91IGNyZWF0ZWQgdGhlIGxleGVyLiAgRm9yIGV4YW1wbGU6IAorCis8YmxvY2txdW90ZT4KKzxwcmU+CitudW1fY291bnQgPSAwCitkZWYgdF9OVU1CRVIodCk6CisgICAgcidcZCsnCisgICAgZ2xvYmFsIG51bV9jb3VudAorICAgIG51bV9jb3VudCArPSAxCisgICAgdC52YWx1ZSA9IGludCh0LnZhbHVlKSAgICAKKyAgICByZXR1cm4gdAorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK0lmIHlvdSBkb24ndCBsaWtlIHRoZSB1c2Ugb2YgYSBnbG9iYWwgdmFyaWFibGUsIGFub3RoZXIgcGxhY2UgdG8gc3RvcmUKK2luZm9ybWF0aW9uIGlzIGluc2lkZSB0aGUgTGV4ZXIgb2JqZWN0IGNyZWF0ZWQgYnkgPHR0PmxleCgpPC90dD4uCitUbyB0aGlzLCB5b3UgY2FuIHVzZSB0aGUgPHR0PmxleGVyPC90dD4gYXR0cmlidXRlIG9mIHRva2VucyBwYXNzZWQgdG8KK3RoZSB2YXJpb3VzIHJ1bGVzLiBGb3IgZXhhbXBsZToKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorZGVmIHRfTlVNQkVSKHQpOgorICAgIHInXGQrJworICAgIHQubGV4ZXIubnVtX2NvdW50ICs9IDEgICAgICMgTm90ZSB1c2Ugb2YgbGV4ZXIgYXR0cmlidXRlCisgICAgdC52YWx1ZSA9IGludCh0LnZhbHVlKSAgICAKKyAgICByZXR1cm4gdAorCitsZXhlciA9IGxleC5sZXgoKQorbGV4ZXIubnVtX2NvdW50ID0gMCAgICAgICAgICAgICMgU2V0IHRoZSBpbml0aWFsIGNvdW50Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworVGhpcyBsYXR0ZXIgYXBwcm9hY2ggaGFzIHRoZSBhZHZhbnRhZ2Ugb2YgYmVpbmcgc2ltcGxlIGFuZCB3b3JraW5nIAorY29ycmVjdGx5IGluIGFwcGxpY2F0aW9ucyB3aGVyZSBtdWx0aXBsZSBpbnN0YW50aWF0aW9ucyBvZiBhIGdpdmVuCitsZXhlciBleGlzdCBpbiB0aGUgc2FtZSBhcHBsaWNhdGlvbi4gICBIb3dldmVyLCB0aGlzIG1pZ2h0IGFsc28gZmVlbAorbGlrZSBhIGdyb3NzIHZpb2xhdGlvbiBvZiBlbmNhcHN1bGF0aW9uIHRvIE9PIHB1cmlzdHMuIAorSnVzdCB0byBwdXQgeW91ciBtaW5kIGF0IHNvbWUgZWFzZSwgYWxsCitpbnRlcm5hbCBhdHRyaWJ1dGVzIG9mIHRoZSBsZXhlciAod2l0aCB0aGUgZXhjZXB0aW9uIG9mIDx0dD5saW5lbm88L3R0PikgaGF2ZSBuYW1lcyB0aGF0IGFyZSBwcmVmaXhlZAorYnkgPHR0PmxleDwvdHQ+IChlLmcuLCA8dHQ+bGV4ZGF0YTwvdHQ+LDx0dD5sZXhwb3M8L3R0PiwgZXRjLikuICBUaHVzLAoraXQgaXMgcGVyZmVjdGx5IHNhZmUgdG8gc3RvcmUgYXR0cmlidXRlcyBpbiB0aGUgbGV4ZXIgdGhhdAorZG9uJ3QgaGF2ZSBuYW1lcyBzdGFydGluZyB3aXRoIHRoYXQgcHJlZml4IG9yIGEgbmFtZSB0aGF0IGNvbmZsaWN0cyB3aXRoIG9uZSBvZiB0aGUKK3ByZWRlZmluZWQgbWV0aG9kcyAoZS5nLiwgPHR0PmlucHV0KCk8L3R0PiwgPHR0PnRva2VuKCk8L3R0PiwgZXRjLikuCisKKzxwPgorSWYgeW91IGRvbid0IGxpa2UgYXNzaWduaW5nIHZhbHVlcyBvbiB0aGUgbGV4ZXIgb2JqZWN0LCB5b3UgY2FuIGRlZmluZSB5b3VyIGxleGVyIGFzIGEgY2xhc3MgYXMKK3Nob3duIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uOgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitjbGFzcyBNeUxleGVyOgorICAgIC4uLgorICAgIGRlZiB0X05VTUJFUihzZWxmLHQpOgorICAgICAgICByJ1xkKycKKyAgICAgICAgc2VsZi5udW1fY291bnQgKz0gMQorICAgICAgICB0LnZhbHVlID0gaW50KHQudmFsdWUpICAgIAorICAgICAgICByZXR1cm4gdAorCisgICAgZGVmIGJ1aWxkKHNlbGYsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5sZXhlciA9IGxleC5sZXgob2JqZWN0PXNlbGYsKiprd2FyZ3MpCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYubnVtX2NvdW50ID0gMAorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK1RoZSBjbGFzcyBhcHByb2FjaCBtYXkgYmUgdGhlIGVhc2llc3QgdG8gbWFuYWdlIGlmIHlvdXIgYXBwbGljYXRpb24gaXMKK2dvaW5nIHRvIGJlIGNyZWF0aW5nIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBsZXhlciBhbmQgeW91IG5lZWQKK3RvIG1hbmFnZSBhIGxvdCBvZiBzdGF0ZS4KKworPHA+CitTdGF0ZSBjYW4gYWxzbyBiZSBtYW5hZ2VkIHRocm91Z2ggY2xvc3VyZXMuICAgRm9yIGV4YW1wbGUsIGluIFB5dGhvbiAzOgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitkZWYgTXlMZXhlcigpOgorICAgIG51bV9jb3VudCA9IDAKKyAgICAuLi4KKyAgICBkZWYgdF9OVU1CRVIodCk6CisgICAgICAgIHInXGQrJworICAgICAgICBub25sb2NhbCBudW1fY291bnQKKyAgICAgICAgbnVtX2NvdW50ICs9IDEKKyAgICAgICAgdC52YWx1ZSA9IGludCh0LnZhbHVlKSAgICAKKyAgICAgICAgcmV0dXJuIHQKKyAgICAuLi4KKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCis8SDM+PGEgbmFtZT0icGx5X25uMTkiPjwvYT40LjE3IExleGVyIGNsb25pbmc8L0gzPgorCisKKzxwPgorSWYgbmVjZXNzYXJ5LCBhIGxleGVyIG9iamVjdCBjYW4gYmUgZHVwbGljYXRlZCBieSBpbnZva2luZyBpdHMgPHR0PmNsb25lKCk8L3R0PiBtZXRob2QuICBGb3IgZXhhbXBsZToKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorbGV4ZXIgPSBsZXgubGV4KCkKKy4uLgorbmV3bGV4ZXIgPSBsZXhlci5jbG9uZSgpCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworV2hlbiBhIGxleGVyIGlzIGNsb25lZCwgdGhlIGNvcHkgaXMgZXhhY3RseSBpZGVudGljYWwgdG8gdGhlIG9yaWdpbmFsIGxleGVyCitpbmNsdWRpbmcgYW55IGlucHV0IHRleHQgYW5kIGludGVybmFsIHN0YXRlLiBIb3dldmVyLCB0aGUgY2xvbmUgYWxsb3dzIGEKK2RpZmZlcmVudCBzZXQgb2YgaW5wdXQgdGV4dCB0byBiZSBzdXBwbGllZCB3aGljaCBtYXkgYmUgcHJvY2Vzc2VkIHNlcGFyYXRlbHkuCitUaGlzIG1heSBiZSB1c2VmdWwgaW4gc2l0dWF0aW9ucyB3aGVuIHlvdSBhcmUgd3JpdGluZyBhIHBhcnNlci9jb21waWxlciB0aGF0CitpbnZvbHZlcyByZWN1cnNpdmUgb3IgcmVlbnRyYW50IHByb2Nlc3NpbmcuICBGb3IgaW5zdGFuY2UsIGlmIHlvdQorbmVlZGVkIHRvIHNjYW4gYWhlYWQgaW4gdGhlIGlucHV0IGZvciBzb21lIHJlYXNvbiwgeW91IGNvdWxkIGNyZWF0ZSBhCitjbG9uZSBhbmQgdXNlIGl0IHRvIGxvb2sgYWhlYWQuICBPciwgaWYgeW91IHdlcmUgaW1wbGVtZW50aW5nIHNvbWUga2luZCBvZiBwcmVwcm9jZXNzb3IsCitjbG9uZWQgbGV4ZXJzIGNvdWxkIGJlIHVzZWQgdG8gaGFuZGxlIGRpZmZlcmVudCBpbnB1dCBmaWxlcy4KKworPHA+CitDcmVhdGluZyBhIGNsb25lIGlzIGRpZmZlcmVudCB0aGFuIGNhbGxpbmcgPHR0PmxleC5sZXgoKTwvdHQ+IGluIHRoYXQKK1BMWSBkb2Vzbid0IHJlZ2VuZXJhdGUgYW55IG9mIHRoZSBpbnRlcm5hbCB0YWJsZXMgb3IgcmVndWxhciBleHByZXNzaW9ucy4KKworPHA+CitTcGVjaWFsIGNvbnNpZGVyYXRpb25zIG5lZWQgdG8gYmUgbWFkZSB3aGVuIGNsb25pbmcgbGV4ZXJzIHRoYXQgYWxzbworbWFpbnRhaW4gdGhlaXIgb3duIGludGVybmFsIHN0YXRlIHVzaW5nIGNsYXNzZXMgb3IgY2xvc3VyZXMuICBOYW1lbHksCit5b3UgbmVlZCB0byBiZSBhd2FyZSB0aGF0IHRoZSBuZXdseSBjcmVhdGVkIGxleGVycyB3aWxsIHNoYXJlIGFsbCBvZgordGhpcyBzdGF0ZSB3aXRoIHRoZSBvcmlnaW5hbCBsZXhlci4gIEZvciBleGFtcGxlLCBpZiB5b3UgZGVmaW5lZCBhCitsZXhlciBhcyBhIGNsYXNzIGFuZCBkaWQgdGhpczoKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorbSA9IE15TGV4ZXIoKQorYSA9IGxleC5sZXgob2JqZWN0PW0pICAgICAgIyBDcmVhdGUgYSBsZXhlcgorCitiID0gYS5jbG9uZSgpICAgICAgICAgICAgICAjIENsb25lIHRoZSBsZXhlcgorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK1RoZW4gYm90aCA8dHQ+YTwvdHQ+IGFuZCA8dHQ+YjwvdHQ+IGFyZSBnb2luZyB0byBiZSBib3VuZCB0byB0aGUgc2FtZQorb2JqZWN0IDx0dD5tPC90dD4gYW5kIGFueSBjaGFuZ2VzIHRvIDx0dD5tPC90dD4gd2lsbCBiZSByZWZsZWN0ZWQgaW4gYm90aCBsZXhlcnMuICBJdCdzCitpbXBvcnRhbnQgdG8gZW1waGFzaXplIHRoYXQgPHR0PmNsb25lKCk8L3R0PiBpcyBvbmx5IG1lYW50IHRvIGNyZWF0ZSBhIG5ldyBsZXhlcgordGhhdCByZXVzZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYW5kIGVudmlyb25tZW50IG9mIGFub3RoZXIgbGV4ZXIuICBJZiB5b3UKK25lZWQgdG8gbWFrZSBhIHRvdGFsbHkgbmV3IGNvcHkgb2YgYSBsZXhlciwgdGhlbiBjYWxsIDx0dD5sZXgoKTwvdHQ+IGFnYWluLgorCis8SDM+PGEgbmFtZT0icGx5X25uMjAiPjwvYT40LjE4IEludGVybmFsIGxleGVyIHN0YXRlPC9IMz4KKworCitBIExleGVyIG9iamVjdCA8dHQ+bGV4ZXI8L3R0PiBoYXMgYSBudW1iZXIgb2YgaW50ZXJuYWwgYXR0cmlidXRlcyB0aGF0IG1heSBiZSB1c2VmdWwgaW4gY2VydGFpbgorc2l0dWF0aW9ucy4gCisKKzxwPgorPHR0PmxleGVyLmxleHBvczwvdHQ+Cis8YmxvY2txdW90ZT4KK1RoaXMgYXR0cmlidXRlIGlzIGFuIGludGVnZXIgdGhhdCBjb250YWlucyB0aGUgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gdGhlIGlucHV0IHRleHQuICBJZiB5b3UgbW9kaWZ5Cit0aGUgdmFsdWUsIGl0IHdpbGwgY2hhbmdlIHRoZSByZXN1bHQgb2YgdGhlIG5leHQgY2FsbCB0byA8dHQ+dG9rZW4oKTwvdHQ+LiAgV2l0aGluIHRva2VuIHJ1bGUgZnVuY3Rpb25zLCB0aGlzIHBvaW50cwordG8gdGhlIGZpcnN0IGNoYXJhY3RlciA8ZW0+YWZ0ZXI8L2VtPiB0aGUgbWF0Y2hlZCB0ZXh0LiAgSWYgdGhlIHZhbHVlIGlzIG1vZGlmaWVkIHdpdGhpbiBhIHJ1bGUsIHRoZSBuZXh0IHJldHVybmVkIHRva2VuIHdpbGwgYmUKK21hdGNoZWQgYXQgdGhlIG5ldyBwb3NpdGlvbi4KKzwvYmxvY2txdW90ZT4KKworPHA+Cis8dHQ+bGV4ZXIubGluZW5vPC90dD4KKzxibG9ja3F1b3RlPgorVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZSBzdG9yZWQgaW4gdGhlIGxleGVyLiAgUExZIG9ubHkgc3BlY2lmaWVzIHRoYXQgdGhlIGF0dHJpYnV0ZQorZXhpc3RzLS0taXQgbmV2ZXIgc2V0cywgdXBkYXRlcywgb3IgcGVyZm9ybXMgYW55IHByb2Nlc3Npbmcgd2l0aCBpdC4gIElmIHlvdSB3YW50IHRvIHRyYWNrIGxpbmUgbnVtYmVycywKK3lvdSB3aWxsIG5lZWQgdG8gYWRkIGNvZGUgeW91cnNlbGYgKHNlZSB0aGUgc2VjdGlvbiBvbiBsaW5lIG51bWJlcnMgYW5kIHBvc2l0aW9uYWwgaW5mb3JtYXRpb24pLgorPC9ibG9ja3F1b3RlPgorCis8cD4KKzx0dD5sZXhlci5sZXhkYXRhPC90dD4KKzxibG9ja3F1b3RlPgorVGhlIGN1cnJlbnQgaW5wdXQgdGV4dCBzdG9yZWQgaW4gdGhlIGxleGVyLiAgVGhpcyBpcyB0aGUgc3RyaW5nIHBhc3NlZCB3aXRoIHRoZSA8dHQ+aW5wdXQoKTwvdHQ+IG1ldGhvZC4gSXQKK3dvdWxkIHByb2JhYmx5IGJlIGEgYmFkIGlkZWEgdG8gbW9kaWZ5IHRoaXMgdW5sZXNzIHlvdSByZWFsbHkga25vdyB3aGF0IHlvdSdyZSBkb2luZy4KKzwvYmxvY2txdW90ZT4KKworPFA+Cis8dHQ+bGV4ZXIubGV4bWF0Y2g8L3R0PgorPGJsb2NrcXVvdGU+CitUaGlzIGlzIHRoZSByYXcgPHR0Pk1hdGNoPC90dD4gb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBQeXRob24gPHR0PnJlLm1hdGNoKCk8L3R0PiBmdW5jdGlvbiAodXNlZCBpbnRlcm5hbGx5IGJ5IFBMWSkgZm9yIHRoZQorY3VycmVudCB0b2tlbi4gIElmIHlvdSBoYXZlIHdyaXR0ZW4gYSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBjb250YWlucyBuYW1lZCBncm91cHMsIHlvdSBjYW4gdXNlIHRoaXMgdG8gcmV0cmlldmUgdGhvc2UgdmFsdWVzLgorTm90ZTogVGhpcyBhdHRyaWJ1dGUgaXMgb25seSB1cGRhdGVkIHdoZW4gdG9rZW5zIGFyZSBkZWZpbmVkIGFuZCBwcm9jZXNzZWQgYnkgZnVuY3Rpb25zLiAgCis8L2Jsb2NrcXVvdGU+CisKKzxIMz48YSBuYW1lPSJwbHlfbm4yMSI+PC9hPjQuMTkgQ29uZGl0aW9uYWwgbGV4aW5nIGFuZCBzdGFydCBjb25kaXRpb25zPC9IMz4KKworCitJbiBhZHZhbmNlZCBwYXJzaW5nIGFwcGxpY2F0aW9ucywgaXQgbWF5IGJlIHVzZWZ1bCB0byBoYXZlIGRpZmZlcmVudAorbGV4aW5nIHN0YXRlcy4gRm9yIGluc3RhbmNlLCB5b3UgbWF5IHdhbnQgdGhlIG9jY3VycmVuY2Ugb2YgYSBjZXJ0YWluCit0b2tlbiBvciBzeW50YWN0aWMgY29uc3RydWN0IHRvIHRyaWdnZXIgYSBkaWZmZXJlbnQga2luZCBvZiBsZXhpbmcuCitQTFkgc3VwcG9ydHMgYSBmZWF0dXJlIHRoYXQgYWxsb3dzIHRoZSB1bmRlcmx5aW5nIGxleGVyIHRvIGJlIHB1dCBpbnRvCithIHNlcmllcyBvZiBkaWZmZXJlbnQgc3RhdGVzLiAgRWFjaCBzdGF0ZSBjYW4gaGF2ZSBpdHMgb3duIHRva2VucywKK2xleGluZyBydWxlcywgYW5kIHNvIGZvcnRoLiAgVGhlIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIGxhcmdlbHkgb24KK3RoZSAic3RhcnQgY29uZGl0aW9uIiBmZWF0dXJlIG9mIEdOVSBmbGV4LiAgRGV0YWlscyBvZiB0aGlzIGNhbiBiZSBmb3VuZAorYXQgPGEKK2hyZWY9Imh0dHA6Ly9mbGV4LnNvdXJjZWZvcmdlLm5ldC9tYW51YWwvU3RhcnQtQ29uZGl0aW9ucy5odG1sIj5odHRwOi8vZmxleC5zb3VyY2Vmb3JnZS5uZXQvbWFudWFsL1N0YXJ0LUNvbmRpdGlvbnMuaHRtbDwvYT4uCisKKzxwPgorVG8gZGVmaW5lIGEgbmV3IGxleGluZyBzdGF0ZSwgaXQgbXVzdCBmaXJzdCBiZSBkZWNsYXJlZC4gIFRoaXMgaXMgZG9uZSBieSBpbmNsdWRpbmcgYSAic3RhdGVzIiBkZWNsYXJhdGlvbiBpbiB5b3VyCitsZXggZmlsZS4gIEZvciBleGFtcGxlOgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitzdGF0ZXMgPSAoCisgICAoJ2ZvbycsJ2V4Y2x1c2l2ZScpLAorICAgKCdiYXInLCdpbmNsdXNpdmUnKSwKKykKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitUaGlzIGRlY2xhcmF0aW9uIGRlY2xhcmVzIHR3byBzdGF0ZXMsIDx0dD4nZm9vJzwvdHQ+CithbmQgPHR0PidiYXInPC90dD4uICBTdGF0ZXMgbWF5IGJlIG9mIHR3byB0eXBlczsgPHR0PidleGNsdXNpdmUnPC90dD4KK2FuZCA8dHQ+J2luY2x1c2l2ZSc8L3R0Pi4gIEFuIGV4Y2x1c2l2ZSBzdGF0ZSBjb21wbGV0ZWx5IG92ZXJyaWRlcyB0aGUKK2RlZmF1bHQgYmVoYXZpb3Igb2YgdGhlIGxleGVyLiAgVGhhdCBpcywgbGV4IHdpbGwgb25seSByZXR1cm4gdG9rZW5zCithbmQgYXBwbHkgcnVsZXMgZGVmaW5lZCBzcGVjaWZpY2FsbHkgZm9yIHRoYXQgc3RhdGUuICBBbiBpbmNsdXNpdmUKK3N0YXRlIGFkZHMgYWRkaXRpb25hbCB0b2tlbnMgYW5kIHJ1bGVzIHRvIHRoZSBkZWZhdWx0IHNldCBvZiBydWxlcy4KK1RodXMsIGxleCB3aWxsIHJldHVybiBib3RoIHRoZSB0b2tlbnMgZGVmaW5lZCBieSBkZWZhdWx0IGluIGFkZGl0aW9uCit0byB0aG9zZSBkZWZpbmVkIGZvciB0aGUgaW5jbHVzaXZlIHN0YXRlLgorCis8cD4KK09uY2UgYSBzdGF0ZSBoYXMgYmVlbiBkZWNsYXJlZCwgdG9rZW5zIGFuZCBydWxlcyBhcmUgZGVjbGFyZWQgYnkgaW5jbHVkaW5nIHRoZQorc3RhdGUgbmFtZSBpbiB0b2tlbi9ydWxlIGRlY2xhcmF0aW9uLiAgRm9yIGV4YW1wbGU6CisKKzxibG9ja3F1b3RlPgorPHByZT4KK3RfZm9vX05VTUJFUiA9IHInXGQrJyAgICAgICAgICAgICAgICAgICAgICAjIFRva2VuICdOVU1CRVInIGluIHN0YXRlICdmb28nICAgICAgICAKK3RfYmFyX0lEICAgICA9IHInW2EtekEtWl9dW2EtekEtWjAtOV9dKicgICAjIFRva2VuICdJRCcgaW4gc3RhdGUgJ2JhcicKKworZGVmIHRfZm9vX25ld2xpbmUodCk6CisgICAgcidcbicKKyAgICB0LmxleGVyLmxpbmVubyArPSAxCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworQSB0b2tlbiBjYW4gYmUgZGVjbGFyZWQgaW4gbXVsdGlwbGUgc3RhdGVzIGJ5IGluY2x1ZGluZyBtdWx0aXBsZSBzdGF0ZSBuYW1lcyBpbiB0aGUgZGVjbGFyYXRpb24uIEZvciBleGFtcGxlOgorCis8YmxvY2txdW90ZT4KKzxwcmU+Cit0X2Zvb19iYXJfTlVNQkVSID0gcidcZCsnICAgICAgICAgIyBEZWZpbmVzIHRva2VuICdOVU1CRVInIGluIGJvdGggc3RhdGUgJ2ZvbycgYW5kICdiYXInCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworQWx0ZXJuYXRpdmUsIGEgdG9rZW4gY2FuIGJlIGRlY2xhcmVkIGluIGFsbCBzdGF0ZXMgdXNpbmcgdGhlICdBTlknIGluIHRoZSBuYW1lLgorCis8YmxvY2txdW90ZT4KKzxwcmU+Cit0X0FOWV9OVU1CRVIgPSByJ1xkKycgICAgICAgICAjIERlZmluZXMgYSB0b2tlbiAnTlVNQkVSJyBpbiBhbGwgc3RhdGVzCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworSWYgbm8gc3RhdGUgbmFtZSBpcyBzdXBwbGllZCwgYXMgaXMgbm9ybWFsbHkgdGhlIGNhc2UsIHRoZSB0b2tlbiBpcyBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWFsIHN0YXRlIDx0dD4nSU5JVElBTCc8L3R0Pi4gIEZvciBleGFtcGxlLAordGhlc2UgdHdvIGRlY2xhcmF0aW9ucyBhcmUgaWRlbnRpY2FsOgorCis8YmxvY2txdW90ZT4KKzxwcmU+Cit0X05VTUJFUiA9IHInXGQrJwordF9JTklUSUFMX05VTUJFUiA9IHInXGQrJworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKKzxwPgorU3RhdGVzIGFyZSBhbHNvIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lhbCA8dHQ+dF9pZ25vcmU8L3R0PiwgPHR0PnRfZXJyb3IoKTwvdHQ+LCBhbmQgPHR0PnRfZW9mKCk8L3R0PiBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZSwgaWYgYSBzdGF0ZSB0cmVhdHMKK3RoZXNlIGRpZmZlcmVudGx5LCB5b3UgY2FuIGRlY2xhcmU6PC9wPgorCis8YmxvY2txdW90ZT4KKzxwcmU+Cit0X2Zvb19pZ25vcmUgPSAiIFx0XG4iICAgICAgICMgSWdub3JlZCBjaGFyYWN0ZXJzIGZvciBzdGF0ZSAnZm9vJworCitkZWYgdF9iYXJfZXJyb3IodCk6ICAgICAgICAgICMgU3BlY2lhbCBlcnJvciBoYW5kbGVyIGZvciBzdGF0ZSAnYmFyJworICAgIHBhc3MgCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworQnkgZGVmYXVsdCwgbGV4aW5nIG9wZXJhdGVzIGluIHRoZSA8dHQ+J0lOSVRJQUwnPC90dD4gc3RhdGUuICBUaGlzIHN0YXRlIGluY2x1ZGVzIGFsbCBvZiB0aGUgbm9ybWFsbHkgZGVmaW5lZCB0b2tlbnMuIAorRm9yIHVzZXJzIHdobyBhcmVuJ3QgdXNpbmcgZGlmZmVyZW50IHN0YXRlcywgdGhpcyBmYWN0IGlzIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQuICAgSWYsIGR1cmluZyBsZXhpbmcgb3IgcGFyc2luZywgeW91IHdhbnQgdG8gY2hhbmdlCit0aGUgbGV4aW5nIHN0YXRlLCB1c2UgdGhlIDx0dD5iZWdpbigpPC90dD4gbWV0aG9kLiAgIEZvciBleGFtcGxlOgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitkZWYgdF9iZWdpbl9mb28odCk6CisgICAgcidzdGFydF9mb28nCisgICAgdC5sZXhlci5iZWdpbignZm9vJykgICAgICAgICAgICAgIyBTdGFydHMgJ2Zvbycgc3RhdGUKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitUbyBnZXQgb3V0IG9mIGEgc3RhdGUsIHlvdSB1c2UgPHR0PmJlZ2luKCk8L3R0PiB0byBzd2l0Y2ggYmFjayB0byB0aGUgaW5pdGlhbCBzdGF0ZS4gIEZvciBleGFtcGxlOgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitkZWYgdF9mb29fZW5kKHQpOgorICAgIHInZW5kX2ZvbycKKyAgICB0LmxleGVyLmJlZ2luKCdJTklUSUFMJykgICAgICAgICMgQmFjayB0byB0aGUgaW5pdGlhbCBzdGF0ZQorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK1RoZSBtYW5hZ2VtZW50IG9mIHN0YXRlcyBjYW4gYWxzbyBiZSBkb25lIHdpdGggYSBzdGFjay4gIEZvciBleGFtcGxlOgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitkZWYgdF9iZWdpbl9mb28odCk6CisgICAgcidzdGFydF9mb28nCisgICAgdC5sZXhlci5wdXNoX3N0YXRlKCdmb28nKSAgICAgICAgICAgICAjIFN0YXJ0cyAnZm9vJyBzdGF0ZQorCitkZWYgdF9mb29fZW5kKHQpOgorICAgIHInZW5kX2ZvbycKKyAgICB0LmxleGVyLnBvcF9zdGF0ZSgpICAgICAgICAgICAgICAgICAgICMgQmFjayB0byB0aGUgcHJldmlvdXMgc3RhdGUKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCis8cD4KK1RoZSB1c2Ugb2YgYSBzdGFjayB3b3VsZCBiZSB1c2VmdWwgaW4gc2l0dWF0aW9ucyB3aGVyZSB0aGVyZSBhcmUgbWFueSB3YXlzIG9mIGVudGVyaW5nIGEgbmV3IGxleGluZyBzdGF0ZSBhbmQgeW91IG1lcmVseSB3YW50IHRvIGdvIGJhY2sKK3RvIHRoZSBwcmV2aW91cyBzdGF0ZSBhZnRlcndhcmRzLgorCis8UD4KK0FuIGV4YW1wbGUgbWlnaHQgaGVscCBjbGFyaWZ5LiAgU3VwcG9zZSB5b3Ugd2VyZSB3cml0aW5nIGEgcGFyc2VyIGFuZCB5b3Ugd2FudGVkIHRvIGdyYWIgc2VjdGlvbnMgb2YgYXJiaXRyYXJ5IEMgY29kZSBlbmNsb3NlZCBieQorY3VybHkgYnJhY2VzLiAgVGhhdCBpcywgd2hlbmV2ZXIgeW91IGVuY291bnRlciBhIHN0YXJ0aW5nIGJyYWNlICd7JywgeW91IHdhbnQgdG8gcmVhZCBhbGwgb2YgdGhlIGVuY2xvc2VkIGNvZGUgdXAgdG8gdGhlIGVuZGluZyBicmFjZSAnfScgCithbmQgcmV0dXJuIGl0IGFzIGEgc3RyaW5nLiAgIERvaW5nIHRoaXMgd2l0aCBhIG5vcm1hbCByZWd1bGFyIGV4cHJlc3Npb24gcnVsZSBpcyBuZWFybHkgKGlmIG5vdCBhY3R1YWxseSkgaW1wb3NzaWJsZS4gIFRoaXMgaXMgYmVjYXVzZSBicmFjZXMgY2FuCitiZSBuZXN0ZWQgYW5kIGNhbiBiZSBpbmNsdWRlZCBpbiBjb21tZW50cyBhbmQgc3RyaW5ncy4gIFRodXMsIHNpbXBseSBtYXRjaGluZyB1cCB0byB0aGUgZmlyc3QgbWF0Y2hpbmcgJ30nIGNoYXJhY3RlciBpc24ndCBnb29kIGVub3VnaC4gIEhlcmUgaXMgaG93Cit5b3UgbWlnaHQgdXNlIGxleGVyIHN0YXRlcyB0byBkbyB0aGlzOgorCis8YmxvY2txdW90ZT4KKzxwcmU+CisjIERlY2xhcmUgdGhlIHN0YXRlCitzdGF0ZXMgPSAoCisgICgnY2NvZGUnLCdleGNsdXNpdmUnKSwKKykKKworIyBNYXRjaCB0aGUgZmlyc3Qgey4gRW50ZXIgY2NvZGUgc3RhdGUuCitkZWYgdF9jY29kZSh0KToKKyAgICByJ1x7JworICAgIHQubGV4ZXIuY29kZV9zdGFydCA9IHQubGV4ZXIubGV4cG9zICAgICAgICAjIFJlY29yZCB0aGUgc3RhcnRpbmcgcG9zaXRpb24KKyAgICB0LmxleGVyLmxldmVsID0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBJbml0aWFsIGJyYWNlIGxldmVsCisgICAgdC5sZXhlci5iZWdpbignY2NvZGUnKSAgICAgICAgICAgICAgICAgICAgICMgRW50ZXIgJ2Njb2RlJyBzdGF0ZQorCisjIFJ1bGVzIGZvciB0aGUgY2NvZGUgc3RhdGUKK2RlZiB0X2Njb2RlX2xicmFjZSh0KTogICAgIAorICAgIHInXHsnCisgICAgdC5sZXhlci5sZXZlbCArPTEgICAgICAgICAgICAgICAgCisKK2RlZiB0X2Njb2RlX3JicmFjZSh0KToKKyAgICByJ1x9JworICAgIHQubGV4ZXIubGV2ZWwgLT0xCisKKyAgICAjIElmIGNsb3NpbmcgYnJhY2UsIHJldHVybiB0aGUgY29kZSBmcmFnbWVudAorICAgIGlmIHQubGV4ZXIubGV2ZWwgPT0gMDoKKyAgICAgICAgIHQudmFsdWUgPSB0LmxleGVyLmxleGRhdGFbdC5sZXhlci5jb2RlX3N0YXJ0OnQubGV4ZXIubGV4cG9zKzFdCisgICAgICAgICB0LnR5cGUgPSAiQ0NPREUiCisgICAgICAgICB0LmxleGVyLmxpbmVubyArPSB0LnZhbHVlLmNvdW50KCdcbicpCisgICAgICAgICB0LmxleGVyLmJlZ2luKCdJTklUSUFMJykgICAgICAgICAgIAorICAgICAgICAgcmV0dXJuIHQKKworIyBDIG9yIEMrKyBjb21tZW50IChpZ25vcmUpICAgIAorZGVmIHRfY2NvZGVfY29tbWVudCh0KToKKyAgICByJygvXCooLnxcbikqP1wqLyl8KC8vLiopJworICAgIHBhc3MKKworIyBDIHN0cmluZworZGVmIHRfY2NvZGVfc3RyaW5nKHQpOgorICAgcidcIihbXlxcXG5dfChcXC4pKSo/XCInCisKKyMgQyBjaGFyYWN0ZXIgbGl0ZXJhbAorZGVmIHRfY2NvZGVfY2hhcih0KToKKyAgIHInXCcoW15cXFxuXXwoXFwuKSkqP1wnJworCisjIEFueSBzZXF1ZW5jZSBvZiBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIChub3QgYnJhY2VzLCBzdHJpbmdzKQorZGVmIHRfY2NvZGVfbm9uc3BhY2UodCk6CisgICByJ1teXHNce1x9XCdcIl0rJworCisjIElnbm9yZWQgY2hhcmFjdGVycyAod2hpdGVzcGFjZSkKK3RfY2NvZGVfaWdub3JlID0gIiBcdFxuIgorCisjIEZvciBiYWQgY2hhcmFjdGVycywgd2UganVzdCBza2lwIG92ZXIgaXQKK2RlZiB0X2Njb2RlX2Vycm9yKHQpOgorICAgIHQubGV4ZXIuc2tpcCgxKQorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK0luIHRoaXMgZXhhbXBsZSwgdGhlIG9jY3VycmVuY2Ugb2YgdGhlIGZpcnN0ICd7JyBjYXVzZXMgdGhlIGxleGVyIHRvIHJlY29yZCB0aGUgc3RhcnRpbmcgcG9zaXRpb24gYW5kIGVudGVyIGEgbmV3IHN0YXRlIDx0dD4nY2NvZGUnPC90dD4uICBBIGNvbGxlY3Rpb24gb2YgcnVsZXMgdGhlbiBtYXRjaAordmFyaW91cyBwYXJ0cyBvZiB0aGUgaW5wdXQgdGhhdCBmb2xsb3cgKGNvbW1lbnRzLCBzdHJpbmdzLCBldGMuKS4gIEFsbCBvZiB0aGVzZSBydWxlcyBtZXJlbHkgZGlzY2FyZCB0aGUgdG9rZW4gKGJ5IG5vdCByZXR1cm5pbmcgYSB2YWx1ZSkuCitIb3dldmVyLCBpZiB0aGUgY2xvc2luZyByaWdodCBicmFjZSBpcyBlbmNvdW50ZXJlZCwgdGhlIHJ1bGUgPHR0PnRfY2NvZGVfcmJyYWNlPC90dD4gY29sbGVjdHMgYWxsIG9mIHRoZSBjb2RlICh1c2luZyB0aGUgZWFybGllciByZWNvcmRlZCBzdGFydGluZworcG9zaXRpb24pLCBzdG9yZXMgaXQsIGFuZCByZXR1cm5zIGEgdG9rZW4gJ0NDT0RFJyBjb250YWluaW5nIGFsbCBvZiB0aGF0IHRleHQuICBXaGVuIHJldHVybmluZyB0aGUgdG9rZW4sIHRoZSBsZXhpbmcgc3RhdGUgaXMgcmVzdG9yZWQgYmFjayB0byBpdHMKK2luaXRpYWwgc3RhdGUuCisKKzxIMz48YSBuYW1lPSJwbHlfbm4yMSI+PC9hPjQuMjAgTWlzY2VsbGFuZW91cyBJc3N1ZXM8L0gzPgorCisKKzxQPgorPGxpPlRoZSBsZXhlciByZXF1aXJlcyBpbnB1dCB0byBiZSBzdXBwbGllZCBhcyBhIHNpbmdsZSBpbnB1dCBzdHJpbmcuICBTaW5jZSBtb3N0IG1hY2hpbmVzIGhhdmUgbW9yZSB0aGFuIGVub3VnaCBtZW1vcnksIHRoaXMgCityYXJlbHkgcHJlc2VudHMgYSBwZXJmb3JtYW5jZSBjb25jZXJuLiAgSG93ZXZlciwgaXQgbWVhbnMgdGhhdCB0aGUgbGV4ZXIgY3VycmVudGx5IGNhbid0IGJlIHVzZWQgd2l0aCBzdHJlYW1pbmcgZGF0YQorc3VjaCBhcyBvcGVuIGZpbGVzIG9yIHNvY2tldHMuICBUaGlzIGxpbWl0YXRpb24gaXMgcHJpbWFyaWx5IGEgc2lkZS1lZmZlY3Qgb2YgdXNpbmcgdGhlIDx0dD5yZTwvdHQ+IG1vZHVsZS4gIFlvdSBtaWdodCBiZQorYWJsZSB0byB3b3JrIGFyb3VuZCB0aGlzIGJ5IGltcGxlbWVudGluZyBhbiBhcHByb3ByaWF0ZSA8dHQ+ZGVmIHRfZW9mKCk8L3R0PiBlbmQtb2YtZmlsZSBoYW5kbGluZyBydWxlLiBUaGUgbWFpbiBjb21wbGljYXRpb24KK2hlcmUgaXMgdGhhdCB5b3UnbGwgcHJvYmFibHkgbmVlZCB0byBlbnN1cmUgdGhhdCBkYXRhIGlzIGZlZCB0byB0aGUgbGV4ZXIgaW4gYSB3YXkgc28gdGhhdCBpdCBkb2Vzbid0IHNwbGl0IGluIGluIHRoZSBtaWRkbGUKK29mIGEgdG9rZW4uPC9wPgorCis8cD4KKzxsaT5UaGUgbGV4ZXIgc2hvdWxkIHdvcmsgcHJvcGVybHkgd2l0aCBib3RoIFVuaWNvZGUgc3RyaW5ncyBnaXZlbiBhcyB0b2tlbiBhbmQgcGF0dGVybiBtYXRjaGluZyBydWxlcyBhcword2VsbCBhcyBmb3IgaW5wdXQgdGV4dC4KKworPHA+Cis8bGk+SWYgeW91IG5lZWQgdG8gc3VwcGx5IG9wdGlvbmFsIGZsYWdzIHRvIHRoZSByZS5jb21waWxlKCkgZnVuY3Rpb24sIHVzZSB0aGUgcmVmbGFncyBvcHRpb24gdG8gbGV4LiAgRm9yIGV4YW1wbGU6CisKKzxibG9ja3F1b3RlPgorPHByZT4KK2xleC5sZXgocmVmbGFncz1yZS5VTklDT0RFKQorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGxpPlNpbmNlIHRoZSBsZXhlciBpcyB3cml0dGVuIGVudGlyZWx5IGluIFB5dGhvbiwgaXRzIHBlcmZvcm1hbmNlIGlzCitsYXJnZWx5IGRldGVybWluZWQgYnkgdGhhdCBvZiB0aGUgUHl0aG9uIDx0dD5yZTwvdHQ+IG1vZHVsZS4gIEFsdGhvdWdoCit0aGUgbGV4ZXIgaGFzIGJlZW4gd3JpdHRlbiB0byBiZSBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUsIGl0J3Mgbm90CitibGF6aW5nbHkgZmFzdCB3aGVuIHVzZWQgb24gdmVyeSBsYXJnZSBpbnB1dCBmaWxlcy4gIElmCitwZXJmb3JtYW5jZSBpcyBjb25jZXJuLCB5b3UgbWlnaHQgY29uc2lkZXIgdXBncmFkaW5nIHRvIHRoZSBtb3N0CityZWNlbnQgdmVyc2lvbiBvZiBQeXRob24sIGNyZWF0aW5nIGEgaGFuZC13cml0dGVuIGxleGVyLCBvciBvZmZsb2FkaW5nCit0aGUgbGV4ZXIgaW50byBhIEMgZXh0ZW5zaW9uIG1vZHVsZS4gIAorCis8cD4KK0lmIHlvdSBhcmUgZ29pbmcgdG8gY3JlYXRlIGEgaGFuZC13cml0dGVuIGxleGVyIGFuZCB5b3UgcGxhbiB0byB1c2UgaXQgd2l0aCA8dHQ+eWFjYy5weTwvdHQ+LCAKK2l0IG9ubHkgbmVlZHMgdG8gY29uZm9ybSB0byB0aGUgZm9sbG93aW5nIHJlcXVpcmVtZW50czoKKworPHVsPgorPGxpPkl0IG11c3QgcHJvdmlkZSBhIDx0dD50b2tlbigpPC90dD4gbWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgbmV4dCB0b2tlbiBvciA8dHQ+Tm9uZTwvdHQ+IGlmIG5vIG1vcmUKK3Rva2VucyBhcmUgYXZhaWxhYmxlLgorPGxpPlRoZSA8dHQ+dG9rZW4oKTwvdHQ+IG1ldGhvZCBtdXN0IHJldHVybiBhbiBvYmplY3QgPHR0PnRvazwvdHQ+IHRoYXQgaGFzIDx0dD50eXBlPC90dD4gYW5kIDx0dD52YWx1ZTwvdHQ+IGF0dHJpYnV0ZXMuICBJZiAKK2xpbmUgbnVtYmVyIHRyYWNraW5nIGlzIGJlaW5nIHVzZWQsIHRoZW4gdGhlIHRva2VuIHNob3VsZCBhbHNvIGRlZmluZSBhIDx0dD5saW5lbm88L3R0PiBhdHRyaWJ1dGUuCis8L3VsPgorCis8SDI+PGEgbmFtZT0icGx5X25uMjIiPjwvYT41LiBQYXJzaW5nIGJhc2ljczwvSDI+CisKKworPHR0PnlhY2MucHk8L3R0PiBpcyB1c2VkIHRvIHBhcnNlIGxhbmd1YWdlIHN5bnRheC4gIEJlZm9yZSBzaG93aW5nIGFuCitleGFtcGxlLCB0aGVyZSBhcmUgYSBmZXcgaW1wb3J0YW50IGJpdHMgb2YgYmFja2dyb3VuZCB0aGF0IG11c3QgYmUKK21lbnRpb25lZC4gIEZpcnN0LCA8ZW0+c3ludGF4PC9lbT4gaXMgdXN1YWxseSBzcGVjaWZpZWQgaW4gdGVybXMgb2YgYSBCTkYgZ3JhbW1hci4KK0ZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvIHBhcnNlCitzaW1wbGUgYXJpdGhtZXRpYyBleHByZXNzaW9ucywgeW91IG1pZ2h0IGZpcnN0IHdyaXRlIGFuIHVuYW1iaWd1b3VzCitncmFtbWFyIHNwZWNpZmljYXRpb24gbGlrZSB0aGlzOgorCis8YmxvY2txdW90ZT4KKzxwcmU+IAorZXhwcmVzc2lvbiA6IGV4cHJlc3Npb24gKyB0ZXJtCisgICAgICAgICAgIHwgZXhwcmVzc2lvbiAtIHRlcm0KKyAgICAgICAgICAgfCB0ZXJtCisKK3Rlcm0gICAgICAgOiB0ZXJtICogZmFjdG9yCisgICAgICAgICAgIHwgdGVybSAvIGZhY3RvcgorICAgICAgICAgICB8IGZhY3RvcgorCitmYWN0b3IgICAgIDogTlVNQkVSCisgICAgICAgICAgIHwgKCBleHByZXNzaW9uICkKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitJbiB0aGUgZ3JhbW1hciwgc3ltYm9scyBzdWNoIGFzIDx0dD5OVU1CRVI8L3R0PiwgPHR0Pis8L3R0PiwgPHR0Pi08L3R0PiwgPHR0Pio8L3R0PiwgYW5kIDx0dD4vPC90dD4gYXJlIGtub3duCithcyA8ZW0+dGVybWluYWxzPC9lbT4gYW5kIGNvcnJlc3BvbmQgdG8gcmF3IGlucHV0IHRva2Vucy4gIElkZW50aWZpZXJzIHN1Y2ggYXMgPHR0PnRlcm08L3R0PiBhbmQgPHR0PmZhY3RvcjwvdHQ+IHJlZmVyIHRvIAorZ3JhbW1hciBydWxlcyBjb21wcmlzZWQgb2YgYSBjb2xsZWN0aW9uIG9mIHRlcm1pbmFscyBhbmQgb3RoZXIgcnVsZXMuICBUaGVzZSBpZGVudGlmaWVycyBhcmUga25vd24gYXMgPGVtPm5vbi10ZXJtaW5hbHM8L2VtPi4KKzxQPgorCitUaGUgc2VtYW50aWMgYmVoYXZpb3Igb2YgYSBsYW5ndWFnZSBpcyBvZnRlbiBzcGVjaWZpZWQgdXNpbmcgYQordGVjaG5pcXVlIGtub3duIGFzIHN5bnRheCBkaXJlY3RlZCB0cmFuc2xhdGlvbi4gIEluIHN5bnRheCBkaXJlY3RlZAordHJhbnNsYXRpb24sIGF0dHJpYnV0ZXMgYXJlIGF0dGFjaGVkIHRvIGVhY2ggc3ltYm9sIGluIGEgZ2l2ZW4gZ3JhbW1hcgorcnVsZSBhbG9uZyB3aXRoIGFuIGFjdGlvbi4gIFdoZW5ldmVyIGEgcGFydGljdWxhciBncmFtbWFyIHJ1bGUgaXMKK3JlY29nbml6ZWQsIHRoZSBhY3Rpb24gZGVzY3JpYmVzIHdoYXQgdG8gZG8uICBGb3IgZXhhbXBsZSwgZ2l2ZW4gdGhlCitleHByZXNzaW9uIGdyYW1tYXIgYWJvdmUsIHlvdSBtaWdodCB3cml0ZSB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgYQorc2ltcGxlIGNhbGN1bGF0b3IgbGlrZSB0aGlzOgorCis8YmxvY2txdW90ZT4KKzxwcmU+IAorR3JhbW1hciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKK2V4cHJlc3Npb24wIDogZXhwcmVzc2lvbjEgKyB0ZXJtICAgIGV4cHJlc3Npb24wLnZhbCA9IGV4cHJlc3Npb24xLnZhbCArIHRlcm0udmFsCisgICAgICAgICAgICB8IGV4cHJlc3Npb24xIC0gdGVybSAgICBleHByZXNzaW9uMC52YWwgPSBleHByZXNzaW9uMS52YWwgLSB0ZXJtLnZhbAorICAgICAgICAgICAgfCB0ZXJtICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjAudmFsID0gdGVybS52YWwKKwordGVybTAgICAgICAgOiB0ZXJtMSAqIGZhY3RvciAgICAgICAgdGVybTAudmFsID0gdGVybTEudmFsICogZmFjdG9yLnZhbAorICAgICAgICAgICAgfCB0ZXJtMSAvIGZhY3RvciAgICAgICAgdGVybTAudmFsID0gdGVybTEudmFsIC8gZmFjdG9yLnZhbAorICAgICAgICAgICAgfCBmYWN0b3IgICAgICAgICAgICAgICAgdGVybTAudmFsID0gZmFjdG9yLnZhbAorCitmYWN0b3IgICAgICA6IE5VTUJFUiAgICAgICAgICAgICAgICBmYWN0b3IudmFsID0gaW50KE5VTUJFUi5sZXh2YWwpCisgICAgICAgICAgICB8ICggZXhwcmVzc2lvbiApICAgICAgICBmYWN0b3IudmFsID0gZXhwcmVzc2lvbi52YWwKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitBIGdvb2Qgd2F5IHRvIHRoaW5rIGFib3V0IHN5bnRheCBkaXJlY3RlZCB0cmFuc2xhdGlvbiBpcyB0byAKK3ZpZXcgZWFjaCBzeW1ib2wgaW4gdGhlIGdyYW1tYXIgYXMgYSBraW5kIG9mIG9iamVjdC4gQXNzb2NpYXRlZAord2l0aCBlYWNoIHN5bWJvbCBpcyBhIHZhbHVlIHJlcHJlc2VudGluZyBpdHMgInN0YXRlIiAoZm9yIGV4YW1wbGUsIHRoZQorPHR0PnZhbDwvdHQ+IGF0dHJpYnV0ZSBhYm92ZSkuICAgIFNlbWFudGljCithY3Rpb25zIGFyZSB0aGVuIGV4cHJlc3NlZCBhcyBhIGNvbGxlY3Rpb24gb2YgZnVuY3Rpb25zIG9yIG1ldGhvZHMKK3RoYXQgb3BlcmF0ZSBvbiB0aGUgc3ltYm9scyBhbmQgYXNzb2NpYXRlZCB2YWx1ZXMuCisKKzxwPgorWWFjYyB1c2VzIGEgcGFyc2luZyB0ZWNobmlxdWUga25vd24gYXMgTFItcGFyc2luZyBvciBzaGlmdC1yZWR1Y2UgcGFyc2luZy4gIExSIHBhcnNpbmcgaXMgYQorYm90dG9tIHVwIHRlY2huaXF1ZSB0aGF0IHRyaWVzIHRvIHJlY29nbml6ZSB0aGUgcmlnaHQtaGFuZC1zaWRlIG9mIHZhcmlvdXMgZ3JhbW1hciBydWxlcy4KK1doZW5ldmVyIGEgdmFsaWQgcmlnaHQtaGFuZC1zaWRlIGlzIGZvdW5kIGluIHRoZSBpbnB1dCwgdGhlIGFwcHJvcHJpYXRlIGFjdGlvbiBjb2RlIGlzIHRyaWdnZXJlZCBhbmQgdGhlCitncmFtbWFyIHN5bWJvbHMgYXJlIHJlcGxhY2VkIGJ5IHRoZSBncmFtbWFyIHN5bWJvbCBvbiB0aGUgbGVmdC1oYW5kLXNpZGUuIAorCis8cD4KK0xSIHBhcnNpbmcgaXMgY29tbW9ubHkgaW1wbGVtZW50ZWQgYnkgc2hpZnRpbmcgZ3JhbW1hciBzeW1ib2xzIG9udG8gYQorc3RhY2sgYW5kIGxvb2tpbmcgYXQgdGhlIHN0YWNrIGFuZCB0aGUgbmV4dCBpbnB1dCB0b2tlbiBmb3IgcGF0dGVybnMgdGhhdAorbWF0Y2ggb25lIG9mIHRoZSBncmFtbWFyIHJ1bGVzLgorVGhlIGRldGFpbHMgb2YgdGhlIGFsZ29yaXRobSBjYW4gYmUgZm91bmQgaW4gYSBjb21waWxlciB0ZXh0Ym9vaywgYnV0IHRoZQorZm9sbG93aW5nIGV4YW1wbGUgaWxsdXN0cmF0ZXMgdGhlIHN0ZXBzIHRoYXQgYXJlIHBlcmZvcm1lZCBpZiB5b3UKK3dhbnRlZCB0byBwYXJzZSB0aGUgZXhwcmVzc2lvbgorPHR0PjMgKyA1ICogKDEwIC0gMjApPC90dD4gdXNpbmcgdGhlIGdyYW1tYXIgZGVmaW5lZCBhYm92ZS4gIEluIHRoZSBleGFtcGxlLAordGhlIHNwZWNpYWwgc3ltYm9sIDx0dD4kPC90dD4gcmVwcmVzZW50cyB0aGUgZW5kIG9mIGlucHV0LgorCisKKzxibG9ja3F1b3RlPgorPHByZT4KK1N0ZXAgU3ltYm9sIFN0YWNrICAgICAgICAgICBJbnB1dCBUb2tlbnMgICAgICAgICAgICBBY3Rpb24KKy0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisxICAgICAgICAgICAgICAgICAgICAgICAgICAgMyArIDUgKiAoIDEwIC0gMjAgKSQgICAgU2hpZnQgMworMiAgICAzICAgICAgICAgICAgICAgICAgICAgICAgKyA1ICogKCAxMCAtIDIwICkkICAgIFJlZHVjZSBmYWN0b3IgOiBOVU1CRVIKKzMgICAgZmFjdG9yICAgICAgICAgICAgICAgICAgICsgNSAqICggMTAgLSAyMCApJCAgICBSZWR1Y2UgdGVybSAgIDogZmFjdG9yCis0ICAgIHRlcm0gICAgICAgICAgICAgICAgICAgICArIDUgKiAoIDEwIC0gMjAgKSQgICAgUmVkdWNlIGV4cHIgOiB0ZXJtCis1ICAgIGV4cHIgICAgICAgICAgICAgICAgICAgICArIDUgKiAoIDEwIC0gMjAgKSQgICAgU2hpZnQgKworNiAgICBleHByICsgICAgICAgICAgICAgICAgICAgICA1ICogKCAxMCAtIDIwICkkICAgIFNoaWZ0IDUKKzcgICAgZXhwciArIDUgICAgICAgICAgICAgICAgICAgICAqICggMTAgLSAyMCApJCAgICBSZWR1Y2UgZmFjdG9yIDogTlVNQkVSCis4ICAgIGV4cHIgKyBmYWN0b3IgICAgICAgICAgICAgICAgKiAoIDEwIC0gMjAgKSQgICAgUmVkdWNlIHRlcm0gICA6IGZhY3RvcgorOSAgICBleHByICsgdGVybSAgICAgICAgICAgICAgICAgICogKCAxMCAtIDIwICkkICAgIFNoaWZ0ICoKKzEwICAgZXhwciArIHRlcm0gKiAgICAgICAgICAgICAgICAgICggMTAgLSAyMCApJCAgICBTaGlmdCAoCisxMSAgIGV4cHIgKyB0ZXJtICogKCAgICAgICAgICAgICAgICAgIDEwIC0gMjAgKSQgICAgU2hpZnQgMTAKKzEyICAgZXhwciArIHRlcm0gKiAoIDEwICAgICAgICAgICAgICAgICAgLSAyMCApJCAgICBSZWR1Y2UgZmFjdG9yIDogTlVNQkVSCisxMyAgIGV4cHIgKyB0ZXJtICogKCBmYWN0b3IgICAgICAgICAgICAgIC0gMjAgKSQgICAgUmVkdWNlIHRlcm0gOiBmYWN0b3IKKzE0ICAgZXhwciArIHRlcm0gKiAoIHRlcm0gICAgICAgICAgICAgICAgLSAyMCApJCAgICBSZWR1Y2UgZXhwciA6IHRlcm0KKzE1ICAgZXhwciArIHRlcm0gKiAoIGV4cHIgICAgICAgICAgICAgICAgLSAyMCApJCAgICBTaGlmdCAtCisxNiAgIGV4cHIgKyB0ZXJtICogKCBleHByIC0gICAgICAgICAgICAgICAgMjAgKSQgICAgU2hpZnQgMjAKKzE3ICAgZXhwciArIHRlcm0gKiAoIGV4cHIgLSAyMCAgICAgICAgICAgICAgICApJCAgICBSZWR1Y2UgZmFjdG9yIDogTlVNQkVSCisxOCAgIGV4cHIgKyB0ZXJtICogKCBleHByIC0gZmFjdG9yICAgICAgICAgICAgKSQgICAgUmVkdWNlIHRlcm0gOiBmYWN0b3IKKzE5ICAgZXhwciArIHRlcm0gKiAoIGV4cHIgLSB0ZXJtICAgICAgICAgICAgICApJCAgICBSZWR1Y2UgZXhwciA6IGV4cHIgLSB0ZXJtCisyMCAgIGV4cHIgKyB0ZXJtICogKCBleHByICAgICAgICAgICAgICAgICAgICAgKSQgICAgU2hpZnQgKQorMjEgICBleHByICsgdGVybSAqICggZXhwciApICAgICAgICAgICAgICAgICAgICAkICAgIFJlZHVjZSBmYWN0b3IgOiAoZXhwcikKKzIyICAgZXhwciArIHRlcm0gKiBmYWN0b3IgICAgICAgICAgICAgICAgICAgICAgJCAgICBSZWR1Y2UgdGVybSA6IHRlcm0gKiBmYWN0b3IKKzIzICAgZXhwciArIHRlcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCAgICBSZWR1Y2UgZXhwciA6IGV4cHIgKyB0ZXJtCisyNCAgIGV4cHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQgICAgUmVkdWNlIGV4cHIKKzI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCAgICBTdWNjZXNzIQorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK1doZW4gcGFyc2luZyB0aGUgZXhwcmVzc2lvbiwgYW4gdW5kZXJseWluZyBzdGF0ZSBtYWNoaW5lIGFuZCB0aGUKK2N1cnJlbnQgaW5wdXQgdG9rZW4gZGV0ZXJtaW5lIHdoYXQgaGFwcGVucyBuZXh0LiAgSWYgdGhlIG5leHQgdG9rZW4KK2xvb2tzIGxpa2UgcGFydCBvZiBhIHZhbGlkIGdyYW1tYXIgcnVsZSAoYmFzZWQgb24gb3RoZXIgaXRlbXMgb24gdGhlCitzdGFjayksIGl0IGlzIGdlbmVyYWxseSBzaGlmdGVkIG9udG8gdGhlIHN0YWNrLiAgSWYgdGhlIHRvcCBvZiB0aGUKK3N0YWNrIGNvbnRhaW5zIGEgdmFsaWQgcmlnaHQtaGFuZC1zaWRlIG9mIGEgZ3JhbW1hciBydWxlLCBpdCBpcwordXN1YWxseSAicmVkdWNlZCIgYW5kIHRoZSBzeW1ib2xzIHJlcGxhY2VkIHdpdGggdGhlIHN5bWJvbCBvbiB0aGUKK2xlZnQtaGFuZC1zaWRlLiAgV2hlbiB0aGlzIHJlZHVjdGlvbiBvY2N1cnMsIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb24gaXMKK3RyaWdnZXJlZCAoaWYgZGVmaW5lZCkuICBJZiB0aGUgaW5wdXQgdG9rZW4gY2FuJ3QgYmUgc2hpZnRlZCBhbmQgdGhlCit0b3Agb2Ygc3RhY2sgZG9lc24ndCBtYXRjaCBhbnkgZ3JhbW1hciBydWxlcywgYSBzeW50YXggZXJyb3IgaGFzCitvY2N1cnJlZCBhbmQgdGhlIHBhcnNlciBtdXN0IHRha2Ugc29tZSBraW5kIG9mIHJlY292ZXJ5IHN0ZXAgKG9yIGJhaWwKK291dCkuICBBIHBhcnNlIGlzIG9ubHkgc3VjY2Vzc2Z1bCBpZiB0aGUgcGFyc2VyIHJlYWNoZXMgYSBzdGF0ZSB3aGVyZQordGhlIHN5bWJvbCBzdGFjayBpcyBlbXB0eSBhbmQgdGhlcmUgYXJlIG5vIG1vcmUgaW5wdXQgdG9rZW5zLgorCis8cD4KK0l0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gaXMgYnVpbHQKK2Fyb3VuZCBhIGxhcmdlIGZpbml0ZS1zdGF0ZSBtYWNoaW5lIHRoYXQgaXMgZW5jb2RlZCBpbiBhIGNvbGxlY3Rpb24gb2YKK3RhYmxlcy4gVGhlIGNvbnN0cnVjdGlvbiBvZiB0aGVzZSB0YWJsZXMgaXMgbm9uLXRyaXZpYWwgYW5kCitiZXlvbmQgdGhlIHNjb3BlIG9mIHRoaXMgZGlzY3Vzc2lvbi4gIEhvd2V2ZXIsIHN1YnRsZSBkZXRhaWxzIG9mIHRoaXMKK3Byb2Nlc3MgZXhwbGFpbiB3aHksIGluIHRoZSBleGFtcGxlIGFib3ZlLCB0aGUgcGFyc2VyIGNob29zZXMgdG8gc2hpZnQKK2EgdG9rZW4gb250byB0aGUgc3RhY2sgaW4gc3RlcCA5IHJhdGhlciB0aGFuIHJlZHVjaW5nIHRoZQorcnVsZSA8dHQ+ZXhwciA6IGV4cHIgKyB0ZXJtPC90dD4uCisKKzxIMj48YSBuYW1lPSJwbHlfbm4yMyI+PC9hPjYuIFlhY2M8L0gyPgorCisKK1RoZSA8dHQ+cGx5LnlhY2M8L3R0PiBtb2R1bGUgaW1wbGVtZW50cyB0aGUgcGFyc2luZyBjb21wb25lbnQgb2YgUExZLgorVGhlIG5hbWUgInlhY2MiIHN0YW5kcyBmb3IgIllldCBBbm90aGVyIENvbXBpbGVyIENvbXBpbGVyIiBhbmQgaXMKK2JvcnJvd2VkIGZyb20gdGhlIFVuaXggdG9vbCBvZiB0aGUgc2FtZSBuYW1lLgorCis8SDM+PGEgbmFtZT0icGx5X25uMjQiPjwvYT42LjEgQW4gZXhhbXBsZTwvSDM+CisKKworU3VwcG9zZSB5b3Ugd2FudGVkIHRvIG1ha2UgYSBncmFtbWFyIGZvciBzaW1wbGUgYXJpdGhtZXRpYyBleHByZXNzaW9ucyBhcyBwcmV2aW91c2x5IGRlc2NyaWJlZC4gICBIZXJlIGlzCitob3cgeW91IHdvdWxkIGRvIGl0IHdpdGggPHR0PnlhY2MucHk8L3R0PjoKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorIyBZYWNjIGV4YW1wbGUKKworaW1wb3J0IHBseS55YWNjIGFzIHlhY2MKKworIyBHZXQgdGhlIHRva2VuIG1hcCBmcm9tIHRoZSBsZXhlci4gIFRoaXMgaXMgcmVxdWlyZWQuCitmcm9tIGNhbGNsZXggaW1wb3J0IHRva2VucworCitkZWYgcF9leHByZXNzaW9uX3BsdXMocCk6CisgICAgJ2V4cHJlc3Npb24gOiBleHByZXNzaW9uIFBMVVMgdGVybScKKyAgICBwWzBdID0gcFsxXSArIHBbM10KKworZGVmIHBfZXhwcmVzc2lvbl9taW51cyhwKToKKyAgICAnZXhwcmVzc2lvbiA6IGV4cHJlc3Npb24gTUlOVVMgdGVybScKKyAgICBwWzBdID0gcFsxXSAtIHBbM10KKworZGVmIHBfZXhwcmVzc2lvbl90ZXJtKHApOgorICAgICdleHByZXNzaW9uIDogdGVybScKKyAgICBwWzBdID0gcFsxXQorCitkZWYgcF90ZXJtX3RpbWVzKHApOgorICAgICd0ZXJtIDogdGVybSBUSU1FUyBmYWN0b3InCisgICAgcFswXSA9IHBbMV0gKiBwWzNdCisKK2RlZiBwX3Rlcm1fZGl2KHApOgorICAgICd0ZXJtIDogdGVybSBESVZJREUgZmFjdG9yJworICAgIHBbMF0gPSBwWzFdIC8gcFszXQorCitkZWYgcF90ZXJtX2ZhY3RvcihwKToKKyAgICAndGVybSA6IGZhY3RvcicKKyAgICBwWzBdID0gcFsxXQorCitkZWYgcF9mYWN0b3JfbnVtKHApOgorICAgICdmYWN0b3IgOiBOVU1CRVInCisgICAgcFswXSA9IHBbMV0KKworZGVmIHBfZmFjdG9yX2V4cHIocCk6CisgICAgJ2ZhY3RvciA6IExQQVJFTiBleHByZXNzaW9uIFJQQVJFTicKKyAgICBwWzBdID0gcFsyXQorCisjIEVycm9yIHJ1bGUgZm9yIHN5bnRheCBlcnJvcnMKK2RlZiBwX2Vycm9yKHApOgorICAgIHByaW50KCJTeW50YXggZXJyb3IgaW4gaW5wdXQhIikKKworIyBCdWlsZCB0aGUgcGFyc2VyCitwYXJzZXIgPSB5YWNjLnlhY2MoKQorCit3aGlsZSBUcnVlOgorICAgdHJ5OgorICAgICAgIHMgPSByYXdfaW5wdXQoJ2NhbGMgPiAnKQorICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgIGJyZWFrCisgICBpZiBub3QgczogY29udGludWUKKyAgIHJlc3VsdCA9IHBhcnNlci5wYXJzZShzKQorICAgcHJpbnQocmVzdWx0KQorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK0luIHRoaXMgZXhhbXBsZSwgZWFjaCBncmFtbWFyIHJ1bGUgaXMgZGVmaW5lZCBieSBhIFB5dGhvbiBmdW5jdGlvbgord2hlcmUgdGhlIGRvY3N0cmluZyB0byB0aGF0IGZ1bmN0aW9uIGNvbnRhaW5zIHRoZSBhcHByb3ByaWF0ZQorY29udGV4dC1mcmVlIGdyYW1tYXIgc3BlY2lmaWNhdGlvbi4gIFRoZSBzdGF0ZW1lbnRzIHRoYXQgbWFrZSB1cCB0aGUKK2Z1bmN0aW9uIGJvZHkgaW1wbGVtZW50IHRoZSBzZW1hbnRpYyBhY3Rpb25zIG9mIHRoZSBydWxlLiBFYWNoIGZ1bmN0aW9uCithY2NlcHRzIGEgc2luZ2xlIGFyZ3VtZW50IDx0dD5wPC90dD4gdGhhdCBpcyBhIHNlcXVlbmNlIGNvbnRhaW5pbmcgdGhlCit2YWx1ZXMgb2YgZWFjaCBncmFtbWFyIHN5bWJvbCBpbiB0aGUgY29ycmVzcG9uZGluZyBydWxlLiAgVGhlIHZhbHVlcworb2YgPHR0PnBbaV08L3R0PiBhcmUgbWFwcGVkIHRvIGdyYW1tYXIgc3ltYm9scyBhcyBzaG93biBoZXJlOgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitkZWYgcF9leHByZXNzaW9uX3BsdXMocCk6CisgICAgJ2V4cHJlc3Npb24gOiBleHByZXNzaW9uIFBMVVMgdGVybScKKyAgICAjICAgXiAgICAgICAgICAgIF4gICAgICAgIF4gICAgXgorICAgICMgIHBbMF0gICAgICAgICBwWzFdICAgICBwWzJdIHBbM10KKworICAgIHBbMF0gPSBwWzFdICsgcFszXQorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKKzxwPgorRm9yIHRva2VucywgdGhlICJ2YWx1ZSIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgPHR0PnBbaV08L3R0PiBpcyB0aGUKKzxlbT5zYW1lPC9lbT4gYXMgdGhlIDx0dD5wLnZhbHVlPC90dD4gYXR0cmlidXRlIGFzc2lnbmVkIGluIHRoZSBsZXhlcgorbW9kdWxlLiAgRm9yIG5vbi10ZXJtaW5hbHMsIHRoZSB2YWx1ZSBpcyBkZXRlcm1pbmVkIGJ5IHdoYXRldmVyIGlzCitwbGFjZWQgaW4gPHR0PnBbMF08L3R0PiB3aGVuIHJ1bGVzIGFyZSByZWR1Y2VkLiAgVGhpcyB2YWx1ZSBjYW4gYmUKK2FueXRoaW5nIGF0IGFsbC4gIEhvd2V2ZXIsIGl0IHByb2JhYmx5IG1vc3QgY29tbW9uIGZvciB0aGUgdmFsdWUgdG8gYmUKK2Egc2ltcGxlIFB5dGhvbiB0eXBlLCBhIHR1cGxlLCBvciBhbiBpbnN0YW5jZS4gIEluIHRoaXMgZXhhbXBsZSwgd2UKK2FyZSByZWx5aW5nIG9uIHRoZSBmYWN0IHRoYXQgdGhlIDx0dD5OVU1CRVI8L3R0PiB0b2tlbiBzdG9yZXMgYW4KK2ludGVnZXIgdmFsdWUgaW4gaXRzIHZhbHVlIGZpZWxkLiAgQWxsIG9mIHRoZSBvdGhlciBydWxlcyBzaW1wbHkKK3BlcmZvcm0gdmFyaW91cyB0eXBlcyBvZiBpbnRlZ2VyIG9wZXJhdGlvbnMgYW5kIHByb3BhZ2F0ZSB0aGUgcmVzdWx0LgorPC9wPgorCis8cD4KK05vdGU6IFRoZSB1c2Ugb2YgbmVnYXRpdmUgaW5kaWNlcyBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nIGluCit5YWNjLS0tc3BlY2lhbGx5IDx0dD5wWy0xXTwvdHQ+IGRvZXMgbm90IGhhdmUgdGhlIHNhbWUgdmFsdWUKK2FzIDx0dD5wWzNdPC90dD4gaW4gdGhpcyBleGFtcGxlLiAgUGxlYXNlIHNlZSB0aGUgc2VjdGlvbiBvbiAiRW1iZWRkZWQKK0FjdGlvbnMiIGZvciBmdXJ0aGVyIGRldGFpbHMuCis8L3A+CisKKzxwPgorVGhlIGZpcnN0IHJ1bGUgZGVmaW5lZCBpbiB0aGUgeWFjYyBzcGVjaWZpY2F0aW9uIGRldGVybWluZXMgdGhlCitzdGFydGluZyBncmFtbWFyIHN5bWJvbCAoaW4gdGhpcyBjYXNlLCBhIHJ1bGUgZm9yIDx0dD5leHByZXNzaW9uPC90dD4KK2FwcGVhcnMgZmlyc3QpLiAgV2hlbmV2ZXIgdGhlIHN0YXJ0aW5nIHJ1bGUgaXMgcmVkdWNlZCBieSB0aGUgcGFyc2VyCithbmQgbm8gbW9yZSBpbnB1dCBpcyBhdmFpbGFibGUsIHBhcnNpbmcgc3RvcHMgYW5kIHRoZSBmaW5hbCB2YWx1ZSBpcworcmV0dXJuZWQgKHRoaXMgdmFsdWUgd2lsbCBiZSB3aGF0ZXZlciB0aGUgdG9wLW1vc3QgcnVsZSBwbGFjZWQKK2luIDx0dD5wWzBdPC90dD4pLiBOb3RlOiBhbiBhbHRlcm5hdGl2ZSBzdGFydGluZyBzeW1ib2wgY2FuIGJlCitzcGVjaWZpZWQgdXNpbmcgdGhlIDx0dD5zdGFydDwvdHQ+IGtleXdvcmQgYXJndW1lbnQgdG8KKzx0dD55YWNjKCk8L3R0Pi4KKworPHA+VGhlIDx0dD5wX2Vycm9yKHApPC90dD4gcnVsZSBpcyBkZWZpbmVkIHRvIGNhdGNoIHN5bnRheCBlcnJvcnMuCitTZWUgdGhlIGVycm9yIGhhbmRsaW5nIHNlY3Rpb24gYmVsb3cgZm9yIG1vcmUgZGV0YWlsLgorCis8cD4KK1RvIGJ1aWxkIHRoZSBwYXJzZXIsIGNhbGwgdGhlIDx0dD55YWNjLnlhY2MoKTwvdHQ+IGZ1bmN0aW9uLiAgVGhpcworZnVuY3Rpb24gbG9va3MgYXQgdGhlIG1vZHVsZSBhbmQgYXR0ZW1wdHMgdG8gY29uc3RydWN0IGFsbCBvZiB0aGUgTFIKK3BhcnNpbmcgdGFibGVzIGZvciB0aGUgZ3JhbW1hciB5b3UgaGF2ZSBzcGVjaWZpZWQuICBUaGUgZmlyc3QKK3RpbWUgPHR0PnlhY2MueWFjYygpPC90dD4gaXMgaW52b2tlZCwgeW91IHdpbGwgZ2V0IGEgbWVzc2FnZSBzdWNoIGFzCit0aGlzOgorCis8YmxvY2txdW90ZT4KKzxwcmU+CiskIHB5dGhvbiBjYWxjcGFyc2UucHkKK0dlbmVyYXRpbmcgTEFMUiB0YWJsZXMKK2NhbGMgPiAKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCis8cD4KK1NpbmNlIHRhYmxlIGNvbnN0cnVjdGlvbiBpcyByZWxhdGl2ZWx5IGV4cGVuc2l2ZSAoZXNwZWNpYWxseSBmb3IgbGFyZ2UKK2dyYW1tYXJzKSwgdGhlIHJlc3VsdGluZyBwYXJzaW5nIHRhYmxlIGlzIHdyaXR0ZW4gdG8gCithIGZpbGUgY2FsbGVkIDx0dD5wYXJzZXRhYi5weTwvdHQ+LiAgSW4gYWRkaXRpb24sIGEKK2RlYnVnZ2luZyBmaWxlIGNhbGxlZCA8dHQ+cGFyc2VyLm91dDwvdHQ+IGlzIGNyZWF0ZWQuICBPbiBzdWJzZXF1ZW50CitleGVjdXRpb25zLCA8dHQ+eWFjYzwvdHQ+IHdpbGwgcmVsb2FkIHRoZSB0YWJsZSBmcm9tCis8dHQ+cGFyc2V0YWIucHk8L3R0PiB1bmxlc3MgaXQgaGFzIGRldGVjdGVkIGEgY2hhbmdlIGluIHRoZSB1bmRlcmx5aW5nCitncmFtbWFyIChpbiB3aGljaCBjYXNlIHRoZSB0YWJsZXMgYW5kIDx0dD5wYXJzZXRhYi5weTwvdHQ+IGZpbGUgYXJlCityZWdlbmVyYXRlZCkuICBCb3RoIG9mIHRoZXNlIGZpbGVzIGFyZSB3cml0dGVuIHRvIHRoZSBzYW1lIGRpcmVjdG9yeQorYXMgdGhlIG1vZHVsZSBpbiB3aGljaCB0aGUgcGFyc2VyIGlzIHNwZWNpZmllZC4gIAorVGhlIG5hbWUgb2YgdGhlIDx0dD5wYXJzZXRhYjwvdHQ+IG1vZHVsZSBjYW4gYmUgY2hhbmdlZCB1c2luZyB0aGUKKzx0dD50YWJtb2R1bGU8L3R0PiBrZXl3b3JkIGFyZ3VtZW50IHRvIDx0dD55YWNjKCk8L3R0Pi4gIEZvciBleGFtcGxlOgorPC9wPgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitwYXJzZXIgPSB5YWNjLnlhY2ModGFibW9kdWxlPSdmb29wYXJzZXRhYicpCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworPHA+CitJZiBhbnkgZXJyb3JzIGFyZSBkZXRlY3RlZCBpbiB5b3VyIGdyYW1tYXIgc3BlY2lmaWNhdGlvbiwgPHR0PnlhY2MucHk8L3R0PiB3aWxsIHByb2R1Y2UKK2RpYWdub3N0aWMgbWVzc2FnZXMgYW5kIHBvc3NpYmx5IHJhaXNlIGFuIGV4Y2VwdGlvbi4gIFNvbWUgb2YgdGhlIGVycm9ycyB0aGF0IGNhbiBiZSBkZXRlY3RlZCBpbmNsdWRlOgorCis8dWw+Cis8bGk+RHVwbGljYXRlZCBmdW5jdGlvbiBuYW1lcyAoaWYgbW9yZSB0aGFuIG9uZSBydWxlIGZ1bmN0aW9uIGhhdmUgdGhlIHNhbWUgbmFtZSBpbiB0aGUgZ3JhbW1hciBmaWxlKS4KKzxsaT5TaGlmdC9yZWR1Y2UgYW5kIHJlZHVjZS9yZWR1Y2UgY29uZmxpY3RzIGdlbmVyYXRlZCBieSBhbWJpZ3VvdXMgZ3JhbW1hcnMuCis8bGk+QmFkbHkgc3BlY2lmaWVkIGdyYW1tYXIgcnVsZXMuCis8bGk+SW5maW5pdGUgcmVjdXJzaW9uIChydWxlcyB0aGF0IGNhbiBuZXZlciB0ZXJtaW5hdGUpLgorPGxpPlVudXNlZCBydWxlcyBhbmQgdG9rZW5zCis8bGk+VW5kZWZpbmVkIHJ1bGVzIGFuZCB0b2tlbnMKKzwvdWw+CisKK1RoZSBuZXh0IGZldyBzZWN0aW9ucyBkaXNjdXNzIGdyYW1tYXIgc3BlY2lmaWNhdGlvbiBpbiBtb3JlIGRldGFpbC4KKworPHA+CitUaGUgZmluYWwgcGFydCBvZiB0aGUgZXhhbXBsZSBzaG93cyBob3cgdG8gYWN0dWFsbHkgcnVuIHRoZSBwYXJzZXIKK2NyZWF0ZWQgYnkKKzx0dD55YWNjKCk8L3R0Pi4gIFRvIHJ1biB0aGUgcGFyc2VyLCB5b3Ugc2ltcGx5IGhhdmUgdG8gY2FsbAordGhlIDx0dD5wYXJzZSgpPC90dD4gd2l0aCBhIHN0cmluZyBvZiBpbnB1dCB0ZXh0LiAgVGhpcyB3aWxsIHJ1biBhbGwKK29mIHRoZSBncmFtbWFyIHJ1bGVzIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgZW50aXJlIHBhcnNlLiAgVGhpcworcmVzdWx0IHJldHVybiBpcyB0aGUgdmFsdWUgYXNzaWduZWQgdG8gPHR0PnBbMF08L3R0PiBpbiB0aGUgc3RhcnRpbmcKK2dyYW1tYXIgcnVsZS4KKworPEgzPjxhIG5hbWU9InBseV9ubjI1Ij48L2E+Ni4yIENvbWJpbmluZyBHcmFtbWFyIFJ1bGUgRnVuY3Rpb25zPC9IMz4KKworCitXaGVuIGdyYW1tYXIgcnVsZXMgYXJlIHNpbWlsYXIsIHRoZXkgY2FuIGJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgZnVuY3Rpb24uCitGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIHR3byBydWxlcyBpbiBvdXIgZWFybGllciBleGFtcGxlOgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitkZWYgcF9leHByZXNzaW9uX3BsdXMocCk6CisgICAgJ2V4cHJlc3Npb24gOiBleHByZXNzaW9uIFBMVVMgdGVybScKKyAgICBwWzBdID0gcFsxXSArIHBbM10KKworZGVmIHBfZXhwcmVzc2lvbl9taW51cyh0KToKKyAgICAnZXhwcmVzc2lvbiA6IGV4cHJlc3Npb24gTUlOVVMgdGVybScKKyAgICBwWzBdID0gcFsxXSAtIHBbM10KKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitJbnN0ZWFkIG9mIHdyaXRpbmcgdHdvIGZ1bmN0aW9ucywgeW91IG1pZ2h0IHdyaXRlIGEgc2luZ2xlIGZ1bmN0aW9uIGxpa2UgdGhpczoKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorZGVmIHBfZXhwcmVzc2lvbihwKToKKyAgICAnJydleHByZXNzaW9uIDogZXhwcmVzc2lvbiBQTFVTIHRlcm0KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBNSU5VUyB0ZXJtJycnCisgICAgaWYgcFsyXSA9PSAnKyc6CisgICAgICAgIHBbMF0gPSBwWzFdICsgcFszXQorICAgIGVsaWYgcFsyXSA9PSAnLSc6CisgICAgICAgIHBbMF0gPSBwWzFdIC0gcFszXQorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK0luIGdlbmVyYWwsIHRoZSBkb2Mgc3RyaW5nIGZvciBhbnkgZ2l2ZW4gZnVuY3Rpb24gY2FuIGNvbnRhaW4gbXVsdGlwbGUgZ3JhbW1hciBydWxlcy4gIFNvLCBpdCB3b3VsZAoraGF2ZSBhbHNvIGJlZW4gbGVnYWwgKGFsdGhvdWdoIHBvc3NpYmx5IGNvbmZ1c2luZykgdG8gd3JpdGUgdGhpczoKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorZGVmIHBfYmluYXJ5X29wZXJhdG9ycyhwKToKKyAgICAnJydleHByZXNzaW9uIDogZXhwcmVzc2lvbiBQTFVTIHRlcm0KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBNSU5VUyB0ZXJtCisgICAgICAgdGVybSAgICAgICA6IHRlcm0gVElNRVMgZmFjdG9yCisgICAgICAgICAgICAgICAgICB8IHRlcm0gRElWSURFIGZhY3RvcicnJworICAgIGlmIHBbMl0gPT0gJysnOgorICAgICAgICBwWzBdID0gcFsxXSArIHBbM10KKyAgICBlbGlmIHBbMl0gPT0gJy0nOgorICAgICAgICBwWzBdID0gcFsxXSAtIHBbM10KKyAgICBlbGlmIHBbMl0gPT0gJyonOgorICAgICAgICBwWzBdID0gcFsxXSAqIHBbM10KKyAgICBlbGlmIHBbMl0gPT0gJy8nOgorICAgICAgICBwWzBdID0gcFsxXSAvIHBbM10KKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitXaGVuIGNvbWJpbmluZyBncmFtbWFyIHJ1bGVzIGludG8gYSBzaW5nbGUgZnVuY3Rpb24sIGl0IGlzIHVzdWFsbHkgYSBnb29kIGlkZWEgZm9yIGFsbCBvZiB0aGUgcnVsZXMgdG8gaGF2ZQorYSBzaW1pbGFyIHN0cnVjdHVyZSAoZS5nLiwgdGhlIHNhbWUgbnVtYmVyIG9mIHRlcm1zKS4gIE90aGVyd2lzZSwgdGhlIGNvcnJlc3BvbmRpbmcgYWN0aW9uIGNvZGUgbWF5IGJlIG1vcmUgCitjb21wbGljYXRlZCB0aGFuIG5lY2Vzc2FyeS4gIEhvd2V2ZXIsIGl0IGlzIHBvc3NpYmxlIHRvIGhhbmRsZSBzaW1wbGUgY2FzZXMgdXNpbmcgbGVuKCkuICBGb3IgZXhhbXBsZToKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorZGVmIHBfZXhwcmVzc2lvbnMocCk6CisgICAgJycnZXhwcmVzc2lvbiA6IGV4cHJlc3Npb24gTUlOVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBNSU5VUyBleHByZXNzaW9uJycnCisgICAgaWYgKGxlbihwKSA9PSA0KToKKyAgICAgICAgcFswXSA9IHBbMV0gLSBwWzNdCisgICAgZWxpZiAobGVuKHApID09IDMpOgorICAgICAgICBwWzBdID0gLXBbMl0KKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitJZiBwYXJzaW5nIHBlcmZvcm1hbmNlIGlzIGEgY29uY2VybiwgeW91IHNob3VsZCByZXNpc3QgdGhlIHVyZ2UgdG8gcHV0Cit0b28gbXVjaCBjb25kaXRpb25hbCBwcm9jZXNzaW5nIGludG8gYSBzaW5nbGUgZ3JhbW1hciBydWxlIGFzIHNob3duIGluCit0aGVzZSBleGFtcGxlcy4gIFdoZW4geW91IGFkZCBjaGVja3MgdG8gc2VlIHdoaWNoIGdyYW1tYXIgcnVsZSBpcworYmVpbmcgaGFuZGxlZCwgeW91IGFyZSBhY3R1YWxseSBkdXBsaWNhdGluZyB0aGUgd29yayB0aGF0IHRoZSBwYXJzZXIKK2hhcyBhbHJlYWR5IHBlcmZvcm1lZCAoaS5lLiwgdGhlIHBhcnNlciBhbHJlYWR5IGtub3dzIGV4YWN0bHkgd2hhdCBydWxlIGl0CittYXRjaGVkKS4gIFlvdSBjYW4gZWxpbWluYXRlIHRoaXMgb3ZlcmhlYWQgYnkgdXNpbmcgYQorc2VwYXJhdGUgPHR0PnBfcnVsZSgpPC90dD4gZnVuY3Rpb24gZm9yIGVhY2ggZ3JhbW1hciBydWxlLgorCis8SDM+PGEgbmFtZT0icGx5X25uMjYiPjwvYT42LjMgQ2hhcmFjdGVyIExpdGVyYWxzPC9IMz4KKworCitJZiBkZXNpcmVkLCBhIGdyYW1tYXIgbWF5IGNvbnRhaW4gdG9rZW5zIGRlZmluZWQgYXMgc2luZ2xlIGNoYXJhY3RlciBsaXRlcmFscy4gICBGb3IgZXhhbXBsZToKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorZGVmIHBfYmluYXJ5X29wZXJhdG9ycyhwKToKKyAgICAnJydleHByZXNzaW9uIDogZXhwcmVzc2lvbiAnKycgdGVybQorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uICctJyB0ZXJtCisgICAgICAgdGVybSAgICAgICA6IHRlcm0gJyonIGZhY3RvcgorICAgICAgICAgICAgICAgICAgfCB0ZXJtICcvJyBmYWN0b3InJycKKyAgICBpZiBwWzJdID09ICcrJzoKKyAgICAgICAgcFswXSA9IHBbMV0gKyBwWzNdCisgICAgZWxpZiBwWzJdID09ICctJzoKKyAgICAgICAgcFswXSA9IHBbMV0gLSBwWzNdCisgICAgZWxpZiBwWzJdID09ICcqJzoKKyAgICAgICAgcFswXSA9IHBbMV0gKiBwWzNdCisgICAgZWxpZiBwWzJdID09ICcvJzoKKyAgICAgICAgcFswXSA9IHBbMV0gLyBwWzNdCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworQSBjaGFyYWN0ZXIgbGl0ZXJhbCBtdXN0IGJlIGVuY2xvc2VkIGluIHF1b3RlcyBzdWNoIGFzIDx0dD4nKyc8L3R0Pi4gIEluIGFkZGl0aW9uLCBpZiBsaXRlcmFscyBhcmUgdXNlZCwgdGhleSBtdXN0IGJlIGRlY2xhcmVkIGluIHRoZQorY29ycmVzcG9uZGluZyA8dHQ+bGV4PC90dD4gZmlsZSB0aHJvdWdoIHRoZSB1c2Ugb2YgYSBzcGVjaWFsIDx0dD5saXRlcmFsczwvdHQ+IGRlY2xhcmF0aW9uLgorCis8YmxvY2txdW90ZT4KKzxwcmU+CisjIExpdGVyYWxzLiAgU2hvdWxkIGJlIHBsYWNlZCBpbiBtb2R1bGUgZ2l2ZW4gdG8gbGV4KCkKK2xpdGVyYWxzID0gWycrJywnLScsJyonLCcvJyBdCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworPGI+Q2hhcmFjdGVyIGxpdGVyYWxzIGFyZSBsaW1pdGVkIHRvIGEgc2luZ2xlIGNoYXJhY3RlcjwvYj4uICBUaHVzLCBpdCBpcyBub3QgbGVnYWwgdG8gc3BlY2lmeSBsaXRlcmFscyBzdWNoIGFzIDx0dD4nJmx0Oz0nPC90dD4gb3IgPHR0Pic9PSc8L3R0Pi4gIEZvciB0aGlzLCB1c2UKK3RoZSBub3JtYWwgbGV4aW5nIHJ1bGVzIChlLmcuLCBkZWZpbmUgYSBydWxlIHN1Y2ggYXMgPHR0PnRfRVEgPSByJz09JzwvdHQ+KS4KKworPEgzPjxhIG5hbWU9InBseV9ubjI2Ij48L2E+Ni40IEVtcHR5IFByb2R1Y3Rpb25zPC9IMz4KKworCis8dHQ+eWFjYy5weTwvdHQ+IGNhbiBoYW5kbGUgZW1wdHkgcHJvZHVjdGlvbnMgYnkgZGVmaW5pbmcgYSBydWxlIGxpa2UgdGhpczoKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorZGVmIHBfZW1wdHkocCk6CisgICAgJ2VtcHR5IDonCisgICAgcGFzcworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK05vdyB0byB1c2UgdGhlIGVtcHR5IHByb2R1Y3Rpb24sIHNpbXBseSB1c2UgJ2VtcHR5JyBhcyBhIHN5bWJvbC4gIEZvciBleGFtcGxlOgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitkZWYgcF9vcHRpdGVtKHApOgorICAgICdvcHRpdGVtIDogaXRlbScKKyAgICAnICAgICAgICB8IGVtcHR5JworICAgIC4uLgorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK05vdGU6IFlvdSBjYW4gd3JpdGUgZW1wdHkgcnVsZXMgYW55d2hlcmUgYnkgc2ltcGx5IHNwZWNpZnlpbmcgYW4gZW1wdHkKK3JpZ2h0IGhhbmQgc2lkZS4gIEhvd2V2ZXIsIEkgcGVyc29uYWxseSBmaW5kIHRoYXQgd3JpdGluZyBhbiAiZW1wdHkiCitydWxlIGFuZCB1c2luZyAiZW1wdHkiIHRvIGRlbm90ZSBhbiBlbXB0eSBwcm9kdWN0aW9uIGlzIGVhc2llciB0byByZWFkCithbmQgbW9yZSBjbGVhcmx5IHN0YXRlcyB5b3VyIGludGVudGlvbnMuCisKKzxIMz48YSBuYW1lPSJwbHlfbm4yOCI+PC9hPjYuNSBDaGFuZ2luZyB0aGUgc3RhcnRpbmcgc3ltYm9sPC9IMz4KKworCitOb3JtYWxseSwgdGhlIGZpcnN0IHJ1bGUgZm91bmQgaW4gYSB5YWNjIHNwZWNpZmljYXRpb24gZGVmaW5lcyB0aGUgc3RhcnRpbmcgZ3JhbW1hciBydWxlICh0b3AgbGV2ZWwgcnVsZSkuICBUbyBjaGFuZ2UgdGhpcywgc2ltcGx5CitzdXBwbHkgYSA8dHQ+c3RhcnQ8L3R0PiBzcGVjaWZpZXIgaW4geW91ciBmaWxlLiAgRm9yIGV4YW1wbGU6CisKKzxibG9ja3F1b3RlPgorPHByZT4KK3N0YXJ0ID0gJ2ZvbycKKworZGVmIHBfYmFyKHApOgorICAgICdiYXIgOiBBIEInCisKKyMgVGhpcyBpcyB0aGUgc3RhcnRpbmcgcnVsZSBkdWUgdG8gdGhlIHN0YXJ0IHNwZWNpZmllciBhYm92ZQorZGVmIHBfZm9vKHApOgorICAgICdmb28gOiBiYXIgWCcKKy4uLgorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK1RoZSB1c2Ugb2YgYSA8dHQ+c3RhcnQ8L3R0PiBzcGVjaWZpZXIgbWF5IGJlIHVzZWZ1bCBkdXJpbmcgZGVidWdnaW5nCitzaW5jZSB5b3UgY2FuIHVzZSBpdCB0byBoYXZlIHlhY2MgYnVpbGQgYSBzdWJzZXQgb2YgYSBsYXJnZXIgZ3JhbW1hci4KK0ZvciB0aGlzIHB1cnBvc2UsIGl0IGlzIGFsc28gcG9zc2libGUgdG8gc3BlY2lmeSBhIHN0YXJ0aW5nIHN5bWJvbCBhcworYW4gYXJndW1lbnQgdG8gPHR0PnlhY2MoKTwvdHQ+LiBGb3IgZXhhbXBsZToKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorcGFyc2VyID0geWFjYy55YWNjKHN0YXJ0PSdmb28nKQorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKKzxIMz48YSBuYW1lPSJwbHlfbm4yNyI+PC9hPjYuNiBEZWFsaW5nIFdpdGggQW1iaWd1b3VzIEdyYW1tYXJzPC9IMz4KKworCitUaGUgZXhwcmVzc2lvbiBncmFtbWFyIGdpdmVuIGluIHRoZSBlYXJsaWVyIGV4YW1wbGUgaGFzIGJlZW4gd3JpdHRlbgoraW4gYSBzcGVjaWFsIGZvcm1hdCB0byBlbGltaW5hdGUgYW1iaWd1aXR5LiAgSG93ZXZlciwgaW4gbWFueQorc2l0dWF0aW9ucywgaXQgaXMgZXh0cmVtZWx5IGRpZmZpY3VsdCBvciBhd2t3YXJkIHRvIHdyaXRlIGdyYW1tYXJzIGluCit0aGlzIGZvcm1hdC4gIEEgbXVjaCBtb3JlIG5hdHVyYWwgd2F5IHRvIGV4cHJlc3MgdGhlIGdyYW1tYXIgaXMgaW4gYQorbW9yZSBjb21wYWN0IGZvcm0gbGlrZSB0aGlzOgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitleHByZXNzaW9uIDogZXhwcmVzc2lvbiBQTFVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgfCBleHByZXNzaW9uIE1JTlVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgfCBleHByZXNzaW9uIFRJTUVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgfCBleHByZXNzaW9uIERJVklERSBleHByZXNzaW9uCisgICAgICAgICAgIHwgTFBBUkVOIGV4cHJlc3Npb24gUlBBUkVOCisgICAgICAgICAgIHwgTlVNQkVSCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworVW5mb3J0dW5hdGVseSwgdGhpcyBncmFtbWFyIHNwZWNpZmljYXRpb24gaXMgYW1iaWd1b3VzLiAgRm9yIGV4YW1wbGUsCitpZiB5b3UgYXJlIHBhcnNpbmcgdGhlIHN0cmluZyAiMyAqIDQgKyA1IiwgdGhlcmUgaXMgbm8gd2F5IHRvIHRlbGwgaG93Cit0aGUgb3BlcmF0b3JzIGFyZSBzdXBwb3NlZCB0byBiZSBncm91cGVkLiAgRm9yIGV4YW1wbGUsIGRvZXMgdGhlCitleHByZXNzaW9uIG1lYW4gIigzICogNCkgKyA1IiBvciBpcyBpdCAiMyAqICg0KzUpIj8KKworPHA+CitXaGVuIGFuIGFtYmlndW91cyBncmFtbWFyIGlzIGdpdmVuIHRvIDx0dD55YWNjLnB5PC90dD4gaXQgd2lsbCBwcmludAorbWVzc2FnZXMgYWJvdXQgInNoaWZ0L3JlZHVjZSBjb25mbGljdHMiIG9yICJyZWR1Y2UvcmVkdWNlIGNvbmZsaWN0cyIuCitBIHNoaWZ0L3JlZHVjZSBjb25mbGljdCBpcyBjYXVzZWQgd2hlbiB0aGUgcGFyc2VyIGdlbmVyYXRvciBjYW4ndAorZGVjaWRlIHdoZXRoZXIgb3Igbm90IHRvIHJlZHVjZSBhIHJ1bGUgb3Igc2hpZnQgYSBzeW1ib2wgb24gdGhlCitwYXJzaW5nIHN0YWNrLiAgRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBzdHJpbmcgIjMgKiA0ICsgNSIgYW5kIHRoZQoraW50ZXJuYWwgcGFyc2luZyBzdGFjazoKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorU3RlcCBTeW1ib2wgU3RhY2sgICAgICAgICAgIElucHV0IFRva2VucyAgICAgICAgICAgIEFjdGlvbgorLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzEgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAqIDQgKyA1JCAgICBTaGlmdCAzCisyICAgICQgMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiA0ICsgNSQgICAgUmVkdWNlIDogZXhwcmVzc2lvbiA6IE5VTUJFUgorMyAgICAkIGV4cHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogNCArIDUkICAgIFNoaWZ0ICoKKzQgICAgJCBleHByICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgKyA1JCAgICBTaGlmdCA0Cis1ICAgICQgZXhwciAqIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgNSQgICAgUmVkdWNlOiBleHByZXNzaW9uIDogTlVNQkVSCis2ICAgICQgZXhwciAqIGV4cHIgICAgICAgICAgICAgICAgICAgICAgICAgICsgNSQgICAgU0hJRlQvUkVEVUNFIENPTkZMSUNUID8/Pz8KKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitJbiB0aGlzIGNhc2UsIHdoZW4gdGhlIHBhcnNlciByZWFjaGVzIHN0ZXAgNiwgaXQgaGFzIHR3byBvcHRpb25zLiAgT25lCitpcyB0byByZWR1Y2UgdGhlIHJ1bGUgPHR0PmV4cHIgOiBleHByICogZXhwcjwvdHQ+IG9uIHRoZSBzdGFjay4gIFRoZQorb3RoZXIgb3B0aW9uIGlzIHRvIHNoaWZ0IHRoZSB0b2tlbiA8dHQ+KzwvdHQ+IG9uIHRoZSBzdGFjay4gIEJvdGgKK29wdGlvbnMgYXJlIHBlcmZlY3RseSBsZWdhbCBmcm9tIHRoZSBydWxlcyBvZiB0aGUKK2NvbnRleHQtZnJlZS1ncmFtbWFyLgorCis8cD4KK0J5IGRlZmF1bHQsIGFsbCBzaGlmdC9yZWR1Y2UgY29uZmxpY3RzIGFyZSByZXNvbHZlZCBpbiBmYXZvciBvZgorc2hpZnRpbmcuICBUaGVyZWZvcmUsIGluIHRoZSBhYm92ZSBleGFtcGxlLCB0aGUgcGFyc2VyIHdpbGwgYWx3YXlzCitzaGlmdCB0aGUgPHR0Pis8L3R0PiBpbnN0ZWFkIG9mIHJlZHVjaW5nLiAgQWx0aG91Z2ggdGhpcyBzdHJhdGVneQord29ya3MgaW4gbWFueSBjYXNlcyAoZm9yIGV4YW1wbGUsIHRoZSBjYXNlIG9mIAorImlmLXRoZW4iIHZlcnN1cyAiaWYtdGhlbi1lbHNlIiksIGl0IGlzIG5vdCBlbm91Z2ggZm9yIGFyaXRobWV0aWMgZXhwcmVzc2lvbnMuICBJbiBmYWN0LAoraW4gdGhlIGFib3ZlIGV4YW1wbGUsIHRoZSBkZWNpc2lvbiB0byBzaGlmdCA8dHQ+KzwvdHQ+IGlzIGNvbXBsZXRlbHkKK3dyb25nLS0td2Ugc2hvdWxkIGhhdmUgcmVkdWNlZCA8dHQ+ZXhwciAqIGV4cHI8L3R0PiBzaW5jZQorbXVsdGlwbGljYXRpb24gaGFzIGhpZ2hlciBtYXRoZW1hdGljYWwgcHJlY2VkZW5jZSB0aGFuIGFkZGl0aW9uLgorCis8cD5UbyByZXNvbHZlIGFtYmlndWl0eSwgZXNwZWNpYWxseSBpbiBleHByZXNzaW9uCitncmFtbWFycywgPHR0PnlhY2MucHk8L3R0PiBhbGxvd3MgaW5kaXZpZHVhbCB0b2tlbnMgdG8gYmUgYXNzaWduZWQgYQorcHJlY2VkZW5jZSBsZXZlbCBhbmQgYXNzb2NpYXRpdml0eS4gIFRoaXMgaXMgZG9uZSBieSBhZGRpbmcgYSB2YXJpYWJsZQorPHR0PnByZWNlZGVuY2U8L3R0PiB0byB0aGUgZ3JhbW1hciBmaWxlIGxpa2UgdGhpczoKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorcHJlY2VkZW5jZSA9ICgKKyAgICAoJ2xlZnQnLCAnUExVUycsICdNSU5VUycpLAorICAgICgnbGVmdCcsICdUSU1FUycsICdESVZJREUnKSwKKykKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitUaGlzIGRlY2xhcmF0aW9uIHNwZWNpZmllcyB0aGF0IDx0dD5QTFVTPC90dD4vPHR0Pk1JTlVTPC90dD4gaGF2ZSB0aGUKK3NhbWUgcHJlY2VkZW5jZSBsZXZlbCBhbmQgYXJlIGxlZnQtYXNzb2NpYXRpdmUgYW5kIHRoYXQKKzx0dD5USU1FUzwvdHQ+Lzx0dD5ESVZJREU8L3R0PiBoYXZlIHRoZSBzYW1lIHByZWNlZGVuY2UgYW5kIGFyZQorbGVmdC1hc3NvY2lhdGl2ZS4gIFdpdGhpbiB0aGUgPHR0PnByZWNlZGVuY2U8L3R0PiBkZWNsYXJhdGlvbiwgdG9rZW5zCithcmUgb3JkZXJlZCBmcm9tIGxvd2VzdCB0byBoaWdoZXN0IHByZWNlZGVuY2UuIFRodXMsIHRoaXMgZGVjbGFyYXRpb24KK3NwZWNpZmllcyB0aGF0IDx0dD5USU1FUzwvdHQ+Lzx0dD5ESVZJREU8L3R0PiBoYXZlIGhpZ2hlciBwcmVjZWRlbmNlCit0aGFuIDx0dD5QTFVTPC90dD4vPHR0Pk1JTlVTPC90dD4gKHNpbmNlIHRoZXkgYXBwZWFyIGxhdGVyIGluIHRoZQorcHJlY2VkZW5jZSBzcGVjaWZpY2F0aW9uKS4KKworPHA+CitUaGUgcHJlY2VkZW5jZSBzcGVjaWZpY2F0aW9uIHdvcmtzIGJ5IGFzc29jaWF0aW5nIGEgbnVtZXJpY2FsCitwcmVjZWRlbmNlIGxldmVsIHZhbHVlIGFuZCBhc3NvY2lhdGl2aXR5IGRpcmVjdGlvbiB0byB0aGUgbGlzdGVkCit0b2tlbnMuICBGb3IgZXhhbXBsZSwgaW4gdGhlIGFib3ZlIGV4YW1wbGUgeW91IGdldDoKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorUExVUyAgICAgIDogbGV2ZWwgPSAxLCAgYXNzb2MgPSAnbGVmdCcKK01JTlVTICAgICA6IGxldmVsID0gMSwgIGFzc29jID0gJ2xlZnQnCitUSU1FUyAgICAgOiBsZXZlbCA9IDIsICBhc3NvYyA9ICdsZWZ0JworRElWSURFICAgIDogbGV2ZWwgPSAyLCAgYXNzb2MgPSAnbGVmdCcKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitUaGVzZSB2YWx1ZXMgYXJlIHRoZW4gdXNlZCB0byBhdHRhY2ggYSBudW1lcmljYWwgcHJlY2VkZW5jZSB2YWx1ZSBhbmQKK2Fzc29jaWF0aXZpdHkgZGlyZWN0aW9uIHRvIGVhY2ggZ3JhbW1hciBydWxlLiA8ZW0+VGhpcyBpcyBhbHdheXMKK2RldGVybWluZWQgYnkgbG9va2luZyBhdCB0aGUgcHJlY2VkZW5jZSBvZiB0aGUgcmlnaHQtbW9zdCB0ZXJtaW5hbAorc3ltYm9sLjwvZW0+ICBGb3IgZXhhbXBsZToKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorZXhwcmVzc2lvbiA6IGV4cHJlc3Npb24gUExVUyBleHByZXNzaW9uICAgICAgICAgICAgICAgICAjIGxldmVsID0gMSwgbGVmdAorICAgICAgICAgICB8IGV4cHJlc3Npb24gTUlOVVMgZXhwcmVzc2lvbiAgICAgICAgICAgICAgICAjIGxldmVsID0gMSwgbGVmdAorICAgICAgICAgICB8IGV4cHJlc3Npb24gVElNRVMgZXhwcmVzc2lvbiAgICAgICAgICAgICAgICAjIGxldmVsID0gMiwgbGVmdAorICAgICAgICAgICB8IGV4cHJlc3Npb24gRElWSURFIGV4cHJlc3Npb24gICAgICAgICAgICAgICAjIGxldmVsID0gMiwgbGVmdAorICAgICAgICAgICB8IExQQVJFTiBleHByZXNzaW9uIFJQQVJFTiAgICAgICAgICAgICAgICAgICAjIGxldmVsID0gTm9uZSAobm90IHNwZWNpZmllZCkKKyAgICAgICAgICAgfCBOVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCA9IE5vbmUgKG5vdCBzcGVjaWZpZWQpCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworV2hlbiBzaGlmdC9yZWR1Y2UgY29uZmxpY3RzIGFyZSBlbmNvdW50ZXJlZCwgdGhlIHBhcnNlciBnZW5lcmF0b3IgcmVzb2x2ZXMgdGhlIGNvbmZsaWN0IGJ5Citsb29raW5nIGF0IHRoZSBwcmVjZWRlbmNlIHJ1bGVzIGFuZCBhc3NvY2lhdGl2aXR5IHNwZWNpZmllcnMuCisKKzxwPgorPG9sPgorPGxpPklmIHRoZSBjdXJyZW50IHRva2VuIGhhcyBoaWdoZXIgcHJlY2VkZW5jZSB0aGFuIHRoZSBydWxlIG9uIHRoZSBzdGFjaywgaXQgaXMgc2hpZnRlZC4KKzxsaT5JZiB0aGUgZ3JhbW1hciBydWxlIG9uIHRoZSBzdGFjayBoYXMgaGlnaGVyIHByZWNlZGVuY2UsIHRoZSBydWxlIGlzIHJlZHVjZWQuCis8bGk+SWYgdGhlIGN1cnJlbnQgdG9rZW4gYW5kIHRoZSBncmFtbWFyIHJ1bGUgaGF2ZSB0aGUgc2FtZSBwcmVjZWRlbmNlLCB0aGUKK3J1bGUgaXMgcmVkdWNlZCBmb3IgbGVmdCBhc3NvY2lhdGl2aXR5LCB3aGVyZWFzIHRoZSB0b2tlbiBpcyBzaGlmdGVkIGZvciByaWdodCBhc3NvY2lhdGl2aXR5LgorPGxpPklmIG5vdGhpbmcgaXMga25vd24gYWJvdXQgdGhlIHByZWNlZGVuY2UsIHNoaWZ0L3JlZHVjZSBjb25mbGljdHMgYXJlIHJlc29sdmVkIGluCitmYXZvciBvZiBzaGlmdGluZyAodGhlIGRlZmF1bHQpLgorPC9vbD4KKworRm9yIGV4YW1wbGUsIGlmICJleHByZXNzaW9uIFBMVVMgZXhwcmVzc2lvbiIgaGFzIGJlZW4gcGFyc2VkIGFuZCB0aGUKK25leHQgdG9rZW4gaXMgIlRJTUVTIiwgdGhlIGFjdGlvbiBpcyBnb2luZyB0byBiZSBhIHNoaWZ0IGJlY2F1c2UKKyJUSU1FUyIgaGFzIGEgaGlnaGVyIHByZWNlZGVuY2UgbGV2ZWwgdGhhbiAiUExVUyIuICBPbiB0aGUgb3RoZXIgaGFuZCwKK2lmICJleHByZXNzaW9uIFRJTUVTIGV4cHJlc3Npb24iIGhhcyBiZWVuIHBhcnNlZCBhbmQgdGhlIG5leHQgdG9rZW4gaXMKKyJQTFVTIiwgdGhlIGFjdGlvbiBpcyBnb2luZyB0byBiZSByZWR1Y2UgYmVjYXVzZSAiUExVUyIgaGFzIGEgbG93ZXIKK3ByZWNlZGVuY2UgdGhhbiAiVElNRVMuIgorCis8cD4KK1doZW4gc2hpZnQvcmVkdWNlIGNvbmZsaWN0cyBhcmUgcmVzb2x2ZWQgdXNpbmcgdGhlIGZpcnN0IHRocmVlCit0ZWNobmlxdWVzICh3aXRoIHRoZSBoZWxwIG9mIHByZWNlZGVuY2UgcnVsZXMpLCA8dHQ+eWFjYy5weTwvdHQ+IHdpbGwKK3JlcG9ydCBubyBlcnJvcnMgb3IgY29uZmxpY3RzIGluIHRoZSBncmFtbWFyIChhbHRob3VnaCBpdCB3aWxsIHByaW50Citzb21lIGluZm9ybWF0aW9uIGluIHRoZSA8dHQ+cGFyc2VyLm91dDwvdHQ+IGRlYnVnZ2luZyBmaWxlKS4KKworPHA+CitPbmUgcHJvYmxlbSB3aXRoIHRoZSBwcmVjZWRlbmNlIHNwZWNpZmllciB0ZWNobmlxdWUgaXMgdGhhdCBpdCBpcworc29tZXRpbWVzIG5lY2Vzc2FyeSB0byBjaGFuZ2UgdGhlIHByZWNlZGVuY2Ugb2YgYW4gb3BlcmF0b3IgaW4gY2VydGFpbgorY29udGV4dHMuICBGb3IgZXhhbXBsZSwgY29uc2lkZXIgYSB1bmFyeS1taW51cyBvcGVyYXRvciBpbiAiMyArIDQgKgorLTUiLiAgTWF0aGVtYXRpY2FsbHksIHRoZSB1bmFyeSBtaW51cyBpcyBub3JtYWxseSBnaXZlbiBhIHZlcnkgaGlnaAorcHJlY2VkZW5jZS0tYmVpbmcgZXZhbHVhdGVkIGJlZm9yZSB0aGUgbXVsdGlwbHkuICBIb3dldmVyLCBpbiBvdXIKK3ByZWNlZGVuY2Ugc3BlY2lmaWVyLCBNSU5VUyBoYXMgYSBsb3dlciBwcmVjZWRlbmNlIHRoYW4gVElNRVMuICBUbworZGVhbCB3aXRoIHRoaXMsIHByZWNlZGVuY2UgcnVsZXMgY2FuIGJlIGdpdmVuIGZvciBzby1jYWxsZWQgImZpY3RpdGlvdXMgdG9rZW5zIgorbGlrZSB0aGlzOgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitwcmVjZWRlbmNlID0gKAorICAgICgnbGVmdCcsICdQTFVTJywgJ01JTlVTJyksCisgICAgKCdsZWZ0JywgJ1RJTUVTJywgJ0RJVklERScpLAorICAgICgncmlnaHQnLCAnVU1JTlVTJyksICAgICAgICAgICAgIyBVbmFyeSBtaW51cyBvcGVyYXRvcgorKQorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK05vdywgaW4gdGhlIGdyYW1tYXIgZmlsZSwgd2UgY2FuIHdyaXRlIG91ciB1bmFyeSBtaW51cyBydWxlIGxpa2UgdGhpczoKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorZGVmIHBfZXhwcl91bWludXMocCk6CisgICAgJ2V4cHJlc3Npb24gOiBNSU5VUyBleHByZXNzaW9uICVwcmVjIFVNSU5VUycKKyAgICBwWzBdID0gLXBbMl0KKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitJbiB0aGlzIGNhc2UsIDx0dD4lcHJlYyBVTUlOVVM8L3R0PiBvdmVycmlkZXMgdGhlIGRlZmF1bHQgcnVsZSBwcmVjZWRlbmNlLS1zZXR0aW5nIGl0IHRvIHRoYXQKK29mIFVNSU5VUyBpbiB0aGUgcHJlY2VkZW5jZSBzcGVjaWZpZXIuCisKKzxwPgorQXQgZmlyc3QsIHRoZSB1c2Ugb2YgVU1JTlVTIGluIHRoaXMgZXhhbXBsZSBtYXkgYXBwZWFyIHZlcnkgY29uZnVzaW5nLgorVU1JTlVTIGlzIG5vdCBhbiBpbnB1dCB0b2tlbiBvciBhIGdyYW1tYXIgcnVsZS4gIEluc3RlYWQsIHlvdSBzaG91bGQKK3RoaW5rIG9mIGl0IGFzIHRoZSBuYW1lIG9mIGEgc3BlY2lhbCBtYXJrZXIgaW4gdGhlIHByZWNlZGVuY2UgdGFibGUuICAgV2hlbiB5b3UgdXNlIHRoZSA8dHQ+JXByZWM8L3R0PiBxdWFsaWZpZXIsIHlvdSdyZSBzaW1wbHkKK3RlbGxpbmcgeWFjYyB0aGF0IHlvdSB3YW50IHRoZSBwcmVjZWRlbmNlIG9mIHRoZSBleHByZXNzaW9uIHRvIGJlIHRoZSBzYW1lIGFzIGZvciB0aGlzIHNwZWNpYWwgbWFya2VyIGluc3RlYWQgb2YgdGhlIHVzdWFsIHByZWNlZGVuY2UuCisKKzxwPgorSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzcGVjaWZ5IG5vbi1hc3NvY2lhdGl2aXR5IGluIHRoZSA8dHQ+cHJlY2VkZW5jZTwvdHQ+IHRhYmxlLiBUaGlzIHdvdWxkCitiZSB1c2VkIHdoZW4geW91IDxlbT5kb24ndDwvZW0+IHdhbnQgb3BlcmF0aW9ucyB0byBjaGFpbiB0b2dldGhlci4gIEZvciBleGFtcGxlLCBzdXBwb3NlCit5b3Ugd2FudGVkIHRvIHN1cHBvcnQgY29tcGFyaXNvbiBvcGVyYXRvcnMgbGlrZSA8dHQ+Jmx0OzwvdHQ+IGFuZCA8dHQ+Jmd0OzwvdHQ+IGJ1dCB5b3UgZGlkbid0IHdhbnQgdG8gYWxsb3cKK2NvbWJpbmF0aW9ucyBsaWtlIDx0dD5hICZsdDsgYiAmbHQ7IGM8L3R0Pi4gICBUbyBkbyB0aGlzLCBzaW1wbHkgc3BlY2lmeSBhIHJ1bGUgbGlrZSB0aGlzOgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitwcmVjZWRlbmNlID0gKAorICAgICgnbm9uYXNzb2MnLCAnTEVTU1RIQU4nLCAnR1JFQVRFUlRIQU4nKSwgICMgTm9uYXNzb2NpYXRpdmUgb3BlcmF0b3JzCisgICAgKCdsZWZ0JywgJ1BMVVMnLCAnTUlOVVMnKSwKKyAgICAoJ2xlZnQnLCAnVElNRVMnLCAnRElWSURFJyksCisgICAgKCdyaWdodCcsICdVTUlOVVMnKSwgICAgICAgICAgICAjIFVuYXJ5IG1pbnVzIG9wZXJhdG9yCispCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworPHA+CitJZiB5b3UgZG8gdGhpcywgdGhlIG9jY3VycmVuY2Ugb2YgaW5wdXQgdGV4dCBzdWNoIGFzIDx0dD4gYSAmbHQ7IGIgJmx0OyBjPC90dD4gd2lsbCByZXN1bHQgaW4gYSBzeW50YXggZXJyb3IuICBIb3dldmVyLCBzaW1wbGUKK2V4cHJlc3Npb25zIHN1Y2ggYXMgPHR0PmEgJmx0OyBiPC90dD4gd2lsbCBzdGlsbCBiZSBmaW5lLgorCis8cD4KK1JlZHVjZS9yZWR1Y2UgY29uZmxpY3RzIGFyZSBjYXVzZWQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgZ3JhbW1hcgorcnVsZXMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGdpdmVuIHNldCBvZiBzeW1ib2xzLiAgVGhpcyBraW5kIG9mCitjb25mbGljdCBpcyBhbG1vc3QgYWx3YXlzIGJhZCBhbmQgaXMgYWx3YXlzIHJlc29sdmVkIGJ5IHBpY2tpbmcgdGhlCitydWxlIHRoYXQgYXBwZWFycyBmaXJzdCBpbiB0aGUgZ3JhbW1hciBmaWxlLiAgIFJlZHVjZS9yZWR1Y2UgY29uZmxpY3RzCithcmUgYWxtb3N0IGFsd2F5cyBjYXVzZWQgd2hlbiBkaWZmZXJlbnQgc2V0cyBvZiBncmFtbWFyIHJ1bGVzIHNvbWVob3cKK2dlbmVyYXRlIHRoZSBzYW1lIHNldCBvZiBzeW1ib2xzLiAgRm9yIGV4YW1wbGU6CisKKzxibG9ja3F1b3RlPgorPHByZT4KK2Fzc2lnbm1lbnQgOiAgSUQgRVFVQUxTIE5VTUJFUgorICAgICAgICAgICB8ICBJRCBFUVVBTFMgZXhwcmVzc2lvbgorICAgICAgICAgICAKK2V4cHJlc3Npb24gOiBleHByZXNzaW9uIFBMVVMgZXhwcmVzc2lvbgorICAgICAgICAgICB8IGV4cHJlc3Npb24gTUlOVVMgZXhwcmVzc2lvbgorICAgICAgICAgICB8IGV4cHJlc3Npb24gVElNRVMgZXhwcmVzc2lvbgorICAgICAgICAgICB8IGV4cHJlc3Npb24gRElWSURFIGV4cHJlc3Npb24KKyAgICAgICAgICAgfCBMUEFSRU4gZXhwcmVzc2lvbiBSUEFSRU4KKyAgICAgICAgICAgfCBOVU1CRVIKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitJbiB0aGlzIGNhc2UsIGEgcmVkdWNlL3JlZHVjZSBjb25mbGljdCBleGlzdHMgYmV0d2VlbiB0aGVzZSB0d28gcnVsZXM6CisKKzxibG9ja3F1b3RlPgorPHByZT4KK2Fzc2lnbm1lbnQgIDogSUQgRVFVQUxTIE5VTUJFUgorZXhwcmVzc2lvbiAgOiBOVU1CRVIKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitGb3IgZXhhbXBsZSwgaWYgeW91IHdyb3RlICJhID0gNSIsIHRoZSBwYXJzZXIgY2FuJ3QgZmlndXJlIG91dCBpZiB0aGlzCitpcyBzdXBwb3NlZCB0byBiZSByZWR1Y2VkIGFzIDx0dD5hc3NpZ25tZW50IDogSUQgRVFVQUxTIE5VTUJFUjwvdHQ+IG9yCit3aGV0aGVyIGl0J3Mgc3VwcG9zZWQgdG8gcmVkdWNlIHRoZSA1IGFzIGFuIGV4cHJlc3Npb24gYW5kIHRoZW4gcmVkdWNlCit0aGUgcnVsZSA8dHQ+YXNzaWdubWVudCA6IElEIEVRVUFMUyBleHByZXNzaW9uPC90dD4uCisKKzxwPgorSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgcmVkdWNlL3JlZHVjZSBjb25mbGljdHMgYXJlIG5vdG9yaW91c2x5CitkaWZmaWN1bHQgdG8gc3BvdCBzaW1wbHkgbG9va2luZyBhdCB0aGUgaW5wdXQgZ3JhbW1hci4gIFdoZW4gYQorcmVkdWNlL3JlZHVjZSBjb25mbGljdCBvY2N1cnMsIDx0dD55YWNjKCk8L3R0PiB3aWxsIHRyeSB0byBoZWxwIGJ5CitwcmludGluZyBhIHdhcm5pbmcgbWVzc2FnZSBzdWNoIGFzIHRoaXM6CisKKzxibG9ja3F1b3RlPgorPHByZT4KK1dBUk5JTkc6IDEgcmVkdWNlL3JlZHVjZSBjb25mbGljdAorV0FSTklORzogcmVkdWNlL3JlZHVjZSBjb25mbGljdCBpbiBzdGF0ZSAxNSByZXNvbHZlZCB1c2luZyBydWxlIChhc3NpZ25tZW50IC0+IElEIEVRVUFMUyBOVU1CRVIpCitXQVJOSU5HOiByZWplY3RlZCBydWxlIChleHByZXNzaW9uIC0+IE5VTUJFUikKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitUaGlzIG1lc3NhZ2UgaWRlbnRpZmllcyB0aGUgdHdvIHJ1bGVzIHRoYXQgYXJlIGluIGNvbmZsaWN0LiAgSG93ZXZlciwKK2l0IG1heSBub3QgdGVsbCB5b3UgaG93IHRoZSBwYXJzZXIgYXJyaXZlZCBhdCBzdWNoIGEgc3RhdGUuICBUbyB0cnkKK2FuZCBmaWd1cmUgaXQgb3V0LCB5b3UnbGwgcHJvYmFibHkgaGF2ZSB0byBsb29rIGF0IHlvdXIgZ3JhbW1hciBhbmQKK3RoZSBjb250ZW50cyBvZiB0aGUKKzx0dD5wYXJzZXIub3V0PC90dD4gZGVidWdnaW5nIGZpbGUgd2l0aCBhbiBhcHByb3ByaWF0ZWx5IGhpZ2ggbGV2ZWwgb2YKK2NhZmZlaW5hdGlvbi4KKworPEgzPjxhIG5hbWU9InBseV9ubjI4Ij48L2E+Ni43IFRoZSBwYXJzZXIub3V0IGZpbGU8L0gzPgorCisKK1RyYWNraW5nIGRvd24gc2hpZnQvcmVkdWNlIGFuZCByZWR1Y2UvcmVkdWNlIGNvbmZsaWN0cyBpcyBvbmUgb2YgdGhlIGZpbmVyIHBsZWFzdXJlcyBvZiB1c2luZyBhbiBMUgorcGFyc2luZyBhbGdvcml0aG0uICBUbyBhc3Npc3QgaW4gZGVidWdnaW5nLCA8dHQ+eWFjYy5weTwvdHQ+IGNyZWF0ZXMgYSBkZWJ1Z2dpbmcgZmlsZSBjYWxsZWQKKydwYXJzZXIub3V0JyB3aGVuIGl0IGdlbmVyYXRlcyB0aGUgcGFyc2luZyB0YWJsZS4gICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nOgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitVbnVzZWQgdGVybWluYWxzOgorCisKK0dyYW1tYXIKKworUnVsZSAxICAgICBleHByZXNzaW9uIC0+IGV4cHJlc3Npb24gUExVUyBleHByZXNzaW9uCitSdWxlIDIgICAgIGV4cHJlc3Npb24gLT4gZXhwcmVzc2lvbiBNSU5VUyBleHByZXNzaW9uCitSdWxlIDMgICAgIGV4cHJlc3Npb24gLT4gZXhwcmVzc2lvbiBUSU1FUyBleHByZXNzaW9uCitSdWxlIDQgICAgIGV4cHJlc3Npb24gLT4gZXhwcmVzc2lvbiBESVZJREUgZXhwcmVzc2lvbgorUnVsZSA1ICAgICBleHByZXNzaW9uIC0+IE5VTUJFUgorUnVsZSA2ICAgICBleHByZXNzaW9uIC0+IExQQVJFTiBleHByZXNzaW9uIFJQQVJFTgorCitUZXJtaW5hbHMsIHdpdGggcnVsZXMgd2hlcmUgdGhleSBhcHBlYXIKKworVElNRVMgICAgICAgICAgICAgICAgOiAzCitlcnJvciAgICAgICAgICAgICAgICA6IAorTUlOVVMgICAgICAgICAgICAgICAgOiAyCitSUEFSRU4gICAgICAgICAgICAgICA6IDYKK0xQQVJFTiAgICAgICAgICAgICAgIDogNgorRElWSURFICAgICAgICAgICAgICAgOiA0CitQTFVTICAgICAgICAgICAgICAgICA6IDEKK05VTUJFUiAgICAgICAgICAgICAgIDogNQorCitOb250ZXJtaW5hbHMsIHdpdGggcnVsZXMgd2hlcmUgdGhleSBhcHBlYXIKKworZXhwcmVzc2lvbiAgICAgICAgICAgOiAxIDEgMiAyIDMgMyA0IDQgNiAwCisKKworUGFyc2luZyBtZXRob2Q6IExBTFIKKworCitzdGF0ZSAwCisKKyAgICBTJyAtPiAuIGV4cHJlc3Npb24KKyAgICBleHByZXNzaW9uIC0+IC4gZXhwcmVzc2lvbiBQTFVTIGV4cHJlc3Npb24KKyAgICBleHByZXNzaW9uIC0+IC4gZXhwcmVzc2lvbiBNSU5VUyBleHByZXNzaW9uCisgICAgZXhwcmVzc2lvbiAtPiAuIGV4cHJlc3Npb24gVElNRVMgZXhwcmVzc2lvbgorICAgIGV4cHJlc3Npb24gLT4gLiBleHByZXNzaW9uIERJVklERSBleHByZXNzaW9uCisgICAgZXhwcmVzc2lvbiAtPiAuIE5VTUJFUgorICAgIGV4cHJlc3Npb24gLT4gLiBMUEFSRU4gZXhwcmVzc2lvbiBSUEFSRU4KKworICAgIE5VTUJFUiAgICAgICAgICBzaGlmdCBhbmQgZ28gdG8gc3RhdGUgMworICAgIExQQVJFTiAgICAgICAgICBzaGlmdCBhbmQgZ28gdG8gc3RhdGUgMgorCisKK3N0YXRlIDEKKworICAgIFMnIC0+IGV4cHJlc3Npb24gLgorICAgIGV4cHJlc3Npb24gLT4gZXhwcmVzc2lvbiAuIFBMVVMgZXhwcmVzc2lvbgorICAgIGV4cHJlc3Npb24gLT4gZXhwcmVzc2lvbiAuIE1JTlVTIGV4cHJlc3Npb24KKyAgICBleHByZXNzaW9uIC0+IGV4cHJlc3Npb24gLiBUSU1FUyBleHByZXNzaW9uCisgICAgZXhwcmVzc2lvbiAtPiBleHByZXNzaW9uIC4gRElWSURFIGV4cHJlc3Npb24KKworICAgIFBMVVMgICAgICAgICAgICBzaGlmdCBhbmQgZ28gdG8gc3RhdGUgNgorICAgIE1JTlVTICAgICAgICAgICBzaGlmdCBhbmQgZ28gdG8gc3RhdGUgNQorICAgIFRJTUVTICAgICAgICAgICBzaGlmdCBhbmQgZ28gdG8gc3RhdGUgNAorICAgIERJVklERSAgICAgICAgICBzaGlmdCBhbmQgZ28gdG8gc3RhdGUgNworCisKK3N0YXRlIDIKKworICAgIGV4cHJlc3Npb24gLT4gTFBBUkVOIC4gZXhwcmVzc2lvbiBSUEFSRU4KKyAgICBleHByZXNzaW9uIC0+IC4gZXhwcmVzc2lvbiBQTFVTIGV4cHJlc3Npb24KKyAgICBleHByZXNzaW9uIC0+IC4gZXhwcmVzc2lvbiBNSU5VUyBleHByZXNzaW9uCisgICAgZXhwcmVzc2lvbiAtPiAuIGV4cHJlc3Npb24gVElNRVMgZXhwcmVzc2lvbgorICAgIGV4cHJlc3Npb24gLT4gLiBleHByZXNzaW9uIERJVklERSBleHByZXNzaW9uCisgICAgZXhwcmVzc2lvbiAtPiAuIE5VTUJFUgorICAgIGV4cHJlc3Npb24gLT4gLiBMUEFSRU4gZXhwcmVzc2lvbiBSUEFSRU4KKworICAgIE5VTUJFUiAgICAgICAgICBzaGlmdCBhbmQgZ28gdG8gc3RhdGUgMworICAgIExQQVJFTiAgICAgICAgICBzaGlmdCBhbmQgZ28gdG8gc3RhdGUgMgorCisKK3N0YXRlIDMKKworICAgIGV4cHJlc3Npb24gLT4gTlVNQkVSIC4KKworICAgICQgICAgICAgICAgICAgICByZWR1Y2UgdXNpbmcgcnVsZSA1CisgICAgUExVUyAgICAgICAgICAgIHJlZHVjZSB1c2luZyBydWxlIDUKKyAgICBNSU5VUyAgICAgICAgICAgcmVkdWNlIHVzaW5nIHJ1bGUgNQorICAgIFRJTUVTICAgICAgICAgICByZWR1Y2UgdXNpbmcgcnVsZSA1CisgICAgRElWSURFICAgICAgICAgIHJlZHVjZSB1c2luZyBydWxlIDUKKyAgICBSUEFSRU4gICAgICAgICAgcmVkdWNlIHVzaW5nIHJ1bGUgNQorCisKK3N0YXRlIDQKKworICAgIGV4cHJlc3Npb24gLT4gZXhwcmVzc2lvbiBUSU1FUyAuIGV4cHJlc3Npb24KKyAgICBleHByZXNzaW9uIC0+IC4gZXhwcmVzc2lvbiBQTFVTIGV4cHJlc3Npb24KKyAgICBleHByZXNzaW9uIC0+IC4gZXhwcmVzc2lvbiBNSU5VUyBleHByZXNzaW9uCisgICAgZXhwcmVzc2lvbiAtPiAuIGV4cHJlc3Npb24gVElNRVMgZXhwcmVzc2lvbgorICAgIGV4cHJlc3Npb24gLT4gLiBleHByZXNzaW9uIERJVklERSBleHByZXNzaW9uCisgICAgZXhwcmVzc2lvbiAtPiAuIE5VTUJFUgorICAgIGV4cHJlc3Npb24gLT4gLiBMUEFSRU4gZXhwcmVzc2lvbiBSUEFSRU4KKworICAgIE5VTUJFUiAgICAgICAgICBzaGlmdCBhbmQgZ28gdG8gc3RhdGUgMworICAgIExQQVJFTiAgICAgICAgICBzaGlmdCBhbmQgZ28gdG8gc3RhdGUgMgorCisKK3N0YXRlIDUKKworICAgIGV4cHJlc3Npb24gLT4gZXhwcmVzc2lvbiBNSU5VUyAuIGV4cHJlc3Npb24KKyAgICBleHByZXNzaW9uIC0+IC4gZXhwcmVzc2lvbiBQTFVTIGV4cHJlc3Npb24KKyAgICBleHByZXNzaW9uIC0+IC4gZXhwcmVzc2lvbiBNSU5VUyBleHByZXNzaW9uCisgICAgZXhwcmVzc2lvbiAtPiAuIGV4cHJlc3Npb24gVElNRVMgZXhwcmVzc2lvbgorICAgIGV4cHJlc3Npb24gLT4gLiBleHByZXNzaW9uIERJVklERSBleHByZXNzaW9uCisgICAgZXhwcmVzc2lvbiAtPiAuIE5VTUJFUgorICAgIGV4cHJlc3Npb24gLT4gLiBMUEFSRU4gZXhwcmVzc2lvbiBSUEFSRU4KKworICAgIE5VTUJFUiAgICAgICAgICBzaGlmdCBhbmQgZ28gdG8gc3RhdGUgMworICAgIExQQVJFTiAgICAgICAgICBzaGlmdCBhbmQgZ28gdG8gc3RhdGUgMgorCisKK3N0YXRlIDYKKworICAgIGV4cHJlc3Npb24gLT4gZXhwcmVzc2lvbiBQTFVTIC4gZXhwcmVzc2lvbgorICAgIGV4cHJlc3Npb24gLT4gLiBleHByZXNzaW9uIFBMVVMgZXhwcmVzc2lvbgorICAgIGV4cHJlc3Npb24gLT4gLiBleHByZXNzaW9uIE1JTlVTIGV4cHJlc3Npb24KKyAgICBleHByZXNzaW9uIC0+IC4gZXhwcmVzc2lvbiBUSU1FUyBleHByZXNzaW9uCisgICAgZXhwcmVzc2lvbiAtPiAuIGV4cHJlc3Npb24gRElWSURFIGV4cHJlc3Npb24KKyAgICBleHByZXNzaW9uIC0+IC4gTlVNQkVSCisgICAgZXhwcmVzc2lvbiAtPiAuIExQQVJFTiBleHByZXNzaW9uIFJQQVJFTgorCisgICAgTlVNQkVSICAgICAgICAgIHNoaWZ0IGFuZCBnbyB0byBzdGF0ZSAzCisgICAgTFBBUkVOICAgICAgICAgIHNoaWZ0IGFuZCBnbyB0byBzdGF0ZSAyCisKKworc3RhdGUgNworCisgICAgZXhwcmVzc2lvbiAtPiBleHByZXNzaW9uIERJVklERSAuIGV4cHJlc3Npb24KKyAgICBleHByZXNzaW9uIC0+IC4gZXhwcmVzc2lvbiBQTFVTIGV4cHJlc3Npb24KKyAgICBleHByZXNzaW9uIC0+IC4gZXhwcmVzc2lvbiBNSU5VUyBleHByZXNzaW9uCisgICAgZXhwcmVzc2lvbiAtPiAuIGV4cHJlc3Npb24gVElNRVMgZXhwcmVzc2lvbgorICAgIGV4cHJlc3Npb24gLT4gLiBleHByZXNzaW9uIERJVklERSBleHByZXNzaW9uCisgICAgZXhwcmVzc2lvbiAtPiAuIE5VTUJFUgorICAgIGV4cHJlc3Npb24gLT4gLiBMUEFSRU4gZXhwcmVzc2lvbiBSUEFSRU4KKworICAgIE5VTUJFUiAgICAgICAgICBzaGlmdCBhbmQgZ28gdG8gc3RhdGUgMworICAgIExQQVJFTiAgICAgICAgICBzaGlmdCBhbmQgZ28gdG8gc3RhdGUgMgorCisKK3N0YXRlIDgKKworICAgIGV4cHJlc3Npb24gLT4gTFBBUkVOIGV4cHJlc3Npb24gLiBSUEFSRU4KKyAgICBleHByZXNzaW9uIC0+IGV4cHJlc3Npb24gLiBQTFVTIGV4cHJlc3Npb24KKyAgICBleHByZXNzaW9uIC0+IGV4cHJlc3Npb24gLiBNSU5VUyBleHByZXNzaW9uCisgICAgZXhwcmVzc2lvbiAtPiBleHByZXNzaW9uIC4gVElNRVMgZXhwcmVzc2lvbgorICAgIGV4cHJlc3Npb24gLT4gZXhwcmVzc2lvbiAuIERJVklERSBleHByZXNzaW9uCisKKyAgICBSUEFSRU4gICAgICAgICAgc2hpZnQgYW5kIGdvIHRvIHN0YXRlIDEzCisgICAgUExVUyAgICAgICAgICAgIHNoaWZ0IGFuZCBnbyB0byBzdGF0ZSA2CisgICAgTUlOVVMgICAgICAgICAgIHNoaWZ0IGFuZCBnbyB0byBzdGF0ZSA1CisgICAgVElNRVMgICAgICAgICAgIHNoaWZ0IGFuZCBnbyB0byBzdGF0ZSA0CisgICAgRElWSURFICAgICAgICAgIHNoaWZ0IGFuZCBnbyB0byBzdGF0ZSA3CisKKworc3RhdGUgOQorCisgICAgZXhwcmVzc2lvbiAtPiBleHByZXNzaW9uIFRJTUVTIGV4cHJlc3Npb24gLgorICAgIGV4cHJlc3Npb24gLT4gZXhwcmVzc2lvbiAuIFBMVVMgZXhwcmVzc2lvbgorICAgIGV4cHJlc3Npb24gLT4gZXhwcmVzc2lvbiAuIE1JTlVTIGV4cHJlc3Npb24KKyAgICBleHByZXNzaW9uIC0+IGV4cHJlc3Npb24gLiBUSU1FUyBleHByZXNzaW9uCisgICAgZXhwcmVzc2lvbiAtPiBleHByZXNzaW9uIC4gRElWSURFIGV4cHJlc3Npb24KKworICAgICQgICAgICAgICAgICAgICByZWR1Y2UgdXNpbmcgcnVsZSAzCisgICAgUExVUyAgICAgICAgICAgIHJlZHVjZSB1c2luZyBydWxlIDMKKyAgICBNSU5VUyAgICAgICAgICAgcmVkdWNlIHVzaW5nIHJ1bGUgMworICAgIFRJTUVTICAgICAgICAgICByZWR1Y2UgdXNpbmcgcnVsZSAzCisgICAgRElWSURFICAgICAgICAgIHJlZHVjZSB1c2luZyBydWxlIDMKKyAgICBSUEFSRU4gICAgICAgICAgcmVkdWNlIHVzaW5nIHJ1bGUgMworCisgICEgUExVUyAgICAgICAgICAgIFsgc2hpZnQgYW5kIGdvIHRvIHN0YXRlIDYgXQorICAhIE1JTlVTICAgICAgICAgICBbIHNoaWZ0IGFuZCBnbyB0byBzdGF0ZSA1IF0KKyAgISBUSU1FUyAgICAgICAgICAgWyBzaGlmdCBhbmQgZ28gdG8gc3RhdGUgNCBdCisgICEgRElWSURFICAgICAgICAgIFsgc2hpZnQgYW5kIGdvIHRvIHN0YXRlIDcgXQorCitzdGF0ZSAxMAorCisgICAgZXhwcmVzc2lvbiAtPiBleHByZXNzaW9uIE1JTlVTIGV4cHJlc3Npb24gLgorICAgIGV4cHJlc3Npb24gLT4gZXhwcmVzc2lvbiAuIFBMVVMgZXhwcmVzc2lvbgorICAgIGV4cHJlc3Npb24gLT4gZXhwcmVzc2lvbiAuIE1JTlVTIGV4cHJlc3Npb24KKyAgICBleHByZXNzaW9uIC0+IGV4cHJlc3Npb24gLiBUSU1FUyBleHByZXNzaW9uCisgICAgZXhwcmVzc2lvbiAtPiBleHByZXNzaW9uIC4gRElWSURFIGV4cHJlc3Npb24KKworICAgICQgICAgICAgICAgICAgICByZWR1Y2UgdXNpbmcgcnVsZSAyCisgICAgUExVUyAgICAgICAgICAgIHJlZHVjZSB1c2luZyBydWxlIDIKKyAgICBNSU5VUyAgICAgICAgICAgcmVkdWNlIHVzaW5nIHJ1bGUgMgorICAgIFJQQVJFTiAgICAgICAgICByZWR1Y2UgdXNpbmcgcnVsZSAyCisgICAgVElNRVMgICAgICAgICAgIHNoaWZ0IGFuZCBnbyB0byBzdGF0ZSA0CisgICAgRElWSURFICAgICAgICAgIHNoaWZ0IGFuZCBnbyB0byBzdGF0ZSA3CisKKyAgISBUSU1FUyAgICAgICAgICAgWyByZWR1Y2UgdXNpbmcgcnVsZSAyIF0KKyAgISBESVZJREUgICAgICAgICAgWyByZWR1Y2UgdXNpbmcgcnVsZSAyIF0KKyAgISBQTFVTICAgICAgICAgICAgWyBzaGlmdCBhbmQgZ28gdG8gc3RhdGUgNiBdCisgICEgTUlOVVMgICAgICAgICAgIFsgc2hpZnQgYW5kIGdvIHRvIHN0YXRlIDUgXQorCitzdGF0ZSAxMQorCisgICAgZXhwcmVzc2lvbiAtPiBleHByZXNzaW9uIFBMVVMgZXhwcmVzc2lvbiAuCisgICAgZXhwcmVzc2lvbiAtPiBleHByZXNzaW9uIC4gUExVUyBleHByZXNzaW9uCisgICAgZXhwcmVzc2lvbiAtPiBleHByZXNzaW9uIC4gTUlOVVMgZXhwcmVzc2lvbgorICAgIGV4cHJlc3Npb24gLT4gZXhwcmVzc2lvbiAuIFRJTUVTIGV4cHJlc3Npb24KKyAgICBleHByZXNzaW9uIC0+IGV4cHJlc3Npb24gLiBESVZJREUgZXhwcmVzc2lvbgorCisgICAgJCAgICAgICAgICAgICAgIHJlZHVjZSB1c2luZyBydWxlIDEKKyAgICBQTFVTICAgICAgICAgICAgcmVkdWNlIHVzaW5nIHJ1bGUgMQorICAgIE1JTlVTICAgICAgICAgICByZWR1Y2UgdXNpbmcgcnVsZSAxCisgICAgUlBBUkVOICAgICAgICAgIHJlZHVjZSB1c2luZyBydWxlIDEKKyAgICBUSU1FUyAgICAgICAgICAgc2hpZnQgYW5kIGdvIHRvIHN0YXRlIDQKKyAgICBESVZJREUgICAgICAgICAgc2hpZnQgYW5kIGdvIHRvIHN0YXRlIDcKKworICAhIFRJTUVTICAgICAgICAgICBbIHJlZHVjZSB1c2luZyBydWxlIDEgXQorICAhIERJVklERSAgICAgICAgICBbIHJlZHVjZSB1c2luZyBydWxlIDEgXQorICAhIFBMVVMgICAgICAgICAgICBbIHNoaWZ0IGFuZCBnbyB0byBzdGF0ZSA2IF0KKyAgISBNSU5VUyAgICAgICAgICAgWyBzaGlmdCBhbmQgZ28gdG8gc3RhdGUgNSBdCisKK3N0YXRlIDEyCisKKyAgICBleHByZXNzaW9uIC0+IGV4cHJlc3Npb24gRElWSURFIGV4cHJlc3Npb24gLgorICAgIGV4cHJlc3Npb24gLT4gZXhwcmVzc2lvbiAuIFBMVVMgZXhwcmVzc2lvbgorICAgIGV4cHJlc3Npb24gLT4gZXhwcmVzc2lvbiAuIE1JTlVTIGV4cHJlc3Npb24KKyAgICBleHByZXNzaW9uIC0+IGV4cHJlc3Npb24gLiBUSU1FUyBleHByZXNzaW9uCisgICAgZXhwcmVzc2lvbiAtPiBleHByZXNzaW9uIC4gRElWSURFIGV4cHJlc3Npb24KKworICAgICQgICAgICAgICAgICAgICByZWR1Y2UgdXNpbmcgcnVsZSA0CisgICAgUExVUyAgICAgICAgICAgIHJlZHVjZSB1c2luZyBydWxlIDQKKyAgICBNSU5VUyAgICAgICAgICAgcmVkdWNlIHVzaW5nIHJ1bGUgNAorICAgIFRJTUVTICAgICAgICAgICByZWR1Y2UgdXNpbmcgcnVsZSA0CisgICAgRElWSURFICAgICAgICAgIHJlZHVjZSB1c2luZyBydWxlIDQKKyAgICBSUEFSRU4gICAgICAgICAgcmVkdWNlIHVzaW5nIHJ1bGUgNAorCisgICEgUExVUyAgICAgICAgICAgIFsgc2hpZnQgYW5kIGdvIHRvIHN0YXRlIDYgXQorICAhIE1JTlVTICAgICAgICAgICBbIHNoaWZ0IGFuZCBnbyB0byBzdGF0ZSA1IF0KKyAgISBUSU1FUyAgICAgICAgICAgWyBzaGlmdCBhbmQgZ28gdG8gc3RhdGUgNCBdCisgICEgRElWSURFICAgICAgICAgIFsgc2hpZnQgYW5kIGdvIHRvIHN0YXRlIDcgXQorCitzdGF0ZSAxMworCisgICAgZXhwcmVzc2lvbiAtPiBMUEFSRU4gZXhwcmVzc2lvbiBSUEFSRU4gLgorCisgICAgJCAgICAgICAgICAgICAgIHJlZHVjZSB1c2luZyBydWxlIDYKKyAgICBQTFVTICAgICAgICAgICAgcmVkdWNlIHVzaW5nIHJ1bGUgNgorICAgIE1JTlVTICAgICAgICAgICByZWR1Y2UgdXNpbmcgcnVsZSA2CisgICAgVElNRVMgICAgICAgICAgIHJlZHVjZSB1c2luZyBydWxlIDYKKyAgICBESVZJREUgICAgICAgICAgcmVkdWNlIHVzaW5nIHJ1bGUgNgorICAgIFJQQVJFTiAgICAgICAgICByZWR1Y2UgdXNpbmcgcnVsZSA2Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworVGhlIGRpZmZlcmVudCBzdGF0ZXMgdGhhdCBhcHBlYXIgaW4gdGhpcyBmaWxlIGFyZSBhIHJlcHJlc2VudGF0aW9uIG9mCitldmVyeSBwb3NzaWJsZSBzZXF1ZW5jZSBvZiB2YWxpZCBpbnB1dCB0b2tlbnMgYWxsb3dlZCBieSB0aGUgZ3JhbW1hci4KK1doZW4gcmVjZWl2aW5nIGlucHV0IHRva2VucywgdGhlIHBhcnNlciBpcyBidWlsZGluZyB1cCBhIHN0YWNrIGFuZAorbG9va2luZyBmb3IgbWF0Y2hpbmcgcnVsZXMuICBFYWNoIHN0YXRlIGtlZXBzIHRyYWNrIG9mIHRoZSBncmFtbWFyCitydWxlcyB0aGF0IG1pZ2h0IGJlIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIG1hdGNoZWQgYXQgdGhhdCBwb2ludC4gIFdpdGhpbiBlYWNoCitydWxlLCB0aGUgIi4iIGNoYXJhY3RlciBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgbG9jYXRpb24gb2YgdGhlIHBhcnNlCit3aXRoaW4gdGhhdCBydWxlLiAgSW4gYWRkaXRpb24sIHRoZSBhY3Rpb25zIGZvciBlYWNoIHZhbGlkIGlucHV0IHRva2VuCithcmUgbGlzdGVkLiAgV2hlbiBhIHNoaWZ0L3JlZHVjZSBvciByZWR1Y2UvcmVkdWNlIGNvbmZsaWN0IGFyaXNlcywKK3J1bGVzIDxlbT5ub3Q8L2VtPiBzZWxlY3RlZCBhcmUgcHJlZml4ZWQgd2l0aCBhbiAhLiAgRm9yIGV4YW1wbGU6CisKKzxibG9ja3F1b3RlPgorPHByZT4KKyAgISBUSU1FUyAgICAgICAgICAgWyByZWR1Y2UgdXNpbmcgcnVsZSAyIF0KKyAgISBESVZJREUgICAgICAgICAgWyByZWR1Y2UgdXNpbmcgcnVsZSAyIF0KKyAgISBQTFVTICAgICAgICAgICAgWyBzaGlmdCBhbmQgZ28gdG8gc3RhdGUgNiBdCisgICEgTUlOVVMgICAgICAgICAgIFsgc2hpZnQgYW5kIGdvIHRvIHN0YXRlIDUgXQorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK0J5IGxvb2tpbmcgYXQgdGhlc2UgcnVsZXMgKGFuZCB3aXRoIGEgbGl0dGxlIHByYWN0aWNlKSwgeW91IGNhbiB1c3VhbGx5IHRyYWNrIGRvd24gdGhlIHNvdXJjZQorb2YgbW9zdCBwYXJzaW5nIGNvbmZsaWN0cy4gIEl0IHNob3VsZCBhbHNvIGJlIHN0cmVzc2VkIHRoYXQgbm90IGFsbCBzaGlmdC1yZWR1Y2UgY29uZmxpY3RzIGFyZQorYmFkLiAgSG93ZXZlciwgdGhlIG9ubHkgd2F5IHRvIGJlIHN1cmUgdGhhdCB0aGV5IGFyZSByZXNvbHZlZCBjb3JyZWN0bHkgaXMgdG8gbG9vayBhdCA8dHQ+cGFyc2VyLm91dDwvdHQ+LgorICAKKzxIMz48YSBuYW1lPSJwbHlfbm4yOSI+PC9hPjYuOCBTeW50YXggRXJyb3IgSGFuZGxpbmc8L0gzPgorCisKK0lmIHlvdSBhcmUgY3JlYXRpbmcgYSBwYXJzZXIgZm9yIHByb2R1Y3Rpb24gdXNlLCB0aGUgaGFuZGxpbmcgb2YKK3N5bnRheCBlcnJvcnMgaXMgaW1wb3J0YW50LiAgQXMgYSBnZW5lcmFsIHJ1bGUsIHlvdSBkb24ndCB3YW50IGEKK3BhcnNlciB0byBzaW1wbHkgdGhyb3cgdXAgaXRzIGhhbmRzIGFuZCBzdG9wIGF0IHRoZSBmaXJzdCBzaWduIG9mCit0cm91YmxlLiAgSW5zdGVhZCwgeW91IHdhbnQgaXQgdG8gcmVwb3J0IHRoZSBlcnJvciwgcmVjb3ZlciBpZiBwb3NzaWJsZSwgYW5kCitjb250aW51ZSBwYXJzaW5nIHNvIHRoYXQgYWxsIG9mIHRoZSBlcnJvcnMgaW4gdGhlIGlucHV0IGdldCByZXBvcnRlZAordG8gdGhlIHVzZXIgYXQgb25jZS4gICBUaGlzIGlzIHRoZSBzdGFuZGFyZCBiZWhhdmlvciBmb3VuZCBpbiBjb21waWxlcnMKK2ZvciBsYW5ndWFnZXMgc3VjaCBhcyBDLCBDKyssIGFuZCBKYXZhLgorCitJbiBQTFksIHdoZW4gYSBzeW50YXggZXJyb3Igb2NjdXJzIGR1cmluZyBwYXJzaW5nLCB0aGUgZXJyb3IgaXMgaW1tZWRpYXRlbHkKK2RldGVjdGVkIChpLmUuLCB0aGUgcGFyc2VyIGRvZXMgbm90IHJlYWQgYW55IG1vcmUgdG9rZW5zIGJleW9uZCB0aGUKK3NvdXJjZSBvZiB0aGUgZXJyb3IpLiAgSG93ZXZlciwgYXQgdGhpcyBwb2ludCwgdGhlIHBhcnNlciBlbnRlcnMgYQorcmVjb3ZlcnkgbW9kZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyeSBhbmQgY29udGludWUgZnVydGhlciBwYXJzaW5nLgorQXMgYSBnZW5lcmFsIHJ1bGUsIGVycm9yIHJlY292ZXJ5IGluIExSIHBhcnNlcnMgaXMgYSBkZWxpY2F0ZQordG9waWMgdGhhdCBpbnZvbHZlcyBhbmNpZW50IHJpdHVhbHMgYW5kIGJsYWNrLW1hZ2ljLiAgIFRoZSByZWNvdmVyeSBtZWNoYW5pc20KK3Byb3ZpZGVkIGJ5IDx0dD55YWNjLnB5PC90dD4gaXMgY29tcGFyYWJsZSB0byBVbml4IHlhY2Mgc28geW91IG1heSB3YW50Citjb25zdWx0IGEgYm9vayBsaWtlIE8nUmVpbGx5J3MgIkxleCBhbmQgWWFjYyIgZm9yIHNvbWUgb2YgdGhlIGZpbmVyIGRldGFpbHMuCisKKzxwPgorV2hlbiBhIHN5bnRheCBlcnJvciBvY2N1cnMsIDx0dD55YWNjLnB5PC90dD4gcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKKworPG9sPgorPGxpPk9uIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGFuIGVycm9yLCB0aGUgdXNlci1kZWZpbmVkIDx0dD5wX2Vycm9yKCk8L3R0PiBmdW5jdGlvbgoraXMgY2FsbGVkIHdpdGggdGhlIG9mZmVuZGluZyB0b2tlbiBhcyBhbiBhcmd1bWVudC4gSG93ZXZlciwgaWYgdGhlIHN5bnRheCBlcnJvciBpcyBkdWUgdG8KK3JlYWNoaW5nIHRoZSBlbmQtb2YtZmlsZSwgPHR0PnBfZXJyb3IoKTwvdHQ+IGlzIGNhbGxlZCB3aXRoIGFuCisgIGFyZ3VtZW50IG9mIDx0dD5Ob25lPC90dD4uCitBZnRlcndhcmRzLCB0aGUgcGFyc2VyIGVudGVycworYW4gImVycm9yLXJlY292ZXJ5IiBtb2RlIGluIHdoaWNoIGl0IHdpbGwgbm90IG1ha2UgZnV0dXJlIGNhbGxzIHRvIDx0dD5wX2Vycm9yKCk8L3R0PiB1bnRpbCBpdAoraGFzIHN1Y2Nlc3NmdWxseSBzaGlmdGVkIGF0IGxlYXN0IDMgdG9rZW5zIG9udG8gdGhlIHBhcnNpbmcgc3RhY2suCisKKzxwPgorPGxpPklmIG5vIHJlY292ZXJ5IGFjdGlvbiBpcyB0YWtlbiBpbiA8dHQ+cF9lcnJvcigpPC90dD4sIHRoZSBvZmZlbmRpbmcgbG9va2FoZWFkIHRva2VuIGlzIHJlcGxhY2VkCit3aXRoIGEgc3BlY2lhbCA8dHQ+ZXJyb3I8L3R0PiB0b2tlbi4KKworPHA+Cis8bGk+SWYgdGhlIG9mZmVuZGluZyBsb29rYWhlYWQgdG9rZW4gaXMgYWxyZWFkeSBzZXQgdG8gPHR0PmVycm9yPC90dD4sIHRoZSB0b3AgaXRlbSBvZiB0aGUgcGFyc2luZyBzdGFjayBpcworZGVsZXRlZC4KKworPHA+Cis8bGk+SWYgdGhlIGVudGlyZSBwYXJzaW5nIHN0YWNrIGlzIHVud291bmQsIHRoZSBwYXJzZXIgZW50ZXJzIGEgcmVzdGFydCBzdGF0ZSBhbmQgYXR0ZW1wdHMgdG8gc3RhcnQKK3BhcnNpbmcgZnJvbSBpdHMgaW5pdGlhbCBzdGF0ZS4KKworPHA+Cis8bGk+SWYgYSBncmFtbWFyIHJ1bGUgYWNjZXB0cyA8dHQ+ZXJyb3I8L3R0PiBhcyBhIHRva2VuLCBpdCB3aWxsIGJlCitzaGlmdGVkIG9udG8gdGhlIHBhcnNpbmcgc3RhY2suCisKKzxwPgorPGxpPklmIHRoZSB0b3AgaXRlbSBvZiB0aGUgcGFyc2luZyBzdGFjayBpcyA8dHQ+ZXJyb3I8L3R0PiwgbG9va2FoZWFkIHRva2VucyB3aWxsIGJlIGRpc2NhcmRlZCB1bnRpbCB0aGUKK3BhcnNlciBjYW4gc3VjY2Vzc2Z1bGx5IHNoaWZ0IGEgbmV3IHN5bWJvbCBvciByZWR1Y2UgYSBydWxlIGludm9sdmluZyA8dHQ+ZXJyb3I8L3R0Pi4KKzwvb2w+CisKKzxIND48YSBuYW1lPSJwbHlfbm4zMCI+PC9hPjYuOC4xIFJlY292ZXJ5IGFuZCByZXN5bmNocm9uaXphdGlvbiB3aXRoIGVycm9yIHJ1bGVzPC9IND4KKworCitUaGUgbW9zdCB3ZWxsLWJlaGF2ZWQgYXBwcm9hY2ggZm9yIGhhbmRsaW5nIHN5bnRheCBlcnJvcnMgaXMgdG8gd3JpdGUgZ3JhbW1hciBydWxlcyB0aGF0IGluY2x1ZGUgdGhlIDx0dD5lcnJvcjwvdHQ+Cit0b2tlbi4gIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdXIgbGFuZ3VhZ2UgaGFkIGEgZ3JhbW1hciBydWxlIGZvciBhIHByaW50IHN0YXRlbWVudCBsaWtlIHRoaXM6CisKKzxibG9ja3F1b3RlPgorPHByZT4KK2RlZiBwX3N0YXRlbWVudF9wcmludChwKToKKyAgICAgJ3N0YXRlbWVudCA6IFBSSU5UIGV4cHIgU0VNSScKKyAgICAgLi4uCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworVG8gYWNjb3VudCBmb3IgdGhlIHBvc3NpYmlsaXR5IG9mIGEgYmFkIGV4cHJlc3Npb24sIHlvdSBtaWdodCB3cml0ZSBhbiBhZGRpdGlvbmFsIGdyYW1tYXIgcnVsZSBsaWtlIHRoaXM6CisKKzxibG9ja3F1b3RlPgorPHByZT4KK2RlZiBwX3N0YXRlbWVudF9wcmludF9lcnJvcihwKToKKyAgICAgJ3N0YXRlbWVudCA6IFBSSU5UIGVycm9yIFNFTUknCisgICAgIHByaW50KCJTeW50YXggZXJyb3IgaW4gcHJpbnQgc3RhdGVtZW50LiBCYWQgZXhwcmVzc2lvbiIpCisKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitJbiB0aGlzIGNhc2UsIHRoZSA8dHQ+ZXJyb3I8L3R0PiB0b2tlbiB3aWxsIG1hdGNoIGFueSBzZXF1ZW5jZSBvZgordG9rZW5zIHRoYXQgbWlnaHQgYXBwZWFyIHVwIHRvIHRoZSBmaXJzdCBzZW1pY29sb24gdGhhdCBpcworZW5jb3VudGVyZWQuICBPbmNlIHRoZSBzZW1pY29sb24gaXMgcmVhY2hlZCwgdGhlIHJ1bGUgd2lsbCBiZQoraW52b2tlZCBhbmQgdGhlIDx0dD5lcnJvcjwvdHQ+IHRva2VuIHdpbGwgZ28gYXdheS4KKworPHA+CitUaGlzIHR5cGUgb2YgcmVjb3ZlcnkgaXMgc29tZXRpbWVzIGtub3duIGFzIHBhcnNlciByZXN5bmNocm9uaXphdGlvbi4KK1RoZSA8dHQ+ZXJyb3I8L3R0PiB0b2tlbiBhY3RzIGFzIGEgd2lsZGNhcmQgZm9yIGFueSBiYWQgaW5wdXQgdGV4dCBhbmQKK3RoZSB0b2tlbiBpbW1lZGlhdGVseSBmb2xsb3dpbmcgPHR0PmVycm9yPC90dD4gYWN0cyBhcyBhCitzeW5jaHJvbml6YXRpb24gdG9rZW4uCisKKzxwPgorSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgPHR0PmVycm9yPC90dD4gdG9rZW4gdXN1YWxseSBkb2VzIG5vdCBhcHBlYXIgYXMgdGhlIGxhc3QgdG9rZW4KK29uIHRoZSByaWdodCBpbiBhbiBlcnJvciBydWxlLiAgRm9yIGV4YW1wbGU6CisKKzxibG9ja3F1b3RlPgorPHByZT4KK2RlZiBwX3N0YXRlbWVudF9wcmludF9lcnJvcihwKToKKyAgICAnc3RhdGVtZW50IDogUFJJTlQgZXJyb3InCisgICAgcHJpbnQoIlN5bnRheCBlcnJvciBpbiBwcmludCBzdGF0ZW1lbnQuIEJhZCBleHByZXNzaW9uIikKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitUaGlzIGlzIGJlY2F1c2UgdGhlIGZpcnN0IGJhZCB0b2tlbiBlbmNvdW50ZXJlZCB3aWxsIGNhdXNlIHRoZSBydWxlIHRvCitiZSByZWR1Y2VkLS13aGljaCBtYXkgbWFrZSBpdCBkaWZmaWN1bHQgdG8gcmVjb3ZlciBpZiBtb3JlIGJhZCB0b2tlbnMKK2ltbWVkaWF0ZWx5IGZvbGxvdy4gICAKKworPEg0PjxhIG5hbWU9InBseV9ubjMxIj48L2E+Ni44LjIgUGFuaWMgbW9kZSByZWNvdmVyeTwvSDQ+CisKKworQW4gYWx0ZXJuYXRpdmUgZXJyb3IgcmVjb3Zlcnkgc2NoZW1lIGlzIHRvIGVudGVyIGEgcGFuaWMgbW9kZSByZWNvdmVyeSBpbiB3aGljaCB0b2tlbnMgYXJlCitkaXNjYXJkZWQgdG8gYSBwb2ludCB3aGVyZSB0aGUgcGFyc2VyIG1pZ2h0IGJlIGFibGUgdG8gcmVjb3ZlciBpbiBzb21lIHNlbnNpYmxlIG1hbm5lci4KKworPHA+CitQYW5pYyBtb2RlIHJlY292ZXJ5IGlzIGltcGxlbWVudGVkIGVudGlyZWx5IGluIHRoZSA8dHQ+cF9lcnJvcigpPC90dD4gZnVuY3Rpb24uICBGb3IgZXhhbXBsZSwgdGhpcworZnVuY3Rpb24gc3RhcnRzIGRpc2NhcmRpbmcgdG9rZW5zIHVudGlsIGl0IHJlYWNoZXMgYSBjbG9zaW5nICd9Jy4gIFRoZW4sIGl0IHJlc3RhcnRzIHRoZSAKK3BhcnNlciBpbiBpdHMgaW5pdGlhbCBzdGF0ZS4KKworPGJsb2NrcXVvdGU+Cis8cHJlPgorZGVmIHBfZXJyb3IocCk6CisgICAgcHJpbnQoIldob2EuIFlvdSBhcmUgc2VyaW91c2x5IGhvc2VkLiIpCisgICAgaWYgbm90IHA6CisgICAgICAgIHByaW50KCJFbmQgb2YgRmlsZSEiKQorICAgICAgICByZXR1cm4KKworICAgICMgUmVhZCBhaGVhZCBsb29raW5nIGZvciBhIGNsb3NpbmcgJ30nCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgdG9rID0gcGFyc2VyLnRva2VuKCkgICAgICAgICAgICAgIyBHZXQgdGhlIG5leHQgdG9rZW4KKyAgICAgICAgaWYgbm90IHRvayBvciB0b2sudHlwZSA9PSAnUkJSQUNFJzogCisgICAgICAgICAgICBicmVhaworICAgIHBhcnNlci5yZXN0YXJ0KCkKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCis8cD4KK1RoaXMgZnVuY3Rpb24gc2ltcGx5IGRpc2NhcmRzIHRoZSBiYWQgdG9rZW4gYW5kIHRlbGxzIHRoZSBwYXJzZXIgdGhhdCB0aGUgZXJyb3Igd2FzIG9rLgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitkZWYgcF9lcnJvcihwKToKKyAgICBpZiBwOgorICAgICAgICAgcHJpbnQoIlN5bnRheCBlcnJvciBhdCB0b2tlbiIsIHAudHlwZSkKKyAgICAgICAgICMgSnVzdCBkaXNjYXJkIHRoZSB0b2tlbiBhbmQgdGVsbCB0aGUgcGFyc2VyIGl0J3Mgb2theS4KKyAgICAgICAgIHBhcnNlci5lcnJvaygpCisgICAgZWxzZToKKyAgICAgICAgIHByaW50KCJTeW50YXggZXJyb3IgYXQgRU9GIikKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCis8UD4KK01vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UgbWV0aG9kcyBpcyBhcyBmb2xsb3dzOgorPC9wPgorCis8cD4KKzx1bD4KKzxsaT48dHQ+cGFyc2VyLmVycm9rKCk8L3R0Pi4gIFRoaXMgcmVzZXRzIHRoZSBwYXJzZXIgc3RhdGUgc28gaXQgZG9lc24ndCB0aGluayBpdCdzIGluIGVycm9yLXJlY292ZXJ5Cittb2RlLiAgIFRoaXMgd2lsbCBwcmV2ZW50IGFuIDx0dD5lcnJvcjwvdHQ+IHRva2VuIGZyb20gYmVpbmcgZ2VuZXJhdGVkIGFuZCB3aWxsIHJlc2V0IHRoZSBpbnRlcm5hbAorZXJyb3IgY291bnRlcnMgc28gdGhhdCB0aGUgbmV4dCBzeW50YXggZXJyb3Igd2lsbCBjYWxsIDx0dD5wX2Vycm9yKCk8L3R0PiBhZ2Fpbi4KKworPHA+Cis8bGk+PHR0PnBhcnNlci50b2tlbigpPC90dD4uICBUaGlzIHJldHVybnMgdGhlIG5leHQgdG9rZW4gb24gdGhlIGlucHV0IHN0cmVhbS4KKworPHA+Cis8bGk+PHR0PnBhcnNlci5yZXN0YXJ0KCk8L3R0Pi4gIFRoaXMgZGlzY2FyZHMgdGhlIGVudGlyZSBwYXJzaW5nIHN0YWNrIGFuZCByZXNldHMgdGhlIHBhcnNlcgordG8gaXRzIGluaXRpYWwgc3RhdGUuIAorPC91bD4KKworPHA+CitUbyBzdXBwbHkgdGhlIG5leHQgbG9va2FoZWFkIHRva2VuIHRvIHRoZSBwYXJzZXIsIDx0dD5wX2Vycm9yKCk8L3R0PiBjYW4gcmV0dXJuIGEgdG9rZW4uICBUaGlzIG1pZ2h0IGJlCit1c2VmdWwgaWYgdHJ5aW5nIHRvIHN5bmNocm9uaXplIG9uIHNwZWNpYWwgY2hhcmFjdGVycy4gIEZvciBleGFtcGxlOgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitkZWYgcF9lcnJvcihwKToKKyAgICAjIFJlYWQgYWhlYWQgbG9va2luZyBmb3IgYSB0ZXJtaW5hdGluZyAiOyIKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICB0b2sgPSBwYXJzZXIudG9rZW4oKSAgICAgICAgICAgICAjIEdldCB0aGUgbmV4dCB0b2tlbgorICAgICAgICBpZiBub3QgdG9rIG9yIHRvay50eXBlID09ICdTRU1JJzogYnJlYWsKKyAgICBwYXJzZXIuZXJyb2soKQorCisgICAgIyBSZXR1cm4gU0VNSSB0byB0aGUgcGFyc2VyIGFzIHRoZSBuZXh0IGxvb2thaGVhZCB0b2tlbgorICAgIHJldHVybiB0b2sgIAorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKKzxwPgorS2VlcCBpbiBtaW5kIGluIHRoYXQgdGhlIGFib3ZlIGVycm9yIGhhbmRsaW5nIGZ1bmN0aW9ucywKKzx0dD5wYXJzZXI8L3R0PiBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgcGFyc2VyIGNyZWF0ZWQgYnkKKzx0dD55YWNjKCk8L3R0Pi4gICBZb3UnbGwgbmVlZCB0byBzYXZlIHRoaXMgaW5zdGFuY2Ugc29tZXBsYWNlIGluIHlvdXIKK2NvZGUgc28gdGhhdCB5b3UgY2FuIHJlZmVyIHRvIGl0IGR1cmluZyBlcnJvciBoYW5kbGluZy4KKzwvcD4KKworPEg0PjxhIG5hbWU9InBseV9ubjM1Ij48L2E+Ni44LjMgU2lnbmFsbGluZyBhbiBlcnJvciBmcm9tIGEgcHJvZHVjdGlvbjwvSDQ+CisKKworSWYgbmVjZXNzYXJ5LCBhIHByb2R1Y3Rpb24gcnVsZSBjYW4gbWFudWFsbHkgZm9yY2UgdGhlIHBhcnNlciB0byBlbnRlciBlcnJvciByZWNvdmVyeS4gIFRoaXMKK2lzIGRvbmUgYnkgcmFpc2luZyB0aGUgPHR0PlN5bnRheEVycm9yPC90dD4gZXhjZXB0aW9uIGxpa2UgdGhpczoKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorZGVmIHBfcHJvZHVjdGlvbihwKToKKyAgICAncHJvZHVjdGlvbiA6IHNvbWUgcHJvZHVjdGlvbiAuLi4nCisgICAgcmFpc2UgU3ludGF4RXJyb3IKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitUaGUgZWZmZWN0IG9mIHJhaXNpbmcgPHR0PlN5bnRheEVycm9yPC90dD4gaXMgdGhlIHNhbWUgYXMgaWYgdGhlIGxhc3Qgc3ltYm9sIHNoaWZ0ZWQgb250byB0aGUKK3BhcnNpbmcgc3RhY2sgd2FzIGFjdHVhbGx5IGEgc3ludGF4IGVycm9yLiAgVGh1cywgd2hlbiB5b3UgZG8gdGhpcywgdGhlIGxhc3Qgc3ltYm9sIHNoaWZ0ZWQgaXMgcG9wcGVkIG9mZgorb2YgdGhlIHBhcnNpbmcgc3RhY2sgYW5kIHRoZSBjdXJyZW50IGxvb2thaGVhZCB0b2tlbiBpcyBzZXQgdG8gYW4gPHR0PmVycm9yPC90dD4gdG9rZW4uICAgVGhlIHBhcnNlcgordGhlbiBlbnRlcnMgZXJyb3ItcmVjb3ZlcnkgbW9kZSB3aGVyZSBpdCB0cmllcyB0byByZWR1Y2UgcnVsZXMgdGhhdCBjYW4gYWNjZXB0IDx0dD5lcnJvcjwvdHQ+IHRva2Vucy4gIAorVGhlIHN0ZXBzIHRoYXQgZm9sbG93IGZyb20gdGhpcyBwb2ludCBhcmUgZXhhY3RseSB0aGUgc2FtZSBhcyBpZiBhIHN5bnRheCBlcnJvciB3ZXJlIGRldGVjdGVkIGFuZCAKKzx0dD5wX2Vycm9yKCk8L3R0PiB3ZXJlIGNhbGxlZC4KKworPFA+CitPbmUgaW1wb3J0YW50IGFzcGVjdCBvZiBtYW51YWxseSBzZXR0aW5nIGFuIGVycm9yIGlzIHRoYXQgdGhlIDx0dD5wX2Vycm9yKCk8L3R0PiBmdW5jdGlvbiB3aWxsIDxiPk5PVDwvYj4gYmUKK2NhbGxlZCBpbiB0aGlzIGNhc2UuICAgSWYgeW91IG5lZWQgdG8gaXNzdWUgYW4gZXJyb3IgbWVzc2FnZSwgbWFrZSBzdXJlIHlvdSBkbyBpdCBpbiB0aGUgcHJvZHVjdGlvbiB0aGF0CityYWlzZXMgPHR0PlN5bnRheEVycm9yPC90dD4uCisKKzxQPgorTm90ZTogVGhpcyBmZWF0dXJlIG9mIFBMWSBpcyBtZWFudCB0byBtaW1pYyB0aGUgYmVoYXZpb3Igb2YgdGhlIFlZRVJST1IgbWFjcm8gaW4geWFjYy4KKworPEg0PjxhIG5hbWU9InBseV9ubjM4Ij48L2E+Ni44LjQgV2hlbiBEbyBTeW50YXggRXJyb3JzIEdldCBSZXBvcnRlZDwvSDQ+CisKKworPHA+CitJbiBtb3N0IGNhc2VzLCB5YWNjIHdpbGwgaGFuZGxlIGVycm9ycyBhcyBzb29uIGFzIGEgYmFkIGlucHV0IHRva2VuIGlzCitkZXRlY3RlZCBvbiB0aGUgaW5wdXQuICBIb3dldmVyLCBiZSBhd2FyZSB0aGF0IHlhY2MgbWF5IGNob29zZSB0bworZGVsYXkgZXJyb3IgaGFuZGxpbmcgdW50aWwgYWZ0ZXIgaXQgaGFzIHJlZHVjZWQgb25lIG9yIG1vcmUgZ3JhbW1hcgorcnVsZXMgZmlyc3QuICBUaGlzIGJlaGF2aW9yIG1pZ2h0IGJlIHVuZXhwZWN0ZWQsIGJ1dCBpdCdzIHJlbGF0ZWQgdG8KK3NwZWNpYWwgc3RhdGVzIGluIHRoZSB1bmRlcmx5aW5nIHBhcnNpbmcgdGFibGUga25vd24gYXMgImRlZmF1bHRlZAorc3RhdGVzLiIgIEEgZGVmYXVsdGVkIHN0YXRlIGlzIHBhcnNpbmcgY29uZGl0aW9uIHdoZXJlIHRoZSBzYW1lCitncmFtbWFyIHJ1bGUgd2lsbCBiZSByZWR1Y2VkIHJlZ2FyZGxlc3Mgb2Ygd2hhdCA8ZW0+dmFsaWQ8L2VtPiB0b2tlbgorY29tZXMgbmV4dCBvbiB0aGUgaW5wdXQuICBGb3Igc3VjaCBzdGF0ZXMsIHlhY2MgY2hvb3NlcyB0byBnbyBhaGVhZAorYW5kIHJlZHVjZSB0aGUgZ3JhbW1hciBydWxlIDxlbT53aXRob3V0IHJlYWRpbmcgdGhlIG5leHQgaW5wdXQKK3Rva2VuPC9lbT4uICBJZiB0aGUgbmV4dCB0b2tlbiBpcyBiYWQsIHlhY2Mgd2lsbCBldmVudHVhbGx5IGdldCBhcm91bmQgdG8gcmVhZGluZyBpdCBhbmQgCityZXBvcnQgYSBzeW50YXggZXJyb3IuICBJdCdzIGp1c3QgYSBsaXR0bGUgdW51c3VhbCBpbiB0aGF0IHlvdSBtaWdodAorc2VlIHNvbWUgb2YgeW91ciBncmFtbWFyIHJ1bGVzIGZpcmluZyBpbW1lZGlhdGVseSBwcmlvciB0byB0aGUgc3ludGF4IAorZXJyb3IuCis8L3A+CisKKzxwPgorVXN1YWxseSwgdGhlIGRlbGF5ZWQgZXJyb3IgcmVwb3J0aW5nIHdpdGggZGVmYXVsdGVkIHN0YXRlcyBpcyBoYXJtbGVzcworKGFuZCB0aGVyZSBhcmUgb3RoZXIgcmVhc29ucyBmb3Igd2FudGluZyBQTFkgdG8gYmVoYXZlIGluIHRoaXMgd2F5KS4KK0hvd2V2ZXIsIGlmIHlvdSBuZWVkIHRvIHR1cm4gdGhpcyBiZWhhdmlvciBvZmYgZm9yIHNvbWUgcmVhc29uLiAgWW91CitjYW4gY2xlYXIgdGhlIGRlZmF1bHRlZCBzdGF0ZXMgdGFibGUgbGlrZSB0aGlzOgorPC9wPgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitwYXJzZXIgPSB5YWNjLnlhY2MoKQorcGFyc2VyLmRlZmF1bHRlZF9zdGF0ZXMgPSB7fQorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKKzxwPgorRGlzYWJsaW5nIGRlZmF1bHRlZCBzdGF0ZXMgaXMgbm90IHJlY29tbWVuZGVkIGlmIHlvdXIgZ3JhbW1hciBtYWtlcyB1c2UKK29mIGVtYmVkZGVkIGFjdGlvbnMgYXMgZGVzY3JpYmVkIGluIFNlY3Rpb24gNi4xMS48L3A+CisKKzxIND48YSBuYW1lPSJwbHlfbm4zMiI+PC9hPjYuOC41IEdlbmVyYWwgY29tbWVudHMgb24gZXJyb3IgaGFuZGxpbmc8L0g0PgorCisKK0ZvciBub3JtYWwgdHlwZXMgb2YgbGFuZ3VhZ2VzLCBlcnJvciByZWNvdmVyeSB3aXRoIGVycm9yIHJ1bGVzIGFuZCByZXN5bmNocm9uaXphdGlvbiBjaGFyYWN0ZXJzIGlzIHByb2JhYmx5IHRoZSBtb3N0IHJlbGlhYmxlCit0ZWNobmlxdWUuIFRoaXMgaXMgYmVjYXVzZSB5b3UgY2FuIGluc3RydW1lbnQgdGhlIGdyYW1tYXIgdG8gY2F0Y2ggZXJyb3JzIGF0IHNlbGVjdGVkIHBsYWNlcyB3aGVyZSBpdCBpcyByZWxhdGl2ZWx5IGVhc3kgCit0byByZWNvdmVyIGFuZCBjb250aW51ZSBwYXJzaW5nLiAgUGFuaWMgbW9kZSByZWNvdmVyeSBpcyByZWFsbHkgb25seSB1c2VmdWwgaW4gY2VydGFpbiBzcGVjaWFsaXplZCBhcHBsaWNhdGlvbnMgd2hlcmUgeW91IG1pZ2h0IHdhbnQKK3RvIGRpc2NhcmQgaHVnZSBwb3J0aW9ucyBvZiB0aGUgaW5wdXQgdGV4dCB0byBmaW5kIGEgdmFsaWQgcmVzdGFydCBwb2ludC4KKworPEgzPjxhIG5hbWU9InBseV9ubjMzIj48L2E+Ni45IExpbmUgTnVtYmVyIGFuZCBQb3NpdGlvbiBUcmFja2luZzwvSDM+CisKKworUG9zaXRpb24gdHJhY2tpbmcgaXMgb2Z0ZW4gYSB0cmlja3kgcHJvYmxlbSB3aGVuIHdyaXRpbmcgY29tcGlsZXJzLgorQnkgZGVmYXVsdCwgUExZIHRyYWNrcyB0aGUgbGluZSBudW1iZXIgYW5kIHBvc2l0aW9uIG9mIGFsbCB0b2tlbnMuCitUaGlzIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKKworPHVsPgorPGxpPjx0dD5wLmxpbmVubyhudW0pPC90dD4uIFJldHVybiB0aGUgbGluZSBudW1iZXIgZm9yIHN5bWJvbCA8ZW0+bnVtPC9lbT4KKzxsaT48dHQ+cC5sZXhwb3MobnVtKTwvdHQ+LiBSZXR1cm4gdGhlIGxleGluZyBwb3NpdGlvbiBmb3Igc3ltYm9sIDxlbT5udW08L2VtPgorPC91bD4KKworRm9yIGV4YW1wbGU6CisKKzxibG9ja3F1b3RlPgorPHByZT4KK2RlZiBwX2V4cHJlc3Npb24ocCk6CisgICAgJ2V4cHJlc3Npb24gOiBleHByZXNzaW9uIFBMVVMgZXhwcmVzc2lvbicKKyAgICBsaW5lICAgPSBwLmxpbmVubygyKSAgICAgICAgIyBsaW5lIG51bWJlciBvZiB0aGUgUExVUyB0b2tlbgorICAgIGluZGV4ICA9IHAubGV4cG9zKDIpICAgICAgICAjIFBvc2l0aW9uIG9mIHRoZSBQTFVTIHRva2VuCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworQXMgYW4gb3B0aW9uYWwgZmVhdHVyZSwgPHR0PnlhY2MucHk8L3R0PiBjYW4gYXV0b21hdGljYWxseSB0cmFjayBsaW5lCitudW1iZXJzIGFuZCBwb3NpdGlvbnMgZm9yIGFsbCBvZiB0aGUgZ3JhbW1hciBzeW1ib2xzIGFzIHdlbGwuCitIb3dldmVyLCB0aGlzIGV4dHJhIHRyYWNraW5nIHJlcXVpcmVzIGV4dHJhIHByb2Nlc3NpbmcgYW5kIGNhbgorc2lnbmlmaWNhbnRseSBzbG93IGRvd24gcGFyc2luZy4gIFRoZXJlZm9yZSwgaXQgbXVzdCBiZSBlbmFibGVkIGJ5CitwYXNzaW5nIHRoZQorPHR0PnRyYWNraW5nPVRydWU8L3R0PiBvcHRpb24gdG8gPHR0PnlhY2MucGFyc2UoKTwvdHQ+LiAgRm9yIGV4YW1wbGU6CisKKzxibG9ja3F1b3RlPgorPHByZT4KK3lhY2MucGFyc2UoZGF0YSx0cmFja2luZz1UcnVlKQorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK09uY2UgZW5hYmxlZCwgdGhlIDx0dD5saW5lbm8oKTwvdHQ+IGFuZCA8dHQ+bGV4cG9zKCk8L3R0PiBtZXRob2RzIHdvcmsKK2ZvciBhbGwgZ3JhbW1hciBzeW1ib2xzLiAgSW4gYWRkaXRpb24sIHR3byBhZGRpdGlvbmFsIG1ldGhvZHMgY2FuIGJlCit1c2VkOgorCis8dWw+Cis8bGk+PHR0PnAubGluZXNwYW4obnVtKTwvdHQ+LiBSZXR1cm4gYSB0dXBsZSAoc3RhcnRsaW5lLGVuZGxpbmUpIHdpdGggdGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcgbGluZSBudW1iZXIgZm9yIHN5bWJvbCA8ZW0+bnVtPC9lbT4uCis8bGk+PHR0PnAubGV4c3BhbihudW0pPC90dD4uIFJldHVybiBhIHR1cGxlIChzdGFydCxlbmQpIHdpdGggdGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcgcG9zaXRpb25zIGZvciBzeW1ib2wgPGVtPm51bTwvZW0+LgorPC91bD4KKworRm9yIGV4YW1wbGU6CisKKzxibG9ja3F1b3RlPgorPHByZT4KK2RlZiBwX2V4cHJlc3Npb24ocCk6CisgICAgJ2V4cHJlc3Npb24gOiBleHByZXNzaW9uIFBMVVMgZXhwcmVzc2lvbicKKyAgICBwLmxpbmVubygxKSAgICAgICAgIyBMaW5lIG51bWJlciBvZiB0aGUgbGVmdCBleHByZXNzaW9uCisgICAgcC5saW5lbm8oMikgICAgICAgICMgbGluZSBudW1iZXIgb2YgdGhlIFBMVVMgb3BlcmF0b3IKKyAgICBwLmxpbmVubygzKSAgICAgICAgIyBsaW5lIG51bWJlciBvZiB0aGUgcmlnaHQgZXhwcmVzc2lvbgorICAgIC4uLgorICAgIHN0YXJ0LGVuZCA9IHAubGluZXNwYW4oMykgICAgIyBTdGFydCxlbmQgbGluZXMgb2YgdGhlIHJpZ2h0IGV4cHJlc3Npb24KKyAgICBzdGFydGksZW5kaSA9IHAubGV4c3BhbigzKSAgICMgU3RhcnQsZW5kIHBvc2l0aW9ucyBvZiByaWdodCBleHByZXNzaW9uCisKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitOb3RlOiBUaGUgPHR0PmxleHNwYW4oKTwvdHQ+IGZ1bmN0aW9uIG9ubHkgcmV0dXJucyB0aGUgcmFuZ2Ugb2YgdmFsdWVzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbGFzdCBncmFtbWFyIHN5bWJvbC4gIAorCis8cD4KK0FsdGhvdWdoIGl0IG1heSBiZSBjb252ZW5pZW50IGZvciBQTFkgdG8gdHJhY2sgcG9zaXRpb24gaW5mb3JtYXRpb24gb24KK2FsbCBncmFtbWFyIHN5bWJvbHMsIHRoaXMgaXMgb2Z0ZW4gdW5uZWNlc3NhcnkuICBGb3IgZXhhbXBsZSwgaWYgeW91CithcmUgbWVyZWx5IHVzaW5nIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGluIGFuIGVycm9yIG1lc3NhZ2UsIHlvdSBjYW4KK29mdGVuIGp1c3Qga2V5IG9mZiBvZiBhIHNwZWNpZmljIHRva2VuIGluIHRoZSBncmFtbWFyIHJ1bGUuICBGb3IKK2V4YW1wbGU6CisKKzxibG9ja3F1b3RlPgorPHByZT4KK2RlZiBwX2JhZF9mdW5jKHApOgorICAgICdmdW5jY2FsbCA6IGZuYW1lIExQQVJFTiBlcnJvciBSUEFSRU4nCisgICAgIyBMaW5lIG51bWJlciByZXBvcnRlZCBmcm9tIExQQVJFTiB0b2tlbgorICAgIHByaW50KCJCYWQgZnVuY3Rpb24gY2FsbCBhdCBsaW5lIiwgcC5saW5lbm8oMikpCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworPHA+CitTaW1pbGFybHksIHlvdSBtYXkgZ2V0IGJldHRlciBwYXJzaW5nIHBlcmZvcm1hbmNlIGlmIHlvdSBvbmx5CitzZWxlY3RpdmVseSBwcm9wYWdhdGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gd2hlcmUgaXQncyBuZWVkZWQgdXNpbmcKK3RoZSA8dHQ+cC5zZXRfbGluZW5vKCk8L3R0PiBtZXRob2QuICBGb3IgZXhhbXBsZToKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorZGVmIHBfZm5hbWUocCk6CisgICAgJ2ZuYW1lIDogSUQnCisgICAgcFswXSA9IHBbMV0KKyAgICBwLnNldF9saW5lbm8oMCxwLmxpbmVubygxKSkKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitQTFkgZG9lc24ndCByZXRhaW4gbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZnJvbSBydWxlcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuCitwYXJzZWQuICAgSWYgeW91IGFyZSBidWlsZGluZyBhbiBhYnN0cmFjdCBzeW50YXggdHJlZSBhbmQgbmVlZCB0byBoYXZlIGxpbmUgbnVtYmVycywKK3lvdSBzaG91bGQgbWFrZSBzdXJlIHRoYXQgdGhlIGxpbmUgbnVtYmVycyBhcHBlYXIgaW4gdGhlIHRyZWUgaXRzZWxmLgorCis8SDM+PGEgbmFtZT0icGx5X25uMzQiPjwvYT42LjEwIEFTVCBDb25zdHJ1Y3Rpb248L0gzPgorCisKKzx0dD55YWNjLnB5PC90dD4gcHJvdmlkZXMgbm8gc3BlY2lhbCBmdW5jdGlvbnMgZm9yIGNvbnN0cnVjdGluZyBhbgorYWJzdHJhY3Qgc3ludGF4IHRyZWUuICBIb3dldmVyLCBzdWNoIGNvbnN0cnVjdGlvbiBpcyBlYXN5IGVub3VnaCB0byBkbworb24geW91ciBvd24uIAorCis8cD5BIG1pbmltYWwgd2F5IHRvIGNvbnN0cnVjdCBhIHRyZWUgaXMgdG8gc2ltcGx5IGNyZWF0ZSBhbmQKK3Byb3BhZ2F0ZSBhIHR1cGxlIG9yIGxpc3QgaW4gZWFjaCBncmFtbWFyIHJ1bGUgZnVuY3Rpb24uICAgVGhlcmUKK2FyZSBtYW55IHBvc3NpYmxlIHdheXMgdG8gZG8gdGhpcywgYnV0IG9uZSBleGFtcGxlIHdvdWxkIGJlIHNvbWV0aGluZworbGlrZSB0aGlzOgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitkZWYgcF9leHByZXNzaW9uX2Jpbm9wKHApOgorICAgICcnJ2V4cHJlc3Npb24gOiBleHByZXNzaW9uIFBMVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIE1JTlVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBUSU1FUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gRElWSURFIGV4cHJlc3Npb24nJycKKworICAgIHBbMF0gPSAoJ2JpbmFyeS1leHByZXNzaW9uJyxwWzJdLHBbMV0scFszXSkKKworZGVmIHBfZXhwcmVzc2lvbl9ncm91cChwKToKKyAgICAnZXhwcmVzc2lvbiA6IExQQVJFTiBleHByZXNzaW9uIFJQQVJFTicKKyAgICBwWzBdID0gKCdncm91cC1leHByZXNzaW9uJyxwWzJdKQorCitkZWYgcF9leHByZXNzaW9uX251bWJlcihwKToKKyAgICAnZXhwcmVzc2lvbiA6IE5VTUJFUicKKyAgICBwWzBdID0gKCdudW1iZXItZXhwcmVzc2lvbicscFsxXSkKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCis8cD4KK0Fub3RoZXIgYXBwcm9hY2ggaXMgdG8gY3JlYXRlIGEgc2V0IG9mIGRhdGEgc3RydWN0dXJlIGZvciBkaWZmZXJlbnQKK2tpbmRzIG9mIGFic3RyYWN0IHN5bnRheCB0cmVlIG5vZGVzIGFuZCBhc3NpZ24gbm9kZXMgdG8gPHR0PnBbMF08L3R0PgoraW4gZWFjaCBydWxlLiAgRm9yIGV4YW1wbGU6CisKKzxibG9ja3F1b3RlPgorPHByZT4KK2NsYXNzIEV4cHI6IHBhc3MKKworY2xhc3MgQmluT3AoRXhwcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsbGVmdCxvcCxyaWdodCk6CisgICAgICAgIHNlbGYudHlwZSA9ICJiaW5vcCIKKyAgICAgICAgc2VsZi5sZWZ0ID0gbGVmdAorICAgICAgICBzZWxmLnJpZ2h0ID0gcmlnaHQKKyAgICAgICAgc2VsZi5vcCA9IG9wCisKK2NsYXNzIE51bWJlcihFeHByKToKKyAgICBkZWYgX19pbml0X18oc2VsZix2YWx1ZSk6CisgICAgICAgIHNlbGYudHlwZSA9ICJudW1iZXIiCisgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorCitkZWYgcF9leHByZXNzaW9uX2Jpbm9wKHApOgorICAgICcnJ2V4cHJlc3Npb24gOiBleHByZXNzaW9uIFBMVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIE1JTlVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBUSU1FUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gRElWSURFIGV4cHJlc3Npb24nJycKKworICAgIHBbMF0gPSBCaW5PcChwWzFdLHBbMl0scFszXSkKKworZGVmIHBfZXhwcmVzc2lvbl9ncm91cChwKToKKyAgICAnZXhwcmVzc2lvbiA6IExQQVJFTiBleHByZXNzaW9uIFJQQVJFTicKKyAgICBwWzBdID0gcFsyXQorCitkZWYgcF9leHByZXNzaW9uX251bWJlcihwKToKKyAgICAnZXhwcmVzc2lvbiA6IE5VTUJFUicKKyAgICBwWzBdID0gTnVtYmVyKHBbMV0pCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworVGhlIGFkdmFudGFnZSB0byB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgaXQgbWF5IG1ha2UgaXQgZWFzaWVyIHRvIGF0dGFjaCBtb3JlIGNvbXBsaWNhdGVkCitzZW1hbnRpY3MsIHR5cGUgY2hlY2tpbmcsIGNvZGUgZ2VuZXJhdGlvbiwgYW5kIG90aGVyIGZlYXR1cmVzIHRvIHRoZSBub2RlIGNsYXNzZXMuCisKKzxwPgorVG8gc2ltcGxpZnkgdHJlZSB0cmF2ZXJzYWwsIGl0IG1heSBtYWtlIHNlbnNlIHRvIHBpY2sgYSB2ZXJ5IGdlbmVyaWMKK3RyZWUgc3RydWN0dXJlIGZvciB5b3VyIHBhcnNlIHRyZWUgbm9kZXMuICBGb3IgZXhhbXBsZToKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorY2xhc3MgTm9kZToKKyAgICBkZWYgX19pbml0X18oc2VsZix0eXBlLGNoaWxkcmVuPU5vbmUsbGVhZj1Ob25lKToKKyAgICAgICAgIHNlbGYudHlwZSA9IHR5cGUKKyAgICAgICAgIGlmIGNoaWxkcmVuOgorICAgICAgICAgICAgICBzZWxmLmNoaWxkcmVuID0gY2hpbGRyZW4KKyAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4gPSBbIF0KKyAgICAgICAgIHNlbGYubGVhZiA9IGxlYWYKKwkgCitkZWYgcF9leHByZXNzaW9uX2Jpbm9wKHApOgorICAgICcnJ2V4cHJlc3Npb24gOiBleHByZXNzaW9uIFBMVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIE1JTlVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBUSU1FUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gRElWSURFIGV4cHJlc3Npb24nJycKKworICAgIHBbMF0gPSBOb2RlKCJiaW5vcCIsIFtwWzFdLHBbM11dLCBwWzJdKQorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKKzxIMz48YSBuYW1lPSJwbHlfbm4zNSI+PC9hPjYuMTEgRW1iZWRkZWQgQWN0aW9uczwvSDM+CisKKworVGhlIHBhcnNpbmcgdGVjaG5pcXVlIHVzZWQgYnkgeWFjYyBvbmx5IGFsbG93cyBhY3Rpb25zIHRvIGJlIGV4ZWN1dGVkIGF0IHRoZSBlbmQgb2YgYSBydWxlLiAgRm9yIGV4YW1wbGUsCitzdXBwb3NlIHlvdSBoYXZlIGEgcnVsZSBsaWtlIHRoaXM6CisKKzxibG9ja3F1b3RlPgorPHByZT4KK2RlZiBwX2ZvbyhwKToKKyAgICAiZm9vIDogQSBCIEMgRCIKKyAgICBwcmludCgiUGFyc2VkIGEgZm9vIiwgcFsxXSxwWzJdLHBbM10scFs0XSkKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCis8cD4KK0luIHRoaXMgY2FzZSwgdGhlIHN1cHBsaWVkIGFjdGlvbiBjb2RlIG9ubHkgZXhlY3V0ZXMgYWZ0ZXIgYWxsIG9mIHRoZQorc3ltYm9scyA8dHQ+QTwvdHQ+LCA8dHQ+QjwvdHQ+LCA8dHQ+QzwvdHQ+LCBhbmQgPHR0PkQ8L3R0PiBoYXZlIGJlZW4KK3BhcnNlZC4gU29tZXRpbWVzLCBob3dldmVyLCBpdCBpcyB1c2VmdWwgdG8gZXhlY3V0ZSBzbWFsbCBjb2RlCitmcmFnbWVudHMgZHVyaW5nIGludGVybWVkaWF0ZSBzdGFnZXMgb2YgcGFyc2luZy4gIEZvciBleGFtcGxlLCBzdXBwb3NlCit5b3Ugd2FudGVkIHRvIHBlcmZvcm0gc29tZSBhY3Rpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgPHR0PkE8L3R0PiBoYXMKK2JlZW4gcGFyc2VkLiBUbyBkbyB0aGlzLCB3cml0ZSBhbiBlbXB0eSBydWxlIGxpa2UgdGhpczoKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorZGVmIHBfZm9vKHApOgorICAgICJmb28gOiBBIHNlZW5fQSBCIEMgRCIKKyAgICBwcmludCgiUGFyc2VkIGEgZm9vIiwgcFsxXSxwWzNdLHBbNF0scFs1XSkKKyAgICBwcmludCgic2Vlbl9BIHJldHVybmVkIiwgcFsyXSkKKworZGVmIHBfc2Vlbl9BKHApOgorICAgICJzZWVuX0EgOiIKKyAgICBwcmludCgiU2F3IGFuIEEgPSAiLCBwWy0xXSkgICAjIEFjY2VzcyBncmFtbWFyIHN5bWJvbCB0byBsZWZ0CisgICAgcFswXSA9IHNvbWVfdmFsdWUgICAgICAgICAgICAjIEFzc2lnbiB2YWx1ZSB0byBzZWVuX0EKKworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKKzxwPgorSW4gdGhpcyBleGFtcGxlLCB0aGUgZW1wdHkgPHR0PnNlZW5fQTwvdHQ+IHJ1bGUgZXhlY3V0ZXMgaW1tZWRpYXRlbHkKK2FmdGVyIDx0dD5BPC90dD4gaXMgc2hpZnRlZCBvbnRvIHRoZSBwYXJzaW5nIHN0YWNrLiAgV2l0aGluIHRoaXMKK3J1bGUsIDx0dD5wWy0xXTwvdHQ+IHJlZmVycyB0byB0aGUgc3ltYm9sIG9uIHRoZSBzdGFjayB0aGF0IGFwcGVhcnMKK2ltbWVkaWF0ZWx5IHRvIHRoZSBsZWZ0IG9mIHRoZSA8dHQ+c2Vlbl9BPC90dD4gc3ltYm9sLiAgSW4gdGhpcyBjYXNlLAoraXQgd291bGQgYmUgdGhlIHZhbHVlIG9mIDx0dD5BPC90dD4gaW4gdGhlIDx0dD5mb288L3R0PiBydWxlCitpbW1lZGlhdGVseSBhYm92ZS4gIExpa2Ugb3RoZXIgcnVsZXMsIGEgdmFsdWUgY2FuIGJlIHJldHVybmVkIGZyb20gYW4KK2VtYmVkZGVkIGFjdGlvbiBieSBzaW1wbHkgYXNzaWduaW5nIGl0IHRvIDx0dD5wWzBdPC90dD4KKworPHA+CitUaGUgdXNlIG9mIGVtYmVkZGVkIGFjdGlvbnMgY2FuIHNvbWV0aW1lcyBpbnRyb2R1Y2UgZXh0cmEgc2hpZnQvcmVkdWNlIGNvbmZsaWN0cy4gIEZvciBleGFtcGxlLAordGhpcyBncmFtbWFyIGhhcyBubyBjb25mbGljdHM6CisKKzxibG9ja3F1b3RlPgorPHByZT4KK2RlZiBwX2ZvbyhwKToKKyAgICAiIiJmb28gOiBhYmNkCisgICAgICAgICAgIHwgYWJjeCIiIgorCitkZWYgcF9hYmNkKHApOgorICAgICJhYmNkIDogQSBCIEMgRCIKKworZGVmIHBfYWJjeChwKToKKyAgICAiYWJjeCA6IEEgQiBDIFgiCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworSG93ZXZlciwgaWYgeW91IGluc2VydCBhbiBlbWJlZGRlZCBhY3Rpb24gaW50byBvbmUgb2YgdGhlIHJ1bGVzIGxpa2UgdGhpcywKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorZGVmIHBfZm9vKHApOgorICAgICIiImZvbyA6IGFiY2QKKyAgICAgICAgICAgfCBhYmN4IiIiCisKK2RlZiBwX2FiY2QocCk6CisgICAgImFiY2QgOiBBIEIgQyBEIgorCitkZWYgcF9hYmN4KHApOgorICAgICJhYmN4IDogQSBCIHNlZW5fQUIgQyBYIgorCitkZWYgcF9zZWVuX0FCKHApOgorICAgICJzZWVuX0FCIDoiCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworYW4gZXh0cmEgc2hpZnQtcmVkdWNlIGNvbmZsaWN0IHdpbGwgYmUgaW50cm9kdWNlZC4gIFRoaXMgY29uZmxpY3QgaXMKK2NhdXNlZCBieSB0aGUgZmFjdCB0aGF0IHRoZSBzYW1lIHN5bWJvbCA8dHQ+QzwvdHQ+IGFwcGVhcnMgbmV4dCBpbgorYm90aCB0aGUgPHR0PmFiY2Q8L3R0PiBhbmQgPHR0PmFiY3g8L3R0PiBydWxlcy4gIFRoZSBwYXJzZXIgY2FuIGVpdGhlcgorc2hpZnQgdGhlIHN5bWJvbCAoPHR0PmFiY2Q8L3R0PiBydWxlKSBvciByZWR1Y2UgdGhlIGVtcHR5CitydWxlIDx0dD5zZWVuX0FCPC90dD4gKDx0dD5hYmN4PC90dD4gcnVsZSkuCisKKzxwPgorQSBjb21tb24gdXNlIG9mIGVtYmVkZGVkIHJ1bGVzIGlzIHRvIGNvbnRyb2wgb3RoZXIgYXNwZWN0cyBvZiBwYXJzaW5nCitzdWNoIGFzIHNjb3Bpbmcgb2YgbG9jYWwgdmFyaWFibGVzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3ZXJlIHBhcnNpbmcgQyBjb2RlLCB5b3UgbWlnaHQKK3dyaXRlIGNvZGUgbGlrZSB0aGlzOgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitkZWYgcF9zdGF0ZW1lbnRzX2Jsb2NrKHApOgorICAgICJzdGF0ZW1lbnRzOiBMQlJBQ0UgbmV3X3Njb3BlIHN0YXRlbWVudHMgUkJSQUNFIiIiCisgICAgIyBBY3Rpb24gY29kZQorICAgIC4uLgorICAgIHBvcF9zY29wZSgpICAgICAgICAjIFJldHVybiB0byBwcmV2aW91cyBzY29wZQorCitkZWYgcF9uZXdfc2NvcGUocCk6CisgICAgIm5ld19zY29wZSA6IgorICAgICMgQ3JlYXRlIGEgbmV3IHNjb3BlIGZvciBsb2NhbCB2YXJpYWJsZXMKKyAgICBzID0gbmV3X3Njb3BlKCkKKyAgICBwdXNoX3Njb3BlKHMpCisgICAgLi4uCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworSW4gdGhpcyBjYXNlLCB0aGUgZW1iZWRkZWQgYWN0aW9uIDx0dD5uZXdfc2NvcGU8L3R0PiBleGVjdXRlcworaW1tZWRpYXRlbHkgYWZ0ZXIgYSA8dHQ+TEJSQUNFPC90dD4gKDx0dD57PC90dD4pIHN5bWJvbCBpcyBwYXJzZWQuCitUaGlzIG1pZ2h0IGFkanVzdCBpbnRlcm5hbCBzeW1ib2wgdGFibGVzIGFuZCBvdGhlciBhc3BlY3RzIG9mIHRoZQorcGFyc2VyLiAgVXBvbiBjb21wbGV0aW9uIG9mIHRoZSBydWxlIDx0dD5zdGF0ZW1lbnRzX2Jsb2NrPC90dD4sIGNvZGUKK21pZ2h0IHVuZG8gdGhlIG9wZXJhdGlvbnMgcGVyZm9ybWVkIGluIHRoZSBlbWJlZGRlZCBhY3Rpb24KKyhlLmcuLCA8dHQ+cG9wX3Njb3BlKCk8L3R0PikuCisKKzxIMz48YSBuYW1lPSJwbHlfbm4zNiI+PC9hPjYuMTIgTWlzY2VsbGFuZW91cyBZYWNjIE5vdGVzPC9IMz4KKworCis8dWw+CisKKzxsaT5CeSBkZWZhdWx0LCA8dHQ+eWFjYy5weTwvdHQ+IHJlbGllcyBvbiA8dHQ+bGV4LnB5PC90dD4gZm9yIHRva2VuaXppbmcuICBIb3dldmVyLCBhbiBhbHRlcm5hdGl2ZSB0b2tlbml6ZXIKK2NhbiBiZSBzdXBwbGllZCBhcyBmb2xsb3dzOgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitwYXJzZXIgPSB5YWNjLnBhcnNlKGxleGVyPXgpCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KK2luIHRoaXMgY2FzZSwgPHR0Png8L3R0PiBtdXN0IGJlIGEgTGV4ZXIgb2JqZWN0IHRoYXQgbWluaW1hbGx5IGhhcyBhIDx0dD54LnRva2VuKCk8L3R0PiBtZXRob2QgZm9yIHJldHJpZXZpbmcgdGhlIG5leHQKK3Rva2VuLiAgIElmIGFuIGlucHV0IHN0cmluZyBpcyBnaXZlbiB0byA8dHQ+eWFjYy5wYXJzZSgpPC90dD4sIHRoZSBsZXhlciBtdXN0IGFsc28gaGF2ZSBhbiA8dHQ+eC5pbnB1dCgpPC90dD4gbWV0aG9kLgorCis8cD4KKzxsaT5CeSBkZWZhdWx0LCB0aGUgeWFjYyBnZW5lcmF0ZXMgdGFibGVzIGluIGRlYnVnZ2luZyBtb2RlICh3aGljaCBwcm9kdWNlcyB0aGUgcGFyc2VyLm91dCBmaWxlIGFuZCBvdGhlciBvdXRwdXQpLgorVG8gZGlzYWJsZSB0aGlzLCB1c2UKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorcGFyc2VyID0geWFjYy55YWNjKGRlYnVnPUZhbHNlKQorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGxpPlRvIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgPHR0PnBhcnNldGFiLnB5PC90dD4gZmlsZSwgIHVzZToKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorcGFyc2VyID0geWFjYy55YWNjKHRhYm1vZHVsZT0iZm9vIikKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCis8UD4KK05vcm1hbGx5LCB0aGUgPHR0PnBhcnNldGFiLnB5PC90dD4gZmlsZSBpcyBwbGFjZWQgaW50byB0aGUgc2FtZSBkaXJlY3RvcnkgYXMKK3RoZSBtb2R1bGUgd2hlcmUgdGhlIHBhcnNlciBpcyBkZWZpbmVkLiBJZiB5b3Ugd2FudCBpdCB0byBnbyBzb21ld2hlcmUgZWxzZSwgeW91IGNhbgorZ2l2ZW4gYW4gYWJzb2x1dGUgcGFja2FnZSBuYW1lIGZvciA8dHQ+dGFibW9kdWxlPC90dD4gaW5zdGVhZC4gIEluIHRoYXQgY2FzZSwgdGhlIAordGFibGVzIHdpbGwgYmUgd3JpdHRlbiB0aGVyZS4KKzwvcD4KKworPHA+Cis8bGk+VG8gY2hhbmdlIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIDx0dD5wYXJzZXRhYi5weTwvdHQ+IGZpbGUgKGFuZCBvdGhlciBvdXRwdXQgZmlsZXMpIGFyZSB3cml0dGVuLCB1c2U6Cis8YmxvY2txdW90ZT4KKzxwcmU+CitwYXJzZXIgPSB5YWNjLnlhY2ModGFibW9kdWxlPSJmb28iLG91dHB1dGRpcj0ic29tZWRpcmVjdG9yeSIpCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworPHA+CitOb3RlOiBCZSBhd2FyZSB0aGF0IHVubGVzcyB0aGUgZGlyZWN0b3J5IHNwZWNpZmllZCBpcyBhbHNvIG9uIFB5dGhvbidzIHBhdGggKDx0dD5zeXMucGF0aDwvdHQ+KSwgc3Vic2VxdWVudAoraW1wb3J0cyBvZiB0aGUgdGFibGUgZmlsZSB3aWxsIGZhaWwuICAgQXMgYSBnZW5lcmFsIHJ1bGUsIGl0J3MgYmV0dGVyIHRvIHNwZWNpZnkgYSBkZXN0aW5hdGlvbiB1c2luZyB0aGUKKzx0dD50YWJtb2R1bGU8L3R0PiBhcmd1bWVudCBpbnN0ZWFkIG9mIGRpcmVjdGx5IHNwZWNpZnlpbmcgYSBkaXJlY3RvcnkgdXNpbmcgdGhlIDx0dD5vdXRwdXRkaXI8L3R0PiBhcmd1bWVudC4KKzwvcD4KKworPHA+Cis8bGk+VG8gcHJldmVudCB5YWNjIGZyb20gZ2VuZXJhdGluZyBhbnkga2luZCBvZiBwYXJzZXIgdGFibGUgZmlsZSwgdXNlOgorPGJsb2NrcXVvdGU+Cis8cHJlPgorcGFyc2VyID0geWFjYy55YWNjKHdyaXRlX3RhYmxlcz1GYWxzZSkKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitOb3RlOiBJZiB5b3UgZGlzYWJsZSB0YWJsZSBnZW5lcmF0aW9uLCB5YWNjKCkgd2lsbCByZWdlbmVyYXRlIHRoZSBwYXJzaW5nIHRhYmxlcworZWFjaCB0aW1lIGl0IHJ1bnMgKHdoaWNoIG1heSB0YWtlIGF3aGlsZSBkZXBlbmRpbmcgb24gaG93IGxhcmdlIHlvdXIgZ3JhbW1hciBpcykuCisKKzxQPgorPGxpPlRvIHByaW50IGNvcGlvdXMgYW1vdW50cyBvZiBkZWJ1Z2dpbmcgZHVyaW5nIHBhcnNpbmcsIHVzZToKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorcGFyc2VyLnBhcnNlKGlucHV0X3RleHQsIGRlYnVnPVRydWUpICAgICAKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCis8cD4KKzxsaT5TaW5jZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgTEFMUiB0YWJsZXMgaXMgcmVsYXRpdmVseSBleHBlbnNpdmUsIHByZXZpb3VzbHkgZ2VuZXJhdGVkIHRhYmxlcyBhcmUKK2NhY2hlZCBhbmQgcmV1c2VkIGlmIHBvc3NpYmxlLiAgVGhlIGRlY2lzaW9uIHRvIHJlZ2VuZXJhdGUgdGhlIHRhYmxlcyBpcyBkZXRlcm1pbmVkIGJ5IHRha2luZyBhbiBNRDUKK2NoZWNrc3VtIG9mIGFsbCBncmFtbWFyIHJ1bGVzIGFuZCBwcmVjZWRlbmNlIHJ1bGVzLiAgT25seSBpbiB0aGUgZXZlbnQgb2YgYSBtaXNtYXRjaCBhcmUgdGhlIHRhYmxlcyByZWdlbmVyYXRlZC4KKworPHA+CitJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0YWJsZSBnZW5lcmF0aW9uIGlzIHJlYXNvbmFibHkgZWZmaWNpZW50LCBldmVuIGZvciBncmFtbWFycyB0aGF0IGludm9sdmUgYXJvdW5kIGEgMTAwIHJ1bGVzCithbmQgc2V2ZXJhbCBodW5kcmVkIHN0YXRlcy4gPC9saT4KKworCis8cD4KKzxsaT5TaW5jZSBMUiBwYXJzaW5nIGlzIGRyaXZlbiBieSB0YWJsZXMsIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgcGFyc2VyIGlzIGxhcmdlbHkgaW5kZXBlbmRlbnQgb2YgdGhlCitzaXplIG9mIHRoZSBncmFtbWFyLiAgIFRoZSBiaWdnZXN0IGJvdHRsZW5lY2tzIHdpbGwgYmUgdGhlIGxleGVyIGFuZCB0aGUgY29tcGxleGl0eSBvZiB0aGUgY29kZSBpbiB5b3VyIGdyYW1tYXIgcnVsZXMuCis8L2xpPgorPC9wPgorCis8cD4KKzxsaT48dHQ+eWFjYygpPC90dD4gYWxzbyBhbGxvd3MgcGFyc2VycyB0byBiZSBkZWZpbmVkIGFzIGNsYXNzZXMgYW5kIGFzIGNsb3N1cmVzIChzZWUgdGhlIHNlY3Rpb24gb24gYWx0ZXJuYXRpdmUgc3BlY2lmaWNhdGlvbiBvZgorbGV4ZXJzKS4gIEhvd2V2ZXIsIGJlIGF3YXJlIHRoYXQgb25seSBvbmUgcGFyc2VyIG1heSBiZSBkZWZpbmVkIGluIGEgc2luZ2xlIG1vZHVsZSAoc291cmNlIGZpbGUpLiAgVGhlcmUgYXJlIHZhcmlvdXMgCitlcnJvciBjaGVja3MgYW5kIHZhbGlkYXRpb24gc3RlcHMgdGhhdCBtYXkgaXNzdWUgY29uZnVzaW5nIGVycm9yIG1lc3NhZ2VzIGlmIHlvdSB0cnkgdG8gZGVmaW5lIG11bHRpcGxlIHBhcnNlcnMKK2luIHRoZSBzYW1lIHNvdXJjZSBmaWxlLgorPC9saT4KKzwvcD4KKworPHA+Cis8bGk+RGVjb3JhdG9ycyBvZiBwcm9kdWN0aW9uIHJ1bGVzIGhhdmUgdG8gdXBkYXRlIHRoZSB3cmFwcGVkIGZ1bmN0aW9uJ3MgbGluZSBudW1iZXIuICA8dHQ+d3JhcHBlci5jb19maXJzdGxpbmVubyA9IGZ1bmMuX19jb2RlX18uY29fZmlyc3RsaW5lbm88L3R0PjoKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHdyYXBzCitmcm9tIG5vZGVzIGltcG9ydCBDb2xsZWN0aW9uCisKKworZGVmIHN0cmljdCgqdHlwZXMpOgorICAgIGRlZiBkZWNvcmF0ZShmdW5jKToKKyAgICAgICAgQHdyYXBzKGZ1bmMpCisgICAgICAgIGRlZiB3cmFwcGVyKHApOgorICAgICAgICAgICAgZnVuYyhwKQorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocFswXSwgdHlwZXMpOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcgorCisgICAgICAgIHdyYXBwZXIuY29fZmlyc3RsaW5lbm8gPSBmdW5jLl9fY29kZV9fLmNvX2ZpcnN0bGluZW5vCisgICAgICAgIHJldHVybiB3cmFwcGVyCisKKyAgICByZXR1cm4gZGVjb3JhdGUKKworQHN0cmljdChDb2xsZWN0aW9uKQorZGVmIHBfY29sbGVjdGlvbihwKToKKyAgICAiIiIKKyAgICBjb2xsZWN0aW9uICA6IHNlcXVlbmNlCisgICAgICAgICAgICAgICAgfCBtYXAKKyAgICAiIiIKKyAgICBwWzBdID0gcFsxXQorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKKzwvbGk+Cis8L3A+CisKKworPC91bD4KKzwvcD4KKworCis8SDI+PGEgbmFtZT0icGx5X25uMzciPjwvYT43LiBNdWx0aXBsZSBQYXJzZXJzIGFuZCBMZXhlcnM8L0gyPgorCisKK0luIGFkdmFuY2VkIHBhcnNpbmcgYXBwbGljYXRpb25zLCB5b3UgbWF5IHdhbnQgdG8gaGF2ZSBtdWx0aXBsZQorcGFyc2VycyBhbmQgbGV4ZXJzLiAKKworPHA+CitBcyBhIGdlbmVyYWwgcnVsZXMgdGhpcyBpc24ndCBhIHByb2JsZW0uICAgSG93ZXZlciwgdG8gbWFrZSBpdCB3b3JrLAoreW91IG5lZWQgdG8gY2FyZWZ1bGx5IG1ha2Ugc3VyZSBldmVyeXRoaW5nIGdldHMgaG9va2VkIHVwIGNvcnJlY3RseS4KK0ZpcnN0LCBtYWtlIHN1cmUgeW91IHNhdmUgdGhlIG9iamVjdHMgcmV0dXJuZWQgYnkgPHR0PmxleCgpPC90dD4gYW5kCis8dHQ+eWFjYygpPC90dD4uICBGb3IgZXhhbXBsZToKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorbGV4ZXIgID0gbGV4LmxleCgpICAgICAgICMgUmV0dXJuIGxleGVyIG9iamVjdAorcGFyc2VyID0geWFjYy55YWNjKCkgICAgICMgUmV0dXJuIHBhcnNlciBvYmplY3QKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitOZXh0LCB3aGVuIHBhcnNpbmcsIG1ha2Ugc3VyZSB5b3UgZ2l2ZSB0aGUgPHR0PnBhcnNlKCk8L3R0PiBmdW5jdGlvbiBhIHJlZmVyZW5jZSB0byB0aGUgbGV4ZXIgaXQKK3Nob3VsZCBiZSB1c2luZy4gIEZvciBleGFtcGxlOgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitwYXJzZXIucGFyc2UodGV4dCxsZXhlcj1sZXhlcikKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitJZiB5b3UgZm9yZ2V0IHRvIGRvIHRoaXMsIHRoZSBwYXJzZXIgd2lsbCB1c2UgdGhlIGxhc3QgbGV4ZXIKK2NyZWF0ZWQtLXdoaWNoIGlzIG5vdCBhbHdheXMgd2hhdCB5b3Ugd2FudC4KKworPHA+CitXaXRoaW4gbGV4ZXIgYW5kIHBhcnNlciBydWxlIGZ1bmN0aW9ucywgdGhlc2Ugb2JqZWN0cyBhcmUgYWxzbworYXZhaWxhYmxlLiAgSW4gdGhlIGxleGVyLCB0aGUgImxleGVyIiBhdHRyaWJ1dGUgb2YgYSB0b2tlbiByZWZlcnMgdG8KK3RoZSBsZXhlciBvYmplY3QgdGhhdCB0cmlnZ2VyZWQgdGhlIHJ1bGUuIEZvciBleGFtcGxlOgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitkZWYgdF9OVU1CRVIodCk6CisgICByJ1xkKycKKyAgIC4uLgorICAgcHJpbnQodC5sZXhlcikgICAgICAgICAgICMgU2hvdyBsZXhlciBvYmplY3QKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitJbiB0aGUgcGFyc2VyLCB0aGUgImxleGVyIiBhbmQgInBhcnNlciIgYXR0cmlidXRlcyByZWZlciB0byB0aGUgbGV4ZXIKK2FuZCBwYXJzZXIgb2JqZWN0cyByZXNwZWN0aXZlbHkuCisKKzxibG9ja3F1b3RlPgorPHByZT4KK2RlZiBwX2V4cHJfcGx1cyhwKToKKyAgICdleHByIDogZXhwciBQTFVTIGV4cHInCisgICAuLi4KKyAgIHByaW50KHAucGFyc2VyKSAgICAgICAgICAjIFNob3cgcGFyc2VyIG9iamVjdAorICAgcHJpbnQocC5sZXhlcikgICAgICAgICAgICMgU2hvdyBsZXhlciBvYmplY3QKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitJZiBuZWNlc3NhcnksIGFyYml0cmFyeSBhdHRyaWJ1dGVzIGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgbGV4ZXIgb3IgcGFyc2VyIG9iamVjdC4KK0ZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvIGhhdmUgZGlmZmVyZW50IHBhcnNpbmcgbW9kZXMsIHlvdSBjb3VsZCBhdHRhY2ggYSBtb2RlCithdHRyaWJ1dGUgdG8gdGhlIHBhcnNlciBvYmplY3QgYW5kIGxvb2sgYXQgaXQgbGF0ZXIuCisKKzxIMj48YSBuYW1lPSJwbHlfbm4zOCI+PC9hPjguIFVzaW5nIFB5dGhvbidzIE9wdGltaXplZCBNb2RlPC9IMj4KKworCitCZWNhdXNlIFBMWSB1c2VzIGluZm9ybWF0aW9uIGZyb20gZG9jLXN0cmluZ3MsIHBhcnNpbmcgYW5kIGxleGluZworaW5mb3JtYXRpb24gbXVzdCBiZSBnYXRoZXJlZCB3aGlsZSBydW5uaW5nIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgaW4KK25vcm1hbCBtb2RlIChpLmUuLCBub3Qgd2l0aCB0aGUgLU8gb3IgLU9PIG9wdGlvbnMpLiAgSG93ZXZlciwgaWYgeW91CitzcGVjaWZ5IG9wdGltaXplZCBtb2RlIGxpa2UgdGhpczoKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorbGV4LmxleChvcHRpbWl6ZT0xKQoreWFjYy55YWNjKG9wdGltaXplPTEpCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKwordGhlbiBQTFkgY2FuIGxhdGVyIGJlIHVzZWQgd2hlbiBQeXRob24gcnVucyBpbiBvcHRpbWl6ZWQgbW9kZS4gVG8gbWFrZSB0aGlzIHdvcmssCittYWtlIHN1cmUgeW91IGZpcnN0IHJ1biBQeXRob24gaW4gbm9ybWFsIG1vZGUuICBPbmNlIHRoZSBsZXhpbmcgYW5kIHBhcnNpbmcgdGFibGVzCitoYXZlIGJlZW4gZ2VuZXJhdGVkIHRoZSBmaXJzdCB0aW1lLCBydW4gUHl0aG9uIGluIG9wdGltaXplZCBtb2RlLiBQTFkgd2lsbCB1c2UKK3RoZSB0YWJsZXMgd2l0aG91dCB0aGUgbmVlZCBmb3IgZG9jIHN0cmluZ3MuCisKKzxwPgorQmV3YXJlOiBydW5uaW5nIFBMWSBpbiBvcHRpbWl6ZWQgbW9kZSBkaXNhYmxlcyBhIGxvdCBvZiBlcnJvcgorY2hlY2tpbmcuICBZb3Ugc2hvdWxkIG9ubHkgZG8gdGhpcyB3aGVuIHlvdXIgcHJvamVjdCBoYXMgc3RhYmlsaXplZAorYW5kIHlvdSBkb24ndCBuZWVkIHRvIGRvIGFueSBkZWJ1Z2dpbmcuICAgT25lIG9mIHRoZSBwdXJwb3NlcyBvZgorb3B0aW1pemVkIG1vZGUgaXMgdG8gc3Vic3RhbnRpYWxseSBkZWNyZWFzZSB0aGUgc3RhcnR1cCB0aW1lIG9mCit5b3VyIGNvbXBpbGVyIChieSBhc3N1bWluZyB0aGF0IGV2ZXJ5dGhpbmcgaXMgYWxyZWFkeSBwcm9wZXJseQorc3BlY2lmaWVkIGFuZCB3b3JrcykuCisKKzxIMj48YSBuYW1lPSJwbHlfbm40NCI+PC9hPjkuIEFkdmFuY2VkIERlYnVnZ2luZzwvSDI+CisKKworPHA+CitEZWJ1Z2dpbmcgYSBjb21waWxlciBpcyB0eXBpY2FsbHkgbm90IGFuIGVhc3kgdGFzay4gUExZIHByb3ZpZGVzIHNvbWUKK2FkdmFuY2VkIGRpYWdvc3RpYyBjYXBhYmlsaXRpZXMgdGhyb3VnaCB0aGUgdXNlIG9mIFB5dGhvbidzCis8dHQ+bG9nZ2luZzwvdHQ+IG1vZHVsZS4gICBUaGUgbmV4dCB0d28gc2VjdGlvbnMgZGVzY3JpYmUgdGhpczoKKworPEgzPjxhIG5hbWU9InBseV9ubjQ1Ij48L2E+OS4xIERlYnVnZ2luZyB0aGUgbGV4KCkgYW5kIHlhY2MoKSBjb21tYW5kczwvSDM+CisKKworPHA+CitCb3RoIHRoZSA8dHQ+bGV4KCk8L3R0PiBhbmQgPHR0PnlhY2MoKTwvdHQ+IGNvbW1hbmRzIGhhdmUgYSBkZWJ1Z2dpbmcKK21vZGUgdGhhdCBjYW4gYmUgZW5hYmxlZCB1c2luZyB0aGUgPHR0PmRlYnVnPC90dD4gZmxhZy4gIEZvciBleGFtcGxlOgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitsZXgubGV4KGRlYnVnPVRydWUpCit5YWNjLnlhY2MoZGVidWc9VHJ1ZSkKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitOb3JtYWxseSwgdGhlIG91dHB1dCBwcm9kdWNlZCBieSBkZWJ1Z2dpbmcgaXMgcm91dGVkIHRvIGVpdGhlcgorc3RhbmRhcmQgZXJyb3Igb3IsIGluIHRoZSBjYXNlIG9mIDx0dD55YWNjKCk8L3R0PiwgdG8gYSBmaWxlCis8dHQ+cGFyc2VyLm91dDwvdHQ+LiAgVGhpcyBvdXRwdXQgY2FuIGJlIG1vcmUgY2FyZWZ1bGx5IGNvbnRyb2xsZWQKK2J5IHN1cHBseWluZyBhIGxvZ2dpbmcgb2JqZWN0LiAgSGVyZSBpcyBhbiBleGFtcGxlIHRoYXQgYWRkcworaW5mb3JtYXRpb24gYWJvdXQgd2hlcmUgZGlmZmVyZW50IGRlYnVnZ2luZyBtZXNzYWdlcyBhcmUgY29taW5nIGZyb206CisKKzxibG9ja3F1b3RlPgorPHByZT4KKyMgU2V0IHVwIGEgbG9nZ2luZyBvYmplY3QKK2ltcG9ydCBsb2dnaW5nCitsb2dnaW5nLmJhc2ljQ29uZmlnKAorICAgIGxldmVsID0gbG9nZ2luZy5ERUJVRywKKyAgICBmaWxlbmFtZSA9ICJwYXJzZWxvZy50eHQiLAorICAgIGZpbGVtb2RlID0gInciLAorICAgIGZvcm1hdCA9ICIlKGZpbGVuYW1lKTEwczolKGxpbmVubyk0ZDolKG1lc3NhZ2UpcyIKKykKK2xvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCkKKworbGV4LmxleChkZWJ1Zz1UcnVlLGRlYnVnbG9nPWxvZykKK3lhY2MueWFjYyhkZWJ1Zz1UcnVlLGRlYnVnbG9nPWxvZykKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitJZiB5b3Ugc3VwcGx5IGEgY3VzdG9tIGxvZ2dlciwgdGhlIGFtb3VudCBvZiBkZWJ1Z2dpbmcKK2luZm9ybWF0aW9uIHByb2R1Y2VkIGNhbiBiZSBjb250cm9sbGVkIGJ5IHNldHRpbmcgdGhlIGxvZ2dpbmcgbGV2ZWwuCitUeXBpY2FsbHksIGRlYnVnZ2luZyBtZXNzYWdlcyBhcmUgZWl0aGVyIGlzc3VlZCBhdCB0aGUgPHR0PkRFQlVHPC90dD4sCis8dHQ+SU5GTzwvdHQ+LCBvciA8dHQ+V0FSTklORzwvdHQ+IGxldmVscy4KKworPHA+CitQTFkncyBlcnJvciBtZXNzYWdlcyBhbmQgd2FybmluZ3MgYXJlIGFsc28gcHJvZHVjZWQgdXNpbmcgdGhlIGxvZ2dpbmcKK2ludGVyZmFjZS4gIFRoaXMgY2FuIGJlIGNvbnRyb2xsZWQgYnkgcGFzc2luZyBhIGxvZ2dpbmcgb2JqZWN0Cit1c2luZyB0aGUgPHR0PmVycm9ybG9nPC90dD4gcGFyYW1ldGVyLgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitsZXgubGV4KGVycm9ybG9nPWxvZykKK3lhY2MueWFjYyhlcnJvcmxvZz1sb2cpCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworSWYgeW91IHdhbnQgdG8gY29tcGxldGVseSBzaWxlbmNlIHdhcm5pbmdzLCB5b3UgY2FuIGVpdGhlciBwYXNzIGluIGEKK2xvZ2dpbmcgb2JqZWN0IHdpdGggYW4gYXBwcm9wcmlhdGUgZmlsdGVyIGxldmVsIG9yIHVzZSB0aGUgPHR0Pk51bGxMb2dnZXI8L3R0Pgorb2JqZWN0IGRlZmluZWQgaW4gZWl0aGVyIDx0dD5sZXg8L3R0PiBvciA8dHQ+eWFjYzwvdHQ+LiAgRm9yIGV4YW1wbGU6CisKKzxibG9ja3F1b3RlPgorPHByZT4KK3lhY2MueWFjYyhlcnJvcmxvZz15YWNjLk51bGxMb2dnZXIoKSkKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCis8SDM+PGEgbmFtZT0icGx5X25uNDYiPjwvYT45LjIgUnVuLXRpbWUgRGVidWdnaW5nPC9IMz4KKworCis8cD4KK1RvIGVuYWJsZSBydW4tdGltZSBkZWJ1Z2dpbmcgb2YgYSBwYXJzZXIsIHVzZSB0aGUgPHR0PmRlYnVnPC90dD4gb3B0aW9uIHRvIHBhcnNlLiBUaGlzCitvcHRpb24gY2FuIGVpdGhlciBiZSBhbiBpbnRlZ2VyICh3aGljaCBzaW1wbHkgdHVybnMgZGVidWdnaW5nIG9uIG9yIG9mZikgb3IgYW4gaW5zdGFuY2UKK29mIGEgbG9nZ2VyIG9iamVjdC4gRm9yIGV4YW1wbGU6CisKKzxibG9ja3F1b3RlPgorPHByZT4KK2xvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCkKK3BhcnNlci5wYXJzZShpbnB1dCxkZWJ1Zz1sb2cpCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworSWYgYSBsb2dnaW5nIG9iamVjdCBpcyBwYXNzZWQsIHlvdSBjYW4gdXNlIGl0cyBmaWx0ZXJpbmcgbGV2ZWwgdG8gY29udHJvbCBob3cgbXVjaAorb3V0cHV0IGdldHMgZ2VuZXJhdGVkLiAgIFRoZSA8dHQ+SU5GTzwvdHQ+IGxldmVsIGlzIHVzZWQgdG8gcHJvZHVjZSBpbmZvcm1hdGlvbgorYWJvdXQgcnVsZSByZWR1Y3Rpb25zLiAgVGhlIDx0dD5ERUJVRzwvdHQ+IGxldmVsIHdpbGwgc2hvdyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKK3BhcnNpbmcgc3RhY2ssIHRva2VuIHNoaWZ0cywgYW5kIG90aGVyIGRldGFpbHMuICBUaGUgPHR0PkVSUk9SPC90dD4gbGV2ZWwgc2hvd3MgaW5mb3JtYXRpb24KK3JlbGF0ZWQgdG8gcGFyc2luZyBlcnJvcnMuCisKKzxwPgorRm9yIHZlcnkgY29tcGxpY2F0ZWQgcHJvYmxlbXMsIHlvdSBzaG91bGQgcGFzcyBpbiBhIGxvZ2dpbmcgb2JqZWN0IHRoYXQKK3JlZGlyZWN0cyB0byBhIGZpbGUgd2hlcmUgeW91IGNhbiBtb3JlIGVhc2lseSBpbnNwZWN0IHRoZSBvdXRwdXQgYWZ0ZXIKK2V4ZWN1dGlvbi4KKworPEgyPjxhIG5hbWU9InBseV9ubjQ5Ij48L2E+MTAuIFBhY2thZ2luZyBBZHZpY2U8L0gyPgorCisKKzxwPgorSWYgeW91IGFyZSBkaXN0cmlidXRpbmcgYSBwYWNrYWdlIHRoYXQgbWFrZXMgdXNlIG9mIFBMWSwgeW91IHNob3VsZAorc3BlbmQgYSBmZXcgbW9tZW50cyB0aGlua2luZyBhYm91dCBob3cgeW91IHdhbnQgdG8gaGFuZGxlIHRoZSBmaWxlcwordGhhdCBhcmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuICBGb3IgZXhhbXBsZSwgdGhlIDx0dD5wYXJzZXRhYi5weTwvdHQ+CitmaWxlIGdlbmVyYXRlZCBieSB0aGUgPHR0PnlhY2MoKTwvdHQ+IGZ1bmN0aW9uLjwvcD4KKworPHA+CitTdGFydGluZyBpbiBQTFktMy42LCB0aGUgdGFibGUgZmlsZXMgYXJlIGNyZWF0ZWQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5CithcyB0aGUgZmlsZSB3aGVyZSBhIHBhcnNlciBpcyBkZWZpbmVkLiAgIFRoaXMgbWVhbnMgdGhhdCB0aGUKKzx0dD5wYXJzZXRhYi5weTwvdHQ+IGZpbGUgd2lsbCBsaXZlIHNpZGUtYnktc2lkZSB3aXRoIHlvdXIgcGFyc2VyCitzcGVjaWZpY2F0aW9uLiAgSW4gdGVybXMgb2YgcGFja2FnaW5nLCB0aGlzIGlzIHByb2JhYmx5IHRoZSBlYXNpZXN0IGFuZAorbW9zdCBzYW5lIGFwcHJvYWNoIHRvIG1hbmFnZS4gIFlvdSBkb24ndCBuZWVkIHRvIGdpdmUgPHR0PnlhY2MoKTwvdHQ+CithbnkgZXh0cmEgYXJndW1lbnRzIGFuZCBpdCBzaG91bGQganVzdCAid29yay4iPC9wPgorCis8cD4KK09uZSBjb25jZXJuIGlzIHRoZSBtYW5hZ2VtZW50IG9mIHRoZSA8dHQ+cGFyc2V0YWIucHk8L3R0PiBmaWxlIGl0c2VsZi4KK0ZvciBleGFtcGxlLCBzaG91bGQgeW91IGhhdmUgdGhpcyBmaWxlIGNoZWNrZWQgaW50byB2ZXJzaW9uIGNvbnRyb2wgKGUuZy4sIEdpdEh1YiksCitzaG91bGQgaXQgYmUgaW5jbHVkZWQgaW4gYSBwYWNrYWdlIGRpc3RyaWJ1dGlvbiBhcyBhIG5vcm1hbCBmaWxlLCBvciBzaG91bGQgeW91CitqdXN0IGxldCBQTFkgZ2VuZXJhdGUgaXQgYXV0b21hdGljYWxseSBmb3IgdGhlIHVzZXIgd2hlbiB0aGV5IGluc3RhbGwgeW91ciBwYWNrYWdlPworPC9wPgorCis8cD4KK0FzIG9mIFBMWS0zLjYsIHRoZSA8dHQ+cGFyc2V0YWIucHk8L3R0PiBmaWxlIHNob3VsZCBiZSBjb21wYXRpYmxlIGFjcm9zcyBhbGwgdmVyc2lvbnMKK29mIFB5dGhvbiBpbmNsdWRpbmcgUHl0aG9uIDIgYW5kIDMuICBUaHVzLCBhIHRhYmxlIGZpbGUgZ2VuZXJhdGVkIGluIFB5dGhvbiAyIHNob3VsZAord29yayBmaW5lIGlmIGl0J3MgdXNlZCBvbiBQeXRob24gMy4gIEJlY2F1c2Ugb2YgdGhpcywgaXQgc2hvdWxkIGJlIHJlbGF0aXZlbHkgaGFybWxlc3MgCit0byBkaXN0cmlidXRlIHRoZSA8dHQ+cGFyc2V0YWIucHk8L3R0PiBmaWxlIHlvdXJzZWxmIGlmIHlvdSBuZWVkIHRvLiBIb3dldmVyLCBiZSBhd2FyZQordGhhdCBvbGRlci9uZXdlciB2ZXJzaW9ucyBvZiBQTFkgbWF5IHRyeSB0byByZWdlbmVyYXRlIHRoZSBmaWxlIGlmIHRoZXJlIGFyZSBmdXR1cmUgCitlbmhhbmNlbWVudHMgb3IgY2hhbmdlcyB0byBpdHMgZm9ybWF0LgorPC9wPgorCis8cD4KK1RvIG1ha2UgdGhlIGdlbmVyYXRpb24gb2YgdGFibGUgZmlsZXMgZWFzaWVyIGZvciB0aGUgcHVycG9zZXMgb2YgaW5zdGFsbGF0aW9uLCB5b3UgbWlnaHQKK3dheSB0byBtYWtlIHlvdXIgcGFyc2VyIGZpbGVzIGV4ZWN1dGFibGUgdXNpbmcgdGhlIDx0dD4tbTwvdHQ+IG9wdGlvbiBvciBzaW1pbGFyLiAgRm9yCitleGFtcGxlOgorPC9wPgorCis8YmxvY2txdW90ZT4KKzxwcmU+CisjIGNhbGMucHkKKy4uLgorLi4uCitkZWYgbWFrZV9wYXJzZXIoKToKKyAgICBwYXJzZXIgPSB5YWNjLnlhY2MoKQorICAgIHJldHVybiBwYXJzZXIKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBtYWtlX3BhcnNlcigpCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworPHA+CitZb3UgY2FuIHRoZW4gdXNlIGEgY29tbWFuZCBzdWNoIGFzIDx0dD5weXRob24gLW0gY2FsYy5weTwvdHQ+IHRvIGdlbmVyYXRlIHRoZSB0YWJsZXMuIEFsdGVybmF0aXZlbHksCithIDx0dD5zZXR1cC5weTwvdHQ+IHNjcmlwdCwgY2FuIGltcG9ydCB0aGUgbW9kdWxlIGFuZCB1c2UgPHR0Pm1ha2VfcGFyc2VyKCk8L3R0PiB0byBjcmVhdGUgdGhlCitwYXJzaW5nIHRhYmxlcy4KKzwvcD4KKworPHA+CitJZiB5b3UncmUgd2lsbGluZyB0byBzYWNyaWZpY2UgYSBsaXR0bGUgc3RhcnR1cCB0aW1lLCB5b3UgY2FuIGFsc28gaW5zdHJ1Y3QgUExZIHRvIG5ldmVyIHdyaXRlIHRoZQordGFibGVzIHVzaW5nIDx0dD55YWNjLnlhY2Mod3JpdGVfdGFibGVzPUZhbHNlLCBkZWJ1Zz1GYWxzZSk8L3R0Pi4gICBJbiB0aGlzIG1vZGUsIFBMWSB3aWxsIHJlZ2VuZXJhdGUKK3RoZSBwYXJzaW5nIHRhYmxlcyBmcm9tIHNjcmF0Y2ggZWFjaCB0aW1lLiAgRm9yIGEgc21hbGwgZ3JhbW1hciwgeW91IHByb2JhYmx5IHdvbid0IG5vdGljZS4gIEZvciBhIAorbGFyZ2UgZ3JhbW1hciwgeW91IHNob3VsZCBwcm9iYWJseSByZWNvbnNpZGVyLS10aGUgcGFyc2luZyB0YWJsZXMgYXJlIG1lYW50IHRvIGRyYW1hdGljYWxseSBzcGVlZCB1cCB0aGlzIHByb2Nlc3MuCis8L3A+CisKKzxwPgorRHVyaW5nIG9wZXJhdGlvbiwgaXMgaXMgbm9ybWFsIGZvciBQTFkgdG8gcHJvZHVjZSBkaWFnbm9zdGljIGVycm9yCittZXNzYWdlcyAodXN1YWxseSBwcmludGVkIHRvIHN0YW5kYXJkIGVycm9yKS4gIFRoZXNlIGFyZSBnZW5lcmF0ZWQKK2VudGlyZWx5IHVzaW5nIHRoZSA8dHQ+bG9nZ2luZzwvdHQ+IG1vZHVsZS4gIElmIHlvdSB3YW50IHRvIHJlZGlyZWN0Cit0aGVzZSBtZXNzYWdlcyBvciBzaWxlbmNlIHRoZW0sIHlvdSBjYW4gcHJvdmlkZSB5b3VyIG93biBsb2dnaW5nCitvYmplY3QgdG8gPHR0PnlhY2MoKTwvdHQ+LiAgRm9yIGV4YW1wbGU6Cis8L3A+CisKKzxibG9ja3F1b3RlPgorPHByZT4KK2ltcG9ydCBsb2dnaW5nCitsb2cgPSBsb2dnaW5nLmdldExvZ2dlcigncGx5JykKKy4uLgorcGFyc2VyID0geWFjYy55YWNjKGVycm9ybG9nPWxvZykKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCis8SDI+PGEgbmFtZT0icGx5X25uMzkiPjwvYT4xMS4gV2hlcmUgdG8gZ28gZnJvbSBoZXJlPzwvSDI+CisKKworVGhlIDx0dD5leGFtcGxlczwvdHQ+IGRpcmVjdG9yeSBvZiB0aGUgUExZIGRpc3RyaWJ1dGlvbiBjb250YWlucyBzZXZlcmFsIHNpbXBsZSBleGFtcGxlcy4gICBQbGVhc2UgY29uc3VsdCBhCitjb21waWxlcnMgdGV4dGJvb2sgZm9yIHRoZSB0aGVvcnkgYW5kIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvciBMUiBwYXJzaW5nLgorCis8L2JvZHk+Cis8L2h0bWw+CisKKworCisKKworCisKZGlmZiAtLWdpdCBhL3BseS9leGFtcGxlL0JBU0lDL1JFQURNRSBiL3BseS9leGFtcGxlL0JBU0lDL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTI0YTMwCi0tLSAvZGV2L251bGwKKysrIGIvcGx5L2V4YW1wbGUvQkFTSUMvUkVBRE1FCkBAIC0wLDAgKzEsNzkgQEAKK0luc3BpcmVkIGJ5IGEgU2VwdGVtYmVyIDE0LCAyMDA2IFNhbG9uIGFydGljbGUgIldoeSBKb2hubnkgQ2FuJ3QgQ29kZSIgYnkKK0RhdmlkIEJyaW4gKGh0dHA6Ly93d3cuc2Fsb24uY29tL3RlY2gvZmVhdHVyZS8yMDA2LzA5LzE0L2Jhc2ljL2luZGV4Lmh0bWwpLAorSSB0aG91Z2h0IHRoYXQgYSBmdWxseSB3b3JraW5nIEJBU0lDIGludGVycHJldGVyIG1pZ2h0IGJlIGFuIGludGVyZXN0aW5nLAoraWYgbm90IHF1ZXN0aW9uYWJsZSwgUExZIGV4YW1wbGUuICBVaCwgb2theSwgc28gbWF5YmUgaXQncyBqdXN0IGEgYmFkIGlkZWEsCitidXQgaW4gYW55IGNhc2UsIGhlcmUgaXQgaXMuCisKK0luIHRoaXMgZXhhbXBsZSwgeW91J2xsIGZpbmQgYSByb3VnaCBpbXBsZW1lbnRhdGlvbiBvZiAxOTY0IERhcnRtb3V0aCBCQVNJQworYXMgZGVzY3JpYmVkIGluIHRoZSBtYW51YWwgYXQ6CisKKyAgIGh0dHA6Ly93d3cuYml0c2F2ZXJzLm9yZy9wZGYvZGFydG1vdXRoL0JBU0lDX09jdDY0LnBkZgorCitTZWUgYWxzbzoKKworICBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0RhcnRtb3V0aF9CQVNJQworCitUaGlzIGRpYWxlY3QgaXMgZG93bnJpZ2h0IHByaW1pdGl2ZS0tLXRoZXJlIGFyZSBubyBzdHJpbmcgdmFyaWFibGVzCithbmQgbm8gZmFjaWxpdGllcyBmb3IgaW50ZXJhY3RpdmUgaW5wdXQuIE1vcmVvdmVyLCBzdWJyb3V0aW5lcyBhbmQgZnVuY3Rpb25zCithcmUgYnJhaW4tZGVhZCBldmVuIG1vcmUgdGhhbiB0aGV5IHVzdWFsbHkgYXJlIGZvciBCQVNJQy4gT2YgY291cnNlLAordGhlIEdPVE8gc3RhdGVtZW50IGlzIHByb3ZpZGVkLgorCitOZXZlcnRoZWxlc3MsIHRoZXJlIGFyZSBhIGZldyBpbnRlcmVzdGluZyBhc3BlY3RzIG9mIHRoaXMgZXhhbXBsZToKKworICAtIEl0IGlsbHVzdHJhdGVzIGEgZnVsbHkgd29ya2luZyBpbnRlcnByZXRlciBpbmNsdWRpbmcgbGV4aW5nLCBwYXJzaW5nLAorICAgIGFuZCBpbnRlcnByZXRhdGlvbiBvZiBpbnN0cnVjdGlvbnMuCisgCisgIC0gVGhlIHBhcnNlciBzaG93cyBob3cgdG8gY2F0Y2ggYW5kIHJlcG9ydCB2YXJpb3VzIGtpbmRzIG9mIHBhcnNpbmcKKyAgICBlcnJvcnMgaW4gYSBtb3JlIGdyYWNlZnVsIHdheS4KKworICAtIFRoZSBleGFtcGxlIGJvdGggcGFyc2VzIGZpbGVzIChzdXBwbGllZCBvbiBjb21tYW5kIGxpbmUpIGFuZAorICAgIGludGVyYWN0aXZlIGlucHV0IGVudGVyZWQgbGluZSBieSBsaW5lLgorCisgIC0gSXQgc2hvd3MgaG93IHlvdSBtaWdodCByZXByZXNlbnQgcGFyc2VkIGluZm9ybWF0aW9uLiAgSW4gdGhpcyBjYXNlLAorICAgIGVhY2ggQkFTSUMgc3RhdGVtZW50IGlzIGVuY29kZWQgaW50byBhIFB5dGhvbiB0dXBsZSBjb250YWluaW5nIHRoZQorICAgIHN0YXRlbWVudCB0eXBlIGFuZCBwYXJhbWV0ZXJzLiAgVGhlc2UgdHVwbGVzIGFyZSB0aGVuIHN0b3JlZCBpbgorICAgIGEgZGljdGlvbmFyeSBpbmRleGVkIGJ5IHByb2dyYW0gbGluZSBudW1iZXJzLgorCisgIC0gRXZlbiB0aG91Z2ggaXQncyBqdXN0IEJBU0lDLCB0aGUgcGFyc2VyIGNvbnRhaW5zIG1vcmUgdGhhbiA4MAorICAgIHJ1bGVzIGFuZCAxNTAgcGFyc2luZyBzdGF0ZXMuIFRodXMsIGl0J3MgYSBsaXR0bGUgbW9yZSBtZWF0eSB0aGFuCisgICAgdGhlIGNhbGN1bGF0b3IgZXhhbXBsZS4KKworVG8gdXNlIHRoZSBleGFtcGxlLCBydW4gaXQgYXMgZm9sbG93czoKKworICAgJSBweXRob24gYmFzaWMucHkgaGVsbG8uYmFzCisgICBIRUxMTyBXT1JMRAorICAgJQorCitvciB1c2UgaXQgaW50ZXJhY3RpdmVseToKKworICAgJSBweXRob24gYmFzaWMucHkKKyAgIFtCQVNJQ10gMTAgUFJJTlQgIkhFTExPIFdPUkxEIgorICAgW0JBU0lDXSAyMCBFTkQKKyAgIFtCQVNJQ10gUlVOCisgICBIRUxMTyBXT1JMRAorICAgW0JBU0lDXQorCitUaGUgZm9sbG93aW5nIGZpbGVzIGFyZSBkZWZpbmVkOgorCisgICBiYXNpYy5weSAgICAgICAgIC0gSGlnaCBsZXZlbCBzY3JpcHQgdGhhdCBjb250cm9scyBldmVyeXRoaW5nCisgICBiYXNpY2xleC5weSAgICAgIC0gQkFTSUMgdG9rZW5pemVyCisgICBiYXNwYXJzZS5weSAgICAgIC0gQkFTSUMgcGFyc2VyCisgICBiYXNpbnRlcnAucHkgICAgIC0gQkFTSUMgaW50ZXJwcmV0ZXIgdGhhdCBydW5zIHBhcnNlZCBwcm9ncmFtcy4KKworSW4gYWRkaXRpb24sIGEgbnVtYmVyIG9mIHNhbXBsZSBCQVNJQyBwcm9ncmFtcyAoLmJhcyBzdWZmaXgpIGFyZQorcHJvdmlkZWQuICBUaGVzZSB3ZXJlIHRha2VuIG91dCBvZiB0aGUgRGFydG1vdXRoIG1hbnVhbC4KKworRGlzY2xhaW1lcjogSSBoYXZlbid0IHNwZW50IGEgdG9uIG9mIHRpbWUgdGVzdGluZyB0aGlzIGFuZCBpdCdzIGxpa2VseSB0aGF0CitJJ3ZlIHNraW1wZWQgaGVyZSBhbmQgdGhlcmUgb24gYSBmZXcgZmluZXIgZGV0YWlscyAoZS5nLiwgc3RyaWN0bHkgZW5mb3JjaW5nCit2YXJpYWJsZSBuYW1pbmcgcnVsZXMpLiAgSG93ZXZlciwgdGhlIGludGVycHJldGVyIHNlZW1zIHRvIGJlIGFibGUgdG8gcnVuCit0aGUgZXhhbXBsZXMgaW4gdGhlIEJBU0lDIG1hbnVhbC4KKworSGF2ZSBmdW4hCisKKy1EYXZlCisKKworCisKKworCmRpZmYgLS1naXQgYS9wbHkvZXhhbXBsZS9CQVNJQy9iYXNpYy5weSBiL3BseS9leGFtcGxlL0JBU0lDL2Jhc2ljLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYWM5ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvZXhhbXBsZS9CQVNJQy9iYXNpYy5weQpAQCAtMCwwICsxLDY1IEBACisjIEFuIGltcGxlbWVudGF0aW9uIG9mIERhcnRtb3V0aCBCQVNJQyAoMTk2NCkKKyMKKworaW1wb3J0IHN5cworc3lzLnBhdGguaW5zZXJ0KDAsICIuLi8uLiIpCisKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPj0gMzoKKyAgICByYXdfaW5wdXQgPSBpbnB1dAorCitpbXBvcnQgYmFzaWNsZXgKK2ltcG9ydCBiYXNwYXJzZQoraW1wb3J0IGJhc2ludGVycAorCisjIElmIGEgZmlsZW5hbWUgaGFzIGJlZW4gc3BlY2lmaWVkLCB3ZSB0cnkgdG8gcnVuIGl0LgorIyBJZiBhIHJ1bnRpbWUgZXJyb3Igb2NjdXJzLCB3ZSBiYWlsIG91dCBhbmQgZW50ZXIKKyMgaW50ZXJhY3RpdmUgbW9kZSBiZWxvdworaWYgbGVuKHN5cy5hcmd2KSA9PSAyOgorICAgIGRhdGEgPSBvcGVuKHN5cy5hcmd2WzFdKS5yZWFkKCkKKyAgICBwcm9nID0gYmFzcGFyc2UucGFyc2UoZGF0YSkKKyAgICBpZiBub3QgcHJvZzoKKyAgICAgICAgcmFpc2UgU3lzdGVtRXhpdAorICAgIGIgPSBiYXNpbnRlcnAuQmFzaWNJbnRlcnByZXRlcihwcm9nKQorICAgIHRyeToKKyAgICAgICAgYi5ydW4oKQorICAgICAgICByYWlzZSBTeXN0ZW1FeGl0CisgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgcGFzcworCitlbHNlOgorICAgIGIgPSBiYXNpbnRlcnAuQmFzaWNJbnRlcnByZXRlcih7fSkKKworIyBJbnRlcmFjdGl2ZSBtb2RlLiAgVGhpcyBpbmNyZW1lbnRhbGx5IGFkZHMvZGVsZXRlcyBzdGF0ZW1lbnRzCisjIGZyb20gdGhlIHByb2dyYW0gc3RvcmVkIGluIHRoZSBCYXNpY0ludGVycHJldGVyIG9iamVjdC4gIEluCisjIGFkZGl0aW9uLCBzcGVjaWFsIGNvbW1hbmRzICdORVcnLCdMSVNUJyxhbmQgJ1JVTicgYXJlIGFkZGVkLgorIyBTcGVjaWZ5aW5nIGEgbGluZSBudW1iZXIgd2l0aCBubyBjb2RlIGRlbGV0ZXMgdGhhdCBsaW5lIGZyb20KKyMgdGhlIHByb2dyYW0uCisKK3doaWxlIDE6CisgICAgdHJ5OgorICAgICAgICBsaW5lID0gcmF3X2lucHV0KCJbQkFTSUNdICIpCisgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICByYWlzZSBTeXN0ZW1FeGl0CisgICAgaWYgbm90IGxpbmU6CisgICAgICAgIGNvbnRpbnVlCisgICAgbGluZSArPSAiXG4iCisgICAgcHJvZyA9IGJhc3BhcnNlLnBhcnNlKGxpbmUpCisgICAgaWYgbm90IHByb2c6CisgICAgICAgIGNvbnRpbnVlCisKKyAgICBrZXlzID0gbGlzdChwcm9nKQorICAgIGlmIGtleXNbMF0gPiAwOgorICAgICAgICBiLmFkZF9zdGF0ZW1lbnRzKHByb2cpCisgICAgZWxzZToKKyAgICAgICAgc3RhdCA9IHByb2dba2V5c1swXV0KKyAgICAgICAgaWYgc3RhdFswXSA9PSAnUlVOJzoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBiLnJ1bigpCisgICAgICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxpZiBzdGF0WzBdID09ICdMSVNUJzoKKyAgICAgICAgICAgIGIubGlzdCgpCisgICAgICAgIGVsaWYgc3RhdFswXSA9PSAnQkxBTksnOgorICAgICAgICAgICAgYi5kZWxfbGluZShzdGF0WzFdKQorICAgICAgICBlbGlmIHN0YXRbMF0gPT0gJ05FVyc6CisgICAgICAgICAgICBiLm5ldygpCmRpZmYgLS1naXQgYS9wbHkvZXhhbXBsZS9CQVNJQy9iYXNpY2xleC5weSBiL3BseS9leGFtcGxlL0JBU0lDL2Jhc2ljbGV4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNTFmNGMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvZXhhbXBsZS9CQVNJQy9iYXNpY2xleC5weQpAQCAtMCwwICsxLDYxIEBACisjIEFuIGltcGxlbWVudGF0aW9uIG9mIERhcnRtb3V0aCBCQVNJQyAoMTk2NCkKKworZnJvbSBwbHkgaW1wb3J0ICoKKwora2V5d29yZHMgPSAoCisgICAgJ0xFVCcsICdSRUFEJywgJ0RBVEEnLCAnUFJJTlQnLCAnR09UTycsICdJRicsICdUSEVOJywgJ0ZPUicsICdORVhUJywgJ1RPJywgJ1NURVAnLAorICAgICdFTkQnLCAnU1RPUCcsICdERUYnLCAnR09TVUInLCAnRElNJywgJ1JFTScsICdSRVRVUk4nLCAnUlVOJywgJ0xJU1QnLCAnTkVXJywKKykKKwordG9rZW5zID0ga2V5d29yZHMgKyAoCisgICAgJ0VRVUFMUycsICdQTFVTJywgJ01JTlVTJywgJ1RJTUVTJywgJ0RJVklERScsICdQT1dFUicsCisgICAgJ0xQQVJFTicsICdSUEFSRU4nLCAnTFQnLCAnTEUnLCAnR1QnLCAnR0UnLCAnTkUnLAorICAgICdDT01NQScsICdTRU1JJywgJ0lOVEVHRVInLCAnRkxPQVQnLCAnU1RSSU5HJywKKyAgICAnSUQnLCAnTkVXTElORScKKykKKwordF9pZ25vcmUgPSAnIFx0JworCisKK2RlZiB0X1JFTSh0KToKKyAgICByJ1JFTSAuKicKKyAgICByZXR1cm4gdAorCisKK2RlZiB0X0lEKHQpOgorICAgIHInW0EtWl1bQS1aMC05XSonCisgICAgaWYgdC52YWx1ZSBpbiBrZXl3b3JkczoKKyAgICAgICAgdC50eXBlID0gdC52YWx1ZQorICAgIHJldHVybiB0CisKK3RfRVFVQUxTID0gcic9JwordF9QTFVTID0gcidcKycKK3RfTUlOVVMgPSByJy0nCit0X1RJTUVTID0gcidcKicKK3RfUE9XRVIgPSByJ1xeJwordF9ESVZJREUgPSByJy8nCit0X0xQQVJFTiA9IHInXCgnCit0X1JQQVJFTiA9IHInXCknCit0X0xUID0gcic8JwordF9MRSA9IHInPD0nCit0X0dUID0gcic+JwordF9HRSA9IHInPj0nCit0X05FID0gcic8PicKK3RfQ09NTUEgPSByJ1wsJwordF9TRU1JID0gcic7JwordF9JTlRFR0VSID0gcidcZCsnCit0X0ZMT0FUID0gcicoKFxkKlwuXGQrKShFW1wrLV0/XGQrKT98KFsxLTldXGQqRVtcKy1dP1xkKykpJwordF9TVFJJTkcgPSByJ1wiLio/XCInCisKKworZGVmIHRfTkVXTElORSh0KToKKyAgICByJ1xuJworICAgIHQubGV4ZXIubGluZW5vICs9IDEKKyAgICByZXR1cm4gdAorCisKK2RlZiB0X2Vycm9yKHQpOgorICAgIHByaW50KCJJbGxlZ2FsIGNoYXJhY3RlciAlcyIgJSB0LnZhbHVlWzBdKQorICAgIHQubGV4ZXIuc2tpcCgxKQorCitsZXgubGV4KGRlYnVnPTApCmRpZmYgLS1naXQgYS9wbHkvZXhhbXBsZS9CQVNJQy9iYXNpY2xvZy5weSBiL3BseS9leGFtcGxlL0JBU0lDL2Jhc2ljbG9nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkY2M3ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvZXhhbXBsZS9CQVNJQy9iYXNpY2xvZy5weQpAQCAtMCwwICsxLDczIEBACisjIEFuIGltcGxlbWVudGF0aW9uIG9mIERhcnRtb3V0aCBCQVNJQyAoMTk2NCkKKyMKKworaW1wb3J0IHN5cworc3lzLnBhdGguaW5zZXJ0KDAsICIuLi8uLiIpCisKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPj0gMzoKKyAgICByYXdfaW5wdXQgPSBpbnB1dAorCitpbXBvcnQgbG9nZ2luZworbG9nZ2luZy5iYXNpY0NvbmZpZygKKyAgICBsZXZlbD1sb2dnaW5nLklORk8sCisgICAgZmlsZW5hbWU9InBhcnNlbG9nLnR4dCIsCisgICAgZmlsZW1vZGU9InciCispCitsb2cgPSBsb2dnaW5nLmdldExvZ2dlcigpCisKK2ltcG9ydCBiYXNpY2xleAoraW1wb3J0IGJhc3BhcnNlCitpbXBvcnQgYmFzaW50ZXJwCisKKyMgSWYgYSBmaWxlbmFtZSBoYXMgYmVlbiBzcGVjaWZpZWQsIHdlIHRyeSB0byBydW4gaXQuCisjIElmIGEgcnVudGltZSBlcnJvciBvY2N1cnMsIHdlIGJhaWwgb3V0IGFuZCBlbnRlcgorIyBpbnRlcmFjdGl2ZSBtb2RlIGJlbG93CitpZiBsZW4oc3lzLmFyZ3YpID09IDI6CisgICAgZGF0YSA9IG9wZW4oc3lzLmFyZ3ZbMV0pLnJlYWQoKQorICAgIHByb2cgPSBiYXNwYXJzZS5wYXJzZShkYXRhLCBkZWJ1Zz1sb2cpCisgICAgaWYgbm90IHByb2c6CisgICAgICAgIHJhaXNlIFN5c3RlbUV4aXQKKyAgICBiID0gYmFzaW50ZXJwLkJhc2ljSW50ZXJwcmV0ZXIocHJvZykKKyAgICB0cnk6CisgICAgICAgIGIucnVuKCkKKyAgICAgICAgcmFpc2UgU3lzdGVtRXhpdAorICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgIHBhc3MKKworZWxzZToKKyAgICBiID0gYmFzaW50ZXJwLkJhc2ljSW50ZXJwcmV0ZXIoe30pCisKKyMgSW50ZXJhY3RpdmUgbW9kZS4gIFRoaXMgaW5jcmVtZW50YWxseSBhZGRzL2RlbGV0ZXMgc3RhdGVtZW50cworIyBmcm9tIHRoZSBwcm9ncmFtIHN0b3JlZCBpbiB0aGUgQmFzaWNJbnRlcnByZXRlciBvYmplY3QuICBJbgorIyBhZGRpdGlvbiwgc3BlY2lhbCBjb21tYW5kcyAnTkVXJywnTElTVCcsYW5kICdSVU4nIGFyZSBhZGRlZC4KKyMgU3BlY2lmeWluZyBhIGxpbmUgbnVtYmVyIHdpdGggbm8gY29kZSBkZWxldGVzIHRoYXQgbGluZSBmcm9tCisjIHRoZSBwcm9ncmFtLgorCit3aGlsZSAxOgorICAgIHRyeToKKyAgICAgICAgbGluZSA9IHJhd19pbnB1dCgiW0JBU0lDXSAiKQorICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgcmFpc2UgU3lzdGVtRXhpdAorICAgIGlmIG5vdCBsaW5lOgorICAgICAgICBjb250aW51ZQorICAgIGxpbmUgKz0gIlxuIgorICAgIHByb2cgPSBiYXNwYXJzZS5wYXJzZShsaW5lLCBkZWJ1Zz1sb2cpCisgICAgaWYgbm90IHByb2c6CisgICAgICAgIGNvbnRpbnVlCisKKyAgICBrZXlzID0gbGlzdChwcm9nKQorICAgIGlmIGtleXNbMF0gPiAwOgorICAgICAgICBiLmFkZF9zdGF0ZW1lbnRzKHByb2cpCisgICAgZWxzZToKKyAgICAgICAgc3RhdCA9IHByb2dba2V5c1swXV0KKyAgICAgICAgaWYgc3RhdFswXSA9PSAnUlVOJzoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBiLnJ1bigpCisgICAgICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxpZiBzdGF0WzBdID09ICdMSVNUJzoKKyAgICAgICAgICAgIGIubGlzdCgpCisgICAgICAgIGVsaWYgc3RhdFswXSA9PSAnQkxBTksnOgorICAgICAgICAgICAgYi5kZWxfbGluZShzdGF0WzFdKQorICAgICAgICBlbGlmIHN0YXRbMF0gPT0gJ05FVyc6CisgICAgICAgICAgICBiLm5ldygpCmRpZmYgLS1naXQgYS9wbHkvZXhhbXBsZS9CQVNJQy9iYXNpbnRlcnAucHkgYi9wbHkvZXhhbXBsZS9CQVNJQy9iYXNpbnRlcnAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc3NjJjNwotLS0gL2Rldi9udWxsCisrKyBiL3BseS9leGFtcGxlL0JBU0lDL2Jhc2ludGVycC5weQpAQCAtMCwwICsxLDQ5NiBAQAorIyBUaGlzIGZpbGUgcHJvdmlkZXMgdGhlIHJ1bnRpbWUgc3VwcG9ydCBmb3IgcnVubmluZyBhIGJhc2ljIHByb2dyYW0KKyMgQXNzdW1lcyB0aGUgcHJvZ3JhbSBoYXMgYmVlbiBwYXJzZWQgdXNpbmcgYmFzcGFyc2UucHkKKworaW1wb3J0IHN5cworaW1wb3J0IG1hdGgKK2ltcG9ydCByYW5kb20KKworCitjbGFzcyBCYXNpY0ludGVycHJldGVyOgorCisgICAgIyBJbml0aWFsaXplIHRoZSBpbnRlcnByZXRlci4gcHJvZyBpcyBhIGRpY3Rpb25hcnkKKyAgICAjIGNvbnRhaW5pbmcgKGxpbmUsc3RhdGVtZW50KSBtYXBwaW5ncworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9nKToKKyAgICAgICAgc2VsZi5wcm9nID0gcHJvZworCisgICAgICAgIHNlbGYuZnVuY3Rpb25zID0geyAgICAgICAgICAgIyBCdWlsdC1pbiBmdW5jdGlvbiB0YWJsZQorICAgICAgICAgICAgJ1NJTic6IGxhbWJkYSB6OiBtYXRoLnNpbihzZWxmLmV2YWwoeikpLAorICAgICAgICAgICAgJ0NPUyc6IGxhbWJkYSB6OiBtYXRoLmNvcyhzZWxmLmV2YWwoeikpLAorICAgICAgICAgICAgJ1RBTic6IGxhbWJkYSB6OiBtYXRoLnRhbihzZWxmLmV2YWwoeikpLAorICAgICAgICAgICAgJ0FUTic6IGxhbWJkYSB6OiBtYXRoLmF0YW4oc2VsZi5ldmFsKHopKSwKKyAgICAgICAgICAgICdFWFAnOiBsYW1iZGEgejogbWF0aC5leHAoc2VsZi5ldmFsKHopKSwKKyAgICAgICAgICAgICdBQlMnOiBsYW1iZGEgejogYWJzKHNlbGYuZXZhbCh6KSksCisgICAgICAgICAgICAnTE9HJzogbGFtYmRhIHo6IG1hdGgubG9nKHNlbGYuZXZhbCh6KSksCisgICAgICAgICAgICAnU1FSJzogbGFtYmRhIHo6IG1hdGguc3FydChzZWxmLmV2YWwoeikpLAorICAgICAgICAgICAgJ0lOVCc6IGxhbWJkYSB6OiBpbnQoc2VsZi5ldmFsKHopKSwKKyAgICAgICAgICAgICdSTkQnOiBsYW1iZGEgejogcmFuZG9tLnJhbmRvbSgpCisgICAgICAgIH0KKworICAgICMgQ29sbGVjdCBhbGwgZGF0YSBzdGF0ZW1lbnRzCisgICAgZGVmIGNvbGxlY3RfZGF0YShzZWxmKToKKyAgICAgICAgc2VsZi5kYXRhID0gW10KKyAgICAgICAgZm9yIGxpbmVubyBpbiBzZWxmLnN0YXQ6CisgICAgICAgICAgICBpZiBzZWxmLnByb2dbbGluZW5vXVswXSA9PSAnREFUQSc6CisgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5kYXRhICsgc2VsZi5wcm9nW2xpbmVub11bMV0KKyAgICAgICAgc2VsZi5kYyA9IDAgICAgICAgICAgICAgICAgICAjIEluaXRpYWxpemUgdGhlIGRhdGEgY291bnRlcgorCisgICAgIyBDaGVjayBmb3IgZW5kIHN0YXRlbWVudHMKKyAgICBkZWYgY2hlY2tfZW5kKHNlbGYpOgorICAgICAgICBoYXNfZW5kID0gMAorICAgICAgICBmb3IgbGluZW5vIGluIHNlbGYuc3RhdDoKKyAgICAgICAgICAgIGlmIHNlbGYucHJvZ1tsaW5lbm9dWzBdID09ICdFTkQnIGFuZCBub3QgaGFzX2VuZDoKKyAgICAgICAgICAgICAgICBoYXNfZW5kID0gbGluZW5vCisgICAgICAgIGlmIG5vdCBoYXNfZW5kOgorICAgICAgICAgICAgcHJpbnQoIk5PIEVORCBJTlNUUlVDVElPTiIpCisgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGhhc19lbmQgIT0gbGluZW5vOgorICAgICAgICAgICAgcHJpbnQoIkVORCBJUyBOT1QgTEFTVCIpCisgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorCisgICAgIyBDaGVjayBsb29wcworICAgIGRlZiBjaGVja19sb29wcyhzZWxmKToKKyAgICAgICAgZm9yIHBjIGluIHJhbmdlKGxlbihzZWxmLnN0YXQpKToKKyAgICAgICAgICAgIGxpbmVubyA9IHNlbGYuc3RhdFtwY10KKyAgICAgICAgICAgIGlmIHNlbGYucHJvZ1tsaW5lbm9dWzBdID09ICdGT1InOgorICAgICAgICAgICAgICAgIGZvcmluc3QgPSBzZWxmLnByb2dbbGluZW5vXQorICAgICAgICAgICAgICAgIGxvb3B2YXIgPSBmb3JpbnN0WzFdCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UocGMgKyAxLCBsZW4oc2VsZi5zdGF0KSk6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYucHJvZ1tzZWxmLnN0YXRbaV1dWzBdID09ICdORVhUJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHR2YXIgPSBzZWxmLnByb2dbc2VsZi5zdGF0W2ldXVsxXQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbmV4dHZhciAhPSBsb29wdmFyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvb3BlbmRbcGNdID0gaQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwcmludCgiRk9SIFdJVEhPVVQgTkVYVCBBVCBMSU5FICVzIiAlIHNlbGYuc3RhdFtwY10pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisKKyAgICAjIEV2YWx1YXRlIGFuIGV4cHJlc3Npb24KKyAgICBkZWYgZXZhbChzZWxmLCBleHByKToKKyAgICAgICAgZXR5cGUgPSBleHByWzBdCisgICAgICAgIGlmIGV0eXBlID09ICdOVU0nOgorICAgICAgICAgICAgcmV0dXJuIGV4cHJbMV0KKyAgICAgICAgZWxpZiBldHlwZSA9PSAnR1JPVVAnOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZXZhbChleHByWzFdKQorICAgICAgICBlbGlmIGV0eXBlID09ICdVTkFSWSc6CisgICAgICAgICAgICBpZiBleHByWzFdID09ICctJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gLXNlbGYuZXZhbChleHByWzJdKQorICAgICAgICBlbGlmIGV0eXBlID09ICdCSU5PUCc6CisgICAgICAgICAgICBpZiBleHByWzFdID09ICcrJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5ldmFsKGV4cHJbMl0pICsgc2VsZi5ldmFsKGV4cHJbM10pCisgICAgICAgICAgICBlbGlmIGV4cHJbMV0gPT0gJy0nOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmV2YWwoZXhwclsyXSkgLSBzZWxmLmV2YWwoZXhwclszXSkKKyAgICAgICAgICAgIGVsaWYgZXhwclsxXSA9PSAnKic6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZXZhbChleHByWzJdKSAqIHNlbGYuZXZhbChleHByWzNdKQorICAgICAgICAgICAgZWxpZiBleHByWzFdID09ICcvJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmxvYXQoc2VsZi5ldmFsKGV4cHJbMl0pKSAvIHNlbGYuZXZhbChleHByWzNdKQorICAgICAgICAgICAgZWxpZiBleHByWzFdID09ICdeJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gYWJzKHNlbGYuZXZhbChleHByWzJdKSkqKnNlbGYuZXZhbChleHByWzNdKQorICAgICAgICBlbGlmIGV0eXBlID09ICdWQVInOgorICAgICAgICAgICAgdmFyLCBkaW0xLCBkaW0yID0gZXhwclsxXQorICAgICAgICAgICAgaWYgbm90IGRpbTEgYW5kIG5vdCBkaW0yOgorICAgICAgICAgICAgICAgIGlmIHZhciBpbiBzZWxmLnZhcnM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhcnNbdmFyXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50KCJVTkRFRklORUQgVkFSSUFCTEUgJXMgQVQgTElORSAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAodmFyLCBzZWxmLnN0YXRbc2VsZi5wY10pKQorICAgICAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IKKyAgICAgICAgICAgICMgTWF5IGJlIGEgbGlzdCBsb29rdXAgb3IgYSBmdW5jdGlvbiBldmFsdWF0aW9uCisgICAgICAgICAgICBpZiBkaW0xIGFuZCBub3QgZGltMjoKKyAgICAgICAgICAgICAgICBpZiB2YXIgaW4gc2VsZi5mdW5jdGlvbnM6CisgICAgICAgICAgICAgICAgICAgICMgQSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5mdW5jdGlvbnNbdmFyXShkaW0xKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgQSBsaXN0IGV2YWx1YXRpb24KKyAgICAgICAgICAgICAgICAgICAgaWYgdmFyIGluIHNlbGYubGlzdHM6CisgICAgICAgICAgICAgICAgICAgICAgICBkaW0xdmFsID0gc2VsZi5ldmFsKGRpbTEpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBkaW0xdmFsIDwgMSBvciBkaW0xdmFsID4gbGVuKHNlbGYubGlzdHNbdmFyXSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoIkxJU1QgSU5ERVggT1VUIE9GIEJPVU5EUyBBVCBMSU5FICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0W3NlbGYucGNdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYubGlzdHNbdmFyXVtkaW0xdmFsIC0gMV0KKyAgICAgICAgICAgIGlmIGRpbTEgYW5kIGRpbTI6CisgICAgICAgICAgICAgICAgaWYgdmFyIGluIHNlbGYudGFibGVzOgorICAgICAgICAgICAgICAgICAgICBkaW0xdmFsID0gc2VsZi5ldmFsKGRpbTEpCisgICAgICAgICAgICAgICAgICAgIGRpbTJ2YWwgPSBzZWxmLmV2YWwoZGltMikKKyAgICAgICAgICAgICAgICAgICAgaWYgZGltMXZhbCA8IDEgb3IgZGltMXZhbCA+IGxlbihzZWxmLnRhYmxlc1t2YXJdKSBvciBkaW0ydmFsIDwgMSBvciBkaW0ydmFsID4gbGVuKHNlbGYudGFibGVzW3Zhcl1bMF0pOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoIlRBQkxFIElOREVYIE9VVCBPVVQgQk9VTkRTIEFUIExJTkUgJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdFtzZWxmLnBjXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi50YWJsZXNbdmFyXVtkaW0xdmFsIC0gMV1bZGltMnZhbCAtIDFdCisgICAgICAgICAgICBwcmludCgiVU5ERUZJTkVEIFZBUklBQkxFICVzIEFUIExJTkUgJXMiICUKKyAgICAgICAgICAgICAgICAgICh2YXIsIHNlbGYuc3RhdFtzZWxmLnBjXSkpCisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IKKworICAgICMgRXZhbHVhdGUgYSByZWxhdGlvbmFsIGV4cHJlc3Npb24KKyAgICBkZWYgcmVsZXZhbChzZWxmLCBleHByKToKKyAgICAgICAgZXR5cGUgPSBleHByWzFdCisgICAgICAgIGxocyA9IHNlbGYuZXZhbChleHByWzJdKQorICAgICAgICByaHMgPSBzZWxmLmV2YWwoZXhwclszXSkKKyAgICAgICAgaWYgZXR5cGUgPT0gJzwnOgorICAgICAgICAgICAgaWYgbGhzIDwgcmhzOgorICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiAwCisKKyAgICAgICAgZWxpZiBldHlwZSA9PSAnPD0nOgorICAgICAgICAgICAgaWYgbGhzIDw9IHJoczoKKyAgICAgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorCisgICAgICAgIGVsaWYgZXR5cGUgPT0gJz4nOgorICAgICAgICAgICAgaWYgbGhzID4gcmhzOgorICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiAwCisKKyAgICAgICAgZWxpZiBldHlwZSA9PSAnPj0nOgorICAgICAgICAgICAgaWYgbGhzID49IHJoczoKKyAgICAgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorCisgICAgICAgIGVsaWYgZXR5cGUgPT0gJz0nOgorICAgICAgICAgICAgaWYgbGhzID09IHJoczoKKyAgICAgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorCisgICAgICAgIGVsaWYgZXR5cGUgPT0gJzw+JzoKKyAgICAgICAgICAgIGlmIGxocyAhPSByaHM6CisgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIDAKKworICAgICMgQXNzaWdubWVudAorICAgIGRlZiBhc3NpZ24oc2VsZiwgdGFyZ2V0LCB2YWx1ZSk6CisgICAgICAgIHZhciwgZGltMSwgZGltMiA9IHRhcmdldAorICAgICAgICBpZiBub3QgZGltMSBhbmQgbm90IGRpbTI6CisgICAgICAgICAgICBzZWxmLnZhcnNbdmFyXSA9IHNlbGYuZXZhbCh2YWx1ZSkKKyAgICAgICAgZWxpZiBkaW0xIGFuZCBub3QgZGltMjoKKyAgICAgICAgICAgICMgTGlzdCBhc3NpZ25tZW50CisgICAgICAgICAgICBkaW0xdmFsID0gc2VsZi5ldmFsKGRpbTEpCisgICAgICAgICAgICBpZiBub3QgdmFyIGluIHNlbGYubGlzdHM6CisgICAgICAgICAgICAgICAgc2VsZi5saXN0c1t2YXJdID0gWzBdICogMTAKKworICAgICAgICAgICAgaWYgZGltMXZhbCA+IGxlbihzZWxmLmxpc3RzW3Zhcl0pOgorICAgICAgICAgICAgICAgIHByaW50ICgiRElNRU5TSU9OIFRPTyBMQVJHRSBBVCBMSU5FICVzIiAlIHNlbGYuc3RhdFtzZWxmLnBjXSkKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IKKyAgICAgICAgICAgIHNlbGYubGlzdHNbdmFyXVtkaW0xdmFsIC0gMV0gPSBzZWxmLmV2YWwodmFsdWUpCisgICAgICAgIGVsaWYgZGltMSBhbmQgZGltMjoKKyAgICAgICAgICAgIGRpbTF2YWwgPSBzZWxmLmV2YWwoZGltMSkKKyAgICAgICAgICAgIGRpbTJ2YWwgPSBzZWxmLmV2YWwoZGltMikKKyAgICAgICAgICAgIGlmIG5vdCB2YXIgaW4gc2VsZi50YWJsZXM6CisgICAgICAgICAgICAgICAgdGVtcCA9IFswXSAqIDEwCisgICAgICAgICAgICAgICAgdiA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgICAgICAgICB2LmFwcGVuZCh0ZW1wWzpdKQorICAgICAgICAgICAgICAgIHNlbGYudGFibGVzW3Zhcl0gPSB2CisgICAgICAgICAgICAjIFZhcmlhYmxlIGFscmVhZHkgZXhpc3RzCisgICAgICAgICAgICBpZiBkaW0xdmFsID4gbGVuKHNlbGYudGFibGVzW3Zhcl0pIG9yIGRpbTJ2YWwgPiBsZW4oc2VsZi50YWJsZXNbdmFyXVswXSk6CisgICAgICAgICAgICAgICAgcHJpbnQoIkRJTUVOU0lPTiBUT08gTEFSR0UgQVQgTElORSAlcyIgJSBzZWxmLnN0YXRbc2VsZi5wY10pCisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisgICAgICAgICAgICBzZWxmLnRhYmxlc1t2YXJdW2RpbTF2YWwgLSAxXVtkaW0ydmFsIC0gMV0gPSBzZWxmLmV2YWwodmFsdWUpCisKKyAgICAjIENoYW5nZSB0aGUgY3VycmVudCBsaW5lIG51bWJlcgorICAgIGRlZiBnb3RvKHNlbGYsIGxpbmVudW0pOgorICAgICAgICBpZiBub3QgbGluZW51bSBpbiBzZWxmLnByb2c6CisgICAgICAgICAgICBwcmludCgiVU5ERUZJTkVEIExJTkUgTlVNQkVSICVkIEFUIExJTkUgJWQiICUKKyAgICAgICAgICAgICAgICAgIChsaW5lbnVtLCBzZWxmLnN0YXRbc2VsZi5wY10pKQorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisgICAgICAgIHNlbGYucGMgPSBzZWxmLnN0YXQuaW5kZXgobGluZW51bSkKKworICAgICMgUnVuIGl0CisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgc2VsZi52YXJzID0ge30gICAgICAgICAgICAjIEFsbCB2YXJpYWJsZXMKKyAgICAgICAgc2VsZi5saXN0cyA9IHt9ICAgICAgICAgICAgIyBMaXN0IHZhcmlhYmxlcworICAgICAgICBzZWxmLnRhYmxlcyA9IHt9ICAgICAgICAgICAgIyBUYWJsZXMKKyAgICAgICAgc2VsZi5sb29wcyA9IFtdICAgICAgICAgICAgIyBDdXJyZW50bHkgYWN0aXZlIGxvb3BzCisgICAgICAgIHNlbGYubG9vcGVuZCA9IHt9ICAgICAgICAgICAgIyBNYXBwaW5nIHNheWluZyB3aGVyZSBsb29wcyBlbmQKKyAgICAgICAgc2VsZi5nb3N1YiA9IE5vbmUgICAgICAgICAgICMgR29zdWIgcmV0dXJuIHBvaW50IChpZiBhbnkpCisgICAgICAgIHNlbGYuZXJyb3IgPSAwICAgICAgICAgICAgICAjIEluZGljYXRlcyBwcm9ncmFtIGVycm9yCisKKyAgICAgICAgc2VsZi5zdGF0ID0gbGlzdChzZWxmLnByb2cpICAjIE9yZGVyZWQgbGlzdCBvZiBhbGwgbGluZSBudW1iZXJzCisgICAgICAgIHNlbGYuc3RhdC5zb3J0KCkKKyAgICAgICAgc2VsZi5wYyA9IDAgICAgICAgICAgICAgICAgICAjIEN1cnJlbnQgcHJvZ3JhbSBjb3VudGVyCisKKyAgICAgICAgIyBQcm9jZXNzaW5nIHByaW9yIHRvIHJ1bm5pbmcKKworICAgICAgICBzZWxmLmNvbGxlY3RfZGF0YSgpICAgICAgICAgICMgQ29sbGVjdCBhbGwgb2YgdGhlIGRhdGEgc3RhdGVtZW50cworICAgICAgICBzZWxmLmNoZWNrX2VuZCgpCisgICAgICAgIHNlbGYuY2hlY2tfbG9vcHMoKQorCisgICAgICAgIGlmIHNlbGYuZXJyb3I6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IKKworICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgbGluZSA9IHNlbGYuc3RhdFtzZWxmLnBjXQorICAgICAgICAgICAgaW5zdHIgPSBzZWxmLnByb2dbbGluZV0KKworICAgICAgICAgICAgb3AgPSBpbnN0clswXQorCisgICAgICAgICAgICAjIEVORCBhbmQgU1RPUCBzdGF0ZW1lbnRzCisgICAgICAgICAgICBpZiBvcCA9PSAnRU5EJyBvciBvcCA9PSAnU1RPUCc6CisgICAgICAgICAgICAgICAgYnJlYWsgICAgICAgICAgICMgV2UncmUgZG9uZQorCisgICAgICAgICAgICAjIEdPVE8gc3RhdGVtZW50CisgICAgICAgICAgICBlbGlmIG9wID09ICdHT1RPJzoKKyAgICAgICAgICAgICAgICBuZXdsaW5lID0gaW5zdHJbMV0KKyAgICAgICAgICAgICAgICBzZWxmLmdvdG8obmV3bGluZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIFBSSU5UIHN0YXRlbWVudAorICAgICAgICAgICAgZWxpZiBvcCA9PSAnUFJJTlQnOgorICAgICAgICAgICAgICAgIHBsaXN0ID0gaW5zdHJbMV0KKyAgICAgICAgICAgICAgICBvdXQgPSAiIgorICAgICAgICAgICAgICAgIGZvciBsYWJlbCwgdmFsIGluIHBsaXN0OgorICAgICAgICAgICAgICAgICAgICBpZiBvdXQ6CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJyAnICogKDE1IC0gKGxlbihvdXQpICUgMTUpKQorICAgICAgICAgICAgICAgICAgICBvdXQgKz0gbGFiZWwKKyAgICAgICAgICAgICAgICAgICAgaWYgdmFsOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGFiZWw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICIgIgorICAgICAgICAgICAgICAgICAgICAgICAgZXZhbCA9IHNlbGYuZXZhbCh2YWwpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gc3RyKGV2YWwpCisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZShvdXQpCisgICAgICAgICAgICAgICAgZW5kID0gaW5zdHJbMl0KKyAgICAgICAgICAgICAgICBpZiBub3QgKGVuZCA9PSAnLCcgb3IgZW5kID09ICc7Jyk6CisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIlxuIikKKyAgICAgICAgICAgICAgICBpZiBlbmQgPT0gJywnOgorICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCIgIiAqICgxNSAtIChsZW4ob3V0KSAlIDE1KSkpCisgICAgICAgICAgICAgICAgaWYgZW5kID09ICc7JzoKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiICIgKiAoMyAtIChsZW4ob3V0KSAlIDMpKSkKKworICAgICAgICAgICAgIyBMRVQgc3RhdGVtZW50CisgICAgICAgICAgICBlbGlmIG9wID09ICdMRVQnOgorICAgICAgICAgICAgICAgIHRhcmdldCA9IGluc3RyWzFdCisgICAgICAgICAgICAgICAgdmFsdWUgPSBpbnN0clsyXQorICAgICAgICAgICAgICAgIHNlbGYuYXNzaWduKHRhcmdldCwgdmFsdWUpCisKKyAgICAgICAgICAgICMgUkVBRCBzdGF0ZW1lbnQKKyAgICAgICAgICAgIGVsaWYgb3AgPT0gJ1JFQUQnOgorICAgICAgICAgICAgICAgIGZvciB0YXJnZXQgaW4gaW5zdHJbMV06CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZGMgPCBsZW4oc2VsZi5kYXRhKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKCdOVU0nLCBzZWxmLmRhdGFbc2VsZi5kY10pCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2lnbih0YXJnZXQsIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYyArPSAxCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAjIE5vIG1vcmUgZGF0YS4gIFByb2dyYW0gZW5kcworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBlbGlmIG9wID09ICdJRic6CisgICAgICAgICAgICAgICAgcmVsb3AgPSBpbnN0clsxXQorICAgICAgICAgICAgICAgIG5ld2xpbmUgPSBpbnN0clsyXQorICAgICAgICAgICAgICAgIGlmIChzZWxmLnJlbGV2YWwocmVsb3ApKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5nb3RvKG5ld2xpbmUpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGVsaWYgb3AgPT0gJ0ZPUic6CisgICAgICAgICAgICAgICAgbG9vcHZhciA9IGluc3RyWzFdCisgICAgICAgICAgICAgICAgaW5pdHZhbCA9IGluc3RyWzJdCisgICAgICAgICAgICAgICAgZmludmFsID0gaW5zdHJbM10KKyAgICAgICAgICAgICAgICBzdGVwdmFsID0gaW5zdHJbNF0KKworICAgICAgICAgICAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSBuZXcgbG9vcAorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmxvb3BzIG9yIHNlbGYubG9vcHNbLTFdWzBdICE9IHNlbGYucGM6CisgICAgICAgICAgICAgICAgICAgICMgTG9va3MgbGlrZSBhIG5ldyBsb29wLiBNYWtlIHRoZSBpbml0aWFsIGFzc2lnbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgbmV3dmFsdWUgPSBpbml0dmFsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzaWduKChsb29wdmFyLCBOb25lLCBOb25lKSwgaW5pdHZhbCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHN0ZXB2YWw6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGVwdmFsID0gKCdOVU0nLCAxKQorICAgICAgICAgICAgICAgICAgICBzdGVwdmFsID0gc2VsZi5ldmFsKHN0ZXB2YWwpICAgICMgRXZhbHVhdGUgc3RlcCBoZXJlCisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9vcHMuYXBwZW5kKChzZWxmLnBjLCBzdGVwdmFsKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIEl0J3MgYSByZXBlYXQgb2YgdGhlIHByZXZpb3VzIGxvb3AKKyAgICAgICAgICAgICAgICAgICAgIyBVcGRhdGUgdGhlIHZhbHVlIG9mIHRoZSBsb29wIHZhcmlhYmxlIGFjY29yZGluZyB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgIyBzdGVwCisgICAgICAgICAgICAgICAgICAgIHN0ZXB2YWwgPSAoJ05VTScsIHNlbGYubG9vcHNbLTFdWzFdKQorICAgICAgICAgICAgICAgICAgICBuZXd2YWx1ZSA9ICgKKyAgICAgICAgICAgICAgICAgICAgICAgICdCSU5PUCcsICcrJywgKCdWQVInLCAobG9vcHZhciwgTm9uZSwgTm9uZSkpLCBzdGVwdmFsKQorCisgICAgICAgICAgICAgICAgaWYgc2VsZi5sb29wc1stMV1bMV0gPCAwOgorICAgICAgICAgICAgICAgICAgICByZWxvcCA9ICc+PScKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZWxvcCA9ICc8PScKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5yZWxldmFsKCgnUkVMT1AnLCByZWxvcCwgbmV3dmFsdWUsIGZpbnZhbCkpOgorICAgICAgICAgICAgICAgICAgICAjIExvb3AgaXMgZG9uZS4gSnVtcCB0byB0aGUgTkVYVAorICAgICAgICAgICAgICAgICAgICBzZWxmLnBjID0gc2VsZi5sb29wZW5kW3NlbGYucGNdCisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9vcHMucG9wKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2lnbigobG9vcHZhciwgTm9uZSwgTm9uZSksIG5ld3ZhbHVlKQorCisgICAgICAgICAgICBlbGlmIG9wID09ICdORVhUJzoKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5sb29wczoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQoIk5FWFQgV0lUSE9VVCBGT1IgQVQgTElORSAlcyIgJSBsaW5lKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgICAgIG5leHR2YXIgPSBpbnN0clsxXQorICAgICAgICAgICAgICAgIHNlbGYucGMgPSBzZWxmLmxvb3BzWy0xXVswXQorICAgICAgICAgICAgICAgIGxvb3BpbnN0ID0gc2VsZi5wcm9nW3NlbGYuc3RhdFtzZWxmLnBjXV0KKyAgICAgICAgICAgICAgICBmb3J2YXIgPSBsb29waW5zdFsxXQorICAgICAgICAgICAgICAgIGlmIG5leHR2YXIgIT0gZm9ydmFyOgorICAgICAgICAgICAgICAgICAgICBwcmludCgiTkVYVCBET0VTTidUIE1BVENIIEZPUiBBVCBMSU5FICVzIiAlIGxpbmUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIG9wID09ICdHT1NVQic6CisgICAgICAgICAgICAgICAgbmV3bGluZSA9IGluc3RyWzFdCisgICAgICAgICAgICAgICAgaWYgc2VsZi5nb3N1YjoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQoIkFMUkVBRFkgSU4gQSBTVUJST1VUSU5FIEFUIExJTkUgJXMiICUgbGluZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgc2VsZi5nb3N1YiA9IHNlbGYuc3RhdFtzZWxmLnBjXQorICAgICAgICAgICAgICAgIHNlbGYuZ290byhuZXdsaW5lKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGVsaWYgb3AgPT0gJ1JFVFVSTic6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuZ29zdWI6CisgICAgICAgICAgICAgICAgICAgIHByaW50KCJSRVRVUk4gV0lUSE9VVCBBIEdPU1VCIEFUIExJTkUgJXMiICUgbGluZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgc2VsZi5nb3RvKHNlbGYuZ29zdWIpCisgICAgICAgICAgICAgICAgc2VsZi5nb3N1YiA9IE5vbmUKKworICAgICAgICAgICAgZWxpZiBvcCA9PSAnRlVOQyc6CisgICAgICAgICAgICAgICAgZm5hbWUgPSBpbnN0clsxXQorICAgICAgICAgICAgICAgIHBuYW1lID0gaW5zdHJbMl0KKyAgICAgICAgICAgICAgICBleHByID0gaW5zdHJbM10KKworICAgICAgICAgICAgICAgIGRlZiBldmFsX2Z1bmMocHZhbHVlLCBuYW1lPXBuYW1lLCBzZWxmPXNlbGYsIGV4cHI9ZXhwcik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzaWduKChwbmFtZSwgTm9uZSwgTm9uZSksIHB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZXZhbChleHByKQorICAgICAgICAgICAgICAgIHNlbGYuZnVuY3Rpb25zW2ZuYW1lXSA9IGV2YWxfZnVuYworCisgICAgICAgICAgICBlbGlmIG9wID09ICdESU0nOgorICAgICAgICAgICAgICAgIGZvciB2bmFtZSwgeCwgeSBpbiBpbnN0clsxXToKKyAgICAgICAgICAgICAgICAgICAgaWYgeSA9PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBTaW5nbGUgZGltZW5zaW9uIHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxpc3RzW3ZuYW1lXSA9IFswXSAqIHgKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgRG91YmxlIGRpbWVuc2lvbiB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IFswXSAqIHkKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBbXQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoeCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5hcHBlbmQodGVtcFs6XSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGFibGVzW3ZuYW1lXSA9IHYKKworICAgICAgICAgICAgc2VsZi5wYyArPSAxCisKKyAgICAjIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBwcm9ncmFtIGxpc3RpbmcKKyAgICBkZWYgZXhwcl9zdHIoc2VsZiwgZXhwcik6CisgICAgICAgIGV0eXBlID0gZXhwclswXQorICAgICAgICBpZiBldHlwZSA9PSAnTlVNJzoKKyAgICAgICAgICAgIHJldHVybiBzdHIoZXhwclsxXSkKKyAgICAgICAgZWxpZiBldHlwZSA9PSAnR1JPVVAnOgorICAgICAgICAgICAgcmV0dXJuICIoJXMpIiAlIHNlbGYuZXhwcl9zdHIoZXhwclsxXSkKKyAgICAgICAgZWxpZiBldHlwZSA9PSAnVU5BUlknOgorICAgICAgICAgICAgaWYgZXhwclsxXSA9PSAnLSc6CisgICAgICAgICAgICAgICAgcmV0dXJuICItIiArIHN0cihleHByWzJdKQorICAgICAgICBlbGlmIGV0eXBlID09ICdCSU5PUCc6CisgICAgICAgICAgICByZXR1cm4gIiVzICVzICVzIiAlIChzZWxmLmV4cHJfc3RyKGV4cHJbMl0pLCBleHByWzFdLCBzZWxmLmV4cHJfc3RyKGV4cHJbM10pKQorICAgICAgICBlbGlmIGV0eXBlID09ICdWQVInOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFyX3N0cihleHByWzFdKQorCisgICAgZGVmIHJlbGV4cHJfc3RyKHNlbGYsIGV4cHIpOgorICAgICAgICByZXR1cm4gIiVzICVzICVzIiAlIChzZWxmLmV4cHJfc3RyKGV4cHJbMl0pLCBleHByWzFdLCBzZWxmLmV4cHJfc3RyKGV4cHJbM10pKQorCisgICAgZGVmIHZhcl9zdHIoc2VsZiwgdmFyKToKKyAgICAgICAgdmFybmFtZSwgZGltMSwgZGltMiA9IHZhcgorICAgICAgICBpZiBub3QgZGltMSBhbmQgbm90IGRpbTI6CisgICAgICAgICAgICByZXR1cm4gdmFybmFtZQorICAgICAgICBpZiBkaW0xIGFuZCBub3QgZGltMjoKKyAgICAgICAgICAgIHJldHVybiAiJXMoJXMpIiAlICh2YXJuYW1lLCBzZWxmLmV4cHJfc3RyKGRpbTEpKQorICAgICAgICByZXR1cm4gIiVzKCVzLCVzKSIgJSAodmFybmFtZSwgc2VsZi5leHByX3N0cihkaW0xKSwgc2VsZi5leHByX3N0cihkaW0yKSkKKworICAgICMgQ3JlYXRlIGEgcHJvZ3JhbSBsaXN0aW5nCisgICAgZGVmIGxpc3Qoc2VsZik6CisgICAgICAgIHN0YXQgPSBsaXN0KHNlbGYucHJvZykgICAgICAjIE9yZGVyZWQgbGlzdCBvZiBhbGwgbGluZSBudW1iZXJzCisgICAgICAgIHN0YXQuc29ydCgpCisgICAgICAgIGZvciBsaW5lIGluIHN0YXQ6CisgICAgICAgICAgICBpbnN0ciA9IHNlbGYucHJvZ1tsaW5lXQorICAgICAgICAgICAgb3AgPSBpbnN0clswXQorICAgICAgICAgICAgaWYgb3AgaW4gWydFTkQnLCAnU1RPUCcsICdSRVRVUk4nXToKKyAgICAgICAgICAgICAgICBwcmludCgiJXMgJXMiICUgKGxpbmUsIG9wKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiBvcCA9PSAnUkVNJzoKKyAgICAgICAgICAgICAgICBwcmludCgiJXMgJXMiICUgKGxpbmUsIGluc3RyWzFdKSkKKyAgICAgICAgICAgIGVsaWYgb3AgPT0gJ1BSSU5UJzoKKyAgICAgICAgICAgICAgICBfb3V0ID0gIiVzICVzICIgJSAobGluZSwgb3ApCisgICAgICAgICAgICAgICAgZmlyc3QgPSAxCisgICAgICAgICAgICAgICAgZm9yIHAgaW4gaW5zdHJbMV06CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBmaXJzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIF9vdXQgKz0gIiwgIgorICAgICAgICAgICAgICAgICAgICBpZiBwWzBdIGFuZCBwWzFdOgorICAgICAgICAgICAgICAgICAgICAgICAgX291dCArPSAnIiVzIiVzJyAlIChwWzBdLCBzZWxmLmV4cHJfc3RyKHBbMV0pKQorICAgICAgICAgICAgICAgICAgICBlbGlmIHBbMV06CisgICAgICAgICAgICAgICAgICAgICAgICBfb3V0ICs9IHNlbGYuZXhwcl9zdHIocFsxXSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIF9vdXQgKz0gJyIlcyInICUgKHBbMF0sKQorICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IDAKKyAgICAgICAgICAgICAgICBpZiBpbnN0clsyXToKKyAgICAgICAgICAgICAgICAgICAgX291dCArPSBpbnN0clsyXQorICAgICAgICAgICAgICAgIHByaW50KF9vdXQpCisgICAgICAgICAgICBlbGlmIG9wID09ICdMRVQnOgorICAgICAgICAgICAgICAgIHByaW50KCIlcyBMRVQgJXMgPSAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgIChsaW5lLCBzZWxmLnZhcl9zdHIoaW5zdHJbMV0pLCBzZWxmLmV4cHJfc3RyKGluc3RyWzJdKSkpCisgICAgICAgICAgICBlbGlmIG9wID09ICdSRUFEJzoKKyAgICAgICAgICAgICAgICBfb3V0ID0gIiVzIFJFQUQgIiAlIGxpbmUKKyAgICAgICAgICAgICAgICBmaXJzdCA9IDEKKyAgICAgICAgICAgICAgICBmb3IgciBpbiBpbnN0clsxXToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGZpcnN0OgorICAgICAgICAgICAgICAgICAgICAgICAgX291dCArPSAiLCIKKyAgICAgICAgICAgICAgICAgICAgX291dCArPSBzZWxmLnZhcl9zdHIocikKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSAwCisgICAgICAgICAgICAgICAgcHJpbnQoX291dCkKKyAgICAgICAgICAgIGVsaWYgb3AgPT0gJ0lGJzoKKyAgICAgICAgICAgICAgICBwcmludCgiJXMgSUYgJXMgVEhFTiAlZCIgJQorICAgICAgICAgICAgICAgICAgICAgIChsaW5lLCBzZWxmLnJlbGV4cHJfc3RyKGluc3RyWzFdKSwgaW5zdHJbMl0pKQorICAgICAgICAgICAgZWxpZiBvcCA9PSAnR09UTycgb3Igb3AgPT0gJ0dPU1VCJzoKKyAgICAgICAgICAgICAgICBwcmludCgiJXMgJXMgJXMiICUgKGxpbmUsIG9wLCBpbnN0clsxXSkpCisgICAgICAgICAgICBlbGlmIG9wID09ICdGT1InOgorICAgICAgICAgICAgICAgIF9vdXQgPSAiJXMgRk9SICVzID0gJXMgVE8gJXMiICUgKAorICAgICAgICAgICAgICAgICAgICBsaW5lLCBpbnN0clsxXSwgc2VsZi5leHByX3N0cihpbnN0clsyXSksIHNlbGYuZXhwcl9zdHIoaW5zdHJbM10pKQorICAgICAgICAgICAgICAgIGlmIGluc3RyWzRdOgorICAgICAgICAgICAgICAgICAgICBfb3V0ICs9ICIgU1RFUCAlcyIgJSAoc2VsZi5leHByX3N0cihpbnN0cls0XSkpCisgICAgICAgICAgICAgICAgcHJpbnQoX291dCkKKyAgICAgICAgICAgIGVsaWYgb3AgPT0gJ05FWFQnOgorICAgICAgICAgICAgICAgIHByaW50KCIlcyBORVhUICVzIiAlIChsaW5lLCBpbnN0clsxXSkpCisgICAgICAgICAgICBlbGlmIG9wID09ICdGVU5DJzoKKyAgICAgICAgICAgICAgICBwcmludCgiJXMgREVGICVzKCVzKSA9ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgKGxpbmUsIGluc3RyWzFdLCBpbnN0clsyXSwgc2VsZi5leHByX3N0cihpbnN0clszXSkpKQorICAgICAgICAgICAgZWxpZiBvcCA9PSAnRElNJzoKKyAgICAgICAgICAgICAgICBfb3V0ID0gIiVzIERJTSAiICUgbGluZQorICAgICAgICAgICAgICAgIGZpcnN0ID0gMQorICAgICAgICAgICAgICAgIGZvciB2bmFtZSwgeCwgeSBpbiBpbnN0clsxXToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGZpcnN0OgorICAgICAgICAgICAgICAgICAgICAgICAgX291dCArPSAiLCIKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSAwCisgICAgICAgICAgICAgICAgICAgIGlmIHkgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIF9vdXQgKz0gIiVzKCVkKSIgJSAodm5hbWUsIHgpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBfb3V0ICs9ICIlcyglZCwlZCkiICUgKHZuYW1lLCB4LCB5KQorCisgICAgICAgICAgICAgICAgcHJpbnQoX291dCkKKyAgICAgICAgICAgIGVsaWYgb3AgPT0gJ0RBVEEnOgorICAgICAgICAgICAgICAgIF9vdXQgPSAiJXMgREFUQSAiICUgbGluZQorICAgICAgICAgICAgICAgIGZpcnN0ID0gMQorICAgICAgICAgICAgICAgIGZvciB2IGluIGluc3RyWzFdOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgZmlyc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICBfb3V0ICs9ICIsIgorICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IDAKKyAgICAgICAgICAgICAgICAgICAgX291dCArPSB2CisgICAgICAgICAgICAgICAgcHJpbnQoX291dCkKKworICAgICMgRXJhc2UgdGhlIGN1cnJlbnQgcHJvZ3JhbQorICAgIGRlZiBuZXcoc2VsZik6CisgICAgICAgIHNlbGYucHJvZyA9IHt9CisKKyAgICAjIEluc2VydCBzdGF0ZW1lbnRzCisgICAgZGVmIGFkZF9zdGF0ZW1lbnRzKHNlbGYsIHByb2cpOgorICAgICAgICBmb3IgbGluZSwgc3RhdCBpbiBwcm9nLml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLnByb2dbbGluZV0gPSBzdGF0CisKKyAgICAjIERlbGV0ZSBhIHN0YXRlbWVudAorICAgIGRlZiBkZWxfbGluZShzZWxmLCBsaW5lbm8pOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgc2VsZi5wcm9nW2xpbmVub10KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcGFzcwpkaWZmIC0tZ2l0IGEvcGx5L2V4YW1wbGUvQkFTSUMvYmFzcGFyc2UucHkgYi9wbHkvZXhhbXBsZS9CQVNJQy9iYXNwYXJzZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjEwYzdkCi0tLSAvZGV2L251bGwKKysrIGIvcGx5L2V4YW1wbGUvQkFTSUMvYmFzcGFyc2UucHkKQEAgLTAsMCArMSw0NzQgQEAKKyMgQW4gaW1wbGVtZW50YXRpb24gb2YgRGFydG1vdXRoIEJBU0lDICgxOTY0KQorIworCitmcm9tIHBseSBpbXBvcnQgKgoraW1wb3J0IGJhc2ljbGV4CisKK3Rva2VucyA9IGJhc2ljbGV4LnRva2VucworCitwcmVjZWRlbmNlID0gKAorICAgICgnbGVmdCcsICdQTFVTJywgJ01JTlVTJyksCisgICAgKCdsZWZ0JywgJ1RJTUVTJywgJ0RJVklERScpLAorICAgICgnbGVmdCcsICdQT1dFUicpLAorICAgICgncmlnaHQnLCAnVU1JTlVTJykKKykKKworIyBBIEJBU0lDIHByb2dyYW0gaXMgYSBzZXJpZXMgb2Ygc3RhdGVtZW50cy4gIFdlIHJlcHJlc2VudCB0aGUgcHJvZ3JhbSBhcyBhCisjIGRpY3Rpb25hcnkgb2YgdHVwbGVzIGluZGV4ZWQgYnkgbGluZSBudW1iZXIuCisKKworZGVmIHBfcHJvZ3JhbShwKToKKyAgICAnJydwcm9ncmFtIDogcHJvZ3JhbSBzdGF0ZW1lbnQKKyAgICAgICAgICAgICAgIHwgc3RhdGVtZW50JycnCisKKyAgICBpZiBsZW4ocCkgPT0gMiBhbmQgcFsxXToKKyAgICAgICAgcFswXSA9IHt9CisgICAgICAgIGxpbmUsIHN0YXQgPSBwWzFdCisgICAgICAgIHBbMF1bbGluZV0gPSBzdGF0CisgICAgZWxpZiBsZW4ocCkgPT0gMzoKKyAgICAgICAgcFswXSA9IHBbMV0KKyAgICAgICAgaWYgbm90IHBbMF06CisgICAgICAgICAgICBwWzBdID0ge30KKyAgICAgICAgaWYgcFsyXToKKyAgICAgICAgICAgIGxpbmUsIHN0YXQgPSBwWzJdCisgICAgICAgICAgICBwWzBdW2xpbmVdID0gc3RhdAorCisjIFRoaXMgY2F0Y2gtYWxsIHJ1bGUgaXMgdXNlZCBmb3IgYW55IGNhdGFzdHJvcGhpYyBlcnJvcnMuICBJbiB0aGlzIGNhc2UsCisjIHdlIHNpbXBseSByZXR1cm4gbm90aGluZworCisKK2RlZiBwX3Byb2dyYW1fZXJyb3IocCk6CisgICAgJycncHJvZ3JhbSA6IGVycm9yJycnCisgICAgcFswXSA9IE5vbmUKKyAgICBwLnBhcnNlci5lcnJvciA9IDEKKworIyBGb3JtYXQgb2YgYWxsIEJBU0lDIHN0YXRlbWVudHMuCisKKworZGVmIHBfc3RhdGVtZW50KHApOgorICAgICcnJ3N0YXRlbWVudCA6IElOVEVHRVIgY29tbWFuZCBORVdMSU5FJycnCisgICAgaWYgaXNpbnN0YW5jZShwWzJdLCBzdHIpOgorICAgICAgICBwcmludCgiJXMgJXMgJXMiICUgKHBbMl0sICJBVCBMSU5FIiwgcFsxXSkpCisgICAgICAgIHBbMF0gPSBOb25lCisgICAgICAgIHAucGFyc2VyLmVycm9yID0gMQorICAgIGVsc2U6CisgICAgICAgIGxpbmVubyA9IGludChwWzFdKQorICAgICAgICBwWzBdID0gKGxpbmVubywgcFsyXSkKKworIyBJbnRlcmFjdGl2ZSBzdGF0ZW1lbnRzLgorCisKK2RlZiBwX3N0YXRlbWVudF9pbnRlcmFjdGl2ZShwKToKKyAgICAnJydzdGF0ZW1lbnQgOiBSVU4gTkVXTElORQorICAgICAgICAgICAgICAgICB8IExJU1QgTkVXTElORQorICAgICAgICAgICAgICAgICB8IE5FVyBORVdMSU5FJycnCisgICAgcFswXSA9ICgwLCAocFsxXSwgMCkpCisKKyMgQmxhbmsgbGluZSBudW1iZXIKKworCitkZWYgcF9zdGF0ZW1lbnRfYmxhbmsocCk6CisgICAgJycnc3RhdGVtZW50IDogSU5URUdFUiBORVdMSU5FJycnCisgICAgcFswXSA9ICgwLCAoJ0JMQU5LJywgaW50KHBbMV0pKSkKKworIyBFcnJvciBoYW5kbGluZyBmb3IgbWFsZm9ybWVkIHN0YXRlbWVudHMKKworCitkZWYgcF9zdGF0ZW1lbnRfYmFkKHApOgorICAgICcnJ3N0YXRlbWVudCA6IElOVEVHRVIgZXJyb3IgTkVXTElORScnJworICAgIHByaW50KCJNQUxGT1JNRUQgU1RBVEVNRU5UIEFUIExJTkUgJXMiICUgcFsxXSkKKyAgICBwWzBdID0gTm9uZQorICAgIHAucGFyc2VyLmVycm9yID0gMQorCisjIEJsYW5rIGxpbmUKKworCitkZWYgcF9zdGF0ZW1lbnRfbmV3bGluZShwKToKKyAgICAnJydzdGF0ZW1lbnQgOiBORVdMSU5FJycnCisgICAgcFswXSA9IE5vbmUKKworIyBMRVQgc3RhdGVtZW50CisKKworZGVmIHBfY29tbWFuZF9sZXQocCk6CisgICAgJycnY29tbWFuZCA6IExFVCB2YXJpYWJsZSBFUVVBTFMgZXhwcicnJworICAgIHBbMF0gPSAoJ0xFVCcsIHBbMl0sIHBbNF0pCisKKworZGVmIHBfY29tbWFuZF9sZXRfYmFkKHApOgorICAgICcnJ2NvbW1hbmQgOiBMRVQgdmFyaWFibGUgRVFVQUxTIGVycm9yJycnCisgICAgcFswXSA9ICJCQUQgRVhQUkVTU0lPTiBJTiBMRVQiCisKKyMgUkVBRCBzdGF0ZW1lbnQKKworCitkZWYgcF9jb21tYW5kX3JlYWQocCk6CisgICAgJycnY29tbWFuZCA6IFJFQUQgdmFybGlzdCcnJworICAgIHBbMF0gPSAoJ1JFQUQnLCBwWzJdKQorCisKK2RlZiBwX2NvbW1hbmRfcmVhZF9iYWQocCk6CisgICAgJycnY29tbWFuZCA6IFJFQUQgZXJyb3InJycKKyAgICBwWzBdID0gIk1BTEZPUk1FRCBWQVJJQUJMRSBMSVNUIElOIFJFQUQiCisKKyMgREFUQSBzdGF0ZW1lbnQKKworCitkZWYgcF9jb21tYW5kX2RhdGEocCk6CisgICAgJycnY29tbWFuZCA6IERBVEEgbnVtbGlzdCcnJworICAgIHBbMF0gPSAoJ0RBVEEnLCBwWzJdKQorCisKK2RlZiBwX2NvbW1hbmRfZGF0YV9iYWQocCk6CisgICAgJycnY29tbWFuZCA6IERBVEEgZXJyb3InJycKKyAgICBwWzBdID0gIk1BTEZPUk1FRCBOVU1CRVIgTElTVCBJTiBEQVRBIgorCisjIFBSSU5UIHN0YXRlbWVudAorCisKK2RlZiBwX2NvbW1hbmRfcHJpbnQocCk6CisgICAgJycnY29tbWFuZCA6IFBSSU5UIHBsaXN0IG9wdGVuZCcnJworICAgIHBbMF0gPSAoJ1BSSU5UJywgcFsyXSwgcFszXSkKKworCitkZWYgcF9jb21tYW5kX3ByaW50X2JhZChwKToKKyAgICAnJydjb21tYW5kIDogUFJJTlQgZXJyb3InJycKKyAgICBwWzBdID0gIk1BTEZPUk1FRCBQUklOVCBTVEFURU1FTlQiCisKKyMgT3B0aW9uYWwgZW5kaW5nIG9uIFBSSU5ULiBFaXRoZXIgYSBjb21tYSAoLCkgb3Igc2VtaWNvbG9uICg7KQorCisKK2RlZiBwX29wdGVuZChwKToKKyAgICAnJydvcHRlbmQgOiBDT01NQSAKKyAgICAgICAgICAgICAgfCBTRU1JCisgICAgICAgICAgICAgIHwnJycKKyAgICBpZiBsZW4ocCkgPT0gMjoKKyAgICAgICAgcFswXSA9IHBbMV0KKyAgICBlbHNlOgorICAgICAgICBwWzBdID0gTm9uZQorCisjIFBSSU5UIHN0YXRlbWVudCB3aXRoIG5vIGFyZ3VtZW50cworCisKK2RlZiBwX2NvbW1hbmRfcHJpbnRfZW1wdHkocCk6CisgICAgJycnY29tbWFuZCA6IFBSSU5UJycnCisgICAgcFswXSA9ICgnUFJJTlQnLCBbXSwgTm9uZSkKKworIyBHT1RPIHN0YXRlbWVudAorCisKK2RlZiBwX2NvbW1hbmRfZ290byhwKToKKyAgICAnJydjb21tYW5kIDogR09UTyBJTlRFR0VSJycnCisgICAgcFswXSA9ICgnR09UTycsIGludChwWzJdKSkKKworCitkZWYgcF9jb21tYW5kX2dvdG9fYmFkKHApOgorICAgICcnJ2NvbW1hbmQgOiBHT1RPIGVycm9yJycnCisgICAgcFswXSA9ICJJTlZBTElEIExJTkUgTlVNQkVSIElOIEdPVE8iCisKKyMgSUYtVEhFTiBzdGF0ZW1lbnQKKworCitkZWYgcF9jb21tYW5kX2lmKHApOgorICAgICcnJ2NvbW1hbmQgOiBJRiByZWxleHByIFRIRU4gSU5URUdFUicnJworICAgIHBbMF0gPSAoJ0lGJywgcFsyXSwgaW50KHBbNF0pKQorCisKK2RlZiBwX2NvbW1hbmRfaWZfYmFkKHApOgorICAgICcnJ2NvbW1hbmQgOiBJRiBlcnJvciBUSEVOIElOVEVHRVInJycKKyAgICBwWzBdID0gIkJBRCBSRUxBVElPTkFMIEVYUFJFU1NJT04iCisKKworZGVmIHBfY29tbWFuZF9pZl9iYWQyKHApOgorICAgICcnJ2NvbW1hbmQgOiBJRiByZWxleHByIFRIRU4gZXJyb3InJycKKyAgICBwWzBdID0gIklOVkFMSUQgTElORSBOVU1CRVIgSU4gVEhFTiIKKworIyBGT1Igc3RhdGVtZW50CisKKworZGVmIHBfY29tbWFuZF9mb3IocCk6CisgICAgJycnY29tbWFuZCA6IEZPUiBJRCBFUVVBTFMgZXhwciBUTyBleHByIG9wdHN0ZXAnJycKKyAgICBwWzBdID0gKCdGT1InLCBwWzJdLCBwWzRdLCBwWzZdLCBwWzddKQorCisKK2RlZiBwX2NvbW1hbmRfZm9yX2JhZF9pbml0aWFsKHApOgorICAgICcnJ2NvbW1hbmQgOiBGT1IgSUQgRVFVQUxTIGVycm9yIFRPIGV4cHIgb3B0c3RlcCcnJworICAgIHBbMF0gPSAiQkFEIElOSVRJQUwgVkFMVUUgSU4gRk9SIFNUQVRFTUVOVCIKKworCitkZWYgcF9jb21tYW5kX2Zvcl9iYWRfZmluYWwocCk6CisgICAgJycnY29tbWFuZCA6IEZPUiBJRCBFUVVBTFMgZXhwciBUTyBlcnJvciBvcHRzdGVwJycnCisgICAgcFswXSA9ICJCQUQgRklOQUwgVkFMVUUgSU4gRk9SIFNUQVRFTUVOVCIKKworCitkZWYgcF9jb21tYW5kX2Zvcl9iYWRfc3RlcChwKToKKyAgICAnJydjb21tYW5kIDogRk9SIElEIEVRVUFMUyBleHByIFRPIGV4cHIgU1RFUCBlcnJvcicnJworICAgIHBbMF0gPSAiTUFMRk9STUVEIFNURVAgSU4gRk9SIFNUQVRFTUVOVCIKKworIyBPcHRpb25hbCBTVEVQIHF1YWxpZmllciBvbiBGT1Igc3RhdGVtZW50CisKKworZGVmIHBfb3B0c3RlcChwKToKKyAgICAnJydvcHRzdGVwIDogU1RFUCBleHByCisgICAgICAgICAgICAgICB8IGVtcHR5JycnCisgICAgaWYgbGVuKHApID09IDM6CisgICAgICAgIHBbMF0gPSBwWzJdCisgICAgZWxzZToKKyAgICAgICAgcFswXSA9IE5vbmUKKworIyBORVhUIHN0YXRlbWVudAorCisKK2RlZiBwX2NvbW1hbmRfbmV4dChwKToKKyAgICAnJydjb21tYW5kIDogTkVYVCBJRCcnJworCisgICAgcFswXSA9ICgnTkVYVCcsIHBbMl0pCisKKworZGVmIHBfY29tbWFuZF9uZXh0X2JhZChwKToKKyAgICAnJydjb21tYW5kIDogTkVYVCBlcnJvcicnJworICAgIHBbMF0gPSAiTUFMRk9STUVEIE5FWFQiCisKKyMgRU5EIHN0YXRlbWVudAorCisKK2RlZiBwX2NvbW1hbmRfZW5kKHApOgorICAgICcnJ2NvbW1hbmQgOiBFTkQnJycKKyAgICBwWzBdID0gKCdFTkQnLCkKKworIyBSRU0gc3RhdGVtZW50CisKKworZGVmIHBfY29tbWFuZF9yZW0ocCk6CisgICAgJycnY29tbWFuZCA6IFJFTScnJworICAgIHBbMF0gPSAoJ1JFTScsIHBbMV0pCisKKyMgU1RPUCBzdGF0ZW1lbnQKKworCitkZWYgcF9jb21tYW5kX3N0b3AocCk6CisgICAgJycnY29tbWFuZCA6IFNUT1AnJycKKyAgICBwWzBdID0gKCdTVE9QJywpCisKKyMgREVGIHN0YXRlbWVudAorCisKK2RlZiBwX2NvbW1hbmRfZGVmKHApOgorICAgICcnJ2NvbW1hbmQgOiBERUYgSUQgTFBBUkVOIElEIFJQQVJFTiBFUVVBTFMgZXhwcicnJworICAgIHBbMF0gPSAoJ0ZVTkMnLCBwWzJdLCBwWzRdLCBwWzddKQorCisKK2RlZiBwX2NvbW1hbmRfZGVmX2JhZF9yaHMocCk6CisgICAgJycnY29tbWFuZCA6IERFRiBJRCBMUEFSRU4gSUQgUlBBUkVOIEVRVUFMUyBlcnJvcicnJworICAgIHBbMF0gPSAiQkFEIEVYUFJFU1NJT04gSU4gREVGIFNUQVRFTUVOVCIKKworCitkZWYgcF9jb21tYW5kX2RlZl9iYWRfYXJnKHApOgorICAgICcnJ2NvbW1hbmQgOiBERUYgSUQgTFBBUkVOIGVycm9yIFJQQVJFTiBFUVVBTFMgZXhwcicnJworICAgIHBbMF0gPSAiQkFEIEFSR1VNRU5UIElOIERFRiBTVEFURU1FTlQiCisKKyMgR09TVUIgc3RhdGVtZW50CisKKworZGVmIHBfY29tbWFuZF9nb3N1YihwKToKKyAgICAnJydjb21tYW5kIDogR09TVUIgSU5URUdFUicnJworICAgIHBbMF0gPSAoJ0dPU1VCJywgaW50KHBbMl0pKQorCisKK2RlZiBwX2NvbW1hbmRfZ29zdWJfYmFkKHApOgorICAgICcnJ2NvbW1hbmQgOiBHT1NVQiBlcnJvcicnJworICAgIHBbMF0gPSAiSU5WQUxJRCBMSU5FIE5VTUJFUiBJTiBHT1NVQiIKKworIyBSRVRVUk4gc3RhdGVtZW50CisKKworZGVmIHBfY29tbWFuZF9yZXR1cm4ocCk6CisgICAgJycnY29tbWFuZCA6IFJFVFVSTicnJworICAgIHBbMF0gPSAoJ1JFVFVSTicsKQorCisjIERJTSBzdGF0ZW1lbnQKKworCitkZWYgcF9jb21tYW5kX2RpbShwKToKKyAgICAnJydjb21tYW5kIDogRElNIGRpbWxpc3QnJycKKyAgICBwWzBdID0gKCdESU0nLCBwWzJdKQorCisKK2RlZiBwX2NvbW1hbmRfZGltX2JhZChwKToKKyAgICAnJydjb21tYW5kIDogRElNIGVycm9yJycnCisgICAgcFswXSA9ICJNQUxGT1JNRUQgVkFSSUFCTEUgTElTVCBJTiBESU0iCisKKyMgTGlzdCBvZiB2YXJpYWJsZXMgc3VwcGxpZWQgdG8gRElNIHN0YXRlbWVudAorCisKK2RlZiBwX2RpbWxpc3QocCk6CisgICAgJycnZGltbGlzdCA6IGRpbWxpc3QgQ09NTUEgZGltaXRlbQorICAgICAgICAgICAgICAgfCBkaW1pdGVtJycnCisgICAgaWYgbGVuKHApID09IDQ6CisgICAgICAgIHBbMF0gPSBwWzFdCisgICAgICAgIHBbMF0uYXBwZW5kKHBbM10pCisgICAgZWxzZToKKyAgICAgICAgcFswXSA9IFtwWzFdXQorCisjIERJTSBpdGVtcworCisKK2RlZiBwX2RpbWl0ZW1fc2luZ2xlKHApOgorICAgICcnJ2RpbWl0ZW0gOiBJRCBMUEFSRU4gSU5URUdFUiBSUEFSRU4nJycKKyAgICBwWzBdID0gKHBbMV0sIGV2YWwocFszXSksIDApCisKKworZGVmIHBfZGltaXRlbV9kb3VibGUocCk6CisgICAgJycnZGltaXRlbSA6IElEIExQQVJFTiBJTlRFR0VSIENPTU1BIElOVEVHRVIgUlBBUkVOJycnCisgICAgcFswXSA9IChwWzFdLCBldmFsKHBbM10pLCBldmFsKHBbNV0pKQorCisjIEFyaXRobWV0aWMgZXhwcmVzc2lvbnMKKworCitkZWYgcF9leHByX2JpbmFyeShwKToKKyAgICAnJydleHByIDogZXhwciBQTFVTIGV4cHIKKyAgICAgICAgICAgIHwgZXhwciBNSU5VUyBleHByCisgICAgICAgICAgICB8IGV4cHIgVElNRVMgZXhwcgorICAgICAgICAgICAgfCBleHByIERJVklERSBleHByCisgICAgICAgICAgICB8IGV4cHIgUE9XRVIgZXhwcicnJworCisgICAgcFswXSA9ICgnQklOT1AnLCBwWzJdLCBwWzFdLCBwWzNdKQorCisKK2RlZiBwX2V4cHJfbnVtYmVyKHApOgorICAgICcnJ2V4cHIgOiBJTlRFR0VSCisgICAgICAgICAgICB8IEZMT0FUJycnCisgICAgcFswXSA9ICgnTlVNJywgZXZhbChwWzFdKSkKKworCitkZWYgcF9leHByX3ZhcmlhYmxlKHApOgorICAgICcnJ2V4cHIgOiB2YXJpYWJsZScnJworICAgIHBbMF0gPSAoJ1ZBUicsIHBbMV0pCisKKworZGVmIHBfZXhwcl9ncm91cChwKToKKyAgICAnJydleHByIDogTFBBUkVOIGV4cHIgUlBBUkVOJycnCisgICAgcFswXSA9ICgnR1JPVVAnLCBwWzJdKQorCisKK2RlZiBwX2V4cHJfdW5hcnkocCk6CisgICAgJycnZXhwciA6IE1JTlVTIGV4cHIgJXByZWMgVU1JTlVTJycnCisgICAgcFswXSA9ICgnVU5BUlknLCAnLScsIHBbMl0pCisKKyMgUmVsYXRpb25hbCBleHByZXNzaW9ucworCisKK2RlZiBwX3JlbGV4cHIocCk6CisgICAgJycncmVsZXhwciA6IGV4cHIgTFQgZXhwcgorICAgICAgICAgICAgICAgfCBleHByIExFIGV4cHIKKyAgICAgICAgICAgICAgIHwgZXhwciBHVCBleHByCisgICAgICAgICAgICAgICB8IGV4cHIgR0UgZXhwcgorICAgICAgICAgICAgICAgfCBleHByIEVRVUFMUyBleHByCisgICAgICAgICAgICAgICB8IGV4cHIgTkUgZXhwcicnJworICAgIHBbMF0gPSAoJ1JFTE9QJywgcFsyXSwgcFsxXSwgcFszXSkKKworIyBWYXJpYWJsZXMKKworCitkZWYgcF92YXJpYWJsZShwKToKKyAgICAnJyd2YXJpYWJsZSA6IElECisgICAgICAgICAgICAgIHwgSUQgTFBBUkVOIGV4cHIgUlBBUkVOCisgICAgICAgICAgICAgIHwgSUQgTFBBUkVOIGV4cHIgQ09NTUEgZXhwciBSUEFSRU4nJycKKyAgICBpZiBsZW4ocCkgPT0gMjoKKyAgICAgICAgcFswXSA9IChwWzFdLCBOb25lLCBOb25lKQorICAgIGVsaWYgbGVuKHApID09IDU6CisgICAgICAgIHBbMF0gPSAocFsxXSwgcFszXSwgTm9uZSkKKyAgICBlbHNlOgorICAgICAgICBwWzBdID0gKHBbMV0sIHBbM10sIHBbNV0pCisKKyMgQnVpbGRzIGEgbGlzdCBvZiB2YXJpYWJsZSB0YXJnZXRzIGFzIGEgUHl0aG9uIGxpc3QKKworCitkZWYgcF92YXJsaXN0KHApOgorICAgICcnJ3Zhcmxpc3QgOiB2YXJsaXN0IENPTU1BIHZhcmlhYmxlCisgICAgICAgICAgICAgICB8IHZhcmlhYmxlJycnCisgICAgaWYgbGVuKHApID4gMjoKKyAgICAgICAgcFswXSA9IHBbMV0KKyAgICAgICAgcFswXS5hcHBlbmQocFszXSkKKyAgICBlbHNlOgorICAgICAgICBwWzBdID0gW3BbMV1dCisKKworIyBCdWlsZHMgYSBsaXN0IG9mIG51bWJlcnMgYXMgYSBQeXRob24gbGlzdAorCitkZWYgcF9udW1saXN0KHApOgorICAgICcnJ251bWxpc3QgOiBudW1saXN0IENPTU1BIG51bWJlcgorICAgICAgICAgICAgICAgfCBudW1iZXInJycKKworICAgIGlmIGxlbihwKSA+IDI6CisgICAgICAgIHBbMF0gPSBwWzFdCisgICAgICAgIHBbMF0uYXBwZW5kKHBbM10pCisgICAgZWxzZToKKyAgICAgICAgcFswXSA9IFtwWzFdXQorCisjIEEgbnVtYmVyLiBNYXkgYmUgYW4gaW50ZWdlciBvciBhIGZsb2F0CisKKworZGVmIHBfbnVtYmVyKHApOgorICAgICcnJ251bWJlciAgOiBJTlRFR0VSCisgICAgICAgICAgICAgICB8IEZMT0FUJycnCisgICAgcFswXSA9IGV2YWwocFsxXSkKKworIyBBIHNpZ25lZCBudW1iZXIuCisKKworZGVmIHBfbnVtYmVyX3NpZ25lZChwKToKKyAgICAnJydudW1iZXIgIDogTUlOVVMgSU5URUdFUgorICAgICAgICAgICAgICAgfCBNSU5VUyBGTE9BVCcnJworICAgIHBbMF0gPSBldmFsKCItIiArIHBbMl0pCisKKyMgTGlzdCBvZiB0YXJnZXRzIGZvciBhIHByaW50IHN0YXRlbWVudAorIyBSZXR1cm5zIGEgbGlzdCBvZiB0dXBsZXMgKGxhYmVsLGV4cHIpCisKKworZGVmIHBfcGxpc3QocCk6CisgICAgJycncGxpc3QgICA6IHBsaXN0IENPTU1BIHBpdGVtCisgICAgICAgICAgICAgICB8IHBpdGVtJycnCisgICAgaWYgbGVuKHApID4gMzoKKyAgICAgICAgcFswXSA9IHBbMV0KKyAgICAgICAgcFswXS5hcHBlbmQocFszXSkKKyAgICBlbHNlOgorICAgICAgICBwWzBdID0gW3BbMV1dCisKKworZGVmIHBfaXRlbV9zdHJpbmcocCk6CisgICAgJycncGl0ZW0gOiBTVFJJTkcnJycKKyAgICBwWzBdID0gKHBbMV1bMTotMV0sIE5vbmUpCisKKworZGVmIHBfaXRlbV9zdHJpbmdfZXhwcihwKToKKyAgICAnJydwaXRlbSA6IFNUUklORyBleHByJycnCisgICAgcFswXSA9IChwWzFdWzE6LTFdLCBwWzJdKQorCisKK2RlZiBwX2l0ZW1fZXhwcihwKToKKyAgICAnJydwaXRlbSA6IGV4cHInJycKKyAgICBwWzBdID0gKCIiLCBwWzFdKQorCisjIEVtcHR5CisKKworZGVmIHBfZW1wdHkocCk6CisgICAgJycnZW1wdHkgOiAnJycKKworIyBDYXRhc3Ryb3BoaWMgZXJyb3IgaGFuZGxlcgorCisKK2RlZiBwX2Vycm9yKHApOgorICAgIGlmIG5vdCBwOgorICAgICAgICBwcmludCgiU1lOVEFYIEVSUk9SIEFUIEVPRiIpCisKK2JwYXJzZXIgPSB5YWNjLnlhY2MoKQorCisKK2RlZiBwYXJzZShkYXRhLCBkZWJ1Zz0wKToKKyAgICBicGFyc2VyLmVycm9yID0gMAorICAgIHAgPSBicGFyc2VyLnBhcnNlKGRhdGEsIGRlYnVnPWRlYnVnKQorICAgIGlmIGJwYXJzZXIuZXJyb3I6CisgICAgICAgIHJldHVybiBOb25lCisgICAgcmV0dXJuIHAKZGlmZiAtLWdpdCBhL3BseS9leGFtcGxlL0JBU0lDL2RpbS5iYXMgYi9wbHkvZXhhbXBsZS9CQVNJQy9kaW0uYmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YmQ5NWIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvZXhhbXBsZS9CQVNJQy9kaW0uYmFzCkBAIC0wLDAgKzEsMTQgQEAKKzUgRElNIEEoNTAsMTUpCisxMCBGT1IgSSA9IDEgVE8gNTAKKzIwIEZPUiBKID0gMSBUTyAxNQorMzAgICBMRVQgQShJLEopID0gSSArIEoKKzM1IFJFTSAgUFJJTlQgSSxKLCBBKEksSikKKzQwIE5FWFQgSgorNTAgTkVYVCBJCisxMDAgRk9SIEkgPSAxIFRPIDUwCisxMTAgRk9SIEogPSAxIFRPIDE1CisxMjAgICBQUklOVCBBKEksSiksCisxMzAgTkVYVCBKCisxNDAgUFJJTlQgCisxNTAgTkVYVCBJCis5OTkgRU5ECmRpZmYgLS1naXQgYS9wbHkvZXhhbXBsZS9CQVNJQy9mdW5jLmJhcyBiL3BseS9leGFtcGxlL0JBU0lDL2Z1bmMuYmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0N2VlMTYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvZXhhbXBsZS9CQVNJQy9mdW5jLmJhcwpAQCAtMCwwICsxLDUgQEAKKzEwIERFRiBGRFgoWCkgPSAyKlgKKzIwIEZPUiBJID0gMCBUTyAxMDAKKzMwIFBSSU5UIEZEWChJKQorNDAgTkVYVCBJCis1MCBFTkQKZGlmZiAtLWdpdCBhL3BseS9leGFtcGxlL0JBU0lDL2djZC5iYXMgYi9wbHkvZXhhbXBsZS9CQVNJQy9nY2QuYmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYjc3NDYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvZXhhbXBsZS9CQVNJQy9nY2QuYmFzCkBAIC0wLDAgKzEsMjIgQEAKKzEwIFBSSU5UICJBIiwiQiIsIkMiLCJHQ0QiCisyMCBSRUFEIEEsQixDCiszMCBMRVQgWCA9IEEKKzQwIExFVCBZID0gQgorNTAgR09TVUIgMjAwCis2MCBMRVQgWCA9IEcKKzcwIExFVCBZID0gQworODAgR09TVUIgMjAwCis5MCBQUklOVCBBLCBCLCBDLCBHCisxMDAgR09UTyAyMAorMTEwIERBVEEgNjAsIDkwLCAxMjAKKzEyMCBEQVRBIDM4NDU2LCA2NDg3MiwgOTg3NjUKKzEzMCBEQVRBIDMyLCAzODQsIDcyCisyMDAgTEVUIFEgPSBJTlQoWC9ZKQorMjEwIExFVCBSID0gWCAtIFEqWQorMjIwIElGIFIgPSAwIFRIRU4gMzAwCisyMzAgTEVUIFggPSBZCisyNDAgTEVUIFkgPSBSCisyNTAgR09UTyAyMDAKKzMwMCBMRVQgRyA9IFkKKzMxMCBSRVRVUk4KKzk5OSBFTkQKZGlmZiAtLWdpdCBhL3BseS9leGFtcGxlL0JBU0lDL2dvc3ViLmJhcyBiL3BseS9leGFtcGxlL0JBU0lDL2dvc3ViLmJhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTczN2IxCi0tLSAvZGV2L251bGwKKysrIGIvcGx5L2V4YW1wbGUvQkFTSUMvZ29zdWIuYmFzCkBAIC0wLDAgKzEsMTMgQEAKKzEwMCBMRVQgWCA9IDMKKzExMCBHT1NVQiA0MDAKKzEyMCBQUklOVCBVLCBWLCBXCisyMDAgTEVUIFggPSA1CisyMTAgR09TVUIgNDAwCisyMjAgTEVUIFogPSBVICsgMipWICsgMypXCisyMzAgUFJJTlQgWgorMjQwIEdPVE8gOTk5Cis0MDAgTEVUIFUgPSBYKlgKKzQxMCBMRVQgViA9IFgqWCpYCis0MjAgTEVUIFcgPSBYKlgqWCpYICsgWCpYKlggKyBYKlggKyBYCis0MzAgUkVUVVJOCis5OTkgRU5ECmRpZmYgLS1naXQgYS9wbHkvZXhhbXBsZS9CQVNJQy9oZWxsby5iYXMgYi9wbHkvZXhhbXBsZS9CQVNJQy9oZWxsby5iYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M2ZjBiMAotLS0gL2Rldi9udWxsCisrKyBiL3BseS9leGFtcGxlL0JBU0lDL2hlbGxvLmJhcwpAQCAtMCwwICsxLDQgQEAKKzUgIFJFTSBIRUxMTyBXT1JMRCBQUk9HQU0KKzEwIFBSSU5UICJIRUxMTyBXT1JMRCIKKzk5IEVORAorCmRpZmYgLS1naXQgYS9wbHkvZXhhbXBsZS9CQVNJQy9saW5lYXIuYmFzIGIvcGx5L2V4YW1wbGUvQkFTSUMvbGluZWFyLmJhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmMwODIyCi0tLSAvZGV2L251bGwKKysrIGIvcGx5L2V4YW1wbGUvQkFTSUMvbGluZWFyLmJhcwpAQCAtMCwwICsxLDE3IEBACisxICBSRU0gOjo6IFNPTFZFIEEgU1lTVEVNIE9GIExJTkVBUiBFUVVBVElPTlMKKzIgIFJFTSA6OjogQTEqWDEgKyBBMipYMiA9IEIxCiszICBSRU0gOjo6IEEzKlgxICsgQTQqWDIgPSBCMgorNCAgUkVNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisxMCBSRUFEIEExLCBBMiwgQTMsIEE0CisxNSBMRVQgRCA9IEExICogQTQgLSBBMyAqIEEyCisyMCBJRiBEID0gMCBUSEVOIDY1CiszMCBSRUFEIEIxLCBCMgorMzcgTEVUIFgxID0gKEIxKkE0IC0gQjIqQTIpIC8gRAorNDIgTEVUIFgyID0gKEExKkIyIC0gQTMqQjEpIC8gRAorNTUgUFJJTlQgWDEsIFgyCis2MCBHT1RPIDMwCis2NSBQUklOVCAiTk8gVU5JUVVFIFNPTFVUSU9OIgorNzAgREFUQSAxLCAyLCA0Cis4MCBEQVRBIDIsIC03LCA1Cis4NSBEQVRBIDEsIDMsIDQsIC03Cis5MCBFTkQKZGlmZiAtLWdpdCBhL3BseS9leGFtcGxlL0JBU0lDL21heHNpbi5iYXMgYi9wbHkvZXhhbXBsZS9CQVNJQy9tYXhzaW4uYmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NjkwMTUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvZXhhbXBsZS9CQVNJQy9tYXhzaW4uYmFzCkBAIC0wLDAgKzEsMTIgQEAKKzUgUFJJTlQgIlggVkFMVUUiLCAiU0lORSIsICJSRVNPTFVUSU9OIgorMTAgUkVBRCBECisyMCBMRVQgTSA9IC0xCiszMCBGT1IgWCA9IDAgVE8gMyBTVEVQIEQKKzQwIElGIFNJTihYKSA8PSBNIFRIRU4gODAKKzUwIExFVCBYMCA9IFgKKzYwIExFVCBNID0gU0lOKFgpCis4MCBORVhUIFgKKzg1IFBSSU5UIFgwLCBNLCBECis5MCBHT1RPIDEwCisxMDAgREFUQSAuMSwgLjAxLCAuMDAxCisxMTAgRU5ECmRpZmYgLS1naXQgYS9wbHkvZXhhbXBsZS9CQVNJQy9wb3dlcnMuYmFzIGIvcGx5L2V4YW1wbGUvQkFTSUMvcG93ZXJzLmJhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDU0ZGMzCi0tLSAvZGV2L251bGwKKysrIGIvcGx5L2V4YW1wbGUvQkFTSUMvcG93ZXJzLmJhcwpAQCAtMCwwICsxLDEzIEBACis1IFBSSU5UICJUSElTIFBST0dSQU0gQ09NUFVURVMgQU5EIFBSSU5UUyBUSEUgTlRIIFBPV0VSUyIKKzYgUFJJTlQgIk9GIFRIRSBOVU1CRVJTIExFU1MgVEhBTiBPUiBFUVVBTCBUTyBOIEZPUiBWQVJJT1VTIgorNyBQUklOVCAiTiBGUk9NIDEgVEhST1VHSCA3IgorOCBQUklOVAorMTAgRk9SIE4gPSAxIFRPIDcKKzE1IFBSSU5UICJOID0gIk4KKzIwIEZPUiBJID0gMSBUTyBOCiszMCBQUklOVCBJXk4sCis0MCBORVhUIEkKKzUwIFBSSU5UCis2MCBQUklOVAorNzAgTkVYVCBOCis4MCBFTkQKZGlmZiAtLWdpdCBhL3BseS9leGFtcGxlL0JBU0lDL3JhbmQuYmFzIGIvcGx5L2V4YW1wbGUvQkFTSUMvcmFuZC5iYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZmN2ExNAotLS0gL2Rldi9udWxsCisrKyBiL3BseS9leGFtcGxlL0JBU0lDL3JhbmQuYmFzCkBAIC0wLDAgKzEsNCBAQAorMTAgRk9SIEkgPSAxIFRPIDIwCisyMCBQUklOVCBJTlQoMTAqUk5EKDApKQorMzAgTkVYVCBJCis0MCBFTkQKZGlmZiAtLWdpdCBhL3BseS9leGFtcGxlL0JBU0lDL3NhbGVzLmJhcyBiL3BseS9leGFtcGxlL0JBU0lDL3NhbGVzLmJhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzlhZWZiCi0tLSAvZGV2L251bGwKKysrIGIvcGx5L2V4YW1wbGUvQkFTSUMvc2FsZXMuYmFzCkBAIC0wLDAgKzEsMjAgQEAKKzEwIEZPUiBJID0gMSBUTyAzCisyMCBSRUFEIFAoSSkKKzMwIE5FWFQgSQorNDAgRk9SIEkgPSAxIFRPIDMKKzUwIEZPUiBKID0gMSBUTyA1Cis2MCBSRUFEIFMoSSxKKQorNzAgTkVYVCBKCis4MCBORVhUIEkKKzkwIEZPUiBKID0gMSBUTyA1CisxMDAgTEVUIFMgPSAwCisxMTAgRk9SIEkgPSAxIFRPIDMKKzEyMCBMRVQgUyA9IFMgKyBQKEkpICogUyhJLEopCisxMzAgTkVYVCBJCisxNDAgUFJJTlQgIlRPVEFMIFNBTEVTIEZPUiBTQUxFU01BTiJKLCAiJCJTCisxNTAgTkVYVCBKCisyMDAgREFUQSAxLjI1LCA0LjMwLCAyLjUwCisyMTAgREFUQSA0MCwgMjAsIDM3LCAyOSwgNDIKKzIyMCBEQVRBIDEwLCAxNiwgMywgMjEsIDgKKzIzMCBEQVRBIDM1LCA0NywgMjksIDE2LCAzMworMzAwIEVORApkaWZmIC0tZ2l0IGEvcGx5L2V4YW1wbGUvQkFTSUMvc2VhcnMuYmFzIGIvcGx5L2V4YW1wbGUvQkFTSUMvc2VhcnMuYmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZWQzOTcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvZXhhbXBsZS9CQVNJQy9zZWFycy5iYXMKQEAgLTAsMCArMSwxOCBAQAorMSBSRU0gOjogVEhJUyBQUk9HUkFNIENPTVBVVEVTIEhPVyBNQU5ZIFRJTUVTIFlPVSBIQVZFIFRPIEZPTEQKKzIgUkVNIDo6IEEgUElFQ0UgT0YgUEFQRVIgU08gVEhBVCBJVCBJUyBUQUxMRVIgVEhBTiBUSEUKKzMgUkVNIDo6IFNFQVJTIFRPV0VSLgorNCBSRU0gOjogICAgICAgUyA9IEhFSUdIVCBPRiBUT1dFUiAoTUVURVJTKQorNSBSRU0gOjogICAgICAgVCA9IFRISUNLTkVTUyBPRiBQQVBFUiAoTUlMTElNRVRFUlMpCisxMCBMRVQgUyA9IDQ0MgorMjAgTEVUIFQgPSAwLjEKKzMwIFJFTSBDT05WRVJUIFQgVE8gTUVURVJTCis0MCBMRVQgVCA9IFQgKiAuMDAxCis1MCBMRVQgRiA9IDEKKzYwIExFVCBIID0gVAorMTAwIElGIEggPiBTIFRIRU4gMjAwCisxMjAgTEVUIEggPSAyICogSAorMTI1IExFVCBGID0gRiArIDEKKzEzMCBHT1RPIDEwMAorMjAwIFBSSU5UICJOVU1CRVIgT0YgRk9MRFMgPSJGCisyMjAgUFJJTlQgIkZJTkFMIEhFSUdIVCAgICA9IkgKKzk5OSBFTkQKZGlmZiAtLWdpdCBhL3BseS9leGFtcGxlL0JBU0lDL3NxcnQxLmJhcyBiL3BseS9leGFtcGxlL0JBU0lDL3NxcnQxLmJhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjczYTkxCi0tLSAvZGV2L251bGwKKysrIGIvcGx5L2V4YW1wbGUvQkFTSUMvc3FydDEuYmFzCkBAIC0wLDAgKzEsNSBAQAorMTAgTEVUIFggPSAwCisyMCBMRVQgWCA9IFggKyAxCiszMCBQUklOVCBYLCBTUVIoWCkKKzQwIElGIFggPCAxMDAgVEhFTiAyMAorNTAgRU5ECmRpZmYgLS1naXQgYS9wbHkvZXhhbXBsZS9CQVNJQy9zcXJ0Mi5iYXMgYi9wbHkvZXhhbXBsZS9CQVNJQy9zcXJ0Mi5iYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYyZDg1ZQotLS0gL2Rldi9udWxsCisrKyBiL3BseS9leGFtcGxlL0JBU0lDL3NxcnQyLmJhcwpAQCAtMCwwICsxLDQgQEAKKzEwIEZPUiBYID0gMSBUTyAxMDAKKzIwIFBSSU5UIFgsIFNRUihYKQorMzAgTkVYVCBYCis0MCBFTkQKZGlmZiAtLWdpdCBhL3BseS9leGFtcGxlL0dhcmRlblNuYWtlL0dhcmRlblNuYWtlLnB5IGIvcGx5L2V4YW1wbGUvR2FyZGVuU25ha2UvR2FyZGVuU25ha2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI0OTNiNAotLS0gL2Rldi9udWxsCisrKyBiL3BseS9leGFtcGxlL0dhcmRlblNuYWtlL0dhcmRlblNuYWtlLnB5CkBAIC0wLDAgKzEsNzc3IEBACisjIEdhcmRlblNuYWtlIC0gYSBwYXJzZXIgZ2VuZXJhdG9yIGRlbW9uc3RyYXRpb24gcHJvZ3JhbQorIworIyBUaGlzIGltcGxlbWVudHMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIGEgc3Vic2V0IG9mIFB5dGhvbjoKKyMgIC0gb25seSAnZGVmJywgJ3JldHVybicgYW5kICdpZicgc3RhdGVtZW50cworIyAgLSAnaWYnIG9ubHkgaGFzICd0aGVuJyBjbGF1c2UgKG5vIGVsaWYgbm9yIGVsc2UpCisjICAtIHNpbmdsZS1xdW90ZWQgc3RyaW5ncyBvbmx5LCBjb250ZW50IGluIHJhdyBmb3JtYXQKKyMgIC0gbnVtYmVycyBhcmUgZGVjaW1hbC5EZWNpbWFsIGluc3RhbmNlcyAobm90IGludGVnZXJzIG9yIGZsb2F0cykKKyMgIC0gbm8gcHJpbnQgc3RhdG1lbnQ7IHVzZSB0aGUgYnVpbHQtaW4gJ3ByaW50JyBmdW5jdGlvbgorIyAgLSBvbmx5IDwgPiA9PSArIC0gLyAqIGltcGxlbWVudGVkIChhbmQgdW5hcnkgKyAtKQorIyAgLSBhc3NpZ25tZW50IGFuZCB0dXBsZSBhc3NpZ25tZW50IHdvcmsKKyMgIC0gbm8gZ2VuZXJhdG9ycyBvZiBhbnkgc29ydAorIyAgLSBubyAuLi4gd2VsbCwgbm8gcXVpdGUgYSBsb3QKKworIyBXaHk/ICBJJ20gdGhpbmtpbmcgYWJvdXQgYSBuZXcgaW5kZW50YXRpb24tYmFzZWQgY29uZmlndXJhdGlvbgorIyBsYW5ndWFnZSBmb3IgYSBwcm9qZWN0IGFuZCB3YW50ZWQgdG8gZmlndXJlIG91dCBob3cgdG8gZG8gaXQuICBPbmNlCisjIEkgZ290IHRoYXQgd29ya2luZyBJIG5lZWRlZCBhIHdheSB0byB0ZXN0IGl0IG91dC4gIE15IG9yaWdpbmFsIEFTVAorIyB3YXMgZHVtYiBzbyBJIGRlY2lkZWQgdG8gdGFyZ2V0IFB5dGhvbidzIEFTVCBhbmQgY29tcGlsZSBpdCBpbnRvCisjIFB5dGhvbiBjb2RlLiAgUGx1cywgaXQncyBwcmV0dHkgY29vbCB0aGF0IGl0IG9ubHkgdG9vayBhIGRheSBvciBzbworIyBmcm9tIHNpdHRpbmcgZG93biB3aXRoIFBseSB0byBoYXZpbmcgd29ya2luZyBjb2RlLgorCisjIFRoaXMgdXNlcyBEYXZpZCBCZWF6bGV5J3MgUGx5IGZyb20gaHR0cDovL3d3dy5kYWJlYXouY29tL3BseS8KKworIyBUaGlzIHdvcmsgaXMgaGVyZWJ5IHJlbGVhc2VkIGludG8gdGhlIFB1YmxpYyBEb21haW4uIFRvIHZpZXcgYSBjb3B5IG9mCisjIHRoZSBwdWJsaWMgZG9tYWluIGRlZGljYXRpb24sIHZpc2l0CisjIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbi8gb3Igc2VuZCBhIGxldHRlciB0bworIyBDcmVhdGl2ZSBDb21tb25zLCA1NDMgSG93YXJkIFN0cmVldCwgNXRoIEZsb29yLCBTYW4gRnJhbmNpc2NvLAorIyBDYWxpZm9ybmlhLCA5NDEwNSwgVVNBLgorIworIyBQb3J0aW9ucyBvZiB0aGlzIHdvcmsgYXJlIGRlcml2ZWQgZnJvbSBQeXRob24ncyBHcmFtbWFyIGRlZmluaXRpb24KKyMgYW5kIG1heSBiZSBjb3ZlcmVkIHVuZGVyIHRoZSBQeXRob24gY29weXJpZ2h0IGFuZCBsaWNlbnNlCisjCisjICAgICAgICAgIEFuZHJldyBEYWxrZSAvIERhbGtlIFNjaWVudGlmaWMgU29mdHdhcmUsIExMQworIyAgICAgICAgICAgICAzMCBBdWd1c3QgMjAwNiAvIENhcGUgVG93biwgU291dGggQWZyaWNhCisKKyMgQ2hhbmdlbG9nOgorIyAgMzAgQXVndXN0IC0gYWRkZWQgbGluayB0byBDQyBsaWNlbnNlOyByZW1vdmVkIHRoZSAic3dhcGNhc2UiIGVuY29kaW5nCisKKyMgTW9kaWZpY2F0aW9ucyBmb3IgaW5jbHVzaW9uIGluIFBMWSBkaXN0cmlidXRpb24KK2ltcG9ydCBzeXMKK3N5cy5wYXRoLmluc2VydCgwLCAiLi4vLi4iKQorZnJvbSBwbHkgaW1wb3J0ICoKKworIyMjIyMgTGV4ZXIgIyMjIyMjCisjaW1wb3J0IGxleAoraW1wb3J0IGRlY2ltYWwKKwordG9rZW5zID0gKAorICAgICdERUYnLAorICAgICdJRicsCisgICAgJ05BTUUnLAorICAgICdOVU1CRVInLCAgIyBQeXRob24gZGVjaW1hbHMKKyAgICAnU1RSSU5HJywgICMgc2luZ2xlIHF1b3RlZCBzdHJpbmdzIG9ubHk7IHN5bnRheCBvZiByYXcgc3RyaW5ncworICAgICdMUEFSJywKKyAgICAnUlBBUicsCisgICAgJ0NPTE9OJywKKyAgICAnRVEnLAorICAgICdBU1NJR04nLAorICAgICdMVCcsCisgICAgJ0dUJywKKyAgICAnUExVUycsCisgICAgJ01JTlVTJywKKyAgICAnTVVMVCcsCisgICAgJ0RJVicsCisgICAgJ1JFVFVSTicsCisgICAgJ1dTJywKKyAgICAnTkVXTElORScsCisgICAgJ0NPTU1BJywKKyAgICAnU0VNSUNPTE9OJywKKyAgICAnSU5ERU5UJywKKyAgICAnREVERU5UJywKKyAgICAnRU5ETUFSS0VSJywKKykKKworI3RfTlVNQkVSID0gcidcZCsnCisjIHRha2VuIGZyb20gZGVjbWlhbC5weSBidXQgd2l0aG91dCB0aGUgbGVhZGluZyBzaWduCisKKworZGVmIHRfTlVNQkVSKHQpOgorICAgIHIiIiIoXGQrKFwuXGQqKT98XC5cZCspKFtlRV1bLStdPyBcZCspPyIiIgorICAgIHQudmFsdWUgPSBkZWNpbWFsLkRlY2ltYWwodC52YWx1ZSkKKyAgICByZXR1cm4gdAorCisKK2RlZiB0X1NUUklORyh0KToKKyAgICByIicoW15cXCddK3xcXCd8XFxcXCkqJyIgICMgSSB0aGluayB0aGlzIGlzIHJpZ2h0IC4uLgorICAgIHQudmFsdWUgPSB0LnZhbHVlWzE6LTFdLmRlY29kZSgic3RyaW5nLWVzY2FwZSIpICAjIC5zd2FwY2FzZSgpICMgZm9yIGZ1bgorICAgIHJldHVybiB0CisKK3RfQ09MT04gPSByJzonCit0X0VRID0gcic9PScKK3RfQVNTSUdOID0gcic9JwordF9MVCA9IHInPCcKK3RfR1QgPSByJz4nCit0X1BMVVMgPSByJ1wrJwordF9NSU5VUyA9IHInLScKK3RfTVVMVCA9IHInXConCit0X0RJViA9IHInLycKK3RfQ09NTUEgPSByJywnCit0X1NFTUlDT0xPTiA9IHInOycKKworIyBQbHkgbmljZWx5IGRvY3VtZW50ZWQgaG93IHRvIGRvIHRoaXMuCisKK1JFU0VSVkVEID0geworICAgICJkZWYiOiAiREVGIiwKKyAgICAiaWYiOiAiSUYiLAorICAgICJyZXR1cm4iOiAiUkVUVVJOIiwKK30KKworCitkZWYgdF9OQU1FKHQpOgorICAgIHInW2EtekEtWl9dW2EtekEtWjAtOV9dKicKKyAgICB0LnR5cGUgPSBSRVNFUlZFRC5nZXQodC52YWx1ZSwgIk5BTUUiKQorICAgIHJldHVybiB0CisKKyMgUHV0dGluZyB0aGlzIGJlZm9yZSB0X1dTIGxldCBpdCBjb25zdW1lIGxpbmVzIHdpdGggb25seSBjb21tZW50cyBpbgorIyB0aGVtIHNvIHRoZSBsYXR0ZXIgY29kZSBuZXZlciBzZWVzIHRoZSBXUyBwYXJ0LiAgTm90IGNvbnN1bWluZyB0aGUKKyMgbmV3bGluZS4gIE5lZWRlZCBmb3IgImlmIDE6ICNjb21tZW50IgorCisKK2RlZiB0X2NvbW1lbnQodCk6CisgICAgciJbIF0qXDA0M1teXG5dKiIgICMgXDA0MyBpcyAnIycKKyAgICBwYXNzCisKKworIyBXaGl0ZXNwYWNlCitkZWYgdF9XUyh0KToKKyAgICByJyBbIF0rICcKKyAgICBpZiB0LmxleGVyLmF0X2xpbmVfc3RhcnQgYW5kIHQubGV4ZXIucGFyZW5fY291bnQgPT0gMDoKKyAgICAgICAgcmV0dXJuIHQKKworIyBEb24ndCBnZW5lcmF0ZSBuZXdsaW5lIHRva2VucyB3aGVuIGluc2lkZSBvZiBwYXJlbnRoZXNpcywgZWcKKyMgICBhID0gKDEsCisjICAgICAgICAyLCAzKQorCisKK2RlZiB0X25ld2xpbmUodCk6CisgICAgcidcbisnCisgICAgdC5sZXhlci5saW5lbm8gKz0gbGVuKHQudmFsdWUpCisgICAgdC50eXBlID0gIk5FV0xJTkUiCisgICAgaWYgdC5sZXhlci5wYXJlbl9jb3VudCA9PSAwOgorICAgICAgICByZXR1cm4gdAorCisKK2RlZiB0X0xQQVIodCk6CisgICAgcidcKCcKKyAgICB0LmxleGVyLnBhcmVuX2NvdW50ICs9IDEKKyAgICByZXR1cm4gdAorCisKK2RlZiB0X1JQQVIodCk6CisgICAgcidcKScKKyAgICAjIGNoZWNrIGZvciB1bmRlcmZsb3c/ICBzaG91bGQgYmUgdGhlIGpvYiBvZiB0aGUgcGFyc2VyCisgICAgdC5sZXhlci5wYXJlbl9jb3VudCAtPSAxCisgICAgcmV0dXJuIHQKKworCitkZWYgdF9lcnJvcih0KToKKyAgICByYWlzZSBTeW50YXhFcnJvcigiVW5rbm93biBzeW1ib2wgJXIiICUgKHQudmFsdWVbMF0sKSkKKyAgICBwcmludCAiU2tpcHBpbmciLCByZXByKHQudmFsdWVbMF0pCisgICAgdC5sZXhlci5za2lwKDEpCisKKyMgSSBpbXBsZW1lbnRlZCBJTkRFTlQgLyBERURFTlQgZ2VuZXJhdGlvbiBhcyBhIHBvc3QtcHJvY2Vzc2luZyBmaWx0ZXIKKworIyBUaGUgb3JpZ2luYWwgbGV4IHRva2VuIHN0cmVhbSBjb250YWlucyBXUyBhbmQgTkVXTElORSBjaGFyYWN0ZXJzLgorIyBXUyB3aWxsIG9ubHkgb2NjdXIgYmVmb3JlIGFueSBvdGhlciB0b2tlbnMgb24gYSBsaW5lLgorCisjIEkgaGF2ZSB0aHJlZSBmaWx0ZXJzLiAgT25lIHRhZ3MgdG9rZW5zIGJ5IGFkZGluZyB0d28gYXR0cmlidXRlcy4KKyMgIm11c3RfaW5kZW50IiBpcyBUcnVlIGlmIHRoZSB0b2tlbiBtdXN0IGJlIGluZGVudGVkIGZyb20gdGhlCisjIHByZXZpb3VzIGNvZGUuICBUaGUgb3RoZXIgaXMgImF0X2xpbmVfc3RhcnQiIHdoaWNoIGlzIFRydWUgZm9yIFdTCisjIGFuZCB0aGUgZmlyc3Qgbm9uLVdTL25vbi1ORVdMSU5FIG9uIGEgbGluZS4gIEl0IGZsYWdzIHRoZSBjaGVjayBzbworIyBzZWUgaWYgdGhlIG5ldyBsaW5lIGhhcyBjaGFuZ2VkIGluZGljYXRpb24gbGV2ZWwuCisKKyMgUHl0aG9uJ3Mgc3ludGF4IGhhcyB0aHJlZSBJTkRFTlQgc3RhdGVzCisjICAwKSBubyBjb2xvbiBoZW5jZSBubyBuZWVkIHRvIGluZGVudAorIyAgMSkgImlmIDE6IGdvKCkiIC0gc2ltcGxlIHN0YXRlbWVudHMgaGF2ZSBhIENPTE9OIGJ1dCBubyBuZWVkIGZvciBhbiBpbmRlbnQKKyMgIDIpICJpZiAxOlxuICBnbygpIiAtIGNvbXBsZXggc3RhdGVtZW50cyBoYXZlIGEgQ09MT04gTkVXTElORSBhbmQgbXVzdCBpbmRlbnQKK05PX0lOREVOVCA9IDAKK01BWV9JTkRFTlQgPSAxCitNVVNUX0lOREVOVCA9IDIKKworIyBvbmx5IGNhcmUgYWJvdXQgd2hpdGVzcGFjZSBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lCisKKworZGVmIHRyYWNrX3Rva2Vuc19maWx0ZXIobGV4ZXIsIHRva2Vucyk6CisgICAgbGV4ZXIuYXRfbGluZV9zdGFydCA9IGF0X2xpbmVfc3RhcnQgPSBUcnVlCisgICAgaW5kZW50ID0gTk9fSU5ERU5UCisgICAgc2F3X2NvbG9uID0gRmFsc2UKKyAgICBmb3IgdG9rZW4gaW4gdG9rZW5zOgorICAgICAgICB0b2tlbi5hdF9saW5lX3N0YXJ0ID0gYXRfbGluZV9zdGFydAorCisgICAgICAgIGlmIHRva2VuLnR5cGUgPT0gIkNPTE9OIjoKKyAgICAgICAgICAgIGF0X2xpbmVfc3RhcnQgPSBGYWxzZQorICAgICAgICAgICAgaW5kZW50ID0gTUFZX0lOREVOVAorICAgICAgICAgICAgdG9rZW4ubXVzdF9pbmRlbnQgPSBGYWxzZQorCisgICAgICAgIGVsaWYgdG9rZW4udHlwZSA9PSAiTkVXTElORSI6CisgICAgICAgICAgICBhdF9saW5lX3N0YXJ0ID0gVHJ1ZQorICAgICAgICAgICAgaWYgaW5kZW50ID09IE1BWV9JTkRFTlQ6CisgICAgICAgICAgICAgICAgaW5kZW50ID0gTVVTVF9JTkRFTlQKKyAgICAgICAgICAgIHRva2VuLm11c3RfaW5kZW50ID0gRmFsc2UKKworICAgICAgICBlbGlmIHRva2VuLnR5cGUgPT0gIldTIjoKKyAgICAgICAgICAgIGFzc2VydCB0b2tlbi5hdF9saW5lX3N0YXJ0ID09IFRydWUKKyAgICAgICAgICAgIGF0X2xpbmVfc3RhcnQgPSBUcnVlCisgICAgICAgICAgICB0b2tlbi5tdXN0X2luZGVudCA9IEZhbHNlCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgQSByZWFsIHRva2VuOyBvbmx5IGluZGVudCBhZnRlciBDT0xPTiBORVdMSU5FCisgICAgICAgICAgICBpZiBpbmRlbnQgPT0gTVVTVF9JTkRFTlQ6CisgICAgICAgICAgICAgICAgdG9rZW4ubXVzdF9pbmRlbnQgPSBUcnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRva2VuLm11c3RfaW5kZW50ID0gRmFsc2UKKyAgICAgICAgICAgIGF0X2xpbmVfc3RhcnQgPSBGYWxzZQorICAgICAgICAgICAgaW5kZW50ID0gTk9fSU5ERU5UCisKKyAgICAgICAgeWllbGQgdG9rZW4KKyAgICAgICAgbGV4ZXIuYXRfbGluZV9zdGFydCA9IGF0X2xpbmVfc3RhcnQKKworCitkZWYgX25ld190b2tlbih0eXBlLCBsaW5lbm8pOgorICAgIHRvayA9IGxleC5MZXhUb2tlbigpCisgICAgdG9rLnR5cGUgPSB0eXBlCisgICAgdG9rLnZhbHVlID0gTm9uZQorICAgIHRvay5saW5lbm8gPSBsaW5lbm8KKyAgICByZXR1cm4gdG9rCisKKyMgU3ludGhlc2l6ZSBhIERFREVOVCB0YWcKKworCitkZWYgREVERU5UKGxpbmVubyk6CisgICAgcmV0dXJuIF9uZXdfdG9rZW4oIkRFREVOVCIsIGxpbmVubykKKworIyBTeW50aGVzaXplIGFuIElOREVOVCB0YWcKKworCitkZWYgSU5ERU5UKGxpbmVubyk6CisgICAgcmV0dXJuIF9uZXdfdG9rZW4oIklOREVOVCIsIGxpbmVubykKKworCisjIFRyYWNrIHRoZSBpbmRlbnRhdGlvbiBsZXZlbCBhbmQgZW1pdCB0aGUgcmlnaHQgSU5ERU5UIC8gREVERU5UIGV2ZW50cy4KK2RlZiBpbmRlbnRhdGlvbl9maWx0ZXIodG9rZW5zKToKKyAgICAjIEEgc3RhY2sgb2YgaW5kZW50YXRpb24gbGV2ZWxzOyB3aWxsIG5ldmVyIHBvcCBpdGVtIDAKKyAgICBsZXZlbHMgPSBbMF0KKyAgICB0b2tlbiA9IE5vbmUKKyAgICBkZXB0aCA9IDAKKyAgICBwcmV2X3dhc193cyA9IEZhbHNlCisgICAgZm9yIHRva2VuIGluIHRva2VuczoKKyAgICAgICAgIyBpZiAxOgorICAgICAgICAjIHByaW50ICJQcm9jZXNzIiwgdG9rZW4sCisgICAgICAgICMgaWYgdG9rZW4uYXRfbGluZV9zdGFydDoKKyAgICAgICAgIyBwcmludCAiYXRfbGluZV9zdGFydCIsCisgICAgICAgICMgaWYgdG9rZW4ubXVzdF9pbmRlbnQ6CisgICAgICAgICMgcHJpbnQgIm11c3RfaW5kZW50IiwKKyAgICAgICAgIyBwcmludAorCisgICAgICAgICMgV1Mgb25seSBvY2N1cnMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lCisgICAgICAgICMgVGhlcmUgbWF5IGJlIFdTIGZvbGxvd2VkIGJ5IE5FV0xJTkUgc28KKyAgICAgICAgIyBvbmx5IHRyYWNrIHRoZSBkZXB0aCBoZXJlLiAgRG9uJ3QgaW5kZW50L2RlZGVudAorICAgICAgICAjIHVudGlsIHRoZXJlJ3Mgc29tZXRoaW5nIHJlYWwuCisgICAgICAgIGlmIHRva2VuLnR5cGUgPT0gIldTIjoKKyAgICAgICAgICAgIGFzc2VydCBkZXB0aCA9PSAwCisgICAgICAgICAgICBkZXB0aCA9IGxlbih0b2tlbi52YWx1ZSkKKyAgICAgICAgICAgIHByZXZfd2FzX3dzID0gVHJ1ZQorICAgICAgICAgICAgIyBXUyB0b2tlbnMgYXJlIG5ldmVyIHBhc3NlZCB0byB0aGUgcGFyc2VyCisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGlmIHRva2VuLnR5cGUgPT0gIk5FV0xJTkUiOgorICAgICAgICAgICAgZGVwdGggPSAwCisgICAgICAgICAgICBpZiBwcmV2X3dhc193cyBvciB0b2tlbi5hdF9saW5lX3N0YXJ0OgorICAgICAgICAgICAgICAgICMgaWdub3JlIGJsYW5rIGxpbmVzCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICMgcGFzcyB0aGUgb3RoZXIgY2FzZXMgb24gdGhyb3VnaAorICAgICAgICAgICAgeWllbGQgdG9rZW4KKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgIyB0aGVuIGl0IG11c3QgYmUgYSByZWFsIHRva2VuIChub3QgV1MsIG5vdCBORVdMSU5FKQorICAgICAgICAjIHdoaWNoIGNhbiBhZmZlY3QgdGhlIGluZGVudGF0aW9uIGxldmVsCisKKyAgICAgICAgcHJldl93YXNfd3MgPSBGYWxzZQorICAgICAgICBpZiB0b2tlbi5tdXN0X2luZGVudDoKKyAgICAgICAgICAgICMgVGhlIGN1cnJlbnQgZGVwdGggbXVzdCBiZSBsYXJnZXIgdGhhbiB0aGUgcHJldmlvdXMgbGV2ZWwKKyAgICAgICAgICAgIGlmIG5vdCAoZGVwdGggPiBsZXZlbHNbLTFdKToKKyAgICAgICAgICAgICAgICByYWlzZSBJbmRlbnRhdGlvbkVycm9yKCJleHBlY3RlZCBhbiBpbmRlbnRlZCBibG9jayIpCisKKyAgICAgICAgICAgIGxldmVscy5hcHBlbmQoZGVwdGgpCisgICAgICAgICAgICB5aWVsZCBJTkRFTlQodG9rZW4ubGluZW5vKQorCisgICAgICAgIGVsaWYgdG9rZW4uYXRfbGluZV9zdGFydDoKKyAgICAgICAgICAgICMgTXVzdCBiZSBvbiB0aGUgc2FtZSBsZXZlbCBvciBvbmUgb2YgdGhlIHByZXZpb3VzIGxldmVscworICAgICAgICAgICAgaWYgZGVwdGggPT0gbGV2ZWxzWy0xXToKKyAgICAgICAgICAgICAgICAjIEF0IHRoZSBzYW1lIGxldmVsCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxpZiBkZXB0aCA+IGxldmVsc1stMV06CisgICAgICAgICAgICAgICAgcmFpc2UgSW5kZW50YXRpb25FcnJvcigKKyAgICAgICAgICAgICAgICAgICAgImluZGVudGF0aW9uIGluY3JlYXNlIGJ1dCBub3QgaW4gbmV3IGJsb2NrIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBCYWNrIHVwOyBidXQgb25seSBpZiBpdCBtYXRjaGVzIGEgcHJldmlvdXMgbGV2ZWwKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGkgPSBsZXZlbHMuaW5kZXgoZGVwdGgpCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEluZGVudGF0aW9uRXJyb3IoImluY29uc2lzdGVudCBpbmRlbnRhdGlvbiIpCisgICAgICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2UoaSArIDEsIGxlbihsZXZlbHMpKToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgREVERU5UKHRva2VuLmxpbmVubykKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWxzLnBvcCgpCisKKyAgICAgICAgeWllbGQgdG9rZW4KKworICAgICMjIyBGaW5pc2hlZCBwcm9jZXNzaW5nICMjIworCisgICAgIyBNdXN0IGRlZGVudCBhbnkgcmVtYWluaW5nIGxldmVscworICAgIGlmIGxlbihsZXZlbHMpID4gMToKKyAgICAgICAgYXNzZXJ0IHRva2VuIGlzIG5vdCBOb25lCisgICAgICAgIGZvciBfIGluIHJhbmdlKDEsIGxlbihsZXZlbHMpKToKKyAgICAgICAgICAgIHlpZWxkIERFREVOVCh0b2tlbi5saW5lbm8pCisKKworIyBUaGUgdG9wLWxldmVsIGZpbHRlciBhZGRzIGFuIEVORE1BUktFUiwgaWYgcmVxdWVzdGVkLgorIyBQeXRob24ncyBncmFtbWFyIHVzZXMgaXQuCitkZWYgZmlsdGVyKGxleGVyLCBhZGRfZW5kbWFya2VyPVRydWUpOgorICAgIHRva2VuID0gTm9uZQorICAgIHRva2VucyA9IGl0ZXIobGV4ZXIudG9rZW4sIE5vbmUpCisgICAgdG9rZW5zID0gdHJhY2tfdG9rZW5zX2ZpbHRlcihsZXhlciwgdG9rZW5zKQorICAgIGZvciB0b2tlbiBpbiBpbmRlbnRhdGlvbl9maWx0ZXIodG9rZW5zKToKKyAgICAgICAgeWllbGQgdG9rZW4KKworICAgIGlmIGFkZF9lbmRtYXJrZXI6CisgICAgICAgIGxpbmVubyA9IDEKKyAgICAgICAgaWYgdG9rZW4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBsaW5lbm8gPSB0b2tlbi5saW5lbm8KKyAgICAgICAgeWllbGQgX25ld190b2tlbigiRU5ETUFSS0VSIiwgbGluZW5vKQorCisjIENvbWJpbmUgUGx5IGFuZCBteSBmaWx0ZXJzIGludG8gYSBuZXcgbGV4ZXIKKworCitjbGFzcyBJbmRlbnRMZXhlcihvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRlYnVnPTAsIG9wdGltaXplPTAsIGxleHRhYj0nbGV4dGFiJywgcmVmbGFncz0wKToKKyAgICAgICAgc2VsZi5sZXhlciA9IGxleC5sZXgoZGVidWc9ZGVidWcsIG9wdGltaXplPW9wdGltaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXh0YWI9bGV4dGFiLCByZWZsYWdzPXJlZmxhZ3MpCisgICAgICAgIHNlbGYudG9rZW5fc3RyZWFtID0gTm9uZQorCisgICAgZGVmIGlucHV0KHNlbGYsIHMsIGFkZF9lbmRtYXJrZXI9VHJ1ZSk6CisgICAgICAgIHNlbGYubGV4ZXIucGFyZW5fY291bnQgPSAwCisgICAgICAgIHNlbGYubGV4ZXIuaW5wdXQocykKKyAgICAgICAgc2VsZi50b2tlbl9zdHJlYW0gPSBmaWx0ZXIoc2VsZi5sZXhlciwgYWRkX2VuZG1hcmtlcikKKworICAgIGRlZiB0b2tlbihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudG9rZW5fc3RyZWFtLm5leHQoKQorICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyMjIyMjIyMjIyMgICBQYXJzZXIgKHRva2VucyAtPiBBU1QpICMjIyMjIworCisjIGFsc28gcGFydCBvZiBQbHkKKyNpbXBvcnQgeWFjYworCisjIEkgdXNlIHRoZSBQeXRob24gQVNUCitmcm9tIGNvbXBpbGVyIGltcG9ydCBhc3QKKworIyBIZWxwZXIgZnVuY3Rpb24KKworCitkZWYgQXNzaWduKGxlZnQsIHJpZ2h0KToKKyAgICBuYW1lcyA9IFtdCisgICAgaWYgaXNpbnN0YW5jZShsZWZ0LCBhc3QuTmFtZSk6CisgICAgICAgICMgU2luZ2xlIGFzc2lnbm1lbnQgb24gbGVmdAorICAgICAgICByZXR1cm4gYXN0LkFzc2lnbihbYXN0LkFzc05hbWUobGVmdC5uYW1lLCAnT1BfQVNTSUdOJyldLCByaWdodCkKKyAgICBlbGlmIGlzaW5zdGFuY2UobGVmdCwgYXN0LlR1cGxlKToKKyAgICAgICAgIyBMaXN0IG9mIHRoaW5ncyAtIG1ha2Ugc3VyZSB0aGV5IGFyZSBOYW1lIG5vZGVzCisgICAgICAgIG5hbWVzID0gW10KKyAgICAgICAgZm9yIGNoaWxkIGluIGxlZnQuZ2V0Q2hpbGRyZW4oKToKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGNoaWxkLCBhc3QuTmFtZSk6CisgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoInRoYXQgYXNzaWdubWVudCBub3Qgc3VwcG9ydGVkIikKKyAgICAgICAgICAgIG5hbWVzLmFwcGVuZChjaGlsZC5uYW1lKQorICAgICAgICBhc3NfbGlzdCA9IFthc3QuQXNzTmFtZShuYW1lLCAnT1BfQVNTSUdOJykgZm9yIG5hbWUgaW4gbmFtZXNdCisgICAgICAgIHJldHVybiBhc3QuQXNzaWduKFthc3QuQXNzVHVwbGUoYXNzX2xpc3QpXSwgcmlnaHQpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoIkNhbid0IGRvIHRoYXQgeWV0IikKKworCisjIFRoZSBncmFtbWFyIGNvbW1lbnRzIGNvbWUgZnJvbSBQeXRob24ncyBHcmFtbWFyL0dyYW1tYXIgZmlsZQorCisjIE5COiBjb21wb3VuZF9zdG10IGluIHNpbmdsZV9pbnB1dCBpcyBmb2xsb3dlZCBieSBleHRyYSBORVdMSU5FIQorIyBmaWxlX2lucHV0OiAoTkVXTElORSB8IHN0bXQpKiBFTkRNQVJLRVIKK2RlZiBwX2ZpbGVfaW5wdXRfZW5kKHApOgorICAgICIiImZpbGVfaW5wdXRfZW5kIDogZmlsZV9pbnB1dCBFTkRNQVJLRVIiIiIKKyAgICBwWzBdID0gYXN0LlN0bXQocFsxXSkKKworCitkZWYgcF9maWxlX2lucHV0KHApOgorICAgICIiImZpbGVfaW5wdXQgOiBmaWxlX2lucHV0IE5FV0xJTkUKKyAgICAgICAgICAgICAgICAgIHwgZmlsZV9pbnB1dCBzdG10CisgICAgICAgICAgICAgICAgICB8IE5FV0xJTkUKKyAgICAgICAgICAgICAgICAgIHwgc3RtdCIiIgorICAgIGlmIGlzaW5zdGFuY2UocFtsZW4ocCkgLSAxXSwgYmFzZXN0cmluZyk6CisgICAgICAgIGlmIGxlbihwKSA9PSAzOgorICAgICAgICAgICAgcFswXSA9IHBbMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBbMF0gPSBbXSAgIyBwID09IDIgLS0+IG9ubHkgYSBibGFuayBsaW5lCisgICAgZWxzZToKKyAgICAgICAgaWYgbGVuKHApID09IDM6CisgICAgICAgICAgICBwWzBdID0gcFsxXSArIHBbMl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBbMF0gPSBwWzFdCisKKworIyBmdW5jZGVmOiBbZGVjb3JhdG9yc10gJ2RlZicgTkFNRSBwYXJhbWV0ZXJzICc6JyBzdWl0ZQorIyBpZ25vcmluZyBkZWNvcmF0b3JzCitkZWYgcF9mdW5jZGVmKHApOgorICAgICJmdW5jZGVmIDogREVGIE5BTUUgcGFyYW1ldGVycyBDT0xPTiBzdWl0ZSIKKyAgICBwWzBdID0gYXN0LkZ1bmN0aW9uKE5vbmUsIHBbMl0sIHR1cGxlKHBbM10pLCAoKSwgMCwgTm9uZSwgcFs1XSkKKworIyBwYXJhbWV0ZXJzOiAnKCcgW3ZhcmFyZ3NsaXN0XSAnKScKKworCitkZWYgcF9wYXJhbWV0ZXJzKHApOgorICAgICIiInBhcmFtZXRlcnMgOiBMUEFSIFJQQVIKKyAgICAgICAgICAgICAgICAgIHwgTFBBUiB2YXJhcmdzbGlzdCBSUEFSIiIiCisgICAgaWYgbGVuKHApID09IDM6CisgICAgICAgIHBbMF0gPSBbXQorICAgIGVsc2U6CisgICAgICAgIHBbMF0gPSBwWzJdCisKKworIyB2YXJhcmdzbGlzdDogKGZwZGVmIFsnPScgdGVzdF0gJywnKSogKCcqJyBOQU1FIFsnLCcgJyoqJyBOQU1FXSB8ICcqKicgTkFNRSkgfAorIyBoaWdobHkgc2ltcGxpZmllZAorZGVmIHBfdmFyYXJnc2xpc3QocCk6CisgICAgIiIidmFyYXJnc2xpc3QgOiB2YXJhcmdzbGlzdCBDT01NQSBOQU1FCisgICAgICAgICAgICAgICAgICAgfCBOQU1FIiIiCisgICAgaWYgbGVuKHApID09IDQ6CisgICAgICAgIHBbMF0gPSBwWzFdICsgcFszXQorICAgIGVsc2U6CisgICAgICAgIHBbMF0gPSBbcFsxXV0KKworIyBzdG10OiBzaW1wbGVfc3RtdCB8IGNvbXBvdW5kX3N0bXQKKworCitkZWYgcF9zdG10X3NpbXBsZShwKToKKyAgICAiIiJzdG10IDogc2ltcGxlX3N0bXQiIiIKKyAgICAjIHNpbXBsZV9zdG10IGlzIGEgbGlzdAorICAgIHBbMF0gPSBwWzFdCisKKworZGVmIHBfc3RtdF9jb21wb3VuZChwKToKKyAgICAiIiJzdG10IDogY29tcG91bmRfc3RtdCIiIgorICAgIHBbMF0gPSBbcFsxXV0KKworIyBzaW1wbGVfc3RtdDogc21hbGxfc3RtdCAoJzsnIHNtYWxsX3N0bXQpKiBbJzsnXSBORVdMSU5FCisKKworZGVmIHBfc2ltcGxlX3N0bXQocCk6CisgICAgIiIic2ltcGxlX3N0bXQgOiBzbWFsbF9zdG10cyBORVdMSU5FCisgICAgICAgICAgICAgICAgICAgfCBzbWFsbF9zdG10cyBTRU1JQ09MT04gTkVXTElORSIiIgorICAgIHBbMF0gPSBwWzFdCisKKworZGVmIHBfc21hbGxfc3RtdHMocCk6CisgICAgIiIic21hbGxfc3RtdHMgOiBzbWFsbF9zdG10cyBTRU1JQ09MT04gc21hbGxfc3RtdAorICAgICAgICAgICAgICAgICAgIHwgc21hbGxfc3RtdCIiIgorICAgIGlmIGxlbihwKSA9PSA0OgorICAgICAgICBwWzBdID0gcFsxXSArIFtwWzNdXQorICAgIGVsc2U6CisgICAgICAgIHBbMF0gPSBbcFsxXV0KKworIyBzbWFsbF9zdG10OiBleHByX3N0bXQgfCBwcmludF9zdG10ICB8IGRlbF9zdG10IHwgcGFzc19zdG10IHwgZmxvd19zdG10IHwKKyMgICAgaW1wb3J0X3N0bXQgfCBnbG9iYWxfc3RtdCB8IGV4ZWNfc3RtdCB8IGFzc2VydF9zdG10CisKKworZGVmIHBfc21hbGxfc3RtdChwKToKKyAgICAiIiJzbWFsbF9zdG10IDogZmxvd19zdG10CisgICAgICAgICAgICAgICAgICB8IGV4cHJfc3RtdCIiIgorICAgIHBbMF0gPSBwWzFdCisKKyMgZXhwcl9zdG10OiB0ZXN0bGlzdCAoYXVnYXNzaWduICh5aWVsZF9leHByfHRlc3RsaXN0KSB8CisjICAgICAgICAgICAgICAgICAgICAgICgnPScgKHlpZWxkX2V4cHJ8dGVzdGxpc3QpKSopCisjIGF1Z2Fzc2lnbjogKCcrPScgfCAnLT0nIHwgJyo9JyB8ICcvPScgfCAnJT0nIHwgJyY9JyB8ICd8PScgfCAnXj0nIHwKKyMgICAgICAgICAgICAgJzw8PScgfCAnPj49JyB8ICcqKj0nIHwgJy8vPScpCisKKworZGVmIHBfZXhwcl9zdG10KHApOgorICAgICIiImV4cHJfc3RtdCA6IHRlc3RsaXN0IEFTU0lHTiB0ZXN0bGlzdAorICAgICAgICAgICAgICAgICB8IHRlc3RsaXN0ICIiIgorICAgIGlmIGxlbihwKSA9PSAyOgorICAgICAgICAjIGEgbGlzdCBvZiBleHByZXNzaW9ucworICAgICAgICBwWzBdID0gYXN0LkRpc2NhcmQocFsxXSkKKyAgICBlbHNlOgorICAgICAgICBwWzBdID0gQXNzaWduKHBbMV0sIHBbM10pCisKKworZGVmIHBfZmxvd19zdG10KHApOgorICAgICJmbG93X3N0bXQgOiByZXR1cm5fc3RtdCIKKyAgICBwWzBdID0gcFsxXQorCisjIHJldHVybl9zdG10OiAncmV0dXJuJyBbdGVzdGxpc3RdCisKKworZGVmIHBfcmV0dXJuX3N0bXQocCk6CisgICAgInJldHVybl9zdG10IDogUkVUVVJOIHRlc3RsaXN0IgorICAgIHBbMF0gPSBhc3QuUmV0dXJuKHBbMl0pCisKKworZGVmIHBfY29tcG91bmRfc3RtdChwKToKKyAgICAiIiJjb21wb3VuZF9zdG10IDogaWZfc3RtdAorICAgICAgICAgICAgICAgICAgICAgfCBmdW5jZGVmIiIiCisgICAgcFswXSA9IHBbMV0KKworCitkZWYgcF9pZl9zdG10KHApOgorICAgICdpZl9zdG10IDogSUYgdGVzdCBDT0xPTiBzdWl0ZScKKyAgICBwWzBdID0gYXN0LklmKFsocFsyXSwgcFs0XSldLCBOb25lKQorCisKK2RlZiBwX3N1aXRlKHApOgorICAgICIiInN1aXRlIDogc2ltcGxlX3N0bXQKKyAgICAgICAgICAgICB8IE5FV0xJTkUgSU5ERU5UIHN0bXRzIERFREVOVCIiIgorICAgIGlmIGxlbihwKSA9PSAyOgorICAgICAgICBwWzBdID0gYXN0LlN0bXQocFsxXSkKKyAgICBlbHNlOgorICAgICAgICBwWzBdID0gYXN0LlN0bXQocFszXSkKKworCitkZWYgcF9zdG10cyhwKToKKyAgICAiIiJzdG10cyA6IHN0bXRzIHN0bXQKKyAgICAgICAgICAgICB8IHN0bXQiIiIKKyAgICBpZiBsZW4ocCkgPT0gMzoKKyAgICAgICAgcFswXSA9IHBbMV0gKyBwWzJdCisgICAgZWxzZToKKyAgICAgICAgcFswXSA9IHBbMV0KKworIyBObyB1c2luZyBQeXRob24ncyBhcHByb2FjaCBiZWNhdXNlIFBseSBzdXBwb3J0cyBwcmVjZWRlbmNlCisKKyMgY29tcGFyaXNvbjogZXhwciAoY29tcF9vcCBleHByKSoKKyMgYXJpdGhfZXhwcjogdGVybSAoKCcrJ3wnLScpIHRlcm0pKgorIyB0ZXJtOiBmYWN0b3IgKCgnKid8Jy8nfCclJ3wnLy8nKSBmYWN0b3IpKgorIyBmYWN0b3I6ICgnKyd8Jy0nfCd+JykgZmFjdG9yIHwgcG93ZXIKKyMgY29tcF9vcDogJzwnfCc+J3wnPT0nfCc+PSd8Jzw9J3wnPD4nfCchPSd8J2luJ3wnbm90JyAnaW4nfCdpcyd8J2lzJyAnbm90JworCisKK2RlZiBtYWtlX2x0X2NvbXBhcmUoKGxlZnQsIHJpZ2h0KSk6CisgICAgcmV0dXJuIGFzdC5Db21wYXJlKGxlZnQsIFsoJzwnLCByaWdodCksIF0pCisKKworZGVmIG1ha2VfZ3RfY29tcGFyZSgobGVmdCwgcmlnaHQpKToKKyAgICByZXR1cm4gYXN0LkNvbXBhcmUobGVmdCwgWygnPicsIHJpZ2h0KSwgXSkKKworCitkZWYgbWFrZV9lcV9jb21wYXJlKChsZWZ0LCByaWdodCkpOgorICAgIHJldHVybiBhc3QuQ29tcGFyZShsZWZ0LCBbKCc9PScsIHJpZ2h0KSwgXSkKKworCitiaW5hcnlfb3BzID0geworICAgICIrIjogYXN0LkFkZCwKKyAgICAiLSI6IGFzdC5TdWIsCisgICAgIioiOiBhc3QuTXVsLAorICAgICIvIjogYXN0LkRpdiwKKyAgICAiPCI6IG1ha2VfbHRfY29tcGFyZSwKKyAgICAiPiI6IG1ha2VfZ3RfY29tcGFyZSwKKyAgICAiPT0iOiBtYWtlX2VxX2NvbXBhcmUsCit9Cit1bmFyeV9vcHMgPSB7CisgICAgIisiOiBhc3QuVW5hcnlBZGQsCisgICAgIi0iOiBhc3QuVW5hcnlTdWIsCit9CitwcmVjZWRlbmNlID0gKAorICAgICgibGVmdCIsICJFUSIsICJHVCIsICJMVCIpLAorICAgICgibGVmdCIsICJQTFVTIiwgIk1JTlVTIiksCisgICAgKCJsZWZ0IiwgIk1VTFQiLCAiRElWIiksCispCisKKworZGVmIHBfY29tcGFyaXNvbihwKToKKyAgICAiIiJjb21wYXJpc29uIDogY29tcGFyaXNvbiBQTFVTIGNvbXBhcmlzb24KKyAgICAgICAgICAgICAgICAgIHwgY29tcGFyaXNvbiBNSU5VUyBjb21wYXJpc29uCisgICAgICAgICAgICAgICAgICB8IGNvbXBhcmlzb24gTVVMVCBjb21wYXJpc29uCisgICAgICAgICAgICAgICAgICB8IGNvbXBhcmlzb24gRElWIGNvbXBhcmlzb24KKyAgICAgICAgICAgICAgICAgIHwgY29tcGFyaXNvbiBMVCBjb21wYXJpc29uCisgICAgICAgICAgICAgICAgICB8IGNvbXBhcmlzb24gRVEgY29tcGFyaXNvbgorICAgICAgICAgICAgICAgICAgfCBjb21wYXJpc29uIEdUIGNvbXBhcmlzb24KKyAgICAgICAgICAgICAgICAgIHwgUExVUyBjb21wYXJpc29uCisgICAgICAgICAgICAgICAgICB8IE1JTlVTIGNvbXBhcmlzb24KKyAgICAgICAgICAgICAgICAgIHwgcG93ZXIiIiIKKyAgICBpZiBsZW4ocCkgPT0gNDoKKyAgICAgICAgcFswXSA9IGJpbmFyeV9vcHNbcFsyXV0oKHBbMV0sIHBbM10pKQorICAgIGVsaWYgbGVuKHApID09IDM6CisgICAgICAgIHBbMF0gPSB1bmFyeV9vcHNbcFsxXV0ocFsyXSkKKyAgICBlbHNlOgorICAgICAgICBwWzBdID0gcFsxXQorCisjIHBvd2VyOiBhdG9tIHRyYWlsZXIqIFsnKionIGZhY3Rvcl0KKyMgdHJhaWxlcnMgZW5hYmxlcyBmdW5jdGlvbiBjYWxscy4gIEkgb25seSBhbGxvdyBvbmUgbGV2ZWwgb2YgY2FsbHMKKyMgc28gdGhpcyBpcyAndHJhaWxlcicKKworCitkZWYgcF9wb3dlcihwKToKKyAgICAiIiJwb3dlciA6IGF0b20KKyAgICAgICAgICAgICB8IGF0b20gdHJhaWxlciIiIgorICAgIGlmIGxlbihwKSA9PSAyOgorICAgICAgICBwWzBdID0gcFsxXQorICAgIGVsc2U6CisgICAgICAgIGlmIHBbMl1bMF0gPT0gIkNBTEwiOgorICAgICAgICAgICAgcFswXSA9IGFzdC5DYWxsRnVuYyhwWzFdLCBwWzJdWzFdLCBOb25lLCBOb25lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpCisKKworZGVmIHBfYXRvbV9uYW1lKHApOgorICAgICIiImF0b20gOiBOQU1FIiIiCisgICAgcFswXSA9IGFzdC5OYW1lKHBbMV0pCisKKworZGVmIHBfYXRvbV9udW1iZXIocCk6CisgICAgIiIiYXRvbSA6IE5VTUJFUgorICAgICAgICAgICAgfCBTVFJJTkciIiIKKyAgICBwWzBdID0gYXN0LkNvbnN0KHBbMV0pCisKKworZGVmIHBfYXRvbV90dXBsZShwKToKKyAgICAiIiJhdG9tIDogTFBBUiB0ZXN0bGlzdCBSUEFSIiIiCisgICAgcFswXSA9IHBbMl0KKworIyB0cmFpbGVyOiAnKCcgW2FyZ2xpc3RdICcpJyB8ICdbJyBzdWJzY3JpcHRsaXN0ICddJyB8ICcuJyBOQU1FCisKKworZGVmIHBfdHJhaWxlcihwKToKKyAgICAidHJhaWxlciA6IExQQVIgYXJnbGlzdCBSUEFSIgorICAgIHBbMF0gPSAoIkNBTEwiLCBwWzJdKQorCisjIHRlc3RsaXN0OiB0ZXN0ICgnLCcgdGVzdCkqIFsnLCddCisjIENvbnRhaW5zIHNoaWZ0L3JlZHVjZSBlcnJvcgorCisKK2RlZiBwX3Rlc3RsaXN0KHApOgorICAgICIiInRlc3RsaXN0IDogdGVzdGxpc3RfbXVsdGkgQ09NTUEKKyAgICAgICAgICAgICAgICB8IHRlc3RsaXN0X211bHRpICIiIgorICAgIGlmIGxlbihwKSA9PSAyOgorICAgICAgICBwWzBdID0gcFsxXQorICAgIGVsc2U6CisgICAgICAgICMgTWF5IG5lZWQgdG8gcHJvbW90ZSBzaW5nbGV0b24gdG8gdHVwbGUKKyAgICAgICAgaWYgaXNpbnN0YW5jZShwWzFdLCBsaXN0KToKKyAgICAgICAgICAgIHBbMF0gPSBwWzFdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwWzBdID0gW3BbMV1dCisgICAgIyBDb252ZXJ0IGludG8gYSB0dXBsZT8KKyAgICBpZiBpc2luc3RhbmNlKHBbMF0sIGxpc3QpOgorICAgICAgICBwWzBdID0gYXN0LlR1cGxlKHBbMF0pCisKKworZGVmIHBfdGVzdGxpc3RfbXVsdGkocCk6CisgICAgIiIidGVzdGxpc3RfbXVsdGkgOiB0ZXN0bGlzdF9tdWx0aSBDT01NQSB0ZXN0CisgICAgICAgICAgICAgICAgICAgICAgfCB0ZXN0IiIiCisgICAgaWYgbGVuKHApID09IDI6CisgICAgICAgICMgc2luZ2xldG9uCisgICAgICAgIHBbMF0gPSBwWzFdCisgICAgZWxzZToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShwWzFdLCBsaXN0KToKKyAgICAgICAgICAgIHBbMF0gPSBwWzFdICsgW3BbM11dCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHNpbmdsZXRvbiAtPiB0dXBsZQorICAgICAgICAgICAgcFswXSA9IFtwWzFdLCBwWzNdXQorCisKKyMgdGVzdDogb3JfdGVzdCBbJ2lmJyBvcl90ZXN0ICdlbHNlJyB0ZXN0XSB8IGxhbWJkZWYKKyMgIGFzIEkgZG9uJ3Qgc3VwcG9ydCAnYW5kJywgJ29yJywgYW5kICdub3QnIHRoaXMgd29ya3MgZG93biB0byAnY29tcGFyaXNvbicKK2RlZiBwX3Rlc3QocCk6CisgICAgInRlc3QgOiBjb21wYXJpc29uIgorICAgIHBbMF0gPSBwWzFdCisKKworIyBhcmdsaXN0OiAoYXJndW1lbnQgJywnKSogKGFyZ3VtZW50IFsnLCddfCAnKicgdGVzdCBbJywnICcqKicgdGVzdF0gfCAnKionIHRlc3QpCisjIFhYWCBJTkNPTVBMRVRFOiB0aGlzIGRvZXNuJ3QgYWxsb3cgdGhlIHRyYWlsaW5nIGNvbW1hCitkZWYgcF9hcmdsaXN0KHApOgorICAgICIiImFyZ2xpc3QgOiBhcmdsaXN0IENPTU1BIGFyZ3VtZW50CisgICAgICAgICAgICAgICB8IGFyZ3VtZW50IiIiCisgICAgaWYgbGVuKHApID09IDQ6CisgICAgICAgIHBbMF0gPSBwWzFdICsgW3BbM11dCisgICAgZWxzZToKKyAgICAgICAgcFswXSA9IFtwWzFdXQorCisjIGFyZ3VtZW50OiB0ZXN0IFtnZW5fZm9yXSB8IHRlc3QgJz0nIHRlc3QgICMgUmVhbGx5IFtrZXl3b3JkICc9J10gdGVzdAorCisKK2RlZiBwX2FyZ3VtZW50KHApOgorICAgICJhcmd1bWVudCA6IHRlc3QiCisgICAgcFswXSA9IHBbMV0KKworCitkZWYgcF9lcnJvcihwKToKKyAgICAjIHByaW50ICJFcnJvciEiLCByZXByKHApCisgICAgcmFpc2UgU3ludGF4RXJyb3IocCkKKworCitjbGFzcyBHYXJkZW5TbmFrZVBhcnNlcihvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxleGVyPU5vbmUpOgorICAgICAgICBpZiBsZXhlciBpcyBOb25lOgorICAgICAgICAgICAgbGV4ZXIgPSBJbmRlbnRMZXhlcigpCisgICAgICAgIHNlbGYubGV4ZXIgPSBsZXhlcgorICAgICAgICBzZWxmLnBhcnNlciA9IHlhY2MueWFjYyhzdGFydD0iZmlsZV9pbnB1dF9lbmQiKQorCisgICAgZGVmIHBhcnNlKHNlbGYsIGNvZGUpOgorICAgICAgICBzZWxmLmxleGVyLmlucHV0KGNvZGUpCisgICAgICAgIHJlc3VsdCA9IHNlbGYucGFyc2VyLnBhcnNlKGxleGVyPXNlbGYubGV4ZXIpCisgICAgICAgIHJldHVybiBhc3QuTW9kdWxlKE5vbmUsIHJlc3VsdCkKKworCisjIyMjIyMgQ29kZSBnZW5lcmF0aW9uICMjIyMjIworCitmcm9tIGNvbXBpbGVyIGltcG9ydCBtaXNjLCBzeW50YXgsIHB5Y29kZWdlbgorCisKK2NsYXNzIEdhcmRlblNuYWtlQ29tcGlsZXIob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBHYXJkZW5TbmFrZVBhcnNlcigpCisKKyAgICBkZWYgY29tcGlsZShzZWxmLCBjb2RlLCBmaWxlbmFtZT0iPHN0cmluZz4iKToKKyAgICAgICAgdHJlZSA9IHNlbGYucGFyc2VyLnBhcnNlKGNvZGUpCisgICAgICAgICMgcHJpbnQgIHRyZWUKKyAgICAgICAgbWlzYy5zZXRfZmlsZW5hbWUoZmlsZW5hbWUsIHRyZWUpCisgICAgICAgIHN5bnRheC5jaGVjayh0cmVlKQorICAgICAgICBnZW4gPSBweWNvZGVnZW4uTW9kdWxlQ29kZUdlbmVyYXRvcih0cmVlKQorICAgICAgICBjb2RlID0gZ2VuLmdldENvZGUoKQorICAgICAgICByZXR1cm4gY29kZQorCisjIyMjIyMjIFRlc3QgY29kZSAjIyMjIyMjCisKK2NvbXBpbGUgPSBHYXJkZW5TbmFrZUNvbXBpbGVyKCkuY29tcGlsZQorCitjb2RlID0gciIiIgorCitwcmludCgnTEVUXCdTIFRSWSBUSElTIFxcT1VUJykKKyAgCisjQ29tbWVudCBoZXJlCitkZWYgeChhKToKKyAgICBwcmludCgnY2FsbGVkIHdpdGgnLGEpCisgICAgaWYgYSA9PSAxOgorICAgICAgICByZXR1cm4gMgorICAgIGlmIGEqMiA+IDEwOiByZXR1cm4gOTk5IC8gNAorICAgICAgICAjIEFub3RoZXIgY29tbWVudCBoZXJlCisKKyAgICByZXR1cm4gYSsyKjMKKworaW50cyA9ICgxLCAyLAorICAgMywgNCwKKzUpCitwcmludCgnbXV0aWxpbmUtZXhwcmVzc2lvbicsIGludHMpCisKK3QgPSA0KzEvMyoyKzYqKDktNSsxKQorcHJpbnQoJ3ByZWRlbmNlIHRlc3Q7IHNob3VsZCBiZSAzNCsyLzM6JywgdCwgdD09KDM0KzIvMykpCisKK3ByaW50KCdudW1iZXJzJywgMSwyLDMsNCw1KQoraWYgMToKKyA4CisgYT05CisgcHJpbnQoeChhKSkKKworcHJpbnQoeCgxKSkKK3ByaW50KHgoMikpCitwcmludCh4KDgpLCczJykKK3ByaW50KCd0aGlzIGlzIGRlY2ltYWwnLCAxLzUpCitwcmludCgnQklHIERFQ0lNQUwnLCAxLjIzNDU2Nzg5MTIzNDU2N2UxMjM0NSkKKworIiIiCisKKyMgU2V0IHVwIHRoZSBHYXJkZW5TbmFrZSBydW4tdGltZSBlbnZpcm9ubWVudAorCisKK2RlZiBwcmludF8oKmFyZ3MpOgorICAgIHByaW50ICItLT4iLCAiICIuam9pbihtYXAoc3RyLCBhcmdzKSkKKworZ2xvYmFscygpWyJwcmludCJdID0gcHJpbnRfCisKK2NvbXBpbGVkX2NvZGUgPSBjb21waWxlKGNvZGUpCisKK2V4ZWMgY29tcGlsZWRfY29kZSBpbiBnbG9iYWxzKCkKK3ByaW50ICJEb25lIgpkaWZmIC0tZ2l0IGEvcGx5L2V4YW1wbGUvR2FyZGVuU25ha2UvUkVBRE1FIGIvcGx5L2V4YW1wbGUvR2FyZGVuU25ha2UvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkOGJlMmQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvZXhhbXBsZS9HYXJkZW5TbmFrZS9SRUFETUUKQEAgLTAsMCArMSw1IEBACitUaGlzIGV4YW1wbGUgaXMgQW5kcmV3IERhbGtlJ3MgR2FyZGVuU25ha2UgbGFuZ3VhZ2UuIEl0IHNob3dzIGhvdyB0byBwcm9jZXNzIGFuCitpbmRlbnRhdGlvbi1saWtlIGxhbmd1YWdlIGxpa2UgUHl0aG9uLiAgIEZ1cnRoZXIgZGV0YWlscyBjYW4gYmUgZm91bmQgaGVyZToKKworaHR0cDovL2RhbGtlc2NpZW50aWZpYy5jb20vd3JpdGluZ3MvZGlhcnkvYXJjaGl2ZS8yMDA2LzA4LzMwL2dhcmRlbnNuYWtlX2xhbmd1YWdlLmh0bWwKKwpkaWZmIC0tZ2l0IGEvcGx5L2V4YW1wbGUvUkVBRE1FIGIvcGx5L2V4YW1wbGUvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNTE5YjUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvZXhhbXBsZS9SRUFETUUKQEAgLTAsMCArMSwxMCBAQAorU2ltcGxlIGV4YW1wbGVzOgorICAgY2FsYyAgICAgICAtIFNpbXBsZSBjYWxjdWxhdG9yCisgICBjbGFzc2NhbGMgIC0gU2ltcGxlIGNhbGN1bGF0ZSBkZWZpbmVkIGFzIGEgY2xhc3MKKyAgIAorQ29tcGxleCBleGFtcGxlcworICAgYW5zaWMgICAgICAgLSBBTlNJIEMgZ3JhbW1hciBmcm9tIEsmUgorICAgQkFTSUMgICAgICAgLSBBIHNtYWxsIEJBU0lDIGludGVycHJldGVyCisgICBHYXJkZW5TbmFrZSAtIEEgc2ltcGxlIHB5dGhvbi1saWtlIGxhbmd1YWdlCisgICB5cGx5ICAgICAgICAtIENvbnZlcnRzIFVuaXggeWFjYyBmaWxlcyB0byBQTFkgcHJvZ3JhbXMuCisKZGlmZiAtLWdpdCBhL3BseS9leGFtcGxlL2Fuc2ljL1JFQURNRSBiL3BseS9leGFtcGxlL2Fuc2ljL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDQ5ZDNiCi0tLSAvZGV2L251bGwKKysrIGIvcGx5L2V4YW1wbGUvYW5zaWMvUkVBRE1FCkBAIC0wLDAgKzEsMiBAQAorVGhpcyBleGFtcGxlIGlzIGluY29tcGxldGUuICBXYXMgZ29pbmcgdG8gc3BlY2lmeSBhbiBBTlNJIEMgcGFyc2VyLgorVGhpcyBpcyBwYXJ0IG9mIGl0LgpkaWZmIC0tZ2l0IGEvcGx5L2V4YW1wbGUvYW5zaWMvY2xleC5weSBiL3BseS9leGFtcGxlL2Fuc2ljL2NsZXgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJkZTFkNwotLS0gL2Rldi9udWxsCisrKyBiL3BseS9leGFtcGxlL2Fuc2ljL2NsZXgucHkKQEAgLTAsMCArMSwxNjggQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjbGV4LnB5CisjCisjIEEgbGV4ZXIgZm9yIEFOU0kgQy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbXBvcnQgc3lzCitzeXMucGF0aC5pbnNlcnQoMCwgIi4uLy4uIikKKworaW1wb3J0IHBseS5sZXggYXMgbGV4CisKKyMgUmVzZXJ2ZWQgd29yZHMKK3Jlc2VydmVkID0gKAorICAgICdBVVRPJywgJ0JSRUFLJywgJ0NBU0UnLCAnQ0hBUicsICdDT05TVCcsICdDT05USU5VRScsICdERUZBVUxUJywgJ0RPJywgJ0RPVUJMRScsCisgICAgJ0VMU0UnLCAnRU5VTScsICdFWFRFUk4nLCAnRkxPQVQnLCAnRk9SJywgJ0dPVE8nLCAnSUYnLCAnSU5UJywgJ0xPTkcnLCAnUkVHSVNURVInLAorICAgICdSRVRVUk4nLCAnU0hPUlQnLCAnU0lHTkVEJywgJ1NJWkVPRicsICdTVEFUSUMnLCAnU1RSVUNUJywgJ1NXSVRDSCcsICdUWVBFREVGJywKKyAgICAnVU5JT04nLCAnVU5TSUdORUQnLCAnVk9JRCcsICdWT0xBVElMRScsICdXSElMRScsCispCisKK3Rva2VucyA9IHJlc2VydmVkICsgKAorICAgICMgTGl0ZXJhbHMgKGlkZW50aWZpZXIsIGludGVnZXIgY29uc3RhbnQsIGZsb2F0IGNvbnN0YW50LCBzdHJpbmcgY29uc3RhbnQsCisgICAgIyBjaGFyIGNvbnN0KQorICAgICdJRCcsICdUWVBFSUQnLCAnSUNPTlNUJywgJ0ZDT05TVCcsICdTQ09OU1QnLCAnQ0NPTlNUJywKKworICAgICMgT3BlcmF0b3JzICgrLC0sKiwvLCUsfCwmLH4sXiw8PCw+PiwgfHwsICYmLCAhLCA8LCA8PSwgPiwgPj0sID09LCAhPSkKKyAgICAnUExVUycsICdNSU5VUycsICdUSU1FUycsICdESVZJREUnLCAnTU9EJywKKyAgICAnT1InLCAnQU5EJywgJ05PVCcsICdYT1InLCAnTFNISUZUJywgJ1JTSElGVCcsCisgICAgJ0xPUicsICdMQU5EJywgJ0xOT1QnLAorICAgICdMVCcsICdMRScsICdHVCcsICdHRScsICdFUScsICdORScsCisKKyAgICAjIEFzc2lnbm1lbnQgKD0sICo9LCAvPSwgJT0sICs9LCAtPSwgPDw9LCA+Pj0sICY9LCBePSwgfD0pCisgICAgJ0VRVUFMUycsICdUSU1FU0VRVUFMJywgJ0RJVkVRVUFMJywgJ01PREVRVUFMJywgJ1BMVVNFUVVBTCcsICdNSU5VU0VRVUFMJywKKyAgICAnTFNISUZURVFVQUwnLCAnUlNISUZURVFVQUwnLCAnQU5ERVFVQUwnLCAnWE9SRVFVQUwnLCAnT1JFUVVBTCcsCisKKyAgICAjIEluY3JlbWVudC9kZWNyZW1lbnQgKCsrLC0tKQorICAgICdQTFVTUExVUycsICdNSU5VU01JTlVTJywKKworICAgICMgU3RydWN0dXJlIGRlcmVmZXJlbmNlICgtPikKKyAgICAnQVJST1cnLAorCisgICAgIyBDb25kaXRpb25hbCBvcGVyYXRvciAoPykKKyAgICAnQ09ORE9QJywKKworICAgICMgRGVsaW1ldGVycyAoICkgWyBdIHsgfSAsIC4gOyA6CisgICAgJ0xQQVJFTicsICdSUEFSRU4nLAorICAgICdMQlJBQ0tFVCcsICdSQlJBQ0tFVCcsCisgICAgJ0xCUkFDRScsICdSQlJBQ0UnLAorICAgICdDT01NQScsICdQRVJJT0QnLCAnU0VNSScsICdDT0xPTicsCisKKyAgICAjIEVsbGlwc2lzICguLi4pCisgICAgJ0VMTElQU0lTJywKKykKKworIyBDb21wbGV0ZWx5IGlnbm9yZWQgY2hhcmFjdGVycwordF9pZ25vcmUgPSAnIFx0XHgwYycKKworIyBOZXdsaW5lcworCisKK2RlZiB0X05FV0xJTkUodCk6CisgICAgcidcbisnCisgICAgdC5sZXhlci5saW5lbm8gKz0gdC52YWx1ZS5jb3VudCgiXG4iKQorCisjIE9wZXJhdG9ycwordF9QTFVTID0gcidcKycKK3RfTUlOVVMgPSByJy0nCit0X1RJTUVTID0gcidcKicKK3RfRElWSURFID0gcicvJwordF9NT0QgPSByJyUnCit0X09SID0gcidcfCcKK3RfQU5EID0gcicmJwordF9OT1QgPSByJ34nCit0X1hPUiA9IHInXF4nCit0X0xTSElGVCA9IHInPDwnCit0X1JTSElGVCA9IHInPj4nCit0X0xPUiA9IHInXHxcfCcKK3RfTEFORCA9IHInJiYnCit0X0xOT1QgPSByJyEnCit0X0xUID0gcic8JwordF9HVCA9IHInPicKK3RfTEUgPSByJzw9JwordF9HRSA9IHInPj0nCit0X0VRID0gcic9PScKK3RfTkUgPSByJyE9JworCisjIEFzc2lnbm1lbnQgb3BlcmF0b3JzCisKK3RfRVFVQUxTID0gcic9JwordF9USU1FU0VRVUFMID0gcidcKj0nCit0X0RJVkVRVUFMID0gcicvPScKK3RfTU9ERVFVQUwgPSByJyU9JwordF9QTFVTRVFVQUwgPSByJ1wrPScKK3RfTUlOVVNFUVVBTCA9IHInLT0nCit0X0xTSElGVEVRVUFMID0gcic8PD0nCit0X1JTSElGVEVRVUFMID0gcic+Pj0nCit0X0FOREVRVUFMID0gcicmPScKK3RfT1JFUVVBTCA9IHInXHw9JwordF9YT1JFUVVBTCA9IHInXF49JworCisjIEluY3JlbWVudC9kZWNyZW1lbnQKK3RfUExVU1BMVVMgPSByJ1wrXCsnCit0X01JTlVTTUlOVVMgPSByJy0tJworCisjIC0+Cit0X0FSUk9XID0gcictPicKKworIyA/Cit0X0NPTkRPUCA9IHInXD8nCisKKyMgRGVsaW1ldGVycwordF9MUEFSRU4gPSByJ1woJwordF9SUEFSRU4gPSByJ1wpJwordF9MQlJBQ0tFVCA9IHInXFsnCit0X1JCUkFDS0VUID0gcidcXScKK3RfTEJSQUNFID0gcidceycKK3RfUkJSQUNFID0gcidcfScKK3RfQ09NTUEgPSByJywnCit0X1BFUklPRCA9IHInXC4nCit0X1NFTUkgPSByJzsnCit0X0NPTE9OID0gcic6JwordF9FTExJUFNJUyA9IHInXC5cLlwuJworCisjIElkZW50aWZpZXJzIGFuZCByZXNlcnZlZCB3b3JkcworCityZXNlcnZlZF9tYXAgPSB7fQorZm9yIHIgaW4gcmVzZXJ2ZWQ6CisgICAgcmVzZXJ2ZWRfbWFwW3IubG93ZXIoKV0gPSByCisKKworZGVmIHRfSUQodCk6CisgICAgcidbQS1aYS16X11bXHdfXSonCisgICAgdC50eXBlID0gcmVzZXJ2ZWRfbWFwLmdldCh0LnZhbHVlLCAiSUQiKQorICAgIHJldHVybiB0CisKKyMgSW50ZWdlciBsaXRlcmFsCit0X0lDT05TVCA9IHInXGQrKFt1VV18W2xMXXxbdVVdW2xMXXxbbExdW3VVXSk/JworCisjIEZsb2F0aW5nIGxpdGVyYWwKK3RfRkNPTlNUID0gcicoKFxkKykoXC5cZCspKGUoXCt8LSk/KFxkKykpPyB8IChcZCspZShcK3wtKT8oXGQrKSkoW2xMXXxbZkZdKT8nCisKKyMgU3RyaW5nIGxpdGVyYWwKK3RfU0NPTlNUID0gcidcIihbXlxcXG5dfChcXC4pKSo/XCInCisKKyMgQ2hhcmFjdGVyIGNvbnN0YW50ICdjJyBvciBMJ2MnCit0X0NDT05TVCA9IHInKEwpP1wnKFteXFxcbl18KFxcLikpKj9cJycKKworIyBDb21tZW50cworCisKK2RlZiB0X2NvbW1lbnQodCk6CisgICAgcicvXCooLnxcbikqP1wqLycKKyAgICB0LmxleGVyLmxpbmVubyArPSB0LnZhbHVlLmNvdW50KCdcbicpCisKKyMgUHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSAoaWdub3JlZCkKKworCitkZWYgdF9wcmVwcm9jZXNzb3IodCk6CisgICAgcidcIyguKSo/XG4nCisgICAgdC5sZXhlci5saW5lbm8gKz0gMQorCisKK2RlZiB0X2Vycm9yKHQpOgorICAgIHByaW50KCJJbGxlZ2FsIGNoYXJhY3RlciAlcyIgJSByZXByKHQudmFsdWVbMF0pKQorICAgIHQubGV4ZXIuc2tpcCgxKQorCitsZXhlciA9IGxleC5sZXgoKQoraWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBsZXgucnVubWFpbihsZXhlcikKZGlmZiAtLWdpdCBhL3BseS9leGFtcGxlL2Fuc2ljL2NwYXJzZS5weSBiL3BseS9leGFtcGxlL2Fuc2ljL2NwYXJzZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmU5YmNlCi0tLSAvZGV2L251bGwKKysrIGIvcGx5L2V4YW1wbGUvYW5zaWMvY3BhcnNlLnB5CkBAIC0wLDAgKzEsMTA0OCBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjcGFyc2UucHkKKyMKKyMgU2ltcGxlIHBhcnNlciBmb3IgQU5TSSBDLiAgQmFzZWQgb24gdGhlIGdyYW1tYXIgaW4gSyZSLCAybmQgRWQuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBjbGV4CitpbXBvcnQgcGx5LnlhY2MgYXMgeWFjYworCisjIEdldCB0aGUgdG9rZW4gbWFwCit0b2tlbnMgPSBjbGV4LnRva2VucworCisjIHRyYW5zbGF0aW9uLXVuaXQ6CisKKworZGVmIHBfdHJhbnNsYXRpb25fdW5pdF8xKHQpOgorICAgICd0cmFuc2xhdGlvbl91bml0IDogZXh0ZXJuYWxfZGVjbGFyYXRpb24nCisgICAgcGFzcworCisKK2RlZiBwX3RyYW5zbGF0aW9uX3VuaXRfMih0KToKKyAgICAndHJhbnNsYXRpb25fdW5pdCA6IHRyYW5zbGF0aW9uX3VuaXQgZXh0ZXJuYWxfZGVjbGFyYXRpb24nCisgICAgcGFzcworCisjIGV4dGVybmFsLWRlY2xhcmF0aW9uOgorCisKK2RlZiBwX2V4dGVybmFsX2RlY2xhcmF0aW9uXzEodCk6CisgICAgJ2V4dGVybmFsX2RlY2xhcmF0aW9uIDogZnVuY3Rpb25fZGVmaW5pdGlvbicKKyAgICBwYXNzCisKKworZGVmIHBfZXh0ZXJuYWxfZGVjbGFyYXRpb25fMih0KToKKyAgICAnZXh0ZXJuYWxfZGVjbGFyYXRpb24gOiBkZWNsYXJhdGlvbicKKyAgICBwYXNzCisKKyMgZnVuY3Rpb24tZGVmaW5pdGlvbjoKKworCitkZWYgcF9mdW5jdGlvbl9kZWZpbml0aW9uXzEodCk6CisgICAgJ2Z1bmN0aW9uX2RlZmluaXRpb24gOiBkZWNsYXJhdGlvbl9zcGVjaWZpZXJzIGRlY2xhcmF0b3IgZGVjbGFyYXRpb25fbGlzdCBjb21wb3VuZF9zdGF0ZW1lbnQnCisgICAgcGFzcworCisKK2RlZiBwX2Z1bmN0aW9uX2RlZmluaXRpb25fMih0KToKKyAgICAnZnVuY3Rpb25fZGVmaW5pdGlvbiA6IGRlY2xhcmF0b3IgZGVjbGFyYXRpb25fbGlzdCBjb21wb3VuZF9zdGF0ZW1lbnQnCisgICAgcGFzcworCisKK2RlZiBwX2Z1bmN0aW9uX2RlZmluaXRpb25fMyh0KToKKyAgICAnZnVuY3Rpb25fZGVmaW5pdGlvbiA6IGRlY2xhcmF0b3IgY29tcG91bmRfc3RhdGVtZW50JworICAgIHBhc3MKKworCitkZWYgcF9mdW5jdGlvbl9kZWZpbml0aW9uXzQodCk6CisgICAgJ2Z1bmN0aW9uX2RlZmluaXRpb24gOiBkZWNsYXJhdGlvbl9zcGVjaWZpZXJzIGRlY2xhcmF0b3IgY29tcG91bmRfc3RhdGVtZW50JworICAgIHBhc3MKKworIyBkZWNsYXJhdGlvbjoKKworCitkZWYgcF9kZWNsYXJhdGlvbl8xKHQpOgorICAgICdkZWNsYXJhdGlvbiA6IGRlY2xhcmF0aW9uX3NwZWNpZmllcnMgaW5pdF9kZWNsYXJhdG9yX2xpc3QgU0VNSScKKyAgICBwYXNzCisKKworZGVmIHBfZGVjbGFyYXRpb25fMih0KToKKyAgICAnZGVjbGFyYXRpb24gOiBkZWNsYXJhdGlvbl9zcGVjaWZpZXJzIFNFTUknCisgICAgcGFzcworCisjIGRlY2xhcmF0aW9uLWxpc3Q6CisKKworZGVmIHBfZGVjbGFyYXRpb25fbGlzdF8xKHQpOgorICAgICdkZWNsYXJhdGlvbl9saXN0IDogZGVjbGFyYXRpb24nCisgICAgcGFzcworCisKK2RlZiBwX2RlY2xhcmF0aW9uX2xpc3RfMih0KToKKyAgICAnZGVjbGFyYXRpb25fbGlzdCA6IGRlY2xhcmF0aW9uX2xpc3QgZGVjbGFyYXRpb24gJworICAgIHBhc3MKKworIyBkZWNsYXJhdGlvbi1zcGVjaWZpZXJzCisKKworZGVmIHBfZGVjbGFyYXRpb25fc3BlY2lmaWVyc18xKHQpOgorICAgICdkZWNsYXJhdGlvbl9zcGVjaWZpZXJzIDogc3RvcmFnZV9jbGFzc19zcGVjaWZpZXIgZGVjbGFyYXRpb25fc3BlY2lmaWVycycKKyAgICBwYXNzCisKKworZGVmIHBfZGVjbGFyYXRpb25fc3BlY2lmaWVyc18yKHQpOgorICAgICdkZWNsYXJhdGlvbl9zcGVjaWZpZXJzIDogdHlwZV9zcGVjaWZpZXIgZGVjbGFyYXRpb25fc3BlY2lmaWVycycKKyAgICBwYXNzCisKKworZGVmIHBfZGVjbGFyYXRpb25fc3BlY2lmaWVyc18zKHQpOgorICAgICdkZWNsYXJhdGlvbl9zcGVjaWZpZXJzIDogdHlwZV9xdWFsaWZpZXIgZGVjbGFyYXRpb25fc3BlY2lmaWVycycKKyAgICBwYXNzCisKKworZGVmIHBfZGVjbGFyYXRpb25fc3BlY2lmaWVyc180KHQpOgorICAgICdkZWNsYXJhdGlvbl9zcGVjaWZpZXJzIDogc3RvcmFnZV9jbGFzc19zcGVjaWZpZXInCisgICAgcGFzcworCisKK2RlZiBwX2RlY2xhcmF0aW9uX3NwZWNpZmllcnNfNSh0KToKKyAgICAnZGVjbGFyYXRpb25fc3BlY2lmaWVycyA6IHR5cGVfc3BlY2lmaWVyJworICAgIHBhc3MKKworCitkZWYgcF9kZWNsYXJhdGlvbl9zcGVjaWZpZXJzXzYodCk6CisgICAgJ2RlY2xhcmF0aW9uX3NwZWNpZmllcnMgOiB0eXBlX3F1YWxpZmllcicKKyAgICBwYXNzCisKKyMgc3RvcmFnZS1jbGFzcy1zcGVjaWZpZXIKKworCitkZWYgcF9zdG9yYWdlX2NsYXNzX3NwZWNpZmllcih0KToKKyAgICAnJydzdG9yYWdlX2NsYXNzX3NwZWNpZmllciA6IEFVVE8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJFR0lTVEVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTVEFUSUMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVYVEVSTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFlQRURFRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnJworICAgIHBhc3MKKworIyB0eXBlLXNwZWNpZmllcjoKKworCitkZWYgcF90eXBlX3NwZWNpZmllcih0KToKKyAgICAnJyd0eXBlX3NwZWNpZmllciA6IFZPSUQKKyAgICAgICAgICAgICAgICAgICAgICB8IENIQVIKKyAgICAgICAgICAgICAgICAgICAgICB8IFNIT1JUCisgICAgICAgICAgICAgICAgICAgICAgfCBJTlQKKyAgICAgICAgICAgICAgICAgICAgICB8IExPTkcKKyAgICAgICAgICAgICAgICAgICAgICB8IEZMT0FUCisgICAgICAgICAgICAgICAgICAgICAgfCBET1VCTEUKKyAgICAgICAgICAgICAgICAgICAgICB8IFNJR05FRAorICAgICAgICAgICAgICAgICAgICAgIHwgVU5TSUdORUQKKyAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdF9vcl91bmlvbl9zcGVjaWZpZXIKKyAgICAgICAgICAgICAgICAgICAgICB8IGVudW1fc3BlY2lmaWVyCisgICAgICAgICAgICAgICAgICAgICAgfCBUWVBFSUQKKyAgICAgICAgICAgICAgICAgICAgICAnJycKKyAgICBwYXNzCisKKyMgdHlwZS1xdWFsaWZpZXI6CisKKworZGVmIHBfdHlwZV9xdWFsaWZpZXIodCk6CisgICAgJycndHlwZV9xdWFsaWZpZXIgOiBDT05TVAorICAgICAgICAgICAgICAgICAgICAgIHwgVk9MQVRJTEUnJycKKyAgICBwYXNzCisKKyMgc3RydWN0LW9yLXVuaW9uLXNwZWNpZmllcgorCisKK2RlZiBwX3N0cnVjdF9vcl91bmlvbl9zcGVjaWZpZXJfMSh0KToKKyAgICAnc3RydWN0X29yX3VuaW9uX3NwZWNpZmllciA6IHN0cnVjdF9vcl91bmlvbiBJRCBMQlJBQ0Ugc3RydWN0X2RlY2xhcmF0aW9uX2xpc3QgUkJSQUNFJworICAgIHBhc3MKKworCitkZWYgcF9zdHJ1Y3Rfb3JfdW5pb25fc3BlY2lmaWVyXzIodCk6CisgICAgJ3N0cnVjdF9vcl91bmlvbl9zcGVjaWZpZXIgOiBzdHJ1Y3Rfb3JfdW5pb24gTEJSQUNFIHN0cnVjdF9kZWNsYXJhdGlvbl9saXN0IFJCUkFDRScKKyAgICBwYXNzCisKKworZGVmIHBfc3RydWN0X29yX3VuaW9uX3NwZWNpZmllcl8zKHQpOgorICAgICdzdHJ1Y3Rfb3JfdW5pb25fc3BlY2lmaWVyIDogc3RydWN0X29yX3VuaW9uIElEJworICAgIHBhc3MKKworIyBzdHJ1Y3Qtb3ItdW5pb246CisKKworZGVmIHBfc3RydWN0X29yX3VuaW9uKHQpOgorICAgICcnJ3N0cnVjdF9vcl91bmlvbiA6IFNUUlVDVAorICAgICAgICAgICAgICAgICAgICAgICB8IFVOSU9OCisgICAgICAgICAgICAgICAgICAgICAgICcnJworICAgIHBhc3MKKworIyBzdHJ1Y3QtZGVjbGFyYXRpb24tbGlzdDoKKworCitkZWYgcF9zdHJ1Y3RfZGVjbGFyYXRpb25fbGlzdF8xKHQpOgorICAgICdzdHJ1Y3RfZGVjbGFyYXRpb25fbGlzdCA6IHN0cnVjdF9kZWNsYXJhdGlvbicKKyAgICBwYXNzCisKKworZGVmIHBfc3RydWN0X2RlY2xhcmF0aW9uX2xpc3RfMih0KToKKyAgICAnc3RydWN0X2RlY2xhcmF0aW9uX2xpc3QgOiBzdHJ1Y3RfZGVjbGFyYXRpb25fbGlzdCBzdHJ1Y3RfZGVjbGFyYXRpb24nCisgICAgcGFzcworCisjIGluaXQtZGVjbGFyYXRvci1saXN0OgorCisKK2RlZiBwX2luaXRfZGVjbGFyYXRvcl9saXN0XzEodCk6CisgICAgJ2luaXRfZGVjbGFyYXRvcl9saXN0IDogaW5pdF9kZWNsYXJhdG9yJworICAgIHBhc3MKKworCitkZWYgcF9pbml0X2RlY2xhcmF0b3JfbGlzdF8yKHQpOgorICAgICdpbml0X2RlY2xhcmF0b3JfbGlzdCA6IGluaXRfZGVjbGFyYXRvcl9saXN0IENPTU1BIGluaXRfZGVjbGFyYXRvcicKKyAgICBwYXNzCisKKyMgaW5pdC1kZWNsYXJhdG9yCisKKworZGVmIHBfaW5pdF9kZWNsYXJhdG9yXzEodCk6CisgICAgJ2luaXRfZGVjbGFyYXRvciA6IGRlY2xhcmF0b3InCisgICAgcGFzcworCisKK2RlZiBwX2luaXRfZGVjbGFyYXRvcl8yKHQpOgorICAgICdpbml0X2RlY2xhcmF0b3IgOiBkZWNsYXJhdG9yIEVRVUFMUyBpbml0aWFsaXplcicKKyAgICBwYXNzCisKKyMgc3RydWN0LWRlY2xhcmF0aW9uOgorCisKK2RlZiBwX3N0cnVjdF9kZWNsYXJhdGlvbih0KToKKyAgICAnc3RydWN0X2RlY2xhcmF0aW9uIDogc3BlY2lmaWVyX3F1YWxpZmllcl9saXN0IHN0cnVjdF9kZWNsYXJhdG9yX2xpc3QgU0VNSScKKyAgICBwYXNzCisKKyMgc3BlY2lmaWVyLXF1YWxpZmllci1saXN0OgorCisKK2RlZiBwX3NwZWNpZmllcl9xdWFsaWZpZXJfbGlzdF8xKHQpOgorICAgICdzcGVjaWZpZXJfcXVhbGlmaWVyX2xpc3QgOiB0eXBlX3NwZWNpZmllciBzcGVjaWZpZXJfcXVhbGlmaWVyX2xpc3QnCisgICAgcGFzcworCisKK2RlZiBwX3NwZWNpZmllcl9xdWFsaWZpZXJfbGlzdF8yKHQpOgorICAgICdzcGVjaWZpZXJfcXVhbGlmaWVyX2xpc3QgOiB0eXBlX3NwZWNpZmllcicKKyAgICBwYXNzCisKKworZGVmIHBfc3BlY2lmaWVyX3F1YWxpZmllcl9saXN0XzModCk6CisgICAgJ3NwZWNpZmllcl9xdWFsaWZpZXJfbGlzdCA6IHR5cGVfcXVhbGlmaWVyIHNwZWNpZmllcl9xdWFsaWZpZXJfbGlzdCcKKyAgICBwYXNzCisKKworZGVmIHBfc3BlY2lmaWVyX3F1YWxpZmllcl9saXN0XzQodCk6CisgICAgJ3NwZWNpZmllcl9xdWFsaWZpZXJfbGlzdCA6IHR5cGVfcXVhbGlmaWVyJworICAgIHBhc3MKKworIyBzdHJ1Y3QtZGVjbGFyYXRvci1saXN0OgorCisKK2RlZiBwX3N0cnVjdF9kZWNsYXJhdG9yX2xpc3RfMSh0KToKKyAgICAnc3RydWN0X2RlY2xhcmF0b3JfbGlzdCA6IHN0cnVjdF9kZWNsYXJhdG9yJworICAgIHBhc3MKKworCitkZWYgcF9zdHJ1Y3RfZGVjbGFyYXRvcl9saXN0XzIodCk6CisgICAgJ3N0cnVjdF9kZWNsYXJhdG9yX2xpc3QgOiBzdHJ1Y3RfZGVjbGFyYXRvcl9saXN0IENPTU1BIHN0cnVjdF9kZWNsYXJhdG9yJworICAgIHBhc3MKKworIyBzdHJ1Y3QtZGVjbGFyYXRvcjoKKworCitkZWYgcF9zdHJ1Y3RfZGVjbGFyYXRvcl8xKHQpOgorICAgICdzdHJ1Y3RfZGVjbGFyYXRvciA6IGRlY2xhcmF0b3InCisgICAgcGFzcworCisKK2RlZiBwX3N0cnVjdF9kZWNsYXJhdG9yXzIodCk6CisgICAgJ3N0cnVjdF9kZWNsYXJhdG9yIDogZGVjbGFyYXRvciBDT0xPTiBjb25zdGFudF9leHByZXNzaW9uJworICAgIHBhc3MKKworCitkZWYgcF9zdHJ1Y3RfZGVjbGFyYXRvcl8zKHQpOgorICAgICdzdHJ1Y3RfZGVjbGFyYXRvciA6IENPTE9OIGNvbnN0YW50X2V4cHJlc3Npb24nCisgICAgcGFzcworCisjIGVudW0tc3BlY2lmaWVyOgorCisKK2RlZiBwX2VudW1fc3BlY2lmaWVyXzEodCk6CisgICAgJ2VudW1fc3BlY2lmaWVyIDogRU5VTSBJRCBMQlJBQ0UgZW51bWVyYXRvcl9saXN0IFJCUkFDRScKKyAgICBwYXNzCisKKworZGVmIHBfZW51bV9zcGVjaWZpZXJfMih0KToKKyAgICAnZW51bV9zcGVjaWZpZXIgOiBFTlVNIExCUkFDRSBlbnVtZXJhdG9yX2xpc3QgUkJSQUNFJworICAgIHBhc3MKKworCitkZWYgcF9lbnVtX3NwZWNpZmllcl8zKHQpOgorICAgICdlbnVtX3NwZWNpZmllciA6IEVOVU0gSUQnCisgICAgcGFzcworCisjIGVudW1lcmF0b3JfbGlzdDoKKworCitkZWYgcF9lbnVtZXJhdG9yX2xpc3RfMSh0KToKKyAgICAnZW51bWVyYXRvcl9saXN0IDogZW51bWVyYXRvcicKKyAgICBwYXNzCisKKworZGVmIHBfZW51bWVyYXRvcl9saXN0XzIodCk6CisgICAgJ2VudW1lcmF0b3JfbGlzdCA6IGVudW1lcmF0b3JfbGlzdCBDT01NQSBlbnVtZXJhdG9yJworICAgIHBhc3MKKworIyBlbnVtZXJhdG9yOgorCisKK2RlZiBwX2VudW1lcmF0b3JfMSh0KToKKyAgICAnZW51bWVyYXRvciA6IElEJworICAgIHBhc3MKKworCitkZWYgcF9lbnVtZXJhdG9yXzIodCk6CisgICAgJ2VudW1lcmF0b3IgOiBJRCBFUVVBTFMgY29uc3RhbnRfZXhwcmVzc2lvbicKKyAgICBwYXNzCisKKyMgZGVjbGFyYXRvcjoKKworCitkZWYgcF9kZWNsYXJhdG9yXzEodCk6CisgICAgJ2RlY2xhcmF0b3IgOiBwb2ludGVyIGRpcmVjdF9kZWNsYXJhdG9yJworICAgIHBhc3MKKworCitkZWYgcF9kZWNsYXJhdG9yXzIodCk6CisgICAgJ2RlY2xhcmF0b3IgOiBkaXJlY3RfZGVjbGFyYXRvcicKKyAgICBwYXNzCisKKyMgZGlyZWN0LWRlY2xhcmF0b3I6CisKKworZGVmIHBfZGlyZWN0X2RlY2xhcmF0b3JfMSh0KToKKyAgICAnZGlyZWN0X2RlY2xhcmF0b3IgOiBJRCcKKyAgICBwYXNzCisKKworZGVmIHBfZGlyZWN0X2RlY2xhcmF0b3JfMih0KToKKyAgICAnZGlyZWN0X2RlY2xhcmF0b3IgOiBMUEFSRU4gZGVjbGFyYXRvciBSUEFSRU4nCisgICAgcGFzcworCisKK2RlZiBwX2RpcmVjdF9kZWNsYXJhdG9yXzModCk6CisgICAgJ2RpcmVjdF9kZWNsYXJhdG9yIDogZGlyZWN0X2RlY2xhcmF0b3IgTEJSQUNLRVQgY29uc3RhbnRfZXhwcmVzc2lvbl9vcHQgUkJSQUNLRVQnCisgICAgcGFzcworCisKK2RlZiBwX2RpcmVjdF9kZWNsYXJhdG9yXzQodCk6CisgICAgJ2RpcmVjdF9kZWNsYXJhdG9yIDogZGlyZWN0X2RlY2xhcmF0b3IgTFBBUkVOIHBhcmFtZXRlcl90eXBlX2xpc3QgUlBBUkVOICcKKyAgICBwYXNzCisKKworZGVmIHBfZGlyZWN0X2RlY2xhcmF0b3JfNSh0KToKKyAgICAnZGlyZWN0X2RlY2xhcmF0b3IgOiBkaXJlY3RfZGVjbGFyYXRvciBMUEFSRU4gaWRlbnRpZmllcl9saXN0IFJQQVJFTiAnCisgICAgcGFzcworCisKK2RlZiBwX2RpcmVjdF9kZWNsYXJhdG9yXzYodCk6CisgICAgJ2RpcmVjdF9kZWNsYXJhdG9yIDogZGlyZWN0X2RlY2xhcmF0b3IgTFBBUkVOIFJQQVJFTiAnCisgICAgcGFzcworCisjIHBvaW50ZXI6CisKKworZGVmIHBfcG9pbnRlcl8xKHQpOgorICAgICdwb2ludGVyIDogVElNRVMgdHlwZV9xdWFsaWZpZXJfbGlzdCcKKyAgICBwYXNzCisKKworZGVmIHBfcG9pbnRlcl8yKHQpOgorICAgICdwb2ludGVyIDogVElNRVMnCisgICAgcGFzcworCisKK2RlZiBwX3BvaW50ZXJfMyh0KToKKyAgICAncG9pbnRlciA6IFRJTUVTIHR5cGVfcXVhbGlmaWVyX2xpc3QgcG9pbnRlcicKKyAgICBwYXNzCisKKworZGVmIHBfcG9pbnRlcl80KHQpOgorICAgICdwb2ludGVyIDogVElNRVMgcG9pbnRlcicKKyAgICBwYXNzCisKKyMgdHlwZS1xdWFsaWZpZXItbGlzdDoKKworCitkZWYgcF90eXBlX3F1YWxpZmllcl9saXN0XzEodCk6CisgICAgJ3R5cGVfcXVhbGlmaWVyX2xpc3QgOiB0eXBlX3F1YWxpZmllcicKKyAgICBwYXNzCisKKworZGVmIHBfdHlwZV9xdWFsaWZpZXJfbGlzdF8yKHQpOgorICAgICd0eXBlX3F1YWxpZmllcl9saXN0IDogdHlwZV9xdWFsaWZpZXJfbGlzdCB0eXBlX3F1YWxpZmllcicKKyAgICBwYXNzCisKKyMgcGFyYW1ldGVyLXR5cGUtbGlzdDoKKworCitkZWYgcF9wYXJhbWV0ZXJfdHlwZV9saXN0XzEodCk6CisgICAgJ3BhcmFtZXRlcl90eXBlX2xpc3QgOiBwYXJhbWV0ZXJfbGlzdCcKKyAgICBwYXNzCisKKworZGVmIHBfcGFyYW1ldGVyX3R5cGVfbGlzdF8yKHQpOgorICAgICdwYXJhbWV0ZXJfdHlwZV9saXN0IDogcGFyYW1ldGVyX2xpc3QgQ09NTUEgRUxMSVBTSVMnCisgICAgcGFzcworCisjIHBhcmFtZXRlci1saXN0OgorCisKK2RlZiBwX3BhcmFtZXRlcl9saXN0XzEodCk6CisgICAgJ3BhcmFtZXRlcl9saXN0IDogcGFyYW1ldGVyX2RlY2xhcmF0aW9uJworICAgIHBhc3MKKworCitkZWYgcF9wYXJhbWV0ZXJfbGlzdF8yKHQpOgorICAgICdwYXJhbWV0ZXJfbGlzdCA6IHBhcmFtZXRlcl9saXN0IENPTU1BIHBhcmFtZXRlcl9kZWNsYXJhdGlvbicKKyAgICBwYXNzCisKKyMgcGFyYW1ldGVyLWRlY2xhcmF0aW9uOgorCisKK2RlZiBwX3BhcmFtZXRlcl9kZWNsYXJhdGlvbl8xKHQpOgorICAgICdwYXJhbWV0ZXJfZGVjbGFyYXRpb24gOiBkZWNsYXJhdGlvbl9zcGVjaWZpZXJzIGRlY2xhcmF0b3InCisgICAgcGFzcworCisKK2RlZiBwX3BhcmFtZXRlcl9kZWNsYXJhdGlvbl8yKHQpOgorICAgICdwYXJhbWV0ZXJfZGVjbGFyYXRpb24gOiBkZWNsYXJhdGlvbl9zcGVjaWZpZXJzIGFic3RyYWN0X2RlY2xhcmF0b3Jfb3B0JworICAgIHBhc3MKKworIyBpZGVudGlmaWVyLWxpc3Q6CisKKworZGVmIHBfaWRlbnRpZmllcl9saXN0XzEodCk6CisgICAgJ2lkZW50aWZpZXJfbGlzdCA6IElEJworICAgIHBhc3MKKworCitkZWYgcF9pZGVudGlmaWVyX2xpc3RfMih0KToKKyAgICAnaWRlbnRpZmllcl9saXN0IDogaWRlbnRpZmllcl9saXN0IENPTU1BIElEJworICAgIHBhc3MKKworIyBpbml0aWFsaXplcjoKKworCitkZWYgcF9pbml0aWFsaXplcl8xKHQpOgorICAgICdpbml0aWFsaXplciA6IGFzc2lnbm1lbnRfZXhwcmVzc2lvbicKKyAgICBwYXNzCisKKworZGVmIHBfaW5pdGlhbGl6ZXJfMih0KToKKyAgICAnJydpbml0aWFsaXplciA6IExCUkFDRSBpbml0aWFsaXplcl9saXN0IFJCUkFDRQorICAgICAgICAgICAgICAgICAgIHwgTEJSQUNFIGluaXRpYWxpemVyX2xpc3QgQ09NTUEgUkJSQUNFJycnCisgICAgcGFzcworCisjIGluaXRpYWxpemVyLWxpc3Q6CisKKworZGVmIHBfaW5pdGlhbGl6ZXJfbGlzdF8xKHQpOgorICAgICdpbml0aWFsaXplcl9saXN0IDogaW5pdGlhbGl6ZXInCisgICAgcGFzcworCisKK2RlZiBwX2luaXRpYWxpemVyX2xpc3RfMih0KToKKyAgICAnaW5pdGlhbGl6ZXJfbGlzdCA6IGluaXRpYWxpemVyX2xpc3QgQ09NTUEgaW5pdGlhbGl6ZXInCisgICAgcGFzcworCisjIHR5cGUtbmFtZToKKworCitkZWYgcF90eXBlX25hbWUodCk6CisgICAgJ3R5cGVfbmFtZSA6IHNwZWNpZmllcl9xdWFsaWZpZXJfbGlzdCBhYnN0cmFjdF9kZWNsYXJhdG9yX29wdCcKKyAgICBwYXNzCisKKworZGVmIHBfYWJzdHJhY3RfZGVjbGFyYXRvcl9vcHRfMSh0KToKKyAgICAnYWJzdHJhY3RfZGVjbGFyYXRvcl9vcHQgOiBlbXB0eScKKyAgICBwYXNzCisKKworZGVmIHBfYWJzdHJhY3RfZGVjbGFyYXRvcl9vcHRfMih0KToKKyAgICAnYWJzdHJhY3RfZGVjbGFyYXRvcl9vcHQgOiBhYnN0cmFjdF9kZWNsYXJhdG9yJworICAgIHBhc3MKKworIyBhYnN0cmFjdC1kZWNsYXJhdG9yOgorCisKK2RlZiBwX2Fic3RyYWN0X2RlY2xhcmF0b3JfMSh0KToKKyAgICAnYWJzdHJhY3RfZGVjbGFyYXRvciA6IHBvaW50ZXIgJworICAgIHBhc3MKKworCitkZWYgcF9hYnN0cmFjdF9kZWNsYXJhdG9yXzIodCk6CisgICAgJ2Fic3RyYWN0X2RlY2xhcmF0b3IgOiBwb2ludGVyIGRpcmVjdF9hYnN0cmFjdF9kZWNsYXJhdG9yJworICAgIHBhc3MKKworCitkZWYgcF9hYnN0cmFjdF9kZWNsYXJhdG9yXzModCk6CisgICAgJ2Fic3RyYWN0X2RlY2xhcmF0b3IgOiBkaXJlY3RfYWJzdHJhY3RfZGVjbGFyYXRvcicKKyAgICBwYXNzCisKKyMgZGlyZWN0LWFic3RyYWN0LWRlY2xhcmF0b3I6CisKKworZGVmIHBfZGlyZWN0X2Fic3RyYWN0X2RlY2xhcmF0b3JfMSh0KToKKyAgICAnZGlyZWN0X2Fic3RyYWN0X2RlY2xhcmF0b3IgOiBMUEFSRU4gYWJzdHJhY3RfZGVjbGFyYXRvciBSUEFSRU4nCisgICAgcGFzcworCisKK2RlZiBwX2RpcmVjdF9hYnN0cmFjdF9kZWNsYXJhdG9yXzIodCk6CisgICAgJ2RpcmVjdF9hYnN0cmFjdF9kZWNsYXJhdG9yIDogZGlyZWN0X2Fic3RyYWN0X2RlY2xhcmF0b3IgTEJSQUNLRVQgY29uc3RhbnRfZXhwcmVzc2lvbl9vcHQgUkJSQUNLRVQnCisgICAgcGFzcworCisKK2RlZiBwX2RpcmVjdF9hYnN0cmFjdF9kZWNsYXJhdG9yXzModCk6CisgICAgJ2RpcmVjdF9hYnN0cmFjdF9kZWNsYXJhdG9yIDogTEJSQUNLRVQgY29uc3RhbnRfZXhwcmVzc2lvbl9vcHQgUkJSQUNLRVQnCisgICAgcGFzcworCisKK2RlZiBwX2RpcmVjdF9hYnN0cmFjdF9kZWNsYXJhdG9yXzQodCk6CisgICAgJ2RpcmVjdF9hYnN0cmFjdF9kZWNsYXJhdG9yIDogZGlyZWN0X2Fic3RyYWN0X2RlY2xhcmF0b3IgTFBBUkVOIHBhcmFtZXRlcl90eXBlX2xpc3Rfb3B0IFJQQVJFTicKKyAgICBwYXNzCisKKworZGVmIHBfZGlyZWN0X2Fic3RyYWN0X2RlY2xhcmF0b3JfNSh0KToKKyAgICAnZGlyZWN0X2Fic3RyYWN0X2RlY2xhcmF0b3IgOiBMUEFSRU4gcGFyYW1ldGVyX3R5cGVfbGlzdF9vcHQgUlBBUkVOJworICAgIHBhc3MKKworIyBPcHRpb25hbCBmaWVsZHMgaW4gYWJzdHJhY3QgZGVjbGFyYXRvcnMKKworCitkZWYgcF9jb25zdGFudF9leHByZXNzaW9uX29wdF8xKHQpOgorICAgICdjb25zdGFudF9leHByZXNzaW9uX29wdCA6IGVtcHR5JworICAgIHBhc3MKKworCitkZWYgcF9jb25zdGFudF9leHByZXNzaW9uX29wdF8yKHQpOgorICAgICdjb25zdGFudF9leHByZXNzaW9uX29wdCA6IGNvbnN0YW50X2V4cHJlc3Npb24nCisgICAgcGFzcworCisKK2RlZiBwX3BhcmFtZXRlcl90eXBlX2xpc3Rfb3B0XzEodCk6CisgICAgJ3BhcmFtZXRlcl90eXBlX2xpc3Rfb3B0IDogZW1wdHknCisgICAgcGFzcworCisKK2RlZiBwX3BhcmFtZXRlcl90eXBlX2xpc3Rfb3B0XzIodCk6CisgICAgJ3BhcmFtZXRlcl90eXBlX2xpc3Rfb3B0IDogcGFyYW1ldGVyX3R5cGVfbGlzdCcKKyAgICBwYXNzCisKKyMgc3RhdGVtZW50OgorCisKK2RlZiBwX3N0YXRlbWVudCh0KToKKyAgICAnJycKKyAgICBzdGF0ZW1lbnQgOiBsYWJlbGVkX3N0YXRlbWVudAorICAgICAgICAgICAgICB8IGV4cHJlc3Npb25fc3RhdGVtZW50CisgICAgICAgICAgICAgIHwgY29tcG91bmRfc3RhdGVtZW50CisgICAgICAgICAgICAgIHwgc2VsZWN0aW9uX3N0YXRlbWVudAorICAgICAgICAgICAgICB8IGl0ZXJhdGlvbl9zdGF0ZW1lbnQKKyAgICAgICAgICAgICAgfCBqdW1wX3N0YXRlbWVudAorICAgICAgICAgICAgICAnJycKKyAgICBwYXNzCisKKyMgbGFiZWxlZC1zdGF0ZW1lbnQ6CisKKworZGVmIHBfbGFiZWxlZF9zdGF0ZW1lbnRfMSh0KToKKyAgICAnbGFiZWxlZF9zdGF0ZW1lbnQgOiBJRCBDT0xPTiBzdGF0ZW1lbnQnCisgICAgcGFzcworCisKK2RlZiBwX2xhYmVsZWRfc3RhdGVtZW50XzIodCk6CisgICAgJ2xhYmVsZWRfc3RhdGVtZW50IDogQ0FTRSBjb25zdGFudF9leHByZXNzaW9uIENPTE9OIHN0YXRlbWVudCcKKyAgICBwYXNzCisKKworZGVmIHBfbGFiZWxlZF9zdGF0ZW1lbnRfMyh0KToKKyAgICAnbGFiZWxlZF9zdGF0ZW1lbnQgOiBERUZBVUxUIENPTE9OIHN0YXRlbWVudCcKKyAgICBwYXNzCisKKyMgZXhwcmVzc2lvbi1zdGF0ZW1lbnQ6CisKKworZGVmIHBfZXhwcmVzc2lvbl9zdGF0ZW1lbnQodCk6CisgICAgJ2V4cHJlc3Npb25fc3RhdGVtZW50IDogZXhwcmVzc2lvbl9vcHQgU0VNSScKKyAgICBwYXNzCisKKyMgY29tcG91bmQtc3RhdGVtZW50OgorCisKK2RlZiBwX2NvbXBvdW5kX3N0YXRlbWVudF8xKHQpOgorICAgICdjb21wb3VuZF9zdGF0ZW1lbnQgOiBMQlJBQ0UgZGVjbGFyYXRpb25fbGlzdCBzdGF0ZW1lbnRfbGlzdCBSQlJBQ0UnCisgICAgcGFzcworCisKK2RlZiBwX2NvbXBvdW5kX3N0YXRlbWVudF8yKHQpOgorICAgICdjb21wb3VuZF9zdGF0ZW1lbnQgOiBMQlJBQ0Ugc3RhdGVtZW50X2xpc3QgUkJSQUNFJworICAgIHBhc3MKKworCitkZWYgcF9jb21wb3VuZF9zdGF0ZW1lbnRfMyh0KToKKyAgICAnY29tcG91bmRfc3RhdGVtZW50IDogTEJSQUNFIGRlY2xhcmF0aW9uX2xpc3QgUkJSQUNFJworICAgIHBhc3MKKworCitkZWYgcF9jb21wb3VuZF9zdGF0ZW1lbnRfNCh0KToKKyAgICAnY29tcG91bmRfc3RhdGVtZW50IDogTEJSQUNFIFJCUkFDRScKKyAgICBwYXNzCisKKyMgc3RhdGVtZW50LWxpc3Q6CisKKworZGVmIHBfc3RhdGVtZW50X2xpc3RfMSh0KToKKyAgICAnc3RhdGVtZW50X2xpc3QgOiBzdGF0ZW1lbnQnCisgICAgcGFzcworCisKK2RlZiBwX3N0YXRlbWVudF9saXN0XzIodCk6CisgICAgJ3N0YXRlbWVudF9saXN0IDogc3RhdGVtZW50X2xpc3Qgc3RhdGVtZW50JworICAgIHBhc3MKKworIyBzZWxlY3Rpb24tc3RhdGVtZW50CisKKworZGVmIHBfc2VsZWN0aW9uX3N0YXRlbWVudF8xKHQpOgorICAgICdzZWxlY3Rpb25fc3RhdGVtZW50IDogSUYgTFBBUkVOIGV4cHJlc3Npb24gUlBBUkVOIHN0YXRlbWVudCcKKyAgICBwYXNzCisKKworZGVmIHBfc2VsZWN0aW9uX3N0YXRlbWVudF8yKHQpOgorICAgICdzZWxlY3Rpb25fc3RhdGVtZW50IDogSUYgTFBBUkVOIGV4cHJlc3Npb24gUlBBUkVOIHN0YXRlbWVudCBFTFNFIHN0YXRlbWVudCAnCisgICAgcGFzcworCisKK2RlZiBwX3NlbGVjdGlvbl9zdGF0ZW1lbnRfMyh0KToKKyAgICAnc2VsZWN0aW9uX3N0YXRlbWVudCA6IFNXSVRDSCBMUEFSRU4gZXhwcmVzc2lvbiBSUEFSRU4gc3RhdGVtZW50ICcKKyAgICBwYXNzCisKKyMgaXRlcmF0aW9uX3N0YXRlbWVudDoKKworCitkZWYgcF9pdGVyYXRpb25fc3RhdGVtZW50XzEodCk6CisgICAgJ2l0ZXJhdGlvbl9zdGF0ZW1lbnQgOiBXSElMRSBMUEFSRU4gZXhwcmVzc2lvbiBSUEFSRU4gc3RhdGVtZW50JworICAgIHBhc3MKKworCitkZWYgcF9pdGVyYXRpb25fc3RhdGVtZW50XzIodCk6CisgICAgJ2l0ZXJhdGlvbl9zdGF0ZW1lbnQgOiBGT1IgTFBBUkVOIGV4cHJlc3Npb25fb3B0IFNFTUkgZXhwcmVzc2lvbl9vcHQgU0VNSSBleHByZXNzaW9uX29wdCBSUEFSRU4gc3RhdGVtZW50ICcKKyAgICBwYXNzCisKKworZGVmIHBfaXRlcmF0aW9uX3N0YXRlbWVudF8zKHQpOgorICAgICdpdGVyYXRpb25fc3RhdGVtZW50IDogRE8gc3RhdGVtZW50IFdISUxFIExQQVJFTiBleHByZXNzaW9uIFJQQVJFTiBTRU1JJworICAgIHBhc3MKKworIyBqdW1wX3N0YXRlbWVudDoKKworCitkZWYgcF9qdW1wX3N0YXRlbWVudF8xKHQpOgorICAgICdqdW1wX3N0YXRlbWVudCA6IEdPVE8gSUQgU0VNSScKKyAgICBwYXNzCisKKworZGVmIHBfanVtcF9zdGF0ZW1lbnRfMih0KToKKyAgICAnanVtcF9zdGF0ZW1lbnQgOiBDT05USU5VRSBTRU1JJworICAgIHBhc3MKKworCitkZWYgcF9qdW1wX3N0YXRlbWVudF8zKHQpOgorICAgICdqdW1wX3N0YXRlbWVudCA6IEJSRUFLIFNFTUknCisgICAgcGFzcworCisKK2RlZiBwX2p1bXBfc3RhdGVtZW50XzQodCk6CisgICAgJ2p1bXBfc3RhdGVtZW50IDogUkVUVVJOIGV4cHJlc3Npb25fb3B0IFNFTUknCisgICAgcGFzcworCisKK2RlZiBwX2V4cHJlc3Npb25fb3B0XzEodCk6CisgICAgJ2V4cHJlc3Npb25fb3B0IDogZW1wdHknCisgICAgcGFzcworCisKK2RlZiBwX2V4cHJlc3Npb25fb3B0XzIodCk6CisgICAgJ2V4cHJlc3Npb25fb3B0IDogZXhwcmVzc2lvbicKKyAgICBwYXNzCisKKyMgZXhwcmVzc2lvbjoKKworCitkZWYgcF9leHByZXNzaW9uXzEodCk6CisgICAgJ2V4cHJlc3Npb24gOiBhc3NpZ25tZW50X2V4cHJlc3Npb24nCisgICAgcGFzcworCisKK2RlZiBwX2V4cHJlc3Npb25fMih0KToKKyAgICAnZXhwcmVzc2lvbiA6IGV4cHJlc3Npb24gQ09NTUEgYXNzaWdubWVudF9leHByZXNzaW9uJworICAgIHBhc3MKKworIyBhc3NpZ21lbnRfZXhwcmVzc2lvbjoKKworCitkZWYgcF9hc3NpZ25tZW50X2V4cHJlc3Npb25fMSh0KToKKyAgICAnYXNzaWdubWVudF9leHByZXNzaW9uIDogY29uZGl0aW9uYWxfZXhwcmVzc2lvbicKKyAgICBwYXNzCisKKworZGVmIHBfYXNzaWdubWVudF9leHByZXNzaW9uXzIodCk6CisgICAgJ2Fzc2lnbm1lbnRfZXhwcmVzc2lvbiA6IHVuYXJ5X2V4cHJlc3Npb24gYXNzaWdubWVudF9vcGVyYXRvciBhc3NpZ25tZW50X2V4cHJlc3Npb24nCisgICAgcGFzcworCisjIGFzc2lnbm1lbnRfb3BlcmF0b3I6CisKKworZGVmIHBfYXNzaWdubWVudF9vcGVyYXRvcih0KToKKyAgICAnJycKKyAgICBhc3NpZ25tZW50X29wZXJhdG9yIDogRVFVQUxTCisgICAgICAgICAgICAgICAgICAgICAgICB8IFRJTUVTRVFVQUwKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgRElWRVFVQUwKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgTU9ERVFVQUwKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgUExVU0VRVUFMCisgICAgICAgICAgICAgICAgICAgICAgICB8IE1JTlVTRVFVQUwKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgTFNISUZURVFVQUwKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgUlNISUZURVFVQUwKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgQU5ERVFVQUwKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgT1JFUVVBTAorICAgICAgICAgICAgICAgICAgICAgICAgfCBYT1JFUVVBTAorICAgICAgICAgICAgICAgICAgICAgICAgJycnCisgICAgcGFzcworCisjIGNvbmRpdGlvbmFsLWV4cHJlc3Npb24KKworCitkZWYgcF9jb25kaXRpb25hbF9leHByZXNzaW9uXzEodCk6CisgICAgJ2NvbmRpdGlvbmFsX2V4cHJlc3Npb24gOiBsb2dpY2FsX29yX2V4cHJlc3Npb24nCisgICAgcGFzcworCisKK2RlZiBwX2NvbmRpdGlvbmFsX2V4cHJlc3Npb25fMih0KToKKyAgICAnY29uZGl0aW9uYWxfZXhwcmVzc2lvbiA6IGxvZ2ljYWxfb3JfZXhwcmVzc2lvbiBDT05ET1AgZXhwcmVzc2lvbiBDT0xPTiBjb25kaXRpb25hbF9leHByZXNzaW9uICcKKyAgICBwYXNzCisKKyMgY29uc3RhbnQtZXhwcmVzc2lvbgorCisKK2RlZiBwX2NvbnN0YW50X2V4cHJlc3Npb24odCk6CisgICAgJ2NvbnN0YW50X2V4cHJlc3Npb24gOiBjb25kaXRpb25hbF9leHByZXNzaW9uJworICAgIHBhc3MKKworIyBsb2dpY2FsLW9yLWV4cHJlc3Npb24KKworCitkZWYgcF9sb2dpY2FsX29yX2V4cHJlc3Npb25fMSh0KToKKyAgICAnbG9naWNhbF9vcl9leHByZXNzaW9uIDogbG9naWNhbF9hbmRfZXhwcmVzc2lvbicKKyAgICBwYXNzCisKKworZGVmIHBfbG9naWNhbF9vcl9leHByZXNzaW9uXzIodCk6CisgICAgJ2xvZ2ljYWxfb3JfZXhwcmVzc2lvbiA6IGxvZ2ljYWxfb3JfZXhwcmVzc2lvbiBMT1IgbG9naWNhbF9hbmRfZXhwcmVzc2lvbicKKyAgICBwYXNzCisKKyMgbG9naWNhbC1hbmQtZXhwcmVzc2lvbgorCisKK2RlZiBwX2xvZ2ljYWxfYW5kX2V4cHJlc3Npb25fMSh0KToKKyAgICAnbG9naWNhbF9hbmRfZXhwcmVzc2lvbiA6IGluY2x1c2l2ZV9vcl9leHByZXNzaW9uJworICAgIHBhc3MKKworCitkZWYgcF9sb2dpY2FsX2FuZF9leHByZXNzaW9uXzIodCk6CisgICAgJ2xvZ2ljYWxfYW5kX2V4cHJlc3Npb24gOiBsb2dpY2FsX2FuZF9leHByZXNzaW9uIExBTkQgaW5jbHVzaXZlX29yX2V4cHJlc3Npb24nCisgICAgcGFzcworCisjIGluY2x1c2l2ZS1vci1leHByZXNzaW9uOgorCisKK2RlZiBwX2luY2x1c2l2ZV9vcl9leHByZXNzaW9uXzEodCk6CisgICAgJ2luY2x1c2l2ZV9vcl9leHByZXNzaW9uIDogZXhjbHVzaXZlX29yX2V4cHJlc3Npb24nCisgICAgcGFzcworCisKK2RlZiBwX2luY2x1c2l2ZV9vcl9leHByZXNzaW9uXzIodCk6CisgICAgJ2luY2x1c2l2ZV9vcl9leHByZXNzaW9uIDogaW5jbHVzaXZlX29yX2V4cHJlc3Npb24gT1IgZXhjbHVzaXZlX29yX2V4cHJlc3Npb24nCisgICAgcGFzcworCisjIGV4Y2x1c2l2ZS1vci1leHByZXNzaW9uOgorCisKK2RlZiBwX2V4Y2x1c2l2ZV9vcl9leHByZXNzaW9uXzEodCk6CisgICAgJ2V4Y2x1c2l2ZV9vcl9leHByZXNzaW9uIDogIGFuZF9leHByZXNzaW9uJworICAgIHBhc3MKKworCitkZWYgcF9leGNsdXNpdmVfb3JfZXhwcmVzc2lvbl8yKHQpOgorICAgICdleGNsdXNpdmVfb3JfZXhwcmVzc2lvbiA6ICBleGNsdXNpdmVfb3JfZXhwcmVzc2lvbiBYT1IgYW5kX2V4cHJlc3Npb24nCisgICAgcGFzcworCisjIEFORC1leHByZXNzaW9uCisKKworZGVmIHBfYW5kX2V4cHJlc3Npb25fMSh0KToKKyAgICAnYW5kX2V4cHJlc3Npb24gOiBlcXVhbGl0eV9leHByZXNzaW9uJworICAgIHBhc3MKKworCitkZWYgcF9hbmRfZXhwcmVzc2lvbl8yKHQpOgorICAgICdhbmRfZXhwcmVzc2lvbiA6IGFuZF9leHByZXNzaW9uIEFORCBlcXVhbGl0eV9leHByZXNzaW9uJworICAgIHBhc3MKKworCisjIGVxdWFsaXR5LWV4cHJlc3Npb246CitkZWYgcF9lcXVhbGl0eV9leHByZXNzaW9uXzEodCk6CisgICAgJ2VxdWFsaXR5X2V4cHJlc3Npb24gOiByZWxhdGlvbmFsX2V4cHJlc3Npb24nCisgICAgcGFzcworCisKK2RlZiBwX2VxdWFsaXR5X2V4cHJlc3Npb25fMih0KToKKyAgICAnZXF1YWxpdHlfZXhwcmVzc2lvbiA6IGVxdWFsaXR5X2V4cHJlc3Npb24gRVEgcmVsYXRpb25hbF9leHByZXNzaW9uJworICAgIHBhc3MKKworCitkZWYgcF9lcXVhbGl0eV9leHByZXNzaW9uXzModCk6CisgICAgJ2VxdWFsaXR5X2V4cHJlc3Npb24gOiBlcXVhbGl0eV9leHByZXNzaW9uIE5FIHJlbGF0aW9uYWxfZXhwcmVzc2lvbicKKyAgICBwYXNzCisKKworIyByZWxhdGlvbmFsLWV4cHJlc3Npb246CitkZWYgcF9yZWxhdGlvbmFsX2V4cHJlc3Npb25fMSh0KToKKyAgICAncmVsYXRpb25hbF9leHByZXNzaW9uIDogc2hpZnRfZXhwcmVzc2lvbicKKyAgICBwYXNzCisKKworZGVmIHBfcmVsYXRpb25hbF9leHByZXNzaW9uXzIodCk6CisgICAgJ3JlbGF0aW9uYWxfZXhwcmVzc2lvbiA6IHJlbGF0aW9uYWxfZXhwcmVzc2lvbiBMVCBzaGlmdF9leHByZXNzaW9uJworICAgIHBhc3MKKworCitkZWYgcF9yZWxhdGlvbmFsX2V4cHJlc3Npb25fMyh0KToKKyAgICAncmVsYXRpb25hbF9leHByZXNzaW9uIDogcmVsYXRpb25hbF9leHByZXNzaW9uIEdUIHNoaWZ0X2V4cHJlc3Npb24nCisgICAgcGFzcworCisKK2RlZiBwX3JlbGF0aW9uYWxfZXhwcmVzc2lvbl80KHQpOgorICAgICdyZWxhdGlvbmFsX2V4cHJlc3Npb24gOiByZWxhdGlvbmFsX2V4cHJlc3Npb24gTEUgc2hpZnRfZXhwcmVzc2lvbicKKyAgICBwYXNzCisKKworZGVmIHBfcmVsYXRpb25hbF9leHByZXNzaW9uXzUodCk6CisgICAgJ3JlbGF0aW9uYWxfZXhwcmVzc2lvbiA6IHJlbGF0aW9uYWxfZXhwcmVzc2lvbiBHRSBzaGlmdF9leHByZXNzaW9uJworICAgIHBhc3MKKworIyBzaGlmdC1leHByZXNzaW9uCisKKworZGVmIHBfc2hpZnRfZXhwcmVzc2lvbl8xKHQpOgorICAgICdzaGlmdF9leHByZXNzaW9uIDogYWRkaXRpdmVfZXhwcmVzc2lvbicKKyAgICBwYXNzCisKKworZGVmIHBfc2hpZnRfZXhwcmVzc2lvbl8yKHQpOgorICAgICdzaGlmdF9leHByZXNzaW9uIDogc2hpZnRfZXhwcmVzc2lvbiBMU0hJRlQgYWRkaXRpdmVfZXhwcmVzc2lvbicKKyAgICBwYXNzCisKKworZGVmIHBfc2hpZnRfZXhwcmVzc2lvbl8zKHQpOgorICAgICdzaGlmdF9leHByZXNzaW9uIDogc2hpZnRfZXhwcmVzc2lvbiBSU0hJRlQgYWRkaXRpdmVfZXhwcmVzc2lvbicKKyAgICBwYXNzCisKKyMgYWRkaXRpdmUtZXhwcmVzc2lvbgorCisKK2RlZiBwX2FkZGl0aXZlX2V4cHJlc3Npb25fMSh0KToKKyAgICAnYWRkaXRpdmVfZXhwcmVzc2lvbiA6IG11bHRpcGxpY2F0aXZlX2V4cHJlc3Npb24nCisgICAgcGFzcworCisKK2RlZiBwX2FkZGl0aXZlX2V4cHJlc3Npb25fMih0KToKKyAgICAnYWRkaXRpdmVfZXhwcmVzc2lvbiA6IGFkZGl0aXZlX2V4cHJlc3Npb24gUExVUyBtdWx0aXBsaWNhdGl2ZV9leHByZXNzaW9uJworICAgIHBhc3MKKworCitkZWYgcF9hZGRpdGl2ZV9leHByZXNzaW9uXzModCk6CisgICAgJ2FkZGl0aXZlX2V4cHJlc3Npb24gOiBhZGRpdGl2ZV9leHByZXNzaW9uIE1JTlVTIG11bHRpcGxpY2F0aXZlX2V4cHJlc3Npb24nCisgICAgcGFzcworCisjIG11bHRpcGxpY2F0aXZlLWV4cHJlc3Npb24KKworCitkZWYgcF9tdWx0aXBsaWNhdGl2ZV9leHByZXNzaW9uXzEodCk6CisgICAgJ211bHRpcGxpY2F0aXZlX2V4cHJlc3Npb24gOiBjYXN0X2V4cHJlc3Npb24nCisgICAgcGFzcworCisKK2RlZiBwX211bHRpcGxpY2F0aXZlX2V4cHJlc3Npb25fMih0KToKKyAgICAnbXVsdGlwbGljYXRpdmVfZXhwcmVzc2lvbiA6IG11bHRpcGxpY2F0aXZlX2V4cHJlc3Npb24gVElNRVMgY2FzdF9leHByZXNzaW9uJworICAgIHBhc3MKKworCitkZWYgcF9tdWx0aXBsaWNhdGl2ZV9leHByZXNzaW9uXzModCk6CisgICAgJ211bHRpcGxpY2F0aXZlX2V4cHJlc3Npb24gOiBtdWx0aXBsaWNhdGl2ZV9leHByZXNzaW9uIERJVklERSBjYXN0X2V4cHJlc3Npb24nCisgICAgcGFzcworCisKK2RlZiBwX211bHRpcGxpY2F0aXZlX2V4cHJlc3Npb25fNCh0KToKKyAgICAnbXVsdGlwbGljYXRpdmVfZXhwcmVzc2lvbiA6IG11bHRpcGxpY2F0aXZlX2V4cHJlc3Npb24gTU9EIGNhc3RfZXhwcmVzc2lvbicKKyAgICBwYXNzCisKKyMgY2FzdC1leHByZXNzaW9uOgorCisKK2RlZiBwX2Nhc3RfZXhwcmVzc2lvbl8xKHQpOgorICAgICdjYXN0X2V4cHJlc3Npb24gOiB1bmFyeV9leHByZXNzaW9uJworICAgIHBhc3MKKworCitkZWYgcF9jYXN0X2V4cHJlc3Npb25fMih0KToKKyAgICAnY2FzdF9leHByZXNzaW9uIDogTFBBUkVOIHR5cGVfbmFtZSBSUEFSRU4gY2FzdF9leHByZXNzaW9uJworICAgIHBhc3MKKworIyB1bmFyeS1leHByZXNzaW9uOgorCisKK2RlZiBwX3VuYXJ5X2V4cHJlc3Npb25fMSh0KToKKyAgICAndW5hcnlfZXhwcmVzc2lvbiA6IHBvc3RmaXhfZXhwcmVzc2lvbicKKyAgICBwYXNzCisKKworZGVmIHBfdW5hcnlfZXhwcmVzc2lvbl8yKHQpOgorICAgICd1bmFyeV9leHByZXNzaW9uIDogUExVU1BMVVMgdW5hcnlfZXhwcmVzc2lvbicKKyAgICBwYXNzCisKKworZGVmIHBfdW5hcnlfZXhwcmVzc2lvbl8zKHQpOgorICAgICd1bmFyeV9leHByZXNzaW9uIDogTUlOVVNNSU5VUyB1bmFyeV9leHByZXNzaW9uJworICAgIHBhc3MKKworCitkZWYgcF91bmFyeV9leHByZXNzaW9uXzQodCk6CisgICAgJ3VuYXJ5X2V4cHJlc3Npb24gOiB1bmFyeV9vcGVyYXRvciBjYXN0X2V4cHJlc3Npb24nCisgICAgcGFzcworCisKK2RlZiBwX3VuYXJ5X2V4cHJlc3Npb25fNSh0KToKKyAgICAndW5hcnlfZXhwcmVzc2lvbiA6IFNJWkVPRiB1bmFyeV9leHByZXNzaW9uJworICAgIHBhc3MKKworCitkZWYgcF91bmFyeV9leHByZXNzaW9uXzYodCk6CisgICAgJ3VuYXJ5X2V4cHJlc3Npb24gOiBTSVpFT0YgTFBBUkVOIHR5cGVfbmFtZSBSUEFSRU4nCisgICAgcGFzcworCisjIHVuYXJ5LW9wZXJhdG9yCisKKworZGVmIHBfdW5hcnlfb3BlcmF0b3IodCk6CisgICAgJycndW5hcnlfb3BlcmF0b3IgOiBBTkQKKyAgICAgICAgICAgICAgICAgICAgfCBUSU1FUworICAgICAgICAgICAgICAgICAgICB8IFBMVVMgCisgICAgICAgICAgICAgICAgICAgIHwgTUlOVVMKKyAgICAgICAgICAgICAgICAgICAgfCBOT1QKKyAgICAgICAgICAgICAgICAgICAgfCBMTk9UICcnJworICAgIHBhc3MKKworIyBwb3N0Zml4LWV4cHJlc3Npb246CisKKworZGVmIHBfcG9zdGZpeF9leHByZXNzaW9uXzEodCk6CisgICAgJ3Bvc3RmaXhfZXhwcmVzc2lvbiA6IHByaW1hcnlfZXhwcmVzc2lvbicKKyAgICBwYXNzCisKKworZGVmIHBfcG9zdGZpeF9leHByZXNzaW9uXzIodCk6CisgICAgJ3Bvc3RmaXhfZXhwcmVzc2lvbiA6IHBvc3RmaXhfZXhwcmVzc2lvbiBMQlJBQ0tFVCBleHByZXNzaW9uIFJCUkFDS0VUJworICAgIHBhc3MKKworCitkZWYgcF9wb3N0Zml4X2V4cHJlc3Npb25fMyh0KToKKyAgICAncG9zdGZpeF9leHByZXNzaW9uIDogcG9zdGZpeF9leHByZXNzaW9uIExQQVJFTiBhcmd1bWVudF9leHByZXNzaW9uX2xpc3QgUlBBUkVOJworICAgIHBhc3MKKworCitkZWYgcF9wb3N0Zml4X2V4cHJlc3Npb25fNCh0KToKKyAgICAncG9zdGZpeF9leHByZXNzaW9uIDogcG9zdGZpeF9leHByZXNzaW9uIExQQVJFTiBSUEFSRU4nCisgICAgcGFzcworCisKK2RlZiBwX3Bvc3RmaXhfZXhwcmVzc2lvbl81KHQpOgorICAgICdwb3N0Zml4X2V4cHJlc3Npb24gOiBwb3N0Zml4X2V4cHJlc3Npb24gUEVSSU9EIElEJworICAgIHBhc3MKKworCitkZWYgcF9wb3N0Zml4X2V4cHJlc3Npb25fNih0KToKKyAgICAncG9zdGZpeF9leHByZXNzaW9uIDogcG9zdGZpeF9leHByZXNzaW9uIEFSUk9XIElEJworICAgIHBhc3MKKworCitkZWYgcF9wb3N0Zml4X2V4cHJlc3Npb25fNyh0KToKKyAgICAncG9zdGZpeF9leHByZXNzaW9uIDogcG9zdGZpeF9leHByZXNzaW9uIFBMVVNQTFVTJworICAgIHBhc3MKKworCitkZWYgcF9wb3N0Zml4X2V4cHJlc3Npb25fOCh0KToKKyAgICAncG9zdGZpeF9leHByZXNzaW9uIDogcG9zdGZpeF9leHByZXNzaW9uIE1JTlVTTUlOVVMnCisgICAgcGFzcworCisjIHByaW1hcnktZXhwcmVzc2lvbjoKKworCitkZWYgcF9wcmltYXJ5X2V4cHJlc3Npb24odCk6CisgICAgJycncHJpbWFyeV9leHByZXNzaW9uIDogIElECisgICAgICAgICAgICAgICAgICAgICAgICB8ICBjb25zdGFudAorICAgICAgICAgICAgICAgICAgICAgICAgfCAgU0NPTlNUCisgICAgICAgICAgICAgICAgICAgICAgICB8ICBMUEFSRU4gZXhwcmVzc2lvbiBSUEFSRU4nJycKKyAgICBwYXNzCisKKyMgYXJndW1lbnQtZXhwcmVzc2lvbi1saXN0OgorCisKK2RlZiBwX2FyZ3VtZW50X2V4cHJlc3Npb25fbGlzdCh0KToKKyAgICAnJydhcmd1bWVudF9leHByZXNzaW9uX2xpc3QgOiAgYXNzaWdubWVudF9leHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBhcmd1bWVudF9leHByZXNzaW9uX2xpc3QgQ09NTUEgYXNzaWdubWVudF9leHByZXNzaW9uJycnCisgICAgcGFzcworCisjIGNvbnN0YW50OgorCisKK2RlZiBwX2NvbnN0YW50KHQpOgorICAgICcnJ2NvbnN0YW50IDogSUNPTlNUCisgICAgICAgICAgICAgICB8IEZDT05TVAorICAgICAgICAgICAgICAgfCBDQ09OU1QnJycKKyAgICBwYXNzCisKKworZGVmIHBfZW1wdHkodCk6CisgICAgJ2VtcHR5IDogJworICAgIHBhc3MKKworCitkZWYgcF9lcnJvcih0KToKKyAgICBwcmludCgiV2hvYS4gV2UncmUgaG9zZWQiKQorCitpbXBvcnQgcHJvZmlsZQorIyBCdWlsZCB0aGUgZ3JhbW1hcgorCit5YWNjLnlhY2MoKQorI3lhY2MueWFjYyhtZXRob2Q9J0xBTFInLHdyaXRlX3RhYmxlcz1GYWxzZSxkZWJ1Zz1GYWxzZSkKKworI3Byb2ZpbGUucnVuKCJ5YWNjLnlhY2MobWV0aG9kPSdMQUxSJykiKQpkaWZmIC0tZ2l0IGEvcGx5L2V4YW1wbGUvY2FsYy9jYWxjLnB5IGIvcGx5L2V4YW1wbGUvY2FsYy9jYWxjLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNGMzZDcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvZXhhbXBsZS9jYWxjL2NhbGMucHkKQEAgLTAsMCArMSwxMjMgQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY2FsYy5weQorIworIyBBIHNpbXBsZSBjYWxjdWxhdG9yIHdpdGggdmFyaWFibGVzLiAgIFRoaXMgaXMgZnJvbSBPJ1JlaWxseSdzCisjICJMZXggYW5kIFlhY2MiLCBwLiA2My4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW1wb3J0IHN5cworc3lzLnBhdGguaW5zZXJ0KDAsICIuLi8uLiIpCisKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPj0gMzoKKyAgICByYXdfaW5wdXQgPSBpbnB1dAorCit0b2tlbnMgPSAoCisgICAgJ05BTUUnLCAnTlVNQkVSJywKKykKKworbGl0ZXJhbHMgPSBbJz0nLCAnKycsICctJywgJyonLCAnLycsICcoJywgJyknXQorCisjIFRva2VucworCit0X05BTUUgPSByJ1thLXpBLVpfXVthLXpBLVowLTlfXSonCisKKworZGVmIHRfTlVNQkVSKHQpOgorICAgIHInXGQrJworICAgIHQudmFsdWUgPSBpbnQodC52YWx1ZSkKKyAgICByZXR1cm4gdAorCit0X2lnbm9yZSA9ICIgXHQiCisKKworZGVmIHRfbmV3bGluZSh0KToKKyAgICByJ1xuKycKKyAgICB0LmxleGVyLmxpbmVubyArPSB0LnZhbHVlLmNvdW50KCJcbiIpCisKKworZGVmIHRfZXJyb3IodCk6CisgICAgcHJpbnQoIklsbGVnYWwgY2hhcmFjdGVyICclcyciICUgdC52YWx1ZVswXSkKKyAgICB0LmxleGVyLnNraXAoMSkKKworIyBCdWlsZCB0aGUgbGV4ZXIKK2ltcG9ydCBwbHkubGV4IGFzIGxleAorbGV4LmxleCgpCisKKyMgUGFyc2luZyBydWxlcworCitwcmVjZWRlbmNlID0gKAorICAgICgnbGVmdCcsICcrJywgJy0nKSwKKyAgICAoJ2xlZnQnLCAnKicsICcvJyksCisgICAgKCdyaWdodCcsICdVTUlOVVMnKSwKKykKKworIyBkaWN0aW9uYXJ5IG9mIG5hbWVzCituYW1lcyA9IHt9CisKKworZGVmIHBfc3RhdGVtZW50X2Fzc2lnbihwKToKKyAgICAnc3RhdGVtZW50IDogTkFNRSAiPSIgZXhwcmVzc2lvbicKKyAgICBuYW1lc1twWzFdXSA9IHBbM10KKworCitkZWYgcF9zdGF0ZW1lbnRfZXhwcihwKToKKyAgICAnc3RhdGVtZW50IDogZXhwcmVzc2lvbicKKyAgICBwcmludChwWzFdKQorCisKK2RlZiBwX2V4cHJlc3Npb25fYmlub3AocCk6CisgICAgJycnZXhwcmVzc2lvbiA6IGV4cHJlc3Npb24gJysnIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiAnLScgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uICcqJyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gJy8nIGV4cHJlc3Npb24nJycKKyAgICBpZiBwWzJdID09ICcrJzoKKyAgICAgICAgcFswXSA9IHBbMV0gKyBwWzNdCisgICAgZWxpZiBwWzJdID09ICctJzoKKyAgICAgICAgcFswXSA9IHBbMV0gLSBwWzNdCisgICAgZWxpZiBwWzJdID09ICcqJzoKKyAgICAgICAgcFswXSA9IHBbMV0gKiBwWzNdCisgICAgZWxpZiBwWzJdID09ICcvJzoKKyAgICAgICAgcFswXSA9IHBbMV0gLyBwWzNdCisKKworZGVmIHBfZXhwcmVzc2lvbl91bWludXMocCk6CisgICAgImV4cHJlc3Npb24gOiAnLScgZXhwcmVzc2lvbiAlcHJlYyBVTUlOVVMiCisgICAgcFswXSA9IC1wWzJdCisKKworZGVmIHBfZXhwcmVzc2lvbl9ncm91cChwKToKKyAgICAiZXhwcmVzc2lvbiA6ICcoJyBleHByZXNzaW9uICcpJyIKKyAgICBwWzBdID0gcFsyXQorCisKK2RlZiBwX2V4cHJlc3Npb25fbnVtYmVyKHApOgorICAgICJleHByZXNzaW9uIDogTlVNQkVSIgorICAgIHBbMF0gPSBwWzFdCisKKworZGVmIHBfZXhwcmVzc2lvbl9uYW1lKHApOgorICAgICJleHByZXNzaW9uIDogTkFNRSIKKyAgICB0cnk6CisgICAgICAgIHBbMF0gPSBuYW1lc1twWzFdXQorICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICAgICAgcHJpbnQoIlVuZGVmaW5lZCBuYW1lICclcyciICUgcFsxXSkKKyAgICAgICAgcFswXSA9IDAKKworCitkZWYgcF9lcnJvcihwKToKKyAgICBpZiBwOgorICAgICAgICBwcmludCgiU3ludGF4IGVycm9yIGF0ICclcyciICUgcC52YWx1ZSkKKyAgICBlbHNlOgorICAgICAgICBwcmludCgiU3ludGF4IGVycm9yIGF0IEVPRiIpCisKK2ltcG9ydCBwbHkueWFjYyBhcyB5YWNjCit5YWNjLnlhY2MoKQorCit3aGlsZSAxOgorICAgIHRyeToKKyAgICAgICAgcyA9IHJhd19pbnB1dCgnY2FsYyA+ICcpCisgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICBicmVhaworICAgIGlmIG5vdCBzOgorICAgICAgICBjb250aW51ZQorICAgIHlhY2MucGFyc2UocykKZGlmZiAtLWdpdCBhL3BseS9leGFtcGxlL2NhbGNkZWJ1Zy9jYWxjLnB5IGIvcGx5L2V4YW1wbGUvY2FsY2RlYnVnL2NhbGMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY4MzFlMgotLS0gL2Rldi9udWxsCisrKyBiL3BseS9leGFtcGxlL2NhbGNkZWJ1Zy9jYWxjLnB5CkBAIC0wLDAgKzEsMTI5IEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNhbGMucHkKKyMKKyMgVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byBydW4gdGhlIHBhcnNlciBpbiBhIGRlYnVnZ2luZyBtb2RlCisjIHdpdGggb3V0cHV0IHJvdXRlZCB0byBhIGxvZ2dpbmcgb2JqZWN0LgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbXBvcnQgc3lzCitzeXMucGF0aC5pbnNlcnQoMCwgIi4uLy4uIikKKworaWYgc3lzLnZlcnNpb25faW5mb1swXSA+PSAzOgorICAgIHJhd19pbnB1dCA9IGlucHV0CisKK3Rva2VucyA9ICgKKyAgICAnTkFNRScsICdOVU1CRVInLAorKQorCitsaXRlcmFscyA9IFsnPScsICcrJywgJy0nLCAnKicsICcvJywgJygnLCAnKSddCisKKyMgVG9rZW5zCisKK3RfTkFNRSA9IHInW2EtekEtWl9dW2EtekEtWjAtOV9dKicKKworCitkZWYgdF9OVU1CRVIodCk6CisgICAgcidcZCsnCisgICAgdC52YWx1ZSA9IGludCh0LnZhbHVlKQorICAgIHJldHVybiB0CisKK3RfaWdub3JlID0gIiBcdCIKKworCitkZWYgdF9uZXdsaW5lKHQpOgorICAgIHInXG4rJworICAgIHQubGV4ZXIubGluZW5vICs9IHQudmFsdWUuY291bnQoIlxuIikKKworCitkZWYgdF9lcnJvcih0KToKKyAgICBwcmludCgiSWxsZWdhbCBjaGFyYWN0ZXIgJyVzJyIgJSB0LnZhbHVlWzBdKQorICAgIHQubGV4ZXIuc2tpcCgxKQorCisjIEJ1aWxkIHRoZSBsZXhlcgoraW1wb3J0IHBseS5sZXggYXMgbGV4CitsZXgubGV4KCkKKworIyBQYXJzaW5nIHJ1bGVzCisKK3ByZWNlZGVuY2UgPSAoCisgICAgKCdsZWZ0JywgJysnLCAnLScpLAorICAgICgnbGVmdCcsICcqJywgJy8nKSwKKyAgICAoJ3JpZ2h0JywgJ1VNSU5VUycpLAorKQorCisjIGRpY3Rpb25hcnkgb2YgbmFtZXMKK25hbWVzID0ge30KKworCitkZWYgcF9zdGF0ZW1lbnRfYXNzaWduKHApOgorICAgICdzdGF0ZW1lbnQgOiBOQU1FICI9IiBleHByZXNzaW9uJworICAgIG5hbWVzW3BbMV1dID0gcFszXQorCisKK2RlZiBwX3N0YXRlbWVudF9leHByKHApOgorICAgICdzdGF0ZW1lbnQgOiBleHByZXNzaW9uJworICAgIHByaW50KHBbMV0pCisKKworZGVmIHBfZXhwcmVzc2lvbl9iaW5vcChwKToKKyAgICAnJydleHByZXNzaW9uIDogZXhwcmVzc2lvbiAnKycgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uICctJyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gJyonIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiAnLycgZXhwcmVzc2lvbicnJworICAgIGlmIHBbMl0gPT0gJysnOgorICAgICAgICBwWzBdID0gcFsxXSArIHBbM10KKyAgICBlbGlmIHBbMl0gPT0gJy0nOgorICAgICAgICBwWzBdID0gcFsxXSAtIHBbM10KKyAgICBlbGlmIHBbMl0gPT0gJyonOgorICAgICAgICBwWzBdID0gcFsxXSAqIHBbM10KKyAgICBlbGlmIHBbMl0gPT0gJy8nOgorICAgICAgICBwWzBdID0gcFsxXSAvIHBbM10KKworCitkZWYgcF9leHByZXNzaW9uX3VtaW51cyhwKToKKyAgICAiZXhwcmVzc2lvbiA6ICctJyBleHByZXNzaW9uICVwcmVjIFVNSU5VUyIKKyAgICBwWzBdID0gLXBbMl0KKworCitkZWYgcF9leHByZXNzaW9uX2dyb3VwKHApOgorICAgICJleHByZXNzaW9uIDogJygnIGV4cHJlc3Npb24gJyknIgorICAgIHBbMF0gPSBwWzJdCisKKworZGVmIHBfZXhwcmVzc2lvbl9udW1iZXIocCk6CisgICAgImV4cHJlc3Npb24gOiBOVU1CRVIiCisgICAgcFswXSA9IHBbMV0KKworCitkZWYgcF9leHByZXNzaW9uX25hbWUocCk6CisgICAgImV4cHJlc3Npb24gOiBOQU1FIgorICAgIHRyeToKKyAgICAgICAgcFswXSA9IG5hbWVzW3BbMV1dCisgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICBwcmludCgiVW5kZWZpbmVkIG5hbWUgJyVzJyIgJSBwWzFdKQorICAgICAgICBwWzBdID0gMAorCisKK2RlZiBwX2Vycm9yKHApOgorICAgIGlmIHA6CisgICAgICAgIHByaW50KCJTeW50YXggZXJyb3IgYXQgJyVzJyIgJSBwLnZhbHVlKQorICAgIGVsc2U6CisgICAgICAgIHByaW50KCJTeW50YXggZXJyb3IgYXQgRU9GIikKKworaW1wb3J0IHBseS55YWNjIGFzIHlhY2MKK3lhY2MueWFjYygpCisKK2ltcG9ydCBsb2dnaW5nCitsb2dnaW5nLmJhc2ljQ29uZmlnKAorICAgIGxldmVsPWxvZ2dpbmcuSU5GTywKKyAgICBmaWxlbmFtZT0icGFyc2Vsb2cudHh0IgorKQorCit3aGlsZSAxOgorICAgIHRyeToKKyAgICAgICAgcyA9IHJhd19pbnB1dCgnY2FsYyA+ICcpCisgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICBicmVhaworICAgIGlmIG5vdCBzOgorICAgICAgICBjb250aW51ZQorICAgIHlhY2MucGFyc2UocywgZGVidWc9bG9nZ2luZy5nZXRMb2dnZXIoKSkKZGlmZiAtLWdpdCBhL3BseS9leGFtcGxlL2NhbGNlb2YvY2FsYy5weSBiL3BseS9leGFtcGxlL2NhbGNlb2YvY2FsYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmIzOWE0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx5L2V4YW1wbGUvY2FsY2VvZi9jYWxjLnB5CkBAIC0wLDAgKzEsMTMyIEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNhbGMucHkKKyMKKyMgQSBzaW1wbGUgY2FsY3VsYXRvciB3aXRoIHZhcmlhYmxlcy4gIEFza3MgdGhlIHVzZXIgZm9yIG1vcmUgaW5wdXQgYW5kCisjIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIHRoZSB0X2VvZigpIHJ1bGUuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ltcG9ydCBzeXMKK3N5cy5wYXRoLmluc2VydCgwLCAiLi4vLi4iKQorCitpZiBzeXMudmVyc2lvbl9pbmZvWzBdID49IDM6CisgICAgcmF3X2lucHV0ID0gaW5wdXQKKwordG9rZW5zID0gKAorICAgICdOQU1FJywgJ05VTUJFUicsCispCisKK2xpdGVyYWxzID0gWyc9JywgJysnLCAnLScsICcqJywgJy8nLCAnKCcsICcpJ10KKworIyBUb2tlbnMKKwordF9OQU1FID0gcidbYS16QS1aX11bYS16QS1aMC05X10qJworCisKK2RlZiB0X05VTUJFUih0KToKKyAgICByJ1xkKycKKyAgICB0LnZhbHVlID0gaW50KHQudmFsdWUpCisgICAgcmV0dXJuIHQKKwordF9pZ25vcmUgPSAiIFx0IgorCisKK2RlZiB0X25ld2xpbmUodCk6CisgICAgcidcbisnCisgICAgdC5sZXhlci5saW5lbm8gKz0gdC52YWx1ZS5jb3VudCgiXG4iKQorCisKK2RlZiB0X2VvZih0KToKKyAgICBtb3JlID0gcmF3X2lucHV0KCcuLi4gJykKKyAgICBpZiBtb3JlOgorICAgICAgICB0LmxleGVyLmlucHV0KG1vcmUgKyAnXG4nKQorICAgICAgICByZXR1cm4gdC5sZXhlci50b2tlbigpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworCitkZWYgdF9lcnJvcih0KToKKyAgICBwcmludCgiSWxsZWdhbCBjaGFyYWN0ZXIgJyVzJyIgJSB0LnZhbHVlWzBdKQorICAgIHQubGV4ZXIuc2tpcCgxKQorCisjIEJ1aWxkIHRoZSBsZXhlcgoraW1wb3J0IHBseS5sZXggYXMgbGV4CitsZXgubGV4KCkKKworIyBQYXJzaW5nIHJ1bGVzCisKK3ByZWNlZGVuY2UgPSAoCisgICAgKCdsZWZ0JywgJysnLCAnLScpLAorICAgICgnbGVmdCcsICcqJywgJy8nKSwKKyAgICAoJ3JpZ2h0JywgJ1VNSU5VUycpLAorKQorCisjIGRpY3Rpb25hcnkgb2YgbmFtZXMKK25hbWVzID0ge30KKworCitkZWYgcF9zdGF0ZW1lbnRfYXNzaWduKHApOgorICAgICdzdGF0ZW1lbnQgOiBOQU1FICI9IiBleHByZXNzaW9uJworICAgIG5hbWVzW3BbMV1dID0gcFszXQorCisKK2RlZiBwX3N0YXRlbWVudF9leHByKHApOgorICAgICdzdGF0ZW1lbnQgOiBleHByZXNzaW9uJworICAgIHByaW50KHBbMV0pCisKKworZGVmIHBfZXhwcmVzc2lvbl9iaW5vcChwKToKKyAgICAnJydleHByZXNzaW9uIDogZXhwcmVzc2lvbiAnKycgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uICctJyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gJyonIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiAnLycgZXhwcmVzc2lvbicnJworICAgIGlmIHBbMl0gPT0gJysnOgorICAgICAgICBwWzBdID0gcFsxXSArIHBbM10KKyAgICBlbGlmIHBbMl0gPT0gJy0nOgorICAgICAgICBwWzBdID0gcFsxXSAtIHBbM10KKyAgICBlbGlmIHBbMl0gPT0gJyonOgorICAgICAgICBwWzBdID0gcFsxXSAqIHBbM10KKyAgICBlbGlmIHBbMl0gPT0gJy8nOgorICAgICAgICBwWzBdID0gcFsxXSAvIHBbM10KKworCitkZWYgcF9leHByZXNzaW9uX3VtaW51cyhwKToKKyAgICAiZXhwcmVzc2lvbiA6ICctJyBleHByZXNzaW9uICVwcmVjIFVNSU5VUyIKKyAgICBwWzBdID0gLXBbMl0KKworCitkZWYgcF9leHByZXNzaW9uX2dyb3VwKHApOgorICAgICJleHByZXNzaW9uIDogJygnIGV4cHJlc3Npb24gJyknIgorICAgIHBbMF0gPSBwWzJdCisKKworZGVmIHBfZXhwcmVzc2lvbl9udW1iZXIocCk6CisgICAgImV4cHJlc3Npb24gOiBOVU1CRVIiCisgICAgcFswXSA9IHBbMV0KKworCitkZWYgcF9leHByZXNzaW9uX25hbWUocCk6CisgICAgImV4cHJlc3Npb24gOiBOQU1FIgorICAgIHRyeToKKyAgICAgICAgcFswXSA9IG5hbWVzW3BbMV1dCisgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICBwcmludCgiVW5kZWZpbmVkIG5hbWUgJyVzJyIgJSBwWzFdKQorICAgICAgICBwWzBdID0gMAorCisKK2RlZiBwX2Vycm9yKHApOgorICAgIGlmIHA6CisgICAgICAgIHByaW50KCJTeW50YXggZXJyb3IgYXQgJyVzJyIgJSBwLnZhbHVlKQorICAgIGVsc2U6CisgICAgICAgIHByaW50KCJTeW50YXggZXJyb3IgYXQgRU9GIikKKworaW1wb3J0IHBseS55YWNjIGFzIHlhY2MKK3lhY2MueWFjYygpCisKK3doaWxlIDE6CisgICAgdHJ5OgorICAgICAgICBzID0gcmF3X2lucHV0KCdjYWxjID4gJykKKyAgICBleGNlcHQgRU9GRXJyb3I6CisgICAgICAgIGJyZWFrCisgICAgaWYgbm90IHM6CisgICAgICAgIGNvbnRpbnVlCisgICAgeWFjYy5wYXJzZShzICsgJ1xuJykKZGlmZiAtLWdpdCBhL3BseS9leGFtcGxlL2NsYXNzY2FsYy9jYWxjLnB5IGIvcGx5L2V4YW1wbGUvY2xhc3NjYWxjL2NhbGMucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWRhNGFmZAotLS0gL2Rldi9udWxsCisrKyBiL3BseS9leGFtcGxlL2NsYXNzY2FsYy9jYWxjLnB5CkBAIC0wLDAgKzEsMTY1IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjYWxjLnB5CisjCisjIEEgc2ltcGxlIGNhbGN1bGF0b3Igd2l0aCB2YXJpYWJsZXMuICAgVGhpcyBpcyBmcm9tIE8nUmVpbGx5J3MKKyMgIkxleCBhbmQgWWFjYyIsIHAuIDYzLgorIworIyBDbGFzcy1iYXNlZCBleGFtcGxlIGNvbnRyaWJ1dGVkIHRvIFBMWSBieSBEYXZpZCBNY05hYgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbXBvcnQgc3lzCitzeXMucGF0aC5pbnNlcnQoMCwgIi4uLy4uIikKKworaWYgc3lzLnZlcnNpb25faW5mb1swXSA+PSAzOgorICAgIHJhd19pbnB1dCA9IGlucHV0CisKK2ltcG9ydCBwbHkubGV4IGFzIGxleAoraW1wb3J0IHBseS55YWNjIGFzIHlhY2MKK2ltcG9ydCBvcworCisKK2NsYXNzIFBhcnNlcjoKKyAgICAiIiIKKyAgICBCYXNlIGNsYXNzIGZvciBhIGxleGVyL3BhcnNlciB0aGF0IGhhcyB0aGUgcnVsZXMgZGVmaW5lZCBhcyBtZXRob2RzCisgICAgIiIiCisgICAgdG9rZW5zID0gKCkKKyAgICBwcmVjZWRlbmNlID0gKCkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqKmt3KToKKyAgICAgICAgc2VsZi5kZWJ1ZyA9IGt3LmdldCgnZGVidWcnLCAwKQorICAgICAgICBzZWxmLm5hbWVzID0ge30KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbW9kbmFtZSA9IG9zLnBhdGguc3BsaXQob3MucGF0aC5zcGxpdGV4dChfX2ZpbGVfXylbMF0pWworICAgICAgICAgICAgICAgIDFdICsgIl8iICsgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgbW9kbmFtZSA9ICJwYXJzZXIiICsgIl8iICsgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKyAgICAgICAgc2VsZi5kZWJ1Z2ZpbGUgPSBtb2RuYW1lICsgIi5kYmciCisgICAgICAgIHNlbGYudGFibW9kdWxlID0gbW9kbmFtZSArICJfIiArICJwYXJzZXRhYiIKKyAgICAgICAgIyBwcmludCBzZWxmLmRlYnVnZmlsZSwgc2VsZi50YWJtb2R1bGUKKworICAgICAgICAjIEJ1aWxkIHRoZSBsZXhlciBhbmQgcGFyc2VyCisgICAgICAgIGxleC5sZXgobW9kdWxlPXNlbGYsIGRlYnVnPXNlbGYuZGVidWcpCisgICAgICAgIHlhY2MueWFjYyhtb2R1bGU9c2VsZiwKKyAgICAgICAgICAgICAgICAgIGRlYnVnPXNlbGYuZGVidWcsCisgICAgICAgICAgICAgICAgICBkZWJ1Z2ZpbGU9c2VsZi5kZWJ1Z2ZpbGUsCisgICAgICAgICAgICAgICAgICB0YWJtb2R1bGU9c2VsZi50YWJtb2R1bGUpCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHMgPSByYXdfaW5wdXQoJ2NhbGMgPiAnKQorICAgICAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBub3QgczoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgeWFjYy5wYXJzZShzKQorCisKK2NsYXNzIENhbGMoUGFyc2VyKToKKworICAgIHRva2VucyA9ICgKKyAgICAgICAgJ05BTUUnLCAnTlVNQkVSJywKKyAgICAgICAgJ1BMVVMnLCAnTUlOVVMnLCAnRVhQJywgJ1RJTUVTJywgJ0RJVklERScsICdFUVVBTFMnLAorICAgICAgICAnTFBBUkVOJywgJ1JQQVJFTicsCisgICAgKQorCisgICAgIyBUb2tlbnMKKworICAgIHRfUExVUyA9IHInXCsnCisgICAgdF9NSU5VUyA9IHInLScKKyAgICB0X0VYUCA9IHInXCpcKicKKyAgICB0X1RJTUVTID0gcidcKicKKyAgICB0X0RJVklERSA9IHInLycKKyAgICB0X0VRVUFMUyA9IHInPScKKyAgICB0X0xQQVJFTiA9IHInXCgnCisgICAgdF9SUEFSRU4gPSByJ1wpJworICAgIHRfTkFNRSA9IHInW2EtekEtWl9dW2EtekEtWjAtOV9dKicKKworICAgIGRlZiB0X05VTUJFUihzZWxmLCB0KToKKyAgICAgICAgcidcZCsnCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHQudmFsdWUgPSBpbnQodC52YWx1ZSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwcmludCgiSW50ZWdlciB2YWx1ZSB0b28gbGFyZ2UgJXMiICUgdC52YWx1ZSkKKyAgICAgICAgICAgIHQudmFsdWUgPSAwCisgICAgICAgICMgcHJpbnQgInBhcnNlZCBudW1iZXIgJXMiICUgcmVwcih0LnZhbHVlKQorICAgICAgICByZXR1cm4gdAorCisgICAgdF9pZ25vcmUgPSAiIFx0IgorCisgICAgZGVmIHRfbmV3bGluZShzZWxmLCB0KToKKyAgICAgICAgcidcbisnCisgICAgICAgIHQubGV4ZXIubGluZW5vICs9IHQudmFsdWUuY291bnQoIlxuIikKKworICAgIGRlZiB0X2Vycm9yKHNlbGYsIHQpOgorICAgICAgICBwcmludCgiSWxsZWdhbCBjaGFyYWN0ZXIgJyVzJyIgJSB0LnZhbHVlWzBdKQorICAgICAgICB0LmxleGVyLnNraXAoMSkKKworICAgICMgUGFyc2luZyBydWxlcworCisgICAgcHJlY2VkZW5jZSA9ICgKKyAgICAgICAgKCdsZWZ0JywgJ1BMVVMnLCAnTUlOVVMnKSwKKyAgICAgICAgKCdsZWZ0JywgJ1RJTUVTJywgJ0RJVklERScpLAorICAgICAgICAoJ2xlZnQnLCAnRVhQJyksCisgICAgICAgICgncmlnaHQnLCAnVU1JTlVTJyksCisgICAgKQorCisgICAgZGVmIHBfc3RhdGVtZW50X2Fzc2lnbihzZWxmLCBwKToKKyAgICAgICAgJ3N0YXRlbWVudCA6IE5BTUUgRVFVQUxTIGV4cHJlc3Npb24nCisgICAgICAgIHNlbGYubmFtZXNbcFsxXV0gPSBwWzNdCisKKyAgICBkZWYgcF9zdGF0ZW1lbnRfZXhwcihzZWxmLCBwKToKKyAgICAgICAgJ3N0YXRlbWVudCA6IGV4cHJlc3Npb24nCisgICAgICAgIHByaW50KHBbMV0pCisKKyAgICBkZWYgcF9leHByZXNzaW9uX2Jpbm9wKHNlbGYsIHApOgorICAgICAgICAiIiIKKyAgICAgICAgZXhwcmVzc2lvbiA6IGV4cHJlc3Npb24gUExVUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gTUlOVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIFRJTUVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBESVZJREUgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIEVYUCBleHByZXNzaW9uCisgICAgICAgICIiIgorICAgICAgICAjIHByaW50IFtyZXByKHBbaV0pIGZvciBpIGluIHJhbmdlKDAsNCldCisgICAgICAgIGlmIHBbMl0gPT0gJysnOgorICAgICAgICAgICAgcFswXSA9IHBbMV0gKyBwWzNdCisgICAgICAgIGVsaWYgcFsyXSA9PSAnLSc6CisgICAgICAgICAgICBwWzBdID0gcFsxXSAtIHBbM10KKyAgICAgICAgZWxpZiBwWzJdID09ICcqJzoKKyAgICAgICAgICAgIHBbMF0gPSBwWzFdICogcFszXQorICAgICAgICBlbGlmIHBbMl0gPT0gJy8nOgorICAgICAgICAgICAgcFswXSA9IHBbMV0gLyBwWzNdCisgICAgICAgIGVsaWYgcFsyXSA9PSAnKionOgorICAgICAgICAgICAgcFswXSA9IHBbMV0gKiogcFszXQorCisgICAgZGVmIHBfZXhwcmVzc2lvbl91bWludXMoc2VsZiwgcCk6CisgICAgICAgICdleHByZXNzaW9uIDogTUlOVVMgZXhwcmVzc2lvbiAlcHJlYyBVTUlOVVMnCisgICAgICAgIHBbMF0gPSAtcFsyXQorCisgICAgZGVmIHBfZXhwcmVzc2lvbl9ncm91cChzZWxmLCBwKToKKyAgICAgICAgJ2V4cHJlc3Npb24gOiBMUEFSRU4gZXhwcmVzc2lvbiBSUEFSRU4nCisgICAgICAgIHBbMF0gPSBwWzJdCisKKyAgICBkZWYgcF9leHByZXNzaW9uX251bWJlcihzZWxmLCBwKToKKyAgICAgICAgJ2V4cHJlc3Npb24gOiBOVU1CRVInCisgICAgICAgIHBbMF0gPSBwWzFdCisKKyAgICBkZWYgcF9leHByZXNzaW9uX25hbWUoc2VsZiwgcCk6CisgICAgICAgICdleHByZXNzaW9uIDogTkFNRScKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcFswXSA9IHNlbGYubmFtZXNbcFsxXV0KKyAgICAgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICAgICAgcHJpbnQoIlVuZGVmaW5lZCBuYW1lICclcyciICUgcFsxXSkKKyAgICAgICAgICAgIHBbMF0gPSAwCisKKyAgICBkZWYgcF9lcnJvcihzZWxmLCBwKToKKyAgICAgICAgaWYgcDoKKyAgICAgICAgICAgIHByaW50KCJTeW50YXggZXJyb3IgYXQgJyVzJyIgJSBwLnZhbHVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQoIlN5bnRheCBlcnJvciBhdCBFT0YiKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGNhbGMgPSBDYWxjKCkKKyAgICBjYWxjLnJ1bigpCmRpZmYgLS1naXQgYS9wbHkvZXhhbXBsZS9jbGVhbnVwLnNoIGIvcGx5L2V4YW1wbGUvY2xlYW51cC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZTExNWY0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx5L2V4YW1wbGUvY2xlYW51cC5zaApAQCAtMCwwICsxLDIgQEAKKyMhL2Jpbi9zaAorcm0gLWYgKi8qLnB5YyAqL3BhcnNldGFiLnB5ICovcGFyc2VyLm91dCAqLyp+ICovKi5jbGFzcwpkaWZmIC0tZ2l0IGEvcGx5L2V4YW1wbGUvY2xvc3VyZWNhbGMvY2FsYy5weSBiL3BseS9leGFtcGxlL2Nsb3N1cmVjYWxjL2NhbGMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAzMWIwNQotLS0gL2Rldi9udWxsCisrKyBiL3BseS9leGFtcGxlL2Nsb3N1cmVjYWxjL2NhbGMucHkKQEAgLTAsMCArMSwxMzIgQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY2FsYy5weQorIworIyBBIGNhbGN1bGF0b3IgcGFyc2VyIHRoYXQgbWFrZXMgdXNlIG9mIGNsb3N1cmVzLiBUaGUgZnVuY3Rpb24gbWFrZV9jYWxjdWxhdG9yKCkKKyMgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhbiBpbnB1dCBzdHJpbmcgYW5kIHJldHVybnMgYSByZXN1bHQuICBBbGwKKyMgbGV4aW5nIHJ1bGVzLCBwYXJzaW5nIHJ1bGVzLCBhbmQgaW50ZXJuYWwgc3RhdGUgYXJlIGhlbGQgaW5zaWRlIHRoZSBmdW5jdGlvbi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW1wb3J0IHN5cworc3lzLnBhdGguaW5zZXJ0KDAsICIuLi8uLiIpCisKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPj0gMzoKKyAgICByYXdfaW5wdXQgPSBpbnB1dAorCisjIE1ha2UgYSBjYWxjdWxhdG9yIGZ1bmN0aW9uCisKKworZGVmIG1ha2VfY2FsY3VsYXRvcigpOgorICAgIGltcG9ydCBwbHkubGV4IGFzIGxleAorICAgIGltcG9ydCBwbHkueWFjYyBhcyB5YWNjCisKKyAgICAjIC0tLS0tLS0gSW50ZXJuYWwgY2FsY3VsYXRvciBzdGF0ZQorCisgICAgdmFyaWFibGVzID0ge30gICAgICAgIyBEaWN0aW9uYXJ5IG9mIHN0b3JlZCB2YXJpYWJsZXMKKworICAgICMgLS0tLS0tLSBDYWxjdWxhdG9yIHRva2VuaXppbmcgcnVsZXMKKworICAgIHRva2VucyA9ICgKKyAgICAgICAgJ05BTUUnLCAnTlVNQkVSJywKKyAgICApCisKKyAgICBsaXRlcmFscyA9IFsnPScsICcrJywgJy0nLCAnKicsICcvJywgJygnLCAnKSddCisKKyAgICB0X2lnbm9yZSA9ICIgXHQiCisKKyAgICB0X05BTUUgPSByJ1thLXpBLVpfXVthLXpBLVowLTlfXSonCisKKyAgICBkZWYgdF9OVU1CRVIodCk6CisgICAgICAgIHInXGQrJworICAgICAgICB0LnZhbHVlID0gaW50KHQudmFsdWUpCisgICAgICAgIHJldHVybiB0CisKKyAgICBkZWYgdF9uZXdsaW5lKHQpOgorICAgICAgICByJ1xuKycKKyAgICAgICAgdC5sZXhlci5saW5lbm8gKz0gdC52YWx1ZS5jb3VudCgiXG4iKQorCisgICAgZGVmIHRfZXJyb3IodCk6CisgICAgICAgIHByaW50KCJJbGxlZ2FsIGNoYXJhY3RlciAnJXMnIiAlIHQudmFsdWVbMF0pCisgICAgICAgIHQubGV4ZXIuc2tpcCgxKQorCisgICAgIyBCdWlsZCB0aGUgbGV4ZXIKKyAgICBsZXhlciA9IGxleC5sZXgoKQorCisgICAgIyAtLS0tLS0tIENhbGN1bGF0b3IgcGFyc2luZyBydWxlcworCisgICAgcHJlY2VkZW5jZSA9ICgKKyAgICAgICAgKCdsZWZ0JywgJysnLCAnLScpLAorICAgICAgICAoJ2xlZnQnLCAnKicsICcvJyksCisgICAgICAgICgncmlnaHQnLCAnVU1JTlVTJyksCisgICAgKQorCisgICAgZGVmIHBfc3RhdGVtZW50X2Fzc2lnbihwKToKKyAgICAgICAgJ3N0YXRlbWVudCA6IE5BTUUgIj0iIGV4cHJlc3Npb24nCisgICAgICAgIHZhcmlhYmxlc1twWzFdXSA9IHBbM10KKyAgICAgICAgcFswXSA9IE5vbmUKKworICAgIGRlZiBwX3N0YXRlbWVudF9leHByKHApOgorICAgICAgICAnc3RhdGVtZW50IDogZXhwcmVzc2lvbicKKyAgICAgICAgcFswXSA9IHBbMV0KKworICAgIGRlZiBwX2V4cHJlc3Npb25fYmlub3AocCk6CisgICAgICAgICcnJ2V4cHJlc3Npb24gOiBleHByZXNzaW9uICcrJyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uICctJyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uICcqJyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uICcvJyBleHByZXNzaW9uJycnCisgICAgICAgIGlmIHBbMl0gPT0gJysnOgorICAgICAgICAgICAgcFswXSA9IHBbMV0gKyBwWzNdCisgICAgICAgIGVsaWYgcFsyXSA9PSAnLSc6CisgICAgICAgICAgICBwWzBdID0gcFsxXSAtIHBbM10KKyAgICAgICAgZWxpZiBwWzJdID09ICcqJzoKKyAgICAgICAgICAgIHBbMF0gPSBwWzFdICogcFszXQorICAgICAgICBlbGlmIHBbMl0gPT0gJy8nOgorICAgICAgICAgICAgcFswXSA9IHBbMV0gLyBwWzNdCisKKyAgICBkZWYgcF9leHByZXNzaW9uX3VtaW51cyhwKToKKyAgICAgICAgImV4cHJlc3Npb24gOiAnLScgZXhwcmVzc2lvbiAlcHJlYyBVTUlOVVMiCisgICAgICAgIHBbMF0gPSAtcFsyXQorCisgICAgZGVmIHBfZXhwcmVzc2lvbl9ncm91cChwKToKKyAgICAgICAgImV4cHJlc3Npb24gOiAnKCcgZXhwcmVzc2lvbiAnKSciCisgICAgICAgIHBbMF0gPSBwWzJdCisKKyAgICBkZWYgcF9leHByZXNzaW9uX251bWJlcihwKToKKyAgICAgICAgImV4cHJlc3Npb24gOiBOVU1CRVIiCisgICAgICAgIHBbMF0gPSBwWzFdCisKKyAgICBkZWYgcF9leHByZXNzaW9uX25hbWUocCk6CisgICAgICAgICJleHByZXNzaW9uIDogTkFNRSIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcFswXSA9IHZhcmlhYmxlc1twWzFdXQorICAgICAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgICAgICBwcmludCgiVW5kZWZpbmVkIG5hbWUgJyVzJyIgJSBwWzFdKQorICAgICAgICAgICAgcFswXSA9IDAKKworICAgIGRlZiBwX2Vycm9yKHApOgorICAgICAgICBpZiBwOgorICAgICAgICAgICAgcHJpbnQoIlN5bnRheCBlcnJvciBhdCAnJXMnIiAlIHAudmFsdWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCgiU3ludGF4IGVycm9yIGF0IEVPRiIpCisKKyAgICAjIEJ1aWxkIHRoZSBwYXJzZXIKKyAgICBwYXJzZXIgPSB5YWNjLnlhY2MoKQorCisgICAgIyAtLS0tLS0tIElucHV0IGZ1bmN0aW9uCisKKyAgICBkZWYgaW5wdXQodGV4dCk6CisgICAgICAgIHJlc3VsdCA9IHBhcnNlci5wYXJzZSh0ZXh0LCBsZXhlcj1sZXhlcikKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgcmV0dXJuIGlucHV0CisKKyMgTWFrZSBhIGNhbGN1bGF0b3Igb2JqZWN0IGFuZCB1c2UgaXQKK2NhbGMgPSBtYWtlX2NhbGN1bGF0b3IoKQorCit3aGlsZSBUcnVlOgorICAgIHRyeToKKyAgICAgICAgcyA9IHJhd19pbnB1dCgiY2FsYyA+ICIpCisgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICBicmVhaworICAgIHIgPSBjYWxjKHMpCisgICAgaWYgcjoKKyAgICAgICAgcHJpbnQocikKZGlmZiAtLWdpdCBhL3BseS9leGFtcGxlL2hlZGl0L2hlZGl0LnB5IGIvcGx5L2V4YW1wbGUvaGVkaXQvaGVkaXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJkYTc0NQotLS0gL2Rldi9udWxsCisrKyBiL3BseS9leGFtcGxlL2hlZGl0L2hlZGl0LnB5CkBAIC0wLDAgKzEsNDggQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaGVkaXQucHkKKyMKKyMgUGFyaW5nIG9mIEZvcnRyYW4gSCBFZGl0IGRlc2NyaXB0aW9ucyAoQ29udHJpYnV0ZWQgYnkgUGVhcnUgUGV0ZXJzb24pCisjCisjIFRoZXNlIHRva2VucyBjYW4ndCBiZSBlYXNpbHkgdG9rZW5pemVkIGJlY2F1c2UgdGhleSBhcmUgb2YgdGhlIGZvbGxvd2luZworIyBmb3JtOgorIworIyAgIG5IYzEuLi5jbgorIworIyB3aGVyZSBuIGlzIGEgcG9zaXRpdmUgaW50ZWdlciBhbmQgYzEgLi4uIGNuIGFyZSBjaGFyYWN0ZXJzLgorIworIyBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIG1vZGlmeSB0aGUgc3RhdGUgb2YgdGhlIGxleGVyIHRvIHBhcnNlCisjIHN1Y2ggdG9rZW5zCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ltcG9ydCBzeXMKK3N5cy5wYXRoLmluc2VydCgwLCAiLi4vLi4iKQorCisKK3Rva2VucyA9ICgKKyAgICAnSF9FRElUX0RFU0NSSVBUT1InLAorKQorCisjIFRva2VucwordF9pZ25vcmUgPSAiIFx0XG4iCisKKworZGVmIHRfSF9FRElUX0RFU0NSSVBUT1IodCk6CisgICAgciJcZCtILioiICAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGdyYWJzIGFsbCBvZiB0aGUgcmVtYWluaW5nIHRleHQKKyAgICBpID0gdC52YWx1ZS5pbmRleCgnSCcpCisgICAgbiA9IGV2YWwodC52YWx1ZVs6aV0pCisKKyAgICAjIEFkanVzdCB0aGUgdG9rZW5pemluZyBwb3NpdGlvbgorICAgIHQubGV4ZXIubGV4cG9zIC09IGxlbih0LnZhbHVlKSAtIChpICsgMSArIG4pCisKKyAgICB0LnZhbHVlID0gdC52YWx1ZVtpICsgMTppICsgMSArIG5dCisgICAgcmV0dXJuIHQKKworCitkZWYgdF9lcnJvcih0KToKKyAgICBwcmludCgiSWxsZWdhbCBjaGFyYWN0ZXIgJyVzJyIgJSB0LnZhbHVlWzBdKQorICAgIHQubGV4ZXIuc2tpcCgxKQorCisjIEJ1aWxkIHRoZSBsZXhlcgoraW1wb3J0IHBseS5sZXggYXMgbGV4CitsZXgubGV4KCkKK2xleC5ydW5tYWluKCkKZGlmZiAtLWdpdCBhL3BseS9leGFtcGxlL25ld2NsYXNzY2FsYy9jYWxjLnB5IGIvcGx5L2V4YW1wbGUvbmV3Y2xhc3NjYWxjL2NhbGMucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDNjOTUwNgotLS0gL2Rldi9udWxsCisrKyBiL3BseS9leGFtcGxlL25ld2NsYXNzY2FsYy9jYWxjLnB5CkBAIC0wLDAgKzEsMTY3IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjYWxjLnB5CisjCisjIEEgc2ltcGxlIGNhbGN1bGF0b3Igd2l0aCB2YXJpYWJsZXMuICAgVGhpcyBpcyBmcm9tIE8nUmVpbGx5J3MKKyMgIkxleCBhbmQgWWFjYyIsIHAuIDYzLgorIworIyBDbGFzcy1iYXNlZCBleGFtcGxlIGNvbnRyaWJ1dGVkIHRvIFBMWSBieSBEYXZpZCBNY05hYi4KKyMKKyMgTW9kaWZpZWQgdG8gdXNlIG5ldy1zdHlsZSBjbGFzc2VzLiAgIFRlc3QgY2FzZS4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW1wb3J0IHN5cworc3lzLnBhdGguaW5zZXJ0KDAsICIuLi8uLiIpCisKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPj0gMzoKKyAgICByYXdfaW5wdXQgPSBpbnB1dAorCitpbXBvcnQgcGx5LmxleCBhcyBsZXgKK2ltcG9ydCBwbHkueWFjYyBhcyB5YWNjCitpbXBvcnQgb3MKKworCitjbGFzcyBQYXJzZXIob2JqZWN0KToKKyAgICAiIiIKKyAgICBCYXNlIGNsYXNzIGZvciBhIGxleGVyL3BhcnNlciB0aGF0IGhhcyB0aGUgcnVsZXMgZGVmaW5lZCBhcyBtZXRob2RzCisgICAgIiIiCisgICAgdG9rZW5zID0gKCkKKyAgICBwcmVjZWRlbmNlID0gKCkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqKmt3KToKKyAgICAgICAgc2VsZi5kZWJ1ZyA9IGt3LmdldCgnZGVidWcnLCAwKQorICAgICAgICBzZWxmLm5hbWVzID0ge30KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbW9kbmFtZSA9IG9zLnBhdGguc3BsaXQob3MucGF0aC5zcGxpdGV4dChfX2ZpbGVfXylbMF0pWworICAgICAgICAgICAgICAgIDFdICsgIl8iICsgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgbW9kbmFtZSA9ICJwYXJzZXIiICsgIl8iICsgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKyAgICAgICAgc2VsZi5kZWJ1Z2ZpbGUgPSBtb2RuYW1lICsgIi5kYmciCisgICAgICAgIHNlbGYudGFibW9kdWxlID0gbW9kbmFtZSArICJfIiArICJwYXJzZXRhYiIKKyAgICAgICAgIyBwcmludCBzZWxmLmRlYnVnZmlsZSwgc2VsZi50YWJtb2R1bGUKKworICAgICAgICAjIEJ1aWxkIHRoZSBsZXhlciBhbmQgcGFyc2VyCisgICAgICAgIGxleC5sZXgobW9kdWxlPXNlbGYsIGRlYnVnPXNlbGYuZGVidWcpCisgICAgICAgIHlhY2MueWFjYyhtb2R1bGU9c2VsZiwKKyAgICAgICAgICAgICAgICAgIGRlYnVnPXNlbGYuZGVidWcsCisgICAgICAgICAgICAgICAgICBkZWJ1Z2ZpbGU9c2VsZi5kZWJ1Z2ZpbGUsCisgICAgICAgICAgICAgICAgICB0YWJtb2R1bGU9c2VsZi50YWJtb2R1bGUpCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHMgPSByYXdfaW5wdXQoJ2NhbGMgPiAnKQorICAgICAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBub3QgczoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgeWFjYy5wYXJzZShzKQorCisKK2NsYXNzIENhbGMoUGFyc2VyKToKKworICAgIHRva2VucyA9ICgKKyAgICAgICAgJ05BTUUnLCAnTlVNQkVSJywKKyAgICAgICAgJ1BMVVMnLCAnTUlOVVMnLCAnRVhQJywgJ1RJTUVTJywgJ0RJVklERScsICdFUVVBTFMnLAorICAgICAgICAnTFBBUkVOJywgJ1JQQVJFTicsCisgICAgKQorCisgICAgIyBUb2tlbnMKKworICAgIHRfUExVUyA9IHInXCsnCisgICAgdF9NSU5VUyA9IHInLScKKyAgICB0X0VYUCA9IHInXCpcKicKKyAgICB0X1RJTUVTID0gcidcKicKKyAgICB0X0RJVklERSA9IHInLycKKyAgICB0X0VRVUFMUyA9IHInPScKKyAgICB0X0xQQVJFTiA9IHInXCgnCisgICAgdF9SUEFSRU4gPSByJ1wpJworICAgIHRfTkFNRSA9IHInW2EtekEtWl9dW2EtekEtWjAtOV9dKicKKworICAgIGRlZiB0X05VTUJFUihzZWxmLCB0KToKKyAgICAgICAgcidcZCsnCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHQudmFsdWUgPSBpbnQodC52YWx1ZSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwcmludCgiSW50ZWdlciB2YWx1ZSB0b28gbGFyZ2UgJXMiICUgdC52YWx1ZSkKKyAgICAgICAgICAgIHQudmFsdWUgPSAwCisgICAgICAgICMgcHJpbnQgInBhcnNlZCBudW1iZXIgJXMiICUgcmVwcih0LnZhbHVlKQorICAgICAgICByZXR1cm4gdAorCisgICAgdF9pZ25vcmUgPSAiIFx0IgorCisgICAgZGVmIHRfbmV3bGluZShzZWxmLCB0KToKKyAgICAgICAgcidcbisnCisgICAgICAgIHQubGV4ZXIubGluZW5vICs9IHQudmFsdWUuY291bnQoIlxuIikKKworICAgIGRlZiB0X2Vycm9yKHNlbGYsIHQpOgorICAgICAgICBwcmludCgiSWxsZWdhbCBjaGFyYWN0ZXIgJyVzJyIgJSB0LnZhbHVlWzBdKQorICAgICAgICB0LmxleGVyLnNraXAoMSkKKworICAgICMgUGFyc2luZyBydWxlcworCisgICAgcHJlY2VkZW5jZSA9ICgKKyAgICAgICAgKCdsZWZ0JywgJ1BMVVMnLCAnTUlOVVMnKSwKKyAgICAgICAgKCdsZWZ0JywgJ1RJTUVTJywgJ0RJVklERScpLAorICAgICAgICAoJ2xlZnQnLCAnRVhQJyksCisgICAgICAgICgncmlnaHQnLCAnVU1JTlVTJyksCisgICAgKQorCisgICAgZGVmIHBfc3RhdGVtZW50X2Fzc2lnbihzZWxmLCBwKToKKyAgICAgICAgJ3N0YXRlbWVudCA6IE5BTUUgRVFVQUxTIGV4cHJlc3Npb24nCisgICAgICAgIHNlbGYubmFtZXNbcFsxXV0gPSBwWzNdCisKKyAgICBkZWYgcF9zdGF0ZW1lbnRfZXhwcihzZWxmLCBwKToKKyAgICAgICAgJ3N0YXRlbWVudCA6IGV4cHJlc3Npb24nCisgICAgICAgIHByaW50KHBbMV0pCisKKyAgICBkZWYgcF9leHByZXNzaW9uX2Jpbm9wKHNlbGYsIHApOgorICAgICAgICAiIiIKKyAgICAgICAgZXhwcmVzc2lvbiA6IGV4cHJlc3Npb24gUExVUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gTUlOVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIFRJTUVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBESVZJREUgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIEVYUCBleHByZXNzaW9uCisgICAgICAgICIiIgorICAgICAgICAjIHByaW50IFtyZXByKHBbaV0pIGZvciBpIGluIHJhbmdlKDAsNCldCisgICAgICAgIGlmIHBbMl0gPT0gJysnOgorICAgICAgICAgICAgcFswXSA9IHBbMV0gKyBwWzNdCisgICAgICAgIGVsaWYgcFsyXSA9PSAnLSc6CisgICAgICAgICAgICBwWzBdID0gcFsxXSAtIHBbM10KKyAgICAgICAgZWxpZiBwWzJdID09ICcqJzoKKyAgICAgICAgICAgIHBbMF0gPSBwWzFdICogcFszXQorICAgICAgICBlbGlmIHBbMl0gPT0gJy8nOgorICAgICAgICAgICAgcFswXSA9IHBbMV0gLyBwWzNdCisgICAgICAgIGVsaWYgcFsyXSA9PSAnKionOgorICAgICAgICAgICAgcFswXSA9IHBbMV0gKiogcFszXQorCisgICAgZGVmIHBfZXhwcmVzc2lvbl91bWludXMoc2VsZiwgcCk6CisgICAgICAgICdleHByZXNzaW9uIDogTUlOVVMgZXhwcmVzc2lvbiAlcHJlYyBVTUlOVVMnCisgICAgICAgIHBbMF0gPSAtcFsyXQorCisgICAgZGVmIHBfZXhwcmVzc2lvbl9ncm91cChzZWxmLCBwKToKKyAgICAgICAgJ2V4cHJlc3Npb24gOiBMUEFSRU4gZXhwcmVzc2lvbiBSUEFSRU4nCisgICAgICAgIHBbMF0gPSBwWzJdCisKKyAgICBkZWYgcF9leHByZXNzaW9uX251bWJlcihzZWxmLCBwKToKKyAgICAgICAgJ2V4cHJlc3Npb24gOiBOVU1CRVInCisgICAgICAgIHBbMF0gPSBwWzFdCisKKyAgICBkZWYgcF9leHByZXNzaW9uX25hbWUoc2VsZiwgcCk6CisgICAgICAgICdleHByZXNzaW9uIDogTkFNRScKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcFswXSA9IHNlbGYubmFtZXNbcFsxXV0KKyAgICAgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICAgICAgcHJpbnQoIlVuZGVmaW5lZCBuYW1lICclcyciICUgcFsxXSkKKyAgICAgICAgICAgIHBbMF0gPSAwCisKKyAgICBkZWYgcF9lcnJvcihzZWxmLCBwKToKKyAgICAgICAgaWYgcDoKKyAgICAgICAgICAgIHByaW50KCJTeW50YXggZXJyb3IgYXQgJyVzJyIgJSBwLnZhbHVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQoIlN5bnRheCBlcnJvciBhdCBFT0YiKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGNhbGMgPSBDYWxjKCkKKyAgICBjYWxjLnJ1bigpCmRpZmYgLS1naXQgYS9wbHkvZXhhbXBsZS9vcHRjYWxjL1JFQURNRSBiL3BseS9leGFtcGxlL29wdGNhbGMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZGQ1ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvZXhhbXBsZS9vcHRjYWxjL1JFQURNRQpAQCAtMCwwICsxLDkgQEAKK0FuIGV4YW1wbGUgc2hvd2luZyBob3cgdG8gdXNlIFB5dGhvbiBvcHRpbWl6ZWQgbW9kZS4KK1RvIHJ1bjoKKworICAtIEZpcnN0IHJ1biAncHl0aG9uIGNhbGMucHknCisKKyAgLSBUaGVuIHJ1biAncHl0aG9uIC1PTyBjYWxjLnB5JworCitJZiB3b3JraW5nIGNvcnJlY3RseSwgdGhlIHNlY29uZCB2ZXJzaW9uIHNob3VsZCBydW4gdGhlCitzYW1lIHdheS4KZGlmZiAtLWdpdCBhL3BseS9leGFtcGxlL29wdGNhbGMvY2FsYy5weSBiL3BseS9leGFtcGxlL29wdGNhbGMvY2FsYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzIyM2U1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx5L2V4YW1wbGUvb3B0Y2FsYy9jYWxjLnB5CkBAIC0wLDAgKzEsMTM0IEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNhbGMucHkKKyMKKyMgQSBzaW1wbGUgY2FsY3VsYXRvciB3aXRoIHZhcmlhYmxlcy4gICBUaGlzIGlzIGZyb20gTydSZWlsbHkncworIyAiTGV4IGFuZCBZYWNjIiwgcC4gNjMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ltcG9ydCBzeXMKK3N5cy5wYXRoLmluc2VydCgwLCAiLi4vLi4iKQorCitpZiBzeXMudmVyc2lvbl9pbmZvWzBdID49IDM6CisgICAgcmF3X2lucHV0ID0gaW5wdXQKKwordG9rZW5zID0gKAorICAgICdOQU1FJywgJ05VTUJFUicsCisgICAgJ1BMVVMnLCAnTUlOVVMnLCAnVElNRVMnLCAnRElWSURFJywgJ0VRVUFMUycsCisgICAgJ0xQQVJFTicsICdSUEFSRU4nLAorKQorCisjIFRva2VucworCit0X1BMVVMgPSByJ1wrJwordF9NSU5VUyA9IHInLScKK3RfVElNRVMgPSByJ1wqJwordF9ESVZJREUgPSByJy8nCit0X0VRVUFMUyA9IHInPScKK3RfTFBBUkVOID0gcidcKCcKK3RfUlBBUkVOID0gcidcKScKK3RfTkFNRSA9IHInW2EtekEtWl9dW2EtekEtWjAtOV9dKicKKworCitkZWYgdF9OVU1CRVIodCk6CisgICAgcidcZCsnCisgICAgdHJ5OgorICAgICAgICB0LnZhbHVlID0gaW50KHQudmFsdWUpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHByaW50KCJJbnRlZ2VyIHZhbHVlIHRvbyBsYXJnZSAlcyIgJSB0LnZhbHVlKQorICAgICAgICB0LnZhbHVlID0gMAorICAgIHJldHVybiB0CisKK3RfaWdub3JlID0gIiBcdCIKKworCitkZWYgdF9uZXdsaW5lKHQpOgorICAgIHInXG4rJworICAgIHQubGV4ZXIubGluZW5vICs9IHQudmFsdWUuY291bnQoIlxuIikKKworCitkZWYgdF9lcnJvcih0KToKKyAgICBwcmludCgiSWxsZWdhbCBjaGFyYWN0ZXIgJyVzJyIgJSB0LnZhbHVlWzBdKQorICAgIHQubGV4ZXIuc2tpcCgxKQorCisjIEJ1aWxkIHRoZSBsZXhlcgoraW1wb3J0IHBseS5sZXggYXMgbGV4CitsZXgubGV4KG9wdGltaXplPTEpCisKKyMgUGFyc2luZyBydWxlcworCitwcmVjZWRlbmNlID0gKAorICAgICgnbGVmdCcsICdQTFVTJywgJ01JTlVTJyksCisgICAgKCdsZWZ0JywgJ1RJTUVTJywgJ0RJVklERScpLAorICAgICgncmlnaHQnLCAnVU1JTlVTJyksCispCisKKyMgZGljdGlvbmFyeSBvZiBuYW1lcworbmFtZXMgPSB7fQorCisKK2RlZiBwX3N0YXRlbWVudF9hc3NpZ24odCk6CisgICAgJ3N0YXRlbWVudCA6IE5BTUUgRVFVQUxTIGV4cHJlc3Npb24nCisgICAgbmFtZXNbdFsxXV0gPSB0WzNdCisKKworZGVmIHBfc3RhdGVtZW50X2V4cHIodCk6CisgICAgJ3N0YXRlbWVudCA6IGV4cHJlc3Npb24nCisgICAgcHJpbnQodFsxXSkKKworCitkZWYgcF9leHByZXNzaW9uX2Jpbm9wKHQpOgorICAgICcnJ2V4cHJlc3Npb24gOiBleHByZXNzaW9uIFBMVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIE1JTlVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBUSU1FUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gRElWSURFIGV4cHJlc3Npb24nJycKKyAgICBpZiB0WzJdID09ICcrJzoKKyAgICAgICAgdFswXSA9IHRbMV0gKyB0WzNdCisgICAgZWxpZiB0WzJdID09ICctJzoKKyAgICAgICAgdFswXSA9IHRbMV0gLSB0WzNdCisgICAgZWxpZiB0WzJdID09ICcqJzoKKyAgICAgICAgdFswXSA9IHRbMV0gKiB0WzNdCisgICAgZWxpZiB0WzJdID09ICcvJzoKKyAgICAgICAgdFswXSA9IHRbMV0gLyB0WzNdCisgICAgZWxpZiB0WzJdID09ICc8JzoKKyAgICAgICAgdFswXSA9IHRbMV0gPCB0WzNdCisKKworZGVmIHBfZXhwcmVzc2lvbl91bWludXModCk6CisgICAgJ2V4cHJlc3Npb24gOiBNSU5VUyBleHByZXNzaW9uICVwcmVjIFVNSU5VUycKKyAgICB0WzBdID0gLXRbMl0KKworCitkZWYgcF9leHByZXNzaW9uX2dyb3VwKHQpOgorICAgICdleHByZXNzaW9uIDogTFBBUkVOIGV4cHJlc3Npb24gUlBBUkVOJworICAgIHRbMF0gPSB0WzJdCisKKworZGVmIHBfZXhwcmVzc2lvbl9udW1iZXIodCk6CisgICAgJ2V4cHJlc3Npb24gOiBOVU1CRVInCisgICAgdFswXSA9IHRbMV0KKworCitkZWYgcF9leHByZXNzaW9uX25hbWUodCk6CisgICAgJ2V4cHJlc3Npb24gOiBOQU1FJworICAgIHRyeToKKyAgICAgICAgdFswXSA9IG5hbWVzW3RbMV1dCisgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICBwcmludCgiVW5kZWZpbmVkIG5hbWUgJyVzJyIgJSB0WzFdKQorICAgICAgICB0WzBdID0gMAorCisKK2RlZiBwX2Vycm9yKHQpOgorICAgIGlmIHQ6CisgICAgICAgIHByaW50KCJTeW50YXggZXJyb3IgYXQgJyVzJyIgJSB0LnZhbHVlKQorICAgIGVsc2U6CisgICAgICAgIHByaW50KCJTeW50YXggZXJyb3IgYXQgRU9GIikKKworaW1wb3J0IHBseS55YWNjIGFzIHlhY2MKK3lhY2MueWFjYyhvcHRpbWl6ZT0xKQorCit3aGlsZSAxOgorICAgIHRyeToKKyAgICAgICAgcyA9IHJhd19pbnB1dCgnY2FsYyA+ICcpCisgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICBicmVhaworICAgIHlhY2MucGFyc2UocykKZGlmZiAtLWdpdCBhL3BseS9leGFtcGxlL3VuaWNhbGMvY2FsYy5weSBiL3BseS9leGFtcGxlL3VuaWNhbGMvY2FsYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDFjNGI5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx5L2V4YW1wbGUvdW5pY2FsYy9jYWxjLnB5CkBAIC0wLDAgKzEsMTMzIEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNhbGMucHkKKyMKKyMgQSBzaW1wbGUgY2FsY3VsYXRvciB3aXRoIHZhcmlhYmxlcy4gICBUaGlzIGlzIGZyb20gTydSZWlsbHkncworIyAiTGV4IGFuZCBZYWNjIiwgcC4gNjMuCisjCisjIFRoaXMgZXhhbXBsZSB1c2VzIHVuaWNvZGUgc3RyaW5ncyBmb3IgdG9rZW5zLCBkb2NzdHJpbmdzLCBhbmQgaW5wdXQuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ltcG9ydCBzeXMKK3N5cy5wYXRoLmluc2VydCgwLCAiLi4vLi4iKQorCit0b2tlbnMgPSAoCisgICAgJ05BTUUnLCAnTlVNQkVSJywKKyAgICAnUExVUycsICdNSU5VUycsICdUSU1FUycsICdESVZJREUnLCAnRVFVQUxTJywKKyAgICAnTFBBUkVOJywgJ1JQQVJFTicsCispCisKKyMgVG9rZW5zCisKK3RfUExVUyA9IHVyJ1wrJwordF9NSU5VUyA9IHVyJy0nCit0X1RJTUVTID0gdXInXConCit0X0RJVklERSA9IHVyJy8nCit0X0VRVUFMUyA9IHVyJz0nCit0X0xQQVJFTiA9IHVyJ1woJwordF9SUEFSRU4gPSB1cidcKScKK3RfTkFNRSA9IHVyJ1thLXpBLVpfXVthLXpBLVowLTlfXSonCisKKworZGVmIHRfTlVNQkVSKHQpOgorICAgIHVyJ1xkKycKKyAgICB0cnk6CisgICAgICAgIHQudmFsdWUgPSBpbnQodC52YWx1ZSkKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgcHJpbnQgIkludGVnZXIgdmFsdWUgdG9vIGxhcmdlIiwgdC52YWx1ZQorICAgICAgICB0LnZhbHVlID0gMAorICAgIHJldHVybiB0CisKK3RfaWdub3JlID0gdSIgXHQiCisKKworZGVmIHRfbmV3bGluZSh0KToKKyAgICB1cidcbisnCisgICAgdC5sZXhlci5saW5lbm8gKz0gdC52YWx1ZS5jb3VudCgiXG4iKQorCisKK2RlZiB0X2Vycm9yKHQpOgorICAgIHByaW50ICJJbGxlZ2FsIGNoYXJhY3RlciAnJXMnIiAlIHQudmFsdWVbMF0KKyAgICB0LmxleGVyLnNraXAoMSkKKworIyBCdWlsZCB0aGUgbGV4ZXIKK2ltcG9ydCBwbHkubGV4IGFzIGxleAorbGV4LmxleCgpCisKKyMgUGFyc2luZyBydWxlcworCitwcmVjZWRlbmNlID0gKAorICAgICgnbGVmdCcsICdQTFVTJywgJ01JTlVTJyksCisgICAgKCdsZWZ0JywgJ1RJTUVTJywgJ0RJVklERScpLAorICAgICgncmlnaHQnLCAnVU1JTlVTJyksCispCisKKyMgZGljdGlvbmFyeSBvZiBuYW1lcworbmFtZXMgPSB7fQorCisKK2RlZiBwX3N0YXRlbWVudF9hc3NpZ24ocCk6CisgICAgJ3N0YXRlbWVudCA6IE5BTUUgRVFVQUxTIGV4cHJlc3Npb24nCisgICAgbmFtZXNbcFsxXV0gPSBwWzNdCisKKworZGVmIHBfc3RhdGVtZW50X2V4cHIocCk6CisgICAgJ3N0YXRlbWVudCA6IGV4cHJlc3Npb24nCisgICAgcHJpbnQgcFsxXQorCisKK2RlZiBwX2V4cHJlc3Npb25fYmlub3AocCk6CisgICAgJycnZXhwcmVzc2lvbiA6IGV4cHJlc3Npb24gUExVUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gTUlOVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIFRJTUVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBESVZJREUgZXhwcmVzc2lvbicnJworICAgIGlmIHBbMl0gPT0gdScrJzoKKyAgICAgICAgcFswXSA9IHBbMV0gKyBwWzNdCisgICAgZWxpZiBwWzJdID09IHUnLSc6CisgICAgICAgIHBbMF0gPSBwWzFdIC0gcFszXQorICAgIGVsaWYgcFsyXSA9PSB1JyonOgorICAgICAgICBwWzBdID0gcFsxXSAqIHBbM10KKyAgICBlbGlmIHBbMl0gPT0gdScvJzoKKyAgICAgICAgcFswXSA9IHBbMV0gLyBwWzNdCisKKworZGVmIHBfZXhwcmVzc2lvbl91bWludXMocCk6CisgICAgJ2V4cHJlc3Npb24gOiBNSU5VUyBleHByZXNzaW9uICVwcmVjIFVNSU5VUycKKyAgICBwWzBdID0gLXBbMl0KKworCitkZWYgcF9leHByZXNzaW9uX2dyb3VwKHApOgorICAgICdleHByZXNzaW9uIDogTFBBUkVOIGV4cHJlc3Npb24gUlBBUkVOJworICAgIHBbMF0gPSBwWzJdCisKKworZGVmIHBfZXhwcmVzc2lvbl9udW1iZXIocCk6CisgICAgJ2V4cHJlc3Npb24gOiBOVU1CRVInCisgICAgcFswXSA9IHBbMV0KKworCitkZWYgcF9leHByZXNzaW9uX25hbWUocCk6CisgICAgJ2V4cHJlc3Npb24gOiBOQU1FJworICAgIHRyeToKKyAgICAgICAgcFswXSA9IG5hbWVzW3BbMV1dCisgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICBwcmludCAiVW5kZWZpbmVkIG5hbWUgJyVzJyIgJSBwWzFdCisgICAgICAgIHBbMF0gPSAwCisKKworZGVmIHBfZXJyb3IocCk6CisgICAgaWYgcDoKKyAgICAgICAgcHJpbnQgIlN5bnRheCBlcnJvciBhdCAnJXMnIiAlIHAudmFsdWUKKyAgICBlbHNlOgorICAgICAgICBwcmludCAiU3ludGF4IGVycm9yIGF0IEVPRiIKKworaW1wb3J0IHBseS55YWNjIGFzIHlhY2MKK3lhY2MueWFjYygpCisKK3doaWxlIDE6CisgICAgdHJ5OgorICAgICAgICBzID0gcmF3X2lucHV0KCdjYWxjID4gJykKKyAgICBleGNlcHQgRU9GRXJyb3I6CisgICAgICAgIGJyZWFrCisgICAgaWYgbm90IHM6CisgICAgICAgIGNvbnRpbnVlCisgICAgeWFjYy5wYXJzZSh1bmljb2RlKHMpKQpkaWZmIC0tZ2l0IGEvcGx5L2V4YW1wbGUveXBseS9SRUFETUUgYi9wbHkvZXhhbXBsZS95cGx5L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmFkZjM2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx5L2V4YW1wbGUveXBseS9SRUFETUUKQEAgLTAsMCArMSw0MSBAQAoreXBseS5weQorCitUaGlzIGV4YW1wbGUgaW1wbGVtZW50cyBhIHByb2dyYW0geXBseS5weSB0aGF0IGNvbnZlcnRzIGEgVU5JWC15YWNjCitzcGVjaWZpY2F0aW9uIGZpbGUgaW50byBhIFBMWS1jb21wYXRpYmxlIHByb2dyYW0uICBUbyB1c2UsIHNpbXBseQorcnVuIGl0IGxpa2UgdGhpczoKKworICAgJSBweXRob24geXBseS5weSBbLW5vY29kZV0gaW5wdXRmaWxlLnkgPm15cGFyc2VyLnB5CisKK1RoZSBvdXRwdXQgb2YgdGhpcyBwcm9ncmFtIGlzIFB5dGhvbiBjb2RlLiBJbiB0aGUgb3V0cHV0LAorYW55IEMgY29kZSBpbiB0aGUgb3JpZ2luYWwgZmlsZSBpcyBpbmNsdWRlZCwgYnV0IGlzIGNvbW1lbnRlZCBvdXQuCitJZiB5b3UgdXNlIHRoZSAtbm9jb2RlIG9wdGlvbiwgdGhlbiBhbGwgb2YgdGhlIEMgY29kZSBpbiB0aGUKK29yaWdpbmFsIGZpbGUgaXMganVzdCBkaXNjYXJkZWQuCisKK1RvIHVzZSB0aGUgcmVzdWx0aW5nIGdyYW1tZXIgd2l0aCBQTFksIHlvdSdsbCBuZWVkIHRvIGVkaXQgdGhlCitteXBhcnNlci5weSBmaWxlLiBXaXRoaW4gdGhpcyBmaWxlLCBzb21lIHN0dWIgY29kZSBpcyBpbmNsdWRlZCB0aGF0CitjYW4gYmUgdXNlZCB0byB0ZXN0IHRoZSBjb25zdHJ1Y3Rpb24gb2YgdGhlIHBhcnNpbmcgdGFibGVzLiBIb3dldmVyLAoreW91J2xsIG5lZWQgdG8gZG8gbW9yZSBlZGl0aW5nIHRvIG1ha2UgYSB3b3JrYWJsZSBwYXJzZXIuCisKK0Rpc2NsYWltZXI6ICBUaGlzIGp1c3QgYW4gZXhhbXBsZSBJIHRocmV3IHRvZ2V0aGVyIGluIGFuIGFmdGVybm9vbi4KK0l0IG1pZ2h0IGhhdmUgc29tZSBidWdzLiAgSG93ZXZlciwgaXQgd29ya2VkIHdoZW4gSSB0cmllZCBpdCBvbgorYSB5YWNjLXNwZWNpZmllZCBDKysgcGFyc2VyIGNvbnRhaW5pbmcgNDQyIHJ1bGVzIGFuZCA4NTUgcGFyc2luZworc3RhdGVzLgorCitDb21tZW50czoKKworMS4gVGhpcyBleGFtcGxlIGRvZXMgbm90IHBhcnNlIHNwZWNpZmljYXRpb24gZmlsZXMgbWVhbnQgZm9yIGxleC9mbGV4LgorICAgWW91J2xsIG5lZWQgdG8gc3BlY2lmeSB0aGUgdG9rZW5pemVyIG9uIHlvdXIgb3duLgorCisyLiBUaGlzIGV4YW1wbGUgc2hvd3MgYSBudW1iZXIgb2YgaW50ZXJlc3RpbmcgUExZIGZlYXR1cmVzIGluY2x1ZGluZworICAgIAorICAgICAtIFBhcnNpbmcgb2YgbGl0ZXJhbCB0ZXh0IGRlbGltaXRlZCBieSBuZXN0ZWQgcGFyZW50aGVzZXMKKyAgICAgLSBTb21lIGludGVyYWN0aW9uIGJldHdlZW4gdGhlIHBhcnNlciBhbmQgdGhlIGxleGVyLgorICAgICAtIFVzZSBvZiBsaXRlcmFscyBpbiB0aGUgZ3JhbW1hciBzcGVjaWZpY2F0aW9uCisgICAgIC0gT25lIHBhc3MgY29tcGlsYXRpb24uICBUaGUgcHJvZ3JhbSBqdXN0IGVtaXRzIHRoZSByZXN1bHQsCisgICAgICAgdGhlcmUgaXMgbm8gaW50ZXJtZWRpYXRlIHBhcnNlIHRyZWUuCisKKzMuIFRoaXMgcHJvZ3JhbSBjb3VsZCBwcm9iYWJseSBiZSBjbGVhbmVkIHVwIGFuZCBlbmhhbmNlZCBhIGxvdC4KKyAgIEl0IHdvdWxkIGJlIGdyZWF0IGlmIHNvbWVvbmUgd2FudGVkIHRvIHdvcmsgb24gdGhpcyAoaGludCkuCisKKy1EYXZlCisgICAgICAgCmRpZmYgLS1naXQgYS9wbHkvZXhhbXBsZS95cGx5L3lsZXgucHkgYi9wbHkvZXhhbXBsZS95cGx5L3lsZXgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY0MTBlMgotLS0gL2Rldi9udWxsCisrKyBiL3BseS9leGFtcGxlL3lwbHkveWxleC5weQpAQCAtMCwwICsxLDExOSBAQAorIyBsZXhlciBmb3IgeWFjYy1ncmFtbWFycworIworIyBBdXRob3I6IERhdmlkIEJlYXpsZXkgKGRhdmVAZGFiZWF6LmNvbSkKKyMgRGF0ZSAgOiBPY3RvYmVyIDIsIDIwMDYKKworaW1wb3J0IHN5cworc3lzLnBhdGguYXBwZW5kKCIuLi8uLiIpCisKK2Zyb20gcGx5IGltcG9ydCAqCisKK3Rva2VucyA9ICgKKyAgICAnTElURVJBTCcsICdTRUNUSU9OJywgJ1RPS0VOJywgJ0xFRlQnLCAnUklHSFQnLCAnUFJFQycsICdTVEFSVCcsICdUWVBFJywgJ05PTkFTU09DJywgJ1VOSU9OJywgJ0NPREUnLAorICAgICdJRCcsICdRTElURVJBTCcsICdOVU1CRVInLAorKQorCitzdGF0ZXMgPSAoKCdjb2RlJywgJ2V4Y2x1c2l2ZScpLCkKKworbGl0ZXJhbHMgPSBbJzsnLCAnLCcsICc8JywgJz4nLCAnfCcsICc6J10KK3RfaWdub3JlID0gJyBcdCcKKwordF9UT0tFTiA9IHInJXRva2VuJwordF9MRUZUID0gciclbGVmdCcKK3RfUklHSFQgPSByJyVyaWdodCcKK3RfTk9OQVNTT0MgPSByJyVub25hc3NvYycKK3RfUFJFQyA9IHInJXByZWMnCit0X1NUQVJUID0gciclc3RhcnQnCit0X1RZUEUgPSByJyV0eXBlJwordF9VTklPTiA9IHInJXVuaW9uJwordF9JRCA9IHInW2EtekEtWl9dW2EtekEtWl8wLTldKicKK3RfUUxJVEVSQUwgID0gcicnJyg/UDxxdW90ZT5bJyJdKS4qPyg/UD1xdW90ZSknJycKK3RfTlVNQkVSID0gcidcZCsnCisKKworZGVmIHRfU0VDVElPTih0KToKKyAgICByJyUlJworICAgIGlmIGdldGF0dHIodC5sZXhlciwgImxhc3RzZWN0aW9uIiwgMCk6CisgICAgICAgIHQudmFsdWUgPSB0LmxleGVyLmxleGRhdGFbdC5sZXhwb3MgKyAyOl0KKyAgICAgICAgdC5sZXhlci5sZXhwb3MgPSBsZW4odC5sZXhlci5sZXhkYXRhKQorICAgIGVsc2U6CisgICAgICAgIHQubGV4ZXIubGFzdHNlY3Rpb24gPSAwCisgICAgcmV0dXJuIHQKKworIyBDb21tZW50cworCisKK2RlZiB0X2Njb21tZW50KHQpOgorICAgIHInL1wqKC58XG4pKj9cKi8nCisgICAgdC5sZXhlci5saW5lbm8gKz0gdC52YWx1ZS5jb3VudCgnXG4nKQorCit0X2lnbm9yZV9jcHBjb21tZW50ID0gcicvLy4qJworCisKK2RlZiB0X0xJVEVSQUwodCk6CisgICAgciclXHsoLnxcbikqPyVcfScKKyAgICB0LmxleGVyLmxpbmVubyArPSB0LnZhbHVlLmNvdW50KCJcbiIpCisgICAgcmV0dXJuIHQKKworCitkZWYgdF9ORVdMSU5FKHQpOgorICAgIHInXG4nCisgICAgdC5sZXhlci5saW5lbm8gKz0gMQorCisKK2RlZiB0X2NvZGUodCk6CisgICAgcidceycKKyAgICB0LmxleGVyLmNvZGVzdGFydCA9IHQubGV4cG9zCisgICAgdC5sZXhlci5sZXZlbCA9IDEKKyAgICB0LmxleGVyLmJlZ2luKCdjb2RlJykKKworCitkZWYgdF9jb2RlX2lnbm9yZV9zdHJpbmcodCk6CisgICAgcidcIihbXlxcXG5dfChcXC4pKSo/XCInCisKKworZGVmIHRfY29kZV9pZ25vcmVfY2hhcih0KToKKyAgICByJ1wnKFteXFxcbl18KFxcLikpKj9cJycKKworCitkZWYgdF9jb2RlX2lnbm9yZV9jb21tZW50KHQpOgorICAgIHInL1wqKC58XG4pKj9cKi8nCisKKworZGVmIHRfY29kZV9pZ25vcmVfY3BwY29tKHQpOgorICAgIHInLy8uKicKKworCitkZWYgdF9jb2RlX2xicmFjZSh0KToKKyAgICByJ1x7JworICAgIHQubGV4ZXIubGV2ZWwgKz0gMQorCisKK2RlZiB0X2NvZGVfcmJyYWNlKHQpOgorICAgIHInXH0nCisgICAgdC5sZXhlci5sZXZlbCAtPSAxCisgICAgaWYgdC5sZXhlci5sZXZlbCA9PSAwOgorICAgICAgICB0LnR5cGUgPSAnQ09ERScKKyAgICAgICAgdC52YWx1ZSA9IHQubGV4ZXIubGV4ZGF0YVt0LmxleGVyLmNvZGVzdGFydDp0LmxleHBvcyArIDFdCisgICAgICAgIHQubGV4ZXIuYmVnaW4oJ0lOSVRJQUwnKQorICAgICAgICB0LmxleGVyLmxpbmVubyArPSB0LnZhbHVlLmNvdW50KCdcbicpCisgICAgICAgIHJldHVybiB0CisKK3RfY29kZV9pZ25vcmVfbm9uc3BhY2UgPSByJ1teXHNcfVwnXCJce10rJwordF9jb2RlX2lnbm9yZV93aGl0ZXNwYWNlID0gcidccysnCit0X2NvZGVfaWdub3JlID0gIiIKKworCitkZWYgdF9jb2RlX2Vycm9yKHQpOgorICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgorCisKK2RlZiB0X2Vycm9yKHQpOgorICAgIHByaW50KCIlZDogSWxsZWdhbCBjaGFyYWN0ZXIgJyVzJyIgJSAodC5sZXhlci5saW5lbm8sIHQudmFsdWVbMF0pKQorICAgIHByaW50KHQudmFsdWUpCisgICAgdC5sZXhlci5za2lwKDEpCisKK2xleC5sZXgoKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGxleC5ydW5tYWluKCkKZGlmZiAtLWdpdCBhL3BseS9leGFtcGxlL3lwbHkveXBhcnNlLnB5IGIvcGx5L2V4YW1wbGUveXBseS95cGFyc2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyZThkMAotLS0gL2Rldi9udWxsCisrKyBiL3BseS9leGFtcGxlL3lwbHkveXBhcnNlLnB5CkBAIC0wLDAgKzEsMjQ0IEBACisjIHBhcnNlciBmb3IgVW5peCB5YWNjLWJhc2VkIGdyYW1tYXJzCisjCisjIEF1dGhvcjogRGF2aWQgQmVhemxleSAoZGF2ZUBkYWJlYXouY29tKQorIyBEYXRlICA6IE9jdG9iZXIgMiwgMjAwNgorCitpbXBvcnQgeWxleAordG9rZW5zID0geWxleC50b2tlbnMKKworZnJvbSBwbHkgaW1wb3J0ICoKKwordG9rZW5saXN0ID0gW10KK3ByZWNsaXN0ID0gW10KKworZW1pdF9jb2RlID0gMQorCisKK2RlZiBwX3lhY2MocCk6CisgICAgJycneWFjYyA6IGRlZnNlY3Rpb24gcnVsZXNlY3Rpb24nJycKKworCitkZWYgcF9kZWZzZWN0aW9uKHApOgorICAgICcnJ2RlZnNlY3Rpb24gOiBkZWZpbml0aW9ucyBTRUNUSU9OCisgICAgICAgICAgICAgICAgICB8IFNFQ1RJT04nJycKKyAgICBwLmxleGVyLmxhc3RzZWN0aW9uID0gMQorICAgIHByaW50KCJ0b2tlbnMgPSAiLCByZXByKHRva2VubGlzdCkpCisgICAgcHJpbnQoKQorICAgIHByaW50KCJwcmVjZWRlbmNlID0gIiwgcmVwcihwcmVjbGlzdCkpCisgICAgcHJpbnQoKQorICAgIHByaW50KCIjIC0tLS0tLS0tLS0tLS0tIFJVTEVTIC0tLS0tLS0tLS0tLS0tLS0iKQorICAgIHByaW50KCkKKworCitkZWYgcF9ydWxlc2VjdGlvbihwKToKKyAgICAnJydydWxlc2VjdGlvbiA6IHJ1bGVzIFNFQ1RJT04nJycKKworICAgIHByaW50KCIjIC0tLS0tLS0tLS0tLS0tIFJVTEVTIEVORCAtLS0tLS0tLS0tLS0tLS0tIikKKyAgICBwcmludF9jb2RlKHBbMl0sIDApCisKKworZGVmIHBfZGVmaW5pdGlvbnMocCk6CisgICAgJycnZGVmaW5pdGlvbnMgOiBkZWZpbml0aW9ucyBkZWZpbml0aW9uCisgICAgICAgICAgICAgICAgICAgfCBkZWZpbml0aW9uJycnCisKKworZGVmIHBfZGVmaW5pdGlvbl9saXRlcmFsKHApOgorICAgICcnJ2RlZmluaXRpb24gOiBMSVRFUkFMJycnCisgICAgcHJpbnRfY29kZShwWzFdLCAwKQorCisKK2RlZiBwX2RlZmluaXRpb25fc3RhcnQocCk6CisgICAgJycnZGVmaW5pdGlvbiA6IFNUQVJUIElEJycnCisgICAgcHJpbnQoInN0YXJ0ID0gJyVzJyIgJSBwWzJdKQorCisKK2RlZiBwX2RlZmluaXRpb25fdG9rZW4ocCk6CisgICAgJycnZGVmaW5pdGlvbiA6IHRva3R5cGUgb3B0dHlwZSBpZGxpc3Qgb3B0c2VtaSAnJycKKyAgICBmb3IgaSBpbiBwWzNdOgorICAgICAgICBpZiBpWzBdIG5vdCBpbiAiJ1wiIjoKKyAgICAgICAgICAgIHRva2VubGlzdC5hcHBlbmQoaSkKKyAgICBpZiBwWzFdID09ICclbGVmdCc6CisgICAgICAgIHByZWNsaXN0LmFwcGVuZCgoJ2xlZnQnLCkgKyB0dXBsZShwWzNdKSkKKyAgICBlbGlmIHBbMV0gPT0gJyVyaWdodCc6CisgICAgICAgIHByZWNsaXN0LmFwcGVuZCgoJ3JpZ2h0JywpICsgdHVwbGUocFszXSkpCisgICAgZWxpZiBwWzFdID09ICclbm9uYXNzb2MnOgorICAgICAgICBwcmVjbGlzdC5hcHBlbmQoKCdub25hc3NvYycsKSArIHR1cGxlKHBbM10pKQorCisKK2RlZiBwX3Rva3R5cGUocCk6CisgICAgJycndG9rdHlwZSA6IFRPS0VOCisgICAgICAgICAgICAgICB8IExFRlQKKyAgICAgICAgICAgICAgIHwgUklHSFQKKyAgICAgICAgICAgICAgIHwgTk9OQVNTT0MnJycKKyAgICBwWzBdID0gcFsxXQorCisKK2RlZiBwX29wdHR5cGUocCk6CisgICAgJycnb3B0dHlwZSA6ICc8JyBJRCAnPicKKyAgICAgICAgICAgICAgIHwgZW1wdHknJycKKworCitkZWYgcF9pZGxpc3QocCk6CisgICAgJycnaWRsaXN0ICA6IGlkbGlzdCBvcHRjb21tYSB0b2tlbmlkCisgICAgICAgICAgICAgICB8IHRva2VuaWQnJycKKyAgICBpZiBsZW4ocCkgPT0gMjoKKyAgICAgICAgcFswXSA9IFtwWzFdXQorICAgIGVsc2U6CisgICAgICAgIHBbMF0gPSBwWzFdCisgICAgICAgIHBbMV0uYXBwZW5kKHBbM10pCisKKworZGVmIHBfdG9rZW5pZChwKToKKyAgICAnJyd0b2tlbmlkIDogSUQgCisgICAgICAgICAgICAgICB8IElEIE5VTUJFUgorICAgICAgICAgICAgICAgfCBRTElURVJBTAorICAgICAgICAgICAgICAgfCBRTElURVJBTCBOVU1CRVInJycKKyAgICBwWzBdID0gcFsxXQorCisKK2RlZiBwX29wdHNlbWkocCk6CisgICAgJycnb3B0c2VtaSA6ICc7JworICAgICAgICAgICAgICAgfCBlbXB0eScnJworCisKK2RlZiBwX29wdGNvbW1hKHApOgorICAgICcnJ29wdGNvbW1hIDogJywnCisgICAgICAgICAgICAgICAgfCBlbXB0eScnJworCisKK2RlZiBwX2RlZmluaXRpb25fdHlwZShwKToKKyAgICAnJydkZWZpbml0aW9uIDogVFlQRSAnPCcgSUQgJz4nIG5hbWVsaXN0IG9wdHNlbWknJycKKyAgICAjIHR5cGUgZGVjbGFyYXRpb25zIGFyZSBpZ25vcmVkCisKKworZGVmIHBfbmFtZWxpc3QocCk6CisgICAgJycnbmFtZWxpc3QgOiBuYW1lbGlzdCBvcHRjb21tYSBJRAorICAgICAgICAgICAgICAgIHwgSUQnJycKKworCitkZWYgcF9kZWZpbml0aW9uX3VuaW9uKHApOgorICAgICcnJ2RlZmluaXRpb24gOiBVTklPTiBDT0RFIG9wdHNlbWknJycKKyAgICAjIFVuaW9uIGRlY2xhcmF0aW9ucyBhcmUgaWdub3JlZAorCisKK2RlZiBwX3J1bGVzKHApOgorICAgICcnJ3J1bGVzICAgOiBydWxlcyBydWxlCisgICAgICAgICAgICAgICB8IHJ1bGUnJycKKyAgICBpZiBsZW4ocCkgPT0gMjoKKyAgICAgICAgcnVsZSA9IHBbMV0KKyAgICBlbHNlOgorICAgICAgICBydWxlID0gcFsyXQorCisgICAgIyBQcmludCBvdXQgYSBQeXRob24gZXF1aXZhbGVudCBvZiB0aGlzIHJ1bGUKKworICAgIGVtYmVkZGVkID0gW10gICAgICAjIEVtYmVkZGVkIGFjdGlvbnMgKGEgbWVzcykKKyAgICBlbWJlZF9jb3VudCA9IDAKKworICAgIHJ1bGVuYW1lID0gcnVsZVswXQorICAgIHJ1bGVjb3VudCA9IDEKKyAgICBmb3IgciBpbiBydWxlWzFdOgorICAgICAgICAjIHIgY29udGFpbnMgb25lIG9mIHRoZSBydWxlIHBvc3NpYmlsaXRpZXMKKyAgICAgICAgcHJpbnQoImRlZiBwXyVzXyVkKHApOiIgJSAocnVsZW5hbWUsIHJ1bGVjb3VudCkpCisgICAgICAgIHByb2QgPSBbXQorICAgICAgICBwcm9kY29kZSA9ICIiCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihyKSk6CisgICAgICAgICAgICBpdGVtID0gcltpXQorICAgICAgICAgICAgaWYgaXRlbVswXSA9PSAneyc6ICAgICMgQSBjb2RlIGJsb2NrCisgICAgICAgICAgICAgICAgaWYgaSA9PSBsZW4ocikgLSAxOgorICAgICAgICAgICAgICAgICAgICBwcm9kY29kZSA9IGl0ZW0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIGFuIGVtYmVkZGVkIGFjdGlvbgorICAgICAgICAgICAgICAgICAgICBlbWJlZF9uYW1lID0gIl9lbWJlZCVkXyVzIiAlIChlbWJlZF9jb3VudCwgcnVsZW5hbWUpCisgICAgICAgICAgICAgICAgICAgIHByb2QuYXBwZW5kKGVtYmVkX25hbWUpCisgICAgICAgICAgICAgICAgICAgIGVtYmVkZGVkLmFwcGVuZCgoZW1iZWRfbmFtZSwgaXRlbSkpCisgICAgICAgICAgICAgICAgICAgIGVtYmVkX2NvdW50ICs9IDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJvZC5hcHBlbmQoaXRlbSkKKyAgICAgICAgcHJpbnQoIiAgICAnJyclcyA6ICVzJycnIiAlIChydWxlbmFtZSwgIiAiLmpvaW4ocHJvZCkpKQorICAgICAgICAjIEVtaXQgY29kZQorICAgICAgICBwcmludF9jb2RlKHByb2Rjb2RlLCA0KQorICAgICAgICBwcmludCgpCisgICAgICAgIHJ1bGVjb3VudCArPSAxCisKKyAgICBmb3IgZSwgY29kZSBpbiBlbWJlZGRlZDoKKyAgICAgICAgcHJpbnQoImRlZiBwXyVzKHApOiIgJSBlKQorICAgICAgICBwcmludCgiICAgICcnJyVzIDogJycnIiAlIGUpCisgICAgICAgIHByaW50X2NvZGUoY29kZSwgNCkKKyAgICAgICAgcHJpbnQoKQorCisKK2RlZiBwX3J1bGUocCk6CisgICAgJycncnVsZSA6IElEICc6JyBydWxlbGlzdCAnOycgJycnCisgICAgcFswXSA9IChwWzFdLCBbcFszXV0pCisKKworZGVmIHBfcnVsZTIocCk6CisgICAgJycncnVsZSA6IElEICc6JyBydWxlbGlzdCBtb3JlcnVsZXMgJzsnICcnJworICAgIHBbNF0uaW5zZXJ0KDAsIHBbM10pCisgICAgcFswXSA9IChwWzFdLCBwWzRdKQorCisKK2RlZiBwX3J1bGVfZW1wdHkocCk6CisgICAgJycncnVsZSA6IElEICc6JyAnOycgJycnCisgICAgcFswXSA9IChwWzFdLCBbW11dKQorCisKK2RlZiBwX3J1bGVfZW1wdHkyKHApOgorICAgICcnJ3J1bGUgOiBJRCAnOicgbW9yZXJ1bGVzICc7JyAnJycKKworICAgIHBbM10uaW5zZXJ0KDAsIFtdKQorICAgIHBbMF0gPSAocFsxXSwgcFszXSkKKworCitkZWYgcF9tb3JlcnVsZXMocCk6CisgICAgJycnbW9yZXJ1bGVzIDogbW9yZXJ1bGVzICd8JyBydWxlbGlzdAorICAgICAgICAgICAgICAgICB8ICd8JyBydWxlbGlzdAorICAgICAgICAgICAgICAgICB8ICd8JyAgJycnCisKKyAgICBpZiBsZW4ocCkgPT0gMjoKKyAgICAgICAgcFswXSA9IFtbXV0KKyAgICBlbGlmIGxlbihwKSA9PSAzOgorICAgICAgICBwWzBdID0gW3BbMl1dCisgICAgZWxzZToKKyAgICAgICAgcFswXSA9IHBbMV0KKyAgICAgICAgcFswXS5hcHBlbmQocFszXSkKKworIyAgIHByaW50KCJtb3JlcnVsZXMiLCBsZW4ocCksIHBbMF0pCisKKworZGVmIHBfcnVsZWxpc3QocCk6CisgICAgJycncnVsZWxpc3QgOiBydWxlbGlzdCBydWxlaXRlbQorICAgICAgICAgICAgICAgIHwgcnVsZWl0ZW0nJycKKworICAgIGlmIGxlbihwKSA9PSAyOgorICAgICAgICBwWzBdID0gW3BbMV1dCisgICAgZWxzZToKKyAgICAgICAgcFswXSA9IHBbMV0KKyAgICAgICAgcFsxXS5hcHBlbmQocFsyXSkKKworCitkZWYgcF9ydWxlaXRlbShwKToKKyAgICAnJydydWxlaXRlbSA6IElECisgICAgICAgICAgICAgICAgfCBRTElURVJBTAorICAgICAgICAgICAgICAgIHwgQ09ERQorICAgICAgICAgICAgICAgIHwgUFJFQycnJworICAgIHBbMF0gPSBwWzFdCisKKworZGVmIHBfZW1wdHkocCk6CisgICAgJycnZW1wdHkgOiAnJycKKworCitkZWYgcF9lcnJvcihwKToKKyAgICBwYXNzCisKK3lhY2MueWFjYyhkZWJ1Zz0wKQorCisKK2RlZiBwcmludF9jb2RlKGNvZGUsIGluZGVudCk6CisgICAgaWYgbm90IGVtaXRfY29kZToKKyAgICAgICAgcmV0dXJuCisgICAgY29kZWxpbmVzID0gY29kZS5zcGxpdGxpbmVzKCkKKyAgICBmb3IgYyBpbiBjb2RlbGluZXM6CisgICAgICAgIHByaW50KCIlcyMgJXMiICUgKCIgIiAqIGluZGVudCwgYykpCmRpZmYgLS1naXQgYS9wbHkvZXhhbXBsZS95cGx5L3lwbHkucHkgYi9wbHkvZXhhbXBsZS95cGx5L3lwbHkucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTI0NjE2YwotLS0gL2Rldi9udWxsCisrKyBiL3BseS9leGFtcGxlL3lwbHkveXBseS5weQpAQCAtMCwwICsxLDUxIEBACisjIS91c3IvbG9jYWwvYmluL3B5dGhvbgorIyB5cGx5LnB5CisjCisjIEF1dGhvcjogRGF2aWQgQmVhemxleSAoZGF2ZUBkYWJlYXouY29tKQorIyBEYXRlICA6IE9jdG9iZXIgMiwgMjAwNgorIworIyBDb252ZXJ0cyBhIFVOSVgteWFjYyBzcGVjaWZpY2F0aW9uIGZpbGUgaW50byBhIFBMWS1jb21wYXRpYmxlCisjIHNwZWNpZmljYXRpb24uICAgVG8gdXNlLCBzaW1wbHkgZG8gdGhpczoKKyMKKyMgICAlIHB5dGhvbiB5cGx5LnB5IFstbm9jb2RlXSBpbnB1dGZpbGUueSA+bXlwYXJzZXIucHkKKyMKKyMgVGhlIG91dHB1dCBvZiB0aGlzIHByb2dyYW0gaXMgUHl0aG9uIGNvZGUuIEluIHRoZSBvdXRwdXQsCisjIGFueSBDIGNvZGUgaW4gdGhlIG9yaWdpbmFsIGZpbGUgaXMgaW5jbHVkZWQsIGJ1dCBpcyBjb21tZW50ZWQuCisjIElmIHlvdSB1c2UgdGhlIC1ub2NvZGUgb3B0aW9uLCB0aGVuIGFsbCBvZiB0aGUgQyBjb2RlIGluIHRoZQorIyBvcmlnaW5hbCBmaWxlIGlzIGRpc2NhcmRlZC4KKyMKKyMgRGlzY2xhaW1lcjogIFRoaXMganVzdCBhbiBleGFtcGxlIEkgdGhyZXcgdG9nZXRoZXIgaW4gYW4gYWZ0ZXJub29uLgorIyBJdCBtaWdodCBoYXZlIHNvbWUgYnVncy4gIEhvd2V2ZXIsIGl0IHdvcmtlZCB3aGVuIEkgdHJpZWQgaXQgb24KKyMgYSB5YWNjLXNwZWNpZmllZCBDKysgcGFyc2VyIGNvbnRhaW5pbmcgNDQyIHJ1bGVzIGFuZCA4NTUgcGFyc2luZworIyBzdGF0ZXMuCisjCisKK2ltcG9ydCBzeXMKK3N5cy5wYXRoLmluc2VydCgwLCAiLi4vLi4iKQorCitpbXBvcnQgeWxleAoraW1wb3J0IHlwYXJzZQorCitmcm9tIHBseSBpbXBvcnQgKgorCitpZiBsZW4oc3lzLmFyZ3YpID09IDE6CisgICAgcHJpbnQoInVzYWdlIDogeXBseS5weSBbLW5vY29kZV0gaW5wdXRmaWxlIikKKyAgICByYWlzZSBTeXN0ZW1FeGl0CisKK2lmIGxlbihzeXMuYXJndikgPT0gMzoKKyAgICBpZiBzeXMuYXJndlsxXSA9PSAnLW5vY29kZSc6CisgICAgICAgIHlwYXJzZS5lbWl0X2NvZGUgPSAwCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQoIlVua25vd24gb3B0aW9uICclcyciICUgc3lzLmFyZ3ZbMV0pCisgICAgICAgIHJhaXNlIFN5c3RlbUV4aXQKKyAgICBmaWxlbmFtZSA9IHN5cy5hcmd2WzJdCitlbHNlOgorICAgIGZpbGVuYW1lID0gc3lzLmFyZ3ZbMV0KKworeWFjYy5wYXJzZShvcGVuKGZpbGVuYW1lKS5yZWFkKCkpCisKK3ByaW50KCIiIgoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBmcm9tIHBseSBpbXBvcnQgKgorICAgIHlhY2MueWFjYygpCisiIiIpCmRpZmYgLS1naXQgYS9wbHkvcGx5L19faW5pdF9fLnB5IGIvcGx5L3BseS9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTUzY2RkCi0tLSAvZGV2L251bGwKKysrIGIvcGx5L3BseS9fX2luaXRfXy5weQpAQCAtMCwwICsxLDUgQEAKKyMgUExZIHBhY2thZ2UKKyMgQXV0aG9yOiBEYXZpZCBCZWF6bGV5IChkYXZlQGRhYmVhei5jb20pCisKK19fdmVyc2lvbl9fID0gJzMuOScKK19fYWxsX18gPSBbJ2xleCcsJ3lhY2MnXQpkaWZmIC0tZ2l0IGEvcGx5L3BseS9jcHAucHkgYi9wbHkvcGx5L2NwcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmJmYzY5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx5L3BseS9jcHAucHkKQEAgLTAsMCArMSw5MTggQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY3BwLnB5CisjCisjIEF1dGhvcjogIERhdmlkIEJlYXpsZXkgKGh0dHA6Ly93d3cuZGFiZWF6LmNvbSkKKyMgQ29weXJpZ2h0IChDKSAyMDA3CisjIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyMKKyMgVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBhbiBBTlNJLUMgc3R5bGUgbGV4aWNhbCBwcmVwcm9jZXNzb3IgZm9yIFBMWS4gCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGdlbmVyYXRvcnMKKworaW1wb3J0IHN5cworCisjIFNvbWUgUHl0aG9uIDMgY29tcGF0aWJpbGl0eSBzaGltcworaWYgc3lzLnZlcnNpb25faW5mby5tYWpvciA8IDM6CisgICAgU1RSSU5HX1RZUEVTID0gKHN0ciwgdW5pY29kZSkKK2Vsc2U6CisgICAgU1RSSU5HX1RZUEVTID0gc3RyCisgICAgeHJhbmdlID0gcmFuZ2UKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZWZhdWx0IHByZXByb2Nlc3NvciBsZXhlciBkZWZpbml0aW9ucy4gICBUaGVzZSB0b2tlbnMgYXJlIGVub3VnaCB0byBnZXQKKyMgYSBiYXNpYyBwcmVwcm9jZXNzb3Igd29ya2luZy4gICBPdGhlciBtb2R1bGVzIG1heSBpbXBvcnQgdGhlc2UgaWYgdGhleSB3YW50CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3Rva2VucyA9ICgKKyAgICdDUFBfSUQnLCdDUFBfSU5URUdFUicsICdDUFBfRkxPQVQnLCAnQ1BQX1NUUklORycsICdDUFBfQ0hBUicsICdDUFBfV1MnLCAnQ1BQX0NPTU1FTlQxJywgJ0NQUF9DT01NRU5UMicsICdDUFBfUE9VTkQnLCdDUFBfRFBPVU5EJworKQorCitsaXRlcmFscyA9ICIrLSovJXwmfl48Pj0hPygpW117fS4sOzpcXFwnXCIiCisKKyMgV2hpdGVzcGFjZQorZGVmIHRfQ1BQX1dTKHQpOgorICAgIHInXHMrJworICAgIHQubGV4ZXIubGluZW5vICs9IHQudmFsdWUuY291bnQoIlxuIikKKyAgICByZXR1cm4gdAorCit0X0NQUF9QT1VORCA9IHInXCMnCit0X0NQUF9EUE9VTkQgPSByJ1wjXCMnCisKKyMgSWRlbnRpZmllcgordF9DUFBfSUQgPSByJ1tBLVphLXpfXVtcd19dKicKKworIyBJbnRlZ2VyIGxpdGVyYWwKK2RlZiBDUFBfSU5URUdFUih0KToKKyAgICByJygoKCgoMHgpfCgwWCkpWzAtOWEtZkEtRl0rKXwoXGQrKSkoW3VVXVtsTF18W2xMXVt1VV18W3VVXXxbbExdKT8pJworICAgIHJldHVybiB0CisKK3RfQ1BQX0lOVEVHRVIgPSBDUFBfSU5URUdFUgorCisjIEZsb2F0aW5nIGxpdGVyYWwKK3RfQ1BQX0ZMT0FUID0gcicoKFxkKykoXC5cZCspKGUoXCt8LSk/KFxkKykpPyB8IChcZCspZShcK3wtKT8oXGQrKSkoW2xMXXxbZkZdKT8nCisKKyMgU3RyaW5nIGxpdGVyYWwKK2RlZiB0X0NQUF9TVFJJTkcodCk6CisgICAgcidcIihbXlxcXG5dfChcXCgufFxuKSkpKj9cIicKKyAgICB0LmxleGVyLmxpbmVubyArPSB0LnZhbHVlLmNvdW50KCJcbiIpCisgICAgcmV0dXJuIHQKKworIyBDaGFyYWN0ZXIgY29uc3RhbnQgJ2MnIG9yIEwnYycKK2RlZiB0X0NQUF9DSEFSKHQpOgorICAgIHInKEwpP1wnKFteXFxcbl18KFxcKC58XG4pKSkqP1wnJworICAgIHQubGV4ZXIubGluZW5vICs9IHQudmFsdWUuY291bnQoIlxuIikKKyAgICByZXR1cm4gdAorCisjIENvbW1lbnQKK2RlZiB0X0NQUF9DT01NRU5UMSh0KToKKyAgICByJygvXCooLnxcbikqP1wqLyknCisgICAgbmNyID0gdC52YWx1ZS5jb3VudCgiXG4iKQorICAgIHQubGV4ZXIubGluZW5vICs9IG5jcgorICAgICMgcmVwbGFjZSB3aXRoIG9uZSBzcGFjZSBvciBhIG51bWJlciBvZiAnXG4nCisgICAgdC50eXBlID0gJ0NQUF9XUyc7IHQudmFsdWUgPSAnXG4nICogbmNyIGlmIG5jciBlbHNlICcgJworICAgIHJldHVybiB0CisKKyMgTGluZSBjb21tZW50CitkZWYgdF9DUFBfQ09NTUVOVDIodCk6CisgICAgcicoLy8uKj8oXG58JCkpJworICAgICMgcmVwbGFjZSB3aXRoICcvbicKKyAgICB0LnR5cGUgPSAnQ1BQX1dTJzsgdC52YWx1ZSA9ICdcbicKKyAgICByZXR1cm4gdAorICAgIAorZGVmIHRfZXJyb3IodCk6CisgICAgdC50eXBlID0gdC52YWx1ZVswXQorICAgIHQudmFsdWUgPSB0LnZhbHVlWzBdCisgICAgdC5sZXhlci5za2lwKDEpCisgICAgcmV0dXJuIHQKKworaW1wb3J0IHJlCitpbXBvcnQgY29weQoraW1wb3J0IHRpbWUKK2ltcG9ydCBvcy5wYXRoCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgdHJpZ3JhcGgoKQorIyAKKyMgR2l2ZW4gYW4gaW5wdXQgc3RyaW5nLCB0aGlzIGZ1bmN0aW9uIHJlcGxhY2VzIGFsbCB0cmlncmFwaCBzZXF1ZW5jZXMuIAorIyBUaGUgZm9sbG93aW5nIG1hcHBpbmcgaXMgdXNlZDoKKyMKKyMgICAgID8/PSAgICAjCisjICAgICA/Py8gICAgXAorIyAgICAgPz8nICAgIF4KKyMgICAgID8/KCAgICBbCisjICAgICA/PykgICAgXQorIyAgICAgPz8hICAgIHwKKyMgICAgID8/PCAgICB7CisjICAgICA/Pz4gICAgfQorIyAgICAgPz8tICAgIH4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworX3RyaWdyYXBoX3BhdCA9IHJlLmNvbXBpbGUocicnJ1w/XD9bPS9cJ1woXClcITw+XC1dJycnKQorX3RyaWdyYXBoX3JlcCA9IHsKKyAgICAnPSc6JyMnLAorICAgICcvJzonXFwnLAorICAgICInIjonXicsCisgICAgJygnOidbJywKKyAgICAnKSc6J10nLAorICAgICchJzonfCcsCisgICAgJzwnOid7JywKKyAgICAnPic6J30nLAorICAgICctJzonficKK30KKworZGVmIHRyaWdyYXBoKGlucHV0KToKKyAgICByZXR1cm4gX3RyaWdyYXBoX3BhdC5zdWIobGFtYmRhIGc6IF90cmlncmFwaF9yZXBbZy5ncm91cCgpWy0xXV0saW5wdXQpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE1hY3JvIG9iamVjdAorIworIyBUaGlzIG9iamVjdCBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCBwcmVwcm9jZXNzb3IgbWFjcm9zCisjCisjICAgIC5uYW1lICAgICAgLSBNYWNybyBuYW1lIChzdHJpbmcpCisjICAgIC52YWx1ZSAgICAgLSBNYWNybyB2YWx1ZSAoYSBsaXN0IG9mIHRva2VucykKKyMgICAgLmFyZ2xpc3QgICAtIExpc3Qgb2YgYXJndW1lbnQgbmFtZXMKKyMgICAgLnZhcmlhZGljICAtIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB2YXJpYWRpYyBtYWNybworIyAgICAudmFyYXJnICAgIC0gTmFtZSBvZiB0aGUgdmFyaWFkaWMgcGFyYW1ldGVyCisjCisjIFdoZW4gYSBtYWNybyBpcyBjcmVhdGVkLCB0aGUgbWFjcm8gcmVwbGFjZW1lbnQgdG9rZW4gc2VxdWVuY2UgaXMKKyMgcHJlLXNjYW5uZWQgYW5kIHVzZWQgdG8gY3JlYXRlIHBhdGNoIGxpc3RzIHRoYXQgYXJlIGxhdGVyIHVzZWQKKyMgZHVyaW5nIG1hY3JvIGV4cGFuc2lvbgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgTWFjcm8ob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZixuYW1lLHZhbHVlLGFyZ2xpc3Q9Tm9uZSx2YXJpYWRpYz1GYWxzZSk6CisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgICAgIHNlbGYuYXJnbGlzdCA9IGFyZ2xpc3QKKyAgICAgICAgc2VsZi52YXJpYWRpYyA9IHZhcmlhZGljCisgICAgICAgIGlmIHZhcmlhZGljOgorICAgICAgICAgICAgc2VsZi52YXJhcmcgPSBhcmdsaXN0Wy0xXQorICAgICAgICBzZWxmLnNvdXJjZSA9IE5vbmUKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJlcHJvY2Vzc29yIG9iamVjdAorIworIyBPYmplY3QgcmVwcmVzZW50aW5nIGEgcHJlcHJvY2Vzc29yLiAgQ29udGFpbnMgbWFjcm8gZGVmaW5pdGlvbnMsCisjIGluY2x1ZGUgZGlyZWN0b3JpZXMsIGFuZCBvdGhlciBpbmZvcm1hdGlvbgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgUHJlcHJvY2Vzc29yKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsbGV4ZXI9Tm9uZSk6CisgICAgICAgIGlmIGxleGVyIGlzIE5vbmU6CisgICAgICAgICAgICBsZXhlciA9IGxleC5sZXhlcgorICAgICAgICBzZWxmLmxleGVyID0gbGV4ZXIKKyAgICAgICAgc2VsZi5tYWNyb3MgPSB7IH0KKyAgICAgICAgc2VsZi5wYXRoID0gW10KKyAgICAgICAgc2VsZi50ZW1wX3BhdGggPSBbXQorCisgICAgICAgICMgUHJvYmUgdGhlIGxleGVyIGZvciBzZWxlY3RlZCB0b2tlbnMKKyAgICAgICAgc2VsZi5sZXhwcm9iZSgpCisKKyAgICAgICAgdG0gPSB0aW1lLmxvY2FsdGltZSgpCisgICAgICAgIHNlbGYuZGVmaW5lKCJfX0RBVEVfXyBcIiVzXCIiICUgdGltZS5zdHJmdGltZSgiJWIgJWQgJVkiLHRtKSkKKyAgICAgICAgc2VsZi5kZWZpbmUoIl9fVElNRV9fIFwiJXNcIiIgJSB0aW1lLnN0cmZ0aW1lKCIlSDolTTolUyIsdG0pKQorICAgICAgICBzZWxmLnBhcnNlciA9IE5vbmUKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIHRva2VuaXplKCkKKyAgICAjCisgICAgIyBVdGlsaXR5IGZ1bmN0aW9uLiBHaXZlbiBhIHN0cmluZyBvZiB0ZXh0LCB0b2tlbml6ZSBpbnRvIGEgbGlzdCBvZiB0b2tlbnMKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgdG9rZW5pemUoc2VsZix0ZXh0KToKKyAgICAgICAgdG9rZW5zID0gW10KKyAgICAgICAgc2VsZi5sZXhlci5pbnB1dCh0ZXh0KQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdG9rID0gc2VsZi5sZXhlci50b2tlbigpCisgICAgICAgICAgICBpZiBub3QgdG9rOiBicmVhaworICAgICAgICAgICAgdG9rZW5zLmFwcGVuZCh0b2spCisgICAgICAgIHJldHVybiB0b2tlbnMKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBlcnJvcigpCisgICAgIworICAgICMgUmVwb3J0IGEgcHJlcHJvY2Vzc29yIGVycm9yL3dhcm5pbmcgb2Ygc29tZSBraW5kCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgZXJyb3Ioc2VsZixmaWxlLGxpbmUsbXNnKToKKyAgICAgICAgcHJpbnQoIiVzOiVkICVzIiAlIChmaWxlLGxpbmUsbXNnKSkKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgbGV4cHJvYmUoKQorICAgICMKKyAgICAjIFRoaXMgbWV0aG9kIHByb2JlcyB0aGUgcHJlcHJvY2Vzc29yIGxleGVyIG9iamVjdCB0byBkaXNjb3ZlcgorICAgICMgdGhlIHRva2VuIHR5cGVzIG9mIHN5bWJvbHMgdGhhdCBhcmUgaW1wb3J0YW50IHRvIHRoZSBwcmVwcm9jZXNzb3IuCisgICAgIyBJZiB0aGlzIHdvcmtzIHJpZ2h0LCB0aGUgcHJlcHJvY2Vzc29yIHdpbGwgc2ltcGx5ICJ3b3JrIgorICAgICMgd2l0aCBhbnkgc3VpdGFibGUgbGV4ZXIgcmVnYXJkbGVzcyBvZiBob3cgdG9rZW5zIGhhdmUgYmVlbiBuYW1lZC4KKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBsZXhwcm9iZShzZWxmKToKKworICAgICAgICAjIERldGVybWluZSB0aGUgdG9rZW4gdHlwZSBmb3IgaWRlbnRpZmllcnMKKyAgICAgICAgc2VsZi5sZXhlci5pbnB1dCgiaWRlbnRpZmllciIpCisgICAgICAgIHRvayA9IHNlbGYubGV4ZXIudG9rZW4oKQorICAgICAgICBpZiBub3QgdG9rIG9yIHRvay52YWx1ZSAhPSAiaWRlbnRpZmllciI6CisgICAgICAgICAgICBwcmludCgiQ291bGRuJ3QgZGV0ZXJtaW5lIGlkZW50aWZpZXIgdHlwZSIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRfSUQgPSB0b2sudHlwZQorCisgICAgICAgICMgRGV0ZXJtaW5lIHRoZSB0b2tlbiB0eXBlIGZvciBpbnRlZ2VycworICAgICAgICBzZWxmLmxleGVyLmlucHV0KCIxMjM0NSIpCisgICAgICAgIHRvayA9IHNlbGYubGV4ZXIudG9rZW4oKQorICAgICAgICBpZiBub3QgdG9rIG9yIGludCh0b2sudmFsdWUpICE9IDEyMzQ1OgorICAgICAgICAgICAgcHJpbnQoIkNvdWxkbid0IGRldGVybWluZSBpbnRlZ2VyIHR5cGUiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50X0lOVEVHRVIgPSB0b2sudHlwZQorICAgICAgICAgICAgc2VsZi50X0lOVEVHRVJfVFlQRSA9IHR5cGUodG9rLnZhbHVlKQorCisgICAgICAgICMgRGV0ZXJtaW5lIHRoZSB0b2tlbiB0eXBlIGZvciBzdHJpbmdzIGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXMKKyAgICAgICAgc2VsZi5sZXhlci5pbnB1dCgiXCJmaWxlbmFtZVwiIikKKyAgICAgICAgdG9rID0gc2VsZi5sZXhlci50b2tlbigpCisgICAgICAgIGlmIG5vdCB0b2sgb3IgdG9rLnZhbHVlICE9ICJcImZpbGVuYW1lXCIiOgorICAgICAgICAgICAgcHJpbnQoIkNvdWxkbid0IGRldGVybWluZSBzdHJpbmcgdHlwZSIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRfU1RSSU5HID0gdG9rLnR5cGUKKworICAgICAgICAjIERldGVybWluZSB0aGUgdG9rZW4gdHlwZSBmb3Igd2hpdGVzcGFjZS0taWYgYW55CisgICAgICAgIHNlbGYubGV4ZXIuaW5wdXQoIiAgIikKKyAgICAgICAgdG9rID0gc2VsZi5sZXhlci50b2tlbigpCisgICAgICAgIGlmIG5vdCB0b2sgb3IgdG9rLnZhbHVlICE9ICIgICI6CisgICAgICAgICAgICBzZWxmLnRfU1BBQ0UgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRfU1BBQ0UgPSB0b2sudHlwZQorCisgICAgICAgICMgRGV0ZXJtaW5lIHRoZSB0b2tlbiB0eXBlIGZvciBuZXdsaW5lcworICAgICAgICBzZWxmLmxleGVyLmlucHV0KCJcbiIpCisgICAgICAgIHRvayA9IHNlbGYubGV4ZXIudG9rZW4oKQorICAgICAgICBpZiBub3QgdG9rIG9yIHRvay52YWx1ZSAhPSAiXG4iOgorICAgICAgICAgICAgc2VsZi50X05FV0xJTkUgPSBOb25lCisgICAgICAgICAgICBwcmludCgiQ291bGRuJ3QgZGV0ZXJtaW5lIHRva2VuIGZvciBuZXdsaW5lcyIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRfTkVXTElORSA9IHRvay50eXBlCisKKyAgICAgICAgc2VsZi50X1dTID0gKHNlbGYudF9TUEFDRSwgc2VsZi50X05FV0xJTkUpCisKKyAgICAgICAgIyBDaGVjayBmb3Igb3RoZXIgY2hhcmFjdGVycyB1c2VkIGJ5IHRoZSBwcmVwcm9jZXNzb3IKKyAgICAgICAgY2hhcnMgPSBbICc8JywnPicsJyMnLCcjIycsJ1xcJywnKCcsJyknLCcsJywnLiddCisgICAgICAgIGZvciBjIGluIGNoYXJzOgorICAgICAgICAgICAgc2VsZi5sZXhlci5pbnB1dChjKQorICAgICAgICAgICAgdG9rID0gc2VsZi5sZXhlci50b2tlbigpCisgICAgICAgICAgICBpZiBub3QgdG9rIG9yIHRvay52YWx1ZSAhPSBjOgorICAgICAgICAgICAgICAgIHByaW50KCJVbmFibGUgdG8gbGV4ICclcycgcmVxdWlyZWQgZm9yIHByZXByb2Nlc3NvciIgJSBjKQorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBhZGRfcGF0aCgpCisgICAgIworICAgICMgQWRkcyBhIHNlYXJjaCBwYXRoIHRvIHRoZSBwcmVwcm9jZXNzb3IuICAKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBhZGRfcGF0aChzZWxmLHBhdGgpOgorICAgICAgICBzZWxmLnBhdGguYXBwZW5kKHBhdGgpCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIGdyb3VwX2xpbmVzKCkKKyAgICAjCisgICAgIyBHaXZlbiBhbiBpbnB1dCBzdHJpbmcsIHRoaXMgZnVuY3Rpb24gc3BsaXRzIGl0IGludG8gbGluZXMuICBUcmFpbGluZyB3aGl0ZXNwYWNlCisgICAgIyBpcyByZW1vdmVkLiAgIEFueSBsaW5lIGVuZGluZyB3aXRoIFwgaXMgZ3JvdXBlZCB3aXRoIHRoZSBuZXh0IGxpbmUuICBUaGlzCisgICAgIyBmdW5jdGlvbiBmb3JtcyB0aGUgbG93ZXN0IGxldmVsIG9mIHRoZSBwcmVwcm9jZXNzb3ItLS1ncm91cGluZyBpbnRvIHRleHQgaW50bworICAgICMgYSBsaW5lLWJ5LWxpbmUgZm9ybWF0LgorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGdyb3VwX2xpbmVzKHNlbGYsaW5wdXQpOgorICAgICAgICBsZXggPSBzZWxmLmxleGVyLmNsb25lKCkKKyAgICAgICAgbGluZXMgPSBbeC5yc3RyaXAoKSBmb3IgeCBpbiBpbnB1dC5zcGxpdGxpbmVzKCldCisgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4obGluZXMpKToKKyAgICAgICAgICAgIGogPSBpKzEKKyAgICAgICAgICAgIHdoaWxlIGxpbmVzW2ldLmVuZHN3aXRoKCdcXCcpIGFuZCAoaiA8IGxlbihsaW5lcykpOgorICAgICAgICAgICAgICAgIGxpbmVzW2ldID0gbGluZXNbaV1bOi0xXStsaW5lc1tqXQorICAgICAgICAgICAgICAgIGxpbmVzW2pdID0gIiIKKyAgICAgICAgICAgICAgICBqICs9IDEKKworICAgICAgICBpbnB1dCA9ICJcbiIuam9pbihsaW5lcykKKyAgICAgICAgbGV4LmlucHV0KGlucHV0KQorICAgICAgICBsZXgubGluZW5vID0gMQorCisgICAgICAgIGN1cnJlbnRfbGluZSA9IFtdCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0b2sgPSBsZXgudG9rZW4oKQorICAgICAgICAgICAgaWYgbm90IHRvazoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgY3VycmVudF9saW5lLmFwcGVuZCh0b2spCisgICAgICAgICAgICBpZiB0b2sudHlwZSBpbiBzZWxmLnRfV1MgYW5kICdcbicgaW4gdG9rLnZhbHVlOgorICAgICAgICAgICAgICAgIHlpZWxkIGN1cnJlbnRfbGluZQorICAgICAgICAgICAgICAgIGN1cnJlbnRfbGluZSA9IFtdCisKKyAgICAgICAgaWYgY3VycmVudF9saW5lOgorICAgICAgICAgICAgeWllbGQgY3VycmVudF9saW5lCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIHRva2Vuc3RyaXAoKQorICAgICMgCisgICAgIyBSZW1vdmUgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlIHRva2VucyBmcm9tIGEgdG9rZW4gbGlzdAorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIHRva2Vuc3RyaXAoc2VsZix0b2tlbnMpOgorICAgICAgICBpID0gMAorICAgICAgICB3aGlsZSBpIDwgbGVuKHRva2VucykgYW5kIHRva2Vuc1tpXS50eXBlIGluIHNlbGYudF9XUzoKKyAgICAgICAgICAgIGkgKz0gMQorICAgICAgICBkZWwgdG9rZW5zWzppXQorICAgICAgICBpID0gbGVuKHRva2VucyktMQorICAgICAgICB3aGlsZSBpID49IDAgYW5kIHRva2Vuc1tpXS50eXBlIGluIHNlbGYudF9XUzoKKyAgICAgICAgICAgIGkgLT0gMQorICAgICAgICBkZWwgdG9rZW5zW2krMTpdCisgICAgICAgIHJldHVybiB0b2tlbnMKKworCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBjb2xsZWN0X2FyZ3MoKQorICAgICMKKyAgICAjIENvbGxlY3RzIGNvbW1hIHNlcGFyYXRlZCBhcmd1bWVudHMgZnJvbSBhIGxpc3Qgb2YgdG9rZW5zLiAgIFRoZSBhcmd1bWVudHMKKyAgICAjIG11c3QgYmUgZW5jbG9zZWQgaW4gcGFyZW50aGVzaXMuICBSZXR1cm5zIGEgdHVwbGUgKHRva2VuY291bnQsYXJncyxwb3NpdGlvbnMpCisgICAgIyB3aGVyZSB0b2tlbmNvdW50IGlzIHRoZSBudW1iZXIgb2YgdG9rZW5zIGNvbnN1bWVkLCBhcmdzIGlzIGEgbGlzdCBvZiBhcmd1bWVudHMsCisgICAgIyBhbmQgcG9zaXRpb25zIGlzIGEgbGlzdCBvZiBpbnRlZ2VycyBjb250YWluaW5nIHRoZSBzdGFydGluZyBpbmRleCBvZiBlYWNoCisgICAgIyBhcmd1bWVudC4gIEVhY2ggYXJndW1lbnQgaXMgcmVwcmVzZW50ZWQgYnkgYSBsaXN0IG9mIHRva2Vucy4KKyAgICAjCisgICAgIyBXaGVuIGNvbGxlY3RpbmcgYXJndW1lbnRzLCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGlzIHJlbW92ZWQKKyAgICAjIGZyb20gZWFjaCBhcmd1bWVudC4gIAorICAgICMKKyAgICAjIFRoaXMgZnVuY3Rpb24gcHJvcGVybHkgaGFuZGxlcyBuZXN0ZWQgcGFyZW50aGVzaXMgYW5kIGNvbW1hcy0tLXRoZXNlIGRvIG5vdAorICAgICMgZGVmaW5lIG5ldyBhcmd1bWVudHMuCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgY29sbGVjdF9hcmdzKHNlbGYsdG9rZW5saXN0KToKKyAgICAgICAgYXJncyA9IFtdCisgICAgICAgIHBvc2l0aW9ucyA9IFtdCisgICAgICAgIGN1cnJlbnRfYXJnID0gW10KKyAgICAgICAgbmVzdGluZyA9IDEKKyAgICAgICAgdG9rZW5sZW4gPSBsZW4odG9rZW5saXN0KQorICAgIAorICAgICAgICAjIFNlYXJjaCBmb3IgdGhlIG9wZW5pbmcgJygnLgorICAgICAgICBpID0gMAorICAgICAgICB3aGlsZSAoaSA8IHRva2VubGVuKSBhbmQgKHRva2VubGlzdFtpXS50eXBlIGluIHNlbGYudF9XUyk6CisgICAgICAgICAgICBpICs9IDEKKworICAgICAgICBpZiAoaSA8IHRva2VubGVuKSBhbmQgKHRva2VubGlzdFtpXS52YWx1ZSA9PSAnKCcpOgorICAgICAgICAgICAgcG9zaXRpb25zLmFwcGVuZChpKzEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmVycm9yKHNlbGYuc291cmNlLHRva2VubGlzdFswXS5saW5lbm8sIk1pc3NpbmcgJygnIGluIG1hY3JvIGFyZ3VtZW50cyIpCisgICAgICAgICAgICByZXR1cm4gMCwgW10sIFtdCisKKyAgICAgICAgaSArPSAxCisKKyAgICAgICAgd2hpbGUgaSA8IHRva2VubGVuOgorICAgICAgICAgICAgdCA9IHRva2VubGlzdFtpXQorICAgICAgICAgICAgaWYgdC52YWx1ZSA9PSAnKCc6CisgICAgICAgICAgICAgICAgY3VycmVudF9hcmcuYXBwZW5kKHQpCisgICAgICAgICAgICAgICAgbmVzdGluZyArPSAxCisgICAgICAgICAgICBlbGlmIHQudmFsdWUgPT0gJyknOgorICAgICAgICAgICAgICAgIG5lc3RpbmcgLT0gMQorICAgICAgICAgICAgICAgIGlmIG5lc3RpbmcgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgaWYgY3VycmVudF9hcmc6CisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmFwcGVuZChzZWxmLnRva2Vuc3RyaXAoY3VycmVudF9hcmcpKQorICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25zLmFwcGVuZChpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSsxLGFyZ3MscG9zaXRpb25zCisgICAgICAgICAgICAgICAgY3VycmVudF9hcmcuYXBwZW5kKHQpCisgICAgICAgICAgICBlbGlmIHQudmFsdWUgPT0gJywnIGFuZCBuZXN0aW5nID09IDE6CisgICAgICAgICAgICAgICAgYXJncy5hcHBlbmQoc2VsZi50b2tlbnN0cmlwKGN1cnJlbnRfYXJnKSkKKyAgICAgICAgICAgICAgICBwb3NpdGlvbnMuYXBwZW5kKGkrMSkKKyAgICAgICAgICAgICAgICBjdXJyZW50X2FyZyA9IFtdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGN1cnJlbnRfYXJnLmFwcGVuZCh0KQorICAgICAgICAgICAgaSArPSAxCisgICAgCisgICAgICAgICMgTWlzc2luZyBlbmQgYXJndW1lbnQKKyAgICAgICAgc2VsZi5lcnJvcihzZWxmLnNvdXJjZSx0b2tlbmxpc3RbLTFdLmxpbmVubywiTWlzc2luZyAnKScgaW4gbWFjcm8gYXJndW1lbnRzIikKKyAgICAgICAgcmV0dXJuIDAsIFtdLFtdCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIG1hY3JvX3ByZXNjYW4oKQorICAgICMKKyAgICAjIEV4YW1pbmUgdGhlIG1hY3JvIHZhbHVlICh0b2tlbiBzZXF1ZW5jZSkgYW5kIGlkZW50aWZ5IHBhdGNoIHBvaW50cworICAgICMgVGhpcyBpcyB1c2VkIHRvIHNwZWVkIHVwIG1hY3JvIGV4cGFuc2lvbiBsYXRlciBvbi0tLXdlJ2xsIGtub3cKKyAgICAjIHJpZ2h0IGF3YXkgd2hlcmUgdG8gYXBwbHkgcGF0Y2hlcyB0byB0aGUgdmFsdWUgdG8gZm9ybSB0aGUgZXhwYW5zaW9uCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgCisgICAgZGVmIG1hY3JvX3ByZXNjYW4oc2VsZixtYWNybyk6CisgICAgICAgIG1hY3JvLnBhdGNoICAgICA9IFtdICAgICAgICAgICAgICMgU3RhbmRhcmQgbWFjcm8gYXJndW1lbnRzIAorICAgICAgICBtYWNyby5zdHJfcGF0Y2ggPSBbXSAgICAgICAgICAgICAjIFN0cmluZyBjb252ZXJzaW9uIGV4cGFuc2lvbgorICAgICAgICBtYWNyby52YXJfY29tbWFfcGF0Y2ggPSBbXSAgICAgICAjIFZhcmlhZGljIG1hY3JvIGNvbW1hIHBhdGNoCisgICAgICAgIGkgPSAwCisgICAgICAgIHdoaWxlIGkgPCBsZW4obWFjcm8udmFsdWUpOgorICAgICAgICAgICAgaWYgbWFjcm8udmFsdWVbaV0udHlwZSA9PSBzZWxmLnRfSUQgYW5kIG1hY3JvLnZhbHVlW2ldLnZhbHVlIGluIG1hY3JvLmFyZ2xpc3Q6CisgICAgICAgICAgICAgICAgYXJnbnVtID0gbWFjcm8uYXJnbGlzdC5pbmRleChtYWNyby52YWx1ZVtpXS52YWx1ZSkKKyAgICAgICAgICAgICAgICAjIENvbnZlcnNpb24gb2YgYXJndW1lbnQgdG8gYSBzdHJpbmcKKyAgICAgICAgICAgICAgICBpZiBpID4gMCBhbmQgbWFjcm8udmFsdWVbaS0xXS52YWx1ZSA9PSAnIyc6CisgICAgICAgICAgICAgICAgICAgIG1hY3JvLnZhbHVlW2ldID0gY29weS5jb3B5KG1hY3JvLnZhbHVlW2ldKQorICAgICAgICAgICAgICAgICAgICBtYWNyby52YWx1ZVtpXS50eXBlID0gc2VsZi50X1NUUklORworICAgICAgICAgICAgICAgICAgICBkZWwgbWFjcm8udmFsdWVbaS0xXQorICAgICAgICAgICAgICAgICAgICBtYWNyby5zdHJfcGF0Y2guYXBwZW5kKChhcmdudW0saS0xKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAjIENvbmNhdGVuYXRpb24KKyAgICAgICAgICAgICAgICBlbGlmIChpID4gMCBhbmQgbWFjcm8udmFsdWVbaS0xXS52YWx1ZSA9PSAnIyMnKToKKyAgICAgICAgICAgICAgICAgICAgbWFjcm8ucGF0Y2guYXBwZW5kKCgnYycsYXJnbnVtLGktMSkpCisgICAgICAgICAgICAgICAgICAgIGRlbCBtYWNyby52YWx1ZVtpLTFdCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZWxpZiAoKGkrMSkgPCBsZW4obWFjcm8udmFsdWUpIGFuZCBtYWNyby52YWx1ZVtpKzFdLnZhbHVlID09ICcjIycpOgorICAgICAgICAgICAgICAgICAgICBtYWNyby5wYXRjaC5hcHBlbmQoKCdjJyxhcmdudW0saSkpCisgICAgICAgICAgICAgICAgICAgIGkgKz0gMQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICMgU3RhbmRhcmQgZXhwYW5zaW9uCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbWFjcm8ucGF0Y2guYXBwZW5kKCgnZScsYXJnbnVtLGkpKQorICAgICAgICAgICAgZWxpZiBtYWNyby52YWx1ZVtpXS52YWx1ZSA9PSAnIyMnOgorICAgICAgICAgICAgICAgIGlmIG1hY3JvLnZhcmlhZGljIGFuZCAoaSA+IDApIGFuZCAobWFjcm8udmFsdWVbaS0xXS52YWx1ZSA9PSAnLCcpIGFuZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAoKGkrMSkgPCBsZW4obWFjcm8udmFsdWUpKSBhbmQgKG1hY3JvLnZhbHVlW2krMV0udHlwZSA9PSBzZWxmLnRfSUQpIGFuZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAobWFjcm8udmFsdWVbaSsxXS52YWx1ZSA9PSBtYWNyby52YXJhcmcpOgorICAgICAgICAgICAgICAgICAgICBtYWNyby52YXJfY29tbWFfcGF0Y2guYXBwZW5kKGktMSkKKyAgICAgICAgICAgIGkgKz0gMQorICAgICAgICBtYWNyby5wYXRjaC5zb3J0KGtleT1sYW1iZGEgeDogeFsyXSxyZXZlcnNlPVRydWUpCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIG1hY3JvX2V4cGFuZF9hcmdzKCkKKyAgICAjCisgICAgIyBHaXZlbiBhIE1hY3JvIGFuZCBsaXN0IG9mIGFyZ3VtZW50cyAoZWFjaCBhIHRva2VuIGxpc3QpLCB0aGlzIG1ldGhvZAorICAgICMgcmV0dXJucyBhbiBleHBhbmRlZCB2ZXJzaW9uIG9mIGEgbWFjcm8uICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgdG9rZW4gc2VxdWVuY2UKKyAgICAjIHJlcHJlc2VudGluZyB0aGUgcmVwbGFjZW1lbnQgbWFjcm8gdG9rZW5zCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgbWFjcm9fZXhwYW5kX2FyZ3Moc2VsZixtYWNybyxhcmdzKToKKyAgICAgICAgIyBNYWtlIGEgY29weSBvZiB0aGUgbWFjcm8gdG9rZW4gc2VxdWVuY2UKKyAgICAgICAgcmVwID0gW2NvcHkuY29weShfeCkgZm9yIF94IGluIG1hY3JvLnZhbHVlXQorCisgICAgICAgICMgTWFrZSBzdHJpbmcgZXhwYW5zaW9uIHBhdGNoZXMuICBUaGVzZSBkbyBub3QgYWx0ZXIgdGhlIGxlbmd0aCBvZiB0aGUgcmVwbGFjZW1lbnQgc2VxdWVuY2UKKyAgICAgICAgCisgICAgICAgIHN0cl9leHBhbnNpb24gPSB7fQorICAgICAgICBmb3IgYXJnbnVtLCBpIGluIG1hY3JvLnN0cl9wYXRjaDoKKyAgICAgICAgICAgIGlmIGFyZ251bSBub3QgaW4gc3RyX2V4cGFuc2lvbjoKKyAgICAgICAgICAgICAgICBzdHJfZXhwYW5zaW9uW2FyZ251bV0gPSAoJyIlcyInICUgIiIuam9pbihbeC52YWx1ZSBmb3IgeCBpbiBhcmdzW2FyZ251bV1dKSkucmVwbGFjZSgiXFwiLCJcXFxcIikKKyAgICAgICAgICAgIHJlcFtpXSA9IGNvcHkuY29weShyZXBbaV0pCisgICAgICAgICAgICByZXBbaV0udmFsdWUgPSBzdHJfZXhwYW5zaW9uW2FyZ251bV0KKworICAgICAgICAjIE1ha2UgdGhlIHZhcmlhZGljIG1hY3JvIGNvbW1hIHBhdGNoLiAgSWYgdGhlIHZhcmlhZGljIG1hY3JvIGFyZ3VtZW50IGlzIGVtcHR5LCB3ZSBnZXQgcmlkCisgICAgICAgIGNvbW1hX3BhdGNoID0gRmFsc2UKKyAgICAgICAgaWYgbWFjcm8udmFyaWFkaWMgYW5kIG5vdCBhcmdzWy0xXToKKyAgICAgICAgICAgIGZvciBpIGluIG1hY3JvLnZhcl9jb21tYV9wYXRjaDoKKyAgICAgICAgICAgICAgICByZXBbaV0gPSBOb25lCisgICAgICAgICAgICAgICAgY29tbWFfcGF0Y2ggPSBUcnVlCisKKyAgICAgICAgIyBNYWtlIGFsbCBvdGhlciBwYXRjaGVzLiAgIFRoZSBvcmRlciBvZiB0aGVzZSBtYXR0ZXJzLiAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBwYXRjaCBsaXN0CisgICAgICAgICMgaGFzIGJlZW4gc29ydGVkIGluIHJldmVyc2Ugb3JkZXIgb2YgcGF0Y2ggbG9jYXRpb24gc2luY2UgcmVwbGFjZW1lbnRzIHdpbGwgY2F1c2UgdGhlCisgICAgICAgICMgc2l6ZSBvZiB0aGUgcmVwbGFjZW1lbnQgc2VxdWVuY2UgdG8gZXhwYW5kIGZyb20gdGhlIHBhdGNoIHBvaW50LgorICAgICAgICAKKyAgICAgICAgZXhwYW5kZWQgPSB7IH0KKyAgICAgICAgZm9yIHB0eXBlLCBhcmdudW0sIGkgaW4gbWFjcm8ucGF0Y2g6CisgICAgICAgICAgICAjIENvbmNhdGVuYXRpb24uICAgQXJndW1lbnQgaXMgbGVmdCB1bmV4cGFuZGVkCisgICAgICAgICAgICBpZiBwdHlwZSA9PSAnYyc6CisgICAgICAgICAgICAgICAgcmVwW2k6aSsxXSA9IGFyZ3NbYXJnbnVtXQorICAgICAgICAgICAgIyBOb3JtYWwgZXhwYW5zaW9uLiAgQXJndW1lbnQgaXMgbWFjcm8gZXhwYW5kZWQgZmlyc3QKKyAgICAgICAgICAgIGVsaWYgcHR5cGUgPT0gJ2UnOgorICAgICAgICAgICAgICAgIGlmIGFyZ251bSBub3QgaW4gZXhwYW5kZWQ6CisgICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkW2FyZ251bV0gPSBzZWxmLmV4cGFuZF9tYWNyb3MoYXJnc1thcmdudW1dKQorICAgICAgICAgICAgICAgIHJlcFtpOmkrMV0gPSBleHBhbmRlZFthcmdudW1dCisKKyAgICAgICAgIyBHZXQgcmlkIG9mIHJlbW92ZWQgY29tbWEgaWYgbmVjZXNzYXJ5CisgICAgICAgIGlmIGNvbW1hX3BhdGNoOgorICAgICAgICAgICAgcmVwID0gW19pIGZvciBfaSBpbiByZXAgaWYgX2ldCisKKyAgICAgICAgcmV0dXJuIHJlcAorCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIGV4cGFuZF9tYWNyb3MoKQorICAgICMKKyAgICAjIEdpdmVuIGEgbGlzdCBvZiB0b2tlbnMsIHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgbWFjcm8gZXhwYW5zaW9uLgorICAgICMgVGhlIGV4cGFuZGVkIGFyZ3VtZW50IGlzIGEgZGljdGlvbmFyeSB0aGF0IGNvbnRhaW5zIG1hY3JvcyBhbHJlYWR5CisgICAgIyBleHBhbmRlZC4gIFRoaXMgaXMgdXNlZCB0byBwcmV2ZW50IGluZmluaXRlIHJlY3Vyc2lvbi4KKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBleHBhbmRfbWFjcm9zKHNlbGYsdG9rZW5zLGV4cGFuZGVkPU5vbmUpOgorICAgICAgICBpZiBleHBhbmRlZCBpcyBOb25lOgorICAgICAgICAgICAgZXhwYW5kZWQgPSB7fQorICAgICAgICBpID0gMAorICAgICAgICB3aGlsZSBpIDwgbGVuKHRva2Vucyk6CisgICAgICAgICAgICB0ID0gdG9rZW5zW2ldCisgICAgICAgICAgICBpZiB0LnR5cGUgPT0gc2VsZi50X0lEOgorICAgICAgICAgICAgICAgIGlmIHQudmFsdWUgaW4gc2VsZi5tYWNyb3MgYW5kIHQudmFsdWUgbm90IGluIGV4cGFuZGVkOgorICAgICAgICAgICAgICAgICAgICAjIFllcywgd2UgZm91bmQgYSBtYWNybyBtYXRjaAorICAgICAgICAgICAgICAgICAgICBleHBhbmRlZFt0LnZhbHVlXSA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIG0gPSBzZWxmLm1hY3Jvc1t0LnZhbHVlXQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgbS5hcmdsaXN0OgorICAgICAgICAgICAgICAgICAgICAgICAgIyBBIHNpbXBsZSBtYWNybworICAgICAgICAgICAgICAgICAgICAgICAgZXggPSBzZWxmLmV4cGFuZF9tYWNyb3MoW2NvcHkuY29weShfeCkgZm9yIF94IGluIG0udmFsdWVdLGV4cGFuZGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGUgaW4gZXg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5saW5lbm8gPSB0LmxpbmVubworICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zW2k6aSsxXSA9IGV4CisgICAgICAgICAgICAgICAgICAgICAgICBpICs9IGxlbihleCkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgQSBtYWNybyB3aXRoIGFyZ3VtZW50cworICAgICAgICAgICAgICAgICAgICAgICAgaiA9IGkgKyAxCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBqIDwgbGVuKHRva2VucykgYW5kIHRva2Vuc1tqXS50eXBlIGluIHNlbGYudF9XUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICs9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRva2Vuc1tqXS52YWx1ZSA9PSAnKCc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rY291bnQsYXJncyxwb3NpdGlvbnMgPSBzZWxmLmNvbGxlY3RfYXJncyh0b2tlbnNbajpdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBtLnZhcmlhZGljIGFuZCBsZW4oYXJncykgIT0gIGxlbihtLmFyZ2xpc3QpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yKHNlbGYuc291cmNlLHQubGluZW5vLCJNYWNybyAlcyByZXF1aXJlcyAlZCBhcmd1bWVudHMiICUgKHQudmFsdWUsbGVuKG0uYXJnbGlzdCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gaiArIHRva2NvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBtLnZhcmlhZGljIGFuZCBsZW4oYXJncykgPCBsZW4obS5hcmdsaXN0KS0xOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBsZW4obS5hcmdsaXN0KSA+IDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yKHNlbGYuc291cmNlLHQubGluZW5vLCJNYWNybyAlcyBtdXN0IGhhdmUgYXQgbGVhc3QgJWQgYXJndW1lbnRzIiAlICh0LnZhbHVlLCBsZW4obS5hcmdsaXN0KS0xKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3Ioc2VsZi5zb3VyY2UsdC5saW5lbm8sIk1hY3JvICVzIG11c3QgaGF2ZSBhdCBsZWFzdCAlZCBhcmd1bWVudCIgJSAodC52YWx1ZSwgbGVuKG0uYXJnbGlzdCktMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBqICsgdG9rY291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBtLnZhcmlhZGljOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGFyZ3MpID09IGxlbihtLmFyZ2xpc3QpLTE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5hcHBlbmQoW10pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbbGVuKG0uYXJnbGlzdCktMV0gPSB0b2tlbnNbaitwb3NpdGlvbnNbbGVuKG0uYXJnbGlzdCktMV06ait0b2tjb3VudC0xXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBhcmdzW2xlbihtLmFyZ2xpc3QpOl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBHZXQgbWFjcm8gcmVwbGFjZW1lbnQgdGV4dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAgPSBzZWxmLm1hY3JvX2V4cGFuZF9hcmdzKG0sYXJncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwID0gc2VsZi5leHBhbmRfbWFjcm9zKHJlcCxleHBhbmRlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHIgaW4gcmVwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5saW5lbm8gPSB0LmxpbmVubworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnNbaTpqK3Rva2NvdW50XSA9IHJlcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IGxlbihyZXApCisgICAgICAgICAgICAgICAgICAgIGRlbCBleHBhbmRlZFt0LnZhbHVlXQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGVsaWYgdC52YWx1ZSA9PSAnX19MSU5FX18nOgorICAgICAgICAgICAgICAgICAgICB0LnR5cGUgPSBzZWxmLnRfSU5URUdFUgorICAgICAgICAgICAgICAgICAgICB0LnZhbHVlID0gc2VsZi50X0lOVEVHRVJfVFlQRSh0LmxpbmVubykKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGkgKz0gMQorICAgICAgICByZXR1cm4gdG9rZW5zCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgCisgICAgIyBldmFsZXhwcigpCisgICAgIyAKKyAgICAjIEV2YWx1YXRlIGFuIGV4cHJlc3Npb24gdG9rZW4gc2VxdWVuY2UgZm9yIHRoZSBwdXJwb3NlcyBvZiBldmFsdWF0aW5nCisgICAgIyBpbnRlZ3JhbCBleHByZXNzaW9ucy4KKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBldmFsZXhwcihzZWxmLHRva2Vucyk6CisgICAgICAgICMgdG9rZW5zID0gdG9rZW5pemUobGluZSkKKyAgICAgICAgIyBTZWFyY2ggZm9yIGRlZmluZWQgbWFjcm9zCisgICAgICAgIGkgPSAwCisgICAgICAgIHdoaWxlIGkgPCBsZW4odG9rZW5zKToKKyAgICAgICAgICAgIGlmIHRva2Vuc1tpXS50eXBlID09IHNlbGYudF9JRCBhbmQgdG9rZW5zW2ldLnZhbHVlID09ICdkZWZpbmVkJzoKKyAgICAgICAgICAgICAgICBqID0gaSArIDEKKyAgICAgICAgICAgICAgICBuZWVkcGFyZW4gPSBGYWxzZQorICAgICAgICAgICAgICAgIHJlc3VsdCA9ICIwTCIKKyAgICAgICAgICAgICAgICB3aGlsZSBqIDwgbGVuKHRva2Vucyk6CisgICAgICAgICAgICAgICAgICAgIGlmIHRva2Vuc1tqXS50eXBlIGluIHNlbGYudF9XUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gMQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgZWxpZiB0b2tlbnNbal0udHlwZSA9PSBzZWxmLnRfSUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0b2tlbnNbal0udmFsdWUgaW4gc2VsZi5tYWNyb3M6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gIjFMIgorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAiMEwiCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgbmVlZHBhcmVuOiBicmVhaworICAgICAgICAgICAgICAgICAgICBlbGlmIHRva2Vuc1tqXS52YWx1ZSA9PSAnKCc6CisgICAgICAgICAgICAgICAgICAgICAgICBuZWVkcGFyZW4gPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGVsaWYgdG9rZW5zW2pdLnZhbHVlID09ICcpJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yKHNlbGYuc291cmNlLHRva2Vuc1tpXS5saW5lbm8sIk1hbGZvcm1lZCBkZWZpbmVkKCkiKQorICAgICAgICAgICAgICAgICAgICBqICs9IDEKKyAgICAgICAgICAgICAgICB0b2tlbnNbaV0udHlwZSA9IHNlbGYudF9JTlRFR0VSCisgICAgICAgICAgICAgICAgdG9rZW5zW2ldLnZhbHVlID0gc2VsZi50X0lOVEVHRVJfVFlQRShyZXN1bHQpCisgICAgICAgICAgICAgICAgZGVsIHRva2Vuc1tpKzE6aisxXQorICAgICAgICAgICAgaSArPSAxCisgICAgICAgIHRva2VucyA9IHNlbGYuZXhwYW5kX21hY3Jvcyh0b2tlbnMpCisgICAgICAgIGZvciBpLHQgaW4gZW51bWVyYXRlKHRva2Vucyk6CisgICAgICAgICAgICBpZiB0LnR5cGUgPT0gc2VsZi50X0lEOgorICAgICAgICAgICAgICAgIHRva2Vuc1tpXSA9IGNvcHkuY29weSh0KQorICAgICAgICAgICAgICAgIHRva2Vuc1tpXS50eXBlID0gc2VsZi50X0lOVEVHRVIKKyAgICAgICAgICAgICAgICB0b2tlbnNbaV0udmFsdWUgPSBzZWxmLnRfSU5URUdFUl9UWVBFKCIwTCIpCisgICAgICAgICAgICBlbGlmIHQudHlwZSA9PSBzZWxmLnRfSU5URUdFUjoKKyAgICAgICAgICAgICAgICB0b2tlbnNbaV0gPSBjb3B5LmNvcHkodCkKKyAgICAgICAgICAgICAgICAjIFN0cmlwIG9mZiBhbnkgdHJhaWxpbmcgc3VmZml4ZXMKKyAgICAgICAgICAgICAgICB0b2tlbnNbaV0udmFsdWUgPSBzdHIodG9rZW5zW2ldLnZhbHVlKQorICAgICAgICAgICAgICAgIHdoaWxlIHRva2Vuc1tpXS52YWx1ZVstMV0gbm90IGluICIwMTIzNDU2Nzg5YWJjZGVmQUJDREVGIjoKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5zW2ldLnZhbHVlID0gdG9rZW5zW2ldLnZhbHVlWzotMV0KKyAgICAgICAgCisgICAgICAgIGV4cHIgPSAiIi5qb2luKFtzdHIoeC52YWx1ZSkgZm9yIHggaW4gdG9rZW5zXSkKKyAgICAgICAgZXhwciA9IGV4cHIucmVwbGFjZSgiJiYiLCIgYW5kICIpCisgICAgICAgIGV4cHIgPSBleHByLnJlcGxhY2UoInx8IiwiIG9yICIpCisgICAgICAgIGV4cHIgPSBleHByLnJlcGxhY2UoIiEiLCIgbm90ICIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3VsdCA9IGV2YWwoZXhwcikKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHNlbGYuZXJyb3Ioc2VsZi5zb3VyY2UsdG9rZW5zWzBdLmxpbmVubywiQ291bGRuJ3QgZXZhbHVhdGUgZXhwcmVzc2lvbiIpCisgICAgICAgICAgICByZXN1bHQgPSAwCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgcGFyc2VnZW4oKQorICAgICMKKyAgICAjIFBhcnNlIGFuIGlucHV0IHN0cmluZy8KKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBkZWYgcGFyc2VnZW4oc2VsZixpbnB1dCxzb3VyY2U9Tm9uZSk6CisKKyAgICAgICAgIyBSZXBsYWNlIHRyaWdyYXBoIHNlcXVlbmNlcworICAgICAgICB0ID0gdHJpZ3JhcGgoaW5wdXQpCisgICAgICAgIGxpbmVzID0gc2VsZi5ncm91cF9saW5lcyh0KQorCisgICAgICAgIGlmIG5vdCBzb3VyY2U6CisgICAgICAgICAgICBzb3VyY2UgPSAiIgorICAgICAgICAgICAgCisgICAgICAgIHNlbGYuZGVmaW5lKCJfX0ZJTEVfXyBcIiVzXCIiICUgc291cmNlKQorCisgICAgICAgIHNlbGYuc291cmNlID0gc291cmNlCisgICAgICAgIGNodW5rID0gW10KKyAgICAgICAgZW5hYmxlID0gVHJ1ZQorICAgICAgICBpZnRyaWdnZXIgPSBGYWxzZQorICAgICAgICBpZnN0YWNrID0gW10KKworICAgICAgICBmb3IgeCBpbiBsaW5lczoKKyAgICAgICAgICAgIGZvciBpLHRvayBpbiBlbnVtZXJhdGUoeCk6CisgICAgICAgICAgICAgICAgaWYgdG9rLnR5cGUgbm90IGluIHNlbGYudF9XUzogYnJlYWsKKyAgICAgICAgICAgIGlmIHRvay52YWx1ZSA9PSAnIyc6CisgICAgICAgICAgICAgICAgIyBQcmVwcm9jZXNzb3IgZGlyZWN0aXZlCisKKyAgICAgICAgICAgICAgICAjIGluc2VydCBuZWNlc3Nhcnkgd2hpdGVzcGFjZSBpbnN0ZWFkIG9mIGVhdGVuIHRva2VucworICAgICAgICAgICAgICAgIGZvciB0b2sgaW4geDoKKyAgICAgICAgICAgICAgICAgICAgaWYgdG9rLnR5cGUgaW4gc2VsZi50X1dTIGFuZCAnXG4nIGluIHRvay52YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rLmFwcGVuZCh0b2spCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZGlydG9rZW5zID0gc2VsZi50b2tlbnN0cmlwKHhbaSsxOl0pCisgICAgICAgICAgICAgICAgaWYgZGlydG9rZW5zOgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gZGlydG9rZW5zWzBdLnZhbHVlCisgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBzZWxmLnRva2Vuc3RyaXAoZGlydG9rZW5zWzE6XSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gIiIKKyAgICAgICAgICAgICAgICAgICAgYXJncyA9IFtdCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgbmFtZSA9PSAnZGVmaW5lJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgZW5hYmxlOgorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRvayBpbiBzZWxmLmV4cGFuZF9tYWNyb3MoY2h1bmspOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHRvaworICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmsgPSBbXQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kZWZpbmUoYXJncykKKyAgICAgICAgICAgICAgICBlbGlmIG5hbWUgPT0gJ2luY2x1ZGUnOgorICAgICAgICAgICAgICAgICAgICBpZiBlbmFibGU6CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdG9rIGluIHNlbGYuZXhwYW5kX21hY3JvcyhjaHVuayk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgdG9rCisgICAgICAgICAgICAgICAgICAgICAgICBjaHVuayA9IFtdCisgICAgICAgICAgICAgICAgICAgICAgICBvbGRmaWxlID0gc2VsZi5tYWNyb3NbJ19fRklMRV9fJ10KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0b2sgaW4gc2VsZi5pbmNsdWRlKGFyZ3MpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHRvaworICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYWNyb3NbJ19fRklMRV9fJ10gPSBvbGRmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNvdXJjZSA9IHNvdXJjZQorICAgICAgICAgICAgICAgIGVsaWYgbmFtZSA9PSAndW5kZWYnOgorICAgICAgICAgICAgICAgICAgICBpZiBlbmFibGU6CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdG9rIGluIHNlbGYuZXhwYW5kX21hY3JvcyhjaHVuayk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgdG9rCisgICAgICAgICAgICAgICAgICAgICAgICBjaHVuayA9IFtdCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnVuZGVmKGFyZ3MpCisgICAgICAgICAgICAgICAgZWxpZiBuYW1lID09ICdpZmRlZic6CisgICAgICAgICAgICAgICAgICAgIGlmc3RhY2suYXBwZW5kKChlbmFibGUsaWZ0cmlnZ2VyKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgZW5hYmxlOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGFyZ3NbMF0udmFsdWUgaW4gc2VsZi5tYWNyb3M6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZnRyaWdnZXIgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZnRyaWdnZXIgPSBUcnVlCisgICAgICAgICAgICAgICAgZWxpZiBuYW1lID09ICdpZm5kZWYnOgorICAgICAgICAgICAgICAgICAgICBpZnN0YWNrLmFwcGVuZCgoZW5hYmxlLGlmdHJpZ2dlcikpCisgICAgICAgICAgICAgICAgICAgIGlmIGVuYWJsZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGFyZ3NbMF0udmFsdWUgaW4gc2VsZi5tYWNyb3M6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZnRyaWdnZXIgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZnRyaWdnZXIgPSBUcnVlCisgICAgICAgICAgICAgICAgZWxpZiBuYW1lID09ICdpZic6CisgICAgICAgICAgICAgICAgICAgIGlmc3RhY2suYXBwZW5kKChlbmFibGUsaWZ0cmlnZ2VyKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgZW5hYmxlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5ldmFsZXhwcihhcmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJlc3VsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmdHJpZ2dlciA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmdHJpZ2dlciA9IFRydWUKKyAgICAgICAgICAgICAgICBlbGlmIG5hbWUgPT0gJ2VsaWYnOgorICAgICAgICAgICAgICAgICAgICBpZiBpZnN0YWNrOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgaWZzdGFja1stMV1bMF06ICAgICAjIFdlIG9ubHkgcGF5IGF0dGVudGlvbiBpZiBvdXRlciAiaWYiIGFsbG93cyB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZW5hYmxlOiAgICAgICAgICMgSWYgYWxyZWFkeSB0cnVlLCB3ZSBmbGlwIGVuYWJsZSBGYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgbm90IGlmdHJpZ2dlcjogICAjIElmIEZhbHNlLCBidXQgbm90IHRyaWdnZXJlZCB5ZXQsIHdlJ2xsIGNoZWNrIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5ldmFsZXhwcihhcmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiByZXN1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUgID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZ0cmlnZ2VyID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcihzZWxmLnNvdXJjZSxkaXJ0b2tlbnNbMF0ubGluZW5vLCJNaXNwbGFjZWQgI2VsaWYiKQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZWxpZiBuYW1lID09ICdlbHNlJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgaWZzdGFjazoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGlmc3RhY2tbLTFdWzBdOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVuYWJsZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIG5vdCBpZnRyaWdnZXI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZSA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZ0cmlnZ2VyID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcihzZWxmLnNvdXJjZSxkaXJ0b2tlbnNbMF0ubGluZW5vLCJNaXNwbGFjZWQgI2Vsc2UiKQorCisgICAgICAgICAgICAgICAgZWxpZiBuYW1lID09ICdlbmRpZic6CisgICAgICAgICAgICAgICAgICAgIGlmIGlmc3RhY2s6CisgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUsaWZ0cmlnZ2VyID0gaWZzdGFjay5wb3AoKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcihzZWxmLnNvdXJjZSxkaXJ0b2tlbnNbMF0ubGluZW5vLCJNaXNwbGFjZWQgI2VuZGlmIikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIFVua25vd24gcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZQorICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBOb3JtYWwgdGV4dAorICAgICAgICAgICAgICAgIGlmIGVuYWJsZToKKyAgICAgICAgICAgICAgICAgICAgY2h1bmsuZXh0ZW5kKHgpCisKKyAgICAgICAgZm9yIHRvayBpbiBzZWxmLmV4cGFuZF9tYWNyb3MoY2h1bmspOgorICAgICAgICAgICAgeWllbGQgdG9rCisgICAgICAgIGNodW5rID0gW10KKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgaW5jbHVkZSgpCisgICAgIworICAgICMgSW1wbGVtZW50YXRpb24gb2YgZmlsZS1pbmNsdXNpb24KKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBpbmNsdWRlKHNlbGYsdG9rZW5zKToKKyAgICAgICAgIyBUcnkgdG8gZXh0cmFjdCB0aGUgZmlsZW5hbWUgYW5kIHRoZW4gcHJvY2VzcyBhbiBpbmNsdWRlIGZpbGUKKyAgICAgICAgaWYgbm90IHRva2VuczoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiB0b2tlbnM6CisgICAgICAgICAgICBpZiB0b2tlbnNbMF0udmFsdWUgIT0gJzwnIGFuZCB0b2tlbnNbMF0udHlwZSAhPSBzZWxmLnRfU1RSSU5HOgorICAgICAgICAgICAgICAgIHRva2VucyA9IHNlbGYuZXhwYW5kX21hY3Jvcyh0b2tlbnMpCisKKyAgICAgICAgICAgIGlmIHRva2Vuc1swXS52YWx1ZSA9PSAnPCc6CisgICAgICAgICAgICAgICAgIyBJbmNsdWRlIDwuLi4+CisgICAgICAgICAgICAgICAgaSA9IDEKKyAgICAgICAgICAgICAgICB3aGlsZSBpIDwgbGVuKHRva2Vucyk6CisgICAgICAgICAgICAgICAgICAgIGlmIHRva2Vuc1tpXS52YWx1ZSA9PSAnPic6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBpICs9IDEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwcmludCgiTWFsZm9ybWVkICNpbmNsdWRlIDwuLi4+IikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSAiIi5qb2luKFt4LnZhbHVlIGZvciB4IGluIHRva2Vuc1sxOmldXSkKKyAgICAgICAgICAgICAgICBwYXRoID0gc2VsZi5wYXRoICsgWyIiXSArIHNlbGYudGVtcF9wYXRoCisgICAgICAgICAgICBlbGlmIHRva2Vuc1swXS50eXBlID09IHNlbGYudF9TVFJJTkc6CisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSB0b2tlbnNbMF0udmFsdWVbMTotMV0KKyAgICAgICAgICAgICAgICBwYXRoID0gc2VsZi50ZW1wX3BhdGggKyBbIiJdICsgc2VsZi5wYXRoCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50KCJNYWxmb3JtZWQgI2luY2x1ZGUgc3RhdGVtZW50IikKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZm9yIHAgaW4gcGF0aDoKKyAgICAgICAgICAgIGluYW1lID0gb3MucGF0aC5qb2luKHAsZmlsZW5hbWUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGF0YSA9IG9wZW4oaW5hbWUsInIiKS5yZWFkKCkKKyAgICAgICAgICAgICAgICBkbmFtZSA9IG9zLnBhdGguZGlybmFtZShpbmFtZSkKKyAgICAgICAgICAgICAgICBpZiBkbmFtZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50ZW1wX3BhdGguaW5zZXJ0KDAsZG5hbWUpCisgICAgICAgICAgICAgICAgZm9yIHRvayBpbiBzZWxmLnBhcnNlZ2VuKGRhdGEsZmlsZW5hbWUpOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCB0b2sKKyAgICAgICAgICAgICAgICBpZiBkbmFtZToKKyAgICAgICAgICAgICAgICAgICAgZGVsIHNlbGYudGVtcF9wYXRoWzBdCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50KCJDb3VsZG4ndCBmaW5kICclcyciICUgZmlsZW5hbWUpCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIGRlZmluZSgpCisgICAgIworICAgICMgRGVmaW5lIGEgbmV3IG1hY3JvCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgZGVmaW5lKHNlbGYsdG9rZW5zKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh0b2tlbnMsU1RSSU5HX1RZUEVTKToKKyAgICAgICAgICAgIHRva2VucyA9IHNlbGYudG9rZW5pemUodG9rZW5zKQorCisgICAgICAgIGxpbmV0b2sgPSB0b2tlbnMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmFtZSA9IGxpbmV0b2tbMF0KKyAgICAgICAgICAgIGlmIGxlbihsaW5ldG9rKSA+IDE6CisgICAgICAgICAgICAgICAgbXR5cGUgPSBsaW5ldG9rWzFdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG10eXBlID0gTm9uZQorICAgICAgICAgICAgaWYgbm90IG10eXBlOgorICAgICAgICAgICAgICAgIG0gPSBNYWNybyhuYW1lLnZhbHVlLFtdKQorICAgICAgICAgICAgICAgIHNlbGYubWFjcm9zW25hbWUudmFsdWVdID0gbQorICAgICAgICAgICAgZWxpZiBtdHlwZS50eXBlIGluIHNlbGYudF9XUzoKKyAgICAgICAgICAgICAgICAjIEEgbm9ybWFsIG1hY3JvCisgICAgICAgICAgICAgICAgbSA9IE1hY3JvKG5hbWUudmFsdWUsc2VsZi50b2tlbnN0cmlwKGxpbmV0b2tbMjpdKSkKKyAgICAgICAgICAgICAgICBzZWxmLm1hY3Jvc1tuYW1lLnZhbHVlXSA9IG0KKyAgICAgICAgICAgIGVsaWYgbXR5cGUudmFsdWUgPT0gJygnOgorICAgICAgICAgICAgICAgICMgQSBtYWNybyB3aXRoIGFyZ3VtZW50cworICAgICAgICAgICAgICAgIHRva2NvdW50LCBhcmdzLCBwb3NpdGlvbnMgPSBzZWxmLmNvbGxlY3RfYXJncyhsaW5ldG9rWzE6XSkKKyAgICAgICAgICAgICAgICB2YXJpYWRpYyA9IEZhbHNlCisgICAgICAgICAgICAgICAgZm9yIGEgaW4gYXJnczoKKyAgICAgICAgICAgICAgICAgICAgaWYgdmFyaWFkaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCgiTm8gbW9yZSBhcmd1bWVudHMgbWF5IGZvbGxvdyBhIHZhcmlhZGljIGFyZ3VtZW50IikKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGFzdHIgPSAiIi5qb2luKFtzdHIoX2kudmFsdWUpIGZvciBfaSBpbiBhXSkKKyAgICAgICAgICAgICAgICAgICAgaWYgYXN0ciA9PSAiLi4uIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhZGljID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgYVswXS50eXBlID0gc2VsZi50X0lECisgICAgICAgICAgICAgICAgICAgICAgICBhWzBdLnZhbHVlID0gJ19fVkFfQVJHU19fJworICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFkaWMgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICBkZWwgYVsxOl0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGVsaWYgYXN0clstMzpdID09ICIuLi4iIGFuZCBhWzBdLnR5cGUgPT0gc2VsZi50X0lEOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFkaWMgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICBkZWwgYVsxOl0KKyAgICAgICAgICAgICAgICAgICAgICAgICMgSWYsIGZvciBzb21lIHJlYXNvbiwgIi4iIGlzIHBhcnQgb2YgdGhlIGlkZW50aWZpZXIsIHN0cmlwIG9mZiB0aGUgbmFtZSBmb3IgdGhlIHB1cnBvc2VzCisgICAgICAgICAgICAgICAgICAgICAgICAjIG9mIG1hY3JvIGV4cGFuc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgYVswXS52YWx1ZVstMzpdID09ICcuLi4nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbMF0udmFsdWUgPSBhWzBdLnZhbHVlWzotM10KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGlmIGxlbihhKSA+IDEgb3IgYVswXS50eXBlICE9IHNlbGYudF9JRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCJJbnZhbGlkIG1hY3JvIGFyZ3VtZW50IikKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbXZhbHVlID0gc2VsZi50b2tlbnN0cmlwKGxpbmV0b2tbMSt0b2tjb3VudDpdKQorICAgICAgICAgICAgICAgICAgICBpID0gMAorICAgICAgICAgICAgICAgICAgICB3aGlsZSBpIDwgbGVuKG12YWx1ZSk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBpKzEgPCBsZW4obXZhbHVlKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBtdmFsdWVbaV0udHlwZSBpbiBzZWxmLnRfV1MgYW5kIG12YWx1ZVtpKzFdLnZhbHVlID09ICcjIyc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBtdmFsdWVbaV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIG12YWx1ZVtpXS52YWx1ZSA9PSAnIyMnIGFuZCBtdmFsdWVbaSsxXS50eXBlIGluIHNlbGYudF9XUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsIG12YWx1ZVtpKzFdCisgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDEKKyAgICAgICAgICAgICAgICAgICAgbSA9IE1hY3JvKG5hbWUudmFsdWUsbXZhbHVlLFt4WzBdLnZhbHVlIGZvciB4IGluIGFyZ3NdLHZhcmlhZGljKQorICAgICAgICAgICAgICAgICAgICBzZWxmLm1hY3JvX3ByZXNjYW4obSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5tYWNyb3NbbmFtZS52YWx1ZV0gPSBtCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50KCJCYWQgbWFjcm8gZGVmaW5pdGlvbiIpCisgICAgICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICAgICAgICAgIHByaW50KCJCYWQgbWFjcm8gZGVmaW5pdGlvbiIpCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIHVuZGVmKCkKKyAgICAjCisgICAgIyBVbmRlZmluZSBhIG1hY3JvCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgdW5kZWYoc2VsZix0b2tlbnMpOgorICAgICAgICBpZCA9IHRva2Vuc1swXS52YWx1ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgc2VsZi5tYWNyb3NbaWRdCisgICAgICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgcGFyc2UoKQorICAgICMKKyAgICAjIFBhcnNlIGlucHV0IHRleHQuCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgZGVmIHBhcnNlKHNlbGYsaW5wdXQsc291cmNlPU5vbmUsaWdub3JlPXt9KToKKyAgICAgICAgc2VsZi5pZ25vcmUgPSBpZ25vcmUKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBzZWxmLnBhcnNlZ2VuKGlucHV0LHNvdXJjZSkKKyAgICAgICAgCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyB0b2tlbigpCisgICAgIworICAgICMgTWV0aG9kIHRvIHJldHVybiBpbmRpdmlkdWFsIHRva2VucworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGRlZiB0b2tlbihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICB0b2sgPSBuZXh0KHNlbGYucGFyc2VyKQorICAgICAgICAgICAgICAgIGlmIHRvay50eXBlIG5vdCBpbiBzZWxmLmlnbm9yZTogcmV0dXJuIHRvaworICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIHNlbGYucGFyc2VyID0gTm9uZQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpbXBvcnQgcGx5LmxleCBhcyBsZXgKKyAgICBsZXhlciA9IGxleC5sZXgoKQorCisgICAgIyBSdW4gYSBwcmVwcm9jZXNzb3IKKyAgICBpbXBvcnQgc3lzCisgICAgZiA9IG9wZW4oc3lzLmFyZ3ZbMV0pCisgICAgaW5wdXQgPSBmLnJlYWQoKQorCisgICAgcCA9IFByZXByb2Nlc3NvcihsZXhlcikKKyAgICBwLnBhcnNlKGlucHV0LHN5cy5hcmd2WzFdKQorICAgIHdoaWxlIFRydWU6CisgICAgICAgIHRvayA9IHAudG9rZW4oKQorICAgICAgICBpZiBub3QgdG9rOiBicmVhaworICAgICAgICBwcmludChwLnNvdXJjZSwgdG9rKQorCisKKworCisgICAgCisKKworCisKKworCmRpZmYgLS1naXQgYS9wbHkvcGx5L2N0b2tlbnMucHkgYi9wbHkvcGx5L2N0b2tlbnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZmNjk1MgotLS0gL2Rldi9udWxsCisrKyBiL3BseS9wbHkvY3Rva2Vucy5weQpAQCAtMCwwICsxLDEzMyBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGN0b2tlbnMucHkKKyMKKyMgVG9rZW4gc3BlY2lmaWNhdGlvbnMgZm9yIHN5bWJvbHMgaW4gQU5TSSBDIGFuZCBDKysuICBUaGlzIGZpbGUgaXMKKyMgbWVhbnQgdG8gYmUgdXNlZCBhcyBhIGxpYnJhcnkgaW4gb3RoZXIgdG9rZW5pemVycy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFJlc2VydmVkIHdvcmRzCisKK3Rva2VucyA9IFsKKyAgICAjIExpdGVyYWxzIChpZGVudGlmaWVyLCBpbnRlZ2VyIGNvbnN0YW50LCBmbG9hdCBjb25zdGFudCwgc3RyaW5nIGNvbnN0YW50LCBjaGFyIGNvbnN0KQorICAgICdJRCcsICdUWVBFSUQnLCAnSU5URUdFUicsICdGTE9BVCcsICdTVFJJTkcnLCAnQ0hBUkFDVEVSJywKKworICAgICMgT3BlcmF0b3JzICgrLC0sKiwvLCUsfCwmLH4sXiw8PCw+PiwgfHwsICYmLCAhLCA8LCA8PSwgPiwgPj0sID09LCAhPSkKKyAgICAnUExVUycsICdNSU5VUycsICdUSU1FUycsICdESVZJREUnLCAnTU9EVUxPJywKKyAgICAnT1InLCAnQU5EJywgJ05PVCcsICdYT1InLCAnTFNISUZUJywgJ1JTSElGVCcsCisgICAgJ0xPUicsICdMQU5EJywgJ0xOT1QnLAorICAgICdMVCcsICdMRScsICdHVCcsICdHRScsICdFUScsICdORScsCisgICAgCisgICAgIyBBc3NpZ25tZW50ICg9LCAqPSwgLz0sICU9LCArPSwgLT0sIDw8PSwgPj49LCAmPSwgXj0sIHw9KQorICAgICdFUVVBTFMnLCAnVElNRVNFUVVBTCcsICdESVZFUVVBTCcsICdNT0RFUVVBTCcsICdQTFVTRVFVQUwnLCAnTUlOVVNFUVVBTCcsCisgICAgJ0xTSElGVEVRVUFMJywnUlNISUZURVFVQUwnLCAnQU5ERVFVQUwnLCAnWE9SRVFVQUwnLCAnT1JFUVVBTCcsCisKKyAgICAjIEluY3JlbWVudC9kZWNyZW1lbnQgKCsrLC0tKQorICAgICdJTkNSRU1FTlQnLCAnREVDUkVNRU5UJywKKworICAgICMgU3RydWN0dXJlIGRlcmVmZXJlbmNlICgtPikKKyAgICAnQVJST1cnLAorCisgICAgIyBUZXJuYXJ5IG9wZXJhdG9yICg/KQorICAgICdURVJOQVJZJywKKyAgICAKKyAgICAjIERlbGltZXRlcnMgKCApIFsgXSB7IH0gLCAuIDsgOgorICAgICdMUEFSRU4nLCAnUlBBUkVOJywKKyAgICAnTEJSQUNLRVQnLCAnUkJSQUNLRVQnLAorICAgICdMQlJBQ0UnLCAnUkJSQUNFJywKKyAgICAnQ09NTUEnLCAnUEVSSU9EJywgJ1NFTUknLCAnQ09MT04nLAorCisgICAgIyBFbGxpcHNpcyAoLi4uKQorICAgICdFTExJUFNJUycsCitdCisgICAgCisjIE9wZXJhdG9ycwordF9QTFVTICAgICAgICAgICAgID0gcidcKycKK3RfTUlOVVMgICAgICAgICAgICA9IHInLScKK3RfVElNRVMgICAgICAgICAgICA9IHInXConCit0X0RJVklERSAgICAgICAgICAgPSByJy8nCit0X01PRFVMTyAgICAgICAgICAgPSByJyUnCit0X09SICAgICAgICAgICAgICAgPSByJ1x8JwordF9BTkQgICAgICAgICAgICAgID0gcicmJwordF9OT1QgICAgICAgICAgICAgID0gcid+JwordF9YT1IgICAgICAgICAgICAgID0gcidcXicKK3RfTFNISUZUICAgICAgICAgICA9IHInPDwnCit0X1JTSElGVCAgICAgICAgICAgPSByJz4+JwordF9MT1IgICAgICAgICAgICAgID0gcidcfFx8JwordF9MQU5EICAgICAgICAgICAgID0gcicmJicKK3RfTE5PVCAgICAgICAgICAgICA9IHInIScKK3RfTFQgICAgICAgICAgICAgICA9IHInPCcKK3RfR1QgICAgICAgICAgICAgICA9IHInPicKK3RfTEUgICAgICAgICAgICAgICA9IHInPD0nCit0X0dFICAgICAgICAgICAgICAgPSByJz49JwordF9FUSAgICAgICAgICAgICAgID0gcic9PScKK3RfTkUgICAgICAgICAgICAgICA9IHInIT0nCisKKyMgQXNzaWdubWVudCBvcGVyYXRvcnMKKwordF9FUVVBTFMgICAgICAgICAgID0gcic9JwordF9USU1FU0VRVUFMICAgICAgID0gcidcKj0nCit0X0RJVkVRVUFMICAgICAgICAgPSByJy89JwordF9NT0RFUVVBTCAgICAgICAgID0gciclPScKK3RfUExVU0VRVUFMICAgICAgICA9IHInXCs9JwordF9NSU5VU0VRVUFMICAgICAgID0gcictPScKK3RfTFNISUZURVFVQUwgICAgICA9IHInPDw9JwordF9SU0hJRlRFUVVBTCAgICAgID0gcic+Pj0nCit0X0FOREVRVUFMICAgICAgICAgPSByJyY9JwordF9PUkVRVUFMICAgICAgICAgID0gcidcfD0nCit0X1hPUkVRVUFMICAgICAgICAgPSByJ1xePScKKworIyBJbmNyZW1lbnQvZGVjcmVtZW50Cit0X0lOQ1JFTUVOVCAgICAgICAgPSByJ1wrXCsnCit0X0RFQ1JFTUVOVCAgICAgICAgPSByJy0tJworCisjIC0+Cit0X0FSUk9XICAgICAgICAgICAgPSByJy0+JworCisjID8KK3RfVEVSTkFSWSAgICAgICAgICA9IHInXD8nCisKKyMgRGVsaW1ldGVycwordF9MUEFSRU4gICAgICAgICAgID0gcidcKCcKK3RfUlBBUkVOICAgICAgICAgICA9IHInXCknCit0X0xCUkFDS0VUICAgICAgICAgPSByJ1xbJwordF9SQlJBQ0tFVCAgICAgICAgID0gcidcXScKK3RfTEJSQUNFICAgICAgICAgICA9IHInXHsnCit0X1JCUkFDRSAgICAgICAgICAgPSByJ1x9JwordF9DT01NQSAgICAgICAgICAgID0gcicsJwordF9QRVJJT0QgICAgICAgICAgID0gcidcLicKK3RfU0VNSSAgICAgICAgICAgICA9IHInOycKK3RfQ09MT04gICAgICAgICAgICA9IHInOicKK3RfRUxMSVBTSVMgICAgICAgICA9IHInXC5cLlwuJworCisjIElkZW50aWZpZXJzCit0X0lEID0gcidbQS1aYS16X11bQS1aYS16MC05X10qJworCisjIEludGVnZXIgbGl0ZXJhbAordF9JTlRFR0VSID0gcidcZCsoW3VVXXxbbExdfFt1VV1bbExdfFtsTF1bdVVdKT8nCisKKyMgRmxvYXRpbmcgbGl0ZXJhbAordF9GTE9BVCA9IHInKChcZCspKFwuXGQrKShlKFwrfC0pPyhcZCspKT8gfCAoXGQrKWUoXCt8LSk/KFxkKykpKFtsTF18W2ZGXSk/JworCisjIFN0cmluZyBsaXRlcmFsCit0X1NUUklORyA9IHInXCIoW15cXFxuXXwoXFwuKSkqP1wiJworCisjIENoYXJhY3RlciBjb25zdGFudCAnYycgb3IgTCdjJwordF9DSEFSQUNURVIgPSByJyhMKT9cJyhbXlxcXG5dfChcXC4pKSo/XCcnCisKKyMgQ29tbWVudCAoQy1TdHlsZSkKK2RlZiB0X0NPTU1FTlQodCk6CisgICAgcicvXCooLnxcbikqP1wqLycKKyAgICB0LmxleGVyLmxpbmVubyArPSB0LnZhbHVlLmNvdW50KCdcbicpCisgICAgcmV0dXJuIHQKKworIyBDb21tZW50IChDKystU3R5bGUpCitkZWYgdF9DUFBDT01NRU5UKHQpOgorICAgIHInLy8uKlxuJworICAgIHQubGV4ZXIubGluZW5vICs9IDEKKyAgICByZXR1cm4gdAorCisKKyAgICAKKworCisKZGlmZiAtLWdpdCBhL3BseS9wbHkvbGV4LnB5IGIvcGx5L3BseS9sZXgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UyNDBkMQotLS0gL2Rldi9udWxsCisrKyBiL3BseS9wbHkvbGV4LnB5CkBAIC0wLDAgKzEsMTEwMCBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBwbHk6IGxleC5weQorIworIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNworIyBEYXZpZCBNLiBCZWF6bGV5IChEYWJlYXogTExDKQorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorIyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorIyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyMgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBEYXZpZCBCZWF6bGV5IG9yIERhYmVheiBMTEMgbWF5IGJlIHVzZWQgdG8KKyMgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorIyAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK19fdmVyc2lvbl9fICAgID0gJzMuMTAnCitfX3RhYnZlcnNpb25fXyA9ICczLjEwJworCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCB0eXBlcworaW1wb3J0IGNvcHkKK2ltcG9ydCBvcworaW1wb3J0IGluc3BlY3QKKworIyBUaGlzIHR1cGxlIGNvbnRhaW5zIGtub3duIHN0cmluZyB0eXBlcwordHJ5OgorICAgICMgUHl0aG9uIDIuNgorICAgIFN0cmluZ1R5cGVzID0gKHR5cGVzLlN0cmluZ1R5cGUsIHR5cGVzLlVuaWNvZGVUeXBlKQorZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICMgUHl0aG9uIDMuMAorICAgIFN0cmluZ1R5cGVzID0gKHN0ciwgYnl0ZXMpCisKKyMgVGhpcyByZWd1bGFyIGV4cHJlc3Npb24gaXMgdXNlZCB0byBtYXRjaCB2YWxpZCB0b2tlbiBuYW1lcworX2lzX2lkZW50aWZpZXIgPSByZS5jb21waWxlKHInXlthLXpBLVowLTlfXSskJykKKworIyBFeGNlcHRpb24gdGhyb3duIHdoZW4gaW52YWxpZCB0b2tlbiBlbmNvdW50ZXJlZCBhbmQgbm8gZGVmYXVsdCBlcnJvcgorIyBoYW5kbGVyIGlzIGRlZmluZWQuCitjbGFzcyBMZXhFcnJvcihFeGNlcHRpb24pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlLCBzKToKKyAgICAgICAgc2VsZi5hcmdzID0gKG1lc3NhZ2UsKQorICAgICAgICBzZWxmLnRleHQgPSBzCisKKworIyBUb2tlbiBjbGFzcy4gIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIHRva2VucyBwcm9kdWNlZC4KK2NsYXNzIExleFRva2VuKG9iamVjdCk6CisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAnTGV4VG9rZW4oJXMsJXIsJWQsJWQpJyAlIChzZWxmLnR5cGUsIHNlbGYudmFsdWUsIHNlbGYubGluZW5vLCBzZWxmLmxleHBvcykKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHN0cihzZWxmKQorCisKKyMgVGhpcyBvYmplY3QgaXMgYSBzdGFuZC1pbiBmb3IgYSBsb2dnaW5nIG9iamVjdCBjcmVhdGVkIGJ5IHRoZQorIyBsb2dnaW5nIG1vZHVsZS4KKworY2xhc3MgUGx5TG9nZ2VyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGYpOgorICAgICAgICBzZWxmLmYgPSBmCisKKyAgICBkZWYgY3JpdGljYWwoc2VsZiwgbXNnLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBzZWxmLmYud3JpdGUoKG1zZyAlIGFyZ3MpICsgJ1xuJykKKworICAgIGRlZiB3YXJuaW5nKHNlbGYsIG1zZywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5mLndyaXRlKCdXQVJOSU5HOiAnICsgKG1zZyAlIGFyZ3MpICsgJ1xuJykKKworICAgIGRlZiBlcnJvcihzZWxmLCBtc2csICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuZi53cml0ZSgnRVJST1I6ICcgKyAobXNnICUgYXJncykgKyAnXG4nKQorCisgICAgaW5mbyA9IGNyaXRpY2FsCisgICAgZGVidWcgPSBjcml0aWNhbAorCisKKyMgTnVsbCBsb2dnZXIgaXMgdXNlZCB3aGVuIG5vIG91dHB1dCBpcyBnZW5lcmF0ZWQuIERvZXMgbm90aGluZy4KK2NsYXNzIE51bGxMb2dnZXIob2JqZWN0KToKKyAgICBkZWYgX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZgorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgICAgICAgICAgICAgICAgICAgICAgICA9PT0gTGV4aW5nIEVuZ2luZSA9PT0KKyMKKyMgVGhlIGZvbGxvd2luZyBMZXhlciBjbGFzcyBpbXBsZW1lbnRzIHRoZSBsZXhlciBydW50aW1lLiAgIFRoZXJlIGFyZSBvbmx5CisjIGEgZmV3IHB1YmxpYyBtZXRob2RzIGFuZCBhdHRyaWJ1dGVzOgorIworIyAgICBpbnB1dCgpICAgICAgICAgIC0gIFN0b3JlIGEgbmV3IHN0cmluZyBpbiB0aGUgbGV4ZXIKKyMgICAgdG9rZW4oKSAgICAgICAgICAtICBHZXQgdGhlIG5leHQgdG9rZW4KKyMgICAgY2xvbmUoKSAgICAgICAgICAtICBDbG9uZSB0aGUgbGV4ZXIKKyMKKyMgICAgbGluZW5vICAgICAgICAgICAtICBDdXJyZW50IGxpbmUgbnVtYmVyCisjICAgIGxleHBvcyAgICAgICAgICAgLSAgQ3VycmVudCBwb3NpdGlvbiBpbiB0aGUgaW5wdXQgc3RyaW5nCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIExleGVyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5sZXhyZSA9IE5vbmUgICAgICAgICAgICAgIyBNYXN0ZXIgcmVndWxhciBleHByZXNzaW9uLiBUaGlzIGlzIGEgbGlzdCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHR1cGxlcyAocmUsIGZpbmRleCkgd2hlcmUgcmUgaXMgYSBjb21waWxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgZmluZGV4IGlzIGEgbGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1hcHBpbmcgcmVnZXggZ3JvdXAgbnVtYmVycyB0byBydWxlcworICAgICAgICBzZWxmLmxleHJldGV4dCA9IE5vbmUgICAgICAgICAjIEN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uIHN0cmluZ3MKKyAgICAgICAgc2VsZi5sZXhzdGF0ZXJlID0ge30gICAgICAgICAgIyBEaWN0aW9uYXJ5IG1hcHBpbmcgbGV4ZXIgc3RhdGVzIHRvIG1hc3RlciByZWdleHMKKyAgICAgICAgc2VsZi5sZXhzdGF0ZXJldGV4dCA9IHt9ICAgICAgIyBEaWN0aW9uYXJ5IG1hcHBpbmcgbGV4ZXIgc3RhdGVzIHRvIHJlZ2V4IHN0cmluZ3MKKyAgICAgICAgc2VsZi5sZXhzdGF0ZXJlbmFtZXMgPSB7fSAgICAgIyBEaWN0aW9uYXJ5IG1hcHBpbmcgbGV4ZXIgc3RhdGVzIHRvIHN5bWJvbCBuYW1lcworICAgICAgICBzZWxmLmxleHN0YXRlID0gJ0lOSVRJQUwnICAgICAjIEN1cnJlbnQgbGV4ZXIgc3RhdGUKKyAgICAgICAgc2VsZi5sZXhzdGF0ZXN0YWNrID0gW10gICAgICAgIyBTdGFjayBvZiBsZXhlciBzdGF0ZXMKKyAgICAgICAgc2VsZi5sZXhzdGF0ZWluZm8gPSBOb25lICAgICAgIyBTdGF0ZSBpbmZvcm1hdGlvbgorICAgICAgICBzZWxmLmxleHN0YXRlaWdub3JlID0ge30gICAgICAjIERpY3Rpb25hcnkgb2YgaWdub3JlZCBjaGFyYWN0ZXJzIGZvciBlYWNoIHN0YXRlCisgICAgICAgIHNlbGYubGV4c3RhdGVlcnJvcmYgPSB7fSAgICAgICMgRGljdGlvbmFyeSBvZiBlcnJvciBmdW5jdGlvbnMgZm9yIGVhY2ggc3RhdGUKKyAgICAgICAgc2VsZi5sZXhzdGF0ZWVvZmYgPSB7fSAgICAgICAgIyBEaWN0aW9uYXJ5IG9mIGVvZiBmdW5jdGlvbnMgZm9yIGVhY2ggc3RhdGUKKyAgICAgICAgc2VsZi5sZXhyZWZsYWdzID0gMCAgICAgICAgICAgIyBPcHRpb25hbCByZSBjb21waWxlIGZsYWdzCisgICAgICAgIHNlbGYubGV4ZGF0YSA9IE5vbmUgICAgICAgICAgICMgQWN0dWFsIGlucHV0IGRhdGEgKGFzIGEgc3RyaW5nKQorICAgICAgICBzZWxmLmxleHBvcyA9IDAgICAgICAgICAgICAgICAjIEN1cnJlbnQgcG9zaXRpb24gaW4gaW5wdXQgdGV4dAorICAgICAgICBzZWxmLmxleGxlbiA9IDAgICAgICAgICAgICAgICAjIExlbmd0aCBvZiB0aGUgaW5wdXQgdGV4dAorICAgICAgICBzZWxmLmxleGVycm9yZiA9IE5vbmUgICAgICAgICAjIEVycm9yIHJ1bGUgKGlmIGFueSkKKyAgICAgICAgc2VsZi5sZXhlb2ZmID0gTm9uZSAgICAgICAgICAgIyBFT0YgcnVsZSAoaWYgYW55KQorICAgICAgICBzZWxmLmxleHRva2VucyA9IE5vbmUgICAgICAgICAjIExpc3Qgb2YgdmFsaWQgdG9rZW5zCisgICAgICAgIHNlbGYubGV4aWdub3JlID0gJycgICAgICAgICAgICMgSWdub3JlZCBjaGFyYWN0ZXJzCisgICAgICAgIHNlbGYubGV4bGl0ZXJhbHMgPSAnJyAgICAgICAgICMgTGl0ZXJhbCBjaGFyYWN0ZXJzIHRoYXQgY2FuIGJlIHBhc3NlZCB0aHJvdWdoCisgICAgICAgIHNlbGYubGV4bW9kdWxlID0gTm9uZSAgICAgICAgICMgTW9kdWxlCisgICAgICAgIHNlbGYubGluZW5vID0gMSAgICAgICAgICAgICAgICMgQ3VycmVudCBsaW5lIG51bWJlcgorICAgICAgICBzZWxmLmxleG9wdGltaXplID0gRmFsc2UgICAgICAjIE9wdGltaXplZCBtb2RlCisKKyAgICBkZWYgY2xvbmUoc2VsZiwgb2JqZWN0PU5vbmUpOgorICAgICAgICBjID0gY29weS5jb3B5KHNlbGYpCisKKyAgICAgICAgIyBJZiB0aGUgb2JqZWN0IHBhcmFtZXRlciBoYXMgYmVlbiBzdXBwbGllZCwgaXQgbWVhbnMgd2UgYXJlIGF0dGFjaGluZyB0aGUKKyAgICAgICAgIyBsZXhlciB0byBhIG5ldyBvYmplY3QuICBJbiB0aGlzIGNhc2UsIHdlIGhhdmUgdG8gcmViaW5kIGFsbCBtZXRob2RzIGluCisgICAgICAgICMgdGhlIGxleHN0YXRlcmUgYW5kIGxleHN0YXRlZXJyb3JmIHRhYmxlcy4KKworICAgICAgICBpZiBvYmplY3Q6CisgICAgICAgICAgICBuZXd0YWIgPSB7fQorICAgICAgICAgICAgZm9yIGtleSwgcml0ZW0gaW4gc2VsZi5sZXhzdGF0ZXJlLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgbmV3cmUgPSBbXQorICAgICAgICAgICAgICAgIGZvciBjcmUsIGZpbmRleCBpbiByaXRlbToKKyAgICAgICAgICAgICAgICAgICAgbmV3ZmluZGV4ID0gW10KKyAgICAgICAgICAgICAgICAgICAgZm9yIGYgaW4gZmluZGV4OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGYgb3Igbm90IGZbMF06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3ZmluZGV4LmFwcGVuZChmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdmaW5kZXguYXBwZW5kKChnZXRhdHRyKG9iamVjdCwgZlswXS5fX25hbWVfXyksIGZbMV0pKQorICAgICAgICAgICAgICAgIG5ld3JlLmFwcGVuZCgoY3JlLCBuZXdmaW5kZXgpKQorICAgICAgICAgICAgICAgIG5ld3RhYltrZXldID0gbmV3cmUKKyAgICAgICAgICAgIGMubGV4c3RhdGVyZSA9IG5ld3RhYgorICAgICAgICAgICAgYy5sZXhzdGF0ZWVycm9yZiA9IHt9CisgICAgICAgICAgICBmb3Iga2V5LCBlZiBpbiBzZWxmLmxleHN0YXRlZXJyb3JmLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgYy5sZXhzdGF0ZWVycm9yZltrZXldID0gZ2V0YXR0cihvYmplY3QsIGVmLl9fbmFtZV9fKQorICAgICAgICAgICAgYy5sZXhtb2R1bGUgPSBvYmplY3QKKyAgICAgICAgcmV0dXJuIGMKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyB3cml0ZXRhYigpIC0gV3JpdGUgbGV4ZXIgaW5mb3JtYXRpb24gdG8gYSB0YWJsZSBmaWxlCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBkZWYgd3JpdGV0YWIoc2VsZiwgbGV4dGFiLCBvdXRwdXRkaXI9JycpOgorICAgICAgICBpZiBpc2luc3RhbmNlKGxleHRhYiwgdHlwZXMuTW9kdWxlVHlwZSk6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJXb24ndCBvdmVyd3JpdGUgZXhpc3RpbmcgbGV4dGFiIG1vZHVsZSIpCisgICAgICAgIGJhc2V0YWJtb2R1bGUgPSBsZXh0YWIuc3BsaXQoJy4nKVstMV0KKyAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4ob3V0cHV0ZGlyLCBiYXNldGFibW9kdWxlKSArICcucHknCisgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3cnKSBhcyB0ZjoKKyAgICAgICAgICAgIHRmLndyaXRlKCcjICVzLnB5LiBUaGlzIGZpbGUgYXV0b21hdGljYWxseSBjcmVhdGVkIGJ5IFBMWSAodmVyc2lvbiAlcykuIERvblwndCBlZGl0IVxuJyAlIChiYXNldGFibW9kdWxlLCBfX3ZlcnNpb25fXykpCisgICAgICAgICAgICB0Zi53cml0ZSgnX3RhYnZlcnNpb24gICA9ICVzXG4nICUgcmVwcihfX3RhYnZlcnNpb25fXykpCisgICAgICAgICAgICB0Zi53cml0ZSgnX2xleHRva2VucyAgICA9IHNldCglcylcbicgJSByZXByKHR1cGxlKHNlbGYubGV4dG9rZW5zKSkpCisgICAgICAgICAgICB0Zi53cml0ZSgnX2xleHJlZmxhZ3MgICA9ICVzXG4nICUgcmVwcihzZWxmLmxleHJlZmxhZ3MpKQorICAgICAgICAgICAgdGYud3JpdGUoJ19sZXhsaXRlcmFscyAgPSAlc1xuJyAlIHJlcHIoc2VsZi5sZXhsaXRlcmFscykpCisgICAgICAgICAgICB0Zi53cml0ZSgnX2xleHN0YXRlaW5mbyA9ICVzXG4nICUgcmVwcihzZWxmLmxleHN0YXRlaW5mbykpCisKKyAgICAgICAgICAgICMgUmV3cml0ZSB0aGUgbGV4c3RhdGVyZSB0YWJsZSwgcmVwbGFjaW5nIGZ1bmN0aW9uIG9iamVjdHMgd2l0aCBmdW5jdGlvbiBuYW1lcyAKKyAgICAgICAgICAgIHRhYnJlID0ge30KKyAgICAgICAgICAgIGZvciBzdGF0ZW5hbWUsIGxyZSBpbiBzZWxmLmxleHN0YXRlcmUuaXRlbXMoKToKKyAgICAgICAgICAgICAgICB0aXRlbSA9IFtdCisgICAgICAgICAgICAgICAgZm9yIChwYXQsIGZ1bmMpLCByZXRleHQsIHJlbmFtZXMgaW4gemlwKGxyZSwgc2VsZi5sZXhzdGF0ZXJldGV4dFtzdGF0ZW5hbWVdLCBzZWxmLmxleHN0YXRlcmVuYW1lc1tzdGF0ZW5hbWVdKToKKyAgICAgICAgICAgICAgICAgICAgdGl0ZW0uYXBwZW5kKChyZXRleHQsIF9mdW5jc190b19uYW1lcyhmdW5jLCByZW5hbWVzKSkpCisgICAgICAgICAgICAgICAgdGFicmVbc3RhdGVuYW1lXSA9IHRpdGVtCisKKyAgICAgICAgICAgIHRmLndyaXRlKCdfbGV4c3RhdGVyZSAgID0gJXNcbicgJSByZXByKHRhYnJlKSkKKyAgICAgICAgICAgIHRmLndyaXRlKCdfbGV4c3RhdGVpZ25vcmUgPSAlc1xuJyAlIHJlcHIoc2VsZi5sZXhzdGF0ZWlnbm9yZSkpCisKKyAgICAgICAgICAgIHRhYmVyciA9IHt9CisgICAgICAgICAgICBmb3Igc3RhdGVuYW1lLCBlZiBpbiBzZWxmLmxleHN0YXRlZXJyb3JmLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgdGFiZXJyW3N0YXRlbmFtZV0gPSBlZi5fX25hbWVfXyBpZiBlZiBlbHNlIE5vbmUKKyAgICAgICAgICAgIHRmLndyaXRlKCdfbGV4c3RhdGVlcnJvcmYgPSAlc1xuJyAlIHJlcHIodGFiZXJyKSkKKworICAgICAgICAgICAgdGFiZW9mID0ge30KKyAgICAgICAgICAgIGZvciBzdGF0ZW5hbWUsIGVmIGluIHNlbGYubGV4c3RhdGVlb2ZmLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgdGFiZW9mW3N0YXRlbmFtZV0gPSBlZi5fX25hbWVfXyBpZiBlZiBlbHNlIE5vbmUKKyAgICAgICAgICAgIHRmLndyaXRlKCdfbGV4c3RhdGVlb2ZmID0gJXNcbicgJSByZXByKHRhYmVvZikpCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgcmVhZHRhYigpIC0gUmVhZCBsZXhlciBpbmZvcm1hdGlvbiBmcm9tIGEgdGFiIGZpbGUKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGRlZiByZWFkdGFiKHNlbGYsIHRhYmZpbGUsIGZkaWN0KToKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh0YWJmaWxlLCB0eXBlcy5Nb2R1bGVUeXBlKToKKyAgICAgICAgICAgIGxleHRhYiA9IHRhYmZpbGUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGV4ZWMoJ2ltcG9ydCAlcycgJSB0YWJmaWxlKQorICAgICAgICAgICAgbGV4dGFiID0gc3lzLm1vZHVsZXNbdGFiZmlsZV0KKworICAgICAgICBpZiBnZXRhdHRyKGxleHRhYiwgJ190YWJ2ZXJzaW9uJywgJzAuMCcpICE9IF9fdGFidmVyc2lvbl9fOgorICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoJ0luY29uc2lzdGVudCBQTFkgdmVyc2lvbicpCisKKyAgICAgICAgc2VsZi5sZXh0b2tlbnMgICAgICA9IGxleHRhYi5fbGV4dG9rZW5zCisgICAgICAgIHNlbGYubGV4cmVmbGFncyAgICAgPSBsZXh0YWIuX2xleHJlZmxhZ3MKKyAgICAgICAgc2VsZi5sZXhsaXRlcmFscyAgICA9IGxleHRhYi5fbGV4bGl0ZXJhbHMKKyAgICAgICAgc2VsZi5sZXh0b2tlbnNfYWxsICA9IHNlbGYubGV4dG9rZW5zIHwgc2V0KHNlbGYubGV4bGl0ZXJhbHMpCisgICAgICAgIHNlbGYubGV4c3RhdGVpbmZvICAgPSBsZXh0YWIuX2xleHN0YXRlaW5mbworICAgICAgICBzZWxmLmxleHN0YXRlaWdub3JlID0gbGV4dGFiLl9sZXhzdGF0ZWlnbm9yZQorICAgICAgICBzZWxmLmxleHN0YXRlcmUgICAgID0ge30KKyAgICAgICAgc2VsZi5sZXhzdGF0ZXJldGV4dCA9IHt9CisgICAgICAgIGZvciBzdGF0ZW5hbWUsIGxyZSBpbiBsZXh0YWIuX2xleHN0YXRlcmUuaXRlbXMoKToKKyAgICAgICAgICAgIHRpdGVtID0gW10KKyAgICAgICAgICAgIHR4dGl0ZW0gPSBbXQorICAgICAgICAgICAgZm9yIHBhdCwgZnVuY19uYW1lIGluIGxyZToKKyAgICAgICAgICAgICAgICB0aXRlbS5hcHBlbmQoKHJlLmNvbXBpbGUocGF0LCBsZXh0YWIuX2xleHJlZmxhZ3MpLCBfbmFtZXNfdG9fZnVuY3MoZnVuY19uYW1lLCBmZGljdCkpKQorCisgICAgICAgICAgICBzZWxmLmxleHN0YXRlcmVbc3RhdGVuYW1lXSA9IHRpdGVtCisgICAgICAgICAgICBzZWxmLmxleHN0YXRlcmV0ZXh0W3N0YXRlbmFtZV0gPSB0eHRpdGVtCisKKyAgICAgICAgc2VsZi5sZXhzdGF0ZWVycm9yZiA9IHt9CisgICAgICAgIGZvciBzdGF0ZW5hbWUsIGVmIGluIGxleHRhYi5fbGV4c3RhdGVlcnJvcmYuaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYubGV4c3RhdGVlcnJvcmZbc3RhdGVuYW1lXSA9IGZkaWN0W2VmXQorCisgICAgICAgIHNlbGYubGV4c3RhdGVlb2ZmID0ge30KKyAgICAgICAgZm9yIHN0YXRlbmFtZSwgZWYgaW4gbGV4dGFiLl9sZXhzdGF0ZWVvZmYuaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYubGV4c3RhdGVlb2ZmW3N0YXRlbmFtZV0gPSBmZGljdFtlZl0KKworICAgICAgICBzZWxmLmJlZ2luKCdJTklUSUFMJykKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBpbnB1dCgpIC0gUHVzaCBhIG5ldyBzdHJpbmcgaW50byB0aGUgbGV4ZXIKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGRlZiBpbnB1dChzZWxmLCBzKToKKyAgICAgICAgIyBQdWxsIG9mZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHRvIHNlZSBpZiBzIGxvb2tzIGxpa2UgYSBzdHJpbmcKKyAgICAgICAgYyA9IHNbOjFdCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGMsIFN0cmluZ1R5cGVzKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJykKKyAgICAgICAgc2VsZi5sZXhkYXRhID0gcworICAgICAgICBzZWxmLmxleHBvcyA9IDAKKyAgICAgICAgc2VsZi5sZXhsZW4gPSBsZW4ocykKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBiZWdpbigpIC0gQ2hhbmdlcyB0aGUgbGV4aW5nIHN0YXRlCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBkZWYgYmVnaW4oc2VsZiwgc3RhdGUpOgorICAgICAgICBpZiBzdGF0ZSBub3QgaW4gc2VsZi5sZXhzdGF0ZXJlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5kZWZpbmVkIHN0YXRlJykKKyAgICAgICAgc2VsZi5sZXhyZSA9IHNlbGYubGV4c3RhdGVyZVtzdGF0ZV0KKyAgICAgICAgc2VsZi5sZXhyZXRleHQgPSBzZWxmLmxleHN0YXRlcmV0ZXh0W3N0YXRlXQorICAgICAgICBzZWxmLmxleGlnbm9yZSA9IHNlbGYubGV4c3RhdGVpZ25vcmUuZ2V0KHN0YXRlLCAnJykKKyAgICAgICAgc2VsZi5sZXhlcnJvcmYgPSBzZWxmLmxleHN0YXRlZXJyb3JmLmdldChzdGF0ZSwgTm9uZSkKKyAgICAgICAgc2VsZi5sZXhlb2ZmID0gc2VsZi5sZXhzdGF0ZWVvZmYuZ2V0KHN0YXRlLCBOb25lKQorICAgICAgICBzZWxmLmxleHN0YXRlID0gc3RhdGUKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBwdXNoX3N0YXRlKCkgLSBDaGFuZ2VzIHRoZSBsZXhpbmcgc3RhdGUgYW5kIHNhdmVzIG9sZCBvbiBzdGFjaworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgZGVmIHB1c2hfc3RhdGUoc2VsZiwgc3RhdGUpOgorICAgICAgICBzZWxmLmxleHN0YXRlc3RhY2suYXBwZW5kKHNlbGYubGV4c3RhdGUpCisgICAgICAgIHNlbGYuYmVnaW4oc3RhdGUpCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgcG9wX3N0YXRlKCkgLSBSZXN0b3JlcyB0aGUgcHJldmlvdXMgc3RhdGUKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGRlZiBwb3Bfc3RhdGUoc2VsZik6CisgICAgICAgIHNlbGYuYmVnaW4oc2VsZi5sZXhzdGF0ZXN0YWNrLnBvcCgpKQorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIGN1cnJlbnRfc3RhdGUoKSAtIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aW5nIHN0YXRlCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBkZWYgY3VycmVudF9zdGF0ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubGV4c3RhdGUKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBza2lwKCkgLSBTa2lwIGFoZWFkIG4gY2hhcmFjdGVycworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgZGVmIHNraXAoc2VsZiwgbik6CisgICAgICAgIHNlbGYubGV4cG9zICs9IG4KKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBvcHR0b2tlbigpIC0gUmV0dXJuIHRoZSBuZXh0IHRva2VuIGZyb20gdGhlIExleGVyCisgICAgIworICAgICMgTm90ZTogVGhpcyBmdW5jdGlvbiBoYXMgYmVlbiBjYXJlZnVsbHkgaW1wbGVtZW50ZWQgdG8gYmUgYXMgZmFzdAorICAgICMgYXMgcG9zc2libGUuICBEb24ndCBtYWtlIGNoYW5nZXMgdW5sZXNzIHlvdSByZWFsbHkga25vdyB3aGF0CisgICAgIyB5b3UgYXJlIGRvaW5nCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBkZWYgdG9rZW4oc2VsZik6CisgICAgICAgICMgTWFrZSBsb2NhbCBjb3BpZXMgb2YgZnJlcXVlbnRseSByZWZlcmVuY2VkIGF0dHJpYnV0ZXMKKyAgICAgICAgbGV4cG9zICAgID0gc2VsZi5sZXhwb3MKKyAgICAgICAgbGV4bGVuICAgID0gc2VsZi5sZXhsZW4KKyAgICAgICAgbGV4aWdub3JlID0gc2VsZi5sZXhpZ25vcmUKKyAgICAgICAgbGV4ZGF0YSAgID0gc2VsZi5sZXhkYXRhCisKKyAgICAgICAgd2hpbGUgbGV4cG9zIDwgbGV4bGVuOgorICAgICAgICAgICAgIyBUaGlzIGNvZGUgcHJvdmlkZXMgc29tZSBzaG9ydC1jaXJjdWl0IGNvZGUgZm9yIHdoaXRlc3BhY2UsIHRhYnMsIGFuZCBvdGhlciBpZ25vcmVkIGNoYXJhY3RlcnMKKyAgICAgICAgICAgIGlmIGxleGRhdGFbbGV4cG9zXSBpbiBsZXhpZ25vcmU6CisgICAgICAgICAgICAgICAgbGV4cG9zICs9IDEKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIExvb2sgZm9yIGEgcmVndWxhciBleHByZXNzaW9uIG1hdGNoCisgICAgICAgICAgICBmb3IgbGV4cmUsIGxleGluZGV4ZnVuYyBpbiBzZWxmLmxleHJlOgorICAgICAgICAgICAgICAgIG0gPSBsZXhyZS5tYXRjaChsZXhkYXRhLCBsZXhwb3MpCisgICAgICAgICAgICAgICAgaWYgbm90IG06CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAjIENyZWF0ZSBhIHRva2VuIGZvciByZXR1cm4KKyAgICAgICAgICAgICAgICB0b2sgPSBMZXhUb2tlbigpCisgICAgICAgICAgICAgICAgdG9rLnZhbHVlID0gbS5ncm91cCgpCisgICAgICAgICAgICAgICAgdG9rLmxpbmVubyA9IHNlbGYubGluZW5vCisgICAgICAgICAgICAgICAgdG9rLmxleHBvcyA9IGxleHBvcworCisgICAgICAgICAgICAgICAgaSA9IG0ubGFzdGluZGV4CisgICAgICAgICAgICAgICAgZnVuYywgdG9rLnR5cGUgPSBsZXhpbmRleGZ1bmNbaV0KKworICAgICAgICAgICAgICAgIGlmIG5vdCBmdW5jOgorICAgICAgICAgICAgICAgICAgICAjIElmIG5vIHRva2VuIHR5cGUgd2FzIHNldCwgaXQncyBhbiBpZ25vcmVkIHRva2VuCisgICAgICAgICAgICAgICAgICAgIGlmIHRvay50eXBlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sZXhwb3MgPSBtLmVuZCgpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBsZXhwb3MgPSBtLmVuZCgpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICAgICAgbGV4cG9zID0gbS5lbmQoKQorCisgICAgICAgICAgICAgICAgIyBJZiB0b2tlbiBpcyBwcm9jZXNzZWQgYnkgYSBmdW5jdGlvbiwgY2FsbCBpdAorCisgICAgICAgICAgICAgICAgdG9rLmxleGVyID0gc2VsZiAgICAgICMgU2V0IGFkZGl0aW9uYWwgYXR0cmlidXRlcyB1c2VmdWwgaW4gdG9rZW4gcnVsZXMKKyAgICAgICAgICAgICAgICBzZWxmLmxleG1hdGNoID0gbQorICAgICAgICAgICAgICAgIHNlbGYubGV4cG9zID0gbGV4cG9zCisKKyAgICAgICAgICAgICAgICBuZXd0b2sgPSBmdW5jKHRvaykKKworICAgICAgICAgICAgICAgICMgRXZlcnkgZnVuY3Rpb24gbXVzdCByZXR1cm4gYSB0b2tlbiwgaWYgbm90aGluZywgd2UganVzdCBtb3ZlIHRvIG5leHQgdG9rZW4KKyAgICAgICAgICAgICAgICBpZiBub3QgbmV3dG9rOgorICAgICAgICAgICAgICAgICAgICBsZXhwb3MgICAgPSBzZWxmLmxleHBvcyAgICAgICAgICMgVGhpcyBpcyBoZXJlIGluIGNhc2UgdXNlciBoYXMgdXBkYXRlZCBsZXhwb3MuCisgICAgICAgICAgICAgICAgICAgIGxleGlnbm9yZSA9IHNlbGYubGV4aWdub3JlICAgICAgIyBUaGlzIGlzIGhlcmUgaW4gY2FzZSB0aGVyZSB3YXMgYSBzdGF0ZSBjaGFuZ2UKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgICAgICMgVmVyaWZ5IHR5cGUgb2YgdGhlIHRva2VuLiAgSWYgbm90IGluIHRoZSB0b2tlbiBtYXAsIHJhaXNlIGFuIGVycm9yCisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYubGV4b3B0aW1pemU6CisgICAgICAgICAgICAgICAgICAgIGlmIG5ld3Rvay50eXBlIG5vdCBpbiBzZWxmLmxleHRva2Vuc19hbGw6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBMZXhFcnJvcigiJXM6JWQ6IFJ1bGUgJyVzJyByZXR1cm5lZCBhbiB1bmtub3duIHRva2VuIHR5cGUgJyVzJyIgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5fX2NvZGVfXy5jb19maWxlbmFtZSwgZnVuYy5fX2NvZGVfXy5jb19maXJzdGxpbmVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jLl9fbmFtZV9fLCBuZXd0b2sudHlwZSksIGxleGRhdGFbbGV4cG9zOl0pCisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3dG9rCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgTm8gbWF0Y2gsIHNlZSBpZiBpbiBsaXRlcmFscworICAgICAgICAgICAgICAgIGlmIGxleGRhdGFbbGV4cG9zXSBpbiBzZWxmLmxleGxpdGVyYWxzOgorICAgICAgICAgICAgICAgICAgICB0b2sgPSBMZXhUb2tlbigpCisgICAgICAgICAgICAgICAgICAgIHRvay52YWx1ZSA9IGxleGRhdGFbbGV4cG9zXQorICAgICAgICAgICAgICAgICAgICB0b2subGluZW5vID0gc2VsZi5saW5lbm8KKyAgICAgICAgICAgICAgICAgICAgdG9rLnR5cGUgPSB0b2sudmFsdWUKKyAgICAgICAgICAgICAgICAgICAgdG9rLmxleHBvcyA9IGxleHBvcworICAgICAgICAgICAgICAgICAgICBzZWxmLmxleHBvcyA9IGxleHBvcyArIDEKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvaworCisgICAgICAgICAgICAgICAgIyBObyBtYXRjaC4gQ2FsbCB0X2Vycm9yKCkgaWYgZGVmaW5lZC4KKyAgICAgICAgICAgICAgICBpZiBzZWxmLmxleGVycm9yZjoKKyAgICAgICAgICAgICAgICAgICAgdG9rID0gTGV4VG9rZW4oKQorICAgICAgICAgICAgICAgICAgICB0b2sudmFsdWUgPSBzZWxmLmxleGRhdGFbbGV4cG9zOl0KKyAgICAgICAgICAgICAgICAgICAgdG9rLmxpbmVubyA9IHNlbGYubGluZW5vCisgICAgICAgICAgICAgICAgICAgIHRvay50eXBlID0gJ2Vycm9yJworICAgICAgICAgICAgICAgICAgICB0b2subGV4ZXIgPSBzZWxmCisgICAgICAgICAgICAgICAgICAgIHRvay5sZXhwb3MgPSBsZXhwb3MKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sZXhwb3MgPSBsZXhwb3MKKyAgICAgICAgICAgICAgICAgICAgbmV3dG9rID0gc2VsZi5sZXhlcnJvcmYodG9rKQorICAgICAgICAgICAgICAgICAgICBpZiBsZXhwb3MgPT0gc2VsZi5sZXhwb3M6CisgICAgICAgICAgICAgICAgICAgICAgICAjIEVycm9yIG1ldGhvZCBkaWRuJ3QgY2hhbmdlIHRleHQgcG9zaXRpb24gYXQgYWxsLiBUaGlzIGlzIGFuIGVycm9yLgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgTGV4RXJyb3IoIlNjYW5uaW5nIGVycm9yLiBJbGxlZ2FsIGNoYXJhY3RlciAnJXMnIiAlIChsZXhkYXRhW2xleHBvc10pLCBsZXhkYXRhW2xleHBvczpdKQorICAgICAgICAgICAgICAgICAgICBsZXhwb3MgPSBzZWxmLmxleHBvcworICAgICAgICAgICAgICAgICAgICBpZiBub3QgbmV3dG9rOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld3RvaworCisgICAgICAgICAgICAgICAgc2VsZi5sZXhwb3MgPSBsZXhwb3MKKyAgICAgICAgICAgICAgICByYWlzZSBMZXhFcnJvcigiSWxsZWdhbCBjaGFyYWN0ZXIgJyVzJyBhdCBpbmRleCAlZCIgJSAobGV4ZGF0YVtsZXhwb3NdLCBsZXhwb3MpLCBsZXhkYXRhW2xleHBvczpdKQorCisgICAgICAgIGlmIHNlbGYubGV4ZW9mZjoKKyAgICAgICAgICAgIHRvayA9IExleFRva2VuKCkKKyAgICAgICAgICAgIHRvay50eXBlID0gJ2VvZicKKyAgICAgICAgICAgIHRvay52YWx1ZSA9ICcnCisgICAgICAgICAgICB0b2subGluZW5vID0gc2VsZi5saW5lbm8KKyAgICAgICAgICAgIHRvay5sZXhwb3MgPSBsZXhwb3MKKyAgICAgICAgICAgIHRvay5sZXhlciA9IHNlbGYKKyAgICAgICAgICAgIHNlbGYubGV4cG9zID0gbGV4cG9zCisgICAgICAgICAgICBuZXd0b2sgPSBzZWxmLmxleGVvZmYodG9rKQorICAgICAgICAgICAgcmV0dXJuIG5ld3RvaworCisgICAgICAgIHNlbGYubGV4cG9zID0gbGV4cG9zICsgMQorICAgICAgICBpZiBzZWxmLmxleGRhdGEgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignTm8gaW5wdXQgc3RyaW5nIGdpdmVuIHdpdGggaW5wdXQoKScpCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICAjIEl0ZXJhdG9yIGludGVyZmFjZQorICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICB0ID0gc2VsZi50b2tlbigpCisgICAgICAgIGlmIHQgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgcmV0dXJuIHQKKworICAgIF9fbmV4dF9fID0gbmV4dAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgPT09PSBMZXggQnVpbGRlciA9PT0KKyMKKyMgVGhlIGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyBiZWxvdyBhcmUgdXNlZCB0byBjb2xsZWN0IGxleGluZyBpbmZvcm1hdGlvbgorIyBhbmQgYnVpbGQgYSBMZXhlciBvYmplY3QgZnJvbSBpdC4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBfZ2V0X3JlZ2V4KGZ1bmMpCisjCisjIFJldHVybnMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhc3NpZ25lZCB0byBhIGZ1bmN0aW9uIGVpdGhlciBhcyBhIGRvYyBzdHJpbmcKKyMgb3IgYXMgYSAucmVnZXggYXR0cmlidXRlIGF0dGFjaGVkIGJ5IHRoZSBAVE9LRU4gZGVjb3JhdG9yLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZGVmIF9nZXRfcmVnZXgoZnVuYyk6CisgICAgcmV0dXJuIGdldGF0dHIoZnVuYywgJ3JlZ2V4JywgZnVuYy5fX2RvY19fKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGdldF9jYWxsZXJfbW9kdWxlX2RpY3QoKQorIworIyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBzeW1ib2xzIGRlZmluZWQgd2l0aGluCisjIGEgY2FsbGVyIGZ1cnRoZXIgZG93biB0aGUgY2FsbCBzdGFjay4gIFRoaXMgaXMgdXNlZCB0byBnZXQgdGhlIGVudmlyb25tZW50CisjIGFzc29jaWF0ZWQgd2l0aCB0aGUgeWFjYygpIGNhbGwgaWYgbm9uZSB3YXMgcHJvdmlkZWQuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitkZWYgZ2V0X2NhbGxlcl9tb2R1bGVfZGljdChsZXZlbHMpOgorICAgIGYgPSBzeXMuX2dldGZyYW1lKGxldmVscykKKyAgICBsZGljdCA9IGYuZl9nbG9iYWxzLmNvcHkoKQorICAgIGlmIGYuZl9nbG9iYWxzICE9IGYuZl9sb2NhbHM6CisgICAgICAgIGxkaWN0LnVwZGF0ZShmLmZfbG9jYWxzKQorICAgIHJldHVybiBsZGljdAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9mdW5jc190b19uYW1lcygpCisjCisjIEdpdmVuIGEgbGlzdCBvZiByZWd1bGFyIGV4cHJlc3Npb24gZnVuY3Rpb25zLCB0aGlzIGNvbnZlcnRzIGl0IHRvIGEgbGlzdAorIyBzdWl0YWJsZSBmb3Igb3V0cHV0IHRvIGEgdGFibGUgZmlsZQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZGVmIF9mdW5jc190b19uYW1lcyhmdW5jbGlzdCwgbmFtZWxpc3QpOgorICAgIHJlc3VsdCA9IFtdCisgICAgZm9yIGYsIG5hbWUgaW4gemlwKGZ1bmNsaXN0LCBuYW1lbGlzdCk6CisgICAgICAgIGlmIGYgYW5kIGZbMF06CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKChuYW1lLCBmWzFdKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZikKKyAgICByZXR1cm4gcmVzdWx0CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX25hbWVzX3RvX2Z1bmNzKCkKKyMKKyMgR2l2ZW4gYSBsaXN0IG9mIHJlZ3VsYXIgZXhwcmVzc2lvbiBmdW5jdGlvbiBuYW1lcywgdGhpcyBjb252ZXJ0cyBpdCBiYWNrIHRvCisjIGZ1bmN0aW9ucy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2RlZiBfbmFtZXNfdG9fZnVuY3MobmFtZWxpc3QsIGZkaWN0KToKKyAgICByZXN1bHQgPSBbXQorICAgIGZvciBuIGluIG5hbWVsaXN0OgorICAgICAgICBpZiBuIGFuZCBuWzBdOgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgoZmRpY3RbblswXV0sIG5bMV0pKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChuKQorICAgIHJldHVybiByZXN1bHQKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBfZm9ybV9tYXN0ZXJfcmUoKQorIworIyBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgbGlzdCBvZiBhbGwgb2YgdGhlIHJlZ2V4IGNvbXBvbmVudHMgYW5kIGF0dGVtcHRzIHRvCisjIGZvcm0gdGhlIG1hc3RlciByZWd1bGFyIGV4cHJlc3Npb24uICBHaXZlbiBsaW1pdGF0aW9ucyBpbiB0aGUgUHl0aG9uIHJlCisjIG1vZHVsZSwgaXQgbWF5IGJlIG5lY2Vzc2FyeSB0byBicmVhayB0aGUgbWFzdGVyIHJlZ2V4IGludG8gc2VwYXJhdGUgZXhwcmVzc2lvbnMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitkZWYgX2Zvcm1fbWFzdGVyX3JlKHJlbGlzdCwgcmVmbGFncywgbGRpY3QsIHRva25hbWVzKToKKyAgICBpZiBub3QgcmVsaXN0OgorICAgICAgICByZXR1cm4gW10KKyAgICByZWdleCA9ICd8Jy5qb2luKHJlbGlzdCkKKyAgICB0cnk6CisgICAgICAgIGxleHJlID0gcmUuY29tcGlsZShyZWdleCwgcmVmbGFncykKKworICAgICAgICAjIEJ1aWxkIHRoZSBpbmRleCB0byBmdW5jdGlvbiBtYXAgZm9yIHRoZSBtYXRjaGluZyBlbmdpbmUKKyAgICAgICAgbGV4aW5kZXhmdW5jID0gW05vbmVdICogKG1heChsZXhyZS5ncm91cGluZGV4LnZhbHVlcygpKSArIDEpCisgICAgICAgIGxleGluZGV4bmFtZXMgPSBsZXhpbmRleGZ1bmNbOl0KKworICAgICAgICBmb3IgZiwgaSBpbiBsZXhyZS5ncm91cGluZGV4Lml0ZW1zKCk6CisgICAgICAgICAgICBoYW5kbGUgPSBsZGljdC5nZXQoZiwgTm9uZSkKKyAgICAgICAgICAgIGlmIHR5cGUoaGFuZGxlKSBpbiAodHlwZXMuRnVuY3Rpb25UeXBlLCB0eXBlcy5NZXRob2RUeXBlKToKKyAgICAgICAgICAgICAgICBsZXhpbmRleGZ1bmNbaV0gPSAoaGFuZGxlLCB0b2tuYW1lc1tmXSkKKyAgICAgICAgICAgICAgICBsZXhpbmRleG5hbWVzW2ldID0gZgorICAgICAgICAgICAgZWxpZiBoYW5kbGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgbGV4aW5kZXhuYW1lc1tpXSA9IGYKKyAgICAgICAgICAgICAgICBpZiBmLmZpbmQoJ2lnbm9yZV8nKSA+IDA6CisgICAgICAgICAgICAgICAgICAgIGxleGluZGV4ZnVuY1tpXSA9IChOb25lLCBOb25lKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxleGluZGV4ZnVuY1tpXSA9IChOb25lLCB0b2tuYW1lc1tmXSkKKworICAgICAgICByZXR1cm4gWyhsZXhyZSwgbGV4aW5kZXhmdW5jKV0sIFtyZWdleF0sIFtsZXhpbmRleG5hbWVzXQorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgIG0gPSBpbnQobGVuKHJlbGlzdCkvMikKKyAgICAgICAgaWYgbSA9PSAwOgorICAgICAgICAgICAgbSA9IDEKKyAgICAgICAgbGxpc3QsIGxyZSwgbG5hbWVzID0gX2Zvcm1fbWFzdGVyX3JlKHJlbGlzdFs6bV0sIHJlZmxhZ3MsIGxkaWN0LCB0b2tuYW1lcykKKyAgICAgICAgcmxpc3QsIHJyZSwgcm5hbWVzID0gX2Zvcm1fbWFzdGVyX3JlKHJlbGlzdFttOl0sIHJlZmxhZ3MsIGxkaWN0LCB0b2tuYW1lcykKKyAgICAgICAgcmV0dXJuIChsbGlzdCtybGlzdCksIChscmUrcnJlKSwgKGxuYW1lcytybmFtZXMpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZGVmIF9zdGF0ZXRva2VuKHMsbmFtZXMpCisjCisjIEdpdmVuIGEgZGVjbGFyYXRpb24gbmFtZSBzIG9mIHRoZSBmb3JtICJ0XyIgYW5kIGEgZGljdGlvbmFyeSB3aG9zZSBrZXlzIGFyZQorIyBzdGF0ZSBuYW1lcywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgdHVwbGUgKHN0YXRlcyx0b2tlbm5hbWUpIHdoZXJlIHN0YXRlcworIyBpcyBhIHR1cGxlIG9mIHN0YXRlIG5hbWVzIGFuZCB0b2tlbm5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHRva2VuLiAgRm9yIGV4YW1wbGUsCisjIGNhbGxpbmcgdGhpcyB3aXRoIHMgPSAidF9mb29fYmFyX1NQQU0iIG1pZ2h0IHJldHVybiAoKCdmb28nLCdiYXInKSwnU1BBTScpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitkZWYgX3N0YXRldG9rZW4ocywgbmFtZXMpOgorICAgIG5vbnN0YXRlID0gMQorICAgIHBhcnRzID0gcy5zcGxpdCgnXycpCisgICAgZm9yIGksIHBhcnQgaW4gZW51bWVyYXRlKHBhcnRzWzE6XSwgMSk6CisgICAgICAgIGlmIHBhcnQgbm90IGluIG5hbWVzIGFuZCBwYXJ0ICE9ICdBTlknOgorICAgICAgICAgICAgYnJlYWsKKyAgICAKKyAgICBpZiBpID4gMToKKyAgICAgICAgc3RhdGVzID0gdHVwbGUocGFydHNbMTppXSkKKyAgICBlbHNlOgorICAgICAgICBzdGF0ZXMgPSAoJ0lOSVRJQUwnLCkKKworICAgIGlmICdBTlknIGluIHN0YXRlczoKKyAgICAgICAgc3RhdGVzID0gdHVwbGUobmFtZXMpCisKKyAgICB0b2tlbm5hbWUgPSAnXycuam9pbihwYXJ0c1tpOl0pCisgICAgcmV0dXJuIChzdGF0ZXMsIHRva2VubmFtZSkKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExleGVyUmVmbGVjdCgpCisjCisjIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gYnVpbGQgYSBsZXhlciBhcyBleHRyYWN0ZWQgZnJvbSBhCisjIHVzZXIncyBpbnB1dCBmaWxlLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2xhc3MgTGV4ZXJSZWZsZWN0KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxkaWN0LCBsb2c9Tm9uZSwgcmVmbGFncz0wKToKKyAgICAgICAgc2VsZi5sZGljdCAgICAgID0gbGRpY3QKKyAgICAgICAgc2VsZi5lcnJvcl9mdW5jID0gTm9uZQorICAgICAgICBzZWxmLnRva2VucyAgICAgPSBbXQorICAgICAgICBzZWxmLnJlZmxhZ3MgICAgPSByZWZsYWdzCisgICAgICAgIHNlbGYuc3RhdGVpbmZvICA9IHsnSU5JVElBTCc6ICdpbmNsdXNpdmUnfQorICAgICAgICBzZWxmLm1vZHVsZXMgICAgPSBzZXQoKQorICAgICAgICBzZWxmLmVycm9yICAgICAgPSBGYWxzZQorICAgICAgICBzZWxmLmxvZyAgICAgICAgPSBQbHlMb2dnZXIoc3lzLnN0ZGVycikgaWYgbG9nIGlzIE5vbmUgZWxzZSBsb2cKKworICAgICMgR2V0IGFsbCBvZiB0aGUgYmFzaWMgaW5mb3JtYXRpb24KKyAgICBkZWYgZ2V0X2FsbChzZWxmKToKKyAgICAgICAgc2VsZi5nZXRfdG9rZW5zKCkKKyAgICAgICAgc2VsZi5nZXRfbGl0ZXJhbHMoKQorICAgICAgICBzZWxmLmdldF9zdGF0ZXMoKQorICAgICAgICBzZWxmLmdldF9ydWxlcygpCisKKyAgICAjIFZhbGlkYXRlIGFsbCBvZiB0aGUgaW5mb3JtYXRpb24KKyAgICBkZWYgdmFsaWRhdGVfYWxsKHNlbGYpOgorICAgICAgICBzZWxmLnZhbGlkYXRlX3Rva2VucygpCisgICAgICAgIHNlbGYudmFsaWRhdGVfbGl0ZXJhbHMoKQorICAgICAgICBzZWxmLnZhbGlkYXRlX3J1bGVzKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuZXJyb3IKKworICAgICMgR2V0IHRoZSB0b2tlbnMgbWFwCisgICAgZGVmIGdldF90b2tlbnMoc2VsZik6CisgICAgICAgIHRva2VucyA9IHNlbGYubGRpY3QuZ2V0KCd0b2tlbnMnLCBOb25lKQorICAgICAgICBpZiBub3QgdG9rZW5zOgorICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoJ05vIHRva2VuIGxpc3QgaXMgZGVmaW5lZCcpCisgICAgICAgICAgICBzZWxmLmVycm9yID0gVHJ1ZQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodG9rZW5zLCAobGlzdCwgdHVwbGUpKToKKyAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCd0b2tlbnMgbXVzdCBiZSBhIGxpc3Qgb3IgdHVwbGUnKQorICAgICAgICAgICAgc2VsZi5lcnJvciA9IFRydWUKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIG5vdCB0b2tlbnM6CisgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigndG9rZW5zIGlzIGVtcHR5JykKKyAgICAgICAgICAgIHNlbGYuZXJyb3IgPSBUcnVlCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLnRva2VucyA9IHRva2VucworCisgICAgIyBWYWxpZGF0ZSB0aGUgdG9rZW5zCisgICAgZGVmIHZhbGlkYXRlX3Rva2VucyhzZWxmKToKKyAgICAgICAgdGVybWluYWxzID0ge30KKyAgICAgICAgZm9yIG4gaW4gc2VsZi50b2tlbnM6CisgICAgICAgICAgICBpZiBub3QgX2lzX2lkZW50aWZpZXIubWF0Y2gobik6CisgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIkJhZCB0b2tlbiBuYW1lICclcyciLCBuKQorICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSBUcnVlCisgICAgICAgICAgICBpZiBuIGluIHRlcm1pbmFsczoKKyAgICAgICAgICAgICAgICBzZWxmLmxvZy53YXJuaW5nKCJUb2tlbiAnJXMnIG11bHRpcGx5IGRlZmluZWQiLCBuKQorICAgICAgICAgICAgdGVybWluYWxzW25dID0gMQorCisgICAgIyBHZXQgdGhlIGxpdGVyYWxzIHNwZWNpZmllcgorICAgIGRlZiBnZXRfbGl0ZXJhbHMoc2VsZik6CisgICAgICAgIHNlbGYubGl0ZXJhbHMgPSBzZWxmLmxkaWN0LmdldCgnbGl0ZXJhbHMnLCAnJykKKyAgICAgICAgaWYgbm90IHNlbGYubGl0ZXJhbHM6CisgICAgICAgICAgICBzZWxmLmxpdGVyYWxzID0gJycKKworICAgICMgVmFsaWRhdGUgbGl0ZXJhbHMKKyAgICBkZWYgdmFsaWRhdGVfbGl0ZXJhbHMoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBjIGluIHNlbGYubGl0ZXJhbHM6CisgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYywgU3RyaW5nVHlwZXMpIG9yIGxlbihjKSA+IDE6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCdJbnZhbGlkIGxpdGVyYWwgJXMuIE11c3QgYmUgYSBzaW5nbGUgY2hhcmFjdGVyJywgcmVwcihjKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IFRydWUKKworICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoJ0ludmFsaWQgbGl0ZXJhbHMgc3BlY2lmaWNhdGlvbi4gbGl0ZXJhbHMgbXVzdCBiZSBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMnKQorICAgICAgICAgICAgc2VsZi5lcnJvciA9IFRydWUKKworICAgIGRlZiBnZXRfc3RhdGVzKHNlbGYpOgorICAgICAgICBzZWxmLnN0YXRlcyA9IHNlbGYubGRpY3QuZ2V0KCdzdGF0ZXMnLCBOb25lKQorICAgICAgICAjIEJ1aWxkIHN0YXRlbWFwCisgICAgICAgIGlmIHNlbGYuc3RhdGVzOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc2VsZi5zdGF0ZXMsICh0dXBsZSwgbGlzdCkpOgorICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCdzdGF0ZXMgbXVzdCBiZSBkZWZpbmVkIGFzIGEgdHVwbGUgb3IgbGlzdCcpCisgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IFRydWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZm9yIHMgaW4gc2VsZi5zdGF0ZXM6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHMsIHR1cGxlKSBvciBsZW4ocykgIT0gMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCJJbnZhbGlkIHN0YXRlIHNwZWNpZmllciAlcy4gTXVzdCBiZSBhIHR1cGxlIChzdGF0ZW5hbWUsJ2V4Y2x1c2l2ZXxpbmNsdXNpdmUnKSIsIHJlcHIocykpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgbmFtZSwgc3RhdGV0eXBlID0gcworICAgICAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShuYW1lLCBTdHJpbmdUeXBlcyk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcignU3RhdGUgbmFtZSAlcyBtdXN0IGJlIGEgc3RyaW5nJywgcmVwcihuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgKHN0YXRldHlwZSA9PSAnaW5jbHVzaXZlJyBvciBzdGF0ZXR5cGUgPT0gJ2V4Y2x1c2l2ZScpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIlN0YXRlIHR5cGUgZm9yIHN0YXRlICVzIG11c3QgYmUgJ2luY2x1c2l2ZScgb3IgJ2V4Y2x1c2l2ZSciLCBuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGlmIG5hbWUgaW4gc2VsZi5zdGF0ZWluZm86CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiU3RhdGUgJyVzJyBhbHJlYWR5IGRlZmluZWQiLCBuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGVpbmZvW25hbWVdID0gc3RhdGV0eXBlCisKKyAgICAjIEdldCBhbGwgb2YgdGhlIHN5bWJvbHMgd2l0aCBhIHRfIHByZWZpeCBhbmQgc29ydCB0aGVtIGludG8gdmFyaW91cworICAgICMgY2F0ZWdvcmllcyAoZnVuY3Rpb25zLCBzdHJpbmdzLCBlcnJvciBmdW5jdGlvbnMsIGFuZCBpZ25vcmUgY2hhcmFjdGVycykKKworICAgIGRlZiBnZXRfcnVsZXMoc2VsZik6CisgICAgICAgIHRzeW1ib2xzID0gW2YgZm9yIGYgaW4gc2VsZi5sZGljdCBpZiBmWzoyXSA9PSAndF8nXQorCisgICAgICAgICMgTm93IGJ1aWxkIHVwIGEgbGlzdCBvZiBmdW5jdGlvbnMgYW5kIGEgbGlzdCBvZiBzdHJpbmdzCisgICAgICAgIHNlbGYudG9rbmFtZXMgPSB7fSAgICAgICAgIyBNYXBwaW5nIG9mIHN5bWJvbHMgdG8gdG9rZW4gbmFtZXMKKyAgICAgICAgc2VsZi5mdW5jc3ltICA9IHt9ICAgICAgICAjIFN5bWJvbHMgZGVmaW5lZCBhcyBmdW5jdGlvbnMKKyAgICAgICAgc2VsZi5zdHJzeW0gICA9IHt9ICAgICAgICAjIFN5bWJvbHMgZGVmaW5lZCBhcyBzdHJpbmdzCisgICAgICAgIHNlbGYuaWdub3JlICAgPSB7fSAgICAgICAgIyBJZ25vcmUgc3RyaW5ncyBieSBzdGF0ZQorICAgICAgICBzZWxmLmVycm9yZiAgID0ge30gICAgICAgICMgRXJyb3IgZnVuY3Rpb25zIGJ5IHN0YXRlCisgICAgICAgIHNlbGYuZW9mZiAgICAgPSB7fSAgICAgICAgIyBFT0YgZnVuY3Rpb25zIGJ5IHN0YXRlCisKKyAgICAgICAgZm9yIHMgaW4gc2VsZi5zdGF0ZWluZm86CisgICAgICAgICAgICBzZWxmLmZ1bmNzeW1bc10gPSBbXQorICAgICAgICAgICAgc2VsZi5zdHJzeW1bc10gPSBbXQorCisgICAgICAgIGlmIGxlbih0c3ltYm9scykgPT0gMDoKKyAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCdObyBydWxlcyBvZiB0aGUgZm9ybSB0X3J1bGVuYW1lIGFyZSBkZWZpbmVkJykKKyAgICAgICAgICAgIHNlbGYuZXJyb3IgPSBUcnVlCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBmb3IgZiBpbiB0c3ltYm9sczoKKyAgICAgICAgICAgIHQgPSBzZWxmLmxkaWN0W2ZdCisgICAgICAgICAgICBzdGF0ZXMsIHRva25hbWUgPSBfc3RhdGV0b2tlbihmLCBzZWxmLnN0YXRlaW5mbykKKyAgICAgICAgICAgIHNlbGYudG9rbmFtZXNbZl0gPSB0b2tuYW1lCisKKyAgICAgICAgICAgIGlmIGhhc2F0dHIodCwgJ19fY2FsbF9fJyk6CisgICAgICAgICAgICAgICAgaWYgdG9rbmFtZSA9PSAnZXJyb3InOgorICAgICAgICAgICAgICAgICAgICBmb3IgcyBpbiBzdGF0ZXM6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yZltzXSA9IHQKKyAgICAgICAgICAgICAgICBlbGlmIHRva25hbWUgPT0gJ2VvZic6CisgICAgICAgICAgICAgICAgICAgIGZvciBzIGluIHN0YXRlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZW9mZltzXSA9IHQKKyAgICAgICAgICAgICAgICBlbGlmIHRva25hbWUgPT0gJ2lnbm9yZSc6CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSB0Ll9fY29kZV9fLmNvX2ZpcnN0bGluZW5vCisgICAgICAgICAgICAgICAgICAgIGZpbGUgPSB0Ll9fY29kZV9fLmNvX2ZpbGVuYW1lCisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCIlczolZDogUnVsZSAnJXMnIG11c3QgYmUgZGVmaW5lZCBhcyBhIHN0cmluZyIsIGZpbGUsIGxpbmUsIHQuX19uYW1lX18pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSBUcnVlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZm9yIHMgaW4gc3RhdGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mdW5jc3ltW3NdLmFwcGVuZCgoZiwgdCkpCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodCwgU3RyaW5nVHlwZXMpOgorICAgICAgICAgICAgICAgIGlmIHRva25hbWUgPT0gJ2lnbm9yZSc6CisgICAgICAgICAgICAgICAgICAgIGZvciBzIGluIHN0YXRlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaWdub3JlW3NdID0gdAorICAgICAgICAgICAgICAgICAgICBpZiAnXFwnIGluIHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy53YXJuaW5nKCIlcyBjb250YWlucyBhIGxpdGVyYWwgYmFja3NsYXNoICdcXCciLCBmKQorCisgICAgICAgICAgICAgICAgZWxpZiB0b2tuYW1lID09ICdlcnJvcic6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCJSdWxlICclcycgbXVzdCBiZSBkZWZpbmVkIGFzIGEgZnVuY3Rpb24iLCBmKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yID0gVHJ1ZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGZvciBzIGluIHN0YXRlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3Ryc3ltW3NdLmFwcGVuZCgoZiwgdCkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCclcyBub3QgZGVmaW5lZCBhcyBhIGZ1bmN0aW9uIG9yIHN0cmluZycsIGYpCisgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IFRydWUKKworICAgICAgICAjIFNvcnQgdGhlIGZ1bmN0aW9ucyBieSBsaW5lIG51bWJlcgorICAgICAgICBmb3IgZiBpbiBzZWxmLmZ1bmNzeW0udmFsdWVzKCk6CisgICAgICAgICAgICBmLnNvcnQoa2V5PWxhbWJkYSB4OiB4WzFdLl9fY29kZV9fLmNvX2ZpcnN0bGluZW5vKQorCisgICAgICAgICMgU29ydCB0aGUgc3RyaW5ncyBieSByZWd1bGFyIGV4cHJlc3Npb24gbGVuZ3RoCisgICAgICAgIGZvciBzIGluIHNlbGYuc3Ryc3ltLnZhbHVlcygpOgorICAgICAgICAgICAgcy5zb3J0KGtleT1sYW1iZGEgeDogbGVuKHhbMV0pLCByZXZlcnNlPVRydWUpCisKKyAgICAjIFZhbGlkYXRlIGFsbCBvZiB0aGUgdF9ydWxlcyBjb2xsZWN0ZWQKKyAgICBkZWYgdmFsaWRhdGVfcnVsZXMoc2VsZik6CisgICAgICAgIGZvciBzdGF0ZSBpbiBzZWxmLnN0YXRlaW5mbzoKKyAgICAgICAgICAgICMgVmFsaWRhdGUgYWxsIHJ1bGVzIGRlZmluZWQgYnkgZnVuY3Rpb25zCisKKyAgICAgICAgICAgIGZvciBmbmFtZSwgZiBpbiBzZWxmLmZ1bmNzeW1bc3RhdGVdOgorICAgICAgICAgICAgICAgIGxpbmUgPSBmLl9fY29kZV9fLmNvX2ZpcnN0bGluZW5vCisgICAgICAgICAgICAgICAgZmlsZSA9IGYuX19jb2RlX18uY29fZmlsZW5hbWUKKyAgICAgICAgICAgICAgICBtb2R1bGUgPSBpbnNwZWN0LmdldG1vZHVsZShmKQorICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlcy5hZGQobW9kdWxlKQorCisgICAgICAgICAgICAgICAgdG9rbmFtZSA9IHNlbGYudG9rbmFtZXNbZm5hbWVdCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShmLCB0eXBlcy5NZXRob2RUeXBlKToKKyAgICAgICAgICAgICAgICAgICAgcmVxYXJncyA9IDIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXFhcmdzID0gMQorICAgICAgICAgICAgICAgIG5hcmdzID0gZi5fX2NvZGVfXy5jb19hcmdjb3VudAorICAgICAgICAgICAgICAgIGlmIG5hcmdzID4gcmVxYXJnczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIiVzOiVkOiBSdWxlICclcycgaGFzIHRvbyBtYW55IGFyZ3VtZW50cyIsIGZpbGUsIGxpbmUsIGYuX19uYW1lX18pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBpZiBuYXJncyA8IHJlcWFyZ3M6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCIlczolZDogUnVsZSAnJXMnIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiwgZmlsZSwgbGluZSwgZi5fX25hbWVfXykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIGlmIG5vdCBfZ2V0X3JlZ2V4KGYpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiJXM6JWQ6IE5vIHJlZ3VsYXIgZXhwcmVzc2lvbiBkZWZpbmVkIGZvciBydWxlICclcyciLCBmaWxlLCBsaW5lLCBmLl9fbmFtZV9fKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBjID0gcmUuY29tcGlsZSgnKD9QPCVzPiVzKScgJSAoZm5hbWUsIF9nZXRfcmVnZXgoZikpLCBzZWxmLnJlZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgIGlmIGMubWF0Y2goJycpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIiVzOiVkOiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHJ1bGUgJyVzJyBtYXRjaGVzIGVtcHR5IHN0cmluZyIsIGZpbGUsIGxpbmUsIGYuX19uYW1lX18pCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yID0gVHJ1ZQorICAgICAgICAgICAgICAgIGV4Y2VwdCByZS5lcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiJXM6JWQ6IEludmFsaWQgcmVndWxhciBleHByZXNzaW9uIGZvciBydWxlICclcycuICVzIiwgZmlsZSwgbGluZSwgZi5fX25hbWVfXywgZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgJyMnIGluIF9nZXRfcmVnZXgoZik6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiJXM6JWQuIE1ha2Ugc3VyZSAnIycgaW4gcnVsZSAnJXMnIGlzIGVzY2FwZWQgd2l0aCAnXFwjJyIsIGZpbGUsIGxpbmUsIGYuX19uYW1lX18pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSBUcnVlCisKKyAgICAgICAgICAgICMgVmFsaWRhdGUgYWxsIHJ1bGVzIGRlZmluZWQgYnkgc3RyaW5ncworICAgICAgICAgICAgZm9yIG5hbWUsIHIgaW4gc2VsZi5zdHJzeW1bc3RhdGVdOgorICAgICAgICAgICAgICAgIHRva25hbWUgPSBzZWxmLnRva25hbWVzW25hbWVdCisgICAgICAgICAgICAgICAgaWYgdG9rbmFtZSA9PSAnZXJyb3InOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiUnVsZSAnJXMnIG11c3QgYmUgZGVmaW5lZCBhcyBhIGZ1bmN0aW9uIiwgbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIGlmIHRva25hbWUgbm90IGluIHNlbGYudG9rZW5zIGFuZCB0b2tuYW1lLmZpbmQoJ2lnbm9yZV8nKSA8IDA6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCJSdWxlICclcycgZGVmaW5lZCBmb3IgYW4gdW5zcGVjaWZpZWQgdG9rZW4gJXMiLCBuYW1lLCB0b2tuYW1lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBjID0gcmUuY29tcGlsZSgnKD9QPCVzPiVzKScgJSAobmFtZSwgciksIHNlbGYucmVmbGFncykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMubWF0Y2goJycpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCJSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHJ1bGUgJyVzJyBtYXRjaGVzIGVtcHR5IHN0cmluZyIsIG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yID0gVHJ1ZQorICAgICAgICAgICAgICAgIGV4Y2VwdCByZS5lcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb24gZm9yIHJ1bGUgJyVzJy4gJXMiLCBuYW1lLCBlKQorICAgICAgICAgICAgICAgICAgICBpZiAnIycgaW4gcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCJNYWtlIHN1cmUgJyMnIGluIHJ1bGUgJyVzJyBpcyBlc2NhcGVkIHdpdGggJ1xcIyciLCBuYW1lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yID0gVHJ1ZQorCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5mdW5jc3ltW3N0YXRlXSBhbmQgbm90IHNlbGYuc3Ryc3ltW3N0YXRlXToKKyAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiTm8gcnVsZXMgZGVmaW5lZCBmb3Igc3RhdGUgJyVzJyIsIHN0YXRlKQorICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSBUcnVlCisKKyAgICAgICAgICAgICMgVmFsaWRhdGUgdGhlIGVycm9yIGZ1bmN0aW9uCisgICAgICAgICAgICBlZnVuYyA9IHNlbGYuZXJyb3JmLmdldChzdGF0ZSwgTm9uZSkKKyAgICAgICAgICAgIGlmIGVmdW5jOgorICAgICAgICAgICAgICAgIGYgPSBlZnVuYworICAgICAgICAgICAgICAgIGxpbmUgPSBmLl9fY29kZV9fLmNvX2ZpcnN0bGluZW5vCisgICAgICAgICAgICAgICAgZmlsZSA9IGYuX19jb2RlX18uY29fZmlsZW5hbWUKKyAgICAgICAgICAgICAgICBtb2R1bGUgPSBpbnNwZWN0LmdldG1vZHVsZShmKQorICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlcy5hZGQobW9kdWxlKQorCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShmLCB0eXBlcy5NZXRob2RUeXBlKToKKyAgICAgICAgICAgICAgICAgICAgcmVxYXJncyA9IDIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXFhcmdzID0gMQorICAgICAgICAgICAgICAgIG5hcmdzID0gZi5fX2NvZGVfXy5jb19hcmdjb3VudAorICAgICAgICAgICAgICAgIGlmIG5hcmdzID4gcmVxYXJnczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIiVzOiVkOiBSdWxlICclcycgaGFzIHRvbyBtYW55IGFyZ3VtZW50cyIsIGZpbGUsIGxpbmUsIGYuX19uYW1lX18pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSBUcnVlCisKKyAgICAgICAgICAgICAgICBpZiBuYXJncyA8IHJlcWFyZ3M6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCIlczolZDogUnVsZSAnJXMnIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiwgZmlsZSwgbGluZSwgZi5fX25hbWVfXykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IFRydWUKKworICAgICAgICBmb3IgbW9kdWxlIGluIHNlbGYubW9kdWxlczoKKyAgICAgICAgICAgIHNlbGYudmFsaWRhdGVfbW9kdWxlKG1vZHVsZSkKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIHZhbGlkYXRlX21vZHVsZSgpCisgICAgIworICAgICMgVGhpcyBjaGVja3MgdG8gc2VlIGlmIHRoZXJlIGFyZSBkdXBsaWNhdGVkIHRfcnVsZW5hbWUoKSBmdW5jdGlvbnMgb3Igc3RyaW5ncworICAgICMgaW4gdGhlIHBhcnNlciBpbnB1dCBmaWxlLiAgVGhpcyBpcyBkb25lIHVzaW5nIGEgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgICMgbWF0Y2ggb24gZWFjaCBsaW5lIGluIHRoZSBzb3VyY2UgY29kZSBvZiB0aGUgZ2l2ZW4gbW9kdWxlLgorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiB2YWxpZGF0ZV9tb2R1bGUoc2VsZiwgbW9kdWxlKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbGluZXMsIGxpbmVuID0gaW5zcGVjdC5nZXRzb3VyY2VsaW5lcyhtb2R1bGUpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZnJlID0gcmUuY29tcGlsZShyJ1xzKmRlZlxzKyh0X1thLXpBLVpfMC05XSopXCgnKQorICAgICAgICBzcmUgPSByZS5jb21waWxlKHInXHMqKHRfW2EtekEtWl8wLTldKilccyo9JykKKworICAgICAgICBjb3VudGhhc2ggPSB7fQorICAgICAgICBsaW5lbiArPSAxCisgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICAgICAgbSA9IGZyZS5tYXRjaChsaW5lKQorICAgICAgICAgICAgaWYgbm90IG06CisgICAgICAgICAgICAgICAgbSA9IHNyZS5tYXRjaChsaW5lKQorICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICBuYW1lID0gbS5ncm91cCgxKQorICAgICAgICAgICAgICAgIHByZXYgPSBjb3VudGhhc2guZ2V0KG5hbWUpCisgICAgICAgICAgICAgICAgaWYgbm90IHByZXY6CisgICAgICAgICAgICAgICAgICAgIGNvdW50aGFzaFtuYW1lXSA9IGxpbmVuCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBpbnNwZWN0LmdldHNvdXJjZWZpbGUobW9kdWxlKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcignJXM6JWQ6IFJ1bGUgJXMgcmVkZWZpbmVkLiBQcmV2aW91c2x5IGRlZmluZWQgb24gbGluZSAlZCcsIGZpbGVuYW1lLCBsaW5lbiwgbmFtZSwgcHJldikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IFRydWUKKyAgICAgICAgICAgIGxpbmVuICs9IDEKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBsZXgobW9kdWxlKQorIworIyBCdWlsZCBhbGwgb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBydWxlcyBmcm9tIGRlZmluaXRpb25zIGluIHRoZSBzdXBwbGllZCBtb2R1bGUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2RlZiBsZXgobW9kdWxlPU5vbmUsIG9iamVjdD1Ob25lLCBkZWJ1Zz1GYWxzZSwgb3B0aW1pemU9RmFsc2UsIGxleHRhYj0nbGV4dGFiJywKKyAgICAgICAgcmVmbGFncz1pbnQocmUuVkVSQk9TRSksIG5vd2Fybj1GYWxzZSwgb3V0cHV0ZGlyPU5vbmUsIGRlYnVnbG9nPU5vbmUsIGVycm9ybG9nPU5vbmUpOgorCisgICAgaWYgbGV4dGFiIGlzIE5vbmU6CisgICAgICAgIGxleHRhYiA9ICdsZXh0YWInCisKKyAgICBnbG9iYWwgbGV4ZXIKKworICAgIGxkaWN0ID0gTm9uZQorICAgIHN0YXRlaW5mbyAgPSB7J0lOSVRJQUwnOiAnaW5jbHVzaXZlJ30KKyAgICBsZXhvYmogPSBMZXhlcigpCisgICAgbGV4b2JqLmxleG9wdGltaXplID0gb3B0aW1pemUKKyAgICBnbG9iYWwgdG9rZW4sIGlucHV0CisKKyAgICBpZiBlcnJvcmxvZyBpcyBOb25lOgorICAgICAgICBlcnJvcmxvZyA9IFBseUxvZ2dlcihzeXMuc3RkZXJyKQorCisgICAgaWYgZGVidWc6CisgICAgICAgIGlmIGRlYnVnbG9nIGlzIE5vbmU6CisgICAgICAgICAgICBkZWJ1Z2xvZyA9IFBseUxvZ2dlcihzeXMuc3RkZXJyKQorCisgICAgIyBHZXQgdGhlIG1vZHVsZSBkaWN0aW9uYXJ5IHVzZWQgZm9yIHRoZSBsZXhlcgorICAgIGlmIG9iamVjdDoKKyAgICAgICAgbW9kdWxlID0gb2JqZWN0CisKKyAgICAjIEdldCB0aGUgbW9kdWxlIGRpY3Rpb25hcnkgdXNlZCBmb3IgdGhlIHBhcnNlcgorICAgIGlmIG1vZHVsZToKKyAgICAgICAgX2l0ZW1zID0gWyhrLCBnZXRhdHRyKG1vZHVsZSwgaykpIGZvciBrIGluIGRpcihtb2R1bGUpXQorICAgICAgICBsZGljdCA9IGRpY3QoX2l0ZW1zKQorICAgICAgICAjIElmIG5vIF9fZmlsZV9fIGF0dHJpYnV0ZSBpcyBhdmFpbGFibGUsIHRyeSB0byBvYnRhaW4gaXQgZnJvbSB0aGUgX19tb2R1bGVfXyBpbnN0ZWFkCisgICAgICAgIGlmICdfX2ZpbGVfXycgbm90IGluIGxkaWN0OgorICAgICAgICAgICAgbGRpY3RbJ19fZmlsZV9fJ10gPSBzeXMubW9kdWxlc1tsZGljdFsnX19tb2R1bGVfXyddXS5fX2ZpbGVfXworICAgIGVsc2U6CisgICAgICAgIGxkaWN0ID0gZ2V0X2NhbGxlcl9tb2R1bGVfZGljdCgyKQorCisgICAgIyBEZXRlcm1pbmUgaWYgdGhlIG1vZHVsZSBpcyBwYWNrYWdlIG9mIGEgcGFja2FnZSBvciBub3QuCisgICAgIyBJZiBzbywgZml4IHRoZSB0YWJtb2R1bGUgc2V0dGluZyBzbyB0aGF0IHRhYmxlcyBsb2FkIGNvcnJlY3RseQorICAgIHBrZyA9IGxkaWN0LmdldCgnX19wYWNrYWdlX18nKQorICAgIGlmIHBrZyBhbmQgaXNpbnN0YW5jZShsZXh0YWIsIHN0cik6CisgICAgICAgIGlmICcuJyBub3QgaW4gbGV4dGFiOgorICAgICAgICAgICAgbGV4dGFiID0gcGtnICsgJy4nICsgbGV4dGFiCisKKyAgICAjIENvbGxlY3QgcGFyc2VyIGluZm9ybWF0aW9uIGZyb20gdGhlIGRpY3Rpb25hcnkKKyAgICBsaW5mbyA9IExleGVyUmVmbGVjdChsZGljdCwgbG9nPWVycm9ybG9nLCByZWZsYWdzPXJlZmxhZ3MpCisgICAgbGluZm8uZ2V0X2FsbCgpCisgICAgaWYgbm90IG9wdGltaXplOgorICAgICAgICBpZiBsaW5mby52YWxpZGF0ZV9hbGwoKToKKyAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCJDYW4ndCBidWlsZCBsZXhlciIpCisKKyAgICBpZiBvcHRpbWl6ZSBhbmQgbGV4dGFiOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBsZXhvYmoucmVhZHRhYihsZXh0YWIsIGxkaWN0KQorICAgICAgICAgICAgdG9rZW4gPSBsZXhvYmoudG9rZW4KKyAgICAgICAgICAgIGlucHV0ID0gbGV4b2JqLmlucHV0CisgICAgICAgICAgICBsZXhlciA9IGxleG9iagorICAgICAgICAgICAgcmV0dXJuIGxleG9iagorCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICMgRHVtcCBzb21lIGJhc2ljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgorICAgIGlmIGRlYnVnOgorICAgICAgICBkZWJ1Z2xvZy5pbmZvKCdsZXg6IHRva2VucyAgID0gJXInLCBsaW5mby50b2tlbnMpCisgICAgICAgIGRlYnVnbG9nLmluZm8oJ2xleDogbGl0ZXJhbHMgPSAlcicsIGxpbmZvLmxpdGVyYWxzKQorICAgICAgICBkZWJ1Z2xvZy5pbmZvKCdsZXg6IHN0YXRlcyAgID0gJXInLCBsaW5mby5zdGF0ZWluZm8pCisKKyAgICAjIEJ1aWxkIGEgZGljdGlvbmFyeSBvZiB2YWxpZCB0b2tlbiBuYW1lcworICAgIGxleG9iai5sZXh0b2tlbnMgPSBzZXQoKQorICAgIGZvciBuIGluIGxpbmZvLnRva2VuczoKKyAgICAgICAgbGV4b2JqLmxleHRva2Vucy5hZGQobikKKworICAgICMgR2V0IGxpdGVyYWxzIHNwZWNpZmljYXRpb24KKyAgICBpZiBpc2luc3RhbmNlKGxpbmZvLmxpdGVyYWxzLCAobGlzdCwgdHVwbGUpKToKKyAgICAgICAgbGV4b2JqLmxleGxpdGVyYWxzID0gdHlwZShsaW5mby5saXRlcmFsc1swXSkoKS5qb2luKGxpbmZvLmxpdGVyYWxzKQorICAgIGVsc2U6CisgICAgICAgIGxleG9iai5sZXhsaXRlcmFscyA9IGxpbmZvLmxpdGVyYWxzCisKKyAgICBsZXhvYmoubGV4dG9rZW5zX2FsbCA9IGxleG9iai5sZXh0b2tlbnMgfCBzZXQobGV4b2JqLmxleGxpdGVyYWxzKQorCisgICAgIyBHZXQgdGhlIHN0YXRlaW5mbyBkaWN0aW9uYXJ5CisgICAgc3RhdGVpbmZvID0gbGluZm8uc3RhdGVpbmZvCisKKyAgICByZWdleHMgPSB7fQorICAgICMgQnVpbGQgdGhlIG1hc3RlciByZWd1bGFyIGV4cHJlc3Npb25zCisgICAgZm9yIHN0YXRlIGluIHN0YXRlaW5mbzoKKyAgICAgICAgcmVnZXhfbGlzdCA9IFtdCisKKyAgICAgICAgIyBBZGQgcnVsZXMgZGVmaW5lZCBieSBmdW5jdGlvbnMgZmlyc3QKKyAgICAgICAgZm9yIGZuYW1lLCBmIGluIGxpbmZvLmZ1bmNzeW1bc3RhdGVdOgorICAgICAgICAgICAgbGluZSA9IGYuX19jb2RlX18uY29fZmlyc3RsaW5lbm8KKyAgICAgICAgICAgIGZpbGUgPSBmLl9fY29kZV9fLmNvX2ZpbGVuYW1lCisgICAgICAgICAgICByZWdleF9saXN0LmFwcGVuZCgnKD9QPCVzPiVzKScgJSAoZm5hbWUsIF9nZXRfcmVnZXgoZikpKQorICAgICAgICAgICAgaWYgZGVidWc6CisgICAgICAgICAgICAgICAgZGVidWdsb2cuaW5mbygibGV4OiBBZGRpbmcgcnVsZSAlcyAtPiAnJXMnIChzdGF0ZSAnJXMnKSIsIGZuYW1lLCBfZ2V0X3JlZ2V4KGYpLCBzdGF0ZSkKKworICAgICAgICAjIE5vdyBhZGQgYWxsIG9mIHRoZSBzaW1wbGUgcnVsZXMKKyAgICAgICAgZm9yIG5hbWUsIHIgaW4gbGluZm8uc3Ryc3ltW3N0YXRlXToKKyAgICAgICAgICAgIHJlZ2V4X2xpc3QuYXBwZW5kKCcoP1A8JXM+JXMpJyAlIChuYW1lLCByKSkKKyAgICAgICAgICAgIGlmIGRlYnVnOgorICAgICAgICAgICAgICAgIGRlYnVnbG9nLmluZm8oImxleDogQWRkaW5nIHJ1bGUgJXMgLT4gJyVzJyAoc3RhdGUgJyVzJykiLCBuYW1lLCByLCBzdGF0ZSkKKworICAgICAgICByZWdleHNbc3RhdGVdID0gcmVnZXhfbGlzdAorCisgICAgIyBCdWlsZCB0aGUgbWFzdGVyIHJlZ3VsYXIgZXhwcmVzc2lvbnMKKworICAgIGlmIGRlYnVnOgorICAgICAgICBkZWJ1Z2xvZy5pbmZvKCdsZXg6ID09PT0gTUFTVEVSIFJFR0VYUyBGT0xMT1cgPT09PScpCisKKyAgICBmb3Igc3RhdGUgaW4gcmVnZXhzOgorICAgICAgICBsZXhyZSwgcmVfdGV4dCwgcmVfbmFtZXMgPSBfZm9ybV9tYXN0ZXJfcmUocmVnZXhzW3N0YXRlXSwgcmVmbGFncywgbGRpY3QsIGxpbmZvLnRva25hbWVzKQorICAgICAgICBsZXhvYmoubGV4c3RhdGVyZVtzdGF0ZV0gPSBsZXhyZQorICAgICAgICBsZXhvYmoubGV4c3RhdGVyZXRleHRbc3RhdGVdID0gcmVfdGV4dAorICAgICAgICBsZXhvYmoubGV4c3RhdGVyZW5hbWVzW3N0YXRlXSA9IHJlX25hbWVzCisgICAgICAgIGlmIGRlYnVnOgorICAgICAgICAgICAgZm9yIGksIHRleHQgaW4gZW51bWVyYXRlKHJlX3RleHQpOgorICAgICAgICAgICAgICAgIGRlYnVnbG9nLmluZm8oImxleDogc3RhdGUgJyVzJyA6IHJlZ2V4WyVkXSA9ICclcyciLCBzdGF0ZSwgaSwgdGV4dCkKKworICAgICMgRm9yIGluY2x1c2l2ZSBzdGF0ZXMsIHdlIG5lZWQgdG8gYWRkIHRoZSByZWd1bGFyIGV4cHJlc3Npb25zIGZyb20gdGhlIElOSVRJQUwgc3RhdGUKKyAgICBmb3Igc3RhdGUsIHN0eXBlIGluIHN0YXRlaW5mby5pdGVtcygpOgorICAgICAgICBpZiBzdGF0ZSAhPSAnSU5JVElBTCcgYW5kIHN0eXBlID09ICdpbmNsdXNpdmUnOgorICAgICAgICAgICAgbGV4b2JqLmxleHN0YXRlcmVbc3RhdGVdLmV4dGVuZChsZXhvYmoubGV4c3RhdGVyZVsnSU5JVElBTCddKQorICAgICAgICAgICAgbGV4b2JqLmxleHN0YXRlcmV0ZXh0W3N0YXRlXS5leHRlbmQobGV4b2JqLmxleHN0YXRlcmV0ZXh0WydJTklUSUFMJ10pCisgICAgICAgICAgICBsZXhvYmoubGV4c3RhdGVyZW5hbWVzW3N0YXRlXS5leHRlbmQobGV4b2JqLmxleHN0YXRlcmVuYW1lc1snSU5JVElBTCddKQorCisgICAgbGV4b2JqLmxleHN0YXRlaW5mbyA9IHN0YXRlaW5mbworICAgIGxleG9iai5sZXhyZSA9IGxleG9iai5sZXhzdGF0ZXJlWydJTklUSUFMJ10KKyAgICBsZXhvYmoubGV4cmV0ZXh0ID0gbGV4b2JqLmxleHN0YXRlcmV0ZXh0WydJTklUSUFMJ10KKyAgICBsZXhvYmoubGV4cmVmbGFncyA9IHJlZmxhZ3MKKworICAgICMgU2V0IHVwIGlnbm9yZSB2YXJpYWJsZXMKKyAgICBsZXhvYmoubGV4c3RhdGVpZ25vcmUgPSBsaW5mby5pZ25vcmUKKyAgICBsZXhvYmoubGV4aWdub3JlID0gbGV4b2JqLmxleHN0YXRlaWdub3JlLmdldCgnSU5JVElBTCcsICcnKQorCisgICAgIyBTZXQgdXAgZXJyb3IgZnVuY3Rpb25zCisgICAgbGV4b2JqLmxleHN0YXRlZXJyb3JmID0gbGluZm8uZXJyb3JmCisgICAgbGV4b2JqLmxleGVycm9yZiA9IGxpbmZvLmVycm9yZi5nZXQoJ0lOSVRJQUwnLCBOb25lKQorICAgIGlmIG5vdCBsZXhvYmoubGV4ZXJyb3JmOgorICAgICAgICBlcnJvcmxvZy53YXJuaW5nKCdObyB0X2Vycm9yIHJ1bGUgaXMgZGVmaW5lZCcpCisKKyAgICAjIFNldCB1cCBlb2YgZnVuY3Rpb25zCisgICAgbGV4b2JqLmxleHN0YXRlZW9mZiA9IGxpbmZvLmVvZmYKKyAgICBsZXhvYmoubGV4ZW9mZiA9IGxpbmZvLmVvZmYuZ2V0KCdJTklUSUFMJywgTm9uZSkKKworICAgICMgQ2hlY2sgc3RhdGUgaW5mb3JtYXRpb24gZm9yIGlnbm9yZSBhbmQgZXJyb3IgcnVsZXMKKyAgICBmb3Igcywgc3R5cGUgaW4gc3RhdGVpbmZvLml0ZW1zKCk6CisgICAgICAgIGlmIHN0eXBlID09ICdleGNsdXNpdmUnOgorICAgICAgICAgICAgaWYgcyBub3QgaW4gbGluZm8uZXJyb3JmOgorICAgICAgICAgICAgICAgIGVycm9ybG9nLndhcm5pbmcoIk5vIGVycm9yIHJ1bGUgaXMgZGVmaW5lZCBmb3IgZXhjbHVzaXZlIHN0YXRlICclcyciLCBzKQorICAgICAgICAgICAgaWYgcyBub3QgaW4gbGluZm8uaWdub3JlIGFuZCBsZXhvYmoubGV4aWdub3JlOgorICAgICAgICAgICAgICAgIGVycm9ybG9nLndhcm5pbmcoIk5vIGlnbm9yZSBydWxlIGlzIGRlZmluZWQgZm9yIGV4Y2x1c2l2ZSBzdGF0ZSAnJXMnIiwgcykKKyAgICAgICAgZWxpZiBzdHlwZSA9PSAnaW5jbHVzaXZlJzoKKyAgICAgICAgICAgIGlmIHMgbm90IGluIGxpbmZvLmVycm9yZjoKKyAgICAgICAgICAgICAgICBsaW5mby5lcnJvcmZbc10gPSBsaW5mby5lcnJvcmYuZ2V0KCdJTklUSUFMJywgTm9uZSkKKyAgICAgICAgICAgIGlmIHMgbm90IGluIGxpbmZvLmlnbm9yZToKKyAgICAgICAgICAgICAgICBsaW5mby5pZ25vcmVbc10gPSBsaW5mby5pZ25vcmUuZ2V0KCdJTklUSUFMJywgJycpCisKKyAgICAjIENyZWF0ZSBnbG9iYWwgdmVyc2lvbnMgb2YgdGhlIHRva2VuKCkgYW5kIGlucHV0KCkgZnVuY3Rpb25zCisgICAgdG9rZW4gPSBsZXhvYmoudG9rZW4KKyAgICBpbnB1dCA9IGxleG9iai5pbnB1dAorICAgIGxleGVyID0gbGV4b2JqCisKKyAgICAjIElmIGluIG9wdGltaXplIG1vZGUsIHdlIHdyaXRlIHRoZSBsZXh0YWIKKyAgICBpZiBsZXh0YWIgYW5kIG9wdGltaXplOgorICAgICAgICBpZiBvdXRwdXRkaXIgaXMgTm9uZToKKyAgICAgICAgICAgICMgSWYgbm8gb3V0cHV0IGRpcmVjdG9yeSBpcyBzZXQsIHRoZSBsb2NhdGlvbiBvZiB0aGUgb3V0cHV0IGZpbGVzCisgICAgICAgICAgICAjIGlzIGRldGVybWluZWQgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgcnVsZXM6CisgICAgICAgICAgICAjICAgICAtIElmIGxleHRhYiBzcGVjaWZpZXMgYSBwYWNrYWdlLCBmaWxlcyBnbyBpbnRvIHRoYXQgcGFja2FnZSBkaXJlY3RvcnkKKyAgICAgICAgICAgICMgICAgIC0gT3RoZXJ3aXNlLCBmaWxlcyBnbyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIHNwZWNpZnlpbmcgbW9kdWxlCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGxleHRhYiwgdHlwZXMuTW9kdWxlVHlwZSk6CisgICAgICAgICAgICAgICAgc3JjZmlsZSA9IGxleHRhYi5fX2ZpbGVfXworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiAnLicgbm90IGluIGxleHRhYjoKKyAgICAgICAgICAgICAgICAgICAgc3JjZmlsZSA9IGxkaWN0WydfX2ZpbGVfXyddCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcGFydHMgPSBsZXh0YWIuc3BsaXQoJy4nKQorICAgICAgICAgICAgICAgICAgICBwa2duYW1lID0gJy4nLmpvaW4ocGFydHNbOi0xXSkKKyAgICAgICAgICAgICAgICAgICAgZXhlYygnaW1wb3J0ICVzJyAlIHBrZ25hbWUpCisgICAgICAgICAgICAgICAgICAgIHNyY2ZpbGUgPSBnZXRhdHRyKHN5cy5tb2R1bGVzW3BrZ25hbWVdLCAnX19maWxlX18nLCAnJykKKyAgICAgICAgICAgIG91dHB1dGRpciA9IG9zLnBhdGguZGlybmFtZShzcmNmaWxlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBsZXhvYmoud3JpdGV0YWIobGV4dGFiLCBvdXRwdXRkaXIpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6CisgICAgICAgICAgICBlcnJvcmxvZy53YXJuaW5nKCJDb3VsZG4ndCB3cml0ZSBsZXh0YWIgbW9kdWxlICVyLiAlcyIgJSAobGV4dGFiLCBlKSkKKworICAgIHJldHVybiBsZXhvYmoKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBydW5tYWluKCkKKyMKKyMgVGhpcyBydW5zIHRoZSBsZXhlciBhcyBhIG1haW4gcHJvZ3JhbQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgcnVubWFpbihsZXhlcj1Ob25lLCBkYXRhPU5vbmUpOgorICAgIGlmIG5vdCBkYXRhOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlbmFtZSA9IHN5cy5hcmd2WzFdCisgICAgICAgICAgICBmID0gb3BlbihmaWxlbmFtZSkKKyAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgnUmVhZGluZyBmcm9tIHN0YW5kYXJkIGlucHV0ICh0eXBlIEVPRiB0byBlbmQpOlxuJykKKyAgICAgICAgICAgIGRhdGEgPSBzeXMuc3RkaW4ucmVhZCgpCisKKyAgICBpZiBsZXhlcjoKKyAgICAgICAgX2lucHV0ID0gbGV4ZXIuaW5wdXQKKyAgICBlbHNlOgorICAgICAgICBfaW5wdXQgPSBpbnB1dAorICAgIF9pbnB1dChkYXRhKQorICAgIGlmIGxleGVyOgorICAgICAgICBfdG9rZW4gPSBsZXhlci50b2tlbgorICAgIGVsc2U6CisgICAgICAgIF90b2tlbiA9IHRva2VuCisKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICB0b2sgPSBfdG9rZW4oKQorICAgICAgICBpZiBub3QgdG9rOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgnKCVzLCVyLCVkLCVkKVxuJyAlICh0b2sudHlwZSwgdG9rLnZhbHVlLCB0b2subGluZW5vLCB0b2subGV4cG9zKSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBAVE9LRU4ocmVnZXgpCisjCisjIFRoaXMgZGVjb3JhdG9yIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgcmVnZXggZXhwcmVzc2lvbiBvbiBhIGZ1bmN0aW9uCisjIHdoZW4gaXRzIGRvY3N0cmluZyBtaWdodCBuZWVkIHRvIGJlIHNldCBpbiBhbiBhbHRlcm5hdGl2ZSB3YXkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIFRPS0VOKHIpOgorICAgIGRlZiBzZXRfcmVnZXgoZik6CisgICAgICAgIGlmIGhhc2F0dHIociwgJ19fY2FsbF9fJyk6CisgICAgICAgICAgICBmLnJlZ2V4ID0gX2dldF9yZWdleChyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZi5yZWdleCA9IHIKKyAgICAgICAgcmV0dXJuIGYKKyAgICByZXR1cm4gc2V0X3JlZ2V4CisKKyMgQWx0ZXJuYXRpdmUgc3BlbGxpbmcgb2YgdGhlIFRPS0VOIGRlY29yYXRvcgorVG9rZW4gPSBUT0tFTgorCmRpZmYgLS1naXQgYS9wbHkvcGx5L3lhY2MucHkgYi9wbHkvcGx5L3lhY2MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNiZDg2ZQotLS0gL2Rldi9udWxsCisrKyBiL3BseS9wbHkveWFjYy5weQpAQCAtMCwwICsxLDM0OTQgQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgcGx5OiB5YWNjLnB5CisjCisjIENvcHlyaWdodCAoQykgMjAwMS0yMDE3CisjIERhdmlkIE0uIEJlYXpsZXkgKERhYmVheiBMTEMpCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisjICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisjICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorIyAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIERhdmlkIEJlYXpsZXkgb3IgRGFiZWF6IExMQyBtYXkgYmUgdXNlZCB0bworIyAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisjICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMKKyMgVGhpcyBpbXBsZW1lbnRzIGFuIExSIHBhcnNlciB0aGF0IGlzIGNvbnN0cnVjdGVkIGZyb20gZ3JhbW1hciBydWxlcyBkZWZpbmVkCisjIGFzIFB5dGhvbiBmdW5jdGlvbnMuIFRoZSBncmFtbWVyIGlzIHNwZWNpZmllZCBieSBzdXBwbHlpbmcgdGhlIEJORiBpbnNpZGUKKyMgUHl0aG9uIGRvY3VtZW50YXRpb24gc3RyaW5ncy4gIFRoZSBpbnNwaXJhdGlvbiBmb3IgdGhpcyB0ZWNobmlxdWUgd2FzIGJvcnJvd2VkCisjIGZyb20gSm9obiBBeWNvY2sncyBTcGFyayBwYXJzaW5nIHN5c3RlbS4gIFBMWSBtaWdodCBiZSB2aWV3ZWQgYXMgY3Jvc3MgYmV0d2VlbgorIyBTcGFyayBhbmQgdGhlIEdOVSBiaXNvbiB1dGlsaXR5LgorIworIyBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyBvbmx5IHNvbWV3aGF0IG9iamVjdC1vcmllbnRlZC4gVGhlCisjIExSIHBhcnNlciBpdHNlbGYgaXMgZGVmaW5lZCBpbiB0ZXJtcyBvZiBhbiBvYmplY3QgKHdoaWNoIGFsbG93cyBtdWx0aXBsZQorIyBwYXJzZXJzIHRvIGNvLWV4aXN0KS4gIEhvd2V2ZXIsIG1vc3Qgb2YgdGhlIHZhcmlhYmxlcyB1c2VkIGR1cmluZyB0YWJsZQorIyBjb25zdHJ1Y3Rpb24gYXJlIGRlZmluZWQgaW4gdGVybXMgb2YgZ2xvYmFsIHZhcmlhYmxlcy4gIFVzZXJzIHNob3VsZG4ndAorIyBub3RpY2UgdW5sZXNzIHRoZXkgYXJlIHRyeWluZyB0byBkZWZpbmUgbXVsdGlwbGUgcGFyc2VycyBhdCB0aGUgc2FtZQorIyB0aW1lIHVzaW5nIHRocmVhZHMgKGluIHdoaWNoIGNhc2UgdGhleSBzaG91bGQgaGF2ZSB0aGVpciBoZWFkIGV4YW1pbmVkKS4KKyMKKyMgVGhpcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBib3RoIFNMUiBhbmQgTEFMUigxKSBwYXJzaW5nLiAgTEFMUigxKQorIyBzdXBwb3J0IHdhcyBvcmlnaW5hbGx5IGltcGxlbWVudGVkIGJ5IEVsaWFzIElvdXAgKGV6aW91cEBhbHVtbmkudWNoaWNhZ28uZWR1KSwKKyMgdXNpbmcgdGhlIGFsZ29yaXRobSBmb3VuZCBpbiBBaG8sIFNldGhpLCBhbmQgVWxsbWFuICJDb21waWxlcnM6IFByaW5jaXBsZXMsCisjIFRlY2huaXF1ZXMsIGFuZCBUb29scyIgKFRoZSBEcmFnb24gQm9vaykuICBMQUxSKDEpIGhhcyBzaW5jZSBiZWVuIHJlcGxhY2VkCisjIGJ5IHRoZSBtb3JlIGVmZmljaWVudCBEZVJlbWVyIGFuZCBQZW5uZWxsbyBhbGdvcml0aG0uCisjCisjIDo6Ojo6Ojo6IFdBUk5JTkcgOjo6Ojo6OgorIworIyBDb25zdHJ1Y3Rpb24gb2YgTFIgcGFyc2luZyB0YWJsZXMgaXMgZmFpcmx5IGNvbXBsaWNhdGVkIGFuZCBleHBlbnNpdmUuCisjIFRvIG1ha2UgdGhpcyBtb2R1bGUgcnVuIGZhc3QsIGEgKkxPVCogb2Ygd29yayBoYXMgYmVlbiBwdXQgaW50bworIyBvcHRpbWl6YXRpb24tLS1vZnRlbiBhdCB0aGUgZXhwZW5zaXZlIG9mIHJlYWRhYmlsaXR5IGFuZCB3aGF0IG1pZ2h0CisjIGNvbnNpZGVyIHRvIGJlIGdvb2QgUHl0aG9uICJjb2Rpbmcgc3R5bGUuIiAgIE1vZGlmeSB0aGUgY29kZSBhdCB5b3VyCisjIG93biByaXNrIQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ltcG9ydCByZQoraW1wb3J0IHR5cGVzCitpbXBvcnQgc3lzCitpbXBvcnQgb3MucGF0aAoraW1wb3J0IGluc3BlY3QKK2ltcG9ydCBiYXNlNjQKK2ltcG9ydCB3YXJuaW5ncworCitfX3ZlcnNpb25fXyAgICA9ICczLjEwJworX190YWJ2ZXJzaW9uX18gPSAnMy4xMCcKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICAgICAgICAgICAgICAgICAgICAgPT09IFVzZXIgY29uZmlndXJhYmxlIHBhcmFtZXRlcnMgPT09CisjCisjIENoYW5nZSB0aGVzZSB0byBtb2RpZnkgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgeWFjYyAoaWYgeW91IHdpc2gpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworeWFjY2RlYnVnICAgPSBUcnVlICAgICAgICAgICAgICMgRGVidWdnaW5nIG1vZGUuICBJZiBzZXQsIHlhY2MgZ2VuZXJhdGVzIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGEgJ3BhcnNlci5vdXQnIGZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5CisKK2RlYnVnX2ZpbGUgID0gJ3BhcnNlci5vdXQnICAgICAjIERlZmF1bHQgbmFtZSBvZiB0aGUgZGVidWdnaW5nIGZpbGUKK3RhYl9tb2R1bGUgID0gJ3BhcnNldGFiJyAgICAgICAjIERlZmF1bHQgbmFtZSBvZiB0aGUgdGFibGUgbW9kdWxlCitkZWZhdWx0X2xyICA9ICdMQUxSJyAgICAgICAgICAgIyBEZWZhdWx0IExSIHRhYmxlIGdlbmVyYXRpb24gbWV0aG9kCisKK2Vycm9yX2NvdW50ID0gMyAgICAgICAgICAgICAgICAjIE51bWJlciBvZiBzeW1ib2xzIHRoYXQgbXVzdCBiZSBzaGlmdGVkIHRvIGxlYXZlIHJlY292ZXJ5IG1vZGUKKworeWFjY2RldmVsICAgPSBGYWxzZSAgICAgICAgICAgICMgU2V0IHRvIFRydWUgaWYgZGV2ZWxvcGluZyB5YWNjLiAgVGhpcyB0dXJucyBvZmYgb3B0aW1pemVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbXBsZW1lbnRhdGlvbnMgb2YgY2VydGFpbiBmdW5jdGlvbnMuCisKK3Jlc3VsdGxpbWl0ID0gNDAgICAgICAgICAgICAgICAjIFNpemUgbGltaXQgb2YgcmVzdWx0cyB3aGVuIHJ1bm5pbmcgaW4gZGVidWcgbW9kZS4KKworcGlja2xlX3Byb3RvY29sID0gMCAgICAgICAgICAgICMgUHJvdG9jb2wgdG8gdXNlIHdoZW4gd3JpdGluZyBwaWNrbGUgZmlsZXMKKworIyBTdHJpbmcgdHlwZS1jaGVja2luZyBjb21wYXRpYmlsaXR5CitpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMzoKKyAgICBzdHJpbmdfdHlwZXMgPSBiYXNlc3RyaW5nCitlbHNlOgorICAgIHN0cmluZ190eXBlcyA9IHN0cgorCitNQVhJTlQgPSBzeXMubWF4c2l6ZQorCisjIFRoaXMgb2JqZWN0IGlzIGEgc3RhbmQtaW4gZm9yIGEgbG9nZ2luZyBvYmplY3QgY3JlYXRlZCBieSB0aGUKKyMgbG9nZ2luZyBtb2R1bGUuICAgUExZIHdpbGwgdXNlIHRoaXMgYnkgZGVmYXVsdCB0byBjcmVhdGUgdGhpbmdzCisjIHN1Y2ggYXMgdGhlIHBhcnNlci5vdXQgZmlsZS4gIElmIGEgdXNlciB3YW50cyBtb3JlIGRldGFpbGVkCisjIGluZm9ybWF0aW9uLCB0aGV5IGNhbiBjcmVhdGUgdGhlaXIgb3duIGxvZ2dpbmcgb2JqZWN0IGFuZCBwYXNzCisjIGl0IGludG8gUExZLgorCitjbGFzcyBQbHlMb2dnZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZik6CisgICAgICAgIHNlbGYuZiA9IGYKKworICAgIGRlZiBkZWJ1ZyhzZWxmLCBtc2csICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuZi53cml0ZSgobXNnICUgYXJncykgKyAnXG4nKQorCisgICAgaW5mbyA9IGRlYnVnCisKKyAgICBkZWYgd2FybmluZyhzZWxmLCBtc2csICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuZi53cml0ZSgnV0FSTklORzogJyArIChtc2cgJSBhcmdzKSArICdcbicpCisKKyAgICBkZWYgZXJyb3Ioc2VsZiwgbXNnLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBzZWxmLmYud3JpdGUoJ0VSUk9SOiAnICsgKG1zZyAlIGFyZ3MpICsgJ1xuJykKKworICAgIGNyaXRpY2FsID0gZGVidWcKKworIyBOdWxsIGxvZ2dlciBpcyB1c2VkIHdoZW4gbm8gb3V0cHV0IGlzIGdlbmVyYXRlZC4gRG9lcyBub3RoaW5nLgorY2xhc3MgTnVsbExvZ2dlcihvYmplY3QpOgorICAgIGRlZiBfX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmCisKKyMgRXhjZXB0aW9uIHJhaXNlZCBmb3IgeWFjYy1yZWxhdGVkIGVycm9ycworY2xhc3MgWWFjY0Vycm9yKEV4Y2VwdGlvbik6CisgICAgcGFzcworCisjIEZvcm1hdCB0aGUgcmVzdWx0IG1lc3NhZ2UgdGhhdCB0aGUgcGFyc2VyIHByb2R1Y2VzIHdoZW4gcnVubmluZyBpbiBkZWJ1ZyBtb2RlLgorZGVmIGZvcm1hdF9yZXN1bHQocik6CisgICAgcmVwcl9zdHIgPSByZXByKHIpCisgICAgaWYgJ1xuJyBpbiByZXByX3N0cjoKKyAgICAgICAgcmVwcl9zdHIgPSByZXByKHJlcHJfc3RyKQorICAgIGlmIGxlbihyZXByX3N0cikgPiByZXN1bHRsaW1pdDoKKyAgICAgICAgcmVwcl9zdHIgPSByZXByX3N0cls6cmVzdWx0bGltaXRdICsgJyAuLi4nCisgICAgcmVzdWx0ID0gJzwlcyBAIDB4JXg+ICglcyknICUgKHR5cGUocikuX19uYW1lX18sIGlkKHIpLCByZXByX3N0cikKKyAgICByZXR1cm4gcmVzdWx0CisKKyMgRm9ybWF0IHN0YWNrIGVudHJpZXMgd2hlbiB0aGUgcGFyc2VyIGlzIHJ1bm5pbmcgaW4gZGVidWcgbW9kZQorZGVmIGZvcm1hdF9zdGFja19lbnRyeShyKToKKyAgICByZXByX3N0ciA9IHJlcHIocikKKyAgICBpZiAnXG4nIGluIHJlcHJfc3RyOgorICAgICAgICByZXByX3N0ciA9IHJlcHIocmVwcl9zdHIpCisgICAgaWYgbGVuKHJlcHJfc3RyKSA8IDE2OgorICAgICAgICByZXR1cm4gcmVwcl9zdHIKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gJzwlcyBAIDB4JXg+JyAlICh0eXBlKHIpLl9fbmFtZV9fLCBpZChyKSkKKworIyBQYW5pYyBtb2RlIGVycm9yIHJlY292ZXJ5IHN1cHBvcnQuICAgVGhpcyBmZWF0dXJlIGlzIGJlaW5nIHJld29ya2VkLS1tdWNoIG9mIHRoZQorIyBjb2RlIGhlcmUgaXMgdG8gb2ZmZXIgYSBkZXByZWNhdGlvbi9iYWNrd2FyZHMgY29tcGF0aWJsZSB0cmFuc2l0aW9uCisKK19lcnJvayA9IE5vbmUKK190b2tlbiA9IE5vbmUKK19yZXN0YXJ0ID0gTm9uZQorX3dhcm5tc2cgPSAnJydQTFk6IERvbid0IHVzZSBnbG9iYWwgZnVuY3Rpb25zIGVycm9rKCksIHRva2VuKCksIGFuZCByZXN0YXJ0KCkgaW4gcF9lcnJvcigpLgorSW5zdGVhZCwgaW52b2tlIHRoZSBtZXRob2RzIG9uIHRoZSBhc3NvY2lhdGVkIHBhcnNlciBpbnN0YW5jZToKKworICAgIGRlZiBwX2Vycm9yKHApOgorICAgICAgICAuLi4KKyAgICAgICAgIyBVc2UgcGFyc2VyLmVycm9rKCksIHBhcnNlci50b2tlbigpLCBwYXJzZXIucmVzdGFydCgpCisgICAgICAgIC4uLgorCisgICAgcGFyc2VyID0geWFjYy55YWNjKCkKKycnJworCitkZWYgZXJyb2soKToKKyAgICB3YXJuaW5ncy53YXJuKF93YXJubXNnKQorICAgIHJldHVybiBfZXJyb2soKQorCitkZWYgcmVzdGFydCgpOgorICAgIHdhcm5pbmdzLndhcm4oX3dhcm5tc2cpCisgICAgcmV0dXJuIF9yZXN0YXJ0KCkKKworZGVmIHRva2VuKCk6CisgICAgd2FybmluZ3Mud2Fybihfd2Fybm1zZykKKyAgICByZXR1cm4gX3Rva2VuKCkKKworIyBVdGlsaXR5IGZ1bmN0aW9uIHRvIGNhbGwgdGhlIHBfZXJyb3IoKSBmdW5jdGlvbiB3aXRoIHNvbWUgZGVwcmVjYXRpb24gaGFja3MKK2RlZiBjYWxsX2Vycm9yZnVuYyhlcnJvcmZ1bmMsIHRva2VuLCBwYXJzZXIpOgorICAgIGdsb2JhbCBfZXJyb2ssIF90b2tlbiwgX3Jlc3RhcnQKKyAgICBfZXJyb2sgPSBwYXJzZXIuZXJyb2sKKyAgICBfdG9rZW4gPSBwYXJzZXIudG9rZW4KKyAgICBfcmVzdGFydCA9IHBhcnNlci5yZXN0YXJ0CisgICAgciA9IGVycm9yZnVuYyh0b2tlbikKKyAgICB0cnk6CisgICAgICAgIGRlbCBfZXJyb2ssIF90b2tlbiwgX3Jlc3RhcnQKKyAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICBwYXNzCisgICAgcmV0dXJuIHIKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICAgICAgICAgICAgICAgICAgICAgICAgPT09ICBMUiBQYXJzaW5nIEVuZ2luZSA9PT0KKyMKKyMgVGhlIGZvbGxvd2luZyBjbGFzc2VzIGFyZSB1c2VkIGZvciB0aGUgTFIgcGFyc2VyIGl0c2VsZi4gIFRoZXNlIGFyZSBub3QKKyMgdXNlZCBkdXJpbmcgdGFibGUgY29uc3RydWN0aW9uIGFuZCBhcmUgaW5kZXBlbmRlbnQgb2YgdGhlIGFjdHVhbCBMUgorIyB0YWJsZSBnZW5lcmF0aW9uIGFsZ29yaXRobQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGhvbGQgbm9uLXRlcm1pbmFsIGdyYW1tYXIgc3ltYm9scyBkdXJpbmcgcGFyc2luZy4KKyMgSXQgbm9ybWFsbHkgaGFzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBzZXQ6CisjICAgICAgICAudHlwZSAgICAgICA9IEdyYW1tYXIgc3ltYm9sIHR5cGUKKyMgICAgICAgIC52YWx1ZSAgICAgID0gU3ltYm9sIHZhbHVlCisjICAgICAgICAubGluZW5vICAgICA9IFN0YXJ0aW5nIGxpbmUgbnVtYmVyCisjICAgICAgICAuZW5kbGluZW5vICA9IEVuZGluZyBsaW5lIG51bWJlciAob3B0aW9uYWwsIHNldCBhdXRvbWF0aWNhbGx5KQorIyAgICAgICAgLmxleHBvcyAgICAgPSBTdGFydGluZyBsZXggcG9zaXRpb24KKyMgICAgICAgIC5lbmRsZXhwb3MgID0gRW5kaW5nIGxleCBwb3NpdGlvbiAob3B0aW9uYWwsIHNldCBhdXRvbWF0aWNhbGx5KQorCitjbGFzcyBZYWNjU3ltYm9sOgorICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50eXBlCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiBzdHIoc2VsZikKKworIyBUaGlzIGNsYXNzIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIG9iamVjdHMgYWN0dWFsbHkgcGFzc2VkIHRvIGVhY2gKKyMgZ3JhbW1hciBydWxlLiAgIEluZGV4IGxvb2t1cCBhbmQgYXNzaWdubWVudCBhY3R1YWxseSBhc3NpZ24gdGhlCisjIC52YWx1ZSBhdHRyaWJ1dGUgb2YgdGhlIHVuZGVybHlpbmcgWWFjY1N5bWJvbCBvYmplY3QuCisjIFRoZSBsaW5lbm8oKSBtZXRob2QgcmV0dXJucyB0aGUgbGluZSBudW1iZXIgb2YgYSBnaXZlbgorIyBpdGVtIChvciAwIGlmIG5vdCBkZWZpbmVkKS4gICBUaGUgbGluZXNwYW4oKSBtZXRob2QgcmV0dXJucworIyBhIHR1cGxlIG9mIChzdGFydGxpbmUsZW5kbGluZSkgcmVwcmVzZW50aW5nIHRoZSByYW5nZSBvZiBsaW5lcworIyBmb3IgYSBzeW1ib2wuICBUaGUgbGV4c3BhbigpIG1ldGhvZCByZXR1cm5zIGEgdHVwbGUgKGxleHBvcyxlbmRsZXhwb3MpCisjIHJlcHJlc2VudGluZyB0aGUgcmFuZ2Ugb2YgcG9zaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgYSBzeW1ib2wuCisKK2NsYXNzIFlhY2NQcm9kdWN0aW9uOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzLCBzdGFjaz1Ob25lKToKKyAgICAgICAgc2VsZi5zbGljZSA9IHMKKyAgICAgICAgc2VsZi5zdGFjayA9IHN0YWNrCisgICAgICAgIHNlbGYubGV4ZXIgPSBOb25lCisgICAgICAgIHNlbGYucGFyc2VyID0gTm9uZQorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG4pOgorICAgICAgICBpZiBpc2luc3RhbmNlKG4sIHNsaWNlKToKKyAgICAgICAgICAgIHJldHVybiBbcy52YWx1ZSBmb3IgcyBpbiBzZWxmLnNsaWNlW25dXQorICAgICAgICBlbGlmIG4gPj0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnNsaWNlW25dLnZhbHVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5zdGFja1tuXS52YWx1ZQorCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIG4sIHYpOgorICAgICAgICBzZWxmLnNsaWNlW25dLnZhbHVlID0gdgorCisgICAgZGVmIF9fZ2V0c2xpY2VfXyhzZWxmLCBpLCBqKToKKyAgICAgICAgcmV0dXJuIFtzLnZhbHVlIGZvciBzIGluIHNlbGYuc2xpY2VbaTpqXV0KKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuc2xpY2UpCisKKyAgICBkZWYgbGluZW5vKHNlbGYsIG4pOgorICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLnNsaWNlW25dLCAnbGluZW5vJywgMCkKKworICAgIGRlZiBzZXRfbGluZW5vKHNlbGYsIG4sIGxpbmVubyk6CisgICAgICAgIHNlbGYuc2xpY2Vbbl0ubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgbGluZXNwYW4oc2VsZiwgbik6CisgICAgICAgIHN0YXJ0bGluZSA9IGdldGF0dHIoc2VsZi5zbGljZVtuXSwgJ2xpbmVubycsIDApCisgICAgICAgIGVuZGxpbmUgPSBnZXRhdHRyKHNlbGYuc2xpY2Vbbl0sICdlbmRsaW5lbm8nLCBzdGFydGxpbmUpCisgICAgICAgIHJldHVybiBzdGFydGxpbmUsIGVuZGxpbmUKKworICAgIGRlZiBsZXhwb3Moc2VsZiwgbik6CisgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuc2xpY2Vbbl0sICdsZXhwb3MnLCAwKQorCisgICAgZGVmIGxleHNwYW4oc2VsZiwgbik6CisgICAgICAgIHN0YXJ0cG9zID0gZ2V0YXR0cihzZWxmLnNsaWNlW25dLCAnbGV4cG9zJywgMCkKKyAgICAgICAgZW5kcG9zID0gZ2V0YXR0cihzZWxmLnNsaWNlW25dLCAnZW5kbGV4cG9zJywgc3RhcnRwb3MpCisgICAgICAgIHJldHVybiBzdGFydHBvcywgZW5kcG9zCisKKyAgICBkZWYgZXJyb3Ioc2VsZik6CisgICAgICAgIHJhaXNlIFN5bnRheEVycm9yCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTFJQYXJzZXIgPT0KKyMKKyMgVGhlIExSIFBhcnNpbmcgZW5naW5lLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBMUlBhcnNlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbHJ0YWIsIGVycm9yZik6CisgICAgICAgIHNlbGYucHJvZHVjdGlvbnMgPSBscnRhYi5scl9wcm9kdWN0aW9ucworICAgICAgICBzZWxmLmFjdGlvbiA9IGxydGFiLmxyX2FjdGlvbgorICAgICAgICBzZWxmLmdvdG8gPSBscnRhYi5scl9nb3RvCisgICAgICAgIHNlbGYuZXJyb3JmdW5jID0gZXJyb3JmCisgICAgICAgIHNlbGYuc2V0X2RlZmF1bHRlZF9zdGF0ZXMoKQorICAgICAgICBzZWxmLmVycm9yb2sgPSBUcnVlCisKKyAgICBkZWYgZXJyb2soc2VsZik6CisgICAgICAgIHNlbGYuZXJyb3JvayA9IFRydWUKKworICAgIGRlZiByZXN0YXJ0KHNlbGYpOgorICAgICAgICBkZWwgc2VsZi5zdGF0ZXN0YWNrWzpdCisgICAgICAgIGRlbCBzZWxmLnN5bXN0YWNrWzpdCisgICAgICAgIHN5bSA9IFlhY2NTeW1ib2woKQorICAgICAgICBzeW0udHlwZSA9ICckZW5kJworICAgICAgICBzZWxmLnN5bXN0YWNrLmFwcGVuZChzeW0pCisgICAgICAgIHNlbGYuc3RhdGVzdGFjay5hcHBlbmQoMCkKKworICAgICMgRGVmYXVsdGVkIHN0YXRlIHN1cHBvcnQuCisgICAgIyBUaGlzIG1ldGhvZCBpZGVudGlmaWVzIHBhcnNlciBzdGF0ZXMgd2hlcmUgdGhlcmUgaXMgb25seSBvbmUgcG9zc2libGUgcmVkdWN0aW9uIGFjdGlvbi4KKyAgICAjIEZvciBzdWNoIHN0YXRlcywgdGhlIHBhcnNlciBjYW4gbWFrZSBhIGNob29zZSB0byBtYWtlIGEgcnVsZSByZWR1Y3Rpb24gd2l0aG91dCBjb25zdW1pbmcKKyAgICAjIHRoZSBuZXh0IGxvb2stYWhlYWQgdG9rZW4uICBUaGlzIGRlbGF5ZWQgaW52b2NhdGlvbiBvZiB0aGUgdG9rZW5pemVyIGNhbiBiZSB1c2VmdWwgaW4KKyAgICAjIGNlcnRhaW4ga2luZHMgb2YgYWR2YW5jZWQgcGFyc2luZyBzaXR1YXRpb25zIHdoZXJlIHRoZSBsZXhlciBhbmQgcGFyc2VyIGludGVyYWN0IHdpdGgKKyAgICAjIGVhY2ggb3RoZXIgb3IgY2hhbmdlIHN0YXRlcyAoaS5lLiwgbWFuaXB1bGF0aW9uIG9mIHNjb3BlLCBsZXhlciBzdGF0ZXMsIGV0Yy4pLgorICAgICMKKyAgICAjIFNlZTogIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9iaXNvbi9tYW51YWwvaHRtbF9ub2RlL0RlZmF1bHQtUmVkdWN0aW9ucy5odG1sI0RlZmF1bHQtUmVkdWN0aW9ucworICAgIGRlZiBzZXRfZGVmYXVsdGVkX3N0YXRlcyhzZWxmKToKKyAgICAgICAgc2VsZi5kZWZhdWx0ZWRfc3RhdGVzID0ge30KKyAgICAgICAgZm9yIHN0YXRlLCBhY3Rpb25zIGluIHNlbGYuYWN0aW9uLml0ZW1zKCk6CisgICAgICAgICAgICBydWxlcyA9IGxpc3QoYWN0aW9ucy52YWx1ZXMoKSkKKyAgICAgICAgICAgIGlmIGxlbihydWxlcykgPT0gMSBhbmQgcnVsZXNbMF0gPCAwOgorICAgICAgICAgICAgICAgIHNlbGYuZGVmYXVsdGVkX3N0YXRlc1tzdGF0ZV0gPSBydWxlc1swXQorCisgICAgZGVmIGRpc2FibGVfZGVmYXVsdGVkX3N0YXRlcyhzZWxmKToKKyAgICAgICAgc2VsZi5kZWZhdWx0ZWRfc3RhdGVzID0ge30KKworICAgIGRlZiBwYXJzZShzZWxmLCBpbnB1dD1Ob25lLCBsZXhlcj1Ob25lLCBkZWJ1Zz1GYWxzZSwgdHJhY2tpbmc9RmFsc2UsIHRva2VuZnVuYz1Ob25lKToKKyAgICAgICAgaWYgZGVidWcgb3IgeWFjY2RldmVsOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkZWJ1ZywgaW50KToKKyAgICAgICAgICAgICAgICBkZWJ1ZyA9IFBseUxvZ2dlcihzeXMuc3RkZXJyKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VkZWJ1ZyhpbnB1dCwgbGV4ZXIsIGRlYnVnLCB0cmFja2luZywgdG9rZW5mdW5jKQorICAgICAgICBlbGlmIHRyYWNraW5nOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VvcHQoaW5wdXQsIGxleGVyLCBkZWJ1ZywgdHJhY2tpbmcsIHRva2VuZnVuYykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlb3B0X25vdHJhY2soaW5wdXQsIGxleGVyLCBkZWJ1ZywgdHJhY2tpbmcsIHRva2VuZnVuYykKKworCisgICAgIyAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorICAgICMgcGFyc2VkZWJ1ZygpLgorICAgICMKKyAgICAjIFRoaXMgaXMgdGhlIGRlYnVnZ2luZyBlbmFibGVkIHZlcnNpb24gb2YgcGFyc2UoKS4gIEFsbCBjaGFuZ2VzIG1hZGUgdG8gdGhlCisgICAgIyBwYXJzaW5nIGVuZ2luZSBzaG91bGQgYmUgbWFkZSBoZXJlLiAgIE9wdGltaXplZCB2ZXJzaW9ucyBvZiB0aGlzIGZ1bmN0aW9uCisgICAgIyBhcmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGJ5IHRoZSBwbHkveWdlbi5weSBzY3JpcHQuICBUaGlzIHNjcmlwdCBjdXRzIG91dAorICAgICMgc2VjdGlvbnMgZW5jbG9zZWQgaW4gbWFya2VycyBzdWNoIGFzIHRoaXM6CisgICAgIworICAgICMgICAgICAjLS0hIERFQlVHCisgICAgIyAgICAgIHN0YXRlbWVudHMKKyAgICAjICAgICAgIy0tISBERUJVRworICAgICMKKyAgICAjICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisKKyAgICBkZWYgcGFyc2VkZWJ1ZyhzZWxmLCBpbnB1dD1Ob25lLCBsZXhlcj1Ob25lLCBkZWJ1Zz1GYWxzZSwgdHJhY2tpbmc9RmFsc2UsIHRva2VuZnVuYz1Ob25lKToKKyAgICAgICAgIy0tISBwYXJzZWRlYnVnLXN0YXJ0CisgICAgICAgIGxvb2thaGVhZCA9IE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgIyBDdXJyZW50IGxvb2thaGVhZCBzeW1ib2wKKyAgICAgICAgbG9va2FoZWFkc3RhY2sgPSBbXSAgICAgICAgICAgICAgICAgICAgICAjIFN0YWNrIG9mIGxvb2thaGVhZCBzeW1ib2xzCisgICAgICAgIGFjdGlvbnMgPSBzZWxmLmFjdGlvbiAgICAgICAgICAgICAgICAgICAgIyBMb2NhbCByZWZlcmVuY2UgdG8gYWN0aW9uIHRhYmxlICh0byBhdm9pZCBsb29rdXAgb24gc2VsZi4pCisgICAgICAgIGdvdG8gICAgPSBzZWxmLmdvdG8gICAgICAgICAgICAgICAgICAgICAgIyBMb2NhbCByZWZlcmVuY2UgdG8gZ290byB0YWJsZSAodG8gYXZvaWQgbG9va3VwIG9uIHNlbGYuKQorICAgICAgICBwcm9kICAgID0gc2VsZi5wcm9kdWN0aW9ucyAgICAgICAgICAgICAgICMgTG9jYWwgcmVmZXJlbmNlIHRvIHByb2R1Y3Rpb24gbGlzdCAodG8gYXZvaWQgbG9va3VwIG9uIHNlbGYuKQorICAgICAgICBkZWZhdWx0ZWRfc3RhdGVzID0gc2VsZi5kZWZhdWx0ZWRfc3RhdGVzICMgTG9jYWwgcmVmZXJlbmNlIHRvIGRlZmF1bHRlZCBzdGF0ZXMKKyAgICAgICAgcHNsaWNlICA9IFlhY2NQcm9kdWN0aW9uKE5vbmUpICAgICAgICAgICAjIFByb2R1Y3Rpb24gb2JqZWN0IHBhc3NlZCB0byBncmFtbWFyIHJ1bGVzCisgICAgICAgIGVycm9yY291bnQgPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBVc2VkIGR1cmluZyBlcnJvciByZWNvdmVyeQorCisgICAgICAgICMtLSEgREVCVUcKKyAgICAgICAgZGVidWcuaW5mbygnUExZOiBQQVJTRSBERUJVRyBTVEFSVCcpCisgICAgICAgICMtLSEgREVCVUcKKworICAgICAgICAjIElmIG5vIGxleGVyIHdhcyBnaXZlbiwgd2Ugd2lsbCB0cnkgdG8gdXNlIHRoZSBsZXggbW9kdWxlCisgICAgICAgIGlmIG5vdCBsZXhlcjoKKyAgICAgICAgICAgIGZyb20gLiBpbXBvcnQgbGV4CisgICAgICAgICAgICBsZXhlciA9IGxleC5sZXhlcgorCisgICAgICAgICMgU2V0IHVwIHRoZSBsZXhlciBhbmQgcGFyc2VyIG9iamVjdHMgb24gcHNsaWNlCisgICAgICAgIHBzbGljZS5sZXhlciA9IGxleGVyCisgICAgICAgIHBzbGljZS5wYXJzZXIgPSBzZWxmCisKKyAgICAgICAgIyBJZiBpbnB1dCB3YXMgc3VwcGxpZWQsIHBhc3MgdG8gbGV4ZXIKKyAgICAgICAgaWYgaW5wdXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBsZXhlci5pbnB1dChpbnB1dCkKKworICAgICAgICBpZiB0b2tlbmZ1bmMgaXMgTm9uZToKKyAgICAgICAgICAgICMgVG9rZW5pemUgZnVuY3Rpb24KKyAgICAgICAgICAgIGdldF90b2tlbiA9IGxleGVyLnRva2VuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBnZXRfdG9rZW4gPSB0b2tlbmZ1bmMKKworICAgICAgICAjIFNldCB0aGUgcGFyc2VyKCkgdG9rZW4gbWV0aG9kIChzb21ldGltZXMgdXNlZCBpbiBlcnJvciByZWNvdmVyeSkKKyAgICAgICAgc2VsZi50b2tlbiA9IGdldF90b2tlbgorCisgICAgICAgICMgU2V0IHVwIHRoZSBzdGF0ZSBhbmQgc3ltYm9sIHN0YWNrcworCisgICAgICAgIHN0YXRlc3RhY2sgPSBbXSAgICAgICAgICAgICAgICAjIFN0YWNrIG9mIHBhcnNpbmcgc3RhdGVzCisgICAgICAgIHNlbGYuc3RhdGVzdGFjayA9IHN0YXRlc3RhY2sKKyAgICAgICAgc3ltc3RhY2sgICA9IFtdICAgICAgICAgICAgICAgICMgU3RhY2sgb2YgZ3JhbW1hciBzeW1ib2xzCisgICAgICAgIHNlbGYuc3ltc3RhY2sgPSBzeW1zdGFjaworCisgICAgICAgIHBzbGljZS5zdGFjayA9IHN5bXN0YWNrICAgICAgICAgIyBQdXQgaW4gdGhlIHByb2R1Y3Rpb24KKyAgICAgICAgZXJydG9rZW4gICA9IE5vbmUgICAgICAgICAgICAgICAjIEVyciB0b2tlbgorCisgICAgICAgICMgVGhlIHN0YXJ0IHN0YXRlIGlzIGFzc3VtZWQgdG8gYmUgKDAsJGVuZCkKKworICAgICAgICBzdGF0ZXN0YWNrLmFwcGVuZCgwKQorICAgICAgICBzeW0gPSBZYWNjU3ltYm9sKCkKKyAgICAgICAgc3ltLnR5cGUgPSAnJGVuZCcKKyAgICAgICAgc3ltc3RhY2suYXBwZW5kKHN5bSkKKyAgICAgICAgc3RhdGUgPSAwCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAjIEdldCB0aGUgbmV4dCBzeW1ib2wgb24gdGhlIGlucHV0LiAgSWYgYSBsb29rYWhlYWQgc3ltYm9sCisgICAgICAgICAgICAjIGlzIGFscmVhZHkgc2V0LCB3ZSBqdXN0IHVzZSB0aGF0LiBPdGhlcndpc2UsIHdlJ2xsIHB1bGwKKyAgICAgICAgICAgICMgdGhlIG5leHQgdG9rZW4gb2ZmIG9mIHRoZSBsb29rYWhlYWRzdGFjayBvciBmcm9tIHRoZSBsZXhlcgorCisgICAgICAgICAgICAjLS0hIERFQlVHCisgICAgICAgICAgICBkZWJ1Zy5kZWJ1ZygnJykKKyAgICAgICAgICAgIGRlYnVnLmRlYnVnKCdTdGF0ZSAgOiAlcycsIHN0YXRlKQorICAgICAgICAgICAgIy0tISBERUJVRworCisgICAgICAgICAgICBpZiBzdGF0ZSBub3QgaW4gZGVmYXVsdGVkX3N0YXRlczoKKyAgICAgICAgICAgICAgICBpZiBub3QgbG9va2FoZWFkOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgbG9va2FoZWFkc3RhY2s6CisgICAgICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSBnZXRfdG9rZW4oKSAgICAgIyBHZXQgdGhlIG5leHQgdG9rZW4KKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IGxvb2thaGVhZHN0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBsb29rYWhlYWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSBZYWNjU3ltYm9sKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZC50eXBlID0gJyRlbmQnCisKKyAgICAgICAgICAgICAgICAjIENoZWNrIHRoZSBhY3Rpb24gdGFibGUKKyAgICAgICAgICAgICAgICBsdHlwZSA9IGxvb2thaGVhZC50eXBlCisgICAgICAgICAgICAgICAgdCA9IGFjdGlvbnNbc3RhdGVdLmdldChsdHlwZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdCA9IGRlZmF1bHRlZF9zdGF0ZXNbc3RhdGVdCisgICAgICAgICAgICAgICAgIy0tISBERUJVRworICAgICAgICAgICAgICAgIGRlYnVnLmRlYnVnKCdEZWZhdWx0ZWQgc3RhdGUgJXM6IFJlZHVjZSB1c2luZyAlZCcsIHN0YXRlLCAtdCkKKyAgICAgICAgICAgICAgICAjLS0hIERFQlVHCisKKyAgICAgICAgICAgICMtLSEgREVCVUcKKyAgICAgICAgICAgIGRlYnVnLmRlYnVnKCdTdGFjayAgOiAlcycsCisgICAgICAgICAgICAgICAgICAgICAgICAoJyVzIC4gJXMnICUgKCcgJy5qb2luKFt4eC50eXBlIGZvciB4eCBpbiBzeW1zdGFja11bMTpdKSwgc3RyKGxvb2thaGVhZCkpKS5sc3RyaXAoKSkKKyAgICAgICAgICAgICMtLSEgREVCVUcKKworICAgICAgICAgICAgaWYgdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBpZiB0ID4gMDoKKyAgICAgICAgICAgICAgICAgICAgIyBzaGlmdCBhIHN5bWJvbCBvbiB0aGUgc3RhY2sKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVzdGFjay5hcHBlbmQodCkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSB0CisKKyAgICAgICAgICAgICAgICAgICAgIy0tISBERUJVRworICAgICAgICAgICAgICAgICAgICBkZWJ1Zy5kZWJ1ZygnQWN0aW9uIDogU2hpZnQgYW5kIGdvdG8gc3RhdGUgJXMnLCB0KQorICAgICAgICAgICAgICAgICAgICAjLS0hIERFQlVHCisKKyAgICAgICAgICAgICAgICAgICAgc3ltc3RhY2suYXBwZW5kKGxvb2thaGVhZCkKKyAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkID0gTm9uZQorCisgICAgICAgICAgICAgICAgICAgICMgRGVjcmVhc2UgZXJyb3IgY291bnQgb24gc3VjY2Vzc2Z1bCBzaGlmdAorICAgICAgICAgICAgICAgICAgICBpZiBlcnJvcmNvdW50OgorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Jjb3VudCAtPSAxCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBpZiB0IDwgMDoKKyAgICAgICAgICAgICAgICAgICAgIyByZWR1Y2UgYSBzeW1ib2wgb24gdGhlIHN0YWNrLCBlbWl0IGEgcHJvZHVjdGlvbgorICAgICAgICAgICAgICAgICAgICBwID0gcHJvZFstdF0KKyAgICAgICAgICAgICAgICAgICAgcG5hbWUgPSBwLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgcGxlbiAgPSBwLmxlbgorCisgICAgICAgICAgICAgICAgICAgICMgR2V0IHByb2R1Y3Rpb24gZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgc3ltID0gWWFjY1N5bWJvbCgpCisgICAgICAgICAgICAgICAgICAgIHN5bS50eXBlID0gcG5hbWUgICAgICAgIyBQcm9kdWN0aW9uIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgc3ltLnZhbHVlID0gTm9uZQorCisgICAgICAgICAgICAgICAgICAgICMtLSEgREVCVUcKKyAgICAgICAgICAgICAgICAgICAgaWYgcGxlbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnLmluZm8oJ0FjdGlvbiA6IFJlZHVjZSBydWxlIFslc10gd2l0aCAlcyBhbmQgZ290byBzdGF0ZSAlZCcsIHAuc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWycrJywnLmpvaW4oW2Zvcm1hdF9zdGFja19lbnRyeShfdi52YWx1ZSkgZm9yIF92IGluIHN5bXN0YWNrWy1wbGVuOl1dKSsnXScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG9bc3RhdGVzdGFja1stMS1wbGVuXV1bcG5hbWVdKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcuaW5mbygnQWN0aW9uIDogUmVkdWNlIHJ1bGUgWyVzXSB3aXRoICVzIGFuZCBnb3RvIHN0YXRlICVkJywgcC5zdHIsIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvW3N0YXRlc3RhY2tbLTFdXVtwbmFtZV0pCisKKyAgICAgICAgICAgICAgICAgICAgIy0tISBERUJVRworCisgICAgICAgICAgICAgICAgICAgIGlmIHBsZW46CisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnID0gc3ltc3RhY2tbLXBsZW4tMTpdCisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnWzBdID0gc3ltCisKKyAgICAgICAgICAgICAgICAgICAgICAgICMtLSEgVFJBQ0tJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRyYWNraW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxID0gdGFyZ1sxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bS5saW5lbm8gPSB0MS5saW5lbm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0ubGV4cG9zID0gdDEubGV4cG9zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDEgPSB0YXJnWy0xXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bS5lbmRsaW5lbm8gPSBnZXRhdHRyKHQxLCAnZW5kbGluZW5vJywgdDEubGluZW5vKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bS5lbmRsZXhwb3MgPSBnZXRhdHRyKHQxLCAnZW5kbGV4cG9zJywgdDEubGV4cG9zKQorICAgICAgICAgICAgICAgICAgICAgICAgIy0tISBUUkFDS0lORworCisgICAgICAgICAgICAgICAgICAgICAgICAjICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBjb2RlIGVuY2xvc2VkIGluIHRoaXMgc2VjdGlvbiBpcyBkdXBsaWNhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAjIGJlbG93IGFzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLiAgTWFrZSBzdXJlCisgICAgICAgICAgICAgICAgICAgICAgICAjIGNoYW5nZXMgZ2V0IG1hZGUgaW4gYm90aCBsb2NhdGlvbnMuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzbGljZS5zbGljZSA9IHRhcmcKKworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQ2FsbCB0aGUgZ3JhbW1hciBydWxlIHdpdGggb3VyIHNwZWNpYWwgc2xpY2Ugb2JqZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsIHN5bXN0YWNrWy1wbGVuOl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmNhbGxhYmxlKHBzbGljZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWwgc3RhdGVzdGFja1stcGxlbjpdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIy0tISBERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnLmluZm8oJ1Jlc3VsdCA6ICVzJywgZm9ybWF0X3Jlc3VsdChwc2xpY2VbMF0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMtLSEgREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1zdGFjay5hcHBlbmQoc3ltKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gZ290b1tzdGF0ZXN0YWNrWy0xXV1bcG5hbWVdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzdGFjay5hcHBlbmQoc3RhdGUpCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3ludGF4RXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBJZiBhbiBlcnJvciB3YXMgc2V0LiBFbnRlciBlcnJvciByZWNvdmVyeSBzdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZHN0YWNrLmFwcGVuZChsb29rYWhlYWQpICAgICMgU2F2ZSB0aGUgY3VycmVudCBsb29rYWhlYWQgdG9rZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1zdGFjay5leHRlbmQodGFyZ1sxOi0xXSkgICAgICAgICAjIFB1dCB0aGUgcHJvZHVjdGlvbiBzbGljZSBiYWNrIG9uIHRoZSBzdGFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlc3RhY2sucG9wKCkgICAgICAgICAgICAgICAgICAgICMgUG9wIGJhY2sgb25lIHN0YXRlIChiZWZvcmUgdGhlIHJlZHVjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlc3RhY2tbLTFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltLnR5cGUgPSAnZXJyb3InCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltLnZhbHVlID0gJ2Vycm9yJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IHN5bQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yY291bnQgPSBlcnJvcl9jb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JvayA9IEZhbHNlCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAjICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKworICAgICAgICAgICAgICAgICAgICAgICAgIy0tISBUUkFDS0lORworICAgICAgICAgICAgICAgICAgICAgICAgaWYgdHJhY2tpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltLmxpbmVubyA9IGxleGVyLmxpbmVubworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bS5sZXhwb3MgPSBsZXhlci5sZXhwb3MKKyAgICAgICAgICAgICAgICAgICAgICAgICMtLSEgVFJBQ0tJTkcKKworICAgICAgICAgICAgICAgICAgICAgICAgdGFyZyA9IFtzeW1dCisKKyAgICAgICAgICAgICAgICAgICAgICAgICMgISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIGNvZGUgZW5jbG9zZWQgaW4gdGhpcyBzZWN0aW9uIGlzIGR1cGxpY2F0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICMgYWJvdmUgYXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uICBNYWtlIHN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICMgY2hhbmdlcyBnZXQgbWFkZSBpbiBib3RoIGxvY2F0aW9ucy4KKworICAgICAgICAgICAgICAgICAgICAgICAgcHNsaWNlLnNsaWNlID0gdGFyZworCisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDYWxsIHRoZSBncmFtbWFyIHJ1bGUgd2l0aCBvdXIgc3BlY2lhbCBzbGljZSBvYmplY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmNhbGxhYmxlKHBzbGljZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjLS0hIERFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcuaW5mbygnUmVzdWx0IDogJXMnLCBmb3JtYXRfcmVzdWx0KHBzbGljZVswXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIy0tISBERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bXN0YWNrLmFwcGVuZChzeW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBnb3RvW3N0YXRlc3RhY2tbLTFdXVtwbmFtZV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXN0YWNrLmFwcGVuZChzdGF0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIElmIGFuIGVycm9yIHdhcyBzZXQuIEVudGVyIGVycm9yIHJlY292ZXJ5IHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkc3RhY2suYXBwZW5kKGxvb2thaGVhZCkgICAgIyBTYXZlIHRoZSBjdXJyZW50IGxvb2thaGVhZCB0b2tlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlc3RhY2sucG9wKCkgICAgICAgICAgICAgICAgICAgICMgUG9wIGJhY2sgb25lIHN0YXRlIChiZWZvcmUgdGhlIHJlZHVjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlc3RhY2tbLTFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltLnR5cGUgPSAnZXJyb3InCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltLnZhbHVlID0gJ2Vycm9yJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IHN5bQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yY291bnQgPSBlcnJvcl9jb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JvayA9IEZhbHNlCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAjICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisKKyAgICAgICAgICAgICAgICBpZiB0ID09IDA6CisgICAgICAgICAgICAgICAgICAgIG4gPSBzeW1zdGFja1stMV0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0YXR0cihuLCAndmFsdWUnLCBOb25lKQorICAgICAgICAgICAgICAgICAgICAjLS0hIERFQlVHCisgICAgICAgICAgICAgICAgICAgIGRlYnVnLmluZm8oJ0RvbmUgICA6IFJldHVybmluZyAlcycsIGZvcm1hdF9yZXN1bHQocmVzdWx0KSkKKyAgICAgICAgICAgICAgICAgICAgZGVidWcuaW5mbygnUExZOiBQQVJTRSBERUJVRyBFTkQnKQorICAgICAgICAgICAgICAgICAgICAjLS0hIERFQlVHCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQKKworICAgICAgICAgICAgaWYgdCBpcyBOb25lOgorCisgICAgICAgICAgICAgICAgIy0tISBERUJVRworICAgICAgICAgICAgICAgIGRlYnVnLmVycm9yKCdFcnJvciAgOiAlcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCclcyAuICVzJyAlICgnICcuam9pbihbeHgudHlwZSBmb3IgeHggaW4gc3ltc3RhY2tdWzE6XSksIHN0cihsb29rYWhlYWQpKSkubHN0cmlwKCkpCisgICAgICAgICAgICAgICAgIy0tISBERUJVRworCisgICAgICAgICAgICAgICAgIyBXZSBoYXZlIHNvbWUga2luZCBvZiBwYXJzaW5nIGVycm9yIGhlcmUuICBUbyBoYW5kbGUKKyAgICAgICAgICAgICAgICAjIHRoaXMsIHdlIGFyZSBnb2luZyB0byBwdXNoIHRoZSBjdXJyZW50IHRva2VuIG9udG8KKyAgICAgICAgICAgICAgICAjIHRoZSB0b2tlbnN0YWNrIGFuZCByZXBsYWNlIGl0IHdpdGggYW4gJ2Vycm9yJyB0b2tlbi4KKyAgICAgICAgICAgICAgICAjIElmIHRoZXJlIGFyZSBhbnkgc3luY2hyb25pemF0aW9uIHJ1bGVzLCB0aGV5IG1heQorICAgICAgICAgICAgICAgICMgY2F0Y2ggaXQuCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICMgSW4gYWRkaXRpb24gdG8gcHVzaGluZyB0aGUgZXJyb3IgdG9rZW4sIHdlIGNhbGwgY2FsbAorICAgICAgICAgICAgICAgICMgdGhlIHVzZXIgZGVmaW5lZCBwX2Vycm9yKCkgZnVuY3Rpb24gaWYgdGhpcyBpcyB0aGUKKyAgICAgICAgICAgICAgICAjIGZpcnN0IHN5bnRheCBlcnJvci4gIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYKKyAgICAgICAgICAgICAgICAjIGVycm9yY291bnQgPT0gMC4KKyAgICAgICAgICAgICAgICBpZiBlcnJvcmNvdW50ID09IDAgb3Igc2VsZi5lcnJvcm9rOgorICAgICAgICAgICAgICAgICAgICBlcnJvcmNvdW50ID0gZXJyb3JfY291bnQKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcm9rID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgZXJydG9rZW4gPSBsb29rYWhlYWQKKyAgICAgICAgICAgICAgICAgICAgaWYgZXJydG9rZW4udHlwZSA9PSAnJGVuZCc6CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJ0b2tlbiA9IE5vbmUgICAgICAgICAgICAgICAjIEVuZCBvZiBmaWxlIQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmVycm9yZnVuYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVycnRva2VuIGFuZCBub3QgaGFzYXR0cihlcnJ0b2tlbiwgJ2xleGVyJyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJydG9rZW4ubGV4ZXIgPSBsZXhlcgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSBjYWxsX2Vycm9yZnVuYyhzZWxmLmVycm9yZnVuYywgZXJydG9rZW4sIHNlbGYpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmVycm9yb2s6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBVc2VyIG11c3QgaGF2ZSBkb25lIHNvbWUga2luZCBvZiBwYW5pYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbW9kZSByZWNvdmVyeSBvbiB0aGVpciBvd24uICBUaGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJldHVybmVkIHRva2VuIGlzIHRoZSBuZXh0IGxvb2thaGVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IHRvaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycnRva2VuID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBlcnJ0b2tlbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKGVycnRva2VuLCAnbGluZW5vJyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVubyA9IGxvb2thaGVhZC5saW5lbm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm8gPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGluZW5vOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCd5YWNjOiBTeW50YXggZXJyb3IgYXQgbGluZSAlZCwgdG9rZW49JXNcbicgJSAobGluZW5vLCBlcnJ0b2tlbi50eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCd5YWNjOiBTeW50YXggZXJyb3IsIHRva2VuPSVzJyAlIGVycnRva2VuLnR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ3lhY2M6IFBhcnNlIGVycm9yIGluIGlucHV0LiBFT0ZcbicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBlcnJvcmNvdW50ID0gZXJyb3JfY291bnQKKworICAgICAgICAgICAgICAgICMgY2FzZSAxOiAgdGhlIHN0YXRlc3RhY2sgb25seSBoYXMgMSBlbnRyeSBvbiBpdC4gIElmIHdlJ3JlIGluIHRoaXMgc3RhdGUsIHRoZQorICAgICAgICAgICAgICAgICMgZW50aXJlIHBhcnNlIGhhcyBiZWVuIHJvbGxlZCBiYWNrIGFuZCB3ZSdyZSBjb21wbGV0ZWx5IGhvc2VkLiAgIFRoZSB0b2tlbiBpcworICAgICAgICAgICAgICAgICMgZGlzY2FyZGVkIGFuZCB3ZSBqdXN0IGtlZXAgZ29pbmcuCisKKyAgICAgICAgICAgICAgICBpZiBsZW4oc3RhdGVzdGFjaykgPD0gMSBhbmQgbG9va2FoZWFkLnR5cGUgIT0gJyRlbmQnOgorICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSBOb25lCisgICAgICAgICAgICAgICAgICAgIGVycnRva2VuID0gTm9uZQorICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDAKKyAgICAgICAgICAgICAgICAgICAgIyBOdWtlIHRoZSBwdXNoYmFjayBzdGFjaworICAgICAgICAgICAgICAgICAgICBkZWwgbG9va2FoZWFkc3RhY2tbOl0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgICMgY2FzZSAyOiB0aGUgc3RhdGVzdGFjayBoYXMgYSBjb3VwbGUgb2YgZW50cmllcyBvbiBpdCwgYnV0IHdlJ3JlCisgICAgICAgICAgICAgICAgIyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBudWtlIHRoZSB0b3AgZW50cnkgYW5kIGdlbmVyYXRlIGFuIGVycm9yIHRva2VuCisKKyAgICAgICAgICAgICAgICAjIFN0YXJ0IG51a2luZyBlbnRyaWVzIG9uIHRoZSBzdGFjaworICAgICAgICAgICAgICAgIGlmIGxvb2thaGVhZC50eXBlID09ICckZW5kJzoKKyAgICAgICAgICAgICAgICAgICAgIyBXaG9hLiBXZSdyZSByZWFsbHkgaG9zZWQgaGVyZS4gQmFpbCBvdXQKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgICAgICBpZiBsb29rYWhlYWQudHlwZSAhPSAnZXJyb3InOgorICAgICAgICAgICAgICAgICAgICBzeW0gPSBzeW1zdGFja1stMV0KKyAgICAgICAgICAgICAgICAgICAgaWYgc3ltLnR5cGUgPT0gJ2Vycm9yJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgSG1tbS4gRXJyb3IgaXMgb24gdG9wIG9mIHN0YWNrLCB3ZSdsbCBqdXN0IG51a2UgaW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICMgc3ltYm9sIGFuZCBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgIy0tISBUUkFDS0lORworICAgICAgICAgICAgICAgICAgICAgICAgaWYgdHJhY2tpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltLmVuZGxpbmVubyA9IGdldGF0dHIobG9va2FoZWFkLCAnbGluZW5vJywgc3ltLmxpbmVubykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0uZW5kbGV4cG9zID0gZ2V0YXR0cihsb29rYWhlYWQsICdsZXhwb3MnLCBzeW0ubGV4cG9zKQorICAgICAgICAgICAgICAgICAgICAgICAgIy0tISBUUkFDS0lORworICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgICAgICAjIENyZWF0ZSB0aGUgZXJyb3Igc3ltYm9sIGZvciB0aGUgZmlyc3QgdGltZSBhbmQgbWFrZSBpdCB0aGUgbmV3IGxvb2thaGVhZCBzeW1ib2wKKyAgICAgICAgICAgICAgICAgICAgdCA9IFlhY2NTeW1ib2woKQorICAgICAgICAgICAgICAgICAgICB0LnR5cGUgPSAnZXJyb3InCisKKyAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihsb29rYWhlYWQsICdsaW5lbm8nKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHQubGluZW5vID0gdC5lbmRsaW5lbm8gPSBsb29rYWhlYWQubGluZW5vCisgICAgICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIobG9va2FoZWFkLCAnbGV4cG9zJyk6CisgICAgICAgICAgICAgICAgICAgICAgICB0LmxleHBvcyA9IHQuZW5kbGV4cG9zID0gbG9va2FoZWFkLmxleHBvcworICAgICAgICAgICAgICAgICAgICB0LnZhbHVlID0gbG9va2FoZWFkCisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZHN0YWNrLmFwcGVuZChsb29rYWhlYWQpCisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IHQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzeW0gPSBzeW1zdGFjay5wb3AoKQorICAgICAgICAgICAgICAgICAgICAjLS0hIFRSQUNLSU5HCisgICAgICAgICAgICAgICAgICAgIGlmIHRyYWNraW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkLmxpbmVubyA9IHN5bS5saW5lbm8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZC5sZXhwb3MgPSBzeW0ubGV4cG9zCisgICAgICAgICAgICAgICAgICAgICMtLSEgVFJBQ0tJTkcKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVzdGFjay5wb3AoKQorICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlc3RhY2tbLTFdCisKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIENhbGwgYW4gZXJyb3IgZnVuY3Rpb24gaGVyZQorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCd5YWNjOiBpbnRlcm5hbCBwYXJzZXIgZXJyb3IhISFcbicpCisKKyAgICAgICAgIy0tISBwYXJzZWRlYnVnLWVuZAorCisgICAgIyAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorICAgICMgcGFyc2VvcHQoKS4KKyAgICAjCisgICAgIyBPcHRpbWl6ZWQgdmVyc2lvbiBvZiBwYXJzZSgpIG1ldGhvZC4gIERPIE5PVCBFRElUIFRISVMgQ09ERSBESVJFQ1RMWSEKKyAgICAjIFRoaXMgY29kZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgcGx5L3lnZW4ucHkgc2NyaXB0LiBNYWtlCisgICAgIyBjaGFuZ2VzIHRvIHRoZSBwYXJzZWRlYnVnKCkgbWV0aG9kIGluc3RlYWQuCisgICAgIyAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorCisgICAgZGVmIHBhcnNlb3B0KHNlbGYsIGlucHV0PU5vbmUsIGxleGVyPU5vbmUsIGRlYnVnPUZhbHNlLCB0cmFja2luZz1GYWxzZSwgdG9rZW5mdW5jPU5vbmUpOgorICAgICAgICAjLS0hIHBhcnNlb3B0LXN0YXJ0CisgICAgICAgIGxvb2thaGVhZCA9IE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgIyBDdXJyZW50IGxvb2thaGVhZCBzeW1ib2wKKyAgICAgICAgbG9va2FoZWFkc3RhY2sgPSBbXSAgICAgICAgICAgICAgICAgICAgICAjIFN0YWNrIG9mIGxvb2thaGVhZCBzeW1ib2xzCisgICAgICAgIGFjdGlvbnMgPSBzZWxmLmFjdGlvbiAgICAgICAgICAgICAgICAgICAgIyBMb2NhbCByZWZlcmVuY2UgdG8gYWN0aW9uIHRhYmxlICh0byBhdm9pZCBsb29rdXAgb24gc2VsZi4pCisgICAgICAgIGdvdG8gICAgPSBzZWxmLmdvdG8gICAgICAgICAgICAgICAgICAgICAgIyBMb2NhbCByZWZlcmVuY2UgdG8gZ290byB0YWJsZSAodG8gYXZvaWQgbG9va3VwIG9uIHNlbGYuKQorICAgICAgICBwcm9kICAgID0gc2VsZi5wcm9kdWN0aW9ucyAgICAgICAgICAgICAgICMgTG9jYWwgcmVmZXJlbmNlIHRvIHByb2R1Y3Rpb24gbGlzdCAodG8gYXZvaWQgbG9va3VwIG9uIHNlbGYuKQorICAgICAgICBkZWZhdWx0ZWRfc3RhdGVzID0gc2VsZi5kZWZhdWx0ZWRfc3RhdGVzICMgTG9jYWwgcmVmZXJlbmNlIHRvIGRlZmF1bHRlZCBzdGF0ZXMKKyAgICAgICAgcHNsaWNlICA9IFlhY2NQcm9kdWN0aW9uKE5vbmUpICAgICAgICAgICAjIFByb2R1Y3Rpb24gb2JqZWN0IHBhc3NlZCB0byBncmFtbWFyIHJ1bGVzCisgICAgICAgIGVycm9yY291bnQgPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBVc2VkIGR1cmluZyBlcnJvciByZWNvdmVyeQorCisKKyAgICAgICAgIyBJZiBubyBsZXhlciB3YXMgZ2l2ZW4sIHdlIHdpbGwgdHJ5IHRvIHVzZSB0aGUgbGV4IG1vZHVsZQorICAgICAgICBpZiBub3QgbGV4ZXI6CisgICAgICAgICAgICBmcm9tIC4gaW1wb3J0IGxleAorICAgICAgICAgICAgbGV4ZXIgPSBsZXgubGV4ZXIKKworICAgICAgICAjIFNldCB1cCB0aGUgbGV4ZXIgYW5kIHBhcnNlciBvYmplY3RzIG9uIHBzbGljZQorICAgICAgICBwc2xpY2UubGV4ZXIgPSBsZXhlcgorICAgICAgICBwc2xpY2UucGFyc2VyID0gc2VsZgorCisgICAgICAgICMgSWYgaW5wdXQgd2FzIHN1cHBsaWVkLCBwYXNzIHRvIGxleGVyCisgICAgICAgIGlmIGlucHV0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbGV4ZXIuaW5wdXQoaW5wdXQpCisKKyAgICAgICAgaWYgdG9rZW5mdW5jIGlzIE5vbmU6CisgICAgICAgICAgICAjIFRva2VuaXplIGZ1bmN0aW9uCisgICAgICAgICAgICBnZXRfdG9rZW4gPSBsZXhlci50b2tlbgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZ2V0X3Rva2VuID0gdG9rZW5mdW5jCisKKyAgICAgICAgIyBTZXQgdGhlIHBhcnNlcigpIHRva2VuIG1ldGhvZCAoc29tZXRpbWVzIHVzZWQgaW4gZXJyb3IgcmVjb3ZlcnkpCisgICAgICAgIHNlbGYudG9rZW4gPSBnZXRfdG9rZW4KKworICAgICAgICAjIFNldCB1cCB0aGUgc3RhdGUgYW5kIHN5bWJvbCBzdGFja3MKKworICAgICAgICBzdGF0ZXN0YWNrID0gW10gICAgICAgICAgICAgICAgIyBTdGFjayBvZiBwYXJzaW5nIHN0YXRlcworICAgICAgICBzZWxmLnN0YXRlc3RhY2sgPSBzdGF0ZXN0YWNrCisgICAgICAgIHN5bXN0YWNrICAgPSBbXSAgICAgICAgICAgICAgICAjIFN0YWNrIG9mIGdyYW1tYXIgc3ltYm9scworICAgICAgICBzZWxmLnN5bXN0YWNrID0gc3ltc3RhY2sKKworICAgICAgICBwc2xpY2Uuc3RhY2sgPSBzeW1zdGFjayAgICAgICAgICMgUHV0IGluIHRoZSBwcm9kdWN0aW9uCisgICAgICAgIGVycnRva2VuICAgPSBOb25lICAgICAgICAgICAgICAgIyBFcnIgdG9rZW4KKworICAgICAgICAjIFRoZSBzdGFydCBzdGF0ZSBpcyBhc3N1bWVkIHRvIGJlICgwLCRlbmQpCisKKyAgICAgICAgc3RhdGVzdGFjay5hcHBlbmQoMCkKKyAgICAgICAgc3ltID0gWWFjY1N5bWJvbCgpCisgICAgICAgIHN5bS50eXBlID0gJyRlbmQnCisgICAgICAgIHN5bXN0YWNrLmFwcGVuZChzeW0pCisgICAgICAgIHN0YXRlID0gMAorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgIyBHZXQgdGhlIG5leHQgc3ltYm9sIG9uIHRoZSBpbnB1dC4gIElmIGEgbG9va2FoZWFkIHN5bWJvbAorICAgICAgICAgICAgIyBpcyBhbHJlYWR5IHNldCwgd2UganVzdCB1c2UgdGhhdC4gT3RoZXJ3aXNlLCB3ZSdsbCBwdWxsCisgICAgICAgICAgICAjIHRoZSBuZXh0IHRva2VuIG9mZiBvZiB0aGUgbG9va2FoZWFkc3RhY2sgb3IgZnJvbSB0aGUgbGV4ZXIKKworCisgICAgICAgICAgICBpZiBzdGF0ZSBub3QgaW4gZGVmYXVsdGVkX3N0YXRlczoKKyAgICAgICAgICAgICAgICBpZiBub3QgbG9va2FoZWFkOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgbG9va2FoZWFkc3RhY2s6CisgICAgICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSBnZXRfdG9rZW4oKSAgICAgIyBHZXQgdGhlIG5leHQgdG9rZW4KKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IGxvb2thaGVhZHN0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBsb29rYWhlYWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSBZYWNjU3ltYm9sKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZC50eXBlID0gJyRlbmQnCisKKyAgICAgICAgICAgICAgICAjIENoZWNrIHRoZSBhY3Rpb24gdGFibGUKKyAgICAgICAgICAgICAgICBsdHlwZSA9IGxvb2thaGVhZC50eXBlCisgICAgICAgICAgICAgICAgdCA9IGFjdGlvbnNbc3RhdGVdLmdldChsdHlwZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdCA9IGRlZmF1bHRlZF9zdGF0ZXNbc3RhdGVdCisKKworICAgICAgICAgICAgaWYgdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBpZiB0ID4gMDoKKyAgICAgICAgICAgICAgICAgICAgIyBzaGlmdCBhIHN5bWJvbCBvbiB0aGUgc3RhY2sKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVzdGFjay5hcHBlbmQodCkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSB0CisKKworICAgICAgICAgICAgICAgICAgICBzeW1zdGFjay5hcHBlbmQobG9va2FoZWFkKQorICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSBOb25lCisKKyAgICAgICAgICAgICAgICAgICAgIyBEZWNyZWFzZSBlcnJvciBjb3VudCBvbiBzdWNjZXNzZnVsIHNoaWZ0CisgICAgICAgICAgICAgICAgICAgIGlmIGVycm9yY291bnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcmNvdW50IC09IDEKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIGlmIHQgPCAwOgorICAgICAgICAgICAgICAgICAgICAjIHJlZHVjZSBhIHN5bWJvbCBvbiB0aGUgc3RhY2ssIGVtaXQgYSBwcm9kdWN0aW9uCisgICAgICAgICAgICAgICAgICAgIHAgPSBwcm9kWy10XQorICAgICAgICAgICAgICAgICAgICBwbmFtZSA9IHAubmFtZQorICAgICAgICAgICAgICAgICAgICBwbGVuICA9IHAubGVuCisKKyAgICAgICAgICAgICAgICAgICAgIyBHZXQgcHJvZHVjdGlvbiBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICBzeW0gPSBZYWNjU3ltYm9sKCkKKyAgICAgICAgICAgICAgICAgICAgc3ltLnR5cGUgPSBwbmFtZSAgICAgICAjIFByb2R1Y3Rpb24gbmFtZQorICAgICAgICAgICAgICAgICAgICBzeW0udmFsdWUgPSBOb25lCisKKworICAgICAgICAgICAgICAgICAgICBpZiBwbGVuOgorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZyA9IHN5bXN0YWNrWy1wbGVuLTE6XQorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ1swXSA9IHN5bQorCisgICAgICAgICAgICAgICAgICAgICAgICAjLS0hIFRSQUNLSU5HCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0cmFja2luZzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MSA9IHRhcmdbMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0ubGluZW5vID0gdDEubGluZW5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltLmxleHBvcyA9IHQxLmxleHBvcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxID0gdGFyZ1stMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0uZW5kbGluZW5vID0gZ2V0YXR0cih0MSwgJ2VuZGxpbmVubycsIHQxLmxpbmVubykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0uZW5kbGV4cG9zID0gZ2V0YXR0cih0MSwgJ2VuZGxleHBvcycsIHQxLmxleHBvcykKKyAgICAgICAgICAgICAgICAgICAgICAgICMtLSEgVFJBQ0tJTkcKKworICAgICAgICAgICAgICAgICAgICAgICAgIyAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgY29kZSBlbmNsb3NlZCBpbiB0aGlzIHNlY3Rpb24gaXMgZHVwbGljYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgIyBiZWxvdyBhcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbi4gIE1ha2Ugc3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGFuZ2VzIGdldCBtYWRlIGluIGJvdGggbG9jYXRpb25zLgorCisgICAgICAgICAgICAgICAgICAgICAgICBwc2xpY2Uuc2xpY2UgPSB0YXJnCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENhbGwgdGhlIGdyYW1tYXIgcnVsZSB3aXRoIG91ciBzcGVjaWFsIHNsaWNlIG9iamVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBzeW1zdGFja1stcGxlbjpdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5jYWxsYWJsZShwc2xpY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsIHN0YXRlc3RhY2tbLXBsZW46XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bXN0YWNrLmFwcGVuZChzeW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBnb3RvW3N0YXRlc3RhY2tbLTFdXVtwbmFtZV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXN0YWNrLmFwcGVuZChzdGF0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIElmIGFuIGVycm9yIHdhcyBzZXQuIEVudGVyIGVycm9yIHJlY292ZXJ5IHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkc3RhY2suYXBwZW5kKGxvb2thaGVhZCkgICAgIyBTYXZlIHRoZSBjdXJyZW50IGxvb2thaGVhZCB0b2tlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bXN0YWNrLmV4dGVuZCh0YXJnWzE6LTFdKSAgICAgICAgICMgUHV0IHRoZSBwcm9kdWN0aW9uIHNsaWNlIGJhY2sgb24gdGhlIHN0YWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzdGFjay5wb3AoKSAgICAgICAgICAgICAgICAgICAgIyBQb3AgYmFjayBvbmUgc3RhdGUgKGJlZm9yZSB0aGUgcmVkdWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhdGVzdGFja1stMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0udHlwZSA9ICdlcnJvcicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0udmFsdWUgPSAnZXJyb3InCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkID0gc3ltCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Jjb3VudCA9IGVycm9yX2NvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcm9rID0gRmFsc2UKKworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgICMgISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKworICAgICAgICAgICAgICAgICAgICBlbHNlOgorCisgICAgICAgICAgICAgICAgICAgICAgICAjLS0hIFRSQUNLSU5HCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0cmFja2luZzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0ubGluZW5vID0gbGV4ZXIubGluZW5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltLmxleHBvcyA9IGxleGVyLmxleHBvcworICAgICAgICAgICAgICAgICAgICAgICAgIy0tISBUUkFDS0lORworCisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnID0gW3N5bV0KKworICAgICAgICAgICAgICAgICAgICAgICAgIyAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgY29kZSBlbmNsb3NlZCBpbiB0aGlzIHNlY3Rpb24gaXMgZHVwbGljYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgIyBhYm92ZSBhcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbi4gIE1ha2Ugc3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGFuZ2VzIGdldCBtYWRlIGluIGJvdGggbG9jYXRpb25zLgorCisgICAgICAgICAgICAgICAgICAgICAgICBwc2xpY2Uuc2xpY2UgPSB0YXJnCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENhbGwgdGhlIGdyYW1tYXIgcnVsZSB3aXRoIG91ciBzcGVjaWFsIHNsaWNlIG9iamVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuY2FsbGFibGUocHNsaWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bXN0YWNrLmFwcGVuZChzeW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBnb3RvW3N0YXRlc3RhY2tbLTFdXVtwbmFtZV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXN0YWNrLmFwcGVuZChzdGF0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIElmIGFuIGVycm9yIHdhcyBzZXQuIEVudGVyIGVycm9yIHJlY292ZXJ5IHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkc3RhY2suYXBwZW5kKGxvb2thaGVhZCkgICAgIyBTYXZlIHRoZSBjdXJyZW50IGxvb2thaGVhZCB0b2tlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlc3RhY2sucG9wKCkgICAgICAgICAgICAgICAgICAgICMgUG9wIGJhY2sgb25lIHN0YXRlIChiZWZvcmUgdGhlIHJlZHVjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlc3RhY2tbLTFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltLnR5cGUgPSAnZXJyb3InCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltLnZhbHVlID0gJ2Vycm9yJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IHN5bQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yY291bnQgPSBlcnJvcl9jb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JvayA9IEZhbHNlCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAjICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisKKyAgICAgICAgICAgICAgICBpZiB0ID09IDA6CisgICAgICAgICAgICAgICAgICAgIG4gPSBzeW1zdGFja1stMV0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0YXR0cihuLCAndmFsdWUnLCBOb25lKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICAgICAgICAgIGlmIHQgaXMgTm9uZToKKworCisgICAgICAgICAgICAgICAgIyBXZSBoYXZlIHNvbWUga2luZCBvZiBwYXJzaW5nIGVycm9yIGhlcmUuICBUbyBoYW5kbGUKKyAgICAgICAgICAgICAgICAjIHRoaXMsIHdlIGFyZSBnb2luZyB0byBwdXNoIHRoZSBjdXJyZW50IHRva2VuIG9udG8KKyAgICAgICAgICAgICAgICAjIHRoZSB0b2tlbnN0YWNrIGFuZCByZXBsYWNlIGl0IHdpdGggYW4gJ2Vycm9yJyB0b2tlbi4KKyAgICAgICAgICAgICAgICAjIElmIHRoZXJlIGFyZSBhbnkgc3luY2hyb25pemF0aW9uIHJ1bGVzLCB0aGV5IG1heQorICAgICAgICAgICAgICAgICMgY2F0Y2ggaXQuCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICMgSW4gYWRkaXRpb24gdG8gcHVzaGluZyB0aGUgZXJyb3IgdG9rZW4sIHdlIGNhbGwgY2FsbAorICAgICAgICAgICAgICAgICMgdGhlIHVzZXIgZGVmaW5lZCBwX2Vycm9yKCkgZnVuY3Rpb24gaWYgdGhpcyBpcyB0aGUKKyAgICAgICAgICAgICAgICAjIGZpcnN0IHN5bnRheCBlcnJvci4gIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYKKyAgICAgICAgICAgICAgICAjIGVycm9yY291bnQgPT0gMC4KKyAgICAgICAgICAgICAgICBpZiBlcnJvcmNvdW50ID09IDAgb3Igc2VsZi5lcnJvcm9rOgorICAgICAgICAgICAgICAgICAgICBlcnJvcmNvdW50ID0gZXJyb3JfY291bnQKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcm9rID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgZXJydG9rZW4gPSBsb29rYWhlYWQKKyAgICAgICAgICAgICAgICAgICAgaWYgZXJydG9rZW4udHlwZSA9PSAnJGVuZCc6CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJ0b2tlbiA9IE5vbmUgICAgICAgICAgICAgICAjIEVuZCBvZiBmaWxlIQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmVycm9yZnVuYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVycnRva2VuIGFuZCBub3QgaGFzYXR0cihlcnJ0b2tlbiwgJ2xleGVyJyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJydG9rZW4ubGV4ZXIgPSBsZXhlcgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSBjYWxsX2Vycm9yZnVuYyhzZWxmLmVycm9yZnVuYywgZXJydG9rZW4sIHNlbGYpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmVycm9yb2s6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBVc2VyIG11c3QgaGF2ZSBkb25lIHNvbWUga2luZCBvZiBwYW5pYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbW9kZSByZWNvdmVyeSBvbiB0aGVpciBvd24uICBUaGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJldHVybmVkIHRva2VuIGlzIHRoZSBuZXh0IGxvb2thaGVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IHRvaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycnRva2VuID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBlcnJ0b2tlbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKGVycnRva2VuLCAnbGluZW5vJyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVubyA9IGxvb2thaGVhZC5saW5lbm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm8gPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGluZW5vOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCd5YWNjOiBTeW50YXggZXJyb3IgYXQgbGluZSAlZCwgdG9rZW49JXNcbicgJSAobGluZW5vLCBlcnJ0b2tlbi50eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCd5YWNjOiBTeW50YXggZXJyb3IsIHRva2VuPSVzJyAlIGVycnRva2VuLnR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ3lhY2M6IFBhcnNlIGVycm9yIGluIGlucHV0LiBFT0ZcbicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBlcnJvcmNvdW50ID0gZXJyb3JfY291bnQKKworICAgICAgICAgICAgICAgICMgY2FzZSAxOiAgdGhlIHN0YXRlc3RhY2sgb25seSBoYXMgMSBlbnRyeSBvbiBpdC4gIElmIHdlJ3JlIGluIHRoaXMgc3RhdGUsIHRoZQorICAgICAgICAgICAgICAgICMgZW50aXJlIHBhcnNlIGhhcyBiZWVuIHJvbGxlZCBiYWNrIGFuZCB3ZSdyZSBjb21wbGV0ZWx5IGhvc2VkLiAgIFRoZSB0b2tlbiBpcworICAgICAgICAgICAgICAgICMgZGlzY2FyZGVkIGFuZCB3ZSBqdXN0IGtlZXAgZ29pbmcuCisKKyAgICAgICAgICAgICAgICBpZiBsZW4oc3RhdGVzdGFjaykgPD0gMSBhbmQgbG9va2FoZWFkLnR5cGUgIT0gJyRlbmQnOgorICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSBOb25lCisgICAgICAgICAgICAgICAgICAgIGVycnRva2VuID0gTm9uZQorICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDAKKyAgICAgICAgICAgICAgICAgICAgIyBOdWtlIHRoZSBwdXNoYmFjayBzdGFjaworICAgICAgICAgICAgICAgICAgICBkZWwgbG9va2FoZWFkc3RhY2tbOl0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgICMgY2FzZSAyOiB0aGUgc3RhdGVzdGFjayBoYXMgYSBjb3VwbGUgb2YgZW50cmllcyBvbiBpdCwgYnV0IHdlJ3JlCisgICAgICAgICAgICAgICAgIyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBudWtlIHRoZSB0b3AgZW50cnkgYW5kIGdlbmVyYXRlIGFuIGVycm9yIHRva2VuCisKKyAgICAgICAgICAgICAgICAjIFN0YXJ0IG51a2luZyBlbnRyaWVzIG9uIHRoZSBzdGFjaworICAgICAgICAgICAgICAgIGlmIGxvb2thaGVhZC50eXBlID09ICckZW5kJzoKKyAgICAgICAgICAgICAgICAgICAgIyBXaG9hLiBXZSdyZSByZWFsbHkgaG9zZWQgaGVyZS4gQmFpbCBvdXQKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgICAgICBpZiBsb29rYWhlYWQudHlwZSAhPSAnZXJyb3InOgorICAgICAgICAgICAgICAgICAgICBzeW0gPSBzeW1zdGFja1stMV0KKyAgICAgICAgICAgICAgICAgICAgaWYgc3ltLnR5cGUgPT0gJ2Vycm9yJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgSG1tbS4gRXJyb3IgaXMgb24gdG9wIG9mIHN0YWNrLCB3ZSdsbCBqdXN0IG51a2UgaW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICMgc3ltYm9sIGFuZCBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgIy0tISBUUkFDS0lORworICAgICAgICAgICAgICAgICAgICAgICAgaWYgdHJhY2tpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltLmVuZGxpbmVubyA9IGdldGF0dHIobG9va2FoZWFkLCAnbGluZW5vJywgc3ltLmxpbmVubykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0uZW5kbGV4cG9zID0gZ2V0YXR0cihsb29rYWhlYWQsICdsZXhwb3MnLCBzeW0ubGV4cG9zKQorICAgICAgICAgICAgICAgICAgICAgICAgIy0tISBUUkFDS0lORworICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgICAgICAjIENyZWF0ZSB0aGUgZXJyb3Igc3ltYm9sIGZvciB0aGUgZmlyc3QgdGltZSBhbmQgbWFrZSBpdCB0aGUgbmV3IGxvb2thaGVhZCBzeW1ib2wKKyAgICAgICAgICAgICAgICAgICAgdCA9IFlhY2NTeW1ib2woKQorICAgICAgICAgICAgICAgICAgICB0LnR5cGUgPSAnZXJyb3InCisKKyAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihsb29rYWhlYWQsICdsaW5lbm8nKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHQubGluZW5vID0gdC5lbmRsaW5lbm8gPSBsb29rYWhlYWQubGluZW5vCisgICAgICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIobG9va2FoZWFkLCAnbGV4cG9zJyk6CisgICAgICAgICAgICAgICAgICAgICAgICB0LmxleHBvcyA9IHQuZW5kbGV4cG9zID0gbG9va2FoZWFkLmxleHBvcworICAgICAgICAgICAgICAgICAgICB0LnZhbHVlID0gbG9va2FoZWFkCisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZHN0YWNrLmFwcGVuZChsb29rYWhlYWQpCisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IHQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzeW0gPSBzeW1zdGFjay5wb3AoKQorICAgICAgICAgICAgICAgICAgICAjLS0hIFRSQUNLSU5HCisgICAgICAgICAgICAgICAgICAgIGlmIHRyYWNraW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkLmxpbmVubyA9IHN5bS5saW5lbm8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZC5sZXhwb3MgPSBzeW0ubGV4cG9zCisgICAgICAgICAgICAgICAgICAgICMtLSEgVFJBQ0tJTkcKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVzdGFjay5wb3AoKQorICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlc3RhY2tbLTFdCisKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIENhbGwgYW4gZXJyb3IgZnVuY3Rpb24gaGVyZQorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCd5YWNjOiBpbnRlcm5hbCBwYXJzZXIgZXJyb3IhISFcbicpCisKKyAgICAgICAgIy0tISBwYXJzZW9wdC1lbmQKKworICAgICMgISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyAgICAjIHBhcnNlb3B0X25vdHJhY2soKS4KKyAgICAjCisgICAgIyBPcHRpbWl6ZWQgdmVyc2lvbiBvZiBwYXJzZW9wdCgpIHdpdGggbGluZSBudW1iZXIgdHJhY2tpbmcgcmVtb3ZlZC4KKyAgICAjIERPIE5PVCBFRElUIFRISVMgQ09ERSBESVJFQ1RMWS4gVGhpcyBjb2RlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisgICAgIyBieSB0aGUgcGx5L3lnZW4ucHkgc2NyaXB0LiBNYWtlIGNoYW5nZXMgdG8gdGhlIHBhcnNlZGVidWcoKSBtZXRob2QgaW5zdGVhZC4KKyAgICAjICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisKKyAgICBkZWYgcGFyc2VvcHRfbm90cmFjayhzZWxmLCBpbnB1dD1Ob25lLCBsZXhlcj1Ob25lLCBkZWJ1Zz1GYWxzZSwgdHJhY2tpbmc9RmFsc2UsIHRva2VuZnVuYz1Ob25lKToKKyAgICAgICAgIy0tISBwYXJzZW9wdC1ub3RyYWNrLXN0YXJ0CisgICAgICAgIGxvb2thaGVhZCA9IE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgIyBDdXJyZW50IGxvb2thaGVhZCBzeW1ib2wKKyAgICAgICAgbG9va2FoZWFkc3RhY2sgPSBbXSAgICAgICAgICAgICAgICAgICAgICAjIFN0YWNrIG9mIGxvb2thaGVhZCBzeW1ib2xzCisgICAgICAgIGFjdGlvbnMgPSBzZWxmLmFjdGlvbiAgICAgICAgICAgICAgICAgICAgIyBMb2NhbCByZWZlcmVuY2UgdG8gYWN0aW9uIHRhYmxlICh0byBhdm9pZCBsb29rdXAgb24gc2VsZi4pCisgICAgICAgIGdvdG8gICAgPSBzZWxmLmdvdG8gICAgICAgICAgICAgICAgICAgICAgIyBMb2NhbCByZWZlcmVuY2UgdG8gZ290byB0YWJsZSAodG8gYXZvaWQgbG9va3VwIG9uIHNlbGYuKQorICAgICAgICBwcm9kICAgID0gc2VsZi5wcm9kdWN0aW9ucyAgICAgICAgICAgICAgICMgTG9jYWwgcmVmZXJlbmNlIHRvIHByb2R1Y3Rpb24gbGlzdCAodG8gYXZvaWQgbG9va3VwIG9uIHNlbGYuKQorICAgICAgICBkZWZhdWx0ZWRfc3RhdGVzID0gc2VsZi5kZWZhdWx0ZWRfc3RhdGVzICMgTG9jYWwgcmVmZXJlbmNlIHRvIGRlZmF1bHRlZCBzdGF0ZXMKKyAgICAgICAgcHNsaWNlICA9IFlhY2NQcm9kdWN0aW9uKE5vbmUpICAgICAgICAgICAjIFByb2R1Y3Rpb24gb2JqZWN0IHBhc3NlZCB0byBncmFtbWFyIHJ1bGVzCisgICAgICAgIGVycm9yY291bnQgPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBVc2VkIGR1cmluZyBlcnJvciByZWNvdmVyeQorCisKKyAgICAgICAgIyBJZiBubyBsZXhlciB3YXMgZ2l2ZW4sIHdlIHdpbGwgdHJ5IHRvIHVzZSB0aGUgbGV4IG1vZHVsZQorICAgICAgICBpZiBub3QgbGV4ZXI6CisgICAgICAgICAgICBmcm9tIC4gaW1wb3J0IGxleAorICAgICAgICAgICAgbGV4ZXIgPSBsZXgubGV4ZXIKKworICAgICAgICAjIFNldCB1cCB0aGUgbGV4ZXIgYW5kIHBhcnNlciBvYmplY3RzIG9uIHBzbGljZQorICAgICAgICBwc2xpY2UubGV4ZXIgPSBsZXhlcgorICAgICAgICBwc2xpY2UucGFyc2VyID0gc2VsZgorCisgICAgICAgICMgSWYgaW5wdXQgd2FzIHN1cHBsaWVkLCBwYXNzIHRvIGxleGVyCisgICAgICAgIGlmIGlucHV0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbGV4ZXIuaW5wdXQoaW5wdXQpCisKKyAgICAgICAgaWYgdG9rZW5mdW5jIGlzIE5vbmU6CisgICAgICAgICAgICAjIFRva2VuaXplIGZ1bmN0aW9uCisgICAgICAgICAgICBnZXRfdG9rZW4gPSBsZXhlci50b2tlbgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZ2V0X3Rva2VuID0gdG9rZW5mdW5jCisKKyAgICAgICAgIyBTZXQgdGhlIHBhcnNlcigpIHRva2VuIG1ldGhvZCAoc29tZXRpbWVzIHVzZWQgaW4gZXJyb3IgcmVjb3ZlcnkpCisgICAgICAgIHNlbGYudG9rZW4gPSBnZXRfdG9rZW4KKworICAgICAgICAjIFNldCB1cCB0aGUgc3RhdGUgYW5kIHN5bWJvbCBzdGFja3MKKworICAgICAgICBzdGF0ZXN0YWNrID0gW10gICAgICAgICAgICAgICAgIyBTdGFjayBvZiBwYXJzaW5nIHN0YXRlcworICAgICAgICBzZWxmLnN0YXRlc3RhY2sgPSBzdGF0ZXN0YWNrCisgICAgICAgIHN5bXN0YWNrICAgPSBbXSAgICAgICAgICAgICAgICAjIFN0YWNrIG9mIGdyYW1tYXIgc3ltYm9scworICAgICAgICBzZWxmLnN5bXN0YWNrID0gc3ltc3RhY2sKKworICAgICAgICBwc2xpY2Uuc3RhY2sgPSBzeW1zdGFjayAgICAgICAgICMgUHV0IGluIHRoZSBwcm9kdWN0aW9uCisgICAgICAgIGVycnRva2VuICAgPSBOb25lICAgICAgICAgICAgICAgIyBFcnIgdG9rZW4KKworICAgICAgICAjIFRoZSBzdGFydCBzdGF0ZSBpcyBhc3N1bWVkIHRvIGJlICgwLCRlbmQpCisKKyAgICAgICAgc3RhdGVzdGFjay5hcHBlbmQoMCkKKyAgICAgICAgc3ltID0gWWFjY1N5bWJvbCgpCisgICAgICAgIHN5bS50eXBlID0gJyRlbmQnCisgICAgICAgIHN5bXN0YWNrLmFwcGVuZChzeW0pCisgICAgICAgIHN0YXRlID0gMAorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgIyBHZXQgdGhlIG5leHQgc3ltYm9sIG9uIHRoZSBpbnB1dC4gIElmIGEgbG9va2FoZWFkIHN5bWJvbAorICAgICAgICAgICAgIyBpcyBhbHJlYWR5IHNldCwgd2UganVzdCB1c2UgdGhhdC4gT3RoZXJ3aXNlLCB3ZSdsbCBwdWxsCisgICAgICAgICAgICAjIHRoZSBuZXh0IHRva2VuIG9mZiBvZiB0aGUgbG9va2FoZWFkc3RhY2sgb3IgZnJvbSB0aGUgbGV4ZXIKKworCisgICAgICAgICAgICBpZiBzdGF0ZSBub3QgaW4gZGVmYXVsdGVkX3N0YXRlczoKKyAgICAgICAgICAgICAgICBpZiBub3QgbG9va2FoZWFkOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgbG9va2FoZWFkc3RhY2s6CisgICAgICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSBnZXRfdG9rZW4oKSAgICAgIyBHZXQgdGhlIG5leHQgdG9rZW4KKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IGxvb2thaGVhZHN0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBsb29rYWhlYWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSBZYWNjU3ltYm9sKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZC50eXBlID0gJyRlbmQnCisKKyAgICAgICAgICAgICAgICAjIENoZWNrIHRoZSBhY3Rpb24gdGFibGUKKyAgICAgICAgICAgICAgICBsdHlwZSA9IGxvb2thaGVhZC50eXBlCisgICAgICAgICAgICAgICAgdCA9IGFjdGlvbnNbc3RhdGVdLmdldChsdHlwZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdCA9IGRlZmF1bHRlZF9zdGF0ZXNbc3RhdGVdCisKKworICAgICAgICAgICAgaWYgdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBpZiB0ID4gMDoKKyAgICAgICAgICAgICAgICAgICAgIyBzaGlmdCBhIHN5bWJvbCBvbiB0aGUgc3RhY2sKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVzdGFjay5hcHBlbmQodCkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSB0CisKKworICAgICAgICAgICAgICAgICAgICBzeW1zdGFjay5hcHBlbmQobG9va2FoZWFkKQorICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSBOb25lCisKKyAgICAgICAgICAgICAgICAgICAgIyBEZWNyZWFzZSBlcnJvciBjb3VudCBvbiBzdWNjZXNzZnVsIHNoaWZ0CisgICAgICAgICAgICAgICAgICAgIGlmIGVycm9yY291bnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcmNvdW50IC09IDEKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIGlmIHQgPCAwOgorICAgICAgICAgICAgICAgICAgICAjIHJlZHVjZSBhIHN5bWJvbCBvbiB0aGUgc3RhY2ssIGVtaXQgYSBwcm9kdWN0aW9uCisgICAgICAgICAgICAgICAgICAgIHAgPSBwcm9kWy10XQorICAgICAgICAgICAgICAgICAgICBwbmFtZSA9IHAubmFtZQorICAgICAgICAgICAgICAgICAgICBwbGVuICA9IHAubGVuCisKKyAgICAgICAgICAgICAgICAgICAgIyBHZXQgcHJvZHVjdGlvbiBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICBzeW0gPSBZYWNjU3ltYm9sKCkKKyAgICAgICAgICAgICAgICAgICAgc3ltLnR5cGUgPSBwbmFtZSAgICAgICAjIFByb2R1Y3Rpb24gbmFtZQorICAgICAgICAgICAgICAgICAgICBzeW0udmFsdWUgPSBOb25lCisKKworICAgICAgICAgICAgICAgICAgICBpZiBwbGVuOgorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZyA9IHN5bXN0YWNrWy1wbGVuLTE6XQorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ1swXSA9IHN5bQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICMgISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIGNvZGUgZW5jbG9zZWQgaW4gdGhpcyBzZWN0aW9uIGlzIGR1cGxpY2F0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICMgYmVsb3cgYXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uICBNYWtlIHN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICMgY2hhbmdlcyBnZXQgbWFkZSBpbiBib3RoIGxvY2F0aW9ucy4KKworICAgICAgICAgICAgICAgICAgICAgICAgcHNsaWNlLnNsaWNlID0gdGFyZworCisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDYWxsIHRoZSBncmFtbWFyIHJ1bGUgd2l0aCBvdXIgc3BlY2lhbCBzbGljZSBvYmplY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWwgc3ltc3RhY2tbLXBsZW46XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuY2FsbGFibGUocHNsaWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBzdGF0ZXN0YWNrWy1wbGVuOl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1zdGFjay5hcHBlbmQoc3ltKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gZ290b1tzdGF0ZXN0YWNrWy0xXV1bcG5hbWVdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzdGFjay5hcHBlbmQoc3RhdGUpCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3ludGF4RXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBJZiBhbiBlcnJvciB3YXMgc2V0LiBFbnRlciBlcnJvciByZWNvdmVyeSBzdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZHN0YWNrLmFwcGVuZChsb29rYWhlYWQpICAgICMgU2F2ZSB0aGUgY3VycmVudCBsb29rYWhlYWQgdG9rZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1zdGFjay5leHRlbmQodGFyZ1sxOi0xXSkgICAgICAgICAjIFB1dCB0aGUgcHJvZHVjdGlvbiBzbGljZSBiYWNrIG9uIHRoZSBzdGFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlc3RhY2sucG9wKCkgICAgICAgICAgICAgICAgICAgICMgUG9wIGJhY2sgb25lIHN0YXRlIChiZWZvcmUgdGhlIHJlZHVjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlc3RhY2tbLTFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltLnR5cGUgPSAnZXJyb3InCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltLnZhbHVlID0gJ2Vycm9yJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IHN5bQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yY291bnQgPSBlcnJvcl9jb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JvayA9IEZhbHNlCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAjICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKworCisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnID0gW3N5bV0KKworICAgICAgICAgICAgICAgICAgICAgICAgIyAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgY29kZSBlbmNsb3NlZCBpbiB0aGlzIHNlY3Rpb24gaXMgZHVwbGljYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgIyBhYm92ZSBhcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbi4gIE1ha2Ugc3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGFuZ2VzIGdldCBtYWRlIGluIGJvdGggbG9jYXRpb25zLgorCisgICAgICAgICAgICAgICAgICAgICAgICBwc2xpY2Uuc2xpY2UgPSB0YXJnCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENhbGwgdGhlIGdyYW1tYXIgcnVsZSB3aXRoIG91ciBzcGVjaWFsIHNsaWNlIG9iamVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuY2FsbGFibGUocHNsaWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bXN0YWNrLmFwcGVuZChzeW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBnb3RvW3N0YXRlc3RhY2tbLTFdXVtwbmFtZV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXN0YWNrLmFwcGVuZChzdGF0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIElmIGFuIGVycm9yIHdhcyBzZXQuIEVudGVyIGVycm9yIHJlY292ZXJ5IHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkc3RhY2suYXBwZW5kKGxvb2thaGVhZCkgICAgIyBTYXZlIHRoZSBjdXJyZW50IGxvb2thaGVhZCB0b2tlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlc3RhY2sucG9wKCkgICAgICAgICAgICAgICAgICAgICMgUG9wIGJhY2sgb25lIHN0YXRlIChiZWZvcmUgdGhlIHJlZHVjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlc3RhY2tbLTFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltLnR5cGUgPSAnZXJyb3InCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltLnZhbHVlID0gJ2Vycm9yJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IHN5bQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yY291bnQgPSBlcnJvcl9jb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JvayA9IEZhbHNlCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAjICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisKKyAgICAgICAgICAgICAgICBpZiB0ID09IDA6CisgICAgICAgICAgICAgICAgICAgIG4gPSBzeW1zdGFja1stMV0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0YXR0cihuLCAndmFsdWUnLCBOb25lKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICAgICAgICAgIGlmIHQgaXMgTm9uZToKKworCisgICAgICAgICAgICAgICAgIyBXZSBoYXZlIHNvbWUga2luZCBvZiBwYXJzaW5nIGVycm9yIGhlcmUuICBUbyBoYW5kbGUKKyAgICAgICAgICAgICAgICAjIHRoaXMsIHdlIGFyZSBnb2luZyB0byBwdXNoIHRoZSBjdXJyZW50IHRva2VuIG9udG8KKyAgICAgICAgICAgICAgICAjIHRoZSB0b2tlbnN0YWNrIGFuZCByZXBsYWNlIGl0IHdpdGggYW4gJ2Vycm9yJyB0b2tlbi4KKyAgICAgICAgICAgICAgICAjIElmIHRoZXJlIGFyZSBhbnkgc3luY2hyb25pemF0aW9uIHJ1bGVzLCB0aGV5IG1heQorICAgICAgICAgICAgICAgICMgY2F0Y2ggaXQuCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICMgSW4gYWRkaXRpb24gdG8gcHVzaGluZyB0aGUgZXJyb3IgdG9rZW4sIHdlIGNhbGwgY2FsbAorICAgICAgICAgICAgICAgICMgdGhlIHVzZXIgZGVmaW5lZCBwX2Vycm9yKCkgZnVuY3Rpb24gaWYgdGhpcyBpcyB0aGUKKyAgICAgICAgICAgICAgICAjIGZpcnN0IHN5bnRheCBlcnJvci4gIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYKKyAgICAgICAgICAgICAgICAjIGVycm9yY291bnQgPT0gMC4KKyAgICAgICAgICAgICAgICBpZiBlcnJvcmNvdW50ID09IDAgb3Igc2VsZi5lcnJvcm9rOgorICAgICAgICAgICAgICAgICAgICBlcnJvcmNvdW50ID0gZXJyb3JfY291bnQKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcm9rID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgZXJydG9rZW4gPSBsb29rYWhlYWQKKyAgICAgICAgICAgICAgICAgICAgaWYgZXJydG9rZW4udHlwZSA9PSAnJGVuZCc6CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJ0b2tlbiA9IE5vbmUgICAgICAgICAgICAgICAjIEVuZCBvZiBmaWxlIQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmVycm9yZnVuYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVycnRva2VuIGFuZCBub3QgaGFzYXR0cihlcnJ0b2tlbiwgJ2xleGVyJyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJydG9rZW4ubGV4ZXIgPSBsZXhlcgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSBjYWxsX2Vycm9yZnVuYyhzZWxmLmVycm9yZnVuYywgZXJydG9rZW4sIHNlbGYpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmVycm9yb2s6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBVc2VyIG11c3QgaGF2ZSBkb25lIHNvbWUga2luZCBvZiBwYW5pYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbW9kZSByZWNvdmVyeSBvbiB0aGVpciBvd24uICBUaGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJldHVybmVkIHRva2VuIGlzIHRoZSBuZXh0IGxvb2thaGVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IHRvaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycnRva2VuID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBlcnJ0b2tlbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKGVycnRva2VuLCAnbGluZW5vJyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVubyA9IGxvb2thaGVhZC5saW5lbm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm8gPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGluZW5vOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCd5YWNjOiBTeW50YXggZXJyb3IgYXQgbGluZSAlZCwgdG9rZW49JXNcbicgJSAobGluZW5vLCBlcnJ0b2tlbi50eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCd5YWNjOiBTeW50YXggZXJyb3IsIHRva2VuPSVzJyAlIGVycnRva2VuLnR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ3lhY2M6IFBhcnNlIGVycm9yIGluIGlucHV0LiBFT0ZcbicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBlcnJvcmNvdW50ID0gZXJyb3JfY291bnQKKworICAgICAgICAgICAgICAgICMgY2FzZSAxOiAgdGhlIHN0YXRlc3RhY2sgb25seSBoYXMgMSBlbnRyeSBvbiBpdC4gIElmIHdlJ3JlIGluIHRoaXMgc3RhdGUsIHRoZQorICAgICAgICAgICAgICAgICMgZW50aXJlIHBhcnNlIGhhcyBiZWVuIHJvbGxlZCBiYWNrIGFuZCB3ZSdyZSBjb21wbGV0ZWx5IGhvc2VkLiAgIFRoZSB0b2tlbiBpcworICAgICAgICAgICAgICAgICMgZGlzY2FyZGVkIGFuZCB3ZSBqdXN0IGtlZXAgZ29pbmcuCisKKyAgICAgICAgICAgICAgICBpZiBsZW4oc3RhdGVzdGFjaykgPD0gMSBhbmQgbG9va2FoZWFkLnR5cGUgIT0gJyRlbmQnOgorICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSBOb25lCisgICAgICAgICAgICAgICAgICAgIGVycnRva2VuID0gTm9uZQorICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDAKKyAgICAgICAgICAgICAgICAgICAgIyBOdWtlIHRoZSBwdXNoYmFjayBzdGFjaworICAgICAgICAgICAgICAgICAgICBkZWwgbG9va2FoZWFkc3RhY2tbOl0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgICMgY2FzZSAyOiB0aGUgc3RhdGVzdGFjayBoYXMgYSBjb3VwbGUgb2YgZW50cmllcyBvbiBpdCwgYnV0IHdlJ3JlCisgICAgICAgICAgICAgICAgIyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBudWtlIHRoZSB0b3AgZW50cnkgYW5kIGdlbmVyYXRlIGFuIGVycm9yIHRva2VuCisKKyAgICAgICAgICAgICAgICAjIFN0YXJ0IG51a2luZyBlbnRyaWVzIG9uIHRoZSBzdGFjaworICAgICAgICAgICAgICAgIGlmIGxvb2thaGVhZC50eXBlID09ICckZW5kJzoKKyAgICAgICAgICAgICAgICAgICAgIyBXaG9hLiBXZSdyZSByZWFsbHkgaG9zZWQgaGVyZS4gQmFpbCBvdXQKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgICAgICBpZiBsb29rYWhlYWQudHlwZSAhPSAnZXJyb3InOgorICAgICAgICAgICAgICAgICAgICBzeW0gPSBzeW1zdGFja1stMV0KKyAgICAgICAgICAgICAgICAgICAgaWYgc3ltLnR5cGUgPT0gJ2Vycm9yJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgSG1tbS4gRXJyb3IgaXMgb24gdG9wIG9mIHN0YWNrLCB3ZSdsbCBqdXN0IG51a2UgaW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICMgc3ltYm9sIGFuZCBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgICAgICAjIENyZWF0ZSB0aGUgZXJyb3Igc3ltYm9sIGZvciB0aGUgZmlyc3QgdGltZSBhbmQgbWFrZSBpdCB0aGUgbmV3IGxvb2thaGVhZCBzeW1ib2wKKyAgICAgICAgICAgICAgICAgICAgdCA9IFlhY2NTeW1ib2woKQorICAgICAgICAgICAgICAgICAgICB0LnR5cGUgPSAnZXJyb3InCisKKyAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihsb29rYWhlYWQsICdsaW5lbm8nKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHQubGluZW5vID0gdC5lbmRsaW5lbm8gPSBsb29rYWhlYWQubGluZW5vCisgICAgICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIobG9va2FoZWFkLCAnbGV4cG9zJyk6CisgICAgICAgICAgICAgICAgICAgICAgICB0LmxleHBvcyA9IHQuZW5kbGV4cG9zID0gbG9va2FoZWFkLmxleHBvcworICAgICAgICAgICAgICAgICAgICB0LnZhbHVlID0gbG9va2FoZWFkCisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZHN0YWNrLmFwcGVuZChsb29rYWhlYWQpCisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IHQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzeW0gPSBzeW1zdGFjay5wb3AoKQorICAgICAgICAgICAgICAgICAgICBzdGF0ZXN0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhdGVzdGFja1stMV0KKworICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICMgQ2FsbCBhbiBlcnJvciBmdW5jdGlvbiBoZXJlCisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ3lhY2M6IGludGVybmFsIHBhcnNlciBlcnJvciEhIVxuJykKKworICAgICAgICAjLS0hIHBhcnNlb3B0LW5vdHJhY2stZW5kCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgICAgICAgICAgICAgICAgICAgICAgICAgID09PSBHcmFtbWFyIFJlcHJlc2VudGF0aW9uID09PQorIworIyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucywgY2xhc3NlcywgYW5kIHZhcmlhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW5kCisjIG1hbmlwdWxhdGUgdGhlIHJ1bGVzIHRoYXQgbWFrZSB1cCBhIGdyYW1tYXIuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgcmVnZXggbWF0Y2hpbmcgaWRlbnRpZmllcnMKK19pc19pZGVudGlmaWVyID0gcmUuY29tcGlsZShyJ15bYS16QS1aMC05Xy1dKyQnKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNsYXNzIFByb2R1Y3Rpb246CisjCisjIFRoaXMgY2xhc3Mgc3RvcmVzIHRoZSByYXcgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgcHJvZHVjdGlvbiBvciBncmFtbWFyIHJ1bGUuCisjIEEgZ3JhbW1hciBydWxlIHJlZmVycyB0byBhIHNwZWNpZmljYXRpb24gc3VjaCBhcyB0aGlzOgorIworIyAgICAgICBleHByIDogZXhwciBQTFVTIHRlcm0KKyMKKyMgSGVyZSBhcmUgdGhlIGJhc2ljIGF0dHJpYnV0ZXMgZGVmaW5lZCBvbiBhbGwgcHJvZHVjdGlvbnMKKyMKKyMgICAgICAgbmFtZSAgICAgLSBOYW1lIG9mIHRoZSBwcm9kdWN0aW9uLiAgRm9yIGV4YW1wbGUgJ2V4cHInCisjICAgICAgIHByb2QgICAgIC0gQSBsaXN0IG9mIHN5bWJvbHMgb24gdGhlIHJpZ2h0IHNpZGUgWydleHByJywnUExVUycsJ3Rlcm0nXQorIyAgICAgICBwcmVjICAgICAtIFByb2R1Y3Rpb24gcHJlY2VkZW5jZSBsZXZlbAorIyAgICAgICBudW1iZXIgICAtIFByb2R1Y3Rpb24gbnVtYmVyLgorIyAgICAgICBmdW5jICAgICAtIEZ1bmN0aW9uIHRoYXQgZXhlY3V0ZXMgb24gcmVkdWNlCisjICAgICAgIGZpbGUgICAgIC0gRmlsZSB3aGVyZSBwcm9kdWN0aW9uIGZ1bmN0aW9uIGlzIGRlZmluZWQKKyMgICAgICAgbGluZW5vICAgLSBMaW5lIG51bWJlciB3aGVyZSBwcm9kdWN0aW9uIGZ1bmN0aW9uIGlzIGRlZmluZWQKKyMKKyMgVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBkZWZpbmVkIG9yIG9wdGlvbmFsLgorIworIyAgICAgICBsZW4gICAgICAgLSBMZW5ndGggb2YgdGhlIHByb2R1Y3Rpb24gKG51bWJlciBvZiBzeW1ib2xzIG9uIHJpZ2h0IGhhbmQgc2lkZSkKKyMgICAgICAgdXN5bXMgICAgIC0gU2V0IG9mIHVuaXF1ZSBzeW1ib2xzIGZvdW5kIGluIHRoZSBwcm9kdWN0aW9uCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFByb2R1Y3Rpb24ob2JqZWN0KToKKyAgICByZWR1Y2VkID0gMAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBudW1iZXIsIG5hbWUsIHByb2QsIHByZWNlZGVuY2U9KCdyaWdodCcsIDApLCBmdW5jPU5vbmUsIGZpbGU9JycsIGxpbmU9MCk6CisgICAgICAgIHNlbGYubmFtZSAgICAgPSBuYW1lCisgICAgICAgIHNlbGYucHJvZCAgICAgPSB0dXBsZShwcm9kKQorICAgICAgICBzZWxmLm51bWJlciAgID0gbnVtYmVyCisgICAgICAgIHNlbGYuZnVuYyAgICAgPSBmdW5jCisgICAgICAgIHNlbGYuY2FsbGFibGUgPSBOb25lCisgICAgICAgIHNlbGYuZmlsZSAgICAgPSBmaWxlCisgICAgICAgIHNlbGYubGluZSAgICAgPSBsaW5lCisgICAgICAgIHNlbGYucHJlYyAgICAgPSBwcmVjZWRlbmNlCisKKyAgICAgICAgIyBJbnRlcm5hbCBzZXR0aW5ncyB1c2VkIGR1cmluZyB0YWJsZSBjb25zdHJ1Y3Rpb24KKworICAgICAgICBzZWxmLmxlbiAgPSBsZW4oc2VsZi5wcm9kKSAgICMgTGVuZ3RoIG9mIHRoZSBwcm9kdWN0aW9uCisKKyAgICAgICAgIyBDcmVhdGUgYSBsaXN0IG9mIHVuaXF1ZSBwcm9kdWN0aW9uIHN5bWJvbHMgdXNlZCBpbiB0aGUgcHJvZHVjdGlvbgorICAgICAgICBzZWxmLnVzeW1zID0gW10KKyAgICAgICAgZm9yIHMgaW4gc2VsZi5wcm9kOgorICAgICAgICAgICAgaWYgcyBub3QgaW4gc2VsZi51c3ltczoKKyAgICAgICAgICAgICAgICBzZWxmLnVzeW1zLmFwcGVuZChzKQorCisgICAgICAgICMgTGlzdCBvZiBhbGwgTFIgaXRlbXMgZm9yIHRoZSBwcm9kdWN0aW9uCisgICAgICAgIHNlbGYubHJfaXRlbXMgPSBbXQorICAgICAgICBzZWxmLmxyX25leHQgPSBOb25lCisKKyAgICAgICAgIyBDcmVhdGUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24KKyAgICAgICAgaWYgc2VsZi5wcm9kOgorICAgICAgICAgICAgc2VsZi5zdHIgPSAnJXMgLT4gJXMnICUgKHNlbGYubmFtZSwgJyAnLmpvaW4oc2VsZi5wcm9kKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc3RyID0gJyVzIC0+IDxlbXB0eT4nICUgc2VsZi5uYW1lCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc3RyCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAnUHJvZHVjdGlvbignICsgc3RyKHNlbGYpICsgJyknCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLnByb2QpCisKKyAgICBkZWYgX19ub256ZXJvX18oc2VsZik6CisgICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgICByZXR1cm4gc2VsZi5wcm9kW2luZGV4XQorCisgICAgIyBSZXR1cm4gdGhlIG50aCBscl9pdGVtIGZyb20gdGhlIHByb2R1Y3Rpb24gKG9yIE5vbmUgaWYgYXQgdGhlIGVuZCkKKyAgICBkZWYgbHJfaXRlbShzZWxmLCBuKToKKyAgICAgICAgaWYgbiA+IGxlbihzZWxmLnByb2QpOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcCA9IExSSXRlbShzZWxmLCBuKQorICAgICAgICAjIFByZWNvbXB1dGUgdGhlIGxpc3Qgb2YgcHJvZHVjdGlvbnMgaW1tZWRpYXRlbHkgZm9sbG93aW5nLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwLmxyX2FmdGVyID0gUHJvZG5hbWVzW3AucHJvZFtuKzFdXQorICAgICAgICBleGNlcHQgKEluZGV4RXJyb3IsIEtleUVycm9yKToKKyAgICAgICAgICAgIHAubHJfYWZ0ZXIgPSBbXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwLmxyX2JlZm9yZSA9IHAucHJvZFtuLTFdCisgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgcC5scl9iZWZvcmUgPSBOb25lCisgICAgICAgIHJldHVybiBwCisKKyAgICAjIEJpbmQgdGhlIHByb2R1Y3Rpb24gZnVuY3Rpb24gbmFtZSB0byBhIGNhbGxhYmxlCisgICAgZGVmIGJpbmQoc2VsZiwgcGRpY3QpOgorICAgICAgICBpZiBzZWxmLmZ1bmM6CisgICAgICAgICAgICBzZWxmLmNhbGxhYmxlID0gcGRpY3Rbc2VsZi5mdW5jXQorCisjIFRoaXMgY2xhc3Mgc2VydmVzIGFzIGEgbWluaW1hbCBzdGFuZGluIGZvciBQcm9kdWN0aW9uIG9iamVjdHMgd2hlbgorIyByZWFkaW5nIHRhYmxlIGRhdGEgZnJvbSBmaWxlcy4gICBJdCBvbmx5IGNvbnRhaW5zIGluZm9ybWF0aW9uCisjIGFjdHVhbGx5IHVzZWQgYnkgdGhlIExSIHBhcnNpbmcgZW5naW5lLCBwbHVzIHNvbWUgYWRkaXRpb25hbAorIyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCitjbGFzcyBNaW5pUHJvZHVjdGlvbihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHIsIG5hbWUsIGxlbiwgZnVuYywgZmlsZSwgbGluZSk6CisgICAgICAgIHNlbGYubmFtZSAgICAgPSBuYW1lCisgICAgICAgIHNlbGYubGVuICAgICAgPSBsZW4KKyAgICAgICAgc2VsZi5mdW5jICAgICA9IGZ1bmMKKyAgICAgICAgc2VsZi5jYWxsYWJsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5maWxlICAgICA9IGZpbGUKKyAgICAgICAgc2VsZi5saW5lICAgICA9IGxpbmUKKyAgICAgICAgc2VsZi5zdHIgICAgICA9IHN0cgorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnN0cgorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gJ01pbmlQcm9kdWN0aW9uKCVzKScgJSBzZWxmLnN0cgorCisgICAgIyBCaW5kIHRoZSBwcm9kdWN0aW9uIGZ1bmN0aW9uIG5hbWUgdG8gYSBjYWxsYWJsZQorICAgIGRlZiBiaW5kKHNlbGYsIHBkaWN0KToKKyAgICAgICAgaWYgc2VsZi5mdW5jOgorICAgICAgICAgICAgc2VsZi5jYWxsYWJsZSA9IHBkaWN0W3NlbGYuZnVuY10KKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNsYXNzIExSSXRlbQorIworIyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBzcGVjaWZpYyBzdGFnZSBvZiBwYXJzaW5nIGEgcHJvZHVjdGlvbiBydWxlLiAgRm9yCisjIGV4YW1wbGU6CisjCisjICAgICAgIGV4cHIgOiBleHByIC4gUExVUyB0ZXJtCisjCisjIEluIHRoZSBhYm92ZSwgdGhlICIuIiByZXByZXNlbnRzIHRoZSBjdXJyZW50IGxvY2F0aW9uIG9mIHRoZSBwYXJzZS4gIEhlcmUKKyMgYmFzaWMgYXR0cmlidXRlczoKKyMKKyMgICAgICAgbmFtZSAgICAgICAtIE5hbWUgb2YgdGhlIHByb2R1Y3Rpb24uICBGb3IgZXhhbXBsZSAnZXhwcicKKyMgICAgICAgcHJvZCAgICAgICAtIEEgbGlzdCBvZiBzeW1ib2xzIG9uIHRoZSByaWdodCBzaWRlIFsnZXhwcicsJy4nLCAnUExVUycsJ3Rlcm0nXQorIyAgICAgICBudW1iZXIgICAgIC0gUHJvZHVjdGlvbiBudW1iZXIuCisjCisjICAgICAgIGxyX25leHQgICAgICBOZXh0IExSIGl0ZW0uIEV4YW1wbGUsIGlmIHdlIGFyZSAnIGV4cHIgLT4gZXhwciAuIFBMVVMgdGVybScKKyMgICAgICAgICAgICAgICAgICAgIHRoZW4gbHJfbmV4dCByZWZlcnMgdG8gJ2V4cHIgLT4gZXhwciBQTFVTIC4gdGVybScKKyMgICAgICAgbHJfaW5kZXggICAtIExSIGl0ZW0gaW5kZXggKGxvY2F0aW9uIG9mIHRoZSAiLiIpIGluIHRoZSBwcm9kIGxpc3QuCisjICAgICAgIGxvb2thaGVhZHMgLSBMQUxSIGxvb2thaGVhZCBzeW1ib2xzIGZvciB0aGlzIGl0ZW0KKyMgICAgICAgbGVuICAgICAgICAtIExlbmd0aCBvZiB0aGUgcHJvZHVjdGlvbiAobnVtYmVyIG9mIHN5bWJvbHMgb24gcmlnaHQgaGFuZCBzaWRlKQorIyAgICAgICBscl9hZnRlciAgICAtIExpc3Qgb2YgYWxsIHByb2R1Y3Rpb25zIHRoYXQgaW1tZWRpYXRlbHkgZm9sbG93CisjICAgICAgIGxyX2JlZm9yZSAgIC0gR3JhbW1hciBzeW1ib2wgaW1tZWRpYXRlbHkgYmVmb3JlCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIExSSXRlbShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwLCBuKToKKyAgICAgICAgc2VsZi5uYW1lICAgICAgID0gcC5uYW1lCisgICAgICAgIHNlbGYucHJvZCAgICAgICA9IGxpc3QocC5wcm9kKQorICAgICAgICBzZWxmLm51bWJlciAgICAgPSBwLm51bWJlcgorICAgICAgICBzZWxmLmxyX2luZGV4ICAgPSBuCisgICAgICAgIHNlbGYubG9va2FoZWFkcyA9IHt9CisgICAgICAgIHNlbGYucHJvZC5pbnNlcnQobiwgJy4nKQorICAgICAgICBzZWxmLnByb2QgICAgICAgPSB0dXBsZShzZWxmLnByb2QpCisgICAgICAgIHNlbGYubGVuICAgICAgICA9IGxlbihzZWxmLnByb2QpCisgICAgICAgIHNlbGYudXN5bXMgICAgICA9IHAudXN5bXMKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnByb2Q6CisgICAgICAgICAgICBzID0gJyVzIC0+ICVzJyAlIChzZWxmLm5hbWUsICcgJy5qb2luKHNlbGYucHJvZCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzID0gJyVzIC0+IDxlbXB0eT4nICUgc2VsZi5uYW1lCisgICAgICAgIHJldHVybiBzCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAnTFJJdGVtKCcgKyBzdHIoc2VsZikgKyAnKScKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyByaWdodG1vc3RfdGVybWluYWwoKQorIworIyBSZXR1cm4gdGhlIHJpZ2h0bW9zdCB0ZXJtaW5hbCBmcm9tIGEgbGlzdCBvZiBzeW1ib2xzLiAgVXNlZCBpbiBhZGRfcHJvZHVjdGlvbigpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitkZWYgcmlnaHRtb3N0X3Rlcm1pbmFsKHN5bWJvbHMsIHRlcm1pbmFscyk6CisgICAgaSA9IGxlbihzeW1ib2xzKSAtIDEKKyAgICB3aGlsZSBpID49IDA6CisgICAgICAgIGlmIHN5bWJvbHNbaV0gaW4gdGVybWluYWxzOgorICAgICAgICAgICAgcmV0dXJuIHN5bWJvbHNbaV0KKyAgICAgICAgaSAtPSAxCisgICAgcmV0dXJuIE5vbmUKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgID09PSBHUkFNTUFSIENMQVNTID09PQorIworIyBUaGUgZm9sbG93aW5nIGNsYXNzIHJlcHJlc2VudHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgZ3JhbW1hciBhbG9uZworIyB3aXRoIHZhcmlvdXMgY29tcHV0ZWQgcHJvcGVydGllcyBzdWNoIGFzIGZpcnN0IHNldHMsIGZvbGxvdyBzZXRzLCBMUiBpdGVtcywgZXRjLgorIyBUaGlzIGRhdGEgaXMgdXNlZCBmb3IgY3JpdGljYWwgcGFydHMgb2YgdGhlIHRhYmxlIGdlbmVyYXRpb24gcHJvY2VzcyBsYXRlci4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgR3JhbW1hckVycm9yKFlhY2NFcnJvcik6CisgICAgcGFzcworCitjbGFzcyBHcmFtbWFyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlcm1pbmFscyk6CisgICAgICAgIHNlbGYuUHJvZHVjdGlvbnMgID0gW05vbmVdICAjIEEgbGlzdCBvZiBhbGwgb2YgdGhlIHByb2R1Y3Rpb25zLiAgVGhlIGZpcnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGVudHJ5IGlzIGFsd2F5cyByZXNlcnZlZCBmb3IgdGhlIHB1cnBvc2Ugb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYnVpbGRpbmcgYW4gYXVnbWVudGVkIGdyYW1tYXIKKworICAgICAgICBzZWxmLlByb2RuYW1lcyAgICA9IHt9ICAgICAgIyBBIGRpY3Rpb25hcnkgbWFwcGluZyB0aGUgbmFtZXMgb2Ygbm9udGVybWluYWxzIHRvIGEgbGlzdCBvZiBhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcHJvZHVjdGlvbnMgb2YgdGhhdCBub250ZXJtaW5hbC4KKworICAgICAgICBzZWxmLlByb2RtYXAgICAgICA9IHt9ICAgICAgIyBBIGRpY3Rpb25hcnkgdGhhdCBpcyBvbmx5IHVzZWQgdG8gZGV0ZWN0IGR1cGxpY2F0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcm9kdWN0aW9ucy4KKworICAgICAgICBzZWxmLlRlcm1pbmFscyAgICA9IHt9ICAgICAgIyBBIGRpY3Rpb25hcnkgbWFwcGluZyB0aGUgbmFtZXMgb2YgdGVybWluYWwgc3ltYm9scyB0byBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxpc3Qgb2YgdGhlIHJ1bGVzIHdoZXJlIHRoZXkgYXJlIHVzZWQuCisKKyAgICAgICAgZm9yIHRlcm0gaW4gdGVybWluYWxzOgorICAgICAgICAgICAgc2VsZi5UZXJtaW5hbHNbdGVybV0gPSBbXQorCisgICAgICAgIHNlbGYuVGVybWluYWxzWydlcnJvciddID0gW10KKworICAgICAgICBzZWxmLk5vbnRlcm1pbmFscyA9IHt9ICAgICAgIyBBIGRpY3Rpb25hcnkgbWFwcGluZyBuYW1lcyBvZiBub250ZXJtaW5hbHMgdG8gYSBsaXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9mIHJ1bGUgbnVtYmVycyB3aGVyZSB0aGV5IGFyZSB1c2VkLgorCisgICAgICAgIHNlbGYuRmlyc3QgICAgICAgID0ge30gICAgICAjIEEgZGljdGlvbmFyeSBvZiBwcmVjb21wdXRlZCBGSVJTVCh4KSBzeW1ib2xzCisKKyAgICAgICAgc2VsZi5Gb2xsb3cgICAgICAgPSB7fSAgICAgICMgQSBkaWN0aW9uYXJ5IG9mIHByZWNvbXB1dGVkIEZPTExPVyh4KSBzeW1ib2xzCisKKyAgICAgICAgc2VsZi5QcmVjZWRlbmNlICAgPSB7fSAgICAgICMgUHJlY2VkZW5jZSBydWxlcyBmb3IgZWFjaCB0ZXJtaW5hbC4gQ29udGFpbnMgdHVwbGVzIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmb3JtICgncmlnaHQnLGxldmVsKSBvciAoJ25vbmFzc29jJywgbGV2ZWwpIG9yICgnbGVmdCcsbGV2ZWwpCisKKyAgICAgICAgc2VsZi5Vc2VkUHJlY2VkZW5jZSA9IHNldCgpICMgUHJlY2VkZW5jZSBydWxlcyB0aGF0IHdlcmUgYWN0dWFsbHkgdXNlZCBieSB0aGUgZ3JhbW1lci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhpcyBpcyBvbmx5IHVzZWQgdG8gcHJvdmlkZSBlcnJvciBjaGVja2luZyBhbmQgdG8gZ2VuZXJhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYSB3YXJuaW5nIGFib3V0IHVudXNlZCBwcmVjZWRlbmNlIHJ1bGVzLgorCisgICAgICAgIHNlbGYuU3RhcnQgPSBOb25lICAgICAgICAgICAjIFN0YXJ0aW5nIHN5bWJvbCBmb3IgdGhlIGdyYW1tYXIKKworCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5Qcm9kdWN0aW9ucykKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpbmRleCk6CisgICAgICAgIHJldHVybiBzZWxmLlByb2R1Y3Rpb25zW2luZGV4XQorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgc2V0X3ByZWNlZGVuY2UoKQorICAgICMKKyAgICAjIFNldHMgdGhlIHByZWNlZGVuY2UgZm9yIGEgZ2l2ZW4gdGVybWluYWwuIGFzc29jIGlzIHRoZSBhc3NvY2lhdGl2aXR5IHN1Y2ggYXMKKyAgICAjICdsZWZ0JywncmlnaHQnLCBvciAnbm9uYXNzb2MnLiAgbGV2ZWwgaXMgYSBudW1lcmljIGxldmVsLgorICAgICMKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgc2V0X3ByZWNlZGVuY2Uoc2VsZiwgdGVybSwgYXNzb2MsIGxldmVsKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuUHJvZHVjdGlvbnMgPT0gW05vbmVdLCAnTXVzdCBjYWxsIHNldF9wcmVjZWRlbmNlKCkgYmVmb3JlIGFkZF9wcm9kdWN0aW9uKCknCisgICAgICAgIGlmIHRlcm0gaW4gc2VsZi5QcmVjZWRlbmNlOgorICAgICAgICAgICAgcmFpc2UgR3JhbW1hckVycm9yKCdQcmVjZWRlbmNlIGFscmVhZHkgc3BlY2lmaWVkIGZvciB0ZXJtaW5hbCAlcicgJSB0ZXJtKQorICAgICAgICBpZiBhc3NvYyBub3QgaW4gWydsZWZ0JywgJ3JpZ2h0JywgJ25vbmFzc29jJ106CisgICAgICAgICAgICByYWlzZSBHcmFtbWFyRXJyb3IoIkFzc29jaWF0aXZpdHkgbXVzdCBiZSBvbmUgb2YgJ2xlZnQnLCdyaWdodCcsIG9yICdub25hc3NvYyciKQorICAgICAgICBzZWxmLlByZWNlZGVuY2VbdGVybV0gPSAoYXNzb2MsIGxldmVsKQorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgYWRkX3Byb2R1Y3Rpb24oKQorICAgICMKKyAgICAjIEdpdmVuIGFuIGFjdGlvbiBmdW5jdGlvbiwgdGhpcyBmdW5jdGlvbiBhc3NlbWJsZXMgYSBwcm9kdWN0aW9uIHJ1bGUgYW5kCisgICAgIyBjb21wdXRlcyBpdHMgcHJlY2VkZW5jZSBsZXZlbC4KKyAgICAjCisgICAgIyBUaGUgcHJvZHVjdGlvbiBydWxlIGlzIHN1cHBsaWVkIGFzIGEgbGlzdCBvZiBzeW1ib2xzLiAgIEZvciBleGFtcGxlLAorICAgICMgYSBydWxlIHN1Y2ggYXMgJ2V4cHIgOiBleHByIFBMVVMgdGVybScgaGFzIGEgcHJvZHVjdGlvbiBuYW1lIG9mICdleHByJyBhbmQKKyAgICAjIHN5bWJvbHMgWydleHByJywnUExVUycsJ3Rlcm0nXS4KKyAgICAjCisgICAgIyBQcmVjZWRlbmNlIGlzIGRldGVybWluZWQgYnkgdGhlIHByZWNlZGVuY2Ugb2YgdGhlIHJpZ2h0LW1vc3Qgbm9uLXRlcm1pbmFsCisgICAgIyBvciB0aGUgcHJlY2VkZW5jZSBvZiBhIHRlcm1pbmFsIHNwZWNpZmllZCBieSAlcHJlYy4KKyAgICAjCisgICAgIyBBIHZhcmlldHkgb2YgZXJyb3IgY2hlY2tzIGFyZSBwZXJmb3JtZWQgdG8gbWFrZSBzdXJlIHByb2R1Y3Rpb24gc3ltYm9scworICAgICMgYXJlIHZhbGlkIGFuZCB0aGF0ICVwcmVjIGlzIHVzZWQgY29ycmVjdGx5LgorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBhZGRfcHJvZHVjdGlvbihzZWxmLCBwcm9kbmFtZSwgc3ltcywgZnVuYz1Ob25lLCBmaWxlPScnLCBsaW5lPTApOgorCisgICAgICAgIGlmIHByb2RuYW1lIGluIHNlbGYuVGVybWluYWxzOgorICAgICAgICAgICAgcmFpc2UgR3JhbW1hckVycm9yKCclczolZDogSWxsZWdhbCBydWxlIG5hbWUgJXIuIEFscmVhZHkgZGVmaW5lZCBhcyBhIHRva2VuJyAlIChmaWxlLCBsaW5lLCBwcm9kbmFtZSkpCisgICAgICAgIGlmIHByb2RuYW1lID09ICdlcnJvcic6CisgICAgICAgICAgICByYWlzZSBHcmFtbWFyRXJyb3IoJyVzOiVkOiBJbGxlZ2FsIHJ1bGUgbmFtZSAlci4gZXJyb3IgaXMgYSByZXNlcnZlZCB3b3JkJyAlIChmaWxlLCBsaW5lLCBwcm9kbmFtZSkpCisgICAgICAgIGlmIG5vdCBfaXNfaWRlbnRpZmllci5tYXRjaChwcm9kbmFtZSk6CisgICAgICAgICAgICByYWlzZSBHcmFtbWFyRXJyb3IoJyVzOiVkOiBJbGxlZ2FsIHJ1bGUgbmFtZSAlcicgJSAoZmlsZSwgbGluZSwgcHJvZG5hbWUpKQorCisgICAgICAgICMgTG9vayBmb3IgbGl0ZXJhbCB0b2tlbnMKKyAgICAgICAgZm9yIG4sIHMgaW4gZW51bWVyYXRlKHN5bXMpOgorICAgICAgICAgICAgaWYgc1swXSBpbiAiJ1wiIjoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGMgPSBldmFsKHMpCisgICAgICAgICAgICAgICAgICAgIGlmIChsZW4oYykgPiAxKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEdyYW1tYXJFcnJvcignJXM6JWQ6IExpdGVyYWwgdG9rZW4gJXMgaW4gcnVsZSAlciBtYXkgb25seSBiZSBhIHNpbmdsZSBjaGFyYWN0ZXInICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZSwgbGluZSwgcywgcHJvZG5hbWUpKQorICAgICAgICAgICAgICAgICAgICBpZiBjIG5vdCBpbiBzZWxmLlRlcm1pbmFsczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVGVybWluYWxzW2NdID0gW10KKyAgICAgICAgICAgICAgICAgICAgc3ltc1tuXSA9IGMKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBleGNlcHQgU3ludGF4RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGlmIG5vdCBfaXNfaWRlbnRpZmllci5tYXRjaChzKSBhbmQgcyAhPSAnJXByZWMnOgorICAgICAgICAgICAgICAgIHJhaXNlIEdyYW1tYXJFcnJvcignJXM6JWQ6IElsbGVnYWwgbmFtZSAlciBpbiBydWxlICVyJyAlIChmaWxlLCBsaW5lLCBzLCBwcm9kbmFtZSkpCisKKyAgICAgICAgIyBEZXRlcm1pbmUgdGhlIHByZWNlZGVuY2UgbGV2ZWwKKyAgICAgICAgaWYgJyVwcmVjJyBpbiBzeW1zOgorICAgICAgICAgICAgaWYgc3ltc1stMV0gPT0gJyVwcmVjJzoKKyAgICAgICAgICAgICAgICByYWlzZSBHcmFtbWFyRXJyb3IoJyVzOiVkOiBTeW50YXggZXJyb3IuIE5vdGhpbmcgZm9sbG93cyAlJXByZWMnICUgKGZpbGUsIGxpbmUpKQorICAgICAgICAgICAgaWYgc3ltc1stMl0gIT0gJyVwcmVjJzoKKyAgICAgICAgICAgICAgICByYWlzZSBHcmFtbWFyRXJyb3IoJyVzOiVkOiBTeW50YXggZXJyb3IuICUlcHJlYyBjYW4gb25seSBhcHBlYXIgYXQgdGhlIGVuZCBvZiBhIGdyYW1tYXIgcnVsZScgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZSwgbGluZSkpCisgICAgICAgICAgICBwcmVjbmFtZSA9IHN5bXNbLTFdCisgICAgICAgICAgICBwcm9kcHJlYyA9IHNlbGYuUHJlY2VkZW5jZS5nZXQocHJlY25hbWUpCisgICAgICAgICAgICBpZiBub3QgcHJvZHByZWM6CisgICAgICAgICAgICAgICAgcmFpc2UgR3JhbW1hckVycm9yKCclczolZDogTm90aGluZyBrbm93biBhYm91dCB0aGUgcHJlY2VkZW5jZSBvZiAlcicgJSAoZmlsZSwgbGluZSwgcHJlY25hbWUpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLlVzZWRQcmVjZWRlbmNlLmFkZChwcmVjbmFtZSkKKyAgICAgICAgICAgIGRlbCBzeW1zWy0yOl0gICAgICMgRHJvcCAlcHJlYyBmcm9tIHRoZSBydWxlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIElmIG5vICVwcmVjLCBwcmVjZWRlbmNlIGlzIGRldGVybWluZWQgYnkgdGhlIHJpZ2h0bW9zdCB0ZXJtaW5hbCBzeW1ib2wKKyAgICAgICAgICAgIHByZWNuYW1lID0gcmlnaHRtb3N0X3Rlcm1pbmFsKHN5bXMsIHNlbGYuVGVybWluYWxzKQorICAgICAgICAgICAgcHJvZHByZWMgPSBzZWxmLlByZWNlZGVuY2UuZ2V0KHByZWNuYW1lLCAoJ3JpZ2h0JywgMCkpCisKKyAgICAgICAgIyBTZWUgaWYgdGhlIHJ1bGUgaXMgYWxyZWFkeSBpbiB0aGUgcnVsZW1hcAorICAgICAgICBtYXAgPSAnJXMgLT4gJXMnICUgKHByb2RuYW1lLCBzeW1zKQorICAgICAgICBpZiBtYXAgaW4gc2VsZi5Qcm9kbWFwOgorICAgICAgICAgICAgbSA9IHNlbGYuUHJvZG1hcFttYXBdCisgICAgICAgICAgICByYWlzZSBHcmFtbWFyRXJyb3IoJyVzOiVkOiBEdXBsaWNhdGUgcnVsZSAlcy4gJyAlIChmaWxlLCBsaW5lLCBtKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ByZXZpb3VzIGRlZmluaXRpb24gYXQgJXM6JWQnICUgKG0uZmlsZSwgbS5saW5lKSkKKworICAgICAgICAjIEZyb20gdGhpcyBwb2ludCBvbiwgZXZlcnl0aGluZyBpcyB2YWxpZC4gIENyZWF0ZSBhIG5ldyBQcm9kdWN0aW9uIGluc3RhbmNlCisgICAgICAgIHBudW1iZXIgID0gbGVuKHNlbGYuUHJvZHVjdGlvbnMpCisgICAgICAgIGlmIHByb2RuYW1lIG5vdCBpbiBzZWxmLk5vbnRlcm1pbmFsczoKKyAgICAgICAgICAgIHNlbGYuTm9udGVybWluYWxzW3Byb2RuYW1lXSA9IFtdCisKKyAgICAgICAgIyBBZGQgdGhlIHByb2R1Y3Rpb24gbnVtYmVyIHRvIFRlcm1pbmFscyBhbmQgTm9udGVybWluYWxzCisgICAgICAgIGZvciB0IGluIHN5bXM6CisgICAgICAgICAgICBpZiB0IGluIHNlbGYuVGVybWluYWxzOgorICAgICAgICAgICAgICAgIHNlbGYuVGVybWluYWxzW3RdLmFwcGVuZChwbnVtYmVyKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiB0IG5vdCBpbiBzZWxmLk5vbnRlcm1pbmFsczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5Ob250ZXJtaW5hbHNbdF0gPSBbXQorICAgICAgICAgICAgICAgIHNlbGYuTm9udGVybWluYWxzW3RdLmFwcGVuZChwbnVtYmVyKQorCisgICAgICAgICMgQ3JlYXRlIGEgcHJvZHVjdGlvbiBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIHByb2R1Y3Rpb25zCisgICAgICAgIHAgPSBQcm9kdWN0aW9uKHBudW1iZXIsIHByb2RuYW1lLCBzeW1zLCBwcm9kcHJlYywgZnVuYywgZmlsZSwgbGluZSkKKyAgICAgICAgc2VsZi5Qcm9kdWN0aW9ucy5hcHBlbmQocCkKKyAgICAgICAgc2VsZi5Qcm9kbWFwW21hcF0gPSBwCisKKyAgICAgICAgIyBBZGQgdG8gdGhlIGdsb2JhbCBwcm9kdWN0aW9ucyBsaXN0CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuUHJvZG5hbWVzW3Byb2RuYW1lXS5hcHBlbmQocCkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgc2VsZi5Qcm9kbmFtZXNbcHJvZG5hbWVdID0gW3BdCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBzZXRfc3RhcnQoKQorICAgICMKKyAgICAjIFNldHMgdGhlIHN0YXJ0aW5nIHN5bWJvbCBhbmQgY3JlYXRlcyB0aGUgYXVnbWVudGVkIGdyYW1tYXIuICBQcm9kdWN0aW9uCisgICAgIyBydWxlIDAgaXMgUycgLT4gc3RhcnQgd2hlcmUgc3RhcnQgaXMgdGhlIHN0YXJ0IHN5bWJvbC4KKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgc2V0X3N0YXJ0KHNlbGYsIHN0YXJ0PU5vbmUpOgorICAgICAgICBpZiBub3Qgc3RhcnQ6CisgICAgICAgICAgICBzdGFydCA9IHNlbGYuUHJvZHVjdGlvbnNbMV0ubmFtZQorICAgICAgICBpZiBzdGFydCBub3QgaW4gc2VsZi5Ob250ZXJtaW5hbHM6CisgICAgICAgICAgICByYWlzZSBHcmFtbWFyRXJyb3IoJ3N0YXJ0IHN5bWJvbCAlcyB1bmRlZmluZWQnICUgc3RhcnQpCisgICAgICAgIHNlbGYuUHJvZHVjdGlvbnNbMF0gPSBQcm9kdWN0aW9uKDAsICJTJyIsIFtzdGFydF0pCisgICAgICAgIHNlbGYuTm9udGVybWluYWxzW3N0YXJ0XS5hcHBlbmQoMCkKKyAgICAgICAgc2VsZi5TdGFydCA9IHN0YXJ0CisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBmaW5kX3VucmVhY2hhYmxlKCkKKyAgICAjCisgICAgIyBGaW5kIGFsbCBvZiB0aGUgbm9udGVybWluYWwgc3ltYm9scyB0aGF0IGNhbid0IGJlIHJlYWNoZWQgZnJvbSB0aGUgc3RhcnRpbmcKKyAgICAjIHN5bWJvbC4gIFJldHVybnMgYSBsaXN0IG9mIG5vbnRlcm1pbmFscyB0aGF0IGNhbid0IGJlIHJlYWNoZWQuCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGZpbmRfdW5yZWFjaGFibGUoc2VsZik6CisKKyAgICAgICAgIyBNYXJrIGFsbCBzeW1ib2xzIHRoYXQgYXJlIHJlYWNoYWJsZSBmcm9tIGEgc3ltYm9sIHMKKyAgICAgICAgZGVmIG1hcmtfcmVhY2hhYmxlX2Zyb20ocyk6CisgICAgICAgICAgICBpZiBzIGluIHJlYWNoYWJsZToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHJlYWNoYWJsZS5hZGQocykKKyAgICAgICAgICAgIGZvciBwIGluIHNlbGYuUHJvZG5hbWVzLmdldChzLCBbXSk6CisgICAgICAgICAgICAgICAgZm9yIHIgaW4gcC5wcm9kOgorICAgICAgICAgICAgICAgICAgICBtYXJrX3JlYWNoYWJsZV9mcm9tKHIpCisKKyAgICAgICAgcmVhY2hhYmxlID0gc2V0KCkKKyAgICAgICAgbWFya19yZWFjaGFibGVfZnJvbShzZWxmLlByb2R1Y3Rpb25zWzBdLnByb2RbMF0pCisgICAgICAgIHJldHVybiBbcyBmb3IgcyBpbiBzZWxmLk5vbnRlcm1pbmFscyBpZiBzIG5vdCBpbiByZWFjaGFibGVdCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBpbmZpbml0ZV9jeWNsZXMoKQorICAgICMKKyAgICAjIFRoaXMgZnVuY3Rpb24gbG9va3MgYXQgdGhlIHZhcmlvdXMgcGFyc2luZyBydWxlcyBhbmQgdHJpZXMgdG8gZGV0ZWN0CisgICAgIyBpbmZpbml0ZSByZWN1cnNpb24gY3ljbGVzIChncmFtbWFyIHJ1bGVzIHdoZXJlIHRoZXJlIGlzIG5vIHBvc3NpYmxlIHdheQorICAgICMgdG8gZGVyaXZlIGEgc3RyaW5nIG9mIG9ubHkgdGVybWluYWxzKS4KKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgaW5maW5pdGVfY3ljbGVzKHNlbGYpOgorICAgICAgICB0ZXJtaW5hdGVzID0ge30KKworICAgICAgICAjIFRlcm1pbmFsczoKKyAgICAgICAgZm9yIHQgaW4gc2VsZi5UZXJtaW5hbHM6CisgICAgICAgICAgICB0ZXJtaW5hdGVzW3RdID0gVHJ1ZQorCisgICAgICAgIHRlcm1pbmF0ZXNbJyRlbmQnXSA9IFRydWUKKworICAgICAgICAjIE5vbnRlcm1pbmFsczoKKworICAgICAgICAjIEluaXRpYWxpemUgdG8gZmFsc2U6CisgICAgICAgIGZvciBuIGluIHNlbGYuTm9udGVybWluYWxzOgorICAgICAgICAgICAgdGVybWluYXRlc1tuXSA9IEZhbHNlCisKKyAgICAgICAgIyBUaGVuIHByb3BhZ2F0ZSB0ZXJtaW5hdGlvbiB1bnRpbCBubyBjaGFuZ2U6CisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBzb21lX2NoYW5nZSA9IEZhbHNlCisgICAgICAgICAgICBmb3IgKG4sIHBsKSBpbiBzZWxmLlByb2RuYW1lcy5pdGVtcygpOgorICAgICAgICAgICAgICAgICMgTm9udGVybWluYWwgbiB0ZXJtaW5hdGVzIGlmZiBhbnkgb2YgaXRzIHByb2R1Y3Rpb25zIHRlcm1pbmF0ZXMuCisgICAgICAgICAgICAgICAgZm9yIHAgaW4gcGw6CisgICAgICAgICAgICAgICAgICAgICMgUHJvZHVjdGlvbiBwIHRlcm1pbmF0ZXMgaWZmIGFsbCBvZiBpdHMgcmhzIHN5bWJvbHMgdGVybWluYXRlLgorICAgICAgICAgICAgICAgICAgICBmb3IgcyBpbiBwLnByb2Q6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgdGVybWluYXRlc1tzXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBzeW1ib2wgcyBkb2VzIG5vdCB0ZXJtaW5hdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzbyBwcm9kdWN0aW9uIHAgZG9lcyBub3QgdGVybWluYXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdGVybWluYXRlcyA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgZGlkbid0IGJyZWFrIGZyb20gdGhlIGxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAjIHNvIGV2ZXJ5IHN5bWJvbCBzIHRlcm1pbmF0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICMgc28gcHJvZHVjdGlvbiBwIHRlcm1pbmF0ZXMuCisgICAgICAgICAgICAgICAgICAgICAgICBwX3Rlcm1pbmF0ZXMgPSBUcnVlCisKKyAgICAgICAgICAgICAgICAgICAgaWYgcF90ZXJtaW5hdGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBzeW1ib2wgbiB0ZXJtaW5hdGVzIQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHRlcm1pbmF0ZXNbbl06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRlc1tuXSA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21lX2NoYW5nZSA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICMgRG9uJ3QgbmVlZCB0byBjb25zaWRlciBhbnkgbW9yZSBwcm9kdWN0aW9ucyBmb3IgdGhpcyBuLgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgaWYgbm90IHNvbWVfY2hhbmdlOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgaW5maW5pdGUgPSBbXQorICAgICAgICBmb3IgKHMsIHRlcm0pIGluIHRlcm1pbmF0ZXMuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIG5vdCB0ZXJtOgorICAgICAgICAgICAgICAgIGlmIHMgbm90IGluIHNlbGYuUHJvZG5hbWVzIGFuZCBzIG5vdCBpbiBzZWxmLlRlcm1pbmFscyBhbmQgcyAhPSAnZXJyb3InOgorICAgICAgICAgICAgICAgICAgICAjIHMgaXMgdXNlZC1idXQtbm90LWRlZmluZWQsIGFuZCB3ZSd2ZSBhbHJlYWR5IHdhcm5lZCBvZiB0aGF0LAorICAgICAgICAgICAgICAgICAgICAjIHNvIGl0IHdvdWxkIGJlIG92ZXJraWxsIHRvIHNheSB0aGF0IGl0J3MgYWxzbyBub24tdGVybWluYXRpbmcuCisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpbmZpbml0ZS5hcHBlbmQocykKKworICAgICAgICByZXR1cm4gaW5maW5pdGUKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIHVuZGVmaW5lZF9zeW1ib2xzKCkKKyAgICAjCisgICAgIyBGaW5kIGFsbCBzeW1ib2xzIHRoYXQgd2VyZSB1c2VkIHRoZSBncmFtbWFyLCBidXQgbm90IGRlZmluZWQgYXMgdG9rZW5zIG9yCisgICAgIyBncmFtbWFyIHJ1bGVzLiAgUmV0dXJucyBhIGxpc3Qgb2YgdHVwbGVzIChzeW0sIHByb2QpIHdoZXJlIHN5bSBpbiB0aGUgc3ltYm9sCisgICAgIyBhbmQgcHJvZCBpcyB0aGUgcHJvZHVjdGlvbiB3aGVyZSB0aGUgc3ltYm9sIHdhcyB1c2VkLgorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBkZWYgdW5kZWZpbmVkX3N5bWJvbHMoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIGZvciBwIGluIHNlbGYuUHJvZHVjdGlvbnM6CisgICAgICAgICAgICBpZiBub3QgcDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBmb3IgcyBpbiBwLnByb2Q6CisgICAgICAgICAgICAgICAgaWYgcyBub3QgaW4gc2VsZi5Qcm9kbmFtZXMgYW5kIHMgbm90IGluIHNlbGYuVGVybWluYWxzIGFuZCBzICE9ICdlcnJvcic6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKHMsIHApKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyB1bnVzZWRfdGVybWluYWxzKCkKKyAgICAjCisgICAgIyBGaW5kIGFsbCB0ZXJtaW5hbHMgdGhhdCB3ZXJlIGRlZmluZWQsIGJ1dCBub3QgdXNlZCBieSB0aGUgZ3JhbW1hci4gIFJldHVybnMKKyAgICAjIGEgbGlzdCBvZiBhbGwgc3ltYm9scy4KKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgZGVmIHVudXNlZF90ZXJtaW5hbHMoc2VsZik6CisgICAgICAgIHVudXNlZF90b2sgPSBbXQorICAgICAgICBmb3IgcywgdiBpbiBzZWxmLlRlcm1pbmFscy5pdGVtcygpOgorICAgICAgICAgICAgaWYgcyAhPSAnZXJyb3InIGFuZCBub3QgdjoKKyAgICAgICAgICAgICAgICB1bnVzZWRfdG9rLmFwcGVuZChzKQorCisgICAgICAgIHJldHVybiB1bnVzZWRfdG9rCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgdW51c2VkX3J1bGVzKCkKKyAgICAjCisgICAgIyBGaW5kIGFsbCBncmFtbWFyIHJ1bGVzIHRoYXQgd2VyZSBkZWZpbmVkLCAgYnV0IG5vdCB1c2VkIChtYXliZSBub3QgcmVhY2hhYmxlKQorICAgICMgUmV0dXJucyBhIGxpc3Qgb2YgcHJvZHVjdGlvbnMuCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiB1bnVzZWRfcnVsZXMoc2VsZik6CisgICAgICAgIHVudXNlZF9wcm9kID0gW10KKyAgICAgICAgZm9yIHMsIHYgaW4gc2VsZi5Ob250ZXJtaW5hbHMuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIG5vdCB2OgorICAgICAgICAgICAgICAgIHAgPSBzZWxmLlByb2RuYW1lc1tzXVswXQorICAgICAgICAgICAgICAgIHVudXNlZF9wcm9kLmFwcGVuZChwKQorICAgICAgICByZXR1cm4gdW51c2VkX3Byb2QKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIHVudXNlZF9wcmVjZWRlbmNlKCkKKyAgICAjCisgICAgIyBSZXR1cm5zIGEgbGlzdCBvZiB0dXBsZXMgKHRlcm0scHJlY2VkZW5jZSkgY29ycmVzcG9uZGluZyB0byBwcmVjZWRlbmNlCisgICAgIyBydWxlcyB0aGF0IHdlcmUgbmV2ZXIgdXNlZCBieSB0aGUgZ3JhbW1hci4gIHRlcm0gaXMgdGhlIG5hbWUgb2YgdGhlIHRlcm1pbmFsCisgICAgIyBvbiB3aGljaCBwcmVjZWRlbmNlIHdhcyBhcHBsaWVkIGFuZCBwcmVjZWRlbmNlIGlzIGEgc3RyaW5nIHN1Y2ggYXMgJ2xlZnQnIG9yCisgICAgIyAncmlnaHQnIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR5cGUgb2YgcHJlY2VkZW5jZS4KKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgdW51c2VkX3ByZWNlZGVuY2Uoc2VsZik6CisgICAgICAgIHVudXNlZCA9IFtdCisgICAgICAgIGZvciB0ZXJtbmFtZSBpbiBzZWxmLlByZWNlZGVuY2U6CisgICAgICAgICAgICBpZiBub3QgKHRlcm1uYW1lIGluIHNlbGYuVGVybWluYWxzIG9yIHRlcm1uYW1lIGluIHNlbGYuVXNlZFByZWNlZGVuY2UpOgorICAgICAgICAgICAgICAgIHVudXNlZC5hcHBlbmQoKHRlcm1uYW1lLCBzZWxmLlByZWNlZGVuY2VbdGVybW5hbWVdWzBdKSkKKworICAgICAgICByZXR1cm4gdW51c2VkCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIF9maXJzdCgpCisgICAgIworICAgICMgQ29tcHV0ZSB0aGUgdmFsdWUgb2YgRklSU1QxKGJldGEpIHdoZXJlIGJldGEgaXMgYSB0dXBsZSBvZiBzeW1ib2xzLgorICAgICMKKyAgICAjIER1cmluZyBleGVjdXRpb24gb2YgY29tcHV0ZV9maXJzdDEsIHRoZSByZXN1bHQgbWF5IGJlIGluY29tcGxldGUuCisgICAgIyBBZnRlcndhcmQgKGUuZy4sIHdoZW4gY2FsbGVkIGZyb20gY29tcHV0ZV9mb2xsb3coKSksIGl0IHdpbGwgYmUgY29tcGxldGUuCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgZGVmIF9maXJzdChzZWxmLCBiZXRhKToKKworICAgICAgICAjIFdlIGFyZSBjb21wdXRpbmcgRmlyc3QoeDEseDIseDMsLi4uLHhuKQorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBmb3IgeCBpbiBiZXRhOgorICAgICAgICAgICAgeF9wcm9kdWNlc19lbXB0eSA9IEZhbHNlCisKKyAgICAgICAgICAgICMgQWRkIGFsbCB0aGUgbm9uLTxlbXB0eT4gc3ltYm9scyBvZiBGaXJzdFt4XSB0byB0aGUgcmVzdWx0LgorICAgICAgICAgICAgZm9yIGYgaW4gc2VsZi5GaXJzdFt4XToKKyAgICAgICAgICAgICAgICBpZiBmID09ICc8ZW1wdHk+JzoKKyAgICAgICAgICAgICAgICAgICAgeF9wcm9kdWNlc19lbXB0eSA9IFRydWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpZiBmIG5vdCBpbiByZXN1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGYpCisKKyAgICAgICAgICAgIGlmIHhfcHJvZHVjZXNfZW1wdHk6CisgICAgICAgICAgICAgICAgIyBXZSBoYXZlIHRvIGNvbnNpZGVyIHRoZSBuZXh0IHggaW4gYmV0YSwKKyAgICAgICAgICAgICAgICAjIGkuZS4gc3RheSBpbiB0aGUgbG9vcC4KKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgV2UgZG9uJ3QgaGF2ZSB0byBjb25zaWRlciBhbnkgZnVydGhlciBzeW1ib2xzIGluIGJldGEuCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgVGhlcmUgd2FzIG5vICdicmVhaycgZnJvbSB0aGUgbG9vcCwKKyAgICAgICAgICAgICMgc28geF9wcm9kdWNlc19lbXB0eSB3YXMgdHJ1ZSBmb3IgYWxsIHggaW4gYmV0YSwKKyAgICAgICAgICAgICMgc28gYmV0YSBwcm9kdWNlcyBlbXB0eSBhcyB3ZWxsLgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnPGVtcHR5PicpCisKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBjb21wdXRlX2ZpcnN0KCkKKyAgICAjCisgICAgIyBDb21wdXRlIHRoZSB2YWx1ZSBvZiBGSVJTVDEoWCkgZm9yIGFsbCBzeW1ib2xzCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgZGVmIGNvbXB1dGVfZmlyc3Qoc2VsZik6CisgICAgICAgIGlmIHNlbGYuRmlyc3Q6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5GaXJzdAorCisgICAgICAgICMgVGVybWluYWxzOgorICAgICAgICBmb3IgdCBpbiBzZWxmLlRlcm1pbmFsczoKKyAgICAgICAgICAgIHNlbGYuRmlyc3RbdF0gPSBbdF0KKworICAgICAgICBzZWxmLkZpcnN0WyckZW5kJ10gPSBbJyRlbmQnXQorCisgICAgICAgICMgTm9udGVybWluYWxzOgorCisgICAgICAgICMgSW5pdGlhbGl6ZSB0byB0aGUgZW1wdHkgc2V0OgorICAgICAgICBmb3IgbiBpbiBzZWxmLk5vbnRlcm1pbmFsczoKKyAgICAgICAgICAgIHNlbGYuRmlyc3Rbbl0gPSBbXQorCisgICAgICAgICMgVGhlbiBwcm9wYWdhdGUgc3ltYm9scyB1bnRpbCBubyBjaGFuZ2U6CisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBzb21lX2NoYW5nZSA9IEZhbHNlCisgICAgICAgICAgICBmb3IgbiBpbiBzZWxmLk5vbnRlcm1pbmFsczoKKyAgICAgICAgICAgICAgICBmb3IgcCBpbiBzZWxmLlByb2RuYW1lc1tuXToKKyAgICAgICAgICAgICAgICAgICAgZm9yIGYgaW4gc2VsZi5fZmlyc3QocC5wcm9kKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGYgbm90IGluIHNlbGYuRmlyc3Rbbl06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5GaXJzdFtuXS5hcHBlbmQoZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21lX2NoYW5nZSA9IFRydWUKKyAgICAgICAgICAgIGlmIG5vdCBzb21lX2NoYW5nZToKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgIHJldHVybiBzZWxmLkZpcnN0CisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgY29tcHV0ZV9mb2xsb3coKQorICAgICMKKyAgICAjIENvbXB1dGVzIGFsbCBvZiB0aGUgZm9sbG93IHNldHMgZm9yIGV2ZXJ5IG5vbi10ZXJtaW5hbCBzeW1ib2wuICBUaGUKKyAgICAjIGZvbGxvdyBzZXQgaXMgdGhlIHNldCBvZiBhbGwgc3ltYm9scyB0aGF0IG1pZ2h0IGZvbGxvdyBhIGdpdmVuCisgICAgIyBub24tdGVybWluYWwuICBTZWUgdGhlIERyYWdvbiBib29rLCAybmQgRWQuIHAuIDE4OS4KKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGRlZiBjb21wdXRlX2ZvbGxvdyhzZWxmLCBzdGFydD1Ob25lKToKKyAgICAgICAgIyBJZiBhbHJlYWR5IGNvbXB1dGVkLCByZXR1cm4gdGhlIHJlc3VsdAorICAgICAgICBpZiBzZWxmLkZvbGxvdzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLkZvbGxvdworCisgICAgICAgICMgSWYgZmlyc3Qgc2V0cyBub3QgY29tcHV0ZWQgeWV0LCBkbyB0aGF0IGZpcnN0LgorICAgICAgICBpZiBub3Qgc2VsZi5GaXJzdDoKKyAgICAgICAgICAgIHNlbGYuY29tcHV0ZV9maXJzdCgpCisKKyAgICAgICAgIyBBZGQgJyRlbmQnIHRvIHRoZSBmb2xsb3cgbGlzdCBvZiB0aGUgc3RhcnQgc3ltYm9sCisgICAgICAgIGZvciBrIGluIHNlbGYuTm9udGVybWluYWxzOgorICAgICAgICAgICAgc2VsZi5Gb2xsb3dba10gPSBbXQorCisgICAgICAgIGlmIG5vdCBzdGFydDoKKyAgICAgICAgICAgIHN0YXJ0ID0gc2VsZi5Qcm9kdWN0aW9uc1sxXS5uYW1lCisKKyAgICAgICAgc2VsZi5Gb2xsb3dbc3RhcnRdID0gWyckZW5kJ10KKworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgZGlkYWRkID0gRmFsc2UKKyAgICAgICAgICAgIGZvciBwIGluIHNlbGYuUHJvZHVjdGlvbnNbMTpdOgorICAgICAgICAgICAgICAgICMgSGVyZSBpcyB0aGUgcHJvZHVjdGlvbiBzZXQKKyAgICAgICAgICAgICAgICBmb3IgaSwgQiBpbiBlbnVtZXJhdGUocC5wcm9kKToKKyAgICAgICAgICAgICAgICAgICAgaWYgQiBpbiBzZWxmLk5vbnRlcm1pbmFsczoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgT2theS4gV2UgZ290IGEgbm9uLXRlcm1pbmFsIGluIGEgcHJvZHVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgZnN0ID0gc2VsZi5fZmlyc3QocC5wcm9kW2krMTpdKQorICAgICAgICAgICAgICAgICAgICAgICAgaGFzZW1wdHkgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGYgaW4gZnN0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGYgIT0gJzxlbXB0eT4nIGFuZCBmIG5vdCBpbiBzZWxmLkZvbGxvd1tCXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5Gb2xsb3dbQl0uYXBwZW5kKGYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZGFkZCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBmID09ICc8ZW1wdHk+JzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzZW1wdHkgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBoYXNlbXB0eSBvciBpID09IChsZW4ocC5wcm9kKS0xKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEFkZCBlbGVtZW50cyBvZiBmb2xsb3coYSkgdG8gZm9sbG93KGIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGYgaW4gc2VsZi5Gb2xsb3dbcC5uYW1lXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZiBub3QgaW4gc2VsZi5Gb2xsb3dbQl06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkZvbGxvd1tCXS5hcHBlbmQoZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZGFkZCA9IFRydWUKKyAgICAgICAgICAgIGlmIG5vdCBkaWRhZGQ6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0dXJuIHNlbGYuRm9sbG93CisKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIGJ1aWxkX2xyaXRlbXMoKQorICAgICMKKyAgICAjIFRoaXMgZnVuY3Rpb24gd2Fsa3MgdGhlIGxpc3Qgb2YgcHJvZHVjdGlvbnMgYW5kIGJ1aWxkcyBhIGNvbXBsZXRlIHNldCBvZiB0aGUKKyAgICAjIExSIGl0ZW1zLiAgVGhlIExSIGl0ZW1zIGFyZSBzdG9yZWQgaW4gdHdvIHdheXM6ICBGaXJzdCwgdGhleSBhcmUgdW5pcXVlbHkKKyAgICAjIG51bWJlcmVkIGFuZCBwbGFjZWQgaW4gdGhlIGxpc3QgX2xyaXRlbXMuICBTZWNvbmQsIGEgbGlua2VkIGxpc3Qgb2YgTFIgaXRlbXMKKyAgICAjIGlzIGJ1aWx0IGZvciBlYWNoIHByb2R1Y3Rpb24uICBGb3IgZXhhbXBsZToKKyAgICAjCisgICAgIyAgIEUgLT4gRSBQTFVTIEUKKyAgICAjCisgICAgIyBDcmVhdGVzIHRoZSBsaXN0CisgICAgIworICAgICMgIFtFIC0+IC4gRSBQTFVTIEUsIEUgLT4gRSAuIFBMVVMgRSwgRSAtPiBFIFBMVVMgLiBFLCBFIC0+IEUgUExVUyBFIC4gXQorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBidWlsZF9scml0ZW1zKHNlbGYpOgorICAgICAgICBmb3IgcCBpbiBzZWxmLlByb2R1Y3Rpb25zOgorICAgICAgICAgICAgbGFzdGxyaSA9IHAKKyAgICAgICAgICAgIGkgPSAwCisgICAgICAgICAgICBscl9pdGVtcyA9IFtdCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIGlmIGkgPiBsZW4ocCk6CisgICAgICAgICAgICAgICAgICAgIGxyaSA9IE5vbmUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBscmkgPSBMUkl0ZW0ocCwgaSkKKyAgICAgICAgICAgICAgICAgICAgIyBQcmVjb21wdXRlIHRoZSBsaXN0IG9mIHByb2R1Y3Rpb25zIGltbWVkaWF0ZWx5IGZvbGxvd2luZworICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBscmkubHJfYWZ0ZXIgPSBzZWxmLlByb2RuYW1lc1tscmkucHJvZFtpKzFdXQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgKEluZGV4RXJyb3IsIEtleUVycm9yKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxyaS5scl9hZnRlciA9IFtdCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxyaS5scl9iZWZvcmUgPSBscmkucHJvZFtpLTFdCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgbHJpLmxyX2JlZm9yZSA9IE5vbmUKKworICAgICAgICAgICAgICAgIGxhc3RscmkubHJfbmV4dCA9IGxyaQorICAgICAgICAgICAgICAgIGlmIG5vdCBscmk6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgbHJfaXRlbXMuYXBwZW5kKGxyaSkKKyAgICAgICAgICAgICAgICBsYXN0bHJpID0gbHJpCisgICAgICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICBwLmxyX2l0ZW1zID0gbHJfaXRlbXMKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBDbGFzcyBMUlRhYmxlID09CisjCisjIFRoaXMgYmFzaWMgY2xhc3MgcmVwcmVzZW50cyBhIGJhc2ljIHRhYmxlIG9mIExSIHBhcnNpbmcgaW5mb3JtYXRpb24uCisjIE1ldGhvZHMgZm9yIGdlbmVyYXRpbmcgdGhlIHRhYmxlcyBhcmUgbm90IGRlZmluZWQgaGVyZS4gIFRoZXkgYXJlIGRlZmluZWQKKyMgaW4gdGhlIGRlcml2ZWQgY2xhc3MgTFJHZW5lcmF0ZWRUYWJsZS4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVmVyc2lvbkVycm9yKFlhY2NFcnJvcik6CisgICAgcGFzcworCitjbGFzcyBMUlRhYmxlKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmxyX2FjdGlvbiA9IE5vbmUKKyAgICAgICAgc2VsZi5scl9nb3RvID0gTm9uZQorICAgICAgICBzZWxmLmxyX3Byb2R1Y3Rpb25zID0gTm9uZQorICAgICAgICBzZWxmLmxyX21ldGhvZCA9IE5vbmUKKworICAgIGRlZiByZWFkX3RhYmxlKHNlbGYsIG1vZHVsZSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UobW9kdWxlLCB0eXBlcy5Nb2R1bGVUeXBlKToKKyAgICAgICAgICAgIHBhcnNldGFiID0gbW9kdWxlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBleGVjKCdpbXBvcnQgJXMnICUgbW9kdWxlKQorICAgICAgICAgICAgcGFyc2V0YWIgPSBzeXMubW9kdWxlc1ttb2R1bGVdCisKKyAgICAgICAgaWYgcGFyc2V0YWIuX3RhYnZlcnNpb24gIT0gX190YWJ2ZXJzaW9uX186CisgICAgICAgICAgICByYWlzZSBWZXJzaW9uRXJyb3IoJ3lhY2MgdGFibGUgZmlsZSB2ZXJzaW9uIGlzIG91dCBvZiBkYXRlJykKKworICAgICAgICBzZWxmLmxyX2FjdGlvbiA9IHBhcnNldGFiLl9scl9hY3Rpb24KKyAgICAgICAgc2VsZi5scl9nb3RvID0gcGFyc2V0YWIuX2xyX2dvdG8KKworICAgICAgICBzZWxmLmxyX3Byb2R1Y3Rpb25zID0gW10KKyAgICAgICAgZm9yIHAgaW4gcGFyc2V0YWIuX2xyX3Byb2R1Y3Rpb25zOgorICAgICAgICAgICAgc2VsZi5scl9wcm9kdWN0aW9ucy5hcHBlbmQoTWluaVByb2R1Y3Rpb24oKnApKQorCisgICAgICAgIHNlbGYubHJfbWV0aG9kID0gcGFyc2V0YWIuX2xyX21ldGhvZAorICAgICAgICByZXR1cm4gcGFyc2V0YWIuX2xyX3NpZ25hdHVyZQorCisgICAgZGVmIHJlYWRfcGlja2xlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IGNQaWNrbGUgYXMgcGlja2xlCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIGltcG9ydCBwaWNrbGUKKworICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgorICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yCisKKyAgICAgICAgaW5fZiA9IG9wZW4oZmlsZW5hbWUsICdyYicpCisKKyAgICAgICAgdGFidmVyc2lvbiA9IHBpY2tsZS5sb2FkKGluX2YpCisgICAgICAgIGlmIHRhYnZlcnNpb24gIT0gX190YWJ2ZXJzaW9uX186CisgICAgICAgICAgICByYWlzZSBWZXJzaW9uRXJyb3IoJ3lhY2MgdGFibGUgZmlsZSB2ZXJzaW9uIGlzIG91dCBvZiBkYXRlJykKKyAgICAgICAgc2VsZi5scl9tZXRob2QgPSBwaWNrbGUubG9hZChpbl9mKQorICAgICAgICBzaWduYXR1cmUgICAgICA9IHBpY2tsZS5sb2FkKGluX2YpCisgICAgICAgIHNlbGYubHJfYWN0aW9uID0gcGlja2xlLmxvYWQoaW5fZikKKyAgICAgICAgc2VsZi5scl9nb3RvICAgPSBwaWNrbGUubG9hZChpbl9mKQorICAgICAgICBwcm9kdWN0aW9ucyAgICA9IHBpY2tsZS5sb2FkKGluX2YpCisKKyAgICAgICAgc2VsZi5scl9wcm9kdWN0aW9ucyA9IFtdCisgICAgICAgIGZvciBwIGluIHByb2R1Y3Rpb25zOgorICAgICAgICAgICAgc2VsZi5scl9wcm9kdWN0aW9ucy5hcHBlbmQoTWluaVByb2R1Y3Rpb24oKnApKQorCisgICAgICAgIGluX2YuY2xvc2UoKQorICAgICAgICByZXR1cm4gc2lnbmF0dXJlCisKKyAgICAjIEJpbmQgYWxsIHByb2R1Y3Rpb24gZnVuY3Rpb24gbmFtZXMgdG8gY2FsbGFibGUgb2JqZWN0cyBpbiBwZGljdAorICAgIGRlZiBiaW5kX2NhbGxhYmxlcyhzZWxmLCBwZGljdCk6CisgICAgICAgIGZvciBwIGluIHNlbGYubHJfcHJvZHVjdGlvbnM6CisgICAgICAgICAgICBwLmJpbmQocGRpY3QpCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgID09PSBMUiBHZW5lcmF0b3IgPT09CisjCisjIFRoZSBmb2xsb3dpbmcgY2xhc3NlcyBhbmQgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIGdlbmVyYXRlIExSIHBhcnNpbmcgdGFibGVzIG9uCisjIGEgZ3JhbW1hci4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBkaWdyYXBoKCkKKyMgdHJhdmVyc2UoKQorIworIyBUaGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gY29tcHV0ZSBzZXQgdmFsdWVkIGZ1bmN0aW9ucworIyBvZiB0aGUgZm9ybToKKyMKKyMgICAgIEYoeCkgPSBGJyh4KSBVIFV7Rih5KSB8IHggUiB5fQorIworIyBUaGlzIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgdmFsdWVzIG9mIFJlYWQoKSBzZXRzIGFzIHdlbGwgYXMgRk9MTE9XIHNldHMKKyMgaW4gTEFMUigxKSBnZW5lcmF0aW9uLgorIworIyBJbnB1dHM6ICBYICAgIC0gQW4gaW5wdXQgc2V0CisjICAgICAgICAgIFIgICAgLSBBIHJlbGF0aW9uCisjICAgICAgICAgIEZQICAgLSBTZXQtdmFsdWVkIGZ1bmN0aW9uCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgZGlncmFwaChYLCBSLCBGUCk6CisgICAgTiA9IHt9CisgICAgZm9yIHggaW4gWDoKKyAgICAgICAgTlt4XSA9IDAKKyAgICBzdGFjayA9IFtdCisgICAgRiA9IHt9CisgICAgZm9yIHggaW4gWDoKKyAgICAgICAgaWYgTlt4XSA9PSAwOgorICAgICAgICAgICAgdHJhdmVyc2UoeCwgTiwgc3RhY2ssIEYsIFgsIFIsIEZQKQorICAgIHJldHVybiBGCisKK2RlZiB0cmF2ZXJzZSh4LCBOLCBzdGFjaywgRiwgWCwgUiwgRlApOgorICAgIHN0YWNrLmFwcGVuZCh4KQorICAgIGQgPSBsZW4oc3RhY2spCisgICAgTlt4XSA9IGQKKyAgICBGW3hdID0gRlAoeCkgICAgICAgICAgICAgIyBGKFgpIDwtIEYnKHgpCisKKyAgICByZWwgPSBSKHgpICAgICAgICAgICAgICAgIyBHZXQgeSdzIHJlbGF0ZWQgdG8geAorICAgIGZvciB5IGluIHJlbDoKKyAgICAgICAgaWYgTlt5XSA9PSAwOgorICAgICAgICAgICAgdHJhdmVyc2UoeSwgTiwgc3RhY2ssIEYsIFgsIFIsIEZQKQorICAgICAgICBOW3hdID0gbWluKE5beF0sIE5beV0pCisgICAgICAgIGZvciBhIGluIEYuZ2V0KHksIFtdKToKKyAgICAgICAgICAgIGlmIGEgbm90IGluIEZbeF06CisgICAgICAgICAgICAgICAgRlt4XS5hcHBlbmQoYSkKKyAgICBpZiBOW3hdID09IGQ6CisgICAgICAgIE5bc3RhY2tbLTFdXSA9IE1BWElOVAorICAgICAgICBGW3N0YWNrWy0xXV0gPSBGW3hdCisgICAgICAgIGVsZW1lbnQgPSBzdGFjay5wb3AoKQorICAgICAgICB3aGlsZSBlbGVtZW50ICE9IHg6CisgICAgICAgICAgICBOW3N0YWNrWy0xXV0gPSBNQVhJTlQKKyAgICAgICAgICAgIEZbc3RhY2tbLTFdXSA9IEZbeF0KKyAgICAgICAgICAgIGVsZW1lbnQgPSBzdGFjay5wb3AoKQorCitjbGFzcyBMQUxSRXJyb3IoWWFjY0Vycm9yKToKKyAgICBwYXNzCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IExSR2VuZXJhdGVkVGFibGUgPT0KKyMKKyMgVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBMUiB0YWJsZSBnZW5lcmF0aW9uIGFsZ29yaXRobS4gIFRoZXJlIGFyZSBubworIyBwdWJsaWMgbWV0aG9kcyBleGNlcHQgZm9yIHdyaXRlKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgTFJHZW5lcmF0ZWRUYWJsZShMUlRhYmxlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZ3JhbW1hciwgbWV0aG9kPSdMQUxSJywgbG9nPU5vbmUpOgorICAgICAgICBpZiBtZXRob2Qgbm90IGluIFsnU0xSJywgJ0xBTFInXToKKyAgICAgICAgICAgIHJhaXNlIExBTFJFcnJvcignVW5zdXBwb3J0ZWQgbWV0aG9kICVzJyAlIG1ldGhvZCkKKworICAgICAgICBzZWxmLmdyYW1tYXIgPSBncmFtbWFyCisgICAgICAgIHNlbGYubHJfbWV0aG9kID0gbWV0aG9kCisKKyAgICAgICAgIyBTZXQgdXAgdGhlIGxvZ2dlcgorICAgICAgICBpZiBub3QgbG9nOgorICAgICAgICAgICAgbG9nID0gTnVsbExvZ2dlcigpCisgICAgICAgIHNlbGYubG9nID0gbG9nCisKKyAgICAgICAgIyBJbnRlcm5hbCBhdHRyaWJ1dGVzCisgICAgICAgIHNlbGYubHJfYWN0aW9uICAgICA9IHt9ICAgICAgICAjIEFjdGlvbiB0YWJsZQorICAgICAgICBzZWxmLmxyX2dvdG8gICAgICAgPSB7fSAgICAgICAgIyBHb3RvIHRhYmxlCisgICAgICAgIHNlbGYubHJfcHJvZHVjdGlvbnMgID0gZ3JhbW1hci5Qcm9kdWN0aW9ucyAgICAjIENvcHkgb2YgZ3JhbW1hciBQcm9kdWN0aW9uIGFycmF5CisgICAgICAgIHNlbGYubHJfZ290b19jYWNoZSA9IHt9ICAgICAgICAjIENhY2hlIG9mIGNvbXB1dGVkIGdvdG9zCisgICAgICAgIHNlbGYubHIwX2NpZGhhc2ggICA9IHt9ICAgICAgICAjIENhY2hlIG9mIGNsb3N1cmVzCisKKyAgICAgICAgc2VsZi5fYWRkX2NvdW50ICAgID0gMCAgICAgICAgICMgSW50ZXJuYWwgY291bnRlciB1c2VkIHRvIGRldGVjdCBjeWNsZXMKKworICAgICAgICAjIERpYWdvbmlzdGljIGluZm9ybWF0aW9uIGZpbGxlZCBpbiBieSB0aGUgdGFibGUgZ2VuZXJhdG9yCisgICAgICAgIHNlbGYuc3JfY29uZmxpY3QgICA9IDAKKyAgICAgICAgc2VsZi5ycl9jb25mbGljdCAgID0gMAorICAgICAgICBzZWxmLmNvbmZsaWN0cyAgICAgPSBbXSAgICAgICAgIyBMaXN0IG9mIGNvbmZsaWN0cworCisgICAgICAgIHNlbGYuc3JfY29uZmxpY3RzICA9IFtdCisgICAgICAgIHNlbGYucnJfY29uZmxpY3RzICA9IFtdCisKKyAgICAgICAgIyBCdWlsZCB0aGUgdGFibGVzCisgICAgICAgIHNlbGYuZ3JhbW1hci5idWlsZF9scml0ZW1zKCkKKyAgICAgICAgc2VsZi5ncmFtbWFyLmNvbXB1dGVfZmlyc3QoKQorICAgICAgICBzZWxmLmdyYW1tYXIuY29tcHV0ZV9mb2xsb3coKQorICAgICAgICBzZWxmLmxyX3BhcnNlX3RhYmxlKCkKKworICAgICMgQ29tcHV0ZSB0aGUgTFIoMCkgY2xvc3VyZSBvcGVyYXRpb24gb24gSSwgd2hlcmUgSSBpcyBhIHNldCBvZiBMUigwKSBpdGVtcy4KKworICAgIGRlZiBscjBfY2xvc3VyZShzZWxmLCBJKToKKyAgICAgICAgc2VsZi5fYWRkX2NvdW50ICs9IDEKKworICAgICAgICAjIEFkZCBldmVyeXRoaW5nIGluIEkgdG8gSgorICAgICAgICBKID0gSVs6XQorICAgICAgICBkaWRhZGQgPSBUcnVlCisgICAgICAgIHdoaWxlIGRpZGFkZDoKKyAgICAgICAgICAgIGRpZGFkZCA9IEZhbHNlCisgICAgICAgICAgICBmb3IgaiBpbiBKOgorICAgICAgICAgICAgICAgIGZvciB4IGluIGoubHJfYWZ0ZXI6CisgICAgICAgICAgICAgICAgICAgIGlmIGdldGF0dHIoeCwgJ2xyMF9hZGRlZCcsIDApID09IHNlbGYuX2FkZF9jb3VudDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICMgQWRkIEIgLS0+IC5HIHRvIEoKKyAgICAgICAgICAgICAgICAgICAgSi5hcHBlbmQoeC5scl9uZXh0KQorICAgICAgICAgICAgICAgICAgICB4LmxyMF9hZGRlZCA9IHNlbGYuX2FkZF9jb3VudAorICAgICAgICAgICAgICAgICAgICBkaWRhZGQgPSBUcnVlCisKKyAgICAgICAgcmV0dXJuIEoKKworICAgICMgQ29tcHV0ZSB0aGUgTFIoMCkgZ290byBmdW5jdGlvbiBnb3RvKEksWCkgd2hlcmUgSSBpcyBhIHNldAorICAgICMgb2YgTFIoMCkgaXRlbXMgYW5kIFggaXMgYSBncmFtbWFyIHN5bWJvbC4gICBUaGlzIGZ1bmN0aW9uIGlzIHdyaXR0ZW4KKyAgICAjIGluIGEgd2F5IHRoYXQgZ3VhcmFudGVlcyB1bmlxdWVuZXNzIG9mIHRoZSBnZW5lcmF0ZWQgZ290byBzZXRzCisgICAgIyAoaS5lLiB0aGUgc2FtZSBnb3RvIHNldCB3aWxsIG5ldmVyIGJlIHJldHVybmVkIGFzIHR3byBkaWZmZXJlbnQgUHl0aG9uCisgICAgIyBvYmplY3RzKS4gIFdpdGggdW5pcXVlbmVzcywgd2UgY2FuIGxhdGVyIGRvIGZhc3Qgc2V0IGNvbXBhcmlzb25zIHVzaW5nCisgICAgIyBpZChvYmopIGluc3RlYWQgb2YgZWxlbWVudC13aXNlIGNvbXBhcmlzb24uCisKKyAgICBkZWYgbHIwX2dvdG8oc2VsZiwgSSwgeCk6CisgICAgICAgICMgRmlyc3Qgd2UgbG9vayBmb3IgYSBwcmV2aW91c2x5IGNhY2hlZCBlbnRyeQorICAgICAgICBnID0gc2VsZi5scl9nb3RvX2NhY2hlLmdldCgoaWQoSSksIHgpKQorICAgICAgICBpZiBnOgorICAgICAgICAgICAgcmV0dXJuIGcKKworICAgICAgICAjIE5vdyB3ZSBnZW5lcmF0ZSB0aGUgZ290byBzZXQgaW4gYSB3YXkgdGhhdCBndWFyYW50ZWVzIHVuaXF1ZW5lc3MKKyAgICAgICAgIyBvZiB0aGUgcmVzdWx0CisKKyAgICAgICAgcyA9IHNlbGYubHJfZ290b19jYWNoZS5nZXQoeCkKKyAgICAgICAgaWYgbm90IHM6CisgICAgICAgICAgICBzID0ge30KKyAgICAgICAgICAgIHNlbGYubHJfZ290b19jYWNoZVt4XSA9IHMKKworICAgICAgICBncyA9IFtdCisgICAgICAgIGZvciBwIGluIEk6CisgICAgICAgICAgICBuID0gcC5scl9uZXh0CisgICAgICAgICAgICBpZiBuIGFuZCBuLmxyX2JlZm9yZSA9PSB4OgorICAgICAgICAgICAgICAgIHMxID0gcy5nZXQoaWQobikpCisgICAgICAgICAgICAgICAgaWYgbm90IHMxOgorICAgICAgICAgICAgICAgICAgICBzMSA9IHt9CisgICAgICAgICAgICAgICAgICAgIHNbaWQobildID0gczEKKyAgICAgICAgICAgICAgICBncy5hcHBlbmQobikKKyAgICAgICAgICAgICAgICBzID0gczEKKyAgICAgICAgZyA9IHMuZ2V0KCckZW5kJykKKyAgICAgICAgaWYgbm90IGc6CisgICAgICAgICAgICBpZiBnczoKKyAgICAgICAgICAgICAgICBnID0gc2VsZi5scjBfY2xvc3VyZShncykKKyAgICAgICAgICAgICAgICBzWyckZW5kJ10gPSBnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNbJyRlbmQnXSA9IGdzCisgICAgICAgIHNlbGYubHJfZ290b19jYWNoZVsoaWQoSSksIHgpXSA9IGcKKyAgICAgICAgcmV0dXJuIGcKKworICAgICMgQ29tcHV0ZSB0aGUgTFIoMCkgc2V0cyBvZiBpdGVtIGZ1bmN0aW9uCisgICAgZGVmIGxyMF9pdGVtcyhzZWxmKToKKyAgICAgICAgQyA9IFtzZWxmLmxyMF9jbG9zdXJlKFtzZWxmLmdyYW1tYXIuUHJvZHVjdGlvbnNbMF0ubHJfbmV4dF0pXQorICAgICAgICBpID0gMAorICAgICAgICBmb3IgSSBpbiBDOgorICAgICAgICAgICAgc2VsZi5scjBfY2lkaGFzaFtpZChJKV0gPSBpCisgICAgICAgICAgICBpICs9IDEKKworICAgICAgICAjIExvb3Agb3ZlciB0aGUgaXRlbXMgaW4gQyBhbmQgZWFjaCBncmFtbWFyIHN5bWJvbHMKKyAgICAgICAgaSA9IDAKKyAgICAgICAgd2hpbGUgaSA8IGxlbihDKToKKyAgICAgICAgICAgIEkgPSBDW2ldCisgICAgICAgICAgICBpICs9IDEKKworICAgICAgICAgICAgIyBDb2xsZWN0IGFsbCBvZiB0aGUgc3ltYm9scyB0aGF0IGNvdWxkIHBvc3NpYmx5IGJlIGluIHRoZSBnb3RvKEksWCkgc2V0cworICAgICAgICAgICAgYXN5bXMgPSB7fQorICAgICAgICAgICAgZm9yIGlpIGluIEk6CisgICAgICAgICAgICAgICAgZm9yIHMgaW4gaWkudXN5bXM6CisgICAgICAgICAgICAgICAgICAgIGFzeW1zW3NdID0gTm9uZQorCisgICAgICAgICAgICBmb3IgeCBpbiBhc3ltczoKKyAgICAgICAgICAgICAgICBnID0gc2VsZi5scjBfZ290byhJLCB4KQorICAgICAgICAgICAgICAgIGlmIG5vdCBnIG9yIGlkKGcpIGluIHNlbGYubHIwX2NpZGhhc2g6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgc2VsZi5scjBfY2lkaGFzaFtpZChnKV0gPSBsZW4oQykKKyAgICAgICAgICAgICAgICBDLmFwcGVuZChnKQorCisgICAgICAgIHJldHVybiBDCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyAgICAgICAgICAgICAgICAgICAgICAgPT09PSBMQUxSKDEpIFBhcnNpbmcgPT09PQorICAgICMKKyAgICAjIExBTFIoMSkgcGFyc2luZyBpcyBhbG1vc3QgZXhhY3RseSB0aGUgc2FtZSBhcyBTTFIgZXhjZXB0IHRoYXQgaW5zdGVhZCBvZgorICAgICMgcmVseWluZyB1cG9uIEZvbGxvdygpIHNldHMgd2hlbiBwZXJmb3JtaW5nIHJlZHVjdGlvbnMsIGEgbW9yZSBzZWxlY3RpdmUKKyAgICAjIGxvb2thaGVhZCBzZXQgdGhhdCBpbmNvcnBvcmF0ZXMgdGhlIHN0YXRlIG9mIHRoZSBMUigwKSBtYWNoaW5lIGlzIHV0aWxpemVkLgorICAgICMgVGh1cywgd2UgbWFpbmx5IGp1c3QgaGF2ZSB0byBmb2N1cyBvbiBjYWxjdWxhdGluZyB0aGUgbG9va2FoZWFkIHNldHMuCisgICAgIworICAgICMgVGhlIG1ldGhvZCB1c2VkIGhlcmUgaXMgZHVlIHRvIERlUmVtZXIgYW5kIFBlbm5lbG8gKDE5ODIpLgorICAgICMKKyAgICAjIERlUmVtZXIsIEYuIEwuLCBhbmQgVC4gSi4gUGVubmVsbzogIkVmZmljaWVudCBDb21wdXRhdGlvbiBvZiBMQUxSKDEpCisgICAgIyAgICAgTG9va2FoZWFkIFNldHMiLCBBQ00gVHJhbnNhY3Rpb25zIG9uIFByb2dyYW1taW5nIExhbmd1YWdlcyBhbmQgU3lzdGVtcywKKyAgICAjICAgICBWb2wuIDQsIE5vLiA0LCBPY3QuIDE5ODIsIHBwLiA2MTUtNjQ5CisgICAgIworICAgICMgRnVydGhlciBkZXRhaWxzIGNhbiBhbHNvIGJlIGZvdW5kIGluOgorICAgICMKKyAgICAjICBKLiBUcmVtYmxheSBhbmQgUC4gU29yZW5zb24sICJUaGUgVGhlb3J5IGFuZCBQcmFjdGljZSBvZiBDb21waWxlciBXcml0aW5nIiwKKyAgICAjICAgICAgTWNHcmF3LUhpbGwgQm9vayBDb21wYW55LCAoMTk4NSkuCisgICAgIworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIGNvbXB1dGVfbnVsbGFibGVfbm9udGVybWluYWxzKCkKKyAgICAjCisgICAgIyBDcmVhdGVzIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGFsbCBvZiB0aGUgbm9uLXRlcm1pbmFscyB0aGF0IG1pZ2h0IHByb2R1Y2UKKyAgICAjIGFuIGVtcHR5IHByb2R1Y3Rpb24uCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGNvbXB1dGVfbnVsbGFibGVfbm9udGVybWluYWxzKHNlbGYpOgorICAgICAgICBudWxsYWJsZSA9IHNldCgpCisgICAgICAgIG51bV9udWxsYWJsZSA9IDAKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGZvciBwIGluIHNlbGYuZ3JhbW1hci5Qcm9kdWN0aW9uc1sxOl06CisgICAgICAgICAgICAgICAgaWYgcC5sZW4gPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgbnVsbGFibGUuYWRkKHAubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBmb3IgdCBpbiBwLnByb2Q6CisgICAgICAgICAgICAgICAgICAgIGlmIHQgbm90IGluIG51bGxhYmxlOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBudWxsYWJsZS5hZGQocC5uYW1lKQorICAgICAgICAgICAgaWYgbGVuKG51bGxhYmxlKSA9PSBudW1fbnVsbGFibGU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIG51bV9udWxsYWJsZSA9IGxlbihudWxsYWJsZSkKKyAgICAgICAgcmV0dXJuIG51bGxhYmxlCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBmaW5kX25vbnRlcm1pbmFsX3RyYW5zKEMpCisgICAgIworICAgICMgR2l2ZW4gYSBzZXQgb2YgTFIoMCkgaXRlbXMsIHRoaXMgZnVuY3Rpb25zIGZpbmRzIGFsbCBvZiB0aGUgbm9uLXRlcm1pbmFsCisgICAgIyB0cmFuc2l0aW9ucy4gICAgVGhlc2UgYXJlIHRyYW5zaXRpb25zIGluIHdoaWNoIGEgZG90IGFwcGVhcnMgaW1tZWRpYXRlbHkgYmVmb3JlCisgICAgIyBhIG5vbi10ZXJtaW5hbC4gICBSZXR1cm5zIGEgbGlzdCBvZiB0dXBsZXMgb2YgdGhlIGZvcm0gKHN0YXRlLE4pIHdoZXJlIHN0YXRlCisgICAgIyBpcyB0aGUgc3RhdGUgbnVtYmVyIGFuZCBOIGlzIHRoZSBub250ZXJtaW5hbCBzeW1ib2wuCisgICAgIworICAgICMgVGhlIGlucHV0IEMgaXMgdGhlIHNldCBvZiBMUigwKSBpdGVtcy4KKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgZmluZF9ub250ZXJtaW5hbF90cmFuc2l0aW9ucyhzZWxmLCBDKToKKyAgICAgICAgdHJhbnMgPSBbXQorICAgICAgICBmb3Igc3RhdGVubywgc3RhdGUgaW4gZW51bWVyYXRlKEMpOgorICAgICAgICAgICAgZm9yIHAgaW4gc3RhdGU6CisgICAgICAgICAgICAgICAgaWYgcC5scl9pbmRleCA8IHAubGVuIC0gMToKKyAgICAgICAgICAgICAgICAgICAgdCA9IChzdGF0ZW5vLCBwLnByb2RbcC5scl9pbmRleCsxXSkKKyAgICAgICAgICAgICAgICAgICAgaWYgdFsxXSBpbiBzZWxmLmdyYW1tYXIuTm9udGVybWluYWxzOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdCBub3QgaW4gdHJhbnM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMuYXBwZW5kKHQpCisgICAgICAgIHJldHVybiB0cmFucworCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgZHJfcmVsYXRpb24oKQorICAgICMKKyAgICAjIENvbXB1dGVzIHRoZSBEUihwLEEpIHJlbGF0aW9uc2hpcHMgZm9yIG5vbi10ZXJtaW5hbCB0cmFuc2l0aW9ucy4gIFRoZSBpbnB1dAorICAgICMgaXMgYSB0dXBsZSAoc3RhdGUsTikgd2hlcmUgc3RhdGUgaXMgYSBudW1iZXIgYW5kIE4gaXMgYSBub250ZXJtaW5hbCBzeW1ib2wuCisgICAgIworICAgICMgUmV0dXJucyBhIGxpc3Qgb2YgdGVybWluYWxzLgorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBkcl9yZWxhdGlvbihzZWxmLCBDLCB0cmFucywgbnVsbGFibGUpOgorICAgICAgICBkcl9zZXQgPSB7fQorICAgICAgICBzdGF0ZSwgTiA9IHRyYW5zCisgICAgICAgIHRlcm1zID0gW10KKworICAgICAgICBnID0gc2VsZi5scjBfZ290byhDW3N0YXRlXSwgTikKKyAgICAgICAgZm9yIHAgaW4gZzoKKyAgICAgICAgICAgIGlmIHAubHJfaW5kZXggPCBwLmxlbiAtIDE6CisgICAgICAgICAgICAgICAgYSA9IHAucHJvZFtwLmxyX2luZGV4KzFdCisgICAgICAgICAgICAgICAgaWYgYSBpbiBzZWxmLmdyYW1tYXIuVGVybWluYWxzOgorICAgICAgICAgICAgICAgICAgICBpZiBhIG5vdCBpbiB0ZXJtczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1zLmFwcGVuZChhKQorCisgICAgICAgICMgVGhpcyBleHRyYSBiaXQgaXMgdG8gaGFuZGxlIHRoZSBzdGFydCBzdGF0ZQorICAgICAgICBpZiBzdGF0ZSA9PSAwIGFuZCBOID09IHNlbGYuZ3JhbW1hci5Qcm9kdWN0aW9uc1swXS5wcm9kWzBdOgorICAgICAgICAgICAgdGVybXMuYXBwZW5kKCckZW5kJykKKworICAgICAgICByZXR1cm4gdGVybXMKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIHJlYWRzX3JlbGF0aW9uKCkKKyAgICAjCisgICAgIyBDb21wdXRlcyB0aGUgUkVBRFMoKSByZWxhdGlvbiAocCxBKSBSRUFEUyAodCxDKS4KKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgcmVhZHNfcmVsYXRpb24oc2VsZiwgQywgdHJhbnMsIGVtcHR5KToKKyAgICAgICAgIyBMb29rIGZvciBlbXB0eSB0cmFuc2l0aW9ucworICAgICAgICByZWwgPSBbXQorICAgICAgICBzdGF0ZSwgTiA9IHRyYW5zCisKKyAgICAgICAgZyA9IHNlbGYubHIwX2dvdG8oQ1tzdGF0ZV0sIE4pCisgICAgICAgIGogPSBzZWxmLmxyMF9jaWRoYXNoLmdldChpZChnKSwgLTEpCisgICAgICAgIGZvciBwIGluIGc6CisgICAgICAgICAgICBpZiBwLmxyX2luZGV4IDwgcC5sZW4gLSAxOgorICAgICAgICAgICAgICAgIGEgPSBwLnByb2RbcC5scl9pbmRleCArIDFdCisgICAgICAgICAgICAgICAgaWYgYSBpbiBlbXB0eToKKyAgICAgICAgICAgICAgICAgICAgcmVsLmFwcGVuZCgoaiwgYSkpCisKKyAgICAgICAgcmV0dXJuIHJlbAorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgY29tcHV0ZV9sb29rYmFja19pbmNsdWRlcygpCisgICAgIworICAgICMgRGV0ZXJtaW5lcyB0aGUgbG9va2JhY2sgYW5kIGluY2x1ZGVzIHJlbGF0aW9ucworICAgICMKKyAgICAjIExPT0tCQUNLOgorICAgICMKKyAgICAjIFRoaXMgcmVsYXRpb24gaXMgZGV0ZXJtaW5lZCBieSBydW5uaW5nIHRoZSBMUigwKSBzdGF0ZSBtYWNoaW5lIGZvcndhcmQuCisgICAgIyBGb3IgZXhhbXBsZSwgc3RhcnRpbmcgd2l0aCBhIHByb2R1Y3Rpb24gIk4gOiAuIEEgQiBDIiwgd2UgcnVuIGl0IGZvcndhcmQKKyAgICAjIHRvIG9idGFpbiAiTiA6IEEgQiBDIC4iICAgV2UgdGhlbiBidWlsZCBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoaXMgZmluYWwKKyAgICAjIHN0YXRlIGFuZCB0aGUgc3RhcnRpbmcgc3RhdGUuICAgVGhlc2UgcmVsYXRpb25zaGlwcyBhcmUgc3RvcmVkIGluIGEgZGljdGlvbmFyeQorICAgICMgbG9va2RpY3QuCisgICAgIworICAgICMgSU5DTFVERVM6CisgICAgIworICAgICMgQ29tcHV0ZXMgdGhlIElOQ0xVREUoKSByZWxhdGlvbiAocCxBKSBJTkNMVURFUyAocCcsQikuCisgICAgIworICAgICMgVGhpcyByZWxhdGlvbiBpcyB1c2VkIHRvIGRldGVybWluZSBub24tdGVybWluYWwgdHJhbnNpdGlvbnMgdGhhdCBvY2N1cgorICAgICMgaW5zaWRlIG9mIG90aGVyIG5vbi10ZXJtaW5hbCB0cmFuc2l0aW9uIHN0YXRlcy4gICAocCxBKSBJTkNMVURFUyAocCcsIEIpCisgICAgIyBpZiB0aGUgZm9sbG93aW5nIGhvbGRzOgorICAgICMKKyAgICAjICAgICAgIEIgLT4gTEFULCB3aGVyZSBUIC0+IGVwc2lsb24gYW5kIHAnIC1MLT4gcAorICAgICMKKyAgICAjIEwgaXMgZXNzZW50aWFsbHkgYSBwcmVmaXggKHdoaWNoIG1heSBiZSBlbXB0eSksIFQgaXMgYSBzdWZmaXggdGhhdCBtdXN0IGJlCisgICAgIyBhYmxlIHRvIGRlcml2ZSBhbiBlbXB0eSBzdHJpbmcuICBTdGF0ZSBwJyBtdXN0IGxlYWQgdG8gc3RhdGUgcCB3aXRoIHRoZSBzdHJpbmcgTC4KKyAgICAjCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGNvbXB1dGVfbG9va2JhY2tfaW5jbHVkZXMoc2VsZiwgQywgdHJhbnMsIG51bGxhYmxlKToKKyAgICAgICAgbG9va2RpY3QgPSB7fSAgICAgICAgICAjIERpY3Rpb25hcnkgb2YgbG9va2JhY2sgcmVsYXRpb25zCisgICAgICAgIGluY2x1ZGVkaWN0ID0ge30gICAgICAgIyBEaWN0aW9uYXJ5IG9mIGluY2x1ZGUgcmVsYXRpb25zCisKKyAgICAgICAgIyBNYWtlIGEgZGljdGlvbmFyeSBvZiBub24tdGVybWluYWwgdHJhbnNpdGlvbnMKKyAgICAgICAgZHRyYW5zID0ge30KKyAgICAgICAgZm9yIHQgaW4gdHJhbnM6CisgICAgICAgICAgICBkdHJhbnNbdF0gPSAxCisKKyAgICAgICAgIyBMb29wIG92ZXIgYWxsIHRyYW5zaXRpb25zIGFuZCBjb21wdXRlIGxvb2tiYWNrcyBhbmQgaW5jbHVkZXMKKyAgICAgICAgZm9yIHN0YXRlLCBOIGluIHRyYW5zOgorICAgICAgICAgICAgbG9va2IgPSBbXQorICAgICAgICAgICAgaW5jbHVkZXMgPSBbXQorICAgICAgICAgICAgZm9yIHAgaW4gQ1tzdGF0ZV06CisgICAgICAgICAgICAgICAgaWYgcC5uYW1lICE9IE46CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAjIE9rYXksIHdlIGhhdmUgYSBuYW1lIG1hdGNoLiAgV2Ugbm93IGZvbGxvdyB0aGUgcHJvZHVjdGlvbiBhbGwgdGhlIHdheQorICAgICAgICAgICAgICAgICMgdGhyb3VnaCB0aGUgc3RhdGUgbWFjaGluZSB1bnRpbCB3ZSBnZXQgdGhlIC4gb24gdGhlIHJpZ2h0IGhhbmQgc2lkZQorCisgICAgICAgICAgICAgICAgbHJfaW5kZXggPSBwLmxyX2luZGV4CisgICAgICAgICAgICAgICAgaiA9IHN0YXRlCisgICAgICAgICAgICAgICAgd2hpbGUgbHJfaW5kZXggPCBwLmxlbiAtIDE6CisgICAgICAgICAgICAgICAgICAgIGxyX2luZGV4ID0gbHJfaW5kZXggKyAxCisgICAgICAgICAgICAgICAgICAgIHQgPSBwLnByb2RbbHJfaW5kZXhdCisKKyAgICAgICAgICAgICAgICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhpcyBzeW1ib2wgYW5kIHN0YXRlIGFyZSBhIG5vbi10ZXJtaW5hbCB0cmFuc2l0aW9uCisgICAgICAgICAgICAgICAgICAgIGlmIChqLCB0KSBpbiBkdHJhbnM6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFllcy4gIE9rYXksIHRoZXJlIGlzIHNvbWUgY2hhbmNlIHRoYXQgdGhpcyBpcyBhbiBpbmNsdWRlcyByZWxhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgb25seSB3YXkgdG8ga25vdyBmb3IgY2VydGFpbiBpcyB3aGV0aGVyIHRoZSByZXN0IG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBwcm9kdWN0aW9uIGRlcml2ZXMgZW1wdHkKKworICAgICAgICAgICAgICAgICAgICAgICAgbGkgPSBscl9pbmRleCArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIGxpIDwgcC5sZW46CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcC5wcm9kW2xpXSBpbiBzZWxmLmdyYW1tYXIuVGVybWluYWxzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayAgICAgICMgTm8gZm9yZ2V0IGl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcC5wcm9kW2xpXSBub3QgaW4gbnVsbGFibGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGkgPSBsaSArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBBcHBlYXJzIHRvIGJlIGEgcmVsYXRpb24gYmV0d2VlbiAoaix0KSBhbmQgKHN0YXRlLE4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXMuYXBwZW5kKChqLCB0KSkKKworICAgICAgICAgICAgICAgICAgICBnID0gc2VsZi5scjBfZ290byhDW2pdLCB0KSAgICAgICAgICAgICAgICMgR28gdG8gbmV4dCBzZXQKKyAgICAgICAgICAgICAgICAgICAgaiA9IHNlbGYubHIwX2NpZGhhc2guZ2V0KGlkKGcpLCAtMSkgICAgICAjIEdvIHRvIG5leHQgc3RhdGUKKworICAgICAgICAgICAgICAgICMgV2hlbiB3ZSBnZXQgaGVyZSwgaiBpcyB0aGUgZmluYWwgc3RhdGUsIG5vdyB3ZSBoYXZlIHRvIGxvY2F0ZSB0aGUgcHJvZHVjdGlvbgorICAgICAgICAgICAgICAgIGZvciByIGluIENbal06CisgICAgICAgICAgICAgICAgICAgIGlmIHIubmFtZSAhPSBwLm5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBpZiByLmxlbiAhPSBwLmxlbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGkgPSAwCisgICAgICAgICAgICAgICAgICAgICMgVGhpcyBsb29rIGlzIGNvbXBhcmluZyBhIHByb2R1Y3Rpb24gIi4gQSBCIEMiIHdpdGggIkEgQiBDIC4iCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIGkgPCByLmxyX2luZGV4OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgci5wcm9kW2ldICE9IHAucHJvZFtpKzFdOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICBpID0gaSArIDEKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvb2tiLmFwcGVuZCgoaiwgcikpCisgICAgICAgICAgICBmb3IgaSBpbiBpbmNsdWRlczoKKyAgICAgICAgICAgICAgICBpZiBpIG5vdCBpbiBpbmNsdWRlZGljdDoKKyAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWRpY3RbaV0gPSBbXQorICAgICAgICAgICAgICAgIGluY2x1ZGVkaWN0W2ldLmFwcGVuZCgoc3RhdGUsIE4pKQorICAgICAgICAgICAgbG9va2RpY3RbKHN0YXRlLCBOKV0gPSBsb29rYgorCisgICAgICAgIHJldHVybiBsb29rZGljdCwgaW5jbHVkZWRpY3QKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIGNvbXB1dGVfcmVhZF9zZXRzKCkKKyAgICAjCisgICAgIyBHaXZlbiBhIHNldCBvZiBMUigwKSBpdGVtcywgdGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgcmVhZCBzZXRzLgorICAgICMKKyAgICAjIElucHV0czogIEMgICAgICAgID0gIFNldCBvZiBMUigwKSBpdGVtcworICAgICMgICAgICAgICAgbnRyYW5zICAgPSBTZXQgb2Ygbm9udGVybWluYWwgdHJhbnNpdGlvbnMKKyAgICAjICAgICAgICAgIG51bGxhYmxlID0gU2V0IG9mIGVtcHR5IHRyYW5zaXRpb25zCisgICAgIworICAgICMgUmV0dXJucyBhIHNldCBjb250YWluaW5nIHRoZSByZWFkIHNldHMKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgY29tcHV0ZV9yZWFkX3NldHMoc2VsZiwgQywgbnRyYW5zLCBudWxsYWJsZSk6CisgICAgICAgIEZQID0gbGFtYmRhIHg6IHNlbGYuZHJfcmVsYXRpb24oQywgeCwgbnVsbGFibGUpCisgICAgICAgIFIgPSAgbGFtYmRhIHg6IHNlbGYucmVhZHNfcmVsYXRpb24oQywgeCwgbnVsbGFibGUpCisgICAgICAgIEYgPSBkaWdyYXBoKG50cmFucywgUiwgRlApCisgICAgICAgIHJldHVybiBGCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBjb21wdXRlX2ZvbGxvd19zZXRzKCkKKyAgICAjCisgICAgIyBHaXZlbiBhIHNldCBvZiBMUigwKSBpdGVtcywgYSBzZXQgb2Ygbm9uLXRlcm1pbmFsIHRyYW5zaXRpb25zLCBhIHJlYWRzZXQsCisgICAgIyBhbmQgYW4gaW5jbHVkZSBzZXQsIHRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGZvbGxvdyBzZXRzCisgICAgIworICAgICMgRm9sbG93KHAsQSkgPSBSZWFkKHAsQSkgVSBVIHtGb2xsb3cocCcsQikgfCAocCxBKSBJTkNMVURFUyAocCcsQil9CisgICAgIworICAgICMgSW5wdXRzOgorICAgICMgICAgICAgICAgICBudHJhbnMgICAgID0gU2V0IG9mIG5vbnRlcm1pbmFsIHRyYW5zaXRpb25zCisgICAgIyAgICAgICAgICAgIHJlYWRzZXRzICAgPSBSZWFkc2V0IChwcmV2aW91c2x5IGNvbXB1dGVkKQorICAgICMgICAgICAgICAgICBpbmNsc2V0cyAgID0gSW5jbHVkZSBzZXRzIChwcmV2aW91c2x5IGNvbXB1dGVkKQorICAgICMKKyAgICAjIFJldHVybnMgYSBzZXQgY29udGFpbmluZyB0aGUgZm9sbG93IHNldHMKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgY29tcHV0ZV9mb2xsb3dfc2V0cyhzZWxmLCBudHJhbnMsIHJlYWRzZXRzLCBpbmNsc2V0cyk6CisgICAgICAgIEZQID0gbGFtYmRhIHg6IHJlYWRzZXRzW3hdCisgICAgICAgIFIgID0gbGFtYmRhIHg6IGluY2xzZXRzLmdldCh4LCBbXSkKKyAgICAgICAgRiA9IGRpZ3JhcGgobnRyYW5zLCBSLCBGUCkKKyAgICAgICAgcmV0dXJuIEYKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIGFkZF9sb29rYWhlYWRzKCkKKyAgICAjCisgICAgIyBBdHRhY2hlcyB0aGUgbG9va2FoZWFkIHN5bWJvbHMgdG8gZ3JhbW1hciBydWxlcy4KKyAgICAjCisgICAgIyBJbnB1dHM6ICAgIGxvb2tiYWNrcyAgICAgICAgIC0gIFNldCBvZiBsb29rYmFjayByZWxhdGlvbnMKKyAgICAjICAgICAgICAgICAgZm9sbG93c2V0ICAgICAgICAgLSAgQ29tcHV0ZWQgZm9sbG93IHNldAorICAgICMKKyAgICAjIFRoaXMgZnVuY3Rpb24gZGlyZWN0bHkgYXR0YWNoZXMgdGhlIGxvb2thaGVhZHMgdG8gcHJvZHVjdGlvbnMgY29udGFpbmVkCisgICAgIyBpbiB0aGUgbG9va2JhY2tzIHNldAorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBhZGRfbG9va2FoZWFkcyhzZWxmLCBsb29rYmFja3MsIGZvbGxvd3NldCk6CisgICAgICAgIGZvciB0cmFucywgbGIgaW4gbG9va2JhY2tzLml0ZW1zKCk6CisgICAgICAgICAgICAjIExvb3Agb3ZlciBwcm9kdWN0aW9ucyBpbiBsb29rYmFjaworICAgICAgICAgICAgZm9yIHN0YXRlLCBwIGluIGxiOgorICAgICAgICAgICAgICAgIGlmIHN0YXRlIG5vdCBpbiBwLmxvb2thaGVhZHM6CisgICAgICAgICAgICAgICAgICAgIHAubG9va2FoZWFkc1tzdGF0ZV0gPSBbXQorICAgICAgICAgICAgICAgIGYgPSBmb2xsb3dzZXQuZ2V0KHRyYW5zLCBbXSkKKyAgICAgICAgICAgICAgICBmb3IgYSBpbiBmOgorICAgICAgICAgICAgICAgICAgICBpZiBhIG5vdCBpbiBwLmxvb2thaGVhZHNbc3RhdGVdOgorICAgICAgICAgICAgICAgICAgICAgICAgcC5sb29rYWhlYWRzW3N0YXRlXS5hcHBlbmQoYSkKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIGFkZF9sYWxyX2xvb2thaGVhZHMoKQorICAgICMKKyAgICAjIFRoaXMgZnVuY3Rpb24gZG9lcyBhbGwgb2YgdGhlIHdvcmsgb2YgYWRkaW5nIGxvb2thaGVhZCBpbmZvcm1hdGlvbiBmb3IgdXNlCisgICAgIyB3aXRoIExBTFIgcGFyc2luZworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBhZGRfbGFscl9sb29rYWhlYWRzKHNlbGYsIEMpOgorICAgICAgICAjIERldGVybWluZSBhbGwgb2YgdGhlIG51bGxhYmxlIG5vbnRlcm1pbmFscworICAgICAgICBudWxsYWJsZSA9IHNlbGYuY29tcHV0ZV9udWxsYWJsZV9ub250ZXJtaW5hbHMoKQorCisgICAgICAgICMgRmluZCBhbGwgbm9uLXRlcm1pbmFsIHRyYW5zaXRpb25zCisgICAgICAgIHRyYW5zID0gc2VsZi5maW5kX25vbnRlcm1pbmFsX3RyYW5zaXRpb25zKEMpCisKKyAgICAgICAgIyBDb21wdXRlIHJlYWQgc2V0cworICAgICAgICByZWFkc2V0cyA9IHNlbGYuY29tcHV0ZV9yZWFkX3NldHMoQywgdHJhbnMsIG51bGxhYmxlKQorCisgICAgICAgICMgQ29tcHV0ZSBsb29rYmFjay9pbmNsdWRlcyByZWxhdGlvbnMKKyAgICAgICAgbG9va2QsIGluY2x1ZGVkID0gc2VsZi5jb21wdXRlX2xvb2tiYWNrX2luY2x1ZGVzKEMsIHRyYW5zLCBudWxsYWJsZSkKKworICAgICAgICAjIENvbXB1dGUgTEFMUiBGT0xMT1cgc2V0cworICAgICAgICBmb2xsb3dzZXRzID0gc2VsZi5jb21wdXRlX2ZvbGxvd19zZXRzKHRyYW5zLCByZWFkc2V0cywgaW5jbHVkZWQpCisKKyAgICAgICAgIyBBZGQgYWxsIG9mIHRoZSBsb29rYWhlYWRzCisgICAgICAgIHNlbGYuYWRkX2xvb2thaGVhZHMobG9va2QsIGZvbGxvd3NldHMpCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBscl9wYXJzZV90YWJsZSgpCisgICAgIworICAgICMgVGhpcyBmdW5jdGlvbiBjb25zdHJ1Y3RzIHRoZSBwYXJzZSB0YWJsZXMgZm9yIFNMUiBvciBMQUxSCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGRlZiBscl9wYXJzZV90YWJsZShzZWxmKToKKyAgICAgICAgUHJvZHVjdGlvbnMgPSBzZWxmLmdyYW1tYXIuUHJvZHVjdGlvbnMKKyAgICAgICAgUHJlY2VkZW5jZSAgPSBzZWxmLmdyYW1tYXIuUHJlY2VkZW5jZQorICAgICAgICBnb3RvICAgPSBzZWxmLmxyX2dvdG8gICAgICAgICAjIEdvdG8gYXJyYXkKKyAgICAgICAgYWN0aW9uID0gc2VsZi5scl9hY3Rpb24gICAgICAgIyBBY3Rpb24gYXJyYXkKKyAgICAgICAgbG9nICAgID0gc2VsZi5sb2cgICAgICAgICAgICAgIyBMb2dnZXIgZm9yIG91dHB1dAorCisgICAgICAgIGFjdGlvbnAgPSB7fSAgICAgICAgICAgICAgICAgICMgQWN0aW9uIHByb2R1Y3Rpb24gYXJyYXkgKHRlbXBvcmFyeSkKKworICAgICAgICBsb2cuaW5mbygnUGFyc2luZyBtZXRob2Q6ICVzJywgc2VsZi5scl9tZXRob2QpCisKKyAgICAgICAgIyBTdGVwIDE6IENvbnN0cnVjdCBDID0geyBJMCwgSTEsIC4uLiBJTn0sIGNvbGxlY3Rpb24gb2YgTFIoMCkgaXRlbXMKKyAgICAgICAgIyBUaGlzIGRldGVybWluZXMgdGhlIG51bWJlciBvZiBzdGF0ZXMKKworICAgICAgICBDID0gc2VsZi5scjBfaXRlbXMoKQorCisgICAgICAgIGlmIHNlbGYubHJfbWV0aG9kID09ICdMQUxSJzoKKyAgICAgICAgICAgIHNlbGYuYWRkX2xhbHJfbG9va2FoZWFkcyhDKQorCisgICAgICAgICMgQnVpbGQgdGhlIHBhcnNlciB0YWJsZSwgc3RhdGUgYnkgc3RhdGUKKyAgICAgICAgc3QgPSAwCisgICAgICAgIGZvciBJIGluIEM6CisgICAgICAgICAgICAjIExvb3Agb3ZlciBlYWNoIHByb2R1Y3Rpb24gaW4gSQorICAgICAgICAgICAgYWN0bGlzdCA9IFtdICAgICAgICAgICAgICAjIExpc3Qgb2YgYWN0aW9ucworICAgICAgICAgICAgc3RfYWN0aW9uICA9IHt9CisgICAgICAgICAgICBzdF9hY3Rpb25wID0ge30KKyAgICAgICAgICAgIHN0X2dvdG8gICAgPSB7fQorICAgICAgICAgICAgbG9nLmluZm8oJycpCisgICAgICAgICAgICBsb2cuaW5mbygnc3RhdGUgJWQnLCBzdCkKKyAgICAgICAgICAgIGxvZy5pbmZvKCcnKQorICAgICAgICAgICAgZm9yIHAgaW4gSToKKyAgICAgICAgICAgICAgICBsb2cuaW5mbygnICAgICglZCkgJXMnLCBwLm51bWJlciwgcCkKKyAgICAgICAgICAgIGxvZy5pbmZvKCcnKQorCisgICAgICAgICAgICBmb3IgcCBpbiBJOgorICAgICAgICAgICAgICAgICAgICBpZiBwLmxlbiA9PSBwLmxyX2luZGV4ICsgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHAubmFtZSA9PSAiUyciOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgU3RhcnQgc3ltYm9sLiBBY2NlcHQhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RfYWN0aW9uWyckZW5kJ10gPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RfYWN0aW9ucFsnJGVuZCddID0gcAorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFdlIGFyZSBhdCB0aGUgZW5kIG9mIGEgcHJvZHVjdGlvbi4gIFJlZHVjZSEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmxyX21ldGhvZCA9PSAnTEFMUic6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhaGVhZHMgPSBwLmxvb2thaGVhZHNbc3RdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFoZWFkcyA9IHNlbGYuZ3JhbW1hci5Gb2xsb3dbcC5uYW1lXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhIGluIGxhaGVhZHM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGxpc3QuYXBwZW5kKChhLCBwLCAncmVkdWNlIHVzaW5nIHJ1bGUgJWQgKCVzKScgJSAocC5udW1iZXIsIHApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IHN0X2FjdGlvbi5nZXQoYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgV2hvYS4gSGF2ZSBhIHNoaWZ0L3JlZHVjZSBvciByZWR1Y2UvcmVkdWNlIGNvbmZsaWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiByID4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE5lZWQgdG8gZGVjaWRlIG9uIHNoaWZ0IG9yIHJlZHVjZSBoZXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBCeSBkZWZhdWx0IHdlIGZhdm9yIHNoaWZ0aW5nLiBOZWVkIHRvIGFkZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc29tZSBwcmVjZWRlbmNlIHJ1bGVzIGhlcmUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFNoaWZ0IHByZWNlZGVuY2UgY29tZXMgZnJvbSB0aGUgdG9rZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJlYywgc2xldmVsID0gUHJlY2VkZW5jZS5nZXQoYSwgKCdyaWdodCcsIDApKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBSZWR1Y2UgcHJlY2VkZW5jZSBjb21lcyBmcm9tIHJ1bGUgYmVpbmcgcmVkdWNlZCAocCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycHJlYywgcmxldmVsID0gUHJvZHVjdGlvbnNbcC5udW1iZXJdLnByZWMKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbGV2ZWwgPCBybGV2ZWwpIG9yICgoc2xldmVsID09IHJsZXZlbCkgYW5kIChycHJlYyA9PSAnbGVmdCcpKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBXZSByZWFsbHkgbmVlZCB0byByZWR1Y2UgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RfYWN0aW9uW2FdID0gLXAubnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0X2FjdGlvbnBbYV0gPSBwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzbGV2ZWwgYW5kIG5vdCBybGV2ZWw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygnICAhIHNoaWZ0L3JlZHVjZSBjb25mbGljdCBmb3IgJXMgcmVzb2x2ZWQgYXMgcmVkdWNlJywgYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3JfY29uZmxpY3RzLmFwcGVuZCgoc3QsIGEsICdyZWR1Y2UnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdGlvbnNbcC5udW1iZXJdLnJlZHVjZWQgKz0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgKHNsZXZlbCA9PSBybGV2ZWwpIGFuZCAocnByZWMgPT0gJ25vbmFzc29jJyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0X2FjdGlvblthXSA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEhtbW0uIEd1ZXNzIHdlJ2xsIGtlZXAgdGhlIHNoaWZ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBybGV2ZWw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygnICAhIHNoaWZ0L3JlZHVjZSBjb25mbGljdCBmb3IgJXMgcmVzb2x2ZWQgYXMgc2hpZnQnLCBhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zcl9jb25mbGljdHMuYXBwZW5kKChzdCwgYSwgJ3NoaWZ0JykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIHIgPCAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgUmVkdWNlL3JlZHVjZSBjb25mbGljdC4gICBJbiB0aGlzIGNhc2UsIHdlIGZhdm9yIHRoZSBydWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGF0IHdhcyBkZWZpbmVkIGZpcnN0IGluIHRoZSBncmFtbWFyIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRwID0gUHJvZHVjdGlvbnNbLXJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHAgPSBQcm9kdWN0aW9uc1twLm51bWJlcl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBvbGRwLmxpbmUgPiBwcC5saW5lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdF9hY3Rpb25bYV0gPSAtcC5udW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RfYWN0aW9ucFthXSA9IHAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VucCwgcmVqZWN0cCA9IHBwLCBvbGRwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2R1Y3Rpb25zW3AubnVtYmVyXS5yZWR1Y2VkICs9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdGlvbnNbb2xkcC5udW1iZXJdLnJlZHVjZWQgLT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob3NlbnAsIHJlamVjdHAgPSBvbGRwLCBwcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnJfY29uZmxpY3RzLmFwcGVuZCgoc3QsIGNob3NlbnAsIHJlamVjdHApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCcgICEgcmVkdWNlL3JlZHVjZSBjb25mbGljdCBmb3IgJXMgcmVzb2x2ZWQgdXNpbmcgcnVsZSAlZCAoJXMpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLCBzdF9hY3Rpb25wW2FdLm51bWJlciwgc3RfYWN0aW9ucFthXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgTEFMUkVycm9yKCdVbmtub3duIGNvbmZsaWN0IGluIHN0YXRlICVkJyAlIHN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RfYWN0aW9uW2FdID0gLXAubnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdF9hY3Rpb25wW2FdID0gcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdGlvbnNbcC5udW1iZXJdLnJlZHVjZWQgKz0gMQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHAubHJfaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBwLnByb2RbaSsxXSAgICAgICAjIEdldCBzeW1ib2wgcmlnaHQgYWZ0ZXIgdGhlICIuIgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgYSBpbiBzZWxmLmdyYW1tYXIuVGVybWluYWxzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSBzZWxmLmxyMF9nb3RvKEksIGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiA9IHNlbGYubHIwX2NpZGhhc2guZ2V0KGlkKGcpLCAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBqID49IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgV2UgYXJlIGluIGEgc2hpZnQgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0bGlzdC5hcHBlbmQoKGEsIHAsICdzaGlmdCBhbmQgZ28gdG8gc3RhdGUgJWQnICUgaikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBzdF9hY3Rpb24uZ2V0KGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFdob2EgaGF2ZSBhIHNoaWZ0L3JlZHVjZSBvciBzaGlmdC9zaGlmdCBjb25mbGljdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgciA+IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgciAhPSBqOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBMQUxSRXJyb3IoJ1NoaWZ0L3NoaWZ0IGNvbmZsaWN0IGluIHN0YXRlICVkJyAlIHN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiByIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIERvIGEgcHJlY2VkZW5jZSBjaGVjay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgLSAgaWYgcHJlY2VkZW5jZSBvZiByZWR1Y2UgcnVsZSBpcyBoaWdoZXIsIHdlIHJlZHVjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgLSAgaWYgcHJlY2VkZW5jZSBvZiByZWR1Y2UgaXMgc2FtZSBhbmQgbGVmdCBhc3NvYywgd2UgcmVkdWNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAtICBvdGhlcndpc2Ugd2Ugc2hpZnQKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgU2hpZnQgcHJlY2VkZW5jZSBjb21lcyBmcm9tIHRoZSB0b2tlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmVjLCBzbGV2ZWwgPSBQcmVjZWRlbmNlLmdldChhLCAoJ3JpZ2h0JywgMCkpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFJlZHVjZSBwcmVjZWRlbmNlIGNvbWVzIGZyb20gdGhlIHJ1bGUgdGhhdCBjb3VsZCBoYXZlIGJlZW4gcmVkdWNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJwcmVjLCBybGV2ZWwgPSBQcm9kdWN0aW9uc1tzdF9hY3Rpb25wW2FdLm51bWJlcl0ucHJlYworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNsZXZlbCA+IHJsZXZlbCkgb3IgKChzbGV2ZWwgPT0gcmxldmVsKSBhbmQgKHJwcmVjID09ICdyaWdodCcpKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBXZSBkZWNpZGUgdG8gc2hpZnQgaGVyZS4uLiBoaWdoZXN0IHByZWNlZGVuY2UgdG8gc2hpZnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdGlvbnNbc3RfYWN0aW9ucFthXS5udW1iZXJdLnJlZHVjZWQgLT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdF9hY3Rpb25bYV0gPSBqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0X2FjdGlvbnBbYV0gPSBwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBybGV2ZWw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygnICAhIHNoaWZ0L3JlZHVjZSBjb25mbGljdCBmb3IgJXMgcmVzb2x2ZWQgYXMgc2hpZnQnLCBhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zcl9jb25mbGljdHMuYXBwZW5kKChzdCwgYSwgJ3NoaWZ0JykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiAoc2xldmVsID09IHJsZXZlbCkgYW5kIChycHJlYyA9PSAnbm9uYXNzb2MnKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RfYWN0aW9uW2FdID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgSG1tbS4gR3Vlc3Mgd2UnbGwga2VlcCB0aGUgcmVkdWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzbGV2ZWwgYW5kIG5vdCBybGV2ZWw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygnICAhIHNoaWZ0L3JlZHVjZSBjb25mbGljdCBmb3IgJXMgcmVzb2x2ZWQgYXMgcmVkdWNlJywgYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3JfY29uZmxpY3RzLmFwcGVuZCgoc3QsIGEsICdyZWR1Y2UnKSkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBMQUxSRXJyb3IoJ1Vua25vd24gY29uZmxpY3QgaW4gc3RhdGUgJWQnICUgc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdF9hY3Rpb25bYV0gPSBqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdF9hY3Rpb25wW2FdID0gcAorCisgICAgICAgICAgICAjIFByaW50IHRoZSBhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHRlcm1pbmFsCisgICAgICAgICAgICBfYWN0cHJpbnQgPSB7fQorICAgICAgICAgICAgZm9yIGEsIHAsIG0gaW4gYWN0bGlzdDoKKyAgICAgICAgICAgICAgICBpZiBhIGluIHN0X2FjdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgaWYgcCBpcyBzdF9hY3Rpb25wW2FdOgorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oJyAgICAlLTE1cyAlcycsIGEsIG0pCisgICAgICAgICAgICAgICAgICAgICAgICBfYWN0cHJpbnRbKGEsIG0pXSA9IDEKKyAgICAgICAgICAgIGxvZy5pbmZvKCcnKQorICAgICAgICAgICAgIyBQcmludCB0aGUgYWN0aW9ucyB0aGF0IHdlcmUgbm90IHVzZWQuIChkZWJ1Z2dpbmcpCisgICAgICAgICAgICBub3RfdXNlZCA9IDAKKyAgICAgICAgICAgIGZvciBhLCBwLCBtIGluIGFjdGxpc3Q6CisgICAgICAgICAgICAgICAgaWYgYSBpbiBzdF9hY3Rpb246CisgICAgICAgICAgICAgICAgICAgIGlmIHAgaXMgbm90IHN0X2FjdGlvbnBbYV06CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgKGEsIG0pIGluIF9hY3RwcmludDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoJyAgISAlLTE1cyBbICVzIF0nLCBhLCBtKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdF91c2VkID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hY3RwcmludFsoYSwgbSldID0gMQorICAgICAgICAgICAgaWYgbm90X3VzZWQ6CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCcnKQorCisgICAgICAgICAgICAjIENvbnN0cnVjdCB0aGUgZ290byB0YWJsZSBmb3IgdGhpcyBzdGF0ZQorCisgICAgICAgICAgICBua2V5cyA9IHt9CisgICAgICAgICAgICBmb3IgaWkgaW4gSToKKyAgICAgICAgICAgICAgICBmb3IgcyBpbiBpaS51c3ltczoKKyAgICAgICAgICAgICAgICAgICAgaWYgcyBpbiBzZWxmLmdyYW1tYXIuTm9udGVybWluYWxzOgorICAgICAgICAgICAgICAgICAgICAgICAgbmtleXNbc10gPSBOb25lCisgICAgICAgICAgICBmb3IgbiBpbiBua2V5czoKKyAgICAgICAgICAgICAgICBnID0gc2VsZi5scjBfZ290byhJLCBuKQorICAgICAgICAgICAgICAgIGogPSBzZWxmLmxyMF9jaWRoYXNoLmdldChpZChnKSwgLTEpCisgICAgICAgICAgICAgICAgaWYgaiA+PSAwOgorICAgICAgICAgICAgICAgICAgICBzdF9nb3RvW25dID0gagorICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygnICAgICUtMzBzIHNoaWZ0IGFuZCBnbyB0byBzdGF0ZSAlZCcsIG4sIGopCisKKyAgICAgICAgICAgIGFjdGlvbltzdF0gPSBzdF9hY3Rpb24KKyAgICAgICAgICAgIGFjdGlvbnBbc3RdID0gc3RfYWN0aW9ucAorICAgICAgICAgICAgZ290b1tzdF0gPSBzdF9nb3RvCisgICAgICAgICAgICBzdCArPSAxCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyB3cml0ZSgpCisgICAgIworICAgICMgVGhpcyBmdW5jdGlvbiB3cml0ZXMgdGhlIExSIHBhcnNpbmcgdGFibGVzIHRvIGEgZmlsZQorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiB3cml0ZV90YWJsZShzZWxmLCB0YWJtb2R1bGUsIG91dHB1dGRpcj0nJywgc2lnbmF0dXJlPScnKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh0YWJtb2R1bGUsIHR5cGVzLk1vZHVsZVR5cGUpOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiV29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIHRhYm1vZHVsZSIpCisKKyAgICAgICAgYmFzZW1vZHVsZW5hbWUgPSB0YWJtb2R1bGUuc3BsaXQoJy4nKVstMV0KKyAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4ob3V0cHV0ZGlyLCBiYXNlbW9kdWxlbmFtZSkgKyAnLnB5JworICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwgJ3cnKQorCisgICAgICAgICAgICBmLndyaXRlKCcnJworIyAlcworIyBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuIERvIG5vdCBlZGl0LgorX3RhYnZlcnNpb24gPSAlcgorCitfbHJfbWV0aG9kID0gJXIKKworX2xyX3NpZ25hdHVyZSA9ICVyCisgICAgJycnICUgKG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpLCBfX3RhYnZlcnNpb25fXywgc2VsZi5scl9tZXRob2QsIHNpZ25hdHVyZSkpCisKKyAgICAgICAgICAgICMgQ2hhbmdlIHNtYWxsZXIgdG8gMCB0byBnbyBiYWNrIHRvIG9yaWdpbmFsIHRhYmxlcworICAgICAgICAgICAgc21hbGxlciA9IDEKKworICAgICAgICAgICAgIyBGYWN0b3Igb3V0IG5hbWVzIHRvIHRyeSBhbmQgbWFrZSBzbWFsbGVyCisgICAgICAgICAgICBpZiBzbWFsbGVyOgorICAgICAgICAgICAgICAgIGl0ZW1zID0ge30KKworICAgICAgICAgICAgICAgIGZvciBzLCBuZCBpbiBzZWxmLmxyX2FjdGlvbi5pdGVtcygpOgorICAgICAgICAgICAgICAgICAgICBmb3IgbmFtZSwgdiBpbiBuZC5pdGVtcygpOgorICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGl0ZW1zLmdldChuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IChbXSwgW10pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNbbmFtZV0gPSBpCisgICAgICAgICAgICAgICAgICAgICAgICBpWzBdLmFwcGVuZChzKQorICAgICAgICAgICAgICAgICAgICAgICAgaVsxXS5hcHBlbmQodikKKworICAgICAgICAgICAgICAgIGYud3JpdGUoJ1xuX2xyX2FjdGlvbl9pdGVtcyA9IHsnKQorICAgICAgICAgICAgICAgIGZvciBrLCB2IGluIGl0ZW1zLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoJyVyOihbJyAlIGspCisgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHZbMF06CisgICAgICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCclciwnICUgaSkKKyAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgnXSxbJykKKyAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gdlsxXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoJyVyLCcgJSBpKQorCisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoJ10pLCcpCisgICAgICAgICAgICAgICAgZi53cml0ZSgnfVxuJykKKworICAgICAgICAgICAgICAgIGYud3JpdGUoJycnCitfbHJfYWN0aW9uID0ge30KK2ZvciBfaywgX3YgaW4gX2xyX2FjdGlvbl9pdGVtcy5pdGVtcygpOgorICAgZm9yIF94LF95IGluIHppcChfdlswXSxfdlsxXSk6CisgICAgICBpZiBub3QgX3ggaW4gX2xyX2FjdGlvbjogIF9scl9hY3Rpb25bX3hdID0ge30KKyAgICAgIF9scl9hY3Rpb25bX3hdW19rXSA9IF95CitkZWwgX2xyX2FjdGlvbl9pdGVtcworJycnKQorCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGYud3JpdGUoJ1xuX2xyX2FjdGlvbiA9IHsgJykKKyAgICAgICAgICAgICAgICBmb3IgaywgdiBpbiBzZWxmLmxyX2FjdGlvbi5pdGVtcygpOgorICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCcoJXIsJXIpOiVyLCcgJSAoa1swXSwga1sxXSwgdikpCisgICAgICAgICAgICAgICAgZi53cml0ZSgnfVxuJykKKworICAgICAgICAgICAgaWYgc21hbGxlcjoKKyAgICAgICAgICAgICAgICAjIEZhY3RvciBvdXQgbmFtZXMgdG8gdHJ5IGFuZCBtYWtlIHNtYWxsZXIKKyAgICAgICAgICAgICAgICBpdGVtcyA9IHt9CisKKyAgICAgICAgICAgICAgICBmb3IgcywgbmQgaW4gc2VsZi5scl9nb3RvLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIGZvciBuYW1lLCB2IGluIG5kLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgICAgICBpID0gaXRlbXMuZ2V0KG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgaToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gKFtdLCBbXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc1tuYW1lXSA9IGkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlbMF0uYXBwZW5kKHMpCisgICAgICAgICAgICAgICAgICAgICAgICBpWzFdLmFwcGVuZCh2KQorCisgICAgICAgICAgICAgICAgZi53cml0ZSgnXG5fbHJfZ290b19pdGVtcyA9IHsnKQorICAgICAgICAgICAgICAgIGZvciBrLCB2IGluIGl0ZW1zLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoJyVyOihbJyAlIGspCisgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHZbMF06CisgICAgICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCclciwnICUgaSkKKyAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgnXSxbJykKKyAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gdlsxXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoJyVyLCcgJSBpKQorCisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoJ10pLCcpCisgICAgICAgICAgICAgICAgZi53cml0ZSgnfVxuJykKKworICAgICAgICAgICAgICAgIGYud3JpdGUoJycnCitfbHJfZ290byA9IHt9Citmb3IgX2ssIF92IGluIF9scl9nb3RvX2l0ZW1zLml0ZW1zKCk6CisgICBmb3IgX3gsIF95IGluIHppcChfdlswXSwgX3ZbMV0pOgorICAgICAgIGlmIG5vdCBfeCBpbiBfbHJfZ290bzogX2xyX2dvdG9bX3hdID0ge30KKyAgICAgICBfbHJfZ290b1tfeF1bX2tdID0gX3kKK2RlbCBfbHJfZ290b19pdGVtcworJycnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmLndyaXRlKCdcbl9scl9nb3RvID0geyAnKQorICAgICAgICAgICAgICAgIGZvciBrLCB2IGluIHNlbGYubHJfZ290by5pdGVtcygpOgorICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCcoJXIsJXIpOiVyLCcgJSAoa1swXSwga1sxXSwgdikpCisgICAgICAgICAgICAgICAgZi53cml0ZSgnfVxuJykKKworICAgICAgICAgICAgIyBXcml0ZSBwcm9kdWN0aW9uIHRhYmxlCisgICAgICAgICAgICBmLndyaXRlKCdfbHJfcHJvZHVjdGlvbnMgPSBbXG4nKQorICAgICAgICAgICAgZm9yIHAgaW4gc2VsZi5scl9wcm9kdWN0aW9uczoKKyAgICAgICAgICAgICAgICBpZiBwLmZ1bmM6CisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoJyAgKCVyLCVyLCVkLCVyLCVyLCVkKSxcbicgJSAocC5zdHIsIHAubmFtZSwgcC5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5mdW5jLCBvcy5wYXRoLmJhc2VuYW1lKHAuZmlsZSksIHAubGluZSkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgnICAoJXIsJXIsJWQsTm9uZSxOb25lLE5vbmUpLFxuJyAlIChzdHIocCksIHAubmFtZSwgcC5sZW4pKQorICAgICAgICAgICAgZi53cml0ZSgnXVxuJykKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6CisgICAgICAgICAgICByYWlzZQorCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBwaWNrbGVfdGFibGUoKQorICAgICMKKyAgICAjIFRoaXMgZnVuY3Rpb24gcGlja2xlcyB0aGUgTFIgcGFyc2luZyB0YWJsZXMgdG8gYSBzdXBwbGllZCBmaWxlIG9iamVjdAorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBwaWNrbGVfdGFibGUoc2VsZiwgZmlsZW5hbWUsIHNpZ25hdHVyZT0nJyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBjUGlja2xlIGFzIHBpY2tsZQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBpbXBvcnQgcGlja2xlCisgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3diJykgYXMgb3V0ZjoKKyAgICAgICAgICAgIHBpY2tsZS5kdW1wKF9fdGFidmVyc2lvbl9fLCBvdXRmLCBwaWNrbGVfcHJvdG9jb2wpCisgICAgICAgICAgICBwaWNrbGUuZHVtcChzZWxmLmxyX21ldGhvZCwgb3V0ZiwgcGlja2xlX3Byb3RvY29sKQorICAgICAgICAgICAgcGlja2xlLmR1bXAoc2lnbmF0dXJlLCBvdXRmLCBwaWNrbGVfcHJvdG9jb2wpCisgICAgICAgICAgICBwaWNrbGUuZHVtcChzZWxmLmxyX2FjdGlvbiwgb3V0ZiwgcGlja2xlX3Byb3RvY29sKQorICAgICAgICAgICAgcGlja2xlLmR1bXAoc2VsZi5scl9nb3RvLCBvdXRmLCBwaWNrbGVfcHJvdG9jb2wpCisKKyAgICAgICAgICAgIG91dHAgPSBbXQorICAgICAgICAgICAgZm9yIHAgaW4gc2VsZi5scl9wcm9kdWN0aW9uczoKKyAgICAgICAgICAgICAgICBpZiBwLmZ1bmM6CisgICAgICAgICAgICAgICAgICAgIG91dHAuYXBwZW5kKChwLnN0ciwgcC5uYW1lLCBwLmxlbiwgcC5mdW5jLCBvcy5wYXRoLmJhc2VuYW1lKHAuZmlsZSksIHAubGluZSkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgb3V0cC5hcHBlbmQoKHN0cihwKSwgcC5uYW1lLCBwLmxlbiwgTm9uZSwgTm9uZSwgTm9uZSkpCisgICAgICAgICAgICBwaWNrbGUuZHVtcChvdXRwLCBvdXRmLCBwaWNrbGVfcHJvdG9jb2wpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT09IElOVFJPU1BFQ1RJT04gPT09CisjCisjIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFuZCBjbGFzc2VzIGFyZSB1c2VkIHRvIGltcGxlbWVudCB0aGUgUExZCisjIGludHJvc3BlY3Rpb24gZmVhdHVyZXMgZm9sbG93ZWQgYnkgdGhlIHlhY2MoKSBmdW5jdGlvbiBpdHNlbGYuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZ2V0X2NhbGxlcl9tb2R1bGVfZGljdCgpCisjCisjIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBhbGwgb2YgdGhlIHN5bWJvbHMgZGVmaW5lZCB3aXRoaW4KKyMgYSBjYWxsZXIgZnVydGhlciBkb3duIHRoZSBjYWxsIHN0YWNrLiAgVGhpcyBpcyB1c2VkIHRvIGdldCB0aGUgZW52aXJvbm1lbnQKKyMgYXNzb2NpYXRlZCB3aXRoIHRoZSB5YWNjKCkgY2FsbCBpZiBub25lIHdhcyBwcm92aWRlZC4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIGdldF9jYWxsZXJfbW9kdWxlX2RpY3QobGV2ZWxzKToKKyAgICBmID0gc3lzLl9nZXRmcmFtZShsZXZlbHMpCisgICAgbGRpY3QgPSBmLmZfZ2xvYmFscy5jb3B5KCkKKyAgICBpZiBmLmZfZ2xvYmFscyAhPSBmLmZfbG9jYWxzOgorICAgICAgICBsZGljdC51cGRhdGUoZi5mX2xvY2FscykKKyAgICByZXR1cm4gbGRpY3QKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBwYXJzZV9ncmFtbWFyKCkKKyMKKyMgVGhpcyB0YWtlcyBhIHJhdyBncmFtbWFyIHJ1bGUgc3RyaW5nIGFuZCBwYXJzZXMgaXQgaW50byBwcm9kdWN0aW9uIGRhdGEKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2RlZiBwYXJzZV9ncmFtbWFyKGRvYywgZmlsZSwgbGluZSk6CisgICAgZ3JhbW1hciA9IFtdCisgICAgIyBTcGxpdCB0aGUgZG9jIHN0cmluZyBpbnRvIGxpbmVzCisgICAgcHN0cmluZ3MgPSBkb2Muc3BsaXRsaW5lcygpCisgICAgbGFzdHAgPSBOb25lCisgICAgZGxpbmUgPSBsaW5lCisgICAgZm9yIHBzIGluIHBzdHJpbmdzOgorICAgICAgICBkbGluZSArPSAxCisgICAgICAgIHAgPSBwcy5zcGxpdCgpCisgICAgICAgIGlmIG5vdCBwOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgcFswXSA9PSAnfCc6CisgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGEgY29udGludWF0aW9uIG9mIGEgcHJldmlvdXMgcnVsZQorICAgICAgICAgICAgICAgIGlmIG5vdCBsYXN0cDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoIiVzOiVkOiBNaXNwbGFjZWQgJ3wnIiAlIChmaWxlLCBkbGluZSkpCisgICAgICAgICAgICAgICAgcHJvZG5hbWUgPSBsYXN0cAorICAgICAgICAgICAgICAgIHN5bXMgPSBwWzE6XQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcm9kbmFtZSA9IHBbMF0KKyAgICAgICAgICAgICAgICBsYXN0cCA9IHByb2RuYW1lCisgICAgICAgICAgICAgICAgc3ltcyAgID0gcFsyOl0KKyAgICAgICAgICAgICAgICBhc3NpZ24gPSBwWzFdCisgICAgICAgICAgICAgICAgaWYgYXNzaWduICE9ICc6JyBhbmQgYXNzaWduICE9ICc6Oj0nOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcigiJXM6JWQ6IFN5bnRheCBlcnJvci4gRXhwZWN0ZWQgJzonIiAlIChmaWxlLCBkbGluZSkpCisKKyAgICAgICAgICAgIGdyYW1tYXIuYXBwZW5kKChmaWxlLCBkbGluZSwgcHJvZG5hbWUsIHN5bXMpKQorICAgICAgICBleGNlcHQgU3ludGF4RXJyb3I6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoJyVzOiVkOiBTeW50YXggZXJyb3IgaW4gcnVsZSAlcicgJSAoZmlsZSwgZGxpbmUsIHBzLnN0cmlwKCkpKQorCisgICAgcmV0dXJuIGdyYW1tYXIKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQYXJzZXJSZWZsZWN0KCkKKyMKKyMgVGhpcyBjbGFzcyByZXByZXNlbnRzIGluZm9ybWF0aW9uIGV4dHJhY3RlZCBmb3IgYnVpbGRpbmcgYSBwYXJzZXIgaW5jbHVkaW5nCisjIHN0YXJ0IHN5bWJvbCwgZXJyb3IgZnVuY3Rpb24sIHRva2VucywgcHJlY2VkZW5jZSBsaXN0LCBhY3Rpb24gZnVuY3Rpb25zLAorIyBldGMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjbGFzcyBQYXJzZXJSZWZsZWN0KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBkaWN0LCBsb2c9Tm9uZSk6CisgICAgICAgIHNlbGYucGRpY3QgICAgICA9IHBkaWN0CisgICAgICAgIHNlbGYuc3RhcnQgICAgICA9IE5vbmUKKyAgICAgICAgc2VsZi5lcnJvcl9mdW5jID0gTm9uZQorICAgICAgICBzZWxmLnRva2VucyAgICAgPSBOb25lCisgICAgICAgIHNlbGYubW9kdWxlcyAgICA9IHNldCgpCisgICAgICAgIHNlbGYuZ3JhbW1hciAgICA9IFtdCisgICAgICAgIHNlbGYuZXJyb3IgICAgICA9IEZhbHNlCisKKyAgICAgICAgaWYgbG9nIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmxvZyA9IFBseUxvZ2dlcihzeXMuc3RkZXJyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5sb2cgPSBsb2cKKworICAgICMgR2V0IGFsbCBvZiB0aGUgYmFzaWMgaW5mb3JtYXRpb24KKyAgICBkZWYgZ2V0X2FsbChzZWxmKToKKyAgICAgICAgc2VsZi5nZXRfc3RhcnQoKQorICAgICAgICBzZWxmLmdldF9lcnJvcl9mdW5jKCkKKyAgICAgICAgc2VsZi5nZXRfdG9rZW5zKCkKKyAgICAgICAgc2VsZi5nZXRfcHJlY2VkZW5jZSgpCisgICAgICAgIHNlbGYuZ2V0X3BmdW5jdGlvbnMoKQorCisgICAgIyBWYWxpZGF0ZSBhbGwgb2YgdGhlIGluZm9ybWF0aW9uCisgICAgZGVmIHZhbGlkYXRlX2FsbChzZWxmKToKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9zdGFydCgpCisgICAgICAgIHNlbGYudmFsaWRhdGVfZXJyb3JfZnVuYygpCisgICAgICAgIHNlbGYudmFsaWRhdGVfdG9rZW5zKCkKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9wcmVjZWRlbmNlKCkKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9wZnVuY3Rpb25zKCkKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9tb2R1bGVzKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuZXJyb3IKKworICAgICMgQ29tcHV0ZSBhIHNpZ25hdHVyZSBvdmVyIHRoZSBncmFtbWFyCisgICAgZGVmIHNpZ25hdHVyZShzZWxmKToKKyAgICAgICAgcGFydHMgPSBbXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLnN0YXJ0OgorICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZChzZWxmLnN0YXJ0KQorICAgICAgICAgICAgaWYgc2VsZi5wcmVjOgorICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgnJy5qb2luKFsnJy5qb2luKHApIGZvciBwIGluIHNlbGYucHJlY10pKQorICAgICAgICAgICAgaWYgc2VsZi50b2tlbnM6CisgICAgICAgICAgICAgICAgcGFydHMuYXBwZW5kKCcgJy5qb2luKHNlbGYudG9rZW5zKSkKKyAgICAgICAgICAgIGZvciBmIGluIHNlbGYucGZ1bmNzOgorICAgICAgICAgICAgICAgIGlmIGZbM106CisgICAgICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZChmWzNdKQorICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHJldHVybiAnJy5qb2luKHBhcnRzKQorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgdmFsaWRhdGVfbW9kdWxlcygpCisgICAgIworICAgICMgVGhpcyBtZXRob2QgY2hlY2tzIHRvIHNlZSBpZiB0aGVyZSBhcmUgZHVwbGljYXRlZCBwX3J1bGVuYW1lKCkgZnVuY3Rpb25zCisgICAgIyBpbiB0aGUgcGFyc2VyIG1vZHVsZSBmaWxlLiAgV2l0aG91dCB0aGlzIGZ1bmN0aW9uLCBpdCBpcyByZWFsbHkgZWFzeSBmb3IKKyAgICAjIHVzZXJzIHRvIG1ha2UgbWlzdGFrZXMgYnkgY3V0dGluZyBhbmQgcGFzdGluZyBjb2RlIGZyYWdtZW50cyAoYW5kIGl0J3MgYSByZWFsCisgICAgIyBidWdnZXIgdG8gdHJ5IGFuZCBmaWd1cmUgb3V0IHdoeSB0aGUgcmVzdWx0aW5nIHBhcnNlciBkb2Vzbid0IHdvcmspLiAgVGhlcmVmb3JlLAorICAgICMgd2UganVzdCBkbyBhIGxpdHRsZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiBtYXRjaGluZyBvZiBkZWYgc3RhdGVtZW50cworICAgICMgdG8gdHJ5IGFuZCBkZXRlY3QgZHVwbGljYXRlcy4KKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgdmFsaWRhdGVfbW9kdWxlcyhzZWxmKToKKyAgICAgICAgIyBNYXRjaCBkZWYgcF9mdW5jbmFtZSgKKyAgICAgICAgZnJlID0gcmUuY29tcGlsZShyJ1xzKmRlZlxzKyhwX1thLXpBLVpfMC05XSopXCgnKQorCisgICAgICAgIGZvciBtb2R1bGUgaW4gc2VsZi5tb2R1bGVzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGxpbmVzLCBsaW5lbiA9IGluc3BlY3QuZ2V0c291cmNlbGluZXMobW9kdWxlKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgY291bnRoYXNoID0ge30KKyAgICAgICAgICAgIGZvciBsaW5lbiwgbGluZSBpbiBlbnVtZXJhdGUobGluZXMpOgorICAgICAgICAgICAgICAgIGxpbmVuICs9IDEKKyAgICAgICAgICAgICAgICBtID0gZnJlLm1hdGNoKGxpbmUpCisgICAgICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG0uZ3JvdXAoMSkKKyAgICAgICAgICAgICAgICAgICAgcHJldiA9IGNvdW50aGFzaC5nZXQobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHByZXY6CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGhhc2hbbmFtZV0gPSBsaW5lbgorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBpbnNwZWN0LmdldHNvdXJjZWZpbGUobW9kdWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cud2FybmluZygnJXM6JWQ6IEZ1bmN0aW9uICVzIHJlZGVmaW5lZC4gUHJldmlvdXNseSBkZWZpbmVkIG9uIGxpbmUgJWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbGluZW4sIG5hbWUsIHByZXYpCisKKyAgICAjIEdldCB0aGUgc3RhcnQgc3ltYm9sCisgICAgZGVmIGdldF9zdGFydChzZWxmKToKKyAgICAgICAgc2VsZi5zdGFydCA9IHNlbGYucGRpY3QuZ2V0KCdzdGFydCcpCisKKyAgICAjIFZhbGlkYXRlIHRoZSBzdGFydCBzeW1ib2wKKyAgICBkZWYgdmFsaWRhdGVfc3RhcnQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuc3RhcnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzZWxmLnN0YXJ0LCBzdHJpbmdfdHlwZXMpOgorICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCInc3RhcnQnIG11c3QgYmUgYSBzdHJpbmciKQorCisgICAgIyBMb29rIGZvciBlcnJvciBoYW5kbGVyCisgICAgZGVmIGdldF9lcnJvcl9mdW5jKHNlbGYpOgorICAgICAgICBzZWxmLmVycm9yX2Z1bmMgPSBzZWxmLnBkaWN0LmdldCgncF9lcnJvcicpCisKKyAgICAjIFZhbGlkYXRlIHRoZSBlcnJvciBmdW5jdGlvbgorICAgIGRlZiB2YWxpZGF0ZV9lcnJvcl9mdW5jKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmVycm9yX2Z1bmM6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuZXJyb3JfZnVuYywgdHlwZXMuRnVuY3Rpb25UeXBlKToKKyAgICAgICAgICAgICAgICBpc21ldGhvZCA9IDAKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShzZWxmLmVycm9yX2Z1bmMsIHR5cGVzLk1ldGhvZFR5cGUpOgorICAgICAgICAgICAgICAgIGlzbWV0aG9kID0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiJ3BfZXJyb3InIGRlZmluZWQsIGJ1dCBpcyBub3QgYSBmdW5jdGlvbiBvciBtZXRob2QiKQorICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSBUcnVlCisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIGVsaW5lID0gc2VsZi5lcnJvcl9mdW5jLl9fY29kZV9fLmNvX2ZpcnN0bGluZW5vCisgICAgICAgICAgICBlZmlsZSA9IHNlbGYuZXJyb3JfZnVuYy5fX2NvZGVfXy5jb19maWxlbmFtZQorICAgICAgICAgICAgbW9kdWxlID0gaW5zcGVjdC5nZXRtb2R1bGUoc2VsZi5lcnJvcl9mdW5jKQorICAgICAgICAgICAgc2VsZi5tb2R1bGVzLmFkZChtb2R1bGUpCisKKyAgICAgICAgICAgIGFyZ2NvdW50ID0gc2VsZi5lcnJvcl9mdW5jLl9fY29kZV9fLmNvX2FyZ2NvdW50IC0gaXNtZXRob2QKKyAgICAgICAgICAgIGlmIGFyZ2NvdW50ICE9IDE6CisgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoJyVzOiVkOiBwX2Vycm9yKCkgcmVxdWlyZXMgMSBhcmd1bWVudCcsIGVmaWxlLCBlbGluZSkKKyAgICAgICAgICAgICAgICBzZWxmLmVycm9yID0gVHJ1ZQorCisgICAgIyBHZXQgdGhlIHRva2VucyBtYXAKKyAgICBkZWYgZ2V0X3Rva2VucyhzZWxmKToKKyAgICAgICAgdG9rZW5zID0gc2VsZi5wZGljdC5nZXQoJ3Rva2VucycpCisgICAgICAgIGlmIG5vdCB0b2tlbnM6CisgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcignTm8gdG9rZW4gbGlzdCBpcyBkZWZpbmVkJykKKyAgICAgICAgICAgIHNlbGYuZXJyb3IgPSBUcnVlCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0b2tlbnMsIChsaXN0LCB0dXBsZSkpOgorICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoJ3Rva2VucyBtdXN0IGJlIGEgbGlzdCBvciB0dXBsZScpCisgICAgICAgICAgICBzZWxmLmVycm9yID0gVHJ1ZQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgbm90IHRva2VuczoKKyAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCd0b2tlbnMgaXMgZW1wdHknKQorICAgICAgICAgICAgc2VsZi5lcnJvciA9IFRydWUKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlbGYudG9rZW5zID0gdG9rZW5zCisKKyAgICAjIFZhbGlkYXRlIHRoZSB0b2tlbnMKKyAgICBkZWYgdmFsaWRhdGVfdG9rZW5zKHNlbGYpOgorICAgICAgICAjIFZhbGlkYXRlIHRoZSB0b2tlbnMuCisgICAgICAgIGlmICdlcnJvcicgaW4gc2VsZi50b2tlbnM6CisgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiSWxsZWdhbCB0b2tlbiBuYW1lICdlcnJvcicuIElzIGEgcmVzZXJ2ZWQgd29yZCIpCisgICAgICAgICAgICBzZWxmLmVycm9yID0gVHJ1ZQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgdGVybWluYWxzID0gc2V0KCkKKyAgICAgICAgZm9yIG4gaW4gc2VsZi50b2tlbnM6CisgICAgICAgICAgICBpZiBuIGluIHRlcm1pbmFsczoKKyAgICAgICAgICAgICAgICBzZWxmLmxvZy53YXJuaW5nKCdUb2tlbiAlciBtdWx0aXBseSBkZWZpbmVkJywgbikKKyAgICAgICAgICAgIHRlcm1pbmFscy5hZGQobikKKworICAgICMgR2V0IHRoZSBwcmVjZWRlbmNlIG1hcCAoaWYgYW55KQorICAgIGRlZiBnZXRfcHJlY2VkZW5jZShzZWxmKToKKyAgICAgICAgc2VsZi5wcmVjID0gc2VsZi5wZGljdC5nZXQoJ3ByZWNlZGVuY2UnKQorCisgICAgIyBWYWxpZGF0ZSBhbmQgcGFyc2UgdGhlIHByZWNlZGVuY2UgbWFwCisgICAgZGVmIHZhbGlkYXRlX3ByZWNlZGVuY2Uoc2VsZik6CisgICAgICAgIHByZWNsaXN0ID0gW10KKyAgICAgICAgaWYgc2VsZi5wcmVjOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc2VsZi5wcmVjLCAobGlzdCwgdHVwbGUpKToKKyAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigncHJlY2VkZW5jZSBtdXN0IGJlIGEgbGlzdCBvciB0dXBsZScpCisgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IFRydWUKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGZvciBsZXZlbCwgcCBpbiBlbnVtZXJhdGUoc2VsZi5wcmVjKToKKyAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShwLCAobGlzdCwgdHVwbGUpKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoJ0JhZCBwcmVjZWRlbmNlIHRhYmxlJykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgICAgICBpZiBsZW4ocCkgPCAyOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcignTWFsZm9ybWVkIHByZWNlZGVuY2UgZW50cnkgJXMuIE11c3QgYmUgKGFzc29jLCB0ZXJtLCAuLi4sIHRlcm0pJywgcCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgYXNzb2MgPSBwWzBdCisgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYXNzb2MsIHN0cmluZ190eXBlcyk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCdwcmVjZWRlbmNlIGFzc29jaWF0aXZpdHkgbXVzdCBiZSBhIHN0cmluZycpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGZvciB0ZXJtIGluIHBbMTpdOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0ZXJtLCBzdHJpbmdfdHlwZXMpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoJ3ByZWNlZGVuY2UgaXRlbXMgbXVzdCBiZSBzdHJpbmdzJykKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgcHJlY2xpc3QuYXBwZW5kKCh0ZXJtLCBhc3NvYywgbGV2ZWwrMSkpCisgICAgICAgIHNlbGYucHJlY2xpc3QgPSBwcmVjbGlzdAorCisgICAgIyBHZXQgYWxsIHBfZnVuY3Rpb25zIGZyb20gdGhlIGdyYW1tYXIKKyAgICBkZWYgZ2V0X3BmdW5jdGlvbnMoc2VsZik6CisgICAgICAgIHBfZnVuY3Rpb25zID0gW10KKyAgICAgICAgZm9yIG5hbWUsIGl0ZW0gaW4gc2VsZi5wZGljdC5pdGVtcygpOgorICAgICAgICAgICAgaWYgbm90IG5hbWUuc3RhcnRzd2l0aCgncF8nKSBvciBuYW1lID09ICdwX2Vycm9yJzoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtLCAodHlwZXMuRnVuY3Rpb25UeXBlLCB0eXBlcy5NZXRob2RUeXBlKSk6CisgICAgICAgICAgICAgICAgbGluZSA9IGdldGF0dHIoaXRlbSwgJ2NvX2ZpcnN0bGluZW5vJywgaXRlbS5fX2NvZGVfXy5jb19maXJzdGxpbmVubykKKyAgICAgICAgICAgICAgICBtb2R1bGUgPSBpbnNwZWN0LmdldG1vZHVsZShpdGVtKQorICAgICAgICAgICAgICAgIHBfZnVuY3Rpb25zLmFwcGVuZCgobGluZSwgbW9kdWxlLCBuYW1lLCBpdGVtLl9fZG9jX18pKQorCisgICAgICAgICMgU29ydCBhbGwgb2YgdGhlIGFjdGlvbnMgYnkgbGluZSBudW1iZXI7IG1ha2Ugc3VyZSB0byBzdHJpbmdpZnkKKyAgICAgICAgIyBtb2R1bGVzIHRvIG1ha2UgdGhlbSBzb3J0YWJsZSwgc2luY2UgYGxpbmVgIG1heSBub3QgdW5pcXVlbHkgc29ydCBhbGwKKyAgICAgICAgIyBwIGZ1bmN0aW9ucworICAgICAgICBwX2Z1bmN0aW9ucy5zb3J0KGtleT1sYW1iZGEgcF9mdW5jdGlvbjogKAorICAgICAgICAgICAgcF9mdW5jdGlvblswXSwKKyAgICAgICAgICAgIHN0cihwX2Z1bmN0aW9uWzFdKSwKKyAgICAgICAgICAgIHBfZnVuY3Rpb25bMl0sCisgICAgICAgICAgICBwX2Z1bmN0aW9uWzNdKSkKKyAgICAgICAgc2VsZi5wZnVuY3MgPSBwX2Z1bmN0aW9ucworCisgICAgIyBWYWxpZGF0ZSBhbGwgb2YgdGhlIHBfZnVuY3Rpb25zCisgICAgZGVmIHZhbGlkYXRlX3BmdW5jdGlvbnMoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSBbXQorICAgICAgICAjIENoZWNrIGZvciBub24tZW1wdHkgc3ltYm9scworICAgICAgICBpZiBsZW4oc2VsZi5wZnVuY3MpID09IDA6CisgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcignbm8gcnVsZXMgb2YgdGhlIGZvcm0gcF9ydWxlbmFtZSBhcmUgZGVmaW5lZCcpCisgICAgICAgICAgICBzZWxmLmVycm9yID0gVHJ1ZQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZm9yIGxpbmUsIG1vZHVsZSwgbmFtZSwgZG9jIGluIHNlbGYucGZ1bmNzOgorICAgICAgICAgICAgZmlsZSA9IGluc3BlY3QuZ2V0c291cmNlZmlsZShtb2R1bGUpCisgICAgICAgICAgICBmdW5jID0gc2VsZi5wZGljdFtuYW1lXQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShmdW5jLCB0eXBlcy5NZXRob2RUeXBlKToKKyAgICAgICAgICAgICAgICByZXFhcmdzID0gMgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXFhcmdzID0gMQorICAgICAgICAgICAgaWYgZnVuYy5fX2NvZGVfXy5jb19hcmdjb3VudCA+IHJlcWFyZ3M6CisgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoJyVzOiVkOiBSdWxlICVyIGhhcyB0b28gbWFueSBhcmd1bWVudHMnLCBmaWxlLCBsaW5lLCBmdW5jLl9fbmFtZV9fKQorICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSBUcnVlCisgICAgICAgICAgICBlbGlmIGZ1bmMuX19jb2RlX18uY29fYXJnY291bnQgPCByZXFhcmdzOgorICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCclczolZDogUnVsZSAlciByZXF1aXJlcyBhbiBhcmd1bWVudCcsIGZpbGUsIGxpbmUsIGZ1bmMuX19uYW1lX18pCisgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IFRydWUKKyAgICAgICAgICAgIGVsaWYgbm90IGZ1bmMuX19kb2NfXzoKKyAgICAgICAgICAgICAgICBzZWxmLmxvZy53YXJuaW5nKCclczolZDogTm8gZG9jdW1lbnRhdGlvbiBzdHJpbmcgc3BlY2lmaWVkIGluIGZ1bmN0aW9uICVyIChpZ25vcmVkKScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLCBsaW5lLCBmdW5jLl9fbmFtZV9fKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHBhcnNlZF9nID0gcGFyc2VfZ3JhbW1hcihkb2MsIGZpbGUsIGxpbmUpCisgICAgICAgICAgICAgICAgICAgIGZvciBnIGluIHBhcnNlZF9nOgorICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hci5hcHBlbmQoKG5hbWUsIGcpKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcihzdHIoZSkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSBUcnVlCisKKyAgICAgICAgICAgICAgICAjIExvb2tzIGxpa2UgYSB2YWxpZCBncmFtbWFyIHJ1bGUKKyAgICAgICAgICAgICAgICAjIE1hcmsgdGhlIGZpbGUgaW4gd2hpY2ggZGVmaW5lZC4KKyAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZXMuYWRkKG1vZHVsZSkKKworICAgICAgICAjIFNlY29uZGFyeSB2YWxpZGF0aW9uIHN0ZXAgdGhhdCBsb29rcyBmb3IgcF8gZGVmaW5pdGlvbnMgdGhhdCBhcmUgbm90IGZ1bmN0aW9ucworICAgICAgICAjIG9yIGZ1bmN0aW9ucyB0aGF0IGxvb2sgbGlrZSB0aGV5IG1pZ2h0IGJlIGdyYW1tYXIgcnVsZXMuCisKKyAgICAgICAgZm9yIG4sIHYgaW4gc2VsZi5wZGljdC5pdGVtcygpOgorICAgICAgICAgICAgaWYgbi5zdGFydHN3aXRoKCdwXycpIGFuZCBpc2luc3RhbmNlKHYsICh0eXBlcy5GdW5jdGlvblR5cGUsIHR5cGVzLk1ldGhvZFR5cGUpKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgbi5zdGFydHN3aXRoKCd0XycpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBuLnN0YXJ0c3dpdGgoJ3BfJykgYW5kIG4gIT0gJ3BfZXJyb3InOgorICAgICAgICAgICAgICAgIHNlbGYubG9nLndhcm5pbmcoJyVyIG5vdCBkZWZpbmVkIGFzIGEgZnVuY3Rpb24nLCBuKQorICAgICAgICAgICAgaWYgKChpc2luc3RhbmNlKHYsIHR5cGVzLkZ1bmN0aW9uVHlwZSkgYW5kIHYuX19jb2RlX18uY29fYXJnY291bnQgPT0gMSkgb3IKKyAgICAgICAgICAgICAgICAgICAoaXNpbnN0YW5jZSh2LCB0eXBlcy5NZXRob2RUeXBlKSBhbmQgdi5fX2Z1bmNfXy5fX2NvZGVfXy5jb19hcmdjb3VudCA9PSAyKSk6CisgICAgICAgICAgICAgICAgaWYgdi5fX2RvY19fOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBkb2MgPSB2Ll9fZG9jX18uc3BsaXQoJyAnKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZG9jWzFdID09ICc6JzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy53YXJuaW5nKCclczolZDogUG9zc2libGUgZ3JhbW1hciBydWxlICVyIGRlZmluZWQgd2l0aG91dCBwXyBwcmVmaXgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5fX2NvZGVfXy5jb19maWxlbmFtZSwgdi5fX2NvZGVfXy5jb19maXJzdGxpbmVubywgbikKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5ncmFtbWFyID0gZ3JhbW1hcgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHlhY2MobW9kdWxlKQorIworIyBCdWlsZCBhIHBhcnNlcgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgeWFjYyhtZXRob2Q9J0xBTFInLCBkZWJ1Zz15YWNjZGVidWcsIG1vZHVsZT1Ob25lLCB0YWJtb2R1bGU9dGFiX21vZHVsZSwgc3RhcnQ9Tm9uZSwKKyAgICAgICAgIGNoZWNrX3JlY3Vyc2lvbj1UcnVlLCBvcHRpbWl6ZT1GYWxzZSwgd3JpdGVfdGFibGVzPVRydWUsIGRlYnVnZmlsZT1kZWJ1Z19maWxlLAorICAgICAgICAgb3V0cHV0ZGlyPU5vbmUsIGRlYnVnbG9nPU5vbmUsIGVycm9ybG9nPU5vbmUsIHBpY2tsZWZpbGU9Tm9uZSk6CisKKyAgICBpZiB0YWJtb2R1bGUgaXMgTm9uZToKKyAgICAgICAgdGFibW9kdWxlID0gdGFiX21vZHVsZQorCisgICAgIyBSZWZlcmVuY2UgdG8gdGhlIHBhcnNpbmcgbWV0aG9kIG9mIHRoZSBsYXN0IGJ1aWx0IHBhcnNlcgorICAgIGdsb2JhbCBwYXJzZQorCisgICAgIyBJZiBwaWNrbGluZyBpcyBlbmFibGVkLCB0YWJsZSBmaWxlcyBhcmUgbm90IGNyZWF0ZWQKKyAgICBpZiBwaWNrbGVmaWxlOgorICAgICAgICB3cml0ZV90YWJsZXMgPSAwCisKKyAgICBpZiBlcnJvcmxvZyBpcyBOb25lOgorICAgICAgICBlcnJvcmxvZyA9IFBseUxvZ2dlcihzeXMuc3RkZXJyKQorCisgICAgIyBHZXQgdGhlIG1vZHVsZSBkaWN0aW9uYXJ5IHVzZWQgZm9yIHRoZSBwYXJzZXIKKyAgICBpZiBtb2R1bGU6CisgICAgICAgIF9pdGVtcyA9IFsoaywgZ2V0YXR0cihtb2R1bGUsIGspKSBmb3IgayBpbiBkaXIobW9kdWxlKV0KKyAgICAgICAgcGRpY3QgPSBkaWN0KF9pdGVtcykKKyAgICAgICAgIyBJZiBubyBfX2ZpbGVfXyBhdHRyaWJ1dGUgaXMgYXZhaWxhYmxlLCB0cnkgdG8gb2J0YWluIGl0IGZyb20gdGhlIF9fbW9kdWxlX18gaW5zdGVhZAorICAgICAgICBpZiAnX19maWxlX18nIG5vdCBpbiBwZGljdDoKKyAgICAgICAgICAgIHBkaWN0WydfX2ZpbGVfXyddID0gc3lzLm1vZHVsZXNbcGRpY3RbJ19fbW9kdWxlX18nXV0uX19maWxlX18KKyAgICBlbHNlOgorICAgICAgICBwZGljdCA9IGdldF9jYWxsZXJfbW9kdWxlX2RpY3QoMikKKworICAgIGlmIG91dHB1dGRpciBpcyBOb25lOgorICAgICAgICAjIElmIG5vIG91dHB1dCBkaXJlY3RvcnkgaXMgc2V0LCB0aGUgbG9jYXRpb24gb2YgdGhlIG91dHB1dCBmaWxlcworICAgICAgICAjIGlzIGRldGVybWluZWQgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgcnVsZXM6CisgICAgICAgICMgICAgIC0gSWYgdGFibW9kdWxlIHNwZWNpZmllcyBhIHBhY2thZ2UsIGZpbGVzIGdvIGludG8gdGhhdCBwYWNrYWdlIGRpcmVjdG9yeQorICAgICAgICAjICAgICAtIE90aGVyd2lzZSwgZmlsZXMgZ28gaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBzcGVjaWZ5aW5nIG1vZHVsZQorICAgICAgICBpZiBpc2luc3RhbmNlKHRhYm1vZHVsZSwgdHlwZXMuTW9kdWxlVHlwZSk6CisgICAgICAgICAgICBzcmNmaWxlID0gdGFibW9kdWxlLl9fZmlsZV9fCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiAnLicgbm90IGluIHRhYm1vZHVsZToKKyAgICAgICAgICAgICAgICBzcmNmaWxlID0gcGRpY3RbJ19fZmlsZV9fJ10KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGFydHMgPSB0YWJtb2R1bGUuc3BsaXQoJy4nKQorICAgICAgICAgICAgICAgIHBrZ25hbWUgPSAnLicuam9pbihwYXJ0c1s6LTFdKQorICAgICAgICAgICAgICAgIGV4ZWMoJ2ltcG9ydCAlcycgJSBwa2duYW1lKQorICAgICAgICAgICAgICAgIHNyY2ZpbGUgPSBnZXRhdHRyKHN5cy5tb2R1bGVzW3BrZ25hbWVdLCAnX19maWxlX18nLCAnJykKKyAgICAgICAgb3V0cHV0ZGlyID0gb3MucGF0aC5kaXJuYW1lKHNyY2ZpbGUpCisKKyAgICAjIERldGVybWluZSBpZiB0aGUgbW9kdWxlIGlzIHBhY2thZ2Ugb2YgYSBwYWNrYWdlIG9yIG5vdC4KKyAgICAjIElmIHNvLCBmaXggdGhlIHRhYm1vZHVsZSBzZXR0aW5nIHNvIHRoYXQgdGFibGVzIGxvYWQgY29ycmVjdGx5CisgICAgcGtnID0gcGRpY3QuZ2V0KCdfX3BhY2thZ2VfXycpCisgICAgaWYgcGtnIGFuZCBpc2luc3RhbmNlKHRhYm1vZHVsZSwgc3RyKToKKyAgICAgICAgaWYgJy4nIG5vdCBpbiB0YWJtb2R1bGU6CisgICAgICAgICAgICB0YWJtb2R1bGUgPSBwa2cgKyAnLicgKyB0YWJtb2R1bGUKKworCisKKyAgICAjIFNldCBzdGFydCBzeW1ib2wgaWYgaXQncyBzcGVjaWZpZWQgZGlyZWN0bHkgdXNpbmcgYW4gYXJndW1lbnQKKyAgICBpZiBzdGFydCBpcyBub3QgTm9uZToKKyAgICAgICAgcGRpY3RbJ3N0YXJ0J10gPSBzdGFydAorCisgICAgIyBDb2xsZWN0IHBhcnNlciBpbmZvcm1hdGlvbiBmcm9tIHRoZSBkaWN0aW9uYXJ5CisgICAgcGluZm8gPSBQYXJzZXJSZWZsZWN0KHBkaWN0LCBsb2c9ZXJyb3Jsb2cpCisgICAgcGluZm8uZ2V0X2FsbCgpCisKKyAgICBpZiBwaW5mby5lcnJvcjoKKyAgICAgICAgcmFpc2UgWWFjY0Vycm9yKCdVbmFibGUgdG8gYnVpbGQgcGFyc2VyJykKKworICAgICMgQ2hlY2sgc2lnbmF0dXJlIGFnYWluc3QgdGFibGUgZmlsZXMgKGlmIGFueSkKKyAgICBzaWduYXR1cmUgPSBwaW5mby5zaWduYXR1cmUoKQorCisgICAgIyBSZWFkIHRoZSB0YWJsZXMKKyAgICB0cnk6CisgICAgICAgIGxyID0gTFJUYWJsZSgpCisgICAgICAgIGlmIHBpY2tsZWZpbGU6CisgICAgICAgICAgICByZWFkX3NpZ25hdHVyZSA9IGxyLnJlYWRfcGlja2xlKHBpY2tsZWZpbGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZWFkX3NpZ25hdHVyZSA9IGxyLnJlYWRfdGFibGUodGFibW9kdWxlKQorICAgICAgICBpZiBvcHRpbWl6ZSBvciAocmVhZF9zaWduYXR1cmUgPT0gc2lnbmF0dXJlKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBsci5iaW5kX2NhbGxhYmxlcyhwaW5mby5wZGljdCkKKyAgICAgICAgICAgICAgICBwYXJzZXIgPSBMUlBhcnNlcihsciwgcGluZm8uZXJyb3JfZnVuYykKKyAgICAgICAgICAgICAgICBwYXJzZSA9IHBhcnNlci5wYXJzZQorICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZXIKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICAgICBlcnJvcmxvZy53YXJuaW5nKCdUaGVyZSB3YXMgYSBwcm9ibGVtIGxvYWRpbmcgdGhlIHRhYmxlIGZpbGU6ICVyJywgZSkKKyAgICBleGNlcHQgVmVyc2lvbkVycm9yIGFzIGU6CisgICAgICAgIGVycm9ybG9nLndhcm5pbmcoc3RyKGUpKQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgcGFzcworCisgICAgaWYgZGVidWdsb2cgaXMgTm9uZToKKyAgICAgICAgaWYgZGVidWc6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGVidWdsb2cgPSBQbHlMb2dnZXIob3Blbihvcy5wYXRoLmpvaW4ob3V0cHV0ZGlyLCBkZWJ1Z2ZpbGUpLCAndycpKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICBlcnJvcmxvZy53YXJuaW5nKCJDb3VsZG4ndCBvcGVuICVyLiAlcyIgJSAoZGVidWdmaWxlLCBlKSkKKyAgICAgICAgICAgICAgICBkZWJ1Z2xvZyA9IE51bGxMb2dnZXIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGVidWdsb2cgPSBOdWxsTG9nZ2VyKCkKKworICAgIGRlYnVnbG9nLmluZm8oJ0NyZWF0ZWQgYnkgUExZIHZlcnNpb24gJXMgKGh0dHA6Ly93d3cuZGFiZWF6LmNvbS9wbHkpJywgX192ZXJzaW9uX18pCisKKyAgICBlcnJvcnMgPSBGYWxzZQorCisgICAgIyBWYWxpZGF0ZSB0aGUgcGFyc2VyIGluZm9ybWF0aW9uCisgICAgaWYgcGluZm8udmFsaWRhdGVfYWxsKCk6CisgICAgICAgIHJhaXNlIFlhY2NFcnJvcignVW5hYmxlIHRvIGJ1aWxkIHBhcnNlcicpCisKKyAgICBpZiBub3QgcGluZm8uZXJyb3JfZnVuYzoKKyAgICAgICAgZXJyb3Jsb2cud2FybmluZygnbm8gcF9lcnJvcigpIGZ1bmN0aW9uIGlzIGRlZmluZWQnKQorCisgICAgIyBDcmVhdGUgYSBncmFtbWFyIG9iamVjdAorICAgIGdyYW1tYXIgPSBHcmFtbWFyKHBpbmZvLnRva2VucykKKworICAgICMgU2V0IHByZWNlZGVuY2UgbGV2ZWwgZm9yIHRlcm1pbmFscworICAgIGZvciB0ZXJtLCBhc3NvYywgbGV2ZWwgaW4gcGluZm8ucHJlY2xpc3Q6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGdyYW1tYXIuc2V0X3ByZWNlZGVuY2UodGVybSwgYXNzb2MsIGxldmVsKQorICAgICAgICBleGNlcHQgR3JhbW1hckVycm9yIGFzIGU6CisgICAgICAgICAgICBlcnJvcmxvZy53YXJuaW5nKCclcycsIGUpCisKKyAgICAjIEFkZCBwcm9kdWN0aW9ucyB0byB0aGUgZ3JhbW1hcgorICAgIGZvciBmdW5jbmFtZSwgZ3JhbSBpbiBwaW5mby5ncmFtbWFyOgorICAgICAgICBmaWxlLCBsaW5lLCBwcm9kbmFtZSwgc3ltcyA9IGdyYW0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZ3JhbW1hci5hZGRfcHJvZHVjdGlvbihwcm9kbmFtZSwgc3ltcywgZnVuY25hbWUsIGZpbGUsIGxpbmUpCisgICAgICAgIGV4Y2VwdCBHcmFtbWFyRXJyb3IgYXMgZToKKyAgICAgICAgICAgIGVycm9ybG9nLmVycm9yKCclcycsIGUpCisgICAgICAgICAgICBlcnJvcnMgPSBUcnVlCisKKyAgICAjIFNldCB0aGUgZ3JhbW1hciBzdGFydCBzeW1ib2xzCisgICAgdHJ5OgorICAgICAgICBpZiBzdGFydCBpcyBOb25lOgorICAgICAgICAgICAgZ3JhbW1hci5zZXRfc3RhcnQocGluZm8uc3RhcnQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBncmFtbWFyLnNldF9zdGFydChzdGFydCkKKyAgICBleGNlcHQgR3JhbW1hckVycm9yIGFzIGU6CisgICAgICAgIGVycm9ybG9nLmVycm9yKHN0cihlKSkKKyAgICAgICAgZXJyb3JzID0gVHJ1ZQorCisgICAgaWYgZXJyb3JzOgorICAgICAgICByYWlzZSBZYWNjRXJyb3IoJ1VuYWJsZSB0byBidWlsZCBwYXJzZXInKQorCisgICAgIyBWZXJpZnkgdGhlIGdyYW1tYXIgc3RydWN0dXJlCisgICAgdW5kZWZpbmVkX3N5bWJvbHMgPSBncmFtbWFyLnVuZGVmaW5lZF9zeW1ib2xzKCkKKyAgICBmb3Igc3ltLCBwcm9kIGluIHVuZGVmaW5lZF9zeW1ib2xzOgorICAgICAgICBlcnJvcmxvZy5lcnJvcignJXM6JWQ6IFN5bWJvbCAlciB1c2VkLCBidXQgbm90IGRlZmluZWQgYXMgYSB0b2tlbiBvciBhIHJ1bGUnLCBwcm9kLmZpbGUsIHByb2QubGluZSwgc3ltKQorICAgICAgICBlcnJvcnMgPSBUcnVlCisKKyAgICB1bnVzZWRfdGVybWluYWxzID0gZ3JhbW1hci51bnVzZWRfdGVybWluYWxzKCkKKyAgICBpZiB1bnVzZWRfdGVybWluYWxzOgorICAgICAgICBkZWJ1Z2xvZy5pbmZvKCcnKQorICAgICAgICBkZWJ1Z2xvZy5pbmZvKCdVbnVzZWQgdGVybWluYWxzOicpCisgICAgICAgIGRlYnVnbG9nLmluZm8oJycpCisgICAgICAgIGZvciB0ZXJtIGluIHVudXNlZF90ZXJtaW5hbHM6CisgICAgICAgICAgICBlcnJvcmxvZy53YXJuaW5nKCdUb2tlbiAlciBkZWZpbmVkLCBidXQgbm90IHVzZWQnLCB0ZXJtKQorICAgICAgICAgICAgZGVidWdsb2cuaW5mbygnICAgICVzJywgdGVybSkKKworICAgICMgUHJpbnQgb3V0IGFsbCBwcm9kdWN0aW9ucyB0byB0aGUgZGVidWcgbG9nCisgICAgaWYgZGVidWc6CisgICAgICAgIGRlYnVnbG9nLmluZm8oJycpCisgICAgICAgIGRlYnVnbG9nLmluZm8oJ0dyYW1tYXInKQorICAgICAgICBkZWJ1Z2xvZy5pbmZvKCcnKQorICAgICAgICBmb3IgbiwgcCBpbiBlbnVtZXJhdGUoZ3JhbW1hci5Qcm9kdWN0aW9ucyk6CisgICAgICAgICAgICBkZWJ1Z2xvZy5pbmZvKCdSdWxlICUtNWQgJXMnLCBuLCBwKQorCisgICAgIyBGaW5kIHVudXNlZCBub24tdGVybWluYWxzCisgICAgdW51c2VkX3J1bGVzID0gZ3JhbW1hci51bnVzZWRfcnVsZXMoKQorICAgIGZvciBwcm9kIGluIHVudXNlZF9ydWxlczoKKyAgICAgICAgZXJyb3Jsb2cud2FybmluZygnJXM6JWQ6IFJ1bGUgJXIgZGVmaW5lZCwgYnV0IG5vdCB1c2VkJywgcHJvZC5maWxlLCBwcm9kLmxpbmUsIHByb2QubmFtZSkKKworICAgIGlmIGxlbih1bnVzZWRfdGVybWluYWxzKSA9PSAxOgorICAgICAgICBlcnJvcmxvZy53YXJuaW5nKCdUaGVyZSBpcyAxIHVudXNlZCB0b2tlbicpCisgICAgaWYgbGVuKHVudXNlZF90ZXJtaW5hbHMpID4gMToKKyAgICAgICAgZXJyb3Jsb2cud2FybmluZygnVGhlcmUgYXJlICVkIHVudXNlZCB0b2tlbnMnLCBsZW4odW51c2VkX3Rlcm1pbmFscykpCisKKyAgICBpZiBsZW4odW51c2VkX3J1bGVzKSA9PSAxOgorICAgICAgICBlcnJvcmxvZy53YXJuaW5nKCdUaGVyZSBpcyAxIHVudXNlZCBydWxlJykKKyAgICBpZiBsZW4odW51c2VkX3J1bGVzKSA+IDE6CisgICAgICAgIGVycm9ybG9nLndhcm5pbmcoJ1RoZXJlIGFyZSAlZCB1bnVzZWQgcnVsZXMnLCBsZW4odW51c2VkX3J1bGVzKSkKKworICAgIGlmIGRlYnVnOgorICAgICAgICBkZWJ1Z2xvZy5pbmZvKCcnKQorICAgICAgICBkZWJ1Z2xvZy5pbmZvKCdUZXJtaW5hbHMsIHdpdGggcnVsZXMgd2hlcmUgdGhleSBhcHBlYXInKQorICAgICAgICBkZWJ1Z2xvZy5pbmZvKCcnKQorICAgICAgICB0ZXJtcyA9IGxpc3QoZ3JhbW1hci5UZXJtaW5hbHMpCisgICAgICAgIHRlcm1zLnNvcnQoKQorICAgICAgICBmb3IgdGVybSBpbiB0ZXJtczoKKyAgICAgICAgICAgIGRlYnVnbG9nLmluZm8oJyUtMjBzIDogJXMnLCB0ZXJtLCAnICcuam9pbihbc3RyKHMpIGZvciBzIGluIGdyYW1tYXIuVGVybWluYWxzW3Rlcm1dXSkpCisKKyAgICAgICAgZGVidWdsb2cuaW5mbygnJykKKyAgICAgICAgZGVidWdsb2cuaW5mbygnTm9udGVybWluYWxzLCB3aXRoIHJ1bGVzIHdoZXJlIHRoZXkgYXBwZWFyJykKKyAgICAgICAgZGVidWdsb2cuaW5mbygnJykKKyAgICAgICAgbm9udGVybXMgPSBsaXN0KGdyYW1tYXIuTm9udGVybWluYWxzKQorICAgICAgICBub250ZXJtcy5zb3J0KCkKKyAgICAgICAgZm9yIG5vbnRlcm0gaW4gbm9udGVybXM6CisgICAgICAgICAgICBkZWJ1Z2xvZy5pbmZvKCclLTIwcyA6ICVzJywgbm9udGVybSwgJyAnLmpvaW4oW3N0cihzKSBmb3IgcyBpbiBncmFtbWFyLk5vbnRlcm1pbmFsc1tub250ZXJtXV0pKQorICAgICAgICBkZWJ1Z2xvZy5pbmZvKCcnKQorCisgICAgaWYgY2hlY2tfcmVjdXJzaW9uOgorICAgICAgICB1bnJlYWNoYWJsZSA9IGdyYW1tYXIuZmluZF91bnJlYWNoYWJsZSgpCisgICAgICAgIGZvciB1IGluIHVucmVhY2hhYmxlOgorICAgICAgICAgICAgZXJyb3Jsb2cud2FybmluZygnU3ltYm9sICVyIGlzIHVucmVhY2hhYmxlJywgdSkKKworICAgICAgICBpbmZpbml0ZSA9IGdyYW1tYXIuaW5maW5pdGVfY3ljbGVzKCkKKyAgICAgICAgZm9yIGluZiBpbiBpbmZpbml0ZToKKyAgICAgICAgICAgIGVycm9ybG9nLmVycm9yKCdJbmZpbml0ZSByZWN1cnNpb24gZGV0ZWN0ZWQgZm9yIHN5bWJvbCAlcicsIGluZikKKyAgICAgICAgICAgIGVycm9ycyA9IFRydWUKKworICAgIHVudXNlZF9wcmVjID0gZ3JhbW1hci51bnVzZWRfcHJlY2VkZW5jZSgpCisgICAgZm9yIHRlcm0sIGFzc29jIGluIHVudXNlZF9wcmVjOgorICAgICAgICBlcnJvcmxvZy5lcnJvcignUHJlY2VkZW5jZSBydWxlICVyIGRlZmluZWQgZm9yIHVua25vd24gc3ltYm9sICVyJywgYXNzb2MsIHRlcm0pCisgICAgICAgIGVycm9ycyA9IFRydWUKKworICAgIGlmIGVycm9yczoKKyAgICAgICAgcmFpc2UgWWFjY0Vycm9yKCdVbmFibGUgdG8gYnVpbGQgcGFyc2VyJykKKworICAgICMgUnVuIHRoZSBMUkdlbmVyYXRlZFRhYmxlIG9uIHRoZSBncmFtbWFyCisgICAgaWYgZGVidWc6CisgICAgICAgIGVycm9ybG9nLmRlYnVnKCdHZW5lcmF0aW5nICVzIHRhYmxlcycsIG1ldGhvZCkKKworICAgIGxyID0gTFJHZW5lcmF0ZWRUYWJsZShncmFtbWFyLCBtZXRob2QsIGRlYnVnbG9nKQorCisgICAgaWYgZGVidWc6CisgICAgICAgIG51bV9zciA9IGxlbihsci5zcl9jb25mbGljdHMpCisKKyAgICAgICAgIyBSZXBvcnQgc2hpZnQvcmVkdWNlIGFuZCByZWR1Y2UvcmVkdWNlIGNvbmZsaWN0cworICAgICAgICBpZiBudW1fc3IgPT0gMToKKyAgICAgICAgICAgIGVycm9ybG9nLndhcm5pbmcoJzEgc2hpZnQvcmVkdWNlIGNvbmZsaWN0JykKKyAgICAgICAgZWxpZiBudW1fc3IgPiAxOgorICAgICAgICAgICAgZXJyb3Jsb2cud2FybmluZygnJWQgc2hpZnQvcmVkdWNlIGNvbmZsaWN0cycsIG51bV9zcikKKworICAgICAgICBudW1fcnIgPSBsZW4obHIucnJfY29uZmxpY3RzKQorICAgICAgICBpZiBudW1fcnIgPT0gMToKKyAgICAgICAgICAgIGVycm9ybG9nLndhcm5pbmcoJzEgcmVkdWNlL3JlZHVjZSBjb25mbGljdCcpCisgICAgICAgIGVsaWYgbnVtX3JyID4gMToKKyAgICAgICAgICAgIGVycm9ybG9nLndhcm5pbmcoJyVkIHJlZHVjZS9yZWR1Y2UgY29uZmxpY3RzJywgbnVtX3JyKQorCisgICAgIyBXcml0ZSBvdXQgY29uZmxpY3RzIHRvIHRoZSBvdXRwdXQgZmlsZQorICAgIGlmIGRlYnVnIGFuZCAobHIuc3JfY29uZmxpY3RzIG9yIGxyLnJyX2NvbmZsaWN0cyk6CisgICAgICAgIGRlYnVnbG9nLndhcm5pbmcoJycpCisgICAgICAgIGRlYnVnbG9nLndhcm5pbmcoJ0NvbmZsaWN0czonKQorICAgICAgICBkZWJ1Z2xvZy53YXJuaW5nKCcnKQorCisgICAgICAgIGZvciBzdGF0ZSwgdG9rLCByZXNvbHV0aW9uIGluIGxyLnNyX2NvbmZsaWN0czoKKyAgICAgICAgICAgIGRlYnVnbG9nLndhcm5pbmcoJ3NoaWZ0L3JlZHVjZSBjb25mbGljdCBmb3IgJXMgaW4gc3RhdGUgJWQgcmVzb2x2ZWQgYXMgJXMnLCAgdG9rLCBzdGF0ZSwgcmVzb2x1dGlvbikKKworICAgICAgICBhbHJlYWR5X3JlcG9ydGVkID0gc2V0KCkKKyAgICAgICAgZm9yIHN0YXRlLCBydWxlLCByZWplY3RlZCBpbiBsci5ycl9jb25mbGljdHM6CisgICAgICAgICAgICBpZiAoc3RhdGUsIGlkKHJ1bGUpLCBpZChyZWplY3RlZCkpIGluIGFscmVhZHlfcmVwb3J0ZWQ6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGRlYnVnbG9nLndhcm5pbmcoJ3JlZHVjZS9yZWR1Y2UgY29uZmxpY3QgaW4gc3RhdGUgJWQgcmVzb2x2ZWQgdXNpbmcgcnVsZSAoJXMpJywgc3RhdGUsIHJ1bGUpCisgICAgICAgICAgICBkZWJ1Z2xvZy53YXJuaW5nKCdyZWplY3RlZCBydWxlICglcykgaW4gc3RhdGUgJWQnLCByZWplY3RlZCwgc3RhdGUpCisgICAgICAgICAgICBlcnJvcmxvZy53YXJuaW5nKCdyZWR1Y2UvcmVkdWNlIGNvbmZsaWN0IGluIHN0YXRlICVkIHJlc29sdmVkIHVzaW5nIHJ1bGUgKCVzKScsIHN0YXRlLCBydWxlKQorICAgICAgICAgICAgZXJyb3Jsb2cud2FybmluZygncmVqZWN0ZWQgcnVsZSAoJXMpIGluIHN0YXRlICVkJywgcmVqZWN0ZWQsIHN0YXRlKQorICAgICAgICAgICAgYWxyZWFkeV9yZXBvcnRlZC5hZGQoKHN0YXRlLCBpZChydWxlKSwgaWQocmVqZWN0ZWQpKSkKKworICAgICAgICB3YXJuZWRfbmV2ZXIgPSBbXQorICAgICAgICBmb3Igc3RhdGUsIHJ1bGUsIHJlamVjdGVkIGluIGxyLnJyX2NvbmZsaWN0czoKKyAgICAgICAgICAgIGlmIG5vdCByZWplY3RlZC5yZWR1Y2VkIGFuZCAocmVqZWN0ZWQgbm90IGluIHdhcm5lZF9uZXZlcik6CisgICAgICAgICAgICAgICAgZGVidWdsb2cud2FybmluZygnUnVsZSAoJXMpIGlzIG5ldmVyIHJlZHVjZWQnLCByZWplY3RlZCkKKyAgICAgICAgICAgICAgICBlcnJvcmxvZy53YXJuaW5nKCdSdWxlICglcykgaXMgbmV2ZXIgcmVkdWNlZCcsIHJlamVjdGVkKQorICAgICAgICAgICAgICAgIHdhcm5lZF9uZXZlci5hcHBlbmQocmVqZWN0ZWQpCisKKyAgICAjIFdyaXRlIHRoZSB0YWJsZSBmaWxlIGlmIHJlcXVlc3RlZAorICAgIGlmIHdyaXRlX3RhYmxlczoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbHIud3JpdGVfdGFibGUodGFibW9kdWxlLCBvdXRwdXRkaXIsIHNpZ25hdHVyZSkKKyAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZToKKyAgICAgICAgICAgIGVycm9ybG9nLndhcm5pbmcoIkNvdWxkbid0IGNyZWF0ZSAlci4gJXMiICUgKHRhYm1vZHVsZSwgZSkpCisKKyAgICAjIFdyaXRlIGEgcGlja2xlZCB2ZXJzaW9uIG9mIHRoZSB0YWJsZXMKKyAgICBpZiBwaWNrbGVmaWxlOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBsci5waWNrbGVfdGFibGUocGlja2xlZmlsZSwgc2lnbmF0dXJlKQorICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgICAgICAgZXJyb3Jsb2cud2FybmluZygiQ291bGRuJ3QgY3JlYXRlICVyLiAlcyIgJSAocGlja2xlZmlsZSwgZSkpCisKKyAgICAjIEJ1aWxkIHRoZSBwYXJzZXIKKyAgICBsci5iaW5kX2NhbGxhYmxlcyhwaW5mby5wZGljdCkKKyAgICBwYXJzZXIgPSBMUlBhcnNlcihsciwgcGluZm8uZXJyb3JfZnVuYykKKworICAgIHBhcnNlID0gcGFyc2VyLnBhcnNlCisgICAgcmV0dXJuIHBhcnNlcgpkaWZmIC0tZ2l0IGEvcGx5L3BseS95Z2VuLnB5IGIvcGx5L3BseS95Z2VuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZjVjYTEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvcGx5L3lnZW4ucHkKQEAgLTAsMCArMSw3NCBAQAorIyBwbHk6IHlnZW4ucHkKKyMKKyMgVGhpcyBpcyBhIHN1cHBvcnQgcHJvZ3JhbSB0aGF0IGF1dG8tZ2VuZXJhdGVzIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgWUFDQyBwYXJzaW5nCisjIGZ1bmN0aW9uIHdpdGggZGlmZmVyZW50IGZlYXR1cmVzIHJlbW92ZWQgZm9yIHRoZSBwdXJwb3NlcyBvZiBwZXJmb3JtYW5jZS4KKyMKKyMgVXNlcnMgc2hvdWxkIGVkaXQgdGhlIG1ldGhvZCBMUGFyc2VyLnBhcnNlZGVidWcoKSBpbiB5YWNjLnB5LiAgIFRoZSBzb3VyY2UgY29kZSAKKyMgZm9yIHRoYXQgbWV0aG9kIGlzIHRoZW4gdXNlZCB0byBjcmVhdGUgdGhlIG90aGVyIG1ldGhvZHMuICAgU2VlIHRoZSBjb21tZW50cyBpbgorIyB5YWNjLnB5IGZvciBmdXJ0aGVyIGRldGFpbHMuCisKK2ltcG9ydCBvcy5wYXRoCitpbXBvcnQgc2h1dGlsCisKK2RlZiBnZXRfc291cmNlX3JhbmdlKGxpbmVzLCB0YWcpOgorICAgIHNyY2xpbmVzID0gZW51bWVyYXRlKGxpbmVzKQorICAgIHN0YXJ0X3RhZyA9ICcjLS0hICVzLXN0YXJ0JyAlIHRhZworICAgIGVuZF90YWcgPSAnIy0tISAlcy1lbmQnICUgdGFnCisKKyAgICBmb3Igc3RhcnRfaW5kZXgsIGxpbmUgaW4gc3JjbGluZXM6CisgICAgICAgIGlmIGxpbmUuc3RyaXAoKS5zdGFydHN3aXRoKHN0YXJ0X3RhZyk6CisgICAgICAgICAgICBicmVhaworCisgICAgZm9yIGVuZF9pbmRleCwgbGluZSBpbiBzcmNsaW5lczoKKyAgICAgICAgaWYgbGluZS5zdHJpcCgpLmVuZHN3aXRoKGVuZF90YWcpOgorICAgICAgICAgICAgYnJlYWsKKworICAgIHJldHVybiAoc3RhcnRfaW5kZXggKyAxLCBlbmRfaW5kZXgpCisKK2RlZiBmaWx0ZXJfc2VjdGlvbihsaW5lcywgdGFnKToKKyAgICBmaWx0ZXJlZF9saW5lcyA9IFtdCisgICAgaW5jbHVkZSA9IFRydWUKKyAgICB0YWdfdGV4dCA9ICcjLS0hICVzJyAlIHRhZworICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICBpZiBsaW5lLnN0cmlwKCkuc3RhcnRzd2l0aCh0YWdfdGV4dCk6CisgICAgICAgICAgICBpbmNsdWRlID0gbm90IGluY2x1ZGUKKyAgICAgICAgZWxpZiBpbmNsdWRlOgorICAgICAgICAgICAgZmlsdGVyZWRfbGluZXMuYXBwZW5kKGxpbmUpCisgICAgcmV0dXJuIGZpbHRlcmVkX2xpbmVzCisKK2RlZiBtYWluKCk6CisgICAgZGlybmFtZSA9IG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykKKyAgICBzaHV0aWwuY29weTIob3MucGF0aC5qb2luKGRpcm5hbWUsICd5YWNjLnB5JyksIG9zLnBhdGguam9pbihkaXJuYW1lLCAneWFjYy5weS5iYWsnKSkKKyAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKGRpcm5hbWUsICd5YWNjLnB5JyksICdyJykgYXMgZjoKKyAgICAgICAgbGluZXMgPSBmLnJlYWRsaW5lcygpCisKKyAgICBwYXJzZV9zdGFydCwgcGFyc2VfZW5kID0gZ2V0X3NvdXJjZV9yYW5nZShsaW5lcywgJ3BhcnNlZGVidWcnKQorICAgIHBhcnNlb3B0X3N0YXJ0LCBwYXJzZW9wdF9lbmQgPSBnZXRfc291cmNlX3JhbmdlKGxpbmVzLCAncGFyc2VvcHQnKQorICAgIHBhcnNlb3B0X25vdHJhY2tfc3RhcnQsIHBhcnNlb3B0X25vdHJhY2tfZW5kID0gZ2V0X3NvdXJjZV9yYW5nZShsaW5lcywgJ3BhcnNlb3B0LW5vdHJhY2snKQorCisgICAgIyBHZXQgdGhlIG9yaWdpbmFsIHNvdXJjZQorICAgIG9yaWdfbGluZXMgPSBsaW5lc1twYXJzZV9zdGFydDpwYXJzZV9lbmRdCisKKyAgICAjIEZpbHRlciB0aGUgREVCVUcgc2VjdGlvbnMgb3V0CisgICAgcGFyc2VvcHRfbGluZXMgPSBmaWx0ZXJfc2VjdGlvbihvcmlnX2xpbmVzLCAnREVCVUcnKQorCisgICAgIyBGaWx0ZXIgdGhlIFRSQUNLSU5HIHNlY3Rpb25zIG91dAorICAgIHBhcnNlb3B0X25vdHJhY2tfbGluZXMgPSBmaWx0ZXJfc2VjdGlvbihwYXJzZW9wdF9saW5lcywgJ1RSQUNLSU5HJykKKworICAgICMgUmVwbGFjZSB0aGUgcGFyc2VyIHNvdXJjZSBzZWN0aW9ucyB3aXRoIHVwZGF0ZWQgdmVyc2lvbnMKKyAgICBsaW5lc1twYXJzZW9wdF9ub3RyYWNrX3N0YXJ0OnBhcnNlb3B0X25vdHJhY2tfZW5kXSA9IHBhcnNlb3B0X25vdHJhY2tfbGluZXMKKyAgICBsaW5lc1twYXJzZW9wdF9zdGFydDpwYXJzZW9wdF9lbmRdID0gcGFyc2VvcHRfbGluZXMKKworICAgIGxpbmVzID0gW2xpbmUucnN0cmlwKCkrJ1xuJyBmb3IgbGluZSBpbiBsaW5lc10KKyAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKGRpcm5hbWUsICd5YWNjLnB5JyksICd3JykgYXMgZjoKKyAgICAgICAgZi53cml0ZWxpbmVzKGxpbmVzKQorCisgICAgcHJpbnQoJ1VwZGF0ZWQgeWFjYy5weScpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgbWFpbigpCisKKworCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3NldHVwLmNmZyBiL3BseS9zZXR1cC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVlZTdkYgotLS0gL2Rldi9udWxsCisrKyBiL3BseS9zZXR1cC5jZmcKQEAgLTAsMCArMSw1IEBACitbYmRpc3Rfd2hlZWxdCit1bml2ZXJzYWwgPSAxCisKK1ttZXRhZGF0YV0KK2Rlc2NyaXB0aW9uLWZpbGUgPSBSRUFETUUubWQKZGlmZiAtLWdpdCBhL3BseS9zZXR1cC5weSBiL3BseS9zZXR1cC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZThjY2QwCi0tLSAvZGV2L251bGwKKysrIGIvcGx5L3NldHVwLnB5CkBAIC0wLDAgKzEsMzEgQEAKK3RyeToKKyAgICBmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNldHVwCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAKKworc2V0dXAobmFtZSA9ICJwbHkiLAorICAgICAgICAgICAgZGVzY3JpcHRpb249IlB5dGhvbiBMZXggJiBZYWNjIiwKKyAgICAgICAgICAgIGxvbmdfZGVzY3JpcHRpb24gPSAiIiIKK1BMWSBpcyB5ZXQgYW5vdGhlciBpbXBsZW1lbnRhdGlvbiBvZiBsZXggYW5kIHlhY2MgZm9yIFB5dGhvbi4gU29tZSBub3RhYmxlCitmZWF0dXJlcyBpbmNsdWRlIHRoZSBmYWN0IHRoYXQgaXRzIGltcGxlbWVudGVkIGVudGlyZWx5IGluIFB5dGhvbiBhbmQgaXQKK3VzZXMgTEFMUigxKSBwYXJzaW5nIHdoaWNoIGlzIGVmZmljaWVudCBhbmQgd2VsbCBzdWl0ZWQgZm9yIGxhcmdlciBncmFtbWFycy4KKworUExZIHByb3ZpZGVzIG1vc3Qgb2YgdGhlIHN0YW5kYXJkIGxleC95YWNjIGZlYXR1cmVzIGluY2x1ZGluZyBzdXBwb3J0IGZvciBlbXB0eSAKK3Byb2R1Y3Rpb25zLCBwcmVjZWRlbmNlIHJ1bGVzLCBlcnJvciByZWNvdmVyeSwgYW5kIHN1cHBvcnQgZm9yIGFtYmlndW91cyBncmFtbWFycy4gCisKK1BMWSBpcyBleHRyZW1lbHkgZWFzeSB0byB1c2UgYW5kIHByb3ZpZGVzIHZlcnkgZXh0ZW5zaXZlIGVycm9yIGNoZWNraW5nLiAKK0l0IGlzIGNvbXBhdGlibGUgd2l0aCBib3RoIFB5dGhvbiAyIGFuZCBQeXRob24gMy4KKyIiIiwKKyAgICAgICAgICAgIGxpY2Vuc2U9IiIiQlNEIiIiLAorICAgICAgICAgICAgdmVyc2lvbiA9ICIzLjEwIiwKKyAgICAgICAgICAgIGF1dGhvciA9ICJEYXZpZCBCZWF6bGV5IiwKKyAgICAgICAgICAgIGF1dGhvcl9lbWFpbCA9ICJkYXZlQGRhYmVhei5jb20iLAorICAgICAgICAgICAgbWFpbnRhaW5lciA9ICJEYXZpZCBCZWF6bGV5IiwKKyAgICAgICAgICAgIG1haW50YWluZXJfZW1haWwgPSAiZGF2ZUBkYWJlYXouY29tIiwKKyAgICAgICAgICAgIHVybCA9ICJodHRwOi8vd3d3LmRhYmVhei5jb20vcGx5LyIsCisgICAgICAgICAgICBwYWNrYWdlcyA9IFsncGx5J10sCisgICAgICAgICAgICBjbGFzc2lmaWVycyA9IFsKKyAgICAgICAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzJywKKyAgICAgICAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyJywKKyAgICAgICAgICAgICAgXQorICAgICAgICAgICAgKQpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvUkVBRE1FIGIvcGx5L3Rlc3QvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZjAzMmEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC9SRUFETUUKQEAgLTAsMCArMSw3IEBACitUaGlzIGRpcmVjdG9yeSBtb3N0bHkgY29udGFpbnMgdGVzdHMgZm9yIHZhcmlvdXMgdHlwZXMgb2YgZXJyb3IKK2NvbmRpdGlvbnMuICBUbyBydW46CisKKyAgJCBweXRob24gdGVzdGxleC5weSAKKyAgJCBweXRob24gdGVzdHlhY2MucHkgCisKK1RoZSBzY3JpcHQgJ2NsZWFudXAuc2gnIGNsZWFucyB1cCB0aGlzIGRpcmVjdG9yeSB0byBpdHMgb3JpZ2luYWwgc3RhdGUuCmRpZmYgLS1naXQgYS9wbHkvdGVzdC9jYWxjbGV4LnB5IGIvcGx5L3Rlc3QvY2FsY2xleC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzBhOTg2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QvY2FsY2xleC5weQpAQCAtMCwwICsxLDQ5IEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNhbGNsZXgucHkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ltcG9ydCBzeXMKKworaWYgIi4uIiBub3QgaW4gc3lzLnBhdGg6IHN5cy5wYXRoLmluc2VydCgwLCIuLiIpCitpbXBvcnQgcGx5LmxleCBhcyBsZXgKKwordG9rZW5zID0gKAorICAgICdOQU1FJywnTlVNQkVSJywKKyAgICAnUExVUycsJ01JTlVTJywnVElNRVMnLCdESVZJREUnLCdFUVVBTFMnLAorICAgICdMUEFSRU4nLCdSUEFSRU4nLAorICAgICkKKworIyBUb2tlbnMKKwordF9QTFVTICAgID0gcidcKycKK3RfTUlOVVMgICA9IHInLScKK3RfVElNRVMgICA9IHInXConCit0X0RJVklERSAgPSByJy8nCit0X0VRVUFMUyAgPSByJz0nCit0X0xQQVJFTiAgPSByJ1woJwordF9SUEFSRU4gID0gcidcKScKK3RfTkFNRSAgICA9IHInW2EtekEtWl9dW2EtekEtWjAtOV9dKicKKworZGVmIHRfTlVNQkVSKHQpOgorICAgIHInXGQrJworICAgIHRyeToKKyAgICAgICAgdC52YWx1ZSA9IGludCh0LnZhbHVlKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICBwcmludCgiSW50ZWdlciB2YWx1ZSB0b28gbGFyZ2UgJXMiICUgdC52YWx1ZSkKKyAgICAgICAgdC52YWx1ZSA9IDAKKyAgICByZXR1cm4gdAorCit0X2lnbm9yZSA9ICIgXHQiCisKK2RlZiB0X25ld2xpbmUodCk6CisgICAgcidcbisnCisgICAgdC5sZXhlci5saW5lbm8gKz0gdC52YWx1ZS5jb3VudCgiXG4iKQorICAgIAorZGVmIHRfZXJyb3IodCk6CisgICAgcHJpbnQoIklsbGVnYWwgY2hhcmFjdGVyICclcyciICUgdC52YWx1ZVswXSkKKyAgICB0LmxleGVyLnNraXAoMSkKKyAgICAKKyMgQnVpbGQgdGhlIGxleGVyCitsZXhlciA9IGxleC5sZXgoKQorCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvY2xlYW51cC5zaCBiL3BseS90ZXN0L2NsZWFudXAuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTM3NGYyYwotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L2NsZWFudXAuc2gKQEAgLTAsMCArMSw0IEBACisjIS9iaW4vc2gKKworcm0gLXJmICp+ICoucHljICoucHlvICouZGlmICoub3V0IF9fcHljYWNoZV9fCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L2xleF9jbG9zdXJlLnB5IGIvcGx5L3Rlc3QvbGV4X2Nsb3N1cmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBlZTY3OQotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L2xleF9jbG9zdXJlLnB5CkBAIC0wLDAgKzEsNTQgQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgbGV4X2Nsb3N1cmUucHkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ltcG9ydCBzeXMKKworaWYgIi4uIiBub3QgaW4gc3lzLnBhdGg6IHN5cy5wYXRoLmluc2VydCgwLCIuLiIpCitpbXBvcnQgcGx5LmxleCBhcyBsZXgKKwordG9rZW5zID0gKAorICAgICAgICAnTkFNRScsJ05VTUJFUicsCisgICAgICAgICdQTFVTJywnTUlOVVMnLCdUSU1FUycsJ0RJVklERScsJ0VRVUFMUycsCisgICAgICAgICdMUEFSRU4nLCdSUEFSRU4nLAorICAgICAgICApCisKK2RlZiBtYWtlX2NhbGMoKToKKworICAgICMgVG9rZW5zCisKKyAgICB0X1BMVVMgICAgPSByJ1wrJworICAgIHRfTUlOVVMgICA9IHInLScKKyAgICB0X1RJTUVTICAgPSByJ1wqJworICAgIHRfRElWSURFICA9IHInLycKKyAgICB0X0VRVUFMUyAgPSByJz0nCisgICAgdF9MUEFSRU4gID0gcidcKCcKKyAgICB0X1JQQVJFTiAgPSByJ1wpJworICAgIHRfTkFNRSAgICA9IHInW2EtekEtWl9dW2EtekEtWjAtOV9dKicKKworICAgIGRlZiB0X05VTUJFUih0KToKKyAgICAgICAgcidcZCsnCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHQudmFsdWUgPSBpbnQodC52YWx1ZSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwcmludCgiSW50ZWdlciB2YWx1ZSB0b28gbGFyZ2UgJXMiICUgdC52YWx1ZSkKKyAgICAgICAgICAgIHQudmFsdWUgPSAwCisgICAgICAgIHJldHVybiB0CisKKyAgICB0X2lnbm9yZSA9ICIgXHQiCisKKyAgICBkZWYgdF9uZXdsaW5lKHQpOgorICAgICAgICByJ1xuKycKKyAgICAgICAgdC5saW5lbm8gKz0gdC52YWx1ZS5jb3VudCgiXG4iKQorICAgICAgICAKKyAgICBkZWYgdF9lcnJvcih0KToKKyAgICAgICAgcHJpbnQoIklsbGVnYWwgY2hhcmFjdGVyICclcyciICUgdC52YWx1ZVswXSkKKyAgICAgICAgdC5sZXhlci5za2lwKDEpCisgICAgICAgIAorICAgICMgQnVpbGQgdGhlIGxleGVyCisgICAgcmV0dXJuIGxleC5sZXgoKQorCittYWtlX2NhbGMoKQorbGV4LnJ1bm1haW4oZGF0YT0iMys0IikKKworCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L2xleF9kb2MxLnB5IGIvcGx5L3Rlc3QvbGV4X2RvYzEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEyYmZjYwotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L2xleF9kb2MxLnB5CkBAIC0wLDAgKzEsMjYgQEAKKyMgbGV4X2RvYzEucHkKKyMKKyMgTWlzc2luZyBkb2N1bWVudGF0aW9uIHN0cmluZworCitpbXBvcnQgc3lzCitpZiAiLi4iIG5vdCBpbiBzeXMucGF0aDogc3lzLnBhdGguaW5zZXJ0KDAsIi4uIikKKworaW1wb3J0IHBseS5sZXggYXMgbGV4CisKK3Rva2VucyA9IFsKKyAgICAiUExVUyIsCisgICAgIk1JTlVTIiwKKyAgICAiTlVNQkVSIiwKKyAgICBdCisKK3RfUExVUyA9IHInXCsnCit0X01JTlVTID0gcictJworZGVmIHRfTlVNQkVSKHQpOgorICAgIHBhc3MKKworZGVmIHRfZXJyb3IodCk6CisgICAgcGFzcworCitsZXgubGV4KCkKKworCmRpZmYgLS1naXQgYS9wbHkvdGVzdC9sZXhfZHVwMS5weSBiL3BseS90ZXN0L2xleF9kdXAxLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMDRjZGIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC9sZXhfZHVwMS5weQpAQCAtMCwwICsxLDI5IEBACisjIGxleF9kdXAxLnB5CisjCisjIER1cGxpY2F0ZWQgcnVsZSBzcGVjaWZpZXJzCisKK2ltcG9ydCBzeXMKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQorCitpbXBvcnQgcGx5LmxleCBhcyBsZXgKKwordG9rZW5zID0gWworICAgICJQTFVTIiwKKyAgICAiTUlOVVMiLAorICAgICJOVU1CRVIiLAorICAgIF0KKwordF9QTFVTID0gcidcKycKK3RfTUlOVVMgPSByJy0nCit0X05VTUJFUiA9IHInXGQrJworCit0X05VTUJFUiA9IHInXGQrJworCitkZWYgdF9lcnJvcih0KToKKyAgICBwYXNzCisKKworCitsZXgubGV4KCkKKworCmRpZmYgLS1naXQgYS9wbHkvdGVzdC9sZXhfZHVwMi5weSBiL3BseS90ZXN0L2xleF9kdXAyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MGU1ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC9sZXhfZHVwMi5weQpAQCAtMCwwICsxLDMzIEBACisjIGxleF9kdXAyLnB5CisjCisjIER1cGxpY2F0ZWQgcnVsZSBzcGVjaWZpZXJzCisKK2ltcG9ydCBzeXMKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQorCitpbXBvcnQgcGx5LmxleCBhcyBsZXgKKwordG9rZW5zID0gWworICAgICJQTFVTIiwKKyAgICAiTUlOVVMiLAorICAgICJOVU1CRVIiLAorICAgIF0KKwordF9QTFVTID0gcidcKycKK3RfTUlOVVMgPSByJy0nCitkZWYgdF9OVU1CRVIodCk6CisgICAgcidcZCsnCisgICAgcGFzcworCitkZWYgdF9OVU1CRVIodCk6CisgICAgcidcZCsnCisgICAgcGFzcworCitkZWYgdF9lcnJvcih0KToKKyAgICBwYXNzCisKKworCitsZXgubGV4KCkKKworCmRpZmYgLS1naXQgYS9wbHkvdGVzdC9sZXhfZHVwMy5weSBiL3BseS90ZXN0L2xleF9kdXAzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YjU1OTIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC9sZXhfZHVwMy5weQpAQCAtMCwwICsxLDMxIEBACisjIGxleF9kdXAzLnB5CisjCisjIER1cGxpY2F0ZWQgcnVsZSBzcGVjaWZpZXJzCisKK2ltcG9ydCBzeXMKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQorCitpbXBvcnQgcGx5LmxleCBhcyBsZXgKKwordG9rZW5zID0gWworICAgICJQTFVTIiwKKyAgICAiTUlOVVMiLAorICAgICJOVU1CRVIiLAorICAgIF0KKwordF9QTFVTID0gcidcKycKK3RfTUlOVVMgPSByJy0nCit0X05VTUJFUiA9IHInXGQrJworCitkZWYgdF9OVU1CRVIodCk6CisgICAgcidcZCsnCisgICAgcGFzcworCitkZWYgdF9lcnJvcih0KToKKyAgICBwYXNzCisKKworCitsZXgubGV4KCkKKworCmRpZmYgLS1naXQgYS9wbHkvdGVzdC9sZXhfZW1wdHkucHkgYi9wbHkvdGVzdC9sZXhfZW1wdHkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAzNjhiZgotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L2xleF9lbXB0eS5weQpAQCAtMCwwICsxLDIwIEBACisjIGxleF9lbXB0eS5weQorIworIyBObyBydWxlcyBkZWZpbmVkCisKK2ltcG9ydCBzeXMKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQorCitpbXBvcnQgcGx5LmxleCBhcyBsZXgKKwordG9rZW5zID0gWworICAgICJQTFVTIiwKKyAgICAiTUlOVVMiLAorICAgICJOVU1CRVIiLAorICAgIF0KKworCisKK2xleC5sZXgoKQorCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L2xleF9lcnJvcjEucHkgYi9wbHkvdGVzdC9sZXhfZXJyb3IxLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MDhhODAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC9sZXhfZXJyb3IxLnB5CkBAIC0wLDAgKzEsMjQgQEAKKyMgbGV4X2Vycm9yMS5weQorIworIyBNaXNzaW5nIHRfZXJyb3IoKSBydWxlCisKK2ltcG9ydCBzeXMKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQorCitpbXBvcnQgcGx5LmxleCBhcyBsZXgKKwordG9rZW5zID0gWworICAgICJQTFVTIiwKKyAgICAiTUlOVVMiLAorICAgICJOVU1CRVIiLAorICAgIF0KKwordF9QTFVTID0gcidcKycKK3RfTUlOVVMgPSByJy0nCit0X05VTUJFUiA9IHInXGQrJworCisKKworbGV4LmxleCgpCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvbGV4X2Vycm9yMi5weSBiL3BseS90ZXN0L2xleF9lcnJvcjIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA0MGQzOQotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L2xleF9lcnJvcjIucHkKQEAgLTAsMCArMSwyNiBAQAorIyBsZXhfZXJyb3IyLnB5CisjCisjIHRfZXJyb3IgZGVmaW5lZCwgYnV0IG5vdCBmdW5jdGlvbgorCitpbXBvcnQgc3lzCitpZiAiLi4iIG5vdCBpbiBzeXMucGF0aDogc3lzLnBhdGguaW5zZXJ0KDAsIi4uIikKKworaW1wb3J0IHBseS5sZXggYXMgbGV4CisKK3Rva2VucyA9IFsKKyAgICAiUExVUyIsCisgICAgIk1JTlVTIiwKKyAgICAiTlVNQkVSIiwKKyAgICBdCisKK3RfUExVUyA9IHInXCsnCit0X01JTlVTID0gcictJwordF9OVU1CRVIgPSByJ1xkKycKKwordF9lcnJvciA9ICJmb28iCisKKworCitsZXgubGV4KCkKKworCmRpZmYgLS1naXQgYS9wbHkvdGVzdC9sZXhfZXJyb3IzLnB5IGIvcGx5L3Rlc3QvbGV4X2Vycm9yMy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmVlZmI2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QvbGV4X2Vycm9yMy5weQpAQCAtMCwwICsxLDI3IEBACisjIGxleF9lcnJvcjMucHkKKyMKKyMgdF9lcnJvciBkZWZpbmVkIGFzIGZ1bmN0aW9uLCBidXQgd2l0aCB3cm9uZyAjIGFyZ3MKKworaW1wb3J0IHN5cworaWYgIi4uIiBub3QgaW4gc3lzLnBhdGg6IHN5cy5wYXRoLmluc2VydCgwLCIuLiIpCisKK2ltcG9ydCBwbHkubGV4IGFzIGxleAorCit0b2tlbnMgPSBbCisgICAgIlBMVVMiLAorICAgICJNSU5VUyIsCisgICAgIk5VTUJFUiIsCisgICAgXQorCit0X1BMVVMgPSByJ1wrJwordF9NSU5VUyA9IHInLScKK3RfTlVNQkVSID0gcidcZCsnCisKK2RlZiB0X2Vycm9yKCk6CisgICAgcGFzcworCisKKworbGV4LmxleCgpCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvbGV4X2Vycm9yNC5weSBiL3BseS90ZXN0L2xleF9lcnJvcjQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRmNDhkYgotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L2xleF9lcnJvcjQucHkKQEAgLTAsMCArMSwyNyBAQAorIyBsZXhfZXJyb3I0LnB5CisjCisjIHRfZXJyb3IgZGVmaW5lZCBhcyBmdW5jdGlvbiwgYnV0IHRvbyBtYW55IGFyZ3MKKworaW1wb3J0IHN5cworaWYgIi4uIiBub3QgaW4gc3lzLnBhdGg6IHN5cy5wYXRoLmluc2VydCgwLCIuLiIpCisKK2ltcG9ydCBwbHkubGV4IGFzIGxleAorCit0b2tlbnMgPSBbCisgICAgIlBMVVMiLAorICAgICJNSU5VUyIsCisgICAgIk5VTUJFUiIsCisgICAgXQorCit0X1BMVVMgPSByJ1wrJwordF9NSU5VUyA9IHInLScKK3RfTlVNQkVSID0gcidcZCsnCisKK2RlZiB0X2Vycm9yKHQscyk6CisgICAgcGFzcworCisKKworbGV4LmxleCgpCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvbGV4X2hlZGl0LnB5IGIvcGx5L3Rlc3QvbGV4X2hlZGl0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZjE1YTEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC9sZXhfaGVkaXQucHkKQEAgLTAsMCArMSw0NyBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBoZWRpdC5weQorIworIyBQYXJpbmcgb2YgRm9ydHJhbiBIIEVkaXQgZGVzY3JpcHRpb25zIChDb250cmlidXRlZCBieSBQZWFydSBQZXRlcnNvbikKKyMKKyMgVGhlc2UgdG9rZW5zIGNhbid0IGJlIGVhc2lseSB0b2tlbml6ZWQgYmVjYXVzZSB0aGV5IGFyZSBvZiB0aGUgZm9sbG93aW5nCisjIGZvcm06CisjCisjICAgbkhjMS4uLmNuCisjCisjIHdoZXJlIG4gaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyIGFuZCBjMSAuLi4gY24gYXJlIGNoYXJhY3RlcnMuCisjCisjIFRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gbW9kaWZ5IHRoZSBzdGF0ZSBvZiB0aGUgbGV4ZXIgdG8gcGFyc2UKKyMgc3VjaCB0b2tlbnMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ltcG9ydCBzeXMKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQorCitpbXBvcnQgcGx5LmxleCBhcyBsZXgKKwordG9rZW5zID0gKAorICAgICdIX0VESVRfREVTQ1JJUFRPUicsCisgICAgKQorCisjIFRva2VucwordF9pZ25vcmUgPSAiIFx0XG4iCisKK2RlZiB0X0hfRURJVF9ERVNDUklQVE9SKHQpOgorICAgIHIiXGQrSC4qIiAgICAgICAgICAgICAgICAgICAgICMgVGhpcyBncmFicyBhbGwgb2YgdGhlIHJlbWFpbmluZyB0ZXh0CisgICAgaSA9IHQudmFsdWUuaW5kZXgoJ0gnKQorICAgIG4gPSBldmFsKHQudmFsdWVbOmldKQorICAgIAorICAgICMgQWRqdXN0IHRoZSB0b2tlbml6aW5nIHBvc2l0aW9uCisgICAgdC5sZXhlci5sZXhwb3MgLT0gbGVuKHQudmFsdWUpIC0gKGkrMStuKQorICAgIHQudmFsdWUgPSB0LnZhbHVlW2krMTppKzErbl0KKyAgICByZXR1cm4gdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAKK2RlZiB0X2Vycm9yKHQpOgorICAgIHByaW50KCJJbGxlZ2FsIGNoYXJhY3RlciAnJXMnIiAlIHQudmFsdWVbMF0pCisgICAgdC5sZXhlci5za2lwKDEpCisgICAgCisjIEJ1aWxkIHRoZSBsZXhlcgorbGV4LmxleCgpCitsZXgucnVubWFpbihkYXRhPSIzSGFiYyAxMEhhYmNkZWZnaGlqIDJIeHkiKQorCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvbGV4X2lnbm9yZS5weSBiL3BseS90ZXN0L2xleF9pZ25vcmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM0M2I0YwotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L2xleF9pZ25vcmUucHkKQEAgLTAsMCArMSwzMSBAQAorIyBsZXhfaWdub3JlLnB5CisjCisjIEltcHJvcGVybHkgc3BlY2lmaWMgaWdub3JlIGRlY2xhcmF0aW9uCisKK2ltcG9ydCBzeXMKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQorCitpbXBvcnQgcGx5LmxleCBhcyBsZXgKKwordG9rZW5zID0gWworICAgICJQTFVTIiwKKyAgICAiTUlOVVMiLAorICAgICJOVU1CRVIiLAorICAgIF0KKwordF9QTFVTID0gcidcKycKK3RfTUlOVVMgPSByJy0nCit0X05VTUJFUiA9IHInXGQrJworCitkZWYgdF9pZ25vcmUodCk6CisgICAgJyBcdCcKKyAgICBwYXNzCisKK2RlZiB0X2Vycm9yKHQpOgorICAgIHBhc3MKKworaW1wb3J0IHN5cworCitsZXgubGV4KCkKKworCmRpZmYgLS1naXQgYS9wbHkvdGVzdC9sZXhfaWdub3JlMi5weSBiL3BseS90ZXN0L2xleF9pZ25vcmUyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MDk4N2EKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC9sZXhfaWdub3JlMi5weQpAQCAtMCwwICsxLDI5IEBACisjIGxleF9pZ25vcmUyLnB5CisjCisjIGlnbm9yZSBkZWNsYXJhdGlvbiBhcyBhIHJhdyBzdHJpbmcKKworaW1wb3J0IHN5cworaWYgIi4uIiBub3QgaW4gc3lzLnBhdGg6IHN5cy5wYXRoLmluc2VydCgwLCIuLiIpCisKK2ltcG9ydCBwbHkubGV4IGFzIGxleAorCit0b2tlbnMgPSBbCisgICAgIlBMVVMiLAorICAgICJNSU5VUyIsCisgICAgIk5VTUJFUiIsCisgICAgXQorCit0X1BMVVMgPSByJ1wrJwordF9NSU5VUyA9IHInLScKK3RfTlVNQkVSID0gcidcZCsnCisKK3RfaWdub3JlID0gcicgXHQnCisKK2RlZiB0X2Vycm9yKHQpOgorICAgIHBhc3MKKworCisKK2xleC5sZXgoKQorCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L2xleF9saXRlcmFsMS5weSBiL3BseS90ZXN0L2xleF9saXRlcmFsMS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjM4OWMzCi0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QvbGV4X2xpdGVyYWwxLnB5CkBAIC0wLDAgKzEsMjUgQEAKKyMgbGV4X2xpdGVyYWwxLnB5CisjCisjIEJhZCBsaXRlcmFsIHNwZWNpZmljYXRpb24KKworaW1wb3J0IHN5cworaWYgIi4uIiBub3QgaW4gc3lzLnBhdGg6IHN5cy5wYXRoLmluc2VydCgwLCIuLiIpCisKK2ltcG9ydCBwbHkubGV4IGFzIGxleAorCit0b2tlbnMgPSBbCisgICAgIk5VTUJFUiIsCisgICAgXQorCitsaXRlcmFscyA9IFsiKyIsIi0iLCIqKiJdCisKK2RlZiB0X05VTUJFUih0KToKKyAgICByJ1xkKycKKyAgICByZXR1cm4gdAorCitkZWYgdF9lcnJvcih0KToKKyAgICBwYXNzCisKK2xleC5sZXgoKQorCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L2xleF9saXRlcmFsMi5weSBiL3BseS90ZXN0L2xleF9saXRlcmFsMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTBiOTJjCi0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QvbGV4X2xpdGVyYWwyLnB5CkBAIC0wLDAgKzEsMjUgQEAKKyMgbGV4X2xpdGVyYWwyLnB5CisjCisjIEJhZCBsaXRlcmFsIHNwZWNpZmljYXRpb24KKworaW1wb3J0IHN5cworaWYgIi4uIiBub3QgaW4gc3lzLnBhdGg6IHN5cy5wYXRoLmluc2VydCgwLCIuLiIpCisKK2ltcG9ydCBwbHkubGV4IGFzIGxleAorCit0b2tlbnMgPSBbCisgICAgIk5VTUJFUiIsCisgICAgXQorCitsaXRlcmFscyA9IDIzCisKK2RlZiB0X05VTUJFUih0KToKKyAgICByJ1xkKycKKyAgICByZXR1cm4gdAorCitkZWYgdF9lcnJvcih0KToKKyAgICBwYXNzCisKK2xleC5sZXgoKQorCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L2xleF9saXRlcmFsMy5weSBiL3BseS90ZXN0L2xleF9saXRlcmFsMy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWFiOTgwCi0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QvbGV4X2xpdGVyYWwzLnB5CkBAIC0wLDAgKzEsMjYgQEAKKyMgbGV4X2xpdGVyYWwzLnB5CisjCisjIEFuIGVtcHR5IGxpdGVyYWwgc3BlY2lmaWNhdGlvbiBnaXZlbiBhcyBhIGxpc3QKKyMgSXNzdWUgOCA6IExpdGVyYWxzIGVtcHR5IGxpc3QgY2F1c2VzIEluZGV4RXJyb3IKKworaW1wb3J0IHN5cworaWYgIi4uIiBub3QgaW4gc3lzLnBhdGg6IHN5cy5wYXRoLmluc2VydCgwLCIuLiIpCisKK2ltcG9ydCBwbHkubGV4IGFzIGxleAorCit0b2tlbnMgPSBbCisgICAgIk5VTUJFUiIsCisgICAgXQorCitsaXRlcmFscyA9IFtdCisKK2RlZiB0X05VTUJFUih0KToKKyAgICByJ1xkKycKKyAgICByZXR1cm4gdAorCitkZWYgdF9lcnJvcih0KToKKyAgICBwYXNzCisKK2xleC5sZXgoKQorCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L2xleF9tYW55X3Rva2Vucy5weSBiL3BseS90ZXN0L2xleF9tYW55X3Rva2Vucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2FlMTJiCi0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QvbGV4X21hbnlfdG9rZW5zLnB5CkBAIC0wLDAgKzEsMjcgQEAKKyMgbGV4X21hbnlfdG9rZW5zLnB5CisjCisjIFRlc3QgbGV4J3MgYWJpbGl0eSB0byBoYW5kbGUgYSBsYXJnZSBudW1iZXIgb2YgdG9rZW5zIChiZXlvbmQgdGhlCisjIDEwMC1ncm91cCBsaW1pdCBvZiB0aGUgcmUgbW9kdWxlKQorCitpbXBvcnQgc3lzCitpZiAiLi4iIG5vdCBpbiBzeXMucGF0aDogc3lzLnBhdGguaW5zZXJ0KDAsIi4uIikKKworaW1wb3J0IHBseS5sZXggYXMgbGV4CisKK3Rva2VucyA9IFsiVE9LJWQiICUgaSBmb3IgaSBpbiByYW5nZSgxMDAwKV0KKworZm9yIHRvayBpbiB0b2tlbnM6CisgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDM6CisgICAgICAgIGV4ZWMoInRfJXMgPSAnJXM6JyIgJSAodG9rLHRvaykpCisgICAgZWxzZToKKyAgICAgICAgZXhlYygidF8lcyA9ICclczonIiAlICh0b2ssdG9rKSwgZ2xvYmFscygpKQorCit0X2lnbm9yZSA9ICIgXHQiCisKK2RlZiB0X2Vycm9yKHQpOgorICAgIHBhc3MKKworbGV4LmxleChvcHRpbWl6ZT0xLGxleHRhYj0ibWFueXRhYiIpCitsZXgucnVubWFpbihkYXRhPSJUT0szNDogVE9LMTQzOiBUT0syNjk6IFRPSzM3MjogVE9LNDUyOiBUT0s1NjE6IFRPSzk5OToiKQorCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L2xleF9tb2R1bGUucHkgYi9wbHkvdGVzdC9sZXhfbW9kdWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZGQzZWQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC9sZXhfbW9kdWxlLnB5CkBAIC0wLDAgKzEsMTAgQEAKKyMgbGV4X21vZHVsZS5weQorIworCitpbXBvcnQgc3lzCitpZiAiLi4iIG5vdCBpbiBzeXMucGF0aDogc3lzLnBhdGguaW5zZXJ0KDAsIi4uIikKKworaW1wb3J0IHBseS5sZXggYXMgbGV4CitpbXBvcnQgbGV4X21vZHVsZV9pbXBvcnQKK2xleC5sZXgobW9kdWxlPWxleF9tb2R1bGVfaW1wb3J0KQorbGV4LnJ1bm1haW4oZGF0YT0iMys0IikKZGlmZiAtLWdpdCBhL3BseS90ZXN0L2xleF9tb2R1bGVfaW1wb3J0LnB5IGIvcGx5L3Rlc3QvbGV4X21vZHVsZV9pbXBvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0MjA4MgotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L2xleF9tb2R1bGVfaW1wb3J0LnB5CkBAIC0wLDAgKzEsNDIgQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgbGV4X21vZHVsZV9pbXBvcnQucHkKKyMKKyMgQSBsZXhlciBkZWZpbmVkIGluIGEgbW9kdWxlLCBidXQgYnVpbHQgaW4gbGV4X21vZHVsZS5weQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0b2tlbnMgPSAoCisgICAgJ05BTUUnLCdOVU1CRVInLAorICAgICdQTFVTJywnTUlOVVMnLCdUSU1FUycsJ0RJVklERScsJ0VRVUFMUycsCisgICAgJ0xQQVJFTicsJ1JQQVJFTicsCisgICAgKQorCisjIFRva2VucworCit0X1BMVVMgICAgPSByJ1wrJwordF9NSU5VUyAgID0gcictJwordF9USU1FUyAgID0gcidcKicKK3RfRElWSURFICA9IHInLycKK3RfRVFVQUxTICA9IHInPScKK3RfTFBBUkVOICA9IHInXCgnCit0X1JQQVJFTiAgPSByJ1wpJwordF9OQU1FICAgID0gcidbYS16QS1aX11bYS16QS1aMC05X10qJworCitkZWYgdF9OVU1CRVIodCk6CisgICAgcidcZCsnCisgICAgdHJ5OgorICAgICAgICB0LnZhbHVlID0gaW50KHQudmFsdWUpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHByaW50KCJJbnRlZ2VyIHZhbHVlIHRvbyBsYXJnZSAlcyIgJSB0LnZhbHVlKQorICAgICAgICB0LnZhbHVlID0gMAorICAgIHJldHVybiB0CisKK3RfaWdub3JlID0gIiBcdCIKKworZGVmIHRfbmV3bGluZSh0KToKKyAgICByJ1xuKycKKyAgICB0LmxpbmVubyArPSB0LnZhbHVlLmNvdW50KCJcbiIpCisgICAgCitkZWYgdF9lcnJvcih0KToKKyAgICBwcmludCgiSWxsZWdhbCBjaGFyYWN0ZXIgJyVzJyIgJSB0LnZhbHVlWzBdKQorICAgIHQubGV4ZXIuc2tpcCgxKQorICAgIApkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvbGV4X29iamVjdC5weSBiL3BseS90ZXN0L2xleF9vYmplY3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U5ZjM4OQotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L2xleF9vYmplY3QucHkKQEAgLTAsMCArMSw1NSBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBsZXhfb2JqZWN0LnB5CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbXBvcnQgc3lzCisKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQoraW1wb3J0IHBseS5sZXggYXMgbGV4CisKK2NsYXNzIENhbGNMZXhlcjoKKyAgICB0b2tlbnMgPSAoCisgICAgICAgICdOQU1FJywnTlVNQkVSJywKKyAgICAgICAgJ1BMVVMnLCdNSU5VUycsJ1RJTUVTJywnRElWSURFJywnRVFVQUxTJywKKyAgICAgICAgJ0xQQVJFTicsJ1JQQVJFTicsCisgICAgICAgICkKKworICAgICMgVG9rZW5zCisKKyAgICB0X1BMVVMgICAgPSByJ1wrJworICAgIHRfTUlOVVMgICA9IHInLScKKyAgICB0X1RJTUVTICAgPSByJ1wqJworICAgIHRfRElWSURFICA9IHInLycKKyAgICB0X0VRVUFMUyAgPSByJz0nCisgICAgdF9MUEFSRU4gID0gcidcKCcKKyAgICB0X1JQQVJFTiAgPSByJ1wpJworICAgIHRfTkFNRSAgICA9IHInW2EtekEtWl9dW2EtekEtWjAtOV9dKicKKworICAgIGRlZiB0X05VTUJFUihzZWxmLHQpOgorICAgICAgICByJ1xkKycKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdC52YWx1ZSA9IGludCh0LnZhbHVlKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHByaW50KCJJbnRlZ2VyIHZhbHVlIHRvbyBsYXJnZSAlcyIgJSB0LnZhbHVlKQorICAgICAgICAgICAgdC52YWx1ZSA9IDAKKyAgICAgICAgcmV0dXJuIHQKKworICAgIHRfaWdub3JlID0gIiBcdCIKKworICAgIGRlZiB0X25ld2xpbmUoc2VsZix0KToKKyAgICAgICAgcidcbisnCisgICAgICAgIHQubGluZW5vICs9IHQudmFsdWUuY291bnQoIlxuIikKKyAgICAgICAgCisgICAgZGVmIHRfZXJyb3Ioc2VsZix0KToKKyAgICAgICAgcHJpbnQoIklsbGVnYWwgY2hhcmFjdGVyICclcyciICUgdC52YWx1ZVswXSkKKyAgICAgICAgdC5sZXhlci5za2lwKDEpCisgICAgICAgIAorCitjYWxjID0gQ2FsY0xleGVyKCkKKworIyBCdWlsZCB0aGUgbGV4ZXIKK2xleC5sZXgob2JqZWN0PWNhbGMpCitsZXgucnVubWFpbihkYXRhPSIzKzQiKQorCisKKworCmRpZmYgLS1naXQgYS9wbHkvdGVzdC9sZXhfb3B0X2FsaWFzLnB5IGIvcGx5L3Rlc3QvbGV4X29wdF9hbGlhcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDVlZDRjCi0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QvbGV4X29wdF9hbGlhcy5weQpAQCAtMCwwICsxLDU0IEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGxleF9vcHRfYWxpYXMucHkKKyMKKyMgVGVzdHMgYWJpbGl0eSB0byBtYXRjaCB1cCBmdW5jdGlvbnMgd2l0aCBzdGF0ZXMsIGFsaWFzZXMsIGFuZAorIyBsZXhpbmcgdGFibGVzLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbXBvcnQgc3lzCitpZiAiLi4iIG5vdCBpbiBzeXMucGF0aDogc3lzLnBhdGguaW5zZXJ0KDAsIi4uIikKKwordG9rZW5zID0gKAorICAgICdOQU1FJywnTlVNQkVSJywKKyAgICApCisKK3N0YXRlcyA9ICgoJ2luc3RkZWYnLCdpbmNsdXNpdmUnKSwoJ3NwYW0nLCdleGNsdXNpdmUnKSkKKworbGl0ZXJhbHMgPSBbJz0nLCcrJywnLScsJyonLCcvJywgJygnLCcpJ10KKworIyBUb2tlbnMKKworZGVmIHRfaW5zdGRlZl9zcGFtX0JJVFModCk6CisgICAgcidbMDEtXSsnCisgICAgcmV0dXJuIHQKKwordF9OQU1FICAgID0gcidbYS16QS1aX11bYS16QS1aMC05X10qJworCitkZWYgTlVNQkVSKHQpOgorICAgIHInXGQrJworICAgIHRyeToKKyAgICAgICAgdC52YWx1ZSA9IGludCh0LnZhbHVlKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICBwcmludCgiSW50ZWdlciB2YWx1ZSB0b28gbGFyZ2UgJXMiICUgdC52YWx1ZSkKKyAgICAgICAgdC52YWx1ZSA9IDAKKyAgICByZXR1cm4gdAorCit0X0FOWV9OVU1CRVIgPSBOVU1CRVIKKwordF9pZ25vcmUgPSAiIFx0IgordF9zcGFtX2lnbm9yZSA9IHRfaWdub3JlCisKK2RlZiB0X25ld2xpbmUodCk6CisgICAgcidcbisnCisgICAgdC5sZXhlci5saW5lbm8gKz0gdC52YWx1ZS5jb3VudCgiXG4iKQorICAgIAorZGVmIHRfZXJyb3IodCk6CisgICAgcHJpbnQoIklsbGVnYWwgY2hhcmFjdGVyICclcyciICUgdC52YWx1ZVswXSkKKyAgICB0LmxleGVyLnNraXAoMSkKKwordF9zcGFtX2Vycm9yID0gdF9lcnJvcgorCisjIEJ1aWxkIHRoZSBsZXhlcgoraW1wb3J0IHBseS5sZXggYXMgbGV4CitsZXgubGV4KG9wdGltaXplPTEsbGV4dGFiPSJhbGlhc3RhYiIpCitsZXgucnVubWFpbihkYXRhPSIzKzQiKQpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvbGV4X29wdGltaXplLnB5IGIvcGx5L3Rlc3QvbGV4X29wdGltaXplLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNDQ3ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC9sZXhfb3B0aW1pemUucHkKQEAgLTAsMCArMSw1MCBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBsZXhfb3B0aW1pemUucHkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ltcG9ydCBzeXMKKworaWYgIi4uIiBub3QgaW4gc3lzLnBhdGg6IHN5cy5wYXRoLmluc2VydCgwLCIuLiIpCitpbXBvcnQgcGx5LmxleCBhcyBsZXgKKwordG9rZW5zID0gKAorICAgICdOQU1FJywnTlVNQkVSJywKKyAgICAnUExVUycsJ01JTlVTJywnVElNRVMnLCdESVZJREUnLCdFUVVBTFMnLAorICAgICdMUEFSRU4nLCdSUEFSRU4nLAorICAgICkKKworIyBUb2tlbnMKKwordF9QTFVTICAgID0gcidcKycKK3RfTUlOVVMgICA9IHInLScKK3RfVElNRVMgICA9IHInXConCit0X0RJVklERSAgPSByJy8nCit0X0VRVUFMUyAgPSByJz0nCit0X0xQQVJFTiAgPSByJ1woJwordF9SUEFSRU4gID0gcidcKScKK3RfTkFNRSAgICA9IHInW2EtekEtWl9dW2EtekEtWjAtOV9dKicKKworZGVmIHRfTlVNQkVSKHQpOgorICAgIHInXGQrJworICAgIHRyeToKKyAgICAgICAgdC52YWx1ZSA9IGludCh0LnZhbHVlKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICBwcmludCgiSW50ZWdlciB2YWx1ZSB0b28gbGFyZ2UgJXMiICUgdC52YWx1ZSkKKyAgICAgICAgdC52YWx1ZSA9IDAKKyAgICByZXR1cm4gdAorCit0X2lnbm9yZSA9ICIgXHQiCisKK2RlZiB0X25ld2xpbmUodCk6CisgICAgcidcbisnCisgICAgdC5saW5lbm8gKz0gdC52YWx1ZS5jb3VudCgiXG4iKQorICAgIAorZGVmIHRfZXJyb3IodCk6CisgICAgcHJpbnQoIklsbGVnYWwgY2hhcmFjdGVyICclcyciICUgdC52YWx1ZVswXSkKKyAgICB0LmxleGVyLnNraXAoMSkKKyAgICAKKyMgQnVpbGQgdGhlIGxleGVyCitsZXgubGV4KG9wdGltaXplPTEpCitsZXgucnVubWFpbihkYXRhPSIzKzQiKQorCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvbGV4X29wdGltaXplMi5weSBiL3BseS90ZXN0L2xleF9vcHRpbWl6ZTIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ1NTVmNgotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L2xleF9vcHRpbWl6ZTIucHkKQEAgLTAsMCArMSw1MCBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBsZXhfb3B0aW1pemUyLnB5CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbXBvcnQgc3lzCisKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQoraW1wb3J0IHBseS5sZXggYXMgbGV4CisKK3Rva2VucyA9ICgKKyAgICAnTkFNRScsJ05VTUJFUicsCisgICAgJ1BMVVMnLCdNSU5VUycsJ1RJTUVTJywnRElWSURFJywnRVFVQUxTJywKKyAgICAnTFBBUkVOJywnUlBBUkVOJywKKyAgICApCisKKyMgVG9rZW5zCisKK3RfUExVUyAgICA9IHInXCsnCit0X01JTlVTICAgPSByJy0nCit0X1RJTUVTICAgPSByJ1wqJwordF9ESVZJREUgID0gcicvJwordF9FUVVBTFMgID0gcic9JwordF9MUEFSRU4gID0gcidcKCcKK3RfUlBBUkVOICA9IHInXCknCit0X05BTUUgICAgPSByJ1thLXpBLVpfXVthLXpBLVowLTlfXSonCisKK2RlZiB0X05VTUJFUih0KToKKyAgICByJ1xkKycKKyAgICB0cnk6CisgICAgICAgIHQudmFsdWUgPSBpbnQodC52YWx1ZSkKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgcHJpbnQoIkludGVnZXIgdmFsdWUgdG9vIGxhcmdlICVzIiAlIHQudmFsdWUpCisgICAgICAgIHQudmFsdWUgPSAwCisgICAgcmV0dXJuIHQKKwordF9pZ25vcmUgPSAiIFx0IgorCitkZWYgdF9uZXdsaW5lKHQpOgorICAgIHInXG4rJworICAgIHQubGluZW5vICs9IHQudmFsdWUuY291bnQoIlxuIikKKyAgICAKK2RlZiB0X2Vycm9yKHQpOgorICAgIHByaW50KCJJbGxlZ2FsIGNoYXJhY3RlciAnJXMnIiAlIHQudmFsdWVbMF0pCisgICAgdC5sZXhlci5za2lwKDEpCisgICAgCisjIEJ1aWxkIHRoZSBsZXhlcgorbGV4LmxleChvcHRpbWl6ZT0xLGxleHRhYj0ib3B0MnRhYiIpCitsZXgucnVubWFpbihkYXRhPSIzKzQiKQorCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvbGV4X29wdGltaXplMy5weSBiL3BseS90ZXN0L2xleF9vcHRpbWl6ZTMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhkZjVhYQotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L2xleF9vcHRpbWl6ZTMucHkKQEAgLTAsMCArMSw1MiBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBsZXhfb3B0aW1pemUzLnB5CisjCisjIFdyaXRlcyB0YWJsZSBpbiBhIHN1YmRpcmVjdG9yeSBzdHJ1Y3R1cmUuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbXBvcnQgc3lzCisKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQoraW1wb3J0IHBseS5sZXggYXMgbGV4CisKK3Rva2VucyA9ICgKKyAgICAnTkFNRScsJ05VTUJFUicsCisgICAgJ1BMVVMnLCdNSU5VUycsJ1RJTUVTJywnRElWSURFJywnRVFVQUxTJywKKyAgICAnTFBBUkVOJywnUlBBUkVOJywKKyAgICApCisKKyMgVG9rZW5zCisKK3RfUExVUyAgICA9IHInXCsnCit0X01JTlVTICAgPSByJy0nCit0X1RJTUVTICAgPSByJ1wqJwordF9ESVZJREUgID0gcicvJwordF9FUVVBTFMgID0gcic9JwordF9MUEFSRU4gID0gcidcKCcKK3RfUlBBUkVOICA9IHInXCknCit0X05BTUUgICAgPSByJ1thLXpBLVpfXVthLXpBLVowLTlfXSonCisKK2RlZiB0X05VTUJFUih0KToKKyAgICByJ1xkKycKKyAgICB0cnk6CisgICAgICAgIHQudmFsdWUgPSBpbnQodC52YWx1ZSkKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgcHJpbnQoIkludGVnZXIgdmFsdWUgdG9vIGxhcmdlICVzIiAlIHQudmFsdWUpCisgICAgICAgIHQudmFsdWUgPSAwCisgICAgcmV0dXJuIHQKKwordF9pZ25vcmUgPSAiIFx0IgorCitkZWYgdF9uZXdsaW5lKHQpOgorICAgIHInXG4rJworICAgIHQubGluZW5vICs9IHQudmFsdWUuY291bnQoIlxuIikKKyAgICAKK2RlZiB0X2Vycm9yKHQpOgorICAgIHByaW50KCJJbGxlZ2FsIGNoYXJhY3RlciAnJXMnIiAlIHQudmFsdWVbMF0pCisgICAgdC5sZXhlci5za2lwKDEpCisgICAgCisjIEJ1aWxkIHRoZSBsZXhlcgorbGV4LmxleChvcHRpbWl6ZT0xLGxleHRhYj0ibGV4ZGlyLnN1Yi5jYWxjdGFiIiAsb3V0cHV0ZGlyPSJsZXhkaXIvc3ViIikKK2xleC5ydW5tYWluKGRhdGE9IjMrNCIpCisKKworCmRpZmYgLS1naXQgYS9wbHkvdGVzdC9sZXhfcmUxLnB5IGIvcGx5L3Rlc3QvbGV4X3JlMS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmU3YWVmCi0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QvbGV4X3JlMS5weQpAQCAtMCwwICsxLDI3IEBACisjIGxleF9yZTEucHkKKyMKKyMgQmFkIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbiBhIHN0cmluZworCitpbXBvcnQgc3lzCitpZiAiLi4iIG5vdCBpbiBzeXMucGF0aDogc3lzLnBhdGguaW5zZXJ0KDAsIi4uIikKKworaW1wb3J0IHBseS5sZXggYXMgbGV4CisKK3Rva2VucyA9IFsKKyAgICAiUExVUyIsCisgICAgIk1JTlVTIiwKKyAgICAiTlVNQkVSIiwKKyAgICBdCisKK3RfUExVUyA9IHInXCsnCit0X01JTlVTID0gcictJwordF9OVU1CRVIgPSByJyhcZCsnCisKK2RlZiB0X2Vycm9yKHQpOgorICAgIHBhc3MKKworCisKK2xleC5sZXgoKQorCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L2xleF9yZTIucHkgYi9wbHkvdGVzdC9sZXhfcmUyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZmI4ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC9sZXhfcmUyLnB5CkBAIC0wLDAgKzEsMjcgQEAKKyMgbGV4X3JlMi5weQorIworIyBSZWd1bGFyIGV4cHJlc3Npb24gcnVsZSBtYXRjaGVzIGVtcHR5IHN0cmluZworCitpbXBvcnQgc3lzCitpZiAiLi4iIG5vdCBpbiBzeXMucGF0aDogc3lzLnBhdGguaW5zZXJ0KDAsIi4uIikKKworaW1wb3J0IHBseS5sZXggYXMgbGV4CisKK3Rva2VucyA9IFsKKyAgICAiUExVUyIsCisgICAgIk1JTlVTIiwKKyAgICAiTlVNQkVSIiwKKyAgICBdCisKK3RfUExVUyA9IHInXCs/JwordF9NSU5VUyA9IHInLScKK3RfTlVNQkVSID0gcicoXGQrKScKKworZGVmIHRfZXJyb3IodCk6CisgICAgcGFzcworCisKKworbGV4LmxleCgpCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvbGV4X3JlMy5weSBiL3BseS90ZXN0L2xleF9yZTMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE3OTkyNQotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L2xleF9yZTMucHkKQEAgLTAsMCArMSwyOSBAQAorIyBsZXhfcmUzLnB5CisjCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiBydWxlIG1hdGNoZXMgZW1wdHkgc3RyaW5nCisKK2ltcG9ydCBzeXMKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQorCitpbXBvcnQgcGx5LmxleCBhcyBsZXgKKwordG9rZW5zID0gWworICAgICJQTFVTIiwKKyAgICAiTUlOVVMiLAorICAgICJOVU1CRVIiLAorICAgICJQT1VORCIsCisgICAgXQorCit0X1BMVVMgPSByJ1wrJwordF9NSU5VUyA9IHInLScKK3RfTlVNQkVSID0gcicoXGQrKScKK3RfUE9VTkQgPSByJyMnCisKK2RlZiB0X2Vycm9yKHQpOgorICAgIHBhc3MKKworCisKK2xleC5sZXgoKQorCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L2xleF9ydWxlMS5weSBiL3BseS90ZXN0L2xleF9ydWxlMS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDA2YzZmCi0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QvbGV4X3J1bGUxLnB5CkBAIC0wLDAgKzEsMjcgQEAKKyMgbGV4X3J1bGUxLnB5CisjCisjIFJ1bGUgZnVuY3Rpb24gd2l0aCBpbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cworCitpbXBvcnQgc3lzCitpZiAiLi4iIG5vdCBpbiBzeXMucGF0aDogc3lzLnBhdGguaW5zZXJ0KDAsIi4uIikKKworaW1wb3J0IHBseS5sZXggYXMgbGV4CisKK3Rva2VucyA9IFsKKyAgICAiUExVUyIsCisgICAgIk1JTlVTIiwKKyAgICAiTlVNQkVSIiwKKyAgICBdCisKK3RfUExVUyA9IHInXCsnCit0X01JTlVTID0gcictJwordF9OVU1CRVIgPSAxCisKK2RlZiB0X2Vycm9yKHQpOgorICAgIHBhc3MKKworCisKK2xleC5sZXgoKQorCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L2xleF9ydWxlMi5weSBiL3BseS90ZXN0L2xleF9ydWxlMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzI5ZDg3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QvbGV4X3J1bGUyLnB5CkBAIC0wLDAgKzEsMjkgQEAKKyMgbGV4X3J1bGUyLnB5CisjCisjIFJ1bGUgZnVuY3Rpb24gd2l0aCBpbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cworCitpbXBvcnQgc3lzCitpZiAiLi4iIG5vdCBpbiBzeXMucGF0aDogc3lzLnBhdGguaW5zZXJ0KDAsIi4uIikKKworaW1wb3J0IHBseS5sZXggYXMgbGV4CisKK3Rva2VucyA9IFsKKyAgICAiUExVUyIsCisgICAgIk1JTlVTIiwKKyAgICAiTlVNQkVSIiwKKyAgICBdCisKK3RfUExVUyA9IHInXCsnCit0X01JTlVTID0gcictJworZGVmIHRfTlVNQkVSKCk6CisgICAgcidcZCsnCisgICAgcmV0dXJuIHQKKworZGVmIHRfZXJyb3IodCk6CisgICAgcGFzcworCisKKworbGV4LmxleCgpCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvbGV4X3J1bGUzLnB5IGIvcGx5L3Rlc3QvbGV4X3J1bGUzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYTk0ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC9sZXhfcnVsZTMucHkKQEAgLTAsMCArMSwyNyBAQAorIyBsZXhfcnVsZTMucHkKKyMKKyMgUnVsZSBmdW5jdGlvbiB3aXRoIGluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzCisKK2ltcG9ydCBzeXMKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQorCitpbXBvcnQgcGx5LmxleCBhcyBsZXgKKwordG9rZW5zID0gWworICAgICJQTFVTIiwKKyAgICAiTUlOVVMiLAorICAgICJOVU1CRVIiLAorICAgIF0KKwordF9QTFVTID0gcidcKycKK3RfTUlOVVMgPSByJy0nCitkZWYgdF9OVU1CRVIodCxzKToKKyAgICByJ1xkKycKKyAgICByZXR1cm4gdAorCitkZWYgdF9lcnJvcih0KToKKyAgICBwYXNzCisKK2xleC5sZXgoKQorCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L2xleF9zdGF0ZTEucHkgYi9wbHkvdGVzdC9sZXhfc3RhdGUxLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MjhjOTEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC9sZXhfc3RhdGUxLnB5CkBAIC0wLDAgKzEsNDAgQEAKKyMgbGV4X3N0YXRlMS5weQorIworIyBCYWQgc3RhdGUgZGVjbGFyYXRpb24KKworaW1wb3J0IHN5cworaWYgIi4uIiBub3QgaW4gc3lzLnBhdGg6IHN5cy5wYXRoLmluc2VydCgwLCIuLiIpCisKK2ltcG9ydCBwbHkubGV4IGFzIGxleAorCit0b2tlbnMgPSBbIAorICAgICJQTFVTIiwKKyAgICAiTUlOVVMiLAorICAgICJOVU1CRVIiLAorICAgIF0KKworc3RhdGVzID0gJ2NvbW1lbnQnCisKK3RfUExVUyA9IHInXCsnCit0X01JTlVTID0gcictJwordF9OVU1CRVIgPSByJ1xkKycKKworIyBDb21tZW50cworZGVmIHRfY29tbWVudCh0KToKKyAgICByJy9cKicKKyAgICB0LmxleGVyLmJlZ2luKCdjb21tZW50JykKKyAgICBwcmludCgiRW50ZXJpbmcgY29tbWVudCBzdGF0ZSIpCisKK2RlZiB0X2NvbW1lbnRfYm9keV9wYXJ0KHQpOgorICAgIHInKC58XG4pKlwqLycKKyAgICBwcmludCgiY29tbWVudCBib2R5ICVzIiAlIHQpCisgICAgdC5sZXhlci5iZWdpbignSU5JVElBTCcpCisKK2RlZiB0X2Vycm9yKHQpOgorICAgIHBhc3MKKworCisKK2xleC5sZXgoKQorCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L2xleF9zdGF0ZTIucHkgYi9wbHkvdGVzdC9sZXhfc3RhdGUyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZWY2OWUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC9sZXhfc3RhdGUyLnB5CkBAIC0wLDAgKzEsNDAgQEAKKyMgbGV4X3N0YXRlMi5weQorIworIyBCYWQgc3RhdGUgZGVjbGFyYXRpb24KKworaW1wb3J0IHN5cworaWYgIi4uIiBub3QgaW4gc3lzLnBhdGg6IHN5cy5wYXRoLmluc2VydCgwLCIuLiIpCisKK2ltcG9ydCBwbHkubGV4IGFzIGxleAorCit0b2tlbnMgPSBbIAorICAgICJQTFVTIiwKKyAgICAiTUlOVVMiLAorICAgICJOVU1CRVIiLAorICAgIF0KKworc3RhdGVzID0gKCdjb21tZW50JywnZXhhbXBsZScpCisKK3RfUExVUyA9IHInXCsnCit0X01JTlVTID0gcictJwordF9OVU1CRVIgPSByJ1xkKycKKworIyBDb21tZW50cworZGVmIHRfY29tbWVudCh0KToKKyAgICByJy9cKicKKyAgICB0LmxleGVyLmJlZ2luKCdjb21tZW50JykKKyAgICBwcmludCgiRW50ZXJpbmcgY29tbWVudCBzdGF0ZSIpCisKK2RlZiB0X2NvbW1lbnRfYm9keV9wYXJ0KHQpOgorICAgIHInKC58XG4pKlwqLycKKyAgICBwcmludCgiY29tbWVudCBib2R5ICVzIiAlIHQpCisgICAgdC5sZXhlci5iZWdpbignSU5JVElBTCcpCisKK2RlZiB0X2Vycm9yKHQpOgorICAgIHBhc3MKKworCisKK2xleC5sZXgoKQorCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L2xleF9zdGF0ZTMucHkgYi9wbHkvdGVzdC9sZXhfc3RhdGUzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNmU0ODQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC9sZXhfc3RhdGUzLnB5CkBAIC0wLDAgKzEsNDIgQEAKKyMgbGV4X3N0YXRlMy5weQorIworIyBCYWQgc3RhdGUgZGVjbGFyYXRpb24KKworaW1wb3J0IHN5cworaWYgIi4uIiBub3QgaW4gc3lzLnBhdGg6IHN5cy5wYXRoLmluc2VydCgwLCIuLiIpCisKK2ltcG9ydCBwbHkubGV4IGFzIGxleAorCit0b2tlbnMgPSBbIAorICAgICJQTFVTIiwKKyAgICAiTUlOVVMiLAorICAgICJOVU1CRVIiLAorICAgIF0KKworY29tbWVudCA9IDEKK3N0YXRlcyA9ICgoY29tbWVudCwgJ2luY2x1c2l2ZScpLAorICAgICAgICAgICgnZXhhbXBsZScsICdleGNsdXNpdmUnKSkKKwordF9QTFVTID0gcidcKycKK3RfTUlOVVMgPSByJy0nCit0X05VTUJFUiA9IHInXGQrJworCisjIENvbW1lbnRzCitkZWYgdF9jb21tZW50KHQpOgorICAgIHInL1wqJworICAgIHQubGV4ZXIuYmVnaW4oJ2NvbW1lbnQnKQorICAgIHByaW50KCJFbnRlcmluZyBjb21tZW50IHN0YXRlIikKKworZGVmIHRfY29tbWVudF9ib2R5X3BhcnQodCk6CisgICAgcicoLnxcbikqXCovJworICAgIHByaW50KCJjb21tZW50IGJvZHkgJXMiICUgdCkKKyAgICB0LmxleGVyLmJlZ2luKCdJTklUSUFMJykKKworZGVmIHRfZXJyb3IodCk6CisgICAgcGFzcworCisKKworbGV4LmxleCgpCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvbGV4X3N0YXRlNC5weSBiL3BseS90ZXN0L2xleF9zdGF0ZTQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgyNTAxNgotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L2xleF9zdGF0ZTQucHkKQEAgLTAsMCArMSw0MSBAQAorIyBsZXhfc3RhdGU0LnB5CisjCisjIEJhZCBzdGF0ZSBkZWNsYXJhdGlvbgorCitpbXBvcnQgc3lzCitpZiAiLi4iIG5vdCBpbiBzeXMucGF0aDogc3lzLnBhdGguaW5zZXJ0KDAsIi4uIikKKworaW1wb3J0IHBseS5sZXggYXMgbGV4CisKK3Rva2VucyA9IFsgCisgICAgIlBMVVMiLAorICAgICJNSU5VUyIsCisgICAgIk5VTUJFUiIsCisgICAgXQorCisKK3N0YXRlcyA9ICgoJ2NvbW1lbnQnLCAnZXhjbHNpdmUnKSwpCisKK3RfUExVUyA9IHInXCsnCit0X01JTlVTID0gcictJwordF9OVU1CRVIgPSByJ1xkKycKKworIyBDb21tZW50cworZGVmIHRfY29tbWVudCh0KToKKyAgICByJy9cKicKKyAgICB0LmxleGVyLmJlZ2luKCdjb21tZW50JykKKyAgICBwcmludCgiRW50ZXJpbmcgY29tbWVudCBzdGF0ZSIpCisKK2RlZiB0X2NvbW1lbnRfYm9keV9wYXJ0KHQpOgorICAgIHInKC58XG4pKlwqLycKKyAgICBwcmludCgiY29tbWVudCBib2R5ICVzIiAlIHQpCisgICAgdC5sZXhlci5iZWdpbignSU5JVElBTCcpCisKK2RlZiB0X2Vycm9yKHQpOgorICAgIHBhc3MKKworCisKK2xleC5sZXgoKQorCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L2xleF9zdGF0ZTUucHkgYi9wbHkvdGVzdC9sZXhfc3RhdGU1LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZTgyOGUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC9sZXhfc3RhdGU1LnB5CkBAIC0wLDAgKzEsNDAgQEAKKyMgbGV4X3N0YXRlNS5weQorIworIyBCYWQgc3RhdGUgZGVjbGFyYXRpb24KKworaW1wb3J0IHN5cworaWYgIi4uIiBub3QgaW4gc3lzLnBhdGg6IHN5cy5wYXRoLmluc2VydCgwLCIuLiIpCisKK2ltcG9ydCBwbHkubGV4IGFzIGxleAorCit0b2tlbnMgPSBbIAorICAgICJQTFVTIiwKKyAgICAiTUlOVVMiLAorICAgICJOVU1CRVIiLAorICAgIF0KKworc3RhdGVzID0gKCgnY29tbWVudCcsICdleGNsdXNpdmUnKSwKKyAgICAgICAgICAoJ2NvbW1lbnQnLCAnZXhjbHVzaXZlJykpCisKK3RfUExVUyA9IHInXCsnCit0X01JTlVTID0gcictJwordF9OVU1CRVIgPSByJ1xkKycKKworIyBDb21tZW50cworZGVmIHRfY29tbWVudCh0KToKKyAgICByJy9cKicKKyAgICB0LmxleGVyLmJlZ2luKCdjb21tZW50JykKKyAgICBwcmludCgiRW50ZXJpbmcgY29tbWVudCBzdGF0ZSIpCisKK2RlZiB0X2NvbW1lbnRfYm9keV9wYXJ0KHQpOgorICAgIHInKC58XG4pKlwqLycKKyAgICBwcmludCgiY29tbWVudCBib2R5ICVzIiAlIHQpCisgICAgdC5sZXhlci5iZWdpbignSU5JVElBTCcpCisKK2RlZiB0X2Vycm9yKHQpOgorICAgIHBhc3MKKworCitsZXgubGV4KCkKKworCmRpZmYgLS1naXQgYS9wbHkvdGVzdC9sZXhfc3RhdGVfbm9lcnJvci5weSBiL3BseS90ZXN0L2xleF9zdGF0ZV9ub2Vycm9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYmJlYTgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC9sZXhfc3RhdGVfbm9lcnJvci5weQpAQCAtMCwwICsxLDM5IEBACisjIGxleF9zdGF0ZV9ub2Vycm9yLnB5CisjCisjIERlY2xhcmF0aW9uIG9mIGEgc3RhdGUgZm9yIHdoaWNoIG5vIHJ1bGVzIGFyZSBkZWZpbmVkCisKK2ltcG9ydCBzeXMKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQorCitpbXBvcnQgcGx5LmxleCBhcyBsZXgKKwordG9rZW5zID0gWyAKKyAgICAiUExVUyIsCisgICAgIk1JTlVTIiwKKyAgICAiTlVNQkVSIiwKKyAgICBdCisKK3N0YXRlcyA9ICgoJ2NvbW1lbnQnLCAnZXhjbHVzaXZlJyksKQorCit0X1BMVVMgPSByJ1wrJwordF9NSU5VUyA9IHInLScKK3RfTlVNQkVSID0gcidcZCsnCisKKyMgQ29tbWVudHMKK2RlZiB0X2NvbW1lbnQodCk6CisgICAgcicvXConCisgICAgdC5sZXhlci5iZWdpbignY29tbWVudCcpCisgICAgcHJpbnQoIkVudGVyaW5nIGNvbW1lbnQgc3RhdGUiKQorCitkZWYgdF9jb21tZW50X2JvZHlfcGFydCh0KToKKyAgICByJygufFxuKSpcKi8nCisgICAgcHJpbnQoImNvbW1lbnQgYm9keSAlcyIgJSB0KQorICAgIHQubGV4ZXIuYmVnaW4oJ0lOSVRJQUwnKQorCitkZWYgdF9lcnJvcih0KToKKyAgICBwYXNzCisKKworbGV4LmxleCgpCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvbGV4X3N0YXRlX25vcnVsZS5weSBiL3BseS90ZXN0L2xleF9zdGF0ZV9ub3J1bGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRlYzZkMwotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L2xleF9zdGF0ZV9ub3J1bGUucHkKQEAgLTAsMCArMSw0MCBAQAorIyBsZXhfc3RhdGVfbm9ydWxlLnB5CisjCisjIERlY2xhcmF0aW9uIG9mIGEgc3RhdGUgZm9yIHdoaWNoIG5vIHJ1bGVzIGFyZSBkZWZpbmVkCisKK2ltcG9ydCBzeXMKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQorCitpbXBvcnQgcGx5LmxleCBhcyBsZXgKKwordG9rZW5zID0gWyAKKyAgICAiUExVUyIsCisgICAgIk1JTlVTIiwKKyAgICAiTlVNQkVSIiwKKyAgICBdCisKK3N0YXRlcyA9ICgoJ2NvbW1lbnQnLCAnZXhjbHVzaXZlJyksCisgICAgICAgICAgKCdleGFtcGxlJywgJ2V4Y2x1c2l2ZScpKQorCit0X1BMVVMgPSByJ1wrJwordF9NSU5VUyA9IHInLScKK3RfTlVNQkVSID0gcidcZCsnCisKKyMgQ29tbWVudHMKK2RlZiB0X2NvbW1lbnQodCk6CisgICAgcicvXConCisgICAgdC5sZXhlci5iZWdpbignY29tbWVudCcpCisgICAgcHJpbnQoIkVudGVyaW5nIGNvbW1lbnQgc3RhdGUiKQorCitkZWYgdF9jb21tZW50X2JvZHlfcGFydCh0KToKKyAgICByJygufFxuKSpcKi8nCisgICAgcHJpbnQoImNvbW1lbnQgYm9keSAlcyIgJSB0KQorICAgIHQubGV4ZXIuYmVnaW4oJ0lOSVRJQUwnKQorCitkZWYgdF9lcnJvcih0KToKKyAgICBwYXNzCisKKworbGV4LmxleCgpCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvbGV4X3N0YXRlX3RyeS5weSBiL3BseS90ZXN0L2xleF9zdGF0ZV90cnkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1YmEyMgotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L2xleF9zdGF0ZV90cnkucHkKQEAgLTAsMCArMSw0NSBAQAorIyBsZXhfc3RhdGVfdHJ5LnB5CisjCisjIERlY2xhcmF0aW9uIG9mIGEgc3RhdGUgZm9yIHdoaWNoIG5vIHJ1bGVzIGFyZSBkZWZpbmVkCisKK2ltcG9ydCBzeXMKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQorCitpbXBvcnQgcGx5LmxleCBhcyBsZXgKKwordG9rZW5zID0gWyAKKyAgICAiUExVUyIsCisgICAgIk1JTlVTIiwKKyAgICAiTlVNQkVSIiwKKyAgICBdCisKK3N0YXRlcyA9ICgoJ2NvbW1lbnQnLCAnZXhjbHVzaXZlJyksKQorCit0X1BMVVMgPSByJ1wrJwordF9NSU5VUyA9IHInLScKK3RfTlVNQkVSID0gcidcZCsnCisKK3RfaWdub3JlID0gIiBcdCIKKworIyBDb21tZW50cworZGVmIHRfY29tbWVudCh0KToKKyAgICByJy9cKicKKyAgICB0LmxleGVyLmJlZ2luKCdjb21tZW50JykKKyAgICBwcmludCgiRW50ZXJpbmcgY29tbWVudCBzdGF0ZSIpCisKK2RlZiB0X2NvbW1lbnRfYm9keV9wYXJ0KHQpOgorICAgIHInKC58XG4pKlwqLycKKyAgICBwcmludCgiY29tbWVudCBib2R5ICVzIiAlIHQpCisgICAgdC5sZXhlci5iZWdpbignSU5JVElBTCcpCisKK2RlZiB0X2Vycm9yKHQpOgorICAgIHBhc3MKKwordF9jb21tZW50X2Vycm9yID0gdF9lcnJvcgordF9jb21tZW50X2lnbm9yZSA9IHRfaWdub3JlCisKK2xleC5sZXgoKQorCitkYXRhID0gIjMgKyA0IC8qIFRoaXMgaXMgYSBjb21tZW50ICovICsgMTAiCisKK2xleC5ydW5tYWluKGRhdGE9ZGF0YSkKZGlmZiAtLWdpdCBhL3BseS90ZXN0L2xleF90b2tlbjEucHkgYi9wbHkvdGVzdC9sZXhfdG9rZW4xLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmY2EzMDAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC9sZXhfdG9rZW4xLnB5CkBAIC0wLDAgKzEsMTkgQEAKKyMgbGV4X3Rva2VuMS5weQorIworIyBUZXN0cyBmb3IgYWJzZW5jZSBvZiB0b2tlbnMgdmFyaWFibGUKKworaW1wb3J0IHN5cworaWYgIi4uIiBub3QgaW4gc3lzLnBhdGg6IHN5cy5wYXRoLmluc2VydCgwLCIuLiIpCisKK2ltcG9ydCBwbHkubGV4IGFzIGxleAorCit0X1BMVVMgPSByJ1wrJwordF9NSU5VUyA9IHInLScKK3RfTlVNQkVSID0gcidcZCsnCisKK2RlZiB0X2Vycm9yKHQpOgorICAgIHBhc3MKKworbGV4LmxleCgpCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvbGV4X3Rva2VuMi5weSBiL3BseS90ZXN0L2xleF90b2tlbjIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU2NWFiMAotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L2xleF90b2tlbjIucHkKQEAgLTAsMCArMSwyMiBAQAorIyBsZXhfdG9rZW4yLnB5CisjCisjIFRlc3RzIGZvciB0b2tlbnMgb2Ygd3JvbmcgdHlwZQorCitpbXBvcnQgc3lzCitpZiAiLi4iIG5vdCBpbiBzeXMucGF0aDogc3lzLnBhdGguaW5zZXJ0KDAsIi4uIikKKworaW1wb3J0IHBseS5sZXggYXMgbGV4CisKK3Rva2VucyA9ICJQTFVTIE1JTlVTIE5VTUJFUiIKKwordF9QTFVTID0gcidcKycKK3RfTUlOVVMgPSByJy0nCit0X05VTUJFUiA9IHInXGQrJworCitkZWYgdF9lcnJvcih0KToKKyAgICBwYXNzCisKKworbGV4LmxleCgpCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvbGV4X3Rva2VuMy5weSBiL3BseS90ZXN0L2xleF90b2tlbjMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM2NDUyZQotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L2xleF90b2tlbjMucHkKQEAgLTAsMCArMSwyNCBAQAorIyBsZXhfdG9rZW4zLnB5CisjCisjIHRva2VucyBpcyByaWdodCB0eXBlLCBidXQgaXMgbWlzc2luZyBhIHRva2VuIGZvciBvbmUgcnVsZQorCitpbXBvcnQgc3lzCitpZiAiLi4iIG5vdCBpbiBzeXMucGF0aDogc3lzLnBhdGguaW5zZXJ0KDAsIi4uIikKKworaW1wb3J0IHBseS5sZXggYXMgbGV4CisKK3Rva2VucyA9IFsKKyAgICAiUExVUyIsCisgICAgIk5VTUJFUiIsCisgICAgXQorCit0X1BMVVMgPSByJ1wrJwordF9NSU5VUyA9IHInLScKK3RfTlVNQkVSID0gcidcZCsnCisKK2RlZiB0X2Vycm9yKHQpOgorICAgIHBhc3MKKworbGV4LmxleCgpCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvbGV4X3Rva2VuNC5weSBiL3BseS90ZXN0L2xleF90b2tlbjQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI5NDdlOQotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L2xleF90b2tlbjQucHkKQEAgLTAsMCArMSwyNiBAQAorIyBsZXhfdG9rZW40LnB5CisjCisjIEJhZCB0b2tlbiBuYW1lCisKK2ltcG9ydCBzeXMKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQorCitpbXBvcnQgcGx5LmxleCBhcyBsZXgKKwordG9rZW5zID0gWworICAgICJQTFVTIiwKKyAgICAiTUlOVVMiLAorICAgICItIiwKKyAgICAiTlVNQkVSIiwKKyAgICBdCisKK3RfUExVUyA9IHInXCsnCit0X01JTlVTID0gcictJwordF9OVU1CRVIgPSByJ1xkKycKKworZGVmIHRfZXJyb3IodCk6CisgICAgcGFzcworCitsZXgubGV4KCkKKworCmRpZmYgLS1naXQgYS9wbHkvdGVzdC9sZXhfdG9rZW41LnB5IGIvcGx5L3Rlc3QvbGV4X3Rva2VuNS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjdhM2M1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QvbGV4X3Rva2VuNS5weQpAQCAtMCwwICsxLDMxIEBACisjIGxleF90b2tlbjUucHkKKyMKKyMgUmV0dXJuIGEgYmFkIHRva2VuIG5hbWUKKworaW1wb3J0IHN5cworaWYgIi4uIiBub3QgaW4gc3lzLnBhdGg6IHN5cy5wYXRoLmluc2VydCgwLCIuLiIpCisKK2ltcG9ydCBwbHkubGV4IGFzIGxleAorCit0b2tlbnMgPSBbCisgICAgIlBMVVMiLAorICAgICJNSU5VUyIsCisgICAgIk5VTUJFUiIsCisgICAgXQorCit0X1BMVVMgPSByJ1wrJwordF9NSU5VUyA9IHInLScKKworZGVmIHRfTlVNQkVSKHQpOgorICAgIHInXGQrJworICAgIHQudHlwZSA9ICJOVU0iCisgICAgcmV0dXJuIHQKKworZGVmIHRfZXJyb3IodCk6CisgICAgcGFzcworCitsZXgubGV4KCkKK2xleC5pbnB1dCgiMTIzNCIpCit0ID0gbGV4LnRva2VuKCkKKworCmRpZmYgLS1naXQgYS9wbHkvdGVzdC9sZXhfdG9rZW5fZHVwLnB5IGIvcGx5L3Rlc3QvbGV4X3Rva2VuX2R1cC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODRmNGU5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QvbGV4X3Rva2VuX2R1cC5weQpAQCAtMCwwICsxLDI5IEBACisjIGxleF90b2tlbl9kdXAucHkKKyMKKyMgRHVwbGljYXRlIHRva2VuIG5hbWUgaW4gdG9rZW5zCisKK2ltcG9ydCBzeXMKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQorCitpbXBvcnQgcGx5LmxleCBhcyBsZXgKKwordG9rZW5zID0gWworICAgICJQTFVTIiwKKyAgICAiTUlOVVMiLAorICAgICJOVU1CRVIiLAorICAgICJNSU5VUyIKKyAgICBdCisKK3RfUExVUyA9IHInXCsnCit0X01JTlVTID0gcictJworCitkZWYgdF9OVU1CRVIodCk6CisgICAgcidcZCsnCisgICAgcmV0dXJuIHQKKworZGVmIHRfZXJyb3IodCk6CisgICAgcGFzcworCitsZXgubGV4KCkKKworCmRpZmYgLS1naXQgYS9wbHkvdGVzdC9wa2dfdGVzdDEvX19pbml0X18ucHkgYi9wbHkvdGVzdC9wa2dfdGVzdDEvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUxOTU1OAotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L3BrZ190ZXN0MS9fX2luaXRfXy5weQpAQCAtMCwwICsxLDkgQEAKKyMgVGVzdHMgcHJvcGVyIGhhbmRsaW5nIG9mIGxleHRhYiBhbmQgcGFyc2V0YWIgZmlsZXMgaW4gcGFja2FnZSBzdHJ1Y3R1cmVzCisKKyMgSGVyZSBmb3IgdGVzdGluZyBwdXJwb3NlcworaW1wb3J0IHN5cworaWYgJy4uJyBub3QgaW4gc3lzLnBhdGg6ICAKKyAgICBzeXMucGF0aC5pbnNlcnQoMCwgJy4uJykKKworZnJvbSAucGFyc2luZy5jYWxjcGFyc2UgaW1wb3J0IHBhcnNlcgorCmRpZmYgLS1naXQgYS9wbHkvdGVzdC9wa2dfdGVzdDEvcGFyc2luZy9fX2luaXRfXy5weSBiL3BseS90ZXN0L3BrZ190ZXN0MS9wYXJzaW5nL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC9wa2dfdGVzdDEvcGFyc2luZy9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvcGtnX3Rlc3QxL3BhcnNpbmcvY2FsY2xleC5weSBiL3BseS90ZXN0L3BrZ190ZXN0MS9wYXJzaW5nL2NhbGNsZXgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNjMWE0ZAotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L3BrZ190ZXN0MS9wYXJzaW5nL2NhbGNsZXgucHkKQEAgLTAsMCArMSw0NyBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjYWxjbGV4LnB5CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ltcG9ydCBwbHkubGV4IGFzIGxleAorCit0b2tlbnMgPSAoCisgICAgJ05BTUUnLCdOVU1CRVInLAorICAgICdQTFVTJywnTUlOVVMnLCdUSU1FUycsJ0RJVklERScsJ0VRVUFMUycsCisgICAgJ0xQQVJFTicsJ1JQQVJFTicsCisgICAgKQorCisjIFRva2VucworCit0X1BMVVMgICAgPSByJ1wrJwordF9NSU5VUyAgID0gcictJwordF9USU1FUyAgID0gcidcKicKK3RfRElWSURFICA9IHInLycKK3RfRVFVQUxTICA9IHInPScKK3RfTFBBUkVOICA9IHInXCgnCit0X1JQQVJFTiAgPSByJ1wpJwordF9OQU1FICAgID0gcidbYS16QS1aX11bYS16QS1aMC05X10qJworCitkZWYgdF9OVU1CRVIodCk6CisgICAgcidcZCsnCisgICAgdHJ5OgorICAgICAgICB0LnZhbHVlID0gaW50KHQudmFsdWUpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHByaW50KCJJbnRlZ2VyIHZhbHVlIHRvbyBsYXJnZSAlcyIgJSB0LnZhbHVlKQorICAgICAgICB0LnZhbHVlID0gMAorICAgIHJldHVybiB0CisKK3RfaWdub3JlID0gIiBcdCIKKworZGVmIHRfbmV3bGluZSh0KToKKyAgICByJ1xuKycKKyAgICB0LmxleGVyLmxpbmVubyArPSB0LnZhbHVlLmNvdW50KCJcbiIpCisgICAgCitkZWYgdF9lcnJvcih0KToKKyAgICBwcmludCgiSWxsZWdhbCBjaGFyYWN0ZXIgJyVzJyIgJSB0LnZhbHVlWzBdKQorICAgIHQubGV4ZXIuc2tpcCgxKQorICAgIAorIyBCdWlsZCB0aGUgbGV4ZXIKK2xleGVyID0gbGV4LmxleChvcHRpbWl6ZT1UcnVlKQorCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvcGtnX3Rlc3QxL3BhcnNpbmcvY2FsY3BhcnNlLnB5IGIvcGx5L3Rlc3QvcGtnX3Rlc3QxL3BhcnNpbmcvY2FsY3BhcnNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNThlOWYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC9wa2dfdGVzdDEvcGFyc2luZy9jYWxjcGFyc2UucHkKQEAgLTAsMCArMSw2NiBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB5YWNjX3NpbXBsZS5weQorIworIyBBIHNpbXBsZSwgcHJvcGVybHkgc3BlY2lmaWVyIGdyYW1tYXIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZnJvbSAuY2FsY2xleCBpbXBvcnQgdG9rZW5zCitmcm9tIHBseSBpbXBvcnQgeWFjYworCisjIFBhcnNpbmcgcnVsZXMKK3ByZWNlZGVuY2UgPSAoCisgICAgKCdsZWZ0JywnUExVUycsJ01JTlVTJyksCisgICAgKCdsZWZ0JywnVElNRVMnLCdESVZJREUnKSwKKyAgICAoJ3JpZ2h0JywnVU1JTlVTJyksCisgICAgKQorCisjIGRpY3Rpb25hcnkgb2YgbmFtZXMKK25hbWVzID0geyB9CisKK2RlZiBwX3N0YXRlbWVudF9hc3NpZ24odCk6CisgICAgJ3N0YXRlbWVudCA6IE5BTUUgRVFVQUxTIGV4cHJlc3Npb24nCisgICAgbmFtZXNbdFsxXV0gPSB0WzNdCisKK2RlZiBwX3N0YXRlbWVudF9leHByKHQpOgorICAgICdzdGF0ZW1lbnQgOiBleHByZXNzaW9uJworICAgIHRbMF0gPSB0WzFdCisKK2RlZiBwX2V4cHJlc3Npb25fYmlub3AodCk6CisgICAgJycnZXhwcmVzc2lvbiA6IGV4cHJlc3Npb24gUExVUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gTUlOVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIFRJTUVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBESVZJREUgZXhwcmVzc2lvbicnJworICAgIGlmIHRbMl0gPT0gJysnICA6IHRbMF0gPSB0WzFdICsgdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLSc6IHRbMF0gPSB0WzFdIC0gdFszXQorICAgIGVsaWYgdFsyXSA9PSAnKic6IHRbMF0gPSB0WzFdICogdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLyc6IHRbMF0gPSB0WzFdIC8gdFszXQorCitkZWYgcF9leHByZXNzaW9uX3VtaW51cyh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE1JTlVTIGV4cHJlc3Npb24gJXByZWMgVU1JTlVTJworICAgIHRbMF0gPSAtdFsyXQorCitkZWYgcF9leHByZXNzaW9uX2dyb3VwKHQpOgorICAgICdleHByZXNzaW9uIDogTFBBUkVOIGV4cHJlc3Npb24gUlBBUkVOJworICAgIHRbMF0gPSB0WzJdCisKK2RlZiBwX2V4cHJlc3Npb25fbnVtYmVyKHQpOgorICAgICdleHByZXNzaW9uIDogTlVNQkVSJworICAgIHRbMF0gPSB0WzFdCisKK2RlZiBwX2V4cHJlc3Npb25fbmFtZSh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE5BTUUnCisgICAgdHJ5OgorICAgICAgICB0WzBdID0gbmFtZXNbdFsxXV0KKyAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgIHByaW50KCJVbmRlZmluZWQgbmFtZSAnJXMnIiAlIHRbMV0pCisgICAgICAgIHRbMF0gPSAwCisKK2RlZiBwX2Vycm9yKHQpOgorICAgIHByaW50KCJTeW50YXggZXJyb3IgYXQgJyVzJyIgJSB0LnZhbHVlKQorCitwYXJzZXIgPSB5YWNjLnlhY2MoKQorCisKKworCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L3BrZ190ZXN0Mi9fX2luaXRfXy5weSBiL3BseS90ZXN0L3BrZ190ZXN0Mi9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTE5NTU4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QvcGtnX3Rlc3QyL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsOSBAQAorIyBUZXN0cyBwcm9wZXIgaGFuZGxpbmcgb2YgbGV4dGFiIGFuZCBwYXJzZXRhYiBmaWxlcyBpbiBwYWNrYWdlIHN0cnVjdHVyZXMKKworIyBIZXJlIGZvciB0ZXN0aW5nIHB1cnBvc2VzCitpbXBvcnQgc3lzCitpZiAnLi4nIG5vdCBpbiBzeXMucGF0aDogIAorICAgIHN5cy5wYXRoLmluc2VydCgwLCAnLi4nKQorCitmcm9tIC5wYXJzaW5nLmNhbGNwYXJzZSBpbXBvcnQgcGFyc2VyCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L3BrZ190ZXN0Mi9wYXJzaW5nL19faW5pdF9fLnB5IGIvcGx5L3Rlc3QvcGtnX3Rlc3QyL3BhcnNpbmcvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L3BrZ190ZXN0Mi9wYXJzaW5nL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9wbHkvdGVzdC9wa2dfdGVzdDIvcGFyc2luZy9jYWxjbGV4LnB5IGIvcGx5L3Rlc3QvcGtnX3Rlc3QyL3BhcnNpbmcvY2FsY2xleC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODllMTNmCi0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QvcGtnX3Rlc3QyL3BhcnNpbmcvY2FsY2xleC5weQpAQCAtMCwwICsxLDQ3IEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNhbGNsZXgucHkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW1wb3J0IHBseS5sZXggYXMgbGV4CisKK3Rva2VucyA9ICgKKyAgICAnTkFNRScsJ05VTUJFUicsCisgICAgJ1BMVVMnLCdNSU5VUycsJ1RJTUVTJywnRElWSURFJywnRVFVQUxTJywKKyAgICAnTFBBUkVOJywnUlBBUkVOJywKKyAgICApCisKKyMgVG9rZW5zCisKK3RfUExVUyAgICA9IHInXCsnCit0X01JTlVTICAgPSByJy0nCit0X1RJTUVTICAgPSByJ1wqJwordF9ESVZJREUgID0gcicvJwordF9FUVVBTFMgID0gcic9JwordF9MUEFSRU4gID0gcidcKCcKK3RfUlBBUkVOICA9IHInXCknCit0X05BTUUgICAgPSByJ1thLXpBLVpfXVthLXpBLVowLTlfXSonCisKK2RlZiB0X05VTUJFUih0KToKKyAgICByJ1xkKycKKyAgICB0cnk6CisgICAgICAgIHQudmFsdWUgPSBpbnQodC52YWx1ZSkKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgcHJpbnQoIkludGVnZXIgdmFsdWUgdG9vIGxhcmdlICVzIiAlIHQudmFsdWUpCisgICAgICAgIHQudmFsdWUgPSAwCisgICAgcmV0dXJuIHQKKwordF9pZ25vcmUgPSAiIFx0IgorCitkZWYgdF9uZXdsaW5lKHQpOgorICAgIHInXG4rJworICAgIHQubGV4ZXIubGluZW5vICs9IHQudmFsdWUuY291bnQoIlxuIikKKyAgICAKK2RlZiB0X2Vycm9yKHQpOgorICAgIHByaW50KCJJbGxlZ2FsIGNoYXJhY3RlciAnJXMnIiAlIHQudmFsdWVbMF0pCisgICAgdC5sZXhlci5za2lwKDEpCisgICAgCisjIEJ1aWxkIHRoZSBsZXhlcgorbGV4ZXIgPSBsZXgubGV4KG9wdGltaXplPVRydWUsIGxleHRhYj0nY2FsY2xleHRhYicpCisKKworCmRpZmYgLS1naXQgYS9wbHkvdGVzdC9wa2dfdGVzdDIvcGFyc2luZy9jYWxjcGFyc2UucHkgYi9wbHkvdGVzdC9wa2dfdGVzdDIvcGFyc2luZy9jYWxjcGFyc2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUxOTMzOAotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L3BrZ190ZXN0Mi9wYXJzaW5nL2NhbGNwYXJzZS5weQpAQCAtMCwwICsxLDY2IEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHlhY2Nfc2ltcGxlLnB5CisjCisjIEEgc2ltcGxlLCBwcm9wZXJseSBzcGVjaWZpZXIgZ3JhbW1hcgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitmcm9tIC5jYWxjbGV4IGltcG9ydCB0b2tlbnMKK2Zyb20gcGx5IGltcG9ydCB5YWNjCisKKyMgUGFyc2luZyBydWxlcworcHJlY2VkZW5jZSA9ICgKKyAgICAoJ2xlZnQnLCdQTFVTJywnTUlOVVMnKSwKKyAgICAoJ2xlZnQnLCdUSU1FUycsJ0RJVklERScpLAorICAgICgncmlnaHQnLCdVTUlOVVMnKSwKKyAgICApCisKKyMgZGljdGlvbmFyeSBvZiBuYW1lcworbmFtZXMgPSB7IH0KKworZGVmIHBfc3RhdGVtZW50X2Fzc2lnbih0KToKKyAgICAnc3RhdGVtZW50IDogTkFNRSBFUVVBTFMgZXhwcmVzc2lvbicKKyAgICBuYW1lc1t0WzFdXSA9IHRbM10KKworZGVmIHBfc3RhdGVtZW50X2V4cHIodCk6CisgICAgJ3N0YXRlbWVudCA6IGV4cHJlc3Npb24nCisgICAgdFswXSA9IHRbMV0KKworZGVmIHBfZXhwcmVzc2lvbl9iaW5vcCh0KToKKyAgICAnJydleHByZXNzaW9uIDogZXhwcmVzc2lvbiBQTFVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBNSU5VUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gVElNRVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIERJVklERSBleHByZXNzaW9uJycnCisgICAgaWYgdFsyXSA9PSAnKycgIDogdFswXSA9IHRbMV0gKyB0WzNdCisgICAgZWxpZiB0WzJdID09ICctJzogdFswXSA9IHRbMV0gLSB0WzNdCisgICAgZWxpZiB0WzJdID09ICcqJzogdFswXSA9IHRbMV0gKiB0WzNdCisgICAgZWxpZiB0WzJdID09ICcvJzogdFswXSA9IHRbMV0gLyB0WzNdCisKK2RlZiBwX2V4cHJlc3Npb25fdW1pbnVzKHQpOgorICAgICdleHByZXNzaW9uIDogTUlOVVMgZXhwcmVzc2lvbiAlcHJlYyBVTUlOVVMnCisgICAgdFswXSA9IC10WzJdCisKK2RlZiBwX2V4cHJlc3Npb25fZ3JvdXAodCk6CisgICAgJ2V4cHJlc3Npb24gOiBMUEFSRU4gZXhwcmVzc2lvbiBSUEFSRU4nCisgICAgdFswXSA9IHRbMl0KKworZGVmIHBfZXhwcmVzc2lvbl9udW1iZXIodCk6CisgICAgJ2V4cHJlc3Npb24gOiBOVU1CRVInCisgICAgdFswXSA9IHRbMV0KKworZGVmIHBfZXhwcmVzc2lvbl9uYW1lKHQpOgorICAgICdleHByZXNzaW9uIDogTkFNRScKKyAgICB0cnk6CisgICAgICAgIHRbMF0gPSBuYW1lc1t0WzFdXQorICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICAgICAgcHJpbnQoIlVuZGVmaW5lZCBuYW1lICclcyciICUgdFsxXSkKKyAgICAgICAgdFswXSA9IDAKKworZGVmIHBfZXJyb3IodCk6CisgICAgcHJpbnQoIlN5bnRheCBlcnJvciBhdCAnJXMnIiAlIHQudmFsdWUpCisKK3BhcnNlciA9IHlhY2MueWFjYyh0YWJtb2R1bGU9J2NhbGNwYXJzZXRhYicpCisKKworCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvcGtnX3Rlc3QzL19faW5pdF9fLnB5IGIvcGx5L3Rlc3QvcGtnX3Rlc3QzL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMTk1NTgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC9wa2dfdGVzdDMvX19pbml0X18ucHkKQEAgLTAsMCArMSw5IEBACisjIFRlc3RzIHByb3BlciBoYW5kbGluZyBvZiBsZXh0YWIgYW5kIHBhcnNldGFiIGZpbGVzIGluIHBhY2thZ2Ugc3RydWN0dXJlcworCisjIEhlcmUgZm9yIHRlc3RpbmcgcHVycG9zZXMKK2ltcG9ydCBzeXMKK2lmICcuLicgbm90IGluIHN5cy5wYXRoOiAgCisgICAgc3lzLnBhdGguaW5zZXJ0KDAsICcuLicpCisKK2Zyb20gLnBhcnNpbmcuY2FsY3BhcnNlIGltcG9ydCBwYXJzZXIKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvcGtnX3Rlc3QzL2dlbmVyYXRlZC9fX2luaXRfXy5weSBiL3BseS90ZXN0L3BrZ190ZXN0My9nZW5lcmF0ZWQvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L3BrZ190ZXN0My9nZW5lcmF0ZWQvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL3BseS90ZXN0L3BrZ190ZXN0My9wYXJzaW5nL19faW5pdF9fLnB5IGIvcGx5L3Rlc3QvcGtnX3Rlc3QzL3BhcnNpbmcvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L3BrZ190ZXN0My9wYXJzaW5nL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9wbHkvdGVzdC9wa2dfdGVzdDMvcGFyc2luZy9jYWxjbGV4LnB5IGIvcGx5L3Rlc3QvcGtnX3Rlc3QzL3BhcnNpbmcvY2FsY2xleC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2EyYzRmCi0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QvcGtnX3Rlc3QzL3BhcnNpbmcvY2FsY2xleC5weQpAQCAtMCwwICsxLDQ3IEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNhbGNsZXgucHkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW1wb3J0IHBseS5sZXggYXMgbGV4CisKK3Rva2VucyA9ICgKKyAgICAnTkFNRScsJ05VTUJFUicsCisgICAgJ1BMVVMnLCdNSU5VUycsJ1RJTUVTJywnRElWSURFJywnRVFVQUxTJywKKyAgICAnTFBBUkVOJywnUlBBUkVOJywKKyAgICApCisKKyMgVG9rZW5zCisKK3RfUExVUyAgICA9IHInXCsnCit0X01JTlVTICAgPSByJy0nCit0X1RJTUVTICAgPSByJ1wqJwordF9ESVZJREUgID0gcicvJwordF9FUVVBTFMgID0gcic9JwordF9MUEFSRU4gID0gcidcKCcKK3RfUlBBUkVOICA9IHInXCknCit0X05BTUUgICAgPSByJ1thLXpBLVpfXVthLXpBLVowLTlfXSonCisKK2RlZiB0X05VTUJFUih0KToKKyAgICByJ1xkKycKKyAgICB0cnk6CisgICAgICAgIHQudmFsdWUgPSBpbnQodC52YWx1ZSkKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgcHJpbnQoIkludGVnZXIgdmFsdWUgdG9vIGxhcmdlICVzIiAlIHQudmFsdWUpCisgICAgICAgIHQudmFsdWUgPSAwCisgICAgcmV0dXJuIHQKKwordF9pZ25vcmUgPSAiIFx0IgorCitkZWYgdF9uZXdsaW5lKHQpOgorICAgIHInXG4rJworICAgIHQubGV4ZXIubGluZW5vICs9IHQudmFsdWUuY291bnQoIlxuIikKKyAgICAKK2RlZiB0X2Vycm9yKHQpOgorICAgIHByaW50KCJJbGxlZ2FsIGNoYXJhY3RlciAnJXMnIiAlIHQudmFsdWVbMF0pCisgICAgdC5sZXhlci5za2lwKDEpCisgICAgCisjIEJ1aWxkIHRoZSBsZXhlcgorbGV4ZXIgPSBsZXgubGV4KG9wdGltaXplPVRydWUsIGxleHRhYj0ncGtnX3Rlc3QzLmdlbmVyYXRlZC5sZXh0YWInKQorCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvcGtnX3Rlc3QzL3BhcnNpbmcvY2FsY3BhcnNlLnB5IGIvcGx5L3Rlc3QvcGtnX3Rlc3QzL3BhcnNpbmcvY2FsY3BhcnNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkY2I1MmIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC9wa2dfdGVzdDMvcGFyc2luZy9jYWxjcGFyc2UucHkKQEAgLTAsMCArMSw2NiBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB5YWNjX3NpbXBsZS5weQorIworIyBBIHNpbXBsZSwgcHJvcGVybHkgc3BlY2lmaWVyIGdyYW1tYXIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZnJvbSAuY2FsY2xleCBpbXBvcnQgdG9rZW5zCitmcm9tIHBseSBpbXBvcnQgeWFjYworCisjIFBhcnNpbmcgcnVsZXMKK3ByZWNlZGVuY2UgPSAoCisgICAgKCdsZWZ0JywnUExVUycsJ01JTlVTJyksCisgICAgKCdsZWZ0JywnVElNRVMnLCdESVZJREUnKSwKKyAgICAoJ3JpZ2h0JywnVU1JTlVTJyksCisgICAgKQorCisjIGRpY3Rpb25hcnkgb2YgbmFtZXMKK25hbWVzID0geyB9CisKK2RlZiBwX3N0YXRlbWVudF9hc3NpZ24odCk6CisgICAgJ3N0YXRlbWVudCA6IE5BTUUgRVFVQUxTIGV4cHJlc3Npb24nCisgICAgbmFtZXNbdFsxXV0gPSB0WzNdCisKK2RlZiBwX3N0YXRlbWVudF9leHByKHQpOgorICAgICdzdGF0ZW1lbnQgOiBleHByZXNzaW9uJworICAgIHRbMF0gPSB0WzFdCisKK2RlZiBwX2V4cHJlc3Npb25fYmlub3AodCk6CisgICAgJycnZXhwcmVzc2lvbiA6IGV4cHJlc3Npb24gUExVUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gTUlOVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIFRJTUVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBESVZJREUgZXhwcmVzc2lvbicnJworICAgIGlmIHRbMl0gPT0gJysnICA6IHRbMF0gPSB0WzFdICsgdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLSc6IHRbMF0gPSB0WzFdIC0gdFszXQorICAgIGVsaWYgdFsyXSA9PSAnKic6IHRbMF0gPSB0WzFdICogdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLyc6IHRbMF0gPSB0WzFdIC8gdFszXQorCitkZWYgcF9leHByZXNzaW9uX3VtaW51cyh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE1JTlVTIGV4cHJlc3Npb24gJXByZWMgVU1JTlVTJworICAgIHRbMF0gPSAtdFsyXQorCitkZWYgcF9leHByZXNzaW9uX2dyb3VwKHQpOgorICAgICdleHByZXNzaW9uIDogTFBBUkVOIGV4cHJlc3Npb24gUlBBUkVOJworICAgIHRbMF0gPSB0WzJdCisKK2RlZiBwX2V4cHJlc3Npb25fbnVtYmVyKHQpOgorICAgICdleHByZXNzaW9uIDogTlVNQkVSJworICAgIHRbMF0gPSB0WzFdCisKK2RlZiBwX2V4cHJlc3Npb25fbmFtZSh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE5BTUUnCisgICAgdHJ5OgorICAgICAgICB0WzBdID0gbmFtZXNbdFsxXV0KKyAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgIHByaW50KCJVbmRlZmluZWQgbmFtZSAnJXMnIiAlIHRbMV0pCisgICAgICAgIHRbMF0gPSAwCisKK2RlZiBwX2Vycm9yKHQpOgorICAgIHByaW50KCJTeW50YXggZXJyb3IgYXQgJyVzJyIgJSB0LnZhbHVlKQorCitwYXJzZXIgPSB5YWNjLnlhY2ModGFibW9kdWxlPSdwa2dfdGVzdDMuZ2VuZXJhdGVkLnBhcnNldGFiJykKKworCisKKworCmRpZmYgLS1naXQgYS9wbHkvdGVzdC9wa2dfdGVzdDQvX19pbml0X18ucHkgYi9wbHkvdGVzdC9wa2dfdGVzdDQvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE5ZGRhYwotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L3BrZ190ZXN0NC9fX2luaXRfXy5weQpAQCAtMCwwICsxLDI1IEBACisjIFRlc3RzIHByb3BlciBoYW5kbGluZyBvZiBsZXh0YWIgYW5kIHBhcnNldGFiIGZpbGVzIGluIHBhY2thZ2Ugc3RydWN0dXJlcworIyBDaGVjayBvZiB3YXJuaW5nIG1lc3NhZ2VzIHdoZW4gZmlsZXMgYXJlbid0IHdyaXRhYmxlCisKKyMgSGVyZSBmb3IgdGVzdGluZyBwdXJwb3NlcworaW1wb3J0IHN5cworaWYgJy4uJyBub3QgaW4gc3lzLnBhdGg6ICAKKyAgICBzeXMucGF0aC5pbnNlcnQoMCwgJy4uJykKKworaW1wb3J0IHBseS5sZXgKK2ltcG9ydCBwbHkueWFjYworCitkZWYgcGF0Y2hlZF9vcGVuKGZpbGVuYW1lLCBtb2RlKToKKyAgICBpZiAndycgaW4gbW9kZToKKyAgICAgICAgcmFpc2UgSU9FcnJvcigiUGVybWlzc2lvbiBkZW5pZWQgJXIiICUgZmlsZW5hbWUpCisgICAgcmV0dXJuIG9wZW4oZmlsZW5hbWUsIG1vZGUpCisKK3BseS5sZXgub3BlbiA9IHBhdGNoZWRfb3BlbgorcGx5LnlhY2Mub3BlbiA9IHBhdGNoZWRfb3BlbgordHJ5OgorICAgIGZyb20gLnBhcnNpbmcuY2FsY3BhcnNlIGltcG9ydCBwYXJzZXIKK2ZpbmFsbHk6CisgICAgZGVsIHBseS5sZXgub3BlbgorICAgIGRlbCBwbHkueWFjYy5vcGVuCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvcGtnX3Rlc3Q0L3BhcnNpbmcvX19pbml0X18ucHkgYi9wbHkvdGVzdC9wa2dfdGVzdDQvcGFyc2luZy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QvcGtnX3Rlc3Q0L3BhcnNpbmcvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL3BseS90ZXN0L3BrZ190ZXN0NC9wYXJzaW5nL2NhbGNsZXgucHkgYi9wbHkvdGVzdC9wa2dfdGVzdDQvcGFyc2luZy9jYWxjbGV4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYzFhNGQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC9wa2dfdGVzdDQvcGFyc2luZy9jYWxjbGV4LnB5CkBAIC0wLDAgKzEsNDcgQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY2FsY2xleC5weQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbXBvcnQgcGx5LmxleCBhcyBsZXgKKwordG9rZW5zID0gKAorICAgICdOQU1FJywnTlVNQkVSJywKKyAgICAnUExVUycsJ01JTlVTJywnVElNRVMnLCdESVZJREUnLCdFUVVBTFMnLAorICAgICdMUEFSRU4nLCdSUEFSRU4nLAorICAgICkKKworIyBUb2tlbnMKKwordF9QTFVTICAgID0gcidcKycKK3RfTUlOVVMgICA9IHInLScKK3RfVElNRVMgICA9IHInXConCit0X0RJVklERSAgPSByJy8nCit0X0VRVUFMUyAgPSByJz0nCit0X0xQQVJFTiAgPSByJ1woJwordF9SUEFSRU4gID0gcidcKScKK3RfTkFNRSAgICA9IHInW2EtekEtWl9dW2EtekEtWjAtOV9dKicKKworZGVmIHRfTlVNQkVSKHQpOgorICAgIHInXGQrJworICAgIHRyeToKKyAgICAgICAgdC52YWx1ZSA9IGludCh0LnZhbHVlKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICBwcmludCgiSW50ZWdlciB2YWx1ZSB0b28gbGFyZ2UgJXMiICUgdC52YWx1ZSkKKyAgICAgICAgdC52YWx1ZSA9IDAKKyAgICByZXR1cm4gdAorCit0X2lnbm9yZSA9ICIgXHQiCisKK2RlZiB0X25ld2xpbmUodCk6CisgICAgcidcbisnCisgICAgdC5sZXhlci5saW5lbm8gKz0gdC52YWx1ZS5jb3VudCgiXG4iKQorICAgIAorZGVmIHRfZXJyb3IodCk6CisgICAgcHJpbnQoIklsbGVnYWwgY2hhcmFjdGVyICclcyciICUgdC52YWx1ZVswXSkKKyAgICB0LmxleGVyLnNraXAoMSkKKyAgICAKKyMgQnVpbGQgdGhlIGxleGVyCitsZXhlciA9IGxleC5sZXgob3B0aW1pemU9VHJ1ZSkKKworCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L3BrZ190ZXN0NC9wYXJzaW5nL2NhbGNwYXJzZS5weSBiL3BseS90ZXN0L3BrZ190ZXN0NC9wYXJzaW5nL2NhbGNwYXJzZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDU4ZTlmCi0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QvcGtnX3Rlc3Q0L3BhcnNpbmcvY2FsY3BhcnNlLnB5CkBAIC0wLDAgKzEsNjYgQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgeWFjY19zaW1wbGUucHkKKyMKKyMgQSBzaW1wbGUsIHByb3Blcmx5IHNwZWNpZmllciBncmFtbWFyCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2Zyb20gLmNhbGNsZXggaW1wb3J0IHRva2VucworZnJvbSBwbHkgaW1wb3J0IHlhY2MKKworIyBQYXJzaW5nIHJ1bGVzCitwcmVjZWRlbmNlID0gKAorICAgICgnbGVmdCcsJ1BMVVMnLCdNSU5VUycpLAorICAgICgnbGVmdCcsJ1RJTUVTJywnRElWSURFJyksCisgICAgKCdyaWdodCcsJ1VNSU5VUycpLAorICAgICkKKworIyBkaWN0aW9uYXJ5IG9mIG5hbWVzCituYW1lcyA9IHsgfQorCitkZWYgcF9zdGF0ZW1lbnRfYXNzaWduKHQpOgorICAgICdzdGF0ZW1lbnQgOiBOQU1FIEVRVUFMUyBleHByZXNzaW9uJworICAgIG5hbWVzW3RbMV1dID0gdFszXQorCitkZWYgcF9zdGF0ZW1lbnRfZXhwcih0KToKKyAgICAnc3RhdGVtZW50IDogZXhwcmVzc2lvbicKKyAgICB0WzBdID0gdFsxXQorCitkZWYgcF9leHByZXNzaW9uX2Jpbm9wKHQpOgorICAgICcnJ2V4cHJlc3Npb24gOiBleHByZXNzaW9uIFBMVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIE1JTlVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBUSU1FUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gRElWSURFIGV4cHJlc3Npb24nJycKKyAgICBpZiB0WzJdID09ICcrJyAgOiB0WzBdID0gdFsxXSArIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy0nOiB0WzBdID0gdFsxXSAtIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJyonOiB0WzBdID0gdFsxXSAqIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy8nOiB0WzBdID0gdFsxXSAvIHRbM10KKworZGVmIHBfZXhwcmVzc2lvbl91bWludXModCk6CisgICAgJ2V4cHJlc3Npb24gOiBNSU5VUyBleHByZXNzaW9uICVwcmVjIFVNSU5VUycKKyAgICB0WzBdID0gLXRbMl0KKworZGVmIHBfZXhwcmVzc2lvbl9ncm91cCh0KToKKyAgICAnZXhwcmVzc2lvbiA6IExQQVJFTiBleHByZXNzaW9uIFJQQVJFTicKKyAgICB0WzBdID0gdFsyXQorCitkZWYgcF9leHByZXNzaW9uX251bWJlcih0KToKKyAgICAnZXhwcmVzc2lvbiA6IE5VTUJFUicKKyAgICB0WzBdID0gdFsxXQorCitkZWYgcF9leHByZXNzaW9uX25hbWUodCk6CisgICAgJ2V4cHJlc3Npb24gOiBOQU1FJworICAgIHRyeToKKyAgICAgICAgdFswXSA9IG5hbWVzW3RbMV1dCisgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICBwcmludCgiVW5kZWZpbmVkIG5hbWUgJyVzJyIgJSB0WzFdKQorICAgICAgICB0WzBdID0gMAorCitkZWYgcF9lcnJvcih0KToKKyAgICBwcmludCgiU3ludGF4IGVycm9yIGF0ICclcyciICUgdC52YWx1ZSkKKworcGFyc2VyID0geWFjYy55YWNjKCkKKworCisKKworCmRpZmYgLS1naXQgYS9wbHkvdGVzdC9wa2dfdGVzdDUvX19pbml0X18ucHkgYi9wbHkvdGVzdC9wa2dfdGVzdDUvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUxOTU1OAotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L3BrZ190ZXN0NS9fX2luaXRfXy5weQpAQCAtMCwwICsxLDkgQEAKKyMgVGVzdHMgcHJvcGVyIGhhbmRsaW5nIG9mIGxleHRhYiBhbmQgcGFyc2V0YWIgZmlsZXMgaW4gcGFja2FnZSBzdHJ1Y3R1cmVzCisKKyMgSGVyZSBmb3IgdGVzdGluZyBwdXJwb3NlcworaW1wb3J0IHN5cworaWYgJy4uJyBub3QgaW4gc3lzLnBhdGg6ICAKKyAgICBzeXMucGF0aC5pbnNlcnQoMCwgJy4uJykKKworZnJvbSAucGFyc2luZy5jYWxjcGFyc2UgaW1wb3J0IHBhcnNlcgorCmRpZmYgLS1naXQgYS9wbHkvdGVzdC9wa2dfdGVzdDUvcGFyc2luZy9fX2luaXRfXy5weSBiL3BseS90ZXN0L3BrZ190ZXN0NS9wYXJzaW5nL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC9wa2dfdGVzdDUvcGFyc2luZy9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvcGtnX3Rlc3Q1L3BhcnNpbmcvY2FsY2xleC5weSBiL3BseS90ZXN0L3BrZ190ZXN0NS9wYXJzaW5nL2NhbGNsZXgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg3NTliNgotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L3BrZ190ZXN0NS9wYXJzaW5nL2NhbGNsZXgucHkKQEAgLTAsMCArMSw0OCBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjYWxjbGV4LnB5CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ltcG9ydCBwbHkubGV4IGFzIGxleAorCit0b2tlbnMgPSAoCisgICAgJ05BTUUnLCdOVU1CRVInLAorICAgICdQTFVTJywnTUlOVVMnLCdUSU1FUycsJ0RJVklERScsJ0VRVUFMUycsCisgICAgJ0xQQVJFTicsJ1JQQVJFTicsCisgICAgKQorCisjIFRva2VucworCit0X1BMVVMgICAgPSByJ1wrJwordF9NSU5VUyAgID0gcictJwordF9USU1FUyAgID0gcidcKicKK3RfRElWSURFICA9IHInLycKK3RfRVFVQUxTICA9IHInPScKK3RfTFBBUkVOICA9IHInXCgnCit0X1JQQVJFTiAgPSByJ1wpJwordF9OQU1FICAgID0gcidbYS16QS1aX11bYS16QS1aMC05X10qJworCitkZWYgdF9OVU1CRVIodCk6CisgICAgcidcZCsnCisgICAgdHJ5OgorICAgICAgICB0LnZhbHVlID0gaW50KHQudmFsdWUpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHByaW50KCJJbnRlZ2VyIHZhbHVlIHRvbyBsYXJnZSAlcyIgJSB0LnZhbHVlKQorICAgICAgICB0LnZhbHVlID0gMAorICAgIHJldHVybiB0CisKK3RfaWdub3JlID0gIiBcdCIKKworZGVmIHRfbmV3bGluZSh0KToKKyAgICByJ1xuKycKKyAgICB0LmxleGVyLmxpbmVubyArPSB0LnZhbHVlLmNvdW50KCJcbiIpCisgICAgCitkZWYgdF9lcnJvcih0KToKKyAgICBwcmludCgiSWxsZWdhbCBjaGFyYWN0ZXIgJyVzJyIgJSB0LnZhbHVlWzBdKQorICAgIHQubGV4ZXIuc2tpcCgxKQorICAgIAorIyBCdWlsZCB0aGUgbGV4ZXIKK2ltcG9ydCBvcy5wYXRoCitsZXhlciA9IGxleC5sZXgob3B0aW1pemU9VHJ1ZSwgb3V0cHV0ZGlyPW9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCisKKworCmRpZmYgLS1naXQgYS9wbHkvdGVzdC9wa2dfdGVzdDUvcGFyc2luZy9jYWxjcGFyc2UucHkgYi9wbHkvdGVzdC9wa2dfdGVzdDUvcGFyc2luZy9jYWxjcGFyc2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmExZGRmZQotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L3BrZ190ZXN0NS9wYXJzaW5nL2NhbGNwYXJzZS5weQpAQCAtMCwwICsxLDY3IEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHlhY2Nfc2ltcGxlLnB5CisjCisjIEEgc2ltcGxlLCBwcm9wZXJseSBzcGVjaWZpZXIgZ3JhbW1hcgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitmcm9tIC5jYWxjbGV4IGltcG9ydCB0b2tlbnMKK2Zyb20gcGx5IGltcG9ydCB5YWNjCisKKyMgUGFyc2luZyBydWxlcworcHJlY2VkZW5jZSA9ICgKKyAgICAoJ2xlZnQnLCdQTFVTJywnTUlOVVMnKSwKKyAgICAoJ2xlZnQnLCdUSU1FUycsJ0RJVklERScpLAorICAgICgncmlnaHQnLCdVTUlOVVMnKSwKKyAgICApCisKKyMgZGljdGlvbmFyeSBvZiBuYW1lcworbmFtZXMgPSB7IH0KKworZGVmIHBfc3RhdGVtZW50X2Fzc2lnbih0KToKKyAgICAnc3RhdGVtZW50IDogTkFNRSBFUVVBTFMgZXhwcmVzc2lvbicKKyAgICBuYW1lc1t0WzFdXSA9IHRbM10KKworZGVmIHBfc3RhdGVtZW50X2V4cHIodCk6CisgICAgJ3N0YXRlbWVudCA6IGV4cHJlc3Npb24nCisgICAgdFswXSA9IHRbMV0KKworZGVmIHBfZXhwcmVzc2lvbl9iaW5vcCh0KToKKyAgICAnJydleHByZXNzaW9uIDogZXhwcmVzc2lvbiBQTFVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBNSU5VUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gVElNRVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIERJVklERSBleHByZXNzaW9uJycnCisgICAgaWYgdFsyXSA9PSAnKycgIDogdFswXSA9IHRbMV0gKyB0WzNdCisgICAgZWxpZiB0WzJdID09ICctJzogdFswXSA9IHRbMV0gLSB0WzNdCisgICAgZWxpZiB0WzJdID09ICcqJzogdFswXSA9IHRbMV0gKiB0WzNdCisgICAgZWxpZiB0WzJdID09ICcvJzogdFswXSA9IHRbMV0gLyB0WzNdCisKK2RlZiBwX2V4cHJlc3Npb25fdW1pbnVzKHQpOgorICAgICdleHByZXNzaW9uIDogTUlOVVMgZXhwcmVzc2lvbiAlcHJlYyBVTUlOVVMnCisgICAgdFswXSA9IC10WzJdCisKK2RlZiBwX2V4cHJlc3Npb25fZ3JvdXAodCk6CisgICAgJ2V4cHJlc3Npb24gOiBMUEFSRU4gZXhwcmVzc2lvbiBSUEFSRU4nCisgICAgdFswXSA9IHRbMl0KKworZGVmIHBfZXhwcmVzc2lvbl9udW1iZXIodCk6CisgICAgJ2V4cHJlc3Npb24gOiBOVU1CRVInCisgICAgdFswXSA9IHRbMV0KKworZGVmIHBfZXhwcmVzc2lvbl9uYW1lKHQpOgorICAgICdleHByZXNzaW9uIDogTkFNRScKKyAgICB0cnk6CisgICAgICAgIHRbMF0gPSBuYW1lc1t0WzFdXQorICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICAgICAgcHJpbnQoIlVuZGVmaW5lZCBuYW1lICclcyciICUgdFsxXSkKKyAgICAgICAgdFswXSA9IDAKKworZGVmIHBfZXJyb3IodCk6CisgICAgcHJpbnQoIlN5bnRheCBlcnJvciBhdCAnJXMnIiAlIHQudmFsdWUpCisKK2ltcG9ydCBvcy5wYXRoCitwYXJzZXIgPSB5YWNjLnlhY2Mob3V0cHV0ZGlyPW9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCisKKworCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvcGtnX3Rlc3Q2L19faW5pdF9fLnB5IGIvcGx5L3Rlc3QvcGtnX3Rlc3Q2L19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYmUwY2IKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC9wa2dfdGVzdDYvX19pbml0X18ucHkKQEAgLTAsMCArMSw5IEBACisjIFRlc3RzIHByb3BlciBzb3J0aW5nIG9mIG1vZHVsZXMgaW4geWFjYy5QYXJzZXJSZWZsZWN0LmdldF9wZnVuY3Rpb25zCisKKyMgSGVyZSBmb3IgdGVzdGluZyBwdXJwb3NlcworaW1wb3J0IHN5cworaWYgJy4uJyBub3QgaW4gc3lzLnBhdGg6CisgICAgc3lzLnBhdGguaW5zZXJ0KDAsICcuLicpCisKK2Zyb20gLnBhcnNpbmcuY2FsY3BhcnNlIGltcG9ydCBwYXJzZXIKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvcGtnX3Rlc3Q2L3BhcnNpbmcvX19pbml0X18ucHkgYi9wbHkvdGVzdC9wa2dfdGVzdDYvcGFyc2luZy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QvcGtnX3Rlc3Q2L3BhcnNpbmcvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL3BseS90ZXN0L3BrZ190ZXN0Ni9wYXJzaW5nL2NhbGNsZXgucHkgYi9wbHkvdGVzdC9wa2dfdGVzdDYvcGFyc2luZy9jYWxjbGV4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NzU5YjYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC9wa2dfdGVzdDYvcGFyc2luZy9jYWxjbGV4LnB5CkBAIC0wLDAgKzEsNDggQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY2FsY2xleC5weQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbXBvcnQgcGx5LmxleCBhcyBsZXgKKwordG9rZW5zID0gKAorICAgICdOQU1FJywnTlVNQkVSJywKKyAgICAnUExVUycsJ01JTlVTJywnVElNRVMnLCdESVZJREUnLCdFUVVBTFMnLAorICAgICdMUEFSRU4nLCdSUEFSRU4nLAorICAgICkKKworIyBUb2tlbnMKKwordF9QTFVTICAgID0gcidcKycKK3RfTUlOVVMgICA9IHInLScKK3RfVElNRVMgICA9IHInXConCit0X0RJVklERSAgPSByJy8nCit0X0VRVUFMUyAgPSByJz0nCit0X0xQQVJFTiAgPSByJ1woJwordF9SUEFSRU4gID0gcidcKScKK3RfTkFNRSAgICA9IHInW2EtekEtWl9dW2EtekEtWjAtOV9dKicKKworZGVmIHRfTlVNQkVSKHQpOgorICAgIHInXGQrJworICAgIHRyeToKKyAgICAgICAgdC52YWx1ZSA9IGludCh0LnZhbHVlKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICBwcmludCgiSW50ZWdlciB2YWx1ZSB0b28gbGFyZ2UgJXMiICUgdC52YWx1ZSkKKyAgICAgICAgdC52YWx1ZSA9IDAKKyAgICByZXR1cm4gdAorCit0X2lnbm9yZSA9ICIgXHQiCisKK2RlZiB0X25ld2xpbmUodCk6CisgICAgcidcbisnCisgICAgdC5sZXhlci5saW5lbm8gKz0gdC52YWx1ZS5jb3VudCgiXG4iKQorICAgIAorZGVmIHRfZXJyb3IodCk6CisgICAgcHJpbnQoIklsbGVnYWwgY2hhcmFjdGVyICclcyciICUgdC52YWx1ZVswXSkKKyAgICB0LmxleGVyLnNraXAoMSkKKyAgICAKKyMgQnVpbGQgdGhlIGxleGVyCitpbXBvcnQgb3MucGF0aAorbGV4ZXIgPSBsZXgubGV4KG9wdGltaXplPVRydWUsIG91dHB1dGRpcj1vcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQorCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvcGtnX3Rlc3Q2L3BhcnNpbmcvY2FsY3BhcnNlLnB5IGIvcGx5L3Rlc3QvcGtnX3Rlc3Q2L3BhcnNpbmcvY2FsY3BhcnNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZWZhZjkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC9wa2dfdGVzdDYvcGFyc2luZy9jYWxjcGFyc2UucHkKQEAgLTAsMCArMSwzMyBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB5YWNjX3NpbXBsZS5weQorIworIyBBIHNpbXBsZSwgcHJvcGVybHkgc3BlY2lmaWVyIGdyYW1tYXIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZnJvbSAuY2FsY2xleCBpbXBvcnQgdG9rZW5zCitmcm9tIHBseSBpbXBvcnQgeWFjYworCisjIFBhcnNpbmcgcnVsZXMKK3ByZWNlZGVuY2UgPSAoCisgICAgKCdsZWZ0JywnUExVUycsJ01JTlVTJyksCisgICAgKCdsZWZ0JywnVElNRVMnLCdESVZJREUnKSwKKyAgICAoJ3JpZ2h0JywnVU1JTlVTJyksCisgICAgKQorCisjIGRpY3Rpb25hcnkgb2YgbmFtZXMKK25hbWVzID0geyB9CisKK2Zyb20gLnN0YXRlbWVudCBpbXBvcnQgKgorCitmcm9tIC5leHByZXNzaW9uIGltcG9ydCAqCisKK2RlZiBwX2Vycm9yKHQpOgorICAgIHByaW50KCJTeW50YXggZXJyb3IgYXQgJyVzJyIgJSB0LnZhbHVlKQorCitpbXBvcnQgb3MucGF0aAorcGFyc2VyID0geWFjYy55YWNjKG91dHB1dGRpcj1vcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQorCisKKworCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L3BrZ190ZXN0Ni9wYXJzaW5nL2V4cHJlc3Npb24ucHkgYi9wbHkvdGVzdC9wa2dfdGVzdDYvcGFyc2luZy9leHByZXNzaW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyOGY2NjIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC9wa2dfdGVzdDYvcGFyc2luZy9leHByZXNzaW9uLnB5CkBAIC0wLDAgKzEsMzEgQEAKKyMgVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIG9mIGV4cHJlc3Npb24gZ3JhbW1hcgorCitkZWYgcF9leHByZXNzaW9uX2Jpbm9wKHQpOgorICAgICcnJ2V4cHJlc3Npb24gOiBleHByZXNzaW9uIFBMVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIE1JTlVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBUSU1FUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gRElWSURFIGV4cHJlc3Npb24nJycKKyAgICBpZiB0WzJdID09ICcrJyAgOiB0WzBdID0gdFsxXSArIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy0nOiB0WzBdID0gdFsxXSAtIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJyonOiB0WzBdID0gdFsxXSAqIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy8nOiB0WzBdID0gdFsxXSAvIHRbM10KKworZGVmIHBfZXhwcmVzc2lvbl91bWludXModCk6CisgICAgJ2V4cHJlc3Npb24gOiBNSU5VUyBleHByZXNzaW9uICVwcmVjIFVNSU5VUycKKyAgICB0WzBdID0gLXRbMl0KKworZGVmIHBfZXhwcmVzc2lvbl9ncm91cCh0KToKKyAgICAnZXhwcmVzc2lvbiA6IExQQVJFTiBleHByZXNzaW9uIFJQQVJFTicKKyAgICB0WzBdID0gdFsyXQorCitkZWYgcF9leHByZXNzaW9uX251bWJlcih0KToKKyAgICAnZXhwcmVzc2lvbiA6IE5VTUJFUicKKyAgICB0WzBdID0gdFsxXQorCitkZWYgcF9leHByZXNzaW9uX25hbWUodCk6CisgICAgJ2V4cHJlc3Npb24gOiBOQU1FJworICAgIHRyeToKKyAgICAgICAgdFswXSA9IG5hbWVzW3RbMV1dCisgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICBwcmludCgiVW5kZWZpbmVkIG5hbWUgJyVzJyIgJSB0WzFdKQorICAgICAgICB0WzBdID0gMApkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvcGtnX3Rlc3Q2L3BhcnNpbmcvc3RhdGVtZW50LnB5IGIvcGx5L3Rlc3QvcGtnX3Rlc3Q2L3BhcnNpbmcvc3RhdGVtZW50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmN2RjNTUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC9wa2dfdGVzdDYvcGFyc2luZy9zdGF0ZW1lbnQucHkKQEAgLTAsMCArMSw5IEBACisjIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBvZiBzdGF0ZW1lbnQgZ3JhbW1hcgorCitkZWYgcF9zdGF0ZW1lbnRfYXNzaWduKHQpOgorICAgICdzdGF0ZW1lbnQgOiBOQU1FIEVRVUFMUyBleHByZXNzaW9uJworICAgIG5hbWVzW3RbMV1dID0gdFszXQorCitkZWYgcF9zdGF0ZW1lbnRfZXhwcih0KToKKyAgICAnc3RhdGVtZW50IDogZXhwcmVzc2lvbicKKyAgICB0WzBdID0gdFsxXQpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QvdGVzdGxleC5weSBiL3BseS90ZXN0L3Rlc3RsZXgucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzg4MGY2ZgotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L3Rlc3RsZXgucHkKQEAgLTAsMCArMSw2NjAgQEAKKyMgdGVzdGxleC5weQorCitpbXBvcnQgdW5pdHRlc3QKK3RyeToKKyAgICBpbXBvcnQgU3RyaW5nSU8KK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBpbXBvcnQgaW8gYXMgU3RyaW5nSU8KKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgd2FybmluZ3MKK2ltcG9ydCBwbGF0Zm9ybQorCitzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQorc3lzLnRyYWNlYmFja2xpbWl0ID0gMAorCitpbXBvcnQgcGx5LmxleAorCit0cnk6CisgICAgZnJvbSBpbXBvcnRsaWIudXRpbCBpbXBvcnQgY2FjaGVfZnJvbV9zb3VyY2UKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAjIFB5dGhvbiAyLjcsIGJ1dCB3ZSBkb24ndCBjYXJlLgorICAgIGNhY2hlX2Zyb21fc291cmNlID0gTm9uZQorCisKK2RlZiBtYWtlX3B5bW9kdWxlX3BhdGgoZmlsZW5hbWUsIG9wdGltaXphdGlvbj1Ob25lKToKKyAgICBwYXRoID0gb3MucGF0aC5kaXJuYW1lKGZpbGVuYW1lKQorICAgIGZpbGUgPSBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKQorICAgIG1vZCwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChmaWxlKQorCisgICAgaWYgc3lzLmhleHZlcnNpb24gPj0gMHgzMDUwMDAwOgorICAgICAgICBmdWxscGF0aCA9IGNhY2hlX2Zyb21fc291cmNlKGZpbGVuYW1lLCBvcHRpbWl6YXRpb249b3B0aW1pemF0aW9uKQorICAgIGVsaWYgc3lzLmhleHZlcnNpb24gPj0gMHgzMDQwMDAwOgorICAgICAgICBmdWxscGF0aCA9IGNhY2hlX2Zyb21fc291cmNlKGZpbGVuYW1lLCBleHQ9PScucHljJykKKyAgICBlbGlmIHN5cy5oZXh2ZXJzaW9uID49IDB4MzAyMDAwMDoKKyAgICAgICAgaW1wb3J0IGltcAorICAgICAgICBtb2RuYW1lID0gbW9kKyIuIitpbXAuZ2V0X3RhZygpK2V4dAorICAgICAgICBmdWxscGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCdfX3B5Y2FjaGVfXycsbW9kbmFtZSkKKyAgICBlbHNlOgorICAgICAgICBmdWxscGF0aCA9IGZpbGVuYW1lCisgICAgcmV0dXJuIGZ1bGxwYXRoCisKK2RlZiBweW1vZHVsZV9vdXRfZXhpc3RzKGZpbGVuYW1lLCBvcHRpbWl6YXRpb249Tm9uZSk6CisgICAgcmV0dXJuIG9zLnBhdGguZXhpc3RzKG1ha2VfcHltb2R1bGVfcGF0aChmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXphdGlvbj1vcHRpbWl6YXRpb24pKQorCitkZWYgcHltb2R1bGVfb3V0X3JlbW92ZShmaWxlbmFtZSwgb3B0aW1pemF0aW9uPU5vbmUpOgorICAgIG9zLnJlbW92ZShtYWtlX3B5bW9kdWxlX3BhdGgoZmlsZW5hbWUsIG9wdGltaXphdGlvbj1vcHRpbWl6YXRpb24pKQorCitkZWYgaW1wbGVtZW50YXRpb24oKToKKyAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKS5zdGFydHN3aXRoKCJKYXZhIik6CisgICAgICAgIHJldHVybiAiSnl0aG9uIgorICAgIGVsaWYgaGFzYXR0cihzeXMsICJweXB5X3ZlcnNpb25faW5mbyIpOgorICAgICAgICByZXR1cm4gIlB5UHkiCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuICJDUHl0aG9uIgorCit0ZXN0X3B5byA9IChpbXBsZW1lbnRhdGlvbigpID09ICdDUHl0aG9uJykKKworZGVmIGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwgZXhwZWN0ZWQsIGNvbnRhaW5zPUZhbHNlKToKKyAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID49IDM6CisgICAgICAgIGlmIGlzaW5zdGFuY2UocmVzdWx0LHN0cik6CisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuZW5jb2RlKCdhc2NpaScpCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZXhwZWN0ZWQsc3RyKToKKyAgICAgICAgICAgIGV4cGVjdGVkID0gZXhwZWN0ZWQuZW5jb2RlKCdhc2NpaScpCisgICAgcmVzdWx0bGluZXMgPSByZXN1bHQuc3BsaXRsaW5lcygpCisgICAgZXhwZWN0ZWRsaW5lcyA9IGV4cGVjdGVkLnNwbGl0bGluZXMoKQorCisgICAgaWYgbGVuKHJlc3VsdGxpbmVzKSAhPSBsZW4oZXhwZWN0ZWRsaW5lcyk6CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZm9yIHJsaW5lLGVsaW5lIGluIHppcChyZXN1bHRsaW5lcyxleHBlY3RlZGxpbmVzKToKKyAgICAgICAgaWYgY29udGFpbnM6CisgICAgICAgICAgICBpZiBlbGluZSBub3QgaW4gcmxpbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBub3QgcmxpbmUuZW5kc3dpdGgoZWxpbmUpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgIHJldHVybiBUcnVlCisKK2RlZiBydW5faW1wb3J0KG1vZHVsZSk6CisgICAgY29kZSA9ICJpbXBvcnQgIittb2R1bGUKKyAgICBleGVjKGNvZGUpCisgICAgZGVsIHN5cy5tb2R1bGVzW21vZHVsZV0KKyAgICAKKyMgVGVzdHMgcmVsYXRlZCB0byBlcnJvcnMgYW5kIHdhcm5pbmdzIHdoZW4gYnVpbGRpbmcgbGV4ZXJzCitjbGFzcyBMZXhFcnJvcldhcm5pbmdUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzeXMuc3RkZXJyID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBzeXMuc3Rkb3V0ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBpZiBzeXMuaGV4dmVyc2lvbiA+PSAweDMwMjAwMDA6CisgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygnaWdub3JlJyxjYXRlZ29yeT1SZXNvdXJjZVdhcm5pbmcpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHN5cy5zdGRlcnIgPSBzeXMuX19zdGRlcnJfXworICAgICAgICBzeXMuc3Rkb3V0ID0gc3lzLl9fc3Rkb3V0X18KKyAgICBkZWYgdGVzdF9sZXhfZG9jMShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IscnVuX2ltcG9ydCwibGV4X2RvYzEiKQorICAgICAgICByZXN1bHQgPSBzeXMuc3RkZXJyLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsZXhfZG9jMS5weToxODogTm8gcmVndWxhciBleHByZXNzaW9uIGRlZmluZWQgZm9yIHJ1bGUgJ3RfTlVNQkVSJ1xuIikpCisgICAgZGVmIHRlc3RfbGV4X2R1cDEoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLHJ1bl9pbXBvcnQsImxleF9kdXAxIikKKyAgICAgICAgcmVzdWx0ID0gc3lzLnN0ZGVyci5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhjaGVja19leHBlY3RlZChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGV4X2R1cDEucHk6MjA6IFJ1bGUgdF9OVU1CRVIgcmVkZWZpbmVkLiBQcmV2aW91c2x5IGRlZmluZWQgb24gbGluZSAxOFxuIiApKSAgICAgICAgCisgICAgICAgIAorICAgIGRlZiB0ZXN0X2xleF9kdXAyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvcixydW5faW1wb3J0LCJsZXhfZHVwMiIpCisgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxleF9kdXAyLnB5OjIyOiBSdWxlIHRfTlVNQkVSIHJlZGVmaW5lZC4gUHJldmlvdXNseSBkZWZpbmVkIG9uIGxpbmUgMThcbiIgKSkKKyAgICAgICAgICAgIAorICAgIGRlZiB0ZXN0X2xleF9kdXAzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvcixydW5faW1wb3J0LCJsZXhfZHVwMyIpCisgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxleF9kdXAzLnB5OjIwOiBSdWxlIHRfTlVNQkVSIHJlZGVmaW5lZC4gUHJldmlvdXNseSBkZWZpbmVkIG9uIGxpbmUgMThcbiIgKSkKKworICAgIGRlZiB0ZXN0X2xleF9lbXB0eShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IscnVuX2ltcG9ydCwibGV4X2VtcHR5IikKKyAgICAgICAgcmVzdWx0ID0gc3lzLnN0ZGVyci5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhjaGVja19leHBlY3RlZChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gcnVsZXMgb2YgdGhlIGZvcm0gdF9ydWxlbmFtZSBhcmUgZGVmaW5lZFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIHJ1bGVzIGRlZmluZWQgZm9yIHN0YXRlICdJTklUSUFMJ1xuIikpCisKKyAgICBkZWYgdGVzdF9sZXhfZXJyb3IxKHNlbGYpOgorICAgICAgICBydW5faW1wb3J0KCJsZXhfZXJyb3IxIikKKyAgICAgICAgcmVzdWx0ID0gc3lzLnN0ZGVyci5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhjaGVja19leHBlY3RlZChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gdF9lcnJvciBydWxlIGlzIGRlZmluZWRcbiIpKQorCisgICAgZGVmIHRlc3RfbGV4X2Vycm9yMihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IscnVuX2ltcG9ydCwibGV4X2Vycm9yMiIpCisgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJ1bGUgJ3RfZXJyb3InIG11c3QgYmUgZGVmaW5lZCBhcyBhIGZ1bmN0aW9uXG4iKQorICAgICAgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIHRlc3RfbGV4X2Vycm9yMyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IscnVuX2ltcG9ydCwibGV4X2Vycm9yMyIpCisgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxleF9lcnJvcjMucHk6MjA6IFJ1bGUgJ3RfZXJyb3InIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKSkKKworICAgIGRlZiB0ZXN0X2xleF9lcnJvcjQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLHJ1bl9pbXBvcnQsImxleF9lcnJvcjQiKQorICAgICAgICByZXN1bHQgPSBzeXMuc3RkZXJyLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsZXhfZXJyb3I0LnB5OjIwOiBSdWxlICd0X2Vycm9yJyBoYXMgdG9vIG1hbnkgYXJndW1lbnRzXG4iKSkKKworICAgIGRlZiB0ZXN0X2xleF9pZ25vcmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLHJ1bl9pbXBvcnQsImxleF9pZ25vcmUiKQorICAgICAgICByZXN1bHQgPSBzeXMuc3RkZXJyLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsZXhfaWdub3JlLnB5OjIwOiBSdWxlICd0X2lnbm9yZScgbXVzdCBiZSBkZWZpbmVkIGFzIGEgc3RyaW5nXG4iKSkKKworICAgIGRlZiB0ZXN0X2xleF9pZ25vcmUyKHNlbGYpOgorICAgICAgICBydW5faW1wb3J0KCJsZXhfaWdub3JlMiIpCisgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRfaWdub3JlIGNvbnRhaW5zIGEgbGl0ZXJhbCBiYWNrc2xhc2ggJ1xcJ1xuIikpCisKKworICAgIGRlZiB0ZXN0X2xleF9yZTEoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLHJ1bl9pbXBvcnQsImxleF9yZTEiKQorICAgICAgICByZXN1bHQgPSBzeXMuc3RkZXJyLmdldHZhbHVlKCkKKyAgICAgICAgaWYgc3lzLmhleHZlcnNpb24gPCAweDMwNTAwMDA6CisgICAgICAgICAgICBtc2cgPSAiSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb24gZm9yIHJ1bGUgJ3RfTlVNQkVSJy4gdW5iYWxhbmNlZCBwYXJlbnRoZXNpc1xuIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbXNnID0gIkludmFsaWQgcmVndWxhciBleHByZXNzaW9uIGZvciBydWxlICd0X05VTUJFUicuIG1pc3NpbmcgKSwgdW50ZXJtaW5hdGVkIHN1YnBhdHRlcm4gYXQgcG9zaXRpb24gMCIKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zPVRydWUpKQorCisgICAgZGVmIHRlc3RfbGV4X3JlMihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IscnVuX2ltcG9ydCwibGV4X3JlMiIpCisgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgcnVsZSAndF9QTFVTJyBtYXRjaGVzIGVtcHR5IHN0cmluZ1xuIikpCisKKyAgICBkZWYgdGVzdF9sZXhfcmUzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvcixydW5faW1wb3J0LCJsZXhfcmUzIikKKyAgICAgICAgcmVzdWx0ID0gc3lzLnN0ZGVyci5nZXR2YWx1ZSgpCisjICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgcnVsZSAndF9QT1VORCcuIHVuYmFsYW5jZWQgcGFyZW50aGVzaXNcbiIKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFrZSBzdXJlICcjJyBpbiBydWxlICd0X1BPVU5EJyBpcyBlc2NhcGVkIHdpdGggJ1xcIydcbiIpKQorCisgICAgICAgIGlmIHN5cy5oZXh2ZXJzaW9uIDwgMHgzMDUwMDAwOgorICAgICAgICAgICAgbXNnID0gKCJJbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgcnVsZSAndF9QT1VORCcuIHVuYmFsYW5jZWQgcGFyZW50aGVzaXNcbiIKKyAgICAgICAgICAgICAgICAgICAiTWFrZSBzdXJlICcjJyBpbiBydWxlICd0X1BPVU5EJyBpcyBlc2NhcGVkIHdpdGggJ1xcIydcbiIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtc2cgPSAoIkludmFsaWQgcmVndWxhciBleHByZXNzaW9uIGZvciBydWxlICd0X1BPVU5EJy4gbWlzc2luZyApLCB1bnRlcm1pbmF0ZWQgc3VicGF0dGVybiBhdCBwb3NpdGlvbiAwXG4iCisgICAgICAgICAgICAgICAgICAgIkVSUk9SOiBNYWtlIHN1cmUgJyMnIGluIHJ1bGUgJ3RfUE9VTkQnIGlzIGVzY2FwZWQgd2l0aCAnXCMnIikKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zPVRydWUpLCByZXN1bHQpCisKKyAgICBkZWYgdGVzdF9sZXhfcnVsZTEoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLHJ1bl9pbXBvcnQsImxleF9ydWxlMSIpCisgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRfTlVNQkVSIG5vdCBkZWZpbmVkIGFzIGEgZnVuY3Rpb24gb3Igc3RyaW5nXG4iKSkKKworICAgIGRlZiB0ZXN0X2xleF9ydWxlMihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IscnVuX2ltcG9ydCwibGV4X3J1bGUyIikKKyAgICAgICAgcmVzdWx0ID0gc3lzLnN0ZGVyci5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhjaGVja19leHBlY3RlZChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGV4X3J1bGUyLnB5OjE4OiBSdWxlICd0X05VTUJFUicgcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIpKQorCisgICAgZGVmIHRlc3RfbGV4X3J1bGUzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvcixydW5faW1wb3J0LCJsZXhfcnVsZTMiKQorICAgICAgICByZXN1bHQgPSBzeXMuc3RkZXJyLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsZXhfcnVsZTMucHk6MTg6IFJ1bGUgJ3RfTlVNQkVSJyBoYXMgdG9vIG1hbnkgYXJndW1lbnRzXG4iKSkKKworCisgICAgZGVmIHRlc3RfbGV4X3N0YXRlMShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IscnVuX2ltcG9ydCwibGV4X3N0YXRlMSIpCisgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhdGVzIG11c3QgYmUgZGVmaW5lZCBhcyBhIHR1cGxlIG9yIGxpc3RcbiIpKQorCisgICAgZGVmIHRlc3RfbGV4X3N0YXRlMihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IscnVuX2ltcG9ydCwibGV4X3N0YXRlMiIpCisgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgc3RhdGUgc3BlY2lmaWVyICdjb21tZW50Jy4gTXVzdCBiZSBhIHR1cGxlIChzdGF0ZW5hbWUsJ2V4Y2x1c2l2ZXxpbmNsdXNpdmUnKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgc3RhdGUgc3BlY2lmaWVyICdleGFtcGxlJy4gTXVzdCBiZSBhIHR1cGxlIChzdGF0ZW5hbWUsJ2V4Y2x1c2l2ZXxpbmNsdXNpdmUnKVxuIikpCisKKyAgICBkZWYgdGVzdF9sZXhfc3RhdGUzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvcixydW5faW1wb3J0LCJsZXhfc3RhdGUzIikKKyAgICAgICAgcmVzdWx0ID0gc3lzLnN0ZGVyci5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhjaGVja19leHBlY3RlZChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RhdGUgbmFtZSAxIG11c3QgYmUgYSBzdHJpbmdcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBydWxlcyBkZWZpbmVkIGZvciBzdGF0ZSAnZXhhbXBsZSdcbiIpKQorCisgICAgZGVmIHRlc3RfbGV4X3N0YXRlNChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IscnVuX2ltcG9ydCwibGV4X3N0YXRlNCIpCisgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0YXRlIHR5cGUgZm9yIHN0YXRlIGNvbW1lbnQgbXVzdCBiZSAnaW5jbHVzaXZlJyBvciAnZXhjbHVzaXZlJ1xuIikpCisKKworICAgIGRlZiB0ZXN0X2xleF9zdGF0ZTUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLHJ1bl9pbXBvcnQsImxleF9zdGF0ZTUiKQorICAgICAgICByZXN1bHQgPSBzeXMuc3RkZXJyLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdGF0ZSAnY29tbWVudCcgYWxyZWFkeSBkZWZpbmVkXG4iKSkKKworICAgIGRlZiB0ZXN0X2xleF9zdGF0ZV9ub2Vycm9yKHNlbGYpOgorICAgICAgICBydW5faW1wb3J0KCJsZXhfc3RhdGVfbm9lcnJvciIpCisgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIGVycm9yIHJ1bGUgaXMgZGVmaW5lZCBmb3IgZXhjbHVzaXZlIHN0YXRlICdjb21tZW50J1xuIikpICAgIAorCisgICAgZGVmIHRlc3RfbGV4X3N0YXRlX25vcnVsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IscnVuX2ltcG9ydCwibGV4X3N0YXRlX25vcnVsZSIpCisgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIHJ1bGVzIGRlZmluZWQgZm9yIHN0YXRlICdleGFtcGxlJ1xuIikpCisKKyAgICBkZWYgdGVzdF9sZXhfdG9rZW4xKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvcixydW5faW1wb3J0LCJsZXhfdG9rZW4xIikKKyAgICAgICAgcmVzdWx0ID0gc3lzLnN0ZGVyci5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhjaGVja19leHBlY3RlZChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gdG9rZW4gbGlzdCBpcyBkZWZpbmVkXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUnVsZSAndF9OVU1CRVInIGRlZmluZWQgZm9yIGFuIHVuc3BlY2lmaWVkIHRva2VuIE5VTUJFUlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJ1bGUgJ3RfUExVUycgZGVmaW5lZCBmb3IgYW4gdW5zcGVjaWZpZWQgdG9rZW4gUExVU1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJ1bGUgJ3RfTUlOVVMnIGRlZmluZWQgZm9yIGFuIHVuc3BlY2lmaWVkIHRva2VuIE1JTlVTXG4iCispKQorCisgICAgZGVmIHRlc3RfbGV4X3Rva2VuMihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IscnVuX2ltcG9ydCwibGV4X3Rva2VuMiIpCisgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRva2VucyBtdXN0IGJlIGEgbGlzdCBvciB0dXBsZVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJ1bGUgJ3RfTlVNQkVSJyBkZWZpbmVkIGZvciBhbiB1bnNwZWNpZmllZCB0b2tlbiBOVU1CRVJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSdWxlICd0X1BMVVMnIGRlZmluZWQgZm9yIGFuIHVuc3BlY2lmaWVkIHRva2VuIFBMVVNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSdWxlICd0X01JTlVTJyBkZWZpbmVkIGZvciBhbiB1bnNwZWNpZmllZCB0b2tlbiBNSU5VU1xuIgorKSkKKyAgICAKKyAgICBkZWYgdGVzdF9sZXhfdG9rZW4zKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvcixydW5faW1wb3J0LCJsZXhfdG9rZW4zIikKKyAgICAgICAgcmVzdWx0ID0gc3lzLnN0ZGVyci5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhjaGVja19leHBlY3RlZChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUnVsZSAndF9NSU5VUycgZGVmaW5lZCBmb3IgYW4gdW5zcGVjaWZpZWQgdG9rZW4gTUlOVVNcbiIpKQorCisKKyAgICBkZWYgdGVzdF9sZXhfdG9rZW40KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvcixydW5faW1wb3J0LCJsZXhfdG9rZW40IikKKyAgICAgICAgcmVzdWx0ID0gc3lzLnN0ZGVyci5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhjaGVja19leHBlY3RlZChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIHRva2VuIG5hbWUgJy0nXG4iKSkKKworCisgICAgZGVmIHRlc3RfbGV4X3Rva2VuNShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcnVuX2ltcG9ydCgibGV4X3Rva2VuNSIpCisgICAgICAgIGV4Y2VwdCBwbHkubGV4LkxleEVycm9yOgorICAgICAgICAgICAgZSA9IHN5cy5leGNfaW5mbygpWzFdCisgICAgICAgIHNlbGYuYXNzZXJ0XyhjaGVja19leHBlY3RlZChzdHIoZSksImxleF90b2tlbjUucHk6MTk6IFJ1bGUgJ3RfTlVNQkVSJyByZXR1cm5lZCBhbiB1bmtub3duIHRva2VuIHR5cGUgJ05VTSciKSkKKworICAgIGRlZiB0ZXN0X2xleF90b2tlbl9kdXAoc2VsZik6CisgICAgICAgIHJ1bl9pbXBvcnQoImxleF90b2tlbl9kdXAiKQorICAgICAgICByZXN1bHQgPSBzeXMuc3RkZXJyLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUb2tlbiAnTUlOVVMnIG11bHRpcGx5IGRlZmluZWRcbiIpKSAgIAorCisgICAgICAgIAorICAgIGRlZiB0ZXN0X2xleF9saXRlcmFsMShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IscnVuX2ltcG9ydCwibGV4X2xpdGVyYWwxIikKKyAgICAgICAgcmVzdWx0ID0gc3lzLnN0ZGVyci5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhjaGVja19leHBlY3RlZChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBsaXRlcmFsICcqKicuIE11c3QgYmUgYSBzaW5nbGUgY2hhcmFjdGVyXG4iKSkKKworICAgIGRlZiB0ZXN0X2xleF9saXRlcmFsMihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IscnVuX2ltcG9ydCwibGV4X2xpdGVyYWwyIikKKyAgICAgICAgcmVzdWx0ID0gc3lzLnN0ZGVyci5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhjaGVja19leHBlY3RlZChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBsaXRlcmFscyBzcGVjaWZpY2F0aW9uLiBsaXRlcmFscyBtdXN0IGJlIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVyc1xuIikpCisKK2ltcG9ydCBvcworaW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzaHV0aWwKKworIyBUZXN0cyByZWxhdGVkIHRvIHZhcmlvdXMgYnVpbGQgb3B0aW9ucyBhc3NvY2lhdGVkIHdpdGggbGV4ZXJzCitjbGFzcyBMZXhCdWlsZE9wdGlvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN5cy5zdGRlcnIgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHN5cy5zdGRvdXQgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzeXMuc3RkZXJyID0gc3lzLl9fc3RkZXJyX18KKyAgICAgICAgc3lzLnN0ZG91dCA9IHN5cy5fX3N0ZG91dF9fCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoImxleGRpciIpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfbGV4X21vZHVsZShzZWxmKToKKyAgICAgICAgcnVuX2ltcG9ydCgibGV4X21vZHVsZSIpCisgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRvdXQuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihOVU1CRVIsMywxLDApXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFBMVVMsJysnLDEsMSlcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTlVNQkVSLDQsMSwyKVxuIikpCisgICAgICAgIAorICAgIGRlZiB0ZXN0X2xleF9vYmplY3Qoc2VsZik6CisgICAgICAgIHJ1bl9pbXBvcnQoImxleF9vYmplY3QiKQorICAgICAgICByZXN1bHQgPSBzeXMuc3Rkb3V0LmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTlVNQkVSLDMsMSwwKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihQTFVTLCcrJywxLDEpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKE5VTUJFUiw0LDEsMilcbiIpKQorCisgICAgZGVmIHRlc3RfbGV4X2Nsb3N1cmUoc2VsZik6CisgICAgICAgIHJ1bl9pbXBvcnQoImxleF9jbG9zdXJlIikKKyAgICAgICAgcmVzdWx0ID0gc3lzLnN0ZG91dC5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhjaGVja19leHBlY3RlZChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKE5VTUJFUiwzLDEsMClcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoUExVUywnKycsMSwxKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihOVU1CRVIsNCwxLDIpXG4iKSkKKworICAgIGRlZiB0ZXN0X2xleF9vcHRpbWl6ZShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MucmVtb3ZlKCJsZXh0YWIucHkiKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MucmVtb3ZlKCJsZXh0YWIucHljIikKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnJlbW92ZSgibGV4dGFiLnB5byIpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBydW5faW1wb3J0KCJsZXhfb3B0aW1pemUiKQorCisgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRvdXQuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihOVU1CRVIsMywxLDApXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFBMVVMsJysnLDEsMSlcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTlVNQkVSLDQsMSwyKVxuIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cygibGV4dGFiLnB5IikpCisKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCctTycsJ2xleF9vcHRpbWl6ZS5weSddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICByZXN1bHQgPSBwLnN0ZG91dC5yZWFkKCkKKworICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihOVU1CRVIsMywxLDApXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFBMVVMsJysnLDEsMSlcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTlVNQkVSLDQsMSwyKVxuIikpCisgICAgICAgIGlmIHRlc3RfcHlvOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHB5bW9kdWxlX291dF9leGlzdHMoImxleHRhYi5weW8iLCAxKSkKKyAgICAgICAgICAgIHB5bW9kdWxlX291dF9yZW1vdmUoImxleHRhYi5weW8iLCAxKQorCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwnLU9PJywnbGV4X29wdGltaXplLnB5J10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIHJlc3VsdCA9IHAuc3Rkb3V0LnJlYWQoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihOVU1CRVIsMywxLDApXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFBMVVMsJysnLDEsMSlcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTlVNQkVSLDQsMSwyKVxuIikpCisKKyAgICAgICAgaWYgdGVzdF9weW86CisgICAgICAgICAgICBzZWxmLmFzc2VydF8ocHltb2R1bGVfb3V0X2V4aXN0cygibGV4dGFiLnB5byIsIDIpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5yZW1vdmUoImxleHRhYi5weSIpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBweW1vZHVsZV9vdXRfcmVtb3ZlKCJsZXh0YWIucHljIikKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHB5bW9kdWxlX291dF9yZW1vdmUoImxleHRhYi5weW8iLCAyKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2xleF9vcHRpbWl6ZTIoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnJlbW92ZSgib3B0MnRhYi5weSIpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5yZW1vdmUoIm9wdDJ0YWIucHljIikKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnJlbW92ZSgib3B0MnRhYi5weW8iKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcnVuX2ltcG9ydCgibGV4X29wdGltaXplMiIpCisgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRvdXQuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihOVU1CRVIsMywxLDApXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFBMVVMsJysnLDEsMSlcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTlVNQkVSLDQsMSwyKVxuIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cygib3B0MnRhYi5weSIpKQorCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwnLU8nLCdsZXhfb3B0aW1pemUyLnB5J10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIHJlc3VsdCA9IHAuc3Rkb3V0LnJlYWQoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihOVU1CRVIsMywxLDApXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFBMVVMsJysnLDEsMSlcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTlVNQkVSLDQsMSwyKVxuIikpCisgICAgICAgIGlmIHRlc3RfcHlvOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHB5bW9kdWxlX291dF9leGlzdHMoIm9wdDJ0YWIucHlvIiwgMSkpCisgICAgICAgICAgICBweW1vZHVsZV9vdXRfcmVtb3ZlKCJvcHQydGFiLnB5byIsIDEpCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwnLU9PJywnbGV4X29wdGltaXplMi5weSddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICByZXN1bHQgPSBwLnN0ZG91dC5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTlVNQkVSLDMsMSwwKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihQTFVTLCcrJywxLDEpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKE5VTUJFUiw0LDEsMilcbiIpKQorICAgICAgICBpZiB0ZXN0X3B5bzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhweW1vZHVsZV9vdXRfZXhpc3RzKCJvcHQydGFiLnB5byIsIDIpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5yZW1vdmUoIm9wdDJ0YWIucHkiKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHltb2R1bGVfb3V0X3JlbW92ZSgib3B0MnRhYi5weWMiKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHltb2R1bGVfb3V0X3JlbW92ZSgib3B0MnRhYi5weW8iLCAyKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2xleF9vcHRpbWl6ZTMoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoImxleGRpciIpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICAKKyAgICAgICAgb3MubWtkaXIoImxleGRpciIpCisgICAgICAgIG9zLm1rZGlyKCJsZXhkaXIvc3ViIikKKyAgICAgICAgb3BlbigibGV4ZGlyL19faW5pdF9fLnB5IiwidyIpLndyaXRlKCIiKQorICAgICAgICBvcGVuKCJsZXhkaXIvc3ViL19faW5pdF9fLnB5IiwidyIpLndyaXRlKCIiKQorICAgICAgICBydW5faW1wb3J0KCJsZXhfb3B0aW1pemUzIikKKyAgICAgICAgcmVzdWx0ID0gc3lzLnN0ZG91dC5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhjaGVja19leHBlY3RlZChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKE5VTUJFUiwzLDEsMClcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoUExVUywnKycsMSwxKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihOVU1CRVIsNCwxLDIpXG4iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKCJsZXhkaXIvc3ViL2NhbGN0YWIucHkiKSkKKworICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsJy1PJywnbGV4X29wdGltaXplMy5weSddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICByZXN1bHQgPSBwLnN0ZG91dC5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTlVNQkVSLDMsMSwwKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihQTFVTLCcrJywxLDEpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKE5VTUJFUiw0LDEsMilcbiIpKQorICAgICAgICBpZiB0ZXN0X3B5bzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhweW1vZHVsZV9vdXRfZXhpc3RzKCJsZXhkaXIvc3ViL2NhbGN0YWIucHlvIiwgMSkpCisgICAgICAgICAgICBweW1vZHVsZV9vdXRfcmVtb3ZlKCJsZXhkaXIvc3ViL2NhbGN0YWIucHlvIiwgMSkKKworICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsJy1PTycsJ2xleF9vcHRpbWl6ZTMucHknXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgcmVzdWx0ID0gcC5zdGRvdXQucmVhZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhjaGVja19leHBlY3RlZChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKE5VTUJFUiwzLDEsMClcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoUExVUywnKycsMSwxKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihOVU1CRVIsNCwxLDIpXG4iKSkKKyAgICAgICAgaWYgdGVzdF9weW86CisgICAgICAgICAgICBzZWxmLmFzc2VydF8ocHltb2R1bGVfb3V0X2V4aXN0cygibGV4ZGlyL3N1Yi9jYWxjdGFiLnB5byIsIDIpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzaHV0aWwucm10cmVlKCJsZXhkaXIiKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2xleF9vcHRfYWxpYXMoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnJlbW92ZSgiYWxpYXN0YWIucHkiKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MucmVtb3ZlKCJhbGlhc3RhYi5weWMiKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MucmVtb3ZlKCJhbGlhc3RhYi5weW8iKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcnVuX2ltcG9ydCgibGV4X29wdF9hbGlhcyIpCisgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRvdXQuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihOVU1CRVIsMywxLDApXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKCssJysnLDEsMSlcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTlVNQkVSLDQsMSwyKVxuIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cygiYWxpYXN0YWIucHkiKSkKKworICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsJy1PJywnbGV4X29wdF9hbGlhcy5weSddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICByZXN1bHQgPSBwLnN0ZG91dC5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTlVNQkVSLDMsMSwwKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigrLCcrJywxLDEpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKE5VTUJFUiw0LDEsMilcbiIpKQorICAgICAgICBpZiB0ZXN0X3B5bzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhweW1vZHVsZV9vdXRfZXhpc3RzKCJhbGlhc3RhYi5weW8iLCAxKSkKKyAgICAgICAgICAgIHB5bW9kdWxlX291dF9yZW1vdmUoImFsaWFzdGFiLnB5byIsIDEpCisKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCctT08nLCdsZXhfb3B0X2FsaWFzLnB5J10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIHJlc3VsdCA9IHAuc3Rkb3V0LnJlYWQoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihOVU1CRVIsMywxLDApXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKCssJysnLDEsMSlcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTlVNQkVSLDQsMSwyKVxuIikpCisKKyAgICAgICAgaWYgdGVzdF9weW86CisgICAgICAgICAgICBzZWxmLmFzc2VydF8ocHltb2R1bGVfb3V0X2V4aXN0cygiYWxpYXN0YWIucHlvIiwgMikpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnJlbW92ZSgiYWxpYXN0YWIucHkiKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHltb2R1bGVfb3V0X3JlbW92ZSgiYWxpYXN0YWIucHljIikKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHB5bW9kdWxlX291dF9yZW1vdmUoImFsaWFzdGFiLnB5byIsIDIpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfbGV4X21hbnlfdG9rZW5zKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5yZW1vdmUoIm1hbnl0YWIucHkiKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MucmVtb3ZlKCJtYW55dGFiLnB5YyIpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5yZW1vdmUoIm1hbnl0YWIucHlvIikKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHJ1bl9pbXBvcnQoImxleF9tYW55X3Rva2VucyIpCisgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRvdXQuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihUT0szNCwnVE9LMzQ6JywxLDApXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFRPSzE0MywnVE9LMTQzOicsMSw3KVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihUT0syNjksJ1RPSzI2OTonLDEsMTUpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFRPSzM3MiwnVE9LMzcyOicsMSwyMylcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoVE9LNDUyLCdUT0s0NTI6JywxLDMxKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihUT0s1NjEsJ1RPSzU2MTonLDEsMzkpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFRPSzk5OSwnVE9LOTk5OicsMSw0NylcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKCJtYW55dGFiLnB5IikpCisKKyAgICAgICAgaWYgaW1wbGVtZW50YXRpb24oKSA9PSAnQ1B5dGhvbic6CisgICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsJy1PJywnbGV4X21hbnlfdG9rZW5zLnB5J10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICAgICAgcmVzdWx0ID0gcC5zdGRvdXQucmVhZCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoVE9LMzQsJ1RPSzM0OicsMSwwKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoVE9LMTQzLCdUT0sxNDM6JywxLDcpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihUT0syNjksJ1RPSzI2OTonLDEsMTUpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihUT0szNzIsJ1RPSzM3MjonLDEsMjMpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihUT0s0NTIsJ1RPSzQ1MjonLDEsMzEpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihUT0s1NjEsJ1RPSzU2MTonLDEsMzkpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihUT0s5OTksJ1RPSzk5OTonLDEsNDcpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHB5bW9kdWxlX291dF9leGlzdHMoIm1hbnl0YWIucHlvIiwgMSkpCisgICAgICAgICAgICBweW1vZHVsZV9vdXRfcmVtb3ZlKCJtYW55dGFiLnB5byIsIDEpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnJlbW92ZSgibWFueXRhYi5weSIpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5yZW1vdmUoIm1hbnl0YWIucHljIikKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnJlbW92ZSgibWFueXRhYi5weW8iKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgCisjIFRlc3RzIHJlbGF0ZWQgdG8gcnVuLXRpbWUgYmVoYXZpb3Igb2YgbGV4ZXJzCitjbGFzcyBMZXhSdW5UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzeXMuc3RkZXJyID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBzeXMuc3Rkb3V0ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc3lzLnN0ZGVyciA9IHN5cy5fX3N0ZGVycl9fCisgICAgICAgIHN5cy5zdGRvdXQgPSBzeXMuX19zdGRvdXRfXworCisgICAgZGVmIHRlc3RfbGV4X2hlZGl0KHNlbGYpOgorICAgICAgICBydW5faW1wb3J0KCJsZXhfaGVkaXQiKQorICAgICAgICByZXN1bHQgPSBzeXMuc3Rkb3V0LmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoSF9FRElUX0RFU0NSSVBUT1IsJ2FiYycsMSwwKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihIX0VESVRfREVTQ1JJUFRPUiwnYWJjZGVmZ2hpaicsMSw2KVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihIX0VESVRfREVTQ1JJUFRPUiwneHknLDEsMjApXG4iKSkKKyAgICAgICAKKyAgICBkZWYgdGVzdF9sZXhfc3RhdGVfdHJ5KHNlbGYpOgorICAgICAgICBydW5faW1wb3J0KCJsZXhfc3RhdGVfdHJ5IikKKyAgICAgICAgcmVzdWx0ID0gc3lzLnN0ZG91dC5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhjaGVja19leHBlY3RlZChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKE5VTUJFUiwnMycsMSwwKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihQTFVTLCcrJywxLDIpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKE5VTUJFUiwnNCcsMSw0KVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVudGVyaW5nIGNvbW1lbnQgc3RhdGVcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21tZW50IGJvZHkgTGV4VG9rZW4oYm9keV9wYXJ0LCdUaGlzIGlzIGEgY29tbWVudCAqLycsMSw5KVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihQTFVTLCcrJywxLDMwKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihOVU1CRVIsJzEwJywxLDMyKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkgICAgCisKKworCit1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3BseS90ZXN0L3Rlc3R5YWNjLnB5IGIvcGx5L3Rlc3QvdGVzdHlhY2MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U2OWYwOQotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L3Rlc3R5YWNjLnB5CkBAIC0wLDAgKzEsNDUyIEBACisjIHRlc3R5YWNjLnB5CisKK2ltcG9ydCB1bml0dGVzdAordHJ5OgorICAgIGltcG9ydCBTdHJpbmdJTworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGltcG9ydCBpbyBhcyBTdHJpbmdJTworCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCB3YXJuaW5ncworaW1wb3J0IHJlCitpbXBvcnQgcGxhdGZvcm0KKworc3lzLnBhdGguaW5zZXJ0KDAsIi4uIikKK3N5cy50cmFjZWJhY2tsaW1pdCA9IDAKKworaW1wb3J0IHBseS55YWNjCisKK2RlZiBtYWtlX3B5bW9kdWxlX3BhdGgoZmlsZW5hbWUpOgorICAgIHBhdGggPSBvcy5wYXRoLmRpcm5hbWUoZmlsZW5hbWUpCisgICAgZmlsZSA9IG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpCisgICAgbW9kLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGUpCisKKyAgICBpZiBzeXMuaGV4dmVyc2lvbiA+PSAweDMwNDAwMDA6CisgICAgICAgIGltcG9ydCBpbXBvcnRsaWIudXRpbAorICAgICAgICBmdWxscGF0aCA9IGltcG9ydGxpYi51dGlsLmNhY2hlX2Zyb21fc291cmNlKGZpbGVuYW1lLCBleHQ9PScucHljJykKKyAgICBlbGlmIHN5cy5oZXh2ZXJzaW9uID49IDB4MzAyMDAwMDoKKyAgICAgICAgaW1wb3J0IGltcAorICAgICAgICBtb2RuYW1lID0gbW9kKyIuIitpbXAuZ2V0X3RhZygpK2V4dAorICAgICAgICBmdWxscGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCdfX3B5Y2FjaGVfXycsbW9kbmFtZSkKKyAgICBlbHNlOgorICAgICAgICBmdWxscGF0aCA9IGZpbGVuYW1lCisgICAgcmV0dXJuIGZ1bGxwYXRoCisKK2RlZiBweW1vZHVsZV9vdXRfZXhpc3RzKGZpbGVuYW1lKToKKyAgICByZXR1cm4gb3MucGF0aC5leGlzdHMobWFrZV9weW1vZHVsZV9wYXRoKGZpbGVuYW1lKSkKKworZGVmIHB5bW9kdWxlX291dF9yZW1vdmUoZmlsZW5hbWUpOgorICAgIG9zLnJlbW92ZShtYWtlX3B5bW9kdWxlX3BhdGgoZmlsZW5hbWUpKQorCitkZWYgaW1wbGVtZW50YXRpb24oKToKKyAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKS5zdGFydHN3aXRoKCJKYXZhIik6CisgICAgICAgIHJldHVybiAiSnl0aG9uIgorICAgIGVsaWYgaGFzYXR0cihzeXMsICJweXB5X3ZlcnNpb25faW5mbyIpOgorICAgICAgICByZXR1cm4gIlB5UHkiCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuICJDUHl0aG9uIgorCisjIENoZWNrIHRoZSBvdXRwdXQgdG8gc2VlIGlmIGl0IGNvbnRhaW5zIGFsbCBvZiBhIHNldCBvZiBleHBlY3RlZCBvdXRwdXQgbGluZXMuCisjIFRoaXMgYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9uIGxvb2tzIHdlaXJkLCBidXQgaXMgbmVlZGVkIHRvIHByb3Blcmx5IGhhbmRsZQorIyBzb21lIHZhcmlhdGlvbnMgaW4gZXJyb3IgbWVzc2FnZSBvcmRlciB0aGF0IG9jY3VycyBkdWUgdG8gZGljdCBoYXNoIHRhYmxlCisjIHJhbmRvbWl6YXRpb24gdGhhdCB3YXMgaW50cm9kdWNlZCBpbiBQeXRob24gMy4zCitkZWYgY2hlY2tfZXhwZWN0ZWQocmVzdWx0LCBleHBlY3RlZCk6CisgICAgIyBOb3JtYWxpemUgJ3N0YXRlIG4nIHRleHQgdG8gYWNjb3VudCBmb3IgcmFuZG9taXphdGlvbiBlZmZlY3RzIGluIFB5dGhvbiAzLjMKKyAgICBleHBlY3RlZCA9IHJlLnN1YihyJyBzdGF0ZSBcZCsnLCAnc3RhdGUgPG4+JywgZXhwZWN0ZWQpCisgICAgcmVzdWx0ID0gcmUuc3ViKHInIHN0YXRlIFxkKycsICdzdGF0ZSA8bj4nLCByZXN1bHQpCisKKyAgICByZXN1bHRsaW5lcyA9IHNldCgpCisgICAgZm9yIGxpbmUgaW4gcmVzdWx0LnNwbGl0bGluZXMoKToKKyAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCJXQVJOSU5HOiAiKToKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lWzk6XQorICAgICAgICBlbGlmIGxpbmUuc3RhcnRzd2l0aCgiRVJST1I6ICIpOgorICAgICAgICAgICAgbGluZSA9IGxpbmVbNzpdCisgICAgICAgIHJlc3VsdGxpbmVzLmFkZChsaW5lKQorCisgICAgIyBTZWxlY3RpdmVseSByZW1vdmUgZXhwZWN0ZWQgbGluZXMgZnJvbSB0aGUgb3V0cHV0CisgICAgZm9yIGVsaW5lIGluIGV4cGVjdGVkLnNwbGl0bGluZXMoKToKKyAgICAgICAgcmVzdWx0bGluZXMgPSBzZXQobGluZSBmb3IgbGluZSBpbiByZXN1bHRsaW5lcyBpZiBub3QgbGluZS5lbmRzd2l0aChlbGluZSkpCisKKyAgICAjIFJldHVybiBUcnVlIGlmIG5vIHJlc3VsdCBsaW5lcyByZW1haW4KKyAgICByZXR1cm4gbm90IGJvb2wocmVzdWx0bGluZXMpCisKK2RlZiBydW5faW1wb3J0KG1vZHVsZSk6CisgICAgY29kZSA9ICJpbXBvcnQgIittb2R1bGUKKyAgICBleGVjKGNvZGUpCisgICAgZGVsIHN5cy5tb2R1bGVzW21vZHVsZV0KKyAgICAKKyMgVGVzdHMgcmVsYXRlZCB0byBlcnJvcnMgYW5kIHdhcm5pbmdzIHdoZW4gYnVpbGRpbmcgcGFyc2VycworY2xhc3MgWWFjY0Vycm9yV2FybmluZ1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN5cy5zdGRlcnIgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHN5cy5zdGRvdXQgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnJlbW92ZSgicGFyc2V0YWIucHkiKQorICAgICAgICAgICAgcHltb2R1bGVfb3V0X3JlbW92ZSgicGFyc2V0YWIucHljIikKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIAorICAgICAgICBpZiBzeXMuaGV4dmVyc2lvbiA+PSAweDMwMjAwMDA6CisgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygnaWdub3JlJywgY2F0ZWdvcnk9UmVzb3VyY2VXYXJuaW5nKQorICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygnaWdub3JlJywgY2F0ZWdvcnk9RGVwcmVjYXRpb25XYXJuaW5nKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzeXMuc3RkZXJyID0gc3lzLl9fc3RkZXJyX18KKyAgICAgICAgc3lzLnN0ZG91dCA9IHN5cy5fX3N0ZG91dF9fCisgICAgZGVmIHRlc3RfeWFjY19iYWRhcmdzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhwbHkueWFjYy5ZYWNjRXJyb3IscnVuX2ltcG9ydCwieWFjY19iYWRhcmdzIikKKyAgICAgICAgcmVzdWx0ID0gc3lzLnN0ZGVyci5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhjaGVja19leHBlY3RlZChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieWFjY19iYWRhcmdzLnB5OjIzOiBSdWxlICdwX3N0YXRlbWVudF9hc3NpZ24nIGhhcyB0b28gbWFueSBhcmd1bWVudHNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5YWNjX2JhZGFyZ3MucHk6Mjc6IFJ1bGUgJ3Bfc3RhdGVtZW50X2V4cHInIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSAgICAgICAgCisgICAgZGVmIHRlc3RfeWFjY19iYWRpZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocGx5LnlhY2MuWWFjY0Vycm9yLHJ1bl9pbXBvcnQsInlhY2NfYmFkaWQiKQorICAgICAgICByZXN1bHQgPSBzeXMuc3RkZXJyLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5YWNjX2JhZGlkLnB5OjMyOiBJbGxlZ2FsIG5hbWUgJ2JhZCZydWxlJyBpbiBydWxlICdzdGF0ZW1lbnQnXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieWFjY19iYWRpZC5weTozNjogSWxsZWdhbCBydWxlIG5hbWUgJ2JhZCZydWxlJ1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKworICAgIGRlZiB0ZXN0X3lhY2NfYmFkcHJlYyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcnVuX2ltcG9ydCgieWFjY19iYWRwcmVjIikKKyAgICAgICAgZXhjZXB0IHBseS55YWNjLllhY2NFcnJvcjoKKyAgICAgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJlY2VkZW5jZSBtdXN0IGJlIGEgbGlzdCBvciB0dXBsZVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisgICAgZGVmIHRlc3RfeWFjY19iYWRwcmVjMihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocGx5LnlhY2MuWWFjY0Vycm9yLHJ1bl9pbXBvcnQsInlhY2NfYmFkcHJlYzIiKQorICAgICAgICByZXN1bHQgPSBzeXMuc3RkZXJyLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgcHJlY2VkZW5jZSB0YWJsZVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKworICAgIGRlZiB0ZXN0X3lhY2NfYmFkcHJlYzMoc2VsZik6CisgICAgICAgIHJ1bl9pbXBvcnQoInlhY2NfYmFkcHJlYzMiKQorICAgICAgICByZXN1bHQgPSBzeXMuc3RkZXJyLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmVjZWRlbmNlIGFscmVhZHkgc3BlY2lmaWVkIGZvciB0ZXJtaW5hbCAnTUlOVVMnXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGluZyBMQUxSIHRhYmxlc1xuIgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQorICAgICAgICAKKyAgICBkZWYgdGVzdF95YWNjX2JhZHJ1bGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHBseS55YWNjLllhY2NFcnJvcixydW5faW1wb3J0LCJ5YWNjX2JhZHJ1bGUiKQorICAgICAgICByZXN1bHQgPSBzeXMuc3RkZXJyLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5YWNjX2JhZHJ1bGUucHk6MjQ6IFN5bnRheCBlcnJvci4gRXhwZWN0ZWQgJzonXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieWFjY19iYWRydWxlLnB5OjI4OiBTeW50YXggZXJyb3IgaW4gcnVsZSAnc3RhdGVtZW50J1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInlhY2NfYmFkcnVsZS5weTozMzogU3ludGF4IGVycm9yLiBFeHBlY3RlZCAnOidcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5YWNjX2JhZHJ1bGUucHk6NDI6IFN5bnRheCBlcnJvci4gRXhwZWN0ZWQgJzonXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQorCisgICAgZGVmIHRlc3RfeWFjY19iYWR0b2soc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJ1bl9pbXBvcnQoInlhY2NfYmFkdG9rIikKKyAgICAgICAgZXhjZXB0IHBseS55YWNjLllhY2NFcnJvcjoKKyAgICAgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG9rZW5zIG11c3QgYmUgYSBsaXN0IG9yIHR1cGxlXG4iKSkKKworICAgIGRlZiB0ZXN0X3lhY2NfZHVwKHNlbGYpOgorICAgICAgICBydW5faW1wb3J0KCJ5YWNjX2R1cCIpCisgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInlhY2NfZHVwLnB5OjI3OiBGdW5jdGlvbiBwX3N0YXRlbWVudCByZWRlZmluZWQuIFByZXZpb3VzbHkgZGVmaW5lZCBvbiBsaW5lIDIzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVG9rZW4gJ0VRVUFMUycgZGVmaW5lZCwgYnV0IG5vdCB1c2VkXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlcmUgaXMgMSB1bnVzZWQgdG9rZW5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0aW5nIExBTFIgdGFibGVzXG4iCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisgICAgZGVmIHRlc3RfeWFjY19lcnJvcjEoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJ1bl9pbXBvcnQoInlhY2NfZXJyb3IxIikKKyAgICAgICAgZXhjZXB0IHBseS55YWNjLllhY2NFcnJvcjoKKyAgICAgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieWFjY19lcnJvcjEucHk6NjE6IHBfZXJyb3IoKSByZXF1aXJlcyAxIGFyZ3VtZW50XG4iKSkKKworICAgIGRlZiB0ZXN0X3lhY2NfZXJyb3IyKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBydW5faW1wb3J0KCJ5YWNjX2Vycm9yMiIpCisgICAgICAgIGV4Y2VwdCBwbHkueWFjYy5ZYWNjRXJyb3I6CisgICAgICAgICAgICByZXN1bHQgPSBzeXMuc3RkZXJyLmdldHZhbHVlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhjaGVja19leHBlY3RlZChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInlhY2NfZXJyb3IyLnB5OjYxOiBwX2Vycm9yKCkgcmVxdWlyZXMgMSBhcmd1bWVudFxuIikpCisKKyAgICBkZWYgdGVzdF95YWNjX2Vycm9yMyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcnVuX2ltcG9ydCgieWFjY19lcnJvcjMiKQorICAgICAgICBleGNlcHQgcGx5LnlhY2MuWWFjY0Vycm9yOgorICAgICAgICAgICAgZSA9IHN5cy5leGNfaW5mbygpWzFdCisgICAgICAgICAgICByZXN1bHQgPSBzeXMuc3RkZXJyLmdldHZhbHVlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhjaGVja19leHBlY3RlZChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIidwX2Vycm9yJyBkZWZpbmVkLCBidXQgaXMgbm90IGEgZnVuY3Rpb24gb3IgbWV0aG9kXG4iKSkKKyAgICAgICAgICAgIAorICAgIGRlZiB0ZXN0X3lhY2NfZXJyb3I0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhwbHkueWFjYy5ZYWNjRXJyb3IscnVuX2ltcG9ydCwieWFjY19lcnJvcjQiKQorICAgICAgICByZXN1bHQgPSBzeXMuc3RkZXJyLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5YWNjX2Vycm9yNC5weTo2MjogSWxsZWdhbCBydWxlIG5hbWUgJ2Vycm9yJy4gQWxyZWFkeSBkZWZpbmVkIGFzIGEgdG9rZW5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisKKworICAgIGRlZiB0ZXN0X3lhY2NfZXJyb3I1KHNlbGYpOgorICAgICAgICBydW5faW1wb3J0KCJ5YWNjX2Vycm9yNSIpCisgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRvdXQuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdyb3VwIGF0IDM6MTAgdG8gMzoxMlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZGVmaW5lZCBuYW1lICdhJ1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN5bnRheCBlcnJvciBhdCAnYidcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTeW50YXggZXJyb3IgYXQgNDoxOCB0byA0OjIyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXNzaWdubWVudCBFcnJvciBhdCAyOjUgdG8gNToyN1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEzXG4iCisgICAgICAgICAgICApKQorCisgICAgZGVmIHRlc3RfeWFjY19lcnJvcjYoc2VsZik6CisgICAgICAgIHJ1bl9pbXBvcnQoInlhY2NfZXJyb3I2IikKKyAgICAgICAgcmVzdWx0ID0gc3lzLnN0ZG91dC5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhjaGVja19leHBlY3RlZChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYT03XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGluZSAzOiBTeW50YXggZXJyb3IgYXQgJyonXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYz0yMVxuIgorICAgICAgICAgICAgKSkKKworICAgIGRlZiB0ZXN0X3lhY2NfZXJyb3I3KHNlbGYpOgorICAgICAgICBydW5faW1wb3J0KCJ5YWNjX2Vycm9yNyIpCisgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRvdXQuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImE9N1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpbmUgMzogU3ludGF4IGVycm9yIGF0ICcqJ1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImM9MjFcbiIKKyAgICAgICAgICAgICkpCisKKyAgICBkZWYgdGVzdF95YWNjX2luZihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocGx5LnlhY2MuWWFjY0Vycm9yLHJ1bl9pbXBvcnQsInlhY2NfaW5mIikKKyAgICAgICAgcmVzdWx0ID0gc3lzLnN0ZGVyci5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhjaGVja19leHBlY3RlZChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVG9rZW4gJ05VTUJFUicgZGVmaW5lZCwgYnV0IG5vdCB1c2VkXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlcmUgaXMgMSB1bnVzZWQgdG9rZW5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmZpbml0ZSByZWN1cnNpb24gZGV0ZWN0ZWQgZm9yIHN5bWJvbCAnc3RhdGVtZW50J1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZmluaXRlIHJlY3Vyc2lvbiBkZXRlY3RlZCBmb3Igc3ltYm9sICdleHByZXNzaW9uJ1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKyAgICBkZWYgdGVzdF95YWNjX2xpdGVyYWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHBseS55YWNjLllhY2NFcnJvcixydW5faW1wb3J0LCJ5YWNjX2xpdGVyYWwiKQorICAgICAgICByZXN1bHQgPSBzeXMuc3RkZXJyLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5YWNjX2xpdGVyYWwucHk6MzY6IExpdGVyYWwgdG9rZW4gJyoqJyBpbiBydWxlICdleHByZXNzaW9uJyBtYXkgb25seSBiZSBhIHNpbmdsZSBjaGFyYWN0ZXJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisgICAgZGVmIHRlc3RfeWFjY19taXNwbGFjZWQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHBseS55YWNjLllhY2NFcnJvcixydW5faW1wb3J0LCJ5YWNjX21pc3BsYWNlZCIpCisgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInlhY2NfbWlzcGxhY2VkLnB5OjMyOiBNaXNwbGFjZWQgJ3wnXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQorCisgICAgZGVmIHRlc3RfeWFjY19taXNzaW5nMShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocGx5LnlhY2MuWWFjY0Vycm9yLHJ1bl9pbXBvcnQsInlhY2NfbWlzc2luZzEiKQorICAgICAgICByZXN1bHQgPSBzeXMuc3RkZXJyLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5YWNjX21pc3NpbmcxLnB5OjI0OiBTeW1ib2wgJ2xvY2F0aW9uJyB1c2VkLCBidXQgbm90IGRlZmluZWQgYXMgYSB0b2tlbiBvciBhIHJ1bGVcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisKKyAgICBkZWYgdGVzdF95YWNjX25lc3RlZChzZWxmKToKKyAgICAgICAgcnVuX2ltcG9ydCgieWFjY19uZXN0ZWQiKQorICAgICAgICByZXN1bHQgPSBzeXMuc3Rkb3V0LmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQorCisgICAgZGVmIHRlc3RfeWFjY19ub2RvYyhzZWxmKToKKyAgICAgICAgcnVuX2ltcG9ydCgieWFjY19ub2RvYyIpCisgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInlhY2Nfbm9kb2MucHk6Mjc6IE5vIGRvY3VtZW50YXRpb24gc3RyaW5nIHNwZWNpZmllZCBpbiBmdW5jdGlvbiAncF9zdGF0ZW1lbnRfZXhwcicgKGlnbm9yZWQpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGluZyBMQUxSIHRhYmxlc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKworICAgIGRlZiB0ZXN0X3lhY2Nfbm9lcnJvcihzZWxmKToKKyAgICAgICAgcnVuX2ltcG9ydCgieWFjY19ub2Vycm9yIikKKyAgICAgICAgcmVzdWx0ID0gc3lzLnN0ZGVyci5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhjaGVja19leHBlY3RlZChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm8gcF9lcnJvcigpIGZ1bmN0aW9uIGlzIGRlZmluZWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0aW5nIExBTFIgdGFibGVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQorCisgICAgZGVmIHRlc3RfeWFjY19ub3Aoc2VsZik6CisgICAgICAgIHJ1bl9pbXBvcnQoInlhY2Nfbm9wIikKKyAgICAgICAgcmVzdWx0ID0gc3lzLnN0ZGVyci5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhjaGVja19leHBlY3RlZChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieWFjY19ub3AucHk6Mjc6IFBvc3NpYmxlIGdyYW1tYXIgcnVsZSAnc3RhdGVtZW50X2V4cHInIGRlZmluZWQgd2l0aG91dCBwXyBwcmVmaXhcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0aW5nIExBTFIgdGFibGVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQorCisgICAgZGVmIHRlc3RfeWFjY19ub3RmdW5jKHNlbGYpOgorICAgICAgICBydW5faW1wb3J0KCJ5YWNjX25vdGZ1bmMiKQorICAgICAgICByZXN1bHQgPSBzeXMuc3RkZXJyLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIncF9zdGF0ZW1lbnRfYXNzaWduJyBub3QgZGVmaW5lZCBhcyBhIGZ1bmN0aW9uXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVG9rZW4gJ0VRVUFMUycgZGVmaW5lZCwgYnV0IG5vdCB1c2VkXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlcmUgaXMgMSB1bnVzZWQgdG9rZW5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0aW5nIExBTFIgdGFibGVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQorICAgIGRlZiB0ZXN0X3lhY2Nfbm90b2soc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJ1bl9pbXBvcnQoInlhY2Nfbm90b2siKQorICAgICAgICBleGNlcHQgcGx5LnlhY2MuWWFjY0Vycm9yOgorICAgICAgICAgICAgcmVzdWx0ID0gc3lzLnN0ZGVyci5nZXR2YWx1ZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyB0b2tlbiBsaXN0IGlzIGRlZmluZWRcbiIpKQorCisgICAgZGVmIHRlc3RfeWFjY19ycihzZWxmKToKKyAgICAgICAgcnVuX2ltcG9ydCgieWFjY19yciIpCisgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdlbmVyYXRpbmcgTEFMUiB0YWJsZXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxIHJlZHVjZS9yZWR1Y2UgY29uZmxpY3RcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWR1Y2UvcmVkdWNlIGNvbmZsaWN0IGluIHN0YXRlIDE1IHJlc29sdmVkIHVzaW5nIHJ1bGUgKHN0YXRlbWVudCAtPiBOQU1FIEVRVUFMUyBOVU1CRVIpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVqZWN0ZWQgcnVsZSAoZXhwcmVzc2lvbiAtPiBOVU1CRVIpIGluIHN0YXRlIDE1XG4iCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisKKyAgICBkZWYgdGVzdF95YWNjX3JyX3VudXNlZChzZWxmKToKKyAgICAgICAgcnVuX2ltcG9ydCgieWFjY19ycl91bnVzZWQiKQorICAgICAgICByZXN1bHQgPSBzeXMuc3RkZXJyLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJubyBwX2Vycm9yKCkgZnVuY3Rpb24gaXMgZGVmaW5lZFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdlbmVyYXRpbmcgTEFMUiB0YWJsZXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzIHJlZHVjZS9yZWR1Y2UgY29uZmxpY3RzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVkdWNlL3JlZHVjZSBjb25mbGljdCBpbiBzdGF0ZSAxIHJlc29sdmVkIHVzaW5nIHJ1bGUgKHJ1bGUzIC0+IEEpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVqZWN0ZWQgcnVsZSAocnVsZTQgLT4gQSkgaW4gc3RhdGUgMVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZHVjZS9yZWR1Y2UgY29uZmxpY3QgaW4gc3RhdGUgMSByZXNvbHZlZCB1c2luZyBydWxlIChydWxlMyAtPiBBKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlamVjdGVkIHJ1bGUgKHJ1bGU1IC0+IEEpIGluIHN0YXRlIDFcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWR1Y2UvcmVkdWNlIGNvbmZsaWN0IGluIHN0YXRlIDEgcmVzb2x2ZWQgdXNpbmcgcnVsZSAocnVsZTQgLT4gQSlcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWplY3RlZCBydWxlIChydWxlNSAtPiBBKSBpbiBzdGF0ZSAxXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUnVsZSAocnVsZTUgLT4gQSkgaXMgbmV2ZXIgcmVkdWNlZFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKworICAgIGRlZiB0ZXN0X3lhY2Nfc2ltcGxlKHNlbGYpOgorICAgICAgICBydW5faW1wb3J0KCJ5YWNjX3NpbXBsZSIpCisgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdlbmVyYXRpbmcgTEFMUiB0YWJsZXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisKKyAgICBkZWYgdGVzdF95YWNjX3NyKHNlbGYpOgorICAgICAgICBydW5faW1wb3J0KCJ5YWNjX3NyIikKKyAgICAgICAgcmVzdWx0ID0gc3lzLnN0ZGVyci5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhjaGVja19leHBlY3RlZChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGluZyBMQUxSIHRhYmxlc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwIHNoaWZ0L3JlZHVjZSBjb25mbGljdHNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisKKyAgICBkZWYgdGVzdF95YWNjX3Rlcm0xKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhwbHkueWFjYy5ZYWNjRXJyb3IscnVuX2ltcG9ydCwieWFjY190ZXJtMSIpCisgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInlhY2NfdGVybTEucHk6MjQ6IElsbGVnYWwgcnVsZSBuYW1lICdOVU1CRVInLiBBbHJlYWR5IGRlZmluZWQgYXMgYSB0b2tlblxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKworICAgIGRlZiB0ZXN0X3lhY2NfdW5pY29kZV9saXRlcmFscyhzZWxmKToKKyAgICAgICAgcnVuX2ltcG9ydCgieWFjY191bmljb2RlX2xpdGVyYWxzIikKKyAgICAgICAgcmVzdWx0ID0gc3lzLnN0ZGVyci5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhjaGVja19leHBlY3RlZChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGluZyBMQUxSIHRhYmxlc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKworICAgIGRlZiB0ZXN0X3lhY2NfdW51c2VkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhwbHkueWFjYy5ZYWNjRXJyb3IscnVuX2ltcG9ydCwieWFjY191bnVzZWQiKQorICAgICAgICByZXN1bHQgPSBzeXMuc3RkZXJyLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5YWNjX3VudXNlZC5weTo2MjogU3ltYm9sICdDT01NQScgdXNlZCwgYnV0IG5vdCBkZWZpbmVkIGFzIGEgdG9rZW4gb3IgYSBydWxlXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3ltYm9sICdDT01NQScgaXMgdW5yZWFjaGFibGVcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTeW1ib2wgJ2V4cHJsaXN0JyBpcyB1bnJlYWNoYWJsZVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKyAgICBkZWYgdGVzdF95YWNjX3VudXNlZF9ydWxlKHNlbGYpOgorICAgICAgICBydW5faW1wb3J0KCJ5YWNjX3VudXNlZF9ydWxlIikKKyAgICAgICAgcmVzdWx0ID0gc3lzLnN0ZGVyci5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhjaGVja19leHBlY3RlZChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieWFjY191bnVzZWRfcnVsZS5weTo2MjogUnVsZSAnaW50ZWdlcicgZGVmaW5lZCwgYnV0IG5vdCB1c2VkXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlcmUgaXMgMSB1bnVzZWQgcnVsZVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN5bWJvbCAnaW50ZWdlcicgaXMgdW5yZWFjaGFibGVcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0aW5nIExBTFIgdGFibGVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQorCisgICAgZGVmIHRlc3RfeWFjY191cHJlYyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocGx5LnlhY2MuWWFjY0Vycm9yLHJ1bl9pbXBvcnQsInlhY2NfdXByZWMiKQorICAgICAgICByZXN1bHQgPSBzeXMuc3RkZXJyLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNoZWNrX2V4cGVjdGVkKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5YWNjX3VwcmVjLnB5OjM3OiBOb3RoaW5nIGtub3duIGFib3V0IHRoZSBwcmVjZWRlbmNlIG9mICdVTUlOVVMnXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQorCisgICAgZGVmIHRlc3RfeWFjY191cHJlYzIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHBseS55YWNjLllhY2NFcnJvcixydW5faW1wb3J0LCJ5YWNjX3VwcmVjMiIpCisgICAgICAgIHJlc3VsdCA9IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hlY2tfZXhwZWN0ZWQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInlhY2NfdXByZWMyLnB5OjM3OiBTeW50YXggZXJyb3IuIE5vdGhpbmcgZm9sbG93cyAlcHJlY1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKworICAgIGRlZiB0ZXN0X3lhY2NfcHJlYzEoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHBseS55YWNjLllhY2NFcnJvcixydW5faW1wb3J0LCJ5YWNjX3ByZWMxIikKKyAgICAgICAgcmVzdWx0ID0gc3lzLnN0ZGVyci5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhjaGVja19leHBlY3RlZChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJlY2VkZW5jZSBydWxlICdsZWZ0JyBkZWZpbmVkIGZvciB1bmtub3duIHN5bWJvbCAnKydcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmVjZWRlbmNlIHJ1bGUgJ2xlZnQnIGRlZmluZWQgZm9yIHVua25vd24gc3ltYm9sICcqJ1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByZWNlZGVuY2UgcnVsZSAnbGVmdCcgZGVmaW5lZCBmb3IgdW5rbm93biBzeW1ib2wgJy0nXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJlY2VkZW5jZSBydWxlICdsZWZ0JyBkZWZpbmVkIGZvciB1bmtub3duIHN5bWJvbCAnLydcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisKKyAgICBkZWYgdGVzdF9wa2dfdGVzdDEoc2VsZik6CisgICAgICAgIGZyb20gcGtnX3Rlc3QxIGltcG9ydCBwYXJzZXIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKCdwa2dfdGVzdDEvcGFyc2luZy9wYXJzZXRhYi5weScpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoJ3BrZ190ZXN0MS9wYXJzaW5nL2xleHRhYi5weScpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoJ3BrZ190ZXN0MS9wYXJzaW5nL3BhcnNlci5vdXQnKSkKKyAgICAgICAgciA9IHBhcnNlci5wYXJzZSgnMys0KzUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIsIDEyKQorCisgICAgZGVmIHRlc3RfcGtnX3Rlc3QyKHNlbGYpOgorICAgICAgICBmcm9tIHBrZ190ZXN0MiBpbXBvcnQgcGFyc2VyCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cygncGtnX3Rlc3QyL3BhcnNpbmcvY2FsY3BhcnNldGFiLnB5JykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cygncGtnX3Rlc3QyL3BhcnNpbmcvY2FsY2xleHRhYi5weScpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoJ3BrZ190ZXN0Mi9wYXJzaW5nL3BhcnNlci5vdXQnKSkKKyAgICAgICAgciA9IHBhcnNlci5wYXJzZSgnMys0KzUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIsIDEyKQorCisgICAgZGVmIHRlc3RfcGtnX3Rlc3QzKHNlbGYpOgorICAgICAgICBmcm9tIHBrZ190ZXN0MyBpbXBvcnQgcGFyc2VyCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cygncGtnX3Rlc3QzL2dlbmVyYXRlZC9wYXJzZXRhYi5weScpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoJ3BrZ190ZXN0My9nZW5lcmF0ZWQvbGV4dGFiLnB5JykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cygncGtnX3Rlc3QzL2dlbmVyYXRlZC9wYXJzZXIub3V0JykpCisgICAgICAgIHIgPSBwYXJzZXIucGFyc2UoJzMrNCs1JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLCAxMikKKworICAgIGRlZiB0ZXN0X3BrZ190ZXN0NChzZWxmKToKKyAgICAgICAgZnJvbSBwa2dfdGVzdDQgaW1wb3J0IHBhcnNlcgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9zLnBhdGguZXhpc3RzKCdwa2dfdGVzdDQvcGFyc2luZy9wYXJzZXRhYi5weScpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9zLnBhdGguZXhpc3RzKCdwa2dfdGVzdDQvcGFyc2luZy9sZXh0YWIucHknKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcy5wYXRoLmV4aXN0cygncGtnX3Rlc3Q0L3BhcnNpbmcvcGFyc2VyLm91dCcpKQorICAgICAgICByID0gcGFyc2VyLnBhcnNlKCczKzQrNScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwociwgMTIpCisKKyAgICBkZWYgdGVzdF9wa2dfdGVzdDUoc2VsZik6CisgICAgICAgIGZyb20gcGtnX3Rlc3Q1IGltcG9ydCBwYXJzZXIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKCdwa2dfdGVzdDUvcGFyc2luZy9wYXJzZXRhYi5weScpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoJ3BrZ190ZXN0NS9wYXJzaW5nL2xleHRhYi5weScpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoJ3BrZ190ZXN0NS9wYXJzaW5nL3BhcnNlci5vdXQnKSkKKyAgICAgICAgciA9IHBhcnNlci5wYXJzZSgnMys0KzUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIsIDEyKQorCisgICAgZGVmIHRlc3RfcGtnX3Rlc3Q2KHNlbGYpOgorICAgICAgICBmcm9tIHBrZ190ZXN0NiBpbXBvcnQgcGFyc2VyCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cygncGtnX3Rlc3Q2L3BhcnNpbmcvcGFyc2V0YWIucHknKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKCdwa2dfdGVzdDYvcGFyc2luZy9sZXh0YWIucHknKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKCdwa2dfdGVzdDYvcGFyc2luZy9wYXJzZXIub3V0JykpCisgICAgICAgIHIgPSBwYXJzZXIucGFyc2UoJzMrNCs1JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLCAxMikKKwordW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9wbHkvdGVzdC95YWNjX2JhZGFyZ3MucHkgYi9wbHkvdGVzdC95YWNjX2JhZGFyZ3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWExZDAzZgotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L3lhY2NfYmFkYXJncy5weQpAQCAtMCwwICsxLDY4IEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHlhY2NfYmFkYXJncy5weQorIworIyBSdWxlcyB3aXRoIHdyb25nICMgYXJncworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW1wb3J0IHN5cworc3lzLnRyYWNlYmFja2xpbWl0ID0gMAorc3lzLnBhdGguaW5zZXJ0KDAsIi4uIikKK2ltcG9ydCBwbHkueWFjYyBhcyB5YWNjCisKK2Zyb20gY2FsY2xleCBpbXBvcnQgdG9rZW5zCisKKyMgUGFyc2luZyBydWxlcworcHJlY2VkZW5jZSA9ICgKKyAgICAoJ2xlZnQnLCdQTFVTJywnTUlOVVMnKSwKKyAgICAoJ2xlZnQnLCdUSU1FUycsJ0RJVklERScpLAorICAgICgncmlnaHQnLCdVTUlOVVMnKSwKKyAgICApCisKKyMgZGljdGlvbmFyeSBvZiBuYW1lcworbmFtZXMgPSB7IH0KKworZGVmIHBfc3RhdGVtZW50X2Fzc2lnbih0LHMpOgorICAgICdzdGF0ZW1lbnQgOiBOQU1FIEVRVUFMUyBleHByZXNzaW9uJworICAgIG5hbWVzW3RbMV1dID0gdFszXQorCitkZWYgcF9zdGF0ZW1lbnRfZXhwcigpOgorICAgICdzdGF0ZW1lbnQgOiBleHByZXNzaW9uJworICAgIHByaW50KHRbMV0pCisKK2RlZiBwX2V4cHJlc3Npb25fYmlub3AodCk6CisgICAgJycnZXhwcmVzc2lvbiA6IGV4cHJlc3Npb24gUExVUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gTUlOVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIFRJTUVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBESVZJREUgZXhwcmVzc2lvbicnJworICAgIGlmIHRbMl0gPT0gJysnICA6IHRbMF0gPSB0WzFdICsgdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLSc6IHRbMF0gPSB0WzFdIC0gdFszXQorICAgIGVsaWYgdFsyXSA9PSAnKic6IHRbMF0gPSB0WzFdICogdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLyc6IHRbMF0gPSB0WzFdIC8gdFszXQorCitkZWYgcF9leHByZXNzaW9uX3VtaW51cyh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE1JTlVTIGV4cHJlc3Npb24gJXByZWMgVU1JTlVTJworICAgIHRbMF0gPSAtdFsyXQorCitkZWYgcF9leHByZXNzaW9uX2dyb3VwKHQpOgorICAgICdleHByZXNzaW9uIDogTFBBUkVOIGV4cHJlc3Npb24gUlBBUkVOJworICAgIHRbMF0gPSB0WzJdCisKK2RlZiBwX2V4cHJlc3Npb25fbnVtYmVyKHQpOgorICAgICdleHByZXNzaW9uIDogTlVNQkVSJworICAgIHRbMF0gPSB0WzFdCisKK2RlZiBwX2V4cHJlc3Npb25fbmFtZSh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE5BTUUnCisgICAgdHJ5OgorICAgICAgICB0WzBdID0gbmFtZXNbdFsxXV0KKyAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgIHByaW50KCJVbmRlZmluZWQgbmFtZSAnJXMnIiAlIHRbMV0pCisgICAgICAgIHRbMF0gPSAwCisKK2RlZiBwX2Vycm9yKHQpOgorICAgIHByaW50KCJTeW50YXggZXJyb3IgYXQgJyVzJyIgJSB0LnZhbHVlKQorCit5YWNjLnlhY2MoKQorCisKKworCmRpZmYgLS1naXQgYS9wbHkvdGVzdC95YWNjX2JhZGlkLnB5IGIvcGx5L3Rlc3QveWFjY19iYWRpZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGI5ZjVlCi0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QveWFjY19iYWRpZC5weQpAQCAtMCwwICsxLDc3IEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHlhY2NfYmFkaWQucHkKKyMKKyMgQXR0ZW1wdCB0byBkZWZpbmUgYSBydWxlIHdpdGggYSBiYWQtaWRlbnRpZmllciBuYW1lCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbXBvcnQgc3lzCisKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQoraW1wb3J0IHBseS55YWNjIGFzIHlhY2MKKworZnJvbSBjYWxjbGV4IGltcG9ydCB0b2tlbnMKKworIyBQYXJzaW5nIHJ1bGVzCitwcmVjZWRlbmNlID0gKAorICAgICgnbGVmdCcsJ1BMVVMnLCdNSU5VUycpLAorICAgICgnbGVmdCcsJ1RJTUVTJywnRElWSURFJyksCisgICAgKCdyaWdodCcsJ1VNSU5VUycpLAorICAgICkKKworIyBkaWN0aW9uYXJ5IG9mIG5hbWVzCituYW1lcyA9IHsgfQorCitkZWYgcF9zdGF0ZW1lbnRfYXNzaWduKHQpOgorICAgICdzdGF0ZW1lbnQgOiBOQU1FIEVRVUFMUyBleHByZXNzaW9uJworICAgIG5hbWVzW3RbMV1dID0gdFszXQorCitkZWYgcF9zdGF0ZW1lbnRfZXhwcih0KToKKyAgICAnc3RhdGVtZW50IDogZXhwcmVzc2lvbicKKyAgICBwcmludCh0WzFdKQorCitkZWYgcF9zdGF0ZW1lbnRfZXhwcjIodCk6CisgICAgJ3N0YXRlbWVudCA6IGJhZCZydWxlJworICAgIHBhc3MKKworZGVmIHBfYmFkcnVsZSh0KToKKyAgICAnYmFkJnJ1bGUgOiBleHByZXNzaW9uJworICAgIHBhc3MKKworCitkZWYgcF9leHByZXNzaW9uX2Jpbm9wKHQpOgorICAgICcnJ2V4cHJlc3Npb24gOiBleHByZXNzaW9uIFBMVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIE1JTlVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBUSU1FUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gRElWSURFIGV4cHJlc3Npb24nJycKKyAgICBpZiB0WzJdID09ICcrJyAgOiB0WzBdID0gdFsxXSArIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy0nOiB0WzBdID0gdFsxXSAtIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJyonOiB0WzBdID0gdFsxXSAqIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy8nOiB0WzBdID0gdFsxXSAvIHRbM10KKworZGVmIHBfZXhwcmVzc2lvbl91bWludXModCk6CisgICAgJ2V4cHJlc3Npb24gOiBNSU5VUyBleHByZXNzaW9uICVwcmVjIFVNSU5VUycKKyAgICB0WzBdID0gLXRbMl0KKworZGVmIHBfZXhwcmVzc2lvbl9ncm91cCh0KToKKyAgICAnZXhwcmVzc2lvbiA6IExQQVJFTiBleHByZXNzaW9uIFJQQVJFTicKKyAgICB0WzBdID0gdFsyXQorCitkZWYgcF9leHByZXNzaW9uX251bWJlcih0KToKKyAgICAnZXhwcmVzc2lvbiA6IE5VTUJFUicKKyAgICB0WzBdID0gdFsxXQorCitkZWYgcF9leHByZXNzaW9uX25hbWUodCk6CisgICAgJ2V4cHJlc3Npb24gOiBOQU1FJworICAgIHRyeToKKyAgICAgICAgdFswXSA9IG5hbWVzW3RbMV1dCisgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICBwcmludCgiVW5kZWZpbmVkIG5hbWUgJyVzJyIgJSB0WzFdKQorICAgICAgICB0WzBdID0gMAorCitkZWYgcF9lcnJvcih0KToKKyAgICBwYXNzCisKK3lhY2MueWFjYygpCisKKworCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L3lhY2NfYmFkcHJlYy5weSBiL3BseS90ZXN0L3lhY2NfYmFkcHJlYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDEzYmI2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QveWFjY19iYWRwcmVjLnB5CkBAIC0wLDAgKzEsNjQgQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgeWFjY19iYWRwcmVjLnB5CisjCisjIEJhZCBwcmVjZWRlbmNlIHNwZWNpZmllcgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW1wb3J0IHN5cworCitpZiAiLi4iIG5vdCBpbiBzeXMucGF0aDogc3lzLnBhdGguaW5zZXJ0KDAsIi4uIikKK2ltcG9ydCBwbHkueWFjYyBhcyB5YWNjCisKK2Zyb20gY2FsY2xleCBpbXBvcnQgdG9rZW5zCisKKyMgUGFyc2luZyBydWxlcworcHJlY2VkZW5jZSA9ICJibGFoIgorCisjIGRpY3Rpb25hcnkgb2YgbmFtZXMKK25hbWVzID0geyB9CisKK2RlZiBwX3N0YXRlbWVudF9hc3NpZ24odCk6CisgICAgJ3N0YXRlbWVudCA6IE5BTUUgRVFVQUxTIGV4cHJlc3Npb24nCisgICAgbmFtZXNbdFsxXV0gPSB0WzNdCisKK2RlZiBwX3N0YXRlbWVudF9leHByKHQpOgorICAgICdzdGF0ZW1lbnQgOiBleHByZXNzaW9uJworICAgIHByaW50KHRbMV0pCisKK2RlZiBwX2V4cHJlc3Npb25fYmlub3AodCk6CisgICAgJycnZXhwcmVzc2lvbiA6IGV4cHJlc3Npb24gUExVUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gTUlOVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIFRJTUVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBESVZJREUgZXhwcmVzc2lvbicnJworICAgIGlmIHRbMl0gPT0gJysnICA6IHRbMF0gPSB0WzFdICsgdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLSc6IHRbMF0gPSB0WzFdIC0gdFszXQorICAgIGVsaWYgdFsyXSA9PSAnKic6IHRbMF0gPSB0WzFdICogdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLyc6IHRbMF0gPSB0WzFdIC8gdFszXQorCitkZWYgcF9leHByZXNzaW9uX3VtaW51cyh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE1JTlVTIGV4cHJlc3Npb24gJXByZWMgVU1JTlVTJworICAgIHRbMF0gPSAtdFsyXQorCitkZWYgcF9leHByZXNzaW9uX2dyb3VwKHQpOgorICAgICdleHByZXNzaW9uIDogTFBBUkVOIGV4cHJlc3Npb24gUlBBUkVOJworICAgIHRbMF0gPSB0WzJdCisKK2RlZiBwX2V4cHJlc3Npb25fbnVtYmVyKHQpOgorICAgICdleHByZXNzaW9uIDogTlVNQkVSJworICAgIHRbMF0gPSB0WzFdCisKK2RlZiBwX2V4cHJlc3Npb25fbmFtZSh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE5BTUUnCisgICAgdHJ5OgorICAgICAgICB0WzBdID0gbmFtZXNbdFsxXV0KKyAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgIHByaW50KCJVbmRlZmluZWQgbmFtZSAnJXMnIiAlIHRbMV0pCisgICAgICAgIHRbMF0gPSAwCisKK2RlZiBwX2Vycm9yKHQpOgorICAgIHByaW50KCJTeW50YXggZXJyb3IgYXQgJyVzJyIgJSB0LnZhbHVlKQorCit5YWNjLnlhY2MoKQorCisKKworCmRpZmYgLS1naXQgYS9wbHkvdGVzdC95YWNjX2JhZHByZWMyLnB5IGIvcGx5L3Rlc3QveWFjY19iYWRwcmVjMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzA5M2I0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QveWFjY19iYWRwcmVjMi5weQpAQCAtMCwwICsxLDY4IEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHlhY2NfYmFkcHJlYzIucHkKKyMKKyMgQmFkIHByZWNlZGVuY2UKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ltcG9ydCBzeXMKKworaWYgIi4uIiBub3QgaW4gc3lzLnBhdGg6IHN5cy5wYXRoLmluc2VydCgwLCIuLiIpCitpbXBvcnQgcGx5LnlhY2MgYXMgeWFjYworCitmcm9tIGNhbGNsZXggaW1wb3J0IHRva2VucworCisjIFBhcnNpbmcgcnVsZXMKK3ByZWNlZGVuY2UgPSAoCisgICAgNDIsCisgICAgKCdsZWZ0JywnVElNRVMnLCdESVZJREUnKSwKKyAgICAoJ3JpZ2h0JywnVU1JTlVTJyksCisgICAgKQorCisjIGRpY3Rpb25hcnkgb2YgbmFtZXMKK25hbWVzID0geyB9CisKK2RlZiBwX3N0YXRlbWVudF9hc3NpZ24odCk6CisgICAgJ3N0YXRlbWVudCA6IE5BTUUgRVFVQUxTIGV4cHJlc3Npb24nCisgICAgbmFtZXNbdFsxXV0gPSB0WzNdCisKK2RlZiBwX3N0YXRlbWVudF9leHByKHQpOgorICAgICdzdGF0ZW1lbnQgOiBleHByZXNzaW9uJworICAgIHByaW50KHRbMV0pCisKK2RlZiBwX2V4cHJlc3Npb25fYmlub3AodCk6CisgICAgJycnZXhwcmVzc2lvbiA6IGV4cHJlc3Npb24gUExVUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gTUlOVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIFRJTUVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBESVZJREUgZXhwcmVzc2lvbicnJworICAgIGlmIHRbMl0gPT0gJysnICA6IHRbMF0gPSB0WzFdICsgdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLSc6IHRbMF0gPSB0WzFdIC0gdFszXQorICAgIGVsaWYgdFsyXSA9PSAnKic6IHRbMF0gPSB0WzFdICogdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLyc6IHRbMF0gPSB0WzFdIC8gdFszXQorCitkZWYgcF9leHByZXNzaW9uX3VtaW51cyh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE1JTlVTIGV4cHJlc3Npb24gJXByZWMgVU1JTlVTJworICAgIHRbMF0gPSAtdFsyXQorCitkZWYgcF9leHByZXNzaW9uX2dyb3VwKHQpOgorICAgICdleHByZXNzaW9uIDogTFBBUkVOIGV4cHJlc3Npb24gUlBBUkVOJworICAgIHRbMF0gPSB0WzJdCisKK2RlZiBwX2V4cHJlc3Npb25fbnVtYmVyKHQpOgorICAgICdleHByZXNzaW9uIDogTlVNQkVSJworICAgIHRbMF0gPSB0WzFdCisKK2RlZiBwX2V4cHJlc3Npb25fbmFtZSh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE5BTUUnCisgICAgdHJ5OgorICAgICAgICB0WzBdID0gbmFtZXNbdFsxXV0KKyAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgIHByaW50KCJVbmRlZmluZWQgbmFtZSAnJXMnIiAlIHRbMV0pCisgICAgICAgIHRbMF0gPSAwCisKK2RlZiBwX2Vycm9yKHQpOgorICAgIHByaW50KCJTeW50YXggZXJyb3IgYXQgJyVzJyIgJSB0LnZhbHVlKQorCit5YWNjLnlhY2MoKQorCisKKworCmRpZmYgLS1naXQgYS9wbHkvdGVzdC95YWNjX2JhZHByZWMzLnB5IGIvcGx5L3Rlc3QveWFjY19iYWRwcmVjMy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTI1ZWNkCi0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QveWFjY19iYWRwcmVjMy5weQpAQCAtMCwwICsxLDY4IEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHlhY2NfYmFkcHJlYzMucHkKKyMKKyMgQmFkIHByZWNlZGVuY2UKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ltcG9ydCBzeXMKKworaWYgIi4uIiBub3QgaW4gc3lzLnBhdGg6IHN5cy5wYXRoLmluc2VydCgwLCIuLiIpCitpbXBvcnQgcGx5LnlhY2MgYXMgeWFjYworCitmcm9tIGNhbGNsZXggaW1wb3J0IHRva2VucworCisjIFBhcnNpbmcgcnVsZXMKK3ByZWNlZGVuY2UgPSAoCisgICAgKCdsZWZ0JywnUExVUycsJ01JTlVTJyksCisgICAgKCdsZWZ0JywnVElNRVMnLCdESVZJREUnLCdNSU5VUycpLAorICAgICgncmlnaHQnLCdVTUlOVVMnKSwKKyAgICApCisKKyMgZGljdGlvbmFyeSBvZiBuYW1lcworbmFtZXMgPSB7IH0KKworZGVmIHBfc3RhdGVtZW50X2Fzc2lnbih0KToKKyAgICAnc3RhdGVtZW50IDogTkFNRSBFUVVBTFMgZXhwcmVzc2lvbicKKyAgICBuYW1lc1t0WzFdXSA9IHRbM10KKworZGVmIHBfc3RhdGVtZW50X2V4cHIodCk6CisgICAgJ3N0YXRlbWVudCA6IGV4cHJlc3Npb24nCisgICAgcHJpbnQodFsxXSkKKworZGVmIHBfZXhwcmVzc2lvbl9iaW5vcCh0KToKKyAgICAnJydleHByZXNzaW9uIDogZXhwcmVzc2lvbiBQTFVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBNSU5VUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gVElNRVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIERJVklERSBleHByZXNzaW9uJycnCisgICAgaWYgdFsyXSA9PSAnKycgIDogdFswXSA9IHRbMV0gKyB0WzNdCisgICAgZWxpZiB0WzJdID09ICctJzogdFswXSA9IHRbMV0gLSB0WzNdCisgICAgZWxpZiB0WzJdID09ICcqJzogdFswXSA9IHRbMV0gKiB0WzNdCisgICAgZWxpZiB0WzNdID09ICcvJzogdFswXSA9IHRbMV0gLyB0WzNdCisKK2RlZiBwX2V4cHJlc3Npb25fdW1pbnVzKHQpOgorICAgICdleHByZXNzaW9uIDogTUlOVVMgZXhwcmVzc2lvbiAlcHJlYyBVTUlOVVMnCisgICAgdFswXSA9IC10WzJdCisKK2RlZiBwX2V4cHJlc3Npb25fZ3JvdXAodCk6CisgICAgJ2V4cHJlc3Npb24gOiBMUEFSRU4gZXhwcmVzc2lvbiBSUEFSRU4nCisgICAgdFswXSA9IHRbMl0KKworZGVmIHBfZXhwcmVzc2lvbl9udW1iZXIodCk6CisgICAgJ2V4cHJlc3Npb24gOiBOVU1CRVInCisgICAgdFswXSA9IHRbMV0KKworZGVmIHBfZXhwcmVzc2lvbl9uYW1lKHQpOgorICAgICdleHByZXNzaW9uIDogTkFNRScKKyAgICB0cnk6CisgICAgICAgIHRbMF0gPSBuYW1lc1t0WzFdXQorICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICAgICAgcHJpbnQoIlVuZGVmaW5lZCBuYW1lICclcyciICUgdFsxXSkKKyAgICAgICAgdFswXSA9IDAKKworZGVmIHBfZXJyb3IodCk6CisgICAgcHJpbnQoIlN5bnRheCBlcnJvciBhdCAnJXMnIiAlIHQudmFsdWUpCisKK3lhY2MueWFjYygpCisKKworCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L3lhY2NfYmFkcnVsZS5weSBiL3BseS90ZXN0L3lhY2NfYmFkcnVsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmFmNjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QveWFjY19iYWRydWxlLnB5CkBAIC0wLDAgKzEsNjggQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgeWFjY19iYWRydWxlLnB5CisjCisjIFN5bnRheCBwcm9ibGVtcyBpbiB0aGUgcnVsZSBzdHJpbmdzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbXBvcnQgc3lzCisKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQoraW1wb3J0IHBseS55YWNjIGFzIHlhY2MKKworZnJvbSBjYWxjbGV4IGltcG9ydCB0b2tlbnMKKworIyBQYXJzaW5nIHJ1bGVzCitwcmVjZWRlbmNlID0gKAorICAgICgnbGVmdCcsJ1BMVVMnLCdNSU5VUycpLAorICAgICgnbGVmdCcsJ1RJTUVTJywnRElWSURFJyksCisgICAgKCdyaWdodCcsJ1VNSU5VUycpLAorICAgICkKKworIyBkaWN0aW9uYXJ5IG9mIG5hbWVzCituYW1lcyA9IHsgfQorCitkZWYgcF9zdGF0ZW1lbnRfYXNzaWduKHQpOgorICAgICdzdGF0ZW1lbnQgTkFNRSBFUVVBTFMgZXhwcmVzc2lvbicKKyAgICBuYW1lc1t0WzFdXSA9IHRbM10KKworZGVmIHBfc3RhdGVtZW50X2V4cHIodCk6CisgICAgJ3N0YXRlbWVudCcKKyAgICBwcmludCh0WzFdKQorCitkZWYgcF9leHByZXNzaW9uX2Jpbm9wKHQpOgorICAgICcnJ2V4cHJlc3Npb24gOiBleHByZXNzaW9uIFBMVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gTUlOVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIFRJTUVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBESVZJREUgZXhwcmVzc2lvbicnJworICAgIGlmIHRbMl0gPT0gJysnICA6IHRbMF0gPSB0WzFdICsgdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLSc6IHRbMF0gPSB0WzFdIC0gdFszXQorICAgIGVsaWYgdFsyXSA9PSAnKic6IHRbMF0gPSB0WzFdICogdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLyc6IHRbMF0gPSB0WzFdIC8gdFszXQorCitkZWYgcF9leHByZXNzaW9uX3VtaW51cyh0KToKKyAgICAnZXhwcmVzc2lvbjogTUlOVVMgZXhwcmVzc2lvbiAlcHJlYyBVTUlOVVMnCisgICAgdFswXSA9IC10WzJdCisKK2RlZiBwX2V4cHJlc3Npb25fZ3JvdXAodCk6CisgICAgJ2V4cHJlc3Npb24gOiBMUEFSRU4gZXhwcmVzc2lvbiBSUEFSRU4nCisgICAgdFswXSA9IHRbMl0KKworZGVmIHBfZXhwcmVzc2lvbl9udW1iZXIodCk6CisgICAgJ2V4cHJlc3Npb24gOiBOVU1CRVInCisgICAgdFswXSA9IHRbMV0KKworZGVmIHBfZXhwcmVzc2lvbl9uYW1lKHQpOgorICAgICdleHByZXNzaW9uIDogTkFNRScKKyAgICB0cnk6CisgICAgICAgIHRbMF0gPSBuYW1lc1t0WzFdXQorICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICAgICAgcHJpbnQoIlVuZGVmaW5lZCBuYW1lICclcyciICUgdFsxXSkKKyAgICAgICAgdFswXSA9IDAKKworZGVmIHBfZXJyb3IodCk6CisgICAgcHJpbnQoIlN5bnRheCBlcnJvciBhdCAnJXMnIiAlIHQudmFsdWUpCisKK3lhY2MueWFjYygpCisKKworCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L3lhY2NfYmFkdG9rLnB5IGIvcGx5L3Rlc3QveWFjY19iYWR0b2sucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0YWZlMQotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L3lhY2NfYmFkdG9rLnB5CkBAIC0wLDAgKzEsNjggQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgeWFjY19iYWR0b2sucHkKKyMKKyMgQSBncmFtbWFyLCBidXQgdG9rZW5zIGlzIGEgYmFkIGRhdGF0eXBlCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ltcG9ydCBzeXMKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQoraW1wb3J0IHBseS55YWNjIGFzIHlhY2MKKwordG9rZW5zID0gIkhlbGxvIgorCisjIFBhcnNpbmcgcnVsZXMKK3ByZWNlZGVuY2UgPSAoCisgICAgKCdsZWZ0JywnUExVUycsJ01JTlVTJyksCisgICAgKCdsZWZ0JywnVElNRVMnLCdESVZJREUnKSwKKyAgICAoJ3JpZ2h0JywnVU1JTlVTJyksCisgICAgKQorCisjIGRpY3Rpb25hcnkgb2YgbmFtZXMKK25hbWVzID0geyB9CisKK2RlZiBwX3N0YXRlbWVudF9hc3NpZ24odCk6CisgICAgJ3N0YXRlbWVudCA6IE5BTUUgRVFVQUxTIGV4cHJlc3Npb24nCisgICAgbmFtZXNbdFsxXV0gPSB0WzNdCisKK2RlZiBwX3N0YXRlbWVudF9leHByKHQpOgorICAgICdzdGF0ZW1lbnQgOiBleHByZXNzaW9uJworICAgIHByaW50KHRbMV0pCisKK2RlZiBwX2V4cHJlc3Npb25fYmlub3AodCk6CisgICAgJycnZXhwcmVzc2lvbiA6IGV4cHJlc3Npb24gUExVUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gTUlOVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIFRJTUVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBESVZJREUgZXhwcmVzc2lvbicnJworICAgIGlmIHRbMl0gPT0gJysnICA6IHRbMF0gPSB0WzFdICsgdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLSc6IHRbMF0gPSB0WzFdIC0gdFszXQorICAgIGVsaWYgdFsyXSA9PSAnKic6IHRbMF0gPSB0WzFdICogdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLyc6IHRbMF0gPSB0WzFdIC8gdFszXQorCitkZWYgcF9leHByZXNzaW9uX3VtaW51cyh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE1JTlVTIGV4cHJlc3Npb24gJXByZWMgVU1JTlVTJworICAgIHRbMF0gPSAtdFsyXQorCitkZWYgcF9leHByZXNzaW9uX2dyb3VwKHQpOgorICAgICdleHByZXNzaW9uIDogTFBBUkVOIGV4cHJlc3Npb24gUlBBUkVOJworICAgIHRbMF0gPSB0WzJdCisKK2RlZiBwX2V4cHJlc3Npb25fbnVtYmVyKHQpOgorICAgICdleHByZXNzaW9uIDogTlVNQkVSJworICAgIHRbMF0gPSB0WzFdCisKK2RlZiBwX2V4cHJlc3Npb25fbmFtZSh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE5BTUUnCisgICAgdHJ5OgorICAgICAgICB0WzBdID0gbmFtZXNbdFsxXV0KKyAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgIHByaW50KCJVbmRlZmluZWQgbmFtZSAnJXMnIiAlIHRbMV0pCisgICAgICAgIHRbMF0gPSAwCisKK2RlZiBwX2Vycm9yKHQpOgorICAgIHByaW50KCJTeW50YXggZXJyb3IgYXQgJyVzJyIgJSB0LnZhbHVlKQorCit5YWNjLnlhY2MoKQorCisKKworCmRpZmYgLS1naXQgYS9wbHkvdGVzdC95YWNjX2R1cC5weSBiL3BseS90ZXN0L3lhY2NfZHVwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwOWJhMzIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC95YWNjX2R1cC5weQpAQCAtMCwwICsxLDY4IEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHlhY2NfZHVwLnB5CisjCisjIER1cGxpY2F0ZWQgcnVsZSBuYW1lCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbXBvcnQgc3lzCisKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQoraW1wb3J0IHBseS55YWNjIGFzIHlhY2MKKworZnJvbSBjYWxjbGV4IGltcG9ydCB0b2tlbnMKKworIyBQYXJzaW5nIHJ1bGVzCitwcmVjZWRlbmNlID0gKAorICAgICgnbGVmdCcsJ1BMVVMnLCdNSU5VUycpLAorICAgICgnbGVmdCcsJ1RJTUVTJywnRElWSURFJyksCisgICAgKCdyaWdodCcsJ1VNSU5VUycpLAorICAgICkKKworIyBkaWN0aW9uYXJ5IG9mIG5hbWVzCituYW1lcyA9IHsgfQorCitkZWYgcF9zdGF0ZW1lbnQodCk6CisgICAgJ3N0YXRlbWVudCA6IE5BTUUgRVFVQUxTIGV4cHJlc3Npb24nCisgICAgbmFtZXNbdFsxXV0gPSB0WzNdCisKK2RlZiBwX3N0YXRlbWVudCh0KToKKyAgICAnc3RhdGVtZW50IDogZXhwcmVzc2lvbicKKyAgICBwcmludCh0WzFdKQorCitkZWYgcF9leHByZXNzaW9uX2Jpbm9wKHQpOgorICAgICcnJ2V4cHJlc3Npb24gOiBleHByZXNzaW9uIFBMVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIE1JTlVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBUSU1FUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gRElWSURFIGV4cHJlc3Npb24nJycKKyAgICBpZiB0WzJdID09ICcrJyAgOiB0WzBdID0gdFsxXSArIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy0nOiB0WzBdID0gdFsxXSAtIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJyonOiB0WzBdID0gdFsxXSAqIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy8nOiB0WzBdID0gdFsxXSAvIHRbM10KKworZGVmIHBfZXhwcmVzc2lvbl91bWludXModCk6CisgICAgJ2V4cHJlc3Npb24gOiBNSU5VUyBleHByZXNzaW9uICVwcmVjIFVNSU5VUycKKyAgICB0WzBdID0gLXRbMl0KKworZGVmIHBfZXhwcmVzc2lvbl9ncm91cCh0KToKKyAgICAnZXhwcmVzc2lvbiA6IExQQVJFTiBleHByZXNzaW9uIFJQQVJFTicKKyAgICB0WzBdID0gdFsyXQorCitkZWYgcF9leHByZXNzaW9uX251bWJlcih0KToKKyAgICAnZXhwcmVzc2lvbiA6IE5VTUJFUicKKyAgICB0WzBdID0gdFsxXQorCitkZWYgcF9leHByZXNzaW9uX25hbWUodCk6CisgICAgJ2V4cHJlc3Npb24gOiBOQU1FJworICAgIHRyeToKKyAgICAgICAgdFswXSA9IG5hbWVzW3RbMV1dCisgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICBwcmludCgiVW5kZWZpbmVkIG5hbWUgJyVzJyIgJSB0WzFdKQorICAgICAgICB0WzBdID0gMAorCitkZWYgcF9lcnJvcih0KToKKyAgICBwcmludCgiU3ludGF4IGVycm9yIGF0ICclcyciICUgdC52YWx1ZSkKKworeWFjYy55YWNjKCkKKworCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QveWFjY19lcnJvcjEucHkgYi9wbHkvdGVzdC95YWNjX2Vycm9yMS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGFjNmE5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QveWFjY19lcnJvcjEucHkKQEAgLTAsMCArMSw2OCBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB5YWNjX2Vycm9yMS5weQorIworIyBCYWQgcF9lcnJvcigpIGZ1bmN0aW9uCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbXBvcnQgc3lzCisKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQoraW1wb3J0IHBseS55YWNjIGFzIHlhY2MKKworZnJvbSBjYWxjbGV4IGltcG9ydCB0b2tlbnMKKworIyBQYXJzaW5nIHJ1bGVzCitwcmVjZWRlbmNlID0gKAorICAgICgnbGVmdCcsJ1BMVVMnLCdNSU5VUycpLAorICAgICgnbGVmdCcsJ1RJTUVTJywnRElWSURFJyksCisgICAgKCdyaWdodCcsJ1VNSU5VUycpLAorICAgICkKKworIyBkaWN0aW9uYXJ5IG9mIG5hbWVzCituYW1lcyA9IHsgfQorCitkZWYgcF9zdGF0ZW1lbnRfYXNzaWduKHQpOgorICAgICdzdGF0ZW1lbnQgOiBOQU1FIEVRVUFMUyBleHByZXNzaW9uJworICAgIG5hbWVzW3RbMV1dID0gdFszXQorCitkZWYgcF9zdGF0ZW1lbnRfZXhwcih0KToKKyAgICAnc3RhdGVtZW50IDogZXhwcmVzc2lvbicKKyAgICBwcmludCh0WzFdKQorCitkZWYgcF9leHByZXNzaW9uX2Jpbm9wKHQpOgorICAgICcnJ2V4cHJlc3Npb24gOiBleHByZXNzaW9uIFBMVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIE1JTlVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBUSU1FUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gRElWSURFIGV4cHJlc3Npb24nJycKKyAgICBpZiB0WzJdID09ICcrJyAgOiB0WzBdID0gdFsxXSArIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy0nOiB0WzBdID0gdFsxXSAtIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJyonOiB0WzBdID0gdFsxXSAqIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy8nOiB0WzBdID0gdFsxXSAvIHRbM10KKworZGVmIHBfZXhwcmVzc2lvbl91bWludXModCk6CisgICAgJ2V4cHJlc3Npb24gOiBNSU5VUyBleHByZXNzaW9uICVwcmVjIFVNSU5VUycKKyAgICB0WzBdID0gLXRbMl0KKworZGVmIHBfZXhwcmVzc2lvbl9ncm91cCh0KToKKyAgICAnZXhwcmVzc2lvbiA6IExQQVJFTiBleHByZXNzaW9uIFJQQVJFTicKKyAgICB0WzBdID0gdFsyXQorCitkZWYgcF9leHByZXNzaW9uX251bWJlcih0KToKKyAgICAnZXhwcmVzc2lvbiA6IE5VTUJFUicKKyAgICB0WzBdID0gdFsxXQorCitkZWYgcF9leHByZXNzaW9uX25hbWUodCk6CisgICAgJ2V4cHJlc3Npb24gOiBOQU1FJworICAgIHRyeToKKyAgICAgICAgdFswXSA9IG5hbWVzW3RbMV1dCisgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICBwcmludCgiVW5kZWZpbmVkIG5hbWUgJyVzJyIgJSB0WzFdKQorICAgICAgICB0WzBdID0gMAorCitkZWYgcF9lcnJvcih0LHMpOgorICAgIHByaW50KCJTeW50YXggZXJyb3IgYXQgJyVzJyIgJSB0LnZhbHVlKQorCit5YWNjLnlhY2MoKQorCisKKworCmRpZmYgLS1naXQgYS9wbHkvdGVzdC95YWNjX2Vycm9yMi5weSBiL3BseS90ZXN0L3lhY2NfZXJyb3IyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OTE0MTgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC95YWNjX2Vycm9yMi5weQpAQCAtMCwwICsxLDY4IEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHlhY2NfZXJyb3IyLnB5CisjCisjIEJhZCBwX2Vycm9yKCkgZnVuY3Rpb24KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ltcG9ydCBzeXMKKworaWYgIi4uIiBub3QgaW4gc3lzLnBhdGg6IHN5cy5wYXRoLmluc2VydCgwLCIuLiIpCitpbXBvcnQgcGx5LnlhY2MgYXMgeWFjYworCitmcm9tIGNhbGNsZXggaW1wb3J0IHRva2VucworCisjIFBhcnNpbmcgcnVsZXMKK3ByZWNlZGVuY2UgPSAoCisgICAgKCdsZWZ0JywnUExVUycsJ01JTlVTJyksCisgICAgKCdsZWZ0JywnVElNRVMnLCdESVZJREUnKSwKKyAgICAoJ3JpZ2h0JywnVU1JTlVTJyksCisgICAgKQorCisjIGRpY3Rpb25hcnkgb2YgbmFtZXMKK25hbWVzID0geyB9CisKK2RlZiBwX3N0YXRlbWVudF9hc3NpZ24odCk6CisgICAgJ3N0YXRlbWVudCA6IE5BTUUgRVFVQUxTIGV4cHJlc3Npb24nCisgICAgbmFtZXNbdFsxXV0gPSB0WzNdCisKK2RlZiBwX3N0YXRlbWVudF9leHByKHQpOgorICAgICdzdGF0ZW1lbnQgOiBleHByZXNzaW9uJworICAgIHByaW50KHRbMV0pCisKK2RlZiBwX2V4cHJlc3Npb25fYmlub3AodCk6CisgICAgJycnZXhwcmVzc2lvbiA6IGV4cHJlc3Npb24gUExVUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gTUlOVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIFRJTUVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBESVZJREUgZXhwcmVzc2lvbicnJworICAgIGlmIHRbMl0gPT0gJysnICA6IHRbMF0gPSB0WzFdICsgdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLSc6IHRbMF0gPSB0WzFdIC0gdFszXQorICAgIGVsaWYgdFsyXSA9PSAnKic6IHRbMF0gPSB0WzFdICogdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLyc6IHRbMF0gPSB0WzFdIC8gdFszXQorCitkZWYgcF9leHByZXNzaW9uX3VtaW51cyh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE1JTlVTIGV4cHJlc3Npb24gJXByZWMgVU1JTlVTJworICAgIHRbMF0gPSAtdFsyXQorCitkZWYgcF9leHByZXNzaW9uX2dyb3VwKHQpOgorICAgICdleHByZXNzaW9uIDogTFBBUkVOIGV4cHJlc3Npb24gUlBBUkVOJworICAgIHRbMF0gPSB0WzJdCisKK2RlZiBwX2V4cHJlc3Npb25fbnVtYmVyKHQpOgorICAgICdleHByZXNzaW9uIDogTlVNQkVSJworICAgIHRbMF0gPSB0WzFdCisKK2RlZiBwX2V4cHJlc3Npb25fbmFtZSh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE5BTUUnCisgICAgdHJ5OgorICAgICAgICB0WzBdID0gbmFtZXNbdFsxXV0KKyAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgIHByaW50KCJVbmRlZmluZWQgbmFtZSAnJXMnIiAlIHRbMV0pCisgICAgICAgIHRbMF0gPSAwCisKK2RlZiBwX2Vycm9yKCk6CisgICAgcHJpbnQoIlN5bnRheCBlcnJvciBhdCAnJXMnIiAlIHQudmFsdWUpCisKK3lhY2MueWFjYygpCisKKworCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L3lhY2NfZXJyb3IzLnB5IGIvcGx5L3Rlc3QveWFjY19lcnJvcjMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYwNGE0OAotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L3lhY2NfZXJyb3IzLnB5CkBAIC0wLDAgKzEsNjcgQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgeWFjY19lcnJvcjMucHkKKyMKKyMgQmFkIHBfZXJyb3IoKSBmdW5jdGlvbgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW1wb3J0IHN5cworCitpZiAiLi4iIG5vdCBpbiBzeXMucGF0aDogc3lzLnBhdGguaW5zZXJ0KDAsIi4uIikKK2ltcG9ydCBwbHkueWFjYyBhcyB5YWNjCisKK2Zyb20gY2FsY2xleCBpbXBvcnQgdG9rZW5zCisKKyMgUGFyc2luZyBydWxlcworcHJlY2VkZW5jZSA9ICgKKyAgICAoJ2xlZnQnLCdQTFVTJywnTUlOVVMnKSwKKyAgICAoJ2xlZnQnLCdUSU1FUycsJ0RJVklERScpLAorICAgICgncmlnaHQnLCdVTUlOVVMnKSwKKyAgICApCisKKyMgZGljdGlvbmFyeSBvZiBuYW1lcworbmFtZXMgPSB7IH0KKworZGVmIHBfc3RhdGVtZW50X2Fzc2lnbih0KToKKyAgICAnc3RhdGVtZW50IDogTkFNRSBFUVVBTFMgZXhwcmVzc2lvbicKKyAgICBuYW1lc1t0WzFdXSA9IHRbM10KKworZGVmIHBfc3RhdGVtZW50X2V4cHIodCk6CisgICAgJ3N0YXRlbWVudCA6IGV4cHJlc3Npb24nCisgICAgcHJpbnQodFsxXSkKKworZGVmIHBfZXhwcmVzc2lvbl9iaW5vcCh0KToKKyAgICAnJydleHByZXNzaW9uIDogZXhwcmVzc2lvbiBQTFVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBNSU5VUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gVElNRVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIERJVklERSBleHByZXNzaW9uJycnCisgICAgaWYgdFsyXSA9PSAnKycgIDogdFswXSA9IHRbMV0gKyB0WzNdCisgICAgZWxpZiB0WzJdID09ICctJzogdFswXSA9IHRbMV0gLSB0WzNdCisgICAgZWxpZiB0WzJdID09ICcqJzogdFswXSA9IHRbMV0gKiB0WzNdCisgICAgZWxpZiB0WzJdID09ICcvJzogdFswXSA9IHRbMV0gLyB0WzNdCisKK2RlZiBwX2V4cHJlc3Npb25fdW1pbnVzKHQpOgorICAgICdleHByZXNzaW9uIDogTUlOVVMgZXhwcmVzc2lvbiAlcHJlYyBVTUlOVVMnCisgICAgdFswXSA9IC10WzJdCisKK2RlZiBwX2V4cHJlc3Npb25fZ3JvdXAodCk6CisgICAgJ2V4cHJlc3Npb24gOiBMUEFSRU4gZXhwcmVzc2lvbiBSUEFSRU4nCisgICAgdFswXSA9IHRbMl0KKworZGVmIHBfZXhwcmVzc2lvbl9udW1iZXIodCk6CisgICAgJ2V4cHJlc3Npb24gOiBOVU1CRVInCisgICAgdFswXSA9IHRbMV0KKworZGVmIHBfZXhwcmVzc2lvbl9uYW1lKHQpOgorICAgICdleHByZXNzaW9uIDogTkFNRScKKyAgICB0cnk6CisgICAgICAgIHRbMF0gPSBuYW1lc1t0WzFdXQorICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICAgICAgcHJpbnQoIlVuZGVmaW5lZCBuYW1lICclcyciICUgdFsxXSkKKyAgICAgICAgdFswXSA9IDAKKworcF9lcnJvciA9ICJibGFoIgorCit5YWNjLnlhY2MoKQorCisKKworCmRpZmYgLS1naXQgYS9wbHkvdGVzdC95YWNjX2Vycm9yNC5weSBiL3BseS90ZXN0L3lhY2NfZXJyb3I0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNTUwY2QKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC95YWNjX2Vycm9yNC5weQpAQCAtMCwwICsxLDcyIEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHlhY2NfZXJyb3I0LnB5CisjCisjIEF0dGVtcHQgdG8gZGVmaW5lIGEgcnVsZSBuYW1lZCAnZXJyb3InCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbXBvcnQgc3lzCisKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQoraW1wb3J0IHBseS55YWNjIGFzIHlhY2MKKworZnJvbSBjYWxjbGV4IGltcG9ydCB0b2tlbnMKKworIyBQYXJzaW5nIHJ1bGVzCitwcmVjZWRlbmNlID0gKAorICAgICgnbGVmdCcsJ1BMVVMnLCdNSU5VUycpLAorICAgICgnbGVmdCcsJ1RJTUVTJywnRElWSURFJyksCisgICAgKCdyaWdodCcsJ1VNSU5VUycpLAorICAgICkKKworIyBkaWN0aW9uYXJ5IG9mIG5hbWVzCituYW1lcyA9IHsgfQorCitkZWYgcF9zdGF0ZW1lbnRfYXNzaWduKHQpOgorICAgICdzdGF0ZW1lbnQgOiBOQU1FIEVRVUFMUyBleHByZXNzaW9uJworICAgIG5hbWVzW3RbMV1dID0gdFszXQorCitkZWYgcF9zdGF0ZW1lbnRfZXhwcih0KToKKyAgICAnc3RhdGVtZW50IDogZXhwcmVzc2lvbicKKyAgICBwcmludCh0WzFdKQorCitkZWYgcF9leHByZXNzaW9uX2Jpbm9wKHQpOgorICAgICcnJ2V4cHJlc3Npb24gOiBleHByZXNzaW9uIFBMVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIE1JTlVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBUSU1FUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gRElWSURFIGV4cHJlc3Npb24nJycKKyAgICBpZiB0WzJdID09ICcrJyAgOiB0WzBdID0gdFsxXSArIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy0nOiB0WzBdID0gdFsxXSAtIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJyonOiB0WzBdID0gdFsxXSAqIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy8nOiB0WzBdID0gdFsxXSAvIHRbM10KKworZGVmIHBfZXhwcmVzc2lvbl91bWludXModCk6CisgICAgJ2V4cHJlc3Npb24gOiBNSU5VUyBleHByZXNzaW9uICVwcmVjIFVNSU5VUycKKyAgICB0WzBdID0gLXRbMl0KKworZGVmIHBfZXhwcmVzc2lvbl9ncm91cCh0KToKKyAgICAnZXhwcmVzc2lvbiA6IExQQVJFTiBleHByZXNzaW9uIFJQQVJFTicKKyAgICB0WzBdID0gdFsyXQorCitkZWYgcF9leHByZXNzaW9uX251bWJlcih0KToKKyAgICAnZXhwcmVzc2lvbiA6IE5VTUJFUicKKyAgICB0WzBdID0gdFsxXQorCitkZWYgcF9leHByZXNzaW9uX25hbWUodCk6CisgICAgJ2V4cHJlc3Npb24gOiBOQU1FJworICAgIHRyeToKKyAgICAgICAgdFswXSA9IG5hbWVzW3RbMV1dCisgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICBwcmludCgiVW5kZWZpbmVkIG5hbWUgJyVzJyIgJSB0WzFdKQorICAgICAgICB0WzBdID0gMAorCitkZWYgcF9lcnJvcl9oYW5kbGVyKHQpOgorICAgICdlcnJvciA6IE5BTUUnCisgICAgcGFzcworCitkZWYgcF9lcnJvcih0KToKKyAgICBwYXNzCisKK3lhY2MueWFjYygpCisKKworCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L3lhY2NfZXJyb3I1LnB5IGIvcGx5L3Rlc3QveWFjY19lcnJvcjUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWViMGY4NQotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L3lhY2NfZXJyb3I1LnB5CkBAIC0wLDAgKzEsOTQgQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgeWFjY19lcnJvcjUucHkKKyMKKyMgTGluZW5vIGFuZCBwb3NpdGlvbiB0cmFja2luZyB3aXRoIGVycm9yIHRva2VucworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW1wb3J0IHN5cworCitpZiAiLi4iIG5vdCBpbiBzeXMucGF0aDogc3lzLnBhdGguaW5zZXJ0KDAsIi4uIikKK2ltcG9ydCBwbHkueWFjYyBhcyB5YWNjCisKK2Zyb20gY2FsY2xleCBpbXBvcnQgdG9rZW5zCisKKyMgUGFyc2luZyBydWxlcworcHJlY2VkZW5jZSA9ICgKKyAgICAoJ2xlZnQnLCdQTFVTJywnTUlOVVMnKSwKKyAgICAoJ2xlZnQnLCdUSU1FUycsJ0RJVklERScpLAorICAgICgncmlnaHQnLCdVTUlOVVMnKSwKKyAgICApCisKKyMgZGljdGlvbmFyeSBvZiBuYW1lcworbmFtZXMgPSB7IH0KKworZGVmIHBfc3RhdGVtZW50X2Fzc2lnbih0KToKKyAgICAnc3RhdGVtZW50IDogTkFNRSBFUVVBTFMgZXhwcmVzc2lvbicKKyAgICBuYW1lc1t0WzFdXSA9IHRbM10KKworZGVmIHBfc3RhdGVtZW50X2Fzc2lnbl9lcnJvcih0KToKKyAgICAnc3RhdGVtZW50IDogTkFNRSBFUVVBTFMgZXJyb3InCisgICAgbGluZV9zdGFydCwgbGluZV9lbmQgPSB0LmxpbmVzcGFuKDMpCisgICAgcG9zX3N0YXJ0LCBwb3NfZW5kID0gdC5sZXhzcGFuKDMpCisgICAgcHJpbnQoIkFzc2lnbm1lbnQgRXJyb3IgYXQgJWQ6JWQgdG8gJWQ6JWQiICUgKGxpbmVfc3RhcnQscG9zX3N0YXJ0LGxpbmVfZW5kLHBvc19lbmQpKQorCitkZWYgcF9zdGF0ZW1lbnRfZXhwcih0KToKKyAgICAnc3RhdGVtZW50IDogZXhwcmVzc2lvbicKKyAgICBwcmludCh0WzFdKQorCitkZWYgcF9leHByZXNzaW9uX2Jpbm9wKHQpOgorICAgICcnJ2V4cHJlc3Npb24gOiBleHByZXNzaW9uIFBMVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIE1JTlVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBUSU1FUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gRElWSURFIGV4cHJlc3Npb24nJycKKyAgICBpZiB0WzJdID09ICcrJyAgOiB0WzBdID0gdFsxXSArIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy0nOiB0WzBdID0gdFsxXSAtIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJyonOiB0WzBdID0gdFsxXSAqIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy8nOiB0WzBdID0gdFsxXSAvIHRbM10KKworZGVmIHBfZXhwcmVzc2lvbl91bWludXModCk6CisgICAgJ2V4cHJlc3Npb24gOiBNSU5VUyBleHByZXNzaW9uICVwcmVjIFVNSU5VUycKKyAgICB0WzBdID0gLXRbMl0KKworZGVmIHBfZXhwcmVzc2lvbl9ncm91cCh0KToKKyAgICAnZXhwcmVzc2lvbiA6IExQQVJFTiBleHByZXNzaW9uIFJQQVJFTicKKyAgICBsaW5lX3N0YXJ0LCBsaW5lX2VuZCA9IHQubGluZXNwYW4oMikKKyAgICBwb3Nfc3RhcnQsIHBvc19lbmQgPSB0LmxleHNwYW4oMikKKyAgICBwcmludCgiR3JvdXAgYXQgJWQ6JWQgdG8gJWQ6JWQiICUgKGxpbmVfc3RhcnQscG9zX3N0YXJ0LCBsaW5lX2VuZCwgcG9zX2VuZCkpCisgICAgdFswXSA9IHRbMl0KKworZGVmIHBfZXhwcmVzc2lvbl9ncm91cF9lcnJvcih0KToKKyAgICAnZXhwcmVzc2lvbiA6IExQQVJFTiBlcnJvciBSUEFSRU4nCisgICAgbGluZV9zdGFydCwgbGluZV9lbmQgPSB0LmxpbmVzcGFuKDIpCisgICAgcG9zX3N0YXJ0LCBwb3NfZW5kID0gdC5sZXhzcGFuKDIpCisgICAgcHJpbnQoIlN5bnRheCBlcnJvciBhdCAlZDolZCB0byAlZDolZCIgJSAobGluZV9zdGFydCxwb3Nfc3RhcnQsIGxpbmVfZW5kLCBwb3NfZW5kKSkKKyAgICB0WzBdID0gMAorICAgIAorZGVmIHBfZXhwcmVzc2lvbl9udW1iZXIodCk6CisgICAgJ2V4cHJlc3Npb24gOiBOVU1CRVInCisgICAgdFswXSA9IHRbMV0KKworZGVmIHBfZXhwcmVzc2lvbl9uYW1lKHQpOgorICAgICdleHByZXNzaW9uIDogTkFNRScKKyAgICB0cnk6CisgICAgICAgIHRbMF0gPSBuYW1lc1t0WzFdXQorICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICAgICAgcHJpbnQoIlVuZGVmaW5lZCBuYW1lICclcyciICUgdFsxXSkKKyAgICAgICAgdFswXSA9IDAKKworZGVmIHBfZXJyb3IodCk6CisgICAgcHJpbnQoIlN5bnRheCBlcnJvciBhdCAnJXMnIiAlIHQudmFsdWUpCisKK3BhcnNlciA9IHlhY2MueWFjYygpCitpbXBvcnQgY2FsY2xleAorY2FsY2xleC5sZXhlci5saW5lbm89MQorcGFyc2VyLnBhcnNlKCIiIgorYSA9IDMgKworKDQqNSkgKworKGEgYiBjKSArCisrIDYgKyA3CisiIiIsIHRyYWNraW5nPVRydWUpCisKKworCisKKworCmRpZmYgLS1naXQgYS9wbHkvdGVzdC95YWNjX2Vycm9yNi5weSBiL3BseS90ZXN0L3lhY2NfZXJyb3I2LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMGVjODUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC95YWNjX2Vycm9yNi5weQpAQCAtMCwwICsxLDgwIEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHlhY2NfZXJyb3I2LnB5CisjCisjIFBhbmljIG1vZGUgcmVjb3ZlcnkgdGVzdAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW1wb3J0IHN5cworCitpZiAiLi4iIG5vdCBpbiBzeXMucGF0aDogc3lzLnBhdGguaW5zZXJ0KDAsIi4uIikKK2ltcG9ydCBwbHkueWFjYyBhcyB5YWNjCisKK2Zyb20gY2FsY2xleCBpbXBvcnQgdG9rZW5zCisKKyMgUGFyc2luZyBydWxlcworcHJlY2VkZW5jZSA9ICgKKyAgICAoJ2xlZnQnLCdQTFVTJywnTUlOVVMnKSwKKyAgICAoJ2xlZnQnLCdUSU1FUycsJ0RJVklERScpLAorICAgICgncmlnaHQnLCdVTUlOVVMnKSwKKyAgICApCisKK2RlZiBwX3N0YXRlbWVudHModCk6CisgICAgJ3N0YXRlbWVudHMgOiBzdGF0ZW1lbnRzIHN0YXRlbWVudCcKKyAgICBwYXNzCisKK2RlZiBwX3N0YXRlbWVudHNfMSh0KToKKyAgICAnc3RhdGVtZW50cyA6IHN0YXRlbWVudCcKKyAgICBwYXNzCisKK2RlZiBwX3N0YXRlbWVudF9hc3NpZ24ocCk6CisgICAgJ3N0YXRlbWVudCA6IExQQVJFTiBOQU1FIEVRVUFMUyBleHByZXNzaW9uIFJQQVJFTicKKyAgICBwcmludCgiJXM9JXMiICUgKHBbMl0scFs0XSkpCisKK2RlZiBwX3N0YXRlbWVudF9leHByKHQpOgorICAgICdzdGF0ZW1lbnQgOiBMUEFSRU4gZXhwcmVzc2lvbiBSUEFSRU4nCisgICAgcHJpbnQodFsxXSkKKworZGVmIHBfZXhwcmVzc2lvbl9iaW5vcCh0KToKKyAgICAnJydleHByZXNzaW9uIDogZXhwcmVzc2lvbiBQTFVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBNSU5VUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gVElNRVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIERJVklERSBleHByZXNzaW9uJycnCisgICAgaWYgdFsyXSA9PSAnKycgIDogdFswXSA9IHRbMV0gKyB0WzNdCisgICAgZWxpZiB0WzJdID09ICctJzogdFswXSA9IHRbMV0gLSB0WzNdCisgICAgZWxpZiB0WzJdID09ICcqJzogdFswXSA9IHRbMV0gKiB0WzNdCisgICAgZWxpZiB0WzJdID09ICcvJzogdFswXSA9IHRbMV0gLyB0WzNdCisKK2RlZiBwX2V4cHJlc3Npb25fdW1pbnVzKHQpOgorICAgICdleHByZXNzaW9uIDogTUlOVVMgZXhwcmVzc2lvbiAlcHJlYyBVTUlOVVMnCisgICAgdFswXSA9IC10WzJdCisKK2RlZiBwX2V4cHJlc3Npb25fbnVtYmVyKHQpOgorICAgICdleHByZXNzaW9uIDogTlVNQkVSJworICAgIHRbMF0gPSB0WzFdCisKK2RlZiBwX2Vycm9yKHApOgorICAgIGlmIHA6CisgICAgICAgIHByaW50KCJMaW5lICVkOiBTeW50YXggZXJyb3IgYXQgJyVzJyIgJSAocC5saW5lbm8sIHAudmFsdWUpKQorICAgICMgU2NhbiBhaGVhZCBsb29raW5nIGZvciBhIG5hbWUgdG9rZW4KKyAgICB3aGlsZSBUcnVlOgorICAgICAgICB0b2sgPSBwYXJzZXIudG9rZW4oKQorICAgICAgICBpZiBub3QgdG9rIG9yIHRvay50eXBlID09ICdSUEFSRU4nOgorICAgICAgICAgICAgYnJlYWsKKyAgICBpZiB0b2s6CisgICAgICAgIHBhcnNlci5yZXN0YXJ0KCkKKyAgICByZXR1cm4gTm9uZQorCitwYXJzZXIgPSB5YWNjLnlhY2MoKQoraW1wb3J0IGNhbGNsZXgKK2NhbGNsZXgubGV4ZXIubGluZW5vPTEKKworcGFyc2VyLnBhcnNlKCIiIgorKGEgPSAzICsgNCkKKyhiID0gNCArICogNSAtIDYgKyAqKQorKGMgPSAxMCArIDExKQorIiIiKQorCisKKworCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QveWFjY19lcnJvcjcucHkgYi9wbHkvdGVzdC95YWNjX2Vycm9yNy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjEzMWJlCi0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QveWFjY19lcnJvcjcucHkKQEAgLTAsMCArMSw4MCBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB5YWNjX2Vycm9yNy5weQorIworIyBQYW5pYyBtb2RlIHJlY292ZXJ5IHRlc3QgdXNpbmcgZGVwcmVjYXRlZCBmdW5jdGlvbmFsaXR5CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbXBvcnQgc3lzCisKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQoraW1wb3J0IHBseS55YWNjIGFzIHlhY2MKKworZnJvbSBjYWxjbGV4IGltcG9ydCB0b2tlbnMKKworIyBQYXJzaW5nIHJ1bGVzCitwcmVjZWRlbmNlID0gKAorICAgICgnbGVmdCcsJ1BMVVMnLCdNSU5VUycpLAorICAgICgnbGVmdCcsJ1RJTUVTJywnRElWSURFJyksCisgICAgKCdyaWdodCcsJ1VNSU5VUycpLAorICAgICkKKworZGVmIHBfc3RhdGVtZW50cyh0KToKKyAgICAnc3RhdGVtZW50cyA6IHN0YXRlbWVudHMgc3RhdGVtZW50JworICAgIHBhc3MKKworZGVmIHBfc3RhdGVtZW50c18xKHQpOgorICAgICdzdGF0ZW1lbnRzIDogc3RhdGVtZW50JworICAgIHBhc3MKKworZGVmIHBfc3RhdGVtZW50X2Fzc2lnbihwKToKKyAgICAnc3RhdGVtZW50IDogTFBBUkVOIE5BTUUgRVFVQUxTIGV4cHJlc3Npb24gUlBBUkVOJworICAgIHByaW50KCIlcz0lcyIgJSAocFsyXSxwWzRdKSkKKworZGVmIHBfc3RhdGVtZW50X2V4cHIodCk6CisgICAgJ3N0YXRlbWVudCA6IExQQVJFTiBleHByZXNzaW9uIFJQQVJFTicKKyAgICBwcmludCh0WzFdKQorCitkZWYgcF9leHByZXNzaW9uX2Jpbm9wKHQpOgorICAgICcnJ2V4cHJlc3Npb24gOiBleHByZXNzaW9uIFBMVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIE1JTlVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBUSU1FUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gRElWSURFIGV4cHJlc3Npb24nJycKKyAgICBpZiB0WzJdID09ICcrJyAgOiB0WzBdID0gdFsxXSArIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy0nOiB0WzBdID0gdFsxXSAtIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJyonOiB0WzBdID0gdFsxXSAqIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy8nOiB0WzBdID0gdFsxXSAvIHRbM10KKworZGVmIHBfZXhwcmVzc2lvbl91bWludXModCk6CisgICAgJ2V4cHJlc3Npb24gOiBNSU5VUyBleHByZXNzaW9uICVwcmVjIFVNSU5VUycKKyAgICB0WzBdID0gLXRbMl0KKworZGVmIHBfZXhwcmVzc2lvbl9udW1iZXIodCk6CisgICAgJ2V4cHJlc3Npb24gOiBOVU1CRVInCisgICAgdFswXSA9IHRbMV0KKworZGVmIHBfZXJyb3IocCk6CisgICAgaWYgcDoKKyAgICAgICAgcHJpbnQoIkxpbmUgJWQ6IFN5bnRheCBlcnJvciBhdCAnJXMnIiAlIChwLmxpbmVubywgcC52YWx1ZSkpCisgICAgIyBTY2FuIGFoZWFkIGxvb2tpbmcgZm9yIGEgbmFtZSB0b2tlbgorICAgIHdoaWxlIFRydWU6CisgICAgICAgIHRvayA9IHlhY2MudG9rZW4oKQorICAgICAgICBpZiBub3QgdG9rIG9yIHRvay50eXBlID09ICdSUEFSRU4nOgorICAgICAgICAgICAgYnJlYWsKKyAgICBpZiB0b2s6CisgICAgICAgIHlhY2MucmVzdGFydCgpCisgICAgcmV0dXJuIE5vbmUKKworcGFyc2VyID0geWFjYy55YWNjKCkKK2ltcG9ydCBjYWxjbGV4CitjYWxjbGV4LmxleGVyLmxpbmVubz0xCisKK3BhcnNlci5wYXJzZSgiIiIKKyhhID0gMyArIDQpCisoYiA9IDQgKyAqIDUgLSA2ICsgKikKKyhjID0gMTAgKyAxMSkKKyIiIikKKworCisKKworCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L3lhY2NfaW5mLnB5IGIvcGx5L3Rlc3QveWFjY19pbmYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZkMzYxMgotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L3lhY2NfaW5mLnB5CkBAIC0wLDAgKzEsNTYgQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgeWFjY19pbmYucHkKKyMKKyMgSW5maW5pdGUgcmVjdXJzaW9uCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbXBvcnQgc3lzCisKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQoraW1wb3J0IHBseS55YWNjIGFzIHlhY2MKKworZnJvbSBjYWxjbGV4IGltcG9ydCB0b2tlbnMKKworIyBQYXJzaW5nIHJ1bGVzCitwcmVjZWRlbmNlID0gKAorICAgICgnbGVmdCcsJ1BMVVMnLCdNSU5VUycpLAorICAgICgnbGVmdCcsJ1RJTUVTJywnRElWSURFJyksCisgICAgKCdyaWdodCcsJ1VNSU5VUycpLAorICAgICkKKworIyBkaWN0aW9uYXJ5IG9mIG5hbWVzCituYW1lcyA9IHsgfQorCitkZWYgcF9zdGF0ZW1lbnRfYXNzaWduKHQpOgorICAgICdzdGF0ZW1lbnQgOiBOQU1FIEVRVUFMUyBleHByZXNzaW9uJworICAgIG5hbWVzW3RbMV1dID0gdFszXQorCitkZWYgcF9zdGF0ZW1lbnRfZXhwcih0KToKKyAgICAnc3RhdGVtZW50IDogZXhwcmVzc2lvbicKKyAgICBwcmludCh0WzFdKQorCitkZWYgcF9leHByZXNzaW9uX2Jpbm9wKHQpOgorICAgICcnJ2V4cHJlc3Npb24gOiBleHByZXNzaW9uIFBMVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIE1JTlVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBUSU1FUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gRElWSURFIGV4cHJlc3Npb24nJycKKyAgICBpZiB0WzJdID09ICcrJyAgOiB0WzBdID0gdFsxXSArIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy0nOiB0WzBdID0gdFsxXSAtIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJyonOiB0WzBdID0gdFsxXSAqIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy8nOiB0WzBdID0gdFsxXSAvIHRbM10KKworZGVmIHBfZXhwcmVzc2lvbl91bWludXModCk6CisgICAgJ2V4cHJlc3Npb24gOiBNSU5VUyBleHByZXNzaW9uICVwcmVjIFVNSU5VUycKKyAgICB0WzBdID0gLXRbMl0KKworZGVmIHBfZXhwcmVzc2lvbl9ncm91cCh0KToKKyAgICAnZXhwcmVzc2lvbiA6IExQQVJFTiBleHByZXNzaW9uIFJQQVJFTicKKyAgICB0WzBdID0gdFsyXQorCitkZWYgcF9lcnJvcih0KToKKyAgICBwcmludCgiU3ludGF4IGVycm9yIGF0ICclcyciICUgdC52YWx1ZSkKKworeWFjYy55YWNjKCkKKworCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QveWFjY19saXRlcmFsLnB5IGIvcGx5L3Rlc3QveWFjY19saXRlcmFsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNjI4MDMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC95YWNjX2xpdGVyYWwucHkKQEAgLTAsMCArMSw2OSBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB5YWNjX2xpdGVyYWwucHkKKyMKKyMgR3JhbW1hciB3aXRoIGJhZCBsaXRlcmFsIGNoYXJhY3RlcnMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ltcG9ydCBzeXMKKworaWYgIi4uIiBub3QgaW4gc3lzLnBhdGg6IHN5cy5wYXRoLmluc2VydCgwLCIuLiIpCitpbXBvcnQgcGx5LnlhY2MgYXMgeWFjYworCitmcm9tIGNhbGNsZXggaW1wb3J0IHRva2VucworCisjIFBhcnNpbmcgcnVsZXMKK3ByZWNlZGVuY2UgPSAoCisgICAgKCdsZWZ0JywnKycsJy0nKSwKKyAgICAoJ2xlZnQnLCcqJywnLycpLAorICAgICgncmlnaHQnLCdVTUlOVVMnKSwKKyAgICApCisKKyMgZGljdGlvbmFyeSBvZiBuYW1lcworbmFtZXMgPSB7IH0KKworZGVmIHBfc3RhdGVtZW50X2Fzc2lnbih0KToKKyAgICAnc3RhdGVtZW50IDogTkFNRSBFUVVBTFMgZXhwcmVzc2lvbicKKyAgICBuYW1lc1t0WzFdXSA9IHRbM10KKworZGVmIHBfc3RhdGVtZW50X2V4cHIodCk6CisgICAgJ3N0YXRlbWVudCA6IGV4cHJlc3Npb24nCisgICAgcHJpbnQodFsxXSkKKworZGVmIHBfZXhwcmVzc2lvbl9iaW5vcCh0KToKKyAgICAnJydleHByZXNzaW9uIDogZXhwcmVzc2lvbiAnKycgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uICctJyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gJyonIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiAnLycgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uICcqKicgZXhwcmVzc2lvbiAnJycKKyAgICBpZiB0WzJdID09ICcrJyAgOiB0WzBdID0gdFsxXSArIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy0nOiB0WzBdID0gdFsxXSAtIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJyonOiB0WzBdID0gdFsxXSAqIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy8nOiB0WzBdID0gdFsxXSAvIHRbM10KKworZGVmIHBfZXhwcmVzc2lvbl91bWludXModCk6CisgICAgJ2V4cHJlc3Npb24gOiBNSU5VUyBleHByZXNzaW9uICVwcmVjIFVNSU5VUycKKyAgICB0WzBdID0gLXRbMl0KKworZGVmIHBfZXhwcmVzc2lvbl9ncm91cCh0KToKKyAgICAnZXhwcmVzc2lvbiA6IExQQVJFTiBleHByZXNzaW9uIFJQQVJFTicKKyAgICB0WzBdID0gdFsyXQorCitkZWYgcF9leHByZXNzaW9uX251bWJlcih0KToKKyAgICAnZXhwcmVzc2lvbiA6IE5VTUJFUicKKyAgICB0WzBdID0gdFsxXQorCitkZWYgcF9leHByZXNzaW9uX25hbWUodCk6CisgICAgJ2V4cHJlc3Npb24gOiBOQU1FJworICAgIHRyeToKKyAgICAgICAgdFswXSA9IG5hbWVzW3RbMV1dCisgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICBwcmludCgiVW5kZWZpbmVkIG5hbWUgJyVzJyIgJSB0WzFdKQorICAgICAgICB0WzBdID0gMAorCitkZWYgcF9lcnJvcih0KToKKyAgICBwcmludCgiU3ludGF4IGVycm9yIGF0ICclcyciICUgdC52YWx1ZSkKKworeWFjYy55YWNjKCkKKworCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QveWFjY19taXNwbGFjZWQucHkgYi9wbHkvdGVzdC95YWNjX21pc3BsYWNlZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTU5YjAxCi0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QveWFjY19taXNwbGFjZWQucHkKQEAgLTAsMCArMSw2OCBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB5YWNjX21pc3BsYWNlZC5weQorIworIyBBIG1pc3BsYWNlZCB8IGluIGdyYW1tYXIgcnVsZXMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ltcG9ydCBzeXMKKworaWYgIi4uIiBub3QgaW4gc3lzLnBhdGg6IHN5cy5wYXRoLmluc2VydCgwLCIuLiIpCitpbXBvcnQgcGx5LnlhY2MgYXMgeWFjYworCitmcm9tIGNhbGNsZXggaW1wb3J0IHRva2VucworCisjIFBhcnNpbmcgcnVsZXMKK3ByZWNlZGVuY2UgPSAoCisgICAgKCdsZWZ0JywnUExVUycsJ01JTlVTJyksCisgICAgKCdsZWZ0JywnVElNRVMnLCdESVZJREUnKSwKKyAgICAoJ3JpZ2h0JywnVU1JTlVTJyksCisgICAgKQorCisjIGRpY3Rpb25hcnkgb2YgbmFtZXMKK25hbWVzID0geyB9CisKK2RlZiBwX3N0YXRlbWVudF9hc3NpZ24odCk6CisgICAgJ3N0YXRlbWVudCA6IE5BTUUgRVFVQUxTIGV4cHJlc3Npb24nCisgICAgbmFtZXNbdFsxXV0gPSB0WzNdCisKK2RlZiBwX3N0YXRlbWVudF9leHByKHQpOgorICAgICdzdGF0ZW1lbnQgOiBleHByZXNzaW9uJworICAgIHByaW50KHRbMV0pCisKK2RlZiBwX2V4cHJlc3Npb25fYmlub3AodCk6CisgICAgJycnICAgICAgICAgICB8IGV4cHJlc3Npb24gUExVUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gTUlOVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIFRJTUVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBESVZJREUgZXhwcmVzc2lvbicnJworICAgIGlmIHRbMl0gPT0gJysnICA6IHRbMF0gPSB0WzFdICsgdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLSc6IHRbMF0gPSB0WzFdIC0gdFszXQorICAgIGVsaWYgdFsyXSA9PSAnKic6IHRbMF0gPSB0WzFdICogdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLyc6IHRbMF0gPSB0WzFdIC8gdFszXQorCitkZWYgcF9leHByZXNzaW9uX3VtaW51cyh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE1JTlVTIGV4cHJlc3Npb24gJXByZWMgVU1JTlVTJworICAgIHRbMF0gPSAtdFsyXQorCitkZWYgcF9leHByZXNzaW9uX2dyb3VwKHQpOgorICAgICdleHByZXNzaW9uIDogTFBBUkVOIGV4cHJlc3Npb24gUlBBUkVOJworICAgIHRbMF0gPSB0WzJdCisKK2RlZiBwX2V4cHJlc3Npb25fbnVtYmVyKHQpOgorICAgICdleHByZXNzaW9uIDogTlVNQkVSJworICAgIHRbMF0gPSB0WzFdCisKK2RlZiBwX2V4cHJlc3Npb25fbmFtZSh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE5BTUUnCisgICAgdHJ5OgorICAgICAgICB0WzBdID0gbmFtZXNbdFsxXV0KKyAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgIHByaW50KCJVbmRlZmluZWQgbmFtZSAnJXMnIiAlIHRbMV0pCisgICAgICAgIHRbMF0gPSAwCisKK2RlZiBwX2Vycm9yKHQpOgorICAgIHByaW50KCJTeW50YXggZXJyb3IgYXQgJyVzJyIgJSB0LnZhbHVlKQorCit5YWNjLnlhY2MoKQorCisKKworCmRpZmYgLS1naXQgYS9wbHkvdGVzdC95YWNjX21pc3NpbmcxLnB5IGIvcGx5L3Rlc3QveWFjY19taXNzaW5nMS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWI1MTA1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QveWFjY19taXNzaW5nMS5weQpAQCAtMCwwICsxLDY4IEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHlhY2NfbWlzc2luZzEucHkKKyMKKyMgR3JhbW1hciB3aXRoIGEgbWlzc2luZyBydWxlCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbXBvcnQgc3lzCisKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQoraW1wb3J0IHBseS55YWNjIGFzIHlhY2MKKworZnJvbSBjYWxjbGV4IGltcG9ydCB0b2tlbnMKKworIyBQYXJzaW5nIHJ1bGVzCitwcmVjZWRlbmNlID0gKAorICAgICgnbGVmdCcsJ1BMVVMnLCdNSU5VUycpLAorICAgICgnbGVmdCcsJ1RJTUVTJywnRElWSURFJyksCisgICAgKCdyaWdodCcsJ1VNSU5VUycpLAorICAgICkKKworIyBkaWN0aW9uYXJ5IG9mIG5hbWVzCituYW1lcyA9IHsgfQorCitkZWYgcF9zdGF0ZW1lbnRfYXNzaWduKHQpOgorICAgICdzdGF0ZW1lbnQgOiBsb2NhdGlvbiBFUVVBTFMgZXhwcmVzc2lvbicKKyAgICBuYW1lc1t0WzFdXSA9IHRbM10KKworZGVmIHBfc3RhdGVtZW50X2V4cHIodCk6CisgICAgJ3N0YXRlbWVudCA6IGV4cHJlc3Npb24nCisgICAgcHJpbnQodFsxXSkKKworZGVmIHBfZXhwcmVzc2lvbl9iaW5vcCh0KToKKyAgICAnJydleHByZXNzaW9uIDogZXhwcmVzc2lvbiBQTFVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBNSU5VUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gVElNRVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIERJVklERSBleHByZXNzaW9uJycnCisgICAgaWYgdFsyXSA9PSAnKycgIDogdFswXSA9IHRbMV0gKyB0WzNdCisgICAgZWxpZiB0WzJdID09ICctJzogdFswXSA9IHRbMV0gLSB0WzNdCisgICAgZWxpZiB0WzJdID09ICcqJzogdFswXSA9IHRbMV0gKiB0WzNdCisgICAgZWxpZiB0WzJdID09ICcvJzogdFswXSA9IHRbMV0gLyB0WzNdCisKK2RlZiBwX2V4cHJlc3Npb25fdW1pbnVzKHQpOgorICAgICdleHByZXNzaW9uIDogTUlOVVMgZXhwcmVzc2lvbiAlcHJlYyBVTUlOVVMnCisgICAgdFswXSA9IC10WzJdCisKK2RlZiBwX2V4cHJlc3Npb25fZ3JvdXAodCk6CisgICAgJ2V4cHJlc3Npb24gOiBMUEFSRU4gZXhwcmVzc2lvbiBSUEFSRU4nCisgICAgdFswXSA9IHRbMl0KKworZGVmIHBfZXhwcmVzc2lvbl9udW1iZXIodCk6CisgICAgJ2V4cHJlc3Npb24gOiBOVU1CRVInCisgICAgdFswXSA9IHRbMV0KKworZGVmIHBfZXhwcmVzc2lvbl9uYW1lKHQpOgorICAgICdleHByZXNzaW9uIDogTkFNRScKKyAgICB0cnk6CisgICAgICAgIHRbMF0gPSBuYW1lc1t0WzFdXQorICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICAgICAgcHJpbnQoIlVuZGVmaW5lZCBuYW1lICclcyciICUgdFsxXSkKKyAgICAgICAgdFswXSA9IDAKKworZGVmIHBfZXJyb3IodCk6CisgICAgcHJpbnQoIlN5bnRheCBlcnJvciBhdCAnJXMnIiAlIHQudmFsdWUpCisKK3lhY2MueWFjYygpCisKKworCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L3lhY2NfbmVzdGVkLnB5IGIvcGx5L3Rlc3QveWFjY19uZXN0ZWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFiMDYxZQotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L3lhY2NfbmVzdGVkLnB5CkBAIC0wLDAgKzEsMzMgQEAKK2ltcG9ydCBzeXMKKworaWYgIi4uIiBub3QgaW4gc3lzLnBhdGg6IHN5cy5wYXRoLmluc2VydCgwLCIuLiIpCisKK2Zyb20gcGx5IGltcG9ydCBsZXgsIHlhY2MKKwordF9BID0gJ0EnCit0X0IgPSAnQicKK3RfQyA9ICdDJworCit0b2tlbnMgPSAoJ0EnLCAnQicsICdDJykKKwordGhlX2xleGVyID0gbGV4LmxleCgpCisKK2RlZiB0X2Vycm9yKHQpOgorICAgIHBhc3MKKworZGVmIHBfZXJyb3IocCk6CisgICAgcGFzcworCitkZWYgcF9zdGFydCh0KToKKyAgICAnJydzdGFydCA6IEEgbmVzdCBDJycnCisgICAgcGFzcworCitkZWYgcF9uZXN0KHQpOgorICAgJycnbmVzdCA6IEInJycKKyAgIHByaW50KHRbLTFdKQorCit0aGVfcGFyc2VyID0geWFjYy55YWNjKGRlYnVnID0gRmFsc2UsIHdyaXRlX3RhYmxlcyA9IEZhbHNlKQorCit0aGVfcGFyc2VyLnBhcnNlKCdBQkMnLCB0aGVfbGV4ZXIpCit0aGVfcGFyc2VyLnBhcnNlKCdBQkMnLCB0aGVfbGV4ZXIsIHRyYWNraW5nPVRydWUpCit0aGVfcGFyc2VyLnBhcnNlKCdBQkMnLCB0aGVfbGV4ZXIsIHRyYWNraW5nPVRydWUsIGRlYnVnPTEpCmRpZmYgLS1naXQgYS9wbHkvdGVzdC95YWNjX25vZG9jLnB5IGIvcGx5L3Rlc3QveWFjY19ub2RvYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjYxOTIwCi0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QveWFjY19ub2RvYy5weQpAQCAtMCwwICsxLDY3IEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHlhY2Nfbm9kb2MucHkKKyMKKyMgUnVsZSB3aXRoIGEgbWlzc2luZyBkb2Mtc3RyaW5nCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbXBvcnQgc3lzCisKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQoraW1wb3J0IHBseS55YWNjIGFzIHlhY2MKKworZnJvbSBjYWxjbGV4IGltcG9ydCB0b2tlbnMKKworIyBQYXJzaW5nIHJ1bGVzCitwcmVjZWRlbmNlID0gKAorICAgICgnbGVmdCcsJ1BMVVMnLCdNSU5VUycpLAorICAgICgnbGVmdCcsJ1RJTUVTJywnRElWSURFJyksCisgICAgKCdyaWdodCcsJ1VNSU5VUycpLAorICAgICkKKworIyBkaWN0aW9uYXJ5IG9mIG5hbWVzCituYW1lcyA9IHsgfQorCitkZWYgcF9zdGF0ZW1lbnRfYXNzaWduKHQpOgorICAgICdzdGF0ZW1lbnQgOiBOQU1FIEVRVUFMUyBleHByZXNzaW9uJworICAgIG5hbWVzW3RbMV1dID0gdFszXQorCitkZWYgcF9zdGF0ZW1lbnRfZXhwcih0KToKKyAgICBwcmludCh0WzFdKQorCitkZWYgcF9leHByZXNzaW9uX2Jpbm9wKHQpOgorICAgICcnJ2V4cHJlc3Npb24gOiBleHByZXNzaW9uIFBMVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIE1JTlVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBUSU1FUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gRElWSURFIGV4cHJlc3Npb24nJycKKyAgICBpZiB0WzJdID09ICcrJyAgOiB0WzBdID0gdFsxXSArIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy0nOiB0WzBdID0gdFsxXSAtIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJyonOiB0WzBdID0gdFsxXSAqIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy8nOiB0WzBdID0gdFsxXSAvIHRbM10KKworZGVmIHBfZXhwcmVzc2lvbl91bWludXModCk6CisgICAgJ2V4cHJlc3Npb24gOiBNSU5VUyBleHByZXNzaW9uICVwcmVjIFVNSU5VUycKKyAgICB0WzBdID0gLXRbMl0KKworZGVmIHBfZXhwcmVzc2lvbl9ncm91cCh0KToKKyAgICAnZXhwcmVzc2lvbiA6IExQQVJFTiBleHByZXNzaW9uIFJQQVJFTicKKyAgICB0WzBdID0gdFsyXQorCitkZWYgcF9leHByZXNzaW9uX251bWJlcih0KToKKyAgICAnZXhwcmVzc2lvbiA6IE5VTUJFUicKKyAgICB0WzBdID0gdFsxXQorCitkZWYgcF9leHByZXNzaW9uX25hbWUodCk6CisgICAgJ2V4cHJlc3Npb24gOiBOQU1FJworICAgIHRyeToKKyAgICAgICAgdFswXSA9IG5hbWVzW3RbMV1dCisgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICBwcmludCgiVW5kZWZpbmVkIG5hbWUgJyVzJyIgJSB0WzFdKQorICAgICAgICB0WzBdID0gMAorCitkZWYgcF9lcnJvcih0KToKKyAgICBwcmludCgiU3ludGF4IGVycm9yIGF0ICclcyciICUgdC52YWx1ZSkKKworeWFjYy55YWNjKCkKKworCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QveWFjY19ub2Vycm9yLnB5IGIvcGx5L3Rlc3QveWFjY19ub2Vycm9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOGM3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC95YWNjX25vZXJyb3IucHkKQEAgLTAsMCArMSw2NiBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB5YWNjX25vZXJyb3IucHkKKyMKKyMgTm8gcF9lcnJvcigpIHJ1bGUgZGVmaW5lZC4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ltcG9ydCBzeXMKKworaWYgIi4uIiBub3QgaW4gc3lzLnBhdGg6IHN5cy5wYXRoLmluc2VydCgwLCIuLiIpCitpbXBvcnQgcGx5LnlhY2MgYXMgeWFjYworCitmcm9tIGNhbGNsZXggaW1wb3J0IHRva2VucworCisjIFBhcnNpbmcgcnVsZXMKK3ByZWNlZGVuY2UgPSAoCisgICAgKCdsZWZ0JywnUExVUycsJ01JTlVTJyksCisgICAgKCdsZWZ0JywnVElNRVMnLCdESVZJREUnKSwKKyAgICAoJ3JpZ2h0JywnVU1JTlVTJyksCisgICAgKQorCisjIGRpY3Rpb25hcnkgb2YgbmFtZXMKK25hbWVzID0geyB9CisKK2RlZiBwX3N0YXRlbWVudF9hc3NpZ24odCk6CisgICAgJ3N0YXRlbWVudCA6IE5BTUUgRVFVQUxTIGV4cHJlc3Npb24nCisgICAgbmFtZXNbdFsxXV0gPSB0WzNdCisKK2RlZiBwX3N0YXRlbWVudF9leHByKHQpOgorICAgICdzdGF0ZW1lbnQgOiBleHByZXNzaW9uJworICAgIHByaW50KHRbMV0pCisKK2RlZiBwX2V4cHJlc3Npb25fYmlub3AodCk6CisgICAgJycnZXhwcmVzc2lvbiA6IGV4cHJlc3Npb24gUExVUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gTUlOVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIFRJTUVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBESVZJREUgZXhwcmVzc2lvbicnJworICAgIGlmIHRbMl0gPT0gJysnICA6IHRbMF0gPSB0WzFdICsgdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLSc6IHRbMF0gPSB0WzFdIC0gdFszXQorICAgIGVsaWYgdFsyXSA9PSAnKic6IHRbMF0gPSB0WzFdICogdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLyc6IHRbMF0gPSB0WzFdIC8gdFszXQorCitkZWYgcF9leHByZXNzaW9uX3VtaW51cyh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE1JTlVTIGV4cHJlc3Npb24gJXByZWMgVU1JTlVTJworICAgIHRbMF0gPSAtdFsyXQorCitkZWYgcF9leHByZXNzaW9uX2dyb3VwKHQpOgorICAgICdleHByZXNzaW9uIDogTFBBUkVOIGV4cHJlc3Npb24gUlBBUkVOJworICAgIHRbMF0gPSB0WzJdCisKK2RlZiBwX2V4cHJlc3Npb25fbnVtYmVyKHQpOgorICAgICdleHByZXNzaW9uIDogTlVNQkVSJworICAgIHRbMF0gPSB0WzFdCisKK2RlZiBwX2V4cHJlc3Npb25fbmFtZSh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE5BTUUnCisgICAgdHJ5OgorICAgICAgICB0WzBdID0gbmFtZXNbdFsxXV0KKyAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgIHByaW50KCJVbmRlZmluZWQgbmFtZSAnJXMnIiAlIHRbMV0pCisgICAgICAgIHRbMF0gPSAwCisKKworeWFjYy55YWNjKCkKKworCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QveWFjY19ub3AucHkgYi9wbHkvdGVzdC95YWNjX25vcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODlhOWNmCi0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QveWFjY19ub3AucHkKQEAgLTAsMCArMSw2OCBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB5YWNjX25vcC5weQorIworIyBQb3NzaWJsZSBncmFtbWFyIHJ1bGUgZGVmaW5lZCB3aXRob3V0IHBfIHByZWZpeAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW1wb3J0IHN5cworCitpZiAiLi4iIG5vdCBpbiBzeXMucGF0aDogc3lzLnBhdGguaW5zZXJ0KDAsIi4uIikKK2ltcG9ydCBwbHkueWFjYyBhcyB5YWNjCisKK2Zyb20gY2FsY2xleCBpbXBvcnQgdG9rZW5zCisKKyMgUGFyc2luZyBydWxlcworcHJlY2VkZW5jZSA9ICgKKyAgICAoJ2xlZnQnLCdQTFVTJywnTUlOVVMnKSwKKyAgICAoJ2xlZnQnLCdUSU1FUycsJ0RJVklERScpLAorICAgICgncmlnaHQnLCdVTUlOVVMnKSwKKyAgICApCisKKyMgZGljdGlvbmFyeSBvZiBuYW1lcworbmFtZXMgPSB7IH0KKworZGVmIHBfc3RhdGVtZW50X2Fzc2lnbih0KToKKyAgICAnc3RhdGVtZW50IDogTkFNRSBFUVVBTFMgZXhwcmVzc2lvbicKKyAgICBuYW1lc1t0WzFdXSA9IHRbM10KKworZGVmIHN0YXRlbWVudF9leHByKHQpOgorICAgICdzdGF0ZW1lbnQgOiBleHByZXNzaW9uJworICAgIHByaW50KHRbMV0pCisKK2RlZiBwX2V4cHJlc3Npb25fYmlub3AodCk6CisgICAgJycnZXhwcmVzc2lvbiA6IGV4cHJlc3Npb24gUExVUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gTUlOVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIFRJTUVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBESVZJREUgZXhwcmVzc2lvbicnJworICAgIGlmIHRbMl0gPT0gJysnICA6IHRbMF0gPSB0WzFdICsgdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLSc6IHRbMF0gPSB0WzFdIC0gdFszXQorICAgIGVsaWYgdFsyXSA9PSAnKic6IHRbMF0gPSB0WzFdICogdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLyc6IHRbMF0gPSB0WzFdIC8gdFszXQorCitkZWYgcF9leHByZXNzaW9uX3VtaW51cyh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE1JTlVTIGV4cHJlc3Npb24gJXByZWMgVU1JTlVTJworICAgIHRbMF0gPSAtdFsyXQorCitkZWYgcF9leHByZXNzaW9uX2dyb3VwKHQpOgorICAgICdleHByZXNzaW9uIDogTFBBUkVOIGV4cHJlc3Npb24gUlBBUkVOJworICAgIHRbMF0gPSB0WzJdCisKK2RlZiBwX2V4cHJlc3Npb25fbnVtYmVyKHQpOgorICAgICdleHByZXNzaW9uIDogTlVNQkVSJworICAgIHRbMF0gPSB0WzFdCisKK2RlZiBwX2V4cHJlc3Npb25fbmFtZSh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE5BTUUnCisgICAgdHJ5OgorICAgICAgICB0WzBdID0gbmFtZXNbdFsxXV0KKyAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgIHByaW50KCJVbmRlZmluZWQgbmFtZSAnJXMnIiAlIHRbMV0pCisgICAgICAgIHRbMF0gPSAwCisKK2RlZiBwX2Vycm9yKHQpOgorICAgIHByaW50KCJTeW50YXggZXJyb3IgYXQgJyVzJyIgJSB0LnZhbHVlKQorCit5YWNjLnlhY2MoKQorCisKKworCmRpZmYgLS1naXQgYS9wbHkvdGVzdC95YWNjX25vdGZ1bmMucHkgYi9wbHkvdGVzdC95YWNjX25vdGZ1bmMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA5M2E3NAotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L3lhY2Nfbm90ZnVuYy5weQpAQCAtMCwwICsxLDY2IEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHlhY2Nfbm90ZnVuYy5weQorIworIyBwX3J1bGUgbm90IGRlZmluZWQgYXMgYSBmdW5jdGlvbgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW1wb3J0IHN5cworCitpZiAiLi4iIG5vdCBpbiBzeXMucGF0aDogc3lzLnBhdGguaW5zZXJ0KDAsIi4uIikKK2ltcG9ydCBwbHkueWFjYyBhcyB5YWNjCisKK2Zyb20gY2FsY2xleCBpbXBvcnQgdG9rZW5zCisKKyMgUGFyc2luZyBydWxlcworcHJlY2VkZW5jZSA9ICgKKyAgICAoJ2xlZnQnLCdQTFVTJywnTUlOVVMnKSwKKyAgICAoJ2xlZnQnLCdUSU1FUycsJ0RJVklERScpLAorICAgICgncmlnaHQnLCdVTUlOVVMnKSwKKyAgICApCisKKyMgZGljdGlvbmFyeSBvZiBuYW1lcworbmFtZXMgPSB7IH0KKworcF9zdGF0ZW1lbnRfYXNzaWduID0gIkJsYWgiCisKK2RlZiBwX3N0YXRlbWVudF9leHByKHQpOgorICAgICdzdGF0ZW1lbnQgOiBleHByZXNzaW9uJworICAgIHByaW50KHRbMV0pCisKK2RlZiBwX2V4cHJlc3Npb25fYmlub3AodCk6CisgICAgJycnZXhwcmVzc2lvbiA6IGV4cHJlc3Npb24gUExVUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gTUlOVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIFRJTUVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBESVZJREUgZXhwcmVzc2lvbicnJworICAgIGlmIHRbMl0gPT0gJysnICA6IHRbMF0gPSB0WzFdICsgdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLSc6IHRbMF0gPSB0WzFdIC0gdFszXQorICAgIGVsaWYgdFsyXSA9PSAnKic6IHRbMF0gPSB0WzFdICogdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLyc6IHRbMF0gPSB0WzFdIC8gdFszXQorCitkZWYgcF9leHByZXNzaW9uX3VtaW51cyh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE1JTlVTIGV4cHJlc3Npb24gJXByZWMgVU1JTlVTJworICAgIHRbMF0gPSAtdFsyXQorCitkZWYgcF9leHByZXNzaW9uX2dyb3VwKHQpOgorICAgICdleHByZXNzaW9uIDogTFBBUkVOIGV4cHJlc3Npb24gUlBBUkVOJworICAgIHRbMF0gPSB0WzJdCisKK2RlZiBwX2V4cHJlc3Npb25fbnVtYmVyKHQpOgorICAgICdleHByZXNzaW9uIDogTlVNQkVSJworICAgIHRbMF0gPSB0WzFdCisKK2RlZiBwX2V4cHJlc3Npb25fbmFtZSh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE5BTUUnCisgICAgdHJ5OgorICAgICAgICB0WzBdID0gbmFtZXNbdFsxXV0KKyAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgIHByaW50KCJVbmRlZmluZWQgbmFtZSAnJXMnIiAlIHRbMV0pCisgICAgICAgIHRbMF0gPSAwCisKK2RlZiBwX2Vycm9yKHQpOgorICAgIHByaW50KCJTeW50YXggZXJyb3IgYXQgJyVzJyIgJSB0LnZhbHVlKQorCit5YWNjLnlhY2MoKQorCisKKworCmRpZmYgLS1naXQgYS9wbHkvdGVzdC95YWNjX25vdG9rLnB5IGIvcGx5L3Rlc3QveWFjY19ub3Rvay5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmY1NWE4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QveWFjY19ub3Rvay5weQpAQCAtMCwwICsxLDY3IEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHlhY2Nfbm90b2sucHkKKyMKKyMgQSBncmFtbWFyLCBidXQgd2UgZm9yZ290IHRvIGltcG9ydCB0aGUgdG9rZW5zIGxpc3QKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW1wb3J0IHN5cworCitpZiAiLi4iIG5vdCBpbiBzeXMucGF0aDogc3lzLnBhdGguaW5zZXJ0KDAsIi4uIikKK2ltcG9ydCBwbHkueWFjYyBhcyB5YWNjCisKKyMgUGFyc2luZyBydWxlcworcHJlY2VkZW5jZSA9ICgKKyAgICAoJ2xlZnQnLCdQTFVTJywnTUlOVVMnKSwKKyAgICAoJ2xlZnQnLCdUSU1FUycsJ0RJVklERScpLAorICAgICgncmlnaHQnLCdVTUlOVVMnKSwKKyAgICApCisKKyMgZGljdGlvbmFyeSBvZiBuYW1lcworbmFtZXMgPSB7IH0KKworZGVmIHBfc3RhdGVtZW50X2Fzc2lnbih0KToKKyAgICAnc3RhdGVtZW50IDogTkFNRSBFUVVBTFMgZXhwcmVzc2lvbicKKyAgICBuYW1lc1t0WzFdXSA9IHRbM10KKworZGVmIHBfc3RhdGVtZW50X2V4cHIodCk6CisgICAgJ3N0YXRlbWVudCA6IGV4cHJlc3Npb24nCisgICAgcHJpbnQodFsxXSkKKworZGVmIHBfZXhwcmVzc2lvbl9iaW5vcCh0KToKKyAgICAnJydleHByZXNzaW9uIDogZXhwcmVzc2lvbiBQTFVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBNSU5VUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gVElNRVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIERJVklERSBleHByZXNzaW9uJycnCisgICAgaWYgdFsyXSA9PSAnKycgIDogdFswXSA9IHRbMV0gKyB0WzNdCisgICAgZWxpZiB0WzJdID09ICctJzogdFswXSA9IHRbMV0gLSB0WzNdCisgICAgZWxpZiB0WzJdID09ICcqJzogdFswXSA9IHRbMV0gKiB0WzNdCisgICAgZWxpZiB0WzJdID09ICcvJzogdFswXSA9IHRbMV0gLyB0WzNdCisKK2RlZiBwX2V4cHJlc3Npb25fdW1pbnVzKHQpOgorICAgICdleHByZXNzaW9uIDogTUlOVVMgZXhwcmVzc2lvbiAlcHJlYyBVTUlOVVMnCisgICAgdFswXSA9IC10WzJdCisKK2RlZiBwX2V4cHJlc3Npb25fZ3JvdXAodCk6CisgICAgJ2V4cHJlc3Npb24gOiBMUEFSRU4gZXhwcmVzc2lvbiBSUEFSRU4nCisgICAgdFswXSA9IHRbMl0KKworZGVmIHBfZXhwcmVzc2lvbl9udW1iZXIodCk6CisgICAgJ2V4cHJlc3Npb24gOiBOVU1CRVInCisgICAgdFswXSA9IHRbMV0KKworZGVmIHBfZXhwcmVzc2lvbl9uYW1lKHQpOgorICAgICdleHByZXNzaW9uIDogTkFNRScKKyAgICB0cnk6CisgICAgICAgIHRbMF0gPSBuYW1lc1t0WzFdXQorICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICAgICAgcHJpbnQoIlVuZGVmaW5lZCBuYW1lICclcyciICUgdFsxXSkKKyAgICAgICAgdFswXSA9IDAKKworZGVmIHBfZXJyb3IodCk6CisgICAgcHJpbnQoIlN5bnRheCBlcnJvciBhdCAnJXMnIiAlIHQudmFsdWUpCisKK3lhY2MueWFjYygpCisKKworCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L3lhY2NfcHJlYzEucHkgYi9wbHkvdGVzdC95YWNjX3ByZWMxLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZmNkOTAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC95YWNjX3ByZWMxLnB5CkBAIC0wLDAgKzEsNjggQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgeWFjY19wcmVjMS5weQorIworIyBUZXN0cyBjYXNlIHdoZXJlIHByZWNlZGVuY2Ugc3BlY2lmaWVyIGRvZXNuJ3QgbWF0Y2ggdXAgdG8gdGVybWluYWxzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbXBvcnQgc3lzCisKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQoraW1wb3J0IHBseS55YWNjIGFzIHlhY2MKKworZnJvbSBjYWxjbGV4IGltcG9ydCB0b2tlbnMKKworIyBQYXJzaW5nIHJ1bGVzCitwcmVjZWRlbmNlID0gKAorICAgICgnbGVmdCcsICcrJywgJy0nKSwKKyAgICAoJ2xlZnQnLCAnKicsICcvJyksCisgICAgKCdyaWdodCcsJ1VNSU5VUycpLAorICAgICkKKworIyBkaWN0aW9uYXJ5IG9mIG5hbWVzCituYW1lcyA9IHsgfQorCitkZWYgcF9zdGF0ZW1lbnRfYXNzaWduKHQpOgorICAgICdzdGF0ZW1lbnQgOiBOQU1FIEVRVUFMUyBleHByZXNzaW9uJworICAgIG5hbWVzW3RbMV1dID0gdFszXQorCitkZWYgcF9zdGF0ZW1lbnRfZXhwcih0KToKKyAgICAnc3RhdGVtZW50IDogZXhwcmVzc2lvbicKKyAgICBwcmludCh0WzFdKQorCitkZWYgcF9leHByZXNzaW9uX2Jpbm9wKHQpOgorICAgICcnJ2V4cHJlc3Npb24gOiBleHByZXNzaW9uIFBMVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIE1JTlVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBUSU1FUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gRElWSURFIGV4cHJlc3Npb24nJycKKyAgICBpZiB0WzJdID09ICcrJyAgOiB0WzBdID0gdFsxXSArIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy0nOiB0WzBdID0gdFsxXSAtIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJyonOiB0WzBdID0gdFsxXSAqIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy8nOiB0WzBdID0gdFsxXSAvIHRbM10KKworZGVmIHBfZXhwcmVzc2lvbl91bWludXModCk6CisgICAgJ2V4cHJlc3Npb24gOiBNSU5VUyBleHByZXNzaW9uICVwcmVjIFVNSU5VUycKKyAgICB0WzBdID0gLXRbMl0KKworZGVmIHBfZXhwcmVzc2lvbl9ncm91cCh0KToKKyAgICAnZXhwcmVzc2lvbiA6IExQQVJFTiBleHByZXNzaW9uIFJQQVJFTicKKyAgICB0WzBdID0gdFsyXQorCitkZWYgcF9leHByZXNzaW9uX251bWJlcih0KToKKyAgICAnZXhwcmVzc2lvbiA6IE5VTUJFUicKKyAgICB0WzBdID0gdFsxXQorCitkZWYgcF9leHByZXNzaW9uX25hbWUodCk6CisgICAgJ2V4cHJlc3Npb24gOiBOQU1FJworICAgIHRyeToKKyAgICAgICAgdFswXSA9IG5hbWVzW3RbMV1dCisgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICBwcmludCgiVW5kZWZpbmVkIG5hbWUgJyVzJyIgJSB0WzFdKQorICAgICAgICB0WzBdID0gMAorCitkZWYgcF9lcnJvcih0KToKKyAgICBwcmludCgiU3ludGF4IGVycm9yIGF0ICclcyciICUgdC52YWx1ZSkKKworeWFjYy55YWNjKCkKKworCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QveWFjY19yci5weSBiL3BseS90ZXN0L3lhY2NfcnIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTczMzZjMgotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L3lhY2NfcnIucHkKQEAgLTAsMCArMSw3MiBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB5YWNjX3JyLnB5CisjCisjIEEgZ3JhbW1hciB3aXRoIGEgcmVkdWNlL3JlZHVjZSBjb25mbGljdAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW1wb3J0IHN5cworCitpZiAiLi4iIG5vdCBpbiBzeXMucGF0aDogc3lzLnBhdGguaW5zZXJ0KDAsIi4uIikKK2ltcG9ydCBwbHkueWFjYyBhcyB5YWNjCisKK2Zyb20gY2FsY2xleCBpbXBvcnQgdG9rZW5zCisKKyMgUGFyc2luZyBydWxlcworcHJlY2VkZW5jZSA9ICgKKyAgICAoJ2xlZnQnLCdQTFVTJywnTUlOVVMnKSwKKyAgICAoJ2xlZnQnLCdUSU1FUycsJ0RJVklERScpLAorICAgICgncmlnaHQnLCdVTUlOVVMnKSwKKyAgICApCisKKyMgZGljdGlvbmFyeSBvZiBuYW1lcworbmFtZXMgPSB7IH0KKworZGVmIHBfc3RhdGVtZW50X2Fzc2lnbih0KToKKyAgICAnc3RhdGVtZW50IDogTkFNRSBFUVVBTFMgZXhwcmVzc2lvbicKKyAgICBuYW1lc1t0WzFdXSA9IHRbM10KKworZGVmIHBfc3RhdGVtZW50X2Fzc2lnbl8yKHQpOgorICAgICdzdGF0ZW1lbnQgOiBOQU1FIEVRVUFMUyBOVU1CRVInCisgICAgbmFtZXNbdFsxXV0gPSB0WzNdCisKK2RlZiBwX3N0YXRlbWVudF9leHByKHQpOgorICAgICdzdGF0ZW1lbnQgOiBleHByZXNzaW9uJworICAgIHByaW50KHRbMV0pCisKK2RlZiBwX2V4cHJlc3Npb25fYmlub3AodCk6CisgICAgJycnZXhwcmVzc2lvbiA6IGV4cHJlc3Npb24gUExVUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gTUlOVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIFRJTUVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBESVZJREUgZXhwcmVzc2lvbicnJworICAgIGlmIHRbMl0gPT0gJysnICA6IHRbMF0gPSB0WzFdICsgdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLSc6IHRbMF0gPSB0WzFdIC0gdFszXQorICAgIGVsaWYgdFsyXSA9PSAnKic6IHRbMF0gPSB0WzFdICogdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLyc6IHRbMF0gPSB0WzFdIC8gdFszXQorCitkZWYgcF9leHByZXNzaW9uX3VtaW51cyh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE1JTlVTIGV4cHJlc3Npb24gJXByZWMgVU1JTlVTJworICAgIHRbMF0gPSAtdFsyXQorCitkZWYgcF9leHByZXNzaW9uX2dyb3VwKHQpOgorICAgICdleHByZXNzaW9uIDogTFBBUkVOIGV4cHJlc3Npb24gUlBBUkVOJworICAgIHRbMF0gPSB0WzJdCisKK2RlZiBwX2V4cHJlc3Npb25fbnVtYmVyKHQpOgorICAgICdleHByZXNzaW9uIDogTlVNQkVSJworICAgIHRbMF0gPSB0WzFdCisKK2RlZiBwX2V4cHJlc3Npb25fbmFtZSh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE5BTUUnCisgICAgdHJ5OgorICAgICAgICB0WzBdID0gbmFtZXNbdFsxXV0KKyAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgIHByaW50KCJVbmRlZmluZWQgbmFtZSAnJXMnIiAlIHRbMV0pCisgICAgICAgIHRbMF0gPSAwCisKK2RlZiBwX2Vycm9yKHQpOgorICAgIHByaW50KCJTeW50YXggZXJyb3IgYXQgJyVzJyIgJSB0LnZhbHVlKQorCit5YWNjLnlhY2MoKQorCisKKworCmRpZmYgLS1naXQgYS9wbHkvdGVzdC95YWNjX3JyX3VudXNlZC5weSBiL3BseS90ZXN0L3lhY2NfcnJfdW51c2VkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYTVmN2UKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC95YWNjX3JyX3VudXNlZC5weQpAQCAtMCwwICsxLDMwIEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHlhY2NfcnJfdW51c2VkLnB5CisjCisjIEEgZ3JhbW1hciB3aXRoIHJlZHVjZS9yZWR1Y2UgY29uZmxpY3RzIGFuZCBhIHJ1bGUgdGhhdCBuZXZlcgorIyBnZXRzIHJlZHVjZWQuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbXBvcnQgc3lzCisKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQoraW1wb3J0IHBseS55YWNjIGFzIHlhY2MKKwordG9rZW5zID0gKCdBJywgJ0InLCAnQycpCisKK2RlZiBwX2dyYW1tYXIocCk6CisgICAnJycKKyAgIHJ1bGUxIDogcnVsZTIgQgorICAgICAgICAgfCBydWxlMiBDCisKKyAgIHJ1bGUyIDogcnVsZTMgQgorICAgICAgICAgfCBydWxlNAorICAgICAgICAgfCBydWxlNQorCisgICBydWxlMyA6IEEKKworICAgcnVsZTQgOiBBCisKKyAgIHJ1bGU1IDogQQorICAgJycnCisKK3lhY2MueWFjYygpCmRpZmYgLS1naXQgYS9wbHkvdGVzdC95YWNjX3NpbXBsZS5weSBiL3BseS90ZXN0L3lhY2Nfc2ltcGxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOTg5ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC95YWNjX3NpbXBsZS5weQpAQCAtMCwwICsxLDY4IEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHlhY2Nfc2ltcGxlLnB5CisjCisjIEEgc2ltcGxlLCBwcm9wZXJseSBzcGVjaWZpZXIgZ3JhbW1hcgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW1wb3J0IHN5cworCitpZiAiLi4iIG5vdCBpbiBzeXMucGF0aDogc3lzLnBhdGguaW5zZXJ0KDAsIi4uIikKK2ltcG9ydCBwbHkueWFjYyBhcyB5YWNjCisKK2Zyb20gY2FsY2xleCBpbXBvcnQgdG9rZW5zCisKKyMgUGFyc2luZyBydWxlcworcHJlY2VkZW5jZSA9ICgKKyAgICAoJ2xlZnQnLCdQTFVTJywnTUlOVVMnKSwKKyAgICAoJ2xlZnQnLCdUSU1FUycsJ0RJVklERScpLAorICAgICgncmlnaHQnLCdVTUlOVVMnKSwKKyAgICApCisKKyMgZGljdGlvbmFyeSBvZiBuYW1lcworbmFtZXMgPSB7IH0KKworZGVmIHBfc3RhdGVtZW50X2Fzc2lnbih0KToKKyAgICAnc3RhdGVtZW50IDogTkFNRSBFUVVBTFMgZXhwcmVzc2lvbicKKyAgICBuYW1lc1t0WzFdXSA9IHRbM10KKworZGVmIHBfc3RhdGVtZW50X2V4cHIodCk6CisgICAgJ3N0YXRlbWVudCA6IGV4cHJlc3Npb24nCisgICAgcHJpbnQodFsxXSkKKworZGVmIHBfZXhwcmVzc2lvbl9iaW5vcCh0KToKKyAgICAnJydleHByZXNzaW9uIDogZXhwcmVzc2lvbiBQTFVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBNSU5VUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gVElNRVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIERJVklERSBleHByZXNzaW9uJycnCisgICAgaWYgdFsyXSA9PSAnKycgIDogdFswXSA9IHRbMV0gKyB0WzNdCisgICAgZWxpZiB0WzJdID09ICctJzogdFswXSA9IHRbMV0gLSB0WzNdCisgICAgZWxpZiB0WzJdID09ICcqJzogdFswXSA9IHRbMV0gKiB0WzNdCisgICAgZWxpZiB0WzJdID09ICcvJzogdFswXSA9IHRbMV0gLyB0WzNdCisKK2RlZiBwX2V4cHJlc3Npb25fdW1pbnVzKHQpOgorICAgICdleHByZXNzaW9uIDogTUlOVVMgZXhwcmVzc2lvbiAlcHJlYyBVTUlOVVMnCisgICAgdFswXSA9IC10WzJdCisKK2RlZiBwX2V4cHJlc3Npb25fZ3JvdXAodCk6CisgICAgJ2V4cHJlc3Npb24gOiBMUEFSRU4gZXhwcmVzc2lvbiBSUEFSRU4nCisgICAgdFswXSA9IHRbMl0KKworZGVmIHBfZXhwcmVzc2lvbl9udW1iZXIodCk6CisgICAgJ2V4cHJlc3Npb24gOiBOVU1CRVInCisgICAgdFswXSA9IHRbMV0KKworZGVmIHBfZXhwcmVzc2lvbl9uYW1lKHQpOgorICAgICdleHByZXNzaW9uIDogTkFNRScKKyAgICB0cnk6CisgICAgICAgIHRbMF0gPSBuYW1lc1t0WzFdXQorICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICAgICAgcHJpbnQoIlVuZGVmaW5lZCBuYW1lICclcyciICUgdFsxXSkKKyAgICAgICAgdFswXSA9IDAKKworZGVmIHBfZXJyb3IodCk6CisgICAgcHJpbnQoIlN5bnRheCBlcnJvciBhdCAnJXMnIiAlIHQudmFsdWUpCisKK3lhY2MueWFjYygpCisKKworCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L3lhY2Nfc3IucHkgYi9wbHkvdGVzdC95YWNjX3NyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YTFlOWMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC95YWNjX3NyLnB5CkBAIC0wLDAgKzEsNjMgQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgeWFjY19zci5weQorIworIyBBIGdyYW1tYXIgd2l0aCBzaGlmdC1yZWR1Y2UgY29uZmxpY3RzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbXBvcnQgc3lzCisKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQoraW1wb3J0IHBseS55YWNjIGFzIHlhY2MKKworZnJvbSBjYWxjbGV4IGltcG9ydCB0b2tlbnMKKworIyBQYXJzaW5nIHJ1bGVzCisKKyMgZGljdGlvbmFyeSBvZiBuYW1lcworbmFtZXMgPSB7IH0KKworZGVmIHBfc3RhdGVtZW50X2Fzc2lnbih0KToKKyAgICAnc3RhdGVtZW50IDogTkFNRSBFUVVBTFMgZXhwcmVzc2lvbicKKyAgICBuYW1lc1t0WzFdXSA9IHRbM10KKworZGVmIHBfc3RhdGVtZW50X2V4cHIodCk6CisgICAgJ3N0YXRlbWVudCA6IGV4cHJlc3Npb24nCisgICAgcHJpbnQodFsxXSkKKworZGVmIHBfZXhwcmVzc2lvbl9iaW5vcCh0KToKKyAgICAnJydleHByZXNzaW9uIDogZXhwcmVzc2lvbiBQTFVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBNSU5VUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gVElNRVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIERJVklERSBleHByZXNzaW9uJycnCisgICAgaWYgdFsyXSA9PSAnKycgIDogdFswXSA9IHRbMV0gKyB0WzNdCisgICAgZWxpZiB0WzJdID09ICctJzogdFswXSA9IHRbMV0gLSB0WzNdCisgICAgZWxpZiB0WzJdID09ICcqJzogdFswXSA9IHRbMV0gKiB0WzNdCisgICAgZWxpZiB0WzJdID09ICcvJzogdFswXSA9IHRbMV0gLyB0WzNdCisKK2RlZiBwX2V4cHJlc3Npb25fdW1pbnVzKHQpOgorICAgICdleHByZXNzaW9uIDogTUlOVVMgZXhwcmVzc2lvbicKKyAgICB0WzBdID0gLXRbMl0KKworZGVmIHBfZXhwcmVzc2lvbl9ncm91cCh0KToKKyAgICAnZXhwcmVzc2lvbiA6IExQQVJFTiBleHByZXNzaW9uIFJQQVJFTicKKyAgICB0WzBdID0gdFsyXQorCitkZWYgcF9leHByZXNzaW9uX251bWJlcih0KToKKyAgICAnZXhwcmVzc2lvbiA6IE5VTUJFUicKKyAgICB0WzBdID0gdFsxXQorCitkZWYgcF9leHByZXNzaW9uX25hbWUodCk6CisgICAgJ2V4cHJlc3Npb24gOiBOQU1FJworICAgIHRyeToKKyAgICAgICAgdFswXSA9IG5hbWVzW3RbMV1dCisgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICBwcmludCgiVW5kZWZpbmVkIG5hbWUgJyVzJyIgJSB0WzFdKQorICAgICAgICB0WzBdID0gMAorCitkZWYgcF9lcnJvcih0KToKKyAgICBwcmludCgiU3ludGF4IGVycm9yIGF0ICclcyciICUgdC52YWx1ZSkKKworeWFjYy55YWNjKCkKKworCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QveWFjY190ZXJtMS5weSBiL3BseS90ZXN0L3lhY2NfdGVybTEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFhMzZlOQotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L3lhY2NfdGVybTEucHkKQEAgLTAsMCArMSw2OCBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB5YWNjX3Rlcm0xLnB5CisjCisjIFRlcm1pbmFsIHVzZWQgb24gdGhlIGxlZnQtaGFuZC1zaWRlCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbXBvcnQgc3lzCisKK2lmICIuLiIgbm90IGluIHN5cy5wYXRoOiBzeXMucGF0aC5pbnNlcnQoMCwiLi4iKQoraW1wb3J0IHBseS55YWNjIGFzIHlhY2MKKworZnJvbSBjYWxjbGV4IGltcG9ydCB0b2tlbnMKKworIyBQYXJzaW5nIHJ1bGVzCitwcmVjZWRlbmNlID0gKAorICAgICgnbGVmdCcsJ1BMVVMnLCdNSU5VUycpLAorICAgICgnbGVmdCcsJ1RJTUVTJywnRElWSURFJyksCisgICAgKCdyaWdodCcsJ1VNSU5VUycpLAorICAgICkKKworIyBkaWN0aW9uYXJ5IG9mIG5hbWVzCituYW1lcyA9IHsgfQorCitkZWYgcF9zdGF0ZW1lbnRfYXNzaWduKHQpOgorICAgICdOVU1CRVIgOiBOQU1FIEVRVUFMUyBleHByZXNzaW9uJworICAgIG5hbWVzW3RbMV1dID0gdFszXQorCitkZWYgcF9zdGF0ZW1lbnRfZXhwcih0KToKKyAgICAnc3RhdGVtZW50IDogZXhwcmVzc2lvbicKKyAgICBwcmludCh0WzFdKQorCitkZWYgcF9leHByZXNzaW9uX2Jpbm9wKHQpOgorICAgICcnJ2V4cHJlc3Npb24gOiBleHByZXNzaW9uIFBMVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIE1JTlVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBUSU1FUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gRElWSURFIGV4cHJlc3Npb24nJycKKyAgICBpZiB0WzJdID09ICcrJyAgOiB0WzBdID0gdFsxXSArIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy0nOiB0WzBdID0gdFsxXSAtIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJyonOiB0WzBdID0gdFsxXSAqIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy8nOiB0WzBdID0gdFsxXSAvIHRbM10KKworZGVmIHBfZXhwcmVzc2lvbl91bWludXModCk6CisgICAgJ2V4cHJlc3Npb24gOiBNSU5VUyBleHByZXNzaW9uICVwcmVjIFVNSU5VUycKKyAgICB0WzBdID0gLXRbMl0KKworZGVmIHBfZXhwcmVzc2lvbl9ncm91cCh0KToKKyAgICAnZXhwcmVzc2lvbiA6IExQQVJFTiBleHByZXNzaW9uIFJQQVJFTicKKyAgICB0WzBdID0gdFsyXQorCitkZWYgcF9leHByZXNzaW9uX251bWJlcih0KToKKyAgICAnZXhwcmVzc2lvbiA6IE5VTUJFUicKKyAgICB0WzBdID0gdFsxXQorCitkZWYgcF9leHByZXNzaW9uX25hbWUodCk6CisgICAgJ2V4cHJlc3Npb24gOiBOQU1FJworICAgIHRyeToKKyAgICAgICAgdFswXSA9IG5hbWVzW3RbMV1dCisgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICBwcmludCgiVW5kZWZpbmVkIG5hbWUgJyVzJyIgJSB0WzFdKQorICAgICAgICB0WzBdID0gMAorCitkZWYgcF9lcnJvcih0KToKKyAgICBwcmludCgiU3ludGF4IGVycm9yIGF0ICclcyciICUgdC52YWx1ZSkKKworeWFjYy55YWNjKCkKKworCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QveWFjY191bmljb2RlX2xpdGVyYWxzLnB5IGIvcGx5L3Rlc3QveWFjY191bmljb2RlX2xpdGVyYWxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZTRmNWIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC95YWNjX3VuaWNvZGVfbGl0ZXJhbHMucHkKQEAgLTAsMCArMSw3MCBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB5YWNjX3VuaWNvZGVfbGl0ZXJhbHMKKyMKKyMgVGVzdCBmb3IgdW5pY29kZSBsaXRlcmFscyBvbiBQeXRob24gMi54CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHVuaWNvZGVfbGl0ZXJhbHMKKworaW1wb3J0IHN5cworCitpZiAiLi4iIG5vdCBpbiBzeXMucGF0aDogc3lzLnBhdGguaW5zZXJ0KDAsIi4uIikKK2ltcG9ydCBwbHkueWFjYyBhcyB5YWNjCisKK2Zyb20gY2FsY2xleCBpbXBvcnQgdG9rZW5zCisKKyMgUGFyc2luZyBydWxlcworcHJlY2VkZW5jZSA9ICgKKyAgICAoJ2xlZnQnLCdQTFVTJywnTUlOVVMnKSwKKyAgICAoJ2xlZnQnLCdUSU1FUycsJ0RJVklERScpLAorICAgICgncmlnaHQnLCdVTUlOVVMnKSwKKyAgICApCisKKyMgZGljdGlvbmFyeSBvZiBuYW1lcworbmFtZXMgPSB7IH0KKworZGVmIHBfc3RhdGVtZW50X2Fzc2lnbih0KToKKyAgICAnc3RhdGVtZW50IDogTkFNRSBFUVVBTFMgZXhwcmVzc2lvbicKKyAgICBuYW1lc1t0WzFdXSA9IHRbM10KKworZGVmIHBfc3RhdGVtZW50X2V4cHIodCk6CisgICAgJ3N0YXRlbWVudCA6IGV4cHJlc3Npb24nCisgICAgcHJpbnQodFsxXSkKKworZGVmIHBfZXhwcmVzc2lvbl9iaW5vcCh0KToKKyAgICAnJydleHByZXNzaW9uIDogZXhwcmVzc2lvbiBQTFVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBNSU5VUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gVElNRVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIERJVklERSBleHByZXNzaW9uJycnCisgICAgaWYgdFsyXSA9PSAnKycgIDogdFswXSA9IHRbMV0gKyB0WzNdCisgICAgZWxpZiB0WzJdID09ICctJzogdFswXSA9IHRbMV0gLSB0WzNdCisgICAgZWxpZiB0WzJdID09ICcqJzogdFswXSA9IHRbMV0gKiB0WzNdCisgICAgZWxpZiB0WzJdID09ICcvJzogdFswXSA9IHRbMV0gLyB0WzNdCisKK2RlZiBwX2V4cHJlc3Npb25fdW1pbnVzKHQpOgorICAgICdleHByZXNzaW9uIDogTUlOVVMgZXhwcmVzc2lvbiAlcHJlYyBVTUlOVVMnCisgICAgdFswXSA9IC10WzJdCisKK2RlZiBwX2V4cHJlc3Npb25fZ3JvdXAodCk6CisgICAgJ2V4cHJlc3Npb24gOiBMUEFSRU4gZXhwcmVzc2lvbiBSUEFSRU4nCisgICAgdFswXSA9IHRbMl0KKworZGVmIHBfZXhwcmVzc2lvbl9udW1iZXIodCk6CisgICAgJ2V4cHJlc3Npb24gOiBOVU1CRVInCisgICAgdFswXSA9IHRbMV0KKworZGVmIHBfZXhwcmVzc2lvbl9uYW1lKHQpOgorICAgICdleHByZXNzaW9uIDogTkFNRScKKyAgICB0cnk6CisgICAgICAgIHRbMF0gPSBuYW1lc1t0WzFdXQorICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICAgICAgcHJpbnQoIlVuZGVmaW5lZCBuYW1lICclcyciICUgdFsxXSkKKyAgICAgICAgdFswXSA9IDAKKworZGVmIHBfZXJyb3IodCk6CisgICAgcHJpbnQoIlN5bnRheCBlcnJvciBhdCAnJXMnIiAlIHQudmFsdWUpCisKK3lhY2MueWFjYygpCisKKworCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L3lhY2NfdW51c2VkLnB5IGIvcGx5L3Rlc3QveWFjY191bnVzZWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTViNjc3YgotLS0gL2Rldi9udWxsCisrKyBiL3BseS90ZXN0L3lhY2NfdW51c2VkLnB5CkBAIC0wLDAgKzEsNzcgQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgeWFjY191bnVzZWQucHkKKyMKKyMgQSBncmFtbWFyIHdpdGggYW4gdW51c2VkIHJ1bGUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ltcG9ydCBzeXMKKworaWYgIi4uIiBub3QgaW4gc3lzLnBhdGg6IHN5cy5wYXRoLmluc2VydCgwLCIuLiIpCitpbXBvcnQgcGx5LnlhY2MgYXMgeWFjYworCitmcm9tIGNhbGNsZXggaW1wb3J0IHRva2VucworCisjIFBhcnNpbmcgcnVsZXMKK3ByZWNlZGVuY2UgPSAoCisgICAgKCdsZWZ0JywnUExVUycsJ01JTlVTJyksCisgICAgKCdsZWZ0JywnVElNRVMnLCdESVZJREUnKSwKKyAgICAoJ3JpZ2h0JywnVU1JTlVTJyksCisgICAgKQorCisjIGRpY3Rpb25hcnkgb2YgbmFtZXMKK25hbWVzID0geyB9CisKK2RlZiBwX3N0YXRlbWVudF9hc3NpZ24odCk6CisgICAgJ3N0YXRlbWVudCA6IE5BTUUgRVFVQUxTIGV4cHJlc3Npb24nCisgICAgbmFtZXNbdFsxXV0gPSB0WzNdCisKK2RlZiBwX3N0YXRlbWVudF9leHByKHQpOgorICAgICdzdGF0ZW1lbnQgOiBleHByZXNzaW9uJworICAgIHByaW50KHRbMV0pCisKK2RlZiBwX2V4cHJlc3Npb25fYmlub3AodCk6CisgICAgJycnZXhwcmVzc2lvbiA6IGV4cHJlc3Npb24gUExVUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gTUlOVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIFRJTUVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBESVZJREUgZXhwcmVzc2lvbicnJworICAgIGlmIHRbMl0gPT0gJysnICA6IHRbMF0gPSB0WzFdICsgdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLSc6IHRbMF0gPSB0WzFdIC0gdFszXQorICAgIGVsaWYgdFsyXSA9PSAnKic6IHRbMF0gPSB0WzFdICogdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLyc6IHRbMF0gPSB0WzFdIC8gdFszXQorCitkZWYgcF9leHByZXNzaW9uX3VtaW51cyh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE1JTlVTIGV4cHJlc3Npb24gJXByZWMgVU1JTlVTJworICAgIHRbMF0gPSAtdFsyXQorCitkZWYgcF9leHByZXNzaW9uX2dyb3VwKHQpOgorICAgICdleHByZXNzaW9uIDogTFBBUkVOIGV4cHJlc3Npb24gUlBBUkVOJworICAgIHRbMF0gPSB0WzJdCisKK2RlZiBwX2V4cHJlc3Npb25fbnVtYmVyKHQpOgorICAgICdleHByZXNzaW9uIDogTlVNQkVSJworICAgIHRbMF0gPSB0WzFdCisKK2RlZiBwX2V4cHJlc3Npb25fbmFtZSh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE5BTUUnCisgICAgdHJ5OgorICAgICAgICB0WzBdID0gbmFtZXNbdFsxXV0KKyAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgIHByaW50KCJVbmRlZmluZWQgbmFtZSAnJXMnIiAlIHRbMV0pCisgICAgICAgIHRbMF0gPSAwCisKK2RlZiBwX2V4cHJfbGlzdCh0KToKKyAgICAnZXhwcmxpc3QgOiBleHBybGlzdCBDT01NQSBleHByZXNzaW9uJworICAgIHBhc3MKKworZGVmIHBfZXhwcl9saXN0XzIodCk6CisgICAgJ2V4cHJsaXN0IDogZXhwcmVzc2lvbicKKyAgICBwYXNzCisKKworZGVmIHBfZXJyb3IodCk6CisgICAgcHJpbnQoIlN5bnRheCBlcnJvciBhdCAnJXMnIiAlIHQudmFsdWUpCisKK3lhY2MueWFjYygpCisKKworCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L3lhY2NfdW51c2VkX3J1bGUucHkgYi9wbHkvdGVzdC95YWNjX3VudXNlZF9ydWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NjhlZjgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC95YWNjX3VudXNlZF9ydWxlLnB5CkBAIC0wLDAgKzEsNzIgQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgeWFjY191bnVzZWRfcnVsZS5weQorIworIyBHcmFtbWFyIHdpdGggYW4gdW51c2VkIHJ1bGUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ltcG9ydCBzeXMKKworaWYgIi4uIiBub3QgaW4gc3lzLnBhdGg6IHN5cy5wYXRoLmluc2VydCgwLCIuLiIpCitpbXBvcnQgcGx5LnlhY2MgYXMgeWFjYworCitmcm9tIGNhbGNsZXggaW1wb3J0IHRva2VucworCisjIFBhcnNpbmcgcnVsZXMKK3ByZWNlZGVuY2UgPSAoCisgICAgKCdsZWZ0JywnUExVUycsJ01JTlVTJyksCisgICAgKCdsZWZ0JywnVElNRVMnLCdESVZJREUnKSwKKyAgICAoJ3JpZ2h0JywnVU1JTlVTJyksCisgICAgKQorCisjIGRpY3Rpb25hcnkgb2YgbmFtZXMKK25hbWVzID0geyB9CisKK2RlZiBwX3N0YXRlbWVudF9hc3NpZ24odCk6CisgICAgJ3N0YXRlbWVudCA6IE5BTUUgRVFVQUxTIGV4cHJlc3Npb24nCisgICAgbmFtZXNbdFsxXV0gPSB0WzNdCisKK2RlZiBwX3N0YXRlbWVudF9leHByKHQpOgorICAgICdzdGF0ZW1lbnQgOiBleHByZXNzaW9uJworICAgIHByaW50KHRbMV0pCisKK2RlZiBwX2V4cHJlc3Npb25fYmlub3AodCk6CisgICAgJycnZXhwcmVzc2lvbiA6IGV4cHJlc3Npb24gUExVUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gTUlOVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIFRJTUVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBESVZJREUgZXhwcmVzc2lvbicnJworICAgIGlmIHRbMl0gPT0gJysnICA6IHRbMF0gPSB0WzFdICsgdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLSc6IHRbMF0gPSB0WzFdIC0gdFszXQorICAgIGVsaWYgdFsyXSA9PSAnKic6IHRbMF0gPSB0WzFdICogdFszXQorICAgIGVsaWYgdFsyXSA9PSAnLyc6IHRbMF0gPSB0WzFdIC8gdFszXQorCitkZWYgcF9leHByZXNzaW9uX3VtaW51cyh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE1JTlVTIGV4cHJlc3Npb24gJXByZWMgVU1JTlVTJworICAgIHRbMF0gPSAtdFsyXQorCitkZWYgcF9leHByZXNzaW9uX2dyb3VwKHQpOgorICAgICdleHByZXNzaW9uIDogTFBBUkVOIGV4cHJlc3Npb24gUlBBUkVOJworICAgIHRbMF0gPSB0WzJdCisKK2RlZiBwX2V4cHJlc3Npb25fbnVtYmVyKHQpOgorICAgICdleHByZXNzaW9uIDogTlVNQkVSJworICAgIHRbMF0gPSB0WzFdCisKK2RlZiBwX2V4cHJlc3Npb25fbmFtZSh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE5BTUUnCisgICAgdHJ5OgorICAgICAgICB0WzBdID0gbmFtZXNbdFsxXV0KKyAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgIHByaW50KCJVbmRlZmluZWQgbmFtZSAnJXMnIiAlIHRbMV0pCisgICAgICAgIHRbMF0gPSAwCisKK2RlZiBwX2ludGVnZXIodCk6CisgICAgJ2ludGVnZXIgOiBOVU1CRVInCisgICAgdFswXSA9IHRbMV0KKworZGVmIHBfZXJyb3IodCk6CisgICAgcHJpbnQoIlN5bnRheCBlcnJvciBhdCAnJXMnIiAlIHQudmFsdWUpCisKK3lhY2MueWFjYygpCisKKworCisKZGlmZiAtLWdpdCBhL3BseS90ZXN0L3lhY2NfdXByZWMucHkgYi9wbHkvdGVzdC95YWNjX3VwcmVjLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2OWFkYjgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHkvdGVzdC95YWNjX3VwcmVjLnB5CkBAIC0wLDAgKzEsNjMgQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgeWFjY191cHJlYy5weQorIworIyBBIGdyYW1tYXIgd2l0aCBhIGJhZCAlcHJlYyBzcGVjaWZpZXIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ltcG9ydCBzeXMKKworaWYgIi4uIiBub3QgaW4gc3lzLnBhdGg6IHN5cy5wYXRoLmluc2VydCgwLCIuLiIpCitpbXBvcnQgcGx5LnlhY2MgYXMgeWFjYworCitmcm9tIGNhbGNsZXggaW1wb3J0IHRva2VucworCisjIFBhcnNpbmcgcnVsZXMKKworIyBkaWN0aW9uYXJ5IG9mIG5hbWVzCituYW1lcyA9IHsgfQorCitkZWYgcF9zdGF0ZW1lbnRfYXNzaWduKHQpOgorICAgICdzdGF0ZW1lbnQgOiBOQU1FIEVRVUFMUyBleHByZXNzaW9uJworICAgIG5hbWVzW3RbMV1dID0gdFszXQorCitkZWYgcF9zdGF0ZW1lbnRfZXhwcih0KToKKyAgICAnc3RhdGVtZW50IDogZXhwcmVzc2lvbicKKyAgICBwcmludCh0WzFdKQorCitkZWYgcF9leHByZXNzaW9uX2Jpbm9wKHQpOgorICAgICcnJ2V4cHJlc3Npb24gOiBleHByZXNzaW9uIFBMVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIE1JTlVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBUSU1FUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gRElWSURFIGV4cHJlc3Npb24nJycKKyAgICBpZiB0WzJdID09ICcrJyAgOiB0WzBdID0gdFsxXSArIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy0nOiB0WzBdID0gdFsxXSAtIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJyonOiB0WzBdID0gdFsxXSAqIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy8nOiB0WzBdID0gdFsxXSAvIHRbM10KKworZGVmIHBfZXhwcmVzc2lvbl91bWludXModCk6CisgICAgJ2V4cHJlc3Npb24gOiBNSU5VUyBleHByZXNzaW9uICVwcmVjIFVNSU5VUycKKyAgICB0WzBdID0gLXRbMl0KKworZGVmIHBfZXhwcmVzc2lvbl9ncm91cCh0KToKKyAgICAnZXhwcmVzc2lvbiA6IExQQVJFTiBleHByZXNzaW9uIFJQQVJFTicKKyAgICB0WzBdID0gdFsyXQorCitkZWYgcF9leHByZXNzaW9uX251bWJlcih0KToKKyAgICAnZXhwcmVzc2lvbiA6IE5VTUJFUicKKyAgICB0WzBdID0gdFsxXQorCitkZWYgcF9leHByZXNzaW9uX25hbWUodCk6CisgICAgJ2V4cHJlc3Npb24gOiBOQU1FJworICAgIHRyeToKKyAgICAgICAgdFswXSA9IG5hbWVzW3RbMV1dCisgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICBwcmludCgiVW5kZWZpbmVkIG5hbWUgJyVzJyIgJSB0WzFdKQorICAgICAgICB0WzBdID0gMAorCitkZWYgcF9lcnJvcih0KToKKyAgICBwcmludCgiU3ludGF4IGVycm9yIGF0ICclcyciICUgdC52YWx1ZSkKKworeWFjYy55YWNjKCkKKworCisKKwpkaWZmIC0tZ2l0IGEvcGx5L3Rlc3QveWFjY191cHJlYzIucHkgYi9wbHkvdGVzdC95YWNjX3VwcmVjMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzI3NGJmCi0tLSAvZGV2L251bGwKKysrIGIvcGx5L3Rlc3QveWFjY191cHJlYzIucHkKQEAgLTAsMCArMSw2MyBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB5YWNjX3VwcmVjMi5weQorIworIyBBIGdyYW1tYXIgd2l0aCBhIGJhZCAlcHJlYyBzcGVjaWZpZXIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ltcG9ydCBzeXMKKworaWYgIi4uIiBub3QgaW4gc3lzLnBhdGg6IHN5cy5wYXRoLmluc2VydCgwLCIuLiIpCitpbXBvcnQgcGx5LnlhY2MgYXMgeWFjYworCitmcm9tIGNhbGNsZXggaW1wb3J0IHRva2VucworCisjIFBhcnNpbmcgcnVsZXMKKworIyBkaWN0aW9uYXJ5IG9mIG5hbWVzCituYW1lcyA9IHsgfQorCitkZWYgcF9zdGF0ZW1lbnRfYXNzaWduKHQpOgorICAgICdzdGF0ZW1lbnQgOiBOQU1FIEVRVUFMUyBleHByZXNzaW9uJworICAgIG5hbWVzW3RbMV1dID0gdFszXQorCitkZWYgcF9zdGF0ZW1lbnRfZXhwcih0KToKKyAgICAnc3RhdGVtZW50IDogZXhwcmVzc2lvbicKKyAgICBwcmludCh0WzFdKQorCitkZWYgcF9leHByZXNzaW9uX2Jpbm9wKHQpOgorICAgICcnJ2V4cHJlc3Npb24gOiBleHByZXNzaW9uIFBMVVMgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgfCBleHByZXNzaW9uIE1JTlVTIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBUSU1FUyBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICB8IGV4cHJlc3Npb24gRElWSURFIGV4cHJlc3Npb24nJycKKyAgICBpZiB0WzJdID09ICcrJyAgOiB0WzBdID0gdFsxXSArIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy0nOiB0WzBdID0gdFsxXSAtIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJyonOiB0WzBdID0gdFsxXSAqIHRbM10KKyAgICBlbGlmIHRbMl0gPT0gJy8nOiB0WzBdID0gdFsxXSAvIHRbM10KKworZGVmIHBfZXhwcmVzc2lvbl91bWludXModCk6CisgICAgJ2V4cHJlc3Npb24gOiBNSU5VUyBleHByZXNzaW9uICVwcmVjJworICAgIHRbMF0gPSAtdFsyXQorCitkZWYgcF9leHByZXNzaW9uX2dyb3VwKHQpOgorICAgICdleHByZXNzaW9uIDogTFBBUkVOIGV4cHJlc3Npb24gUlBBUkVOJworICAgIHRbMF0gPSB0WzJdCisKK2RlZiBwX2V4cHJlc3Npb25fbnVtYmVyKHQpOgorICAgICdleHByZXNzaW9uIDogTlVNQkVSJworICAgIHRbMF0gPSB0WzFdCisKK2RlZiBwX2V4cHJlc3Npb25fbmFtZSh0KToKKyAgICAnZXhwcmVzc2lvbiA6IE5BTUUnCisgICAgdHJ5OgorICAgICAgICB0WzBdID0gbmFtZXNbdFsxXV0KKyAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgIHByaW50KCJVbmRlZmluZWQgbmFtZSAnJXMnIiAlIHRbMV0pCisgICAgICAgIHRbMF0gPSAwCisKK2RlZiBwX2Vycm9yKHQpOgorICAgIHByaW50KCJTeW50YXggZXJyb3IgYXQgJyVzJyIgJSB0LnZhbHVlKQorCit5YWNjLnlhY2MoKQorCisKKworCg==