LyoKICogVW5pdCB0ZXN0cyBmb3IgKGEgZmV3KSBkZHJhdyBzdXJmYWNlIGZ1bmN0aW9ucwogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDUgQW50b2luZSBDaGF2YXNzZSAoYS5jaGF2YXNzZUBnbWFpbC5jb20pCiAqIENvcHlyaWdodCAoQykgMjAwNSBDaHJpc3RpYW4gQ29zdGEKICogQ29weXJpZ2h0IDIwMDUgSXZhbiBMZW8gUHVvdGkKICogQ29weXJpZ2h0IChDKSAyMDA3IFN0ZWZhbiBE9nNpbmdlcgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCiNkZWZpbmUgQ09CSk1BQ1JPUwoKI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSAid2luZS90ZXN0LmgiCiNpbmNsdWRlICJkZHJhdy5oIgojaW5jbHVkZSAidW5rbnduLmgiCgpzdGF0aWMgTFBESVJFQ1REUkFXIGxwREQgPSBOVUxMOwoKc3RhdGljIEJPT0wgQ3JlYXRlRGlyZWN0RHJhdyh2b2lkKQp7CiAgICBIUkVTVUxUIHJjOwoKICAgIHJjID0gRGlyZWN0RHJhd0NyZWF0ZShOVUxMLCAmbHBERCwgTlVMTCk7CiAgICBvayhyYz09RERfT0sgfHwgcmM9PURERVJSX05PRElSRUNURFJBV1NVUFBPUlQsICJEaXJlY3REcmF3Q3JlYXRlRXggcmV0dXJuZWQ6ICV4XG4iLCByYyk7CiAgICBpZiAoIWxwREQpIHsKICAgICAgICB0cmFjZSgiRGlyZWN0RHJhd0NyZWF0ZUV4KCkgZmFpbGVkIHdpdGggYW4gZXJyb3IgJXhcbiIsIHJjKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgcmMgPSBJRGlyZWN0RHJhd19TZXRDb29wZXJhdGl2ZUxldmVsKGxwREQsIE5VTEwsIEREU0NMX05PUk1BTCk7CiAgICBvayhyYz09RERfT0ssIlNldENvb3BlcmF0aXZlTGV2ZWwgcmV0dXJuZWQ6ICV4XG4iLHJjKTsKCiAgICByZXR1cm4gVFJVRTsKfQoKCnN0YXRpYyB2b2lkIFJlbGVhc2VEaXJlY3REcmF3KHZvaWQpCnsKICAgIGlmKCBscEREICE9IE5VTEwgKQogICAgewogICAgICAgIElEaXJlY3REcmF3X1JlbGVhc2UobHBERCk7CiAgICAgICAgbHBERCA9IE5VTEw7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIE1pcE1hcENyZWF0aW9uVGVzdCh2b2lkKQp7CiAgICBMUERJUkVDVERSQVdTVVJGQUNFIGxwRERTTWlwTWFwVGVzdDsKICAgIEREU1VSRkFDRURFU0MgZGRzZDsKICAgIEhSRVNVTFQgcmM7CgogICAgLyogRmlyc3QgbWlwbWFwIGNyZWF0aW9uIHRlc3Q6IGNyZWF0ZSBhIHN1cmZhY2Ugd2l0aCBERFNDQVBTX0NPTVBMRVgsCiAgICAgICBERFNDQVBTX01JUE1BUCwgYW5kIEREU0RfTUlQTUFQQ09VTlQuIFRoaXMgY3JlYXRlIHRoZSBudW1iZXIgb2YKICAgICAgICByZXF1ZXN0ZWQgbWlwbWFwIGxldmVscy4gKi8KICAgIGRkc2QuZHdTaXplID0gc2l6ZW9mKGRkc2QpOwogICAgZGRzZC5kd0ZsYWdzID0gRERTRF9DQVBTIHwgRERTRF9XSURUSCB8IEREU0RfSEVJR0hUIHwgRERTRF9NSVBNQVBDT1VOVDsKICAgIGRkc2QuZGRzQ2Fwcy5kd0NhcHMgPSBERFNDQVBTX1RFWFRVUkUgfCBERFNDQVBTX0NPTVBMRVggfCBERFNDQVBTX01JUE1BUDsKICAgIFUyKGRkc2QpLmR3TWlwTWFwQ291bnQgPSAzOwogICAgZGRzZC5kd1dpZHRoID0gMTI4OwogICAgZGRzZC5kd0hlaWdodCA9IDMyOwogICAgcmMgPSBJRGlyZWN0RHJhd19DcmVhdGVTdXJmYWNlKGxwREQsICZkZHNkLCAmbHBERFNNaXBNYXBUZXN0LCBOVUxMKTsKICAgIG9rKHJjPT1ERF9PSywiQ3JlYXRlU3VyZmFjZSByZXR1cm5lZDogJXhcbiIscmMpOwogICAgaWYgKEZBSUxFRChyYykpIHsKCXNraXAoImZhaWxlZCB0byBjcmVhdGUgc3VyZmFjZVxuIik7CglyZXR1cm47CiAgICB9CgogICAgLyogQ2hlY2sgdGhlIG51bWJlciBvZiBjcmVhdGVkIG1pcG1hcHMgKi8KICAgIG1lbXNldCgmZGRzZCwgMCwgc2l6ZW9mKEREU1VSRkFDRURFU0MpKTsKICAgIGRkc2QuZHdTaXplID0gc2l6ZW9mKGRkc2QpOwogICAgcmMgPSBJRGlyZWN0RHJhd1N1cmZhY2VfR2V0U3VyZmFjZURlc2MobHBERFNNaXBNYXBUZXN0LCAmZGRzZCk7CiAgICBvayhyYz09RERfT0ssIkdldFN1cmZhY2VEZXNjIHJldHVybmVkOiAleFxuIixyYyk7CiAgICBvayhkZHNkLmR3RmxhZ3MgJiBERFNEX01JUE1BUENPVU5ULAogICAgICAgICJHZXRTdXJmYWNlRGVzYyByZXR1cm5lZCBubyBtaXBtYXBjb3VudC5cbiIpOwogICAgb2soVTIoZGRzZCkuZHdNaXBNYXBDb3VudCA9PSAzLCAiSW5jb3JyZWN0IG1pcG1hcCBjb3VudDogJWQuXG4iLAogICAgICAgIFUyKGRkc2QpLmR3TWlwTWFwQ291bnQpOwoKICAgIC8qIERlc3Ryb3kgdGhlIHN1cmZhY2UuICovCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VfUmVsZWFzZShscEREU01pcE1hcFRlc3QpOwoKCiAgICAvKiBTZWNvbmQgbWlwbWFwIGNyZWF0aW9uIHRlc3Q6IGNyZWF0ZSBhIHN1cmZhY2Ugd2l0aG91dCBhIG1pcG1hcAogICAgICAgY291bnQsIHdpdGggRERTQ0FQU19NSVBNQVAgYW5kIHdpdGhvdXQgRERTQ0FQU19DT01QTEVYLgogICAgICAgVGhpcyBjcmVhdGVzIGEgc2luZ2xlIG1pcG1hcCBsZXZlbC4gKi8KICAgIG1lbXNldCgmZGRzZCwgMCwgc2l6ZW9mKEREU1VSRkFDRURFU0MpKTsKICAgIGRkc2QuZHdTaXplID0gc2l6ZW9mKGRkc2QpOwogICAgZGRzZC5kd0ZsYWdzID0gRERTRF9DQVBTIHwgRERTRF9XSURUSCB8IEREU0RfSEVJR0hUOwogICAgZGRzZC5kZHNDYXBzLmR3Q2FwcyA9IEREU0NBUFNfVEVYVFVSRSB8IEREU0NBUFNfTUlQTUFQOwogICAgZGRzZC5kd1dpZHRoID0gMTI4OwogICAgZGRzZC5kd0hlaWdodCA9IDMyOwogICAgcmMgPSBJRGlyZWN0RHJhd19DcmVhdGVTdXJmYWNlKGxwREQsICZkZHNkLCAmbHBERFNNaXBNYXBUZXN0LCBOVUxMKTsKICAgIG9rKHJjPT1ERF9PSywiQ3JlYXRlU3VyZmFjZSByZXR1cm5lZDogJXhcbiIscmMpOwogICAgaWYgKEZBSUxFRChyYykpIHsKCXNraXAoImZhaWxlZCB0byBjcmVhdGUgc3VyZmFjZVxuIik7CglyZXR1cm47CiAgICB9CiAgICAvKiBDaGVjayB0aGUgbnVtYmVyIG9mIGNyZWF0ZWQgbWlwbWFwcyAqLwogICAgbWVtc2V0KCZkZHNkLCAwLCBzaXplb2YoRERTVVJGQUNFREVTQykpOwogICAgZGRzZC5kd1NpemUgPSBzaXplb2YoZGRzZCk7CiAgICByYyA9IElEaXJlY3REcmF3U3VyZmFjZV9HZXRTdXJmYWNlRGVzYyhscEREU01pcE1hcFRlc3QsICZkZHNkKTsKICAgIG9rKHJjPT1ERF9PSywiR2V0U3VyZmFjZURlc2MgcmV0dXJuZWQ6ICV4XG4iLHJjKTsKICAgIG9rKGRkc2QuZHdGbGFncyAmIEREU0RfTUlQTUFQQ09VTlQsCiAgICAgICAgIkdldFN1cmZhY2VEZXNjIHJldHVybmVkIG5vIG1pcG1hcGNvdW50LlxuIik7CiAgICBvayhVMihkZHNkKS5kd01pcE1hcENvdW50ID09IDEsICJJbmNvcnJlY3QgbWlwbWFwIGNvdW50OiAlZC5cbiIsCiAgICAgICAgVTIoZGRzZCkuZHdNaXBNYXBDb3VudCk7CgogICAgLyogRGVzdHJveSB0aGUgc3VyZmFjZS4gKi8KICAgIElEaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlKGxwRERTTWlwTWFwVGVzdCk7CgoKICAgIC8qIFRoaXJkIG1pcG1hcCBjcmVhdGlvbiB0ZXN0OiBjcmVhdGUgYSBzdXJmYWNlIHdpdGggRERTQ0FQU19NSVBNQVAsCiAgICAgICAgRERTQ0FQU19DT01QTEVYIGFuZCB3aXRob3V0IEREU0RfTUlQTUFQQ09VTlQuCiAgICAgICBJdCdzIGFuIHVuZG9jdW1lbnRlZCBmZWF0dXJlcyB3aGVyZSBhIGNoYWluIG9mIG1pcG1hcHMsIHN0YXJ0aW5nIGZyb20KICAgICAgIGhlIHNwZWNpZmllZCBzaXplIGFuZCBkb3duIHRvIHRoZSBzbWFsbGVzdCBzaXplLCBpcyBhdXRvbWF0aWNhbGx5CiAgICAgICBjcmVhdGVkLgogICAgICAgQW5hcmNoeSBPbmxpbmUgbmVlZHMgdGhpcyBmZWF0dXJlIHRvIHdvcmsuICovCiAgICBtZW1zZXQoJmRkc2QsIDAsIHNpemVvZihERFNVUkZBQ0VERVNDKSk7CiAgICBkZHNkLmR3U2l6ZSA9IHNpemVvZihkZHNkKTsKICAgIGRkc2QuZHdGbGFncyA9IEREU0RfQ0FQUyB8IEREU0RfV0lEVEggfCBERFNEX0hFSUdIVDsKICAgIGRkc2QuZGRzQ2Fwcy5kd0NhcHMgPSBERFNDQVBTX1RFWFRVUkUgfCBERFNDQVBTX0NPTVBMRVggfCBERFNDQVBTX01JUE1BUDsKICAgIGRkc2QuZHdXaWR0aCA9IDEyODsKICAgIGRkc2QuZHdIZWlnaHQgPSAzMjsKICAgIHJjID0gSURpcmVjdERyYXdfQ3JlYXRlU3VyZmFjZShscERELCAmZGRzZCwgJmxwRERTTWlwTWFwVGVzdCwgTlVMTCk7CiAgICBvayhyYz09RERfT0ssIkNyZWF0ZVN1cmZhY2UgcmV0dXJuZWQ6ICV4XG4iLHJjKTsKICAgIGlmIChGQUlMRUQocmMpKSB7Cglza2lwKCJmYWlsZWQgdG8gY3JlYXRlIHN1cmZhY2VcbiIpOwoJcmV0dXJuOwogICAgfQoKICAgIC8qIENoZWNrIHRoZSBudW1iZXIgb2YgY3JlYXRlZCBtaXBtYXBzICovCiAgICBtZW1zZXQoJmRkc2QsIDAsIHNpemVvZihERFNVUkZBQ0VERVNDKSk7CiAgICBkZHNkLmR3U2l6ZSA9IHNpemVvZihkZHNkKTsKICAgIHJjID0gSURpcmVjdERyYXdTdXJmYWNlX0dldFN1cmZhY2VEZXNjKGxwRERTTWlwTWFwVGVzdCwgJmRkc2QpOwogICAgb2socmM9PUREX09LLCJHZXRTdXJmYWNlRGVzYyByZXR1cm5lZDogJXhcbiIscmMpOwogICAgb2soZGRzZC5kd0ZsYWdzICYgRERTRF9NSVBNQVBDT1VOVCwKICAgICAgICAiR2V0U3VyZmFjZURlc2MgcmV0dXJuZWQgbm8gbWlwbWFwY291bnQuXG4iKTsKICAgIG9rKFUyKGRkc2QpLmR3TWlwTWFwQ291bnQgPT0gNiwgIkluY29ycmVjdCBtaXBtYXAgY291bnQ6ICVkLlxuIiwKICAgICAgICBVMihkZHNkKS5kd01pcE1hcENvdW50KTsKCiAgICAvKiBEZXN0cm95IHRoZSBzdXJmYWNlLiAqLwogICAgSURpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2UobHBERFNNaXBNYXBUZXN0KTsKCgogICAgLyogRm91cnRoIG1pcG1hcCBjcmVhdGlvbiB0ZXN0OiBzYW1lIGFzIGFib3ZlIHdpdGggYSBkaWZmZXJlbnQgdGV4dHVyZQogICAgICAgc2l6ZS4KICAgICAgIFRoZSBwdXJwb3NlIGlzIHRvIHZlcmlmeSB0aGF0IHRoZSBudW1iZXIgb2YgZ2VuZXJhdGVkIG1pcG1hcHMgaXMKICAgICAgIGRlcGVuZGVudCBvbiB0aGUgc21hbGxlc3QgZGltZW5zaW9uLiAqLwogICAgbWVtc2V0KCZkZHNkLCAwLCBzaXplb2YoRERTVVJGQUNFREVTQykpOwogICAgZGRzZC5kd1NpemUgPSBzaXplb2YoZGRzZCk7CiAgICBkZHNkLmR3RmxhZ3MgPSBERFNEX0NBUFMgfCBERFNEX1dJRFRIIHwgRERTRF9IRUlHSFQ7CiAgICBkZHNkLmRkc0NhcHMuZHdDYXBzID0gRERTQ0FQU19URVhUVVJFIHwgRERTQ0FQU19DT01QTEVYIHwgRERTQ0FQU19NSVBNQVA7CiAgICBkZHNkLmR3V2lkdGggPSAzMjsKICAgIGRkc2QuZHdIZWlnaHQgPSA2NDsKICAgIHJjID0gSURpcmVjdERyYXdfQ3JlYXRlU3VyZmFjZShscERELCAmZGRzZCwgJmxwRERTTWlwTWFwVGVzdCwgTlVMTCk7CiAgICBvayhyYz09RERfT0ssIkNyZWF0ZVN1cmZhY2UgcmV0dXJuZWQ6ICV4XG4iLHJjKTsKICAgIGlmIChGQUlMRUQocmMpKSB7Cglza2lwKCJmYWlsZWQgdG8gY3JlYXRlIHN1cmZhY2VcbiIpOwoJcmV0dXJuOwogICAgfQoKICAgIC8qIENoZWNrIHRoZSBudW1iZXIgb2YgY3JlYXRlZCBtaXBtYXBzICovCiAgICBtZW1zZXQoJmRkc2QsIDAsIHNpemVvZihERFNVUkZBQ0VERVNDKSk7CiAgICBkZHNkLmR3U2l6ZSA9IHNpemVvZihkZHNkKTsKICAgIHJjID0gSURpcmVjdERyYXdTdXJmYWNlX0dldFN1cmZhY2VEZXNjKGxwRERTTWlwTWFwVGVzdCwgJmRkc2QpOwogICAgb2socmM9PUREX09LLCJHZXRTdXJmYWNlRGVzYyByZXR1cm5lZDogJXhcbiIscmMpOwogICAgb2soZGRzZC5kd0ZsYWdzICYgRERTRF9NSVBNQVBDT1VOVCwKICAgICAgICAiR2V0U3VyZmFjZURlc2MgcmV0dXJuZWQgbm8gbWlwbWFwY291bnQuXG4iKTsKICAgIG9rKFUyKGRkc2QpLmR3TWlwTWFwQ291bnQgPT0gNiwgIkluY29ycmVjdCBtaXBtYXAgY291bnQ6ICVkLlxuIiwKICAgICAgICBVMihkZHNkKS5kd01pcE1hcENvdW50KTsKCiAgICAvKiBEZXN0cm95IHRoZSBzdXJmYWNlLiAqLwogICAgSURpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2UobHBERFNNaXBNYXBUZXN0KTsKCgogICAgLyogRmlmdGggbWlwbWFwIGNyZWF0aW9uIHRlc3Q6IHRyeSB0byBjcmVhdGUgYSBzdXJmYWNlIHdpdGgKICAgICAgIEREU0NBUFNfQ09NUExFWCwgRERTQ0FQU19NSVBNQVAsIEREU0RfTUlQTUFQQ09VTlQsCiAgICAgICB3aGVyZSBkd01pcE1hcENvdW50ID0gMC4gVGhpcyBzaG91bGQgZmFpbC4gKi8KCiAgICBkZHNkLmR3U2l6ZSA9IHNpemVvZihkZHNkKTsKICAgIGRkc2QuZHdGbGFncyA9IEREU0RfQ0FQUyB8IEREU0RfV0lEVEggfCBERFNEX0hFSUdIVCB8IEREU0RfTUlQTUFQQ09VTlQ7CiAgICBkZHNkLmRkc0NhcHMuZHdDYXBzID0gRERTQ0FQU19URVhUVVJFIHwgRERTQ0FQU19DT01QTEVYIHwgRERTQ0FQU19NSVBNQVA7CiAgICBVMihkZHNkKS5kd01pcE1hcENvdW50ID0gMDsKICAgIGRkc2QuZHdXaWR0aCA9IDEyODsKICAgIGRkc2QuZHdIZWlnaHQgPSAzMjsKICAgIHJjID0gSURpcmVjdERyYXdfQ3JlYXRlU3VyZmFjZShscERELCAmZGRzZCwgJmxwRERTTWlwTWFwVGVzdCwgTlVMTCk7CiAgICBvayhyYz09RERFUlJfSU5WQUxJRFBBUkFNUywiQ3JlYXRlU3VyZmFjZSByZXR1cm5lZDogJXhcbiIscmMpOwoKICAgIC8qIERlc3Ryb3kgdGhlIHN1cmZhY2UuICovCiAgICBpZiggcmMgPT0gRERfT0sgKQogICAgICAgIElEaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlKGxwRERTTWlwTWFwVGVzdCk7Cgp9CgpzdGF0aWMgdm9pZCBTcmNDb2xvcktleTMyQmxpdFRlc3Qodm9pZCkKewogICAgTFBESVJFQ1REUkFXU1VSRkFDRSBscFNyYzsKICAgIExQRElSRUNURFJBV1NVUkZBQ0UgbHBEc3Q7CiAgICBERFNVUkZBQ0VERVNDIGRkc2QsIGRkc2QyLCBkZHNkMzsKICAgIEREQ09MT1JLRVkgRERDb2xvcktleTsKICAgIExQRFdPUkQgbHBEYXRhOwogICAgSFJFU1VMVCByYzsKICAgIEREQkxURlggZng7CgogICAgZGRzZDIuZHdTaXplID0gc2l6ZW9mKGRkc2QyKTsKICAgIGRkc2QyLmRkcGZQaXhlbEZvcm1hdC5kd1NpemUgPSBzaXplb2YoZGRzZDIuZGRwZlBpeGVsRm9ybWF0KTsKCiAgICBkZHNkLmR3U2l6ZSA9IHNpemVvZihkZHNkKTsKICAgIGRkc2QuZGRwZlBpeGVsRm9ybWF0LmR3U2l6ZSA9IHNpemVvZihkZHNkLmRkcGZQaXhlbEZvcm1hdCk7CiAgICBkZHNkLmR3RmxhZ3MgPSBERFNEX0NBUFMgfCBERFNEX1dJRFRIIHwgRERTRF9IRUlHSFQgfCBERFNEX1BJWEVMRk9STUFUOwogICAgZGRzZC5kZHNDYXBzLmR3Q2FwcyA9IEREU0NBUFNfT0ZGU0NSRUVOUExBSU47CiAgICBkZHNkLmR3V2lkdGggPSA4MDA7CiAgICBkZHNkLmR3SGVpZ2h0ID0gNjAwOwogICAgZGRzZC5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyA9IEREUEZfUkdCOwogICAgVTEoZGRzZC5kZHBmUGl4ZWxGb3JtYXQpLmR3UkdCQml0Q291bnQgPSAzMjsKICAgIFUyKGRkc2QuZGRwZlBpeGVsRm9ybWF0KS5kd1JCaXRNYXNrID0gMHhGRjAwMDA7CiAgICBVMyhkZHNkLmRkcGZQaXhlbEZvcm1hdCkuZHdHQml0TWFzayA9IDB4MDBGRjAwOwogICAgVTQoZGRzZC5kZHBmUGl4ZWxGb3JtYXQpLmR3QkJpdE1hc2sgPSAweDAwMDBGRjsKICAgIHJjID0gSURpcmVjdERyYXdfQ3JlYXRlU3VyZmFjZShscERELCAmZGRzZCwgJmxwRHN0LCBOVUxMKTsKICAgIG9rKHJjPT1ERF9PSywiQ3JlYXRlU3VyZmFjZSByZXR1cm5lZDogJXhcbiIscmMpOwogICAgaWYgKEZBSUxFRChyYykpIHsKCXNraXAoImZhaWxlZCB0byBjcmVhdGUgc3VyZmFjZVxuIik7CglyZXR1cm47CiAgICB9CgogICAgZGRzZC5kd0ZsYWdzIHw9IEREU0RfQ0tTUkNCTFQ7CiAgICBkZHNkLmRkY2tDS1NyY0JsdC5kd0NvbG9yU3BhY2VMb3dWYWx1ZSA9IDB4RkYwMEZGOwogICAgZGRzZC5kZGNrQ0tTcmNCbHQuZHdDb2xvclNwYWNlSGlnaFZhbHVlID0gMHhGRjAwRkY7CiAgICByYyA9IElEaXJlY3REcmF3X0NyZWF0ZVN1cmZhY2UobHBERCwgJmRkc2QsICZscFNyYywgTlVMTCk7CiAgICBvayhyYz09RERfT0ssIkNyZWF0ZVN1cmZhY2UgcmV0dXJuZWQ6ICV4XG4iLHJjKTsKICAgIGlmIChGQUlMRUQocmMpKSB7Cglza2lwKCJmYWlsZWQgdG8gY3JlYXRlIHN1cmZhY2VcbiIpOwoJcmV0dXJuOwogICAgfQoKICAgIHJjID0gSURpcmVjdERyYXdTdXJmYWNlX0xvY2sobHBEc3QsIE5VTEwsICZkZHNkMiwgRERMT0NLX1dBSVQsIE5VTEwpOwogICAgb2socmM9PUREX09LLCJMb2NrIHJldHVybmVkOiAleFxuIixyYyk7CiAgICBscERhdGEgPSAoTFBEV09SRClkZHNkMi5scFN1cmZhY2U7CiAgICBscERhdGFbMF0gPSAweENDQ0NDQ0NDOwogICAgbHBEYXRhWzFdID0gMHhDQ0NDQ0NDQzsKICAgIGxwRGF0YVsyXSA9IDB4Q0NDQ0NDQ0M7CiAgICBscERhdGFbM10gPSAweENDQ0NDQ0NDOwoKICAgIG1lbXNldCgmZGRzZDMsIDAsIHNpemVvZihkZHNkMykpOwogICAgZGRzZDMuZHdTaXplID0gc2l6ZW9mKGRkc2QzKTsKICAgIGRkc2QzLmRkcGZQaXhlbEZvcm1hdC5kd1NpemUgPSBzaXplb2YoZGRzZDMuZGRwZlBpeGVsRm9ybWF0KTsKICAgIHJjID0gSURpcmVjdERyYXdTdXJmYWNlX0dldFN1cmZhY2VEZXNjKGxwRHN0LCAmZGRzZDMpOwogICAgb2socmMgPT0gRERfT0ssICJJRGlyZWN0RHJhd1N1cmZhY2VfR2V0U3VyZmFjZURlc2MgYmV0d2VlbiBhIGxvY2svdW5sb2NrIHBhaXIgcmV0dXJuZWQgJTA4eFxuIiwgcmMpOwogICAgb2soZGRzZDMubHBTdXJmYWNlID09IGRkc2QzLmxwU3VyZmFjZSwgImxwU3VyZmFjZSBmcm9tIEdldFN1cmZhY2VEZXNjKCVwKSBkaWZmZXJzIGZyb20gdGhlIG9uZSByZXR1cm5lZCBieSBMb2NrKCVwKVxuIiwgZGRzZDMubHBTdXJmYWNlLCBkZHNkMi5scFN1cmZhY2UpOwoKICAgIHJjID0gSURpcmVjdERyYXdTdXJmYWNlX1VubG9jayhscERzdCwgTlVMTCk7CiAgICBvayhyYz09RERfT0ssIlVubG9jayByZXR1cm5lZDogJXhcbiIscmMpOwoKICAgIG1lbXNldCgmZGRzZDMsIDAsIHNpemVvZihkZHNkMykpOwogICAgZGRzZDMuZHdTaXplID0gc2l6ZW9mKGRkc2QzKTsKICAgIGRkc2QzLmRkcGZQaXhlbEZvcm1hdC5kd1NpemUgPSBzaXplb2YoZGRzZDMuZGRwZlBpeGVsRm9ybWF0KTsKICAgIHJjID0gSURpcmVjdERyYXdTdXJmYWNlX0dldFN1cmZhY2VEZXNjKGxwRHN0LCAmZGRzZDMpOwogICAgb2socmMgPT0gRERfT0ssICJJRGlyZWN0RHJhd1N1cmZhY2VfR2V0U3VyZmFjZURlc2MgYmV0d2VlbiBhIGxvY2svdW5sb2NrIHBhaXIgcmV0dXJuZWQgJTA4eFxuIiwgcmMpOwogICAgb2soZGRzZDMubHBTdXJmYWNlID09IE5VTEwsICJscFN1cmZhY2UgZnJvbSBHZXRTdXJmYWNlRGVzYyglcCkgaXMgbm90IE5VTEwgYWZ0ZXIgdW5sb2NrXG4iLCBkZHNkMy5scFN1cmZhY2UpOwoKICAgIHJjID0gSURpcmVjdERyYXdTdXJmYWNlX0xvY2sobHBTcmMsIE5VTEwsICZkZHNkMiwgRERMT0NLX1dBSVQsIE5VTEwpOwogICAgb2socmM9PUREX09LLCJMb2NrIHJldHVybmVkOiAleFxuIixyYyk7CiAgICBvaygoZGRzZDIuZHdGbGFncyAmIEREU0RfTFBTVVJGQUNFKSA9PSAwLCAiU3VyZmFjZSBkZXNjIGhhcyBMUFNVUkZBQ0UgRmxhZ3Mgc2V0XG4iKTsKICAgIGxwRGF0YSA9IChMUERXT1JEKWRkc2QyLmxwU3VyZmFjZTsKICAgIGxwRGF0YVswXSA9IDB4NzcwMTAyMDM7CiAgICBscERhdGFbMV0gPSAweDAwMDEwMjAzOwogICAgbHBEYXRhWzJdID0gMHg3N0ZGMDBGRjsKICAgIGxwRGF0YVszXSA9IDB4MDBGRjAwRkY7CiAgICByYyA9IElEaXJlY3REcmF3U3VyZmFjZV9VbmxvY2sobHBTcmMsIE5VTEwpOwogICAgb2socmM9PUREX09LLCJVbmxvY2sgcmV0dXJuZWQ6ICV4XG4iLHJjKTsKCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VfQmx0KGxwRHN0LCBOVUxMLCBscFNyYywgTlVMTCwgRERCTFRfS0VZU1JDLCBOVUxMKTsKCiAgICByYyA9IElEaXJlY3REcmF3U3VyZmFjZV9Mb2NrKGxwRHN0LCBOVUxMLCAmZGRzZDIsIERETE9DS19XQUlULCBOVUxMKTsKICAgIG9rKHJjPT1ERF9PSywiTG9jayByZXR1cm5lZDogJXhcbiIscmMpOwogICAgb2soKGRkc2QyLmR3RmxhZ3MgJiBERFNEX0xQU1VSRkFDRSkgPT0gMCwgIlN1cmZhY2UgZGVzYyBoYXMgTFBTVVJGQUNFIEZsYWdzIHNldFxuIik7CiAgICBscERhdGEgPSAoTFBEV09SRClkZHNkMi5scFN1cmZhY2U7CiAgICAvKiBEaWZmZXJlbnQgYmVoYXZpb3Igb24gc29tZSBkcml2ZXJzIC8gd2luZG93cyB2ZXJzaW9ucy4gU29tZSB2ZXJzaW9ucyBpZ25vcmUgdGhlIFggY2hhbm5lbCB3aGVuCiAgICAgKiBjb2xvciBrZXlpbmcsIGJ1dCBjb3B5IGl0IHRvIHRoZSBkZXN0aW5hdGlvbiBzdXJmYWNlLiBPdGhlcnMgYXBwbHkgaXQgZm9yIGNvbG9yIGtleWluZywgYnV0CiAgICAgKiBkbyBub3QgY29weSBpdCBpbnRvIHRoZSBkZXN0aW5hdGlvbiBzdXJmYWNlLgogICAgICovCiAgICBpZihscERhdGFbMF09PTB4MDAwMTAyMDMpIHsKICAgICAgICB0cmFjZSgiWCBjaGFubmVsIHdhcyBub3QgY29waWVkIGludG8gdGhlIGRlc3RpbmF0aW9uIHN1cmZhY2VcbiIpOwogICAgICAgIG9rKChscERhdGFbMF09PTB4MDAwMTAyMDMpJiYobHBEYXRhWzFdPT0weDAwMDEwMjAzKSYmKGxwRGF0YVsyXT09MHgwMEZGMDBGRikmJihscERhdGFbM109PTB4Q0NDQ0NDQ0MpLAogICAgICAgICAgICJEZXN0aW5hdGlvbiBkYXRhIGFmdGVyIGJsaXR0aW5nIGlzIG5vdCBjb3JyZWN0XG4iKTsKICAgIH0gZWxzZSB7CiAgICAgICAgb2soKGxwRGF0YVswXT09MHg3NzAxMDIwMykmJihscERhdGFbMV09PTB4MDAwMTAyMDMpJiYobHBEYXRhWzJdPT0weENDQ0NDQ0NDKSYmKGxwRGF0YVszXT09MHhDQ0NDQ0NDQyksCiAgICAgICAgICAgIkRlc3RpbmF0aW9uIGRhdGEgYWZ0ZXIgYmxpdHRpbmcgaXMgbm90IGNvcnJlY3RcbiIpOwogICAgfQogICAgcmMgPSBJRGlyZWN0RHJhd1N1cmZhY2VfVW5sb2NrKGxwRHN0LCBOVUxMKTsKICAgIG9rKHJjPT1ERF9PSywiVW5sb2NrIHJldHVybmVkOiAleFxuIixyYyk7CgogICAgLyogQWxzbyB0ZXN0IFNldENvbG9yS2V5ICovCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VfR2V0Q29sb3JLZXkobHBTcmMsIEREQ0tFWV9TUkNCTFQsICZERENvbG9yS2V5KTsKICAgIG9rKEREQ29sb3JLZXkuZHdDb2xvclNwYWNlTG93VmFsdWUgPT0gMHhGRjAwRkYgJiYgRERDb2xvcktleS5kd0NvbG9yU3BhY2VIaWdoVmFsdWUgPT0gMHhGRjAwRkYsCiAgICAgICAiR2V0Q29sb3JLZXkgZG9lcyBub3QgcmV0dXJuIHRoZSBjb2xvcmtleSB1c2VkIGF0IHN1cmZhY2UgY3JlYXRpb25cbiIpOwoKICAgIEREQ29sb3JLZXkuZHdDb2xvclNwYWNlTG93VmFsdWUgPSAweDAwRkYwMDsKICAgIEREQ29sb3JLZXkuZHdDb2xvclNwYWNlSGlnaFZhbHVlID0gMHgwMEZGMDA7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2VfU2V0Q29sb3JLZXkobHBTcmMsIEREQ0tFWV9TUkNCTFQsICZERENvbG9yS2V5KTsKCiAgICBERENvbG9yS2V5LmR3Q29sb3JTcGFjZUxvd1ZhbHVlID0gMDsKICAgIEREQ29sb3JLZXkuZHdDb2xvclNwYWNlSGlnaFZhbHVlID0gMDsKICAgIElEaXJlY3REcmF3U3VyZmFjZV9HZXRDb2xvcktleShscFNyYywgRERDS0VZX1NSQ0JMVCwgJkREQ29sb3JLZXkpOwogICAgb2soRERDb2xvcktleS5kd0NvbG9yU3BhY2VMb3dWYWx1ZSA9PSAweDAwRkYwMCAmJiBERENvbG9yS2V5LmR3Q29sb3JTcGFjZUhpZ2hWYWx1ZSA9PSAweDAwRkYwMCwKICAgICAgICJHZXRDb2xvcktleSBkb2VzIG5vdCByZXR1cm4gdGhlIGNvbG9ya2V5IHNldCB3aXRoIFNldENvbG9yS2V5XG4iKTsKCiAgICBkZHNkLmRkY2tDS1NyY0JsdC5kd0NvbG9yU3BhY2VMb3dWYWx1ZSA9IDA7CiAgICBkZHNkLmRkY2tDS1NyY0JsdC5kd0NvbG9yU3BhY2VIaWdoVmFsdWUgPSAwOwogICAgSURpcmVjdERyYXdTdXJmYWNlX0dldFN1cmZhY2VEZXNjKGxwU3JjLCAmZGRzZCk7CiAgICBvayhkZHNkLmRkY2tDS1NyY0JsdC5kd0NvbG9yU3BhY2VMb3dWYWx1ZSA9PSAweDAwRkYwMCAmJiBkZHNkLmRkY2tDS1NyY0JsdC5kd0NvbG9yU3BhY2VIaWdoVmFsdWUgPT0gMHgwMEZGMDAsCiAgICAgICAiR2V0U3VyZmFjZURlc2MgZG9lcyBub3QgcmV0dXJuIHRoZSBjb2xvcmtleSBzZXQgd2l0aCBTZXRDb2xvcktleVxuIik7CgogICAgSURpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2UobHBTcmMpOwogICAgSURpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2UobHBEc3QpOwoKICAgIC8qIHN0YXJ0IHdpdGggYSBuZXcgc2V0IG9mIHN1cmZhY2VzIHRvIHRlc3QgdGhlIGNvbG9yIGtleWluZyBwYXJhbWV0ZXJzIHRvIGJsaXQgKi8KICAgIG1lbXNldCgmZGRzZCwgMCwgc2l6ZW9mKGRkc2QpKTsKICAgIGRkc2QuZHdTaXplID0gc2l6ZW9mKGRkc2QpOwogICAgZGRzZC5kZHBmUGl4ZWxGb3JtYXQuZHdTaXplID0gc2l6ZW9mKGRkc2QuZGRwZlBpeGVsRm9ybWF0KTsKICAgIGRkc2QuZHdGbGFncyA9IEREU0RfQ0FQUyB8IEREU0RfV0lEVEggfCBERFNEX0hFSUdIVCB8IEREU0RfUElYRUxGT1JNQVQgfCBERFNEX0NLU1JDQkxUIHwgRERTRF9DS0RFU1RCTFQ7CiAgICBkZHNkLmRkc0NhcHMuZHdDYXBzID0gRERTQ0FQU19PRkZTQ1JFRU5QTEFJTjsKICAgIGRkc2QuZHdXaWR0aCA9IDgwMDsKICAgIGRkc2QuZHdIZWlnaHQgPSA2MDA7CiAgICBkZHNkLmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzID0gRERQRl9SR0I7CiAgICBVMShkZHNkLmRkcGZQaXhlbEZvcm1hdCkuZHdSR0JCaXRDb3VudCA9IDMyOwogICAgVTIoZGRzZC5kZHBmUGl4ZWxGb3JtYXQpLmR3UkJpdE1hc2sgPSAweEZGMDAwMDsKICAgIFUzKGRkc2QuZGRwZlBpeGVsRm9ybWF0KS5kd0dCaXRNYXNrID0gMHgwMEZGMDA7CiAgICBVNChkZHNkLmRkcGZQaXhlbEZvcm1hdCkuZHdCQml0TWFzayA9IDB4MDAwMEZGOwogICAgZGRzZC5kZGNrQ0tEZXN0Qmx0LmR3Q29sb3JTcGFjZUxvd1ZhbHVlID0gMHhGRjAwMDA7CiAgICBkZHNkLmRkY2tDS0Rlc3RCbHQuZHdDb2xvclNwYWNlSGlnaFZhbHVlID0gMHhGRjAwMDA7CiAgICBkZHNkLmRkY2tDS1NyY0JsdC5kd0NvbG9yU3BhY2VMb3dWYWx1ZSA9IDB4MDBGRjAwOwogICAgZGRzZC5kZGNrQ0tTcmNCbHQuZHdDb2xvclNwYWNlSGlnaFZhbHVlID0gMHgwMEZGMDA7CiAgICByYyA9IElEaXJlY3REcmF3X0NyZWF0ZVN1cmZhY2UobHBERCwgJmRkc2QsICZscERzdCwgTlVMTCk7CiAgICBvayhyYz09RERfT0sgfHwgcmMgPT0gRERFUlJfTk9DT0xPUktFWUhXLCJDcmVhdGVTdXJmYWNlIHJldHVybmVkOiAleFxuIixyYyk7CiAgICBpZihGQUlMRUQocmMpKQogICAgewogICAgICAgIHNraXAoIkZhaWxlZCB0byBjcmVhdGUgc3VyZmFjZVxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIHN0YXJ0IHdpdGggYSBuZXcgc2V0IG9mIHN1cmZhY2VzIHRvIHRlc3QgdGhlIGNvbG9yIGtleWluZyBwYXJhbWV0ZXJzIHRvIGJsaXQgKi8KICAgIG1lbXNldCgmZGRzZCwgMCwgc2l6ZW9mKGRkc2QpKTsKICAgIGRkc2QuZHdTaXplID0gc2l6ZW9mKGRkc2QpOwogICAgZGRzZC5kZHBmUGl4ZWxGb3JtYXQuZHdTaXplID0gc2l6ZW9mKGRkc2QuZGRwZlBpeGVsRm9ybWF0KTsKICAgIGRkc2QuZHdGbGFncyA9IEREU0RfQ0FQUyB8IEREU0RfV0lEVEggfCBERFNEX0hFSUdIVCB8IEREU0RfUElYRUxGT1JNQVQgfCBERFNEX0NLU1JDQkxUIHwgRERTRF9DS0RFU1RCTFQ7CiAgICBkZHNkLmRkc0NhcHMuZHdDYXBzID0gRERTQ0FQU19PRkZTQ1JFRU5QTEFJTjsKICAgIGRkc2QuZHdXaWR0aCA9IDgwMDsKICAgIGRkc2QuZHdIZWlnaHQgPSA2MDA7CiAgICBkZHNkLmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzID0gRERQRl9SR0I7CiAgICBVMShkZHNkLmRkcGZQaXhlbEZvcm1hdCkuZHdSR0JCaXRDb3VudCA9IDMyOwogICAgVTIoZGRzZC5kZHBmUGl4ZWxGb3JtYXQpLmR3UkJpdE1hc2sgPSAweEZGMDAwMDsKICAgIFUzKGRkc2QuZGRwZlBpeGVsRm9ybWF0KS5kd0dCaXRNYXNrID0gMHgwMEZGMDA7CiAgICBVNChkZHNkLmRkcGZQaXhlbEZvcm1hdCkuZHdCQml0TWFzayA9IDB4MDAwMEZGOwogICAgZGRzZC5kZGNrQ0tTcmNCbHQuZHdDb2xvclNwYWNlTG93VmFsdWUgPSAweDAwMDBGRjsKICAgIGRkc2QuZGRja0NLU3JjQmx0LmR3Q29sb3JTcGFjZUhpZ2hWYWx1ZSA9IDB4MDAwMEZGOwogICAgZGRzZC5kZGNrQ0tEZXN0Qmx0LmR3Q29sb3JTcGFjZUxvd1ZhbHVlID0gMHgwMDAwMDA7CiAgICBkZHNkLmRkY2tDS0Rlc3RCbHQuZHdDb2xvclNwYWNlSGlnaFZhbHVlID0gMHgwMDAwMDA7CiAgICByYyA9IElEaXJlY3REcmF3X0NyZWF0ZVN1cmZhY2UobHBERCwgJmRkc2QsICZscFNyYywgTlVMTCk7CiAgICBvayhyYz09RERfT0sgfHwgcmMgPT0gRERFUlJfTk9DT0xPUktFWUhXLCJDcmVhdGVTdXJmYWNlIHJldHVybmVkOiAleFxuIixyYyk7CiAgICBpZihGQUlMRUQocmMpKQogICAgewogICAgICAgIHNraXAoIkZhaWxlZCB0byBjcmVhdGUgc3VyZmFjZVxuIik7CiAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2UobHBEc3QpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBtZW1zZXQoJmZ4LCAwLCBzaXplb2YoZngpKTsKICAgIGZ4LmR3U2l6ZSA9IHNpemVvZihmeCk7CiAgICBmeC5kZGNrU3JjQ29sb3JrZXkuZHdDb2xvclNwYWNlSGlnaFZhbHVlID0gMHgxMTAwMDA7CiAgICBmeC5kZGNrU3JjQ29sb3JrZXkuZHdDb2xvclNwYWNlTG93VmFsdWUgPSAweDExMDAwMDsKICAgIGZ4LmRkY2tEZXN0Q29sb3JrZXkuZHdDb2xvclNwYWNlSGlnaFZhbHVlID0gMHgwMDExMDA7CiAgICBmeC5kZGNrRGVzdENvbG9ya2V5LmR3Q29sb3JTcGFjZUxvd1ZhbHVlID0gMHgwMDExMDA7CgogICAgcmMgPSBJRGlyZWN0RHJhd1N1cmZhY2VfTG9jayhscFNyYywgTlVMTCwgJmRkc2QyLCBERExPQ0tfV0FJVCwgTlVMTCk7CiAgICBvayhyYz09RERfT0ssIkxvY2sgcmV0dXJuZWQ6ICV4XG4iLHJjKTsKICAgIG9rKChkZHNkMi5kd0ZsYWdzICYgRERTRF9MUFNVUkZBQ0UpID09IDAsICJTdXJmYWNlIGRlc2MgaGFzIExQU1VSRkFDRSBGbGFncyBzZXRcbiIpOwogICAgbHBEYXRhID0gKExQRFdPUkQpZGRzZDIubHBTdXJmYWNlOwogICAgbHBEYXRhWzBdID0gMHgwMDAwMDBGRjsgLyogQXBwbGllcyB0byBzcmMgYmx0IGtleSBpbiBzcmMgc3VyZmFjZSAqLwogICAgbHBEYXRhWzFdID0gMHgwMDAwMDAwMDsgLyogQXBwbGllcyB0byBkc3QgYmx0IGtleSBpbiBzcmMgc3VyZmFjZSAqLwogICAgbHBEYXRhWzJdID0gMHgwMEZGMDAwMDsgLyogRHN0IGNvbG9yIGtleSBpbiBkc3Qgc3VyZmFjZSAqLwogICAgbHBEYXRhWzNdID0gMHgwMDAwRkYwMDsgLyogU3JjIGNvbG9yIGtleSBpbiBkc3Qgc3VyZmFjZSAqLwogICAgbHBEYXRhWzRdID0gMHgwMDAwMTEwMDsgLyogU3JjIGNvbG9yIGtleSBpbiBkZGJsdGZ4ICovCiAgICBscERhdGFbNV0gPSAweDAwMTEwMDAwOyAvKiBEc3QgY29sb3Iga2V5IGluIGRkYmx0ZnggKi8KICAgIHJjID0gSURpcmVjdERyYXdTdXJmYWNlX1VubG9jayhscFNyYywgTlVMTCk7CiAgICBvayhyYz09RERfT0ssIlVubG9jayByZXR1cm5lZDogJXhcbiIscmMpOwoKICAgIHJjID0gSURpcmVjdERyYXdTdXJmYWNlX0xvY2sobHBEc3QsIE5VTEwsICZkZHNkMiwgRERMT0NLX1dBSVQsIE5VTEwpOwogICAgb2socmM9PUREX09LLCJMb2NrIHJldHVybmVkOiAleFxuIixyYyk7CiAgICBvaygoZGRzZDIuZHdGbGFncyAmIEREU0RfTFBTVVJGQUNFKSA9PSAwLCAiU3VyZmFjZSBkZXNjIGhhcyBMUFNVUkZBQ0UgRmxhZ3Mgc2V0XG4iKTsKICAgIGxwRGF0YSA9IChMUERXT1JEKWRkc2QyLmxwU3VyZmFjZTsKICAgIGxwRGF0YVswXSA9IDB4NTU1NTU1NTU7CiAgICBscERhdGFbMV0gPSAweDU1NTU1NTU1OwogICAgbHBEYXRhWzJdID0gMHg1NTU1NTU1NTsKICAgIGxwRGF0YVszXSA9IDB4NTU1NTU1NTU7CiAgICBscERhdGFbNF0gPSAweDU1NTU1NTU1OwogICAgbHBEYXRhWzVdID0gMHg1NTU1NTU1NTsKICAgIHJjID0gSURpcmVjdERyYXdTdXJmYWNlX1VubG9jayhscERzdCwgTlVMTCk7CiAgICBvayhyYz09RERfT0ssIlVubG9jayByZXR1cm5lZDogJXhcbiIscmMpOwoKICAgIC8qIFRlc3QgYSBibGl0IHdpdGhvdXQga2V5aW5nICovCiAgICByYyA9IElEaXJlY3REcmF3U3VyZmFjZV9CbHQobHBEc3QsIE5VTEwsIGxwU3JjLCBOVUxMLCAwLCAmZngpOwogICAgb2socmMgPT0gRERfT0ssICJJRGlyZWN0RHJhd1N1cmZhY2VfQmx0IHJldHVybmVkICUwOHhcbiIsIHJjKTsKCiAgICByYyA9IElEaXJlY3REcmF3U3VyZmFjZV9Mb2NrKGxwRHN0LCBOVUxMLCAmZGRzZDIsIERETE9DS19XQUlULCBOVUxMKTsKICAgIG9rKHJjPT1ERF9PSywiTG9jayByZXR1cm5lZDogJXhcbiIscmMpOwogICAgb2soKGRkc2QyLmR3RmxhZ3MgJiBERFNEX0xQU1VSRkFDRSkgPT0gMCwgIlN1cmZhY2UgZGVzYyBoYXMgTFBTVVJGQUNFIEZsYWdzIHNldFxuIik7CiAgICBscERhdGEgPSAoTFBEV09SRClkZHNkMi5scFN1cmZhY2U7CiAgICAvKiBTaG91bGQgaGF2ZSBjb3BpZWQgc3JjIGRhdGEgdW5tb2RpZmllZCB0byBkc3QgKi8KICAgIG9rKGxwRGF0YVswXSA9PSAweDAwMDAwMEZGICYmCiAgICAgICBscERhdGFbMV0gPT0gMHgwMDAwMDAwMCAmJgogICAgICAgbHBEYXRhWzJdID09IDB4MDBGRjAwMDAgJiYKICAgICAgIGxwRGF0YVszXSA9PSAweDAwMDBGRjAwICYmCiAgICAgICBscERhdGFbNF0gPT0gMHgwMDAwMTEwMCAmJgogICAgICAgbHBEYXRhWzVdID09IDB4MDAxMTAwMDAsICJTdXJmYWNlIGRhdGEgYWZ0ZXIgdW5rZXllZCBibGl0IGRvZXMgbm90IG1hdGNoXG4iKTsKCiAgICBscERhdGFbMF0gPSAweDU1NTU1NTU1OwogICAgbHBEYXRhWzFdID0gMHg1NTU1NTU1NTsKICAgIGxwRGF0YVsyXSA9IDB4NTU1NTU1NTU7CiAgICBscERhdGFbM10gPSAweDU1NTU1NTU1OwogICAgbHBEYXRhWzRdID0gMHg1NTU1NTU1NTsKICAgIGxwRGF0YVs1XSA9IDB4NTU1NTU1NTU7CiAgICByYyA9IElEaXJlY3REcmF3U3VyZmFjZV9VbmxvY2sobHBEc3QsIE5VTEwpOwogICAgb2socmM9PUREX09LLCJVbmxvY2sgcmV0dXJuZWQ6ICV4XG4iLHJjKTsKCiAgICAvKiBTcmMga2V5ICovCiAgICByYyA9IElEaXJlY3REcmF3U3VyZmFjZV9CbHQobHBEc3QsIE5VTEwsIGxwU3JjLCBOVUxMLCBEREJMVF9LRVlTUkMsICZmeCk7CiAgICBvayhyYyA9PSBERF9PSywgIklEaXJlY3REcmF3U3VyZmFjZV9CbHQgcmV0dXJuZWQgJTA4eFxuIiwgcmMpOwoKICAgIHJjID0gSURpcmVjdERyYXdTdXJmYWNlX0xvY2sobHBEc3QsIE5VTEwsICZkZHNkMiwgRERMT0NLX1dBSVQsIE5VTEwpOwogICAgb2socmM9PUREX09LLCJMb2NrIHJldHVybmVkOiAleFxuIixyYyk7CiAgICBvaygoZGRzZDIuZHdGbGFncyAmIEREU0RfTFBTVVJGQUNFKSA9PSAwLCAiU3VyZmFjZSBkZXNjIGhhcyBMUFNVUkZBQ0UgRmxhZ3Mgc2V0XG4iKTsKICAgIGxwRGF0YSA9IChMUERXT1JEKWRkc2QyLmxwU3VyZmFjZTsKCiAgICBvayhscERhdGFbMF0gPT0gMHg1NTU1NTU1NSAmJiAvKiBIZXJlIHRoZSBzcmMga2V5IGFwcGxpZWQgKi8KICAgICAgIGxwRGF0YVsxXSA9PSAweDAwMDAwMDAwICYmCiAgICAgICBscERhdGFbMl0gPT0gMHgwMEZGMDAwMCAmJgogICAgICAgbHBEYXRhWzNdID09IDB4MDAwMEZGMDAgJiYKICAgICAgIGxwRGF0YVs0XSA9PSAweDAwMDAxMTAwICYmCiAgICAgICBscERhdGFbNV0gPT0gMHgwMDExMDAwMCwgIlN1cmZhY2UgZGF0YSBhZnRlciBzcmNrZXkgYmxpdCBkb2VzIG5vdCBtYXRjaFxuIik7CgogICAgbHBEYXRhWzBdID0gMHg1NTU1NTU1NTsKICAgIGxwRGF0YVsxXSA9IDB4NTU1NTU1NTU7CiAgICBscERhdGFbMl0gPSAweDU1NTU1NTU1OwogICAgbHBEYXRhWzNdID0gMHg1NTU1NTU1NTsKICAgIGxwRGF0YVs0XSA9IDB4NTU1NTU1NTU7CiAgICBscERhdGFbNV0gPSAweDU1NTU1NTU1OwogICAgcmMgPSBJRGlyZWN0RHJhd1N1cmZhY2VfVW5sb2NrKGxwRHN0LCBOVUxMKTsKICAgIG9rKHJjPT1ERF9PSywiVW5sb2NrIHJldHVybmVkOiAleFxuIixyYyk7CgogICAgLyogU3JjIG92ZXJyaWRlICovCiAgICByYyA9IElEaXJlY3REcmF3U3VyZmFjZV9CbHQobHBEc3QsIE5VTEwsIGxwU3JjLCBOVUxMLCBEREJMVF9LRVlTUkNPVkVSUklERSwgJmZ4KTsKICAgIG9rKHJjID09IEREX09LLCAiSURpcmVjdERyYXdTdXJmYWNlX0JsdCByZXR1cm5lZCAlMDh4XG4iLCByYyk7CgogICAgcmMgPSBJRGlyZWN0RHJhd1N1cmZhY2VfTG9jayhscERzdCwgTlVMTCwgJmRkc2QyLCBERExPQ0tfV0FJVCwgTlVMTCk7CiAgICBvayhyYz09RERfT0ssIkxvY2sgcmV0dXJuZWQ6ICV4XG4iLHJjKTsKICAgIG9rKChkZHNkMi5kd0ZsYWdzICYgRERTRF9MUFNVUkZBQ0UpID09IDAsICJTdXJmYWNlIGRlc2MgaGFzIExQU1VSRkFDRSBGbGFncyBzZXRcbiIpOwogICAgbHBEYXRhID0gKExQRFdPUkQpZGRzZDIubHBTdXJmYWNlOwoKICAgIG9rKGxwRGF0YVswXSA9PSAweDAwMDAwMEZGICYmCiAgICAgICBscERhdGFbMV0gPT0gMHgwMDAwMDAwMCAmJgogICAgICAgbHBEYXRhWzJdID09IDB4MDBGRjAwMDAgJiYKICAgICAgIGxwRGF0YVszXSA9PSAweDAwMDBGRjAwICYmCiAgICAgICBscERhdGFbNF0gPT0gMHgwMDAwMTEwMCAmJgogICAgICAgbHBEYXRhWzVdID09IDB4NTU1NTU1NTUsIC8qIE92ZXJyaWRlIGtleSBhcHBsaWVzIGhlcmUgKi8KICAgICAgICJTdXJmYWNlIGRhdGEgYWZ0ZXIgc3JjIG92ZXJyaWRlIGtleSBibGl0IGRvZXMgbm90IG1hdGNoXG4iKTsKCiAgICBscERhdGFbMF0gPSAweDU1NTU1NTU1OwogICAgbHBEYXRhWzFdID0gMHg1NTU1NTU1NTsKICAgIGxwRGF0YVsyXSA9IDB4NTU1NTU1NTU7CiAgICBscERhdGFbM10gPSAweDU1NTU1NTU1OwogICAgbHBEYXRhWzRdID0gMHg1NTU1NTU1NTsKICAgIGxwRGF0YVs1XSA9IDB4NTU1NTU1NTU7CiAgICByYyA9IElEaXJlY3REcmF3U3VyZmFjZV9VbmxvY2sobHBEc3QsIE5VTEwpOwogICAgb2socmM9PUREX09LLCJVbmxvY2sgcmV0dXJuZWQ6ICV4XG4iLHJjKTsKCiAgICAvKiBTcmMgb3ZlcnJpZGUgQU5EIHNyYyBrZXkuIFRoYXQgaXMgbm90IHN1cHBvc2VkIHRvIHdvcmsgKi8KICAgIHJjID0gSURpcmVjdERyYXdTdXJmYWNlX0JsdChscERzdCwgTlVMTCwgbHBTcmMsIE5VTEwsIEREQkxUX0tFWVNSQyB8IEREQkxUX0tFWVNSQ09WRVJSSURFLCAmZngpOwogICAgb2socmMgPT0gRERFUlJfSU5WQUxJRFBBUkFNUywgIklEaXJlY3REcmF3U3VyZmFjZV9CbHQgcmV0dXJuZWQgJTA4eFxuIiwgcmMpOwoKICAgIC8qIFZlcmlmeSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBpcyB1bmNoYW5nZWQgKi8KICAgIHJjID0gSURpcmVjdERyYXdTdXJmYWNlX0xvY2sobHBEc3QsIE5VTEwsICZkZHNkMiwgRERMT0NLX1dBSVQsIE5VTEwpOwogICAgb2socmM9PUREX09LLCJMb2NrIHJldHVybmVkOiAleFxuIixyYyk7CiAgICBvaygoZGRzZDIuZHdGbGFncyAmIEREU0RfTFBTVVJGQUNFKSA9PSAwLCAiU3VyZmFjZSBkZXNjIGhhcyBMUFNVUkZBQ0UgRmxhZ3Mgc2V0XG4iKTsKICAgIGxwRGF0YSA9IChMUERXT1JEKWRkc2QyLmxwU3VyZmFjZTsKCiAgICBvayhscERhdGFbMF0gPT0gMHg1NTU1NTU1NSAmJgogICAgICAgbHBEYXRhWzFdID09IDB4NTU1NTU1NTUgJiYKICAgICAgIGxwRGF0YVsyXSA9PSAweDU1NTU1NTU1ICYmCiAgICAgICBscERhdGFbM10gPT0gMHg1NTU1NTU1NSAmJgogICAgICAgbHBEYXRhWzRdID09IDB4NTU1NTU1NTUgJiYKICAgICAgIGxwRGF0YVs1XSA9PSAweDU1NTU1NTU1LCAvKiBPdmVycmlkZSBrZXkgYXBwbGllcyBoZXJlICovCiAgICAgICAiU3VyZmFjZSBkYXRhIGFmdGVyIHNyYyBrZXkgYmxpdCB3aXRoIG92ZXJyaWRlIGRvZXMgbm90IG1hdGNoXG4iKTsKCiAgICBscERhdGFbMF0gPSAweDAwRkYwMDAwOyAvKiBEZXN0IGtleSBpbiBkc3Qgc3VyZmFjZSAqLwogICAgbHBEYXRhWzFdID0gMHgwMEZGMDAwMDsgLyogRGVzdCBrZXkgaW4gZHN0IHN1cmZhY2UgKi8KICAgIGxwRGF0YVsyXSA9IDB4MDAwMDExMDA7IC8qIERlc3Qga2V5IGluIG92ZXJyaWRlICovCiAgICBscERhdGFbM10gPSAweDAwMDAxMTAwOyAvKiBEZXN0IGtleSBpbiBvdmVycmlkZSAqLwogICAgbHBEYXRhWzRdID0gMHgwMDAwMDAwMDsgLyogRGVzdCBrZXkgaW4gc3JjIHN1cmZhY2UgKi8KICAgIGxwRGF0YVs1XSA9IDB4MDAwMDAwMDA7IC8qIERlc3Qga2V5IGluIHNyYyBzdXJmYWNlICovCiAgICByYyA9IElEaXJlY3REcmF3U3VyZmFjZV9VbmxvY2sobHBEc3QsIE5VTEwpOwogICAgb2socmM9PUREX09LLCJVbmxvY2sgcmV0dXJuZWQ6ICV4XG4iLHJjKTsKCiAgICAvKiBEZXN0IGtleSBibGl0ICovCiAgICByYyA9IElEaXJlY3REcmF3U3VyZmFjZV9CbHQobHBEc3QsIE5VTEwsIGxwU3JjLCBOVUxMLCBEREJMVF9LRVlERVNULCAmZngpOwogICAgb2socmMgPT0gRERfT0ssICJJRGlyZWN0RHJhd1N1cmZhY2VfQmx0IHJldHVybmVkICUwOHhcbiIsIHJjKTsKCiAgICByYyA9IElEaXJlY3REcmF3U3VyZmFjZV9Mb2NrKGxwRHN0LCBOVUxMLCAmZGRzZDIsIERETE9DS19XQUlULCBOVUxMKTsKICAgIG9rKHJjPT1ERF9PSywiTG9jayByZXR1cm5lZDogJXhcbiIscmMpOwogICAgb2soKGRkc2QyLmR3RmxhZ3MgJiBERFNEX0xQU1VSRkFDRSkgPT0gMCwgIlN1cmZhY2UgZGVzYyBoYXMgTFBTVVJGQUNFIEZsYWdzIHNldFxuIik7CiAgICBscERhdGEgPSAoTFBEV09SRClkZHNkMi5scFN1cmZhY2U7CgogICAgLyogRGlyZWN0RHJhdyB1c2VzIHRoZSBkZXN0IGJsaXQga2V5IGZyb20gdGhlIFNPVVJDRSBzdXJmYWNlICEgKi8KICAgIG9rKGxwRGF0YVswXSA9PSAweDAwZmYwMDAwICYmCiAgICAgICBscERhdGFbMV0gPT0gMHgwMGZmMDAwMCAmJgogICAgICAgbHBEYXRhWzJdID09IDB4MDAwMDExMDAgJiYKICAgICAgIGxwRGF0YVszXSA9PSAweDAwMDAxMTAwICYmCiAgICAgICBscERhdGFbNF0gPT0gMHgwMDAwMTEwMCAmJiAvKiBLZXkgYXBwbGllcyBoZXJlICovCiAgICAgICBscERhdGFbNV0gPT0gMHgwMDExMDAwMCwgICAvKiBLZXkgYXBwbGllcyBoZXJlICovCiAgICAgICAiU3VyZmFjZSBkYXRhIGFmdGVyIGRlc3Qga2V5IGJsaXQgZG9lcyBub3QgbWF0Y2hcbiIpOwoKICAgIGxwRGF0YVswXSA9IDB4MDBGRjAwMDA7IC8qIERlc3Qga2V5IGluIGRzdCBzdXJmYWNlICovCiAgICBscERhdGFbMV0gPSAweDAwRkYwMDAwOyAvKiBEZXN0IGtleSBpbiBkc3Qgc3VyZmFjZSAqLwogICAgbHBEYXRhWzJdID0gMHgwMDAwMTEwMDsgLyogRGVzdCBrZXkgaW4gb3ZlcnJpZGUgKi8KICAgIGxwRGF0YVszXSA9IDB4MDAwMDExMDA7IC8qIERlc3Qga2V5IGluIG92ZXJyaWRlICovCiAgICBscERhdGFbNF0gPSAweDAwMDAwMDAwOyAvKiBEZXN0IGtleSBpbiBzcmMgc3VyZmFjZSAqLwogICAgbHBEYXRhWzVdID0gMHgwMDAwMDAwMDsgLyogRGVzdCBrZXkgaW4gc3JjIHN1cmZhY2UgKi8KICAgIHJjID0gSURpcmVjdERyYXdTdXJmYWNlX1VubG9jayhscERzdCwgTlVMTCk7CiAgICBvayhyYz09RERfT0ssIlVubG9jayByZXR1cm5lZDogJXhcbiIscmMpOwoKICAgIC8qIERlc3Qgb3ZlcnJpZGUga2V5IGJsaXQgKi8KICAgIHJjID0gSURpcmVjdERyYXdTdXJmYWNlX0JsdChscERzdCwgTlVMTCwgbHBTcmMsIE5VTEwsIEREQkxUX0tFWURFU1RPVkVSUklERSwgJmZ4KTsKICAgIG9rKHJjID09IEREX09LLCAiSURpcmVjdERyYXdTdXJmYWNlX0JsdCByZXR1cm5lZCAlMDh4XG4iLCByYyk7CgogICAgcmMgPSBJRGlyZWN0RHJhd1N1cmZhY2VfTG9jayhscERzdCwgTlVMTCwgJmRkc2QyLCBERExPQ0tfV0FJVCwgTlVMTCk7CiAgICBvayhyYz09RERfT0ssIkxvY2sgcmV0dXJuZWQ6ICV4XG4iLHJjKTsKICAgIG9rKChkZHNkMi5kd0ZsYWdzICYgRERTRF9MUFNVUkZBQ0UpID09IDAsICJTdXJmYWNlIGRlc2MgaGFzIExQU1VSRkFDRSBGbGFncyBzZXRcbiIpOwogICAgbHBEYXRhID0gKExQRFdPUkQpZGRzZDIubHBTdXJmYWNlOwoKICAgIG9rKGxwRGF0YVswXSA9PSAweDAwRkYwMDAwICYmCiAgICAgICBscERhdGFbMV0gPT0gMHgwMEZGMDAwMCAmJgogICAgICAgbHBEYXRhWzJdID09IDB4MDBGRjAwMDAgJiYgLyogS2V5IGFwcGxpZXMgaGVyZSAqLwogICAgICAgbHBEYXRhWzNdID09IDB4MDAwMEZGMDAgJiYgLyogS2V5IGFwcGxpZXMgaGVyZSAqLwogICAgICAgbHBEYXRhWzRdID09IDB4MDAwMDAwMDAgJiYKICAgICAgIGxwRGF0YVs1XSA9PSAweDAwMDAwMDAwLAogICAgICAgIlN1cmZhY2UgZGF0YSBhZnRlciBkZXN0IGtleSBvdmVycmlkZSBibGl0IGRvZXMgbm90IG1hdGNoXG4iKTsKCiAgICBscERhdGFbMF0gPSAweDAwRkYwMDAwOyAvKiBEZXN0IGtleSBpbiBkc3Qgc3VyZmFjZSAqLwogICAgbHBEYXRhWzFdID0gMHgwMEZGMDAwMDsgLyogRGVzdCBrZXkgaW4gZHN0IHN1cmZhY2UgKi8KICAgIGxwRGF0YVsyXSA9IDB4MDAwMDExMDA7IC8qIERlc3Qga2V5IGluIG92ZXJyaWRlICovCiAgICBscERhdGFbM10gPSAweDAwMDAxMTAwOyAvKiBEZXN0IGtleSBpbiBvdmVycmlkZSAqLwogICAgbHBEYXRhWzRdID0gMHgwMDAwMDAwMDsgLyogRGVzdCBrZXkgaW4gc3JjIHN1cmZhY2UgKi8KICAgIGxwRGF0YVs1XSA9IDB4MDAwMDAwMDA7IC8qIERlc3Qga2V5IGluIHNyYyBzdXJmYWNlICovCiAgICByYyA9IElEaXJlY3REcmF3U3VyZmFjZV9VbmxvY2sobHBEc3QsIE5VTEwpOwogICAgb2socmM9PUREX09LLCJVbmxvY2sgcmV0dXJuZWQ6ICV4XG4iLHJjKTsKCiAgICAvKiBEZXN0IG92ZXJyaWRlIGtleSBibGl0LiBTdXBwb3NlZCB0byBmYWlsIHRvbyAqLwogICAgcmMgPSBJRGlyZWN0RHJhd1N1cmZhY2VfQmx0KGxwRHN0LCBOVUxMLCBscFNyYywgTlVMTCwgRERCTFRfS0VZREVTVCB8IEREQkxUX0tFWURFU1RPVkVSUklERSwgJmZ4KTsKICAgIG9rKHJjID09IERERVJSX0lOVkFMSURQQVJBTVMsICJJRGlyZWN0RHJhd1N1cmZhY2VfQmx0IHJldHVybmVkICUwOHhcbiIsIHJjKTsKCiAgICAvKiBDaGVjayBmb3IgdW5jaGFuZ2VkIGRhdGEgKi8KICAgIHJjID0gSURpcmVjdERyYXdTdXJmYWNlX0xvY2sobHBEc3QsIE5VTEwsICZkZHNkMiwgRERMT0NLX1dBSVQsIE5VTEwpOwogICAgb2socmM9PUREX09LLCJMb2NrIHJldHVybmVkOiAleFxuIixyYyk7CiAgICBvaygoZGRzZDIuZHdGbGFncyAmIEREU0RfTFBTVVJGQUNFKSA9PSAwLCAiU3VyZmFjZSBkZXNjIGhhcyBMUFNVUkZBQ0UgRmxhZ3Mgc2V0XG4iKTsKICAgIGxwRGF0YSA9IChMUERXT1JEKWRkc2QyLmxwU3VyZmFjZTsKCiAgICBvayhscERhdGFbMF0gPT0gMHgwMEZGMDAwMCAmJgogICAgICAgbHBEYXRhWzFdID09IDB4MDBGRjAwMDAgJiYKICAgICAgIGxwRGF0YVsyXSA9PSAweDAwMDAxMTAwICYmIC8qIEtleSBhcHBsaWVzIGhlcmUgKi8KICAgICAgIGxwRGF0YVszXSA9PSAweDAwMDAxMTAwICYmIC8qIEtleSBhcHBsaWVzIGhlcmUgKi8KICAgICAgIGxwRGF0YVs0XSA9PSAweDAwMDAwMDAwICYmCiAgICAgICBscERhdGFbNV0gPT0gMHgwMDAwMDAwMCwKICAgICAgICJTdXJmYWNlIGRhdGEgd2l0aCBkZXN0IGtleSBhbmQgZGVzdCBvdmVycmlkZSBkb2VzIG5vdCBtYXRjaFxuIik7CgogICAgbHBEYXRhWzBdID0gMHgwMEZGMDAwMDsgLyogRGVzdCBrZXkgaW4gZHN0IHN1cmZhY2UgKi8KICAgIGxwRGF0YVsxXSA9IDB4MDBGRjAwMDA7IC8qIERlc3Qga2V5IGluIGRzdCBzdXJmYWNlICovCiAgICBscERhdGFbMl0gPSAweDAwMDAxMTAwOyAvKiBEZXN0IGtleSBpbiBvdmVycmlkZSAqLwogICAgbHBEYXRhWzNdID0gMHgwMDAwMTEwMDsgLyogRGVzdCBrZXkgaW4gb3ZlcnJpZGUgKi8KICAgIGxwRGF0YVs0XSA9IDB4MDAwMDAwMDA7IC8qIERlc3Qga2V5IGluIHNyYyBzdXJmYWNlICovCiAgICBscERhdGFbNV0gPSAweDAwMDAwMDAwOyAvKiBEZXN0IGtleSBpbiBzcmMgc3VyZmFjZSAqLwogICAgcmMgPSBJRGlyZWN0RHJhd1N1cmZhY2VfVW5sb2NrKGxwRHN0LCBOVUxMKTsKICAgIG9rKHJjPT1ERF9PSywiVW5sb2NrIHJldHVybmVkOiAleFxuIixyYyk7CgogICAgLyogTW9kaWZ5IHRoZSBzb3VyY2UgZGF0YSBhIGJpdCB0byBnaXZlIHNvbWUgbW9yZSBjb25jbHVzaXZlIHJlc3VsdHMgKi8KICAgIHJjID0gSURpcmVjdERyYXdTdXJmYWNlX0xvY2sobHBTcmMsIE5VTEwsICZkZHNkMiwgRERMT0NLX1dBSVQsIE5VTEwpOwogICAgb2socmM9PUREX09LLCJMb2NrIHJldHVybmVkOiAleFxuIixyYyk7CiAgICBvaygoZGRzZDIuZHdGbGFncyAmIEREU0RfTFBTVVJGQUNFKSA9PSAwLCAiU3VyZmFjZSBkZXNjIGhhcyBMUFNVUkZBQ0UgRmxhZ3Mgc2V0XG4iKTsKICAgIGxwRGF0YSA9IChMUERXT1JEKWRkc2QyLmxwU3VyZmFjZTsKICAgIGxwRGF0YVs1XSA9IDB4MDAwMDAwRkY7IC8qIEFwcGxpZXMgdG8gc3JjIGJsdCBrZXkgaW4gc3JjIHN1cmZhY2UgKi8KICAgIHJjID0gSURpcmVjdERyYXdTdXJmYWNlX1VubG9jayhscFNyYywgTlVMTCk7CiAgICBvayhyYz09RERfT0ssIlVubG9jayByZXR1cm5lZDogJXhcbiIscmMpOwoKICAgIC8qIFNvdXJjZSBhbmQgZGVzdGluYXRpb24ga2V5ICovCiAgICByYyA9IElEaXJlY3REcmF3U3VyZmFjZV9CbHQobHBEc3QsIE5VTEwsIGxwU3JjLCBOVUxMLCBEREJMVF9LRVlERVNUIHwgRERCTFRfS0VZU1JDLCAmZngpOwogICAgb2socmMgPT0gRERfT0ssICJJRGlyZWN0RHJhd1N1cmZhY2VfQmx0IHJldHVybmVkICUwOHhcbiIsIHJjKTsKCiAgICByYyA9IElEaXJlY3REcmF3U3VyZmFjZV9Mb2NrKGxwRHN0LCBOVUxMLCAmZGRzZDIsIERETE9DS19XQUlULCBOVUxMKTsKICAgIG9rKHJjPT1ERF9PSywiTG9jayByZXR1cm5lZDogJXhcbiIscmMpOwogICAgb2soKGRkc2QyLmR3RmxhZ3MgJiBERFNEX0xQU1VSRkFDRSkgPT0gMCwgIlN1cmZhY2UgZGVzYyBoYXMgTFBTVVJGQUNFIEZsYWdzIHNldFxuIik7CiAgICBscERhdGEgPSAoTFBEV09SRClkZHNkMi5scFN1cmZhY2U7CgogICAgb2sobHBEYXRhWzBdID09IDB4MDBGRjAwMDAgJiYgLyogTWFza2VkIGJ5IERlc3RpbmF0aW9uIGtleSAqLwogICAgICAgbHBEYXRhWzFdID09IDB4MDBGRjAwMDAgJiYgLyogTWFza2VkIGJ5IERlc3RpbmF0aW9uIGtleSAqLwogICAgICAgbHBEYXRhWzJdID09IDB4MDAwMDExMDAgJiYgLyogTWFza2VkIGJ5IERlc3RpbmF0aW9uIGtleSAqLwogICAgICAgbHBEYXRhWzNdID09IDB4MDAwMDExMDAgJiYgLyogTWFza2VkIGJ5IERlc3RpbmF0aW9uIGtleSAqLwogICAgICAgbHBEYXRhWzRdID09IDB4MDAwMDExMDAgJiYgLyogQWxsb3dlZCBieSBkZXN0aW5hdGlvbiBrZXksIG5vdCBtYXNrZWQgYnkgc291cmNlIGtleSAqLwogICAgICAgbHBEYXRhWzVdID09IDB4MDAwMDAwMDAsICAgLyogQWxsb3dlZCBieSBkc3Qga2V5LCBidXQgbWFza2VkIGJ5IHNvdXJjZSBrZXkgKi8KICAgICAgICJTdXJmYWNlIGRhdGEgd2l0aCBzcmMga2V5IGFuZCBkZXN0IGtleSBibGl0IGRvZXMgbm90IG1hdGNoXG4iKTsKCiAgICBscERhdGFbMF0gPSAweDAwRkYwMDAwOyAvKiBEZXN0IGtleSBpbiBkc3Qgc3VyZmFjZSAqLwogICAgbHBEYXRhWzFdID0gMHgwMEZGMDAwMDsgLyogRGVzdCBrZXkgaW4gZHN0IHN1cmZhY2UgKi8KICAgIGxwRGF0YVsyXSA9IDB4MDAwMDExMDA7IC8qIERlc3Qga2V5IGluIG92ZXJyaWRlICovCiAgICBscERhdGFbM10gPSAweDAwMDAxMTAwOyAvKiBEZXN0IGtleSBpbiBvdmVycmlkZSAqLwogICAgbHBEYXRhWzRdID0gMHgwMDAwMDAwMDsgLyogRGVzdCBrZXkgaW4gc3JjIHN1cmZhY2UgKi8KICAgIGxwRGF0YVs1XSA9IDB4MDAwMDAwMDA7IC8qIERlc3Qga2V5IGluIHNyYyBzdXJmYWNlICovCiAgICByYyA9IElEaXJlY3REcmF3U3VyZmFjZV9VbmxvY2sobHBEc3QsIE5VTEwpOwogICAgb2socmM9PUREX09LLCJVbmxvY2sgcmV0dXJuZWQ6ICV4XG4iLHJjKTsKCiAgICAvKiBPdmVycmlkZSBrZXlzIHdpdGhvdXQgZGRibHRmeCBwYXJhbWV0ZXIgZmFpbCAqLwogICAgcmMgPSBJRGlyZWN0RHJhd1N1cmZhY2VfQmx0KGxwRHN0LCBOVUxMLCBscFNyYywgTlVMTCwgRERCTFRfS0VZREVTVE9WRVJSSURFLCBOVUxMKTsKICAgIG9rKHJjID09IERERVJSX0lOVkFMSURQQVJBTVMsICJJRGlyZWN0RHJhd1N1cmZhY2VfQmx0IHJldHVybmVkICUwOHhcbiIsIHJjKTsKICAgIHJjID0gSURpcmVjdERyYXdTdXJmYWNlX0JsdChscERzdCwgTlVMTCwgbHBTcmMsIE5VTEwsIEREQkxUX0tFWVNSQ09WRVJSSURFLCBOVUxMKTsKICAgIG9rKHJjID09IERERVJSX0lOVkFMSURQQVJBTVMsICJJRGlyZWN0RHJhd1N1cmZhY2VfQmx0IHJldHVybmVkICUwOHhcbiIsIHJjKTsKCiAgICAvKiBUcnkgYmxpdHRpbmcgd2l0aG91dCBrZXlzIGluIHRoZSBzb3VyY2Ugc3VyZmFjZSovCiAgICByYyA9IElEaXJlY3REcmF3U3VyZmFjZV9TZXRDb2xvcktleShscFNyYywgRERDS0VZX1NSQ0JMVCwgTlVMTCk7CiAgICBvayhyYyA9PSBERF9PSywgIlNldENvbG9yS2V5IHJldHVybmVkICV4XG4iLCByYyk7CiAgICByYyA9IElEaXJlY3REcmF3U3VyZmFjZV9TZXRDb2xvcktleShscFNyYywgRERDS0VZX0RFU1RCTFQsIE5VTEwpOwogICAgb2socmMgPT0gRERfT0ssICJTZXRDb2xvcktleSByZXR1cm5lZCAleFxuIiwgcmMpOwoKICAgIC8qIFRoYXQgZmFpbHMgbm93LiBEbyBub3QgYm90aGVyIHRvIGNoZWNrIHRoYXQgdGhlIGRhdGEgaXMgdW5tb2RpZmllZCAqLwogICAgcmMgPSBJRGlyZWN0RHJhd1N1cmZhY2VfQmx0KGxwRHN0LCBOVUxMLCBscFNyYywgTlVMTCwgRERCTFRfS0VZU1JDLCAmZngpOwogICAgb2socmMgPT0gRERFUlJfSU5WQUxJRFBBUkFNUywgIklEaXJlY3REcmF3U3VyZmFjZV9CbHQgcmV0dXJuZWQgJTA4eFxuIiwgcmMpOwoKICAgIC8qIERlc3Qga2V5IGJsaXQgc3RpbGwgd29ya3MuIFdoaWNoIGtleSBpcyB1c2VkIHRoaXMgdGltZT8/PyAqLwogICAgcmMgPSBJRGlyZWN0RHJhd1N1cmZhY2VfQmx0KGxwRHN0LCBOVUxMLCBscFNyYywgTlVMTCwgRERCTFRfS0VZREVTVCwgJmZ4KTsKICAgIG9rKHJjID09IEREX09LLCAiSURpcmVjdERyYXdTdXJmYWNlX0JsdCByZXR1cm5lZCAlMDh4XG4iLCByYyk7CgogICAgLyogV2l0aCBrb3JyZWN0bHkgcGFzc2VkIG92ZXJyaWRlIGtleXMgbm8ga2V5IGluIHRoZSBzdXJmYWNlIGlzIG5lZWRlZC4KICAgICAqIEFnYWluLCB0aGUgcmVzdWx0IHdhcyBjaGVja2VkIGJlZm9yZSwgbm8gbmVlZCB0byBkbyB0aGF0IGFnYWluCiAgICAgKi8KICAgIHJjID0gSURpcmVjdERyYXdTdXJmYWNlX0JsdChscERzdCwgTlVMTCwgbHBTcmMsIE5VTEwsIEREQkxUX0tFWURFU1RPVkVSUklERSwgJmZ4KTsKICAgIG9rKHJjID09IEREX09LLCAiSURpcmVjdERyYXdTdXJmYWNlX0JsdCByZXR1cm5lZCAlMDh4XG4iLCByYyk7CiAgICByYyA9IElEaXJlY3REcmF3U3VyZmFjZV9CbHQobHBEc3QsIE5VTEwsIGxwU3JjLCBOVUxMLCBEREJMVF9LRVlTUkNPVkVSUklERSwgJmZ4KTsKICAgIG9rKHJjID09IEREX09LLCAiSURpcmVjdERyYXdTdXJmYWNlX0JsdCByZXR1cm5lZCAlMDh4XG4iLCByYyk7CgogICAgSURpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2UobHBTcmMpOwogICAgSURpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2UobHBEc3QpOwp9CgpzdGF0aWMgdm9pZCBRdWVyeUludGVyZmFjZSh2b2lkKQp7CiAgICBMUERJUkVDVERSQVdTVVJGQUNFIGRzdXJmYWNlOwogICAgRERTVVJGQUNFREVTQyBzdXJmYWNlOwogICAgTFBWT0lEIG9iamVjdDsKICAgIEhSRVNVTFQgcmV0OwoKICAgIC8qIENyZWF0ZSBhIHN1cmZhY2UgKi8KICAgIFplcm9NZW1vcnkoJnN1cmZhY2UsIHNpemVvZihzdXJmYWNlKSk7CiAgICBzdXJmYWNlLmR3U2l6ZSA9IHNpemVvZihzdXJmYWNlKTsKICAgIHN1cmZhY2UuZHdGbGFncyA9IEREU0RfV0lEVEggfCBERFNEX0hFSUdIVDsKICAgIHN1cmZhY2UuZHdIZWlnaHQgPSAxMDsKICAgIHN1cmZhY2UuZHdXaWR0aCA9IDEwOwogICAgcmV0ID0gSURpcmVjdERyYXdfQ3JlYXRlU3VyZmFjZShscERELCAmc3VyZmFjZSwgJmRzdXJmYWNlLCBOVUxMKTsKICAgIGlmKHJldCAhPSBERF9PSykKICAgIHsKICAgICAgICBvayhGQUxTRSwgIklEaXJlY3REcmF3OjpDcmVhdGVTdXJmYWNlIGZhaWxlZCB3aXRoIGVycm9yICV4XG4iLCByZXQpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBDYWxsIElVbmtub3duOjpRdWVyeUludGVyZmFjZSAqLwogICAgcmV0ID0gSURpcmVjdERyYXdTdXJmYWNlX1F1ZXJ5SW50ZXJmYWNlKGRzdXJmYWNlLCAwLCAmb2JqZWN0KTsKICAgIG9rKHJldCA9PSBEREVSUl9JTlZBTElEUEFSQU1TLCAiSURpcmVjdERyYXdTdXJmYWNlOjpRdWVyeUludGVyZmFjZSByZXR1cm5lZCAleFxuIiwgcmV0KTsKCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VfUmVsZWFzZShkc3VyZmFjZSk7Cn0KCi8qIFRoZSBmb2xsb3dpbmcgdGVzdHMgdGVzdCB3aGljaCBpbnRlcmZhY2UgaXMgcmV0dXJuZWQgYnkgSURpcmVjdERyYXdTdXJmYWNlWDo6R2V0RERJbnRlcmZhY2UuCiAqIEl0IHVzZXMgcmVmY291bnRzIHRvIHRlc3QgdGhhdCBhbmQgY29tcGFyZXMgdGhlIGludGVyZmFjZSBhZGRyZXNzZXMuIFBhcnRpYWxseSBmaXRzIGhlcmUsIGFuZAogKiBwYXJ0aWFsbHkgaW4gdGhlIHJlZmNvdW50IHRlc3QKICovCgpzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRyZWYoSVVua25vd24gKmlmYWNlKQp7CiAgICBJVW5rbm93bl9BZGRSZWYoaWZhY2UpOwogICAgcmV0dXJuIElVbmtub3duX1JlbGVhc2UoaWZhY2UpOwp9CgpzdGF0aWMgdm9pZCBHZXREREludGVyZmFjZV8xKHZvaWQpCnsKICAgIExQRElSRUNURFJBV1NVUkZBQ0UgZHN1cmZhY2U7CiAgICBMUERJUkVDVERSQVdTVVJGQUNFMiBkc3VyZmFjZTI7CiAgICBERFNVUkZBQ0VERVNDIHN1cmZhY2U7CiAgICBIUkVTVUxUIHJldDsKICAgIElEaXJlY3REcmF3MiAqZGQyOwogICAgSURpcmVjdERyYXc0ICpkZDQ7CiAgICBJRGlyZWN0RHJhdzcgKmRkNzsKICAgIHVuc2lnbmVkIGxvbmcgcmVmMSwgcmVmMiwgcmVmNCwgcmVmNzsKICAgIHZvaWQgKmRkOwoKICAgIC8qIENyZWF0ZSBhIHN1cmZhY2UgKi8KICAgIFplcm9NZW1vcnkoJnN1cmZhY2UsIHNpemVvZihzdXJmYWNlKSk7CiAgICBzdXJmYWNlLmR3U2l6ZSA9IHNpemVvZihzdXJmYWNlKTsKICAgIHN1cmZhY2UuZHdGbGFncyA9IEREU0RfV0lEVEggfCBERFNEX0hFSUdIVDsKICAgIHN1cmZhY2UuZHdIZWlnaHQgPSAxMDsKICAgIHN1cmZhY2UuZHdXaWR0aCA9IDEwOwogICAgcmV0ID0gSURpcmVjdERyYXdfQ3JlYXRlU3VyZmFjZShscERELCAmc3VyZmFjZSwgJmRzdXJmYWNlLCBOVUxMKTsKICAgIGlmKHJldCAhPSBERF9PSykKICAgIHsKICAgICAgICBvayhGQUxTRSwgIklEaXJlY3REcmF3OjpDcmVhdGVTdXJmYWNlIGZhaWxlZCB3aXRoIGVycm9yICV4XG4iLCByZXQpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHJldCA9IElEaXJlY3REcmF3U3VyZmFjZV9RdWVyeUludGVyZmFjZShkc3VyZmFjZSwgJklJRF9JRGlyZWN0RHJhd1N1cmZhY2UyLCAodm9pZCAqKikgJmRzdXJmYWNlMik7CiAgICBvayhyZXQgPT0gRERfT0ssICJJRGlyZWN0RHJhd1N1cmZhY2VfUXVlcnlJbnRlcmZhY2UgcmV0dXJuZWQgJTA4eFxuIiwgcmV0KTsKICAgIHJldCA9IElEaXJlY3REcmF3X1F1ZXJ5SW50ZXJmYWNlKGxwREQsICZJSURfSURpcmVjdERyYXcyLCAodm9pZCAqKikgJmRkMik7CiAgICBvayhyZXQgPT0gRERfT0ssICJJRGlyZWN0RHJhdzdfUXVlcnlJbnRlcmZhY2UgcmV0dXJuZWQgJTA4eFxuIiwgcmV0KTsKICAgIHJldCA9IElEaXJlY3REcmF3X1F1ZXJ5SW50ZXJmYWNlKGxwREQsICZJSURfSURpcmVjdERyYXc0LCAodm9pZCAqKikgJmRkNCk7CiAgICBvayhyZXQgPT0gRERfT0ssICJJRGlyZWN0RHJhdzdfUXVlcnlJbnRlcmZhY2UgcmV0dXJuZWQgJTA4eFxuIiwgcmV0KTsKICAgIHJldCA9IElEaXJlY3REcmF3X1F1ZXJ5SW50ZXJmYWNlKGxwREQsICZJSURfSURpcmVjdERyYXc3LCAodm9pZCAqKikgJmRkNyk7CiAgICBvayhyZXQgPT0gRERfT0ssICJJRGlyZWN0RHJhdzdfUXVlcnlJbnRlcmZhY2UgcmV0dXJuZWQgJTA4eFxuIiwgcmV0KTsKCiAgICByZWYxID0gZ2V0cmVmKChJVW5rbm93biAqKSBscEREKTsKICAgIG9rKHJlZjEgPT0gMSwgIklEaXJlY3REcmF3IHJlZmNvdW50IGlzICVsZFxuIiwgcmVmMSk7CiAgICByZWYyID0gZ2V0cmVmKChJVW5rbm93biAqKSBkZDIpOwogICAgb2socmVmMiA9PSAxLCAiSURpcmVjdERyYXcyIHJlZmNvdW50IGlzICVsZFxuIiwgcmVmMik7CiAgICByZWY0ID0gZ2V0cmVmKChJVW5rbm93biAqKSBkZDQpOwogICAgb2socmVmNCA9PSAxLCAiSURpcmVjdERyYXc0IHJlZmNvdW50IGlzICVsZFxuIiwgcmVmNCk7CiAgICByZWY3ID0gZ2V0cmVmKChJVW5rbm93biAqKSBkZDcpOwogICAgb2socmVmNyA9PSAxLCAiSURpcmVjdERyYXc3IHJlZmNvdW50IGlzICVsZFxuIiwgcmVmNyk7CgoKICAgIHJldCA9IElEaXJlY3REcmF3U3VyZmFjZTJfR2V0RERJbnRlcmZhY2UoZHN1cmZhY2UyLCAmZGQpOwogICAgb2socmV0ID09IEREX09LLCAiSURpcmVjdERyYXdTdXJmYWNlN19HZXREREludGVyZmFjZSByZXR1cm5lZCAlMDh4XG4iLCByZXQpOwogICAgb2soZ2V0cmVmKChJVW5rbm93biAqKSBscEREKSA9PSByZWYxICsgMSwgIklEaXJlY3REcmF3IHJlZmNvdW50IHdhcyBpbmNyZWFzZWQgYnkgJWxkXG4iLCBnZXRyZWYoKElVbmtub3duICopIGxwREQpIC0gcmVmMSk7CiAgICBvayhnZXRyZWYoKElVbmtub3duICopIGRkMikgPT0gcmVmMiArIDAsICJJRGlyZWN0RHJhdzIgcmVmY291bnQgd2FzIGluY3JlYXNlZCBieSAlbGRcbiIsIGdldHJlZigoSVVua25vd24gKikgZGQyKSAtIHJlZjIpOwogICAgb2soZ2V0cmVmKChJVW5rbm93biAqKSBkZDQpID09IHJlZjQgKyAwLCAiSURpcmVjdERyYXc0IHJlZmNvdW50IHdhcyBpbmNyZWFzZWQgYnkgJWxkXG4iLCBnZXRyZWYoKElVbmtub3duICopIGRkNCkgLSByZWY0KTsKICAgIG9rKGdldHJlZigoSVVua25vd24gKikgZGQ3KSA9PSByZWY3ICsgMCwgIklEaXJlY3REcmF3NyByZWZjb3VudCB3YXMgaW5jcmVhc2VkIGJ5ICVsZFxuIiwgZ2V0cmVmKChJVW5rbm93biAqKSBkZDcpIC0gcmVmNyk7CgogICAgb2soZGQgPT0gbHBERCwgIlJldHVybmVkIGludGVyZmFjZSBwb2ludGVyIGlzIG5vdCBlcXVhbCB0byB0aGUgY3JlYXRpb24gaW50ZXJmYWNlXG4iKTsKICAgIElVbmtub3duX1JlbGVhc2UoKElVbmtub3duICopIGRkKTsKCiAgICAvKiB0cnkgYSBOVUxMIHBvaW50ZXIgKi8KICAgIHJldCA9IElEaXJlY3REcmF3U3VyZmFjZTJfR2V0RERJbnRlcmZhY2UoZHN1cmZhY2UyLCBOVUxMKTsKICAgIG9rKHJldCA9PSBEREVSUl9JTlZBTElEUEFSQU1TLCAiSURpcmVjdERyYXdTdXJmYWNlN19HZXREREludGVyZmFjZSByZXR1cm5lZCAlMDh4XG4iLCByZXQpOwoKICAgIElEaXJlY3REcmF3X1JlbGVhc2UoZGQyKTsKICAgIElEaXJlY3REcmF3X1JlbGVhc2UoZGQ0KTsKICAgIElEaXJlY3REcmF3X1JlbGVhc2UoZGQ3KTsKICAgIElEaXJlY3REcmF3U3VyZmFjZTJfUmVsZWFzZShkc3VyZmFjZTIpOwogICAgSURpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2UoZHN1cmZhY2UpOwp9CgpzdGF0aWMgdm9pZCBHZXREREludGVyZmFjZV8yKHZvaWQpCnsKICAgIExQRElSRUNURFJBV1NVUkZBQ0UgZHN1cmZhY2U7CiAgICBMUERJUkVDVERSQVdTVVJGQUNFMiBkc3VyZmFjZTI7CiAgICBERFNVUkZBQ0VERVNDIHN1cmZhY2U7CiAgICBIUkVTVUxUIHJldDsKICAgIElEaXJlY3REcmF3MiAqZGQyOwogICAgSURpcmVjdERyYXc0ICpkZDQ7CiAgICBJRGlyZWN0RHJhdzcgKmRkNzsKICAgIHVuc2lnbmVkIGxvbmcgcmVmMSwgcmVmMiwgcmVmNCwgcmVmNzsKICAgIHZvaWQgKmRkOwoKICAgIHJldCA9IElEaXJlY3REcmF3X1F1ZXJ5SW50ZXJmYWNlKGxwREQsICZJSURfSURpcmVjdERyYXcyLCAodm9pZCAqKikgJmRkMik7CiAgICBvayhyZXQgPT0gRERfT0ssICJJRGlyZWN0RHJhdzdfUXVlcnlJbnRlcmZhY2UgcmV0dXJuZWQgJTA4eFxuIiwgcmV0KTsKICAgIHJldCA9IElEaXJlY3REcmF3X1F1ZXJ5SW50ZXJmYWNlKGxwREQsICZJSURfSURpcmVjdERyYXc0LCAodm9pZCAqKikgJmRkNCk7CiAgICBvayhyZXQgPT0gRERfT0ssICJJRGlyZWN0RHJhdzdfUXVlcnlJbnRlcmZhY2UgcmV0dXJuZWQgJTA4eFxuIiwgcmV0KTsKICAgIHJldCA9IElEaXJlY3REcmF3X1F1ZXJ5SW50ZXJmYWNlKGxwREQsICZJSURfSURpcmVjdERyYXc3LCAodm9pZCAqKikgJmRkNyk7CiAgICBvayhyZXQgPT0gRERfT0ssICJJRGlyZWN0RHJhdzdfUXVlcnlJbnRlcmZhY2UgcmV0dXJuZWQgJTA4eFxuIiwgcmV0KTsKCiAgICAvKiBDcmVhdGUgYSBzdXJmYWNlICovCiAgICBaZXJvTWVtb3J5KCZzdXJmYWNlLCBzaXplb2Yoc3VyZmFjZSkpOwogICAgc3VyZmFjZS5kd1NpemUgPSBzaXplb2Yoc3VyZmFjZSk7CiAgICBzdXJmYWNlLmR3RmxhZ3MgPSBERFNEX1dJRFRIIHwgRERTRF9IRUlHSFQ7CiAgICBzdXJmYWNlLmR3SGVpZ2h0ID0gMTA7CiAgICBzdXJmYWNlLmR3V2lkdGggPSAxMDsKICAgIHJldCA9IElEaXJlY3REcmF3Ml9DcmVhdGVTdXJmYWNlKGRkMiwgJnN1cmZhY2UsICZkc3VyZmFjZSwgTlVMTCk7CiAgICBpZihyZXQgIT0gRERfT0spCiAgICB7CiAgICAgICAgb2soRkFMU0UsICJJRGlyZWN0RHJhdzo6Q3JlYXRlU3VyZmFjZSBmYWlsZWQgd2l0aCBlcnJvciAleFxuIiwgcmV0KTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICByZXQgPSBJRGlyZWN0RHJhd1N1cmZhY2VfUXVlcnlJbnRlcmZhY2UoZHN1cmZhY2UsICZJSURfSURpcmVjdERyYXdTdXJmYWNlMiwgKHZvaWQgKiopICZkc3VyZmFjZTIpOwogICAgb2socmV0ID09IEREX09LLCAiSURpcmVjdERyYXdTdXJmYWNlX1F1ZXJ5SW50ZXJmYWNlIHJldHVybmVkICUwOHhcbiIsIHJldCk7CgogICAgcmVmMSA9IGdldHJlZigoSVVua25vd24gKikgbHBERCk7CiAgICBvayhyZWYxID09IDEsICJJRGlyZWN0RHJhdyByZWZjb3VudCBpcyAlbGRcbiIsIHJlZjEpOwogICAgcmVmMiA9IGdldHJlZigoSVVua25vd24gKikgZGQyKTsKICAgIG9rKHJlZjIgPT0gMSwgIklEaXJlY3REcmF3MiByZWZjb3VudCBpcyAlbGRcbiIsIHJlZjIpOwogICAgcmVmNCA9IGdldHJlZigoSVVua25vd24gKikgZGQ0KTsKICAgIG9rKHJlZjQgPT0gMSwgIklEaXJlY3REcmF3NCByZWZjb3VudCBpcyAlbGRcbiIsIHJlZjQpOwogICAgcmVmNyA9IGdldHJlZigoSVVua25vd24gKikgZGQ3KTsKICAgIG9rKHJlZjcgPT0gMSwgIklEaXJlY3REcmF3NyByZWZjb3VudCBpcyAlbGRcbiIsIHJlZjcpOwoKCiAgICByZXQgPSBJRGlyZWN0RHJhd1N1cmZhY2UyX0dldERESW50ZXJmYWNlKGRzdXJmYWNlMiwgJmRkKTsKICAgIG9rKHJldCA9PSBERF9PSywgIklEaXJlY3REcmF3U3VyZmFjZTdfR2V0RERJbnRlcmZhY2UgcmV0dXJuZWQgJTA4eFxuIiwgcmV0KTsKICAgIG9rKGdldHJlZigoSVVua25vd24gKikgbHBERCkgPT0gcmVmMSArIDAsICJJRGlyZWN0RHJhdyByZWZjb3VudCB3YXMgaW5jcmVhc2VkIGJ5ICVsZFxuIiwgZ2V0cmVmKChJVW5rbm93biAqKSBscEREKSAtIHJlZjEpOwogICAgb2soZ2V0cmVmKChJVW5rbm93biAqKSBkZDIpID09IHJlZjIgKyAxLCAiSURpcmVjdERyYXcyIHJlZmNvdW50IHdhcyBpbmNyZWFzZWQgYnkgJWxkXG4iLCBnZXRyZWYoKElVbmtub3duICopIGRkMikgLSByZWYyKTsKICAgIG9rKGdldHJlZigoSVVua25vd24gKikgZGQ0KSA9PSByZWY0ICsgMCwgIklEaXJlY3REcmF3NCByZWZjb3VudCB3YXMgaW5jcmVhc2VkIGJ5ICVsZFxuIiwgZ2V0cmVmKChJVW5rbm93biAqKSBkZDQpIC0gcmVmNCk7CiAgICBvayhnZXRyZWYoKElVbmtub3duICopIGRkNykgPT0gcmVmNyArIDAsICJJRGlyZWN0RHJhdzcgcmVmY291bnQgd2FzIGluY3JlYXNlZCBieSAlbGRcbiIsIGdldHJlZigoSVVua25vd24gKikgZGQ3KSAtIHJlZjcpOwoKICAgIG9rKGRkID09IGRkMiwgIlJldHVybmVkIGludGVyZmFjZSBwb2ludGVyIGlzIG5vdCBlcXVhbCB0byB0aGUgY3JlYXRpb24gaW50ZXJmYWNlXG4iKTsKICAgIElVbmtub3duX1JlbGVhc2UoKElVbmtub3duICopIGRkKTsKCiAgICBJRGlyZWN0RHJhd19SZWxlYXNlKGRkMik7CiAgICBJRGlyZWN0RHJhd19SZWxlYXNlKGRkNCk7CiAgICBJRGlyZWN0RHJhd19SZWxlYXNlKGRkNyk7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2UyX1JlbGVhc2UoZHN1cmZhY2UyKTsKICAgIElEaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlKGRzdXJmYWNlKTsKfQoKc3RhdGljIHZvaWQgR2V0RERJbnRlcmZhY2VfNCh2b2lkKQp7CiAgICBMUERJUkVDVERSQVdTVVJGQUNFMiBkc3VyZmFjZTI7CiAgICBMUERJUkVDVERSQVdTVVJGQUNFNCBkc3VyZmFjZTQ7CiAgICBERFNVUkZBQ0VERVNDMiBzdXJmYWNlOwogICAgSFJFU1VMVCByZXQ7CiAgICBJRGlyZWN0RHJhdzIgKmRkMjsKICAgIElEaXJlY3REcmF3NCAqZGQ0OwogICAgSURpcmVjdERyYXc3ICpkZDc7CiAgICB1bnNpZ25lZCBsb25nIHJlZjEsIHJlZjIsIHJlZjQsIHJlZjc7CiAgICB2b2lkICpkZDsKCiAgICByZXQgPSBJRGlyZWN0RHJhd19RdWVyeUludGVyZmFjZShscERELCAmSUlEX0lEaXJlY3REcmF3MiwgKHZvaWQgKiopICZkZDIpOwogICAgb2socmV0ID09IEREX09LLCAiSURpcmVjdERyYXc3X1F1ZXJ5SW50ZXJmYWNlIHJldHVybmVkICUwOHhcbiIsIHJldCk7CiAgICByZXQgPSBJRGlyZWN0RHJhd19RdWVyeUludGVyZmFjZShscERELCAmSUlEX0lEaXJlY3REcmF3NCwgKHZvaWQgKiopICZkZDQpOwogICAgb2socmV0ID09IEREX09LLCAiSURpcmVjdERyYXc3X1F1ZXJ5SW50ZXJmYWNlIHJldHVybmVkICUwOHhcbiIsIHJldCk7CiAgICByZXQgPSBJRGlyZWN0RHJhd19RdWVyeUludGVyZmFjZShscERELCAmSUlEX0lEaXJlY3REcmF3NywgKHZvaWQgKiopICZkZDcpOwogICAgb2socmV0ID09IEREX09LLCAiSURpcmVjdERyYXc3X1F1ZXJ5SW50ZXJmYWNlIHJldHVybmVkICUwOHhcbiIsIHJldCk7CgogICAgLyogQ3JlYXRlIGEgc3VyZmFjZSAqLwogICAgWmVyb01lbW9yeSgmc3VyZmFjZSwgc2l6ZW9mKHN1cmZhY2UpKTsKICAgIHN1cmZhY2UuZHdTaXplID0gc2l6ZW9mKHN1cmZhY2UpOwogICAgc3VyZmFjZS5kd0ZsYWdzID0gRERTRF9XSURUSCB8IEREU0RfSEVJR0hUOwogICAgc3VyZmFjZS5kd0hlaWdodCA9IDEwOwogICAgc3VyZmFjZS5kd1dpZHRoID0gMTA7CiAgICByZXQgPSBJRGlyZWN0RHJhdzRfQ3JlYXRlU3VyZmFjZShkZDQsICZzdXJmYWNlLCAmZHN1cmZhY2U0LCBOVUxMKTsKICAgIGlmKHJldCAhPSBERF9PSykKICAgIHsKICAgICAgICBvayhGQUxTRSwgIklEaXJlY3REcmF3OjpDcmVhdGVTdXJmYWNlIGZhaWxlZCB3aXRoIGVycm9yICV4XG4iLCByZXQpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHJldCA9IElEaXJlY3REcmF3U3VyZmFjZTRfUXVlcnlJbnRlcmZhY2UoZHN1cmZhY2U0LCAmSUlEX0lEaXJlY3REcmF3U3VyZmFjZTIsICh2b2lkICoqKSAmZHN1cmZhY2UyKTsKICAgIG9rKHJldCA9PSBERF9PSywgIklEaXJlY3REcmF3U3VyZmFjZV9RdWVyeUludGVyZmFjZSByZXR1cm5lZCAlMDh4XG4iLCByZXQpOwoKICAgIHJlZjEgPSBnZXRyZWYoKElVbmtub3duICopIGxwREQpOwogICAgb2socmVmMSA9PSAxLCAiSURpcmVjdERyYXcgcmVmY291bnQgaXMgJWxkXG4iLCByZWYxKTsKICAgIHJlZjIgPSBnZXRyZWYoKElVbmtub3duICopIGRkMik7CiAgICBvayhyZWYyID09IDEsICJJRGlyZWN0RHJhdzIgcmVmY291bnQgaXMgJWxkXG4iLCByZWYyKTsKICAgIHJlZjQgPSBnZXRyZWYoKElVbmtub3duICopIGRkNCk7CiAgICBvayhyZWY0ID09IDIsICJJRGlyZWN0RHJhdzQgcmVmY291bnQgaXMgJWxkXG4iLCByZWY0KTsKICAgIHJlZjcgPSBnZXRyZWYoKElVbmtub3duICopIGRkNyk7CiAgICBvayhyZWY3ID09IDEsICJJRGlyZWN0RHJhdzcgcmVmY291bnQgaXMgJWxkXG4iLCByZWY3KTsKCiAgICByZXQgPSBJRGlyZWN0RHJhd1N1cmZhY2U0X0dldERESW50ZXJmYWNlKGRzdXJmYWNlNCwgJmRkKTsKICAgIG9rKHJldCA9PSBERF9PSywgIklEaXJlY3REcmF3U3VyZmFjZTdfR2V0RERJbnRlcmZhY2UgcmV0dXJuZWQgJTA4eFxuIiwgcmV0KTsKICAgIG9rKGdldHJlZigoSVVua25vd24gKikgbHBERCkgPT0gcmVmMSArIDAsICJJRGlyZWN0RHJhdyByZWZjb3VudCB3YXMgaW5jcmVhc2VkIGJ5ICVsZFxuIiwgZ2V0cmVmKChJVW5rbm93biAqKSBscEREKSAtIHJlZjEpOwogICAgb2soZ2V0cmVmKChJVW5rbm93biAqKSBkZDIpID09IHJlZjIgKyAwLCAiSURpcmVjdERyYXcyIHJlZmNvdW50IHdhcyBpbmNyZWFzZWQgYnkgJWxkXG4iLCBnZXRyZWYoKElVbmtub3duICopIGRkMikgLSByZWYyKTsKICAgIG9rKGdldHJlZigoSVVua25vd24gKikgZGQ0KSA9PSByZWY0ICsgMSwgIklEaXJlY3REcmF3NCByZWZjb3VudCB3YXMgaW5jcmVhc2VkIGJ5ICVsZFxuIiwgZ2V0cmVmKChJVW5rbm93biAqKSBkZDQpIC0gcmVmNCk7CiAgICBvayhnZXRyZWYoKElVbmtub3duICopIGRkNykgPT0gcmVmNyArIDAsICJJRGlyZWN0RHJhdzcgcmVmY291bnQgd2FzIGluY3JlYXNlZCBieSAlbGRcbiIsIGdldHJlZigoSVVua25vd24gKikgZGQ3KSAtIHJlZjcpOwoKICAgIG9rKGRkID09IGRkNCwgIlJldHVybmVkIGludGVyZmFjZSBwb2ludGVyIGlzIG5vdCBlcXVhbCB0byB0aGUgY3JlYXRpb24gaW50ZXJmYWNlXG4iKTsKICAgIElVbmtub3duX1JlbGVhc2UoKElVbmtub3duICopIGRkKTsKCiAgICAvKiBOb3cgdGVzdCB3aGF0IGhhcHBlbnMgaWYgd2UgUUkgdGhlIHN1cmZhY2UgZm9yIHNvbWUgb3RoZXIgdmVyc2lvbiAtIEl0IHNob3VsZCBzdGlsbCByZXR1cm4gdGhlIGNyZWF0aW9uIGludGVyZmFjZSAqLwogICAgcmV0ID0gSURpcmVjdERyYXdTdXJmYWNlMl9HZXREREludGVyZmFjZShkc3VyZmFjZTIsICZkZCk7CiAgICBvayhyZXQgPT0gRERfT0ssICJJRGlyZWN0RHJhd1N1cmZhY2U3X0dldERESW50ZXJmYWNlIHJldHVybmVkICUwOHhcbiIsIHJldCk7CiAgICBvayhnZXRyZWYoKElVbmtub3duICopIGxwREQpID09IHJlZjEgKyAwLCAiSURpcmVjdERyYXcgcmVmY291bnQgd2FzIGluY3JlYXNlZCBieSAlbGRcbiIsIGdldHJlZigoSVVua25vd24gKikgbHBERCkgLSByZWYxKTsKICAgIG9rKGdldHJlZigoSVVua25vd24gKikgZGQyKSA9PSByZWYyICsgMCwgIklEaXJlY3REcmF3MiByZWZjb3VudCB3YXMgaW5jcmVhc2VkIGJ5ICVsZFxuIiwgZ2V0cmVmKChJVW5rbm93biAqKSBkZDIpIC0gcmVmMik7CiAgICBvayhnZXRyZWYoKElVbmtub3duICopIGRkNCkgPT0gcmVmNCArIDEsICJJRGlyZWN0RHJhdzQgcmVmY291bnQgd2FzIGluY3JlYXNlZCBieSAlbGRcbiIsIGdldHJlZigoSVVua25vd24gKikgZGQ0KSAtIHJlZjQpOwogICAgb2soZ2V0cmVmKChJVW5rbm93biAqKSBkZDcpID09IHJlZjcgKyAwLCAiSURpcmVjdERyYXc3IHJlZmNvdW50IHdhcyBpbmNyZWFzZWQgYnkgJWxkXG4iLCBnZXRyZWYoKElVbmtub3duICopIGRkNykgLSByZWY3KTsKCiAgICBvayhkZCA9PSBkZDQsICJSZXR1cm5lZCBpbnRlcmZhY2UgcG9pbnRlciBpcyBub3QgZXF1YWwgdG8gdGhlIGNyZWF0aW9uIGludGVyZmFjZVxuIik7CiAgICBJVW5rbm93bl9SZWxlYXNlKChJVW5rbm93biAqKSBkZCk7CgogICAgSURpcmVjdERyYXdfUmVsZWFzZShkZDIpOwogICAgSURpcmVjdERyYXdfUmVsZWFzZShkZDQpOwogICAgSURpcmVjdERyYXdfUmVsZWFzZShkZDcpOwogICAgSURpcmVjdERyYXdTdXJmYWNlNF9SZWxlYXNlKGRzdXJmYWNlNCk7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2UyX1JlbGVhc2UoZHN1cmZhY2UyKTsKfQoKc3RhdGljIHZvaWQgR2V0RERJbnRlcmZhY2VfNyh2b2lkKQp7CiAgICBMUERJUkVDVERSQVdTVVJGQUNFNCBkc3VyZmFjZTQ7CiAgICBMUERJUkVDVERSQVdTVVJGQUNFNyBkc3VyZmFjZTc7CiAgICBERFNVUkZBQ0VERVNDMiBzdXJmYWNlOwogICAgSFJFU1VMVCByZXQ7CiAgICBJRGlyZWN0RHJhdzIgKmRkMjsKICAgIElEaXJlY3REcmF3NCAqZGQ0OwogICAgSURpcmVjdERyYXc3ICpkZDc7CiAgICB1bnNpZ25lZCBsb25nIHJlZjEsIHJlZjIsIHJlZjQsIHJlZjc7CiAgICB2b2lkICpkZDsKCiAgICByZXQgPSBJRGlyZWN0RHJhd19RdWVyeUludGVyZmFjZShscERELCAmSUlEX0lEaXJlY3REcmF3MiwgKHZvaWQgKiopICZkZDIpOwogICAgb2socmV0ID09IEREX09LLCAiSURpcmVjdERyYXc3X1F1ZXJ5SW50ZXJmYWNlIHJldHVybmVkICUwOHhcbiIsIHJldCk7CiAgICByZXQgPSBJRGlyZWN0RHJhd19RdWVyeUludGVyZmFjZShscERELCAmSUlEX0lEaXJlY3REcmF3NCwgKHZvaWQgKiopICZkZDQpOwogICAgb2socmV0ID09IEREX09LLCAiSURpcmVjdERyYXc3X1F1ZXJ5SW50ZXJmYWNlIHJldHVybmVkICUwOHhcbiIsIHJldCk7CiAgICByZXQgPSBJRGlyZWN0RHJhd19RdWVyeUludGVyZmFjZShscERELCAmSUlEX0lEaXJlY3REcmF3NywgKHZvaWQgKiopICZkZDcpOwogICAgb2socmV0ID09IEREX09LLCAiSURpcmVjdERyYXc3X1F1ZXJ5SW50ZXJmYWNlIHJldHVybmVkICUwOHhcbiIsIHJldCk7CgogICAgLyogQ3JlYXRlIGEgc3VyZmFjZSAqLwogICAgWmVyb01lbW9yeSgmc3VyZmFjZSwgc2l6ZW9mKHN1cmZhY2UpKTsKICAgIHN1cmZhY2UuZHdTaXplID0gc2l6ZW9mKHN1cmZhY2UpOwogICAgc3VyZmFjZS5kd0ZsYWdzID0gRERTRF9XSURUSCB8IEREU0RfSEVJR0hUOwogICAgc3VyZmFjZS5kd0hlaWdodCA9IDEwOwogICAgc3VyZmFjZS5kd1dpZHRoID0gMTA7CiAgICByZXQgPSBJRGlyZWN0RHJhdzdfQ3JlYXRlU3VyZmFjZShkZDcsICZzdXJmYWNlLCAmZHN1cmZhY2U3LCBOVUxMKTsKICAgIGlmKHJldCAhPSBERF9PSykKICAgIHsKICAgICAgICBvayhGQUxTRSwgIklEaXJlY3REcmF3OjpDcmVhdGVTdXJmYWNlIGZhaWxlZCB3aXRoIGVycm9yICV4XG4iLCByZXQpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHJldCA9IElEaXJlY3REcmF3U3VyZmFjZTdfUXVlcnlJbnRlcmZhY2UoZHN1cmZhY2U3LCAmSUlEX0lEaXJlY3REcmF3U3VyZmFjZTQsICh2b2lkICoqKSAmZHN1cmZhY2U0KTsKICAgIG9rKHJldCA9PSBERF9PSywgIklEaXJlY3REcmF3U3VyZmFjZV9RdWVyeUludGVyZmFjZSByZXR1cm5lZCAlMDh4XG4iLCByZXQpOwoKICAgIHJlZjEgPSBnZXRyZWYoKElVbmtub3duICopIGxwREQpOwogICAgb2socmVmMSA9PSAxLCAiSURpcmVjdERyYXcgcmVmY291bnQgaXMgJWxkXG4iLCByZWYxKTsKICAgIHJlZjIgPSBnZXRyZWYoKElVbmtub3duICopIGRkMik7CiAgICBvayhyZWYyID09IDEsICJJRGlyZWN0RHJhdzIgcmVmY291bnQgaXMgJWxkXG4iLCByZWYyKTsKICAgIHJlZjQgPSBnZXRyZWYoKElVbmtub3duICopIGRkNCk7CiAgICBvayhyZWY0ID09IDEsICJJRGlyZWN0RHJhdzQgcmVmY291bnQgaXMgJWxkXG4iLCByZWY0KTsKICAgIHJlZjcgPSBnZXRyZWYoKElVbmtub3duICopIGRkNyk7CiAgICBvayhyZWY3ID09IDIsICJJRGlyZWN0RHJhdzcgcmVmY291bnQgaXMgJWxkXG4iLCByZWY3KTsKCiAgICByZXQgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0dldERESW50ZXJmYWNlKGRzdXJmYWNlNywgJmRkKTsKICAgIG9rKHJldCA9PSBERF9PSywgIklEaXJlY3REcmF3U3VyZmFjZTdfR2V0RERJbnRlcmZhY2UgcmV0dXJuZWQgJTA4eFxuIiwgcmV0KTsKICAgIG9rKGdldHJlZigoSVVua25vd24gKikgbHBERCkgPT0gcmVmMSArIDAsICJJRGlyZWN0RHJhdyByZWZjb3VudCB3YXMgaW5jcmVhc2VkIGJ5ICVsZFxuIiwgZ2V0cmVmKChJVW5rbm93biAqKSBscEREKSAtIHJlZjEpOwogICAgb2soZ2V0cmVmKChJVW5rbm93biAqKSBkZDIpID09IHJlZjIgKyAwLCAiSURpcmVjdERyYXcyIHJlZmNvdW50IHdhcyBpbmNyZWFzZWQgYnkgJWxkXG4iLCBnZXRyZWYoKElVbmtub3duICopIGRkMikgLSByZWYyKTsKICAgIG9rKGdldHJlZigoSVVua25vd24gKikgZGQ0KSA9PSByZWY0ICsgMCwgIklEaXJlY3REcmF3NCByZWZjb3VudCB3YXMgaW5jcmVhc2VkIGJ5ICVsZFxuIiwgZ2V0cmVmKChJVW5rbm93biAqKSBkZDQpIC0gcmVmNCk7CiAgICBvayhnZXRyZWYoKElVbmtub3duICopIGRkNykgPT0gcmVmNyArIDEsICJJRGlyZWN0RHJhdzcgcmVmY291bnQgd2FzIGluY3JlYXNlZCBieSAlbGRcbiIsIGdldHJlZigoSVVua25vd24gKikgZGQ3KSAtIHJlZjcpOwoKICAgIG9rKGRkID09IGRkNywgIlJldHVybmVkIGludGVyZmFjZSBwb2ludGVyIGlzIG5vdCBlcXVhbCB0byB0aGUgY3JlYXRpb24gaW50ZXJmYWNlXG4iKTsKICAgIElVbmtub3duX1JlbGVhc2UoKElVbmtub3duICopIGRkKTsKCiAgICAvKiBOb3cgdGVzdCB3aGF0IGhhcHBlbnMgaWYgd2UgUUkgdGhlIHN1cmZhY2UgZm9yIHNvbWUgb3RoZXIgdmVyc2lvbiAtIEl0IHNob3VsZCBzdGlsbCByZXR1cm4gdGhlIGNyZWF0aW9uIGludGVyZmFjZSAqLwogICAgcmV0ID0gSURpcmVjdERyYXdTdXJmYWNlNF9HZXREREludGVyZmFjZShkc3VyZmFjZTQsICZkZCk7CiAgICBvayhyZXQgPT0gRERfT0ssICJJRGlyZWN0RHJhd1N1cmZhY2U3X0dldERESW50ZXJmYWNlIHJldHVybmVkICUwOHhcbiIsIHJldCk7CiAgICBvayhnZXRyZWYoKElVbmtub3duICopIGxwREQpID09IHJlZjEgKyAwLCAiSURpcmVjdERyYXcgcmVmY291bnQgd2FzIGluY3JlYXNlZCBieSAlbGRcbiIsIGdldHJlZigoSVVua25vd24gKikgbHBERCkgLSByZWYxKTsKICAgIG9rKGdldHJlZigoSVVua25vd24gKikgZGQyKSA9PSByZWYyICsgMCwgIklEaXJlY3REcmF3MiByZWZjb3VudCB3YXMgaW5jcmVhc2VkIGJ5ICVsZFxuIiwgZ2V0cmVmKChJVW5rbm93biAqKSBkZDIpIC0gcmVmMik7CiAgICBvayhnZXRyZWYoKElVbmtub3duICopIGRkNCkgPT0gcmVmNCArIDAsICJJRGlyZWN0RHJhdzQgcmVmY291bnQgd2FzIGluY3JlYXNlZCBieSAlbGRcbiIsIGdldHJlZigoSVVua25vd24gKikgZGQ0KSAtIHJlZjQpOwogICAgb2soZ2V0cmVmKChJVW5rbm93biAqKSBkZDcpID09IHJlZjcgKyAxLCAiSURpcmVjdERyYXc3IHJlZmNvdW50IHdhcyBpbmNyZWFzZWQgYnkgJWxkXG4iLCBnZXRyZWYoKElVbmtub3duICopIGRkNykgLSByZWY3KTsKCiAgICBvayhkZCA9PSBkZDcsICJSZXR1cm5lZCBpbnRlcmZhY2UgcG9pbnRlciBpcyBub3QgZXF1YWwgdG8gdGhlIGNyZWF0aW9uIGludGVyZmFjZVxuIik7CiAgICBJVW5rbm93bl9SZWxlYXNlKChJVW5rbm93biAqKSBkZCk7CgogICAgSURpcmVjdERyYXdfUmVsZWFzZShkZDIpOwogICAgSURpcmVjdERyYXdfUmVsZWFzZShkZDQpOwogICAgSURpcmVjdERyYXdfUmVsZWFzZShkZDcpOwogICAgSURpcmVjdERyYXdTdXJmYWNlNF9SZWxlYXNlKGRzdXJmYWNlNCk7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2UoZHN1cmZhY2U3KTsKfQoKI2RlZmluZSBNQVhFWFBFQ1RFRCA4ICAvKiBDYW4gbWF0Y2ggdXAgdG8gOCBleHBlY3RlZCBzdXJmYWNlcyAqLwpzdHJ1Y3QgZW51bXN0cnVjdAp7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2UgKmV4cGVjdGVkW01BWEVYUEVDVEVEXTsKICAgIFVJTlQgY291bnQ7Cn07CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgZW51bUNCKElEaXJlY3REcmF3U3VyZmFjZSAqc3VyZiwgRERTVVJGQUNFREVTQyAqZGVzYywgdm9pZCAqY3R4KQp7CiAgICBpbnQgaTsKICAgIEJPT0wgZm91bmQgPSBGQUxTRTsKCiAgICBmb3IoaSA9IDA7IGkgPCBNQVhFWFBFQ1RFRDsgaSsrKQogICAgewogICAgICAgIGlmKCgoc3RydWN0IGVudW1zdHJ1Y3QgKiljdHgpLT5leHBlY3RlZFtpXSA9PSBzdXJmKSBmb3VuZCA9IFRSVUU7CiAgICB9CgogICAgb2soZm91bmQsICJVbmV4cGVjdGVkIHN1cmZhY2UgJXAgZW51bWVyYXRlZFxuIiwgc3VyZik7CiAgICAoKHN0cnVjdCBlbnVtc3RydWN0ICopY3R4KS0+Y291bnQrKzsKICAgIElEaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlKHN1cmYpOwogICAgcmV0dXJuIERERU5VTVJFVF9PSzsKfQoKc3RhdGljIHZvaWQgRW51bVRlc3Qodm9pZCkKewogICAgSFJFU1VMVCByYzsKICAgIEREU1VSRkFDRURFU0MgZGRzZDsKICAgIElEaXJlY3REcmF3U3VyZmFjZSAqc3VyZmFjZTsKICAgIHN0cnVjdCBlbnVtc3RydWN0IGN0eDsKCiAgICBkZHNkLmR3U2l6ZSA9IHNpemVvZihkZHNkKTsKICAgIGRkc2QuZHdGbGFncyA9IEREU0RfQ0FQUyB8IEREU0RfV0lEVEggfCBERFNEX0hFSUdIVCB8IEREU0RfTUlQTUFQQ09VTlQ7CiAgICBkZHNkLmRkc0NhcHMuZHdDYXBzID0gRERTQ0FQU19URVhUVVJFIHwgRERTQ0FQU19DT01QTEVYIHwgRERTQ0FQU19NSVBNQVA7CiAgICBVMihkZHNkKS5kd01pcE1hcENvdW50ID0gMzsKICAgIGRkc2QuZHdXaWR0aCA9IDMyOwogICAgZGRzZC5kd0hlaWdodCA9IDMyOwogICAgcmMgPSBJRGlyZWN0RHJhd19DcmVhdGVTdXJmYWNlKGxwREQsICZkZHNkLCAmc3VyZmFjZSwgTlVMTCk7CiAgICBvayhyYz09RERfT0ssIkNyZWF0ZVN1cmZhY2UgcmV0dXJuZWQ6ICV4XG4iLHJjKTsKCiAgICBtZW1zZXQoJmN0eCwgMCwgc2l6ZW9mKGN0eCkpOwogICAgY3R4LmV4cGVjdGVkWzBdID0gc3VyZmFjZTsKICAgIHJjID0gSURpcmVjdERyYXdTdXJmYWNlX0dldEF0dGFjaGVkU3VyZmFjZShjdHguZXhwZWN0ZWRbMF0sICZkZHNkLmRkc0NhcHMsICZjdHguZXhwZWN0ZWRbMV0pOwogICAgb2socmMgPT0gRERfT0ssICJHZXRBdHRhY2hlZFN1cmZhY2UgcmV0dXJuZWQgJTA4eFxuIiwgcmMpOwogICAgcmMgPSBJRGlyZWN0RHJhd1N1cmZhY2VfR2V0QXR0YWNoZWRTdXJmYWNlKGN0eC5leHBlY3RlZFsxXSwgJmRkc2QuZGRzQ2FwcywgJmN0eC5leHBlY3RlZFsyXSk7CiAgICBvayhyYyA9PSBERF9PSywgIkdldEF0dGFjaGVkU3VyZmFjZSByZXR1cm5lZCAlMDh4XG4iLCByYyk7CiAgICByYyA9IElEaXJlY3REcmF3U3VyZmFjZV9HZXRBdHRhY2hlZFN1cmZhY2UoY3R4LmV4cGVjdGVkWzJdLCAmZGRzZC5kZHNDYXBzLCAmY3R4LmV4cGVjdGVkWzNdKTsKICAgIG9rKHJjID09IERERVJSX05PVEZPVU5ELCAiR2V0QXR0YWNoZWRTdXJmYWNlIHJldHVybmVkICUwOHhcbiIsIHJjKTsKICAgIGN0eC5jb3VudCA9IDA7CgogICAgcmMgPSBJRGlyZWN0RHJhd19FbnVtU3VyZmFjZXMobHBERCwgRERFTlVNU1VSRkFDRVNfRE9FU0VYSVNUIHwgRERFTlVNU1VSRkFDRVNfQUxMLCAmZGRzZCwgKHZvaWQgKikgJmN0eCwgZW51bUNCKTsKICAgIG9rKHJjID09IEREX09LLCAiSURpcmVjdERyYXdfRW51bVN1cmZhY2VzIHJldHVybmVkICUwOHhcbiIsIHJjKTsKICAgIG9rKGN0eC5jb3VudCA9PSAzLCAiJWQgc3VyZmFjZXMgZW51bWVyYXRlZCwgZXhwZWN0ZWQgM1xuIiwgY3R4LmNvdW50KTsKCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VfUmVsZWFzZShjdHguZXhwZWN0ZWRbMl0pOwogICAgSURpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2UoY3R4LmV4cGVjdGVkWzFdKTsKICAgIElEaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlKHN1cmZhY2UpOwp9CgpIUkVTVUxUIFdJTkFQSSBTdXJmYWNlQ291bnRlcihJRGlyZWN0RHJhd1N1cmZhY2U3ICpzdXJmYWNlLCBERFNVUkZBQ0VERVNDMiAqZGVzYywgdm9pZCAqY29udGV4dCkKewogICAgVUlOVCAqbnVtID0gY29udGV4dDsKICAgICgqbnVtKSsrOwogICAgSURpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2Uoc3VyZmFjZSk7CiAgICByZXR1cm4gRERFTlVNUkVUX09LOwp9CgpzdGF0aWMgdm9pZCBBdHRhY2htZW50VGVzdDcodm9pZCkKewogICAgSFJFU1VMVCBocjsKICAgIElEaXJlY3REcmF3NyAqZGQ3OwogICAgSURpcmVjdERyYXdTdXJmYWNlNyAqc3VyZmFjZTEsICpzdXJmYWNlMiwgKnN1cmZhY2UzLCAqc3VyZmFjZTQ7CiAgICBERFNVUkZBQ0VERVNDMiBkZHNkOwogICAgVUlOVCBudW07CiAgICBERFNDQVBTMiBjYXBzID0ge0REU0NBUFNfVEVYVFVSRSwgMCwgMCwgMH07CiAgICBIV05EIHdpbmRvdyA9IENyZWF0ZVdpbmRvdyggInN0YXRpYyIsICJkZHJhd190ZXN0IiwgV1NfT1ZFUkxBUFBFRFdJTkRPVywgMTAwLCAxMDAsIDE2MCwgMTYwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMICk7CgogICAgaHIgPSBJRGlyZWN0RHJhd19RdWVyeUludGVyZmFjZShscERELCAmSUlEX0lEaXJlY3REcmF3NywgKHZvaWQgKiopICZkZDcpOwogICAgb2soaHIgPT0gRERfT0ssICJJRGlyZWN0RHJhd19RdWVyeUludGVyZmFjZSByZXR1cm5lZCAlMDh4XG4iLCBocik7CgogICAgbWVtc2V0KCZkZHNkLCAwLCBzaXplb2YoZGRzZCkpOwogICAgZGRzZC5kd1NpemUgPSBzaXplb2YoZGRzZCk7CiAgICBkZHNkLmR3RmxhZ3MgPSBERFNEX0NBUFMgfCBERFNEX1dJRFRIIHwgRERTRF9IRUlHSFQgfCBERFNEX01JUE1BUENPVU5UOwogICAgZGRzZC5kZHNDYXBzLmR3Q2FwcyA9IEREU0NBUFNfVEVYVFVSRSB8IEREU0NBUFNfQ09NUExFWCB8IEREU0NBUFNfTUlQTUFQOwogICAgVTIoZGRzZCkuZHdNaXBNYXBDb3VudCA9IDM7IC8qIFdpbGwgY3JlYXRlIDEyOHgxMjgsIDY0eDY0LCAzMngzMiAqLwogICAgZGRzZC5kd1dpZHRoID0gMTI4OwogICAgZGRzZC5kd0hlaWdodCA9IDEyODsKICAgIGhyID0gSURpcmVjdERyYXc3X0NyZWF0ZVN1cmZhY2UoZGQ3LCAmZGRzZCwgJnN1cmZhY2UxLCBOVUxMKTsKICAgIG9rKGhyPT1ERF9PSywiQ3JlYXRlU3VyZmFjZSByZXR1cm5lZDogJXhcbiIsaHIpOwoKICAgIC8qIFJPT1QgKi8KICAgIG51bSA9IDA7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X0VudW1BdHRhY2hlZFN1cmZhY2VzKHN1cmZhY2UxLCAmbnVtLCBTdXJmYWNlQ291bnRlcik7CiAgICBvayhudW0gPT0gMSwgIk1pcG1hcCByb290IGhhcyAlZCBzdXJmYWNlcyBhdHRhY2hlZCwgZXhwZWN0ZWQgMVxuIiwgbnVtKTsKICAgIC8qIERPTkUgUk9PVCAqLwoKICAgIC8qIExFVkVMIDEgKi8KICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlN19HZXRBdHRhY2hlZFN1cmZhY2Uoc3VyZmFjZTEsICZjYXBzLCAmc3VyZmFjZTIpOwogICAgb2soaHIgPT0gRERfT0ssICJHZXRBdHRhY2hlZFN1cmZhY2UgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgbnVtID0gMDsKICAgIElEaXJlY3REcmF3U3VyZmFjZTdfRW51bUF0dGFjaGVkU3VyZmFjZXMoc3VyZmFjZTIsICZudW0sIFN1cmZhY2VDb3VudGVyKTsKICAgIG9rKG51bSA9PSAxLCAiRmlyc3QgbWlwIGxldmVsIGhhcyAlZCBzdXJmYWNlcyBhdHRhY2hlZCwgZXhwZWN0ZWQgMVxuIiwgbnVtKTsKICAgIC8qIERPTkUgTEVWRUwgMSAqLwoKICAgIC8qIExFVkVMIDIgKi8KICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlN19HZXRBdHRhY2hlZFN1cmZhY2Uoc3VyZmFjZTIsICZjYXBzLCAmc3VyZmFjZTMpOwogICAgb2soaHIgPT0gRERfT0ssICJHZXRBdHRhY2hlZFN1cmZhY2UgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgSURpcmVjdERyYXdTdXJmYWNlN19SZWxlYXNlKHN1cmZhY2UyKTsKICAgIG51bSA9IDA7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X0VudW1BdHRhY2hlZFN1cmZhY2VzKHN1cmZhY2UzLCAmbnVtLCBTdXJmYWNlQ291bnRlcik7CiAgICBvayhudW0gPT0gMCwgIlNlY29uZCBtaXAgbGV2ZWwgaGFzICVkIHN1cmZhY2VzIGF0dGFjaGVkLCBleHBlY3RlZCAxXG4iLCBudW0pOwogICAgLyogRG9uZSBsZXZlbCAyICovCiAgICAvKiBNaXAgbGV2ZWwgMyBpcyBzdGlsbCBuZWVkZWQgKi8KCiAgICAvKiBUcnkgdG8gYXR0YWNoIGEgMTZ4MTYgbWlwbGV2ZWwgLSBTaG91bGQgbm90IHdvcmsgYXMgZmFyIEkgY2FuIHNlZSAqLwogICAgbWVtc2V0KCZkZHNkLCAwLCBzaXplb2YoZGRzZCkpOwogICAgZGRzZC5kd1NpemUgPSBzaXplb2YoZGRzZCk7CiAgICBkZHNkLmR3RmxhZ3MgPSBERFNEX0NBUFMgfCBERFNEX1dJRFRIIHwgRERTRF9IRUlHSFQ7CiAgICBkZHNkLmRkc0NhcHMuZHdDYXBzID0gRERTQ0FQU19URVhUVVJFOwogICAgZGRzZC5kd1dpZHRoID0gMTY7CiAgICBkZHNkLmR3SGVpZ2h0ID0gMTY7CiAgICBociA9IElEaXJlY3REcmF3N19DcmVhdGVTdXJmYWNlKGRkNywgJmRkc2QsICZzdXJmYWNlMiwgTlVMTCk7CiAgICBvayhocj09RERfT0ssIkNyZWF0ZVN1cmZhY2UgcmV0dXJuZWQ6ICV4XG4iLGhyKTsKCiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfQWRkQXR0YWNoZWRTdXJmYWNlKHN1cmZhY2UxLCBzdXJmYWNlMik7CiAgICBvayhociA9PSBEREVSUl9DQU5OT1RBVFRBQ0hTVVJGQUNFLCAiQXR0YWNoaW5nIGEgMTZ4MTYgc3VyZmFjZSB0byBhIDEyOHgxMjggdGV4dHVyZSByb290IHJldHVybmVkICUwOHhcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlN19BZGRBdHRhY2hlZFN1cmZhY2Uoc3VyZmFjZTIsIHN1cmZhY2UxKTsKICAgIG9rKGhyID09IERERVJSX0NBTk5PVEFUVEFDSFNVUkZBQ0UsICJBdHRhY2hpbmcgYSAxMjh4MTI4IHRleHR1cmUgcm9vdCB0byBhIDE2eDE2IHRleHR1cmUgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZEF0dGFjaGVkU3VyZmFjZShzdXJmYWNlMywgc3VyZmFjZTIpOwogICAgb2soaHIgPT0gRERFUlJfQ0FOTk9UQVRUQUNIU1VSRkFDRSwgIkF0dGFjaGluZyBhIDE2eDE2IHN1cmZhY2UgdG8gYSAzMngzMiB0ZXh0dXJlIG1pcCBsZXZlbCByZXR1cm5lZCAlMDh4XG4iLCBocik7CiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfQWRkQXR0YWNoZWRTdXJmYWNlKHN1cmZhY2UyLCBzdXJmYWNlMyk7CiAgICBvayhociA9PSBEREVSUl9DQU5OT1RBVFRBQ0hTVVJGQUNFLCAiQXR0YWNoaW5nIGEgMzJ4MzIgdGV4dHVyZSBtaXAgbGV2ZWwgdG8gYSAxNngxNiBzdXJmYWNlIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2Uoc3VyZmFjZTIpOwoKICAgIG1lbXNldCgmZGRzZCwgMCwgc2l6ZW9mKGRkc2QpKTsKICAgIGRkc2QuZHdTaXplID0gc2l6ZW9mKGRkc2QpOwogICAgZGRzZC5kd0ZsYWdzID0gRERTRF9DQVBTIHwgRERTRF9XSURUSCB8IEREU0RfSEVJR0hUOwogICAgZGRzZC5kZHNDYXBzLmR3Q2FwcyA9IEREU0NBUFNfU1lTVEVNTUVNT1JZIHwgRERTQ0FQU19PRkZTQ1JFRU5QTEFJTjsKICAgIGRkc2QuZHdXaWR0aCA9IDE2OwogICAgZGRzZC5kd0hlaWdodCA9IDE2OwogICAgaHIgPSBJRGlyZWN0RHJhdzdfQ3JlYXRlU3VyZmFjZShkZDcsICZkZHNkLCAmc3VyZmFjZTIsIE5VTEwpOwogICAgb2soaHI9PUREX09LLCJDcmVhdGVTdXJmYWNlIHJldHVybmVkOiAleFxuIixocik7CgogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZEF0dGFjaGVkU3VyZmFjZShzdXJmYWNlMSwgc3VyZmFjZTIpOwogICAgb2soaHIgPT0gRERFUlJfQ0FOTk9UQVRUQUNIU1VSRkFDRSwgIkF0dGFjaGluZyBhIDE2eDE2IG9mZnNjcmVlbiBwbGFpbiBzdXJmYWNlIHRvIGEgMTI4eDEyOCB0ZXh0dXJlIHJvb3QgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZEF0dGFjaGVkU3VyZmFjZShzdXJmYWNlMiwgc3VyZmFjZTEpOwogICAgb2soaHIgPT0gRERFUlJfQ0FOTk9UQVRUQUNIU1VSRkFDRSwgIkF0dGFjaGluZyBhIDEyOHgxMjggdGV4dHVyZSByb290IHRvIGEgMTZ4MTYgb2Zmc2NyZWVuIHBsYWluIHN1cmZhY2UgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZEF0dGFjaGVkU3VyZmFjZShzdXJmYWNlMywgc3VyZmFjZTIpOwogICAgb2soaHIgPT0gRERFUlJfQ0FOTk9UQVRUQUNIU1VSRkFDRSwgIkF0dGFjaGluZyBhIDE2eDE2IG9mZnNjcmVlbiBwbGFpbiBzdXJmYWNlIHRvIGEgMzJ4MzIgdGV4dHVyZSBtaXAgbGV2ZWwgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZEF0dGFjaGVkU3VyZmFjZShzdXJmYWNlMiwgc3VyZmFjZTMpOwogICAgb2soaHIgPT0gRERFUlJfQ0FOTk9UQVRUQUNIU1VSRkFDRSwgIkF0dGFjaGluZyBhIDMyeDMyIHRleHR1cmUgbWlwIGxldmVsIHRvIGEgMTZ4MTYgb2Zmc2NyZWVuIHBsYWluIHN1cmZhY2UgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwoKICAgIElEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShzdXJmYWNlMyk7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2Uoc3VyZmFjZTIpOwogICAgSURpcmVjdERyYXdTdXJmYWNlN19SZWxlYXNlKHN1cmZhY2UxKTsKCiAgICBociA9IElEaXJlY3REcmF3N19TZXRDb29wZXJhdGl2ZUxldmVsKGRkNywgd2luZG93LCBERFNDTF9FWENMVVNJVkUgfCBERFNDTF9GVUxMU0NSRUVOKTsKICAgIG9rKGhyID09IEREX09LLCAiU2V0Q29vcGVyYXRpdmVMZXZlbCByZXR1cm5lZCAlMDh4XG4iLCBocik7CgogICAgbWVtc2V0KCZkZHNkLCAwLCBzaXplb2YoZGRzZCkpOwogICAgZGRzZC5kd1NpemUgPSBzaXplb2YoZGRzZCk7CiAgICBkZHNkLmR3RmxhZ3MgPSBERFNEX0JBQ0tCVUZGRVJDT1VOVCB8IEREU0RfQ0FQUzsKICAgIGRkc2QuZGRzQ2Fwcy5kd0NhcHMgPSBERFNDQVBTX1BSSU1BUllTVVJGQUNFIHwgRERTQ0FQU19DT01QTEVYIHwgRERTQ0FQU19GTElQOwogICAgZGRzZC5kd0JhY2tCdWZmZXJDb3VudCA9IDI7CiAgICBociA9IElEaXJlY3REcmF3N19DcmVhdGVTdXJmYWNlKGRkNywgJmRkc2QsICZzdXJmYWNlMSwgTlVMTCk7CiAgICBvayhocj09RERfT0ssIkNyZWF0ZVN1cmZhY2UgcmV0dXJuZWQ6ICV4XG4iLGhyKTsKCiAgICBudW0gPSAwOwogICAgSURpcmVjdERyYXdTdXJmYWNlN19FbnVtQXR0YWNoZWRTdXJmYWNlcyhzdXJmYWNlMSwgJm51bSwgU3VyZmFjZUNvdW50ZXIpOwogICAgb2sobnVtID09IDEsICJQcmltYXJ5IHN1cmZhY2UgaGFzICVkIHN1cmZhY2VzIGF0dGFjaGVkLCBleHBlY3RlZCAxXG4iLCBudW0pOwogICAgSURpcmVjdERyYXdTdXJmYWNlN19SZWxlYXNlKHN1cmZhY2UxKTsKCiAgICAvKiBUaG9zZSBhcmUgc29tZSBpbnZhbGlkIGRlc2NyaXB0aW9ucywgbm8gbmVlZCB0byB0ZXN0IGF0dGFjaG1lbnRzIHdpdGggdGhlbSAqLwogICAgbWVtc2V0KCZkZHNkLCAwLCBzaXplb2YoZGRzZCkpOwogICAgZGRzZC5kd1NpemUgPSBzaXplb2YoZGRzZCk7CiAgICBkZHNkLmR3RmxhZ3MgPSBERFNEX0NBUFM7CiAgICBkZHNkLmRkc0NhcHMuZHdDYXBzID0gRERTQ0FQU19QUklNQVJZU1VSRkFDRSB8IEREU0NBUFNfRlJPTlRCVUZGRVI7CiAgICBociA9IElEaXJlY3REcmF3N19DcmVhdGVTdXJmYWNlKGRkNywgJmRkc2QsICZzdXJmYWNlMSwgTlVMTCk7CiAgICBvayhocj09RERFUlJfSU5WQUxJRENBUFMsIkNyZWF0ZVN1cmZhY2UgcmV0dXJuZWQ6ICV4XG4iLGhyKTsKICAgIG1lbXNldCgmZGRzZCwgMCwgc2l6ZW9mKGRkc2QpKTsKICAgIGRkc2QuZHdTaXplID0gc2l6ZW9mKGRkc2QpOwogICAgZGRzZC5kd0ZsYWdzID0gRERTRF9DQVBTOwogICAgZGRzZC5kZHNDYXBzLmR3Q2FwcyA9IEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UgfCBERFNDQVBTX0JBQ0tCVUZGRVI7CiAgICBociA9IElEaXJlY3REcmF3N19DcmVhdGVTdXJmYWNlKGRkNywgJmRkc2QsICZzdXJmYWNlMiwgTlVMTCk7CiAgICBvayhocj09RERFUlJfSU5WQUxJRENBUFMsIkNyZWF0ZVN1cmZhY2UgcmV0dXJuZWQ6ICV4XG4iLGhyKTsKCiAgICAvKiBUcnkgYSBzaW5nbGUgcHJpbWFyeSBhbmQgdHdvIG9mZnNjcmVlbiBwbGFpbiBzdXJmYWNlcyAqLwogICAgbWVtc2V0KCZkZHNkLCAwLCBzaXplb2YoZGRzZCkpOwogICAgZGRzZC5kd1NpemUgPSBzaXplb2YoZGRzZCk7CiAgICBkZHNkLmR3RmxhZ3MgPSBERFNEX0NBUFM7CiAgICBkZHNkLmRkc0NhcHMuZHdDYXBzID0gRERTQ0FQU19QUklNQVJZU1VSRkFDRTsKICAgIGhyID0gSURpcmVjdERyYXc3X0NyZWF0ZVN1cmZhY2UoZGQ3LCAmZGRzZCwgJnN1cmZhY2UxLCBOVUxMKTsKICAgIG9rKGhyPT1ERF9PSywiQ3JlYXRlU3VyZmFjZSByZXR1cm5lZDogJXhcbiIsaHIpOwoKICAgIG1lbXNldCgmZGRzZCwgMCwgc2l6ZW9mKGRkc2QpKTsKICAgIGRkc2QuZHdTaXplID0gc2l6ZW9mKGRkc2QpOwogICAgZGRzZC5kd0ZsYWdzID0gRERTRF9DQVBTIHwgRERTRF9XSURUSCB8IEREU0RfSEVJR0hUOwogICAgZGRzZC5kZHNDYXBzLmR3Q2FwcyA9IEREU0NBUFNfT0ZGU0NSRUVOUExBSU47CiAgICBkZHNkLmR3V2lkdGggPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0NSRUVOKTsKICAgIGRkc2QuZHdIZWlnaHQgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0NSRUVOKTsKICAgIGhyID0gSURpcmVjdERyYXc3X0NyZWF0ZVN1cmZhY2UoZGQ3LCAmZGRzZCwgJnN1cmZhY2UyLCBOVUxMKTsKICAgIG9rKGhyPT1ERF9PSywiQ3JlYXRlU3VyZmFjZSByZXR1cm5lZDogJXhcbiIsaHIpOwoKICAgIG1lbXNldCgmZGRzZCwgMCwgc2l6ZW9mKGRkc2QpKTsKICAgIGRkc2QuZHdTaXplID0gc2l6ZW9mKGRkc2QpOwogICAgZGRzZC5kd0ZsYWdzID0gRERTRF9DQVBTIHwgRERTRF9XSURUSCB8IEREU0RfSEVJR0hUOwogICAgZGRzZC5kZHNDYXBzLmR3Q2FwcyA9IEREU0NBUFNfT0ZGU0NSRUVOUExBSU47CiAgICBkZHNkLmR3V2lkdGggPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0NSRUVOKTsKICAgIGRkc2QuZHdIZWlnaHQgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0NSRUVOKTsKICAgIGhyID0gSURpcmVjdERyYXc3X0NyZWF0ZVN1cmZhY2UoZGQ3LCAmZGRzZCwgJnN1cmZhY2UzLCBOVUxMKTsKICAgIG9rKGhyPT1ERF9PSywiQ3JlYXRlU3VyZmFjZSByZXR1cm5lZDogJXhcbiIsaHIpOwoKICAgIC8qIFRoaXMgb25lIGhhcyBhIGRpZmZlcmVudCBzaXplICovCiAgICBtZW1zZXQoJmRkc2QsIDAsIHNpemVvZihkZHNkKSk7CiAgICBkZHNkLmR3U2l6ZSA9IHNpemVvZihkZHNkKTsKICAgIGRkc2QuZHdGbGFncyA9IEREU0RfQ0FQUyB8IEREU0RfV0lEVEggfCBERFNEX0hFSUdIVDsKICAgIGRkc2QuZGRzQ2Fwcy5kd0NhcHMgPSBERFNDQVBTX09GRlNDUkVFTlBMQUlOOwogICAgZGRzZC5kd1dpZHRoID0gMTI4OwogICAgZGRzZC5kd0hlaWdodCA9IDEyODsKICAgIGhyID0gSURpcmVjdERyYXc3X0NyZWF0ZVN1cmZhY2UoZGQ3LCAmZGRzZCwgJnN1cmZhY2U0LCBOVUxMKTsKICAgIG9rKGhyPT1ERF9PSywiQ3JlYXRlU3VyZmFjZSByZXR1cm5lZDogJXhcbiIsaHIpOwoKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlN19BZGRBdHRhY2hlZFN1cmZhY2Uoc3VyZmFjZTEsIHN1cmZhY2UyKTsKICAgIG9rKGhyID09IERERVJSX0NBTk5PVEFUVEFDSFNVUkZBQ0UsICJBdHRhY2hpbmcgYW4gb2Zmc2NyZWVuIHBsYWluIHN1cmZhY2UgdG8gYSBmcm9udCBidWZmZXIgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZEF0dGFjaGVkU3VyZmFjZShzdXJmYWNlMiwgc3VyZmFjZTEpOwogICAgb2soaHIgPT0gRERFUlJfQ0FOTk9UQVRUQUNIU1VSRkFDRSwgIkF0dGFjaGluZyBhIGZyb250IGJ1ZmZlciB0byBhbiBvZmZzY3JlZW4gcGxhaW4gc3VyZmFjZSByZXR1cm5lZCAlMDh4XG4iLCBocik7CiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfQWRkQXR0YWNoZWRTdXJmYWNlKHN1cmZhY2UyLCBzdXJmYWNlMyk7CiAgICBvayhociA9PSBEREVSUl9DQU5OT1RBVFRBQ0hTVVJGQUNFLCAiQXR0YWNoaW5nIGFuIG9mZnNjcmVlbiBwbGFpbiBzdXJmYWNlIHRvIGFub3RoZXIgb2Zmc2NyZWVuIHBsYWluIHN1cmZhY2UgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZEF0dGFjaGVkU3VyZmFjZShzdXJmYWNlMSwgc3VyZmFjZTQpOwogICAgb2soaHIgPT0gRERFUlJfQ0FOTk9UQVRUQUNIU1VSRkFDRSwgIkF0dGFjaGluZyBhbiBvZmZzY3JlZW4gcGxhaW4gc3VyZmFjZSB0byBhIGZyb250IGJ1ZmZlciBvZiBkaWZmZXJlbnQgc2l6ZSByZXR1cm5lZCAlMDh4XG4iLCBocik7CiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfQWRkQXR0YWNoZWRTdXJmYWNlKHN1cmZhY2U0LCBzdXJmYWNlMSk7CiAgICBvayhociA9PSBEREVSUl9DQU5OT1RBVFRBQ0hTVVJGQUNFLCAiQXR0YWNoaW5nIGEgZnJvbnQgYnVmZmVyIHRvIGFuIG9mZnNjcmVlbiBwbGFpbiBzdXJmYWNlIG9mIGRpZmZlcmVudCBzaXplIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2Uoc3VyZmFjZTQpOwogICAgSURpcmVjdERyYXdTdXJmYWNlN19SZWxlYXNlKHN1cmZhY2UzKTsKICAgIElEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShzdXJmYWNlMik7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2Uoc3VyZmFjZTEpOwoKICAgIGhyID1JRGlyZWN0RHJhdzdfU2V0Q29vcGVyYXRpdmVMZXZlbChkZDcsIE5VTEwsIEREU0NMX05PUk1BTCk7CiAgICBvayhociA9PSBERF9PSywgIlNldENvb3BlcmF0aXZlTGV2ZWwgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgSURpcmVjdERyYXc3X1JlbGVhc2UoZGQ3KTsKfQoKc3RhdGljIHZvaWQgQXR0YWNobWVudFRlc3Qodm9pZCkKewogICAgSFJFU1VMVCBocjsKICAgIElEaXJlY3REcmF3U3VyZmFjZSAqc3VyZmFjZTEsICpzdXJmYWNlMiwgKnN1cmZhY2UzLCAqc3VyZmFjZTQ7CiAgICBERFNVUkZBQ0VERVNDIGRkc2Q7CiAgICBERFNDQVBTIGNhcHMgPSB7RERTQ0FQU19URVhUVVJFfTsKICAgIEhXTkQgd2luZG93ID0gQ3JlYXRlV2luZG93KCAic3RhdGljIiwgImRkcmF3X3Rlc3QiLCBXU19PVkVSTEFQUEVEV0lORE9XLCAxMDAsIDEwMCwgMTYwLCAxNjAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgKTsKCiAgICBtZW1zZXQoJmRkc2QsIDAsIHNpemVvZihkZHNkKSk7CiAgICBkZHNkLmR3U2l6ZSA9IHNpemVvZihkZHNkKTsKICAgIGRkc2QuZHdGbGFncyA9IEREU0RfQ0FQUyB8IEREU0RfV0lEVEggfCBERFNEX0hFSUdIVCB8IEREU0RfTUlQTUFQQ09VTlQ7CiAgICBkZHNkLmRkc0NhcHMuZHdDYXBzID0gRERTQ0FQU19URVhUVVJFIHwgRERTQ0FQU19DT01QTEVYIHwgRERTQ0FQU19NSVBNQVA7CiAgICBVMihkZHNkKS5kd01pcE1hcENvdW50ID0gMzsgLyogV2lsbCBjcmVhdGUgMTI4eDEyOCwgNjR4NjQsIDMyeDMyICovCiAgICBkZHNkLmR3V2lkdGggPSAxMjg7CiAgICBkZHNkLmR3SGVpZ2h0ID0gMTI4OwogICAgaHIgPSBJRGlyZWN0RHJhdzdfQ3JlYXRlU3VyZmFjZShscERELCAmZGRzZCwgJnN1cmZhY2UxLCBOVUxMKTsKICAgIG9rKGhyPT1ERF9PSywiQ3JlYXRlU3VyZmFjZSByZXR1cm5lZDogJXhcbiIsaHIpOwoKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlN19HZXRBdHRhY2hlZFN1cmZhY2Uoc3VyZmFjZTEsICZjYXBzLCAmc3VyZmFjZTIpOwogICAgb2soaHIgPT0gRERfT0ssICJHZXRBdHRhY2hlZFN1cmZhY2UgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0dldEF0dGFjaGVkU3VyZmFjZShzdXJmYWNlMiwgJmNhcHMsICZzdXJmYWNlMyk7CiAgICBvayhociA9PSBERF9PSywgIkdldEF0dGFjaGVkU3VyZmFjZSByZXR1cm5lZCAlMDh4XG4iLCBocik7CgogICAgLyogVHJ5IHRvIGF0dGFjaCBhIDE2eDE2IG1pcGxldmVsIC0gU2hvdWxkIG5vdCB3b3JrIGFzIGZhciBJIGNhbiBzZWUgKi8KICAgIG1lbXNldCgmZGRzZCwgMCwgc2l6ZW9mKGRkc2QpKTsKICAgIGRkc2QuZHdTaXplID0gc2l6ZW9mKGRkc2QpOwogICAgZGRzZC5kd0ZsYWdzID0gRERTRF9DQVBTIHwgRERTRF9XSURUSCB8IEREU0RfSEVJR0hUOwogICAgZGRzZC5kZHNDYXBzLmR3Q2FwcyA9IEREU0NBUFNfVEVYVFVSRTsKICAgIGRkc2QuZHdXaWR0aCA9IDE2OwogICAgZGRzZC5kd0hlaWdodCA9IDE2OwogICAgaHIgPSBJRGlyZWN0RHJhd19DcmVhdGVTdXJmYWNlKGxwREQsICZkZHNkLCAmc3VyZmFjZTQsIE5VTEwpOwogICAgb2soaHI9PUREX09LLCJDcmVhdGVTdXJmYWNlIHJldHVybmVkOiAleFxuIixocik7CgogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZEF0dGFjaGVkU3VyZmFjZShzdXJmYWNlMSwgc3VyZmFjZTQpOwogICAgb2soaHIgPT0gRERFUlJfQ0FOTk9UQVRUQUNIU1VSRkFDRSwgIkF0dGFjaGluZyBhIDE2eDE2IHN1cmZhY2UgdG8gYSAxMjh4MTI4IHRleHR1cmUgcm9vdCByZXR1cm5lZCAlMDh4XG4iLCBocik7CiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfQWRkQXR0YWNoZWRTdXJmYWNlKHN1cmZhY2U0LCBzdXJmYWNlMSk7CiAgICBvayhociA9PSBEREVSUl9DQU5OT1RBVFRBQ0hTVVJGQUNFLCAiQXR0YWNoaW5nIGEgMTI4eDEyOCB0ZXh0dXJlIHJvb3QgdG8gYSAxNngxNiB0ZXh0dXJlIHJldHVybmVkICUwOHhcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlN19BZGRBdHRhY2hlZFN1cmZhY2Uoc3VyZmFjZTMsIHN1cmZhY2U0KTsKICAgIG9rKGhyID09IERERVJSX0NBTk5PVEFUVEFDSFNVUkZBQ0UsICJBdHRhY2hpbmcgYSAxNngxNiBzdXJmYWNlIHRvIGEgMzJ4MzIgdGV4dHVyZSBtaXAgbGV2ZWwgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZEF0dGFjaGVkU3VyZmFjZShzdXJmYWNlNCwgc3VyZmFjZTMpOwogICAgb2soaHIgPT0gRERFUlJfQ0FOTk9UQVRUQUNIU1VSRkFDRSwgIkF0dGFjaGluZyBhIDMyeDMyIHRleHR1cmUgbWlwIGxldmVsIHRvIGEgMTZ4MTYgc3VyZmFjZSByZXR1cm5lZCAlMDh4XG4iLCBocik7CiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfQWRkQXR0YWNoZWRTdXJmYWNlKHN1cmZhY2UyLCBzdXJmYWNlNCk7CiAgICBvayhociA9PSBEREVSUl9DQU5OT1RBVFRBQ0hTVVJGQUNFLCAiQXR0YWNoaW5nIGEgMTZ4MTYgc3VyZmFjZSB0byBhIDY0eDY0IHRleHR1cmUgc3VibGV2ZWwgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZEF0dGFjaGVkU3VyZmFjZShzdXJmYWNlNCwgc3VyZmFjZTIpOwogICAgb2soaHIgPT0gRERFUlJfQ0FOTk9UQVRUQUNIU1VSRkFDRSwgIkF0dGFjaGluZyBhIDY0eDY0IHRleHR1cmUgc3VibGV2ZWwgdG8gYSAxNngxNiB0ZXh0dXJlIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2Uoc3VyZmFjZTQpOwoKICAgIG1lbXNldCgmZGRzZCwgMCwgc2l6ZW9mKGRkc2QpKTsKICAgIGRkc2QuZHdTaXplID0gc2l6ZW9mKGRkc2QpOwogICAgZGRzZC5kd0ZsYWdzID0gRERTRF9DQVBTIHwgRERTRF9XSURUSCB8IEREU0RfSEVJR0hUOwogICAgZGRzZC5kZHNDYXBzLmR3Q2FwcyA9IEREU0NBUFNfU1lTVEVNTUVNT1JZIHwgRERTQ0FQU19PRkZTQ1JFRU5QTEFJTjsKICAgIGRkc2QuZHdXaWR0aCA9IDE2OwogICAgZGRzZC5kd0hlaWdodCA9IDE2OwogICAgaHIgPSBJRGlyZWN0RHJhdzdfQ3JlYXRlU3VyZmFjZShscERELCAmZGRzZCwgJnN1cmZhY2U0LCBOVUxMKTsKICAgIG9rKGhyPT1ERF9PSywiQ3JlYXRlU3VyZmFjZSByZXR1cm5lZDogJXhcbiIsaHIpOwoKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlN19BZGRBdHRhY2hlZFN1cmZhY2Uoc3VyZmFjZTEsIHN1cmZhY2U0KTsgLyogU3VjY2VlZHMgb24gcmVmcmFzdCAqLwogICAgb2soaHIgPT0gRERFUlJfQ0FOTk9UQVRUQUNIU1VSRkFDRSwgIkF0dGFjaGluZyBhIDE2eDE2IG9mZnNjcmVlbiBwbGFpbiBzdXJmYWNlIHRvIGEgMTI4eDEyOCB0ZXh0dXJlIHJvb3QgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkgSURpcmVjdERyYXdTdXJmYWNlN19EZWxldGVBdHRhY2hlZFN1cmZhY2Uoc3VyZmFjZTEsIDAsIHN1cmZhY2U0KTsKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlN19BZGRBdHRhY2hlZFN1cmZhY2Uoc3VyZmFjZTQsIHN1cmZhY2UxKTsgIC8qIFN1Y2NlZWRzIG9uIHJlZnJhc3QgKi8KICAgIG9rKGhyID09IERERVJSX0NBTk5PVEFUVEFDSFNVUkZBQ0UsICJBdHRhY2hpbmcgYSAxMjh4MTI4IHRleHR1cmUgcm9vdCB0byBhIDE2eDE2IG9mZnNjcmVlbiBwbGFpbiBzdXJmYWNlIHJldHVybmVkICUwOHhcbiIsIGhyKTsKICAgIGlmKFNVQ0NFRURFRChocikpIElEaXJlY3REcmF3U3VyZmFjZTdfRGVsZXRlQXR0YWNoZWRTdXJmYWNlKHN1cmZhY2UxLCAwLCBzdXJmYWNlMSk7CiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfQWRkQXR0YWNoZWRTdXJmYWNlKHN1cmZhY2UzLCBzdXJmYWNlNCk7ICAvKiBTdWNjZWVkcyBvbiByZWZyYXN0ICovCiAgICBvayhociA9PSBEREVSUl9DQU5OT1RBVFRBQ0hTVVJGQUNFLCAiQXR0YWNoaW5nIGEgMTZ4MTYgb2Zmc2NyZWVuIHBsYWluIHN1cmZhY2UgdG8gYSAzMngzMiB0ZXh0dXJlIG1pcCBsZXZlbCByZXR1cm5lZCAlMDh4XG4iLCBocik7CiAgICBpZihTVUNDRUVERUQoaHIpKSBJRGlyZWN0RHJhd1N1cmZhY2U3X0RlbGV0ZUF0dGFjaGVkU3VyZmFjZShzdXJmYWNlMywgMCwgc3VyZmFjZTQpOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZEF0dGFjaGVkU3VyZmFjZShzdXJmYWNlNCwgc3VyZmFjZTMpOwogICAgb2soaHIgPT0gRERFUlJfQ0FOTk9UQVRUQUNIU1VSRkFDRSwgIkF0dGFjaGluZyBhIDMyeDMyIHRleHR1cmUgbWlwIGxldmVsIHRvIGEgMTZ4MTYgb2Zmc2NyZWVuIHBsYWluIHN1cmZhY2UgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkgSURpcmVjdERyYXdTdXJmYWNlN19EZWxldGVBdHRhY2hlZFN1cmZhY2Uoc3VyZmFjZTQsIDAsIHN1cmZhY2UzKTsKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlN19BZGRBdHRhY2hlZFN1cmZhY2Uoc3VyZmFjZTIsIHN1cmZhY2U0KTsgIC8qIFN1Y2NlZWRzIG9uIHJlZnJhc3QgKi8KICAgIG9rKGhyID09IERERVJSX0NBTk5PVEFUVEFDSFNVUkZBQ0UsICJBdHRhY2hpbmcgYSAxNngxNiBvZmZzY3JlZW4gcGxhaW4gc3VyZmFjZSB0byBhIDY0eDY0IHRleHR1cmUgc3VibGV2ZWwgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkgSURpcmVjdERyYXdTdXJmYWNlN19EZWxldGVBdHRhY2hlZFN1cmZhY2Uoc3VyZmFjZTIsIDAsIHN1cmZhY2U0KTsKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlN19BZGRBdHRhY2hlZFN1cmZhY2Uoc3VyZmFjZTQsIHN1cmZhY2UyKTsKICAgIG9rKGhyID09IERERVJSX0NBTk5PVEFUVEFDSFNVUkZBQ0UsICJBdHRhY2hpbmcgYSA2NHg2NCB0ZXh0dXJlIHN1YmxldmVsIHRvIGEgMTZ4MTYgb2Zmc2NyZWVuIHBsYWluIHN1cmZhY2UgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkgSURpcmVjdERyYXdTdXJmYWNlN19EZWxldGVBdHRhY2hlZFN1cmZhY2Uoc3VyZmFjZTQsIDAsIHN1cmZhY2UyKTsKCiAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2Uoc3VyZmFjZTQpOwogICAgSURpcmVjdERyYXdTdXJmYWNlN19SZWxlYXNlKHN1cmZhY2UzKTsKICAgIElEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShzdXJmYWNlMik7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2Uoc3VyZmFjZTEpOwoKICAgIGhyID0gSURpcmVjdERyYXdfU2V0Q29vcGVyYXRpdmVMZXZlbChscERELCB3aW5kb3csIEREU0NMX0VYQ0xVU0lWRSB8IEREU0NMX0ZVTExTQ1JFRU4pOwogICAgb2soaHIgPT0gRERfT0ssICJTZXRDb29wZXJhdGl2ZUxldmVsIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICAvKiBDcmVhdGluZyBhIGJhY2sgYnVmZmVyIGFzLWlzLCBpcyBub3QgYWxsb3dlZC4gTm8gbmVlZCB0byBwZXJmb3JtIGF0dGFjaG1lbnQgdGVzdHMgKi8KICAgIG1lbXNldCgmZGRzZCwgMCwgc2l6ZW9mKGRkc2QpKTsKICAgIGRkc2QuZHdTaXplID0gc2l6ZW9mKGRkc2QpOwogICAgZGRzZC5kd0ZsYWdzID0gRERTRF9DQVBTOwogICAgZGRzZC5kZHNDYXBzLmR3Q2FwcyA9IEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UgfCBERFNDQVBTX0JBQ0tCVUZGRVI7CiAgICBociA9IElEaXJlY3REcmF3X0NyZWF0ZVN1cmZhY2UobHBERCwgJmRkc2QsICZzdXJmYWNlMiwgTlVMTCk7CiAgICBvayhocj09RERFUlJfSU5WQUxJRENBUFMsIkNyZWF0ZVN1cmZhY2UgcmV0dXJuZWQ6ICV4XG4iLGhyKTsKICAgIC8qIFRoaXMgb2xkIGRkcmF3IHZlcnNpb24gaGFwcGlseSBjcmVhdGVzIGV4cGxpY2l0IGZyb250IGJ1ZmZlcnMgKi8KICAgIG1lbXNldCgmZGRzZCwgMCwgc2l6ZW9mKGRkc2QpKTsKICAgIGRkc2QuZHdTaXplID0gc2l6ZW9mKGRkc2QpOwogICAgZGRzZC5kd0ZsYWdzID0gRERTRF9DQVBTOwogICAgZGRzZC5kZHNDYXBzLmR3Q2FwcyA9IEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UgfCBERFNDQVBTX0ZST05UQlVGRkVSOwogICAgaHIgPSBJRGlyZWN0RHJhd19DcmVhdGVTdXJmYWNlKGxwREQsICZkZHNkLCAmc3VyZmFjZTEsIE5VTEwpOwogICAgb2soaHI9PUREX09LLCJDcmVhdGVTdXJmYWNlIHJldHVybmVkOiAleFxuIixocik7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2VfUmVsZWFzZShzdXJmYWNlMSk7CgogICAgLyogVHJ5IGEgc2luZ2xlIHByaW1hcnkgYW5kIHR3byBvZmZzY3JlZW4gcGxhaW4gc3VyZmFjZXMgKi8KICAgIG1lbXNldCgmZGRzZCwgMCwgc2l6ZW9mKGRkc2QpKTsKICAgIGRkc2QuZHdTaXplID0gc2l6ZW9mKGRkc2QpOwogICAgZGRzZC5kd0ZsYWdzID0gRERTRF9DQVBTOwogICAgZGRzZC5kZHNDYXBzLmR3Q2FwcyA9IEREU0NBUFNfUFJJTUFSWVNVUkZBQ0U7CiAgICBociA9IElEaXJlY3REcmF3X0NyZWF0ZVN1cmZhY2UobHBERCwgJmRkc2QsICZzdXJmYWNlMSwgTlVMTCk7CiAgICBvayhocj09RERfT0ssIkNyZWF0ZVN1cmZhY2UgcmV0dXJuZWQ6ICV4XG4iLGhyKTsKCiAgICBtZW1zZXQoJmRkc2QsIDAsIHNpemVvZihkZHNkKSk7CiAgICBkZHNkLmR3U2l6ZSA9IHNpemVvZihkZHNkKTsKICAgIGRkc2QuZHdGbGFncyA9IEREU0RfQ0FQUyB8IEREU0RfV0lEVEggfCBERFNEX0hFSUdIVDsKICAgIGRkc2QuZGRzQ2Fwcy5kd0NhcHMgPSBERFNDQVBTX09GRlNDUkVFTlBMQUlOOwogICAgZGRzZC5kd1dpZHRoID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTik7CiAgICBkZHNkLmR3SGVpZ2h0ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTik7CiAgICBociA9IElEaXJlY3REcmF3X0NyZWF0ZVN1cmZhY2UobHBERCwgJmRkc2QsICZzdXJmYWNlMiwgTlVMTCk7CiAgICBvayhocj09RERfT0ssIkNyZWF0ZVN1cmZhY2UgcmV0dXJuZWQ6ICV4XG4iLGhyKTsKCiAgICBtZW1zZXQoJmRkc2QsIDAsIHNpemVvZihkZHNkKSk7CiAgICBkZHNkLmR3U2l6ZSA9IHNpemVvZihkZHNkKTsKICAgIGRkc2QuZHdGbGFncyA9IEREU0RfQ0FQUyB8IEREU0RfV0lEVEggfCBERFNEX0hFSUdIVDsKICAgIGRkc2QuZGRzQ2Fwcy5kd0NhcHMgPSBERFNDQVBTX09GRlNDUkVFTlBMQUlOOwogICAgZGRzZC5kd1dpZHRoID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTik7CiAgICBkZHNkLmR3SGVpZ2h0ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTik7CiAgICBociA9IElEaXJlY3REcmF3X0NyZWF0ZVN1cmZhY2UobHBERCwgJmRkc2QsICZzdXJmYWNlMywgTlVMTCk7CiAgICBvayhocj09RERfT0ssIkNyZWF0ZVN1cmZhY2UgcmV0dXJuZWQ6ICV4XG4iLGhyKTsKCiAgICAvKiBUaGlzIG9uZSBoYXMgYSBkaWZmZXJlbnQgc2l6ZSAqLwogICAgbWVtc2V0KCZkZHNkLCAwLCBzaXplb2YoZGRzZCkpOwogICAgZGRzZC5kd1NpemUgPSBzaXplb2YoZGRzZCk7CiAgICBkZHNkLmR3RmxhZ3MgPSBERFNEX0NBUFMgfCBERFNEX1dJRFRIIHwgRERTRF9IRUlHSFQ7CiAgICBkZHNkLmRkc0NhcHMuZHdDYXBzID0gRERTQ0FQU19PRkZTQ1JFRU5QTEFJTjsKICAgIGRkc2QuZHdXaWR0aCA9IDEyODsKICAgIGRkc2QuZHdIZWlnaHQgPSAxMjg7CiAgICBociA9IElEaXJlY3REcmF3X0NyZWF0ZVN1cmZhY2UobHBERCwgJmRkc2QsICZzdXJmYWNlNCwgTlVMTCk7CiAgICBvayhocj09RERfT0ssIkNyZWF0ZVN1cmZhY2UgcmV0dXJuZWQ6ICV4XG4iLGhyKTsKCiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZV9BZGRBdHRhY2hlZFN1cmZhY2Uoc3VyZmFjZTEsIHN1cmZhY2UyKTsKICAgIG9rKGhyID09IEREX09LLCAiQXR0YWNoaW5nIGFuIG9mZnNjcmVlbiBwbGFpbiBzdXJmYWNlIHRvIGEgZnJvbnQgYnVmZmVyIHJldHVybmVkICUwOHhcbiIsIGhyKTsKICAgIC8qIFRyeSB0aGUgcmV2ZXJzZSB3aXRob3V0IGRldGFjaGluZyBmaXJzdCAqLwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2VfQWRkQXR0YWNoZWRTdXJmYWNlKHN1cmZhY2UyLCBzdXJmYWNlMSk7CiAgICBvayhociA9PSBEREVSUl9TVVJGQUNFQUxSRUFEWUFUVEFDSEVELCAiQXR0YWNoaW5nIGFuIGF0dGFjaGVkIHN1cmZhY2UgdG8gaXRzIGF0dGFjaGVlIHJldHVybmVkICUwOHhcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlX0RlbGV0ZUF0dGFjaGVkU3VyZmFjZShzdXJmYWNlMSwgMCwgc3VyZmFjZTIpOwogICAgb2soaHIgPT0gRERfT0ssICJEZWxldGVBdHRhY2hlZFN1cmZhY2UgZmFpbGVkIHdpdGggJTA4eFxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2VfQWRkQXR0YWNoZWRTdXJmYWNlKHN1cmZhY2UyLCBzdXJmYWNlMSk7CiAgICBvayhociA9PSBERF9PSywgIkF0dGFjaGluZyBhIGZyb250IGJ1ZmZlciB0byBhbiBvZmZzY3JlZW4gcGxhaW4gc3VyZmFjZSByZXR1cm5lZCAlMDh4XG4iLCBocik7CiAgICAvKiBUcnkgdG8gZGV0YWNoIHJldmVyc2VkICovCiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZV9EZWxldGVBdHRhY2hlZFN1cmZhY2Uoc3VyZmFjZTEsIDAsIHN1cmZhY2UyKTsKICAgIG9rKGhyID09IERERVJSX0NBTk5PVERFVEFDSFNVUkZBQ0UsICJEZWxldGVBdHRhY2hlZFN1cmZhY2UgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgLyogTm93IHRoZSBwcm9wZXIgZGV0YWNoICovCiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZV9EZWxldGVBdHRhY2hlZFN1cmZhY2Uoc3VyZmFjZTIsIDAsIHN1cmZhY2UxKTsKICAgIG9rKGhyID09IEREX09LLCAiRGVsZXRlQXR0YWNoZWRTdXJmYWNlIGZhaWxlZCB3aXRoICUwOHhcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlX0FkZEF0dGFjaGVkU3VyZmFjZShzdXJmYWNlMiwgc3VyZmFjZTMpOyAvKiBGYWlscyBvbiByZWZyYXN0ICovCiAgICBvayhociA9PSBERF9PSywgIkF0dGFjaGluZyBhbiBvZmZzY3JlZW4gcGxhaW4gc3VyZmFjZSB0byBhbm90aGVyIG9mZnNjcmVlbiBwbGFpbiBzdXJmYWNlIHJldHVybmVkICUwOHhcbiIsIGhyKTsKICAgIGlmKFNVQ0NFRURFRChocikpCiAgICB7CiAgICAgICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2VfRGVsZXRlQXR0YWNoZWRTdXJmYWNlKHN1cmZhY2UyLCAwLCBzdXJmYWNlMyk7CiAgICAgICAgb2soaHIgPT0gRERfT0ssICJEZWxldGVBdHRhY2hlZFN1cmZhY2UgZmFpbGVkIHdpdGggJTA4eFxuIiwgaHIpOwogICAgfQogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2VfQWRkQXR0YWNoZWRTdXJmYWNlKHN1cmZhY2UxLCBzdXJmYWNlNCk7CiAgICBvayhociA9PSBEREVSUl9DQU5OT1RBVFRBQ0hTVVJGQUNFLCAiQXR0YWNoaW5nIGFuIG9mZnNjcmVlbiBwbGFpbiBzdXJmYWNlIHRvIGEgZnJvbnQgYnVmZmVyIG9mIGRpZmZlcmVudCBzaXplIHJldHVybmVkICUwOHhcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlX0FkZEF0dGFjaGVkU3VyZmFjZShzdXJmYWNlNCwgc3VyZmFjZTEpOwogICAgb2soaHIgPT0gRERFUlJfQ0FOTk9UQVRUQUNIU1VSRkFDRSwgIkF0dGFjaGluZyBhIGZyb250IGJ1ZmZlciB0byBhbiBvZmZzY3JlZW4gcGxhaW4gc3VyZmFjZSBvZiBkaWZmZXJlbnQgc2l6ZSByZXR1cm5lZCAlMDh4XG4iLCBocik7CgogICAgSURpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2Uoc3VyZmFjZTQpOwogICAgSURpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2Uoc3VyZmFjZTMpOwogICAgSURpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2Uoc3VyZmFjZTIpOwogICAgSURpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2Uoc3VyZmFjZTEpOwoKICAgIGhyID1JRGlyZWN0RHJhd19TZXRDb29wZXJhdGl2ZUxldmVsKGxwREQsIE5VTEwsIEREU0NMX05PUk1BTCk7CiAgICBvayhociA9PSBERF9PSywgIlNldENvb3BlcmF0aXZlTGV2ZWwgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwoKICAgIERlc3Ryb3lXaW5kb3cod2luZG93KTsKfQoKc3RydWN0IGNvbXBhcmUKewogICAgRFdPUkQgd2lkdGgsIGhlaWdodDsKICAgIERXT1JEIGNhcHMsIGNhcHMyOwogICAgVUlOVCBtaXBzOwp9OwoKSFJFU1VMVCBXSU5BUEkgQ3ViZVRlc3RMdmwyRW51bShJRGlyZWN0RHJhd1N1cmZhY2U3ICpzdXJmYWNlLCBERFNVUkZBQ0VERVNDMiAqZGVzYywgdm9pZCAqY29udGV4dCkKewogICAgVUlOVCAqbWlwcyA9IGNvbnRleHQ7CgogICAgKCptaXBzKSsrOwogICAgSURpcmVjdERyYXdTdXJmYWNlN19FbnVtQXR0YWNoZWRTdXJmYWNlcyhzdXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdWJlVGVzdEx2bDJFbnVtKTsKCiAgICByZXR1cm4gRERFTlVNUkVUX09LOwp9CgpIUkVTVUxUIFdJTkFQSSBDdWJlVGVzdEx2bDFFbnVtKElEaXJlY3REcmF3U3VyZmFjZTcgKnN1cmZhY2UsIEREU1VSRkFDRURFU0MyICpkZXNjLCB2b2lkICpjb250ZXh0KQp7CiAgICBVSU5UIG1pcHMgPSAwOwogICAgVUlOVCAqbnVtID0gKFVJTlQgKikgY29udGV4dDsKICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY29tcGFyZSBleHBlY3RlZFtdID0KICAgIHsKICAgICAgICB7CiAgICAgICAgICAgIDEyOCwgMTI4LAogICAgICAgICAgICBERFNDQVBTX01JUE1BUCB8IEREU0NBUFNfVEVYVFVSRSB8IEREU0NBUFNfU1lTVEVNTUVNT1JZIHwgRERTQ0FQU19DT01QTEVYLAogICAgICAgICAgICBERFNDQVBTMl9DVUJFTUFQIHwgRERTQ0FQUzJfQ1VCRU1BUF9ORUdBVElWRVosCiAgICAgICAgICAgIDcKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgMTI4LCAxMjgsCiAgICAgICAgICAgIEREU0NBUFNfTUlQTUFQIHwgRERTQ0FQU19URVhUVVJFIHwgRERTQ0FQU19TWVNURU1NRU1PUlkgfCBERFNDQVBTX0NPTVBMRVgsCiAgICAgICAgICAgIEREU0NBUFMyX0NVQkVNQVAgfCBERFNDQVBTMl9DVUJFTUFQX1BPU0lUSVZFWiwKICAgICAgICAgICAgNwogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAxMjgsIDEyOCwKICAgICAgICAgICAgRERTQ0FQU19NSVBNQVAgfCBERFNDQVBTX1RFWFRVUkUgfCBERFNDQVBTX1NZU1RFTU1FTU9SWSB8IEREU0NBUFNfQ09NUExFWCwKICAgICAgICAgICAgRERTQ0FQUzJfQ1VCRU1BUCB8IEREU0NBUFMyX0NVQkVNQVBfTkVHQVRJVkVZLAogICAgICAgICAgICA3CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIDEyOCwgMTI4LAogICAgICAgICAgICBERFNDQVBTX01JUE1BUCB8IEREU0NBUFNfVEVYVFVSRSB8IEREU0NBUFNfU1lTVEVNTUVNT1JZIHwgRERTQ0FQU19DT01QTEVYLAogICAgICAgICAgICBERFNDQVBTMl9DVUJFTUFQIHwgRERTQ0FQUzJfQ1VCRU1BUF9QT1NJVElWRVksCiAgICAgICAgICAgIDcKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgMTI4LCAxMjgsCiAgICAgICAgICAgIEREU0NBUFNfTUlQTUFQIHwgRERTQ0FQU19URVhUVVJFIHwgRERTQ0FQU19TWVNURU1NRU1PUlkgfCBERFNDQVBTX0NPTVBMRVgsCiAgICAgICAgICAgIEREU0NBUFMyX0NVQkVNQVAgfCBERFNDQVBTMl9DVUJFTUFQX05FR0FUSVZFWCwKICAgICAgICAgICAgNwogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICA2NCwgNjQsIC8qIFRoaXMgaXMgdGhlIGZpcnN0IG1pcG1hcCAqLwogICAgICAgICAgICBERFNDQVBTX01JUE1BUCB8IEREU0NBUFNfVEVYVFVSRSB8IEREU0NBUFNfU1lTVEVNTUVNT1JZIHwgRERTQ0FQU19DT01QTEVYLAogICAgICAgICAgICBERFNDQVBTMl9NSVBNQVBTVUJMRVZFTCB8IEREU0NBUFMyX0NVQkVNQVAgfCBERFNDQVBTMl9DVUJFTUFQX1BPU0lUSVZFWCwKICAgICAgICAgICAgNgogICAgICAgIH0sCiAgICB9OwoKICAgIG1pcHMgPSAwOwogICAgSURpcmVjdERyYXdTdXJmYWNlN19FbnVtQXR0YWNoZWRTdXJmYWNlcyhzdXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWlwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ViZVRlc3RMdmwyRW51bSk7CgogICAgb2soZGVzYy0+ZHdXaWR0aCA9PSBleHBlY3RlZFsqbnVtXS53aWR0aCwgIlN1cmZhY2Ugd2lkdGggaXMgJWQgZXhwZWN0ZWQgJWRcbiIsIGRlc2MtPmR3V2lkdGgsIGV4cGVjdGVkWypudW1dLndpZHRoKTsKICAgIG9rKGRlc2MtPmR3SGVpZ2h0ID09IGV4cGVjdGVkWypudW1dLmhlaWdodCwgIlN1cmZhY2UgaGVpZ2h0IGlzICVkIGV4cGVjdGVkICVkXG4iLCBkZXNjLT5kd0hlaWdodCwgZXhwZWN0ZWRbKm51bV0uaGVpZ2h0KTsKICAgIG9rKGRlc2MtPmRkc0NhcHMuZHdDYXBzID09IGV4cGVjdGVkWypudW1dLmNhcHMsICJTdXJmYWNlIGNhcHMgYXJlICUwOHggZXhwZWN0ZWQgJTA4eFxuIiwgZGVzYy0+ZGRzQ2Fwcy5kd0NhcHMsIGV4cGVjdGVkWypudW1dLmNhcHMpOwogICAgb2soZGVzYy0+ZGRzQ2Fwcy5kd0NhcHMyID09IGV4cGVjdGVkWypudW1dLmNhcHMyLCAiU3VyZmFjZSBjYXBzMiBhcmUgJTA4eCBleHBlY3RlZCAlMDh4XG4iLCBkZXNjLT5kZHNDYXBzLmR3Q2FwczIsIGV4cGVjdGVkWypudW1dLmNhcHMyKTsKICAgIG9rKG1pcHMgPT0gZXhwZWN0ZWRbKm51bV0ubWlwcywgIlN1cmZhY2UgaGFzICVkIG1pcG1hcHMsIGV4cGVjdGVkICVkXG4iLCBtaXBzLCBleHBlY3RlZFsqbnVtXS5taXBzKTsKCiAgICAoKm51bSkrKzsKCiAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2Uoc3VyZmFjZSk7CgogICAgcmV0dXJuIERERU5VTVJFVF9PSzsKfQoKc3RhdGljIHZvaWQgQ3ViZU1hcFRlc3Qodm9pZCkKewogICAgSURpcmVjdERyYXc3ICpkZDcgPSBOVUxMOwogICAgSURpcmVjdERyYXdTdXJmYWNlNyAqY3ViZW1hcDsKICAgIEREU1VSRkFDRURFU0MyIGRkc2Q7CiAgICBIUkVTVUxUIGhyOwogICAgVUlOVCBudW0gPSAwOwogICAgc3RydWN0IGVudW1zdHJ1Y3QgY3R4OwoKICAgIGhyID0gSURpcmVjdERyYXdfUXVlcnlJbnRlcmZhY2UobHBERCwgJklJRF9JRGlyZWN0RHJhdzcsICh2b2lkICoqKSAmZGQ3KTsKICAgIG9rKGhyID09IEREX09LLCAiSURpcmVjdERyYXc6OlF1ZXJ5SW50ZXJmYWNlIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICBtZW1zZXQoJmRkc2QsIDAsIHNpemVvZihkZHNkKSk7CiAgICBkZHNkLmR3U2l6ZSA9IHNpemVvZihkZHNkKTsKICAgIFU0KGRkc2QpLmRkcGZQaXhlbEZvcm1hdC5kd1NpemUgPSBzaXplb2YoVTQoZGRzZCkuZGRwZlBpeGVsRm9ybWF0KTsKICAgIGRkc2QuZHdGbGFncyA9IEREU0RfV0lEVEggfCBERFNEX0hFSUdIVCB8IEREU0RfUElYRUxGT1JNQVQgfCBERFNEX0NBUFM7CiAgICBkZHNkLmR3V2lkdGggPSAxMjg7CiAgICBkZHNkLmR3SGVpZ2h0ID0gMTI4OwogICAgZGRzZC5kZHNDYXBzLmR3Q2FwcyA9IEREU0NBUFNfVEVYVFVSRSB8IEREU0NBUFNfQ09NUExFWCB8IEREU0NBUFNfTUlQTUFQIHwgRERTQ0FQU19TWVNURU1NRU1PUlk7CiAgICBkZHNkLmRkc0NhcHMuZHdDYXBzMiA9IEREU0NBUFMyX0NVQkVNQVAgfCBERFNDQVBTMl9DVUJFTUFQX0FMTEZBQ0VTOwoKICAgIC8qIEQzREZNVF9SNUc2QjUgKi8KICAgIFU0KGRkc2QpLmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzID0gRERQRl9SR0I7CiAgICBVMShVNChkZHNkKS5kZHBmUGl4ZWxGb3JtYXQpLmR3UkdCQml0Q291bnQgPSAxNjsKICAgIFUyKFU0KGRkc2QpLmRkcGZQaXhlbEZvcm1hdCkuZHdSQml0TWFzayA9IDB4RjgwMDsKICAgIFUzKFU0KGRkc2QpLmRkcGZQaXhlbEZvcm1hdCkuZHdHQml0TWFzayA9IDB4MDdFMDsKICAgIFU0KFU0KGRkc2QpLmRkcGZQaXhlbEZvcm1hdCkuZHdCQml0TWFzayA9IDB4MDAxRjsKCiAgICBociA9IElEaXJlY3REcmF3N19DcmVhdGVTdXJmYWNlKGRkNywgJmRkc2QsICZjdWJlbWFwLCBOVUxMKTsKICAgIG9rKGhyID09IEREX09LLCAiSURpcmVjdERyYXc3OjpDcmVhdGVTdXJmYWNlIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfR2V0U3VyZmFjZURlc2MoY3ViZW1hcCwgJmRkc2QpOwogICAgb2soaHIgPT0gRERfT0ssICJJRGlyZWN0RHJhd1N1cmZhY2U3X0dldFN1cmZhY2VEZXNjIHJldHVybmVkICUwOHhcbiIsIGhyKTsKICAgIG9rKGRkc2QuZGRzQ2Fwcy5kd0NhcHMgPT0gKEREU0NBUFNfTUlQTUFQIHwgRERTQ0FQU19URVhUVVJFIHwgRERTQ0FQU19TWVNURU1NRU1PUlkgfCBERFNDQVBTX0NPTVBMRVgpLAogICAgICAgIlJvb3QgQ2FwcyBhcmUgJTA4eFxuIiwgZGRzZC5kZHNDYXBzLmR3Q2Fwcyk7CiAgICBvayhkZHNkLmRkc0NhcHMuZHdDYXBzMiA9PSAoRERTQ0FQUzJfQ1VCRU1BUF9QT1NJVElWRVggfCBERFNDQVBTMl9DVUJFTUFQKSwKICAgICAgICJSb290IENhcHMyIGFyZSAlMDh4XG4iLCBkZHNkLmRkc0NhcHMuZHdDYXBzMik7CgogICAgSURpcmVjdERyYXdTdXJmYWNlN19FbnVtQXR0YWNoZWRTdXJmYWNlcyhjdWJlbWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdWJlVGVzdEx2bDFFbnVtKTsKICAgIHRyYWNlKCJFbnVtZXJhdGVkICVkIHN1cmZhY2VzIGluIHRvdGFsXG4iLCBudW0pOwogICAgb2sobnVtID09IDYsICJTdXJmYWNlIGhhcyAlZCBhdHRhY2htZW50c1xuIiwgbnVtKTsKICAgIElEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShjdWJlbWFwKTsKCiAgICAvKiBXaGF0IGhhcHBlbnMgaWYgSSBkbyBub3Qgc3BlY2lmeSBhbnkgZmFjZXM/ICovCiAgICBtZW1zZXQoJmRkc2QsIDAsIHNpemVvZihkZHNkKSk7CiAgICBkZHNkLmR3U2l6ZSA9IHNpemVvZihkZHNkKTsKICAgIFU0KGRkc2QpLmRkcGZQaXhlbEZvcm1hdC5kd1NpemUgPSBzaXplb2YoVTQoZGRzZCkuZGRwZlBpeGVsRm9ybWF0KTsKICAgIGRkc2QuZHdGbGFncyA9IEREU0RfV0lEVEggfCBERFNEX0hFSUdIVCB8IEREU0RfUElYRUxGT1JNQVQgfCBERFNEX0NBUFM7CiAgICBkZHNkLmR3V2lkdGggPSAxMjg7CiAgICBkZHNkLmR3SGVpZ2h0ID0gMTI4OwogICAgZGRzZC5kZHNDYXBzLmR3Q2FwcyA9IEREU0NBUFNfVEVYVFVSRSB8IEREU0NBUFNfQ09NUExFWCB8IEREU0NBUFNfTUlQTUFQIHwgRERTQ0FQU19TWVNURU1NRU1PUlk7CiAgICBkZHNkLmRkc0NhcHMuZHdDYXBzMiA9IEREU0NBUFMyX0NVQkVNQVA7CgogICAgLyogRDNERk1UX1I1RzZCNSAqLwogICAgVTQoZGRzZCkuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MgPSBERFBGX1JHQjsKICAgIFUxKFU0KGRkc2QpLmRkcGZQaXhlbEZvcm1hdCkuZHdSR0JCaXRDb3VudCA9IDE2OwogICAgVTIoVTQoZGRzZCkuZGRwZlBpeGVsRm9ybWF0KS5kd1JCaXRNYXNrID0gMHhGODAwOwogICAgVTMoVTQoZGRzZCkuZGRwZlBpeGVsRm9ybWF0KS5kd0dCaXRNYXNrID0gMHgwN0UwOwogICAgVTQoVTQoZGRzZCkuZGRwZlBpeGVsRm9ybWF0KS5kd0JCaXRNYXNrID0gMHgwMDFGOwoKICAgIGhyID0gSURpcmVjdERyYXc3X0NyZWF0ZVN1cmZhY2UoZGQ3LCAmZGRzZCwgJmN1YmVtYXAsIE5VTEwpOwogICAgb2soaHIgPT0gRERFUlJfSU5WQUxJRFBBUkFNUywgIklEaXJlY3REcmF3Nzo6Q3JlYXRlU3VyZmFjZSBhc2tpbmcgZm9yIGEgY3ViZSBtYXAgd2l0aG91dCBmYWNlcyByZXR1cm5lZCAlMDh4XG4iLCBocik7CgogICAgLyogQ3ViZSBtYXAgZmFjZXMgd2l0aG91dCBhIGN1YmUgbWFwPyAqLwogICAgbWVtc2V0KCZkZHNkLCAwLCBzaXplb2YoZGRzZCkpOwogICAgZGRzZC5kd1NpemUgPSBzaXplb2YoZGRzZCk7CiAgICBVNChkZHNkKS5kZHBmUGl4ZWxGb3JtYXQuZHdTaXplID0gc2l6ZW9mKFU0KGRkc2QpLmRkcGZQaXhlbEZvcm1hdCk7CiAgICBkZHNkLmR3RmxhZ3MgPSBERFNEX1dJRFRIIHwgRERTRF9IRUlHSFQgfCBERFNEX1BJWEVMRk9STUFUIHwgRERTRF9DQVBTOwogICAgZGRzZC5kd1dpZHRoID0gMTI4OwogICAgZGRzZC5kd0hlaWdodCA9IDEyODsKICAgIGRkc2QuZGRzQ2Fwcy5kd0NhcHMgPSBERFNDQVBTX1RFWFRVUkUgfCBERFNDQVBTX0NPTVBMRVggfCBERFNDQVBTX01JUE1BUCB8IEREU0NBUFNfU1lTVEVNTUVNT1JZOwogICAgZGRzZC5kZHNDYXBzLmR3Q2FwczIgPSBERFNDQVBTMl9DVUJFTUFQX0FMTEZBQ0VTOwoKICAgIC8qIEQzREZNVF9SNUc2QjUgKi8KICAgIFU0KGRkc2QpLmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzID0gRERQRl9SR0I7CiAgICBVMShVNChkZHNkKS5kZHBmUGl4ZWxGb3JtYXQpLmR3UkdCQml0Q291bnQgPSAxNjsKICAgIFUyKFU0KGRkc2QpLmRkcGZQaXhlbEZvcm1hdCkuZHdSQml0TWFzayA9IDB4RjgwMDsKICAgIFUzKFU0KGRkc2QpLmRkcGZQaXhlbEZvcm1hdCkuZHdHQml0TWFzayA9IDB4MDdFMDsKICAgIFU0KFU0KGRkc2QpLmRkcGZQaXhlbEZvcm1hdCkuZHdCQml0TWFzayA9IDB4MDAxRjsKCiAgICBociA9IElEaXJlY3REcmF3N19DcmVhdGVTdXJmYWNlKGRkNywgJmRkc2QsICZjdWJlbWFwLCBOVUxMKTsKICAgIG9rKGhyID09IERERVJSX0lOVkFMSURDQVBTLCAiSURpcmVjdERyYXc3OjpDcmVhdGVTdXJmYWNlIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICBtZW1zZXQoJmRkc2QsIDAsIHNpemVvZihkZHNkKSk7CiAgICBkZHNkLmR3U2l6ZSA9IHNpemVvZihkZHNkKTsKICAgIFU0KGRkc2QpLmRkcGZQaXhlbEZvcm1hdC5kd1NpemUgPSBzaXplb2YoVTQoZGRzZCkuZGRwZlBpeGVsRm9ybWF0KTsKICAgIGRkc2QuZHdGbGFncyA9IEREU0RfV0lEVEggfCBERFNEX0hFSUdIVCB8IEREU0RfUElYRUxGT1JNQVQgfCBERFNEX0NBUFM7CiAgICBkZHNkLmR3V2lkdGggPSAxMjg7CiAgICBkZHNkLmR3SGVpZ2h0ID0gMTI4OwogICAgZGRzZC5kZHNDYXBzLmR3Q2FwcyA9IEREU0NBUFNfVEVYVFVSRSB8IEREU0NBUFNfQ09NUExFWCB8IEREU0NBUFNfTUlQTUFQIHwgRERTQ0FQU19TWVNURU1NRU1PUlk7CiAgICBkZHNkLmRkc0NhcHMuZHdDYXBzMiA9IEREU0NBUFMyX0NVQkVNQVBfUE9TSVRJVkVYOwoKICAgIC8qIEQzREZNVF9SNUc2QjUgKi8KICAgIFU0KGRkc2QpLmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzID0gRERQRl9SR0I7CiAgICBVMShVNChkZHNkKS5kZHBmUGl4ZWxGb3JtYXQpLmR3UkdCQml0Q291bnQgPSAxNjsKICAgIFUyKFU0KGRkc2QpLmRkcGZQaXhlbEZvcm1hdCkuZHdSQml0TWFzayA9IDB4RjgwMDsKICAgIFUzKFU0KGRkc2QpLmRkcGZQaXhlbEZvcm1hdCkuZHdHQml0TWFzayA9IDB4MDdFMDsKICAgIFU0KFU0KGRkc2QpLmRkcGZQaXhlbEZvcm1hdCkuZHdCQml0TWFzayA9IDB4MDAxRjsKCiAgICBociA9IElEaXJlY3REcmF3N19DcmVhdGVTdXJmYWNlKGRkNywgJmRkc2QsICZjdWJlbWFwLCBOVUxMKTsKICAgIG9rKGhyID09IERERVJSX0lOVkFMSURDQVBTLCAiSURpcmVjdERyYXc3OjpDcmVhdGVTdXJmYWNlIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICAvKiBNYWtlIHN1cmUgZXZlcnl0aGluZyBpcyBjbGVhbmVkIHVwIHByb3Blcmx5LiBVc2UgdGhlIGVudW1TdXJmYWNlcyB0ZXN0IGluZnJhc3RydWN0dXJlICovCiAgICBtZW1zZXQoJmN0eCwgMCwgc2l6ZW9mKGN0eCkpOwogICAgbWVtc2V0KCZkZHNkLCAwLCBzaXplb2YoZGRzZCkpOwogICAgZGRzZC5kd1NpemUgPSBzaXplb2YoRERTVVJGQUNFREVTQyk7CiAgICBociA9IElEaXJlY3REcmF3X0VudW1TdXJmYWNlcyhscERELCBEREVOVU1TVVJGQUNFU19ET0VTRVhJU1QgfCBEREVOVU1TVVJGQUNFU19BTEwsIChERFNVUkZBQ0VERVNDICopICZkZHNkLCAodm9pZCAqKSAmY3R4LCBlbnVtQ0IpOwogICAgb2soaHIgPT0gRERfT0ssICJJRGlyZWN0RHJhd19FbnVtU3VyZmFjZXMgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgb2soY3R4LmNvdW50ID09IDAsICIlZCBzdXJmYWNlcyBlbnVtZXJhdGVkLCBleHBlY3RlZCAwXG4iLCBjdHguY291bnQpOwoKICAgIElEaXJlY3REcmF3N19SZWxlYXNlKGRkNyk7Cn0KCnN0YXRpYyB2b2lkIHRlc3RfbG9ja3JlY3RfaW52YWxpZCh2b2lkKQp7CiAgICB1bnNpZ25lZCBpbnQgaSwgajsKCiAgICBSRUNUIHZhbGlkW10gPSB7CiAgICAgICAgezYwLCA2MCwgNjgsIDY4fSwKICAgICAgICB7NjAsIDYwLCA2MCwgNjh9LAogICAgICAgIHs2MCwgNjAsIDY4LCA2MH0sCiAgICAgICAgezEyMCwgNjAsIDEyOCwgNjh9LAogICAgICAgIHs2MCwgMTIwLCA2OCwgMTI4fSwKICAgIH07CgogICAgUkVDVCBpbnZhbGlkW10gPSB7CiAgICAgICAgezY4LCA2MCwgNjAsIDY4fSwgICAgICAgLyogbGVmdCA+IHJpZ2h0ICovCiAgICAgICAgezYwLCA2OCwgNjgsIDYwfSwgICAgICAgLyogdG9wID4gYm90dG9tICovCiAgICAgICAgey04LCA2MCwgIDAsIDY4fSwgICAgICAgLyogbGVmdCA8IHN1cmZhY2UgKi8KICAgICAgICB7NjAsIC04LCA2OCwgIDB9LCAgICAgICAvKiB0b3AgPCBzdXJmYWNlICovCiAgICAgICAgey0xNiwgNjAsIC04LCA2OH0sICAgICAgLyogcmlnaHQgPCBzdXJmYWNlICovCiAgICAgICAgezYwLCAtMTYsIDY4LCAtOH0sICAgICAgLyogYm90dG9tIDwgc3VyZmFjZSAqLwogICAgICAgIHs2MCwgNjAsIDEzNiwgNjh9LCAgICAgIC8qIHJpZ2h0ID4gc3VyZmFjZSAqLwogICAgICAgIHs2MCwgNjAsIDY4LCAxMzZ9LCAgICAgIC8qIGJvdHRvbSA+IHN1cmZhY2UgKi8KICAgICAgICB7MTM2LCA2MCwgMTQ0LCA2OH0sICAgICAvKiBsZWZ0ID4gc3VyZmFjZSAqLwogICAgICAgIHs2MCwgMTM2LCA2OCwgMTQ0fSwgICAgIC8qIHRvcCA+IHN1cmZhY2UgKi8KICAgIH07CgogICAgY29uc3QgRFdPUkQgZGRzX2NhcHNbXSA9IHsKICAgICAgICBERFNDQVBTX09GRlNDUkVFTlBMQUlOCiAgICB9OwoKICAgIGZvciAoaiA9IDA7IGogPCAoc2l6ZW9mKGRkc19jYXBzKSAvIHNpemVvZigqZGRzX2NhcHMpKTsgKytqKQogICAgewogICAgICAgIElEaXJlY3REcmF3U3VyZmFjZSAqc3VyZmFjZSA9IDA7CiAgICAgICAgRERTVVJGQUNFREVTQyBzdXJmYWNlX2Rlc2MgPSB7MH07CiAgICAgICAgRERTVVJGQUNFREVTQyBsb2NrZWRfZGVzYyA9IHswfTsKICAgICAgICBIUkVTVUxUIGhyOwoKICAgICAgICBzdXJmYWNlX2Rlc2MuZHdTaXplID0gc2l6ZW9mKHN1cmZhY2VfZGVzYyk7CiAgICAgICAgc3VyZmFjZV9kZXNjLmRkcGZQaXhlbEZvcm1hdC5kd1NpemUgPSBzaXplb2Yoc3VyZmFjZV9kZXNjLmRkcGZQaXhlbEZvcm1hdCk7CiAgICAgICAgc3VyZmFjZV9kZXNjLmR3RmxhZ3MgPSBERFNEX0NBUFMgfCBERFNEX1dJRFRIIHwgRERTRF9IRUlHSFQgfCBERFNEX1BJWEVMRk9STUFUOwogICAgICAgIHN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyA9IGRkc19jYXBzW2pdOwogICAgICAgIHN1cmZhY2VfZGVzYy5kd1dpZHRoID0gMTI4OwogICAgICAgIHN1cmZhY2VfZGVzYy5kd0hlaWdodCA9IDEyODsKICAgICAgICBzdXJmYWNlX2Rlc2MuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MgPSBERFBGX1JHQjsKICAgICAgICBVMShzdXJmYWNlX2Rlc2MuZGRwZlBpeGVsRm9ybWF0KS5kd1JHQkJpdENvdW50ID0gMzI7CiAgICAgICAgVTIoc3VyZmFjZV9kZXNjLmRkcGZQaXhlbEZvcm1hdCkuZHdSQml0TWFzayA9IDB4RkYwMDAwOwogICAgICAgIFUzKHN1cmZhY2VfZGVzYy5kZHBmUGl4ZWxGb3JtYXQpLmR3R0JpdE1hc2sgPSAweDAwRkYwMDsKICAgICAgICBVNChzdXJmYWNlX2Rlc2MuZGRwZlBpeGVsRm9ybWF0KS5kd0JCaXRNYXNrID0gMHgwMDAwRkY7CgogICAgICAgIGhyID0gSURpcmVjdERyYXdfQ3JlYXRlU3VyZmFjZShscERELCAmc3VyZmFjZV9kZXNjLCAmc3VyZmFjZSwgTlVMTCk7CiAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIkNyZWF0ZVN1cmZhY2UgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICAgICAgaWYgKEZBSUxFRChocikpIHsKCSAgICBza2lwKCJmYWlsZWQgdG8gY3JlYXRlIHN1cmZhY2VcbiIpOwoJICAgIGNvbnRpbnVlOwoJfQoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKHNpemVvZih2YWxpZCkgLyBzaXplb2YoKnZhbGlkKSk7ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIFJFQ1QgKnJlY3QgPSAmdmFsaWRbaV07CgogICAgICAgICAgICBtZW1zZXQoJmxvY2tlZF9kZXNjLCAwLCBzaXplb2YobG9ja2VkX2Rlc2MpKTsKICAgICAgICAgICAgbG9ja2VkX2Rlc2MuZHdTaXplID0gc2l6ZW9mKGxvY2tlZF9kZXNjKTsKCiAgICAgICAgICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlX0xvY2soc3VyZmFjZSwgcmVjdCwgJmxvY2tlZF9kZXNjLCBERExPQ0tfV0FJVCwgTlVMTCk7CiAgICAgICAgICAgIG9rKFNVQ0NFRURFRChociksICJMb2NrIGZhaWxlZCAoMHglMDh4KSBmb3IgcmVjdCBbJWQsICVkXS0+WyVkLCAlZF1cbiIsCiAgICAgICAgICAgICAgICAgICAgaHIsIHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwgcmVjdC0+cmlnaHQsIHJlY3QtPmJvdHRvbSk7CgogICAgICAgICAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZV9VbmxvY2soc3VyZmFjZSwgTlVMTCk7CiAgICAgICAgICAgIG9rKFNVQ0NFRURFRChociksICJVbmxvY2sgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICAgICAgfQoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKHNpemVvZihpbnZhbGlkKSAvIHNpemVvZigqaW52YWxpZCkpOyArK2kpCiAgICAgICAgewogICAgICAgICAgICBSRUNUICpyZWN0ID0gJmludmFsaWRbaV07CgogICAgICAgICAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZV9Mb2NrKHN1cmZhY2UsIHJlY3QsICZsb2NrZWRfZGVzYywgRERMT0NLX1dBSVQsIE5VTEwpOwogICAgICAgICAgICBvayhociA9PSBEREVSUl9JTlZBTElEUEFSQU1TLCAiTG9jayByZXR1cm5lZCAweCUwOHggZm9yIHJlY3QgWyVkLCAlZF0tPlslZCwgJWRdIgogICAgICAgICAgICAgICAgICAgICIsIGV4cGVjdGVkIERERVJSX0lOVkFMSURQQVJBTVMgKDB4JTA4eClcbiIsIGhyLCByZWN0LT5sZWZ0LCByZWN0LT50b3AsCiAgICAgICAgICAgICAgICAgICAgcmVjdC0+cmlnaHQsIHJlY3QtPmJvdHRvbSwgRERFUlJfSU5WQUxJRFBBUkFNUyk7CiAgICAgICAgfQoKICAgICAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZV9Mb2NrKHN1cmZhY2UsIE5VTEwsICZsb2NrZWRfZGVzYywgRERMT0NLX1dBSVQsIE5VTEwpOwogICAgICAgIG9rKGhyID09IEREX09LLCAiSURpcmVjdERyYXdTdXJmYWNlX0xvY2socmVjdCA9IE5VTEwpIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlX0xvY2soc3VyZmFjZSwgTlVMTCwgJmxvY2tlZF9kZXNjLCBERExPQ0tfV0FJVCwgTlVMTCk7CiAgICAgICAgb2soaHIgPT0gRERFUlJfU1VSRkFDRUJVU1ksICJEb3VibGUgbG9jayhyZWN0ID0gTlVMTCkgcmV0dXJuZWQgMHglMDh4XG4iLCBocik7CiAgICAgICAgaWYoU1VDQ0VFREVEKGhyKSkgewogICAgICAgICAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZV9VbmxvY2soc3VyZmFjZSwgTlVMTCk7CiAgICAgICAgICAgIG9rKFNVQ0NFRURFRChociksICJVbmxvY2sgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICAgICAgfQogICAgICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlX1VubG9jayhzdXJmYWNlLCBOVUxMKTsKICAgICAgICBvayhTVUNDRUVERUQoaHIpLCAiVW5sb2NrIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwoKICAgICAgICBtZW1zZXQoJmxvY2tlZF9kZXNjLCAwLCBzaXplb2YobG9ja2VkX2Rlc2MpKTsKICAgICAgICBsb2NrZWRfZGVzYy5kd1NpemUgPSBzaXplb2YobG9ja2VkX2Rlc2MpOwogICAgICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlX0xvY2soc3VyZmFjZSwgJnZhbGlkWzBdLCAmbG9ja2VkX2Rlc2MsIERETE9DS19XQUlULCBOVUxMKTsKICAgICAgICBvayhociA9PSBERF9PSywgIklEaXJlY3REcmF3U3VyZmFjZV9Mb2NrKHJlY3QgPSBbJWQsICVkXS0+WyVkLCAlZF0pIGZhaWxlZCAoMHglMDh4KVxuIiwKICAgICAgICAgICB2YWxpZFswXS5sZWZ0LCB2YWxpZFswXS50b3AsIHZhbGlkWzBdLnJpZ2h0LCB2YWxpZFswXS5ib3R0b20sIGhyKTsKICAgICAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZV9Mb2NrKHN1cmZhY2UsICZ2YWxpZFswXSwgJmxvY2tlZF9kZXNjLCBERExPQ0tfV0FJVCwgTlVMTCk7CiAgICAgICAgb2soaHIgPT0gRERFUlJfU1VSRkFDRUJVU1ksICJEb3VibGUgbG9jayhyZWN0ID0gWyVkLCAlZF0tPlslZCwgJWRdKSBmYWlsZWQgKDB4JTA4eClcbiIsCiAgICAgICAgICAgdmFsaWRbMF0ubGVmdCwgdmFsaWRbMF0udG9wLCB2YWxpZFswXS5yaWdodCwgdmFsaWRbMF0uYm90dG9tLCBocik7CgogICAgICAgIC8qIExvY2tpbmcgYSBkaWZmZXJlbnQgcmVjdGFuZ2xlIHJldHVybnMgRERfT0ssIGJ1dCBpdCBzZWVtcyB0byBicmVhayB0aGUgc3VyZmFjZS4KICAgICAgICAgKiBBZnRlcndhcmRzIHVubG9ja2luZyB0aGUgc3VyZmFjZSBmYWlscyhOVUxMIHJlY3RhbmdsZSwgYW5kIGJvdGggbG9ja2VkIHJlY3RhbmdsZXMKICAgICAgICAgKi8KCiAgICAgICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2VfVW5sb2NrKHN1cmZhY2UsIE5VTEwpOwogICAgICAgIG9rKGhyID09IEREX09LLCAiVW5sb2NrIHJldHVybmVkICgweCUwOHgpXG4iLCBocik7CgogICAgICAgIElEaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlKHN1cmZhY2UpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBDb21wcmVzc2VkVGVzdCh2b2lkKQp7CiAgICBIUkVTVUxUIGhyOwogICAgSURpcmVjdERyYXdTdXJmYWNlNyAqc3VyZmFjZTsKICAgIEREU1VSRkFDRURFU0MyIGRkc2QsIGRkc2QyOwogICAgSURpcmVjdERyYXc3ICpkZDcgPSBOVUxMOwogICAgUkVDVCByID0geyAwLCAwLCAxMjgsIDEyOCB9OwogICAgUkVDVCByMiA9IHsgMzIsIDMyLCA2NCwgNjQgfTsKCiAgICBociA9IElEaXJlY3REcmF3X1F1ZXJ5SW50ZXJmYWNlKGxwREQsICZJSURfSURpcmVjdERyYXc3LCAodm9pZCAqKikgJmRkNyk7CiAgICBvayhociA9PSBERF9PSywgIklEaXJlY3REcmF3OjpRdWVyeUludGVyZmFjZSByZXR1cm5lZCAlMDh4XG4iLCBocik7CgogICAgbWVtc2V0KCZkZHNkLCAwLCBzaXplb2YoZGRzZCkpOwogICAgZGRzZC5kd1NpemUgPSBzaXplb2YoZGRzZCk7CiAgICBVNChkZHNkKS5kZHBmUGl4ZWxGb3JtYXQuZHdTaXplID0gc2l6ZW9mKFU0KGRkc2QpLmRkcGZQaXhlbEZvcm1hdCk7CiAgICBkZHNkLmR3RmxhZ3MgPSBERFNEX1dJRFRIIHwgRERTRF9IRUlHSFQgfCBERFNEX1BJWEVMRk9STUFUIHwgRERTRF9DQVBTOwogICAgZGRzZC5kd1dpZHRoID0gMTI4OwogICAgZGRzZC5kd0hlaWdodCA9IDEyODsKICAgIGRkc2QuZGRzQ2Fwcy5kd0NhcHMgPSBERFNDQVBTX1RFWFRVUkUgfCBERFNDQVBTX1NZU1RFTU1FTU9SWTsKICAgIFU0KGRkc2QpLmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzID0gRERQRl9GT1VSQ0M7CiAgICBVNChkZHNkKS5kZHBmUGl4ZWxGb3JtYXQuZHdGb3VyQ0MgPSBNQUtFRk9VUkNDKCdEJywnWCcsJ1QnLCcxJyk7CgogICAgaHIgPSBJRGlyZWN0RHJhdzdfQ3JlYXRlU3VyZmFjZShkZDcsICZkZHNkLCAmc3VyZmFjZSwgTlVMTCk7CiAgICBvayhociA9PSBERF9PSywgIkNyZWF0ZVN1cmZhY2UgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgaWYgKEZBSUxFRChocikpIHsKCXNraXAoImZhaWxlZCB0byBjcmVhdGUgc3VyZmFjZVxuIik7CglyZXR1cm47CiAgICB9CgogICAgbWVtc2V0KCZkZHNkMiwgMCwgc2l6ZW9mKGRkc2QyKSk7CiAgICBkZHNkMi5kd1NpemUgPSBzaXplb2YoZGRzZDIpOwogICAgVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdC5kd1NpemUgPSBzaXplb2YoVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdCk7CiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfR2V0U3VyZmFjZURlc2Moc3VyZmFjZSwgJmRkc2QyKTsKICAgIG9rKGhyID09IEREX09LLCAiR2V0U3VyZmFjZURlc2MgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwoKICAgIG9rKGRkc2QyLmR3RmxhZ3MgPT0gKEREU0RfUElYRUxGT1JNQVQgfCBERFNEX1dJRFRIIHwgRERTRF9IRUlHSFQgfCBERFNEX0NBUFMgfCBERFNEX0xJTkVBUlNJWkUpLAogICAgICAgIlN1cmZhY2UgZGVzYyBmbGFnczogJTA4eFxuIiwgZGRzZDIuZHdGbGFncyk7CiAgICBvayhVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MgPT0gRERQRl9GT1VSQ0MsICJQaXhlbCBmb3JtYXQgZmxhZ3M6ICUwOHhcbiIsIFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyk7CiAgICBvayhVMShVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0KS5kd1JHQkJpdENvdW50ID09IDAsICJSR0IgYml0Y291bnQ6ICUwOHhcbiIsIFUxKFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQpLmR3UkdCQml0Q291bnQpOwogICAgb2soZGRzZDIuZGRzQ2Fwcy5kd0NhcHMgPT0gKEREU0NBUFNfVEVYVFVSRSB8IEREU0NBUFNfU1lTVEVNTUVNT1JZKSwKICAgICAgICJTdXJmYWNlIGNhcHMgZmxhZ3M6ICUwOHhcbiIsIGRkc2QyLmRkc0NhcHMuZHdDYXBzKTsKICAgIG9rKFUxKGRkc2QyKS5kd0xpbmVhclNpemUgPT0gODE5MiwgIkxpbmVhciBzaXplIGlzICVkXG4iLCBVMShkZHNkMikuZHdMaW5lYXJTaXplKTsKICAgIG9rKGRkc2QyLmRkc0NhcHMuZHdDYXBzMiA9PSAwLCAiQ2FwczI6ICUwOHhcbiIsIGRkc2QyLmRkc0NhcHMuZHdDYXBzMik7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2Uoc3VyZmFjZSk7CgogICAgVTQoZGRzZCkuZGRwZlBpeGVsRm9ybWF0LmR3Rm91ckNDID0gTUFLRUZPVVJDQygnRCcsJ1gnLCdUJywnMycpOwogICAgaHIgPSBJRGlyZWN0RHJhdzdfQ3JlYXRlU3VyZmFjZShkZDcsICZkZHNkLCAmc3VyZmFjZSwgTlVMTCk7CiAgICBvayhociA9PSBERF9PSywgIkNyZWF0ZVN1cmZhY2UgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgaWYgKEZBSUxFRChocikpIHsKCXNraXAoImZhaWxlZCB0byBjcmVhdGUgc3VyZmFjZVxuIik7CglyZXR1cm47CiAgICB9CgogICAgbWVtc2V0KCZkZHNkMiwgMCwgc2l6ZW9mKGRkc2QyKSk7CiAgICBkZHNkMi5kd1NpemUgPSBzaXplb2YoZGRzZDIpOwogICAgVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdC5kd1NpemUgPSBzaXplb2YoVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdCk7CiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfR2V0U3VyZmFjZURlc2Moc3VyZmFjZSwgJmRkc2QyKTsKICAgIG9rKGhyID09IEREX09LLCAiR2V0U3VyZmFjZURlc2MgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwoKICAgIG9rKGRkc2QyLmR3RmxhZ3MgPT0gKEREU0RfUElYRUxGT1JNQVQgfCBERFNEX1dJRFRIIHwgRERTRF9IRUlHSFQgfCBERFNEX0NBUFMgfCBERFNEX0xJTkVBUlNJWkUpLAogICAgICAgIlN1cmZhY2UgZGVzYyBmbGFnczogJTA4eFxuIiwgZGRzZDIuZHdGbGFncyk7CiAgICBvayhVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MgPT0gRERQRl9GT1VSQ0MsICJQaXhlbCBmb3JtYXQgZmxhZ3M6ICUwOHhcbiIsIFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyk7CiAgICBvayhVMShVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0KS5kd1JHQkJpdENvdW50ID09IDAsICJSR0IgYml0Y291bnQ6ICUwOHhcbiIsIFUxKFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQpLmR3UkdCQml0Q291bnQpOwogICAgb2soZGRzZDIuZGRzQ2Fwcy5kd0NhcHMgPT0gKEREU0NBUFNfVEVYVFVSRSB8IEREU0NBUFNfU1lTVEVNTUVNT1JZKSwKICAgICAgICJTdXJmYWNlIGNhcHMgZmxhZ3M6ICUwOHhcbiIsIGRkc2QyLmRkc0NhcHMuZHdDYXBzKTsKICAgIG9rKFUxKGRkc2QyKS5kd0xpbmVhclNpemUgPT0gMTYzODQsICJMaW5lYXIgc2l6ZSBpcyAlZFxuIiwgVTEoZGRzZDIpLmR3TGluZWFyU2l6ZSk7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2Uoc3VyZmFjZSk7CgogICAgVTQoZGRzZCkuZGRwZlBpeGVsRm9ybWF0LmR3Rm91ckNDID0gTUFLRUZPVVJDQygnRCcsJ1gnLCdUJywnNScpOwogICAgaHIgPSBJRGlyZWN0RHJhdzdfQ3JlYXRlU3VyZmFjZShkZDcsICZkZHNkLCAmc3VyZmFjZSwgTlVMTCk7CiAgICBvayhociA9PSBERF9PSywgIkNyZWF0ZVN1cmZhY2UgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgaWYgKEZBSUxFRChocikpIHsKCXNraXAoImZhaWxlZCB0byBjcmVhdGUgc3VyZmFjZVxuIik7CglyZXR1cm47CiAgICB9CgogICAgbWVtc2V0KCZkZHNkMiwgMCwgc2l6ZW9mKGRkc2QyKSk7CiAgICBkZHNkMi5kd1NpemUgPSBzaXplb2YoZGRzZDIpOwogICAgVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdC5kd1NpemUgPSBzaXplb2YoVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdCk7CiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfR2V0U3VyZmFjZURlc2Moc3VyZmFjZSwgJmRkc2QyKTsKICAgIG9rKGhyID09IEREX09LLCAiR2V0U3VyZmFjZURlc2MgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwoKICAgIG9rKGRkc2QyLmR3RmxhZ3MgPT0gKEREU0RfUElYRUxGT1JNQVQgfCBERFNEX1dJRFRIIHwgRERTRF9IRUlHSFQgfCBERFNEX0NBUFMgfCBERFNEX0xJTkVBUlNJWkUpLAogICAgICAgIlN1cmZhY2UgZGVzYyBmbGFnczogJTA4eFxuIiwgZGRzZDIuZHdGbGFncyk7CiAgICBvayhVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MgPT0gRERQRl9GT1VSQ0MsICJQaXhlbCBmb3JtYXQgZmxhZ3M6ICUwOHhcbiIsIFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyk7CiAgICBvayhVMShVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0KS5kd1JHQkJpdENvdW50ID09IDAsICJSR0IgYml0Y291bnQ6ICUwOHhcbiIsIFUxKFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQpLmR3UkdCQml0Q291bnQpOwogICAgb2soZGRzZDIuZGRzQ2Fwcy5kd0NhcHMgPT0gKEREU0NBUFNfVEVYVFVSRSB8IEREU0NBUFNfU1lTVEVNTUVNT1JZKSwKICAgICAgICJTdXJmYWNlIGNhcHMgZmxhZ3M6ICUwOHhcbiIsIGRkc2QyLmRkc0NhcHMuZHdDYXBzKTsKICAgIG9rKFUxKGRkc2QyKS5kd0xpbmVhclNpemUgPT0gMTYzODQsICJMaW5lYXIgc2l6ZSBpcyAlZFxuIiwgVTEoZGRzZDIpLmR3TGluZWFyU2l6ZSk7CiAgICBvayhkZHNkMi5scFN1cmZhY2UgPT0gMCwgIlN1cmZhY2UgbWVtb3J5IGlzIGF0ICVwLCBleHBlY3RlZCBOVUxMXG4iLCBkZHNkMi5scFN1cmZhY2UpOwoKICAgIG1lbXNldCgmZGRzZDIsIDAsIHNpemVvZihkZHNkMikpOwogICAgZGRzZDIuZHdTaXplID0gc2l6ZW9mKGRkc2QyKTsKICAgIFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQuZHdTaXplID0gc2l6ZW9mKFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQpOwoKICAgIC8qIFNob3cgdGhhdCB0aGUgZGVzY3JpcHRpb24gaXMgbm90IGNoYW5nZWQgd2hlbiBsb2NraW5nIHRoZSBzdXJmYWNlLiBXaGF0IGlzIHJlYWxseSBpbnRlcmVzdGluZwogICAgICogYWJvdXQgdGhpcyBpcyB0aGF0IEREU0RfTFBTVVJGQUNFIGlzbid0IHNldC4KICAgICAqLwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0xvY2soc3VyZmFjZSwgTlVMTCwgJmRkc2QyLCBERExPQ0tfUkVBRE9OTFksIDApOwogICAgb2soaHIgPT0gRERfT0ssICJMb2NrIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICBvayhkZHNkMi5kd0ZsYWdzID09IChERFNEX1BJWEVMRk9STUFUIHwgRERTRF9XSURUSCB8IEREU0RfSEVJR0hUIHwgRERTRF9DQVBTIHwgRERTRF9MSU5FQVJTSVpFKSwKICAgICAgICJTdXJmYWNlIGRlc2MgZmxhZ3M6ICUwOHhcbiIsIGRkc2QyLmR3RmxhZ3MpOwogICAgb2soVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzID09IEREUEZfRk9VUkNDLCAiUGl4ZWwgZm9ybWF0IGZsYWdzOiAlMDh4XG4iLCBVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MpOwogICAgb2soVTEoVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdCkuZHdSR0JCaXRDb3VudCA9PSAwLCAiUkdCIGJpdGNvdW50OiAlMDh4XG4iLCBVMShVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0KS5kd1JHQkJpdENvdW50KTsKICAgIG9rKGRkc2QyLmRkc0NhcHMuZHdDYXBzID09IChERFNDQVBTX1RFWFRVUkUgfCBERFNDQVBTX1NZU1RFTU1FTU9SWSksCiAgICAgICAiU3VyZmFjZSBjYXBzIGZsYWdzOiAlMDh4XG4iLCBkZHNkMi5kZHNDYXBzLmR3Q2Fwcyk7CiAgICBvayhVMShkZHNkMikuZHdMaW5lYXJTaXplID09IDE2Mzg0LCAiTGluZWFyIHNpemUgaXMgJWRcbiIsIFUxKGRkc2QyKS5kd0xpbmVhclNpemUpOwogICAgb2soZGRzZDIubHBTdXJmYWNlICE9IDAsICJTdXJmYWNlIG1lbW9yeSBpcyBhdCBOVUxMXG4iKTsKCiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfVW5sb2NrKHN1cmZhY2UsIE5VTEwpOwogICAgb2soaHIgPT0gRERfT0ssICJVbmxvY2sgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwoKICAgIC8qIE5vdyB3aGF0IGFib3V0IGEgbG9ja2luZyByZWN0PyAgKi8KICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlN19Mb2NrKHN1cmZhY2UsICZyLCAmZGRzZDIsIERETE9DS19SRUFET05MWSwgMCk7CiAgICBvayhociA9PSBERF9PSywgIkxvY2sgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwoKICAgIG9rKGRkc2QyLmR3RmxhZ3MgPT0gKEREU0RfUElYRUxGT1JNQVQgfCBERFNEX1dJRFRIIHwgRERTRF9IRUlHSFQgfCBERFNEX0NBUFMgfCBERFNEX0xJTkVBUlNJWkUpLAogICAgICAgIlN1cmZhY2UgZGVzYyBmbGFnczogJTA4eFxuIiwgZGRzZDIuZHdGbGFncyk7CiAgICBvayhVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MgPT0gRERQRl9GT1VSQ0MsICJQaXhlbCBmb3JtYXQgZmxhZ3M6ICUwOHhcbiIsIFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyk7CiAgICBvayhVMShVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0KS5kd1JHQkJpdENvdW50ID09IDAsICJSR0IgYml0Y291bnQ6ICUwOHhcbiIsIFUxKFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQpLmR3UkdCQml0Q291bnQpOwogICAgb2soZGRzZDIuZGRzQ2Fwcy5kd0NhcHMgPT0gKEREU0NBUFNfVEVYVFVSRSB8IEREU0NBUFNfU1lTVEVNTUVNT1JZKSwKICAgICAgICJTdXJmYWNlIGNhcHMgZmxhZ3M6ICUwOHhcbiIsIGRkc2QyLmRkc0NhcHMuZHdDYXBzKTsKICAgIG9rKFUxKGRkc2QyKS5kd0xpbmVhclNpemUgPT0gMTYzODQsICJMaW5lYXIgc2l6ZSBpcyAlZFxuIiwgVTEoZGRzZDIpLmR3TGluZWFyU2l6ZSk7CiAgICBvayhkZHNkMi5scFN1cmZhY2UgIT0gMCwgIlN1cmZhY2UgbWVtb3J5IGlzIGF0IE5VTExcbiIpOwoKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlN19VbmxvY2soc3VyZmFjZSwgJnIpOwogICAgb2soaHIgPT0gRERfT0ssICJVbmxvY2sgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwoKICAgIC8qIE5vdyB3aGF0IGFib3V0IGEgZGlmZmVyZW50IGxvY2tpbmcgb2Zmc2V0PyAqLwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0xvY2soc3VyZmFjZSwgJnIyLCAmZGRzZDIsIERETE9DS19SRUFET05MWSwgMCk7CiAgICBvayhociA9PSBERF9PSywgIkxvY2sgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwoKICAgIG9rKGRkc2QyLmR3RmxhZ3MgPT0gKEREU0RfUElYRUxGT1JNQVQgfCBERFNEX1dJRFRIIHwgRERTRF9IRUlHSFQgfCBERFNEX0NBUFMgfCBERFNEX0xJTkVBUlNJWkUpLAogICAgICAgIlN1cmZhY2UgZGVzYyBmbGFnczogJTA4eFxuIiwgZGRzZDIuZHdGbGFncyk7CiAgICBvayhVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MgPT0gRERQRl9GT1VSQ0MsICJQaXhlbCBmb3JtYXQgZmxhZ3M6ICUwOHhcbiIsIFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyk7CiAgICBvayhVMShVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0KS5kd1JHQkJpdENvdW50ID09IDAsICJSR0IgYml0Y291bnQ6ICUwOHhcbiIsIFUxKFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQpLmR3UkdCQml0Q291bnQpOwogICAgb2soZGRzZDIuZGRzQ2Fwcy5kd0NhcHMgPT0gKEREU0NBUFNfVEVYVFVSRSB8IEREU0NBUFNfU1lTVEVNTUVNT1JZKSwKICAgICAgICJTdXJmYWNlIGNhcHMgZmxhZ3M6ICUwOHhcbiIsIGRkc2QyLmRkc0NhcHMuZHdDYXBzKTsKICAgIG9rKFUxKGRkc2QyKS5kd0xpbmVhclNpemUgPT0gMTYzODQsICJMaW5lYXIgc2l6ZSBpcyAlZFxuIiwgVTEoZGRzZDIpLmR3TGluZWFyU2l6ZSk7CiAgICBvayhkZHNkMi5scFN1cmZhY2UgIT0gMCwgIlN1cmZhY2UgbWVtb3J5IGlzIGF0IE5VTExcbiIpOwoKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlN19VbmxvY2soc3VyZmFjZSwgJnIyKTsKICAgIG9rKGhyID09IEREX09LLCAiVW5sb2NrIHJldHVybmVkICUwOHhcbiIsIGhyKTsKICAgIElEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShzdXJmYWNlKTsKCiAgICAvKiBUcnkgdGhpcyB3aXRoIHZpZGVvIG1lbW9yeS4gQSBraW5kIG9mIHN1cnByaXNlLiBJdCBzdGlsbCBoYXMgdGhlIExJTkVBUlNJWkUgZmxhZyBzZXQsCiAgICAgKiBidXQgc2VlbXMgdG8gaGF2ZSBhIHBpdGNoIGluc3RlYWQuCiAgICAgKi8KICAgIGRkc2QuZGRzQ2Fwcy5kd0NhcHMgPSBERFNDQVBTX1RFWFRVUkUgfCBERFNDQVBTX1ZJREVPTUVNT1JZOwogICAgVTQoZGRzZCkuZGRwZlBpeGVsRm9ybWF0LmR3Rm91ckNDID0gTUFLRUZPVVJDQygnRCcsJ1gnLCdUJywnMScpOwoKICAgIGhyID0gSURpcmVjdERyYXc3X0NyZWF0ZVN1cmZhY2UoZGQ3LCAmZGRzZCwgJnN1cmZhY2UsIE5VTEwpOwogICAgb2soaHIgPT0gRERfT0sgfHwgaHIgPT0gRERFUlJfTk9URVhUVVJFSFcgfHwgaHIgPT0gRERFUlJfSU5WQUxJRFBBUkFNUywKICAgICAgICJDcmVhdGVTdXJmYWNlIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICAvKiBOb3Qgc3VwcG9ydGVkIGV2ZXJ5d2hlcmUgKi8KICAgIGlmKFNVQ0NFRURFRChocikpCiAgICB7CiAgICAgICAgbWVtc2V0KCZkZHNkMiwgMCwgc2l6ZW9mKGRkc2QyKSk7CiAgICAgICAgZGRzZDIuZHdTaXplID0gc2l6ZW9mKGRkc2QyKTsKICAgICAgICBVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0LmR3U2l6ZSA9IHNpemVvZihVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0KTsKICAgICAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfR2V0U3VyZmFjZURlc2Moc3VyZmFjZSwgJmRkc2QyKTsKICAgICAgICBvayhociA9PSBERF9PSywgIkdldFN1cmZhY2VEZXNjIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICAgICAgb2soZGRzZDIuZHdGbGFncyA9PSAoRERTRF9QSVhFTEZPUk1BVCB8IEREU0RfV0lEVEggfCBERFNEX0hFSUdIVCB8IEREU0RfQ0FQUyB8IEREU0RfTElORUFSU0laRSksCiAgICAgICAgIlN1cmZhY2UgZGVzYyBmbGFnczogJTA4eFxuIiwgZGRzZDIuZHdGbGFncyk7CiAgICAgICAgb2soVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzID09IEREUEZfRk9VUkNDLCAiUGl4ZWwgZm9ybWF0IGZsYWdzOiAlMDh4XG4iLCBVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MpOwogICAgICAgIG9rKFUxKFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQpLmR3UkdCQml0Q291bnQgPT0gMCwgIlJHQiBiaXRjb3VudDogJTA4eFxuIiwgVTEoVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdCkuZHdSR0JCaXRDb3VudCk7CiAgICAgICAgb2soZGRzZDIuZGRzQ2Fwcy5kd0NhcHMgPT0gKEREU0NBUFNfVEVYVFVSRSB8IEREU0NBUFNfVklERU9NRU1PUlkgfCBERFNDQVBTX0xPQ0FMVklETUVNKSwKICAgICAgICAiU3VyZmFjZSBjYXBzIGZsYWdzOiAlMDh4XG4iLCBkZHNkMi5kZHNDYXBzLmR3Q2Fwcyk7CiAgICAgICAgLyogQVRJIGRyaXZlcnMgcmVwb3J0IGEgYnJva2VuIGxpbmVhciBzaXplLCB0aHVzIG5vIG5lZWQgdG8gY2xvbmUgdGhlIGV4YWN0IGJlaGF2aW91ci4gbnZpZGlhIHJlcG9ydHMgdGhlIGNvcnJlY3Qgc2l6ZSAqLwogICAgICAgIG9rKGRkc2QyLmRkc0NhcHMuZHdDYXBzMiA9PSAwLCAiQ2FwczI6ICUwOHhcbiIsIGRkc2QyLmRkc0NhcHMuZHdDYXBzMik7CiAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlN19SZWxlYXNlKHN1cmZhY2UpOwoKICAgICAgICBVNChkZHNkKS5kZHBmUGl4ZWxGb3JtYXQuZHdGb3VyQ0MgPSBNQUtFRk9VUkNDKCdEJywnWCcsJ1QnLCczJyk7CiAgICAgICAgaHIgPSBJRGlyZWN0RHJhdzdfQ3JlYXRlU3VyZmFjZShkZDcsICZkZHNkLCAmc3VyZmFjZSwgTlVMTCk7CiAgICAgICAgb2soaHIgPT0gRERfT0ssICJDcmVhdGVTdXJmYWNlIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICAgICAgbWVtc2V0KCZkZHNkMiwgMCwgc2l6ZW9mKGRkc2QyKSk7CiAgICAgICAgZGRzZDIuZHdTaXplID0gc2l6ZW9mKGRkc2QyKTsKICAgICAgICBVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0LmR3U2l6ZSA9IHNpemVvZihVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0KTsKICAgICAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfR2V0U3VyZmFjZURlc2Moc3VyZmFjZSwgJmRkc2QyKTsKICAgICAgICBvayhociA9PSBERF9PSywgIkdldFN1cmZhY2VEZXNjIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICAgICAgb2soZGRzZDIuZHdGbGFncyA9PSAoRERTRF9QSVhFTEZPUk1BVCB8IEREU0RfV0lEVEggfCBERFNEX0hFSUdIVCB8IEREU0RfQ0FQUyB8IEREU0RfTElORUFSU0laRSksCiAgICAgICAgIlN1cmZhY2UgZGVzYyBmbGFnczogJTA4eFxuIiwgZGRzZDIuZHdGbGFncyk7CiAgICAgICAgb2soVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzID09IEREUEZfRk9VUkNDLCAiUGl4ZWwgZm9ybWF0IGZsYWdzOiAlMDh4XG4iLCBVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MpOwogICAgICAgIG9rKFUxKFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQpLmR3UkdCQml0Q291bnQgPT0gMCwgIlJHQiBiaXRjb3VudDogJTA4eFxuIiwgVTEoVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdCkuZHdSR0JCaXRDb3VudCk7CiAgICAgICAgb2soZGRzZDIuZGRzQ2Fwcy5kd0NhcHMgPT0gKEREU0NBUFNfVEVYVFVSRSB8IEREU0NBUFNfVklERU9NRU1PUlkgfCBERFNDQVBTX0xPQ0FMVklETUVNKSwKICAgICAgICAiU3VyZmFjZSBjYXBzIGZsYWdzOiAlMDh4XG4iLCBkZHNkMi5kZHNDYXBzLmR3Q2Fwcyk7CiAgICAgICAgLyogQVRJIGRyaXZlcnMgcmVwb3J0IGEgYnJva2VuIGxpbmVhciBzaXplLCB0aHVzIG5vIG5lZWQgdG8gY2xvbmUgdGhlIGV4YWN0IGJlaGF2aW91ci4gbnZpZGlhIHJlcG9ydHMgdGhlIGNvcnJlY3Qgc2l6ZSAqLwogICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShzdXJmYWNlKTsKCiAgICAgICAgVTQoZGRzZCkuZGRwZlBpeGVsRm9ybWF0LmR3Rm91ckNDID0gTUFLRUZPVVJDQygnRCcsJ1gnLCdUJywnNScpOwogICAgICAgIGhyID0gSURpcmVjdERyYXc3X0NyZWF0ZVN1cmZhY2UoZGQ3LCAmZGRzZCwgJnN1cmZhY2UsIE5VTEwpOwogICAgICAgIG9rKGhyID09IEREX09LLCAiQ3JlYXRlU3VyZmFjZSByZXR1cm5lZCAlMDh4XG4iLCBocik7CgogICAgICAgIG1lbXNldCgmZGRzZDIsIDAsIHNpemVvZihkZHNkMikpOwogICAgICAgIGRkc2QyLmR3U2l6ZSA9IHNpemVvZihkZHNkMik7CiAgICAgICAgVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdC5kd1NpemUgPSBzaXplb2YoVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdCk7CiAgICAgICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0dldFN1cmZhY2VEZXNjKHN1cmZhY2UsICZkZHNkMik7CiAgICAgICAgb2soaHIgPT0gRERfT0ssICJHZXRTdXJmYWNlRGVzYyByZXR1cm5lZCAlMDh4XG4iLCBocik7CgogICAgICAgIG9rKGRkc2QyLmR3RmxhZ3MgPT0gKEREU0RfUElYRUxGT1JNQVQgfCBERFNEX1dJRFRIIHwgRERTRF9IRUlHSFQgfCBERFNEX0NBUFMgfCBERFNEX0xJTkVBUlNJWkUpLAogICAgICAgICJTdXJmYWNlIGRlc2MgZmxhZ3M6ICUwOHhcbiIsIGRkc2QyLmR3RmxhZ3MpOwogICAgICAgIG9rKFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyA9PSBERFBGX0ZPVVJDQywgIlBpeGVsIGZvcm1hdCBmbGFnczogJTA4eFxuIiwgVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzKTsKICAgICAgICBvayhVMShVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0KS5kd1JHQkJpdENvdW50ID09IDAsICJSR0IgYml0Y291bnQ6ICUwOHhcbiIsIFUxKFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQpLmR3UkdCQml0Q291bnQpOwogICAgICAgIG9rKGRkc2QyLmRkc0NhcHMuZHdDYXBzID09IChERFNDQVBTX1RFWFRVUkUgfCBERFNDQVBTX1ZJREVPTUVNT1JZIHwgRERTQ0FQU19MT0NBTFZJRE1FTSksCiAgICAgICAgIlN1cmZhY2UgY2FwcyBmbGFnczogJTA4eFxuIiwgZGRzZDIuZGRzQ2Fwcy5kd0NhcHMpOwogICAgICAgIC8qIEFUSSBkcml2ZXJzIHJlcG9ydCBhIGJyb2tlbiBsaW5lYXIgc2l6ZSwgdGh1cyBubyBuZWVkIHRvIGNsb25lIHRoZSBleGFjdCBiZWhhdmlvdXIuIG52aWRpYSByZXBvcnRzIHRoZSBjb3JyZWN0IHNpemUgKi8KICAgICAgICBvayhkZHNkMi5scFN1cmZhY2UgPT0gMCwgIlN1cmZhY2UgbWVtb3J5IGlzIGF0ICVwLCBleHBlY3RlZCBOVUxMXG4iLCBkZHNkMi5scFN1cmZhY2UpOwoKICAgICAgICBtZW1zZXQoJmRkc2QyLCAwLCBzaXplb2YoZGRzZDIpKTsKICAgICAgICBkZHNkMi5kd1NpemUgPSBzaXplb2YoZGRzZDIpOwogICAgICAgIFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQuZHdTaXplID0gc2l6ZW9mKFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQpOwoKICAgICAgICAvKiBTaG93IHRoYXQgdGhlIGRlc2NyaXB0aW9uIGlzIG5vdCBjaGFuZ2VkIHdoZW4gbG9ja2luZyB0aGUgc3VyZmFjZS4gV2hhdCBpcyByZWFsbHkgaW50ZXJlc3RpbmcKICAgICAgICAqIGFib3V0IHRoaXMgaXMgdGhhdCBERFNEX0xQU1VSRkFDRSBpc24ndCBzZXQuCiAgICAgICAgKi8KICAgICAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfTG9jayhzdXJmYWNlLCBOVUxMLCAmZGRzZDIsIERETE9DS19SRUFET05MWSwgMCk7CiAgICAgICAgb2soaHIgPT0gRERfT0ssICJMb2NrIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICAgICAgb2soZGRzZDIuZHdGbGFncyA9PSAoRERTRF9QSVhFTEZPUk1BVCB8IEREU0RfV0lEVEggfCBERFNEX0hFSUdIVCB8IEREU0RfQ0FQUyB8IEREU0RfTElORUFSU0laRSksCiAgICAgICAgIlN1cmZhY2UgZGVzYyBmbGFnczogJTA4eFxuIiwgZGRzZDIuZHdGbGFncyk7CiAgICAgICAgb2soVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzID09IEREUEZfRk9VUkNDLCAiUGl4ZWwgZm9ybWF0IGZsYWdzOiAlMDh4XG4iLCBVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MpOwogICAgICAgIG9rKFUxKFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQpLmR3UkdCQml0Q291bnQgPT0gMCwgIlJHQiBiaXRjb3VudDogJTA4eFxuIiwgVTEoVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdCkuZHdSR0JCaXRDb3VudCk7CiAgICAgICAgb2soZGRzZDIuZGRzQ2Fwcy5kd0NhcHMgPT0gKEREU0NBUFNfVEVYVFVSRSB8IEREU0NBUFNfVklERU9NRU1PUlkgfCBERFNDQVBTX0xPQ0FMVklETUVNKSwKICAgICAgICAiU3VyZmFjZSBjYXBzIGZsYWdzOiAlMDh4XG4iLCBkZHNkMi5kZHNDYXBzLmR3Q2Fwcyk7CiAgICAgICAgLyogQVRJIGRyaXZlcnMgcmVwb3J0IGEgYnJva2VuIGxpbmVhciBzaXplLCB0aHVzIG5vIG5lZWQgdG8gY2xvbmUgdGhlIGV4YWN0IGJlaGF2aW91ci4gbnZpZGlhIHJlcG9ydHMgdGhlIGNvcnJlY3Qgc2l6ZSAqLwogICAgICAgIG9rKGRkc2QyLmxwU3VyZmFjZSAhPSAwLCAiU3VyZmFjZSBtZW1vcnkgaXMgYXQgTlVMTFxuIik7CgogICAgICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlN19VbmxvY2soc3VyZmFjZSwgTlVMTCk7CiAgICAgICAgb2soaHIgPT0gRERfT0ssICJVbmxvY2sgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwoKICAgICAgICAvKiBOb3cgd2hhdCBhYm91dCBhIGxvY2tpbmcgcmVjdD8gICovCiAgICAgICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0xvY2soc3VyZmFjZSwgJnIsICZkZHNkMiwgRERMT0NLX1JFQURPTkxZLCAwKTsKICAgICAgICBvayhociA9PSBERF9PSywgIkxvY2sgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwoKICAgICAgICBvayhkZHNkMi5kd0ZsYWdzID09IChERFNEX1BJWEVMRk9STUFUIHwgRERTRF9XSURUSCB8IEREU0RfSEVJR0hUIHwgRERTRF9DQVBTIHwgRERTRF9MSU5FQVJTSVpFKSwKICAgICAgICAiU3VyZmFjZSBkZXNjIGZsYWdzOiAlMDh4XG4iLCBkZHNkMi5kd0ZsYWdzKTsKICAgICAgICBvayhVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MgPT0gRERQRl9GT1VSQ0MsICJQaXhlbCBmb3JtYXQgZmxhZ3M6ICUwOHhcbiIsIFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyk7CiAgICAgICAgb2soVTEoVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdCkuZHdSR0JCaXRDb3VudCA9PSAwLCAiUkdCIGJpdGNvdW50OiAlMDh4XG4iLCBVMShVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0KS5kd1JHQkJpdENvdW50KTsKICAgICAgICBvayhkZHNkMi5kZHNDYXBzLmR3Q2FwcyA9PSAoRERTQ0FQU19URVhUVVJFIHwgRERTQ0FQU19WSURFT01FTU9SWSB8IEREU0NBUFNfTE9DQUxWSURNRU0pLAogICAgICAgICJTdXJmYWNlIGNhcHMgZmxhZ3M6ICUwOHhcbiIsIGRkc2QyLmRkc0NhcHMuZHdDYXBzKTsKICAgICAgICAvKiBBVEkgZHJpdmVycyByZXBvcnQgYSBicm9rZW4gbGluZWFyIHNpemUsIHRodXMgbm8gbmVlZCB0byBjbG9uZSB0aGUgZXhhY3QgYmVoYXZpb3VyLiBudmlkaWEgcmVwb3J0cyB0aGUgY29ycmVjdCBzaXplICovCiAgICAgICAgb2soZGRzZDIubHBTdXJmYWNlICE9IDAsICJTdXJmYWNlIG1lbW9yeSBpcyBhdCBOVUxMXG4iKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X1VubG9jayhzdXJmYWNlLCAmcik7CiAgICAgICAgb2soaHIgPT0gRERfT0ssICJVbmxvY2sgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwoKICAgICAgICAvKiBOb3cgd2hhdCBhYm91dCBhIGRpZmZlcmVudCBsb2NraW5nIG9mZnNldD8gKi8KICAgICAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfTG9jayhzdXJmYWNlLCAmcjIsICZkZHNkMiwgRERMT0NLX1JFQURPTkxZLCAwKTsKICAgICAgICBvayhociA9PSBERF9PSywgIkxvY2sgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwoKICAgICAgICBvayhkZHNkMi5kd0ZsYWdzID09IChERFNEX1BJWEVMRk9STUFUIHwgRERTRF9XSURUSCB8IEREU0RfSEVJR0hUIHwgRERTRF9DQVBTIHwgRERTRF9MSU5FQVJTSVpFKSwKICAgICAgICAiU3VyZmFjZSBkZXNjIGZsYWdzOiAlMDh4XG4iLCBkZHNkMi5kd0ZsYWdzKTsKICAgICAgICBvayhVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MgPT0gRERQRl9GT1VSQ0MsICJQaXhlbCBmb3JtYXQgZmxhZ3M6ICUwOHhcbiIsIFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyk7CiAgICAgICAgb2soVTEoVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdCkuZHdSR0JCaXRDb3VudCA9PSAwLCAiUkdCIGJpdGNvdW50OiAlMDh4XG4iLCBVMShVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0KS5kd1JHQkJpdENvdW50KTsKICAgICAgICBvayhkZHNkMi5kZHNDYXBzLmR3Q2FwcyA9PSAoRERTQ0FQU19URVhUVVJFIHwgRERTQ0FQU19WSURFT01FTU9SWSB8IEREU0NBUFNfTE9DQUxWSURNRU0pLAogICAgICAgICJTdXJmYWNlIGNhcHMgZmxhZ3M6ICUwOHhcbiIsIGRkc2QyLmRkc0NhcHMuZHdDYXBzKTsKICAgICAgICAvKiBBVEkgZHJpdmVycyByZXBvcnQgYSBicm9rZW4gbGluZWFyIHNpemUsIHRodXMgbm8gbmVlZCB0byBjbG9uZSB0aGUgZXhhY3QgYmVoYXZpb3VyLiBudmlkaWEgcmVwb3J0cyB0aGUgY29ycmVjdCBzaXplICovCiAgICAgICAgb2soZGRzZDIubHBTdXJmYWNlICE9IDAsICJTdXJmYWNlIG1lbW9yeSBpcyBhdCBOVUxMXG4iKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X1VubG9jayhzdXJmYWNlLCAmcjIpOwogICAgICAgIG9rKGhyID09IEREX09LLCAiVW5sb2NrIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlN19SZWxlYXNlKHN1cmZhY2UpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHNraXAoIkhhcmR3YXJlIERYVE4gdGV4dHVyZXMgbm90IHN1cHBvcnRlZFxuIik7CiAgICB9CgogICAgLyogV2hhdCBoYXBwZW5zIHRvIG1hbmFnZWQgdGV4dHVyZXM/IEludGVyZXN0aW5nbHksIFdpbmRvd3MgcmVwb3J0cyB0aGVtIGFzIGJlaW5nIGluIHN5c3RlbQogICAgICogbWVtb3J5LiBUaGUgbGluZWFyIHNpemUgZml0cyBhZ2Fpbi4KICAgICAqLwogICAgZGRzZC5kZHNDYXBzLmR3Q2FwcyA9IEREU0NBUFNfVEVYVFVSRTsKICAgIGRkc2QuZGRzQ2Fwcy5kd0NhcHMyID0gRERTQ0FQUzJfVEVYVFVSRU1BTkFHRTsKICAgIFU0KGRkc2QpLmRkcGZQaXhlbEZvcm1hdC5kd0ZvdXJDQyA9IE1BS0VGT1VSQ0MoJ0QnLCdYJywnVCcsJzEnKTsKCiAgICBociA9IElEaXJlY3REcmF3N19DcmVhdGVTdXJmYWNlKGRkNywgJmRkc2QsICZzdXJmYWNlLCBOVUxMKTsKICAgIG9rKGhyID09IEREX09LIHx8IGhyID09IERERVJSX05PVEVYVFVSRUhXLCAiQ3JlYXRlU3VyZmFjZSByZXR1cm5lZCAlMDh4XG4iLCBocik7CgogICAgLyogTm90IHN1cHBvcnRlZCBldmVyeXdoZXJlICovCiAgICBpZihTVUNDRUVERUQoaHIpKQogICAgewogICAgICAgIG1lbXNldCgmZGRzZDIsIDAsIHNpemVvZihkZHNkMikpOwogICAgICAgIGRkc2QyLmR3U2l6ZSA9IHNpemVvZihkZHNkMik7CiAgICAgICAgVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdC5kd1NpemUgPSBzaXplb2YoVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdCk7CiAgICAgICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0dldFN1cmZhY2VEZXNjKHN1cmZhY2UsICZkZHNkMik7CiAgICAgICAgb2soaHIgPT0gRERfT0ssICJHZXRTdXJmYWNlRGVzYyByZXR1cm5lZCAlMDh4XG4iLCBocik7CgogICAgICAgIG9rKGRkc2QyLmR3RmxhZ3MgPT0gKEREU0RfUElYRUxGT1JNQVQgfCBERFNEX1dJRFRIIHwgRERTRF9IRUlHSFQgfCBERFNEX0NBUFMgfCBERFNEX0xJTkVBUlNJWkUpLAogICAgICAgICJTdXJmYWNlIGRlc2MgZmxhZ3M6ICUwOHhcbiIsIGRkc2QyLmR3RmxhZ3MpOwogICAgICAgIG9rKFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyA9PSBERFBGX0ZPVVJDQywgIlBpeGVsIGZvcm1hdCBmbGFnczogJTA4eFxuIiwgVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzKTsKICAgICAgICBvayhVMShVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0KS5kd1JHQkJpdENvdW50ID09IDAsICJSR0IgYml0Y291bnQ6ICUwOHhcbiIsIFUxKFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQpLmR3UkdCQml0Q291bnQpOwogICAgICAgIG9rKGRkc2QyLmRkc0NhcHMuZHdDYXBzID09IChERFNDQVBTX1RFWFRVUkUgfCBERFNDQVBTX1NZU1RFTU1FTU9SWSksCiAgICAgICAgIlN1cmZhY2UgY2FwcyBmbGFnczogJTA4eFxuIiwgZGRzZDIuZGRzQ2Fwcy5kd0NhcHMpOwogICAgICAgIG9rKFUxKGRkc2QyKS5kd0xpbmVhclNpemUgPT0gODE5MiwgIkxpbmVhciBzaXplIGlzICVkXG4iLCBVMShkZHNkMikuZHdMaW5lYXJTaXplKTsKICAgICAgICBvayhkZHNkMi5kZHNDYXBzLmR3Q2FwczIgPT0gRERTQ0FQUzJfVEVYVFVSRU1BTkFHRSwgIkNhcHMyOiAlMDh4XG4iLCBkZHNkMi5kZHNDYXBzLmR3Q2FwczIpOwogICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShzdXJmYWNlKTsKCiAgICAgICAgVTQoZGRzZCkuZGRwZlBpeGVsRm9ybWF0LmR3Rm91ckNDID0gTUFLRUZPVVJDQygnRCcsJ1gnLCdUJywnMycpOwogICAgICAgIGhyID0gSURpcmVjdERyYXc3X0NyZWF0ZVN1cmZhY2UoZGQ3LCAmZGRzZCwgJnN1cmZhY2UsIE5VTEwpOwogICAgICAgIG9rKGhyID09IEREX09LLCAiQ3JlYXRlU3VyZmFjZSByZXR1cm5lZCAlMDh4XG4iLCBocik7CgogICAgICAgIG1lbXNldCgmZGRzZDIsIDAsIHNpemVvZihkZHNkMikpOwogICAgICAgIGRkc2QyLmR3U2l6ZSA9IHNpemVvZihkZHNkMik7CiAgICAgICAgVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdC5kd1NpemUgPSBzaXplb2YoVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdCk7CiAgICAgICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0dldFN1cmZhY2VEZXNjKHN1cmZhY2UsICZkZHNkMik7CiAgICAgICAgb2soaHIgPT0gRERfT0ssICJHZXRTdXJmYWNlRGVzYyByZXR1cm5lZCAlMDh4XG4iLCBocik7CgogICAgICAgIG9rKGRkc2QyLmR3RmxhZ3MgPT0gKEREU0RfUElYRUxGT1JNQVQgfCBERFNEX1dJRFRIIHwgRERTRF9IRUlHSFQgfCBERFNEX0NBUFMgfCBERFNEX0xJTkVBUlNJWkUpLAogICAgICAgICJTdXJmYWNlIGRlc2MgZmxhZ3M6ICUwOHhcbiIsIGRkc2QyLmR3RmxhZ3MpOwogICAgICAgIG9rKFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyA9PSBERFBGX0ZPVVJDQywgIlBpeGVsIGZvcm1hdCBmbGFnczogJTA4eFxuIiwgVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzKTsKICAgICAgICBvayhVMShVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0KS5kd1JHQkJpdENvdW50ID09IDAsICJSR0IgYml0Y291bnQ6ICUwOHhcbiIsIFUxKFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQpLmR3UkdCQml0Q291bnQpOwogICAgICAgIG9rKGRkc2QyLmRkc0NhcHMuZHdDYXBzID09IChERFNDQVBTX1RFWFRVUkUgfCBERFNDQVBTX1NZU1RFTU1FTU9SWSksCiAgICAgICAgIlN1cmZhY2UgY2FwcyBmbGFnczogJTA4eFxuIiwgZGRzZDIuZGRzQ2Fwcy5kd0NhcHMpOwogICAgICAgIG9rKFUxKGRkc2QyKS5kd0xpbmVhclNpemUgPT0gMTYzODQsICJMaW5lYXIgc2l6ZSBpcyAlZFxuIiwgVTEoZGRzZDIpLmR3TGluZWFyU2l6ZSk7CiAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlN19SZWxlYXNlKHN1cmZhY2UpOwoKICAgICAgICBVNChkZHNkKS5kZHBmUGl4ZWxGb3JtYXQuZHdGb3VyQ0MgPSBNQUtFRk9VUkNDKCdEJywnWCcsJ1QnLCc1Jyk7CiAgICAgICAgaHIgPSBJRGlyZWN0RHJhdzdfQ3JlYXRlU3VyZmFjZShkZDcsICZkZHNkLCAmc3VyZmFjZSwgTlVMTCk7CiAgICAgICAgb2soaHIgPT0gRERfT0ssICJDcmVhdGVTdXJmYWNlIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICAgICAgbWVtc2V0KCZkZHNkMiwgMCwgc2l6ZW9mKGRkc2QyKSk7CiAgICAgICAgZGRzZDIuZHdTaXplID0gc2l6ZW9mKGRkc2QyKTsKICAgICAgICBVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0LmR3U2l6ZSA9IHNpemVvZihVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0KTsKICAgICAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfR2V0U3VyZmFjZURlc2Moc3VyZmFjZSwgJmRkc2QyKTsKICAgICAgICBvayhociA9PSBERF9PSywgIkdldFN1cmZhY2VEZXNjIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICAgICAgb2soZGRzZDIuZHdGbGFncyA9PSAoRERTRF9QSVhFTEZPUk1BVCB8IEREU0RfV0lEVEggfCBERFNEX0hFSUdIVCB8IEREU0RfQ0FQUyB8IEREU0RfTElORUFSU0laRSksCiAgICAgICAgIlN1cmZhY2UgZGVzYyBmbGFnczogJTA4eFxuIiwgZGRzZDIuZHdGbGFncyk7CiAgICAgICAgb2soVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzID09IEREUEZfRk9VUkNDLCAiUGl4ZWwgZm9ybWF0IGZsYWdzOiAlMDh4XG4iLCBVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MpOwogICAgICAgIG9rKFUxKFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQpLmR3UkdCQml0Q291bnQgPT0gMCwgIlJHQiBiaXRjb3VudDogJTA4eFxuIiwgVTEoVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdCkuZHdSR0JCaXRDb3VudCk7CiAgICAgICAgb2soZGRzZDIuZGRzQ2Fwcy5kd0NhcHMgPT0gKEREU0NBUFNfVEVYVFVSRSB8IEREU0NBUFNfU1lTVEVNTUVNT1JZKSwKICAgICAgICAiU3VyZmFjZSBjYXBzIGZsYWdzOiAlMDh4XG4iLCBkZHNkMi5kZHNDYXBzLmR3Q2Fwcyk7CiAgICAgICAgb2soVTEoZGRzZDIpLmR3TGluZWFyU2l6ZSA9PSAxNjM4NCwgIkxpbmVhciBzaXplIGlzICVkXG4iLCBVMShkZHNkMikuZHdMaW5lYXJTaXplKTsKICAgICAgICBvayhkZHNkMi5scFN1cmZhY2UgPT0gMCwgIlN1cmZhY2UgbWVtb3J5IGlzIGF0ICVwLCBleHBlY3RlZCBOVUxMXG4iLCBkZHNkMi5scFN1cmZhY2UpOwoKICAgICAgICBtZW1zZXQoJmRkc2QyLCAwLCBzaXplb2YoZGRzZDIpKTsKICAgICAgICBkZHNkMi5kd1NpemUgPSBzaXplb2YoZGRzZDIpOwogICAgICAgIFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQuZHdTaXplID0gc2l6ZW9mKFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQpOwoKICAgICAgICAvKiBTaG93IHRoYXQgdGhlIGRlc2NyaXB0aW9uIGlzIG5vdCBjaGFuZ2VkIHdoZW4gbG9ja2luZyB0aGUgc3VyZmFjZS4gV2hhdCBpcyByZWFsbHkgaW50ZXJlc3RpbmcKICAgICAgICAqIGFib3V0IHRoaXMgaXMgdGhhdCBERFNEX0xQU1VSRkFDRSBpc24ndCBzZXQuCiAgICAgICAgKi8KICAgICAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfTG9jayhzdXJmYWNlLCBOVUxMLCAmZGRzZDIsIERETE9DS19SRUFET05MWSwgMCk7CiAgICAgICAgb2soaHIgPT0gRERfT0ssICJMb2NrIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICAgICAgb2soZGRzZDIuZHdGbGFncyA9PSAoRERTRF9QSVhFTEZPUk1BVCB8IEREU0RfV0lEVEggfCBERFNEX0hFSUdIVCB8IEREU0RfQ0FQUyB8IEREU0RfTElORUFSU0laRSksCiAgICAgICAgIlN1cmZhY2UgZGVzYyBmbGFnczogJTA4eFxuIiwgZGRzZDIuZHdGbGFncyk7CiAgICAgICAgb2soVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzID09IEREUEZfRk9VUkNDLCAiUGl4ZWwgZm9ybWF0IGZsYWdzOiAlMDh4XG4iLCBVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MpOwogICAgICAgIG9rKFUxKFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQpLmR3UkdCQml0Q291bnQgPT0gMCwgIlJHQiBiaXRjb3VudDogJTA4eFxuIiwgVTEoVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdCkuZHdSR0JCaXRDb3VudCk7CiAgICAgICAgb2soZGRzZDIuZGRzQ2Fwcy5kd0NhcHMgPT0gKEREU0NBUFNfVEVYVFVSRSB8IEREU0NBUFNfU1lTVEVNTUVNT1JZKSwKICAgICAgICAiU3VyZmFjZSBjYXBzIGZsYWdzOiAlMDh4XG4iLCBkZHNkMi5kZHNDYXBzLmR3Q2Fwcyk7CiAgICAgICAgb2soVTEoZGRzZDIpLmR3TGluZWFyU2l6ZSA9PSAxNjM4NCwgIkxpbmVhciBzaXplIGlzICVkXG4iLCBVMShkZHNkMikuZHdMaW5lYXJTaXplKTsKICAgICAgICBvayhkZHNkMi5scFN1cmZhY2UgIT0gMCwgIlN1cmZhY2UgbWVtb3J5IGlzIGF0IE5VTExcbiIpOwoKICAgICAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfVW5sb2NrKHN1cmZhY2UsIE5VTEwpOwogICAgICAgIG9rKGhyID09IEREX09LLCAiVW5sb2NrIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICAgICAgLyogTm93IHdoYXQgYWJvdXQgYSBsb2NraW5nIHJlY3Q/ICAqLwogICAgICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlN19Mb2NrKHN1cmZhY2UsICZyLCAmZGRzZDIsIERETE9DS19SRUFET05MWSwgMCk7CiAgICAgICAgb2soaHIgPT0gRERfT0ssICJMb2NrIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICAgICAgb2soZGRzZDIuZHdGbGFncyA9PSAoRERTRF9QSVhFTEZPUk1BVCB8IEREU0RfV0lEVEggfCBERFNEX0hFSUdIVCB8IEREU0RfQ0FQUyB8IEREU0RfTElORUFSU0laRSksCiAgICAgICAgIlN1cmZhY2UgZGVzYyBmbGFnczogJTA4eFxuIiwgZGRzZDIuZHdGbGFncyk7CiAgICAgICAgb2soVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzID09IEREUEZfRk9VUkNDLCAiUGl4ZWwgZm9ybWF0IGZsYWdzOiAlMDh4XG4iLCBVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MpOwogICAgICAgIG9rKFUxKFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQpLmR3UkdCQml0Q291bnQgPT0gMCwgIlJHQiBiaXRjb3VudDogJTA4eFxuIiwgVTEoVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdCkuZHdSR0JCaXRDb3VudCk7CiAgICAgICAgb2soZGRzZDIuZGRzQ2Fwcy5kd0NhcHMgPT0gKEREU0NBUFNfVEVYVFVSRSB8IEREU0NBUFNfU1lTVEVNTUVNT1JZKSwKICAgICAgICAiU3VyZmFjZSBjYXBzIGZsYWdzOiAlMDh4XG4iLCBkZHNkMi5kZHNDYXBzLmR3Q2Fwcyk7CiAgICAgICAgb2soVTEoZGRzZDIpLmR3TGluZWFyU2l6ZSA9PSAxNjM4NCwgIlwiTGluZWFyXCIgc2l6ZSBpcyAlZFxuIiwgVTEoZGRzZDIpLmR3TGluZWFyU2l6ZSk7CiAgICAgICAgb2soZGRzZDIubHBTdXJmYWNlICE9IDAsICJTdXJmYWNlIG1lbW9yeSBpcyBhdCBOVUxMXG4iKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X1VubG9jayhzdXJmYWNlLCAmcik7CiAgICAgICAgb2soaHIgPT0gRERfT0ssICJVbmxvY2sgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwoKICAgICAgICAvKiBOb3cgd2hhdCBhYm91dCBhIGRpZmZlcmVudCBsb2NraW5nIG9mZnNldD8gKi8KICAgICAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfTG9jayhzdXJmYWNlLCAmcjIsICZkZHNkMiwgRERMT0NLX1JFQURPTkxZLCAwKTsKICAgICAgICBvayhociA9PSBERF9PSywgIkxvY2sgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwoKICAgICAgICBvayhkZHNkMi5kd0ZsYWdzID09IChERFNEX1BJWEVMRk9STUFUIHwgRERTRF9XSURUSCB8IEREU0RfSEVJR0hUIHwgRERTRF9DQVBTIHwgRERTRF9MSU5FQVJTSVpFKSwKICAgICAgICAiU3VyZmFjZSBkZXNjIGZsYWdzOiAlMDh4XG4iLCBkZHNkMi5kd0ZsYWdzKTsKICAgICAgICBvayhVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MgPT0gRERQRl9GT1VSQ0MsICJQaXhlbCBmb3JtYXQgZmxhZ3M6ICUwOHhcbiIsIFU0KGRkc2QyKS5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyk7CiAgICAgICAgb2soVTEoVTQoZGRzZDIpLmRkcGZQaXhlbEZvcm1hdCkuZHdSR0JCaXRDb3VudCA9PSAwLCAiUkdCIGJpdGNvdW50OiAlMDh4XG4iLCBVMShVNChkZHNkMikuZGRwZlBpeGVsRm9ybWF0KS5kd1JHQkJpdENvdW50KTsKICAgICAgICBvayhkZHNkMi5kZHNDYXBzLmR3Q2FwcyA9PSAoRERTQ0FQU19URVhUVVJFIHwgRERTQ0FQU19TWVNURU1NRU1PUlkpLAogICAgICAgICJTdXJmYWNlIGNhcHMgZmxhZ3M6ICUwOHhcbiIsIGRkc2QyLmRkc0NhcHMuZHdDYXBzKTsKICAgICAgICBvayhVMShkZHNkMikuZHdMaW5lYXJTaXplID09IDE2Mzg0LCAiXCJMaW5lYXJcIiBzaXplIGlzICVkXG4iLCBVMShkZHNkMikuZHdMaW5lYXJTaXplKTsKICAgICAgICBvayhkZHNkMi5scFN1cmZhY2UgIT0gMCwgIlN1cmZhY2UgbWVtb3J5IGlzIGF0IE5VTExcbiIpOwoKICAgICAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfVW5sb2NrKHN1cmZhY2UsICZyMik7CiAgICAgICAgb2soaHIgPT0gRERfT0ssICJVbmxvY2sgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwoKICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2Uoc3VyZmFjZSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgc2tpcCgiSGFyZHdhcmUgRFhUTiB0ZXh0dXJlcyBub3Qgc3VwcG9ydGVkXG4iKTsKICAgIH0KCiAgICBJRGlyZWN0RHJhdzdfUmVsZWFzZShkZDcpOwp9CgpzdGF0aWMgdm9pZCBTaXplVGVzdCh2b2lkKQp7CiAgICBMUERJUkVDVERSQVdTVVJGQUNFIGRzdXJmYWNlID0gTlVMTDsKICAgIEREU1VSRkFDRURFU0MgZGVzYzsKICAgIEhSRVNVTFQgcmV0OwogICAgSFdORCB3aW5kb3cgPSBDcmVhdGVXaW5kb3coICJzdGF0aWMiLCAiZGRyYXdfdGVzdCIsIFdTX09WRVJMQVBQRURXSU5ET1csIDEwMCwgMTAwLCAxNjAsIDE2MCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCApOwoKICAgIC8qIENyZWF0ZSBhbiBvZmZzY3JlZW4gc3VyZmFjZSBzdXJmYWNlIHdpdGhvdXQgYSBzaXplICovCiAgICBaZXJvTWVtb3J5KCZkZXNjLCBzaXplb2YoZGVzYykpOwogICAgZGVzYy5kd1NpemUgPSBzaXplb2YoZGVzYyk7CiAgICBkZXNjLmR3RmxhZ3MgPSBERFNEX0NBUFM7CiAgICBkZXNjLmRkc0NhcHMuZHdDYXBzIHw9IEREU0NBUFNfT0ZGU0NSRUVOUExBSU47CiAgICB0cmFjZSgiYmVmb3JlIG9mZnNjcmVlbnBsYWluIGNyZWF0ZSBkc3VyZmFjZSA9ICVwXG4iLCBkc3VyZmFjZSk7CiAgICByZXQgPSBJRGlyZWN0RHJhd19DcmVhdGVTdXJmYWNlKGxwREQsICZkZXNjLCAmZHN1cmZhY2UsIE5VTEwpOwogICAgb2socmV0ID09IERERVJSX0lOVkFMSURQQVJBTVMsICJDcmVhdGluZyBhbiBvZmZzY3JlZW4gcGxhaW4gc3VyZmFjZSB3aXRob3V0IGEgc2l6ZSBpbmZvIHJldHVybmVkICUwOHggKGRzdXJmYWNlPSVwKVxuIiwgcmV0LCBkc3VyZmFjZSk7CiAgICBpZihkc3VyZmFjZSkKICAgIHsKICAgICAgICB0cmFjZSgiU3VyZmFjZSBhdCAlcFxuIiwgZHN1cmZhY2UpOwogICAgICAgIElEaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlKGRzdXJmYWNlKTsKICAgICAgICBkc3VyZmFjZSA9IE5VTEw7CiAgICB9CgogICAgLyogQ3JlYXRlIGFuIG9mZnNjcmVlbiBzdXJmYWNlIHN1cmZhY2Ugd2l0aCBvbmx5IGEgd2lkdGggcGFyYW1ldGVyICovCiAgICBaZXJvTWVtb3J5KCZkZXNjLCBzaXplb2YoZGVzYykpOwogICAgZGVzYy5kd1NpemUgPSBzaXplb2YoZGVzYyk7CiAgICBkZXNjLmR3RmxhZ3MgPSBERFNEX0NBUFMgfCBERFNEX1dJRFRIOwogICAgZGVzYy5kZHNDYXBzLmR3Q2FwcyB8PSBERFNDQVBTX09GRlNDUkVFTlBMQUlOOwogICAgZGVzYy5kd1dpZHRoID0gMTI4OwogICAgcmV0ID0gSURpcmVjdERyYXdfQ3JlYXRlU3VyZmFjZShscERELCAmZGVzYywgJmRzdXJmYWNlLCBOVUxMKTsKICAgIG9rKHJldCA9PSBEREVSUl9JTlZBTElEUEFSQU1TLCAiQ3JlYXRpbmcgYW4gb2Zmc2NyZWVuIHBsYWluIHN1cmZhY2Ugd2l0aG91dCBoaWdodCBpbmZvIHJldHVybmVkICUwOHhcbiIsIHJldCk7CiAgICBpZihkc3VyZmFjZSkKICAgIHsKICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2VfUmVsZWFzZShkc3VyZmFjZSk7CiAgICAgICAgZHN1cmZhY2UgPSBOVUxMOwogICAgfQoKICAgIC8qIENyZWF0ZSBhbiBvZmZzY3JlZW4gc3VyZmFjZSBzdXJmYWNlIHdpdGggb25seSBhIGhlaWdodCBwYXJhbWV0ZXIgKi8KICAgIFplcm9NZW1vcnkoJmRlc2MsIHNpemVvZihkZXNjKSk7CiAgICBkZXNjLmR3U2l6ZSA9IHNpemVvZihkZXNjKTsKICAgIGRlc2MuZHdGbGFncyA9IEREU0RfQ0FQUyB8IEREU0RfSEVJR0hUOwogICAgZGVzYy5kZHNDYXBzLmR3Q2FwcyB8PSBERFNDQVBTX09GRlNDUkVFTlBMQUlOOwogICAgZGVzYy5kd0hlaWdodCA9IDEyODsKICAgIHJldCA9IElEaXJlY3REcmF3X0NyZWF0ZVN1cmZhY2UobHBERCwgJmRlc2MsICZkc3VyZmFjZSwgTlVMTCk7CiAgICBvayhyZXQgPT0gRERFUlJfSU5WQUxJRFBBUkFNUywgIkNyZWF0aW5nIGFuIG9mZnNjcmVlbiBwbGFpbiBzdXJmYWNlIHdpdGhvdXQgd2lkdGggaW5mbyByZXR1cm5lZCAlMDh4XG4iLCByZXQpOwogICAgaWYoZHN1cmZhY2UpCiAgICB7CiAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2UoZHN1cmZhY2UpOwogICAgICAgIGRzdXJmYWNlID0gTlVMTDsKICAgIH0KCiAgICAvKiBTYW5pdHkgY2hlY2sgKi8KICAgIFplcm9NZW1vcnkoJmRlc2MsIHNpemVvZihkZXNjKSk7CiAgICBkZXNjLmR3U2l6ZSA9IHNpemVvZihkZXNjKTsKICAgIGRlc2MuZHdGbGFncyA9IEREU0RfQ0FQUyB8IEREU0RfSEVJR0hUIHwgRERTRF9XSURUSDsKICAgIGRlc2MuZGRzQ2Fwcy5kd0NhcHMgfD0gRERTQ0FQU19PRkZTQ1JFRU5QTEFJTjsKICAgIGRlc2MuZHdIZWlnaHQgPSAxMjg7CiAgICBkZXNjLmR3V2lkdGggPSAxMjg7CiAgICByZXQgPSBJRGlyZWN0RHJhd19DcmVhdGVTdXJmYWNlKGxwREQsICZkZXNjLCAmZHN1cmZhY2UsIE5VTEwpOwogICAgb2socmV0ID09IEREX09LLCAiQ3JlYXRpbmcgYW4gb2Zmc2NyZWVuIHBsYWluIHN1cmZhY2Ugd2l0aCB3aWR0aCBhbmQgaGVpZ2h0IGluZm8gcmV0dXJuZWQgJTA4eFxuIiwgcmV0KTsKICAgIGlmKGRzdXJmYWNlKQogICAgewogICAgICAgIElEaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlKGRzdXJmYWNlKTsKICAgICAgICBkc3VyZmFjZSA9IE5VTEw7CiAgICB9CgogICAgLyogVGVzdCBhIHByaW1hcnkgc3VyZmFjZSBzaXplICovCiAgICByZXQgPSBJRGlyZWN0RHJhd19TZXRDb29wZXJhdGl2ZUxldmVsKGxwREQsIHdpbmRvdywgRERTQ0xfTk9STUFMKTsKICAgIG9rKHJldCA9PSBERF9PSywgIlNldENvb3BlcmF0aXZlTGV2ZWwgZmFpbGVkIHdpdGggJTA4eFxuIiwgcmV0KTsKCiAgICBaZXJvTWVtb3J5KCZkZXNjLCBzaXplb2YoZGVzYykpOwogICAgZGVzYy5kd1NpemUgPSBzaXplb2YoZGVzYyk7CiAgICBkZXNjLmR3RmxhZ3MgPSBERFNEX0NBUFM7CiAgICBkZXNjLmRkc0NhcHMuZHdDYXBzIHw9IEREU0NBUFNfUFJJTUFSWVNVUkZBQ0U7CiAgICBkZXNjLmR3SGVpZ2h0ID0gMTI4OyAvKiBLZWVwIHRoZW0gc2V0IHRvICBjaGVjayB3aGF0IGhhcHBlbnMgKi8KICAgIGRlc2MuZHdXaWR0aCA9IDEyODsgLyogS2VlcCB0aGVtIHNldCB0byAgY2hlY2sgd2hhdCBoYXBwZW5zICovCiAgICByZXQgPSBJRGlyZWN0RHJhd19DcmVhdGVTdXJmYWNlKGxwREQsICZkZXNjLCAmZHN1cmZhY2UsIE5VTEwpOwogICAgb2socmV0ID09IEREX09LLCAiQ3JlYXRpbmcgYSBwcmltYXJ5IHN1cmZhY2Ugd2l0aG91dCB3aWR0aCBhbmQgaGVpZ2h0IGluZm8gcmV0dXJuZWQgJTA4eFxuIiwgcmV0KTsKICAgIGlmKGRzdXJmYWNlKQogICAgewogICAgICAgIHJldCA9IElEaXJlY3REcmF3U3VyZmFjZV9HZXRTdXJmYWNlRGVzYyhkc3VyZmFjZSwgJmRlc2MpOwogICAgICAgIG9rKHJldCA9PSBERF9PSywgIkdldFN1cmZhY2VEZXNjIHJldHVybmVkICV4XG4iLCByZXQpOwoKICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2VfUmVsZWFzZShkc3VyZmFjZSk7CiAgICAgICAgZHN1cmZhY2UgPSBOVUxMOwoKICAgICAgICBvayhkZXNjLmR3RmxhZ3MgJiBERFNEX1dJRFRILCAiUHJpbWFyeSBzdXJmYWNlIGRvZXNuJ3QgaGF2ZSB3aWR0aCBzZXRcbiIpOwogICAgICAgIG9rKGRlc2MuZHdGbGFncyAmIEREU0RfSEVJR0hULCAiUHJpbWFyeSBzdXJmYWNlIGRvZXNuJ3QgaGF2ZSBoZWlnaHQgc2V0XG4iKTsKICAgICAgICBvayhkZXNjLmR3V2lkdGggPT0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTiksICJTdXJmYWNlIHdpZHRoIGRpZmZlcnMgZnJvbSBzY3JlZW4gd2lkdGhcbiIpOwogICAgICAgIG9rKGRlc2MuZHdIZWlnaHQgPT0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTiksICJTdXJmYWNlIGhlaWdodCBkaWZmZXJzIGZyb20gc2NyZWVuIGhlaWdodFxuIik7CiAgICB9CiAgICByZXQgPSBJRGlyZWN0RHJhd19TZXRDb29wZXJhdGl2ZUxldmVsKGxwREQsIE5VTEwsIEREU0NMX05PUk1BTCk7CiAgICBvayhyZXQgPT0gRERfT0ssICJTZXRDb29wZXJhdGl2ZUxldmVsIGZhaWxlZCB3aXRoICUwOHhcbiIsIHJldCk7Cn0KCnN0YXRpYyB2b2lkIFByaXZhdGVEYXRhVGVzdCh2b2lkKQp7CiAgICBIUkVTVUxUIGhyOwogICAgSURpcmVjdERyYXdTdXJmYWNlNyAqc3VyZmFjZTcgPSBOVUxMOwogICAgSURpcmVjdERyYXdTdXJmYWNlICpzdXJmYWNlID0gTlVMTDsKICAgIEREU1VSRkFDRURFU0MgZGVzYzsKICAgIFVMT05HIHJlZiwgcmVmMjsKICAgIElVbmtub3duICpwdHI7CiAgICBEV09SRCBzaXplID0gc2l6ZW9mKElVbmtub3duICopOwoKICAgIFplcm9NZW1vcnkoJmRlc2MsIHNpemVvZihkZXNjKSk7CiAgICBkZXNjLmR3U2l6ZSA9IHNpemVvZihkZXNjKTsKICAgIGRlc2MuZHdGbGFncyA9IEREU0RfQ0FQUyB8IEREU0RfSEVJR0hUIHwgRERTRF9XSURUSDsKICAgIGRlc2MuZGRzQ2Fwcy5kd0NhcHMgfD0gRERTQ0FQU19PRkZTQ1JFRU5QTEFJTjsKICAgIGRlc2MuZHdIZWlnaHQgPSAxMjg7CiAgICBkZXNjLmR3V2lkdGggPSAxMjg7CiAgICBociA9IElEaXJlY3REcmF3X0NyZWF0ZVN1cmZhY2UobHBERCwgJmRlc2MsICZzdXJmYWNlLCBOVUxMKTsKICAgIG9rKGhyID09IEREX09LLCAiQ3JlYXRpbmcgYW4gb2Zmc2NyZWVuIHBsYWluIHN1cmZhY2UgZmFpbGVkIHdpdGggJTA4eFxuIiwgaHIpOwogICAgaWYoIXN1cmZhY2UpCiAgICB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2VfUXVlcnlJbnRlcmZhY2Uoc3VyZmFjZSwgJklJRF9JRGlyZWN0RHJhd1N1cmZhY2U3LCAodm9pZCAqKikgJnN1cmZhY2U3KTsKICAgIG9rKGhyID09IEREX09LLCAiSURpcmVjdERyYXdTdXJmYWNlX1F1ZXJ5SW50ZXJmYWNlIGZhaWxlZCB3aXRoICUwOHhcbiIsIGhyKTsKICAgIGlmKCFzdXJmYWNlKQogICAgewogICAgICAgIElEaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlKHN1cmZhY2UpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBUaGlzIGZhaWxzICovCiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfU2V0UHJpdmF0ZURhdGEoc3VyZmFjZTcsICZJSURfSURpcmVjdERyYXdTdXJmYWNlNyAvKiBBYnVzZSB0aGlzIHRhZyAqLywgbHBERCwgMCwgRERTUERfSVVOS05PV05QT0lOVEVSKTsKICAgIG9rKGhyID09IERERVJSX0lOVkFMSURQQVJBTVMsICJJRGlyZWN0RHJhd1N1cmZhY2U3X1NldFByaXZhdGVEYXRhIGZhaWxlZCB3aXRoICUwOHhcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlN19TZXRQcml2YXRlRGF0YShzdXJmYWNlNywgJklJRF9JRGlyZWN0RHJhd1N1cmZhY2U3IC8qIEFidXNlIHRoaXMgdGFnICovLCBscERELCA1LCBERFNQRF9JVU5LTk9XTlBPSU5URVIpOwogICAgb2soaHIgPT0gRERFUlJfSU5WQUxJRFBBUkFNUywgIklEaXJlY3REcmF3U3VyZmFjZTdfU2V0UHJpdmF0ZURhdGEgZmFpbGVkIHdpdGggJTA4eFxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X1NldFByaXZhdGVEYXRhKHN1cmZhY2U3LCAmSUlEX0lEaXJlY3REcmF3U3VyZmFjZTcgLyogQWJ1c2UgdGhpcyB0YWcgKi8sIGxwREQsIHNpemVvZihJVW5rbm93biAqKSAqIDIsIEREU1BEX0lVTktOT1dOUE9JTlRFUik7CiAgICBvayhociA9PSBEREVSUl9JTlZBTElEUEFSQU1TLCAiSURpcmVjdERyYXdTdXJmYWNlN19TZXRQcml2YXRlRGF0YSBmYWlsZWQgd2l0aCAlMDh4XG4iLCBocik7CgogICAgcmVmID0gZ2V0cmVmKChJVW5rbm93biAqKSBscEREKTsKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlN19TZXRQcml2YXRlRGF0YShzdXJmYWNlNywgJklJRF9JRGlyZWN0RHJhd1N1cmZhY2U3IC8qIEFidXNlIHRoaXMgdGFnICovLCBscERELCBzaXplb2YoSVVua25vd24gKiksIEREU1BEX0lVTktOT1dOUE9JTlRFUik7CiAgICBvayhociA9PSBERF9PSywgIklEaXJlY3REcmF3U3VyZmFjZTdfU2V0UHJpdmF0ZURhdGEgZmFpbGVkIHdpdGggJTA4eFxuIiwgaHIpOwogICAgcmVmMiA9IGdldHJlZigoSVVua25vd24gKikgbHBERCk7CiAgICBvayhyZWYyID09IHJlZiArIDEsICJPYmplY3QgcmVmZXJlbmNlIGlzICVkLCBleHBlY3RlZCAlZFxuIiwgcmVmMiwgcmVmICsgMSk7CiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfRnJlZVByaXZhdGVEYXRhKHN1cmZhY2U3LCAmSUlEX0lEaXJlY3REcmF3U3VyZmFjZTcpOwogICAgcmVmMiA9IGdldHJlZigoSVVua25vd24gKikgbHBERCk7CiAgICBvayhyZWYyID09IHJlZiwgIk9iamVjdCByZWZlcmVuY2UgaXMgJWQsIGV4cGVjdGVkICVkXG4iLCByZWYyLCByZWYpOwoKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlN19TZXRQcml2YXRlRGF0YShzdXJmYWNlNywgJklJRF9JRGlyZWN0RHJhd1N1cmZhY2U3LCBscERELCBzaXplb2YoSVVua25vd24gKiksIEREU1BEX0lVTktOT1dOUE9JTlRFUik7CiAgICBvayhociA9PSBERF9PSywgIklEaXJlY3REcmF3U3VyZmFjZTdfU2V0UHJpdmF0ZURhdGEgZmFpbGVkIHdpdGggJTA4eFxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X1NldFByaXZhdGVEYXRhKHN1cmZhY2U3LCAmSUlEX0lEaXJlY3REcmF3U3VyZmFjZTcsIHN1cmZhY2U3LCBzaXplb2YoSVVua25vd24gKiksIEREU1BEX0lVTktOT1dOUE9JTlRFUik7CiAgICBvayhociA9PSBERF9PSywgIklEaXJlY3REcmF3U3VyZmFjZTdfU2V0UHJpdmF0ZURhdGEgZmFpbGVkIHdpdGggJTA4eFxuIiwgaHIpOwogICAgcmVmMiA9IGdldHJlZigoSVVua25vd24gKikgbHBERCk7CiAgICBvayhyZWYyID09IHJlZiwgIk9iamVjdCByZWZlcmVuY2UgaXMgJWQsIGV4cGVjdGVkICVkXG4iLCByZWYyLCByZWYpOwoKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlN19TZXRQcml2YXRlRGF0YShzdXJmYWNlNywgJklJRF9JRGlyZWN0RHJhd1N1cmZhY2U3LCBscERELCBzaXplb2YoSVVua25vd24gKiksIEREU1BEX0lVTktOT1dOUE9JTlRFUik7CiAgICBvayhociA9PSBERF9PSywgIklEaXJlY3REcmF3U3VyZmFjZTdfU2V0UHJpdmF0ZURhdGEgZmFpbGVkIHdpdGggJTA4eFxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0dldFByaXZhdGVEYXRhKHN1cmZhY2U3LCAmSUlEX0lEaXJlY3REcmF3U3VyZmFjZTcsICZwdHIsICZzaXplKTsKICAgIG9rKGhyID09IEREX09LLCAiSURpcmVjdERyYXdTdXJmYWNlN19HZXRQcml2YXRlRGF0YSBmYWlsZWQgd2l0aCAlMDh4XG4iLCBocik7CiAgICByZWYyID0gZ2V0cmVmKChJVW5rbm93biAqKSBscEREKTsKICAgIC8qIE9iamVjdCBpcyBOT1QgYmVlaW4gYWRkcmVmZWQgKi8KICAgIG9rKHB0ciA9PSAoSVVua25vd24gKikgbHBERCwgIlJldHVybmVkIGludGVyZmFjZSBwb2ludGVyIGlzICVwLCBleHBlY3RlZCAlcFxuIiwgcHRyLCBscEREKTsKICAgIG9rKHJlZjIgPT0gcmVmICsgMSwgIk9iamVjdCByZWZlcmVuY2UgaXMgJWQsIGV4cGVjdGVkICVkLiBwdHIgYXQgJXAsIG9yaWcgYXQgJXBcbiIsIHJlZjIsIHJlZiArIDEsIHB0ciwgbHBERCk7CgogICAgSURpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2Uoc3VyZmFjZSk7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2Uoc3VyZmFjZTcpOwoKICAgIC8qIERlc3Ryb3lpbmcgdGhlIHN1cmZhY2UgZnJlZXMgdGhlIGhlbGQgcmVmZXJlbmNlICovCiAgICByZWYyID0gZ2V0cmVmKChJVW5rbm93biAqKSBscEREKTsKICAgIG9rKHJlZjIgPT0gcmVmLCAiT2JqZWN0IHJlZmVyZW5jZSBpcyAlZCwgZXhwZWN0ZWQgJWRcbiIsIHJlZjIsIHJlZik7Cn0KCnN0YXRpYyB2b2lkIEJsdFBhcmFtVGVzdCh2b2lkKQp7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2UgKnN1cmZhY2UxID0gTlVMTCwgKnN1cmZhY2UyID0gTlVMTDsKICAgIEREU1VSRkFDRURFU0MgZGVzYzsKICAgIEhSRVNVTFQgaHI7CiAgICBEREJMVEZYIEJsdEZ4OwogICAgUkVDVCB2YWxpZCA9IHsxMCwgMTAsIDIwLCAyMH07CiAgICBSRUNUIGludmFsaWQxID0gezIwLCAxMCwgMTAsIDIwfTsKICAgIFJFQ1QgaW52YWxpZDIgPSB7MjAsIDIwLCAyMCwgMjB9OwogICAgUkVDVCBpbnZhbGlkMyA9IHstMSwgLTEsIDIwLCAyMH07CiAgICBSRUNUIGludmFsaWQ0ID0gezYwLCA2MCwgNzAsIDcwfTsKCiAgICBtZW1zZXQoJmRlc2MsIDAsIHNpemVvZihkZXNjKSk7CiAgICBkZXNjLmR3U2l6ZSA9IHNpemVvZihkZXNjKTsKICAgIGRlc2MuZHdGbGFncyA9IEREU0RfQ0FQUyB8IEREU0RfSEVJR0hUIHwgRERTRF9XSURUSDsKICAgIGRlc2MuZGRzQ2Fwcy5kd0NhcHMgfD0gRERTQ0FQU19PRkZTQ1JFRU5QTEFJTjsKICAgIGRlc2MuZHdIZWlnaHQgPSAxMjg7CiAgICBkZXNjLmR3V2lkdGggPSAxMjg7CiAgICBociA9IElEaXJlY3REcmF3X0NyZWF0ZVN1cmZhY2UobHBERCwgJmRlc2MsICZzdXJmYWNlMSwgTlVMTCk7CiAgICBvayhociA9PSBERF9PSywgIkNyZWF0aW5nIGFuIG9mZnNjcmVlbiBwbGFpbiBzdXJmYWNlIGZhaWxlZCB3aXRoICUwOHhcbiIsIGhyKTsKCiAgICBkZXNjLmR3SGVpZ2h0ID0gNjQ7CiAgICBkZXNjLmR3V2lkdGggPSA2NDsKICAgIGhyID0gSURpcmVjdERyYXdfQ3JlYXRlU3VyZmFjZShscERELCAmZGVzYywgJnN1cmZhY2UyLCBOVUxMKTsKICAgIG9rKGhyID09IEREX09LLCAiQ3JlYXRpbmcgYW4gb2Zmc2NyZWVuIHBsYWluIHN1cmZhY2UgZmFpbGVkIHdpdGggJTA4eFxuIiwgaHIpOwoKICAgIGlmKDApCiAgICB7CiAgICAgICAgLyogVGhpcyBjcmFzaGVzICovCiAgICAgICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2VfQmx0RmFzdChzdXJmYWNlMSwgMCwgMCwgTlVMTCwgTlVMTCwgMCk7CiAgICAgICAgb2soaHIgPT0gRERfT0ssICJCbHRGYXN0IGZyb20gTlVMTCBzdXJmYWNlIHJldHVybmVkICUwOHhcbiIsIGhyKTsKICAgIH0KICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlX0JsdEZhc3Qoc3VyZmFjZTEsIDAsIDAsIHN1cmZhY2UyLCBOVUxMLCAwKTsKICAgIG9rKGhyID09IEREX09LLCAiQmx0RmFzdCBmcm9tIHNtYWxsZXIgdG8gYmlnZ2VyIHN1cmZhY2UgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2VfQmx0RmFzdChzdXJmYWNlMiwgMCwgMCwgc3VyZmFjZTEsIE5VTEwsIDApOwogICAgb2soaHIgPT0gRERFUlJfSU5WQUxJRFJFQ1QsICJCbHRGYXN0IGZyb20gYmlnZ2VyIHRvIHNtYWxsZXIgc3VyZmFjZSByZXR1cm5lZCAlMDh4XG4iLCBocik7CiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZV9CbHRGYXN0KHN1cmZhY2UyLCAwLCAwLCBzdXJmYWNlMSwgJnZhbGlkLCAwKTsKICAgIG9rKGhyID09IEREX09LLCAiQmx0RmFzdCBmcm9tIGJpZ2dlciB0byBzbWFsbGVyIHN1cmZhY2UgdXNpbmcgYSB2YWxpZCByZWN0YW5nbGUgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2VfQmx0RmFzdChzdXJmYWNlMiwgNjAsIDYwLCBzdXJmYWNlMSwgJnZhbGlkLCAwKTsKICAgIG9rKGhyID09IERERVJSX0lOVkFMSURSRUNULCAiQmx0RmFzdCB3aXRoIGEgcmVjdGFuZ2xlIHJlc3VsdGluZyBpbiBhbiBvZmYtc3VyZmFjZSB3cml0ZSByZXR1cm5lZCAlMDh4XG4iLCBocik7CiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZV9CbHRGYXN0KHN1cmZhY2UxLCA5MCwgOTAsIHN1cmZhY2UyLCBOVUxMLCAwKTsKICAgIG9rKGhyID09IERERVJSX0lOVkFMSURSRUNULCAiQmx0RmFzdCB3aXRoIGEgcmVjdGFuZ2xlIHJlc3VsdGluZyBpbiBhbiBvZmYtc3VyZmFjZSB3cml0ZSByZXR1cm5lZCAlMDh4XG4iLCBocik7CiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZV9CbHRGYXN0KHN1cmZhY2UyLCAwLCAwLCBzdXJmYWNlMSwgJmludmFsaWQxLCAwKTsKICAgIG9rKGhyID09IERERVJSX0lOVkFMSURSRUNULCAiQmx0RmFzdCB3aXRoIGludmFsaWQgcmVjdGFuZ2xlIDEgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2VfQmx0RmFzdChzdXJmYWNlMiwgMCwgMCwgc3VyZmFjZTEsICZpbnZhbGlkMiwgMCk7CiAgICBvayhociA9PSBEREVSUl9JTlZBTElEUkVDVCwgIkJsdEZhc3Qgd2l0aCBpbnZhbGlkIHJlY3RhbmdsZSAyIHJldHVybmVkICUwOHhcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlX0JsdEZhc3Qoc3VyZmFjZTIsIDAsIDAsIHN1cmZhY2UxLCAmaW52YWxpZDMsIDApOwogICAgb2soaHIgPT0gRERFUlJfSU5WQUxJRFJFQ1QsICJCbHRGYXN0IHdpdGggaW52YWxpZCByZWN0YW5nbGUgMyByZXR1cm5lZCAlMDh4XG4iLCBocik7CiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZV9CbHRGYXN0KHN1cmZhY2UxLCAwLCAwLCBzdXJmYWNlMiwgJmludmFsaWQ0LCAwKTsKICAgIG9rKGhyID09IERERVJSX0lOVkFMSURSRUNULCAiQmx0RmFzdCB3aXRoIGludmFsaWQgcmVjdGFuZ2xlIDMgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2VfQmx0RmFzdChzdXJmYWNlMSwgMCwgMCwgc3VyZmFjZTEsIE5VTEwsIDApOwogICAgb2soaHIgPT0gRERfT0ssICJCbHRGYXN0IGJsaXR0aW5nIGEgc3VyZmFjZSBvbnRvIGl0c2VsZiByZXR1cm5lZCAlMDh4XG4iLCBocik7CgogICAgLyogQmx0KG5vbi1mYXN0KSB0ZXN0cyAqLwogICAgbWVtc2V0KCZCbHRGeCwgMCwgc2l6ZW9mKEJsdEZ4KSk7CiAgICBCbHRGeC5kd1NpemUgPSBzaXplb2YoQmx0RngpOwogICAgVTUoQmx0RngpLmR3RmlsbENvbG9yID0gMHhhYWJiY2NkZDsKCiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZV9CbHQoc3VyZmFjZTEsICZ2YWxpZCwgTlVMTCwgTlVMTCwgRERCTFRfQ09MT1JGSUxMLCAmQmx0RngpOwogICAgb2soaHIgPT0gRERfT0ssICJJRGlyZWN0RHJhd1N1cmZhY2VfQmx0IHdpdGggYSB2YWxpZCByZWN0YW5nbGUgZm9yIGNvbG9yIGZpbGwgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2VfQmx0KHN1cmZhY2UxLCAmdmFsaWQsIE5VTEwsICZpbnZhbGlkMywgRERCTFRfQ09MT1JGSUxMLCAmQmx0RngpOwogICAgb2soaHIgPT0gRERfT0ssICJJRGlyZWN0RHJhd1N1cmZhY2VfQmx0IHdpdGggYSBpbnZhbGlkLCB1bnVzZWQgcmVjdGFuZ2xlIHJldHVybmVkICUwOHhcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlX0JsdChzdXJmYWNlMiwgJmludmFsaWQxLCBOVUxMLCBOVUxMLCBEREJMVF9DT0xPUkZJTEwsICZCbHRGeCk7CiAgICBvayhociA9PSBEREVSUl9JTlZBTElEUkVDVCwgIklEaXJlY3REcmF3U3VyZmFjZV9CbHQgd2l0aCBhIHdpdGggaW52YWxpZCByZWN0YW5nbGUgMSByZXR1cm5lZCAlMDh4XG4iLCBocik7CiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZV9CbHQoc3VyZmFjZTIsICZpbnZhbGlkMiwgTlVMTCwgTlVMTCwgRERCTFRfQ09MT1JGSUxMLCAmQmx0RngpOwogICAgb2soaHIgPT0gRERFUlJfSU5WQUxJRFJFQ1QsICJJRGlyZWN0RHJhd1N1cmZhY2VfQmx0IHdpdGggYSB3aXRoIGludmFsaWQgcmVjdGFuZ2xlIDIgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2VfQmx0KHN1cmZhY2UyLCAmaW52YWxpZDMsIE5VTEwsIE5VTEwsIEREQkxUX0NPTE9SRklMTCwgJkJsdEZ4KTsKICAgIG9rKGhyID09IERERVJSX0lOVkFMSURSRUNULCAiSURpcmVjdERyYXdTdXJmYWNlX0JsdCB3aXRoIGEgd2l0aCBpbnZhbGlkIHJlY3RhbmdsZSAzIHJldHVybmVkICUwOHhcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlX0JsdChzdXJmYWNlMiwgJmludmFsaWQ0LCBOVUxMLCBOVUxMLCBEREJMVF9DT0xPUkZJTEwsICZCbHRGeCk7CiAgICBvayhociA9PSBEREVSUl9JTlZBTElEUkVDVCwgIklEaXJlY3REcmF3U3VyZmFjZV9CbHQgd2l0aCBhIHdpdGggaW52YWxpZCByZWN0YW5nbGUgNCByZXR1cm5lZCAlMDh4XG4iLCBocik7CgogICAgLyogVmFsaWQgb24gc3VyZmFjZSAxICovCiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZV9CbHQoc3VyZmFjZTEsICZpbnZhbGlkNCwgTlVMTCwgTlVMTCwgRERCTFRfQ09MT1JGSUxMLCAmQmx0RngpOwogICAgb2soaHIgPT0gRERfT0ssICJJRGlyZWN0RHJhd1N1cmZhY2VfQmx0IHdpdGggYSBzdWJyZWN0YW5nbGUgZmlsbCByZXR1cm5lZCAlMDh4XG4iLCBocik7CgogICAgLyogV29ya3MgLSBzdHJldGNoZWQgYmxpdCAqLwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2VfQmx0KHN1cmZhY2UxLCBOVUxMLCBzdXJmYWNlMiwgTlVMTCwgMCwgTlVMTCk7CiAgICBvayhociA9PSBERF9PSywgIklEaXJlY3REcmF3U3VyZmFjZV9CbHQgZnJvbSBhIHNtYWxsZXIgdG8gYSBiaWdnZXIgc3VyZmFjZSByZXR1cm5lZCAlMDh4XG4iLCBocik7CiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZV9CbHQoc3VyZmFjZTIsIE5VTEwsIHN1cmZhY2UxLCBOVUxMLCAwLCBOVUxMKTsKICAgIG9rKGhyID09IEREX09LLCAiSURpcmVjdERyYXdTdXJmYWNlX0JsdCBmcm9tIGEgYmlnZ2VyIHRvIGEgc21hbGxlciBzdXJmYWNlICUwOHhcbiIsIGhyKTsKCiAgICAvKiBJbnZhbGlkIGRlc3QgcmVjdHMgaW4gc291cmNlZCBibGl0cyAqLwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2VfQmx0KHN1cmZhY2UyLCAmaW52YWxpZDEsIHN1cmZhY2UxLCBOVUxMLCAwLCBOVUxMKTsKICAgIG9rKGhyID09IERERVJSX0lOVkFMSURSRUNULCAiSURpcmVjdERyYXdTdXJmYWNlX0JsdCB3aXRoIGEgd2l0aCBpbnZhbGlkIHJlY3RhbmdsZSAxIHJldHVybmVkICUwOHhcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlX0JsdChzdXJmYWNlMiwgJmludmFsaWQyLCBzdXJmYWNlMSwgTlVMTCwgMCwgTlVMTCk7CiAgICBvayhociA9PSBEREVSUl9JTlZBTElEUkVDVCwgIklEaXJlY3REcmF3U3VyZmFjZV9CbHQgd2l0aCBhIHdpdGggaW52YWxpZCByZWN0YW5nbGUgMiByZXR1cm5lZCAlMDh4XG4iLCBocik7CiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZV9CbHQoc3VyZmFjZTIsICZpbnZhbGlkMywgc3VyZmFjZTEsIE5VTEwsIDAsIE5VTEwpOwogICAgb2soaHIgPT0gRERFUlJfSU5WQUxJRFJFQ1QsICJJRGlyZWN0RHJhd1N1cmZhY2VfQmx0IHdpdGggYSB3aXRoIGludmFsaWQgcmVjdGFuZ2xlIDMgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2VfQmx0KHN1cmZhY2UyLCAmaW52YWxpZDQsIHN1cmZhY2UxLCBOVUxMLCAwLCBOVUxMKTsKICAgIG9rKGhyID09IERERVJSX0lOVkFMSURSRUNULCAiSURpcmVjdERyYXdTdXJmYWNlX0JsdCB3aXRoIGEgd2l0aCBpbnZhbGlkIHJlY3RhbmdsZSA0IHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICAvKiBJbnZhbGlkIHNyYyByZWN0cyAqLwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2VfQmx0KHN1cmZhY2UyLCBOVUxMLCBzdXJmYWNlMSwgJmludmFsaWQxLCAwLCBOVUxMKTsKICAgIG9rKGhyID09IERERVJSX0lOVkFMSURSRUNULCAiSURpcmVjdERyYXdTdXJmYWNlX0JsdCB3aXRoIGEgd2l0aCBpbnZhbGlkIHJlY3RhbmdsZSAxIHJldHVybmVkICUwOHhcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlX0JsdChzdXJmYWNlMiwgTlVMTCwgc3VyZmFjZTEsICZpbnZhbGlkMiwgMCwgTlVMTCk7CiAgICBvayhociA9PSBEREVSUl9JTlZBTElEUkVDVCwgIklEaXJlY3REcmF3U3VyZmFjZV9CbHQgd2l0aCBhIHdpdGggaW52YWxpZCByZWN0YW5nbGUgMiByZXR1cm5lZCAlMDh4XG4iLCBocik7CiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZV9CbHQoc3VyZmFjZTIsIE5VTEwsIHN1cmZhY2UxLCAmaW52YWxpZDMsIDAsIE5VTEwpOwogICAgb2soaHIgPT0gRERFUlJfSU5WQUxJRFJFQ1QsICJJRGlyZWN0RHJhd1N1cmZhY2VfQmx0IHdpdGggYSB3aXRoIGludmFsaWQgcmVjdGFuZ2xlIDMgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2VfQmx0KHN1cmZhY2UxLCBOVUxMLCBzdXJmYWNlMiwgJmludmFsaWQ0LCAwLCBOVUxMKTsKICAgIG9rKGhyID09IERERVJSX0lOVkFMSURSRUNULCAiSURpcmVjdERyYXdTdXJmYWNlX0JsdCB3aXRoIGEgd2l0aCBpbnZhbGlkIHJlY3RhbmdsZSA0IHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICBJRGlyZWN0RHJhd1N1cmZhY2VfUmVsZWFzZShzdXJmYWNlMSk7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2VfUmVsZWFzZShzdXJmYWNlMik7Cn0KCnN0YXRpYyB2b2lkIFN0cnVjdFNpemVUZXN0KHZvaWQpCnsKICAgIElEaXJlY3REcmF3U3VyZmFjZSAqc3VyZmFjZTE7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2U3ICpzdXJmYWNlNzsKICAgIHVuaW9uIHsKICAgICAgICBERFNVUkZBQ0VERVNDIGRlc2MxOwogICAgICAgIEREU1VSRkFDRURFU0MyIGRlc2MyOwogICAgICAgIGNoYXIgYmxvYlsxMDI0XTsgLyogVG8gZ2V0IGEgYnVuY2ggb2Ygd3JpdGFibGUgbWVtb3J5ICovCiAgICB9IGRlc2M7CiAgICBERFNVUkZBQ0VERVNDIGNyZWF0ZTsKICAgIEhSRVNVTFQgaHI7CgogICAgbWVtc2V0KCZkZXNjLCAwLCBzaXplb2YoZGVzYykpOwogICAgbWVtc2V0KCZjcmVhdGUsIDAsIHNpemVvZihjcmVhdGUpKTsKCiAgICBtZW1zZXQoJmNyZWF0ZSwgMCwgc2l6ZW9mKGNyZWF0ZSkpOwogICAgY3JlYXRlLmR3U2l6ZSA9IHNpemVvZihjcmVhdGUpOwogICAgY3JlYXRlLmR3RmxhZ3MgPSBERFNEX0NBUFMgfCBERFNEX0hFSUdIVCB8IEREU0RfV0lEVEg7CiAgICBjcmVhdGUuZGRzQ2Fwcy5kd0NhcHMgfD0gRERTQ0FQU19PRkZTQ1JFRU5QTEFJTjsKICAgIGNyZWF0ZS5kd0hlaWdodCA9IDEyODsKICAgIGNyZWF0ZS5kd1dpZHRoID0gMTI4OwogICAgaHIgPSBJRGlyZWN0RHJhd19DcmVhdGVTdXJmYWNlKGxwREQsICZjcmVhdGUsICZzdXJmYWNlMSwgTlVMTCk7CiAgICBvayhociA9PSBERF9PSywgIkNyZWF0aW5nIGFuIG9mZnNjcmVlbiBwbGFpbiBzdXJmYWNlIGZhaWxlZCB3aXRoICUwOHhcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlX1F1ZXJ5SW50ZXJmYWNlKHN1cmZhY2UxLCAmSUlEX0lEaXJlY3REcmF3U3VyZmFjZTcsICh2b2lkICoqKSAmc3VyZmFjZTcpOwogICAgb2soaHIgPT0gRERfT0ssICJJRGlyZWN0RHJhd1N1cmZhY2VfUXVlcnlJbnRlcmZhY2UgZmFpbGVkIHdpdGggJTA4eFxuIiwgaHIpOwoKICAgIGRlc2MuZGVzYzEuZHdTaXplID0gc2l6ZW9mKEREU1VSRkFDRURFU0MpOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2VfR2V0U3VyZmFjZURlc2Moc3VyZmFjZTEsICZkZXNjLmRlc2MxKTsKICAgIG9rKGhyID09IEREX09LLCAiSURpcmVjdERyYXdTdXJmYWNlX0dldFN1cmZhY2VEZXNjIHdpdGggZGVzYyBzaXplIHNpemVvZihERFNVUkZBQ0VERVNDKSByZXR1cm5lZCAlMDh4XG4iLCBocik7CiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfR2V0U3VyZmFjZURlc2Moc3VyZmFjZTcsICZkZXNjLmRlc2MyKTsKICAgIG9rKGhyID09IERERVJSX0lOVkFMSURQQVJBTVMsICJJRGlyZWN0RHJhd1N1cmZhY2U3X0dldFN1cmZhY2VEZXNjIHdpdGggZGVzYyBzaXplIHNpemVvZihERFNVUkZBQ0VERVNDKSByZXR1cm5lZCAlMDh4XG4iLCBocik7CgogICAgZGVzYy5kZXNjMi5kd1NpemUgPSBzaXplb2YoRERTVVJGQUNFREVTQzIpOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2VfR2V0U3VyZmFjZURlc2Moc3VyZmFjZTEsICZkZXNjLmRlc2MxKTsKICAgIG9rKGhyID09IERERVJSX0lOVkFMSURQQVJBTVMsICJJRGlyZWN0RHJhd1N1cmZhY2VfR2V0U3VyZmFjZURlc2Mgd2l0aCBkZXNjIHNpemUgc2l6ZW9mKEREU1VSRkFDRURFU0MyKSByZXR1cm5lZCAlMDh4XG4iLCBocik7CiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfR2V0U3VyZmFjZURlc2Moc3VyZmFjZTcsICZkZXNjLmRlc2MyKTsKICAgIG9rKGhyID09IEREX09LLCAiSURpcmVjdERyYXdTdXJmYWNlN19HZXRTdXJmYWNlRGVzYyB3aXRoIGRlc2Mgc2l6ZSBzaXplb2YoRERTVVJGQUNFREVTQzIpIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICBkZXNjLmRlc2MyLmR3U2l6ZSA9IDA7CiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZV9HZXRTdXJmYWNlRGVzYyhzdXJmYWNlMSwgJmRlc2MuZGVzYzEpOwogICAgb2soaHIgPT0gRERFUlJfSU5WQUxJRFBBUkFNUywgIklEaXJlY3REcmF3U3VyZmFjZV9HZXRTdXJmYWNlRGVzYyB3aXRoIGRlc2Mgc2l6ZSAwIHJldHVybmVkICUwOHhcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlN19HZXRTdXJmYWNlRGVzYyhzdXJmYWNlNywgJmRlc2MuZGVzYzIpOwogICAgb2soaHIgPT0gRERFUlJfSU5WQUxJRFBBUkFNUywgIklEaXJlY3REcmF3U3VyZmFjZTdfR2V0U3VyZmFjZURlc2Mgd2l0aCBkZXNjIHNpemUgMCByZXR1cm5lZCAlMDh4XG4iLCBocik7CgogICAgZGVzYy5kZXNjMS5kd1NpemUgPSBzaXplb2YoRERTVVJGQUNFREVTQykgKyAxOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2VfR2V0U3VyZmFjZURlc2Moc3VyZmFjZTEsICZkZXNjLmRlc2MxKTsKICAgIG9rKGhyID09IERERVJSX0lOVkFMSURQQVJBTVMsICJJRGlyZWN0RHJhd1N1cmZhY2VfR2V0U3VyZmFjZURlc2Mgd2l0aCBkZXNjIHNpemUgc2l6ZW9mKEREU1VSRkFDRURFU0MpICsgMSByZXR1cm5lZCAlMDh4XG4iLCBocik7CiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfR2V0U3VyZmFjZURlc2Moc3VyZmFjZTcsICZkZXNjLmRlc2MyKTsKICAgIG9rKGhyID09IERERVJSX0lOVkFMSURQQVJBTVMsICJJRGlyZWN0RHJhd1N1cmZhY2U3X0dldFN1cmZhY2VEZXNjIHdpdGggZGVzYyBzaXplIHNpemVvZihERFNVUkZBQ0VERVNDKSArIDEgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwoKICAgIGRlc2MuZGVzYzIuZHdTaXplID0gc2l6ZW9mKEREU1VSRkFDRURFU0MyKSArIDE7CiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZV9HZXRTdXJmYWNlRGVzYyhzdXJmYWNlMSwgJmRlc2MuZGVzYzEpOwogICAgb2soaHIgPT0gRERFUlJfSU5WQUxJRFBBUkFNUywgIklEaXJlY3REcmF3U3VyZmFjZV9HZXRTdXJmYWNlRGVzYyB3aXRoIGRlc2Mgc2l6ZSBzaXplb2YoRERTVVJGQUNFREVTQzIpICsgMXJldHVybmVkICUwOHhcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlN19HZXRTdXJmYWNlRGVzYyhzdXJmYWNlNywgJmRlc2MuZGVzYzIpOwogICAgb2soaHIgPT0gRERFUlJfSU5WQUxJRFBBUkFNUywgIklEaXJlY3REcmF3U3VyZmFjZTdfR2V0U3VyZmFjZURlc2Mgd2l0aCBkZXNjIHNpemUgc2l6ZW9mKEREU1VSRkFDRURFU0MyKSArIDFyZXR1cm5lZCAlMDh4XG4iLCBocik7CgogICAgLyogVGVzdHMgZm9yIExvY2soKSAqLwoKICAgIGRlc2MuZGVzYzEuZHdTaXplID0gc2l6ZW9mKEREU1VSRkFDRURFU0MpOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2VfTG9jayhzdXJmYWNlMSwgTlVMTCwgJmRlc2MuZGVzYzEsIDAsIDApOwogICAgb2soaHIgPT0gRERfT0ssICJJRGlyZWN0RHJhd1N1cmZhY2VfTG9jayB3aXRoIGRlc2Mgc2l6ZSBzaXplb2YoRERTVVJGQUNFREVTQykgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkgSURpcmVjdERyYXdTdXJmYWNlX1VubG9jayhzdXJmYWNlMSwgTlVMTCk7CiAgICBvayhkZXNjLmRlc2MxLmR3U2l6ZSA9PSBzaXplb2YoRERTVVJGQUNFREVTQyksICJEZXN0aW5hdGlvbiBzaXplIHdhcyBjaGFuZ2VkIHRvICVkXG4iLCBkZXNjLmRlc2MxLmR3U2l6ZSk7CiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfTG9jayhzdXJmYWNlNywgTlVMTCwgJmRlc2MuZGVzYzIsIDAsIDApOwogICAgb2soaHIgPT0gRERfT0ssICJJRGlyZWN0RHJhd1N1cmZhY2U3X0xvY2sgd2l0aCBkZXNjIHNpemUgc2l6ZW9mKEREU1VSRkFDRURFU0MpIHJldHVybmVkICUwOHhcbiIsIGhyKTsKICAgIGlmKFNVQ0NFRURFRChocikpIElEaXJlY3REcmF3U3VyZmFjZTdfVW5sb2NrKHN1cmZhY2U3LCBOVUxMKTsKICAgIG9rKGRlc2MuZGVzYzIuZHdTaXplID09IHNpemVvZihERFNVUkZBQ0VERVNDKSwgIkRlc3RpbmF0aW9uIHNpemUgd2FzIGNoYW5nZWQgdG8gJWRcbiIsIGRlc2MuZGVzYzEuZHdTaXplKTsKCiAgICBkZXNjLmRlc2MyLmR3U2l6ZSA9IHNpemVvZihERFNVUkZBQ0VERVNDMik7CiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZV9Mb2NrKHN1cmZhY2UxLCBOVUxMLCAmZGVzYy5kZXNjMSwgMCwgMCk7CiAgICBvayhociA9PSBERF9PSywgIklEaXJlY3REcmF3U3VyZmFjZV9Mb2NrIHdpdGggZGVzYyBzaXplIHNpemVvZihERFNVUkZBQ0VERVNDMikgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgb2soZGVzYy5kZXNjMS5kd1NpemUgPT0gc2l6ZW9mKEREU1VSRkFDRURFU0MyKSwgIkRlc3RpbmF0aW9uIHNpemUgd2FzIGNoYW5nZWQgdG8gJWRcbiIsIGRlc2MuZGVzYzEuZHdTaXplKTsKICAgIGlmKFNVQ0NFRURFRChocikpIElEaXJlY3REcmF3U3VyZmFjZV9VbmxvY2soc3VyZmFjZTEsIE5VTEwpOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0xvY2soc3VyZmFjZTcsIE5VTEwsICZkZXNjLmRlc2MyLCAwLCAwKTsKICAgIG9rKGhyID09IEREX09LLCAiSURpcmVjdERyYXdTdXJmYWNlN19Mb2NrIHdpdGggZGVzYyBzaXplIHNpemVvZihERFNVUkZBQ0VERVNDMikgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkgSURpcmVjdERyYXdTdXJmYWNlN19VbmxvY2soc3VyZmFjZTcsIE5VTEwpOwogICAgb2soZGVzYy5kZXNjMi5kd1NpemUgPT0gc2l6ZW9mKEREU1VSRkFDRURFU0MyKSwgIkRlc3RpbmF0aW9uIHNpemUgd2FzIGNoYW5nZWQgdG8gJWRcbiIsIGRlc2MuZGVzYzEuZHdTaXplKTsKCiAgICBkZXNjLmRlc2MyLmR3U2l6ZSA9IDA7CiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZV9Mb2NrKHN1cmZhY2UxLCBOVUxMLCAmZGVzYy5kZXNjMSwgMCwgMCk7CiAgICBvayhociA9PSBEREVSUl9JTlZBTElEUEFSQU1TLCAiSURpcmVjdERyYXdTdXJmYWNlX0xvY2sgd2l0aCBkZXNjIHNpemUgMCByZXR1cm5lZCAlMDh4XG4iLCBocik7CiAgICBpZihTVUNDRUVERUQoaHIpKSBJRGlyZWN0RHJhd1N1cmZhY2VfVW5sb2NrKHN1cmZhY2UxLCBOVUxMKTsKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlN19Mb2NrKHN1cmZhY2U3LCBOVUxMLCAmZGVzYy5kZXNjMiwgMCwgMCk7CiAgICBvayhociA9PSBEREVSUl9JTlZBTElEUEFSQU1TLCAiSURpcmVjdERyYXdTdXJmYWNlN19Mb2NrIHdpdGggZGVzYyBzaXplIDAgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkgSURpcmVjdERyYXdTdXJmYWNlN19VbmxvY2soc3VyZmFjZTcsIE5VTEwpOwoKICAgIGRlc2MuZGVzYzEuZHdTaXplID0gc2l6ZW9mKEREU1VSRkFDRURFU0MpICsgMTsKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlX0xvY2soc3VyZmFjZTEsIE5VTEwsICZkZXNjLmRlc2MxLCAwLCAwKTsKICAgIG9rKGhyID09IERERVJSX0lOVkFMSURQQVJBTVMsICJJRGlyZWN0RHJhd1N1cmZhY2VfTG9jayB3aXRoIGRlc2Mgc2l6ZSBzaXplb2YoRERTVVJGQUNFREVTQykgKyAxIHJldHVybmVkICUwOHhcbiIsIGhyKTsKICAgIGlmKFNVQ0NFRURFRChocikpIElEaXJlY3REcmF3U3VyZmFjZV9VbmxvY2soc3VyZmFjZTEsIE5VTEwpOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0xvY2soc3VyZmFjZTcsIE5VTEwsICZkZXNjLmRlc2MyLCAwLCAwKTsKICAgIG9rKGhyID09IERERVJSX0lOVkFMSURQQVJBTVMsICJJRGlyZWN0RHJhd1N1cmZhY2U3X0xvY2sgd2l0aCBkZXNjIHNpemUgc2l6ZW9mKEREU1VSRkFDRURFU0MpICsgMSByZXR1cm5lZCAlMDh4XG4iLCBocik7CiAgICBpZihTVUNDRUVERUQoaHIpKSBJRGlyZWN0RHJhd1N1cmZhY2U3X1VubG9jayhzdXJmYWNlNywgTlVMTCk7CgogICAgZGVzYy5kZXNjMi5kd1NpemUgPSBzaXplb2YoRERTVVJGQUNFREVTQzIpICsgMTsKICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlX0xvY2soc3VyZmFjZTEsIE5VTEwsICZkZXNjLmRlc2MxLCAwLCAwKTsKICAgIG9rKGhyID09IERERVJSX0lOVkFMSURQQVJBTVMsICJJRGlyZWN0RHJhd1N1cmZhY2VfTG9jayB3aXRoIGRlc2Mgc2l6ZSBzaXplb2YoRERTVVJGQUNFREVTQzIpICsgMXJldHVybmVkICUwOHhcbiIsIGhyKTsKICAgIGlmKFNVQ0NFRURFRChocikpIElEaXJlY3REcmF3U3VyZmFjZV9VbmxvY2soc3VyZmFjZTEsIE5VTEwpOwogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0xvY2soc3VyZmFjZTcsIE5VTEwsICZkZXNjLmRlc2MyLCAwLCAwKTsKICAgIG9rKGhyID09IERERVJSX0lOVkFMSURQQVJBTVMsICJJRGlyZWN0RHJhd1N1cmZhY2U3X0xvY2sgd2l0aCBkZXNjIHNpemUgc2l6ZW9mKEREU1VSRkFDRURFU0MyKSArIDFyZXR1cm5lZCAlMDh4XG4iLCBocik7CiAgICBpZihTVUNDRUVERUQoaHIpKSBJRGlyZWN0RHJhd1N1cmZhY2U3X1VubG9jayhzdXJmYWNlNywgTlVMTCk7CgogICAgSURpcmVjdERyYXdTdXJmYWNlN19SZWxlYXNlKHN1cmZhY2U3KTsKICAgIElEaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlKHN1cmZhY2UxKTsKfQoKU1RBUlRfVEVTVChkc3VyZmFjZSkKewogICAgaWYgKCFDcmVhdGVEaXJlY3REcmF3KCkpCiAgICAgICAgcmV0dXJuOwogICAgTWlwTWFwQ3JlYXRpb25UZXN0KCk7CiAgICBTcmNDb2xvcktleTMyQmxpdFRlc3QoKTsKICAgIFF1ZXJ5SW50ZXJmYWNlKCk7CiAgICBHZXREREludGVyZmFjZV8xKCk7CiAgICBHZXREREludGVyZmFjZV8yKCk7CiAgICBHZXREREludGVyZmFjZV80KCk7CiAgICBHZXREREludGVyZmFjZV83KCk7CiAgICBFbnVtVGVzdCgpOwogICAgQXR0YWNobWVudFRlc3QoKTsKICAgIEF0dGFjaG1lbnRUZXN0NygpOwogICAgQ3ViZU1hcFRlc3QoKTsKICAgIHRlc3RfbG9ja3JlY3RfaW52YWxpZCgpOwogICAgQ29tcHJlc3NlZFRlc3QoKTsKICAgIFNpemVUZXN0KCk7CiAgICBQcml2YXRlRGF0YVRlc3QoKTsKICAgIEJsdFBhcmFtVGVzdCgpOwogICAgU3RydWN0U2l6ZVRlc3QoKTsKICAgIFJlbGVhc2VEaXJlY3REcmF3KCk7Cn0K