LyoKICogZW50aXRpZXMuYyA6IGltcGxlbWVudGF0aW9uIGZvciB0aGUgWE1MIGVudGl0aWVzIGhhbmRsaW5nCiAqCiAqIFNlZSBDb3B5cmlnaHQgZm9yIHRoZSBzdGF0dXMgb2YgdGhpcyBzb2Z0d2FyZS4KICoKICogZGFuaWVsQHZlaWxsYXJkLmNvbQogKi8KCiNkZWZpbmUgSU5fTElCWE1MCiNpbmNsdWRlICJsaWJ4bWwuaCIKCiNpbmNsdWRlIDxzdHJpbmcuaD4KI2lmZGVmIEhBVkVfU1RETElCX0gKI2luY2x1ZGUgPHN0ZGxpYi5oPgojZW5kaWYKI2luY2x1ZGUgPGxpYnhtbC94bWxtZW1vcnkuaD4KI2luY2x1ZGUgPGxpYnhtbC9oYXNoLmg+CiNpbmNsdWRlIDxsaWJ4bWwvZW50aXRpZXMuaD4KI2luY2x1ZGUgPGxpYnhtbC9wYXJzZXIuaD4KI2luY2x1ZGUgPGxpYnhtbC94bWxlcnJvci5oPgojaW5jbHVkZSA8bGlieG1sL2dsb2JhbHMuaD4KCi8qCiAqIFRoZSBYTUwgcHJlZGVmaW5lZCBlbnRpdGllcy4KICovCgpzdHJ1Y3QgeG1sUHJlZGVmaW5lZEVudGl0eVZhbHVlIHsKICAgIGNvbnN0IGNoYXIgKm5hbWU7CiAgICBjb25zdCBjaGFyICp2YWx1ZTsKfTsKc3RhdGljIHN0cnVjdCB4bWxQcmVkZWZpbmVkRW50aXR5VmFsdWUgeG1sUHJlZGVmaW5lZEVudGl0eVZhbHVlc1tdID0gewogICAgeyAibHQiLCAiPCIgfSwKICAgIHsgImd0IiwgIj4iIH0sCiAgICB7ICJhcG9zIiwgIiciIH0sCiAgICB7ICJxdW90IiwgIlwiIiB9LAogICAgeyAiYW1wIiwgIiYiIH0KfTsKCi8qCiAqIFRPRE86IFRoaXMgaXMgR1JPU1MsIGFsbG9jYXRpb24gb2YgYSAyNTYgZW50cnkgaGFzaCBmb3IKICogICAgICAgYSBmaXhlZCBudW1iZXIgb2YgNCBlbGVtZW50cyAhCiAqLwpzdGF0aWMgeG1sSGFzaFRhYmxlUHRyIHhtbFByZWRlZmluZWRFbnRpdGllcyA9IE5VTEw7CgovKgogKiB4bWxGcmVlRW50aXR5IDogY2xlYW4tdXAgYW4gZW50aXR5IHJlY29yZC4KICovCnN0YXRpYyB2b2lkIHhtbEZyZWVFbnRpdHkoeG1sRW50aXR5UHRyIGVudGl0eSkgewogICAgaWYgKGVudGl0eSA9PSBOVUxMKSByZXR1cm47CgogICAgaWYgKChlbnRpdHktPmNoaWxkcmVuKSAmJiAoZW50aXR5LT5vd25lciA9PSAxKSAmJgoJKGVudGl0eSA9PSAoeG1sRW50aXR5UHRyKSBlbnRpdHktPmNoaWxkcmVuLT5wYXJlbnQpKQoJeG1sRnJlZU5vZGVMaXN0KGVudGl0eS0+Y2hpbGRyZW4pOwogICAgaWYgKGVudGl0eS0+bmFtZSAhPSBOVUxMKQoJeG1sRnJlZSgoY2hhciAqKSBlbnRpdHktPm5hbWUpOwogICAgaWYgKGVudGl0eS0+RXh0ZXJuYWxJRCAhPSBOVUxMKQogICAgICAgIHhtbEZyZWUoKGNoYXIgKikgZW50aXR5LT5FeHRlcm5hbElEKTsKICAgIGlmIChlbnRpdHktPlN5c3RlbUlEICE9IE5VTEwpCiAgICAgICAgeG1sRnJlZSgoY2hhciAqKSBlbnRpdHktPlN5c3RlbUlEKTsKICAgIGlmIChlbnRpdHktPlVSSSAhPSBOVUxMKQogICAgICAgIHhtbEZyZWUoKGNoYXIgKikgZW50aXR5LT5VUkkpOwogICAgaWYgKGVudGl0eS0+Y29udGVudCAhPSBOVUxMKQogICAgICAgIHhtbEZyZWUoKGNoYXIgKikgZW50aXR5LT5jb250ZW50KTsKICAgIGlmIChlbnRpdHktPm9yaWcgIT0gTlVMTCkKICAgICAgICB4bWxGcmVlKChjaGFyICopIGVudGl0eS0+b3JpZyk7CiAgICB4bWxGcmVlKGVudGl0eSk7Cn0KCi8qCiAqIHhtbEFkZEVudGl0eSA6IHJlZ2lzdGVyIGEgbmV3IGVudGl0eSBmb3IgYW4gZW50aXRpZXMgdGFibGUuCiAqLwpzdGF0aWMgeG1sRW50aXR5UHRyCnhtbEFkZEVudGl0eSh4bWxEdGRQdHIgZHRkLCBjb25zdCB4bWxDaGFyICpuYW1lLCBpbnQgdHlwZSwKCSAgY29uc3QgeG1sQ2hhciAqRXh0ZXJuYWxJRCwgY29uc3QgeG1sQ2hhciAqU3lzdGVtSUQsCgkgIGNvbnN0IHhtbENoYXIgKmNvbnRlbnQpIHsKICAgIHhtbEVudGl0aWVzVGFibGVQdHIgdGFibGUgPSBOVUxMOwogICAgeG1sRW50aXR5UHRyIHJldDsKCiAgICBpZiAobmFtZSA9PSBOVUxMKQoJcmV0dXJuKE5VTEwpOwogICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgY2FzZSBYTUxfSU5URVJOQUxfR0VORVJBTF9FTlRJVFk6CiAgICAgICAgY2FzZSBYTUxfRVhURVJOQUxfR0VORVJBTF9QQVJTRURfRU5USVRZOgogICAgICAgIGNhc2UgWE1MX0VYVEVSTkFMX0dFTkVSQUxfVU5QQVJTRURfRU5USVRZOgoJICAgIGlmIChkdGQtPmVudGl0aWVzID09IE5VTEwpCgkJZHRkLT5lbnRpdGllcyA9IHhtbEhhc2hDcmVhdGUoMCk7CgkgICAgdGFibGUgPSBkdGQtPmVudGl0aWVzOwoJICAgIGJyZWFrOwogICAgICAgIGNhc2UgWE1MX0lOVEVSTkFMX1BBUkFNRVRFUl9FTlRJVFk6CiAgICAgICAgY2FzZSBYTUxfRVhURVJOQUxfUEFSQU1FVEVSX0VOVElUWToKCSAgICBpZiAoZHRkLT5wZW50aXRpZXMgPT0gTlVMTCkKCQlkdGQtPnBlbnRpdGllcyA9IHhtbEhhc2hDcmVhdGUoMCk7CgkgICAgdGFibGUgPSBkdGQtPnBlbnRpdGllczsKCSAgICBicmVhazsKICAgICAgICBjYXNlIFhNTF9JTlRFUk5BTF9QUkVERUZJTkVEX0VOVElUWToKCSAgICBpZiAoeG1sUHJlZGVmaW5lZEVudGl0aWVzID09IE5VTEwpCgkJeG1sUHJlZGVmaW5lZEVudGl0aWVzID0geG1sSGFzaENyZWF0ZSg4KTsKCSAgICB0YWJsZSA9IHhtbFByZWRlZmluZWRFbnRpdGllczsKICAgIH0KICAgIGlmICh0YWJsZSA9PSBOVUxMKQoJcmV0dXJuKE5VTEwpOwogICAgcmV0ID0gKHhtbEVudGl0eVB0cikgeG1sTWFsbG9jKHNpemVvZih4bWxFbnRpdHkpKTsKICAgIGlmIChyZXQgPT0gTlVMTCkgewoJeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCgkJInhtbEFkZEVudGl0eTogb3V0IG9mIG1lbW9yeVxuIik7CglyZXR1cm4oTlVMTCk7CiAgICB9CiAgICBtZW1zZXQocmV0LCAwLCBzaXplb2YoeG1sRW50aXR5KSk7CiAgICByZXQtPnR5cGUgPSBYTUxfRU5USVRZX0RFQ0w7CgogICAgLyoKICAgICAqIGZpbGwgdGhlIHN0cnVjdHVyZS4KICAgICAqLwogICAgcmV0LT5uYW1lID0geG1sU3RyZHVwKG5hbWUpOwogICAgcmV0LT5ldHlwZSA9ICh4bWxFbnRpdHlUeXBlKSB0eXBlOwogICAgaWYgKEV4dGVybmFsSUQgIT0gTlVMTCkKCXJldC0+RXh0ZXJuYWxJRCA9IHhtbFN0cmR1cChFeHRlcm5hbElEKTsKICAgIGlmIChTeXN0ZW1JRCAhPSBOVUxMKQoJcmV0LT5TeXN0ZW1JRCA9IHhtbFN0cmR1cChTeXN0ZW1JRCk7CiAgICBpZiAoY29udGVudCAhPSBOVUxMKSB7CiAgICAgICAgcmV0LT5sZW5ndGggPSB4bWxTdHJsZW4oY29udGVudCk7CglyZXQtPmNvbnRlbnQgPSB4bWxTdHJuZHVwKGNvbnRlbnQsIHJldC0+bGVuZ3RoKTsKICAgICB9IGVsc2UgewogICAgICAgIHJldC0+bGVuZ3RoID0gMDsKICAgICAgICByZXQtPmNvbnRlbnQgPSBOVUxMOwogICAgfQogICAgcmV0LT5VUkkgPSBOVUxMOyAvKiB0byBiZSBjb21wdXRlZCBieSB0aGUgbGF5ZXIga25vd2luZwoJCQl0aGUgZGVmaW5pbmcgZW50aXR5ICovCiAgICByZXQtPm9yaWcgPSBOVUxMOwogICAgcmV0LT5vd25lciA9IDA7CgogICAgaWYgKHhtbEhhc2hBZGRFbnRyeSh0YWJsZSwgbmFtZSwgcmV0KSkgewoJLyoKCSAqIGVudGl0eSB3YXMgYWxyZWFkeSBkZWZpbmVkIGF0IGFub3RoZXIgbGV2ZWwuCgkgKi8KICAgICAgICB4bWxGcmVlRW50aXR5KHJldCk7CglyZXR1cm4oTlVMTCk7CiAgICB9CiAgICByZXR1cm4ocmV0KTsKfQoKLyoqCiAqIHhtbEluaXRpYWxpemVQcmVkZWZpbmVkRW50aXRpZXM6CiAqCiAqIFNldCB1cCB0aGUgcHJlZGVmaW5lZCBlbnRpdGllcy4KICovCnZvaWQgeG1sSW5pdGlhbGl6ZVByZWRlZmluZWRFbnRpdGllcyh2b2lkKSB7CiAgICB1bnNpZ25lZCBpbnQgaTsKICAgIHhtbENoYXIgbmFtZVs1MF07CiAgICB4bWxDaGFyIHZhbHVlWzUwXTsKICAgIGNvbnN0IGNoYXIgKmluOwogICAgeG1sQ2hhciAqb3V0OwoKICAgIGlmICh4bWxQcmVkZWZpbmVkRW50aXRpZXMgIT0gTlVMTCkgcmV0dXJuOwoKICAgIHhtbFByZWRlZmluZWRFbnRpdGllcyA9IHhtbENyZWF0ZUVudGl0aWVzVGFibGUoKTsKICAgIGZvciAoaSA9IDA7aSA8IHNpemVvZih4bWxQcmVkZWZpbmVkRW50aXR5VmFsdWVzKSAvIAogICAgICAgICAgICAgICAgICAgc2l6ZW9mKHhtbFByZWRlZmluZWRFbnRpdHlWYWx1ZXNbMF0pO2krKykgewogICAgICAgIGluID0geG1sUHJlZGVmaW5lZEVudGl0eVZhbHVlc1tpXS5uYW1lOwoJb3V0ID0gJm5hbWVbMF07Cglmb3IgKDsoKm91dCsrID0gKHhtbENoYXIpICppbik7KWluKys7CiAgICAgICAgaW4gPSB4bWxQcmVkZWZpbmVkRW50aXR5VmFsdWVzW2ldLnZhbHVlOwoJb3V0ID0gJnZhbHVlWzBdOwoJZm9yICg7KCpvdXQrKyA9ICh4bWxDaGFyKSAqaW4pOylpbisrOwoKICAgICAgICB4bWxBZGRFbnRpdHkoTlVMTCwgKGNvbnN0IHhtbENoYXIgKikgJm5hbWVbMF0sCgkgICAgICAgICAgICAgWE1MX0lOVEVSTkFMX1BSRURFRklORURfRU5USVRZLCBOVUxMLCBOVUxMLAoJCSAgICAgJnZhbHVlWzBdKTsKICAgIH0KfQoKLyoqCiAqIHhtbENsZWFudXBQcmVkZWZpbmVkRW50aXRpZXM6CiAqCiAqIENsZWFudXAgdXAgdGhlIHByZWRlZmluZWQgZW50aXRpZXMgdGFibGUuCiAqLwp2b2lkIHhtbENsZWFudXBQcmVkZWZpbmVkRW50aXRpZXModm9pZCkgewogICAgaWYgKHhtbFByZWRlZmluZWRFbnRpdGllcyA9PSBOVUxMKSByZXR1cm47CgogICAgeG1sRnJlZUVudGl0aWVzVGFibGUoeG1sUHJlZGVmaW5lZEVudGl0aWVzKTsKICAgIHhtbFByZWRlZmluZWRFbnRpdGllcyA9IE5VTEw7Cn0KCi8qKgogKiB4bWxHZXRQcmVkZWZpbmVkRW50aXR5OgogKiBAbmFtZTogIHRoZSBlbnRpdHkgbmFtZQogKgogKiBDaGVjayB3aGV0aGVyIHRoaXMgbmFtZSBpcyBhbiBwcmVkZWZpbmVkIGVudGl0eS4KICoKICogUmV0dXJucyBOVUxMIGlmIG5vdCwgb3RoZXJ3aXNlIHRoZSBlbnRpdHkKICovCnhtbEVudGl0eVB0cgp4bWxHZXRQcmVkZWZpbmVkRW50aXR5KGNvbnN0IHhtbENoYXIgKm5hbWUpIHsKICAgIGlmICh4bWxQcmVkZWZpbmVkRW50aXRpZXMgPT0gTlVMTCkKICAgICAgICB4bWxJbml0aWFsaXplUHJlZGVmaW5lZEVudGl0aWVzKCk7CiAgICByZXR1cm4oKHhtbEVudGl0eVB0cikgeG1sSGFzaExvb2t1cCh4bWxQcmVkZWZpbmVkRW50aXRpZXMsIG5hbWUpKTsKfQoKLyoqCiAqIHhtbEFkZER0ZEVudGl0eToKICogQGRvYzogIHRoZSBkb2N1bWVudAogKiBAbmFtZTogIHRoZSBlbnRpdHkgbmFtZQogKiBAdHlwZTogIHRoZSBlbnRpdHkgdHlwZSBYTUxfeHh4X3l5eV9FTlRJVFkKICogQEV4dGVybmFsSUQ6ICB0aGUgZW50aXR5IGV4dGVybmFsIElEIGlmIGF2YWlsYWJsZQogKiBAU3lzdGVtSUQ6ICB0aGUgZW50aXR5IHN5c3RlbSBJRCBpZiBhdmFpbGFibGUKICogQGNvbnRlbnQ6ICB0aGUgZW50aXR5IGNvbnRlbnQKICoKICogUmVnaXN0ZXIgYSBuZXcgZW50aXR5IGZvciB0aGlzIGRvY3VtZW50IERURCBleHRlcm5hbCBzdWJzZXQuCiAqCiAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBlbnRpdHkgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yCiAqLwp4bWxFbnRpdHlQdHIKeG1sQWRkRHRkRW50aXR5KHhtbERvY1B0ciBkb2MsIGNvbnN0IHhtbENoYXIgKm5hbWUsIGludCB0eXBlLAoJICAgICAgICBjb25zdCB4bWxDaGFyICpFeHRlcm5hbElELCBjb25zdCB4bWxDaGFyICpTeXN0ZW1JRCwKCQljb25zdCB4bWxDaGFyICpjb250ZW50KSB7CiAgICB4bWxFbnRpdHlQdHIgcmV0OwogICAgeG1sRHRkUHRyIGR0ZDsKCiAgICBpZiAoZG9jID09IE5VTEwpIHsKICAgICAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKCSAgICAgICAgInhtbEFkZER0ZEVudGl0eTogZG9jID09IE5VTEwgIVxuIik7CglyZXR1cm4oTlVMTCk7CiAgICB9CiAgICBpZiAoZG9jLT5leHRTdWJzZXQgPT0gTlVMTCkgewogICAgICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAoJICAgICAgICAieG1sQWRkRHRkRW50aXR5OiBkb2N1bWVudCB3aXRob3V0IGV4dGVybmFsIHN1YnNldCAhXG4iKTsKCXJldHVybihOVUxMKTsKICAgIH0KICAgIGR0ZCA9IGRvYy0+ZXh0U3Vic2V0OwogICAgcmV0ID0geG1sQWRkRW50aXR5KGR0ZCwgbmFtZSwgdHlwZSwgRXh0ZXJuYWxJRCwgU3lzdGVtSUQsIGNvbnRlbnQpOwogICAgaWYgKHJldCA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CgogICAgLyoKICAgICAqIExpbmsgaXQgdG8gdGhlIERURAogICAgICovCiAgICByZXQtPnBhcmVudCA9IGR0ZDsKICAgIHJldC0+ZG9jID0gZHRkLT5kb2M7CiAgICBpZiAoZHRkLT5sYXN0ID09IE5VTEwpIHsKCWR0ZC0+Y2hpbGRyZW4gPSBkdGQtPmxhc3QgPSAoeG1sTm9kZVB0cikgcmV0OwogICAgfSBlbHNlIHsKICAgICAgICBkdGQtPmxhc3QtPm5leHQgPSAoeG1sTm9kZVB0cikgcmV0OwoJcmV0LT5wcmV2ID0gZHRkLT5sYXN0OwoJZHRkLT5sYXN0ID0gKHhtbE5vZGVQdHIpIHJldDsKICAgIH0KICAgIHJldHVybihyZXQpOwp9CgovKioKICogeG1sQWRkRG9jRW50aXR5OgogKiBAZG9jOiAgdGhlIGRvY3VtZW50CiAqIEBuYW1lOiAgdGhlIGVudGl0eSBuYW1lCiAqIEB0eXBlOiAgdGhlIGVudGl0eSB0eXBlIFhNTF94eHhfeXl5X0VOVElUWQogKiBARXh0ZXJuYWxJRDogIHRoZSBlbnRpdHkgZXh0ZXJuYWwgSUQgaWYgYXZhaWxhYmxlCiAqIEBTeXN0ZW1JRDogIHRoZSBlbnRpdHkgc3lzdGVtIElEIGlmIGF2YWlsYWJsZQogKiBAY29udGVudDogIHRoZSBlbnRpdHkgY29udGVudAogKgogKiBSZWdpc3RlciBhIG5ldyBlbnRpdHkgZm9yIHRoaXMgZG9jdW1lbnQuCiAqCiAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBlbnRpdHkgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yCiAqLwp4bWxFbnRpdHlQdHIKeG1sQWRkRG9jRW50aXR5KHhtbERvY1B0ciBkb2MsIGNvbnN0IHhtbENoYXIgKm5hbWUsIGludCB0eXBlLAoJICAgICAgICBjb25zdCB4bWxDaGFyICpFeHRlcm5hbElELCBjb25zdCB4bWxDaGFyICpTeXN0ZW1JRCwKCSAgICAgICAgY29uc3QgeG1sQ2hhciAqY29udGVudCkgewogICAgeG1sRW50aXR5UHRyIHJldDsKICAgIHhtbER0ZFB0ciBkdGQ7CgogICAgaWYgKGRvYyA9PSBOVUxMKSB7CiAgICAgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCgkgICAgICAgICJ4bWxBZGREb2NFbnRpdHk6IGRvY3VtZW50IGlzIE5VTEwgIVxuIik7CglyZXR1cm4oTlVMTCk7CiAgICB9CiAgICBpZiAoZG9jLT5pbnRTdWJzZXQgPT0gTlVMTCkgewogICAgICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAoJICAgICAgICAieG1sQWRkRG9jRW50aXR5OiBkb2N1bWVudCB3aXRob3V0IGludGVybmFsIHN1YnNldCAhXG4iKTsKCXJldHVybihOVUxMKTsKICAgIH0KICAgIGR0ZCA9IGRvYy0+aW50U3Vic2V0OwogICAgcmV0ID0geG1sQWRkRW50aXR5KGR0ZCwgbmFtZSwgdHlwZSwgRXh0ZXJuYWxJRCwgU3lzdGVtSUQsIGNvbnRlbnQpOwogICAgaWYgKHJldCA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CgogICAgLyoKICAgICAqIExpbmsgaXQgdG8gdGhlIERURAogICAgICovCiAgICByZXQtPnBhcmVudCA9IGR0ZDsKICAgIHJldC0+ZG9jID0gZHRkLT5kb2M7CiAgICBpZiAoZHRkLT5sYXN0ID09IE5VTEwpIHsKCWR0ZC0+Y2hpbGRyZW4gPSBkdGQtPmxhc3QgPSAoeG1sTm9kZVB0cikgcmV0OwogICAgfSBlbHNlIHsKCWR0ZC0+bGFzdC0+bmV4dCA9ICh4bWxOb2RlUHRyKSByZXQ7CglyZXQtPnByZXYgPSBkdGQtPmxhc3Q7CglkdGQtPmxhc3QgPSAoeG1sTm9kZVB0cikgcmV0OwogICAgfQogICAgcmV0dXJuKHJldCk7Cn0KCi8qKgogKiB4bWxHZXRFbnRpdHlGcm9tVGFibGU6CiAqIEB0YWJsZTogIGFuIGVudGl0eSB0YWJsZQogKiBAbmFtZTogIHRoZSBlbnRpdHkgbmFtZQogKiBAcGFyYW1ldGVyOiAgbG9vayBmb3IgcGFyYW1ldGVyIGVudGl0aWVzCiAqCiAqIERvIGFuIGVudGl0eSBsb29rdXAgaW4gdGhlIHRhYmxlLgogKiByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHBhcmFtZXRlciBlbnRpdHksIGlmIGZvdW5kLgogKiAKICogUmV0dXJucyBBIHBvaW50ZXIgdG8gdGhlIGVudGl0eSBzdHJ1Y3R1cmUgb3IgTlVMTCBpZiBub3QgZm91bmQuCiAqLwpzdGF0aWMgeG1sRW50aXR5UHRyCnhtbEdldEVudGl0eUZyb21UYWJsZSh4bWxFbnRpdGllc1RhYmxlUHRyIHRhYmxlLCBjb25zdCB4bWxDaGFyICpuYW1lKSB7CiAgICByZXR1cm4oKHhtbEVudGl0eVB0cikgeG1sSGFzaExvb2t1cCh0YWJsZSwgbmFtZSkpOwp9CgovKioKICogeG1sR2V0UGFyYW1ldGVyRW50aXR5OgogKiBAZG9jOiAgdGhlIGRvY3VtZW50IHJlZmVyZW5jaW5nIHRoZSBlbnRpdHkKICogQG5hbWU6ICB0aGUgZW50aXR5IG5hbWUKICoKICogRG8gYW4gZW50aXR5IGxvb2t1cCBpbiB0aGUgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHN1YnNldHMgYW5kCiAqIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyIGVudGl0eSwgaWYgZm91bmQuCiAqIAogKiBSZXR1cm5zIEEgcG9pbnRlciB0byB0aGUgZW50aXR5IHN0cnVjdHVyZSBvciBOVUxMIGlmIG5vdCBmb3VuZC4KICovCnhtbEVudGl0eVB0cgp4bWxHZXRQYXJhbWV0ZXJFbnRpdHkoeG1sRG9jUHRyIGRvYywgY29uc3QgeG1sQ2hhciAqbmFtZSkgewogICAgeG1sRW50aXRpZXNUYWJsZVB0ciB0YWJsZTsKICAgIHhtbEVudGl0eVB0ciByZXQ7CgogICAgaWYgKGRvYyA9PSBOVUxMKQoJcmV0dXJuKE5VTEwpOwogICAgaWYgKChkb2MtPmludFN1YnNldCAhPSBOVUxMKSAmJiAoZG9jLT5pbnRTdWJzZXQtPnBlbnRpdGllcyAhPSBOVUxMKSkgewoJdGFibGUgPSAoeG1sRW50aXRpZXNUYWJsZVB0cikgZG9jLT5pbnRTdWJzZXQtPnBlbnRpdGllczsKCXJldCA9IHhtbEdldEVudGl0eUZyb21UYWJsZSh0YWJsZSwgbmFtZSk7CglpZiAocmV0ICE9IE5VTEwpCgkgICAgcmV0dXJuKHJldCk7CiAgICB9CiAgICBpZiAoKGRvYy0+ZXh0U3Vic2V0ICE9IE5VTEwpICYmIChkb2MtPmV4dFN1YnNldC0+cGVudGl0aWVzICE9IE5VTEwpKSB7Cgl0YWJsZSA9ICh4bWxFbnRpdGllc1RhYmxlUHRyKSBkb2MtPmV4dFN1YnNldC0+cGVudGl0aWVzOwoJcmV0dXJuKHhtbEdldEVudGl0eUZyb21UYWJsZSh0YWJsZSwgbmFtZSkpOwogICAgfQogICAgcmV0dXJuKE5VTEwpOwp9CgovKioKICogeG1sR2V0RHRkRW50aXR5OgogKiBAZG9jOiAgdGhlIGRvY3VtZW50IHJlZmVyZW5jaW5nIHRoZSBlbnRpdHkKICogQG5hbWU6ICB0aGUgZW50aXR5IG5hbWUKICoKICogRG8gYW4gZW50aXR5IGxvb2t1cCBpbiB0aGUgRFREIGVudGl0eSBoYXNoIHRhYmxlIGFuZAogKiByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGVudGl0eSwgaWYgZm91bmQuCiAqIE5vdGU6IHRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgZG9jdW1lbnQgbm9kZSwgbm90IHRoZSBEVEQgbm9kZS4KICogCiAqIFJldHVybnMgQSBwb2ludGVyIHRvIHRoZSBlbnRpdHkgc3RydWN0dXJlIG9yIE5VTEwgaWYgbm90IGZvdW5kLgogKi8KeG1sRW50aXR5UHRyCnhtbEdldER0ZEVudGl0eSh4bWxEb2NQdHIgZG9jLCBjb25zdCB4bWxDaGFyICpuYW1lKSB7CiAgICB4bWxFbnRpdGllc1RhYmxlUHRyIHRhYmxlOwoKICAgIGlmIChkb2MgPT0gTlVMTCkKCXJldHVybihOVUxMKTsKICAgIGlmICgoZG9jLT5leHRTdWJzZXQgIT0gTlVMTCkgJiYgKGRvYy0+ZXh0U3Vic2V0LT5lbnRpdGllcyAhPSBOVUxMKSkgewoJdGFibGUgPSAoeG1sRW50aXRpZXNUYWJsZVB0cikgZG9jLT5leHRTdWJzZXQtPmVudGl0aWVzOwoJcmV0dXJuKHhtbEdldEVudGl0eUZyb21UYWJsZSh0YWJsZSwgbmFtZSkpOwogICAgfQogICAgcmV0dXJuKE5VTEwpOwp9CgovKioKICogeG1sR2V0RG9jRW50aXR5OgogKiBAZG9jOiAgdGhlIGRvY3VtZW50IHJlZmVyZW5jaW5nIHRoZSBlbnRpdHkKICogQG5hbWU6ICB0aGUgZW50aXR5IG5hbWUKICoKICogRG8gYW4gZW50aXR5IGxvb2t1cCBpbiB0aGUgZG9jdW1lbnQgZW50aXR5IGhhc2ggdGFibGUgYW5kCiAqIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgZW50aXR5LCBvdGhlcndpc2UgYSBsb29rdXAgaXMgZG9uZQogKiBpbiB0aGUgcHJlZGVmaW5lZCBlbnRpdGllcyB0b28uCiAqIAogKiBSZXR1cm5zIEEgcG9pbnRlciB0byB0aGUgZW50aXR5IHN0cnVjdHVyZSBvciBOVUxMIGlmIG5vdCBmb3VuZC4KICovCnhtbEVudGl0eVB0cgp4bWxHZXREb2NFbnRpdHkoeG1sRG9jUHRyIGRvYywgY29uc3QgeG1sQ2hhciAqbmFtZSkgewogICAgeG1sRW50aXR5UHRyIGN1cjsKICAgIHhtbEVudGl0aWVzVGFibGVQdHIgdGFibGU7CgogICAgaWYgKGRvYyAhPSBOVUxMKSB7CglpZiAoKGRvYy0+aW50U3Vic2V0ICE9IE5VTEwpICYmIChkb2MtPmludFN1YnNldC0+ZW50aXRpZXMgIT0gTlVMTCkpIHsKCSAgICB0YWJsZSA9ICh4bWxFbnRpdGllc1RhYmxlUHRyKSBkb2MtPmludFN1YnNldC0+ZW50aXRpZXM7CgkgICAgY3VyID0geG1sR2V0RW50aXR5RnJvbVRhYmxlKHRhYmxlLCBuYW1lKTsKCSAgICBpZiAoY3VyICE9IE5VTEwpCgkJcmV0dXJuKGN1cik7Cgl9CglpZiAoZG9jLT5zdGFuZGFsb25lICE9IDEpIHsKCSAgICBpZiAoKGRvYy0+ZXh0U3Vic2V0ICE9IE5VTEwpICYmCgkJKGRvYy0+ZXh0U3Vic2V0LT5lbnRpdGllcyAhPSBOVUxMKSkgewoJCXRhYmxlID0gKHhtbEVudGl0aWVzVGFibGVQdHIpIGRvYy0+ZXh0U3Vic2V0LT5lbnRpdGllczsKCQljdXIgPSB4bWxHZXRFbnRpdHlGcm9tVGFibGUodGFibGUsIG5hbWUpOwoJCWlmIChjdXIgIT0gTlVMTCkKCQkgICAgcmV0dXJuKGN1cik7CgkgICAgfQoJfQogICAgfQogICAgaWYgKHhtbFByZWRlZmluZWRFbnRpdGllcyA9PSBOVUxMKQogICAgICAgIHhtbEluaXRpYWxpemVQcmVkZWZpbmVkRW50aXRpZXMoKTsKICAgIHRhYmxlID0geG1sUHJlZGVmaW5lZEVudGl0aWVzOwogICAgcmV0dXJuKHhtbEdldEVudGl0eUZyb21UYWJsZSh0YWJsZSwgbmFtZSkpOwp9CgovKgogKiBbMl0gQ2hhciA6Oj0gI3g5IHwgI3hBIHwgI3hEIHwgWyN4MjAtI3hEN0ZGXSB8IFsjeEUwMDAtI3hGRkZEXQogKiAgICAgICAgICAgICAgICAgIHwgWyN4MTAwMDAtI3gxMEZGRkZdCiAqIGFueSBVbmljb2RlIGNoYXJhY3RlciwgZXhjbHVkaW5nIHRoZSBzdXJyb2dhdGUgYmxvY2tzLCBGRkZFLCBhbmQgRkZGRi4KICovCiNkZWZpbmUgSVNfQ0hBUihjKQkJCQkJCQlcCiAgICAoKChjKSA9PSAweDA5KSB8fCAoKGMpID09IDB4MGEpIHx8ICgoYykgPT0gMHgwZCkgfHwJCQlcCiAgICAgKCgoYykgPj0gMHgyMCkgJiYgKChjKSAhPSAweEZGRkUpICYmICgoYykgIT0gMHhGRkZGKSkpCgovKgogKiBNYWNybyB1c2VkIHRvIGdyb3cgdGhlIGN1cnJlbnQgYnVmZmVyLgogKi8KI2RlZmluZSBncm93QnVmZmVyUmVlbnRyYW50KCkgewkJCQkJCVwKICAgIGJ1ZmZlcl9zaXplICo9IDI7CQkJCQkJCVwKICAgIGJ1ZmZlciA9ICh4bWxDaGFyICopCQkJCQkJXAogICAgCQl4bWxSZWFsbG9jKGJ1ZmZlciwgYnVmZmVyX3NpemUgKiBzaXplb2YoeG1sQ2hhcikpOwlcCiAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsJCQkJCQlcCgl4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwgInJlYWxsb2MgZmFpbGVkXG4iKTsJXAoJcmV0dXJuKE5VTEwpOwkJCQkJCQlcCiAgICB9CQkJCQkJCQkJXAp9CgoKLyoqCiAqIHhtbEVuY29kZUVudGl0aWVzUmVlbnRyYW50OgogKiBAZG9jOiAgdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgdGhlIHN0cmluZwogKiBAaW5wdXQ6ICBBIHN0cmluZyB0byBjb252ZXJ0IHRvIFhNTC4KICoKICogRG8gYSBnbG9iYWwgZW5jb2Rpbmcgb2YgYSBzdHJpbmcsIHJlcGxhY2luZyB0aGUgcHJlZGVmaW5lZCBlbnRpdGllcwogKiBhbmQgbm9uIEFTQ0lJIHZhbHVlcyB3aXRoIHRoZWlyIGVudGl0aWVzIGFuZCBDaGFyUmVmIGNvdW50ZXJwYXJ0cy4KICogQ29udHJhcnkgdG8geG1sRW5jb2RlRW50aXRpZXMsIHRoaXMgcm91dGluZSBpcyByZWVudHJhbnQsIGFuZCByZXN1bHQKICogbXVzdCBiZSBkZWFsbG9jYXRlZC4KICoKICogUmV0dXJucyBBIG5ld2x5IGFsbG9jYXRlZCBzdHJpbmcgd2l0aCB0aGUgc3Vic3RpdHV0aW9uIGRvbmUuCiAqLwp4bWxDaGFyICoKeG1sRW5jb2RlRW50aXRpZXNSZWVudHJhbnQoeG1sRG9jUHRyIGRvYywgY29uc3QgeG1sQ2hhciAqaW5wdXQpIHsKICAgIGNvbnN0IHhtbENoYXIgKmN1ciA9IGlucHV0OwogICAgeG1sQ2hhciAqYnVmZmVyID0gTlVMTDsKICAgIHhtbENoYXIgKm91dCA9IE5VTEw7CiAgICBpbnQgYnVmZmVyX3NpemUgPSAwOwogICAgaW50IGh0bWwgPSAwOwoKICAgIGlmIChpbnB1dCA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CiAgICBpZiAoZG9jICE9IE5VTEwpCiAgICAgICAgaHRtbCA9IChkb2MtPnR5cGUgPT0gWE1MX0hUTUxfRE9DVU1FTlRfTk9ERSk7CgogICAgLyoKICAgICAqIGFsbG9jYXRlIGFuIHRyYW5zbGF0aW9uIGJ1ZmZlci4KICAgICAqLwogICAgYnVmZmVyX3NpemUgPSAxMDAwOwogICAgYnVmZmVyID0gKHhtbENoYXIgKikgeG1sTWFsbG9jKGJ1ZmZlcl9zaXplICogc2l6ZW9mKHhtbENoYXIpKTsKICAgIGlmIChidWZmZXIgPT0gTlVMTCkgewoJeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsICJtYWxsb2MgZmFpbGVkXG4iKTsKCXJldHVybihOVUxMKTsKICAgIH0KICAgIG91dCA9IGJ1ZmZlcjsKCiAgICB3aGlsZSAoKmN1ciAhPSAnXDAnKSB7CiAgICAgICAgaWYgKG91dCAtIGJ1ZmZlciA+IGJ1ZmZlcl9zaXplIC0gMTAwKSB7CgkgICAgaW50IGluZHggPSBvdXQgLSBidWZmZXI7CgoJICAgIGdyb3dCdWZmZXJSZWVudHJhbnQoKTsKCSAgICBvdXQgPSAmYnVmZmVyW2luZHhdOwoJfQoKCS8qCgkgKiBCeSBkZWZhdWx0IG9uZSBoYXZlIHRvIGVuY29kZSBhdCBsZWFzdCAnPCcsICc+JywgJyInIGFuZCAnJicgIQoJICovCglpZiAoKmN1ciA9PSAnPCcpIHsKCSAgICAqb3V0KysgPSAnJic7CgkgICAgKm91dCsrID0gJ2wnOwoJICAgICpvdXQrKyA9ICd0JzsKCSAgICAqb3V0KysgPSAnOyc7Cgl9IGVsc2UgaWYgKCpjdXIgPT0gJz4nKSB7CgkgICAgKm91dCsrID0gJyYnOwoJICAgICpvdXQrKyA9ICdnJzsKCSAgICAqb3V0KysgPSAndCc7CgkgICAgKm91dCsrID0gJzsnOwoJfSBlbHNlIGlmICgqY3VyID09ICcmJykgewoJICAgICpvdXQrKyA9ICcmJzsKCSAgICAqb3V0KysgPSAnYSc7CgkgICAgKm91dCsrID0gJ20nOwoJICAgICpvdXQrKyA9ICdwJzsKCSAgICAqb3V0KysgPSAnOyc7Cgl9IGVsc2UgaWYgKCgoKmN1ciA+PSAweDIwKSAmJiAoKmN1ciA8IDB4ODApKSB8fAoJICAgICgqY3VyID09ICdcbicpIHx8ICgqY3VyID09ICdcdCcpIHx8ICgoaHRtbCkgJiYgKCpjdXIgPT0gJ1xyJykpKSB7CgkgICAgLyoKCSAgICAgKiBkZWZhdWx0IGNhc2UsIGp1c3QgY29weSAhCgkgICAgICovCgkgICAgKm91dCsrID0gKmN1cjsKCX0gZWxzZSBpZiAoKmN1ciA+PSAweDgwKSB7CgkgICAgaWYgKCgoZG9jICE9IE5VTEwpICYmIChkb2MtPmVuY29kaW5nICE9IE5VTEwpKSB8fCAoaHRtbCkpIHsKCQkvKgoJCSAqIEJq+HJuIFJlZXNlIDxickBzc2V1c2EuY29tPiBwcm92aWRlZCB0aGUgcGF0Y2gKCSAgICAgICAgeG1sQ2hhciB4YzsKCSAgICAgICAgeGMgPSAoKmN1ciAmIDB4M0YpIDw8IDY7CgkgICAgICAgIGlmIChjdXJbMV0gIT0gMCkgewoJCSAgICB4YyArPSAqKCsrY3VyKSAmIDB4M0Y7CgkJICAgICpvdXQrKyA9IHhjOwoJICAgICAgICB9IGVsc2UKCQkgKi8KCQkgICAgKm91dCsrID0gKmN1cjsKCSAgICB9IGVsc2UgewoJCS8qCgkJICogV2UgYXNzdW1lIHdlIGhhdmUgVVRGLTggaW5wdXQuCgkJICovCgkJY2hhciBidWZbMTBdLCAqcHRyOwoJCWludCB2YWwgPSAwLCBsID0gMTsKCgkJaWYgKCpjdXIgPCAweEMwKSB7CgkJICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAoJCQkgICAgInhtbEVuY29kZUVudGl0aWVzUmVlbnRyYW50IDogaW5wdXQgbm90IFVURi04XG4iKTsKCQkgICAgaWYgKGRvYyAhPSBOVUxMKQoJCQlkb2MtPmVuY29kaW5nID0geG1sU3RyZHVwKEJBRF9DQVNUICJJU08tODg1OS0xIik7CgkJICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICImIyVkOyIsICpjdXIpOwoJCSAgICBidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9IDA7CgkJICAgIHB0ciA9IGJ1ZjsKCQkgICAgd2hpbGUgKCpwdHIgIT0gMCkgKm91dCsrID0gKnB0cisrOwoJCSAgICBjdXIrKzsKCQkgICAgY29udGludWU7CgkJfSBlbHNlIGlmICgqY3VyIDwgMHhFMCkgewogICAgICAgICAgICAgICAgICAgIHZhbCA9IChjdXJbMF0pICYgMHgxRjsKCQkgICAgdmFsIDw8PSA2OwoJCSAgICB2YWwgfD0gKGN1clsxXSkgJiAweDNGOwoJCSAgICBsID0gMjsKCQl9IGVsc2UgaWYgKCpjdXIgPCAweEYwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gKGN1clswXSkgJiAweDBGOwoJCSAgICB2YWwgPDw9IDY7CgkJICAgIHZhbCB8PSAoY3VyWzFdKSAmIDB4M0Y7CgkJICAgIHZhbCA8PD0gNjsKCQkgICAgdmFsIHw9IChjdXJbMl0pICYgMHgzRjsKCQkgICAgbCA9IDM7CgkJfSBlbHNlIGlmICgqY3VyIDwgMHhGOCkgewogICAgICAgICAgICAgICAgICAgIHZhbCA9IChjdXJbMF0pICYgMHgwNzsKCQkgICAgdmFsIDw8PSA2OwoJCSAgICB2YWwgfD0gKGN1clsxXSkgJiAweDNGOwoJCSAgICB2YWwgPDw9IDY7CgkJICAgIHZhbCB8PSAoY3VyWzJdKSAmIDB4M0Y7CgkJICAgIHZhbCA8PD0gNjsKCQkgICAgdmFsIHw9IChjdXJbM10pICYgMHgzRjsKCQkgICAgbCA9IDQ7CgkJfQoJCWlmICgobCA9PSAxKSB8fCAoIUlTX0NIQVIodmFsKSkpIHsKCQkgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCgkJCSJ4bWxFbmNvZGVFbnRpdGllc1JlZW50cmFudCA6IGNoYXIgb3V0IG9mIHJhbmdlXG4iKTsKCQkgICAgaWYgKGRvYyAhPSBOVUxMKQoJCQlkb2MtPmVuY29kaW5nID0geG1sU3RyZHVwKEJBRF9DQVNUICJJU08tODg1OS0xIik7CgkJICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICImIyVkOyIsICpjdXIpOwoJCSAgICBidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9IDA7CgkJICAgIHB0ciA9IGJ1ZjsKCQkgICAgd2hpbGUgKCpwdHIgIT0gMCkgKm91dCsrID0gKnB0cisrOwoJCSAgICBjdXIrKzsKCQkgICAgY29udGludWU7CgkJfQoJCS8qCgkJICogV2UgY291bGQgZG8gbXVsdGlwbGUgdGhpbmdzIGhlcmUuIEp1c3Qgc2F2ZSBhcyBhIGNoYXIgcmVmCgkJICovCgkJaWYgKGh0bWwpCgkJICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICImIyVkOyIsIHZhbCk7CgkJZWxzZQoJCSAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJiN4JVg7IiwgdmFsKTsKCQlidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9IDA7CgkJcHRyID0gYnVmOwoJCXdoaWxlICgqcHRyICE9IDApICpvdXQrKyA9ICpwdHIrKzsKCQljdXIgKz0gbDsKCQljb250aW51ZTsKCSAgICB9Cgl9IGVsc2UgaWYgKElTX0NIQVIoKHVuc2lnbmVkIGludCkgKmN1cikpIHsKCSAgICBjaGFyIGJ1ZlsxMF0sICpwdHI7CgoJICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICImIyVkOyIsICpjdXIpOwoJICAgIGJ1ZltzaXplb2YoYnVmKSAtIDFdID0gMDsKICAgICAgICAgICAgcHRyID0gYnVmOwoJICAgIHdoaWxlICgqcHRyICE9IDApICpvdXQrKyA9ICpwdHIrKzsKCX0KCWN1cisrOwogICAgfQogICAgKm91dCsrID0gMDsKICAgIHJldHVybihidWZmZXIpOwp9CgovKioKICogeG1sRW5jb2RlU3BlY2lhbENoYXJzOgogKiBAZG9jOiAgdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgdGhlIHN0cmluZwogKiBAaW5wdXQ6ICBBIHN0cmluZyB0byBjb252ZXJ0IHRvIFhNTC4KICoKICogRG8gYSBnbG9iYWwgZW5jb2Rpbmcgb2YgYSBzdHJpbmcsIHJlcGxhY2luZyB0aGUgcHJlZGVmaW5lZCBlbnRpdGllcwogKiB0aGlzIHJvdXRpbmUgaXMgcmVlbnRyYW50LCBhbmQgcmVzdWx0IG11c3QgYmUgZGVhbGxvY2F0ZWQuCiAqCiAqIFJldHVybnMgQSBuZXdseSBhbGxvY2F0ZWQgc3RyaW5nIHdpdGggdGhlIHN1YnN0aXR1dGlvbiBkb25lLgogKi8KeG1sQ2hhciAqCnhtbEVuY29kZVNwZWNpYWxDaGFycyh4bWxEb2NQdHIgZG9jIEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbENoYXIgKmlucHV0KSB7CiAgICBjb25zdCB4bWxDaGFyICpjdXIgPSBpbnB1dDsKICAgIHhtbENoYXIgKmJ1ZmZlciA9IE5VTEw7CiAgICB4bWxDaGFyICpvdXQgPSBOVUxMOwogICAgaW50IGJ1ZmZlcl9zaXplID0gMDsKICAgIGlmIChpbnB1dCA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CgogICAgLyoKICAgICAqIGFsbG9jYXRlIGFuIHRyYW5zbGF0aW9uIGJ1ZmZlci4KICAgICAqLwogICAgYnVmZmVyX3NpemUgPSAxMDAwOwogICAgYnVmZmVyID0gKHhtbENoYXIgKikgeG1sTWFsbG9jKGJ1ZmZlcl9zaXplICogc2l6ZW9mKHhtbENoYXIpKTsKICAgIGlmIChidWZmZXIgPT0gTlVMTCkgewoJeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsICJtYWxsb2MgZmFpbGVkXG4iKTsKCXJldHVybihOVUxMKTsKICAgIH0KICAgIG91dCA9IGJ1ZmZlcjsKCiAgICB3aGlsZSAoKmN1ciAhPSAnXDAnKSB7CiAgICAgICAgaWYgKG91dCAtIGJ1ZmZlciA+IGJ1ZmZlcl9zaXplIC0gMTApIHsKCSAgICBpbnQgaW5keCA9IG91dCAtIGJ1ZmZlcjsKCgkgICAgZ3Jvd0J1ZmZlclJlZW50cmFudCgpOwoJICAgIG91dCA9ICZidWZmZXJbaW5keF07Cgl9CgoJLyoKCSAqIEJ5IGRlZmF1bHQgb25lIGhhdmUgdG8gZW5jb2RlIGF0IGxlYXN0ICc8JywgJz4nLCAnIicgYW5kICcmJyAhCgkgKi8KCWlmICgqY3VyID09ICc8JykgewoJICAgICpvdXQrKyA9ICcmJzsKCSAgICAqb3V0KysgPSAnbCc7CgkgICAgKm91dCsrID0gJ3QnOwoJICAgICpvdXQrKyA9ICc7JzsKCX0gZWxzZSBpZiAoKmN1ciA9PSAnPicpIHsKCSAgICAqb3V0KysgPSAnJic7CgkgICAgKm91dCsrID0gJ2cnOwoJICAgICpvdXQrKyA9ICd0JzsKCSAgICAqb3V0KysgPSAnOyc7Cgl9IGVsc2UgaWYgKCpjdXIgPT0gJyYnKSB7CgkgICAgKm91dCsrID0gJyYnOwoJICAgICpvdXQrKyA9ICdhJzsKCSAgICAqb3V0KysgPSAnbSc7CgkgICAgKm91dCsrID0gJ3AnOwoJICAgICpvdXQrKyA9ICc7JzsKCX0gZWxzZSBpZiAoKmN1ciA9PSAnIicpIHsKCSAgICAqb3V0KysgPSAnJic7CgkgICAgKm91dCsrID0gJ3EnOwoJICAgICpvdXQrKyA9ICd1JzsKCSAgICAqb3V0KysgPSAnbyc7CgkgICAgKm91dCsrID0gJ3QnOwoJICAgICpvdXQrKyA9ICc7JzsKCX0gZWxzZSBpZiAoKmN1ciA9PSAnXHInKSB7CgkgICAgKm91dCsrID0gJyYnOwoJICAgICpvdXQrKyA9ICcjJzsKCSAgICAqb3V0KysgPSAnMSc7CgkgICAgKm91dCsrID0gJzMnOwoJICAgICpvdXQrKyA9ICc7JzsKCX0gZWxzZSB7CgkgICAgLyoKCSAgICAgKiBXb3JrcyBiZWNhdXNlIG9uIFVURi04LCBhbGwgZXh0ZW5kZWQgc2VxdWVuY2VzIGNhbm5vdAoJICAgICAqIHJlc3VsdCBpbiBieXRlcyBpbiB0aGUgQVNDSUkgcmFuZ2UuCgkgICAgICovCgkgICAgKm91dCsrID0gKmN1cjsKCX0KCWN1cisrOwogICAgfQogICAgKm91dCsrID0gMDsKICAgIHJldHVybihidWZmZXIpOwp9CgovKioKICogeG1sQ3JlYXRlRW50aXRpZXNUYWJsZToKICoKICogY3JlYXRlIGFuZCBpbml0aWFsaXplIGFuIGVtcHR5IGVudGl0aWVzIGhhc2ggdGFibGUuCiAqCiAqIFJldHVybnMgdGhlIHhtbEVudGl0aWVzVGFibGVQdHIganVzdCBjcmVhdGVkIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KICovCnhtbEVudGl0aWVzVGFibGVQdHIKeG1sQ3JlYXRlRW50aXRpZXNUYWJsZSh2b2lkKSB7CiAgICByZXR1cm4oKHhtbEVudGl0aWVzVGFibGVQdHIpIHhtbEhhc2hDcmVhdGUoMCkpOwp9CgovKioKICogeG1sRnJlZUVudGl0eVdyYXBwZXI6CiAqIEBlbnRpdHk6ICBBbiBlbnRpdHkKICogQG5hbWU6ICBpdHMgbmFtZQogKgogKiBEZWFsbG9jYXRlIHRoZSBtZW1vcnkgdXNlZCBieSBhbiBlbnRpdGllcyBpbiB0aGUgaGFzaCB0YWJsZS4KICovCnN0YXRpYyB2b2lkCnhtbEZyZWVFbnRpdHlXcmFwcGVyKHhtbEVudGl0eVB0ciBlbnRpdHksCgkgICAgICAgICAgICAgICBjb25zdCB4bWxDaGFyICpuYW1lIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChlbnRpdHkgIT0gTlVMTCkKCXhtbEZyZWVFbnRpdHkoZW50aXR5KTsKfQoKLyoqCiAqIHhtbEZyZWVFbnRpdGllc1RhYmxlOgogKiBAdGFibGU6ICBBbiBlbnRpdHkgdGFibGUKICoKICogRGVhbGxvY2F0ZSB0aGUgbWVtb3J5IHVzZWQgYnkgYW4gZW50aXRpZXMgaGFzaCB0YWJsZS4KICovCnZvaWQKeG1sRnJlZUVudGl0aWVzVGFibGUoeG1sRW50aXRpZXNUYWJsZVB0ciB0YWJsZSkgewogICAgeG1sSGFzaEZyZWUodGFibGUsICh4bWxIYXNoRGVhbGxvY2F0b3IpIHhtbEZyZWVFbnRpdHlXcmFwcGVyKTsKfQoKLyoqCiAqIHhtbENvcHlFbnRpdHk6CiAqIEBlbnQ6ICBBbiBlbnRpdHkKICoKICogQnVpbGQgYSBjb3B5IG9mIGFuIGVudGl0eQogKiAKICogUmV0dXJucyB0aGUgbmV3IHhtbEVudGl0aWVzUHRyIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KICovCnN0YXRpYyB4bWxFbnRpdHlQdHIKeG1sQ29weUVudGl0eSh4bWxFbnRpdHlQdHIgZW50KSB7CiAgICB4bWxFbnRpdHlQdHIgY3VyOwoKICAgIGN1ciA9ICh4bWxFbnRpdHlQdHIpIHhtbE1hbGxvYyhzaXplb2YoeG1sRW50aXR5KSk7CiAgICBpZiAoY3VyID09IE5VTEwpIHsKCXhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAoJCSJ4bWxDb3B5RW50aXR5OiBvdXQgb2YgbWVtb3J5ICFcbiIpOwoJcmV0dXJuKE5VTEwpOwogICAgfQogICAgbWVtc2V0KGN1ciwgMCwgc2l6ZW9mKHhtbEVudGl0eSkpOwogICAgY3VyLT50eXBlID0gWE1MX0VOVElUWV9ERUNMOwoKICAgIGN1ci0+ZXR5cGUgPSBlbnQtPmV0eXBlOwogICAgaWYgKGVudC0+bmFtZSAhPSBOVUxMKQoJY3VyLT5uYW1lID0geG1sU3RyZHVwKGVudC0+bmFtZSk7CiAgICBpZiAoZW50LT5FeHRlcm5hbElEICE9IE5VTEwpCgljdXItPkV4dGVybmFsSUQgPSB4bWxTdHJkdXAoZW50LT5FeHRlcm5hbElEKTsKICAgIGlmIChlbnQtPlN5c3RlbUlEICE9IE5VTEwpCgljdXItPlN5c3RlbUlEID0geG1sU3RyZHVwKGVudC0+U3lzdGVtSUQpOwogICAgaWYgKGVudC0+Y29udGVudCAhPSBOVUxMKQoJY3VyLT5jb250ZW50ID0geG1sU3RyZHVwKGVudC0+Y29udGVudCk7CiAgICBpZiAoZW50LT5vcmlnICE9IE5VTEwpCgljdXItPm9yaWcgPSB4bWxTdHJkdXAoZW50LT5vcmlnKTsKICAgIGlmIChlbnQtPlVSSSAhPSBOVUxMKQoJY3VyLT5VUkkgPSB4bWxTdHJkdXAoZW50LT5VUkkpOwogICAgcmV0dXJuKGN1cik7Cn0KCi8qKgogKiB4bWxDb3B5RW50aXRpZXNUYWJsZToKICogQHRhYmxlOiAgQW4gZW50aXR5IHRhYmxlCiAqCiAqIEJ1aWxkIGEgY29weSBvZiBhbiBlbnRpdHkgdGFibGUuCiAqIAogKiBSZXR1cm5zIHRoZSBuZXcgeG1sRW50aXRpZXNUYWJsZVB0ciBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCiAqLwp4bWxFbnRpdGllc1RhYmxlUHRyCnhtbENvcHlFbnRpdGllc1RhYmxlKHhtbEVudGl0aWVzVGFibGVQdHIgdGFibGUpIHsKICAgIHJldHVybih4bWxIYXNoQ29weSh0YWJsZSwgKHhtbEhhc2hDb3BpZXIpIHhtbENvcHlFbnRpdHkpKTsKfQoKI2lmZGVmIExJQlhNTF9PVVRQVVRfRU5BQkxFRAovKioKICogeG1sRHVtcEVudGl0eURlY2w6CiAqIEBidWY6ICBBbiBYTUwgYnVmZmVyLgogKiBAZW50OiAgQW4gZW50aXR5IHRhYmxlCiAqCiAqIFRoaXMgd2lsbCBkdW1wIHRoZSBjb250ZW50IG9mIHRoZSBlbnRpdHkgdGFibGUgYXMgYW4gWE1MIERURCBkZWZpbml0aW9uCiAqLwp2b2lkCnhtbER1bXBFbnRpdHlEZWNsKHhtbEJ1ZmZlclB0ciBidWYsIHhtbEVudGl0eVB0ciBlbnQpIHsKICAgIHN3aXRjaCAoZW50LT5ldHlwZSkgewoJY2FzZSBYTUxfSU5URVJOQUxfR0VORVJBTF9FTlRJVFk6CgkgICAgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIjwhRU5USVRZICIpOwoJICAgIHhtbEJ1ZmZlcldyaXRlQ0hBUihidWYsIGVudC0+bmFtZSk7CgkgICAgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIiAiKTsKCSAgICBpZiAoZW50LT5vcmlnICE9IE5VTEwpCgkJeG1sQnVmZmVyV3JpdGVRdW90ZWRTdHJpbmcoYnVmLCBlbnQtPm9yaWcpOwoJICAgIGVsc2UKCQl4bWxCdWZmZXJXcml0ZVF1b3RlZFN0cmluZyhidWYsIGVudC0+Y29udGVudCk7CgkgICAgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIj5cbiIpOwoJICAgIGJyZWFrOwoJY2FzZSBYTUxfRVhURVJOQUxfR0VORVJBTF9QQVJTRURfRU5USVRZOgoJICAgIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICI8IUVOVElUWSAiKTsKCSAgICB4bWxCdWZmZXJXcml0ZUNIQVIoYnVmLCBlbnQtPm5hbWUpOwoJICAgIGlmIChlbnQtPkV4dGVybmFsSUQgIT0gTlVMTCkgewoJCSB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiIFBVQkxJQyAiKTsKCQkgeG1sQnVmZmVyV3JpdGVRdW90ZWRTdHJpbmcoYnVmLCBlbnQtPkV4dGVybmFsSUQpOwoJCSB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiICIpOwoJCSB4bWxCdWZmZXJXcml0ZVF1b3RlZFN0cmluZyhidWYsIGVudC0+U3lzdGVtSUQpOwoJICAgIH0gZWxzZSB7CgkJIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICIgU1lTVEVNICIpOwoJCSB4bWxCdWZmZXJXcml0ZVF1b3RlZFN0cmluZyhidWYsIGVudC0+U3lzdGVtSUQpOwoJICAgIH0KCSAgICB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiPlxuIik7CgkgICAgYnJlYWs7CgljYXNlIFhNTF9FWFRFUk5BTF9HRU5FUkFMX1VOUEFSU0VEX0VOVElUWToKCSAgICB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiPCFFTlRJVFkgIik7CgkgICAgeG1sQnVmZmVyV3JpdGVDSEFSKGJ1ZiwgZW50LT5uYW1lKTsKCSAgICBpZiAoZW50LT5FeHRlcm5hbElEICE9IE5VTEwpIHsKCQkgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIiBQVUJMSUMgIik7CgkJIHhtbEJ1ZmZlcldyaXRlUXVvdGVkU3RyaW5nKGJ1ZiwgZW50LT5FeHRlcm5hbElEKTsKCQkgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIiAiKTsKCQkgeG1sQnVmZmVyV3JpdGVRdW90ZWRTdHJpbmcoYnVmLCBlbnQtPlN5c3RlbUlEKTsKCSAgICB9IGVsc2UgewoJCSB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiIFNZU1RFTSAiKTsKCQkgeG1sQnVmZmVyV3JpdGVRdW90ZWRTdHJpbmcoYnVmLCBlbnQtPlN5c3RlbUlEKTsKCSAgICB9CgkgICAgaWYgKGVudC0+Y29udGVudCAhPSBOVUxMKSB7IC8qIFNob3VsZCBiZSB0cnVlICEgKi8KCQl4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiIE5EQVRBICIpOwoJCWlmIChlbnQtPm9yaWcgIT0gTlVMTCkKCQkgICAgeG1sQnVmZmVyV3JpdGVDSEFSKGJ1ZiwgZW50LT5vcmlnKTsKCQllbHNlCgkJICAgIHhtbEJ1ZmZlcldyaXRlQ0hBUihidWYsIGVudC0+Y29udGVudCk7CgkgICAgfQoJICAgIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICI+XG4iKTsKCSAgICBicmVhazsKCWNhc2UgWE1MX0lOVEVSTkFMX1BBUkFNRVRFUl9FTlRJVFk6CgkgICAgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIjwhRU5USVRZICUgIik7CgkgICAgeG1sQnVmZmVyV3JpdGVDSEFSKGJ1ZiwgZW50LT5uYW1lKTsKCSAgICB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiICIpOwoJICAgIGlmIChlbnQtPm9yaWcgPT0gTlVMTCkKCQl4bWxCdWZmZXJXcml0ZVF1b3RlZFN0cmluZyhidWYsIGVudC0+Y29udGVudCk7CgkgICAgZWxzZQoJCXhtbEJ1ZmZlcldyaXRlUXVvdGVkU3RyaW5nKGJ1ZiwgZW50LT5vcmlnKTsKCSAgICB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiPlxuIik7CgkgICAgYnJlYWs7CgljYXNlIFhNTF9FWFRFUk5BTF9QQVJBTUVURVJfRU5USVRZOgoJICAgIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICI8IUVOVElUWSAlICIpOwoJICAgIHhtbEJ1ZmZlcldyaXRlQ0hBUihidWYsIGVudC0+bmFtZSk7CgkgICAgaWYgKGVudC0+RXh0ZXJuYWxJRCAhPSBOVUxMKSB7CgkJIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICIgUFVCTElDICIpOwoJCSB4bWxCdWZmZXJXcml0ZVF1b3RlZFN0cmluZyhidWYsIGVudC0+RXh0ZXJuYWxJRCk7CgkJIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICIgIik7CgkJIHhtbEJ1ZmZlcldyaXRlUXVvdGVkU3RyaW5nKGJ1ZiwgZW50LT5TeXN0ZW1JRCk7CgkgICAgfSBlbHNlIHsKCQkgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIiBTWVNURU0gIik7CgkJIHhtbEJ1ZmZlcldyaXRlUXVvdGVkU3RyaW5nKGJ1ZiwgZW50LT5TeXN0ZW1JRCk7CgkgICAgfQoJICAgIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICI+XG4iKTsKCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCgkJInhtbER1bXBFbnRpdGllc0RlY2w6IGludGVybmFsOiB1bmtub3duIHR5cGUgJWRcbiIsCgkJICAgIGVudC0+ZXR5cGUpOwogICAgfQp9CgovKioKICogeG1sRHVtcEVudGl0aWVzVGFibGU6CiAqIEBidWY6ICBBbiBYTUwgYnVmZmVyLgogKiBAdGFibGU6ICBBbiBlbnRpdHkgdGFibGUKICoKICogVGhpcyB3aWxsIGR1bXAgdGhlIGNvbnRlbnQgb2YgdGhlIGVudGl0eSB0YWJsZSBhcyBhbiBYTUwgRFREIGRlZmluaXRpb24KICovCnZvaWQKeG1sRHVtcEVudGl0aWVzVGFibGUoeG1sQnVmZmVyUHRyIGJ1ZiwgeG1sRW50aXRpZXNUYWJsZVB0ciB0YWJsZSkgewogICAgeG1sSGFzaFNjYW4odGFibGUsICh4bWxIYXNoU2Nhbm5lcil4bWxEdW1wRW50aXR5RGVjbCwgYnVmKTsKfQojZW5kaWYgLyogTElCWE1MX09VVFBVVF9FTkFCTEVEICovCg==