LyoKICogWDExIGtleWJvYXJkIGRyaXZlcgogKgogKiBDb3B5cmlnaHQgMTk5MyBCb2IgQW1zdGFkdAogKiBDb3B5cmlnaHQgMTk5NiBBbGJyZWNodCBLbGVpbmUKICogQ29weXJpZ2h0IDE5OTcgRGF2aWQgRmF1cmUKICogQ29weXJpZ2h0IDE5OTggTW9ydGVuIFdlbGluZGVyCiAqIENvcHlyaWdodCAxOTk4IFVscmljaCBXZWlnYW5kCiAqIENvcHlyaWdodCAxOTk5IE92ZSBLw6V2ZW4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgoKI2luY2x1ZGUgPFgxMS9YYXRvbS5oPgojaW5jbHVkZSA8WDExL2tleXN5bS5oPgojaW5jbHVkZSA8WDExL1hsaWIuaD4KI2luY2x1ZGUgPFgxMS9YcmVzb3VyY2UuaD4KI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgojaWZkZWYgSEFWRV9YMTFfWEtCTElCX0gKI2luY2x1ZGUgPFgxMS9YS0JsaWIuaD4KI2VuZGlmCgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojZGVmaW5lIE5PTkFNRUxFU1NVTklPTgojZGVmaW5lIE5PTkFNRUxFU1NTVFJVQ1QKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW51c2VyLmgiCiNpbmNsdWRlICJ3aW5yZWcuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAieDExZHJ2LmgiCiNpbmNsdWRlICJ3aW5lL3NlcnZlci5oIgojaW5jbHVkZSAid2luZS91bmljb2RlLmgiCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgovKiBsb2cgZm9ybWF0IChhZGQgMC1wYWRkaW5nIGFzIGFwcHJvcHJpYXRlKToKICAgIGtleWNvZGUgICV1ICBhcyBpbiBvdXRwdXQgZnJvbSB4ZXYKICAgIGtleXN5bSAgICVseCBhcyBpbiBYMTEva2V5c3ltZGVmLmgKICAgIHZrZXkgICAgICVYICBhcyBpbiB3aW51c2VyLmgKICAgIHNjYW5jb2RlICV4CiovCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGtleWJvYXJkKTsKV0lORV9ERUNMQVJFX0RFQlVHX0NIQU5ORUwoa2V5KTsKCnN0YXRpYyBpbnQgbWluX2tleWNvZGUsIG1heF9rZXljb2RlLCBrZXlzeW1zX3Blcl9rZXljb2RlOwpzdGF0aWMgS2V5U3ltICprZXlfbWFwcGluZzsKc3RhdGljIFdPUkQga2V5YzJ2a2V5WzI1Nl0sIGtleWMyc2NhblsyNTZdOwoKc3RhdGljIGludCBOdW1Mb2NrTWFzaywgU2Nyb2xsTG9ja01hc2ssIEFsdEdyTWFzazsgLyogbWFzayBpbiB0aGUgWEtleUV2ZW50IHN0YXRlICovCgpzdGF0aWMgY2hhciBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKEtleVN5bSBrZXlzeW0pOwoKLyogS2V5Ym9hcmQgdHJhbnNsYXRpb24gdGFibGVzICovCiNkZWZpbmUgTUFJTl9MRU4gNDkKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl9xd2VydHlbTUFJTl9MRU5dID0KewovKiB0aGlzIGlzIG15ICgxMDIta2V5KSBrZXlib2FyZCBsYXlvdXQsIHNvcnJ5IGlmIGl0IGRvZXNuJ3QgcXVpdGUgbWF0Y2ggeW91cnMgKi8KIC8qIGAgICAgMSAgICAyICAgIDMgICAgNCAgICA1ICAgIDYgICAgNyAgICA4ICAgIDkgICAgMCAgICAtICAgID0gKi8KICAgMHgyOSwweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MEMsMHgwRCwKIC8qIHEgICAgdyAgICBlICAgIHIgICAgdCAgICB5ICAgIHUgICAgaSAgICBvICAgIHAgICAgWyAgICBdICovCiAgIDB4MTAsMHgxMSwweDEyLDB4MTMsMHgxNCwweDE1LDB4MTYsMHgxNywweDE4LDB4MTksMHgxQSwweDFCLAogLyogYSAgICBzICAgIGQgICAgZiAgICBnICAgIGggICAgaiAgICBrICAgIGwgICAgOyAgICAnICAgIFwgKi8KICAgMHgxRSwweDFGLDB4MjAsMHgyMSwweDIyLDB4MjMsMHgyNCwweDI1LDB4MjYsMHgyNywweDI4LDB4MkIsCiAvKiB6ICAgIHggICAgYyAgICB2ICAgIGIgICAgbiAgICBtICAgICwgICAgLiAgICAvICovCiAgIDB4MkMsMHgyRCwweDJFLDB4MkYsMHgzMCwweDMxLDB4MzIsMHgzMywweDM0LDB4MzUsCiAgIDB4NTYgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV9zY2FuX2FibnRfcXdlcnR5W01BSU5fTEVOXSA9CnsKIC8qIGAgICAgMSAgICAyICAgIDMgICAgNCAgICA1ICAgIDYgICAgNyAgICA4ICAgIDkgICAgMCAgICAtICAgID0gKi8KICAgMHgyOSwweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MEMsMHgwRCwKIC8qIHEgICAgdyAgICBlICAgIHIgICAgdCAgICB5ICAgIHUgICAgaSAgICBvICAgIHAgICAgWyAgICBdICovCiAgIDB4MTAsMHgxMSwweDEyLDB4MTMsMHgxNCwweDE1LDB4MTYsMHgxNywweDE4LDB4MTksMHgxQSwweDFCLAogLyogYSAgICBzICAgIGQgICAgZiAgICBnICAgIGggICAgaiAgICBrICAgIGwgICAgOyAgICAnICAgIFwgKi8KICAgMHgxRSwweDFGLDB4MjAsMHgyMSwweDIyLDB4MjMsMHgyNCwweDI1LDB4MjYsMHgyNywweDI4LDB4MkIsCiAvKiBcICAgICAgeiAgICB4ICAgIGMgICAgdiAgICBiICAgIG4gICAgbSAgICAsICAgIC4gICAgLyAqLwogICAweDVlLDB4MkMsMHgyRCwweDJFLDB4MkYsMHgzMCwweDMxLDB4MzIsMHgzMywweDM0LDB4MzUsCiAgIDB4NTYsIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl9kdm9yYWtbTUFJTl9MRU5dID0KewogLyogYCAgICAxICAgIDIgICAgMyAgICA0ICAgIDUgICAgNiAgICA3ICAgIDggICAgOSAgICAwICAgIFsgICAgXSAqLwogICAweDI5LDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgxQSwweDFCLAogLyogJyAgICAsICAgIC4gICAgcCAgICB5ICAgIGYgICAgZyAgICBjICAgIHIgICAgbCAgICAvICAgID0gKi8KICAgMHgyOCwweDMzLDB4MzQsMHgxOSwweDE1LDB4MjEsMHgyMiwweDJFLDB4MTMsMHgyNiwweDM1LDB4MEQsCiAvKiBhICAgIG8gICAgZSAgICB1ICAgIGkgICAgZCAgICBoICAgIHQgICAgbiAgICBzICAgIC0gICAgXCAqLwogICAweDFFLDB4MTgsMHgxMiwweDE2LDB4MTcsMHgyMCwweDIzLDB4MTQsMHgzMSwweDFGLDB4MEMsMHgyQiwKIC8qIDsgICAgcSAgICBqICAgIGsgICAgeCAgICBiICAgIG0gICAgdyAgICB2ICAgIHogKi8KICAgMHgyNywweDEwLDB4MjQsMHgyNSwweDJELDB4MzAsMHgzMiwweDExLDB4MkYsMHgyQywKICAgMHg1NiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3NjYW5fcXdlcnR5X2pwMTA2W01BSU5fTEVOXSA9CnsKICAvKiB0aGlzIGlzIG15ICgxMDYta2V5KSBrZXlib2FyZCBsYXlvdXQsIHNvcnJ5IGlmIGl0IGRvZXNuJ3QgcXVpdGUgbWF0Y2ggeW91cnMgKi8KIC8qIDEgICAgMiAgICAzICAgIDQgICAgNSAgICA2ICAgIDcgICAgOCAgICA5ICAgIDAgICAgLSAgICBeICAgIFwgKi8KICAgMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDBDLDB4MEQsMHgyOSwKIC8qIHEgICAgdyAgICBlICAgIHIgICAgdCAgICB5ICAgIHUgICAgaSAgICBvICAgIHAgICAgQCAgICBbICovCiAgIDB4MTAsMHgxMSwweDEyLDB4MTMsMHgxNCwweDE1LDB4MTYsMHgxNywweDE4LDB4MTksMHgxQSwweDFCLAogLyogYSAgICBzICAgIGQgICAgZiAgICBnICAgIGggICAgaiAgICBrICAgIGwgICAgOyAgICA6ICAgIF0gKi8KICAgMHgxRSwweDFGLDB4MjAsMHgyMSwweDIyLDB4MjMsMHgyNCwweDI1LDB4MjYsMHgyNywweDI4LDB4MkIsCiAvKiB6ICAgIHggICAgYyAgICB2ICAgIGIgICAgbiAgICBtICAgICwgICAgLiAgICAvICovCiAgIDB4MkMsMHgyRCwweDJFLDB4MkYsMHgzMCwweDMxLDB4MzIsMHgzMywweDM0LDB4MzUsCiAgIDB4NTYgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV9zY2FuX3F3ZXJ0eV9tYWNqcFtNQUlOX0xFTl0gPQp7CiAvKiAxICAgIDIgICAgMyAgICA0ICAgIDUgICAgNiAgICA3ICAgIDggICAgOSAgICAwICAgIC0gICAgXiAgICBcICovCiAgIDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgwQywweDBELDB4N2QsCiAvKiBxICAgIHcgICAgZSAgICByICAgIHQgICAgeSAgICB1ICAgIGkgICAgbyAgICBwICAgIEAgICAgWyAqLwogICAweDEwLDB4MTEsMHgxMiwweDEzLDB4MTQsMHgxNSwweDE2LDB4MTcsMHgxOCwweDE5LDB4MUEsMHgxQiwKIC8qIGEgICAgcyAgICBkICAgIGYgICAgZyAgICBoICAgIGogICAgayAgICBsICAgIDsgICAgOiAgICBdICovCiAgIDB4MUUsMHgxRiwweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjcsMHgyOCwweDJCLAogLyogeiAgICB4ICAgIGMgICAgdiAgICBiICAgIG4gICAgbSAgICAsICAgIC4gICAgLyAqLwogICAweDJDLDB4MkQsMHgyRSwweDJGLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LAogICAweDczIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfcXdlcnR5W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzMsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUywKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWScsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV80LFZLX09FTV82LAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMSxWS19PRU1fNyxWS19PRU1fNSwKICAgJ1onLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9xd2VydHlfanAxMDZbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICAnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNX01JTlVTLFZLX09FTV9QTFVTLFZLX09FTV8zLAogICAnUScsJ1cnLCdFJywnUicsJ1QnLCdZJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzQsVktfT0VNXzYsCiAgICdBJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLFZLX09FTV8xLFZLX09FTV83LFZLX09FTV81LAogICAnWicsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X3F3ZXJ0eV9tYWNqcFtNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgICcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fTUlOVVMsVktfT0VNXzcsVktfT0VNXzUsCiAgICdRJywnVycsJ0UnLCdSJywnVCcsJ1knLCdVJywnSScsJ08nLCdQJyxWS19PRU1fMyxWS19PRU1fNCwKICAgJ0EnLCdTJywnRCcsJ0YnLCdHJywnSCcsJ0onLCdLJywnTCcsVktfT0VNX1BMVVMsVktfT0VNXzEsVktfT0VNXzYsCiAgICdaJywnWCcsJ0MnLCdWJywnQicsJ04nLCdNJyxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCxWS19PRU1fMiwKICAgVktfT0VNXzEwMiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfcXdlcnR5X3YyW01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzUsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9QTFVTLFZLX09FTV80LAogICAnUScsJ1cnLCdFJywnUicsJ1QnLCdZJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzYsVktfT0VNXzEsCiAgICdBJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLFZLX09FTV8zLFZLX09FTV83LFZLX09FTV8yLAogICAnWicsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNX01JTlVTLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9xd2VydHpbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICBWS19PRU1fMywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNX01JTlVTLFZLX09FTV9QTFVTLAogICAnUScsJ1cnLCdFJywnUicsJ1QnLCdaJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzQsVktfT0VNXzYsCiAgICdBJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLFZLX09FTV8xLFZLX09FTV83LFZLX09FTV81LAogICAnWScsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X2FibnRfcXdlcnR5W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzMsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUywKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWScsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV80LFZLX09FTV82LAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMSxWS19PRU1fOCxWS19PRU1fNSwKICAgVktfT0VNXzcsJ1onLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLAogICBWS19PRU1fMTAyLCAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfYXplcnR5W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzcsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV80LFZLX09FTV9QTFVTLAogICAnQScsJ1onLCdFJywnUicsJ1QnLCdZJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzYsVktfT0VNXzEsCiAgICdRJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLCdNJyxWS19PRU1fMyxWS19PRU1fNSwKICAgJ1cnLCdYJywnQycsJ1YnLCdCJywnTicsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsVktfT0VNXzgsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X2R2b3Jha1tNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV8zLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fNCxWS19PRU1fNiwKICAgVktfT0VNXzcsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsJ1AnLCdZJywnRicsJ0cnLCdDJywnUicsJ0wnLFZLX09FTV8yLFZLX09FTV9QTFVTLAogICAnQScsJ08nLCdFJywnVScsJ0knLCdEJywnSCcsJ1QnLCdOJywnUycsVktfT0VNX01JTlVTLFZLX09FTV81LAogICBWS19PRU1fMSwnUScsJ0onLCdLJywnWCcsJ0InLCdNJywnVycsJ1YnLCdaJywKICAgVktfT0VNXzEwMiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCi8qKiogREVGSU5FIFlPVVIgTkVXIExBTkdVQUdFLVNQRUNJRklDIE1BUFBJTkdTIEJFTE9XLCBTRUUgRVhJU1RJTkcgVEFCTEVTICovCgovKiB0aGUgVksgbWFwcGluZ3MgZm9yIHRoZSBtYWluIGtleWJvYXJkIHdpbGwgYmUgYXV0by1hc3NpZ25lZCBhcyBiZWZvcmUsCiAgIHNvIHdoYXQgd2UgaGF2ZSBoZXJlIGlzIGp1c3QgdGhlIGNoYXJhY3RlciB0YWJsZXMgKi8KLyogb3JkZXI6IE5vcm1hbCwgU2hpZnQsIEFsdEdyLCBTaGlmdC1BbHRHciAqLwovKiBXZSByZWNvbW1lbmQgeW91IHdyaXRlIGp1c3Qgd2hhdCBpcyBndWFyYW50ZWVkIHRvIGJlIGNvcnJlY3QgKGkuZS4gd2hhdCdzCiAgIHdyaXR0ZW4gb24gdGhlIGtleWNhcHMpLCBub3QgdGhlIGJ1bmNoIG9mIHNwZWNpYWwgY2hhcmFjdGVycyBiZWhpbmQgQWx0R3IKICAgYW5kIFNoaWZ0LUFsdEdyIGlmIGl0IGNhbiB2YXJ5IGFtb25nIGRpZmZlcmVudCBYIHNlcnZlcnMgKi8KLyogVGhlc2UgdGFibGVzIHNlcnZlIHRvIGd1ZXNzIHRoZSBrZXlib2FyZCB0eXBlIGFuZCBzY2FuY29kZSBtYXBwaW5nLgogICBDb21wbGV0ZSBtb2RlbGluZyBpcyBub3QgaW1wb3J0YW50LCBpZGVudGlmaWNhdGlvbi9kaXNjcmltaW5hdGlvbiBpcy4gKi8KLyogUmVtZW1iZXIgdGhhdCB5b3VyIDEwMm5kIGtleSAodG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpIHNob3VsZCBiZSBvbiBhCiAgIHNlcGFyYXRlIGxpbmUsIHNlZSBleGlzdGluZyB0YWJsZXMgKi8KLyogSWYgV2luZSBmYWlscyB0byBtYXRjaCB5b3VyIG5ldyB0YWJsZSwgdXNlIFdJTkVERUJVRz0ra2V5IHRvIGZpbmQgb3V0IHdoeSAqLwovKiBSZW1lbWJlciB0byBhbHNvIGFkZCB5b3VyIG5ldyB0YWJsZSB0byB0aGUgbGF5b3V0IGluZGV4IHRhYmxlIGZhciBiZWxvdyEgKi8KCi8qKiogVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQgKG1vc3RseSBjb250cmlidXRlZCBieSBVd2UgQm9ubmVzKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VU1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiW3siLCJdfSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzoiLCInXCIiLCJcXHwiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/Igp9OwoKLyoqKiBVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCAocGhhbnRvbSBrZXkgdmVyc2lvbikgKi8KLyogKFhGcmVlODYgcmVwb3J0cyB0aGUgPD4ga2V5IGV2ZW4gaWYgaXQncyBub3QgcGh5c2ljYWxseSB0aGVyZSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVVNfcGhhbnRvbVtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiW3siLCJdfSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzoiLCInXCIiLCJcXHwiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChkdm9yYWsgdmVyc2lvbikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVVNfZHZvcmFrW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiW3siLCJdfSIsCiAiJ1wiIiwiLDwiLCIuPiIsInBQIiwieVkiLCJmRiIsImdHIiwiY0MiLCJyUiIsImxMIiwiLz8iLCI9KyIsCiAiYUEiLCJvTyIsImVFIiwidVUiLCJpSSIsImREIiwiaEgiLCJ0VCIsIm5OIiwic1MiLCItXyIsIlxcfCIsCiAiOzoiLCJxUSIsImpKIiwia0siLCJ4WCIsImJCIiwibU0iLCJ3VyIsInZWIiwieloiCn07CgovKioqIEJyaXRpc2gga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VLW01BSU5fTEVOXVs0XSA9CnsKICJgIiwiMSEiLCIyXCIiLCIzoyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJbeyIsIl19IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OiIsIidAIiwiI34iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICJcXHwiCn07CgovKioqIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBmcikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfRlJbTUFJTl9MRU5dWzRdID0KewogIrIiLCImMSIsIukyIiwiXCIzIiwiJzQiLCIoNSIsIi02Iiwi6DciLCJfOCIsIuc5Iiwi4DAiLCIpsCIsIj0rIiwKICJhQSIsInpaIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIl6oIiwiJKMiLAogInFRIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIm1NIiwi+SUiLCIqtSIsCiAid1ciLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwiLD8iLCI7LiIsIjovIiwiIaciLAogIjw+Igp9OwoKLyoqKiBJY2VsYW5kaWMga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgaXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0lTW01BSU5fTEVOXVs0XSA9CnsKICKwIiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9Iiwi9tYiLCItXyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLw0CIsIic/IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLmxiIsIrTEIiwiKyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIv7eIiwKICI8PiIKfTsKCi8qIEFsbCBnZXJtYW4ga2V5YiBsYXlvdXQgdGFibGVzIGhhdmUgdGhlIGFjdXRlL2Fwb3N0cm9waGUgc3ltYm9sIG5leHQgdG8KICogdGhlIEJBQ0tTUEFDRSBrZXkgcmVtb3ZlZCAocmVwbGFjZWQgd2l0aCBOVUxMIHdoaWNoIGlzIGlnbm9yZWQgYnkgdGhlCiAqIGRldGVjdGlvbiBjb2RlKS4KICogVGhpcyB3YXMgZG9uZSBiZWNhdXNlIHRoZSBtYXBwaW5nIG9mIHRoZSBhY3V0ZSAoYW5kIGFwb3N0cm9waGUpIGlzIGRvbmUKICogZGlmZmVyZW50bHkgaW4gdmFyaW91cyB4a2ItZGF0YS94a2V5Ym9hcmQtY29uZmlnIHZlcnNpb25zLiBTb21lIHJlcGxhY2UKICogdGhlIGFjdXRlIHdpdGggYSBub3JtYWwgYXBvc3Ryb3BoZSwgc28gdGhhdCB0aGUgYXBvc3Ryb3BoZSBpcyBmb3VuZCB0d2ljZQogKiBvbiB0aGUga2V5Ym9hcmQgKG9uZSBuZXh0IHRvIEJBQ0tTUEFDRSBhbmQgb25lIG5leHQgdG8gRU5URVIpLgogKiBPdGhlcnMgcHV0IHRoZSBhY3V0ZSBhbmQgZ3JhdmUgYWNjZW50cyBvbiB0aGUga2V5IGxlZnQgb2YgQkFDS1NQQUNFLgogKiBNb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBmZC5vIGJ1Z3RyYWNrZXI6CiAqIGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTExNTE0CiAqIEtleXMgcmVhY2hhYmxlIHZpYSBBbHRHciAoQCwgW10sIH4sIFwsIHwsIHt9KSBkaWZmZXIgY29tcGxldGVseQogKiBhbW9uZyBQQyBhbmQgTWFjIGtleWJvYXJkcywgc28gdGhlc2UgYXJlIG5vdCBsaXN0ZWQuCiAqLwoKLyoqKiBHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZGUgWy12YXJpYW50IG5vZGVhZGtleXN8ZGVhZGFjdXRlIGV0Yy5dKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9ERVtNQUlOX0xFTl1bNF0gPQp7CiAiXrAiLCIxISIsIjJcIiIsIjOnIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCLfPyIsIiIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL83CIsIisqIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiIyciLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogU3dpc3MgR2VybWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGNoIC12YXJpYW50IGRlKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TR1tNQUlOX0xFTl1bNF0gPQp7CiAip7AiLCIxKyIsIjJcIiIsIjMqIiwiNOciLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIl5gIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIvzoIiwiqCEiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbpIiwi5OAiLCIkoyIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBTd2lzcyBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgY2ggLXZhcmlhbnQgZnIpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NGW01BSU5fTEVOXVs0XSA9CnsKICKnsCIsIjErIiwiMlwiIiwiMyoiLCI05yIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/IiwiXmAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi6PwiLCKoISIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi6fYiLCLg5CIsIiSjIiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIE5vcndlZ2lhbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IE92ZSBL5XZlbikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfTk9bTUFJTl9MRU5dWzRdID0KewogInynIiwiMSEiLCIyXCJAIiwiMyOjIiwiNKQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIis/IiwiXFxgtCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqhefiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi+NgiLCLmxiIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIERhbmlzaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBkaykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfREFbTUFJTl9MRU5dWzRdID0KewogIr2nIiwiMSEiLCIyXCIiLCIzIyIsIjSkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiKz8iLCK0YCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqheIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLmxiIsIvjYIiwiJyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogU3dlZGlzaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBzZSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0VbTUFJTl9MRU5dWzRdID0KewogIqe9IiwiMSEiLCIyXCIiLCIzIyIsIjSkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiKz8iLCK0YCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqheIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiJyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogRXN0b25pYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZWUpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0VUW01BSU5fTEVOXVs0XSA9CnsKICK3fiIsIjEhIiwiMlwiIiwiMyMiLCI0pCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIis/IiwitGAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi/NwiLCL11SIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIENhbmFkaWFuIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjYV9lbmhhbmNlZCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ0ZbTUFJTl9MRU5dWzRdID0KewogIiN8XFwiLCIxIbEiLCIyXCJAIiwiMy+jIiwiNCSiIiwiNSWkIiwiNj+sIiwiNyamIiwiOCqyIiwiOSizIiwiMCm8IiwiLV+9IiwiPSu+IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib0+nIiwicFC2IiwiXl5bIiwiuKhdIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7On4iLCJgYHsiLCI8Pn0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLCctIiwiLiIsIunJIiwKICKru7AiCn07CgovKioqIENhbmFkaWFuIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjYSAtdmFyaWFudCBmcikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ0FfZnJbTUFJTl9MRU5dWzRdID0KewogIiN8IiwiMSEiLCIyXCIiLCIzLyIsIjQkIiwiNSUiLCI2PyIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJeXiIsIrioIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OiIsImBgIiwiPD4iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLCciLCIuIiwi6ckiLAogIqu7Igp9OwoKLyoqKiBDYW5hZGlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjYSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ0FbTUFJTl9MRU5dWzRdID0KewogIi9cXCIsIjEhuaEiLCIyQLIiLCIzI7OjIiwiNCS8pCIsIjUlvSIsIjY/viIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9P+NgiLCJwUP7eIiwiXqioIiwi58d+IiwKICJhQebGIiwic1PfpyIsImRE8NAiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OrQiLCLoyCIsIuDAIiwKICJ6WiIsInhYIiwiY0OiqSIsInZWIiwiYkIiLCJuTiIsIm1NtboiLCIsJyIsIi5cIrf3Iiwi6ckiLAogIvnZIgp9OwoKLyoqKiBQb3J0dWd1ZXNlIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHB0KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9QVFtNQUlOX0xFTl1bNF0gPQp7CiAiXFx8IiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCKruyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCIrKiIsIrRgIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLnxyIsIrqqIiwifl4iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogSXRhbGlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBpdCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSVRbTUFJTl9MRU5dWzRdID0KewogIlxcfCIsIjEhIiwiMlwiIiwiM6MiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/Iiwi7F4iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi6OkiLCIrKiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi8uciLCLgsCIsIvmnIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEZpbm5pc2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZmkpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0ZJW01BSU5fTEVOXVs0XSA9CnsKICKnvSIsIjEhIiwiMlwiIiwiMyMiLCI0pCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIis/IiwitGAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi5cUiLCKoXiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEJ1bGdhcmlhbiBiZHMga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0JHX2Jkc1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4oKSIsIjEhIiwiMkAyPyIsIjMjMysiLCI0JDRcIiIsIjUlIiwiNl42PSIsIjcmNzoiLCI4KjgvIiwiOSgiLCIwKSIsIi1fLUkiLCI9Ky5WIiwKICJxUSz7Iiwid1fz0yIsImVF5cUiLCJyUujIIiwidFT42CIsInlZ+dkiLCJ1VerKIiwiaUnx0SIsIm9P5MQiLCJwUOfHIiwiW3v21iIsIl19OyIsCiAiYUH83CIsInNT/98iLCJkRODAIiwiZkbuziIsImdH5sYiLCJoSOPDIiwiakry0iIsImtL7c0iLCJsTOLCIiwiOzrszCIsIidcIvfXIiwiXFx8J9siLAogInpa/t4iLCJ4WOnJIiwiY0P62iIsInZW/d0iLCJiQvTUIiwibk711SIsIm1N788iLCIsPPDQIiwiLj7ryyIsIi8/4cEiLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogQnVsZ2FyaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9CR19waG9uZXRpY1tNQUlOX0xFTl1bNF0gPQp7CiAiYH731yIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVH/3yIsIndX4sIiLCJlReXFIiwiclLw0CIsInRU8tIiLCJ5WfraIiwidVXz0yIsImlJ6MgiLCJvT+7OIiwicFDvzyIsIlt7+NgiLCJdffnZIiwKICJhQeDAIiwic1Px0SIsImRE5MQiLCJmRvTUIiwiZ0fjwyIsImhI9dUiLCJqSunJIiwia0vqyiIsImxM68siLCI7OiIsIidcIiIsIlxcfP7eIiwKICJ6WufHIiwieFj83CIsImND9tYiLCJ2VubGIiwiYkLhwSIsIm5O7c0iLCJtTezMIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIEJlbGFydXNpYW4gc3RhbmRhcmQga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBIbGViIFZhbG9za2EpICovCi8qKiogSXQgbWF0Y2hlcyBCZWxhcnVzaWFuIGxheW91dCBmb3IgWEtCIGZyb20gQWxleGFuZGVyIE1pa2hhaWxpYW4gICAgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQllbTUFJTl9MRU5dWzRdID0KewogImB+o7MiLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRyuoiLCJ3V8PjIiwiZUXV9SIsInJSy+siLCJ0VMXlIiwieVnO7iIsInVVx+ciLCJpSdv7Iiwib0+uviIsInBQ2voiLCJbe8joIiwiXX0nJyIsCiAiYUHG5iIsInNT2fkiLCJkRNf3IiwiZkbB4SIsImdH0PAiLCJoSNLyIiwiakrP7yIsImtLzOwiLCJsTMTkIiwiOzrW9iIsIidcItz8IiwiXFx8L3wiLAogInpa0fEiLCJ4WN7+IiwiY0PT8yIsInZWze0iLCJiQqa2Iiwibk7U9CIsIm1N2PgiLCIsPMLiIiwiLj7A4CIsIi8/LiwiLCAiPD58piIsCn07CgoKLyoqKiBSdXNzaWFuIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgUGF2ZWwgUm9za2luKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVVtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRyuoiLCJ3V8PjIiwiZUXV9SIsInJSy+siLCJ0VMXlIiwieVnO7iIsInVVx+ciLCJpSdv7Iiwib0/d/SIsInBQ2voiLCJbe8joIiwiXX3f/yIsCiAiYUHG5iIsInNT2fkiLCJkRNf3IiwiZkbB4SIsImdH0PAiLCJoSNLyIiwiakrP7yIsImtLzOwiLCJsTMTkIiwiOzrW9iIsIidcItz8IiwiXFx8IiwKICJ6WtHxIiwieFje/iIsImND0/MiLCJ2Vs3tIiwiYkLJ6SIsIm5O1PQiLCJtTdj4IiwiLDzC4iIsIi4+wOAiLCIvPyIKfTsKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX3BoYW50b21bTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUcrqIiwid1fD4yIsImVF1fUiLCJyUsvrIiwidFTF5SIsInlZzu4iLCJ1VcfnIiwiaUnb+yIsIm9P3f0iLCJwUNr6IiwiW3vI6CIsIl193/8iLAogImFBxuYiLCJzU9n5IiwiZETX9yIsImZGweEiLCJnR9DwIiwiaEjS8iIsImpKz+8iLCJrS8zsIiwibEzE5CIsIjs61vYiLCInXCLc/CIsIlxcfCIsCiAielrR8SIsInhY3v4iLCJjQ9PzIiwidlbN7SIsImJCyekiLCJuTtT0IiwibU3Y+CIsIiw8wuIiLCIuPsDgIiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1SICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX2tvaThyW01BSU5fTEVOXVs0XSA9CnsKICIoKSIsIjEhIiwiMlwiIiwiMy8iLCI0JCIsIjU6IiwiNiwiLCI3LiIsIjg7IiwiOT8iLCIwJSIsIi1fIiwiPSsiLAogIsrqIiwiw+MiLCLV9SIsIsvrIiwixeUiLCLO7iIsIsfnIiwi2/siLCLd/SIsItr6IiwiyOgiLCLf/yIsCiAixuYiLCLZ+SIsItf3IiwiweEiLCLQ8CIsItLyIiwiz+8iLCLM7CIsIsTkIiwi1vYiLCLc/CIsIlxcfCIsCiAi0fEiLCLe/iIsItPzIiwize0iLCLJ6SIsItT0Iiwi2PgiLCLC4iIsIsDgIiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgY3AxMjUxICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX2NwMTI1MVtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFR6ckiLCJ3V/bWIiwiZUXz0yIsInJS6soiLCJ0VOXFIiwieVntzSIsInVV48MiLCJpSfjYIiwib0/52SIsInBQ58ciLCJbe/XVIiwiXX362iIsCiAiYUH01CIsInNT+9siLCJkROLCIiwiZkbgwCIsImdH788iLCJoSPDQIiwiakruziIsImtL68siLCJsTOTEIiwiOzrmxiIsIidcIv3dIiwiXFx8IiwKICJ6Wv/fIiwieFj31yIsImND8dEiLCJ2VuzMIiwiYkLoyCIsIm5O8tIiLCJtTfzcIiwiLDzhwSIsIi4+/t4iLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBSdXNzaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVV9waG9uZXRpY1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFR0fEiLCJ3V9f3IiwiZUXF5SIsInJS0vIiLCJ0VNT0IiwieVnZ+SIsInVV1fUiLCJpScnpIiwib0/P7yIsInBQ0PAiLCJbe9v7IiwiXX3d/SIsCiAiYUHB4SIsInNT0/MiLCJkRMTkIiwiZkbG5iIsImdHx+ciLCJoSMjoIiwiakrK6iIsImtLy+siLCJsTMzsIiwiOzoiLCInXCIiLCJcXHwiLAogInpa2voiLCJ4WNj4IiwiY0PD4yIsInZW1vYiLCJiQsLiIiwibk7O7iIsIm1Nze0iLCIsPCIsIi4+IiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogVWtyYWluaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVUgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVUFbTUFJTl9MRU5dWzRdID0KewogImB+rb0iLCIxITEhIiwiMkAyXCIiLCIzIzMnIiwiNCQ0KiIsIjUlNToiLCI2XjYsIiwiNyY3LiIsIjgqODsiLCI5KDkoIiwiMCkwKSIsIi1fLV8iLCI9Kz0rIiwKICJxUcrqIiwid1fD4yIsImVF1fUiLCJyUsvrIiwidFTF5SIsInlZzu4iLCJ1VcfnIiwiaUnb+yIsIm9P3f0iLCJwUNr6IiwiW3vI6CIsIl19p7ciLAogImFBxuYiLCJzU6a2IiwiZETX9yIsImZGweEiLCJnR9DwIiwiaEjS8iIsImpKz+8iLCJrS8zsIiwibEzE5CIsIjs61vYiLCInXCKktCIsIlxcfFxcfCIsCiAielrR8SIsInhY3v4iLCJjQ9PzIiwidlbN7SIsImJCyekiLCJuTtT0IiwibU3Y+CIsIiw8wuIiLCIuPsDgIiwiLz8vPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBVa3JhaW5pYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtVSBieSBPLiBOeWt5Zm9yY2h5biAqLwovKioqICAoYXMgaXQgYXBwZWFycyBvbiBtb3N0IG9mIGtleWJvYXJkcyBzb2xkIHRvZGF5KSAgICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VBX3N0ZFtNQUlOX0xFTl1bNF0gPQp7CiAirb0iLCIxISIsIjJcIiIsIjMnIiwiNDsiLCI1JSIsIjY6IiwiNz8iLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICLK6iIsIsPjIiwi1fUiLCLL6yIsIsXlIiwizu4iLCLH5yIsItv7Iiwi3f0iLCLa+iIsIsjoIiwip7ciLAogIsbmIiwiprYiLCLX9yIsIsHhIiwi0PAiLCLS8iIsIs/vIiwizOwiLCLE5CIsItb2IiwipLQiLCJcXC8iLAogItHxIiwi3v4iLCLT8yIsIs3tIiwiyekiLCLU9CIsItj4IiwiwuIiLCLA4CIsIi4sIiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtUiAocGFpciB0byB0aGUgcHJldmlvdXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX3N0ZFtNQUlOX0xFTl1bNF0gPQp7CiAio7MiLCIxISIsIjJcIiIsIjMnIiwiNDsiLCI1JSIsIjY6IiwiNz8iLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICLK6iIsIsPjIiwi1fUiLCLL6yIsIsXlIiwizu4iLCLH5yIsItv7Iiwi3f0iLCLa+iIsIsjoIiwi3/8iLAogIsbmIiwi2fkiLCLX9yIsIsHhIiwi0PAiLCLS8iIsIs/vIiwizOwiLCLE5CIsItb2Iiwi3PwiLCJcXC8iLAogItHxIiwi3v4iLCLT8yIsIs3tIiwiyekiLCLU9CIsItj4IiwiwuIiLCLA4CIsIi4sIiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFNwYW5pc2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0VTW01BSU5fTEVOXVs0XSA9CnsKICK6qiIsIjEhIiwiMlwiIiwiM7ciLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/Iiwiob8iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiYF4iLCIrKiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi8dEiLCK0qCIsIufHIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEJlbGdpYW4ga2V5Ym9hcmQgbGF5b3V0ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQkVbTUFJTl9MRU5dWzRdID0KewogIiIsIiYxfCIsIukyQCIsIlwiMyMiLCInNCIsIig1IiwipzZeIiwi6DciLCIhOCIsIuc5eyIsIuAwfSIsIimwIiwiLV8iLAogImFBIiwieloiLCJlRaQiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIl6oWyIsIiQqXSIsCiAicVEiLCJzU98iLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIm1NIiwi+SW0IiwitaNgIiwKICJ3VyIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCIsPyIsIjsuIiwiOi8iLCI9K34iLAogIjw+XFwiCn07CgovKioqIEh1bmdhcmlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBodSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSFVbTUFJTl9MRU5dWzRdID0KewogIjCnIiwiMSciLCIyXCIiLCIzKyIsIjQhIiwiNSUiLCI2LyIsIjc9IiwiOCgiLCI5KSIsIvbWIiwi/NwiLCLz0yIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL11SIsIvraIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLpySIsIuHBIiwi+9siLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLD8iLCIuOiIsIi1fIiwKICLtzSIKfTsKCi8qKiogUG9saXNoIChwcm9ncmFtbWVyJ3MpIGtleWJvYXJkIGxheW91dCAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1BMW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmpyIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRerKIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9P89MiLCJwUCIsIlt7IiwiXX0iLAogImFBsaEiLCJzU7amIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEyzoyIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6Wr+vIiwieFi8rCIsImND5sYiLCJ2ViIsImJCIiwibk7x0SIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICI8PnwiCn07CgovKioqIFNsb3ZlbmlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBzaSkgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TSVtNQUlOX0xFTl1bNF0gPQp7CiAiuKgiLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIisqIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIrmpIiwi8NAiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIujIIiwi5sYiLCK+riIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBTZXJiaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHNyKSAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NSW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/IiwiKyoiLAogIqm5IiwiqroiLCLF5SIsItLyIiwi1PQiLCLa+iIsItX1IiwiyekiLCLP7yIsItDwIiwi2/siLCJbXSIsCiAiweEiLCLT8yIsIsTkIiwixuYiLCLH5yIsIsjoIiwiqLgiLCLL6yIsIszsIiwi3v4iLCKruyIsIi1fIiwKICKhsSIsIq+/Iiwiw+MiLCLX9yIsIsLiIiwizu4iLCLN7SIsIiw7IiwiLjoiLCLW9iIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBTZXJiaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHVzLHNyKSAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTX1NSW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAyXCIiLCIzIyIsIjQkIiwiNSUiLCI2XjYmIiwiNyY3LyIsIjgqOCgiLCI5KDkpIiwiMCkwPSIsIi1fJz8iLCI9KysqIiwKICJxUam5Iiwid1equiIsImVFxeUiLCJyUtLyIiwidFTU9CIsInlZ2voiLCJ1VdX1IiwiaUnJ6SIsIm9Pz+8iLCJwUNDwIiwiW3vb+yIsIl19W10iLAogImFBweEiLCJzU9PzIiwiZETE5CIsImZGxuYiLCJnR8fnIiwiaEjI6CIsImpKqLgiLCJrS8vrIiwibEzM7CIsIjs63v4iLCInXCKruyIsIlxcfC1fIiwKICJ6WqGxIiwieFivvyIsImNDw+MiLCJ2Vtf3IiwiYkLC4iIsIm5Ozu4iLCJtTc3tIiwiLDwsOyIsIi4+LjoiLCIvP9b2IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIENyb2F0aWFuIGtleWJvYXJkIGxheW91dCBzcGVjaWZpYyBmb3IgbWUgPGplbGx5QHNyay5mZXIuaHI+ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSFJfamVsbHlbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7uakiLCJdffDQIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OujIIiwiJ1wi5sYiLCJcXHy+riIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIjw+fCIKfTsKCi8qKiogQ3JvYXRpYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgaHIpICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSFJbTUFJTl9MRU5dWzRdID0KewogIrioIiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCIrKiIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCK5qSIsIvDQIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLoyCIsIubGIiwivq4iLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi8/IiwKICI8PiIKfTsKCi8qKiogSmFwYW5lc2UgMTA2IGtleWJvYXJkIGxheW91dCAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0pBX2pwMTA2W01BSU5fTEVOXVs0XSA9CnsKICIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNyciLCI4KCIsIjkpIiwiMH4iLCItPSIsIl5+IiwiXFx8IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIkBgIiwiW3siLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjsrIiwiOioiLCJdfSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIlxcXyIsCn07CgpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9KQV9tYWNqcFtNQUlOX0xFTl1bNF0gPQp7CiAiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcnIiwiOCgiLCI5KSIsIjAiLCItPSIsIl5+IiwiXFx8IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIkBgIiwiW3siLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjsrIiwiOioiLCJdfSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIl9fIiwKfTsKCi8qKiogSmFwYW5lc2UgcGM5OHgxIGtleWJvYXJkIGxheW91dCAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0pBX3BjOTh4MVtNQUlOX0xFTl1bNF0gPQp7CiAiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcnIiwiOCgiLCI5KSIsIjAiLCItPSIsIl5gIiwiXFx8IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIkB+IiwiW3siLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjsrIiwiOioiLCJdfSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIlxcXyIsCn07CgovKioqIEJyYXppbGlhbiBBQk5ULTIga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBSYXVsIEdvbWVzIEZlcm5hbmRlcykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUFRfYnJbTUFJTl9MRU5dWzRdID0KewogIidcIiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2qCIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCK0YCIsIlt7IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLnxyIsIn5eIiwiXX0iLAogIlxcfCIsInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIjs6IiwiLz8iLAp9OwoKLyoqKiBCcmF6aWxpYW4gQUJOVC0yIGtleWJvYXJkIGxheW91dCB3aXRoIDxBTFQgR1I+IChjb250cmlidXRlZCBieSBNYXVybyBDYXJ2YWxobyBDaGVoYWIpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1BUX2JyX2FsdF9ncltNQUlOX0xFTl1bNF0gPQp7CiAiJ1wiIiwiMSE5IiwiMkAyIiwiMyMzIiwiNCQjIiwiNSVcIiIsIjYoLCIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyciLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiNGAiLCJbeyoiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsImdHIiwifl4iLCJdfToiLAogIlxcfCIsInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIjs6IiwiLz8wIgp9OwoKLyoqKiBVUyBpbnRlcm5hdGlvbmFsIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgR3VzdGF2byBOb3JvbmhhIChrb3ZAZGViaWFuLm9yZykpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTX2ludGxbTUFJTl9MRU5dWzRdID0KewogICJgfiIsICIxISIsICIyQCIsICIzIyIsICI0JCIsICI1JSIsICI2XiIsICI3JiIsICI4KiIsICI5KCIsICIwKSIsICItXyIsICI9KyIsICJcXHwiLAogICJxUSIsICJ3VyIsICJlRSIsICJyUiIsICJ0VCIsICJ5WSIsICJ1VSIsICJpSSIsICJvTyIsICJwUCIsICJbeyIsICJdfSIsCiAgImFBIiwgInNTIiwgImREIiwgImZGIiwgImdHIiwgImhIIiwgImpKIiwgImtLIiwgImxMIiwgIjs6IiwgIidcIiIsCiAgInpaIiwgInhYIiwgImNDIiwgInZWIiwgImJCIiwgIm5OIiwgIm1NIiwgIiw8IiwgIi4+IiwgIi8/Igp9OwoKLyoqKiBTbG92YWsga2V5Ym9hcmQgbGF5b3V0IChzZWUgY3Nza19pYm0oc2tfcXdlcnR5KSBpbiB4a2JzZWwpCiAgLSBkZWFkX2Fib3ZlcmluZyByZXBsYWNlZCB3aXRoIGRlZ3JlZSAtIG5vIHN5bWJvbCBpbiBpc284ODU5LTIKICAtIGJyb2tlbmJhciByZXBsYWNlZCB3aXRoIGJhcgkJCQkJKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0tbTUFJTl9MRU5dWzRdID0KewogIjswIiwiKzEiLCK1MiIsIrkzIiwi6DQiLCK7NSIsIr42Iiwi/TciLCLhOCIsIu05Iiwi6TAiLCI9JSIsIid2IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIvovIiwi5CgiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvRcIiIsIqchIiwi8ikiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLD8iLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogQ3plY2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgY3opICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NaW01BSU5fTEVOXVs0XSA9CnsKICI7IiwiKzEiLCLsMiIsIrkzIiwi6DQiLCL4NSIsIr42Iiwi/TciLCLhOCIsIu05Iiwi6TAiLCI9JSIsIrS3IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIvovIiwiKSgiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvlcIiIsIqchIiwiqCciLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLD8iLCIuOiIsIi1fIiwKICJcXCIKfTsKCi8qKiogQ3plY2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgY3pfcXdlcnR5KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9DWl9xd2VydHlbTUFJTl9MRU5dWzRdID0KewogIjsiLCIrMSIsIuwyIiwiuTMiLCLoNCIsIvg1IiwivjYiLCL9NyIsIuE4Iiwi7TkiLCLpMCIsIj0lIiwitLciLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi+i8iLCIpKCIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi+VwiIiwipyEiLCKoJyIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPyIsIi46IiwiLV8iLAogIlxcIgp9OwoKLyoqKiBTbG92YWsgYW5kIEN6ZWNoIChwcm9ncmFtbWVyJ3MpIGtleWJvYXJkIGxheW91dCAoc2VlIGNzc2tfZHVhbChjc19za191Y3cpKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TS19wcm9nW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVHkxCIsIndX7MwiLCJlRenJIiwiclL42CIsInRUu6siLCJ5Wf3dIiwidVX52SIsImlJ7c0iLCJvT/PTIiwicFD21iIsIlt7IiwiXX0iLAogImFB4cEiLCJzU7mpIiwiZETvzyIsImZG68siLCJnR+DAIiwiaEj62iIsImpK/NwiLCJrS/TUIiwibEy1pSIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6Wr6uIiwieFikIiwiY0PoyCIsInZW58ciLCJiQiIsIm5O8tIiLCJtTeXFIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIKfTsKCi8qKiogQ3plY2gga2V5Ym9hcmQgbGF5b3V0IChzZWUgY3Nza19pYm0oY3NfcXdlcnR5KSBpbiB4a2JzZWwpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NTW01BSU5fTEVOXVs0XSA9CnsKICI7IiwiKzEiLCLsMiIsIrkzIiwi6DQiLCL4NSIsIr42Iiwi/TciLCLhOCIsIu05Iiwi6TC9KSIsIj0lIiwiIiwKICJxUVxcIiwid1d8IiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIvovW3siLCIpKF19IiwKICJhQSIsInNT8CIsImRE0CIsImZGWyIsImdHXSIsImhIIiwiakoiLCJrS7MiLCJsTKMiLCL5XCIkIiwipyHfIiwiqCciLAogInpaPiIsInhYIyIsImNDJiIsInZWQCIsImJCeyIsIm5OfSIsIm1NIiwiLD88IiwiLjo+IiwiLV8qIiwKICI8PlxcfCIKfTsKCi8qKiogTGF0aW4gQW1lcmljYW4ga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBHYWJyaWVsIE9ybGFuZG8gR2FyY2lhKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9MQVtNQUlOX0xFTl1bNF0gPQp7CiAifLAiLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIr+hIiwKICJxUUAiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCK0qCIsIisqIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLx0SIsIntbXiIsIn1dIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIExpdGh1YW5pYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgbHQpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0xUX0JbTUFJTl9MRU5dWzRdID0KewogImB+Iiwi4MAiLCLoyCIsIubGIiwi68siLCLhwSIsIvDQIiwi+NgiLCL72yIsIqUoIiwitCkiLCItXyIsIv7eIiwiXFx8IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiqqwiCn07CgovKioqIFR1cmtpc2gga2V5Ym9hcmQgTGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1RLW01BSU5fTEVOXVs0XSA9CnsKIlwi6SIsIjEhIiwiMiciLCIzXiMiLCI0KyQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19IiwiKj9cXCIsIi1fIiwKInFRQCIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsIv1J7iIsIm9PIiwicFAiLCLw0CIsIvzcfiIsCiJhQeYiLCJzU98iLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIv7eIiwiad0iLCIsO2AiLAoieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCL21iIsIufHIiwiLjoiCn07CgovKioqIFR1cmtpc2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgdHIpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1RSW01BSU5fTEVOXVs0XSA9CnsKIlwiXFwiLCIxISIsIjInIiwiM14iLCI0KyIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIio/IiwiLV8iLAoicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJceGI5SSIsIm9PIiwicFAiLCJceGJiXHhhYiIsIvzcIiwKImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIlx4YmFceGFhIiwiaVwwIiwiLDsiLAoieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCL21iIsIufHIiwiLjoiLAoiPD4iCn07CgovKioqIFR1cmtpc2ggRiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCB0cmYpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1RSX0ZbTUFJTl9MRU5dWzRdID0KewoiKyoiLCIxISIsIjJcIiIsIjNeIyIsIjQkIiwiNSUiLCI2JiIsIjcnIiwiOCgiLCI5KSIsIjA9IiwiLz8iLCItXyIsCiJmRiIsImdHIiwiXHhiYlx4YWIiLCJceGI5SSIsIm9PIiwiZEQiLCJyUiIsIm5OIiwiaEgiLCJwUCIsInFRIiwid1ciLAoidVUiLCJpXDAiLCJlRSIsImFBIiwi/NwiLCJ0VCIsImtLIiwibU0iLCJsTCIsInlZIiwiXHhiYVx4YWEiLCJ4WCIsCiJqSiIsIvbWIiwidlYiLCJjQyIsIufHIiwieloiLCJzUyIsImJCIiwiLjoiLCIsOyIsCiI8PiIKfTsKCi8qKiogSXNyYWVsaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHVzLGlsKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9JTFtNQUlOX0xFTl1bNF0gPQp7CiAiYH47IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUS8iLCJ3VyciLCJlRfciLCJyUvgiLCJ0VOAiLCJ5WegiLCJ1VeUiLCJpSe8iLCJvT+0iLCJwUPQiLCJbeyIsIl19IiwKICJhQfkiLCJzU+MiLCJkROIiLCJmRusiLCJnR/IiLCJoSOkiLCJqSuciLCJrS+wiLCJsTOoiLCI7OvMiLCJcJ1wiLCIsIlxcfCIsCiAielrmIiwieFjxIiwiY0PhIiwidlbkIiwiYkLwIiwibk7uIiwibU32IiwiLDz6IiwiLj71IiwiLz8uIiwKICI8PiIKfTsKCi8qKiogSXNyYWVsaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHVzLGlsX3Bob25ldGljKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9JTF9waG9uZXRpY1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFR9yIsIndX5SIsImVF4CIsInJS+CIsInRU+iIsInlZ8iIsInVV5SIsImlJ6SIsIm9P8SIsInBQ9CIsIlt7IiwiXX0iLAogImFB4CIsInNT+SIsImRE4yIsImZG9CIsImdH4iIsImhI5CIsImpK6SIsImtL6yIsImxM7CIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WuYiLCJ4WOciLCJjQ/YiLCJ2VuUiLCJiQuEiLCJuTvAiLCJtTe4iLCIsPCIsIi4+IiwiLz8iLAogIjw+Igp9OwoKLyoqKiBJc3JhZWxpYW4gU2FoYXJvbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCAtc3ltYm9scyAidXMocGMxMDUpK2lsX3NhaGFyb24iKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9JTF9zYWhhcm9uW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVH3Iiwid1fxIiwiZUUiLCJyUvgiLCJ0VOgiLCJ5WeMiLCJ1VSIsImlJIiwib08iLCJwUPQiLCJbeyIsIl19IiwKICJhQeAiLCJzU+UiLCJkROwiLCJmRvoiLCJnR+IiLCJoSOQiLCJqSvkiLCJrS+siLCJsTOkiLCI7OiIsIidcIiIsIlxcfCIsCiAielrmIiwieFjnIiwiY0P2IiwidlbyIiwiYkLhIiwibk7wIiwibU3uIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIKfTsKCi8qKiogR3JlZWsga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBLcml0b24gS3lyaW1pcyA8a3lyaW1pc0BjdGkuZ3I+KQogIEdyZWVrIGNoYXJhY3RlcnMgZm9yICJ3VyIgYW5kICJzUyIgYXJlIG9taXR0ZWQgdG8gbm90IHByb2R1Y2UgYSBtaXNtYXRjaAogIG1lc3NhZ2Ugc2luY2UgdGhleSBoYXZlIGRpZmZlcmVudCBjaGFyYWN0ZXJzIGluIGdyIGFuZCBlbCBYRnJlZTg2IGxheW91dHMuICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0VMW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVE7OiIsIndXIiwiZUXlxSIsInJS8dEiLCJ0VPTUIiwieVn11SIsInVV6MgiLCJpSenJIiwib0/vzyIsInBQ8NAiLCJbeyIsIl19IiwKICJhQeHBIiwic1MiLCJkROTEIiwiZkb21iIsImdH48MiLCJoSOfHIiwiakruziIsImtL6soiLCJsTOvLIiwiOzq0qCIsIidcIiIsIlxcfCIsCiAielrmxiIsInhY99ciLCJjQ/jYIiwidlb52SIsImJC4sIiLCJuTu3NIiwibU3szCIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iCn07CgovKioqIFRoYWkgKEtlZG1hbmVlKSBrZXlib2FyZCBsYXlvdXQgYnkgU3VwcGhhY2hva2UgU3VudGl3aWNoYXlhIDxtcmNob2tlQG9wZW50bGUub3JnPiAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV90aFtNQUlOX0xFTl1bNF0gPQp7CiAiYH5fJSIsIjEh5SsiLCIyQC/xIiwiMyMt8iIsIjQkwPMiLCI1Jbb0IiwiNl7Y2SIsIjcm1t8iLCI4KqT1IiwiOSi19iIsIjApqPciLCItX6L4IiwiPSuq+SIsCiAicVHm8CIsIndX5FwiIiwiZUXTriIsInJSvrEiLCJ0VNC4IiwieVnR7SIsInVV1eoiLCJpScOzIiwib0+5zyIsInBQwq0iLCJbe7qwIiwiXX3FLCIsCiAiYUG/xCIsInNTy6YiLCJkRKGvIiwiZka04iIsImdH4KwiLCJoSOnnIiwiakro6yIsImtL0skiLCJsTMrIIiwiOzrHqyIsIlwnXCKnLiIsIlxcfKOlIiwKICJ6WrwoIiwieFi7KSIsImND4akiLCJ2Vs3OIiwiYkLaIiwibk7X7CIsIm1Ntz8iLCIsPMGyIiwiLj7jzCIsIi8/vcYiCn07IAoKLyoqKiBWTkMga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3NjYW5fdm5jW01BSU5fTEVOXSA9CnsKICAgMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDBDLDB4MEQsMHgxQSwweDFCLDB4MjcsMHgyOCwweDI5LDB4MzMsMHgzNCwweDM1LDB4MkIsCiAgIDB4MUUsMHgzMCwweDJFLDB4MjAsMHgxMiwweDIxLDB4MjIsMHgyMywweDE3LDB4MjQsMHgyNSwweDI2LDB4MzIsMHgzMSwweDE4LDB4MTksMHgxMCwweDEzLDB4MUYsMHgxNCwweDE2LDB4MkYsMHgxMSwweDJELDB4MTUsMHgyQywKICAgMHg1Ngp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV92bmNbTUFJTl9MRU5dID0KewogICAnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNX01JTlVTLFZLX09FTV9QTFVTLFZLX09FTV80LFZLX09FTV82LFZLX09FTV8xLFZLX09FTV83LFZLX09FTV8zLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLFZLX09FTV81LAogICAnQScsJ0InLCdDJywnRCcsJ0UnLCdGJywnRycsJ0gnLCdJJywnSicsJ0snLCdMJywnTScsJ04nLCdPJywnUCcsJ1EnLCdSJywnUycsJ1QnLCdVJywnVicsJ1cnLCdYJywnWScsJ1onLAogICBWS19PRU1fMTAyCn07CgpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV92bmNbTUFJTl9MRU5dWzRdID0KewogIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsIlt7IiwiXX0iLCI7OiIsIidcIiIsImB+IiwiLDwiLCIuPiIsIi8/IiwiXFx8IiwKICJhQSIsImJCIiwiY0MiLCJkRCIsImVFIiwiZkYiLCJnRyIsImhIIiwiaUkiLCJqSiIsImtLIiwibEwiLCJtTSIsIm5OIiwib08iLCJwUCIsInFRIiwiclIiLCJzUyIsInRUIiwidVUiLCJ2ViIsIndXIiwieFgiLCJ5WSIsInpaIgp9OwoKLyoqKiBEdXRjaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBubCkgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9OTFtNQUlOX0xFTl1bNF0gPQp7CiAiQKciLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiN18iLCI4KCIsIjkpIiwiMCciLCIvPyIsIrB+IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIqh+IiwiKnwiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIiuxIiwiJ2AiLCI8PiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLT0iLAogIltdIgp9OwoKCgovKioqIExheW91dCB0YWJsZS4gQWRkIHlvdXIga2V5Ym9hcmQgbWFwcGluZ3MgdG8gdGhpcyBsaXN0ICovCnN0YXRpYyBjb25zdCBzdHJ1Y3QgewogICAgTENJRCBsY2lkOyAvKiBpbnB1dCBsb2NhbGUgaWRlbnRpZmllciwgbG9vayBmb3IgTE9DQUxFX0lMQU5HVUFHRQogICAgICAgICAgICAgICAgIGluIHRoZSBhcHByb3ByaWF0ZSBkbGxzL2tlcm5lbC9ubHMvLm5scyBmaWxlICovCiAgICBjb25zdCBjaGFyICpjb21tZW50OwogICAgY29uc3QgY2hhciAoKmtleSlbTUFJTl9MRU5dWzRdOwogICAgY29uc3QgV09SRCAoKnNjYW4pW01BSU5fTEVOXTsgLyogc2NhbiBjb2RlcyBtYXBwaW5nICovCiAgICBjb25zdCBXT1JEICgqdmtleSlbTUFJTl9MRU5dOyAvKiB2aXJ0dWFsIGtleSBjb2RlcyBtYXBwaW5nICovCn0gbWFpbl9rZXlfdGFiW109ewogezB4MDQwOSwgIlVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1VTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA5LCAiVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pIiwgJm1haW5fa2V5X1VTX3BoYW50b20sICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDksICJVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCAoZHZvcmFrKSIsICZtYWluX2tleV9VU19kdm9yYWssICZtYWluX2tleV9zY2FuX2R2b3JhaywgJm1haW5fa2V5X3ZrZXlfZHZvcmFrfSwKIHsweDA0MDksICJVbml0ZWQgU3RhdGVzIEludGVybmF0aW9uYWwga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1VTX2ludGwsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA4MDksICJCcml0aXNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9VSywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwNywgIkdlcm1hbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfREUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDA4MDcsICJTd2lzcyBHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1NHLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgxMDBjLCAiU3dpc3MgRnJlbmNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9TRiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDQxZCwgIlN3ZWRpc2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1NFLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eV92Mn0sCiB7MHgwNDI1LCAiRXN0b25pYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0VULCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE0LCAiTm9yd2VnaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9OTywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwNiwgIkRhbmlzaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfREEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGMsICJGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0ZSLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X2F6ZXJ0eX0sCiB7MHgwYzBjLCAiQ2FuYWRpYW4gRnJlbmNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9DRiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MGMwYywgIkNhbmFkaWFuIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKENBX2ZyKSIsICZtYWluX2tleV9DQV9mciwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MGMwYywgIkNhbmFkaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9DQSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDgwYywgIkJlbGdpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0JFLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X2F6ZXJ0eX0sCiB7MHgwODE2LCAiUG9ydHVndWVzZSBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfUFQsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTYsICJCcmF6aWxpYW4gQUJOVC0yIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9QVF9iciwgJm1haW5fa2V5X3NjYW5fYWJudF9xd2VydHksICZtYWluX2tleV92a2V5X2FibnRfcXdlcnR5fSwKIHsweDA0MTYsICJCcmF6aWxpYW4gQUJOVC0yIGtleWJvYXJkIGxheW91dCBBTFQgR1IiLCAmbWFpbl9rZXlfUFRfYnJfYWx0X2dyLCZtYWluX2tleV9zY2FuX2FibnRfcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9hYm50X3F3ZXJ0eX0sCiB7MHgwNDBiLCAiRmlubmlzaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfRkksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDIsICJCdWxnYXJpYW4gYmRzIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9CR19iZHMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDIsICJCdWxnYXJpYW4gcGhvbmV0aWMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0JHX3Bob25ldGljLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDIzLCAiQmVsYXJ1c2lhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQlksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTksICJSdXNzaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9SVSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxOSwgIlJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IChwaGFudG9tIGtleSB2ZXJzaW9uKSIsICZtYWluX2tleV9SVV9waGFudG9tLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1SIiwgJm1haW5fa2V5X1JVX2tvaThyLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgY3AxMjUxIiwgJm1haW5fa2V5X1JVX2NwMTI1MSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxOSwgIlJ1c3NpYW4gcGhvbmV0aWMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1JVX3Bob25ldGljLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDIyLCAiVWtyYWluaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVUiLCAmbWFpbl9rZXlfVUEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MjIsICJVa3JhaW5pYW4ga2V5Ym9hcmQgbGF5b3V0IChzdGFuZGFyZCkiLCAmbWFpbl9rZXlfVUFfc3RkLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgKHN0YW5kYXJkKSIsICZtYWluX2tleV9SVV9zdGQsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGEsICJTcGFuaXNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9FUywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxMCwgIkl0YWxpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0lULCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBmLCAiSWNlbGFuZGljIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9JUywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwZSwgIkh1bmdhcmlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSFUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDA0MTUsICJQb2xpc2ggKHByb2dyYW1tZXIncykga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1BMLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDI0LCAiU2xvdmVuaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9TSSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MGMxYSwgIlNlcmJpYW4ga2V5Ym9hcmQgbGF5b3V0IHNyIiwgJm1haW5fa2V5X1NSLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sIC8qIExBTkdfU0VSQklBTixTVUJMQU5HX1NFUkJJQU5fQ1lSSUxMSUMgKi8KIHsweDBjMWEsICJTZXJiaWFuIGtleWJvYXJkIGxheW91dCB1cyxzciIsICZtYWluX2tleV9VU19TUiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LCAvKiBMQU5HX1NFUkJJQU4sU1VCTEFOR19TRVJCSUFOX0NZUklMTElDICovCiB7MHgwNDFhLCAiQ3JvYXRpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0hSLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDFhLCAiQ3JvYXRpYW4ga2V5Ym9hcmQgbGF5b3V0IChzcGVjaWZpYykiLCAmbWFpbl9rZXlfSFJfamVsbHksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTEsICJKYXBhbmVzZSAxMDYga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0pBX2pwMTA2LCAmbWFpbl9rZXlfc2Nhbl9xd2VydHlfanAxMDYsICZtYWluX2tleV92a2V5X3F3ZXJ0eV9qcDEwNn0sCiB7MHgwNDExLCAiSmFwYW5lc2UgTWFjIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9KQV9tYWNqcCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5X21hY2pwLCAmbWFpbl9rZXlfdmtleV9xd2VydHlfbWFjanB9LAogezB4MDQxMSwgIkphcGFuZXNlIHBjOTh4MSBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSkFfcGM5OHgxLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDFiLCAiU2xvdmFrIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9TSywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxYiwgIlNsb3ZhayBhbmQgQ3plY2gga2V5Ym9hcmQgbGF5b3V0IHdpdGhvdXQgZGVhZCBrZXlzIiwgJm1haW5fa2V5X1NLX3Byb2csICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDUsICJDemVjaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQ1MsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDUsICJDemVjaCBrZXlib2FyZCBsYXlvdXQgY3oiLCAmbWFpbl9rZXlfQ1osICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDA0MDUsICJDemVjaCBrZXlib2FyZCBsYXlvdXQgY3pfcXdlcnR5IiwgJm1haW5fa2V5X0NaX3F3ZXJ0eSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwYSwgIkxhdGluIEFtZXJpY2FuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9MQSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQyNywgIkxpdGh1YW5pYW4gKEJhbHRpYykga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0xUX0IsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MWYsICJUdXJraXNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9USywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxZiwgIlR1cmtpc2gga2V5Ym9hcmQgbGF5b3V0IHRyIiwgJm1haW5fa2V5X1RSLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDFmLCAiVHVya2lzaCBrZXlib2FyZCBsYXlvdXQgdHJmIiwgJm1haW5fa2V5X1RSX0YsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGQsICJJc3JhZWxpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0lMLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBkLCAiSXNyYWVsaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9JTF9waG9uZXRpYywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwZCwgIklzcmFlbGlhbiBTYWhhcm9uIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9JTF9zYWhhcm9uLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA5LCAiVk5DIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV92bmMsICZtYWluX2tleV9zY2FuX3ZuYywgJm1haW5fa2V5X3ZrZXlfdm5jfSwKIHsweDA0MDgsICJHcmVlayBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfRUwsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MWUsICJUaGFpIChLZWRtYW5lZSkgIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV90aCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxMywgIkR1dGNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9OTCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAoKIHswLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSAvKiBzZW50aW5lbCAqLwp9OwpzdGF0aWMgdW5zaWduZWQga2JkX2xheW91dD0wOyAvKiBpbmRleCBpbnRvIGFib3ZlIHRhYmxlIG9mIGxheW91dHMgKi8KCi8qIG1heWJlIG1vcmUgb2YgdGhlc2Ugc2NhbmNvZGVzIHNob3VsZCBiZSBleHRlbmRlZD8gKi8KICAgICAgICAgICAgICAgIC8qIGV4dGVuZGVkIG11c3QgYmUgc2V0IGZvciBBTFRfUiwgQ1RSTF9SLAogICAgICAgICAgICAgICAgICAgSU5TLCBERUwsIEhPTUUsIEVORCwgUEFHRV9VUCwgUEFHRV9ET1dOLCBBUlJPVyBrZXlzLAogICAgICAgICAgICAgICAgICAga2V5cGFkIC8gYW5kIGtleXBhZCBFTlRFUiAoU0RLIDMuMSBWb2wuMyBwIDEzOCkgKi8KICAgICAgICAgICAgICAgIC8qIEZJWE1FIHNob3VsZCB3ZSBzZXQgZXh0ZW5kZWQgYml0IGZvciBOdW1Mb2NrID8gTXkKICAgICAgICAgICAgICAgICAqIFdpbmRvd3MgZG9lcyAuLi4gREYgKi8KICAgICAgICAgICAgICAgIC8qIFllcywgdG8gZGlzdGluZ3Vpc2ggYmFzZWQgb24gc2NhbiBjb2RlcywgYWxzbwogICAgICAgICAgICAgICAgICAgZm9yIFBydFNjbiBrZXkgLi4uIEdBICovCgpzdGF0aWMgY29uc3QgV09SRCBub25jaGFyX2tleV92a2V5WzI1Nl0gPQp7CiAgICAvKiB1bnVzZWQgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMDAgKi8KICAgIC8qIHNwZWNpYWwga2V5cyAqLwogICAgVktfQkFDSywgVktfVEFCLCAwLCBWS19DTEVBUiwgMCwgVktfUkVUVVJOLCAwLCAwLCAgICAgICAgICAgLyogRkYwOCAqLwogICAgMCwgMCwgMCwgVktfUEFVU0UsIFZLX1NDUk9MTCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgLyogRkYxMCAqLwogICAgMCwgMCwgMCwgVktfRVNDQVBFLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYxOCAqLwogICAgLyogdW51c2VkICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjIwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjI4ICovCiAgICAwLCBWS19IQU5HVUwsIDAsIDAsIFZLX0hBTkpBLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBGRjMwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjM4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjQwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjQ4ICovCiAgICAvKiBjdXJzb3Iga2V5cyAqLwogICAgVktfSE9NRSwgVktfTEVGVCwgVktfVVAsIFZLX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY1MCAqLwogICAgVktfRE9XTiwgVktfUFJJT1IsIFZLX05FWFQsIFZLX0VORCwKICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNTggKi8KICAgIC8qIG1pc2Mga2V5cyAqLwogICAgVktfU0VMRUNULCBWS19TTkFQU0hPVCwgVktfRVhFQ1VURSwgVktfSU5TRVJULCAwLDAsMCwgVktfQVBQUywgLyogRkY2MCAqLwogICAgMCwgVktfQ0FOQ0VMLCBWS19IRUxQLCBWS19DQU5DRUwsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgLyogRkY2OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY3MCAqLwogICAgLyoga2V5cGFkIGtleXMgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIFZLX05VTUxPQ0ssICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNzggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGODAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIFZLX1JFVFVSTiwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGODggKi8KICAgIDAsIDAsIDAsIDAsIDAsIFZLX0hPTUUsIFZLX0xFRlQsIFZLX1VQLCAgICAgICAgICAgICAgICAgICAgIC8qIEZGOTAgKi8KICAgIFZLX1JJR0hULCBWS19ET1dOLCBWS19QUklPUiwgVktfTkVYVCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGOTggKi8KICAgIFZLX0VORCwgVktfQ0xFQVIsIFZLX0lOU0VSVCwgVktfREVMRVRFLAogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZBMCAqLwogICAgMCwgMCwgVktfTVVMVElQTFksIFZLX0FERCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZBOCAqLwogICAgLyogV2luZG93cyBhbHdheXMgZ2VuZXJhdGVzIFZLX0RFQ0lNQUwgZm9yIERlbC8uIG9uIGtleXBhZCB3aGlsZSBzb21lCiAgICAgKiBYMTEga2V5Ym9hcmQgbGF5b3V0cyBnZW5lcmF0ZSBYS19LUF9TZXBhcmF0b3IgaW5zdGVhZCBvZiBYS19LUF9EZWNpbWFsCiAgICAgKiBpbiBvcmRlciB0byBwcm9kdWNlIGEgbG9jYWxlIGRlcGVuZGVudCBudW1lcmljIHNlcGFyYXRvci4KICAgICAqLwogICAgVktfREVDSU1BTCwgVktfU1VCVFJBQ1QsIFZLX0RFQ0lNQUwsIFZLX0RJVklERSwKICAgIFZLX05VTVBBRDAsIFZLX05VTVBBRDEsIFZLX05VTVBBRDIsIFZLX05VTVBBRDMsICAgICAgICAgICAgIC8qIEZGQjAgKi8KICAgIFZLX05VTVBBRDQsIFZLX05VTVBBRDUsIFZLX05VTVBBRDYsIFZLX05VTVBBRDcsCiAgICBWS19OVU1QQUQ4LCBWS19OVU1QQUQ5LCAwLCAwLCAwLCBWS19PRU1fTkVDX0VRVUFMLCAgICAgICAgICAvKiBGRkI4ICovCiAgICAvKiBmdW5jdGlvbiBrZXlzICovCiAgICBWS19GMSwgVktfRjIsCiAgICBWS19GMywgVktfRjQsIFZLX0Y1LCBWS19GNiwgVktfRjcsIFZLX0Y4LCBWS19GOSwgVktfRjEwLCAgICAvKiBGRkMwICovCiAgICBWS19GMTEsIFZLX0YxMiwgVktfRjEzLCBWS19GMTQsIFZLX0YxNSwgVktfRjE2LCBWS19GMTcsIFZLX0YxOCwgLyogRkZDOCAqLwogICAgVktfRjE5LCBWS19GMjAsIFZLX0YyMSwgVktfRjIyLCBWS19GMjMsIFZLX0YyNCwgMCwgMCwgICAgICAgLyogRkZEMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZEOCAqLwogICAgLyogbW9kaWZpZXIga2V5cyAqLwogICAgMCwgVktfTFNISUZULCBWS19SU0hJRlQsIFZLX0xDT05UUk9MLCAgICAgICAgICAgICAgICAgICAgICAgLyogRkZFMCAqLwogICAgVktfUkNPTlRST0wsIFZLX0NBUElUQUwsIDAsIFZLX0xNRU5VLAogICAgVktfUk1FTlUsIFZLX0xNRU5VLCBWS19STUVOVSwgVktfTFdJTiwgVktfUldJTiwgMCwgMCwgMCwgICAgLyogRkZFOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZGMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgVktfREVMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZGOCAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbm9uY2hhcl9rZXlfc2NhblsyNTZdID0KewogICAgLyogdW51c2VkICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYwMCAqLwogICAgLyogc3BlY2lhbCBrZXlzICovCiAgICAweDBFLCAweDBGLCAweDAwLCAvKj8qLyAwLCAweDAwLCAweDFDLCAweDAwLCAweDAwLCAgICAgICAgICAgLyogRkYwOCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NSwgMHg0NiwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMTAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjE4ICovCiAgICAvKiB1bnVzZWQgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjIwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYyOCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMzAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjM4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkY0MCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGNDggKi8KICAgIC8qIGN1cnNvciBrZXlzICovCiAgICAweDE0NywgMHgxNEIsIDB4MTQ4LCAweDE0RCwgMHgxNTAsIDB4MTQ5LCAweDE1MSwgMHgxNEYsICAgICAgLyogRkY1MCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGNTggKi8KICAgIC8qIG1pc2Mga2V5cyAqLwogICAgLyo/Ki8gMCwgMHgxMzcsIC8qPyovIDAsIDB4MTUyLCAweDAwLCAweDAwLCAweDAwLCAweDE1RCwgICAgIC8qIEZGNjAgKi8KICAgIC8qPyovIDAsIC8qPyovIDAsIDB4MzgsIDB4MTQ2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAvKiBGRjY4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkY3MCAqLwogICAgLyoga2V5cGFkIGtleXMgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQ1LCAgICAgICAgICAgICAvKiBGRjc4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkY4MCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMUMsIDB4MDAsIDB4MDAsICAgICAgICAgICAgIC8qIEZGODggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDcsIDB4NEIsIDB4NDgsICAgICAgICAgICAgICAvKiBGRjkwICovCiAgICAweDRELCAweDUwLCAweDQ5LCAweDUxLCAweDRGLCAweDRDLCAweDUyLCAweDUzLCAgICAgICAgICAgICAgLyogRkY5OCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGQTAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MzcsIDB4NEUsIDB4NTMsIDB4NEEsIDB4NTMsIDB4MTM1LCAgICAgICAgICAgICAvKiBGRkE4ICovCiAgICAweDUyLCAweDRGLCAweDUwLCAweDUxLCAweDRCLCAweDRDLCAweDRELCAweDQ3LCAgICAgICAgICAgICAgLyogRkZCMCAqLwogICAgMHg0OCwgMHg0OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQjggKi8KICAgIC8qIGZ1bmN0aW9uIGtleXMgKi8KICAgIDB4M0IsIDB4M0MsCiAgICAweDNELCAweDNFLCAweDNGLCAweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAgICAgICAgICAgICAgLyogRkZDMCAqLwogICAgMHg1NywgMHg1OCwgMHg1QiwgMHg1QywgMHg1RCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGQzggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkQwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkZEOCAqLwogICAgLyogbW9kaWZpZXIga2V5cyAqLwogICAgMHgwMCwgMHgyQSwgMHgxMzYsIDB4MUQsIDB4MTFELCAweDNBLCAweDAwLCAweDM4LCAgICAgICAgICAgIC8qIEZGRTAgKi8KICAgIDB4MTM4LCAweDM4LCAweDEzOCwgMHgxNWIsIDB4MTVjLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAvKiBGRkU4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkZGMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNTMgICAgICAgICAgICAgIC8qIEZGRjggKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIHhmcmVlODZfdmVuZG9yX2tleV92a2V5WzI1Nl0gPQp7CiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkYwMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGMDggKi8KICAgIDAsIFZLX1ZPTFVNRV9ET1dOLCBWS19WT0xVTUVfTVVURSwgVktfVk9MVU1FX1VQLCAgICAgICAgICAgIC8qIDEwMDhGRjEwICovCiAgICBWS19NRURJQV9QTEFZX1BBVVNFLCBWS19NRURJQV9TVE9QLAogICAgVktfTUVESUFfUFJFVl9UUkFDSywgVktfTUVESUFfTkVYVF9UUkFDSywKICAgIDAsIFZLX0xBVU5DSF9NQUlMLCAwLCBWS19CUk9XU0VSX1NFQVJDSCwgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjE4ICovCiAgICAwLCAwLCAwLCBWS19CUk9XU0VSX0hPTUUsCiAgICAwLCAwLCAwLCAwLCAwLCAwLCBWS19CUk9XU0VSX0JBQ0ssIFZLX0JST1dTRVJfRk9SV0FSRCwgICAgICAvKiAxMDA4RkYyMCAqLwogICAgVktfQlJPV1NFUl9TVE9QLCBWS19CUk9XU0VSX1JFRlJFU0gsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgLyogMTAwOEZGMjggKi8KICAgIFZLX0JST1dTRVJfRkFWT1JJVEVTLCAwLCBWS19MQVVOQ0hfTUVESUFfU0VMRUNULCAwLCAgICAgICAgIC8qIDEwMDhGRjMwICovCiAgICAwLCAwLCAwLCAwLAogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGMzggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjQwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY0OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNTAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjU4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY2MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNjggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjcwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY3OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGODAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjg4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY5MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGOTggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkEwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZBOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGQjAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkI4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZDMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGQzggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkQwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZEOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGRTAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkU4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZGMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGRjggKi8KfTsKCnN0YXRpYyBpbmxpbmUgS2V5U3ltIGtleWNvZGVfdG9fa2V5c3ltKCBEaXNwbGF5ICpkaXNwbGF5LCBLZXlDb2RlIGtleWNvZGUsIGludCBpbmRleCApCnsKI2lmZGVmIEhBVkVfWEtCCiAgICBpZiAodXNlX3hrYikgcmV0dXJuIFhrYktleWNvZGVUb0tleXN5bShkaXNwbGF5LCBrZXljb2RlLCAwLCBpbmRleCk7CiNlbmRpZgogICAgcmV0dXJuIGtleV9tYXBwaW5nWyhrZXljb2RlIC0gbWluX2tleWNvZGUpICoga2V5c3ltc19wZXJfa2V5Y29kZSArIGluZGV4XTsKfQoKLyogUmV0dXJucyB0aGUgV2luZG93cyB2aXJ0dWFsIGtleSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgWCBldmVudCA8ZT4gKi8KLyogeDExIGxvY2sgbXVzdCBiZSBoZWxkICovCnN0YXRpYyBXT1JEIEVWRU5UX2V2ZW50X3RvX3ZrZXkoIFhJQyB4aWMsIFhLZXlFdmVudCAqZSkKewogICAgS2V5U3ltIGtleXN5bSA9IDA7CiAgICBTdGF0dXMgc3RhdHVzOwogICAgY2hhciBidWZbMjRdOwoKICAgIC8qIENsaWVudHMgc2hvdWxkIHBhc3Mgb25seSBLZXlQcmVzcyBldmVudHMgdG8gWG1iTG9va3VwU3RyaW5nICovCiAgICBpZiAoeGljICYmIGUtPnR5cGUgPT0gS2V5UHJlc3MpCiAgICAgICAgWG1iTG9va3VwU3RyaW5nKHhpYywgZSwgYnVmLCBzaXplb2YoYnVmKSwgJmtleXN5bSwgJnN0YXR1cyk7CiAgICBlbHNlCiAgICAgICAgWExvb2t1cFN0cmluZyhlLCBidWYsIHNpemVvZihidWYpLCAma2V5c3ltLCBOVUxMKTsKCiAgICBpZiAoKGUtPnN0YXRlICYgTnVtTG9ja01hc2spICYmCiAgICAgICAgKGtleXN5bSA9PSBYS19LUF9TZXBhcmF0b3IgfHwga2V5c3ltID09IFhLX0tQX0RlY2ltYWwgfHwKICAgICAgICAgKGtleXN5bSA+PSBYS19LUF8wICYmIGtleXN5bSA8PSBYS19LUF85KSkpCiAgICAgICAgLyogT25seSB0aGUgS2V5cGFkIGtleXMgMC05IGFuZCAuIHNlbmQgZGlmZmVyZW50IGtleXN5bXMKICAgICAgICAgKiBkZXBlbmRpbmcgb24gdGhlIE51bUxvY2sgc3RhdGUgKi8KICAgICAgICByZXR1cm4gbm9uY2hhcl9rZXlfdmtleVtrZXlzeW0gJiAweEZGXTsKCiAgICAvKiBQcmVzc2luZyB0aGUgUGF1c2UvQnJlYWsga2V5IGFsb25lIHByb2R1Y2VzIFZLX1BBVVNFIHZrZXksIHdoaWxlCiAgICAgKiBwcmVzc2luZyBDdHJsK1BhdXNlL0JyZWFrIHByb2R1Y2VzIFZLX0NBTkNFTC4gKi8KICAgIGlmICgoZS0+c3RhdGUgJiBDb250cm9sTWFzaykgJiYgKGtleXN5bSA9PSBYS19CcmVhaykpCiAgICAgICAgcmV0dXJuIFZLX0NBTkNFTDsKCiAgICBUUkFDRV8oa2V5KSgiZS0+a2V5Y29kZSA9ICV1XG4iLCBlLT5rZXljb2RlKTsKCiAgICByZXR1cm4ga2V5YzJ2a2V5W2UtPmtleWNvZGVdOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dAogKi8Kc3RhdGljIHZvaWQgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQoIEhXTkQgaHduZCwgV09SRCB2a2V5LCBXT1JEIHNjYW4sIERXT1JEIGZsYWdzLCBEV09SRCB0aW1lICkKewogICAgSU5QVVQgaW5wdXQ7CgogICAgVFJBQ0VfKGtleSkoICJod25kICVwIHZrZXk9JTA0eCBzY2FuPSUwNHggZmxhZ3M9JTA0eFxuIiwgaHduZCwgdmtleSwgc2NhbiwgZmxhZ3MgKTsKCiAgICBpbnB1dC50eXBlICAgICAgICAgICAgID0gSU5QVVRfS0VZQk9BUkQ7CiAgICBpbnB1dC51LmtpLndWayAgICAgICAgID0gdmtleTsKICAgIGlucHV0LnUua2kud1NjYW4gICAgICAgPSBzY2FuOwogICAgaW5wdXQudS5raS5kd0ZsYWdzICAgICA9IGZsYWdzOwogICAgaW5wdXQudS5raS50aW1lICAgICAgICA9IHRpbWU7CiAgICBpbnB1dC51LmtpLmR3RXh0cmFJbmZvID0gMDsKCiAgICBfX3dpbmVfc2VuZF9pbnB1dCggaHduZCwgJmlucHV0ICk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIGdldF9hc3luY19rZXlfc3RhdGUKICovCnN0YXRpYyBCT09MIGdldF9hc3luY19rZXlfc3RhdGUoIEJZVEUgc3RhdGVbMjU2XSApCnsKICAgIEJPT0wgcmV0OwoKICAgIFNFUlZFUl9TVEFSVF9SRVEoIGdldF9rZXlfc3RhdGUgKQogICAgewogICAgICAgIHJlcS0+dGlkID0gMDsKICAgICAgICByZXEtPmtleSA9IC0xOwogICAgICAgIHdpbmVfc2VydmVyX3NldF9yZXBseSggcmVxLCBzdGF0ZSwgMjU2ICk7CiAgICAgICAgcmV0ID0gIXdpbmVfc2VydmVyX2NhbGwoIHJlcSApOwogICAgfQogICAgU0VSVkVSX0VORF9SRVE7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIHNldF9hc3luY19rZXlfc3RhdGUKICovCnN0YXRpYyB2b2lkIHNldF9hc3luY19rZXlfc3RhdGUoIGNvbnN0IEJZVEUgc3RhdGVbMjU2XSApCnsKICAgIFNFUlZFUl9TVEFSVF9SRVEoIHNldF9rZXlfc3RhdGUgKQogICAgewogICAgICAgIHJlcS0+dGlkID0gR2V0Q3VycmVudFRocmVhZElkKCk7CiAgICAgICAgcmVxLT5hc3luYyA9IDE7CiAgICAgICAgd2luZV9zZXJ2ZXJfYWRkX2RhdGEoIHJlcSwgc3RhdGUsIDI1NiApOwogICAgICAgIHdpbmVfc2VydmVyX2NhbGwoIHJlcSApOwogICAgfQogICAgU0VSVkVSX0VORF9SRVE7Cn0KCnN0YXRpYyB2b2lkIHVwZGF0ZV9rZXlfc3RhdGUoIEJZVEUgKmtleXN0YXRlLCBCWVRFIGtleSwgaW50IGRvd24gKQp7CiAgICBpZiAoZG93bikKICAgIHsKICAgICAgICBpZiAoIShrZXlzdGF0ZVtrZXldICYgMHg4MCkpIGtleXN0YXRlW2tleV0gXj0gMHgwMTsKICAgICAgICBrZXlzdGF0ZVtrZXldIHw9IDB4ODA7CiAgICB9CiAgICBlbHNlIGtleXN0YXRlW2tleV0gJj0gfjB4ODA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgWDExRFJWX0tleW1hcE5vdGlmeQogKgogKiBVcGRhdGUgbW9kaWZpZXJzIHN0YXRlIChDdHJsLCBBbHQsIFNoaWZ0KSB3aGVuIHdpbmRvdyBpcyBhY3RpdmF0ZWQuCiAqCiAqIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBvbmUgdXNlcyBDdHJsKy4uLiBBbHQrLi4uIG9yIFNoaWZ0Ky4uIHRvIHN3aXRjaAogKiBmcm9tIHdpbmUgdG8gYW5vdGhlciBhcHBsaWNhdGlvbiBhbmQgYmFjay4KICogVG9nZ2xlIGtleXMgYXJlIGhhbmRsZWQgaW4gSGFuZGxlRXZlbnQuCiAqLwp2b2lkIFgxMURSVl9LZXltYXBOb3RpZnkoIEhXTkQgaHduZCwgWEV2ZW50ICpldmVudCApCnsKICAgIGludCBpLCBqOwogICAgQllURSBrZXlzdGF0ZVsyNTZdOwogICAgV09SRCB2a2V5OwogICAgQk9PTCBjaGFuZ2VkID0gRkFMU0U7CiAgICBzdHJ1Y3QgewogICAgICAgIFdPUkQgdmtleTsKICAgICAgICBCT09MIHByZXNzZWQ7CiAgICB9IG1vZGlmaWVyc1s2XTsgLyogVktfTFNISUZUIHRocm91Z2ggVktfUk1FTlUgYXJlIGNvbnRpZ3VvdXMgKi8KCiAgICBpZiAoIWdldF9hc3luY19rZXlfc3RhdGUoIGtleXN0YXRlICkpIHJldHVybjsKCiAgICBtZW1zZXQobW9kaWZpZXJzLCAwLCBzaXplb2YobW9kaWZpZXJzKSk7CgogICAgLyogdGhlIG1pbmltdW0ga2V5Y29kZSBpcyBhbHdheXMgZ3JlYXRlciBvciBlcXVhbCB0byA4LCBzbyB3ZSBjYW4KICAgICAqIHNraXAgdGhlIGZpcnN0IDggdmFsdWVzLCBoZW5jZSBzdGFydCBhdCAxCiAgICAgKi8KICAgIGZvciAoaSA9IDE7IGkgPCAzMjsgaSsrKQogICAgewogICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCiAgICAgICAgewogICAgICAgICAgICBpbnQgbTsKCiAgICAgICAgICAgIHZrZXkgPSBrZXljMnZrZXlbKGkgKiA4KSArIGpdOwoKICAgICAgICAgICAgc3dpdGNoKHZrZXkgJiAweGZmKQogICAgICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgVktfTE1FTlU6CiAgICAgICAgICAgIGNhc2UgVktfUk1FTlU6CiAgICAgICAgICAgIGNhc2UgVktfTENPTlRST0w6CiAgICAgICAgICAgIGNhc2UgVktfUkNPTlRST0w6CiAgICAgICAgICAgIGNhc2UgVktfTFNISUZUOgogICAgICAgICAgICBjYXNlIFZLX1JTSElGVDoKICAgICAgICAgICAgICAgIG0gPSAodmtleSAmIDB4ZmYpIC0gVktfTFNISUZUOwogICAgICAgICAgICAgICAgLyogVGFrZSB0aGUgdmtleSBmcm9tIHRoZSBmaXJzdCBrZXljb2RlIHdlIGVuY291bnRlciBmb3IgdGhpcyBtb2RpZmllciAqLwogICAgICAgICAgICAgICAgaWYgKCFtb2RpZmllcnNbbV0udmtleSkgbW9kaWZpZXJzW21dLnZrZXkgPSB2a2V5OwogICAgICAgICAgICAgICAgaWYgKGV2ZW50LT54a2V5bWFwLmtleV92ZWN0b3JbaV0gJiAoMTw8aikpIG1vZGlmaWVyc1ttXS5wcmVzc2VkID0gVFJVRTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZvciAodmtleSA9IFZLX0xTSElGVDsgdmtleSA8PSBWS19STUVOVTsgdmtleSsrKQogICAgewogICAgICAgIGludCBtID0gdmtleSAtIFZLX0xTSElGVDsKICAgICAgICBpZiAobW9kaWZpZXJzW21dLnZrZXkgJiYgIShrZXlzdGF0ZVt2a2V5XSAmIDB4ODApICE9ICFtb2RpZmllcnNbbV0ucHJlc3NlZCkKICAgICAgICB7CiAgICAgICAgICAgIFRSQUNFKCAiQWRqdXN0aW5nIHN0YXRlIGZvciB2a2V5ICUjLjJ4LiBTdGF0ZSBiZWZvcmUgJSMuMnhcbiIsCiAgICAgICAgICAgICAgICAgICBtb2RpZmllcnNbbV0udmtleSwga2V5c3RhdGVbdmtleV0pOwoKICAgICAgICAgICAgdXBkYXRlX2tleV9zdGF0ZSgga2V5c3RhdGUsIHZrZXksIG1vZGlmaWVyc1ttXS5wcmVzc2VkICk7CiAgICAgICAgICAgIGNoYW5nZWQgPSBUUlVFOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIWNoYW5nZWQpIHJldHVybjsKCiAgICB1cGRhdGVfa2V5X3N0YXRlKCBrZXlzdGF0ZSwgVktfQ09OVFJPTCwgKGtleXN0YXRlW1ZLX0xDT05UUk9MXSB8IGtleXN0YXRlW1ZLX1JDT05UUk9MXSkgJiAweDgwICk7CiAgICB1cGRhdGVfa2V5X3N0YXRlKCBrZXlzdGF0ZSwgVktfTUVOVSwgKGtleXN0YXRlW1ZLX0xNRU5VXSB8IGtleXN0YXRlW1ZLX1JNRU5VXSkgJiAweDgwICk7CiAgICB1cGRhdGVfa2V5X3N0YXRlKCBrZXlzdGF0ZSwgVktfU0hJRlQsIChrZXlzdGF0ZVtWS19MU0hJRlRdIHwga2V5c3RhdGVbVktfUlNISUZUXSkgJiAweDgwICk7CiAgICBzZXRfYXN5bmNfa2V5X3N0YXRlKCBrZXlzdGF0ZSApOwp9CgpzdGF0aWMgdm9pZCB1cGRhdGVfbG9ja19zdGF0ZSggSFdORCBod25kLCBXT1JEIHZrZXksIFVJTlQgc3RhdGUsIERXT1JEIHRpbWUgKQp7CiAgICBCWVRFIGtleXN0YXRlWzI1Nl07CgogICAgLyogTm90ZTogWCBzZXRzIHRoZSBiZWxvdyBzdGF0ZXMgb24ga2V5IGRvd24gYW5kIGNsZWFycyB0aGVtIG9uIGtleSB1cC4KICAgICAgIFdpbmRvd3MgdHJpZ2dlcnMgdGhlbSBvbiBrZXkgZG93bi4gKi8KCiAgICBpZiAoIWdldF9hc3luY19rZXlfc3RhdGUoIGtleXN0YXRlICkpIHJldHVybjsKCiAgICAvKiBBZGp1c3QgdGhlIENBUFNMT0NLIHN0YXRlIGlmIGl0IGhhcyBiZWVuIGNoYW5nZWQgb3V0c2lkZSB3aW5lICovCiAgICBpZiAoIShrZXlzdGF0ZVtWS19DQVBJVEFMXSAmIDB4MDEpICE9ICEoc3RhdGUgJiBMb2NrTWFzaykgJiYgdmtleSAhPSBWS19DQVBJVEFMKQogICAgewogICAgICAgIERXT1JEIGZsYWdzID0gMDsKICAgICAgICBpZiAoa2V5c3RhdGVbVktfQ0FQSVRBTF0gJiAweDgwKSBmbGFncyBePSBLRVlFVkVOVEZfS0VZVVA7CiAgICAgICAgVFJBQ0UoIkFkanVzdGluZyBDYXBzTG9jayBzdGF0ZSAoJSMuMngpXG4iLCBrZXlzdGF0ZVtWS19DQVBJVEFMXSk7CiAgICAgICAgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQoIGh3bmQsIFZLX0NBUElUQUwsIDB4M2EsIGZsYWdzLCB0aW1lICk7CiAgICAgICAgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQoIGh3bmQsIFZLX0NBUElUQUwsIDB4M2EsIGZsYWdzIF4gS0VZRVZFTlRGX0tFWVVQLCB0aW1lICk7CiAgICB9CgogICAgLyogQWRqdXN0IHRoZSBOVU1MT0NLIHN0YXRlIGlmIGl0IGhhcyBiZWVuIGNoYW5nZWQgb3V0c2lkZSB3aW5lICovCiAgICBpZiAoIShrZXlzdGF0ZVtWS19OVU1MT0NLXSAmIDB4MDEpICE9ICEoc3RhdGUgJiBOdW1Mb2NrTWFzaykgJiYgKHZrZXkgJiAweGZmKSAhPSBWS19OVU1MT0NLKQogICAgewogICAgICAgIERXT1JEIGZsYWdzID0gS0VZRVZFTlRGX0VYVEVOREVES0VZOwogICAgICAgIGlmIChrZXlzdGF0ZVtWS19OVU1MT0NLXSAmIDB4ODApIGZsYWdzIF49IEtFWUVWRU5URl9LRVlVUDsKICAgICAgICBUUkFDRSgiQWRqdXN0aW5nIE51bUxvY2sgc3RhdGUgKCUjLjJ4KVxuIiwga2V5c3RhdGVbVktfTlVNTE9DS10pOwogICAgICAgIFgxMURSVl9zZW5kX2tleWJvYXJkX2lucHV0KCBod25kLCBWS19OVU1MT0NLLCAweDQ1LCBmbGFncywgdGltZSApOwogICAgICAgIFgxMURSVl9zZW5kX2tleWJvYXJkX2lucHV0KCBod25kLCBWS19OVU1MT0NLLCAweDQ1LCBmbGFncyBeIEtFWUVWRU5URl9LRVlVUCwgdGltZSApOwogICAgfQoKICAgIC8qIEFkanVzdCB0aGUgU0NST0xMTE9DSyBzdGF0ZSBpZiBpdCBoYXMgYmVlbiBjaGFuZ2VkIG91dHNpZGUgd2luZSAqLwogICAgaWYgKCEoa2V5c3RhdGVbVktfU0NST0xMXSAmIDB4MDEpICE9ICEoc3RhdGUgJiBTY3JvbGxMb2NrTWFzaykgJiYgdmtleSAhPSBWS19TQ1JPTEwpCiAgICB7CiAgICAgICAgRFdPUkQgZmxhZ3MgPSAwOwogICAgICAgIGlmIChrZXlzdGF0ZVtWS19TQ1JPTExdICYgMHg4MCkgZmxhZ3MgXj0gS0VZRVZFTlRGX0tFWVVQOwogICAgICAgIFRSQUNFKCJBZGp1c3RpbmcgU2NyTG9jayBzdGF0ZSAoJSMuMngpXG4iLCBrZXlzdGF0ZVtWS19TQ1JPTExdKTsKICAgICAgICBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dCggaHduZCwgVktfU0NST0xMLCAweDQ2LCBmbGFncywgdGltZSApOwogICAgICAgIFgxMURSVl9zZW5kX2tleWJvYXJkX2lucHV0KCBod25kLCBWS19TQ1JPTEwsIDB4NDYsIGZsYWdzIF4gS0VZRVZFTlRGX0tFWVVQLCB0aW1lICk7CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgWDExRFJWX0tleUV2ZW50CiAqCiAqIEhhbmRsZSBhIFgga2V5IGV2ZW50CiAqLwp2b2lkIFgxMURSVl9LZXlFdmVudCggSFdORCBod25kLCBYRXZlbnQgKnhldiApCnsKICAgIFhLZXlFdmVudCAqZXZlbnQgPSAmeGV2LT54a2V5OwogICAgY2hhciBidWZbMjRdOwogICAgY2hhciAqU3RyID0gYnVmOwogICAgS2V5U3ltIGtleXN5bSA9IDA7CiAgICBXT1JEIHZrZXkgPSAwLCBiU2NhbjsKICAgIERXT1JEIGR3RmxhZ3M7CiAgICBpbnQgYXNjaWlfY2hhcnM7CiAgICBYSUMgeGljID0gWDExRFJWX2dldF9pYyggaHduZCApOwogICAgRFdPUkQgZXZlbnRfdGltZSA9IEVWRU5UX3gxMV90aW1lX3RvX3dpbjMyX3RpbWUoZXZlbnQtPnRpbWUpOwogICAgU3RhdHVzIHN0YXR1cyA9IDA7CgogICAgVFJBQ0VfKGtleSkoInR5cGUgJWQsIHdpbmRvdyAlbHgsIHN0YXRlIDB4JTA0eCwga2V5Y29kZSAldVxuIiwKCQlldmVudC0+dHlwZSwgZXZlbnQtPndpbmRvdywgZXZlbnQtPnN0YXRlLCBldmVudC0+a2V5Y29kZSk7CgogICAgaWYgKGV2ZW50LT50eXBlID09IEtleVByZXNzKSB1cGRhdGVfdXNlcl90aW1lKCBldmVudC0+dGltZSApOwoKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgLyogQ2xpZW50cyBzaG91bGQgcGFzcyBvbmx5IEtleVByZXNzIGV2ZW50cyB0byBYbWJMb29rdXBTdHJpbmcgKi8KICAgIGlmICh4aWMgJiYgZXZlbnQtPnR5cGUgPT0gS2V5UHJlc3MpCiAgICB7CiAgICAgICAgYXNjaWlfY2hhcnMgPSBYbWJMb29rdXBTdHJpbmcoeGljLCBldmVudCwgYnVmLCBzaXplb2YoYnVmKSwgJmtleXN5bSwgJnN0YXR1cyk7CiAgICAgICAgVFJBQ0VfKGtleSkoIlhtYkxvb2t1cFN0cmluZyBuZWVkcyAlaSBieXRlKHMpXG4iLCBhc2NpaV9jaGFycyk7CiAgICAgICAgaWYgKHN0YXR1cyA9PSBYQnVmZmVyT3ZlcmZsb3cpCiAgICAgICAgewogICAgICAgICAgICBTdHIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgYXNjaWlfY2hhcnMpOwogICAgICAgICAgICBpZiAoU3RyID09IE5VTEwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEVSUl8oa2V5KSgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSFcbiIpOwogICAgICAgICAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBhc2NpaV9jaGFycyA9IFhtYkxvb2t1cFN0cmluZyh4aWMsIGV2ZW50LCBTdHIsIGFzY2lpX2NoYXJzLCAma2V5c3ltLCAmc3RhdHVzKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICAgICAgYXNjaWlfY2hhcnMgPSBYTG9va3VwU3RyaW5nKGV2ZW50LCBidWYsIHNpemVvZihidWYpLCAma2V5c3ltLCBOVUxMKTsKICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CgogICAgVFJBQ0VfKGtleSkoIm5ieXRlID0gJWQsIHN0YXR1cyAlZFxuIiwgYXNjaWlfY2hhcnMsIHN0YXR1cyk7CgogICAgaWYgKHN0YXR1cyA9PSBYTG9va3VwQ2hhcnMpCiAgICB7CiAgICAgICAgWDExRFJWX1hJTUxvb2t1cENoYXJzKCBTdHIsIGFzY2lpX2NoYXJzICk7CiAgICAgICAgaWYgKGJ1ZiAhPSBTdHIpCiAgICAgICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFN0cik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIElmIFhLQiBleHRlbnNpb25zIGFyZSB1c2VkLCB0aGUgc3RhdGUgbWFzayBmb3IgQWx0R3Igd2lsbCB1c2UgdGhlIGdyb3VwCiAgICAgICBpbmRleCBpbnN0ZWFkIG9mIHRoZSBtb2RpZmllciBtYXNrLiBUaGUgZ3JvdXAgaW5kZXggaXMgc2V0IGluIGJpdHMKICAgICAgIDEzLTE0IG9mIHRoZSBzdGF0ZSBmaWVsZCBpbiB0aGUgWEtleUV2ZW50IHN0cnVjdHVyZS4gU28gaWYgQWx0R3IgaXMKICAgICAgIHByZXNzZWQsIGxvb2sgaWYgdGhlIGdyb3VwIGluZGV4IGlzIGRpZmZlcmVudCB0aGFuIDAuIEZyb20gWEtCCiAgICAgICBleHRlbnNpb24gZG9jdW1lbnRhdGlvbiwgdGhlIGdyb3VwIGluZGV4IGZvciBBbHRHciBzaG91bGQgYmUgMgogICAgICAgKGV2ZW50LT5zdGF0ZSA9IDB4MjAwMCkuIEl0J3MgcHJvYmFibHkgYmV0dGVyIHRvIG5vdCBhc3N1bWUgYQogICAgICAgcHJlZGVmaW5lZCBncm91cCBpbmRleCBhbmQgZmluZCBpdCBkeW5hbWljYWxseQoKICAgICAgIFJlZjogWCBLZXlib2FyZCBFeHRlbnNpb246IExpYnJhcnkgc3BlY2lmaWNhdGlvbiAoc2VjdGlvbiAxNC4xLjEgYW5kIDE3LjEuMSkgKi8KICAgIC8qIFNhdmUgYWxzbyBhbGwgcG9zc2libGUgbW9kaWZpZXIgc3RhdGVzLiAqLwogICAgQWx0R3JNYXNrID0gZXZlbnQtPnN0YXRlICYgKDB4NjAwMCB8IE1vZDFNYXNrIHwgTW9kMk1hc2sgfCBNb2QzTWFzayB8IE1vZDRNYXNrIHwgTW9kNU1hc2spOwoKICAgIGlmIChUUkFDRV9PTihrZXkpKXsKCWNvbnN0IGNoYXIgKmtzbmFtZTsKCiAgICAgICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICAgICAga3NuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CiAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKCWlmICgha3NuYW1lKQoJICBrc25hbWUgPSAiTm8gTmFtZSI7CglUUkFDRV8oa2V5KSgiJXMgOiBrZXlzeW09JWx4ICglcyksICMgb2YgY2hhcnM9JWQgLyAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAoZXZlbnQtPnR5cGUgPT0gS2V5UHJlc3MpID8gIktleVByZXNzIiA6ICJLZXlSZWxlYXNlIiwKICAgICAgICAgICAgICAgICAgICBrZXlzeW0sIGtzbmFtZSwgYXNjaWlfY2hhcnMsIGRlYnVnc3RyX2FuKFN0ciwgYXNjaWlfY2hhcnMpKTsKICAgIH0KICAgIGlmIChidWYgIT0gU3RyKQogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFN0cik7CgogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICB2a2V5ID0gRVZFTlRfZXZlbnRfdG9fdmtleSh4aWMsZXZlbnQpOwogICAgLyogWCByZXR1cm5zIGtleWNvZGUgMCBmb3IgY29tcG9zZWQgY2hhcmFjdGVycyAqLwogICAgaWYgKCF2a2V5ICYmIGFzY2lpX2NoYXJzKSB2a2V5ID0gVktfTk9OQU1FOwogICAgd2luZV90c3gxMV91bmxvY2soKTsKCiAgICBUUkFDRV8oa2V5KSgia2V5Y29kZSAldSBjb252ZXJ0ZWQgdG8gdmtleSAweCVYXG4iLAogICAgICAgICAgICAgICAgZXZlbnQtPmtleWNvZGUsIHZrZXkpOwoKICAgIGlmICghdmtleSkgcmV0dXJuOwoKICAgIGR3RmxhZ3MgPSAwOwogICAgaWYgKCBldmVudC0+dHlwZSA9PSBLZXlSZWxlYXNlICkgZHdGbGFncyB8PSBLRVlFVkVOVEZfS0VZVVA7CiAgICBpZiAoIHZrZXkgJiAweDEwMCApICAgICAgICAgICAgICBkd0ZsYWdzIHw9IEtFWUVWRU5URl9FWFRFTkRFREtFWTsKCiAgICB1cGRhdGVfbG9ja19zdGF0ZSggaHduZCwgdmtleSwgZXZlbnQtPnN0YXRlLCBldmVudF90aW1lICk7CgogICAgYlNjYW4gPSBrZXljMnNjYW5bZXZlbnQtPmtleWNvZGVdICYgMHhGRjsKICAgIFRSQUNFXyhrZXkpKCJiU2NhbiA9IDB4JTAyeC5cbiIsIGJTY2FuKTsKCiAgICBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dCggaHduZCwgdmtleSAmIDB4ZmYsIGJTY2FuLCBkd0ZsYWdzLCBldmVudF90aW1lICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlYMTFEUlZfS0VZQk9BUkRfRGV0ZWN0TGF5b3V0CiAqCiAqIENhbGxlZCBmcm9tIFgxMURSVl9Jbml0S2V5Ym9hcmQKICogIFRoaXMgcm91dGluZSB3YWxrcyB0aHJvdWdoIHRoZSBkZWZpbmVkIGtleWJvYXJkIGxheW91dHMgYW5kIHNlbGVjdHMKICogIHdoaWNoZXZlciBtYXRjaGVzIG1vc3QgY2xvc2VseS4KICogWDExIGxvY2sgbXVzdCBiZSBoZWxkLgogKi8Kc3RhdGljIHZvaWQKWDExRFJWX0tFWUJPQVJEX0RldGVjdExheW91dCggRGlzcGxheSAqZGlzcGxheSApCnsKICB1bnNpZ25lZCBjdXJyZW50LCBtYXRjaCwgbWlzbWF0Y2gsIHNlcSwgaSwgc3ltczsKICBpbnQgc2NvcmUsIGtleWMsIGtleSwgcGtleSwgb2s7CiAgS2V5U3ltIGtleXN5bSA9IDA7CiAgY29uc3QgY2hhciAoKmxrZXkpW01BSU5fTEVOXVs0XTsKICB1bnNpZ25lZCBtYXhfc2VxID0gMDsKICBpbnQgbWF4X3Njb3JlID0gMCwgaXNtYXRjaCA9IDA7CiAgY2hhciBja2V5WzI1Nl1bNF07CgogIHN5bXMgPSBrZXlzeW1zX3Blcl9rZXljb2RlOwogIGlmIChzeW1zID4gNCkgewogICAgV0FSTigiJWQga2V5c3ltcyBwZXIga2V5Y29kZSBub3Qgc3VwcG9ydGVkLCBzZXQgdG8gNFxuIiwgc3ltcyk7CiAgICBzeW1zID0gNDsKICB9CgogIG1lbXNldCggY2tleSwgMCwgc2l6ZW9mKGNrZXkpICk7CiAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykgewogICAgICAvKiBnZXQgZGF0YSBmb3Iga2V5Y29kZSBmcm9tIFggc2VydmVyICovCiAgICAgIGZvciAoaSA9IDA7IGkgPCBzeW1zOyBpKyspIHsKICAgICAgICBpZiAoIShrZXlzeW0gPSBrZXljb2RlX3RvX2tleXN5bSAoZGlzcGxheSwga2V5YywgaSkpKSBjb250aW51ZTsKCS8qIEFsbG93IGJvdGggb25lLWJ5dGUgYW5kIHR3by1ieXRlIG5hdGlvbmFsIGtleXN5bXMgKi8KCWlmICgoa2V5c3ltIDwgMHg4MDAwKSAmJiAoa2V5c3ltICE9ICcgJykpCiAgICAgICAgewojaWZkZWYgSEFWRV9YS0IKICAgICAgICAgICAgaWYgKCF1c2VfeGtiIHx8ICFYa2JUcmFuc2xhdGVLZXlTeW0oZGlzcGxheSwgJmtleXN5bSwgMCwgJmNrZXlba2V5Y11baV0sIDEsIE5VTEwpKQojZW5kaWYKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVFJBQ0UoIlhLQiBjb3VsZCBub3QgdHJhbnNsYXRlIGtleXN5bSAlMDRseFxuIiwga2V5c3ltKTsKICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBxdWVyeSB3aGF0IGtleXN5bSBpcyB1c2VkIGFzIE1vZGVfc3dpdGNoLCBmaWxsIFhLZXlFdmVudAogICAgICAgICAgICAgICAgICogd2l0aCBhcHByb3ByaWF0ZSBTaGlmdE1hc2sgYW5kIE1vZGVfc3dpdGNoLCB1c2UgWExvb2t1cFN0cmluZwogICAgICAgICAgICAgICAgICogdG8gZ2V0IGNoYXJhY3RlciBpbiB0aGUgbG9jYWwgZW5jb2RpbmcuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGNrZXlba2V5Y11baV0gPSBrZXlzeW0gJiAweEZGOwogICAgICAgICAgICB9CiAgICAgICAgfQoJZWxzZSB7CgkgIGNrZXlba2V5Y11baV0gPSBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKGtleXN5bSk7Cgl9CiAgICAgIH0KICB9CgogIGZvciAoY3VycmVudCA9IDA7IG1haW5fa2V5X3RhYltjdXJyZW50XS5jb21tZW50OyBjdXJyZW50KyspIHsKICAgIFRSQUNFKCJBdHRlbXB0aW5nIHRvIG1hdGNoIGFnYWluc3QgXCIlc1wiXG4iLCBtYWluX2tleV90YWJbY3VycmVudF0uY29tbWVudCk7CiAgICBtYXRjaCA9IDA7CiAgICBtaXNtYXRjaCA9IDA7CiAgICBzY29yZSA9IDA7CiAgICBzZXEgPSAwOwogICAgbGtleSA9IG1haW5fa2V5X3RhYltjdXJyZW50XS5rZXk7CiAgICBwa2V5ID0gLTE7CiAgICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKSB7CiAgICAgIGlmIChja2V5W2tleWNdWzBdKSB7CgkvKiBzZWFyY2ggZm9yIGEgbWF0Y2ggaW4gbGF5b3V0IHRhYmxlICovCgkvKiByaWdodCBub3csIHdlIGp1c3QgZmluZCBhbiBhYnNvbHV0ZSBtYXRjaCBmb3IgZGVmaW5lZCBwb3NpdGlvbnMgKi8KCS8qICh1bmRlZmluZWQgcG9zaXRpb25zIGFyZSBpZ25vcmVkLCBzbyBpZiBpdCdzIGRlZmluZWQgYXMgIjMjIiBpbiAqLwoJLyogdGhlIHRhYmxlLCBpdCdzIG9rYXkgdGhhdCB0aGUgWCBzZXJ2ZXIgaGFzICIzI8KjIiwgZm9yIGV4YW1wbGUpICovCgkvKiBob3dldmVyLCB0aGUgc2NvcmUgd2lsbCBiZSBoaWdoZXIgZm9yIGxvbmdlciBtYXRjaGVzICovCglmb3IgKGtleSA9IDA7IGtleSA8IE1BSU5fTEVOOyBrZXkrKykgewoJICBmb3IgKG9rID0gMCwgaSA9IDA7IChvayA+PSAwKSAmJiAoaSA8IHN5bXMpOyBpKyspIHsKCSAgICBpZiAoKCpsa2V5KVtrZXldW2ldICYmICgoKmxrZXkpW2tleV1baV0gPT0gY2tleVtrZXljXVtpXSkpCgkgICAgICBvaysrOwoJICAgIGlmICgoKmxrZXkpW2tleV1baV0gJiYgKCgqbGtleSlba2V5XVtpXSAhPSBja2V5W2tleWNdW2ldKSkKCSAgICAgIG9rID0gLTE7CgkgIH0KCSAgaWYgKG9rID4gMCkgewoJICAgIHNjb3JlICs9IG9rOwoJICAgIGJyZWFrOwoJICB9Cgl9CgkvKiBjb3VudCB0aGUgbWF0Y2hlcyBhbmQgbWlzbWF0Y2hlcyAqLwoJaWYgKG9rID4gMCkgewoJICBtYXRjaCsrOwoJICAvKiBhbmQgaG93IG11Y2ggdGhlIGtleWNvZGUgb3JkZXIgbWF0Y2hlcyAqLwoJICBpZiAoa2V5ID4gcGtleSkgc2VxKys7CgkgIHBrZXkgPSBrZXk7Cgl9IGVsc2UgewogICAgICAgICAgLyogcHJpbnQgc3BhY2VzIGluc3RlYWQgb2YgXDAncyAqLwogICAgICAgICAgY2hhciBzdHJbNV07CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSBzdHJbaV0gPSBja2V5W2tleWNdW2ldID8gY2tleVtrZXljXVtpXSA6ICcgJzsKICAgICAgICAgIHN0cls0XSA9IDA7CiAgICAgICAgICBUUkFDRV8oa2V5KSgibWlzbWF0Y2ggZm9yIGtleWNvZGUgJXUsIGdvdCAlc1xuIiwga2V5Yywgc3RyKTsKICAgICAgICAgIG1pc21hdGNoKys7CiAgICAgICAgICBzY29yZSAtPSBzeW1zOwoJfQogICAgICB9CiAgICB9CiAgICBUUkFDRSgibWF0Y2hlcz0lZCwgbWlzbWF0Y2hlcz0lZCwgc2VxPSVkLCBzY29yZT0lZFxuIiwKCSAgIG1hdGNoLCBtaXNtYXRjaCwgc2VxLCBzY29yZSk7CiAgICBpZiAoKHNjb3JlID4gbWF4X3Njb3JlKSB8fAoJKChzY29yZSA9PSBtYXhfc2NvcmUpICYmIChzZXEgPiBtYXhfc2VxKSkpIHsKICAgICAgLyogYmVzdCBtYXRjaCBzbyBmYXIgKi8KICAgICAga2JkX2xheW91dCA9IGN1cnJlbnQ7CiAgICAgIG1heF9zY29yZSA9IHNjb3JlOwogICAgICBtYXhfc2VxID0gc2VxOwogICAgICBpc21hdGNoID0gIW1pc21hdGNoOwogICAgfQogIH0KICAvKiB3ZSdyZSBkb25lLCByZXBvcnQgcmVzdWx0cyBpZiBuZWNlc3NhcnkgKi8KICBpZiAoIWlzbWF0Y2gpCiAgICBXQVJOKCJVc2luZyBjbG9zZXN0IG1hdGNoICglcykgZm9yIHNjYW4vdmlydHVhbCBjb2RlcyBtYXBwaW5nLlxuIiwKICAgICAgICBtYWluX2tleV90YWJba2JkX2xheW91dF0uY29tbWVudCk7CgogIFRSQUNFKCJkZXRlY3RlZCBsYXlvdXQgaXMgXCIlc1wiXG4iLCBtYWluX2tleV90YWJba2JkX2xheW91dF0uY29tbWVudCk7Cn0KCnN0YXRpYyBIS0wgZ2V0X2xvY2FsZV9rYmRfbGF5b3V0KHZvaWQpCnsKICAgIFVMT05HX1BUUiBsYXlvdXQ7CiAgICBMQU5HSUQgbGFuZ2lkOwoKICAgIC8qIEZJWE1FOgogICAgICoKICAgICAqIGxheW91dCA9IG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5sY2lkOwogICAgICoKICAgICAqIFdpbndvcmQgdXNlcyByZXR1cm4gdmFsdWUgb2YgR2V0S2V5Ym9hcmRMYXlvdXQgYXMgYSBjb2RlcGFnZQogICAgICogdG8gdHJhbnNsYXRlIEFOU0kga2V5Ym9hcmQgbWVzc2FnZXMgdG8gdW5pY29kZS4gQnV0IHdlIGhhdmUKICAgICAqIGEgcHJvYmxlbSB3aXRoIGl0OiBmb3IgaW5zdGFuY2UgUG9saXNoIGtleWJvYXJkIGxheW91dCBpcwogICAgICogaWRlbnRpY2FsIHRvIHRoZSBVUyBvbmUsIGFuZCB0aGVyZWZvcmUgaW5zdGVhZCBvZiB0aGUgUG9saXNoCiAgICAgKiBsb2NhbGUgaWQgd2UgcmV0dXJuIHRoZSBVUyBvbmUuCiAgICAgKi8KCiAgICBsYXlvdXQgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsKCiAgICAvKgogICAgICogTWljcm9zb2Z0IE9mZmljZSBleHBlY3RzIHRoaXMgdmFsdWUgdG8gYmUgc29tZXRoaW5nIHNwZWNpZmljCiAgICAgKiBmb3IgSmFwYW5lc2UgYW5kIEtvcmVhbiBXaW5kb3dzIHdpdGggYW4gSU1FIHRoZSB2YWx1ZSBpcyAweGUwMDEKICAgICAqIFdlIHNob3VsZCBwcm9iYWJseSBjaGVjayB0byBzZWUgaWYgYW4gSU1FIGV4aXN0cyBhbmQgaWYgc28gdGhlbgogICAgICogc2V0IHRoaXMgd29yZCBwcm9wZXJseS4KICAgICAqLwogICAgbGFuZ2lkID0gUFJJTUFSWUxBTkdJRChMQU5HSURGUk9NTENJRChsYXlvdXQpKTsKICAgIGlmIChsYW5naWQgPT0gTEFOR19DSElORVNFIHx8IGxhbmdpZCA9PSBMQU5HX0pBUEFORVNFIHx8IGxhbmdpZCA9PSBMQU5HX0tPUkVBTikKICAgICAgICBsYXlvdXQgfD0gMHhlMDAxIDw8IDE2OyAvKiBJTUUgKi8KICAgIGVsc2UKICAgICAgICBsYXlvdXQgfD0gbGF5b3V0IDw8IDE2OwoKICAgIHJldHVybiAoSEtMKWxheW91dDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICBHZXRLZXlib2FyZExheW91dE5hbWUgKFgxMURSVi5AKQogKi8KQk9PTCBDREVDTCBYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXROYW1lKExQV1NUUiBuYW1lKQp7CiAgICBzdGF0aWMgY29uc3QgV0NIQVIgZm9ybWF0V1tdID0geyclJywnMCcsJzgnLCd4JywwfTsKICAgIERXT1JEIGxheW91dDsKCiAgICBsYXlvdXQgPSBIYW5kbGVUb1Vsb25nKCBnZXRfbG9jYWxlX2tiZF9sYXlvdXQoKSApOwogICAgaWYgKEhJV09SRChsYXlvdXQpID09IExPV09SRChsYXlvdXQpKSBsYXlvdXQgPSBMT1dPUkQobGF5b3V0KTsKICAgIHNwcmludGZXKG5hbWUsIGZvcm1hdFcsIGxheW91dCk7CiAgICBUUkFDRSgicmV0dXJuaW5nICVzXG4iLCBkZWJ1Z3N0cl93KG5hbWUpKTsKICAgIHJldHVybiBUUlVFOwp9CgpzdGF0aWMgdm9pZCBzZXRfa2JkX2xheW91dF9wcmVsb2FkX2tleSh2b2lkKQp7CiAgICBzdGF0aWMgY29uc3QgV0NIQVIgcHJlbG9hZFtdID0KICAgICAgICB7J0snLCdlJywneScsJ2InLCdvJywnYScsJ3InLCdkJywnICcsJ0wnLCdhJywneScsJ28nLCd1JywndCcsJ1xcJywnUCcsJ3InLCdlJywnbCcsJ28nLCdhJywnZCcsMH07CiAgICBzdGF0aWMgY29uc3QgV0NIQVIgb25lW10gPSB7JzEnLDB9OwoKICAgIEhLRVkgaGtleTsKICAgIFdDSEFSIGxheW91dFtLTF9OQU1FTEVOR1RIXTsKCiAgICBpZiAoUmVnQ3JlYXRlS2V5RXhXKEhLRVlfQ1VSUkVOVF9VU0VSLCBwcmVsb2FkLCAwLCBOVUxMLCAwLCBLRVlfQUxMX0FDQ0VTUywgTlVMTCwgJmhrZXksIE5VTEwpKQogICAgICAgIHJldHVybjsKCiAgICBpZiAoIVJlZ1F1ZXJ5VmFsdWVFeFcoaGtleSwgb25lLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkKICAgIHsKICAgICAgICBSZWdDbG9zZUtleShoa2V5KTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoWDExRFJWX0dldEtleWJvYXJkTGF5b3V0TmFtZShsYXlvdXQpKQogICAgICAgIFJlZ1NldFZhbHVlRXhXKGhrZXksIG9uZSwgMCwgUkVHX1NaLCAoY29uc3QgQllURSAqKWxheW91dCwgc2l6ZW9mKGxheW91dCkpOwoKICAgIFJlZ0Nsb3NlS2V5KGhrZXkpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0luaXRLZXlib2FyZAogKi8Kdm9pZCBYMTFEUlZfSW5pdEtleWJvYXJkKCBEaXNwbGF5ICpkaXNwbGF5ICkKewogICAgWE1vZGlmaWVyS2V5bWFwICptbXA7CiAgICBLZXlTeW0ga2V5c3ltOwogICAgS2V5Q29kZSAqa2NwOwogICAgWEtleUV2ZW50IGUyOwogICAgV09SRCBzY2FuLCB2a2V5OwogICAgaW50IGtleWMsIGksIGtleW4sIHN5bXM7CiAgICBjaGFyIGNrZXlbNF09ezAsMCwwLDB9OwogICAgY29uc3QgY2hhciAoKmxrZXkpW01BSU5fTEVOXVs0XTsKICAgIGNoYXIgdmtleV91c2VkWzI1Nl0gPSB7IDAgfTsKCiAgICAvKiBSYW5nZXMgb2YgT0VNLCBmdW5jdGlvbiBrZXksIGFuZCBjaGFyYWN0ZXIgdmlydHVhbCBrZXkgY29kZXMuCiAgICAgKiBEb24ndCBpbmNsdWRlIHRob3NlIGhhbmRsZWQgc3BlY2lhbGx5IGluIFgxMURSVl9Ub1VuaWNvZGVFeCBhbmQKICAgICAqIFgxMURSVl9NYXBWaXJ0dWFsS2V5RXgsIGxpa2UgVktfTlVNUEFEMCAtIFZLX0RJVklERS4gKi8KICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewogICAgICAgIFdPUkQgZmlyc3QsIGxhc3Q7CiAgICB9IHZrZXlfcmFuZ2VzW10gPSB7CiAgICAgICAgeyBWS19PRU1fMSwgVktfT0VNXzMgfSwKICAgICAgICB7IFZLX09FTV80LCBWS19JQ09fMDAgfSwKICAgICAgICB7IDB4ZTYsIDB4ZTYgfSwKICAgICAgICB7IDB4ZTksIDB4ZjUgfSwKICAgICAgICB7IFZLX09FTV9ORUNfRVFVQUwsIFZLX09FTV9ORUNfRVFVQUwgfSwKICAgICAgICB7IFZLX0YxLCBWS19GMjQgfSwKICAgICAgICB7IDB4MzAsIDB4MzkgfSwgLyogVktfMCAtIFZLXzkgKi8KICAgICAgICB7IDB4NDEsIDB4NWEgfSwgLyogVktfQSAtIFZLX1ogKi8KICAgICAgICB7IDAsIDAgfQogICAgfTsKICAgIGludCB2a2V5X3JhbmdlOwoKICAgIHNldF9rYmRfbGF5b3V0X3ByZWxvYWRfa2V5KCk7CgogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICBYRGlzcGxheUtleWNvZGVzKGRpc3BsYXksICZtaW5fa2V5Y29kZSwgJm1heF9rZXljb2RlKTsKICAgIGlmIChrZXlfbWFwcGluZykgWEZyZWUoIGtleV9tYXBwaW5nICk7CiAgICBrZXlfbWFwcGluZyA9IFhHZXRLZXlib2FyZE1hcHBpbmcoZGlzcGxheSwgbWluX2tleWNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2tleWNvZGUgKyAxIC0gbWluX2tleWNvZGUsICZrZXlzeW1zX3Blcl9rZXljb2RlKTsKCiAgICBtbXAgPSBYR2V0TW9kaWZpZXJNYXBwaW5nKGRpc3BsYXkpOwogICAga2NwID0gbW1wLT5tb2RpZmllcm1hcDsKICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpICs9IDEpIC8qIFRoZXJlIGFyZSA4IG1vZGlmaWVyIGtleXMgKi8KICAgIHsKICAgICAgICBpbnQgajsKCiAgICAgICAgZm9yIChqID0gMDsgaiA8IG1tcC0+bWF4X2tleXBlcm1vZDsgaiArPSAxLCBrY3AgKz0gMSkKCSAgICBpZiAoKmtjcCkKICAgICAgICAgICAgewoJCWludCBrOwoKCQlmb3IgKGsgPSAwOyBrIDwga2V5c3ltc19wZXJfa2V5Y29kZTsgayArPSAxKQogICAgICAgICAgICAgICAgICAgIGlmIChrZXljb2RlX3RvX2tleXN5bShkaXNwbGF5LCAqa2NwLCBrKSA9PSBYS19OdW1fTG9jaykKCQkgICAgewogICAgICAgICAgICAgICAgICAgICAgICBOdW1Mb2NrTWFzayA9IDEgPDwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGtleSkoIk51bUxvY2tNYXNrIGlzICV4XG4iLCBOdW1Mb2NrTWFzayk7CgkJICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXljb2RlX3RvX2tleXN5bShkaXNwbGF5LCAqa2NwLCBrKSA9PSBYS19TY3JvbGxfTG9jaykKCQkgICAgewogICAgICAgICAgICAgICAgICAgICAgICBTY3JvbGxMb2NrTWFzayA9IDEgPDwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGtleSkoIlNjcm9sbExvY2tNYXNrIGlzICV4XG4iLCBTY3JvbGxMb2NrTWFzayk7CgkJICAgIH0KICAgICAgICAgICAgfQogICAgfQogICAgWEZyZWVNb2RpZmllcm1hcChtbXApOwoKICAgIC8qIERldGVjdCB0aGUga2V5Ym9hcmQgbGF5b3V0ICovCiAgICBYMTFEUlZfS0VZQk9BUkRfRGV0ZWN0TGF5b3V0KCBkaXNwbGF5ICk7CiAgICBsa2V5ID0gbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLmtleTsKICAgIHN5bXMgPSAoa2V5c3ltc19wZXJfa2V5Y29kZSA+IDQpID8gNCA6IGtleXN5bXNfcGVyX2tleWNvZGU7CgogICAgLyogTm93IGJ1aWxkIHR3byBjb252ZXJzaW9uIGFycmF5cyA6CiAgICAgKiBrZXljb2RlIC0+IHZrZXkgKyBzY2FuY29kZSArIGV4dGVuZGVkCiAgICAgKiB2a2V5ICsgZXh0ZW5kZWQgLT4ga2V5Y29kZSAqLwoKICAgIGUyLmRpc3BsYXkgPSBkaXNwbGF5OwogICAgZTIuc3RhdGUgPSAwOwogICAgZTIudHlwZSA9IEtleVByZXNzOwoKICAgIG1lbXNldChrZXljMnZrZXksIDAsIHNpemVvZihrZXljMnZrZXkpKTsKICAgIGZvciAoa2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspCiAgICB7CiAgICAgICAgY2hhciBidWZbMzBdOwogICAgICAgIGludCBoYXZlX2NoYXJzOwoKICAgICAgICBrZXlzeW0gPSAwOwogICAgICAgIGUyLmtleWNvZGUgPSAoS2V5Q29kZSlrZXljOwogICAgICAgIGhhdmVfY2hhcnMgPSBYTG9va3VwU3RyaW5nKCZlMiwgYnVmLCBzaXplb2YoYnVmKSwgJmtleXN5bSwgTlVMTCk7CiAgICAgICAgdmtleSA9IDA7IHNjYW4gPSAwOwogICAgICAgIGlmIChrZXlzeW0pICAvKiBvdGhlcndpc2UsIGtleWNvZGUgbm90IHVzZWQgKi8KICAgICAgICB7CiAgICAgICAgICAgIGlmICgoa2V5c3ltID4+IDgpID09IDB4RkYpICAgICAgICAgLyogbm9uLWNoYXJhY3RlciBrZXkgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmtleSA9IG5vbmNoYXJfa2V5X3ZrZXlba2V5c3ltICYgMHhmZl07CiAgICAgICAgICAgICAgICBzY2FuID0gbm9uY2hhcl9rZXlfc2NhbltrZXlzeW0gJiAweGZmXTsKCQkvKiBzZXQgZXh0ZW5kZWQgYml0IHdoZW4gbmVjZXNzYXJ5ICovCgkJaWYgKHNjYW4gJiAweDEwMCkgdmtleSB8PSAweDEwMDsKICAgICAgICAgICAgfSBlbHNlIGlmICgoa2V5c3ltID4+IDgpID09IDB4MTAwOEZGKSB7IC8qIFhGcmVlODYgdmVuZG9yIGtleXMgKi8KICAgICAgICAgICAgICAgIHZrZXkgPSB4ZnJlZTg2X3ZlbmRvcl9rZXlfdmtleVtrZXlzeW0gJiAweGZmXTsKICAgICAgICAgICAgICAgIC8qIEFsbCB2ZW5kb3Iga2V5cyBhcmUgZXh0ZW5kZWQgd2l0aCBhIHNjYW4gY29kZSBvZiAwIHBlciB0ZXN0aW5nIG9uIFdpblhQICovCiAgICAgICAgICAgICAgICBzY2FuID0gMHgxMDA7CgkJdmtleSB8PSAweDEwMDsKICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlzeW0gPT0gMHgyMCkgeyAgICAgICAgICAgICAgICAgLyogU3BhY2ViYXIgKi8KCSAgICAgICAgdmtleSA9IFZLX1NQQUNFOwoJCXNjYW4gPSAweDM5OwoJICAgIH0gZWxzZSBpZiAoaGF2ZV9jaGFycykgewoJICAgICAgLyogd2Ugc2VlbSB0byBuZWVkIHRvIHNlYXJjaCB0aGUgbGF5b3V0LWRlcGVuZGVudCBzY2FuY29kZXMgKi8KCSAgICAgIGludCBtYXhsZW49MCxtYXh2YWw9LTEsb2s7CgkgICAgICBmb3IgKGk9MDsgaTxzeW1zOyBpKyspIHsKCQlrZXlzeW0gPSBrZXljb2RlX3RvX2tleXN5bShkaXNwbGF5LCBrZXljLCBpKTsKCQlpZiAoKGtleXN5bTwweDgwMDApICYmIChrZXlzeW0hPScgJykpCiAgICAgICAgICAgICAgICB7CiNpZmRlZiBIQVZFX1hLQgogICAgICAgICAgICAgICAgICAgIGlmICghdXNlX3hrYiB8fCAhWGtiVHJhbnNsYXRlS2V5U3ltKGRpc3BsYXksICZrZXlzeW0sIDAsICZja2V5W2ldLCAxLCBOVUxMKSkKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvKiBGSVhNRTogcXVlcnkgd2hhdCBrZXlzeW0gaXMgdXNlZCBhcyBNb2RlX3N3aXRjaCwgZmlsbCBYS2V5RXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICogd2l0aCBhcHByb3ByaWF0ZSBTaGlmdE1hc2sgYW5kIE1vZGVfc3dpdGNoLCB1c2UgWExvb2t1cFN0cmluZwogICAgICAgICAgICAgICAgICAgICAgICAgKiB0byBnZXQgY2hhcmFjdGVyIGluIHRoZSBsb2NhbCBlbmNvZGluZy4KICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNrZXlbaV0gPSAoa2V5c3ltIDw9IDB4N0YpID8ga2V5c3ltIDogMDsKICAgICAgICAgICAgICAgICAgICB9CgkJfSBlbHNlIHsKCQkgIGNrZXlbaV0gPSBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKGtleXN5bSk7CgkJfQoJICAgICAgfQoJICAgICAgLyogZmluZCBrZXkgd2l0aCBsb25nZXN0IG1hdGNoIHN0cmVhayAqLwoJICAgICAgZm9yIChrZXluPTA7IGtleW48TUFJTl9MRU47IGtleW4rKykgewoJCWZvciAob2s9KCpsa2V5KVtrZXluXVtpPTBdOyBvayYmKGk8NCk7IGkrKykKCQkgIGlmICgoKmxrZXkpW2tleW5dW2ldICYmICgqbGtleSlba2V5bl1baV0hPWNrZXlbaV0pIG9rPTA7CgkJaWYgKCFvaykgaS0tOyAvKiB3ZSBvdmVyc2hvdCAqLwoJCWlmIChva3x8KGk+bWF4bGVuKSkgewoJCSAgbWF4bGVuPWk7IG1heHZhbD1rZXluOwoJCX0KCQlpZiAob2spIGJyZWFrOwoJICAgICAgfQoJICAgICAgaWYgKG1heHZhbD49MCkgewoJCS8qIGdvdCBpdCAqLwoJCWNvbnN0IFdPUkQgKCpsc2NhbilbTUFJTl9MRU5dID0gbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLnNjYW47CgkJY29uc3QgV09SRCAoKmx2a2V5KVtNQUlOX0xFTl0gPSBtYWluX2tleV90YWJba2JkX2xheW91dF0udmtleTsKCQlzY2FuID0gKCpsc2NhbilbbWF4dmFsXTsKCQl2a2V5ID0gKCpsdmtleSlbbWF4dmFsXTsKCSAgICAgIH0KCSAgICB9CiAgICAgICAgfQogICAgICAgIFRSQUNFKCJrZXljb2RlICV1ID0+IHZrZXkgJTA0WFxuIiwgZTIua2V5Y29kZSwgdmtleSk7CiAgICAgICAga2V5YzJ2a2V5W2UyLmtleWNvZGVdID0gdmtleTsKICAgICAgICBrZXljMnNjYW5bZTIua2V5Y29kZV0gPSBzY2FuOwogICAgICAgIGlmICgodmtleSAmIDB4ZmYpICYmIHZrZXlfdXNlZFsodmtleSAmIDB4ZmYpXSkKICAgICAgICAgICAgV0FSTigidmtleSAlMDRYIGlzIGJlaW5nIHVzZWQgYnkgbW9yZSB0aGFuIG9uZSBrZXljb2RlXG4iLCB2a2V5KTsKICAgICAgICB2a2V5X3VzZWRbKHZrZXkgJiAweGZmKV0gPSAxOwogICAgfSAvKiBmb3IgKi8KCiNkZWZpbmUgVktFWV9JRl9OT1RfVVNFRCh2a2V5KSAodmtleV91c2VkWyh2a2V5KV0gPyAwIDogKHZrZXlfdXNlZFsodmtleSldID0gMSwgKHZrZXkpKSkKICAgIGZvciAoa2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspCiAgICB7CiAgICAgICAgdmtleSA9IGtleWMydmtleVtrZXljXSAmIDB4ZmY7CiAgICAgICAgaWYgKHZrZXkpCiAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICBlMi5rZXljb2RlID0gKEtleUNvZGUpa2V5YzsKICAgICAgICBrZXlzeW0gPSBYTG9va3VwS2V5c3ltKCZlMiwgMCk7CiAgICAgICAgaWYgKCFrZXlzeW0pCiAgICAgICAgICAgY29udGludWU7CgogICAgICAgIC8qIGZpbmQgYSBzdWl0YWJsZSBsYXlvdXQtZGVwZW5kZW50IFZLIGNvZGUgKi8KICAgICAgICAvKiAobW9zdCBXaW5lbGliIGFwcHMgb3VnaHQgdG8gYmUgYWJsZSB0byB3b3JrIHdpdGhvdXQgbGF5b3V0IHRhYmxlcyEpICovCiAgICAgICAgZm9yIChpID0gMDsgKGkgPCBrZXlzeW1zX3Blcl9rZXljb2RlKSAmJiAoIXZrZXkpOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBrZXlzeW0gPSBYTG9va3VwS2V5c3ltKCZlMiwgaSk7CiAgICAgICAgICAgIGlmICgoa2V5c3ltID49IFhLXzAgJiYga2V5c3ltIDw9IFhLXzkpCiAgICAgICAgICAgICAgICB8fCAoa2V5c3ltID49IFhLX0EgJiYga2V5c3ltIDw9IFhLX1opKSB7CiAgICAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChrZXlzeW0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgKGkgPSAwOyAoaSA8IGtleXN5bXNfcGVyX2tleWNvZGUpICYmICghdmtleSk7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGtleXN5bSA9IFhMb29rdXBLZXlzeW0oJmUyLCBpKTsKICAgICAgICAgICAgc3dpdGNoIChrZXlzeW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgY2FzZSAnOyc6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV8xKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJy8nOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fMik7IGJyZWFrOwogICAgICAgICAgICBjYXNlICdgJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNXzMpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnWyc6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV80KTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ1xcJzogICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fNSk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICddJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNXzYpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnXCcnOiAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV83KTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJywnOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fQ09NTUEpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnLic6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV9QRVJJT0QpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnLSc6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV9NSU5VUyk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICcrJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNX1BMVVMpOyBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHZrZXkpCiAgICAgICAgewogICAgICAgICAgICBUUkFDRSgia2V5Y29kZSAldSA9PiB2a2V5ICUwNFhcbiIsIGUyLmtleWNvZGUsIHZrZXkpOwogICAgICAgICAgICBrZXljMnZrZXlbZTIua2V5Y29kZV0gPSB2a2V5OwogICAgICAgIH0KICAgIH0gLyogZm9yICovCgogICAgLyogRm9yIGFueSBrZXljb2RlcyB3aGljaCBzdGlsbCBkb24ndCBoYXZlIGEgdmtleSwgYXNzaWduIGFueSBzcGFyZQogICAgICogY2hhcmFjdGVyLCBmdW5jdGlvbiBrZXksIG9yIE9FTSB2aXJ0dWFsIGtleSBjb2RlLiAqLwogICAgdmtleV9yYW5nZSA9IDA7CiAgICB2a2V5ID0gdmtleV9yYW5nZXNbdmtleV9yYW5nZV0uZmlyc3Q7CiAgICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKQogICAgewogICAgICAgIGlmIChrZXljMnZrZXlba2V5Y10gJiAweGZmKQogICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgZTIua2V5Y29kZSA9IChLZXlDb2RlKWtleWM7CiAgICAgICAga2V5c3ltID0gWExvb2t1cEtleXN5bSgmZTIsIDApOwogICAgICAgIGlmICgha2V5c3ltKQogICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICB3aGlsZSAodmtleSAmJiB2a2V5X3VzZWRbdmtleV0pCiAgICAgICAgewogICAgICAgICAgICBpZiAodmtleSA9PSB2a2V5X3Jhbmdlc1t2a2V5X3JhbmdlXS5sYXN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2a2V5X3JhbmdlKys7CiAgICAgICAgICAgICAgICB2a2V5ID0gdmtleV9yYW5nZXNbdmtleV9yYW5nZV0uZmlyc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgdmtleSsrOwogICAgICAgIH0KCiAgICAgICAgaWYgKCF2a2V5KQogICAgICAgIHsKICAgICAgICAgICAgV0FSTigiTm8gbW9yZSB2a2V5cyBhdmFpbGFibGUhXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZiAoVFJBQ0VfT04oa2V5Ym9hcmQpKQogICAgICAgIHsKICAgICAgICAgICAgVFJBQ0UoInNwYXJlIHZpcnR1YWwga2V5ICUwNFggYXNzaWduZWQgdG8ga2V5Y29kZSAldTpcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmtleSwgZTIua2V5Y29kZSk7CiAgICAgICAgICAgIFRSQUNFKCIoIik7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXlzeW1zX3Blcl9rZXljb2RlOyBpICs9IDEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtzbmFtZTsKCiAgICAgICAgICAgICAgICBrZXlzeW0gPSBYTG9va3VwS2V5c3ltKCZlMiwgaSk7CiAgICAgICAgICAgICAgICBrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKICAgICAgICAgICAgICAgIGlmICgha3NuYW1lKQogICAgICAgICAgICAgICAgICAgIGtzbmFtZSA9ICJOb1N5bWJvbCI7CiAgICAgICAgICAgICAgICBUUkFDRSggIiVseCAoJXMpICIsIGtleXN5bSwga3NuYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBUUkFDRSgiKVxuIik7CiAgICAgICAgfQoKICAgICAgICBUUkFDRSgia2V5Y29kZSAldSA9PiB2a2V5ICUwNFhcbiIsIGUyLmtleWNvZGUsIHZrZXkpOwogICAgICAgIGtleWMydmtleVtlMi5rZXljb2RlXSA9IHZrZXk7CiAgICAgICAgdmtleV91c2VkW3ZrZXldID0gMTsKICAgIH0gLyogZm9yICovCiN1bmRlZiBWS0VZX0lGX05PVF9VU0VECgogICAgLyogSWYgc29tZSBrZXlzIHN0aWxsIGxhY2sgc2NhbmNvZGVzLCBhc3NpZ24gc29tZSBhcmJpdHJhcnkgb25lcyB0byB0aGVtIG5vdyAqLwogICAgZm9yIChzY2FuID0gMHg2MCwga2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspCiAgICAgIGlmIChrZXljMnZrZXlba2V5Y10mJiFrZXljMnNjYW5ba2V5Y10pIHsKCWNvbnN0IGNoYXIgKmtzbmFtZTsKCWtleXN5bSA9IGtleWNvZGVfdG9fa2V5c3ltKGRpc3BsYXksIGtleWMsIDApOwoJa3NuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CglpZiAoIWtzbmFtZSkga3NuYW1lID0gIk5vU3ltYm9sIjsKCgkvKiBzaG91bGQgbWFrZSBzdXJlIHRoZSBzY2FuY29kZSBpcyB1bmFzc2lnbmVkIGhlcmUsIGJ1dCA+PTB4NjAgY3VycmVudGx5IGFsd2F5cyBpcyAqLwoKCVRSQUNFXyhrZXkpKCJhc3NpZ25pbmcgc2NhbmNvZGUgJTAyeCB0byB1bmlkZW50aWZpZWQga2V5Y29kZSAldSAoJXMpXG4iLHNjYW4sa2V5Yyxrc25hbWUpOwoJa2V5YzJzY2FuW2tleWNdPXNjYW4rKzsKICAgICAgfQoKICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7Cn0KCnN0YXRpYyBCT09MIG1hdGNoX3gxMV9rZXlib2FyZF9sYXlvdXQoSEtMIGhrbCkKewogICAgY29uc3QgRFdPUkQgaXNJTUUgPSAweEUwMDAwMDAwOwogICAgSEtMIHhIa2wgPSBnZXRfbG9jYWxlX2tiZF9sYXlvdXQoKTsKCiAgICAvKiBpZiB0aGUgbGF5b3V0IGlzIGFuIElNRSwgb25seSBtYXRjaCB0aGUgbG93IHdvcmQgKExDSUQpICovCiAgICBpZiAoKChVTE9OR19QVFIpaGtsICYgaXNJTUUpID09IGlzSU1FKQogICAgICAgIHJldHVybiAoTE9XT1JEKGhrbCkgPT0gTE9XT1JEKHhIa2wpKTsKICAgIGVsc2UKICAgICAgICByZXR1cm4gKGhrbCA9PSB4SGtsKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldEFzeW5jS2V5U3RhdGUgKFgxMURSVi5AKQogKi8KU0hPUlQgQ0RFQ0wgWDExRFJWX0dldEFzeW5jS2V5U3RhdGUoSU5UIGtleSkKewogICAgLyogUGhvdG9zaG9wIGxpdmVsb2NrcyB1bmxlc3MgbW91c2UgZXZlbnRzIGFyZSBpbmNsdWRlZCBoZXJlICovCiAgICBYMTFEUlZfTXNnV2FpdEZvck11bHRpcGxlT2JqZWN0c0V4KCAwLCBOVUxMLCAwLCBRU19LRVkgfCBRU19NT1VTRSwgMCApOwogICAgcmV0dXJuIC0xOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRLZXlib2FyZExheW91dCAoWDExRFJWLkApCiAqLwpIS0wgQ0RFQ0wgWDExRFJWX0dldEtleWJvYXJkTGF5b3V0KERXT1JEIGR3VGhyZWFkaWQpCnsKICAgIGlmICghZHdUaHJlYWRpZCB8fCBkd1RocmVhZGlkID09IEdldEN1cnJlbnRUaHJlYWRJZCgpKQogICAgewogICAgICAgIHN0cnVjdCB4MTFkcnZfdGhyZWFkX2RhdGEgKnRocmVhZF9kYXRhID0geDExZHJ2X3RocmVhZF9kYXRhKCk7CiAgICAgICAgaWYgKHRocmVhZF9kYXRhICYmIHRocmVhZF9kYXRhLT5rYmRfbGF5b3V0KSByZXR1cm4gdGhyZWFkX2RhdGEtPmtiZF9sYXlvdXQ7CiAgICB9CiAgICBlbHNlCiAgICAgICAgRklYTUUoImNvdWxkbid0IHJldHVybiBrZXlib2FyZCBsYXlvdXQgZm9yIHRocmVhZCAlMDR4XG4iLCBkd1RocmVhZGlkKTsKCiAgICByZXR1cm4gZ2V0X2xvY2FsZV9rYmRfbGF5b3V0KCk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUxvYWRLZXlib2FyZExheW91dCAoWDExRFJWLkApCiAqLwpIS0wgQ0RFQ0wgWDExRFJWX0xvYWRLZXlib2FyZExheW91dChMUENXU1RSIG5hbWUsIFVJTlQgZmxhZ3MpCnsKICAgIEZJWE1FKCIlcywgJTA0eDogc3R1YiFcbiIsIGRlYnVnc3RyX3cobmFtZSksIGZsYWdzKTsKICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgICByZXR1cm4gMDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVW5sb2FkS2V5Ym9hcmRMYXlvdXQgKFgxMURSVi5AKQogKi8KQk9PTCBDREVDTCBYMTFEUlZfVW5sb2FkS2V5Ym9hcmRMYXlvdXQoSEtMIGhrbCkKewogICAgRklYTUUoIiVwOiBzdHViIVxuIiwgaGtsKTsKICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgICByZXR1cm4gRkFMU0U7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFjdGl2YXRlS2V5Ym9hcmRMYXlvdXQgKFgxMURSVi5AKQogKi8KSEtMIENERUNMIFgxMURSVl9BY3RpdmF0ZUtleWJvYXJkTGF5b3V0KEhLTCBoa2wsIFVJTlQgZmxhZ3MpCnsKICAgIEhLTCBvbGRIa2wgPSAwOwogICAgc3RydWN0IHgxMWRydl90aHJlYWRfZGF0YSAqdGhyZWFkX2RhdGEgPSB4MTFkcnZfaW5pdF90aHJlYWRfZGF0YSgpOwoKICAgIEZJWE1FKCIlcCwgJTA0eDogc2VtaS1zdHViIVxuIiwgaGtsLCBmbGFncyk7CiAgICBpZiAoZmxhZ3MgJiBLTEZfU0VURk9SUFJPQ0VTUykKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogICAgICAgIEZJWE1FKCJLTEZfU0VURk9SUFJPQ0VTUyBub3Qgc3VwcG9ydGVkXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAoZmxhZ3MpCiAgICAgICAgRklYTUUoImZsYWdzICV4IG5vdCBzdXBwb3J0ZWRcbiIsZmxhZ3MpOwoKICAgIGlmIChoa2wgPT0gKEhLTClIS0xfTkVYVCB8fCBoa2wgPT0gKEhLTClIS0xfUFJFVikKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogICAgICAgIEZJWE1FKCJIS0xfTkVYVCBhbmQgSEtMX1BSRVYgbm90IHN1cHBvcnRlZFxuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgaWYgKCFtYXRjaF94MTFfa2V5Ym9hcmRfbGF5b3V0KGhrbCkpCiAgICB7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgICAgICBGSVhNRSgic2V0dGluZyBrZXlib2FyZCBvZiBkaWZmZXJlbnQgbG9jYWxlcyBub3Qgc3VwcG9ydGVkXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBvbGRIa2wgPSB0aHJlYWRfZGF0YS0+a2JkX2xheW91dDsKICAgIGlmICghb2xkSGtsKSBvbGRIa2wgPSBnZXRfbG9jYWxlX2tiZF9sYXlvdXQoKTsKCiAgICB0aHJlYWRfZGF0YS0+a2JkX2xheW91dCA9IGhrbDsKCiAgICByZXR1cm4gb2xkSGtsOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBYMTFEUlZfTWFwcGluZ05vdGlmeQogKi8Kdm9pZCBYMTFEUlZfTWFwcGluZ05vdGlmeSggSFdORCBkdW1teSwgWEV2ZW50ICpldmVudCApCnsKICAgIEhXTkQgaHduZDsKCiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIFhSZWZyZXNoS2V5Ym9hcmRNYXBwaW5nKCZldmVudC0+eG1hcHBpbmcpOwogICAgd2luZV90c3gxMV91bmxvY2soKTsKICAgIFgxMURSVl9Jbml0S2V5Ym9hcmQoIGV2ZW50LT54bWFwcGluZy5kaXNwbGF5ICk7CgogICAgaHduZCA9IEdldEZvY3VzKCk7CiAgICBpZiAoIWh3bmQpIGh3bmQgPSBHZXRBY3RpdmVXaW5kb3coKTsKICAgIFBvc3RNZXNzYWdlVyhod25kLCBXTV9JTlBVVExBTkdDSEFOR0VSRVFVRVNULAogICAgICAgICAgICAgICAgIDAgLypGSVhNRSovLCAoTFBBUkFNKVgxMURSVl9HZXRLZXlib2FyZExheW91dCgwKSk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVZrS2V5U2NhbkV4IChYMTFEUlYuQCkKICoKICogTm90ZTogV2luZG93cyBpZ25vcmVzIEhLTCBwYXJhbWV0ZXIgYW5kIHVzZXMgY3VycmVudCBhY3RpdmUgbGF5b3V0IGluc3RlYWQKICovClNIT1JUIENERUNMIFgxMURSVl9Wa0tleVNjYW5FeChXQ0hBUiB3Q2hhciwgSEtMIGhrbCkKewogICAgRGlzcGxheSAqZGlzcGxheSA9IHRocmVhZF9pbml0X2Rpc3BsYXkoKTsKICAgIEtleUNvZGUga2V5Y29kZTsKICAgIEtleVN5bSBrZXlzeW07CiAgICBpbnQgaSwgaW5kZXg7CiAgICBDSEFSIGNDaGFyOwogICAgU0hPUlQgcmV0OwoKICAgIC8qIEZJWE1FOiB3aGF0IGhhcHBlbnMgaWYgd0NoYXIgaXMgbm90IGEgTGF0aW4xIGNoYXJhY3RlciBhbmQgQ1BfVU5JWENQCiAgICAgKiBpcyBVVEYtOCAobXVsdGlieXRlIGVuY29kaW5nKT8KICAgICAqLwogICAgaWYgKCFXaWRlQ2hhclRvTXVsdGlCeXRlKENQX1VOSVhDUCwgMCwgJndDaGFyLCAxLCAmY0NoYXIsIDEsIE5VTEwsIE5VTEwpKQogICAgewogICAgICAgIFdBUk4oIm5vIHRyYW5zbGF0aW9uIGZyb20gdW5pY29kZSB0byBDUF9VTklYQ1AgZm9yIDB4JTAyeFxuIiwgd0NoYXIpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBUUkFDRSgid0NoYXIgMHglMDJ4IC0+IGNDaGFyICclYydcbiIsIHdDaGFyLCBjQ2hhcik7CgogICAgLyogY2hhci0+a2V5c3ltIChzYW1lIGZvciBBTlNJIGNoYXJzKSAqLwogICAga2V5c3ltID0gKHVuc2lnbmVkIGNoYXIpY0NoYXI7IC8qICghKSBjQ2hhciBpcyBzaWduZWQgKi8KICAgIGlmIChrZXlzeW0gPD0gMjcpIGtleXN5bSArPSAweEZGMDA7IC8qIHNwZWNpYWwgY2hhcnMgOiByZXR1cm4sIGJhY2tzcGFjZS4uLiAqLwoKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAga2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwga2V5c3ltKTsgIC8qIGtleXN5bSAtPiBrZXljb2RlICovCiAgICBpZiAoIWtleWNvZGUpCiAgICB7CiAgICAgICAgaWYgKGtleXN5bSA+PSAweEZGMDApIC8qIFdpbmRvd3MgcmV0dXJucyAweDAyNDAgKyBjQ2hhciBpbiB0aGlzIGNhc2UgKi8KICAgICAgICB7CiAgICAgICAgICAgIHJldCA9IDB4MDI0MCArIGNDaGFyOyAvKiAweDAyMDAgaW5kaWNhdGVzIGEgY29udHJvbCBjaGFyYWN0ZXIgKi8KICAgICAgICAgICAgVFJBQ0UoIiAuLi4gcmV0dXJuaW5nIGN0cmwgY2hhciAlIy4yeFxuIiwgcmV0KTsKICAgICAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9CiAgICAgICAgLyogSXQgZGlkbid0IHdvcmsgLi4uIGxldCdzIHRyeSB3aXRoIGRlYWRjaGFyIGNvZGUuICovCiAgICAgICAgVFJBQ0UoInJldHJ5aW5nIHdpdGggfCAweEZFMDBcbiIpOwogICAgICAgIGtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIGtleXN5bSB8IDB4RkUwMCk7CiAgICB9CiAgICB3aW5lX3RzeDExX3VubG9jaygpOwoKICAgIFRSQUNFKCInJWMnKCVseCk6IGdvdCBrZXljb2RlICV1XG4iLCBjQ2hhciwga2V5c3ltLCBrZXljb2RlKTsKCiAgICAvKiBrZXljb2RlIC0+IChrZXljMnZrZXkpIHZrZXkgKi8KICAgIHJldCA9IGtleWMydmtleVtrZXljb2RlXTsKCiAgICBpZiAoIWtleWNvZGUgfHwgIXJldCkKICAgIHsKICAgICAgICBUUkFDRSgia2V5Y29kZSBmb3IgJyVjJyBub3QgZm91bmQsIHJldHVybmluZyAtMVxuIiwgY0NoYXIpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBpbmRleCA9IC0xOwogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSAvKiBmaW5kIHNoaWZ0IHN0YXRlICovCiAgICB7CiAgICAgICAgaWYgKGtleWNvZGVfdG9fa2V5c3ltKGRpc3BsYXksIGtleWNvZGUsIGkpID09IGtleXN5bSkKICAgICAgICB7CiAgICAgICAgICAgIGluZGV4ID0gaTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgd2luZV90c3gxMV91bmxvY2soKTsKCiAgICBzd2l0Y2ggKGluZGV4KQogICAgewogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgY2FzZSAtMToKICAgICAgICAgICAgV0FSTigiS2V5c3ltICVseCBub3QgZm91bmQgd2hpbGUgcGFyc2luZyB0aGUga2V5Y29kZSB0YWJsZVxuIiwga2V5c3ltKTsKICAgICAgICAgICAgcmV0dXJuIC0xOwoKICAgICAgICBjYXNlIDA6IGJyZWFrOwogICAgICAgIGNhc2UgMTogcmV0ICs9IDB4MDEwMDsgYnJlYWs7CiAgICAgICAgY2FzZSAyOiByZXQgKz0gMHgwNjAwOyBicmVhazsKICAgICAgICBjYXNlIDM6IHJldCArPSAweDA3MDA7IGJyZWFrOwogICAgfQogICAgLyoKICAgICAgaW5kZXggOiAwICAgICBhZGRzIDB4MDAwMAogICAgICBpbmRleCA6IDEgICAgIGFkZHMgMHgwMTAwIChzaGlmdCkKICAgICAgaW5kZXggOiA/ICAgICBhZGRzIDB4MDIwMCAoY3RybCkKICAgICAgaW5kZXggOiAyICAgICBhZGRzIDB4MDYwMCAoY3RybCthbHQpCiAgICAgIGluZGV4IDogMyAgICAgYWRkcyAweDA3MDAgKGN0cmwrYWx0K3NoaWZ0KQogICAgICovCgogICAgVFJBQ0UoIiAuLi4gcmV0dXJuaW5nICUjLjJ4XG4iLCByZXQpOwogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlNYXBWaXJ0dWFsS2V5RXggKFgxMURSVi5AKQogKi8KVUlOVCBDREVDTCBYMTFEUlZfTWFwVmlydHVhbEtleUV4KFVJTlQgd0NvZGUsIFVJTlQgd01hcFR5cGUsIEhLTCBoa2wpCnsKICAgIERpc3BsYXkgKmRpc3BsYXkgPSB0aHJlYWRfaW5pdF9kaXNwbGF5KCk7CgojZGVmaW5lIHJldHVybk1WSyh2YWx1ZSkgZG8geyBUUkFDRSgicmV0dXJuaW5nIDB4JXguXG4iLHZhbHVlKTsgcmV0dXJuIHZhbHVlOyB9IHdoaWxlKDApCgogICAgVFJBQ0UoIndDb2RlPTB4JXgsIHdNYXBUeXBlPSVkLCBoa2wgJXBcbiIsIHdDb2RlLCB3TWFwVHlwZSwgaGtsKTsKICAgIGlmICghbWF0Y2hfeDExX2tleWJvYXJkX2xheW91dChoa2wpKQogICAgICAgIEZJWE1FKCJrZXlib2FyZCBsYXlvdXQgJXAgaXMgbm90IHN1cHBvcnRlZFxuIiwgaGtsKTsKCiAgICBzd2l0Y2god01hcFR5cGUpCiAgICB7CiAgICAgICAgY2FzZSBNQVBWS19WS19UT19WU0M6IC8qIHZrZXktY29kZSB0byBzY2FuLWNvZGUgKi8KICAgICAgICBjYXNlIE1BUFZLX1ZLX1RPX1ZTQ19FWDoKICAgICAgICB7CiAgICAgICAgICAgIGludCBrZXljOwoKICAgICAgICAgICAgc3dpdGNoICh3Q29kZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FzZSBWS19TSElGVDogd0NvZGUgPSBWS19MU0hJRlQ7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBWS19DT05UUk9MOiB3Q29kZSA9IFZLX0xDT05UUk9MOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgVktfTUVOVTogd0NvZGUgPSBWS19MTUVOVTsgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIGxldCdzIGRvIHZrZXkgLT4ga2V5Y29kZSAtPiBzY2FuICovCiAgICAgICAgICAgIGZvciAoa2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspCiAgICAgICAgICAgICAgICBpZiAoKGtleWMydmtleVtrZXljXSAmIDB4RkYpID09IHdDb2RlKSBicmVhazsKCiAgICAgICAgICAgIGlmIChrZXljID4gbWF4X2tleWNvZGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRSQUNFKCJyZXR1cm5pbmcgbm8gc2Nhbi1jb2RlLlxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm5NVksgKGtleWMyc2NhbltrZXljXSAmIDB4RkYpOwogICAgICAgIH0KICAgICAgICBjYXNlIE1BUFZLX1ZTQ19UT19WSzogLyogc2Nhbi1jb2RlIHRvIHZrZXktY29kZSAqLwogICAgICAgIGNhc2UgTUFQVktfVlNDX1RPX1ZLX0VYOgogICAgICAgIHsKICAgICAgICAgICAgaW50IGtleWM7CiAgICAgICAgICAgIFVJTlQgdmtleSA9IDA7CgogICAgICAgICAgICAvKiBsZXQncyBkbyBzY2FuIC0+IGtleWNvZGUgLT4gdmtleSAqLwogICAgICAgICAgICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKQogICAgICAgICAgICAgICAgaWYgKChrZXljMnNjYW5ba2V5Y10gJiAweEZGKSA9PSAod0NvZGUgJiAweEZGKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2a2V5ID0ga2V5YzJ2a2V5W2tleWNdICYgMHhGRjsKICAgICAgICAgICAgICAgICAgICAvKiBPbmx5IHN0b3AgaWYgaXQncyBub3QgYSBudW1wYWQgdmtleTsgb3RoZXJ3aXNlIGtlZXAKICAgICAgICAgICAgICAgICAgICAgICBsb29raW5nIGZvciBhIHBvdGVudGlhbCBiZXR0ZXIgdmtleS4gKi8KICAgICAgICAgICAgICAgICAgICBpZiAodmtleSAmJiAodmtleSA8IFZLX05VTVBBRDAgfHwgVktfRElWSURFIDwgdmtleSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHZrZXkgPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVFJBQ0UoInJldHVybmluZyBubyB2a2V5LWNvZGUuXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAod01hcFR5cGUgPT0gTUFQVktfVlNDX1RPX1ZLKQogICAgICAgICAgICAgICAgc3dpdGNoICh2a2V5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhc2UgVktfTFNISUZUOgogICAgICAgICAgICAgICAgICAgIGNhc2UgVktfUlNISUZUOgogICAgICAgICAgICAgICAgICAgICAgICB2a2V5ID0gVktfU0hJRlQ7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgVktfTENPTlRST0w6CiAgICAgICAgICAgICAgICAgICAgY2FzZSBWS19SQ09OVFJPTDoKICAgICAgICAgICAgICAgICAgICAgICAgdmtleSA9IFZLX0NPTlRST0w7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgVktfTE1FTlU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSBWS19STUVOVToKICAgICAgICAgICAgICAgICAgICAgICAgdmtleSA9IFZLX01FTlU7IGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuTVZLICh2a2V5KTsKICAgICAgICB9CgkJY2FzZSBNQVBWS19WS19UT19DSEFSOiAvKiB2a2V5LWNvZGUgdG8gdW5zaGlmdGVkIEFOU0kgY29kZSAqLwoJCXsKICAgICAgICAgICAgICAgICAgICAgICAgLyogd2Ugc3RpbGwgZG9uJ3Qga25vdyB3aGF0ICJ1bnNoaWZ0ZWQiIG1lYW5zLiBpbiB3aW5kb3dzIFZLX1cgKDB4NTcpCiAgICAgICAgICAgICAgICAgICAgICAgICAqIHJldHVybnMgMHg1Nywgd2hpY2ggaXMgdXBwZXJjYXNlICdXJy4gU28gd2UgaGF2ZSB0byByZXR1cm4gdGhlIHVwcGVyY2FzZQogICAgICAgICAgICAgICAgICAgICAgICAgKiBrZXkuLiBMb29rcyBsaWtlIHNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIHRoZSBNUyBkb2NzPwogICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGlzIGlzIG9ubHkgdHJ1ZSBmb3IgbGV0dGVycywgZm9yIGV4YW1wbGUgVktfMCByZXR1cm5zICcwJyBub3QgJyknLgogICAgICAgICAgICAgICAgICAgICAgICAgKiAtIGhlbmNlIHdlIHVzZSB0aGUgbG9jayBtYXNrIHRvIGVuc3VyZSB0aGlzIGhhcHBlbnMuCiAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJCQkvKiBsZXQncyBkbyB2a2V5IC0+IGtleWNvZGUgLT4gKFhMb29rdXBTdHJpbmcpIGFuc2kgY2hhciAqLwoJCQlYS2V5RXZlbnQgZTsKCQkJS2V5U3ltIGtleXN5bTsKCQkJaW50IGtleWMsIGxlbjsKCQkJY2hhciBzWzEwXTsKCgkJCWUuZGlzcGxheSA9IGRpc3BsYXk7CgkJCWUuc3RhdGUgPSAwOwoJCQllLmtleWNvZGUgPSAwOwoJCQllLnR5cGUgPSBLZXlQcmVzczsKCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmVfdHN4MTFfbG9jaygpOwoKCQkJLyogV2UgZXhpdCBvbiB0aGUgZmlyc3Qga2V5Y29kZSBmb3VuZCwgdG8gc3BlZWQgdXAgdGhlIHRoaW5nLiAqLwoJCQlmb3IgKGtleWM9bWluX2tleWNvZGU7IChrZXljPD1tYXhfa2V5Y29kZSkgJiYgKCFlLmtleWNvZGUpIDsga2V5YysrKQoJCQl7IC8qIEZpbmQgYSBrZXljb2RlIHRoYXQgY291bGQgaGF2ZSBnZW5lcmF0ZWQgdGhpcyB2aXJ0dWFsIGtleSAqLwoJCQkgICAgaWYgICgoa2V5YzJ2a2V5W2tleWNdICYgMHhGRikgPT0gd0NvZGUpCgkJCSAgICB7IC8qIFdlIGZpbHRlciB0aGUgZXh0ZW5kZWQgYml0LCB3ZSBkb24ndCBrbm93IGl0ICovCgkJCSAgICAgICAgZS5rZXljb2RlID0ga2V5YzsgLyogU3RvcmUgaXQgdGVtcG9yYXJpbHkgKi8KCQkJCWlmICgoRVZFTlRfZXZlbnRfdG9fdmtleSgwLCZlKSAmIDB4RkYpICE9IHdDb2RlKSB7CgkJCQkgICAgZS5rZXljb2RlID0gMDsgLyogV3Jvbmcgb25lIChleDogYmVjYXVzZSBvZiB0aGUgTnVtTG9jawoJCQkJCSBzdGF0ZSksIHNvIHNldCBpdCB0byAwLCB3ZSdsbCBmaW5kIGFub3RoZXIgb25lICovCgkJCQl9CgkJCSAgICB9CgkJCX0KCgkJCWlmICgod0NvZGU+PVZLX05VTVBBRDApICYmICh3Q29kZTw9VktfTlVNUEFEOSkpCgkJCSAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIHdDb2RlLVZLX05VTVBBRDArWEtfS1BfMCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvKiBXaW5kb3dzIGFsd2F5cyBnZW5lcmF0ZXMgVktfREVDSU1BTCBmb3IgRGVsLy4gb24ga2V5cGFkIHdoaWxlIHNvbWUKICAgICAgICAgICAgICAgICAgICAgICAgICogWDExIGtleWJvYXJkIGxheW91dHMgZ2VuZXJhdGUgWEtfS1BfU2VwYXJhdG9yIGluc3RlYWQgb2YgWEtfS1BfRGVjaW1hbAogICAgICAgICAgICAgICAgICAgICAgICAgKiBpbiBvcmRlciB0byBwcm9kdWNlIGEgbG9jYWxlIGRlcGVuZGVudCBudW1lcmljIHNlcGFyYXRvci4KICAgICAgICAgICAgICAgICAgICAgICAgICovCgkJCWlmICh3Q29kZSA9PSBWS19ERUNJTUFMIHx8IHdDb2RlID09IFZLX1NFUEFSQVRPUikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIFhLX0tQX1NlcGFyYXRvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUua2V5Y29kZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgWEtfS1BfRGVjaW1hbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCgkJCWlmICghZS5rZXljb2RlKQoJCQl7CgkJCSAgV0FSTigiVW5rbm93biB2aXJ0dWFsIGtleSAlWCAhISFcbiIsIHdDb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwoJCQkgIHJldHVybiAwOyAvKiB3aGF0ZXZlciAqLwoJCQl9CgkJCVRSQUNFKCJGb3VuZCBrZXljb2RlICV1XG4iLGUua2V5Y29kZSk7CgogICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBYTG9va3VwU3RyaW5nKCZlLCBzLCBzaXplb2YocyksICZrZXlzeW0sIE5VTEwpOwogICAgICAgICAgICAgICAgICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0NIQVIgd2NoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVU5JWENQLCAwLCBzLCBsZW4sICZ3Y2gsIDEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybk1WSyh0b3VwcGVyVyh3Y2gpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoJCQlUUkFDRSgicmV0dXJuaW5nIG5vIEFOU0kuXG4iKTsKCQkJcmV0dXJuIDA7CgkJfQoJCWRlZmF1bHQ6IC8qIHJlc2VydmVkICovCgkJCUZJWE1FKCJVbmtub3duIHdNYXBUeXBlICVkICFcbiIsIHdNYXBUeXBlKTsKCQkJcmV0dXJuIDA7Cgl9CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRLZXlOYW1lVGV4dCAoWDExRFJWLkApCiAqLwpJTlQgQ0RFQ0wgWDExRFJWX0dldEtleU5hbWVUZXh0KExPTkcgbFBhcmFtLCBMUFdTVFIgbHBCdWZmZXIsIElOVCBuU2l6ZSkKewogIERpc3BsYXkgKmRpc3BsYXkgPSB0aHJlYWRfaW5pdF9kaXNwbGF5KCk7CiAgaW50IHZrZXksIGFuc2ksIHNjYW5Db2RlOwogIEtleUNvZGUga2V5YzsKICBpbnQga2V5aTsKICBLZXlTeW0ga2V5czsKICBjaGFyICpuYW1lOwoKICBzY2FuQ29kZSA9IGxQYXJhbSA+PiAxNjsKICBzY2FuQ29kZSAmPSAweDFmZjsgIC8qIGtlZXAgImV4dGVuZGVkLWtleSIgZmxhZyB3aXRoIGNvZGUgKi8KCiAgdmtleSA9IFgxMURSVl9NYXBWaXJ0dWFsS2V5RXgoc2NhbkNvZGUsIE1BUFZLX1ZTQ19UT19WS19FWCwgWDExRFJWX0dldEtleWJvYXJkTGF5b3V0KDApKTsKCiAgLyogIGhhbmRsZSAiZG9uJ3QgY2FyZSIgYml0ICgweDAyMDAwMDAwKSAqLwogIGlmICghKGxQYXJhbSAmIDB4MDIwMDAwMDApKSB7CiAgICBzd2l0Y2ggKHZrZXkpIHsKICAgICAgICAgY2FzZSBWS19SU0hJRlQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUi1TaGlmdCBpcyAic3BlY2lhbCIgLSBpdCBpcyBhbiBleHRlbmRlZCBrZXkgd2l0aCBzZXBhcmF0ZSBzY2FuIGNvZGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuQ29kZSB8PSAweDEwMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KICAgICAgICAgY2FzZSBWS19MU0hJRlQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmtleSA9IFZLX1NISUZUOwogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBWS19MQ09OVFJPTDoKICAgICAgIGNhc2UgVktfUkNPTlRST0w6CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmtleSA9IFZLX0NPTlRST0w7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIFZLX0xNRU5VOgogICAgICAgICAgY2FzZSBWS19STUVOVToKICAgICAgICAgICAgICAgICAgICAgICAgICB2a2V5ID0gVktfTUVOVTsKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgIH0KICB9CgogIGFuc2kgPSBYMTFEUlZfTWFwVmlydHVhbEtleUV4KHZrZXksIE1BUFZLX1ZLX1RPX0NIQVIsIFgxMURSVl9HZXRLZXlib2FyZExheW91dCgwKSk7CiAgVFJBQ0UoInNjYW4gMHglMDR4LCB2a2V5IDB4JTA0WCwgQU5TSSAweCUwNHhcbiIsIHNjYW5Db2RlLCB2a2V5LCBhbnNpKTsKCiAgLyogZmlyc3QgZ2V0IHRoZSBuYW1lIG9mIHRoZSAicmVndWxhciIga2V5cyB3aGljaCBpcyB0aGUgVXBwZXIgY2FzZQogICAgIHZhbHVlIG9mIHRoZSBrZXljYXAgaW1wcmludC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBpZiAoICgoYW5zaSA+PSAweDIxKSAmJiAoYW5zaSA8PSAweDdlKSkgJiYKICAgICAgIChzY2FuQ29kZSAhPSAweDEzNykgJiYgICAvKiBQcnRTY24gICAqLwogICAgICAgKHNjYW5Db2RlICE9IDB4MTM1KSAmJiAgIC8qIG51bXBhZCAvICovCiAgICAgICAoc2NhbkNvZGUgIT0gMHgzNyApICYmICAgLyogbnVtcGFkICogKi8KICAgICAgIChzY2FuQ29kZSAhPSAweDRhICkgJiYgICAvKiBudW1wYWQgLSAqLwogICAgICAgKHNjYW5Db2RlICE9IDB4NGUgKSApICAgIC8qIG51bXBhZCArICovCiAgICAgIHsKICAgICAgICBpZiAoblNpemUgPj0gMikKCXsKICAgICAgICAgICpscEJ1ZmZlciA9IHRvdXBwZXJXKChXQ0hBUilhbnNpKTsKICAgICAgICAgICoobHBCdWZmZXIrMSkgPSAwOwogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgIGVsc2UKICAgICAgICByZXR1cm4gMDsKICB9CgogIC8qIEZJWE1FOiBob3JyaWJsZSBoYWNrIHRvIGZpeCBmdW5jdGlvbiBrZXlzLiBXaW5kb3dzIHJlcG9ydHMgc2NhbmNvZGUKICAgICAgICAgICAgd2l0aG91dCAiZXh0ZW5kZWQta2V5IiBmbGFnLiBIb3dldmVyIFdpbmUgZ2VuZXJhdGVzIHNjYW5jb2RlCiAgICAgICAgICAgICp3aXRoKiAiZXh0ZW5kZWQta2V5IiBmbGFnLiBTZWVtcyB0byBvY2N1ciAqb25seSogZm9yIHRoZQogICAgICAgICAgICBmdW5jdGlvbiBrZXlzLiBTb29vby4uIFdlIHdpbGwgbGVhdmUgdGhlIHRhYmxlIGFsb25lIGFuZAogICAgICAgICAgICBmdWRnZSB0aGUgbG9va3VwIGhlcmUgdGlsbCB0aGUgb3RoZXIgcGFydCBpcyBmb3VuZCBhbmQgZml4ZWQhISEgKi8KCiAgaWYgKCAoKHNjYW5Db2RlID49IDB4MTNiKSAmJiAoc2NhbkNvZGUgPD0gMHgxNDQpKSB8fAogICAgICAgKHNjYW5Db2RlID09IDB4MTU3KSB8fCAoc2NhbkNvZGUgPT0gMHgxNTgpKQogICAgc2NhbkNvZGUgJj0gMHhmZjsgICAvKiByZW1vdmUgImV4dGVuZGVkLWtleSIgZmxhZyBmb3IgRngga2V5cyAqLwoKICAvKiBsZXQncyBkbyBzY2FuY29kZSAtPiBrZXljb2RlIC0+IGtleXN5bSAtPiBTdHJpbmcgKi8KCiAgZm9yIChrZXlpPW1pbl9rZXljb2RlOyBrZXlpPD1tYXhfa2V5Y29kZTsga2V5aSsrKQogICAgICBpZiAoKGtleWMyc2NhbltrZXlpXSkgPT0gc2NhbkNvZGUpCiAgICAgICAgIGJyZWFrOwogIGlmIChrZXlpIDw9IG1heF9rZXljb2RlKQogIHsKICAgICAgSU5UIHJjOwoKICAgICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICAgIGtleWMgPSAoS2V5Q29kZSkga2V5aTsKICAgICAga2V5cyA9IGtleWNvZGVfdG9fa2V5c3ltKGRpc3BsYXksIGtleWMsIDApOwogICAgICBuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXMpOwogICAgICB3aW5lX3RzeDExX3VubG9jaygpOwoKICAgICAgaWYgKG5hbWUgJiYgKHZrZXkgPT0gVktfU0hJRlQgfHwgdmtleSA9PSBWS19DT05UUk9MIHx8IHZrZXkgPT0gVktfTUVOVSkpCiAgICAgIHsKICAgICAgICAgIGNoYXIqIGlkeCA9IHN0cnJjaHIobmFtZSwgJ18nKTsKICAgICAgICAgIGlmIChpZHggJiYgKHN0cmNhc2VjbXAoaWR4LCAiX3IiKSA9PSAwIHx8IHN0cmNhc2VjbXAoaWR4LCAiX2wiKSA9PSAwKSkKICAgICAgICAgIHsKICAgICAgICAgICAgICBUUkFDRSgiZm91bmQgc2Nhbj0lMDR4IGtleWM9JXUga2V5c3ltPSVseCBtb2RpZmllZF9zdHJpbmc9JXNcbiIsCiAgICAgICAgICAgICAgICAgICAgc2NhbkNvZGUsIGtleWMsIGtleXMsIGRlYnVnc3RyX2FuKG5hbWUsaWR4LW5hbWUpKTsKICAgICAgICAgICAgICByYyA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVU5JWENQLCAwLCBuYW1lLCBpZHgtbmFtZSsxLCBscEJ1ZmZlciwgblNpemUpOwogICAgICAgICAgICAgIGlmICghcmMpIHJjID0gblNpemU7CiAgICAgICAgICAgICAgbHBCdWZmZXJbLS1yY10gPSAwOwogICAgICAgICAgICAgIHJldHVybiByYzsKICAgICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKG5hbWUpCiAgICAgIHsKICAgICAgICAgIFRSQUNFKCJmb3VuZCBzY2FuPSUwNHgga2V5Yz0ldSBrZXlzeW09JTA0eCB2a2V5PSUwNHggc3RyaW5nPSVzXG4iLAogICAgICAgICAgICAgICAgc2NhbkNvZGUsIGtleWMsIChpbnQpa2V5cywgdmtleSwgZGVidWdzdHJfYShuYW1lKSk7CiAgICAgICAgICByYyA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVU5JWENQLCAwLCBuYW1lLCAtMSwgbHBCdWZmZXIsIG5TaXplKTsKICAgICAgICAgIGlmICghcmMpIHJjID0gblNpemU7CiAgICAgICAgICBscEJ1ZmZlclstLXJjXSA9IDA7CiAgICAgICAgICByZXR1cm4gcmM7CiAgICAgIH0KICB9CgogIC8qIEZpbmFsbHkgaXNzdWUgV0FSTiBmb3IgdW5rbm93biBrZXlzICAgKi8KCiAgV0FSTigiKCUwOHgsJXAsJWQpOiB1bnN1cHBvcnRlZCBrZXksIHZrZXk9JTA0WCwgYW5zaT0lMDR4XG4iLGxQYXJhbSxscEJ1ZmZlcixuU2l6ZSx2a2V5LGFuc2kpOwogICpscEJ1ZmZlciA9IDA7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0tFWUJPQVJEX01hcERlYWRLZXlzeW0KICovCnN0YXRpYyBjaGFyIEtFWUJPQVJEX01hcERlYWRLZXlzeW0oS2V5U3ltIGtleXN5bSkKewoJc3dpdGNoIChrZXlzeW0pCgkgICAgewoJLyogc3ltYm9saWMgQVNDSUkgaXMgdGhlIHNhbWUgYXMgZGVmaW5lZCBpbiByZmMxMzQ1ICovCiNpZmRlZiBYS19kZWFkX3RpbGRlCgkgICAgY2FzZSBYS19kZWFkX3RpbGRlIDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTdFIDogLyogWGZyZWUncyBYS19EdGlsZGUgKi8KCQlyZXR1cm4gJ34nOwkvKiAnPyAqLwojaWZkZWYgWEtfZGVhZF9hY3V0ZQoJICAgIGNhc2UgWEtfZGVhZF9hY3V0ZSA6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkUyNyA6IC8qIFhmcmVlJ3MgWEtfRGFjdXRlX2FjY2VudCAqLwoJCXJldHVybiAweGI0OwkvKiAnJyAqLwojaWZkZWYgWEtfZGVhZF9jaXJjdW1mbGV4CgkgICAgY2FzZSBYS19kZWFkX2NpcmN1bWZsZXg6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkU1RSA6IC8qIFhmcmVlJ3MgWEtfRGNpcmN1bWZsZXhfYWNjZW50ICovCgkJcmV0dXJuICdeJzsJLyogJz4gKi8KI2lmZGVmIFhLX2RlYWRfZ3JhdmUKCSAgICBjYXNlIFhLX2RlYWRfZ3JhdmUgOgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFNjAgOiAvKiBYZnJlZSdzIFhLX0RncmF2ZV9hY2NlbnQgKi8KCQlyZXR1cm4gJ2AnOwkvKiAnISAqLwojaWZkZWYgWEtfZGVhZF9kaWFlcmVzaXMKCSAgICBjYXNlIFhLX2RlYWRfZGlhZXJlc2lzIDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTIyIDogLyogWGZyZWUncyBYS19EZGlhZXJlc2lzICovCgkJcmV0dXJuIDB4YTg7CS8qICc6ICovCiNpZmRlZiBYS19kZWFkX2NlZGlsbGEKCSAgICBjYXNlIFhLX2RlYWRfY2VkaWxsYSA6CgkgICAgICAgIHJldHVybiAweGI4OwkvKiAnLCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfbWFjcm9uCgkgICAgY2FzZSBYS19kZWFkX21hY3JvbiA6CgkgICAgICAgIHJldHVybiAnLSc7CS8qICdtIGlzbid0IGRlZmluZWQgb24gaXNvLTg4NTkteCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfYnJldmUKCSAgICBjYXNlIFhLX2RlYWRfYnJldmUgOgoJICAgICAgICByZXR1cm4gMHhhMjsJLyogJyggKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2Fib3ZlZG90CgkgICAgY2FzZSBYS19kZWFkX2Fib3ZlZG90IDoKCSAgICAgICAgcmV0dXJuIDB4ZmY7CS8qICcuICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9hYm92ZXJpbmcKCSAgICBjYXNlIFhLX2RlYWRfYWJvdmVyaW5nIDoKCSAgICAgICAgcmV0dXJuICcwJzsJLyogJzAgaXNuJ3QgZGVmaW5lZCBvbiBpc28tODg1OS14ICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9kb3VibGVhY3V0ZQoJICAgIGNhc2UgWEtfZGVhZF9kb3VibGVhY3V0ZSA6CgkgICAgICAgIHJldHVybiAweGJkOwkvKiAnIiAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfY2Fyb24KCSAgICBjYXNlIFhLX2RlYWRfY2Fyb24gOgoJICAgICAgICByZXR1cm4gMHhiNzsJLyogJzwgKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX29nb25lawoJICAgIGNhc2UgWEtfZGVhZF9vZ29uZWsgOgoJICAgICAgICByZXR1cm4gMHhiMjsJLyogJzsgKi8KI2VuZGlmCi8qIEZJWE1FOiBJIGRvbid0IGtub3cgdGhpcyB0aHJlZS4KCSAgICBjYXNlIFhLX2RlYWRfaW90YSA6CgkgICAgICAgIHJldHVybiAnaSc7CgkgICAgY2FzZSBYS19kZWFkX3ZvaWNlZF9zb3VuZCA6CgkgICAgICAgIHJldHVybiAndic7CgkgICAgY2FzZSBYS19kZWFkX3NlbWl2b2ljZWRfc291bmQgOgoJICAgICAgICByZXR1cm4gJ3MnOwoqLwoJICAgIH0KCVRSQUNFKCJubyBjaGFyYWN0ZXIgZm9yIGRlYWQga2V5c3ltIDB4JTA4bHhcbiIsa2V5c3ltKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVRvVW5pY29kZUV4IChYMTFEUlYuQCkKICoKICogVGhlIFRvVW5pY29kZSBmdW5jdGlvbiB0cmFuc2xhdGVzIHRoZSBzcGVjaWZpZWQgdmlydHVhbC1rZXkgY29kZSBhbmQga2V5Ym9hcmQKICogc3RhdGUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgV2luZG93cyBjaGFyYWN0ZXIgb3IgY2hhcmFjdGVycy4KICoKICogSWYgdGhlIHNwZWNpZmllZCBrZXkgaXMgYSBkZWFkIGtleSwgdGhlIHJldHVybiB2YWx1ZSBpcyBuZWdhdGl2ZS4gT3RoZXJ3aXNlLAogKiBpdCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAqIFZhbHVlCU1lYW5pbmcKICogMAlUaGUgc3BlY2lmaWVkIHZpcnR1YWwga2V5IGhhcyBubyB0cmFuc2xhdGlvbiBmb3IgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGtleWJvYXJkLgogKiAxCU9uZSBXaW5kb3dzIGNoYXJhY3RlciB3YXMgY29waWVkIHRvIHRoZSBidWZmZXIuCiAqIDIJVHdvIGNoYXJhY3RlcnMgd2VyZSBjb3BpZWQgdG8gdGhlIGJ1ZmZlci4gVGhpcyB1c3VhbGx5IGhhcHBlbnMgd2hlbiBhCiAqICAgICAgZGVhZC1rZXkgY2hhcmFjdGVyIChhY2NlbnQgb3IgZGlhY3JpdGljKSBzdG9yZWQgaW4gdGhlIGtleWJvYXJkIGxheW91dCBjYW5ub3QKICogICAgICBiZSBjb21wb3NlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBrZXkgdG8gZm9ybSBhIHNpbmdsZSBjaGFyYWN0ZXIuCiAqCiAqIEZJWE1FIDogc2hvdWxkIGRvIHRoZSBhYm92ZSAocmV0dXJuIDIgZm9yIG5vbiBtYXRjaGluZyBkZWFkY2hhcitjaGFyIGNvbWJpbmF0aW9ucykKICoKICovCklOVCBDREVDTCBYMTFEUlZfVG9Vbmljb2RlRXgoVUlOVCB2aXJ0S2V5LCBVSU5UIHNjYW5Db2RlLCBjb25zdCBCWVRFICpscEtleVN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQV1NUUiBidWZXLCBpbnQgYnVmV19zaXplLCBVSU5UIGZsYWdzLCBIS0wgaGtsKQp7CiAgICBEaXNwbGF5ICpkaXNwbGF5ID0gdGhyZWFkX2luaXRfZGlzcGxheSgpOwogICAgWEtleUV2ZW50IGU7CiAgICBLZXlTeW0ga2V5c3ltID0gMDsKICAgIElOVCByZXQ7CiAgICBpbnQga2V5YzsKICAgIGNoYXIgYnVmWzEwXTsKICAgIGNoYXIgKmxwQ2hhciA9IGJ1ZjsKICAgIEhXTkQgZm9jdXM7CiAgICBYSUMgeGljOwogICAgU3RhdHVzIHN0YXR1cyA9IDA7CgogICAgaWYgKHNjYW5Db2RlICYgMHg4MDAwKQogICAgewogICAgICAgIFRSQUNFXyhrZXkpKCJLZXkgVVAsIGRvaW5nIG5vdGhpbmdcbiIgKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAoIW1hdGNoX3gxMV9rZXlib2FyZF9sYXlvdXQoaGtsKSkKICAgICAgICBGSVhNRV8oa2V5KSgia2V5Ym9hcmQgbGF5b3V0ICVwIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGhrbCk7CgogICAgaWYgKChscEtleVN0YXRlW1ZLX01FTlVdICYgMHg4MCkgJiYgKGxwS2V5U3RhdGVbVktfQ09OVFJPTF0gJiAweDgwKSkKICAgIHsKICAgICAgICBUUkFDRV8oa2V5KSgiQ3RybCtBbHQrW2tleV0gd29uJ3QgZ2VuZXJhdGUgYSBjaGFyYWN0ZXJcbiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGUuZGlzcGxheSA9IGRpc3BsYXk7CiAgICBlLmtleWNvZGUgPSAwOwogICAgZS5zdGF0ZSA9IDA7CiAgICBlLnR5cGUgPSBLZXlQcmVzczsKCiAgICBmb2N1cyA9IHgxMWRydl90aHJlYWRfZGF0YSgpLT5sYXN0X3hpY19od25kOwogICAgaWYgKCFmb2N1cykKICAgIHsKICAgICAgICBmb2N1cyA9IEdldEZvY3VzKCk7CiAgICAgICAgaWYgKGZvY3VzKSBmb2N1cyA9IEdldEFuY2VzdG9yKCBmb2N1cywgR0FfUk9PVCApOwogICAgICAgIGlmICghZm9jdXMpIGZvY3VzID0gR2V0QWN0aXZlV2luZG93KCk7CiAgICB9CiAgICBlLndpbmRvdyA9IFgxMURSVl9nZXRfd2hvbGVfd2luZG93KCBmb2N1cyApOwogICAgeGljID0gWDExRFJWX2dldF9pYyggZm9jdXMgKTsKCiAgICBpZiAobHBLZXlTdGF0ZVtWS19TSElGVF0gJiAweDgwKQogICAgewoJVFJBQ0VfKGtleSkoIlNoaWZ0TWFzayA9ICUwNHhcbiIsIFNoaWZ0TWFzayk7CgllLnN0YXRlIHw9IFNoaWZ0TWFzazsKICAgIH0KICAgIGlmIChscEtleVN0YXRlW1ZLX0NBUElUQUxdICYgMHgwMSkKICAgIHsKCVRSQUNFXyhrZXkpKCJMb2NrTWFzayA9ICUwNHhcbiIsIExvY2tNYXNrKTsKCWUuc3RhdGUgfD0gTG9ja01hc2s7CiAgICB9CiAgICBpZiAobHBLZXlTdGF0ZVtWS19DT05UUk9MXSAmIDB4ODApCiAgICB7CglUUkFDRV8oa2V5KSgiQ29udHJvbE1hc2sgPSAlMDR4XG4iLCBDb250cm9sTWFzayk7CgllLnN0YXRlIHw9IENvbnRyb2xNYXNrOwogICAgfQogICAgaWYgKGxwS2V5U3RhdGVbVktfTlVNTE9DS10gJiAweDAxKQogICAgewoJVFJBQ0VfKGtleSkoIk51bUxvY2tNYXNrID0gJTA0eFxuIiwgTnVtTG9ja01hc2spOwoJZS5zdGF0ZSB8PSBOdW1Mb2NrTWFzazsKICAgIH0KCiAgICAvKiBSZXN0b3JlIHNhdmVkIEFsdEdyIHN0YXRlICovCiAgICBUUkFDRV8oa2V5KSgiQWx0R3JNYXNrID0gJTA0eFxuIiwgQWx0R3JNYXNrKTsKICAgIGUuc3RhdGUgfD0gQWx0R3JNYXNrOwoKICAgIFRSQUNFXyhrZXkpKCIoJTA0WCwgJTA0WCkgOiBmYWtlZCBzdGF0ZSA9IDB4JTA0eFxuIiwKCQl2aXJ0S2V5LCBzY2FuQ29kZSwgZS5zdGF0ZSk7CiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIC8qIFdlIGV4aXQgb24gdGhlIGZpcnN0IGtleWNvZGUgZm91bmQsIHRvIHNwZWVkIHVwIHRoZSB0aGluZy4gKi8KICAgIGZvciAoa2V5Yz1taW5fa2V5Y29kZTsgKGtleWM8PW1heF9rZXljb2RlKSAmJiAoIWUua2V5Y29kZSkgOyBrZXljKyspCiAgICAgIHsgLyogRmluZCBhIGtleWNvZGUgdGhhdCBjb3VsZCBoYXZlIGdlbmVyYXRlZCB0aGlzIHZpcnR1YWwga2V5ICovCiAgICAgICAgICBpZiAgKChrZXljMnZrZXlba2V5Y10gJiAweEZGKSA9PSB2aXJ0S2V5KQogICAgICAgICAgeyAvKiBXZSBmaWx0ZXIgdGhlIGV4dGVuZGVkIGJpdCwgd2UgZG9uJ3Qga25vdyBpdCAqLwogICAgICAgICAgICAgIGUua2V5Y29kZSA9IGtleWM7IC8qIFN0b3JlIGl0IHRlbXBvcmFyaWx5ICovCiAgICAgICAgICAgICAgaWYgKChFVkVOVF9ldmVudF90b192a2V5KHhpYywmZSkgJiAweEZGKSAhPSB2aXJ0S2V5KSB7CiAgICAgICAgICAgICAgICAgIGUua2V5Y29kZSA9IDA7IC8qIFdyb25nIG9uZSAoZXg6IGJlY2F1c2Ugb2YgdGhlIE51bUxvY2sKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKSwgc28gc2V0IGl0IHRvIDAsIHdlJ2xsIGZpbmQgYW5vdGhlciBvbmUgKi8KICAgICAgICAgICAgICB9CgkgIH0KICAgICAgfQoKICAgIGlmICh2aXJ0S2V5ID49IFZLX0xFRlQgJiYgdmlydEtleSA8PSBWS19ET1dOKQogICAgICAgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCB2aXJ0S2V5IC0gVktfTEVGVCArIFhLX0xlZnQpOwoKICAgIGlmICgodmlydEtleT49VktfTlVNUEFEMCkgJiYgKHZpcnRLZXk8PVZLX05VTVBBRDkpKQogICAgICAgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCB2aXJ0S2V5LVZLX05VTVBBRDArWEtfS1BfMCk7CgogICAgLyogV2luZG93cyBhbHdheXMgZ2VuZXJhdGVzIFZLX0RFQ0lNQUwgZm9yIERlbC8uIG9uIGtleXBhZCB3aGlsZSBzb21lCiAgICAgKiBYMTEga2V5Ym9hcmQgbGF5b3V0cyBnZW5lcmF0ZSBYS19LUF9TZXBhcmF0b3IgaW5zdGVhZCBvZiBYS19LUF9EZWNpbWFsCiAgICAgKiBpbiBvcmRlciB0byBwcm9kdWNlIGEgbG9jYWxlIGRlcGVuZGVudCBudW1lcmljIHNlcGFyYXRvci4KICAgICAqLwogICAgaWYgKHZpcnRLZXkgPT0gVktfREVDSU1BTCB8fCB2aXJ0S2V5ID09IFZLX1NFUEFSQVRPUikKICAgIHsKICAgICAgICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgWEtfS1BfU2VwYXJhdG9yKTsKICAgICAgICBpZiAoIWUua2V5Y29kZSkKICAgICAgICAgICAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIFhLX0tQX0RlY2ltYWwpOwogICAgfQoKICAgIGlmICghZS5rZXljb2RlICYmIHZpcnRLZXkgIT0gVktfTk9OQU1FKQogICAgICB7CglXQVJOXyhrZXkpKCJVbmtub3duIHZpcnR1YWwga2V5ICVYICEhIVxuIiwgdmlydEtleSk7CiAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKCXJldHVybiAwOwogICAgICB9CiAgICBlbHNlIFRSQUNFXyhrZXkpKCJGb3VuZCBrZXljb2RlICV1XG4iLGUua2V5Y29kZSk7CgogICAgVFJBQ0VfKGtleSkoInR5cGUgJWQsIHdpbmRvdyAlbHgsIHN0YXRlIDB4JTA0eCwga2V5Y29kZSAldVxuIiwKCQllLnR5cGUsIGUud2luZG93LCBlLnN0YXRlLCBlLmtleWNvZGUpOwoKICAgIC8qIENsaWVudHMgc2hvdWxkIHBhc3Mgb25seSBLZXlQcmVzcyBldmVudHMgdG8gWG1iTG9va3VwU3RyaW5nLAogICAgICogZS50eXBlIHdhcyBzZXQgdG8gS2V5UHJlc3MgYWJvdmUuCiAgICAgKi8KICAgIGlmICh4aWMpCiAgICB7CiAgICAgICAgcmV0ID0gWG1iTG9va3VwU3RyaW5nKHhpYywgJmUsIGJ1Ziwgc2l6ZW9mKGJ1ZiksICZrZXlzeW0sICZzdGF0dXMpOwogICAgICAgIFRSQUNFXyhrZXkpKCJYbWJMb29rdXBTdHJpbmcgbmVlZHMgJWQgYnl0ZShzKVxuIiwgcmV0KTsKICAgICAgICBpZiAoc3RhdHVzID09IFhCdWZmZXJPdmVyZmxvdykKICAgICAgICB7CiAgICAgICAgICAgIGxwQ2hhciA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCByZXQpOwogICAgICAgICAgICBpZiAobHBDaGFyID09IE5VTEwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEVSUl8oa2V5KSgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSFcbiIpOwogICAgICAgICAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldCA9IFhtYkxvb2t1cFN0cmluZyh4aWMsICZlLCBscENoYXIsIHJldCwgJmtleXN5bSwgJnN0YXR1cyk7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgICAgIHJldCA9IFhMb29rdXBTdHJpbmcoJmUsIGJ1Ziwgc2l6ZW9mKGJ1ZiksICZrZXlzeW0sIE5VTEwpOwogICAgd2luZV90c3gxMV91bmxvY2soKTsKCiAgICBUUkFDRV8oa2V5KSgibmJ5dGUgPSAlZCwgc3RhdHVzIDB4JXhcbiIsIHJldCwgc3RhdHVzKTsKCiAgICBpZiAoVFJBQ0VfT04oa2V5KSkKICAgIHsKICAgICAgICBjb25zdCBjaGFyICprc25hbWU7CgogICAgICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgICAgIGtzbmFtZSA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwogICAgICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CiAgICAgICAgaWYgKCFrc25hbWUpIGtzbmFtZSA9ICJObyBOYW1lIjsKICAgICAgICBUUkFDRV8oa2V5KSgiJXMgOiBrZXlzeW09JWx4ICglcyksICMgb2YgY2hhcnM9JWQgLyAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAoZS50eXBlID09IEtleVByZXNzKSA/ICJLZXlQcmVzcyIgOiAiS2V5UmVsZWFzZSIsCiAgICAgICAgICAgICAgICAgICAga2V5c3ltLCBrc25hbWUsIHJldCwgZGVidWdzdHJfYW4obHBDaGFyLCByZXQpKTsKICAgIH0KCiAgICBpZiAocmV0ID09IDApCiAgICB7CgljaGFyIGRlYWRfY2hhcjsKCiNpZmRlZiBYS19FdXJvU2lnbgogICAgICAgIC8qIEFuIHVnbHkgaGFjayBmb3IgRXVyb1NpZ246IFggY2FuJ3QgdHJhbnNsYXRlIGl0IHRvIGEgY2hhcmFjdGVyCiAgICAgICAgICAgZm9yIHNvbWUgbG9jYWxlcy4gKi8KICAgICAgICBpZiAoa2V5c3ltID09IFhLX0V1cm9TaWduKQogICAgICAgIHsKICAgICAgICAgICAgYnVmV1swXSA9IDB4MjBBQzsKICAgICAgICAgICAgcmV0ID0gMTsKICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICB9CiNlbmRpZgogICAgICAgIC8qIFNwZWNpYWwgY2FzZTogWCB0dXJucyBzaGlmdC10YWIgaW50byBJU09fTGVmdF9UYWIuICovCiAgICAgICAgLyogSGVyZSB3ZSBjaGFuZ2UgaXQgYmFjay4gKi8KICAgICAgICBpZiAoa2V5c3ltID09IFhLX0lTT19MZWZ0X1RhYiAmJiAhKGUuc3RhdGUgJiBDb250cm9sTWFzaykpCiAgICAgICAgewogICAgICAgICAgICBidWZXWzBdID0gMHgwOTsKICAgICAgICAgICAgcmV0ID0gMTsKICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICB9CgoJZGVhZF9jaGFyID0gS0VZQk9BUkRfTWFwRGVhZEtleXN5bShrZXlzeW0pOwoJaWYgKGRlYWRfY2hhcikKICAgICAgICB7CgkgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VTklYQ1AsIDAsICZkZWFkX2NoYXIsIDEsIGJ1ZlcsIGJ1Zldfc2l6ZSk7CgkgICAgcmV0ID0gLTE7CiAgICAgICAgICAgIGdvdG8gZm91bmQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoa2V5c3ltID49IDB4MDEwMDAxMDAgJiYga2V5c3ltIDw9IDB4MDEwMGZmZmYpCiAgICAgICAgewogICAgICAgICAgICAvKiBVbmljb2RlIGRpcmVjdCBtYXBwaW5nICovCiAgICAgICAgICAgIGJ1ZldbMF0gPSBrZXlzeW0gJiAweGZmZmY7CiAgICAgICAgICAgIHJldCA9IDE7CiAgICAgICAgICAgIGdvdG8gZm91bmQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKChrZXlzeW0gPj4gOCkgPT0gMHgxMDA4RkYpIHsKICAgICAgICAgICAgYnVmV1swXSA9IDA7CiAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgICAgIGdvdG8gZm91bmQ7CiAgICAgICAgfQoJZWxzZQoJICAgIHsKCSAgICBjb25zdCBjaGFyICprc25hbWU7CgogICAgICAgICAgICB3aW5lX3RzeDExX2xvY2soKTsKCSAgICBrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKICAgICAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKCSAgICBpZiAoIWtzbmFtZSkKCQlrc25hbWUgPSAiTm8gTmFtZSI7CgkgICAgaWYgKChrZXlzeW0gPj4gOCkgIT0gMHhmZikKCQl7CgkJV0FSTl8oa2V5KSgibm8gY2hhciBmb3Iga2V5c3ltICUwNGx4ICglcykgOlxuIiwKICAgICAgICAgICAgICAgICAgICBrZXlzeW0sIGtzbmFtZSk7CgkJV0FSTl8oa2V5KSgidmlydEtleT0lWCwgc2NhbkNvZGU9JVgsIGtleWNvZGU9JXUsIHN0YXRlPSVYXG4iLAogICAgICAgICAgICAgICAgICAgIHZpcnRLZXksIHNjYW5Db2RlLCBlLmtleWNvZGUsIGUuc3RhdGUpOwoJCX0KCSAgICB9Cgl9CiAgICBlbHNlIHsgIC8qIHJldCAhPSAwICovCiAgICAgICAgLyogV2UgaGF2ZSBhIHNwZWNpYWwgY2FzZSB0byBoYW5kbGUgOiBTaGlmdCArIGFycm93LCBzaGlmdCArIGhvbWUsIC4uLgogICAgICAgICAgIFggcmV0dXJucyBhIGNoYXIgZm9yIGl0LCBidXQgV2luZG93cyBkb2Vzbid0LiBMZXQncyBlYXQgaXQuICovCiAgICAgICAgaWYgKCEoZS5zdGF0ZSAmIE51bUxvY2tNYXNrKSAgLyogTnVtTG9jayBpcyBvZmYgKi8KICAgICAgICAgICAgJiYgKGUuc3RhdGUgJiBTaGlmdE1hc2spIC8qIFNoaWZ0IGlzIHByZXNzZWQgKi8KICAgICAgICAgICAgJiYgKGtleXN5bT49WEtfS1BfMCkgJiYgKGtleXN5bTw9WEtfS1BfOSkpCiAgICAgICAgewogICAgICAgICAgICBscENoYXJbMF0gPSAwOwogICAgICAgICAgICByZXQgPSAwOwogICAgICAgIH0KCiAgICAgICAgLyogbW9yZSBhcmVhcyB3aGVyZSBYIHJldHVybnMgY2hhcmFjdGVycyBidXQgV2luZG93cyBkb2VzIG5vdAogICAgICAgICAgIENUUkwgKyBudW1iZXIgb3IgQ1RSTCArIHN5bWJvbCAqLwogICAgICAgIGlmIChlLnN0YXRlICYgQ29udHJvbE1hc2spCiAgICAgICAgewogICAgICAgICAgICBpZiAoKChrZXlzeW0+PTMzKSAmJiAoa2V5c3ltIDwgJ0EnKSkgfHwKICAgICAgICAgICAgICAgICgoa2V5c3ltID4gJ1onKSAmJiAoa2V5c3ltIDwgJ2EnKSkgfHwKICAgICAgICAgICAgICAgIChrZXlzeW0gPT0gWEtfVGFiKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbHBDaGFyWzBdID0gMDsKICAgICAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIFdlIGhhdmUgYW5vdGhlciBzcGVjaWFsIGNhc2UgZm9yIGRlbGV0ZSBrZXkgKFhLX0RlbGV0ZSkgb24gYW4KICAgICAgICAgZXh0ZW5kZWQga2V5Ym9hcmQuIFggcmV0dXJucyBhIGNoYXIgZm9yIGl0LCBidXQgV2luZG93cyBkb2Vzbid0ICovCiAgICAgICAgaWYgKGtleXN5bSA9PSBYS19EZWxldGUpCiAgICAgICAgewogICAgICAgICAgICBscENoYXJbMF0gPSAwOwogICAgICAgICAgICByZXQgPSAwOwogICAgICAgIH0KCWVsc2UgaWYoKGxwS2V5U3RhdGVbVktfU0hJRlRdICYgMHg4MCkgLyogU2hpZnQgaXMgcHJlc3NlZCAqLwoJCSYmIChrZXlzeW0gPT0gWEtfS1BfRGVjaW1hbCkpCiAgICAgICAgewogICAgICAgICAgICBscENoYXJbMF0gPSAwOwogICAgICAgICAgICByZXQgPSAwOwogICAgICAgIH0KCWVsc2UgaWYoKGxwS2V5U3RhdGVbVktfQ09OVFJPTF0gJiAweDgwKSAvKiBDb250cm9sIGlzIHByZXNzZWQgKi8KCQkmJiAoa2V5c3ltID09IFhLX1JldHVybiB8fCBrZXlzeW0gPT0gWEtfS1BfRW50ZXIpKQogICAgICAgIHsKICAgICAgICAgICAgbHBDaGFyWzBdID0gJ1xuJzsKICAgICAgICAgICAgcmV0ID0gMTsKICAgICAgICB9CgogICAgICAgIC8qIEhhY2sgdG8gZGV0ZWN0IGFuIFhMb29rdXBTdHJpbmcgaGFyZC1jb2RlZCB0byBMYXRpbjEgKi8KICAgICAgICBpZiAocmV0ID09IDEgJiYga2V5c3ltID49IDB4MDBhMCAmJiBrZXlzeW0gPD0gMHgwMGZmICYmIChCWVRFKWxwQ2hhclswXSA9PSBrZXlzeW0pCiAgICAgICAgewogICAgICAgICAgICBidWZXWzBdID0gKEJZVEUpbHBDaGFyWzBdOwogICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgICAgIH0KCgkvKiBwZXJmb3JtIHRyYW5zbGF0aW9uIHRvIHVuaWNvZGUgKi8KCWlmKHJldCkKCXsKCSAgICBUUkFDRV8oa2V5KSgiVHJhbnNsYXRpbmcgY2hhciAweCUwMnggdG8gdW5pY29kZVxuIiwgKihCWVRFICopbHBDaGFyKTsKCSAgICByZXQgPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX1VOSVhDUCwgMCwgbHBDaGFyLCByZXQsIGJ1ZlcsIGJ1Zldfc2l6ZSk7Cgl9CiAgICB9Cgpmb3VuZDoKICAgIGlmIChidWYgIT0gbHBDaGFyKQogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGxwQ2hhcik7CgogICAgLyogTnVsbC10ZXJtaW5hdGUgdGhlIGJ1ZmZlciwgaWYgdGhlcmUncyByb29tLiAgTVNETiBjbGVhcmx5IHN0YXRlcyB0aGF0IHRoZQogICAgICAgY2FsbGVyIG11c3Qgbm90IGFzc3VtZSB0aGlzIGlzIGRvbmUsIGJ1dCBzb21lIHByb2dyYW1zIChlLmcuIEF1ZGlvc3VyZikgZG8uICovCiAgICBpZiAoMSA8PSByZXQgJiYgcmV0IDwgYnVmV19zaXplKQogICAgICAgIGJ1ZldbcmV0XSA9IDA7CgogICAgVFJBQ0VfKGtleSkoInJldHVybmluZyAlZCB3aXRoICVzXG4iLCByZXQsIGRlYnVnc3RyX3duKGJ1ZlcsIHJldCkpOwogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlCZWVwIChYMTFEUlYuQCkKICovCnZvaWQgQ0RFQ0wgWDExRFJWX0JlZXAodm9pZCkKewogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICBYQmVsbChnZGlfZGlzcGxheSwgMCk7CiAgICB3aW5lX3RzeDExX3VubG9jaygpOwp9Cg==