LyoKKiBDb3B5cmlnaHQgqSB7MTk5Ni0xOTk5fSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gRmlsZSBzb3J0a2V5LmgKLy8KLy8gCi8vCi8vIENyZWF0ZWQgYnk6IEhlbGVuYSBTaGloCi8vCi8vIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgovLwovLyAgRGF0ZSAgICAgICAgIE5hbWUgICAgICAgICAgRGVzY3JpcHRpb24KLy8KLy8gIDYvMjAvOTcgICAgIGhlbGVuYSAgICAgIEphdmEgY2xhc3MgbmFtZSBjaGFuZ2UuCi8vICA4LzE4Lzk3ICAgICBoZWxlbmEgICAgICBBZGRlZCBpbnRlcm5hbCBBUEkgZG9jdW1lbnRhdGlvbi4KLy8gIDYvMjYvOTggICAgIGVybSAgICAgICAgIENoYW5nZWQgdG8gdXNlIGJ5dGUgYXJyYXlzIGFuZCBtZW1jbXAuIAovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpZm5kZWYgU09SVEtFWV9ICiNkZWZpbmUgU09SVEtFWV9ICgoKI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCiNpbmNsdWRlICJ1bmljb2RlL3VuaXN0ci5oIgojaW5jbHVkZSAidW5pY29kZS9jb2xsLmgiCgovKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCmNsYXNzIFJ1bGVCYXNlZENvbGxhdG9yOwoKLyoqCiAqIENvbGxhdGlvbiBrZXlzIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIENvbGxhdG9yIGNsYXNzLiAgVXNlIHRoZSBDb2xsYXRpb25LZXkgb2JqZWN0cwogKiBpbnN0ZWFkIG9mIENvbGxhdG9yIHRvIGNvbXBhcmUgc3RyaW5ncyBtdWx0aXBsZSB0aW1lcy4gIEEgQ29sbGF0aW9uS2V5CiAqIHByZXByb2Nlc3NlcyB0aGUgY29tcGFyaXNvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBDb2xsYXRvciBvYmplY3QgdG8KICogbWFrZSB0aGUgY29tcGFyaXNvbiBmYXN0ZXIuICBJZiB5b3UgYXJlIG5vdCBnb2luZyB0byBjb21wYXJpbmcgc3RyaW5ncwogKiBtdWx0aXBsZSB0aW1lcywgdGhlbiB1c2luZyB0aGUgQ29sbGF0b3Igb2JqZWN0IGlzIGdlbmVyYWxseSBmYXN0ZXIsCiAqIHNpbmNlIGl0IG9ubHkgcHJvY2Vzc2VzIGFzIG11Y2ggb2YgdGhlIHN0cmluZyBhcyBuZWVkZWQgdG8gbWFrZSBhCiAqIGNvbXBhcmlzb24uCiAqIDxwPiBGb3IgZXhhbXBsZSAod2l0aCBzdHJlbmd0aCA9PSB0ZXJ0aWFyeSkKICogPHA+V2hlbiBjb21wYXJpbmcgIkFiZXJuYXRoeSIgdG8gIkJhZ2dpbnMtU215dGh3b3J0aHkiLCBDb2xsYXRvcgogKiBvbmx5IG5lZWRzIHRvIHByb2Nlc3MgYSBjb3VwbGUgb2YgY2hhcmFjdGVycywgd2hpbGUgYSBjb21wYXJpc29uCiAqIHdpdGggQ29sbGF0aW9uS2V5cyB3aWxsIHByb2Nlc3MgYWxsIG9mIHRoZSBjaGFyYWN0ZXJzLiAgT24gdGhlIG90aGVyIGhhbmQsCiAqIGlmIHlvdSBhcmUgZG9pbmcgYSBzb3J0IG9mIGEgbnVtYmVyIG9mIGZpZWxkcywgaXQgaXMgbXVjaCBmYXN0ZXIgdG8gdXNlCiAqIENvbGxhdGlvbktleXMsIHNpbmNlIHlvdSB3aWxsIGJlIGNvbXBhcmluZyBzdHJpbmdzIG11bHRpcGxlIHRpbWVzLgogKiA8cD5UeXBpY2FsIHVzZSBvZiBDb2xsYXRpb25LZXlzIGFyZSBpbiBkYXRhYmFzZXMsIHdoZXJlIHlvdSBzdG9yZSBhIENvbGxhdGlvbktleQogKiBpbiBhIGhpZGRlbiBmaWVsZCwgYW5kIHVzZSBpdCBmb3Igc29ydGluZyBvciBpbmRleGluZy4KICoKICogPHA+RXhhbXBsZSBvZiB1c2U6CiAqIDxwcmU+CiAqIFxjb2RlCiAqICAgICBVRXJyb3JDb2RlIHN1Y2Nlc3MgPSBVX1pFUk9fRVJST1I7CiAqICAgICBDb2xsYXRvciogbXlDb2xsYXRvciA9IENvbGxhdG9yOjpjcmVhdGVJbnN0YW5jZShzdWNjZXNzKTsKICogICAgIENvbGxhdGlvbktleSoga2V5cyA9IG5ldyBDb2xsYXRpb25LZXkgWzNdOwogKiAgICAgbXlDb2xsYXRvci0+Z2V0Q29sbGF0aW9uS2V5KCJUb20iLCBrZXlzWzBdLCBzdWNjZXNzICk7CiAqICAgICBteUNvbGxhdG9yLT5nZXRDb2xsYXRpb25LZXkoIkRpY2siLCBrZXlzWzFdLCBzdWNjZXNzICk7CiAqICAgICBteUNvbGxhdG9yLT5nZXRDb2xsYXRpb25LZXkoIkhhcnJ5Iiwga2V5c1syXSwgc3VjY2VzcyApOwogKiAgCiAqICAgICAvLyBJbnNpZGUgYm9keSBvZiBzb3J0IHJvdXRpbmUsIGNvbXBhcmUga2V5cyB0aGlzIHdheToKICogICAgIENvbGxhdGlvbktleSB0bXA7CiAqICAgICBpZihrZXlzWzBdLmNvbXBhcmVUbygga2V5c1sxXSApID4gMCApIHsKICogICAgICAgICB0bXAgPSBrZXlzWzBdOyBrZXlzWzBdID0ga2V5c1sxXTsga2V5c1sxXSA9IHRtcDsKICogICAgIH0KICogICAgIC8vLi4uCiAqIFxlbmRjb2RlCiAqIDwvcHJlPgogKiA8cD5CZWNhdXNlIENvbGxhdG9yOjpjb21wYXJlKCkncyBhbGdvcml0aG0gaXMgY29tcGxleCwgaXQgaXMgZmFzdGVyIHRvIHNvcnQKICogbG9uZyBsaXN0cyBvZiB3b3JkcyBieSByZXRyaWV2aW5nIGNvbGxhdGlvbiBrZXlzIHdpdGggQ29sbGF0b3I6OmdldENvbGxhdGlvbktleSgpLgogKiBZb3UgY2FuIHRoZW4gY2FjaGUgdGhlIGNvbGxhdGlvbiBrZXlzIGFuZCBjb21wYXJlIHRoZW0gdXNpbmcgQ29sbGF0aW9uS2V5Ojpjb21wYXJlVG8oKS4KICogPHA+CiAqIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gPGNvZGU+Q29sbGF0b3I8L2NvZGU+cyB3aXRoIGRpZmZlcmVudCBMb2NhbGUsCiAqIENvbGxhdGlvblN0cmVuZ3RoIGFuZCBEZWNvbXBvc2l0aW9uTW9kZSBzZXR0aW5ncyB3aWxsIHJldHVybiBkaWZmZXJlbnQKICogQ29sbGF0aW9uS2V5cyBmb3IgdGhlIHNhbWUgc2V0IG9mIHN0cmluZ3MuIExvY2FsZXMgaGF2ZSBzcGVjaWZpYyAKICogY29sbGF0aW9uIHJ1bGVzLCBhbmQgdGhlIHdheSBpbiB3aGljaCBzZWNvbmRhcnkgYW5kIHRlcnRpYXJ5IGRpZmZlcmVuY2VzIAogKiBhcmUgdGFrZW4gaW50byBhY2NvdW50LCBmb3IgZXhhbXBsZSwgd2lsbCByZXN1bHQgaW4gZGlmZmVyZW50IENvbGxhdGlvbktleXMKICogZm9yIHNhbWUgc3RyaW5ncy4KICogPHA+CgogKiBAc2VlICAgICAgICAgIENvbGxhdG9yCiAqIEBzZWUgICAgICAgICAgUnVsZUJhc2VkQ29sbGF0b3IKICogQHZlcnNpb24gICAgICAxLjMgMTIvMTgvOTYKICogQGF1dGhvciAgICAgICBIZWxlbmEgU2hpaAogKiBAZGVwcmVjYXRlZAogKi8KY2xhc3MgVV9JMThOX0FQSSBDb2xsYXRpb25LZXkgewpwdWJsaWM6CiAgICAvKioKICAgICAqIFRoaXMgY3JlYXRlcyBhbiBlbXB0eSBjb2xsYXRpb24ga2V5IGJhc2VkIG9uIHRoZSBudWxsIHN0cmluZy4gIEFuIGVtcHR5IAogICAgICogY29sbGF0aW9uIGtleSBjb250YWlucyBubyBzb3J0aW5nIGluZm9ybWF0aW9uLiAgV2hlbiBjb21wYXJpbmcgdHdvIGVtcHR5CiAgICAgKiBjb2xsYXRpb24ga2V5cywgdGhlIHJlc3VsdCBpcyBDb2xsYXRvcjo6RVFVQUwuICBDb21wYXJpbmcgZW1wdHkgY29sbGF0aW9uIGtleQogICAgICogd2l0aCBub24tZW1wdHkgY29sbGF0aW9uIGtleSBpcyBhbHdheXMgQ29sbGF0b3I6OkxFU1MuCgkgKiBAZGVwcmVjYXRlZAogICAgICovCiAgICAgQ29sbGF0aW9uS2V5KCk7CgoKICAgICAvKioKICAgICAqIENyZWF0ZXMgYSBjb2xsYXRpb24ga2V5IGJhc2VkIG9uIHRoZSBjb2xsYXRpb24ga2V5IHZhbHVlcy4gIAogICAgICogQHBhcmFtIHZhbHVlcyB0aGUgY29sbGF0aW9uIGtleSB2YWx1ZXMKICAgICAqIEBwYXJhbSBjb3VudCBudW1iZXIgb2YgY29sbGF0aW9uIGtleSB2YWx1ZXMsIGluY2x1ZGluZyB0cmFpbGluZyBudWxscy4KICAgICAqIEBzZWUgI2NyZWF0ZUJpdHMKCSAqIEBkZXByZWNhdGVkCiAgICAgKi8KICAgICBDb2xsYXRpb25LZXkoY29uc3QgIHVpbnQ4X3QqICAgIHZhbHVlcywKCQkJCQlpbnQzMl90ICAgICBjb3VudCk7CgogICAgLyoqCiAgICAgKiBDb3B5IGNvbnN0cnVjdG9yLgoJICogQGRlcHJlY2F0ZWQKICAgICAqLwogICAgIENvbGxhdGlvbktleShjb25zdCBDb2xsYXRpb25LZXkmIG90aGVyKTsKICAgIC8qKiAKICAgICAqIFNvcnQga2V5IGRlc3RydWN0b3IuCgkgKiBAZGVwcmVjYXRlZAogICAgICovCiAgICAgfkNvbGxhdGlvbktleSgpOwoKICAgIC8qKgogICAgICogQXNzaWdubWVudCBvcGVyYXRvcgoJICogQGRlcHJlY2F0ZWQKICAgICAqLwogICAgY29uc3QgICBDb2xsYXRpb25LZXkmICAgICAgICAgICBvcGVyYXRvcj0oY29uc3QgQ29sbGF0aW9uS2V5JiBvdGhlcik7CgogICAgLyoqCiAgICAgKiBDb21wYXJlIGlmIHR3byBjb2xsYXRpb24ga2V5cyBhcmUgdGhlIHNhbWUuCiAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBjb2xsYXRpb24ga2V5IHRvIGNvbXBhcmUgdG8uCiAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0d28gY29sbGF0aW9uIGtleXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuCgkgKiBAZGVwcmVjYXRlZAogICAgICovCiAgICAgVUJvb2wgICAgICAgICAgICAgICAgICBvcGVyYXRvcj09KGNvbnN0IENvbGxhdGlvbktleSYgc291cmNlKSBjb25zdDsKCiAgICAvKioKICAgICAqIENvbXBhcmUgaWYgdHdvIGNvbGxhdGlvbiBrZXlzIGFyZSBub3QgdGhlIHNhbWUuCiAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBjb2xsYXRpb24ga2V5IHRvIGNvbXBhcmUgdG8uCiAgICAgKiBAcmV0dXJuIFJldHVybnMgVFJVRSBpZiB0d28gY29sbGF0aW9uIGtleXMgYXJlIGRpZmZlcmVudCwgRkFMU0Ugb3RoZXJ3aXNlLgoJICogQGRlcHJlY2F0ZWQKICAgICAqLwogICAgIFVCb29sICAgICAgICAgICAgICAgICAgb3BlcmF0b3IhPShjb25zdCBDb2xsYXRpb25LZXkmIHNvdXJjZSkgY29uc3Q7CgoKICAgIC8qKgogICAgICogVGVzdCB0byBzZWUgaWYgdGhlIGtleSBpcyBpbiBhbiBpbnZhbGlkIHN0YXRlLiBUaGUga2V5IHdpbGwgYmUgaW4gYW4KICAgICAqIGludmFsaWQgc3RhdGUgaWYgaXQgY291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBzb21lIG9wZXJhdGlvbi4KICAgICAqIEByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHRoZSBrZXkgaXMgaW4gYW4gaW52YWxpZCwgRkFMU0Ugb3RoZXJ3aXNlLgoJICogQGRlcHJlY2F0ZWQKICAgICAqLwogICAgIFVCb29sICAgICAgICAgICAgICAgICAgaXNCb2d1cyh2b2lkKSBjb25zdDsKCiAgICAvKiogCiAgICAgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY29sbGF0aW9uIGtleSB2YWx1ZXMuIFRoZSBzdG9yYWdlIGlzIG93bmVkCiAgICAgKiBieSB0aGUgY29sbGF0aW9uIGtleSBhbmQgdGhlIHBvaW50ZXIgd2lsbCBiZWNvbWUgaW52YWxpZCBpZiB0aGUga2V5CiAgICAgKiBpcyBkZWxldGVkLgogICAgICogQHBhcmFtIGNvdW50IHRoZSBvdXRwdXQgcGFyYW1ldGVyIG9mIG51bWJlciBvZiBjb2xsYXRpb24ga2V5IHZhbHVlcywKICAgICAqIGluY2x1ZGluZyBhbnkgdHJhaWxpbmcgbnVsbHMuCgkgKiBAZGVwcmVjYXRlZAogICAgICovCgkgY29uc3QgICAgdWludDhfdCogICAgICAgICAgICAgICAgZ2V0Qnl0ZUFycmF5KGludDMyX3QmIGNvdW50KSBjb25zdDsKCiAgICAvKiogCiAgICAgKiBFeHRyYWN0cyB0aGUgY29sbGF0aW9uIGtleSB2YWx1ZXMgaW50byBhIG5ldyBhcnJheS4gVGhlIGNhbGxlciBvd25zCiAgICAgKiB0aGlzIHN0b3JhZ2UgYW5kIHNob3VsZCBmcmVlIGl0LgogICAgICogQHBhcmFtIGNvdW50IHRoZSBvdXRwdXQgcGFyYW1ldGVyIG9mIG51bWJlciBvZiBjb2xsYXRpb24ga2V5IHZhbHVlcywKICAgICAqIGluY2x1ZGluZyBhbnkgdHJhaWxpbmcgbnVsbHMuCgkgKiBAZGVwcmVjYXRlZAogICAgICovCiAgICAgdWludDhfdCogICAgICAgICAgICAgICAgdG9CeXRlQXJyYXkoaW50MzJfdCYgY291bnQpIGNvbnN0OwoKICAgIC8qKgogICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHdoaWNoIGRvZXMgYSBzdHJpbmcoYml0LXdpc2UpIGNvbXBhcmlzb24gb2YgdGhlCiAgICAgKiB0d28gY29sbGF0aW9uIGtleXMuCiAgICAgKiBAcGFyYW0gc291cmNlS2V5IHNvdXJjZSBjb2xsYXRpb24ga2V5CiAgICAgKiBAcGFyYW0gdGFyZ2V0S2V5IHRhcmdldCBjb2xsYXRpb24ga2V5CiAgICAgKiBAcmV0dXJuIFJldHVybnMgQ29sbGF0b3I6OkxFU1MgaWYgc291cmNlS2V5ICZsdDsgdGFyZ2V0S2V5LCAKICAgICAqIENvbGxhdG9yOjpHUkVBVEVSIGlmIHNvdXJjZUtleSA+IHRhcmdldEtleSBhbmQgQ29sbGF0b3I6OkVRVUFMCiAgICAgKiBvdGhlcndpc2UuCgkgKiBAZGVwcmVjYXRlZAogICAgICovCiAgICAgQ29sbGF0b3I6OkVDb21wYXJpc29uUmVzdWx0ICAgIGNvbXBhcmVUbyhjb25zdCBDb2xsYXRpb25LZXkmIHRhcmdldCkgY29uc3Q7CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGludGVnZXIgdGhhdCBpcyB1bmlxdWUgdG8gdGhlIGNvbGxhdGlvbiBrZXkuICBOT1RFOiB0aGlzCiAgICAgKiBpcyBub3QgdGhlIHNhbWUgYXMgU3RyaW5nLmhhc2hDb2RlLgogICAgICogPHA+RXhhbXBsZSBvZiB1c2U6CiAgICAgKiA8cHJlPgogICAgICogLiAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKICAgICAqIC4gICAgQ29sbGF0b3IgKm15Q29sbGF0aW9uID0gQ29sbGF0b3I6OmNyZWF0ZUluc3RhbmNlKExvY2FsZTo6VVMsIHN0YXR1cyk7CiAgICAgKiAuICAgIGlmIChVX0ZBSUxVUkUoc3RhdHVzKSkgcmV0dXJuOwogICAgICogLiAgICBDb2xsYXRpb25LZXkga2V5MSwga2V5MjsKICAgICAqIC4gICAgVUVycm9yQ29kZSBzdGF0dXMxID0gVV9aRVJPX0VSUk9SLCBzdGF0dXMyID0gVV9aRVJPX0VSUk9SOwogICAgICogLiAgICBteUNvbGxhdGlvbi0+Z2V0Q29sbGF0aW9uS2V5KCJhYmMiLCBrZXkxLCBzdGF0dXMxKTsKICAgICAqIC4gICAgaWYgKFVfRkFJTFVSRShzdGF0dXMxKSkgeyBkZWxldGUgbXlDb2xsYXRpb247IHJldHVybjsgfQogICAgICogLiAgICBteUNvbGxhdGlvbi0+Z2V0Q29sbGF0aW9uS2V5KCJBQkMiLCBrZXkyLCBzdGF0dXMyKTsKICAgICAqIC4gICAgaWYgKFVfRkFJTFVSRShzdGF0dXMyKSkgeyBkZWxldGUgbXlDb2xsYXRpb247IHJldHVybjsgfQogICAgICogLiAgICAvLyBrZXkxLmhhc2hDb2RlKCkgIT0ga2V5Mi5oYXNoQ29kZSgpCiAgICAgKiA8L3ByZT4KICAgICAqIEByZXR1cm4gdGhlIGhhc2ggdmFsdWUgYmFzZWQgb24gdGhlIHN0cmluZydzIGNvbGxhdGlvbiBvcmRlci4KICAgICAqIEBzZWUgVW5pY29kZVN0cmluZyNoYXNoQ29kZQoJICogQGRlcHJlY2F0ZWQKICAgICAqLwogICAgIGludDMyX3QgICAgICAgICAgICAgICAgIGhhc2hDb2RlKHZvaWQpIGNvbnN0OwoKcHJpdmF0ZToKICAgIC8qKgogICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBjb2xsYXRpb24ga2V5IHZhbHVlcyBhcyAxNi1iaXQgaW50ZWdlcnMuCiAgICAqIFRoZSBjYWxsZXIgb3ducyB0aGUgc3RvcmFnZSBhbmQgbXVzdCBkZWxldGUgaXQuCiAgICAqIEBwYXJhbSBzaXplIG91dHB1dCBwYXJhbWV0ZXIgb2YgdGhlIG51bWJlciBvZiBjb2xsYXRpb24ga2V5IHZhbHVlcwogICAgKiBAcmV0dXJuIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiAxNi1iaXQgY29sbGF0aW9uIGtleSB2YWx1ZXMuCiAgICAqLwogICAgICAgICAgICB1aW50MTZfdCogICAgICAgICAgICAgICBjb3B5VmFsdWVzKGludDMyX3QgJnNpemUpIGNvbnN0OwoKICAgICAgICAgICAgdm9pZCBhZG9wdCh1aW50OF90ICp2YWx1ZXMsIGludDMyX3QgY291bnQpOwoKICAgIC8qKgogICAgICogVGhlIHNlY3JldCBhZG9wdGluZyBjb25zdHJ1Y3RvciEKICAgICAqLwogICAgQ29sbGF0aW9uS2V5KGludDMyX3QgY291bnQsIHVpbnQ4X3QgKnZhbHVlcyk7CgogICAgLyoKICAgICAqIENyZWF0ZXMgYSBjb2xsYXRpb24ga2V5IHdpdGggYSBzdHJpbmcuCiAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGF0aW9uS2V5KGNvbnN0IFVuaWNvZGVTdHJpbmcmIHZhbHVlKTsKCiAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgIHN0b3JlQnl0ZXMoaW50MzJfdCBjdXJzb3IsIHVpbnQzMl90IGJ5dGVWYWx1ZSk7CiAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgIHN0b3JlVW5pY29kZVN0cmluZyhpbnQzMl90IGN1cnNvciwgY29uc3QgVW5pY29kZVN0cmluZyAmdmFsdWUpOwogICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICByZXZlcnNlQnl0ZXMoaW50MzJfdCBmcm9tLCBpbnQzMl90IHRvKTsKICAgICAgICAgICAgQ29sbGF0aW9uS2V5JiAgICAgICAgICAgZW5zdXJlQ2FwYWNpdHkoaW50MzJfdCBuZXdTaXplKTsKICAgICAgICAgICAgQ29sbGF0aW9uS2V5JiAgICAgICAgICAgY29weVVuaWNvZGVTdHJpbmcoY29uc3QgVW5pY29kZVN0cmluZyAmdmFsdWUpOwogICAgICAgICAgICBDb2xsYXRpb25LZXkmICAgICAgICAgICBzZXRUb0JvZ3VzKHZvaWQpOwogICAgICAgICAgICBDb2xsYXRpb25LZXkmICAgICAgICAgICByZXNldCh2b2lkKTsKCiAgICBmcmllbmQgIGNsYXNzICAgICAgICAgICAgICAgICAgIFJ1bGVCYXNlZENvbGxhdG9yOwoKICAgIHN0YXRpYyBjb25zdCBpbnQzMl90ICAgICAgICAgICAga0ludmFsaWRIYXNoQ29kZTsKICAgIHN0YXRpYyBjb25zdCBpbnQzMl90ICAgICAgICAgICAga0VtcHR5SGFzaENvZGU7CgogICAgICAgICAgICBVQm9vbCAgICAgICAgICAgICAgICAgICBmQm9ndXM7CiAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgIGZDb3VudDsKICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgZkNhcGFjaXR5OwogICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBmSGFzaENvZGU7CiAgICAgICAgICAgIHVpbnQ4X3QqICAgICAgICAgICAgICAgIGZCeXRlczsKfTsKCmlubGluZSBVQm9vbApDb2xsYXRpb25LZXk6Om9wZXJhdG9yIT0oY29uc3QgQ29sbGF0aW9uS2V5JiBvdGhlcikgY29uc3QKewogICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOwp9CgppbmxpbmUgVUJvb2wKQ29sbGF0aW9uS2V5Ojppc0JvZ3VzKCkgY29uc3QKewogICAgcmV0dXJuIGZCb2d1czsKfQoKaW5saW5lIGNvbnN0IHVpbnQ4X3QqCkNvbGxhdGlvbktleTo6Z2V0Qnl0ZUFycmF5KGludDMyX3QgJmNvdW50KSBjb25zdAp7CiAgICBjb3VudCA9IGZDb3VudDsKICAgIHJldHVybiBmQnl0ZXM7Cn0KCmlubGluZSBVVGV4dE9mZnNldApDb2xsYXRpb25LZXk6OnN0b3JlQnl0ZXMoVVRleHRPZmZzZXQgY3Vyc29yLCB1aW50MzJfdCBieXRlVmFsdWUpCnsKICAgIGZCeXRlc1tjdXJzb3IrK10gPSAodWludDhfdCkgKGJ5dGVWYWx1ZSA+PiA4KTsKICAgIGZCeXRlc1tjdXJzb3IrK10gPSAodWludDhfdCkgYnl0ZVZhbHVlOwoKICAgIHJldHVybiBjdXJzb3I7Cn0KCiNlbmRpZgo=