LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIENvcHlyaWdodCCpIHsxOTk2LTE5OTl9LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKi8KCiNpZm5kZWYgVU1TR19ICiNkZWZpbmUgVU1TR19ICgojaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKI2luY2x1ZGUgPHN0ZGFyZy5oPgovKioKICogQG5hbWUgTWVzc2FnZSBGb3JtYXQgQyBBUEkKICoKICogUHJvdmlkZXMgbWVhbnMgdG8gcHJvZHVjZSBjb25jYXRlbmF0ZWQgbWVzc2FnZXMgaW4gbGFuZ3VhZ2UtbmV1dHJhbCB3YXkuCiAqIFVzZSB0aGlzIGZvciBhbGwgY29uY2F0ZW5hdGlvbnMgdGhhdCBzaG93IHVwIHRvIGVuZCB1c2Vycy4KICogPFA+CiAqIFRha2VzIGEgc2V0IG9mIG9iamVjdHMsIGZvcm1hdHMgdGhlbSwgdGhlbiBpbnNlcnRzIHRoZSBmb3JtYXR0ZWQKICogc3RyaW5ncyBpbnRvIHRoZSBwYXR0ZXJuIGF0IHRoZSBhcHByb3ByaWF0ZSBwbGFjZXMuCiAqIDxQPgogKiBIZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIHVzYWdlOgogKiBFeGFtcGxlIDE6CiAqIDxwcmU+CiAqIC4gICAgVUNoYXIgKnJlc3VsdCwgKnR6SUQsICpzdHI7CiAqIC4gICAgVUNoYXIgcGF0dGVyblsxMDBdOwogKiAuICAgIHRfaW50MzIgcmVzdWx0TGVuZ3RoT3V0LCByZXN1bHRsZW5ndGg7CiAqIC4gICAgVUNhbGVuZGFyICpjYWw7CiAqIC4gICAgVURhdGUgZDE7CiAqIC4gICAgVURhdGVGb3JtYXQgKmRlZjE7CiAqIC4gICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CiAqIC4gICAgc3RyPShVQ2hhciopbWFsbG9jKHNpemVvZihVQ2hhcikgKiAoc3RybGVuKCJkaXN0dXJiYW5jZSBpbiBmb3JjZSIpICsxKSk7CiAqIC4gICAgdV91YXN0cmNweShzdHIsICJkaXN0dXJiYW5jZSBpbiBmb3JjZSIpOwogKiAuICAgIHR6SUQ9KFVDaGFyKiltYWxsb2Moc2l6ZW9mKFVDaGFyKSAqIDQpOwogKiAuICAgIHVfdWFzdHJjcHkodHpJRCwgIlBTVCIpOwogKiAuICAgIGNhbD11Y2FsX29wZW4odHpJRCwgdV9zdHJsZW4odHpJRCksICJlbl9VUyIsIFVDQUxfVFJBRElUSU9OQUwsICZzdGF0dXMpOwogKiAuICAgIHVjYWxfc2V0RGF0ZVRpbWUoY2FsLCAxOTk5LCBVQ0FMX01BUkNILCAxOCwgMCwgMCwgMCwgJnN0YXR1cyk7CiAqIC4gICAgZDE9dWNhbF9nZXRNaWxsaXMoY2FsLCAmc3RhdHVzKTsKICogLiAgICB1X3Vhc3RyY3B5KHBhdHRlcm4sICJPbiB7MCwgZGF0ZSwgbG9uZ30sIHRoZXJlIHdhcyBhIHsxfSBvbiBwbGFuZXQgezIsbnVtYmVyLGludGVnZXJ9Iik7CiAqIC4gICAgcmVzdWx0bGVuZ3RoPTA7CiAqIC4gICAgcmVzdWx0TGVuZ3RoT3V0PXVfZm9ybWF0TWVzc2FnZSggImVuX1VTIiwgcGF0dGVybiwgdV9zdHJsZW4ocGF0dGVybiksIE5VTEwsIHJlc3VsdGxlbmd0aCwgJnN0YXR1cywgZDEsIHN0ciwgNyk7CiAqIC4gICAgaWYoc3RhdHVzPT1VX0JVRkZFUl9PVkVSRkxPV19FUlJPUil7CiAqIC4gICAgICAgIHN0YXR1cz1VX1pFUk9fRVJST1I7CiAqIC4gICAgICAgIHJlc3VsdGxlbmd0aD1yZXN1bHRMZW5ndGhPdXQrMTsKICogLiAgICAgICAgcmVzdWx0PShVQ2hhciopcmVhbGxvYyhyZXN1bHQsIHNpemVvZihVQ2hhcikgKiByZXN1bHRsZW5ndGgpOwogKiAuICAgICAgICB1X2Zvcm1hdE1lc3NhZ2UoICJlbl9VUyIsIHBhdHRlcm4sIHVfc3RybGVuKHBhdHRlcm4pLCByZXN1bHQsIHJlc3VsdGxlbmd0aCwgJnN0YXR1cywgZDEsIHN0ciwgNyk7CiAqIC4gICAgfQogKiAuICAgIHByaW50ZigiJXNcbiIsIGF1c3RyZHVwKHJlc3VsdCkgKTsvL2F1c3RyZHVwKCBhIGZ1bmN0aW9uIHVzZWQgdG8gY29udmVydCBVQ2hhciogdG8gY2hhciopCiAqIC4gICAgLy9vdXRwdXQ+OiAiT24gTWFyY2ggMTgsIDE5OTksIHRoZXJlIHdhcyBhIGRpc3R1cmJhbmNlIGluIGZvcmNlIG9uIHBsYW5ldCA3CiAqIDwvcHJlPiAgCiAqIFR5cGljYWxseSwgdGhlIG1lc3NhZ2UgZm9ybWF0IHdpbGwgY29tZSBmcm9tIHJlc291cmNlcywgYW5kIHRoZQogKiBhcmd1bWVudHMgd2lsbCBiZSBkeW5hbWljYWxseSBzZXQgYXQgcnVudGltZS4KICogPFA+CiAqIEV4YW1wbGUgMjoKICogPHByZT4KICogLiAgICBVQ2hhciogc3RyOwogKiAuICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogKiAuICAgIFVDaGFyICpyZXN1bHQ7CiAqIC4gICAgVUNoYXIgcGF0dGVyblsxMDBdOwogKiAuICAgIHRfaW50MzIgcmVzdWx0bGVuZ3RoLHJlc3VsdExlbmd0aE91dCwgaTsKICogLiAgICBkb3VibGUgdGVzdEFyZ3M9IHsgMTAwLjAsIDEuMCwgMC4wfTsKICogLiAgICBzdHI9KFVDaGFyKiltYWxsb2Moc2l6ZW9mKFVDaGFyKSAqIDEwKTsKICogLiAgICB1X3Vhc3RyY3B5KHN0ciwgIk15RGlzayIpOwogKiAuICAgIHVfdWFzdHJjcHkocGF0dGVybiwgIlRoZSBkaXNrIHsxfSBjb250YWlucyB7MCxjaG9pY2UsMCNubyBmaWxlc3wxI29uZSBmaWxlfDE8ezAsbnVtYmVyLGludGVnZXJ9IGZpbGVzfSIpOwogKiAuICAgIGZvcihpPTA7IGk8MzsgaSsrKXsKICogLiAgICAgIHJlc3VsdGxlbmd0aD0wOwogKiAuICAgIHJlc3VsdExlbmd0aE91dD11X2Zvcm1hdE1lc3NhZ2UoICJlbl9VUyIsIHBhdHRlcm4sIHVfc3RybGVuKHBhdHRlcm4pLCBOVUxMLCByZXN1bHRsZW5ndGgsICZzdGF0dXMsIHRlc3RBcmdzW2ldLCBzdHIpOwogKiAuICAgIGlmKHN0YXR1cz09VV9CVUZGRVJfT1ZFUkZMT1dfRVJST1IpewogKiAuICAgICAgICBzdGF0dXM9VV9aRVJPX0VSUk9SOwogKiAuICAgICAgICByZXN1bHRsZW5ndGg9cmVzdWx0TGVuZ3RoT3V0KzE7CiAqIC4gICAgICAgIHJlc3VsdD0oVUNoYXIqKW1hbGxvYyhzaXplb2YoVUNoYXIpICogcmVzdWx0bGVuZ3RoKTsKICogLiAgICAgICAgdV9mb3JtYXRNZXNzYWdlKCAiZW5fVVMiLCBwYXR0ZXJuLCB1X3N0cmxlbihwYXR0ZXJuKSwgcmVzdWx0LCByZXN1bHRsZW5ndGgsICZzdGF0dXMsIHRlc3RBcmdzW2ldLCBzdHIpOwogKiAuICAgIH0KICogLiAgICBwcmludGYoIiVzXG4iLCBhdXN0cmR1cChyZXN1bHQpICk7ICAvL2F1c3RyZHVwKCBhIGZ1bmN0aW9uIHVzZWQgdG8gY29udmVydCBVQ2hhciogdG8gY2hhciopCiAqIC4gICAgZnJlZShyZXN1bHQpOwogKiAuICAgIH0KICogLiAgICAvLyBvdXRwdXQsIHdpdGggZGlmZmVyZW50IHRlc3RBcmdzOgogKiAuICAgIC8vIG91dHB1dDogVGhlIGRpc2sgIk15RGlzayIgY29udGFpbnMgMTAwIGZpbGVzLgogKiAuICAgIC8vIG91dHB1dDogVGhlIGRpc2sgIk15RGlzayIgY29udGFpbnMgb25lIGZpbGUuCiAqIC4gICAgLy8gb3V0cHV0OiBUaGUgZGlzayAiTXlEaXNrIiBjb250YWlucyBubyBmaWxlcy4KICogIDwvcHJlPgogKgogKiAgVGhlIHBhdHRlcm4gaXMgb2YgdGhlIGZvbGxvd2luZyBmb3JtLiAgTGVnZW5kOgogKiAgPHByZT4KICogLiAgICAgIHtvcHRpb25hbCBpdGVtfQogKiAuICAgICAgKGdyb3VwIHRoYXQgbWF5IGJlIHJlcGVhdGVkKSoKICogIDwvcHJlPgogKiAgRG8gbm90IGNvbmZ1c2Ugb3B0aW9uYWwgaXRlbXMgd2l0aCBpdGVtcyBpbnNpZGUgcXVvdGVzIGJyYWNlcywgc3VjaAogKiAgYXMgdGhpczogInsiLiAgUXVvdGVkIGJyYWNlcyBhcmUgbGl0ZXJhbHMuCiAqICA8cHJlPgogKiAuICAgICAgbWVzc2FnZUZvcm1hdFBhdHRlcm4gOj0gc3RyaW5nICggInsiIG1lc3NhZ2VGb3JtYXRFbGVtZW50ICJ9IiBzdHJpbmcgKSoKICogLiAgICAgICAKICogLiAgICAgIG1lc3NhZ2VGb3JtYXRFbGVtZW50IDo9IGFyZ3VtZW50IHsgIiwiIGVsZW1lbnRGb3JtYXQgfQogKiAuICAgICAgIAogKiAuICAgICAgZWxlbWVudEZvcm1hdCA6PSAidGltZSIgeyAiLCIgZGF0ZXRpbWVTdHlsZSB9CiAqIC4gICAgICAgICAgICAgICAgICAgICB8ICJkYXRlIiB7ICIsIiBkYXRldGltZVN0eWxlIH0KICogLiAgICAgICAgICAgICAgICAgICAgIHwgIm51bWJlciIgeyAiLCIgbnVtYmVyU3R5bGUgfQogKiAuICAgICAgICAgICAgICAgICAgICAgfCAiY2hvaWNlIiAiLCIgY2hvaWNlU3R5bGUKICogLiAgCiAqIC4gICAgICBkYXRldGltZVN0eWxlIDo9ICJzaG9ydCIKICogLiAgICAgICAgICAgICAgICAgICAgIHwgIm1lZGl1bSIKICogLiAgICAgICAgICAgICAgICAgICAgIHwgImxvbmciCiAqIC4gICAgICAgICAgICAgICAgICAgICB8ICJmdWxsIgogKiAuICAgICAgICAgICAgICAgICAgICAgfCBkYXRlRm9ybWF0UGF0dGVybgogKiAuCiAqIC4gICAgICBudW1iZXJTdHlsZSA6PSAgICJjdXJyZW5jeSIKICogLiAgICAgICAgICAgICAgICAgICAgIHwgInBlcmNlbnQiCiAqIC4gICAgICAgICAgICAgICAgICAgICB8ICJpbnRlZ2VyIgogKiAuICAgICAgICAgICAgICAgICAgICAgfCBudW1iZXJGb3JtYXRQYXR0ZXJuCiAqIC4gCiAqIC4gICAgICBjaG9pY2VTdHlsZSA6PSAgIGNob2ljZUZvcm1hdFBhdHRlcm4KICogPC9wcmU+CiAqIElmIHRoZXJlIGlzIG5vIGVsZW1lbnRGb3JtYXQsIHRoZW4gdGhlIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsCiAqIHdoaWNoIGlzIHN1YnN0aXR1dGVkLiBJZiB0aGVyZSBpcyBubyBkYXRlVGltZVN0eWxlIG9yIG51bWJlclN0eWxlLAogKiB0aGVuIHRoZSBkZWZhdWx0IGZvcm1hdCBpcyB1c2VkIChlLmcuICBOdW1iZXJGb3JtYXQuZ2V0SW5zdGFuY2UoKSwKICogRGF0ZUZvcm1hdC5nZXREZWZhdWx0VGltZSgpIG9yIERhdGVGb3JtYXQuZ2V0RGVmYXVsdERhdGUoKS4gRm9yCiAqIGEgQ2hvaWNlRm9ybWF0LCB0aGUgcGF0dGVybiBtdXN0IGFsd2F5cyBiZSBzcGVjaWZpZWQsIHNpbmNlIHRoZXJlCiAqIGlzIG5vIGRlZmF1bHQuCiAqIDxQPgogKiBJbiBzdHJpbmdzLCBzaW5nbGUgcXVvdGVzIGNhbiBiZSB1c2VkIHRvIHF1b3RlIHRoZSAieyIgc2lnbiBpZgogKiBuZWNlc3NhcnkuIEEgcmVhbCBzaW5nbGUgcXVvdGUgaXMgcmVwcmVzZW50ZWQgYnkgJycuICBJbnNpZGUgYQogKiBtZXNzYWdlRm9ybWF0RWxlbWVudCwgcXVvdGVzIGFyZSBbbm90XSByZW1vdmVkLiBGb3IgZXhhbXBsZSwKICogezEsbnVtYmVyLCQnIycsIyN9IHdpbGwgcHJvZHVjZSBhIG51bWJlciBmb3JtYXQgd2l0aCB0aGUgcG91bmQtc2lnbgogKiBxdW90ZWQsIHdpdGggYSByZXN1bHQgc3VjaCBhczogIiQjMzEsNDUiLgogKiA8UD4KICogSWYgYSBwYXR0ZXJuIGlzIHVzZWQsIHRoZW4gdW5xdW90ZWQgYnJhY2VzIGluIHRoZSBwYXR0ZXJuLCBpZiBhbnksCiAqIG11c3QgbWF0Y2g6IHRoYXQgaXMsICJhYiB7MH0gZGUiIGFuZCAiYWIgJ30nIGRlIiBhcmUgb2ssIGJ1dCAiYWIKICogezAnfScgZGUiIGFuZCAiYWIgfSBkZSIgYXJlIG5vdC4KICogPFA+CiAqIFRoZSBhcmd1bWVudCBpcyBhIG51bWJlciBmcm9tIDAgdG8gOSwgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlCiAqIGFyZ3VtZW50cyBwcmVzZW50ZWQgaW4gYW4gYXJyYXkgdG8gYmUgZm9ybWF0dGVkLgogKiA8UD4KICogSXQgaXMgb2sgdG8gaGF2ZSB1bnVzZWQgYXJndW1lbnRzIGluIHRoZSBhcnJheS4gIFdpdGggbWlzc2luZwogKiBhcmd1bWVudHMgb3IgYXJndW1lbnRzIHRoYXQgYXJlIG5vdCBvZiB0aGUgcmlnaHQgY2xhc3MgZm9yIHRoZQogKiBzcGVjaWZpZWQgZm9ybWF0LCBhIGZhaWxpbmcgVUVycm9yQ29kZSByZXN1bHQgaXMgc2V0LgogKiA8UD4KIAogKiA8UD4KICogW05vdGU6XSBBcyB3ZSBzZWUgYWJvdmUsIHRoZSBzdHJpbmcgcHJvZHVjZWQgYnkgYSBjaG9pY2UgRm9ybWF0IGluCiAqIE1lc3NhZ2VGb3JtYXQgaXMgdHJlYXRlZCBzcGVjaWFsbHk7IG9jY3VyYW5jZXMgb2YgJ3snIGFyZSB1c2VkIHRvCiAqIGluZGljYXRlZCBzdWJmb3JtYXRzLiAgCiAqIDxQPgogKiBbTm90ZTpdIEZvcm1hdHMgYXJlIG51bWJlcmVkIGJ5IG9yZGVyIG9mIHZhcmlhYmxlIGluIHRoZSBzdHJpbmcuCiAqIFRoaXMgaXMgW25vdF0gdGhlIHNhbWUgYXMgdGhlIGFyZ3VtZW50IG51bWJlcmluZyEKICogPHByZT4KICogLiAgIEZvciBleGFtcGxlOiB3aXRoICJhYmN7Mn1kZWZ7M31naGl7MH0uLi4iLAogKiAuICAgCiAqIC4gICBmb3JtYXQwIGFmZmVjdHMgdGhlIGZpcnN0IHZhcmlhYmxlIHsyfQogKiAuICAgZm9ybWF0MSBhZmZlY3RzIHRoZSBzZWNvbmQgdmFyaWFibGUgezN9CiAqIC4gICBmb3JtYXQyIGFmZmVjdHMgdGhlIHNlY29uZCB2YXJpYWJsZSB7MH0KICogPC9wcmU+CiAqIGFuZCBzbyBvbi4KICovCgovKioKKiBGb3JtYXQgYSBtZXNzYWdlIGZvciBhIGxvY2FsZS4KKiBUaGlzIGZ1bmN0aW9uIG1heSBwZXJmb3JtIHJlLW9yZGVyaW5nIG9mIHRoZSBhcmd1bWVudHMgZGVwZW5kaW5nIG9uIHRoZQoqIGxvY2FsZS4gRm9yIGFsbCBudW1lcmljIGFyZ3VtZW50cywgZG91YmxlIGlzIGFzc3VtZWQgdW5sZXNzIHRoZSB0eXBlIGlzCiogZXhwbGljaXRseSBpbnRlZ2VyLiAgQWxsIGNob2ljZSBmb3JtYXQgYXJndW1lbnRzIG11c3QgYmUgb2YgdHlwZSBkb3VibGUuCiogQHBhcmFtIGxvY2FsZSBUaGUgbG9jYWxlIGZvciB3aGljaCB0aGUgbWVzc2FnZSB3aWxsIGJlIGZvcm1hdHRlZAoqIEBwYXJhbSBwYXR0ZXJuIFRoZSBwYXR0ZXJuIHNwZWNpZnlpbmcgdGhlIG1lc3NhZ2UncyBmb3JtYXQKKiBAcGFyYW0gcGF0dGVybkxlbmd0aCBUaGUgbGVuZ3RoIG9mIHBhdHRlcm4KKiBAcGFyYW0gcmVzdWx0IEEgcG9pbnRlciB0byBhIGJ1ZmZlciB0byByZWNlaXZlIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZS4KKiBAcGFyYW0gcmVzdWx0TGVuZ3RoIFRoZSBtYXhpbXVtIHNpemUgb2YgcmVzdWx0LgoqIEBwYXJhbSBzdGF0dXMgQSBwb2ludGVyIHRvIGFuIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzCiogQHBhcmFtIC4uLiBBIHZhcmlhYmxlLWxlbmd0aCBhcmd1bWVudCBsaXN0IGNvbnRhaW5pbmcgdGhlIGFyZ3VtZW50cyBzcGVjaWZpZWQKKiBpbiBwYXR0ZXJuLgoqIEByZXR1cm4gVGhlIHRvdGFsIGJ1ZmZlciBzaXplIG5lZWRlZDsgaWYgZ3JlYXRlciB0aGFuIHJlc3VsdExlbmd0aCwgdGhlIAoqIG91dHB1dCB3YXMgdHJ1bmNhdGVkLgoqIEBzZWUgdV9wYXJzZU1lc3NhZ2UKKiBAZHJhZnQgIHNob3VsZCB0aGlzIGp1c3QgYmUgdXNwcmludGY/CiovClVfQ0FQSSBpbnQzMl90CnVfZm9ybWF0TWVzc2FnZSggICAgY29uc3QgICAgY2hhciAgICAgICAgKmxvY2FsZSwKICAgICAgICAgICAgY29uc3QgICAgVUNoYXIgICAgICAgICpwYXR0ZXJuLAogICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgcGF0dGVybkxlbmd0aCwKICAgICAgICAgICAgICAgIFVDaGFyICAgICAgICAqcmVzdWx0LAogICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgcmVzdWx0TGVuZ3RoLAogICAgICAgICAgICAgICAgVUVycm9yQ29kZSAgICAqc3RhdHVzLAogICAgICAgICAgICAgICAgLi4uKTsKIAovKioKKiBGb3JtYXQgYSBtZXNzYWdlIGZvciBhIGxvY2FsZS4KKiBUaGlzIGZ1bmN0aW9uIG1heSBwZXJmb3JtIHJlLW9yZGVyaW5nIG9mIHRoZSBhcmd1bWVudHMgZGVwZW5kaW5nIG9uIHRoZQoqIGxvY2FsZS4gRm9yIGFsbCBudW1lcmljIGFyZ3VtZW50cywgZG91YmxlIGlzIGFzc3VtZWQgdW5sZXNzIHRoZSB0eXBlIGlzCiogZXhwbGljaXRseSBpbnRlZ2VyLiAgQWxsIGNob2ljZSBmb3JtYXQgYXJndW1lbnRzIG11c3QgYmUgb2YgdHlwZSBkb3VibGUuCiogQHBhcmFtIGxvY2FsZSBUaGUgbG9jYWxlIGZvciB3aGljaCB0aGUgbWVzc2FnZSB3aWxsIGJlIGZvcm1hdHRlZAoqIEBwYXJhbSBwYXR0ZXJuIFRoZSBwYXR0ZXJuIHNwZWNpZnlpbmcgdGhlIG1lc3NhZ2UncyBmb3JtYXQKKiBAcGFyYW0gcGF0dGVybkxlbmd0aCBUaGUgbGVuZ3RoIG9mIHBhdHRlcm4KKiBAcGFyYW0gcmVzdWx0IEEgcG9pbnRlciB0byBhIGJ1ZmZlciB0byByZWNlaXZlIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZS4KKiBAcGFyYW0gcmVzdWx0TGVuZ3RoIFRoZSBtYXhpbXVtIHNpemUgb2YgcmVzdWx0LgoqIEBwYXJhbSBhcCBBIHZhcmlhYmxlLWxlbmd0aCBhcmd1bWVudCBsaXN0IGNvbnRhaW5pbmcgdGhlIGFyZ3VtZW50cyBzcGVjaWZpZWQKKiBAcGFyYW0gc3RhdHVzIEEgcG9pbnRlciB0byBhbiBVRXJyb3JDb2RlIHRvIHJlY2VpdmUgYW55IGVycm9ycwoqIGluIHBhdHRlcm4uCiogQHJldHVybiBUaGUgdG90YWwgYnVmZmVyIHNpemUgbmVlZGVkOyBpZiBncmVhdGVyIHRoYW4gcmVzdWx0TGVuZ3RoLCB0aGUgCiogb3V0cHV0IHdhcyB0cnVuY2F0ZWQuCiogQHNlZSB1X3BhcnNlTWVzc2FnZQoqLwpVX0NBUEkgaW50MzJfdAp1X3Zmb3JtYXRNZXNzYWdlKCAgICBjb25zdCAgICBjaGFyICAgICAgICAqbG9jYWxlLAogICAgICAgICAgICBjb25zdCAgICBVQ2hhciAgICAgICAgKnBhdHRlcm4sCiAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICBwYXR0ZXJuTGVuZ3RoLAogICAgICAgICAgICAgICAgVUNoYXIgICAgICAgICpyZXN1bHQsCiAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICByZXN1bHRMZW5ndGgsCiAgICAgICAgICAgICAgICB2YV9saXN0ICAgICAgIGFwLAogICAgICAgICAgICAgICAgVUVycm9yQ29kZSAgICAqc3RhdHVzKTsKLyoqCiogUGFyc2UgYSBtZXNzYWdlLgoqIEZvciBudW1lcmljIGFyZ3VtZW50cywgdGhpcyBmdW5jdGlvbiB3aWxsIGFsd2F5cyB1c2UgZG91Ymxlcy4gIEludGVnZXIgdHlwZXMKKiBzaG91bGQgbm90IGJlIHBhc3NlZC4gIAoqIFRoaXMgZnVuY3Rpb24gaXMgbm90IGFibGUgdG8gcGFyc2UgYWxsIG91dHB1dCBmcm9tIFxSZWZ7dV9mb3JtYXRNZXNzYWdlfS4KKiBAcGFyYW0gbG9jYWxlIFRoZSBsb2NhbGUgZm9yIHdoaWNoIHRoZSBtZXNzYWdlIGlzIGZvcm1hdHRlZAoqIEBwYXJhbSBwYXR0ZXJuIFRoZSBwYXR0ZXJuIHNwZWNpZnlpbmcgdGhlIG1lc3NhZ2UncyBmb3JtYXQKKiBAcGFyYW0gcGF0dGVybkxlbmd0aCBUaGUgbGVuZ3RoIG9mIHBhdHRlcm4KKiBAcGFyYW0gc291cmNlIFRoZSB0ZXh0IHRvIHBhcnNlLgoqIEBwYXJhbSBzb3VyY2VMZW5ndGggVGhlIGxlbmd0aCBvZiBzb3VyY2UsIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4KKiBAcGFyYW0gc3RhdHVzIEEgcG9pbnRlciB0byBhbiBVRXJyb3JDb2RlIHRvIHJlY2VpdmUgYW55IGVycm9ycwoqIEBwYXJhbSAuLi4gQSB2YXJpYWJsZS1sZW5ndGggYXJndW1lbnQgbGlzdCBjb250YWluaW5nIHRoZSBhcmd1bWVudHMKKiBzcGVjaWZpZWQgaW4gcGF0dGVybi4KKiBAc2VlIHVfZm9ybWF0TWVzc2FnZQoqIEBkcmFmdAoqLwpVX0NBUEkgdm9pZCAKdV9wYXJzZU1lc3NhZ2UoICAgIGNvbnN0ICAgIGNoYXIgICAgICAgICpsb2NhbGUsCiAgICAgICAgY29uc3QgICAgVUNoYXIgICAgICAgICpwYXR0ZXJuLAogICAgICAgICAgICBpbnQzMl90ICAgICAgICBwYXR0ZXJuTGVuZ3RoLAogICAgICAgIGNvbnN0ICAgIFVDaGFyICAgICAgICAqc291cmNlLAogICAgICAgICAgICBpbnQzMl90ICAgICAgICBzb3VyY2VMZW5ndGgsCiAgICAgICAgICAgIFVFcnJvckNvZGUgICAgKnN0YXR1cywKICAgICAgICAgICAgLi4uKTsKCi8qKgoqIFBhcnNlIGEgbWVzc2FnZS4KKiBGb3IgbnVtZXJpYyBhcmd1bWVudHMsIHRoaXMgZnVuY3Rpb24gd2lsbCBhbHdheXMgdXNlIGRvdWJsZXMuICBJbnRlZ2VyIHR5cGVzCiogc2hvdWxkIG5vdCBiZSBwYXNzZWQuICAKKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBhYmxlIHRvIHBhcnNlIGFsbCBvdXRwdXQgZnJvbSBcUmVme3VfZm9ybWF0TWVzc2FnZX0uCiogQHBhcmFtIGxvY2FsZSBUaGUgbG9jYWxlIGZvciB3aGljaCB0aGUgbWVzc2FnZSBpcyBmb3JtYXR0ZWQKKiBAcGFyYW0gcGF0dGVybiBUaGUgcGF0dGVybiBzcGVjaWZ5aW5nIHRoZSBtZXNzYWdlJ3MgZm9ybWF0CiogQHBhcmFtIHBhdHRlcm5MZW5ndGggVGhlIGxlbmd0aCBvZiBwYXR0ZXJuCiogQHBhcmFtIHNvdXJjZSBUaGUgdGV4dCB0byBwYXJzZS4KKiBAcGFyYW0gc291cmNlTGVuZ3RoIFRoZSBsZW5ndGggb2Ygc291cmNlLCBvciAtMSBpZiBudWxsLXRlcm1pbmF0ZWQuCiogQHBhcmFtIGFwIEEgdmFyaWFibGUtbGVuZ3RoIGFyZ3VtZW50IGxpc3QgY29udGFpbmluZyB0aGUgYXJndW1lbnRzCiogQHBhcmFtIHN0YXR1cyBBIHBvaW50ZXIgdG8gYW4gVUVycm9yQ29kZSB0byByZWNlaXZlIGFueSBlcnJvcnMKKiBzcGVjaWZpZWQgaW4gcGF0dGVybi4KKiBAc2VlIHVfZm9ybWF0TWVzc2FnZQoqLwpVX0NBUEkgdm9pZCAKdV92cGFyc2VNZXNzYWdlKCAgICBjb25zdCAgICBjaGFyICAgICAgICAqbG9jYWxlLAogICAgICAgIGNvbnN0ICAgIFVDaGFyICAgICAgICAqcGF0dGVybiwKICAgICAgICAgICAgaW50MzJfdCAgICAgICAgcGF0dGVybkxlbmd0aCwKICAgICAgICBjb25zdCAgICBVQ2hhciAgICAgICAgKnNvdXJjZSwKICAgICAgICAgICAgaW50MzJfdCAgICAgICAgc291cmNlTGVuZ3RoLAogICAgICAgICAgICB2YV9saXN0ICAgICAgIGFwLAogICAgICAgICAgICBVRXJyb3JDb2RlICAgICpzdGF0dXMpOwoKI2VuZGlmCg==