LyoKICogWDExIGtleWJvYXJkIGRyaXZlcgogKgogKiBDb3B5cmlnaHQgMTk5MyBCb2IgQW1zdGFkdAogKiBDb3B5cmlnaHQgMTk5NiBBbGJyZWNodCBLbGVpbmUKICogQ29weXJpZ2h0IDE5OTcgRGF2aWQgRmF1cmUKICogQ29weXJpZ2h0IDE5OTggTW9ydGVuIFdlbGluZGVyCiAqIENvcHlyaWdodCAxOTk4IFVscmljaCBXZWlnYW5kCiAqIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCgojaW5jbHVkZSA8WDExL1hhdG9tLmg+CiNpbmNsdWRlIDxYMTEva2V5c3ltLmg+CiNpbmNsdWRlIDxYMTEvWGxpYi5oPgojaW5jbHVkZSA8WDExL1hyZXNvdXJjZS5oPgojaW5jbHVkZSA8WDExL1h1dGlsLmg+CiNpZmRlZiBIQVZFX1hLQgojaW5jbHVkZSA8WDExL1hLQmxpYi5oPgojZW5kaWYKCiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNkZWZpbmUgTk9OQU1FTEVTU1VOSU9OCiNkZWZpbmUgTk9OQU1FTEVTU1NUUlVDVAojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgIndpbmUvd2ludXNlcjE2LmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgIndpbi5oIgojaW5jbHVkZSAieDExZHJ2LmgiCiNpbmNsdWRlICJ3aW5lL3VuaWNvZGUuaCIKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGtleWJvYXJkKTsKV0lORV9ERUNMQVJFX0RFQlVHX0NIQU5ORUwoa2V5KTsKV0lORV9ERUNMQVJFX0RFQlVHX0NIQU5ORUwoZGlucHV0KTsKCnN0YXRpYyBpbnQgbWluX2tleWNvZGUsIG1heF9rZXljb2RlLCBrZXlzeW1zX3Blcl9rZXljb2RlOwpzdGF0aWMgV09SRCBrZXljMnZrZXlbMjU2XSwga2V5YzJzY2FuWzI1Nl07CgpzdGF0aWMgTFBCWVRFIHBLZXlTdGF0ZVRhYmxlOwpzdGF0aWMgaW50IE51bUxvY2tNYXNrLCBBbHRHck1hc2s7IC8qIG1hc2sgaW4gdGhlIFhLZXlFdmVudCBzdGF0ZSAqLwpzdGF0aWMgaW50IGtjQ29udHJvbCwga2NBbHQsIGtjU2hpZnQsIGtjTnVtTG9jaywga2NDYXBzTG9jazsgLyoga2V5Y29kZXMgKi8KCnN0YXRpYyBjaGFyIEtFWUJPQVJEX01hcERlYWRLZXlzeW0oS2V5U3ltIGtleXN5bSk7CgovKiBLZXlib2FyZCB0cmFuc2xhdGlvbiB0YWJsZXMgKi8KI2RlZmluZSBNQUlOX0xFTiA0OQpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV9zY2FuX3F3ZXJ0eVtNQUlOX0xFTl0gPQp7Ci8qIHRoaXMgaXMgbXkgKDEwMi1rZXkpIGtleWJvYXJkIGxheW91dCwgc29ycnkgaWYgaXQgZG9lc24ndCBxdWl0ZSBtYXRjaCB5b3VycyAqLwogLyogYCAgICAxICAgIDIgICAgMyAgICA0ICAgIDUgICAgNiAgICA3ICAgIDggICAgOSAgICAwICAgIC0gICAgPSAqLwogICAweDI5LDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgwQywweDBELAogLyogcSAgICB3ICAgIGUgICAgciAgICB0ICAgIHkgICAgdSAgICBpICAgIG8gICAgcCAgICBbICAgIF0gKi8KICAgMHgxMCwweDExLDB4MTIsMHgxMywweDE0LDB4MTUsMHgxNiwweDE3LDB4MTgsMHgxOSwweDFBLDB4MUIsCiAvKiBhICAgIHMgICAgZCAgICBmICAgIGcgICAgaCAgICBqICAgIGsgICAgbCAgICA7ICAgICcgICAgXCAqLwogICAweDFFLDB4MUYsMHgyMCwweDIxLDB4MjIsMHgyMywweDI0LDB4MjUsMHgyNiwweDI3LDB4MjgsMHgyQiwKIC8qIHogICAgeCAgICBjICAgIHYgICAgYiAgICBuICAgIG0gICAgLCAgICAuICAgIC8gKi8KICAgMHgyQywweDJELDB4MkUsMHgyRiwweDMwLDB4MzEsMHgzMiwweDMzLDB4MzQsMHgzNSwKICAgMHg1NiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3NjYW5fYWJudF9xd2VydHlbTUFJTl9MRU5dID0KewogLyogYCAgICAxICAgIDIgICAgMyAgICA0ICAgIDUgICAgNiAgICA3ICAgIDggICAgOSAgICAwICAgIC0gICAgPSAqLwogICAweDI5LDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgwQywweDBELAogLyogcSAgICB3ICAgIGUgICAgciAgICB0ICAgIHkgICAgdSAgICBpICAgIG8gICAgcCAgICBbICAgIF0gKi8KICAgMHgxMCwweDExLDB4MTIsMHgxMywweDE0LDB4MTUsMHgxNiwweDE3LDB4MTgsMHgxOSwweDFBLDB4MUIsCiAvKiBhICAgIHMgICAgZCAgICBmICAgIGcgICAgaCAgICBqICAgIGsgICAgbCAgICA7ICAgICcgICAgXCAqLwogICAweDFFLDB4MUYsMHgyMCwweDIxLDB4MjIsMHgyMywweDI0LDB4MjUsMHgyNiwweDI3LDB4MjgsMHgyQiwKIC8qIFwgICAgICB6ICAgIHggICAgYyAgICB2ICAgIGIgICAgbiAgICBtICAgICwgICAgLiAgICAvICovCiAgIDB4NWUsMHgyQywweDJELDB4MkUsMHgyRiwweDMwLDB4MzEsMHgzMiwweDMzLDB4MzQsMHgzNSwKICAgMHg1NiwgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV9zY2FuX2R2b3Jha1tNQUlOX0xFTl0gPQp7CiAvKiBgICAgIDEgICAgMiAgICAzICAgIDQgICAgNSAgICA2ICAgIDcgICAgOCAgICA5ICAgIDAgICAgWyAgICBdICovCiAgIDB4MjksMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDFBLDB4MUIsCiAvKiAnICAgICwgICAgLiAgICBwICAgIHkgICAgZiAgICBnICAgIGMgICAgciAgICBsICAgIC8gICAgPSAqLwogICAweDI4LDB4MzMsMHgzNCwweDE5LDB4MTUsMHgyMSwweDIyLDB4MkUsMHgxMywweDI2LDB4MzUsMHgwRCwKIC8qIGEgICAgbyAgICBlICAgIHUgICAgaSAgICBkICAgIGggICAgdCAgICBuICAgIHMgICAgLSAgICBcICovCiAgIDB4MUUsMHgxOCwweDEyLDB4MTYsMHgxNywweDIwLDB4MjMsMHgxNCwweDMxLDB4MUYsMHgwQywweDJCLAogLyogOyAgICBxICAgIGogICAgayAgICB4ICAgIGIgICAgbSAgICB3ICAgIHYgICAgeiAqLwogICAweDI3LDB4MTAsMHgyNCwweDI1LDB4MkQsMHgzMCwweDMyLDB4MTEsMHgyRiwweDJDLAogICAweDU2IC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9xd2VydHlbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICBWS19PRU1fMyxWS18xLFZLXzIsVktfMyxWS180LFZLXzUsVktfNixWS183LFZLXzgsVktfOSxWS18wLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUywKICAgVktfUSxWS19XLFZLX0UsVktfUixWS19ULFZLX1ksVktfVSxWS19JLFZLX08sVktfUCxWS19PRU1fNCxWS19PRU1fNiwKICAgVktfQSxWS19TLFZLX0QsVktfRixWS19HLFZLX0gsVktfSixWS19LLFZLX0wsVktfT0VNXzEsVktfT0VNXzcsVktfT0VNXzUsCiAgIFZLX1osVktfWCxWS19DLFZLX1YsVktfQixWS19OLFZLX00sVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X3F3ZXJ0eV92MltNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV81LFZLXzEsVktfMixWS18zLFZLXzQsVktfNSxWS182LFZLXzcsVktfOCxWS185LFZLXzAsVktfT0VNX1BMVVMsVktfT0VNXzQsCiAgIFZLX1EsVktfVyxWS19FLFZLX1IsVktfVCxWS19ZLFZLX1UsVktfSSxWS19PLFZLX1AsVktfT0VNXzYsVktfT0VNXzEsCiAgIFZLX0EsVktfUyxWS19ELFZLX0YsVktfRyxWS19ILFZLX0osVktfSyxWS19MLFZLX09FTV8zLFZLX09FTV83LFZLX09FTV8yLAogICBWS19aLFZLX1gsVktfQyxWS19WLFZLX0IsVktfTixWS19NLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV9NSU5VUywKICAgVktfT0VNXzEwMiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfcXdlcnR6W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzMsVktfMSxWS18yLFZLXzMsVktfNCxWS181LFZLXzYsVktfNyxWS184LFZLXzksVktfMCxWS19PRU1fTUlOVVMsVktfT0VNX1BMVVMsCiAgIFZLX1EsVktfVyxWS19FLFZLX1IsVktfVCxWS19aLFZLX1UsVktfSSxWS19PLFZLX1AsVktfT0VNXzQsVktfT0VNXzYsCiAgIFZLX0EsVktfUyxWS19ELFZLX0YsVktfRyxWS19ILFZLX0osVktfSyxWS19MLFZLX09FTV8xLFZLX09FTV83LFZLX09FTV81LAogICBWS19ZLFZLX1gsVktfQyxWS19WLFZLX0IsVktfTixWS19NLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9xd2VydHpfMTA1W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzMsVktfMSxWS18yLFZLXzMsVktfNCxWS181LFZLXzYsVktfNyxWS184LFZLXzksVktfMCxWS19PRU1fTUlOVVMsVktfT0VNX1BMVVMsCiAgIFZLX1EsVktfVyxWS19FLFZLX1IsVktfVCxWS19aLFZLX1UsVktfSSxWS19PLFZLX1AsVktfT0VNXzQsVktfT0VNXzYsCiAgIFZLX0EsVktfUyxWS19ELFZLX0YsVktfRyxWS19ILFZLX0osVktfSyxWS19MLFZLX09FTV8xLFZLX09FTV83LFZLX09FTV81LAogICBWS19PRU1fMTAyLFZLX1ksVktfWCxWS19DLFZLX1YsVktfQixWS19OLFZLX00sVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIKfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfYWJudF9xd2VydHlbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICBWS19PRU1fMyxWS18xLFZLXzIsVktfMyxWS180LFZLXzUsVktfNixWS183LFZLXzgsVktfOSxWS18wLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUywKICAgVktfUSxWS19XLFZLX0UsVktfUixWS19ULFZLX1ksVktfVSxWS19JLFZLX08sVktfUCxWS19PRU1fNCxWS19PRU1fNiwKICAgVktfQSxWS19TLFZLX0QsVktfRixWS19HLFZLX0gsVktfSixWS19LLFZLX0wsVktfT0VNXzEsVktfT0VNXzgsVktfT0VNXzUsCiAgIFZLX09FTV83LFZLX1osVktfWCxWS19DLFZLX1YsVktfQixWS19OLFZLX00sVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsCiAgIFZLX09FTV8xMDIsIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9hemVydHlbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICBWS19PRU1fNyxWS18xLFZLXzIsVktfMyxWS180LFZLXzUsVktfNixWS183LFZLXzgsVktfOSxWS18wLFZLX09FTV80LFZLX09FTV9QTFVTLAogICBWS19BLFZLX1osVktfRSxWS19SLFZLX1QsVktfWSxWS19VLFZLX0ksVktfTyxWS19QLFZLX09FTV82LFZLX09FTV8xLAogICBWS19RLFZLX1MsVktfRCxWS19GLFZLX0csVktfSCxWS19KLFZLX0ssVktfTCxWS19NLFZLX09FTV8zLFZLX09FTV81LAogICBWS19XLFZLX1gsVktfQyxWS19WLFZLX0IsVktfTixWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCxWS19PRU1fMixWS19PRU1fOCwKICAgVktfT0VNXzEwMiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfZHZvcmFrW01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzMsVktfMSxWS18yLFZLXzMsVktfNCxWS181LFZLXzYsVktfNyxWS184LFZLXzksVktfMCxWS19PRU1fNCxWS19PRU1fNiwKICAgVktfT0VNXzcsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfUCxWS19ZLFZLX0YsVktfRyxWS19DLFZLX1IsVktfTCxWS19PRU1fMixWS19PRU1fUExVUywKICAgVktfQSxWS19PLFZLX0UsVktfVSxWS19JLFZLX0QsVktfSCxWS19ULFZLX04sVktfUyxWS19PRU1fTUlOVVMsVktfT0VNXzUsCiAgIFZLX09FTV8xLFZLX1EsVktfSixWS19LLFZLX1gsVktfQixWS19NLFZLX1csVktfVixWS19aLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKLyoqKiBERUZJTkUgWU9VUiBORVcgTEFOR1VBR0UtU1BFQ0lGSUMgTUFQUElOR1MgQkVMT1csIFNFRSBFWElTVElORyBUQUJMRVMgKi8KCi8qIHRoZSBWSyBtYXBwaW5ncyBmb3IgdGhlIG1haW4ga2V5Ym9hcmQgd2lsbCBiZSBhdXRvLWFzc2lnbmVkIGFzIGJlZm9yZSwKICAgc28gd2hhdCB3ZSBoYXZlIGhlcmUgaXMganVzdCB0aGUgY2hhcmFjdGVyIHRhYmxlcyAqLwovKiBvcmRlcjogTm9ybWFsLCBTaGlmdCwgQWx0R3IsIFNoaWZ0LUFsdEdyICovCi8qIFdlIHJlY29tbWVuZCB5b3Ugd3JpdGUganVzdCB3aGF0IGlzIGd1YXJhbnRlZWQgdG8gYmUgY29ycmVjdCAoaS5lLiB3aGF0J3MKICAgd3JpdHRlbiBvbiB0aGUga2V5Y2FwcyksIG5vdCB0aGUgYnVuY2ggb2Ygc3BlY2lhbCBjaGFyYWN0ZXJzIGJlaGluZCBBbHRHcgogICBhbmQgU2hpZnQtQWx0R3IgaWYgaXQgY2FuIHZhcnkgYW1vbmcgZGlmZmVyZW50IFggc2VydmVycyAqLwovKiBSZW1lbWJlciB0aGF0IHlvdXIgMTAybmQga2V5ICh0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgc2hvdWxkIGJlIG9uIGEKICAgc2VwYXJhdGUgbGluZSwgc2VlIGV4aXN0aW5nIHRhYmxlcyAqLwovKiBJZiBXaW5lIGZhaWxzIHRvIG1hdGNoIHlvdXIgbmV3IHRhYmxlLCB1c2UgV0lORURFQlVHPStrZXkgdG8gZmluZCBvdXQgd2h5ICovCi8qIFJlbWVtYmVyIHRvIGFsc28gYWRkIHlvdXIgbmV3IHRhYmxlIHRvIHRoZSBsYXlvdXQgaW5kZXggdGFibGUgZmFyIGJlbG93ISAqLwoKLyoqKiBHZXJtYW4gTG9naXRlY2ggRGVza3RvcCBQcm8ga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0RFX2xvZ2l0ZWNoW01BSU5fTEVOXVs0XSA9CnsKICJeXHhiMCIsIjEhIiwiMlwiIiwiM1x4YTciLCI0JCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCJceGRmP1xcIiwiJ2AiLAogInFRQCIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIlx4ZmNceGRjIiwiKyp+IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCJceGY2XHhkNiIsIlx4ZTRceGM0IiwiIyciLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PnwiCn07CgovKioqIFVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChtb3N0bHkgY29udHJpYnV0ZWQgYnkgVXdlIEJvbm5lcykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVVNbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIKfTsKCi8qKiogVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pICovCi8qIChYRnJlZTg2IHJlcG9ydHMgdGhlIDw+IGtleSBldmVuIGlmIGl0J3Mgbm90IHBoeXNpY2FsbHkgdGhlcmUpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTX3BoYW50b21bTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCAoZHZvcmFrIHZlcnNpb24pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTX2R2b3Jha1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIlt7IiwiXX0iLAogIidcIiIsIiw8IiwiLj4iLCJwUCIsInlZIiwiZkYiLCJnRyIsImNDIiwiclIiLCJsTCIsIi8/IiwiPSsiLAogImFBIiwib08iLCJlRSIsInVVIiwiaUkiLCJkRCIsImhIIiwidFQiLCJuTiIsInNTIiwiLV8iLCJcXHwiLAogIjs6IiwicVEiLCJqSiIsImtLIiwieFgiLCJiQiIsIm1NIiwid1ciLCJ2ViIsInpaIgp9OwoKLyoqKiBCcml0aXNoIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VS1tNQUlOX0xFTl1bNF0gPQp7CiAiYCIsIjEhIiwiMlwiIiwiM6MiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiW3siLCJdfSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzoiLCInQCIsIiN+IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiXFx8Igp9OwoKLyoqKiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBFcmljIFBvdWVjaCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfRlJbTUFJTl9MRU5dWzRdID0KewogIrIiLCImMSIsIukyfiIsIlwiMyMiLCInNHsiLCIoNVsiLCItNnwiLCLoN2AiLCJfOFxcIiwi5zlesSIsIuAwQCIsIimwXSIsIj0rfSIsCiAiYUEiLCJ6WiIsImVFvyIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiXqgiLCIko6QiLAogInFRIiwic1PfIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCJtTSIsIvklIiwiKrUiLAogIndXIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIiw/IiwiOy4iLCI6LyIsIiGnIiwKICI8PiIKfTsKCi8qKiogSWNlbGFuZGljIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGlzKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9JU1tNQUlOX0xFTl1bNF0gPQp7CiAisCIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIvbWIiwiLV8iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi8NAiLCInPyIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi5sYiLCK0xCIsIisqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCL+3iIsCiAiPD4iCn07CgovKioqIEdlcm1hbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IFVscmljaCBXZWlnYW5kKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9ERVtNQUlOX0xFTl1bNF0gPQp7CiAiXrAiLCIxISIsIjJcIrIiLCIzp7MiLCI0JCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCLfP1xcIiwiJ2AiLAogInFRQCIsIndXIiwiZUWAIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL83CIsIisqfiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIiO0IiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTbUiLCIsOyIsIi46IiwiLV8iLAogIjw+fCIKfTsKCi8qKiogR2VybWFuIGtleWJvYXJkIGxheW91dCB3aXRob3V0IGRlYWQga2V5cyAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9ERV9ub2RlYWRbTUFJTl9MRU5dWzRdID0KewogIl6wIiwiMSEiLCIyXCIiLCIzpyIsIjQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIt8/XFwiLCK0IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIvzcIiwiKyp+IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiIyciLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogR2VybWFuIGtleWJvYXJkIGxheW91dCB3aXRob3V0IGRlYWQga2V5cyAxMDUgS2V5cyAoY29udHJpYnV0ZWQgYnkgTWF0dGhpYXMgRmVjaG5lcikqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9ERV9ub2RlYWRfMTA1W01BSU5fTEVOXVs0XSA9CnsKICJesCIsIjEhIiwiMlwisiIsIjOnsyIsIjQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIt8/XFwiLCInYCIsCiAicVFAIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi/NwiLCIrKn4iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbWIiwi5MQiLCIjJyIsCiAiPD58IiwieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAp9OwoKLyoqKiBTd2lzcyBHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBKb25hdGhhbiBOYXlsb3IpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NHW01BSU5fTEVOXVs0XSA9CnsKICKnsCIsIjErfCIsIjJcIkAiLCIzKiMiLCI05yIsIjUlIiwiNiasIiwiNy+mIiwiOCiiIiwiOSkiLCIwPSIsIic/tCIsIl5gfiIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL86FsiLCKoIV0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbpIiwi5OB7IiwiJKN9IiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD5cXCIKfTsKCi8qKiogU3dpc3MgRnJlbmNoIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgUGhpbGlwcGUgRnJvaWRldmF1eCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0ZbTUFJTl9MRU5dWzRdID0KewogIqewIiwiMSt8IiwiMlwiQCIsIjMqIyIsIjTnIiwiNSUiLCI2JqwiLCI3L6YiLCI4KKIiLCI5KSIsIjA9IiwiJz+0IiwiXmB+IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIuj8WyIsIqghXSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi6fYiLCLg5HsiLCIko30iLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PlxcIgp9OwoKLyoqKiBOb3J3ZWdpYW4ga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBPdmUgS+V2ZW4pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X05PW01BSU5fTEVOXVs0XSA9CnsKICJ8pyIsIjEhIiwiMlwiQCIsIjMjoyIsIjSkJCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCIrPyIsIlxcYLQiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi5cUiLCKoXn4iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvjYIiwi5sYiLCInKiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBEYW5pc2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZGspICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0RBW01BSU5fTEVOXVs0XSA9CnsKICK9pyIsIjEhIiwiMlwiIiwiMyMiLCI0pCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIis/IiwitGAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi5cUiLCKoXiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi5sYiLCL42CIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIFN3ZWRpc2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgc2UpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NFW01BSU5fTEVOXVs0XSA9CnsKICKnvSIsIjEhIiwiMlwiIiwiMyMiLCI0pCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIis/IiwitGAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi5cUiLCKoXiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEVzdG9uaWFuIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgUmF1bCBNZXRzbWEgem9tYmk4MkBob3QuZWUpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0VUW01BSU5fTEVOXVs0XSA9CnsKICK3fiIsIjEhIiwiMlwiQCIsIjMjoyIsIjSkJCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCIrP1xcIiwitGAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi/NwiLCL11aciLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbWIiwi5MQiLCInKr0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PnwiCn07CgovKioqIENhbmFkaWFuIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ0ZbTUFJTl9MRU5dWzRdID0KewogIiN8XFwiLCIxIbEiLCIyXCJAIiwiMy+jIiwiNCSiIiwiNSWkIiwiNj+sIiwiNyamIiwiOCqyIiwiOSizIiwiMCm8IiwiLV+9IiwiPSu+IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib0+nIiwicFC2IiwiXl5bIiwiuKhdIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7On4iLCJgYHsiLCI8Pn0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLCctIiwiLiIsIunJIiwKICKru7AiCn07CgovKioqIFBvcnR1Z3Vlc2Uga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgcHQpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1BUW01BSU5fTEVOXVs0XSA9CnsKICJcXHwiLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIqu7IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIisqIiwitGAiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIufHIiwiuqoiLCJ+XiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBJdGFsaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGl0KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9JVFtNQUlOX0xFTl1bNF0gPQp7CiAiXFx8IiwiMSEiLCIyXCIiLCIzoyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCLsXiIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLo6SIsIisqIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLy5yIsIuCwIiwi+aciLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogRmlubmlzaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBmaSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfRklbTUFJTl9MRU5dWzRdID0KewogIqe9IiwiMSEiLCIyXCIiLCIzIyIsIjSkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiKz8iLCK0YCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqheIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiJyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogQnVsZ2FyaWFuIGJkcyBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQkdfYmRzW01BSU5fTEVOXVs0XSA9CnsKICJgfigpIiwiMSEiLCIyQDI/IiwiMyMzKyIsIjQkNFwiIiwiNSUiLCI2XjY9IiwiNyY3OiIsIjgqOC8iLCI5KCIsIjApIiwiLV8tSSIsIj0rLlYiLAogInFRLPsiLCJ3V/PTIiwiZUXlxSIsInJS6MgiLCJ0VPjYIiwieVn52SIsInVV6soiLCJpSfHRIiwib0/kxCIsInBQ58ciLCJbe/bWIiwiXX07IiwKICJhQfzcIiwic1P/3yIsImRE4MAiLCJmRu7OIiwiZ0fmxiIsImhI48MiLCJqSvLSIiwia0vtzSIsImxM4sIiLCI7OuzMIiwiJ1wi99ciLCJcXHwn2yIsCiAielr+3iIsInhY6ckiLCJjQ/raIiwidlb93SIsImJC9NQiLCJuTvXVIiwibU3vzyIsIiw88NAiLCIuPuvLIiwiLz/hwSIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBCdWxnYXJpYW4gcGhvbmV0aWMga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0JHX3Bob25ldGljW01BSU5fTEVOXVs0XSA9CnsKICJgfvfXIiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUf/fIiwid1fiwiIsImVF5cUiLCJyUvDQIiwidFTy0iIsInlZ+toiLCJ1VfPTIiwiaUnoyCIsIm9P7s4iLCJwUO/PIiwiW3v42CIsIl19+dkiLAogImFB4MAiLCJzU/HRIiwiZETkxCIsImZG9NQiLCJnR+PDIiwiaEj11SIsImpK6ckiLCJrS+rKIiwibEzryyIsIjs6IiwiJ1wiIiwiXFx8/t4iLAogInpa58ciLCJ4WPzcIiwiY0P21iIsInZW5sYiLCJiQuHBIiwibk7tzSIsIm1N7MwiLCIsPCIsIi4+IiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogQmVsYXJ1c2lhbiBzdGFuZGFyZCBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IEhsZWIgVmFsb3NrYSkgKi8KLyoqKiBJdCBtYXRjaGVzIGJlbGFydXNpYW4gbGF5b3V0IGZvciBYS0IgZnJvbSBBbGV4YW5kZXIgTWlraGFpbGlhbiAgICAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9CWVtNQUlOX0xFTl1bNF0gPQp7CiAiYH6jsyIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVHK6iIsIndXw+MiLCJlRdX1IiwiclLL6yIsInRUxeUiLCJ5Wc7uIiwidVXH5yIsImlJ2/siLCJvT66+IiwicFDa+iIsIlt7yOgiLCJdfScnIiwKICJhQcbmIiwic1PZ+SIsImRE1/ciLCJmRsHhIiwiZ0fQ8CIsImhI0vIiLCJqSs/vIiwia0vM7CIsImxMxOQiLCI7Otb2IiwiJ1wi3PwiLCJcXHwvfCIsCiAielrR8SIsInhY3v4iLCJjQ9PzIiwidlbN7SIsImJCprYiLCJuTtT0IiwibU3Y+CIsIiw8wuIiLCIuPsDgIiwiLz8uLCIsICI8PnymIiwKfTsKCgovKioqIFJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBQYXZlbCBSb3NraW4pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVHK6iIsIndXw+MiLCJlRdX1IiwiclLL6yIsInRUxeUiLCJ5Wc7uIiwidVXH5yIsImlJ2/siLCJvT939IiwicFDa+iIsIlt7yOgiLCJdfd//IiwKICJhQcbmIiwic1PZ+SIsImRE1/ciLCJmRsHhIiwiZ0fQ8CIsImhI0vIiLCJqSs/vIiwia0vM7CIsImxMxOQiLCI7Otb2IiwiJ1wi3PwiLCJcXHwiLAogInpa0fEiLCJ4WN7+IiwiY0PT8yIsInZWze0iLCJiQsnpIiwibk7U9CIsIm1N2PgiLCIsPMLiIiwiLj7A4CIsIi8/Igp9OwoKLyoqKiBSdXNzaWFuIGtleWJvYXJkIGxheW91dCAocGhhbnRvbSBrZXkgdmVyc2lvbikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUlVfcGhhbnRvbVtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRyuoiLCJ3V8PjIiwiZUXV9SIsInJSy+siLCJ0VMXlIiwieVnO7iIsInVVx+ciLCJpSdv7Iiwib0/d/SIsInBQ2voiLCJbe8joIiwiXX3f/yIsCiAiYUHG5iIsInNT2fkiLCJkRNf3IiwiZkbB4SIsImdH0PAiLCJoSNLyIiwiakrP7yIsImtLzOwiLCJsTMTkIiwiOzrW9iIsIidcItz8IiwiXFx8IiwKICJ6WtHxIiwieFje/iIsImND0/MiLCJ2Vs3tIiwiYkLJ6SIsIm5O1PQiLCJtTdj4IiwiLDzC4iIsIi4+wOAiLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBSdXNzaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVIgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUlVfa29pOHJbTUFJTl9MRU5dWzRdID0KewogIigpIiwiMSEiLCIyXCIiLCIzLyIsIjQkIiwiNToiLCI2LCIsIjcuIiwiODsiLCI5PyIsIjAlIiwiLV8iLCI9KyIsCiAiyuoiLCLD4yIsItX1Iiwiy+siLCLF5SIsIs7uIiwix+ciLCLb+yIsIt39Iiwi2voiLCLI6CIsIt//IiwKICLG5iIsItn5Iiwi1/ciLCLB4SIsItDwIiwi0vIiLCLP7yIsIszsIiwixOQiLCLW9iIsItz8IiwiXFx8IiwKICLR8SIsIt7+Iiwi0/MiLCLN7SIsIsnpIiwi1PQiLCLY+CIsIsLiIiwiwOAiLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBSdXNzaWFuIGtleWJvYXJkIGxheW91dCBjcDEyNTEgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUlVfY3AxMjUxW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVHpySIsIndX9tYiLCJlRfPTIiwiclLqyiIsInRU5cUiLCJ5We3NIiwidVXjwyIsImlJ+NgiLCJvT/nZIiwicFDnxyIsIlt79dUiLCJdffraIiwKICJhQfTUIiwic1P72yIsImRE4sIiLCJmRuDAIiwiZ0fvzyIsImhI8NAiLCJqSu7OIiwia0vryyIsImxM5MQiLCI7OubGIiwiJ1wi/d0iLCJcXHwiLAogInpa/98iLCJ4WPfXIiwiY0Px0SIsInZW7MwiLCJiQujIIiwibk7y0iIsIm1N/NwiLCIsPOHBIiwiLj7+3iIsIi8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFJ1c3NpYW4gcGhvbmV0aWMga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX3Bob25ldGljW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVHR8SIsIndX1/ciLCJlRcXlIiwiclLS8iIsInRU1PQiLCJ5Wdn5IiwidVXV9SIsImlJyekiLCJvT8/vIiwicFDQ8CIsIlt72/siLCJdfd39IiwKICJhQcHhIiwic1PT8yIsImRExOQiLCJmRsbmIiwiZ0fH5yIsImhIyOgiLCJqSsrqIiwia0vL6yIsImxMzOwiLCI7OiIsIidcIiIsIlxcfCIsCiAielra+iIsInhY2PgiLCJjQ8PjIiwidlbW9iIsImJCwuIiLCJuTs7uIiwibU3N7SIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBVa3JhaW5pYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtVSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VQVtNQUlOX0xFTl1bNF0gPQp7CiAiYH6tvSIsIjEhMSEiLCIyQDJcIiIsIjMjMyciLCI0JDQqIiwiNSU1OiIsIjZeNiwiLCI3JjcuIiwiOCo4OyIsIjkoOSgiLCIwKTApIiwiLV8tXyIsIj0rPSsiLAogInFRyuoiLCJ3V8PjIiwiZUXV9SIsInJSy+siLCJ0VMXlIiwieVnO7iIsInVVx+ciLCJpSdv7Iiwib0/d/SIsInBQ2voiLCJbe8joIiwiXX2ntyIsCiAiYUHG5iIsInNTprYiLCJkRNf3IiwiZkbB4SIsImdH0PAiLCJoSNLyIiwiakrP7yIsImtLzOwiLCJsTMTkIiwiOzrW9iIsIidcIqS0IiwiXFx8XFx8IiwKICJ6WtHxIiwieFje/iIsImND0/MiLCJ2Vs3tIiwiYkLJ6SIsIm5O1PQiLCJtTdj4IiwiLDzC4iIsIi4+wOAiLCIvPy8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFNwYW5pc2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0VTW01BSU5fTEVOXVs0XSA9CnsKICK6qiIsIjEhIiwiMlwiIiwiM7ciLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/Iiwiob8iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiYF4iLCIrKiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi8dEiLCK0qCIsIufHIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEJlbGdpYW4ga2V5Ym9hcmQgbGF5b3V0ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQkVbTUFJTl9MRU5dWzRdID0KewogIiIsIiYxfCIsIukyQCIsIlwiMyMiLCInNCIsIig1IiwipzZeIiwi6DciLCIhOCIsIuc5eyIsIuAwfSIsIimwIiwiLV8iLAogImFBIiwieloiLCJlRaQiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIl6oWyIsIiQqXSIsCiAicVEiLCJzU98iLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIm1NIiwi+SW0IiwitaNgIiwKICJ3VyIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCIsPyIsIjsuIiwiOi8iLCI9K34iLAogIjw+XFwiCn07CgovKioqIEh1bmdhcmlhbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IFpvbHThbiBLb3bhY3MpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0hVW01BSU5fTEVOXVs0XSA9CnsKICIwpyIsIjEnfiIsIjJcIrciLCIzK14iLCI0IaIiLCI1JbAiLCI2L7IiLCI3PWAiLCI4KP8iLCI5KbQiLCL21r0iLCL83KgiLCLz07giLAogInFRXFwiLCJ3V3wiLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUnNIiwib0/4IiwicFAiLCL11fciLCL62tciLAogImFBIiwic1PwIiwiZETQIiwiZkZbIiwiZ0ddIiwiaEgiLCJqSu0iLCJrS7MiLCJsTKMiLCLpySQiLCLhwd8iLCL726QiLAogInlZPiIsInhYIyIsImNDJiIsInZWQCIsImJCeyIsIm5OfSIsIm1NIiwiLD87IiwiLjo+IiwiLV8qIiwKICLtzTwiCn07CgovKioqIFBvbGlzaCAocHJvZ3JhbW1lcidzKSBrZXlib2FyZCBsYXlvdXQgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9QTFtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JqciLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUXqyiIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvT/PTIiwicFAiLCJbeyIsIl19IiwKICJhQbGhIiwic1O2piIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMs6MiLCI7OiIsIidcIiIsIlxcfCIsCiAielq/ryIsInhYvKwiLCJjQ+bGIiwidlYiLCJiQiIsIm5O8dEiLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiPD58Igp9OwoKLyoqKiBTbG92ZW5pYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgc2kpICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0lbTUFJTl9MRU5dWzRdID0KewogIrioIiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCIrKiIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCK5qSIsIvDQIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLoyCIsIubGIiwivq4iLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogQ3JvYXRpYW4ga2V5Ym9hcmQgbGF5b3V0IHNwZWNpZmljIGZvciBtZSA8amVsbHlAc3JrLmZlci5ocj4gKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9IUl9qZWxseVtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiW3u5qSIsIl198NAiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs66MgiLCInXCLmxiIsIlxcfL6uIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiPD58Igp9OwoKLyoqKiBDcm9hdGlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBocikgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9IUltNQUlOX0xFTl1bNF0gPQp7CiAiuKgiLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIisqIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIrmpIiwi8NAiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIujIIiwi5sYiLCK+riIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLz8iLAogIjw+Igp9OwoKLyoqKiBKYXBhbmVzZSAxMDYga2V5Ym9hcmQgbGF5b3V0ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSkFfanAxMDZbTUFJTl9MRU5dWzRdID0KewogIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3JyIsIjgoIiwiOSkiLCIwfiIsIi09IiwiXn4iLCJcXHwiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiQGAiLCJbeyIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOysiLCI6KiIsIl19IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiXFxfIiwKfTsKCi8qKiogSmFwYW5lc2UgcGM5OHgxIGtleWJvYXJkIGxheW91dCAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0pBX3BjOTh4MVtNQUlOX0xFTl1bNF0gPQp7CiAiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcnIiwiOCgiLCI5KSIsIjAiLCItPSIsIl5gIiwiXFx8IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIkB+IiwiW3siLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjsrIiwiOioiLCJdfSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIlxcXyIsCn07CgovKioqIEJyYXppbGlhbiBBQk5ULTIga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBSYXVsIEdvbWVzIEZlcm5hbmRlcykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUFRfYnJbTUFJTl9MRU5dWzRdID0KewogIidcIiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2qCIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCK0YCIsIlt7IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLnxyIsIn5eIiwiXX0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIjs6IiwiLz8iLAogIlxcfCIKfTsKCi8qKiogQnJhemlsaWFuIEFCTlQtMiBrZXlib2FyZCBsYXlvdXQgd2l0aCA8QUxUIEdSPiAoY29udHJpYnV0ZWQgYnkgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9QVF9icl9hbHRfZ3JbTUFJTl9MRU5dWzRdID0KewogIidcIiIsIjEhOSIsIjJAMiIsIjMjMyIsIjQkIyIsIjUlXCIiLCI2KCwiLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsnIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIjRgIiwiW3sqIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCJnRyIsIn5eIiwiXX06IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCI7OiIsIi8/MCIsCiAiXFx8Igp9OwoKLyoqKiBVUyBpbnRlcm5hdGlvbmFsIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgR3VzdGF2byBOb3JvbmhhIChrb3ZAZGViaWFuLm9yZykpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTX2ludGxbTUFJTl9MRU5dWzRdID0KewogICJgfiIsICIxISIsICIyQCIsICIzIyIsICI0JCIsICI1JSIsICI2XiIsICI3JiIsICI4KiIsICI5KCIsICIwKSIsICItXyIsICI9KyIsICJcXHwiLAogICJxUSIsICJ3VyIsICJlRSIsICJyUiIsICJ0VCIsICJ5WSIsICJ1VSIsICJpSSIsICJvTyIsICJwUCIsICJbeyIsICJdfSIsCiAgImFBIiwgInNTIiwgImREIiwgImZGIiwgImdHIiwgImhIIiwgImpKIiwgImtLIiwgImxMIiwgIjs6IiwgIidcIiIsCiAgInpaIiwgInhYIiwgImNDIiwgInZWIiwgImJCIiwgIm5OIiwgIm1NIiwgIiw8IiwgIi4+IiwgIi8/Igp9OwoKLyoqKiBTbG92YWsga2V5Ym9hcmQgbGF5b3V0IChzZWUgY3Nza19pYm0oc2tfcXdlcnR5KSBpbiB4a2JzZWwpCiAgLSBkZWFkX2Fib3ZlcmluZyByZXBsYWNlZCB3aXRoIGRlZ3JlZSAtIG5vIHN5bWJvbCBpbiBpc284ODU5LTIKICAtIGJyb2tlbmJhciByZXBsYWNlZCB3aXRoIGJhcgkJCQkJKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0tbTUFJTl9MRU5dWzRdID0KewogIjswIiwiKzEiLCK1MiIsIrkzIiwi6DQiLCK7NSIsIr42Iiwi/TciLCLhOCIsIu05Iiwi6TAiLCI9JSIsIid2IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIvovIiwi5CgiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvRcIiIsIqchIiwi8ikiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLD8iLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogQ3plY2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgY3opICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NaW01BSU5fTEVOXVs0XSA9CnsKICI7IiwiKzEiLCLsMiIsIrkzIiwi6DQiLCL4NSIsIr42Iiwi/TciLCLhOCIsIu05Iiwi6TAiLCI9JSIsIrS3IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIvovIiwiKSgiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvlcIiIsIqchIiwiqCciLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLD8iLCIuOiIsIi1fIiwKICJcXCIKfTsKCi8qKiogQ3plY2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgY3pfcXdlcnR5KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9DWl9xd2VydHlbTUFJTl9MRU5dWzRdID0KewogIjsiLCIrMSIsIuwyIiwiuTMiLCLoNCIsIvg1IiwivjYiLCL9NyIsIuE4Iiwi7TkiLCLpMCIsIj0lIiwitLciLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi+i8iLCIpKCIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi+VwiIiwipyEiLCKoJyIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPyIsIi46IiwiLV8iLAogIlxcIgp9OwoKLyoqKiBTbG92YWsgYW5kIEN6ZWNoIChwcm9ncmFtbWVyJ3MpIGtleWJvYXJkIGxheW91dCAoc2VlIGNzc2tfZHVhbChjc19za191Y3cpKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TS19wcm9nW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVHkxCIsIndX7MwiLCJlRenJIiwiclL42CIsInRUu6siLCJ5Wf3dIiwidVX52SIsImlJ7c0iLCJvT/PTIiwicFD21iIsIlt7IiwiXX0iLAogImFB4cEiLCJzU7mpIiwiZETvzyIsImZG68siLCJnR+DAIiwiaEj62iIsImpK/NwiLCJrS/TUIiwibEy1pSIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6Wr6uIiwieFikIiwiY0PoyCIsInZW58ciLCJiQiIsIm5O8tIiLCJtTeXFIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIKfTsKCi8qKiogQ3plY2gga2V5Ym9hcmQgbGF5b3V0IChzZWUgY3Nza19pYm0oY3NfcXdlcnR5KSBpbiB4a2JzZWwpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NTW01BSU5fTEVOXVs0XSA9CnsKICI7IiwiKzEiLCLsMiIsIrkzIiwi6DQiLCL4NSIsIr42Iiwi/TciLCLhOCIsIu05Iiwi6TC9KSIsIj0lIiwiIiwKICJxUVxcIiwid1d8IiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIvovW3siLCIpKF19IiwKICJhQSIsInNT8CIsImRE0CIsImZGWyIsImdHXSIsImhIIiwiakoiLCJrS7MiLCJsTKMiLCL5XCIkIiwipyHfIiwiqCciLAogInpaPiIsInhYIyIsImNDJiIsInZWQCIsImJCeyIsIm5OfSIsIm1NIiwiLD88IiwiLjo+IiwiLV8qIiwKICI8PlxcfCIKfTsKCi8qKiogTGF0aW4gQW1lcmljYW4ga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBHYWJyaWVsIE9ybGFuZG8gR2FyY2lhKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9MQVtNQUlOX0xFTl1bNF0gPQp7CiAifLAiLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIr+hIiwKICJxUUAiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCK0qCIsIisqIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLx0SIsIntbXiIsIn1dIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIExpdGh1YW5pYW4gKEJhbHRpYykga2V5Ym9hcmQgbGF5b3V0IChwYy9sdCBpbiBYRnJlZTg2IDQuMy4wLCBjb250cmlidXRlZCBieSBOZXJpanVzIEJhbGn7bmFzKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9MVF9CW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIuDAIiwi6MgiLCLmxiIsIuvLIiwi4cEiLCLw0CIsIvjYIiwi+9siLCKlKCIsIrQpIiwiLV8iLCL+3iIsIlxcfCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJbeyIsIl19IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OiIsIidcIiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iCn07CgovKioqIFR1cmtpc2gga2V5Ym9hcmQgTGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1RLW01BSU5fTEVOXVs0XSA9CnsKIlwi6SIsIjEhIiwiMiciLCIzXiMiLCI0KyQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19IiwiKj9cXCIsIi1fIiwKInFRQCIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsIv1J7iIsIm9PIiwicFAiLCLw0CIsIvzcfiIsCiJhQeYiLCJzU98iLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIv7eIiwiad0iLCIsO2AiLAoieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCL21iIsIufHIiwiLjoiCn07CgovKioqIElzcmFlbGlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCB1cyxpbCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSUxbTUFJTl9MRU5dWzRdID0KewogImB+OyIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEvIiwid1cnIiwiZUX3IiwiclL4IiwidFTgIiwieVnoIiwidVXlIiwiaUnvIiwib0/tIiwicFD0IiwiW3siLCJdfSIsCiAiYUH5Iiwic1PjIiwiZETiIiwiZkbrIiwiZ0fyIiwiaEjpIiwiakrnIiwia0vsIiwibEzqIiwiOzrzIiwiXCdcIiwiLCJcXHwiLAogInpa5iIsInhY8SIsImND4SIsInZW5CIsImJC8CIsIm5O7iIsIm1N9iIsIiw8+iIsIi4+9SIsIi8/LiIsCiAiPD4iCn07CgovKioqIElzcmFlbGlhbiBwaG9uZXRpYyBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCB1cyxpbF9waG9uZXRpYykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSUxfcGhvbmV0aWNbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUfciLCJ3V+UiLCJlReAiLCJyUvgiLCJ0VPoiLCJ5WfIiLCJ1VeUiLCJpSekiLCJvT/EiLCJwUPQiLCJbeyIsIl19IiwKICJhQeAiLCJzU/kiLCJkROMiLCJmRvQiLCJnR+IiLCJoSOQiLCJqSukiLCJrS+siLCJsTOwiLCI7OiIsIidcIiIsIlxcfCIsCiAielrmIiwieFjnIiwiY0P2IiwidlblIiwiYkLhIiwibk7wIiwibU3uIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIKfTsKCi8qKiogSXNyYWVsaWFuIFNhaGFyb24ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgLXN5bWJvbHMgInVzKHBjMTA1KStpbF9zYWhhcm9uIikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSUxfc2FoYXJvbltNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFR9yIsIndX8SIsImVFIiwiclL4IiwidFToIiwieVnjIiwidVUiLCJpSSIsIm9PIiwicFD0IiwiW3siLCJdfSIsCiAiYUHgIiwic1PlIiwiZETsIiwiZkb6IiwiZ0fiIiwiaEjkIiwiakr5Iiwia0vrIiwibEzpIiwiOzoiLCInXCIiLCJcXHwiLAogInpa5iIsInhY5yIsImND9iIsInZW8iIsImJC4SIsIm5O8CIsIm1N7iIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iCn07CgovKioqIEdyZWVrIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgS3JpdG9uIEt5cmltaXMgPGt5cmltaXNAY3RpLmdyPikKICBHcmVlayBjaGFyYWN0ZXJzIGZvciAid1ciIGFuZCAic1MiIGFyZSBvbWl0dGVkIHRvIG5vdCBwcm9kdWNlIGEgbWlzbWF0Y2gKICBtZXNzYWdlIHNpbmNlIHRoZXkgaGF2ZSBkaWZmZXJlbnQgY2hhcmFjdGVycyBpbiBnciBhbmQgZWwgWEZyZWU4NiBsYXlvdXRzLiAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9FTFtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFROzoiLCJ3VyIsImVF5cUiLCJyUvHRIiwidFT01CIsInlZ9dUiLCJ1VejIIiwiaUnpySIsIm9P788iLCJwUPDQIiwiW3siLCJdfSIsCiAiYUHhwSIsInNTIiwiZETkxCIsImZG9tYiLCJnR+PDIiwiaEjnxyIsImpK7s4iLCJrS+rKIiwibEzryyIsIjs6tKgiLCInXCIiLCJcXHwiLAogInpa5sYiLCJ4WPfXIiwiY0P42CIsInZW+dkiLCJiQuLCIiwibk7tzSIsIm1N7MwiLCIsPCIsIi4+IiwiLz8iLAogIjw+Igp9OwoKLyoqKiBUaGFpIChLZWRtYW5lZSkga2V5Ym9hcmQgbGF5b3V0IGJ5IFN1cHBoYWNob2tlIFN1bnRpd2ljaGF5YSA8bXJjaG9rZUBvcGVudGxlLm9yZz4gKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfdGhbTUFJTl9MRU5dWzRdID0KewogImB+XyUiLCIxIeUrIiwiMkAv8SIsIjMjLfIiLCI0JMDzIiwiNSW29CIsIjZe2NkiLCI3JtbfIiwiOCqk9SIsIjkotfYiLCIwKaj3IiwiLV+i+CIsIj0rqvkiLAogInFR5vAiLCJ3V+RcIiIsImVF064iLCJyUr6xIiwidFTQuCIsInlZ0e0iLCJ1VdXqIiwiaUnDsyIsIm9Puc8iLCJwUMKtIiwiW3u6sCIsIl19xSwiLAogImFBv8QiLCJzU8umIiwiZEShryIsImZGtOIiLCJnR+CsIiwiaEjp5yIsImpK6OsiLCJrS9LJIiwibEzKyCIsIjs6x6siLCJcJ1wipy4iLCJcXHyjpSIsCiAielq8KCIsInhYuykiLCJjQ+GpIiwidlbNziIsImJC2iIsIm5O1+wiLCJtTbc/IiwiLDzBsiIsIi4+48wiLCIvP73GIgp9OyAKCi8qKiogVk5DIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV9zY2FuX3ZuY1tNQUlOX0xFTl0gPQp7CiAgIDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgwQywweDBELDB4MUEsMHgxQiwweDI3LDB4MjgsMHgyOSwweDMzLDB4MzQsMHgzNSwweDJCLAogICAweDFFLDB4MzAsMHgyRSwweDIwLDB4MTIsMHgyMSwweDIyLDB4MjMsMHgxNywweDI0LDB4MjUsMHgyNiwweDMyLDB4MzEsMHgxOCwweDE5LDB4MTAsMHgxMywweDFGLDB4MTQsMHgxNiwweDJGLDB4MTEsMHgyRCwweDE1LDB4MkMsCiAgIDB4NTYKfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfdm5jW01BSU5fTEVOXSA9CnsKICAgVktfMSxWS18yLFZLXzMsVktfNCxWS181LFZLXzYsVktfNyxWS184LFZLXzksVktfMCxWS19PRU1fTUlOVVMsVktfT0VNX1BMVVMsVktfT0VNXzQsVktfT0VNXzYsVktfT0VNXzEsVktfT0VNXzcsVktfT0VNXzMsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsVktfT0VNXzUsCiAgIFZLX0EsVktfQixWS19DLFZLX0QsVktfRSxWS19GLFZLX0csVktfSCxWS19JLFZLX0osVktfSyxWS19MLFZLX00sVktfTixWS19PLFZLX1AsVktfUSxWS19SLFZLX1MsVktfVCxWS19VLFZLX1YsVktfVyxWS19YLFZLX1ksVktfWiwKICAgVktfT0VNXzEwMgp9OwoKc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfdm5jW01BSU5fTEVOXVs0XSA9CnsKICIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLCJbeyIsIl19IiwiOzoiLCInXCIiLCJgfiIsIiw8IiwiLj4iLCIvPyIsIlxcfCIsCiAiYUEiLCJiQiIsImNDIiwiZEQiLCJlRSIsImZGIiwiZ0ciLCJoSCIsImlJIiwiakoiLCJrSyIsImxMIiwibU0iLCJuTiIsIm9PIiwicFAiLCJxUSIsInJSIiwic1MiLCJ0VCIsInVVIiwidlYiLCJ3VyIsInhYIiwieVkiLCJ6WiIKfTsKCi8qKiogRHV0Y2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgbmwpICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfTkxbTUFJTl9MRU5dWzRdID0KewogIkCnIiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjdfIiwiOCgiLCI5KSIsIjAnIiwiLz8iLCKwfiIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCKofiIsIip8IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCIrsSIsIidgIiwiPD4iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi09IiwKICJbXSIKfTsKCgoKLyoqKiBMYXlvdXQgdGFibGUuIEFkZCB5b3VyIGtleWJvYXJkIG1hcHBpbmdzIHRvIHRoaXMgbGlzdCAqLwpzdGF0aWMgY29uc3Qgc3RydWN0IHsKICAgIExDSUQgbGNpZDsgLyogaW5wdXQgbG9jYWxlIGlkZW50aWZpZXIsIGxvb2sgZm9yIExPQ0FMRV9JTEFOR1VBR0UKICAgICAgICAgICAgICAgICBpbiB0aGUgYXBwcm9wcmlhdGUgZGxscy9rZXJuZWwvbmxzLy5ubHMgZmlsZSAqLwogICAgY29uc3QgY2hhciAqY29tbWVudDsKICAgIGNvbnN0IGNoYXIgKCprZXkpW01BSU5fTEVOXVs0XTsKICAgIGNvbnN0IFdPUkQgKCpzY2FuKVtNQUlOX0xFTl07IC8qIHNjYW4gY29kZXMgbWFwcGluZyAqLwogICAgY29uc3QgV09SRCAoKnZrZXkpW01BSU5fTEVOXTsgLyogdmlydHVhbCBrZXkgY29kZXMgbWFwcGluZyAqLwp9IG1haW5fa2V5X3RhYltdPXsKIHsweDA0MDksICJVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9VUywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwOSwgIlVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChwaGFudG9tIGtleSB2ZXJzaW9uKSIsICZtYWluX2tleV9VU19waGFudG9tLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA5LCAiVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQgKGR2b3JhaykiLCAmbWFpbl9rZXlfVVNfZHZvcmFrLCAmbWFpbl9rZXlfc2Nhbl9kdm9yYWssICZtYWluX2tleV92a2V5X2R2b3Jha30sCiB7MHgwNDA5LCAiVW5pdGVkIFN0YXRlcyBJbnRlcm5hdGlvbmFsIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9VU19pbnRsLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwODA5LCAiQnJpdGlzaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfVUssICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDcsICJHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0RFLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDA3LCAiR2VybWFuIGtleWJvYXJkIGxheW91dCB3aXRob3V0IGRlYWQga2V5cyIsICZtYWluX2tleV9ERV9ub2RlYWQsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDA0MDcsICJHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IGZvciBsb2dpdGVjaCBkZXNrdG9wIHBybyIsICZtYWluX2tleV9ERV9sb2dpdGVjaCwgICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDA0MDcsICJHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IHdpdGhvdXQgZGVhZCBrZXlzIDEwNSIsICZtYWluX2tleV9ERV9ub2RlYWRfMTA1LCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0el8xMDV9LAogezB4MDgwNywgIlN3aXNzIEdlcm1hbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfU0csICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDEwMGMsICJTd2lzcyBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1NGLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDFkLCAiU3dlZGlzaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfU0UsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5X3YyfSwKIHsweDA0MjUsICJFc3RvbmlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfRVQsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTQsICJOb3J3ZWdpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X05PLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA2LCAiRGFuaXNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9EQSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwYywgIkZyZW5jaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfRlIsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfYXplcnR5fSwKIHsweDBjMGMsICJDYW5hZGlhbiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0NGLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwODBjLCAiQmVsZ2lhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQkUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfYXplcnR5fSwKIHsweDA4MTYsICJQb3J0dWd1ZXNlIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9QVCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxNiwgIkJyYXppbGlhbiBBQk5ULTIga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1BUX2JyLCAmbWFpbl9rZXlfc2Nhbl9hYm50X3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfYWJudF9xd2VydHl9LAogezB4MDQxNiwgIkJyYXppbGlhbiBBQk5ULTIga2V5Ym9hcmQgbGF5b3V0IEFMVCBHUiIsICZtYWluX2tleV9QVF9icl9hbHRfZ3IsJm1haW5fa2V5X3NjYW5fYWJudF9xd2VydHksICZtYWluX2tleV92a2V5X2FibnRfcXdlcnR5fSwKIHsweDA0MGIsICJGaW5uaXNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9GSSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwMiwgIkJ1bGdhcmlhbiBiZHMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0JHX2JkcywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwMiwgIkJ1bGdhcmlhbiBwaG9uZXRpYyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQkdfcGhvbmV0aWMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MjMsICJCZWxhcnVzaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9CWSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxOSwgIlJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1JVLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pIiwgJm1haW5fa2V5X1JVX3BoYW50b20sICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTksICJSdXNzaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVIiLCAmbWFpbl9rZXlfUlVfa29pOHIsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTksICJSdXNzaWFuIGtleWJvYXJkIGxheW91dCBjcDEyNTEiLCAmbWFpbl9rZXlfUlVfY3AxMjUxLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBwaG9uZXRpYyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfUlVfcGhvbmV0aWMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MjIsICJVa3JhaW5pYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtVSIsICZtYWluX2tleV9VQSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwYSwgIlNwYW5pc2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0VTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDEwLCAiSXRhbGlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSVQsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGYsICJJY2VsYW5kaWMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0lTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBlLCAiSHVuZ2FyaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9IVSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDQxNSwgIlBvbGlzaCAocHJvZ3JhbW1lcidzKSBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfUEwsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MjQsICJTbG92ZW5pYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1NJLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDFhLCAiQ3JvYXRpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0hSLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDFhLCAiQ3JvYXRpYW4ga2V5Ym9hcmQgbGF5b3V0IChzcGVjaWZpYykiLCAmbWFpbl9rZXlfSFJfamVsbHksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweGUwMDEwNDExLCAiSmFwYW5lc2UgMTA2IGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9KQV9qcDEwNiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4ZTAwMTA0MTEsICJKYXBhbmVzZSBwYzk4eDEga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0pBX3BjOTh4MSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxYiwgIlNsb3ZhayBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfU0ssICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MWIsICJTbG92YWsgYW5kIEN6ZWNoIGtleWJvYXJkIGxheW91dCB3aXRob3V0IGRlYWQga2V5cyIsICZtYWluX2tleV9TS19wcm9nLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA1LCAiQ3plY2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0NTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA1LCAiQ3plY2gga2V5Ym9hcmQgbGF5b3V0IGN6IiwgJm1haW5fa2V5X0NaLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDA1LCAiQ3plY2gga2V5Ym9hcmQgbGF5b3V0IGN6X3F3ZXJ0eSIsICZtYWluX2tleV9DWl9xd2VydHksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGEsICJMYXRpbiBBbWVyaWNhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfTEEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MjcsICJMaXRodWFuaWFuIChCYWx0aWMpIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9MVF9CLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDFmLCAiVHVya2lzaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfVEssICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGQsICJJc3JhZWxpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0lMLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBkLCAiSXNyYWVsaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9JTF9waG9uZXRpYywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwZCwgIklzcmFlbGlhbiBTYWhhcm9uIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9JTF9zYWhhcm9uLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA5LCAiVk5DIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV92bmMsICZtYWluX2tleV9zY2FuX3ZuYywgJm1haW5fa2V5X3ZrZXlfdm5jfSwKIHsweDA0MDgsICJHcmVlayBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfRUwsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MWUsICJUaGFpIChLZWRtYW5lZSkgIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV90aCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxMywgIkR1dGNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9OTCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAoKIHswLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSAvKiBzZW50aW5lbCAqLwp9OwpzdGF0aWMgdW5zaWduZWQga2JkX2xheW91dD0wOyAvKiBpbmRleCBpbnRvIGFib3ZlIHRhYmxlIG9mIGxheW91dHMgKi8KCi8qIG1heWJlIG1vcmUgb2YgdGhlc2Ugc2NhbmNvZGVzIHNob3VsZCBiZSBleHRlbmRlZD8gKi8KICAgICAgICAgICAgICAgIC8qIGV4dGVuZGVkIG11c3QgYmUgc2V0IGZvciBBTFRfUiwgQ1RSTF9SLAogICAgICAgICAgICAgICAgICAgSU5TLCBERUwsIEhPTUUsIEVORCwgUEFHRV9VUCwgUEFHRV9ET1dOLCBBUlJPVyBrZXlzLAogICAgICAgICAgICAgICAgICAga2V5cGFkIC8gYW5kIGtleXBhZCBFTlRFUiAoU0RLIDMuMSBWb2wuMyBwIDEzOCkgKi8KICAgICAgICAgICAgICAgIC8qIEZJWE1FIHNob3VsZCB3ZSBzZXQgZXh0ZW5kZWQgYml0IGZvciBOdW1Mb2NrID8gTXkKICAgICAgICAgICAgICAgICAqIFdpbmRvd3MgZG9lcyAuLi4gREYgKi8KICAgICAgICAgICAgICAgIC8qIFllcywgdG8gZGlzdGluZ3Vpc2ggYmFzZWQgb24gc2NhbiBjb2RlcywgYWxzbwogICAgICAgICAgICAgICAgICAgZm9yIFBydFNjbiBrZXkgLi4uIEdBICovCgpzdGF0aWMgY29uc3QgV09SRCBub25jaGFyX2tleV92a2V5WzI1Nl0gPQp7CiAgICAvKiB1bnVzZWQgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMDAgKi8KICAgIC8qIHNwZWNpYWwga2V5cyAqLwogICAgVktfQkFDSywgVktfVEFCLCAwLCBWS19DTEVBUiwgMCwgVktfUkVUVVJOLCAwLCAwLCAgICAgICAgICAgLyogRkYwOCAqLwogICAgMCwgMCwgMCwgVktfUEFVU0UsIFZLX1NDUk9MTCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgLyogRkYxMCAqLwogICAgMCwgMCwgMCwgVktfRVNDQVBFLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYxOCAqLwogICAgLyogdW51c2VkICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjIwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjI4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjMwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjM4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjQwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjQ4ICovCiAgICAvKiBjdXJzb3Iga2V5cyAqLwogICAgVktfSE9NRSwgVktfTEVGVCwgVktfVVAsIFZLX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY1MCAqLwogICAgVktfRE9XTiwgVktfUFJJT1IsIFZLX05FWFQsIFZLX0VORCwKICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNTggKi8KICAgIC8qIG1pc2Mga2V5cyAqLwogICAgVktfU0VMRUNULCBWS19TTkFQU0hPVCwgVktfRVhFQ1VURSwgVktfSU5TRVJULCAwLCAwLCAwLCAwLCAgLyogRkY2MCAqLwogICAgVktfQ0FOQ0VMLCBWS19IRUxQLCBWS19DQU5DRUwsIFZLX0NBTkNFTCwgMCwgMCwgMCwgMCwgICAgICAgLyogRkY2OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY3MCAqLwogICAgLyoga2V5cGFkIGtleXMgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIFZLX05VTUxPQ0ssICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNzggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGODAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIFZLX1JFVFVSTiwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGODggKi8KICAgIDAsIDAsIDAsIDAsIDAsIFZLX0hPTUUsIFZLX0xFRlQsIFZLX1VQLCAgICAgICAgICAgICAgICAgICAgIC8qIEZGOTAgKi8KICAgIFZLX1JJR0hULCBWS19ET1dOLCBWS19QUklPUiwgVktfTkVYVCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGOTggKi8KICAgIFZLX0VORCwgMCwgVktfSU5TRVJULCBWS19ERUxFVEUsCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkEwICovCiAgICAwLCAwLCBWS19NVUxUSVBMWSwgVktfQURELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkE4ICovCiAgICBWS19TRVBBUkFUT1IsIFZLX1NVQlRSQUNULCBWS19ERUNJTUFMLCBWS19ESVZJREUsCiAgICBWS19OVU1QQUQwLCBWS19OVU1QQUQxLCBWS19OVU1QQUQyLCBWS19OVU1QQUQzLCAgICAgICAgICAgICAvKiBGRkIwICovCiAgICBWS19OVU1QQUQ0LCBWS19OVU1QQUQ1LCBWS19OVU1QQUQ2LCBWS19OVU1QQUQ3LAogICAgVktfTlVNUEFEOCwgVktfTlVNUEFEOSwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZCOCAqLwogICAgLyogZnVuY3Rpb24ga2V5cyAqLwogICAgVktfRjEsIFZLX0YyLAogICAgVktfRjMsIFZLX0Y0LCBWS19GNSwgVktfRjYsIFZLX0Y3LCBWS19GOCwgVktfRjksIFZLX0YxMCwgICAgLyogRkZDMCAqLwogICAgVktfRjExLCBWS19GMTIsIFZLX0YxMywgVktfRjE0LCBWS19GMTUsIFZLX0YxNiwgMCwgMCwgICAgICAgLyogRkZDOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZEMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZEOCAqLwogICAgLyogbW9kaWZpZXIga2V5cyAqLwogICAgMCwgVktfU0hJRlQsIFZLX1NISUZULCBWS19DT05UUk9MLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZFMCAqLwogICAgVktfQ09OVFJPTCwgVktfQ0FQSVRBTCwgMCwgVktfTUVOVSwKICAgIFZLX01FTlUsIFZLX01FTlUsIFZLX01FTlUsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgIC8qIEZGRTggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRjAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIFZLX0RFTEVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRjggKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG5vbmNoYXJfa2V5X3NjYW5bMjU2XSA9CnsKICAgIC8qIHVudXNlZCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMDAgKi8KICAgIC8qIHNwZWNpYWwga2V5cyAqLwogICAgMHgwRSwgMHgwRiwgMHgwMCwgLyo/Ki8gMCwgMHgwMCwgMHgxQywgMHgwMCwgMHgwMCwgICAgICAgICAgIC8qIEZGMDggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDUsIDB4NDYsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjEwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYxOCAqLwogICAgLyogdW51c2VkICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYyMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMjggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjMwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYzOCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGNDAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjQ4ICovCiAgICAvKiBjdXJzb3Iga2V5cyAqLwogICAgMHgxNDcsIDB4MTRCLCAweDE0OCwgMHgxNEQsIDB4MTUwLCAweDE0OSwgMHgxNTEsIDB4MTRGLCAgICAgIC8qIEZGNTAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjU4ICovCiAgICAvKiBtaXNjIGtleXMgKi8KICAgIC8qPyovIDAsIDB4MTM3LCAvKj8qLyAwLCAweDE1MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAvKiBGRjYwICovCiAgICAvKj8qLyAwLCAvKj8qLyAwLCAweDM4LCAweDE0NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgLyogRkY2OCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGNzAgKi8KICAgIC8qIGtleXBhZCBrZXlzICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEzOCwgMHgxNDUsICAgICAgICAgICAgLyogRkY3OCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGODAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTFDLCAweDAwLCAweDAwLCAgICAgICAgICAgICAvKiBGRjg4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ3LCAweDRCLCAweDQ4LCAgICAgICAgICAgICAgLyogRkY5MCAqLwogICAgMHg0RCwgMHg1MCwgMHg0OSwgMHg1MSwgMHg0RiwgMHg0QywgMHg1MiwgMHg1MywgICAgICAgICAgICAgIC8qIEZGOTggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkEwICovCiAgICAweDAwLCAweDAwLCAweDM3LCAweDRFLCAvKj8qLyAwLCAweDRBLCAweDUzLCAweDEzNSwgICAgICAgICAgLyogRkZBOCAqLwogICAgMHg1MiwgMHg0RiwgMHg1MCwgMHg1MSwgMHg0QiwgMHg0QywgMHg0RCwgMHg0NywgICAgICAgICAgICAgIC8qIEZGQjAgKi8KICAgIDB4NDgsIDB4NDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkI4ICovCiAgICAvKiBmdW5jdGlvbiBrZXlzICovCiAgICAweDNCLCAweDNDLAogICAgMHgzRCwgMHgzRSwgMHgzRiwgMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgICAgICAgICAgICAgIC8qIEZGQzAgKi8KICAgIDB4NTcsIDB4NTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkM4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkZEMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGRDggKi8KICAgIC8qIG1vZGlmaWVyIGtleXMgKi8KICAgIDB4MDAsIDB4MkEsIDB4MzYsIDB4MUQsIDB4MTFELCAweDNBLCAweDAwLCAweDM4LCAgICAgICAgICAgICAvKiBGRkUwICovCiAgICAweDEzOCwgMHgzOCwgMHgxMzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgLyogRkZFOCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGRjAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTUzICAgICAgICAgICAgICAvKiBGRkY4ICovCn07CgoKLyogUmV0dXJucyB0aGUgV2luZG93cyB2aXJ0dWFsIGtleSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgWCBldmVudCA8ZT4gKi8KLyogeDExIGxvY2sgbXVzdCBiZSBoZWxkICovCnN0YXRpYyBXT1JEIEVWRU5UX2V2ZW50X3RvX3ZrZXkoIFhJQyB4aWMsIFhLZXlFdmVudCAqZSkKewogICAgS2V5U3ltIGtleXN5bSA9IDA7CgogICAgaWYgKHhpYykKICAgICAgICBYbWJMb29rdXBTdHJpbmcoeGljLCBlLCBOVUxMLCAwLCAma2V5c3ltLCBOVUxMKTsKICAgIGVsc2UKICAgICAgICBYTG9va3VwU3RyaW5nKGUsIE5VTEwsIDAsICZrZXlzeW0sIE5VTEwpOwoKICAgIGlmICgoa2V5c3ltID49IDB4RkZBRSkgJiYgKGtleXN5bSA8PSAweEZGQjkpICYmIChrZXlzeW0gIT0gMHhGRkFGKQoJJiYgKGUtPnN0YXRlICYgTnVtTG9ja01hc2spKQogICAgICAgIC8qIE9ubHkgdGhlIEtleXBhZCBrZXlzIDAtOSBhbmQgLiBzZW5kIGRpZmZlcmVudCBrZXlzeW1zCiAgICAgICAgICogZGVwZW5kaW5nIG9uIHRoZSBOdW1Mb2NrIHN0YXRlICovCiAgICAgICAgcmV0dXJuIG5vbmNoYXJfa2V5X3ZrZXlba2V5c3ltICYgMHhGRl07CgogICAgVFJBQ0VfKGtleSkoImUtPmtleWNvZGUgPSAleFxuIiwgZS0+a2V5Y29kZSk7CgogICAgcmV0dXJuIGtleWMydmtleVtlLT5rZXljb2RlXTsKfQoKc3RhdGljIEJPT0wgTnVtU3RhdGU9RkFMU0UsIENhcHNTdGF0ZT1GQUxTRTsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIHNlbmRfa2V5Ym9hcmRfaW5wdXQKICovCnN0YXRpYyB2b2lkIHNlbmRfa2V5Ym9hcmRfaW5wdXQoIFdPUkQgd1ZrLCBXT1JEIHdTY2FuLCBEV09SRCBkd0ZsYWdzLCBEV09SRCB0aW1lICkKewogICAgSU5QVVQgaW5wdXQ7CgogICAgaW5wdXQudHlwZSAgICAgICAgICAgICA9IFdJTkVfSU5URVJOQUxfSU5QVVRfS0VZQk9BUkQ7CiAgICBpbnB1dC51LmtpLndWayAgICAgICAgID0gd1ZrOwogICAgaW5wdXQudS5raS53U2NhbiAgICAgICA9IHdTY2FuOwogICAgaW5wdXQudS5raS5kd0ZsYWdzICAgICA9IGR3RmxhZ3M7CiAgICBpbnB1dC51LmtpLnRpbWUgICAgICAgID0gdGltZTsKICAgIGlucHV0LnUua2kuZHdFeHRyYUluZm8gPSAwOwogICAgU2VuZElucHV0KCAxLCAmaW5wdXQsIHNpemVvZihpbnB1dCkgKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlLRVlCT0FSRF9HZW5lcmF0ZU1zZwogKgogKiBHZW5lcmF0ZSBEb3duK1VwIG1lc3NhZ2VzIHdoZW4gTnVtTG9jayBvciBDYXBzTG9jayBpcyBwcmVzc2VkLgogKgogKiBDb252ZW50aW9uIDogY2FsbGVkIHdpdGggdmtleSBvbmx5IFZLX05VTUxPQ0sgb3IgVktfQ0FQSVRBTAogKgogKi8Kc3RhdGljIHZvaWQgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFdPUkQgdmtleSwgV09SRCBzY2FuLCBpbnQgRXZ0eXBlLCBEV09SRCBldmVudF90aW1lICkKewogIEJPT0wgKiBTdGF0ZSA9ICh2a2V5PT1WS19OVU1MT0NLPyAmTnVtU3RhdGUgOiAmQ2Fwc1N0YXRlKTsKICBEV09SRCB1cCwgZG93bjsKCiAgaWYgKCpTdGF0ZSkgewogICAgLyogVGhlIElOVEVSTUVESUFSWSBzdGF0ZSBtZWFucyA6IGp1c3QgYWZ0ZXIgYSAncHJlc3MnIGV2ZW50LCBpZiBhICdyZWxlYXNlJyBldmVudCBjb21lcywKICAgICAgIGRvbid0IHRyZWF0IGl0LiBJdCdzIGZyb20gdGhlIHNhbWUga2V5IHByZXNzLiBUaGVuIHRoZSBzdGF0ZSBnb2VzIHRvIE9OLgogICAgICAgQW5kIGZyb20gdGhlcmUsIGEgJ3JlbGVhc2UnIGV2ZW50IHdpbGwgc3dpdGNoIG9mZiB0aGUgdG9nZ2xlIGtleS4gKi8KICAgICpTdGF0ZT1GQUxTRTsKICAgIFRSQUNFKCJJTlRFUk0gOiBkb25cJ3QgdHJlYXQgcmVsZWFzZSBvZiB0b2dnbGUga2V5LiBJbnB1dEtleVN0YXRlVGFibGVbJSN4XSA9ICUjeFxuIix2a2V5LHBLZXlTdGF0ZVRhYmxlW3ZrZXldKTsKICB9IGVsc2UKICAgIHsKICAgICAgICBkb3duID0gKHZrZXk9PVZLX05VTUxPQ0sgPyBLRVlFVkVOVEZfRVhURU5ERURLRVkgOiAwKTsKICAgICAgICB1cCA9ICh2a2V5PT1WS19OVU1MT0NLID8gS0VZRVZFTlRGX0VYVEVOREVES0VZIDogMCkgfCBLRVlFVkVOVEZfS0VZVVA7CglpZiAoIHBLZXlTdGF0ZVRhYmxlW3ZrZXldICYgMHgxICkgLyogaXQgd2FzIE9OICovCgkgIHsKCSAgICBpZiAoRXZ0eXBlIT1LZXlQcmVzcykKCSAgICAgIHsKCQlUUkFDRSgiT04gKyBLZXlSZWxlYXNlID0+IGdlbmVyYXRpbmcgRE9XTiBhbmQgVVAgbWVzc2FnZXMuXG4iKTsKCSAgICAgICAgc2VuZF9rZXlib2FyZF9pbnB1dCggdmtleSwgc2NhbiwgZG93biwgZXZlbnRfdGltZSApOwoJICAgICAgICBzZW5kX2tleWJvYXJkX2lucHV0KCB2a2V5LCBzY2FuLCB1cCwgZXZlbnRfdGltZSApOwoJCSpTdGF0ZT1GQUxTRTsKCQlwS2V5U3RhdGVUYWJsZVt2a2V5XSAmPSB+MHgwMTsgLyogVG9nZ2xlIHN0YXRlIHRvIG9mZi4gKi8KCSAgICAgIH0KCSAgfQoJZWxzZSAvKiBpdCB3YXMgT0ZGICovCgkgIGlmIChFdnR5cGU9PUtleVByZXNzKQoJICAgIHsKCSAgICAgIFRSQUNFKCJPRkYgKyBLZXlwcmVzcyA9PiBnZW5lcmF0aW5nIERPV04gYW5kIFVQIG1lc3NhZ2VzLlxuIik7CgkgICAgICBzZW5kX2tleWJvYXJkX2lucHV0KCB2a2V5LCBzY2FuLCBkb3duLCBldmVudF90aW1lICk7CgkgICAgICBzZW5kX2tleWJvYXJkX2lucHV0KCB2a2V5LCBzY2FuLCB1cCwgZXZlbnRfdGltZSApOwoJICAgICAgKlN0YXRlPVRSVUU7IC8qIEdvZXMgdG8gaW50ZXJtZWRpYXJ5IHN0YXRlIGJlZm9yZSBnb2luZyB0byBPTiAqLwoJICAgICAgcEtleVN0YXRlVGFibGVbdmtleV0gfD0gMHgwMTsgLyogVG9nZ2xlIHN0YXRlIHRvIG9uLiAqLwoJICAgIH0KICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBLRVlCT0FSRF9VcGRhdGVPbmVTdGF0ZQogKgogKiBVcGRhdGVzIGludGVybmFsIHN0YXRlIGZvciA8dmtleT4sIGRlcGVuZGluZyBvbiBrZXkgPHN0YXRlPiB1bmRlciBYCiAqCiAqLwppbmxpbmUgc3RhdGljIHZvaWQgS0VZQk9BUkRfVXBkYXRlT25lU3RhdGUgKCBpbnQgdmtleSwgaW50IHN0YXRlLCBEV09SRCB0aW1lICkKewogICAgLyogRG8gc29tZXRoaW5nIGlmIGludGVybmFsIHRhYmxlIHN0YXRlICE9IFggc3RhdGUgZm9yIGtleWNvZGUgKi8KICAgIGlmICgoKHBLZXlTdGF0ZVRhYmxlW3ZrZXldICYgMHg4MCkhPTApICE9IHN0YXRlKQogICAgewogICAgICAgIFRSQUNFKCJBZGp1c3Rpbmcgc3RhdGUgZm9yIHZrZXkgJSMuMnguIFN0YXRlIGJlZm9yZSAlIy4yeFxuIiwKICAgICAgICAgICAgICB2a2V5LCBwS2V5U3RhdGVUYWJsZVt2a2V5XSk7CgogICAgICAgIC8qIEZha2Uga2V5IGJlaW5nIHByZXNzZWQgaW5zaWRlIHdpbmUgKi8KICAgICAgICBzZW5kX2tleWJvYXJkX2lucHV0KCB2a2V5LCAwLCBzdGF0ZT8gMCA6IEtFWUVWRU5URl9LRVlVUCwgdGltZSApOwoKICAgICAgICBUUkFDRSgiU3RhdGUgYWZ0ZXIgJSMuMnhcbiIscEtleVN0YXRlVGFibGVbdmtleV0pOwogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFgxMURSVl9LZXltYXBOb3RpZnkKICoKICogVXBkYXRlIG1vZGlmaWVycyBzdGF0ZSAoQ3RybCwgQWx0LCBTaGlmdCkgd2hlbiB3aW5kb3cgaXMgYWN0aXZhdGVkLgogKgogKiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgb25lIHVzZXMgQ3RybCsuLi4gQWx0Ky4uLiBvciBTaGlmdCsuLiB0byBzd2l0Y2gKICogZnJvbSB3aW5lIHRvIGFub3RoZXIgYXBwbGljYXRpb24gYW5kIGJhY2suCiAqIFRvZ2dsZSBrZXlzIGFyZSBoYW5kbGVkIGluIEhhbmRsZUV2ZW50LgogKi8Kdm9pZCBYMTFEUlZfS2V5bWFwTm90aWZ5KCBIV05EIGh3bmQsIFhLZXltYXBFdmVudCAqZXZlbnQgKQp7CiAgICBpbnQgaSwgaiwgYWx0LCBjb250cm9sLCBzaGlmdDsKICAgIERXT1JEIHRpbWUgPSBHZXRDdXJyZW50VGltZSgpOwoKICAgIGFsdCA9IGNvbnRyb2wgPSBzaGlmdCA9IDA7CiAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKICAgIHsKICAgICAgICBpZiAoIWV2ZW50LT5rZXlfdmVjdG9yW2ldKSBjb250aW51ZTsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCEoZXZlbnQtPmtleV92ZWN0b3JbaV0gJiAoMTw8aikpKSBjb250aW51ZTsKICAgICAgICAgICAgc3dpdGNoKGtleWMydmtleVsoaSAqIDgpICsgal0gJiAweGZmKQogICAgICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgVktfTUVOVTogICAgYWx0ID0gMTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgVktfQ09OVFJPTDogY29udHJvbCA9IDE7IGJyZWFrOwogICAgICAgICAgICBjYXNlIFZLX1NISUZUOiAgIHNoaWZ0ID0gMTsgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBLRVlCT0FSRF9VcGRhdGVPbmVTdGF0ZSggVktfTUVOVSwgYWx0LCB0aW1lICk7CiAgICBLRVlCT0FSRF9VcGRhdGVPbmVTdGF0ZSggVktfQ09OVFJPTCwgY29udHJvbCwgdGltZSApOwogICAgS0VZQk9BUkRfVXBkYXRlT25lU3RhdGUoIFZLX1NISUZULCBzaGlmdCwgdGltZSApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFgxMURSVl9LZXlFdmVudAogKgogKiBIYW5kbGUgYSBYIGtleSBldmVudAogKi8Kdm9pZCBYMTFEUlZfS2V5RXZlbnQoIEhXTkQgaHduZCwgWEtleUV2ZW50ICpldmVudCApCnsKICAgIGNoYXIgU3RyWzI0XTsKICAgIEtleVN5bSBrZXlzeW0gPSAwOwogICAgV09SRCB2a2V5ID0gMCwgYlNjYW47CiAgICBEV09SRCBkd0ZsYWdzOwogICAgaW50IGFzY2lpX2NoYXJzOwogICAgWElDIHhpYyA9IFgxMURSVl9nZXRfaWMoIGh3bmQgKTsKICAgIERXT1JEIGV2ZW50X3RpbWUgPSBldmVudC0+dGltZSAtIFgxMURSVl9zZXJ2ZXJfc3RhcnR0aWNrczsKICAgIFN0YXR1cyBzdGF0dXMgPSAwOwoKICAgIFRSQUNFXyhrZXkpKCJ0eXBlICVkLCB3aW5kb3cgJWx4LCBzdGF0ZSAweCUwNHgsIGtleWNvZGUgMHglMDR4XG4iLAoJCWV2ZW50LT50eXBlLCBldmVudC0+d2luZG93LCBldmVudC0+c3RhdGUsIGV2ZW50LT5rZXljb2RlKTsKCiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIGlmICh4aWMpCiAgICAgICAgYXNjaWlfY2hhcnMgPSBYbWJMb29rdXBTdHJpbmcoeGljLCBldmVudCwgU3RyLCBzaXplb2YoU3RyKSwgJmtleXN5bSwgJnN0YXR1cyk7CiAgICBlbHNlCiAgICAgICAgYXNjaWlfY2hhcnMgPSBYTG9va3VwU3RyaW5nKGV2ZW50LCBTdHIsIHNpemVvZihTdHIpLCAma2V5c3ltLCBOVUxMKTsKICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CgogICAgLyogSWdub3JlIHNvbWUgdW53YW50ZWQgZXZlbnRzICovCiAgICBpZiAoKGtleXN5bSA+PSBYS19JU09fTG9jayAmJiBrZXlzeW0gPD0gWEtfSVNPX0xhc3RfR3JvdXBfTG9jaykgfHwKICAgICAgICAga2V5c3ltID09IFhLX01vZGVfc3dpdGNoKQogICAgewogICAgICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgICAgIFRSQUNFKCJJZ25vcmluZyAlcyBrZXlib2FyZCBldmVudFxuIiwgWEtleXN5bVRvU3RyaW5nKGtleXN5bSkpOwogICAgICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIFRSQUNFXyhrZXkpKCJzdGF0ZSA9ICVYIG5ieXRlID0gJWQsIHN0YXR1cyAweCV4XG4iLCBldmVudC0+c3RhdGUsIGFzY2lpX2NoYXJzLCBzdGF0dXMpOwoKICAgIGlmIChzdGF0dXMgPT0gWEJ1ZmZlck92ZXJmbG93KQogICAgICAgIEVSUigiQnVmZmVyIE92ZXJmbG93IG5lZWQgJWkhXG4iLGFzY2lpX2NoYXJzKTsKCiAgICBpZiAoc3RhdHVzID09IFhMb29rdXBDaGFycykKICAgIHsKICAgICAgICBYMTFEUlZfWElNTG9va3VwQ2hhcnMoIFN0ciwgYXNjaWlfY2hhcnMgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogSWYgWEtCIGV4dGVuc2lvbnMgYXJlIHVzZWQsIHRoZSBzdGF0ZSBtYXNrIGZvciBBbHRHciB3aWxsIHVzZSB0aGUgZ3JvdXAKICAgICAgIGluZGV4IGluc3RlYWQgb2YgdGhlIG1vZGlmaWVyIG1hc2suIFRoZSBncm91cCBpbmRleCBpcyBzZXQgaW4gYml0cwogICAgICAgMTMtMTQgb2YgdGhlIHN0YXRlIGZpZWxkIGluIHRoZSBYS2V5RXZlbnQgc3RydWN0dXJlLiBTbyBpZiBBbHRHciBpcwogICAgICAgcHJlc3NlZCwgbG9vayBpZiB0aGUgZ3JvdXAgaW5kZXggaXMgZGlmZmVyZW50IHRoYW4gMC4gRnJvbSBYS0IKICAgICAgIGV4dGVuc2lvbiBkb2N1bWVudGF0aW9uLCB0aGUgZ3JvdXAgaW5kZXggZm9yIEFsdEdyIHNob3VsZCBiZSAyCiAgICAgICAoZXZlbnQtPnN0YXRlID0gMHgyMDAwKS4gSXQncyBwcm9iYWJseSBiZXR0ZXIgdG8gbm90IGFzc3VtZSBhCiAgICAgICBwcmVkZWZpbmVkIGdyb3VwIGluZGV4IGFuZCBmaW5kIGl0IGR5bmFtaWNhbGx5CgogICAgICAgUmVmOiBYIEtleWJvYXJkIEV4dGVuc2lvbjogTGlicmFyeSBzcGVjaWZpY2F0aW9uIChzZWN0aW9uIDE0LjEuMSBhbmQgMTcuMS4xKSAqLwogICAgLyogU2F2ZSBhbHNvIGFsbCBwb3NzaWJsZSBtb2RpZmllciBzdGF0ZXMuICovCiAgICBBbHRHck1hc2sgPSBldmVudC0+c3RhdGUgJiAoMHg2MDAwIHwgTW9kMU1hc2sgfCBNb2QyTWFzayB8IE1vZDNNYXNrIHwgTW9kNE1hc2sgfCBNb2Q1TWFzayk7CgogICAgU3RyW2FzY2lpX2NoYXJzXSA9ICdcMCc7CiAgICBpZiAoVFJBQ0VfT04oa2V5KSl7CgljaGFyCSprc25hbWU7CgogICAgICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgICAgIGtzbmFtZSA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwogICAgICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CglpZiAoIWtzbmFtZSkKCSAga3NuYW1lID0gIk5vIE5hbWUiOwoJVFJBQ0VfKGtleSkoIiVzIDoga2V5c3ltPSVsWCAoJXMpLCAjIG9mIGNoYXJzPSVkIC8gMHglMDJ4IC8gJyVzJ1xuIiwKICAgICAgICAgICAgICAgICAgICAoZXZlbnQtPnR5cGUgPT0gS2V5UHJlc3MpID8gIktleVByZXNzIiA6ICJLZXlSZWxlYXNlIiwKICAgICAgICAgICAgICAgICAgICBrZXlzeW0sIGtzbmFtZSwgYXNjaWlfY2hhcnMsIFN0clswXSAmIDB4ZmYsIFN0cik7CiAgICB9CgogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICB2a2V5ID0gRVZFTlRfZXZlbnRfdG9fdmtleSh4aWMsZXZlbnQpOwogICAgLyogWCByZXR1cm5zIGtleWNvZGUgMCBmb3IgY29tcG9zZWQgY2hhcmFjdGVycyAqLwogICAgaWYgKCF2a2V5ICYmIGFzY2lpX2NoYXJzKSB2a2V5ID0gVktfTk9OQU1FOwogICAgd2luZV90c3gxMV91bmxvY2soKTsKCiAgICBUUkFDRV8oa2V5KSgia2V5Y29kZSAweCV4IGNvbnZlcnRlZCB0byB2a2V5IDB4JXhcbiIsCiAgICAgICAgICAgICAgICBldmVudC0+a2V5Y29kZSwgdmtleSk7CgogICBpZiAodmtleSkKICAgewogICAgc3dpdGNoICh2a2V5ICYgMHhmZikKICAgIHsKICAgIGNhc2UgVktfTlVNTE9DSzoKICAgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX05VTUxPQ0ssIDB4NDUsIGV2ZW50LT50eXBlLCBldmVudF90aW1lICk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBWS19DQVBJVEFMOgogICAgICBUUkFDRSgiQ2FwcyBMb2NrIGV2ZW50LiAodHlwZSAlZCkuIFN0YXRlIGJlZm9yZSA6ICUjLjJ4XG4iLGV2ZW50LT50eXBlLHBLZXlTdGF0ZVRhYmxlW3ZrZXldKTsKICAgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX0NBUElUQUwsIDB4M0EsIGV2ZW50LT50eXBlLCBldmVudF90aW1lICk7CiAgICAgIFRSQUNFKCJTdGF0ZSBhZnRlciA6ICUjLjJ4XG4iLHBLZXlTdGF0ZVRhYmxlW3ZrZXldKTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIC8qIEFkanVzdCB0aGUgTlVNTE9DSyBzdGF0ZSBpZiBpdCBoYXMgYmVlbiBjaGFuZ2VkIG91dHNpZGUgd2luZSAqLwoJaWYgKCEocEtleVN0YXRlVGFibGVbVktfTlVNTE9DS10gJiAweDAxKSAhPSAhKGV2ZW50LT5zdGF0ZSAmIE51bUxvY2tNYXNrKSkKCSAgewoJICAgIFRSQUNFKCJBZGp1c3RpbmcgTnVtTG9jayBzdGF0ZS5cbiIpOwoJICAgIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBWS19OVU1MT0NLLCAweDQ1LCBLZXlQcmVzcywgZXZlbnRfdGltZSApOwoJICAgIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBWS19OVU1MT0NLLCAweDQ1LCBLZXlSZWxlYXNlLCBldmVudF90aW1lICk7CgkgIH0KICAgICAgICAvKiBBZGp1c3QgdGhlIENBUFNMT0NLIHN0YXRlIGlmIGl0IGhhcyBiZWVuIGNoYW5nZWQgb3V0c2lkZSB3aW5lICovCglpZiAoIShwS2V5U3RhdGVUYWJsZVtWS19DQVBJVEFMXSAmIDB4MDEpICE9ICEoZXZlbnQtPnN0YXRlICYgTG9ja01hc2spKQoJICB7CiAgICAgICAgICAgICAgVFJBQ0UoIkFkanVzdGluZyBDYXBzIExvY2sgc3RhdGUuXG4iKTsKCSAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfQ0FQSVRBTCwgMHgzQSwgS2V5UHJlc3MsIGV2ZW50X3RpbWUgKTsKCSAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfQ0FQSVRBTCwgMHgzQSwgS2V5UmVsZWFzZSwgZXZlbnRfdGltZSApOwoJICB9CgkvKiBOb3QgTnVtIG5vciBDYXBzIDogZW5kIG9mIGludGVybWVkaWFyeSBzdGF0ZXMgZm9yIGJvdGguICovCglOdW1TdGF0ZSA9IEZBTFNFOwoJQ2Fwc1N0YXRlID0gRkFMU0U7CgoJYlNjYW4gPSBrZXljMnNjYW5bZXZlbnQtPmtleWNvZGVdICYgMHhGRjsKCVRSQUNFXyhrZXkpKCJiU2NhbiA9IDB4JTAyeC5cbiIsIGJTY2FuKTsKCglkd0ZsYWdzID0gMDsKCWlmICggZXZlbnQtPnR5cGUgPT0gS2V5UmVsZWFzZSApIGR3RmxhZ3MgfD0gS0VZRVZFTlRGX0tFWVVQOwoJaWYgKCB2a2V5ICYgMHgxMDAgKSAgICAgICAgICAgICAgZHdGbGFncyB8PSBLRVlFVkVOVEZfRVhURU5ERURLRVk7CgogICAgICAgIHNlbmRfa2V5Ym9hcmRfaW5wdXQoIHZrZXkgJiAweGZmLCBiU2NhbiwgZHdGbGFncywgZXZlbnRfdGltZSApOwogICAgfQogICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlYMTFEUlZfS0VZQk9BUkRfRGV0ZWN0TGF5b3V0CiAqCiAqIENhbGxlZCBmcm9tIFgxMURSVl9Jbml0S2V5Ym9hcmQKICogIFRoaXMgcm91dGluZSB3YWxrcyB0aHJvdWdoIHRoZSBkZWZpbmVkIGtleWJvYXJkIGxheW91dHMgYW5kIHNlbGVjdHMKICogIHdoaWNoZXZlciBtYXRjaGVzIG1vc3QgY2xvc2VseS4KICogWDExIGxvY2sgbXVzdCBiZSBoZWxkLgogKi8Kc3RhdGljIHZvaWQKWDExRFJWX0tFWUJPQVJEX0RldGVjdExheW91dCAodm9pZCkKewogIERpc3BsYXkgKmRpc3BsYXkgPSB0aHJlYWRfZGlzcGxheSgpOwogIHVuc2lnbmVkIGN1cnJlbnQsIG1hdGNoLCBtaXNtYXRjaCwgc2VxLCBpLCBzeW1zOwogIGludCBzY29yZSwga2V5Yywga2V5LCBwa2V5LCBvazsKICBLZXlTeW0ga2V5c3ltOwogIGNvbnN0IGNoYXIgKCpsa2V5KVtNQUlOX0xFTl1bNF07CiAgdW5zaWduZWQgbWF4X3NlcSA9IDA7CiAgaW50IG1heF9zY29yZSA9IDAsIGlzbWF0Y2ggPSAwOwogIGNoYXIgY2tleVs0XSA9CiAgezAsIDAsIDAsIDB9OwoKICBzeW1zID0ga2V5c3ltc19wZXJfa2V5Y29kZTsKICBpZiAoc3ltcyA+IDQpIHsKICAgIFdBUk4oIiVkIGtleXN5bXMgcGVyIGtleWNvZGUgbm90IHN1cHBvcnRlZCwgc2V0IHRvIDRcbiIsIHN5bXMpOwogICAgc3ltcyA9IDQ7CiAgfQogIGZvciAoY3VycmVudCA9IDA7IG1haW5fa2V5X3RhYltjdXJyZW50XS5jb21tZW50OyBjdXJyZW50KyspIHsKICAgIFRSQUNFKCJBdHRlbXB0aW5nIHRvIG1hdGNoIGFnYWluc3QgXCIlc1wiXG4iLCBtYWluX2tleV90YWJbY3VycmVudF0uY29tbWVudCk7CiAgICBtYXRjaCA9IDA7CiAgICBtaXNtYXRjaCA9IDA7CiAgICBzY29yZSA9IDA7CiAgICBzZXEgPSAwOwogICAgbGtleSA9IG1haW5fa2V5X3RhYltjdXJyZW50XS5rZXk7CiAgICBwa2V5ID0gLTE7CiAgICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKSB7CiAgICAgIC8qIGdldCBkYXRhIGZvciBrZXljb2RlIGZyb20gWCBzZXJ2ZXIgKi8KICAgICAgZm9yIChpID0gMDsgaSA8IHN5bXM7IGkrKykgewoJa2V5c3ltID0gWEtleWNvZGVUb0tleXN5bSAoZGlzcGxheSwga2V5YywgaSk7CgkvKiBBbGxvdyBib3RoIG9uZS1ieXRlIGFuZCB0d28tYnl0ZSBuYXRpb25hbCBrZXlzeW1zICovCglpZiAoKGtleXN5bSA8IDB4ODAwMCkgJiYgKGtleXN5bSAhPSAnICcpKQogICAgICAgIHsKI2lmZGVmIEhBVkVfWEtCCiAgICAgICAgICAgIGlmICghdXNlX3hrYiB8fCAhWGtiVHJhbnNsYXRlS2V5U3ltKGRpc3BsYXksICZrZXlzeW0sIDAsICZja2V5W2ldLCAxLCBOVUxMKSkKI2VuZGlmCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRSQUNFKCJYS0IgY291bGQgbm90IHRyYW5zbGF0ZSBrZXlzeW0gJWxkXG4iLCBrZXlzeW0pOwogICAgICAgICAgICAgICAgLyogRklYTUU6IHF1ZXJ5IHdoYXQga2V5c3ltIGlzIHVzZWQgYXMgTW9kZV9zd2l0Y2gsIGZpbGwgWEtleUV2ZW50CiAgICAgICAgICAgICAgICAgKiB3aXRoIGFwcHJvcHJpYXRlIFNoaWZ0TWFzayBhbmQgTW9kZV9zd2l0Y2gsIHVzZSBYTG9va3VwU3RyaW5nCiAgICAgICAgICAgICAgICAgKiB0byBnZXQgY2hhcmFjdGVyIGluIHRoZSBsb2NhbCBlbmNvZGluZy4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgY2tleVtpXSA9IGtleXN5bSAmIDB4RkY7CiAgICAgICAgICAgIH0KICAgICAgICB9CgllbHNlIHsKCSAgY2tleVtpXSA9IEtFWUJPQVJEX01hcERlYWRLZXlzeW0oa2V5c3ltKTsKCX0KICAgICAgfQogICAgICBpZiAoY2tleVswXSkgewoJLyogc2VhcmNoIGZvciBhIG1hdGNoIGluIGxheW91dCB0YWJsZSAqLwoJLyogcmlnaHQgbm93LCB3ZSBqdXN0IGZpbmQgYW4gYWJzb2x1dGUgbWF0Y2ggZm9yIGRlZmluZWQgcG9zaXRpb25zICovCgkvKiAodW5kZWZpbmVkIHBvc2l0aW9ucyBhcmUgaWdub3JlZCwgc28gaWYgaXQncyBkZWZpbmVkIGFzICIzIyIgaW4gKi8KCS8qIHRoZSB0YWJsZSwgaXQncyBva2F5IHRoYXQgdGhlIFggc2VydmVyIGhhcyAiMyOjIiwgZm9yIGV4YW1wbGUpICovCgkvKiBob3dldmVyLCB0aGUgc2NvcmUgd2lsbCBiZSBoaWdoZXIgZm9yIGxvbmdlciBtYXRjaGVzICovCglmb3IgKGtleSA9IDA7IGtleSA8IE1BSU5fTEVOOyBrZXkrKykgewoJICBmb3IgKG9rID0gMCwgaSA9IDA7IChvayA+PSAwKSAmJiAoaSA8IHN5bXMpOyBpKyspIHsKCSAgICBpZiAoKCpsa2V5KVtrZXldW2ldICYmICgoKmxrZXkpW2tleV1baV0gPT0gY2tleVtpXSkpCgkgICAgICBvaysrOwoJICAgIGlmICgoKmxrZXkpW2tleV1baV0gJiYgKCgqbGtleSlba2V5XVtpXSAhPSBja2V5W2ldKSkKCSAgICAgIG9rID0gLTE7CgkgIH0KCSAgaWYgKG9rID4gMCkgewoJICAgIHNjb3JlICs9IG9rOwoJICAgIGJyZWFrOwoJICB9Cgl9CgkvKiBjb3VudCB0aGUgbWF0Y2hlcyBhbmQgbWlzbWF0Y2hlcyAqLwoJaWYgKG9rID4gMCkgewoJICBtYXRjaCsrOwoJICAvKiBhbmQgaG93IG11Y2ggdGhlIGtleWNvZGUgb3JkZXIgbWF0Y2hlcyAqLwoJICBpZiAoa2V5ID4gcGtleSkgc2VxKys7CgkgIHBrZXkgPSBrZXk7Cgl9IGVsc2UgewogICAgICAgICAgLyogcHJpbnQgc3BhY2VzIGluc3RlYWQgb2YgXDAncyAqLwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihja2V5KTsgaSsrKSBpZiAoIWNrZXlbaV0pIGNrZXlbaV0gPSAnICc7CiAgICAgICAgICBUUkFDRV8oa2V5KSgibWlzbWF0Y2ggZm9yIGtleXN5bSAweCUwNGxYLCBrZXljb2RlICVkLCBnb3QgJWMlYyVjJWNcbiIsCiAgICAgICAgICAgICAgICAgICAgICBrZXlzeW0sIGtleWMsIGNrZXlbMF0sIGNrZXlbMV0sIGNrZXlbMl0sIGNrZXlbM10pOwoJICBtaXNtYXRjaCsrOwoJICBzY29yZSAtPSBzeW1zOwoJfQogICAgICB9CiAgICB9CiAgICBUUkFDRSgibWF0Y2hlcz0lZCwgbWlzbWF0Y2hlcz0lZCwgc2VxPSVkLCBzY29yZT0lZFxuIiwKCSAgIG1hdGNoLCBtaXNtYXRjaCwgc2VxLCBzY29yZSk7CiAgICBpZiAoKHNjb3JlID4gbWF4X3Njb3JlKSB8fAoJKChzY29yZSA9PSBtYXhfc2NvcmUpICYmIChzZXEgPiBtYXhfc2VxKSkpIHsKICAgICAgLyogYmVzdCBtYXRjaCBzbyBmYXIgKi8KICAgICAga2JkX2xheW91dCA9IGN1cnJlbnQ7CiAgICAgIG1heF9zY29yZSA9IHNjb3JlOwogICAgICBtYXhfc2VxID0gc2VxOwogICAgICBpc21hdGNoID0gIW1pc21hdGNoOwogICAgfQogIH0KICAvKiB3ZSdyZSBkb25lLCByZXBvcnQgcmVzdWx0cyBpZiBuZWNlc3NhcnkgKi8KICBpZiAoIWlzbWF0Y2gpCiAgICBXQVJOKCJVc2luZyBjbG9zZXN0IG1hdGNoICglcykgZm9yIHNjYW4vdmlydHVhbCBjb2RlcyBtYXBwaW5nLlxuIiwKICAgICAgICBtYWluX2tleV90YWJba2JkX2xheW91dF0uY29tbWVudCk7CgogIFRSQUNFKCJkZXRlY3RlZCBsYXlvdXQgaXMgXCIlc1wiXG4iLCBtYWluX2tleV90YWJba2JkX2xheW91dF0uY29tbWVudCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJbml0S2V5Ym9hcmQgKFgxMURSVi5AKQogKi8Kdm9pZCBYMTFEUlZfSW5pdEtleWJvYXJkKCBCWVRFICprZXlfc3RhdGVfdGFibGUgKQp7CiAgICBEaXNwbGF5ICpkaXNwbGF5ID0gdGhyZWFkX2Rpc3BsYXkoKTsKICAgIEtleVN5bSAqa3NwOwogICAgWE1vZGlmaWVyS2V5bWFwICptbXA7CiAgICBLZXlTeW0ga2V5c3ltOwogICAgS2V5Q29kZSAqa2NwOwogICAgWEtleUV2ZW50IGUyOwogICAgV09SRCBzY2FuLCB2a2V5LCBPRU12a2V5OwogICAgaW50IGtleWMsIGksIGtleW4sIHN5bXM7CiAgICBjaGFyIGNrZXlbNF09ezAsMCwwLDB9OwogICAgY29uc3QgY2hhciAoKmxrZXkpW01BSU5fTEVOXVs0XTsKCiAgICBwS2V5U3RhdGVUYWJsZSA9IGtleV9zdGF0ZV90YWJsZTsKCiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIFhEaXNwbGF5S2V5Y29kZXMoZGlzcGxheSwgJm1pbl9rZXljb2RlLCAmbWF4X2tleWNvZGUpOwogICAga3NwID0gWEdldEtleWJvYXJkTWFwcGluZyhkaXNwbGF5LCBtaW5fa2V5Y29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2tleWNvZGUgKyAxIC0gbWluX2tleWNvZGUsICZrZXlzeW1zX3Blcl9rZXljb2RlKTsKICAgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4ga2V5c3ltc19wZXJfa2V5Y29kZS4KICAgICAgIFRoZXJlIGlzIG5vIG5lZWQgdG8gaG9sZCBhIGxvY2FsIGNvcHkgb2YgdGhlIGtleXN5bXMgdGFibGUgKi8KICAgIFhGcmVlKGtzcCk7CgogICAgbW1wID0gWEdldE1vZGlmaWVyTWFwcGluZyhkaXNwbGF5KTsKICAgIGtjcCA9IG1tcC0+bW9kaWZpZXJtYXA7CiAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSArPSAxKSAvKiBUaGVyZSBhcmUgOCBtb2RpZmllciBrZXlzICovCiAgICB7CiAgICAgICAgaW50IGo7CgogICAgICAgIGZvciAoaiA9IDA7IGogPCBtbXAtPm1heF9rZXlwZXJtb2Q7IGogKz0gMSwga2NwICs9IDEpCgkgICAgaWYgKCprY3ApCiAgICAgICAgICAgIHsKCQlpbnQgazsKCgkJZm9yIChrID0gMDsgayA8IGtleXN5bXNfcGVyX2tleWNvZGU7IGsgKz0gMSkKICAgICAgICAgICAgICAgICAgICBpZiAoWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCAqa2NwLCBrKSA9PSBYS19OdW1fTG9jaykKCQkgICAgewogICAgICAgICAgICAgICAgICAgICAgICBOdW1Mb2NrTWFzayA9IDEgPDwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGtleSkoIk51bUxvY2tNYXNrIGlzICV4XG4iLCBOdW1Mb2NrTWFzayk7CgkJICAgIH0KICAgICAgICAgICAgfQogICAgfQogICAgWEZyZWVNb2RpZmllcm1hcChtbXApOwoKICAgIC8qIERldGVjdCB0aGUga2V5Ym9hcmQgbGF5b3V0ICovCiAgICBYMTFEUlZfS0VZQk9BUkRfRGV0ZWN0TGF5b3V0KCk7CiAgICBsa2V5ID0gbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLmtleTsKICAgIHN5bXMgPSAoa2V5c3ltc19wZXJfa2V5Y29kZSA+IDQpID8gNCA6IGtleXN5bXNfcGVyX2tleWNvZGU7CgogICAgLyogTm93IGJ1aWxkIHR3byBjb252ZXJzaW9uIGFycmF5cyA6CiAgICAgKiBrZXljb2RlIC0+IHZrZXkgKyBzY2FuY29kZSArIGV4dGVuZGVkCiAgICAgKiB2a2V5ICsgZXh0ZW5kZWQgLT4ga2V5Y29kZSAqLwoKICAgIGUyLmRpc3BsYXkgPSBkaXNwbGF5OwogICAgZTIuc3RhdGUgPSAwOwoKICAgIE9FTXZrZXkgPSBWS19PRU1fODsgLyogbmV4dCBpcyBhdmFpbGFibGUuICAqLwogICAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykKICAgIHsKICAgICAgICBjaGFyIGJ1ZlszMF07CiAgICAgICAgaW50IGhhdmVfY2hhcnM7CgogICAgICAgIGtleXN5bSA9IDA7CiAgICAgICAgZTIua2V5Y29kZSA9IChLZXlDb2RlKWtleWM7CiAgICAgICAgaGF2ZV9jaGFycyA9IFhMb29rdXBTdHJpbmcoJmUyLCBidWYsIHNpemVvZihidWYpLCAma2V5c3ltLCBOVUxMKTsKICAgICAgICB2a2V5ID0gMDsgc2NhbiA9IDA7CiAgICAgICAgaWYgKGtleXN5bSkgIC8qIG90aGVyd2lzZSwga2V5Y29kZSBub3QgdXNlZCAqLwogICAgICAgIHsKICAgICAgICAgICAgaWYgKChrZXlzeW0gPj4gOCkgPT0gMHhGRikgICAgICAgICAvKiBub24tY2hhcmFjdGVyIGtleSAqLwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2a2V5ID0gbm9uY2hhcl9rZXlfdmtleVtrZXlzeW0gJiAweGZmXTsKICAgICAgICAgICAgICAgIHNjYW4gPSBub25jaGFyX2tleV9zY2FuW2tleXN5bSAmIDB4ZmZdOwoJCS8qIHNldCBleHRlbmRlZCBiaXQgd2hlbiBuZWNlc3NhcnkgKi8KCQlpZiAoc2NhbiAmIDB4MTAwKSB2a2V5IHw9IDB4MTAwOwogICAgICAgICAgICB9IGVsc2UgaWYgKGtleXN5bSA9PSAweDIwKSB7ICAgICAgICAgICAgICAgICAvKiBTcGFjZWJhciAqLwoJICAgICAgICB2a2V5ID0gVktfU1BBQ0U7CgkJc2NhbiA9IDB4Mzk7CgkgICAgfSBlbHNlIGlmIChoYXZlX2NoYXJzKSB7CgkgICAgICAvKiB3ZSBzZWVtIHRvIG5lZWQgdG8gc2VhcmNoIHRoZSBsYXlvdXQtZGVwZW5kZW50IHNjYW5jb2RlcyAqLwoJICAgICAgaW50IG1heGxlbj0wLG1heHZhbD0tMSxvazsKCSAgICAgIGZvciAoaT0wOyBpPHN5bXM7IGkrKykgewoJCWtleXN5bSA9IFhLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwga2V5YywgaSk7CgkJaWYgKChrZXlzeW08MHg4MDAwKSAmJiAoa2V5c3ltIT0nICcpKQogICAgICAgICAgICAgICAgewojaWZkZWYgSEFWRV9YS0IKICAgICAgICAgICAgICAgICAgICBpZiAoIXVzZV94a2IgfHwgIVhrYlRyYW5zbGF0ZUtleVN5bShkaXNwbGF5LCAma2V5c3ltLCAwLCAmY2tleVtpXSwgMSwgTlVMTCkpCiNlbmRpZgogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogRklYTUU6IHF1ZXJ5IHdoYXQga2V5c3ltIGlzIHVzZWQgYXMgTW9kZV9zd2l0Y2gsIGZpbGwgWEtleUV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAqIHdpdGggYXBwcm9wcmlhdGUgU2hpZnRNYXNrIGFuZCBNb2RlX3N3aXRjaCwgdXNlIFhMb29rdXBTdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICogdG8gZ2V0IGNoYXJhY3RlciBpbiB0aGUgbG9jYWwgZW5jb2RpbmcuCiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICBja2V5W2ldID0ga2V5c3ltICYgMHhGRjsKICAgICAgICAgICAgICAgICAgICB9CgkJfSBlbHNlIHsKCQkgIGNrZXlbaV0gPSBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKGtleXN5bSk7CgkJfQoJICAgICAgfQoJICAgICAgLyogZmluZCBrZXkgd2l0aCBsb25nZXN0IG1hdGNoIHN0cmVhayAqLwoJICAgICAgZm9yIChrZXluPTA7IGtleW48TUFJTl9MRU47IGtleW4rKykgewoJCWZvciAob2s9KCpsa2V5KVtrZXluXVtpPTBdOyBvayYmKGk8NCk7IGkrKykKCQkgIGlmICgoKmxrZXkpW2tleW5dW2ldICYmICgqbGtleSlba2V5bl1baV0hPWNrZXlbaV0pIG9rPTA7CgkJaWYgKG9rfHwoaT5tYXhsZW4pKSB7CgkJICBtYXhsZW49aTsgbWF4dmFsPWtleW47CgkJfQoJCWlmIChvaykgYnJlYWs7CgkgICAgICB9CgkgICAgICBpZiAobWF4dmFsPj0wKSB7CgkJLyogZ290IGl0ICovCgkJY29uc3QgV09SRCAoKmxzY2FuKVtNQUlOX0xFTl0gPSBtYWluX2tleV90YWJba2JkX2xheW91dF0uc2NhbjsKCQljb25zdCBXT1JEICgqbHZrZXkpW01BSU5fTEVOXSA9IG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS52a2V5OwoJCXNjYW4gPSAoKmxzY2FuKVttYXh2YWxdOwoJCXZrZXkgPSAoKmx2a2V5KVttYXh2YWxdOwoJICAgICAgfQoJICAgIH0KI2lmIDAgLyogdGhpcyBicmVha3MgVktfT0VNX3ggVktleXMgaW4gc29tZSBsYXlvdXQgdGFibGVzIGJ5IGluc2VydGluZwogICAgICAgKiBhIFZLIGNvZGUgaW50byBhIG5vdCBhcHByb3ByaWF0ZSBwbGFjZS4KICAgICAgICovCiAgICAgICAgICAgIC8qIGZpbmQgYSBzdWl0YWJsZSBsYXlvdXQtZGVwZW5kZW50IFZLIGNvZGUgKi8KCSAgICAvKiAobW9zdCBXaW5lbGliIGFwcHMgb3VnaHQgdG8gYmUgYWJsZSB0byB3b3JrIHdpdGhvdXQgbGF5b3V0IHRhYmxlcyEpICovCiAgICAgICAgICAgIGZvciAoaSA9IDA7IChpIDwga2V5c3ltc19wZXJfa2V5Y29kZSkgJiYgKCF2a2V5KTsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBrZXlzeW0gPSBYTG9va3VwS2V5c3ltKCZlMiwgaSk7CiAgICAgICAgICAgICAgICBpZiAoKGtleXN5bSA+PSBWS18wICYmIGtleXN5bSA8PSBWS185KQogICAgICAgICAgICAgICAgICAgIHx8IChrZXlzeW0gPj0gVktfQSAmJiBrZXlzeW0gPD0gVktfWikpIHsKCQkgICAgdmtleSA9IGtleXN5bTsKCQl9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAoaSA9IDA7IChpIDwga2V5c3ltc19wZXJfa2V5Y29kZSkgJiYgKCF2a2V5KTsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBrZXlzeW0gPSBYTG9va3VwS2V5c3ltKCZlMiwgaSk7CgkJc3dpdGNoIChrZXlzeW0pCgkJewoJCWNhc2UgJzsnOiAgICAgICAgICAgICB2a2V5ID0gVktfT0VNXzE7IGJyZWFrOwoJCWNhc2UgJy8nOiAgICAgICAgICAgICB2a2V5ID0gVktfT0VNXzI7IGJyZWFrOwoJCWNhc2UgJ2AnOiAgICAgICAgICAgICB2a2V5ID0gVktfT0VNXzM7IGJyZWFrOwoJCWNhc2UgJ1snOiAgICAgICAgICAgICB2a2V5ID0gVktfT0VNXzQ7IGJyZWFrOwoJCWNhc2UgJ1xcJzogICAgICAgICAgICB2a2V5ID0gVktfT0VNXzU7IGJyZWFrOwoJCWNhc2UgJ10nOiAgICAgICAgICAgICB2a2V5ID0gVktfT0VNXzY7IGJyZWFrOwoJCWNhc2UgJ1wnJzogICAgICAgICAgICB2a2V5ID0gVktfT0VNXzc7IGJyZWFrOwoJCWNhc2UgJywnOiAgICAgICAgICAgICB2a2V5ID0gVktfT0VNX0NPTU1BOyBicmVhazsKCQljYXNlICcuJzogICAgICAgICAgICAgdmtleSA9IFZLX09FTV9QRVJJT0Q7IGJyZWFrOwoJCWNhc2UgJy0nOiAgICAgICAgICAgICB2a2V5ID0gVktfT0VNX01JTlVTOyBicmVhazsKCQljYXNlICcrJzogICAgICAgICAgICAgdmtleSA9IFZLX09FTV9QTFVTOyBicmVhazsKCQl9CgkgICAgfQojZW5kaWYKICAgICAgICAgICAgaWYgKCF2a2V5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBPdGhlcnMga2V5czogbGV0J3MgYXNzaWduIE9FTSB2aXJ0dWFsIGtleSBjb2RlcyBpbiB0aGUgYWxsb3dlZCByYW5nZSwKICAgICAgICAgICAgICAgICAqIHRoYXQgaXMgKFsweGJhLDB4YzBdLCBbMHhkYiwweGU0XSwgMHhlNiAoZ2l2ZW4gdXApIGV0IFsweGU5LDB4ZjVdKSAqLwogICAgICAgICAgICAgICAgc3dpdGNoICgrK09FTXZrZXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlIDB4YzEgOiBPRU12a2V5PTB4ZGI7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAweGU1IDogT0VNdmtleT0weGU5OyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMHhmNiA6IE9FTXZrZXk9MHhmNTsgV0FSTigiTm8gbW9yZSBPRU0gdmtleSBhdmFpbGFibGUhXG4iKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2a2V5ID0gT0VNdmtleTsKCiAgICAgICAgICAgICAgICBpZiAoVFJBQ0VfT04oa2V5Ym9hcmQpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFRSQUNFKCJPRU0gc3BlY2lmaWMgdmlydHVhbCBrZXkgJVggYXNzaWduZWQgdG8ga2V5Y29kZSAlWDpcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRU12a2V5LCBlMi5rZXljb2RlKTsKICAgICAgICAgICAgICAgICAgICBUUkFDRSgiKCIpOwogICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXlzeW1zX3Blcl9rZXljb2RlOyBpICs9IDEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjaGFyCSprc25hbWU7CgogICAgICAgICAgICAgICAgICAgICAgICBrZXlzeW0gPSBYTG9va3VwS2V5c3ltKCZlMiwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGtzbmFtZSA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWtzbmFtZSkKCQkJICAgIGtzbmFtZSA9ICJOb1N5bWJvbCI7CiAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFKCAiJWxYICglcykgIiwga2V5c3ltLCBrc25hbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBUUkFDRSgiKVxuIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgVFJBQ0UoImtleWNvZGUgJTA0eCA9PiB2a2V5ICUwNHhcbiIsIGUyLmtleWNvZGUsIHZrZXkpOwogICAgICAgIGtleWMydmtleVtlMi5rZXljb2RlXSA9IHZrZXk7CiAgICAgICAga2V5YzJzY2FuW2UyLmtleWNvZGVdID0gc2NhbjsKICAgIH0gLyogZm9yICovCgogICAgLyogSWYgc29tZSBrZXlzIHN0aWxsIGxhY2sgc2NhbmNvZGVzLCBhc3NpZ24gc29tZSBhcmJpdHJhcnkgb25lcyB0byB0aGVtIG5vdyAqLwogICAgZm9yIChzY2FuID0gMHg2MCwga2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspCiAgICAgIGlmIChrZXljMnZrZXlba2V5Y10mJiFrZXljMnNjYW5ba2V5Y10pIHsKCWNoYXIgKmtzbmFtZTsKCWtleXN5bSA9IFhLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwga2V5YywgMCk7Cglrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKCWlmICgha3NuYW1lKSBrc25hbWUgPSAiTm9TeW1ib2wiOwoKCS8qIHNob3VsZCBtYWtlIHN1cmUgdGhlIHNjYW5jb2RlIGlzIHVuYXNzaWduZWQgaGVyZSwgYnV0ID49MHg2MCBjdXJyZW50bHkgYWx3YXlzIGlzICovCgoJVFJBQ0VfKGtleSkoImFzc2lnbmluZyBzY2FuY29kZSAlMDJ4IHRvIHVuaWRlbnRpZmllZCBrZXljb2RlICUwMnggKCVzKVxuIixzY2FuLGtleWMsa3NuYW1lKTsKCWtleWMyc2NhbltrZXljXT1zY2FuKys7CiAgICAgIH0KCiAgICAvKiBOb3cgc3RvcmUgb25lIGtleWNvZGUgZm9yIGVhY2ggbW9kaWZpZXIuIFVzZWQgdG8gc2ltdWxhdGUga2V5cHJlc3Nlcy4gKi8KICAgIGtjQ29udHJvbCA9IFhLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwgWEtfQ29udHJvbF9MKTsKICAgIGtjQWx0ID0gWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBYS19BbHRfTCk7CiAgICBpZiAoIWtjQWx0KSBrY0FsdCA9IFhLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwgWEtfTWV0YV9MKTsKICAgIGtjU2hpZnQgPSBYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIFhLX1NoaWZ0X0wpOwogICAga2NOdW1Mb2NrID0gWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBYS19OdW1fTG9jayk7CiAgICBrY0NhcHNMb2NrID0gWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBYS19DYXBzX0xvY2spOwogICAgd2luZV90c3gxMV91bmxvY2soKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0S2V5Ym9hcmRMYXlvdXRMaXN0IChYMTFEUlYuQCkKICovClVJTlQgWDExRFJWX0dldEtleWJvYXJkTGF5b3V0TGlzdChJTlQgc2l6ZSwgSEtMICpoa2wpCnsKICAgIElOVCBpOwoKICAgIFRSQUNFKCIlZCwgJXBcbiIsIHNpemUsIGhrbCk7CgogICAgaWYgKCFzaXplKQogICAgewogICAgICAgIHNpemUgPSA0MDk2OyAvKiBob3BlIHdlIHdpbGwgbmV2ZXIgaGF2ZSB0aGF0IG1hbnkgKi8KICAgICAgICBoa2wgPSBOVUxMOwogICAgfQoKICAgIGZvciAoaSA9IDA7IG1haW5fa2V5X3RhYltpXS5jb21tZW50ICYmIChpIDwgc2l6ZSk7IGkrKykKICAgIHsKICAgICAgICBpZiAoaGtsKQogICAgICAgICAgICBoa2xbaV0gPSAoSEtMKW1haW5fa2V5X3RhYltpXS5sY2lkOwogICAgfQogICAgcmV0dXJuIGk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldEtleWJvYXJkTGF5b3V0IChYMTFEUlYuQCkKICovCkhLTCBYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXQoRFdPUkQgZHdUaHJlYWRpZCkKewogICAgRFdPUkQgbGF5b3V0OwogICAgTEFOR0lEIGxhbmdpZDsKCiAgICBpZiAoZHdUaHJlYWRpZCkKICAgICAgICBGSVhNRSgiY291bGRuJ3QgcmV0dXJuIGtleWJvYXJkIGxheW91dCBmb3IgdGhyZWFkICUwNGx4XG4iLCBkd1RocmVhZGlkKTsKCiNpZiAwCiAgICBsYXlvdXQgPSBtYWluX2tleV90YWJba2JkX2xheW91dF0ubGNpZDsKI2Vsc2UKICAgIC8qIEZJWE1FOgogICAgICogV2lud29yZCB1c2VzIHJldHVybiB2YWx1ZSBvZiBHZXRLZXlib2FyZExheW91dCBhcyBhIGNvZGVwYWdlCiAgICAgKiB0byB0cmFuc2xhdGUgQU5TSSBrZXlib2FyZCBtZXNzYWdlcyB0byB1bmljb2RlLiBCdXQgd2UgaGF2ZQogICAgICogYSBwcm9ibGVtIHdpdGggaXQ6IGZvciBpbnN0YW5jZSBQb2xpc2gga2V5Ym9hcmQgbGF5b3V0IGlzCiAgICAgKiBpZGVudGljYWwgdG8gdGhlIFVTIG9uZSwgYW5kIHRoZXJlZm9yZSBpbnN0ZWFkIG9mIHRoZSBQb2xpc2gKICAgICAqIGxvY2FsZSBpZCB3ZSByZXR1cm4gdGhlIFVTIG9uZS4KICAgICAqLwogICAgbGF5b3V0ID0gR2V0VXNlckRlZmF1bHRMQ0lEKCk7CiNlbmRpZgogICAgLyogCiAgICAgKiBNaWNyb3NvZnQgT2ZmaWNlIGV4cGVjdHMgdGhpcyB2YWx1ZSB0byBiZSBzb21ldGhpbmcgc3BlY2lmaWMKICAgICAqIGZvciBKYXBhbmVzZSBhbmQgS29yZWFuIFdpbmRvd3Mgd2l0aCBhbiBJTUUgdGhlIHZhbHVlIGlzIDB4ZTAwMQogICAgICogV2Ugc2hvdWxkIHByb2JhYmx5IGNoZWNrIHRvIHNlZSBpZiBhbiBJTUUgZXhpc3RzIGFuZCBpZiBzbyB0aGVuCiAgICAgKiBzZXQgdGhpcyB3b3JkIHByb3Blcmx5LgogICAgICovCiAgICBsYW5naWQgPSBQUklNQVJZTEFOR0lEKExBTkdJREZST01MQ0lEKGxheW91dCkpOwogICAgaWYgKGxhbmdpZCA9PSBMQU5HX0NISU5FU0UgfHwgbGFuZ2lkID09IExBTkdfSkFQQU5FU0UgfHwgbGFuZ2lkID09IExBTkdfS09SRUFOKQogICAgICAgIGxheW91dCB8PSAweGUwMDEgPDwgMTY7IC8qIEZJWE1FICovCgogICAgcmV0dXJuIChIS0wpbGF5b3V0Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRLZXlib2FyZExheW91dE5hbWUgKFgxMURSVi5AKQogKi8KQk9PTCBYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXROYW1lKExQV1NUUiBuYW1lKQp7CiAgICBzdGF0aWMgY29uc3QgV0NIQVIgZm9ybWF0V1tdID0geyclJywnMCcsJzgnLCdsJywneCcsMH07CiAgICBEV09SRCBsYXlvdXQ7CiAgICBMQU5HSUQgbGFuZ2lkOwoKICAgIGxheW91dCA9IG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5sY2lkOwogICAgLyogc2VlIGNvbW1lbnQgYWJvdmUgKi8KICAgIGxhbmdpZCA9IFBSSU1BUllMQU5HSUQoTEFOR0lERlJPTUxDSUQobGF5b3V0KSk7CiAgICBpZiAobGFuZ2lkID09IExBTkdfQ0hJTkVTRSB8fCBsYW5naWQgPT0gTEFOR19KQVBBTkVTRSB8fCBsYW5naWQgPT0gTEFOR19LT1JFQU4pCiAgICAgICAgbGF5b3V0IHw9IDB4ZTAwMSA8PCAxNjsgLyogRklYTUUgKi8KCiAgICBzcHJpbnRmVyhuYW1lLCBmb3JtYXRXLCBsYXlvdXQpOwogICAgVFJBQ0UoInJldHVybmluZyAlc1xuIiwgZGVidWdzdHJfdyhuYW1lKSk7CiAgICByZXR1cm4gVFJVRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJTG9hZEtleWJvYXJkTGF5b3V0IChYMTFEUlYuQCkKICovCkhLTCBYMTFEUlZfTG9hZEtleWJvYXJkTGF5b3V0KExQQ1dTVFIgbmFtZSwgVUlOVCBmbGFncykKewogICAgRklYTUUoIiVzLCAlMDR4OiBzdHViIVxuIiwgZGVidWdzdHJfdyhuYW1lKSwgZmxhZ3MpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgIHJldHVybiAwOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlVbmxvYWRLZXlib2FyZExheW91dCAoWDExRFJWLkApCiAqLwpCT09MIFgxMURSVl9VbmxvYWRLZXlib2FyZExheW91dChIS0wgaGtsKQp7CiAgICBGSVhNRSgiJXA6IHN0dWIhXG4iLCBoa2wpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgIHJldHVybiBGQUxTRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQWN0aXZhdGVLZXlib2FyZExheW91dCAoWDExRFJWLkApCiAqLwpIS0wgWDExRFJWX0FjdGl2YXRlS2V5Ym9hcmRMYXlvdXQoSEtMIGhrbCwgVUlOVCBmbGFncykKewogICAgRklYTUUoIiVwLCAlMDR4OiBzdHViIVxuIiwgaGtsLCBmbGFncyk7CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogICAgcmV0dXJuIDA7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFgxMURSVl9NYXBwaW5nTm90aWZ5CiAqLwp2b2lkIFgxMURSVl9NYXBwaW5nTm90aWZ5KCBYTWFwcGluZ0V2ZW50ICpldmVudCApCnsKICAgIEhXTkQgaHduZDsKCiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIFhSZWZyZXNoS2V5Ym9hcmRNYXBwaW5nKGV2ZW50KTsKICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CiAgICBYMTFEUlZfSW5pdEtleWJvYXJkKCBwS2V5U3RhdGVUYWJsZSApOwoKICAgIGh3bmQgPSBHZXRGb2N1cygpOwogICAgaWYgKCFod25kKSBod25kID0gR2V0QWN0aXZlV2luZG93KCk7CiAgICBQb3N0TWVzc2FnZVcoaHduZCwgV01fSU5QVVRMQU5HQ0hBTkdFUkVRVUVTVCwKICAgICAgICAgICAgICAgICAwIC8qRklYTUUqLywgKExQQVJBTSlYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXQoMCkpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlWa0tleVNjYW5FeCAoWDExRFJWLkApCiAqCiAqIE5vdGU6IFdpbmRvd3MgaWdub3JlcyBIS0wgcGFyYW1ldGVyIGFuZCB1c2VzIGN1cnJlbnQgYWN0aXZlIGxheW91dCBpbnN0ZWFkCiAqLwpTSE9SVCBYMTFEUlZfVmtLZXlTY2FuRXgoV0NIQVIgd0NoYXIsIEhLTCBoa2wpCnsKICAgIERpc3BsYXkgKmRpc3BsYXkgPSB0aHJlYWRfZGlzcGxheSgpOwogICAgS2V5Q29kZSBrZXljb2RlOwogICAgS2V5U3ltIGtleXN5bTsKICAgIGludCBpLCBpbmRleDsKICAgIENIQVIgY0NoYXI7CiAgICBTSE9SVCByZXQ7CgogICAgaWYgKCFXaWRlQ2hhclRvTXVsdGlCeXRlKENQX1VOSVhDUCwgMCwgJndDaGFyLCAxLCAmY0NoYXIsIDEsIE5VTEwsIE5VTEwpKQogICAgewogICAgICAgIFdBUk4oIm5vIHRyYW5zbGF0aW9uIGZyb20gdW5pY29kZSB0byBDUF9VTklYQ1AgZm9yIDB4JTAyeFxuIiwgd0NoYXIpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBUUkFDRSgid0NoYXIgMHglMDJ4IC0+IGNDaGFyICclYydcbiIsIHdDaGFyLCBjQ2hhcik7CgogICAgLyogY2hhci0+a2V5c3ltIChzYW1lIGZvciBBTlNJIGNoYXJzKSAqLwogICAga2V5c3ltID0gKHVuc2lnbmVkIGNoYXIpY0NoYXI7IC8qICghKSBjQ2hhciBpcyBzaWduZWQgKi8KICAgIGlmIChrZXlzeW0gPD0gMjcpIGtleXN5bSArPSAweEZGMDA7IC8qIHNwZWNpYWwgY2hhcnMgOiByZXR1cm4sIGJhY2tzcGFjZS4uLiAqLwoKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAga2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwga2V5c3ltKTsgIC8qIGtleXN5bSAtPiBrZXljb2RlICovCiAgICBpZiAoIWtleWNvZGUpCiAgICB7IC8qIEl0IGRpZG4ndCB3b3JrIC4uLiBsZXQncyB0cnkgd2l0aCBkZWFkY2hhciBjb2RlLiAqLwogICAgICAgIFRSQUNFKCJyZXRyeWluZyB3aXRoIHwgMHhGRTAwXG4iKTsKICAgICAgICBrZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBrZXlzeW0gfCAweEZFMDApOwogICAgfQogICAgd2luZV90c3gxMV91bmxvY2soKTsKCiAgICBUUkFDRSgiJyVjJyglI2x4LCAlbHUpOiBnb3Qga2V5Y29kZSAlIy4yeCAoJWQpXG4iLAogICAgICAgICAgICBjQ2hhciwga2V5c3ltLCBrZXlzeW0sIGtleWNvZGUsIGtleWNvZGUpOwoKICAgIC8qIGtleWNvZGUgLT4gKGtleWMydmtleSkgdmtleSAqLwogICAgcmV0ID0ga2V5YzJ2a2V5W2tleWNvZGVdOwoKICAgIGlmICgha2V5Y29kZSB8fCAhcmV0KQogICAgewogICAgICAgIFRSQUNFKCJrZXljb2RlIGZvciAnJWMnIG5vdCBmb3VuZCwgcmV0dXJuaW5nIC0xXG4iLCBjQ2hhcik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIGluZGV4ID0gLTE7CiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIC8qIGZpbmQgc2hpZnQgc3RhdGUgKi8KICAgIHsKICAgICAgICBpZiAoWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCBrZXljb2RlLCBpKSA9PSBrZXlzeW0pCiAgICAgICAgewogICAgICAgICAgICBpbmRleCA9IGk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CgogICAgc3dpdGNoIChpbmRleCkKICAgIHsKICAgICAgICBkZWZhdWx0OgogICAgICAgIGNhc2UgLTE6CiAgICAgICAgICAgIFdBUk4oIktleXN5bSAlbHggbm90IGZvdW5kIHdoaWxlIHBhcnNpbmcgdGhlIGtleWNvZGUgdGFibGVcbiIsIGtleXN5bSk7CiAgICAgICAgICAgIHJldHVybiAtMTsKCiAgICAgICAgY2FzZSAwOiBicmVhazsKICAgICAgICBjYXNlIDE6IHJldCArPSAweDAxMDA7IGJyZWFrOwogICAgICAgIGNhc2UgMjogcmV0ICs9IDB4MDYwMDsgYnJlYWs7CiAgICAgICAgY2FzZSAzOiByZXQgKz0gMHgwNzAwOyBicmVhazsKICAgIH0KICAgIC8qCiAgICAgIGluZGV4IDogMCAgICAgYWRkcyAweDAwMDAKICAgICAgaW5kZXggOiAxICAgICBhZGRzIDB4MDEwMCAoc2hpZnQpCiAgICAgIGluZGV4IDogPyAgICAgYWRkcyAweDAyMDAgKGN0cmwpCiAgICAgIGluZGV4IDogMiAgICAgYWRkcyAweDA2MDAgKGN0cmwrYWx0KQogICAgICBpbmRleCA6IDMgICAgIGFkZHMgMHgwNzAwIChjdHJsK2FsdCtzaGlmdCkKICAgICAqLwoKICAgIFRSQUNFKCIgLi4uIHJldHVybmluZyAlIy4yeFxuIiwgcmV0KTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJTWFwVmlydHVhbEtleUV4IChYMTFEUlYuQCkKICovClVJTlQgWDExRFJWX01hcFZpcnR1YWxLZXlFeChVSU5UIHdDb2RlLCBVSU5UIHdNYXBUeXBlLCBIS0wgaGtsKQp7CiAgICBEaXNwbGF5ICpkaXNwbGF5ID0gdGhyZWFkX2Rpc3BsYXkoKTsKCiNkZWZpbmUgcmV0dXJuTVZLKHZhbHVlKSB7IFRSQUNFKCJyZXR1cm5pbmcgMHgleC5cbiIsdmFsdWUpOyByZXR1cm4gdmFsdWU7IH0KCiAgICBUUkFDRSgid0NvZGU9MHgleCwgd01hcFR5cGU9JWQsIGhrbCAlcFxuIiwgd0NvZGUsIHdNYXBUeXBlLCBoa2wpOwogICAgaWYgKGhrbCAhPSBYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXQoMCkpCiAgICAgICAgRklYTUUoImtleWJvYXJkIGxheW91dCAlcCBpcyBub3Qgc3VwcG9ydGVkXG4iLCBoa2wpOwoKCXN3aXRjaCh3TWFwVHlwZSkgewoJCWNhc2UgMDoJeyAvKiB2a2V5LWNvZGUgdG8gc2Nhbi1jb2RlICovCgkJCS8qIGxldCdzIGRvIHZrZXkgLT4ga2V5Y29kZSAtPiBzY2FuICovCgkJCWludCBrZXljOwoJCQlmb3IgKGtleWM9bWluX2tleWNvZGU7IGtleWM8PW1heF9rZXljb2RlOyBrZXljKyspCgkJCQlpZiAoKGtleWMydmtleVtrZXljXSAmIDB4RkYpID09IHdDb2RlKQoJCQkJCXJldHVybk1WSyAoa2V5YzJzY2FuW2tleWNdICYgMHhGRik7CgkJCVRSQUNFKCJyZXR1cm5pbmcgbm8gc2Nhbi1jb2RlLlxuIik7CgkJICAgICAgICByZXR1cm4gMDsgfQoKCQljYXNlIDE6IHsgLyogc2Nhbi1jb2RlIHRvIHZrZXktY29kZSAqLwoJCQkvKiBsZXQncyBkbyBzY2FuIC0+IGtleWNvZGUgLT4gdmtleSAqLwoJCQlpbnQga2V5YzsKCQkJZm9yIChrZXljPW1pbl9rZXljb2RlOyBrZXljPD1tYXhfa2V5Y29kZTsga2V5YysrKQoJCQkJaWYgKChrZXljMnNjYW5ba2V5Y10gJiAweEZGKSA9PSAod0NvZGUgJiAweEZGKSkKCQkJCQlyZXR1cm5NVksgKGtleWMydmtleVtrZXljXSAmIDB4RkYpOwoJCQlUUkFDRSgicmV0dXJuaW5nIG5vIHZrZXktY29kZS5cbiIpOwoJCSAgICAgICAgcmV0dXJuIDA7IH0KCgkJY2FzZSAyOiB7IC8qIHZrZXktY29kZSB0byB1bnNoaWZ0ZWQgQU5TSSBjb2RlICovCiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIHN0aWxsIGRvbid0IGtub3cgd2hhdCAidW5zaGlmdGVkIiBtZWFucy4gaW4gd2luZG93cyBWS19XICgweDU3KQogICAgICAgICAgICAgICAgICAgICAgICAgKiByZXR1cm5zIDB4NTcsIHdoaWNoIGlzIHVwZXJjYXNlICdXJy4gU28gd2UgaGF2ZSB0byByZXR1cm4gdGhlIHVwcGVyY2FzZQogICAgICAgICAgICAgICAgICAgICAgICAgKiBrZXkuLiBMb29rcyBsaWtlIHNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIHRoZSBNUyBkb2NzPwogICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGlzIGlzIG9ubHkgdHJ1ZSBmb3IgbGV0dGVycywgZm9yIGV4YW1wbGUgVktfMCByZXR1cm5zICcwJyBub3QgJyknLgogICAgICAgICAgICAgICAgICAgICAgICAgKiAtIGhlbmNlIHdlIHVzZSB0aGUgbG9jayBtYXNrIHRvIGVuc3VyZSB0aGlzIGhhcHBlbnMuCiAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJCQkvKiBsZXQncyBkbyB2a2V5IC0+IGtleWNvZGUgLT4gKFhMb29rdXBTdHJpbmcpIGFuc2kgY2hhciAqLwoJCQlYS2V5RXZlbnQgZTsKCQkJS2V5U3ltIGtleXN5bTsKCQkJaW50IGtleWM7CgkJCWNoYXIgc1syXTsKCQkJZS5kaXNwbGF5ID0gZGlzcGxheTsKCgkJCWUuc3RhdGUgPSBMb2NrTWFzazsKCQkJLyogTG9ja01hc2sgc2hvdWxkIGJlaGF2ZSBleGFjdGx5IGxpa2UgY2FwcyBsb2NrIC0gdXBlcmNhc2UKCQkJICogdGhlIGxldHRlciBrZXlzIGFuZCB0aGF0cyBhYm91dCBpdC4gKi8KCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmVfdHN4MTFfbG9jaygpOwoKCQkJZS5rZXljb2RlID0gMDsKCQkJLyogV2UgZXhpdCBvbiB0aGUgZmlyc3Qga2V5Y29kZSBmb3VuZCwgdG8gc3BlZWQgdXAgdGhlIHRoaW5nLiAqLwoJCQlmb3IgKGtleWM9bWluX2tleWNvZGU7IChrZXljPD1tYXhfa2V5Y29kZSkgJiYgKCFlLmtleWNvZGUpIDsga2V5YysrKQoJCQl7IC8qIEZpbmQgYSBrZXljb2RlIHRoYXQgY291bGQgaGF2ZSBnZW5lcmF0ZWQgdGhpcyB2aXJ0dWFsIGtleSAqLwoJCQkgICAgaWYgICgoa2V5YzJ2a2V5W2tleWNdICYgMHhGRikgPT0gd0NvZGUpCgkJCSAgICB7IC8qIFdlIGZpbHRlciB0aGUgZXh0ZW5kZWQgYml0LCB3ZSBkb24ndCBrbm93IGl0ICovCgkJCSAgICAgICAgZS5rZXljb2RlID0ga2V5YzsgLyogU3RvcmUgaXQgdGVtcG9yYXJpbHkgKi8KCQkJCWlmICgoRVZFTlRfZXZlbnRfdG9fdmtleSgwLCZlKSAmIDB4RkYpICE9IHdDb2RlKSB7CgkJCQkgICAgZS5rZXljb2RlID0gMDsgLyogV3Jvbmcgb25lIChleDogYmVjYXVzZSBvZiB0aGUgTnVtTG9jawoJCQkJCSBzdGF0ZSksIHNvIHNldCBpdCB0byAwLCB3ZSdsbCBmaW5kIGFub3RoZXIgb25lICovCgkJCQl9CgkJCSAgICB9CgkJCX0KCgkJCWlmICgod0NvZGU+PVZLX05VTVBBRDApICYmICh3Q29kZTw9VktfTlVNUEFEOSkpCgkJCSAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIHdDb2RlLVZLX05VTVBBRDArWEtfS1BfMCk7CgoJCQlpZiAod0NvZGU9PVZLX0RFQ0lNQUwpCgkJCSAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIFhLX0tQX0RlY2ltYWwpOwoKCQkJaWYgKCFlLmtleWNvZGUpCgkJCXsKCQkJICBXQVJOKCJVbmtub3duIHZpcnR1YWwga2V5ICVYICEhISBcbiIsIHdDb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwoJCQkgIHJldHVybiAwOyAvKiB3aGF0ZXZlciAqLwoJCQl9CgkJCVRSQUNFKCJGb3VuZCBrZXljb2RlICVkICgweCUyWClcbiIsZS5rZXljb2RlLGUua2V5Y29kZSk7CgoJCQlpZiAoWExvb2t1cFN0cmluZygmZSwgcywgMiwgJmtleXN5bSwgTlVMTCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5NVksgKCpzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKCQkJVFJBQ0UoInJldHVybmluZyBubyBBTlNJLlxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CgkJCXJldHVybiAwOwoJCQl9CgoJCWNhc2UgMzogICAvKiAqKk5UIG9ubHkqKiBzY2FuLWNvZGUgdG8gdmtleS1jb2RlIGJ1dCBkaXN0aW5ndWlzaCBiZXR3ZWVuICAqLwogICAgICAgICAgICAgIAkJICAvKiAgICAgICAgICAgICBsZWZ0IGFuZCByaWdodCAgKi8KCQkgICAgICAgICAgRklYTUUoIiBzdHViIGZvciBOVFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CgoJCWRlZmF1bHQ6IC8qIHJlc2VydmVkICovCgkJCVdBUk4oIlVua25vd24gd01hcFR5cGUgJWQgIVxuIiwgd01hcFR5cGUpOwoJCQlyZXR1cm4gMDsKCX0KCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldEtleU5hbWVUZXh0IChYMTFEUlYuQCkKICovCklOVCBYMTFEUlZfR2V0S2V5TmFtZVRleHQoTE9ORyBsUGFyYW0sIExQV1NUUiBscEJ1ZmZlciwgSU5UIG5TaXplKQp7CiAgaW50IHZrZXksIGFuc2ksIHNjYW5Db2RlOwogIEtleUNvZGUga2V5YzsKICBpbnQga2V5aTsKICBLZXlTeW0ga2V5czsKICBjaGFyICpuYW1lOwoKICBzY2FuQ29kZSA9IGxQYXJhbSA+PiAxNjsKICBzY2FuQ29kZSAmPSAweDFmZjsgIC8qIGtlZXAgImV4dGVuZGVkLWtleSIgZmxhZyB3aXRoIGNvZGUgKi8KCiAgLyogRklYTUU6IHNob3VsZCB1c2UgTVZLIHR5cGUgMyAoTlQgdmVyc2lvbiB0aGF0IGRpc3Rpbmd1aXNoZXMgcmlnaHQgYW5kIGxlZnQgKi8KICB2a2V5ID0gWDExRFJWX01hcFZpcnR1YWxLZXlFeChzY2FuQ29kZSwgMSwgWDExRFJWX0dldEtleWJvYXJkTGF5b3V0KDApKTsKCiAgLyogIGhhbmRsZSAiZG9uJ3QgY2FyZSIgYml0ICgweDAyMDAwMDAwKSAqLwogIGlmICghKGxQYXJhbSAmIDB4MDIwMDAwMDApKSB7CiAgICBzd2l0Y2ggKHZrZXkpIHsKICAgICAgICAgY2FzZSBWS19MU0hJRlQ6CiAgICAgICAgIGNhc2UgVktfUlNISUZUOgogICAgICAgICAgICAgICAgICAgICAgICAgIHZrZXkgPSBWS19TSElGVDsKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgIGNhc2UgVktfTENPTlRST0w6CiAgICAgICBjYXNlIFZLX1JDT05UUk9MOgogICAgICAgICAgICAgICAgICAgICAgICAgIHZrZXkgPSBWS19DT05UUk9MOwogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBWS19MTUVOVToKICAgICAgICAgIGNhc2UgVktfUk1FTlU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmtleSA9IFZLX01FTlU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICBhbnNpID0gWDExRFJWX01hcFZpcnR1YWxLZXlFeCh2a2V5LCAyLCBYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXQoMCkpOwogIFRSQUNFKCJzY2FuIDB4JTA0eCwgdmtleSAweCUwNHgsIEFOU0kgMHglMDR4XG4iLCBzY2FuQ29kZSwgdmtleSwgYW5zaSk7CgogIC8qIGZpcnN0IGdldCB0aGUgbmFtZSBvZiB0aGUgInJlZ3VsYXIiIGtleXMgd2hpY2ggaXMgdGhlIFVwcGVyIGNhc2UKICAgICB2YWx1ZSBvZiB0aGUga2V5Y2FwIGltcHJpbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgaWYgKCAoKGFuc2kgPj0gMHgyMSkgJiYgKGFuc2kgPD0gMHg3ZSkpICYmCiAgICAgICAoc2NhbkNvZGUgIT0gMHgxMzcpICYmICAgLyogUHJ0U2NuICAgKi8KICAgICAgIChzY2FuQ29kZSAhPSAweDEzNSkgJiYgICAvKiBudW1wYWQgLyAqLwogICAgICAgKHNjYW5Db2RlICE9IDB4MzcgKSAmJiAgIC8qIG51bXBhZCAqICovCiAgICAgICAoc2NhbkNvZGUgIT0gMHg0YSApICYmICAgLyogbnVtcGFkIC0gKi8KICAgICAgIChzY2FuQ29kZSAhPSAweDRlICkgKSAgICAvKiBudW1wYWQgKyAqLwogICAgICB7CiAgICAgICAgaWYgKChuU2l6ZSA+PSAyKSAmJiBscEJ1ZmZlcikKCXsKICAgICAgICAgICpscEJ1ZmZlciA9IHRvdXBwZXJXKChXQ0hBUilhbnNpKTsKICAgICAgICAgICoobHBCdWZmZXIrMSkgPSAwOwogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgIGVsc2UKICAgICAgICByZXR1cm4gMDsKICB9CgogIC8qIEZJWE1FOiBob3JyaWJsZSBoYWNrIHRvIGZpeCBmdW5jdGlvbiBrZXlzLiBXaW5kb3dzIHJlcG9ydHMgc2NhbmNvZGUKICAgICAgICAgICAgd2l0aG91dCAiZXh0ZW5kZWQta2V5IiBmbGFnLiBIb3dldmVyIFdpbmUgZ2VuZXJhdGVzIHNjYW5jb2RlCiAgICAgICAgICAgICp3aXRoKiAiZXh0ZW5kZWQta2V5IiBmbGFnLiBTZWVtcyB0byBvY2N1ciAqb25seSogZm9yIHRoZQogICAgICAgICAgICBmdW5jdGlvbiBrZXlzLiBTb29vby4uIFdlIHdpbGwgbGVhdmUgdGhlIHRhYmxlIGFsb25lIGFuZAogICAgICAgICAgICBmdWRnZSB0aGUgbG9va3VwIGhlcmUgdGlsbCB0aGUgb3RoZXIgcGFydCBpcyBmb3VuZCBhbmQgZml4ZWQhISEgKi8KCiAgaWYgKCAoKHNjYW5Db2RlID49IDB4MTNiKSAmJiAoc2NhbkNvZGUgPD0gMHgxNDQpKSB8fAogICAgICAgKHNjYW5Db2RlID09IDB4MTU3KSB8fCAoc2NhbkNvZGUgPT0gMHgxNTgpKQogICAgc2NhbkNvZGUgJj0gMHhmZjsgICAvKiByZW1vdmUgImV4dGVuZGVkLWtleSIgZmxhZyBmb3IgRngga2V5cyAqLwoKICAvKiBsZXQncyBkbyBzY2FuY29kZSAtPiBrZXljb2RlIC0+IGtleXN5bSAtPiBTdHJpbmcgKi8KCiAgZm9yIChrZXlpPW1pbl9rZXljb2RlOyBrZXlpPD1tYXhfa2V5Y29kZTsga2V5aSsrKQogICAgICBpZiAoKGtleWMyc2NhbltrZXlpXSkgPT0gc2NhbkNvZGUpCiAgICAgICAgIGJyZWFrOwogIGlmIChrZXlpIDw9IG1heF9rZXljb2RlKQogIHsKICAgICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICAgIGtleWMgPSAoS2V5Q29kZSkga2V5aTsKICAgICAga2V5cyA9IFhLZXljb2RlVG9LZXlzeW0odGhyZWFkX2Rpc3BsYXkoKSwga2V5YywgMCk7CiAgICAgIG5hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5cyk7CiAgICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CiAgICAgIFRSQUNFKCJmb3VuZCBzY2FuPSUwNHgga2V5Yz0lMDR4IGtleXN5bT0lMDR4IHN0cmluZz0lc1xuIiwKICAgICAgICAgICAgc2NhbkNvZGUsIGtleWMsIChpbnQpa2V5cywgbmFtZSk7CiAgICAgIGlmIChscEJ1ZmZlciAmJiBuU2l6ZSAmJiBuYW1lKQogICAgICB7CiAgICAgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX1VOSVhDUCwgMCwgbmFtZSwgLTEsIGxwQnVmZmVyLCBuU2l6ZSk7CiAgICAgICAgICBscEJ1ZmZlcltuU2l6ZSAtIDFdID0gMDsKICAgICAgICAgIHJldHVybiAxOwogICAgICB9CiAgfQoKICAvKiBGaW5hbGx5IGlzc3VlIEZJWE1FIGZvciB1bmtub3duIGtleXMgICAqLwoKICBGSVhNRSgiKCUwOGx4LCVwLCVkKTogdW5zdXBwb3J0ZWQga2V5LCB2a2V5PSUwNHgsIGFuc2k9JTA0eFxuIixsUGFyYW0sbHBCdWZmZXIsblNpemUsdmtleSxhbnNpKTsKICBpZiAobHBCdWZmZXIgJiYgblNpemUpCiAgICAqbHBCdWZmZXIgPSAwOwogIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVgxMURSVl9LRVlCT0FSRF9NYXBEZWFkS2V5c3ltCiAqLwpzdGF0aWMgY2hhciBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKEtleVN5bSBrZXlzeW0pCnsKCXN3aXRjaCAoa2V5c3ltKQoJICAgIHsKCS8qIHN5bWJvbGljIEFTQ0lJIGlzIHRoZSBzYW1lIGFzIGRlZmluZWQgaW4gcmZjMTM0NSAqLwojaWZkZWYgWEtfZGVhZF90aWxkZQoJICAgIGNhc2UgWEtfZGVhZF90aWxkZSA6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkU3RSA6IC8qIFhmcmVlJ3MgWEtfRHRpbGRlICovCgkJcmV0dXJuICd+JzsJLyogJz8gKi8KI2lmZGVmIFhLX2RlYWRfYWN1dGUKCSAgICBjYXNlIFhLX2RlYWRfYWN1dGUgOgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFMjcgOiAvKiBYZnJlZSdzIFhLX0RhY3V0ZV9hY2NlbnQgKi8KCQlyZXR1cm4gMHhiNDsJLyogJycgKi8KI2lmZGVmIFhLX2RlYWRfY2lyY3VtZmxleAoJICAgIGNhc2UgWEtfZGVhZF9jaXJjdW1mbGV4OgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFNUUgOiAvKiBYZnJlZSdzIFhLX0RjaXJjdW1mbGV4X2FjY2VudCAqLwoJCXJldHVybiAnXic7CS8qICc+ICovCiNpZmRlZiBYS19kZWFkX2dyYXZlCgkgICAgY2FzZSBYS19kZWFkX2dyYXZlIDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTYwIDogLyogWGZyZWUncyBYS19EZ3JhdmVfYWNjZW50ICovCgkJcmV0dXJuICdgJzsJLyogJyEgKi8KI2lmZGVmIFhLX2RlYWRfZGlhZXJlc2lzCgkgICAgY2FzZSBYS19kZWFkX2RpYWVyZXNpcyA6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkUyMiA6IC8qIFhmcmVlJ3MgWEtfRGRpYWVyZXNpcyAqLwoJCXJldHVybiAweGE4OwkvKiAnOiAqLwojaWZkZWYgWEtfZGVhZF9jZWRpbGxhCgkgICAgY2FzZSBYS19kZWFkX2NlZGlsbGEgOgoJICAgICAgICByZXR1cm4gMHhiODsJLyogJywgKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX21hY3JvbgoJICAgIGNhc2UgWEtfZGVhZF9tYWNyb24gOgoJICAgICAgICByZXR1cm4gJy0nOwkvKiAnbSBpc24ndCBkZWZpbmVkIG9uIGlzby04ODU5LXggKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2JyZXZlCgkgICAgY2FzZSBYS19kZWFkX2JyZXZlIDoKCSAgICAgICAgcmV0dXJuIDB4YTI7CS8qICcoICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9hYm92ZWRvdAoJICAgIGNhc2UgWEtfZGVhZF9hYm92ZWRvdCA6CgkgICAgICAgIHJldHVybiAweGZmOwkvKiAnLiAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfYWJvdmVyaW5nCgkgICAgY2FzZSBYS19kZWFkX2Fib3ZlcmluZyA6CgkgICAgICAgIHJldHVybiAnMCc7CS8qICcwIGlzbid0IGRlZmluZWQgb24gaXNvLTg4NTkteCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfZG91YmxlYWN1dGUKCSAgICBjYXNlIFhLX2RlYWRfZG91YmxlYWN1dGUgOgoJICAgICAgICByZXR1cm4gMHhiZDsJLyogJyIgKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2Nhcm9uCgkgICAgY2FzZSBYS19kZWFkX2Nhcm9uIDoKCSAgICAgICAgcmV0dXJuIDB4Yjc7CS8qICc8ICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9vZ29uZWsKCSAgICBjYXNlIFhLX2RlYWRfb2dvbmVrIDoKCSAgICAgICAgcmV0dXJuIDB4YjI7CS8qICc7ICovCiNlbmRpZgovKiBGSVhNRTogSSBkb24ndCBrbm93IHRoaXMgdGhyZWUuCgkgICAgY2FzZSBYS19kZWFkX2lvdGEgOgoJICAgICAgICByZXR1cm4gJ2knOwoJICAgIGNhc2UgWEtfZGVhZF92b2ljZWRfc291bmQgOgoJICAgICAgICByZXR1cm4gJ3YnOwoJICAgIGNhc2UgWEtfZGVhZF9zZW1pdm9pY2VkX3NvdW5kIDoKCSAgICAgICAgcmV0dXJuICdzJzsKKi8KCSAgICB9CglUUkFDRSgibm8gY2hhcmFjdGVyIGZvciBkZWFkIGtleXN5bSAweCUwOGx4XG4iLGtleXN5bSk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlUb1VuaWNvZGVFeCAoWDExRFJWLkApCiAqCiAqIFRoZSBUb1VuaWNvZGUgZnVuY3Rpb24gdHJhbnNsYXRlcyB0aGUgc3BlY2lmaWVkIHZpcnR1YWwta2V5IGNvZGUgYW5kIGtleWJvYXJkCiAqIHN0YXRlIHRvIHRoZSBjb3JyZXNwb25kaW5nIFdpbmRvd3MgY2hhcmFjdGVyIG9yIGNoYXJhY3RlcnMuCiAqCiAqIElmIHRoZSBzcGVjaWZpZWQga2V5IGlzIGEgZGVhZCBrZXksIHRoZSByZXR1cm4gdmFsdWUgaXMgbmVnYXRpdmUuIE90aGVyd2lzZSwKICogaXQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogKiBWYWx1ZQlNZWFuaW5nCiAqIDAJVGhlIHNwZWNpZmllZCB2aXJ0dWFsIGtleSBoYXMgbm8gdHJhbnNsYXRpb24gZm9yIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBrZXlib2FyZC4KICogMQlPbmUgV2luZG93cyBjaGFyYWN0ZXIgd2FzIGNvcGllZCB0byB0aGUgYnVmZmVyLgogKiAyCVR3byBjaGFyYWN0ZXJzIHdlcmUgY29waWVkIHRvIHRoZSBidWZmZXIuIFRoaXMgdXN1YWxseSBoYXBwZW5zIHdoZW4gYQogKiAgICAgIGRlYWQta2V5IGNoYXJhY3RlciAoYWNjZW50IG9yIGRpYWNyaXRpYykgc3RvcmVkIGluIHRoZSBrZXlib2FyZCBsYXlvdXQgY2Fubm90CiAqICAgICAgYmUgY29tcG9zZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHZpcnR1YWwga2V5IHRvIGZvcm0gYSBzaW5nbGUgY2hhcmFjdGVyLgogKgogKiBGSVhNRSA6IHNob3VsZCBkbyB0aGUgYWJvdmUgKHJldHVybiAyIGZvciBub24gbWF0Y2hpbmcgZGVhZGNoYXIrY2hhciBjb21iaW5hdGlvbnMpCiAqCiAqLwpJTlQgWDExRFJWX1RvVW5pY29kZUV4KFVJTlQgdmlydEtleSwgVUlOVCBzY2FuQ29kZSwgTFBCWVRFIGxwS2V5U3RhdGUsCgkJICAgICBMUFdTVFIgYnVmVywgaW50IGJ1Zldfc2l6ZSwgVUlOVCBmbGFncywgSEtMIGhrbCkKewogICAgRGlzcGxheSAqZGlzcGxheSA9IHRocmVhZF9kaXNwbGF5KCk7CiAgICBYS2V5RXZlbnQgZTsKICAgIEtleVN5bSBrZXlzeW0gPSAwOwogICAgSU5UIHJldDsKICAgIGludCBrZXljOwogICAgY2hhciBscENoYXJbMTBdOwogICAgSFdORCBmb2N1czsKICAgIFhJQyB4aWM7CgogICAgaWYgKHNjYW5Db2RlICYgMHg4MDAwKQogICAgewogICAgICAgIFRSQUNFKCJLZXkgVVAsIGRvaW5nIG5vdGhpbmdcbiIgKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAoaGtsICE9IFgxMURSVl9HZXRLZXlib2FyZExheW91dCgwKSkKICAgICAgICBGSVhNRSgia2V5Ym9hcmQgbGF5b3V0ICVwIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGhrbCk7CgogICAgZS5kaXNwbGF5ID0gZGlzcGxheTsKICAgIGUua2V5Y29kZSA9IDA7CiAgICBlLnN0YXRlID0gMDsKICAgIGUudHlwZSA9IEtleVByZXNzOwoKICAgIGZvY3VzID0gR2V0Rm9jdXMoKTsKICAgIGlmIChmb2N1cykgZm9jdXMgPSBHZXRBbmNlc3RvciggZm9jdXMsIEdBX1JPT1QgKTsKICAgIGlmICghZm9jdXMpIGZvY3VzID0gR2V0QWN0aXZlV2luZG93KCk7CiAgICBlLndpbmRvdyA9IFgxMURSVl9nZXRfd2hvbGVfd2luZG93KCBmb2N1cyApOwogICAgeGljID0gWDExRFJWX2dldF9pYyggZm9jdXMgKTsKCiAgICBpZiAobHBLZXlTdGF0ZVtWS19TSElGVF0gJiAweDgwKQogICAgewoJVFJBQ0UoIlNoaWZ0TWFzayA9ICUwNHhcbiIsIFNoaWZ0TWFzayk7CgllLnN0YXRlIHw9IFNoaWZ0TWFzazsKICAgIH0KICAgIGlmIChscEtleVN0YXRlW1ZLX0NBUElUQUxdICYgMHgwMSkKICAgIHsKCVRSQUNFKCJMb2NrTWFzayA9ICUwNHhcbiIsIExvY2tNYXNrKTsKCWUuc3RhdGUgfD0gTG9ja01hc2s7CiAgICB9CiAgICBpZiAobHBLZXlTdGF0ZVtWS19DT05UUk9MXSAmIDB4ODApCiAgICB7CglUUkFDRSgiQ29udHJvbE1hc2sgPSAlMDR4XG4iLCBDb250cm9sTWFzayk7CgllLnN0YXRlIHw9IENvbnRyb2xNYXNrOwogICAgfQogICAgaWYgKGxwS2V5U3RhdGVbVktfTlVNTE9DS10gJiAweDAxKQogICAgewoJVFJBQ0UoIk51bUxvY2tNYXNrID0gJTA0eFxuIiwgTnVtTG9ja01hc2spOwoJZS5zdGF0ZSB8PSBOdW1Mb2NrTWFzazsKICAgIH0KCiAgICAvKiBSZXN0b3JlIHNhdmVkIEFsdEdyIHN0YXRlICovCiAgICBUUkFDRSgiQWx0R3JNYXNrID0gJTA0eFxuIiwgQWx0R3JNYXNrKTsKICAgIGUuc3RhdGUgfD0gQWx0R3JNYXNrOwoKICAgIFRSQUNFXyhrZXkpKCIoJTA0WCwgJTA0WCkgOiBmYWtlZCBzdGF0ZSA9IDB4JTA0eFxuIiwKCQl2aXJ0S2V5LCBzY2FuQ29kZSwgZS5zdGF0ZSk7CiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIC8qIFdlIGV4aXQgb24gdGhlIGZpcnN0IGtleWNvZGUgZm91bmQsIHRvIHNwZWVkIHVwIHRoZSB0aGluZy4gKi8KICAgIGZvciAoa2V5Yz1taW5fa2V5Y29kZTsgKGtleWM8PW1heF9rZXljb2RlKSAmJiAoIWUua2V5Y29kZSkgOyBrZXljKyspCiAgICAgIHsgLyogRmluZCBhIGtleWNvZGUgdGhhdCBjb3VsZCBoYXZlIGdlbmVyYXRlZCB0aGlzIHZpcnR1YWwga2V5ICovCiAgICAgICAgICBpZiAgKChrZXljMnZrZXlba2V5Y10gJiAweEZGKSA9PSB2aXJ0S2V5KQogICAgICAgICAgeyAvKiBXZSBmaWx0ZXIgdGhlIGV4dGVuZGVkIGJpdCwgd2UgZG9uJ3Qga25vdyBpdCAqLwogICAgICAgICAgICAgIGUua2V5Y29kZSA9IGtleWM7IC8qIFN0b3JlIGl0IHRlbXBvcmFyaWx5ICovCiAgICAgICAgICAgICAgaWYgKChFVkVOVF9ldmVudF90b192a2V5KHhpYywmZSkgJiAweEZGKSAhPSB2aXJ0S2V5KSB7CiAgICAgICAgICAgICAgICAgIGUua2V5Y29kZSA9IDA7IC8qIFdyb25nIG9uZSAoZXg6IGJlY2F1c2Ugb2YgdGhlIE51bUxvY2sKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKSwgc28gc2V0IGl0IHRvIDAsIHdlJ2xsIGZpbmQgYW5vdGhlciBvbmUgKi8KICAgICAgICAgICAgICB9CgkgIH0KICAgICAgfQoKICAgIGlmICgodmlydEtleT49VktfTlVNUEFEMCkgJiYgKHZpcnRLZXk8PVZLX05VTVBBRDkpKQogICAgICAgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCB2aXJ0S2V5LVZLX05VTVBBRDArWEtfS1BfMCk7CgogICAgaWYgKHZpcnRLZXk9PVZLX0RFQ0lNQUwpCiAgICAgICAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIFhLX0tQX0RlY2ltYWwpOwoKICAgIGlmICghZS5rZXljb2RlICYmIHZpcnRLZXkgIT0gVktfTk9OQU1FKQogICAgICB7CglXQVJOKCJVbmtub3duIHZpcnR1YWwga2V5ICVYICEhISBcbiIsdmlydEtleSk7CiAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKCXJldHVybiB2aXJ0S2V5OyAvKiB3aGF0ZXZlciAqLwogICAgICB9CiAgICBlbHNlIFRSQUNFKCJGb3VuZCBrZXljb2RlICVkICgweCUyWClcbiIsZS5rZXljb2RlLGUua2V5Y29kZSk7CgogICAgVFJBQ0VfKGtleSkoInR5cGUgJWQsIHdpbmRvdyAlbHgsIHN0YXRlIDB4JTA0eCwga2V5Y29kZSAweCUwNHhcbiIsCgkJZS50eXBlLCBlLndpbmRvdywgZS5zdGF0ZSwgZS5rZXljb2RlKTsKCiAgICBpZiAoeGljKQogICAgICAgIHJldCA9IFhtYkxvb2t1cFN0cmluZyh4aWMsICZlLCBscENoYXIsIHNpemVvZihscENoYXIpLCAma2V5c3ltLCBOVUxMKTsKICAgIGVsc2UKICAgICAgICByZXQgPSBYTG9va3VwU3RyaW5nKCZlLCBscENoYXIsIHNpemVvZihscENoYXIpLCAma2V5c3ltLCBOVUxMKTsKICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CgogICAgaWYgKHJldCA9PSAwKQoJewoJQllURSBkZWFkX2NoYXI7CgojaWZkZWYgWEtfRXVyb1NpZ24KICAgICAgICAvKiBBbiB1Z2x5IGhhY2sgZm9yIEV1cm9TaWduOiBYIGNhbid0IHRyYW5zbGF0ZSBpdCB0byBhIGNoYXJhY3RlcgogICAgICAgICAgIGZvciBzb21lIGxvY2FsZXMuICovCiAgICAgICAgaWYgKGtleXN5bSA9PSBYS19FdXJvU2lnbikKICAgICAgICB7CiAgICAgICAgICAgIGJ1ZldbMF0gPSAweDIwQUM7CiAgICAgICAgICAgIHJldCA9IDE7CiAgICAgICAgICAgIGdvdG8gZm91bmQ7CiAgICAgICAgfQojZW5kaWYKCWRlYWRfY2hhciA9IEtFWUJPQVJEX01hcERlYWRLZXlzeW0oa2V5c3ltKTsKCWlmIChkZWFkX2NoYXIpCgkgICAgewoJICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVU5JWENQLCAwLCAmZGVhZF9jaGFyLCAxLCBidWZXLCBidWZXX3NpemUpOwoJICAgIHJldCA9IC0xOwoJICAgIH0KCWVsc2UKCSAgICB7CgkgICAgY2hhcgkqa3NuYW1lOwoKICAgICAgICAgICAgd2luZV90c3gxMV9sb2NrKCk7CgkgICAga3NuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CiAgICAgICAgICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CgkgICAgaWYgKCFrc25hbWUpCgkJa3NuYW1lID0gIk5vIE5hbWUiOwoJICAgIGlmICgoa2V5c3ltID4+IDgpICE9IDB4ZmYpCgkJewoJCUVSUigiUGxlYXNlIHJlcG9ydDogbm8gY2hhciBmb3Iga2V5c3ltICUwNGxYICglcykgOlxuIiwKICAgICAgICAgICAgICAgICAgICBrZXlzeW0sIGtzbmFtZSk7CgkJRVJSKCIodmlydEtleT0lWCxzY2FuQ29kZT0lWCxrZXljb2RlPSVYLHN0YXRlPSVYKVxuIiwKICAgICAgICAgICAgICAgICAgICB2aXJ0S2V5LCBzY2FuQ29kZSwgZS5rZXljb2RlLCBlLnN0YXRlKTsKCQl9CgkgICAgfQoJfQogICAgZWxzZSB7ICAvKiByZXQgIT0gMCAqLwogICAgICAgIC8qIFdlIGhhdmUgYSBzcGVjaWFsIGNhc2UgdG8gaGFuZGxlIDogU2hpZnQgKyBhcnJvdywgc2hpZnQgKyBob21lLCAuLi4KICAgICAgICAgICBYIHJldHVybnMgYSBjaGFyIGZvciBpdCwgYnV0IFdpbmRvd3MgZG9lc24ndC4gTGV0J3MgZWF0IGl0LiAqLwogICAgICAgIGlmICghKGUuc3RhdGUgJiBOdW1Mb2NrTWFzaykgIC8qIE51bUxvY2sgaXMgb2ZmICovCiAgICAgICAgICAgICYmIChlLnN0YXRlICYgU2hpZnRNYXNrKSAvKiBTaGlmdCBpcyBwcmVzc2VkICovCiAgICAgICAgICAgICYmIChrZXlzeW0+PVhLX0tQXzApICYmIChrZXlzeW08PVhLX0tQXzkpKQogICAgICAgIHsKICAgICAgICAgICAgbHBDaGFyWzBdID0gMDsKICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICB9CgogICAgICAgIC8qIG1vcmUgYXJlYXMgd2hlcmUgWCByZXR1cm5zIGNoYXJhY3RlcnMgYnV0IFdpbmRvd3MgZG9lcyBub3QKICAgICAgICAgICBDVFJMICsgbnVtYmVyIG9yIENUUkwgKyBzeW1ib2wgKi8KICAgICAgICBpZiAoZS5zdGF0ZSAmIENvbnRyb2xNYXNrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCgoa2V5c3ltPj0zMykgJiYgKGtleXN5bSA8ICdBJykpIHx8CiAgICAgICAgICAgICAgICAoKGtleXN5bSA+ICdaJykgJiYgKGtleXN5bSA8ICdhJykpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBscENoYXJbMF0gPSAwOwogICAgICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyogV2UgaGF2ZSBhbm90aGVyIHNwZWNpYWwgY2FzZSBmb3IgZGVsZXRlIGtleSAoWEtfRGVsZXRlKSBvbiBhbgogICAgICAgICBleHRlbmRlZCBrZXlib2FyZC4gWCByZXR1cm5zIGEgY2hhciBmb3IgaXQsIGJ1dCBXaW5kb3dzIGRvZXNuJ3QgKi8KICAgICAgICBpZiAoa2V5c3ltID09IFhLX0RlbGV0ZSkKICAgICAgICB7CiAgICAgICAgICAgIGxwQ2hhclswXSA9IDA7CiAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgfQoJZWxzZSBpZigobHBLZXlTdGF0ZVtWS19TSElGVF0gJiAweDgwKSAvKiBTaGlmdCBpcyBwcmVzc2VkICovCgkJJiYgKGtleXN5bSA9PSBYS19LUF9EZWNpbWFsKSkKICAgICAgICB7CiAgICAgICAgICAgIGxwQ2hhclswXSA9IDA7CiAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgfQoKCS8qIHBlcmZvcm0gdHJhbnNsYXRpb24gdG8gdW5pY29kZSAqLwoJaWYocmV0KQoJewoJICAgIFRSQUNFXyhrZXkpKCJUcmFuc2xhdGluZyBjaGFyIDB4JTAyeCB0byB1bmljb2RlXG4iLCAqKEJZVEUgKilscENoYXIpOwoJICAgIHJldCA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVU5JWENQLCAwLCBscENoYXIsIHJldCwgYnVmVywgYnVmV19zaXplKTsKCX0KICAgIH0KCmZvdW5kOgogICAgVFJBQ0VfKGtleSkoIlRvVW5pY29kZSBhYm91dCB0byByZXR1cm4gJWQgd2l0aCBjaGFyICV4ICVzXG4iLAoJCXJldCwgKHJldCAmJiBidWZXKSA/IGJ1ZldbMF0gOiAwLCBidWZXID8gIiIgOiAiKG5vIGJ1ZmZlcikiKTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQmVlcCAoWDExRFJWLkApCiAqLwp2b2lkIFgxMURSVl9CZWVwKHZvaWQpCnsKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgWEJlbGwodGhyZWFkX2Rpc3BsYXkoKSwgMCk7CiAgICB3aW5lX3RzeDExX3VubG9jaygpOwp9Cg==