IyAtKi0gY29kaW5nOiBMYXRpbi0xIC0qLQoKIiIiSGVhcCBxdWV1ZSBhbGdvcml0aG0gKGEuay5hLiBwcmlvcml0eSBxdWV1ZSkuCgpIZWFwcyBhcmUgYXJyYXlzIGZvciB3aGljaCBhW2tdIDw9IGFbMiprKzFdIGFuZCBhW2tdIDw9IGFbMiprKzJdIGZvcgphbGwgaywgY291bnRpbmcgZWxlbWVudHMgZnJvbSAwLiAgRm9yIHRoZSBzYWtlIG9mIGNvbXBhcmlzb24sCm5vbi1leGlzdGluZyBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBpbmZpbml0ZS4gIFRoZSBpbnRlcmVzdGluZwpwcm9wZXJ0eSBvZiBhIGhlYXAgaXMgdGhhdCBhWzBdIGlzIGFsd2F5cyBpdHMgc21hbGxlc3QgZWxlbWVudC4KClVzYWdlOgoKaGVhcCA9IFtdICAgICAgICAgICAgIyBjcmVhdGVzIGFuIGVtcHR5IGhlYXAKaGVhcHB1c2goaGVhcCwgaXRlbSkgIyBwdXNoZXMgYSBuZXcgaXRlbSBvbiB0aGUgaGVhcAppdGVtID0gaGVhcHBvcChoZWFwKSAjIHBvcHMgdGhlIHNtYWxsZXN0IGl0ZW0gZnJvbSB0aGUgaGVhcAppdGVtID0gaGVhcFswXSAgICAgICAjIHNtYWxsZXN0IGl0ZW0gb24gdGhlIGhlYXAgd2l0aG91dCBwb3BwaW5nIGl0CmhlYXBpZnkoeCkgICAgICAgICAgICMgdHJhbnNmb3JtcyBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gbGluZWFyIHRpbWUKaXRlbSA9IGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pICMgcG9wcyBhbmQgcmV0dXJucyBzbWFsbGVzdCBpdGVtLCBhbmQgYWRkcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBuZXcgaXRlbTsgdGhlIGhlYXAgc2l6ZSBpcyB1bmNoYW5nZWQKCk91ciBBUEkgZGlmZmVycyBmcm9tIHRleHRib29rIGhlYXAgYWxnb3JpdGhtcyBhcyBmb2xsb3dzOgoKLSBXZSB1c2UgMC1iYXNlZCBpbmRleGluZy4gIFRoaXMgbWFrZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZQogIGluZGV4IGZvciBhIG5vZGUgYW5kIHRoZSBpbmRleGVzIGZvciBpdHMgY2hpbGRyZW4gc2xpZ2h0bHkgbGVzcwogIG9idmlvdXMsIGJ1dCBpcyBtb3JlIHN1aXRhYmxlIHNpbmNlIFB5dGhvbiB1c2VzIDAtYmFzZWQgaW5kZXhpbmcuCgotIE91ciBoZWFwcG9wKCkgbWV0aG9kIHJldHVybnMgdGhlIHNtYWxsZXN0IGl0ZW0sIG5vdCB0aGUgbGFyZ2VzdC4KClRoZXNlIHR3byBtYWtlIGl0IHBvc3NpYmxlIHRvIHZpZXcgdGhlIGhlYXAgYXMgYSByZWd1bGFyIFB5dGhvbiBsaXN0CndpdGhvdXQgc3VycHJpc2VzOiBoZWFwWzBdIGlzIHRoZSBzbWFsbGVzdCBpdGVtLCBhbmQgaGVhcC5zb3J0KCkKbWFpbnRhaW5zIHRoZSBoZWFwIGludmFyaWFudCEKIiIiCgojIE9yaWdpbmFsIGNvZGUgYnkgS2V2aW4gTydDb25ub3IsIGF1Z21lbnRlZCBieSBUaW0gUGV0ZXJzIGFuZCBSYXltb25kIEhldHRpbmdlcgoKX19hYm91dF9fID0gIiIiSGVhcCBxdWV1ZXMKCltleHBsYW5hdGlvbiBieSBGcmFu529pcyBQaW5hcmRdCgpIZWFwcyBhcmUgYXJyYXlzIGZvciB3aGljaCBhW2tdIDw9IGFbMiprKzFdIGFuZCBhW2tdIDw9IGFbMiprKzJdIGZvcgphbGwgaywgY291bnRpbmcgZWxlbWVudHMgZnJvbSAwLiAgRm9yIHRoZSBzYWtlIG9mIGNvbXBhcmlzb24sCm5vbi1leGlzdGluZyBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBpbmZpbml0ZS4gIFRoZSBpbnRlcmVzdGluZwpwcm9wZXJ0eSBvZiBhIGhlYXAgaXMgdGhhdCBhWzBdIGlzIGFsd2F5cyBpdHMgc21hbGxlc3QgZWxlbWVudC4KClRoZSBzdHJhbmdlIGludmFyaWFudCBhYm92ZSBpcyBtZWFudCB0byBiZSBhbiBlZmZpY2llbnQgbWVtb3J5CnJlcHJlc2VudGF0aW9uIGZvciBhIHRvdXJuYW1lbnQuICBUaGUgbnVtYmVycyBiZWxvdyBhcmUgYGsnLCBub3QgYVtrXToKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAoKICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKCiAgICAgICAgICAzICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgICA1ICAgICAgICAgICAgICAgNgoKICAgICAgNyAgICAgICA4ICAgICAgIDkgICAgICAgMTAgICAgICAxMSAgICAgIDEyICAgICAgMTMgICAgICAxNAoKICAgIDE1IDE2ICAgMTcgMTggICAxOSAyMCAgIDIxIDIyICAgMjMgMjQgICAyNSAyNiAgIDI3IDI4ICAgMjkgMzAKCgpJbiB0aGUgdHJlZSBhYm92ZSwgZWFjaCBjZWxsIGBrJyBpcyB0b3BwaW5nIGAyKmsrMScgYW5kIGAyKmsrMicuICBJbgphbiB1c3VhbCBiaW5hcnkgdG91cm5hbWVudCB3ZSBzZWUgaW4gc3BvcnRzLCBlYWNoIGNlbGwgaXMgdGhlIHdpbm5lcgpvdmVyIHRoZSB0d28gY2VsbHMgaXQgdG9wcywgYW5kIHdlIGNhbiB0cmFjZSB0aGUgd2lubmVyIGRvd24gdGhlIHRyZWUKdG8gc2VlIGFsbCBvcHBvbmVudHMgcy9oZSBoYWQuICBIb3dldmVyLCBpbiBtYW55IGNvbXB1dGVyIGFwcGxpY2F0aW9ucwpvZiBzdWNoIHRvdXJuYW1lbnRzLCB3ZSBkbyBub3QgbmVlZCB0byB0cmFjZSB0aGUgaGlzdG9yeSBvZiBhIHdpbm5lci4KVG8gYmUgbW9yZSBtZW1vcnkgZWZmaWNpZW50LCB3aGVuIGEgd2lubmVyIGlzIHByb21vdGVkLCB3ZSB0cnkgdG8KcmVwbGFjZSBpdCBieSBzb21ldGhpbmcgZWxzZSBhdCBhIGxvd2VyIGxldmVsLCBhbmQgdGhlIHJ1bGUgYmVjb21lcwp0aGF0IGEgY2VsbCBhbmQgdGhlIHR3byBjZWxscyBpdCB0b3BzIGNvbnRhaW4gdGhyZWUgZGlmZmVyZW50IGl0ZW1zLApidXQgdGhlIHRvcCBjZWxsICJ3aW5zIiBvdmVyIHRoZSB0d28gdG9wcGVkIGNlbGxzLgoKSWYgdGhpcyBoZWFwIGludmFyaWFudCBpcyBwcm90ZWN0ZWQgYXQgYWxsIHRpbWUsIGluZGV4IDAgaXMgY2xlYXJseQp0aGUgb3ZlcmFsbCB3aW5uZXIuICBUaGUgc2ltcGxlc3QgYWxnb3JpdGhtaWMgd2F5IHRvIHJlbW92ZSBpdCBhbmQKZmluZCB0aGUgIm5leHQiIHdpbm5lciBpcyB0byBtb3ZlIHNvbWUgbG9zZXIgKGxldCdzIHNheSBjZWxsIDMwIGluIHRoZQpkaWFncmFtIGFib3ZlKSBpbnRvIHRoZSAwIHBvc2l0aW9uLCBhbmQgdGhlbiBwZXJjb2xhdGUgdGhpcyBuZXcgMCBkb3duCnRoZSB0cmVlLCBleGNoYW5naW5nIHZhbHVlcywgdW50aWwgdGhlIGludmFyaWFudCBpcyByZS1lc3RhYmxpc2hlZC4KVGhpcyBpcyBjbGVhcmx5IGxvZ2FyaXRobWljIG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHRyZWUuCkJ5IGl0ZXJhdGluZyBvdmVyIGFsbCBpdGVtcywgeW91IGdldCBhbiBPKG4gbG4gbikgc29ydC4KCkEgbmljZSBmZWF0dXJlIG9mIHRoaXMgc29ydCBpcyB0aGF0IHlvdSBjYW4gZWZmaWNpZW50bHkgaW5zZXJ0IG5ldwppdGVtcyB3aGlsZSB0aGUgc29ydCBpcyBnb2luZyBvbiwgcHJvdmlkZWQgdGhhdCB0aGUgaW5zZXJ0ZWQgaXRlbXMgYXJlCm5vdCAiYmV0dGVyIiB0aGFuIHRoZSBsYXN0IDAndGggZWxlbWVudCB5b3UgZXh0cmFjdGVkLiAgVGhpcyBpcwplc3BlY2lhbGx5IHVzZWZ1bCBpbiBzaW11bGF0aW9uIGNvbnRleHRzLCB3aGVyZSB0aGUgdHJlZSBob2xkcyBhbGwKaW5jb21pbmcgZXZlbnRzLCBhbmQgdGhlICJ3aW4iIGNvbmRpdGlvbiBtZWFucyB0aGUgc21hbGxlc3Qgc2NoZWR1bGVkCnRpbWUuICBXaGVuIGFuIGV2ZW50IHNjaGVkdWxlIG90aGVyIGV2ZW50cyBmb3IgZXhlY3V0aW9uLCB0aGV5IGFyZQpzY2hlZHVsZWQgaW50byB0aGUgZnV0dXJlLCBzbyB0aGV5IGNhbiBlYXNpbHkgZ28gaW50byB0aGUgaGVhcC4gIFNvLCBhCmhlYXAgaXMgYSBnb29kIHN0cnVjdHVyZSBmb3IgaW1wbGVtZW50aW5nIHNjaGVkdWxlcnMgKHRoaXMgaXMgd2hhdCBJCnVzZWQgZm9yIG15IE1JREkgc2VxdWVuY2VyIDotKS4KClZhcmlvdXMgc3RydWN0dXJlcyBmb3IgaW1wbGVtZW50aW5nIHNjaGVkdWxlcnMgaGF2ZSBiZWVuIGV4dGVuc2l2ZWx5CnN0dWRpZWQsIGFuZCBoZWFwcyBhcmUgZ29vZCBmb3IgdGhpcywgYXMgdGhleSBhcmUgcmVhc29uYWJseSBzcGVlZHksCnRoZSBzcGVlZCBpcyBhbG1vc3QgY29uc3RhbnQsIGFuZCB0aGUgd29yc3QgY2FzZSBpcyBub3QgbXVjaCBkaWZmZXJlbnQKdGhhbiB0aGUgYXZlcmFnZSBjYXNlLiAgSG93ZXZlciwgdGhlcmUgYXJlIG90aGVyIHJlcHJlc2VudGF0aW9ucyB3aGljaAphcmUgbW9yZSBlZmZpY2llbnQgb3ZlcmFsbCwgeWV0IHRoZSB3b3JzdCBjYXNlcyBtaWdodCBiZSB0ZXJyaWJsZS4KCkhlYXBzIGFyZSBhbHNvIHZlcnkgdXNlZnVsIGluIGJpZyBkaXNrIHNvcnRzLiAgWW91IG1vc3QgcHJvYmFibHkgYWxsCmtub3cgdGhhdCBhIGJpZyBzb3J0IGltcGxpZXMgcHJvZHVjaW5nICJydW5zIiAod2hpY2ggYXJlIHByZS1zb3J0ZWQKc2VxdWVuY2VzLCB3aGljaCBzaXplIGlzIHVzdWFsbHkgcmVsYXRlZCB0byB0aGUgYW1vdW50IG9mIENQVSBtZW1vcnkpLApmb2xsb3dlZCBieSBhIG1lcmdpbmcgcGFzc2VzIGZvciB0aGVzZSBydW5zLCB3aGljaCBtZXJnaW5nIGlzIG9mdGVuCnZlcnkgY2xldmVybHkgb3JnYW5pc2VkWzFdLiAgSXQgaXMgdmVyeSBpbXBvcnRhbnQgdGhhdCB0aGUgaW5pdGlhbApzb3J0IHByb2R1Y2VzIHRoZSBsb25nZXN0IHJ1bnMgcG9zc2libGUuICBUb3VybmFtZW50cyBhcmUgYSBnb29kIHdheQp0byB0aGF0LiAgSWYsIHVzaW5nIGFsbCB0aGUgbWVtb3J5IGF2YWlsYWJsZSB0byBob2xkIGEgdG91cm5hbWVudCwgeW91CnJlcGxhY2UgYW5kIHBlcmNvbGF0ZSBpdGVtcyB0aGF0IGhhcHBlbiB0byBmaXQgdGhlIGN1cnJlbnQgcnVuLCB5b3UnbGwKcHJvZHVjZSBydW5zIHdoaWNoIGFyZSB0d2ljZSB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGZvciByYW5kb20gaW5wdXQsCmFuZCBtdWNoIGJldHRlciBmb3IgaW5wdXQgZnV6emlseSBvcmRlcmVkLgoKTW9yZW92ZXIsIGlmIHlvdSBvdXRwdXQgdGhlIDAndGggaXRlbSBvbiBkaXNrIGFuZCBnZXQgYW4gaW5wdXQgd2hpY2gKbWF5IG5vdCBmaXQgaW4gdGhlIGN1cnJlbnQgdG91cm5hbWVudCAoYmVjYXVzZSB0aGUgdmFsdWUgIndpbnMiIG92ZXIKdGhlIGxhc3Qgb3V0cHV0IHZhbHVlKSwgaXQgY2Fubm90IGZpdCBpbiB0aGUgaGVhcCwgc28gdGhlIHNpemUgb2YgdGhlCmhlYXAgZGVjcmVhc2VzLiAgVGhlIGZyZWVkIG1lbW9yeSBjb3VsZCBiZSBjbGV2ZXJseSByZXVzZWQgaW1tZWRpYXRlbHkKZm9yIHByb2dyZXNzaXZlbHkgYnVpbGRpbmcgYSBzZWNvbmQgaGVhcCwgd2hpY2ggZ3Jvd3MgYXQgZXhhY3RseSB0aGUKc2FtZSByYXRlIHRoZSBmaXJzdCBoZWFwIGlzIG1lbHRpbmcuICBXaGVuIHRoZSBmaXJzdCBoZWFwIGNvbXBsZXRlbHkKdmFuaXNoZXMsIHlvdSBzd2l0Y2ggaGVhcHMgYW5kIHN0YXJ0IGEgbmV3IHJ1bi4gIENsZXZlciBhbmQgcXVpdGUKZWZmZWN0aXZlIQoKSW4gYSB3b3JkLCBoZWFwcyBhcmUgdXNlZnVsIG1lbW9yeSBzdHJ1Y3R1cmVzIHRvIGtub3cuICBJIHVzZSB0aGVtIGluCmEgZmV3IGFwcGxpY2F0aW9ucywgYW5kIEkgdGhpbmsgaXQgaXMgZ29vZCB0byBrZWVwIGEgYGhlYXAnIG1vZHVsZQphcm91bmQuIDotKQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0KWzFdIFRoZSBkaXNrIGJhbGFuY2luZyBhbGdvcml0aG1zIHdoaWNoIGFyZSBjdXJyZW50LCBub3dhZGF5cywgYXJlCm1vcmUgYW5ub3lpbmcgdGhhbiBjbGV2ZXIsIGFuZCB0aGlzIGlzIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHNlZWtpbmcKY2FwYWJpbGl0aWVzIG9mIHRoZSBkaXNrcy4gIE9uIGRldmljZXMgd2hpY2ggY2Fubm90IHNlZWssIGxpa2UgYmlnCnRhcGUgZHJpdmVzLCB0aGUgc3Rvcnkgd2FzIHF1aXRlIGRpZmZlcmVudCwgYW5kIG9uZSBoYWQgdG8gYmUgdmVyeQpjbGV2ZXIgdG8gZW5zdXJlIChmYXIgaW4gYWR2YW5jZSkgdGhhdCBlYWNoIHRhcGUgbW92ZW1lbnQgd2lsbCBiZSB0aGUKbW9zdCBlZmZlY3RpdmUgcG9zc2libGUgKHRoYXQgaXMsIHdpbGwgYmVzdCBwYXJ0aWNpcGF0ZSBhdAoicHJvZ3Jlc3NpbmciIHRoZSBtZXJnZSkuICBTb21lIHRhcGVzIHdlcmUgZXZlbiBhYmxlIHRvIHJlYWQKYmFja3dhcmRzLCBhbmQgdGhpcyB3YXMgYWxzbyB1c2VkIHRvIGF2b2lkIHRoZSByZXdpbmRpbmcgdGltZS4KQmVsaWV2ZSBtZSwgcmVhbCBnb29kIHRhcGUgc29ydHMgd2VyZSBxdWl0ZSBzcGVjdGFjdWxhciB0byB3YXRjaCEKRnJvbSBhbGwgdGltZXMsIHNvcnRpbmcgaGFzIGFsd2F5cyBiZWVuIGEgR3JlYXQgQXJ0ISA6LSkKIiIiCgpfX2FsbF9fID0gWydoZWFwcHVzaCcsICdoZWFwcG9wJywgJ2hlYXBpZnknLCAnaGVhcHJlcGxhY2UnLCAnbmxhcmdlc3QnLAogICAgICAgICAgICduc21hbGxlc3QnXQoKZnJvbSBpdGVydG9vbHMgaW1wb3J0IGlzbGljZSwgcmVwZWF0CmltcG9ydCBiaXNlY3QKCmRlZiBoZWFwcHVzaChoZWFwLCBpdGVtKToKICAgICIiIlB1c2ggaXRlbSBvbnRvIGhlYXAsIG1haW50YWluaW5nIHRoZSBoZWFwIGludmFyaWFudC4iIiIKICAgIGhlYXAuYXBwZW5kKGl0ZW0pCiAgICBfc2lmdGRvd24oaGVhcCwgMCwgbGVuKGhlYXApLTEpCgpkZWYgaGVhcHBvcChoZWFwKToKICAgICIiIlBvcCB0aGUgc21hbGxlc3QgaXRlbSBvZmYgdGhlIGhlYXAsIG1haW50YWluaW5nIHRoZSBoZWFwIGludmFyaWFudC4iIiIKICAgIGxhc3RlbHQgPSBoZWFwLnBvcCgpICAgICMgcmFpc2VzIGFwcHJvcHJpYXRlIEluZGV4RXJyb3IgaWYgaGVhcCBpcyBlbXB0eQogICAgaWYgaGVhcDoKICAgICAgICByZXR1cm5pdGVtID0gaGVhcFswXQogICAgICAgIGhlYXBbMF0gPSBsYXN0ZWx0CiAgICAgICAgX3NpZnR1cChoZWFwLCAwKQogICAgZWxzZToKICAgICAgICByZXR1cm5pdGVtID0gbGFzdGVsdAogICAgcmV0dXJuIHJldHVybml0ZW0KCmRlZiBoZWFwcmVwbGFjZShoZWFwLCBpdGVtKToKICAgICIiIlBvcCBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IHNtYWxsZXN0IHZhbHVlLCBhbmQgYWRkIHRoZSBuZXcgaXRlbS4KCiAgICBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gaGVhcHBvcCgpIGZvbGxvd2VkIGJ5IGhlYXBwdXNoKCksIGFuZCBjYW4gYmUKICAgIG1vcmUgYXBwcm9wcmlhdGUgd2hlbiB1c2luZyBhIGZpeGVkLXNpemUgaGVhcC4gIE5vdGUgdGhhdCB0aGUgdmFsdWUKICAgIHJldHVybmVkIG1heSBiZSBsYXJnZXIgdGhhbiBpdGVtISAgVGhhdCBjb25zdHJhaW5zIHJlYXNvbmFibGUgdXNlcyBvZgogICAgdGhpcyByb3V0aW5lIHVubGVzcyB3cml0dGVuIGFzIHBhcnQgb2YgYSBsYXJnZXIgZXhwcmVzc2lvbjoKCiAgICAgICAgcmVzdWx0ID0gaXRlbSA8PSBoZWFwWzBdIGFuZCBpdGVtICBvciAgaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSkKICAgICIiIgogICAgcmV0dXJuaXRlbSA9IGhlYXBbMF0gICAgIyByYWlzZXMgYXBwcm9wcmlhdGUgSW5kZXhFcnJvciBpZiBoZWFwIGlzIGVtcHR5CiAgICBoZWFwWzBdID0gaXRlbQogICAgX3NpZnR1cChoZWFwLCAwKQogICAgcmV0dXJuIHJldHVybml0ZW0KCmRlZiBoZWFwaWZ5KHgpOgogICAgIiIiVHJhbnNmb3JtIGxpc3QgaW50byBhIGhlYXAsIGluLXBsYWNlLCBpbiBPKGxlbihoZWFwKSkgdGltZS4iIiIKICAgIG4gPSBsZW4oeCkKICAgICMgVHJhbnNmb3JtIGJvdHRvbS11cC4gIFRoZSBsYXJnZXN0IGluZGV4IHRoZXJlJ3MgYW55IHBvaW50IHRvIGxvb2tpbmcgYXQKICAgICMgaXMgdGhlIGxhcmdlc3Qgd2l0aCBhIGNoaWxkIGluZGV4IGluLXJhbmdlLCBzbyBtdXN0IGhhdmUgMippICsgMSA8IG4sCiAgICAjIG9yIGkgPCAobi0xKS8yLiAgSWYgbiBpcyBldmVuID0gMipqLCB0aGlzIGlzICgyKmotMSkvMiA9IGotMS8yIHNvCiAgICAjIGotMSBpcyB0aGUgbGFyZ2VzdCwgd2hpY2ggaXMgbi8vMiAtIDEuICBJZiBuIGlzIG9kZCA9IDIqaisxLCB0aGlzIGlzCiAgICAjICgyKmorMS0xKS8yID0gaiBzbyBqLTEgaXMgdGhlIGxhcmdlc3QsIGFuZCB0aGF0J3MgYWdhaW4gbi8vMi0xLgogICAgZm9yIGkgaW4gcmV2ZXJzZWQoeHJhbmdlKG4vLzIpKToKICAgICAgICBfc2lmdHVwKHgsIGkpCgpkZWYgbmxhcmdlc3QoaXRlcmFibGUsIG4pOgogICAgIiIiRmluZCB0aGUgbiBsYXJnZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC4KCiAgICBFcXVpdmFsZW50IHRvOiAgc29ydGVkKGl0ZXJhYmxlLCByZXZlcnNlPVRydWUpWzpuXQogICAgIiIiCiAgICBpdCA9IGl0ZXIoaXRlcmFibGUpCiAgICByZXN1bHQgPSBsaXN0KGlzbGljZShpdCwgbikpCiAgICBpZiBub3QgcmVzdWx0OgogICAgICAgIHJldHVybiByZXN1bHQKICAgIGhlYXBpZnkocmVzdWx0KQogICAgX2hlYXByZXBsYWNlID0gaGVhcHJlcGxhY2UKICAgIHNvbCA9IHJlc3VsdFswXSAgICAgICAgICMgc29sIC0tPiBzbWFsbGVzdCBvZiB0aGUgbmxhcmdlc3QKICAgIGZvciBlbGVtIGluIGl0OgogICAgICAgIGlmIGVsZW0gPD0gc29sOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIF9oZWFwcmVwbGFjZShyZXN1bHQsIGVsZW0pCiAgICAgICAgc29sID0gcmVzdWx0WzBdCiAgICByZXN1bHQuc29ydChyZXZlcnNlPVRydWUpCiAgICByZXR1cm4gcmVzdWx0CgpkZWYgbnNtYWxsZXN0KGl0ZXJhYmxlLCBuKToKICAgICIiIkZpbmQgdGhlIG4gc21hbGxlc3QgZWxlbWVudHMgaW4gYSBkYXRhc2V0LgoKICAgIEVxdWl2YWxlbnQgdG86ICBzb3J0ZWQoaXRlcmFibGUpWzpuXQogICAgIiIiCiAgICBpZiBoYXNhdHRyKGl0ZXJhYmxlLCAnX19sZW5fXycpIGFuZCBuICogMTAgPD0gbGVuKGl0ZXJhYmxlKToKICAgICAgICAjIEZvciBzbWFsbGVyIHZhbHVlcyBvZiBuLCB0aGUgYmlzZWN0IG1ldGhvZCBpcyBmYXN0ZXIgdGhhbiBhIG1pbmhlYXAuCiAgICAgICAgIyBJdCBpcyBhbHNvIG1lbW9yeSBlZmZpY2llbnQsIGNvbnN1bWluZyBvbmx5IG4gZWxlbWVudHMgb2Ygc3BhY2UuCiAgICAgICAgaXQgPSBpdGVyKGl0ZXJhYmxlKQogICAgICAgIHJlc3VsdCA9IHNvcnRlZChpc2xpY2UoaXQsIDAsIG4pKQogICAgICAgIGlmIG5vdCByZXN1bHQ6CiAgICAgICAgICAgIHJldHVybiByZXN1bHQKICAgICAgICBpbnNvcnQgPSBiaXNlY3QuaW5zb3J0CiAgICAgICAgcG9wID0gcmVzdWx0LnBvcAogICAgICAgIGxvcyA9IHJlc3VsdFstMV0gICAgIyBsb3MgLS0+IExhcmdlc3Qgb2YgdGhlIG5zbWFsbGVzdAogICAgICAgIGZvciBlbGVtIGluIGl0OgogICAgICAgICAgICBpZiBsb3MgPD0gZWxlbToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGluc29ydChyZXN1bHQsIGVsZW0pCiAgICAgICAgICAgIHBvcCgpCiAgICAgICAgICAgIGxvcyA9IHJlc3VsdFstMV0KICAgICAgICByZXR1cm4gcmVzdWx0CiAgICAjIEFuIGFsdGVybmF0aXZlIGFwcHJvYWNoIG1hbmlmZXN0cyB0aGUgd2hvbGUgaXRlcmFibGUgaW4gbWVtb3J5IGJ1dAogICAgIyBzYXZlcyBjb21wYXJpc29ucyBieSBoZWFwaWZ5aW5nIGFsbCBhdCBvbmNlLiAgQWxzbywgc2F2ZXMgdGltZQogICAgIyBvdmVyIGJpc2VjdC5pbnNvcnQoKSB3aGljaCBoYXMgTyhuKSBkYXRhIG1vdmVtZW50IHRpbWUgZm9yIGV2ZXJ5CiAgICAjIGluc2VydGlvbi4gIEZpbmRpbmcgdGhlIG4gc21hbGxlc3Qgb2YgYW4gbSBsZW5ndGggaXRlcmFibGUgcmVxdWlyZXMKICAgICMgICAgTyhtKSArIE8obiBsb2cgbSkgY29tcGFyaXNvbnMuCiAgICBoID0gbGlzdChpdGVyYWJsZSkKICAgIGhlYXBpZnkoaCkKICAgIHJldHVybiBtYXAoaGVhcHBvcCwgcmVwZWF0KGgsIG1pbihuLCBsZW4oaCkpKSkKCiMgJ2hlYXAnIGlzIGEgaGVhcCBhdCBhbGwgaW5kaWNlcyA+PSBzdGFydHBvcywgZXhjZXB0IHBvc3NpYmx5IGZvciBwb3MuICBwb3MKIyBpcyB0aGUgaW5kZXggb2YgYSBsZWFmIHdpdGggYSBwb3NzaWJseSBvdXQtb2Ytb3JkZXIgdmFsdWUuICBSZXN0b3JlIHRoZQojIGhlYXAgaW52YXJpYW50LgpkZWYgX3NpZnRkb3duKGhlYXAsIHN0YXJ0cG9zLCBwb3MpOgogICAgbmV3aXRlbSA9IGhlYXBbcG9zXQogICAgIyBGb2xsb3cgdGhlIHBhdGggdG8gdGhlIHJvb3QsIG1vdmluZyBwYXJlbnRzIGRvd24gdW50aWwgZmluZGluZyBhIHBsYWNlCiAgICAjIG5ld2l0ZW0gZml0cy4KICAgIHdoaWxlIHBvcyA+IHN0YXJ0cG9zOgogICAgICAgIHBhcmVudHBvcyA9IChwb3MgLSAxKSA+PiAxCiAgICAgICAgcGFyZW50ID0gaGVhcFtwYXJlbnRwb3NdCiAgICAgICAgaWYgcGFyZW50IDw9IG5ld2l0ZW06CiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaGVhcFtwb3NdID0gcGFyZW50CiAgICAgICAgcG9zID0gcGFyZW50cG9zCiAgICBoZWFwW3Bvc10gPSBuZXdpdGVtCgojIFRoZSBjaGlsZCBpbmRpY2VzIG9mIGhlYXAgaW5kZXggcG9zIGFyZSBhbHJlYWR5IGhlYXBzLCBhbmQgd2Ugd2FudCB0byBtYWtlCiMgYSBoZWFwIGF0IGluZGV4IHBvcyB0b28uICBXZSBkbyB0aGlzIGJ5IGJ1YmJsaW5nIHRoZSBzbWFsbGVyIGNoaWxkIG9mCiMgcG9zIHVwIChhbmQgc28gb24gd2l0aCB0aGF0IGNoaWxkJ3MgY2hpbGRyZW4sIGV0YykgdW50aWwgaGl0dGluZyBhIGxlYWYsCiMgdGhlbiB1c2luZyBfc2lmdGRvd24gdG8gbW92ZSB0aGUgb2RkYmFsbCBvcmlnaW5hbGx5IGF0IGluZGV4IHBvcyBpbnRvIHBsYWNlLgojCiMgV2UgKmNvdWxkKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgYXMgc29vbiBhcyB3ZSBmaW5kIGEgcG9zIHdoZXJlIG5ld2l0ZW0gPD0KIyBib3RoIGl0cyBjaGlsZHJlbiwgYnV0IHR1cm5zIG91dCB0aGF0J3Mgbm90IGEgZ29vZCBpZGVhLCBhbmQgZGVzcGl0ZSB0aGF0CiMgbWFueSBib29rcyB3cml0ZSB0aGUgYWxnb3JpdGhtIHRoYXQgd2F5LiAgRHVyaW5nIGEgaGVhcCBwb3AsIHRoZSBsYXN0IGFycmF5CiMgZWxlbWVudCBpcyBzaWZ0ZWQgaW4sIGFuZCB0aGF0IHRlbmRzIHRvIGJlIGxhcmdlLCBzbyB0aGF0IGNvbXBhcmluZyBpdAojIGFnYWluc3QgdmFsdWVzIHN0YXJ0aW5nIGZyb20gdGhlIHJvb3QgdXN1YWxseSBkb2Vzbid0IHBheSAoPSB1c3VhbGx5IGRvZXNuJ3QKIyBnZXQgdXMgb3V0IG9mIHRoZSBsb29wIGVhcmx5KS4gIFNlZSBLbnV0aCwgVm9sdW1lIDMsIHdoZXJlIHRoaXMgaXMKIyBleHBsYWluZWQgYW5kIHF1YW50aWZpZWQgaW4gYW4gZXhlcmNpc2UuCiMKIyBDdXR0aW5nIHRoZSAjIG9mIGNvbXBhcmlzb25zIGlzIGltcG9ydGFudCwgc2luY2UgdGhlc2Ugcm91dGluZXMgaGF2ZSBubwojIHdheSB0byBleHRyYWN0ICJ0aGUgcHJpb3JpdHkiIGZyb20gYW4gYXJyYXkgZWxlbWVudCwgc28gdGhhdCBpbnRlbGxpZ2VuY2UKIyBpcyBsaWtlbHkgdG8gYmUgaGlkaW5nIGluIGN1c3RvbSBfX2NtcF9fIG1ldGhvZHMsIG9yIGluIGFycmF5IGVsZW1lbnRzCiMgc3RvcmluZyAocHJpb3JpdHksIHJlY29yZCkgdHVwbGVzLiAgQ29tcGFyaXNvbnMgYXJlIHRodXMgcG90ZW50aWFsbHkKIyBleHBlbnNpdmUuCiMKIyBPbiByYW5kb20gYXJyYXlzIG9mIGxlbmd0aCAxMDAwLCBtYWtpbmcgdGhpcyBjaGFuZ2UgY3V0IHRoZSBudW1iZXIgb2YKIyBjb21wYXJpc29ucyBtYWRlIGJ5IGhlYXBpZnkoKSBhIGxpdHRsZSwgYW5kIHRob3NlIG1hZGUgYnkgZXhoYXVzdGl2ZQojIGhlYXBwb3AoKSBhIGxvdCwgaW4gYWNjb3JkIHdpdGggdGhlb3J5LiAgSGVyZSBhcmUgdHlwaWNhbCByZXN1bHRzIGZyb20gMwojIHJ1bnMgKDMganVzdCB0byBkZW1vbnN0cmF0ZSBob3cgc21hbGwgdGhlIHZhcmlhbmNlIGlzKToKIwojIENvbXBhcmVzIG5lZWRlZCBieSBoZWFwaWZ5ICAgICBDb21wYXJlcyBuZWVkZWQgYnkgMTAwMCBoZWFwcG9wcwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIDE4MzcgY3V0IHRvIDE2NjMgICAgICAgICAgICAgICAxNDk5NiBjdXQgdG8gODY4MAojIDE4NTUgY3V0IHRvIDE2NTkgICAgICAgICAgICAgICAxNDk2NiBjdXQgdG8gODY3OAojIDE4NDcgY3V0IHRvIDE2NjAgICAgICAgICAgICAgICAxNTAyNCBjdXQgdG8gODcwMwojCiMgQnVpbGRpbmcgdGhlIGhlYXAgYnkgdXNpbmcgaGVhcHB1c2goKSAxMDAwIHRpbWVzIGluc3RlYWQgcmVxdWlyZWQKIyAyMTk4LCAyMTQ4LCBhbmQgMjIxOSBjb21wYXJlczogIGhlYXBpZnkoKSBpcyBtb3JlIGVmZmljaWVudCwgd2hlbgojIHlvdSBjYW4gdXNlIGl0LgojCiMgVGhlIHRvdGFsIGNvbXBhcmVzIG5lZWRlZCBieSBsaXN0LnNvcnQoKSBvbiB0aGUgc2FtZSBsaXN0cyB3ZXJlIDg2MjcsCiMgODYyNywgYW5kIDg2MzIgKHRoaXMgc2hvdWxkIGJlIGNvbXBhcmVkIHRvIHRoZSBzdW0gb2YgaGVhcGlmeSgpIGFuZAojIGhlYXBwb3AoKSBjb21wYXJlcyk6ICBsaXN0LnNvcnQoKSBpcyAodW5zdXJwcmlzaW5nbHkhKSBtb3JlIGVmZmljaWVudAojIGZvciBzb3J0aW5nLgoKZGVmIF9zaWZ0dXAoaGVhcCwgcG9zKToKICAgIGVuZHBvcyA9IGxlbihoZWFwKQogICAgc3RhcnRwb3MgPSBwb3MKICAgIG5ld2l0ZW0gPSBoZWFwW3Bvc10KICAgICMgQnViYmxlIHVwIHRoZSBzbWFsbGVyIGNoaWxkIHVudGlsIGhpdHRpbmcgYSBsZWFmLgogICAgY2hpbGRwb3MgPSAyKnBvcyArIDEgICAgIyBsZWZ0bW9zdCBjaGlsZCBwb3NpdGlvbgogICAgd2hpbGUgY2hpbGRwb3MgPCBlbmRwb3M6CiAgICAgICAgIyBTZXQgY2hpbGRwb3MgdG8gaW5kZXggb2Ygc21hbGxlciBjaGlsZC4KICAgICAgICByaWdodHBvcyA9IGNoaWxkcG9zICsgMQogICAgICAgIGlmIHJpZ2h0cG9zIDwgZW5kcG9zIGFuZCBoZWFwW3JpZ2h0cG9zXSA8PSBoZWFwW2NoaWxkcG9zXToKICAgICAgICAgICAgY2hpbGRwb3MgPSByaWdodHBvcwogICAgICAgICMgTW92ZSB0aGUgc21hbGxlciBjaGlsZCB1cC4KICAgICAgICBoZWFwW3Bvc10gPSBoZWFwW2NoaWxkcG9zXQogICAgICAgIHBvcyA9IGNoaWxkcG9zCiAgICAgICAgY2hpbGRwb3MgPSAyKnBvcyArIDEKICAgICMgVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYnViYmxlIGl0IHVwCiAgICAjIHRvIGl0cyBmaW5hbCByZXN0aW5nIHBsYWNlIChieSBzaWZ0aW5nIGl0cyBwYXJlbnRzIGRvd24pLgogICAgaGVhcFtwb3NdID0gbmV3aXRlbQogICAgX3NpZnRkb3duKGhlYXAsIHN0YXJ0cG9zLCBwb3MpCgojIElmIGF2YWlsYWJsZSwgdXNlIEMgaW1wbGVtZW50YXRpb24KdHJ5OgogICAgZnJvbSBfaGVhcHEgaW1wb3J0IGhlYXBwdXNoLCBoZWFwcG9wLCBoZWFwaWZ5LCBoZWFwcmVwbGFjZSwgbmxhcmdlc3QsIG5zbWFsbGVzdApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBwYXNzCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIyBTaW1wbGUgc2FuaXR5IHRlc3QKICAgIGhlYXAgPSBbXQogICAgZGF0YSA9IFsxLCAzLCA1LCA3LCA5LCAyLCA0LCA2LCA4LCAwXQogICAgZm9yIGl0ZW0gaW4gZGF0YToKICAgICAgICBoZWFwcHVzaChoZWFwLCBpdGVtKQogICAgc29ydCA9IFtdCiAgICB3aGlsZSBoZWFwOgogICAgICAgIHNvcnQuYXBwZW5kKGhlYXBwb3AoaGVhcCkpCiAgICBwcmludCBzb3J0Cg==