IyAtKi0gY29kaW5nOiBsYXRpbi0xIC0qLQoKIiIiSGVhcCBxdWV1ZSBhbGdvcml0aG0gKGEuay5hLiBwcmlvcml0eSBxdWV1ZSkuCgpIZWFwcyBhcmUgYXJyYXlzIGZvciB3aGljaCBhW2tdIDw9IGFbMiprKzFdIGFuZCBhW2tdIDw9IGFbMiprKzJdIGZvcgphbGwgaywgY291bnRpbmcgZWxlbWVudHMgZnJvbSAwLiAgRm9yIHRoZSBzYWtlIG9mIGNvbXBhcmlzb24sCm5vbi1leGlzdGluZyBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBpbmZpbml0ZS4gIFRoZSBpbnRlcmVzdGluZwpwcm9wZXJ0eSBvZiBhIGhlYXAgaXMgdGhhdCBhWzBdIGlzIGFsd2F5cyBpdHMgc21hbGxlc3QgZWxlbWVudC4KClVzYWdlOgoKaGVhcCA9IFtdICAgICAgICAgICAgIyBjcmVhdGVzIGFuIGVtcHR5IGhlYXAKaGVhcHB1c2goaGVhcCwgaXRlbSkgIyBwdXNoZXMgYSBuZXcgaXRlbSBvbiB0aGUgaGVhcAppdGVtID0gaGVhcHBvcChoZWFwKSAjIHBvcHMgdGhlIHNtYWxsZXN0IGl0ZW0gZnJvbSB0aGUgaGVhcAppdGVtID0gaGVhcFswXSAgICAgICAjIHNtYWxsZXN0IGl0ZW0gb24gdGhlIGhlYXAgd2l0aG91dCBwb3BwaW5nIGl0CmhlYXBpZnkoeCkgICAgICAgICAgICMgdHJhbnNmb3JtcyBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gbGluZWFyIHRpbWUKaXRlbSA9IGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pICMgcG9wcyBhbmQgcmV0dXJucyBzbWFsbGVzdCBpdGVtLCBhbmQgYWRkcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBuZXcgaXRlbTsgdGhlIGhlYXAgc2l6ZSBpcyB1bmNoYW5nZWQKCk91ciBBUEkgZGlmZmVycyBmcm9tIHRleHRib29rIGhlYXAgYWxnb3JpdGhtcyBhcyBmb2xsb3dzOgoKLSBXZSB1c2UgMC1iYXNlZCBpbmRleGluZy4gIFRoaXMgbWFrZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZQogIGluZGV4IGZvciBhIG5vZGUgYW5kIHRoZSBpbmRleGVzIGZvciBpdHMgY2hpbGRyZW4gc2xpZ2h0bHkgbGVzcwogIG9idmlvdXMsIGJ1dCBpcyBtb3JlIHN1aXRhYmxlIHNpbmNlIFB5dGhvbiB1c2VzIDAtYmFzZWQgaW5kZXhpbmcuCgotIE91ciBoZWFwcG9wKCkgbWV0aG9kIHJldHVybnMgdGhlIHNtYWxsZXN0IGl0ZW0sIG5vdCB0aGUgbGFyZ2VzdC4KClRoZXNlIHR3byBtYWtlIGl0IHBvc3NpYmxlIHRvIHZpZXcgdGhlIGhlYXAgYXMgYSByZWd1bGFyIFB5dGhvbiBsaXN0CndpdGhvdXQgc3VycHJpc2VzOiBoZWFwWzBdIGlzIHRoZSBzbWFsbGVzdCBpdGVtLCBhbmQgaGVhcC5zb3J0KCkKbWFpbnRhaW5zIHRoZSBoZWFwIGludmFyaWFudCEKIiIiCgojIE9yaWdpbmFsIGNvZGUgYnkgS2V2aW4gTydDb25ub3IsIGF1Z21lbnRlZCBieSBUaW0gUGV0ZXJzIGFuZCBSYXltb25kIEhldHRpbmdlcgoKX19hYm91dF9fID0gIiIiSGVhcCBxdWV1ZXMKCltleHBsYW5hdGlvbiBieSBGcmFu529pcyBQaW5hcmRdCgpIZWFwcyBhcmUgYXJyYXlzIGZvciB3aGljaCBhW2tdIDw9IGFbMiprKzFdIGFuZCBhW2tdIDw9IGFbMiprKzJdIGZvcgphbGwgaywgY291bnRpbmcgZWxlbWVudHMgZnJvbSAwLiAgRm9yIHRoZSBzYWtlIG9mIGNvbXBhcmlzb24sCm5vbi1leGlzdGluZyBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBpbmZpbml0ZS4gIFRoZSBpbnRlcmVzdGluZwpwcm9wZXJ0eSBvZiBhIGhlYXAgaXMgdGhhdCBhWzBdIGlzIGFsd2F5cyBpdHMgc21hbGxlc3QgZWxlbWVudC4KClRoZSBzdHJhbmdlIGludmFyaWFudCBhYm92ZSBpcyBtZWFudCB0byBiZSBhbiBlZmZpY2llbnQgbWVtb3J5CnJlcHJlc2VudGF0aW9uIGZvciBhIHRvdXJuYW1lbnQuICBUaGUgbnVtYmVycyBiZWxvdyBhcmUgYGsnLCBub3QgYVtrXToKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAoKICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKCiAgICAgICAgICAzICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgICA1ICAgICAgICAgICAgICAgNgoKICAgICAgNyAgICAgICA4ICAgICAgIDkgICAgICAgMTAgICAgICAxMSAgICAgIDEyICAgICAgMTMgICAgICAxNAoKICAgIDE1IDE2ICAgMTcgMTggICAxOSAyMCAgIDIxIDIyICAgMjMgMjQgICAyNSAyNiAgIDI3IDI4ICAgMjkgMzAKCgpJbiB0aGUgdHJlZSBhYm92ZSwgZWFjaCBjZWxsIGBrJyBpcyB0b3BwaW5nIGAyKmsrMScgYW5kIGAyKmsrMicuICBJbgphbiB1c3VhbCBiaW5hcnkgdG91cm5hbWVudCB3ZSBzZWUgaW4gc3BvcnRzLCBlYWNoIGNlbGwgaXMgdGhlIHdpbm5lcgpvdmVyIHRoZSB0d28gY2VsbHMgaXQgdG9wcywgYW5kIHdlIGNhbiB0cmFjZSB0aGUgd2lubmVyIGRvd24gdGhlIHRyZWUKdG8gc2VlIGFsbCBvcHBvbmVudHMgcy9oZSBoYWQuICBIb3dldmVyLCBpbiBtYW55IGNvbXB1dGVyIGFwcGxpY2F0aW9ucwpvZiBzdWNoIHRvdXJuYW1lbnRzLCB3ZSBkbyBub3QgbmVlZCB0byB0cmFjZSB0aGUgaGlzdG9yeSBvZiBhIHdpbm5lci4KVG8gYmUgbW9yZSBtZW1vcnkgZWZmaWNpZW50LCB3aGVuIGEgd2lubmVyIGlzIHByb21vdGVkLCB3ZSB0cnkgdG8KcmVwbGFjZSBpdCBieSBzb21ldGhpbmcgZWxzZSBhdCBhIGxvd2VyIGxldmVsLCBhbmQgdGhlIHJ1bGUgYmVjb21lcwp0aGF0IGEgY2VsbCBhbmQgdGhlIHR3byBjZWxscyBpdCB0b3BzIGNvbnRhaW4gdGhyZWUgZGlmZmVyZW50IGl0ZW1zLApidXQgdGhlIHRvcCBjZWxsICJ3aW5zIiBvdmVyIHRoZSB0d28gdG9wcGVkIGNlbGxzLgoKSWYgdGhpcyBoZWFwIGludmFyaWFudCBpcyBwcm90ZWN0ZWQgYXQgYWxsIHRpbWUsIGluZGV4IDAgaXMgY2xlYXJseQp0aGUgb3ZlcmFsbCB3aW5uZXIuICBUaGUgc2ltcGxlc3QgYWxnb3JpdGhtaWMgd2F5IHRvIHJlbW92ZSBpdCBhbmQKZmluZCB0aGUgIm5leHQiIHdpbm5lciBpcyB0byBtb3ZlIHNvbWUgbG9zZXIgKGxldCdzIHNheSBjZWxsIDMwIGluIHRoZQpkaWFncmFtIGFib3ZlKSBpbnRvIHRoZSAwIHBvc2l0aW9uLCBhbmQgdGhlbiBwZXJjb2xhdGUgdGhpcyBuZXcgMCBkb3duCnRoZSB0cmVlLCBleGNoYW5naW5nIHZhbHVlcywgdW50aWwgdGhlIGludmFyaWFudCBpcyByZS1lc3RhYmxpc2hlZC4KVGhpcyBpcyBjbGVhcmx5IGxvZ2FyaXRobWljIG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHRyZWUuCkJ5IGl0ZXJhdGluZyBvdmVyIGFsbCBpdGVtcywgeW91IGdldCBhbiBPKG4gbG4gbikgc29ydC4KCkEgbmljZSBmZWF0dXJlIG9mIHRoaXMgc29ydCBpcyB0aGF0IHlvdSBjYW4gZWZmaWNpZW50bHkgaW5zZXJ0IG5ldwppdGVtcyB3aGlsZSB0aGUgc29ydCBpcyBnb2luZyBvbiwgcHJvdmlkZWQgdGhhdCB0aGUgaW5zZXJ0ZWQgaXRlbXMgYXJlCm5vdCAiYmV0dGVyIiB0aGFuIHRoZSBsYXN0IDAndGggZWxlbWVudCB5b3UgZXh0cmFjdGVkLiAgVGhpcyBpcwplc3BlY2lhbGx5IHVzZWZ1bCBpbiBzaW11bGF0aW9uIGNvbnRleHRzLCB3aGVyZSB0aGUgdHJlZSBob2xkcyBhbGwKaW5jb21pbmcgZXZlbnRzLCBhbmQgdGhlICJ3aW4iIGNvbmRpdGlvbiBtZWFucyB0aGUgc21hbGxlc3Qgc2NoZWR1bGVkCnRpbWUuICBXaGVuIGFuIGV2ZW50IHNjaGVkdWxlIG90aGVyIGV2ZW50cyBmb3IgZXhlY3V0aW9uLCB0aGV5IGFyZQpzY2hlZHVsZWQgaW50byB0aGUgZnV0dXJlLCBzbyB0aGV5IGNhbiBlYXNpbHkgZ28gaW50byB0aGUgaGVhcC4gIFNvLCBhCmhlYXAgaXMgYSBnb29kIHN0cnVjdHVyZSBmb3IgaW1wbGVtZW50aW5nIHNjaGVkdWxlcnMgKHRoaXMgaXMgd2hhdCBJCnVzZWQgZm9yIG15IE1JREkgc2VxdWVuY2VyIDotKS4KClZhcmlvdXMgc3RydWN0dXJlcyBmb3IgaW1wbGVtZW50aW5nIHNjaGVkdWxlcnMgaGF2ZSBiZWVuIGV4dGVuc2l2ZWx5CnN0dWRpZWQsIGFuZCBoZWFwcyBhcmUgZ29vZCBmb3IgdGhpcywgYXMgdGhleSBhcmUgcmVhc29uYWJseSBzcGVlZHksCnRoZSBzcGVlZCBpcyBhbG1vc3QgY29uc3RhbnQsIGFuZCB0aGUgd29yc3QgY2FzZSBpcyBub3QgbXVjaCBkaWZmZXJlbnQKdGhhbiB0aGUgYXZlcmFnZSBjYXNlLiAgSG93ZXZlciwgdGhlcmUgYXJlIG90aGVyIHJlcHJlc2VudGF0aW9ucyB3aGljaAphcmUgbW9yZSBlZmZpY2llbnQgb3ZlcmFsbCwgeWV0IHRoZSB3b3JzdCBjYXNlcyBtaWdodCBiZSB0ZXJyaWJsZS4KCkhlYXBzIGFyZSBhbHNvIHZlcnkgdXNlZnVsIGluIGJpZyBkaXNrIHNvcnRzLiAgWW91IG1vc3QgcHJvYmFibHkgYWxsCmtub3cgdGhhdCBhIGJpZyBzb3J0IGltcGxpZXMgcHJvZHVjaW5nICJydW5zIiAod2hpY2ggYXJlIHByZS1zb3J0ZWQKc2VxdWVuY2VzLCB3aGljaCBzaXplIGlzIHVzdWFsbHkgcmVsYXRlZCB0byB0aGUgYW1vdW50IG9mIENQVSBtZW1vcnkpLApmb2xsb3dlZCBieSBhIG1lcmdpbmcgcGFzc2VzIGZvciB0aGVzZSBydW5zLCB3aGljaCBtZXJnaW5nIGlzIG9mdGVuCnZlcnkgY2xldmVybHkgb3JnYW5pc2VkWzFdLiAgSXQgaXMgdmVyeSBpbXBvcnRhbnQgdGhhdCB0aGUgaW5pdGlhbApzb3J0IHByb2R1Y2VzIHRoZSBsb25nZXN0IHJ1bnMgcG9zc2libGUuICBUb3VybmFtZW50cyBhcmUgYSBnb29kIHdheQp0byB0aGF0LiAgSWYsIHVzaW5nIGFsbCB0aGUgbWVtb3J5IGF2YWlsYWJsZSB0byBob2xkIGEgdG91cm5hbWVudCwgeW91CnJlcGxhY2UgYW5kIHBlcmNvbGF0ZSBpdGVtcyB0aGF0IGhhcHBlbiB0byBmaXQgdGhlIGN1cnJlbnQgcnVuLCB5b3UnbGwKcHJvZHVjZSBydW5zIHdoaWNoIGFyZSB0d2ljZSB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGZvciByYW5kb20gaW5wdXQsCmFuZCBtdWNoIGJldHRlciBmb3IgaW5wdXQgZnV6emlseSBvcmRlcmVkLgoKTW9yZW92ZXIsIGlmIHlvdSBvdXRwdXQgdGhlIDAndGggaXRlbSBvbiBkaXNrIGFuZCBnZXQgYW4gaW5wdXQgd2hpY2gKbWF5IG5vdCBmaXQgaW4gdGhlIGN1cnJlbnQgdG91cm5hbWVudCAoYmVjYXVzZSB0aGUgdmFsdWUgIndpbnMiIG92ZXIKdGhlIGxhc3Qgb3V0cHV0IHZhbHVlKSwgaXQgY2Fubm90IGZpdCBpbiB0aGUgaGVhcCwgc28gdGhlIHNpemUgb2YgdGhlCmhlYXAgZGVjcmVhc2VzLiAgVGhlIGZyZWVkIG1lbW9yeSBjb3VsZCBiZSBjbGV2ZXJseSByZXVzZWQgaW1tZWRpYXRlbHkKZm9yIHByb2dyZXNzaXZlbHkgYnVpbGRpbmcgYSBzZWNvbmQgaGVhcCwgd2hpY2ggZ3Jvd3MgYXQgZXhhY3RseSB0aGUKc2FtZSByYXRlIHRoZSBmaXJzdCBoZWFwIGlzIG1lbHRpbmcuICBXaGVuIHRoZSBmaXJzdCBoZWFwIGNvbXBsZXRlbHkKdmFuaXNoZXMsIHlvdSBzd2l0Y2ggaGVhcHMgYW5kIHN0YXJ0IGEgbmV3IHJ1bi4gIENsZXZlciBhbmQgcXVpdGUKZWZmZWN0aXZlIQoKSW4gYSB3b3JkLCBoZWFwcyBhcmUgdXNlZnVsIG1lbW9yeSBzdHJ1Y3R1cmVzIHRvIGtub3cuICBJIHVzZSB0aGVtIGluCmEgZmV3IGFwcGxpY2F0aW9ucywgYW5kIEkgdGhpbmsgaXQgaXMgZ29vZCB0byBrZWVwIGEgYGhlYXAnIG1vZHVsZQphcm91bmQuIDotKQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0KWzFdIFRoZSBkaXNrIGJhbGFuY2luZyBhbGdvcml0aG1zIHdoaWNoIGFyZSBjdXJyZW50LCBub3dhZGF5cywgYXJlCm1vcmUgYW5ub3lpbmcgdGhhbiBjbGV2ZXIsIGFuZCB0aGlzIGlzIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHNlZWtpbmcKY2FwYWJpbGl0aWVzIG9mIHRoZSBkaXNrcy4gIE9uIGRldmljZXMgd2hpY2ggY2Fubm90IHNlZWssIGxpa2UgYmlnCnRhcGUgZHJpdmVzLCB0aGUgc3Rvcnkgd2FzIHF1aXRlIGRpZmZlcmVudCwgYW5kIG9uZSBoYWQgdG8gYmUgdmVyeQpjbGV2ZXIgdG8gZW5zdXJlIChmYXIgaW4gYWR2YW5jZSkgdGhhdCBlYWNoIHRhcGUgbW92ZW1lbnQgd2lsbCBiZSB0aGUKbW9zdCBlZmZlY3RpdmUgcG9zc2libGUgKHRoYXQgaXMsIHdpbGwgYmVzdCBwYXJ0aWNpcGF0ZSBhdAoicHJvZ3Jlc3NpbmciIHRoZSBtZXJnZSkuICBTb21lIHRhcGVzIHdlcmUgZXZlbiBhYmxlIHRvIHJlYWQKYmFja3dhcmRzLCBhbmQgdGhpcyB3YXMgYWxzbyB1c2VkIHRvIGF2b2lkIHRoZSByZXdpbmRpbmcgdGltZS4KQmVsaWV2ZSBtZSwgcmVhbCBnb29kIHRhcGUgc29ydHMgd2VyZSBxdWl0ZSBzcGVjdGFjdWxhciB0byB3YXRjaCEKRnJvbSBhbGwgdGltZXMsIHNvcnRpbmcgaGFzIGFsd2F5cyBiZWVuIGEgR3JlYXQgQXJ0ISA6LSkKIiIiCgpfX2FsbF9fID0gWydoZWFwcHVzaCcsICdoZWFwcG9wJywgJ2hlYXBpZnknLCAnaGVhcHJlcGxhY2UnLCAnbWVyZ2UnLAogICAgICAgICAgICdubGFyZ2VzdCcsICduc21hbGxlc3QnLCAnaGVhcHB1c2hwb3AnXQoKZnJvbSBpdGVydG9vbHMgaW1wb3J0IGlzbGljZSwgcmVwZWF0LCBjb3VudCwgdGVlLCBjaGFpbgpmcm9tIG9wZXJhdG9yIGltcG9ydCBpdGVtZ2V0dGVyLCBuZWcKaW1wb3J0IGJpc2VjdAoKZGVmIGhlYXBwdXNoKGhlYXAsIGl0ZW0pOgogICAgIiIiUHVzaCBpdGVtIG9udG8gaGVhcCwgbWFpbnRhaW5pbmcgdGhlIGhlYXAgaW52YXJpYW50LiIiIgogICAgaGVhcC5hcHBlbmQoaXRlbSkKICAgIF9zaWZ0ZG93bihoZWFwLCAwLCBsZW4oaGVhcCktMSkKCmRlZiBoZWFwcG9wKGhlYXApOgogICAgIiIiUG9wIHRoZSBzbWFsbGVzdCBpdGVtIG9mZiB0aGUgaGVhcCwgbWFpbnRhaW5pbmcgdGhlIGhlYXAgaW52YXJpYW50LiIiIgogICAgbGFzdGVsdCA9IGhlYXAucG9wKCkgICAgIyByYWlzZXMgYXBwcm9wcmlhdGUgSW5kZXhFcnJvciBpZiBoZWFwIGlzIGVtcHR5CiAgICBpZiBoZWFwOgogICAgICAgIHJldHVybml0ZW0gPSBoZWFwWzBdCiAgICAgICAgaGVhcFswXSA9IGxhc3RlbHQKICAgICAgICBfc2lmdHVwKGhlYXAsIDApCiAgICBlbHNlOgogICAgICAgIHJldHVybml0ZW0gPSBsYXN0ZWx0CiAgICByZXR1cm4gcmV0dXJuaXRlbQoKZGVmIGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pOgogICAgIiIiUG9wIGFuZCByZXR1cm4gdGhlIGN1cnJlbnQgc21hbGxlc3QgdmFsdWUsIGFuZCBhZGQgdGhlIG5ldyBpdGVtLgoKICAgIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBoZWFwcG9wKCkgZm9sbG93ZWQgYnkgaGVhcHB1c2goKSwgYW5kIGNhbiBiZQogICAgbW9yZSBhcHByb3ByaWF0ZSB3aGVuIHVzaW5nIGEgZml4ZWQtc2l6ZSBoZWFwLiAgTm90ZSB0aGF0IHRoZSB2YWx1ZQogICAgcmV0dXJuZWQgbWF5IGJlIGxhcmdlciB0aGFuIGl0ZW0hICBUaGF0IGNvbnN0cmFpbnMgcmVhc29uYWJsZSB1c2VzIG9mCiAgICB0aGlzIHJvdXRpbmUgdW5sZXNzIHdyaXR0ZW4gYXMgcGFydCBvZiBhIGNvbmRpdGlvbmFsIHJlcGxhY2VtZW50OgoKICAgICAgICBpZiBpdGVtID4gaGVhcFswXToKICAgICAgICAgICAgaXRlbSA9IGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pCiAgICAiIiIKICAgIHJldHVybml0ZW0gPSBoZWFwWzBdICAgICMgcmFpc2VzIGFwcHJvcHJpYXRlIEluZGV4RXJyb3IgaWYgaGVhcCBpcyBlbXB0eQogICAgaGVhcFswXSA9IGl0ZW0KICAgIF9zaWZ0dXAoaGVhcCwgMCkKICAgIHJldHVybiByZXR1cm5pdGVtCgpkZWYgaGVhcHB1c2hwb3AoaGVhcCwgaXRlbSk6CiAgICAiIiJGYXN0IHZlcnNpb24gb2YgYSBoZWFwcHVzaCBmb2xsb3dlZCBieSBhIGhlYXBwb3AuIiIiCiAgICBpZiBoZWFwIGFuZCBoZWFwWzBdIDwgaXRlbToKICAgICAgICBpdGVtLCBoZWFwWzBdID0gaGVhcFswXSwgaXRlbQogICAgICAgIF9zaWZ0dXAoaGVhcCwgMCkKICAgIHJldHVybiBpdGVtCgpkZWYgaGVhcGlmeSh4KToKICAgICIiIlRyYW5zZm9ybSBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gTyhsZW4oaGVhcCkpIHRpbWUuIiIiCiAgICBuID0gbGVuKHgpCiAgICAjIFRyYW5zZm9ybSBib3R0b20tdXAuICBUaGUgbGFyZ2VzdCBpbmRleCB0aGVyZSdzIGFueSBwb2ludCB0byBsb29raW5nIGF0CiAgICAjIGlzIHRoZSBsYXJnZXN0IHdpdGggYSBjaGlsZCBpbmRleCBpbi1yYW5nZSwgc28gbXVzdCBoYXZlIDIqaSArIDEgPCBuLAogICAgIyBvciBpIDwgKG4tMSkvMi4gIElmIG4gaXMgZXZlbiA9IDIqaiwgdGhpcyBpcyAoMipqLTEpLzIgPSBqLTEvMiBzbwogICAgIyBqLTEgaXMgdGhlIGxhcmdlc3QsIHdoaWNoIGlzIG4vLzIgLSAxLiAgSWYgbiBpcyBvZGQgPSAyKmorMSwgdGhpcyBpcwogICAgIyAoMipqKzEtMSkvMiA9IGogc28gai0xIGlzIHRoZSBsYXJnZXN0LCBhbmQgdGhhdCdzIGFnYWluIG4vLzItMS4KICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKG4vLzIpKToKICAgICAgICBfc2lmdHVwKHgsIGkpCgpkZWYgbmxhcmdlc3QobiwgaXRlcmFibGUpOgogICAgIiIiRmluZCB0aGUgbiBsYXJnZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC4KCiAgICBFcXVpdmFsZW50IHRvOiAgc29ydGVkKGl0ZXJhYmxlLCByZXZlcnNlPVRydWUpWzpuXQogICAgIiIiCiAgICBpdCA9IGl0ZXIoaXRlcmFibGUpCiAgICByZXN1bHQgPSBsaXN0KGlzbGljZShpdCwgbikpCiAgICBpZiBub3QgcmVzdWx0OgogICAgICAgIHJldHVybiByZXN1bHQKICAgIGhlYXBpZnkocmVzdWx0KQogICAgX2hlYXBwdXNocG9wID0gaGVhcHB1c2hwb3AKICAgIGZvciBlbGVtIGluIGl0OgogICAgICAgIGhlYXBwdXNocG9wKHJlc3VsdCwgZWxlbSkKICAgIHJlc3VsdC5zb3J0KHJldmVyc2U9VHJ1ZSkKICAgIHJldHVybiByZXN1bHQKCmRlZiBuc21hbGxlc3QobiwgaXRlcmFibGUpOgogICAgIiIiRmluZCB0aGUgbiBzbWFsbGVzdCBlbGVtZW50cyBpbiBhIGRhdGFzZXQuCgogICAgRXF1aXZhbGVudCB0bzogIHNvcnRlZChpdGVyYWJsZSlbOm5dCiAgICAiIiIKICAgIGlmIGhhc2F0dHIoaXRlcmFibGUsICdfX2xlbl9fJykgYW5kIG4gKiAxMCA8PSBsZW4oaXRlcmFibGUpOgogICAgICAgICMgRm9yIHNtYWxsZXIgdmFsdWVzIG9mIG4sIHRoZSBiaXNlY3QgbWV0aG9kIGlzIGZhc3RlciB0aGFuIGEgbWluaGVhcC4KICAgICAgICAjIEl0IGlzIGFsc28gbWVtb3J5IGVmZmljaWVudCwgY29uc3VtaW5nIG9ubHkgbiBlbGVtZW50cyBvZiBzcGFjZS4KICAgICAgICBpdCA9IGl0ZXIoaXRlcmFibGUpCiAgICAgICAgcmVzdWx0ID0gc29ydGVkKGlzbGljZShpdCwgMCwgbikpCiAgICAgICAgaWYgbm90IHJlc3VsdDoKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAogICAgICAgIGluc29ydCA9IGJpc2VjdC5pbnNvcnQKICAgICAgICBwb3AgPSByZXN1bHQucG9wCiAgICAgICAgbG9zID0gcmVzdWx0Wy0xXSAgICAjIGxvcyAtLT4gTGFyZ2VzdCBvZiB0aGUgbnNtYWxsZXN0CiAgICAgICAgZm9yIGVsZW0gaW4gaXQ6CiAgICAgICAgICAgIGlmIGxvcyA8PSBlbGVtOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaW5zb3J0KHJlc3VsdCwgZWxlbSkKICAgICAgICAgICAgcG9wKCkKICAgICAgICAgICAgbG9zID0gcmVzdWx0Wy0xXQogICAgICAgIHJldHVybiByZXN1bHQKICAgICMgQW4gYWx0ZXJuYXRpdmUgYXBwcm9hY2ggbWFuaWZlc3RzIHRoZSB3aG9sZSBpdGVyYWJsZSBpbiBtZW1vcnkgYnV0CiAgICAjIHNhdmVzIGNvbXBhcmlzb25zIGJ5IGhlYXBpZnlpbmcgYWxsIGF0IG9uY2UuICBBbHNvLCBzYXZlcyB0aW1lCiAgICAjIG92ZXIgYmlzZWN0Lmluc29ydCgpIHdoaWNoIGhhcyBPKG4pIGRhdGEgbW92ZW1lbnQgdGltZSBmb3IgZXZlcnkKICAgICMgaW5zZXJ0aW9uLiAgRmluZGluZyB0aGUgbiBzbWFsbGVzdCBvZiBhbiBtIGxlbmd0aCBpdGVyYWJsZSByZXF1aXJlcwogICAgIyAgICBPKG0pICsgTyhuIGxvZyBtKSBjb21wYXJpc29ucy4KICAgIGggPSBsaXN0KGl0ZXJhYmxlKQogICAgaGVhcGlmeShoKQogICAgcmV0dXJuIGxpc3QobWFwKGhlYXBwb3AsIHJlcGVhdChoLCBtaW4obiwgbGVuKGgpKSkpKQoKIyAnaGVhcCcgaXMgYSBoZWFwIGF0IGFsbCBpbmRpY2VzID49IHN0YXJ0cG9zLCBleGNlcHQgcG9zc2libHkgZm9yIHBvcy4gIHBvcwojIGlzIHRoZSBpbmRleCBvZiBhIGxlYWYgd2l0aCBhIHBvc3NpYmx5IG91dC1vZi1vcmRlciB2YWx1ZS4gIFJlc3RvcmUgdGhlCiMgaGVhcCBpbnZhcmlhbnQuCmRlZiBfc2lmdGRvd24oaGVhcCwgc3RhcnRwb3MsIHBvcyk6CiAgICBuZXdpdGVtID0gaGVhcFtwb3NdCiAgICAjIEZvbGxvdyB0aGUgcGF0aCB0byB0aGUgcm9vdCwgbW92aW5nIHBhcmVudHMgZG93biB1bnRpbCBmaW5kaW5nIGEgcGxhY2UKICAgICMgbmV3aXRlbSBmaXRzLgogICAgd2hpbGUgcG9zID4gc3RhcnRwb3M6CiAgICAgICAgcGFyZW50cG9zID0gKHBvcyAtIDEpID4+IDEKICAgICAgICBwYXJlbnQgPSBoZWFwW3BhcmVudHBvc10KICAgICAgICBpZiBuZXdpdGVtIDwgcGFyZW50OgogICAgICAgICAgICBoZWFwW3Bvc10gPSBwYXJlbnQKICAgICAgICAgICAgcG9zID0gcGFyZW50cG9zCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgYnJlYWsKICAgIGhlYXBbcG9zXSA9IG5ld2l0ZW0KCiMgVGhlIGNoaWxkIGluZGljZXMgb2YgaGVhcCBpbmRleCBwb3MgYXJlIGFscmVhZHkgaGVhcHMsIGFuZCB3ZSB3YW50IHRvIG1ha2UKIyBhIGhlYXAgYXQgaW5kZXggcG9zIHRvby4gIFdlIGRvIHRoaXMgYnkgYnViYmxpbmcgdGhlIHNtYWxsZXIgY2hpbGQgb2YKIyBwb3MgdXAgKGFuZCBzbyBvbiB3aXRoIHRoYXQgY2hpbGQncyBjaGlsZHJlbiwgZXRjKSB1bnRpbCBoaXR0aW5nIGEgbGVhZiwKIyB0aGVuIHVzaW5nIF9zaWZ0ZG93biB0byBtb3ZlIHRoZSBvZGRiYWxsIG9yaWdpbmFsbHkgYXQgaW5kZXggcG9zIGludG8gcGxhY2UuCiMKIyBXZSAqY291bGQqIGJyZWFrIG91dCBvZiB0aGUgbG9vcCBhcyBzb29uIGFzIHdlIGZpbmQgYSBwb3Mgd2hlcmUgbmV3aXRlbSA8PQojIGJvdGggaXRzIGNoaWxkcmVuLCBidXQgdHVybnMgb3V0IHRoYXQncyBub3QgYSBnb29kIGlkZWEsIGFuZCBkZXNwaXRlIHRoYXQKIyBtYW55IGJvb2tzIHdyaXRlIHRoZSBhbGdvcml0aG0gdGhhdCB3YXkuICBEdXJpbmcgYSBoZWFwIHBvcCwgdGhlIGxhc3QgYXJyYXkKIyBlbGVtZW50IGlzIHNpZnRlZCBpbiwgYW5kIHRoYXQgdGVuZHMgdG8gYmUgbGFyZ2UsIHNvIHRoYXQgY29tcGFyaW5nIGl0CiMgYWdhaW5zdCB2YWx1ZXMgc3RhcnRpbmcgZnJvbSB0aGUgcm9vdCB1c3VhbGx5IGRvZXNuJ3QgcGF5ICg9IHVzdWFsbHkgZG9lc24ndAojIGdldCB1cyBvdXQgb2YgdGhlIGxvb3AgZWFybHkpLiAgU2VlIEtudXRoLCBWb2x1bWUgMywgd2hlcmUgdGhpcyBpcwojIGV4cGxhaW5lZCBhbmQgcXVhbnRpZmllZCBpbiBhbiBleGVyY2lzZS4KIwojIEN1dHRpbmcgdGhlICMgb2YgY29tcGFyaXNvbnMgaXMgaW1wb3J0YW50LCBzaW5jZSB0aGVzZSByb3V0aW5lcyBoYXZlIG5vCiMgd2F5IHRvIGV4dHJhY3QgInRoZSBwcmlvcml0eSIgZnJvbSBhbiBhcnJheSBlbGVtZW50LCBzbyB0aGF0IGludGVsbGlnZW5jZQojIGlzIGxpa2VseSB0byBiZSBoaWRpbmcgaW4gY3VzdG9tIGNvbXBhcmlzb24gbWV0aG9kcywgb3IgaW4gYXJyYXkgZWxlbWVudHMKIyBzdG9yaW5nIChwcmlvcml0eSwgcmVjb3JkKSB0dXBsZXMuICBDb21wYXJpc29ucyBhcmUgdGh1cyBwb3RlbnRpYWxseQojIGV4cGVuc2l2ZS4KIwojIE9uIHJhbmRvbSBhcnJheXMgb2YgbGVuZ3RoIDEwMDAsIG1ha2luZyB0aGlzIGNoYW5nZSBjdXQgdGhlIG51bWJlciBvZgojIGNvbXBhcmlzb25zIG1hZGUgYnkgaGVhcGlmeSgpIGEgbGl0dGxlLCBhbmQgdGhvc2UgbWFkZSBieSBleGhhdXN0aXZlCiMgaGVhcHBvcCgpIGEgbG90LCBpbiBhY2NvcmQgd2l0aCB0aGVvcnkuICBIZXJlIGFyZSB0eXBpY2FsIHJlc3VsdHMgZnJvbSAzCiMgcnVucyAoMyBqdXN0IHRvIGRlbW9uc3RyYXRlIGhvdyBzbWFsbCB0aGUgdmFyaWFuY2UgaXMpOgojCiMgQ29tcGFyZXMgbmVlZGVkIGJ5IGhlYXBpZnkgICAgIENvbXBhcmVzIG5lZWRlZCBieSAxMDAwIGhlYXBwb3BzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgMTgzNyBjdXQgdG8gMTY2MyAgICAgICAgICAgICAgIDE0OTk2IGN1dCB0byA4NjgwCiMgMTg1NSBjdXQgdG8gMTY1OSAgICAgICAgICAgICAgIDE0OTY2IGN1dCB0byA4Njc4CiMgMTg0NyBjdXQgdG8gMTY2MCAgICAgICAgICAgICAgIDE1MDI0IGN1dCB0byA4NzAzCiMKIyBCdWlsZGluZyB0aGUgaGVhcCBieSB1c2luZyBoZWFwcHVzaCgpIDEwMDAgdGltZXMgaW5zdGVhZCByZXF1aXJlZAojIDIxOTgsIDIxNDgsIGFuZCAyMjE5IGNvbXBhcmVzOiAgaGVhcGlmeSgpIGlzIG1vcmUgZWZmaWNpZW50LCB3aGVuCiMgeW91IGNhbiB1c2UgaXQuCiMKIyBUaGUgdG90YWwgY29tcGFyZXMgbmVlZGVkIGJ5IGxpc3Quc29ydCgpIG9uIHRoZSBzYW1lIGxpc3RzIHdlcmUgODYyNywKIyA4NjI3LCBhbmQgODYzMiAodGhpcyBzaG91bGQgYmUgY29tcGFyZWQgdG8gdGhlIHN1bSBvZiBoZWFwaWZ5KCkgYW5kCiMgaGVhcHBvcCgpIGNvbXBhcmVzKTogIGxpc3Quc29ydCgpIGlzICh1bnN1cnByaXNpbmdseSEpIG1vcmUgZWZmaWNpZW50CiMgZm9yIHNvcnRpbmcuCgpkZWYgX3NpZnR1cChoZWFwLCBwb3MpOgogICAgZW5kcG9zID0gbGVuKGhlYXApCiAgICBzdGFydHBvcyA9IHBvcwogICAgbmV3aXRlbSA9IGhlYXBbcG9zXQogICAgIyBCdWJibGUgdXAgdGhlIHNtYWxsZXIgY2hpbGQgdW50aWwgaGl0dGluZyBhIGxlYWYuCiAgICBjaGlsZHBvcyA9IDIqcG9zICsgMSAgICAjIGxlZnRtb3N0IGNoaWxkIHBvc2l0aW9uCiAgICB3aGlsZSBjaGlsZHBvcyA8IGVuZHBvczoKICAgICAgICAjIFNldCBjaGlsZHBvcyB0byBpbmRleCBvZiBzbWFsbGVyIGNoaWxkLgogICAgICAgIHJpZ2h0cG9zID0gY2hpbGRwb3MgKyAxCiAgICAgICAgaWYgcmlnaHRwb3MgPCBlbmRwb3MgYW5kIG5vdCBoZWFwW2NoaWxkcG9zXSA8IGhlYXBbcmlnaHRwb3NdOgogICAgICAgICAgICBjaGlsZHBvcyA9IHJpZ2h0cG9zCiAgICAgICAgIyBNb3ZlIHRoZSBzbWFsbGVyIGNoaWxkIHVwLgogICAgICAgIGhlYXBbcG9zXSA9IGhlYXBbY2hpbGRwb3NdCiAgICAgICAgcG9zID0gY2hpbGRwb3MKICAgICAgICBjaGlsZHBvcyA9IDIqcG9zICsgMQogICAgIyBUaGUgbGVhZiBhdCBwb3MgaXMgZW1wdHkgbm93LiAgUHV0IG5ld2l0ZW0gdGhlcmUsIGFuZCBidWJibGUgaXQgdXAKICAgICMgdG8gaXRzIGZpbmFsIHJlc3RpbmcgcGxhY2UgKGJ5IHNpZnRpbmcgaXRzIHBhcmVudHMgZG93bikuCiAgICBoZWFwW3Bvc10gPSBuZXdpdGVtCiAgICBfc2lmdGRvd24oaGVhcCwgc3RhcnRwb3MsIHBvcykKCiMgSWYgYXZhaWxhYmxlLCB1c2UgQyBpbXBsZW1lbnRhdGlvbgp0cnk6CiAgICBmcm9tIF9oZWFwcSBpbXBvcnQgaGVhcHB1c2gsIGhlYXBwb3AsIGhlYXBpZnksIGhlYXByZXBsYWNlLCBubGFyZ2VzdCwgbnNtYWxsZXN0LCBoZWFwcHVzaHBvcApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBwYXNzCgpkZWYgbWVyZ2UoKml0ZXJhYmxlcyk6CiAgICAnJydNZXJnZSBtdWx0aXBsZSBzb3J0ZWQgaW5wdXRzIGludG8gYSBzaW5nbGUgc29ydGVkIG91dHB1dC4KCiAgICBTaW1pbGFyIHRvIHNvcnRlZChpdGVydG9vbHMuY2hhaW4oKml0ZXJhYmxlcykpIGJ1dCByZXR1cm5zIGEgZ2VuZXJhdG9yLAogICAgZG9lcyBub3QgcHVsbCB0aGUgZGF0YSBpbnRvIG1lbW9yeSBhbGwgYXQgb25jZSwgYW5kIGFzc3VtZXMgdGhhdCBlYWNoIG9mCiAgICB0aGUgaW5wdXQgc3RyZWFtcyBpcyBhbHJlYWR5IHNvcnRlZCAoc21hbGxlc3QgdG8gbGFyZ2VzdCkuCgogICAgPj4+IGxpc3QobWVyZ2UoWzEsMyw1LDddLCBbMCwyLDQsOF0sIFs1LDEwLDE1LDIwXSwgW10sIFsyNV0pKQogICAgWzAsIDEsIDIsIDMsIDQsIDUsIDUsIDcsIDgsIDEwLCAxNSwgMjAsIDI1XQoKICAgICcnJwogICAgX2hlYXBwb3AsIF9oZWFwcmVwbGFjZSwgX1N0b3BJdGVyYXRpb24gPSBoZWFwcG9wLCBoZWFwcmVwbGFjZSwgU3RvcEl0ZXJhdGlvbgoKICAgIGggPSBbXQogICAgaF9hcHBlbmQgPSBoLmFwcGVuZAogICAgZm9yIGl0bnVtLCBpdCBpbiBlbnVtZXJhdGUobWFwKGl0ZXIsIGl0ZXJhYmxlcykpOgogICAgICAgIHRyeToKICAgICAgICAgICAgbmV4dCA9IGl0Ll9fbmV4dF9fCiAgICAgICAgICAgIGhfYXBwZW5kKFtuZXh0KCksIGl0bnVtLCBuZXh0XSkKICAgICAgICBleGNlcHQgX1N0b3BJdGVyYXRpb246CiAgICAgICAgICAgIHBhc3MKICAgIGhlYXBpZnkoaCkKCiAgICB3aGlsZSAxOgogICAgICAgIHRyeToKICAgICAgICAgICAgd2hpbGUgMToKICAgICAgICAgICAgICAgIHYsIGl0bnVtLCBuZXh0ID0gcyA9IGhbMF0gICAjIHJhaXNlcyBJbmRleEVycm9yIHdoZW4gaCBpcyBlbXB0eQogICAgICAgICAgICAgICAgeWllbGQgdgogICAgICAgICAgICAgICAgc1swXSA9IG5leHQoKSAgICAgICAgICAgICAgICMgcmFpc2VzIFN0b3BJdGVyYXRpb24gd2hlbiBleGhhdXN0ZWQKICAgICAgICAgICAgICAgIF9oZWFwcmVwbGFjZShoLCBzKSAgICAgICAgICAjIHJlc3RvcmUgaGVhcCBjb25kaXRpb24KICAgICAgICBleGNlcHQgX1N0b3BJdGVyYXRpb246CiAgICAgICAgICAgIF9oZWFwcG9wKGgpICAgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgZW1wdHkgaXRlcmF0b3IKICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKICAgICAgICAgICAgcmV0dXJuCgojIEV4dGVuZCB0aGUgaW1wbGVtZW50YXRpb25zIG9mIG5zbWFsbGVzdCBhbmQgbmxhcmdlc3QgdG8gdXNlIGEga2V5PSBhcmd1bWVudApfbnNtYWxsZXN0ID0gbnNtYWxsZXN0CmRlZiBuc21hbGxlc3QobiwgaXRlcmFibGUsIGtleT1Ob25lKToKICAgICIiIkZpbmQgdGhlIG4gc21hbGxlc3QgZWxlbWVudHMgaW4gYSBkYXRhc2V0LgoKICAgIEVxdWl2YWxlbnQgdG86ICBzb3J0ZWQoaXRlcmFibGUsIGtleT1rZXkpWzpuXQogICAgIiIiCiAgICAjIFNob3J0LWN1dCBmb3Igbj09MSBpcyB0byB1c2UgbWluKCkgd2hlbiBsZW4oaXRlcmFibGUpPjAKICAgIGlmIG4gPT0gMToKICAgICAgICBpdCA9IGl0ZXIoaXRlcmFibGUpCiAgICAgICAgaGVhZCA9IGxpc3QoaXNsaWNlKGl0LCAxKSkKICAgICAgICBpZiBub3QgaGVhZDoKICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgaWYga2V5IGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBbbWluKGNoYWluKGhlYWQsIGl0KSldCiAgICAgICAgcmV0dXJuIFttaW4oY2hhaW4oaGVhZCwgaXQpLCBrZXk9a2V5KV0KCiAgICAjIFdoZW4gbj49c2l6ZSwgaXQncyBmYXN0ZXIgdG8gdXNlIHNvcnQoKQogICAgdHJ5OgogICAgICAgIHNpemUgPSBsZW4oaXRlcmFibGUpCiAgICBleGNlcHQgKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpOgogICAgICAgIHBhc3MKICAgIGVsc2U6CiAgICAgICAgaWYgbiA+PSBzaXplOgogICAgICAgICAgICByZXR1cm4gc29ydGVkKGl0ZXJhYmxlLCBrZXk9a2V5KVs6bl0KCiAgICAjIFdoZW4ga2V5IGlzIG5vbmUsIHVzZSBzaW1wbGVyIGRlY29yYXRpb24KICAgIGlmIGtleSBpcyBOb25lOgogICAgICAgIGl0ID0gemlwKGl0ZXJhYmxlLCBjb3VudCgpKSAgICAgICAgICAgICAgICAgICAgICAgICAjIGRlY29yYXRlCiAgICAgICAgcmVzdWx0ID0gX25zbWFsbGVzdChuLCBpdCkKICAgICAgICByZXR1cm4gbGlzdChtYXAoaXRlbWdldHRlcigwKSwgcmVzdWx0KSkgICAgICAgICAgICAgIyB1bmRlY29yYXRlCgogICAgIyBHZW5lcmFsIGNhc2UsIHNsb3dlc3QgbWV0aG9kCiAgICBpbjEsIGluMiA9IHRlZShpdGVyYWJsZSkKICAgIGl0ID0gemlwKG1hcChrZXksIGluMSksIGNvdW50KCksIGluMikgICAgICAgICAgICAgICAgICAgIyBkZWNvcmF0ZQogICAgcmVzdWx0ID0gX25zbWFsbGVzdChuLCBpdCkKICAgIHJldHVybiBsaXN0KG1hcChpdGVtZ2V0dGVyKDIpLCByZXN1bHQpKSAgICAgICAgICAgICAgICAgIyB1bmRlY29yYXRlCgpfbmxhcmdlc3QgPSBubGFyZ2VzdApkZWYgbmxhcmdlc3QobiwgaXRlcmFibGUsIGtleT1Ob25lKToKICAgICIiIkZpbmQgdGhlIG4gbGFyZ2VzdCBlbGVtZW50cyBpbiBhIGRhdGFzZXQuCgogICAgRXF1aXZhbGVudCB0bzogIHNvcnRlZChpdGVyYWJsZSwga2V5PWtleSwgcmV2ZXJzZT1UcnVlKVs6bl0KICAgICIiIgoKICAgICMgU2hvcnQtY3V0IGZvciBuPT0xIGlzIHRvIHVzZSBtYXgoKSB3aGVuIGxlbihpdGVyYWJsZSk+MAogICAgaWYgbiA9PSAxOgogICAgICAgIGl0ID0gaXRlcihpdGVyYWJsZSkKICAgICAgICBoZWFkID0gbGlzdChpc2xpY2UoaXQsIDEpKQogICAgICAgIGlmIG5vdCBoZWFkOgogICAgICAgICAgICByZXR1cm4gW10KICAgICAgICBpZiBrZXkgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIFttYXgoY2hhaW4oaGVhZCwgaXQpKV0KICAgICAgICByZXR1cm4gW21heChjaGFpbihoZWFkLCBpdCksIGtleT1rZXkpXQoKICAgICMgV2hlbiBuPj1zaXplLCBpdCdzIGZhc3RlciB0byB1c2Ugc29ydCgpCiAgICB0cnk6CiAgICAgICAgc2l6ZSA9IGxlbihpdGVyYWJsZSkKICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CiAgICAgICAgcGFzcwogICAgZWxzZToKICAgICAgICBpZiBuID49IHNpemU6CiAgICAgICAgICAgIHJldHVybiBzb3J0ZWQoaXRlcmFibGUsIGtleT1rZXksIHJldmVyc2U9VHJ1ZSlbOm5dCgogICAgIyBXaGVuIGtleSBpcyBub25lLCB1c2Ugc2ltcGxlciBkZWNvcmF0aW9uCiAgICBpZiBrZXkgaXMgTm9uZToKICAgICAgICBpdCA9IHppcChpdGVyYWJsZSwgbWFwKG5lZywgY291bnQoKSkpICAgICAgICAgICAgICAgIyBkZWNvcmF0ZQogICAgICAgIHJlc3VsdCA9IF9ubGFyZ2VzdChuLCBpdCkKICAgICAgICByZXR1cm4gbGlzdChtYXAoaXRlbWdldHRlcigwKSwgcmVzdWx0KSkgICAgICAgICAgICAgIyB1bmRlY29yYXRlCgogICAgIyBHZW5lcmFsIGNhc2UsIHNsb3dlc3QgbWV0aG9kCiAgICBpbjEsIGluMiA9IHRlZShpdGVyYWJsZSkKICAgIGl0ID0gemlwKG1hcChrZXksIGluMSksIG1hcChuZWcsIGNvdW50KCkpLCBpbjIpICAgICAgICAgIyBkZWNvcmF0ZQogICAgcmVzdWx0ID0gX25sYXJnZXN0KG4sIGl0KQogICAgcmV0dXJuIGxpc3QobWFwKGl0ZW1nZXR0ZXIoMiksIHJlc3VsdCkpICAgICAgICAgICAgICAgICAjIHVuZGVjb3JhdGUKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAjIFNpbXBsZSBzYW5pdHkgdGVzdAogICAgaGVhcCA9IFtdCiAgICBkYXRhID0gWzEsIDMsIDUsIDcsIDksIDIsIDQsIDYsIDgsIDBdCiAgICBmb3IgaXRlbSBpbiBkYXRhOgogICAgICAgIGhlYXBwdXNoKGhlYXAsIGl0ZW0pCiAgICBzb3J0ID0gW10KICAgIHdoaWxlIGhlYXA6CiAgICAgICAgc29ydC5hcHBlbmQoaGVhcHBvcChoZWFwKSkKICAgIHByaW50KHNvcnQpCgogICAgaW1wb3J0IGRvY3Rlc3QKICAgIGRvY3Rlc3QudGVzdG1vZCgpCg==