LyogSW1wbGVtZW50YXRpb24gb2YgdGhlIFRSQU5TUE9TRSBpbnRyaW5zaWMKICAgQ29weXJpZ2h0IDIwMDMsIDIwMDYsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgIENvbnRyaWJ1dGVkIGJ5IFRvYmlhcyBTY2hs/HRlcgoKVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBGb3J0cmFuIDk1IHJ1bnRpbWUgbGlicmFyeSAobGliZ2ZvcnRyYW4pLgoKTGliZ2ZvcnRyYW4gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCm1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwpMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKSW4gYWRkaXRpb24gdG8gdGhlIHBlcm1pc3Npb25zIGluIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdGhlCkZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcyB5b3UgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gbGluayB0aGUKY29tcGlsZWQgdmVyc2lvbiBvZiB0aGlzIGZpbGUgaW50byBjb21iaW5hdGlvbnMgd2l0aCBvdGhlciBwcm9ncmFtcywKYW5kIHRvIGRpc3RyaWJ1dGUgdGhvc2UgY29tYmluYXRpb25zIHdpdGhvdXQgYW55IHJlc3RyaWN0aW9uIGNvbWluZwpmcm9tIHRoZSB1c2Ugb2YgdGhpcyBmaWxlLiAgKFRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHJlc3RyaWN0aW9ucwpkbyBhcHBseSBpbiBvdGhlciByZXNwZWN0czsgZm9yIGV4YW1wbGUsIHRoZXkgY292ZXIgbW9kaWZpY2F0aW9uIG9mCnRoZSBmaWxlLCBhbmQgZGlzdHJpYnV0aW9uIHdoZW4gbm90IGxpbmtlZCBpbnRvIGEgY29tYmluZQpleGVjdXRhYmxlLikKCkxpYmdmb3J0cmFuIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCmJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCk1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwpMaWNlbnNlIGFsb25nIHdpdGggbGliZ2ZvcnRyYW47IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LAp3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLApCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4gICovCgojaW5jbHVkZSAibGliZ2ZvcnRyYW4uaCIKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxhc3NlcnQuaD4KCmV4dGVybiB2b2lkIHRyYW5zcG9zZSAoZ2ZjX2FycmF5X2NoYXIgKiwgZ2ZjX2FycmF5X2NoYXIgKik7CmV4cG9ydF9wcm90byh0cmFuc3Bvc2UpOwoKc3RhdGljIHZvaWQKdHJhbnNwb3NlX2ludGVybmFsIChnZmNfYXJyYXlfY2hhciAqcmV0LCBnZmNfYXJyYXlfY2hhciAqc291cmNlLAoJCSAgICBpbmRleF90eXBlIHNpemUpCnsKICAvKiByLiogaW5kaWNhdGVzIHRoZSByZXR1cm4gYXJyYXkuICAqLwogIGluZGV4X3R5cGUgcnhzdHJpZGUsIHJ5c3RyaWRlOwogIGNoYXIgKnJwdHI7CiAgLyogcy4qIGluZGljYXRlcyB0aGUgc291cmNlIGFycmF5LiAgKi8KICBpbmRleF90eXBlIHN4c3RyaWRlLCBzeXN0cmlkZTsKICBjb25zdCBjaGFyICpzcHRyOwoKICBpbmRleF90eXBlIHhjb3VudCwgeWNvdW50OwogIGluZGV4X3R5cGUgeCwgeTsKCiAgYXNzZXJ0IChHRkNfREVTQ1JJUFRPUl9SQU5LIChzb3VyY2UpID09IDIKICAgICAgICAgICYmIEdGQ19ERVNDUklQVE9SX1JBTksgKHJldCkgPT0gMik7CgogIGlmIChyZXQtPmRhdGEgPT0gTlVMTCkKICAgIHsKICAgICAgYXNzZXJ0IChyZXQtPmR0eXBlID09IHNvdXJjZS0+ZHR5cGUpOwoKICAgICAgcmV0LT5kaW1bMF0ubGJvdW5kID0gMDsKICAgICAgcmV0LT5kaW1bMF0udWJvdW5kID0gc291cmNlLT5kaW1bMV0udWJvdW5kIC0gc291cmNlLT5kaW1bMV0ubGJvdW5kOwogICAgICByZXQtPmRpbVswXS5zdHJpZGUgPSAxOwoKICAgICAgcmV0LT5kaW1bMV0ubGJvdW5kID0gMDsKICAgICAgcmV0LT5kaW1bMV0udWJvdW5kID0gc291cmNlLT5kaW1bMF0udWJvdW5kIC0gc291cmNlLT5kaW1bMF0ubGJvdW5kOwogICAgICByZXQtPmRpbVsxXS5zdHJpZGUgPSByZXQtPmRpbVswXS51Ym91bmQrMTsKCiAgICAgIHJldC0+ZGF0YSA9IGludGVybmFsX21hbGxvY19zaXplIChzaXplICogc2l6ZTAgKChhcnJheV90KilyZXQpKTsKICAgICAgcmV0LT5vZmZzZXQgPSAwOwogICAgfQoKICBzeHN0cmlkZSA9IHNvdXJjZS0+ZGltWzBdLnN0cmlkZSAqIHNpemU7CiAgc3lzdHJpZGUgPSBzb3VyY2UtPmRpbVsxXS5zdHJpZGUgKiBzaXplOwogIHhjb3VudCA9IHNvdXJjZS0+ZGltWzBdLnVib3VuZCArIDEgLSBzb3VyY2UtPmRpbVswXS5sYm91bmQ7CiAgeWNvdW50ID0gc291cmNlLT5kaW1bMV0udWJvdW5kICsgMSAtIHNvdXJjZS0+ZGltWzFdLmxib3VuZDsKCiAgcnhzdHJpZGUgPSByZXQtPmRpbVswXS5zdHJpZGUgKiBzaXplOwogIHJ5c3RyaWRlID0gcmV0LT5kaW1bMV0uc3RyaWRlICogc2l6ZTsKCiAgcnB0ciA9IHJldC0+ZGF0YTsKICBzcHRyID0gc291cmNlLT5kYXRhOwoKICBmb3IgKHkgPSAwOyB5IDwgeWNvdW50OyB5KyspCiAgICB7CiAgICAgIGZvciAoeCA9IDA7IHggPCB4Y291bnQ7IHgrKykKICAgICAgICB7CiAgICAgICAgICBtZW1jcHkgKHJwdHIsIHNwdHIsIHNpemUpOwoKICAgICAgICAgIHNwdHIgKz0gc3hzdHJpZGU7CiAgICAgICAgICBycHRyICs9IHJ5c3RyaWRlOwogICAgICAgIH0KICAgICAgc3B0ciArPSBzeXN0cmlkZSAtIChzeHN0cmlkZSAqIHhjb3VudCk7CiAgICAgIHJwdHIgKz0gcnhzdHJpZGUgLSAocnlzdHJpZGUgKiB4Y291bnQpOwogICAgfQp9CgpleHRlcm4gdm9pZCB0cmFuc3Bvc2UgKGdmY19hcnJheV9jaGFyICosIGdmY19hcnJheV9jaGFyICopOwpleHBvcnRfcHJvdG8odHJhbnNwb3NlKTsKCnZvaWQKdHJhbnNwb3NlIChnZmNfYXJyYXlfY2hhciAqcmV0LCBnZmNfYXJyYXlfY2hhciAqc291cmNlKQp7CiAgdHJhbnNwb3NlX2ludGVybmFsIChyZXQsIHNvdXJjZSwgR0ZDX0RFU0NSSVBUT1JfU0laRSAoc291cmNlKSk7Cn0KCmV4dGVybiB2b2lkIHRyYW5zcG9zZV9jaGFyIChnZmNfYXJyYXlfY2hhciAqLCBHRkNfSU5URUdFUl80LAoJCQkgICAgZ2ZjX2FycmF5X2NoYXIgKiwgR0ZDX0lOVEVHRVJfNCk7CmV4cG9ydF9wcm90byh0cmFuc3Bvc2VfY2hhcik7Cgp2b2lkCnRyYW5zcG9zZV9jaGFyIChnZmNfYXJyYXlfY2hhciAqcmV0LAoJCUdGQ19JTlRFR0VSXzQgcmV0X2xlbmd0aCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKCQlnZmNfYXJyYXlfY2hhciAqc291cmNlLCBHRkNfSU5URUdFUl80IHNvdXJjZV9sZW5ndGgpCnsKICB0cmFuc3Bvc2VfaW50ZXJuYWwgKHJldCwgc291cmNlLCBzb3VyY2VfbGVuZ3RoKTsKfQo=