ICAgICAgICAgICAgICAgSmF2YSh0bSkgQmluYXJ5IEtlcm5lbCBTdXBwb3J0IGZvciBMaW51eCB2MS4wMwogICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpMaW51eCBiZWF0cyB0aGVtIEFMTCEgV2hpbGUgYWxsIG90aGVyIE9TJ3MgYXJlIFRBTEtJTkcgYWJvdXQgZGlyZWN0CnN1cHBvcnQgb2YgSmF2YSBCaW5hcmllcyBpbiB0aGUgT1MsIExpbnV4IGlzIGRvaW5nIGl0IQoKWW91IGNhbiBleGVjdXRlIEphdmEgYXBwbGljYXRpb25zIGFuZCBKYXZhIEFwcGxldHMganVzdCBsaWtlIGFueQpvdGhlciBwcm9ncmFtIGFmdGVyIHlvdSBoYXZlIGRvbmUgdGhlIGZvbGxvd2luZzoKCjEpIFlvdSBNVVNUIEZJUlNUIGluc3RhbGwgdGhlIEphdmEgRGV2ZWxvcGVycyBLaXQgZm9yIExpbnV4LgogICBUaGUgSmF2YSBvbiBMaW51eCBIT1dUTyBnaXZlcyB0aGUgZGV0YWlscyBvbiBnZXR0aW5nIGFuZAogICBpbnN0YWxsaW5nIHRoaXMuIFRoaXMgSE9XVE8gY2FuIGJlIGZvdW5kIGF0OgoKCWZ0cDovL3N1bnNpdGUudW5jLmVkdS9wdWIvTGludXgvZG9jcy9IT1dUTy9KYXZhLUhPV1RPCgogICBZb3Ugc2hvdWxkIGFsc28gc2V0IHVwIGEgcmVhc29uYWJsZSBDTEFTU1BBVEggZW52aXJvbm1lbnQKICAgdmFyaWFibGUgdG8gdXNlIEphdmEgYXBwbGljYXRpb25zIHRoYXQgbWFrZSB1c2Ugb2YgYW55CiAgIG5vbnN0YW5kYXJkIGNsYXNzZXMgKG5vdCBpbmNsdWRlZCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkKICAgYXMgdGhlIGFwcGxpY2F0aW9uIGl0c2VsZikuCgoyKSBZb3UgaGF2ZSB0byBjb21waWxlIEJJTkZNVF9NSVNDIGVpdGhlciBhcyBhIG1vZHVsZSBvciBpbnRvCiAgIHRoZSBrZXJuZWwgKENPTkZJR19CSU5GTVRfTUlTQykgYW5kIHNldCBpdCB1cCBwcm9wZXJseS4KICAgSWYgeW91IGNob29zZSB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCB5b3Ugd2lsbCBoYXZlCiAgIHRvIGluc2VydCBpdCBtYW51YWxseSB3aXRoIG1vZHByb2JlL2luc21vZCwgYXMga21vZAogICBjYW4gbm90IGVhc2lseSBiZSBzdXBwb3J0ZWQgd2l0aCBiaW5mbXRfbWlzYy4gCiAgIFJlYWQgdGhlIGZpbGUgJ2JpbmZtdF9taXNjLnR4dCcgaW4gdGhpcyBkaXJlY3RvcnkgdG8ga25vdwogICBtb3JlIGFib3V0IHRoZSBjb25maWd1cmF0aW9uIHByb2Nlc3MuCgozKSBBZGQgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIGl0ZW1zIHRvIGJpbmZtdF9taXNjCiAgICh5b3Ugc2hvdWxkIHJlYWxseSBoYXZlIHJlYWQgYmluZm10X21pc2MudHh0IG5vdyk6CiAgIHN1cHBvcnQgZm9yIEphdmEgYXBwbGljYXRpb25zOgogICAgICc6SmF2YTpNOjpceGNhXHhmZVx4YmFceGJlOjovdXNyL2xvY2FsL2Jpbi9qYXZhd3JhcHBlcjonCiAgIHN1cHBvcnQgZm9yIGV4ZWN1dGFibGUgSmFyIGZpbGVzOgogICAgICc6RXhlY3V0YWJsZUpBUjpFOjpqYXI6Oi91c3IvbG9jYWwvYmluL2phcndyYXBwZXI6JwogICBzdXBwb3J0IGZvciBKYXZhIEFwcGxldHM6CiAgICAgJzpBcHBsZXQ6RTo6aHRtbDo6L3Vzci9iaW4vYXBwbGV0dmlld2VyOicKICAgb3IgdGhlIGZvbGxvd2luZywgaWYgeW91IHdhbnQgdG8gYmUgbW9yZSBzZWxlY3RpdmU6CiAgICAgJzpBcHBsZXQ6TTo6PCEtLWFwcGxldDo6L3Vzci9iaW4vYXBwbGV0dmlld2VyOicKCiAgIE9mIGNhdXNlIHlvdSBoYXZlIHRvIGZpeCB0aGUgcGF0aCBuYW1lcy4gR2l2ZW4gcGF0aC9maWxlIG5hbWVzIGluIHRoaXMKICAgZG9jdW1lbnQgbWF0Y2ggdGhlIERlYmlhbiAyLjEgc3lzdGVtLiAoaS5lLiBqZGsgaW5zdGFsbGVkIGluIC91c3IsCiAgIGN1c3RvbSB3cmFwcGVycyBmcm9tIHRoaXMgZG9jdW1lbnQgaW4gL3Vzci9sb2NhbCkKCiAgIE5vdGUsIHRoYXQgZm9yIHRoZSBtb3JlIHNlbGVjdGl2ZSBhcHBsZXQgc3VwcG9ydCB5b3UgaGF2ZSB0byBtb2RpZnkKICAgZXhpc3RpbmcgaHRtbC1maWxlcyB0byBjb250YWluIDwhLS1hcHBsZXQtLT4gaW4gdGhlIGZpcnN0IGxpbmUKICAgKCc8JyBoYXMgdG8gYmUgdGhlIGZpcnN0IGNoYXJhY3RlciEpIHRvIGxldCB0aGlzIHdvcmshCgogICBGb3IgdGhlIGNvbXBpbGVkIEphdmEgcHJvZ3JhbXMgeW91IG5lZWQgYSB3cmFwcGVyIHNjcmlwdCBsaWtlIHRoZQogICBmb2xsb3dpbmcgKHRoaXMgaXMgYmVjYXVzZSBKYXZhIGlzIGJyb2tlbiBpbiBjYXNlIG9mIHRoZSBmaWxlbmFtZQogICBoYW5kbGluZyksIGFnYWluIGZpeCB0aGUgcGF0aCBuYW1lcywgYm90aCBpbiB0aGUgc2NyaXB0IGFuZCBpbiB0aGUKICAgYWJvdmUgZ2l2ZW4gY29uZmlndXJhdGlvbiBzdHJpbmcuCgogICBZb3UsIHRvbywgbmVlZCB0aGUgbGl0dGxlIHByb2dyYW0gYWZ0ZXIgdGhlIHNjcmlwdC4gQ29tcGlsZSBsaWtlCiAgIGdjYyAtTzIgLW8gamF2YWNsYXNzbmFtZSBqYXZhY2xhc3NuYW1lLmMKICAgYW5kIHN0aWNrIGl0IHRvIC91c3IvbG9jYWwvYmluLgoKICAgQm90aCB0aGUgamF2YXdyYXBwZXIgc2hlbGxzY3JpcHQgYW5kIHRoZSBqYXZhY2xhc3NuYW1lIHByb2dyYW0KICAgd2VyZSBzdXBwbGllZCBieSBDb2xpbiBKLiBXYXRzb24gPGNqdzQ0QGNhbS5hYy51az4uCgo9PT09PT09PT09PT09PT09PT09PT09IEN1dCBoZXJlID09PT09PT09PT09PT09PT09PT0KIyEvYmluL2Jhc2gKIyAvdXNyL2xvY2FsL2Jpbi9qYXZhd3JhcHBlciAtIHRoZSB3cmFwcGVyIGZvciBiaW5mbXRfbWlzYy9qYXZhCgppZiBbIC16ICIkMSIgXTsgdGhlbgoJZXhlYyAxPiYyCgllY2hvIFVzYWdlOiAkMCBjbGFzcy1maWxlCglleGl0IDEKZmkKCkNMQVNTPSQxCkZRQ0xBU1M9YC91c3IvbG9jYWwvYmluL2phdmFjbGFzc25hbWUgJDFgCkZRQ0xBU1NOPWBlY2hvICRGUUNMQVNTIHwgc2VkIC1lICdzL14uKlwuXChbXi5dKlwpJC9cMS8nYApGUUNMQVNTUD1gZWNobyAkRlFDTEFTUyB8IHNlZCAtZSAncy1cLi0vLWcnIC1lICdzLV5bXi9dKiQtLScgLWUgJ3MtL1teL10qJC0tJ2AKCiMgZm9yIGV4YW1wbGU6CiMgQ0xBU1M9VGVzdC5jbGFzcwojIEZRQ0xBU1M9Zm9vLmJhci5UZXN0CiMgRlFDTEFTU049VGVzdAojIEZRQ0xBU1NQPWZvby9iYXIKCnVuc2V0IENMQVNTQkFTRQoKZGVjbGFyZSAtaSBMSU5LTEVWRUw9MAoKd2hpbGUgOjsgZG8KCWlmIFsgImBiYXNlbmFtZSAkQ0xBU1MgLmNsYXNzYCIgPT0gIiRGUUNMQVNTTiIgXTsgdGhlbgoJCSMgU2VlIGlmIHRoaXMgZGlyZWN0b3J5IHdvcmtzIHN0cmFpZ2h0IG9mZgoJCWNkIC1MIGBkaXJuYW1lICRDTEFTU2AKCQlDTEFTU0RJUj0kUFdECgkJY2QgJE9MRFBXRAoJCWlmIGVjaG8gJENMQVNTRElSIHwgZ3JlcCAtcSAiJEZRQ0xBU1NQJCI7IHRoZW4KCQkJQ0xBU1NCQVNFPWBlY2hvICRDTEFTU0RJUiB8IHNlZCAtZSAicy4kRlFDTEFTU1AkLi4iYAoJCQlicmVhazsKCQlmaQoJCSMgVHJ5IGRlcmVmZXJlbmNpbmcgdGhlIGRpcmVjdG9yeSBuYW1lCgkJY2QgLVAgYGRpcm5hbWUgJENMQVNTYAoJCUNMQVNTRElSPSRQV0QKCQljZCAkT0xEUFdECgkJaWYgZWNobyAkQ0xBU1NESVIgfCBncmVwIC1xICIkRlFDTEFTU1AkIjsgdGhlbgoJCQlDTEFTU0JBU0U9YGVjaG8gJENMQVNTRElSIHwgc2VkIC1lICJzLiRGUUNMQVNTUCQuLiJgCgkJCWJyZWFrOwoJCWZpCgkJIyBJZiBubyBvdGhlciBwb3NzaWJsZSBmaWxlbmFtZSBleGlzdHMKCQlpZiBbICEgLUwgJENMQVNTIF07IHRoZW4KCQkJZXhlYyAxPiYyCgkJCWVjaG8gJDA6CgkJCWVjaG8gIiAgJENMQVNTIHNob3VsZCBiZSBpbiBhIiBcCgkJCSAgICAgImRpcmVjdG9yeSB0cmVlIGNhbGxlZCAkRlFDTEFTU1AiCgkJCWV4aXQgMQoJCWZpCglmaQoJaWYgWyAhIC1MICRDTEFTUyBdOyB0aGVuIGJyZWFrOyBmaQoJIyBHbyBkb3duIG9uZSBtb3JlIGxldmVsIG9mIHN5bWJvbGljIGxpbmtzCglsZXQgTElOS0xFVkVMKz0xCglpZiBbICRMSU5LTEVWRUwgLWd0IDUgXTsgdGhlbgoJCWV4ZWMgMT4mMgoJCWVjaG8gJDA6CgkJZWNobyAiICBUb28gbWFueSBzeW1ib2xpYyBsaW5rcyBlbmNvdW50ZXJlZCIKCQlleGl0IDEKCWZpCglDTEFTUz1gbHMgLS1jb2xvcj1ubyAtbCAkQ0xBU1MgfCBzZWQgLWUgJ3MvXi4qIFwoW14gXSpcKSQvXDEvJ2AKZG9uZQoKaWYgWyAteiAiJENMQVNTQkFTRSIgXTsgdGhlbgoJaWYgWyAteiAiJEZRQ0xBU1NQIiBdOyB0aGVuCgkJR09PRE5BTUU9JEZRQ0xBU1NOLmNsYXNzCgllbHNlCgkJR09PRE5BTUU9JEZRQ0xBU1NQLyRGUUNMQVNTTi5jbGFzcwoJZmkKCWV4ZWMgMT4mMgoJZWNobyAkMDoKCWVjaG8gIiAgJEZRQ0xBU1Mgc2hvdWxkIGJlIGluIGEgZmlsZSBjYWxsZWQgJEdPT0ROQU1FIgoJZXhpdCAxCmZpCgppZiAhIGVjaG8gJENMQVNTUEFUSCB8IGdyZXAgLXEgIl5cKC4qOlwpKiRDTEFTU0JBU0VcKDouKlwpKiI7IHRoZW4KCSMgY2xhc3MgaXMgbm90IGluIENMQVNTUEFUSCwgc28gcHJlcGVuZCBkaXIgb2YgY2xhc3MgdG8gQ0xBU1NQQVRICglpZiBbIC16ICIke0NMQVNTUEFUSH0iIF0gOyB0aGVuCgkJZXhwb3J0IENMQVNTUEFUSD0kQ0xBU1NCQVNFCgllbHNlCgkJZXhwb3J0IENMQVNTUEFUSD0kQ0xBU1NCQVNFOiRDTEFTU1BBVEgKCWZpCmZpCgpzaGlmdAovdXNyL2Jpbi9qYXZhICRGUUNMQVNTICIkQCIKPT09PT09PT09PT09PT09PT09PT09PSBDdXQgaGVyZSA9PT09PT09PT09PT09PT09PT09CgoKPT09PT09PT09PT09PT09PT09PT09PSBDdXQgaGVyZSA9PT09PT09PT09PT09PT09PT09Ci8qIGphdmFjbGFzc25hbWUuYwogKgogKiBFeHRyYWN0cyB0aGUgY2xhc3MgbmFtZSBmcm9tIGEgSmF2YSBjbGFzcyBmaWxlOyBpbnRlbmRlZCBmb3IgdXNlIGluIGEgSmF2YQogKiB3cmFwcGVyIG9mIHRoZSB0eXBlIHN1cHBvcnRlZCBieSB0aGUgYmluZm10X21pc2Mgb3B0aW9uIGluIHRoZSBMaW51eCBrZXJuZWwuCiAqCiAqIENvcHlyaWdodCAoQykgMTk5OSBDb2xpbiBKLiBXYXRzb24gPGNqdzQ0QGNhbS5hYy51az4uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KCi8qIEZyb20gU3VuJ3MgSmF2YSBWTSBTcGVjaWZpY2F0aW9uLCBhcyB0YWcgZW50cmllcyBpbiB0aGUgY29uc3RhbnQgcG9vbC4gKi8KCiNkZWZpbmUgQ1BfVVRGOCAxCiNkZWZpbmUgQ1BfSU5URUdFUiAzCiNkZWZpbmUgQ1BfRkxPQVQgNAojZGVmaW5lIENQX0xPTkcgNQojZGVmaW5lIENQX0RPVUJMRSA2CiNkZWZpbmUgQ1BfQ0xBU1MgNwojZGVmaW5lIENQX1NUUklORyA4CiNkZWZpbmUgQ1BfRklFTERSRUYgOQojZGVmaW5lIENQX01FVEhPRFJFRiAxMAojZGVmaW5lIENQX0lOVEVSRkFDRU1FVEhPRFJFRiAxMQojZGVmaW5lIENQX05BTUVBTkRUWVBFIDEyCgovKiBEZWZpbmUgc29tZSBjb21tb25seSB1c2VkIGVycm9yIG1lc3NhZ2VzICovCgojZGVmaW5lIHNlZWtfZXJyb3IoKSBlcnJvcigiJXM6IENhbm5vdCBzZWVrXG4iLCBwcm9ncmFtKQojZGVmaW5lIGNvcnJ1cHRfZXJyb3IoKSBlcnJvcigiJXM6IENsYXNzIGZpbGUgY29ycnVwdFxuIiwgcHJvZ3JhbSkKI2RlZmluZSBlb2ZfZXJyb3IoKSBlcnJvcigiJXM6IFVuZXhwZWN0ZWQgZW5kIG9mIGZpbGVcbiIsIHByb2dyYW0pCiNkZWZpbmUgdXRmOF9lcnJvcigpIGVycm9yKCIlczogT25seSBBU0NJSSAxLTI1NSBzdXBwb3J0ZWRcbiIsIHByb2dyYW0pOwoKY2hhciAqcHJvZ3JhbTsKCmxvbmcgKnBvb2w7Cgp1X2ludDhfdCByZWFkXzgoRklMRSAqY2xhc3NmaWxlKTsKdV9pbnQxNl90IHJlYWRfMTYoRklMRSAqY2xhc3NmaWxlKTsKdm9pZCBza2lwX2NvbnN0YW50KEZJTEUgKmNsYXNzZmlsZSwgdV9pbnQxNl90ICpjdXIpOwp2b2lkIGVycm9yKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKCi8qIFJlYWRzIGluIGFuIHVuc2lnbmVkIDgtYml0IGludGVnZXIuICovCnVfaW50OF90IHJlYWRfOChGSUxFICpjbGFzc2ZpbGUpCnsKCWludCBiID0gZmdldGMoY2xhc3NmaWxlKTsKCWlmKGIgPT0gRU9GKQoJCWVvZl9lcnJvcigpOwoJcmV0dXJuICh1X2ludDhfdCliOwp9CgovKiBSZWFkcyBpbiBhbiB1bnNpZ25lZCAxNi1iaXQgaW50ZWdlci4gKi8KdV9pbnQxNl90IHJlYWRfMTYoRklMRSAqY2xhc3NmaWxlKQp7CglpbnQgYjEsIGIyOwoJYjEgPSBmZ2V0YyhjbGFzc2ZpbGUpOwoJaWYoYjEgPT0gRU9GKQoJCWVvZl9lcnJvcigpOwoJYjIgPSBmZ2V0YyhjbGFzc2ZpbGUpOwoJaWYoYjIgPT0gRU9GKQoJCWVvZl9lcnJvcigpOwoJcmV0dXJuICh1X2ludDE2X3QpKChiMSA8PCA4KSB8IGIyKTsKfQoKLyogUmVhZHMgaW4gYSB2YWx1ZSBmcm9tIHRoZSBjb25zdGFudCBwb29sLiAqLwp2b2lkIHNraXBfY29uc3RhbnQoRklMRSAqY2xhc3NmaWxlLCB1X2ludDE2X3QgKmN1cikKewoJdV9pbnQxNl90IGxlbjsKCWludCBzZWVrZXJyID0gMTsKCXBvb2xbKmN1cl0gPSBmdGVsbChjbGFzc2ZpbGUpOwoJc3dpdGNoKHJlYWRfOChjbGFzc2ZpbGUpKQoJewoJY2FzZSBDUF9VVEY4OgoJCWxlbiA9IHJlYWRfMTYoY2xhc3NmaWxlKTsKCQlzZWVrZXJyID0gZnNlZWsoY2xhc3NmaWxlLCBsZW4sIFNFRUtfQ1VSKTsKCQlicmVhazsKCWNhc2UgQ1BfQ0xBU1M6CgljYXNlIENQX1NUUklORzoKCQlzZWVrZXJyID0gZnNlZWsoY2xhc3NmaWxlLCAyLCBTRUVLX0NVUik7CgkJYnJlYWs7CgljYXNlIENQX0lOVEVHRVI6CgljYXNlIENQX0ZMT0FUOgoJY2FzZSBDUF9GSUVMRFJFRjoKCWNhc2UgQ1BfTUVUSE9EUkVGOgoJY2FzZSBDUF9JTlRFUkZBQ0VNRVRIT0RSRUY6CgljYXNlIENQX05BTUVBTkRUWVBFOgoJCXNlZWtlcnIgPSBmc2VlayhjbGFzc2ZpbGUsIDQsIFNFRUtfQ1VSKTsKCQlicmVhazsKCWNhc2UgQ1BfTE9ORzoKCWNhc2UgQ1BfRE9VQkxFOgoJCXNlZWtlcnIgPSBmc2VlayhjbGFzc2ZpbGUsIDgsIFNFRUtfQ1VSKTsKCQkrKygqY3VyKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJY29ycnVwdF9lcnJvcigpOwoJfQoJaWYoc2Vla2VycikKCQlzZWVrX2Vycm9yKCk7Cn0KCnZvaWQgZXJyb3IoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCnsKCXZhX2xpc3QgYXA7Cgl2YV9zdGFydChhcCwgZm9ybWF0KTsKCXZmcHJpbnRmKHN0ZGVyciwgZm9ybWF0LCBhcCk7Cgl2YV9lbmQoYXApOwoJZXhpdCgxKTsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CglGSUxFICpjbGFzc2ZpbGU7Cgl1X2ludDE2X3QgY3BfY291bnQsIGksIHRoaXNfY2xhc3MsIGNsYXNzaW5mb19wdHI7Cgl1X2ludDhfdCBsZW5ndGg7CgoJcHJvZ3JhbSA9IGFyZ3ZbMF07CgoJaWYoIWFyZ3ZbMV0pCgkJZXJyb3IoIiVzOiBNaXNzaW5nIGlucHV0IGZpbGVcbiIsIHByb2dyYW0pOwoJY2xhc3NmaWxlID0gZm9wZW4oYXJndlsxXSwgInJiIik7CglpZighY2xhc3NmaWxlKQoJCWVycm9yKCIlczogRXJyb3Igb3BlbmluZyAlc1xuIiwgcHJvZ3JhbSwgYXJndlsxXSk7CgoJaWYoZnNlZWsoY2xhc3NmaWxlLCA4LCBTRUVLX1NFVCkpICAvKiBza2lwIG1hZ2ljIGFuZCB2ZXJzaW9uIG51bWJlcnMgKi8KCQlzZWVrX2Vycm9yKCk7CgljcF9jb3VudCA9IHJlYWRfMTYoY2xhc3NmaWxlKTsKCXBvb2wgPSBjYWxsb2MoY3BfY291bnQsIHNpemVvZihsb25nKSk7CglpZighcG9vbCkKCQllcnJvcigiJXM6IE91dCBvZiBtZW1vcnkgZm9yIGNvbnN0YW50IHBvb2xcbiIsIHByb2dyYW0pOwoKCWZvcihpID0gMTsgaSA8IGNwX2NvdW50OyArK2kpCgkJc2tpcF9jb25zdGFudChjbGFzc2ZpbGUsICZpKTsKCWlmKGZzZWVrKGNsYXNzZmlsZSwgMiwgU0VFS19DVVIpKQkvKiBza2lwIGFjY2VzcyBmbGFncyAqLwoJCXNlZWtfZXJyb3IoKTsKCgl0aGlzX2NsYXNzID0gcmVhZF8xNihjbGFzc2ZpbGUpOwoJaWYodGhpc19jbGFzcyA8IDEgfHwgdGhpc19jbGFzcyA+PSBjcF9jb3VudCkKCQljb3JydXB0X2Vycm9yKCk7CglpZighcG9vbFt0aGlzX2NsYXNzXSB8fCBwb29sW3RoaXNfY2xhc3NdID09IC0xKQoJCWNvcnJ1cHRfZXJyb3IoKTsKCWlmKGZzZWVrKGNsYXNzZmlsZSwgcG9vbFt0aGlzX2NsYXNzXSArIDEsIFNFRUtfU0VUKSkKCQlzZWVrX2Vycm9yKCk7CgoJY2xhc3NpbmZvX3B0ciA9IHJlYWRfMTYoY2xhc3NmaWxlKTsKCWlmKGNsYXNzaW5mb19wdHIgPCAxIHx8IGNsYXNzaW5mb19wdHIgPj0gY3BfY291bnQpCgkJY29ycnVwdF9lcnJvcigpOwoJaWYoIXBvb2xbY2xhc3NpbmZvX3B0cl0gfHwgcG9vbFtjbGFzc2luZm9fcHRyXSA9PSAtMSkKCQljb3JydXB0X2Vycm9yKCk7CglpZihmc2VlayhjbGFzc2ZpbGUsIHBvb2xbY2xhc3NpbmZvX3B0cl0gKyAxLCBTRUVLX1NFVCkpCgkJc2Vla19lcnJvcigpOwoKCWxlbmd0aCA9IHJlYWRfMTYoY2xhc3NmaWxlKTsKCWZvcihpID0gMDsgaSA8IGxlbmd0aDsgKytpKQoJewoJCXVfaW50OF90IHggPSByZWFkXzgoY2xhc3NmaWxlKTsKCQlpZigoeCAmIDB4ODApIHx8ICF4KQoJCXsKCQkJaWYoKHggJiAweEUwKSA9PSAweEMwKQoJCQl7CgkJCQl1X2ludDhfdCB5ID0gcmVhZF84KGNsYXNzZmlsZSk7CgkJCQlpZigoeSAmIDB4QzApID09IDB4ODApCgkJCQl7CgkJCQkJaW50IGMgPSAoKHggJiAweDFmKSA8PCA2KSArICh5ICYgMHgzZik7CgkJCQkJaWYoYykgcHV0Y2hhcihjKTsKCQkJCQllbHNlIHV0ZjhfZXJyb3IoKTsKCQkJCX0KCQkJCWVsc2UgdXRmOF9lcnJvcigpOwoJCQl9CgkJCWVsc2UgdXRmOF9lcnJvcigpOwoJCX0KCQllbHNlIGlmKHggPT0gJy8nKSBwdXRjaGFyKCcuJyk7CgkJZWxzZSBwdXRjaGFyKHgpOwoJfQoJcHV0Y2hhcignXG4nKTsKCWZyZWUocG9vbCk7CglmY2xvc2UoY2xhc3NmaWxlKTsKCXJldHVybiAwOwp9Cj09PT09PT09PT09PT09PT09PT09PT0gQ3V0IGhlcmUgPT09PT09PT09PT09PT09PT09PQoKCj09PT09PT09PT09PT09PT09PT09PT0gQ3V0IGhlcmUgPT09PT09PT09PT09PT09PT09PQojIS9iaW4vYmFzaAojIC91c3IvbG9jYWwvamF2YS9iaW4vamFyd3JhcHBlciAtIHRoZSB3cmFwcGVyIGZvciBiaW5mbXRfbWlzYy9qYXIKCmphdmEgLWphciAkMQo9PT09PT09PT09PT09PT09PT09PT09IEN1dCBoZXJlID09PT09PT09PT09PT09PT09PT0KCgpOb3cgc2ltcGx5IGNobW9kICt4IHRoZSAuY2xhc3MsIC5qYXIgYW5kL29yIC5odG1sIGZpbGVzIHlvdSB3YW50IHRvIGV4ZWN1dGUuClRvIGFkZCBhIEphdmEgcHJvZ3JhbSB0byB5b3VyIHBhdGggYmVzdCBwdXQgYSBzeW1ib2xpYyBsaW5rIHRvIHRoZSBtYWluCi5jbGFzcyBmaWxlIGludG8gL3Vzci9iaW4gKG9yIGFub3RoZXIgcGxhY2UgeW91IGxpa2UpIG9taXR0aW5nIHRoZSAuY2xhc3MKZXh0ZW5zaW9uLiBUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIC5jbGFzcyBmaWxlIHdpbGwgYmUKYWRkZWQgdG8geW91ciBDTEFTU1BBVEggZHVyaW5nIGV4ZWN1dGlvbi4KCgpUbyB0ZXN0IHlvdXIgbmV3IHNldHVwLCBlbnRlciBpbiB0aGUgZm9sbG93aW5nIHNpbXBsZSBKYXZhIGFwcCwgYW5kIG5hbWUKaXQgIkhlbGxvV29ybGQuamF2YSI6CgoJY2xhc3MgSGVsbG9Xb3JsZCB7CgkJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgewoJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkhlbGxvIFdvcmxkISIpOwoJCX0KCX0KCk5vdyBjb21waWxlIHRoZSBhcHBsaWNhdGlvbiB3aXRoOgoJamF2YWMgSGVsbG9Xb3JsZC5qYXZhCgpTZXQgdGhlIGV4ZWN1dGFibGUgcGVybWlzc2lvbnMgb2YgdGhlIGJpbmFyeSBmaWxlLCB3aXRoOgoJY2htb2QgNzU1IEhlbGxvV29ybGQuY2xhc3MKCkFuZCB0aGVuIGV4ZWN1dGUgaXQ6CgkuL0hlbGxvV29ybGQuY2xhc3MKCgpUbyBleGVjdXRlIEphdmEgSmFyIGZpbGVzLCBzaW1wbGUgY2htb2QgdGhlICouamFyIGZpbGVzIHRvIGluY2x1ZGUKdGhlIGV4ZWN1dGlvbiBiaXQsIHRoZW4ganVzdCBkbwogICAgICAgLi9BcHBsaWNhdGlvbi5qYXIKCgpUbyBleGVjdXRlIEphdmEgQXBwbGV0cywgc2ltcGxlIGNobW9kIHRoZSAqLmh0bWwgZmlsZXMgdG8gaW5jbHVkZQp0aGUgZXhlY3V0aW9uIGJpdCwgdGhlbiBqdXN0IGRvCgkuL0FwcGxldC5odG1sCgoKb3JpZ2luYWxseSBieSBCcmlhbiBBLiBMYW50eiwgYnJpYW5AbGFudHouY29tCmhlYXZpbHkgZWRpdGVkIGZvciBiaW5mbXRfbWlzYyBieSBSaWNoYXJkIEf8bnRoZXIKbmV3IHNjcmlwdHMgYnkgQ29saW4gSi4gV2F0c29uIDxjanc0NEBjYW0uYWMudWs+CmFkZGVkIGV4ZWN1dGFibGUgSmFyIGZpbGUgc3VwcG9ydCBieSBLdXJ0IEh1d2lnIDxrdXJ0QGlrdS1uZXR6LmRlPgoK