LyoKICogJElkJAogKgogKiBDb3B5cmlnaHQgqSAyMDAzIEtlaXRoIFBhY2thcmQKICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgpzdGF0aWMgdm9pZCAqCk5ldyAoaW50IHNpemUpOwoKc3RhdGljIHZvaWQgKgpSZWFsbG9jYXRlICh2b2lkICpwLCBpbnQgc2l6ZSk7CgpzdGF0aWMgdm9pZApEaXNwb3NlICh2b2lkICpwKTsKCnR5cGVkZWYgZW51bSB7IEZhbHNlLCBUcnVlIH0gQm9vbDsKCnR5cGVkZWYgc3RydWN0IHsKICAgIGNoYXIgICAgKmJ1ZjsKICAgIGludAkgICAgc2l6ZTsKICAgIGludAkgICAgbGVuOwp9IFN0cmluZzsKCnN0YXRpYyBTdHJpbmcgKgpTdHJpbmdOZXcgKHZvaWQpOwoKc3RhdGljIHZvaWQKU3RyaW5nQWRkIChTdHJpbmcgKnMsIGNoYXIgYyk7CgpzdGF0aWMgdm9pZApTdHJpbmdBZGRTdHJpbmcgKFN0cmluZyAqcywgY2hhciAqYnVmKTsKCnN0YXRpYyBTdHJpbmcgKgpTdHJpbmdNYWtlIChjaGFyICpidWYpOwoKc3RhdGljIHZvaWQKU3RyaW5nRGVsIChTdHJpbmcgKnMpOwoKc3RhdGljIHZvaWQKU3RyaW5nUHV0IChGSUxFICpmLCBTdHJpbmcgKnMpOwoKc3RhdGljIHZvaWQKU3RyaW5nRGlzcG9zZSAoU3RyaW5nICpzKTsKCnR5cGVkZWYgc3RydWN0IHsKICAgIFN0cmluZyAgKnRhZzsKICAgIFN0cmluZyAgKnRleHQ7Cn0gUmVwbGFjZTsKCnN0YXRpYyBSZXBsYWNlICoKUmVwbGFjZU5ldyAodm9pZCk7CgpzdGF0aWMgdm9pZApSZXBsYWNlRGlzcG9zZSAoUmVwbGFjZSAqcik7CgpzdGF0aWMgdm9pZApCYWlsIChjaGFyICpmb3JtYXQsIGNoYXIgKmFyZyk7CgpzdGF0aWMgUmVwbGFjZSAqClJlcGxhY2VSZWFkIChGSUxFICpmKTsKCnR5cGVkZWYgc3RydWN0IF9yZXBsYWNlTGlzdCB7CiAgICBzdHJ1Y3QgX3JlcGxhY2VMaXN0CSpuZXh0OwogICAgUmVwbGFjZQkJKnI7Cn0gUmVwbGFjZUxpc3Q7CgpzdGF0aWMgUmVwbGFjZUxpc3QgKgpSZXBsYWNlTGlzdE5ldyAoUmVwbGFjZSAqciwgUmVwbGFjZUxpc3QgKm5leHQpOwoKc3RhdGljIHZvaWQKUmVwbGFjZUxpc3REaXNwb3NlIChSZXBsYWNlTGlzdCAqbCk7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBSZXBsYWNlTGlzdAkqaGVhZDsKfSBSZXBsYWNlU2V0OwoKc3RhdGljIFJlcGxhY2VTZXQgKgpSZXBsYWNlU2V0TmV3ICh2b2lkKTsKCnN0YXRpYyB2b2lkClJlcGxhY2VTZXREaXNwb3NlIChSZXBsYWNlU2V0ICpzKTsKCnN0YXRpYyB2b2lkClJlcGxhY2VTZXRBZGQgKFJlcGxhY2VTZXQgKnMsIFJlcGxhY2UgKnIpOwoKc3RhdGljIFJlcGxhY2UgKgpSZXBsYWNlU2V0RmluZCAoUmVwbGFjZVNldCAqcywgY2hhciAqdGFnKTsKCnN0YXRpYyBSZXBsYWNlU2V0ICoKUmVwbGFjZVNldFJlYWQgKEZJTEUgKmYpOwoKdHlwZWRlZiBzdHJ1Y3QgX3NraXBTdGFjayB7CiAgICBzdHJ1Y3QgX3NraXBTdGFjawkqcHJldjsKICAgIGludAkJCXNraXBwaW5nOwp9IFNraXBTdGFjazsKCnN0YXRpYyBTa2lwU3RhY2sgKgpTa2lwU3RhY2tQdXNoIChTa2lwU3RhY2sgKnByZXYsIGludCBza2lwcGluZyk7CgpzdGF0aWMgU2tpcFN0YWNrICoKU2tpcFN0YWNrUG9wIChTa2lwU3RhY2sgKnByZXYpOwoKdHlwZWRlZiBzdHJ1Y3QgX2xvb3BTdGFjayB7CiAgICBzdHJ1Y3QgX2xvb3BTdGFjawkqcHJldjsKICAgIFN0cmluZwkJKnRhZzsKICAgIFN0cmluZwkJKmV4dHJhOwogICAgbG9uZwkJcG9zOwp9IExvb3BTdGFjazsKCnN0YXRpYyBMb29wU3RhY2sgKgpMb29wU3RhY2tQdXNoIChMb29wU3RhY2sgKnByZXYsIEZJTEUgKmYsIGNoYXIgKnRhZyk7CgpzdGF0aWMgTG9vcFN0YWNrICoKTG9vcFN0YWNrTG9vcCAoUmVwbGFjZVNldCAqcnMsIExvb3BTdGFjayAqbHMsIEZJTEUgKmYpOwoKc3RhdGljIHZvaWQKTGluZVNraXAgKEZJTEUgKmYpOwoKc3RhdGljIHZvaWQKRG9SZXBsYWNlIChGSUxFICpmLCBSZXBsYWNlU2V0ICpzKTsKCiNkZWZpbmUgU1RSSU5HX0lOSVQgMTI4CgpzdGF0aWMgdm9pZCAqCk5ldyAoaW50IHNpemUpCnsKICAgIHZvaWQgICAgKm0gPSBtYWxsb2MgKHNpemUpOwogICAgaWYgKCFtKQoJYWJvcnQgKCk7CiAgICByZXR1cm4gbTsKfQoKc3RhdGljIHZvaWQgKgpSZWFsbG9jYXRlICh2b2lkICpwLCBpbnQgc2l6ZSkKewogICAgdm9pZCAgICAqciA9IHJlYWxsb2MgKHAsIHNpemUpOwoKICAgIGlmICghcikKCWFib3J0ICgpOwogICAgcmV0dXJuIHI7Cn0KCnN0YXRpYyB2b2lkCkRpc3Bvc2UgKHZvaWQgKnApCnsKICAgIGZyZWUgKHApOwp9CgpzdGF0aWMgU3RyaW5nICoKU3RyaW5nTmV3ICh2b2lkKQp7CiAgICBTdHJpbmcgICpzOwoKICAgIHMgPSBOZXcgKHNpemVvZiAoU3RyaW5nKSk7CiAgICBzLT5idWYgPSBOZXcgKFNUUklOR19JTklUKTsKICAgIHMtPnNpemUgPSBTVFJJTkdfSU5JVCAtIDE7CiAgICBzLT5idWZbMF0gPSAnXDAnOwogICAgcy0+bGVuID0gMDsKICAgIHJldHVybiBzOwp9CgpzdGF0aWMgdm9pZApTdHJpbmdBZGQgKFN0cmluZyAqcywgY2hhciBjKQp7CiAgICBpZiAocy0+bGVuID09IHMtPnNpemUpCglzLT5idWYgPSBSZWFsbG9jYXRlIChzLT5idWYsIChzLT5zaXplICo9IDIpICsgMSk7CiAgICBzLT5idWZbcy0+bGVuKytdID0gYzsKICAgIHMtPmJ1ZltzLT5sZW5dID0gJ1wwJzsKfQoKc3RhdGljIHZvaWQKU3RyaW5nQWRkU3RyaW5nIChTdHJpbmcgKnMsIGNoYXIgKmJ1ZikKewogICAgd2hpbGUgKCpidWYpCglTdHJpbmdBZGQgKHMsICpidWYrKyk7Cn0KCnN0YXRpYyBTdHJpbmcgKgpTdHJpbmdNYWtlIChjaGFyICpidWYpCnsKICAgIFN0cmluZyAgKnMgPSBTdHJpbmdOZXcgKCk7CiAgICBTdHJpbmdBZGRTdHJpbmcgKHMsIGJ1Zik7CiAgICByZXR1cm4gczsKfQoKc3RhdGljIHZvaWQKU3RyaW5nRGVsIChTdHJpbmcgKnMpCnsKICAgIGlmIChzLT5sZW4pCglzLT5idWZbLS1zLT5sZW5dID0gJ1wwJzsKfQoKc3RhdGljIHZvaWQKU3RyaW5nUHV0IChGSUxFICpmLCBTdHJpbmcgKnMpCnsKICAgIGNoYXIgICAgKmIgPSBzLT5idWY7CgogICAgd2hpbGUgKCpiKQoJcHV0YyAoKmIrKywgZik7Cn0KCiNkZWZpbmUgU3RyaW5nTGFzdChzKQkoKHMpLT5sZW4gPyAocyktPmJ1ZlsocyktPmxlbiAtIDFdIDogJ1wwJykKCnN0YXRpYyB2b2lkClN0cmluZ0Rpc3Bvc2UgKFN0cmluZyAqcykKewogICAgRGlzcG9zZSAocy0+YnVmKTsKICAgIERpc3Bvc2UgKHMpOwp9CgpzdGF0aWMgUmVwbGFjZSAqClJlcGxhY2VOZXcgKHZvaWQpCnsKICAgIFJlcGxhY2UgKnIgPSBOZXcgKHNpemVvZiAoUmVwbGFjZSkpOwogICAgci0+dGFnID0gU3RyaW5nTmV3ICgpOwogICAgci0+dGV4dCA9IFN0cmluZ05ldyAoKTsKICAgIHJldHVybiByOwp9CgpzdGF0aWMgdm9pZApSZXBsYWNlRGlzcG9zZSAoUmVwbGFjZSAqcikKewogICAgU3RyaW5nRGlzcG9zZSAoci0+dGFnKTsKICAgIFN0cmluZ0Rpc3Bvc2UgKHItPnRleHQpOwogICAgRGlzcG9zZSAocik7Cn0KCnN0YXRpYyB2b2lkCkJhaWwgKGNoYXIgKmZvcm1hdCwgY2hhciAqYXJnKQp7CiAgICBmcHJpbnRmIChzdGRlcnIsICJmYXRhbDogIik7CiAgICBmcHJpbnRmIChzdGRlcnIsIGZvcm1hdCwgYXJnKTsKICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7CiAgICBleGl0ICgxKTsKfQoKc3RhdGljIFJlcGxhY2UgKgpSZXBsYWNlUmVhZCAoRklMRSAqZikKewogICAgaW50CSAgICBjOwogICAgUmVwbGFjZSAqcjsKCiAgICB3aGlsZSAoKGMgPSBnZXRjIChmKSkgIT0gJ0AnKQogICAgewoJaWYgKGMgPT0gRU9GKQoJICAgIHJldHVybiAwOwogICAgfQogICAgciA9IFJlcGxhY2VOZXcoKTsKICAgIHdoaWxlICgoYyA9IGdldGMgKGYpKSAhPSAnQCcpCiAgICB7CglpZiAoYyA9PSBFT0YpCgl7CgkgICAgUmVwbGFjZURpc3Bvc2UgKHIpOwoJICAgIHJldHVybiAwOwoJfQoJaWYgKGlzc3BhY2UgKGMpKQoJICAgIEJhaWwgKCJpbnZhbGlkIGNoYXJhY3RlciBhZnRlciB0YWcgJXMiLCByLT50YWctPmJ1Zik7CglTdHJpbmdBZGQgKHItPnRhZywgYyk7CiAgICB9CiAgICBpZiAoci0+dGFnLT5idWZbMF0gPT0gJ1wwJykKICAgIHsKCVJlcGxhY2VEaXNwb3NlIChyKTsKCXJldHVybiAwOwogICAgfQogICAgd2hpbGUgKGlzc3BhY2UgKChjID0gZ2V0YyAoZikpKSkKCTsKICAgIHVuZ2V0YyAoYywgZik7CiAgICB3aGlsZSAoKGMgPSBnZXRjIChmKSkgIT0gJ0AnICYmIGMgIT0gRU9GKQoJU3RyaW5nQWRkIChyLT50ZXh0LCBjKTsKICAgIGlmIChjID09ICdAJykKCXVuZ2V0YyAoYywgZik7CiAgICB3aGlsZSAoaXNzcGFjZSAoU3RyaW5nTGFzdCAoci0+dGV4dCkpKQoJU3RyaW5nRGVsIChyLT50ZXh0KTsKICAgIHJldHVybiByOwp9CgpzdGF0aWMgUmVwbGFjZUxpc3QgKgpSZXBsYWNlTGlzdE5ldyAoUmVwbGFjZSAqciwgUmVwbGFjZUxpc3QgKm5leHQpCnsKICAgIFJlcGxhY2VMaXN0CSpsID0gTmV3IChzaXplb2YgKFJlcGxhY2VMaXN0KSk7CiAgICBsLT5yID0gcjsKICAgIGwtPm5leHQgPSBuZXh0OwogICAgcmV0dXJuIGw7Cn0KCnN0YXRpYyB2b2lkClJlcGxhY2VMaXN0RGlzcG9zZSAoUmVwbGFjZUxpc3QgKmwpCnsKICAgIGlmIChsKQogICAgewoJUmVwbGFjZUxpc3REaXNwb3NlIChsLT5uZXh0KTsKCVJlcGxhY2VEaXNwb3NlIChsLT5yKTsKCURpc3Bvc2UgKGwpOwogICAgfQp9CgpzdGF0aWMgUmVwbGFjZVNldCAqClJlcGxhY2VTZXROZXcgKHZvaWQpCnsKICAgIFJlcGxhY2VTZXQJKnMgPSBOZXcgKHNpemVvZiAoUmVwbGFjZVNldCkpOwogICAgcy0+aGVhZCA9IDA7CiAgICByZXR1cm4gczsKfQoKc3RhdGljIHZvaWQKUmVwbGFjZVNldERpc3Bvc2UgKFJlcGxhY2VTZXQgKnMpCnsKICAgIFJlcGxhY2VMaXN0RGlzcG9zZSAocy0+aGVhZCk7CiAgICBEaXNwb3NlIChzKTsKfQoKc3RhdGljIHZvaWQKUmVwbGFjZVNldEFkZCAoUmVwbGFjZVNldCAqcywgUmVwbGFjZSAqcikKewogICAgcy0+aGVhZCA9IFJlcGxhY2VMaXN0TmV3IChyLCBzLT5oZWFkKTsKfQoKc3RhdGljIFJlcGxhY2UgKgpSZXBsYWNlU2V0RmluZCAoUmVwbGFjZVNldCAqcywgY2hhciAqdGFnKQp7CiAgICBSZXBsYWNlTGlzdAkqbDsKCiAgICBmb3IgKGwgPSBzLT5oZWFkOyBsOyBsID0gbC0+bmV4dCkKCWlmICghc3RyY21wICh0YWcsIGwtPnItPnRhZy0+YnVmKSkKCSAgICByZXR1cm4gbC0+cjsKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgUmVwbGFjZVNldCAqClJlcGxhY2VTZXRSZWFkIChGSUxFICpmKQp7CiAgICBSZXBsYWNlU2V0CSpzID0gUmVwbGFjZVNldE5ldyAoKTsKICAgIFJlcGxhY2UJKnI7CgogICAgd2hpbGUgKChyID0gUmVwbGFjZVJlYWQgKGYpKSkKICAgIHsKCXdoaWxlIChSZXBsYWNlU2V0RmluZCAocywgci0+dGFnLT5idWYpKQoJICAgIFN0cmluZ0FkZCAoci0+dGFnLCAnKycpOwoJUmVwbGFjZVNldEFkZCAocywgcik7CiAgICB9CiAgICBpZiAoIXMtPmhlYWQpCiAgICB7CglSZXBsYWNlU2V0RGlzcG9zZSAocyk7CglzID0gMDsKICAgIH0KICAgIHJldHVybiBzOwp9CgpzdGF0aWMgU2tpcFN0YWNrICoKU2tpcFN0YWNrUHVzaCAoU2tpcFN0YWNrICpwcmV2LCBpbnQgc2tpcHBpbmcpCnsKICAgIFNraXBTdGFjawkqc3MgPSBOZXcgKHNpemVvZiAoU2tpcFN0YWNrKSk7CiAgICBzcy0+cHJldiA9IHByZXY7CiAgICBzcy0+c2tpcHBpbmcgPSBza2lwcGluZzsKICAgIHJldHVybiBzczsKfQoKc3RhdGljIFNraXBTdGFjayAqClNraXBTdGFja1BvcCAoU2tpcFN0YWNrICpwcmV2KQp7CiAgICBTa2lwU3RhY2sJKnNzID0gcHJldi0+cHJldjsKICAgIERpc3Bvc2UgKHByZXYpOwogICAgcmV0dXJuIHNzOwp9CgpzdGF0aWMgTG9vcFN0YWNrICoKTG9vcFN0YWNrUHVzaCAoTG9vcFN0YWNrICpwcmV2LCBGSUxFICpmLCBjaGFyICp0YWcpCnsKICAgIExvb3BTdGFjawkqbHMgPSBOZXcgKHNpemVvZiAoTG9vcFN0YWNrKSk7CiAgICBscy0+cHJldiA9IHByZXY7CiAgICBscy0+dGFnID0gU3RyaW5nTWFrZSAodGFnKTsKICAgIGxzLT5leHRyYSA9IFN0cmluZ05ldyAoKTsKICAgIGxzLT5wb3MgPSBmdGVsbCAoZik7CiAgICByZXR1cm4gbHM7Cn0KCnN0YXRpYyBMb29wU3RhY2sgKgpMb29wU3RhY2tMb29wIChSZXBsYWNlU2V0ICpycywgTG9vcFN0YWNrICpscywgRklMRSAqZikKewogICAgU3RyaW5nCSpzID0gU3RyaW5nTWFrZSAobHMtPnRhZy0+YnVmKTsKICAgIExvb3BTdGFjawkqcmV0ID0gbHM7CiAgICBCb29sCWxvb3A7CgogICAgU3RyaW5nQWRkIChscy0+ZXh0cmEsICcrJyk7CiAgICBTdHJpbmdBZGRTdHJpbmcgKHMsIGxzLT5leHRyYS0+YnVmKTsKICAgIGxvb3AgPSBSZXBsYWNlU2V0RmluZCAocnMsIHMtPmJ1ZikgIT0gMDsKICAgIFN0cmluZ0Rpc3Bvc2UgKHMpOwogICAgaWYgKGxvb3ApCglmc2VlayAoZiwgbHMtPnBvcywgU0VFS19TRVQpOwogICAgZWxzZQogICAgewoJcmV0ID0gbHMtPnByZXY7CglTdHJpbmdEaXNwb3NlIChscy0+dGFnKTsKCVN0cmluZ0Rpc3Bvc2UgKGxzLT5leHRyYSk7CglEaXNwb3NlIChscyk7CiAgICB9CiAgICByZXR1cm4gcmV0Owp9CgpzdGF0aWMgdm9pZApMaW5lU2tpcCAoRklMRSAqZikKewogICAgaW50CWM7CgogICAgd2hpbGUgKChjID0gZ2V0YyAoZikpID09ICdcbicpCgk7CiAgICB1bmdldGMgKGMsIGYpOwp9CgpzdGF0aWMgdm9pZApEb1JlcGxhY2UgKEZJTEUgKmYsIFJlcGxhY2VTZXQgKnMpCnsKICAgIGludAkJYzsKICAgIFN0cmluZwkqdGFnOwogICAgUmVwbGFjZQkqcjsKICAgIFNraXBTdGFjawkqc3MgPSAwOwogICAgTG9vcFN0YWNrCSpscyA9IDA7CiAgICBpbnQJCXNraXBwaW5nID0gMDsKCiAgICB3aGlsZSAoKGMgPSBnZXRjIChmKSkgIT0gRU9GKQogICAgewoJaWYgKGMgPT0gJ0AnKQoJewoJICAgIHRhZyA9IFN0cmluZ05ldyAoKTsKCSAgICB3aGlsZSAoKGMgPSBnZXRjIChmKSkgIT0gJ0AnKQoJICAgIHsKCQlpZiAoYyA9PSBFT0YpCgkJICAgIGFib3J0ICgpOwoJCVN0cmluZ0FkZCAodGFnLCBjKTsKCSAgICB9CgkgICAgaWYgKGxzKQoJCVN0cmluZ0FkZFN0cmluZyAodGFnLCBscy0+ZXh0cmEtPmJ1Zik7CgkgICAgc3dpdGNoICh0YWctPmJ1ZlswXSkgewoJICAgIGNhc2UgJz8nOgoJCXNzID0gU2tpcFN0YWNrUHVzaCAoc3MsIHNraXBwaW5nKTsKCQlpZiAoIVJlcGxhY2VTZXRGaW5kIChzLCB0YWctPmJ1ZiArIDEpKQoJCSAgICBza2lwcGluZysrOwoJCUxpbmVTa2lwIChmKTsKCQlicmVhazsKCSAgICBjYXNlICc6JzoKCQlpZiAoIXNzKQoJCSAgICBhYm9ydCAoKTsKCQlpZiAoc3MtPnNraXBwaW5nID09IHNraXBwaW5nKQoJCSAgICArK3NraXBwaW5nOwoJCWVsc2UKCQkgICAgLS1za2lwcGluZzsKCQlMaW5lU2tpcCAoZik7CgkJYnJlYWs7CgkgICAgY2FzZSAnOyc6CgkJc2tpcHBpbmcgPSBzcy0+c2tpcHBpbmc7CgkJc3MgPSBTa2lwU3RhY2tQb3AgKHNzKTsKCQlMaW5lU2tpcCAoZik7CgkJYnJlYWs7CgkgICAgY2FzZSAneyc6CgkJbHMgPSBMb29wU3RhY2tQdXNoIChscywgZiwgdGFnLT5idWYgKyAxKTsKCQlMaW5lU2tpcCAoZik7CgkJYnJlYWs7CgkgICAgY2FzZSAnfSc6CgkJbHMgPSBMb29wU3RhY2tMb29wIChzLCBscywgZik7CgkJTGluZVNraXAgKGYpOwoJCWJyZWFrOwoJICAgIGRlZmF1bHQ6CgkJciA9IFJlcGxhY2VTZXRGaW5kIChzLCB0YWctPmJ1Zik7CgkJaWYgKHIgJiYgIXNraXBwaW5nKQoJCSAgICBTdHJpbmdQdXQgKHN0ZG91dCwgci0+dGV4dCk7CgkJYnJlYWs7CgkgICAgfQoJICAgIFN0cmluZ0Rpc3Bvc2UgKHRhZyk7Cgl9CgllbHNlIGlmICghc2tpcHBpbmcpCgkgICAgcHV0Y2hhciAoYyk7CiAgICB9Cn0KCmludAptYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKICAgIEZJTEUJKmY7CiAgICBSZXBsYWNlU2V0CSpzOwoKICAgIGlmICghYXJndlsxXSkKCUJhaWwgKCJ1c2FnZTogJXMgPHRlbXBsYXRlLnNnbWw+IiwgYXJndlswXSk7CiAgICBmID0gZm9wZW4gKGFyZ3ZbMV0sICJyIik7CiAgICBpZiAoIWYpCiAgICB7CglCYWlsICgiY2FuJ3Qgb3BlbiBmaWxlICVzIiwgYXJndlsxXSk7CglleGl0ICgxKTsKICAgIH0KICAgIHdoaWxlICgocyA9IFJlcGxhY2VTZXRSZWFkIChzdGRpbikpKQogICAgewoJRG9SZXBsYWNlIChmLCBzKTsKCVJlcGxhY2VTZXREaXNwb3NlIChzKTsKCXJld2luZCAoZik7CiAgICB9CiAgICBpZiAoZmVycm9yIChzdGRvdXQpKQoJQmFpbCAoIiVzIiwgImVycm9yIHdyaXRpbmcgb3V0cHV0Iik7CiAgICBleGl0ICgwKTsKfQo=